summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
Diffstat (limited to 'sal')
-rw-r--r--sal/cpprt/makefile.mk71
-rw-r--r--sal/cpprt/operators_new_delete.cxx251
-rw-r--r--sal/cppunittester/cppunittester.cxx67
-rw-r--r--sal/cppunittester/makefile.mk52
-rw-r--r--sal/inc/internal/once.h79
-rw-r--r--sal/inc/makefile.mk47
-rw-r--r--sal/inc/osl/conditn.h92
-rw-r--r--sal/inc/osl/conditn.hxx128
-rw-r--r--sal/inc/osl/diagnose.h152
-rw-r--r--sal/inc/osl/diagnose.hxx205
-rw-r--r--sal/inc/osl/doublecheckedlocking.h81
-rw-r--r--sal/inc/osl/endian.h235
-rw-r--r--sal/inc/osl/file.h1593
-rw-r--r--sal/inc/osl/file.hxx1953
-rw-r--r--sal/inc/osl/getglobalmutex.hxx50
-rw-r--r--sal/inc/osl/interlck.h57
-rw-r--r--sal/inc/osl/module.h211
-rw-r--r--sal/inc/osl/module.hxx158
-rw-r--r--sal/inc/osl/mutex.h77
-rw-r--r--sal/inc/osl/mutex.hxx253
-rw-r--r--sal/inc/osl/nlsupport.h60
-rw-r--r--sal/inc/osl/pipe.h102
-rw-r--r--sal/inc/osl/pipe.hxx212
-rw-r--r--sal/inc/osl/pipe_decl.hxx235
-rw-r--r--sal/inc/osl/process.h443
-rw-r--r--sal/inc/osl/profile.h140
-rw-r--r--sal/inc/osl/profile.hxx204
-rw-r--r--sal/inc/osl/security.h158
-rw-r--r--sal/inc/osl/security.hxx110
-rw-r--r--sal/inc/osl/security_decl.hxx117
-rw-r--r--sal/inc/osl/semaphor.h95
-rw-r--r--sal/inc/osl/semaphor.hxx126
-rw-r--r--sal/inc/osl/signal.h114
-rw-r--r--sal/inc/osl/socket.h891
-rw-r--r--sal/inc/osl/socket.hxx565
-rw-r--r--sal/inc/osl/socket_decl.hxx722
-rw-r--r--sal/inc/osl/thread.h191
-rw-r--r--sal/inc/osl/thread.hxx233
-rw-r--r--sal/inc/osl/time.h160
-rw-r--r--sal/inc/osl/util.h53
-rw-r--r--sal/inc/pch/precompiled_sal.cxx29
-rw-r--r--sal/inc/pch/precompiled_sal.hxx32
-rw-r--r--sal/inc/rtl/alloc.h266
-rw-r--r--sal/inc/rtl/allocator.hxx192
-rw-r--r--sal/inc/rtl/bootstrap.h233
-rw-r--r--sal/inc/rtl/bootstrap.hxx234
-rw-r--r--sal/inc/rtl/byteseq.h322
-rw-r--r--sal/inc/rtl/byteseq.hxx143
-rw-r--r--sal/inc/rtl/cipher.h319
-rw-r--r--sal/inc/rtl/crc.h66
-rw-r--r--sal/inc/rtl/digest.h639
-rw-r--r--sal/inc/rtl/instance.hxx472
-rw-r--r--sal/inc/rtl/locale.h140
-rw-r--r--sal/inc/rtl/locale.hxx266
-rw-r--r--sal/inc/rtl/logfile.h134
-rw-r--r--sal/inc/rtl/logfile.hxx205
-rw-r--r--sal/inc/rtl/malformeduriexception.hxx74
-rw-r--r--sal/inc/rtl/math.h478
-rw-r--r--sal/inc/rtl/math.hxx432
-rw-r--r--sal/inc/rtl/memory.h51
-rw-r--r--sal/inc/rtl/process.h82
-rw-r--r--sal/inc/rtl/random.h114
-rw-r--r--sal/inc/rtl/ref.hxx242
-rw-r--r--sal/inc/rtl/strbuf.h119
-rw-r--r--sal/inc/rtl/strbuf.hxx665
-rw-r--r--sal/inc/rtl/string.h1193
-rw-r--r--sal/inc/rtl/string.hxx941
-rw-r--r--sal/inc/rtl/tencinfo.h276
-rw-r--r--sal/inc/rtl/textcvt.h180
-rw-r--r--sal/inc/rtl/textenc.h279
-rw-r--r--sal/inc/rtl/tres.h106
-rw-r--r--sal/inc/rtl/tres.hxx112
-rw-r--r--sal/inc/rtl/unload.h315
-rw-r--r--sal/inc/rtl/uri.h354
-rw-r--r--sal/inc/rtl/uri.hxx154
-rw-r--r--sal/inc/rtl/ustrbuf.h165
-rw-r--r--sal/inc/rtl/ustrbuf.hxx774
-rw-r--r--sal/inc/rtl/ustring.h1660
-rw-r--r--sal/inc/rtl/ustring.hxx1540
-rw-r--r--sal/inc/rtl/uuid.h209
-rw-r--r--sal/inc/sal/alloca.h66
-rw-r--r--sal/inc/sal/config.h152
-rw-r--r--sal/inc/sal/macros.h51
-rw-r--r--sal/inc/sal/main.h152
-rw-r--r--sal/inc/sal/mathconf.h147
-rw-r--r--sal/inc/sal/types.h435
-rw-r--r--sal/inc/systools/win32/AutoSystoolInit.hxx62
-rw-r--r--sal/inc/systools/win32/StrConvert.h132
-rw-r--r--sal/inc/systools/win32/SyncObjects.hxx110
-rw-r--r--sal/inc/systools/win32/advapi9x.h209
-rw-r--r--sal/inc/systools/win32/comdlg9x.h80
-rw-r--r--sal/inc/systools/win32/comptr.hxx233
-rw-r--r--sal/inc/systools/win32/comtools.hxx194
-rw-r--r--sal/inc/systools/win32/kernel9x.h383
-rw-r--r--sal/inc/systools/win32/mpr9x.h72
-rw-r--r--sal/inc/systools/win32/shell9x.h101
-rw-r--r--sal/inc/systools/win32/snprintf.h80
-rw-r--r--sal/inc/systools/win32/user9x.h192
-rw-r--r--sal/inc/systools/win32/uwinapi.h121
-rw-r--r--sal/osl/all/debugbase.cxx161
-rw-r--r--sal/osl/all/filepath.c123
-rw-r--r--sal/osl/all/loadmodulerelative.cxx71
-rw-r--r--sal/osl/all/makefile.mk76
-rwxr-xr-xsal/osl/all/utility.cxx103
-rw-r--r--sal/osl/os2/conditn.c124
-rw-r--r--sal/osl/os2/debug.c2152
-rw-r--r--sal/osl/os2/diagnose.c178
-rw-r--r--sal/osl/os2/dllentry.c75
-rw-r--r--sal/osl/os2/except.c1059
-rw-r--r--sal/osl/os2/file.cxx3129
-rw-r--r--sal/osl/os2/file_error_transl.cxx252
-rw-r--r--sal/osl/os2/file_error_transl.h70
-rw-r--r--sal/osl/os2/file_path_helper.cxx377
-rw-r--r--sal/osl/os2/file_path_helper.h292
-rw-r--r--sal/osl/os2/file_path_helper.hxx296
-rw-r--r--sal/osl/os2/file_url.cxx1626
-rw-r--r--sal/osl/os2/file_url.h183
-rw-r--r--sal/osl/os2/helpers/debug.h1779
-rw-r--r--sal/osl/os2/helpers/dosh.h49
-rw-r--r--sal/osl/os2/helpers/except.h255
-rw-r--r--sal/osl/os2/helpers/setup.h147
-rw-r--r--sal/osl/os2/interlck.c51
-rw-r--r--sal/osl/os2/libutil.c52
-rw-r--r--sal/osl/os2/makefile.mk118
-rw-r--r--sal/osl/os2/module.c281
-rw-r--r--sal/osl/os2/mutex.c167
-rw-r--r--sal/osl/os2/nlsupport.c445
-rw-r--r--sal/osl/os2/path_helper.cxx116
-rw-r--r--sal/osl/os2/path_helper.h70
-rw-r--r--sal/osl/os2/path_helper.hxx73
-rw-r--r--sal/osl/os2/pipe.cxx555
-rw-r--r--sal/osl/os2/pipeimpl.cxx755
-rw-r--r--sal/osl/os2/pipeimpl.h82
-rw-r--r--sal/osl/os2/process.c1013
-rw-r--r--sal/osl/os2/process_impl.cxx463
-rw-r--r--sal/osl/os2/procimpl.h52
-rw-r--r--sal/osl/os2/profile.c2295
-rw-r--r--sal/osl/os2/salinit.cxx120
-rw-r--r--sal/osl/os2/secimpl.h50
-rw-r--r--sal/osl/os2/security.c317
-rw-r--r--sal/osl/os2/semaphor.c190
-rw-r--r--sal/osl/os2/signal.c249
-rw-r--r--sal/osl/os2/socket.c3097
-rw-r--r--sal/osl/os2/sockimpl.h80
-rw-r--r--sal/osl/os2/system.h513
-rw-r--r--sal/osl/os2/tempfile.c359
-rw-r--r--sal/osl/os2/thread.c772
-rw-r--r--sal/osl/os2/time.c269
-rw-r--r--sal/osl/os2/util.c37
-rw-r--r--sal/osl/os2/uunxapi.cxx86
-rw-r--r--sal/osl/os2/uunxapi.h86
-rw-r--r--sal/osl/os2/uunxapi.hxx106
-rw-r--r--sal/osl/unx/asm/interlck_sparc.s267
-rw-r--r--sal/osl/unx/asm/interlck_x86.s92
-rwxr-xr-xsal/osl/unx/backtrace.c359
-rwxr-xr-xsal/osl/unx/backtrace.h99
-rw-r--r--sal/osl/unx/conditn.c350
-rw-r--r--sal/osl/unx/diagnose.c332
-rw-r--r--sal/osl/unx/file.cxx1397
-rw-r--r--sal/osl/unx/file_error_transl.cxx255
-rw-r--r--sal/osl/unx/file_error_transl.h70
-rw-r--r--sal/osl/unx/file_impl.hxx54
-rw-r--r--sal/osl/unx/file_misc.cxx1066
-rw-r--r--sal/osl/unx/file_path_helper.cxx350
-rw-r--r--sal/osl/unx/file_path_helper.h247
-rw-r--r--sal/osl/unx/file_path_helper.hxx247
-rw-r--r--sal/osl/unx/file_stat.cxx492
-rw-r--r--sal/osl/unx/file_url.cxx962
-rw-r--r--sal/osl/unx/file_url.h69
-rw-r--r--sal/osl/unx/file_volume.cxx1155
-rw-r--r--sal/osl/unx/interlck.c170
-rw-r--r--sal/osl/unx/makefile.mk189
-rw-r--r--sal/osl/unx/module.c242
-rw-r--r--sal/osl/unx/mutex.c221
-rw-r--r--sal/osl/unx/nlsupport.c949
-rw-r--r--sal/osl/unx/osxlocale.cxx129
-rw-r--r--sal/osl/unx/pipe.c592
-rw-r--r--sal/osl/unx/process.c1536
-rw-r--r--sal/osl/unx/process_impl.cxx517
-rw-r--r--sal/osl/unx/procimpl.h50
-rw-r--r--sal/osl/unx/profile.c2221
-rw-r--r--sal/osl/unx/salinit.cxx43
-rw-r--r--sal/osl/unx/secimpl.h47
-rw-r--r--sal/osl/unx/security.c862
-rw-r--r--sal/osl/unx/semaphor.c314
-rw-r--r--sal/osl/unx/signal.c1093
-rw-r--r--sal/osl/unx/socket.c3062
-rw-r--r--sal/osl/unx/sockimpl.h78
-rw-r--r--sal/osl/unx/system.c599
-rw-r--r--sal/osl/unx/system.h495
-rw-r--r--sal/osl/unx/tempfile.c370
-rw-r--r--sal/osl/unx/thread.c1035
-rw-r--r--sal/osl/unx/time.c269
-rw-r--r--sal/osl/unx/util.c350
-rw-r--r--sal/osl/unx/uunxapi.cxx130
-rw-r--r--sal/osl/unx/uunxapi.h86
-rw-r--r--sal/osl/unx/uunxapi.hxx98
-rw-r--r--sal/osl/w32/MAKEFILE.MK118
-rw-r--r--sal/osl/w32/conditn.c141
-rw-r--r--sal/osl/w32/diagnose.c188
-rw-r--r--sal/osl/w32/dllentry.c370
-rw-r--r--sal/osl/w32/file.cxx1194
-rw-r--r--sal/osl/w32/file_dirvol.cxx1867
-rw-r--r--sal/osl/w32/file_error.c151
-rw-r--r--sal/osl/w32/file_error.h51
-rw-r--r--sal/osl/w32/file_url.cxx1143
-rw-r--r--sal/osl/w32/file_url.h96
-rw-r--r--sal/osl/w32/interlck.c142
-rw-r--r--sal/osl/w32/libutil.c54
-rw-r--r--sal/osl/w32/module.cxx480
-rw-r--r--sal/osl/w32/mutex.c206
-rw-r--r--sal/osl/w32/nlsupport.c231
-rw-r--r--sal/osl/w32/path_helper.cxx118
-rw-r--r--sal/osl/w32/path_helper.h70
-rw-r--r--sal/osl/w32/path_helper.hxx118
-rw-r--r--sal/osl/w32/pipe.c636
-rw-r--r--sal/osl/w32/pipeimpl.cxx785
-rw-r--r--sal/osl/w32/pipeimpl.h88
-rw-r--r--sal/osl/w32/process.cxx639
-rw-r--r--sal/osl/w32/procimpl.cxx606
-rw-r--r--sal/osl/w32/procimpl.h47
-rw-r--r--sal/osl/w32/profile.cxx2707
-rw-r--r--sal/osl/w32/salinit.cxx102
-rw-r--r--sal/osl/w32/secimpl.h54
-rw-r--r--sal/osl/w32/security.c991
-rw-r--r--sal/osl/w32/semaphor.c111
-rw-r--r--sal/osl/w32/signal.cxx436
-rw-r--r--sal/osl/w32/socket.cxx2190
-rw-r--r--sal/osl/w32/sockimpl.h108
-rw-r--r--sal/osl/w32/system.h126
-rw-r--r--sal/osl/w32/tempfile.cxx274
-rw-r--r--sal/osl/w32/thread.c593
-rw-r--r--sal/osl/w32/time.c216
-rw-r--r--sal/osl/w32/util.c37
-rw-r--r--sal/prj/build.lst23
-rw-r--r--sal/prj/d.lst38
-rw-r--r--sal/qa/ByteSequence/ByteSequence.cxx194
-rw-r--r--sal/qa/ByteSequence/makefile.mk55
-rw-r--r--sal/qa/OStringBuffer/makefile.mk78
-rw-r--r--sal/qa/OStringBuffer/rtl_OStringBuffer.cxx18422
-rw-r--r--sal/qa/OStringBuffer/rtl_String_Const.h552
-rw-r--r--sal/qa/OStringBuffer/rtl_String_Utils.cxx615
-rw-r--r--sal/qa/OStringBuffer/rtl_String_Utils.hxx138
-rw-r--r--sal/qa/OStringBuffer/rtl_String_Utils_Const.h74
-rw-r--r--sal/qa/buildall.pl507
-rwxr-xr-xsal/qa/export.map34
-rwxr-xr-xsal/qa/helper/gcov/build_coverage23
-rw-r--r--sal/qa/helper/gcov/deprecated.txt213
-rwxr-xr-xsal/qa/helper/gcov/gcov_all15
-rwxr-xr-xsal/qa/helper/gcov/gcov_filter.pl427
-rw-r--r--sal/qa/helper/gcov/gcov_result.pl232
-rw-r--r--sal/qa/helper/gcov/gcov_resultcompare.pl151
-rw-r--r--sal/qa/helper/gcov/gcov_resultinterpreter.pl172
-rwxr-xr-xsal/qa/helper/gcov/gcov_run.sh64
-rw-r--r--sal/qa/helper/gcov/readme.txt13
-rwxr-xr-xsal/qa/helper/gcov/statistics20
-rw-r--r--sal/qa/inc/stringhelper.hxx16
-rw-r--r--sal/qa/inc/valueequal.hxx133
-rw-r--r--sal/qa/libs2test.txt86
-rw-r--r--sal/qa/makefile.mk62
-rw-r--r--sal/qa/osl/condition/makefile.mk60
-rw-r--r--sal/qa/osl/condition/osl_Condition.cxx384
-rw-r--r--sal/qa/osl/condition/osl_Condition_Const.h72
-rw-r--r--sal/qa/osl/file/makefile.mk85
-rw-r--r--sal/qa/osl/file/osl_File.cxx6856
-rw-r--r--sal/qa/osl/file/osl_File_Const.h242
-rw-r--r--sal/qa/osl/file/osl_old_test_file.cxx273
-rwxr-xr-xsal/qa/osl/file/test_cpy_wrt_file.cxx111
-rw-r--r--sal/qa/osl/module/export_dll.map34
-rw-r--r--sal/qa/osl/module/makefile.mk79
-rw-r--r--sal/qa/osl/module/osl_Module.cxx522
-rw-r--r--sal/qa/osl/module/osl_Module_Const.h66
-rw-r--r--sal/qa/osl/module/osl_Module_DLL.cxx43
-rwxr-xr-xsal/qa/osl/mutex/makefile.mk73
-rwxr-xr-xsal/qa/osl/mutex/osl_Mutex.cxx949
-rwxr-xr-xsal/qa/osl/mutex/osl_Mutex_Const.h56
-rw-r--r--sal/qa/osl/pipe/makefile.mk70
-rw-r--r--sal/qa/osl/pipe/osl_Pipe.cxx1060
-rwxr-xr-xsal/qa/osl/process/batch.bat2
-rw-r--r--sal/qa/osl/process/export.exp1
-rw-r--r--sal/qa/osl/process/makefile.mk108
-rw-r--r--sal/qa/osl/process/osl_Thread.cxx2344
-rw-r--r--sal/qa/osl/process/osl_Thread.xsce1
-rw-r--r--sal/qa/osl/process/osl_process.cxx684
-rw-r--r--sal/qa/osl/process/osl_process_child.cxx131
-rw-r--r--sal/qa/osl/profile/makefile.mk72
-rw-r--r--sal/qa/osl/profile/osl_old_testprofile.cxx99
-rwxr-xr-xsal/qa/osl/security/makefile.mk64
-rwxr-xr-xsal/qa/osl/security/osl_Security.cxx678
-rwxr-xr-xsal/qa/osl/security/osl_Security_Const.h80
-rwxr-xr-xsal/qa/osl/socket/export.exp1
-rwxr-xr-xsal/qa/osl/socket/makefile.mk223
-rw-r--r--sal/qa/osl/socket/osl_AcceptorSocket.cxx302
-rw-r--r--sal/qa/osl/socket/osl_ConnectorSocket.cxx264
-rw-r--r--sal/qa/osl/socket/osl_ConnectorSocket.xsce1
-rw-r--r--sal/qa/osl/socket/osl_DatagramSocket.cxx316
-rwxr-xr-xsal/qa/osl/socket/osl_Socket.cxx3723
-rw-r--r--sal/qa/osl/socket/osl_Socket.xsce5
-rw-r--r--sal/qa/osl/socket/osl_Socket2.cxx1468
-rw-r--r--sal/qa/osl/socket/osl_Socket2.xsce2
-rw-r--r--sal/qa/osl/socket/osl_SocketAddr.cxx895
-rw-r--r--sal/qa/osl/socket/osl_SocketAddr.xsce0
-rw-r--r--sal/qa/osl/socket/osl_SocketOld.xsce14
-rwxr-xr-xsal/qa/osl/socket/osl_Socket_Const.h196
-rw-r--r--sal/qa/osl/socket/osl_Socket_Const_orig.h200
-rw-r--r--sal/qa/osl/socket/osl_Socket_tests.cxx88
-rw-r--r--sal/qa/osl/socket/osl_Socket_tests.xsce1
-rw-r--r--sal/qa/osl/socket/osl_StreamSocket.cxx1506
-rw-r--r--sal/qa/osl/socket/osl_StreamSocket.xsce4
-rw-r--r--sal/qa/osl/socket/sockethelper.cxx401
-rw-r--r--sal/qa/osl/socket/sockethelper.hxx165
-rw-r--r--sal/qa/osl/thread/makefile.mk52
-rw-r--r--sal/qa/osl/thread/test_thread.cxx89
-rw-r--r--sal/qa/osl/thread/version.map34
-rwxr-xr-xsal/qa/rtl/alloc/jobfile.txt8
-rwxr-xr-xsal/qa/rtl/alloc/makefile.mk68
-rwxr-xr-xsal/qa/rtl/alloc/rtl_alloc.cxx179
-rw-r--r--sal/qa/rtl/bootstrap/bootstrap_process.cxx118
-rw-r--r--sal/qa/rtl/bootstrap/makefile.mk90
-rw-r--r--sal/qa/rtl/bootstrap/rtl_Bootstrap.cxx1040
-rw-r--r--sal/qa/rtl/bootstrap/rtl_Bootstrap.xsce7
-rw-r--r--sal/qa/rtl/cipher/makefile.mk70
-rw-r--r--sal/qa/rtl/cipher/rtl_cipher.cxx717
-rwxr-xr-xsal/qa/rtl/crc32/jobfile.txt5
-rwxr-xr-xsal/qa/rtl/crc32/makefile.mk68
-rwxr-xr-xsal/qa/rtl/crc32/rtl_crc32.cxx181
-rw-r--r--sal/qa/rtl/digest/makefile.mk64
-rw-r--r--sal/qa/rtl/digest/rtl_digest.cxx1451
-rw-r--r--sal/qa/rtl/doublelock/makefile.mk70
-rw-r--r--sal/qa/rtl/doublelock/rtl_doublelocking.cxx260
-rw-r--r--sal/qa/rtl/locale/makefile.mk69
-rw-r--r--sal/qa/rtl/locale/rtl_locale.cxx343
-rw-r--r--sal/qa/rtl/logfile/makefile.mk63
-rw-r--r--sal/qa/rtl/logfile/rtl_logfile.cxx260
-rw-r--r--sal/qa/rtl/math/makefile.mk55
-rw-r--r--sal/qa/rtl/math/test-rtl-math.cxx76
-rw-r--r--sal/qa/rtl/ostring/joblist.txt10
-rw-r--r--sal/qa/rtl/ostring/makefile.mk93
-rw-r--r--sal/qa/rtl/ostring/rtl_OString2.cxx568
-rw-r--r--sal/qa/rtl/ostring/rtl_str.cxx890
-rw-r--r--sal/qa/rtl/ostring/rtl_str.xsce26
-rw-r--r--sal/qa/rtl/ostring/rtl_string.cxx183
-rw-r--r--sal/qa/rtl/ostring/rtl_string.xsce1
-rw-r--r--sal/qa/rtl/oustring/joblist.txt10
-rw-r--r--sal/qa/rtl/oustring/makefile.mk82
-rw-r--r--sal/qa/rtl/oustring/rtl_OUString2.cxx1280
-rw-r--r--sal/qa/rtl/oustring/rtl_ustr.cxx1424
-rw-r--r--sal/qa/rtl/oustring/rtl_ustr.xsce33
-rw-r--r--sal/qa/rtl/oustringbuffer/makefile.mk70
-rw-r--r--sal/qa/rtl/oustringbuffer/rtl_OUStringBuffer2.cxx101
-rw-r--r--sal/qa/rtl/process/child_process.cxx71
-rw-r--r--sal/qa/rtl/process/child_process_id.cxx63
-rw-r--r--sal/qa/rtl/process/makefile.mk93
-rw-r--r--sal/qa/rtl/process/rtl_Process.cxx296
-rw-r--r--sal/qa/rtl/process/rtl_Process_Const.h26
-rw-r--r--sal/qa/rtl/random/makefile.add19
-rw-r--r--sal/qa/rtl/random/makefile.mk64
-rw-r--r--sal/qa/rtl/random/random.txt5
-rw-r--r--sal/qa/rtl/random/rtl_random.cxx412
-rw-r--r--sal/qa/rtl/strings/makefile.mk55
-rw-r--r--sal/qa/rtl/strings/test_oustring_compare.cxx67
-rw-r--r--sal/qa/rtl/strings/test_oustring_convert.cxx184
-rw-r--r--sal/qa/rtl/strings/test_oustring_endswith.cxx121
-rw-r--r--sal/qa/rtl/strings/test_oustring_noadditional.cxx33
-rw-r--r--sal/qa/rtl/strings/test_oustringbuffer_utf32.cxx130
-rw-r--r--sal/qa/rtl/textenc/makefile.mk75
-rw-r--r--sal/qa/rtl/textenc/rtl_tencinfo.cxx1901
-rw-r--r--sal/qa/rtl/textenc/rtl_textcvt.cxx2901
-rw-r--r--sal/qa/rtl/uri/makefile.mk75
-rw-r--r--sal/qa/rtl/uri/rtl_Uri.cxx297
-rw-r--r--sal/qa/rtl/uri/rtl_testuri.cxx545
-rw-r--r--sal/qa/rtl/uuid/makefile.mk68
-rw-r--r--sal/qa/rtl/uuid/rtl_Uuid.cxx228
-rw-r--r--sal/qa/rtl_strings/export.exp1
-rw-r--r--sal/qa/rtl_strings/makefile.mk152
-rw-r--r--sal/qa/rtl_strings/readme.txt20
-rw-r--r--sal/qa/rtl_strings/rtl_OString.cxx3605
-rw-r--r--sal/qa/rtl_strings/rtl_OUString.cxx3858
-rw-r--r--sal/qa/rtl_strings/rtl_OUStringBuffer.cxx1823
-rw-r--r--sal/qa/rtl_strings/rtl_String_Const.h885
-rw-r--r--sal/qa/rtl_strings/rtl_String_Utils.cxx593
-rw-r--r--sal/qa/rtl_strings/rtl_String_Utils.hxx137
-rw-r--r--sal/qa/rtl_strings/rtl_String_Utils_Const.h74
-rw-r--r--sal/qa/rtl_strings/rtl_old_testostring.cxx266
-rw-r--r--sal/qa/rtl_strings/rtl_old_testowstring.cxx421
-rw-r--r--sal/qa/rtl_strings/rtl_old_teststrbuf.cxx269
-rw-r--r--sal/qa/sal/makefile.mk50
-rw-r--r--sal/qa/sal/test_types.cxx81
-rw-r--r--sal/qa/sal/version.map34
-rw-r--r--sal/qa/systools/makefile.mk70
-rw-r--r--sal/qa/systools/test_comtools.cxx250
-rw-r--r--sal/qa/testHelperFunctions/makefile.mk63
-rw-r--r--sal/qa/testHelperFunctions/testHelperFunctions.cxx454
-rw-r--r--sal/qa/testHelperFunctions/testHelperFunctions2.cxx61
-rw-r--r--sal/rtl/source/alloc.c1541
-rw-r--r--sal/rtl/source/alloc_arena.c1396
-rw-r--r--sal/rtl/source/alloc_arena.h137
-rw-r--r--sal/rtl/source/alloc_cache.c1721
-rw-r--r--sal/rtl/source/alloc_cache.h182
-rw-r--r--sal/rtl/source/alloc_global.c357
-rw-r--r--sal/rtl/source/alloc_impl.h247
-rw-r--r--sal/rtl/source/bootstrap.cxx1059
-rw-r--r--sal/rtl/source/byteseq.c254
-rw-r--r--sal/rtl/source/cipher.c1363
-rw-r--r--sal/rtl/source/cmdargs.cxx109
-rw-r--r--sal/rtl/source/crc.c164
-rw-r--r--sal/rtl/source/debugprint.cxx58
-rw-r--r--sal/rtl/source/digest.c2118
-rw-r--r--sal/rtl/source/gen_makefile.cxx41
-rw-r--r--sal/rtl/source/hash.cxx113
-rw-r--r--sal/rtl/source/hash.h21
-rw-r--r--sal/rtl/source/locale.c362
-rw-r--r--sal/rtl/source/logfile.cxx254
-rw-r--r--sal/rtl/source/macro.hxx110
-rw-r--r--sal/rtl/source/makefile.mk198
-rw-r--r--sal/rtl/source/math.cxx1265
-rw-r--r--sal/rtl/source/memory.c62
-rwxr-xr-xsal/rtl/source/memory_fini.cxx54
-rw-r--r--sal/rtl/source/random.c338
-rw-r--r--sal/rtl/source/rtl_process.c49
-rw-r--r--sal/rtl/source/strbuf.c147
-rw-r--r--sal/rtl/source/strimp.c58
-rw-r--r--sal/rtl/source/strimp.h64
-rw-r--r--sal/rtl/source/string.c320
-rw-r--r--sal/rtl/source/strtmpl.c1567
-rw-r--r--sal/rtl/source/surrogates.h50
-rw-r--r--sal/rtl/source/tres.c686
-rw-r--r--sal/rtl/source/unload.cxx417
-rw-r--r--sal/rtl/source/uri.cxx799
-rw-r--r--sal/rtl/source/ustrbuf.c208
-rw-r--r--sal/rtl/source/ustring.c934
-rw-r--r--sal/rtl/source/uuid.cxx180
-rw-r--r--sal/systools/win32/kill/kill.cxx443
-rw-r--r--sal/systools/win32/kill/makefile.mk64
-rw-r--r--sal/systools/win32/onlineupdate/makefile.mk82
-rw-r--r--sal/systools/win32/onlineupdate/onlinecheck.cxx82
-rw-r--r--sal/systools/win32/onlineupdate/onlinecheck.dxp28
-rw-r--r--sal/systools/win32/uwinapi/CheckTokenMembership.cpp34
-rw-r--r--sal/systools/win32/uwinapi/CommandLineToArgvW.cpp172
-rw-r--r--sal/systools/win32/uwinapi/CopyFileExA.cpp167
-rw-r--r--sal/systools/win32/uwinapi/CopyFileExW.cpp40
-rw-r--r--sal/systools/win32/uwinapi/DeleteVolumeMountPointA.cpp33
-rw-r--r--sal/systools/win32/uwinapi/DeleteVolumeMountPointW.cpp33
-rw-r--r--sal/systools/win32/uwinapi/DllGetVersion.cpp73
-rw-r--r--sal/systools/win32/uwinapi/DllMain.cpp235
-rw-r--r--sal/systools/win32/uwinapi/DrawStateW.cpp74
-rw-r--r--sal/systools/win32/uwinapi/EnumProcesses.cpp41
-rw-r--r--sal/systools/win32/uwinapi/FindFirstVolumeA.cpp30
-rw-r--r--sal/systools/win32/uwinapi/FindFirstVolumeMountPointA.cpp51
-rw-r--r--sal/systools/win32/uwinapi/FindFirstVolumeMountPointW.cpp32
-rw-r--r--sal/systools/win32/uwinapi/FindFirstVolumeW.cpp30
-rw-r--r--sal/systools/win32/uwinapi/FindNextVolumeA.cpp30
-rw-r--r--sal/systools/win32/uwinapi/FindNextVolumeMountPointA.cpp30
-rw-r--r--sal/systools/win32/uwinapi/FindNextVolumeMountPointW.cpp30
-rw-r--r--sal/systools/win32/uwinapi/FindNextVolumeW.cpp30
-rw-r--r--sal/systools/win32/uwinapi/FindVolumeClose.cpp30
-rw-r--r--sal/systools/win32/uwinapi/FindVolumeMountPointClose.cpp30
-rw-r--r--sal/systools/win32/uwinapi/GetDiskFreeSpaceExA.cpp59
-rw-r--r--sal/systools/win32/uwinapi/GetDiskFreeSpaceExW.cpp41
-rw-r--r--sal/systools/win32/uwinapi/GetLogicalDriveStringsW.cpp41
-rw-r--r--sal/systools/win32/uwinapi/GetLongPathName.cpp113
-rw-r--r--sal/systools/win32/uwinapi/GetLongPathNameA.cpp31
-rw-r--r--sal/systools/win32/uwinapi/GetLongPathNameW.cpp63
-rw-r--r--sal/systools/win32/uwinapi/GetModuleFileNameExA.cpp53
-rw-r--r--sal/systools/win32/uwinapi/GetModuleFileNameExW.cpp18
-rw-r--r--sal/systools/win32/uwinapi/GetProcessId.cpp164
-rw-r--r--sal/systools/win32/uwinapi/GetUserDefaultUILanguage.cpp34
-rw-r--r--sal/systools/win32/uwinapi/GetUserDomainA.cpp46
-rw-r--r--sal/systools/win32/uwinapi/GetUserDomainW.cpp47
-rw-r--r--sal/systools/win32/uwinapi/GetUserDomain_NT.cpp30
-rw-r--r--sal/systools/win32/uwinapi/GetUserDomain_WINDOWS.cpp79
-rw-r--r--sal/systools/win32/uwinapi/GetVolumeNameForVolumeMountPointA.cpp30
-rw-r--r--sal/systools/win32/uwinapi/GetVolumeNameForVolumeMountPointW.cpp30
-rw-r--r--sal/systools/win32/uwinapi/GetVolumePathNameA.cpp30
-rw-r--r--sal/systools/win32/uwinapi/GetVolumePathNameW.cpp30
-rw-r--r--sal/systools/win32/uwinapi/MCIWndCreateW.cpp42
-rw-r--r--sal/systools/win32/uwinapi/MoveFileExA.cpp97
-rw-r--r--sal/systools/win32/uwinapi/MoveFileExW.cpp38
-rw-r--r--sal/systools/win32/uwinapi/PathAddBackslashW.cpp42
-rw-r--r--sal/systools/win32/uwinapi/PathCompactPathExW.cpp46
-rw-r--r--sal/systools/win32/uwinapi/PathFileExistsW.cpp40
-rw-r--r--sal/systools/win32/uwinapi/PathFindExtensionW.cpp52
-rw-r--r--sal/systools/win32/uwinapi/PathFindFileNameW.cpp51
-rw-r--r--sal/systools/win32/uwinapi/PathIsFileSpecW.cpp40
-rw-r--r--sal/systools/win32/uwinapi/PathIsUNCW.cpp40
-rw-r--r--sal/systools/win32/uwinapi/PathRemoveExtensionW.cpp41
-rw-r--r--sal/systools/win32/uwinapi/PathRemoveFileSpecW.cpp42
-rw-r--r--sal/systools/win32/uwinapi/PathSetDlgItemPathW.cpp42
-rw-r--r--sal/systools/win32/uwinapi/PathStripToRootW.cpp42
-rw-r--r--sal/systools/win32/uwinapi/ResolveThunk.cpp64
-rw-r--r--sal/systools/win32/uwinapi/ResolveUnicows.cpp510
-rw-r--r--sal/systools/win32/uwinapi/SHCreateItemFromParsingName.cpp33
-rw-r--r--sal/systools/win32/uwinapi/SHILCreateFromPathW.cpp32
-rw-r--r--sal/systools/win32/uwinapi/SetVolumeMountPointA.cpp30
-rw-r--r--sal/systools/win32/uwinapi/SetVolumeMountPointW.cpp30
-rw-r--r--sal/systools/win32/uwinapi/Uwinapi.def22
-rw-r--r--sal/systools/win32/uwinapi/Uwinapi.h137
-rw-r--r--sal/systools/win32/uwinapi/macros.h232
-rw-r--r--sal/systools/win32/uwinapi/makefile.mk167
-rw-r--r--sal/systools/win32/uwinapi/snprintf.c10
-rw-r--r--sal/systools/win32/uwinapi/sntprintf.c118
-rw-r--r--sal/systools/win32/uwinapi/snwprintf.c5
-rw-r--r--sal/systools/win32/uwinapi/toolhelp.cpp57
-rw-r--r--sal/systools/win32/uwinapi/unicows.dxp546
-rw-r--r--sal/systools/win32/uwinapi/unicows_mingw.dxp544
-rw-r--r--sal/systools/win32/uwinapi/uwinapi.dxp86
-rw-r--r--sal/systools/win32/uwinapi/uwinapi_mingw.dxp90
-rw-r--r--sal/systools/win32/uwinapi/win95sys.h348
-rw-r--r--sal/test/bootstrap65
-rwxr-xr-xsal/test/bootstrap.bat62
-rwxr-xr-xsal/test/bootstrap.pl260
-rw-r--r--sal/test/bootstraptest.ini11
-rw-r--r--sal/test/makefile.mk152
-rw-r--r--sal/test/test_salmain.cxx42
-rw-r--r--sal/test/test_salmainwithargs.cxx42
-rw-r--r--sal/test/testbootstrap.cxx134
-rw-r--r--sal/test/testbootstrap.ini4
-rw-r--r--sal/test/unloading/exports.dxp4
-rw-r--r--sal/test/unloading/makefile.mk126
-rw-r--r--sal/test/unloading/readme.txt14
-rw-r--r--sal/test/unloading/samplelib1.cxx269
-rw-r--r--sal/test/unloading/samplelib1.xml41
-rw-r--r--sal/test/unloading/samplelib2.cxx236
-rw-r--r--sal/test/unloading/unloadTest.cxx656
-rw-r--r--sal/textenc/context.c47
-rw-r--r--sal/textenc/context.h52
-rw-r--r--sal/textenc/convertadobe.tab328
-rw-r--r--sal/textenc/convertbig5hkscs.c493
-rw-r--r--sal/textenc/convertbig5hkscs.h81
-rw-r--r--sal/textenc/convertbig5hkscs.tab72
-rw-r--r--sal/textenc/converter.c164
-rw-r--r--sal/textenc/converter.h66
-rw-r--r--sal/textenc/converteuctw.c452
-rw-r--r--sal/textenc/converteuctw.h78
-rw-r--r--sal/textenc/converteuctw.tab69
-rw-r--r--sal/textenc/convertgb18030.c468
-rw-r--r--sal/textenc/convertgb18030.h92
-rw-r--r--sal/textenc/convertgb18030.tab69
-rw-r--r--sal/textenc/convertiscii.tab112
-rw-r--r--sal/textenc/convertiso2022cn.c862
-rw-r--r--sal/textenc/convertiso2022cn.h84
-rw-r--r--sal/textenc/convertiso2022cn.tab77
-rw-r--r--sal/textenc/convertiso2022jp.c569
-rw-r--r--sal/textenc/convertiso2022jp.h78
-rw-r--r--sal/textenc/convertiso2022jp.tab68
-rw-r--r--sal/textenc/convertiso2022kr.c527
-rw-r--r--sal/textenc/convertiso2022kr.h78
-rw-r--r--sal/textenc/convertiso2022kr.tab68
-rw-r--r--sal/textenc/convertsinglebytetobmpunicode.cxx211
-rw-r--r--sal/textenc/convertsinglebytetobmpunicode.hxx126
-rw-r--r--sal/textenc/generate/big5hkscs2001.pl806
-rw-r--r--sal/textenc/generate/big5hkscs2001.tab8824
-rw-r--r--sal/textenc/generate/cns116431992.pl856
-rw-r--r--sal/textenc/generate/cns116431992.tab22869
-rw-r--r--sal/textenc/generate/gb180302000.pl309
-rw-r--r--sal/textenc/generate/gb180302000.tab9038
-rw-r--r--sal/textenc/gettextencodingdata.h46
-rw-r--r--sal/textenc/makefile.mk87
-rw-r--r--sal/textenc/tcvtarb1.tab936
-rw-r--r--sal/textenc/tcvtbyte.c810
-rw-r--r--sal/textenc/tcvteas1.tab436
-rw-r--r--sal/textenc/tcvtest1.tab4584
-rw-r--r--sal/textenc/tcvtjp1.tab1556
-rw-r--r--sal/textenc/tcvtjp2.tab3964
-rw-r--r--sal/textenc/tcvtjp3.tab2914
-rw-r--r--sal/textenc/tcvtjp4.tab3585
-rw-r--r--sal/textenc/tcvtjp5.tab3350
-rw-r--r--sal/textenc/tcvtjp6.tab2660
-rw-r--r--sal/textenc/tcvtkr1.tab3323
-rw-r--r--sal/textenc/tcvtkr2.tab5415
-rw-r--r--sal/textenc/tcvtkr4.tab3503
-rw-r--r--sal/textenc/tcvtkr5.tab5415
-rw-r--r--sal/textenc/tcvtkr6.tab1238
-rw-r--r--sal/textenc/tcvtlat1.tab1775
-rw-r--r--sal/textenc/tcvtmb.c693
-rw-r--r--sal/textenc/tcvtscn1.tab3860
-rw-r--r--sal/textenc/tcvtscn2.tab4463
-rw-r--r--sal/textenc/tcvtscn3.tab1502
-rw-r--r--sal/textenc/tcvtscn4.tab3070
-rw-r--r--sal/textenc/tcvtscn5.tab3235
-rw-r--r--sal/textenc/tcvtscn6.tab2956
-rw-r--r--sal/textenc/tcvtsym1.tab47
-rw-r--r--sal/textenc/tcvttcn1.tab2894
-rw-r--r--sal/textenc/tcvttcn2.tab3715
-rw-r--r--sal/textenc/tcvttcn6.tab1733
-rw-r--r--sal/textenc/tcvtuni1.tab100
-rw-r--r--sal/textenc/tcvtutf7.c588
-rw-r--r--sal/textenc/tcvtutf8.c419
-rw-r--r--sal/textenc/tenchelp.c213
-rw-r--r--sal/textenc/tenchelp.h297
-rw-r--r--sal/textenc/tencinfo.c1159
-rw-r--r--sal/textenc/textcvt.c264
-rw-r--r--sal/textenc/textenc.cxx226
-rw-r--r--sal/textenc/unichars.c136
-rw-r--r--sal/textenc/unichars.h62
-rw-r--r--sal/typesconfig/makefile.mk61
-rw-r--r--sal/typesconfig/typesconfig.c490
-rw-r--r--sal/unosdk.mk47
-rw-r--r--sal/util/makefile.mk241
-rwxr-xr-xsal/util/sal.map620
-rw-r--r--sal/util/salalloc.list7
-rw-r--r--sal/util/salalloc.map10
-rw-r--r--sal/version.mk40
-rw-r--r--sal/workben/clipboardwben/testcopy/StdAfx.cpp8
-rw-r--r--sal/workben/clipboardwben/testcopy/StdAfx.h32
-rw-r--r--sal/workben/clipboardwben/testcopy/TestWin32.icobin0 -> 1590 bytes
-rw-r--r--sal/workben/clipboardwben/testcopy/XTDataObject.cxx470
-rw-r--r--sal/workben/clipboardwben/testcopy/XTDataObject.hxx132
-rw-r--r--sal/workben/clipboardwben/testcopy/cbcpytest.cxx402
-rw-r--r--sal/workben/clipboardwben/testcopy/cbcpytest.rc122
-rw-r--r--sal/workben/clipboardwben/testcopy/makefile.mk67
-rw-r--r--sal/workben/clipboardwben/testcopy/resource.h31
-rw-r--r--sal/workben/clipboardwben/testcopy/small.icobin0 -> 318 bytes
-rw-r--r--sal/workben/clipboardwben/testpaste/StdAfx.cpp8
-rw-r--r--sal/workben/clipboardwben/testpaste/StdAfx.h32
-rw-r--r--sal/workben/clipboardwben/testpaste/TestWin32.icobin0 -> 1590 bytes
-rw-r--r--sal/workben/clipboardwben/testpaste/cbptest.cxx428
-rw-r--r--sal/workben/clipboardwben/testpaste/cbptest.rc120
-rw-r--r--sal/workben/clipboardwben/testpaste/makefile.mk67
-rw-r--r--sal/workben/clipboardwben/testpaste/resource.h28
-rw-r--r--sal/workben/clipboardwben/testpaste/small.icobin0 -> 318 bytes
-rw-r--r--sal/workben/clipboardwben/testviewer/StdAfx.cpp8
-rw-r--r--sal/workben/clipboardwben/testviewer/StdAfx.h32
-rw-r--r--sal/workben/clipboardwben/testviewer/TestWin32.icobin0 -> 1590 bytes
-rw-r--r--sal/workben/clipboardwben/testviewer/cbvtest.cxx351
-rw-r--r--sal/workben/clipboardwben/testviewer/cbvtest.rc127
-rw-r--r--sal/workben/clipboardwben/testviewer/makefile.mk67
-rw-r--r--sal/workben/clipboardwben/testviewer/resource.h32
-rw-r--r--sal/workben/clipboardwben/testviewer/small.icobin0 -> 318 bytes
-rw-r--r--sal/workben/export.exp1
-rw-r--r--sal/workben/getlocaleinfotest.cxx50
-rw-r--r--sal/workben/makefile.mk386
-rw-r--r--sal/workben/saldyntest.c52
-rw-r--r--sal/workben/salstattest.c56
-rw-r--r--sal/workben/t_cipher.c396
-rw-r--r--sal/workben/t_digest.c378
-rw-r--r--sal/workben/t_ojp_exe.cxx55
-rw-r--r--sal/workben/t_osl_getVolInfo.cxx132
-rw-r--r--sal/workben/t_osl_joinProcess.cxx228
-rw-r--r--sal/workben/t_random.c65
-rw-r--r--sal/workben/t_readline.c58
-rw-r--r--sal/workben/test.cxx66
-rw-r--r--sal/workben/testfile.cxx2786
-rw-r--r--sal/workben/testpip2.cxx97
-rw-r--r--sal/workben/testpipe.cxx168
-rw-r--r--sal/workben/testproc.cxx77
-rw-r--r--sal/workben/tgetpwnam.cxx248
647 files changed, 335448 insertions, 0 deletions
diff --git a/sal/cpprt/makefile.mk b/sal/cpprt/makefile.mk
new file mode 100644
index 000000000000..1cba8ee7634b
--- /dev/null
+++ b/sal/cpprt/makefile.mk
@@ -0,0 +1,71 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..
+
+PRJNAME=SAL
+TARGET=salcpprt
+
+ENABLE_EXCEPTIONS=TRUE
+LIBTARGET=NO
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+SLOFILES = \
+ $(SLO)$/operators_new_delete.obj
+
+
+.IF "$(OS)" != "SOLARIS"
+
+# build as archive
+LIB1TARGET=$(LB)$/$(TARGET).lib
+LIB1ARCHIV=$(LB)$/lib$(TARGET).a
+LIB1OBJFILES=$(SLOFILES)
+
+.ELSE # SOLARIS
+
+# build as shared library (interposer needed for -Bdirect)
+LINKFLAGS+= -z interpose
+
+SHL1TARGET= $(TARGET)
+SHL1IMPLIB= i$(TARGET)
+
+SHL1STDLIBS=$(SALLIB)
+SHL1OBJS= $(SLOFILES)
+
+.ENDIF # SOLARIS
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
diff --git a/sal/cpprt/operators_new_delete.cxx b/sal/cpprt/operators_new_delete.cxx
new file mode 100644
index 000000000000..dfbf04d336cb
--- /dev/null
+++ b/sal/cpprt/operators_new_delete.cxx
@@ -0,0 +1,251 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#ifdef WNT /* avoid 'std::bad_alloc' unresolved externals */
+#define _CRTIMP
+#define _NTSDK
+#endif /* WNT */
+
+#ifndef INCLUDED_ALGORITHM
+#include <algorithm>
+#define INCLUDED_ALGORITHM
+#endif
+
+#ifndef INCLUDED_NEW
+#include <new>
+#define INCLUDED_NEW
+#endif
+
+#ifndef INCLUDED_STRING_H
+#include <string.h>
+#define INCLUDED_STRING_H
+#endif
+#include <osl/diagnose.h>
+#include <rtl/alloc.h>
+
+using std::nothrow_t;
+
+// =======================================================================
+// AllocatorTraits
+// =======================================================================
+
+namespace
+{
+
+struct AllocatorTraits
+{
+ typedef char const signature_type[8];
+ const signature_type & m_signature;
+
+ explicit AllocatorTraits (signature_type const & s) SAL_THROW(())
+ : m_signature (s)
+ {}
+
+ std::size_t size (std::size_t n) const SAL_THROW(())
+ {
+ n = std::max(n, std::size_t(1));
+#if OSL_DEBUG_LEVEL > 0
+ n += sizeof(signature_type);
+#endif /* OSL_DEBUG_LEVEL */
+ return n;
+ }
+
+ void* init (void * p) const SAL_THROW(())
+ {
+#if OSL_DEBUG_LEVEL > 0
+ memcpy (p, m_signature, sizeof(signature_type));
+ p = static_cast<char*>(p) + sizeof(signature_type);
+#endif /* OSL_DEBUG_LEVEL */
+ return p;
+ }
+
+ void* fini (void * p) const SAL_THROW(())
+ {
+#if OSL_DEBUG_LEVEL > 0
+ p = static_cast<char*>(p) - sizeof(signature_type);
+ if (memcmp (p, m_signature, sizeof(signature_type)) != 0)
+ {
+ OSL_ENSURE(0, "operator delete mismatch");
+ }
+#endif /* OSL_DEBUG_LEVEL */
+ return p;
+ }
+};
+
+// =======================================================================
+
+struct VectorTraits : public AllocatorTraits
+{
+ static const signature_type g_signature;
+
+ VectorTraits() SAL_THROW(())
+ : AllocatorTraits (g_signature)
+ {}
+};
+
+struct ScalarTraits : public AllocatorTraits
+{
+ static const signature_type g_signature;
+
+ ScalarTraits() SAL_THROW(())
+ : AllocatorTraits (g_signature)
+ {}
+};
+
+const AllocatorTraits::signature_type VectorTraits::g_signature = "new[]()";
+const AllocatorTraits::signature_type ScalarTraits::g_signature = "new() ";
+
+} // anonymous namespace
+
+// =======================================================================
+// Allocator
+// =======================================================================
+
+static void default_handler (void)
+{
+ // Multithreading race in 'std::set_new_handler()' call sequence below.
+ throw std::bad_alloc();
+}
+
+// =======================================================================
+
+static void* allocate (
+ std::size_t n, AllocatorTraits const & rTraits)
+ SAL_THROW((std::bad_alloc))
+{
+ n = rTraits.size (n);
+ for (;;)
+ {
+ void * p = rtl_allocateMemory (sal_Size(n));
+ if (p != 0)
+ return rTraits.init (p);
+
+ std::new_handler d = default_handler, f = std::set_new_handler (d);
+ if (f != d)
+ std::set_new_handler (f);
+
+ if (f == 0)
+ throw std::bad_alloc();
+ (*f)();
+ }
+}
+
+// =======================================================================
+
+static void* allocate (
+ std::size_t n, AllocatorTraits const & rTraits, std::nothrow_t const &)
+ SAL_THROW(())
+{
+ try
+ {
+ return allocate (n, rTraits);
+ }
+ catch (std::bad_alloc const &)
+ {
+ return (0);
+ }
+}
+
+// =======================================================================
+
+static void deallocate (void * p, AllocatorTraits const & rTraits)
+ SAL_THROW(())
+{
+ if (p)
+ {
+ rtl_freeMemory (rTraits.fini(p));
+ }
+}
+
+// =======================================================================
+// T * p = new T; delete p;
+// =======================================================================
+
+void* SAL_CALL operator new (std::size_t n) throw (std::bad_alloc)
+{
+ return allocate (n, ScalarTraits());
+}
+
+// =======================================================================
+
+void SAL_CALL operator delete (void * p) throw ()
+{
+ deallocate (p, ScalarTraits());
+}
+
+// =======================================================================
+// T * p = new(nothrow) T; delete(nothrow) p;
+// =======================================================================
+
+void* SAL_CALL operator new (std::size_t n, std::nothrow_t const &) throw ()
+{
+ return allocate (n, ScalarTraits(), nothrow_t());
+}
+
+// =======================================================================
+
+void SAL_CALL operator delete (void * p, std::nothrow_t const &) throw ()
+{
+ deallocate (p, ScalarTraits());
+}
+
+// =======================================================================
+// T * p = new T[n]; delete[] p;
+// =======================================================================
+
+void* SAL_CALL operator new[] (std::size_t n) throw (std::bad_alloc)
+{
+ return allocate (n, VectorTraits());
+}
+
+// =======================================================================
+
+void SAL_CALL operator delete[] (void * p) throw ()
+{
+ deallocate (p, VectorTraits());
+}
+
+// =======================================================================
+// T * p = new(nothrow) T[n]; delete(nothrow)[] p;
+// =======================================================================
+
+void* SAL_CALL operator new[] (std::size_t n, std::nothrow_t const &) throw ()
+{
+ return allocate (n, VectorTraits(), nothrow_t());
+}
+
+// =======================================================================
+
+void SAL_CALL operator delete[] (void * p, std::nothrow_t const &) throw ()
+{
+ deallocate (p, VectorTraits());
+}
+
+// =======================================================================
diff --git a/sal/cppunittester/cppunittester.cxx b/sal/cppunittester/cppunittester.cxx
new file mode 100644
index 000000000000..ac99601f5ce5
--- /dev/null
+++ b/sal/cppunittester/cppunittester.cxx
@@ -0,0 +1,67 @@
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#include "precompiled_sal.hxx"
+#include "sal/config.h"
+
+#include <cstdlib>
+#include <iostream>
+
+#include "preextstl.h"
+#include "cppunit/CompilerOutputter.h"
+#include "cppunit/TestResult.h"
+#include "cppunit/TestResultCollector.h"
+#include "cppunit/TestRunner.h"
+#include "cppunit/extensions/TestFactoryRegistry.h"
+#include "cppunit/plugin/PlugInManager.h"
+#include "cppunit/portability/Stream.h"
+#include "postextstl.h"
+#include "osl/thread.h"
+#include "rtl/process.h"
+#include "rtl/string.hxx"
+#include "rtl/ustring.hxx"
+#include "sal/main.h"
+
+SAL_IMPLEMENT_MAIN() {
+ if (rtl_getAppCommandArgCount() != 1) {
+ std::cerr << "Usage: cppunittester <shared-library-path>" << std::endl;
+ return EXIT_FAILURE;
+ }
+ rtl::OUString path;
+ rtl_getAppCommandArg(0, &path.pData);
+ CppUnit::PlugInManager manager;
+ manager.load(
+ rtl::OUStringToOString(path, osl_getThreadTextEncoding()).getStr());
+ CppUnit::TestRunner runner;
+ runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
+ CppUnit::TestResult result;
+ CppUnit::TestResultCollector collector;
+ result.addListener(&collector);
+ runner.run(result);
+ CppUnit::CompilerOutputter(&collector, CppUnit::stdCErr()).write();
+ return collector.wasSuccessful() ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/sal/cppunittester/makefile.mk b/sal/cppunittester/makefile.mk
new file mode 100644
index 000000000000..61fe7868c9f3
--- /dev/null
+++ b/sal/cppunittester/makefile.mk
@@ -0,0 +1,52 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#***********************************************************************/
+
+PRJ = ..
+PRJNAME = sal
+TARGET = cppunittester
+
+ENABLE_EXCEPTIONS = TRUE
+
+.INCLUDE: settings.mk
+
+#building with stlport, but cppunit was not built with stlport
+.IF "$(USE_SYSTEM_STL)"!="YES"
+.IF "$(SYSTEM_CPPUNIT)"=="YES"
+CFLAGSCXX+=-DADAPT_EXT_STL
+.ENDIF
+.ENDIF
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+OBJFILES = $(APP1OBJS)
+
+APP1OBJS = $(OBJ)/cppunittester.obj
+APP1RPATH = NONE
+APP1STDLIBS = $(CPPUNITLIB) $(SALLIB)
+APP1TARGET = cppunittester
+
+.INCLUDE: target.mk
diff --git a/sal/inc/internal/once.h b/sal/inc/internal/once.h
new file mode 100644
index 000000000000..4438f281215c
--- /dev/null
+++ b/sal/inc/internal/once.h
@@ -0,0 +1,79 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_SAL_INTERNAL_ONCE_H
+#define INCLUDED_SAL_INTERNAL_ONCE_H
+
+/** sal_once_type
+ * (platform dependent)
+ */
+
+#if defined(SAL_UNX) || defined(SAL_OS2)
+
+#include <pthread.h>
+
+typedef pthread_once_t sal_once_type;
+
+#define SAL_ONCE_INIT PTHREAD_ONCE_INIT
+#define SAL_ONCE(once, init) pthread_once((once), (init))
+
+#elif defined(SAL_W32)
+
+#define WIN32_LEAN_AND_MEAN
+#pragma warning(push,1) /* disable warnings within system headers */
+#include <windows.h>
+#pragma warning(pop)
+
+typedef struct sal_once_st sal_once_type;
+struct sal_once_st
+{
+ LONG volatile m_done;
+ LONG volatile m_lock;
+};
+
+#define SAL_ONCE_INIT { 0, 0 }
+#define SAL_ONCE(once, init) \
+{ \
+ sal_once_type * control = (once); \
+ if (!(control->m_done)) \
+ { \
+ while (InterlockedExchange(&(control->m_lock), 1) == 1) Sleep(0); \
+ if (!(control->m_done)) \
+ { \
+ void (*init_routine)(void) = (init); \
+ (*init_routine)(); \
+ control->m_done = 1; \
+ } \
+ InterlockedExchange(&(control->m_lock), 0); \
+ } \
+}
+
+#else
+#error Unknown platform
+#endif /* SAL_UNX | SAL_W32 */
+
+#endif /* INCLUDED_SAL_INTERNAL_ONCE_H */
diff --git a/sal/inc/makefile.mk b/sal/inc/makefile.mk
new file mode 100644
index 000000000000..19d6b36fe084
--- /dev/null
+++ b/sal/inc/makefile.mk
@@ -0,0 +1,47 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..
+
+PRJNAME=sal
+TARGET=inc
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# --- Files --------------------------------------------------------
+# --- Targets -------------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(ENABLE_PCH)"!=""
+ALLTAR : \
+ $(SLO)$/precompiled.pch \
+ $(SLO)$/precompiled_ex.pch
+
+.ENDIF # "$(ENABLE_PCH)"!=""
+
diff --git a/sal/inc/osl/conditn.h b/sal/inc/osl/conditn.h
new file mode 100644
index 000000000000..debcdd882179
--- /dev/null
+++ b/sal/inc/osl/conditn.h
@@ -0,0 +1,92 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _OSL_CONDITION_H_
+#define _OSL_CONDITION_H_
+
+#include <osl/time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* oslCondition;
+
+typedef enum {
+ osl_cond_result_ok, /* successful completion */
+ osl_cond_result_error, /* error occured, check osl_getLastSocketError() for details */
+ osl_cond_result_timeout, /* blocking operation timed out */
+ osl_cond_result_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslConditionResult;
+
+/** Creates a condition.
+ The condition is in the reset-state.
+ @returns 0 if condition could not be created.
+*/
+oslCondition SAL_CALL osl_createCondition(void);
+
+/** Free the memory used by the condition.
+ @param Condition the condition handle.
+*/
+void SAL_CALL osl_destroyCondition(oslCondition Condition);
+
+/** Sets condition to True => wait() will not block, check() returns True.
+ NOTE: ALL threads waiting on this condition are unblocked!
+ @param Condition handle to a created condition.
+ @return False if system-call failed.
+*/
+sal_Bool SAL_CALL osl_setCondition(oslCondition Condition);
+
+/** Sets condition to False => wait() will block, check() returns False
+ @param Condition handle to a created condition.
+ @return False if system-call failed.
+*/
+sal_Bool SAL_CALL osl_resetCondition(oslCondition Condition);
+
+/** Blocks if condition is not set<BR>
+ If condition has been destroyed prematurely, wait() will
+ return with False.
+ @param Condition handle to a created condition.
+ @param pTimeout Tiemout value or NULL for infinite waiting
+ @return False if system-call failed.
+*/
+oslConditionResult SAL_CALL osl_waitCondition(oslCondition Condition, const TimeValue* pTimeout);
+
+/** Queries the state of the condition without blocking.
+ @param Condition handle to a created condition.
+ @return True: condition is set. <BR>
+ False: condition is not set. <BR>
+*/
+sal_Bool SAL_CALL osl_checkCondition(oslCondition Condition);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_CONDITION_H_ */
+
diff --git a/sal/inc/osl/conditn.hxx b/sal/inc/osl/conditn.hxx
new file mode 100644
index 000000000000..e0393ca98302
--- /dev/null
+++ b/sal/inc/osl/conditn.hxx
@@ -0,0 +1,128 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_CONDITN_HXX_
+#define _OSL_CONDITN_HXX_
+
+#ifdef __cplusplus
+
+#include <osl/time.h>
+
+#include <osl/conditn.h>
+
+
+namespace osl
+{
+
+ class Condition
+ {
+ public:
+
+ enum Result
+ {
+ result_ok = osl_cond_result_ok,
+ result_error = osl_cond_result_error,
+ result_timeout = osl_cond_result_timeout
+ };
+
+ /* Create a condition.
+ */
+ Condition()
+ {
+ condition = osl_createCondition();
+ }
+
+ /* Release the OS-structures and free condition data-structure.
+ */
+ ~Condition()
+ {
+ osl_destroyCondition(condition);
+ }
+
+ /* Release all waiting threads, check returns sal_True.
+ */
+ void set()
+ {
+ osl_setCondition(condition);
+ }
+
+ /* Reset condition to false: wait() will block, check() returns sal_False.
+ */
+ void reset() {
+ osl_resetCondition(condition);
+ }
+
+ /** Blocks the calling thread until condition is set.
+ */
+ Result wait(const TimeValue *pTimeout = 0)
+ {
+ return (Result) osl_waitCondition(condition, pTimeout);
+ }
+
+ /** Checks if the condition is set without blocking.
+ */
+ sal_Bool check()
+ {
+ return osl_checkCondition(condition);
+ }
+
+
+ private:
+ oslCondition condition;
+
+ /** The underlying oslCondition has no reference count.
+
+ Since the underlying oslCondition is not a reference counted object, copy
+ constructed Condition may work on an already destructed oslCondition object.
+
+ */
+ Condition(const Condition&);
+
+ /** The underlying oslCondition has no reference count.
+
+ When destructed, the Condition object destroys the undelying oslCondition,
+ which might cause severe problems in case it's a temporary object.
+
+ */
+ Condition(oslCondition condition);
+
+ /** This assignment operator is private for the same reason as
+ the copy constructor.
+ */
+ Condition& operator= (const Condition&);
+
+ /** This assignment operator is private for the same reason as
+ the constructor taking a oslCondition argument.
+ */
+ Condition& operator= (oslCondition);
+ };
+
+}
+
+#endif /* __cplusplus */
+#endif /* _OSL_CONDITN_HXX_ */
+
diff --git a/sal/inc/osl/diagnose.h b/sal/inc/osl/diagnose.h
new file mode 100644
index 000000000000..033b24c84360
--- /dev/null
+++ b/sal/inc/osl/diagnose.h
@@ -0,0 +1,152 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _OSL_DIAGNOSE_H_
+#define _OSL_DIAGNOSE_H_
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* //////////////////////////////////////////////////////////////////////////
+ Diagnostic support
+*/
+
+void SAL_CALL osl_breakDebug(void);
+sal_Bool SAL_CALL osl_assertFailedLine(const sal_Char* pszFileName, sal_Int32 nLine, const sal_Char* pszMessage);
+void SAL_CALL osl_trace(const sal_Char* pszFormat, ...);
+sal_Int32 SAL_CALL osl_reportError(sal_uInt32 nType, const sal_Char* pszErrorMessage);
+
+/*
+ For message delivery
+*/
+
+/** a message delivery function which receives a pre-formatted message string
+*/
+typedef void (SAL_CALL *pfunc_osl_printDebugMessage)( const sal_Char * pszMessage );
+
+/** a message delivery function which receives detailed information about where the message was triggered
+*/
+typedef void (SAL_CALL *pfunc_osl_printDetailedDebugMessage)( const sal_Char * pszFileName, sal_Int32 nLine, const sal_Char* pszMessage );
+
+/** sets a message delivery function
+
+ The function set here is ignored if a function for detailed message information
+ (pfunc_osl_printDetailedDebugMessage) has been set.
+
+ The given message handler must be able to cope with a <NULL/> message.
+*/
+pfunc_osl_printDebugMessage SAL_CALL osl_setDebugMessageFunc( pfunc_osl_printDebugMessage pNewFunc );
+
+/** sets a delivery function for detailed message information.
+
+ The given message handler must be able to cope with a <NULL/> message.
+*/
+pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc( pfunc_osl_printDetailedDebugMessage pNewFunc );
+
+#ifdef __cplusplus
+}
+#endif
+
+#define OSL_THIS_FILE __FILE__
+
+/* the macro OSL_THIS_FUNC is intended to be an office internal macro for now */
+#define OSL_THIS_FUNC "<unknown>"
+
+/* the macro OSL_TO_STRING is intended to be an office internal macro for now */
+#define OSL_TO_STRING( x ) #x
+
+/* the macro OSL_MACRO_VALUE_TO_STRING is intended to be an office internal macro for now */
+#define OSL_MACRO_VALUE_TO_STRING( x ) OSL_TO_STRING( x )
+
+/* the macro OSL_LOG_PREFIX is intended to be an office internal macro for now */
+#define OSL_LOG_PREFIX OSL_THIS_FILE ":" OSL_THIS_FUNC ":" OSL_MACRO_VALUE_TO_STRING( __LINE__ ) "; "
+
+#define OSL_DEBUG_ONLY(s) _OSL_DEBUG_ONLY(s)
+#define OSL_TRACE _OSL_TRACE
+#define OSL_ASSERT(c) _OSL_ASSERT(c, OSL_THIS_FILE, __LINE__)
+#define OSL_ENSURE(c, m) _OSL_ENSURE(c, OSL_THIS_FILE, __LINE__, m)
+
+#define OSL_VERIFY(c) do { if (!(c)) OSL_ASSERT(0); } while (0)
+#define OSL_PRECOND(c, m) OSL_ENSURE(c, m)
+#define OSL_POSTCOND(c, m) OSL_ENSURE(c, m)
+
+
+#ifdef __cplusplus
+#define _OSL_GLOBAL ::
+#else
+#define _OSL_GLOBAL
+#endif /* __cplusplus */
+
+#ifdef _WIN16
+#if OSL_DEBUG_LEVEL > 0
+#undef OSL_DEBUG_LEVEL
+#define OSL_DEBUG_LEVEL 0
+#endif
+#endif
+
+
+
+#if OSL_DEBUG_LEVEL > 0
+
+#define _OSL_DEBUG_ONLY(f) (f)
+#define _OSL_ASSERT(c, f, l) \
+ do \
+ { \
+ if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, 0)) \
+ _OSL_GLOBAL osl_breakDebug(); \
+ } while (0)
+
+#define _OSL_ENSURE(c, f, l, m) \
+ do \
+ { \
+ if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, m)) \
+ _OSL_GLOBAL osl_breakDebug(); \
+ } while (0)
+
+#else
+
+#define _OSL_DEBUG_ONLY(f) ((void)0)
+#define _OSL_ASSERT(c, f, l) ((void)0)
+#define _OSL_ENSURE(c, f, l, m) ((void)0)
+
+#endif /* OSL_DEBUG_LEVEL */
+
+#if OSL_DEBUG_LEVEL > 1
+
+#define _OSL_TRACE _OSL_GLOBAL osl_trace
+
+#else
+
+#define _OSL_TRACE 1 ? ((void)0) : _OSL_GLOBAL osl_trace
+
+#endif /* OSL_DEBUG_LEVEL */
+
+#endif /* _OSL_DIAGNOSE_H_ */
diff --git a/sal/inc/osl/diagnose.hxx b/sal/inc/osl/diagnose.hxx
new file mode 100644
index 000000000000..e7360e93349e
--- /dev/null
+++ b/sal/inc/osl/diagnose.hxx
@@ -0,0 +1,205 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if ! defined(OSL_DIAGNOSE_HXX_INCLUDED)
+#define OSL_DIAGNOSE_HXX_INCLUDED
+
+#if ! defined(_OSL_DIAGNOSE_H_)
+#include "osl/diagnose.h"
+#endif
+#if ! defined(_OSL_INTERLOCK_H_)
+#include "osl/interlck.h"
+#endif
+#if ! defined(_OSL_MUTEX_HXX_)
+#include "osl/mutex.hxx"
+#endif
+#if ! defined(INCLUDED_RTL_ALLOCATOR_HXX)
+#include "rtl/allocator.hxx"
+#endif
+#if ! defined(_RTL_INSTANCE_HXX_)
+#include "rtl/instance.hxx"
+#endif
+#include <hash_set>
+#include <functional>
+#include <typeinfo>
+
+namespace osl {
+/// @internal
+namespace detail {
+
+struct ObjectRegistryData;
+
+} // namespace detail
+} // namespace osl
+
+extern "C" {
+
+/** @internal */
+bool SAL_CALL osl_detail_ObjectRegistry_storeAddresses( char const* pName )
+ SAL_THROW_EXTERN_C();
+
+/** @internal */
+bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount(
+ ::osl::detail::ObjectRegistryData const& rData, ::std::size_t nExpected )
+ SAL_THROW_EXTERN_C();
+
+/** @internal */
+void SAL_CALL osl_detail_ObjectRegistry_registerObject(
+ ::osl::detail::ObjectRegistryData & rData, void const* pObj )
+ SAL_THROW_EXTERN_C();
+
+/** @internal */
+void SAL_CALL osl_detail_ObjectRegistry_revokeObject(
+ ::osl::detail::ObjectRegistryData & rData, void const* pObj )
+ SAL_THROW_EXTERN_C();
+
+/** @internal */
+::osl::Mutex & SAL_CALL osl_detail_ObjectRegistry_getMutex()
+ SAL_THROW_EXTERN_C();
+
+} // extern "C"
+
+namespace osl {
+
+/// @internal
+namespace detail {
+
+struct VoidPtrHash : ::std::unary_function<void const*, ::std::size_t> {
+ ::std::size_t operator()( void const* p ) const {
+ ::std::size_t const d = static_cast< ::std::size_t >(
+ reinterpret_cast< ::std::ptrdiff_t >(p) );
+ return d + (d >> 3);
+ }
+};
+
+typedef ::std::hash_set<void const*, VoidPtrHash, ::std::equal_to<void const*>,
+ ::rtl::Allocator<void const*> > VoidPointerSet;
+
+struct ObjectRegistryData {
+ ObjectRegistryData( ::std::type_info const& rTypeInfo )
+ : m_pName(rTypeInfo.name()), m_nCount(0), m_addresses(),
+ m_bStoreAddresses(osl_detail_ObjectRegistry_storeAddresses(m_pName)){}
+
+ char const* const m_pName;
+ oslInterlockedCount m_nCount;
+ VoidPointerSet m_addresses;
+ bool const m_bStoreAddresses;
+};
+
+template <typename T>
+class ObjectRegistry
+{
+public:
+ ObjectRegistry() : m_data( typeid(T) ) {}
+ ~ObjectRegistry() { checkObjectCount(0); }
+
+ bool checkObjectCount( ::std::size_t nExpected ) const {
+ bool const bRet = osl_detail_ObjectRegistry_checkObjectCount(
+ m_data, nExpected );
+ if (!bRet && m_data.m_bStoreAddresses) {
+ MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() );
+ // following loop is for debugging purposes, iterating over map:
+ VoidPointerSet::const_iterator iPos(m_data.m_addresses.begin());
+ VoidPointerSet::const_iterator const iEnd(m_data.m_addresses.end());
+ for ( ; iPos != iEnd; ++iPos ) {
+ OSL_ASSERT( *iPos != 0 );
+ }
+ }
+ return bRet;
+ }
+
+ void registerObject( void const* pObj ) {
+ osl_detail_ObjectRegistry_registerObject(m_data, pObj);
+ }
+
+ void revokeObject( void const* pObj ) {
+ osl_detail_ObjectRegistry_revokeObject(m_data, pObj);
+ }
+
+private:
+ // not impl:
+ ObjectRegistry( ObjectRegistry const& );
+ ObjectRegistry const& operator=( ObjectRegistry const& );
+
+ ObjectRegistryData m_data;
+};
+
+} // namespace detail
+
+/** Helper class which indicates leaking object(s) of a particular class in
+ non-pro builds; use e.g.
+
+ <pre>
+ class MyClass : private osl::DebugBase<MyClass> {...};
+ </pre>
+
+ Using the environment variable
+
+ OSL_DEBUGBASE_STORE_ADDRESSES=MyClass;YourClass;...
+
+ you can specify a ';'-separated list of strings matching to class names
+ (or "all" for all classes), for which DebugBase stores addresses to created
+ objects instead of just counting them. This enables you to iterate over
+ leaking objects in your debugger.
+
+ @tpl InheritingClassT binds the template instance to that class
+ @internal Use at own risk.
+ For now this is just public (yet unpublished) API and may change
+ in the future!
+*/
+template <typename InheritingClassT>
+class DebugBase
+{
+public:
+#if OSL_DEBUG_LEVEL <= 0
+ static bool checkObjectCount( ::std::size_t = 0 ) { return true; }
+#else // OSL_DEBUG_LEVEL > 0
+ /** @return whether the expected number of objects is alive,
+ else this function OSL_ASSERTs
+ */
+ static bool checkObjectCount( ::std::size_t nExpected = 0 ) {
+ return StaticObjectRegistry::get().checkObjectCount(nExpected);
+ }
+
+protected:
+ DebugBase() {
+ StaticObjectRegistry::get().registerObject( this );
+ }
+ ~DebugBase() {
+ StaticObjectRegistry::get().revokeObject( this );
+ }
+
+private:
+ struct StaticObjectRegistry
+ : ::rtl::Static<detail::ObjectRegistry<InheritingClassT>,
+ StaticObjectRegistry> {};
+#endif
+};
+
+} // namespace osl
+
+#endif // ! defined(OSL_DIAGNOSE_HXX_INCLUDED)
+
diff --git a/sal/inc/osl/doublecheckedlocking.h b/sal/inc/osl/doublecheckedlocking.h
new file mode 100644
index 000000000000..1be9f2467c7a
--- /dev/null
+++ b/sal/inc/osl/doublecheckedlocking.h
@@ -0,0 +1,81 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if !defined INCLUDED_OSL_DOUBLECHECKEDLOCKING_H
+#define INCLUDED_OSL_DOUBLECHECKEDLOCKING_H
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** A platform specific macro needed to make double-checked locking work.
+
+ See
+ <http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html>
+ for a description of double-checked locking, why it is broken, and how it
+ can be fixed. On platforms where it is necessary, this macro will expand
+ to some memory barrier instruction. On many platforms, double-checked
+ locking works as it is, though, so on those platforms this macro will be
+ empty. This is a macro instead of a (C++ inline) function to allow for
+ maximum performance in both C and C++.
+
+ If possible, use the rtl_Instance template instead of explicitly spelling
+ out the double-checked locking pattern. There are few cases where you
+ will have to spell it out explicitly (e.g., the logic of a certain
+ instance of the pattern is too complex to be mapped to the template, or
+ some compiler refuses to compile a template instantiation due to internal
+ compiler errors), though, and you should always call this macro at the
+ right places then:
+
+ static T * pInstance = 0;
+
+ T * p = pInstance;
+ if (!p)
+ {
+ Guard aGuard(aMutex);
+ p = pInstance;
+ if (!p)
+ {
+ p = ...;
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ pInstance = p;
+ }
+ }
+ else
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ return p;
+
+ One extra advantage of this macro is that it makes it easier to find all
+ places where double-checked locking is used.
+ */
+#define OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER() /* empty */
+
+#if defined __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* INCLUDED_OSL_DOUBLECHECKEDLOCKING_H */
diff --git a/sal/inc/osl/endian.h b/sal/inc/osl/endian.h
new file mode 100644
index 000000000000..e8701bdc768a
--- /dev/null
+++ b/sal/inc/osl/endian.h
@@ -0,0 +1,235 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_ENDIAN_H_
+#define _OSL_ENDIAN_H_
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Determine the platform byte order as _BIG_ENDIAN, _LITTLE_ENDIAN, ...
+ */
+#ifdef _WIN32
+# if defined(_M_IX86)
+# define _LITTLE_ENDIAN
+# elif defined(_M_MRX000)
+# define _LITTLE_ENDIAN
+# elif defined(_M_ALPHA)
+# define _LITTLE_ENDIAN
+# elif defined(_M_PPC)
+# define _LITTLE_ENDIAN
+# endif
+#endif
+
+#ifdef LINUX
+# include <endian.h>
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# ifndef _LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# endif
+# elif __BYTE_ORDER == __BIG_ENDIAN
+# ifndef _BIG_ENDIAN
+# define _BIG_ENDIAN
+# endif
+# elif __BYTE_ORDER == __PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+#endif
+
+#ifdef NETBSD
+# include <machine/endian.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+#endif
+
+#ifdef FREEBSD
+# include <sys/param.h>
+# include <machine/endian.h>
+#if __FreeBSD_version < 500000
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+#endif
+#endif
+
+#ifdef SCO
+# include <sys/types.h>
+# include <sys/byteorder.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+#endif
+
+#ifdef AIX
+# include <sys/machine.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+#endif
+
+#ifdef HPUX
+# include <machine/param.h>
+#endif
+
+#ifdef _WIN16
+# define _LITTLE_ENDIAN
+#endif
+
+#ifdef OS2
+# include <machine/endian.h>
+#endif
+
+#ifdef SOLARIS
+# include <sys/isa_defs.h>
+#endif
+
+#ifdef MACOSX
+# include <machine/endian.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# ifndef _LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# endif
+# elif BYTE_ORDER == BIG_ENDIAN
+# ifndef _BIG_ENDIAN
+# define _BIG_ENDIAN
+# endif
+# elif BYTE_ORDER == PDP_ENDIAN
+# ifndef _PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# endif
+#endif
+
+/** Check supported platform.
+ */
+#if !defined(_WIN32) && !defined(_WIN16) && !defined(OS2) && \
+ !defined(LINUX) && !defined(NETBSD) && !defined(SCO) && \
+ !defined(AIX) && !defined(HPUX) && \
+ !defined(SOLARIS) && !defined(MACOSX) && !defined(FREEBSD)
+# error "Target platform not specified !"
+#endif
+
+
+/** Define the determined byte order as OSL_BIGENDIAN or OSL_LITENDIAN.
+ */
+#if defined _LITTLE_ENDIAN
+# define OSL_LITENDIAN
+#elif defined _BIG_ENDIAN
+# define OSL_BIGENDIAN
+#else
+# error undetermined endianess
+#endif
+
+
+/** Define macros for byte order manipulation.
+ */
+#ifndef OSL_MAKEBYTE
+# define OSL_MAKEBYTE(nl, nh) ((sal_uInt8)(((nl) & 0x0F) | (((nh) & 0x0F) << 4)))
+#endif
+#ifndef OSL_LONIBBLE
+# define OSL_LONIBBLE(b) ((sal_uInt8)((b) & 0x0F))
+#endif
+#ifndef OSL_HINIBBLE
+# define OSL_HINIBBLE(b) ((sal_uInt8)(((b) >> 4) & 0x0F))
+#endif
+
+#ifndef OSL_MAKEWORD
+# define OSL_MAKEWORD(bl, bh) ((sal_uInt16)((bl) & 0xFF) | (((sal_uInt16)(bh) & 0xFF) << 8))
+#endif
+#ifndef OSL_LOBYTE
+# define OSL_LOBYTE(w) ((sal_uInt8)((sal_uInt16)(w) & 0xFF))
+#endif
+#ifndef OSL_HIBYTE
+# define OSL_HIBYTE(w) ((sal_uInt8)(((sal_uInt16)(w) >> 8) & 0xFF))
+#endif
+
+#ifndef OSL_MAKEDWORD
+# define OSL_MAKEDWORD(wl, wh) ((sal_uInt32)((wl) & 0xFFFF) | (((sal_uInt32)(wh) & 0xFFFF) << 16))
+#endif
+#ifndef OSL_LOWORD
+# define OSL_LOWORD(d) ((sal_uInt16)((sal_uInt32)(d) & 0xFFFF))
+#endif
+#ifndef OSL_HIWORD
+# define OSL_HIWORD(d) ((sal_uInt16)(((sal_uInt32)(d) >> 16) & 0xFFFF))
+#endif
+
+
+/** Define macros for swapping between host and network byte order.
+ */
+#ifdef OSL_BIGENDIAN
+#ifndef OSL_NETWORD
+# define OSL_NETWORD(w) (sal_uInt16)(w)
+#endif
+#ifndef OSL_NETDWORD
+# define OSL_NETDWORD(d) (sal_uInt32)(d)
+#endif
+#else /* OSL_LITENDIAN */
+#ifndef OSL_NETWORD
+# define OSL_NETWORD(w) OSL_MAKEWORD(OSL_HIBYTE(w),OSL_LOBYTE(w))
+#endif
+#ifndef OSL_NETDWORD
+# define OSL_NETDWORD(d) OSL_MAKEDWORD(OSL_NETWORD(OSL_HIWORD(d)),OSL_NETWORD(OSL_LOWORD(d)))
+#endif
+#endif /* OSL_BIGENDIAN */
+
+
+/** Define macros for swapping between byte orders.
+ */
+#ifndef OSL_SWAPWORD
+# define OSL_SWAPWORD(w) OSL_MAKEWORD(OSL_HIBYTE(w),OSL_LOBYTE(w))
+#endif
+#ifndef OSL_SWAPDWORD
+# define OSL_SWAPDWORD(d) OSL_MAKEDWORD(OSL_SWAPWORD(OSL_HIWORD(d)),OSL_SWAPWORD(OSL_LOWORD(d)))
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_OSL_ENDIAN_H_ */
+
diff --git a/sal/inc/osl/file.h b/sal/inc/osl/file.h
new file mode 100644
index 000000000000..29196469fa61
--- /dev/null
+++ b/sal/inc/osl/file.h
@@ -0,0 +1,1593 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/** @HTML */
+
+#ifndef _OSL_FILE_H_
+#define _OSL_FILE_H_
+
+#include <osl/time.h>
+# include <rtl/ustring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @file
+
+Main goals and usage hints
+
+The main intentention of this interface is to provide an universal portable and
+high performance access to file system issues on any operating system.<p>
+
+There are a few main goals:<p>
+
+1.The path specifications always has to be absolut. Any usage of relative path
+specifications is forbidden. Exceptions are <code>osl_getSystemPathFromFileURL</code>,
+<code>osl_getFileURLFromSystemPath</code> and <code>osl_getAbsoluteFileURL</code>. Most operating systems
+provide a "Current Directory" per process. This is the reason why relative path
+specifications can cause problems in multithreading environments.<p>
+
+2.Proprietary notations of file paths are not supported. Every path notation
+must the file URL specification. File URLs must be encoded in UTF8 and
+after that escaped. Although the URL parameter is a unicode string, the must
+contain only ASCII characters<p>
+
+3.The caller cannot get any information whether a file system is case sensitive,
+case preserving or not. The operating system implementation itself should
+determine if it can map case-insensitive paths. The case correct notation of
+a filename or file path is part of the "File Info". This case correct name
+can be used as a unique key if neccessary.<p>
+
+4. Obtaining information about files or volumes is controlled by a
+bitmask which specifies which fields are of interest. Due to performance
+issues it is not recommended to obtain information which is not needed.
+But if the operating system provides more information anyway the
+implementation can set more fields on output as were requested. It is in the
+responsibility of the caller to decide if he uses this additional information
+or not. But he should do so to prevent further unnecessary calls if the information
+is already there.<br>
+
+The input bitmask supports a flag <code>osl_FileStatus_Mask_Validate</code> which
+can be used to force retrieving uncached validated information. Setting this flag
+when calling <code>osl_getFileStatus</code> in combination with no other flag is
+a synonym for a "FileExists". This should only be done when processing a single file
+(f.e. before opening) and NEVER during enumeration of directory contents on any step
+of information processing. This would change the runtime behaviour from O(n) to
+O(n*n/2) on nearly every file system.<br>
+On Windows NT reading the contents of an directory with 7000 entries and
+getting full information about every file only takes 0.6 seconds. Specifying the
+flag <code>osl_FileStatus_Mask_Validate</code> for each entry will increase the
+time to 180 seconds (!!!).
+
+*/
+
+
+
+/* Error codes according to errno */
+
+typedef enum {
+ osl_File_E_None,
+ osl_File_E_PERM,
+ osl_File_E_NOENT,
+ osl_File_E_SRCH,
+ osl_File_E_INTR,
+ osl_File_E_IO,
+ osl_File_E_NXIO,
+ osl_File_E_2BIG,
+ osl_File_E_NOEXEC,
+ osl_File_E_BADF,
+ osl_File_E_CHILD,
+ osl_File_E_AGAIN,
+ osl_File_E_NOMEM,
+ osl_File_E_ACCES,
+ osl_File_E_FAULT,
+ osl_File_E_BUSY,
+ osl_File_E_EXIST,
+ osl_File_E_XDEV,
+ osl_File_E_NODEV,
+ osl_File_E_NOTDIR,
+ osl_File_E_ISDIR,
+ osl_File_E_INVAL,
+ osl_File_E_NFILE,
+ osl_File_E_MFILE,
+ osl_File_E_NOTTY,
+ osl_File_E_FBIG,
+ osl_File_E_NOSPC,
+ osl_File_E_SPIPE,
+ osl_File_E_ROFS,
+ osl_File_E_MLINK,
+ osl_File_E_PIPE,
+ osl_File_E_DOM,
+ osl_File_E_RANGE,
+ osl_File_E_DEADLK,
+ osl_File_E_NAMETOOLONG,
+ osl_File_E_NOLCK,
+ osl_File_E_NOSYS,
+ osl_File_E_NOTEMPTY,
+ osl_File_E_LOOP,
+ osl_File_E_ILSEQ,
+ osl_File_E_NOLINK,
+ osl_File_E_MULTIHOP,
+ osl_File_E_USERS,
+ osl_File_E_OVERFLOW,
+ osl_File_E_NOTREADY,
+ osl_File_E_invalidError, /* unmapped error: always last entry in enum! */
+ osl_File_E_TIMEDOUT,
+ osl_File_E_NETWORK,
+ osl_File_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslFileError;
+
+typedef void *oslDirectory;
+typedef void *oslDirectoryItem;
+
+
+/** Open a directory for enumerating its contents.
+
+ @param pustrDirectoryURL [in]
+ The full qualified URL of the directory.
+
+ @param pDirectory [out]
+ On success it receives a handle used for subsequent calls by osl_getNextDirectoryItem().
+ The handle has to be released by a call to osl_closeDirectory().
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOENT the specified path doesn't exist<br>
+ osl_File_E_NOTDIR the specified path is not an directory <br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_MFILE too many open files used by the process<br>
+ osl_File_E_NFILE too many open files in the system<br>
+ osl_File_E_NAMETOOLONG File name too long<br>
+ osl_File_E_LOOP Too many symbolic links encountered<p>
+
+ @see osl_getNextDirectoryItem()
+ @see osl_closeDirectory()
+*/
+
+oslFileError SAL_CALL osl_openDirectory( rtl_uString *pustrDirectoryURL, oslDirectory *pDirectory);
+
+
+/** Retrieve the next item of a previously opened directory.
+
+ Retrieves the next item of a previously opened directory.
+ All handles have an initial refcount of 1.
+
+ @param Directory [in]
+ A directory handle received from a previous call to osl_openDirectory().
+
+ @param pItem [out]
+ On success it receives a handle that can be used for subsequent calls to osl_getFileStatus().
+ The handle has to be released by a call to osl_releaseDirectoryItem().
+
+ @param uHint [in]
+ With this parameter the caller can tell the implementation that (s)he
+ is going to call this function uHint times afterwards. This enables the implementation to
+ get the information for more than one file and cache it until the next calls.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_NOENT no more entries in this directory<br>
+ osl_File_E_BADF invalid oslDirectory parameter<br>
+ osl_File_E_OVERFLOW the value too large for defined data type
+
+ @see osl_releaseDirectoryItem()
+ @see osl_acquireDirectoryItem()
+ @see osl_getDirectoryItem()
+ @see osl_getFileStatus()
+*/
+
+oslFileError SAL_CALL osl_getNextDirectoryItem(
+ oslDirectory Directory,
+ oslDirectoryItem *pItem,
+ sal_uInt32 uHint
+ );
+
+
+/** Release a directory handle.
+
+ @param Directory [in]
+ A handle received by a call to osl_openDirectory().
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures<br>
+ osl_File_E_BADF invalid oslDirectory parameter<br>
+ osl_File_E_INTR the function call was interrupted<p>
+
+ @see osl_openDirectory()
+*/
+
+oslFileError SAL_CALL osl_closeDirectory(oslDirectory Directory);
+
+
+/** Retrieve a single directory item.
+
+ Retrieves a single directory item. The returned handle has an initial refcount of 1.
+ Due to performance issues it is not recommended to use this function while
+ enumerating the contents of a directory. In this case use osl_getNextDirectoryItem() instead.
+
+ @param pustrFileURL [in]
+ An absolute file URL.
+
+ @param pItem [out]
+ On success it receives a handle which can be used for subsequent calls to osl_getFileStatus().
+ The handle has to be released by a call to osl_releaseDirectoryItem().
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_MFILE too many open files used by the process<br>
+ osl_File_E_NFILE too many open files in the system<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ osl_File_E_NAMETOOLONG the file name is too long<br>
+ osl_File_E_NOTDIR a component of the path prefix of path is not a directory<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_MULTIHOP multihop attempted<br>
+ osl_File_E_NOLINK link has been severed<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_INTR the function call was interrupted<p>
+
+ @see osl_releaseDirectoryItem()
+ @see osl_acquireDirectoryItem()
+ @see osl_getFileStatus()
+ @see osl_getNextDirectoryItem()
+*/
+
+oslFileError SAL_CALL osl_getDirectoryItem(
+ rtl_uString *pustrFileURL,
+ oslDirectoryItem *pItem
+ );
+
+
+/** Increase the refcount of a directory item handle.
+
+ The caller responsible for releasing the directory item handle using osl_releaseDirectoryItem().
+
+ @param Item [in]
+ A handle received by a call to osl_getDirectoryItem() or osl_getNextDirectoryItem().
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_NOMEM not enough memory for allocating structures<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+
+ @see osl_getDirectoryItem()
+ @see osl_getNextDirectoryItem()
+ @see osl_releaseDirectoryItem()
+*/
+
+oslFileError SAL_CALL osl_acquireDirectoryItem( oslDirectoryItem Item );
+
+
+/** Decrease the refcount of a directory item handle.
+
+ Decreases the refcount of a directory item handle.
+ If the refcount reaches 0 the data associated with
+ this directory item handle will be released.
+
+ @param Item [in]
+ A handle received by a call to osl_getDirectoryItem() or osl_getNextDirectoryItem().
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_NOMEM not enough memory for allocating structures<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+
+ @see osl_getDirectoryItem()
+ @see osl_getNextDirectoryItem()
+ @see osl_acquireDirectoryItem()
+*/
+
+oslFileError SAL_CALL osl_releaseDirectoryItem( oslDirectoryItem Item );
+
+/* File types */
+
+typedef enum {
+ osl_File_Type_Directory,
+ osl_File_Type_Volume,
+ osl_File_Type_Regular,
+ osl_File_Type_Fifo,
+ osl_File_Type_Socket,
+ osl_File_Type_Link,
+ osl_File_Type_Special,
+ osl_File_Type_Unknown
+} oslFileType;
+
+/* File attributes */
+#define osl_File_Attribute_ReadOnly 0x00000001
+#define osl_File_Attribute_Hidden 0x00000002
+#define osl_File_Attribute_Executable 0x00000010
+#define osl_File_Attribute_GrpWrite 0x00000020
+#define osl_File_Attribute_GrpRead 0x00000040
+#define osl_File_Attribute_GrpExe 0x00000080
+#define osl_File_Attribute_OwnWrite 0x00000100
+#define osl_File_Attribute_OwnRead 0x00000200
+#define osl_File_Attribute_OwnExe 0x00000400
+#define osl_File_Attribute_OthWrite 0x00000800
+#define osl_File_Attribute_OthRead 0x00001000
+#define osl_File_Attribute_OthExe 0x00002000
+
+/* Flags specifying which fields to retreive by osl_getFileStatus */
+
+#define osl_FileStatus_Mask_Type 0x00000001
+#define osl_FileStatus_Mask_Attributes 0x00000002
+#define osl_FileStatus_Mask_CreationTime 0x00000010
+#define osl_FileStatus_Mask_AccessTime 0x00000020
+#define osl_FileStatus_Mask_ModifyTime 0x00000040
+#define osl_FileStatus_Mask_FileSize 0x00000080
+#define osl_FileStatus_Mask_FileName 0x00000100
+#define osl_FileStatus_Mask_FileURL 0x00000200
+#define osl_FileStatus_Mask_LinkTargetURL 0x00000400
+#define osl_FileStatus_Mask_All 0x7FFFFFFF
+#define osl_FileStatus_Mask_Validate 0x80000000
+
+
+typedef
+
+/** Structure containing information about files and directories
+
+ @see osl_getFileStatus()
+ @see oslFileType
+*/
+
+struct _oslFileStatus {
+/** Must be initialized with the size in bytes of the structure before passing it to any function */
+ sal_uInt32 uStructSize;
+/** Determines which members of the structure contain valid data */
+ sal_uInt32 uValidFields;
+/** The type of the file (file, directory, volume). */
+ oslFileType eType;
+/** File attributes */
+ sal_uInt64 uAttributes;
+/** First creation time in nanoseconds since 1/1/1970. Can be the last modify time depending on
+ platform or file system. */
+ TimeValue aCreationTime;
+/** Last access time in nanoseconds since 1/1/1970. Can be the last modify time depending on
+ platform or file system. */
+ TimeValue aAccessTime;
+/** Last modify time in nanoseconds since 1/1/1970. */
+ TimeValue aModifyTime;
+/** Size in bytes of the file. Zero for directories and volumes. */
+ sal_uInt64 uFileSize;
+/** Case correct name of the file. Should be set to zero before calling <code>osl_getFileStatus</code>
+ and released after usage. */
+ rtl_uString *ustrFileName;
+/** Full URL of the file. Should be set to zero before calling <code>osl_getFileStatus</code>
+ and released after usage. */
+ rtl_uString *ustrFileURL;
+/** Full URL of the target file if the file itself is a link.
+ Should be set to zero before calling <code>osl_getFileStatus</code>
+ and released after usage. */
+ rtl_uString *ustrLinkTargetURL;
+} oslFileStatus;
+
+
+/** Retrieve information about a single file or directory.
+
+ @param Item [in]
+ A handle received by a previous call to osl_getDirectoryItem() or osl_getNextDirectoryItem().
+
+ @param pStatus [in|out]
+ Points to a structure which receives the information of the file or directory
+ represented by the handle Item. The member uStructSize has to be initialized to
+ sizeof(oslFileStatus) before calling this function.
+
+ @param uFieldMask [in]
+ Specifies which fields of the structure pointed to by pStatus are of interest to the caller.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_NAMETOOLONG file name too long<br>
+ osl_File_E_BADF invalid oslDirectoryItem parameter<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_OVERFLOW value too large for defined data type<br>
+ osl_File_E_INTR function call was interrupted<br>
+ osl_File_E_NOLINK link has been severed<br>
+ osl_File_E_MULTIHOP components of path require hopping to multiple remote machines and the file system does not allow it<br>
+ osl_File_E_MFILE too many open files used by the process<br>
+ osl_File_E_NFILE too many open files in the system<br>
+ osl_File_E_NOSPC no space left on device<br>
+ osl_File_E_NXIO no such device or address<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_NOSYS function not implemented<p>
+
+ @see osl_getDirectoryItem()
+ @see osl_getNextDirectoryItem()
+ @see oslFileStatus
+*/
+
+oslFileError SAL_CALL osl_getFileStatus( oslDirectoryItem Item, oslFileStatus *pStatus, sal_uInt32 uFieldMask );
+
+
+typedef void *oslVolumeDeviceHandle;
+
+
+/** Unmount a volume device.
+
+ Unmount the volume specified by the given oslVolumeDeviceHandle.
+
+ @param Handle [in]
+ An oslVolumeDeviceHandle received by a call to osl_getVolumeInformation().
+
+ @return
+ osl_File_E_None on success<br>
+
+ @todo
+ specify all error codes that may be returned
+
+ @see osl_getVolumeInformation()
+*/
+
+oslFileError SAL_CALL osl_unmountVolumeDevice( oslVolumeDeviceHandle Handle );
+
+
+/** Automount a volume device.
+
+ Automount the volume device specified by the given oslVolumeDeviceHandle.
+
+ @param Handle [in]
+ An oslVolumeDeviceHandle received by a call to osl_getVolumeInformation().
+
+ @return
+ osl_File_E_None on success<br>
+
+ @todo
+ specify all error codes that may be returned
+
+ @see osl_getVolumeInformation()
+*/
+
+oslFileError SAL_CALL osl_automountVolumeDevice( oslVolumeDeviceHandle Handle );
+
+
+/** Release a volume device handle.
+
+ Releases the given oslVolumeDeviceHandle which was acquired by a call to
+ osl_getVolumeInformation() or osl_acquireVolumeDeviceHandle().
+
+ @param Handle [in]
+ An oslVolumeDeviceHandle received by a call to osl_getVolumeInformation().
+
+ @return
+ osl_File_E_None on success<br>
+
+ @todo
+ specify all error codes that may be returned
+
+ @see osl_acquireVolumeDeviceHandle()
+ @see osl_getVolumeInformation()
+*/
+
+oslFileError SAL_CALL osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle );
+
+/** Acquire a volume device handle.
+
+ Acquires the given oslVolumeDeviceHandle which was acquired by a call to
+ osl_getVolumeInformation(). The caller is responsible for releasing the
+ acquired handle by calling osl_releaseVolumeDeviceHandle().
+
+ @param Handle [in]
+ An oslVolumeDeviceHandle received by a call to osl_getVolumeInformation().
+
+ @return
+ osl_File_E_None on success<br>
+
+ @todo
+ specify all error codes that may be returned
+
+ @see osl_getVolumeInformation()
+*/
+
+oslFileError SAL_CALL osl_acquireVolumeDeviceHandle( oslVolumeDeviceHandle Handle );
+
+
+/** Get the full qualified URL where a device is mounted to.
+
+ @param Handle [in]
+ An oslVolumeDeviceHandle received by a call to osl_getVolumeInformation().
+
+ @param ppustrDirectoryURL [out]
+ Receives the full qualified URL where the device is mounted to.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_NXIO no such device or address<br>
+ osl_File_E_NODEV no such device<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_FAULT bad address<br>
+ osl_FilE_E_INTR function call was interrupted<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_MULTIHOP multihop attempted<br>
+ osl_File_E_NOLINK link has been severed<br>
+ osl_File_E_EOVERFLOW value too large for defined data type<br>
+
+ @see osl_getVolumeInformation()
+ @see osl_automountVolumeDevice()
+ @see osl_unmountVolumeDevice()
+*/
+
+oslFileError SAL_CALL osl_getVolumeDeviceMountPath( oslVolumeDeviceHandle Handle, rtl_uString **ppustrDirectoryURL);
+
+/* Volume attributes */
+
+#define osl_Volume_Attribute_Removeable 0x00000001L
+#define osl_Volume_Attribute_Remote 0x00000002L
+#define osl_Volume_Attribute_CompactDisc 0x00000004L
+#define osl_Volume_Attribute_FixedDisk 0x00000008L
+#define osl_Volume_Attribute_RAMDisk 0x00000010L
+#define osl_Volume_Attribute_FloppyDisk 0x00000020L
+
+#define osl_Volume_Attribute_Case_Is_Preserved 0x00000040L
+#define osl_Volume_Attribute_Case_Sensitive 0x00000080L
+
+/* Flags specifying which fields to retreive by osl_getVolumeInfo */
+
+#define osl_VolumeInfo_Mask_Attributes 0x00000001L
+#define osl_VolumeInfo_Mask_TotalSpace 0x00000002L
+#define osl_VolumeInfo_Mask_UsedSpace 0x00000004L
+#define osl_VolumeInfo_Mask_FreeSpace 0x00000008L
+#define osl_VolumeInfo_Mask_MaxNameLength 0x00000010L
+#define osl_VolumeInfo_Mask_MaxPathLength 0x00000020L
+#define osl_VolumeInfo_Mask_FileSystemName 0x00000040L
+#define osl_VolumeInfo_Mask_DeviceHandle 0x00000080L
+#define osl_VolumeInfo_Mask_FileSystemCaseHandling 0x00000100L
+
+typedef
+
+/** Structure containing information about volumes
+
+ @see osl_getVolumeInformation()
+ @see oslFileType
+*/
+
+struct _oslVolumeInfo {
+/** Must be initialized with the size in bytes of the structure before passing it to any function */
+ sal_uInt32 uStructSize;
+/** Determines which members of the structure contain valid data */
+ sal_uInt32 uValidFields;
+/** Attributes of the volume (remote and/or removable) */
+ sal_uInt32 uAttributes;
+/** Total availiable space on the volume for the current process/user */
+ sal_uInt64 uTotalSpace;
+/** Used space on the volume for the current process/user */
+ sal_uInt64 uUsedSpace;
+/** Free space on the volume for the current process/user */
+ sal_uInt64 uFreeSpace;
+/** Maximum length of file name of a single item */
+ sal_uInt32 uMaxNameLength;
+/** Maximum length of a full quallified path in system notation */
+ sal_uInt32 uMaxPathLength;
+/** Points to a string that receives the name of the file system type. String should be set to zero before calling <code>osl_getVolumeInformation</code>
+ and released after usage. */
+ rtl_uString *ustrFileSystemName;
+/** Pointer to handle the receives underlying device. Handle should be set to zero before calling <code>osl_getVolumeInformation</code>*/
+ oslVolumeDeviceHandle *pDeviceHandle;
+} oslVolumeInfo;
+
+
+/** Retrieve information about a volume.
+
+ Retrieves information about a volume. A volume can either be a mount point, a network
+ resource or a drive depending on Operating System and File System. Before calling this
+ function osl_getFileStatus() should be called to determine if the type is
+ osl_file_Type_Volume.
+
+ @param pustrDirectoryURL [in]
+ Full qualified URL of the volume
+
+ @param pInfo [out]
+ On success it receives information about the volume.
+
+ @param uFieldMask [in]
+ Specifies which members of the structure should be filled
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOTDIR not a directory<br>
+ osl_File_E_NAMETOOLONG file name too long<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ ols_File_E_FAULT Bad address<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_NOSYS function not implemented<br>
+ osl_File_E_MULTIHOP multihop attempted<br>
+ osl_File_E_NOLINK link has been severed<br>
+ osl_File_E_INTR function call was interrupted<br>
+
+ @see osl_getFileStatus()
+ @see oslVolumeInfo
+*/
+
+oslFileError SAL_CALL osl_getVolumeInformation(
+ rtl_uString *pustrDirectoryURL,
+ oslVolumeInfo *pInfo,
+ sal_uInt32 uFieldMask );
+
+typedef void *oslFileHandle;
+
+/* Open flags */
+
+#define osl_File_OpenFlag_Read 0x00000001L
+#define osl_File_OpenFlag_Write 0x00000002L
+#define osl_File_OpenFlag_Create 0x00000004L
+#define osl_File_OpenFlag_NoLock 0x00000008L
+
+/** Open a regular file.
+
+ Open a file. Only regular files can be openend.
+
+ @param pustrFileURL [in]
+ The full qualified URL of the file to open.
+
+ @param pHandle [out]
+ On success it receives a handle to the open file.
+
+ @param uFlags [in]
+ Specifies the open mode.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NAMETOOLONG pathname was too long<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_AGAIN a write lock could not be established<br>
+ osl_File_E_NOTDIR not a directory<br>
+ osl_File_E_NXIO no such device or address<br>
+ osl_File_E_NODEV no such device<br>
+ osl_File_E_ROFS read-only file system<br>
+ osl_File_E_TXTBSY text file busy<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ osl_File_E_NOSPC no space left on device<br>
+ osl_File_E_ISDIR is a directory<br>
+ osl_File_E_MFILE too many open files used by the process<br>
+ osl_File_E_NFILE too many open files in the system<br>
+ osl_File_E_DQUOT quota exceeded<br>
+ osl_File_E_EXIST file exists<br>
+ osl_FilE_E_INTR function call was interrupted<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_MULTIHOP multihop attempted<br>
+ osl_File_E_NOLINK link has been severed<br>
+ osl_File_E_EOVERFLOW value too large for defined data type<br>
+
+ @see osl_closeFile()
+ @see osl_setFilePos()
+ @see osl_getFilePos()
+ @see osl_readFile()
+ @see osl_writeFile()
+ @see osl_setFileSize()
+ @see osl_getFileSize()
+*/
+
+oslFileError SAL_CALL osl_openFile( rtl_uString *pustrFileURL, oslFileHandle *pHandle, sal_uInt32 uFlags );
+
+#define osl_Pos_Absolut 1
+#define osl_Pos_Current 2
+#define osl_Pos_End 3
+
+/** Set the internal position pointer of an open file.
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @param uHow [in]
+ Distance to move the internal position pointer (from uPos).
+
+ @param uPos [in]
+ Absolute position from the beginning of the file.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files<br>
+
+ @see osl_openFile()
+ @see osl_getFilePos()
+*/
+
+oslFileError SAL_CALL osl_setFilePos( oslFileHandle Handle, sal_uInt32 uHow, sal_Int64 uPos );
+
+
+/** Retrieve the current position of the internal pointer of an open file.
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @param pPos [out]
+ On success receives the current position of the file pointer.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files<br>
+
+ @see osl_openFile()
+ @see osl_setFilePos()
+ @see osl_readFile()
+ @see osl_writeFile()
+*/
+
+oslFileError SAL_CALL osl_getFilePos( oslFileHandle Handle, sal_uInt64 *pPos );
+
+
+/** Set the file size of an open file.
+
+ Sets the file size of an open file. The file can be truncated or enlarged by the function.
+ The position of the file pointer is not affeced by this function.
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @param uSize [in]
+ New size in bytes.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files<br>
+
+ @see osl_openFile()
+ @see osl_setFilePos()
+ @see osl_getFileStatus()
+ @see osl_getFileSize()
+*/
+
+oslFileError SAL_CALL osl_setFileSize( oslFileHandle Handle, sal_uInt64 uSize );
+
+
+/** Get the file size of an open file.
+
+ Gets the file size of an open file.
+ The position of the file pointer is not affeced by this function.
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @param pSize [out]
+ Current size in bytes.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files<br>
+
+ @see osl_openFile()
+ @see osl_setFilePos()
+ @see osl_getFileStatus()
+*/
+
+oslFileError SAL_CALL osl_getFileSize( oslFileHandle Handle, sal_uInt64 *pSize );
+
+
+/** Map flags.
+
+ @since UDK 3.2.10
+ */
+#define osl_File_MapFlag_RandomAccess ((sal_uInt32)(0x1))
+
+/** Map flag denoting that the mapped address space will be accessed by the
+ process soon (and it is advantageous for the operating system to already
+ start paging in the data).
+
+ @since UDK 3.2.12
+ */
+#define osl_File_MapFlag_WillNeed ((sal_uInt32)(0x2))
+
+/** Map a shared file into memory.
+
+ @since UDK 3.2.10
+ */
+oslFileError
+SAL_CALL osl_mapFile (
+ oslFileHandle Handle,
+ void** ppAddr,
+ sal_uInt64 uLength,
+ sal_uInt64 uOffset,
+ sal_uInt32 uFlags
+);
+
+
+/** Unmap a shared file from memory.
+
+ @since UDK 3.2.10
+ */
+oslFileError
+SAL_CALL osl_unmapFile (
+ void* pAddr,
+ sal_uInt64 uLength
+);
+
+
+/** Read a number of bytes from a file.
+
+ Reads a number of bytes from a file. The internal file pointer is
+ increased by the number of bytes read.
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @param pBuffer [out]
+ Points to a buffer which receives data. The buffer must be large enough
+ to hold uBytesRequested bytes.
+
+ @param uBytesRequested [in]
+ Number of bytes which should be retrieved.
+
+ @param pBytesRead [out]
+ On success the number of bytes which have actually been retrieved.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_INTR function call was interrupted<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_ISDIR is a directory<br>
+ osl_File_E_BADF bad file<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_AGAIN operation would block<br>
+ osl_File_E_NOLINK link has been severed<br>
+
+ @see osl_openFile()
+ @see osl_writeFile()
+ @see osl_readLine()
+ @see osl_setFilePos()
+*/
+
+oslFileError SAL_CALL osl_readFile( oslFileHandle Handle, void *pBuffer, sal_uInt64 uBytesRequested, sal_uInt64 *pBytesRead );
+
+
+/** Test if the end of a file is reached.
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @param pIsEOF [out]
+ Points to a variable that receives the end-of-file status.
+
+ @return
+ osl_File_E_None on success <br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_INTR function call was interrupted<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_ISDIR is a directory<br>
+ osl_File_E_BADF bad file<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_AGAIN operation would block<br>
+ osl_File_E_NOLINK link has been severed<p>
+
+ @see osl_openFile()
+ @see osl_readFile()
+ @see osl_readLine()
+ @see osl_setFilePos()
+*/
+
+oslFileError SAL_CALL osl_isEndOfFile( oslFileHandle Handle, sal_Bool *pIsEOF );
+
+
+/** Write a number of bytes to a file.
+
+ Writes a number of bytes to a file.
+ The internal file pointer is increased by the number of bytes read.
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @param pBuffer [in]
+ Points to a buffer which contains the data.
+
+ @param uBytesToWrite [in]
+ Number of bytes which should be written.
+
+ @param pBytesWritten [out]
+ On success the number of bytes which have actually been written.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_FBIG file too large<br>
+ osl_File_E_DQUOT quota exceeded<p>
+ osl_File_E_AGAIN operation would block<br>
+ osl_File_E_BADF bad file<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_INTR function call was interrupted<br>
+ osl_File_E_IO on I/O errosr<br>
+ osl_File_E_NOLCK no record locks available<br>
+ osl_File_E_NOLINK link has been severed<br>
+ osl_File_E_NOSPC no space left on device<br>
+ osl_File_E_NXIO no such device or address<br>
+
+ @see osl_openFile()
+ @see osl_readFile()
+ @see osl_setFilePos()
+*/
+
+oslFileError SAL_CALL osl_writeFile( oslFileHandle Handle, const void *pBuffer, sal_uInt64 uBytesToWrite, sal_uInt64 *pBytesWritten );
+
+/** Read a number of bytes from a specified offset in a file.
+
+ The current position of the internal file pointer may or may not be changed.
+
+ @since UDK 3.2.10
+ */
+oslFileError SAL_CALL osl_readFileAt(
+ oslFileHandle Handle,
+ sal_uInt64 uOffset,
+ void* pBuffer,
+ sal_uInt64 uBytesRequested,
+ sal_uInt64* pBytesRead
+);
+
+
+/** Write a number of bytes to a specified offset in a file.
+
+ The current position of the internal file pointer may or may not be changed.
+
+ @since UDK 3.2.10
+ */
+oslFileError SAL_CALL osl_writeFileAt(
+ oslFileHandle Handle,
+ sal_uInt64 uOffset,
+ const void* pBuffer,
+ sal_uInt64 uBytesToWrite,
+ sal_uInt64* pBytesWritten
+);
+
+
+/** Read a line from a file.
+
+ Reads a line from a file. The new line delimiter is NOT returned!
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @param ppSequence [in/out]
+ A pointer pointer to a sal_Sequence that will hold the line read on success.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_INTR function call was interrupted<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_ISDIR is a directory<br>
+ osl_File_E_BADF bad file<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_AGAIN operation would block<br>
+ osl_File_E_NOLINK link has been severed<p>
+
+ @see osl_openFile()
+ @see osl_readFile()
+ @see osl_writeFile()
+ @see osl_setFilePos()
+*/
+
+oslFileError SAL_CALL osl_readLine( oslFileHandle Handle, sal_Sequence** ppSequence );
+
+/** Synchronize the memory representation of a file with that on the physical medium.
+
+ The function ensures that all modified data and attributes of the file associated with
+ the given file handle have been written to the physical medium.
+ In case the hard disk has a write cache enabled, the data may not really be on
+ permanent storage when osl_syncFile returns.
+
+ @param Handle
+ [in] Handle to a file received by a previous call to osl_openFile().
+
+ @return
+ <dl>
+ <dt>osl_File_E_None</dt>
+ <dd>On success</dd>
+ <dt>osl_File_E_INVAL</dt>
+ <dd>The value of the input parameter is invalid</dd>
+ </dl>
+ <br><p><strong>In addition to these error codes others may occur as well, for instance:</strong></p><br>
+ <dl>
+ <dt>osl_File_E_BADF</dt>
+ <dd>The file associated with the given file handle is not open for writing</dd>
+ <dt>osl_File_E_IO</dt>
+ <dd>An I/O error occurred</dd>
+ <dt>osl_File_E_NOSPC</dt>
+ <dd>There is no enough space on the target device</dd>
+ <dt>osl_File_E_ROFS</dt>
+ <dd>The file associated with the given file handle is located on a read only file system</dd>
+ <dt>osl_File_E_TIMEDOUT</dt>
+ <dd>A remote connection timed out. This may happen when a file is on a remote location</dd>
+ </dl>
+
+ @see osl_openFile()
+ @see osl_writeFile()
+*/
+oslFileError SAL_CALL osl_syncFile(oslFileHandle Handle);
+
+/** Close an open file.
+
+ @param Handle [in]
+ Handle to a file received by a previous call to osl_openFile().
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_BADF Bad file<br>
+ osl_File_E_INTR function call was interrupted<br>
+ osl_File_E_NOLINK link has been severed<br>
+ osl_File_E_NOSPC no space left on device<br>
+ osl_File_E_IO on I/O errors<br>
+
+ @see osl_openFile()
+*/
+
+oslFileError SAL_CALL osl_closeFile( oslFileHandle Handle );
+
+
+/** Create a directory.
+
+ @param pustrDirectoryURL [in]
+ Full qualified URL of the directory to create.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_EXIST file exists<br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_NAMETOOLONG file name too long<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_NOTDIR not a directory<br>
+ osl_File_E_ROFS read-only file system<br>
+ osl_File_E_NOSPC no space left on device<br>
+ osl_File_E_DQUOT quota exceeded<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ osl_File_E_FAULT bad address<br>
+ osl_FileE_IO on I/O errors<br>
+ osl_File_E_MLINK too many links<br>
+ osl_File_E_MULTIHOP multihop attempted<br>
+ osl_File_E_NOLINK link has been severed<br>
+
+ @see osl_removeDirectory()
+*/
+
+oslFileError SAL_CALL osl_createDirectory( rtl_uString* pustrDirectoryURL );
+
+
+/** Remove an empty directory.
+
+ @param pustrDirectoryURL [in]
+ Full qualified URL of the directory.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_PERM operation not permitted<br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_NOTDIR not a directory<br>
+ osl_File_E_NOTEMPTY directory not empty<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_NAMETOOLONG file name too long<br>
+ osl_File_E_BUSY device or resource busy<br>
+ osl_File_E_ROFS read-only file system<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ osl_File_E_BUSY device or resource busy<br>
+ osl_File_E_EXIST file exists<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_MULTIHOP multihop attempted<br>
+ osl_File_E_NOLINK link has been severed<br>
+
+ @see osl_createDirectory()
+*/
+
+oslFileError SAL_CALL osl_removeDirectory( rtl_uString* pustrDirectoryURL );
+
+/** Function pointer representing a function that will be called by osl_createDirectoryPath
+ if a directory has been created.
+
+ To avoid unpredictable results the callee must not access the directory whose
+ creation is just notified.
+
+ @param pData
+ [in] User specified data given in osl_createDirectoryPath.
+
+ @param aDirectoryUrl
+ [in] The absolute file URL of the directory that was just created by
+ osl_createDirectoryPath.
+
+ @see osl_createDirectoryPath
+*/
+typedef void (SAL_CALL *oslDirectoryCreationCallbackFunc)(void* pData, rtl_uString* aDirectoryUrl);
+
+/** Create a directory path.
+
+ The osl_createDirectoryPath function creates a specified directory path.
+ All nonexisting sub directories will be created.
+ <p><strong>PLEASE NOTE:</strong> You cannot rely on getting the error code
+ osl_File_E_EXIST for existing directories. Programming against this error
+ code is in general a strong indication of a wrong usage of osl_createDirectoryPath.</p>
+
+ @param aDirectoryUrl
+ [in] The absolute file URL of the directory path to create.
+ A relative file URL will not be accepted.
+
+ @param aDirectoryCreationFunc
+ [in] Pointer to a function that will be called synchronously
+ for each sub directory that was created. The value of this
+ parameter may be NULL, in this case notifications will not be
+ sent.
+
+ @param pData
+ [in] User specified data to be passed to the directory creation
+ callback function. The value of this parameter may be arbitrary
+ and will not be interpreted by osl_createDirectoryPath.
+
+ @return
+ <dl>
+ <dt>osl_File_E_None</dt>
+ <dd>On success</dd>
+ <dt>osl_File_E_INVAL</dt>
+ <dd>The format of the parameters was not valid</dd>
+ <dt>osl_File_E_ACCES</dt>
+ <dd>Permission denied</dd>
+ <dt>osl_File_E_EXIST</dt>
+ <dd>The final node of the specified directory path already exist</dd>
+ <dt>osl_File_E_NAMETOOLONG</dt>
+ <dd>The name of the specified directory path exceeds the maximum allowed length</dd>
+ <dt>osl_File_E_NOTDIR</dt>
+ <dd>A component of the specified directory path already exist as file in any part of the directory path</dd>
+ <dt>osl_File_E_ROFS</dt>
+ <dd>Read-only file system</dd>
+ <dt>osl_File_E_NOSPC</dt>
+ <dd>No space left on device</dd>
+ <dt>osl_File_E_DQUOT</dt>
+ <dd>Quota exceeded</dd>
+ <dt>osl_File_E_FAULT</dt>
+ <dd>Bad address</dd>
+ <dt>osl_File_E_IO</dt>
+ <dd>I/O error</dd>
+ <dt>osl_File_E_LOOP</dt>
+ <dd>Too many symbolic links encountered</dd>
+ <dt>osl_File_E_NOLINK</dt>
+ <dd>Link has been severed</dd>
+ <dt>osl_File_E_invalidError</dt>
+ <dd>An unknown error occurred</dd>
+ </dl>
+
+ @see oslDirectoryCreationFunc
+ @see oslFileError
+ @see osl_createDirectory
+*/
+oslFileError SAL_CALL osl_createDirectoryPath(
+ rtl_uString* aDirectoryUrl,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData);
+
+/** Remove a regular file.
+
+ @param pustrFileURL [in]
+ Full qualified URL of the file to remove.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_PERM operation not permitted<br>
+ osl_File_E_NAMETOOLONG file name too long<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_ISDIR is a directory<br>
+ osl_File_E_ROFS read-only file system<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ osl_File_E_IO on I/O errors<br>
+ osl_File_E_BUSY device or resource busy<br>
+ osl_File_E_INTR function call was interrupted<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ osl_File_E_MULTIHOP multihop attempted<br>
+ osl_File_E_NOLINK link has been severed<br>
+ osl_File_E_TXTBSY text file busy<br>
+
+ @see osl_openFile()
+*/
+
+oslFileError SAL_CALL osl_removeFile( rtl_uString* pustrFileURL );
+
+
+/** Copy a file to a new destination.
+
+ Copies a file to a new destination. Copies only files not directories.
+ No assumptions should be made about preserving attributes or file time.
+
+ @param pustrSourceFileURL [in]
+ Full qualified URL of the source file.
+
+ @param pustrDestFileURL [in]
+ Full qualified URL of the destination file. A directory is NOT a valid destination file!
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_PERM operation not permitted<br>
+ osl_File_E_NAMETOOLONG file name too long<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_ISDIR is a directory<br>
+ osl_File_E_ROFS read-only file system<p>
+
+ @see osl_moveFile()
+ @see osl_removeFile()
+*/
+
+oslFileError SAL_CALL osl_copyFile( rtl_uString* pustrSourceFileURL, rtl_uString *pustrDestFileURL );
+
+
+/** Move a file or directory to a new destination or renames it.
+
+ Moves a file or directory to a new destination or renames it.
+ File time and attributes are preserved.
+
+ @param pustrSourceFileURL [in]
+ Full qualified URL of the source file.
+
+ @param pustrDestFileURL [in]
+ Full qualified URL of the destination file. An existing directory is NOT a valid destination !
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_PERM operation not permitted<br>
+ osl_File_E_NAMETOOLONG file name too long<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_ROFS read-only file system<br>
+
+ @see osl_copyFile()
+*/
+
+oslFileError SAL_CALL osl_moveFile( rtl_uString* pustrSourceFileURL, rtl_uString *pustrDestFileURL );
+
+
+/** Determine a valid unused canonical name for a requested name.
+
+ Determines a valid unused canonical name for a requested name.
+ Depending on the Operating System and the File System the illegal characters are replaced by valid ones.
+ If a file or directory with the requested name already exists a new name is generated following
+ the common rules on the actual Operating System and File System.
+
+ @param pustrRequestedURL [in]
+ Requested name of a file or directory.
+
+ @param ppustrValidURL [out]
+ On success receives a name which is unused and valid on the actual Operating System and
+ File System.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+
+ @see osl_getFileStatus()
+*/
+
+oslFileError SAL_CALL osl_getCanonicalName( rtl_uString *pustrRequestedURL, rtl_uString **ppustrValidURL);
+
+
+/** Convert a path relative to a given directory into an full qualified file URL.
+
+ Convert a path relative to a given directory into an full qualified file URL.
+ The function resolves symbolic links if possible and path ellipses, so on success
+ the resulting absolute path is fully resolved.
+
+ @param pustrBaseDirectoryURL [in]
+ Base directory URL to which the relative path is related to.
+
+ @param pustrRelativeFileURL [in]
+ An URL of a file or directory relative to the directory path specified by pustrBaseDirectoryURL
+ or an absolute path.
+ If pustrRelativeFileURL denotes an absolute path pustrBaseDirectoryURL will be ignored.
+
+ @param ppustrAbsoluteFileURL [out]
+ On success it receives the full qualified absoulte file URL.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOMEM not enough memory for allocating structures <br>
+ osl_File_E_NOTDIR not a directory<br>
+ osl_File_E_ACCES permission denied<br>
+ osl_File_E_NOENT no such file or directory<br>
+ osl_File_E_NAMETOOLONG file name too long<br>
+ osl_File_E_OVERFLOW value too large for defined data type<br>
+ osl_File_E_FAULT bad address<br>
+ osl_File_E_INTR function call was interrupted<br>
+ osl_File_E_LOOP too many symbolic links encountered<br>
+ osl_File_E_MULTIHOP multihop attempted<br>
+ osl_File_E_NOLINK link has been severed<br>
+
+ @see osl_getFileStatus()
+*/
+
+oslFileError SAL_CALL osl_getAbsoluteFileURL(
+ rtl_uString* pustrBaseDirectoryURL,
+ rtl_uString *pustrRelativeFileURL,
+ rtl_uString **ppustrAbsoluteFileURL );
+
+
+/** Convert a system dependend path into a file URL.
+
+ @param pustrSystemPath [in]
+ A System dependent path of a file or directory.
+
+ @param ppustrFileURL [out]
+ On success it receives the file URL.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+
+ @see osl_getSystemPathFromFileURL()
+*/
+
+oslFileError SAL_CALL osl_getFileURLFromSystemPath( rtl_uString *pustrSystemPath, rtl_uString **ppustrFileURL);
+
+
+/** Searche a full qualified system path or a file URL.
+
+ @param pustrFileName [in]
+ A system dependent path, a file URL, a file or relative directory.
+
+ @param pustrSearchPath [in]
+ A list of system paths, in which a given file has to be searched. The Notation of a path list is
+ system dependend, e.g. on UNIX system "/usr/bin:/bin" and on Windows "C:\BIN;C:\BATCH".
+ These paths are only for the search of a file or a relative path, otherwise it will be ignored.
+ If pustrSearchPath is NULL or while using the search path the search failed, the function searches for
+ a matching file in all system directories and in the directories listed in the PATH environment
+ variable.
+ The value of an environment variable should be used (e.g. LD_LIBRARY_PATH) if the caller is not
+ aware of the Operating System and so doesn't know which path list delimiter to use.
+
+ @param ppustrFileURL [out]
+ On success it receives the full qualified file URL.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOTDIR not a directory<br>
+ osl_File_E_NOENT no such file or directory not found<br>
+
+ @see osl_getFileURLFromSystemPath()
+ @see osl_getSystemPathFromFileURL()
+*/
+
+oslFileError SAL_CALL osl_searchFileURL( rtl_uString *pustrFileName, rtl_uString *pustrSearchPath, rtl_uString **ppustrFileURL );
+
+
+/** Convert a file URL into a system dependend path.
+
+ @param pustrFileURL [in]
+ A File URL.
+
+ @param ppustrSystemPath [out]
+ On success it receives the system path.
+
+ @return
+ osl_File_E_None on success
+ osl_File_E_INVAL the format of the parameters was not valid
+
+ @see osl_getFileURLFromSystemPath()
+*/
+
+oslFileError SAL_CALL osl_getSystemPathFromFileURL( rtl_uString *pustrFileURL, rtl_uString **ppustrSystemPath);
+
+
+/** Function pointer representing the function called back from osl_abbreviateSystemPath
+
+ @param ustrText [in]
+ Text to calculate the width for
+
+ @return
+ The width of the text specified by ustrText, e.g. it can return the width in pixel
+ or the width in character count.
+
+ @see osl_abbreviateSystemPath()
+*/
+
+typedef sal_uInt32 (SAL_CALL *oslCalcTextWidthFunc)( rtl_uString *ustrText );
+
+
+/** Abbreviate a system notation path.
+
+ @param ustrSystemPath [in]
+ The full system path to abbreviate
+
+ @param pustrCompacted [out]
+ Receives the compacted system path on output
+
+ @param pfnCalcWidth [in]
+ Function ptr that calculates the width of a string. Can be zero.
+
+ @param uMaxWidth [in]
+ Maximum width allowed that is retunrned from pfnCalcWidth.
+ If pfnCalcWidth is zero the character count is assumed as width.
+
+ @return
+ osl_File_E_None on success<br>
+
+ @see oslCalcTextWidthFunc
+*/
+
+oslFileError SAL_CALL osl_abbreviateSystemPath(
+ rtl_uString *ustrSystemPath,
+ rtl_uString **pustrCompacted,
+ sal_uInt32 uMaxWidth,
+ oslCalcTextWidthFunc pCalcWidth );
+
+
+/** Set file attributes.
+
+ @param pustrFileURL [in]
+ The full qualified file URL.
+
+ @param uAttributes [in]
+ Attributes of the file to be set.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+
+ @see osl_getFileStatus()
+*/
+
+oslFileError SAL_CALL osl_setFileAttributes( rtl_uString *pustrFileURL, sal_uInt64 uAttributes );
+
+
+/** Set the file time.
+
+ @param pustrFileURL [in]
+ The full qualified URL of the file.
+
+ @param aCreationTime [in]
+ Creation time of the given file.
+
+ @param aLastAccessTime [in]
+ Time of the last access of the given file.
+
+ @param aLastWriteTime [in]
+ Time of the last modifying of the given file.
+
+ @return
+ osl_File_E_None on success<br>
+ osl_File_E_INVAL the format of the parameters was not valid<br>
+ osl_File_E_NOENT no such file or directory not found<br>
+
+ @see osl_getFileStatus()
+*/
+
+oslFileError SAL_CALL osl_setFileTime(
+ rtl_uString *pustrFileURL,
+ const TimeValue *aCreationTime,
+ const TimeValue *aLastAccessTime,
+ const TimeValue *aLastWriteTime);
+
+
+/** Retrieves the file URL of the system's temporary directory path
+
+ @param pustrTempDirURL[out]
+ On success receives the URL of system's temporary directory path.
+
+ @return
+ osl_File_E_None on success
+ osl_File_E_NOENT no such file or directory not found
+*/
+
+oslFileError SAL_CALL osl_getTempDirURL( rtl_uString **pustrTempDirURL );
+
+
+/** Creates a temporary file in the directory provided by the caller or the
+ directory returned by osl_getTempDirURL.
+
+ Creates a temporary file in the directory provided by the caller or the
+ directory returned by osl_getTempDirURL.
+ Under UNIX Operating Systems the file will be created with read and write
+ access for the user exclusively.
+ If the caller requests only a handle to the open file but not the name of
+ it, the file will be automatically removed on close else the caller is
+ responsible for removing the file on success.
+
+ @param pustrDirectoryURL [in]
+ Specifies the full qualified URL where the temporary file should be created.
+ If pustrDirectoryURL is 0 the path returned by osl_getTempDirURL will be used.
+
+ @param pHandle [out]
+ On success receives a handle to the open file. If pHandle is 0 the file will
+ be closed on return, in this case ppustrTempFileURL must not be 0.
+
+ @param ppustrTempFileURL [out]
+ On success receives the full qualified URL of the temporary file.
+ If ppustrTempFileURL is 0 the file will be automatically removed on close,
+ in this case pHandle must not be 0.
+ If ppustrTempFileURL is not 0 the caller receives the name of the created
+ file and is responsible for removing the file, in this case
+ *ppustrTempFileURL must be 0 or must point to a valid rtl_uString.
+
+ @descr
+ Description of the different pHandle, ppustrTempFileURL parameter combinations.
+ pHandle is 0 and ppustrTempDirURL is 0 - this combination is invalid
+ pHandle is not 0 and ppustrTempDirURL is 0 - a handle to the open file
+ will be returned on success and the file will be automatically removed on close.
+ pHandle is 0 and ppustrTempDirURL is not 0 - the name of the file will be returned,
+ the caller is responsible for opening, closing and removing the file.
+ pHandle is not 0 and ppustrTempDirURL is not 0 - a handle to the open file as well as
+ the file name will be returned, the caller is responsible for closing and removing
+ the file.
+
+ @return
+ osl_File_E_None on success
+ osl_File_E_INVAL the format of the parameter is invalid
+ osl_File_E_NOMEM not enough memory for allocating structures
+ osl_File_E_ACCES Permission denied
+ osl_File_E_NOENT No such file or directory
+ osl_File_E_NOTDIR Not a directory
+ osl_File_E_ROFS Read-only file system
+ osl_File_E_NOSPC No space left on device
+ osl_File_E_DQUOT Quota exceeded
+
+ @see osl_getTempDirURL()
+*/
+
+oslFileError SAL_CALL osl_createTempFile(
+ rtl_uString* pustrDirectoryURL,
+ oslFileHandle* pHandle,
+ rtl_uString** ppustrTempFileURL);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_FILE_H_ */
+
+
diff --git a/sal/inc/osl/file.hxx b/sal/inc/osl/file.hxx
new file mode 100644
index 000000000000..02b134540d20
--- /dev/null
+++ b/sal/inc/osl/file.hxx
@@ -0,0 +1,1953 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/** @HTML */
+
+#ifndef _OSL_FILE_HXX_
+#define _OSL_FILE_HXX_
+
+#ifdef __cplusplus
+
+#include <osl/time.h>
+# include <rtl/memory.h>
+# include <rtl/ustring.hxx>
+
+#include <osl/file.h>
+# include <rtl/byteseq.hxx>
+
+#include <stdio.h>
+
+namespace osl
+{
+
+
+// -----------------------------------------------------------------------------
+/** Base class for all File System specific objects.
+
+ @see Directory
+ @see DirectoryItem
+ @see File
+ */
+
+class FileBase
+{
+public:
+
+ enum RC {
+ E_None = osl_File_E_None,
+ E_PERM = osl_File_E_PERM,
+ E_NOENT = osl_File_E_NOENT,
+ E_SRCH = osl_File_E_SRCH,
+ E_INTR = osl_File_E_INTR,
+ E_IO = osl_File_E_IO,
+ E_NXIO = osl_File_E_NXIO,
+ E_2BIG = osl_File_E_2BIG,
+ E_NOEXEC = osl_File_E_NOEXEC,
+ E_BADF = osl_File_E_BADF,
+ E_CHILD = osl_File_E_CHILD,
+ E_AGAIN = osl_File_E_AGAIN,
+ E_NOMEM = osl_File_E_NOMEM,
+ E_ACCES = osl_File_E_ACCES,
+ E_FAULT = osl_File_E_FAULT,
+ E_BUSY = osl_File_E_BUSY,
+ E_EXIST = osl_File_E_EXIST,
+ E_XDEV = osl_File_E_XDEV,
+ E_NODEV = osl_File_E_NODEV,
+ E_NOTDIR = osl_File_E_NOTDIR,
+ E_ISDIR = osl_File_E_ISDIR,
+ E_INVAL = osl_File_E_INVAL,
+ E_NFILE = osl_File_E_NFILE,
+ E_MFILE = osl_File_E_MFILE,
+ E_NOTTY = osl_File_E_NOTTY,
+ E_FBIG = osl_File_E_FBIG,
+ E_NOSPC = osl_File_E_NOSPC,
+ E_SPIPE = osl_File_E_SPIPE,
+ E_ROFS = osl_File_E_ROFS,
+ E_MLINK = osl_File_E_MLINK,
+ E_PIPE = osl_File_E_PIPE,
+ E_DOM = osl_File_E_DOM,
+ E_RANGE = osl_File_E_RANGE,
+ E_DEADLK = osl_File_E_DEADLK,
+ E_NAMETOOLONG = osl_File_E_NAMETOOLONG,
+ E_NOLCK = osl_File_E_NOLCK,
+ E_NOSYS = osl_File_E_NOSYS,
+ E_NOTEMPTY = osl_File_E_NOTEMPTY,
+ E_LOOP = osl_File_E_LOOP,
+ E_ILSEQ = osl_File_E_ILSEQ,
+ E_NOLINK = osl_File_E_NOLINK,
+ E_MULTIHOP = osl_File_E_MULTIHOP,
+ E_USERS = osl_File_E_USERS,
+ E_OVERFLOW = osl_File_E_OVERFLOW,
+ E_NOTREADY = osl_File_E_NOTREADY,
+ E_invalidError = osl_File_E_invalidError, /* unmapped error: always last entry in enum! */
+ E_TIMEDOUT = osl_File_E_TIMEDOUT,
+ E_NETWORK = osl_File_E_NETWORK
+ };
+
+
+public:
+
+ /** Determine a valid unused canonical name for a requested name.
+
+ Determines a valid unused canonical name for a requested name.
+ Depending on the Operating System and the File System the illegal characters are replaced by valid ones.
+ If a file or directory with the requested name already exists a new name is generated following
+ the common rules on the actual Operating System and File System.
+
+ @param ustrRequestedURL [in]
+ Requested name of a file or directory.
+
+ @param pustrValidURL [out]
+ On success receives a name which is unused and valid on the actual Operating System and
+ File System.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+
+ @see DirectoryItem::getFileStatus()
+ */
+
+ static inline RC getCanonicalName( const ::rtl::OUString& ustrRequestedURL, ::rtl::OUString& ustrValidURL )
+ {
+ return (RC) osl_getCanonicalName( ustrRequestedURL.pData, &ustrValidURL.pData );
+ }
+
+ /** Convert a path relative to a given directory into an full qualified file URL.
+
+ Convert a path relative to a given directory into an full qualified file URL.
+ The function resolves symbolic links if possible and path ellipses, so on success
+ the resulting absolute path is fully resolved.
+
+ @param ustrBaseDirectoryURL [in]
+ Base directory URL to which the relative path is related to.
+
+ @param ustrRelativeFileURL [in]
+ An URL of a file or directory relative to the directory path specified by ustrBaseDirectoryURL
+ or an absolute path.
+ If ustrRelativeFileURL denotes an absolute path ustrBaseDirectoryURL will be ignored.
+
+ @param ustrAbsoluteFileURL [out]
+ On success it receives the full qualified absoulte file URL.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_NOTDIR not a directory
+ E_ACCES permission denied
+ E_NOENT no such file or directory
+ E_NAMETOOLONG file name too long
+ E_OVERFLOW value too large for defined data type
+ E_FAULT bad address
+ E_INTR function call was interrupted
+ E_LOOP too many symbolic links encountered
+ E_MULTIHOP multihop attempted
+ E_NOLINK link has been severed
+
+ @see DirectoryItem::getFileStatus()
+ */
+
+ static inline RC getAbsoluteFileURL( const ::rtl::OUString& ustrBaseDirectoryURL, const ::rtl::OUString& ustrRelativeFileURL, ::rtl::OUString& ustrAbsoluteFileURL )
+ {
+ return (RC) osl_getAbsoluteFileURL( ustrBaseDirectoryURL.pData, ustrRelativeFileURL.pData, &ustrAbsoluteFileURL.pData );
+ }
+
+ /** Convert a file URL into a system dependend path.
+
+ @param ustrFileURL [in]
+ A File URL.
+
+ @param ustrSystemPath [out]
+ On success it receives the system path.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+
+ @see getFileURLFromSystemPath()
+ */
+
+ static inline RC getSystemPathFromFileURL( const ::rtl::OUString& ustrFileURL, ::rtl::OUString& ustrSystemPath )
+ {
+ return (RC) osl_getSystemPathFromFileURL( ustrFileURL.pData, &ustrSystemPath.pData );
+ }
+
+ /** Convert a system dependend path into a file URL.
+
+ @param ustrSystemPath [in]
+ A System dependent path of a file or directory.
+
+ @param ustrFileURL [out]
+ On success it receives the file URL.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+
+ @see getSystemPathFromFileURL()
+ */
+
+ static inline RC getFileURLFromSystemPath( const ::rtl::OUString& ustrSystemPath, ::rtl::OUString& ustrFileURL )
+ {
+ return (RC) osl_getFileURLFromSystemPath( ustrSystemPath.pData, &ustrFileURL.pData );
+ }
+
+ /** Searche a full qualified system path or a file URL.
+
+ @param ustrFileName [in]
+ A system dependent path, a file URL, a file or relative directory
+
+ @param ustrSearchPath [in]
+ A list of system paths, in which a given file has to be searched. The Notation of a path list is
+ system dependend, e.g. on UNIX system "/usr/bin:/bin" and on Windows "C:\BIN;C:\BATCH".
+ These paths are only for the search of a file or a relative path, otherwise it will be ignored.
+ If ustrSearchPath is NULL or while using the search path the search failed, the function searches for
+ a matching file in all system directories and in the directories listed in the PATH environment
+ variable.
+ The value of an environment variable should be used (e.g. LD_LIBRARY_PATH) if the caller is not
+ aware of the Operating System and so doesn't know which path list delimiter to use.
+
+ @param ustrFileURL [out]
+ On success it receives the full qualified file URL.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOTDIR not a directory
+ E_NOENT no such file or directory not found
+
+ @see getFileURLFromSystemPath()
+ @see getSystemPathFromFileURL()
+ */
+
+ static inline RC searchFileURL( const ::rtl::OUString& ustrFileName, const ::rtl::OUString& ustrSearchPath, ::rtl::OUString& ustrFileURL )
+ {
+ return (RC) osl_searchFileURL( ustrFileName.pData, ustrSearchPath.pData, &ustrFileURL.pData );
+ }
+
+ /** Retrieves the file URL of the system's temporary directory path.
+
+ @param ustrTempDirURL[out]
+ On success receives the URL of system's temporary directory path.
+
+ @return
+ E_None on success
+ E_NOENT no such file or directory not found
+ */
+
+ static inline RC getTempDirURL( ::rtl::OUString& ustrTempDirURL )
+ {
+ return (RC) osl_getTempDirURL( &ustrTempDirURL.pData );
+ }
+
+ /** Creates a temporary file in the directory provided by the caller or the
+ directory returned by getTempDirURL.
+ Under UNIX Operating Systems the file will be created with read and write
+ access for the user exclusively.
+ If the caller requests only a handle to the open file but not the name of
+ it, the file will be automatically removed on close else the caller is
+ responsible for removing the file on success.<br><br>
+
+ @param pustrDirectoryURL [in]
+ Specifies the full qualified URL where the temporary file should be created.
+ If pustrDirectoryURL is 0 the path returned by osl_getTempDirURL will be used.
+
+ @param pHandle [out]
+ On success receives a handle to the open file.
+ If pHandle is 0 the file will be closed on return, in this case
+ pustrTempFileURL must not be 0.
+
+ @param pustrTempFileURL [out]
+ On success receives the full qualified URL of the temporary file.
+ If pustrTempFileURL is 0 the file will be automatically removed
+ on close, in this case pHandle must not be 0.
+ If pustrTempFileURL is not 0 the caller receives the name of the
+ created file and is responsible for removing the file.
+
+ @descr
+ Description of the different pHandle, ppustrTempFileURL parameter combinations.
+ pHandle is 0 and pustrTempDirURL is 0 - this combination is invalid<br>
+ pHandle is not 0 and pustrTempDirURL is 0 - a handle to the open file
+ will be returned on success and the file will be automatically removed on close<br>
+ pHandle is 0 and pustrTempDirURL is not 0 - the name of the file will be
+ returned, the caller is responsible for opening, closing and removing the file.<br>
+ pHandle is not 0 and pustrTempDirURL is not 0 - a handle to the open file as well as
+ the file name will be returned, the caller is responsible for closing and removing
+ the file.<br>
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameter is invalid
+ E_NOMEM not enough memory for allocating structures
+ E_ACCES Permission denied
+ E_NOENT No such file or directory
+ E_NOTDIR Not a directory
+ E_ROFS Read-only file system
+ E_NOSPC No space left on device
+ E_DQUOT Quota exceeded
+
+ @see getTempDirURL()
+ */
+
+ static inline RC createTempFile(
+ ::rtl::OUString* pustrDirectoryURL,
+ oslFileHandle* pHandle,
+ ::rtl::OUString* pustrTempFileURL)
+ {
+ rtl_uString* pustr_dir_url = pustrDirectoryURL ? pustrDirectoryURL->pData : 0;
+ rtl_uString** ppustr_tmp_file_url = pustrTempFileURL ? &pustrTempFileURL->pData : 0;
+
+ return (RC) osl_createTempFile(pustr_dir_url, pHandle, ppustr_tmp_file_url);
+ }
+};
+
+
+// -----------------------------------------------------------------------------
+/** The VolumeDevice class.
+
+ @see VolumeInfo
+*/
+#ifdef OS2
+class VolumeInfo;
+#endif
+
+class VolumeDevice : public FileBase
+{
+#ifdef OS2
+public:
+#endif
+ oslVolumeDeviceHandle _aHandle;
+
+public:
+
+ /** Constructor.
+ */
+
+ VolumeDevice() : _aHandle( NULL )
+ {
+ }
+
+ /** Copy constructor.
+
+ @param rDevice
+ The other volume device.
+ */
+
+ VolumeDevice( const VolumeDevice & rDevice )
+ {
+ _aHandle = rDevice._aHandle;
+ if ( _aHandle )
+ osl_acquireVolumeDeviceHandle( _aHandle );
+ }
+
+ /** Destructor.
+ */
+
+ ~VolumeDevice()
+ {
+ if ( _aHandle )
+ osl_releaseVolumeDeviceHandle( _aHandle );
+ }
+
+ /** Assignment operator.
+
+ @param rDevice
+ The other volume device.
+ */
+
+ inline VolumeDevice & operator =( const VolumeDevice & rDevice )
+ {
+ oslVolumeDeviceHandle newHandle = rDevice._aHandle;
+
+ if ( newHandle )
+ osl_acquireVolumeDeviceHandle( newHandle );
+
+ if ( _aHandle )
+ osl_releaseVolumeDeviceHandle( _aHandle );
+
+ _aHandle = newHandle;
+
+ return *this;
+ }
+
+ /** Automount a volume device.
+
+ @return
+ E_None on success
+
+ @todo
+ specify all error codes that may be returned
+ */
+
+ inline RC automount()
+ {
+ return (RC)osl_automountVolumeDevice( _aHandle );
+ }
+
+ /** Unmount a volume device.
+
+ @return
+ E_None on success
+
+ @todo
+ specify all error codes that may be returned
+ */
+
+ inline RC unmount()
+ {
+ return (RC)osl_unmountVolumeDevice( _aHandle );
+ }
+
+ /** Get the full qualified URL where a device is mounted to.
+
+ @return
+ The full qualified URL where the device is mounted to.
+ */
+ inline rtl::OUString getMountPath()
+ {
+ rtl::OUString aPath;
+ osl_getVolumeDeviceMountPath( _aHandle, &aPath.pData );
+ return aPath;
+ }
+
+ friend class VolumeInfo;
+};
+
+// -----------------------------------------------------------------------------
+
+#define VolumeInfoMask_Attributes osl_VolumeInfo_Mask_Attributes
+#define VolumeInfoMask_TotalSpace osl_VolumeInfo_Mask_TotalSpace
+#define VolumeInfoMask_UsedSpace osl_VolumeInfo_Mask_UsedSpace
+#define VolumeInfoMask_FreeSpace osl_VolumeInfo_Mask_FreeSpace
+#define VolumeInfoMask_MaxNameLength osl_VolumeInfo_Mask_MaxNameLength
+#define VolumeInfoMask_MaxPathLength osl_VolumeInfo_Mask_MaxPathLength
+#define VolumeInfoMask_FileSystemName osl_VolumeInfo_Mask_FileSystemName
+#define VolumeInfoMask_FileSystemCaseHandling osl_VolumeInfo_Mask_FileSystemCaseHandling
+
+class Directory;
+
+/** The VolumeInfo class.
+
+ Neither copy nor assignment is allowed for this class.
+
+ @see Directory::getVolumeInfo
+*/
+
+
+class VolumeInfo
+{
+ oslVolumeInfo _aInfo;
+ sal_uInt32 _nMask;
+ VolumeDevice _aDevice;
+
+ /** Copy constructor.
+ */
+
+ VolumeInfo( VolumeInfo& );
+
+ /** Assginment operator.
+ */
+
+ VolumeInfo& operator = ( VolumeInfo& );
+
+public:
+
+ /** Constructor.
+
+ @param nMask
+ Set of flaggs decribing the demanded information.
+ */
+
+ VolumeInfo( sal_uInt32 nMask ): _nMask( nMask )
+ {
+ _aInfo.uStructSize = sizeof( oslVolumeInfo );
+ rtl_fillMemory( &_aInfo.uValidFields, sizeof( oslVolumeInfo ) - sizeof( sal_uInt32 ), 0 );
+ _aInfo.pDeviceHandle = &_aDevice._aHandle;
+ }
+
+ /** Destructor.
+ */
+
+ ~VolumeInfo()
+ {
+ if( _aInfo.ustrFileSystemName )
+ rtl_uString_release( _aInfo.ustrFileSystemName );
+ }
+
+ /** Check if specified fields are valid.
+
+ @param nMask
+ Set of flags for the fields to check.
+
+ @return sal_True if all fields are valid else sal_False.
+ */
+
+ inline sal_Bool isValid( sal_uInt32 nMask ) const
+ {
+ return ( nMask & _aInfo.uValidFields ) == nMask;
+ }
+
+ /** Check the remote flag.
+
+ @return
+ sal_True if Attributes are valid and the volume is remote else sal_False.
+ */
+
+ inline sal_Bool getRemoteFlag() const
+ {
+ return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_Remote);
+ }
+
+ /** Check the removeable flag.
+
+ @return
+ sal_True if attributes are valid and the volume is removable else sal_False.
+ */
+
+ inline sal_Bool getRemoveableFlag() const
+ {
+ return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_Removeable);
+ }
+
+ /** Check the compact disc flag.
+
+ @return
+ sal_True if attributes are valid and the volume is a CDROM else sal_False.
+ */
+
+ inline sal_Bool getCompactDiscFlag() const
+ {
+ return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_CompactDisc);
+ }
+
+ /** Check the floppy disc flag.
+
+ @return
+ sal_True if attributes are valid and the volume is a floppy disk else sal_False.
+ */
+
+ inline sal_Bool getFloppyDiskFlag() const
+ {
+ return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_FloppyDisk);
+ }
+
+ /** Check the fixed disk flag.
+
+ @return
+ sal_True if attributes are valid and the volume is a fixed disk else sal_False.
+ */
+
+ inline sal_Bool getFixedDiskFlag() const
+ {
+ return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_FixedDisk);
+ }
+
+ /** Check the RAM disk flag.
+
+ @return
+ sal_True if attributes are valid and the volume is a RAM disk else sal_False.
+ */
+
+ inline sal_Bool getRAMDiskFlag() const
+ {
+ return 0 != (_aInfo.uAttributes & osl_Volume_Attribute_RAMDisk);
+ }
+
+ /** Determine the total space of a volume device.
+
+ @return
+ The total diskspace of this volume if this information is valid,
+ 0 otherwise.
+ */
+
+ inline sal_uInt64 getTotalSpace() const
+ {
+ return _aInfo.uTotalSpace;
+ }
+
+ /** Determine the free space of a volume device.
+
+ @return
+ The free diskspace of this volume if this information is valid,
+ 0 otherwise.
+ */
+
+ inline sal_uInt64 getFreeSpace() const
+ {
+ return _aInfo.uFreeSpace;
+ }
+
+ /** Determine the used space of a volume device.
+
+ @return
+ The used diskspace of this volume if this information is valid,
+ 0 otherwise.
+ */
+
+ inline sal_uInt64 getUsedSpace() const
+ {
+ return _aInfo.uUsedSpace;
+ }
+
+ /** Determine the maximal length of a file name.
+
+ @return
+ The maximal length of a file name if this information is valid,
+ 0 otherwise.
+ */
+
+ inline sal_uInt32 getMaxNameLength() const
+ {
+ return _aInfo.uMaxNameLength;
+ }
+
+ /** Determine the maximal length of a path name.
+
+ @return
+ The maximal length of a path if this information is valid,
+ 0 otherwise.
+ */
+
+ inline sal_uInt32 getMaxPathLength() const
+ {
+ return _aInfo.uMaxPathLength;
+ }
+
+ /** Determine the name of the volume device's File System.
+
+ @return
+ The name of the volume's fielsystem if this information is valid,
+ otherwise an empty string.
+ */
+
+ inline ::rtl::OUString getFileSystemName() const
+ {
+ return _aInfo.ustrFileSystemName ? ::rtl::OUString( _aInfo.ustrFileSystemName ) : ::rtl::OUString();
+ }
+
+
+ /** Get the volume device handle.
+
+ @return
+ The device handle of the volume if this information is valid,
+ otherwise returns NULL;
+ */
+
+ inline VolumeDevice getDeviceHandle() const
+ {
+ return _aDevice;
+ }
+
+ /** Return whether the file system is case sensitive or
+ case insensitive
+
+ @return
+ true if the file system is case sensitive false otherwise
+ */
+ bool isCaseSensitiveFileSystem() const
+ {
+ return (_aInfo.uAttributes & osl_Volume_Attribute_Case_Sensitive);
+ }
+
+ /** Return whether the file system preserves the case of
+ file and directory names or not
+
+ @return
+ true if the file system preserves the case of file and
+ directory names false otherwise
+ */
+ bool isCasePreservingFileSystem() const
+ {
+ return (_aInfo.uAttributes & osl_Volume_Attribute_Case_Is_Preserved);
+ }
+
+ friend class Directory;
+};
+
+// -----------------------------------------------------------------------------
+
+#define FileStatusMask_Type osl_FileStatus_Mask_Type
+#define FileStatusMask_Attributes osl_FileStatus_Mask_Attributes
+#define FileStatusMask_CreationTime osl_FileStatus_Mask_CreationTime
+#define FileStatusMask_AccessTime osl_FileStatus_Mask_AccessTime
+#define FileStatusMask_ModifyTime osl_FileStatus_Mask_ModifyTime
+#define FileStatusMask_FileSize osl_FileStatus_Mask_FileSize
+#define FileStatusMask_FileName osl_FileStatus_Mask_FileName
+#define FileStatusMask_FileURL osl_FileStatus_Mask_FileURL
+#define FileStatusMask_LinkTargetURL osl_FileStatus_Mask_LinkTargetURL
+#define FileStatusMask_All osl_FileStatus_Mask_All
+#define FileStatusMask_Validate osl_FileStatus_Mask_Validate
+
+#define Attribute_ReadOnly osl_File_Attribute_ReadOnly
+#define Attribute_Hidden osl_File_Attribute_Hidden
+#define Attribute_Executable osl_File_Attribute_Executable
+#define Attribute_GrpWrite osl_File_Attribute_GrpWrite
+#define Attribute_GrpRead osl_File_Attribute_GrpRead
+#define Attribute_GrpExe osl_File_Attribute_GrpExe
+#define Attribute_OwnWrite osl_File_Attribute_OwnWrite
+#define Attribute_OwnRead osl_File_Attribute_OwnRead
+#define Attribute_OwnExe osl_File_Attribute_OwnExe
+#define Attribute_OthWrite osl_File_Attribute_OthWrite
+#define Attribute_OthRead osl_File_Attribute_OthRead
+#define Attribute_OthExe osl_File_Attribute_OthExe
+
+class DirectoryItem;
+
+/** The FileStatus class.
+
+ @see DirectoryItem::getFileStatus
+*/
+
+class FileStatus
+{
+ oslFileStatus _aStatus;
+ sal_uInt32 _nMask;
+
+ /** Copy constructor.
+ */
+
+ FileStatus( FileStatus& );
+
+ /** Assignment operator.
+ */
+
+ FileStatus& operator = ( FileStatus& );
+
+public:
+
+ enum Type {
+ Directory = osl_File_Type_Directory,
+ Volume = osl_File_Type_Volume,
+ Regular = osl_File_Type_Regular,
+ Fifo = osl_File_Type_Fifo,
+ Socket = osl_File_Type_Socket,
+ Link = osl_File_Type_Link,
+ Special = osl_File_Type_Special,
+ Unknown = osl_File_Type_Unknown
+ };
+
+ /** Constructor.
+
+ @param nMask
+ Set of flaggs decribing the demanded information.
+ */
+
+ FileStatus( sal_uInt32 nMask ): _nMask( nMask )
+ {
+ _aStatus.uStructSize = sizeof( oslFileStatus );
+ rtl_fillMemory( &_aStatus.uValidFields, sizeof( oslFileStatus ) - sizeof( sal_uInt32 ), 0 );
+ }
+
+ /** Destructor.
+ */
+
+ ~FileStatus()
+ {
+ if ( _aStatus.ustrFileURL )
+ rtl_uString_release( _aStatus.ustrFileURL );
+ if ( _aStatus.ustrLinkTargetURL )
+ rtl_uString_release( _aStatus.ustrLinkTargetURL );
+ if ( _aStatus.ustrFileName )
+ rtl_uString_release( _aStatus.ustrFileName );
+ }
+
+ /** Check if specified fields are valid.
+
+ @param nMask
+ Set of flags for the fields to check.
+
+ @return
+ sal_True if all fields are valid else sal_False.
+ */
+
+ inline sal_Bool isValid( sal_uInt32 nMask ) const
+ {
+ return ( nMask & _aStatus.uValidFields ) == nMask;
+ }
+
+ /** Get the file type.
+
+ @return
+ The file type if this information is valid, Unknown otherwise.
+ */
+ inline Type getFileType() const
+ {
+ return (_aStatus.uValidFields & FileStatusMask_Type) ? (Type) _aStatus.eType : Unknown;
+ }
+
+ /** Get the file attributes.
+
+ @return
+ The set of attribute flags of this file.
+ */
+
+ inline sal_uInt64 getAttributes() const
+ {
+ return _aStatus.uAttributes;
+ }
+
+ /** Get the creation time of this file.
+
+ @return
+ The creation time if this information is valid,
+ an uninitialized TimeValue otherwise.
+ */
+
+ inline TimeValue getCreationTime() const
+ {
+ return _aStatus.aCreationTime;
+ }
+
+ /** Get the file access time.
+
+ @return
+ The last access time if this information is valid,
+ an uninitialized TimeValue otherwise.
+ */
+
+ inline TimeValue getAccessTime() const
+ {
+ return _aStatus.aAccessTime;
+ }
+
+ /** Get the file modification time.
+
+ @return
+ The last modified time if this information is valid,
+ an uninitialized TimeValue otherwise.
+ */
+
+ inline TimeValue getModifyTime() const
+ {
+ return _aStatus.aModifyTime;
+ }
+
+ /** Get the size of the file.
+
+ @return
+ The actual file size if this information is valid, 0 otherwise.
+ */
+
+ inline sal_uInt64 getFileSize() const
+ {
+ return _aStatus.uFileSize;
+ }
+
+ /** Get the file name.
+
+ @return
+ The file name if this information is valid, an empty string otherwise.
+ */
+
+ inline ::rtl::OUString getFileName() const
+ {
+ return _aStatus.ustrFileName ? ::rtl::OUString(_aStatus.ustrFileName) : ::rtl::OUString();
+ }
+
+
+ /** Get the URL of the file.
+
+ @return
+ The full qualified URL of the file if this information is valid, an empty string otherwise.
+ */
+
+ inline ::rtl::OUString getFileURL() const
+ {
+ return _aStatus.ustrFileURL ? ::rtl::OUString(_aStatus.ustrFileURL) : ::rtl::OUString();
+ }
+
+ /** Get the link target URL.
+
+ @return
+ The link target URL if this information is valid, an empty string otherwise.
+ */
+
+ inline ::rtl::OUString getLinkTargetURL() const
+ {
+ return _aStatus.ustrLinkTargetURL ? ::rtl::OUString(_aStatus.ustrLinkTargetURL) : ::rtl::OUString();
+ }
+
+ friend class DirectoryItem;
+};
+
+
+// -----------------------------------------------------------------------------
+/** The file class object provides access to file contents and attributes.
+
+ @see Directory
+ @see DirectoryItem
+ */
+
+class File: public FileBase
+{
+ oslFileHandle _pData;
+ ::rtl::OUString _aPath;
+
+ /** Copy constructor.
+ */
+
+ File( File& );
+
+ /** Assginment operator.
+ */
+
+ File& operator = ( File& );
+
+public:
+
+ /** Constructor.
+
+ @param ustrFileURL [in]
+ The full qualified URL of the file. Relative paths are not allowed.
+ */
+
+ File( const ::rtl::OUString& ustrFileURL ): _pData( 0 ), _aPath( ustrFileURL ) {}
+
+ /** Destructor
+ */
+
+ inline ~File()
+ {
+ close();
+ }
+
+ #define OpenFlag_Read osl_File_OpenFlag_Read
+ #define OpenFlag_Write osl_File_OpenFlag_Write
+ #define OpenFlag_Create osl_File_OpenFlag_Create
+ #define OpenFlag_NoLock osl_File_OpenFlag_NoLock
+
+ /** Open a regular file.
+
+ Open a file. Only regular files can be openend.
+
+ @param uFlags [in]
+ Specifies the open mode.
+
+ @return
+ E_None on success
+ E_NOMEM not enough memory for allocating structures
+ E_INVAL the format of the parameters was not valid
+ E_NAMETOOLONG pathname was too long
+ E_NOENT no such file or directory
+ E_ACCES permission denied
+ E_AGAIN a write lock could not be established
+ E_NOTDIR not a directory
+ E_NXIO no such device or address
+ E_NODEV no such device
+ E_ROFS read-only file system
+ E_TXTBSY text file busy
+ E_FAULT bad address
+ E_LOOP too many symbolic links encountered
+ E_NOSPC no space left on device
+ E_ISDIR is a directory
+ E_MFILE too many open files used by the process
+ E_NFILE too many open files in the system
+ E_DQUOT quota exceeded
+ E_EXIST file exists
+ E_INTR function call was interrupted
+ E_IO on I/O errors
+ E_MULTIHOP multihop attempted
+ E_NOLINK link has been severed
+ E_EOVERFLOW value too large for defined data type
+
+ @see close()
+ @see setPos()
+ @see getPos()
+ @see read()
+ @see write()
+ @see getSize()
+ @see setSize()
+ */
+
+ inline RC open( sal_uInt32 uFlags )
+ {
+ return (RC) osl_openFile( _aPath.pData, &_pData, uFlags );
+ }
+
+ /** Close an open file.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_BADF Bad file
+ E_INTR function call was interrupted
+ E_NOLINK link has been severed
+ E_NOSPC no space left on device
+ E_IO on I/O errors
+
+ @see open()
+ */
+
+ inline RC close()
+ {
+ oslFileError Error = osl_File_E_BADF;
+
+ if( _pData )
+ {
+ Error=osl_closeFile( _pData );
+ _pData = NULL;
+ }
+
+ return (RC) Error;
+ }
+
+
+ #define Pos_Absolut osl_Pos_Absolut
+ #define Pos_Current osl_Pos_Current
+ #define Pos_End osl_Pos_End
+
+ /** Set the internal position pointer of an open file.
+
+ @param uHow [in]
+ Distance to move the internal position pointer (from uPos).
+
+ @param uPos [in]
+ Absolute position from the beginning of the file.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files
+
+ @see open()
+ @see getPos()
+ */
+
+ inline RC setPos( sal_uInt32 uHow, sal_Int64 uPos )
+ {
+ return (RC) osl_setFilePos( _pData, uHow, uPos );
+ }
+
+ /** Retrieve the current position of the internal pointer of an open file.
+
+ @param uPos [out]
+ On success receives the current position of the file pointer.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files
+
+ @see open()
+ @see setPos()
+ @see read()
+ @see write()
+ */
+
+ inline RC getPos( sal_uInt64& uPos )
+ {
+ return (RC) osl_getFilePos( _pData, &uPos );
+ }
+
+ /** Test if the end of a file is reached.
+
+ @param pIsEOF [out]
+ Points to a variable that receives the end-of-file status.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_INTR function call was interrupted
+ E_IO on I/O errors
+ E_ISDIR is a directory
+ E_BADF bad file
+ E_FAULT bad address
+ E_AGAIN operation would block
+ E_NOLINK link has been severed
+
+ @see open()
+ @see read()
+ @see readLine()
+ @see setPos()
+ */
+
+ inline RC isEndOfFile( sal_Bool *pIsEOF )
+ {
+ return (RC) osl_isEndOfFile( _pData, pIsEOF );
+ }
+
+ /** Set the file size of an open file.
+
+ Sets the file size of an open file. The file can be truncated or enlarged by the function.
+ The position of the file pointer is not affeced by this function.
+
+ @param uSize [in]
+ New size in bytes.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files
+
+ @see open()
+ @see setPos()
+ @see getStatus()
+ */
+
+ inline RC setSize( sal_uInt64 uSize )
+ {
+ return (RC) osl_setFileSize( _pData, uSize );
+ }
+
+ /** Get the file size of an open file.
+
+ Gets the file size of an open file.
+ The position of the file pointer is not affeced by this function.
+
+ @param rSize [out]
+ Current size in bytes.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_OVERFLOW the resulting file offset would be a value which cannot be represented correctly for regular files
+
+ @see open()
+ @see setPos()
+ @see getSize()
+ @see setSize()
+ @see getStatus()
+ */
+
+ inline RC getSize( sal_uInt64 &rSize )
+ {
+ return (RC) osl_getFileSize( _pData, &rSize );
+ }
+
+ /** Read a number of bytes from a file.
+
+ Reads a number of bytes from a file. The internal file pointer is
+ increased by the number of bytes read.
+
+ @param pBuffer [out]
+ Points to a buffer which receives data. The buffer must be large enough
+ to hold uBytesRequested bytes.
+
+ @param uBytesRequested [in]
+ Number of bytes which should be retrieved.
+
+ @param rBytesRead [out]
+ On success the number of bytes which have actually been retrieved.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_INTR function call was interrupted
+ E_IO on I/O errors
+ E_ISDIR is a directory
+ E_BADF bad file
+ E_FAULT bad address
+ E_AGAIN operation would block
+ E_NOLINK link has been severed
+
+ @see open()
+ @see write()
+ @see readLine()
+ @see setPos()
+ */
+
+ inline RC read( void *pBuffer, sal_uInt64 uBytesRequested, sal_uInt64& rBytesRead )
+ {
+ return (RC) osl_readFile( _pData, pBuffer, uBytesRequested, &rBytesRead );
+ }
+
+ /** Write a number of bytes to a file.
+
+ Writes a number of bytes to a file.
+ The internal file pointer is increased by the number of bytes read.
+
+ @param pBuffer [in]
+ Points to a buffer which contains the data.
+
+ @param uBytesToWrite [in]
+ Number of bytes which should be written.
+
+ @param rBytesWritten [out]
+ On success the number of bytes which have actually been written.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_FBIG file too large
+ E_DQUOT quota exceeded
+ E_AGAIN operation would block
+ E_BADF bad file
+ E_FAULT bad address
+ E_INTR function call was interrupted
+ E_IO on I/O errosr
+ E_NOLCK no record locks available
+ E_NOLINK link has been severed
+ E_NOSPC no space left on device
+ E_NXIO no such device or address
+
+ @see open()
+ @see read()
+ @see setPos()
+ */
+
+ inline RC write(const void *pBuffer, sal_uInt64 uBytesToWrite, sal_uInt64& rBytesWritten)
+ {
+ return (RC) osl_writeFile( _pData, pBuffer, uBytesToWrite, &rBytesWritten );
+ }
+
+
+ /** Read a line from a file.
+
+ Reads a line from a file. The new line delimiter is NOT returned!
+
+ @param aSeq [in/out]
+ A reference to a ::rtl::ByteSequence that will hold the line read on success.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_INTR function call was interrupted
+ E_IO on I/O errors
+ E_ISDIR is a directory
+ E_BADF bad file
+ E_FAULT bad address
+ E_AGAIN operation would block
+ E_NOLINK link has been severed
+
+ @see open()
+ @see read()
+ @see write()
+ @see setPos()
+ */
+
+ inline RC readLine( ::rtl::ByteSequence& aSeq )
+ {
+ return (RC) osl_readLine( _pData, reinterpret_cast<sal_Sequence**>(&aSeq) );
+ }
+
+ /** Synchronize the memory representation of a file with that on the physical medium.
+
+ The function ensures that all modified data and attributes of the file associated with
+ the given file handle have been written to the physical medium.
+ In case the hard disk has a write cache enabled, the data may not really be on
+ permanent storage when osl_syncFile returns.
+
+ @return
+ <dl>
+ <dt>E_None</dt>
+ <dd>On success</dd>
+ <dt>E_INVAL</dt>
+ <dd>The value of the input parameter is invalid</dd>
+ </dl>
+ <br><p><strong>In addition to these error codes others may occur as well, for instance:</strong></p><br>
+ <dt>E_BADF</dt>
+ <dd>The file is not open for writing</dd>
+ <dt>E_IO</dt>
+ <dd>An I/O error occurred</dd>
+ <dt>E_NOSPC</dt>
+ <dd>There is no enough space on the target device</dd>
+ <dt>E_ROFS</dt>
+ <dd>The file is located on a read only file system</dd>
+ <dt>E_TIMEDOUT</dt>
+ <dd>A remote connection timed out. This may happen when a file is on a remote location</dd>
+ </dl>
+
+ @see osl_syncFile()
+ @see open()
+ @see write()
+ */
+ inline RC sync() const
+ {
+ OSL_PRECOND(_pData, "File::sync(): File not open");
+ return (RC)osl_syncFile(_pData);
+ }
+
+ /** Copy a file to a new destination.
+
+ Copies a file to a new destination. Copies only files not directories.
+ No assumptions should be made about preserving attributes or file time.
+
+ @param ustrSourceFileURL [in]
+ Full qualified URL of the source file.
+
+ @param ustrDestFileURL [in]
+ Full qualified URL of the destination file. A directory is NOT a valid destination file!
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_ACCES permission denied
+ E_PERM operation not permitted
+ E_NAMETOOLONG file name too long
+ E_NOENT no such file or directory
+ E_ISDIR is a directory
+ E_ROFS read-only file system
+
+ @see move()
+ @see remove()
+ */
+
+ inline static RC copy( const ::rtl::OUString& ustrSourceFileURL, const ::rtl::OUString& ustrDestFileURL )
+ {
+ return (RC) osl_copyFile( ustrSourceFileURL.pData, ustrDestFileURL.pData );
+ }
+
+ /** Move a file or directory to a new destination or renames it.
+
+ Moves a file or directory to a new destination or renames it.
+ File time and attributes are preserved.
+
+ @param ustrSourceFileURL [in]
+ Full qualified URL of the source file.
+
+ @param ustrDestFileURL [in]
+ Full qualified URL of the destination file. An existing directory is NOT a valid destination !
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_ACCES permission denied
+ E_PERM operation not permitted
+ E_NAMETOOLONG file name too long
+ E_NOENT no such file or directory
+ E_ROFS read-only file system
+
+ @see copy()
+ */
+
+ inline static RC move( const ::rtl::OUString& ustrSourceFileURL, const ::rtl::OUString& ustrDestFileURL )
+ {
+ return (RC) osl_moveFile( ustrSourceFileURL.pData, ustrDestFileURL.pData );
+ }
+
+ /** Remove a regular file.
+
+ @param ustrFileURL [in]
+ Full qualified URL of the file to remove.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_ACCES permission denied
+ E_PERM operation not permitted
+ E_NAMETOOLONG file name too long
+ E_NOENT no such file or directory
+ E_ISDIR is a directory
+ E_ROFS read-only file system
+ E_FAULT bad address
+ E_LOOP too many symbolic links encountered
+ E_IO on I/O errors
+ E_BUSY device or resource busy
+ E_INTR function call was interrupted
+ E_LOOP too many symbolic links encountered
+ E_MULTIHOP multihop attempted
+ E_NOLINK link has been severed
+ E_TXTBSY text file busy
+
+ @see open()
+ */
+
+ inline static RC remove( const ::rtl::OUString& ustrFileURL )
+ {
+ return (RC) osl_removeFile( ustrFileURL.pData );
+ }
+
+ /** Set file attributes.
+
+ @param ustrFileURL [in]
+ The full qualified file URL.
+
+ @param uAttributes [in]
+ Attributes of the file to be set.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+
+ @see FileStatus
+ */
+
+ inline static RC setAttributes( const ::rtl::OUString& ustrFileURL, sal_uInt64 uAttributes )
+ {
+ return (RC) osl_setFileAttributes( ustrFileURL.pData, uAttributes );
+ }
+
+ /** Set the file time.
+
+ @param ustrFileURL [in]
+ The full qualified URL of the file.
+
+ @param rCreationTime [in]
+ Creation time of the given file.
+
+ @param rLastAccessTime [in]
+ Time of the last access of the given file.
+
+ @param rLastWriteTime [in]
+ Time of the last modifying of the given file.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOENT no such file or directory not found
+
+ @see FileStatus
+ */
+
+ inline static RC setTime(
+ const ::rtl::OUString& ustrFileURL,
+ const TimeValue& rCreationTime,
+ const TimeValue& rLastAccessTime,
+ const TimeValue& rLastWriteTime )
+ {
+ return (RC) osl_setFileTime(
+ ustrFileURL.pData,
+ &rCreationTime,
+ &rLastAccessTime,
+ &rLastWriteTime );
+ }
+
+ friend class DirectoryItem;
+};
+
+// -----------------------------------------------------------------------------
+/** The directory item class object provides access to file status information.
+
+ @see FileStatus
+ */
+
+class DirectoryItem: public FileBase
+{
+ oslDirectoryItem _pData;
+
+public:
+
+ /** Constructor.
+ */
+
+ DirectoryItem(): _pData( NULL )
+ {
+ }
+
+ /** Copy constructor.
+ */
+
+ DirectoryItem( const DirectoryItem& rItem ): _pData( rItem._pData)
+ {
+ if( _pData )
+ osl_acquireDirectoryItem( _pData );
+ }
+
+ /** Destructor.
+ */
+
+ ~DirectoryItem()
+ {
+ if( _pData )
+ osl_releaseDirectoryItem( _pData );
+ }
+
+ /** Assignment operator.
+ */
+
+ DirectoryItem& operator=(const DirectoryItem& rItem )
+ {
+ if (&rItem != this)
+ {
+ if( _pData )
+ osl_releaseDirectoryItem( _pData );
+
+ _pData = rItem._pData;
+
+ if( _pData )
+ osl_acquireDirectoryItem( _pData );
+ }
+ return *this;
+ }
+
+ /** Check for validity of this instance.
+
+ @return
+ sal_True if object is valid directory item else sal_False.
+ */
+
+ inline sal_Bool is()
+ {
+ return _pData != NULL;
+ }
+
+ /** Retrieve a single directory item.
+
+ Retrieves a single directory item. The returned handle has an initial refcount of 1.
+ Due to performance issues it is not recommended to use this function while
+ enumerating the contents of a directory. In this case use osl_getNextDirectoryItem() instead.
+
+ @param ustrFileURL [in]
+ An absolute file URL.
+
+ @param rItem [out]
+ On success it receives a handle which can be used for subsequent calls to osl_getFileStatus().
+ The handle has to be released by a call to osl_releaseDirectoryItem().
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_ACCES permission denied
+ E_MFILE too many open files used by the process
+ E_NFILE too many open files in the system
+ E_NOENT no such file or directory
+ E_LOOP too many symbolic links encountered
+ E_NAMETOOLONG the file name is too long
+ E_NOTDIR a component of the path prefix of path is not a directory
+ E_IO on I/O errors
+ E_MULTIHOP multihop attempted
+ E_NOLINK link has been severed
+ E_FAULT bad address
+ E_INTR the function call was interrupted
+
+ @see FileStatus
+ @see Directory::getNextItem()
+ */
+
+ static inline RC get( const ::rtl::OUString& ustrFileURL, DirectoryItem& rItem )
+ {
+ if( rItem._pData)
+ {
+ osl_releaseDirectoryItem( rItem._pData );
+ rItem._pData = NULL;
+ }
+
+ return (RC) osl_getDirectoryItem( ustrFileURL.pData, &rItem._pData );
+ }
+
+ /** Retrieve information about a single file or directory.
+
+ @param rStatus [in|out]
+ Reference to a class which receives the information of the file or directory
+ represented by this directory item.
+
+ @return
+ E_None on success
+ E_NOMEM not enough memory for allocating structures
+ E_INVAL the format of the parameters was not valid
+ E_LOOP too many symbolic links encountered
+ E_ACCES permission denied
+ E_NOENT no such file or directory
+ E_NAMETOOLONG file name too long
+ E_BADF invalid oslDirectoryItem parameter
+ E_FAULT bad address
+ E_OVERFLOW value too large for defined data type
+ E_INTR function call was interrupted
+ E_NOLINK link has been severed
+ E_MULTIHOP components of path require hopping to multiple remote machines and the file system does not allow it
+ E_MFILE too many open files used by the process
+ E_NFILE too many open files in the system
+ E_NOSPC no space left on device
+ E_NXIO no such device or address
+ E_IO on I/O errors
+ E_NOSYS function not implemented
+
+ @see get()
+ @see Directory::getNextItem()
+ @see FileStatus
+ */
+
+ inline RC getFileStatus( FileStatus& rStatus )
+ {
+ return (RC) osl_getFileStatus( _pData, &rStatus._aStatus, rStatus._nMask );
+ }
+
+ friend class Directory;
+};
+
+//###########################################
+
+/** Base class for observers of directory creation notifications.
+
+ Clients which uses the method createDirectoryPath of the class
+ Directory may want to be informed about the directories that
+ have been created. This may be accomplished by deriving from
+ this base class and overwriting the virtual function
+ DirectoryCreated.
+
+ @see Directory::createPath
+*/
+class DirectoryCreationObserver
+{
+public:
+ virtual ~DirectoryCreationObserver() {};
+
+ /** This method will be called when a new directory has been
+ created and needs to be overwritten by derived classes.
+ You must not delete the directory that was just created
+ otherwise you will run into an endless loop.
+
+ @param aDirectoryUrl
+ [in]The absolute file URL of the directory that was just created by
+ ::osl::Directory::createPath.
+ */
+ virtual void DirectoryCreated(const rtl::OUString& aDirectoryUrl) = 0;
+};
+
+//###########################################
+// This just an internal helper function for
+// private use.
+extern "C" inline void SAL_CALL onDirectoryCreated(void* pData, rtl_uString* aDirectoryUrl)
+{
+ (static_cast<DirectoryCreationObserver*>(pData))->DirectoryCreated(aDirectoryUrl);
+}
+
+/** The directory class object provides a enumeration of DirectoryItems.
+
+ @see DirectoryItem
+ @see File
+ */
+
+class Directory: public FileBase
+{
+ oslDirectory _pData;
+ ::rtl::OUString _aPath;
+
+ /** Copy constructor.
+ */
+
+ Directory( Directory& );
+
+ /** Assignment operator.
+ */
+
+ Directory& operator = ( Directory& );
+
+public:
+
+ /** Constructor.
+
+ @param strPath [in]
+ The full qualified URL of the directory.
+ Relative URLs are not allowed.
+ */
+
+ Directory( const ::rtl::OUString& strPath ): _pData( 0 ), _aPath( strPath )
+ {
+ }
+
+ /** Destructor.
+ */
+
+ ~Directory()
+ {
+ close();
+ }
+
+ /** Open a directory for enumerating its contents.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOENT the specified path doesn't exist
+ E_NOTDIR the specified path is not an directory
+ E_NOMEM not enough memory for allocating structures
+ E_ACCES permission denied
+ E_MFILE too many open files used by the process
+ E_NFILE too many open files in the system
+ E_NAMETOOLONG File name too long
+ E_LOOP Too many symbolic links encountered
+
+ @see getNextItem()
+ @see close()
+ */
+
+ inline RC open()
+ {
+ return (RC) osl_openDirectory( _aPath.pData, &_pData );
+ }
+
+ /** Query if directory is open.
+
+ Query if directory is open and so item enumeration is valid.
+
+ @return
+ sal_True if the directory is open else sal_False.
+
+ @see open()
+ @see close()
+ */
+
+ inline sal_Bool isOpen() { return _pData != NULL; };
+
+ /** Close a directory.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_BADF invalid oslDirectory parameter
+ E_INTR the function call was interrupted
+
+ @see open()
+ */
+
+ inline RC close()
+ {
+ oslFileError Error = osl_File_E_BADF;
+
+ if( _pData )
+ {
+ Error=osl_closeDirectory( _pData );
+ _pData = NULL;
+ }
+
+ return (RC) Error;
+ }
+
+
+ /** Resets the directory item enumeration to the beginning.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOENT the specified path doesn't exist
+ E_NOTDIR the specified path is not an directory
+ E_NOMEM not enough memory for allocating structures
+ E_ACCES permission denied
+ E_MFILE too many open files used by the process
+ E_NFILE too many open files in the system
+ E_NAMETOOLONG File name too long
+ E_LOOP Too many symbolic links encountered
+
+ @see open()
+ */
+
+ inline RC reset()
+ {
+ close();
+ return open();
+ }
+
+ /** Retrieve the next item of a previously opened directory.
+
+ Retrieves the next item of a previously opened directory.
+
+ @param rItem [out]
+ On success a valid DirectoryItem.
+
+ @param nHint [in]
+ With this parameter the caller can tell the implementation that (s)he
+ is going to call this function uHint times afterwards. This enables the implementation to
+ get the information for more than one file and cache it until the next calls.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_NOENT no more entries in this directory
+ E_BADF invalid oslDirectory parameter
+ E_OVERFLOW the value too large for defined data type
+
+ @see DirectoryItem
+ */
+
+ inline RC getNextItem( DirectoryItem& rItem, sal_uInt32 nHint = 0 )
+ {
+ if( rItem._pData )
+ {
+ osl_releaseDirectoryItem( rItem._pData );
+ rItem._pData = 0;
+ }
+ return ( RC) osl_getNextDirectoryItem( _pData, &rItem._pData, nHint );
+ }
+
+
+ /** Retrieve information about a volume.
+
+ Retrieves information about a volume. A volume can either be a mount point, a network
+ resource or a drive depending on Operating System and File System.
+
+ @param ustrDirectoryURL [in]
+ Full qualified URL of the volume
+
+ @param rInfo [out]
+ On success it receives information about the volume.
+
+ @return
+ E_None on success
+ E_NOMEM not enough memory for allocating structures
+ E_INVAL the format of the parameters was not valid
+ E_NOTDIR not a directory
+ E_NAMETOOLONG file name too long
+ E_NOENT no such file or directory
+ E_ACCES permission denied
+ E_LOOP too many symbolic links encountered
+ E_FAULT Bad address
+ E_IO on I/O errors
+ E_NOSYS function not implemented
+ E_MULTIHOP multihop attempted
+ E_NOLINK link has been severed
+ E_INTR function call was interrupted
+
+ @see FileStatus
+ @see VolumeInfo
+ */
+
+ inline static RC getVolumeInfo( const ::rtl::OUString& ustrDirectoryURL, VolumeInfo& rInfo )
+ {
+ return (RC) osl_getVolumeInformation( ustrDirectoryURL.pData, &rInfo._aInfo, rInfo._nMask );
+ }
+
+ /** Create a directory.
+
+ @param ustrDirectoryURL [in]
+ Full qualified URL of the directory to create.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_EXIST file exists
+ E_ACCES permission denied
+ E_NAMETOOLONG file name too long
+ E_NOENT no such file or directory
+ E_NOTDIR not a directory
+ E_ROFS read-only file system
+ E_NOSPC no space left on device
+ E_DQUOT quota exceeded
+ E_LOOP too many symbolic links encountered
+ E_FAULT bad address
+ E_IO on I/O errors
+ E_MLINK too many links
+ E_MULTIHOP multihop attempted
+ E_NOLINK link has been severed
+
+ @see remove()
+ */
+
+ inline static RC create( const ::rtl::OUString& ustrDirectoryURL )
+ {
+ return (RC) osl_createDirectory( ustrDirectoryURL.pData );
+ }
+
+ /** Remove an empty directory.
+
+ @param ustrDirectoryURL [in]
+ Full qualified URL of the directory.
+
+ @return
+ E_None on success
+ E_INVAL the format of the parameters was not valid
+ E_NOMEM not enough memory for allocating structures
+ E_PERM operation not permitted
+ E_ACCES permission denied
+ E_NOENT no such file or directory
+ E_NOTDIR not a directory
+ E_NOTEMPTY directory not empty
+ E_FAULT bad address
+ E_NAMETOOLONG file name too long
+ E_BUSY device or resource busy
+ E_ROFS read-only file system
+ E_LOOP too many symbolic links encountered
+ E_BUSY device or resource busy
+ E_EXIST file exists
+ E_IO on I/O errors
+ E_MULTIHOP multihop attempted
+ E_NOLINK link has been severed
+
+ @see create()
+ */
+
+ inline static RC remove( const ::rtl::OUString& ustrDirectoryURL )
+ {
+ return (RC) osl_removeDirectory( ustrDirectoryURL.pData );
+ }
+
+ /** Create a directory path.
+
+ The osl_createDirectoryPath function creates a specified directory path.
+ All nonexisting sub directories will be created.
+ <p><strong>PLEASE NOTE:</strong> You cannot rely on getting the error code
+ E_EXIST for existing directories. Programming against this error code is
+ in general a strong indication of a wrong usage of osl_createDirectoryPath.</p>
+
+ @param aDirectoryUrl
+ [in] The absolute file URL of the directory path to create.
+ A relative file URL will not be accepted.
+
+ @param aDirectoryCreationObserver
+ [in] Pointer to an instance of type DirectoryCreationObserver that will
+ be informed about the creation of a directory. The value of this
+ parameter may be NULL, in this case notifications will not be sent.
+
+ @return
+ <dl>
+ <dt>E_None</dt>
+ <dd>On success</dd>
+ <dt>E_INVAL</dt>
+ <dd>The format of the parameters was not valid</dd>
+ <dt>E_ACCES</dt>
+ <dd>Permission denied</dd>
+ <dt>E_EXIST</dt>
+ <dd>The final node of the specified directory path already exist</dd>
+ <dt>E_NAMETOOLONG</dt>
+ <dd>The name of the specified directory path exceeds the maximum allowed length</dd>
+ <dt>E_NOTDIR</dt>
+ <dd>A component of the specified directory path already exist as file in any part of the directory path</dd>
+ <dt>E_ROFS</dt>
+ <dd>Read-only file system</dd>
+ <dt>E_NOSPC</dt>
+ <dd>No space left on device</dd>
+ <dt>E_DQUOT</dt>
+ <dd>Quota exceeded</dd>
+ <dt>E_FAULT</dt>
+ <dd>Bad address</dd>
+ <dt>E_IO</dt>
+ <dd>I/O error</dd>
+ <dt>E_LOOP</dt>
+ <dd>Too many symbolic links encountered</dd>
+ <dt>E_NOLINK</dt>
+ <dd>Link has been severed</dd>
+ <dt>E_invalidError</dt>
+ <dd>An unknown error occurred</dd>
+ </dl>
+
+ @see DirectoryCreationObserver
+ @see create
+ */
+ static RC createPath(
+ const ::rtl::OUString& aDirectoryUrl,
+ DirectoryCreationObserver* aDirectoryCreationObserver = NULL)
+ {
+ return (RC)osl_createDirectoryPath(
+ aDirectoryUrl.pData,
+ (aDirectoryCreationObserver) ? onDirectoryCreated : NULL,
+ aDirectoryCreationObserver);
+ }
+};
+
+} /* namespace osl */
+
+#endif /* __cplusplus */
+#endif /* _OSL_FILE_HXX_ */
+
diff --git a/sal/inc/osl/getglobalmutex.hxx b/sal/inc/osl/getglobalmutex.hxx
new file mode 100644
index 000000000000..43d463c2d1cd
--- /dev/null
+++ b/sal/inc/osl/getglobalmutex.hxx
@@ -0,0 +1,50 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if !defined INCLUDED_OSL_GETGLOBALMUTEX_HXX
+#define INCLUDED_OSL_GETGLOBALMUTEX_HXX
+
+#include "osl/mutex.hxx"
+
+namespace osl {
+
+/** A helper functor for the rtl_Instance template.
+
+ See the rtl_Instance template for examples of how this class is used.
+ */
+class GetGlobalMutex
+{
+public:
+ ::osl::Mutex * operator()()
+ {
+ return ::osl::Mutex::getGlobalMutex();
+ }
+};
+
+}
+
+#endif // INCLUDED_OSL_GETGLOBALMUTEX_HXX
diff --git a/sal/inc/osl/interlck.h b/sal/inc/osl/interlck.h
new file mode 100644
index 000000000000..0785ef350965
--- /dev/null
+++ b/sal/inc/osl/interlck.h
@@ -0,0 +1,57 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_INTERLOCK_H_
+#define _OSL_INTERLOCK_H_
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef sal_Int32 oslInterlockedCount;
+
+/** Increments the count variable addressed by pCount.
+ @param Address of counter variable
+ @return The result of the operation is zero, the value of the count variable.
+*/
+oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount);
+
+/** Decrement the count variable addressed by pCount.
+ @param Address of counter variable
+ @return The result of the operation is the new value is of the count variable.
+*/
+oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_INTERLOCK_H_ */
+
+
diff --git a/sal/inc/osl/module.h b/sal/inc/osl/module.h
new file mode 100644
index 000000000000..78558fed4105
--- /dev/null
+++ b/sal/inc/osl/module.h
@@ -0,0 +1,211 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/** @HTML */
+
+#ifndef _OSL_MODULE_H_
+#define _OSL_MODULE_H_
+
+# include <rtl/ustring.h>
+# include <rtl/tencinfo.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef SAL_DLLPREFIX
+#define SAL_MODULENAME(name) SAL_DLLPREFIX name SAL_DLLEXTENSION
+#else
+#define SAL_MODULENAME(name) name SAL_DLLEXTENSION
+#endif
+
+#if defined(SAL_W32) || defined(SAL_OS2)
+#define SAL_MODULENAME_WITH_VERSION(name, version) name version SAL_DLLEXTENSION
+
+#elif defined(SAL_UNX)
+#if defined(MACOSX)
+#define SAL_MODULENAME_WITH_VERSION(name, version) SAL_DLLPREFIX name ".dylib." version
+#else
+#define SAL_MODULENAME_WITH_VERSION(name, version) SAL_DLLPREFIX name SAL_DLLEXTENSION "." version
+#endif
+
+#endif
+
+#define SAL_LOADMODULE_DEFAULT 0x00000
+#define SAL_LOADMODULE_LAZY 0x00001
+#define SAL_LOADMODULE_NOW 0x00002
+#define SAL_LOADMODULE_GLOBAL 0x00100
+
+typedef void* oslModule;
+
+/** Generic Function pointer type that will be used as symbol address.
+ @see osl_getFunctionSymbol.
+ @see osl_getModuleURLFromFunctionAddress.
+*/
+typedef void ( SAL_CALL *oslGenericFunction )( void );
+
+/** Load a shared library or module.
+ @param strModuleName denotes the name of the module to be loaded.
+ @return NULL if the module could not be loaded, otherwise a handle to the module.
+*/
+oslModule SAL_CALL osl_loadModule(rtl_uString *strModuleName, sal_Int32 nRtldMode);
+
+/** Load a module located relative to some other module.
+
+ @param baseModule
+ must point to a function that is part of the code of some loaded module;
+ must not be NULL.
+
+ @param relativePath
+ a relative URL; must not be NULL.
+
+ @param mode
+ the SAL_LOADMODULE_xxx flags.
+
+ @return
+ a non-NULL handle to the loaded module, or NULL if an error occurred.
+
+ @since UDK 3.2.8
+*/
+oslModule SAL_CALL osl_loadModuleRelative(
+ oslGenericFunction baseModule, rtl_uString * relativePath, sal_Int32 mode);
+
+/** Retrieve the handle of an already loaded module.
+
+ This function can be used to search for a function symbol in the process address space.
+ Do not use the returned handle as an argument to osl_unloadModule. On Unix platforms,
+ pModuleName gets ignored and the special handle RTLD_DEFAULT is returned.
+
+ @param pModuleName
+ [in] denotes the name of the module to search for. Ignored on Unix
+
+ @param pResult
+ [out] a pointer to a oslModule that is updated with the requested module handle
+ on success.
+
+ @return
+ sal_True if the module handle could be retrieved and has been copied to *pResult.
+ sal_False if the module has not been loaded yet.
+
+ @see osl_getFunctionSymbol
+ @see osl_getAsciiFunctionSymbol
+*/
+sal_Bool SAL_CALL osl_getModuleHandle(rtl_uString *pModuleName, oslModule *pResult);
+
+/** Release the module
+*/
+void SAL_CALL osl_unloadModule(oslModule Module);
+
+/** lookup the specified symbol name.
+ @return address of the symbol or NULL if lookup failed.
+*/
+void* SAL_CALL osl_getSymbol( oslModule Module, rtl_uString *strSymbolName);
+
+/** Lookup the specified function symbol name.
+
+ osl_getFunctionSymbol is an alternative function for osl_getSymbol.
+ Use Function pointer as symbol address to conceal type conversion.
+
+ @param Module
+ [in] the handle of the Module.
+
+ @param ustrFunctionSymbolName
+ [in] Name of the function that will be looked up.
+
+ @return
+ <dl>
+ <dt>Function address.</dt>
+ <dd>on success</dd>
+ <dt>NULL</dt>
+ <dd>lookup failed or the parameter are invalid.</dd>
+ </dl>
+
+ @see osl_getSymbol
+ @see osl_getAsciiFunctionSymbol
+*/
+oslGenericFunction SAL_CALL osl_getFunctionSymbol( oslModule Module, rtl_uString *ustrFunctionSymbolName );
+
+/** Lookup the specified function symbol name.
+
+ osl_getAsciiFunctionSymbol is an alternative function for osl_getFunctionSymbol.
+ It expects the C-style function name string to contain ascii characters only.
+
+ @param Module
+ [in] a module handle as returned by osl_loadModule or osl_getModuleHandle
+
+ @param pFunctionSymbolName
+ [in] Name of the function that will be looked up.
+
+ @return
+ <dl>
+ <dt>Function address.</dt>
+ <dd>on success</dd>
+ <dt>NULL</dt>
+ <dd>lookup failed or the parameter are invalid.</dd>
+ </dl>
+
+ @see osl_getModuleHandle
+ @see osl_getFunctionSymbol
+*/
+oslGenericFunction SAL_CALL osl_getAsciiFunctionSymbol(oslModule Module, const sal_Char *pSymbol);
+
+
+/** Lookup URL of module which is mapped at the specified address.
+ @param pv specifies an address in the process memory space.
+ @param pustrURL receives the URL of the module that is mapped at pv.
+ @return sal_True on success, sal_False if no module can be found at the specified address.
+*/
+sal_Bool SAL_CALL osl_getModuleURLFromAddress( void *pv, rtl_uString **pustrURL );
+
+/** Lookup URL of module which is mapped at the specified function address.
+
+ osl_getModuleURLFromFunctionAddress is an alternative function for osl_getModuleURLFromAddress.
+ Use Function pointer as symbol address to conceal type conversion.
+
+ @param pf
+ [in] function address in oslGenericFunction format.
+
+ @param pustrFunctionURL
+ [out] receives the URL of the module that is mapped at pf.
+
+ @return
+ <dl>
+ <dt>sal_True</dt>
+ <dd>on success</dd>
+ <dt>sal_False</dt>
+ <dd>no module can be found at the specified function address or parameter is somewhat invalid.</dd>
+ </dl>
+
+ @see osl_getModuleURLFromAddress
+*/
+sal_Bool SAL_CALL osl_getModuleURLFromFunctionAddress( oslGenericFunction pf, rtl_uString **pustrFunctionURL );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_MODULE_H_ */
diff --git a/sal/inc/osl/module.hxx b/sal/inc/osl/module.hxx
new file mode 100644
index 000000000000..fd787569b454
--- /dev/null
+++ b/sal/inc/osl/module.hxx
@@ -0,0 +1,158 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/** @HTML */
+
+#ifndef _OSL_MODULE_HXX_
+#define _OSL_MODULE_HXX_
+
+#include <rtl/ustring.hxx>
+#include <osl/module.h>
+
+namespace osl
+{
+
+class Module
+{
+ Module( const Module&);
+ Module& operator = ( const Module&);
+
+public:
+ static sal_Bool getUrlFromAddress(void * addr, ::rtl::OUString & libraryUrl) {
+ return osl_getModuleURLFromAddress(addr, &libraryUrl.pData);
+ }
+
+ /** Get module URL from the specified function address in the module.
+
+ Similar to getUrlFromAddress, but use a function address to get URL of the Module.
+ Use Function pointer as symbol address to conceal type conversion.
+
+ @param addr
+ [in] function address in oslGenericFunction format.
+
+ @param libraryUrl
+ [in|out] receives the URL of the module.
+
+ @return
+ <dl>
+ <dt>sal_True</dt>
+ <dd>on success</dd>
+ <dt>sal_False</dt>
+ <dd>can not get the URL from the specified function address or the parameter is invalid.</dd>
+ </dl>
+
+ @see getUrlFromAddress
+ */
+ static sal_Bool getUrlFromAddress( oslGenericFunction addr, ::rtl::OUString & libraryUrl){
+ return osl_getModuleURLFromFunctionAddress( addr, &libraryUrl.pData );
+ }
+
+ Module(): m_Module(0){}
+
+ Module( const ::rtl::OUString& strModuleName, sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT) : m_Module(0)
+ {
+ load( strModuleName, nRtldMode);
+ }
+
+ ~Module()
+ {
+ osl_unloadModule(m_Module);
+ }
+
+ sal_Bool SAL_CALL load( const ::rtl::OUString& strModuleName,
+ sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT)
+ {
+ unload();
+ m_Module= osl_loadModule( strModuleName.pData, nRtldMode );
+ return is();
+ }
+
+ /// @since UDK 3.2.8
+ sal_Bool SAL_CALL loadRelative(
+ ::oslGenericFunction baseModule, ::rtl::OUString const & relativePath,
+ ::sal_Int32 mode = SAL_LOADMODULE_DEFAULT)
+ {
+ unload();
+ m_Module = osl_loadModuleRelative(baseModule, relativePath.pData, mode);
+ return is();
+ }
+
+ void SAL_CALL unload()
+ {
+ if (m_Module)
+ {
+ osl_unloadModule(m_Module);
+ m_Module = 0;
+ }
+ }
+
+ sal_Bool SAL_CALL is() const
+ {
+ return m_Module != NULL;
+ }
+
+ void* SAL_CALL getSymbol( const ::rtl::OUString& strSymbolName)
+ {
+ return ( osl_getSymbol( m_Module, strSymbolName.pData ) );
+ }
+
+ /** Get function address by the function name in the module.
+
+ getFunctionSymbol is an alternative function for getSymbol.
+ Use Function pointer as symbol address to conceal type conversion.
+
+ @param ustrFunctionSymbolName
+ [in] Function name to be looked up.
+
+ @return
+ <dl>
+ <dt>oslGenericFunction format function address</dt>
+ <dd>on success</dd>
+ <dt>NULL</dt>
+ <dd>lookup failed or parameter is somewhat invalid</dd>
+ </dl>
+
+ @see getSymbol
+ */
+ oslGenericFunction SAL_CALL getFunctionSymbol( const ::rtl::OUString& ustrFunctionSymbolName )
+ {
+ return ( osl_getFunctionSymbol( m_Module, ustrFunctionSymbolName.pData ) );
+ }
+
+ operator oslModule() const
+ {
+ return m_Module;
+ }
+
+private:
+ oslModule m_Module;
+
+};
+
+}
+
+#endif
diff --git a/sal/inc/osl/mutex.h b/sal/inc/osl/mutex.h
new file mode 100644
index 000000000000..2c779aadf566
--- /dev/null
+++ b/sal/inc/osl/mutex.h
@@ -0,0 +1,77 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_MUTEX_H_
+#define _OSL_MUTEX_H_
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _oslMutexImpl;
+typedef struct _oslMutexImpl * oslMutex;
+
+/** Create a thread-local mutex.
+ @return 0 if the mutex could not be created, otherwise a handle to the mutex.
+*/
+oslMutex SAL_CALL osl_createMutex(void);
+
+/** Release the OS-structures and free mutex data-structure.
+ @param Mutex the mutex-handle
+*/
+void SAL_CALL osl_destroyMutex(oslMutex Mutex);
+
+/** Acquire the mutex, block if already acquired by another thread.
+ @param Mutex handle to a created mutex.
+ @return False if system-call fails.
+*/
+sal_Bool SAL_CALL osl_acquireMutex(oslMutex Mutex);
+
+/** Try to acquire the mutex without blocking.
+ @param Mutex handle to a created mutex.
+ @return False if it could not be acquired.
+*/
+sal_Bool SAL_CALL osl_tryToAcquireMutex(oslMutex Mutex);
+
+/** Release the mutex.
+ @param Mutex handle to a created mutex.
+ @return False if system-call fails.
+*/
+sal_Bool SAL_CALL osl_releaseMutex(oslMutex Mutex);
+
+/** Returns a unique and global mutex.
+ @return the global mutex.
+*/
+oslMutex * SAL_CALL osl_getGlobalMutex(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_MUTEX_H_ */
diff --git a/sal/inc/osl/mutex.hxx b/sal/inc/osl/mutex.hxx
new file mode 100644
index 000000000000..0fe0bd1b653e
--- /dev/null
+++ b/sal/inc/osl/mutex.hxx
@@ -0,0 +1,253 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_MUTEX_HXX_
+#define _OSL_MUTEX_HXX_
+
+#ifdef __cplusplus
+
+#include <osl/mutex.h>
+
+
+namespace osl
+{
+ /** A mutual exclusion synchronization object
+ */
+ class Mutex {
+
+ public:
+ /** Create a thread-local mutex.
+ @return 0 if the mutex could not be created, otherwise a handle to the mutex.
+ @seealso ::osl_createMutex()
+ */
+ Mutex()
+ {
+ mutex = osl_createMutex();
+ }
+
+ /** Release the OS-structures and free mutex data-structure.
+ @seealso ::osl_destroyMutex()
+ */
+ ~Mutex()
+ {
+ osl_destroyMutex(mutex);
+ }
+
+ /** Acquire the mutex, block if already acquired by another thread.
+ @return sal_False if system-call fails.
+ @seealso ::osl_acquireMutex()
+ */
+ sal_Bool acquire()
+ {
+ return osl_acquireMutex(mutex);
+ }
+
+ /** Try to acquire the mutex without blocking.
+ @return sal_False if it could not be acquired.
+ @seealso ::osl_tryToAcquireMutex()
+ */
+ sal_Bool tryToAcquire()
+ {
+ return osl_tryToAcquireMutex(mutex);
+ }
+
+ /** Release the mutex.
+ @return sal_False if system-call fails.
+ @seealso ::osl_releaseMutex()
+ */
+ sal_Bool release()
+ {
+ return osl_releaseMutex(mutex);
+ }
+
+ /** Returns a global static mutex object.
+ The global and static mutex object can be used to initialize other
+ static objects in a thread safe manner.
+ @return the global mutex object
+ @seealso ::osl_getGlobalMutex()
+ */
+ static Mutex * getGlobalMutex()
+ {
+ return (Mutex *)osl_getGlobalMutex();
+ }
+
+ private:
+ oslMutex mutex;
+
+ /** The underlying oslMutex has no reference count.
+
+ Since the underlying oslMutex is not a reference counted object, copy
+ constructed Mutex may work on an already destructed oslMutex object.
+
+ */
+ Mutex(const Mutex&);
+
+ /** The underlying oslMutex has no reference count.
+
+ When destructed, the Mutex object destroys the undelying oslMutex,
+ which might cause severe problems in case it's a temporary object.
+
+ */
+ Mutex(oslMutex Mutex);
+
+ /** This assignment operator is private for the same reason as
+ the copy constructor.
+ */
+ Mutex& operator= (const Mutex&);
+
+ /** This assignment operator is private for the same reason as
+ the constructor taking a oslMutex argument.
+ */
+ Mutex& operator= (oslMutex);
+ };
+
+ /** A helper class for mutex objects and interfaces.
+ */
+ template<class T>
+ class Guard
+ {
+ private:
+ Guard( const Guard& );
+ const Guard& operator = ( const Guard& );
+
+ protected:
+ T * pT;
+ public:
+
+ /** Acquires the object specified as parameter.
+ */
+ Guard(T * pT_) : pT(pT_)
+ {
+ pT->acquire();
+ }
+
+ /** Acquires the object specified as parameter.
+ */
+ Guard(T & t) : pT(&t)
+ {
+ pT->acquire();
+ }
+
+ /** Releases the mutex or interface. */
+ ~Guard()
+ {
+ pT->release();
+ }
+ };
+
+ /** A helper class for mutex objects and interfaces.
+ */
+ template<class T>
+ class ClearableGuard
+ {
+ private:
+ ClearableGuard( const ClearableGuard& );
+ const ClearableGuard& operator = ( const ClearableGuard& );
+ protected:
+ T * pT;
+ public:
+
+ /** Acquires the object specified as parameter.
+ */
+ ClearableGuard(T * pT_) : pT(pT_)
+ {
+ pT->acquire();
+ }
+
+ /** Acquires the object specified as parameter.
+ */
+ ClearableGuard(T & t) : pT(&t)
+ {
+ pT->acquire();
+ }
+
+ /** Releases the mutex or interface if not already released by clear().
+ */
+ ~ClearableGuard()
+ {
+ if (pT)
+ pT->release();
+ }
+
+ /** Releases the mutex or interface.
+ */
+ void clear()
+ {
+ if(pT)
+ {
+ pT->release();
+ pT = NULL;
+ }
+ }
+ };
+
+ /** A helper class for mutex objects and interfaces.
+ */
+ template< class T >
+ class ResettableGuard : public ClearableGuard< T >
+ {
+ private:
+ ResettableGuard(ResettableGuard &); // not defined
+ void operator =(ResettableGuard &); // not defined
+
+ protected:
+ T* pResetT;
+ public:
+ /** Acquires the object specified as parameter.
+ */
+ ResettableGuard( T* pT_ ) :
+ ClearableGuard<T>( pT_ ),
+ pResetT( pT_ )
+ {}
+
+ /** Acquires the object specified as parameter.
+ */
+ ResettableGuard( T& rT ) :
+ ClearableGuard<T>( rT ),
+ pResetT( &rT )
+ {}
+
+ /** Re-aquires the mutex or interface.
+ */
+ void reset()
+ {
+ if( pResetT )
+ {
+ this->pT = pResetT;
+ this->pT->acquire();
+ }
+ }
+ };
+
+ typedef Guard<Mutex> MutexGuard;
+ typedef ClearableGuard<Mutex> ClearableMutexGuard;
+ typedef ResettableGuard< Mutex > ResettableMutexGuard;
+}
+
+#endif /* __cplusplus */
+#endif /* _OSL_MUTEX_HXX_ */
+
diff --git a/sal/inc/osl/nlsupport.h b/sal/inc/osl/nlsupport.h
new file mode 100644
index 000000000000..7ded09293442
--- /dev/null
+++ b/sal/inc/osl/nlsupport.h
@@ -0,0 +1,60 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _OSL_NLSUPPORT_H_
+#define _OSL_NLSUPPORT_H_
+
+# include <rtl/locale.h>
+# include <rtl/textenc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ Determines the text encoding used by the underlying platform for the
+ specified locale.
+
+ @param pLocale
+ the locale to return the text encoding for. If this parameter is NULL,
+ the default locale of the current process is used.
+
+ @returns the rtl_TextEncoding that matches the platform specific encoding
+ description or RTL_TEXTENCODING_DONTKNOW if no mapping is available.
+*/
+
+rtl_TextEncoding SAL_CALL osl_getTextEncodingFromLocale( rtl_Locale * pLocale );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_NLSUPPORT_H_ */
+
+
diff --git a/sal/inc/osl/pipe.h b/sal/inc/osl/pipe.h
new file mode 100644
index 000000000000..aec479777cdb
--- /dev/null
+++ b/sal/inc/osl/pipe.h
@@ -0,0 +1,102 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _OSL_PIPE_H_
+#define _OSL_PIPE_H_
+
+# include <rtl/ustring.h>
+
+
+# include <osl/security.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ osl_Pipe_E_None, /* no error */
+ osl_Pipe_E_NotFound, /* Pipe could not be found */
+ osl_Pipe_E_AlreadyExists, /* Pipe already exists */
+ osl_Pipe_E_NoProtocol, /* Protocol not available */
+ osl_Pipe_E_NetworkReset, /* Network dropped connection because of reset */
+ osl_Pipe_E_ConnectionAbort, /* Software caused connection abort */
+ osl_Pipe_E_ConnectionReset, /* Connection reset by peer */
+ osl_Pipe_E_NoBufferSpace, /* No buffer space available */
+ osl_Pipe_E_TimedOut, /* Connection timed out */
+ osl_Pipe_E_ConnectionRefused, /* Connection refused */
+ osl_Pipe_E_invalidError, /* unmapped error: always last entry in enum! */
+ osl_Pipe_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslPipeError;
+
+typedef sal_uInt32 oslPipeOptions;
+#define osl_Pipe_OPEN 0x0000 /* open existing pipe */
+#define osl_Pipe_CREATE 0x0001 /* create pipe and open it, fails if already existst */
+
+typedef struct oslPipeImpl * oslPipe;
+
+/**
+ */
+oslPipe SAL_CALL osl_createPipe(rtl_uString *strPipeName, oslPipeOptions Options, oslSecurity Security);
+
+/** decreases the refcount of the pipe.
+ If the refcount drops to zero, the handle is destroyed.
+ */
+void SAL_CALL osl_releasePipe( oslPipe );
+
+/** increases the refcount of the pipe.
+ */
+void SAL_CALL osl_acquirePipe( oslPipe Pipe );
+
+/** closes the pipe, any read,write or accept actions stop immeadiatly.
+ */
+void SAL_CALL osl_closePipe( oslPipe );
+
+
+oslPipe SAL_CALL osl_acceptPipe(oslPipe Pipe);
+
+sal_Int32 SAL_CALL osl_sendPipe(oslPipe Pipe, const void* pBuffer, sal_Int32 BufferSize);
+sal_Int32 SAL_CALL osl_receivePipe(oslPipe Pipe, void* pBuffer, sal_Int32 BufferSize);
+
+/** Reads blocking from the pipe.
+ @return Number of read bytes. If less than BufferSize, the pipe was closed.
+ */
+sal_Int32 SAL_CALL osl_readPipe( oslPipe Pipe, void *pBuffer, sal_Int32 BufferSize );
+
+/** Writes blocking onto the pipe.
+ @return Number of written bytes. If less than BufferSize, the pipe was closed.
+ */
+sal_Int32 SAL_CALL osl_writePipe( oslPipe Pipe, const void *pBuffer, sal_Int32 BufferSize );
+
+oslPipeError SAL_CALL osl_getLastPipeError(oslPipe Pipe);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_PIPE_H_ */
+
diff --git a/sal/inc/osl/pipe.hxx b/sal/inc/osl/pipe.hxx
new file mode 100644
index 000000000000..7ad85d86bcfc
--- /dev/null
+++ b/sal/inc/osl/pipe.hxx
@@ -0,0 +1,212 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _OSL_PIPE_HXX_
+#define _OSL_PIPE_HXX_
+
+#include <osl/pipe_decl.hxx>
+
+namespace osl
+{
+ //______________________________________________________________________________
+ inline Pipe::Pipe()
+ : m_handle( 0 )
+ {}
+
+ //______________________________________________________________________________
+ inline Pipe::Pipe(const ::rtl::OUString& strName, oslPipeOptions Options )
+ : m_handle( osl_createPipe( strName.pData, Options , 0 ) )
+ {}
+
+ //______________________________________________________________________________
+ inline Pipe::Pipe(const ::rtl::OUString& strName, oslPipeOptions Options,const Security & rSecurity)
+ : m_handle( osl_createPipe( strName.pData, Options , rSecurity.getHandle() ) )
+ {}
+
+ //______________________________________________________________________________
+ inline Pipe::Pipe(const Pipe& pipe )
+ : m_handle( pipe.m_handle )
+ {
+ if( m_handle )
+ osl_acquirePipe( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline Pipe::Pipe( oslPipe pipe, __sal_NoAcquire )
+ : m_handle ( pipe )
+ {}
+
+ //______________________________________________________________________________
+ inline Pipe::Pipe(oslPipe pipe)
+ : m_handle( pipe )
+ {
+ if( m_handle )
+ osl_acquirePipe( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline Pipe::~Pipe()
+ {
+ if( m_handle )
+ osl_releasePipe( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Pipe::create( const ::rtl::OUString & strName,
+ oslPipeOptions Options, const Security &rSec )
+ {
+ *this = Pipe( strName, Options, rSec );
+ return is();
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Pipe::create( const ::rtl::OUString & strName, oslPipeOptions Options )
+ {
+ *this = Pipe( strName, Options );
+ return is();
+ }
+ //______________________________________________________________________________
+ inline Pipe& SAL_CALL Pipe::operator= (const Pipe& pipe)
+ {
+ *this = pipe.getHandle();
+ return *this;
+ }
+
+ //______________________________________________________________________________
+ inline Pipe & SAL_CALL Pipe::operator=( oslPipe pipe)
+ {
+ if( pipe )
+ osl_acquirePipe( pipe );
+ if( m_handle )
+ osl_releasePipe( m_handle );
+ m_handle = pipe;
+ return *this;
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool SAL_CALL Pipe::is() const
+ {
+ return m_handle != 0;
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool SAL_CALL Pipe::operator==( const Pipe& rPipe ) const
+ {
+ return m_handle == rPipe.m_handle;
+ }
+
+ //______________________________________________________________________________
+ inline void SAL_CALL Pipe::close()
+ {
+ osl_closePipe( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline void SAL_CALL Pipe::clear()
+ {
+ if( m_handle )
+ {
+ osl_releasePipe( m_handle );
+ m_handle = 0;
+ }
+ }
+
+ //______________________________________________________________________________
+ inline oslPipeError SAL_CALL Pipe::accept(StreamPipe& Connection)
+ {
+ Connection = StreamPipe( osl_acceptPipe( m_handle ), SAL_NO_ACQUIRE);
+ if( Connection.is() )
+ return osl_Pipe_E_None;
+ else
+ return getError();
+ }
+
+ //______________________________________________________________________________
+ inline oslPipeError SAL_CALL Pipe::getError() const
+ {
+ return osl_getLastPipeError( 0 );
+ }
+
+ //______________________________________________________________________________
+ inline oslPipe SAL_CALL Pipe::getHandle() const
+ {
+ return m_handle;
+ }
+
+ //______________________________________________________________________________
+ inline StreamPipe::StreamPipe(){}
+
+ //______________________________________________________________________________
+ inline StreamPipe::StreamPipe(oslPipe hPipe)
+ : Pipe( hPipe )
+ {
+ }
+
+ //______________________________________________________________________________
+ inline StreamPipe::StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options, const Security &rSec )
+ : Pipe( strName, Options , rSec )
+ {}
+
+ //______________________________________________________________________________
+ inline StreamPipe::StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options )
+ : Pipe( strName, Options )
+ {}
+
+ //______________________________________________________________________________
+ inline StreamPipe::StreamPipe(const StreamPipe& aPipe)
+ : Pipe( aPipe )
+ {}
+ //______________________________________________________________________________
+ inline StreamPipe::StreamPipe( oslPipe pipe, __sal_NoAcquire noacquire )
+ : Pipe( pipe , noacquire )
+ {}
+
+ //______________________________________________________________________________
+ inline sal_Int32 SAL_CALL StreamPipe::read(void* pBuffer, sal_Int32 n) const
+ {
+ return osl_readPipe( m_handle, pBuffer, n );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 SAL_CALL StreamPipe::write(const void* pBuffer, sal_Int32 n) const
+ {
+ return osl_writePipe( m_handle, pBuffer , n );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 SAL_CALL StreamPipe::recv(void* pBuffer, sal_Int32 BytesToRead) const
+ {
+ return osl_receivePipe( m_handle, pBuffer , BytesToRead );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 SAL_CALL StreamPipe::send(const void* pBuffer, sal_Int32 BytesToSend) const
+ {
+ return osl_sendPipe( m_handle, pBuffer , BytesToSend );
+ }
+
+}
+#endif
diff --git a/sal/inc/osl/pipe_decl.hxx b/sal/inc/osl/pipe_decl.hxx
new file mode 100644
index 000000000000..65756ddd2f6b
--- /dev/null
+++ b/sal/inc/osl/pipe_decl.hxx
@@ -0,0 +1,235 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _OSL_PIPE_DECL_HXX_
+#define _OSL_PIPE_DECL_HXX_
+
+#include <osl/pipe.h>
+# include <osl/security.hxx>
+#include <rtl/ustring.hxx>
+
+namespace osl {
+
+class StreamPipe;
+
+/** Represents a pipe.
+*/
+class Pipe
+{
+protected:
+ oslPipe m_handle;
+
+public:
+
+ /** Does not create a pipe. Use assignment operator to
+ make this a useable pipe.
+ */
+ inline Pipe();
+
+ /** Creates an insecure pipe that is accessible for all users.
+ @param strName
+ @param Options
+ */
+ inline Pipe(const ::rtl::OUString& strName, oslPipeOptions Options);
+
+ /** Creates a secure pipe that access depends on the umask settings.
+ @param strName
+ @param Options
+ @param Security
+ */
+ inline Pipe(const ::rtl::OUString& strName, oslPipeOptions Options,const Security & rSecurity);
+
+ /** Copy constructor.
+ */
+ inline Pipe(const Pipe& pipe);
+
+ /** Constructs a Pipe reference without acquiring the handle
+ */
+ inline Pipe( oslPipe pipe, __sal_NoAcquire noacquire );
+
+ /** Creates pipe as wrapper around the underlying oslPipe.
+ @param Pipe
+ */
+ inline Pipe(oslPipe Pipe);
+
+ /** Destructor. Destroys the underlying oslPipe.
+ */
+ inline ~Pipe();
+
+ inline sal_Bool SAL_CALL is() const;
+
+ /** Creates an insecure pipe that is accessible for all users
+ with the given attributes.
+ If the pipe was already created, the old one will be discarded.
+ @param strName
+ @param Options
+ @param Security
+ @return True if socket was successfully created.
+ */
+ inline sal_Bool create( const ::rtl::OUString & strName,
+ oslPipeOptions Options, const Security &rSec );
+
+ /** Creates a secure that access rights depend on the umask settings
+ with the given attributes.
+
+ If socket was already created, the old one will be discarded.
+ @param strName
+ @param Options
+ @return True if socket was successfully created.
+ */
+ inline sal_Bool create( const ::rtl::OUString & strName, oslPipeOptions Options = osl_Pipe_OPEN );
+
+ /** releases the underlying handle
+ */
+ inline void SAL_CALL clear();
+
+ /** Assignment operator. If pipe was already created, the old one will
+ be discarded.
+ */
+ inline Pipe& SAL_CALL operator= (const Pipe& pipe);
+
+ /** Assignment operator. If pipe was already created, the old one will
+ be discarded.
+ */
+ inline Pipe& SAL_CALL operator= (const oslPipe pipe );
+
+ /** Checks if the pipe is valid.
+ @return True if the object represents a valid pipe.
+ */
+ inline sal_Bool SAL_CALL isValid() const;
+
+ inline sal_Bool SAL_CALL operator==( const Pipe& rPipe ) const;
+
+ /** Closes the pipe.
+ */
+ inline void SAL_CALL close();
+
+ /** Accept connection on an existing pipe
+ */
+ inline oslPipeError SAL_CALL accept(StreamPipe& Connection);
+
+
+ /** Delivers a constant decribing the last error for the pipe system.
+ @return ENONE if no error occured, invalid_PipeError if
+ an unknown (unmapped) error occured, otherwise an enum describing the
+ error.
+ */
+ inline oslPipeError SAL_CALL getError() const;
+
+ inline oslPipe SAL_CALL getHandle() const;
+};
+
+/** A pipe to send or receive a stream of data.
+*/
+class StreamPipe : public Pipe
+{
+public:
+
+ /** Creates an unattached pipe. You must attach the pipe to an oslPipe
+ e.g. by using the operator=(oslPipe), before you can use the stream-
+ functionality of the object.
+ */
+ inline StreamPipe();
+
+ /** Creates pipe as wrapper around the underlying oslPipe.
+ @param Pipe
+ */
+ inline StreamPipe(oslPipe Pipe);
+
+ /** Copy constructor.
+ @param Pipe
+ */
+ inline StreamPipe(const StreamPipe& Pipe);
+
+ /** Creates a pipe.
+ @param strName
+ @param Options
+ */
+ inline StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options = osl_Pipe_OPEN);
+
+ /** Creates a pipe.
+ @param strName
+ @param Options
+ @param rSec
+ */
+ inline StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options, const Security &rSec );
+
+ /** Constructs a Pipe reference without acquiring the handle
+ */
+ inline StreamPipe( oslPipe pipe, __sal_NoAcquire noacquire );
+
+ /** Attaches the oslPipe to this object. If the object
+ already was attached to an oslPipe, the old one will
+ be closed and destroyed.
+ @param Pipe.
+ */
+ inline StreamPipe & SAL_CALL operator=(oslPipe Pipe);
+
+ /** Assignment operator
+ */
+ inline StreamPipe& SAL_CALL operator=(const Pipe& pipe);
+
+ /** Tries to receives BytesToRead data from the connected pipe,
+
+ @param pBuffer [out] Points to a buffer that will be filled with the received
+ data.
+ @param BytesToRead [in] The number of bytes to read. pBuffer must have at least
+ this size.
+ @return the number of received bytes.
+ */
+ inline sal_Int32 SAL_CALL recv(void* pBuffer, sal_Int32 BytesToRead) const;
+
+ /** Tries to sends BytesToSend data from the connected pipe.
+
+ @param pBuffer [in] Points to a buffer that contains the send-data.
+ @param BytesToSend [in] The number of bytes to send. pBuffer must have at least
+ this size.
+ @return the number of transfered bytes.
+ */
+ inline sal_Int32 SAL_CALL send(const void* pBuffer, sal_Int32 BytesToSend) const;
+
+ /** Retrieves n bytes from the stream and copies them into pBuffer.
+ The method avoids incomplete reads due to packet boundaries.
+ @param pBuffer receives the read data.
+ @param n the number of bytes to read. pBuffer must be large enough
+ to hold the n bytes!
+ @return the number of read bytes. The number will only be smaller than
+ n if an exceptional condition (e.g. connection closed) occurs.
+ */
+ inline sal_Int32 SAL_CALL read(void* pBuffer, sal_Int32 n) const;
+
+ /** Writes n bytes from pBuffer to the stream. The method avoids
+ incomplete writes due to packet boundaries.
+ @param pBuffer contains the data to be written.
+ @param n the number of bytes to write.
+ @return the number of written bytes. The number will only be smaller than
+ n if an exceptional condition (e.g. connection closed) occurs.
+ */
+ sal_Int32 SAL_CALL write(const void* pBuffer, sal_Int32 n) const;
+};
+
+}
+#endif
diff --git a/sal/inc/osl/process.h b/sal/inc/osl/process.h
new file mode 100644
index 000000000000..0a0d3f6eaf7c
--- /dev/null
+++ b/sal/inc/osl/process.h
@@ -0,0 +1,443 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _OSL_PROCESS_H_
+#define _OSL_PROCESS_H_
+
+#include <rtl/ustring.h>
+#include <rtl/textenc.h>
+#include <rtl/locale.h>
+
+#include <osl/time.h>
+#include <osl/file.h>
+#include <osl/pipe.h>
+#include <osl/socket.h>
+#include <osl/security.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+typedef sal_Int32 oslProcessOption;
+#define osl_Process_WAIT 0x0001 /* wait for completion */
+#define osl_Process_SEARCHPATH 0x0002 /* search path for executable */
+#define osl_Process_DETACHED 0x0004 /* run detached */
+#define osl_Process_NORMAL 0x0000 /* run in normal window */
+#define osl_Process_HIDDEN 0x0010 /* run hidden */
+#define osl_Process_MINIMIZED 0x0020 /* run in minimized window */
+#define osl_Process_MAXIMIZED 0x0040 /* run in maximized window */
+#define osl_Process_FULLSCREEN 0x0080 /* run in fullscreen window */
+
+typedef sal_Int32 oslProcessData;
+
+/* defines for osl_getProcessInfo , can be OR'ed */
+#define osl_Process_IDENTIFIER 0x0001 /* retrieves the process identifier */
+#define osl_Process_EXITCODE 0x0002 /* retrieves exit code of the process */
+#define osl_Process_CPUTIMES 0x0004 /* retrieves used cpu time */
+#define osl_Process_HEAPUSAGE 0x0008 /* retrieves the used size of heap */
+
+typedef sal_uInt32 oslProcessIdentifier;
+typedef sal_uInt32 oslProcessExitCode;
+
+typedef enum {
+ osl_Process_E_None, /* no error */
+ osl_Process_E_NotFound, /* image not found */
+ osl_Process_E_TimedOut, /* timout occured */
+ osl_Process_E_NoPermission, /* permission denied */
+ osl_Process_E_Unknown, /* unknown error */
+ osl_Process_E_InvalidError, /* unmapped error */
+ osl_Process_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslProcessError;
+
+typedef enum {
+ osl_Process_TypeNone, /* no descriptor */
+ osl_Process_TypeSocket, /* socket */
+ osl_Process_TypeFile, /* file */
+ osl_Process_TypePipe, /* pipe */
+ osl_Process_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslDescriptorType;
+
+typedef sal_Int32 oslDescriptorFlag;
+#define osl_Process_DFNONE 0x0000
+#define osl_Process_DFWAIT 0x0001
+
+#ifdef SAL_W32
+# pragma pack(push, 8)
+#elif defined(SAL_OS2)
+# pragma pack(push, 4)
+#endif
+
+typedef struct {
+ sal_uInt32 Size;
+ oslProcessData Fields;
+ oslProcessIdentifier Ident;
+ oslProcessExitCode Code;
+ TimeValue UserTime;
+ TimeValue SystemTime;
+ sal_uInt32 HeapUsage;
+} oslProcessInfo;
+
+#if defined( SAL_W32) || defined(SAL_OS2)
+# pragma pack(pop)
+#endif
+
+/** Process handle
+
+ @see osl_executeProcess
+ @see osl_terminateProcess
+ @see osl_freeProcessHandle
+ @see osl_getProcessInfo
+ @see osl_joinProcess
+*/
+typedef void* oslProcess;
+
+/** Execute a process.
+
+ Executes the program image provided in strImageName in a new process.
+
+ @param ustrImageName
+ [in] The file URL of the executable to be started.
+ Can be NULL in this case the file URL of the executable must be the first element
+ in ustrArguments.
+
+ @param ustrArguments
+ [in] An array of argument strings. Can be NULL if strImageName is not NULL.
+ If strImageName is NULL it is expected that the first element contains
+ the file URL of the executable to start.
+
+ @param nArguments
+ [in] The number of arguments provided. If this number is 0 strArguments will be ignored.
+
+ @param Options
+ [in] A combination of int-constants to describe the mode of execution.
+
+ @param Security
+ [in] The user and his rights for which the process is started. May be NULL in which case
+ the process will be started in the context of the current user.
+
+ @param ustrDirectory
+ [in] The file URL of the working directory of the new proces. If the specified directory
+ does not exist or is inaccessible the working directory of the newly created process
+ is undefined. If this parameter is NULL or the caller provides an empty string the
+ new process will have the same current working directory as the calling process.
+
+ @param ustrEnviroments
+ [in] An array of strings describing environment variables that should be merged into the
+ environment of the new process. Each string has to be in the form "variable=value".
+ This parameter can be NULL in which case the new process gets the same environment
+ as the parent process.
+
+ @param nEnvironmentVars
+ [in] The number of environment variables to set.
+
+ @param pProcess
+ [out] Pointer to a oslProcess variable, wich receives the handle of the newly created process.
+ This parameter must not be NULL.
+
+ @return
+ <dl>
+ <dt>osl_Process_E_None</dt>
+ <dd>on success</dd>
+ <dt>osl_Process_E_NotFound</dt>
+ <dd>if the specified executable could not be found</dd>
+ <dt>osl_Process_E_InvalidError</dt>
+ <dd>if invalid parameters will be detected</dd>
+ <dt>osl_Process_E_Unknown</dt>
+ <dd>if arbitrary other errors occur</dd>
+ </dl>
+
+ @see oslProcessOption
+ @see osl_executeProcess_WithRedirectedIO
+ @see osl_freeProcessHandle
+ @see osl_loginUser
+*/
+oslProcessError SAL_CALL osl_executeProcess(
+ rtl_uString* ustrImageName,
+ rtl_uString* ustrArguments[],
+ sal_uInt32 nArguments,
+ oslProcessOption Options,
+ oslSecurity Security,
+ rtl_uString* ustrDirectory,
+ rtl_uString* ustrEnvironments[],
+ sal_uInt32 nEnvironmentVars,
+ oslProcess* pProcess);
+
+
+/** Execute a process and redirect child process standard IO.
+
+ @param ustrImageName
+ [in] The file URL of the executable to be started.
+ Can be NULL in this case the file URL of the executable must be the first element
+ in ustrArguments.
+
+ @param ustrArguments
+ [in] An array of argument strings. Can be NULL if strImageName is not NULL.
+ If strImageName is NULL it is expected that the first element contains
+ the file URL of the executable to start.
+
+ @param nArguments
+ [in] The number of arguments provided. If this number is 0 strArguments will be ignored.
+
+ @param Options
+ [in] A combination of int-constants to describe the mode of execution.
+
+ @param Security
+ [in] The user and his rights for which the process is started. May be NULL in which case
+ the process will be started in the context of the current user.
+
+ @param ustrDirectory
+ [in] The file URL of the working directory of the new proces. If the specified directory
+ does not exist or is inaccessible the working directory of the newly created process
+ is undefined. If this parameter is NULL or the caller provides an empty string the
+ new process will have the same current working directory as the calling process.
+
+ @param ustrEnviroments
+ [in] An array of strings describing environment variables that should be merged into the
+ environment of the new process. Each string has to be in the form "variable=value".
+ This parameter can be NULL in which case the new process gets the same environment
+ as the parent process.
+
+ @param nEnvironmentVars
+ [in] The number of environment variables to set.
+
+ @param pProcess
+ [out] Pointer to a oslProcess variable, wich receives the handle of the newly created process.
+ This parameter must not be NULL.
+
+ @param pChildInputWrite
+ [in] Pointer to a oslFileHandle variable that receives the handle which can be used to write
+ to the child process standard input device. The returned handle is not random accessible.
+ The handle has to be closed with osl_closeFile if no longer used. This parameter can be NULL.
+
+ @param pChildOutputRead
+ [in] Pointer to a oslFileHandle variable that receives the handle which can be used to read from
+ the child process standard output device. The returned handle is not random accessible.
+ The Handle has to be closed with osl_closeFile if no longer used. This parameter can be NULL.
+
+ @param pChildErrorRead
+ [in] Pointer to a oslFileHandle variable that receives the handle which can be used to read from
+ the child process standard error device. The returned handle is not random accessible.
+ The Handle has to be closed with osl_closeFile if no longer used. This parameter can be NULL.
+
+ @return
+ <dl>
+ <dt>osl_Process_E_None</dt>
+ <dd>on success</dd>
+ <dt>osl_Process_E_NotFound</dt>
+ <dd>if the specified executable could not be found</dd>
+ <dt>osl_Process_E_InvalidError</dt>
+ <dd>if invalid parameters will be detected</dd>
+ <dt>osl_Process_E_Unknown</dt>
+ <dd>if arbitrary other errors occur</dd>
+ </dl>
+
+ @see oslProcessOption
+ @see osl_executeProcess
+ @see osl_freeProcessHandle
+ @see osl_loginUser
+ @see osl_closeFile
+*/
+oslProcessError SAL_CALL osl_executeProcess_WithRedirectedIO(
+ rtl_uString* strImageName,
+ rtl_uString* ustrArguments[],
+ sal_uInt32 nArguments,
+ oslProcessOption Options,
+ oslSecurity Security,
+ rtl_uString* ustrDirectory,
+ rtl_uString* ustrEnvironments[],
+ sal_uInt32 nEnvironmentVars,
+ oslProcess* pProcess,
+ oslFileHandle* pChildInputWrite,
+ oslFileHandle* pChildOutputRead,
+ oslFileHandle* pChildErrorRead);
+
+/** Terminate a process
+ @param Process [in] the handle of the process to be terminated
+
+ @see osl_executeProcess
+ @see osl_getProcess
+ @see osl_joinProcess
+ */
+oslProcessError SAL_CALL osl_terminateProcess(oslProcess Process);
+
+
+/** @deprecated
+ Retrieve the process handle of a process identifier
+ @param Ident [in] a process identifier
+
+ @return the process handle on success, NULL in all other cases
+ */
+oslProcess SAL_CALL osl_getProcess(oslProcessIdentifier Ident);
+
+
+/** Free the specified proces-handle.
+ @param Process [in]
+*/
+void SAL_CALL osl_freeProcessHandle(oslProcess Process);
+
+
+/** Wait for completation of the specified childprocess.
+ @param Process [in]
+ @return ols_Process_E_None
+ @see osl_executeProcess
+*/
+oslProcessError SAL_CALL osl_joinProcess(oslProcess Process);
+
+/** Wait with a timeout for the completion of the specified child
+ process.
+
+ @param Process [in]
+ A process identifier.
+
+ @param pTimeout [in]
+ A timeout value or NULL for infinite waiting.
+ The unit of resolution is second.
+
+ @return
+ osl_Process_E_None on success
+ osl_Process_E_TimedOut waiting for the child process timed out
+ osl_Process_E_Unknown an error occured or the parameter are invalid
+
+ @see osl_executeProcess
+*/
+oslProcessError SAL_CALL osl_joinProcessWithTimeout(oslProcess Process, const TimeValue* pTimeout);
+
+/** Retrieves information about a Process
+ @param Process [in] the process handle of the process
+ @param Field [in] the information which is to be retrieved
+ this can be one or more of
+ osl_Process_IDENTIFIER
+ osl_Process_EXITCODE
+ osl_Process_CPUTIMES
+ osl_Process_HEAPUSAGE
+ @param pInfo [out] a pointer to a vaid oslProcessInfo structure.
+ the Size field has to be initialized with the size
+ of the oslProcessInfo structure.
+ on success the the Field member holds the (or'ed)
+ retrieved valid information fields.
+ @return osl_Process_E_None on success, osl_Process_E_Unknown on failure.
+ */
+oslProcessError SAL_CALL osl_getProcessInfo(oslProcess Process, oslProcessData Fields,
+ oslProcessInfo* pInfo);
+
+/** Get the filename of the executable.
+ @param strFile [out] the string that receives the executable file path.
+ @return osl_Process_E_None or does not return.
+ @see osl_executeProcess
+*/
+oslProcessError SAL_CALL osl_getExecutableFile(rtl_uString **strFile);
+
+/** @return the number of commandline arguments passed to the main-function of
+ this process
+ @see osl_getCommandArg
+*/
+sal_uInt32 SAL_CALL osl_getCommandArgCount(void);
+
+/** Get the nArg-th command-line argument passed to the main-function of this process.
+ @param nArg [in] The number of the argument to return.
+ @param strCommandArg [out] The string receives the nArg-th command-line argument.
+ @return osl_Process_E_None or does not return.
+ @see osl_executeProcess
+*/
+oslProcessError SAL_CALL osl_getCommandArg(sal_uInt32 nArg, rtl_uString **strCommandArg);
+
+/** Set the command-line arguments as passed to the main-function of this process.
+
+ Depricated: This function is only for internal use. Passing the args from main will
+ only work for Unix, on Windows there's no effect, the full command line will automtically
+ be taken. This is due to Windows 9x/ME limitation that don't allow UTF-16 wmain to provide
+ a osl_setCommandArgsU( int argc, sal_Unicode **argv );
+
+ @param argc [in] The number of elements in the argv array.
+ @param argv [in] The array of command-line arguments.
+ @see osl_getExecutableFile
+ @see osl_getCommandArgCount
+ @see osl_getCommandArg
+*/
+void SAL_CALL osl_setCommandArgs (int argc, char **argv);
+
+/** Get the value of one enviroment variable.
+ @param strVar [in] denotes the name of the variable to get.
+ @param strValue [out] string that receives the value of environment variable.
+*/
+oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *strVar, rtl_uString **strValue);
+
+/** Set the value of one enviroment variable.
+ @param strVar [in] denotes the name of the variable to set.
+ @param strValue [in] string of the new value of environment variable.
+
+ @since UDK 3.2.13
+*/
+oslProcessError SAL_CALL osl_setEnvironment(rtl_uString *strVar, rtl_uString *strValue);
+
+/** Unsets the value of one enviroment variable.
+ @param strVar [in] denotes the name of the variable to unset.
+
+ @since UDK 3.2.13
+*/
+oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString *strVar);
+
+/** Get the working directory of the current process as a file URL.
+
+ The file URL is encoded as common for the OSL file API.
+ @param pustrWorkingDir [out] string that receives the working directory file URL.
+*/
+
+oslProcessError SAL_CALL osl_getProcessWorkingDir( rtl_uString **pustrWorkingDir );
+
+/** Get the locale the process is currently running in.
+
+ The unix implementation caches the value it returns, so if you have to change the locale
+ your are running in, you will have to use osl_setProcessLocale therefor.
+
+ @param ppLocale [out] a pointer that receives the currently selected locale structure
+ @see osl_setProcessLocale
+*/
+
+oslProcessError SAL_CALL osl_getProcessLocale( rtl_Locale ** ppLocale );
+
+/** Change the locale of the process.
+
+ @param pLocale [in] a pointer to the locale to be set
+ @see osl_getProcessLocale
+*/
+
+oslProcessError SAL_CALL osl_setProcessLocale( rtl_Locale * pLocale );
+
+
+sal_Bool SAL_CALL osl_sendResourcePipe(oslPipe Pipe, oslSocket Socket);
+
+oslSocket SAL_CALL osl_receiveResourcePipe(oslPipe Pipe);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_PROCESS_H_ */
+
diff --git a/sal/inc/osl/profile.h b/sal/inc/osl/profile.h
new file mode 100644
index 000000000000..d4d7299aebff
--- /dev/null
+++ b/sal/inc/osl/profile.h
@@ -0,0 +1,140 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_PROFILE_H_
+#define _OSL_PROFILE_H_
+
+#include <sal/types.h>
+#include <rtl/ustring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef sal_uInt32 oslProfileOption;
+
+#define osl_Profile_DEFAULT 0x0000
+#define osl_Profile_SYSTEM 0x0001 /* use system depended functinality */
+#define osl_Profile_READLOCK 0x0002 /* lock file for reading */
+#define osl_Profile_WRITELOCK 0x0004 /* lock file for writing */
+#define osl_Profile_FLUSHWRITE 0x0010 /* writing only with flush */
+
+
+typedef void* oslProfile;
+
+/** Deprecated API.
+ Open or create a configuration profile.
+ @return 0 if the profile could not be created, otherwise a handle to the profile.
+ @deprecated
+*/
+oslProfile SAL_CALL osl_openProfile(rtl_uString *strProfileName, oslProfileOption Options);
+
+/** Deprecated API.
+ Close the opened profile an flush all data to the disk.
+ @param Profile handle to a opened profile.
+ @deprecated
+*/
+sal_Bool SAL_CALL osl_closeProfile(oslProfile Profile);
+
+
+/** Deprecated API.
+ @deprecated
+*/
+sal_Bool SAL_CALL osl_flushProfile(oslProfile Profile);
+/** Deprecated API.
+ @deprecated
+*/
+sal_Bool SAL_CALL osl_readProfileString(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Char* pszString, sal_uInt32 MaxLen,
+ const sal_Char* pszDefault);
+/** Deprecated API.
+ @deprecated
+*/
+sal_Bool SAL_CALL osl_readProfileBool(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Bool Default);
+/** Deprecated API.
+ @deprecated
+*/
+sal_uInt32 SAL_CALL osl_readProfileIdent(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_uInt32 FirstId, const sal_Char* Strings[],
+ sal_uInt32 Default);
+
+/** Deprecated API.
+ @deprecated
+*/
+sal_Bool SAL_CALL osl_writeProfileString(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ const sal_Char* pszString);
+/** Deprecated API.
+ @deprecated
+*/
+sal_Bool SAL_CALL osl_writeProfileBool(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Bool Value);
+/** Deprecated API.
+ @deprecated
+*/
+sal_Bool SAL_CALL osl_writeProfileIdent(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_uInt32 FirstId, const sal_Char* Strings[],
+ sal_uInt32 Value);
+
+/** Deprecated API.
+ Acquire the mutex, block if already acquired by another thread.
+ @param Profile handle to a opened profile.
+ @return False if section or entry could not be found.
+ @deprecated
+*/
+sal_Bool SAL_CALL osl_removeProfileEntry(oslProfile Profile,
+ const sal_Char *pszSection, const sal_Char *pszEntry);
+
+/** Deprecated API.
+ Get all entries belonging to the specified section.
+ @param Profile handle to a opened profile.
+ @return Pointer to a array of pointers.
+ @deprecated
+*/
+sal_uInt32 SAL_CALL osl_getProfileSectionEntries(oslProfile Profile, const sal_Char *pszSection,
+ sal_Char* pszBuffer, sal_uInt32 MaxLen);
+
+/** Deprecated API.
+ Get all section entries
+ @param Profile handle to a opened profile.
+ @return Pointer to a array of pointers.
+ @deprecated
+*/
+sal_uInt32 SAL_CALL osl_getProfileSections(oslProfile Profile, sal_Char* pszBuffer, sal_uInt32 MaxLen);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_PROFILE_H_ */
+
diff --git a/sal/inc/osl/profile.hxx b/sal/inc/osl/profile.hxx
new file mode 100644
index 000000000000..a1fc0499172d
--- /dev/null
+++ b/sal/inc/osl/profile.hxx
@@ -0,0 +1,204 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_PROFILE_HXX_
+#define _OSL_PROFILE_HXX_
+
+#include "profile.h"
+#include <rtl/ustring.hxx>
+#include <string.h>
+#include <list>
+
+namespace osl {
+
+ typedef oslProfileOption ProfileOption;
+
+ const int Profile_DEFAULT = osl_Profile_DEFAULT;
+ const int Profile_SYSTEM = osl_Profile_SYSTEM; /* use system depended functinality */
+ const int Profile_READLOCK = osl_Profile_READLOCK; /* lock file for reading */
+ const int Profile_WRITELOCK = osl_Profile_WRITELOCK; /* lock file for writing */
+
+ /** Deprecated API.
+ @deprecated
+ */
+ class Profile {
+ oslProfile profile;
+
+ public:
+ /** Open or create a configuration profile.
+ @return 0 if the profile could not be created, otherwise a handle to the profile.
+ */
+ Profile(const rtl::OUString strProfileName, oslProfileOption Options = Profile_DEFAULT )
+ {
+ profile = osl_openProfile(strProfileName.pData, Options);
+ if( ! profile )
+ throw std::exception();
+ }
+
+
+ /** Close the opened profile an flush all data to the disk.
+ @param Profile handle to a opened profile.
+ */
+ ~Profile()
+ {
+ osl_closeProfile(profile);
+ }
+
+
+ sal_Bool flush()
+ {
+ return osl_flushProfile(profile);
+ }
+
+ rtl::OString readString( const rtl::OString& rSection, const rtl::OString& rEntry,
+ const rtl::OString& rDefault)
+ {
+ sal_Char aBuf[1024];
+ return osl_readProfileString( profile,
+ rSection,
+ rEntry,
+ aBuf,
+ sizeof( aBuf ),
+ rDefault ) ? rtl::OString( aBuf ) : rtl::OString();
+
+ }
+
+ sal_Bool readBool( const rtl::OString& rSection, const rtl::OString& rEntry, sal_Bool bDefault )
+ {
+ return osl_readProfileBool( profile, rSection, rEntry, bDefault );
+ }
+
+ sal_uInt32 readIdent(const rtl::OString& rSection, const rtl::OString& rEntry,
+ sal_uInt32 nFirstId, const std::list< rtl::OString >& rStrings,
+ sal_uInt32 nDefault)
+ {
+ int nItems = rStrings.size();
+ const sal_Char** pStrings = new const sal_Char*[ nItems+1 ];
+ std::list< rtl::OString >::const_iterator it = rStrings.begin();
+ nItems = 0;
+ while( it != rStrings.end() )
+ {
+ pStrings[ nItems++ ] = *it;
+ ++it;
+ }
+ pStrings[ nItems ] = NULL;
+ sal_uInt32 nRet = osl_readProfileIdent(profile, rSection, rEntry, nFirstId, pStrings, nDefault);
+ delete pStrings;
+ return nRet;
+ }
+
+ sal_Bool writeString(const rtl::OString& rSection, const rtl::OString& rEntry,
+ const rtl::OString& rString)
+ {
+ return osl_writeProfileString(profile, rSection, rEntry, rString);
+ }
+
+ sal_Bool writeBool(const rtl::OString& rSection, const rtl::OString& rEntry, sal_Bool Value)
+ {
+ return osl_writeProfileBool(profile, rSection, rEntry, Value);
+ }
+
+ sal_Bool writeIdent(const rtl::OString& rSection, const rtl::OString& rEntry,
+ sal_uInt32 nFirstId, const std::list< rtl::OString >& rStrings,
+ sal_uInt32 nValue)
+ {
+ int nItems = rStrings.size();
+ const sal_Char** pStrings = new const sal_Char*[ nItems+1 ];
+ std::list< rtl::OString >::const_iterator it = rStrings.begin();
+ nItems = 0;
+ while( it != rStrings.end() )
+ {
+ pStrings[ nItems++ ] = *it;
+ ++it;
+ }
+ pStrings[ nItems ] = NULL;
+ sal_Bool bRet =
+ osl_writeProfileIdent(profile, rSection, rEntry, nFirstId, pStrings, nValue );
+ delete pStrings;
+ return bRet;
+ }
+
+ /** Acquire the mutex, block if already acquired by another thread.
+ @param Profile handle to a opened profile.
+ @return False if section or entry could not be found.
+ */
+ sal_Bool removeEntry(const rtl::OString& rSection, const rtl::OString& rEntry)
+ {
+ return osl_removeProfileEntry(profile, rSection, rEntry);
+ }
+
+ /** Get all entries belonging to the specified section.
+ @param Profile handle to a opened profile.
+ @return Pointer to a array of pointers.
+ */
+ std::list< rtl::OString > getSectionEntries(const rtl::OString& rSection )
+ {
+ std::list< rtl::OString > aEntries;
+
+ // count buffer size necessary
+ int n = osl_getProfileSectionEntries( profile, rSection, NULL, 0 );
+ if( n > 1 )
+ {
+ sal_Char* pBuf = new sal_Char[ n+1 ];
+ osl_getProfileSectionEntries( profile, rSection, pBuf, n+1 );
+ int nLen;
+ for( n = 0; ( nLen = strlen( pBuf+n ) ); n += nLen+1 )
+ aEntries.push_back( rtl::OString( pBuf+n ) );
+ delete pBuf;
+ }
+
+ return aEntries;
+ }
+
+ /** Get all section entries
+ @param Profile handle to a opened profile.
+ @return Pointer to a array of pointers.
+ */
+ std::list< rtl::OString > getSections()
+ {
+ std::list< rtl::OString > aSections;
+
+ // count buffer size necessary
+ int n = osl_getProfileSections( profile, NULL, 0 );
+ if( n > 1 )
+ {
+ sal_Char* pBuf = new sal_Char[ n+1 ];
+ osl_getProfileSections( profile, pBuf, n+1 );
+ int nLen;
+ for( n = 0; ( nLen = strlen( pBuf+n ) ); n += nLen+1 )
+ aSections.push_back( rtl::OString( pBuf+n ) );
+ delete pBuf;
+ }
+
+ return aSections;
+ }
+ };
+}
+
+#endif /* _OSL_PROFILE_HXX_ */
+
+
diff --git a/sal/inc/osl/security.h b/sal/inc/osl/security.h
new file mode 100644
index 000000000000..9a6233a61702
--- /dev/null
+++ b/sal/inc/osl/security.h
@@ -0,0 +1,158 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SECURITY_H_
+#define _OSL_SECURITY_H_
+
+#include <rtl/ustring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ osl_Security_E_None,
+ osl_Security_E_UserUnknown,
+ osl_Security_E_WrongPassword,
+ osl_Security_E_Unknown,
+ osl_Security_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSecurityError;
+
+/** Process handle
+ @see osl_loginUser
+ @see osl_freeSecurityHandle
+ @see osl_executeProcess
+*/
+typedef void* oslSecurity;
+
+/** Create a security handle for the current user.
+ @return a security handle or NULL on failure.
+ @see osl_freeSecurityHandle
+ @see osl_executeProcess
+ @see osl_executeApplication
+*/
+oslSecurity SAL_CALL osl_getCurrentSecurity(void);
+
+/** Create a security handle for the denoted user.
+ Try to log in the user on the local system.
+ @param strzUserName [in] denotes the name of the user to logg in.
+ @param strPasswd [in] the password for this user.
+ @param pSecurity [out] returns the security handle if user could be logged in.
+ @return osl_Security_E_None if user could be logged in, otherwise an error-code.
+ @see osl_freeSecurityHandle
+ @see osl_executeProcess
+ @see osl_executeApplication
+*/
+oslSecurityError SAL_CALL osl_loginUser(
+ rtl_uString *strUserName,
+ rtl_uString *strPasswd,
+ oslSecurity *pSecurity
+ );
+
+/** Create a security handle for the denoted user.
+ Try to log in the user on the denoted file server. On success the homedir will be
+ the maped drive on this server.
+ @param strUserName [in] denotes the name of the user to logg in.
+ @param strPasswd [in] the password for this user.
+ @param strFileServer [in] denotes the file server on wich the user is logged in.
+ @param pSecurity [out] returns the security handle if user could be logged in.
+ @return osl_Security_E_None if user could be logged in, otherwise an error-code.
+ @see osl_freeSecurityHandle
+ @see osl_executeProcess
+ @see osl_executeApplication
+*/
+oslSecurityError SAL_CALL osl_loginUserOnFileServer(
+ rtl_uString *strUserName,
+ rtl_uString *strPasswd,
+ rtl_uString *strFileServer,
+ oslSecurity *pSecurity
+ );
+
+/** Query if the user who is denotes by this security has administrator rigths.
+ @param Security [in] the security handle for th user.
+ @return True, if the user has adminsitrator rights, otherwise false.
+*/
+sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security);
+
+/** Free the security handle, created by osl_loginUser or osl_getCurrentSecurity.
+ @param Security [in] the security handle.
+ @see osl_loginUser
+*/
+void SAL_CALL osl_freeSecurityHandle(oslSecurity Security);
+
+/** Get the login ident for the user of this security handle.
+ @param Security [in] the security handle.
+ @param strIdent [out] the string that receives the ident on success.
+ @return True, if the security handle is valid, otherwise False.
+*/
+sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, rtl_uString **strIdent);
+
+/** Get the login name for the user of this security handle.
+ @param Security [in] the security handle.
+ @param pszName [out] the string that receives the user name on success.
+ @return True, if the security handle is valid, otherwise False.
+*/
+sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **strName);
+
+/** Get the home directory of the user of this security handle.
+ @param Security [in] the security handle.
+ @param strDirectory [out] the string that receives the directory path on success.
+ @return True, if the security handle is valid, otherwise False.
+*/
+sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **strDirectory);
+
+/** Get the directory for configuration data of the user of this security handle.
+ @param Security [in] the security handle.
+ @param strDirectory [out] the string that receives the directory path on success.
+ @return True, if the security handle is valid, otherwise False.
+*/
+sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **strDirectory);
+
+
+/** Load Profile of the User
+ Implemented just for Windows
+ @param oslSecurity Security [in] previously fetch Security of the User
+ @return True if the Profile could successfully loaded, False otherwise.
+*/
+
+sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security);
+
+
+/** Unload a User Profile
+ Implemented just for Windows
+ @param oslSecurity Security [in] previously fetch Security of the User
+ @return nothing is returned!
+*/
+
+void SAL_CALL osl_unloadUserProfile(oslSecurity Security);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_SECURITY_H_ */
+
diff --git a/sal/inc/osl/security.hxx b/sal/inc/osl/security.hxx
new file mode 100644
index 000000000000..966e3279837d
--- /dev/null
+++ b/sal/inc/osl/security.hxx
@@ -0,0 +1,110 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SECURITY_HXX_
+#define _OSL_SECURITY_HXX_
+
+#include <rtl/ustring.hxx>
+
+#ifndef _OSL_SECURITY_DECL_HXX
+# include <osl/security_decl.hxx>
+#endif
+
+namespace osl
+{
+
+inline Security::Security()
+{
+ m_handle = osl_getCurrentSecurity();
+}
+
+inline Security::~Security()
+{
+ osl_freeSecurityHandle(m_handle);
+}
+
+inline sal_Bool Security::logonUser(const rtl::OUString& strName,
+ const rtl::OUString& strPasswd)
+{
+ osl_freeSecurityHandle(m_handle);
+
+ m_handle = 0;
+
+ return (osl_loginUser( strName.pData, strPasswd.pData, &m_handle)
+ == osl_Security_E_None);
+}
+
+inline sal_Bool Security::logonUser( const rtl::OUString& strName,
+ const rtl::OUString& strPasswd,
+ const rtl::OUString& strFileServer )
+{
+ osl_freeSecurityHandle(m_handle);
+
+ m_handle = NULL;
+
+ return (osl_loginUserOnFileServer(strName.pData, strPasswd.pData, strFileServer.pData, &m_handle)
+ == osl_Security_E_None);
+}
+
+inline sal_Bool Security::getUserIdent( rtl::OUString& strIdent) const
+{
+ return osl_getUserIdent( m_handle, &strIdent.pData );
+}
+
+
+inline sal_Bool Security::getUserName( rtl::OUString& strName ) const
+{
+ return osl_getUserName( m_handle, &strName.pData );
+}
+
+
+inline sal_Bool Security::getHomeDir( rtl::OUString& strDirectory) const
+{
+ return osl_getHomeDir(m_handle, &strDirectory.pData );
+}
+
+
+inline sal_Bool Security::getConfigDir( rtl::OUString& strDirectory ) const
+{
+ return osl_getConfigDir( m_handle, &strDirectory.pData );
+}
+
+inline sal_Bool Security::isAdministrator() const
+{
+ return osl_isAdministrator(m_handle);
+}
+
+inline oslSecurity Security::getHandle() const
+{
+ return m_handle;
+}
+
+
+}
+
+#endif // _OSL_SECURITY_HXX_
+
diff --git a/sal/inc/osl/security_decl.hxx b/sal/inc/osl/security_decl.hxx
new file mode 100644
index 000000000000..753469dff026
--- /dev/null
+++ b/sal/inc/osl/security_decl.hxx
@@ -0,0 +1,117 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SECURITY_DECL_HXX_
+#define _OSL_SECURITY_DECL_HXX_
+
+#include <rtl/ustring.hxx>
+# include <osl/security.h>
+
+namespace osl
+{
+
+/** capsulate security informations for one user.
+ A object of this class is used to execute a process with the rights an
+ security options of a scecified user.
+ @see Process::executeProcess
+*/
+class Security
+{
+protected:
+ oslSecurity m_handle;
+
+public:
+ /// constructor
+ inline Security();
+ /// destructor
+ inline ~Security();
+ /** get the security information for one user.
+ The underlying operating system is asked for this information.
+ @param strName [in] denotes the name of the user
+ @param strPasswd [in] denotes the password of this user
+ @return True, if the specified user is known by the underlying operating system,
+ otherwise False
+ */
+ inline sal_Bool SAL_CALL logonUser(const ::rtl::OUString& strName,
+ const ::rtl::OUString& strPasswd);
+ /** get the security information for one user.
+ This method will try to login the user at the denoted file server.
+ If a network resource named \\server\username exists and this resource
+ could be connected by this user, the methos will return true and getHomeDir
+ will return \\server\username.
+ @param strName [in] denotes the name of the user
+ @param strPasswd [in] denotes the password of this user
+ @return True, if the specified user is known by file server and the
+ could be connected, otherwise False
+ */
+ inline sal_Bool SAL_CALL logonUser(const ::rtl::OUString & strName,
+ const ::rtl::OUString & strPasswd,
+ const ::rtl::OUString & strFileServer);
+
+ /** get the ident of the logged in user.
+ @param strName [out] is the buffer which returns the name
+ @param max [in] is the size of this buffer
+ @return True, if any user is successfuly logged in, otherwise False
+ */
+ inline sal_Bool SAL_CALL getUserIdent( ::rtl::OUString& strIdent) const;
+
+ /** get the name of the logged in user.
+ @param strName [out] is the buffer which returns the name
+ @param max [in] is the size of this buffer
+ @return True, if any user is successfuly logged in, otherwise False
+ */
+ inline sal_Bool SAL_CALL getUserName( ::rtl::OUString& strName) const;
+
+ /** get the home directory of the logged in user.
+ @param strDirectory [out] is the buffer which returns the directory name
+ @param max [in] is the size of this buffer
+ @return True, if any user is successfuly logged in, otherwise False
+ */
+ inline sal_Bool SAL_CALL getHomeDir( ::rtl::OUString& strDirectory) const;
+
+ /** get the directory for configuration data of the logged in user.
+ @param strDirectory [out] is the buffer which returns the directory name
+ @param max [in] is the size of this buffer
+ @return True, if any user is successfuly logged in, otherwise False
+ */
+ inline sal_Bool SAL_CALL getConfigDir( ::rtl::OUString & strDirectory) const;
+
+ /** Query if the user who is logged inhas administrator rigths.
+ @return True, if the user has administrator rights, otherwise false.
+ */
+ inline sal_Bool SAL_CALL isAdministrator() const;
+
+ /** Returns the underlying oslSecurity handle
+ */
+ inline oslSecurity getHandle() const;
+
+};
+
+}
+
+#endif // _OSL_SECURITY_HXX_
+
diff --git a/sal/inc/osl/semaphor.h b/sal/inc/osl/semaphor.h
new file mode 100644
index 000000000000..c0c74515404a
--- /dev/null
+++ b/sal/inc/osl/semaphor.h
@@ -0,0 +1,95 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SEMAPHORE_H_
+#define _OSL_SEMAPHORE_H_
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* oslSemaphore;
+
+/** Creates a semaphore.<BR>
+
+ @deprecated
+ Must not be used, as unnamed semaphores are not supported on Mac OS X.
+
+ @param InitialCount denotes the starting value the semaphore. If you set it to
+ zero, the first acquire() blocks. Otherwise InitialCount acquire()s are
+ immedeatly successfull.
+ @return 0 if the semaphore could not be created, otherwise a handle to the sem.
+*/
+oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount);
+
+/** Release the OS-structures and free semaphore data-structure
+
+ @deprecated
+ Must not be used, as unnamed semaphores are not supported on Mac OS X.
+
+ @return fbbb
+*/
+void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore);
+
+/** acquire() decreases the count. It will block if it tries to
+ decrease below zero.
+
+ @deprecated
+ Must not be used, as unnamed semaphores are not supported on Mac OS X.
+
+ @return False if the system-call failed.
+*/
+sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore);
+
+/** tryToAcquire() tries to decreases the count. It will
+ return with False if it would decrease the count below zero.
+ (When acquire() would block.) If it could successfully
+ decrease the count, it will return True.
+
+ @deprecated
+ Must not be used, as unnamed semaphores are not supported on Mac OS X.
+*/
+sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore);
+
+/** release() increases the count.
+
+ @deprecated
+ Must not be used, as unnamed semaphores are not supported on Mac OS X.
+
+ @return False if the system-call failed.
+*/
+sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_SEMAPHORE_H_ */
+
+
diff --git a/sal/inc/osl/semaphor.hxx b/sal/inc/osl/semaphor.hxx
new file mode 100644
index 000000000000..a45737d27524
--- /dev/null
+++ b/sal/inc/osl/semaphor.hxx
@@ -0,0 +1,126 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SEMAPHORE_HXX_
+#define _OSL_SEMAPHORE_HXX_
+
+#ifdef __cplusplus
+
+#include <osl/semaphor.h>
+
+
+namespace osl
+{
+ /** C++ wrapper class around C semaphore functions.
+
+ @deprecated
+ Must not be used, as unnamed semaphores are not supported on Mac OS X.
+ */
+ class Semaphore {
+
+ public:
+
+ /** Creates a semaphore.<BR>
+ @param InitialCount denotes the starting value the semaphore. If you set it to
+ zero, the first acquire() blocks. Otherwise InitialCount acquire()s are
+ immedeatly successfull.
+ @return 0 if the semaphore could not be created, otherwise a handle to the sem.
+ */
+
+ Semaphore(sal_uInt32 initialCount)
+ {
+ semaphore = osl_createSemaphore(initialCount);
+ }
+
+ /** Release the OS-structures and free semaphore data-structure
+ @return fbbb
+ */
+ ~Semaphore()
+ {
+ osl_destroySemaphore(semaphore);
+ }
+
+ /** acquire() decreases the count. It will block if it tries to
+ decrease below zero.
+ @return False if the system-call failed.
+ */
+ sal_Bool acquire()
+ {
+ return osl_acquireSemaphore(semaphore);
+ }
+
+ /** tryToAcquire() tries to decreases the count. It will
+ return with False if it would decrease the count below zero.
+ (When acquire() would block.) If it could successfully
+ decrease the count, it will return True.
+ */
+ sal_Bool tryToAcquire()
+ {
+ return osl_tryToAcquireSemaphore(semaphore);
+ }
+
+ /** release() increases the count.
+ @return False if the system-call failed.
+ */
+ sal_Bool release()
+ {
+ return osl_releaseSemaphore(semaphore);
+ }
+
+ private:
+ oslSemaphore semaphore;
+
+ /** The underlying oslSemaphore has no reference count.
+
+ Since the underlying oslSemaphore is not a reference counted object, copy
+ constructed Semaphore may work on an already destructed oslSemaphore object.
+
+ */
+ Semaphore(const Semaphore&);
+
+ /** The underlying oslSemaphore has no reference count.
+
+ When destructed, the Semaphore object destroys the undelying oslSemaphore,
+ which might cause severe problems in case it's a temporary object.
+
+ */
+ Semaphore(oslSemaphore Semaphore);
+
+ /** This assignment operator is private for the same reason as
+ the copy constructor.
+ */
+ Semaphore& operator= (const Semaphore&);
+
+ /** This assignment operator is private for the same reason as
+ the constructor taking a oslSemaphore argument.
+ */
+ Semaphore& operator= (oslSemaphore);
+ };
+}
+
+#endif /* __cplusplus */
+#endif /* _OSL_SEMAPHORE_HXX_ */
diff --git a/sal/inc/osl/signal.h b/sal/inc/osl/signal.h
new file mode 100644
index 000000000000..b9e8520a9194
--- /dev/null
+++ b/sal/inc/osl/signal.h
@@ -0,0 +1,114 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SIGNAL_H_
+#define _OSL_SIGNAL_H_
+
+#include "sal/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define OSL_SIGNAL_USER_RESERVED 0
+
+#define OSL_SIGNAL_USER_RESOURCEFAILURE (OSL_SIGNAL_USER_RESERVED - 1)
+#define OSL_SIGNAL_USER_X11SUBSYSTEMERROR (OSL_SIGNAL_USER_RESERVED - 2)
+#define OSL_SIGNAL_USER_RVPCONNECTIONERROR (OSL_SIGNAL_USER_RESERVED - 3)
+
+typedef void* oslSignalHandler;
+
+typedef enum
+{
+ osl_Signal_System,
+ osl_Signal_Terminate,
+ osl_Signal_AccessViolation,
+ osl_Signal_IntegerDivideByZero,
+ osl_Signal_FloatDivideByZero,
+ osl_Signal_DebugBreak,
+ osl_Signal_User,
+ osl_Signal_Alarm,
+ osl_Signal_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSignal;
+
+typedef enum
+{
+ osl_Signal_ActCallNextHdl,
+ osl_Signal_ActIgnore,
+ osl_Signal_ActAbortApp,
+ osl_Signal_ActKillApp,
+ osl_Signal_Act_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSignalAction;
+
+#ifdef SAL_W32
+# pragma pack(push, 8)
+#elif defined(SAL_OS2)
+# pragma pack(push, 4)
+#endif
+
+typedef struct
+{
+ oslSignal Signal;
+ sal_Int32 UserSignal;
+ void* UserData;
+} oslSignalInfo;
+
+#if defined( SAL_W32) || defined(SAL_OS2)
+# pragma pack(pop)
+#endif
+
+/** the function-ptr. representing the signal handler-function.
+*/
+typedef oslSignalAction (SAL_CALL *oslSignalHandlerFunction)(void* pData, oslSignalInfo* pInfo);
+
+oslSignalHandler SAL_CALL osl_addSignalHandler(oslSignalHandlerFunction Handler, void* pData);
+
+sal_Bool SAL_CALL osl_removeSignalHandler(oslSignalHandler hHandler);
+
+oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData);
+
+/** Enables or disables error reporting
+
+ On default error reporting is enabled after process startup.
+
+ @param bEnable [in]
+ Enables or disables error reporting.
+
+ @return
+ sal_True if previous state of error reporting was enabled<br>
+ sal_False if previous state of error reporting was disbaled<br>
+*/
+
+sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_SIGNAL_H_ */
+
+
diff --git a/sal/inc/osl/socket.h b/sal/inc/osl/socket.h
new file mode 100644
index 000000000000..d1cf998c94e3
--- /dev/null
+++ b/sal/inc/osl/socket.h
@@ -0,0 +1,891 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SOCKET_H_
+#define _OSL_SOCKET_H_
+
+#include <rtl/ustring.h>
+#include <rtl/byteseq.h>
+
+#include <osl/time.h>
+#include <rtl/tencinfo.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* error returns */
+#define OSL_INADDR_NONE 0xffffffff
+#define OSL_INVALID_PORT (-1)
+#define OSL_INVALID_IPX_SOCKET_NO 0xffffffff
+
+/**@HTML
+
+*/
+
+/**
+ Opaque datatype SocketAddr.
+*/
+typedef struct oslSocketAddrImpl * oslSocketAddr;
+
+
+/**
+ Represents the address-family of a socket
+*/
+typedef enum {
+ osl_Socket_FamilyInet, /* IP */
+ osl_Socket_FamilyIpx, /* Novell IPX/SPX */
+ osl_Socket_FamilyInvalid, /* always last entry in enum! */
+ osl_Socket_Family_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslAddrFamily;
+
+/**
+ represent a specific protocol within a address-family
+*/
+typedef enum {
+ osl_Socket_ProtocolIp, /* for all af_inet */
+ osl_Socket_ProtocolIpx, /* af_ipx datagram sockets (IPX) */
+ osl_Socket_ProtocolSpx, /* af_ipx seqpacket or stream for SPX */
+ osl_Socket_ProtocolSpxII, /* af_ipx seqpacket or stream for SPX II */
+ osl_Socket_ProtocolInvalid,
+ osl_Socket_Protocol_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslProtocol;
+
+
+/**
+ Represents the type of a socket
+*/
+typedef enum {
+ osl_Socket_TypeStream,
+ osl_Socket_TypeDgram,
+ osl_Socket_TypeRaw,
+ osl_Socket_TypeRdm,
+ osl_Socket_TypeSeqPacket,
+ osl_Socket_TypeInvalid, /* always last entry in enum! */
+ osl_Socket_Type_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSocketType;
+
+
+/**
+ Represents socket-options
+*/
+typedef enum {
+ osl_Socket_OptionDebug,
+ osl_Socket_OptionAcceptConn,
+ osl_Socket_OptionReuseAddr,
+ osl_Socket_OptionKeepAlive,
+ osl_Socket_OptionDontRoute,
+ osl_Socket_OptionBroadcast,
+ osl_Socket_OptionUseLoopback,
+ osl_Socket_OptionLinger,
+ osl_Socket_OptionOOBinLine,
+ osl_Socket_OptionSndBuf,
+ osl_Socket_OptionRcvBuf,
+ osl_Socket_OptionSndLowat,
+ osl_Socket_OptionRcvLowat,
+ osl_Socket_OptionSndTimeo,
+ osl_Socket_OptionRcvTimeo,
+ osl_Socket_OptionError,
+ osl_Socket_OptionType,
+ osl_Socket_OptionTcpNoDelay,
+ osl_Socket_OptionInvalid, /* always last entry in enum! */
+ osl_Socket_Option_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSocketOption;
+
+/**
+ Represents the different socket-option levels
+*/
+typedef enum {
+ osl_Socket_LevelSocket,
+ osl_Socket_LevelTcp,
+ osl_Socket_LevelInvalid, /* always last entry in enum! */
+ osl_Socket_Level_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSocketOptionLevel;
+
+
+/**
+ Represents flags to be used with send/recv-calls.
+*/
+typedef enum {
+ osl_Socket_MsgNormal,
+ osl_Socket_MsgOOB,
+ osl_Socket_MsgPeek,
+ osl_Socket_MsgDontRoute,
+ osl_Socket_MsgMaxIOVLen,
+ osl_Socket_MsgInvalid, /* always last entry in enum! */
+ osl_Socket_Msg_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSocketMsgFlag;
+
+/**
+ Used by shutdown to denote which end of the socket to "close".
+*/
+typedef enum {
+ osl_Socket_DirRead,
+ osl_Socket_DirWrite,
+ osl_Socket_DirReadWrite,
+ osl_Socket_DirInvalid, /* always last entry in enum! */
+ osl_Socket_Dir_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSocketDirection;
+
+/** Describes the various error socket error conditions, which may
+ occur */
+typedef enum {
+ osl_Socket_E_None, /* no error */
+ osl_Socket_E_NotSocket, /* Socket operation on non-socket */
+ osl_Socket_E_DestAddrReq, /* Destination address required */
+ osl_Socket_E_MsgSize, /* Message too long */
+ osl_Socket_E_Prototype, /* Protocol wrong type for socket */
+ osl_Socket_E_NoProtocol, /* Protocol not available */
+ osl_Socket_E_ProtocolNoSupport, /* Protocol not supported */
+ osl_Socket_E_TypeNoSupport, /* Socket type not supported */
+ osl_Socket_E_OpNotSupport, /* Operation not supported on socket */
+ osl_Socket_E_PfNoSupport, /* Protocol family not supported */
+ osl_Socket_E_AfNoSupport, /* Address family not supported by */
+ /* protocol family */
+ osl_Socket_E_AddrInUse, /* Address already in use */
+ osl_Socket_E_AddrNotAvail, /* Can't assign requested address */
+ osl_Socket_E_NetDown, /* Network is down */
+ osl_Socket_E_NetUnreachable, /* Network is unreachable */
+ osl_Socket_E_NetReset, /* Network dropped connection because */
+ /* of reset */
+ osl_Socket_E_ConnAborted, /* Software caused connection abort */
+ osl_Socket_E_ConnReset, /* Connection reset by peer */
+ osl_Socket_E_NoBufferSpace, /* No buffer space available */
+ osl_Socket_E_IsConnected, /* Socket is already connected */
+ osl_Socket_E_NotConnected, /* Socket is not connected */
+ osl_Socket_E_Shutdown, /* Can't send after socket shutdown */
+ osl_Socket_E_TooManyRefs, /* Too many references: can't splice */
+ osl_Socket_E_TimedOut, /* Connection timed out */
+ osl_Socket_E_ConnRefused, /* Connection refused */
+ osl_Socket_E_HostDown, /* Host is down */
+ osl_Socket_E_HostUnreachable, /* No route to host */
+ osl_Socket_E_WouldBlock, /* call would block on non-blocking socket */
+ osl_Socket_E_Already, /* operation already in progress */
+ osl_Socket_E_InProgress, /* operation now in progress */
+ osl_Socket_E_InvalidError, /* unmapped error: always last entry in enum! */
+ osl_Socket_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSocketError;
+
+/** Common return codes of socket related functions.
+ */
+typedef enum {
+ osl_Socket_Ok, /* successful completion */
+ osl_Socket_Error, /* error occured, check osl_getLastSocketError() for details */
+ osl_Socket_TimedOut, /* blocking operation timed out */
+ osl_Socket_Interrupted, /* blocking operation was interrupted */
+ osl_Socket_InProgress, /* nonblocking operation is in progress */
+ osl_Socket_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslSocketResult;
+
+typedef sal_uInt8 oslSocketIpxNetNumber[4];
+typedef sal_uInt8 oslSocketIpxNodeNumber[6];
+
+/**@} end section types
+*/
+
+/**@{ begin section oslSocketAddr
+*/
+
+/** Creates a socket-address for the given family.
+ @param family If family == osl_Socket_FamilyInet the address is
+ set to INADDR_ANY port 0.
+ @return 0 if address could not be created.
+*/
+oslSocketAddr SAL_CALL osl_createEmptySocketAddr(oslAddrFamily Family);
+
+
+/** Creates a new SocketAddress and fills it from Addr.
+*/
+oslSocketAddr SAL_CALL osl_copySocketAddr(oslSocketAddr Addr);
+
+/** Compares the values of two SocketAddresses.
+ @return <code>sal_True</code> if both addresses denote the same socket address,
+ <code>sal_False</code> otherwise.
+*/
+sal_Bool SAL_CALL osl_isEqualSocketAddr(
+ oslSocketAddr Addr1, oslSocketAddr Addr2);
+
+/** Uses the systems name-service interface to find an address for strHostname.
+ @param strHostname [in] The name for which you search for an address.
+ @return The desired address if one could be found, otherwise 0.
+ Don't forget to destroy the address if you don't need it any longer.
+*/
+oslSocketAddr SAL_CALL osl_resolveHostname(rtl_uString *strHostname);
+
+/** Create an internet address usable for sending broadcast datagrams.
+ To limit the broadcast to your subnet, pass your hosts IP address
+ in dotted decimal notation as first argument.
+ @see osl_sendToSocket()
+ @see oslSocketAddr
+ @param strDottedAddr [in] dotted decimal internet address, may be 0.
+ @param Port [in] port number in host byte order.
+ @return 0 if address could not be created.
+*/
+oslSocketAddr SAL_CALL osl_createInetBroadcastAddr (
+ rtl_uString *strDottedAddr, sal_Int32 Port);
+
+
+/** Create an internet-address, consisting of hostaddress and port.
+ We interpret strDottedAddr as a dotted-decimal inet-addr
+ (e.g. "141.99.128.50").
+ @param strDottedAddr [in] String with dotted address.
+ @param Port [in] portnumber in host byte order.
+ @return 0 if address could not be created.
+*/
+oslSocketAddr SAL_CALL osl_createInetSocketAddr (
+ rtl_uString *strDottedAddr, sal_Int32 Port);
+
+
+/** Frees all resources allocated by Addr. The handle Addr must not
+ be used after the call anymore.
+*/
+void SAL_CALL osl_destroySocketAddr(oslSocketAddr Addr);
+
+/** Looks up the port-number designated to the specified service/protocol-pair.
+ (e.g. "ftp" "tcp").
+ @return OSL_INVALID_PORT if no appropriate entry was found, otherwise the port-number.
+*/
+sal_Int32 SAL_CALL osl_getServicePort(rtl_uString *strServicename, rtl_uString *strProtocol);
+
+
+
+/** Retrieves the address-family from the Addr.
+ @return the family of the socket-address.
+ In case of an unknown family you get <code>osl_Socket_FamilyInvalid</code>.
+*/
+oslAddrFamily SAL_CALL osl_getFamilyOfSocketAddr(oslSocketAddr Addr);
+
+
+/** Retrieves the internet port-number of Addr.
+ @return the port-number of the address in host-byte order. If Addr
+ is not an address of type <code>osl_Socket_FamilyInet</code>, it returns <code>OSL_INVALID_PORT</code>
+*/
+sal_Int32 SAL_CALL osl_getInetPortOfSocketAddr(oslSocketAddr Addr);
+
+
+/** Sets the Port of Addr.
+ @param Port [in] is expected in host byte-order.
+ @return <code>sal_False</code> if Addr is not an inet-addr.
+*/
+sal_Bool SAL_CALL osl_setInetPortOfSocketAddr(oslSocketAddr Addr, sal_Int32 Port);
+
+
+/** Returns the hostname represented by Addr.
+ @param strHostname out-parameter. The hostname represented by the address. If
+ there is no hostname to be found, it returns 0.
+*/
+oslSocketResult SAL_CALL osl_getHostnameOfSocketAddr(oslSocketAddr Addr, rtl_uString **strHostname);
+
+
+/** Gets the address in dotted decimal format.
+ @param strDottedInetAddr out-parameter. Contains the dotted decimal address
+ (e.g. 141.99.20.34) represented by the address.
+ If the address is invalid or not of type <code>osl_Socket_FamilyInet</code>,
+ it returns 0.
+ @return <code>osl_Socket_Ok</code> or <code>osl_Socket_Error</code>
+*/
+oslSocketResult SAL_CALL osl_getDottedInetAddrOfSocketAddr(oslSocketAddr Addr, rtl_uString **strDottedInetAddr);
+
+/** Sets the addr field in the struct sockaddr with pByteSeq. pByteSeq must be in network byte order.
+ */
+oslSocketResult SAL_CALL osl_setAddrOfSocketAddr( oslSocketAddr Addr, sal_Sequence *pByteSeq );
+
+/** Returns the addr field in the struct sockaddr.
+ @param ppByteSeq out parameter. After the call, *ppByteSeq contains the ipadrress
+ in network byteorder. *ppByteSeq may be 0 in case of an invalid socket handle.
+ @return <code>osl_Socket_Ok</code> or <code>osl_Socket_Error</code>
+ */
+oslSocketResult SAL_CALL osl_getAddrOfSocketAddr( oslSocketAddr Addr, sal_Sequence **ppByteSeq );
+
+/*
+ Opaque datatype HostAddr.
+*/
+typedef struct oslHostAddrImpl * oslHostAddr;
+
+
+/** Create an oslHostAddr from given hostname and socket address.
+ @param strHostname [in] The hostname to be stored.
+ @param Addr [in] The socket address to be stored.
+ @return The created address or 0 upon failure.
+*/
+oslHostAddr SAL_CALL osl_createHostAddr(rtl_uString *strHostname, const oslSocketAddr Addr);
+
+
+/** Create an oslHostAddr by resolving the given strHostname.
+ Successful name resolution should result in the fully qualified
+ domain name (FQDN) and it's address as hostname and socket address
+ members of the resulting oslHostAddr.
+ @param strHostname [in] The hostname to be resolved.
+ @return The resulting address or 0 upon failure.
+*/
+oslHostAddr SAL_CALL osl_createHostAddrByName(rtl_uString *strHostname);
+
+
+/** Create an oslHostAddr by reverse resolution of the given Addr.
+ Successful name resolution should result in the fully qualified
+ domain name (FQDN) and it's address as hostname and socket address
+ members of the resulting oslHostAddr.
+ @param Addr [in] The socket address to be reverse resolved.
+ @return The resulting address or 0 upon failure.
+*/
+oslHostAddr SAL_CALL osl_createHostAddrByAddr(const oslSocketAddr Addr);
+
+
+/** Create a copy of the given Addr.
+ @return The copied address or 0 upon failure.
+*/
+oslHostAddr SAL_CALL osl_copyHostAddr(const oslHostAddr Addr);
+
+
+/** Frees all resources allocated by Addr. The handle Addr must not
+ be used after the call anymore.
+*/
+void SAL_CALL osl_destroyHostAddr(oslHostAddr Addr);
+
+
+/** Get the hostname member of Addr.
+ @return The hostname or 0 upon failure.
+*/
+void SAL_CALL osl_getHostnameOfHostAddr(const oslHostAddr Addr, rtl_uString **strHostname);
+
+
+/** Get the socket address member of Addr.
+ @return The socket address or 0 upon failure.
+*/
+oslSocketAddr SAL_CALL osl_getSocketAddrOfHostAddr(const oslHostAddr Addr);
+
+/** Retrieve this machines hostname.
+ May not always be a fully qualified domain name (FQDN).
+ @param strLocalHostname out-parameter. The string that receives the local host name.
+ @return <code>sal_True</code> upon success, <code>sal_False</code> otherwise.
+*/
+oslSocketResult SAL_CALL osl_getLocalHostname(rtl_uString **strLocalHostname);
+
+
+/**@} end section oslHostAddr
+*/
+
+/**@{ begin section oslSocket
+*/
+
+
+/*-***************************************************************************/
+/* oslSocket */
+/*-***************************************************************************/
+
+typedef struct oslSocketImpl * oslSocket;
+
+/** increases the refcount of the socket handle by one
+ */
+void SAL_CALL osl_acquireSocket( oslSocket Socket );
+
+/** decreases the refcount of the socket handle by one.
+
+ If the refcount drops to zero, the underlying socket handle
+ is destroyed and becomes invalid.
+ */
+void SAL_CALL osl_releaseSocket( oslSocket Socket );
+
+/** Create a socket of the specified Family and Type. The semantic of
+ the Protocol parameter depends on the given family and type.
+ @return 0 if socket could not be created, otherwise you get a handle
+ to the allocated socket-datastructure.
+*/
+oslSocket SAL_CALL osl_createSocket(oslAddrFamily Family,
+ oslSocketType Type,
+ oslProtocol Protocol);
+
+/** Retrieves the Address of the local end of the socket.
+ Note that a socket must be bound or connected before
+ a vaild address can be returned.
+ @return 0 if socket-address could not be created, otherwise you get
+ the created Socket-Address.
+*/
+oslSocketAddr SAL_CALL osl_getLocalAddrOfSocket(oslSocket Socket);
+
+/** Retrieves the Address of the remote end of the socket.
+ Note that a socket must be connected before
+ a vaild address can be returned.
+ @return 0 if socket-address could not be created, otherwise you get
+ the created Socket-Address.
+*/
+oslSocketAddr SAL_CALL osl_getPeerAddrOfSocket(oslSocket Socket);
+
+/** Binds the given address to the socket.
+ @param Socket [in]
+ @param Address [in]
+ @return <code>sal_False</code> if the bind failed, <code> sal_True</code> if successful.
+ @see osl_getLastSocketError()
+*/
+sal_Bool SAL_CALL osl_bindAddrToSocket(oslSocket Socket,
+ oslSocketAddr Addr);
+
+/** Connects the socket to the given address.
+
+ @param Socket [in] a bound socket.
+ @param Addr [in] the peer address.
+ @param pTimeout Timeout value or NULL for blocking.
+
+ @return <code>osl_Socket_Ok</code> on successful connection,
+ <code>osl_Socket_TimedOut</code> if operation timed out,
+ <code>osl_Socket_Interrupted</code> if operation was interrupted
+ <code>osl_Socket_Error</code> if the connection failed.
+*/
+oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket Socket,
+ oslSocketAddr Addr,
+ const TimeValue* pTimeout);
+
+
+/** Prepares the socket to act as an acceptor of incoming connections.
+ You should call "listen" before you use "accept".
+ @param MaxPendingConnections [in] denotes the length of the queue of
+ pending connections for this socket. If MaxPendingConnections is
+ -1, the systems default value will be used (Usually 5).
+ @return <code>sal_False</code> if the listen failed.
+*/
+sal_Bool SAL_CALL osl_listenOnSocket(oslSocket Socket,
+ sal_Int32 MaxPendingConnections);
+
+
+/** Waits for an ingoing connection on the socket.
+ This call blocks if there is no incoming connection present.
+ @param pAddr [in] if pAddr is != 0, the peers address is returned.
+ @return 0 if the accept-call failed, otherwise you get a socket
+ representing the new connection.
+*/
+oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket Socket,
+ oslSocketAddr* pAddr);
+
+/** Tries to receive BytesToRead data from the connected socket,
+ if no error occurs. Note that incomplete recvs due to
+ packet boundaries may occur.
+
+ @param Socket [in] A connected socket to be used to listen on.
+ @param pBuffer [out] Points to a buffer that will be filled with the received
+ data.
+ @param BytesToRead [in] The number of bytes to read. pBuffer must have at least
+ this size.
+ @param Flag [in] Modifier for the call. Valid values are:
+ <ul>
+ <li><code>osl_Socket_MsgNormal</code>
+ <li><code>osl_Socket_MsgOOB</code>
+ <li><code>osl_Socket_MsgPeek</code>
+ <li><code>osl_Socket_MsgDontRoute</code>
+ <li><code>osl_Socket_MsgMaxIOVLen</code>
+ </ul>
+
+ @return the number of received bytes.
+*/
+sal_Int32 SAL_CALL osl_receiveSocket(oslSocket Socket,
+ void* pBuffer,
+ sal_uInt32 BytesToRead,
+ oslSocketMsgFlag Flag);
+
+/** Tries to receives BufferSize data from the (usually unconnected)
+ (datagram-)socket, if no error occurs.
+
+ @param Socket [in] A bound socket to be used to listen for a datagram.
+ @param pSenderAddr [out] An pointer to a created oslSocketAddr handle
+ or to a null handle. After the call, it will contain the constructed
+ oslSocketAddr of the datagrams sender. If pSenderAddr itself is 0,
+ it is ignored.
+ @param pBuffer [out] Points to a buffer that will be filled with the received
+ datagram.
+ @param BufferSize [in] The size of pBuffer.
+ @param Flag [in] Modifier for the call. Valid values are:
+ <ul>
+ <li><code>osl_Socket_MsgNormal</code>
+ <li><code>osl_Socket_MsgOOB</code>
+ <li><code>osl_Socket_MsgPeek</code>
+ <li><code>osl_Socket_MsgDontRoute</code>
+ <li><code>osl_Socket_MsgMaxIOVLen</code>
+ </ul>
+
+ @return the number of received bytes.
+*/
+sal_Int32 SAL_CALL osl_receiveFromSocket(oslSocket Socket,
+ oslSocketAddr SenderAddr,
+ void* pBuffer,
+ sal_uInt32 BufferSize,
+ oslSocketMsgFlag Flag);
+
+/** Tries to send BytesToSend data from the connected socket,
+ if no error occurs.
+
+ @param Socket [in] A connected socket.
+ @param pBuffer [in] Points to a buffer that contains the send-data.
+ @param BytesToSend [in] The number of bytes to send. pBuffer must have at least
+ this size.
+ @param Flag [in] Modifier for the call. Valid values are:
+ <ul>
+ <li><code>osl_Socket_MsgNormal</code>
+ <li><code>osl_Socket_MsgOOB</code>
+ <li><code>osl_Socket_MsgPeek</code>
+ <li><code>osl_Socket_MsgDontRoute</code>
+ <li><code>osl_Socket_MsgMaxIOVLen</code>
+ </ul>
+
+ @return the number of transfered bytes.
+*/
+sal_Int32 SAL_CALL osl_sendSocket(oslSocket Socket,
+ const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag);
+
+/** Tries to send one datagram with BytesToSend data to the given ReceiverAddr
+ via the (implicitly unconnected) datagram-socket.
+ Since there is only sent one packet, the function sends the data always complete
+ even with incomplete packet boundaries.
+
+ @param Socket [in] A bound or unbound socket. Socket will be bound
+ after a successful call.
+
+ @param ReceiverAddr [in] An initialized oslSocketAddress that contains
+ the destination address for this send.
+
+ @param pBuffer [in] Points to a buffer that contains the send-data.
+ @param BytesToSend [in] The number of bytes to send. pBuffer must have at least
+ this size.
+ @param Flag [in] Modifier for the call. Valid values are:
+ <ul>
+ <li><code>osl_Socket_MsgNormal</code>
+ <li><code>osl_Socket_MsgOOB</code>
+ <li><code>osl_Socket_MsgPeek</code>
+ <li><code>osl_Socket_MsgDontRoute</code>
+ <li><code>osl_Socket_MsgMaxIOVLen</code>
+ </ul>
+
+ @return the number of transfered bytes.
+*/
+sal_Int32 SAL_CALL osl_sendToSocket(oslSocket Socket,
+ oslSocketAddr ReceiverAddr,
+ const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag);
+
+/** Checks if read operations will block.
+
+ You can specify a timeout-value in seconds/microseconds that denotes
+ how long the operation will block if the Socket is not ready.
+
+ @return <code>sal_True</code> if read operations (recv, recvFrom, accept) on the Socket
+ will NOT block; <code>sal_False</code> if it would block or if an error occured.
+
+ @param Socket the Socket to perfom the operation on.
+ @param pTimeout if NULL, the operation will block without a timeout.
+*/
+sal_Bool SAL_CALL osl_isReceiveReady(oslSocket Socket, const TimeValue* pTimeout);
+
+/** Checks if send operations will block.
+ You can specify a timeout-value in seconds/microseconds that denotes
+ how long the operation will block if the Socket is not ready.
+ @return <code>sal_True</code> if send operations (send, sendTo) on the Socket
+ will NOT block; <code>sal_False</code> if it would block or if an error occured.
+
+ @param Socket the Socket to perfom the operation on.
+ @param pTimeout if NULL, the operation will block without a timeout. Otherwise
+ the time define by timeout value.
+*/
+sal_Bool SAL_CALL osl_isSendReady(oslSocket Socket, const TimeValue* pTimeout);
+
+/** Checks if a request for out-of-band data will block.
+ You can specify a timeout-value in seconds/microseconds that denotes
+ how long the operation will block if the Socket has no pending OOB data.
+ @return <code>sal_True</code> if OOB-request operations (recv with appropriate flags)
+ on the Socket will NOT block; <code>sal_False</code> if it would block or if an error occured.
+
+ @param Socket the Socket to perfom the operation on.
+ @param pTimeout if NULL, the operation will block without a timeout.
+*/
+sal_Bool SAL_CALL osl_isExceptionPending(oslSocket Socket, const TimeValue* pTimeout);
+
+/** Shuts down communication on a connected socket.
+ @param Direction denotes which end of the socket
+ should be closed:
+ <ul>
+ <li> <code>osl_Socket_DirRead</code> closes read operations.
+ <li> <code>osl_Socket_DirReadWrite</code> closes write operations.
+ <li> <code>osl_Socket_DirWrite</code> closes read and write operations.
+ </ul>
+ @return <code>sal_True</code> if the socket could be closed down.
+*/
+sal_Bool SAL_CALL osl_shutdownSocket(oslSocket Socket,
+ oslSocketDirection Direction);
+
+/** Retrieves attributes associated with the socket.
+ @param Socket is the socket to query.
+
+ @param Level selects the level for which an option should be queried.
+ Valid values are:
+ <ul>
+ <li> osl_sol_socket: Socket Level
+ <li> osl_sol_tcp: Level of Transmission Control Protocol
+ </ul>
+
+ @param Option denotes the option to query.
+ Valid values (depending on the Level) are:
+ <ul>
+ <li> <code>osl_Socket_Option_Debug</code><br>
+ (sal_Bool) Socket debug flag 1 = enabled, 0 = disabled.
+
+ <li> <code>osl_Socket_OptionAcceptConn</code><br>
+ <li> <code>osl_Socket_OptionReuseAddr</code><br>
+ (sal_Bool) Allows the socket to be bound to an address that is
+ already in use.
+ 1 = multiple bound allowed, 0 = no multiple bounds allowed
+
+ <li><code>osl_Socket_OptionKeepAlive</code><br>
+ (sal_Bool) Keepalive packets are sent by the underlying socket.
+ 1 = enabled, 0 = disabled
+
+ <li><code>osl_Socket_OptionDontRoute</code><br>
+ (sal_Bool) Do not route: send directly to interface.
+ 1 = do not route , 0 = routing possible
+
+ <li><code>osl_Socket_OptionBroadcast</code><br>
+ (sal_Bool) Transmission of broadcast messages are allowed on the socket.
+ 1 = transmission allowed, 0 = transmission disallowed
+
+ <li><code>osl_Socket_OptionUseLoopback</code><br>
+
+ <li><code>osl_Socket_OptionLinger</code><br>
+ (sal_Int32) Linger on close if unsent data is present.
+ 0 = linger is off, > 0 = timeout in seconds.
+
+ <li><code>osl_Socket_OptionOOBinLine</code><br>
+
+
+ <li><code>osl_Socket_OptionSndBuf</code><br>
+ (sal_Int32) Size of the send buffer in bytes. Data is sent after
+ SndTimeo or when the buffer is full. This allows faster writing
+ to the socket.
+
+ <li><code>osl_Socket_OptionRcvBuf</code><br>
+ (sal_Int32) Size of the receive buffer in bytes. Data is sent after
+ SndTimeo or when the buffer is full. This allows faster writing
+ to the socket and larger packet sizes.
+
+ <li><code>osl_Socket_OptionSndLowat</code><br>
+
+ <li><code>osl_Socket_OptionRcvLowat</code><br>
+
+ <li><code>osl_Socket_OptionSndTimeo</code><br>
+ (sal_Int32) Data is sent after this timeout. This allows gathering
+ of data to send larger packages but increases latency times.
+
+ <li><code>osl_Socket_OptionRcvTimeo</code><br>
+
+ <li><code>osl_Socket_OptionError</code><br>
+ <li><code>osl_Socket_OptionType</code><br>
+
+ <li><code>osl_Socket_OptionTcpNoDelay</code><br>
+ Disables the Nagle algorithm for send coalescing. (Do not
+ collect data until a packet is full, instead send immediatly.
+ This increases network traffic but might improve latency-times.)
+ 1 = disables the algorithm, 0 = keeps it enabled.
+ </ul>
+ If not above mentioned otherwise, the options are only valid for
+ level <code>osl_Socket_LevelSocket</code>.
+
+ @param pBuffer Pointer to a buffer large enough to take the desired
+ attribute-value.
+
+ @param BufferSize contains the length of the Buffer.
+
+ @return -1 if an error occured or else the size of the data copied into
+ pBuffer.
+ @see osl_setSocketOption()
+*/
+sal_Int32 SAL_CALL osl_getSocketOption(oslSocket Socket,
+ oslSocketOptionLevel Level,
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen);
+
+/** Sets the sockets attributes.
+
+ @param Socket is the socket to modify.
+
+ @param Level selects the level for which an option should be changed.
+ Valid values are:
+ <ul>
+ <li> osl_sol_socket: Socket Level
+ <li> osl_sol_tcp: Level of Transmission Control Protocol
+ </ul>
+
+ @param Option denotes the option to modify. See osl_setSocketOption() for more
+ details.
+
+ @param pBuffer Pointer to a Buffer which contains the attribute-value.
+
+ @param BufferSize contains the length of the Buffer.
+
+ @return True if the option could be changed.
+*/
+sal_Bool SAL_CALL osl_setSocketOption(oslSocket Socket,
+ oslSocketOptionLevel Level,
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen);
+
+/** Enables/disables non-blocking-mode of the socket.
+ @param Socket Change mode for this socket.
+ @param On <code>sal_True</code> enables non-blocking mode,
+ <code>sal_False</code> disables non-blocking mode.
+ @return <code>sal_True</code> if mode could be changed.
+*/
+sal_Bool SAL_CALL osl_enableNonBlockingMode(oslSocket Socket,
+ sal_Bool On);
+
+
+/** Query state of non-blocking-mode of the socket.
+ @param Socket Query mode for this socket.
+ @return True if non-blocking-mode is enabled.
+*/
+sal_Bool SAL_CALL osl_isNonBlockingMode(oslSocket Socket);
+
+
+/** Queries the socket for its type.
+ @return one of:
+ <ul>
+ <li> osl_Socket_TypeStream
+ <li> osl_Socket_TypeDgram
+ <li> osl_Socket_TypeRaw
+ <li> osl_Socket_TypeRdm
+ <li> osl_Socket_TypeSeqPacket
+ <li> osl_invalid_SocketType, if an error occured
+ </ul>
+
+*/
+oslSocketType SAL_CALL osl_getSocketType(oslSocket Socket);
+
+/** returns a string which describes the last socket error.
+ @param strError out-parameter. The string that receives the error message.
+*/
+void SAL_CALL osl_getLastSocketErrorDescription(oslSocket Socket, rtl_uString **strError);
+
+/** returns a constant decribing the last error for the socket system.
+ @return <code>osl_Socket_E_NONE</code> if no error occured,
+ <code>osl_invalid_SocketError</code> if an unknown (unmapped)
+ error occured, otherwise an enum describing the error.
+*/
+oslSocketError SAL_CALL osl_getLastSocketError(oslSocket Socket);
+
+/** Type for the representation of socket sets.
+*/
+typedef struct oslSocketSetImpl * oslSocketSet;
+
+/** Creates a set of sockets to be used with osl_demultiplexSocketEvents().
+ @return A oslSocketSet or 0 if creation failed.
+*/
+oslSocketSet SAL_CALL osl_createSocketSet(void);
+
+/** Destroys a oslSocketSet.
+*/
+void SAL_CALL osl_destroySocketSet(oslSocketSet Set);
+
+/** Clears the set from all previously added sockets.
+ @param Set the set to be cleared.
+*/
+void SAL_CALL osl_clearSocketSet(oslSocketSet Set);
+
+
+/** Adds a socket to the set.
+ @param Set the set were the socket is added.
+ @param Socket the socket to be added.
+*/
+void SAL_CALL osl_addToSocketSet(oslSocketSet Set, oslSocket Socket);
+
+/** Removes a socket from the set.
+ @param Set the set were the socket is removed from.
+ @param Socket the socket to be removed.
+*/
+void SAL_CALL osl_removeFromSocketSet(oslSocketSet Set, oslSocket Socket);
+
+/** Checks if socket is in the set.
+ @param Set the set to be checked.
+ @param Socket check if this socket is in the set.
+ @return <code>sal_True</code> if socket is in the set.
+*/
+sal_Bool SAL_CALL osl_isInSocketSet(oslSocketSet Set, oslSocket Socket);
+
+/** Checks multiple sockets for events.
+ @param IncomingSet Checks the sockets in this set
+ for incoming events (read, accept). If the set is 0,
+ it is just skipped.
+ @param OutgoingSet Checks the sockets in this set
+ for outgoing events (write, connect). If the set is 0,
+ it is just skipped.
+ @param OutOfBandSet Checks the sockets in this set
+ for out-of-band events. If the set is 0, it is just skipped.
+ @param msTimeout Number of milliseconds to wait for events. If
+ msTimeout is -1, the call will block until an event or an error
+ occurs.
+ @return -1 on errors, otherwise the number of sockets with
+ pending events. In case of timeout, the number might be 0.
+*/
+sal_Int32 SAL_CALL osl_demultiplexSocketEvents(oslSocketSet IncomingSet,
+ oslSocketSet OutgoingSet,
+ oslSocketSet OutOfBandSet,
+ const TimeValue* pTimeout);
+
+/** Closes the socket terminating any ongoing dataflow.
+ */
+void SAL_CALL osl_closeSocket(oslSocket Socket);
+
+
+/** Retrieves n bytes from the stream and copies them into pBuffer.
+ The function avoids incomplete reads due to packet boundaries.
+ @param pBuffer receives the read data.
+ @param n the number of bytes to read. pBuffer must be large enough
+ to hold the n bytes!
+ @return the number of read bytes. The number will only be smaller than
+ n if an exceptional condition (e.g. connection closed) occurs.
+*/
+sal_Int32 SAL_CALL osl_readSocket( oslSocket Socket, void *pBuffer, sal_Int32 nSize );
+
+
+/** Writes n bytes from pBuffer to the stream. The method avoids
+ incomplete writes due to packet boundaries.
+ @param pBuffer contains the data to be written.
+ @param n the number of bytes to write.
+ @return the number of written bytes. The number will only be smaller than
+ n if an exceptional condition (e.g. connection closed) occurs.
+*/
+sal_Int32 SAL_CALL osl_writeSocket( oslSocket Socket, const void *pBuffer, sal_Int32 nSize );
+
+/**@} end section oslSocket
+*/
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_SOCKET_H_ */
+
diff --git a/sal/inc/osl/socket.hxx b/sal/inc/osl/socket.hxx
new file mode 100644
index 000000000000..db05fe242982
--- /dev/null
+++ b/sal/inc/osl/socket.hxx
@@ -0,0 +1,565 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _OSL_SOCKET_HXX_
+#define _OSL_SOCKET_HXX_
+
+#include <osl/socket_decl.hxx>
+
+namespace osl
+{
+ //______________________________________________________________________________
+ inline SocketAddr::SocketAddr()
+ : m_handle( osl_createEmptySocketAddr( osl_Socket_FamilyInet ) )
+ {}
+
+ //______________________________________________________________________________
+ inline SocketAddr::SocketAddr(const SocketAddr& Addr)
+ : m_handle( osl_copySocketAddr( Addr.m_handle ) )
+ {
+ }
+
+ //______________________________________________________________________________
+ inline SocketAddr::SocketAddr(oslSocketAddr Addr)
+ : m_handle( osl_copySocketAddr( Addr ) )
+ {
+ }
+
+ //______________________________________________________________________________
+ inline SocketAddr::SocketAddr(oslSocketAddr Addr, __osl_socket_NoCopy )
+ : m_handle( Addr )
+ {
+ }
+
+ //______________________________________________________________________________
+ inline SocketAddr::SocketAddr( const ::rtl::OUString& strAddrOrHostName, sal_Int32 nPort)
+ : m_handle( osl_createInetSocketAddr( strAddrOrHostName.pData, nPort ) )
+ {
+ if(! m_handle )
+ {
+ m_handle = osl_resolveHostname(strAddrOrHostName.pData);
+
+ // host found?
+ if(m_handle)
+ {
+ osl_setInetPortOfSocketAddr(m_handle, nPort);
+ }
+ else
+ {
+ osl_destroySocketAddr( m_handle );
+ m_handle = 0;
+ }
+ }
+ }
+
+ //______________________________________________________________________________
+ inline SocketAddr::~SocketAddr()
+ {
+ if( m_handle )
+ osl_destroySocketAddr( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline ::rtl::OUString SocketAddr::getHostname( oslSocketResult *pResult ) const
+ {
+ ::rtl::OUString hostname;
+ oslSocketResult result = osl_getHostnameOfSocketAddr( m_handle, &(hostname.pData) );
+ if( pResult )
+ *pResult = result;
+ return hostname;
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 SAL_CALL SocketAddr::getPort() const
+ {
+ return osl_getInetPortOfSocketAddr(m_handle);
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool SAL_CALL SocketAddr::setPort( sal_Int32 nPort )
+ {
+ return osl_setInetPortOfSocketAddr(m_handle, nPort );
+ }
+
+ inline sal_Bool SAL_CALL SocketAddr::setHostname( const ::rtl::OUString &sDottedIpOrHostname )
+ {
+ *this = SocketAddr( sDottedIpOrHostname , getPort() );
+ return is();
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool SAL_CALL SocketAddr::setAddr( const ::rtl::ByteSequence & address )
+ {
+ return osl_setAddrOfSocketAddr( m_handle, address.getHandle() )
+ == osl_Socket_Ok;
+ }
+
+ inline ::rtl::ByteSequence SAL_CALL SocketAddr::getAddr( oslSocketResult *pResult ) const
+ {
+ ::rtl::ByteSequence sequence;
+ oslSocketResult result = osl_getAddrOfSocketAddr( m_handle,(sal_Sequence **) &sequence );
+ if( pResult )
+ *pResult = result;
+ return sequence;
+ }
+
+ //______________________________________________________________________________
+ inline SocketAddr & SAL_CALL SocketAddr::operator= (oslSocketAddr Addr)
+ {
+ oslSocketAddr pNewAddr = osl_copySocketAddr( Addr );
+ if( m_handle )
+ osl_destroySocketAddr( m_handle );
+ m_handle = pNewAddr;
+ return *this;
+ }
+
+ //______________________________________________________________________________
+ inline SocketAddr & SAL_CALL SocketAddr::operator= (const SocketAddr& Addr)
+ {
+ *this = (Addr.getHandle());
+ return *this;
+ }
+
+ inline SocketAddr & SAL_CALL SocketAddr::assign( oslSocketAddr Addr, __osl_socket_NoCopy )
+ {
+ if( m_handle )
+ osl_destroySocketAddr( m_handle );
+ m_handle = Addr;
+ return *this;
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool SAL_CALL SocketAddr::operator== (oslSocketAddr Addr) const
+ {
+ return osl_isEqualSocketAddr( m_handle, Addr );
+ }
+
+ inline oslSocketAddr SocketAddr::getHandle() const
+ {
+ return m_handle;
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool SocketAddr::is() const
+ {
+ return m_handle != 0;
+ }
+
+ // (static method)______________________________________________________________
+ inline ::rtl::OUString SAL_CALL SocketAddr::getLocalHostname( oslSocketResult *pResult )
+ {
+ ::rtl::OUString hostname;
+ oslSocketResult result = osl_getLocalHostname( &(hostname.pData) );
+ if(pResult )
+ *pResult = result;
+ return hostname;
+ }
+
+ // (static method)______________________________________________________________
+ inline void SAL_CALL SocketAddr::resolveHostname(
+ const ::rtl::OUString & strHostName, SocketAddr &Addr)
+ {
+ Addr = SocketAddr( osl_resolveHostname( strHostName.pData ) , SAL_NO_COPY );
+ }
+
+ // (static method)______________________________________________________________
+ inline sal_Int32 SAL_CALL SocketAddr::getServicePort(
+ const ::rtl::OUString& strServiceName,
+ const ::rtl::OUString & strProtocolName )
+ {
+ return osl_getServicePort( strServiceName.pData, strProtocolName.pData );
+ }
+
+ //______________________________________________________________________________
+ inline Socket::Socket(oslSocketType Type,
+ oslAddrFamily Family,
+ oslProtocol Protocol)
+ : m_handle( osl_createSocket(Family, Type, Protocol) )
+ {}
+
+ //______________________________________________________________________________
+ inline Socket::Socket( oslSocket socketHandle, __sal_NoAcquire )
+ : m_handle( socketHandle )
+ {}
+
+ //______________________________________________________________________________
+ inline Socket::Socket( oslSocket socketHandle )
+ : m_handle( socketHandle )
+ {
+ osl_acquireSocket( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline Socket::Socket( const Socket & socket )
+ : m_handle( socket.getHandle() )
+ {
+ osl_acquireSocket( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline Socket::~Socket()
+ {
+ osl_releaseSocket( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline Socket& Socket::operator= ( oslSocket socketHandle)
+ {
+ osl_acquireSocket( socketHandle );
+ osl_releaseSocket( m_handle );
+ m_handle = socketHandle;
+ return *this;
+ }
+
+ //______________________________________________________________________________
+ inline Socket& Socket::operator= (const Socket& sock)
+ {
+ return (*this) = sock.getHandle();
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::operator==( const Socket& rSocket ) const
+ {
+ return m_handle == rSocket.getHandle();
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::operator==( const oslSocket socketHandle ) const
+ {
+ return m_handle == socketHandle;
+ }
+
+ //______________________________________________________________________________
+ inline void Socket::shutdown( oslSocketDirection Direction )
+ {
+ osl_shutdownSocket( m_handle , Direction );
+ }
+
+ //______________________________________________________________________________
+ inline void Socket::close()
+ {
+ osl_closeSocket( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline void Socket::getLocalAddr( SocketAddr & addr) const
+ {
+ addr.assign( osl_getLocalAddrOfSocket( m_handle ) , SAL_NO_COPY );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 Socket::getLocalPort() const
+ {
+ SocketAddr addr( 0 );
+ getLocalAddr( addr );
+ return addr.getPort();
+ }
+
+ //______________________________________________________________________________
+ inline ::rtl::OUString Socket::getLocalHost() const
+ {
+ SocketAddr addr( 0 );
+ getLocalAddr( addr );
+ return addr.getHostname();
+ }
+
+ //______________________________________________________________________________
+ inline void Socket::getPeerAddr( SocketAddr &addr ) const
+ {
+ addr.assign( osl_getPeerAddrOfSocket( m_handle ), SAL_NO_COPY );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 Socket::getPeerPort() const
+ {
+ SocketAddr addr( 0 );
+ getPeerAddr( addr );
+ return addr.getPort();
+ }
+
+ //______________________________________________________________________________
+ inline ::rtl::OUString Socket::getPeerHost() const
+ {
+ SocketAddr addr( 0 );
+ getPeerAddr( addr );
+ return addr.getHostname();
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::bind(const SocketAddr& LocalInterface)
+ {
+ return osl_bindAddrToSocket( m_handle , LocalInterface.getHandle() );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::isRecvReady(const TimeValue *pTimeout ) const
+ {
+ return osl_isReceiveReady( m_handle , pTimeout );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::isSendReady(const TimeValue *pTimeout ) const
+ {
+ return osl_isSendReady( m_handle, pTimeout );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::isExceptionPending(const TimeValue *pTimeout ) const
+ {
+ return osl_isExceptionPending( m_handle, pTimeout );
+ }
+
+ //______________________________________________________________________________
+ inline oslSocketType Socket::getType() const
+ {
+ return osl_getSocketType( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 Socket::getOption(
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen,
+ oslSocketOptionLevel Level) const
+ {
+ return osl_getSocketOption( m_handle, Level, Option, pBuffer , BufferLen );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::setOption( oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen,
+ oslSocketOptionLevel Level ) const
+ {
+ return osl_setSocketOption( m_handle, Level, Option , pBuffer, BufferLen );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::setOption( oslSocketOption option, sal_Int32 nValue )
+ {
+ return setOption( option, &nValue, sizeof( nValue ) );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 Socket::getOption( oslSocketOption option ) const
+ {
+ sal_Int32 n;
+ getOption( option, &n, sizeof( n ) );
+ return n;
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::enableNonBlockingMode( sal_Bool bNonBlockingMode)
+ {
+ return osl_enableNonBlockingMode( m_handle , bNonBlockingMode );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Bool Socket::isNonBlockingMode() const
+ {
+ return osl_isNonBlockingMode( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline void SAL_CALL Socket::clearError() const
+ {
+ sal_Int32 err = 0;
+ getOption(osl_Socket_OptionError, &err, sizeof(err));
+ }
+
+ //______________________________________________________________________________
+ inline oslSocketError Socket::getError() const
+ {
+ return osl_getLastSocketError( m_handle );
+ }
+
+ //______________________________________________________________________________
+ inline ::rtl::OUString Socket::getErrorAsString( ) const
+ {
+ ::rtl::OUString error;
+ osl_getLastSocketErrorDescription( m_handle, &(error.pData) );
+ return error;
+ }
+
+ //______________________________________________________________________________
+ inline oslSocket Socket::getHandle() const
+ {
+ return m_handle;
+ }
+
+ //______________________________________________________________________________
+ inline StreamSocket::StreamSocket(oslAddrFamily Family,
+ oslProtocol Protocol,
+ oslSocketType Type )
+ : Socket( Type, Family, Protocol )
+ {}
+
+ //______________________________________________________________________________
+ inline StreamSocket::StreamSocket( oslSocket socketHandle, __sal_NoAcquire noacquire )
+ : Socket( socketHandle, noacquire )
+ {}
+
+ //______________________________________________________________________________
+ inline StreamSocket::StreamSocket( oslSocket socketHandle )
+ : Socket( socketHandle )
+ {}
+
+ //______________________________________________________________________________
+ inline StreamSocket::StreamSocket( const StreamSocket & socket )
+ : Socket( socket )
+ {}
+
+ //______________________________________________________________________________
+ inline sal_Int32 StreamSocket::read(void* pBuffer, sal_uInt32 n)
+ {
+ return osl_readSocket( m_handle, pBuffer, n );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 StreamSocket::write(const void* pBuffer, sal_uInt32 n)
+ {
+ return osl_writeSocket( m_handle, pBuffer, n );
+ }
+
+
+ //______________________________________________________________________________
+ inline sal_Int32 StreamSocket::recv(void* pBuffer,
+ sal_uInt32 BytesToRead,
+ oslSocketMsgFlag Flag)
+ {
+ return osl_receiveSocket( m_handle, pBuffer,BytesToRead, Flag );
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 StreamSocket::send(const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag)
+ {
+ return osl_sendSocket( m_handle, pBuffer, BytesToSend, Flag );
+ }
+
+ //______________________________________________________________________________
+ inline ConnectorSocket::ConnectorSocket(oslAddrFamily Family,
+ oslProtocol Protocol,
+ oslSocketType Type)
+ : StreamSocket( Family, Protocol ,Type )
+ {}
+
+ //______________________________________________________________________________
+ inline oslSocketResult ConnectorSocket::connect( const SocketAddr& TargetHost,
+ const TimeValue* pTimeout )
+ {
+ return osl_connectSocketTo( m_handle , TargetHost.getHandle(), pTimeout );
+ }
+
+ //______________________________________________________________________________
+ inline AcceptorSocket::AcceptorSocket(oslAddrFamily Family ,
+ oslProtocol Protocol ,
+ oslSocketType Type )
+ : Socket( Type, Family, Protocol )
+ {}
+
+ //______________________________________________________________________________
+ inline sal_Bool AcceptorSocket::listen(sal_Int32 MaxPendingConnections)
+ {
+ return osl_listenOnSocket( m_handle, MaxPendingConnections );
+ }
+
+ //______________________________________________________________________________
+ inline oslSocketResult AcceptorSocket::acceptConnection( StreamSocket& Connection)
+ {
+ oslSocket o = osl_acceptConnectionOnSocket( m_handle, 0 );
+ oslSocketResult status = osl_Socket_Ok;
+ if( o )
+ {
+ Connection = StreamSocket( o , SAL_NO_ACQUIRE );
+ }
+ else
+ {
+ Connection = StreamSocket();
+ status = osl_Socket_Error;
+ }
+ return status;
+ }
+
+ //______________________________________________________________________________
+ inline oslSocketResult AcceptorSocket::acceptConnection(
+ StreamSocket& Connection, SocketAddr & PeerAddr)
+ {
+ // TODO change in/OUT parameter
+ oslSocket o = osl_acceptConnectionOnSocket( m_handle, (oslSocketAddr *)&PeerAddr );
+ oslSocketResult status = osl_Socket_Ok;
+ if( o )
+ {
+ Connection = StreamSocket( o , SAL_NO_ACQUIRE );
+ }
+ else
+ {
+ Connection = StreamSocket();
+ status = osl_Socket_Error;
+ }
+ return status;
+ }
+
+ //______________________________________________________________________________
+ inline DatagramSocket::DatagramSocket(oslAddrFamily Family,
+ oslProtocol Protocol,
+ oslSocketType Type)
+ : Socket( Type, Family, Protocol )
+ {}
+
+ //______________________________________________________________________________
+ inline sal_Int32 DatagramSocket::recvFrom(void* pBuffer,
+ sal_uInt32 BufferSize,
+ SocketAddr* pSenderAddr,
+ oslSocketMsgFlag Flag )
+ {
+ sal_Int32 nByteRead;
+ if( pSenderAddr )
+ {
+ // TODO : correct the out-parameter pSenderAddr outparameter
+ nByteRead = osl_receiveFromSocket( m_handle, pSenderAddr->getHandle() , pBuffer,
+ BufferSize, Flag);
+// nByteRead = osl_receiveFromSocket( m_handle, *(oslSocketAddr**) &pSenderAddr , pBuffer,
+// BufferSize, Flag);
+ }
+ else
+ {
+ nByteRead = osl_receiveFromSocket( m_handle, 0 , pBuffer , BufferSize , Flag );
+ }
+ return nByteRead;
+ }
+
+ //______________________________________________________________________________
+ inline sal_Int32 DatagramSocket::sendTo( const SocketAddr& ReceiverAddr,
+ const void* pBuffer,
+ sal_uInt32 BufferSize,
+ oslSocketMsgFlag Flag )
+ {
+ return osl_sendToSocket( m_handle, ReceiverAddr.getHandle(), pBuffer, BufferSize, Flag );
+ }
+}
+#endif
diff --git a/sal/inc/osl/socket_decl.hxx b/sal/inc/osl/socket_decl.hxx
new file mode 100644
index 000000000000..138c110c0719
--- /dev/null
+++ b/sal/inc/osl/socket_decl.hxx
@@ -0,0 +1,722 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SOCKET_DECL_HXX_
+#define _OSL_SOCKET_DECL_HXX_
+
+#include <osl/socket.h>
+#include <rtl/ustring.hxx>
+#include <rtl/byteseq.hxx>
+
+/** @HTML
+ */
+namespace osl
+{
+ enum __osl_socket_NoCopy { SAL_NO_COPY };
+
+ /** The class should be understood as a reference to a socket address handle ( struct sockaddr ).
+
+ The handle is mutable.
+ */
+ class SocketAddr
+ {
+ protected:
+ oslSocketAddr m_handle;
+ public:
+
+ /** Creates socket address of unknown type.
+ */
+ inline SocketAddr();
+
+ /** Copy constructor.
+ */
+ inline SocketAddr(const SocketAddr& Addr);
+
+ /** The SocketAddr takes over the responsibility of the handle ( which means,
+ that the handle gets destructed by the destructor of this reference)
+
+ @param nocopy use SAL_NO_COPY
+ */
+ inline SocketAddr(const oslSocketAddr , __osl_socket_NoCopy nocopy );
+
+ /** Copyconstructs the oslSocketAddr handle.
+ */
+ inline SocketAddr(oslSocketAddr Addr);
+
+ /** tcpip-specif constructor.
+ @param strAddrOrHostName strAddrOrHostName hostname or dotted ip-number of the network
+ interface, the socket shall be created on.
+ @param nPort tcp-ip port number
+ */
+ inline SocketAddr( const ::rtl::OUString& strAddrOrHostName, sal_Int32 nPort );
+
+ /** destroys underlying oslSocketAddress
+ */
+ inline ~SocketAddr();
+
+ /** checks, if the SocketAddr was created successful.
+ @return <code>sal_True</code> if there is a valid underlying handle,
+ otherwise sal_False.
+ */
+ inline sal_Bool is() const;
+
+ /** Converts the address to a (human readable) domain-name.
+
+ @param pResult 0, if you are not interested in errors,
+ otherwise *pResult contains an error code on failure
+ or osl_Socket_Ok on success
+ @return the hostname of this SocketAddr or an empty string on failure.
+ @see osl_getHostnameOfSocketAddr()
+ */
+ inline ::rtl::OUString SAL_CALL getHostname( oslSocketResult *pResult = 0 ) const;
+
+ /** Sets the ipaddress or hostname of the SocketAddress
+ */
+ inline sal_Bool SAL_CALL setHostname( const ::rtl::OUString &sDottedIpOrHostname );
+
+ /** Returns the port number of the address.
+ @return the port in host-byte order or or OSL_INVALID_PORT on errors.
+ */
+ inline sal_Int32 SAL_CALL getPort() const;
+
+ /** Sets the port number of the address.
+ @return true if successfule.
+ */
+ inline sal_Bool SAL_CALL setPort( sal_Int32 nPort );
+
+ /** Sets the address of the underlying socket address struct in network byte order.
+ @return true on success, false signales falure.
+ */
+ inline sal_Bool SAL_CALL setAddr( const ::rtl::ByteSequence & address );
+
+ /** Returns the address of the underlying socket in network byte order
+ */
+ inline ::rtl::ByteSequence SAL_CALL getAddr( oslSocketResult *pResult = 0 ) const;
+
+ /** assign the handle to this reference. The previous handle is released.
+ */
+ inline SocketAddr & SAL_CALL operator= (oslSocketAddr Addr);
+
+ /**
+ */
+ inline SocketAddr & SAL_CALL operator= (const SocketAddr& Addr);
+
+ /** Assigns the socket addr without copyconstructing it.
+ @param nocopy use SAL_NO_COPY
+ */
+ inline SocketAddr & SAL_CALL assign( oslSocketAddr Addr, __osl_socket_NoCopy nocopy );
+
+ /** Returns true if the underlying handle is identical to the Addr handle.
+ */
+ inline sal_Bool SAL_CALL operator== (oslSocketAddr Addr) const;
+
+ /** Returns true if the underlying handle is identical to the Addr handle.
+ */
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
+
+ /** Returns the underlying SocketAddr handle without copyconstructing it.
+ */
+ inline oslSocketAddr SAL_CALL getHandle() const;
+
+ /** Get the hostname for the local interface.
+ @param after the call *pResult contains osl_Socket_Ok on success or
+ an error on failure.
+ @return the hostname
+ */
+ static inline ::rtl::OUString SAL_CALL getLocalHostname( oslSocketResult *pResult = 0);
+
+ /** Tries to find an address for a host.
+ @see osl_resolveHostname()
+ @return A new created socket-address or 0 if the name could not be found.
+ */
+ static inline void SAL_CALL resolveHostname(
+ const ::rtl::OUString & strHostName , SocketAddr & Addr );
+
+ /**
+ Tries to find the port associated with the given service/protocol-
+ pair (e.g. "ftp"/"tcp").
+ @return the port number in host-byte order or <code>OSL_INVALID_PORT</code>
+ if no service/protocol pair could be found.
+ */
+ static inline sal_Int32 SAL_CALL getServicePort(
+ const ::rtl::OUString& strServiceName,
+ const ::rtl::OUString & strProtocolName= ::rtl::OUString::createFromAscii( "tcp" ) );
+ };
+
+
+ class Socket
+ {
+ protected:
+ oslSocket m_handle;
+ protected:
+ /** Creates a socket. Note it's protected.
+ @param Type
+ @param Family
+ @param Protocol
+ */
+ inline Socket(oslSocketType Type,
+ oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp);
+ public:
+ inline Socket( );
+
+ inline Socket( const Socket & socket );
+
+ inline Socket( oslSocket socketHandle );
+
+ /** The instance takes over the handle's ownership without acquiring the
+ handle, but releases it within the dtor.
+ @param noacquire use SAL_NO_ACQUIRE
+ */
+ inline Socket( oslSocket socketHandle, __sal_NoAcquire noacquire );
+
+ /** Destructor. Releases the underlying handle
+ */
+ inline ~Socket();
+
+ /** Assignment operator. If socket was already created, the old one will
+ be discarded.
+ */
+ inline Socket& SAL_CALL operator= ( oslSocket socketHandle);
+
+ /** Assignment operator. If socket was already created, the old one will
+ be discarded.
+ */
+ inline Socket& SAL_CALL operator= (const Socket& sock);
+
+ /**
+ @return <code>sal_True</code>, when the underlying handle of both
+ Socket instances are identical, <code>sal_False</code> otherwise.
+ */
+ inline sal_Bool SAL_CALL operator==( const Socket& rSocket ) const ;
+
+ /**
+ @return <code>sal_True</code>, when the underlying handle of both
+ Socket instances are identical, <code>sal_False</code> otherwise.
+ */
+ inline sal_Bool SAL_CALL operator==( const oslSocket socketHandle ) const;
+
+ /** Closes a definite or both directions of the bidirectional stream.
+
+ @param Direction
+ @see osl_shutdownSocket()
+ */
+ inline void SAL_CALL shutdown( oslSocketDirection Direction = osl_Socket_DirReadWrite );
+
+ /** Closes a socket.
+ Note that closing a socket is identical to shutdown( osl_Socket_DirReadWrite ),
+ as the operating system distinguish both cases, both functions or offered in this API.
+ @see osl_closeSocket()
+ */
+ inline void SAL_CALL close();
+
+ /** Retrieves the address of the local interface of this socket.
+ @param Addr [out] receives the address.
+ @see osl_getLocalAddrOfSocket()
+ */
+ inline void SAL_CALL getLocalAddr( SocketAddr &Addr ) const;
+
+ /** Get the local port of the socket. Usually used after bind().
+ @return the port number or OSL_INVALID_PORT on errors.
+ */
+ inline sal_Int32 SAL_CALL getLocalPort() const;
+
+ /** Get the hostname for the local interface.
+ @return the hostname or an empty string ("").
+ */
+ inline ::rtl::OUString SAL_CALL getLocalHost() const;
+
+ /** Retrieves the address of the remote host of this socket.
+ @param Addr [out] receives the address.
+ */
+ inline void SAL_CALL getPeerAddr( SocketAddr & Addr) const;
+
+ /** Get the remote port of the socket.
+ @return the port number or OSL_INVALID_PORT on errors.
+ */
+ inline sal_Int32 SAL_CALL getPeerPort() const;
+
+ /** Get the hostname for the remote interface.
+ @return the hostname or an empty string ("").
+ */
+ inline ::rtl::OUString SAL_CALL getPeerHost() const;
+
+ /** Binds the socket to the specified (local) interface.
+ @param LocalInterface Address of the Interface
+ @return True if bind was successful.
+ */
+ inline sal_Bool SAL_CALL bind(const SocketAddr& LocalInterface);
+
+ /** Checks if read operations will block.
+
+ You can specify a timeout-value in seconds/nanoseconds that denotes
+ how the operation will block if the Socket is not ready.
+ @return <code>sal_True</code> if read operations (recv, recvFrom, accept) on the Socket
+ will NOT block; <code>sal_False</code> if it would block or if an error occured.
+
+ @param pTimeout if 0, the operation will block without a timeout. Otherwise
+ the specified amout of time.
+ */
+ inline sal_Bool SAL_CALL isRecvReady(const TimeValue *pTimeout = 0) const;
+
+ /** Checks if send operations will block.
+
+ You can specify a timeout-value in seconds/nanoseconds that denotes
+ how the operation will block if the Socket is not ready.
+ @return <code>sal_True</code> if send operations (send, sendTo) on the Socket
+ will NOT block; <code>sal_False</code> if it would block or if an error occured.
+
+ @param pTimeout if 0, the operation will block without a timeout. Otherwise
+ the specified amout of time.
+ */
+ inline sal_Bool SAL_CALL isSendReady(const TimeValue *pTimeout = 0) const;
+
+
+ /** Checks if a request for out-of-band data will block.
+
+ You can specify a timeout-value in seconds/nanoseconds that denotes
+ how the operation will block if the Socket has no pending OOB data.
+
+ @return <code>sal_True</code> if OOB-request operations (recv with appropriate flags)
+ on the Socket will NOT block; <code>sal_False</code> if it would block or if
+ an error occured.
+
+ @param pTimeout if 0, the operation will block without a timeout. Otherwise
+ the specified amout of time.
+ */
+ inline sal_Bool SAL_CALL isExceptionPending(const TimeValue *pTimeout = 0) const;
+
+
+ /** Queries the socket for its type.
+ @return one of:
+ <ul>
+ <li> <code>osl_Socket_TypeStream</code>
+ <li> <code>osl_Socket_TypeDgram</code>
+ <li> <code>osl_Socket_TypeRaw</code>
+ <li> <code>osl_Socket_TypeRdm</code>
+ <li> <code>osl_Socket_TypeSeqPacket</code>
+ <li> <code>osl_invalid_SocketType</code>, if an error occured
+ </ul>
+ */
+ inline oslSocketType SAL_CALL getType() const;
+
+ /** Retrieves option-attributes associated with the socket.
+ @param Option The attribute to query.
+ Valid values (depending on the Level) are:
+ <ul>
+ <li> <code>osl_Socket_Option_Debug</code><br>
+ (sal_Bool) Socket debug flag 1 = enabled, 0 = disabled.
+
+ <li> <code>osl_Socket_OptionAcceptConn</code><br>
+ <li> <code>osl_Socket_OptionReuseAddr</code><br>
+ (sal_Bool) Allows the socket to be bound to an address that is
+ already in use.
+ 1 = multiple bound allowed, 0 = no multiple bounds allowed
+
+ <li><code>osl_Socket_OptionKeepAlive</code><br>
+ (sal_Bool) Keepalive packets are sent by the underlying socket.
+ 1 = enabled, 0 = disabled
+
+ <li><code>osl_Socket_OptionDontRoute</code><br>
+ (sal_Bool) Do not route: send directly to interface.
+ 1 = do not route , 0 = routing possible
+
+ <li><code>osl_Socket_OptionBroadcast</code><br>
+ (sal_Bool) Transmission of broadcast messages are allowed on the socket.
+ 1 = transmission allowed, 0 = transmission disallowed
+
+ <li><code>osl_Socket_OptionUseLoopback</code><br>
+
+ <li><code>osl_Socket_OptionLinger</code><br>
+ (linger) Linger on close if unsent data is present.
+ linger has two members: l_onoff, l_linger
+ l_onoff = 0 is off, l_onoff > 0 and l_linger= timeout in seconds.
+
+ <li><code>osl_Socket_OptionOOBinLine</code><br>
+
+
+ <li><code>osl_Socket_OptionSndBuf</code><br>
+ (sal_Int32) Size of the send buffer in bytes. Data is sent after
+ SndTimeo or when the buffer is full. This allows faster writing
+ to the socket.
+
+ <li><code>osl_Socket_OptionRcvBuf</code><br>
+ (sal_Int32) Size of the receive buffer in bytes. Data is sent after
+ SndTimeo or when the buffer is full. This allows faster writing
+ to the socket and larger packet sizes.
+
+ <li><code>osl_Socket_OptionSndLowat</code><br>
+
+ <li><code>osl_Socket_OptionRcvLowat</code><br>
+
+ <li><code>osl_Socket_OptionSndTimeo</code><br>
+ (sal_Int32) Data is sent after this timeout. This allows gathering
+ of data to send larger packages but increases latency times.
+
+ <li><code>osl_Socket_OptionRcvTimeo</code><br>
+
+ <li><code>osl_Socket_OptionError</code><br>
+ <li><code>osl_Socket_OptionType</code><br>
+
+ <li><code>osl_Socket_OptionTcpNoDelay</code><br>
+ Disables the Nagle algorithm for send coalescing. (Do not
+ collect data until a packet is full, instead send immediatly.
+ This increases network traffic but might improve latency-times.)
+ 1 = disables the algorithm, 0 = keeps it enabled.
+ </ul>
+
+ If not above mentioned otherwise, the options are only valid for
+ level <code>osl_Socket_LevelSocket</code>.
+ @param pBuffer The Buffer will be filled with the attribute.
+
+ @param BufferSize The size of pBuffer.
+
+ @param Level The option level.
+
+ Valid values are:
+ <ul>
+ <li><code>osl_Socket_LevelSocket</code> : Socket Level
+ <li><code>osl_Socket_LevelTcp</code> : Level of Transmission Control Protocol
+ </ul>
+ @return The size of the attribute copied into pBuffer or -1 if an error
+ occured.
+ */
+ inline sal_Int32 SAL_CALL getOption(
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen,
+ oslSocketOptionLevel Level= osl_Socket_LevelSocket) const;
+
+ /** Sets the sockets attributes.
+
+ @param Option denotes the option to modify.
+ Valid values (depending on the Level) are:
+ <ul>
+ <li> osl_Socket_Option_Debug
+ <li> osl_Socket_OptionAcceptConn
+ <li> osl_Socket_OptionReuseAddr
+ <li> osl_Socket_OptionKeepAlive
+ <li> osl_Socket_OptionDontRoute
+ <li> osl_Socket_OptionBroadcast
+ <li> osl_Socket_OptionUseLoopback
+ <li> osl_Socket_OptionLinger
+ <li> osl_Socket_OptionOOBinLine
+ <li> osl_Socket_OptionSndBuf
+ <li> osl_Socket_OptionRcvBuf
+ <li> osl_Socket_OptionSndLowat
+ <li> osl_Socket_OptionRcvLowat
+ <li> osl_Socket_OptionSndTimeo
+ <li> osl_Socket_OptionRcvTimeo
+ <li> osl_Socket_OptionError
+ <li> osl_Socket_OptionType
+ <li> osl_Socket_OptionTcpNoDelay
+ </ul>
+
+ If not above mentioned otherwise, the options are only valid for
+ level osl_Socket_LevelSocket.
+
+ @param pBuffer Pointer to a Buffer which contains the attribute-value.
+
+ @param BufferSize contains the length of the Buffer.
+
+ @param Level selects the level for which an option should be changed.
+ Valid values are:
+ <ul>
+ <li> osl_Socket_evel_Socket : Socket Level
+ <li> osl_Socket_Level_Tcp : Level of Transmission Control Protocol
+ </ul>
+
+ @return True if the option could be changed.
+ */
+ inline sal_Bool SAL_CALL setOption( oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen,
+ oslSocketOptionLevel Level= osl_Socket_LevelSocket ) const;
+
+ /** Convenience function for setting sal_Bool and sal_Int32 option values.
+ @see setOption()
+ */
+ inline sal_Bool setOption( oslSocketOption option, sal_Int32 nValue );
+
+ /** Convenience function for retrieving sal_Bool and sal_Int32 option values.
+ @see setOption()
+ */
+ inline sal_Int32 getOption( oslSocketOption option ) const;
+
+ /** Enables/disables non-blocking mode of the socket.
+ @param bNonBlockingMode If <code>sal_True</code>, blocking mode will be switched off
+ If <code>sal_False</code>, the socket will become a blocking
+ socket (which is the default behaviour of a socket).
+ @return <code>sal_True</code> if mode could be set.
+ */
+ inline sal_Bool SAL_CALL enableNonBlockingMode( sal_Bool bNonBlockingMode);
+
+ /** Query blocking mode of the socket.
+ @return <code>sal_True</code> if non-blocking mode is set.
+ */
+ inline sal_Bool SAL_CALL isNonBlockingMode() const;
+
+
+ /** clears the error status
+ */
+ inline void SAL_CALL clearError() const;
+
+ /** returns a constant decribing the last error for the socket system.
+
+ @return osl_Socket_E_NONE if no error occured, invalid_SocketError if
+ an unknown (unmapped) error occured, otherwise an enum describing the
+ error.
+ @see osl_getLastSocketError()
+ */
+ inline oslSocketError getError() const;
+
+ /** Builds a string with the last error-message for the socket.
+ */
+ inline ::rtl::OUString getErrorAsString( ) const;
+
+ /** Returns the underlying handle unacquired (The caller must acquire it to keep it).
+ */
+ inline oslSocket getHandle() const;
+ };
+
+
+ class StreamSocket : public Socket
+ {
+ public:
+ /** Creates a socket.
+ @param Type For some protocols it might be desirable to
+ use a different type than <code>osl_Socket_TypeStream</code>
+ (like <code>osl_Socket_TypeSeqPacket</code>).
+ Therefore this parameter is not hidden.
+ */
+ inline StreamSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+
+ inline StreamSocket( const StreamSocket & );
+
+ inline StreamSocket( oslSocket Socket , __sal_NoAcquire noacquire );
+
+ inline StreamSocket( oslSocket Socket );
+
+ /** Retrieves n bytes from the stream and copies them into pBuffer.
+ The method avoids incomplete reads due to packet boundaries and is thus
+ blocking.
+ @param pBuffer receives the read data. pBuffer must be large enough
+ to hold n bytes.
+ @param n the number of bytes to read.
+ @return the number of read bytes. The number will only be smaller than
+ n if an exceptional condition (e.g. connection closed) occurs.
+ */
+ inline sal_Int32 SAL_CALL read(void* pBuffer, sal_uInt32 n);
+
+ /** Writes n bytes from pBuffer to the stream. The method avoids
+ incomplete writes due to packet boundaries and is thus blocking.
+ @param pBuffer contains the data to be written.
+ @param n the number of bytes to write.
+ @return the number of written bytes. The number will only be smaller than
+ n if an exceptional condition (e.g. connection closed) occurs.
+ */
+ inline sal_Int32 SAL_CALL write(const void* pBuffer, sal_uInt32 n);
+
+
+ /** Tries to receive BytesToRead data from the connected socket,
+
+ @param pBuffer [out] Points to a buffer that will be filled with the received
+ data. pBuffer must have at least have a size of BytesToRead.
+ @param BytesToRead [in] The number of bytes to read.
+ @param Flag [in] Modifier for the call. Valid values are:
+
+ <ul>
+ <li><code>osl_Socket_MsgNormal</code>
+ <li><code>osl_Socket_MsgOOB</code>
+ <li><code>osl_Socket_MsgPeek</code>
+ <li><code>osl_Socket_MsgDontRoute</code>
+ <li><code>osl_Socket_MsgMaxIOVLen</code>
+ </ul>
+ @return the number of received bytes, which may be less than BytesToRead.
+ */
+ inline sal_Int32 SAL_CALL recv(void* pBuffer,
+ sal_uInt32 BytesToRead,
+ oslSocketMsgFlag flags= osl_Socket_MsgNormal);
+
+ /** Tries to send BytesToSend data to the connected socket.
+
+ @param pBuffer [in] Points to a buffer that contains the send-data.
+ @param BytesToSend [in] The number of bytes to send. pBuffer must have at least
+ this size.
+ @param Flag [in] Modifier for the call. Valid values are:
+ <ul>
+ <li><code>osl_Socket_MsgNormal</code>
+ <li><code>osl_Socket_MsgOOB</code>
+ <li><code>osl_Socket_MsgPeek</code>
+ <li><code>osl_Socket_MsgDontRoute</code>
+ <li><code>osl_Socket_MsgMaxIOVLen</code>
+ </ul>
+
+ @return the number of transfered bytes. It may be less than BytesToSend.
+ */
+ sal_Int32 SAL_CALL send(const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag= osl_Socket_MsgNormal);
+ };
+
+ class ConnectorSocket : public StreamSocket
+ {
+ public:
+ /** Creates a socket that can connect to a (remote) host.
+ @param Type For some protocols it might be desirable to
+ use a different type than sock_stream <code>osl_Socket_TypeSeqPacket</code>
+ (like <code>osl_Socket_TypeSeqPacket</code>).
+ Therefore we do not hide this parameter here.
+ */
+ ConnectorSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+
+
+ /** Connects the socket to a (remote) host.
+ @param TargetHost The address of the target.
+ @param pTimeOut The timeout for blocking. If 0, a default system dependent timeout
+ us used.
+ @return <code> osl_Socket_Ok</code> if connected successfully,
+ <code>osl_Socket_TimedOut</code> on timeout,
+ <code>osl_Socket_Interrupted</code> if unblocked forcefully (by osl::Socket::close()),
+ <code>osl_Socket_Error</code> if connect failed.
+ */
+ oslSocketResult SAL_CALL connect(const SocketAddr& TargetHost, const TimeValue* pTimeout = 0);
+ };
+
+ /** Allows to accept socket connections.
+ */
+ class AcceptorSocket : public Socket
+ {
+ public:
+ inline AcceptorSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+
+ /** Prepare a socket for the accept-call. The socket must have been
+ bound before to the local address.
+ @param MaxPendingConnections The maximum number of pending
+ connections (waiting to be accepted) on this socket. If you use
+ -1, a system default value is used.
+ @return <code>sal_True</code> if call was successful.
+ */
+ inline sal_Bool SAL_CALL listen(sal_Int32 MaxPendingConnections= -1);
+
+ /** Accepts incoming connections on the socket. You must
+ precede this call with osl::Socket::bind() and listen().
+ @param Connection receives the incoming connection.
+ @return <code>osl_Socket_Ok</code>, if a connection has been accepted,
+ <code>osl_Socket_TimedOut</code>, if m_RecvTimeout milliseconds passed without connect,
+ <code>osl_Socket_Error</code> on errors.
+ */
+ inline oslSocketResult SAL_CALL acceptConnection( StreamSocket& Connection);
+
+ /** Accepts incoming connections on the socket. You must
+ precede this call with osl::Socket::bind() and listen().
+ @param PeerAddr receives the address of the connecting entity
+ (your communication partner).
+ @param Connection receives the incoming connection.
+ @return <code>osl_Socket_Ok</code>, if a connection has been accepted,
+ <code>osl_Socket_TimedOut</code>, if m_RecvTimeout milliseconds passed without connect,
+ <code>osl_Socket_Error</code> on errors.
+ */
+ inline oslSocketResult SAL_CALL acceptConnection( StreamSocket& Connection, SocketAddr & PeerAddr);
+ };
+
+
+
+ /** A connectionless socket to send and receive datagrams.
+ */
+ class DatagramSocket : public Socket
+ {
+ public:
+
+ /** Creates a datagram socket.
+ @param Type is sock_dgram by default.
+ */
+ inline DatagramSocket(oslAddrFamily Family= osl_Socket_FamilyInet,
+ oslProtocol Protocol= osl_Socket_ProtocolIp,
+ oslSocketType Type= osl_Socket_TypeDgram);
+
+ /** Tries to receives BufferSize data from the socket, if no error occurs.
+
+ @param pSenderAddr [out] You must provide pointer to a SocketAddr.
+ It will be filled with the address of the datagrams sender.
+ If pSenderAddr is 0, it is ignored.
+ @param pBuffer [out] Points to a buffer that will be filled with the received
+ datagram.
+ @param BufferSize [in] The size of pBuffer.
+ @param Flag [in] Modifier for the call. Valid values are:
+ <ul>
+ <li><code>osl_Socket_MsgNormal</code>
+ <li><code>osl_Socket_MsgOOB</code>
+ <li><code>osl_Socket_MsgPeek</code>
+ <li><code>osl_Socket_MsgDontRoute</code>
+ <li><code>osl_Socket_MsgMaxIOVLen</code>
+ </ul>
+
+ @return the number of received bytes.
+ */
+ inline sal_Int32 SAL_CALL recvFrom(void* pBuffer,
+ sal_uInt32 BufferSize,
+ SocketAddr* pSenderAddr= 0,
+ oslSocketMsgFlag Flag= osl_Socket_MsgNormal);
+
+ /** Tries to send one datagram with BytesToSend size to the given ReceiverAddr.
+ Since there is only send one packet, the function doesn't care about
+ packet boundaries.
+
+ @param ReceiverAddr [in] A SocketAddr that contains
+ the destination address for this send.
+
+ @param pBuffer [in] Points to a buffer that contains the send-data.
+ @param BufferSize [in] The number of bytes to send. pBuffer must have at least
+ this size.
+ @param Flag [in] Modifier for the call. Valid values are:
+
+ <ul>
+ <li><code>osl_Socket_MsgNormal</code>
+ <li><code>osl_Socket_MsgOOB</code>
+ <li><code>osl_Socket_MsgPeek</code>
+ <li><code>osl_Socket_MsgDontRoute</code>
+ <li><code>osl_Socket_MsgMaxIOVLen</code>
+ </ul>
+
+ @return the number of transfered bytes.
+ */
+ inline sal_Int32 SAL_CALL sendTo( const SocketAddr& ReceiverAddr,
+ const void* pBuffer,
+ sal_uInt32 BufferSize,
+ oslSocketMsgFlag Flag= osl_Socket_MsgNormal);
+ };
+
+}
+
+#endif
diff --git a/sal/inc/osl/thread.h b/sal/inc/osl/thread.h
new file mode 100644
index 000000000000..16860644d7a0
--- /dev/null
+++ b/sal/inc/osl/thread.h
@@ -0,0 +1,191 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_THREAD_H_
+#define _OSL_THREAD_H_
+
+#include <osl/time.h>
+
+#ifndef _RTL_TEXTENC_H_
+# include <rtl/textenc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ Opaque data type for threads. As with all other osl-handles
+ you can initialize and/or test it to/for 0.
+*/
+typedef void* oslThread;
+
+/** the function-ptr. representing the threads worker-function.
+*/
+typedef void (SAL_CALL *oslWorkerFunction)(void*);
+
+/** levels of thread-priority
+ Note that oslThreadPriorityUnknown might be returned
+ by getPriorityOfThread() (e.g. when it is terminated),
+ but mustn't be used with setPriority()!
+*/
+typedef enum
+{
+ osl_Thread_PriorityHighest,
+ osl_Thread_PriorityAboveNormal,
+ osl_Thread_PriorityNormal,
+ osl_Thread_PriorityBelowNormal,
+ osl_Thread_PriorityLowest,
+ osl_Thread_PriorityUnknown, /* don't use to set */
+ osl_Thread_Priority_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+} oslThreadPriority;
+
+
+typedef sal_uInt32 oslThreadIdentifier;
+
+typedef sal_uInt32 oslThreadKey;
+
+/** Create the thread, using the function-ptr pWorker as
+ its main (worker) function. This functions receives in
+ its void* parameter the value supplied by pThreadData.
+ Once the OS-structures are initialized,the thread starts
+ running.
+ @return 0 if creation failed, otherwise a handle to the thread
+*/
+oslThread SAL_CALL osl_createThread(oslWorkerFunction pWorker, void* pThreadData);
+
+/** Create the thread, using the function-ptr pWorker as
+ its main (worker) function. This functions receives in
+ its void* parameter the value supplied by pThreadData.
+ The thread will be created, but it won't start running.
+ To wake-up the thread, use resume().
+ @return 0 if creation failed, otherwise a handle to the thread
+*/
+oslThread SAL_CALL osl_createSuspendedThread(oslWorkerFunction pWorker, void* pThreadData);
+
+/** Get the identifier for the specified thread or if parameter
+ Thread is NULL of the current active thread.
+ @return identifier of the thread
+*/
+oslThreadIdentifier SAL_CALL osl_getThreadIdentifier(oslThread Thread);
+
+/** Release the thread handle.
+ If Thread is NULL, the function won't do anything.
+ Note that we do not interfere with the actual running of
+ the thread, we just free up the memory needed by the handle.
+*/
+void SAL_CALL osl_destroyThread(oslThread Thread);
+
+/** Wake-up a thread that was suspended with suspend() or
+ createSuspended(). The oslThread must be valid!
+*/
+void SAL_CALL osl_resumeThread(oslThread Thread);
+
+/** Suspend the execution of the thread. If you want the thread
+ to continue, call resume(). The oslThread must be valid!
+*/
+void SAL_CALL osl_suspendThread(oslThread Thread);
+
+/** Changes the threads priority.
+ The oslThread must be valid!
+*/
+void SAL_CALL osl_setThreadPriority(oslThread Thread, oslThreadPriority Priority);
+
+/** Retrieves the threads priority.
+ Returns oslThreadPriorityUnknown for invalid Thread-argument or
+ terminated thread. (I.e.: The oslThread might be invalid.)
+*/
+oslThreadPriority SAL_CALL osl_getThreadPriority(const oslThread Thread);
+
+/** Returns True if the thread was created and has not terminated yet.
+ Note that according to this definition a "running" thread might be
+ suspended! Also returns False is Thread is NULL.
+*/
+sal_Bool SAL_CALL osl_isThreadRunning(const oslThread Thread);
+
+/** Blocks the calling thread until Thread has terminated.
+ Returns immediately if Thread is NULL.
+*/
+void SAL_CALL osl_joinWithThread(oslThread Thread);
+
+/** Blocks the calling thread at least for the given number
+ of time.
+*/
+void SAL_CALL osl_waitThread(const TimeValue* pDelay);
+
+/** The requested thread will get terminate the next time
+ scheduleThread() is called.
+*/
+void SAL_CALL osl_terminateThread(oslThread Thread);
+
+/** Offers the rest of the threads time-slice to the OS.
+ scheduleThread() should be called in the working loop
+ of the thread, so any other thread could also get the
+ processor. Returns False if the thread should terminate, so
+ the thread could free any allocated resources.
+*/
+sal_Bool SAL_CALL osl_scheduleThread(oslThread Thread);
+
+/** Offers the rest of the threads time-slice to the OS.
+ Under POSIX you _need_ to yield(), otherwise, since the
+ threads are not preempted during execution, NO other thread
+ (even with higher priority) gets the processor. Control is
+ only given to another thread if the current thread blocks
+ or uses yield().
+*/
+void SAL_CALL osl_yieldThread(void);
+
+/* Callback when data stored in a thread key is no longer needed */
+
+typedef void (SAL_CALL *oslThreadKeyCallbackFunction)(void *);
+
+/** Create a key to an associated thread local storage pointer. */
+oslThreadKey SAL_CALL osl_createThreadKey(oslThreadKeyCallbackFunction pCallback);
+
+/** Destroy a key to an associated thread local storage pointer. */
+void SAL_CALL osl_destroyThreadKey(oslThreadKey Key);
+
+/** Get to key associated thread specific data. */
+void* SAL_CALL osl_getThreadKeyData(oslThreadKey Key);
+
+/** Set to key associated thread specific data. */
+sal_Bool SAL_CALL osl_setThreadKeyData(oslThreadKey Key, void *pData);
+
+/** Get the current thread local text encoding. */
+rtl_TextEncoding SAL_CALL osl_getThreadTextEncoding(void);
+
+/** Set the thread local text encoding.
+ @return the old text encoding.
+*/
+rtl_TextEncoding SAL_CALL osl_setThreadTextEncoding(rtl_TextEncoding Encoding);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_THREAD_H_ */
+
diff --git a/sal/inc/osl/thread.hxx b/sal/inc/osl/thread.hxx
new file mode 100644
index 000000000000..51fe059d2210
--- /dev/null
+++ b/sal/inc/osl/thread.hxx
@@ -0,0 +1,233 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _THREAD_HXX_
+#define _THREAD_HXX_
+
+#ifdef __cplusplus
+
+#include <osl/time.h>
+
+
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <rtl/alloc.h>
+
+namespace osl
+{
+/** threadFunc is the function which is executed by the threads
+ created by the osl::Thread class. The function's signature
+ matches the one of oslWorkerFunction which is declared in
+ osl/thread.h .
+*/
+extern "C" inline void SAL_CALL threadFunc( void* param);
+
+class Thread
+{
+ Thread( const Thread& );
+ Thread& operator= ( const Thread& );
+public:
+ // these are here to force memory de/allocation to sal lib.
+ inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW (())
+ { return ::rtl_allocateMemory( nSize ); }
+ inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW (())
+ { ::rtl_freeMemory( pMem ); }
+ inline static void * SAL_CALL operator new( size_t, void * pMem ) SAL_THROW (())
+ { return pMem; }
+ inline static void SAL_CALL operator delete( void *, void * ) SAL_THROW (())
+ {}
+
+ Thread(): m_hThread(0){}
+
+ virtual ~Thread()
+ {
+ osl_destroyThread( m_hThread);
+ }
+
+ sal_Bool SAL_CALL create()
+ {
+ OSL_ASSERT(m_hThread == 0); // only one running thread per instance
+ if (m_hThread)
+ return sal_False;
+
+ m_hThread = osl_createSuspendedThread( threadFunc, (void*)this);
+ if ( m_hThread )
+ osl_resumeThread(m_hThread);
+
+ return m_hThread != 0;
+ }
+
+ sal_Bool SAL_CALL createSuspended()
+ {
+ OSL_ASSERT(m_hThread == 0); // only one running thread per instance
+ if( m_hThread)
+ return sal_False;
+ m_hThread= osl_createSuspendedThread( threadFunc,
+ (void*)this);
+ return m_hThread != 0;
+ }
+
+ virtual void SAL_CALL suspend()
+ {
+ if( m_hThread )
+ osl_suspendThread(m_hThread);
+ }
+
+ virtual void SAL_CALL resume()
+ {
+ if( m_hThread )
+ osl_resumeThread(m_hThread);
+ }
+
+ virtual void SAL_CALL terminate()
+ {
+ if( m_hThread )
+ osl_terminateThread(m_hThread);
+ }
+
+ virtual void SAL_CALL join()
+ {
+ osl_joinWithThread(m_hThread);
+ }
+
+ sal_Bool SAL_CALL isRunning() const
+ {
+ return osl_isThreadRunning(m_hThread);
+ }
+
+ void SAL_CALL setPriority( oslThreadPriority Priority)
+ {
+ if( m_hThread )
+ osl_setThreadPriority(m_hThread, Priority);
+ }
+
+ oslThreadPriority SAL_CALL getPriority() const
+ {
+ return m_hThread ? osl_getThreadPriority(m_hThread) : osl_Thread_PriorityUnknown;
+ }
+
+ oslThreadIdentifier SAL_CALL getIdentifier() const
+ {
+ return osl_getThreadIdentifier(m_hThread);
+ }
+
+ static oslThreadIdentifier SAL_CALL getCurrentIdentifier()
+ {
+ return osl_getThreadIdentifier(0);
+ }
+
+ static void SAL_CALL wait(const TimeValue& Delay)
+ {
+ osl_waitThread(&Delay);
+ }
+
+ static void SAL_CALL yield()
+ {
+ osl_yieldThread();
+ }
+
+
+ virtual sal_Bool SAL_CALL schedule()
+ {
+ return m_hThread ? osl_scheduleThread(m_hThread) : sal_False;
+ }
+
+ SAL_CALL operator oslThread() const
+ {
+ return m_hThread;
+ }
+
+protected:
+
+ /** The thread functions calls the protected functions
+ run and onTerminated.
+ */
+ friend void SAL_CALL threadFunc( void* param);
+
+ virtual void SAL_CALL run() = 0;
+
+ virtual void SAL_CALL onTerminated()
+ {
+ }
+
+private:
+ oslThread m_hThread;
+};
+
+extern "C" inline void SAL_CALL threadFunc( void* param)
+{
+ Thread* pObj= (Thread*)param;
+ pObj->run();
+ pObj->onTerminated();
+}
+
+class ThreadData
+{
+ ThreadData( const ThreadData& );
+ ThreadData& operator= (const ThreadData& );
+public:
+ /// Create a thread specific local data key
+ ThreadData( oslThreadKeyCallbackFunction pCallback= 0 )
+ {
+ m_hKey = osl_createThreadKey( pCallback );
+ }
+
+ /// Destroy a thread specific local data key
+ ~ThreadData()
+ {
+ osl_destroyThreadKey(m_hKey);
+ }
+
+ /** Set the data associated with the data key.
+ @returns True if operation was successfull
+ */
+ sal_Bool SAL_CALL setData(void *pData)
+ {
+ return (osl_setThreadKeyData(m_hKey, pData));
+ }
+
+ /** Get the data associated with the data key.
+ @returns The data asscoitaed with the data key or
+ NULL if no data was set
+ */
+ void* SAL_CALL getData()
+ {
+ return osl_getThreadKeyData(m_hKey);
+ }
+
+ operator oslThreadKey() const
+ {
+ return m_hKey;
+ }
+
+private:
+ oslThreadKey m_hKey;
+};
+
+} // end namespace osl
+#endif
+#endif
diff --git a/sal/inc/osl/time.h b/sal/inc/osl/time.h
new file mode 100644
index 000000000000..95bac4c89ec2
--- /dev/null
+++ b/sal/inc/osl/time.h
@@ -0,0 +1,160 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_TIME_H_
+#define _OSL_TIME_H_
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/****************************************************************************/
+/* TimeValue */
+/****************************************************************************/
+
+#ifdef SAL_W32
+# pragma pack(push, 8)
+#elif defined(SAL_OS2)
+# pragma pack(push, 4)
+#endif
+
+/* Time since Jan-01-1970 */
+
+typedef struct {
+ sal_uInt32 Seconds;
+ sal_uInt32 Nanosec;
+} TimeValue;
+
+#if defined( SAL_W32) || defined(SAL_OS2)
+# pragma pack(pop)
+#endif
+
+
+/****************************************************************************/
+/* oslDateTime */
+/****************************************************************************/
+
+typedef struct _oslDateTime
+{
+ /*----------------------------------------------------------------------*/
+ /** contains the nanoseconds .
+ */
+ sal_uInt32 NanoSeconds;
+
+ /** contains the seconds (0-59).
+ */
+ sal_uInt16 Seconds;
+
+ /*----------------------------------------------------------------------*/
+ /** contains the minutes (0-59).
+ */
+ sal_uInt16 Minutes;
+
+ /*----------------------------------------------------------------------*/
+ /** contains the hour (0-23).
+ */
+ sal_uInt16 Hours;
+
+ /*----------------------------------------------------------------------*/
+ /** is the day of month (1-31).
+ */
+ sal_uInt16 Day;
+
+ /*----------------------------------------------------------------------*/
+ /** is the day of week (0-6 , 0 : Sunday).
+ */
+ sal_uInt16 DayOfWeek;
+
+ /*----------------------------------------------------------------------*/
+ /** is the month of year (1-12).
+ */
+ sal_uInt16 Month;
+
+ /*----------------------------------------------------------------------*/
+ /** is the year.
+ */
+ sal_uInt16 Year;
+
+} oslDateTime;
+
+
+/** Get the current system time as TimeValue.
+ @return false if any error occurs.
+*/
+sal_Bool SAL_CALL osl_getSystemTime( TimeValue* pTimeVal );
+
+
+/** Get the GMT from a TimeValue and fill a struct oslDateTime
+ @param pTimeVal[in] TimeValue
+ @param pDateTime[out] On success it receives a struct oslDateTime
+
+ @return sal_False if any error occurs else sal_True.
+*/
+sal_Bool SAL_CALL osl_getDateTimeFromTimeValue( TimeValue* pTimeVal, oslDateTime* pDateTime );
+
+
+/** Get the GMT from a oslDateTime and fill a TimeValue
+ @param pDateTime[in] oslDateTime
+ @param pTimeVal[out] On success it receives a TimeValue
+
+ @return sal_False if any error occurs else sal_True.
+*/
+sal_Bool SAL_CALL osl_getTimeValueFromDateTime( oslDateTime* pDateTime, TimeValue* pTimeVal );
+
+
+/** Convert GMT to local time
+ @param pSystemTimeVal[in] system time to convert
+ @param pLocalTimeVal[out] On success it receives the local time
+
+ @return sal_False if any error occurs else sal_True.
+*/
+sal_Bool SAL_CALL osl_getLocalTimeFromSystemTime( TimeValue* pSystemTimeVal, TimeValue* pLocalTimeVal );
+
+
+/** Convert local time to GMT
+ @param pLocalTimeVal[in] local time to convert
+ @param pSystemTimeVal[out] On success it receives the system time
+
+ @return sal_False if any error occurs else sal_True.
+*/
+sal_Bool SAL_CALL osl_getSystemTimeFromLocalTime( TimeValue* pLocalTimeVal, TimeValue* pSystemTimeVal );
+
+
+/** Get the value of the global timer
+ @return current timer value in milli seconds
+ */
+
+sal_uInt32 SAL_CALL osl_getGlobalTimer(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _OSL_TIME_H_ */
+
diff --git a/sal/inc/osl/util.h b/sal/inc/osl/util.h
new file mode 100644
index 000000000000..aa988afbbff3
--- /dev/null
+++ b/sal/inc/osl/util.h
@@ -0,0 +1,53 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _OSL_UTIL_H_
+#define _OSL_UTIL_H_
+
+#include "sal/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ @param pEthernetAddr 6 bytes of memory
+
+ @return sal_True if the ethernetaddress could be retrieved. <br>
+ sal_False if no address could be found. This may be either because
+ there is no ethernet card or there is no appropriate algorithm
+ implemented on the platform. In this case, pEthernetAddr is
+ unchanged.
+*/
+sal_Bool SAL_CALL osl_getEthernetAddress( sal_uInt8 *pEthernetAddr );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/inc/pch/precompiled_sal.cxx b/sal/inc/pch/precompiled_sal.cxx
new file mode 100644
index 000000000000..79ca1ead5bab
--- /dev/null
+++ b/sal/inc/pch/precompiled_sal.cxx
@@ -0,0 +1,29 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "precompiled_sal.hxx"
+
diff --git a/sal/inc/pch/precompiled_sal.hxx b/sal/inc/pch/precompiled_sal.hxx
new file mode 100644
index 000000000000..cd20926ac377
--- /dev/null
+++ b/sal/inc/pch/precompiled_sal.hxx
@@ -0,0 +1,32 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): Generated on 2006-09-01 17:49:56.045599
+
+#ifdef PRECOMPILED_HEADERS
+#endif
+
diff --git a/sal/inc/rtl/alloc.h b/sal/inc/rtl/alloc.h
new file mode 100644
index 000000000000..7b3967de716b
--- /dev/null
+++ b/sal/inc/rtl/alloc.h
@@ -0,0 +1,266 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_ALLOC_H_
+#define _RTL_ALLOC_H_
+
+# include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** Allocate memory.
+ @descr A call to this function will return NULL upon the requested
+ memory size being either zero or larger than currently allocatable.
+
+ @param Bytes [in] memory size.
+ @return pointer to allocated memory.
+ */
+void * SAL_CALL rtl_allocateMemory (
+ sal_Size Bytes
+) SAL_THROW_EXTERN_C();
+
+
+/** Reallocate memory.
+ @descr A call to this function with parameter 'Ptr' being NULL
+ is equivalent to a rtl_allocateMemory() call.
+
+ A call to this function with parameter 'Bytes' being 0
+ is equivalent to a rtl_freeMemory() call.
+
+ @see rtl_allocateMemory()
+ @see rtl_freeMemory()
+
+ @param Ptr [in] pointer to previously allocated memory.
+ @param Bytes [in] new memory size.
+ @return pointer to reallocated memory. May differ from Ptr.
+ */
+void * SAL_CALL rtl_reallocateMemory (
+ void * Ptr,
+ sal_Size Bytes
+) SAL_THROW_EXTERN_C();
+
+
+/** Free memory.
+ @param Ptr [in] pointer to previously allocated memory.
+ @return none. Memory is released. Ptr is invalid.
+ */
+void SAL_CALL rtl_freeMemory (
+ void * Ptr
+) SAL_THROW_EXTERN_C();
+
+
+/** Allocate and zero memory.
+ @descr A call to this function will return NULL upon the requested
+ memory size being either zero or larger than currently allocatable.
+
+ @param Bytes [in] memory size.
+ @return pointer to allocated and zero'ed memory.
+ */
+void * SAL_CALL rtl_allocateZeroMemory (
+ sal_Size Bytes
+) SAL_THROW_EXTERN_C();
+
+
+/** Zero and free memory.
+ @param Ptr [in] pointer to previously allocated memory.
+ @param Bytes [in] memory size.
+ @return none. Memory is zero'ed and released. Ptr is invalid.
+ */
+void SAL_CALL rtl_freeZeroMemory (
+ void * Ptr,
+ sal_Size Bytes
+) SAL_THROW_EXTERN_C();
+
+
+/** Opaque rtl_arena_type.
+ */
+typedef struct rtl_arena_st rtl_arena_type;
+
+#define RTL_ARENA_NAME_LENGTH 31
+
+
+/** rtl_arena_create()
+ *
+ * @param pName [in] descriptive name; for debugging purposes.
+ * @param quantum [in] resource allocation unit / granularity; rounded up to next power of 2.
+ * @param quantum_cache_max [in] max resources to cache; rounded up to next multiple of quantum; usually 0.
+ * @param source_arena [in] passed as argument to source_alloc, source_free; usually NULL.
+ * @param source_alloc [in] function to allocate resources; usually rtl_arena_alloc.
+ * @param source_free [in] function to free resources; usually rtl_arena_free.
+ * @param nFlags [in] flags; usually 0.
+ *
+ * @return pointer to rtl_arena_type, or NULL upon failure.
+ *
+ * @see rtl_arena_destroy()
+ */
+rtl_arena_type *
+SAL_CALL rtl_arena_create (
+ const char * pName,
+ sal_Size quantum,
+ sal_Size quantum_cache_max,
+ rtl_arena_type * source_arena,
+ void * (SAL_CALL * source_alloc)(rtl_arena_type *, sal_Size *),
+ void (SAL_CALL * source_free) (rtl_arena_type *, void *, sal_Size),
+ int nFlags
+) SAL_THROW_EXTERN_C();
+
+
+/** rtl_arena_destroy()
+ *
+ * @param pArena [in] the arena to destroy.
+ * @return None
+ *
+ * @see rtl_arena_create()
+ */
+void
+SAL_CALL rtl_arena_destroy (
+ rtl_arena_type * pArena
+) SAL_THROW_EXTERN_C();
+
+
+/** rtl_arena_alloc()
+ *
+ * @param pArena [in] arena from which resource is allocated.
+ * @param pBytes [inout] size of resource to allocate.
+ *
+ * @return allocated resource, or NULL upon failure.
+ *
+ * @see rtl_arena_free()
+ */
+void *
+SAL_CALL rtl_arena_alloc (
+ rtl_arena_type * pArena,
+ sal_Size * pBytes
+) SAL_THROW_EXTERN_C();
+
+
+/** rtl_arena_free()
+ *
+ * @param pArena [in] arena from which resource was allocated.
+ * @param pAddr [in] resource to free.
+ * @param nBytes [in] size of resource.
+ *
+ * @return None.
+ *
+ * @see rtl_arena_alloc()
+ */
+void
+SAL_CALL rtl_arena_free (
+ rtl_arena_type * pArena,
+ void * pAddr,
+ sal_Size nBytes
+) SAL_THROW_EXTERN_C();
+
+
+/** Opaque rtl_cache_type.
+ */
+typedef struct rtl_cache_st rtl_cache_type;
+
+#define RTL_CACHE_NAME_LENGTH 31
+
+#define RTL_CACHE_FLAG_BULKDESTROY 1
+
+/** rtl_cache_create()
+ *
+ * @param pName [in] descriptive name; for debugging purposes.
+ * @param nObjSize [in] object size.
+ * @param nObjAlign [in] object alignment; usually 0 for suitable default.
+ * @param constructor [in] object constructor callback function; returning 1 for success or 0 for failure.
+ * @param destructor [in] object destructor callback function.
+ * @param reclaim [in] reclaim callback function.
+ * @param pUserArg [in] opaque argument passed to callback functions.
+ * @param nFlags [in] flags.
+ *
+ * @return pointer to rtl_cache_type, or NULL upon failure.
+ *
+ * @see rtl_cache_destroy()
+ */
+rtl_cache_type *
+SAL_CALL rtl_cache_create (
+ const char * pName,
+ sal_Size nObjSize,
+ sal_Size nObjAlign,
+ int (SAL_CALL * constructor)(void * pObj, void * pUserArg),
+ void (SAL_CALL * destructor) (void * pObj, void * pUserArg),
+ void (SAL_CALL * reclaim) (void * pUserArg),
+ void * pUserArg,
+ rtl_arena_type * pSource,
+ int nFlags
+) SAL_THROW_EXTERN_C();
+
+
+/** rtl_cache_destroy()
+ *
+ * @param pCache [in] the cache to destroy.
+ *
+ * @return None.
+ *
+ * @see rtl_cache_create()
+ */
+void
+SAL_CALL rtl_cache_destroy (
+ rtl_cache_type * pCache
+) SAL_THROW_EXTERN_C();
+
+
+/** rtl_cache_alloc()
+ *
+ * @param pCache [in] cache from which object is allocated.
+ *
+ * @return pointer to allocated object, or NULL upon failure.
+ */
+void *
+SAL_CALL rtl_cache_alloc (
+ rtl_cache_type * pCache
+) SAL_THROW_EXTERN_C();
+
+
+/** rtl_cache_free()
+ *
+ * @param pCache [in] cache from which object was allocated.
+ * @param pObj [in] object to free.
+ *
+ * @return None.
+ *
+ * @see rtl_cache_alloc()
+ */
+void
+SAL_CALL rtl_cache_free (
+ rtl_cache_type * pCache,
+ void * pObj
+) SAL_THROW_EXTERN_C();
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_RTL_ALLOC_H_ */
+
diff --git a/sal/inc/rtl/allocator.hxx b/sal/inc/rtl/allocator.hxx
new file mode 100644
index 000000000000..c753a98189a3
--- /dev/null
+++ b/sal/inc/rtl/allocator.hxx
@@ -0,0 +1,192 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if !defined INCLUDED_RTL_ALLOCATOR_HXX
+#define INCLUDED_RTL_ALLOCATOR_HXX
+
+#if ! defined(_SAL_TYPES_H_)
+#include "sal/types.h"
+#endif
+#if ! defined(_RTL_ALLOC_H_)
+#include "rtl/alloc.h"
+#endif
+
+#include <cstddef>
+
+//######################################################
+// This is no general purpose STL allocator but one
+// necessary to use STL for some implementation but
+// avoid linking sal against the STLPort library!!!
+// For more information on when and how to define a
+// custom stl allocator have a look at Scott Meyers:
+// "Effective STL", Nicolai M. Josuttis:
+// "The C++ Standard Library - A Tutorial and Reference"
+// and at http://www.josuttis.com/cppcode/allocator.html
+
+namespace rtl {
+
+/** @internal */
+template<class T>
+class Allocator
+{
+public:
+ typedef T value_type;
+ typedef T* pointer;
+ typedef const T* const_pointer;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef ::std::size_t size_type;
+ typedef ::std::ptrdiff_t difference_type;
+
+ //-----------------------------------------
+ template<class U>
+ struct rebind
+ {
+ typedef Allocator<U> other;
+ };
+
+ //-----------------------------------------
+ pointer address (reference value) const
+ {
+ return &value;
+ }
+
+ //-----------------------------------------
+ const_pointer address (const_reference value) const
+ {
+ return &value;
+ }
+
+ //-----------------------------------------
+ Allocator() SAL_THROW(())
+ {}
+
+ //-----------------------------------------
+ template<class U>
+ Allocator (const Allocator<U>&) SAL_THROW(())
+ {}
+
+ //-----------------------------------------
+ Allocator(const Allocator&) SAL_THROW(())
+ {}
+
+ //-----------------------------------------
+ ~Allocator() SAL_THROW(())
+ {}
+
+ //-----------------------------------------
+ size_type max_size() const SAL_THROW(())
+ {
+ return size_type(-1)/sizeof(T);
+ }
+
+ //-----------------------------------------
+ /* Normally the code for allocate should
+ throw a std::bad_alloc exception if the
+ requested memory could not be allocated:
+ (C++ standard 20.4.1.1):
+
+ pointer allocate (size_type n, const void* hint = 0)
+ {
+ pointer p = reinterpret_cast<pointer>(
+ rtl_allocateMemory(sal_uInt32(n * sizeof(T))));
+
+ if (NULL == p)
+ throw ::std::bad_alloc();
+
+ return p;
+ }
+
+ but some compilers do not compile it if exceptions
+ are not enabled, e.g. GCC under Linux and it is
+ in general not desired to compile sal with exceptions
+ enabled. */
+ pointer allocate (size_type n, const void* hint = 0)
+ {
+ hint = hint; /* avoid warnings */
+ return reinterpret_cast<pointer>(
+ rtl_allocateMemory(sal_uInt32(n * sizeof(T))));
+ }
+
+ //-----------------------------------------
+ void deallocate (pointer p, size_type /* n */)
+ {
+ rtl_freeMemory(p);
+ }
+
+ //-----------------------------------------
+ void construct (pointer p, const T& value)
+ {
+ new ((void*)p)T(value);
+ }
+
+ //-----------------------------------------
+ void destroy (pointer p)
+ {
+ p->~T();
+ }
+};
+
+//######################################################
+// Custom STL allocators must be stateless (see
+// references above) that's why the operators below
+// return always true or false
+
+/** @internal */
+template<class T, class U>
+inline bool operator== (const Allocator<T>&, const Allocator<U>&) SAL_THROW(())
+{
+ return true;
+}
+
+/** @internal */
+template<class T, class U>
+inline bool operator!= (const Allocator<T>&, const Allocator<U>&) SAL_THROW(())
+{
+ return false;
+}
+
+} /* namespace rtl */
+
+//######################################################
+/** REQUIRED BY STLPort (see stlport '_alloc.h'):
+ Hack for compilers that do not support member
+ template classes (e.g. MSVC 6)
+
+ @internal
+*/
+namespace _STL
+{
+ /** @internal */
+ template<class T, class U>
+ inline ::rtl::Allocator<U> & __stl_alloc_rebind (::rtl::Allocator<T> & a, U const *)
+ {
+ return (::rtl::Allocator<U>&)(a);
+ }
+}
+
+#endif /* INCLUDED_RTL_ALLOCATOR_HXX */
+
diff --git a/sal/inc/rtl/bootstrap.h b/sal/inc/rtl/bootstrap.h
new file mode 100644
index 000000000000..1c33c45b1fa1
--- /dev/null
+++ b/sal/inc/rtl/bootstrap.h
@@ -0,0 +1,233 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_BOOTSTRAP_H_
+#define _RTL_BOOTSTRAP_H_
+
+#include <rtl/ustring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ @HTML
+ @file
+
+ The described concept provides a platform independent way to access
+ minimum bootstrap settings for every application by excplitly or
+ implicitly passing the values to the application.<p>
+
+ MULTI-LEVEL STRATEGY FOR RETRIEVAL OF BOOTSTRAP VALUES :<p>
+
+ The 1st level is tried first. On failure,
+ the next level is tried. Every query starts at the first level again, so
+ that one setting may be taken from the 3rd and one from the 1st level.<p>
+
+ 1st level: explicitly set variables via rtl_bootstrap_set()
+
+ 2nd level: command line arguments. A "-env:SETTINGNAME=value" is given on
+ command line. This allows to give an application a certain setting, even
+ if an ini-file exists (espicially useful for e.g. daemons that want to
+ start an executable with dynamical changing settings).<p>
+
+ 3rd level: environment variables. The application tries to get the
+ setting from the environment.<p>
+
+ 4th level: executable ini-file. Every application looks for an ini-file.
+ The filename defaults to /absoulte/path/to/executable[rc|.ini]
+ (without .bin or .exe suffix). The ini-filename can be
+ set by the special command line parameter
+ '-env:INIFILENAME=/absolute/path/to/inifile' at runtime or it may
+ be set at compiletime by an API-call.<p>
+
+ 5th level: URE_BOOTSTRAP ini-file. If the bootstrap variable URE_BOOTSTRAP
+ expands to the URL of an ini-file, that ini-file is searched.<p>
+
+ 6th level: default. An application can have some default settings decided
+ at compile time, which allow the application to run even with no
+ deployment settings. <p>
+
+ If neither of the above levels leads to an successful retrieval of the value
+ (no default possible), the application may fail to start.<p>
+
+ NAMING CONVENTIONS <p>
+
+ Naming conventions for names of bootstrap values :
+ Names may only include characters, that are allowed charcters for
+ environment variables. This excludes '.', ' ', ';', ':' and any non-ascii
+ character. Names are case insensitive.<p>
+
+ An ini-file is only allowed to have one section, which must be named '[Bootstrap]'.
+ The section may be omitted.
+ The section name does not appear in the name of the corresponding
+ environment variable or commandline arg.
+ Values maybe arbitrary unicode strings, they must be encoded in UTF8.<p>
+
+ Example:<p>
+
+ in an ini-file:
+ <code>
+ [Sectionname]
+ Name=value
+ </code><p>
+
+ as commandline arg:
+ <code>-env:Name=value</code><p>
+
+ as environment
+ <code>
+ setenv Name value
+ set Name=value
+ </code><p>
+
+ SPECIAL VARIABLES:
+
+ <ul>
+ <li> INIFILENAME<br>
+ This variable allows to set the inifilename. This makes only sense, if the filename
+ is different than the executable file name. It must be given on command line. If it is
+ given the executable ini-file is ignored.
+ </li>
+*/
+
+/** may be called by an application to set an ini-filename.
+
+ <p>
+ Must be called before rtl_bootstrap_get(). May not be called twice.
+ If it is never called, a the filename executable.ini (win)
+ or execuablerc (unx) is assumed.
+
+ @param pName Name of the inifile with path but WITHOUT
+ suffix (.ini or rc)
+*/
+void SAL_CALL rtl_bootstrap_setIniFileName( rtl_uString *pName )
+ SAL_THROW_EXTERN_C();
+
+/**
+ @param ppValue
+ out parameter. Contains always a valid rtl_uString pointer.
+ @param pName
+ The name of the bootstrap setting to be retrieved.
+ @param pDefault
+ maybe NULL. If once the default is
+ returned, successive calls always return this
+ default value, even when called with different
+ defaults.
+
+ @return <code>sal_True</code>, when a value could be retrieved successfully,
+ <code>sal_False</code>, when none of the 4 methods gave a value. ppValue
+ then contains ane empty string.
+ When a pDefault value is given, the function returns always
+ <code>sal_True</code>.
+*/
+sal_Bool SAL_CALL rtl_bootstrap_get( rtl_uString *pName, rtl_uString **ppValue, rtl_uString *pDefault )
+ SAL_THROW_EXTERN_C();
+
+/** Sets a bootstrap parameter.
+
+ @param pName
+ name of bootstrap parameter
+ @param pValue
+ value of bootstrap parameter
+*/
+void SAL_CALL rtl_bootstrap_set( rtl_uString * pName, rtl_uString * pValue )
+ SAL_THROW_EXTERN_C();
+
+
+typedef void * rtlBootstrapHandle;
+
+/**
+ Opens a bootstrap argument container.
+ @param pIniName [in] The name of the ini-file to use, if <code>NULL</code> defaults
+ to the excutables name
+ @return Handle for a boostrap argument container
+*/
+rtlBootstrapHandle SAL_CALL rtl_bootstrap_args_open(rtl_uString * pIniName)
+ SAL_THROW_EXTERN_C();
+
+/**
+ Closes a boostrap agument container.
+ @param handle [in] The handle got by <code>rtl_bootstrap_args_open()</code>
+*/
+void SAL_CALL rtl_bootstrap_args_close(rtlBootstrapHandle handle)
+ SAL_THROW_EXTERN_C();
+
+/**
+ @param handle [in] The handle got by <code>rtl_bootstrap_args_open()</code>
+ @param pName [in] The name of the variable to be retrieved
+ @param ppValue [out] The result of the retrieval. *ppValue may be null in case of failure.
+ @param pDefault [in] The default value for the retrieval, may be <code>NULL</code>
+
+ @return The status of the retrieval, <code>sal_True</code> on success.
+*/
+sal_Bool SAL_CALL rtl_bootstrap_get_from_handle(rtlBootstrapHandle handle, rtl_uString *pName, rtl_uString **ppValue, rtl_uString *pDefault)
+ SAL_THROW_EXTERN_C();
+
+
+/** Returns the name of the inifile associated with this handle.
+
+ @param ppIniName contains after the call the name of the ini-filename.
+*/
+void SAL_CALL rtl_bootstrap_get_iniName_from_handle(rtlBootstrapHandle handle, rtl_uString ** ppIniName)
+ SAL_THROW_EXTERN_C();
+
+/** Expands a macro using bootstrap variables.
+
+ @param handle [in] The handle got by <code>rtl_bootstrap_args_open()</code>
+ @param macro [inout] The macro to be expanded
+*/
+void SAL_CALL rtl_bootstrap_expandMacros_from_handle(
+ rtlBootstrapHandle handle, rtl_uString ** macro )
+ SAL_THROW_EXTERN_C();
+/** Expands a macro using default bootstrap variables.
+
+ @param macro [inout] The macro to be expanded
+*/
+void SAL_CALL rtl_bootstrap_expandMacros(
+ rtl_uString ** macro )
+ SAL_THROW_EXTERN_C();
+
+/** Escapes special characters ("$" and "\").
+
+ @param value
+ an arbitrary, non-NULL value
+
+ @param encoded
+ non-NULL out parameter, receiving the given value with all occurences of
+ special characters ("$" and "\") escaped
+
+ @since UDK 3.2.9
+*/
+void SAL_CALL rtl_bootstrap_encode(
+ rtl_uString const * value, rtl_uString ** encoded )
+ SAL_THROW_EXTERN_C();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/inc/rtl/bootstrap.hxx b/sal/inc/rtl/bootstrap.hxx
new file mode 100644
index 000000000000..f8f1f7a95f48
--- /dev/null
+++ b/sal/inc/rtl/bootstrap.hxx
@@ -0,0 +1,234 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_BOOTSTRAP_HXX_
+#define _RTL_BOOTSTRAP_HXX_
+#include <rtl/ustring.hxx>
+#include <rtl/bootstrap.h>
+
+namespace rtl
+{
+ class Bootstrap
+ {
+ void * _handle;
+
+ /** @internal */
+ inline Bootstrap( Bootstrap const & ); // not impl
+ /** @internal */
+ inline Bootstrap & operator = ( Bootstrap const & ); // not impl
+
+ public:
+ /**
+ @see rtl_bootstrap_setIniFileName()
+ */
+ static inline void SAL_CALL setIniFilename( const ::rtl::OUString &sFile );
+
+ /** Retrieves a bootstrap parameter
+ @param sName name of the bootstrap value. case insensitive.
+ @param outValue (out parameter). On success contains the value, otherwise
+ an empty string.
+ @return sal_False, if no value could be retrieved, otherwise sal_True
+ @see rtl_bootstrap_get()
+ */
+ static inline sal_Bool get(
+ const ::rtl::OUString &sName,
+ ::rtl::OUString &outValue );
+
+ /** Retrieves a bootstrap parameter
+
+ @param sName name of the bootstrap value. case insensitive.
+ @param outValue (out parameter). Contains the value associated with sName.
+ @param aDefault if none of the other methods retrieved a value, outValue
+ is assigned to a Default.
+
+ @see rtl_bootstrap_get()
+ */
+ static inline void get(
+ const ::rtl::OUString &sName,
+ ::rtl::OUString &outValue,
+ const ::rtl::OUString &aDefault );
+
+ /** Sets a bootstrap parameter.
+
+ @param pName
+ name of bootstrap parameter
+ @param pValue
+ value of bootstrap parameter
+
+ @see rtl_bootstrap_set()
+ */
+ static inline void set( ::rtl::OUString const & name, ::rtl::OUString const & value )
+ SAL_THROW( () );
+
+ /** default ctor.
+ */
+ inline Bootstrap();
+
+ /** Opens a bootstrap argment container
+ @see rtl_bootstrap_args_open()
+ */
+ inline Bootstrap(const OUString & iniName);
+
+ /** Closes a bootstrap argument container
+ @see rtl_bootstrap_args_close()
+ */
+ inline ~Bootstrap();
+
+ /** Retrieves a bootstrap argument.
+
+ It is first tried to retrieve the value via the global function
+ and second via the special bootstrap container.
+ @see rtl_bootstrap_get_from_handle()
+ */
+
+ inline sal_Bool getFrom(const ::rtl::OUString &sName,
+ ::rtl::OUString &outValue) const;
+
+ /** Retrieves a bootstrap argument.
+
+ It is first tried to retrieve the value via the global function
+ and second via the special bootstrap container.
+ @see rtl_bootstrap_get_from_handle()
+ */
+ inline void getFrom(const ::rtl::OUString &sName,
+ ::rtl::OUString &outValue,
+ const ::rtl::OUString &aDefault) const;
+
+ /** Retrieves the name of the underlying ini-file.
+ @see rtl_bootstrap_get_iniName_from_handle()
+ */
+ inline void getIniName(::rtl::OUString & iniName) const;
+
+ /** Expands a macro using bootstrap variables.
+
+ @param macro [inout] The macro to be expanded
+ */
+ inline void expandMacrosFrom( ::rtl::OUString & macro ) const SAL_THROW( () )
+ { rtl_bootstrap_expandMacros_from_handle( _handle, &macro.pData ); }
+
+ /** Expands a macro using default bootstrap variables.
+
+ @param macro [inout] The macro to be expanded
+ */
+ static inline void expandMacros( ::rtl::OUString & macro ) SAL_THROW( () )
+ { rtl_bootstrap_expandMacros( &macro.pData ); }
+
+ /** Provides the bootstrap internal handle.
+
+ @return bootstrap handle
+ */
+ inline rtlBootstrapHandle getHandle() const SAL_THROW( () )
+ { return _handle; }
+
+ /** Escapes special characters ("$" and "\").
+
+ @param value
+ an arbitrary value
+
+ @return
+ the given value, with all occurences of special characters ("$" and
+ "\") escaped
+
+ @since UDK 3.2.9
+ */
+ static inline ::rtl::OUString encode( ::rtl::OUString const & value )
+ SAL_THROW( () );
+ };
+
+ //----------------------------------------------------------------------------
+ // IMPLEMENTATION
+ //----------------------------------------------------------------------------
+ inline void Bootstrap::setIniFilename( const ::rtl::OUString &sFile )
+ {
+ rtl_bootstrap_setIniFileName( sFile.pData );
+ }
+
+ inline sal_Bool Bootstrap::get( const ::rtl::OUString &sName,
+ ::rtl::OUString & outValue )
+ {
+ return rtl_bootstrap_get( sName.pData , &(outValue.pData) , 0 );
+ }
+
+ inline void Bootstrap::get( const ::rtl::OUString &sName,
+ ::rtl::OUString & outValue,
+ const ::rtl::OUString & sDefault )
+ {
+ rtl_bootstrap_get( sName.pData , &(outValue.pData) , sDefault.pData );
+ }
+
+ inline void Bootstrap::set( ::rtl::OUString const & name, ::rtl::OUString const & value )
+ SAL_THROW( () )
+ {
+ rtl_bootstrap_set( name.pData, value.pData );
+ }
+
+ inline Bootstrap::Bootstrap()
+ {
+ _handle = 0;
+ }
+
+ inline Bootstrap::Bootstrap(const OUString & iniName)
+ {
+ if(iniName.getLength())
+ _handle = rtl_bootstrap_args_open(iniName.pData);
+
+ else
+ _handle = 0;
+ }
+
+ inline Bootstrap::~Bootstrap()
+ {
+ rtl_bootstrap_args_close(_handle);
+ }
+
+
+ inline sal_Bool Bootstrap::getFrom(const ::rtl::OUString &sName,
+ ::rtl::OUString &outValue) const
+ {
+ return rtl_bootstrap_get_from_handle(_handle, sName.pData, &outValue.pData, 0);
+ }
+
+ inline void Bootstrap::getFrom(const ::rtl::OUString &sName,
+ ::rtl::OUString &outValue,
+ const ::rtl::OUString &aDefault) const
+ {
+ rtl_bootstrap_get_from_handle(_handle, sName.pData, &outValue.pData, aDefault.pData);
+ }
+
+ inline void Bootstrap::getIniName(::rtl::OUString & iniName) const
+ {
+ rtl_bootstrap_get_iniName_from_handle(_handle, &iniName.pData);
+ }
+
+ inline ::rtl::OUString Bootstrap::encode( ::rtl::OUString const & value )
+ SAL_THROW( () )
+ {
+ ::rtl::OUString encoded;
+ rtl_bootstrap_encode(value.pData, &encoded.pData);
+ return encoded;
+ }
+}
+#endif
diff --git a/sal/inc/rtl/byteseq.h b/sal/inc/rtl/byteseq.h
new file mode 100644
index 000000000000..3c0b6862b70b
--- /dev/null
+++ b/sal/inc/rtl/byteseq.h
@@ -0,0 +1,322 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_BYTESEQ_H_
+#define _RTL_BYTESEQ_H_
+
+#include <sal/types.h>
+#include <rtl/alloc.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/** Assures that the reference count of the given byte sequence is one. Otherwise a new copy
+ of the sequence is created with a reference count of one.
+
+ @param ppSequence sequence
+*/
+void SAL_CALL rtl_byte_sequence_reference2One(
+ sal_Sequence ** ppSequence )
+ SAL_THROW_EXTERN_C();
+
+/** Reallocates length of byte sequence.
+
+ @param ppSequence sequence
+ @param nSize new size of sequence
+*/
+void SAL_CALL rtl_byte_sequence_realloc(
+ sal_Sequence ** ppSequence, sal_Int32 nSize )
+ SAL_THROW_EXTERN_C();
+
+/** Acquires the byte sequence
+
+ @param pSequence sequence, that is to be acquired
+*/
+void SAL_CALL rtl_byte_sequence_acquire(
+ sal_Sequence *pSequence )
+ SAL_THROW_EXTERN_C();
+
+/** Releases the byte sequence. If the refcount drops to zero, the sequence is freed.
+
+ @param pSequence sequence, that is to be released; invalid after call
+*/
+void SAL_CALL rtl_byte_sequence_release(
+ sal_Sequence *pSequence )
+ SAL_THROW_EXTERN_C();
+
+/** Constructs a bytes sequence with length nLength. All bytes are set to zero.
+
+ @param ppSequence inout sequence; on entry *ppSequence may be null, otherwise it is released;
+ after the call, *ppSequence contains the newly constructed sequence
+ @param nLength length of new sequence
+*/
+void SAL_CALL rtl_byte_sequence_construct(
+ sal_Sequence **ppSequence , sal_Int32 nLength )
+ SAL_THROW_EXTERN_C();
+
+/** Constructs a bytes sequence with length nLength. The data is not initialized.
+
+ @param ppSequence inout sequence; on entry *ppSequence may be null, otherwise it is released;
+ after the call, *ppSequence contains the newly constructed sequence
+ @param nLength length of new sequence
+*/
+void SAL_CALL rtl_byte_sequence_constructNoDefault(
+ sal_Sequence **ppSequence , sal_Int32 nLength )
+ SAL_THROW_EXTERN_C();
+
+/** Constructs a byte sequence with length nLength and copies nLength bytes from pData.
+
+ @param ppSequence inout sequence; on entry *ppSequence may be null, otherwise it is released;
+ after the call, *ppSequence contains the newly constructed sequence
+ @param pData initial data
+ @param nLength length of new sequence
+*/
+void SAL_CALL rtl_byte_sequence_constructFromArray(
+ sal_Sequence **ppSequence, const sal_Int8 *pData , sal_Int32 nLength )
+ SAL_THROW_EXTERN_C();
+
+/** Assigns the byte sequence pSequence to *ppSequence.
+
+ @param ppSequence inout sequence; on entry *ppSequence may be null, otherwise it is released;
+ after the call, *ppSequence references pSequence
+ @param pSequence the source sequence
+*/
+void SAL_CALL rtl_byte_sequence_assign(
+ sal_Sequence **ppSequence , sal_Sequence *pSequence )
+ SAL_THROW_EXTERN_C();
+
+/** Compares two byte sequences.
+
+ @return true, if the data within the sequences are identical; false otherwise
+*/
+sal_Bool SAL_CALL rtl_byte_sequence_equals(
+ sal_Sequence *pSequence1 , sal_Sequence *pSequence2 )
+ SAL_THROW_EXTERN_C();
+
+/** Returns the data array pointer of the sequence.
+
+ @return read-pointer to the data array of the sequence. If rtl_byte_sequence_reference2One()
+ has been called before, the pointer may be casted to a non const pointer and
+ the sequence may be modified
+*/
+const sal_Int8 *SAL_CALL rtl_byte_sequence_getConstArray(
+ sal_Sequence *pSequence )
+ SAL_THROW_EXTERN_C();
+
+/** Returns the length of the sequence
+
+ @param pSequence sequence handle
+ @return length of the sequence
+*/
+sal_Int32 SAL_CALL rtl_byte_sequence_getLength(
+ sal_Sequence *pSequence )
+ SAL_THROW_EXTERN_C();
+
+#ifdef __cplusplus
+}
+namespace rtl
+{
+
+enum __ByteSequence_NoDefault
+{
+ /** This enum value can be used to create a bytesequence with uninitalized data
+ */
+ BYTESEQ_NODEFAULT = 0xcafe
+};
+
+enum __ByteSequence_NoAcquire
+{
+ /** This enum value can be used to create a bytesequence from a C-Handle without
+ acquiring the handle.
+ */
+ BYTESEQ_NOACQUIRE = 0xcafebabe
+};
+
+/** C++ class representing a SAL byte sequence.
+ C++ Sequences are reference counted and shared, so the sequence keeps a handle to its data.
+ To keep value semantics, copies are only generated if the sequence is to be modified
+ (new handle).
+*/
+class ByteSequence
+{
+ /** sequence handle
+ @internal
+ */
+ sal_Sequence * _pSequence;
+
+public:
+ // these are here to force memory de/allocation to sal lib.
+ /** @internal */
+ inline static void * SAL_CALL operator new ( size_t nSize ) SAL_THROW( () )
+ { return ::rtl_allocateMemory( nSize ); }
+ /** @internal */
+ inline static void SAL_CALL operator delete ( void * pMem ) SAL_THROW( () )
+ { ::rtl_freeMemory( pMem ); }
+ /** @internal */
+ inline static void * SAL_CALL operator new ( size_t, void * pMem ) SAL_THROW( () )
+ { return pMem; }
+ /** @internal */
+ inline static void SAL_CALL operator delete ( void *, void * ) SAL_THROW( () )
+ {}
+
+ /** Default constructor: Creates an empty sequence.
+ */
+ inline ByteSequence() SAL_THROW( () );
+ /** Copy constructor: Creates a copy of given sequence.
+
+ @param rSeq another byte sequence
+ */
+ inline ByteSequence( const ByteSequence & rSeq ) SAL_THROW( () );
+ /** Copy constructor Creates a copy from the C-Handle.
+
+ @param pSequence another byte sequence handle
+ */
+ inline ByteSequence( sal_Sequence *pSequence ) SAL_THROW( () );
+ /** Constructor: Creates a copy of given data bytes.
+
+ @param pElements an array of bytes
+ @param len number of bytes
+ */
+ inline ByteSequence( const sal_Int8 * pElements, sal_Int32 len );
+ /** Constructor: Creates sequence of given length and initializes all bytes to 0.
+
+ @param len initial sequence length
+ */
+ inline ByteSequence( sal_Int32 len );
+ /** Constructor: Creates sequence of given length and does NOT initialize data.
+ Use this ctor for performance optimization only.
+
+ @param len initial sequence length
+ @param nodefault dummy parameter forcing explicit BYTESEQ_NODEFAULT
+ */
+ inline ByteSequence( sal_Int32 len , enum __ByteSequence_NoDefault nodefault );
+ /** Constructor:
+ Creates a sequence from a C-Handle without acquiring the handle, thus taking
+ over owenership. Eitherway the handle is release by the destructor.
+ This ctor is useful, when working with a c-interface (it safes a pair of
+ acquire and release call and is thus a performance optimization only).
+
+ @param pSequence sequence handle to be taken over
+ @param noacquire dummy parameter forcing explicit BYTESEQ_NOACQUIRE
+ */
+ inline ByteSequence( sal_Sequence *pSequence , enum __ByteSequence_NoAcquire noacquire ) SAL_THROW( () );
+ /** Destructor: Releases sequence handle. Last handle will free memory.
+ */
+ inline ~ByteSequence() SAL_THROW( () );
+
+ /** Assignment operator: Acquires given sequence handle and releases a previously set handle.
+
+ @param rSeq another byte sequence
+ @return this sequence
+ */
+ inline ByteSequence & SAL_CALL operator = ( const ByteSequence & rSeq ) SAL_THROW( () );
+
+ /** Gets the length of sequence.
+
+ @return length of sequence
+ */
+ inline sal_Int32 SAL_CALL getLength() const SAL_THROW( () )
+ { return _pSequence->nElements; }
+
+ /** Gets a pointer to byte array for READING. If the sequence has a length of 0, then the
+ returned pointer is undefined.
+
+ @return pointer to byte array
+ */
+ inline const sal_Int8 * SAL_CALL getConstArray() const SAL_THROW( () )
+ { return (const sal_Int8 *)_pSequence->elements; }
+ /** Gets a pointer to elements array for READING AND WRITING. In general if the sequence
+ has a handle acquired by other sequences (reference count > 1), then a new sequence is
+ created copying all bytes to keep value semantics!
+ If the sequence has a length of 0, then the returned pointer is undefined.
+
+ @return pointer to elements array
+ */
+ inline sal_Int8 * SAL_CALL getArray();
+
+ /** Non-const index operator:
+ Obtains a reference to byte indexed at given position.
+ In general if the sequence has a handle acquired by other
+ sequences (reference count > 1), then a new sequence is created
+ copying all bytes to keep value semantics!
+
+ @attention
+ The implementation does NOT check for array bounds!
+
+ @param nIndex index
+ @return non-const C++ reference to element at index nIndex
+ */
+ inline sal_Int8 & SAL_CALL operator [] ( sal_Int32 nIndex );
+
+ /** Const index operator: Obtains a reference to byte indexed at given position.
+ The implementation does NOT check for array bounds!
+
+ @param nIndex index
+ @return const C++ reference to byte at element of indenx nIndex
+ */
+ inline const sal_Int8 & SAL_CALL operator [] ( sal_Int32 nIndex ) const SAL_THROW( () )
+ { return getConstArray()[ nIndex ]; }
+
+ /** Equality operator: Compares two sequences.
+
+ @param rSeq another byte sequence (right side)
+ @return true if both sequences are equal, false otherwise
+ */
+ inline sal_Bool SAL_CALL operator == ( const ByteSequence & rSeq ) const SAL_THROW( () );
+ /** Unequality operator: Compares two sequences.
+
+ @param rSeq another byte sequence (right side)
+ @return false if both sequences are equal, true otherwise
+ */
+ inline sal_Bool SAL_CALL operator != ( const ByteSequence & rSeq ) const SAL_THROW( () );
+
+ /** Reallocates sequence to new length. If the sequence has a handle acquired by other sequences
+ (reference count > 1), then the remaining elements are copied to a new sequence handle to
+ keep value semantics!
+
+ @param nSize new size of sequence
+ */
+ inline void SAL_CALL realloc( sal_Int32 nSize );
+
+ /** Returns the UNnacquired C handle of the sequence
+
+ @return UNacquired handle of the sequence
+ */
+ inline sal_Sequence * SAL_CALL getHandle() const SAL_THROW( () )
+ { return _pSequence; }
+ /** Returns the UNnacquired C handle of the sequence (for compatibility reasons)
+
+ @return UNacquired handle of the sequence
+ */
+ inline sal_Sequence * SAL_CALL get() const SAL_THROW( () )
+ { return _pSequence; }
+};
+
+}
+#endif
+#endif
diff --git a/sal/inc/rtl/byteseq.hxx b/sal/inc/rtl/byteseq.hxx
new file mode 100644
index 000000000000..698e4f01df05
--- /dev/null
+++ b/sal/inc/rtl/byteseq.hxx
@@ -0,0 +1,143 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_BYTESEQ_HXX_
+#define _RTL_BYTESEQ_HXX_
+
+#include <osl/interlck.h>
+#include <rtl/byteseq.h>
+#include <rtl/alloc.h>
+#include <rtl/memory.h>
+
+#if ! defined EXCEPTIONS_OFF
+#include <new>
+#endif
+
+
+namespace rtl
+{
+
+//__________________________________________________________________________________________________
+inline ByteSequence::ByteSequence() SAL_THROW( () )
+ : _pSequence( 0 )
+{
+ ::rtl_byte_sequence_construct( &_pSequence, 0 );
+}
+//__________________________________________________________________________________________________
+inline ByteSequence::ByteSequence( const ByteSequence & rSeq ) SAL_THROW( () )
+ : _pSequence( 0 )
+{
+ ::rtl_byte_sequence_assign( &_pSequence, rSeq._pSequence );
+}
+//__________________________________________________________________________________________________
+inline ByteSequence::ByteSequence( sal_Sequence *pSequence) SAL_THROW( () )
+ : _pSequence( pSequence )
+{
+ ::rtl_byte_sequence_acquire( pSequence );
+}
+//__________________________________________________________________________________________________
+inline ByteSequence::ByteSequence( const sal_Int8 * pElements, sal_Int32 len )
+ : _pSequence( 0 )
+{
+ ::rtl_byte_sequence_constructFromArray( &_pSequence, pElements, len );
+#if ! defined EXCEPTIONS_OFF
+ if (_pSequence == 0)
+ throw ::std::bad_alloc();
+#endif
+}
+//__________________________________________________________________________________________________
+inline ByteSequence::ByteSequence( sal_Int32 len, enum __ByteSequence_NoDefault )
+ : _pSequence( 0 )
+{
+ ::rtl_byte_sequence_constructNoDefault( &_pSequence, len );
+#if ! defined EXCEPTIONS_OFF
+ if (_pSequence == 0)
+ throw ::std::bad_alloc();
+#endif
+}
+//__________________________________________________________________________________________________
+inline ByteSequence::ByteSequence( sal_Sequence *pSequence, enum __ByteSequence_NoAcquire ) SAL_THROW( () )
+ : _pSequence( pSequence )
+{
+}
+//__________________________________________________________________________________________________
+inline ByteSequence::ByteSequence( sal_Int32 len )
+ : _pSequence( 0 )
+{
+ ::rtl_byte_sequence_construct( &_pSequence, len );
+#if ! defined EXCEPTIONS_OFF
+ if (_pSequence == 0)
+ throw ::std::bad_alloc();
+#endif
+}
+//__________________________________________________________________________________________________
+inline ByteSequence::~ByteSequence() SAL_THROW( () )
+{
+ ::rtl_byte_sequence_release( _pSequence );
+}
+//__________________________________________________________________________________________________
+inline ByteSequence & ByteSequence::operator = ( const ByteSequence & rSeq ) SAL_THROW( () )
+{
+ ::rtl_byte_sequence_assign( &_pSequence, rSeq._pSequence );
+ return *this;
+}
+//__________________________________________________________________________________________________
+inline sal_Bool ByteSequence::operator == ( const ByteSequence & rSeq ) const SAL_THROW( () )
+{
+ return ::rtl_byte_sequence_equals( _pSequence, rSeq._pSequence );
+}
+//__________________________________________________________________________________________________
+inline sal_Int8 * ByteSequence::getArray()
+{
+ ::rtl_byte_sequence_reference2One( &_pSequence );
+#if ! defined EXCEPTIONS_OFF
+ if (_pSequence == 0)
+ throw ::std::bad_alloc();
+#endif
+ return (sal_Int8 *)_pSequence->elements;
+}
+//__________________________________________________________________________________________________
+inline void ByteSequence::realloc( sal_Int32 nSize )
+{
+ ::rtl_byte_sequence_realloc( &_pSequence, nSize );
+#if ! defined EXCEPTIONS_OFF
+ if (_pSequence == 0)
+ throw ::std::bad_alloc();
+#endif
+}
+//__________________________________________________________________________________________________
+inline sal_Int8 & ByteSequence::operator [] ( sal_Int32 nIndex )
+{
+ return getArray()[ nIndex ];
+}
+//__________________________________________________________________________________________________
+inline sal_Bool ByteSequence::operator != ( const ByteSequence & rSeq ) const SAL_THROW( () )
+{
+ return (! operator == ( rSeq ));
+}
+
+}
+#endif
diff --git a/sal/inc/rtl/cipher.h b/sal/inc/rtl/cipher.h
new file mode 100644
index 000000000000..8cb2a2f2256b
--- /dev/null
+++ b/sal/inc/rtl/cipher.h
@@ -0,0 +1,319 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_CIPHER_H_
+#define _RTL_CIPHER_H_ "$Revision: 1.7 $"
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*========================================================================
+ *
+ * rtlCipher interface.
+ *
+ *======================================================================*/
+/** Cipher Handle opaque type.
+ */
+typedef void* rtlCipher;
+
+
+/** Cipher Algorithm enumeration.
+ @see rtl_cipher_create()
+ */
+enum __rtl_CipherAlgorithm
+{
+ rtl_Cipher_AlgorithmBF,
+ rtl_Cipher_AlgorithmARCFOUR,
+ rtl_Cipher_AlgorithmInvalid,
+ rtl_Cipher_Algorithm_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Cipher Algorithm type.
+ */
+typedef enum __rtl_CipherAlgorithm rtlCipherAlgorithm;
+
+
+/** Cipher Mode enumeration.
+ @see rtl_cipher_create()
+ */
+enum __rtl_CipherMode
+{
+ rtl_Cipher_ModeECB,
+ rtl_Cipher_ModeCBC,
+ rtl_Cipher_ModeStream,
+ rtl_Cipher_ModeInvalid,
+ rtl_Cipher_Mode_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Cipher Mode type.
+ */
+typedef enum __rtl_CipherMode rtlCipherMode;
+
+
+/** Cipher Direction enumeration.
+ @see rtl_cipher_init()
+ */
+enum __rtl_CipherDirection
+{
+ rtl_Cipher_DirectionBoth,
+ rtl_Cipher_DirectionDecode,
+ rtl_Cipher_DirectionEncode,
+ rtl_Cipher_DirectionInvalid,
+ rtl_Cipher_Direction_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Cipher Direction type.
+ */
+typedef enum __rtl_CipherDirection rtlCipherDirection;
+
+
+/** Error Code enumeration.
+ */
+enum __rtl_CipherError
+{
+ rtl_Cipher_E_None,
+ rtl_Cipher_E_Argument,
+ rtl_Cipher_E_Algorithm,
+ rtl_Cipher_E_Direction,
+ rtl_Cipher_E_Mode,
+ rtl_Cipher_E_BufferSize,
+ rtl_Cipher_E_Memory,
+ rtl_Cipher_E_Unknown,
+ rtl_Cipher_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Error Code type.
+ */
+typedef enum __rtl_CipherError rtlCipherError;
+
+
+/** Create a cipher handle for the given algorithm and mode.
+ @see rtlCipherAlgorithm
+ @see rtlCipherMode
+
+ @param Algorithm [in] cipher algorithm.
+ @param Mode [in] cipher mode.
+ @return Cipher handle, or 0 upon failure.
+ */
+rtlCipher SAL_CALL rtl_cipher_create (
+ rtlCipherAlgorithm Algorithm,
+ rtlCipherMode Mode
+) SAL_THROW_EXTERN_C();
+
+
+/** Inititialize a cipher for the given direction.
+ @see rtlCipherDirection
+
+ @param Cipher [in] cipher handle.
+ @param Direction [in] cipher direction.
+ @param pKeyData [in] key material buffer.
+ @param nKeyLen [in] key material length in bytes.
+ @param pArgData [in] initialization vector buffer.
+ @param nArgLen [in] initialization vector length in bytes.
+ @return rtl_Cipher_E_None upon success.
+ */
+rtlCipherError SAL_CALL rtl_cipher_init (
+ rtlCipher Cipher,
+ rtlCipherDirection Direction,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Encode a buffer under a given cipher algorithm.
+ @precond Initialized for a compatible cipher direction.
+ @see rtl_cipher_init()
+
+ @param Cipher [in] cipher handle.
+ @param pData [in] plaintext buffer.
+ @param nDatLen [in] plaintext length in bytes.
+ @param pBuffer [out] ciphertext buffer.
+ @param nBufLen [in] ciphertext length in bytes.
+ @return rtl_Cipher_E_None upon success.
+ */
+rtlCipherError SAL_CALL rtl_cipher_encode (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Decode a buffer under a given cipher algorithm.
+ @precond Initialized for a compatible cipher direction.
+ @see rtl_cipher_init()
+
+ @param Cipher [in] cipher handle.
+ @param pData [in] ciphertext buffer.
+ @param nDatLen [in] ciphertext length in bytes.
+ @param pBuffer [out] plaintext buffer.
+ @param nBufLen [in] plaintext length in bytes.
+ @return rtl_Cipher_E_None upon success.
+ */
+rtlCipherError SAL_CALL rtl_cipher_decode (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a cipher handle.
+ @param Cipher [in] cipher handle to be destroyed.
+ @return None. Cipher handle destroyed and invalid.
+ */
+void SAL_CALL rtl_cipher_destroy (
+ rtlCipher Cipher
+) SAL_THROW_EXTERN_C();
+
+
+/*========================================================================
+ *
+ * rtl_cipherBF (Blowfish) interface.
+ *
+ *======================================================================*/
+/** Create a Blowfish cipher handle for the given mode.
+ @descr The Blowfish block cipher algorithm is specified in
+ Bruce Schneier: Applied Cryptography, 2nd edition, ch. 14.3
+
+ @see rtl_cipher_create()
+ */
+rtlCipher SAL_CALL rtl_cipher_createBF (
+ rtlCipherMode Mode
+) SAL_THROW_EXTERN_C();
+
+
+/** Inititialize a Blowfish cipher for the given direction.
+ @see rtl_cipher_init()
+ */
+rtlCipherError SAL_CALL rtl_cipher_initBF (
+ rtlCipher Cipher,
+ rtlCipherDirection Direction,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Encode a buffer under the Blowfish cipher algorithm.
+ @see rtl_cipher_encode()
+ */
+rtlCipherError SAL_CALL rtl_cipher_encodeBF (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Decode a buffer under the Blowfish cipher algorithm.
+ @see rtl_cipher_decode()
+ */
+rtlCipherError SAL_CALL rtl_cipher_decodeBF (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a Blowfish cipher handle.
+ @see rtl_cipher_destroy()
+ */
+void SAL_CALL rtl_cipher_destroyBF (
+ rtlCipher Cipher
+) SAL_THROW_EXTERN_C();
+
+
+/*========================================================================
+ *
+ * rtl_cipherARCFOUR (RC4) interface.
+ *
+ *======================================================================*/
+/** Create a RC4 cipher handle for the given mode.
+ @descr The RC4 symmetric stream cipher algorithm is specified in
+ Bruce Schneier: Applied Cryptography, 2nd edition, ch. 17.1
+
+ @see rtl_cipher_create()
+
+ @param Mode [in] cipher mode. Must be rtl_Cipher_ModeStream.
+ @return Cipher handle, or 0 upon failure.
+ */
+rtlCipher SAL_CALL rtl_cipher_createARCFOUR (
+ rtlCipherMode Mode
+) SAL_THROW_EXTERN_C();
+
+
+/** Inititialize a RC4 cipher for the given direction.
+ @see rtl_cipher_init()
+ */
+rtlCipherError SAL_CALL rtl_cipher_initARCFOUR (
+ rtlCipher Cipher,
+ rtlCipherDirection Direction,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Encode a buffer under the RC4 cipher algorithm.
+ @see rtl_cipher_encode()
+ */
+rtlCipherError SAL_CALL rtl_cipher_encodeARCFOUR (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Decode a buffer under the RC4 cipher algorithm.
+ @see rtl_cipher_decode()
+ */
+rtlCipherError SAL_CALL rtl_cipher_decodeARCFOUR (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a RC4 cipher handle.
+ @see rtl_cipher_destroy()
+ */
+void SAL_CALL rtl_cipher_destroyARCFOUR (
+ rtlCipher Cipher
+) SAL_THROW_EXTERN_C();
+
+
+/*========================================================================
+ *
+ * The End.
+ *
+ *======================================================================*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_RTL_CIPHER_H_ */
+
diff --git a/sal/inc/rtl/crc.h b/sal/inc/rtl/crc.h
new file mode 100644
index 000000000000..f30a873c67f2
--- /dev/null
+++ b/sal/inc/rtl/crc.h
@@ -0,0 +1,66 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_CRC_H_
+#define _RTL_CRC_H_ "$Revision: 1.4 $"
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*========================================================================
+ *
+ * rtl_crc32 interface.
+ *
+ *======================================================================*/
+/** Evaluate CRC32 over given data.
+ @descr This function evaluates the CRC polynomial 0xEDB88320.
+
+ @param Crc [in] CRC32 over previous data or zero.
+ @param Data [in] data buffer.
+ @param DatLen [in] data buffer length.
+ @return new CRC32 value.
+ */
+sal_uInt32 SAL_CALL rtl_crc32 (
+ sal_uInt32 Crc,
+ const void *Data, sal_uInt32 DatLen
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * The End.
+ *
+ *======================================================================*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_CRC_H_ */
+
diff --git a/sal/inc/rtl/digest.h b/sal/inc/rtl/digest.h
new file mode 100644
index 000000000000..c0e3a346b90b
--- /dev/null
+++ b/sal/inc/rtl/digest.h
@@ -0,0 +1,639 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_DIGEST_H_
+#define _RTL_DIGEST_H_ "$Revision: 1.8 $"
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*========================================================================
+ *
+ * rtlDigest.
+ *
+ *======================================================================*/
+/** Digest Handle opaque type.
+ */
+typedef void* rtlDigest;
+
+
+/** Digest Algorithm enumeration.
+ @see rtl_digest_create()
+ */
+enum __rtl_DigestAlgorithm
+{
+ rtl_Digest_AlgorithmMD2,
+ rtl_Digest_AlgorithmMD5,
+ rtl_Digest_AlgorithmSHA,
+ rtl_Digest_AlgorithmSHA1,
+
+ rtl_Digest_AlgorithmHMAC_MD5,
+ rtl_Digest_AlgorithmHMAC_SHA1,
+
+ rtl_Digest_AlgorithmInvalid,
+ rtl_Digest_Algorithm_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Digest Algorithm type.
+ */
+typedef enum __rtl_DigestAlgorithm rtlDigestAlgorithm;
+
+
+/** Error Code enumeration.
+ */
+enum __rtl_DigestError
+{
+ rtl_Digest_E_None,
+ rtl_Digest_E_Argument,
+ rtl_Digest_E_Algorithm,
+ rtl_Digest_E_BufferSize,
+ rtl_Digest_E_Memory,
+ rtl_Digest_E_Unknown,
+ rtl_Digest_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Error Code type.
+ */
+typedef enum __rtl_DigestError rtlDigestError;
+
+
+/** Create a digest handle for the given algorithm.
+ @see rtlDigestAlgorithm
+
+ @param Algorithm [in] digest algorithm.
+ @return Digest handle, or 0 upon failure.
+ */
+rtlDigest SAL_CALL rtl_digest_create (
+ rtlDigestAlgorithm Algorithm
+) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a digest handle.
+ @postcond Digest handle destroyed and invalid.
+ @param Digest [in] digest handle to be destroyed.
+ @return None.
+ */
+void SAL_CALL rtl_digest_destroy (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Query the algorithm of a given digest.
+ @param Digest [in] digest handle.
+ @return digest algorithm, or rtl_Digest_AlgorithmInvalid upon failure.
+ */
+rtlDigestAlgorithm SAL_CALL rtl_digest_queryAlgorithm (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Query the length of a given digest.
+ @param Digest [in] digest handle.
+ @return digest length, or 0 upon failure.
+ */
+sal_uInt32 SAL_CALL rtl_digest_queryLength (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Initialize a digest with given data.
+ @param Digest [in] digest handle.
+ @param pData [in] data buffer.
+ @param nDatLen [in] data length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_init (
+ rtlDigest Digest,
+ const sal_uInt8 *pData, sal_uInt32 nDatLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Update a digest with given data.
+ @param Digest [in] digest handle.
+ @param pData [in] data buffer.
+ @param nDatLen [in] data length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_update (
+ rtlDigest Digest,
+ const void *pData, sal_uInt32 nDatLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Finalize a digest and retrieve the digest value.
+ @precond Digest value length must not be less than digest length.
+ @postcond Digest initialized to accept another update sequence.
+ @see rtl_digest_queryLength()
+ @see rtl_digest_update()
+
+ @param Digest [in] digest handle.
+ @param pBuffer [in] digest value buffer.
+ @param nBufLen [in] digest value length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_get (
+ rtlDigest Digest,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * rtl_digest_MD2 interface.
+ *
+ *======================================================================*/
+#define RTL_DIGEST_LENGTH_MD2 16
+
+/** Create a MD2 digest handle.
+ @descr The MD2 digest algorithm is specified in
+
+ RFC 1319 (Informational)
+ The MD2 Message-Digest Algorithm
+
+ @see rtl_digest_create()
+ */
+rtlDigest SAL_CALL rtl_digest_createMD2 (void) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a MD2 digest handle.
+ @see rtl_digest_destroy()
+ */
+void SAL_CALL rtl_digest_destroyMD2 (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Update a MD2 digest with given data.
+ @see rtl_digest_update()
+ */
+rtlDigestError SAL_CALL rtl_digest_updateMD2 (
+ rtlDigest Digest,
+ const void *pData, sal_uInt32 nDatLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Finalize a MD2 digest and retrieve the digest value.
+ @see rtl_digest_get()
+ */
+rtlDigestError SAL_CALL rtl_digest_getMD2 (
+ rtlDigest Digest,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Evaluate a MD2 digest value from given data.
+ @descr This function performs an optimized call sequence on a
+ single data buffer, avoiding digest creation and destruction.
+
+ @see rtl_digest_updateMD2()
+ @see rtl_digest_getMD2()
+
+ @param pData [in] data buffer.
+ @param nDatLen [in] data length.
+ @param pBuffer [in] digest value buffer.
+ @param nBufLen [in] digest value length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_MD2 (
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * rtl_digest_MD5 interface.
+ *
+ *======================================================================*/
+#define RTL_DIGEST_LENGTH_MD5 16
+
+/** Create a MD5 digest handle.
+ @descr The MD5 digest algorithm is specified in
+
+ RFC 1321 (Informational)
+ The MD5 Message-Digest Algorithm
+
+ @see rtl_digest_create()
+ */
+rtlDigest SAL_CALL rtl_digest_createMD5 (void) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a MD5 digest handle.
+ @see rtl_digest_destroy()
+ */
+void SAL_CALL rtl_digest_destroyMD5 (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Update a MD5 digest with given data.
+ @see rtl_digest_update()
+ */
+rtlDigestError SAL_CALL rtl_digest_updateMD5 (
+ rtlDigest Digest,
+ const void *pData, sal_uInt32 nDatLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Finalize a MD5 digest and retrieve the digest value.
+ @see rtl_digest_get()
+ */
+rtlDigestError SAL_CALL rtl_digest_getMD5 (
+ rtlDigest Digest,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Retrieve the raw (not finalized) MD5 digest value.
+ @descr This function is a non-standard replacement for
+ rtl_digest_getMD5() and must be used with caution.
+
+ @postcond Digest initialized to accept another update sequence.
+ @see rtl_digest_get()
+ */
+rtlDigestError SAL_CALL rtl_digest_rawMD5 (
+ rtlDigest Digest,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Evaluate a MD5 digest value from given data.
+ @descr This function performs an optimized call sequence on a
+ single data buffer, avoiding digest creation and destruction.
+
+ @see rtl_digest_updateMD5()
+ @see rtl_digest_getMD5()
+
+ @param pData [in] data buffer.
+ @param nDatLen [in] data length.
+ @param pBuffer [in] digest value buffer.
+ @param nBufLen [in] digest value length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_MD5 (
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * rtl_digest_SHA interface.
+ *
+ *======================================================================*/
+#define RTL_DIGEST_LENGTH_SHA 20
+
+/** Create a SHA digest handle.
+ @descr The SHA digest algorithm is specified in
+
+ FIPS PUB 180 (Superseded by FIPS PUB 180-1)
+ Secure Hash Standard
+
+ @see rtl_digest_create()
+ */
+rtlDigest SAL_CALL rtl_digest_createSHA (void) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a SHA digest handle.
+ @see rtl_digest_destroy()
+ */
+void SAL_CALL rtl_digest_destroySHA (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Update a SHA digest with given data.
+ @see rtl_digest_update()
+ */
+rtlDigestError SAL_CALL rtl_digest_updateSHA (
+ rtlDigest Digest,
+ const void *pData, sal_uInt32 nDatLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Finalize a SHA digest and retrieve the digest value.
+ @see rtl_digest_get()
+ */
+rtlDigestError SAL_CALL rtl_digest_getSHA (
+ rtlDigest Digest,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Evaluate a SHA digest value from given data.
+ @descr This function performs an optimized call sequence on a
+ single data buffer, avoiding digest creation and destruction.
+
+ @see rtl_digest_updateSHA()
+ @see rtl_digest_getSHA()
+
+ @param pData [in] data buffer.
+ @param nDatLen [in] data length.
+ @param pBuffer [in] digest value buffer.
+ @param nBufLen [in] digest value length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_SHA (
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * rtl_digest_SHA1 interface.
+ *
+ *======================================================================*/
+#define RTL_DIGEST_LENGTH_SHA1 20
+
+/** Create a SHA1 digest handle.
+ @descr The SHA1 digest algorithm is specified in
+
+ FIPS PUB 180-1 (Supersedes FIPS PUB 180)
+ Secure Hash Standard
+
+ @see rtl_digest_create()
+ */
+rtlDigest SAL_CALL rtl_digest_createSHA1 (void) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a SHA1 digest handle.
+ @see rtl_digest_destroy()
+ */
+void SAL_CALL rtl_digest_destroySHA1 (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Update a SHA1 digest with given data.
+ @see rtl_digest_update()
+ */
+rtlDigestError SAL_CALL rtl_digest_updateSHA1 (
+ rtlDigest Digest,
+ const void *pData, sal_uInt32 nDatLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Finalize a SHA1 digest and retrieve the digest value.
+ @see rtl_digest_get()
+ */
+rtlDigestError SAL_CALL rtl_digest_getSHA1 (
+ rtlDigest Digest,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Evaluate a SHA1 digest value from given data.
+ @descr This function performs an optimized call sequence on a
+ single data buffer, avoiding digest creation and destruction.
+
+ @see rtl_digest_updateSHA1()
+ @see rtl_digest_getSHA1()
+
+ @param pData [in] data buffer.
+ @param nDatLen [in] data length.
+ @param pBuffer [in] digest value buffer.
+ @param nBufLen [in] digest value length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_SHA1 (
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * rtl_digest_HMAC_MD5 interface.
+ *
+ *======================================================================*/
+#define RTL_DIGEST_LENGTH_HMAC_MD5 RTL_DIGEST_LENGTH_MD5
+
+/** Create a HMAC_MD5 digest handle.
+ @descr The HMAC_MD5 digest algorithm is specified in
+
+ RFC 2104 (Informational)
+ HMAC: Keyed-Hashing for Message Authentication
+
+ @see rtl_digest_create()
+ */
+rtlDigest SAL_CALL rtl_digest_createHMAC_MD5 (void) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a HMAC_MD5 digest handle.
+ @see rtl_digest_destroy()
+ */
+void SAL_CALL rtl_digest_destroyHMAC_MD5 (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Initialize a HMAC_MD5 digest.
+ @see rtl_digest_init()
+
+ @param Digest [in] digest handle.
+ @param pKeyData [in] key material buffer.
+ @param nKeyLen [in] key material length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_initHMAC_MD5 (
+ rtlDigest Digest,
+ const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Update a HMAC_MD5 digest with given data.
+ @see rtl_digest_update()
+ */
+rtlDigestError SAL_CALL rtl_digest_updateHMAC_MD5 (
+ rtlDigest Digest,
+ const void *pData, sal_uInt32 nDatLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Finalize a HMAC_MD5 digest and retrieve the digest value.
+ @see rtl_digest_get()
+ */
+rtlDigestError SAL_CALL rtl_digest_getHMAC_MD5 (
+ rtlDigest Digest,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Evaluate a HMAC_MD5 digest value from given data.
+ @descr This function performs an optimized call sequence on a
+ single data buffer, avoiding digest creation and destruction.
+
+ @see rtl_digest_initHMAC_MD5()
+ @see rtl_digest_updateHMAC_MD5()
+ @see rtl_digest_getHMAC_MD5()
+
+ @param pKeyData [in] key material buffer.
+ @param nKeyLen [in] key material length.
+ @param pData [in] data buffer.
+ @param nDatLen [in] data length.
+ @param pBuffer [in] digest value buffer.
+ @param nBufLen [in] digest value length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_HMAC_MD5 (
+ const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen,
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * rtl_digest_HMAC_SHA1 interface.
+ *
+ *======================================================================*/
+#define RTL_DIGEST_LENGTH_HMAC_SHA1 RTL_DIGEST_LENGTH_SHA1
+
+/** Create a HMAC_SHA1 digest handle.
+ @descr The HMAC_SHA1 digest algorithm is specified in
+
+ RFC 2104 (Informational)
+ HMAC: Keyed-Hashing for Message Authentication
+ RFC 2898 (Informational)
+ PKCS #5: Password-Based Cryptography Specification Version 2.0
+
+ @see rtl_digest_create()
+ */
+rtlDigest SAL_CALL rtl_digest_createHMAC_SHA1 (void) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a HMAC_SHA1 digest handle.
+ @see rtl_digest_destroy()
+ */
+void SAL_CALL rtl_digest_destroyHMAC_SHA1 (
+ rtlDigest Digest
+) SAL_THROW_EXTERN_C();
+
+
+/** Initialize a HMAC_SHA1 digest.
+ @see rtl_digest_init()
+
+ @param Digest [in] digest handle.
+ @param pKeyData [in] key material buffer.
+ @param nKeyLen [in] key material length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_initHMAC_SHA1 (
+ rtlDigest Digest,
+ const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Update a HMAC_SHA1 digest with given data.
+ @see rtl_digest_update()
+ */
+rtlDigestError SAL_CALL rtl_digest_updateHMAC_SHA1 (
+ rtlDigest Digest,
+ const void *pData, sal_uInt32 nDatLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Finalize a HMAC_SHA1 digest and retrieve the digest value.
+ @see rtl_digest_get()
+ */
+rtlDigestError SAL_CALL rtl_digest_getHMAC_SHA1 (
+ rtlDigest Digest,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+
+/** Evaluate a HMAC_SHA1 digest value from given data.
+ @descr This function performs an optimized call sequence on a
+ single data buffer, avoiding digest creation and destruction.
+
+ @see rtl_digest_initHMAC_SHA1()
+ @see rtl_digest_updateHMAC_SHA1()
+ @see rtl_digest_getHMAC_SHA1()
+
+ @param pKeyData [in] key material buffer.
+ @param nKeyLen [in] key material length.
+ @param pData [in] data buffer.
+ @param nDatLen [in] data length.
+ @param pBuffer [in] digest value buffer.
+ @param nBufLen [in] digest value length.
+
+ @return rtl_Digest_E_None upon success.
+ */
+rtlDigestError SAL_CALL rtl_digest_HMAC_SHA1 (
+ const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen,
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * rtl_digest_PBKDF2 interface.
+ *
+ *======================================================================*/
+/** Password-Based Key Derivation Function.
+ @descr The PBKDF2 key derivation function is specified in
+
+ RFC 2898 (Informational)
+ PKCS #5: Password-Based Cryptography Specification Version 2.0
+
+ @param pKeyData [out] derived key
+ @param nKeyLen [in] derived key length
+ @param pPassData [in] password
+ @param nPassLen [in] password length
+ @param pSaltData [in] salt
+ @param nSaltLen [in] salt length
+ @param nCount [in] iteration count
+
+ @return rtl_Digest_E_None upon success.
+*/
+rtlDigestError SAL_CALL rtl_digest_PBKDF2 (
+ sal_uInt8 *pKeyData , sal_uInt32 nKeyLen,
+ const sal_uInt8 *pPassData, sal_uInt32 nPassLen,
+ const sal_uInt8 *pSaltData, sal_uInt32 nSaltLen,
+ sal_uInt32 nCount
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * The End.
+ *
+ *======================================================================*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_DIGEST_H_ */
+
diff --git a/sal/inc/rtl/instance.hxx b/sal/inc/rtl/instance.hxx
new file mode 100644
index 000000000000..0bf4806bafd4
--- /dev/null
+++ b/sal/inc/rtl/instance.hxx
@@ -0,0 +1,472 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if !defined INCLUDED_RTL_INSTANCE_HXX
+#define INCLUDED_RTL_INSTANCE_HXX
+
+#include "osl/doublecheckedlocking.h"
+#include "osl/getglobalmutex.hxx"
+
+namespace {
+
+/** A non-broken version of the double-checked locking pattern.
+
+ See
+ <http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html>
+ for a description of double-checked locking, why it is broken, and how it
+ can be fixed. Always use this template instead of spelling out the
+ double-checked locking pattern explicitly, and only in those rare cases
+ where that is not possible and you have to spell it out explicitly, at
+ least call OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER() at the right
+ places. That way, all platform-dependent code to make double-checked
+ locking work can be kept in one place.
+
+ Usage scenarios:
+
+ 1 Static instance (most common case)
+
+ Pattern:
+
+ T * getInstance()
+ {
+ static T * pInstance = 0;
+ if (!pInstance)
+ {
+ ::osl::MutexGuard aGuard(::osl::Mutex::getGlobalMutex());
+ if (!pInstance)
+ {
+ static T aInstance;
+ pInstance = &aInstance;
+ }
+ }
+ return pInstance;
+ }
+
+ Code:
+
+ #include "rtl/instance.hxx"
+ #include "osl/getglobalmutex.hxx"
+
+ namespace {
+ struct Init
+ {
+ T * operator()()
+ {
+ static T aInstance;
+ return &aInstance;
+ }
+ };
+ }
+
+ T * getInstance()
+ {
+ return rtl_Instance< T, Init, ::osl::MutexGuard,
+ ::osl::GetGlobalMutex >::create(
+ Init(), ::osl::GetGlobalMutex());
+ }
+
+ 2 Dynamic instance
+
+ Pattern:
+
+ T * getInstance()
+ {
+ static T * pInstance = 0;
+ if (!pInstance)
+ {
+ ::osl::MutexGuard aGuard(::osl::Mutex::getGlobalMutex());
+ if (!pInstance)
+ pInstance = new T;
+ }
+ return pInstance;
+ }
+
+ Code:
+
+ #include "rtl/instance.hxx"
+ #include "osl/getglobalmutex.hxx"
+
+ namespace {
+ struct Init
+ {
+ T * operator()()
+ {
+ return new T;
+ }
+ };
+ }
+
+ T * getInstance()
+ {
+ return rtl_Instance< T, Init, ::osl::MutexGuard,
+ ::osl::GetGlobalMutex >::create(
+ Init(), ::osl::GetGlobalMutex());
+ }
+
+ 3 Other guard/mutex
+
+ Pattern:
+
+ T * getInstance()
+ {
+ static T * pInstance = 0;
+ if (!pInstance)
+ {
+ SomeGuard aGuard(pSomeMutex);
+ if (!pInstance)
+ {
+ static T aInstance;
+ pInstance = &aInstance;
+ }
+ }
+ return pInstance;
+ }
+
+ Code:
+
+ #include "rtl/instance.hxx"
+
+ namespace {
+ struct InitInstance
+ {
+ T * operator()()
+ {
+ static T aInstance;
+ return &aInstance;
+ }
+ };
+
+ struct InitGuard
+ {
+ SomeMutex * operator()()
+ {
+ return pSomeMutex;
+ }
+ };
+ }
+
+ T * getInstance()
+ {
+ return rtl_Instance< T, InitInstance,
+ SomeGuard, InitGuard >::create(
+ InitInstance(), InitMutex());
+ }
+
+ 4 Calculate extra data
+
+ Pattern:
+
+ T * getInstance()
+ {
+ static T * pInstance = 0;
+ if (!pInstance)
+ {
+ Data aData(...);
+ ::osl::MutexGuard aGuard(::osl::Mutex::getGlobalMutex());
+ if (!pInstance)
+ {
+ static T aInstance(aData);
+ pInstance = &aInstance;
+ }
+ }
+ return pInstance;
+ }
+
+ Code:
+
+ #include "rtl/instance.hxx"
+ #include "osl/getglobalmutex.hxx"
+
+ namespace {
+ struct InitInstance
+ {
+ T * operator()()
+ {
+ static T aInstance;
+ return &aInstance;
+ }
+ }
+
+ struct InitData
+ {
+ Data const & operator()()
+ {
+ return ...;
+ }
+ }
+ }
+
+ T * getInstance()
+ {
+ return rtl_Instance< T, InitInstance,
+ ::osl::Mutex, ::osl::GetGlobalMutex,
+ Data, InitData >::create(
+ InitInstance(), ::osl::GetGlobalMutex(), InitData());
+ }
+
+ Some comments:
+
+ For any instantiation of rtl_Instance, at most one call to a create method
+ may occur in the program code: Each occurance of a create method within
+ the program code is supposed to return a fresh object instance on the
+ first call, and that same object instance on subsequent calls; but
+ independent occurances of create methods are supposed to return
+ independent object instances. Since there is a one-to-one correspondence
+ between object instances and instantiations of rtl_Instance, the
+ requirement should be clear. One measure to enforce the requirement is
+ that rtl_Instance lives in an unnamed namespace, so that instantiations of
+ rtl_Instance in different translation units will definitely be different
+ instantiations. A drawback of that measure is that the name of the class
+ needs a funny "hand coded" prefix "rtl_" instead of a proper namespace
+ prefix like "::rtl::".
+
+ A known problem with this template is when two occurences of calls to
+ create methods with identical template arguments appear in one translation
+ unit. Those two places will share a single object instance. This can be
+ avoided by using different Init structs (see the above code samples) in
+ the two places.
+
+ There is no need to make m_pInstance volatile, in order to avoid usage of
+ stale copies of m_pInstance: At the first check, a thread will see that
+ m_pInstance contains either 0 or a valid pointer. If it contains a valid
+ pointer, it cannot be stale, and that pointer is used. If it contains 0,
+ acquiring the mutex will ensure that the second check sees a non-stale
+ value in all cases.
+
+ On some compilers, the create methods would not be inlined if they
+ contained any static variables, so m_pInstance is made a class member
+ instead (and the create methods are inlined). But on MSC, the definition
+ of the class member m_pInstance would cause compilation to fail with an
+ internal compiler error. Since MSC is able to inline methods containing
+ static variables, m_pInstance is moved into the methods there. Note that
+ this only works well because for any instantiation of rtl_Instance at most
+ one call to a create method should be present, anyway.
+ */
+template< typename Inst, typename InstCtor,
+ typename Guard, typename GuardCtor,
+ typename Data = int, typename DataCtor = int >
+class rtl_Instance
+{
+public:
+ static inline Inst * create(InstCtor aInstCtor, GuardCtor aGuardCtor)
+ {
+#if defined _MSC_VER
+ static Inst * m_pInstance = 0;
+#endif // _MSC_VER
+ Inst * p = m_pInstance;
+ if (!p)
+ {
+ Guard aGuard(aGuardCtor());
+ p = m_pInstance;
+ if (!p)
+ {
+ p = aInstCtor();
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ m_pInstance = p;
+ }
+ }
+ else
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+ return p;
+ }
+
+ static inline Inst * create(InstCtor aInstCtor, GuardCtor aGuardCtor,
+ DataCtor aDataCtor)
+ {
+#if defined _MSC_VER
+ static Inst * m_pInstance = 0;
+#endif // _MSC_VER
+ Inst * p = m_pInstance;
+ if (!p)
+ {
+ Data aData(aDataCtor());
+ Guard aGuard(aGuardCtor());
+ p = m_pInstance;
+ if (!p)
+ {
+ p = aInstCtor(aData);
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ m_pInstance = p;
+ }
+ }
+ else
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+ return p;
+ }
+
+private:
+#if !defined _MSC_VER
+ static Inst * m_pInstance;
+#endif // _MSC_VER
+};
+
+#if !defined _MSC_VER
+template< typename Inst, typename InstCtor,
+ typename Guard, typename GuardCtor,
+ typename Data, typename DataCtor >
+Inst *
+rtl_Instance< Inst, InstCtor, Guard, GuardCtor, Data, DataCtor >::m_pInstance
+= 0;
+#endif // _MSC_VER
+
+}
+
+namespace rtl {
+
+/** Helper base class for a late-initialized (default-constructed)
+ static variable, implementing the double-checked locking pattern correctly.
+
+ @derive
+ Derive from this class (common practice), e.g.
+ <pre>
+ struct MyStatic : public rtl::Static<MyType, MyStatic> {};
+ ...
+ MyType & rStatic = MyStatic::get();
+ ...
+ </pre>
+
+ @tplparam T
+ variable's type
+ @tplparam Unique
+ Implementation trick to make the inner static holder unique,
+ using the outer class
+ (the one that derives from this base class)
+*/
+template<typename T, typename Unique>
+class Static {
+public:
+ /** Gets the static. Mutual exclusion is performed using the
+ osl global mutex.
+
+ @return
+ static variable
+ */
+ static T & get() {
+ return *rtl_Instance<
+ T, StaticInstance,
+ ::osl::MutexGuard, ::osl::GetGlobalMutex >::create(
+ StaticInstance(), ::osl::GetGlobalMutex() );
+ }
+private:
+ struct StaticInstance {
+ T * operator () () {
+ static T instance;
+ return &instance;
+ }
+ };
+};
+
+/** Helper class for a late-initialized static aggregate, e.g. an array,
+ implementing the double-checked locking pattern correctly.
+
+ @tplparam T
+ aggregate's element type
+ @tplparam InitAggregate
+ initializer functor class
+*/
+template<typename T, typename InitAggregate>
+class StaticAggregate {
+public:
+ /** Gets the static aggregate, late-initializing.
+ Mutual exclusion is performed using the osl global mutex.
+
+ @return
+ aggregate
+ */
+ static T * get() {
+ return rtl_Instance<
+ T, InitAggregate,
+ ::osl::MutexGuard, ::osl::GetGlobalMutex >::create(
+ InitAggregate(), ::osl::GetGlobalMutex() );
+ }
+};
+
+/** Helper base class for a late-initialized static variable,
+ implementing the double-checked locking pattern correctly.
+
+ @derive
+ Derive from this class (common practice),
+ providing an initializer functor class, e.g.
+ <pre>
+ struct MyStatic : public rtl::StaticWithInit<MyType, MyStatic> {
+ MyType operator () () {
+ ...
+ return MyType( ... );
+ }
+ };
+ ...
+ MyType & rStatic = MyStatic::get();
+ ...
+ </pre>
+
+ @tplparam T
+ variable's type
+ @tplparam InitData
+ initializer functor class
+ @tplparam Unique
+ Implementation trick to make the inner static holder unique,
+ using the outer class
+ (the one that derives from this base class).
+ Default is InitData (common practice).
+ @tplparam Data
+ Initializer functor's return type.
+ Default is T (common practice).
+*/
+template<typename T, typename InitData,
+ typename Unique = InitData, typename Data = T>
+class StaticWithInit {
+public:
+ /** Gets the static. Mutual exclusion is performed using the
+ osl global mutex.
+
+ @return
+ static variable
+ */
+ static T & get() {
+ return *rtl_Instance<
+ T, StaticInstanceWithInit,
+ ::osl::MutexGuard, ::osl::GetGlobalMutex,
+ Data, InitData >::create( StaticInstanceWithInit(),
+ ::osl::GetGlobalMutex(),
+ InitData() );
+ }
+private:
+ struct StaticInstanceWithInit {
+ T * operator () ( Data d ) {
+ static T instance(d);
+ return &instance;
+ }
+ };
+};
+
+} // namespace rtl
+
+#endif // INCLUDED_RTL_INSTANCE_HXX
diff --git a/sal/inc/rtl/locale.h b/sal/inc/rtl/locale.h
new file mode 100644
index 000000000000..f2b0016942a3
--- /dev/null
+++ b/sal/inc/rtl/locale.h
@@ -0,0 +1,140 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_LOCALE_H_
+#define _RTL_LOCALE_H_
+
+#include <rtl/ustring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef SAL_W32
+# pragma pack(push, 8)
+#elif defined(SAL_OS2)
+# pragma pack(push, 4)
+#endif
+
+/**
+ The implementation structur of a locale. Do not create this structure
+ direct. Only use the functions rtl_locale_register and
+ rtl_locale_setDefault. The strings Language, Country and Variant
+ are constants, so it is not necessary to acquire and release them.
+ */
+typedef struct _rtl_Locale
+{
+ /**
+ Lowercase two-letter ISO 639-1 or three-letter ISO 639-3 code.
+ */
+ rtl_uString * Language;
+ /**
+ uppercase two-letter ISO-3166 code.
+ */
+ rtl_uString * Country;
+ /**
+ Lowercase vendor and browser specific code.
+ */
+ rtl_uString * Variant;
+ /**
+ The merged hash value of the Language, Country and Variant strings.
+ */
+ sal_Int32 HashCode;
+} rtl_Locale;
+
+#if defined( SAL_W32) || defined(SAL_OS2)
+#pragma pack(pop)
+#endif
+
+/**
+ Register a locale from language, country and variant.
+ @param language lowercase two-letter ISO 639-1 or three-letter ISO 639-3 code.
+ @param country uppercase two-letter ISO-3166 code. May be null.
+ @param variant vendor and browser specific code. May be null.
+ */
+rtl_Locale * SAL_CALL rtl_locale_register( const sal_Unicode * language, const sal_Unicode * country, const sal_Unicode * variant );
+
+/**
+ Common method of getting the current default Locale.
+ Used for the presentation: menus, dialogs, etc.
+ Generally set once when your applet or application is initialized,
+ then never reset. (If you do reset the default locale, you
+ probably want to reload your GUI, so that the change is reflected
+ in your interface.)
+ <p>More advanced programs will allow users to use different locales
+ for different fields, e.g. in a spreadsheet.
+ <BR>Note that the initial setting will match the host system.
+ */
+rtl_Locale * SAL_CALL rtl_locale_getDefault();
+
+/**
+ Sets the default.
+ Normally set once at the beginning of applet or application,
+ then never reset. <code>setDefault</code> does not reset the host locale.
+ @param language lowercase two-letter ISO 639-1 or three-letter ISO 639-3 code.
+ @param country uppercase two-letter ISO-3166 code.
+ @param variant vendor and browser specific code. See class description.
+ */
+void SAL_CALL rtl_locale_setDefault( const sal_Unicode * language, const sal_Unicode * country, const sal_Unicode * variant );
+
+/**
+ Getter for programmatic name of field,
+ a lowercased two-letter ISO 639-1 or three-letter ISO 639-3 code.
+ @see #getDisplayLanguage
+ */
+rtl_uString * SAL_CALL rtl_locale_getLanguage( rtl_Locale * This );
+
+/**
+ Getter for programmatic name of field,
+ an uppercased two-letter ISO-3166 code.
+ @see #getDisplayCountry
+ */
+rtl_uString * SAL_CALL rtl_locale_getCountry( rtl_Locale * This );
+
+/**
+ Getter for programmatic name of field.
+ @see #getDisplayVariant
+ */
+rtl_uString * SAL_CALL rtl_locale_getVariant( rtl_Locale * This );
+
+/**
+ Returns the hash code of the locale This.
+ */
+sal_Int32 SAL_CALL rtl_locale_hashCode( rtl_Locale * This );
+
+/**
+ Returns true if the locals are equal, otherwis false.
+ */
+sal_Int32 SAL_CALL rtl_locale_equals( rtl_Locale * This, rtl_Locale * obj );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_LOCALE_H_ */
+
+
diff --git a/sal/inc/rtl/locale.hxx b/sal/inc/rtl/locale.hxx
new file mode 100644
index 000000000000..7e6526c0e9bc
--- /dev/null
+++ b/sal/inc/rtl/locale.hxx
@@ -0,0 +1,266 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_LOCALE_HXX_
+#define _RTL_LOCALE_HXX_
+
+#include <rtl/locale.h>
+#include <rtl/ustring.hxx>
+
+#ifdef __cplusplus
+
+namespace rtl
+{
+
+/**
+ A <code>OLocale</code> object represents a specific geographical, political,
+ or cultural region. An operation that requires a <code>OLocale</code> to perform
+ its task is called <em>locale-sensitive</em> and uses the <code>OLocale</code>
+ to tailor information for the user. For example, displaying a number
+ is a locale-sensitive operation--the number should be formatted
+ according to the customs/conventions of the user's native country,
+ region, or culture.
+
+ <P>
+ You create a <code>OLocale</code> object using one of the two constructors in
+ this class:
+ <blockquote>
+ <pre>
+ OLocale(String language, String country)
+ OLocale(String language, String country, String variant)
+ </pre>
+ </blockquote>
+ The first argument to both constructors is a valid <STRONG>ISO
+ Language Code.</STRONG> These codes are the lower-case two-letter
+ codes as defined by ISO-639.
+ You can find a full list of these codes at a number of sites, such as:
+ <BR><a href ="http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt">
+ <code>http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt</code></a>
+
+ <P>
+ The second argument to both constructors is a valid <STRONG>ISO Country
+ Code.</STRONG> These codes are the upper-case two-letter codes
+ as defined by ISO-3166.
+ You can find a full list of these codes at a number of sites, such as:
+ <BR><a href="http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html">
+ <code>http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html</code></a>
+
+ <P>
+ The second constructor requires a third argument--the <STRONG>Variant.</STRONG>
+ The Variant codes are vendor and browser-specific.
+ For example, use WIN for Windows, MAC for Macintosh, and POSIX for POSIX.
+ Where there are two variants, separate them with an underscore, and
+ put the most important one first. For
+ example, a Traditional Spanish collation might be referenced, with
+ "ES", "ES", "Traditional_WIN".
+
+ <P>
+ Because a <code>OLocale</code> object is just an identifier for a region,
+ no validity check is performed when you construct a <code>OLocale</code>.
+ If you want to see whether particular resources are available for the
+ <code>OLocale</code> you construct, you must query those resources. For
+ example, ask the <code>NumberFormat</code> for the locales it supports
+ using its <code>getAvailableLocales</code> method.
+ <BR><STRONG>Note:</STRONG> When you ask for a resource for a particular
+ locale, you get back the best available match, not necessarily
+ precisely what you asked for. For more information, look at
+ <a href="java.util.ResourceBundle.html"><code>ResourceBundle</code></a>.
+
+ <P>
+ The <code>OLocale</code> class provides a number of convenient constants
+ that you can use to create <code>OLocale</code> objects for commonly used
+ locales. For example, the following creates a <code>OLocale</code> object
+ for the United States:
+ <blockquote>
+ <pre>
+ OLocale.US
+ </pre>
+ </blockquote>
+
+ <P>
+ Once you've created a <code>OLocale</code> you can query it for information about
+ itself. Use <code>getCountry</code> to get the ISO Country Code and
+ <code>getLanguage</code> to get the ISO Language Code. You can
+ use <code>getDisplayCountry</code> to get the
+ name of the country suitable for displaying to the user. Similarly,
+ you can use <code>getDisplayLanguage</code> to get the name of
+ the language suitable for displaying to the user. Interestingly,
+ the <code>getDisplayXXX</code> methods are themselves locale-sensitive
+ and have two versions: one that uses the default locale and one
+ that uses the locale specified as an argument.
+
+ <P>
+ The JDK provides a number of classes that perform locale-sensitive
+ operations. For example, the <code>NumberFormat</code> class formats
+ numbers, currency, or percentages in a locale-sensitive manner. Classes
+ such as <code>NumberFormat</code> have a number of convenience methods
+ for creating a default object of that type. For example, the
+ <code>NumberFormat</code> class provides these three convenience methods
+ for creating a default <code>NumberFormat</code> object:
+ <blockquote>
+ <pre>
+ NumberFormat.getInstance()
+ NumberFormat.getCurrencyInstance()
+ NumberFormat.getPercentInstance()
+ </pre>
+ </blockquote>
+ These methods have two variants; one with an explicit locale
+ and one without; the latter using the default locale.
+ <blockquote>
+ <pre>
+ NumberFormat.getInstance(myLocale)
+ NumberFormat.getCurrencyInstance(myLocale)
+ NumberFormat.getPercentInstance(myLocale)
+ </pre>
+ </blockquote>
+ A <code>OLocale</code> is the mechanism for identifying the kind of object
+ (<code>NumberFormat</code>) that you would like to get. The locale is
+ <STRONG>just</STRONG> a mechanism for identifying objects,
+ <STRONG>not</STRONG> a container for the objects themselves.
+
+ <P>
+ Each class that performs locale-sensitive operations allows you
+ to get all the available objects of that type. You can sift
+ through these objects by language, country, or variant,
+ and use the display names to present a menu to the user.
+ For example, you can create a menu of all the collation objects
+ suitable for a given language. Such classes must implement these
+ three class methods:
+ <blockquote>
+ <pre>
+ public static OLocale[] getAvailableLocales()
+ public static String getDisplayName(OLocale objectLocale,
+ OLocale displayLocale)
+ public static final String getDisplayName(OLocale objectLocale)
+ // getDisplayName will throw MissingResourceException if the locale
+ // is not one of the available locales.
+ </pre>
+ </blockquote>
+ */
+class OLocale
+{
+public:
+ OLocale( rtl_Locale * locale )
+ : pData( locale ) {}
+
+ OLocale( const OLocale & obj)
+ : pData(obj.pData) {}
+
+ OLocale & operator = ( const OLocale & obj)
+ {
+ pData = obj.pData;
+ return *this;
+ }
+
+ /**
+ Construct a locale from language, country, variant.
+ @param language lowercase two-letter ISO-639 code.
+ @param country uppercase two-letter ISO-3166 code.
+ @param variant vendor and browser specific code. See class description.
+ */
+ static OLocale registerLocale( const OUString & language, const OUString & country,
+ const OUString & variant )
+ {
+ return rtl_locale_register( language, country, variant );
+ }
+
+ /**
+ Construct a locale from language, country.
+ @param language lowercase two-letter ISO-639 code.
+ @param country uppercase two-letter ISO-3166 code.
+ */
+ static OLocale registerLocale( const OUString & language, const OUString & country )
+ {
+ return rtl_locale_register( language, country, NULL );
+ }
+
+ /** @deprecated
+ */
+ static OLocale getDefault() { return rtl_locale_getDefault(); }
+
+ /** @deprecated
+ */
+ static void setDefault( const OUString & language, const OUString & country,
+ const OUString & variant )
+ { rtl_locale_setDefault(language, country, variant); }
+
+ /**
+ Getter for programmatic name of field,
+ an lowercased two-letter ISO-639 code.
+ */
+ OUString getLanguage() const { return pData->Language; }
+
+ /**
+ Getter for programmatic name of field,
+ an uppercased two-letter ISO-3166 code.
+ */
+ OUString getCountry() const { return pData->Country; }
+
+ /**
+ Getter for programmatic name of field.
+ */
+ OUString getVariant() const { return pData->Variant; }
+
+
+ /**
+ Returns the hash code of the locale This.
+ */
+ sal_Int32 hashCode() const { return pData->HashCode; }
+
+ sal_Bool operator == (const OLocale & obj ) const
+ {
+ return pData == obj.pData;
+ }
+
+ rtl_Locale * getData() const { return pData; }
+
+private:
+ /**
+ Must be the first member in this class. OUString access this member with
+ *(rtl_Locale **)&locale.
+ */
+ rtl_Locale * pData;
+
+ OLocale()
+ : pData(rtl_locale_getDefault()) {}
+/*
+ OLocale( const OLocale & obj)
+ : pData(obj.pData) {}
+
+ OLocale & operator = ( const OLocale & obj)
+ { pData = obj.pData;
+ return *this;
+ }
+*/
+};
+
+}
+
+#endif /* __cplusplus */
+#endif /* _RTL_LOCALE_HXX_ */
+
+
diff --git a/sal/inc/rtl/logfile.h b/sal/inc/rtl/logfile.h
new file mode 100644
index 000000000000..dbb9e9c258cf
--- /dev/null
+++ b/sal/inc/rtl/logfile.h
@@ -0,0 +1,134 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_LOGFILE_H_
+#define _RTL_LOGFILE_H_
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** This function allows to log arbitrary messages even in a product-environment.
+
+ The logfile is created on first access and closed, when the sal-library gets unloaded.
+ The file is line buffered. A log file is not created if no log messages are
+ written.
+
+ The first time, rtl_logfile_trace is called, it checks for the bootstrap variable
+ RTL_LOGFILE. If the variable is not empty, it creates a file with the name
+ $(RTL_LOGFILE)_$(PID).log, where $(PID) is the process id of the running process.
+
+ @param pszformat A format string with fprintf-syntax
+ @param ... An arbitrary number of arguments for fprintf, matching the
+ format string.
+*/
+void SAL_CALL rtl_logfile_trace( const sal_Char* pszFormat, ... );
+
+/** Like rtl_logfile_trace, but prefixing every log entry with the current time
+ and thread ID.
+
+ @param format
+ a format string with fprintf-like syntax
+
+ @param ...
+ an arbitrary number of arguments for fprintf, matching the given format
+ string
+
+ @since UDK 3.2.0
+*/
+void SAL_CALL rtl_logfile_longTrace(char const * format, ...);
+
+/** Return if a log file is written.
+
+ @return true if a log file is written
+
+ @since UDK 3.2.11
+*/
+sal_Bool SAL_CALL rtl_logfile_hasLogFile( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef TIMELOG
+#define RTL_LOGFILE_TRACE( string ) \
+ rtl_logfile_longTrace( "| : %s\n", string )
+#define RTL_LOGFILE_TRACE1( frmt, arg1 ) \
+ rtl_logfile_longTrace( "| : " ); \
+ rtl_logfile_trace( frmt, arg1 ); \
+ rtl_logfile_trace( "\n" )
+
+#define RTL_LOGFILE_TRACE2( frmt, arg1 , arg2 ) \
+ rtl_logfile_longTrace( "| : " ); \
+ rtl_logfile_trace( frmt, arg1 , arg2 ); \
+ rtl_logfile_trace( "\n" )
+#define RTL_LOGFILE_TRACE3( frmt, arg1 , arg2 , arg3 ) \
+ rtl_logfile_longTrace( "| : " ); \
+ rtl_logfile_trace( frmt, arg1 , arg2 , arg3 ); \
+ rtl_logfile_trace( "\n" )
+
+// Now the macros with project and author arguments. The strings
+// are formatted in a way, so that the log file can be parsed by
+// post processing scripts.
+#define RTL_LOGFILE_TRACE_AUTHOR( project, author, string ) \
+ rtl_logfile_longTrace( "| %s (%s) : %s\n", \
+ project,\
+ author,\
+ string )
+#define RTL_LOGFILE_TRACE_AUTHOR1( project, author, frmt, arg1 ) \
+ rtl_logfile_longTrace( "| %s (%s) : ", \
+ project,\
+ author );\
+ rtl_logfile_trace( frmt, arg1 ); \
+ rtl_logfile_trace( "\n" )
+
+#define RTL_LOGFILE_TRACE_AUTHOR2( project, author, frmt, arg1 , arg2 ) \
+ rtl_logfile_longTrace( "| %s (%s) : ", \
+ project,\
+ author ); \
+ rtl_logfile_trace( frmt, arg1 , arg2 ); \
+ rtl_logfile_trace( "\n" )
+#define RTL_LOGFILE_TRACE_AUTHOR3( project, author, frmt, arg1 , arg2 , arg3 ) \
+ rtl_logfile_longTrace( "| %s (%s) : ", \
+ project,\
+ author ); \
+ rtl_logfile_trace( frmt, arg1 , arg2 , arg3 ); \
+ rtl_logfile_trace( "\n" )
+#else
+#define RTL_LOGFILE_TRACE( string ) ((void)0)
+#define RTL_LOGFILE_TRACE1( frmt, arg1 ) ((void)0)
+#define RTL_LOGFILE_TRACE2( frmt, arg1 , arg2 ) ((void)0)
+#define RTL_LOGFILE_TRACE3( frmt, arg1 , arg2 , arg3 ) ((void)0)
+
+#define RTL_LOGFILE_TRACE_AUTHOR( project, author, string ) ((void)0)
+#define RTL_LOGFILE_TRACE_AUTHOR1( project, author, frmt, arg1 ) ((void)0)
+#define RTL_LOGFILE_TRACE_AUTHOR2( project, author, frmt, arg1 , arg2 ) ((void)0)
+#define RTL_LOGFILE_TRACE_AUTHOR3( project, author, frmt, arg1 , arg2 , arg3 ) ((void)0)
+#endif // TIMELOG
+#endif
diff --git a/sal/inc/rtl/logfile.hxx b/sal/inc/rtl/logfile.hxx
new file mode 100644
index 000000000000..685637d504b0
--- /dev/null
+++ b/sal/inc/rtl/logfile.hxx
@@ -0,0 +1,205 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_LOGFILE_HXX_
+#define _RTL_LOGFILE_HXX_
+
+#include <rtl/logfile.h>
+#include <rtl/string.hxx>
+
+namespace rtl
+{
+/**
+@descr The intended use for class Logfile is to write time stamp information
+ for profiling purposes.
+
+ Profiling output should only be generated for a special product version of OpenOffice
+ which is compiled with a defined preprocessor symbol 'TIMELOG'.
+ Therefore we have provided a set of macros that uses the class Logfile only if
+ this symbol is defined. If the macros are not sufficient, i.e. you need more
+ then three arguments for a printf style message, then you have to insert an
+ #ifdef TIMELOG/#endif brace yourself.
+
+ Additionally the environment variable RTL_LOGFILE has to be defined in order to generate
+ logging information. If the variable is not empty, it creates a file with the name
+ $(RTL_LOGFILE)_$(PID).log, where $(PID) is the process id of the running process.
+ It can be used as a run time switch for enabling or disabling the logging.
+ Note that this variable is evaluated only once at the first attempt to write a message.
+
+ The class LogFile collects runtime data within its constructor and destructor. It can be
+ used for timing whole functions.
+ If you want to write timing data without context you can use the RTL_LOGFILE_TRACE-macros
+ which are defined inside <rtl/logfile.h>.
+
+ The class LogFile should not be used directly, instead use the RTL_LOGFILE_CONTEXT/
+ RTL_LOGFILE_TRACE-macros.
+
+ Macro usage:
+ ------------
+ RTL_LOGFILE_CONTEXT( instance, name );
+ This macro creates an instance of class LogFile with the name "instance" and writes the current time,
+ thread id and "name" to the log file.
+
+ Example: RTL_LOGFILE_CONTEXT( aLog, "Timing for foo-method" );
+
+ RTL_LOGFILE_CONTEXT_TRACE( instance, mesage );
+ RTL_LOGFILE_CONTEXT_TRACEn( instance, frmt, arg1, .., arg3 );
+ These macros can be used to log information in a "instance" context. The "instance" object
+ is used to log message informations. All macros with "frmt" uses printf notation to log timing infos.
+
+ Example: RTL_LOGFILE_CONTEXT_TRACE( aLog, "Now we call an expensive function" );
+ RTL_LOGFIlE_CONTEXT_TRACE1( aLog, "Config entries read: %u", (unsigned short)i );
+
+ RTL_LOGFILE_TRACE( string );
+ RTL_LOGFILE_TRACEn( frmt, arg1, .., arg3 );
+ These macros can be used to log information outside a context. The macro directly calls
+ rtl_logfile_trace to write the info to the log file. All macros with "frmt" uses printf
+ notation to log timing infos.
+
+ Example: RTL_LOGFILE_TRACE( "Timing for loading a file" );
+ RTL_LOGFILE_TRACE1( aLog, "Timing for loading file: %s", aFileName );
+
+ The lines written to the log file consist of the following space separated elements:
+ 1. The time relative to the start of the global timer in milliseconds. The times is
+ started typically for the first logged line.
+ 2. Thread id. It's absolut value is probably of less interest than providing a way to
+ distinguish different threads.
+ 3. a. An opening or closing curly brace indicating the start or end of a scope.
+ 4a. Function name or general scope identifier.
+ b. A vertical line indicating an arbitrary message.
+ 4b optional function name or general scope identifier.
+ 5b A colon followed by a space and a free form message terminated by a newline.
+
+ There is a second version of creating a context. RTL_LOGFILE_CONTEXT_AUTHOR takes
+ two more arguments, the name of the project and the author's sign who is responsible
+ for the code in which the macro is used.
+*/
+ class Logfile
+ {
+ public:
+ inline Logfile( const sal_Char *name );
+ /** @descr Create a log file context where the message field consists of a project
+ name, the author's shortcut, and the actual message. These three strings
+ are written in a format that is understood by script that later parses the
+ log file and that so can extract the three strings.
+ @param project Short name of the project, like sw for writer or sc for calc.
+ @param author The sign of the person responsible for the code.
+ @param name The actual message, typically a method name.
+ */
+ inline Logfile( const sal_Char *project, const sal_Char *author, const sal_Char *name );
+ inline ~Logfile();
+ inline const sal_Char *getName();
+ private:
+ ::rtl::OString m_sName;
+ };
+
+ inline Logfile::Logfile( const sal_Char *name )
+ : m_sName( name )
+ {
+ rtl_logfile_longTrace( "{ %s\n", name );
+ }
+
+ inline Logfile::Logfile( const sal_Char *project, const sal_Char *author, const sal_Char *name )
+ : m_sName( project)
+ {
+ m_sName += " (";
+ m_sName += author;
+ m_sName += ") ";
+ m_sName += name;
+ rtl_logfile_longTrace( "{ %s\n", m_sName.pData->buffer );
+ }
+
+ inline Logfile::~Logfile()
+ {
+ rtl_logfile_longTrace( "} %s\n", m_sName.pData->buffer );
+ }
+
+ inline const sal_Char * Logfile::getName()
+ {
+ return m_sName.getStr();
+ }
+}
+
+#ifdef TIMELOG
+#define RTL_LOGFILE_CONTEXT( instance, name ) ::rtl::Logfile instance( name )
+#define RTL_LOGFILE_CONTEXT_AUTHOR( instance, project, author, name ) ::rtl::Logfile instance(project, author, name )
+#define RTL_LOGFILE_CONTEXT_TRACE( instance, message ) \
+ rtl_logfile_longTrace( "| %s : %s\n", \
+ instance.getName(), \
+ message )
+#define RTL_LOGFILE_CONTEXT_TRACE1( instance , frmt, arg1 ) \
+ rtl_logfile_longTrace( "| %s : ", \
+ instance.getName() ); \
+ rtl_logfile_trace( frmt , arg1 ); \
+ rtl_logfile_trace( "\n" )
+#define RTL_LOGFILE_CONTEXT_TRACE2( instance , frmt, arg1 , arg2 ) \
+ rtl_logfile_longTrace( "| %s : ", \
+ instance.getName() ); \
+ rtl_logfile_trace( frmt , arg1 , arg2 ); \
+ rtl_logfile_trace( "\n" )
+#define RTL_LOGFILE_CONTEXT_TRACE3( instance , frmt, arg1 , arg2 , arg3 ) \
+ rtl_logfile_longTrace( "| %s : ", \
+ instance.getName() ); \
+ rtl_logfile_trace( frmt , arg1 , arg2 , arg3 ); \
+ rtl_logfile_trace( "\n" )
+
+#else
+#define RTL_LOGFILE_CONTEXT( instance, name ) ((void)0)
+#define RTL_LOGFILE_CONTEXT_AUTHOR( instance, project, author, name ) ((void)0)
+#define RTL_LOGFILE_CONTEXT_TRACE( instance, message ) ((void)0)
+#define RTL_LOGFILE_CONTEXT_TRACE1( instance, frmt, arg1 ) ((void)0)
+#define RTL_LOGFILE_CONTEXT_TRACE2( instance, frmt, arg1, arg2 ) ((void)0)
+#define RTL_LOGFILE_CONTEXT_TRACE3( instance, frmt, arg1, arg2 , arg3 ) ((void)0)
+#endif
+
+// Normal RTL_LOGFILE_* entries will not make it into release versions,
+// TIMELOG is disabled a few versions prior relase build.
+//
+// We need some logs also in these builds, eg. for making performance regression tests.
+//
+// POLICY: Don't use RTL_LOGFILE_PRODUCT_* for your personal logging information.
+// Be aware that these logs make it into the product shipped to customers.
+// If you have good reasons for doing this, please contact product management.
+
+#define RTL_LOGFILE_PRODUCT_TRACE( string ) \
+ rtl_logfile_longTrace( "| : %s\n", string )
+#define RTL_LOGFILE_PRODUCT_TRACE1( frmt, arg1 ) \
+ rtl_logfile_longTrace( "| : " ); \
+ rtl_logfile_trace( frmt, arg1 ); \
+ rtl_logfile_trace( "\n" )
+#define RTL_LOGFILE_PRODUCT_CONTEXT( instance, name ) \
+ ::rtl::Logfile instance( name )
+#define RTL_LOGFILE_PRODUCT_CONTEXT_TRACE1( instance, frmt, arg1 ) \
+ rtl_logfile_longTrace( "| %s : ", \
+ instance.getName() ); \
+ rtl_logfile_trace( frmt, arg1 ); \
+ rtl_logfile_trace( "\n" )
+#define RTL_LOGFILE_HASLOGFILE() \
+ rtl_logfile_hasLogFile()
+
+
+#endif
+
diff --git a/sal/inc/rtl/malformeduriexception.hxx b/sal/inc/rtl/malformeduriexception.hxx
new file mode 100644
index 000000000000..731d762e23cb
--- /dev/null
+++ b/sal/inc/rtl/malformeduriexception.hxx
@@ -0,0 +1,74 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_MALFORMEDURIEXCEPTION_HXX
+#define INCLUDED_RTL_MALFORMEDURIEXCEPTION_HXX
+
+#include "rtl/ustring.hxx"
+
+namespace rtl {
+
+/** An exception indicating a malformed URI.
+
+ <P>Used when parsing (part of) a URI fails for syntactical reasons.</P>
+ */
+class SAL_EXCEPTION_DLLPUBLIC_EXPORT MalformedUriException
+{
+public:
+ /** Create a MalformedUriException.
+
+ @param rMessage
+ A message containing any details about the exception.
+ */
+ inline SAL_EXCEPTION_DLLPRIVATE MalformedUriException(
+ rtl::OUString const & rMessage): m_aMessage(rMessage) {}
+
+ inline SAL_EXCEPTION_DLLPRIVATE MalformedUriException(
+ MalformedUriException const & other): m_aMessage(other.m_aMessage) {}
+
+ inline SAL_EXCEPTION_DLLPRIVATE ~MalformedUriException() {}
+
+ inline SAL_EXCEPTION_DLLPRIVATE MalformedUriException operator =(
+ MalformedUriException const & rOther)
+ { m_aMessage = rOther.m_aMessage; return *this; }
+
+ /** Get the message.
+
+ @return
+ A reference to the message. The reference is valid for the lifetime of
+ this MalformedUriException.
+ */
+ inline SAL_EXCEPTION_DLLPRIVATE rtl::OUString const & getMessage() const
+ { return m_aMessage; }
+
+private:
+ rtl::OUString m_aMessage;
+};
+
+}
+
+#endif // INCLUDED_RTL_MALFORMEDURIEXCEPTION_HXX
diff --git a/sal/inc/rtl/math.h b/sal/inc/rtl/math.h
new file mode 100644
index 000000000000..fa81108df29f
--- /dev/null
+++ b/sal/inc/rtl/math.h
@@ -0,0 +1,478 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if !defined INCLUDED_RTL_MATH_H
+#define INCLUDED_RTL_MATH_H
+
+#include "rtl/ustring.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** Formatting modes for rtl_math_doubleToString and rtl_math_doubleToUString
+ and rtl_math_doubleToUStringBuffer.
+ */
+enum rtl_math_StringFormat
+{
+ /** Like sprintf() %E.
+ */
+ rtl_math_StringFormat_E,
+
+ /** Like sprintf() %f.
+ */
+ rtl_math_StringFormat_F,
+
+ /** Like sprintf() %G, 'F' or 'E' format is used depending on which one is
+ more compact.
+ */
+ rtl_math_StringFormat_G,
+
+ /** Automatic, 'F' or 'E' format is used depending on the numeric value to
+ be formatted.
+ */
+ rtl_math_StringFormat_Automatic,
+
+ /** @internal
+ */
+ rtl_math_StringFormat_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Status for rtl_math_stringToDouble and rtl_math_uStringToDouble.
+ */
+enum rtl_math_ConversionStatus
+{
+ /** Conversion was successful.
+ */
+ rtl_math_ConversionStatus_Ok,
+
+ /** Conversion caused overflow or underflow.
+ */
+ rtl_math_ConversionStatus_OutOfRange,
+
+ /** @internal
+ */
+ rtl_math_ConversionStatus_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Rounding modes for rtl_math_round.
+ */
+enum rtl_math_RoundingMode
+{
+ /** Like HalfUp, but corrects roundoff errors, preferred.
+ */
+ rtl_math_RoundingMode_Corrected,
+
+ /** Floor of absolute value, signed return (commercial).
+ */
+ rtl_math_RoundingMode_Down,
+
+ /** Ceil of absolute value, signed return (commercial).
+ */
+ rtl_math_RoundingMode_Up,
+
+ /** Floor of signed value.
+ */
+ rtl_math_RoundingMode_Floor,
+
+ /** Ceil of signed value.
+ */
+ rtl_math_RoundingMode_Ceiling,
+
+ /** Frac <= 0.5 ? floor of abs : ceil of abs, signed return.
+ */
+ rtl_math_RoundingMode_HalfDown,
+
+ /** Frac < 0.5 ? floor of abs : ceil of abs, signed return (mathematical).
+ */
+ rtl_math_RoundingMode_HalfUp,
+
+ /** IEEE rounding mode (statistical).
+ */
+ rtl_math_RoundingMode_HalfEven,
+
+ /** @internal
+ */
+ rtl_math_RoundingMode_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Special decimal places constants for rtl_math_doubleToString and
+ rtl_math_doubleToUString and rtl_math_doubleToUStringBuffer.
+ */
+enum rtl_math_DecimalPlaces
+{
+ /** Value to be used with rtl_math_StringFormat_Automatic.
+ */
+ rtl_math_DecimalPlaces_Max = 0x7ffffff,
+
+ /** Value to be used with rtl_math_StringFormat_G.
+ In fact the same value as rtl_math_DecimalPlaces_Max, just an alias for
+ better understanding.
+ */
+ rtl_math_DecimalPlaces_DefaultSignificance = 0x7ffffff
+};
+
+
+/** Conversions analogous to sprintf() using internal rounding.
+
+ +/-HUGE_VAL are converted to "INF" and "-INF", NAN values are
+ converted to "NaN".
+
+ @param pResult
+ Returns the resulting byte string. Must itself not be null, and must point
+ to either null or a valid string.
+
+ @param pResultCapacity
+ If null, pResult is considered to point to immutable strings, and a new
+ string will be allocated in pResult.
+ If non-null, it points to the current capacity of pResult, which is
+ considered to point to a string buffer (pResult must not itself be null in
+ this case, and must point to a string that has room for the given capacity).
+ The string representation of the given double value is inserted into pResult
+ at position nResultOffset. If pResult's current capacity is too small, a
+ new string buffer will be allocated in pResult as necessary, and
+ pResultCapacity will contain the new capacity on return.
+
+ @param nResultOffset
+ If pResult is used as a string buffer (i.e., pResultCapacity is non-null),
+ nResultOffset specifies the insertion offset within the buffer. Ignored
+ otherwise.
+
+ @param fValue
+ The value to convert.
+
+ @param eFormat
+ The format to use, one of rtl_math_StringFormat.
+
+ @param nDecPlaces
+ The number of decimals to be generated. Effectively fValue is rounded at
+ this position, specifying nDecPlaces <= 0 accordingly rounds the value
+ before the decimal point and fills with zeros.
+ If eFormat == rtl_math_StringFormat_Automatic and nDecPlaces ==
+ rtl_math_DecimalPlaces_Max, the highest number of significant decimals
+ possible is generated.
+ If eFormat == rtl_math_StringFormat_G, nDecPlaces specifies the number of
+ significant digits instead. If nDecPlaces ==
+ rtl_math_DecimalPlaces_DefaultSignificance, the default number (currently 6
+ as implemented by most libraries) of significant digits is generated.
+ According to the ANSI C90 standard the E style will be used only if the
+ exponent resulting from the conversion is less than -4 or greater than or
+ equal to the precision. However, as opposed to the ANSI standard, trailing
+ zeros are not necessarily removed from the fractional portion of the result
+ unless bEraseTrailingDecZeros == true was specified.
+
+ @param cDecSeparator
+ The decimal separator.
+
+ @param pGroups
+ Either null (no grouping is used), or a null-terminated list of group
+ lengths. Each group length must be strictly positive. If the number of
+ digits in a conversion exceeds the specified range, the last (highest) group
+ length is repeated as needed. Values are applied from right to left, for a
+ grouping of 1,00,00,000 you'd have to specify pGroups={3,2,0}.
+
+ @param cGroupSeparator
+ The group separator. Ignored if pGroups is null.
+
+ @param bEraseTrailingDecZeros
+ Trailing zeros in decimal places are erased.
+ */
+void SAL_CALL rtl_math_doubleToString(rtl_String ** pResult,
+ sal_Int32 * pResultCapacity,
+ sal_Int32 nResultOffset, double fValue,
+ enum rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Char cDecSeparator,
+ sal_Int32 const * pGroups,
+ sal_Char cGroupSeparator,
+ sal_Bool bEraseTrailingDecZeros)
+ SAL_THROW_EXTERN_C();
+
+/** Conversions analogous to sprintf() using internal rounding.
+
+ +/-HUGE_VAL are converted to "INF" and "-INF", NAN values are
+ converted to "NaN".
+
+ @param pResult
+ Returns the resulting Unicode string. Must itself not be null, and must
+ point to either null or a valid string.
+
+ @param pResultCapacity
+ If null, pResult is considered to point to immutable strings, and a new
+ string will be allocated in pResult.
+ If non-null, it points to the current capacity of pResult, which is
+ considered to point to a string buffer (pResult must not itself be null in
+ this case, and must point to a string that has room for the given capacity).
+ The string representation of the given double value is inserted into pResult
+ at position nResultOffset. If pResult's current capacity is too small, a
+ new string buffer will be allocated in pResult as necessary, and
+ pResultCapacity will contain the new capacity on return.
+
+ @param nResultOffset
+ If pResult is used as a string buffer (i.e., pResultCapacity is non-null),
+ nResultOffset specifies the insertion offset within the buffer. Ignored
+ otherwise.
+
+ @param fValue
+ The value to convert.
+
+ @param eFormat
+ The format to use, one of rtl_math_StringFormat.
+
+ @param nDecPlaces
+ The number of decimals to be generated. Effectively fValue is rounded at
+ this position, specifying nDecPlaces <= 0 accordingly rounds the value
+ before the decimal point and fills with zeros.
+ If eFormat == rtl_math_StringFormat_Automatic and nDecPlaces ==
+ rtl_math_DecimalPlaces_Max, the highest number of significant decimals
+ possible is generated.
+ If eFormat == rtl_math_StringFormat_G, nDecPlaces specifies the number of
+ significant digits instead. If nDecPlaces ==
+ rtl_math_DecimalPlaces_DefaultSignificance, the default number (currently 6
+ as implemented by most libraries) of significant digits is generated.
+ According to the ANSI C90 standard the E style will be used only if the
+ exponent resulting from the conversion is less than -4 or greater than or
+ equal to the precision. However, as opposed to the ANSI standard, trailing
+ zeros are not necessarily removed from the fractional portion of the result
+ unless bEraseTrailingDecZeros == true was specified.
+
+ @param cDecSeparator
+ The decimal separator.
+
+ @param pGroups
+ Either null (no grouping is used), or a null-terminated list of group
+ lengths. Each group length must be strictly positive. If the number of
+ digits in a conversion exceeds the specified range, the last (highest) group
+ length is repeated as needed. Values are applied from right to left, for a
+ grouping of 1,00,00,000 you'd have to specify pGroups={3,2,0}.
+
+ @param cGroupSeparator
+ The group separator. Ignored if pGroups is null.
+
+ @param bEraseTrailingDecZeros
+ Trailing zeros in decimal places are erased.
+ */
+void SAL_CALL rtl_math_doubleToUString(rtl_uString ** pResult,
+ sal_Int32 * pResultCapacity,
+ sal_Int32 nResultOffset, double fValue,
+ enum rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Unicode cDecSeparator,
+ sal_Int32 const * pGroups,
+ sal_Unicode cGroupSeparator,
+ sal_Bool bEraseTrailingDecZeros)
+ SAL_THROW_EXTERN_C();
+
+/** Conversion analogous to strtod(), convert a string representing a
+ decimal number into a double value.
+
+ Leading tabs (0x09) and spaces (0x20) are eaten. Overflow returns
+ +/-HUGE_VAL, underflow 0. In both cases pStatus is set to
+ rtl_math_ConversionStatus_OutOfRange, otherwise to
+ rtl_math_ConversionStatus_Ok. "INF", "-INF" and "+/-1.#INF" are
+ recognized as +/-HUGE_VAL, pStatus is set to
+ rtl_math_ConversionStatus_OutOfRange. "NaN" and "+/-1.#NAN" are
+ recognized and the value is set to +/-NAN, pStatus is set to
+ rtl_math_ConversionStatus_Ok.
+
+ @param pBegin
+ Points to the start of the byte string to convert. Must not be null.
+
+ @param pEnd
+ Points one past the end of the byte string to convert. The condition
+ pEnd >= pBegin must hold.
+
+ @param cDecSeparator
+ The decimal separator.
+
+ @param cGroupSeparator
+ The group (aka thousands) separator.
+
+ @param pStatus
+ If non-null, returns the status of the conversion.
+
+ @param pParsedEnd
+ If non-null, returns one past the position of the last character parsed
+ away. Thus if [pBegin..pEnd) only contains the numerical string to be
+ parsed, *pParsedEnd == pEnd on return. If no numerical (sub-)string is
+ found, *pParsedEnd == pBegin on return, even if there was leading
+ whitespace.
+ */
+double SAL_CALL rtl_math_stringToDouble(
+ sal_Char const * pBegin, sal_Char const * pEnd, sal_Char cDecSeparator,
+ sal_Char cGroupSeparator, enum rtl_math_ConversionStatus * pStatus,
+ sal_Char const ** pParsedEnd) SAL_THROW_EXTERN_C();
+
+/** Conversion analogous to strtod(), convert a string representing a
+ decimal number into a double value.
+
+ Leading tabs (U+0009) and spaces (U+0020) are eaten. Overflow returns
+ +/-HUGE_VAL, underflow 0. In both cases pStatus is set to
+ rtl_math_ConversionStatus_OutOfRange, otherwise to
+ rtl_math_ConversionStatus_Ok. "INF", "-INF" and "+/-1.#INF" are
+ recognized as +/-HUGE_VAL, pStatus is set to
+ rtl_math_ConversionStatus_OutOfRange. "NaN" and "+/-1.#NAN" are
+ recognized and the value is set to +/-NAN, pStatus is set to
+ rtl_math_ConversionStatus_Ok.
+
+ @param pBegin
+ Points to the start of the Unicode string to convert. Must not be null.
+
+ @param pEnd
+ Points one past the end of the Unicode string to convert. The condition
+ pEnd >= pBegin must hold.
+
+ @param cDecSeparator
+ The decimal separator.
+
+ @param cGroupSeparator
+ The group (aka thousands) separator.
+
+ @param pStatus
+ If non-null, returns the status of the conversion.
+
+ @param pParsedEnd
+ If non-null, returns one past the position of the last character parsed
+ away. Thus if [pBegin..pEnd) only contains the numerical string to be
+ parsed, *pParsedEnd == pEnd on return. If no numerical (sub-)string is
+ found, *pParsedEnd == pBegin on return, even if there was leading
+ whitespace.
+ */
+double SAL_CALL rtl_math_uStringToDouble(
+ sal_Unicode const * pBegin, sal_Unicode const * pEnd,
+ sal_Unicode cDecSeparator, sal_Unicode cGroupSeparator,
+ enum rtl_math_ConversionStatus * pStatus, sal_Unicode const ** pParsedEnd)
+ SAL_THROW_EXTERN_C();
+
+/** Rounds a double value.
+
+ @param fValue
+ Specifies the value to be rounded.
+
+ @param nDecPlaces
+ Specifies the decimal place where rounding occurs. Must be in the range
+ -20 to +20, inclusive. Negative if rounding occurs before the decimal
+ point.
+
+ @param eMode
+ Specifies the rounding mode.
+ */
+double SAL_CALL rtl_math_round(double fValue, int nDecPlaces,
+ enum rtl_math_RoundingMode eMode)
+ SAL_THROW_EXTERN_C();
+
+/** Scales fVal to a power of 10 without calling pow() or div() for nExp values
+ between -16 and +16, providing a faster method.
+
+ @param fValue
+ The value to be raised.
+
+ @param nExp
+ The exponent.
+
+ @return
+ fVal * pow(10.0, nExp)
+ */
+double SAL_CALL rtl_math_pow10Exp(double fValue, int nExp) SAL_THROW_EXTERN_C();
+
+/** Rounds value to 15 significant decimal digits.
+
+ @param fValue
+ The value to be rounded.
+ */
+double SAL_CALL rtl_math_approxValue(double fValue) SAL_THROW_EXTERN_C();
+
+/** Returns more accurate e^x-1 for x near 0 than calculating directly.
+
+ expm1 is part of the C99 standard, but not provided by some compilers.
+
+ @param fValue
+ The value x in the term e^x-1.
+ */
+double SAL_CALL rtl_math_expm1(double fValue) SAL_THROW_EXTERN_C();
+
+/** Returns more accurate log(1+x) for x near 0 than calculating directly.
+
+ log1p is part of the C99 standard, but not provided by some compilers.
+
+ @param fValue
+ The value x in the term log(1+x).
+ */
+double SAL_CALL rtl_math_log1p(double fValue) SAL_THROW_EXTERN_C();
+
+/** Returns more accurate atanh(x) for x near 0 than calculating
+ 0.5*log((1+x)/(1-x)).
+
+ atanh is part of the C99 standard, but not provided by some compilers.
+
+ @param fValue
+ The value x in the term atanh(x).
+ */
+double SAL_CALL rtl_math_atanh(double fValue) SAL_THROW_EXTERN_C();
+
+/** Returns values of the Errorfunction erf.
+
+ erf is part of the C99 standard, but not provided by some compilers.
+
+ @param fValue
+ The value x in the term erf(x).
+ */
+double SAL_CALL rtl_math_erf(double fValue) SAL_THROW_EXTERN_C();
+
+/** Returns values of the complement Errorfunction erfc.
+
+ erfc is part of the C99 standard, but not provided by some compilers.
+
+ @param fValue
+ The value x in the term erfc(x).
+ */
+double SAL_CALL rtl_math_erfc(double fValue) SAL_THROW_EXTERN_C();
+
+/** Returns values of the inverse hyperbolic sine.
+
+ asinh is part of the C99 standard, but not provided by some compilers.
+
+ @param fValue
+ The value x in the term asinh(x).
+ */
+double SAL_CALL rtl_math_asinh(double fValue) SAL_THROW_EXTERN_C();
+
+/** Returns values of the inverse hyperbolic cosine.
+
+ acosh is part of the C99 standard, but not provided by some compilers.
+
+ @param fValue
+ The value x in the term acosh(x).
+ */
+double SAL_CALL rtl_math_acosh(double fValue) SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* INCLUDED_RTL_MATH_H */
diff --git a/sal/inc/rtl/math.hxx b/sal/inc/rtl/math.hxx
new file mode 100644
index 000000000000..31308b561185
--- /dev/null
+++ b/sal/inc/rtl/math.hxx
@@ -0,0 +1,432 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if !defined INCLUDED_RTL_MATH_HXX
+#define INCLUDED_RTL_MATH_HXX
+
+#include "rtl/math.h"
+#include "rtl/string.hxx"
+#include "rtl/ustring.hxx"
+#include "rtl/ustrbuf.hxx"
+#include "sal/mathconf.h"
+#include "sal/types.h"
+
+#include <math.h>
+
+namespace rtl {
+
+namespace math {
+
+/** A wrapper around rtl_math_doubleToString.
+ */
+inline rtl::OString doubleToString(double fValue, rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Char cDecSeparator,
+ sal_Int32 const * pGroups,
+ sal_Char cGroupSeparator,
+ bool bEraseTrailingDecZeros = false)
+{
+ rtl::OString aResult;
+ rtl_math_doubleToString(&aResult.pData, 0, 0, fValue, eFormat, nDecPlaces,
+ cDecSeparator, pGroups, cGroupSeparator,
+ bEraseTrailingDecZeros);
+ return aResult;
+}
+
+/** A wrapper around rtl_math_doubleToString, with no grouping.
+ */
+inline rtl::OString doubleToString(double fValue, rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Char cDecSeparator,
+ bool bEraseTrailingDecZeros = false)
+{
+ rtl::OString aResult;
+ rtl_math_doubleToString(&aResult.pData, 0, 0, fValue, eFormat, nDecPlaces,
+ cDecSeparator, 0, 0, bEraseTrailingDecZeros);
+ return aResult;
+}
+
+/** A wrapper around rtl_math_doubleToUString.
+ */
+inline rtl::OUString doubleToUString(double fValue,
+ rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Unicode cDecSeparator,
+ sal_Int32 const * pGroups,
+ sal_Unicode cGroupSeparator,
+ bool bEraseTrailingDecZeros = false)
+{
+ rtl::OUString aResult;
+ rtl_math_doubleToUString(&aResult.pData, 0, 0, fValue, eFormat, nDecPlaces,
+ cDecSeparator, pGroups, cGroupSeparator,
+ bEraseTrailingDecZeros);
+ return aResult;
+}
+
+/** A wrapper around rtl_math_doubleToUString, with no grouping.
+ */
+inline rtl::OUString doubleToUString(double fValue,
+ rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Unicode cDecSeparator,
+ bool bEraseTrailingDecZeros = false)
+{
+ rtl::OUString aResult;
+ rtl_math_doubleToUString(&aResult.pData, 0, 0, fValue, eFormat, nDecPlaces,
+ cDecSeparator, 0, 0, bEraseTrailingDecZeros);
+ return aResult;
+}
+
+/** A wrapper around rtl_math_doubleToUString that appends to an
+ rtl::OUStringBuffer.
+ */
+inline void doubleToUStringBuffer( rtl::OUStringBuffer& rBuffer, double fValue,
+ rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Unicode cDecSeparator,
+ sal_Int32 const * pGroups,
+ sal_Unicode cGroupSeparator,
+ bool bEraseTrailingDecZeros = false)
+{
+ rtl_uString ** pData;
+ sal_Int32 * pCapacity;
+ rBuffer.accessInternals( &pData, &pCapacity );
+ rtl_math_doubleToUString( pData, pCapacity, rBuffer.getLength(), fValue,
+ eFormat, nDecPlaces, cDecSeparator, pGroups,
+ cGroupSeparator, bEraseTrailingDecZeros);
+}
+
+/** A wrapper around rtl_math_doubleToUString that appends to an
+ rtl::OUStringBuffer, with no grouping.
+ */
+inline void doubleToUStringBuffer( rtl::OUStringBuffer& rBuffer, double fValue,
+ rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Unicode cDecSeparator,
+ bool bEraseTrailingDecZeros = false)
+{
+ rtl_uString ** pData;
+ sal_Int32 * pCapacity;
+ rBuffer.accessInternals( &pData, &pCapacity );
+ rtl_math_doubleToUString( pData, pCapacity, rBuffer.getLength(), fValue,
+ eFormat, nDecPlaces, cDecSeparator, 0, 0,
+ bEraseTrailingDecZeros);
+}
+
+/** A wrapper around rtl_math_stringToDouble.
+ */
+inline double stringToDouble(rtl::OString const & rString,
+ sal_Char cDecSeparator, sal_Char cGroupSeparator,
+ rtl_math_ConversionStatus * pStatus,
+ sal_Int32 * pParsedEnd)
+{
+ sal_Char const * pBegin = rString.getStr();
+ sal_Char const * pEnd;
+ double fResult = rtl_math_stringToDouble(pBegin,
+ pBegin + rString.getLength(),
+ cDecSeparator, cGroupSeparator,
+ pStatus, &pEnd);
+ if (pParsedEnd != 0)
+ *pParsedEnd = (sal_Int32)(pEnd - pBegin);
+ return fResult;
+}
+
+/** A wrapper around rtl_math_uStringToDouble.
+ */
+inline double stringToDouble(rtl::OUString const & rString,
+ sal_Unicode cDecSeparator,
+ sal_Unicode cGroupSeparator,
+ rtl_math_ConversionStatus * pStatus,
+ sal_Int32 * pParsedEnd)
+{
+ sal_Unicode const * pBegin = rString.getStr();
+ sal_Unicode const * pEnd;
+ double fResult = rtl_math_uStringToDouble(pBegin,
+ pBegin + rString.getLength(),
+ cDecSeparator, cGroupSeparator,
+ pStatus, &pEnd);
+ if (pParsedEnd != 0)
+ *pParsedEnd = (sal_Int32)(pEnd - pBegin);
+ return fResult;
+}
+
+/** A wrapper around rtl_math_round.
+ */
+inline double round(
+ double fValue, int nDecPlaces = 0,
+ rtl_math_RoundingMode eMode = rtl_math_RoundingMode_Corrected)
+{
+ return rtl_math_round(fValue, nDecPlaces, eMode);
+}
+
+/** A wrapper around rtl_math_pow10Exp.
+ */
+inline double pow10Exp(double fValue, int nExp)
+{
+ return rtl_math_pow10Exp(fValue, nExp);
+}
+
+/** A wrapper around rtl_math_approxValue.
+ */
+inline double approxValue(double fValue)
+{
+ return rtl_math_approxValue(fValue);
+}
+
+/** A wrapper around rtl_math_expm1.
+ */
+inline double expm1(double fValue)
+{
+ return rtl_math_expm1(fValue);
+}
+
+/** A wrapper around rtl_math_log1p.
+ */
+inline double log1p(double fValue)
+{
+ return rtl_math_log1p(fValue);
+}
+
+/** A wrapper around rtl_math_atanh.
+ */
+inline double atanh(double fValue)
+{
+ return rtl_math_atanh(fValue);
+}
+
+/** A wrapper around rtl_math_erf.
+ */
+inline double erf(double fValue)
+{
+ return rtl_math_erf(fValue);
+}
+
+/** A wrapper around rtl_math_erfc.
+ */
+inline double erfc(double fValue)
+{
+ return rtl_math_erfc(fValue);
+}
+
+/** A wrapper around rtl_math_asinh.
+ */
+inline double asinh(double fValue)
+{
+ return rtl_math_asinh(fValue);
+}
+
+/** A wrapper around rtl_math_acosh.
+ */
+inline double acosh(double fValue)
+{
+ return rtl_math_acosh(fValue);
+}
+
+
+/** Test equality of two values with an accuracy of the magnitude of the
+ given values scaled by 2^-48 (4 bits roundoff stripped).
+
+ @ATTENTION
+ approxEqual( value!=0.0, 0.0 ) _never_ yields true.
+ */
+inline bool approxEqual(double a, double b)
+{
+ if ( a == b )
+ return true;
+ double x = a - b;
+ return (x < 0.0 ? -x : x)
+ < ((a < 0.0 ? -a : a) * (1.0 / (16777216.0 * 16777216.0)));
+}
+
+/** Add two values.
+
+ If signs differ and the absolute values are equal according to approxEqual()
+ the method returns 0.0 instead of calculating the sum.
+
+ If you wanted to sum up multiple values it would be convenient not to call
+ approxAdd() for each value but instead remember the first value not equal to
+ 0.0, add all other values using normal + operator, and with the result and
+ the remembered value call approxAdd().
+ */
+inline double approxAdd(double a, double b)
+{
+ if ( ((a < 0.0 && b > 0.0) || (b < 0.0 && a > 0.0))
+ && approxEqual( a, -b ) )
+ return 0.0;
+ return a + b;
+}
+
+/** Substract two values (a-b).
+
+ If signs are identical and the values are equal according to approxEqual()
+ the method returns 0.0 instead of calculating the substraction.
+ */
+inline double approxSub(double a, double b)
+{
+ if ( ((a < 0.0 && b < 0.0) || (a > 0.0 && b > 0.0)) && approxEqual( a, b ) )
+ return 0.0;
+ return a - b;
+}
+
+/** floor() method taking approxValue() into account.
+
+ Use for expected integer values being calculated by double functions.
+ */
+inline double approxFloor(double a)
+{
+ return floor( approxValue( a ));
+}
+
+/** ceil() method taking approxValue() into account.
+
+ Use for expected integer values being calculated by double functions.
+ */
+inline double approxCeil(double a)
+{
+ return ceil( approxValue( a ));
+}
+
+/** Tests whether a value is neither INF nor NAN.
+ */
+inline bool isFinite(double d)
+{
+ return SAL_MATH_FINITE(d) != 0;
+}
+
+/** If a value represents +INF or -INF.
+
+ The sign bit may be queried with isSignBitSet().
+
+ If isFinite(d)==false and isInf(d)==false then NAN.
+ */
+inline bool isInf(double d)
+{
+ // exponent==0x7ff fraction==0
+ return (SAL_MATH_FINITE(d) == 0) &&
+ (reinterpret_cast< sal_math_Double * >(&d)->inf_parts.fraction_hi == 0)
+ && (reinterpret_cast< sal_math_Double * >(&d)->inf_parts.fraction_lo
+ == 0);
+}
+
+/** Test on any QNAN or SNAN.
+ */
+inline bool isNan(double d)
+{
+ // exponent==0x7ff fraction!=0
+ return (SAL_MATH_FINITE(d) == 0) && (
+ (reinterpret_cast< sal_math_Double * >(&d)->inf_parts.fraction_hi != 0)
+ || (reinterpret_cast< sal_math_Double * >(&d)->inf_parts.fraction_lo
+ != 0) );
+}
+
+/** If the sign bit is set.
+ */
+inline bool isSignBitSet(double d)
+{
+ return reinterpret_cast< sal_math_Double * >(&d)->inf_parts.sign != 0;
+}
+
+/** Set to +INF if bNegative==false or -INF if bNegative==true.
+ */
+inline void setInf(double * pd, bool bNegative)
+{
+ union
+ {
+ double sd;
+ sal_math_Double md;
+ };
+ md.w32_parts.msw = bNegative ? 0xFFF00000 : 0x7FF00000;
+ md.w32_parts.lsw = 0;
+ *pd = sd;
+}
+
+/** Set a QNAN.
+ */
+inline void setNan(double * pd)
+{
+ union
+ {
+ double sd;
+ sal_math_Double md;
+ };
+ md.w32_parts.msw = 0x7FFFFFFF;
+ md.w32_parts.lsw = 0xFFFFFFFF;
+ *pd = sd;
+}
+
+/** If a value is a valid argument for sin(), cos(), tan().
+
+ IEEE 754 specifies that absolute values up to 2^64 (=1.844e19) for the
+ radian must be supported by trigonometric functions. Unfortunately, at
+ least on x86 architectures, the FPU doesn't generate an error pattern for
+ values >2^64 but produces erroneous results instead and sets only the
+ "invalid operation" (IM) flag in the status word :-( Thus the application
+ has to handle it itself.
+ */
+inline bool isValidArcArg(double d)
+{
+ return fabs(d)
+ <= (static_cast< double >(static_cast< unsigned long >(0x80000000))
+ * static_cast< double >(static_cast< unsigned long >(0x80000000))
+ * 2);
+}
+
+/** Safe sin(), returns NAN if not valid.
+ */
+inline double sin(double d)
+{
+ if ( isValidArcArg( d ) )
+ return ::sin( d );
+ setNan( &d );
+ return d;
+}
+
+/** Safe cos(), returns NAN if not valid.
+ */
+inline double cos(double d)
+{
+ if ( isValidArcArg( d ) )
+ return ::cos( d );
+ setNan( &d );
+ return d;
+}
+
+/** Safe tan(), returns NAN if not valid.
+ */
+inline double tan(double d)
+{
+ if ( isValidArcArg( d ) )
+ return ::tan( d );
+ setNan( &d );
+ return d;
+}
+
+}
+
+}
+
+#endif // INCLUDED_RTL_MATH_HXX
diff --git a/sal/inc/rtl/memory.h b/sal/inc/rtl/memory.h
new file mode 100644
index 000000000000..11e50e9dc963
--- /dev/null
+++ b/sal/inc/rtl/memory.h
@@ -0,0 +1,51 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _RTL_MEMORY_H_
+#define _RTL_MEMORY_H_
+
+# include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void SAL_CALL rtl_zeroMemory(void *Ptr, sal_Size Bytes);
+void SAL_CALL rtl_fillMemory(void *Ptr, sal_Size Bytes, sal_uInt8 Fill);
+void SAL_CALL rtl_copyMemory(void *Dst, const void *Src, sal_Size Bytes);
+void SAL_CALL rtl_moveMemory(void *Dst, const void *Src, sal_Size Bytes);
+sal_Int32 SAL_CALL rtl_compareMemory(const void *MemA, const void *MemB, sal_Size Bytes);
+void* SAL_CALL rtl_findInMemory(const void *MemA, sal_uInt8 ch, sal_Size Bytes);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /*_RTL_MEMORY_H_ */
+
diff --git a/sal/inc/rtl/process.h b/sal/inc/rtl/process.h
new file mode 100644
index 000000000000..b2e471f2def6
--- /dev/null
+++ b/sal/inc/rtl/process.h
@@ -0,0 +1,82 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_PROCESS_H_
+#define _RTL_PROCESS_H_
+
+#include <sal/types.h>
+#include <osl/process.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ gets a 16-byte fixed size identifier which is guaranteed not to change
+ during the current process.
+
+ The current implementation creates a 16-byte uuid without using
+ the ethernet address of system. Thus the
+ identifier is different from identifiers created
+ in other processes with a very probability.
+
+ @param pTargetUUID 16 byte of memory
+ @see rtl_createUiid()
+ */
+void SAL_CALL rtl_getGlobalProcessId( sal_uInt8 *pTargetUUID );
+
+/** Get the nArg-th command-line argument passed to the main-function of this process.
+
+ This functions differs from osl_getCommandArg() in filtering any bootstrap values
+ given by command args, that means that all arguments starting with "-env:" will be
+ ignored by this function.
+
+ @param nArg [in] The number of the argument to return.
+ @param strCommandArg [out] The string receives the nArg-th command-line argument.
+ @return osl_Process_E_None or does not return.
+ @see osl_getCommandArg()
+ @see rtl_getCommandArgCount()
+*/
+oslProcessError SAL_CALL rtl_getAppCommandArg(sal_uInt32 nArg, rtl_uString **strCommandArg);
+
+/** Returns the number of command line arguments at process start.
+
+ This functions differs from osl_getCommandArg() in filtering any bootstrap values
+ given by command args, that means that all arguments starting with "-env:" will be
+ ignored by this function.
+
+ @return the number of commandline arguments passed to the main-function of this process.
+ @see osl_getCommandArgCount()
+ @see rtl_getCommandArg()
+*/
+sal_uInt32 SAL_CALL rtl_getAppCommandArgCount();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/inc/rtl/random.h b/sal/inc/rtl/random.h
new file mode 100644
index 000000000000..52e2d56968b9
--- /dev/null
+++ b/sal/inc/rtl/random.h
@@ -0,0 +1,114 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_RANDOM_H_
+#define _RTL_RANDOM_H_ "$Revision: 1.7 $"
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*========================================================================
+ *
+ * rtlRandom interface.
+ *
+ *======================================================================*/
+/** Random Pool opaque type.
+ */
+typedef void* rtlRandomPool;
+
+
+/** Error Code enumeration.
+ */
+enum __rtl_RandomError
+{
+ rtl_Random_E_None,
+ rtl_Random_E_Argument,
+ rtl_Random_E_Memory,
+ rtl_Random_E_Unknown,
+ rtl_Random_E_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+};
+
+/** Error Code type.
+ */
+typedef enum __rtl_RandomError rtlRandomError;
+
+
+/** Create a Random Pool.
+ @return initialized Random Pool, or NULL upon failure.
+ */
+rtlRandomPool SAL_CALL rtl_random_createPool (void) SAL_THROW_EXTERN_C();
+
+
+/** Destroy a Random Pool.
+ @param Pool [in] a Random Pool.
+ @return none. Pool is invalid.
+ */
+void SAL_CALL rtl_random_destroyPool (
+ rtlRandomPool Pool
+) SAL_THROW_EXTERN_C();
+
+
+/** Add bytes to a Random Pool.
+ @param Pool [in] a Random Pool.
+ @param pBuffer [in] a buffer containing the bytes to add.
+ @param nBufLen [in] the number of bytes to read from the buffer.
+ @return rtl_Random_E_None upon success.
+ */
+rtlRandomError SAL_CALL rtl_random_addBytes (
+ rtlRandomPool Pool,
+ const void *Buffer,
+ sal_Size Bytes
+) SAL_THROW_EXTERN_C();
+
+
+/** Retrieve bytes from a Random Pool.
+ @param Pool [in] a Random Pool.
+ @param pBuffer [inout] a buffer to receive the random bytes.
+ @param nBufLen [in] the number of bytes to write to the buffer.
+ @return rtl_Random_E_None upon success.
+ */
+rtlRandomError SAL_CALL rtl_random_getBytes (
+ rtlRandomPool Pool,
+ void *Buffer,
+ sal_Size Bytes
+) SAL_THROW_EXTERN_C();
+
+/*========================================================================
+ *
+ * The End.
+ *
+ *======================================================================*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_RANDOM_H_ */
+
diff --git a/sal/inc/rtl/ref.hxx b/sal/inc/rtl/ref.hxx
new file mode 100644
index 000000000000..66e621cc29a5
--- /dev/null
+++ b/sal/inc/rtl/ref.hxx
@@ -0,0 +1,242 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_REF_HXX_
+#define _RTL_REF_HXX_
+
+#include <sal/types.h>
+#include <osl/diagnose.h>
+#include <osl/interlck.h>
+
+namespace rtl
+{
+
+/** Interface for a reference type.
+*/
+class IReference
+{
+public:
+ /** @see osl_incrementInterlockedCount.
+ */
+ virtual oslInterlockedCount SAL_CALL acquire() = 0;
+
+ /** @see osl_decrementInterlockedCount.
+ */
+ virtual oslInterlockedCount SAL_CALL release() = 0;
+};
+
+
+/** Template reference class for reference type derived from IReference.
+*/
+template <class reference_type>
+class Reference
+{
+ /** The <b>reference_type</b> body pointer.
+ */
+ reference_type * m_pBody;
+
+
+public:
+ /** Constructor...
+ */
+ inline Reference()
+ : m_pBody (0)
+ {}
+
+
+ /** Constructor...
+ */
+ inline Reference (reference_type * pBody)
+ : m_pBody (pBody)
+ {
+ if (m_pBody)
+ m_pBody->acquire();
+ }
+
+
+ /** Copy constructor...
+ */
+ inline Reference (const Reference<reference_type> & handle)
+ : m_pBody (handle.m_pBody)
+ {
+ if (m_pBody)
+ m_pBody->acquire();
+ }
+
+
+ /** Destructor...
+ */
+ inline ~Reference()
+ {
+ if (m_pBody)
+ m_pBody->release();
+ }
+
+ /** Set...
+ Similar to assignment.
+ */
+ inline Reference<reference_type> &
+ SAL_CALL set (reference_type * pBody)
+ {
+ if (pBody)
+ pBody->acquire();
+ reference_type * const pOld = m_pBody;
+ m_pBody = pBody;
+ if (pOld)
+ pOld->release();
+ return *this;
+ }
+
+ /** Assignment.
+ Unbinds this instance from its body (if bound) and
+ bind it to the body represented by the handle.
+ */
+ inline Reference<reference_type> &
+ SAL_CALL operator= (const Reference<reference_type> & handle)
+ {
+ return set( handle.m_pBody );
+ }
+
+ /** Assignment...
+ */
+ inline Reference<reference_type> &
+ SAL_CALL operator= (reference_type * pBody)
+ {
+ return set( pBody );
+ }
+
+ /** Unbind the body from this handle.
+ Note that for a handle representing a large body,
+ "handle.clear().set(new body());" _might_
+ perform a little bit better than "handle.set(new body());",
+ since in the second case two large objects exist in memory
+ (the old body and the new body).
+ */
+ inline Reference<reference_type> & SAL_CALL clear()
+ {
+ if (m_pBody)
+ {
+ reference_type * const pOld = m_pBody;
+ m_pBody = 0;
+ pOld->release();
+ }
+ return *this;
+ }
+
+
+ /** Get the body. Can be used instead of operator->().
+ I.e. handle->someBodyOp() and handle.get()->someBodyOp()
+ are the same.
+ */
+ inline reference_type * SAL_CALL get() const
+ {
+ return m_pBody;
+ }
+
+
+ /** Probably most common used: handle->someBodyOp().
+ */
+ inline reference_type * SAL_CALL operator->() const
+ {
+ OSL_PRECOND(m_pBody, "Reference::operator->() : null body");
+ return m_pBody;
+ }
+
+
+ /** Allows (*handle).someBodyOp().
+ */
+ inline reference_type & SAL_CALL operator*() const
+ {
+ OSL_PRECOND(m_pBody, "Reference::operator*() : null body");
+ return *m_pBody;
+ }
+
+
+ /** Returns True if the handle does point to a valid body.
+ */
+ inline sal_Bool SAL_CALL is() const
+ {
+ return (m_pBody != 0);
+ }
+
+
+ /** Returns True if this points to pBody.
+ */
+ inline sal_Bool SAL_CALL operator== (const reference_type * pBody) const
+ {
+ return (m_pBody == pBody);
+ }
+
+
+ /** Returns True if handle points to the same body.
+ */
+ inline sal_Bool
+ SAL_CALL operator== (const Reference<reference_type> & handle) const
+ {
+ return (m_pBody == handle.m_pBody);
+ }
+
+
+ /** Needed to place References into STL collection.
+ */
+ inline sal_Bool
+ SAL_CALL operator!= (const Reference<reference_type> & handle) const
+ {
+ return (m_pBody != handle.m_pBody);
+ }
+
+
+ /** Needed to place References into STL collection.
+ */
+ inline sal_Bool
+ SAL_CALL operator< (const Reference<reference_type> & handle) const
+ {
+ return (m_pBody < handle.m_pBody);
+ }
+
+
+ /** Needed to place References into STL collection.
+ */
+ inline sal_Bool
+ SAL_CALL operator> (const Reference<reference_type> & handle) const
+ {
+ return (m_pBody > handle.m_pBody);
+ }
+};
+
+/** @internal
+ Enables boost::mem_fn and boost::bind to recognize Reference.
+*/
+template <typename T>
+inline T * get_pointer( Reference<T> const& r )
+{
+ return r.get();
+}
+
+} // namespace rtl
+
+#endif /* !_RTL_REF_HXX_ */
diff --git a/sal/inc/rtl/strbuf.h b/sal/inc/rtl/strbuf.h
new file mode 100644
index 000000000000..b471cf8f5f83
--- /dev/null
+++ b/sal/inc/rtl/strbuf.h
@@ -0,0 +1,119 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_STRBUF_H_
+#define _RTL_STRBUF_H_
+
+#include <rtl/string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @HTML
+ Allocates a new <code>String</code> that contains characters from
+ the character array argument.
+
+ The <code>count</code> argument specifies
+ the length of the array. The initial capacity of the string buffer is
+ <code>16</code> plus the length of the string argument.
+
+ @param newStr out parameter, contains the new string. The reference count is 1.
+ @param value the initial value of the string.
+ @param count the length of value.
+ */
+void SAL_CALL rtl_stringbuffer_newFromStr_WithLength( rtl_String ** newStr,
+ const sal_Char * value,
+ sal_Int32 count);
+
+/**
+ Allocates a new <code>String</code> that contains the same sequence of
+ characters as the string argument.
+
+ The initial capacity is the larger of:
+ <ul>
+ <li> The <code>bufferLen</code> argument.
+ <li> The <code>length</code> of the string argument.
+ </ul>
+
+ @param newStr out parameter, contains the new string. The reference count is 1.
+ @param capacity the initial len of the string buffer.
+ @param oldStr the initial value of the string.
+ @return the new capacity of the string buffer
+ */
+sal_Int32 SAL_CALL rtl_stringbuffer_newFromStringBuffer( rtl_String ** newStr,
+ sal_Int32 capacity,
+ rtl_String * olsStr );
+
+/**
+ Ensures that the capacity of the buffer is at least equal to the
+ specified minimum.
+
+ If the current capacity of this string buffer is less than the
+ argument, then a new internal buffer is allocated with greater
+ capacity. The new capacity is the larger of:
+ <ul>
+ <li>The <code>minimumCapacity</code> argument.
+ <li>Twice the old capacity, plus <code>2</code>.
+ </ul>
+ If the <code>minimumCapacity</code> argument is nonpositive, this
+ method takes no action and simply returns.
+
+ @param capacity in: old capicity, out: new capacity.
+ @param minimumCapacity the minimum desired capacity.
+ */
+void SAL_CALL rtl_stringbuffer_ensureCapacity( /*inout*/rtl_String ** This,
+ /*inout*/sal_Int32* capacity,
+ sal_Int32 minimumCapacity);
+
+
+/**
+ Inserts the string representation of the <code>char</code> array
+ argument into this string buffer.
+
+ The characters of the array argument are inserted into the
+ contents of this string buffer at the position indicated by
+ <code>offset</code>. The length of this string buffer increases by
+ the length of the argument.
+
+ @param capacity the capacity of the string buffer
+ @param offset the offset.
+ @param ch a character array.
+ @param len the number of characters to append.
+ @return this string buffer.
+ */
+void SAL_CALL rtl_stringbuffer_insert( /*inout*/rtl_String ** This,
+ /*inout*/sal_Int32 * capacity,
+ sal_Int32 offset,
+ const sal_Char * str,
+ sal_Int32 len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_STRBUF_H_ */
diff --git a/sal/inc/rtl/strbuf.hxx b/sal/inc/rtl/strbuf.hxx
new file mode 100644
index 000000000000..b6920049f2fb
--- /dev/null
+++ b/sal/inc/rtl/strbuf.hxx
@@ -0,0 +1,665 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_STRBUF_HXX_
+#define _RTL_STRBUF_HXX_
+
+#include "osl/diagnose.h"
+#include <rtl/strbuf.h>
+#include <rtl/string.hxx>
+
+#ifdef __cplusplus
+
+namespace rtl
+{
+
+/** @HTML
+
+ A string buffer implements a mutable sequence of characters.
+ <p>
+ String buffers are safe for use by multiple threads. The methods
+ are synchronized where necessary so that all the operations on any
+ particular instance behave as if they occur in some serial order.
+ <p>
+ String buffers are used by the compiler to implement the binary
+ string concatenation operator <code>+</code>. For example, the code:
+ <p><blockquote><pre>
+ x = "a" + 4 + "c"
+ </pre></blockquote><p>
+ is compiled to the equivalent of:
+ <p><blockquote><pre>
+ x = new OStringBuffer().append("a").append(4).append("c")
+ .toString()
+ </pre></blockquote><p>
+ The principal operations on a <code>OStringBuffer</code> are the
+ <code>append</code> and <code>insert</code> methods, which are
+ overloaded so as to accept data of any type. Each effectively
+ converts a given datum to a string and then appends or inserts the
+ characters of that string to the string buffer. The
+ <code>append</code> method always adds these characters at the end
+ of the buffer; the <code>insert</code> method adds the characters at
+ a specified point.
+ <p>
+ For example, if <code>z</code> refers to a string buffer object
+ whose current contents are "<code>start</code>", then
+ the method call <code>z.append("le")</code> would cause the string
+ buffer to contain "<code>startle</code>", whereas
+ <code>z.insert(4, "le")</code> would alter the string buffer to
+ contain "<code>starlet</code>".
+ <p>
+ Every string buffer has a capacity. As long as the length of the
+ character sequence contained in the string buffer does not exceed
+ the capacity, it is not necessary to allocate a new internal
+ buffer array. If the internal buffer overflows, it is
+ automatically made larger.
+ */
+class OStringBuffer
+{
+public:
+ /**
+ Constructs a string buffer with no characters in it and an
+ initial capacity of 16 characters.
+ */
+ OStringBuffer()
+ : pData(NULL)
+ , nCapacity( 16 )
+ {
+ rtl_string_new_WithLength( &pData, nCapacity );
+ }
+
+ /**
+ Allocates a new string buffer that contains the same sequence of
+ characters as the string buffer argument.
+
+ @param value a <code>OStringBuffer</code>.
+ */
+ OStringBuffer( const OStringBuffer & value )
+ : pData(NULL)
+ , nCapacity( value.nCapacity )
+ {
+ rtl_stringbuffer_newFromStringBuffer( &pData, value.nCapacity, value.pData );
+ }
+
+ /**
+ Constructs a string buffer with no characters in it and an
+ initial capacity specified by the <code>length</code> argument.
+
+ @param length the initial capacity.
+ */
+ OStringBuffer(sal_Int32 length)
+ : pData(NULL)
+ , nCapacity( length )
+ {
+ rtl_string_new_WithLength( &pData, length );
+ }
+
+ /**
+ Constructs a string buffer so that it represents the same
+ sequence of characters as the string argument.
+
+ The initial
+ capacity of the string buffer is <code>16</code> plus the length
+ of the string argument.
+
+ @param value the initial string value.
+ */
+ OStringBuffer(OString value)
+ : pData(NULL)
+ , nCapacity( value.getLength() + 16 )
+ {
+ rtl_stringbuffer_newFromStr_WithLength( &pData, value.getStr(), value.getLength() );
+ }
+
+ /** Assign to this a copy of value.
+ */
+ OStringBuffer& operator = ( const OStringBuffer& value )
+ {
+ if (this != &value)
+ {
+ rtl_stringbuffer_newFromStringBuffer(&pData,
+ value.nCapacity,
+ value.pData);
+ nCapacity = value.nCapacity;
+ }
+ return *this;
+ }
+
+ /**
+ Release the string data.
+ */
+ ~OStringBuffer()
+ {
+ rtl_string_release( pData );
+ }
+
+ /**
+ Fill the string data in the new string and clear the buffer.
+
+ This method is more efficient than the contructor of the string. It does
+ not copy the buffer.
+
+ @return the string previously contained in the buffer.
+ */
+ OString makeStringAndClear()
+ {
+ OString aRet( pData );
+ rtl_string_new(&pData);
+ nCapacity = 0;
+ return aRet;
+ }
+
+ /**
+ Returns the length (character count) of this string buffer.
+
+ @return the number of characters in this string buffer.
+ */
+ sal_Int32 getLength() const
+ {
+ return pData->length;
+ }
+
+ /**
+ Returns the current capacity of the String buffer.
+
+ The capacity
+ is the amount of storage available for newly inserted
+ characters. The real buffer size is 2 bytes longer, because
+ all strings are 0 terminated.
+
+ @return the current capacity of this string buffer.
+ */
+ sal_Int32 getCapacity() const
+ {
+ return nCapacity;
+ }
+
+ /**
+ Ensures that the capacity of the buffer is at least equal to the
+ specified minimum.
+
+ The new capacity will be at least as large as the maximum of the current
+ length (so that no contents of the buffer is destroyed) and the given
+ minimumCapacity. If the given minimumCapacity is negative, nothing is
+ changed.
+
+ @param minimumCapacity the minimum desired capacity.
+ */
+ void ensureCapacity(sal_Int32 minimumCapacity)
+ {
+ rtl_stringbuffer_ensureCapacity( &pData, &nCapacity, minimumCapacity );
+ }
+
+ /**
+ Sets the length of this String buffer.
+
+ If the <code>newLength</code> argument is less than the current
+ length of the string buffer, the string buffer is truncated to
+ contain exactly the number of characters given by the
+ <code>newLength</code> argument.
+ <p>
+ If the <code>newLength</code> argument is greater than or equal
+ to the current length, sufficient null characters
+ (<code>'&#92;u0000'</code>) are appended to the string buffer so that
+ length becomes the <code>newLength</code> argument.
+ <p>
+ The <code>newLength</code> argument must be greater than or equal
+ to <code>0</code>.
+
+ @param newLength the new length of the buffer.
+ */
+ void setLength(sal_Int32 newLength)
+ {
+ OSL_ASSERT(newLength >= 0);
+ // Avoid modifications if pData points to const empty string:
+ if( newLength != pData->length )
+ {
+ if( newLength > nCapacity )
+ rtl_stringbuffer_ensureCapacity(&pData, &nCapacity, newLength);
+ else
+ pData->buffer[newLength] = '\0';
+ pData->length = newLength;
+ }
+ }
+
+ /**
+ Returns the character at a specific index in this string buffer.
+
+ The first character of a string buffer is at index
+ <code>0</code>, the next at index <code>1</code>, and so on, for
+ array indexing.
+ <p>
+ The index argument must be greater than or equal to
+ <code>0</code>, and less than the length of this string buffer.
+
+ @param index the index of the desired character.
+ @return the character at the specified index of this string buffer.
+ */
+ sal_Char charAt( sal_Int32 index )
+ {
+ OSL_ASSERT(index >= 0 && index < pData->length);
+ return pData->buffer[ index ];
+ }
+
+ /**
+ Return a null terminated character array.
+ */
+ operator const sal_Char *() const { return pData->buffer; }
+
+ /**
+ Return a null terminated character array.
+ */
+ const sal_Char* getStr() const { return pData->buffer; }
+
+
+ /**
+ The character at the specified index of this string buffer is set
+ to <code>ch</code>.
+
+ The index argument must be greater than or equal to
+ <code>0</code>, and less than the length of this string buffer.
+
+ @param index the index of the character to modify.
+ @param ch the new character.
+ */
+ OStringBuffer & setCharAt(sal_Int32 index, sal_Char ch)
+ {
+ OSL_ASSERT(index >= 0 && index < pData->length);
+ pData->buffer[ index ] = ch;
+ return *this;
+ }
+
+ /**
+ Appends the string to this string buffer.
+
+ The characters of the <code>String</code> argument are appended, in
+ order, to the contents of this string buffer, increasing the
+ length of this string buffer by the length of the argument.
+
+ @param str a string.
+ @return this string buffer.
+ */
+ OStringBuffer & append(const OString &str)
+ {
+ return append( str.getStr(), str.getLength() );
+ }
+
+ /**
+ Appends the string representation of the <code>char</code> array
+ argument to this string buffer.
+
+ The characters of the array argument are appended, in order, to
+ the contents of this string buffer. The length of this string
+ buffer increases by the length of the argument.
+
+ @param str the characters to be appended.
+ @return this string buffer.
+ */
+ OStringBuffer & append( const sal_Char * str )
+ {
+ return append( str, rtl_str_getLength( str ) );
+ }
+
+ /**
+ Appends the string representation of the <code>char</code> array
+ argument to this string buffer.
+
+ Characters of the character array <code>str</code> are appended,
+ in order, to the contents of this string buffer. The length of this
+ string buffer increases by the value of <code>len</code>.
+
+ @param str the characters to be appended; must be non-null, and must
+ point to at least len characters
+ @param len the number of characters to append; must be non-negative
+ @return this string buffer.
+ */
+ OStringBuffer & append( const sal_Char * str, sal_Int32 len)
+ {
+ // insert behind the last character
+ rtl_stringbuffer_insert( &pData, &nCapacity, getLength(), str, len );
+ return *this;
+ }
+
+ /**
+ Appends the string representation of the <code>sal_Bool</code>
+ argument to the string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param b a <code>sal_Bool</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & append(sal_Bool b)
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFBOOLEAN];
+ return append( sz, rtl_str_valueOfBoolean( sz, b ) );
+ }
+
+ /**
+ Appends the string representation of the <code>char</code>
+ argument to this string buffer.
+
+ The argument is appended to the contents of this string buffer.
+ The length of this string buffer increases by <code>1</code>.
+
+ @param ch a <code>char</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & append(sal_Char c)
+ {
+ return append( &c, 1 );
+ }
+
+ /**
+ Appends the string representation of the <code>sal_Int32</code>
+ argument to this string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param i an <code>sal_Int32</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & append(sal_Int32 i, sal_Int16 radix = 10 )
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFINT32];
+ return append( sz, rtl_str_valueOfInt32( sz, i, radix ) );
+ }
+
+ /**
+ Appends the string representation of the <code>long</code>
+ argument to this string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param l a <code>long</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & append(sal_Int64 l, sal_Int16 radix = 10 )
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFINT64];
+ return append( sz, rtl_str_valueOfInt64( sz, l, radix ) );
+ }
+
+ /**
+ Appends the string representation of the <code>float</code>
+ argument to this string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param f a <code>float</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & append(float f)
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFFLOAT];
+ return append( sz, rtl_str_valueOfFloat( sz, f ) );
+ }
+
+ /**
+ Appends the string representation of the <code>double</code>
+ argument to this string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param d a <code>double</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & append(double d)
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFDOUBLE];
+ return append( sz, rtl_str_valueOfDouble( sz, d ) );
+ }
+
+ /**
+ Inserts the string into this string buffer.
+
+ The characters of the <code>String</code> argument are inserted, in
+ order, into this string buffer at the indicated offset. The length
+ of this string buffer is increased by the length of the argument.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param str a string.
+ @return this string buffer.
+ */
+ OStringBuffer & insert(sal_Int32 offset, const OString & str)
+ {
+ return insert( offset, str.getStr(), str.getLength() );
+ }
+
+ /**
+ Inserts the string representation of the <code>char</code> array
+ argument into this string buffer.
+
+ The characters of the array argument are inserted into the
+ contents of this string buffer at the position indicated by
+ <code>offset</code>. The length of this string buffer increases by
+ the length of the argument.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param ch a character array.
+ @return this string buffer.
+ */
+ OStringBuffer & insert( sal_Int32 offset, const sal_Char * str )
+ {
+ return insert( offset, str, rtl_str_getLength( str ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>char</code> array
+ argument into this string buffer.
+
+ The characters of the array argument are inserted into the
+ contents of this string buffer at the position indicated by
+ <code>offset</code>. The length of this string buffer increases by
+ the length of the argument.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param ch a character array.
+ @param len the number of characters to append.
+ @return this string buffer.
+ */
+ OStringBuffer & insert( sal_Int32 offset, const sal_Char * str, sal_Int32 len)
+ {
+ // insert behind the last character
+ rtl_stringbuffer_insert( &pData, &nCapacity, offset, str, len );
+ return *this;
+ }
+
+ /**
+ Inserts the string representation of the <code>sal_Bool</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b a <code>sal_Bool</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & insert(sal_Int32 offset, sal_Bool b)
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFBOOLEAN];
+ return insert( offset, sz, rtl_str_valueOfBoolean( sz, b ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>char</code>
+ argument into this string buffer.
+
+ The second argument is inserted into the contents of this string
+ buffer at the position indicated by <code>offset</code>. The length
+ of this string buffer increases by one.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param ch a <code>char</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & insert(sal_Int32 offset, sal_Char c)
+ {
+ return insert( offset, &c, 1 );
+ }
+
+ /**
+ Inserts the string representation of the second <code>sal_Int32</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b an <code>sal_Int32</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & insert(sal_Int32 offset, sal_Int32 i, sal_Int16 radix = 10 )
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFINT32];
+ return insert( offset, sz, rtl_str_valueOfInt32( sz, i, radix ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>long</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b a <code>long</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & insert(sal_Int32 offset, sal_Int64 l, sal_Int16 radix = 10 )
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFINT64];
+ return insert( offset, sz, rtl_str_valueOfInt64( sz, l, radix ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>float</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b a <code>float</code>.
+ @return this string buffer.
+ */
+ OStringBuffer insert(sal_Int32 offset, float f)
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFFLOAT];
+ return insert( offset, sz, rtl_str_valueOfFloat( sz, f ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>double</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b a <code>double</code>.
+ @return this string buffer.
+ */
+ OStringBuffer & insert(sal_Int32 offset, double d)
+ {
+ sal_Char sz[RTL_STR_MAX_VALUEOFDOUBLE];
+ return insert( offset, sz, rtl_str_valueOfDouble( sz, d ) );
+ }
+private:
+ /**
+ A pointer to the data structur which contains the data.
+ */
+ rtl_String * pData;
+
+ /**
+ The len of the pData->buffer.
+ */
+ sal_Int32 nCapacity;
+};
+
+}
+
+#endif /* __cplusplus */
+#endif /* _RTL_STRBUF_HXX_ */
+
+
diff --git a/sal/inc/rtl/string.h b/sal/inc/rtl/string.h
new file mode 100644
index 000000000000..fe8548078227
--- /dev/null
+++ b/sal/inc/rtl/string.h
@@ -0,0 +1,1193 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_STRING_H_
+#define _RTL_STRING_H_
+
+#include <sal/types.h>
+#include <osl/interlck.h>
+#include <rtl/textcvt.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ======================================================================= */
+
+/** Return the length of a string.
+
+ The length is equal to the number of 8-bit characters in the string,
+ without the terminating NUL character.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ the length of the sequence of characters represented by this string,
+ excluding the terminating NUL character.
+ */
+sal_Int32 SAL_CALL rtl_str_getLength( const sal_Char * str ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting. Both strings must be
+ null-terminated.
+
+ @param first
+ the first null-terminated string to be compared.
+
+ @param second
+ the second null-terminated string which is compared with the first one.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_str_compare( const sal_Char * first, const sal_Char * second ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_str_compare_WithLength( const sal_Char * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 secondLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings with a maximum count of characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @param shortenedLen
+ the maximum number of characters to compare. This length can be greater
+ or smaller than the lengths of the two strings.
+
+ @return
+ 0 if both substrings are equal, a value less than 0 if the first substring
+ is less than the second substring, and a value greater than 0 if the first
+ substring is greater than the second substring.
+ */
+sal_Int32 SAL_CALL rtl_str_shortenedCompare_WithLength( const sal_Char * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 secondLen, sal_Int32 shortenedLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings from back to front.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string
+ compares less than the second string, and a value greater than 0 if the
+ first string compares greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_str_reverseCompare_WithLength( const sal_Char * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 secondLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings, ignoring the case of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting. Both strings must be null-terminated.
+
+ @param first
+ the first null-terminated string to be compared.
+
+ @param second
+ the second null-terminated string which is compared with the first one.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_str_compareIgnoreAsciiCase( const sal_Char * first, const sal_Char * second ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings, ignoring the case of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_str_compareIgnoreAsciiCase_WithLength( const sal_Char * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 secondLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings with a maximum count of characters, ignoring the case
+ of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @param shortenedLen
+ the maximum number of characters to compare. This length can be greater
+ or smaller than the lengths of the two strings.
+
+ @return
+ 0 if both substrings are equal, a value less than 0 if the first substring
+ is less than the second substring, and a value greater than 0 if the first
+ substring is greater than the second substring.
+ */
+sal_Int32 SAL_CALL rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( const sal_Char * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 secondLen, sal_Int32 shortenedLen ) SAL_THROW_EXTERN_C();
+
+/** Return a hash code for a string.
+
+ It is not allowed to store the hash code persistently, because later
+ versions could return other hash codes. The string must be
+ null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ a hash code for the given string.
+ */
+sal_Int32 SAL_CALL rtl_str_hashCode( const sal_Char * str ) SAL_THROW_EXTERN_C();
+
+/** Return a hash code for a string.
+
+ It is not allowed to store the hash code persistently, because later
+ versions could return other hash codes.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @return
+ a hash code for the given string.
+ */
+sal_Int32 SAL_CALL rtl_str_hashCode_WithLength( const sal_Char * str, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of a character within a string.
+
+ The string must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param ch
+ the character to be searched for.
+
+ @return
+ the index (starting at 0) of the first occurrence of the character in the
+ string, or -1 if the character does not occur.
+ */
+sal_Int32 SAL_CALL rtl_str_indexOfChar( const sal_Char * str, sal_Char ch ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of a character within a string.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param ch
+ the character to be searched for.
+
+ @return
+ the index (starting at 0) of the first occurrence of the character in the
+ string, or -1 if the character does not occur.
+ */
+sal_Int32 SAL_CALL rtl_str_indexOfChar_WithLength( const sal_Char * str, sal_Int32 len, sal_Char ch ) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of a character within a string.
+
+ The string must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param ch
+ the character to be searched for.
+
+ @return
+ the index (starting at 0) of the last occurrence of the character in the
+ string, or -1 if the character does not occur. The returned value is
+ always smaller than the string length.
+ */
+sal_Int32 SAL_CALL rtl_str_lastIndexOfChar( const sal_Char * str, sal_Char ch ) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of a character within a string.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param ch
+ the character to be searched for.
+
+ @return
+ the index (starting at 0) of the last occurrence of the character in the
+ string, or -1 if the character does not occur. The returned value is
+ always smaller than the string length.
+ */
+sal_Int32 SAL_CALL rtl_str_lastIndexOfChar_WithLength( const sal_Char * str, sal_Int32 len, sal_Char ch ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of a substring within a string.
+
+ If subStr is empty, or both str and subStr are empty, -1 is returned.
+ Both strings must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param subStr
+ the null-terminated substring to be searched for.
+
+ @return
+ the index (starting at 0) of the first character of the first occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ */
+sal_Int32 SAL_CALL rtl_str_indexOfStr( const sal_Char * str, const sal_Char * subStr ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of a substring within a string.
+
+ If subStr is empty, or both str and subStr are empty, -1 is returned.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param subStr
+ the substring to be searched for. Need not be null-terminated, but must
+ be at least as long as the specified subLen.
+
+ @param subLen
+ the length of the substring.
+
+ @return
+ the index (starting at 0) of the first character of the first occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ */
+sal_Int32 SAL_CALL rtl_str_indexOfStr_WithLength( const sal_Char * str, sal_Int32 len, const sal_Char * subStr, sal_Int32 subLen ) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of a substring within a string.
+
+ If subStr is empty, or both str and subStr are empty, -1 is returned.
+ Both strings must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param subStr
+ the null-terminated substring to be searched for.
+
+ @return
+ the index (starting at 0) of the first character of the last occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ */
+sal_Int32 SAL_CALL rtl_str_lastIndexOfStr( const sal_Char * str, const sal_Char * subStr ) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of a substring within a string.
+
+ If subStr is empty, or both str and subStr are empty, -1 is returned.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param subStr
+ the substring to be searched for. Need not be null-terminated, but must
+ be at least as long as the specified subLen.
+
+ @param subLen
+ the length of the substring.
+
+ @return
+ the index (starting at 0) of the first character of the first occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ */
+sal_Int32 SAL_CALL rtl_str_lastIndexOfStr_WithLength( const sal_Char * str, sal_Int32 len, const sal_Char * subStr, sal_Int32 subLen ) SAL_THROW_EXTERN_C();
+
+/** Replace all occurrences of a single character within a string.
+
+ If oldChar does not occur within str, then the string is not modified.
+ The string must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param oldChar
+ the old character.
+
+ @param newChar
+ the new character.
+ */
+void SAL_CALL rtl_str_replaceChar( sal_Char * str, sal_Char oldChar, sal_Char newChar ) SAL_THROW_EXTERN_C();
+
+/** Replace all occurrences of a single character within a string.
+
+ If oldChar does not occur within str, then the string is not modified.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param oldChar
+ the old character.
+
+ @param newChar
+ the new character.
+ */
+void SAL_CALL rtl_str_replaceChar_WithLength( sal_Char * str, sal_Int32 len, sal_Char oldChar, sal_Char newChar ) SAL_THROW_EXTERN_C();
+
+/** Convert all ASCII uppercase letters to lowercase within a string.
+
+ The characters with values between 65 and 90 (ASCII A--Z) are replaced
+ with values between 97 and 122 (ASCII a--z). The string must be
+ null-terminated.
+
+ @param str
+ a null-terminated string.
+ */
+void SAL_CALL rtl_str_toAsciiLowerCase( sal_Char * str ) SAL_THROW_EXTERN_C();
+
+/** Convert all ASCII uppercase letters to lowercase within a string.
+
+ The characters with values between 65 and 90 (ASCII A--Z) are replaced
+ with values between 97 and 122 (ASCII a--z).
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+ */
+void SAL_CALL rtl_str_toAsciiLowerCase_WithLength( sal_Char * str, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Convert all ASCII lowercase letters to uppercase within a string.
+
+ The characters with values between 97 and 122 (ASCII a--z) are replaced
+ with values between 65 and 90 (ASCII A--Z). The string must be
+ null-terminated.
+
+ @param str
+ a null-terminated string.
+ */
+void SAL_CALL rtl_str_toAsciiUpperCase( sal_Char * str ) SAL_THROW_EXTERN_C();
+
+/** Convert all ASCII lowercase letters to uppercase within a string.
+
+ The characters with values between 97 and 122 (ASCII a--z) are replaced
+ with values between 65 and 90 (ASCII A--Z).
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+ */
+void SAL_CALL rtl_str_toAsciiUpperCase_WithLength( sal_Char * str, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Remove white space from both ends of a string.
+
+ All characters with values less than or equal to 32 (the space character)
+ are considered to be white space. This function cannot be used for
+ language-specific operations. The string must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ the new length of the string.
+ */
+sal_Int32 SAL_CALL rtl_str_trim( sal_Char * str ) SAL_THROW_EXTERN_C();
+
+/** Remove white space from both ends of the string.
+
+ All characters with values less than or equal to 32 (the space character)
+ are considered to be white space. This function cannot be used for
+ language-specific operations. The string must be null-terminated.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the original length of the string.
+
+ @return
+ the new length of the string.
+ */
+sal_Int32 SAL_CALL rtl_str_trim_WithLength( sal_Char * str, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Create the string representation of a boolean.
+
+ If b is true, the buffer is filled with the string "true" and 5 is
+ returned. If b is false, the buffer is filled with the string "false" and
+ 6 is returned. This function cannot be used for language-specific
+ operations.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_STR_MAX_VALUEOFBOOLEAN define to create
+ a buffer that is big enough.
+
+ @param b
+ a boolean value.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_str_valueOfBoolean( sal_Char * str, sal_Bool b ) SAL_THROW_EXTERN_C();
+#define RTL_STR_MAX_VALUEOFBOOLEAN 6
+
+/** Create the string representation of a character.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_STR_MAX_VALUEOFCHAR define to create a
+ buffer that is big enough.
+
+ @param ch
+ a character value.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_str_valueOfChar( sal_Char * str, sal_Char ch ) SAL_THROW_EXTERN_C();
+#define RTL_STR_MAX_VALUEOFCHAR 2
+
+/** Create the string representation of an integer.
+
+ This function cannot be used for language-specific operations.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_STR_MAX_VALUEOFINT32 define to create a
+ buffer that is big enough.
+
+ @param i
+ an integer value.
+
+ @param radix
+ the radix. Must be between RTL_STR_MIN_RADIX (2) and RTL_STR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_str_valueOfInt32( sal_Char * str, sal_Int32 i, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+#define RTL_STR_MIN_RADIX 2
+#define RTL_STR_MAX_RADIX 36
+#define RTL_STR_MAX_VALUEOFINT32 33
+
+/** Create the string representation of a long integer.
+
+ This function cannot be used for language-specific operations.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_STR_MAX_VALUEOFINT64 define to create a
+ buffer that is big enough.
+
+ @param l
+ a long integer value.
+
+ @param radix
+ the radix. Must be between RTL_STR_MIN_RADIX (2) and RTL_STR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_str_valueOfInt64( sal_Char * str, sal_Int64 l, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+#define RTL_STR_MAX_VALUEOFINT64 65
+
+/** Create the string representation of a float.
+
+ This function cannot be used for language-specific conversion.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_STR_MAX_VALUEOFFLOAT define to create a
+ buffer that is big enough.
+
+ @param f
+ a float value.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_str_valueOfFloat( sal_Char * str, float f ) SAL_THROW_EXTERN_C();
+#define RTL_STR_MAX_VALUEOFFLOAT 15
+
+/** Create the string representation of a double.
+
+ This function cannot be used for language-specific conversion.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_STR_MAX_VALUEOFDOUBLE define to create
+ a buffer that is big enough.
+
+ @param d
+ a double value.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_str_valueOfDouble( sal_Char * str, double d ) SAL_THROW_EXTERN_C();
+#define RTL_STR_MAX_VALUEOFDOUBLE 25
+
+/** Interpret a string as a boolean.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ true if the string is "1" or "true" in any ASCII case, false otherwise.
+ */
+sal_Bool SAL_CALL rtl_str_toBoolean( const sal_Char * str ) SAL_THROW_EXTERN_C();
+
+/** Interpret a string as an integer.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param radix
+ the radix. Must be between RTL_STR_MIN_RADIX (2) and RTL_STR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the integer value represented by the string, or 0 if the string does not
+ represent an integer.
+ */
+sal_Int32 SAL_CALL rtl_str_toInt32( const sal_Char * str, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+
+/** Interpret a string as a long integer.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param radix
+ the radix. Must be between RTL_STR_MIN_RADIX (2) and RTL_STR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the long integer value represented by the string, or 0 if the string does
+ not represent a long integer.
+ */
+sal_Int64 SAL_CALL rtl_str_toInt64( const sal_Char * str, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+
+/** Interpret a string as a float.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ the float value represented by the string, or 0.0 if the string does not
+ represent a float.
+ */
+float SAL_CALL rtl_str_toFloat( const sal_Char * str ) SAL_THROW_EXTERN_C();
+
+/** Interpret a string as a double.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ the float value represented by the string, or 0.0 if the string does not
+ represent a double.
+ */
+double SAL_CALL rtl_str_toDouble( const sal_Char * str ) SAL_THROW_EXTERN_C();
+
+/* ======================================================================= */
+
+#ifdef SAL_W32
+# pragma pack(push, 8)
+#elif defined(SAL_OS2)
+# pragma pack(push, 4)
+#endif
+
+/** The implementation of a byte string.
+
+ @internal
+ */
+typedef struct _rtl_String
+{
+ oslInterlockedCount refCount; /* opaque */
+ sal_Int32 length;
+ sal_Char buffer[1];
+} rtl_String;
+
+#if defined( SAL_W32) || defined(SAL_OS2)
+#pragma pack(pop)
+#endif
+
+/* ----------------------------------------------------------------------- */
+
+/** Increment the reference count of a string.
+
+ @param str
+ a string.
+ */
+void SAL_CALL rtl_string_acquire( rtl_String * str ) SAL_THROW_EXTERN_C();
+
+/** Decrement the reference count of a string.
+
+ If the count goes to zero than the string data is deleted.
+
+ @param str
+ a string.
+ */
+void SAL_CALL rtl_string_release( rtl_String * str ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string containing no characters.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+ */
+void SAL_CALL rtl_string_new( rtl_String ** newStr ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string containing space for a given number of characters.
+
+ If len is greater than zero, the reference count of the new string will be
+ 1. The values of all characters are set to 0 and the length of the string
+ is 0. This function does not handle out-of-memory conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param len
+ the number of characters.
+ */
+void SAL_CALL rtl_string_new_WithLength( rtl_String ** newStr, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string that contains a copy of another string.
+
+ If the length of value is greater than zero, the reference count of the
+ new string will be 1. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param value
+ a valid string.
+ */
+void SAL_CALL rtl_string_newFromString( rtl_String ** newStr, const rtl_String * value ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string that contains a copy of a character array.
+
+ If the length of value is greater than zero, the reference count of the
+ new string will be 1. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param value
+ a null-terminated character array.
+ */
+void SAL_CALL rtl_string_newFromStr( rtl_String ** newStr, const sal_Char * value ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string that contains a copy of a character array.
+
+ If the length of value is greater than zero, the reference count of the
+ new string will be 1. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param value
+ a character array. Need not be null-terminated, but must be at least as
+ long as the specified len.
+
+ @param len
+ the length of the character array.
+ */
+void SAL_CALL rtl_string_newFromStr_WithLength( rtl_String ** newStr, const sal_Char * value, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Assign a new value to a string.
+
+ First releases any value str might currently hold, then acquires
+ rightValue.
+
+ @param str
+ pointer to the string. The pointed-to data must be null or a valid
+ string.
+
+ @param rightValue
+ a valid string.
+ */
+void SAL_CALL rtl_string_assign( rtl_String ** str, rtl_String * rightValue ) SAL_THROW_EXTERN_C();
+
+/** Return the length of a string.
+
+ The length is equal to the number of characters in the string.
+
+ @param str
+ a valid string.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_string_getLength( const rtl_String * str ) SAL_THROW_EXTERN_C();
+
+/** Return a pointer to the underlying character array of a string.
+
+ @param str
+ a valid string.
+
+ @return
+ a pointer to the null-terminated character array.
+ */
+sal_Char * SAL_CALL rtl_string_getStr( rtl_String * str ) SAL_THROW_EXTERN_C();
+
+/** Create a new string that is the concatenation of two other strings.
+
+ The new string does not necessarily have a reference count of 1 (in cases
+ where one of the two other strings is empty), so it must not be modified
+ without checking the reference count. This function does not handle
+ out-of-memory conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param left
+ a valid string.
+
+ @param right
+ a valid string.
+ */
+void SAL_CALL rtl_string_newConcat( rtl_String ** newStr, rtl_String * left, rtl_String * right ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by replacing a substring of another string.
+
+ The new string results from replacing a number of characters (count),
+ starting at the specified position (index) in the original string (str),
+ with some new substring (subStr). If subStr is null, than only a number
+ of characters is deleted.
+
+ The new string does not necessarily have a reference count of 1, so it
+ must not be modified without checking the reference count. This function
+ does not handle out-of-memory conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+
+ @param index
+ the index into str at which to start replacement. Must be between 0 and
+ the length of str, inclusive.
+
+ @param count
+ the number of charcters to remove. Must not be negative, and the sum of
+ index and count must not exceed the length of str.
+
+ @param subStr
+ either null or a valid string to be inserted.
+ */
+void SAL_CALL rtl_string_newReplaceStrAt( rtl_String ** newStr, rtl_String * str, sal_Int32 idx, sal_Int32 count, rtl_String * subStr ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by replacing all occurrences of a single character
+ within another string.
+
+ The new string results from replacing all occurrences of oldChar in str
+ with newChar.
+
+ The new string does not necessarily have a reference count of 1 (in cases
+ where oldChar does not occur in str), so it must not be modified without
+ checking the reference count. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+
+ @param oldChar
+ the old character.
+
+ @param newChar
+ the new character.
+ */
+void SAL_CALL rtl_string_newReplace( rtl_String ** newStr, rtl_String * str, sal_Char oldChar, sal_Char newChar ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by converting all ASCII uppercase letters to lowercase
+ within another string.
+
+ The new string results from replacing all characters with values between
+ 65 and 90 (ASCII A--Z) by values between 97 and 122 (ASCII a--z).
+
+ This function cannot be used for language-specific conversion. The new
+ string does not necessarily have a reference count of 1 (in cases where
+ no characters need to be converted), so it must not be modified without
+ checking the reference count. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+ */
+void SAL_CALL rtl_string_newToAsciiLowerCase( rtl_String ** newStr, rtl_String * str ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by converting all ASCII lowercase letters to uppercase
+ within another string.
+
+ The new string results from replacing all characters with values between
+ 97 and 122 (ASCII a--z) by values between 65 and 90 (ASCII A--Z).
+
+ This function cannot be used for language-specific conversion. The new
+ string does not necessarily have a reference count of 1 (in cases where
+ no characters need to be converted), so it must not be modified without
+ checking the reference count. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+ */
+void SAL_CALL rtl_string_newToAsciiUpperCase( rtl_String ** newStr, rtl_String * str ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by removing white space from both ends of another
+ string.
+
+ The new string results from removing all characters with values less than
+ or equal to 32 (the space character) form both ends of str.
+
+ This function cannot be used for language-specific conversion. The new
+ string does not necessarily have a reference count of 1 (in cases where
+ no characters need to be removed), so it must not be modified without
+ checking the reference count. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+ */
+void SAL_CALL rtl_string_newTrim( rtl_String ** newStr, rtl_String * str ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by extracting a single token from another string.
+
+ Starting at index, the token's next token is searched for. If there is no
+ such token, the result is an empty string. Otherwise, all characters from
+ the start of that token and up to, but not including the next occurrence
+ of cTok make up the resulting token. The return value is the position of
+ the next token, or -1 if no more tokens follow.
+
+ Example code could look like
+ rtl_String * pToken = NULL;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ ...
+ nIndex = rtl_string_getToken(&pToken, pStr, 0, ';', nIndex);
+ ...
+ }
+ while (nIndex >= 0);
+
+ The new string does not necessarily have a reference count of 1, so it
+ must not be modified without checking the reference count. This function
+ does not handle out-of-memory conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string. If either token or index is negative, an empty token is stored in
+ newStr (and -1 is returned).
+
+ @param str
+ a valid string.
+
+ @param token
+ the number of the token to return, starting at index.
+
+ @param cTok
+ the character that seperates the tokens.
+
+ @param index
+ the position at which searching for the token starts. Must not be greater
+ than the length of str.
+
+ @return
+ the index of the next token, or -1 if no more tokens follow.
+ */
+sal_Int32 SAL_CALL rtl_string_getToken( rtl_String ** newStr , rtl_String * str, sal_Int32 token, sal_Char cTok, sal_Int32 idx ) SAL_THROW_EXTERN_C();
+
+/* ======================================================================= */
+
+/** Supply an ASCII string literal together with its length.
+
+ This macro can be used to compute (some of) the arguments in function calls
+ like rtl::OString(RTL_CONSTASCII_STRINGPARAM("foo")) or
+ rtl::OUString::equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("foo")).
+
+ @param constAsciiStr
+ must be an expression of type "(possibly cv-qualified reference to) array of
+ (possibly cv-qualified) char." Each element of the referenced array must
+ represent an ASCII value in the range 0x00--0x7F. The last element of the
+ referenced array is not considered part of the represented ASCII string, and
+ its value should be 0x00. Depending on where this macro is used, the nature
+ of the supplied expression might be further restricted.
+*/
+#define RTL_CONSTASCII_STRINGPARAM( constAsciiStr ) constAsciiStr, ((sal_Int32)sizeof(constAsciiStr)-1)
+
+/** Supply the length of an ASCII string literal.
+
+ This macro can be used to compute arguments in function calls like
+ rtl::OUString::match(other, RTL_CONSTASCII_LENGTH("prefix")).
+
+ @param constAsciiStr
+ must be an expression of type "(possibly cv-qualified reference to) array of
+ (possibly cv-qualified) char." Each element of the referenced array must
+ represent an ASCII value in the range 0x00--0x7F. The last element of the
+ referenced array is not considered part of the represented ASCII string, and
+ its value should be 0x00. Depending on where this macro is used, the nature
+ of the supplied expression might be further restricted.
+*/
+#define RTL_CONSTASCII_LENGTH( constAsciiStr ) ((sal_Int32)(sizeof(constAsciiStr)-1))
+
+/* ======================================================================= */
+
+/* predefined constants for String-Conversion */
+#define OUSTRING_TO_OSTRING_CVTFLAGS (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT |\
+ RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT |\
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE |\
+ RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 |\
+ RTL_UNICODETOTEXT_FLAGS_NOCOMPOSITE)
+
+/* ----------------------------------------------------------------------- */
+
+/** Create a new byte string by converting a Unicode string, using a specific
+ text encoding.
+
+ The lengths of the byte string and the Unicode string may differ (e.g.,
+ for double-byte encodings, UTF-7, UTF-8).
+
+ If the length of the Unicode string is greater than zero, the reference
+ count of the new string will be 1.
+
+ If an out-of-memory condition occurs, newStr will point to a null pointer
+ upon return.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a Unicode character array. Need not be null-terminated, but must be at
+ least as long as the specified len.
+
+ @param len
+ the length of the Unicode character array.
+
+ @param encoding
+ the text encoding to use for conversion.
+
+ @param convertFlags
+ flags which control the conversion. Either use
+ OUSTRING_TO_OSTRING_CVTFLAGS, or see
+ <http://udk.openoffice.org/cpp/man/spec/textconversion.html> for more
+ details.
+ */
+void SAL_CALL rtl_uString2String( rtl_String ** newStr, const sal_Unicode * str, sal_Int32 len, rtl_TextEncoding encoding, sal_uInt32 convertFlags ) SAL_THROW_EXTERN_C();
+
+/**
+ Converts a Unicode string to a byte string, signalling failure.
+
+ @param pTarget
+ An out parameter receiving the converted string. Must not be null itself, and
+ must contain either null or a pointer to a valid rtl_String; the contents are
+ not modified if conversion fails (rtl_convertUStringToString returns false).
+
+ @param pSource
+ The Unicode string. May only be null if nLength is zero.
+
+ @param nLength
+ The length of the Unicode string. Must be non-negative.
+
+ @param nEncoding
+ The text encoding to convert into. Must be an octet encoding (i.e.,
+ rtl_isOctetTextEncoding(nEncoding) must return true).
+
+ @param nFlags
+ A combination of RTL_UNICODETOTEXT_FLAGS that detail how to do the conversion
+ (see rtl_convertUnicodeToText). RTL_UNICODETOTEXT_FLAGS_FLUSH need not be
+ included, it is implicitly assumed. Typical uses are either
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
+ RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR (fail if a Unicode character cannot be
+ converted to the target nEncoding) or OUSTRING_TO_OSTRING_CVTFLAGS (make a
+ best efforts conversion).
+
+ @return
+ True if the conversion succeeded, false otherwise.
+ */
+sal_Bool SAL_CALL rtl_convertUStringToString(rtl_String ** pTarget,
+ sal_Unicode const * pSource,
+ sal_Int32 nLength,
+ rtl_TextEncoding nEncoding,
+ sal_uInt32 nFlags)
+ SAL_THROW_EXTERN_C();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_STRING_H_ */
diff --git a/sal/inc/rtl/string.hxx b/sal/inc/rtl/string.hxx
new file mode 100644
index 000000000000..c85da92c177b
--- /dev/null
+++ b/sal/inc/rtl/string.hxx
@@ -0,0 +1,941 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_STRING_HXX_
+#define _RTL_STRING_HXX_
+
+#ifdef __cplusplus
+
+#ifndef _RTL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+#include <rtl/memory.h>
+#include <rtl/textenc.h>
+#include <rtl/string.h>
+
+#if !defined EXCEPTIONS_OFF
+#include <new>
+#endif
+
+namespace rtl
+{
+
+/* ======================================================================= */
+
+/**
+ This String class provide base functionality for C++ like 8-Bit
+ character array handling. The advantage of this class is, that it
+ handle all the memory managament for you - and it do it
+ more efficient. If you assign a string to another string, the
+ data of both strings are shared (without any copy operation or
+ memory allocation) as long as you do not change the string. This class
+ stores also the length of the string, so that many operations are
+ faster as the C-str-functions.
+
+ This class provide only readonly string handling. So you could create
+ a string and you could only query the content from this string.
+ It provide also functionality to change the string, but this results
+ in every case in a new string instance (in the most cases with an
+ memory allocation). You don't have functionality to change the
+ content of the string. If you want change the string content, than
+ you should us the OStringBuffer class, which provide these
+ functionality and avoid to much memory allocation.
+
+ The design of this class is similar to the string classes in Java
+ and so more people should have fewer understanding problems when they
+ use this class.
+*/
+
+class OString
+{
+public:
+ /** @internal */
+ rtl_String * pData;
+
+private:
+ /** @internal */
+ class DO_NOT_ACQUIRE;
+
+ /** @internal */
+ OString( rtl_String * value, DO_NOT_ACQUIRE * )
+ {
+ pData = value;
+ }
+
+public:
+ /**
+ New string containing no characters.
+ */
+ OString() SAL_THROW(())
+ {
+ pData = 0;
+ rtl_string_new( &pData );
+ }
+
+ /**
+ New string from OString.
+
+ @param str a OString.
+ */
+ OString( const OString & str ) SAL_THROW(())
+ {
+ pData = str.pData;
+ rtl_string_acquire( pData );
+ }
+
+ /**
+ New string from OString data.
+
+ @param str a OString data.
+ */
+ OString( rtl_String * str ) SAL_THROW(())
+ {
+ pData = str;
+ rtl_string_acquire( pData );
+ }
+
+ /**
+ New string from a single character.
+
+ @param value a character.
+ */
+ explicit OString( sal_Char value ) SAL_THROW(())
+ : pData (0)
+ {
+ rtl_string_newFromStr_WithLength( &pData, &value, 1 );
+ }
+
+ /**
+ New string from a character buffer array.
+
+ @param value a NULL-terminated character array.
+ */
+ OString( const sal_Char * value ) SAL_THROW(())
+ {
+ pData = 0;
+ rtl_string_newFromStr( &pData, value );
+ }
+
+ /**
+ New string from a character buffer array.
+
+ @param value a character array.
+ @param length the number of character which should be copied.
+ The character array length must be greater or
+ equal than this value.
+ */
+ OString( const sal_Char * value, sal_Int32 length ) SAL_THROW(())
+ {
+ pData = 0;
+ rtl_string_newFromStr_WithLength( &pData, value, length );
+ }
+
+ /**
+ New string from a Unicode character buffer array.
+
+ @param value a Unicode character array.
+ @param length the number of character which should be converted.
+ The Unicode character array length must be
+ greater or equal than this value.
+ @param encoding the text encoding in which the Unicode character
+ sequence should be converted.
+ @param convertFlags flags which controls the conversion.
+ see RTL_UNICODETOTEXT_FLAGS_...
+
+ @exception std::bad_alloc is thrown if an out-of-memory condition occurs
+ */
+ OString( const sal_Unicode * value, sal_Int32 length,
+ rtl_TextEncoding encoding,
+ sal_uInt32 convertFlags = OUSTRING_TO_OSTRING_CVTFLAGS )
+ {
+ pData = 0;
+ rtl_uString2String( &pData, value, length, encoding, convertFlags );
+#if defined EXCEPTIONS_OFF
+ OSL_ASSERT(pData != NULL);
+#else
+ if (pData == 0) {
+ throw std::bad_alloc();
+ }
+#endif
+ }
+
+ /**
+ Release the string data.
+ */
+ ~OString() SAL_THROW(())
+ {
+ rtl_string_release( pData );
+ }
+
+ /**
+ Assign a new string.
+
+ @param str a OString.
+ */
+ OString & operator=( const OString & str ) SAL_THROW(())
+ {
+ rtl_string_assign( &pData, str.pData );
+ return *this;
+ }
+
+ /**
+ Append a string to this string.
+
+ @param str a OString.
+ */
+ OString & operator+=( const OString & str ) SAL_THROW(())
+ {
+ rtl_string_newConcat( &pData, pData, str.pData );
+ return *this;
+ }
+
+ /**
+ Returns the length of this string.
+
+ The length is equal to the number of characters in this string.
+
+ @return the length of the sequence of characters represented by this
+ object.
+ */
+ sal_Int32 getLength() const SAL_THROW(()) { return pData->length; }
+
+ /**
+ Returns a pointer to the characters of this string.
+
+ <p>The returned pointer is not guaranteed to point to a null-terminated
+ byte string. Note that this string object may contain embedded null
+ characters, which will thus also be embedded in the returned byte
+ string.</p>
+
+ @return a pointer to a (not necessarily null-terminated) byte string
+ representing the characters of this string object.
+ */
+ operator const sal_Char *() const SAL_THROW(()) { return pData->buffer; }
+
+ /**
+ Returns a pointer to the characters of this string.
+
+ <p>The returned pointer is guaranteed to point to a null-terminated byte
+ string. But note that this string object may contain embedded null
+ characters, which will thus also be embedded in the returned
+ null-terminated byte string.</p>
+
+ @return a pointer to a null-terminated byte string representing the
+ characters of this string object.
+ */
+ const sal_Char * getStr() const SAL_THROW(()) { return pData->buffer; }
+
+ /**
+ Compares two strings.
+
+ The comparison is based on the numeric value of each character in
+ the strings and return a value indicating their relationship.
+ This function can't be used for language specific sorting.
+
+ @param str the object to be compared.
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 compareTo( const OString & str ) const SAL_THROW(())
+ {
+ return rtl_str_compare_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length );
+ }
+
+ /**
+ Compares two strings with an maximum count of characters.
+
+ The comparison is based on the numeric value of each character in
+ the strings and return a value indicating their relationship.
+ This function can't be used for language specific sorting.
+
+ @param str the object to be compared.
+ @param maxLength the maximum count of characters to be compared.
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 compareTo( const OString & rObj, sal_Int32 maxLength ) const SAL_THROW(())
+ {
+ return rtl_str_shortenedCompare_WithLength( pData->buffer, pData->length,
+ rObj.pData->buffer, rObj.pData->length, maxLength );
+ }
+
+ /**
+ Compares two strings in reverse order.
+
+ The comparison is based on the numeric value of each character in
+ the strings and return a value indicating their relationship.
+ This function can't be used for language specific sorting.
+
+ @param str the object to be compared.
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 reverseCompareTo( const OString & str ) const SAL_THROW(())
+ {
+ return rtl_str_reverseCompare_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length );
+ }
+
+ /**
+ Perform a comparison of two strings.
+
+ The result is true if and only if second string
+ represents the same sequence of characters as the first string.
+ This function can't be used for language specific comparison.
+
+ @param str the object to be compared.
+ @return sal_True if the strings are equal;
+ sal_False, otherwise.
+ */
+ sal_Bool equals( const OString & str ) const SAL_THROW(())
+ {
+ if ( pData->length != str.pData->length )
+ return sal_False;
+ if ( pData == str.pData )
+ return sal_True;
+ return rtl_str_reverseCompare_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length ) == 0;
+ }
+
+ /**
+ Perform a ASCII lowercase comparison of two strings.
+
+ The result is true if and only if second string
+ represents the same sequence of characters as the first string,
+ ignoring the case.
+ Character values between 65 and 90 (ASCII A-Z) are interpreted as
+ values between 97 and 122 (ASCII a-z).
+ This function can't be used for language specific comparison.
+
+ @param str the object to be compared.
+ @return sal_True if the strings are equal;
+ sal_False, otherwise.
+ */
+ sal_Bool equalsIgnoreAsciiCase( const OString & str ) const SAL_THROW(())
+ {
+ if ( pData->length != str.pData->length )
+ return sal_False;
+ if ( pData == str.pData )
+ return sal_True;
+ return rtl_str_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length ) == 0;
+ }
+
+ /**
+ Match against a substring appearing in this string.
+
+ The result is true if and only if the second string appears as a substring
+ of this string, at the given position.
+ This function can't be used for language specific comparison.
+
+ @param str the object (substring) to be compared.
+ @param fromIndex the index to start the comparion from.
+ The index must be greater or equal than 0
+ and less or equal as the string length.
+ @return sal_True if str match with the characters in the string
+ at the given position;
+ sal_False, otherwise.
+ */
+ sal_Bool match( const OString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ return rtl_str_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
+ str.pData->buffer, str.pData->length, str.pData->length ) == 0;
+ }
+
+ /**
+ Match against a substring appearing in this string, ignoring the case of
+ ASCII letters.
+
+ The result is true if and only if the second string appears as a substring
+ of this string, at the given position.
+ Character values between 65 and 90 (ASCII A-Z) are interpreted as
+ values between 97 and 122 (ASCII a-z).
+ This function can't be used for language specific comparison.
+
+ @param str the object (substring) to be compared.
+ @param fromIndex the index to start the comparion from.
+ The index must be greater or equal than 0
+ and less or equal as the string length.
+ @return sal_True if str match with the characters in the string
+ at the given position;
+ sal_False, otherwise.
+ */
+ sal_Bool matchIgnoreAsciiCase( const OString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ return rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
+ str.pData->buffer, str.pData->length,
+ str.pData->length ) == 0;
+ }
+
+ friend sal_Bool operator == ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(())
+ { return rStr1.getLength() == rStr2.getLength() && rStr1.compareTo( rStr2 ) == 0; }
+ friend sal_Bool operator == ( const OString& rStr1, const sal_Char * pStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( pStr2 ) == 0; }
+ friend sal_Bool operator == ( const sal_Char * pStr1, const OString& rStr2 ) SAL_THROW(())
+ { return OString( pStr1 ).compareTo( rStr2 ) == 0; }
+
+ friend sal_Bool operator != ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(())
+ { return !(operator == ( rStr1, rStr2 )); }
+ friend sal_Bool operator != ( const OString& rStr1, const sal_Char * pStr2 ) SAL_THROW(())
+ { return !(operator == ( rStr1, pStr2 )); }
+ friend sal_Bool operator != ( const sal_Char * pStr1, const OString& rStr2 ) SAL_THROW(())
+ { return !(operator == ( pStr1, rStr2 )); }
+
+ friend sal_Bool operator < ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( rStr2 ) < 0; }
+ friend sal_Bool operator > ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( rStr2 ) > 0; }
+ friend sal_Bool operator <= ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( rStr2 ) <= 0; }
+ friend sal_Bool operator >= ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( rStr2 ) >= 0; }
+
+ /**
+ Returns a hashcode for this string.
+
+ @return a hash code value for this object.
+
+ @see rtl::OStringHash for convenient use of STLPort's hash_map
+ */
+ sal_Int32 hashCode() const SAL_THROW(())
+ {
+ return rtl_str_hashCode_WithLength( pData->buffer, pData->length );
+ }
+
+ /**
+ Returns the index within this string of the first occurrence of the
+ specified character, starting the search at the specified index.
+
+ @param ch character to be located.
+ @param fromIndex the index to start the search from.
+ The index must be greater or equal than 0
+ and less or equal as the string length.
+ @return the index of the first occurrence of the character in the
+ character sequence represented by this string that is
+ greater than or equal to fromIndex, or
+ -1 if the character does not occur.
+ */
+ sal_Int32 indexOf( sal_Char ch, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ sal_Int32 ret = rtl_str_indexOfChar_WithLength( pData->buffer+fromIndex, pData->length-fromIndex, ch );
+ return (ret < 0 ? ret : ret+fromIndex);
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of the
+ specified character, searching backward starting at the end.
+
+ @param ch character to be located.
+ @return the index of the last occurrence of the character in the
+ character sequence represented by this string, or
+ -1 if the character does not occur.
+ */
+ sal_Int32 lastIndexOf( sal_Char ch ) const SAL_THROW(())
+ {
+ return rtl_str_lastIndexOfChar_WithLength( pData->buffer, pData->length, ch );
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of the
+ specified character, searching backward starting before the specified
+ index.
+
+ @param ch character to be located.
+ @param fromIndex the index before which to start the search.
+ @return the index of the last occurrence of the character in the
+ character sequence represented by this string that
+ is less than fromIndex, or -1
+ if the character does not occur before that point.
+ */
+ sal_Int32 lastIndexOf( sal_Char ch, sal_Int32 fromIndex ) const SAL_THROW(())
+ {
+ return rtl_str_lastIndexOfChar_WithLength( pData->buffer, fromIndex, ch );
+ }
+
+ /**
+ Returns the index within this string of the first occurrence of the
+ specified substring, starting at the specified index.
+
+ If str doesn't include any character, always -1 is
+ returned. This is also the case, if both strings are empty.
+
+ @param str the substring to search for.
+ @param fromIndex the index to start the search from.
+ @return If the string argument occurs one or more times as a substring
+ within this string at the starting index, then the index
+ of the first character of the first such substring is
+ returned. If it does not occur as a substring starting
+ at fromIndex or beyond, -1 is returned.
+ */
+ sal_Int32 indexOf( const OString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ sal_Int32 ret = rtl_str_indexOfStr_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
+ str.pData->buffer, str.pData->length );
+ return (ret < 0 ? ret : ret+fromIndex);
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of
+ the specified substring, searching backward starting at the end.
+
+ The returned index indicates the starting index of the substring
+ in this string.
+ If str doesn't include any character, always -1 is
+ returned. This is also the case, if both strings are empty.
+
+ @param str the substring to search for.
+ @return If the string argument occurs one or more times as a substring
+ within this string, then the index of the first character of
+ the last such substring is returned. If it does not occur as
+ a substring, -1 is returned.
+ */
+ sal_Int32 lastIndexOf( const OString & str ) const SAL_THROW(())
+ {
+ return rtl_str_lastIndexOfStr_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length );
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of
+ the specified substring, searching backward starting before the specified
+ index.
+
+ The returned index indicates the starting index of the substring
+ in this string.
+ If str doesn't include any character, always -1 is
+ returned. This is also the case, if both strings are empty.
+
+ @param str the substring to search for.
+ @param fromIndex the index before which to start the search.
+ @return If the string argument occurs one or more times as a substring
+ within this string before the starting index, then the index
+ of the first character of the last such substring is
+ returned. Otherwise, -1 is returned.
+ */
+ sal_Int32 lastIndexOf( const OString & str, sal_Int32 fromIndex ) const SAL_THROW(())
+ {
+ return rtl_str_lastIndexOfStr_WithLength( pData->buffer, fromIndex,
+ str.pData->buffer, str.pData->length );
+ }
+
+ /**
+ Returns a new string that is a substring of this string.
+
+ The substring begins at the specified beginIndex. It is an error for
+ beginIndex to be negative or to be greater than the length of this string.
+
+ @param beginIndex the beginning index, inclusive.
+ @return the specified substring.
+ */
+ OString copy( sal_Int32 beginIndex ) const SAL_THROW(())
+ {
+ OSL_ASSERT(beginIndex >= 0 && beginIndex <= getLength());
+ if ( beginIndex == 0 )
+ return *this;
+ else
+ {
+ rtl_String* pNew = 0;
+ rtl_string_newFromStr_WithLength( &pNew, pData->buffer+beginIndex, getLength()-beginIndex );
+ return OString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+ }
+
+ /**
+ Returns a new string that is a substring of this string.
+
+ The substring begins at the specified beginIndex and contains count
+ characters. It is an error for either beginIndex or count to be negative,
+ or for beginIndex + count to be greater than the length of this string.
+
+ @param beginIndex the beginning index, inclusive.
+ @param count the number of characters.
+ @return the specified substring.
+ */
+ OString copy( sal_Int32 beginIndex, sal_Int32 count ) const SAL_THROW(())
+ {
+ OSL_ASSERT(beginIndex >= 0 && beginIndex <= getLength()
+ && count >= 0 && count <= getLength() - beginIndex);
+ if ( (beginIndex == 0) && (count == getLength()) )
+ return *this;
+ else
+ {
+ rtl_String* pNew = 0;
+ rtl_string_newFromStr_WithLength( &pNew, pData->buffer+beginIndex, count );
+ return OString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+ }
+
+ /**
+ Concatenates the specified string to the end of this string.
+
+ @param str the string that is concatenated to the end
+ of this string.
+ @return a string that represents the concatenation of this string
+ followed by the string argument.
+ */
+ OString concat( const OString & str ) const SAL_THROW(())
+ {
+ rtl_String* pNew = 0;
+ rtl_string_newConcat( &pNew, pData, str.pData );
+ return OString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ friend OString operator+( const OString & str1, const OString & str2 ) SAL_THROW(())
+ {
+ return str1.concat( str2 );
+ }
+
+ /**
+ Returns a new string resulting from replacing n = count characters
+ from position index in this string with newStr.
+
+ @param index the replacing index in str.
+ The index must be greater or equal as 0 and
+ less or equal as the length of the string.
+ @param count the count of charcters that will replaced
+ The count must be greater or equal as 0 and
+ less or equal as the length of the string minus index.
+ @param newStr the new substring.
+ @return the new string.
+ */
+ OString replaceAt( sal_Int32 index, sal_Int32 count, const OString& newStr ) const SAL_THROW(())
+ {
+ rtl_String* pNew = 0;
+ rtl_string_newReplaceStrAt( &pNew, pData, index, count, newStr.pData );
+ return OString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns a new string resulting from replacing all occurrences of
+ oldChar in this string with newChar.
+
+ If the character oldChar does not occur in the character sequence
+ represented by this object, then the string is assigned with
+ str.
+
+ @param oldChar the old character.
+ @param newChar the new character.
+ @return a string derived from this string by replacing every
+ occurrence of oldChar with newChar.
+ */
+ OString replace( sal_Char oldChar, sal_Char newChar ) const SAL_THROW(())
+ {
+ rtl_String* pNew = 0;
+ rtl_string_newReplace( &pNew, pData, oldChar, newChar );
+ return OString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Converts from this string all ASCII uppercase characters (65-90)
+ to ASCII lowercase characters (97-122).
+
+ This function can't be used for language specific conversion.
+ If the string doesn't contain characters which must be converted,
+ then the new string is assigned with str.
+
+ @return the string, converted to ASCII lowercase.
+ */
+ OString toAsciiLowerCase() const SAL_THROW(())
+ {
+ rtl_String* pNew = 0;
+ rtl_string_newToAsciiLowerCase( &pNew, pData );
+ return OString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Converts from this string all ASCII lowercase characters (97-122)
+ to ASCII uppercase characters (65-90).
+
+ This function can't be used for language specific conversion.
+ If the string doesn't contain characters which must be converted,
+ then the new string is assigned with str.
+
+ @return the string, converted to ASCII uppercase.
+ */
+ OString toAsciiUpperCase() const SAL_THROW(())
+ {
+ rtl_String* pNew = 0;
+ rtl_string_newToAsciiUpperCase( &pNew, pData );
+ return OString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns a new string resulting from removing white space from both ends
+ of the string.
+
+ All characters that have codes less than or equal to
+ 32 (the space character) are considered to be white space.
+ If the string doesn't contain white spaces at both ends,
+ then the new string is assigned with str.
+
+ @return the string, with white space removed from the front and end.
+ */
+ OString trim() const SAL_THROW(())
+ {
+ rtl_String* pNew = 0;
+ rtl_string_newTrim( &pNew, pData );
+ return OString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns a token in the string.
+
+ Example:
+ sal_Int32 nIndex = 0;
+ do
+ {
+ ...
+ OString aToken = aStr.getToken( 0, ';', nIndex );
+ ...
+ }
+ while ( nIndex >= 0 );
+
+ @param token the number of the token to return.
+ @param cTok the character which seperate the tokens.
+ @param index the position at which the token is searched in the
+ string.
+ The index must not be greater thanthe length of the
+ string.
+ This param is set to the position of the
+ next token or to -1, if it is the last token.
+ @return the token; if either token or index is negative, an empty token
+ is returned (and index is set to -1)
+ */
+ OString getToken( sal_Int32 token, sal_Char cTok, sal_Int32& index ) const SAL_THROW(())
+ {
+ rtl_String * pNew = 0;
+ index = rtl_string_getToken( &pNew, pData, token, cTok, index );
+ return OString( pNew, (DO_NOT_ACQUIRE *)0 );
+ }
+
+ /**
+ Returns the Boolean value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @return sal_True, if the string is 1 or "True" in any ASCII case.
+ sal_False in any other case.
+ */
+ sal_Bool toBoolean() const SAL_THROW(())
+ {
+ return rtl_str_toBoolean( pData->buffer );
+ }
+
+ /**
+ Returns the first character from this string.
+
+ @return the first character from this string or 0, if this string
+ is emptry.
+ */
+ sal_Char toChar() const SAL_THROW(())
+ {
+ return pData->buffer[0];
+ }
+
+ /**
+ Returns the int32 value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @param radix the radix (between 2 and 36)
+ @return the int32 represented from this string.
+ 0 if this string represents no number.
+ */
+ sal_Int32 toInt32( sal_Int16 radix = 10 ) const SAL_THROW(())
+ {
+ return rtl_str_toInt32( pData->buffer, radix );
+ }
+
+ /**
+ Returns the int64 value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @param radix the radix (between 2 and 36)
+ @return the int64 represented from this string.
+ 0 if this string represents no number.
+ */
+ sal_Int64 toInt64( sal_Int16 radix = 10 ) const SAL_THROW(())
+ {
+ return rtl_str_toInt64( pData->buffer, radix );
+ }
+
+ /**
+ Returns the float value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @return the float represented from this string.
+ 0.0 if this string represents no number.
+ */
+ float toFloat() const SAL_THROW(())
+ {
+ return rtl_str_toFloat( pData->buffer );
+ }
+
+ /**
+ Returns the double value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @return the double represented from this string.
+ 0.0 if this string represents no number.
+ */
+ double toDouble() const SAL_THROW(())
+ {
+ return rtl_str_toDouble( pData->buffer );
+ }
+
+ /**
+ Returns the string representation of the sal_Bool argument.
+
+ If the sal_Bool is true, the string "true" is returned.
+ If the sal_Bool is false, the string "false" is returned.
+ This function can't be used for language specific conversion.
+
+ @param b a sal_Bool.
+ @return a string with the string representation of the argument.
+ */
+ static OString valueOf( sal_Bool b ) SAL_THROW(())
+ {
+ sal_Char aBuf[RTL_STR_MAX_VALUEOFBOOLEAN];
+ rtl_String* pNewData = 0;
+ rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfBoolean( aBuf, b ) );
+ return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns the string representation of the char argument.
+
+ @param c a character.
+ @return a string with the string representation of the argument.
+ */
+ static OString valueOf( sal_Char c ) SAL_THROW(())
+ {
+ return OString( &c, 1 );
+ }
+
+ /**
+ Returns the string representation of the int argument.
+
+ This function can't be used for language specific conversion.
+
+ @param i a int32.
+ @param radix the radix (between 2 and 36)
+ @return a string with the string representation of the argument.
+ */
+ static OString valueOf( sal_Int32 i, sal_Int16 radix = 10 ) SAL_THROW(())
+ {
+ sal_Char aBuf[RTL_STR_MAX_VALUEOFINT32];
+ rtl_String* pNewData = 0;
+ rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfInt32( aBuf, i, radix ) );
+ return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns the string representation of the long argument.
+
+ This function can't be used for language specific conversion.
+
+ @param ll a int64.
+ @param radix the radix (between 2 and 36)
+ @return a string with the string representation of the argument.
+ */
+ static OString valueOf( sal_Int64 ll, sal_Int16 radix = 10 ) SAL_THROW(())
+ {
+ sal_Char aBuf[RTL_STR_MAX_VALUEOFINT64];
+ rtl_String* pNewData = 0;
+ rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfInt64( aBuf, ll, radix ) );
+ return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns the string representation of the float argument.
+
+ This function can't be used for language specific conversion.
+
+ @param f a float.
+ @return a string with the string representation of the argument.
+ */
+ static OString valueOf( float f ) SAL_THROW(())
+ {
+ sal_Char aBuf[RTL_STR_MAX_VALUEOFFLOAT];
+ rtl_String* pNewData = 0;
+ rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfFloat( aBuf, f ) );
+ return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns the string representation of the double argument.
+
+ This function can't be used for language specific conversion.
+
+ @param d a double.
+ @return a string with the string representation of the argument.
+ */
+ static OString valueOf( double d ) SAL_THROW(())
+ {
+ sal_Char aBuf[RTL_STR_MAX_VALUEOFDOUBLE];
+ rtl_String* pNewData = 0;
+ rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfDouble( aBuf, d ) );
+ return OString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+};
+
+/* ======================================================================= */
+
+/** A helper to use OStrings with hash maps.
+
+ Instances of this class are unary function objects that can be used as
+ hash function arguments to STLPort's hash_map and similar constructs.
+ */
+struct OStringHash
+{
+ /** Compute a hash code for a string.
+
+ @param rString
+ a string.
+
+ @return
+ a hash code for the string. This hash code should not be stored
+ persistently, as its computation may change in later revisions.
+ */
+ size_t operator()( const rtl::OString& rString ) const
+ { return (size_t)rString.hashCode(); }
+};
+
+/* ======================================================================= */
+
+} /* Namespace */
+
+#endif /* __cplusplus */
+
+#endif /* _RTL_STRING_HXX_ */
diff --git a/sal/inc/rtl/tencinfo.h b/sal/inc/rtl/tencinfo.h
new file mode 100644
index 000000000000..49c010ebd374
--- /dev/null
+++ b/sal/inc/rtl/tencinfo.h
@@ -0,0 +1,276 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_TENCINFO_H
+#define _RTL_TENCINFO_H
+
+#ifndef _SAL_TYPES_H
+#include <sal/types.h>
+#endif
+#include <rtl/textenc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// See rtl_TextEncodingInfo.Flags below for documentation on these values:
+#define RTL_TEXTENCODING_INFO_CONTEXT ((sal_uInt32)0x00000001)
+#define RTL_TEXTENCODING_INFO_ASCII ((sal_uInt32)0x00000002)
+#define RTL_TEXTENCODING_INFO_UNICODE ((sal_uInt32)0x00000004)
+#define RTL_TEXTENCODING_INFO_MULTIBYTE ((sal_uInt32)0x00000008)
+#define RTL_TEXTENCODING_INFO_R2L ((sal_uInt32)0x00000010)
+#define RTL_TEXTENCODING_INFO_7BIT ((sal_uInt32)0x00000020)
+#define RTL_TEXTENCODING_INFO_SYMBOL ((sal_uInt32)0x00000040)
+#define RTL_TEXTENCODING_INFO_MIME ((sal_uInt32)0x00000080)
+
+/** Information about a text encoding.
+ */
+typedef struct _rtl_TextEncodingInfo
+{
+ /** The size (in bytes) of this structure. Should be 12.
+ */
+ sal_uInt32 StructSize;
+
+ /** The minimum number of bytes needed to encode any character in the
+ given encoding.
+
+ Can be rather meaningless for encodings that encode global state along
+ with the characters (e.g., ISO-2022 encodings).
+ */
+ sal_uInt8 MinimumCharSize;
+
+ /** The maximum number of bytes needed to encode any character in the
+ given encoding.
+
+ Can be rather meaningless for encodings that encode global state along
+ with the characters (e.g., ISO-2022 encodings).
+ */
+ sal_uInt8 MaximumCharSize;
+
+ /** The average number of bytes needed to encode a character in the given
+ encoding.
+ */
+ sal_uInt8 AverageCharSize;
+
+ /** An unused byte, for padding.
+ */
+ sal_uInt8 Reserved;
+
+ /** Any combination of the RTL_TEXTENCODING_INFO flags.
+
+ RTL_TEXTENCODING_INFO_CONTEXT: The encoding uses some mechanism (like
+ state-changing byte sequences) to switch between different modes (e.g.,
+ to encode multiple character repertoires within the same byte ranges).
+
+ Even if an encoding does not have the CONTEXT property, interpretation
+ of certain byte values within that encoding can depend on context (e.g.,
+ a certain byte value could be either a single-byte character or a
+ subsequent byte of a multi-byte character). Likewise, the single shift
+ characters (SS2 and SS3) used by some of the EUC encodings (to denote
+ that the following bytes constitute a character from another character
+ repertoire) do not imply that encodings making use of these characters
+ have the CONTEXT property. Examples of encodings that do have the
+ CONTEXT property are the ISO-2022 encodings and UTF-7.
+
+ RTL_TEXTENCODING_INFO_ASCII: The encoding is a superset of ASCII. More
+ specifically, any appearance of a byte in the range 0x20--7F denotes the
+ corresponding ASCII character (from SPACE to DELETE); in particular,
+ such a byte cannot be part of a multi-byte character. Note that the
+ ASCII control codes 0x00--1F are not included here, as they are used for
+ special purposes in some encodings.
+
+ If an encoding has this property, it is easy to search for occurences of
+ ASCII characters within strings of this encoding---you do not need to
+ keep track whether a byte in the range 0x20--7F really represents an
+ ASCII character or rather is part of some multi-byte character.
+
+ The guarantees when mapping between Unicode and a given encoding with
+ the ASCII property are as follows: When mapping from Unicode to the
+ given encoding, U+0020--007F map to 0x20--7F (but there can also be
+ other Unicode characters mapping into the range 0x20--7F), and when
+ mapping from the given encoding to Unicode, 0x20--7F map to U+0020--007F
+ (again, there can also be other characters mapping into the range
+ U+0020--007F). In particular, this ensures round-trip conversion for
+ the ASCII range.
+
+ In principle, the ASCII property is orthogonal to the CONTEXT property.
+ In practice, however, an encoding that has the ASCII property will most
+ likely not also have the CONTEXT property.
+
+ RTL_TEXTENCODING_INFO_UNICODE: The encoding is based on the Unicode
+ character repertoire.
+
+ RTL_TEXTENCODING_INFO_MULTIBYTE: A multi-byte encoding.
+
+ RTL_TEXTENCODING_INFO_R2L: An encoding used mainly or exclusively for
+ languages written from right to left.
+
+ RTL_TEXTENCODING_INFO_7BIT: A 7-bit instead of an 8-bit encoding.
+
+ RTL_TEXTENCODING_INFO_SYMBOL: A (generic) encoding for symbol character
+ sets.
+
+ RTL_TEXTENCODING_INFO_MIME: The encoding is registered as a MIME
+ charset.
+ */
+ sal_uInt32 Flags;
+} rtl_TextEncodingInfo;
+
+/** Determine whether a text encoding uses single octets as basic units of
+ information (and can thus be used with the conversion routines in
+ rtl/textcvt.h).
+
+ @param nEncoding
+ Any rtl_TextEncoding value.
+
+ @return
+ True if the given encoding uses single octets as basic units of
+ information, false otherwise.
+ */
+sal_Bool SAL_CALL rtl_isOctetTextEncoding(rtl_TextEncoding nEncoding);
+
+/** Return information about a text encoding.
+
+ @param eTextEncoding
+ Any rtl_TextEncoding value.
+
+ @param pEncInfo
+ Returns information about the given encoding. Must not be null, and the
+ StructSize member must be set correctly.
+
+ @return
+ True if information about the given encoding is available, false
+ otherwise.
+ */
+sal_Bool SAL_CALL rtl_getTextEncodingInfo( rtl_TextEncoding eTextEncoding, rtl_TextEncodingInfo* pEncInfo );
+
+/** Map from a numeric Windows charset to a text encoding.
+
+ @param nWinCharset
+ Any numeric Windows charset.
+
+ @return
+ The corresponding rtl_TextEncoding value, or RTL_TEXTENCODING_DONTKNOW if
+ no mapping is applicable.
+ */
+rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromWindowsCharset( sal_uInt8 nWinCharset );
+
+/** Map from a MIME charset to a text encoding.
+
+ @param pMimeCharset
+ Any MIME charset string. Must not be null.
+
+ @return
+ The corresponding rtl_TextEncoding value, or RTL_TEXTENCODING_DONTKNOW if
+ no mapping is applicable.
+ */
+rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromMimeCharset( const sal_Char* pMimeCharset );
+
+/** Map from a Unix charset to a text encoding.
+
+ @param pMimeCharset
+ Any Unix charset string. Must not be null.
+
+ @return
+ The corresponding rtl_TextEncoding value, or RTL_TEXTENCODING_DONTKNOW if
+ no mapping is applicable.
+ */
+rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromUnixCharset( const sal_Char* pUnixCharset );
+
+/** Map from a text encoding to the best matching numeric Windows charset.
+
+ @param eTextEncoding
+ Any rtl_TextEncoding value.
+
+ @return
+ The best matching numeric Windows charset, or 1 if none matches.
+ */
+sal_uInt8 SAL_CALL rtl_getBestWindowsCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding );
+
+/** Map from a text encoding to a corresponding MIME charset name, if
+ available (see <http://www.iana.org/assignments/character-sets>).
+
+ @param nEncoding
+ Any rtl_TextEncoding value.
+
+ @return
+ The (preferred) MIME charset name corresponding to the given encoding, or
+ NULL if none is available.
+ */
+char const * SAL_CALL rtl_getMimeCharsetFromTextEncoding(rtl_TextEncoding
+ nEncoding);
+
+/** Map from a text encoding to the best matching MIME charset.
+
+ @param eTextEncoding
+ Any rtl_TextEncoding value.
+
+ @return
+ The best matching MIME charset string, or null if none matches.
+ */
+const sal_Char* SAL_CALL rtl_getBestMimeCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding );
+
+/** Map from a text encoding to the best matching Unix charset.
+
+ @param eTextEncoding
+ Any rtl_TextEncoding value.
+
+ @return
+ The best matching Unix charset string, or null if none matches.
+ */
+const sal_Char* SAL_CALL rtl_getBestUnixCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding );
+
+/** Map from a Windows code page to a text encoding.
+
+ @param nCodePage
+ Any Windows code page number.
+
+ @return
+ The corresponding rtl_TextEncoding value (which will be an octet text
+ encoding, see rtl_isOctetTextEncoding), or RTL_TEXTENCODING_DONTKNOW if no
+ mapping is applicable.
+ */
+rtl_TextEncoding SAL_CALL
+rtl_getTextEncodingFromWindowsCodePage(sal_uInt32 nCodePage);
+
+/** Map from a text encoding to a Windows code page.
+
+ @param nEncoding
+ Any rtl_TextEncoding value.
+
+ @return
+ The corresponding Windows code page number, or 0 if no mapping is
+ applicable.
+ */
+sal_uInt32 SAL_CALL
+rtl_getWindowsCodePageFromTextEncoding(rtl_TextEncoding nEncoding);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_TENCINFO_H */
diff --git a/sal/inc/rtl/textcvt.h b/sal/inc/rtl/textcvt.h
new file mode 100644
index 000000000000..b22813daf754
--- /dev/null
+++ b/sal/inc/rtl/textcvt.h
@@ -0,0 +1,180 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_TEXTCVT_H
+#define _RTL_TEXTCVT_H
+
+#ifndef _SAL_TYPES_H
+#include <sal/types.h>
+#endif
+#include <rtl/textenc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Documentation about this file can be found at
+ <http://udk.openoffice.org/cpp/man/spec/textconversion.html>. */
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+typedef void* rtl_TextToUnicodeConverter;
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+typedef void* rtl_TextToUnicodeContext;
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+rtl_TextToUnicodeConverter SAL_CALL rtl_createTextToUnicodeConverter( rtl_TextEncoding eTextEncoding );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+void SAL_CALL rtl_destroyTextToUnicodeConverter( rtl_TextToUnicodeConverter hConverter );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+rtl_TextToUnicodeContext SAL_CALL rtl_createTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+void SAL_CALL rtl_destroyTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter, rtl_TextToUnicodeContext hContext );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+void SAL_CALL rtl_resetTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter, rtl_TextToUnicodeContext hContext );
+
+#define RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR ((sal_uInt32)0x0001)
+#define RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_IGNORE ((sal_uInt32)0x0002)
+#define RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE ((sal_uInt32)0x0003)
+#define RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT ((sal_uInt32)0x0004)
+#define RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR ((sal_uInt32)0x0010)
+#define RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_IGNORE ((sal_uInt32)0x0020)
+#define RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT ((sal_uInt32)0x0030)
+#define RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR ((sal_uInt32)0x0100)
+#define RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE ((sal_uInt32)0x0200)
+#define RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT ((sal_uInt32)0x0300)
+#define RTL_TEXTTOUNICODE_FLAGS_FLUSH ((sal_uInt32)0x8000)
+#define RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE 0x10000
+ /* Accept any global document signatures (for example, in UTF-8, a leading
+ EF BB BF encoding the Byte Order Mark U+FEFF) */
+
+#define RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK ((sal_uInt32)0x000F)
+#define RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK ((sal_uInt32)0x00F0)
+#define RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK ((sal_uInt32)0x0F00)
+
+#define RTL_TEXTTOUNICODE_INFO_ERROR ((sal_uInt32)0x0001)
+#define RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL ((sal_uInt32)0x0002)
+#define RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL ((sal_uInt32)0x0004)
+#define RTL_TEXTTOUNICODE_INFO_UNDEFINED ((sal_uInt32)0x0008)
+#define RTL_TEXTTOUNICODE_INFO_MBUNDEFINED ((sal_uInt32)0x0010)
+#define RTL_TEXTTOUNICODE_INFO_INVALID ((sal_uInt32)0x0020)
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+sal_Size SAL_CALL rtl_convertTextToUnicode( rtl_TextToUnicodeConverter hConverter,
+ rtl_TextToUnicodeContext hContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+typedef void* rtl_UnicodeToTextConverter;
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+typedef void* rtl_UnicodeToTextContext;
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+rtl_UnicodeToTextConverter SAL_CALL rtl_createUnicodeToTextConverter( rtl_TextEncoding eTextEncoding );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+void SAL_CALL rtl_destroyUnicodeToTextConverter( rtl_UnicodeToTextConverter hConverter );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+rtl_UnicodeToTextContext SAL_CALL rtl_createUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+void SAL_CALL rtl_destroyUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter, rtl_UnicodeToTextContext hContext );
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+void SAL_CALL rtl_resetUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter, rtl_UnicodeToTextContext hContext );
+
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR ((sal_uInt32)0x0001)
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE ((sal_uInt32)0x0002)
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0 ((sal_uInt32)0x0003)
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK ((sal_uInt32)0x0004)
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_UNDERLINE ((sal_uInt32)0x0005)
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT ((sal_uInt32)0x0006)
+#define RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR ((sal_uInt32)0x0010)
+#define RTL_UNICODETOTEXT_FLAGS_INVALID_IGNORE ((sal_uInt32)0x0020)
+#define RTL_UNICODETOTEXT_FLAGS_INVALID_0 ((sal_uInt32)0x0030)
+#define RTL_UNICODETOTEXT_FLAGS_INVALID_QUESTIONMARK ((sal_uInt32)0x0040)
+#define RTL_UNICODETOTEXT_FLAGS_INVALID_UNDERLINE ((sal_uInt32)0x0050)
+#define RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT ((sal_uInt32)0x0060)
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE ((sal_uInt32)0x0100)
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR ((sal_uInt32)0x0200)
+#define RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 ((sal_uInt32)0x0400)
+#define RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE ((sal_uInt32)0x0800)
+#define RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE ((sal_uInt32)0x1000)
+#define RTL_UNICODETOTEXT_FLAGS_PRIVATE_IGNORE ((sal_uInt32)0x2000)
+#define RTL_UNICODETOTEXT_FLAGS_NOCOMPOSITE ((sal_uInt32)0x4000)
+#define RTL_UNICODETOTEXT_FLAGS_FLUSH ((sal_uInt32)0x8000)
+#define RTL_UNICODETOTEXT_FLAGS_GLOBAL_SIGNATURE 0x10000
+ /* Write any global document signatures (for example, in UTF-8, a leading
+ EF BB BF encoding the Byte Order Mark U+FEFF) */
+
+#define RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK ((sal_uInt32)0x000F)
+#define RTL_UNICODETOTEXT_FLAGS_INVALID_MASK ((sal_uInt32)0x00F0)
+
+#define RTL_UNICODETOTEXT_INFO_ERROR ((sal_uInt32)0x0001)
+#define RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL ((sal_uInt32)0x0002)
+#define RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL ((sal_uInt32)0x0004)
+#define RTL_UNICODETOTEXT_INFO_UNDEFINED ((sal_uInt32)0x0008)
+#define RTL_UNICODETOTEXT_INFO_INVALID ((sal_uInt32)0x0010)
+
+/** see http://udk.openoffice.org/cpp/man/spec/textconversion.html
+ */
+sal_Size SAL_CALL rtl_convertUnicodeToText( rtl_UnicodeToTextConverter hConverter,
+ rtl_UnicodeToTextContext hContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_TEXTCVT_H */
diff --git a/sal/inc/rtl/textenc.h b/sal/inc/rtl/textenc.h
new file mode 100644
index 000000000000..6b0b67e3c8ab
--- /dev/null
+++ b/sal/inc/rtl/textenc.h
@@ -0,0 +1,279 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_TEXTENC_H
+#define _RTL_TEXTENC_H
+
+#ifdef _SOLAR_RSC_INVOKED
+/* Enable resources to use these values, rsc can't handle casts */
+#define RTL_TEXTENC_CAST( val ) (val)
+
+#else /* !_SOLAR_RSC_INVOKED */
+
+#ifndef _SAL_TYPES_H
+#include <sal/types.h>
+#endif
+
+/** The various supported text encodings.
+
+ Possible values include a wide range of single- and multi-byte encodings
+ (ranging from RTL_TEXTENCODING_MS_1252 to RTL_TEXTENCODING_GB_18030),
+ the ISO 10646 (Unicode) specific encodings RTL_TEXTENCODING_UCS4 and
+ RTL_TEXTENCODING_UCS2 (aka RTL_TEXTENCODING_UNICODE), and
+ RTL_TEXTENCODING_DONTKNOW to indicate an unknown or missing encoding.
+ */
+typedef sal_uInt16 rtl_TextEncoding;
+
+#define RTL_TEXTENC_CAST( val ) ((rtl_TextEncoding) val)
+
+#endif /* _SOLAR_RSC_INVOKED */
+
+#define RTL_TEXTENCODING_DONTKNOW (RTL_TEXTENC_CAST( 0 ))
+#define RTL_TEXTENCODING_MS_1252 (RTL_TEXTENC_CAST( 1 ))
+#define RTL_TEXTENCODING_APPLE_ROMAN (RTL_TEXTENC_CAST( 2 ))
+#define RTL_TEXTENCODING_IBM_437 (RTL_TEXTENC_CAST( 3 ))
+#define RTL_TEXTENCODING_IBM_850 (RTL_TEXTENC_CAST( 4 ))
+#define RTL_TEXTENCODING_IBM_860 (RTL_TEXTENC_CAST( 5 ))
+#define RTL_TEXTENCODING_IBM_861 (RTL_TEXTENC_CAST( 6 ))
+#define RTL_TEXTENCODING_IBM_863 (RTL_TEXTENC_CAST( 7 ))
+#define RTL_TEXTENCODING_IBM_865 (RTL_TEXTENC_CAST( 8 ))
+/* Reserved: RTL_TEXTENCODING_SYSTEM (RTL_TEXTENC_CAST( 9 )) */
+#define RTL_TEXTENCODING_SYMBOL (RTL_TEXTENC_CAST( 10 ))
+#define RTL_TEXTENCODING_ASCII_US (RTL_TEXTENC_CAST( 11 ))
+#define RTL_TEXTENCODING_ISO_8859_1 (RTL_TEXTENC_CAST( 12 ))
+#define RTL_TEXTENCODING_ISO_8859_2 (RTL_TEXTENC_CAST( 13 ))
+#define RTL_TEXTENCODING_ISO_8859_3 (RTL_TEXTENC_CAST( 14 ))
+#define RTL_TEXTENCODING_ISO_8859_4 (RTL_TEXTENC_CAST( 15 ))
+#define RTL_TEXTENCODING_ISO_8859_5 (RTL_TEXTENC_CAST( 16 ))
+#define RTL_TEXTENCODING_ISO_8859_6 (RTL_TEXTENC_CAST( 17 ))
+#define RTL_TEXTENCODING_ISO_8859_7 (RTL_TEXTENC_CAST( 18 ))
+#define RTL_TEXTENCODING_ISO_8859_8 (RTL_TEXTENC_CAST( 19 ))
+#define RTL_TEXTENCODING_ISO_8859_9 (RTL_TEXTENC_CAST( 20 ))
+#define RTL_TEXTENCODING_ISO_8859_14 (RTL_TEXTENC_CAST( 21 ))
+#define RTL_TEXTENCODING_ISO_8859_15 (RTL_TEXTENC_CAST( 22 ))
+#define RTL_TEXTENCODING_IBM_737 (RTL_TEXTENC_CAST( 23 ))
+#define RTL_TEXTENCODING_IBM_775 (RTL_TEXTENC_CAST( 24 ))
+#define RTL_TEXTENCODING_IBM_852 (RTL_TEXTENC_CAST( 25 ))
+#define RTL_TEXTENCODING_IBM_855 (RTL_TEXTENC_CAST( 26 ))
+#define RTL_TEXTENCODING_IBM_857 (RTL_TEXTENC_CAST( 27 ))
+#define RTL_TEXTENCODING_IBM_862 (RTL_TEXTENC_CAST( 28 ))
+#define RTL_TEXTENCODING_IBM_864 (RTL_TEXTENC_CAST( 29 ))
+#define RTL_TEXTENCODING_IBM_866 (RTL_TEXTENC_CAST( 30 ))
+#define RTL_TEXTENCODING_IBM_869 (RTL_TEXTENC_CAST( 31 ))
+#define RTL_TEXTENCODING_MS_874 (RTL_TEXTENC_CAST( 32 ))
+#define RTL_TEXTENCODING_MS_1250 (RTL_TEXTENC_CAST( 33 ))
+#define RTL_TEXTENCODING_MS_1251 (RTL_TEXTENC_CAST( 34 ))
+#define RTL_TEXTENCODING_MS_1253 (RTL_TEXTENC_CAST( 35 ))
+#define RTL_TEXTENCODING_MS_1254 (RTL_TEXTENC_CAST( 36 ))
+#define RTL_TEXTENCODING_MS_1255 (RTL_TEXTENC_CAST( 37 ))
+#define RTL_TEXTENCODING_MS_1256 (RTL_TEXTENC_CAST( 38 ))
+#define RTL_TEXTENCODING_MS_1257 (RTL_TEXTENC_CAST( 39 ))
+#define RTL_TEXTENCODING_MS_1258 (RTL_TEXTENC_CAST( 40 ))
+#define RTL_TEXTENCODING_APPLE_ARABIC (RTL_TEXTENC_CAST( 41 ))
+#define RTL_TEXTENCODING_APPLE_CENTEURO (RTL_TEXTENC_CAST( 42 ))
+#define RTL_TEXTENCODING_APPLE_CROATIAN (RTL_TEXTENC_CAST( 43 ))
+#define RTL_TEXTENCODING_APPLE_CYRILLIC (RTL_TEXTENC_CAST( 44 ))
+#define RTL_TEXTENCODING_APPLE_DEVANAGARI (RTL_TEXTENC_CAST( 45 ))
+#define RTL_TEXTENCODING_APPLE_FARSI (RTL_TEXTENC_CAST( 46 ))
+#define RTL_TEXTENCODING_APPLE_GREEK (RTL_TEXTENC_CAST( 47 ))
+#define RTL_TEXTENCODING_APPLE_GUJARATI (RTL_TEXTENC_CAST( 48 ))
+#define RTL_TEXTENCODING_APPLE_GURMUKHI (RTL_TEXTENC_CAST( 49 ))
+#define RTL_TEXTENCODING_APPLE_HEBREW (RTL_TEXTENC_CAST( 50 ))
+#define RTL_TEXTENCODING_APPLE_ICELAND (RTL_TEXTENC_CAST( 51 ))
+#define RTL_TEXTENCODING_APPLE_ROMANIAN (RTL_TEXTENC_CAST( 52 ))
+#define RTL_TEXTENCODING_APPLE_THAI (RTL_TEXTENC_CAST( 53 ))
+#define RTL_TEXTENCODING_APPLE_TURKISH (RTL_TEXTENC_CAST( 54 ))
+#define RTL_TEXTENCODING_APPLE_UKRAINIAN (RTL_TEXTENC_CAST( 55 ))
+#define RTL_TEXTENCODING_APPLE_CHINSIMP (RTL_TEXTENC_CAST( 56 ))
+#define RTL_TEXTENCODING_APPLE_CHINTRAD (RTL_TEXTENC_CAST( 57 ))
+#define RTL_TEXTENCODING_APPLE_JAPANESE (RTL_TEXTENC_CAST( 58 ))
+#define RTL_TEXTENCODING_APPLE_KOREAN (RTL_TEXTENC_CAST( 59 ))
+#define RTL_TEXTENCODING_MS_932 (RTL_TEXTENC_CAST( 60 ))
+#define RTL_TEXTENCODING_MS_936 (RTL_TEXTENC_CAST( 61 ))
+#define RTL_TEXTENCODING_MS_949 (RTL_TEXTENC_CAST( 62 ))
+#define RTL_TEXTENCODING_MS_950 (RTL_TEXTENC_CAST( 63 ))
+#define RTL_TEXTENCODING_SHIFT_JIS (RTL_TEXTENC_CAST( 64 ))
+#define RTL_TEXTENCODING_GB_2312 (RTL_TEXTENC_CAST( 65 ))
+#define RTL_TEXTENCODING_GBT_12345 (RTL_TEXTENC_CAST( 66 ))
+#define RTL_TEXTENCODING_GBK (RTL_TEXTENC_CAST( 67 ))
+#define RTL_TEXTENCODING_BIG5 (RTL_TEXTENC_CAST( 68 ))
+#define RTL_TEXTENCODING_EUC_JP (RTL_TEXTENC_CAST( 69 ))
+#define RTL_TEXTENCODING_EUC_CN (RTL_TEXTENC_CAST( 70 ))
+#define RTL_TEXTENCODING_EUC_TW (RTL_TEXTENC_CAST( 71 ))
+#define RTL_TEXTENCODING_ISO_2022_JP (RTL_TEXTENC_CAST( 72 ))
+#define RTL_TEXTENCODING_ISO_2022_CN (RTL_TEXTENC_CAST( 73 ))
+#define RTL_TEXTENCODING_KOI8_R (RTL_TEXTENC_CAST( 74 ))
+#define RTL_TEXTENCODING_UTF7 (RTL_TEXTENC_CAST( 75 ))
+#define RTL_TEXTENCODING_UTF8 (RTL_TEXTENC_CAST( 76 ))
+#define RTL_TEXTENCODING_ISO_8859_10 (RTL_TEXTENC_CAST( 77 ))
+#define RTL_TEXTENCODING_ISO_8859_13 (RTL_TEXTENC_CAST( 78 ))
+#define RTL_TEXTENCODING_EUC_KR (RTL_TEXTENC_CAST( 79 ))
+#define RTL_TEXTENCODING_ISO_2022_KR (RTL_TEXTENC_CAST( 80 ))
+#define RTL_TEXTENCODING_JIS_X_0201 (RTL_TEXTENC_CAST( 81 ))
+#define RTL_TEXTENCODING_JIS_X_0208 (RTL_TEXTENC_CAST( 82 ))
+#define RTL_TEXTENCODING_JIS_X_0212 (RTL_TEXTENC_CAST( 83 ))
+#define RTL_TEXTENCODING_MS_1361 (RTL_TEXTENC_CAST( 84 ))
+#define RTL_TEXTENCODING_GB_18030 (RTL_TEXTENC_CAST( 85 ))
+#define RTL_TEXTENCODING_BIG5_HKSCS (RTL_TEXTENC_CAST( 86 ))
+#define RTL_TEXTENCODING_TIS_620 (RTL_TEXTENC_CAST( 87 ))
+#define RTL_TEXTENCODING_KOI8_U (RTL_TEXTENC_CAST( 88 ))
+#define RTL_TEXTENCODING_ISCII_DEVANAGARI (RTL_TEXTENC_CAST( 89 ))
+#define RTL_TEXTENCODING_JAVA_UTF8 (RTL_TEXTENC_CAST( 90 ))
+#define RTL_TEXTENCODING_ADOBE_STANDARD (RTL_TEXTENC_CAST( 91 ))
+#define RTL_TEXTENCODING_ADOBE_SYMBOL (RTL_TEXTENC_CAST( 92 ))
+#define RTL_TEXTENCODING_PT154 (RTL_TEXTENC_CAST( 93 ))
+#define RTL_TEXTENCODING_ADOBE_DINGBATS (RTL_TEXTENC_CAST( 94 ))
+/* ATTENTION! Whenever some encoding is added here, make sure to update
+ * rtl_isOctetTextEncoding in tencinfo.c.
+ */
+
+#define RTL_TEXTENCODING_USER_START (RTL_TEXTENC_CAST( 0x8000 ))
+#define RTL_TEXTENCODING_USER_END (RTL_TEXTENC_CAST( 0xEFFF ))
+
+#define RTL_TEXTENCODING_UCS4 (RTL_TEXTENC_CAST( 0xFFFE ))
+#define RTL_TEXTENCODING_UCS2 (RTL_TEXTENC_CAST( 0xFFFF ))
+#define RTL_TEXTENCODING_UNICODE RTL_TEXTENCODING_UCS2
+
+/****** Overview over the TextEncodings *****
+# Arabic (Apple Macintosh) RTL_TEXTENCODING_APPLE_ARABIC
+Arabic (DOS/OS2-864) RTL_TEXTENCODING_IBM_864
+Arabic (ISO-8859-6) RTL_TEXTENCODING_ISO_8859_6
+Arabic (Windows-1256) RTL_TEXTENCODING_MS_1256
+
+Baltic (DOS/OS2-775) RTL_TEXTENCODING_IBM_775
+Baltic (ISO-8859-4) RTL_TEXTENCODING_ISO_8859_4
+Baltic (Windows-1257) RTL_TEXTENCODING_MS_1257
+
+Central European (Apple Macintosh) RTL_TEXTENCODING_APPLE_CENTEURO
+Central European (Apple Macintosh/Croatian) RTL_TEXTENCODING_APPLE_CROATIAN
+Central European (Apple Macintosh/Romanian) RTL_TEXTENCODING_APPLE_ROMANIAN
+Central European (DOS/OS2-852) RTL_TEXTENCODING_IBM_852
+Central European (ISO-8859-2) RTL_TEXTENCODING_ISO_8859_2
+Central European (ISO-8859-10) RTL_TEXTENCODING_ISO_8859_10
+Central European (ISO-8859-13) RTL_TEXTENCODING_ISO_8859_13
+Central European (Windows-1250/WinLatin 2) RTL_TEXTENCODING_MS_1250
+
+Chinese Simplified (Apple Macintosh) RTL_TEXTENCODING_APPLE_CHINSIMP
+Chinese Simplified (EUC-CN) RTL_TEXTENCODING_EUC_CN
+Chinese Simplified (GB-2312) RTL_TEXTENCODING_GB_2312
+Chinese Simplified (GBK/GB-2312-80) RTL_TEXTENCODING_GBK
+# Chinese Simplified (ISO-2022-CN) RTL_TEXTENCODING_ISO_2022_CN
+Chinese Simplified (Windows-936) RTL_TEXTENCODING_MS_936
+# Chinese Simplified (GB-18030) RTL_TEXTENCODING_GB_18030
+
+Chinese Traditional (Apple Macintosh) RTL_TEXTENCODING_APPLE_CHINTRAD
+Chinese Traditional (BIG5) RTL_TEXTENCODING_BIG5
+# Chinese Traditional (EUC-TW) RTL_TEXTENCODING_EUC_TW
+Chinese Traditional (GBT-12345) RTL_TEXTENCODING_GBT_12345
+Chinese Traditional (Windows-950) RTL_TEXTENCODING_MS_950
+Chinese Traditional (BIG5-HKSCS) RTL_TEXTENCODING_BIG5_HKSCS
+
+Cyrillic (Apple Macintosh) RTL_TEXTENCODING_APPLE_CYRILLIC
+Cyrillic (Apple Macintosh/Ukrainian) RTL_TEXTENCODING_APPLE_UKRAINIAN
+Cyrillic (DOS/OS2-855) RTL_TEXTENCODING_IBM_855
+Cyrillic (DOS/OS2-866/Russian) RTL_TEXTENCODING_IBM_866
+Cyrillic (ISO-8859-5) RTL_TEXTENCODING_ISO_8859_5
+Cyrillic (KOI8-R) RTL_TEXTENCODING_KOI8_R
+Cyrillic (KOI8-U) RTL_TEXTENCODING_KOI8_U
+Cyrillic (Windows-1251) RTL_TEXTENCODING_MS_1251
+
+Greek (Apple Macintosh) RTL_TEXTENCODING_APPLE_GREEK
+Greek (DOS/OS2-737) RTL_TEXTENCODING_IBM_737
+Greek (DOS/OS2-869/Modern) RTL_TEXTENCODING_IBM_869
+Greek (ISO-8859-7) RTL_TEXTENCODING_ISO_8859_7
+Greek (Windows-1253) RTL_TEXTENCODING_MS_1253
+
+# Hebrew (Apple Macintosh) RTL_TEXTENCODING_APPLE_HEBREW
+Hebrew (DOS/OS2-862) RTL_TEXTENCODING_IBM_862
+Hebrew (ISO-8859-8) RTL_TEXTENCODING_ISO_8859_8
+Hebrew (Windows-1255) RTL_TEXTENCODING_MS_1255
+
+Korean (Apple Macintosh) RTL_TEXTENCODING_APPLE_KOREAN
+Korean (EUC-KR) RTL_TEXTENCODING_EUC_KR
+# Korean (ISO-2022-KR) RTL_TEXTENCODING_ISO_2022_KR
+Korean (Windows-Wansung-949) RTL_TEXTENCODING_MS_949
+Korean (Windows-Johab-1361) RTL_TEXTENCODING_MS_1361
+
+Latin 3 (ISO-8859-3) RTL_TEXTENCODING_ISO_8859_3
+
+Indian (ISCII Devanagari) RTL_TEXTENCODING_ISCII_DEVANAGARI
+
+Japanese (Apple Macintosh) RTL_TEXTENCODING_APPLE_JAPANESE
+Japanese (EUC-JP) RTL_TEXTENCODING_EUC_JP
+# Japanese (ISO-2022-JP) RTL_TEXTENCODING_ISO_2022_JP
+Japanese (Shift-JIS) RTL_TEXTENCODING_SHIFT_JIS
+Japanese (Windows-932) RTL_TEXTENCODING_MS_932
+
+Symbol RTL_TEXTENCODING_SYMBOL
+
+# Thai (Apple Macintosh) RTL_TEXTENCODING_APPLE_THAI
+Thai (Dos/Windows-874) RTL_TEXTENCODING_MS_874
+Thai (TIS 620) RTL_TEXTENCODING_TIS_620
+
+Turkish (Apple Macintosh) RTL_TEXTENCODING_APPLE_TURKISH
+Turkish (DOS/OS2-857) RTL_TEXTENCODING_IBM_857
+Turkish (ISO-8859-9) RTL_TEXTENCODING_ISO_8859_9
+Turkish (Windows-1254) RTL_TEXTENCODING_MS_1254
+
+Unicode (UTF-7) RTL_TEXTENCODING_UTF7
+Unicode (UTF-8) RTL_TEXTENCODING_UTF8
+Unicode (Java's modified UTF-8) RTL_TEXTENCODING_JAVA_UTF8
+
+Vietnamese (Windows-1258) RTL_TEXTENCODING_MS_1258
+
+Western (Apple Macintosh) RTL_TEXTENCODING_APPLE_ROMAN
+Western (Apple Macintosh/Icelandic) RTL_TEXTENCODING_APPLE_ICELAND
+Western (ASCII/US) RTL_TEXTENCODING_ASCII_US
+Western (DOS/OS2-437/US) RTL_TEXTENCODING_IBM_437
+Western (DOS/OS2-850/International) RTL_TEXTENCODING_IBM_850
+Western (DOS/OS2-860/Portugese) RTL_TEXTENCODING_IBM_860
+Western (DOS/OS2-861/Icelandic) RTL_TEXTENCODING_IBM_861
+Western (DOS/OS2-863/Canadian-French) RTL_TEXTENCODING_IBM_863
+Western (DOS/OS2-865/Nordic) RTL_TEXTENCODING_IBM_865
+Western (ISO-8859-1) RTL_TEXTENCODING_ISO_8859_1
+Western (ISO-8859-14) RTL_TEXTENCODING_ISO_8859_14
+Western (ISO-8859-15/EURO) RTL_TEXTENCODING_ISO_8859_15
+Western (Window-1252/WinLatin 1) RTL_TEXTENCODING_MS_1252
+
+Not known and currently not supported
+# RTL_TEXTENCODING_APPLE_DEVANAGARI
+# RTL_TEXTENCODING_APPLE_FARSI
+# RTL_TEXTENCODING_APPLE_GUJARATI
+# RTL_TEXTENCODING_APPLE_GURMUKHI
+
+Only for internal implementations and not useful for user interface.
+These encodings are not used for text encodings, only used for
+font-/textoutput encodings.
+Japanese (JIS 0201) RTL_TEXTENCODING_JISX_0201
+Japanese (JIS 0208) RTL_TEXTENCODING_JISX_0208
+Japanese (JIS 0212) RTL_TEXTENCODING_JISX_0212
+
+# Currently not implemented
+*/
+
+#endif /* _RTL_TEXTENC_H */
+
diff --git a/sal/inc/rtl/tres.h b/sal/inc/rtl/tres.h
new file mode 100644
index 000000000000..9535d0b2adc2
--- /dev/null
+++ b/sal/inc/rtl/tres.h
@@ -0,0 +1,106 @@
+#ifndef _RTL_TRES_H_
+#define _RTL_TRES_H_
+
+#include <osl/diagnose.h>
+#include <rtl/string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* comandline flags */
+#define rtl_tres_Flag_BOOM 0x00000001
+#define rtl_tres_Flag_VERBOSE 0x00000002
+#define rtl_tres_Flag_SKIP 0x00000004
+#define rtl_tres_Flag_LOG 0x00000010
+#define rtl_tres_Flag_HIS 0x00000100
+#define rtl_tres_Flag_TIME 0x00000200
+#define rtl_tres_Flag_MSG 0x00000400
+#define rtl_tres_Flag_QUIET 0x00000800
+
+ /* state flags */
+#define rtl_tres_Flag_SUB 0x01000000
+#define rtl_tres_Flag_PASSED 0x10000000
+#define rtl_tres_Flag_OK 0x20000000
+
+
+
+ /* forward declaration and type definition */
+struct _rtl_TestResult;
+typedef struct _rtl_TestResult rtl_TestResult;
+
+
+typedef void* rtl_funcstate;
+typedef void* rtl_cmpstate;
+
+ /* type definitions of function pointers wich can be overloaded */
+typedef sal_Bool (SAL_CALL *rtl_tres_state_ptr)(
+ rtl_TestResult*,
+ sal_Bool,
+ const sal_Char*,
+ const sal_Char*,
+ sal_Bool
+ );
+
+typedef void (SAL_CALL *rtl_tres_end_ptr)( rtl_TestResult*, const sal_Char* );
+typedef sal_Bool (SAL_CALL *rtl_tres_ispassed_ptr)( rtl_TestResult* );
+typedef sal_Bool (SAL_CALL *rtl_tres_isok_ptr)( rtl_TestResult* );
+typedef rtl_funcstate (SAL_CALL *rtl_tres_funcstate_ptr)( rtl_TestResult* );
+typedef sal_Bool (SAL_CALL *rtl_tres_isbit_ptr)( rtl_TestResult*,
+ sal_uInt32 );
+
+typedef rtl_funcstate (SAL_CALL *rtl_tres_getnextfuncstate_ptr)
+ ( rtl_funcstate );
+typedef rtl_funcstate (SAL_CALL *rtl_tres_getprevfuncstate_ptr)
+ ( rtl_funcstate );
+typedef sal_uInt32 (SAL_CALL *rtl_tres_getflags_ptr)( rtl_funcstate );
+typedef rtl_String* (SAL_CALL *rtl_tres_getname_ptr)( rtl_funcstate );
+typedef sal_uInt32 (SAL_CALL *rtl_tres_getstart_ptr)( rtl_funcstate );
+typedef sal_uInt32 (SAL_CALL *rtl_tres_getstop_ptr)( rtl_funcstate );
+typedef rtl_cmpstate (SAL_CALL *rtl_tres_getcmpstate_ptr)( rtl_funcstate );
+
+typedef sal_Bool (SAL_CALL *rtl_tres_getstat_ptr)( rtl_cmpstate );
+typedef rtl_String* (SAL_CALL *rtl_tres_getmsg_ptr)( rtl_cmpstate );
+typedef rtl_cmpstate (SAL_CALL *rtl_tres_getnextcmpstate_ptr)( rtl_cmpstate );
+
+ /* type definition of vtable structure for testresult */
+typedef struct _rtl_TestResult_vtable
+{
+ sal_uInt32 vtablesize;
+ rtl_tres_state_ptr state_;
+ rtl_tres_end_ptr end_;
+ rtl_tres_ispassed_ptr ispassed;
+ rtl_tres_isok_ptr isok;
+ rtl_tres_funcstate_ptr funcstate;
+ rtl_tres_isbit_ptr isbit;
+ rtl_tres_getnextfuncstate_ptr nextfuncstate;
+ rtl_tres_getprevfuncstate_ptr prevfuncstate;
+ rtl_tres_getflags_ptr flags;
+ rtl_tres_getname_ptr name;
+ rtl_tres_getstart_ptr start;
+ rtl_tres_getstop_ptr stop;
+ rtl_tres_getcmpstate_ptr cmpstate;
+ rtl_tres_getstat_ptr stat;
+ rtl_tres_getmsg_ptr msg;
+ rtl_tres_getnextcmpstate_ptr nextcmpstate;
+
+} rtl_TestResult_vtable;
+
+ /* type definition of testresult structure */
+struct _rtl_TestResult
+{
+ rtl_TestResult_vtable * pFuncs;
+ void * pExternalData;
+
+};
+
+
+ /* exports */
+rtl_TestResult* SAL_CALL rtl_tres_create( const sal_Char* meth, sal_uInt32 flags );
+void SAL_CALL rtl_tres_destroy( rtl_TestResult* res );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_TRES_H_ */
diff --git a/sal/inc/rtl/tres.hxx b/sal/inc/rtl/tres.hxx
new file mode 100644
index 000000000000..6fcd5b7c61e7
--- /dev/null
+++ b/sal/inc/rtl/tres.hxx
@@ -0,0 +1,112 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_TRES_HXX_
+#define _RTL_TRES_HXX_
+
+
+#include <rtl/tres.h>
+
+//#include <stdarg.h>
+
+// <namespace_rtl>
+namespace rtl
+{
+/*==========================================================================*/
+
+// <class_TestResult>
+class TestResult
+{
+ // pointer to testresult structure
+ rtl_TestResult* pData;
+
+ // <private_ctors>
+ TestResult();
+ TestResult( const TestResult& oRes );
+ // </private_ctors>
+
+public:
+
+
+ // <public_ctors>
+ TestResult( const sal_Char* meth, sal_uInt32 flags = 0 )
+ {
+ pData = rtl_tres_create( meth, flags );
+ } // </public_ctors>
+
+ // <dtor>
+ ~TestResult()
+ {
+ rtl_tres_destroy( pData );
+ }
+ // </dtor>
+
+ // <public_methods>
+ rtl_TestResult* getData()
+ {
+ return pData;
+ }
+ // <method_state>
+ sal_Bool state(
+ sal_Bool tst_state,
+ const sal_Char* msg = 0,
+ const sal_Char* sub = 0,
+ sal_Bool verbose = sal_False
+ )
+ {
+ return pData->pFuncs->state_( pData, tst_state, msg, sub, verbose );
+ } // </method_state>
+
+ void end( sal_Char* msg = 0 )
+ {
+ pData->pFuncs->end_( pData, msg );
+ } // </method_state>
+}; // </class_TestResult>
+
+} // </namespace_rtl>
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sal/inc/rtl/unload.h b/sal/inc/rtl/unload.h
new file mode 100644
index 000000000000..30a8ddbe4a8f
--- /dev/null
+++ b/sal/inc/rtl/unload.h
@@ -0,0 +1,315 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_UNLOAD_H_
+#define _RTL_UNLOAD_H_
+
+#include <sal/types.h>
+#include <osl/time.h>
+#include <osl/interlck.h>
+#include <osl/module.h>
+
+///@HTML
+/** @file
+The API enables an effective way of unloading libraries in a centralized way.
+The mechanism ensures that used libraries are not unloaded. This prevents
+crashes if library code is being used after unloading the library.
+The unloading mechanism currently only works with libraries which contain
+UNO services. A library cannot be unloaded if one of the following conditions
+apply
+
+<ul>
+<li>An instance is still referenced </li>
+<li>A module has been loaded without registering it </li>
+<li>The service manager has created a one instance service </li>
+<li>A service instance has been added to an UNO context </li>
+</ul>
+
+<b>Notification Mechanism</b>
+The API provides a notification mechanism. Clients can use it to do clean up,
+such as releasing cached references, in order to allow modules to be unloaded.
+As long as someone holds a reference to an object whose housing module
+supports unloading the module cannot be unloaded.<p>
+
+Because of the inherent danger of crashing the application by using this API
+all instances which control threads should be registered listeners. On
+notification they have to ensure that their threads assume a safe state, that
+is, they run outside of modules which could be unloaded and do not jump
+back into module code as a result of a finished function call. In other words,
+there must not be an address of the module on the thread's stack.
+<p>
+Since current operating systems lack APIs in respect to controlling the
+position of threads within libraries, it would be a major effort to comply with
+that recommendation. The best and most efficient way of handling the unloading
+scenario is to let all threads, except for the main thread, die in case of a
+notification.
+<p>
+Use this API with great care because it might crash the application. See the
+respective documentation (Library Unloading) on the udk.openoffice.org web site.
+*/
+
+
+/**
+A library which supports unloading has to implement and export a function
+called <code>component_canUnload</code>. <p>
+If the function returns <code>sal_True</code> then the module can be safely unloaded.
+That is the case when there are no external references to code within the
+library. In case a module houses UNO components then the function must return
+<code>sal_False</code> after the first factory has been handed out. The function then
+continues to return <code>sal_False</code> as long as there is at least one object (factory
+or service instance) which originated from the module.<p>
+
+Libraries which not only contain UNO components (or none at all) have to
+provide a means to control whether they can be unloaded or not, e.g. However,
+there is no concept yet. <p>
+
+The argument <code>pTime</code> is an optional out-parameter. If the return value is
+<code>sal_True</code> then <code>pTime</code> reflects a point in time since
+when the module could have
+been unloaded. Since that time the function would have continually returned
+<code>sal_True</code> up to the present. The value of <code>pTime</code> is
+important for the decision
+as to a module will be unloaded. When someone initiates the unloading of
+modules by calling <code>rtl_unloadUnusedModules</code> then the caller can specify a time
+span with the effect that only those modules are unloaded which are unused at
+least for that amount of time. If <code>component_canUnload</code> does not
+fill in <code>pTime</code>
+then the module is unloaded immediately.<p>
+
+<code>component_canUnload</code> is implicitly called by <code>rtl_unloadUnusedModules
+</code>. There is no need to call the function directly.
+*/
+#define COMPONENT_CANUNLOAD "component_canUnload"
+typedef sal_Bool (SAL_CALL * component_canUnloadFunc)( TimeValue* pTime);
+
+
+/** C-interface for a module reference counting
+ */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+By registering a module, one declares that a module supports the
+unloading mechanism. One registers a module by calling this function.<p>
+
+A module can only be unloaded from memory when it has been registered
+as many times as it has been loaded. The reason is that a library can
+be &quot;loaded&quot; several times by <code>osl_loadModule</code>
+within the same process. The
+function will then return the same module handle because the library will
+effectively only be loaded once. To remove the library from memory it is
+necessary to call <code>osl_unloadModule</code> as often as <code>
+osl_loadModule</code> was called. The
+function <code>rtl_unloadUnusedModules</code> calls <code>osl_unloadModule</code>
+for a module as many
+times as it was registered. If, for example, a module has been registered one
+time less then <code>osl_loadModule</code> has been called and the module can be unloaded
+then it needs a call to <code>rtl_unloadUnusedModules</code> and an explicit call to
+<code>osl_unloadModule</code> to remove the module from memory. <p>
+
+A module must be registered every time it has been loaded otherwise the
+unloading mechanism is not effective.<p>
+
+Before a module is registered, one has to make sure that the module is in a
+state that prevents it from being unloaded. In other words,
+<code>component_canUnload</code> must return <code>sal_False</code>. Assuming that
+<code>component_canUnload</code>
+returns <code>sal_True</code> and it is registered regardless, then a call to
+<code>rtl_unloadUnusedModules</code> causes the module to be unloaded. This unloading can
+be set off by a different thread and the thread which registered the module is
+&quot;unaware&quot; of this. Then when the first thread tries to obtain a factory or
+calls another function in the module, the application will crash, because the
+module has been unloaded before. Therefore one has to ensure that the module
+cannot be unloaded before it is registered. This is simply done by obtaining a
+factory from the module. As long as a factory or some other object, which has
+been created by the factory, is alive, the <code>component_canUnload</code> function will
+return <code>sal_False</code>.<p>
+Loading and registering have to be in this order:<br>
+<ul>
+<li>load a library (<code>osl_loadModule</code>)</li>
+<li>get the <code>component_getFactory</code> function and get a factory</li>
+<li>register the module (rtl_registerModuleForUnloading</li>
+</ul>
+Usually the service manager is used to obtain an instance of a service.
+The service manager registers all modules which support the unloading mechanism.
+When the service manager is used to get service instances than one does not
+have to bother about registering.
+
+@param module a module handle as is obtained by osl_loadModule
+@return sal_True - the module could be registered for unloading, sal_False otherwise
+*/
+sal_Bool SAL_CALL rtl_registerModuleForUnloading( oslModule module);
+
+/**
+The function revokes the registration of a module. By calling the function for
+a previously registered module one prevents the module from being unloaded by
+this unloading mechanism. However, in order to completely unregister the module
+it is necessary to call the function as often as the module has been registered.
+<p>
+<code>rtl_unloadUnusedModules</code> unregisters the modules which it unloads. Therefore
+there is no need to call this function unless one means to prevent the unloading of a module.
+
+@param module a module handle as is obtained by osl_loadModule
+*/
+void SAL_CALL rtl_unregisterModuleForUnloading( oslModule module);
+/**
+This function sets off the unloading mechanism. At first it notifies the
+unloading listeners in order to give them a chance to do cleanup and get
+their threads in a safe state. Then all registered modules are asked if they
+can be unloaded. That is, the function calls component_canUnload on every
+registered module. If <code>sal_True</code> is returned then <code>osl_unloadModule</code>
+is called for the belonging module as often as it is registered.
+<p>
+A call to <code>osl_unloadModule</code> does not guarantee that the module is unloaded even
+if its <code>component_canUnload</code> function returns <code>sal_True</code>.
+<p>
+The optional in-parameter <code>libUnused</code> specifies a period of time which a library
+must be unused in order to qualify for being unloaded. By using this argument
+one can counter the multithreading problem as described further above. It is in
+the responsibility of the user of this function to provide a timespan big enough
+to ensure that all threads are out of modules (see <code>component_canUnload</code>).
+<p>
+The service managers which have been created by functions such as
+<code>createRegistryServiceFactory</code> (declared in cppuhelper/servicefactory.hxx) are
+registered listeners and release the references to factories on notification.
+
+
+@param libUnused span of time that a module must be unused to be unloaded. the
+argument is optional.
+*/
+void SAL_CALL rtl_unloadUnusedModules( TimeValue* libUnused);
+
+/**
+rtl_addUnloadingListener takes an argument of this type.
+
+@param id - The value that has been passed as second argument to rtl_addUnloadingListener
+*/
+typedef void (SAL_CALL *rtl_unloadingListenerFunc)(void* id);
+/**
+The function registered an unloading listener. The callback argument is a
+function which is called when the unloading procedure has been initiated by a call to
+<code>rtl_unloadUnusedLibraries</code>. The second argument is used to distinguish between different
+listener instances and may be <code>NULL</code>. It will be passed as argument when the callback
+function is being called. The return value identifies the registered listener and will
+be used for removing the listener later on. If the same listener is added more then
+once then every registration is treated as if made for a different listener. That is,
+a different cookie is returned and the callback function will be called as many times
+as it has been registered.
+@param callback - a function that is called to notify listeners.
+@param this - a value to distinguish different listener instances
+@return identifier which is used in rtl_removeUnloadingListener
+*/
+sal_Int32 SAL_CALL rtl_addUnloadingListener( rtl_unloadingListenerFunc callback, void* _this);
+
+/**
+Listeners (the callback functions) must be unregistered before the listener code
+becomes invalid. That is, if a module contains listener code, namely callback
+functions of type <code>rtl_unloadingListenerFunc</code>, then those functions must not be
+registered when <code>component_canUnload</code> returns <code>sal_True</code>.
+
+@param cookie is an identifier as returned by <code>rtl_addUnloadingListener</code> function.
+*/
+void SAL_CALL rtl_removeUnloadingListener( sal_Int32 cookie );
+
+
+/**
+Pointers to <code>rtl_ModuleCount</code> are passed as arguments to the default factory creator
+functions: <code>createSingleComponentFactory</code>, <code>createSingleFactory</code>,
+<code>createOneInstanceFactory</code>.
+The factory implementation is calling <code>rtl_ModuleCount.acquire</code> when it is being
+constructed and it is calling <code>rtl_ModuleCount.release</code>. The implementations of
+<code>acquire</code>
+and <code>release</code> should influence the return value of <code>component_canUnload</code>
+in a way that it
+returns <code>sal_False</code> after <code>acquire</code> has been called. That is the module will not be unloaded
+once a default factory has been created. A call to <code>release</code> may cause
+<code>component_canUnload</code> to return <code>sal_False</code>, but only if there are
+no object alive which
+originated from the module. These objects are factory instances and the service instances
+which have been created by these factories.
+<p>
+It is not necessary to synchronize <code>acquire</code> and <code>release</code> as a whole.
+Simply sychronize the
+access to a counter variable, e.g. the <code>rtl_moduleCount_release</code> implementation:
+<pre>
+extern "C" void rtl_moduleCount_acquire(rtl_ModuleCount * that )
+{
+ rtl_StandardModuleCount* pMod= (rtl_StandardModuleCount*)that;
+ osl_incrementInterlockedCount( &pMod->counter);
+}
+</pre>
+The SAL library offers functions that can be used for <code>acquire</code> and <code>release</code>. See struct
+<code>_rtl_StandardModuleCount</code>.
+*/
+typedef struct _rtl_ModuleCount
+{
+ void ( SAL_CALL * acquire ) ( struct _rtl_ModuleCount * that );
+ void ( SAL_CALL * release ) ( struct _rtl_ModuleCount * that );
+}rtl_ModuleCount;
+
+
+#define MODULE_COUNT_INIT \
+{ {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload, 0, {0, 0}}
+
+/**
+This struct can be used to implement the unloading mechanism. To make a UNO library
+unloadable create one global instance of this struct in the module. To initialize it one
+uses the MODULE_COUNT_INIT macro.
+
+<pre>rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT</pre>;
+*/
+typedef struct _rtl_StandardModuleCount
+{
+ rtl_ModuleCount modCnt;
+ sal_Bool ( *canUnload ) ( struct _rtl_StandardModuleCount* a, TimeValue* libUnused);
+ oslInterlockedCount counter;
+ TimeValue unusedSince;
+} rtl_StandardModuleCount;
+
+/** Default implementation for <code>rtl_ModuleCount.acquire</code>. Use this function along with
+<code>rtl_StandardModuleCount</code>.
+*/
+void rtl_moduleCount_acquire(rtl_ModuleCount * that );
+/** Default implementation for <code>rtl_ModuleCount.release</code>.
+Use this function along with
+<code>rtl_StandardModuleCount</code>.
+*/
+void rtl_moduleCount_release( rtl_ModuleCount * that );
+
+/** Default implementation for <code>component_canUnload</code>. Use this function along with
+<code>rtl_StandardModuleCount</code>.
+*/
+sal_Bool rtl_moduleCount_canUnload( rtl_StandardModuleCount * that, TimeValue* libUnused);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/sal/inc/rtl/uri.h b/sal/inc/rtl/uri.h
new file mode 100644
index 000000000000..aace6e934d27
--- /dev/null
+++ b/sal/inc/rtl/uri.h
@@ -0,0 +1,354 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_URI_H_
+#define _RTL_URI_H_
+
+#include "rtl/textenc.h"
+#include "rtl/ustring.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** Various predefined URI 'char classes.'
+
+ @descr
+ A 'char class' defines which (ASCII) characters can be written 'as they
+ are' in a part of a Uri, and which characters have to be written using
+ escape sequences ('%' followed by two hex digits). Characters outside
+ the ASCII range are always written using escape sequences.
+
+ @descr
+ If there are other frequently used char classes, they can be added to
+ this enumeration; the function rtl_getUriCharClass() has to be adapted
+ then, too.
+ */
+typedef enum
+{
+ /** The empty char class.
+
+ @descr
+ All characters are written using escape sequences.
+ */
+ rtl_UriCharClassNone,
+
+ /** The RFC 2732 <uric> char class.
+
+ @descr
+ The 'valid' characters are !$&'()*+,-./:;=?@[]_~ plus digits and
+ letters.
+ */
+ rtl_UriCharClassUric,
+
+ /** The RFC 2396 <uric_no_slash> char class.
+
+ @descr
+ The 'valid' characters are !$&'()*+,-.:;=?@_~ plus digits and letters.
+ */
+ rtl_UriCharClassUricNoSlash,
+
+ /** The RFC 2396 <rel_segment> char class.
+
+ @descr
+ The 'valid' characters are !$&'()*+,-.;=@_~ plus digits and letters.
+ */
+ rtl_UriCharClassRelSegment,
+
+ /** The RFC 2396 <reg_name> char class.
+
+ @descr
+ The 'valid' characters are !$&'()*+,-.:;=@_~ plus digits and letters.
+ */
+ rtl_UriCharClassRegName,
+
+ /** The RFC 2396 <userinfo> char class.
+
+ @descr
+ The 'valid' characters are !$&'()*+,-.:;=_~ plus digits and letters.
+ */
+ rtl_UriCharClassUserinfo,
+
+ /** The RFC 2396 <pchar> char class.
+
+ @descr
+ The 'valid' characters are !$&'()*+,-.:=@_~ plus digits and letters.
+ */
+ rtl_UriCharClassPchar,
+
+ /** The char class for the values of uno URL parameters.
+
+ @descr
+ The 'valid' characters are !$&'()*+-./:?@_~ plus digits and letters.
+ */
+ rtl_UriCharClassUnoParamValue,
+
+ rtl_UriCharClass_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+}
+rtl_UriCharClass;
+
+/** The mechanism describing how escape sequences in the input of
+ rtl_uriEncode() are handled.
+ */
+typedef enum
+{
+ /** The special meaning of '%' is ignored (i.e., there are by definition
+ no escape sequences in the input).
+
+ @descr
+ This mechanism is useful to encode user input as part of a URI (e.g.,
+ the user-supplied password in an ftp URL---'%20abcde' is a valid
+ password, so do not assume that the '%20' is an escaped space).
+ */
+ rtl_UriEncodeIgnoreEscapes,
+
+ /** All escape sequences ('%' followed by two hex digits) are kept intact,
+ even if they represent characters that need not be escaped or if they
+ do not even map to characters in the given charset.
+
+ @descr
+ This mechanism is useful when passing on complete URIs more or less
+ unmodified (e.g., within an HTTP proxy): missing escape sequences are
+ added, but existing escape sequences are not touched (except that any
+ lower case hex digits are replaced by upper case hex digits).
+ */
+ rtl_UriEncodeKeepEscapes,
+
+ /** All escape sequences ('%' followed by two hex digits) are resolved in
+ a first step; only those that represent characters that need to be
+ escaped are kept intact.
+
+ @descr
+ This mechanism is useful to properly encode complete URIs entered by
+ the user: the URI is brought into a 'canonic form,' but care is taken
+ not to damage (valid) escape sequences the (careful) user already
+ entered as such.
+ */
+ rtl_UriEncodeCheckEscapes,
+
+ /** Like rtl_UriEncodeIgnoreEscapes, but indicating failure when converting
+ unmappable characters.
+
+ @since UDK 3.2.0
+ */
+ rtl_UriEncodeStrict,
+
+ /** Like rtl_UriEncodeKeepEscapes, but indicating failure when converting
+ unmappable characters.
+
+ @since UDK 3.2.7
+ */
+ rtl_UriEncodeStrictKeepEscapes,
+
+ rtl_UriEncode_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+}
+rtl_UriEncodeMechanism;
+
+/** The mechanism describing how rtl_uriDecode() translates (part of) a URI
+ into a Unicode string.
+ */
+typedef enum
+{
+ /** The text is returned completely unmodified.
+ */
+ rtl_UriDecodeNone,
+
+ /** The text is returned in the form of an IURI (cf.
+ draft-masinter-url-i18n-05.txt).
+
+ @descr
+ All escape sequences representing ASCII characters (%00--%7F) are
+ kept, all other escape sequences are interpreted as UTF-8 characters
+ and translated to Unicode, if possible.
+ */
+ rtl_UriDecodeToIuri,
+
+ /** The text is decoded.
+
+ @descr
+ All escape sequences representing characters from the given charset
+ are decoded and translated to Unicode, if possible.
+ */
+ rtl_UriDecodeWithCharset,
+
+ /** Like rtl_UriDecodeWithCharset, but indicating failure when converting
+ unmappable characters.
+
+ @since UDK 3.2.0
+ */
+ rtl_UriDecodeStrict,
+
+ rtl_UriDecode_FORCE_EQUAL_SIZE = SAL_MAX_ENUM
+}
+rtl_UriDecodeMechanism;
+
+/** Map a predefined rtl_UriCharClass to a form usable by rtl_uriEncode().
+
+ @descr
+ The function rtl_uriEncode() expects an array of 128 booleans, and this
+ function maps rtl_UriCharClass enumeration members to such arrays.
+
+ @param eCharClass
+ Any valid member of rtl_UriCharClass.
+
+ @return
+ An array of 128 booleans, to be used in calls to rtl_uriEncode().
+ */
+sal_Bool const * SAL_CALL rtl_getUriCharClass(rtl_UriCharClass eCharClass)
+ SAL_THROW_EXTERN_C();
+
+/** Encode a text as (part of) a URI.
+
+ @param pText
+ Any Unicode string. Must not be null.
+
+ @param pCharClass
+ A char class, represented as an array of 128 booleans (true means keep the
+ corresponding ASCII character unencoded, false means encode it). Must not
+ be null, and the boolean corresponding to the percent sign (0x25) must be
+ false. (See rtl_getUriCharClass() for a function mapping from
+ rtl_UriCharClass to such arrays.)
+
+ @param eMechanism
+ The mechanism describing how escape sequences in the input text are
+ handled.
+
+ @param eCharset
+ When Unicode characters from the input text have to be written using
+ escape sequences (because they are either outside the ASCII range or do
+ not belong to the given char class), they are first translated into this
+ charset before being encoded using escape sequences.
+
+ Also, if the encode mechanism is rtl_UriEncodeCheckEscapes, all escape
+ sequences already present in the input text are interpreted as characters
+ from this charset.
+
+ @param pResult
+ Returns an encoded representation of the input text. Must itself not be
+ null, and must point to either null or a valid string.
+
+ If the encode mechanism is rtl_UriEncodeStrict, and pText cannot be
+ converted to eCharset because it contains unmappable characters (which
+ implies that pText is not empty), then an empty string is returned.
+ */
+void SAL_CALL rtl_uriEncode(rtl_uString * pText,
+ sal_Bool const * pCharClass,
+ rtl_UriEncodeMechanism eMechanism,
+ rtl_TextEncoding eCharset,
+ rtl_uString ** pResult)
+ SAL_THROW_EXTERN_C();
+
+/** Decode (a part of) a URI.
+
+ @param pText
+ Any Unicode string. Must not be null. (If the input is indeed part of a
+ valid URI, this string will only contain a subset of the ASCII characters,
+ but this function also handles other Unicode characters properly.)
+
+ @param eMechanism
+ The mechanism describing how the input text is translated into a Unicode
+ string.
+
+ @param eCharset
+ When the decode mechanism is rtl_UriDecodeWithCharset, all escape
+ sequences in the input text are interpreted as characters from this
+ charset. Those characters are translated to Unicode characters in the
+ resulting output, if possible.
+
+ When the decode mechanism is rtl_UriDecodeNone or rtl_UriDecodeToIuri,
+ this parameter is ignored (and is best specified as
+ RTL_TEXTENCODING_UTF8).
+
+ @param pResult
+ Returns a decoded representation of the input text. Must itself not be
+ null, and must point to either null or a valid string.
+
+ If the decode mechanism is rtl_UriDecodeStrict, and pText cannot be
+ converted to eCharset because it contains (encodings of) unmappable
+ characters (which implies that pText is not empty), then an empty string is
+ returned.
+ */
+void SAL_CALL rtl_uriDecode(rtl_uString * pText,
+ rtl_UriDecodeMechanism eMechanism,
+ rtl_TextEncoding eCharset,
+ rtl_uString ** pResult)
+ SAL_THROW_EXTERN_C();
+
+/** Convert a relative URI reference into an absolute one.
+
+ A URI reference is a URI plus an optional <"#" fragment> part.
+
+ This function uses the algorithm described in RFC 2396, section 5.2, with
+ the following clarifications: (1) Backwards-compatible relative URIs
+ starting with a scheme component (see RFC 2396, section 5.2, step 3) are not
+ supported. (2) Segments "." and ".." within the path of the base URI are
+ not considered special, RFC 2396 seems a bit unlcear about that point.
+ (3) Erroneous excess segments ".." within the path of the relative URI (if
+ it is indeed relative) are left intact, as the examples in RFC 2396,
+ section C.2, suggest. (4) If the relative URI is a reference to the
+ "current document," the "current document" is taken to be the base URI.
+
+ This function signals exceptions by returning false and letting pException
+ point to a message explaining the exception.
+
+ @param pBaseUriRef
+ An absolute, hierarchical URI reference that serves as the base URI. If it
+ has to be inspected (i.e., pRelUriRef is not an absolute URI already), and
+ if it either is not an absolute URI (i.e., does not begin with a
+ <scheme ":"> part) or has a path that is non-empty but does not start
+ with "/", an exception will be signaled.
+
+ @param pRelUriRef
+ An URI reference that may be either absolute or relative. If it is
+ absolute, it will be returned unmodified (and it need not be hierarchical
+ then).
+
+ @param pResult
+ Returns an absolute URI reference. Must itself not be null, and must point
+ to either null or a valid string. If an exception is signalled, it is left
+ unchanged.
+
+ @param pException
+ Returns an explanatory message in case an exception is signalled. Must
+ itself not be null, and must point to either null or a valid string. If no
+ exception is signalled, it is left unchanged.
+
+ @return
+ True if no exception is signalled, otherwise false.
+ */
+sal_Bool SAL_CALL rtl_uriConvertRelToAbs(rtl_uString * pBaseUriRef,
+ rtl_uString * pRelUriRef,
+ rtl_uString ** pResult,
+ rtl_uString ** pException)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTL_URI_H_ */
diff --git a/sal/inc/rtl/uri.hxx b/sal/inc/rtl/uri.hxx
new file mode 100644
index 000000000000..9dfe1d5ec80e
--- /dev/null
+++ b/sal/inc/rtl/uri.hxx
@@ -0,0 +1,154 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_URI_HXX_
+#define _RTL_URI_HXX_
+
+#include "rtl/malformeduriexception.hxx"
+#include "rtl/uri.h"
+#include "rtl/textenc.h"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+
+namespace rtl {
+
+/** A wrapper around the C functions from <rtl/uri.h>.
+ */
+class Uri
+{
+public:
+ /** A wrapper around rtl_uriEncode() from <rtl/uri.h> (see there), using
+ an array of 128 booleans as char class.
+ */
+ static inline rtl::OUString encode(rtl::OUString const & rText,
+ sal_Bool const * pCharClass,
+ rtl_UriEncodeMechanism eMechanism,
+ rtl_TextEncoding eCharset)
+ SAL_THROW(());
+
+ /** A wrapper around rtl_uriEncode() from <rtl/uri.h> (see there), using
+ a predefined rtl_UriCharClass enumeration member.
+ */
+ static inline rtl::OUString encode(rtl::OUString const & rText,
+ rtl_UriCharClass eCharClass,
+ rtl_UriEncodeMechanism eMechanism,
+ rtl_TextEncoding eCharset)
+ SAL_THROW(());
+
+ /** A wrapper around rtl_uriDecode() from <rtl/uri.h> (see there).
+ */
+ static inline rtl::OUString decode(rtl::OUString const & rText,
+ rtl_UriDecodeMechanism eMechanism,
+ rtl_TextEncoding eCharset)
+ SAL_THROW(());
+
+ /** A wrapper around rtl_uriConvertRelToAbs() from <rtl/uri.h> (see there).
+
+ @exception MalformedUriException
+ Thrown in case rtl_uriConvertRelToAbs() signals an exception due to a
+ malformed base URI.
+ */
+ static inline rtl::OUString convertRelToAbs(
+ rtl::OUString const & rBaseUriRef, rtl::OUString const & rRelUriRef);
+
+private:
+ /** not implemented
+ @internal */
+ Uri();
+
+ /** not implemented
+ @internal */
+ Uri(Uri &);
+
+ /** not implemented
+ @internal */
+ ~Uri();
+
+ /** not implemented
+ @internal */
+ void operator =(Uri);
+};
+
+inline rtl::OUString Uri::encode(rtl::OUString const & rText,
+ sal_Bool const * pCharClass,
+ rtl_UriEncodeMechanism eMechanism,
+ rtl_TextEncoding eCharset)
+ SAL_THROW(())
+{
+ rtl::OUString aResult;
+ rtl_uriEncode(const_cast< rtl::OUString & >(rText).pData,
+ pCharClass,
+ eMechanism,
+ eCharset,
+ &aResult.pData);
+ return aResult;
+}
+
+inline rtl::OUString Uri::encode(rtl::OUString const & rText,
+ rtl_UriCharClass eCharClass,
+ rtl_UriEncodeMechanism eMechanism,
+ rtl_TextEncoding eCharset)
+ SAL_THROW(())
+{
+ rtl::OUString aResult;
+ rtl_uriEncode(const_cast< rtl::OUString & >(rText).pData,
+ rtl_getUriCharClass(eCharClass),
+ eMechanism,
+ eCharset,
+ &aResult.pData);
+ return aResult;
+}
+
+inline rtl::OUString Uri::decode(rtl::OUString const & rText,
+ rtl_UriDecodeMechanism eMechanism,
+ rtl_TextEncoding eCharset)
+ SAL_THROW(())
+{
+ rtl::OUString aResult;
+ rtl_uriDecode(const_cast< rtl::OUString & >(rText).pData,
+ eMechanism,
+ eCharset,
+ &aResult.pData);
+ return aResult;
+}
+
+inline rtl::OUString Uri::convertRelToAbs(rtl::OUString const & rBaseUriRef,
+ rtl::OUString const & rRelUriRef)
+{
+ rtl::OUString aResult;
+ rtl::OUString aException;
+ if (!rtl_uriConvertRelToAbs(
+ const_cast< rtl::OUString & >(rBaseUriRef).pData,
+ const_cast< rtl::OUString & >(rRelUriRef).pData, &aResult.pData,
+ &aException.pData))
+ throw MalformedUriException(aException);
+ return aResult;
+}
+
+}
+
+#endif // _RTL_URI_HXX_
diff --git a/sal/inc/rtl/ustrbuf.h b/sal/inc/rtl/ustrbuf.h
new file mode 100644
index 000000000000..632040818f21
--- /dev/null
+++ b/sal/inc/rtl/ustrbuf.h
@@ -0,0 +1,165 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_USTRBUF_H_
+#define _RTL_USTRBUF_H_
+
+#include <rtl/ustring.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @HTML
+ Allocates a new <code>String</code> that contains characters from
+ the character array argument.
+
+ The <code>count</code> argument specifies
+ the length of the array. The initial capacity of the string buffer is
+ <code>16</code> plus the length of the string argument.
+
+ @param newStr out parameter, contains the new string. The reference count is 1.
+ @param value the initial value of the string.
+ @param count the length of value.
+ */
+void SAL_CALL rtl_uStringbuffer_newFromStr_WithLength( rtl_uString ** newStr,
+ const sal_Unicode * value,
+ sal_Int32 count );
+
+/**
+ Allocates a new <code>String</code> that contains the same sequence of
+ characters as the string argument.
+
+ The initial capacity is the larger of:
+ <ul>
+ <li> The <code>bufferLen</code> argument.
+ <li> The <code>length</code> of the string argument.
+ </ul>
+
+ @param newStr out parameter, contains the new string. The reference count is 1.
+ @param capacity the initial len of the string buffer.
+ @param oldStr the initial value of the string.
+ @return the new capacity of the string buffer
+ */
+sal_Int32 SAL_CALL rtl_uStringbuffer_newFromStringBuffer( rtl_uString ** newStr,
+ sal_Int32 capacity,
+ rtl_uString * olsStr );
+
+/**
+ Ensures that the capacity of the buffer is at least equal to the
+ specified minimum.
+
+ If the current capacity of this string buffer is less than the
+ argument, then a new internal buffer is allocated with greater
+ capacity. The new capacity is the larger of:
+ <ul>
+ <li>The <code>minimumCapacity</code> argument.
+ <li>Twice the old capacity, plus <code>2</code>.
+ </ul>
+ If the <code>minimumCapacity</code> argument is nonpositive, this
+ method takes no action and simply returns.
+
+ @param capacity in: old capicity, out: new capacity.
+ @param minimumCapacity the minimum desired capacity.
+ */
+void SAL_CALL rtl_uStringbuffer_ensureCapacity( /*inout*/rtl_uString ** This,
+ /*inout*/sal_Int32* capacity,
+ sal_Int32 minimumCapacity);
+
+/**
+ Inserts the string representation of the <code>str</code> array
+ argument into this string buffer.
+
+ The characters of the array argument are inserted into the
+ contents of this string buffer at the position indicated by
+ <code>offset</code>. The length of this string buffer increases by
+ the length of the argument.
+
+ @param This The string, on that the operation should take place
+ @param capacity the capacity of the string buffer
+ @param offset the offset.
+ @param str a character array.
+ @param len the number of characters to append.
+ */
+void SAL_CALL rtl_uStringbuffer_insert( /*inout*/rtl_uString ** This,
+ /*inout*/sal_Int32 * capacity,
+ sal_Int32 offset,
+ const sal_Unicode * str,
+ sal_Int32 len);
+
+/**
+ Inserts a single UTF-32 character into this string buffer.
+
+ <p>The single UTF-32 character will be represented within the string buffer
+ as either one or two UTF-16 code units.</p>
+
+ @param pThis the string buffer on which the operation is performed
+
+ @param capacity the capacity of the string buffer
+
+ @param offset the offset into this string buffer (from zero to the length
+ of this string buffer, inclusive)
+
+ @param c a well-formed UTF-32 code unit (that is, a value in the range
+ <code>0</code>&ndash;<code>0x10FFFF</code>, but excluding
+ <code>0xD800</code>&ndash;<code>0xDFFF</code>)
+ */
+void SAL_CALL rtl_uStringbuffer_insertUtf32(
+ rtl_uString ** pThis, sal_Int32 * capacity, sal_Int32 offset, sal_uInt32 c)
+ SAL_THROW_EXTERN_C();
+
+/**
+ Inserts the 8-Bit ASCII string representation of the <code>str</code>
+ array argument into this string buffer.
+
+ Since this function is optimized
+ for performance, the ASCII character values are not converted in any way.
+ The caller has to make sure that all ASCII characters are in the allowed
+ range between 0 and 127.
+ <p>
+ The characters of the array argument are inserted into the
+ contents of this string buffer at the position indicated by
+ <code>offset</code>. The length of this string buffer increases by
+ the length of the argument.
+
+ @param This The string, on that the operation should take place
+ @param capacity the capacity of the string buffer
+ @param offset the offset.
+ @param str a character array.
+ @param len the number of characters to append.
+ */
+void SAL_CALL rtl_uStringbuffer_insert_ascii( /*inout*/rtl_uString ** This,
+ /*inout*/sal_Int32 * capacity,
+ sal_Int32 offset,
+ const sal_Char * str,
+ sal_Int32 len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_USTRBUF_H_ */
diff --git a/sal/inc/rtl/ustrbuf.hxx b/sal/inc/rtl/ustrbuf.hxx
new file mode 100644
index 000000000000..3f8421b1f3c7
--- /dev/null
+++ b/sal/inc/rtl/ustrbuf.hxx
@@ -0,0 +1,774 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_USTRBUF_HXX_
+#define _RTL_USTRBUF_HXX_
+
+#include <osl/diagnose.h>
+#include <rtl/ustrbuf.h>
+#ifndef _RTL_USTRING_HXX
+#include <rtl/ustring.hxx>
+#endif
+
+#ifdef __cplusplus
+
+namespace rtl
+{
+
+/** @HTML
+ A string buffer implements a mutable sequence of characters.
+ <p>
+ String buffers are safe for use by multiple threads. The methods
+ are synchronized where necessary so that all the operations on any
+ particular instance behave as if they occur in some serial order.
+ <p>
+ String buffers are used by the compiler to implement the binary
+ string concatenation operator <code>+</code>. For example, the code:
+ <p><blockquote><pre>
+ x = "a" + 4 + "c"
+ </pre></blockquote><p>
+ is compiled to the equivalent of:
+ <p><blockquote><pre>
+ x = new OUStringBuffer().append("a").append(4).append("c")
+ .toString()
+ </pre></blockquote><p>
+ The principal operations on a <code>OUStringBuffer</code> are the
+ <code>append</code> and <code>insert</code> methods, which are
+ overloaded so as to accept data of any type. Each effectively
+ converts a given datum to a string and then appends or inserts the
+ characters of that string to the string buffer. The
+ <code>append</code> method always adds these characters at the end
+ of the buffer; the <code>insert</code> method adds the characters at
+ a specified point.
+ <p>
+ For example, if <code>z</code> refers to a string buffer object
+ whose current contents are "<code>start</code>", then
+ the method call <code>z.append("le")</code> would cause the string
+ buffer to contain "<code>startle</code>", whereas
+ <code>z.insert(4, "le")</code> would alter the string buffer to
+ contain "<code>starlet</code>".
+ <p>
+ Every string buffer has a capacity. As long as the length of the
+ character sequence contained in the string buffer does not exceed
+ the capacity, it is not necessary to allocate a new internal
+ buffer array. If the internal buffer overflows, it is
+ automatically made larger.
+ */
+class OUStringBuffer
+{
+public:
+ /**
+ Constructs a string buffer with no characters in it and an
+ initial capacity of 16 characters.
+ */
+ OUStringBuffer()
+ : pData(NULL)
+ , nCapacity( 16 )
+ {
+ rtl_uString_new_WithLength( &pData, nCapacity );
+ }
+
+ /**
+ Allocates a new string buffer that contains the same sequence of
+ characters as the string buffer argument.
+
+ @param value a <code>OStringBuffer</code>.
+ */
+ OUStringBuffer( const OUStringBuffer & value )
+ : pData(NULL)
+ , nCapacity( value.nCapacity )
+ {
+ rtl_uStringbuffer_newFromStringBuffer( &pData, value.nCapacity, value.pData );
+ }
+
+ /**
+ Constructs a string buffer with no characters in it and an
+ initial capacity specified by the <code>length</code> argument.
+
+ @param length the initial capacity.
+ */
+ OUStringBuffer(sal_Int32 length)
+ : pData(NULL)
+ , nCapacity( length )
+ {
+ rtl_uString_new_WithLength( &pData, length );
+ }
+
+ /**
+ Constructs a string buffer so that it represents the same
+ sequence of characters as the string argument.
+
+ The initial
+ capacity of the string buffer is <code>16</code> plus the length
+ of the string argument.
+
+ @param str the initial contents of the buffer.
+ */
+ OUStringBuffer(OUString value)
+ : pData(NULL)
+ , nCapacity( value.getLength() + 16 )
+ {
+ rtl_uStringbuffer_newFromStr_WithLength( &pData, value.getStr(), value.getLength() );
+ }
+
+ /** Assign to this a copy of value.
+ */
+ OUStringBuffer& operator = ( const OUStringBuffer& value )
+ {
+ if (this != &value)
+ {
+ rtl_uStringbuffer_newFromStringBuffer(&pData,
+ value.nCapacity,
+ value.pData);
+ nCapacity = value.nCapacity;
+ }
+ return *this;
+ }
+
+ /**
+ Release the string data.
+ */
+ ~OUStringBuffer()
+ {
+ rtl_uString_release( pData );
+ }
+
+ /**
+ Fill the string data in the new string and clear the buffer.
+
+ This method is more efficient than the contructor of the string. It does
+ not copy the buffer.
+
+ @return the string previously contained in the buffer.
+ */
+ OUString makeStringAndClear()
+ {
+ OUString aRet( pData );
+ rtl_uString_new(&pData);
+ nCapacity = 0;
+ return aRet;
+ }
+
+ /**
+ Returns the length (character count) of this string buffer.
+
+ @return the number of characters in this string buffer.
+ */
+ sal_Int32 getLength() const
+ {
+ return pData->length;
+ }
+
+ /**
+ Returns the current capacity of the String buffer.
+
+ The capacity
+ is the amount of storage available for newly inserted
+ characters. The real buffer size is 2 bytes longer, because
+ all strings are 0 terminated.
+
+ @return the current capacity of this string buffer.
+ */
+ sal_Int32 getCapacity() const
+ {
+ return nCapacity;
+ }
+
+ /**
+ Ensures that the capacity of the buffer is at least equal to the
+ specified minimum.
+
+ The new capacity will be at least as large as the maximum of the current
+ length (so that no contents of the buffer is destroyed) and the given
+ minimumCapacity. If the given minimumCapacity is negative, nothing is
+ changed.
+
+ @param minimumCapacity the minimum desired capacity.
+ */
+ void ensureCapacity(sal_Int32 minimumCapacity)
+ {
+ rtl_uStringbuffer_ensureCapacity( &pData, &nCapacity, minimumCapacity );
+ }
+
+ /**
+ Sets the length of this String buffer.
+
+ If the <code>newLength</code> argument is less than the current
+ length of the string buffer, the string buffer is truncated to
+ contain exactly the number of characters given by the
+ <code>newLength</code> argument.
+ <p>
+ If the <code>newLength</code> argument is greater than or equal
+ to the current length, sufficient null characters
+ (<code>'&#92;u0000'</code>) are appended to the string buffer so that
+ length becomes the <code>newLength</code> argument.
+ <p>
+ The <code>newLength</code> argument must be greater than or equal
+ to <code>0</code>.
+
+ @param newLength the new length of the buffer.
+ */
+ void setLength(sal_Int32 newLength)
+ {
+ OSL_ASSERT(newLength >= 0);
+ // Avoid modifications if pData points to const empty string:
+ if( newLength != pData->length )
+ {
+ if( newLength > nCapacity )
+ rtl_uStringbuffer_ensureCapacity(&pData, &nCapacity, newLength);
+ else
+ pData->buffer[newLength] = 0;
+ pData->length = newLength;
+ }
+ }
+
+ /**
+ Returns the character at a specific index in this string buffer.
+
+ The first character of a string buffer is at index
+ <code>0</code>, the next at index <code>1</code>, and so on, for
+ array indexing.
+ <p>
+ The index argument must be greater than or equal to
+ <code>0</code>, and less than the length of this string buffer.
+
+ @param index the index of the desired character.
+ @return the character at the specified index of this string buffer.
+ */
+ sal_Unicode charAt( sal_Int32 index ) const
+ {
+ OSL_ASSERT(index >= 0 && index < pData->length);
+ return pData->buffer[ index ];
+ }
+
+ /**
+ Return a null terminated unicode character array.
+ */
+ operator const sal_Unicode *() const { return pData->buffer; }
+
+ /**
+ Return a null terminated unicode character array.
+ */
+ const sal_Unicode* getStr() const { return pData->buffer; }
+
+
+ /**
+ The character at the specified index of this string buffer is set
+ to <code>ch</code>.
+
+ The index argument must be greater than or equal to
+ <code>0</code>, and less than the length of this string buffer.
+
+ @param index the index of the character to modify.
+ @param ch the new character.
+ */
+ OUStringBuffer & setCharAt(sal_Int32 index, sal_Unicode ch)
+ {
+ OSL_ASSERT(index >= 0 && index < pData->length);
+ pData->buffer[ index ] = ch;
+ return *this;
+ }
+
+ /**
+ Appends the string to this string buffer.
+
+ The characters of the <code>String</code> argument are appended, in
+ order, to the contents of this string buffer, increasing the
+ length of this string buffer by the length of the argument.
+
+ @param str a string.
+ @return this string buffer.
+ */
+ OUStringBuffer & append(const OUString &str)
+ {
+ return append( str.getStr(), str.getLength() );
+ }
+
+ /**
+ Appends the string representation of the <code>char</code> array
+ argument to this string buffer.
+
+ The characters of the array argument are appended, in order, to
+ the contents of this string buffer. The length of this string
+ buffer increases by the length of the argument.
+
+ @param str the characters to be appended.
+ @return this string buffer.
+ */
+ OUStringBuffer & append( const sal_Unicode * str )
+ {
+ return append( str, rtl_ustr_getLength( str ) );
+ }
+
+ /**
+ Appends the string representation of the <code>char</code> array
+ argument to this string buffer.
+
+ Characters of the character array <code>str</code> are appended,
+ in order, to the contents of this string buffer. The length of this
+ string buffer increases by the value of <code>len</code>.
+
+ @param str the characters to be appended; must be non-null, and must
+ point to at least len characters
+ @param len the number of characters to append; must be non-negative
+ @return this string buffer.
+ */
+ OUStringBuffer & append( const sal_Unicode * str, sal_Int32 len)
+ {
+ // insert behind the last character
+ rtl_uStringbuffer_insert( &pData, &nCapacity, getLength(), str, len );
+ return *this;
+ }
+
+ /**
+ Appends a 8-Bit ASCII character string to this string buffer.
+
+ Since this method is optimized for performance. the ASCII
+ character values are not converted in any way. The caller
+ has to make sure that all ASCII characters are in the
+ allowed range between 0 and 127. The ASCII string must be
+ NULL-terminated.
+ <p>
+ The characters of the array argument are appended, in order, to
+ the contents of this string buffer. The length of this string
+ buffer increases by the length of the argument.
+
+ @param str the 8-Bit ASCII characters to be appended.
+ @return this string buffer.
+ */
+ OUStringBuffer & appendAscii( const sal_Char * str )
+ {
+ return appendAscii( str, rtl_str_getLength( str ) );
+ }
+
+ /**
+ Appends a 8-Bit ASCII character string to this string buffer.
+
+ Since this method is optimized for performance. the ASCII
+ character values are not converted in any way. The caller
+ has to make sure that all ASCII characters are in the
+ allowed range between 0 and 127. The ASCII string must be
+ NULL-terminated.
+ <p>
+ Characters of the character array <code>str</code> are appended,
+ in order, to the contents of this string buffer. The length of this
+ string buffer increases by the value of <code>len</code>.
+
+ @param str the 8-Bit ASCII characters to be appended; must be non-null,
+ and must point to at least len characters
+ @param len the number of characters to append; must be non-negative
+ @return this string buffer.
+ */
+ OUStringBuffer & appendAscii( const sal_Char * str, sal_Int32 len)
+ {
+ rtl_uStringbuffer_insert_ascii( &pData, &nCapacity, getLength(), str, len );
+ return *this;
+ }
+
+
+ /**
+ Appends the string representation of the <code>sal_Bool</code>
+ argument to the string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param b a <code>sal_Bool</code>.
+ @return this string buffer.
+ */
+ OUStringBuffer & append(sal_Bool b)
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFBOOLEAN];
+ return append( sz, rtl_ustr_valueOfBoolean( sz, b ) );
+ }
+
+ /**
+ Appends the string representation of the <code>char</code>
+ argument to this string buffer.
+
+ The argument is appended to the contents of this string buffer.
+ The length of this string buffer increases by <code>1</code>.
+
+ @param ch a <code>char</code>.
+ @return this string buffer.
+ */
+ OUStringBuffer & append(sal_Unicode c)
+ {
+ return append( &c, 1 );
+ }
+
+ /**
+ Appends the string representation of the <code>sal_Int32</code>
+ argument to this string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param i an <code>sal_Int32</code>.
+ @return this string buffer.
+ */
+ OUStringBuffer & append(sal_Int32 i, sal_Int16 radix = 10 )
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFINT32];
+ return append( sz, rtl_ustr_valueOfInt32( sz, i, radix ) );
+ }
+
+ /**
+ Appends the string representation of the <code>long</code>
+ argument to this string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param l a <code>long</code>.
+ @return this string buffer.
+ */
+ OUStringBuffer & append(sal_Int64 l, sal_Int16 radix = 10 )
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFINT64];
+ return append( sz, rtl_ustr_valueOfInt64( sz, l, radix ) );
+ }
+
+ /**
+ Appends the string representation of the <code>float</code>
+ argument to this string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param f a <code>float</code>.
+ @return this string buffer.
+ */
+ OUStringBuffer & append(float f)
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFFLOAT];
+ return append( sz, rtl_ustr_valueOfFloat( sz, f ) );
+ }
+
+ /**
+ Appends the string representation of the <code>double</code>
+ argument to this string buffer.
+
+ The argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then appended to this string buffer.
+
+ @param d a <code>double</code>.
+ @return this string buffer.
+ */
+ OUStringBuffer & append(double d)
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFDOUBLE];
+ return append( sz, rtl_ustr_valueOfDouble( sz, d ) );
+ }
+
+ /**
+ Appends a single UTF-32 character to this string buffer.
+
+ <p>The single UTF-32 character will be represented within the string
+ buffer as either one or two UTF-16 code units.</p>
+
+ @param c a well-formed UTF-32 code unit (that is, a value in the range
+ <code>0</code>&ndash;<code>0x10FFFF</code>, but excluding
+ <code>0xD800</code>&ndash;<code>0xDFFF</code>)
+
+ @return
+ this string buffer
+ */
+ OUStringBuffer & appendUtf32(sal_uInt32 c) {
+ return insertUtf32(getLength(), c);
+ }
+
+ /**
+ Inserts the string into this string buffer.
+
+ The characters of the <code>String</code> argument are inserted, in
+ order, into this string buffer at the indicated offset. The length
+ of this string buffer is increased by the length of the argument.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param str a string.
+ @return this string buffer.
+ */
+ OUStringBuffer & insert(sal_Int32 offset, const OUString & str)
+ {
+ return insert( offset, str.getStr(), str.getLength() );
+ }
+
+ /**
+ Inserts the string representation of the <code>char</code> array
+ argument into this string buffer.
+
+ The characters of the array argument are inserted into the
+ contents of this string buffer at the position indicated by
+ <code>offset</code>. The length of this string buffer increases by
+ the length of the argument.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param ch a character array.
+ @return this string buffer.
+ */
+ OUStringBuffer & insert( sal_Int32 offset, const sal_Unicode * str )
+ {
+ return insert( offset, str, rtl_ustr_getLength( str ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>char</code> array
+ argument into this string buffer.
+
+ The characters of the array argument are inserted into the
+ contents of this string buffer at the position indicated by
+ <code>offset</code>. The length of this string buffer increases by
+ the length of the argument.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param ch a character array.
+ @param len the number of characters to append.
+ @return this string buffer.
+ */
+ OUStringBuffer & insert( sal_Int32 offset, const sal_Unicode * str, sal_Int32 len)
+ {
+ // insert behind the last character
+ rtl_uStringbuffer_insert( &pData, &nCapacity, offset, str, len );
+ return *this;
+ }
+
+ /**
+ Inserts the string representation of the <code>sal_Bool</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b a <code>sal_Bool</code>.
+ @return this string buffer.
+ */
+ OUStringBuffer & insert(sal_Int32 offset, sal_Bool b)
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFBOOLEAN];
+ return insert( offset, sz, rtl_ustr_valueOfBoolean( sz, b ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>char</code>
+ argument into this string buffer.
+
+ The second argument is inserted into the contents of this string
+ buffer at the position indicated by <code>offset</code>. The length
+ of this string buffer increases by one.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param ch a <code>char</code>.
+ @return this string buffer.
+ */
+ OUStringBuffer & insert(sal_Int32 offset, sal_Unicode c)
+ {
+ return insert( offset, &c, 1 );
+ }
+
+ /**
+ Inserts the string representation of the second <code>sal_Int32</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b an <code>sal_Int32</code>.
+ @return this string buffer.
+ @exception StringIndexOutOfBoundsException if the offset is invalid.
+ */
+ OUStringBuffer & insert(sal_Int32 offset, sal_Int32 i, sal_Int16 radix = 10 )
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFINT32];
+ return insert( offset, sz, rtl_ustr_valueOfInt32( sz, i, radix ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>long</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b a <code>long</code>.
+ @return this string buffer.
+ @exception StringIndexOutOfBoundsException if the offset is invalid.
+ */
+ OUStringBuffer & insert(sal_Int32 offset, sal_Int64 l, sal_Int16 radix = 10 )
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFINT64];
+ return insert( offset, sz, rtl_ustr_valueOfInt64( sz, l, radix ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>float</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b a <code>float</code>.
+ @return this string buffer.
+ @exception StringIndexOutOfBoundsException if the offset is invalid.
+ */
+ OUStringBuffer insert(sal_Int32 offset, float f)
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFFLOAT];
+ return insert( offset, sz, rtl_ustr_valueOfFloat( sz, f ) );
+ }
+
+ /**
+ Inserts the string representation of the <code>double</code>
+ argument into this string buffer.
+
+ The second argument is converted to a string as if by the method
+ <code>String.valueOf</code>, and the characters of that
+ string are then inserted into this string buffer at the indicated
+ offset.
+ <p>
+ The offset argument must be greater than or equal to
+ <code>0</code>, and less than or equal to the length of this
+ string buffer.
+
+ @param offset the offset.
+ @param b a <code>double</code>.
+ @return this string buffer.
+ @exception StringIndexOutOfBoundsException if the offset is invalid.
+ */
+ OUStringBuffer & insert(sal_Int32 offset, double d)
+ {
+ sal_Unicode sz[RTL_USTR_MAX_VALUEOFDOUBLE];
+ return insert( offset, sz, rtl_ustr_valueOfDouble( sz, d ) );
+ }
+
+ /**
+ Inserts a single UTF-32 character into this string buffer.
+
+ <p>The single UTF-32 character will be represented within the string
+ buffer as either one or two UTF-16 code units.</p>
+
+ @param offset the offset into this string buffer (from zero to the length
+ of this string buffer, inclusive)
+
+ @param c a well-formed UTF-32 code unit (that is, a value in the range
+ <code>0</code>&ndash;<code>0x10FFFF</code>, but excluding
+ <code>0xD800</code>&ndash;<code>0xDFFF</code>)
+
+ @return this string buffer
+ */
+ OUStringBuffer & insertUtf32(sal_Int32 offset, sal_uInt32 c) {
+ rtl_uStringbuffer_insertUtf32(&pData, &nCapacity, offset, c);
+ return *this;
+ }
+
+ /** Allows access to the internal data of this OUStringBuffer, for effective
+ manipulation.
+
+ This method should be used with care. After you have called this
+ method, you may use the returned pInternalData or pInternalCapacity only
+ as long as you make no other method call on this OUStringBuffer.
+
+ @param pInternalData
+ This output parameter receives a pointer to the internal data
+ (rtl_uString pointer). pInternalData itself must not be null.
+
+ @param pInternalCapacity
+ This output parameter receives a pointer to the internal capacity.
+ pInternalCapacity itself must not be null.
+ */
+ inline void accessInternals(rtl_uString *** pInternalData,
+ sal_Int32 ** pInternalCapacity)
+ {
+ *pInternalData = &pData;
+ *pInternalCapacity = &nCapacity;
+ }
+
+private:
+ /**
+ A pointer to the data structur which contains the data.
+ */
+ rtl_uString * pData;
+
+ /**
+ The len of the pData->buffer.
+ */
+ sal_Int32 nCapacity;
+};
+
+}
+
+#endif /* __cplusplus */
+#endif /* _RTL_USTRBUF_HXX_ */
diff --git a/sal/inc/rtl/ustring.h b/sal/inc/rtl/ustring.h
new file mode 100644
index 000000000000..22e697e370e8
--- /dev/null
+++ b/sal/inc/rtl/ustring.h
@@ -0,0 +1,1660 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_USTRING_H_
+#define _RTL_USTRING_H_
+
+#include <sal/types.h>
+#include <osl/interlck.h>
+#include <rtl/string.h>
+#include <rtl/textenc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ======================================================================= */
+
+/** Return the length of a string.
+
+ The length is equal to the number of 16-bit Unicode characters in the
+ string, without the terminating NUL character.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ the length of the sequence of characters represented by this string,
+ excluding the terminating NUL character.
+ */
+sal_Int32 SAL_CALL rtl_ustr_getLength( const sal_Unicode * str ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting. Both strings must be
+ null-terminated.
+
+ @param first
+ the first null-terminated string to be compared.
+
+ @param second
+ the second null-terminated string which is compared with the first one.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_compare( const sal_Unicode * first, const sal_Unicode * second ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_compare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Unicode * second, sal_Int32 secondLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings with a maximum count of characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @param shortenedLen
+ the maximum number of characters to compare. This length can be greater
+ or smaller than the lengths of the two strings.
+
+ @return
+ 0 if both substrings are equal, a value less than 0 if the first substring
+ is less than the second substring, and a value greater than 0 if the first
+ substring is greater than the second substring.
+ */
+sal_Int32 SAL_CALL rtl_ustr_shortenedCompare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Unicode * second, sal_Int32 secondLen, sal_Int32 shortenedLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings from back to front.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string
+ compares less than the second string, and a value greater than 0 if the
+ first string compares greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_reverseCompare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Unicode * second, sal_Int32 secondLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings from back to front for equality.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns 'true' if, ans only if, both strings are equal.
+ This function cannot be used for language-specific sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified len.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified len.
+
+ @param len
+ the length of both strings.
+
+ @return
+ true if both strings are equal, false if they are not equal.
+ */
+
+sal_Bool SAL_CALL rtl_ustr_asciil_reverseEquals_WithLength( const sal_Unicode * first, const sal_Char * second, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings, ignoring the case of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting. Both strings must be null-terminated.
+
+ @param first
+ the first null-terminated string to be compared.
+
+ @param second
+ the second null-terminated string which is compared with the first one.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_compareIgnoreAsciiCase( const sal_Unicode * first, const sal_Unicode * second ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings, ignoring the case of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_compareIgnoreAsciiCase_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Unicode * second, sal_Int32 secondLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings with a maximum count of characters, ignoring the case
+ of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @param shortenedLen
+ the maximum number of characters to compare. This length can be greater
+ or smaller than the lengths of the two strings.
+
+ @return
+ 0 if both substrings are equal, a value less than 0 if the first substring
+ is less than the second substring, and a value greater than 0 if the first
+ substring is greater than the second substring.
+ */
+sal_Int32 SAL_CALL rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Unicode * second, sal_Int32 secondLen, sal_Int32 shortenedLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting. Both strings must be
+ null-terminated.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param first
+ the first null-terminated string to be compared.
+
+ @param second
+ the second null-terminated ASCII string which is compared with the first
+ one.
+
+ @return
+ 0 if both substrings are equal, a value less than 0 if the first substring
+ is less than the second substring, and a value greater than 0 if the first
+ substring is greater than the second substring.
+ */
+sal_Int32 SAL_CALL rtl_ustr_ascii_compare( const sal_Unicode * first, const sal_Char * second ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second null-terminated ASCII string which is compared with the first
+ one.
+
+ @return
+ 0 if both substrings are equal, a value less than 0 if the first substring
+ is less than the second substring, and a value greater than 0 if the first
+ substring is greater than the second substring.
+ */
+sal_Int32 SAL_CALL rtl_ustr_ascii_compare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Char * second ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings with a maximum count of characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second null-terminated ASCII string which is compared with the first
+ one.
+
+ @param shortenedLen
+ the maximum number of characters to compare. This length can be greater
+ or smaller than the lengths of the two strings.
+
+ @return
+ 0 if both substrings are equal, a value less than 0 if the first substring
+ is less than the second substring, and a value greater than 0 if the first
+ substring is greater than the second substring.
+ */
+sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 shortenedLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings from back to front.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. This function
+ cannot be used for language-specific sorting.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second ASCII string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string
+ compares less than the second string, and a value greater than 0 if the
+ first string compares greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_asciil_reverseCompare_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 secondLen ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings, ignoring the case of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting. Both strings must be null-terminated.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param first
+ the first null-terminated string to be compared.
+
+ @param second
+ the second null-terminated ASCII string which is compared with the first
+ one.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase( const sal_Unicode * first, const sal_Char * second ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings, ignoring the case of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second null-terminated ASCII string which is compared with the first
+ one.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Char * second ) SAL_THROW_EXTERN_C();
+
+/** Compare two strings, ignoring the case of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second string which is compared with the first one. Need not be
+ null-terminated, but must be at least as long as the specified secondLen.
+
+ @param secondLen
+ the length of the second string.
+
+ @return
+ 0 if both strings are equal, a value less than 0 if the first string is
+ less than the second string, and a value greater than 0 if the first
+ string is greater than the second string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
+ sal_Unicode const * first, sal_Int32 firstLen,
+ char const * second, sal_Int32 secondLen) SAL_THROW_EXTERN_C();
+
+/** Compare two strings with a maximum count of characters, ignoring the case
+ of ASCII characters.
+
+ The comparison is based on the numeric value of each character in the
+ strings and returns a value indicating their relationship. Character
+ values between 65 and 90 (ASCII A--Z) are interpreted as values between 97
+ and 122 (ASCII a--z). This function cannot be used for language-specific
+ sorting.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param first
+ the first string to be compared. Need not be null-terminated, but must be
+ at least as long as the specified firstLen.
+
+ @param firstLen
+ the length of the first string.
+
+ @param second
+ the second null-terminated ASCII string which is compared with the first
+ one.
+
+ @param shortenedLen
+ the maximum number of characters to compare. This length can be greater
+ or smaller than the lengths of the two strings.
+
+ @return
+ 0 if both substrings are equal, a value less than 0 if the first substring
+ is less than the second substring, and a value greater than 0 if the first
+ substring is greater than the second substring.
+ */
+sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( const sal_Unicode * first, sal_Int32 firstLen, const sal_Char * second, sal_Int32 shortenedLen ) SAL_THROW_EXTERN_C();
+
+/** Return a hash code for a string.
+
+ It is not allowed to store the hash code persistently, because later
+ versions could return other hash codes. The string must be
+ null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ a hash code for the given string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_hashCode( const sal_Unicode * str ) SAL_THROW_EXTERN_C();
+
+/** Return a hash code for a string.
+
+ It is not allowed to store the hash code persistently, because later
+ versions could return other hash codes.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @return
+ a hash code for the given string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_hashCode_WithLength( const sal_Unicode * str, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of a character within a string.
+
+ The string must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param ch
+ the character to be searched for.
+
+ @return
+ the index (starting at 0) of the first occurrence of the character in the
+ string, or -1 if the character does not occur.
+ */
+sal_Int32 SAL_CALL rtl_ustr_indexOfChar( const sal_Unicode * str, sal_Unicode ch ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of a character within a string.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param ch
+ the character to be searched for.
+
+ @return
+ the index (starting at 0) of the first occurrence of the character in the
+ string, or -1 if the character does not occur.
+ */
+sal_Int32 SAL_CALL rtl_ustr_indexOfChar_WithLength( const sal_Unicode * str, sal_Int32 len, sal_Unicode ch ) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of a character within a string.
+
+ The string must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param ch
+ the character to be searched for.
+
+ @return
+ the index (starting at 0) of the last occurrence of the character in the
+ string, or -1 if the character does not occur. The returned value is
+ always smaller than the string length.
+ */
+sal_Int32 SAL_CALL rtl_ustr_lastIndexOfChar( const sal_Unicode * str, sal_Unicode ch ) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of a character within a string.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param ch
+ the character to be searched for.
+
+ @return
+ the index (starting at 0) of the last occurrence of the character in the
+ string, or -1 if the character does not occur. The returned value is
+ always smaller than the string length.
+ */
+sal_Int32 SAL_CALL rtl_ustr_lastIndexOfChar_WithLength( const sal_Unicode * str, sal_Int32 len, sal_Unicode ch ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of a substring within a string.
+
+ If subStr is empty, or both str and subStr are empty, -1 is returned.
+ Both strings must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param subStr
+ the null-terminated substring to be searched for.
+
+ @return
+ the index (starting at 0) of the first character of the first occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ */
+sal_Int32 SAL_CALL rtl_ustr_indexOfStr( const sal_Unicode * str, const sal_Unicode * subStr ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of a substring within a string.
+
+ If subStr is empty, or both str and subStr are empty, -1 is returned.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param subStr
+ the substring to be searched for. Need not be null-terminated, but must
+ be at least as long as the specified subLen.
+
+ @param subLen
+ the length of the substring.
+
+ @return
+ the index (starting at 0) of the first character of the first occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ */
+sal_Int32 SAL_CALL rtl_ustr_indexOfStr_WithLength( const sal_Unicode * str, sal_Int32 len, const sal_Unicode * subStr, sal_Int32 subLen ) SAL_THROW_EXTERN_C();
+
+/** Search for the first occurrence of an ASCII substring within a string.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string; must be non-negative.
+
+ @param subStr
+ the substring to be searched for. Need not be null-terminated, but must
+ be at least as long as the specified subLen. Must only contain characters
+ in the ASCII range 0x00--7F.
+
+ @param subLen
+ the length of the substring; must be non-negative.
+
+ @return
+ the index (starting at 0) of the first character of the first occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ If subLen is zero, -1 is returned.
+
+ @since UDK 3.2.7
+*/
+sal_Int32 SAL_CALL rtl_ustr_indexOfAscii_WithLength(
+ sal_Unicode const * str, sal_Int32 len,
+ char const * subStr, sal_Int32 subLen) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of a substring within a string.
+
+ If subStr is empty, or both str and subStr are empty, -1 is returned.
+ Both strings must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param subStr
+ the null-terminated substring to be searched for.
+
+ @return
+ the index (starting at 0) of the first character of the last occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ */
+sal_Int32 SAL_CALL rtl_ustr_lastIndexOfStr( const sal_Unicode * str, const sal_Unicode * subStr ) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of a substring within a string.
+
+ If subStr is empty, or both str and subStr are empty, -1 is returned.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param subStr
+ the substring to be searched for. Need not be null-terminated, but must
+ be at least as long as the specified subLen.
+
+ @param subLen
+ the length of the substring.
+
+ @return
+ the index (starting at 0) of the first character of the first occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ */
+sal_Int32 SAL_CALL rtl_ustr_lastIndexOfStr_WithLength( const sal_Unicode * str, sal_Int32 len, const sal_Unicode * subStr, sal_Int32 subLen ) SAL_THROW_EXTERN_C();
+
+/** Search for the last occurrence of an ASCII substring within a string.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string; must be non-negative.
+
+ @param subStr
+ the substring to be searched for. Need not be null-terminated, but must
+ be at least as long as the specified subLen. Must only contain characters
+ in the ASCII range 0x00--7F.
+
+ @param subLen
+ the length of the substring; must be non-negative.
+
+ @return
+ the index (starting at 0) of the first character of the last occurrence
+ of the substring within the string, or -1 if the substring does not occur.
+ If subLen is zero, -1 is returned.
+
+ @since UDK 3.2.7
+*/
+sal_Int32 SAL_CALL rtl_ustr_lastIndexOfAscii_WithLength(
+ sal_Unicode const * str, sal_Int32 len,
+ char const * subStr, sal_Int32 subLen) SAL_THROW_EXTERN_C();
+
+/** Replace all occurrences of a single character within a string.
+
+ If oldChar does not occur within str, then the string is not modified.
+ The string must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param oldChar
+ the old character.
+
+ @param newChar
+ the new character.
+ */
+void SAL_CALL rtl_ustr_replaceChar( sal_Unicode * str, sal_Unicode oldChar, sal_Unicode newChar ) SAL_THROW_EXTERN_C();
+
+/** Replace all occurrences of a single character within a string.
+
+ If oldChar does not occur within str, then the string is not modified.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+
+ @param oldChar
+ the old character.
+
+ @param newChar
+ the new character.
+ */
+void SAL_CALL rtl_ustr_replaceChar_WithLength( sal_Unicode * str, sal_Int32 len, sal_Unicode oldChar, sal_Unicode newChar ) SAL_THROW_EXTERN_C();
+
+/** Convert all ASCII uppercase letters to lowercase within a string.
+
+ The characters with values between 65 and 90 (ASCII A--Z) are replaced
+ with values between 97 and 122 (ASCII a--z). The string must be
+ null-terminated.
+
+ @param str
+ a null-terminated string.
+ */
+void SAL_CALL rtl_ustr_toAsciiLowerCase( sal_Unicode * str ) SAL_THROW_EXTERN_C();
+
+/** Convert all ASCII uppercase letters to lowercase within a string.
+
+ The characters with values between 65 and 90 (ASCII A--Z) are replaced
+ with values between 97 and 122 (ASCII a--z).
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+ */
+void SAL_CALL rtl_ustr_toAsciiLowerCase_WithLength( sal_Unicode * str, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Convert all ASCII lowercase letters to uppercase within a string.
+
+ The characters with values between 97 and 122 (ASCII a--z) are replaced
+ with values between 65 and 90 (ASCII A--Z). The string must be
+ null-terminated.
+
+ @param str
+ a null-terminated string.
+ */
+void SAL_CALL rtl_ustr_toAsciiUpperCase( sal_Unicode * str ) SAL_THROW_EXTERN_C();
+
+/** Convert all ASCII lowercase letters to uppercase within a string.
+
+ The characters with values between 97 and 122 (ASCII a--z) are replaced
+ with values between 65 and 90 (ASCII A--Z).
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the length of the string.
+ */
+void SAL_CALL rtl_ustr_toAsciiUpperCase_WithLength( sal_Unicode * str, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Remove white space from both ends of a string.
+
+ All characters with values less than or equal to 32 (the space character)
+ are considered to be white space. This function cannot be used for
+ language-specific operations. The string must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ the new length of the string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_trim( sal_Unicode * str ) SAL_THROW_EXTERN_C();
+
+/** Remove white space from both ends of the string.
+
+ All characters with values less than or equal to 32 (the space character)
+ are considered to be white space. This function cannot be used for
+ language-specific operations. The string must be null-terminated.
+
+ @param str
+ a string. Need not be null-terminated, but must be at least as long as
+ the specified len.
+
+ @param len
+ the original length of the string.
+
+ @return
+ the new length of the string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_trim_WithLength( sal_Unicode * str, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Create the string representation of a boolean.
+
+ If b is true, the buffer is filled with the string "true" and 5 is
+ returned. If b is false, the buffer is filled with the string "false" and
+ 6 is returned. This function cannot be used for language-specific
+ operations.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_USTR_MAX_VALUEOFBOOLEAN define to
+ create a buffer that is big enough.
+
+ @param b
+ a boolean value.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_valueOfBoolean( sal_Unicode * str, sal_Bool b ) SAL_THROW_EXTERN_C();
+#define RTL_USTR_MAX_VALUEOFBOOLEAN RTL_STR_MAX_VALUEOFBOOLEAN
+
+/** Create the string representation of a character.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_USTR_MAX_VALUEOFCHAR define to create a
+ buffer that is big enough.
+
+ @param ch
+ a character value.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_valueOfChar( sal_Unicode * str, sal_Unicode ch ) SAL_THROW_EXTERN_C();
+#define RTL_USTR_MAX_VALUEOFCHAR RTL_STR_MAX_VALUEOFCHAR
+
+/** Create the string representation of an integer.
+
+ This function cannot be used for language-specific operations.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_USTR_MAX_VALUEOFINT32 define to create
+ a buffer that is big enough.
+
+ @param i
+ an integer value.
+
+ @param radix
+ the radix. Must be between RTL_USTR_MIN_RADIX (2) and RTL_USTR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_valueOfInt32( sal_Unicode * str, sal_Int32 i, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+#define RTL_USTR_MIN_RADIX RTL_STR_MIN_RADIX
+#define RTL_USTR_MAX_RADIX RTL_STR_MAX_RADIX
+#define RTL_USTR_MAX_VALUEOFINT32 RTL_STR_MAX_VALUEOFINT32
+
+/** Create the string representation of a long integer.
+
+ This function cannot be used for language-specific operations.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_USTR_MAX_VALUEOFINT64 define to create
+ a buffer that is big enough.
+
+ @param l
+ a long integer value.
+
+ @param radix
+ the radix. Must be between RTL_USTR_MIN_RADIX (2) and RTL_USTR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_valueOfInt64( sal_Unicode * str, sal_Int64 l, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+#define RTL_USTR_MAX_VALUEOFINT64 RTL_STR_MAX_VALUEOFINT64
+
+/** Create the string representation of a float.
+
+ This function cannot be used for language-specific conversion.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_USTR_MAX_VALUEOFFLOAT define to create
+ a buffer that is big enough.
+
+ @param f
+ a float value.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_valueOfFloat( sal_Unicode * str, float f ) SAL_THROW_EXTERN_C();
+#define RTL_USTR_MAX_VALUEOFFLOAT RTL_STR_MAX_VALUEOFFLOAT
+
+/** Create the string representation of a double.
+
+ This function cannot be used for language-specific conversion.
+
+ @param str
+ a buffer that is big enough to hold the result and the terminating NUL
+ character. You should use the RTL_USTR_MAX_VALUEOFDOUBLE define to create
+ a buffer that is big enough.
+
+ @param d
+ a double value.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_ustr_valueOfDouble( sal_Unicode * str, double d ) SAL_THROW_EXTERN_C();
+#define RTL_USTR_MAX_VALUEOFDOUBLE RTL_STR_MAX_VALUEOFDOUBLE
+
+/** Interpret a string as a boolean.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ true if the string is "1" or "true" in any ASCII case, false otherwise.
+ */
+sal_Bool SAL_CALL rtl_ustr_toBoolean( const sal_Unicode * str ) SAL_THROW_EXTERN_C();
+
+/** Interpret a string as an integer.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param radix
+ the radix. Must be between RTL_USTR_MIN_RADIX (2) and RTL_USTR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the integer value represented by the string, or 0 if the string does not
+ represent an integer.
+ */
+sal_Int32 SAL_CALL rtl_ustr_toInt32( const sal_Unicode * str, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+
+/** Interpret a string as a long integer.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @param radix
+ the radix. Must be between RTL_USTR_MIN_RADIX (2) and RTL_USTR_MAX_RADIX
+ (36), inclusive.
+
+ @return
+ the long integer value represented by the string, or 0 if the string does
+ not represent a long integer.
+ */
+sal_Int64 SAL_CALL rtl_ustr_toInt64( const sal_Unicode * str, sal_Int16 radix ) SAL_THROW_EXTERN_C();
+
+/** Interpret a string as a float.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ the float value represented by the string, or 0.0 if the string does not
+ represent a float.
+ */
+float SAL_CALL rtl_ustr_toFloat( const sal_Unicode * str ) SAL_THROW_EXTERN_C();
+
+/** Interpret a string as a double.
+
+ This function cannot be used for language-specific conversion. The string
+ must be null-terminated.
+
+ @param str
+ a null-terminated string.
+
+ @return
+ the float value represented by the string, or 0.0 if the string does not
+ represent a double.
+ */
+double SAL_CALL rtl_ustr_toDouble( const sal_Unicode * str ) SAL_THROW_EXTERN_C();
+
+/* ======================================================================= */
+
+#if defined( SAL_W32) || defined(SAL_OS2)
+#pragma pack(push, 4)
+#endif
+
+/** The implementation of a Unicode string.
+
+ @internal
+*/
+typedef struct _rtl_uString
+{
+ oslInterlockedCount refCount; /* opaque */
+ sal_Int32 length;
+ sal_Unicode buffer[1];
+} rtl_uString;
+
+#if defined( SAL_W32) || defined(SAL_OS2)
+#pragma pack(pop)
+#endif
+
+/* ----------------------------------------------------------------------- */
+
+/** Increment the reference count of a string.
+
+ @param str
+ a string.
+ */
+void SAL_CALL rtl_uString_acquire( rtl_uString * str ) SAL_THROW_EXTERN_C();
+
+/** Decrement the reference count of a string.
+
+ If the count goes to zero than the string data is deleted.
+
+ @param str
+ a string.
+ */
+void SAL_CALL rtl_uString_release( rtl_uString * str ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string containing no characters.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+ */
+void SAL_CALL rtl_uString_new( rtl_uString ** newStr ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string containing space for a given number of characters.
+
+ If len is greater than zero, the reference count of the new string will be
+ 1. The values of all characters are set to 0 and the length of the string
+ is 0. This function does not handle out-of-memory conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param len
+ the number of characters.
+ */
+void SAL_CALL rtl_uString_new_WithLength( rtl_uString ** newStr, sal_Int32 nLen ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string that contains a copy of another string.
+
+ If the length of value is greater than zero, the reference count of the
+ new string will be 1. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param value
+ a valid string.
+ */
+void SAL_CALL rtl_uString_newFromString( rtl_uString ** newStr, const rtl_uString * value ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string that contains a copy of a character array.
+
+ If the length of value is greater than zero, the reference count of the
+ new string will be 1. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param value
+ a null-terminated character array.
+ */
+void SAL_CALL rtl_uString_newFromStr( rtl_uString ** newStr, const sal_Unicode * value ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string that contains a copy of a character array.
+
+ If the length of value is greater than zero, the reference count of the
+ new string will be 1. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param value
+ a character array. Need not be null-terminated, but must be at least as
+ long as the specified len.
+
+ @param len
+ the length of the character array.
+ */
+void SAL_CALL rtl_uString_newFromStr_WithLength( rtl_uString ** newStr, const sal_Unicode * value, sal_Int32 len ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string that contains a copy of a character array.
+
+ If the length of value is greater than zero, the reference count of the
+ new string will be 1. This function does not handle out-of-memory
+ conditions.
+
+ Since this function is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range of 0 and 127, inclusive.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param value
+ a null-terminated ASCII character array.
+ */
+void SAL_CALL rtl_uString_newFromAscii( rtl_uString ** newStr, const sal_Char * value ) SAL_THROW_EXTERN_C();
+
+/** Allocate a new string from an array of Unicode code points.
+
+ @param newString
+ a non-null pointer to a (possibly null) rtl_uString pointer, which (if
+ non-null) will have been passed to rtl_uString_release before the function
+ returns. Upon return, points to the newly allocated string or to null if
+ there was either an out-of-memory condition or the resulting number of
+ UTF-16 code units would have been larger than SAL_MAX_INT32. The newly
+ allocated string (if any) must ultimately be passed to rtl_uString_release.
+
+ @param codePoints
+ an array of at least codePointCount code points, which each must be in the
+ range from 0 to 0x10FFFF, inclusive. May be null if codePointCount is zero.
+
+ @param codePointCount
+ the non-negative number of code points.
+
+ @since UDK 3.2.7
+*/
+void SAL_CALL rtl_uString_newFromCodePoints(
+ rtl_uString ** newString, sal_uInt32 const * codePoints,
+ sal_Int32 codePointCount) SAL_THROW_EXTERN_C();
+
+/** Assign a new value to a string.
+
+ First releases any value str might currently hold, then acquires
+ rightValue.
+
+ @param str
+ pointer to the string. The pointed-to data must be null or a valid
+ string.
+
+ @param rightValue
+ a valid string.
+ */
+void SAL_CALL rtl_uString_assign( rtl_uString ** str, rtl_uString * rightValue ) SAL_THROW_EXTERN_C();
+
+/** Return the length of a string.
+
+ The length is equal to the number of characters in the string.
+
+ @param str
+ a valid string.
+
+ @return
+ the length of the string.
+ */
+sal_Int32 SAL_CALL rtl_uString_getLength( const rtl_uString * str ) SAL_THROW_EXTERN_C();
+
+/** Return a pointer to the underlying character array of a string.
+
+ @param str
+ a valid string.
+
+ @return
+ a pointer to the null-terminated character array.
+ */
+sal_Unicode * SAL_CALL rtl_uString_getStr( rtl_uString * str ) SAL_THROW_EXTERN_C();
+
+/** Create a new string that is the concatenation of two other strings.
+
+ The new string does not necessarily have a reference count of 1 (in cases
+ where one of the two other strings is empty), so it must not be modified
+ without checking the reference count. This function does not handle
+ out-of-memory conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param left
+ a valid string.
+
+ @param right
+ a valid string.
+ */
+void SAL_CALL rtl_uString_newConcat( rtl_uString ** newStr, rtl_uString * left, rtl_uString * right ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by replacing a substring of another string.
+
+ The new string results from replacing a number of characters (count),
+ starting at the specified position (index) in the original string (str),
+ with some new substring (subStr). If subStr is null, than only a number
+ of characters is deleted.
+
+ The new string does not necessarily have a reference count of 1, so it
+ must not be modified without checking the reference count. This function
+ does not handle out-of-memory conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+
+ @param index
+ the index into str at which to start replacement. Must be between 0 and
+ the length of str, inclusive.
+
+ @param count
+ the number of charcters to remove. Must not be negative, and the sum of
+ index and count must not exceed the length of str.
+
+ @param subStr
+ either null or a valid string to be inserted.
+ */
+void SAL_CALL rtl_uString_newReplaceStrAt( rtl_uString ** newStr, rtl_uString * str, sal_Int32 idx, sal_Int32 count, rtl_uString * subStr ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by replacing all occurrences of a single character
+ within another string.
+
+ The new string results from replacing all occurrences of oldChar in str
+ with newChar.
+
+ The new string does not necessarily have a reference count of 1 (in cases
+ where oldChar does not occur in str), so it must not be modified without
+ checking the reference count. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+
+ @param oldChar
+ the old character.
+
+ @param newChar
+ the new character.
+ */
+void SAL_CALL rtl_uString_newReplace( rtl_uString ** newStr, rtl_uString * str, sal_Unicode oldChar, sal_Unicode newChar ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by converting all ASCII uppercase letters to lowercase
+ within another string.
+
+ The new string results from replacing all characters with values between
+ 65 and 90 (ASCII A--Z) by values between 97 and 122 (ASCII a--z).
+
+ This function cannot be used for language-specific conversion. The new
+ string does not necessarily have a reference count of 1 (in cases where
+ no characters need to be converted), so it must not be modified without
+ checking the reference count. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+ */
+void SAL_CALL rtl_uString_newToAsciiLowerCase( rtl_uString ** newStr, rtl_uString * str ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by converting all ASCII lowercase letters to uppercase
+ within another string.
+
+ The new string results from replacing all characters with values between
+ 97 and 122 (ASCII a--z) by values between 65 and 90 (ASCII A--Z).
+
+ This function cannot be used for language-specific conversion. The new
+ string does not necessarily have a reference count of 1 (in cases where
+ no characters need to be converted), so it must not be modified without
+ checking the reference count. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+ */
+void SAL_CALL rtl_uString_newToAsciiUpperCase( rtl_uString ** newStr, rtl_uString * str ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by removing white space from both ends of another
+ string.
+
+ The new string results from removing all characters with values less than
+ or equal to 32 (the space character) form both ends of str.
+
+ This function cannot be used for language-specific conversion. The new
+ string does not necessarily have a reference count of 1 (in cases where
+ no characters need to be removed), so it must not be modified without
+ checking the reference count. This function does not handle out-of-memory
+ conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a valid string.
+ */
+void SAL_CALL rtl_uString_newTrim( rtl_uString ** newStr, rtl_uString * str ) SAL_THROW_EXTERN_C();
+
+/** Create a new string by extracting a single token from another string.
+
+ Starting at index, the token's next token is searched for. If there is no
+ such token, the result is an empty string. Otherwise, all characters from
+ the start of that token and up to, but not including the next occurrence
+ of cTok make up the resulting token. The return value is the position of
+ the next token, or -1 if no more tokens follow.
+
+ Example code could look like
+ rtl_uString * pToken = NULL;
+ sal_Int32 nIndex = 0;
+ do
+ {
+ ...
+ nIndex = rtl_uString_getToken(&pToken, pStr, 0, ';', nIndex);
+ ...
+ }
+ while (nIndex >= 0);
+
+ The new string does not necessarily have a reference count of 1, so it
+ must not be modified without checking the reference count. This function
+ does not handle out-of-memory conditions.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string. If either token or index is negative, an empty token is stored in
+ newStr (and -1 is returned).
+
+ @param str
+ a valid string.
+
+ @param token
+ the number of the token to return, starting at index.
+
+ @param cTok
+ the character that seperates the tokens.
+
+ @param index
+ the position at which searching for the token starts. Must not be greater
+ than the length of str.
+
+ @return
+ the index of the next token, or -1 if no more tokens follow.
+ */
+sal_Int32 SAL_CALL rtl_uString_getToken( rtl_uString ** newStr , rtl_uString * str, sal_Int32 token, sal_Unicode cTok, sal_Int32 idx ) SAL_THROW_EXTERN_C();
+
+/* ======================================================================= */
+
+/** Supply an ASCII string literal together with its length and text encoding.
+
+ This macro can be used to compute (some of) the arguments in function calls
+ like rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("foo")).
+
+ @param constAsciiStr
+ must be an expression of type "(possibly cv-qualified reference to) array of
+ (possibly cv-qualified) char." Each element of the referenced array must
+ represent an ASCII value in the range 0x00--0x7F. The last element of the
+ referenced array is not considered part of the represented ASCII string, and
+ its value should be 0x00. Depending on where this macro is used, the nature
+ of the supplied expression might be further restricted.
+*/
+#define RTL_CONSTASCII_USTRINGPARAM( constAsciiStr ) constAsciiStr, ((sal_Int32)(sizeof(constAsciiStr)-1)), RTL_TEXTENCODING_ASCII_US
+
+/* ======================================================================= */
+
+/* predefined constants for String-Conversion */
+#define OSTRING_TO_OUSTRING_CVTFLAGS (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |\
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |\
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT)
+
+/* ----------------------------------------------------------------------- */
+
+/** Create a new Unicode string by converting a byte string, using a specific
+ text encoding.
+
+ The lengths of the byte string and the Unicode string may differ (e.g.,
+ for double-byte encodings, UTF-7, UTF-8).
+
+ If the length of the byte string is greater than zero, the reference count
+ of the new string will be 1.
+
+ If an out-of-memory condition occurs, newStr will point to a null pointer
+ upon return.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ @param str
+ a byte character array. Need not be null-terminated, but must be at
+ least as long as the specified len.
+
+ @param len
+ the length of the byte character array.
+
+ @param encoding
+ the text encoding to use for conversion.
+
+ @param convertFlags
+ flags which control the conversion. Either use
+ OSTRING_TO_OUSTRING_CVTFLAGS, or see
+ <http://udk.openoffice.org/cpp/man/spec/textconversion.html> for more
+ details.
+ */
+void SAL_CALL rtl_string2UString( rtl_uString ** newStr, const sal_Char * str, sal_Int32 len, rtl_TextEncoding encoding, sal_uInt32 convertFlags ) SAL_THROW_EXTERN_C();
+
+/* ======================================================================= */
+/* Interning methods */
+
+/** Return a canonical representation for a string.
+
+ A pool of strings, initially empty is maintained privately
+ by the string class. On invocation, if present in the pool
+ the original string will be returned. Otherwise this string,
+ or a copy thereof will be added to the pool and returned.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ If an out-of-memory condition occurs, newStr will point to a null pointer
+ upon return.
+
+ @param str
+ pointer to the string to be interned.
+
+ @since UDK 3.2.7
+ */
+void SAL_CALL rtl_uString_intern( rtl_uString ** newStr,
+ rtl_uString * str) SAL_THROW_EXTERN_C();
+
+/** Return a canonical representation for a string.
+
+ A pool of strings, initially empty is maintained privately
+ by the string class. On invocation, if present in the pool
+ the original string will be returned. Otherwise this string,
+ or a copy thereof will be added to the pool and returned.
+
+ @param newStr
+ pointer to the new string. The pointed-to data must be null or a valid
+ string.
+
+ If an out-of-memory condition occurs, newStr will point to a null pointer
+ upon return.
+
+ @param str
+ a byte character array. Need not be null-terminated, but must be at
+ least as long as the specified len.
+
+ @param len
+ the length of the byte character array.
+
+ @param encoding
+ the text encoding to use for conversion.
+
+ @param convertFlags
+ flags which control the conversion. Either use
+ OSTRING_TO_OUSTRING_CVTFLAGS, or see
+ <http://udk.openoffice.org/cpp/man/spec/textconversion.html> for more
+ details.
+
+ @param pInfo
+ pointer to return conversion status in, or NULL.
+
+ @since UDK 3.2.7
+ */
+void SAL_CALL rtl_uString_internConvert( rtl_uString ** newStr,
+ const sal_Char * str,
+ sal_Int32 len,
+ rtl_TextEncoding encoding,
+ sal_uInt32 convertFlags,
+ sal_uInt32 *pInfo) SAL_THROW_EXTERN_C();
+
+/** Iterate through a string based on code points instead of UTF-16 code units.
+
+ See Chapter 3 of The Unicode Standard 5.0 (Addison--Wesley, 2006) for
+ definitions of the various terms used in this description.
+
+ The given string is interpreted as a sequence of zero or more UTF-16 code
+ units. For each index into this sequence (from zero to one less than the
+ length of the sequence, inclusive), a code point represented starting at the
+ given index is computed as follows:
+
+ - If the UTF-16 code unit addressed by the index constitutes a well-formed
+ UTF-16 code unit sequence, the computed code point is the scalar value
+ encoded by that UTF-16 code unit sequence.
+
+ - Otherwise, if the index is at least two UTF-16 code units away from the
+ end of the sequence, and the sequence of two UTF-16 code units addressed by
+ the index constitutes a well-formed UTF-16 code unit sequence, the computed
+ code point is the scalar value encoded by that UTF-16 code unit sequence.
+
+ - Otherwise, the computed code point is the UTF-16 code unit addressed by
+ the index. (This last case catches unmatched surrogates as well as indices
+ pointing into the middle of surrogate pairs.)
+
+ @param string
+ pointer to a valid string; must not be null.
+
+ @param indexUtf16
+ pointer to a UTF-16 based index into the given string; must not be null. On
+ entry, the index must be in the range from zero to the length of the string
+ (in UTF-16 code units), inclusive. Upon successful return, the index will
+ be updated to address the UTF-16 code unit that is the given
+ incrementCodePoints away from the initial index.
+
+ @param incrementCodePoints
+ the number of code points to move the given *indexUtf16. If non-negative,
+ moving is done after determining the code point at the index. If negative,
+ moving is done before determining the code point at the (then updated)
+ index. The value must be such that the resulting UTF-16 based index is in
+ the range from zero to the length of the string (in UTF-16 code units),
+ inclusive.
+
+ @return
+ the code point (an integer in the range from 0 to 0x10FFFF, inclusive) that
+ is represented within the string starting at the index computed as follows:
+ If incrementCodePoints is non-negative, the index is the initial value of
+ *indexUtf16; if incrementCodePoints is negative, the index is the updated
+ value of *indexUtf16. In either case, the computed index must be in the
+ range from zero to one less than the length of the string (in UTF-16 code
+ units), inclusive.
+
+ @since UDK 3.2.7
+*/
+sal_uInt32 SAL_CALL rtl_uString_iterateCodePoints(
+ rtl_uString const * string, sal_Int32 * indexUtf16,
+ sal_Int32 incrementCodePoints);
+
+/** Converts a byte string to a Unicode string, signalling failure.
+
+ @param target
+ An out parameter receiving the converted string. Must not be null itself,
+ and must contain either null or a pointer to a valid rtl_uString; the
+ contents are unspecified if conversion fails (rtl_convertStringToUString
+ returns false).
+
+ @param source
+ The byte string. May only be null if length is zero.
+
+ @param length
+ The length of the byte string. Must be non-negative.
+
+ @param encoding
+ The text encoding to convert from. Must be an octet encoding (i.e.,
+ rtl_isOctetTextEncoding(encoding) must return true).
+
+ @param flags
+ A combination of RTL_TEXTTOUNICODE_FLAGS that detail how to do the
+ conversion (see rtl_convertTextToUnicode). RTL_TEXTTOUNICODE_FLAGS_FLUSH
+ need not be included, it is implicitly assumed. Typical uses are either
+ RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR (fail if a byte or multi-byte sequence
+ cannot be converted from the source encoding) or
+ OSTRING_TO_OUSTRING_CVTFLAGS (make a best efforts conversion).
+
+ @return
+ True if the conversion succeeded, false otherwise.
+
+ @since UDK 3.2.9
+*/
+sal_Bool SAL_CALL rtl_convertStringToUString(
+ rtl_uString ** target, char const * source, sal_Int32 length,
+ rtl_TextEncoding encoding, sal_uInt32 flags) SAL_THROW_EXTERN_C();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RTL_USTRING_H_ */
diff --git a/sal/inc/rtl/ustring.hxx b/sal/inc/rtl/ustring.hxx
new file mode 100644
index 000000000000..9a2ef8b9edc9
--- /dev/null
+++ b/sal/inc/rtl/ustring.hxx
@@ -0,0 +1,1540 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_USTRING_HXX_
+#define _RTL_USTRING_HXX_
+
+#ifdef __cplusplus
+
+#ifndef _RTL_DIAGNOSE_H_
+#include "osl/diagnose.h"
+#endif
+#include <rtl/ustring.h>
+#include <rtl/string.hxx>
+#include <rtl/memory.h>
+
+#if defined EXCEPTIONS_OFF
+#include <stdlib.h>
+#else
+#include <new>
+#endif
+
+namespace rtl
+{
+/* ======================================================================= */
+
+/**
+ This String class provide base functionality for C++ like Unicode
+ character array handling. The advantage of this class is, that it
+ handle all the memory managament for you - and it do it
+ more efficient. If you assign a string to another string, the
+ data of both strings are shared (without any copy operation or
+ memory allocation) as long as you do not change the string. This class
+ stores also the length of the string, so that many operations are
+ faster as the C-str-functions.
+
+ This class provide only readonly string handling. So you could create
+ a string and you could only query the content from this string.
+ It provide also functionality to change the string, but this results
+ in every case in a new string instance (in the most cases with an
+ memory allocation). You don't have functionality to change the
+ content of the string. If you want change the string content, than
+ you should us the OStringBuffer class, which provide these
+ functionality and avoid to much memory allocation.
+
+ The design of this class is similar to the string classes in Java
+ and so more people should have fewer understanding problems when they
+ use this class.
+*/
+
+class OUString
+{
+public:
+ /** @internal */
+ rtl_uString * pData;
+
+private:
+ /** @internal */
+ class DO_NOT_ACQUIRE{};
+
+ /** @internal */
+ OUString( rtl_uString * value, DO_NOT_ACQUIRE * )
+ {
+ pData = value;
+ }
+
+public:
+ /**
+ New string containing no characters.
+ */
+ OUString() SAL_THROW(())
+ {
+ pData = 0;
+ rtl_uString_new( &pData );
+ }
+
+ /**
+ New string from OUString.
+
+ @param str a OUString.
+ */
+ OUString( const OUString & str ) SAL_THROW(())
+ {
+ pData = str.pData;
+ rtl_uString_acquire( pData );
+ }
+
+ /**
+ New string from OUString data.
+
+ @param str a OUString data.
+ */
+ OUString( rtl_uString * str ) SAL_THROW(())
+ {
+ pData = str;
+ rtl_uString_acquire( pData );
+ }
+ /** New OUString from OUString data without acquiring it. Takeover of ownership.
+
+ @param str
+ OUString data
+ @param dummy
+ SAL_NO_ACQUIRE to distinguish from other ctors
+ */
+ inline OUString( rtl_uString * str, __sal_NoAcquire ) SAL_THROW( () )
+ { pData = str; }
+
+
+ /**
+ New string from a single Unicode character.
+
+ @param value a Unicode character.
+ */
+ explicit OUString( sal_Unicode value ) SAL_THROW(())
+ : pData (0)
+ {
+ rtl_uString_newFromStr_WithLength( &pData, &value, 1 );
+ }
+
+ /**
+ New string from a Unicode character buffer array.
+
+ @param value a NULL-terminated Unicode character array.
+ */
+ OUString( const sal_Unicode * value ) SAL_THROW(())
+ {
+ pData = 0;
+ rtl_uString_newFromStr( &pData, value );
+ }
+
+ /**
+ New string from a Uniocde character buffer array.
+
+ @param value a Unicode character array.
+ @param length the number of character which should be copied.
+ The character array length must be greater or
+ equal than this value.
+ */
+ OUString( const sal_Unicode * value, sal_Int32 length ) SAL_THROW(())
+ {
+ pData = 0;
+ rtl_uString_newFromStr_WithLength( &pData, value, length );
+ }
+
+ /**
+ New string from a 8-Bit character buffer array.
+
+ @param value a 8-Bit character array.
+ @param length the number of character which should be converted.
+ The 8-Bit character array length must be
+ greater or equal than this value.
+ @param encoding the text encoding from which the 8-Bit character
+ sequence should be converted.
+ @param convertFlags flags which controls the conversion.
+ see RTL_TEXTTOUNICODE_FLAGS_...
+
+ @exception std::bad_alloc is thrown if an out-of-memory condition occurs
+ */
+ OUString( const sal_Char * value, sal_Int32 length,
+ rtl_TextEncoding encoding,
+ sal_uInt32 convertFlags = OSTRING_TO_OUSTRING_CVTFLAGS )
+ {
+ pData = 0;
+ rtl_string2UString( &pData, value, length, encoding, convertFlags );
+#if defined EXCEPTIONS_OFF
+ OSL_ASSERT(pData != NULL);
+#else
+ if (pData == 0) {
+ throw std::bad_alloc();
+ }
+#endif
+ }
+
+ /** Create a new string from an array of Unicode code points.
+
+ @param codePoints
+ an array of at least codePointCount code points, which each must be in
+ the range from 0 to 0x10FFFF, inclusive. May be null if codePointCount
+ is zero.
+
+ @param codePointCount
+ the non-negative number of code points.
+
+ @exception std::bad_alloc
+ is thrown if either an out-of-memory condition occurs or the resulting
+ number of UTF-16 code units would have been larger than SAL_MAX_INT32.
+
+ @since UDK 3.2.7
+ */
+ inline explicit OUString(
+ sal_uInt32 const * codePoints, sal_Int32 codePointCount):
+ pData(NULL)
+ {
+ rtl_uString_newFromCodePoints(&pData, codePoints, codePointCount);
+ if (pData == NULL) {
+#if defined EXCEPTIONS_OFF
+ abort();
+#else
+ throw std::bad_alloc();
+#endif
+ }
+ }
+
+ /**
+ Release the string data.
+ */
+ ~OUString() SAL_THROW(())
+ {
+ rtl_uString_release( pData );
+ }
+
+ /** Provides an OUString const & passing a storage pointer of an
+ rtl_uString * handle.
+ It is more convenient to use C++ OUString member functions when dealing
+ with rtl_uString * handles. Using this function avoids unnecessary
+ acquire()/release() calls for a temporary OUString object.
+
+ @param ppHandle
+ pointer to storage
+ @return
+ OUString const & based on given storage
+ */
+ static inline OUString const & unacquired( rtl_uString * const * ppHandle )
+ { return * reinterpret_cast< OUString const * >( ppHandle ); }
+
+ /**
+ Assign a new string.
+
+ @param str a OUString.
+ */
+ OUString & operator=( const OUString & str ) SAL_THROW(())
+ {
+ rtl_uString_assign( &pData, str.pData );
+ return *this;
+ }
+
+ /**
+ Append a string to this string.
+
+ @param str a OUString.
+ */
+ OUString & operator+=( const OUString & str ) SAL_THROW(())
+ {
+ rtl_uString_newConcat( &pData, pData, str.pData );
+ return *this;
+ }
+
+ /**
+ Returns the length of this string.
+
+ The length is equal to the number of Unicode characters in this string.
+
+ @return the length of the sequence of characters represented by this
+ object.
+ */
+ sal_Int32 getLength() const SAL_THROW(()) { return pData->length; }
+
+ /**
+ Returns a pointer to the Unicode character buffer from this string.
+
+ It isn't necessarily NULL terminated.
+
+ @return a pointer to the Unicode characters buffer from this object.
+ */
+ operator const sal_Unicode *() const SAL_THROW(()) { return pData->buffer; }
+
+ /**
+ Returns a pointer to the Unicode character buffer from this string.
+
+ It isn't necessarily NULL terminated.
+
+ @return a pointer to the Unicode characters buffer from this object.
+ */
+ const sal_Unicode * getStr() const SAL_THROW(()) { return pData->buffer; }
+
+ /**
+ Compares two strings.
+
+ The comparison is based on the numeric value of each character in
+ the strings and return a value indicating their relationship.
+ This function can't be used for language specific sorting.
+
+ @param str the object to be compared.
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 compareTo( const OUString & str ) const SAL_THROW(())
+ {
+ return rtl_ustr_compare_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length );
+ }
+
+ /**
+ Compares two strings with an maximum count of characters.
+
+ The comparison is based on the numeric value of each character in
+ the strings and return a value indicating their relationship.
+ This function can't be used for language specific sorting.
+
+ @param str the object to be compared.
+ @param maxLength the maximum count of characters to be compared.
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 compareTo( const OUString & str, sal_Int32 maxLength ) const SAL_THROW(())
+ {
+ return rtl_ustr_shortenedCompare_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length, maxLength );
+ }
+
+ /**
+ Compares two strings in reverse order.
+
+ The comparison is based on the numeric value of each character in
+ the strings and return a value indicating their relationship.
+ This function can't be used for language specific sorting.
+
+ @param str the object to be compared.
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 reverseCompareTo( const OUString & str ) const SAL_THROW(())
+ {
+ return rtl_ustr_reverseCompare_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length );
+ }
+
+ /**
+ Perform a comparison of two strings.
+
+ The result is true if and only if second string
+ represents the same sequence of characters as the first string.
+ This function can't be used for language specific comparison.
+
+ @param str the object to be compared.
+ @return sal_True if the strings are equal;
+ sal_False, otherwise.
+ */
+ sal_Bool equals( const OUString & str ) const SAL_THROW(())
+ {
+ if ( pData->length != str.pData->length )
+ return sal_False;
+ if ( pData == str.pData )
+ return sal_True;
+ return rtl_ustr_reverseCompare_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length ) == 0;
+ }
+
+ /**
+ Perform a ASCII lowercase comparison of two strings.
+
+ The result is true if and only if second string
+ represents the same sequence of characters as the first string,
+ ignoring the case.
+ Character values between 65 and 90 (ASCII A-Z) are interpreted as
+ values between 97 and 122 (ASCII a-z).
+ This function can't be used for language specific comparison.
+
+ @param str the object to be compared.
+ @return sal_True if the strings are equal;
+ sal_False, otherwise.
+ */
+ sal_Bool equalsIgnoreAsciiCase( const OUString & str ) const SAL_THROW(())
+ {
+ if ( pData->length != str.pData->length )
+ return sal_False;
+ if ( pData == str.pData )
+ return sal_True;
+ return rtl_ustr_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length ) == 0;
+ }
+
+ /**
+ Match against a substring appearing in this string.
+
+ The result is true if and only if the second string appears as a substring
+ of this string, at the given position.
+ This function can't be used for language specific comparison.
+
+ @param str the object (substring) to be compared.
+ @param fromIndex the index to start the comparion from.
+ The index must be greater or equal than 0
+ and less or equal as the string length.
+ @return sal_True if str match with the characters in the string
+ at the given position;
+ sal_False, otherwise.
+ */
+ sal_Bool match( const OUString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ return rtl_ustr_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
+ str.pData->buffer, str.pData->length, str.pData->length ) == 0;
+ }
+
+ /**
+ Match against a substring appearing in this string, ignoring the case of
+ ASCII letters.
+
+ The result is true if and only if the second string appears as a substring
+ of this string, at the given position.
+ Character values between 65 and 90 (ASCII A-Z) are interpreted as
+ values between 97 and 122 (ASCII a-z).
+ This function can't be used for language specific comparison.
+
+ @param str the object (substring) to be compared.
+ @param fromIndex the index to start the comparion from.
+ The index must be greater or equal than 0
+ and less or equal as the string length.
+ @return sal_True if str match with the characters in the string
+ at the given position;
+ sal_False, otherwise.
+ */
+ sal_Bool matchIgnoreAsciiCase( const OUString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ return rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
+ str.pData->buffer, str.pData->length,
+ str.pData->length ) == 0;
+ }
+
+ /**
+ Compares two strings.
+
+ The comparison is based on the numeric value of each character in
+ the strings and return a value indicating their relationship.
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated.
+ This function can't be used for language specific sorting.
+
+ @param asciiStr the 8-Bit ASCII character string to be compared.
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 compareToAscii( const sal_Char* asciiStr ) const SAL_THROW(())
+ {
+ return rtl_ustr_ascii_compare_WithLength( pData->buffer, pData->length, asciiStr );
+ }
+
+ /**
+ Compares two strings with an maximum count of characters.
+
+ The comparison is based on the numeric value of each character in
+ the strings and return a value indicating their relationship.
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated.
+ This function can't be used for language specific sorting.
+
+ @param asciiStr the 8-Bit ASCII character string to be compared.
+ @param maxLength the maximum count of characters to be compared.
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 compareToAscii( const sal_Char * asciiStr, sal_Int32 maxLength ) const SAL_THROW(())
+ {
+ return rtl_ustr_ascii_shortenedCompare_WithLength( pData->buffer, pData->length,
+ asciiStr, maxLength );
+ }
+
+ /**
+ Compares two strings in reverse order.
+
+ This could be useful, if normally both strings start with the same
+ content. The comparison is based on the numeric value of each character
+ in the strings and return a value indicating their relationship.
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated and must be greater or
+ equal as asciiStrLength.
+ This function can't be used for language specific sorting.
+
+ @param asciiStr the 8-Bit ASCII character string to be compared.
+ @param asciiStrLength the length of the ascii string
+ @return 0 - if both strings are equal
+ < 0 - if this string is less than the string argument
+ > 0 - if this string is greater than the string argument
+ */
+ sal_Int32 reverseCompareToAsciiL( const sal_Char * asciiStr, sal_Int32 asciiStrLength ) const SAL_THROW(())
+ {
+ return rtl_ustr_asciil_reverseCompare_WithLength( pData->buffer, pData->length,
+ asciiStr, asciiStrLength );
+ }
+
+ /**
+ Perform a comparison of two strings.
+
+ The result is true if and only if second string
+ represents the same sequence of characters as the first string.
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated.
+ This function can't be used for language specific comparison.
+
+ @param asciiStr the 8-Bit ASCII character string to be compared.
+ @return sal_True if the strings are equal;
+ sal_False, otherwise.
+ */
+ sal_Bool equalsAscii( const sal_Char* asciiStr ) const SAL_THROW(())
+ {
+ return rtl_ustr_ascii_compare_WithLength( pData->buffer, pData->length,
+ asciiStr ) == 0;
+ }
+
+ /**
+ Perform a comparison of two strings.
+
+ The result is true if and only if second string
+ represents the same sequence of characters as the first string.
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated and must be greater or
+ equal as asciiStrLength.
+ This function can't be used for language specific comparison.
+
+ @param asciiStr the 8-Bit ASCII character string to be compared.
+ @param asciiStrLength the length of the ascii string
+ @return sal_True if the strings are equal;
+ sal_False, otherwise.
+ */
+ sal_Bool equalsAsciiL( const sal_Char* asciiStr, sal_Int32 asciiStrLength ) const SAL_THROW(())
+ {
+ if ( pData->length != asciiStrLength )
+ return sal_False;
+
+ return rtl_ustr_asciil_reverseEquals_WithLength(
+ pData->buffer, asciiStr, asciiStrLength );
+ }
+
+ /**
+ Perform a ASCII lowercase comparison of two strings.
+
+ The result is true if and only if second string
+ represents the same sequence of characters as the first string,
+ ignoring the case.
+ Character values between 65 and 90 (ASCII A-Z) are interpreted as
+ values between 97 and 122 (ASCII a-z).
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated.
+ This function can't be used for language specific comparison.
+
+ @param asciiStr the 8-Bit ASCII character string to be compared.
+ @return sal_True if the strings are equal;
+ sal_False, otherwise.
+ */
+ sal_Bool equalsIgnoreAsciiCaseAscii( const sal_Char * asciiStr ) const SAL_THROW(())
+ {
+ return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, asciiStr ) == 0;
+ }
+
+ /**
+ Perform a ASCII lowercase comparison of two strings.
+
+ The result is true if and only if second string
+ represents the same sequence of characters as the first string,
+ ignoring the case.
+ Character values between 65 and 90 (ASCII A-Z) are interpreted as
+ values between 97 and 122 (ASCII a-z).
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated and must be greater or
+ equal as asciiStrLength.
+ This function can't be used for language specific comparison.
+
+ @param asciiStr the 8-Bit ASCII character string to be compared.
+ @param asciiStrLength the length of the ascii string
+ @return sal_True if the strings are equal;
+ sal_False, otherwise.
+ */
+ sal_Bool equalsIgnoreAsciiCaseAsciiL( const sal_Char * asciiStr, sal_Int32 asciiStrLength ) const SAL_THROW(())
+ {
+ if ( pData->length != asciiStrLength )
+ return sal_False;
+
+ return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, asciiStr ) == 0;
+ }
+
+ /**
+ Match against a substring appearing in this string.
+
+ The result is true if and only if the second string appears as a substring
+ of this string, at the given position.
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated and must be greater or
+ equal as asciiStrLength.
+ This function can't be used for language specific comparison.
+
+ @param str the object (substring) to be compared.
+ @param fromIndex the index to start the comparion from.
+ The index must be greater or equal than 0
+ and less or equal as the string length.
+ @return sal_True if str match with the characters in the string
+ at the given position;
+ sal_False, otherwise.
+ */
+ sal_Bool matchAsciiL( const sal_Char* asciiStr, sal_Int32 asciiStrLength, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ return rtl_ustr_ascii_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
+ asciiStr, asciiStrLength ) == 0;
+ }
+
+ /**
+ Match against a substring appearing in this string, ignoring the case of
+ ASCII letters.
+
+ The result is true if and only if the second string appears as a substring
+ of this string, at the given position.
+ Character values between 65 and 90 (ASCII A-Z) are interpreted as
+ values between 97 and 122 (ASCII a-z).
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated and must be greater or
+ equal as asciiStrLength.
+ This function can't be used for language specific comparison.
+
+ @param asciiStr the 8-Bit ASCII character string to be compared.
+ @param asciiStrLength the length of the ascii string
+ @param fromIndex the index to start the comparion from.
+ The index must be greater or equal than 0
+ and less or equal as the string length.
+ @return sal_True if str match with the characters in the string
+ at the given position;
+ sal_False, otherwise.
+ */
+ sal_Bool matchIgnoreAsciiCaseAsciiL( const sal_Char* asciiStr, sal_Int32 asciiStrLength, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ return rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
+ asciiStr, asciiStrLength ) == 0;
+ }
+
+ /**
+ Check whether this string ends with a given ASCII string.
+
+ @param asciiStr a sequence of at least asciiStrLength ASCII characters
+ (bytes in the range 0x00--0x7F)
+ @param asciiStrLen the length of asciiStr; must be non-negative
+ @return true if this string ends with asciiStr; otherwise, false is
+ returned
+
+ @since UDK 3.2.7
+ */
+ inline bool endsWithAsciiL(char const * asciiStr, sal_Int32 asciiStrLength)
+ const
+ {
+ return asciiStrLength <= pData->length
+ && rtl_ustr_asciil_reverseEquals_WithLength(
+ pData->buffer + pData->length - asciiStrLength, asciiStr,
+ asciiStrLength);
+ }
+
+ /**
+ Check whether this string ends with a given ASCII string, ignoring the
+ case of ASCII letters.
+
+ @param asciiStr a sequence of at least asciiStrLength ASCII characters
+ (bytes in the range 0x00--0x7F)
+ @param asciiStrLen the length of asciiStr; must be non-negative
+ @return true if this string ends with asciiStr, ignoring the case of ASCII
+ letters ("A"--"Z" and "a"--"z"); otherwise, false is returned
+ */
+ inline bool endsWithIgnoreAsciiCaseAsciiL(
+ char const * asciiStr, sal_Int32 asciiStrLength) const
+ {
+ return asciiStrLength <= pData->length
+ && (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
+ pData->buffer + pData->length - asciiStrLength,
+ asciiStrLength, asciiStr, asciiStrLength)
+ == 0);
+ }
+
+ friend sal_Bool operator == ( const OUString& rStr1, const OUString& rStr2 ) SAL_THROW(())
+ { return rStr1.getLength() == rStr2.getLength() && rStr1.compareTo( rStr2 ) == 0; }
+ friend sal_Bool operator == ( const OUString& rStr1, const sal_Unicode * pStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( pStr2 ) == 0; }
+ friend sal_Bool operator == ( const sal_Unicode * pStr1, const OUString& rStr2 ) SAL_THROW(())
+ { return OUString( pStr1 ).compareTo( rStr2 ) == 0; }
+
+ friend sal_Bool operator != ( const OUString& rStr1, const OUString& rStr2 ) SAL_THROW(())
+ { return !(operator == ( rStr1, rStr2 )); }
+ friend sal_Bool operator != ( const OUString& rStr1, const sal_Unicode * pStr2 ) SAL_THROW(())
+ { return !(operator == ( rStr1, pStr2 )); }
+ friend sal_Bool operator != ( const sal_Unicode * pStr1, const OUString& rStr2 ) SAL_THROW(())
+ { return !(operator == ( pStr1, rStr2 )); }
+
+ friend sal_Bool operator < ( const OUString& rStr1, const OUString& rStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( rStr2 ) < 0; }
+ friend sal_Bool operator > ( const OUString& rStr1, const OUString& rStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( rStr2 ) > 0; }
+ friend sal_Bool operator <= ( const OUString& rStr1, const OUString& rStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( rStr2 ) <= 0; }
+ friend sal_Bool operator >= ( const OUString& rStr1, const OUString& rStr2 ) SAL_THROW(())
+ { return rStr1.compareTo( rStr2 ) >= 0; }
+
+ /**
+ Returns a hashcode for this string.
+
+ @return a hash code value for this object.
+
+ @see rtl::OUStringHash for convenient use of STLPort's hash_map
+ */
+ sal_Int32 hashCode() const SAL_THROW(())
+ {
+ return rtl_ustr_hashCode_WithLength( pData->buffer, pData->length );
+ }
+
+ /**
+ Returns the index within this string of the first occurrence of the
+ specified character, starting the search at the specified index.
+
+ @param ch character to be located.
+ @param fromIndex the index to start the search from.
+ The index must be greater or equal than 0
+ and less or equal as the string length.
+ @return the index of the first occurrence of the character in the
+ character sequence represented by this string that is
+ greater than or equal to fromIndex, or
+ -1 if the character does not occur.
+ */
+ sal_Int32 indexOf( sal_Unicode ch, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ sal_Int32 ret = rtl_ustr_indexOfChar_WithLength( pData->buffer+fromIndex, pData->length-fromIndex, ch );
+ return (ret < 0 ? ret : ret+fromIndex);
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of the
+ specified character, searching backward starting at the end.
+
+ @param ch character to be located.
+ @return the index of the last occurrence of the character in the
+ character sequence represented by this string, or
+ -1 if the character does not occur.
+ */
+ sal_Int32 lastIndexOf( sal_Unicode ch ) const SAL_THROW(())
+ {
+ return rtl_ustr_lastIndexOfChar_WithLength( pData->buffer, pData->length, ch );
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of the
+ specified character, searching backward starting before the specified
+ index.
+
+ @param ch character to be located.
+ @param fromIndex the index before which to start the search.
+ @return the index of the last occurrence of the character in the
+ character sequence represented by this string that
+ is less than fromIndex, or -1
+ if the character does not occur before that point.
+ */
+ sal_Int32 lastIndexOf( sal_Unicode ch, sal_Int32 fromIndex ) const SAL_THROW(())
+ {
+ return rtl_ustr_lastIndexOfChar_WithLength( pData->buffer, fromIndex, ch );
+ }
+
+ /**
+ Returns the index within this string of the first occurrence of the
+ specified substring, starting at the specified index.
+
+ If str doesn't include any character, always -1 is
+ returned. This is also the case, if both strings are empty.
+
+ @param str the substring to search for.
+ @param fromIndex the index to start the search from.
+ @return If the string argument occurs one or more times as a substring
+ within this string at the starting index, then the index
+ of the first character of the first such substring is
+ returned. If it does not occur as a substring starting
+ at fromIndex or beyond, -1 is returned.
+ */
+ sal_Int32 indexOf( const OUString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
+ {
+ sal_Int32 ret = rtl_ustr_indexOfStr_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
+ str.pData->buffer, str.pData->length );
+ return (ret < 0 ? ret : ret+fromIndex);
+ }
+
+ /**
+ Returns the index within this string of the first occurrence of the
+ specified ASCII substring, starting at the specified index.
+
+ @param str
+ the substring to be searched for. Need not be null-terminated, but must
+ be at least as long as the specified len. Must only contain characters
+ in the ASCII range 0x00--7F.
+
+ @param len
+ the length of the substring; must be non-negative.
+
+ @param fromIndex
+ the index to start the search from. Must be in the range from zero to
+ the length of this string, inclusive.
+
+ @return
+ the index (starting at 0) of the first character of the first occurrence
+ of the substring within this string starting at the given fromIndex, or
+ -1 if the substring does not occur. If len is zero, -1 is returned.
+
+ @since UDK 3.2.7
+ */
+ sal_Int32 indexOfAsciiL(
+ char const * str, sal_Int32 len, sal_Int32 fromIndex = 0) const
+ SAL_THROW(())
+ {
+ sal_Int32 ret = rtl_ustr_indexOfAscii_WithLength(
+ pData->buffer + fromIndex, pData->length - fromIndex, str, len);
+ return ret < 0 ? ret : ret + fromIndex;
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of
+ the specified substring, searching backward starting at the end.
+
+ The returned index indicates the starting index of the substring
+ in this string.
+ If str doesn't include any character, always -1 is
+ returned. This is also the case, if both strings are empty.
+
+ @param str the substring to search for.
+ @return If the string argument occurs one or more times as a substring
+ within this string, then the index of the first character of
+ the last such substring is returned. If it does not occur as
+ a substring, -1 is returned.
+ */
+ sal_Int32 lastIndexOf( const OUString & str ) const SAL_THROW(())
+ {
+ return rtl_ustr_lastIndexOfStr_WithLength( pData->buffer, pData->length,
+ str.pData->buffer, str.pData->length );
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of
+ the specified substring, searching backward starting before the specified
+ index.
+
+ The returned index indicates the starting index of the substring
+ in this string.
+ If str doesn't include any character, always -1 is
+ returned. This is also the case, if both strings are empty.
+
+ @param str the substring to search for.
+ @param fromIndex the index before which to start the search.
+ @return If the string argument occurs one or more times as a substring
+ within this string before the starting index, then the index
+ of the first character of the last such substring is
+ returned. Otherwise, -1 is returned.
+ */
+ sal_Int32 lastIndexOf( const OUString & str, sal_Int32 fromIndex ) const SAL_THROW(())
+ {
+ return rtl_ustr_lastIndexOfStr_WithLength( pData->buffer, fromIndex,
+ str.pData->buffer, str.pData->length );
+ }
+
+ /**
+ Returns the index within this string of the last occurrence of the
+ specified ASCII substring.
+
+ @param str
+ the substring to be searched for. Need not be null-terminated, but must
+ be at least as long as the specified len. Must only contain characters
+ in the ASCII range 0x00--7F.
+
+ @param len
+ the length of the substring; must be non-negative.
+
+ @return
+ the index (starting at 0) of the first character of the last occurrence
+ of the substring within this string, or -1 if the substring does not
+ occur. If len is zero, -1 is returned.
+
+ @since UDK 3.2.7
+ */
+ sal_Int32 lastIndexOfAsciiL(char const * str, sal_Int32 len) const
+ SAL_THROW(())
+ {
+ return rtl_ustr_lastIndexOfAscii_WithLength(
+ pData->buffer, pData->length, str, len);
+ }
+
+ /**
+ Returns a new string that is a substring of this string.
+
+ The substring begins at the specified beginIndex. It is an error for
+ beginIndex to be negative or to be greater than the length of this string.
+
+ @param beginIndex the beginning index, inclusive.
+ @return the specified substring.
+ */
+ OUString copy( sal_Int32 beginIndex ) const SAL_THROW(())
+ {
+ OSL_ASSERT(beginIndex >= 0 && beginIndex <= getLength());
+ if ( beginIndex == 0 )
+ return *this;
+ else
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newFromStr_WithLength( &pNew, pData->buffer+beginIndex, getLength()-beginIndex );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+ }
+
+ /**
+ Returns a new string that is a substring of this string.
+
+ The substring begins at the specified beginIndex and contains count
+ characters. It is an error for either beginIndex or count to be negative,
+ or for beginIndex + count to be greater than the length of this string.
+
+ @param beginIndex the beginning index, inclusive.
+ @param count the number of characters.
+ @return the specified substring.
+ */
+ OUString copy( sal_Int32 beginIndex, sal_Int32 count ) const SAL_THROW(())
+ {
+ OSL_ASSERT(beginIndex >= 0 && beginIndex <= getLength()
+ && count >= 0 && count <= getLength() - beginIndex);
+ if ( (beginIndex == 0) && (count == getLength()) )
+ return *this;
+ else
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newFromStr_WithLength( &pNew, pData->buffer+beginIndex, count );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+ }
+
+ /**
+ Concatenates the specified string to the end of this string.
+
+ @param str the string that is concatenated to the end
+ of this string.
+ @return a string that represents the concatenation of this string
+ followed by the string argument.
+ */
+ OUString concat( const OUString & str ) const SAL_THROW(())
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newConcat( &pNew, pData, str.pData );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ friend OUString operator+( const OUString& rStr1, const OUString& rStr2 ) SAL_THROW(())
+ {
+ return rStr1.concat( rStr2 );
+ }
+
+ /**
+ Returns a new string resulting from replacing n = count characters
+ from position index in this string with newStr.
+
+ @param index the replacing index in str.
+ The index must be greater or equal as 0 and
+ less or equal as the length of the string.
+ @param count the count of charcters that will replaced
+ The count must be greater or equal as 0 and
+ less or equal as the length of the string minus index.
+ @param newStr the new substring.
+ @return the new string.
+ */
+ OUString replaceAt( sal_Int32 index, sal_Int32 count, const OUString& newStr ) const SAL_THROW(())
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newReplaceStrAt( &pNew, pData, index, count, newStr.pData );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns a new string resulting from replacing all occurrences of
+ oldChar in this string with newChar.
+
+ If the character oldChar does not occur in the character sequence
+ represented by this object, then the string is assigned with
+ str.
+
+ @param oldChar the old character.
+ @param newChar the new character.
+ @return a string derived from this string by replacing every
+ occurrence of oldChar with newChar.
+ */
+ OUString replace( sal_Unicode oldChar, sal_Unicode newChar ) const SAL_THROW(())
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newReplace( &pNew, pData, oldChar, newChar );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Converts from this string all ASCII uppercase characters (65-90)
+ to ASCII lowercase characters (97-122).
+
+ This function can't be used for language specific conversion.
+ If the string doesn't contain characters which must be converted,
+ then the new string is assigned with str.
+
+ @return the string, converted to ASCII lowercase.
+ */
+ OUString toAsciiLowerCase() const SAL_THROW(())
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newToAsciiLowerCase( &pNew, pData );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Converts from this string all ASCII lowercase characters (97-122)
+ to ASCII uppercase characters (65-90).
+
+ This function can't be used for language specific conversion.
+ If the string doesn't contain characters which must be converted,
+ then the new string is assigned with str.
+
+ @return the string, converted to ASCII uppercase.
+ */
+ OUString toAsciiUpperCase() const SAL_THROW(())
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newToAsciiUpperCase( &pNew, pData );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns a new string resulting from removing white space from both ends
+ of the string.
+
+ All characters that have codes less than or equal to
+ 32 (the space character) are considered to be white space.
+ If the string doesn't contain white spaces at both ends,
+ then the new string is assigned with str.
+
+ @return the string, with white space removed from the front and end.
+ */
+ OUString trim() const SAL_THROW(())
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newTrim( &pNew, pData );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns a token in the string.
+
+ Example:
+ sal_Int32 nIndex = 0;
+ do
+ {
+ ...
+ OUString aToken = aStr.getToken( 0, ';', nIndex );
+ ...
+ }
+ while ( nIndex >= 0 );
+
+ @param token the number of the token to return
+ @param cTok the character which seperate the tokens.
+ @param index the position at which the token is searched in the
+ string.
+ The index must not be greater than the length of the
+ string.
+ This param is set to the position of the
+ next token or to -1, if it is the last token.
+ @return the token; if either token or index is negative, an empty token
+ is returned (and index is set to -1)
+ */
+ OUString getToken( sal_Int32 token, sal_Unicode cTok, sal_Int32& index ) const SAL_THROW(())
+ {
+ rtl_uString * pNew = 0;
+ index = rtl_uString_getToken( &pNew, pData, token, cTok, index );
+ return OUString( pNew, (DO_NOT_ACQUIRE *)0 );
+ }
+
+ /**
+ Returns the Boolean value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @return sal_True, if the string is 1 or "True" in any ASCII case.
+ sal_False in any other case.
+ */
+ sal_Bool toBoolean() const SAL_THROW(())
+ {
+ return rtl_ustr_toBoolean( pData->buffer );
+ }
+
+ /**
+ Returns the first character from this string.
+
+ @return the first character from this string or 0, if this string
+ is emptry.
+ */
+ sal_Unicode toChar() const SAL_THROW(())
+ {
+ return pData->buffer[0];
+ }
+
+ /**
+ Returns the int32 value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @param radix the radix (between 2 and 36)
+ @return the int32 represented from this string.
+ 0 if this string represents no number.
+ */
+ sal_Int32 toInt32( sal_Int16 radix = 10 ) const SAL_THROW(())
+ {
+ return rtl_ustr_toInt32( pData->buffer, radix );
+ }
+
+ /**
+ Returns the int64 value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @param radix the radix (between 2 and 36)
+ @return the int64 represented from this string.
+ 0 if this string represents no number.
+ */
+ sal_Int64 toInt64( sal_Int16 radix = 10 ) const SAL_THROW(())
+ {
+ return rtl_ustr_toInt64( pData->buffer, radix );
+ }
+
+ /**
+ Returns the float value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @return the float represented from this string.
+ 0.0 if this string represents no number.
+ */
+ float toFloat() const SAL_THROW(())
+ {
+ return rtl_ustr_toFloat( pData->buffer );
+ }
+
+ /**
+ Returns the double value from this string.
+
+ This function can't be used for language specific conversion.
+
+ @return the double represented from this string.
+ 0.0 if this string represents no number.
+ */
+ double toDouble() const SAL_THROW(())
+ {
+ return rtl_ustr_toDouble( pData->buffer );
+ }
+
+
+ /**
+ Return a canonical representation for a string.
+
+ A pool of strings, initially empty is maintained privately
+ by the string class. On invocation, if present in the pool
+ the original string will be returned. Otherwise this string,
+ or a copy thereof will be added to the pool and returned.
+
+ @return
+ a version of the string from the pool.
+
+ @exception std::bad_alloc is thrown if an out-of-memory condition occurs
+
+ @since UDK 3.2.7
+ */
+ OUString intern() const
+ {
+ rtl_uString * pNew = 0;
+ rtl_uString_intern( &pNew, pData );
+#if defined EXCEPTIONS_OFF
+ OSL_ASSERT(pNew != NULL);
+#else
+ if (pNew == 0) {
+ throw std::bad_alloc();
+ }
+#endif
+ return OUString( pNew, (DO_NOT_ACQUIRE *)0 );
+ }
+
+ /**
+ Return a canonical representation for a converted string.
+
+ A pool of strings, initially empty is maintained privately
+ by the string class. On invocation, if present in the pool
+ the original string will be returned. Otherwise this string,
+ or a copy thereof will be added to the pool and returned.
+
+ @param value a 8-Bit character array.
+ @param length the number of character which should be converted.
+ The 8-Bit character array length must be
+ greater or equal than this value.
+ @param encoding the text encoding from which the 8-Bit character
+ sequence should be converted.
+ @param convertFlags flags which controls the conversion.
+ see RTL_TEXTTOUNICODE_FLAGS_...
+ @param pInfo pointer to return conversion status or NULL.
+
+ @return
+ a version of the converted string from the pool.
+
+ @exception std::bad_alloc is thrown if an out-of-memory condition occurs
+
+ @since UDK 3.2.7
+ */
+ static OUString intern( const sal_Char * value, sal_Int32 length,
+ rtl_TextEncoding encoding,
+ sal_uInt32 convertFlags = OSTRING_TO_OUSTRING_CVTFLAGS,
+ sal_uInt32 *pInfo = NULL )
+ {
+ rtl_uString * pNew = 0;
+ rtl_uString_internConvert( &pNew, value, length, encoding,
+ convertFlags, pInfo );
+#if defined EXCEPTIONS_OFF
+ OSL_ASSERT(pNew != NULL);
+#else
+ if (pNew == 0) {
+ throw std::bad_alloc();
+ }
+#endif
+ return OUString( pNew, (DO_NOT_ACQUIRE *)0 );
+ }
+
+ /**
+ Converts to an OString, signalling failure.
+
+ @param pTarget
+ An out parameter receiving the converted OString. Must not be null; the
+ contents are not modified if conversion fails (convertToOString returns
+ false).
+
+ @param nEncoding
+ The text encoding to convert into. Must be an octet encoding (i.e.,
+ rtl_isOctetTextEncoding(nEncoding) must return true).
+
+ @param nFlags
+ A combination of RTL_UNICODETOTEXT_FLAGS that detail how to do the
+ conversion (see rtl_convertUnicodeToText). RTL_UNICODETOTEXT_FLAGS_FLUSH
+ need not be included, it is implicitly assumed. Typical uses are either
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
+ RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR (fail if a Unicode character cannot
+ be converted to the target nEncoding) or OUSTRING_TO_OSTRING_CVTFLAGS
+ (make a best efforts conversion).
+
+ @return
+ True if the conversion succeeded, false otherwise.
+ */
+ inline bool convertToString(OString * pTarget, rtl_TextEncoding nEncoding,
+ sal_uInt32 nFlags) const
+ {
+ return rtl_convertUStringToString(&pTarget->pData, pData->buffer,
+ pData->length, nEncoding, nFlags);
+ }
+
+ /** Iterate through this string based on code points instead of UTF-16 code
+ units.
+
+ See Chapter 3 of The Unicode Standard 5.0 (Addison--Wesley, 2006) for
+ definitions of the various terms used in this description.
+
+ This string is interpreted as a sequence of zero or more UTF-16 code
+ units. For each index into this sequence (from zero to one less than
+ the length of the sequence, inclusive), a code point represented
+ starting at the given index is computed as follows:
+
+ - If the UTF-16 code unit addressed by the index constitutes a
+ well-formed UTF-16 code unit sequence, the computed code point is the
+ scalar value encoded by that UTF-16 code unit sequence.
+
+ - Otherwise, if the index is at least two UTF-16 code units away from
+ the end of the sequence, and the sequence of two UTF-16 code units
+ addressed by the index constitutes a well-formed UTF-16 code unit
+ sequence, the computed code point is the scalar value encoded by that
+ UTF-16 code unit sequence.
+
+ - Otherwise, the computed code point is the UTF-16 code unit addressed
+ by the index. (This last case catches unmatched surrogates as well as
+ indices pointing into the middle of surrogate pairs.)
+
+ @param indexUtf16
+ pointer to a UTF-16 based index into this string; must not be null. On
+ entry, the index must be in the range from zero to the length of this
+ string (in UTF-16 code units), inclusive. Upon successful return, the
+ index will be updated to address the UTF-16 code unit that is the given
+ incrementCodePoints away from the initial index.
+
+ @param incrementCodePoints
+ the number of code points to move the given *indexUtf16. If
+ non-negative, moving is done after determining the code point at the
+ index. If negative, moving is done before determining the code point
+ at the (then updated) index. The value must be such that the resulting
+ UTF-16 based index is in the range from zero to the length of this
+ string (in UTF-16 code units), inclusive.
+
+ @return
+ the code point (an integer in the range from 0 to 0x10FFFF, inclusive)
+ that is represented within this string starting at the index computed as
+ follows: If incrementCodePoints is non-negative, the index is the
+ initial value of *indexUtf16; if incrementCodePoints is negative, the
+ index is the updated value of *indexUtf16. In either case, the computed
+ index must be in the range from zero to one less than the length of this
+ string (in UTF-16 code units), inclusive.
+
+ @since UDK 3.2.7
+ */
+ inline sal_uInt32 iterateCodePoints(
+ sal_Int32 * indexUtf16, sal_Int32 incrementCodePoints = 1) const
+ {
+ return rtl_uString_iterateCodePoints(
+ pData, indexUtf16, incrementCodePoints);
+ }
+
+ /**
+ Returns the string representation of the sal_Bool argument.
+
+ If the sal_Bool is true, the string "true" is returned.
+ If the sal_Bool is false, the string "false" is returned.
+ This function can't be used for language specific conversion.
+
+ @param b a sal_Bool.
+ @return a string with the string representation of the argument.
+ */
+ static OUString valueOf( sal_Bool b ) SAL_THROW(())
+ {
+ sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFBOOLEAN];
+ rtl_uString* pNewData = 0;
+ rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfBoolean( aBuf, b ) );
+ return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns the string representation of the char argument.
+
+ @param c a character.
+ @return a string with the string representation of the argument.
+ */
+ static OUString valueOf( sal_Unicode c ) SAL_THROW(())
+ {
+ return OUString( &c, 1 );
+ }
+
+ /**
+ Returns the string representation of the int argument.
+
+ This function can't be used for language specific conversion.
+
+ @param i a int32.
+ @param radix the radix (between 2 and 36)
+ @return a string with the string representation of the argument.
+ */
+ static OUString valueOf( sal_Int32 i, sal_Int16 radix = 10 ) SAL_THROW(())
+ {
+ sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFINT32];
+ rtl_uString* pNewData = 0;
+ rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfInt32( aBuf, i, radix ) );
+ return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns the string representation of the long argument.
+
+ This function can't be used for language specific conversion.
+
+ @param ll a int64.
+ @param radix the radix (between 2 and 36)
+ @return a string with the string representation of the argument.
+ */
+ static OUString valueOf( sal_Int64 ll, sal_Int16 radix = 10 ) SAL_THROW(())
+ {
+ sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFINT64];
+ rtl_uString* pNewData = 0;
+ rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfInt64( aBuf, ll, radix ) );
+ return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns the string representation of the float argument.
+
+ This function can't be used for language specific conversion.
+
+ @param f a float.
+ @return a string with the string representation of the argument.
+ */
+ static OUString valueOf( float f ) SAL_THROW(())
+ {
+ sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFFLOAT];
+ rtl_uString* pNewData = 0;
+ rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfFloat( aBuf, f ) );
+ return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns the string representation of the double argument.
+
+ This function can't be used for language specific conversion.
+
+ @param d a double.
+ @return a string with the string representation of the argument.
+ */
+ static OUString valueOf( double d ) SAL_THROW(())
+ {
+ sal_Unicode aBuf[RTL_USTR_MAX_VALUEOFDOUBLE];
+ rtl_uString* pNewData = 0;
+ rtl_uString_newFromStr_WithLength( &pNewData, aBuf, rtl_ustr_valueOfDouble( aBuf, d ) );
+ return OUString( pNewData, (DO_NOT_ACQUIRE*)0 );
+ }
+
+ /**
+ Returns a OUString copied without conversion from an ASCII
+ character string.
+
+ Since this method is optimized for performance, the ASCII character
+ values are not converted in any way. The caller has to make sure that
+ all ASCII characters are in the allowed range between 0 and
+ 127. The ASCII string must be NULL-terminated.
+
+ @param value the 8-Bit ASCII character string
+ @return a string with the string representation of the argument.
+ */
+ static OUString createFromAscii( const sal_Char * value ) SAL_THROW(())
+ {
+ rtl_uString* pNew = 0;
+ rtl_uString_newFromAscii( &pNew, value );
+ return OUString( pNew, (DO_NOT_ACQUIRE*)0 );
+ }
+};
+
+/* ======================================================================= */
+
+/** A helper to use OUStrings with hash maps.
+
+ Instances of this class are unary function objects that can be used as
+ hash function arguments to STLPort's hash_map and similar constructs.
+ */
+struct OUStringHash
+{
+ /** Compute a hash code for a string.
+
+ @param rString
+ a string.
+
+ @return
+ a hash code for the string. This hash code should not be stored
+ persistently, as its computation may change in later revisions.
+ */
+ size_t operator()(const rtl::OUString& rString) const
+ { return (size_t)rString.hashCode(); }
+};
+
+/* ======================================================================= */
+
+/** Convert an OString to an OUString, using a specific text encoding.
+
+ The lengths of the two strings may differ (e.g., for double-byte
+ encodings, UTF-7, UTF-8).
+
+ @param rStr
+ an OString to convert.
+
+ @param encoding
+ the text encoding to use for conversion.
+
+ @param convertFlags
+ flags which control the conversion. Either use
+ OSTRING_TO_OUSTRING_CVTFLAGS, or see
+ <http://udk.openoffice.org/cpp/man/spec/textconversion.html> for more
+ details.
+ */
+inline OUString OStringToOUString( const OString & rStr,
+ rtl_TextEncoding encoding,
+ sal_uInt32 convertFlags = OSTRING_TO_OUSTRING_CVTFLAGS )
+{
+ return OUString( rStr.getStr(), rStr.getLength(), encoding, convertFlags );
+}
+
+/** Convert an OUString to an OString, using a specific text encoding.
+
+ The lengths of the two strings may differ (e.g., for double-byte
+ encodings, UTF-7, UTF-8).
+
+ @param rStr
+ an OUString to convert.
+
+ @param encoding
+ the text encoding to use for conversion.
+
+ @param convertFlags
+ flags which control the conversion. Either use
+ OUSTRING_TO_OSTRING_CVTFLAGS, or see
+ <http://udk.openoffice.org/cpp/man/spec/textconversion.html> for more
+ details.
+ */
+inline OString OUStringToOString( const OUString & rUnicode,
+ rtl_TextEncoding encoding,
+ sal_uInt32 convertFlags = OUSTRING_TO_OSTRING_CVTFLAGS )
+{
+ return OString( rUnicode.getStr(), rUnicode.getLength(), encoding, convertFlags );
+}
+
+/* ======================================================================= */
+
+} /* Namespace */
+
+#endif /* __cplusplus */
+
+#endif /* _RTL_USTRING_HXX */
diff --git a/sal/inc/rtl/uuid.h b/sal/inc/rtl/uuid.h
new file mode 100644
index 000000000000..3ff5bb2c1232
--- /dev/null
+++ b/sal/inc/rtl/uuid.h
@@ -0,0 +1,209 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _RTL_UUID_H_
+#define _RTL_UUID_H_
+
+
+#include <sal/types.h>
+#include <rtl/string.h>
+
+/**
+ @HTML
+ @file
+ Specification (from draft-leach-uuids-guids-01.txt )
+
+ <p>
+ A UUID is an identifier that is unique across both space and time,
+ with respect to the space of all UUIDs. To be precise, the UUID
+ consists of a finite bit space. Thus, collision cannot be avoided in
+ principle. A UUID can be used for multiple purposes, from tagging objects
+ with an extremely short lifetime, to reliably identifying very persistent
+ objects across a network.
+
+ <p>
+ The generation of UUIDs does not require that a registration
+ authority be contacted for each identifier. Instead, Version 4 UUIDs are
+ generated from (pseudo unique) sequences of (pseudo) random bits.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Generates a new Version 4 (random number based) UUID (Universally Unique
+ IDentifier).
+
+ @param pTargetUUID pointer to at least 16 bytes of memory. After the call it contains
+ the newly generated uuid in network byte order.
+ @param pPredecessorUUID ignored (was used when this function returned
+ Version 1 instead of Version 4 UUIDs).
+ @param bUseEthernetAddress ignored (was used when this function returned
+ Version 1 instead of Version 4 UUIDs).
+ */
+void SAL_CALL rtl_createUuid( sal_uInt8 *pTargetUUID ,
+ const sal_uInt8 *pPredecessorUUID,
+ sal_Bool bUseEthernetAddress );
+
+/** Compare two UUID's lexically
+
+ <p>
+ Note: lexical ordering is not temporal ordering!
+ <p>
+ Note: For equalnesschecking, a memcmp(pUUID1,pUUID2,16) is more efficient
+
+ @return
+ <ul>
+ <li>-1 u1 is lexically before u2
+ <li>0 u1 is equal to u2
+ <li>1 u1 is lexically after u2
+ </ul>
+
+ */
+sal_Int32 SAL_CALL rtl_compareUuid( const sal_uInt8 *pUUID1 , const sal_uInt8 *pUUID2 );
+
+/** Creates named UUIDs.
+
+ <p>
+ The version 3 UUID is meant for generating UUIDs from <em>names</em> that
+ are drawn from, and unique within, some <em>name space</em>. Some examples
+ of names (and, implicitly, name spaces) might be DNS names, URLs, ISO
+ Object IDs (OIDs), reserved words in a programming language, or X.500
+ Distinguished Names (DNs); thus, the concept of name and name space
+ should be broadly construed, and not limited to textual names.
+
+ <p>
+ The requirements for such UUIDs are as follows:
+
+ <ul>
+ <li> The UUIDs generated at different times from the same name in the
+ same namespace MUST be equal
+
+ <li> The UUIDs generated from two different names in the same namespace
+ should be different (with very high probability)
+
+ <li> The UUIDs generated from the same name in two different namespaces
+ should be different with (very high probability)
+
+ <li> If two UUIDs that were generated from names are equal, then they
+ were generated from the same name in the same namespace (with very
+ high probability).
+ </ul>
+
+ @param pTargetUUID pointer to at least 16 bytes of memory. After the call
+ it contains the newly generated uuid in network byte order.
+ @param pNameSpaceUUID The namespace uuid. Below are some predefined ones,
+ but any arbitray uuid can be used as namespace.
+
+ @param pName the name
+ */
+void SAL_CALL rtl_createNamedUuid(
+ sal_uInt8 *pTargetUUID,
+ const sal_uInt8 *pNameSpaceUUID,
+ const rtl_String *pName
+ );
+
+
+
+/*
+ Predefined Namespaces
+ (Use them the following way : sal_uInt8 aNsDNS[16]) = RTL_UUID_NAMESPACE_DNS;
+ */
+/** namesapce DNS
+
+ <p>
+ (Use them the following way : sal_uInt8 aNsDNS[16]) = RTL_UUID_NAMESPACE_DNS;
+ <p>
+ 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */
+#define RTL_UUID_NAMESPACE_DNS {\
+ 0x6b,0xa7,0xb8,0x10,\
+ 0x9d,0xad,\
+ 0x11,0xd1,\
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8\
+ }
+
+/** namespace URL
+
+ <p>
+ 6ba7b811-9dad-11d1-80b4-00c04fd430c8 */
+#define RTL_UUID_NAMESPACE_URL { \
+ 0x6b, 0xa7, 0xb8, 0x11,\
+ 0x9d, 0xad,\
+ 0x11, 0xd1,\
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8\
+ }
+
+/** namespace oid
+
+ <p>
+ 6ba7b812-9dad-11d1-80b4-00c04fd430c8 */
+#define RTL_UUID_NAMESPACE_OID {\
+ 0x6b, 0xa7, 0xb8, 0x12,\
+ 0x9d, 0xad,\
+ 0x11, 0xd1,\
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8\
+ }
+
+/** namespace X500
+
+ <p>
+ 6ba7b814-9dad-11d1-80b4-00c04fd430c8 */
+#define RTL_UUID_NAMESPACE_X500 {\
+ 0x6b, 0xa7, 0xb8, 0x14,\
+ 0x9d, 0xad,\
+ 0x11, 0xd1,\
+ 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8\
+ }
+
+
+/*
+ This macro must have a value below the system time resolution of the
+ system. The uuid routines use this value as an upper limit for adding ticks to the
+ the predecessor time value if system times are equal.
+ */
+#ifdef SAL_W32
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 1000
+#elif defined SAL_OS2 // YD we use posix functions for time
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
+#elif LINUX
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
+#elif NETBSD
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
+#elif FREEBSD
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
+#elif SOLARIS
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 10
+#elif MACOSX
+#define UUID_SYSTEM_TIME_RESOLUTION_100NS_TICKS 100000
+#else
+#error "System time resolution must be calculated!"
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/inc/sal/alloca.h b/sal/inc/sal/alloca.h
new file mode 100644
index 000000000000..17c242c4d1e2
--- /dev/null
+++ b/sal/inc/sal/alloca.h
@@ -0,0 +1,66 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_SAL_ALLOCA_H
+#define INCLUDED_SAL_ALLOCA_H
+
+#if defined (SOLARIS) || defined (LINUX) || defined(__EMX__)
+
+#ifndef INCLUDED_ALLOCA_H
+#include <alloca.h>
+#define INCLUDED_ALLOCA_H
+#endif
+
+#elif defined (FREEBSD) || defined(NETBSD)
+
+#ifndef INCLUDED_STDLIB_H
+#include <stdlib.h>
+#define INCLUDED_STDLIB_H
+#endif
+
+#elif defined (MACOSX)
+
+#ifndef INCLUDED_SYS_TYPES_H
+#include <sys/types.h>
+#define INCLUDED_SYS_TYPES_H
+#endif
+
+#elif defined (WNT)
+
+#ifndef INCLUDED_MALLOC_H
+#include <malloc.h>
+#define INCLUDED_MALLOC_H
+#endif
+
+#else
+
+#error "unknown platform: please check for alloca"
+
+#endif
+
+#endif /* INCLUDED_SAL_ALLOCA_H */
+
diff --git a/sal/inc/sal/config.h b/sal/inc/sal/config.h
new file mode 100644
index 000000000000..7b2bd5154bc8
--- /dev/null
+++ b/sal/inc/sal/config.h
@@ -0,0 +1,152 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _SAL_CONFIG_H_
+#define _SAL_CONFIG_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifndef INCLUDED_STDLIB_H
+#include <stdlib.h>
+#define INCLUDED_STDLIB_H
+#endif
+
+#ifdef WIN32
+#define SAL_W32
+#define SAL_DLLEXTENSION ".dll"
+#define SAL_PRGEXTENSION ".exe"
+#define SAL_PATHSEPARATOR ';'
+#define SAL_PATHDELIMITER '\\'
+#define SAL_CONFIGFILE( name ) name ".ini"
+#define SAL_SYSCONFIGFILE( name ) name ".ini"
+
+#ifdef _MSC_VER
+
+#ifndef _USE_MATH_DEFINES
+#define _USE_MATH_DEFINES // needed by Visual C++ for math constants
+#endif
+
+/* warnings ought to be disabled using /wd:n option of msvc.net compiler */
+#if _MSC_VER < 1300
+/* no performance warning: int to bool */
+#pragma warning( disable : 4800 )
+
+/* No warning for: C++ Exception Specification ignored */
+#pragma warning( disable : 4290 )
+
+#if OSL_DEBUG_LEVEL > 0
+/* No warning for: identifier was truncated to '255' characters in the browser information */
+#pragma warning( disable : 4786 )
+#endif
+#endif /* defined _MSC_VER < 1300 */
+
+#endif /* defined _MSC_VER */
+
+/* Provide ISO C99 compatible versions of snprint and vsnprintf */
+#ifdef __MINGW32__
+#define _SNPRINTF_DLLIMPORT
+#endif
+#ifndef _SNPRINTF_H
+#include <systools/win32/snprintf.h>
+#endif
+
+#endif /* defined WIN32 */
+
+/* BR: 16bit fuer Borland-Compiler */
+#ifdef __BORLANDC__
+#define SAL_W16
+#define SAL_DLLEXTENSION ".dll"
+#endif
+/* BR: 16bit fuer Borland-Compiler */
+
+#ifdef OS2
+#define SAL_OS2
+#define SAL_DLLEXTENSION ".dll"
+#define SAL_PRGEXTENSION ".exe"
+#define SAL_PATHSEPARATOR ';'
+#define SAL_PATHDELIMITER '\\'
+#define SAL_CONFIGFILE( name ) name ".ini"
+#define SAL_SYSCONFIGFILE( name ) name ".ini"
+#endif
+
+#if defined(SOLARIS) || defined(LINUX) || defined(NETBSD) || defined(FREEBSD) || defined(SCO)
+#define SAL_UNX
+#define SAL_DLLEXTENSION ".so"
+#define SAL_DLLPREFIX "lib"
+#define SAL_PRGEXTENSION ".bin"
+#define SAL_PATHSEPARATOR ':'
+#define SAL_PATHDELIMITER '/'
+#define SAL_CONFIGFILE( name ) name "rc"
+#define SAL_SYSCONFIGFILE( name ) "." name "rc"
+#endif
+
+#ifdef MACOSX
+#define SAL_UNX
+#define SAL_DLLEXTENSION ".dylib"
+#define SAL_DLLPREFIX "lib"
+#define SAL_PRGEXTENSION ".bin"
+#define SAL_PATHSEPARATOR ':'
+#define SAL_PATHDELIMITER '/'
+#define SAL_CONFIGFILE( name ) name "rc"
+#define SAL_SYSCONFIGFILE( name ) "." name "rc"
+#endif
+
+#ifdef HPUX
+#define SAL_UNX
+#define SAL_DLLEXTENSION ".sl"
+#define SAL_DLLPREFIX "lib"
+#define SAL_PRGEXTENSION ".bin"
+#define SAL_CONFIGFILE( name ) name "rc"
+#define SAL_SYSCONFIGFILE( name ) "." name "rc"
+#endif
+
+#ifdef sun
+#undef sun
+#define sun sun
+#endif
+
+/* This is to work around a gcc 3.3 error that fixing actually breaks other
+ * compilers. This will create a dummy variable specifically for gcc 3.3 that
+ * allows it to compile and not break the others. Other compilers may follow
+ * with this eror later. */
+#if defined __GNUC__
+#if ((__GNUC__ == 3) && (__GNUC_MINOR__ > 2))
+# define SAL_ISO_CONST const
+#else
+# define SAL_ISO_CONST
+#endif
+#endif
+
+#endif /*_SAL_CONFIG_H_ */
+
+
diff --git a/sal/inc/sal/macros.h b/sal/inc/sal/macros.h
new file mode 100644
index 000000000000..800629ab095d
--- /dev/null
+++ b/sal/inc/sal/macros.h
@@ -0,0 +1,51 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _SAL_MACROS_H_
+#define _SAL_MACROS_H_
+
+#ifndef SAL_MAX
+# define SAL_MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef SAL_MIN
+# define SAL_MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef SAL_FIELDOFFSET
+# define SAL_FIELDOFFSET(type, field) ((sal_Int32)(&((type *)16)->field) - 16)
+#endif
+
+#ifndef SAL_BOUND
+# define SAL_BOUND(x,l,h) ((x) <= (l) ? (l) : ((x) >= (h) ? (h) : (x)))
+#endif
+
+#ifndef SAL_SWAP
+# define SAL_SWAP(a,b) ((a) ^= (b) ^= (a) ^= (b))
+#endif
+
+
+#endif
diff --git a/sal/inc/sal/main.h b/sal/inc/sal/main.h
new file mode 100644
index 000000000000..f360e4c95f19
--- /dev/null
+++ b/sal/inc/sal/main.h
@@ -0,0 +1,152 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _SAL_MAIN_H_
+#define _SAL_MAIN_H_
+
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void SAL_CALL sal_detail_initialize(int argc, char ** argv);
+void SAL_CALL sal_detail_deinitialize();
+
+#define SAL_MAIN_WITH_ARGS_IMPL \
+int SAL_CALL main(int argc, char ** argv) \
+{ \
+ int ret; \
+ sal_detail_initialize(argc, argv); \
+ ret = sal_main_with_args(argc, argv); \
+ sal_detail_deinitialize(); \
+ return ret; \
+}
+
+#define SAL_MAIN_IMPL \
+int SAL_CALL main(int argc, char ** argv) \
+{ \
+ int ret; \
+ sal_detail_initialize(argc, argv); \
+ ret = sal_main(); \
+ sal_detail_deinitialize(); \
+ return ret; \
+}
+
+
+/* Definition macros for CRT entries */
+
+#ifdef SAL_W32
+
+#ifndef INCLUDED_STDLIB_H
+#include <stdlib.h>
+#define INCLUDED_STDLIB_H
+#endif
+
+/* Sorry but this is neccessary cause HINSTANCE is a typedef that differs (C++ causes an error) */
+
+#if 0
+
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+
+#else /* Simulated what windows.h does */
+
+#ifndef WINAPI
+# define WINAPI __stdcall
+#endif
+
+#if !defined(DECLARE_HANDLE)
+# ifdef STRICT
+ typedef void *HANDLE;
+# define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
+# else
+ typedef void *PVOID;
+ typedef PVOID HANDLE;
+# define DECLARE_HANDLE(name) typedef HANDLE name
+# endif
+DECLARE_HANDLE(HINSTANCE);
+#endif
+
+#endif
+
+#define SAL_WIN_WinMain \
+int WINAPI WinMain( HINSTANCE _hinst, HINSTANCE _dummy, char* _cmdline, int _nshow ) \
+{ \
+ int argc = __argc; char ** argv = __argv; \
+ (void) _hinst; (void) _dummy; (void) _cmdline; (void) _nshow; /* unused */ \
+ return main(argc, argv); \
+}
+
+#else /* ! SAL_W32 */
+
+# define SAL_WIN_WinMain
+
+#endif /* ! SAL_W32 */
+
+/* Implementation macro */
+
+#define SAL_IMPLEMENT_MAIN_WITH_ARGS(_argc_, _argv_) \
+ static int SAL_CALL sal_main_with_args (int _argc_, char ** _argv_); \
+ SAL_MAIN_WITH_ARGS_IMPL \
+ SAL_WIN_WinMain \
+ static int SAL_CALL sal_main_with_args(int _argc_, char ** _argv_)
+
+#define SAL_IMPLEMENT_MAIN() \
+ static int SAL_CALL sal_main(void); \
+ SAL_MAIN_IMPL \
+ SAL_WIN_WinMain \
+ static int SAL_CALL sal_main(void)
+
+/*
+ "How to use" Examples:
+
+ #include <sal/main.h>
+
+ SAL_IMPLEMENT_MAIN()
+ {
+ DoSomething();
+
+ return 0;
+ }
+
+ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
+ {
+ DoSomethingWithArgs(argc, argv);
+
+ return 0;
+ }
+
+*/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* _SAL_MAIN_H_ */
+
diff --git a/sal/inc/sal/mathconf.h b/sal/inc/sal/mathconf.h
new file mode 100644
index 000000000000..bb623e2f2812
--- /dev/null
+++ b/sal/inc/sal/mathconf.h
@@ -0,0 +1,147 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if !defined INCLUDED_SAL_MATHCONF_H
+#define INCLUDED_SAL_MATHCONF_H
+
+#include "osl/endian.h"
+
+#include <float.h>
+
+#if defined SOLARIS
+#include <ieeefp.h>
+#endif /* SOLARIS */
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Generally, the C standard guarantees that at program startup, "trapping or
+ stopping (if supported) is disabled on all [floating-point] exceptions"
+ (F.7.3/1 of the August 3, 1998 draft of C99), and that during program
+ execution, "a programmer can safely assume default modes (or be unaware of
+ them)" (7.6/2, footnote 161 of the August 3, 1998 draft of C99). Reportedly,
+ on Windows there are printer drivers that switch on exceptions. To avoid
+ problems, the SAL_MATH_FPEXCEPTIONS_OFF macro can be used to explicitly
+ switch off exceptions (on Windows).
+ */
+#if defined WNT
+#define SAL_MATH_FPEXCEPTIONS_OFF() _control87( _MCW_EM, _MCW_EM )
+#else /* WNT */
+#define SAL_MATH_FPEXCEPTIONS_OFF()
+#endif /* WNT */
+
+
+/* SAL_MATH_FINITE(d): test double d on INFINITY, NaN et al. */
+#if defined( WNT)
+#define SAL_MATH_FINITE(d) _finite(d)
+#elif defined OS2
+#define SAL_MATH_FINITE(x) \
+ ((sizeof (x) == sizeof (float)) ? __isfinitef(x) \
+ : (sizeof (x) == sizeof (double)) ? __isfinite(x) \
+ : __isfinitel(x))
+#elif defined LINUX || defined UNX
+#define SAL_MATH_FINITE(d) finite(d)
+#else /* WNT, LINUX, UNX */
+#error "SAL_MATH_FINITE not defined"
+#endif /* WNT, LINUX, UNX */
+
+
+/* This needs to be fixed for non--IEEE-754 platforms: */
+#if 1 /* IEEE 754 supported */
+#if defined OSL_BIGENDIAN
+
+/* IEEE 754 double structures for BigEndian */
+union sal_math_Double
+{
+ struct
+ {
+ unsigned sign : 1;
+ unsigned exponent :11;
+ unsigned fraction_hi :20;
+ unsigned fraction_lo :32;
+ } inf_parts;
+ struct
+ {
+ unsigned sign : 1;
+ unsigned exponent :11;
+ unsigned qnan_bit : 1;
+ unsigned bits :19;
+ unsigned fraction_lo :32;
+ } nan_parts;
+ struct
+ {
+ unsigned msw :32;
+ unsigned lsw :32;
+ } w32_parts;
+ double value;
+};
+
+#elif defined OSL_LITENDIAN
+
+/* IEEE 754 double structures for LittleEndian */
+union sal_math_Double
+{
+ struct {
+ unsigned fraction_lo :32;
+ unsigned fraction_hi :20;
+ unsigned exponent :11;
+ unsigned sign : 1;
+ } inf_parts;
+ struct {
+ unsigned fraction_lo :32;
+ unsigned bits :19;
+ unsigned qnan_bit : 1;
+ unsigned exponent :11;
+ unsigned sign : 1;
+ } nan_parts;
+ struct
+ {
+ unsigned lsw :32;
+ unsigned msw :32;
+ } w32_parts;
+ double value;
+};
+
+#else /* OSL_BIGENDIAN, OSL_LITENDIAN */
+
+#error "neither OSL_BIGENDIAN nor OSL_LITENDIAN"
+
+#endif /* OSL_BIGENDIAN, OSL_LITENDIAN */
+#else /* IEEE 754 supported */
+
+#error "don't know how to handle IEEE 754"
+
+#endif /* IEEE 754 supported */
+
+
+#if defined __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* INCLUDED_SAL_MATHCONF_H */
diff --git a/sal/inc/sal/types.h b/sal/inc/sal/types.h
new file mode 100644
index 000000000000..14c24480d98b
--- /dev/null
+++ b/sal/inc/sal/types.h
@@ -0,0 +1,435 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _SAL_TYPES_H_
+#define _SAL_TYPES_H_
+
+#include <sal/config.h>
+
+/* Grab __SIZEOFxxx constants from typesconfig tool on Unix */
+#if defined UNX
+ #include <sal/typesizes.h>
+#elif defined(WNT) || defined(OS2)
+ /* FIXME: autogeneration of type sizes on Win32/Win64? */
+ #define SAL_TYPES_ALIGNMENT2 1
+ #define SAL_TYPES_ALIGNMENT4 1
+ #define SAL_TYPES_ALIGNMENT8 1
+ #define SAL_TYPES_SIZEOFSHORT 2
+ #define SAL_TYPES_SIZEOFINT 4
+ #define SAL_TYPES_SIZEOFLONG 4
+ #define SAL_TYPES_SIZEOFLONGLONG 8
+ #define SAL_TYPES_SIZEOFPOINTER 4
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/********************************************************************************/
+/* Data types
+*/
+
+/* Boolean */
+typedef unsigned char sal_Bool;
+# define sal_False ((sal_Bool)0)
+# define sal_True ((sal_Bool)1)
+
+/* char is assumed to always be 1 byte long */
+typedef signed char sal_Int8;
+typedef unsigned char sal_uInt8;
+
+#if SAL_TYPES_SIZEOFSHORT == 2
+ typedef signed short sal_Int16;
+ typedef unsigned short sal_uInt16;
+#else
+ #error "Could not find 16-bit type, add support for your architecture"
+#endif
+
+#if SAL_TYPES_SIZEOFLONG == 4
+ typedef signed long sal_Int32;
+ typedef unsigned long sal_uInt32;
+ #define SAL_PRIdINT32 "ld"
+ #define SAL_PRIuUINT32 "lu"
+ #define SAL_PRIxUINT32 "lx"
+ #define SAL_PRIXUINT32 "lX"
+#elif SAL_TYPES_SIZEOFINT == 4
+ typedef signed int sal_Int32;
+ typedef unsigned int sal_uInt32;
+ #define SAL_PRIdINT32 "d"
+ #define SAL_PRIuUINT32 "u"
+ #define SAL_PRIxUINT32 "x"
+ #define SAL_PRIXUINT32 "X"
+#else
+ #error "Could not find 32-bit type, add support for your architecture"
+#endif
+
+#if (_MSC_VER >= 1000)
+ typedef __int64 sal_Int64;
+ typedef unsigned __int64 sal_uInt64;
+
+ /* The following are macros that will add the 64 bit constant suffix. */
+ #define SAL_CONST_INT64(x) x##i64
+ #define SAL_CONST_UINT64(x) x##ui64
+
+ #define SAL_PRIdINT64 "I64d"
+ #define SAL_PRIuUINT64 "I64u"
+ #define SAL_PRIxUINT64 "I64x"
+ #define SAL_PRIXUINT64 "I64X"
+#elif defined(__SUNPRO_CC) || defined(__SUNPRO_C) || defined (__GNUC__) || defined(__hpux) || defined (sgi)
+ #if SAL_TYPES_SIZEOFLONG == 8
+ typedef signed long int sal_Int64;
+ typedef unsigned long int sal_uInt64;
+
+
+ /* The following are macros that will add the 64 bit constant suffix. */
+ #define SAL_CONST_INT64(x) x##l
+ #define SAL_CONST_UINT64(x) x##ul
+
+ #define SAL_PRIdINT64 "ld"
+ #define SAL_PRIuUINT64 "lu"
+ #define SAL_PRIxUINT64 "lx"
+ #define SAL_PRIXUINT64 "lX"
+ #elif SAL_TYPES_SIZEOFLONGLONG == 8
+ typedef signed long long sal_Int64;
+ typedef unsigned long long sal_uInt64;
+
+ /* The following are macros that will add the 64 bit constant suffix. */
+ #define SAL_CONST_INT64(x) x##ll
+ #define SAL_CONST_UINT64(x) x##ull
+
+ #ifdef __MINGW32__
+ #define SAL_PRIdINT64 "I64d"
+ #define SAL_PRIuUINT64 "I64u"
+ #define SAL_PRIxUINT64 "I64x"
+ #define SAL_PRIXUINT64 "I64X"
+ #else
+ #define SAL_PRIdINT64 "lld"
+ #define SAL_PRIuUINT64 "llu"
+ #define SAL_PRIxUINT64 "llx"
+ #define SAL_PRIXUINT64 "llX"
+ #endif
+ #else
+ #error "Could not find 64-bit type, add support for your architecture"
+ #endif
+#else
+ #error "Please define the 64-bit types for your architecture/compiler in sal/inc/sal/types.h"
+#endif
+
+typedef char sal_Char;
+typedef signed char sal_sChar;
+typedef unsigned char sal_uChar;
+
+#if ( defined(SAL_W32) && !defined(__MINGW32__) )
+ typedef wchar_t sal_Unicode;
+#else
+ #define SAL_UNICODE_NOTEQUAL_WCHAR_T
+ typedef sal_uInt16 sal_Unicode;
+#endif
+
+typedef void * sal_Handle;
+
+/* sal_Size should currently be the native width of the platform */
+#if SAL_TYPES_SIZEOFPOINTER == 4
+ typedef sal_uInt32 sal_Size;
+ typedef sal_Int32 sal_sSize;
+#elif SAL_TYPES_SIZEOFPOINTER == 8
+ typedef sal_uInt64 sal_Size;
+ typedef sal_Int64 sal_sSize;
+#else
+ #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler"
+#endif
+
+/* sal_PtrDiff holds the result of a pointer subtraction */
+#if SAL_TYPES_SIZEOFPOINTER == 4
+ typedef sal_Int32 sal_PtrDiff;
+#elif SAL_TYPES_SIZEOFPOINTER == 8
+ typedef sal_Int64 sal_PtrDiff;
+#else
+ #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler"
+#endif
+
+/* printf-style conversion specification length modifiers for size_t and
+ ptrdiff_t (most platforms support C99, MSC has its own extension) */
+#if defined(_MSC_VER) || defined(__MINGW32__)
+ #define SAL_PRI_SIZET "I"
+ #define SAL_PRI_PTRDIFFT "I"
+#else
+ #define SAL_PRI_SIZET "z"
+ #define SAL_PRI_PTRDIFFT "t"
+#endif
+
+/* sal_IntPtr, sal_uIntPtr are integer types designed to hold pointers so that any valid
+ * pointer to void can be converted to this type and back to a pointer to void and the
+ * result will compare to the original pointer */
+#if SAL_TYPES_SIZEOFPOINTER == 4
+ typedef sal_Int32 sal_IntPtr;
+ typedef sal_uInt32 sal_uIntPtr;
+ #define SAL_PRIdINTPTR SAL_PRIdINT32
+ #define SAL_PRIuUINTPTR SAL_PRIuUINT32
+ #define SAL_PRIxUINTPTR SAL_PRIxUINT32
+ #define SAL_PRIXUINTPTR SAL_PRIXUINT32
+#elif SAL_TYPES_SIZEOFPOINTER == 8
+ typedef sal_Int64 sal_IntPtr;
+ typedef sal_uInt64 sal_uIntPtr;
+ #define SAL_PRIdINTPTR SAL_PRIdINT64
+ #define SAL_PRIuUINTPTR SAL_PRIuUINT64
+ #define SAL_PRIxUINTPTR SAL_PRIxUINT64
+ #define SAL_PRIXUINTPTR SAL_PRIXUINT64
+#else
+ #error "Please make sure SAL_TYPES_SIZEOFPOINTER is defined for your architecture/compiler"
+#endif
+
+/********************************************************************************/
+/* Useful defines
+ */
+
+/* The following SAL_MIN_INTn defines codify the assumption that the signed
+ * sal_Int types use two's complement representation. Defining them as
+ * "-0x7F... - 1" instead of as "-0x80..." prevents warnings about applying the
+ * unary minus operator to unsigned quantities.
+ */
+#define SAL_MIN_INT8 ((sal_Int8) (-0x7F - 1))
+#define SAL_MAX_INT8 ((sal_Int8) 0x7F)
+#define SAL_MAX_UINT8 ((sal_uInt8) 0xFF)
+#define SAL_MIN_INT16 ((sal_Int16) (-0x7FFF - 1))
+#define SAL_MAX_INT16 ((sal_Int16) 0x7FFF)
+#define SAL_MAX_UINT16 ((sal_uInt16) 0xFFFF)
+#define SAL_MIN_INT32 ((sal_Int32) (-0x7FFFFFFF - 1))
+#define SAL_MAX_INT32 ((sal_Int32) 0x7FFFFFFF)
+#define SAL_MAX_UINT32 ((sal_uInt32) 0xFFFFFFFF)
+#define SAL_MIN_INT64 ((sal_Int64) (SAL_CONST_INT64(-0x7FFFFFFFFFFFFFFF) - 1))
+#define SAL_MAX_INT64 ((sal_Int64) SAL_CONST_INT64(0x7FFFFFFFFFFFFFFF))
+#define SAL_MAX_UINT64 ((sal_uInt64) SAL_CONST_UINT64(0xFFFFFFFFFFFFFFFF))
+
+#if SAL_TYPES_SIZEOFLONG == 4
+#define SAL_MAX_SSIZE SAL_MAX_INT32
+#define SAL_MAX_SIZE SAL_MAX_UINT32
+#elif SAL_TYPES_SIZEOFLONG == 8
+#define SAL_MAX_SSIZE SAL_MAX_INT64
+#define SAL_MAX_SIZE SAL_MAX_UINT64
+#endif
+
+#if defined(SAL_W32) || defined(SAL_OS2) || defined(SAL_UNX)
+# define SAL_MAX_ENUM 0x7fffffff
+#elif defined(SAL_W16)
+# define SAL_MAX_ENUM 0x7fff
+#endif
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+# define SAL_DLLPUBLIC_EXPORT __declspec(dllexport)
+#if defined(_MSC_VER)
+# define SAL_DLLPUBLIC_IMPORT __declspec(dllimport)
+#else
+# define SAL_DLLPUBLIC_IMPORT
+#endif // defined(_MSC_VER)
+# define SAL_DLLPRIVATE
+#if defined(_MSC_VER)
+# define SAL_CALL __cdecl
+# define SAL_CALL_ELLIPSE __cdecl
+#else
+# define SAL_CALL
+# define SAL_CALL_ELLIPSE
+#endif
+#elif defined SAL_OS2 // YD
+/* YD 25/09/2007 gcc doesn't like imports inside class members */
+# define SAL_DLLPUBLIC_EXPORT
+# define SAL_DLLPUBLIC_IMPORT
+# define SAL_DLLPRIVATE
+# define SAL_CALL
+# define SAL_CALL_ELLIPSE
+#elif defined SAL_UNX
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x550)
+# define SAL_DLLPUBLIC_EXPORT __global
+# define SAL_DLLPUBLIC_IMPORT
+# define SAL_DLLPRIVATE __hidden
+# elif defined(__SUNPRO_C ) && (__SUNPRO_C >= 0x550)
+# define SAL_DLLPUBLIC_EXPORT __global
+# define SAL_DLLPUBLIC_IMPORT
+# define SAL_DLLPRIVATE __hidden
+# elif defined(__GNUC__) && defined(HAVE_GCC_VISIBILITY_FEATURE)
+# define SAL_DLLPUBLIC_EXPORT __attribute__ ((visibility("default")))
+# define SAL_DLLPUBLIC_IMPORT
+# define SAL_DLLPRIVATE __attribute__ ((visibility("hidden")))
+# else
+# define SAL_DLLPUBLIC_EXPORT
+# define SAL_DLLPUBLIC_IMPORT
+# define SAL_DLLPRIVATE
+# endif
+# define SAL_CALL
+# define SAL_CALL_ELLIPSE
+#else
+# error("unknown platform")
+#endif
+
+/**
+ Exporting the symbols necessary for exception handling on GCC.
+
+ These macros are used for inline declarations of exception classes, as in
+ rtl/malformeduriexception.hxx.
+*/
+#if defined __GNUC__
+#define SAL_EXCEPTION_DLLPUBLIC_EXPORT SAL_DLLPUBLIC_EXPORT
+#define SAL_EXCEPTION_DLLPRIVATE SAL_DLLPRIVATE
+#else
+#define SAL_EXCEPTION_DLLPUBLIC_EXPORT
+#define SAL_EXCEPTION_DLLPRIVATE
+#endif
+
+/** Use this for pure virtual classes, e.g. class SAL_NO_VTABLE Foo { ...
+ This hinders the compiler from setting a generic vtable stating that
+ a pure virtual function was called and thus slightly reduces code size.
+*/
+#ifdef _MSC_VER
+# define SAL_NO_VTABLE __declspec(novtable)
+#else
+# define SAL_NO_VTABLE
+#endif
+
+#ifdef SAL_W32
+# pragma pack(push, 8)
+#elif defined(SAL_OS2)
+# pragma pack(push, 4)
+#endif
+
+/** This is the binary specification of a SAL sequence.
+ <br>
+*/
+typedef struct _sal_Sequence
+{
+ /** reference count of sequence<br>
+ */
+ sal_Int32 nRefCount;
+ /** element count<br>
+ */
+ sal_Int32 nElements;
+ /** elements array<br>
+ */
+ char elements[1];
+} sal_Sequence;
+
+#define SAL_SEQUENCE_HEADER_SIZE ((sal_Size)&((sal_Sequence *)0)->elements)
+
+#if defined( SAL_W32) || defined(SAL_OS2)
+#pragma pack(pop)
+#endif
+
+
+/** Wrap C++ const_cast, reinterpret_cast and static_cast expressions in
+ macros to keep code portable to old compilers (since most compilers still
+ lack RTTI support, dynamic_cast is not included here).
+ */
+#ifdef __cplusplus
+#if defined SAL_W32 || defined SOLARIS || defined LINUX || defined MACOSX || defined FREEBSD || defined NETBSD || defined AIX || defined OS2
+#define SAL_CONST_CAST(type, expr) (const_cast< type >(expr))
+#define SAL_REINTERPRET_CAST(type, expr) (reinterpret_cast< type >(expr))
+#define SAL_STATIC_CAST(type, expr) (static_cast< type >(expr))
+#else /* SAL_W32, SOLARIS, LINUX */
+#define SAL_CONST_CAST(type, expr) ((type) (expr))
+#define SAL_REINTERPRET_CAST(type, expr) ((type) (expr))
+#define SAL_STATIC_CAST(type, expr) ((type) (expr))
+#endif /* SAL_W32, SOLARIS, LINUX */
+#endif /* __cplusplus */
+
+/** Definition of function throw clause macros. These have been introduced
+ to reduce code size by balancing out compiler bugs.
+
+ These macros are ONLY for function declarations,
+ use common C++ throw statement for throwing exceptions, e.g.
+ throw RuntimeException();
+
+ SAL_THROW() should be used for all C++ functions, e.g. SAL_THROW( () )
+ SAL_THROW_EXTERN_C() should be used for all C functions
+*/
+#ifdef __cplusplus
+#if defined(__GNUC__) || defined(__SUNPRO_CC) || defined(__sgi)
+#define SAL_THROW( exc )
+#else /* MSVC, all other */
+#define SAL_THROW( exc ) throw exc
+#endif /* __GNUC__, __SUNPRO_CC */
+#define SAL_THROW_EXTERN_C() throw ()
+#else /* ! __cplusplus */
+/* SAL_THROW() must not be used in C headers, only SAL_THROW_EXTERN_C() is defined */
+#define SAL_THROW_EXTERN_C()
+#endif
+
+
+
+#ifdef __cplusplus
+enum __sal_NoAcquire
+{
+ /** definition of a no acquire enum for ctors
+ */
+ SAL_NO_ACQUIRE
+};
+#endif /* __cplusplus */
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#ifdef __cplusplus
+
+namespace sal {
+
+/**
+ A static_cast between integral types, to avoid C++ compiler warnings.
+
+ In C++ source code, use sal::static_int_cast<T>(n) instead of
+ static_cast<T>(n) whenever a compiler warning about integral type problems
+ shall be silenced. That way, source code that needs to be modified when the
+ type of any of the expressions involved in the compiler warning is changed
+ can be found more easily.
+
+ Both template arguments T1 and T2 must be integral types.
+*/
+template< typename T1, typename T2 > inline T1 static_int_cast(T2 n) {
+ return static_cast< T1 >(n);
+}
+
+}
+
+#else /* __cplusplus */
+
+/**
+ A cast between integer types, to avoid C compiler warnings.
+
+ In C source code, use SAL_INT_CAST(type, expr) instead of ((type) (expr))
+ whenever a compiler warning about integer type problems shall be silenced.
+ That way, source code that needs to be modified when the type of any of the
+ expressions involved in the compiler warning is changed can be found more
+ easily.
+
+ The argument 'type' must be an integer type and the argument 'expr' must be
+ an integer expression. Both arguments are evaluated exactly once.
+*/
+#define SAL_INT_CAST(type, expr) ((type) (expr))
+
+#endif /* __cplusplus */
+
+#endif /*_SAL_TYPES_H_ */
+
diff --git a/sal/inc/systools/win32/AutoSystoolInit.hxx b/sal/inc/systools/win32/AutoSystoolInit.hxx
new file mode 100644
index 000000000000..d212ff83c334
--- /dev/null
+++ b/sal/inc/systools/win32/AutoSystoolInit.hxx
@@ -0,0 +1,62 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _AUTOSYSTOOLINIT_HXX_
+#define _AUTOSYSTOOLINIT_HXX_
+
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+
+//------------------------------------------------------------------------
+// class used to automatically initialize/deinitialize the systools
+//------------------------------------------------------------------------
+
+class OAutoSystoolInit
+{
+ typedef void ( WINAPI *LPFNINIT_T )( );
+ typedef void ( WINAPI *LPFNDEINIT_T )( );
+
+public:
+ OAutoSystoolInit( LPFNINIT_T lpfnInit, LPFNDEINIT_T lpfnDeInit ) :
+ m_lpfnDeInit( lpfnDeInit )
+ {
+ if ( NULL != lpfnInit )
+ lpfnInit( );
+ }
+
+ ~OAutoSystoolInit( )
+ {
+ if ( NULL != m_lpfnDeInit )
+ m_lpfnDeInit( );
+ }
+
+private:
+ LPFNDEINIT_T m_lpfnDeInit; // address of the deinit function
+};
+
+#endif
diff --git a/sal/inc/systools/win32/StrConvert.h b/sal/inc/systools/win32/StrConvert.h
new file mode 100644
index 000000000000..f22f68cda46a
--- /dev/null
+++ b/sal/inc/systools/win32/StrConvert.h
@@ -0,0 +1,132 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#ifndef _STRCONVERT_H_
+#define _STRCONVERT_H_
+
+#include <windows.h>
+
+#ifdef NDEBUG
+#define STRCONVERT_H_HAD_NDEBUG
+#undef NDEBUG
+#endif
+#if OSL_DEBUG_LEVEL == 0
+#define NDEBUG
+#endif
+#include <assert.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+int AllocNecessarySpaceAndCopyWStr2Str( LPCWSTR lpcwstrString, LPSTR* lppStr );
+int AllocSpaceAndCopyWStr2Str( LPCWSTR lpcwstrString, DWORD nWCharsToCopy, LPSTR* lppStr );
+int CalcLenDblNullTerminatedWStr( LPCWSTR lpcwstrString );
+int CalcLenDblNullTerminatedStr( LPCSTR lpcstrString );
+void FreeSpaceStr( LPSTR lpszString );
+
+/* WC2MB allocates a sufficient amount of memory on stack and converts
+ the wide char parameter to multi byte string using the actual code
+ page.
+
+ @Param: wcStr - a wide char string
+ mbStr - the corresponding multi byte string
+
+ NOTE: due to the use of _alloca, this must be a macro and no function
+*/
+
+#define WC2MB( wcStr, mbStr ) \
+if( wcStr ) \
+{ \
+ int needed = WideCharToMultiByte( CP_ACP, 0, wcStr, -1, NULL, 0, NULL, NULL ); \
+ if( needed > 0 ) \
+ { \
+ int copied; \
+ mbStr = _alloca( needed * sizeof( CHAR ) ); \
+ copied = WideCharToMultiByte( CP_ACP, 0, wcStr, -1, mbStr, needed, NULL, NULL ); \
+ assert( copied == needed ); \
+ } \
+}
+
+
+/* WideCharListGetMultiByteLength
+ calculates the needed length of a corresponding the multi byte string
+ list for a wide char string list.
+
+ @Param: cp - the code page to use for convertion.
+ wcList - a double '\0' terminated wide char string list.
+*/
+
+int WideCharListGetMultiByteLength( UINT codepage, LPCWSTR wcList );
+
+/* WideCharListToMultiByteList
+ converts a double '\0' terminated list of wide char strings to a
+ multi byte string list.
+
+ @Param: cp - the code page to use for convertion.
+ wcList - a double '\0' terminated wide char string list.
+ mbList - a double '\0' terminated multi byte string list.
+ dwSize - size of buffer for multi byte string list.
+*/
+
+int WideCharListToMultiByteList( UINT codepage, LPCWSTR wcList, LPSTR mbList, DWORD dwSize );
+
+
+/* WCL2MBL allocates a sufficient amount of memory on stack and converts
+ the wide char list parameter to multi byte string list using the actual
+ code page.
+
+ @Param: wcList - a wide char string list
+ mbList - the corresponding multi byte string list
+
+ NOTE: due to the use of _alloca, this must be a macro and no function
+*/
+
+#define WCL2MBL( wcList, mbList ) \
+if( wcList ) \
+{ \
+ int needed = WideCharListGetMultiByteLength( CP_ACP, wcList ); \
+ if( needed > 0 ) \
+ { \
+ int copied; \
+ mbList = _alloca( needed * sizeof( CHAR ) ); \
+ copied = WideCharListToMultiByteList( CP_ACP, wcList, mbList, needed ); \
+ assert( copied == needed ); \
+ } \
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+// Restore NDEBUG state
+#ifdef STRCONVERT_H_HAD_NDEBUG
+#define NDEBUG
+#else
+#undef NDEBUG
+#endif
+
+#endif
diff --git a/sal/inc/systools/win32/SyncObjects.hxx b/sal/inc/systools/win32/SyncObjects.hxx
new file mode 100644
index 000000000000..87057bab6296
--- /dev/null
+++ b/sal/inc/systools/win32/SyncObjects.hxx
@@ -0,0 +1,110 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _SYNCOBJECTS_HXX_
+#define _SYNCOBJECTS_HXX_
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+
+#include <windows.h>
+
+//------------------------------------------------------------------------
+// a simple helper template for automatic locking/unlocking
+//------------------------------------------------------------------------
+
+template< class LOCK >
+class CLockGuard
+{
+public:
+ CLockGuard( LOCK* aLock ) :
+ m_pLock( aLock )
+ {
+ m_pLock->Lock( );
+ }
+
+ ~CLockGuard( )
+ {
+ m_pLock->Unlock( );
+ }
+
+private:
+ LOCK* m_pLock;
+};
+
+//------------------------------------------------------------------------
+// a interface base class for different locking sub classes
+//------------------------------------------------------------------------
+
+class CSyncObject
+{
+public:
+ virtual ~CSyncObject( ) = 0;
+
+ virtual int Lock( ) = 0;
+ virtual int Unlock( ) = 0;
+};
+
+//------------------------------------------------------------------------
+// if no synchronization is necessary this class will be used
+// declaring the functions as inline safes runtime overhead
+//------------------------------------------------------------------------
+
+class CNullLock
+{
+public:
+ inline virtual ~CNullLock ( ) {};
+ inline virtual int Lock( ) {};
+ inline virtual int Unlock() {};
+};
+
+//------------------------------------------------------------------------
+// a minimal wrapper for a win32 critical section
+//------------------------------------------------------------------------
+
+class CCriticalSection : public CSyncObject
+{
+public:
+ CCriticalSection( );
+ virtual ~CCriticalSection( );
+
+ // both functions return always 0
+ // because the win32 critsec functions
+ // don't return any return code
+ virtual int Lock( );
+ virtual int Unlock( );
+
+private:
+ CRITICAL_SECTION m_critSec;
+};
+
+
+typedef CLockGuard< CSyncObject > SyncObjLockGuard_t;
+
+#endif
diff --git a/sal/inc/systools/win32/advapi9x.h b/sal/inc/systools/win32/advapi9x.h
new file mode 100644
index 000000000000..302df89c50c3
--- /dev/null
+++ b/sal/inc/systools/win32/advapi9x.h
@@ -0,0 +1,209 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#pragma once
+
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+//------------------------------------------------------------------------
+// undefine the macros defined in the shlobj.h file in order to avoid
+// warnings because of multiple defines
+//------------------------------------------------------------------------
+
+// begin obsolete Win32 API functions -->
+#ifdef RegOpenKey
+#undef RegOpenKey
+#endif
+#ifdef RegEnumKey
+#undef RegEnumKey
+#endif
+#ifdef RegCreateKey
+#undef RegCreateKey
+#endif
+#ifdef RegQueryValue
+#undef RegQueryValue
+#endif
+#ifdef RegSetValue
+#undef RegSetValue
+#endif
+// <-- end obsolete Win32 functions
+
+#ifdef RegOpenKeyExW
+#undef RegOpenKeyExW
+#endif
+#ifdef RegEnumKeyExW
+#undef RegEnumKeyExW
+#endif
+#ifdef RegCreateKeyExW
+#undef RegCreateKeyExW
+#endif
+#ifdef RegDeleteKeyW
+#undef RegDeleteKeyW
+#endif
+#ifdef RegEnumValueW
+#undef RegEnumValueW
+#endif
+#ifdef RegQueryValueExW
+#undef RegQueryValueExW
+#endif
+#ifdef RegSetValueExW
+#undef RegSetValueExW
+#endif
+#ifdef RegDeleteValueW
+#undef RegDeleteValueW
+#endif
+#ifdef RegQueryInfoKeyW
+#undef RegQueryInfoKeyW
+#endif
+
+//------------------------------------------------------------------------
+// set the compiler directives for the function pointer we declare below
+// if we build sal or sal will be used as static library we define extern
+// else sal exports the function pointers from a dll and we use __declspec
+//------------------------------------------------------------------------
+
+#define ADVAPI9X_API extern
+
+ //------------------------------------------------------------------------
+// declare function pointers to the appropriate shell functions
+//------------------------------------------------------------------------
+
+ADVAPI9X_API LONG (WINAPI * lpfnRegOpenKeyExW) (
+ HKEY hKey, // handle to open key
+ LPCWSTR lpSubKey, // subkey name
+ DWORD ulOptions, // reserved
+ REGSAM samDesired, // security access mask
+ PHKEY phkResult // handle to open key
+);
+
+ADVAPI9X_API LONG (WINAPI *lpfnRegEnumKeyExW) (
+ HKEY hKey, // handle to key to enumerate
+ DWORD dwIndex, // subkey index
+ LPWSTR lpName, // subkey name
+ LPDWORD lpcName, // size of subkey buffer
+ LPDWORD lpReserved, // reserved
+ LPWSTR lpClass, // class string buffer
+ LPDWORD lpcClass, // size of class string buffer
+ PFILETIME lpftLastWriteTime // last write time
+);
+
+ADVAPI9X_API LONG (WINAPI *lpfnRegCreateKeyExW)(
+ HKEY hKey, // handle to open key
+ LPCWSTR lpSubKey, // subkey name
+ DWORD Reserved, // reserved
+ LPWSTR lpClass, // class string
+ DWORD dwOptions, // special options
+ REGSAM samDesired, // desired security access
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance
+ PHKEY phkResult, // key handle
+ LPDWORD lpdwDisposition // disposition value buffer
+);
+
+ADVAPI9X_API LONG (WINAPI *lpfnRegDeleteKeyW) (
+ HKEY hKey, // handle to open key
+ LPCWSTR lpSubKey // subkey name
+);
+
+ADVAPI9X_API LONG (WINAPI *lpfnRegEnumValueW) (
+ HKEY hKey, // handle to key to query
+ DWORD dwIndex, // index of value to query
+ LPWSTR lpValueName, // value buffer
+ LPDWORD lpcValueName, // size of value buffer
+ LPDWORD lpReserved, // reserved
+ LPDWORD lpType, // type buffer
+ LPBYTE lpData, // data buffer
+ LPDWORD lpcbData // size of data buffer
+);
+
+ADVAPI9X_API LONG (WINAPI *lpfnRegQueryValueExW) (
+ HKEY hKey, // handle to key
+ LPCWSTR lpValueName, // value name
+ LPDWORD lpReserved, // reserved
+ LPDWORD lpType, // type buffer
+ LPBYTE lpData, // data buffer
+ LPDWORD lpcbData // size of data buffer
+);
+
+ADVAPI9X_API LONG (WINAPI *lpfnRegSetValueExW)(
+ HKEY hKey, // handle to key
+ LPCWSTR lpValueName, // value name
+ DWORD Reserved, // reserved
+ DWORD dwType, // value type
+ CONST BYTE *lpData, // value data
+ DWORD cbData // size of value data
+);
+
+ADVAPI9X_API LONG (WINAPI *lpfnRegDeleteValueW) (
+ HKEY hKey, // handle to key
+ LPCWSTR lpValueName // value name
+);
+
+ADVAPI9X_API LONG (WINAPI *lpfnRegQueryInfoKeyW) (
+ HKEY hKey, // handle to key to query
+ LPWSTR lpClassW, // address of buffer for class string
+ LPDWORD lpcbClass, // address of size of class string buffer
+ LPDWORD lpReserved, // reserved
+ LPDWORD lpcSubKeys, // address of buffer for number of
+ // subkeys
+ LPDWORD lpcbMaxSubKeyLen, // address of buffer for longest subkey
+ // name length
+ LPDWORD lpcbMaxClassLen, // address of buffer for longest class
+ // string length
+ LPDWORD lpcValues, // address of buffer for number of value
+ // entries
+ LPDWORD lpcbMaxValueNameLen, // address of buffer for longest
+ // value name length
+ LPDWORD lpcbMaxValueLen, // address of buffer for longest value
+ // data length
+ LPDWORD lpcbSecurityDescriptor, // address of buffer for security
+ // descriptor length
+ PFILETIME lpftLastWriteTime // address of buffer for last write time
+);
+
+//------------------------------------------------------------------------
+// redefine the above undefined macros so that the preprocessor replaces
+// all occurrences of this macros with our function pointer
+//------------------------------------------------------------------------
+
+#define RegOpenKeyExW lpfnRegOpenKeyExW
+#define RegEnumKeyExW lpfnRegEnumKeyExW
+#define RegCreateKeyExW lpfnRegCreateKeyExW
+#define RegDeleteKeyW lpfnRegDeleteKeyW
+#define RegEnumValueW lpfnRegEnumValueW
+#define RegQueryValueExW lpfnRegQueryValueExW
+#define RegSetValueExW lpfnRegSetValueExW
+#define RegDeleteValueW lpfnRegDeleteValueW
+#define RegQueryInfoKeyW lpfnRegQueryInfoKeyW
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sal/inc/systools/win32/comdlg9x.h b/sal/inc/systools/win32/comdlg9x.h
new file mode 100644
index 000000000000..ce51bbe61ced
--- /dev/null
+++ b/sal/inc/systools/win32/comdlg9x.h
@@ -0,0 +1,80 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#pragma once
+
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+
+#ifndef _COMMDLG_H_
+#include <commdlg.h>
+#endif
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+//------------------------------------------------------------------------
+// undefine the macros defined in the shlobj.h file in order to avoid
+// warnings because of multiple defines
+//------------------------------------------------------------------------
+
+#ifdef GetOpenFileNameW
+#undef GetOpenFileNameW
+#endif
+
+#ifdef GetSaveFileNameW
+#undef GetSaveFileNameW
+#endif
+
+//------------------------------------------------------------------------
+// set the compiler directives for the function pointer we declare below
+// if we build sal or sal will be used as static library we define extern
+// else sal exports the function pointers from a dll and we use __declspec
+//------------------------------------------------------------------------
+
+#define COMDLG9X_API extern
+
+//------------------------------------------------------------------------
+// declare function pointers to the appropriate comdlg functions
+//------------------------------------------------------------------------
+
+COMDLG9X_API BOOL ( WINAPI * lpfnGetOpenFileNameW ) ( LPOPENFILENAMEW lpofn );
+COMDLG9X_API BOOL ( WINAPI * lpfnGetSaveFileNameW ) ( LPOPENFILENAMEW lpofn );
+
+//------------------------------------------------------------------------
+// redefine the above undefined macros so that the preprocessor replaces
+// all occurrences of this macros with our function pointer
+//------------------------------------------------------------------------
+
+#define GetOpenFileNameW lpfnGetOpenFileNameW
+#define GetSaveFileNameW lpfnGetSaveFileNameW
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sal/inc/systools/win32/comptr.hxx b/sal/inc/systools/win32/comptr.hxx
new file mode 100644
index 000000000000..1e880494b0ea
--- /dev/null
+++ b/sal/inc/systools/win32/comptr.hxx
@@ -0,0 +1,233 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef COMPTR_HXX
+#define COMPTR_HXX
+
+#include <sal/types.h>
+#include <osl/diagnose.h>
+#include <shobjidl.h>
+
+template< class T_INTERFACE ,
+ REFIID P_IID = IID_NULL ,
+ REFCLSID P_CLSID = CLSID_NULL >
+class ComPtr
+{
+ public:
+
+ //---------------------------------------------------------------------
+ /** initialize com ptr with null.
+ */
+ ComPtr()
+ {
+ m_pInterface = NULL;
+ }
+
+ //---------------------------------------------------------------------
+ /** initialize com ptr with given interface.
+ */
+ ComPtr(T_INTERFACE* pInterface)
+ {
+ m_pInterface = pInterface;
+ if (m_pInterface)
+ m_pInterface->AddRef();
+ }
+
+ //---------------------------------------------------------------------
+ /** copy ctor.
+ */
+ ComPtr(const ComPtr< T_INTERFACE, P_IID, P_CLSID >& aCopy)
+ {
+ m_pInterface = aCopy.m_pInterface;
+ if (m_pInterface)
+ m_pInterface->AddRef();
+ }
+
+ //---------------------------------------------------------------------
+ /** initialize object by quering external object for the right interface.
+ */
+ ComPtr(IUnknown* pIUnknown)
+ {
+ if (pIUnknown)
+ pIUnknown->QueryInterface(P_IID, (void**)&m_pInterface);
+ }
+
+ //---------------------------------------------------------------------
+ /** deinitialize com object right.
+ */
+ ~ComPtr()
+ {
+ release();
+ }
+
+ public:
+
+ //---------------------------------------------------------------------
+ HRESULT create()
+ {
+ return CoCreateInstance(P_CLSID, NULL, CLSCTX_ALL, P_IID, (void**)&m_pInterface);
+ }
+
+ //---------------------------------------------------------------------
+ operator T_INTERFACE*() const
+ {
+ return m_pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ T_INTERFACE& operator*() const
+ {
+ return *m_pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ T_INTERFACE** operator&()
+ {
+ return &m_pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ T_INTERFACE* operator->() const
+ {
+ return m_pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ T_INTERFACE* operator=(T_INTERFACE* pInterface)
+ {
+ if ( equals(pInterface) )
+ return m_pInterface;
+
+ m_pInterface->Release();
+ m_pInterface = pInterface;
+ if (m_pInterface)
+ m_pInterface->AddRef();
+
+ return m_pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ T_INTERFACE* operator=(IUnknown* pIUnknown)
+ {
+ if (pIUnknown)
+ pIUnknown->QueryInterface(P_IID, (void**)&m_pInterface);
+ return m_pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ T_INTERFACE* operator=(const ComPtr< T_INTERFACE, P_IID, P_CLSID >& aCopy)
+ {
+ m_pInterface = aCopy.m_pInterface;
+ if (m_pInterface)
+ m_pInterface->AddRef();
+
+ return m_pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ T_INTERFACE* get() const
+ {
+ return m_pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ void attach(T_INTERFACE* pInterface)
+ {
+ if (pInterface)
+ {
+ m_pInterface->Release();
+ m_pInterface = pInterface;
+ }
+ }
+
+ //---------------------------------------------------------------------
+ T_INTERFACE* detach()
+ {
+ T_INTERFACE* pInterface = m_pInterface;
+ m_pInterface = NULL;
+ return pInterface;
+ }
+
+ //---------------------------------------------------------------------
+ void release()
+ {
+ if (m_pInterface)
+ {
+ m_pInterface->Release();
+ m_pInterface = NULL;
+ }
+ }
+
+ //---------------------------------------------------------------------
+ template< class T_QUERYINTERFACE >
+ HRESULT query(T_QUERYINTERFACE** pQuery)
+ {
+ return m_pInterface->QueryInterface(__uuidof(T_QUERYINTERFACE), (void**)pQuery);
+ }
+
+ //---------------------------------------------------------------------
+ HRESULT query(REFIID rIID ,
+ void** pQuery)
+ {
+ return m_pInterface->QueryInterface(rIID, pQuery);
+ }
+
+ //---------------------------------------------------------------------
+ HRESULT unknown(IUnknown** pQuery)
+ {
+ return m_pInterface->QueryInterface(IID_IUnknown, (void**)pQuery);
+ }
+
+ //---------------------------------------------------------------------
+ ::sal_Bool equals(IUnknown* pCheck)
+ {
+ if (
+ ( ! m_pInterface ) &&
+ ( ! pCheck )
+ )
+ return sal_True;
+
+ IUnknown* pCurrent = NULL;
+ m_pInterface->QueryInterface(IID_IUnknown, (void**)&pCurrent);
+
+ ::sal_Bool bEquals = (pCheck == pCurrent);
+ pCurrent->Release();
+
+ return bEquals;
+ }
+
+ //---------------------------------------------------------------------
+ ::sal_Bool is()
+ {
+ return (m_pInterface != 0);
+ }
+
+ private:
+ T_INTERFACE* m_pInterface;
+};
+
+#endif
diff --git a/sal/inc/systools/win32/comtools.hxx b/sal/inc/systools/win32/comtools.hxx
new file mode 100644
index 000000000000..096015517a35
--- /dev/null
+++ b/sal/inc/systools/win32/comtools.hxx
@@ -0,0 +1,194 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#pragma once
+
+#include <string>
+#include <stdexcept>
+#if defined _MSC_VER
+#pragma warning(push,1)
+#endif
+#include <objbase.h>
+#if defined _MSC_VER
+#pragma warning(pop)
+#endif
+
+namespace sal
+{
+namespace systools
+{
+ typedef int HRESULT;
+
+ /* Simple exception class for propagating COM errors */
+ class ComError : public std::runtime_error
+ {
+ public:
+ ComError(const std::string& message, HRESULT hr) :
+ std::runtime_error(message),
+ hr_(hr)
+ {}
+
+ HRESULT GetHresult() const
+ {
+ return hr_;
+ }
+
+ private:
+ HRESULT hr_;
+ };
+
+ /* A simple COM smart pointer template */
+ template <typename T>
+ class COMReference
+ {
+ public:
+ COMReference() :
+ com_ptr_(NULL)
+ {
+ }
+
+ explicit COMReference(T* comptr) :
+ com_ptr_(comptr)
+ {
+ addRef();
+ }
+
+ /* Explicitly controllable whether AddRef will be called or not */
+ COMReference(T* comptr, bool bAddRef) :
+ com_ptr_(comptr)
+ {
+ if (bAddRef)
+ addRef();
+ }
+
+ COMReference(const COMReference<T>& other) :
+ com_ptr_(other.com_ptr_)
+ {
+ addRef();
+ }
+
+ COMReference<T>& operator=(const COMReference<T>& other)
+ {
+ if (other.com_ptr_)
+ other.com_ptr_->AddRef();
+ release();
+ com_ptr_ = other.com_ptr_;
+ return *this;
+ }
+
+ COMReference<T>& operator=(T* comptr)
+ {
+ release();
+ com_ptr_ = comptr;
+ addRef();
+ return *this;
+ }
+
+ ~COMReference()
+ {
+ release();
+ }
+
+ template<typename InterfaceType>
+ COMReference<InterfaceType> QueryInterface(REFIID iid)
+ {
+ COMReference<InterfaceType> ip;
+ HRESULT hr = E_FAIL;
+ if (com_ptr_)
+ hr = com_ptr_->QueryInterface(iid, reinterpret_cast<LPVOID*>(&ip));
+
+ if (FAILED(hr))
+ throw ComError("QueryInterface failed: Interface not supported!", hr);
+
+ return ip;
+ }
+
+ T* operator->() const
+ {
+ return com_ptr_;
+ }
+
+ T& operator*() const
+ {
+ return *com_ptr_;
+ }
+
+ /* Necessary for assigning com_ptr_ from functions like
+ CoCreateInstance which require a 'void**' */
+ T** operator&()
+ {
+ release();
+ com_ptr_ = NULL;
+ return &com_ptr_;
+ }
+
+ T* get() const
+ {
+ return com_ptr_;
+ }
+
+ COMReference<T>& clear()
+ {
+ release();
+ com_ptr_ = NULL;
+ return *this;
+ }
+
+ bool is() const
+ {
+ return (com_ptr_ != NULL);
+ }
+
+ private:
+ ULONG addRef()
+ {
+ ULONG cnt = 0;
+ if (com_ptr_)
+ cnt = com_ptr_->AddRef();
+ return cnt;
+ }
+
+ ULONG release()
+ {
+ ULONG cnt = 0;
+ if (com_ptr_)
+ cnt = com_ptr_->Release();
+ return cnt;
+ }
+
+ private:
+ T* com_ptr_;
+ };
+
+} // systools
+} // sal
+
+/* Typedefs for some popular COM interfaces */
+typedef sal::systools::COMReference<IDataObject> IDataObjectPtr;
+typedef sal::systools::COMReference<IStream> IStreamPtr;
+typedef sal::systools::COMReference<IEnumFORMATETC> IEnumFORMATETCPtr;
+
diff --git a/sal/inc/systools/win32/kernel9x.h b/sal/inc/systools/win32/kernel9x.h
new file mode 100644
index 000000000000..647e7d58542d
--- /dev/null
+++ b/sal/inc/systools/win32/kernel9x.h
@@ -0,0 +1,383 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#pragma once
+
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//------------------------------------------------------------------------
+// undefine the macros defined in the winbase.h file in order to avoid
+// warnings because of multiple defines
+//------------------------------------------------------------------------
+
+#ifdef LoadLibraryW
+#undef LoadLibraryW
+#endif
+
+#ifdef LoadLibraryExW
+#undef LoadLibraryExW
+#endif
+
+#ifdef GetModuleFileNameW
+#undef GetModuleFileNameW
+#endif
+
+#ifdef GetLogicalDriveStringsW
+#undef GetLogicalDriveStringsW
+#endif
+
+#ifdef DeleteFileW
+#undef DeleteFileW
+#endif
+
+#ifdef CopyFileW
+#undef CopyFileW
+#endif
+
+#ifdef MoveFileW
+#undef MoveFileW
+#endif
+
+#ifdef MoveFileExW
+#undef MoveFileExW
+#endif
+
+#ifdef CreateFileW
+#undef CreateFileW
+#endif
+
+#ifdef RemoveDirectoryW
+#undef RemoveDirectoryW
+#endif
+
+#ifdef CreateDirectoryW
+#undef CreateDirectoryW
+#endif
+
+#ifdef CreateDirectoryExW
+#undef CreateDirectoryExW
+#endif
+
+#ifdef CreateFileW
+#undef CreateFileW
+#endif
+
+#ifdef GetLongPathNameW
+#undef GetLongPathNameW
+#endif
+
+#ifdef GetLocaleInfoW
+#undef GetLocaleInfoW
+#endif
+
+#ifdef GetFullPathNameW
+#undef GetFullPathNameW
+#endif
+
+#ifdef CreateProcessW
+#undef CreateProcessW
+#endif
+
+#ifdef CreateProcessAsUserW
+#undef CreateProcessAsUserW
+#endif
+
+#ifdef GetEnvironmentVariableW
+#undef GetEnvironmentVariableW
+#endif
+
+#ifdef GetDriveTypeW
+#undef GetDriveTypeW
+#endif
+
+#ifdef GetCurrentDirectoryW
+#undef GetCurrentDirectoryW
+#endif
+
+#ifdef SetCurrentDirectoryW
+#undef SetCurrentDirectoryW
+#endif
+
+#ifdef GetVolumeInformationW
+#undef GetVolumeInformationW
+#endif
+
+
+#ifdef GetDiskFreeSpaceExA
+#undef GetDiskFreeSpaceExA
+#endif
+
+#ifdef GetDiskFreeSpaceExW
+#undef GetDiskFreeSpaceExW
+#endif
+
+//------------------------------------------------------------------------
+// set the compiler directives for the function pointer we declare below
+// if we build sal or sal will be used as static library we define extern
+// else sal exports the function pointers from a dll and we use __declspec
+//------------------------------------------------------------------------
+
+#define KERNEL9X_API extern
+
+//------------------------------------------------------------------------
+// declare function pointers to the appropriate kernel functions
+//------------------------------------------------------------------------
+
+//BOOL WINAPI RegisterServiceProcess( DWORD dwProcessID, BOOL fRegister );
+
+KERNEL9X_API HMODULE (WINAPI *lpfnLoadLibraryExW ) (
+ LPCWSTR lpLibFileName, // file name of module
+ HANDLE hFile, // reserved, must be NULL
+ DWORD dwFlags // entry-point execution option
+);
+
+KERNEL9X_API DWORD (WINAPI *lpfnGetModuleFileNameW ) (
+ HMODULE hModule, // handle to module
+ LPWSTR lpFilename, // file name of module
+ DWORD nSize // size of buffer
+);
+
+KERNEL9X_API DWORD (WINAPI *lpfnGetLogicalDriveStringsW ) (
+ DWORD nBufferLength, // size of buffer
+ LPWSTR lpBuffer // drive strings buffer
+);
+
+KERNEL9X_API HANDLE ( WINAPI *lpfnCreateFileW )(
+ LPCWSTR lpFileName,
+ DWORD dwDesiredAccess,
+ DWORD dwShareMode,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
+ DWORD dwCreationDisposition,
+ DWORD dwFlagsAndAttributes,
+ HANDLE hTemplateFile
+);
+
+KERNEL9X_API DWORD WINAPI GetCanonicalPathNameA(
+ LPCSTR lpszPath, // file name
+ LPSTR lpszCanonicalPath, // path buffer
+ DWORD cchBuffer // size of path buffer
+);
+
+KERNEL9X_API DWORD WINAPI GetCanonicalPathNameW(
+ LPCWSTR lpszPath, // file name
+ LPWSTR lpszCanonicalPath, // path buffer
+ DWORD cchBuffer // size of path buffer
+);
+
+KERNEL9X_API HANDLE ( WINAPI * lpfnCreateFileW ) (
+ LPCWSTR lpFileName,
+ DWORD dwDesiredAccess,
+ DWORD dwShareMode,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
+ DWORD dwCreationDisposition,
+ DWORD dwFlagsAndAttributes,
+ HANDLE hTemplateFile );
+
+KERNEL9X_API BOOL (WINAPI *lpfnDeleteFileW ) (
+ LPCWSTR lpFileName // file name
+);
+
+KERNEL9X_API BOOL (WINAPI *lpfnCopyFileW ) (
+ LPCWSTR lpExistingFileName, // file name
+ LPCWSTR lpNewFileName, // new file name
+ BOOL bFailIfExist // operation if file exists
+);
+
+KERNEL9X_API BOOL (WINAPI *lpfnMoveFileW ) (
+ LPCWSTR lpExistingFileName, // file name
+ LPCWSTR lpNewFileName // new file name
+);
+
+KERNEL9X_API BOOL (WINAPI *lpfnMoveFileExW ) (
+ LPCWSTR lpExistingFileName, // file name
+ LPCWSTR lpNewFileName, // new file name
+ DWORD dwFlags // move options
+);
+
+KERNEL9X_API BOOL (WINAPI *lpfnRemoveDirectoryW ) (
+ LPCWSTR lpPathName // directory name
+);
+
+KERNEL9X_API BOOL ( WINAPI * lpfnCreateDirectoryW ) (
+ LPCWSTR lpNewDirectory, LPSECURITY_ATTRIBUTES lpSecurityAttributes );
+
+KERNEL9X_API BOOL ( WINAPI * lpfnCreateDirectoryExW ) (
+ LPCWSTR lpTemplateDirectory,
+ LPCWSTR lpNewDirectory,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes );
+
+KERNEL9X_API DWORD ( WINAPI * lpfnGetLongPathNameW ) (
+ LPCWSTR lpszShortPath, // file name
+ LPWSTR lpszLongPath, // path buffer
+ DWORD cchBuffer // size of path buffer
+);
+
+// GetCanonicalPath is a tool function with no exact counterpart
+// in the win32 api; we use nevertheless a function pointer
+// because every variable etc. must root in the Kernel9x.lib else
+// we loose our AutoSystoolInit object during linking
+KERNEL9X_API DWORD ( WINAPI * lpfnGetCanonicalPathW ) (
+ LPCWSTR lpszPath, // file name
+ LPWSTR lpszCanonicalPath, // path buffer
+ DWORD cchBuffer // size of path buffer
+);
+
+KERNEL9X_API int ( WINAPI* lpfnGetLocaleInfoW ) (
+ LCID Locale, // locale identifier
+ LCTYPE LCType, // information type
+ LPWSTR lpLCData, // information buffer
+ int cchData // size of buffer
+);
+
+KERNEL9X_API DWORD ( WINAPI * lpfnGetFullPathNameW )(
+ LPCWSTR lpFileName, // file name
+ DWORD nBufferLength, // size of path buffer
+ LPWSTR lpBuffer, // path buffer
+ LPWSTR *lpFilePart // address of file name in path
+);
+
+KERNEL9X_API BOOL ( WINAPI * lpfnCreateProcessW )(
+ LPCWSTR lpApplicationName, // name of executable module
+ LPWSTR lpCommandLine, // command line string
+ LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
+ LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
+ BOOL bInheritHandles, // handle inheritance option
+ DWORD dwCreationFlags, // creation flags
+ LPVOID lpEnvironment, // new environment block
+ LPCWSTR lpCurrentDirectory, // current directory name
+ LPSTARTUPINFOW lpStartupInfo, // startup information
+ LPPROCESS_INFORMATION lpProcessInformation // process information
+);
+
+KERNEL9X_API BOOL ( WINAPI * lpfnCreateProcessAsUserW )(
+ HANDLE hToken, // handle to user token
+ LPCWSTR lpApplicationName, // name of executable module
+ LPWSTR lpCommandLine, // command-line string
+ LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
+ LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
+ BOOL bInheritHandles, // inheritance option
+ DWORD dwCreationFlags, // creation flags
+ LPVOID lpEnvironment, // new environment block
+ LPCWSTR lpCurrentDirectory, // current directory name
+ LPSTARTUPINFOW lpStartupInfo, // startup information
+ LPPROCESS_INFORMATION lpProcessInformation // process information
+);
+
+KERNEL9X_API DWORD ( WINAPI * lpfnGetEnvironmentVariableW )(
+ LPCWSTR lpName, // environment variable name
+ LPWSTR lpBuffer, // buffer for variable value
+ DWORD nSize // size of buffer
+);
+
+
+KERNEL9X_API UINT ( WINAPI * lpfnGetDriveTypeW )(
+ LPCWSTR lpRootPathName // root directory
+);
+
+KERNEL9X_API DWORD ( WINAPI * lpfnGetCurrentDirectoryW )(
+ DWORD nBufferLength, // size of directory buffer
+ LPWSTR lpBuffer // directory buffer
+);
+
+KERNEL9X_API BOOL ( WINAPI * lpfnSetCurrentDirectoryW )(
+ LPCWSTR lpPathName // new directory name
+);
+
+// GetVolumeInformation
+KERNEL9X_API BOOL ( WINAPI* lpfnGetVolumeInformationW )(
+ LPCWSTR lpRootPathName, // root directory
+ LPWSTR lpVolumeNameBuffer, // volume name buffer
+ DWORD nVolumeNameSize, // length of name buffer
+ LPDWORD lpVolumeSerialNumber, // volume serial number
+ LPDWORD lpMaximumComponentLength, // maximum file name length
+ LPDWORD lpFileSystemFlags, // file system options
+ LPWSTR lpFileSystemName, // file system name buffer
+ DWORD nFileSystemNameSize // length of file system name buffer
+);
+
+// GetDiskFreeSpaceExA
+KERNEL9X_API BOOL (WINAPI *lpfnGetDiskFreeSpaceExA)(
+ LPCSTR lpDirectoryName, // directory name
+ PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller
+ PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk
+ PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
+);
+
+// GetDiskFreeSpaceExW
+KERNEL9X_API BOOL (WINAPI *lpfnGetDiskFreeSpaceExW)(
+ LPCWSTR lpDirectoryName, // directory name
+ PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller
+ PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk
+ PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
+);
+
+//------------------------------------------------------------------------
+// redefine the above undefined macros so that the preprocessor replaces
+// all occurrences of this macros with our function pointer
+//------------------------------------------------------------------------
+
+#define LoadLibraryExW lpfnLoadLibraryExW
+#define LoadLibraryW(c) LoadLibraryExW(c, NULL, 0)
+#define GetModuleFileNameW lpfnGetModuleFileNameW
+#define GetLogicalDriveStringsW lpfnGetLogicalDriveStringsW
+#define CreateFileW lpfnCreateFileW
+#define DeleteFileW lpfnDeleteFileW
+#define CopyFileW lpfnCopyFileW
+#define MoveFileW lpfnMoveFileW
+#define MoveFileExW lpfnMoveFileExW
+#define RemoveDirectoryW lpfnRemoveDirectoryW
+#define CreateDirectoryW lpfnCreateDirectoryW
+#define CreateDirectoryExW lpfnCreateDirectoryExW
+#define GetLongPathNameW lpfnGetLongPathNameW
+#define GetFullPathNameW lpfnGetFullPathNameW
+
+#define GetCanonicalPath lpfnGetCanonicalPathW
+#define GetLocaleInfoW lpfnGetLocaleInfoW
+
+#define CreateProcessW lpfnCreateProcessW
+#define CreateProcessAsUserW lpfnCreateProcessAsUserW
+#define GetEnvironmentVariableW lpfnGetEnvironmentVariableW
+#define GetDriveTypeW lpfnGetDriveTypeW
+
+#define GetCurrentDirectoryW lpfnGetCurrentDirectoryW
+#define SetCurrentDirectoryW lpfnSetCurrentDirectoryW
+
+#define GetVolumeInformationW lpfnGetVolumeInformationW
+#define GetDiskFreeSpaceExA lpfnGetDiskFreeSpaceExA
+#define GetDiskFreeSpaceExW lpfnGetDiskFreeSpaceExW
+
+#ifdef __cplusplus
+}
+#endif
+
+
diff --git a/sal/inc/systools/win32/mpr9x.h b/sal/inc/systools/win32/mpr9x.h
new file mode 100644
index 000000000000..15b122025381
--- /dev/null
+++ b/sal/inc/systools/win32/mpr9x.h
@@ -0,0 +1,72 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#pragma once
+
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+//------------------------------------------------------------------------
+// undefine the macros defined in the winuser.h file in order to avoid
+// warnings because of multiple defines
+//------------------------------------------------------------------------
+
+#ifdef WNetGetConnectionW
+#undef WNetGetConnectionW
+#endif
+
+//------------------------------------------------------------------------
+// defines
+//------------------------------------------------------------------------
+
+#define MPR9X_API extern
+
+//------------------------------------------------------------------------
+// declare function pointers to the appropriate user32 functions
+//------------------------------------------------------------------------
+
+MPR9X_API DWORD (WINAPI *lpfnWNetGetConnectionW)(
+ LPCWSTR lpLocalName, // pointer to local name
+ LPWSTR lpRemoteName, // pointer to buffer for remote name
+ LPDWORD lpnLength // pointer to buffer size, in characters
+);
+
+//------------------------------------------------------------------------
+// redefine the above undefined macros so that the preprocessor replaces
+// all occurrences of this macros with our function pointer
+//------------------------------------------------------------------------
+
+#define WNetGetConnectionW lpfnWNetGetConnectionW
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sal/inc/systools/win32/shell9x.h b/sal/inc/systools/win32/shell9x.h
new file mode 100644
index 000000000000..30716314830d
--- /dev/null
+++ b/sal/inc/systools/win32/shell9x.h
@@ -0,0 +1,101 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#pragma once
+
+#ifndef _SHELL9X_H_
+#define _SHELL9X_H_
+
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+
+#ifndef _SHLOBJ_H_
+#include <shlobj.h>
+#endif
+
+#include <shellapi.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+//------------------------------------------------------------------------
+// undefine the macros defined in the shlobj.h file in order to avoid
+// warnings because of multiple defines
+//------------------------------------------------------------------------
+
+#ifdef CommandLineToArgvW
+#undef CommandLineToArgvW
+#endif
+
+#ifdef SHBrowseForFolderW
+#undef SHBrowseForFolderW
+#endif
+
+#ifdef SHGetPathFromIDListW
+#undef SHGetPathFromIDListW
+#endif
+
+#ifdef ShellExecuteExW
+#undef ShellExecuteExW
+#endif
+
+//------------------------------------------------------------------------
+// set the compiler directives for the function pointer we declare below
+// if we build sal or sal will be used as static library we define extern
+// else sal exports the function pointers from a dll and we use __declspec
+//------------------------------------------------------------------------
+
+#define SHELL9X_API extern
+
+//------------------------------------------------------------------------
+// declare function pointers to the appropriate shell functions
+//------------------------------------------------------------------------
+
+SHELL9X_API LPWSTR * ( WINAPI * lpfnCommandLineToArgvW ) ( LPCWSTR lpCmdLine, int *pNumArgs );
+SHELL9X_API LPITEMIDLIST ( WINAPI * lpfnSHBrowseForFolderW ) ( LPBROWSEINFOW lpbi );
+SHELL9X_API BOOL ( WINAPI * lpfnSHGetPathFromIDListW ) ( LPCITEMIDLIST pidl, LPWSTR pszPath );
+
+SHELL9X_API BOOL ( WINAPI * lpfnShellExecuteExW ) ( LPSHELLEXECUTEINFOW lpExecInfo );
+
+//------------------------------------------------------------------------
+// redefine the above undefined macros so that the preprocessor replaces
+// all occurrences of this macros with our function pointer
+//------------------------------------------------------------------------
+
+#define CommandLineToArgvW lpfnCommandLineToArgvW
+#define SHBrowseForFolderW lpfnSHBrowseForFolderW
+#define SHGetPathFromIDListW lpfnSHGetPathFromIDListW
+
+#define ShellExecuteExW lpfnShellExecuteExW
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/inc/systools/win32/snprintf.h b/sal/inc/systools/win32/snprintf.h
new file mode 100644
index 000000000000..79441f032fee
--- /dev/null
+++ b/sal/inc/systools/win32/snprintf.h
@@ -0,0 +1,80 @@
+#ifndef _SNPRINTF_H
+#define _SNPRINTF_H
+
+#if !defined(_WIN32)
+#error ERROR: Only Win32 target supported!
+#endif
+
+/* Macros for Unicode/ANSI support like in TCHAR.H */
+
+#ifdef _UNICODE
+#define sntprintf snwprintf
+#define vsntprintf vsnwprintf
+#else
+#define sntprintf snprintf
+#define vsntprintf vsnprintf
+#endif
+
+/* Define needed types if they are not yet defined */
+
+#if 0
+# ifndef _INC_STDARG
+# include <stdarg.h>
+# endif
+#else
+# ifndef _VA_LIST_DEFINED
+ typedef char * va_list;
+# define _VA_LIST_DEFINED
+# endif
+#endif
+
+#if 0
+# ifndef _INC_WCHAR
+# include <wchar.h>
+# endif
+#else
+# ifndef _WCHAR_T_DEFINED
+ typedef unsigned short wchar_t;
+# define _WCHAR_T_DEFINED
+# endif
+#endif
+
+#ifndef _SNPRINTF_DLLIMPORT
+#define _SNPRINTF_DLLIMPORT __declspec( dllimport )
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Implementations of snprintf following the ISO/IEC 9899:1999 (ISO C99)
+ standard.
+ The difference compared to _snprintf is that the buffer always is zero
+ terminated (unless count is zero) and the return value is the number of
+ characters (not including terminating zero) that would have been written
+ even if the buffer wasn't large
+ enough to hold the string. */
+
+
+
+/* UNICODE version */
+_SNPRINTF_DLLIMPORT int __cdecl snwprintf( wchar_t *buffer, size_t count, const wchar_t *format, ... );
+
+/* SBCS and MBCS version */
+_SNPRINTF_DLLIMPORT int __cdecl snprintf( char *buffer, size_t count, const char *format, ... );
+
+/* Conflict with STL_port inline implementation */
+#if 0
+/* UNICODE version */
+_SNPRINTF_DLLIMPORT int __cdecl vsnwprintf( wchar_t *buffer, size_t count, const wchar_t *format, va_list ap );
+
+/* SBCS and MBCS version */
+_SNPRINTF_DLLIMPORT int __cdecl vsnprintf( char *buffer, size_t count, const char *format, va_list ap );
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SNPRINTF_H */
diff --git a/sal/inc/systools/win32/user9x.h b/sal/inc/systools/win32/user9x.h
new file mode 100644
index 000000000000..da30bf222836
--- /dev/null
+++ b/sal/inc/systools/win32/user9x.h
@@ -0,0 +1,192 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#pragma once
+
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+//------------------------------------------------------------------------
+// undefine the macros defined in the winuser.h file in order to avoid
+// warnings because of multiple defines
+//------------------------------------------------------------------------
+
+#ifdef SendMessageW
+#undef SendMessageW
+#endif
+
+#ifdef CreateWindowExW
+#undef CreateWindowExW
+#endif
+
+#ifdef RegisterClassExW
+#undef RegisterClassExW
+#endif
+
+#ifdef UnregisterClassW
+#undef UnregisterClassW
+#endif
+
+#ifdef RegisterClipboardFormatW
+#undef RegisterClipboardFormatW
+#endif
+
+#ifdef GetClipboardFormatNameW
+#undef GetClipboardFormatNameW
+#endif
+
+#ifdef SetWindowTextW
+#undef SetWindowTextW
+#endif
+
+#ifdef GetWindowTextW
+#undef GetWindowTextW
+#endif
+
+#ifdef InsertMenuItemW
+#undef InsertMenuItemW
+#endif
+
+#ifndef DrawTextW
+#undef DrawTextW
+#endif
+
+//------------------------------------------------------------------------
+// defines
+//------------------------------------------------------------------------
+
+#define USER9X_API extern
+
+//------------------------------------------------------------------------
+// declare function pointers to the appropriate user32 functions
+//------------------------------------------------------------------------
+
+USER9X_API LRESULT ( WINAPI * lpfnSendMessageW) (
+ HWND hWnd, // handle to the destination window
+ UINT Msg, // message
+ WPARAM wParam, // first message parameter
+ LPARAM lParam // second message parameter
+);
+
+USER9X_API HWND ( WINAPI * lpfnCreateWindowExW ) (
+ DWORD dwExStyle, // extended window style
+ LPCWSTR lpClassName, // registered class name
+ LPCWSTR lpWindowName, // window name
+ DWORD dwStyle, // window style
+ int x, // horizontal position of window
+ int y, // vertical position of window
+ int nWidth, // window width
+ int nHeight, // window height
+ HWND hWndParent, // handle to parent or owner window
+ HMENU hMenu, // menu handle or child identifier
+ HINSTANCE hInstance, // handle to application instance
+ LPVOID lpParam // window-creation data
+);
+
+USER9X_API ATOM ( WINAPI * lpfnRegisterClassExW ) (
+ CONST WNDCLASSEXW* lpwcx // class data
+);
+
+USER9X_API BOOL ( WINAPI * lpfnUnregisterClassW ) (
+ LPCWSTR lpClassName, // class name
+ HINSTANCE hInstance // handle to application instance
+);
+
+USER9X_API UINT (WINAPI * lpfnRegisterClipboardFormatW) (
+ LPCWSTR lpszFormat // name of new format
+);
+
+USER9X_API int ( WINAPI * lpfnGetClipboardFormatNameW ) (
+ UINT format, // clipboard format to retrieve
+ LPWSTR lpszFormatName, // format name
+ int cchMaxCount // length of format name buffer
+);
+
+USER9X_API BOOL ( WINAPI * lpfnSetWindowTextW ) (
+ HWND hWnd,
+ LPCWSTR lpString
+);
+
+USER9X_API int ( WINAPI * lpfnGetWindowTextW ) (
+ HWND hWnd, // handle to the window or control
+ LPWSTR lpString, // text buffer
+ int nMaxCount // length of text buffer
+);
+
+USER9X_API BOOL ( WINAPI * lpfnInsertMenuItemW ) (
+ HMENU hMenu, // handle to menu
+ UINT uItem, // identifier or position
+ BOOL fByPosition, // meaning of uItem
+ LPCMENUITEMINFOW lpmii // menu item information
+);
+
+USER9X_API int ( WINAPI * lpfnDrawTextW ) (
+ HDC hDC, // handle to DC
+ LPCWSTR lpString, // text to draw
+ int nCount, // text length
+ LPRECT lpRect, // formatting dimensions
+ UINT uFormat // text-drawing options
+);
+
+USER9X_API BOOL ( WINAPI * lpfnDrawStateW ) (
+ HDC hdc, // handle to device context
+ HBRUSH hbr, // handle to brush
+ DRAWSTATEPROC lpOutputFunc, // callback function
+ LPARAM lData, // image information
+ WPARAM wData, // more image information
+ int x, // horizontal location
+ int y, // vertical location
+ int cx, // image width
+ int cy, // image height
+ UINT fuFlags // image type and state
+);
+
+//------------------------------------------------------------------------
+// redefine the above undefined macros so that the preprocessor replaces
+// all occurrences of this macros with our function pointer
+//------------------------------------------------------------------------
+
+#define SendMessageW lpfnSendMessageW
+#define CreateWindowExW lpfnCreateWindowExW
+#define RegisterClassExW lpfnRegisterClassExW
+#define UnregisterClassW lpfnUnregisterClassW
+#define RegisterClipboardFormatW lpfnRegisterClipboardFormatW
+#define GetClipboardFormatNameW lpfnGetClipboardFormatNameW
+#define SetWindowTextW lpfnSetWindowTextW
+#define GetWindowTextW lpfnGetWindowTextW
+#define InsertMenuItemW lpfnInsertMenuItemW
+#define DrawTextW lpfnDrawTextW
+#define DrawStateW lpfnDrawStateW
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/sal/inc/systools/win32/uwinapi.h b/sal/inc/systools/win32/uwinapi.h
new file mode 100644
index 000000000000..8c55ae6cf275
--- /dev/null
+++ b/sal/inc/systools/win32/uwinapi.h
@@ -0,0 +1,121 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#pragma once
+
+#ifdef _UWINAPI_
+# define _KERNEL32_
+# define _USER32_
+# define _SHELL32_
+#endif
+
+#ifndef _WINDOWS_
+#ifdef _MSC_VER
+# pragma warning(push,1) /* disable warnings within system headers */
+#endif
+# include <windows.h>
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif
+#endif
+
+#ifdef __MINGW32__
+#include <basetyps.h>
+#ifdef _UWINAPI_
+#define WINBASEAPI
+#endif
+#endif
+
+/** GetUserDomain
+
+The GetUserDomain function retrieves the name of the NT domain the user is
+logged in.
+
+Parameters
+ @param lpBuffer
+ [out] Pointer to a buffer that receives a null-terminated string
+ containing the domain name.
+ @param nBufferSize
+ [in] Specifies the size, in TCHARs, of the buffer pointed to
+ by the lpBuffer parameter.
+
+
+Return Values
+ @return
+ If the function succeeds, the return value is the number of TCHARs stored
+ into the buffer pointed to by lpBuffer, not including the terminating
+ null character.
+
+ If the domain name can't be retrieved, the return value is zero.
+
+ If the buffer pointed to by lpBuffer is not large enough, the return value
+ is the buffer size, in TCHARs, required to hold the value string and its
+ terminating null character.
+
+Remarks
+ Windows 95/98/Me: If the user is not logged in onto a NT domain server
+ the name of the workgroup is returned.
+
+Requirements
+ Windows NT/2000/XP: Included in Windows NT 4 and later.
+ Windows 95/98/Me: Included in Windows 95 and later.
+ Header: Declared in Uwinapi.h; include Uwinapi.h.
+ Library: Use Uwinapi.lib.
+ Unicode: Implemented as Unicode and ANSI versions on Windows 95/98/Me/NT/2000/XP.
+
+See Also
+@see
+*/
+
+EXTERN_C WINBASEAPI DWORD WINAPI GetUserDomainA( LPSTR lpBuffer, DWORD nBuffserSize );
+EXTERN_C WINBASEAPI DWORD WINAPI GetUserDomainW( LPWSTR lpBuffer, DWORD nBuffserSize );
+
+#ifdef UNICODE
+#define GetUserDomain GetUserDomainW
+#else
+#define GetUserDomain GetUserDomainA
+#endif
+
+EXTERN_C WINBASEAPI DWORD WINAPI GetProcessId( HANDLE hProcess );
+
+/* macro that calculates the count of elements of a static array */
+
+#define elementsof(buf) (sizeof(buf) / sizeof((buf)[0]))
+
+#ifdef __cplusplus
+
+inline bool IsValidHandle(HANDLE handle)
+{
+ return handle != INVALID_HANDLE_VALUE && handle != NULL;
+}
+
+#else /* __cplusplus */
+
+#define IsValidHandle(Handle) ((DWORD)(Handle) + 1 > 1)
+
+#endif /* __cplusplus */
+
diff --git a/sal/osl/all/debugbase.cxx b/sal/osl/all/debugbase.cxx
new file mode 100644
index 000000000000..10679cb45ccb
--- /dev/null
+++ b/sal/osl/all/debugbase.cxx
@@ -0,0 +1,161 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "rtl/strbuf.hxx"
+#include "rtl/string.hxx"
+#include "rtl/ustring.hxx"
+#include "osl/process.h"
+#include "osl/diagnose.hxx"
+#include "boost/bind.hpp"
+#include <vector>
+
+// define own ones, independent of OSL_DEBUG_LEVEL:
+#define DEBUGBASE_ENSURE_(c, f, l, m) \
+ do \
+ { \
+ if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, m)) \
+ _OSL_GLOBAL osl_breakDebug(); \
+ } while (0)
+#define DEBUGBASE_ENSURE(c, m) DEBUGBASE_ENSURE_(c, OSL_THIS_FILE, __LINE__, m)
+
+namespace {
+
+typedef std::vector<rtl::OString, rtl::Allocator<rtl::OString> > OStringVec;
+
+struct StaticDebugBaseAddressFilter
+ : rtl::StaticWithInit<OStringVec const, StaticDebugBaseAddressFilter> {
+ OStringVec const operator()() const {
+ OStringVec vec;
+ rtl_uString * pStr = 0;
+ rtl::OUString const name(
+ RTL_CONSTASCII_USTRINGPARAM("OSL_DEBUGBASE_STORE_ADDRESSES") );
+ if (osl_getEnvironment( name.pData, &pStr ) == osl_Process_E_None) {
+ rtl::OUString const str(pStr);
+ rtl_uString_release(pStr);
+ sal_Int32 nIndex = 0;
+ do {
+ vec.push_back( rtl::OUStringToOString(
+ str.getToken( 0, ';', nIndex ),
+ RTL_TEXTENCODING_ASCII_US ) );
+ }
+ while (nIndex >= 0);
+ }
+ return vec;
+ }
+};
+
+inline bool isSubStr( char const* pStr, rtl::OString const& subStr )
+{
+ return rtl_str_indexOfStr( pStr, subStr.getStr() ) >= 0;
+}
+
+struct DebugBaseMutex : ::rtl::Static<osl::Mutex, DebugBaseMutex> {};
+
+} // anon namespace
+
+extern "C" {
+
+osl::Mutex & SAL_CALL osl_detail_ObjectRegistry_getMutex()
+ SAL_THROW_EXTERN_C()
+{
+ return DebugBaseMutex::get();
+}
+
+bool SAL_CALL osl_detail_ObjectRegistry_storeAddresses( char const* pName )
+ SAL_THROW_EXTERN_C()
+{
+ OStringVec const& rVec = StaticDebugBaseAddressFilter::get();
+ if (rVec.empty())
+ return false;
+ // check for "all":
+ rtl::OString const& rFirst = rVec[0];
+ if (rtl_str_compare_WithLength( rFirst.getStr(), rFirst.getLength(),
+ RTL_CONSTASCII_STRINGPARAM("all") ) == 0)
+ return true;
+ OStringVec::const_iterator const iEnd( rVec.end() );
+ return std::find_if( rVec.begin(), iEnd,
+ boost::bind( &isSubStr, pName, _1 ) ) != iEnd;
+}
+
+bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount(
+ osl::detail::ObjectRegistryData const& rData, std::size_t nExpected )
+ SAL_THROW_EXTERN_C()
+{
+ std::size_t nSize;
+ if (rData.m_bStoreAddresses)
+ nSize = rData.m_addresses.size();
+ else
+ nSize = static_cast<std::size_t>(rData.m_nCount);
+
+ bool const bRet = (nSize == nExpected);
+ if (! bRet) {
+ rtl::OStringBuffer buf;
+ buf.append( RTL_CONSTASCII_STRINGPARAM("unexpected number of ") );
+ buf.append( rData.m_pName );
+ buf.append( RTL_CONSTASCII_STRINGPARAM(": ") );
+ buf.append( static_cast<sal_Int64>(nSize) );
+ DEBUGBASE_ENSURE( false, buf.makeStringAndClear().getStr() );
+ }
+ return bRet;
+}
+
+void SAL_CALL osl_detail_ObjectRegistry_registerObject(
+ osl::detail::ObjectRegistryData & rData, void const* pObj )
+ SAL_THROW_EXTERN_C()
+{
+ if (rData.m_bStoreAddresses) {
+ osl::MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() );
+ std::pair<osl::detail::VoidPointerSet::iterator, bool> const insertion(
+ rData.m_addresses.insert(pObj) );
+ DEBUGBASE_ENSURE( insertion.second, "### insertion failed!?" );
+ static_cast<void>(insertion);
+ }
+ else {
+ osl_incrementInterlockedCount(&rData.m_nCount);
+ }
+}
+
+void SAL_CALL osl_detail_ObjectRegistry_revokeObject(
+ osl::detail::ObjectRegistryData & rData, void const* pObj )
+ SAL_THROW_EXTERN_C()
+{
+ if (rData.m_bStoreAddresses) {
+ osl::MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() );
+ std::size_t const n = rData.m_addresses.erase(pObj);
+ DEBUGBASE_ENSURE( n == 1, "erased more than 1 entry!?" );
+ static_cast<void>(n);
+ }
+ else {
+ osl_decrementInterlockedCount(&rData.m_nCount);
+ }
+}
+
+} // extern "C"
+
diff --git a/sal/osl/all/filepath.c b/sal/osl/all/filepath.c
new file mode 100644
index 000000000000..e9461a538840
--- /dev/null
+++ b/sal/osl/all/filepath.c
@@ -0,0 +1,123 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <osl/file.h>
+#include <rtl/ustring.h>
+
+static sal_uInt32 SAL_CALL osl_defCalcTextWidth( rtl_uString *ustrText )
+{
+ return ustrText ? ustrText->length : 0;
+}
+
+
+oslFileError SAL_CALL osl_abbreviateSystemPath( rtl_uString *ustrSystemPath, rtl_uString **pustrCompacted, sal_uInt32 uMaxWidth, oslCalcTextWidthFunc pfnCalcWidth )
+{
+ oslFileError error = osl_File_E_None;
+ rtl_uString *ustrPath = NULL;
+ rtl_uString *ustrFile = NULL;
+ sal_uInt32 uPathWidth, uFileWidth;
+
+ if ( !pfnCalcWidth )
+ pfnCalcWidth = osl_defCalcTextWidth;
+
+ {
+ sal_Int32 iLastSlash = rtl_ustr_lastIndexOfChar_WithLength( ustrSystemPath->buffer, ustrSystemPath->length, SAL_PATHDELIMITER );
+
+ if ( iLastSlash >= 0 )
+ {
+ rtl_uString_newFromStr_WithLength( &ustrPath, ustrSystemPath->buffer, iLastSlash );
+ rtl_uString_newFromStr_WithLength( &ustrFile, &ustrSystemPath->buffer[iLastSlash], ustrSystemPath->length - iLastSlash );
+ }
+ else
+ {
+ rtl_uString_new( &ustrPath );
+ rtl_uString_newFromString( &ustrFile, ustrSystemPath );
+ }
+ }
+
+ uPathWidth = pfnCalcWidth( ustrPath );
+ uFileWidth = pfnCalcWidth( ustrFile );
+
+ /* First abbreviate the directory component of the path */
+
+ while ( uPathWidth + uFileWidth > uMaxWidth )
+ {
+ if ( ustrPath->length > 3 )
+ {
+ ustrPath->length--;
+ ustrPath->buffer[ustrPath->length-3] = '.';
+ ustrPath->buffer[ustrPath->length-2] = '.';
+ ustrPath->buffer[ustrPath->length-1] = '.';
+ ustrPath->buffer[ustrPath->length] = 0;
+
+ uPathWidth = pfnCalcWidth( ustrPath );
+ }
+ else
+ break;
+ }
+
+ /* Now abbreviate file component */
+
+ while ( uPathWidth + uFileWidth > uMaxWidth )
+ {
+ if ( ustrFile->length > 4 )
+ {
+ ustrFile->length--;
+ ustrFile->buffer[ustrFile->length-3] = '.';
+ ustrFile->buffer[ustrFile->length-2] = '.';
+ ustrFile->buffer[ustrFile->length-1] = '.';
+ ustrFile->buffer[ustrFile->length] = 0;
+
+ uFileWidth = pfnCalcWidth( ustrFile );
+ }
+ else
+ break;
+ }
+
+ rtl_uString_newConcat( pustrCompacted, ustrPath, ustrFile );
+
+ /* Event now if path was compacted to ".../..." it can be to large */
+
+ uPathWidth += uFileWidth;
+
+ while ( uPathWidth > uMaxWidth )
+ {
+ (*pustrCompacted)->length--;
+ (*pustrCompacted)->buffer[(*pustrCompacted)->length] = 0;
+ uPathWidth = pfnCalcWidth( *pustrCompacted );
+ }
+
+ if ( ustrPath )
+ rtl_uString_release( ustrPath );
+
+ if ( ustrFile )
+ rtl_uString_release( ustrFile );
+
+ return error;
+}
+
+
diff --git a/sal/osl/all/loadmodulerelative.cxx b/sal/osl/all/loadmodulerelative.cxx
new file mode 100644
index 000000000000..39bea770e8a1
--- /dev/null
+++ b/sal/osl/all/loadmodulerelative.cxx
@@ -0,0 +1,71 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "sal/config.h"
+
+#include <cstddef>
+
+#include "osl/diagnose.h"
+#include "osl/module.h"
+#include "osl/module.hxx"
+#include "osl/thread.h"
+#include "rtl/malformeduriexception.hxx"
+#include "rtl/uri.hxx"
+#include "rtl/ustring.h"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+
+extern "C" {
+
+oslModule SAL_CALL osl_loadModuleRelative(
+ oslGenericFunction const baseModule, rtl_uString * const relativePath,
+ sal_Int32 const mode)
+{
+ ::rtl::OUString base;
+ if (!::osl::Module::getUrlFromAddress(baseModule, base)) {
+ OSL_TRACE("osl::Module::getUrlFromAddress failed");
+ return NULL;
+ }
+ ::rtl::OUString abs;
+ try {
+ abs = ::rtl::Uri::convertRelToAbs(base, relativePath);
+ } catch (::rtl::MalformedUriException & e) {
+ (void) e; // avoid warnings
+ OSL_TRACE(
+ "rtl::MalformedUriException <%s>",
+ rtl::OUStringToOString(e.getMessage(), osl_getThreadTextEncoding()).
+ getStr());
+ //TODO: let some OSL_TRACE variant take care of text conversion?
+ return NULL;
+ }
+ return ::osl_loadModule(abs.pData, mode);
+}
+
+}
diff --git a/sal/osl/all/makefile.mk b/sal/osl/all/makefile.mk
new file mode 100644
index 000000000000..0d105906effb
--- /dev/null
+++ b/sal/osl/all/makefile.mk
@@ -0,0 +1,76 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=sal
+TARGET=oslall
+ENABLE_EXCEPTIONS=TRUE
+USE_LDUMP2=TRUE
+
+PROJECTPCH4DLL=TRUE
+PROJECTPCH=cont_pch
+PROJECTPCHSOURCE=cont_pch
+
+MULTITHREAD_OBJ=TRUE
+
+.IF "$(GUI)" == "OS2"
+STL_OS2_BUILDING=1
+.ENDIF
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+SLOFILES= \
+ $(SLO)$/utility.obj\
+ $(SLO)$/filepath.obj\
+ $(SLO)$/debugbase.obj\
+ $(SLO)$/loadmodulerelative.obj
+
+# $(SLO)$/readline.obj\
+
+#.IF "$(UPDATER)"=="YES"
+OBJFILES= \
+ $(OBJ)$/utility.obj\
+ $(OBJ)$/filepath.obj\
+ $(OBJ)$/debugbase.obj\
+ $(OBJ)$/loadmodulerelative.obj
+
+# $(OBJ)$/readline.obj\
+#.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+
diff --git a/sal/osl/all/utility.cxx b/sal/osl/all/utility.cxx
new file mode 100755
index 000000000000..21c392ba1793
--- /dev/null
+++ b/sal/osl/all/utility.cxx
@@ -0,0 +1,103 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+
+#include "rtl/ustring.hxx"
+#include "osl/time.h"
+#include <stdio.h>
+
+
+/*
+ * mfe : maybe it would be wishful to include initialization
+ * of the global timer in dllmain or _init directly.
+ * But noneoftheless this (should) work too.
+ */
+namespace osl
+{
+
+class OGlobalTimer
+{
+
+public:
+
+ OGlobalTimer() {
+ getTime();
+ }
+
+ sal_uInt32 getTime()
+ {
+ return osl_getGlobalTimer();
+ }
+
+
+};
+
+static OGlobalTimer aGlobalTimer;
+
+}
+
+
+extern "C"
+{
+void debug_ustring(rtl_uString* ustr)
+{
+ sal_Char* psz=0;
+ rtl_String* str=0;
+
+ if ( ustr != 0 )
+ {
+ rtl_uString2String( &str,
+ rtl_uString_getStr(ustr),
+ rtl_uString_getLength(ustr),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ psz = rtl_string_getStr(str);
+ }
+
+ fprintf(stderr,"'%s'\n",psz);
+
+ if ( str != 0 )
+ {
+ rtl_string_release(str);
+ }
+
+ return;
+}
+
+}
+
+void debug_oustring(rtl::OUString& ustr)
+{
+
+ debug_ustring(ustr.pData);
+
+ return;
+}
diff --git a/sal/osl/os2/conditn.c b/sal/osl/os2/conditn.c
new file mode 100644
index 000000000000..9ad2459fd851
--- /dev/null
+++ b/sal/osl/os2/conditn.c
@@ -0,0 +1,124 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/conditn.h>
+#include <osl/diagnose.h>
+#include <osl/time.h>
+
+
+
+/*
+ under WIN32, we use the void* oslCondition
+ as a WIN32 HANDLE (which is also a 32-bit value)
+*/
+
+/*****************************************************************************/
+/* osl_createCondition */
+/*****************************************************************************/
+oslCondition SAL_CALL osl_createCondition()
+{
+ HEV hevCondition;
+ APIRET rc;
+
+ rc = DosCreateEventSem( NULL, /* unnamed semaphore */
+ &hevCondition, /* pointer to variable */
+ /* for the sem-handle */
+ DC_SEM_SHARED, /* shared semaphore */
+ FALSE ); /* initial state is posted */
+
+ if( rc == NO_ERROR )
+ return (oslCondition)hevCondition;
+ else
+ return NULL;
+}
+
+/*****************************************************************************/
+/* osl_destroyCondition */
+/*****************************************************************************/
+void SAL_CALL osl_destroyCondition(oslCondition Condition)
+{
+ if( Condition )
+ DosCloseEventSem( (HEV) Condition );
+}
+
+/*****************************************************************************/
+/* osl_setCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setCondition(oslCondition Condition)
+{
+ OSL_ASSERT(Condition);
+
+ return DosPostEventSem((HEV)Condition) == NO_ERROR;
+}
+
+/*****************************************************************************/
+/* osl_resetCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_resetCondition(oslCondition Condition)
+{
+ ULONG ulPostCount;
+
+ OSL_ASSERT(Condition);
+
+ return DosResetEventSem((HEV)Condition, &ulPostCount) == NO_ERROR;
+}
+
+/*****************************************************************************/
+/* osl_waitCondition */
+/*****************************************************************************/
+oslConditionResult SAL_CALL osl_waitCondition(oslCondition Condition, const TimeValue * pTimeout )
+{
+ long nTimeout;
+ APIRET rc;
+ OSL_ASSERT(Condition);
+
+ if( pTimeout )
+ nTimeout = pTimeout->Seconds * 1000 + pTimeout->Nanosec / 1000000;
+ else
+ nTimeout = SEM_INDEFINITE_WAIT;
+
+ rc = DosWaitEventSem((HEV)Condition, nTimeout );
+ if( rc == ERROR_TIMEOUT )
+ return osl_cond_result_timeout;
+ if( rc != NO_ERROR )
+ return osl_cond_result_error;
+
+ return osl_cond_result_ok;
+}
+
+/*****************************************************************************/
+/* osl_checkCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_checkCondition(oslCondition Condition)
+{
+ OSL_ASSERT(Condition);
+
+ return( DosWaitEventSem((HEV)Condition, SEM_IMMEDIATE_RETURN) == NO_ERROR);
+}
+
diff --git a/sal/osl/os2/debug.c b/sal/osl/os2/debug.c
new file mode 100644
index 000000000000..f2d0f915f375
--- /dev/null
+++ b/sal/osl/os2/debug.c
@@ -0,0 +1,2152 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*
+ *@@sourcefile debug.c:
+ * this file contains debugging functions for the
+ * exception handlers in except.c.
+ *
+ * This code is capable of unwinding the stack from
+ * a given address and trying to get function names
+ * and source line numbers, either from the respective
+ * module's debug code (if present) or from a SYM file,
+ * which is searched for in the directory of the module
+ * or in ?:\OS2\PDPSI\PMDF\WARP4.
+ *
+ * This file incorporates code from the following:
+ * -- Marc Fiammante, John Currier, Kim Rasmussen,
+ * Anthony Cruise (EXCEPT3.ZIP package for a generic
+ * exception handling DLL, available at Hobbes).
+ *
+ * Usage: All OS/2 programs.
+ *
+ * Note: Version numbering in this file relates to XWorkplace version
+ * numbering.
+ *
+ *@@changed V0.9.0 [umoeller]: made some declarations C++-compatible
+ *@@changed V0.9.1 (2000-01-30) [umoeller]: greatly cleaned up this file
+ *
+ *@@header "helpers\debug.h"
+ */
+
+/*
+ * This file Copyright (C) 1992-99 Ulrich M�ller,
+ * Kim Rasmussen,
+ * Marc Fiammante,
+ * John Currier,
+ * Anthony Cruise.
+ * This file is part of the "XWorkplace helpers" source package.
+ *
+ * 2009-06-15 published under LGPL3 with Ulrich M�ller permission.
+ *
+ */
+
+//#define DEBUG_SYMDUMP // enable to dump sym file to log
+
+//YD commented, since we need unsigned char BYTE!
+//#define OS2EMX_PLAIN_CHAR
+//Also gcc char is signed, while most structures requires unsigned data!
+//Raised limits for all fields!
+
+ // this is needed for "os2emx.h"; if this is defined,
+ // emx will define PSZ as _signed_ char, otherwise
+ // as unsigned char
+
+#define INCL_DOSPROCESS
+#define INCL_DOSMODULEMGR
+#define INCL_DOSMISC
+#define INCL_DOSERRORS
+#include <os2.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define DONT_REPLACE_MALLOC
+#include "helpers\setup.h" // code generation and debugging options
+
+#include "helpers\debug.h"
+#include "helpers\dosh.h"
+
+#pragma hdrstop
+
+#include <fcntl.h>
+#ifdef __EMX__
+ #include <sys\types.h> // required for sys\stat.h; UM 99-10-22
+#endif
+#include <sys\stat.h>
+#include <share.h>
+#include <io.h>
+
+#ifndef DWORD
+#define DWORD unsigned long
+#endif
+#ifndef WORD
+#define WORD unsigned short
+#endif
+
+#pragma stack16(512)
+#define HF_STDERR 2
+
+/*
+ *@@category: Helpers\Control program helpers\Exceptions/debugging
+ * See except.c and debug.c.
+ */
+
+/* ******************************************************************
+ *
+ * Global variables
+ *
+ ********************************************************************/
+
+// this specifies whether we're dealing with 32-bit code;
+// this gets changed whenever 16-bit count is detected
+static BOOL f32bit = TRUE;
+
+/*
+ * Global variables for Read32PmDebug:
+ *
+ */
+
+ULONG func_ofs;
+ULONG pubfunc_ofs;
+//YD 17/07/06 c++ namespace can generate really long
+//YD names, use a large buffer!
+char func_name[16*1024];
+ULONG var_ofs = 0;
+
+struct {
+ BYTE name[128];
+ ULONG stack_offset;
+ USHORT type_idx;
+} autovar_def[1024];
+
+#pragma pack(1)
+
+BYTE *type_name[] =
+{
+ "8 bit signed ",
+ "16 bit signed ",
+ "32 bit signed ",
+ "Unknown (0x83) ",
+ "8 bit unsigned ",
+ "16 bit unsigned ",
+ "32 bit unsigned ",
+ "Unknown (0x87) ",
+ "32 bit real ",
+ "64 bit real ",
+ "80 bit real ",
+ "Unknown (0x8B) ",
+ "64 bit complex ",
+ "128 bit complex ",
+ "160 bit complex ",
+ "Unknown (0x8F) ",
+ "8 bit boolean ",
+ "16 bit boolean ",
+ "32 bit boolean ",
+ "Unknown (0x93) ",
+ "8 bit character ",
+ "16 bit characters ",
+ "32 bit characters ",
+ "void ",
+ "15 bit unsigned ",
+ "24 bit unsigned ",
+ "31 bit unsigned ",
+ "Unknown (0x9B) ",
+ "Unknown (0x9C) ",
+ "Unknown (0x9D) ",
+ "Unknown (0x9E) ",
+ "Unknown (0x9F) ",
+ "near pointer to 8 bit signed ",
+ "near pointer to 16 bit signed ",
+ "near pointer to 32 bit signed ",
+ "Unknown (0xA3) ",
+ "near pointer to 8 bit unsigned ",
+ "near pointer to 16 bit unsigned ",
+ "near pointer to 32 bit unsigned ",
+ "Unknown (0xA7) ",
+ "near pointer to 32 bit real ",
+ "near pointer to 64 bit real ",
+ "near pointer to 80 bit real ",
+ "Unknown (0xAB) ",
+ "near pointer to 64 bit complex ",
+ "near pointer to 128 bit complex ",
+ "near pointer to 160 bit complex ",
+ "Unknown (0xAF) ",
+ "near pointer to 8 bit boolean ",
+ "near pointer to 16 bit boolean ",
+ "near pointer to 32 bit boolean ",
+ "Unknown (0xB3) ",
+ "near pointer to 8 bit character ",
+ "near pointer to 16 bit characters",
+ "near pointer to 32 bit characters",
+ "near pointer to void ",
+ "near pointer to 15 bit unsigned ",
+ "near pointer to 24 bit unsigned ",
+ "near pointer to 31 bit unsigned ",
+ "Unknown (0xBB) ",
+ "Unknown (0xBC) ",
+ "Unknown (0xBD) ",
+ "Unknown (0xBE) ",
+ "Unknown (0xBF) ",
+ "far pointer to 8 bit signed ",
+ "far pointer to 16 bit signed ",
+ "far pointer to 32 bit signed ",
+ "Unknown (0xC3) ",
+ "far pointer to 8 bit unsigned ",
+ "far pointer to 16 bit unsigned ",
+ "far pointer to 32 bit unsigned ",
+ "Unknown (0xC7) ",
+ "far pointer to 32 bit real ",
+ "far pointer to 64 bit real ",
+ "far pointer to 80 bit real ",
+ "Unknown (0xCB) ",
+ "far pointer to 64 bit complex ",
+ "far pointer to 128 bit complex ",
+ "far pointer to 160 bit complex ",
+ "Unknown (0xCF) ",
+ "far pointer to 8 bit boolean ",
+ "far pointer to 16 bit boolean ",
+ "far pointer to 32 bit boolean ",
+ "Unknown (0xD3) ",
+ "far pointer to 8 bit character ",
+ "far pointer to 16 bit characters ",
+ "far pointer to 32 bit characters ",
+ "far pointer to void ",
+ "far pointer to 15 bit unsigned ",
+ "far pointer to 24 bit unsigned ",
+ "far pointer to 31 bit unsigned ",
+};
+
+// Thanks to John Currier:
+// Do not call 16 bit code in myHandler function to prevent call
+// to __EDCThunkProlog and problems is guard page exception handling
+// Also reduce the stack size to 1K for true 16 bit calls.
+// 16 bit calls thunk will now only occur on fatal exceptions
+#pragma stack16(1024)
+
+// ------------------------------------------------------------------
+// Last 8 bytes of 16:16 file when CODEVIEW debugging info is present
+#pragma pack(1)
+struct _eodbug
+{
+ unsigned short dbug; // 'NB' signature
+ unsigned short ver; // version
+ unsigned long dfaBase; // size of codeview info
+} G_eodbug;
+
+#define DBUGSIG 0x424E
+#define SSTMODULES 0x0101
+#define SSTPUBLICS 0x0102
+#define SSTTYPES 0x0103
+#define SSTSYMBOLS 0x0104
+#define SSTSRCLINES 0x0105
+#define SSTLIBRARIES 0x0106
+#define SSTSRCLINES2 0x0109
+#define SSTSRCLINES32 0x010B
+
+typedef struct _SYMBASE
+{
+ unsigned short dbug; // 'NB' signature
+ unsigned short ver; // version
+ unsigned long lfoDir; // file offset to dir entries
+} SYMBASE;
+
+typedef struct _SSDIR
+{
+ unsigned short sst; // SubSection Type
+ unsigned short modindex; // Module index number
+ unsigned long lfoStart; // Start of section
+ unsigned short cb; // Size of section
+} SSDIR;
+
+typedef struct _SSDIR32
+{
+ unsigned short sst; // SubSection Type
+ unsigned short modindex; // Module index number
+ unsigned long lfoStart; // Start of section
+ unsigned long cb; // Size of section
+} SSDIR32;
+
+typedef struct _SSMODULE
+{
+ unsigned short csBase; // code segment base
+ unsigned short csOff; // code segment offset
+ unsigned short csLen; // code segment length
+ unsigned short ovrNum; // overlay number
+ unsigned short indxSS; // Index into sstLib or 0
+ unsigned short reserved;
+ BYTE csize; // size of prefix string
+} SSMODULE;
+
+typedef struct _SSMOD32
+{
+ unsigned short csBase; // code segment base
+ unsigned long csOff; // code segment offset
+ unsigned long csLen; // code segment length
+ unsigned long ovrNum; // overlay number
+ unsigned short indxSS; // Index into sstLib or 0
+ unsigned long reserved;
+ BYTE csize; // size of prefix string
+} SSMOD32;
+
+typedef struct _SSPUBLIC
+{
+ unsigned short offset;
+ unsigned short segment;
+ unsigned short type;
+ BYTE csize;
+} SSPUBLIC;
+
+typedef struct _SSPUBLIC32
+{
+ unsigned long offset;
+ unsigned short segment;
+ unsigned short type;
+ BYTE csize;
+} SSPUBLIC32;
+
+typedef struct _SSLINEENTRY32
+{
+ unsigned short LineNum;
+ unsigned short FileNum;
+ unsigned long Offset;
+} SSLINEENTRY32;
+
+typedef struct _FIRSTLINEENTRY32
+{
+ unsigned short LineNum;
+ unsigned char entry_type;
+ unsigned char reserved;
+ unsigned short numlines;
+ unsigned short segnum;
+} FIRSTLINEENTRY32;
+
+typedef struct _SSFILENUM32
+{
+ unsigned long first_displayable; // Not used
+ unsigned long number_displayable; // Not used
+ unsigned long file_count; // number of source files
+} SSFILENUM32;
+
+/*
+ *@@ XDEBUGINFO:
+ * buffers for Read... funcs.
+ *
+ *@@added V0.9.4 (2000-06-15) [umoeller]
+ */
+
+typedef struct _XDEBUGINFO
+{
+ char szNrFile[300]; // receives source file
+ char szNrLine[300]; // receives line number
+ //YD 17/07/06 c++ namespace can generate really long
+ //YD names, use a large buffer!
+ char szNrPub[16*1024]; // receives function name
+
+ struct new_seg *pseg;
+ struct o32_obj *pobj; // flat .EXE object table entry
+
+ SYMBASE base;
+
+ SSDIR *pDirTab;
+ SSDIR32 *pDirTab32;
+ unsigned char *pEntTab;
+ unsigned long lfaBase;
+ SSMOD32 ssmod32;
+ SSPUBLIC32 sspub32;
+
+ SSMODULE ssmod;
+ SSPUBLIC sspub;
+} XDEBUGINFO, *PXDEBUGINFO;
+
+
+USHORT _THUNK_FUNCTION (Dos16SizeSeg) ();
+//APIRET16 APIENTRY16 DOS16SIZESEG(USHORT Seg, PULONG16 Size);
+USHORT DosSizeSeg (USHORT Seg, PULONG16 Size)
+{
+ return ((USHORT)
+ (_THUNK_PROLOG (2+4);
+ _THUNK_SHORT (Seg);
+ _THUNK_FLAT (Size);
+ _THUNK_CALL (Dos16SizeSeg)));
+}
+
+#pragma pack()
+
+/* ******************************************************************
+ *
+ * PART 1: ANALYZE DEBUG CODE
+ *
+ ********************************************************************/
+
+static int Read16CodeView(FILE *LogFile, PXDEBUGINFO pxdi, int fh, int TrapSeg, int TrapOff, CHAR *FileName);
+static int Read32PmDebug(FILE *LogFile, PXDEBUGINFO pxdi, int fh, int TrapSeg, int TrapOff, CHAR *FileName);
+
+/*
+ *@@ WriteAddressInfo:
+ * formats and writes a line into the trap log
+ * file.
+ *
+ * This gets called for each line from the
+ * stack dump. At this point, the line in the
+ * trap log already has:
+ *
+ + CS:EIP : 000109FF XMLVIEW :0
+ + ^^^ and we write here
+ * After this call, we have.
+ *
+ + CS:EIP : 000109FF XMLVIEW :0 xxx.c 123 ConfirmCreate__Fv
+ + ^^^ and we write here
+ *
+ *@@added V0.9.12 (2001-05-12) [umoeller]
+ */
+
+static VOID WriteDebugInfo(FILE *LogFile, // in: open log file
+ PXDEBUGINFO pxdi) // in: debug info
+{
+ fprintf(LogFile,
+ "%s%s%s",
+ pxdi->szNrFile,
+ pxdi->szNrLine,
+ pxdi->szNrPub);
+}
+
+/*
+ *@@ dbgPrintDebugInfo:
+ * this is the main entry point into analyzing debug
+ * code.
+ *
+ * This analyzes a given address and tries to find
+ * debug code descriptions for this address. If found,
+ * the information is written to the given log file.
+ *
+ * Gets called from dbgPrintStack.
+ *
+ * This returns NO_ERROR if the could was successfully
+ * analyzed or something != 0 if we failed.
+ *
+ * New with V0.84.
+ */
+
+APIRET dbgPrintDebugInfo(FILE *LogFile, // out: log file to write to
+ CHAR *FileName, // in: EXE/DLL module file name
+ ULONG Object, // in: trapping object (from DosQueryModFromEIP)
+ ULONG TrapOffset) // in: trapping address (from DosQueryModFromEIP)
+{
+ APIRET rc = 0;
+ int ModuleFile = 0;
+ static struct exe_hdr OldExeHeader;
+ static struct new_exe NewExeHeader;
+
+ ULONG ulSegment = Object + 1; // segment no. is object no. + 1
+
+ XDEBUGINFO xdi;
+ memset(&xdi, 0, sizeof(xdi));
+
+ // open the module file for reading to analyze the code
+ ModuleFile = sopen(FileName, O_RDONLY | O_BINARY, SH_DENYNO);
+
+ if (ModuleFile != -1)
+ {
+ // file found:
+ // read old Exe header
+ if (read(ModuleFile, (void*)&OldExeHeader, 64) == -1L)
+ {
+ fprintf(LogFile, "errno %d reading old exe header\n", errno);
+ close(ModuleFile);
+ return 2;
+ }
+ // seek to new Exe header
+ if (lseek(ModuleFile, (long)E_LFANEW(OldExeHeader), SEEK_SET) == -1L)
+ {
+ fprintf(LogFile, "errno %d seeking to new exe header\n", errno);
+ close(ModuleFile);
+ return 3;
+ }
+ if (read(ModuleFile, (void *)&NewExeHeader, 64) == -1L)
+ {
+ fprintf(LogFile, "errno %d reading new exe header\n", errno);
+ close(ModuleFile);
+ return 4;
+ }
+
+ // check EXE signature
+ if (NE_MAGIC(NewExeHeader) == E32MAGIC)
+ {
+ /*
+ * flat 32 executable:
+ *
+ */
+
+ // do analysis for 32-bit code
+ if (!(rc = Read32PmDebug(LogFile,
+ &xdi, // output
+ ModuleFile,
+ ulSegment,
+ TrapOffset,
+ FileName)))
+ WriteDebugInfo(LogFile, &xdi);
+
+ close(ModuleFile);
+
+ // rc !=0 try with DBG file
+ if (rc != 0)
+ {
+ strcpy(FileName + strlen(FileName) - 3, "DBG"); // Build DBG File name
+ ModuleFile = sopen(FileName, O_RDONLY | O_BINARY, SH_DENYNO);
+ if (ModuleFile != -1)
+ {
+ if (!(rc = Read32PmDebug(LogFile,
+ &xdi,
+ ModuleFile,
+ ulSegment,
+ TrapOffset,
+ FileName)))
+ WriteDebugInfo(LogFile, &xdi);
+
+ close(ModuleFile);
+ }
+ }
+
+ return rc;
+ }
+ else
+ {
+ if (NE_MAGIC(NewExeHeader) == NEMAGIC)
+ {
+ /*
+ * 16:16 executable:
+ *
+ */
+
+ if ((xdi.pseg = (struct new_seg *)calloc(NE_CSEG(NewExeHeader),
+ sizeof(struct new_seg)))
+ == NULL)
+ {
+ fprintf(LogFile, "Out of memory!");
+ close(ModuleFile);
+ return -1;
+ }
+ if ( lseek(ModuleFile,
+ E_LFANEW(OldExeHeader) + NE_SEGTAB(NewExeHeader),
+ SEEK_SET) == -1L)
+ {
+ fprintf(LogFile, "Error %u seeking segment table in %s\n", errno, FileName);
+ free(xdi.pseg);
+ close(ModuleFile);
+ return 9;
+ }
+
+ if (read(ModuleFile,
+ (void *)xdi.pseg,
+ NE_CSEG(NewExeHeader) * sizeof(struct new_seg))
+ == -1)
+ {
+ fprintf(LogFile, "Error %u reading segment table from %s\n", errno, FileName);
+ free(xdi.pseg);
+ close(ModuleFile);
+ return 10;
+ }
+
+ if (!(rc = Read16CodeView(LogFile,
+ &xdi,
+ ModuleFile,
+ ulSegment,
+ TrapOffset,
+ FileName)))
+ WriteDebugInfo(LogFile, &xdi);
+
+ free(xdi.pseg);
+ close(ModuleFile);
+
+ // rc !=0 try with DBG file
+ if (rc != 0)
+ {
+ strcpy(FileName + strlen(FileName) - 3, "DBG"); // Build DBG File name
+ ModuleFile = sopen(FileName,
+ O_RDONLY | O_BINARY, SH_DENYNO);
+ if (ModuleFile != -1)
+ {
+ if (!(rc = Read16CodeView(LogFile,
+ &xdi,
+ ModuleFile,
+ ulSegment,
+ TrapOffset,
+ FileName)))
+ WriteDebugInfo(LogFile, &xdi);
+
+ close(ModuleFile);
+ }
+ }
+ return rc;
+ }
+ else
+ {
+ /*
+ * Unknown executable:
+ *
+ */
+
+ fprintf(LogFile, "Error, could not find exe signature");
+ close(ModuleFile);
+ return 11;
+ }
+ }
+ } // end if (ModuleFile != -1)
+ else
+ {
+ fprintf(LogFile, "Error %d opening module file %s", errno, FileName);
+ return 1;
+ } // endif
+
+ // return 0; we never get here
+}
+
+char fname[256],
+ ModName[80];
+char ename[256],
+ dummy[256];
+
+#define MAX_USERDEFS 300 // raised from 150 V0.9.1 (2000-01-30) [umoeller]
+#define MAX_POINTERS 300 // raised from 150 V0.9.1 (2000-01-30) [umoeller]
+
+USHORT userdef_count;
+USHORT pointer_count;
+
+struct one_userdef_rec
+{
+ USHORT idx;
+ USHORT type_index;
+ BYTE name[33];
+} one_userdef[MAX_USERDEFS];
+
+struct one_pointer_rec
+{
+ USHORT idx;
+ USHORT type_index;
+ BYTE type_qual;
+ BYTE name[33];
+} one_pointer[MAX_POINTERS];
+
+/*
+ * Read32PmDebug:
+ * parses 32-bit debug code.
+ * Called from dbgPrintDebugInfo for 32-bit modules.
+ */
+
+static int Read32PmDebug(FILE *LogFile, // in: text log file to write to
+ PXDEBUGINFO pxdi,
+ int ModuleFile, // in: module file opened with sopen()
+ int TrapSeg,
+ int TrapOff,
+ CHAR *FileName)
+{
+ static unsigned int CurrSymSeg, NrSymbol,
+ /* offset, */ NrPublic,
+ NrFile, NrLine, /* NrEntry */
+ numdir, namelen,
+ numlines /* , line */;
+ static int ModIndex;
+ static int bytesread, i, j;
+ static SSLINEENTRY32 LineEntry;
+ static SSFILENUM32 FileInfo;
+ static FIRSTLINEENTRY32 FirstLine;
+ static BYTE dump_vars = FALSE;
+ static USHORT idx;
+ static BOOL read_types;
+ static LONG lSize;
+
+ ModIndex = 0;
+ // See if any CODEVIEW info
+ if (lseek(ModuleFile, -8L, SEEK_END) == -1)
+ {
+ fprintf(LogFile, "Error %u seeking CodeView table in %s\n", errno, FileName);
+ return (18);
+ }
+
+ if (read(ModuleFile,
+ (void *)&G_eodbug, 8)
+ == -1)
+ {
+ fprintf(LogFile, "Error %u reading debug info from %s\n", errno, FileName);
+ return (19);
+ }
+ if (G_eodbug.dbug != DBUGSIG)
+ {
+ // fprintf(LogFile,"\nNo CodeView information stored.\n");
+ return (100);
+ }
+
+ if ( (pxdi->lfaBase = lseek(ModuleFile,
+ -(LONG)G_eodbug.dfaBase,
+ SEEK_END))
+ == -1L)
+ {
+ fprintf(LogFile, "Error %u seeking base codeview data in %s\n", errno, FileName);
+ return (20);
+ }
+
+ if (read(ModuleFile,
+ (void *)&pxdi->base, 8)
+ == -1)
+ {
+ fprintf(LogFile, "Error %u reading base codeview data in %s\n", errno, FileName);
+ return (21);
+ }
+
+ if (lseek(ModuleFile,
+ pxdi->base.lfoDir - 8 + 4,
+ SEEK_CUR)
+ == -1)
+ {
+ fprintf(LogFile, "Error %u seeking dir codeview data in %s\n", errno, FileName);
+ return (22);
+ }
+
+ if (read(ModuleFile,
+ (void *)&numdir, 4)
+ == -1)
+ {
+ fprintf(LogFile, "Error %u reading dir codeview data in %s\n", errno, FileName);
+ return (23);
+ }
+
+ // Read dir table into buffer
+ if ( (pxdi->pDirTab32 = (SSDIR32*)calloc(numdir,
+ sizeof(SSDIR32)))
+ == NULL)
+ {
+ fprintf(LogFile, "Out of memory!");
+ return (-1);
+ }
+
+ if (read(ModuleFile,
+ (void*)pxdi->pDirTab32,
+ numdir * sizeof(SSDIR32))
+ == -1)
+ {
+ fprintf(LogFile, "Error %u reading codeview dir table from %s\n", errno, FileName);
+ free(pxdi->pDirTab32);
+ return (24);
+ }
+
+ i = 0;
+ while (i < numdir)
+ {
+ if (pxdi->pDirTab32[i].sst != SSTMODULES)
+ {
+ i++;
+ continue;
+ }
+
+ NrPublic = 0x0;
+ NrSymbol = 0;
+ NrLine = 0x0;
+ NrFile = 0x0;
+ CurrSymSeg = 0;
+ // point to subsection
+ lseek(ModuleFile,
+ pxdi->pDirTab32[i].lfoStart + pxdi->lfaBase,
+ SEEK_SET);
+ read(ModuleFile,
+ (void*)&pxdi->ssmod32.csBase,
+ sizeof(SSMOD32));
+ read(ModuleFile,
+ (void*)ModName,
+ (unsigned)pxdi->ssmod32.csize);
+ ModIndex = pxdi->pDirTab32[i].modindex;
+ ModName[pxdi->ssmod32.csize] = '\0';
+ i++;
+
+ read_types = FALSE;
+
+ while ( (pxdi->pDirTab32[i].modindex == ModIndex)
+ && (i < numdir)
+ )
+ {
+ // point to subsection
+ lseek(ModuleFile,
+ pxdi->pDirTab32[i].lfoStart + pxdi->lfaBase,
+ SEEK_SET);
+
+ switch (pxdi->pDirTab32[i].sst)
+ {
+ case SSTPUBLICS:
+ bytesread = 0;
+ while (bytesread < pxdi->pDirTab32[i].cb)
+ {
+ bytesread += read(ModuleFile,
+ (void *)&pxdi->sspub32.offset,
+ sizeof(pxdi->sspub32));
+ bytesread += read(ModuleFile,
+ (void*)ename,
+ (unsigned)pxdi->sspub32.csize);
+ ename[pxdi->sspub32.csize] = '\0';
+ if ( (pxdi->sspub32.segment == TrapSeg)
+ && (pxdi->sspub32.offset <= TrapOff)
+ && (pxdi->sspub32.offset >= NrPublic)
+ )
+ {
+ NrPublic = pubfunc_ofs = pxdi->sspub32.offset;
+ read_types = TRUE;
+ sprintf(pxdi->szNrPub,
+ "%s %s (%s)\n",
+ (pxdi->sspub32.type == 1)
+ ? " Abs"
+ : " ",
+ ename,
+ ModName
+ );
+ // but continue, because there might be a
+ // symbol that comes closer
+ }
+ }
+ break;
+
+ // Read symbols, so we can dump the variables on the stack
+ case SSTSYMBOLS:
+ if (TrapSeg != pxdi->ssmod32.csBase)
+ break;
+
+ bytesread = 0;
+ while (bytesread < pxdi->pDirTab32[i].cb)
+ {
+ static USHORT usLength;
+ static USHORT usLengthSym;
+ static BYTE b1,
+ b2;
+ static BYTE bType;
+ // *ptr;
+ static ULONG ofs;
+ // static ULONG last_addr = 0;
+ //YD 17/07/06 c++ namespace can generate really long
+ //YD names, use a large buffer!
+ static BYTE str[16*1024];
+ static struct symseg_rec symseg;
+ static struct symauto_rec symauto;
+ static struct symproc_rec symproc;
+
+ // Read the length of this subentry
+ bytesread += read(ModuleFile, &b1, 1);
+ if (b1 & 0x80)
+ {
+ bytesread += read(ModuleFile, &b2, 1);
+ usLength = ((b1 & 0x7F) << 8) + b2;
+ }
+ else
+ usLength = b1;
+
+ ofs = tell(ModuleFile);
+
+ bytesread += read(ModuleFile, &bType, 1);
+
+ switch (bType)
+ {
+ case SYM_CHANGESEG:
+ read(ModuleFile, &symseg, sizeof(symseg));
+ CurrSymSeg = symseg.seg_no;
+ break;
+
+ case SYM_PROC:
+ case SYM_CPPPROC:
+ read(ModuleFile, &symproc, sizeof(symproc));
+ if (symproc.name_len & 0x80)
+ {
+ read(ModuleFile, &b2, 1);
+ usLengthSym = ((symproc.name_len & 0x7F) << 8) + b2;
+ }
+ else
+ {
+ usLengthSym = symproc.name_len;
+ }
+ read(ModuleFile, str, usLengthSym);
+ str[usLengthSym] = 0;
+
+ if ((CurrSymSeg == TrapSeg) &&
+ (symproc.offset <= TrapOff) &&
+ (symproc.offset >= NrSymbol))
+ {
+
+ dump_vars = TRUE;
+ var_ofs = 0;
+ NrSymbol = symproc.offset;
+ func_ofs = symproc.offset;
+
+ strcpy(func_name, str);
+ }
+ else
+ {
+ dump_vars = FALSE;
+ }
+ break;
+
+ case SYM_AUTO:
+ if (!dump_vars)
+ break;
+
+ read(ModuleFile, &symauto, sizeof(symauto));
+ read(ModuleFile, str, symauto.name_len);
+ if (symauto.name_len==0x80)
+ printf("symauto.name_len==0x80\n");
+ str[symauto.name_len] = 0;
+
+ strcpy(autovar_def[var_ofs].name, str);
+ autovar_def[var_ofs].stack_offset = symauto.stack_offset;
+ autovar_def[var_ofs].type_idx = symauto.type_idx;
+ var_ofs++;
+ break;
+
+ }
+
+ bytesread += usLength;
+
+ lseek(ModuleFile, ofs + usLength, SEEK_SET);
+ }
+ break;
+
+ case SSTTYPES:
+ // if (ModIndex != TrapSeg)
+ if (!read_types)
+ break;
+
+ bytesread = 0;
+ idx = 0x200;
+ userdef_count = 0;
+ pointer_count = 0;
+ while (bytesread < pxdi->pDirTab32[i].cb)
+ {
+ static struct type_rec type;
+ static struct type_userdefrec udef;
+ static struct type_pointerrec point;
+ static ULONG ofs;
+ static BYTE str[256];
+
+ // Read the length of this subentry
+ ofs = tell(ModuleFile);
+
+ read(ModuleFile, &type, sizeof(type));
+ bytesread += sizeof(type);
+
+ switch (type.type)
+ {
+ case TYPE_USERDEF:
+ if (userdef_count >= MAX_USERDEFS)
+ break;
+
+ read(ModuleFile, &udef, sizeof(udef));
+ read(ModuleFile, str, udef.name_len);
+ str[udef.name_len] = 0;
+
+ // Insert userdef in table
+ one_userdef[userdef_count].idx = idx;
+ one_userdef[userdef_count].type_index = udef.type_index;
+ memcpy(one_userdef[userdef_count].name,
+ str,
+ _min(udef.name_len + 1, 32));
+ one_userdef[userdef_count].name[32] = 0;
+ userdef_count++;
+ break;
+
+ case TYPE_POINTER:
+ if (pointer_count >= MAX_POINTERS)
+ break;
+
+ read(ModuleFile, &point, sizeof(point));
+ read(ModuleFile, str, point.name_len);
+ str[point.name_len] = 0;
+
+ // Insert userdef in table
+ one_pointer[pointer_count].idx = idx;
+ one_pointer[pointer_count].type_index = point.type_index;
+ memcpy(one_pointer[pointer_count].name,
+ str,
+ _min(point.name_len + 1, 32));
+ one_pointer[pointer_count].name[32] = 0;
+ one_pointer[pointer_count].type_qual = type.type_qual;
+ pointer_count++;
+ break;
+ }
+
+ ++idx;
+
+ bytesread += type.length;
+
+ lseek(ModuleFile, ofs + type.length + 2, SEEK_SET);
+ }
+ break;
+
+ case SSTSRCLINES32:
+ if (TrapSeg != pxdi->ssmod32.csBase)
+ break;
+
+ // read first line
+ do
+ {
+ read(ModuleFile, (void *)&FirstLine, sizeof(FirstLine));
+
+ if (FirstLine.LineNum != 0)
+ {
+ fprintf(LogFile, "Missing Line table information\n");
+ break;
+ } // endif
+ numlines = FirstLine.numlines;
+ // Other type of data skip 4 more bytes
+ if (FirstLine.entry_type < 4)
+ {
+ read(ModuleFile, (void *)&lSize, 4);
+ if (FirstLine.entry_type == 3)
+ lseek(ModuleFile, lSize, SEEK_CUR);
+ }
+ }
+ while (FirstLine.entry_type == 3);
+
+ for (j = 0; j < numlines; j++)
+ {
+ switch (FirstLine.entry_type)
+ {
+ case 0:
+ read(ModuleFile, (void *)&LineEntry, sizeof(LineEntry));
+ // Changed by Kim Rasmussen 26/06 1996 to ignore linenumber 0
+ // if (LineEntry.Offset+ssmod32.csOff<=TrapOff && LineEntry.Offset+ssmod32.csOff>=NrLine) {
+ if ( (LineEntry.LineNum)
+ && (LineEntry.Offset + pxdi->ssmod32.csOff
+ <= TrapOff)
+ && (LineEntry.Offset + pxdi->ssmod32.csOff >= NrLine)
+ )
+ {
+ NrLine = LineEntry.Offset;
+ NrFile = LineEntry.FileNum;
+ /*pOffset =sprintf(szNrLine,"%04X:%08X line #%hu ",
+ * ssmod32.csBase,LineEntry.Offset,
+ * LineEntry.LineNum); */
+ sprintf(pxdi->szNrLine, "% 6hu", LineEntry.LineNum);
+ }
+ break;
+
+ case 1:
+ lseek(ModuleFile, sizeof(struct linlist_rec), SEEK_CUR);
+ break;
+
+ case 2:
+ lseek(ModuleFile, sizeof(struct linsourcelist_rec), SEEK_CUR);
+ break;
+
+ case 3:
+ lseek(ModuleFile, sizeof(struct filenam_rec), SEEK_CUR);
+ break;
+
+ case 4:
+ lseek(ModuleFile, sizeof(struct pathtab_rec), SEEK_CUR);
+ break;
+
+ }
+ }
+
+ if (NrFile != 0)
+ {
+ // file found:
+ read(ModuleFile, (void*)&FileInfo, sizeof(FileInfo));
+ namelen = 0;
+ for (j = 1; j <= FileInfo.file_count; j++)
+ {
+ namelen = 0;
+ read(ModuleFile, (void *)&namelen, 1);
+ read(ModuleFile, (void *)ename, namelen);
+ if (j == NrFile)
+ break;
+ }
+ ename[namelen] = '\0';
+ // pOffset=sprintf(szNrLine+pOffset," (%s) (%s)\n",ename,ModName);
+ sprintf(pxdi->szNrFile, "%11.11s ", ename);
+ }
+ else
+ {
+ // strcat(szNrLine,"\n"); avoid new line for empty name fill
+ strcpy(pxdi->szNrFile, "file? ");
+ } // endif
+ break;
+ } // end switch
+
+ i++;
+ } // end while modindex
+ } // End While i < numdir
+ free(pxdi->pDirTab32);
+ return (0);
+}
+
+/*
+ * Read16CodeView:
+ * parses 16-bit debug code.
+ * Called from dbgPrintDebugInfo for 16-bit modules.
+ */
+
+static int Read16CodeView(FILE *LogFile, // in: text log file to write to
+ PXDEBUGINFO pxdi,
+ int fh,
+ int TrapSeg,
+ int TrapOff,
+ CHAR *FileName)
+{
+ static unsigned short int offset,
+ NrPublic, NrLine,
+ numdir,
+ namelen, numlines,
+ line;
+ static int ModIndex;
+ static int bytesread, i, j;
+
+ ModIndex = 0;
+ // See if any CODEVIEW info
+ if (lseek(fh, -8L, SEEK_END) == -1)
+ {
+ fprintf(LogFile, "Error %u seeking CodeView table in %s\n", errno, FileName);
+ return (18);
+ }
+
+ if (read(fh, (void *)&G_eodbug, 8) == -1)
+ {
+ fprintf(LogFile, "Error %u reading debug info from %s\n", errno, FileName);
+ return (19);
+ }
+ if (G_eodbug.dbug != DBUGSIG)
+ {
+ // fprintf(LogFile,"\nNo CodeView information stored.\n");
+ return (100);
+ }
+
+ if ((pxdi->lfaBase = lseek(fh, -(LONG)G_eodbug.dfaBase, SEEK_END)) == -1L)
+ {
+ fprintf(LogFile, "Error %u seeking base codeview data in %s\n", errno, FileName);
+ return (20);
+ }
+
+ if (read(fh, (void *)&pxdi->base, 8) == -1)
+ {
+ fprintf(LogFile, "Error %u reading base codeview data in %s\n", errno, FileName);
+ return (21);
+ }
+
+ if (lseek(fh, pxdi->base.lfoDir - 8, SEEK_CUR) == -1)
+ {
+ fprintf(LogFile, "Error %u seeking dir codeview data in %s\n", errno, FileName);
+ return (22);
+ }
+
+ if (read(fh, (void *)&numdir, 2) == -1)
+ {
+ fprintf(LogFile, "Error %u reading dir codeview data in %s\n", errno, FileName);
+ return (23);
+ }
+
+ // Read dir table into buffer
+ if ((pxdi->pDirTab = (SSDIR*)calloc(numdir, sizeof(SSDIR))) == NULL)
+ {
+ fprintf(LogFile, "Out of memory!");
+ return (-1);
+ }
+
+ if (read(fh, (void*)pxdi->pDirTab, numdir * sizeof(SSDIR)) == -1)
+ {
+ fprintf(LogFile, "Error %u reading codeview dir table from %s\n", errno, FileName);
+ free(pxdi->pDirTab);
+ return (24);
+ }
+
+ i = 0;
+ while (i < numdir)
+ {
+ if (pxdi->pDirTab[i].sst != SSTMODULES)
+ {
+ i++;
+ continue;
+ }
+ NrPublic = 0x0;
+ NrLine = 0x0;
+ // point to subsection
+ lseek(fh, pxdi->pDirTab[i].lfoStart + pxdi->lfaBase, SEEK_SET);
+ read(fh, (void *)&pxdi->ssmod.csBase, sizeof(SSMODULE));
+ read(fh, (void *)ModName, (unsigned)pxdi->ssmod.csize);
+ ModIndex = pxdi->pDirTab[i].modindex;
+ ModName[pxdi->ssmod.csize] = '\0';
+ i++;
+ while (pxdi->pDirTab[i].modindex == ModIndex && i < numdir)
+ {
+ // point to subsection
+ lseek(fh, pxdi->pDirTab[i].lfoStart + pxdi->lfaBase, SEEK_SET);
+ switch (pxdi->pDirTab[i].sst)
+ {
+ case SSTPUBLICS:
+ bytesread = 0;
+ while (bytesread < pxdi->pDirTab[i].cb)
+ {
+ bytesread += read(fh, (void *)&pxdi->sspub.offset, sizeof(pxdi->sspub));
+ bytesread += read(fh, (void *)ename, (unsigned)pxdi->sspub.csize);
+ ename[pxdi->sspub.csize] = '\0';
+ if ((pxdi->sspub.segment == TrapSeg) &&
+ (pxdi->sspub.offset <= TrapOff) &&
+ (pxdi->sspub.offset >= NrPublic))
+ {
+ NrPublic = pxdi->sspub.offset;
+ sprintf(pxdi->szNrPub, "%s %s (%s) %04hX:%04hX\n",
+ (pxdi->sspub.type == 1) ? " Abs" : " ", ename,
+ ModName, // ()
+ pxdi->sspub.segment,
+ pxdi->sspub.offset
+ );
+ }
+ }
+ break;
+
+ case SSTSRCLINES2:
+ case SSTSRCLINES:
+ if (TrapSeg != pxdi->ssmod.csBase)
+ break;
+ namelen = 0;
+ read(fh, (void *)&namelen, 1);
+ read(fh, (void *)ename, namelen);
+ ename[namelen] = '\0';
+ // skip 2 zero bytes
+ if (pxdi->pDirTab[i].sst == SSTSRCLINES2)
+ read(fh, (void *)&numlines, 2);
+ read(fh, (void *)&numlines, 2);
+ for (j = 0; j < numlines; j++)
+ {
+ read(fh, (void *)&line, 2);
+ read(fh, (void *)&offset, 2);
+ if (offset <= TrapOff && offset >= NrLine)
+ {
+ NrLine = offset;
+ sprintf(pxdi->szNrFile, "% 12.12s ", ename);
+ sprintf(pxdi->szNrLine, "% 6hu", line);
+ /*sprintf(szNrLine,"%04hX:%04hX line #%hu (%s) (%s)\n",
+ * ssmod.csBase,offset,line,ModName,ename); */
+ }
+ }
+ break;
+ } // end switch
+ i++;
+ } // end while modindex
+ } // End While i < numdir
+ free(pxdi->pDirTab);
+ return (0);
+}
+
+/* ******************************************************************
+ *
+ * PART 2: ANALYZE VARIABLES
+ *
+ ********************************************************************/
+
+/*
+ * var_value:
+ * writes a description of a variable type to
+ * the specified buffer, depending on "type".
+ *
+ *@@changed V0.9.1 (2000-01-30) [umoeller]: changed prototype to use external buffer
+ */
+
+static VOID var_value(void *varptr, // in: address of the variable on the stack
+ char *pszBuf, // out: information
+ BYTE type) // in: type; if >= 32, we'll call DosQueryMem
+{
+ ULONG Size = 1,
+ Attr = 0;
+
+ if (DosQueryMem(varptr, &Size, &Attr) != NO_ERROR)
+ {
+ sprintf(pszBuf, "type %d, DosQueryMem failed", type);
+ return;
+ }
+
+ if ((Attr & PAG_READ) == 0)
+ {
+ sprintf(pszBuf, "type %d, read-access to value denied", type);
+ return;
+ }
+
+ if (type == 0)
+ sprintf(pszBuf, "%hd", *(signed char*)varptr);
+ else if (type == 1)
+ sprintf(pszBuf, "%hd", *(signed short*)varptr);
+ else if (type == 2)
+ sprintf(pszBuf, "%ld", *(signed long*)varptr);
+ else if (type == 4)
+ sprintf(pszBuf, "%hu", *(BYTE*) varptr);
+ else if (type == 5)
+ sprintf(pszBuf, "%hu", *(USHORT*)varptr);
+ else if (type == 6)
+ sprintf(pszBuf, "0x%lX (%lu)", *((ULONG*)varptr), *((ULONG*)varptr));
+ else if (type == 8)
+ sprintf(pszBuf, "%f", *(float*)varptr);
+ else if (type == 9)
+ sprintf(pszBuf, "%f", *(double*)varptr);
+ else if (type == 10)
+ sprintf(pszBuf, "%f", (double)(*(long double*)varptr));
+ else if (type == 16)
+ sprintf(pszBuf, "%s", *(char*)varptr ? "TRUE" : "FALSE");
+ else if (type == 17)
+ sprintf(pszBuf, "%s", *(short*)varptr ? "TRUE" : "FALSE");
+ else if (type == 18)
+ sprintf(pszBuf, "%s", *(long*)varptr ? "TRUE" : "FALSE");
+ else if (type == 20)
+ sprintf(pszBuf, "%c", *(char*)varptr);
+ else if (type == 21)
+ sprintf(pszBuf, "%hd", (*(short*)varptr));
+ else if (type == 22)
+ sprintf(pszBuf, "%ld", *(long*)varptr);
+ else if (type == 23)
+ sprintf(pszBuf, "void");
+ else if (type >= 32)
+ {
+ sprintf(pszBuf, "0x%p", (void*)(*(ULONG*)varptr));
+ if (Attr & PAG_FREE)
+ {
+ strcat(pszBuf, " unallocated memory");
+ }
+ else
+ {
+ if ((Attr & PAG_COMMIT) == 0x0U)
+ {
+ strcat(pszBuf, " uncommitted");
+ } // endif
+ if ((Attr & PAG_WRITE) == 0x0U)
+ {
+ strcat(pszBuf, " unwritable");
+ } // endif
+ if ((Attr & PAG_READ) == 0x0U)
+ {
+ strcat(pszBuf, " unreadable");
+ } // endif
+ } // endif
+ } // endif
+ else
+ sprintf(pszBuf, "Unknown type %d", type);
+}
+
+/*
+ * search_userdefs:
+ * searches the table of userdef's-
+ * Return TRUE if found.
+ */
+
+static BOOL search_userdefs(FILE *LogFile, // in: text log file to write to
+ ULONG stackofs,
+ USHORT var_no)
+{
+ USHORT pos;
+
+ for (pos = 0;
+ pos < userdef_count;
+ pos++)
+ {
+ if (one_userdef[pos].idx == autovar_def[var_no].type_idx)
+ {
+ if ( (one_userdef[pos].type_index >= 0x80)
+ // && (one_userdef[pos].type_index <= 0xDA)
+ )
+ {
+ static char sszVar3[500] = "complex";
+ if (one_userdef[pos].type_index <= 0xDA)
+ var_value((void*)(stackofs + autovar_def[var_no].stack_offset),
+ sszVar3,
+ one_userdef[pos].type_index - 0x80);
+
+ fprintf(LogFile,
+ " %- 6ld %- 20.20s %- 33.33s %s (user)\n",
+ autovar_def[var_no].stack_offset, // stack offset
+ autovar_def[var_no].name, // identifier
+ one_userdef[pos].name, // type name
+ sszVar3 // composed by var_value
+ );
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ }
+
+ return FALSE;
+}
+
+/*
+ * search_pointers:
+ *
+ */
+
+static BOOL search_pointers(FILE *LogFile, // in: text log file to write to
+ ULONG stackofs,
+ USHORT var_no)
+{
+ USHORT pos, upos;
+ static BYTE str[35];
+ static char sszVar[500];
+
+ // BYTE type_index;
+
+ for (pos = 0;
+ ( (pos < pointer_count)
+ && (one_pointer[pos].idx != autovar_def[var_no].type_idx)
+ );
+ pos++);
+
+ if (pos < pointer_count)
+ {
+ if ( (one_pointer[pos].type_index >= 0x80)
+ && (one_pointer[pos].type_index <= 0xDA)
+ )
+ {
+ strcpy(str, type_name[one_pointer[pos].type_index - 0x80]);
+ strcat(str, " *");
+ var_value((void*)(stackofs + autovar_def[var_no].stack_offset),
+ sszVar,
+ 32);
+ fprintf(LogFile, " %- 6ld %- 20.20s %- 33.33s %s (ptr1)\n",
+ autovar_def[var_no].stack_offset,
+ autovar_def[var_no].name,
+ str,
+ sszVar);
+ return TRUE;
+ }
+ else
+ {
+ // If the result isn't a simple type, look for it in the other lists
+ for (upos = 0;
+ ( (upos < userdef_count)
+ && (one_userdef[upos].idx != one_pointer[pos].type_index)
+ );
+ upos++)
+ ;
+
+ if (upos < userdef_count)
+ {
+ strcpy(str, one_userdef[upos].name);
+ strcat(str, " *");
+ var_value((void *)(stackofs + autovar_def[var_no].stack_offset),
+ sszVar,
+ 32);
+ fprintf(LogFile, " %- 6ld %- 20.20s %- 33.33s %s (ptr2)\n",
+ autovar_def[var_no].stack_offset,
+ autovar_def[var_no].name,
+ str,
+ sszVar);
+ return TRUE;
+ }
+ else
+ {
+ // if it isn't a userdef, for now give up and just print
+ // as much as we know
+ sprintf(str, "Pointer to type 0x%X", one_pointer[pos].type_index);
+
+ var_value((void *)(stackofs + autovar_def[var_no].stack_offset),
+ sszVar,
+ 32);
+ fprintf(LogFile, " %- 6ld %- 20.20s %- 33.33s %s (ptr3)\n",
+ autovar_def[var_no].stack_offset,
+ autovar_def[var_no].name,
+ str,
+ sszVar);
+
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+/*
+ *@@ dbgPrintVariables:
+ * Dumps variables for the specified stack offset
+ * to the specified log file.
+ *
+ * New with V0.84.
+ */
+
+void dbgPrintVariables(FILE *LogFile, // in: text log file to write to
+ ULONG stackofs)
+{
+ USHORT n; // , pos;
+ BOOL AutoVarsFound = FALSE;
+
+ if (/* 1 || */ func_ofs == pubfunc_ofs)
+ {
+ for (n = 0;
+ n < var_ofs;
+ n++)
+ {
+ if (AutoVarsFound == FALSE)
+ {
+ AutoVarsFound = TRUE;
+ fprintf(LogFile, " List of auto variables at EBP %p in %s:\n",
+ (PVOID)stackofs,
+ func_name);
+ fprintf(LogFile, " Offset Name Type Value \n");
+ fprintf(LogFile, " ������ �������������������� ��������������������������������� �����������������\n");
+ }
+
+ // If it's one of the simple types
+ if ( (autovar_def[n].type_idx >= 0x80)
+ && (autovar_def[n].type_idx <= 0xDA)
+ )
+ {
+ static char sszVar2[500];
+
+ var_value((void *)(stackofs + autovar_def[n].stack_offset),
+ sszVar2,
+ autovar_def[n].type_idx - 0x80);
+
+ fprintf(LogFile, " %- 6ld %- 20.20s %- 33.33s %s (simple)\n",
+ autovar_def[n].stack_offset,
+ autovar_def[n].name,
+ type_name[autovar_def[n].type_idx - 0x80],
+ sszVar2);
+ }
+ else
+ { // Complex type, check if we know what it is
+ if (!search_userdefs(LogFile, stackofs, n))
+ {
+ if (!search_pointers(LogFile, stackofs, n))
+ {
+ fprintf(LogFile, " %- 6ld %-20.20s 0x%X (unknown)\n",
+ autovar_def[n].stack_offset,
+ autovar_def[n].name,
+ autovar_def[n].type_idx);
+ }
+ }
+ }
+ }
+ /* if (AutoVarsFound == FALSE)
+ {
+ fprintf(LogFile, " No auto variables found in %s.\n", func_name);
+ } */
+ fprintf(LogFile, "\n");
+ }
+}
+
+/* ******************************************************************
+ *
+ * PART 3: ANALYZE SYMBOL (.SYM) FILE
+ *
+ ********************************************************************/
+
+/*
+ *@@ dbgPrintSYMInfo:
+ * this gets called by dbgPrintStack if dbgPrintDebugInfo
+ * failed (because no debug code was found) to check if
+ * maybe a SYM file with the same filename exists and try
+ * to get the info from there.
+ *
+ * This gets called for every line of the stack
+ * walk, but only if getting the information from
+ * the debug code failed, e.g. because no debug code
+ * was available for an address.
+ *
+ * The file pointer is in the "Source file" column
+ * every time this gets called.
+ *
+ * New with V0.84.
+ *
+ * Returns 0 if reading the SYM file was successful.
+ *
+ *@@changed V0.9.1 (2000-01-30) [umoeller]: added return code; this used to be VOID
+ */
+
+int dbgPrintSYMInfo(FILE *LogFile, // in: text log file to write to
+ CHAR *SymFileName, // in: SYM file name (can be fully q'fied)
+ ULONG Object,
+ ULONG TrapOffset)
+{
+ static FILE *SymFile;
+ static MAPDEF MapDef;
+ static SEGDEF SegDef;
+ static SYMDEF32 SymDef32;
+ static SYMDEF16 SymDef16;
+ static char Buffer[256];
+ static int SegNum, SymNum, LastVal;
+ static unsigned long int SegOffset,
+ SymOffset, SymPtrOffset;
+
+ // open .SYM file
+#ifdef DEBUG_SYMDUMP
+ fprintf(LogFile,"Dump of '%s' for object %d\n",SymFileName,Object);
+#endif
+ SymFile = fopen(SymFileName, "rb");
+ if (SymFile == 0)
+ return (2);
+
+ // read in first map definition
+ fread(&MapDef, sizeof(MAPDEF), 1, SymFile);
+#ifdef DEBUG_SYMDUMP
+ Buffer[0] = MapDef.achModName[0];
+ fread(&Buffer[1], 1, MapDef.cbModName-1, SymFile);
+ Buffer[MapDef.cbModName] = 0x00;
+ fprintf(LogFile,"Module name '%s'\n",Buffer);
+#endif
+
+ SegOffset = SEGDEFOFFSET(MapDef);
+#ifdef DEBUG_SYMDUMP
+ fprintf(LogFile,"SegOffset %0x\n",SegOffset);
+#endif
+
+ // go thru all segments
+ for (SegNum = 0;
+ SegNum < MapDef.cSegs;
+ SegNum++)
+ {
+#ifdef DEBUG_SYMDUMP
+ fprintf(LogFile,"Scanning segment #%d Offset %08X\n",SegNum,SegOffset);
+#endif
+ if (fseek(SymFile, SegOffset, SEEK_SET))
+ // seek error
+ return (3);
+
+ // read in segment definition
+ fread(&SegDef, sizeof(SEGDEF), 1, SymFile);
+#ifdef DEBUG_SYMDUMP
+ Buffer[0] = 0x00;
+ if (SegDef.cbSegName>0) {
+ Buffer[0] = SegDef.achSegName[0];
+ fread(&Buffer[1], 1, SegDef.cbSegName-1, SymFile);
+ Buffer[SegDef.cbSegName] = 0x00;
+ }
+ fprintf(LogFile,"Segment name '%s', number %d, flags %02x\n",Buffer,SegNum,SegDef.bFlags);
+#endif
+
+ if (SegNum == Object)
+ {
+ // stack object found:
+ Buffer[0] = 0x00;
+ LastVal = 0;
+
+ // go thru all symbols in this object
+#ifdef DEBUG_SYMDUMP
+ fprintf(LogFile,"Scanning #%d symbols\n",SegDef.cSymbols);
+#endif
+ for (SymNum = 0; SymNum < SegDef.cSymbols; SymNum++)
+ {
+ SymPtrOffset=SYMDEFOFFSET(SegOffset,SegDef,SymNum);
+ fseek(SymFile,SymPtrOffset,SEEK_SET);
+ fread(&SymOffset,sizeof(unsigned short int),1,SymFile);
+ fseek(SymFile,SymOffset+SegOffset,SEEK_SET);
+ if (SegDef.bFlags & 0x01)
+ {
+ // 32-bit symbol:
+ fread(&SymDef32, sizeof(SYMDEF32), 1, SymFile);
+ if (SymDef32.wSymVal > TrapOffset)
+ {
+ // symbol found
+ fprintf(LogFile,
+ "between %s + 0x%lX ",
+ Buffer,
+ TrapOffset - LastVal);
+ /* fprintf(LogFile, "(ppLineDef: 0x%lX) ",
+ LINEDEFOFFSET(SegDef)
+ ); */
+ fprintf(LogFile, "\n");
+ }
+
+ LastVal = SymDef32.wSymVal;
+ Buffer[0] = SymDef32.achSymName[0];
+ fread(&Buffer[1], 1, SymDef32.cbSymName-1, SymFile);
+ Buffer[SymDef32.cbSymName] = 0x00;
+#ifdef DEBUG_SYMDUMP
+ fprintf(LogFile,"32 Bit Symbol Address %08p <%s> \n",SymDef32.wSymVal,Buffer);
+#endif
+
+ if (SymDef32.wSymVal > TrapOffset)
+ {
+ // symbol found, as above
+ fprintf(LogFile,
+ " "
+ "and %s - 0x%lX ",
+ Buffer,
+ LastVal - TrapOffset);
+ fprintf(LogFile, "\n");
+ break;
+ }
+ }
+ else
+ {
+ // 16-bit symbol:
+ fread(&SymDef16, sizeof(SYMDEF16), 1, SymFile);
+ if (SymDef16.wSymVal > TrapOffset)
+ {
+ fprintf(LogFile,
+ "between %s + %lX\n",
+ Buffer,
+ TrapOffset - LastVal);
+ }
+ LastVal = SymDef16.wSymVal;
+ Buffer[0] = SymDef16.achSymName[0];
+ fread(&Buffer[1], 1, SymDef16.cbSymName-1, SymFile);
+ Buffer[SymDef16.cbSymName] = 0x00;
+ if (SymDef16.wSymVal > TrapOffset)
+ {
+ fprintf(LogFile,
+ " "
+ "and %s - %lX\n",
+ Buffer,
+ LastVal - TrapOffset);
+ break;
+ }
+#ifdef DEBUG_SYMDUMP
+ fprintf(LogFile,"16 Bit Symbol <%s> Address %p\n",Buffer,SymDef16.wSymVal);
+#endif
+ } // endif
+ }
+ break;
+ } // endif
+ SegOffset = NEXTSEGDEFOFFSET(SegDef);
+ } // endwhile
+ fclose(SymFile);
+ return (0); // no error
+}
+
+/* ******************************************************************
+ *
+ * PART 4: dbgPrintStack
+ *
+ ********************************************************************/
+
+/*
+ *@@ dbgPrintStackFrame:
+ * parses and dumps one stack frame.
+ * Called from excPrintStackFrame.
+ *
+ * This calls dbgPrintDebugInfo and, if
+ * that fails, dbgPrintSYMInfo.
+ *
+ *@@added V0.9.2 (2000-03-10) [umoeller]
+ *@@changed V0.9.3 (2000-04-10) [umoeller]: added support for non-Warp 4 SYM files
+ *@@changed V0.9.3 (2000-04-26) [umoeller]: this broke Warp 4 FP 13, fixed
+ */
+
+BOOL dbgPrintStackFrame(FILE *LogFile,
+ PSZ pszModuleName, // in: module name (fully q'fied)
+ ULONG ulObject,
+ ULONG ulOffset)
+{
+ APIRET arc = 0;
+ // "Source file"... columns
+
+//YD do not use debug info
+#define ENABLE_DEBUG_INFO
+#ifdef ENABLE_DEBUG_INFO
+ // first attempt to analyze the debug code
+ arc = dbgPrintDebugInfo(LogFile,
+ pszModuleName,
+ ulObject,
+ ulOffset);
+#else
+ arc = 1;
+#endif
+
+ // if no debug code is available, analyze
+ // the SYM file instead
+ if (arc != NO_ERROR)
+ {
+ CHAR szSymName[CCHMAXPATH];
+ strcpy(szSymName, pszModuleName);
+ strcpy(szSymName + strlen(szSymName) - 3, "SYM");
+ arc = dbgPrintSYMInfo(LogFile,
+ szSymName,
+ ulObject,
+ ulOffset);
+ if (arc != 0)
+ {
+ // SYM file not found in current directory:
+ // check the SYM files in the \OS2 directory,
+ // depending on the OS/2 version level:
+ CHAR szSymFile2[CCHMAXPATH];
+ PSZ pszFilename = strrchr(szSymName, '\\');
+ if (pszFilename)
+ {
+ PSZ pszVersionDir = "WARP4";
+ ULONG aulBuf[3];
+
+ DosQuerySysInfo(QSV_VERSION_MAJOR, // 11
+ QSV_VERSION_MINOR, // 12
+ &aulBuf, sizeof(aulBuf));
+ // Warp 3 is reported as 20.30
+ // Warp 4 is reported as 20.40
+ // Aurora is reported as 20.45
+
+ if (aulBuf[0] == 20)
+ {
+ if (aulBuf[1] == 30)
+ // Warp 3:
+ pszVersionDir = "WARP3";
+ else if (aulBuf[1] >= 40)
+ // Warp 4 or higher:
+ // (NOTE: Warp 4 FP 13 now returns 45 also,
+ // but the SYM files are still in the WARP4 directory...)
+ // V0.9.3 (2000-04-26) [umoeller]
+ pszVersionDir = "WARP4";
+ }
+
+ pszFilename++;
+ sprintf(szSymFile2,
+ "%c:\\OS2\\PDPSI\\PMDF\\%s\\%s",
+ doshQueryBootDrive(),
+ pszVersionDir,
+ pszFilename);
+ arc = dbgPrintSYMInfo(LogFile,
+ szSymFile2,
+ ulObject,
+ ulOffset);
+
+ // V0.9.3 (2000-04-26) [umoeller]
+ if ( (arc != 0) // still not found
+ && (aulBuf[1] == 45) // and running Aurora or Warp 4 FP13?
+ )
+ {
+ // Warp Server for e-Business (aka Warp 4.5):
+ // we use the SYM files for the UNI kernel,
+ // I have found no way to find out whether
+ // we're running on an SMP kernel
+ sprintf(szSymFile2,
+ "%c:\\OS2\\PDPSI\\PMDF\\%s\\%s",
+ doshQueryBootDrive(),
+ "WARP45_U",
+ pszFilename);
+ arc = dbgPrintSYMInfo(LogFile,
+ szSymFile2,
+ ulObject,
+ ulOffset);
+ }
+ }
+ }
+
+ if (arc == 2) // file not found
+ fprintf(LogFile,
+ "Cannot find symbol file %s\n",
+ szSymName);
+ else if (arc != 0)
+ fprintf(LogFile,
+ "Error %lu reading symbol file %s\n",
+ arc,
+ szSymName);
+ }
+
+ return (arc == NO_ERROR);
+}
+
+/*
+ *@@ dbgPrintStack:
+ * this takes stack data from the TIB and
+ * context record data structures and tries
+ * to analyse what the different stack frames
+ * point to.
+ *
+ * For each stack frame, this calls dbgPrintDebugInfo,
+ * and, if that fails, dbgPrintSYMInfo.
+ *
+ * New with V0.84.
+ *
+ *@@changed V0.9.2 (2000-03-08) [umoeller]: now searching OS2\PDPSI\PMDF for SYM files also
+ */
+
+VOID dbgPrintStack(FILE *LogFile, // in: text log file to write to
+ PUSHORT StackBottom,
+ PUSHORT StackTop,
+ PUSHORT Ebp,
+ PUSHORT ExceptionAddress)
+{
+ PUSHORT RetAddr = 0;
+ PUSHORT LastEbp = 0;
+ APIRET rc = 0;
+ ULONG Size = 0,
+ Attr = 0;
+ USHORT Cs = 0,
+ Ip = 0,
+ // Bp,
+ Sp = 0;
+ static char Name[CCHMAXPATH];
+ HMODULE hMod = 0;
+ ULONG ObjNum = 0;
+ ULONG Offset = 0;
+ BOOL fExceptionAddress = TRUE; // Use Exception Addr 1st time thru
+
+ // Note: we can't handle stacks bigger than 64K for now...
+ Sp = (USHORT) (((ULONG) StackBottom) >> 16);
+ // Bp = ;
+
+ if (!f32bit)
+ Ebp = (PUSHORT) MAKEULONG(((USHORT)(ULONG)Ebp), Sp);
+
+ fprintf(LogFile, "\n\nCall stack:\n");
+ fprintf(LogFile, " Source Line Nearest\n");
+ fprintf(LogFile, " EBP Address Module Obj# File Numbr Public Symbol\n");
+ fprintf(LogFile, " �������� ��������- �������� ���� ������������ ����� ������������-\n");
+
+ do
+ {
+ Size = 10;
+ rc = DosQueryMem((PVOID) (Ebp + 2), &Size, &Attr);
+ if (rc != NO_ERROR)
+ {
+ fprintf(LogFile, "Invalid EBP %8.8lX (DosQueryMem returned %lu)\n", (ULONG)Ebp, rc);
+ break;
+ }
+ if (!(Attr & PAG_COMMIT))
+ {
+ fprintf(LogFile, "Invalid EBP %8.8lX (not committed)\n", (ULONG)Ebp);
+ break;
+ }
+ if (Size < 10)
+ {
+ fprintf(LogFile, "Invalid EBP %8.8lX (mem block size < 10)\n", (ULONG)Ebp);
+ break;
+ }
+
+ if (fExceptionAddress)
+ RetAddr = ExceptionAddress;
+ else
+ RetAddr = (PUSHORT) (*((PULONG) (Ebp + 2)));
+
+ if (RetAddr == (PUSHORT) 0x00000053)
+ {
+ // For some reason there's a "return address" of 0x53 following
+ // EBP on the stack and we have to adjust EBP by 44 bytes to get
+ // at the real return address. This has something to do with
+ // thunking from 32bits to 16bits...
+ // Serious kludge, and it's probably dependent on versions of C(++)
+ // runtime or OS, but it works for now!
+ Ebp += 22;
+ RetAddr = (PUSHORT) (*((PULONG) (Ebp + 2)));
+ }
+
+ // Get the (possibly) 16bit CS and IP
+ if (fExceptionAddress)
+ {
+ Cs = (USHORT) (((ULONG) ExceptionAddress) >> 16);
+ Ip = (USHORT) (ULONG) ExceptionAddress;
+ }
+ else
+ {
+ Cs = *(Ebp + 2);
+ Ip = *(Ebp + 1);
+ }
+
+ // if the return address points to the stack then it's really just
+ // a pointer to the return address (UGH!).
+ if ( (USHORT) (((ULONG) RetAddr) >> 16) == Sp
+ )
+ RetAddr = (PUSHORT) (*((PULONG) RetAddr));
+
+ if (Ip == 0 && *Ebp == 0)
+ {
+ // End of the stack so these are both shifted by 2 bytes:
+ Cs = *(Ebp + 3);
+ Ip = *(Ebp + 2);
+ }
+
+ // 16bit programs have on the stack:
+ // BP:IP:CS
+ // where CS may be thunked
+ //
+ // in dump swapped
+ // BP IP CS BP CS IP
+ // 4677 53B5 F7D0 7746 D0F7 B553
+ //
+ // 32bit programs have:
+ // EBP:EIP
+ // and you'd have something like this (with SP added) (not
+ // accurate values)
+ //
+ // in dump swapped
+ // EBP EIP EBP EIP
+ // 4677 2900 53B5 F7D0 0029 7746 D0F7 B553
+ //
+ // So the basic difference is that 32bit programs have a 32bit
+ // EBP and we can attempt to determine whether we have a 32bit
+ // EBP by checking to see if its 'selector' is the same as SP.
+ // Note that this technique limits us to checking stacks < 64K.
+ //
+ // Soooo, if IP (which maps into the same USHORT as the swapped
+ // stack page in EBP) doesn't point to the stack (i.e. it could
+ // be a 16bit IP) then see if CS is valid (as is or thunked).
+ //
+ // Note that there's the possibility of a 16bit return address
+ // that has an offset that's the same as SP so we'll think it's
+ // a 32bit return address and won't be able to successfully resolve
+ // its details.
+ if (Ip != Sp)
+ {
+ if (DosSizeSeg(Cs, &Size) == NO_ERROR)
+ {
+ RetAddr = (USHORT * _Seg16) MAKEULONG(Ip, Cs);
+ f32bit = FALSE;
+ }
+ else if (DosSizeSeg((Cs << 3) + 7, &Size) == NO_ERROR)
+ {
+ Cs = (Cs << 3) + 7;
+ RetAddr = (USHORT * _Seg16) MAKEULONG(Ip, Cs);
+ f32bit = FALSE;
+ }
+ else
+ f32bit = TRUE;
+ }
+ else
+ f32bit = TRUE;
+
+
+ // "EBP" column
+ if (fExceptionAddress)
+ fprintf(LogFile, " Trap -> ");
+ else
+ fprintf(LogFile, " %8.8lX ", (ULONG)Ebp);
+
+ // "Address" column
+ if (f32bit)
+ fprintf(LogFile, ":%8.8lX ", (ULONG)RetAddr);
+ else
+ fprintf(LogFile, "%04.04X:%04.04X ", Cs, Ip);
+
+ // Version check omitted; the following requires
+ // OS/2 2.10 or later (*UM)
+ // if (Version[0] >= 20 && Version[1] >= 10)
+ {
+ // Make a 'tick' sound to let the user know we're still alive
+ DosBeep(2000, 10);
+
+ Size = 10; // Inserted by Kim Rasmussen 26/06 1996 to avoid error 87 when Size is 0
+
+ // "Module"/"Object" columns
+ rc = DosQueryMem((PVOID) RetAddr, &Size, &Attr);
+ if (rc != NO_ERROR || !(Attr & PAG_COMMIT))
+ {
+ fprintf(LogFile, "Invalid RetAddr: %8.8lX\n", (ULONG)RetAddr);
+ break; // avoid infinite loops
+ }
+ else
+ {
+ rc = DosQueryModFromEIP(&hMod,
+ &ObjNum,
+ sizeof(Name), Name,
+ &Offset,
+ (PVOID)RetAddr);
+ if ( (rc == NO_ERROR)
+ // && (ObjNum != -1)
+ )
+ {
+ // static char szJunk[_MAX_FNAME];
+ static char szName[_MAX_FNAME];
+
+ DosQueryModuleName(hMod, sizeof(Name), Name);
+ // _splitpath(Name, szJunk, szJunk, szName, szJunk);
+
+ // print module and object
+ fprintf(LogFile, "%-8s %04lX ", szName, ObjNum + 1);
+
+ if (strlen(Name) > 3)
+ {
+ dbgPrintStackFrame(LogFile,
+ Name,
+ ObjNum,
+ Offset);
+ }
+ }
+ else
+ fprintf(LogFile,
+ "DosQueryModFromEIP failed, returned %lu\n",
+ rc);
+ }
+ }
+
+ if ( ((*Ebp) == 0)
+ && ((*Ebp + 1) == 0)
+ )
+ {
+ fprintf(LogFile, "End of call stack\n");
+ break;
+ }
+
+ if (!fExceptionAddress)
+ {
+ LastEbp = Ebp;
+#if 0
+ Ebp = (PUSHORT) MAKEULONG(Bp, Sp);
+#else // Inserted by Kim Rasmussen 26/06 1996 to allow big stacks
+ if (f32bit)
+ Ebp = (PUSHORT) *(PULONG) LastEbp;
+ else
+ Ebp = (PUSHORT) MAKEULONG((*Ebp), Sp);
+#endif
+ if (f32bit)
+ {
+ dbgPrintVariables(LogFile, (ULONG) Ebp);
+ } // endif
+
+ if (Ebp < LastEbp)
+ {
+ fprintf(LogFile, "... lost stack chain - new EBP below previous\n");
+ break;
+ }
+ }
+ else
+ fExceptionAddress = FALSE;
+
+ Size = 4;
+ rc = DosQueryMem((PVOID) Ebp, &Size, &Attr);
+ if ((rc != NO_ERROR) || (Size < 4))
+ {
+ fprintf(LogFile, "... lost stack chain - invalid EBP: %8.8lX\n", (ULONG)Ebp);
+ break;
+ }
+ } while (TRUE);
+
+ fprintf(LogFile, "\n");
+}
+
+/*
+ *@@ doshQueryBootDrive:
+ * returns the letter of the boot drive as a
+ * single (capital) character, which is useful for
+ * constructing file names using sprintf and such.
+ *
+ *@@changed V0.9.16 (2002-01-13) [umoeller]: optimized
+ */
+
+CHAR doshQueryBootDrive(VOID)
+{
+ // this can never change, so query this only once
+ // V0.9.16 (2002-01-13) [umoeller]
+ static CHAR cBootDrive = '\0';
+
+ if (!cBootDrive)
+ {
+ ULONG ulBootDrive;
+ DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,
+ &ulBootDrive,
+ sizeof(ulBootDrive));
+ cBootDrive = (CHAR)ulBootDrive + 'A' - 1;
+ }
+
+ return (cBootDrive);
+}
diff --git a/sal/osl/os2/diagnose.c b/sal/osl/os2/diagnose.c
new file mode 100644
index 000000000000..4921e20fd5af
--- /dev/null
+++ b/sal/osl/os2/diagnose.c
@@ -0,0 +1,178 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+
+BYTE oslTraceEnv[] = "OSL_TRACE_TO_FILE";
+
+typedef pfunc_osl_printDebugMessage oslDebugMessageFunc;
+static oslDebugMessageFunc volatile g_pDebugMessageFunc = 0;
+
+typedef pfunc_osl_printDetailedDebugMessage oslDetailedDebugMessageFunc;
+static oslDetailedDebugMessageFunc volatile g_pDetailedDebugMessageFunc = 0;
+
+/*----------------------------------------------------------------------------*/
+
+void SAL_CALL osl_breakDebug()
+{
+ __asm__("int $3\n");
+}
+
+/************************************************************************/
+/* osl_trace */
+/************************************************************************/
+/* comment this define to stop output thread identifier*/
+#define OSL_TRACE_THREAD 1
+void SAL_CALL osl_trace (
+ const sal_Char* lpszFormat, ...)
+{
+ va_list args;
+
+#if defined(OSL_PROFILING)
+ fprintf(stderr, "Time: %06lu : ", osl_getGlobalTimer() );
+#else
+#if defined(OSL_TRACE_THREAD)
+ fprintf(stderr,"Thread: %6d :",osl_getThreadIdentifier(NULL));
+#else
+ fprintf(stderr, "Trace Message: ");
+#endif
+#endif
+
+ va_start(args, lpszFormat);
+ vfprintf(stderr, lpszFormat, args);
+ va_end(args);
+
+ fprintf(stderr,"\n");
+ fflush(stderr);
+}
+
+/*----------------------------------------------------------------------------*/
+
+void SAL_CALL osl_trace__yd_os2(const sal_Char* lpszFormat, ...)
+{
+
+ int nBuf;
+ sal_Char szBuffer[512];
+ sal_Char szPID[ 12 ];
+ va_list args;
+ FILE* pFile;
+ PID pid;
+ PSZ pszOslTraceFile;
+
+ /* if environment variable not set, do nothing */
+ if(DosScanEnv(oslTraceEnv, (PSZ*)&pszOslTraceFile))
+ {
+ return;
+ }
+
+ va_start(args, lpszFormat);
+
+ nBuf = vsprintf(szBuffer, lpszFormat, args);
+ OSL_ASSERT(nBuf < sizeof(szBuffer));
+
+ va_end(args);
+
+ /* get process ID */
+ {
+ PTIB pptib = NULL;
+ PPIB pppib = NULL;
+
+ DosGetInfoBlocks( &pptib, &pppib );
+ pid = pppib->pib_ulpid;
+ }
+
+ pFile = fopen( (const char*)pszOslTraceFile, "a+" );
+ fputs(_itoa( pid, szPID, 10 ), pFile );
+ fputs( ": ", pFile );
+ fputs(szBuffer, pFile);
+ fclose( pFile );
+
+}
+
+/*----------------------------------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_assertFailedLine( const sal_Char* pszFileName, sal_Int32 nLine, const sal_Char* pszMessage)
+{
+ sal_Char szMessage[512];
+
+ /* get app name or NULL if unknown (don't call assert) */
+ sal_Char* lpszAppName = "OSL";
+
+ /* format message into buffer */
+ sprintf(szMessage, "Assertion Failed: %s: File %s, Line %d:\n",
+ lpszAppName, pszFileName, nLine);
+ if(pszMessage != 0)
+ strcat( szMessage, pszMessage );
+
+ szMessage[sizeof(szMessage)-1] = '\0';
+
+ fputs(szMessage, stderr);
+
+ return sal_True; /* abort */
+}
+
+/*----------------------------------------------------------------------------*/
+
+sal_Int32 SAL_CALL osl_reportError(sal_uInt32 nType, const sal_Char* pszMessage)
+{
+ fputs(pszMessage, stderr);
+
+ return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+
+
+/************************************************************************/
+/* osl_setDebugMessageFunc */
+/************************************************************************/
+oslDebugMessageFunc SAL_CALL osl_setDebugMessageFunc (
+ oslDebugMessageFunc pNewFunc)
+{
+ oslDebugMessageFunc pOldFunc = g_pDebugMessageFunc;
+ g_pDebugMessageFunc = pNewFunc;
+ return pOldFunc;
+}
+
+/************************************************************************/
+/* osl_setDetailedDebugMessageFunc */
+/************************************************************************/
+pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc (
+ pfunc_osl_printDetailedDebugMessage pNewFunc)
+{
+ oslDetailedDebugMessageFunc pOldFunc = g_pDetailedDebugMessageFunc;
+ g_pDetailedDebugMessageFunc = pNewFunc;
+ return pOldFunc;
+}
diff --git a/sal/osl/os2/dllentry.c b/sal/osl/os2/dllentry.c
new file mode 100644
index 000000000000..494119599f8b
--- /dev/null
+++ b/sal/osl/os2/dllentry.c
@@ -0,0 +1,75 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+#include "sockimpl.h"
+#include "secimpl.h"
+//#include "daemimpl.h"
+
+#include <osl/diagnose.h>
+
+#ifndef GCC
+sal_uInt32 _System _DLL_InitTerm( sal_uInt32 nModule,
+ sal_uInt32 nFlag )
+{
+ switch( nFlag )
+ {
+ case 0:
+ {
+ /* initialize C runtime library */
+ _CRT_init();
+ {
+ LONG fhToAdd = 0;
+ ULONG fhOld = 0;
+ ULONG ngLastError = DosSetRelMaxFH(&fhToAdd, &fhOld);
+ if (fhOld < 200)
+ ngLastError = DosSetMaxFH(200);
+ }
+
+ /* turn off hardware-errors and exception popups */
+ DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION);
+
+ break;
+ }
+
+ case 1:
+ {
+ /* unload libs (sockets) */
+ ImplFreeTCPIP();
+
+ /* unload libs (security) */
+ ImplFreeUPM();
+
+ break;
+ }
+ }
+
+ return (sal_True);
+}
+#endif
+
+
diff --git a/sal/osl/os2/except.c b/sal/osl/os2/except.c
new file mode 100644
index 000000000000..29962889fb01
--- /dev/null
+++ b/sal/osl/os2/except.c
@@ -0,0 +1,1059 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*
+ *@@sourcefile except.c:
+ * this file contains powerful exception handlers.
+ * except.h also defines easy-to-use macros for them.
+ *
+ * Usage: All OS/2 programs, PM or text mode.
+ *
+ * <B>Introduction</B>
+ *
+ * OS/2 exception handlers are a mess to program and,
+ * if installed wrongly, almost impossible to debug.
+ * The problem is that for any program that does a bit
+ * more than showing a message box, using exception
+ * handlers is a must to avoid system hangs. This
+ * especially applies to multi-thread programs using
+ * mutex semaphores (more on that below). The functions
+ * and macros in here are designed to make that more
+ * simple.
+ *
+ * The macros in except.h automatically insert code for
+ * properly registering and deregistering the handlers
+ * in except.c. You should ALWAYS use these macros
+ * instead of directly registering the handlers to avoid
+ * accidentally forgetting to deregister them. If you
+ * forget to deregister an exception handler, this can
+ * lead to really strange errors (crashes, hangs) which
+ * are nearly impossible to debug because the thread's
+ * stack probably got completely messed up.
+ *
+ * The general idea of these macros is to define
+ * TRY / CATCH blocks similar to C++. If an exception
+ * occurs in the TRY block, execution is transferred to
+ * the CATCH block. (This works in both C and C++, by the
+ * way.)
+ *
+ * The "OnKill" function that was added with V0.9.0 has
+ * been removed again with V0.9.7.
+ *
+ * The general usage is like this:
+ *
+ + int your_protected_func(int ...)
+ + {
+ + TRY_LOUD(excptid) // or: TRY_QUIET(excptid)
+ + {
+ + char *p = NULL;
+ +
+ + .... // the stuff in here is protected by
+ + // the excHandlerLoud or excHandlerQuiet
+ + // exception handler
+ + *p = "A";
+ + }
+ + CATCH(excptid)
+ + {
+ + .... // exception occured: react here
+ + } END_CATCH(); // always needed!
+ + } // end of your_func
+ *
+ * TRY_LOUD is for installing excHandlerLoud.
+ * TRY_QUIET is for installing excHandlerQuiet.
+ * CATCH / END_CATCH are the same for the two. This
+ * is where the exception handler jumps to if an
+ * exception occurs.
+ * The CATCH block is _required_ even if you do nothing
+ * in there, because the CATCH() macro will deregister
+ * the handler.
+ *
+ * "excptid" can be any C identifier which is not used in
+ * your current variable scope, e.g. "excpt1". This
+ * is used for creating an EXCEPTSTRUCT variable of
+ * that name on the stack. The "excptid"'s in TRY_* and
+ * CATCH must match, since this is where the macros
+ * store the exception handler data.
+ *
+ * These macros may be nested if you use different
+ * "excptid"'s for sub-macros.
+ *
+ * Inside the TRY and CATCH blocks, you must not use
+ * "goto" (to a location outside the block) or "return",
+ * because this will not deregister the handler.
+ *
+ * Keep in mind that all the code in the TRY_* block is
+ * protected by the handler, including all functions that
+ * get called. So if you enclose your main() code in a
+ * TRY_* block, your entire application is protected.
+ * If any subfunction fails, execution is transferred to
+ * the closest CATCH() that was installed (as with C++
+ * try and catch).
+ *
+ * <B>Asynchronous exceptions</B>
+ *
+ * The exception handlers in this file (which are installed
+ * with the TRY/CATCH mechanism) only intercept synchronous
+ * exceptions, most importantly, XCPT_ACCESS_VIOLATION (see
+ * excHandlerLoud for a list). They do not protect your code
+ * against asynchronous exceptions.
+ *
+ * OS/2 defines asynchronous exceptions to be those that
+ * can be delayed. With OS/2, there are only three of these:
+ *
+ * -- XCPT_PROCESS_TERMINATE
+ * -- XCPT_ASYNC_PROCESS_TERMINATE
+ * -- XCPT_SIGNAL (thread 1 only)
+ *
+ * To protect yourself against these also, put the section
+ * in question in a DosEnterMustComplete/DosExitMustComplete
+ * block as well.
+ *
+ * <B>Mutex semaphores</B>
+ *
+ * The problem with OS/2 mutex semaphores is that they are
+ * sometimes not automatically released when a thread terminates.
+ * If there are several mutexes involved and they are released
+ * in improper order, you can get zombie threads on exit.
+ * Even worse, if this happens to a PM thread, this will hang
+ * the system.
+ *
+ * As a result, you should protect any section of code which
+ * requests a semaphore with the exception handlers.
+ *
+ * So _whenever_ you request a mutex semaphore, enclose
+ * the block with TRY/CATCH in case the code crashes.
+ * Besides, enclose the TRY/CATCH block in a must-complete
+ * section, like this:
+ *
+ + HMTX hmtx = ...
+ +
+ + int your_func(int)
+ + {
+ + BOOL fSemOwned = FALSE;
+ +
+ + TRY_QUIET(excpt1) // or TRY_LOUD
+ + {
+ + if (fSemOwned = !DosRequestMutexSem(hmtx, ...))
+ + { ... // work on your protected data
+ + }
+ + // mutex gets released below
+ + }
+ + CATCH(excpt1) { } END_CATCH(); // always needed!
+ +
+ + if (fSemOwned)
+ + // this gets executed always, even if an exception occured
+ + DosReleaseMutexSem(hmtx);
+ + } // end of your_func
+ *
+ * This way your mutex semaphore gets released in every
+ * possible condition.
+ *
+ * <B>Customizing</B>
+ *
+ * As opposed to versions before 0.9.0, this code is now
+ * completely independent of XWorkplace. This file now
+ * contains "pure" exception handlers only.
+ *
+ * However, you can customize these exception handlers by
+ * calling excRegisterHooks. This is what XWorkplace does now.
+ * This should be done upon initialization of your application.
+ * If excRegisterHooks is not called, the following safe
+ * defaults are used:
+ *
+ * -- the trap log file is TRAP.LOG in the root
+ * directory of your boot drive.
+ *
+ * For details on the provided exception handlers, refer
+ * to excHandlerLoud and excHandlerQuiet.
+ *
+ * More useful debug information can be found in the "OS/2 Debugging
+ * Handbook", which is now available in INF format on the IBM
+ * DevCon site ("http://service2.boulder.ibm.com/devcon/").
+ * This book shows worked examples of how to unwind a stack dump.
+ *
+ * This file incorporates code from the following:
+ * -- Monte Copeland, IBM Boca Ration, Florida, USA (1993)
+ * -- Roman Stangl, from the Program Commander/2 sources
+ * (1997-98)
+ * -- Marc Fiammante, John Currier, Kim Rasmussen,
+ * Anthony Cruise (EXCEPT3.ZIP package for a generic
+ * exception handling DLL, available at Hobbes).
+ *
+ * If not explicitly stated otherwise, the code has been written
+ * by me, Ulrich M�ller.
+ *
+ * Note: Version numbering in this file relates to XWorkplace version
+ * numbering.
+ *
+ *@@header "helpers\except.h"
+ */
+
+/*
+ * This file Copyright (C) 1992-99 Ulrich M�ller,
+ * Monte Copeland,
+ * Roman Stangl,
+ * Kim Rasmussen,
+ * Marc Fiammante,
+ * John Currier,
+ * Anthony Cruise.
+ * This file is part of the "XWorkplace helpers" source package.
+ *
+ * 2009-06-15 published under LGPL3 with Ulrich M�ller permission.
+ *
+ */
+
+#define OS2EMX_PLAIN_CHAR
+ // this is needed for "os2emx.h"; if this is defined,
+ // emx will define PSZ as _signed_ char, otherwise
+ // as unsigned char
+
+#define INCL_DOSMODULEMGR
+#define INCL_DOSEXCEPTIONS
+#define INCL_DOSPROCESS
+#define INCL_DOSMISC
+#define INCL_DOSERRORS
+#include <os2.h>
+
+// C library headers
+#include <stdio.h> // needed for except.h
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include <setjmp.h> // needed for except.h
+#include <assert.h> // needed for except.h
+
+#define DONT_REPLACE_MALLOC
+#include "helpers\setup.h" // code generation and debugging options
+
+// headers in /helpers
+#include "helpers\dosh.h" // Control Program helper routines
+#include "helpers\except.h" // exception handling
+#include "helpers\debug.h" // symbol/debug code analysis
+
+#pragma hdrstop
+
+/* ******************************************************************
+ *
+ * Global variables
+ *
+ ********************************************************************/
+
+// hooks to be registered using excRegisterHooks
+PFNEXCOPENFILE G_pfnExcOpenFile = 0;
+PFNEXCHOOK G_pfnExcHook = 0;
+PFNEXCHOOKERROR G_pfnExcHookError = 0;
+// beep flag for excHandlerLoud
+BOOL G_fBeepOnException = TRUE;
+
+ULONG G_ulExplainExceptionRunning = 0;
+ // global flag which is != 0 if some exception handler
+ // is inside excExplainException, so that XShutdown can
+ // wait until the trap log is done;
+ // this is exported thru except.h
+ // V0.9.13 (2001-06-19) [umoeller]
+
+/*
+ *@@category: Helpers\Control program helpers\Exceptions/debugging
+ * See except.c.
+ */
+
+/* ******************************************************************
+ *
+ * Exception helper routines
+ *
+ ********************************************************************/
+
+/*
+ *@@ excDescribePage:
+ *
+ */
+
+VOID excDescribePage(FILE *file, ULONG ulCheck)
+{
+ APIRET arc;
+ ULONG ulCountPages = 1;
+ ULONG ulFlagsPage = 0;
+ arc = DosQueryMem((PVOID)ulCheck, &ulCountPages, &ulFlagsPage);
+
+ if (arc == NO_ERROR)
+ {
+ fprintf(file, "valid, flags: ");
+ if (ulFlagsPage & PAG_READ)
+ fprintf(file, "read ");
+ if (ulFlagsPage & PAG_WRITE)
+ fprintf(file, "write ");
+ if (ulFlagsPage & PAG_EXECUTE)
+ fprintf(file, "execute ");
+ if (ulFlagsPage & PAG_GUARD)
+ fprintf(file, "guard ");
+ if (ulFlagsPage & PAG_COMMIT)
+ fprintf(file, "committed ");
+ if (ulFlagsPage & PAG_SHARED)
+ fprintf(file, "shared ");
+ if (ulFlagsPage & PAG_FREE)
+ fprintf(file, "free ");
+ if (ulFlagsPage & PAG_BASE)
+ fprintf(file, "base ");
+ }
+ else if (arc == ERROR_INVALID_ADDRESS)
+ fprintf(file, "invalid");
+}
+
+/*
+ *@@ excPrintStackFrame:
+ * wrapper for dbgPrintStackFrame to format
+ * output stuff right.
+ *
+ *@@added V0.9.2 (2000-03-10) [umoeller]
+ *@@changed V0.9.12 (2001-05-12) [umoeller]: added seg:ofs to output always
+ */
+
+VOID excPrintStackFrame(FILE *file, // in: output log file
+ PSZ pszDescription, // in: description for stack frame (should be eight chars)
+ ULONG ulAddress) // in: address to debug
+{
+ APIRET arc = NO_ERROR;
+ HMODULE hmod1 = NULLHANDLE;
+ CHAR szMod1[2*CCHMAXPATH] = "unknown";
+ ULONG ulObject = 0,
+ ulOffset = 0;
+ fprintf(file,
+ " %-8s: %08lX ",
+ pszDescription,
+ ulAddress);
+ arc = DosQueryModFromEIP(&hmod1,
+ &ulObject,
+ sizeof(szMod1), szMod1,
+ &ulOffset,
+ ulAddress);
+
+ if (arc != NO_ERROR)
+ {
+ // error:
+ fprintf(file,
+ " %-8s Error: DosQueryModFromEIP returned %lu\n",
+ szMod1,
+ arc);
+ }
+ else
+ {
+ CHAR szFullName[2*CCHMAXPATH];
+
+ fprintf(file,
+ " %-8s %02lX:%08lX\n ",
+ szMod1,
+ ulObject + 1, // V0.9.12 (2001-05-12) [umoeller]
+ ulOffset); // V0.9.12 (2001-05-12) [umoeller]
+
+ DosQueryModuleName(hmod1, sizeof(szFullName), szFullName);
+ dbgPrintStackFrame(file,
+ szFullName,
+ ulObject,
+ ulOffset);
+
+ fprintf(file, "\n");
+
+ // make a 'tick' sound to let the user know we're still alive
+ DosBeep(2000, 10);
+ }
+}
+
+/*
+ *@@ excDumpStackFrames:
+ * called from excExplainException to dump the
+ * thread's stack frames. This calls excPrintStackFrame
+ * for each stack frame found.
+ *
+ *@@added V0.9.4 (2000-06-15) [umoeller]
+ */
+
+VOID excDumpStackFrames(FILE *file, // in: logfile from fopen()
+ PTIB ptib,
+ PCONTEXTRECORD pContextRec) // in: excpt info
+{
+ PULONG pulStackWord = 0;
+
+ fprintf(file, "\n\nStack frames:\n Address Module seg:ofs\n");
+
+ // first the trapping address itself
+ excPrintStackFrame(file,
+ "CS:EIP ",
+ pContextRec->ctx_RegEip);
+
+
+ pulStackWord = (PULONG)pContextRec->ctx_RegEbp;
+ /* if (pContextRec->ctx_RegEbp < pContextRec->ctx_RegEsp)
+ pulStackWord = (PULONG)(pContextRec->ctx_RegEbp & 0xFFFFFFF0);
+ else
+ pulStackWord = (PULONG)(pContextRec->ctx_RegEsp & 0xFFFFFFF0); */
+
+ while ( (pulStackWord != 0)
+ && (pulStackWord < (PULONG)ptib->tib_pstacklimit)
+ )
+ {
+ CHAR szAddress[20];
+
+ if (((ULONG)pulStackWord & 0x00000FFF) == 0x00000000)
+ {
+ // we're on a page boundary: check access
+ ULONG ulCountPages = 0x1000;
+ ULONG ulFlagsPage = 0;
+ APIRET arc = DosQueryMem((void *)pulStackWord,
+ &ulCountPages,
+ &ulFlagsPage);
+ if ( (arc != NO_ERROR)
+ || ( (arc == NO_ERROR)
+ && ( !( ((ulFlagsPage & (PAG_COMMIT|PAG_READ))
+ == (PAG_COMMIT|PAG_READ)
+ )
+ )
+ )
+ )
+ )
+ {
+ fprintf(file, "\n %08lX: ", (ULONG)pulStackWord);
+ fprintf(file, "Page inaccessible");
+ pulStackWord += 0x1000;
+ continue; // for
+ }
+ }
+
+ sprintf(szAddress, "%08lX",
+ (ULONG)pulStackWord);
+ excPrintStackFrame(file,
+ szAddress,
+ *(pulStackWord+1));
+ pulStackWord = (PULONG)*(pulStackWord);
+
+ if (pulStackWord == 0)
+ fprintf(file, "\n pulStackWord == 0");
+ else if (pulStackWord >= (PULONG)ptib->tib_pstacklimit)
+ fprintf(file, "\n pulStackWord >= (PULONG)ptib->tib_pstacklimit");
+ } // end while
+}
+
+/*
+ *@@ excExplainException:
+ * used by the exception handlers below to write
+ * LOTS of information about the exception into a logfile.
+ *
+ * This calls excPrintStackFrame for each stack frame.
+ *
+ *@@changed V0.9.0 [umoeller]: added support for application hook
+ *@@changed V0.9.0 (99-11-02) [umoeller]: added TID to dump
+ *@@changed V0.9.2 (2000-03-10) [umoeller]: now using excPrintStackFrame
+ *@@changed V0.9.3 (2000-05-03) [umoeller]: fixed crashes
+ *@@changed V0.9.6 (2000-11-06) [umoeller]: added more register dumps
+ *@@changed V0.9.13 (2001-06-19) [umoeller]: added global flag for whether this is running
+ *@@changed V0.9.16 (2001-11-02) [pr]: make object display signed
+ *@@changed V0.9.19 (2002-03-28) [umoeller]: added thread ordinal
+ */
+
+VOID excExplainException(FILE *file, // in: logfile from fopen()
+ PSZ pszHandlerName, // in: descriptive string
+ PEXCEPTIONREPORTRECORD pReportRec, // in: excpt info
+ PCONTEXTRECORD pContextRec) // in: excpt info
+{
+ ULONG aulBuf[3];
+ const char *pcszVersion = "unknown";
+
+ PTIB ptib = NULL;
+ PPIB ppib = NULL;
+ HMODULE hMod1, hMod2;
+ CHAR szMod1[CCHMAXPATH] = "unknown",
+ szMod2[CCHMAXPATH] = "unknown";
+ ULONG ulObjNum,
+ ulOffset;
+ ULONG ul;
+
+ ULONG ulOldPriority = 0x0100; // regular, delta 0
+
+ // raise global flag for whether this func is running
+ // V0.9.13 (2001-06-19) [umoeller]
+ G_ulExplainExceptionRunning++;
+
+ // raise this thread's priority, because this
+ // might take some time
+ if (DosGetInfoBlocks(&ptib, &ppib) == NO_ERROR)
+ if (ptib)
+ if (ptib->tib_ptib2)
+ {
+ ulOldPriority = ptib->tib_ptib2->tib2_ulpri;
+ DosSetPriority(PRTYS_THREAD,
+ PRTYC_REGULAR,
+ PRTYD_MAXIMUM,
+ 0); // current thread
+ }
+
+ // make some noise
+#ifndef __NOEXCEPTIONBEEPS__ // V0.9.19 (2002-04-17) [umoeller]
+ if (G_fBeepOnException)
+ {
+ DosBeep( 250, 30);
+ DosBeep( 500, 30);
+ DosBeep(1000, 30);
+ DosBeep(2000, 30);
+ DosBeep(4000, 30);
+ DosBeep(2000, 30);
+ DosBeep(1000, 30);
+ DosBeep( 500, 30);
+ DosBeep( 250, 30);
+ }
+#endif
+
+ // generic exception info
+ DosQuerySysInfo(QSV_VERSION_MAJOR, // 11
+ QSV_VERSION_MINOR, // 12
+ &aulBuf, sizeof(aulBuf));
+ // Warp 3 is reported as 20.30
+ // Warp 4 is reported as 20.40
+ // Aurora is reported as 20.45
+
+ if (aulBuf[0] == 20)
+ {
+ switch (aulBuf[1])
+ {
+ case 30: pcszVersion = "Warp 3"; break;
+ case 40: pcszVersion = "Warp 4"; break;
+ case 45: pcszVersion = "WSeB kernel"; break;
+ }
+ }
+ fprintf(file,
+ "Running OS/2 version: %u.%u (%s)\n",
+ aulBuf[0], // major
+ aulBuf[1],
+ pcszVersion);
+
+
+ // generic exception info
+ fprintf(file,
+ "\n%s:\n Exception type: %08lX\n Address: %08lX\n Params: ",
+ pszHandlerName,
+ pReportRec->ExceptionNum,
+ (ULONG)pReportRec->ExceptionAddress);
+ for (ul = 0; ul < pReportRec->cParameters; ul++)
+ {
+ fprintf(file, "%08lX ",
+ pReportRec->ExceptionInfo[ul]);
+ }
+
+ // now explain the exception in a bit more detail;
+ // depending on the exception, pReportRec->ExceptionInfo
+ // contains some useful data
+ switch (pReportRec->ExceptionNum)
+ {
+ case XCPT_ACCESS_VIOLATION:
+ fprintf(file, "\nXCPT_ACCESS_VIOLATION: ");
+ if (pReportRec->ExceptionInfo[0] & XCPT_READ_ACCESS)
+ fprintf(file, "Invalid read access from 0x%04lX:%08lX.\n",
+ pContextRec->ctx_SegDs, pReportRec->ExceptionInfo[1]);
+ else if (pReportRec->ExceptionInfo[0] & XCPT_WRITE_ACCESS)
+ fprintf(file, "Invalid write access to 0x%04lX:%08lX.\n",
+ pContextRec->ctx_SegDs, pReportRec->ExceptionInfo[1]);
+ else if (pReportRec->ExceptionInfo[0] & XCPT_SPACE_ACCESS)
+ fprintf(file, "Invalid space access at 0x%04lX.\n",
+ pReportRec->ExceptionInfo[1]);
+ else if (pReportRec->ExceptionInfo[0] & XCPT_LIMIT_ACCESS)
+ fprintf(file, "Invalid limit access occurred.\n");
+ else if (pReportRec->ExceptionInfo[0] == XCPT_UNKNOWN_ACCESS)
+ fprintf(file, "unknown at 0x%04lX:%08lX\n",
+ pContextRec->ctx_SegDs, pReportRec->ExceptionInfo[1]);
+ fprintf(file,
+ "Explanation: An attempt was made to access a memory object which does\n"
+ " not belong to the current process. Most probable causes\n"
+ " for this are that an invalid pointer was used, there was\n"
+ " confusion with administering memory or error conditions \n"
+ " were not properly checked for.\n");
+ break;
+
+ case XCPT_INTEGER_DIVIDE_BY_ZERO:
+ fprintf(file, "\nXCPT_INTEGER_DIVIDE_BY_ZERO.\n");
+ fprintf(file,
+ "Explanation: An attempt was made to divide an integer value by zero,\n"
+ " which is not defined.\n");
+ break;
+
+ case XCPT_ILLEGAL_INSTRUCTION:
+ fprintf(file, "\nXCPT_ILLEGAL_INSTRUCTION.\n");
+ fprintf(file,
+ "Explanation: An attempt was made to execute an instruction that\n"
+ " is not defined on this machine's architecture.\n");
+ break;
+
+ case XCPT_PRIVILEGED_INSTRUCTION:
+ fprintf(file, "\nXCPT_PRIVILEGED_INSTRUCTION.\n");
+ fprintf(file,
+ "Explanation: An attempt was made to execute an instruction that\n"
+ " is not permitted in the current machine mode or that\n"
+ " the program had no permission to execute.\n");
+ break;
+
+ case XCPT_INTEGER_OVERFLOW:
+ fprintf(file, "\nXCPT_INTEGER_OVERFLOW.\n");
+ fprintf(file,
+ "Explanation: An integer operation generated a carry-out of the most\n"
+ " significant bit. This is a sign of an attempt to store\n"
+ " a value which does not fit into an integer variable.\n");
+ break;
+
+ default:
+ fprintf(file, "\nUnknown OS/2 exception number %d.\n", pReportRec->ExceptionNum);
+ fprintf(file, "Look this up in the OS/2 header files.\n");
+ break;
+ }
+
+ // V0.9.16 (2001-11-02) [pr]: We already got this info. above - this overwrites the
+ // original values before the priority change, which is rather confusing.
+ // if (DosGetInfoBlocks(&ptib, &ppib) == NO_ERROR)
+ {
+ /*
+ * process info:
+ *
+ */
+
+ if ((ptib) && (ppib)) // (99-11-01) [umoeller]
+ {
+ if (pContextRec->ContextFlags & CONTEXT_CONTROL)
+ {
+ // get the main module
+ hMod1 = ppib->pib_hmte;
+ DosQueryModuleName(hMod1,
+ sizeof(szMod1),
+ szMod1);
+
+ // get the trapping module
+ DosQueryModFromEIP(&hMod2,
+ &ulObjNum,
+ sizeof(szMod2),
+ szMod2,
+ &ulOffset,
+ pContextRec->ctx_RegEip);
+ DosQueryModuleName(hMod2,
+ sizeof(szMod2),
+ szMod2);
+ }
+
+ fprintf(file,
+ "\nProcess information:"
+ "\n Process ID: 0x%lX"
+ "\n Process module: 0x%lX (%s)"
+ "\n Trapping module: 0x%lX (%s)"
+ "\n Object: %ld\n", // V0.9.16 (2001-11-02) [pr]: make this display signed
+ ppib->pib_ulpid,
+ hMod1, szMod1,
+ hMod2, szMod2,
+ ulObjNum);
+
+ fprintf(file,
+ "\nTrapping thread information:"
+ "\n Thread ID: 0x%lX (%lu)"
+ "\n Thread slot ID: 0x%lX (%lu)" // added V0.9.19 (2002-03-28) [umoeller]
+ "\n Priority: 0x%lX\n",
+ ptib->tib_ptib2->tib2_ultid, ptib->tib_ptib2->tib2_ultid,
+ ptib->tib_ordinal, ptib->tib_ordinal,
+ ulOldPriority);
+ }
+ else
+ fprintf(file, "\nProcess information was not available.");
+
+ /*
+ * now call the hook, if one has been defined,
+ * so that the application can write additional
+ * information to the traplog (V0.9.0)
+ */
+
+ if (G_pfnExcHook)
+ G_pfnExcHook(file, ptib, ulOldPriority); // V0.9.16 (2001-12-02) [pr]
+
+ // *** registers
+
+ fprintf(file, "\nRegisters:");
+ if (pContextRec->ContextFlags & CONTEXT_INTEGER)
+ {
+ // DS the following 4 added V0.9.6 (2000-11-06) [umoeller]
+ fprintf(file, "\n DS = %08lX ", pContextRec->ctx_SegDs);
+ excDescribePage(file, pContextRec->ctx_SegDs);
+ // ES
+ fprintf(file, "\n ES = %08lX ", pContextRec->ctx_SegEs);
+ excDescribePage(file, pContextRec->ctx_SegEs);
+ // FS
+ fprintf(file, "\n FS = %08lX ", pContextRec->ctx_SegFs);
+ excDescribePage(file, pContextRec->ctx_SegFs);
+ // GS
+ fprintf(file, "\n GS = %08lX ", pContextRec->ctx_SegGs);
+ excDescribePage(file, pContextRec->ctx_SegGs);
+
+ // EAX
+ fprintf(file, "\n EAX = %08lX ", pContextRec->ctx_RegEax);
+ excDescribePage(file, pContextRec->ctx_RegEax);
+ // EBX
+ fprintf(file, "\n EBX = %08lX ", pContextRec->ctx_RegEbx);
+ excDescribePage(file, pContextRec->ctx_RegEbx);
+ // ECX
+ fprintf(file, "\n ECX = %08lX ", pContextRec->ctx_RegEcx);
+ excDescribePage(file, pContextRec->ctx_RegEcx);
+ // EDX
+ fprintf(file, "\n EDX = %08lX ", pContextRec->ctx_RegEdx);
+ excDescribePage(file, pContextRec->ctx_RegEdx);
+ // ESI
+ fprintf(file, "\n ESI = %08lX ", pContextRec->ctx_RegEsi);
+ excDescribePage(file, pContextRec->ctx_RegEsi);
+ // EDI
+ fprintf(file, "\n EDI = %08lX ", pContextRec->ctx_RegEdi);
+ excDescribePage(file, pContextRec->ctx_RegEdi);
+ fprintf(file, "\n");
+ }
+ else
+ fprintf(file, " not available\n");
+
+ if (pContextRec->ContextFlags & CONTEXT_CONTROL)
+ {
+
+ // *** instruction
+
+ fprintf(file, "Instruction pointer (where exception occured):\n CS:EIP = %04lX:%08lX ",
+ pContextRec->ctx_SegCs,
+ pContextRec->ctx_RegEip);
+ excDescribePage(file, pContextRec->ctx_RegEip);
+
+ // *** CPU flags
+
+ fprintf(file, "\n EFLAGS = %08lX", pContextRec->ctx_EFlags);
+
+ /*
+ * stack:
+ *
+ */
+
+ fprintf(file, "\nStack:\n Base: %08lX\n Limit: %08lX",
+ (ULONG)(ptib ? ptib->tib_pstack : 0),
+ (ULONG)(ptib ? ptib->tib_pstacklimit : 0));
+ fprintf(file, "\n SS:ESP = %04lX:%08lX ",
+ pContextRec->ctx_SegSs,
+ pContextRec->ctx_RegEsp);
+ excDescribePage(file, pContextRec->ctx_RegEsp);
+
+ fprintf(file, "\n EBP = %08lX ", pContextRec->ctx_RegEbp);
+ excDescribePage(file, pContextRec->ctx_RegEbp);
+
+ /*
+ * stack dump:
+ */
+
+ if (ptib != 0)
+ {
+ excDumpStackFrames(file, ptib, pContextRec);
+ }
+ }
+ }
+ fprintf(file, "\n");
+
+ // reset old priority
+ DosSetPriority(PRTYS_THREAD,
+ (ulOldPriority & 0x0F00) >> 8,
+ (UCHAR)ulOldPriority,
+ 0); // current thread
+
+ // lower global flag again V0.9.13 (2001-06-19) [umoeller]
+ G_ulExplainExceptionRunning--;
+}
+
+/* ******************************************************************
+ *
+ * Exported routines
+ *
+ ********************************************************************/
+
+/*
+ *@@ excRegisterHooks:
+ * this registers hooks which get called for
+ * exception handlers. You can set any of the
+ * hooks to NULL for safe defaults (see top of
+ * except.c for details). You can set none,
+ * one, or both of the hooks, and you can call
+ * this function several times.
+ *
+ * Both hooks get called whenever an exception
+ * occurs, so there better be no bugs in these
+ * routines. ;-) They only get called from
+ * within excHandlerLoud (because excHandlerQuiet
+ * writes no trap logs).
+ *
+ * The hooks are as follows:
+ *
+ * -- pfnExcOpenFileNew gets called to open
+ * the trap log file. This must return a FILE*
+ * pointer from fopen(). If this is not defined,
+ * ?:\TRAP.LOG is used. Use this to specify a
+ * different file and have some notes written
+ * into it before the actual exception info.
+ *
+ * -- pfnExcHookNew gets called while the trap log
+ * is being written. At this point,
+ * the following info has been written into
+ * the trap log already:
+ * -- exception type/address block
+ * -- exception explanation
+ * -- process information
+ *
+ * _After_ the hook, the exception handler
+ * continues with the "Registers" information
+ * and stack dump/analysis.
+ *
+ * Use this hook to write additional application
+ * info into the trap log, such as the state
+ * of your own threads and mutexes.
+ *
+ * -- pfnExcHookError gets called when the TRY_* macros
+ * fail to install an exception handler (when
+ * DosSetExceptionHandler fails). I've never seen
+ * this happen.
+ *
+ *@@added V0.9.0 [umoeller]
+ *@@changed V0.9.2 (2000-03-10) [umoeller]: pfnExcHookError added
+ */
+
+VOID excRegisterHooks(PFNEXCOPENFILE pfnExcOpenFileNew,
+ PFNEXCHOOK pfnExcHookNew,
+ PFNEXCHOOKERROR pfnExcHookError,
+ BOOL fBeepOnExceptionNew)
+{
+ // adjust the global variables
+ G_pfnExcOpenFile = pfnExcOpenFileNew;
+ G_pfnExcHook = pfnExcHookNew;
+ G_pfnExcHookError = pfnExcHookError;
+ G_fBeepOnException = fBeepOnExceptionNew;
+}
+
+/*
+ *@@ excHandlerLoud:
+ * this is the "sophisticated" exception handler;
+ * which gives forth a loud sequence of beeps thru the
+ * speaker, writes a trap log and then returns back
+ * to the thread to continue execution, i.e. the
+ * default OS/2 exception handler will never get
+ * called.
+ *
+ * This requires a setjmp() call on
+ * EXCEPTIONREGISTRATIONRECORD2.jmpThread before
+ * being installed. The TRY_LOUD macro will take
+ * care of this for you (see except.c).
+ *
+ * This intercepts the following exceptions (see
+ * the OS/2 Control Program Reference for details):
+ *
+ * -- XCPT_ACCESS_VIOLATION (traps 0x0d, 0x0e)
+ * -- XCPT_INTEGER_DIVIDE_BY_ZERO (trap 0)
+ * -- XCPT_ILLEGAL_INSTRUCTION (trap 6)
+ * -- XCPT_PRIVILEGED_INSTRUCTION
+ * -- XCPT_INTEGER_OVERFLOW (trap 4)
+ *
+ * For these exceptions, we call the functions in debug.c
+ * to try to find debug code or SYM file information about
+ * what source code corresponds to the error.
+ *
+ * See excRegisterHooks for the default setup of this.
+ *
+ * Note that to get meaningful debugging information
+ * in this handler's traplog, you need the following:
+ *
+ * a) have a MAP file created at link time (/MAP)
+ *
+ * b) convert the MAP to a SYM file using MAPSYM
+ *
+ * c) put the SYM file in the same directory of
+ * the module (EXE or DLL). This must have the
+ * same filestem as the module.
+ *
+ * All other exceptions are passed to the next handler
+ * in the exception handler chain. This might be the
+ * C/C++ compiler handler or the default OS/2 handler,
+ * which will probably terminate the process.
+ *
+ *@@changed V0.9.0 [umoeller]: added support for thread termination
+ *@@changed V0.9.2 (2000-03-10) [umoeller]: switched date format to ISO
+ *@@changed V0.9.19 (2002-05-07) [umoeller]: added EXCEPTIONREPORTRECORD info so that catch block can check that
+ */
+
+ULONG _System excHandlerLoud(PEXCEPTIONREPORTRECORD pReportRec,
+ PEXCEPTIONREGISTRATIONRECORD2 pRegRec2,
+ PCONTEXTRECORD pContextRec,
+ PVOID pv)
+{
+ /* From the VAC++3 docs:
+ * "The first thing an exception handler should do is check the
+ * exception flags. If EH_EXIT_UNWIND is set, meaning
+ * the thread is ending, the handler tells the operating system
+ * to pass the exception to the next exception handler. It does the
+ * same if the EH_UNWINDING flag is set, the flag that indicates
+ * this exception handler is being removed.
+ * The EH_NESTED_CALL flag indicates whether the exception
+ * occurred within an exception handler. If the handler does
+ * not check this flag, recursive exceptions could occur until
+ * there is no stack remaining."
+ * So for all these conditions, we exit immediately.
+ */
+
+ if (pReportRec->fHandlerFlags & EH_EXIT_UNWIND)
+ return (XCPT_CONTINUE_SEARCH);
+ if (pReportRec->fHandlerFlags & EH_UNWINDING)
+ return (XCPT_CONTINUE_SEARCH);
+ if (pReportRec->fHandlerFlags & EH_NESTED_CALL)
+ return (XCPT_CONTINUE_SEARCH);
+
+ switch (pReportRec->ExceptionNum)
+ {
+ case XCPT_ACCESS_VIOLATION:
+ case XCPT_INTEGER_DIVIDE_BY_ZERO:
+ case XCPT_ILLEGAL_INSTRUCTION:
+ case XCPT_PRIVILEGED_INSTRUCTION:
+ case XCPT_INVALID_LOCK_SEQUENCE:
+ case XCPT_INTEGER_OVERFLOW:
+ {
+ // "real" exceptions:
+ FILE *file;
+
+ // open traplog file;
+ if (G_pfnExcOpenFile)
+ // hook defined for this: call it
+ file = (*G_pfnExcOpenFile)();
+ else
+ {
+ CHAR szFileName[100];
+ // no hook defined: open some
+ // default traplog file in root directory of
+ // boot drive
+ sprintf(szFileName, "%c:\\trap.log", doshQueryBootDrive());
+ file = fopen(szFileName, "a");
+
+ if (file)
+ {
+ DATETIME DT;
+ DosGetDateTime(&DT);
+ fprintf(file,
+ "\nTrap message -- Date: %04d-%02d-%02d, Time: %02d:%02d:%02d\n",
+ DT.year, DT.month, DT.day,
+ DT.hours, DT.minutes, DT.seconds);
+ fprintf(file, "------------------------------------------------\n");
+
+ }
+ }
+
+ // write error log
+ excExplainException(file,
+ "excHandlerLoud",
+ pReportRec,
+ pContextRec);
+ fclose(file);
+
+ // copy report rec to user buffer
+ // V0.9.19 (2002-05-07) [umoeller]
+ memcpy(&pRegRec2->err,
+ pReportRec,
+ sizeof(EXCEPTIONREPORTRECORD));
+
+ // jump back to failing routine
+ longjmp(pRegRec2->jmpThread, pReportRec->ExceptionNum);
+ break; }
+ }
+
+ // not handled
+ return (XCPT_CONTINUE_SEARCH);
+}
+
+/*
+ *@@ excHandlerQuiet:
+ * "quiet" xcpt handler, which simply suppresses exceptions;
+ * this is useful for certain error-prone functions, where
+ * exceptions are likely to appear, for example used by
+ * wpshCheckObject to implement a fail-safe SOM object check.
+ *
+ * This does _not_ write an error log and makes _no_ sound.
+ * This simply jumps back to the trapping thread or
+ * calls EXCEPTIONREGISTRATIONRECORD2.pfnOnKill.
+ *
+ * Other than that, this behaves like excHandlerLoud.
+ *
+ * This is best registered thru the TRY_QUIET macro
+ * (new with V0.84, described in except.c), which
+ * does the necessary setup.
+ *
+ *@@changed V0.9.0 [umoeller]: added support for thread termination
+ *@@changed V0.9.19 (2002-05-07) [umoeller]: added EXCEPTIONREPORTRECORD info so that catch block can check that
+ */
+
+ULONG _System excHandlerQuiet(PEXCEPTIONREPORTRECORD pReportRec,
+ PEXCEPTIONREGISTRATIONRECORD2 pRegRec2,
+ PCONTEXTRECORD pContextRec,
+ PVOID pv)
+{
+ if (pReportRec->fHandlerFlags & EH_EXIT_UNWIND)
+ return (XCPT_CONTINUE_SEARCH);
+ if (pReportRec->fHandlerFlags & EH_UNWINDING)
+ return (XCPT_CONTINUE_SEARCH);
+ if (pReportRec->fHandlerFlags & EH_NESTED_CALL)
+ return (XCPT_CONTINUE_SEARCH);
+
+ switch (pReportRec->ExceptionNum)
+ {
+ case XCPT_ACCESS_VIOLATION:
+ case XCPT_INTEGER_DIVIDE_BY_ZERO:
+ case XCPT_ILLEGAL_INSTRUCTION:
+ case XCPT_PRIVILEGED_INSTRUCTION:
+ case XCPT_INVALID_LOCK_SEQUENCE:
+ case XCPT_INTEGER_OVERFLOW:
+ // write excpt explanation only if the
+ // resp. debugging #define is set (setup.h)
+ #ifdef DEBUG_WRITEQUIETEXCPT
+ {
+ FILE *file = excOpenTraplogFile();
+ excExplainException(file,
+ "excHandlerQuiet",
+ pReportRec,
+ pContextRec);
+ fclose(file);
+ }
+ #endif
+
+ // copy report rec to user buffer
+ // V0.9.19 (2002-05-07) [umoeller]
+ memcpy(&pRegRec2->err,
+ pReportRec,
+ sizeof(EXCEPTIONREPORTRECORD));
+
+ // jump back to failing routine
+ longjmp(pRegRec2->jmpThread, pReportRec->ExceptionNum);
+ break;
+
+ default:
+ break;
+ }
+
+ return (XCPT_CONTINUE_SEARCH);
+}
+
+
diff --git a/sal/osl/os2/file.cxx b/sal/osl/os2/file.cxx
new file mode 100644
index 000000000000..2e668d23d638
--- /dev/null
+++ b/sal/osl/os2/file.cxx
@@ -0,0 +1,3129 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+/************************************************************************
+ * ToDo
+ *
+ * Fix osl_getCanonicalName
+ *
+ * - Fix: check for corresponding struct sizes in exported functions
+ * - check size/use of oslDirectory
+ * - check size/use of oslDirectoryItem
+ * - check size/use of oslFileStatus
+ * - check size/use of oslVolumeDeviceHandle
+ * - check size/use of oslVolumeInfo
+ * - check size/use of oslFileHandle
+ ***********************************************************************/
+
+#define INCL_DOSDEVIOCTL // OS2 device definitions
+
+#include "system.h"
+#include <rtl/alloc.h>
+
+#include "osl/file.hxx"
+
+
+#include <sal/types.h>
+#include <osl/thread.h>
+#include <osl/diagnose.h>
+#include "file_error_transl.h"
+#include <osl/time.h>
+
+#ifndef _FILE_URL_H_
+#include "file_url.h"
+#endif
+
+#include "file_path_helper.hxx"
+#include "uunxapi.hxx"
+
+#ifndef _STRING_H_
+#include <string.h>
+#endif
+
+#ifndef _CTYPE_H_
+#include <ctype.h>
+#endif
+
+#ifndef _WCHAR_H_
+#include <wchar.h>
+#endif
+
+#if OSL_DEBUG_LEVEL > 1
+ extern void debug_ustring(rtl_uString*);
+#endif
+
+
+#ifdef DEBUG_OSL_FILE
+# define PERROR( a, b ) perror( a ); fprintf( stderr, b )
+#else
+# define PERROR( a, b )
+#endif
+
+extern "C" oslFileHandle osl_createFileHandleFromFD( int fd );
+
+ struct errentry errtable[] = {
+ { NO_ERROR, osl_File_E_None }, /* 0 */
+ { ERROR_INVALID_FUNCTION, osl_File_E_INVAL }, /* 1 */
+ { ERROR_FILE_NOT_FOUND, osl_File_E_NOENT }, /* 2 */
+ { ERROR_PATH_NOT_FOUND, osl_File_E_NOENT }, /* 3 */
+ { ERROR_TOO_MANY_OPEN_FILES, osl_File_E_MFILE }, /* 4 */
+ { ERROR_ACCESS_DENIED, osl_File_E_ACCES }, /* 5 */
+ { ERROR_INVALID_HANDLE, osl_File_E_BADF }, /* 6 */
+ { ERROR_ARENA_TRASHED, osl_File_E_NOMEM }, /* 7 */
+ { ERROR_NOT_ENOUGH_MEMORY, osl_File_E_NOMEM }, /* 8 */
+ { ERROR_INVALID_BLOCK, osl_File_E_NOMEM }, /* 9 */
+ { ERROR_BAD_ENVIRONMENT, osl_File_E_2BIG }, /* 10 */
+ { ERROR_BAD_FORMAT, osl_File_E_NOEXEC }, /* 11 */
+ { ERROR_INVALID_ACCESS, osl_File_E_INVAL }, /* 12 */
+ { ERROR_INVALID_DATA, osl_File_E_INVAL }, /* 13 */
+ { ERROR_INVALID_DRIVE, osl_File_E_NOENT }, /* 15 */
+ { ERROR_CURRENT_DIRECTORY, osl_File_E_ACCES }, /* 16 */
+ { ERROR_NOT_SAME_DEVICE, osl_File_E_XDEV }, /* 17 */
+ { ERROR_NO_MORE_FILES, osl_File_E_NOENT }, /* 18 */
+ { ERROR_NOT_READY, osl_File_E_NOTREADY }, /* 21 */
+ { ERROR_LOCK_VIOLATION, osl_File_E_ACCES }, /* 33 */
+ { ERROR_BAD_NETPATH, osl_File_E_NOENT }, /* 53 */
+ { ERROR_NETWORK_ACCESS_DENIED, osl_File_E_ACCES }, /* 65 */
+ { ERROR_BAD_NET_NAME, osl_File_E_NOENT }, /* 67 */
+ { ERROR_FILE_EXISTS, osl_File_E_EXIST }, /* 80 */
+ { ERROR_CANNOT_MAKE, osl_File_E_ACCES }, /* 82 */
+ { ERROR_FAIL_I24, osl_File_E_ACCES }, /* 83 */
+ { ERROR_INVALID_PARAMETER, osl_File_E_INVAL }, /* 87 */
+ { ERROR_NO_PROC_SLOTS, osl_File_E_AGAIN }, /* 89 */
+ { ERROR_DRIVE_LOCKED, osl_File_E_ACCES }, /* 108 */
+ { ERROR_BROKEN_PIPE, osl_File_E_PIPE }, /* 109 */
+ { ERROR_DISK_FULL, osl_File_E_NOSPC }, /* 112 */
+ { ERROR_INVALID_TARGET_HANDLE, osl_File_E_BADF }, /* 114 */
+ { ERROR_INVALID_HANDLE, osl_File_E_INVAL }, /* 124 */
+ { ERROR_WAIT_NO_CHILDREN, osl_File_E_CHILD }, /* 128 */
+ { ERROR_CHILD_NOT_COMPLETE, osl_File_E_CHILD }, /* 129 */
+ { ERROR_DIRECT_ACCESS_HANDLE, osl_File_E_BADF }, /* 130 */
+ { ERROR_NEGATIVE_SEEK, osl_File_E_INVAL }, /* 131 */
+ { ERROR_SEEK_ON_DEVICE, osl_File_E_ACCES }, /* 132 */
+ { ERROR_DIR_NOT_EMPTY, osl_File_E_NOTEMPTY }, /* 145 */
+ { ERROR_NOT_LOCKED, osl_File_E_ACCES }, /* 158 */
+ { ERROR_BAD_PATHNAME, osl_File_E_NOENT }, /* 161 */
+ { ERROR_MAX_THRDS_REACHED, osl_File_E_AGAIN }, /* 164 */
+ { ERROR_LOCK_FAILED, osl_File_E_ACCES }, /* 167 */
+ { ERROR_ALREADY_EXISTS, osl_File_E_EXIST }, /* 183 */
+ { ERROR_FILENAME_EXCED_RANGE, osl_File_E_NOENT }, /* 206 */
+ { ERROR_NESTING_NOT_ALLOWED, osl_File_E_AGAIN }, /* 215 */
+ { ERROR_DIRECTORY, osl_File_E_NOENT }, /* 267 */
+ //{ ERROR_NOT_ENOUGH_QUOTA, osl_File_E_NOMEM } /* 1816 */
+ };
+
+ #define ELEMENTS_OF_ARRAY(arr) (sizeof(arr)/(sizeof((arr)[0])))
+
+ //#####################################################
+ oslFileError MapError(APIRET dwError)
+ {
+ for (int i = 0; i < ELEMENTS_OF_ARRAY(errtable); ++i )
+ {
+ if (dwError == errtable[i].oscode)
+ return static_cast<oslFileError>(errtable[i].errnocode);
+ }
+ return osl_File_E_INVAL;
+ }
+
+/******************************************************************************
+ *
+ * static members
+ *
+ *****************************************************************************/
+
+static const char * pFileLockEnvVar = (char *) -1;
+
+
+/******************************************************************************
+ *
+ * C-String Function Declarations
+ *
+ *****************************************************************************/
+
+static oslFileError osl_psz_getVolumeInformation(const sal_Char* , oslVolumeInfo* pInfo, sal_uInt32 uFieldMask);
+static oslFileError osl_psz_removeFile(const sal_Char* pszPath);
+static oslFileError osl_psz_createDirectory(const sal_Char* pszPath);
+static oslFileError osl_psz_removeDirectory(const sal_Char* pszPath);
+static oslFileError osl_psz_copyFile(const sal_Char* pszPath, const sal_Char* pszDestPath);
+static oslFileError osl_psz_moveFile(const sal_Char* pszPath, const sal_Char* pszDestPath);
+static oslFileError osl_psz_setFileTime(const sal_Char* strFilePath, const TimeValue* pCreationTime, const TimeValue* pLastAccessTime, const TimeValue* pLastWriteTime);
+
+
+/******************************************************************************
+ *
+ * Static Module Utility Function Declarations
+ *
+ *****************************************************************************/
+
+static oslFileError oslDoCopy(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, mode_t nMode, size_t nSourceSize, int DestFileExists);
+static oslFileError oslChangeFileModes(const sal_Char* pszFileName, mode_t nMode, time_t nAcTime, time_t nModTime, uid_t nUID, gid_t nGID);
+static int oslDoCopyLink(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName);
+static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, size_t nSourceSize, mode_t mode);
+static oslFileError oslDoMoveFile(const sal_Char* pszPath, const sal_Char* pszDestPath);
+rtl_uString* oslMakeUStrFromPsz(const sal_Char* pszStr,rtl_uString** uStr);
+
+/******************************************************************************
+ *
+ * Non-Static Utility Function Declarations
+ *
+ *****************************************************************************/
+
+extern "C" int UnicodeToText( char *, size_t, const sal_Unicode *, sal_Int32 );
+extern "C" int TextToUnicode(
+ const char* text, size_t text_buffer_size, sal_Unicode* unic_text, sal_Int32 unic_text_buffer_size);
+
+/******************************************************************************
+ *
+ * 'removeable device' aka floppy functions
+ *
+ *****************************************************************************/
+
+static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath);
+static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy);
+static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy);
+
+#ifdef DEBUG_OSL_FILE
+static void osl_printFloppyHandle(oslVolumeDeviceHandleImpl* hFloppy);
+#endif
+
+/**********************************************
+ * _osl_openLocalRoot
+ * enumerate available drives
+ *********************************************/
+static oslFileError _osl_openLocalRoot( rtl_uString *strDirectoryPath, oslDirectory *pDirectory)
+{
+ rtl_uString *ustrSystemPath = NULL;
+ oslFileError error;
+
+ if ( !pDirectory )
+ return osl_File_E_INVAL;
+
+ *pDirectory = NULL;
+
+ error = osl_getSystemPathFromFileURL_Ex( strDirectoryPath, &ustrSystemPath, sal_False );
+
+ if ( osl_File_E_None == error )
+ {
+ /* create and initialize impl structure */
+ DirectoryImpl* pDirImpl = (DirectoryImpl*) rtl_allocateMemory( sizeof(DirectoryImpl) );
+ if( pDirImpl )
+ {
+ ULONG ulDriveNum;
+ APIRET rc;
+ pDirImpl->uType = DIRECTORYTYPE_LOCALROOT;
+ pDirImpl->ustrPath = ustrSystemPath;
+ rc = DosQueryCurrentDisk (&ulDriveNum, &pDirImpl->ulDriveMap);
+ pDirImpl->pDirStruct = 0;
+ pDirImpl->ulNextDrive = 1;
+ pDirImpl->ulNextDriveMask = 1;
+
+ // determine number of floppy-drives
+ BYTE nFloppies;
+ rc = DosDevConfig( (void*) &nFloppies, DEVINFO_FLOPPY );
+ if (nFloppies == 0) {
+ // if no floppies, start with 3rd drive (C:)
+ pDirImpl->ulNextDrive = 3;
+ pDirImpl->ulNextDriveMask <<= 2;
+ } else if (nFloppies == 1) {
+ // mask drive B (second bit) in this case
+ pDirImpl->ulDriveMap &= ~0x02;
+ }
+ *pDirectory = (oslDirectory) pDirImpl;
+ return osl_File_E_None;
+ }
+ else
+ {
+ errno = osl_File_E_NOMEM;
+ }
+
+ }
+
+ rtl_uString_release( ustrSystemPath );
+ return error;
+}
+
+/**********************************************
+ * _osl_getNextDrive
+ *********************************************/
+static oslFileError SAL_CALL _osl_getNextDrive(
+ oslDirectory Directory, oslDirectoryItem *pItem, sal_uInt32 uHint )
+{
+ DirectoryImpl *pDirImpl = (DirectoryImpl *)Directory;
+ DirectoryItem_Impl *pItemImpl = NULL;
+ rtl_uString * ustrDrive = NULL;
+ BOOL fSuccess;
+ char buffer[3];
+
+ uHint = uHint; /* avoid warnings */
+
+ if ( !pItem )
+ return osl_File_E_INVAL;
+
+ *pItem = NULL;
+
+ if ( !pDirImpl )
+ return osl_File_E_INVAL;
+
+ while( pDirImpl->ulNextDrive <= 26)
+ {
+ // exit if bit==1 -> drive found
+ if (pDirImpl->ulDriveMap & pDirImpl->ulNextDriveMask) {
+
+ /* convert file name to unicode */
+ buffer[0] = '@' + pDirImpl->ulNextDrive;
+ buffer[1] = ':';
+ buffer[2] = 0;
+
+ pItemImpl = (DirectoryItem_Impl*) rtl_allocateMemory(sizeof(DirectoryItem_Impl));
+ if ( !pItemImpl )
+ return osl_File_E_NOMEM;
+
+ memset( pItemImpl, 0, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_DRIVE;
+ pItemImpl->nRefCount = 1;
+
+ rtl_string2UString( &pItemImpl->ustrDrive, buffer, 3,
+ osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pItemImpl->ustrDrive != 0);
+
+ /* use drive as directory item */
+ *pItem = (oslDirectoryItem) pItemImpl;
+ }
+ // scan next bit position
+ pDirImpl->ulNextDrive++;
+ pDirImpl->ulNextDriveMask <<= 1;
+
+ if (*pItem) // item assigned, return now.
+ return osl_File_E_None;
+ }
+
+ // no more items
+ return osl_File_E_NOENT;
+}
+
+/**********************************************
+ * _osl_readdir_impl_
+ *
+ * readdir wrapper, filters out "." and ".."
+ * on request
+ *********************************************/
+
+static struct dirent* _osl_readdir_impl_(DIR* pdir, sal_Bool bFilterLocalAndParentDir)
+{
+ struct dirent* pdirent;
+
+ while ((pdirent = readdir(pdir)) != NULL)
+ {
+ if (bFilterLocalAndParentDir &&
+ ((0 == strcmp(pdirent->d_name, ".")) || (0 == strcmp(pdirent->d_name, ".."))))
+ continue;
+ else
+ break;
+ }
+
+ return pdirent;
+}
+
+/*******************************************************************
+ * osl_openDirectory
+ ******************************************************************/
+
+oslFileError SAL_CALL osl_openDirectory(rtl_uString* ustrDirectoryURL, oslDirectory* pDirectory)
+{
+ rtl_uString* ustrSystemPath = NULL;
+ oslFileError eRet;
+
+ char path[PATH_MAX];
+
+ OSL_ASSERT(ustrDirectoryURL && (ustrDirectoryURL->length > 0));
+ OSL_ASSERT(pDirectory);
+
+ if (0 == ustrDirectoryURL->length )
+ return osl_File_E_INVAL;
+
+ if ( 0 == rtl_ustr_compareIgnoreAsciiCase( ustrDirectoryURL->buffer, (const sal_Unicode*)L"file:///" ) )
+ return _osl_openLocalRoot( ustrDirectoryURL, pDirectory );
+
+ /* convert file URL to system path */
+ eRet = osl_getSystemPathFromFileURL_Ex(ustrDirectoryURL, &ustrSystemPath, sal_False);
+
+ if( osl_File_E_None != eRet )
+ return eRet;
+
+ osl_systemPathRemoveSeparator(ustrSystemPath);
+
+ /* convert unicode path to text */
+ if ( UnicodeToText( path, PATH_MAX, ustrSystemPath->buffer, ustrSystemPath->length ) )
+ {
+ // if only the drive is specified (x:), add a \ (x:\) otherwise current
+ // directory is browsed instead of root.
+ if (strlen( path) == 2 && path[1] == ':')
+ strcat( path, "\\");
+ /* open directory */
+ DIR *pdir = opendir( path );
+
+ if( pdir )
+ {
+ /* create and initialize impl structure */
+ DirectoryImpl* pDirImpl = (DirectoryImpl*) rtl_allocateMemory( sizeof(DirectoryImpl) );
+
+ if( pDirImpl )
+ {
+ pDirImpl->uType = DIRECTORYTYPE_FILESYSTEM;
+ pDirImpl->pDirStruct = pdir;
+ pDirImpl->ustrPath = ustrSystemPath;
+
+ *pDirectory = (oslDirectory) pDirImpl;
+ return osl_File_E_None;
+ }
+ else
+ {
+ errno = ENOMEM;
+ closedir( pdir );
+ }
+ }
+ else
+ /* should be removed by optimizer in product version */
+ PERROR( "osl_openDirectory", path );
+ }
+
+ rtl_uString_release( ustrSystemPath );
+
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+}
+
+
+/****************************************************************************
+ * osl_getNextDirectoryItem
+ ***************************************************************************/
+
+oslFileError SAL_CALL osl_getNextDirectoryItem(oslDirectory Directory, oslDirectoryItem* pItem, sal_uInt32 uHint)
+{
+ DirectoryImpl* pDirImpl = (DirectoryImpl*)Directory;
+ DirectoryItem_Impl *pItemImpl = NULL;
+ rtl_uString* ustrFileName = NULL;
+ rtl_uString* ustrFilePath = NULL;
+ struct dirent* pEntry;
+
+ OSL_ASSERT(Directory);
+ OSL_ASSERT(pItem);
+
+ if ((NULL == Directory) || (NULL == pItem))
+ return osl_File_E_INVAL;
+
+ if ( pDirImpl->uType == DIRECTORYTYPE_LOCALROOT)
+ return _osl_getNextDrive( Directory, pItem, uHint );
+
+ pEntry = _osl_readdir_impl_(pDirImpl->pDirStruct, sal_True);
+
+ if (NULL == pEntry)
+ return osl_File_E_NOENT;
+
+ pItemImpl = (DirectoryItem_Impl*) rtl_allocateMemory(sizeof(DirectoryItem_Impl));
+ if ( !pItemImpl )
+ return osl_File_E_NOMEM;
+
+ memset( pItemImpl, 0, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_FILE;
+ pItemImpl->nRefCount = 1;
+ pItemImpl->d_attr = pEntry->d_attr;
+
+ /* convert file name to unicode */
+ rtl_string2UString( &ustrFileName, pEntry->d_name, strlen( pEntry->d_name ),
+ osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(ustrFileName != 0);
+
+ osl_systemPathMakeAbsolutePath(pDirImpl->ustrPath, ustrFileName, &pItemImpl->ustrFilePath);
+ rtl_uString_release( ustrFileName );
+
+ *pItem = (oslDirectoryItem)pItemImpl;
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_closeDirectory */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_closeDirectory( oslDirectory Directory )
+{
+ DirectoryImpl* pDirImpl = (DirectoryImpl*) Directory;
+ oslFileError err = osl_File_E_None;
+
+ OSL_ASSERT( Directory );
+
+ if( NULL == pDirImpl )
+ return osl_File_E_INVAL;
+
+ switch ( pDirImpl->uType )
+ {
+ case DIRECTORYTYPE_FILESYSTEM:
+ if( closedir( pDirImpl->pDirStruct ) )
+ err = oslTranslateFileError(OSL_FET_ERROR, errno);
+ break;
+ case DIRECTORYTYPE_LOCALROOT:
+ err = osl_File_E_None;
+ break;
+#if 0
+ case DIRECTORYTYPE_NETROOT:
+ {
+ DWORD err = WNetCloseEnum(pDirImpl->hDirectory);
+ eError = (err == NO_ERROR) ? osl_File_E_None : MapError(err);
+ }
+ break;
+#endif
+ default:
+ OSL_ENSURE( 0, "Invalid directory type" );
+ break;
+ }
+
+ /* cleanup members */
+ rtl_uString_release( pDirImpl->ustrPath );
+
+ rtl_freeMemory( pDirImpl );
+
+ return err;
+}
+
+/****************************************************************************/
+/* osl_getDirectoryItem */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_getDirectoryItem( rtl_uString* ustrFileURL, oslDirectoryItem* pItem )
+{
+ rtl_uString* strSysFilePath = NULL;
+ oslFileError error = osl_File_E_INVAL;
+ ULONG dwPathType;
+ PATHTYPE type = PATHTYPE_FILE;
+
+ OSL_ASSERT(ustrFileURL);
+ OSL_ASSERT(pItem);
+
+ /* Assume failure */
+ if ( !pItem )
+ return osl_File_E_INVAL;
+ *pItem = NULL;
+
+ if (0 == ustrFileURL->length || NULL == pItem)
+ return osl_File_E_INVAL;
+
+ error = osl_getSystemPathFromFileURL_Ex(ustrFileURL, &strSysFilePath, sal_False);
+
+ if (osl_File_E_None != error)
+ return error;
+
+ dwPathType = IsValidFilePath( strSysFilePath->buffer, NULL, VALIDATEPATH_NORMAL );
+
+ if ( dwPathType & PATHTYPE_IS_VOLUME )
+ type = PATHTYPE_VOLUME;
+ else if ( dwPathType & PATHTYPE_IS_SERVER )
+ type = PATHTYPE_NETSERVER;
+ else
+ type = PATHTYPE_FILE;
+
+ switch ( type )
+ {
+ case PATHTYPE_NETSERVER:
+ {
+ DirectoryItem_Impl* pItemImpl =
+ reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+
+ if ( !pItemImpl )
+ error = osl_File_E_NOMEM;
+
+ if ( osl_File_E_None == error )
+ {
+ memset( pItemImpl, 0, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_SERVER;
+ pItemImpl->nRefCount = 1;
+ rtl_uString_assign( &pItemImpl->ustrFilePath, strSysFilePath );
+
+ *pItem = pItemImpl;
+ }
+ }
+ break;
+ case PATHTYPE_VOLUME:
+ {
+ DirectoryItem_Impl* pItemImpl =
+ reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+
+ if ( !pItemImpl )
+ error = osl_File_E_NOMEM;
+
+ if ( osl_File_E_None == error )
+ {
+ memset( pItemImpl, 0, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_DRIVE;
+ pItemImpl->nRefCount = 1;
+ rtl_uString_assign( &pItemImpl->ustrDrive, strSysFilePath );
+
+ if ( pItemImpl->ustrDrive->buffer[pItemImpl->ustrDrive->length-1] != sal_Unicode('\\') )
+ rtl_uString_newConcat( &pItemImpl->ustrDrive,
+ pItemImpl->ustrDrive, rtl::OUString::createFromAscii( "\\" ).pData);
+
+ *pItem = pItemImpl;
+ }
+ }
+ break;
+ default:
+ case PATHTYPE_FILE:
+ {
+ if ( strSysFilePath->length > 0 && strSysFilePath->buffer[strSysFilePath->length - 1] == '\\' )
+ rtl_uString_newFromStr_WithLength( &strSysFilePath, strSysFilePath->buffer, strSysFilePath->length - 1 );
+
+ if (0 == access_u(strSysFilePath, F_OK))
+ {
+ DirectoryItem_Impl *pItemImpl =
+ reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+
+ memset( pItemImpl, 0, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_FILE;
+ pItemImpl->nRefCount = 1;
+ rtl_uString_assign( &pItemImpl->ustrFilePath, strSysFilePath );
+
+ *pItem = pItemImpl;
+ }
+ else
+ error = oslTranslateFileError(OSL_FET_ERROR, errno);
+ }
+ break;
+ }
+
+ if ( strSysFilePath )
+ rtl_uString_release( strSysFilePath );
+
+ return error;
+}
+
+/****************************************************************************/
+/* osl_acquireDirectoryItem */
+/****************************************************************************/
+
+oslFileError osl_acquireDirectoryItem( oslDirectoryItem Item )
+{
+ OSL_ASSERT( Item );
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ pItemImpl->nRefCount++;
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_releaseDirectoryItem */
+/****************************************************************************/
+
+oslFileError osl_releaseDirectoryItem( oslDirectoryItem Item )
+{
+ OSL_ASSERT( Item );
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ if ( ! --pItemImpl->nRefCount )
+ {
+ if (pItemImpl->ustrFilePath)
+ rtl_uString_release( pItemImpl->ustrFilePath );
+ if (pItemImpl->ustrDrive)
+ rtl_uString_release( pItemImpl->ustrDrive );
+ rtl_freeMemory( pItemImpl );
+ }
+ return osl_File_E_None;
+}
+
+/****************************************************************************
+ * osl_createFileHandleFromFD
+ ***************************************************************************/
+
+oslFileHandle osl_createFileHandleFromFD( int fd )
+{
+ oslFileHandleImpl* pHandleImpl = NULL;
+
+ if ( fd >= 0 )
+ {
+ pHandleImpl = (oslFileHandleImpl*) rtl_allocateMemory( sizeof(oslFileHandleImpl) );
+
+ if( pHandleImpl )
+ {
+ pHandleImpl->ustrFilePath = NULL;
+ rtl_uString_new( &pHandleImpl->ustrFilePath );
+ pHandleImpl->fd = fd;
+
+ /* FIXME: should detect whether the file has been locked */
+ pHandleImpl->bLocked = sal_True;
+ }
+ }
+
+ return (oslFileHandle)pHandleImpl;
+}
+
+/****************************************************************************
+ * osl_openFile
+ ***************************************************************************/
+
+oslFileError osl_openFile( rtl_uString* ustrFileURL, oslFileHandle* pHandle, sal_uInt32 uFlags )
+{
+ oslFileHandleImpl* pHandleImpl = NULL;
+ oslFileError eRet;
+ rtl_uString* ustrFilePath = NULL;
+
+ char buffer[PATH_MAX];
+ int fd;
+ int mode = S_IRUSR | S_IRGRP | S_IROTH;
+ int flags = O_RDONLY;
+
+ struct flock aflock;
+
+ /* locking the complete file */
+ aflock.l_type = 0;
+ aflock.l_whence = SEEK_SET;
+ aflock.l_start = 0;
+ aflock.l_len = 0;
+
+ OSL_ASSERT( ustrFileURL );
+ OSL_ASSERT( pHandle );
+
+ if( ( 0 == ustrFileURL->length ) )
+ return osl_File_E_INVAL;
+
+ /* convert file URL to system path */
+ eRet = osl_getSystemPathFromFileURL( ustrFileURL, &ustrFilePath );
+
+ if( osl_File_E_None != eRet )
+ return eRet;
+
+ osl_systemPathRemoveSeparator(ustrFilePath);
+
+ /* convert unicode path to text */
+ if( UnicodeToText( buffer, PATH_MAX, ustrFilePath->buffer, ustrFilePath->length ) )
+ {
+ /* we do not open devices or such here */
+ if( !( uFlags & osl_File_OpenFlag_Create ) )
+ {
+ struct stat aFileStat;
+
+ if( 0 > stat( buffer, &aFileStat ) )
+ {
+ PERROR( "osl_openFile", buffer );
+ eRet = oslTranslateFileError(OSL_FET_ERROR, errno );
+ }
+
+ else if( !S_ISREG( aFileStat.st_mode ) )
+ {
+ eRet = osl_File_E_INVAL;
+ }
+ }
+
+ if( osl_File_E_None == eRet )
+ {
+ /*
+ * set flags and mode
+ */
+
+ if ( uFlags & osl_File_OpenFlag_Write )
+ {
+ mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+ flags = O_RDWR;
+ aflock.l_type = F_WRLCK;
+ }
+
+ if ( uFlags & osl_File_OpenFlag_Create )
+ {
+ mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+ flags = O_CREAT | O_EXCL | O_RDWR;
+ }
+
+ /* open the file */
+ fd = open( buffer, flags | O_BINARY, mode);
+ if ( fd >= 0 )
+ {
+ sal_Bool bNeedsLock = ( ( uFlags & osl_File_OpenFlag_NoLock ) == 0 );
+ sal_Bool bLocked = sal_False;
+ if( bNeedsLock )
+ {
+ /* check if file lock is enabled and clear l_type member of flock otherwise */
+ if( (char *) -1 == pFileLockEnvVar )
+ {
+ /* FIXME: this is not MT safe */
+ pFileLockEnvVar = getenv("SAL_ENABLE_FILE_LOCKING");
+
+ if( NULL == pFileLockEnvVar)
+ pFileLockEnvVar = getenv("STAR_ENABLE_FILE_LOCKING");
+ }
+
+ if( NULL == pFileLockEnvVar )
+ aflock.l_type = 0;
+
+ /* lock the file if flock.l_type is set */
+ bLocked = ( F_WRLCK != aflock.l_type || -1 != fcntl( fd, F_SETLK, &aflock ) );
+ }
+
+ if ( !bNeedsLock || bLocked )
+ {
+ /* allocate memory for impl structure */
+ pHandleImpl = (oslFileHandleImpl*) rtl_allocateMemory( sizeof(oslFileHandleImpl) );
+ if( pHandleImpl )
+ {
+ pHandleImpl->ustrFilePath = ustrFilePath;
+ pHandleImpl->fd = fd;
+ pHandleImpl->bLocked = bLocked;
+
+ *pHandle = (oslFileHandle) pHandleImpl;
+
+ return osl_File_E_None;
+ }
+ else
+ {
+ errno = ENOMEM;
+ }
+ }
+
+ close( fd );
+ }
+
+ PERROR( "osl_openFile", buffer );
+ eRet = oslTranslateFileError(OSL_FET_ERROR, errno );
+ }
+ }
+ else
+ eRet = osl_File_E_INVAL;
+
+ rtl_uString_release( ustrFilePath );
+ return eRet;
+}
+
+/****************************************************************************/
+/* osl_closeFile */
+/****************************************************************************/
+
+oslFileError osl_closeFile( oslFileHandle Handle )
+{
+ oslFileHandleImpl* pHandleImpl = (oslFileHandleImpl *) Handle;
+ oslFileError eRet = osl_File_E_INVAL;
+
+ OSL_ASSERT( Handle );
+
+ if( pHandleImpl )
+ {
+ rtl_uString_release( pHandleImpl->ustrFilePath );
+
+ /* release file lock if locking is enabled */
+ if( pFileLockEnvVar )
+ {
+ struct flock aflock;
+
+ aflock.l_type = F_UNLCK;
+ aflock.l_whence = SEEK_SET;
+ aflock.l_start = 0;
+ aflock.l_len = 0;
+
+ if ( pHandleImpl->bLocked )
+ {
+ /* FIXME: check if file is really locked ? */
+
+ /* release the file share lock on this file */
+ if( -1 == fcntl( pHandleImpl->fd, F_SETLK, &aflock ) )
+ PERROR( "osl_closeFile", "unlock failed" );
+ }
+ }
+
+ if( 0 > close( pHandleImpl->fd ) )
+ {
+ eRet = oslTranslateFileError(OSL_FET_ERROR, errno );
+ }
+ else
+ eRet = osl_File_E_None;
+
+ rtl_freeMemory( pHandleImpl );
+ }
+
+ return eRet;
+}
+
+/****************************************************************************/
+/* osl_isEndOfFile */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_isEndOfFile( oslFileHandle Handle, sal_Bool *pIsEOF )
+{
+ oslFileHandleImpl* pHandleImpl = (oslFileHandleImpl *) Handle;
+ oslFileError eRet = osl_File_E_INVAL;
+
+ if ( pHandleImpl)
+ {
+ long curPos = lseek( pHandleImpl->fd, 0, SEEK_CUR );
+
+ if ( curPos >= 0 )
+ {
+ long endPos = lseek( pHandleImpl->fd, 0, SEEK_END );
+
+ if ( endPos >= 0 )
+ {
+ *pIsEOF = ( curPos == endPos );
+ curPos = lseek( pHandleImpl->fd, curPos, SEEK_SET );
+
+ if ( curPos >= 0 )
+ eRet = osl_File_E_None;
+ else
+ eRet = oslTranslateFileError(OSL_FET_ERROR, errno );
+ }
+ else
+ eRet = oslTranslateFileError(OSL_FET_ERROR, errno );
+ }
+ else
+ eRet = oslTranslateFileError(OSL_FET_ERROR, errno );
+ }
+
+ return eRet;
+}
+
+
+/****************************************************************************/
+/* osl_moveFile */
+/****************************************************************************/
+
+oslFileError osl_moveFile( rtl_uString* ustrFileURL, rtl_uString* ustrDestURL )
+{
+ char srcPath[PATH_MAX];
+ char destPath[PATH_MAX];
+ oslFileError eRet;
+ APIRET rc;
+
+ OSL_ASSERT( ustrFileURL );
+ OSL_ASSERT( ustrDestURL );
+
+ /* convert source url to system path */
+ eRet = FileURLToPath( srcPath, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ /* convert destination url to system path */
+ eRet = FileURLToPath( destPath, PATH_MAX, ustrDestURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ //YD 01/05/06 rename() can overwrite existing files.
+ rc = DosDelete( (PCSZ)destPath);
+ rc = DosMove( (PCSZ)srcPath, (PCSZ)destPath);
+ if (!rc)
+ eRet = osl_File_E_None;
+ else
+ eRet = MapError( rc);
+
+ return eRet;
+}
+
+/****************************************************************************/
+/* osl_copyFile */
+/****************************************************************************/
+
+#define TMP_DEST_FILE_EXTENSION ".osl-tmp"
+
+static oslFileError oslDoCopy(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, mode_t nMode, size_t nSourceSize, int DestFileExists)
+{
+ int nRet=0;
+ sal_Char pszTmpDestFile[PATH_MAX];
+ size_t size_tmp_dest_buff = sizeof(pszTmpDestFile);
+
+ /* Quick fix for #106048, the whole copy file function seems
+ to be erroneous anyway and needs to be rewritten.
+ Besides osl_copyFile is currently not used from OO/SO code.
+ */
+ memset(pszTmpDestFile, 0, size_tmp_dest_buff);
+
+ if ( DestFileExists )
+ {
+ strncpy(pszTmpDestFile, pszDestFileName, size_tmp_dest_buff - 1);
+
+ if ((strlen(pszTmpDestFile) + strlen(TMP_DEST_FILE_EXTENSION)) >= size_tmp_dest_buff)
+ return osl_File_E_NAMETOOLONG;
+
+ strncat(pszTmpDestFile, TMP_DEST_FILE_EXTENSION, strlen(TMP_DEST_FILE_EXTENSION));
+
+ /* FIXME: what if pszTmpDestFile already exists? */
+ /* with getcanonical??? */
+ nRet=rename(pszDestFileName,pszTmpDestFile);
+ }
+
+ /* mfe: should be S_ISREG */
+ if ( !S_ISLNK(nMode) )
+ {
+ /* copy SourceFile to DestFile */
+ nRet = oslDoCopyFile(pszSourceFileName,pszDestFileName,nSourceSize, nMode);
+ }
+ /* mfe: OK redundant at the moment */
+ else if ( S_ISLNK(nMode) )
+ {
+ nRet = oslDoCopyLink(pszSourceFileName,pszDestFileName);
+ }
+ else
+ {
+ /* mfe: what to do here? */
+ nRet=ENOSYS;
+ }
+
+ if ( nRet > 0 && DestFileExists == 1 )
+ {
+ unlink(pszDestFileName);
+ rename(pszTmpDestFile,pszDestFileName);
+ }
+
+ if ( nRet > 0 )
+ {
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ if ( DestFileExists == 1 )
+ {
+ unlink(pszTmpDestFile);
+ }
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * oslChangeFileModes
+ ****************************************/
+
+static oslFileError oslChangeFileModes( const sal_Char* pszFileName, mode_t nMode, time_t nAcTime, time_t nModTime, uid_t nUID, gid_t nGID)
+{
+ int nRet=0;
+ struct utimbuf aTimeBuffer;
+
+ nRet = chmod(pszFileName,nMode);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ aTimeBuffer.actime=nAcTime;
+ aTimeBuffer.modtime=nModTime;
+ nRet=utime(pszFileName,&aTimeBuffer);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ if ( nUID != getuid() )
+ {
+ nUID=getuid();
+ }
+
+ nRet=chown(pszFileName,nUID,nGID);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+
+ /* mfe: do not return an error here! */
+ /* return oslTranslateFileError(nRet);*/
+ }
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * oslDoCopyLink
+ ****************************************/
+
+static int oslDoCopyLink(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName)
+{
+ int nRet=0;
+
+ /* mfe: if dest file is symbolic link remove the link and place the file instead (hro says so) */
+ /* mfe: if source is a link copy the link and not the file it points to (hro says so) */
+ sal_Char pszLinkContent[PATH_MAX];
+
+ pszLinkContent[0] = '\0';
+
+ nRet = readlink(pszSourceFileName,pszLinkContent,PATH_MAX);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return nRet;
+ }
+ else
+ pszLinkContent[ nRet ] = 0;
+
+ nRet = symlink(pszLinkContent,pszDestFileName);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return nRet;
+ }
+
+ return 0;
+}
+
+/*****************************************
+ * oslDoCopyFile
+ ****************************************/
+
+static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, size_t nSourceSize, mode_t mode)
+{
+ int SourceFileFD=0;
+ int DestFileFD=0;
+ int nRet=0;
+ void* pSourceFile=0;
+ char buffer[ 4096];
+
+ SourceFileFD=open(pszSourceFileName,O_RDONLY | O_BINARY);
+ if ( SourceFileFD < 0 )
+ {
+ nRet=errno;
+ return nRet;
+ }
+
+ DestFileFD=open(pszDestFileName, O_WRONLY | O_CREAT | O_BINARY, mode);
+ if ( DestFileFD < 0 )
+ {
+ nRet=errno;
+ close(SourceFileFD);
+ return nRet;
+ }
+
+ /* HACK: because memory mapping fails on various
+ platforms if the size of the source file is 0 byte */
+ if (0 == nSourceSize)
+ {
+ close(SourceFileFD);
+ close(DestFileFD);
+ return 0;
+ }
+
+ while( (nRet = read(SourceFileFD, buffer, sizeof(buffer))) !=0 )
+ {
+ nRet = write( DestFileFD, buffer, nRet);
+ }
+
+ close(SourceFileFD);
+ close(DestFileFD);
+
+ return nRet;
+}
+
+static oslFileError osl_psz_copyFile( const sal_Char* pszPath, const sal_Char* pszDestPath )
+{
+ time_t nAcTime=0;
+ time_t nModTime=0;
+ uid_t nUID=0;
+ gid_t nGID=0;
+ int nRet=0;
+ mode_t nMode=0;
+ struct stat aFileStat;
+ oslFileError tErr=osl_File_E_invalidError;
+ size_t nSourceSize=0;
+ int DestFileExists=1;
+
+ /* mfe: does the source file really exists? */
+ nRet = lstat(pszPath,&aFileStat);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ /* mfe: we do only copy files here! */
+ if ( S_ISDIR(aFileStat.st_mode) )
+ {
+ return osl_File_E_ISDIR;
+ }
+
+ nSourceSize=(size_t)aFileStat.st_size;
+ nMode=aFileStat.st_mode;
+ nAcTime=aFileStat.st_atime;
+ nModTime=aFileStat.st_mtime;
+ nUID=aFileStat.st_uid;
+ nGID=aFileStat.st_gid;
+
+ nRet = stat(pszDestPath,&aFileStat);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+
+ if ( nRet == ENOENT )
+ {
+ DestFileExists=0;
+ }
+/* return oslTranslateFileError(nRet);*/
+ }
+
+ /* mfe: the destination file must not be a directory! */
+ if ( nRet == 0 && S_ISDIR(aFileStat.st_mode) )
+ {
+ return osl_File_E_ISDIR;
+ }
+ else
+ {
+ /* mfe: file does not exists or is no dir */
+ }
+
+ tErr = oslDoCopy(pszPath,pszDestPath,nMode,nSourceSize,DestFileExists);
+
+ if ( tErr != osl_File_E_None )
+ {
+ return tErr;
+ }
+
+ /*
+ * mfe: ignore return code
+ * since only the success of the copy is
+ * important
+ */
+ oslChangeFileModes(pszDestPath,nMode,nAcTime,nModTime,nUID,nGID);
+
+ return tErr;
+}
+
+oslFileError osl_copyFile( rtl_uString* ustrFileURL, rtl_uString* ustrDestURL )
+{
+ char srcPath[PATH_MAX];
+ char destPath[PATH_MAX];
+ oslFileError eRet;
+ APIRET rc;
+
+ OSL_ASSERT( ustrFileURL );
+ OSL_ASSERT( ustrDestURL );
+
+ /* convert source url to system path */
+ eRet = FileURLToPath( srcPath, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ /* convert destination url to system path */
+ eRet = FileURLToPath( destPath, PATH_MAX, ustrDestURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ return osl_psz_copyFile( srcPath, destPath );
+}
+
+/****************************************************************************/
+/* osl_removeFile */
+/****************************************************************************/
+
+oslFileError osl_removeFile( rtl_uString* ustrFileURL )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+ APIRET rc;
+
+ OSL_ASSERT( ustrFileURL );
+
+ /* convert file url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ rc = DosDelete( (PCSZ)path);
+ if (!rc)
+ eRet = osl_File_E_None;
+ else
+ eRet = MapError( rc);
+
+ return eRet;
+}
+
+/****************************************************************************/
+/* osl_getVolumeInformation */
+/****************************************************************************/
+
+#define TXFSDC_BLOCKR 0x00 // block device removable
+#define TXFSDC_GETBPB 0x00 // get device bpb info
+#define TXFSBPB_REMOVABLE 0x08 // BPB attribute for removable
+
+typedef struct drivecmd
+{
+ BYTE cmd; // 0=unlock 1=lock 2=eject
+ BYTE drv; // 0=A, 1=B 2=C ...
+} DRIVECMD; // end of struct "drivecmd"
+
+#pragma pack(push, 1) // byte packing
+typedef struct txfs_ebpb // ext. boot parameter block
+{ // at offset 0x0b in bootsector
+ USHORT SectSize; // 0B bytes per sector
+ BYTE ClustSize; // 0D sectors per cluster
+ USHORT FatOffset; // 0E sectors to 1st FAT
+ BYTE NrOfFats; // 10 nr of FATS (FAT only)
+ USHORT RootEntries; // 11 Max entries \ (FAT only)
+ USHORT Sectors; // 13 nr of sectors if < 64K
+ BYTE MediaType; // 15 mediatype (F8 for HD)
+ USHORT FatSectors; // 16 sectors/FAT (FAT only)
+ USHORT LogGeoSect; // 18 sectors/Track
+ USHORT LogGeoHead; // 1a nr of heads
+ ULONG HiddenSectors; // 1c sector-offset from MBR/EBR
+ ULONG BigSectors; // 20 nr of sectors if >= 64K
+} TXFS_EBPB; // last byte is at offset 0x23
+
+typedef struct drivebpb
+{
+ TXFS_EBPB ebpb; // extended BPB
+ BYTE reserved[6];
+ USHORT cyls;
+ BYTE type;
+ USHORT attributes; // device attributes
+ BYTE fill[6]; // documented for IOCtl
+} DRIVEBPB; // end of struct "drivebpb"
+
+struct CDInfo {
+ USHORT usCount;
+ USHORT usFirst;
+};
+
+#pragma pack(pop)
+
+/*****************************************************************************/
+// Get number of cdrom readers
+/*****************************************************************************/
+BOOL GetCDInfo( CDInfo * pCDInfo )
+{
+ HFILE hFileCD;
+ ULONG ulAction;
+
+ if( NO_ERROR == DosOpen( (PCSZ)"\\DEV\\CD-ROM2$",
+ &hFileCD, &ulAction, 0, FILE_NORMAL,
+ OPEN_ACTION_OPEN_IF_EXISTS,
+ OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL )) {
+ ULONG ulDataSize = sizeof(CDInfo);
+ APIRET rc = DosDevIOCtl( hFileCD, 0x82, 0x60, NULL, 0,
+ NULL, (PVOID)pCDInfo, ulDataSize, &ulDataSize);
+ DosClose( hFileCD);
+ if(rc == NO_ERROR)
+ return TRUE;
+ }
+ // failed
+ pCDInfo->usFirst = 0;
+ pCDInfo->usCount = 0;
+ return FALSE;
+}
+
+/*****************************************************************************/
+// Determine if unit is a cdrom or not
+/*****************************************************************************/
+BOOL DriveIsCDROM(UINT uiDrive, CDInfo *pCDInfo)
+{
+ return (uiDrive >= pCDInfo->usFirst)
+ && (uiDrive < (pCDInfo->usFirst + pCDInfo->usCount));
+}
+
+/*****************************************************************************/
+// Determine attached fstype, e.g. HPFS for specified drive
+/*****************************************************************************/
+BOOL TxFsType // RET FS type resolved
+(
+ char *drive, // IN Drive specification
+ char *fstype, // OUT Attached FS type
+ char *details // OUT details (UNC) or NULL
+)
+{
+ BOOL rc = FALSE;
+ FSQBUFFER2 *fsinfo; // Attached FS info
+ ULONG fsdlen = 2048; // Fs info data length
+
+ strcpy(fstype, "none");
+ if (details)
+ {
+ strcpy(details, "");
+ }
+ if ((fsinfo = (FSQBUFFER2*)calloc(1, fsdlen)) != NULL)
+ {
+ if (DosQFSAttach((PCSZ)drive, 0, 1, fsinfo, &fsdlen) == NO_ERROR)
+ {
+ strcpy(fstype, (char*) fsinfo->szName + fsinfo->cbName +1);
+ if (details && (fsinfo->cbFSAData != 0))
+ {
+ strcpy( details, (char*) fsinfo->szName + fsinfo->cbName +
+ fsinfo->cbFSDName +2);
+ }
+ rc = TRUE;
+ }
+ free(fsinfo);
+ }
+ return (rc);
+} // end 'TxFsType'
+/*---------------------------------------------------------------------------*/
+
+
+/*****************************************************************************/
+// Determine if a driveletter represents a removable medium/device
+/*****************************************************************************/
+BOOL TxFsIsRemovable // RET drive is removable
+(
+ char *drive // IN Driveletter to test
+)
+{
+ BOOL rc = FALSE;
+ DRIVECMD IOCtl;
+ DRIVEBPB RemAt;
+ ULONG DataLen;
+ ULONG ParmLen;
+ BYTE NoRem;
+
+ DosError( FERR_DISABLEHARDERR); // avoid 'not ready' popups
+
+ ParmLen = sizeof(IOCtl);
+ IOCtl.cmd = TXFSDC_BLOCKR;
+ IOCtl.drv = toupper(drive[0]) - 'A';
+ DataLen = sizeof(NoRem);
+
+ if (DosDevIOCtl((HFILE) -1, IOCTL_DISK,
+ DSK_BLOCKREMOVABLE,
+ &IOCtl, ParmLen, &ParmLen,
+ &NoRem, DataLen, &DataLen) == NO_ERROR)
+ {
+ if (NoRem) // non-removable sofar, check
+ { // BPB as well (USB devices)
+ ParmLen = sizeof(IOCtl);
+ IOCtl.cmd = TXFSDC_GETBPB;
+ IOCtl.drv = toupper(drive[0]) - 'A';
+ DataLen = sizeof(RemAt);
+
+ if (DosDevIOCtl((HFILE) -1, IOCTL_DISK,
+ DSK_GETDEVICEPARAMS,
+ &IOCtl, ParmLen, &ParmLen,
+ &RemAt, DataLen, &DataLen) == NO_ERROR)
+
+ {
+ if (RemAt.attributes & TXFSBPB_REMOVABLE)
+ {
+ rc = TRUE; // removable, probably USB
+ }
+ }
+ }
+ else
+ {
+ rc = TRUE; // removable block device
+ }
+ }
+ DosError( FERR_ENABLEHARDERR); // enable criterror handler
+ return (rc);
+} // end 'TxFsIsRemovable'
+/*---------------------------------------------------------------------------*/
+
+static oslFileError get_drive_type(const char* path, oslVolumeInfo* pInfo)
+{
+ char Drive_Letter = toupper( *path);
+ char fstype[ 64];
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+
+ // check for floppy A/B
+ BYTE nFloppies;
+ APIRET rc;
+ rc = DosDevConfig( (void*) &nFloppies, DEVINFO_FLOPPY );
+ if ((Drive_Letter - 'A') < nFloppies) {
+ pInfo->uAttributes |= osl_Volume_Attribute_Removeable;
+ pInfo->uAttributes |= osl_Volume_Attribute_FloppyDisk;
+ return osl_File_E_None;
+ }
+
+ // query system for CD drives
+ CDInfo cdInfo;
+ GetCDInfo(&cdInfo);
+
+ // query if drive is a CDROM
+ if (DriveIsCDROM( Drive_Letter - 'A', &cdInfo))
+ pInfo->uAttributes |= osl_Volume_Attribute_CompactDisc | osl_Volume_Attribute_Removeable;
+
+ if (TxFsIsRemovable( (char*)path))
+ pInfo->uAttributes |= osl_Volume_Attribute_Removeable;
+
+ if (TxFsType( (char*)path, fstype, NULL) == FALSE) {
+ // query failed, assume fixed disk
+ pInfo->uAttributes |= osl_Volume_Attribute_FixedDisk;
+ return osl_File_E_None;
+ }
+
+ //- Note, connected Win-NT drives use the REAL FS-name like NTFS!
+ if ((strncasecmp( fstype, "LAN", 3) == 0) //- OS/2 LAN drives
+ || (strncasecmp( fstype, "NDFS", 4) == 0) //- NetDrive
+ || (strncasecmp( fstype, "REMOTE", 5) == 0) ) //- NT disconnected
+ pInfo->uAttributes |= osl_Volume_Attribute_Remote;
+ else if (strncasecmp( fstype, "RAMFS", 5) == 0)
+ pInfo->uAttributes |= osl_Volume_Attribute_RAMDisk;
+ else if ((strncasecmp( fstype, "CD", 2) == 0) // OS2:CDFS, DOS/WIN:CDROM
+ || (strncasecmp( fstype, "UDF", 3) == 0) ) // OS2:UDF DVD's
+ pInfo->uAttributes |= osl_Volume_Attribute_CompactDisc | osl_Volume_Attribute_Removeable;
+ else
+ pInfo->uAttributes |= osl_Volume_Attribute_FixedDisk;
+
+ return osl_File_E_None;
+}
+
+//#############################################
+inline bool is_volume_space_info_request(sal_uInt32 field_mask)
+{
+ return (field_mask &
+ (osl_VolumeInfo_Mask_TotalSpace |
+ osl_VolumeInfo_Mask_UsedSpace |
+ osl_VolumeInfo_Mask_FreeSpace));
+}
+
+//#############################################
+static void get_volume_space_information(const char* path, oslVolumeInfo *pInfo)
+{
+ FSALLOCATE aFSInfoBuf;
+ ULONG nDriveNumber = toupper( *path) - 'A' + 1;
+
+ // disable error popups
+ DosError(FERR_DISABLEHARDERR);
+ APIRET rc = DosQueryFSInfo( nDriveNumber, FSIL_ALLOC,
+ &aFSInfoBuf, sizeof(aFSInfoBuf) );
+ // enable error popups
+ DosError(FERR_ENABLEHARDERR);
+ if (!rc)
+ {
+ uint64_t aBytesPerCluster( uint64_t(aFSInfoBuf.cbSector) *
+ uint64_t(aFSInfoBuf.cSectorUnit) );
+ pInfo->uFreeSpace = aBytesPerCluster * uint64_t(aFSInfoBuf.cUnitAvail);
+ pInfo->uTotalSpace = aBytesPerCluster * uint64_t(aFSInfoBuf.cUnit);
+ pInfo->uUsedSpace = pInfo->uTotalSpace - pInfo->uFreeSpace;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_TotalSpace |
+ osl_VolumeInfo_Mask_UsedSpace |
+ osl_VolumeInfo_Mask_FreeSpace;
+ }
+}
+
+//#############################################
+inline bool is_filesystem_attributes_request(sal_uInt32 field_mask)
+{
+ return (field_mask &
+ (osl_VolumeInfo_Mask_MaxNameLength |
+ osl_VolumeInfo_Mask_MaxPathLength |
+ osl_VolumeInfo_Mask_FileSystemName |
+ osl_VolumeInfo_Mask_FileSystemCaseHandling));
+}
+
+//#############################################
+inline bool is_drivetype_request(sal_uInt32 field_mask)
+{
+ return (field_mask & osl_VolumeInfo_Mask_Attributes);
+}
+
+typedef struct _FSQBUFFER_
+{
+ FSQBUFFER2 aBuf;
+ UCHAR sBuf[64];
+} FSQBUFFER_;
+
+//#############################################
+static oslFileError get_filesystem_attributes(const char* path, sal_uInt32 field_mask, oslVolumeInfo* pInfo)
+{
+ pInfo->uAttributes = 0;
+
+ oslFileError osl_error = osl_File_E_None;
+
+ // osl_get_drive_type must be called first because
+ // this function resets osl_VolumeInfo_Mask_Attributes
+ // on failure
+ if (is_drivetype_request(field_mask))
+ osl_error = get_drive_type(path, pInfo);
+
+ if ((osl_File_E_None == osl_error) && is_filesystem_attributes_request(field_mask))
+ {
+ FSQBUFFER_ aBuf;
+ ULONG nBufLen;
+ APIRET nRet;
+
+ nBufLen = sizeof( aBuf );
+ // disable error popups
+ DosError(FERR_DISABLEHARDERR);
+ nRet = DosQueryFSAttach( (PCSZ)path, 0, FSAIL_QUERYNAME, (_FSQBUFFER2*) &aBuf, &nBufLen );
+ if ( !nRet )
+ {
+ char *pType = (char*)(aBuf.aBuf.szName + aBuf.aBuf.cbName + 1);
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxNameLength;
+ pInfo->uMaxNameLength = _MAX_FNAME;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxPathLength;
+ pInfo->uMaxPathLength = _MAX_PATH;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_FileSystemName;
+ rtl_uString_newFromAscii(&pInfo->ustrFileSystemName, pType);
+
+ // case is preserved always except for FAT
+ if (strcmp( pType, "FAT" ))
+ pInfo->uAttributes |= osl_Volume_Attribute_Case_Is_Preserved;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+ }
+ // enable error popups
+ DosError(FERR_ENABLEHARDERR);
+ }
+ return osl_error;
+}
+
+oslFileError SAL_CALL osl_getVolumeInformation( rtl_uString* ustrDirectoryURL, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask )
+{
+ char volume_root[PATH_MAX];
+ oslFileError error;
+
+ OSL_ASSERT( ustrDirectoryURL );
+ OSL_ASSERT( pInfo );
+
+ /* convert directory url to system path */
+ error = FileURLToPath( volume_root, PATH_MAX, ustrDirectoryURL );
+ if( error != osl_File_E_None )
+ return error;
+
+ if (!pInfo)
+ return osl_File_E_INVAL;
+
+ pInfo->uValidFields = 0;
+
+ if ((error = get_filesystem_attributes(volume_root, uFieldMask, pInfo)) != osl_File_E_None)
+ return error;
+
+ if (is_volume_space_info_request(uFieldMask))
+ get_volume_space_information(volume_root, pInfo);
+
+ if (uFieldMask & osl_VolumeInfo_Mask_DeviceHandle)
+ {
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_DeviceHandle;
+ rtl_uString* uVolumeRoot;
+ rtl_uString_newFromAscii( &uVolumeRoot, volume_root);
+ osl_getFileURLFromSystemPath( uVolumeRoot, (rtl_uString**)&pInfo->pDeviceHandle);
+ rtl_uString_release( uVolumeRoot);
+ }
+
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_getFileStatus */
+/****************************************************************************/
+static oslFileError _osl_getDriveInfo(
+ oslDirectoryItem Item, oslFileStatus *pStatus, sal_uInt32 uFieldMask)
+{
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+ sal_Unicode cDrive[3];
+ sal_Unicode cRoot[4];
+
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ pStatus->uValidFields = 0;
+
+ cDrive[0] = pItemImpl->ustrDrive->buffer[0];
+ cDrive[1] = (sal_Unicode)':';
+ cDrive[2] = 0;
+ cRoot[0] = pItemImpl->ustrDrive->buffer[0];
+ cRoot[1] = (sal_Unicode)':';
+ cRoot[2] = 0;
+
+ if ( uFieldMask & osl_FileStatus_Mask_FileName )
+ {
+ if ( pItemImpl->ustrDrive->buffer[0] == '\\' &&
+ pItemImpl->ustrDrive->buffer[1] == '\\' )
+ {
+ LPCWSTR lpFirstBkSlash = wcschr( (const wchar_t*)&pItemImpl->ustrDrive->buffer[2], '\\' );
+
+ if ( lpFirstBkSlash && lpFirstBkSlash[1] )
+ {
+ LPCWSTR lpLastBkSlash = wcschr( (const wchar_t*)&lpFirstBkSlash[1], '\\' );
+
+ if ( lpLastBkSlash )
+ rtl_uString_newFromStr_WithLength( &pStatus->ustrFileName, (sal_Unicode*)&lpFirstBkSlash[1], lpLastBkSlash - lpFirstBkSlash - 1 );
+ else
+ rtl_uString_newFromStr( &pStatus->ustrFileName, (sal_Unicode*)&lpFirstBkSlash[1] );
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+ }
+ }
+ else
+ {
+ FSINFO aFSInfoBuf;
+ ULONG ulFSInfoLevel = FSIL_VOLSER;
+ ULONG nDriveNumber;
+ char szFileName[ _MAX_PATH];
+
+ nDriveNumber = toupper(*cDrive) - 'A' + 1;
+ memset( &aFSInfoBuf, 0, sizeof(FSINFO) );
+ // disable error popups
+ DosError(FERR_DISABLEHARDERR);
+ APIRET rc = DosQueryFSInfo( nDriveNumber, ulFSInfoLevel, &aFSInfoBuf, sizeof(FSINFO) );
+ // enable error popups
+ DosError(FERR_ENABLEHARDERR);
+ memset( szFileName, 0, sizeof( szFileName));
+ *szFileName = toupper(*cDrive);
+ strcat( szFileName, ": [");
+ if ( !rc || aFSInfoBuf.vol.cch)
+ strncat( szFileName, aFSInfoBuf.vol.szVolLabel, aFSInfoBuf.vol.cch);
+ strcat( szFileName, "]");
+ rtl_uString_newFromAscii( &pStatus->ustrFileName, szFileName );
+
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+ }
+ }
+
+ pStatus->eType = osl_File_Type_Volume;
+ pStatus->uValidFields |= osl_FileStatus_Mask_Type;
+
+ if ( uFieldMask & osl_FileStatus_Mask_FileURL )
+ {
+ rtl_uString *ustrSystemPath = NULL;
+
+ rtl_uString_newFromStr( &ustrSystemPath, pItemImpl->ustrDrive->buffer );
+ osl_getFileURLFromSystemPath( ustrSystemPath, &pStatus->ustrFileURL );
+ rtl_uString_release( ustrSystemPath );
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileURL;
+ }
+
+ return osl_File_E_None;
+}
+
+oslFileError SAL_CALL osl_getFileStatus(
+ oslDirectoryItem Item,
+ oslFileStatus *pStatus,
+ sal_uInt32 uFieldMask )
+{
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+ struct stat file_stat;
+
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ if ( pItemImpl->uType == DIRECTORYITEM_DRIVE)
+ return _osl_getDriveInfo( Item, pStatus, uFieldMask );
+
+ osl::lstat(pItemImpl->ustrFilePath, file_stat);
+ if ( uFieldMask & osl_FileStatus_Mask_Validate )
+ {
+ uFieldMask &= ~ osl_FileStatus_Mask_Validate;
+ }
+
+ /* If no fields to retrieve left ignore pStatus */
+ if ( !uFieldMask )
+ return osl_File_E_None;
+
+ /* Otherwise, this must be a valid pointer */
+ if ( !pStatus )
+ return osl_File_E_INVAL;
+
+ if ( pStatus->uStructSize != sizeof(oslFileStatus) )
+ return osl_File_E_INVAL;
+
+ pStatus->uValidFields = 0;
+
+ /* File time stamps */
+
+ if ( (uFieldMask & osl_FileStatus_Mask_ModifyTime))
+ {
+ pStatus->aModifyTime.Seconds = file_stat.st_mtime;
+ pStatus->aModifyTime.Nanosec = 0;
+ pStatus->uValidFields |= osl_FileStatus_Mask_ModifyTime;
+ }
+
+ if ( (uFieldMask & osl_FileStatus_Mask_AccessTime))
+ {
+ pStatus->aAccessTime.Seconds = file_stat.st_atime;
+ pStatus->aAccessTime.Nanosec = 0;
+ pStatus->uValidFields |= osl_FileStatus_Mask_AccessTime;
+ }
+
+ if ( (uFieldMask & osl_FileStatus_Mask_CreationTime))
+ {
+ pStatus->aAccessTime.Seconds = file_stat.st_birthtime;
+ pStatus->aAccessTime.Nanosec = 0;
+ pStatus->uValidFields |= osl_FileStatus_Mask_CreationTime;
+ }
+
+ /* Most of the fields are already set, regardless of requiered fields */
+
+ osl_systemPathGetFileNameOrLastDirectoryPart(pItemImpl->ustrFilePath, &pStatus->ustrFileName);
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+
+ if (S_ISLNK(file_stat.st_mode))
+ pStatus->eType = osl_File_Type_Link;
+ else if (S_ISDIR(file_stat.st_mode))
+ pStatus->eType = osl_File_Type_Directory;
+ else if (S_ISREG(file_stat.st_mode))
+ pStatus->eType = osl_File_Type_Regular;
+ else if (S_ISFIFO(file_stat.st_mode))
+ pStatus->eType = osl_File_Type_Fifo;
+ else if (S_ISSOCK(file_stat.st_mode))
+ pStatus->eType = osl_File_Type_Socket;
+ else if (S_ISCHR(file_stat.st_mode) || S_ISBLK(file_stat.st_mode))
+ pStatus->eType = osl_File_Type_Special;
+ else
+ pStatus->eType = osl_File_Type_Unknown;
+
+ pStatus->uValidFields |= osl_FileStatus_Mask_Type;
+
+ pStatus->uAttributes = pItemImpl->d_attr;
+ pStatus->uValidFields |= osl_FileStatus_Mask_Attributes;
+
+ pStatus->uFileSize = file_stat.st_size;
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileSize;
+
+ if ( uFieldMask & osl_FileStatus_Mask_LinkTargetURL )
+ {
+ rtl_uString *ustrFullPath = NULL;
+
+ rtl_uString_newFromStr( &ustrFullPath, rtl_uString_getStr(pItemImpl->ustrFilePath) );
+ osl_getFileURLFromSystemPath( ustrFullPath, &pStatus->ustrLinkTargetURL );
+ rtl_uString_release( ustrFullPath );
+
+ pStatus->uValidFields |= osl_FileStatus_Mask_LinkTargetURL;
+ }
+
+ if ( uFieldMask & osl_FileStatus_Mask_FileURL )
+ {
+ rtl_uString *ustrFullPath = NULL;
+
+ rtl_uString_newFromStr( &ustrFullPath, rtl_uString_getStr(pItemImpl->ustrFilePath) );
+ osl_getFileURLFromSystemPath( ustrFullPath, &pStatus->ustrFileURL );
+ rtl_uString_release( ustrFullPath );
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileURL;
+ }
+
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_createDirectory */
+/****************************************************************************/
+
+oslFileError osl_createDirectory( rtl_uString* ustrDirectoryURL )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+ APIRET rc;
+
+ OSL_ASSERT( ustrDirectoryURL );
+
+ /* convert directory url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ rc = DosCreateDir( (PCSZ)path, NULL);
+ if (rc == ERROR_ACCESS_DENIED)
+ rc=ERROR_FILE_EXISTS;
+
+ if (!rc)
+ eRet = osl_File_E_None;
+ else
+ eRet = MapError( rc);
+
+ return eRet;
+}
+
+/****************************************************************************/
+/* osl_removeDirectory */
+/****************************************************************************/
+
+oslFileError osl_removeDirectory( rtl_uString* ustrDirectoryURL )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+ APIRET rc;
+
+ OSL_ASSERT( ustrDirectoryURL );
+
+ /* convert directory url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ rc = DosDeleteDir( (PCSZ)path);
+ if (!rc)
+ eRet = osl_File_E_None;
+ else
+ eRet = MapError( rc);
+
+ return eRet;
+}
+
+//#############################################
+int path_make_parent(sal_Unicode* path)
+{
+ int i = rtl_ustr_lastIndexOfChar(path, '/');
+
+ if (i > 0)
+ {
+ *(path + i) = 0;
+ return i;
+ }
+ else
+ return 0;
+}
+
+//#############################################
+int create_dir_with_callback(
+ sal_Unicode* directory_path,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ int mode = S_IRWXU | S_IRWXG | S_IRWXO;
+
+ if (osl::mkdir(directory_path, mode) == 0)
+ {
+ if (aDirectoryCreationCallbackFunc)
+ {
+ rtl::OUString url;
+ osl::FileBase::getFileURLFromSystemPath(directory_path, url);
+ aDirectoryCreationCallbackFunc(pData, url.pData);
+ }
+ return 0;
+ }
+ return errno;
+}
+
+//#############################################
+oslFileError create_dir_recursively_(
+ sal_Unicode* dir_path,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ OSL_PRECOND((rtl_ustr_getLength(dir_path) > 0) && ((dir_path + (rtl_ustr_getLength(dir_path) - 1)) != (dir_path + rtl_ustr_lastIndexOfChar(dir_path, '/'))), \
+ "Path must not end with a slash");
+
+ int native_err = create_dir_with_callback(
+ dir_path, aDirectoryCreationCallbackFunc, pData);
+
+ if (native_err == 0)
+ return osl_File_E_None;
+
+ if (native_err != ENOENT)
+ return oslTranslateFileError(OSL_FET_ERROR, native_err);
+
+ // we step back until '/a_dir' at maximum because
+ // we should get an error unequal ENOENT when
+ // we try to create 'a_dir' at '/' and would so
+ // return before
+ int pos = path_make_parent(dir_path);
+
+ oslFileError osl_error = create_dir_recursively_(
+ dir_path, aDirectoryCreationCallbackFunc, pData);
+
+ if (osl_File_E_None != osl_error)
+ return osl_error;
+
+ dir_path[pos] = '/';
+
+ return create_dir_recursively_(dir_path, aDirectoryCreationCallbackFunc, pData);
+}
+
+//#######################################
+oslFileError SAL_CALL osl_createDirectoryPath(
+ rtl_uString* aDirectoryUrl,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ if (aDirectoryUrl == NULL)
+ return osl_File_E_INVAL;
+
+ rtl::OUString sys_path;
+ oslFileError osl_error = osl_getSystemPathFromFileURL_Ex(
+ aDirectoryUrl, &sys_path.pData, sal_False);
+
+ if (osl_error != osl_File_E_None)
+ return osl_error;
+
+ osl::systemPathRemoveSeparator(sys_path);
+
+ // const_cast because sys_path is a local copy which we want to modify inplace instead of
+ // coyp it into another buffer on the heap again
+ return create_dir_recursively_(sys_path.pData->buffer, aDirectoryCreationCallbackFunc, pData);
+}
+
+/****************************************************************************/
+/* osl_getCanonicalName */
+/****************************************************************************/
+
+oslFileError osl_getCanonicalName( rtl_uString* ustrFileURL, rtl_uString** pustrValidURL )
+{
+ OSL_ENSURE(sal_False, "osl_getCanonicalName not implemented");
+
+ rtl_uString_newFromString(pustrValidURL, ustrFileURL);
+ return osl_File_E_None;
+}
+
+
+/****************************************************************************/
+/* osl_setFileAttributes */
+/****************************************************************************/
+
+oslFileError osl_setFileAttributes( rtl_uString* ustrFileURL, sal_uInt64 uAttributes )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+ FILESTATUS3 fsts3ConfigInfo;
+ ULONG ulBufSize = sizeof(FILESTATUS3);
+ APIRET rc = NO_ERROR;
+
+ OSL_ASSERT( ustrFileURL );
+
+ /* convert file url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ /* query current attributes */
+ rc = DosQueryPathInfo( (PCSZ)path, FIL_STANDARD, &fsts3ConfigInfo, ulBufSize);
+ if (rc != NO_ERROR)
+ return MapError( rc);
+
+ /* set/reset readonly/hidden (see w32\file.cxx) */
+ fsts3ConfigInfo.attrFile &= ~(FILE_READONLY | FILE_HIDDEN);
+ if ( uAttributes & osl_File_Attribute_ReadOnly )
+ fsts3ConfigInfo.attrFile |= FILE_READONLY;
+ if ( uAttributes & osl_File_Attribute_Hidden )
+ fsts3ConfigInfo.attrFile |= FILE_HIDDEN;
+
+ /* write new attributes */
+ rc = DosSetPathInfo( (PCSZ)path, FIL_STANDARD, &fsts3ConfigInfo, ulBufSize, 0);
+ if (rc != NO_ERROR)
+ return MapError( rc);
+
+ /* everything ok */
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_setFileTime */
+/****************************************************************************/
+
+oslFileError osl_setFileTime( rtl_uString* ustrFileURL, const TimeValue* pCreationTime,
+ const TimeValue* pLastAccessTime, const TimeValue* pLastWriteTime )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrFileURL );
+
+ /* convert file url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ return osl_psz_setFileTime( path, pCreationTime, pLastAccessTime, pLastWriteTime );
+}
+
+/******************************************************************************
+ *
+ * Exported Module Functions
+ * (independent of C or Unicode Strings)
+ *
+ *****************************************************************************/
+
+
+/*******************************************
+ osl_readFile
+********************************************/
+
+oslFileError osl_readFile(oslFileHandle Handle, void* pBuffer, sal_uInt64 uBytesRequested, sal_uInt64* pBytesRead)
+{
+ ssize_t nBytes = 0;
+ oslFileHandleImpl* pHandleImpl = (oslFileHandleImpl*)Handle;
+
+ if ((0 == pHandleImpl) || (pHandleImpl->fd < 0) || (0 == pBuffer) || (0 == pBytesRead))
+ return osl_File_E_INVAL;
+
+ nBytes = read(pHandleImpl->fd, pBuffer, uBytesRequested);
+
+ if (-1 == nBytes)
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ *pBytesRead = nBytes;
+ return osl_File_E_None;
+}
+
+/*******************************************
+ osl_writeFile
+********************************************/
+
+oslFileError osl_writeFile(oslFileHandle Handle, const void* pBuffer, sal_uInt64 uBytesToWrite, sal_uInt64* pBytesWritten)
+{
+ ssize_t nBytes = 0;
+ oslFileHandleImpl* pHandleImpl = (oslFileHandleImpl*)Handle;
+
+ OSL_ASSERT(pHandleImpl);
+ OSL_ASSERT(pBuffer);
+ OSL_ASSERT(pBytesWritten);
+
+ if ((0 == pHandleImpl) || (0 == pBuffer) || (0 == pBytesWritten))
+ return osl_File_E_INVAL;
+
+ OSL_ASSERT(pHandleImpl->fd >= 0);
+
+ if (pHandleImpl->fd < 0)
+ return osl_File_E_INVAL;
+
+ nBytes = write(pHandleImpl->fd, pBuffer, uBytesToWrite);
+
+ if (-1 == nBytes)
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ *pBytesWritten = nBytes;
+ return osl_File_E_None;
+}
+
+/*******************************************
+ osl_writeFile
+********************************************/
+
+oslFileError osl_setFilePos( oslFileHandle Handle, sal_uInt32 uHow, sal_Int64 uPos )
+{
+ oslFileHandleImpl* pHandleImpl=0;
+ int nRet=0;
+ off_t nOffset=0;
+
+ pHandleImpl = (oslFileHandleImpl*) Handle;
+ if ( pHandleImpl == 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pHandleImpl->fd < 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ /* FIXME mfe: setFilePos: Do we have any runtime function to determine LONG_MAX? */
+ if ( uPos > LONG_MAX )
+ {
+ return osl_File_E_OVERFLOW;
+ }
+
+ nOffset=(off_t)uPos;
+
+ switch(uHow)
+ {
+ case osl_Pos_Absolut:
+ nOffset = lseek(pHandleImpl->fd,nOffset,SEEK_SET);
+ break;
+
+ case osl_Pos_Current:
+ nOffset = lseek(pHandleImpl->fd,nOffset,SEEK_CUR);
+ break;
+
+ case osl_Pos_End:
+ nOffset = lseek(pHandleImpl->fd,nOffset,SEEK_END);
+ break;
+
+ default:
+ return osl_File_E_INVAL;
+ }
+
+ if ( nOffset < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+
+/************************************************
+ * osl_getFilePos
+ ***********************************************/
+
+oslFileError osl_getFilePos( oslFileHandle Handle, sal_uInt64* pPos )
+{
+ oslFileHandleImpl* pHandleImpl=0;
+ off_t nOffset=0;
+ int nRet=0;
+
+ pHandleImpl = (oslFileHandleImpl*) Handle;
+ if ( pHandleImpl == 0 || pPos == 0)
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pHandleImpl->fd < 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ nOffset = lseek(pHandleImpl->fd,0,SEEK_CUR);
+
+ if (nOffset < 0)
+ {
+ nRet =errno;
+
+ /* *pPos =0; */
+
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ *pPos=nOffset;
+
+ return osl_File_E_None;
+}
+
+/****************************************************************************
+ * osl_getFileSize
+ ****************************************************************************/
+
+oslFileError osl_getFileSize( oslFileHandle Handle, sal_uInt64* pSize )
+{
+ oslFileHandleImpl* pHandleImpl=(oslFileHandleImpl*) Handle;
+ if (pHandleImpl == 0)
+ return osl_File_E_INVAL;
+
+ struct stat file_stat;
+ if (fstat(pHandleImpl->fd, &file_stat) == -1)
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ *pSize = file_stat.st_size;
+ return osl_File_E_None;
+}
+
+/************************************************
+ * osl_setFileSize
+ ***********************************************/
+
+oslFileError osl_setFileSize( oslFileHandle Handle, sal_uInt64 uSize )
+{
+ oslFileHandleImpl* pHandleImpl=0;
+ off_t nOffset=0;
+
+ pHandleImpl = (oslFileHandleImpl*) Handle;
+ if ( pHandleImpl == 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pHandleImpl->fd < 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ /* FIXME: mfe: setFileSize: Do we have any runtime function to determine LONG_MAX? */
+ if ( uSize > LONG_MAX )
+ {
+ return osl_File_E_OVERFLOW;
+ }
+
+ nOffset = (off_t)uSize;
+ if (ftruncate (pHandleImpl->fd, nOffset) < 0)
+ {
+ /* Failure. Try fallback algorithm */
+ oslFileError result;
+ struct stat aStat;
+ off_t nCurPos;
+
+ /* Save original result */
+ result = oslTranslateFileError (OSL_FET_ERROR, errno);
+ PERROR("ftruncate", "Try osl_setFileSize [fallback]\n");
+
+ /* Check against current size. Fail upon 'shrink' */
+ if (fstat (pHandleImpl->fd, &aStat) < 0)
+ {
+ PERROR("ftruncate: fstat", "Out osl_setFileSize [error]\n");
+ return (result);
+ }
+ if ((0 <= nOffset) && (nOffset <= aStat.st_size))
+ {
+ /* Failure upon 'shrink'. Return original result */
+ return (result);
+ }
+
+ /* Save current position */
+ nCurPos = (off_t)lseek (pHandleImpl->fd, (off_t)0, SEEK_CUR);
+ if (nCurPos == (off_t)(-1))
+ {
+ PERROR("ftruncate: lseek", "Out osl_setFileSize [error]\n");
+ return (result);
+ }
+
+ /* Try 'expand' via 'lseek()' and 'write()' */
+ if (lseek (pHandleImpl->fd, (off_t)(nOffset - 1), SEEK_SET) < 0)
+ {
+ PERROR("ftruncate: lseek", "Out osl_setFileSize [error]\n");
+ return (result);
+ }
+ if (write (pHandleImpl->fd, (char*)"", (size_t)1) < 0)
+ {
+ /* Failure. Restore saved position */
+ PERROR("ftruncate: write", "Out osl_setFileSize [error]\n");
+ if (lseek (pHandleImpl->fd, (off_t)nCurPos, SEEK_SET) < 0)
+ {
+#ifdef DEBUG_OSL_FILE
+ perror("ftruncate: lseek");
+#endif /* DEBUG_OSL_FILE */
+ }
+ return (result);
+ }
+
+ /* Success. Restore saved position */
+ if (lseek (pHandleImpl->fd, (off_t)nCurPos, SEEK_SET) < 0)
+ {
+ PERROR("ftruncate: lseek", "Out osl_setFileSize [error]");
+ return (result);
+ }
+ }
+
+ return (osl_File_E_None);
+}
+
+/*###############################################*/
+oslFileError SAL_CALL osl_syncFile(oslFileHandle Handle)
+{
+ oslFileHandleImpl* handle_impl = (oslFileHandleImpl*)Handle;
+
+ if (handle_impl == 0)
+ return osl_File_E_INVAL;
+
+ if (fsync(handle_impl->fd) == -1)
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ return osl_File_E_None;
+}
+
+/******************************************************************************
+ *
+ * C-String Versions of Exported Module Functions
+ *
+ *****************************************************************************/
+
+#ifdef HAVE_STATFS_H
+
+#if defined(FREEBSD) || defined(NETBSD) || defined(MACOSX)
+# define __OSL_STATFS_STRUCT struct statfs
+# define __OSL_STATFS(dir, sfs) statfs((dir), (sfs))
+# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_bsize))
+# define __OSL_STATFS_TYPENAME(a) ((a).f_fstypename)
+# define __OSL_STATFS_ISREMOTE(a) (((a).f_type & MNT_LOCAL) == 0)
+
+/* always return true if queried for the properties of
+ the file system. If you think this is wrong under any
+ of the target platforms fix it!!!! */
+# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1)
+# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
+#endif /* FREEBSD || NETBSD */
+
+#if defined(LINUX)
+# define __OSL_NFS_SUPER_MAGIC 0x6969
+# define __OSL_SMB_SUPER_MAGIC 0x517B
+# define __OSL_MSDOS_SUPER_MAGIC 0x4d44
+# define __OSL_NTFS_SUPER_MAGIC 0x5346544e
+# define __OSL_STATFS_STRUCT struct statfs
+# define __OSL_STATFS(dir, sfs) statfs((dir), (sfs))
+# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_bsize))
+# define __OSL_STATFS_IS_NFS(a) (__OSL_NFS_SUPER_MAGIC == (a).f_type)
+# define __OSL_STATFS_IS_SMB(a) (__OSL_SMB_SUPER_MAGIC == (a).f_type)
+# define __OSL_STATFS_ISREMOTE(a) (__OSL_STATFS_IS_NFS((a)) || __OSL_STATFS_IS_SMB((a)))
+# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) ((__OSL_MSDOS_SUPER_MAGIC != (a).f_type) && (__OSL_NTFS_SUPER_MAGIC != (a).f_type))
+# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) ((__OSL_MSDOS_SUPER_MAGIC != (a).f_type))
+#endif /* LINUX */
+
+#if defined(SOLARIS)
+# define __OSL_STATFS_STRUCT struct statvfs
+# define __OSL_STATFS(dir, sfs) statvfs((dir), (sfs))
+# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_frsize))
+# define __OSL_STATFS_TYPENAME(a) ((a).f_basetype)
+# define __OSL_STATFS_ISREMOTE(a) (rtl_str_compare((a).f_basetype, "nfs") == 0)
+
+/* always return true if queried for the properties of
+ the file system. If you think this is wrong under any
+ of the target platforms fix it!!!! */
+# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1)
+# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
+#endif /* SOLARIS */
+
+# define __OSL_STATFS_INIT(a) (memset(&(a), 0, sizeof(__OSL_STATFS_STRUCT)))
+
+#else /* no statfs available */
+
+# define __OSL_STATFS_STRUCT struct dummy {int i;}
+# define __OSL_STATFS_INIT(a) ((void)0)
+# define __OSL_STATFS(dir, sfs) (1)
+# define __OSL_STATFS_ISREMOTE(sfs) (0)
+# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1)
+# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
+#endif /* HAVE_STATFS_H */
+
+
+static oslFileError osl_psz_getVolumeInformation (
+ const sal_Char* pszDirectory, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask)
+{
+ __OSL_STATFS_STRUCT sfs;
+
+ if (!pInfo)
+ return osl_File_E_INVAL;
+
+ __OSL_STATFS_INIT(sfs);
+
+ pInfo->uValidFields = 0;
+ pInfo->uAttributes = 0;
+
+ if ((__OSL_STATFS(pszDirectory, &sfs)) < 0)
+ {
+ oslFileError result = oslTranslateFileError(OSL_FET_ERROR, errno);
+ return (result);
+ }
+
+ /* FIXME: how to detect the kind of storage (fixed, cdrom, ...) */
+ if (uFieldMask & osl_VolumeInfo_Mask_Attributes)
+ {
+ if (__OSL_STATFS_ISREMOTE(sfs))
+ pInfo->uAttributes |= osl_Volume_Attribute_Remote;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+ }
+
+ if (uFieldMask & osl_VolumeInfo_Mask_FileSystemCaseHandling)
+ {
+ if (__OSL_STATFS_IS_CASE_SENSITIVE_FS(sfs))
+ pInfo->uAttributes |= osl_Volume_Attribute_Case_Sensitive;
+
+ if (__OSL_STATFS_IS_CASE_PRESERVING_FS(sfs))
+ pInfo->uAttributes |= osl_Volume_Attribute_Case_Is_Preserved;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+ }
+
+ pInfo->uTotalSpace = 0;
+ pInfo->uFreeSpace = 0;
+ pInfo->uUsedSpace = 0;
+
+#if defined(__OSL_STATFS_BLKSIZ)
+
+ if ((uFieldMask & osl_VolumeInfo_Mask_TotalSpace) ||
+ (uFieldMask & osl_VolumeInfo_Mask_UsedSpace))
+ {
+ pInfo->uTotalSpace = __OSL_STATFS_BLKSIZ(sfs);
+ pInfo->uTotalSpace *= (sal_uInt64)(sfs.f_blocks);
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_TotalSpace;
+ }
+
+ if ((uFieldMask & osl_VolumeInfo_Mask_FreeSpace) ||
+ (uFieldMask & osl_VolumeInfo_Mask_UsedSpace))
+ {
+ pInfo->uFreeSpace = __OSL_STATFS_BLKSIZ(sfs);
+
+ if (getuid() == 0)
+ pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bfree);
+ else
+ pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bavail);
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_FreeSpace;
+ }
+
+#endif /* __OSL_STATFS_BLKSIZ */
+
+ if ((pInfo->uValidFields & osl_VolumeInfo_Mask_TotalSpace) &&
+ (pInfo->uValidFields & osl_VolumeInfo_Mask_FreeSpace ))
+ {
+ pInfo->uUsedSpace = pInfo->uTotalSpace - pInfo->uFreeSpace;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_UsedSpace;
+ }
+
+ pInfo->uMaxNameLength = 0;
+ if (uFieldMask & osl_VolumeInfo_Mask_MaxNameLength)
+ {
+ long nLen = pathconf(pszDirectory, _PC_NAME_MAX);
+ if (nLen > 0)
+ {
+ pInfo->uMaxNameLength = (sal_uInt32)nLen;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxNameLength;
+ }
+ }
+
+ pInfo->uMaxPathLength = 0;
+ if (uFieldMask & osl_VolumeInfo_Mask_MaxPathLength)
+ {
+ long nLen = pathconf (pszDirectory, _PC_PATH_MAX);
+ if (nLen > 0)
+ {
+ pInfo->uMaxPathLength = (sal_uInt32)nLen;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxPathLength;
+ }
+ }
+
+#if defined(__OSL_STATFS_TYPENAME)
+
+ if (uFieldMask & osl_VolumeInfo_Mask_FileSystemName)
+ {
+ rtl_string2UString(
+ &(pInfo->ustrFileSystemName),
+ __OSL_STATFS_TYPENAME(sfs),
+ rtl_str_getLength(__OSL_STATFS_TYPENAME(sfs)),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+ OSL_ASSERT(pInfo->ustrFileSystemName != 0);
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_FileSystemName;
+ }
+
+#endif /* __OSL_STATFS_TYPENAME */
+
+ if (uFieldMask & osl_VolumeInfo_Mask_DeviceHandle)
+ {
+ /* FIXME: check also entries in mntent for the device
+ and fill it with correct values */
+
+ *pInfo->pDeviceHandle = osl_isFloppyDrive(pszDirectory);
+
+ if (*pInfo->pDeviceHandle)
+ {
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_DeviceHandle;
+ pInfo->uAttributes |= osl_Volume_Attribute_Removeable;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+ }
+ }
+ return osl_File_E_None;
+}
+
+/******************************************
+ * osl_psz_setFileTime
+ *****************************************/
+
+static oslFileError osl_psz_setFileTime( const sal_Char* pszFilePath,
+ const TimeValue* /*pCreationTime*/,
+ const TimeValue* pLastAccessTime,
+ const TimeValue* pLastWriteTime )
+{
+ int nRet=0;
+ struct utimbuf aTimeBuffer;
+ struct stat aFileStat;
+#ifdef DEBUG_OSL_FILE
+ struct tm* pTM=0;
+#endif
+
+ nRet = lstat(pszFilePath,&aFileStat);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"File Times are (in localtime):\n");
+ pTM=localtime(&aFileStat.st_ctime);
+ fprintf(stderr,"CreationTime is '%s'\n",asctime(pTM));
+ pTM=localtime(&aFileStat.st_atime);
+ fprintf(stderr,"AccessTime is '%s'\n",asctime(pTM));
+ pTM=localtime(&aFileStat.st_mtime);
+ fprintf(stderr,"Modification is '%s'\n",asctime(pTM));
+
+ fprintf(stderr,"File Times are (in UTC):\n");
+ fprintf(stderr,"CreationTime is '%s'\n",ctime(&aFileStat.st_ctime));
+ fprintf(stderr,"AccessTime is '%s'\n",ctime(&aTimeBuffer.actime));
+ fprintf(stderr,"Modification is '%s'\n",ctime(&aTimeBuffer.modtime));
+#endif
+
+ if ( pLastAccessTime != 0 )
+ {
+ aTimeBuffer.actime=pLastAccessTime->Seconds;
+ }
+ else
+ {
+ aTimeBuffer.actime=aFileStat.st_atime;
+ }
+
+ if ( pLastWriteTime != 0 )
+ {
+ aTimeBuffer.modtime=pLastWriteTime->Seconds;
+ }
+ else
+ {
+ aTimeBuffer.modtime=aFileStat.st_mtime;
+ }
+
+ /* mfe: Creation time not used here! */
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"File Times are (in localtime):\n");
+ pTM=localtime(&aFileStat.st_ctime);
+ fprintf(stderr,"CreationTime now '%s'\n",asctime(pTM));
+ pTM=localtime(&aTimeBuffer.actime);
+ fprintf(stderr,"AccessTime now '%s'\n",asctime(pTM));
+ pTM=localtime(&aTimeBuffer.modtime);
+ fprintf(stderr,"Modification now '%s'\n",asctime(pTM));
+
+ fprintf(stderr,"File Times are (in UTC):\n");
+ fprintf(stderr,"CreationTime now '%s'\n",ctime(&aFileStat.st_ctime));
+ fprintf(stderr,"AccessTime now '%s'\n",ctime(&aTimeBuffer.actime));
+ fprintf(stderr,"Modification now '%s'\n",ctime(&aTimeBuffer.modtime));
+#endif
+
+ nRet=utime(pszFilePath,&aTimeBuffer);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+
+
+/*****************************************
+ * osl_psz_removeFile
+ ****************************************/
+#if 0
+static oslFileError osl_psz_removeFile( const sal_Char* pszPath )
+{
+ int nRet=0;
+ struct stat aStat;
+
+ nRet = stat(pszPath,&aStat);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ if ( S_ISDIR(aStat.st_mode) )
+ {
+ return osl_File_E_ISDIR;
+ }
+
+ nRet = unlink(pszPath);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+#endif
+
+/*****************************************
+ * osl_psz_createDirectory
+ ****************************************/
+#if 0
+static oslFileError osl_psz_createDirectory( const sal_Char* pszPath )
+{
+ int nRet=0;
+ int mode = S_IRWXU | S_IRWXG | S_IRWXO;
+
+ nRet = mkdir(pszPath,mode);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+#endif
+/*****************************************
+ * osl_psz_removeDirectory
+ ****************************************/
+#if 0
+static oslFileError osl_psz_removeDirectory( const sal_Char* pszPath )
+{
+ int nRet=0;
+
+ nRet = rmdir(pszPath);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+#endif
+/*****************************************
+ * oslDoMoveFile
+ ****************************************/
+#if 0
+static oslFileError oslDoMoveFile( const sal_Char* pszPath, const sal_Char* pszDestPath)
+{
+ oslFileError tErr=osl_File_E_invalidError;
+
+ tErr = osl_psz_moveFile(pszPath,pszDestPath);
+ if ( tErr == osl_File_E_None )
+ {
+ return tErr;
+ }
+
+ if ( tErr != osl_File_E_XDEV )
+ {
+ return tErr;
+ }
+
+ tErr=osl_psz_copyFile(pszPath,pszDestPath);
+
+ if ( tErr != osl_File_E_None )
+ {
+ oslFileError tErrRemove;
+ tErrRemove=osl_psz_removeFile(pszDestPath);
+ return tErr;
+ }
+
+ tErr=osl_psz_removeFile(pszPath);
+
+ return tErr;
+}
+#endif
+/*****************************************
+ * osl_psz_moveFile
+ ****************************************/
+#if 0
+static oslFileError osl_psz_moveFile(const sal_Char* pszPath, const sal_Char* pszDestPath)
+{
+
+ int nRet = 0;
+
+ nRet = rename(pszPath,pszDestPath);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+#endif
+/*****************************************
+ * osl_psz_copyFile
+ ****************************************/
+#if 0
+static oslFileError osl_psz_copyFile( const sal_Char* pszPath, const sal_Char* pszDestPath )
+{
+ time_t nAcTime=0;
+ time_t nModTime=0;
+ uid_t nUID=0;
+ gid_t nGID=0;
+ int nRet=0;
+ mode_t nMode=0;
+ struct stat aFileStat;
+ oslFileError tErr=osl_File_E_invalidError;
+ size_t nSourceSize=0;
+ int DestFileExists=1;
+
+ /* mfe: does the source file really exists? */
+ nRet = lstat(pszPath,&aFileStat);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ /* mfe: we do only copy files here! */
+ if ( S_ISDIR(aFileStat.st_mode) )
+ {
+ return osl_File_E_ISDIR;
+ }
+
+ nSourceSize=(size_t)aFileStat.st_size;
+ nMode=aFileStat.st_mode;
+ nAcTime=aFileStat.st_atime;
+ nModTime=aFileStat.st_mtime;
+ nUID=aFileStat.st_uid;
+ nGID=aFileStat.st_gid;
+
+ nRet = stat(pszDestPath,&aFileStat);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+
+ if ( nRet == ENOENT )
+ {
+ DestFileExists=0;
+ }
+/* return oslTranslateFileError(nRet);*/
+ }
+
+ /* mfe: the destination file must not be a directory! */
+ if ( nRet == 0 && S_ISDIR(aFileStat.st_mode) )
+ {
+ return osl_File_E_ISDIR;
+ }
+ else
+ {
+ /* mfe: file does not exists or is no dir */
+ }
+
+ tErr = oslDoCopy(pszPath,pszDestPath,nMode,nSourceSize,DestFileExists);
+
+ if ( tErr != osl_File_E_None )
+ {
+ return tErr;
+ }
+
+ /*
+ * mfe: ignore return code
+ * since only the success of the copy is
+ * important
+ */
+ oslChangeFileModes(pszDestPath,nMode,nAcTime,nModTime,nUID,nGID);
+
+ return tErr;
+}
+#endif
+
+/******************************************************************************
+ *
+ * Utility Functions
+ *
+ *****************************************************************************/
+
+
+/*****************************************
+ * oslMakeUStrFromPsz
+ ****************************************/
+
+rtl_uString* oslMakeUStrFromPsz(const sal_Char* pszStr, rtl_uString** ustrValid)
+{
+ rtl_string2UString(
+ ustrValid,
+ pszStr,
+ rtl_str_getLength( pszStr ),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*ustrValid != 0);
+
+ return *ustrValid;
+}
+
+/*****************************************************************************
+ * UnicodeToText
+ * converting unicode to text manually saves us the penalty of a temporary
+ * rtl_String object.
+ ****************************************************************************/
+
+int UnicodeToText( char * buffer, size_t bufLen, const sal_Unicode * uniText, sal_Int32 uniTextLen )
+{
+ rtl_UnicodeToTextConverter hConverter;
+ sal_uInt32 nInfo;
+ sal_Size nSrcChars, nDestBytes;
+
+ /* stolen from rtl/string.c */
+ hConverter = rtl_createUnicodeToTextConverter( osl_getThreadTextEncoding() );
+
+ nDestBytes = rtl_convertUnicodeToText( hConverter, 0, uniText, uniTextLen,
+ buffer, bufLen,
+ OUSTRING_TO_OSTRING_CVTFLAGS | RTL_UNICODETOTEXT_FLAGS_FLUSH,
+ &nInfo, &nSrcChars );
+
+ rtl_destroyUnicodeToTextConverter( hConverter );
+
+ if( nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL )
+ {
+ errno = EOVERFLOW;
+ return 0;
+ }
+
+ /* ensure trailing '\0' */
+ buffer[nDestBytes] = '\0';
+
+ return nDestBytes;
+}
+
+/*****************************************************************************
+ TextToUnicode
+
+ @param text
+ The text to convert.
+
+ @param text_buffer_size
+ The number of characters.
+
+ @param unic_text
+ The unicode buffer.
+
+ @param unic_text_buffer_size
+ The size in characters of the unicode buffer.
+
+ ****************************************************************************/
+
+int TextToUnicode(
+ const char* text,
+ size_t text_buffer_size,
+ sal_Unicode* unic_text,
+ sal_Int32 unic_text_buffer_size)
+{
+ rtl_TextToUnicodeConverter hConverter;
+ sal_uInt32 nInfo;
+ sal_Size nSrcChars;
+ sal_Size nDestBytes;
+
+ /* stolen from rtl/string.c */
+ hConverter = rtl_createTextToUnicodeConverter(osl_getThreadTextEncoding());
+
+ nDestBytes = rtl_convertTextToUnicode(hConverter,
+ 0,
+ text, text_buffer_size,
+ unic_text, unic_text_buffer_size,
+ OSTRING_TO_OUSTRING_CVTFLAGS | RTL_TEXTTOUNICODE_FLAGS_FLUSH,
+ &nInfo, &nSrcChars);
+
+ rtl_destroyTextToUnicodeConverter(hConverter);
+
+ if (nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL)
+ {
+ errno = EOVERFLOW;
+ return 0;
+ }
+
+ /* ensure trailing '\0' */
+ unic_text[nDestBytes] = '\0';
+
+ return nDestBytes;
+}
+
+/******************************************************************************
+ *
+ * GENERIC FLOPPY FUNCTIONS
+ *
+ *****************************************************************************/
+
+
+/*****************************************
+ * osl_unmountVolumeDevice
+ ****************************************/
+
+oslFileError osl_unmountVolumeDevice( oslVolumeDeviceHandle Handle )
+{
+ oslFileError tErr = osl_File_E_NOSYS;
+
+ tErr = osl_unmountFloppy(Handle);
+
+ /* Perhaps current working directory is set to mount point */
+
+ if ( tErr )
+ {
+ sal_Char *pszHomeDir = getenv("HOME");
+
+ if ( pszHomeDir && strlen( pszHomeDir ) && 0 == chdir( pszHomeDir ) )
+ {
+ /* try again */
+
+ tErr = osl_unmountFloppy(Handle);
+
+ OSL_ENSURE( tErr, "osl_unmountvolumeDevice: CWD was set to volume mount point" );
+ }
+ }
+
+ return tErr;
+}
+
+/*****************************************
+ * osl_automountVolumeDevice
+ ****************************************/
+
+oslFileError osl_automountVolumeDevice( oslVolumeDeviceHandle Handle )
+{
+ oslFileError tErr = osl_File_E_NOSYS;
+
+ tErr = osl_mountFloppy(Handle);
+
+ return tErr;
+}
+
+/*****************************************
+ * osl_getVolumeDeviceMountPath
+ ****************************************/
+
+oslFileError osl_getVolumeDeviceMountPath( oslVolumeDeviceHandle Handle, rtl_uString **pstrPath )
+{
+ oslVolumeDeviceHandleImpl* pItem = (oslVolumeDeviceHandleImpl*) Handle;
+ sal_Char Buffer[PATH_MAX];
+
+ Buffer[0] = '\0';
+
+ if ( pItem == 0 || pstrPath == 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+ return osl_File_E_INVAL;
+ }
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"Handle is:\n");
+ osl_printFloppyHandle(pItem);
+#endif
+
+ snprintf(Buffer, sizeof(Buffer), "file://%s", pItem->pszMountPoint);
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"Mount Point is: '%s'\n",Buffer);
+#endif
+
+ oslMakeUStrFromPsz(Buffer, pstrPath);
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * osl_acquireVolumeDeviceHandle
+ ****************************************/
+
+oslFileError SAL_CALL osl_acquireVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
+{
+ oslVolumeDeviceHandleImpl* pItem =(oslVolumeDeviceHandleImpl*) Handle;
+
+ if ( pItem == 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ ++pItem->RefCount;
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * osl_releaseVolumeDeviceHandle
+ ****************************************/
+
+oslFileError osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
+{
+ oslVolumeDeviceHandleImpl* pItem =(oslVolumeDeviceHandleImpl*) Handle;
+
+ if ( pItem == 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ --pItem->RefCount;
+
+ if ( pItem->RefCount == 0 )
+ {
+ rtl_freeMemory(pItem);
+ }
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * osl_newVolumeDeviceHandleImpl
+ ****************************************/
+
+static oslVolumeDeviceHandleImpl* osl_newVolumeDeviceHandleImpl()
+{
+ oslVolumeDeviceHandleImpl* pHandle;
+ const size_t nSizeOfHandle = sizeof(oslVolumeDeviceHandleImpl);
+
+ pHandle = (oslVolumeDeviceHandleImpl*) rtl_allocateMemory (nSizeOfHandle);
+ if (pHandle != NULL)
+ {
+ pHandle->ident[0] = 'O';
+ pHandle->ident[1] = 'V';
+ pHandle->ident[2] = 'D';
+ pHandle->ident[3] = 'H';
+ pHandle->pszMountPoint[0] = '\0';
+ pHandle->pszFilePath[0] = '\0';
+ pHandle->pszDevice[0] = '\0';
+ pHandle->RefCount = 1;
+ }
+ return pHandle;
+}
+
+/*****************************************
+ * osl_freeVolumeDeviceHandleImpl
+ ****************************************/
+
+static void osl_freeVolumeDeviceHandleImpl (oslVolumeDeviceHandleImpl* pHandle)
+{
+ if (pHandle != NULL)
+ rtl_freeMemory (pHandle);
+}
+
+
+/******************************************************************************
+ *
+ * OS/2 FLOPPY FUNCTIONS
+ *
+ *****************************************************************************/
+
+#if defined(OS2)
+static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath)
+{
+ return NULL;
+}
+
+static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
+{
+ return osl_File_E_BUSY;
+}
+
+static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
+{
+ return osl_File_E_BUSY;
+}
+
+static sal_Bool osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem)
+{
+ return sal_False;
+}
+
+static sal_Bool osl_isFloppyMounted(oslVolumeDeviceHandleImpl* pDevice)
+{
+ return sal_False;
+}
+
+
+#ifdef DEBUG_OSL_FILE
+static void osl_printFloppyHandle(oslVolumeDeviceHandleImpl* pItem)
+{
+ if (pItem == 0 )
+ {
+ fprintf(stderr,"NULL Handle\n");
+ return;
+ }
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"Invalid Handle]\n");
+#endif
+ return;
+ }
+
+
+ fprintf(stderr,"MountPoint : '%s'\n",pItem->pszMountPoint);
+ fprintf(stderr,"FilePath : '%s'\n",pItem->pszFilePath);
+ fprintf(stderr,"Device : '%s'\n",pItem->pszDevice);
+
+ return;
+}
+#endif
+
+#endif /* OS2 */
diff --git a/sal/osl/os2/file_error_transl.cxx b/sal/osl/os2/file_error_transl.cxx
new file mode 100644
index 000000000000..fd296d9dd3d2
--- /dev/null
+++ b/sal/osl/os2/file_error_transl.cxx
@@ -0,0 +1,252 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ #ifndef _ERRNO_H
+ #include <errno.h>
+ #endif
+
+ #ifndef _FILE_ERROR_TRANSL_H_
+ #include "file_error_transl.h"
+ #endif
+
+ #ifndef _OSL_DIAGNOSE_H_
+ #include <osl/diagnose.h>
+ #endif
+
+
+/********************************************
+ * oslTranslateFileError
+ *******************************************/
+
+oslFileError oslTranslateFileError(sal_Bool bIsError, int Errno)
+{
+ oslFileError osl_error = osl_File_E_invalidError;
+
+ OSL_ENSURE((bIsError && (0 != Errno)) || (!bIsError && (0 == Errno)), "oslTranslateFileError strange input combination!");
+
+ /* Have a look at file_error_transl.h for
+ the reason that we do this here */
+ if (bIsError && (0 == Errno))
+ return osl_error;
+
+ switch(Errno)
+ {
+ case 0:
+ osl_error = osl_File_E_None;
+ break;
+
+ case EPERM:
+ osl_error = osl_File_E_PERM;
+ break;
+
+ case ENOENT:
+ osl_error = osl_File_E_NOENT;
+ break;
+
+ case ESRCH:
+ osl_error = osl_File_E_SRCH;
+ break;
+
+ case EINTR:
+ osl_error = osl_File_E_INTR;
+ break;
+
+ case EIO:
+ osl_error = osl_File_E_IO;
+ break;
+
+ case ENXIO:
+ osl_error = osl_File_E_IO;
+ break;
+
+ case E2BIG:
+ osl_error = osl_File_E_2BIG;
+ break;
+
+ case ENOEXEC:
+ osl_error = osl_File_E_NOEXEC;
+ break;
+
+ case EBADF:
+ osl_error = osl_File_E_BADF;
+ break;
+
+ case ECHILD:
+ osl_error = osl_File_E_CHILD;
+ break;
+
+ case EAGAIN:
+ osl_error = osl_File_E_AGAIN;
+ break;
+
+ case ENOMEM:
+ osl_error = osl_File_E_NOMEM;
+ break;
+
+ case EACCES:
+ osl_error = osl_File_E_ACCES;
+ break;
+
+ case EFAULT:
+ osl_error = osl_File_E_FAULT;
+ break;
+
+ case EBUSY:
+ osl_error = osl_File_E_BUSY;
+ break;
+
+ case EEXIST:
+ osl_error = osl_File_E_EXIST;
+ break;
+
+ case EXDEV:
+ osl_error = osl_File_E_XDEV;
+ break;
+
+ case ENODEV:
+ osl_error = osl_File_E_NODEV;
+ break;
+
+ case ENOTDIR:
+ osl_error = osl_File_E_NOTDIR;
+ break;
+
+ case EISDIR:
+ osl_error = osl_File_E_ISDIR;
+ break;
+
+ case EINVAL:
+ osl_error = osl_File_E_INVAL;
+ break;
+
+ case ENFILE:
+ osl_error = osl_File_E_NFILE;
+ break;
+
+ case EMFILE:
+ osl_error = osl_File_E_MFILE;
+ break;
+
+ case ENOTTY:
+ osl_error = osl_File_E_NOTTY;
+ break;
+
+ case EFBIG:
+ osl_error = osl_File_E_FBIG;
+ break;
+
+ case ENOSPC:
+ osl_error = osl_File_E_NOSPC;
+ break;
+
+ case ESPIPE:
+ osl_error = osl_File_E_SPIPE;
+ break;
+
+ case EROFS:
+ osl_error = osl_File_E_ROFS;
+ break;
+
+ case EMLINK:
+ osl_error = osl_File_E_MLINK;
+ break;
+
+ case EPIPE:
+ osl_error = osl_File_E_PIPE;
+ break;
+
+ case EDOM:
+ osl_error = osl_File_E_DOM;
+ break;
+
+ case ERANGE:
+ osl_error = osl_File_E_RANGE;
+ break;
+
+ case EDEADLK:
+ osl_error = osl_File_E_DEADLK;
+ break;
+
+ case ENAMETOOLONG:
+ osl_error = osl_File_E_NAMETOOLONG;
+ break;
+
+ case ENOLCK:
+ osl_error = osl_File_E_NOLCK;
+ break;
+
+ case ENOSYS:
+ osl_error = osl_File_E_NOSYS;
+ break;
+
+ case ENOTEMPTY:
+ osl_error = osl_File_E_NOTEMPTY;
+ break;
+
+ case ELOOP:
+ osl_error = osl_File_E_LOOP;
+ break;
+
+#if !(defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+ case EILSEQ:
+ osl_error = osl_File_E_ILSEQ;
+ break;
+#endif /* MACOSX */
+
+#if !(defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(OS2))
+ case ENOLINK:
+ osl_error = osl_File_E_NOLINK;
+ break;
+#endif /* MACOSX */
+
+#if !(defined(MACOSX) || defined(NETBSD) || defined(FREEBSD) || defined(OS2))
+ case EMULTIHOP:
+ osl_error = osl_File_E_MULTIHOP;
+ break;
+#endif /* MACOSX */
+
+ case EUSERS:
+ osl_error = osl_File_E_USERS;
+ break;
+
+ case EOVERFLOW:
+ osl_error = osl_File_E_OVERFLOW;
+ break;
+
+ case ETIMEDOUT:
+ osl_error = osl_File_E_TIMEDOUT;
+ break;
+
+ default:
+ /* FIXME translateFileError: is this alright? Or add a new one: osl_File_E_Unknown? */
+ osl_error = osl_File_E_invalidError;
+ break;
+ }
+
+ return osl_error;
+}
+
diff --git a/sal/osl/os2/file_error_transl.h b/sal/osl/os2/file_error_transl.h
new file mode 100644
index 000000000000..59d7b1d9faec
--- /dev/null
+++ b/sal/osl/os2/file_error_transl.h
@@ -0,0 +1,70 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _FILE_ERROR_TRANSL_H_
+#define _FILE_ERROR_TRANSL_H_
+
+#include <osl/file.h>
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*********************************************
+ oslTranslateFileError
+ Translate errno's to osl file errors
+
+ @param bIsError [in] specifies if nErrno
+ should be interpreted as error,
+ some libc functions signaling an error
+ but errno is nevertheless 0 in this
+ case the function should at least
+ return osl_File_E_Unknown but in no
+ case osl_File_E_None!
+
+ @param nErrno [in] the errno if errno is 0
+ and bIsError is true the function
+ returns osl_File_E_Unknown
+
+ @returns the osl error code appropriate to
+ the errno
+
+ *********************************************/
+
+#define OSL_FET_SUCCESS sal_False
+#define OSL_FET_ERROR sal_True
+
+oslFileError oslTranslateFileError(sal_Bool bIsError, int Errno);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/osl/os2/file_path_helper.cxx b/sal/osl/os2/file_path_helper.cxx
new file mode 100644
index 000000000000..1aa5840deca4
--- /dev/null
+++ b/sal/osl/os2/file_path_helper.cxx
@@ -0,0 +1,377 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ /*******************************************
+ Includes
+ ******************************************/
+
+ #ifndef _OSL_THREAD_H_
+ #include "osl/thread.h"
+ #endif
+
+ #ifndef _OSL_FILE_PATH_HELPER_H_
+ #include "file_path_helper.h"
+ #endif
+
+ #ifndef _OSL_FILE_PATH_HELPER_HXX_
+ #include "file_path_helper.hxx"
+ #endif
+
+ #ifndef _OSL_UUNXAPI_HXX_
+ #include "uunxapi.hxx"
+ #endif
+
+ #ifndef _OSL_DIAGNOSE_H_
+ #include <osl/diagnose.h>
+ #endif
+
+ #ifndef _RTL_USTRING_HXX_
+ #include <rtl/ustring.hxx>
+ #endif
+
+ /*******************************************
+ Constants
+ ******************************************/
+
+ const sal_Unicode FPH_CHAR_PATH_SEPARATOR = (sal_Unicode)'\\';
+ const sal_Unicode FPH_CHAR_DOT = (sal_Unicode)'.';
+ const sal_Unicode FPH_CHAR_COLON = (sal_Unicode)':';
+
+ inline const rtl::OUString FPH_PATH_SEPARATOR()
+ { return rtl::OUString::createFromAscii("\\"); }
+ inline const rtl::OUString FPH_LOCAL_DIR_ENTRY()
+ { return rtl::OUString::createFromAscii("."); }
+ inline const rtl::OUString FPH_PARENT_DIR_ENTRY()
+ { return rtl::OUString::createFromAscii(".."); }
+
+ /*******************************************
+ * osl_systemPathRemoveSeparator
+ ******************************************/
+
+ void SAL_CALL osl_systemPathRemoveSeparator(rtl_uString* pustrPath)
+ {
+ OSL_PRECOND(pustrPath, "osl_systemPathRemoveSeparator: Invalid parameter");
+
+ // maybe there are more than one separator at end
+ // so we run in a loop
+ while ((pustrPath->length > 1) && (FPH_CHAR_PATH_SEPARATOR == pustrPath->buffer[pustrPath->length - 1]))
+ {
+ pustrPath->length--;
+ pustrPath->buffer[pustrPath->length] = (sal_Unicode)'\0';
+ }
+
+ OSL_POSTCOND((0 == pustrPath->length) || (1 == pustrPath->length) || \
+ (pustrPath->length > 1 && pustrPath->buffer[pustrPath->length - 1] != FPH_CHAR_PATH_SEPARATOR), \
+ "osl_systemPathRemoveSeparator: Post condition failed");
+ }
+
+ /*******************************************
+ osl_systemPathEnsureSeparator
+ ******************************************/
+
+ void SAL_CALL osl_systemPathEnsureSeparator(rtl_uString** ppustrPath)
+ {
+ OSL_PRECOND(ppustrPath && (NULL != *ppustrPath), \
+ "osl_systemPathEnsureSeparator: Invalid parameter");
+
+ rtl::OUString path(*ppustrPath);
+ sal_Int32 lp = path.getLength();
+ sal_Int32 i = path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR);
+
+ if ((lp > 1 && i != (lp - 1)) || ((lp < 2) && i < 0))
+ {
+ path += FPH_PATH_SEPARATOR();
+ rtl_uString_assign(ppustrPath, path.pData);
+ }
+
+ OSL_POSTCOND(path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR) == (path.getLength() - 1), \
+ "osl_systemPathEnsureSeparator: Post condition failed");
+ }
+
+ /*******************************************
+ * osl_systemPathIsRelativePath
+ ******************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsRelativePath(const rtl_uString* pustrPath)
+ {
+ OSL_PRECOND(pustrPath, "osl_systemPathIsRelativePath: Invalid parameter");
+ return (!osl_systemPathIsAbsolutePath(pustrPath));
+ }
+
+ /******************************************
+ * osl_systemPathIsAbsolutePath
+ *****************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsAbsolutePath(const rtl_uString* pustrPath)
+ {
+ OSL_PRECOND(pustrPath, "osl_systemPathIsAbsolutePath: Invalid parameter");
+ if (pustrPath->length == 0)
+ return sal_False;
+ if (pustrPath->buffer[0] == FPH_CHAR_PATH_SEPARATOR)
+ return sal_True;
+ if (pustrPath->buffer[1] == FPH_CHAR_COLON
+ && pustrPath->buffer[2] == FPH_CHAR_PATH_SEPARATOR)
+ return sal_True;
+ return sal_False;
+ }
+
+ /******************************************
+ osl_systemPathMakeAbsolutePath
+ *****************************************/
+
+ void SAL_CALL osl_systemPathMakeAbsolutePath(
+ const rtl_uString* pustrBasePath,
+ const rtl_uString* pustrRelPath,
+ rtl_uString** ppustrAbsolutePath)
+{
+ rtl::OUString base(rtl_uString_getStr(const_cast<rtl_uString*>(pustrBasePath)));
+ rtl::OUString rel(const_cast<rtl_uString*>(pustrRelPath));
+
+ if (base.getLength() > 0)
+ osl_systemPathEnsureSeparator(&base.pData);
+
+ base += rel;
+
+ rtl_uString_acquire(base.pData);
+ *ppustrAbsolutePath = base.pData;
+}
+
+
+ /*****************************************
+ osl_systemPathGetParent
+ ****************************************/
+
+ sal_Int32 SAL_CALL osl_systemPathGetParent(rtl_uString* pustrPath)
+ {
+ return 0;
+ }
+
+ /*******************************************
+ osl_systemPathGetFileOrLastDirectoryPart
+ ******************************************/
+
+ void SAL_CALL osl_systemPathGetFileNameOrLastDirectoryPart(
+ const rtl_uString* pustrPath,
+ rtl_uString** ppustrFileNameOrLastDirPart)
+{
+ OSL_PRECOND(pustrPath && ppustrFileNameOrLastDirPart, \
+ "osl_systemPathGetFileNameOrLastDirectoryPart: Invalid parameter");
+
+ rtl::OUString path(const_cast<rtl_uString*>(pustrPath));
+
+ osl_systemPathRemoveSeparator(path.pData);
+
+ rtl::OUString last_part;
+
+ if (path.getLength() > 1 || (1 == path.getLength() && *path.getStr() != FPH_CHAR_PATH_SEPARATOR))
+ {
+ sal_Int32 idx_ps = path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR);
+ idx_ps++; // always right to increment by one even if idx_ps == -1!
+ last_part = rtl::OUString(path.getStr() + idx_ps);
+ }
+ rtl_uString_assign(ppustrFileNameOrLastDirPart, last_part.pData);
+}
+
+
+ /********************************************
+ osl_systemPathIsHiddenFileOrDirectoryEntry
+ *********************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsHiddenFileOrDirectoryEntry(
+ const rtl_uString* pustrPath)
+{
+ OSL_PRECOND(pustrPath, "osl_systemPathIsHiddenFileOrDirectoryEntry: Invalid parameter");
+
+ sal_Bool is_hidden = sal_False;
+
+ if (pustrPath->length > 0)
+ {
+ rtl::OUString fdp;
+
+ osl_systemPathGetFileNameOrLastDirectoryPart(pustrPath, &fdp.pData);
+
+ is_hidden = ((fdp.pData->length > 0) && (fdp.pData->buffer[0] == FPH_CHAR_DOT) &&
+ !osl_systemPathIsLocalOrParentDirectoryEntry(fdp.pData));
+ }
+
+ return is_hidden;
+}
+
+
+ /************************************************
+ osl_systemPathIsLocalOrParentDirectoryEntry
+ ************************************************/
+
+sal_Bool SAL_CALL osl_systemPathIsLocalOrParentDirectoryEntry(
+ const rtl_uString* pustrPath)
+{
+ OSL_PRECOND(pustrPath, "osl_systemPathIsLocalOrParentDirectoryEntry: Invalid parameter");
+
+ rtl::OUString dirent;
+
+ osl_systemPathGetFileNameOrLastDirectoryPart(pustrPath, &dirent.pData);
+
+ return (
+ (dirent == FPH_LOCAL_DIR_ENTRY()) ||
+ (dirent == FPH_PARENT_DIR_ENTRY())
+ );
+}
+
+/***********************************************
+ Simple iterator for a path list separated by
+ the specified character
+ **********************************************/
+
+class path_list_iterator
+{
+public:
+
+ /******************************************
+ constructor
+
+ after construction get_current_item
+ returns the first path in list, no need
+ to call reset first
+ *****************************************/
+ path_list_iterator(const rtl::OUString& path_list, sal_Unicode list_separator = FPH_CHAR_COLON) :
+ m_path_list(path_list),
+ m_end(m_path_list.getStr() + m_path_list.getLength() + 1),
+ m_separator(list_separator)
+ {
+ reset();
+ }
+
+ /******************************************
+ reset the iterator
+ *****************************************/
+ void reset()
+ {
+ m_path_segment_begin = m_path_segment_end = m_path_list.getStr();
+ advance();
+ }
+
+ /******************************************
+ move the iterator to the next position
+ *****************************************/
+ void next()
+ {
+ OSL_PRECOND(!done(), "path_list_iterator: Already done!");
+
+ m_path_segment_begin = ++m_path_segment_end;
+ advance();
+ }
+
+ /******************************************
+ check if done
+ *****************************************/
+ bool done() const
+ {
+ return (m_path_segment_end >= m_end);
+ }
+
+ /******************************************
+ return the current item
+ *****************************************/
+ rtl::OUString get_current_item() const
+ {
+ return rtl::OUString(
+ m_path_segment_begin,
+ (m_path_segment_end - m_path_segment_begin));
+ }
+
+private:
+
+ /******************************************
+ move m_path_end to the next separator or
+ to the edn of the string
+ *****************************************/
+ void advance()
+ {
+ while (!done() && *m_path_segment_end && (*m_path_segment_end != m_separator))
+ ++m_path_segment_end;
+
+ OSL_ASSERT(m_path_segment_end <= m_end);
+ }
+
+private:
+ rtl::OUString m_path_list;
+ const sal_Unicode* m_end;
+ const sal_Unicode m_separator;
+ const sal_Unicode* m_path_segment_begin;
+ const sal_Unicode* m_path_segment_end;
+
+// prevent copy and assignment
+private:
+ /******************************************
+ copy constructor
+ remember: do not simply copy m_path_begin
+ and m_path_end because they point to
+ the memory of other.m_path_list!
+ *****************************************/
+ path_list_iterator(const path_list_iterator& other);
+
+ /******************************************
+ assignment operator
+ remember: do not simply copy m_path_begin
+ and m_path_end because they point to
+ the memory of other.m_path_list!
+ *****************************************/
+ path_list_iterator& operator=(const path_list_iterator& other);
+};
+
+ /************************************************
+ osl_searchPath
+ ***********************************************/
+
+sal_Bool SAL_CALL osl_searchPath(
+ const rtl_uString* pustrFilePath,
+ const rtl_uString* pustrSearchPathList,
+ rtl_uString** ppustrPathFound)
+{
+ OSL_PRECOND(pustrFilePath && pustrSearchPathList && ppustrPathFound, "osl_searchPath: Invalid parameter");
+
+ bool bfound = false;
+ rtl::OUString fp(const_cast<rtl_uString*>(pustrFilePath));
+ rtl::OUString pl = rtl::OUString(const_cast<rtl_uString*>(pustrSearchPathList));
+ path_list_iterator pli(pl);
+
+ while (!pli.done())
+ {
+ rtl::OUString p = pli.get_current_item();
+ osl::systemPathEnsureSeparator(p);
+ p += fp;
+
+ if (osl::access(p, F_OK) > -1)
+ {
+ bfound = true;
+ rtl_uString_assign(ppustrPathFound, p.pData);
+ break;
+ }
+ pli.next();
+ }
+ return bfound;
+}
diff --git a/sal/osl/os2/file_path_helper.h b/sal/osl/os2/file_path_helper.h
new file mode 100644
index 000000000000..88b8ccbe9b6a
--- /dev/null
+++ b/sal/osl/os2/file_path_helper.h
@@ -0,0 +1,292 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ #ifndef _OSL_FILE_PATH_HELPER_H_
+ #define _OSL_FILE_PATH_HELPER_H_
+
+
+ #ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+ #endif
+
+ #ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+ #endif
+
+
+ #ifdef __cplusplus
+ extern "C"
+ {
+ #endif
+
+
+ /*******************************************
+ osl_systemPathRemoveSeparator
+ Removes the last separator from the
+ given system path if any and if the path
+ is not the root path '/'
+
+ @param ppustrPath [inout] a system path
+ if the path is not the root path
+ and the last character is a
+ path separator it will be cut off
+ ppustrPath must not be NULL and
+ must point to a valid rtl_uString
+
+ @returns nothing
+
+ ******************************************/
+
+ void SAL_CALL osl_systemPathRemoveSeparator(
+ /*inout*/ rtl_uString* pustrPath);
+
+ /*******************************************
+ osl_systemPathEnsureSeparator
+ Adds a trailing path separator to the
+ given system path if not already there
+ and if the path is not the root path '/'
+
+ @param pustrPath [inout] a system path
+ if the path is not the root path
+ '/' and has no trailing separator
+ a separator will be added
+ ppustrPath must not be NULL and
+ must point to a valid rtl_uString
+
+ @returns nothing
+
+ ******************************************/
+
+ void SAL_CALL osl_systemPathEnsureSeparator(
+ /*inout*/ rtl_uString** ppustrPath);
+
+ /*******************************************
+ osl_systemPathIsRelativePath
+ Returns true if the given path is a
+ relative path and so starts not with '/'
+
+ @param pustrPath [in] a system path
+ pustrPath must not be NULL
+
+ @returns sal_True if the given path
+ doesn't start with a separator
+ else sal_False will be returned
+
+ ******************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsRelativePath(
+ const rtl_uString* pustrPath);
+
+ /******************************************
+ osl_systemPathIsAbsolutePath
+ Returns true if the given path is an
+ absolute path and so starts with a '/'
+
+ @param pustrPath [in] a system path
+ pustrPath must not be NULL
+
+ @returns sal_True if the given path
+ start's with a separator else
+ sal_False will be returned
+
+ *****************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsAbsolutePath(
+ const rtl_uString* pustrPath);
+
+ /******************************************
+ osl_systemPathMakeAbsolutePath
+ Append a relative path to a base path
+
+ @param pustrBasePath [in] a system
+ path that will be considered as
+ base path
+ pustrBasePath must not be NULL
+
+ @param pustrRelPath [in] a system path
+ that will be considered as
+ relative path
+ pustrBasePath must not be NULL
+
+ @param ppustrAbsolutePath [out] the
+ resulting path which is a
+ concatination of the base and
+ the relative path
+ if base path is empty the
+ resulting absolute path is the
+ relative path
+ if relative path is empty the
+ resulting absolute path is the
+ base path
+ if base and relative path are
+ empty the resulting absolute
+ path is also empty
+ ppustrAbsolutePath must not be
+ NULL and *ppustrAbsolutePath
+ must be 0 or point to a valid
+ rtl_uString
+
+ *****************************************/
+
+ void SAL_CALL osl_systemPathMakeAbsolutePath(
+ const rtl_uString* pustrBasePath,
+ const rtl_uString* pustrRelPath,
+ rtl_uString** ppustrAbsolutePath);
+
+ /*****************************************
+ osl_systemPathGetParent
+ Replaces the last occurrance of a path
+ separator with '\0' and returns the
+ position where the '/' was replaced
+
+ @param pustrPath [inout] a system
+ path, the last separator of
+ this path will be replaced by
+ a '\0'
+ if the path is the root path
+ '/' or the path is considered
+ as to have no parent, e.g.
+ '/NoParent' or 'NoParent' or
+ the path is empty no
+ replacement will be made
+ pustrPath must not be NULL
+
+ @returns the position of the last path
+ separator that was replaced
+ or 0 if no replacement took
+ place
+
+ ****************************************/
+
+ sal_Int32 SAL_CALL osl_systemPathGetParent(
+ /*inout*/ rtl_uString* pustrPath);
+
+ /*****************************************
+ osl_systemPathGetFileOrLastDirectoryPart
+ Returns the file or the directory part
+ of the given path
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @param ppustrFileOrDirPart [out] on
+ return receives the last part
+ of the given directory or the
+ file name
+ if pustrPath is the root path
+ '/' an empty string will be
+ returned
+ if pustrPath has a trailing
+ '/' the last part before the
+ '/' will be returned else
+ the part after the last '/'
+ will be returned
+
+ @returns nothing
+
+ ****************************************/
+ void SAL_CALL osl_systemPathGetFileNameOrLastDirectoryPart(
+ const rtl_uString* pustrPath,
+ rtl_uString** ppustrFileNameOrLastDirPart);
+
+
+ /********************************************
+ osl_systemPathIsHiddenFileOrDirectoryEntry
+ Returns sal_True if the last part of
+ given system path is not '.' or '..'
+ alone and starts with a '.'
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @returns sal_True if the last part of
+ the given system path starts
+ with '.' or sal_False the last
+ part is '.' or '..' alone or
+ doesn't start with a dot
+
+ *********************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsHiddenFileOrDirectoryEntry(
+ const rtl_uString* pustrPath);
+
+
+ /************************************************
+ osl_systemPathIsLocalOrParentDirectoryEntry
+ Returns sal_True if the last part of the given
+ system path is the local directory entry '.'
+ or the parent directory entry '..'
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @returns sal_True if the last part of the
+ given system path is '.' or '..'
+ else sal_False
+
+ ************************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsLocalOrParentDirectoryEntry(
+ const rtl_uString* pustrPath);
+
+
+ /************************************************
+ osl_searchPath
+ Searches for a file name or path name in all
+ directories specified by a given path list.
+ Symbolic links in the resulting path will not be
+ resolved, it's up to the caller to do this.
+
+ @param pustrFilePath [in] a file name or
+ directory name to search for, the name must
+ be provided as system path not as a file URL
+
+ @param pustrSearchPathList [in] a ':'
+ separated list of paths in which to search for
+ the file or directory name
+
+ @ppustrPathFound [out] on success receives the
+ complete path of the file or directory found
+ as a system path
+
+ @returns sal_True if the specified file or
+ directory was found else sal_False
+ ***********************************************/
+
+ sal_Bool SAL_CALL osl_searchPath(
+ const rtl_uString* pustrFilePath,
+ const rtl_uString* pustrSearchPathList,
+ rtl_uString** ppustrPathFound);
+
+
+ #ifdef __cplusplus
+ }
+ #endif
+
+
+ #endif /* #ifndef _OSL_PATH_HELPER_H_ */
+
diff --git a/sal/osl/os2/file_path_helper.hxx b/sal/osl/os2/file_path_helper.hxx
new file mode 100644
index 000000000000..5310f462efc0
--- /dev/null
+++ b/sal/osl/os2/file_path_helper.hxx
@@ -0,0 +1,296 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_FILE_PATH_HELPER_HXX_
+#define _OSL_FILE_PATH_HELPER_HXX_
+
+
+#ifndef _OSL_FILE_PATH_HELPER_H_
+#include "file_path_helper.h"
+#endif
+
+#include <rtl/ustring.hxx>
+
+
+namespace osl
+{
+
+ /*******************************************
+ systemPathRemoveSeparator
+ Removes the last separator from the
+ given system path if any and if the path
+ is not the root path '/'
+
+ @param ppustrPath [inout] a system path
+ if the path is not the root path
+ and the last character is a
+ path separator it will be cut off
+ ppustrPath must not be NULL and
+ must point to a valid rtl_uString
+
+ @returns nothing
+
+ ******************************************/
+
+ inline void systemPathRemoveSeparator(/*inout*/ rtl::OUString& Path)
+ {
+ osl_systemPathRemoveSeparator(Path.pData);
+ }
+
+ /*******************************************
+ systemPathEnsureSeparator
+ Adds a trailing path separator to the
+ given system path if not already there
+ and if the path is not the root path '/'
+
+ @param pustrPath [inout] a system path
+ if the path is not the root path
+ '/' and has no trailing separator
+ a separator will be added
+ ppustrPath must not be NULL and
+ must point to a valid rtl_uString
+
+ @returns nothing
+
+ ******************************************/
+
+ inline void systemPathEnsureSeparator(/*inout*/ rtl::OUString& Path)
+ {
+ osl_systemPathEnsureSeparator(&Path.pData);
+ }
+
+ /*******************************************
+ systemPathIsRelativePath
+ Returns true if the given path is a
+ relative path and so starts not with '/'
+
+ @param pustrPath [in] a system path
+ pustrPath must not be NULL
+
+ @returns sal_True if the given path
+ doesn't start with a separator
+ else sal_False will be returned
+
+ ******************************************/
+
+ inline bool systemPathIsRelativePath(const rtl::OUString& Path)
+ {
+ return osl_systemPathIsRelativePath(Path.pData);
+ }
+
+ /******************************************
+ systemPathIsAbsolutePath
+ Returns true if the given path is an
+ absolute path and so starts with a '/'
+
+ @param pustrPath [in] a system path
+ pustrPath must not be NULL
+
+ @returns sal_True if the given path
+ start's with a separator else
+ sal_False will be returned
+
+ *****************************************/
+
+ inline bool systemPathIsAbsolutePath(const rtl::OUString& Path)
+ {
+ return osl_systemPathIsAbsolutePath(Path.pData);
+ }
+
+ /******************************************
+ systemPathMakeAbsolutePath
+ Append a relative path to a base path
+
+ @param pustrBasePath [in] a system
+ path that will be considered as
+ base path
+ pustrBasePath must not be NULL
+
+ @param pustrRelPath [in] a system path
+ that will be considered as
+ relative path
+ pustrBasePath must not be NULL
+
+ @param ppustrAbsolutePath [out] the
+ resulting path which is a
+ concatination of the base and
+ the relative path
+ if base path is empty the
+ resulting absolute path is the
+ relative path
+ if relative path is empty the
+ resulting absolute path is the
+ base path
+ if base and relative path are
+ empty the resulting absolute
+ path is also empty
+ ppustrAbsolutePath must not be
+ NULL and *ppustrAbsolutePath
+ must be 0 or point to a valid
+ rtl_uString
+
+ *****************************************/
+
+ inline void systemPathMakeAbsolutePath(
+ const rtl::OUString& BasePath,
+ const rtl::OUString& RelPath,
+ rtl::OUString& AbsolutePath)
+ {
+ osl_systemPathMakeAbsolutePath(
+ BasePath.pData, RelPath.pData, &AbsolutePath.pData);
+ }
+
+ /*****************************************
+ systemPathGetParent
+ Replaces the last occurrance of a path
+ separator with '\0' and returns the
+ position where the '/' was replaced
+
+ @param pustrPath [inout] a system
+ path, the last separator of
+ this path will be replaced by
+ a '\0'
+ if the path is the root path
+ '/' or the path is considered
+ as to have no parent, e.g.
+ '/NoParent' or 'NoParent' or
+ the path is empty no
+ replacement will be made
+ pustrPath must not be NULL
+
+ @returns the position of the last path
+ separator that was replaced
+ or 0 if no replacement took
+ place
+
+ ****************************************/
+
+ inline sal_Int32 systemPathGetParent(/*inout*/ rtl::OUString& Path)
+ {
+ return osl_systemPathGetParent(Path.pData);
+ }
+
+ /*****************************************
+ systemPathGetFileOrLastDirectoryPart
+ Returns the file or the directory part
+ of the given path
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @param ppustrFileOrDirPart [out] on
+ return receives the last part
+ of the given directory or the
+ file name
+ if pustrPath is the root path
+ '/' an empty string will be
+ returned
+ if pustrPath has a trailing
+ '/' the last part before the
+ '/' will be returned else
+ the part after the last '/'
+ will be returned
+
+ @returns nothing
+
+ ****************************************/
+
+ inline void systemPathGetFileNameOrLastDirectoryPart(
+ const rtl::OUString& Path,
+ rtl::OUString& FileNameOrLastDirPart)
+ {
+ osl_systemPathGetFileNameOrLastDirectoryPart(
+ Path.pData, &FileNameOrLastDirPart.pData);
+ }
+
+
+ /********************************************
+ systemPathIsHiddenFileOrDirectoryEntry
+ Returns sal_True if the last part of
+ given system path is not '.' or '..'
+ alone and starts with a '.'
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @returns sal_True if the last part of
+ the given system path starts
+ with '.' or sal_False the last
+ part is '.' or '..' alone or
+ doesn't start with a dot
+
+ *********************************************/
+
+ inline bool systemPathIsHiddenFileOrDirectoryEntry(
+ const rtl::OUString& Path)
+ {
+ return osl_systemPathIsHiddenFileOrDirectoryEntry(Path.pData);
+ }
+
+
+ /************************************************
+ systemPathIsLocalOrParentDirectoryEntry
+ Returns sal_True if the last part of the given
+ system path is the local directory entry '.'
+ or the parent directory entry '..'
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @returns sal_True if the last part of the
+ given system path is '.' or '..'
+ else sal_False
+
+ ************************************************/
+
+ inline bool systemPathIsLocalOrParentDirectoryEntry(
+ const rtl::OUString& Path)
+ {
+ return osl_systemPathIsLocalOrParentDirectoryEntry(Path.pData);
+ }
+
+ /************************************************
+ searchPath
+ ***********************************************/
+
+ inline bool searchPath(
+ const rtl::OUString& ustrFilePath,
+ const rtl::OUString& ustrSearchPathList,
+ rtl::OUString& ustrPathFound)
+ {
+ return osl_searchPath(
+ ustrFilePath.pData,
+ ustrSearchPathList.pData,
+ &ustrPathFound.pData);
+ }
+
+
+ } // namespace osl
+
+
+ #endif /* #ifndef _OSL_PATH_HELPER_HXX_ */
+
diff --git a/sal/osl/os2/file_url.cxx b/sal/osl/os2/file_url.cxx
new file mode 100644
index 000000000000..e3b5fbf00c48
--- /dev/null
+++ b/sal/osl/os2/file_url.cxx
@@ -0,0 +1,1626 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <ctype.h>
+#include "system.h"
+
+#ifndef _LIMITS_H
+#include <limits.h>
+#endif
+
+#ifndef _ERRNO_H
+#include <errno.h>
+#endif
+
+#ifndef _STDLIB_H_
+#include <stdlib.h>
+#endif
+
+#ifndef _STRINGS_H
+#include <strings.h>
+#endif
+
+#ifndef _UNISTD_H
+#include <unistd.h>
+#endif
+#include <osl/file.h>
+#include <osl/security.h>
+#include <rtl/uri.h>
+#include <osl/diagnose.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.h>
+
+#ifndef _OSL_TREAD_H_
+#include <osl/thread.h>
+#endif
+#include <osl/file.hxx>
+#include <osl/mutex.h>
+#include <osl/process.h>
+#include "file_error_transl.h"
+
+#ifndef _FILE_URL_H_
+#include "file_url.h"
+#endif
+#include "file_path_helper.hxx"
+
+#ifndef _OSL_UUNXAPI_HXX_
+#include "uunxapi.hxx"
+#endif
+
+#include <wchar.h>
+#include <wctype.h>
+
+/***************************************************
+
+ General note
+
+ This file contains the part that handles File URLs.
+
+ File URLs as scheme specific notion of URIs
+ (RFC2396) may be handled platform independend, but
+ will not in osl which is considered wrong.
+ Future version of osl should handle File URLs this
+ way. In rtl/uri there is already an URI parser etc.
+ so this code should be consolidated.
+
+ **************************************************/
+
+oslMutex g_CurrentDirectoryMutex;
+
+
+/***************************************************
+ * forward
+ **************************************************/
+
+void _osl_warnFile(const char*, rtl_uString*);
+rtl_uString* oslMakeUStrFromPsz(const sal_Char* pszStr,rtl_uString** uStr);
+
+extern "C" int UnicodeToText(char *, size_t, const sal_Unicode *, sal_Int32);
+extern "C" int TextToUnicode(const char* text, size_t text_buffer_size, sal_Unicode* unic_text, sal_Int32 unic_text_buffer_size);
+
+/***************************************************
+ * namespace directives
+ **************************************************/
+
+using namespace osl;
+
+/******************************************************************************
+ *
+ * Exported Module Functions
+ *
+ *****************************************************************************/
+
+/* a slightly modified version of Pchar in rtl/source/uri.c */
+const sal_Bool uriCharClass[128] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Pchar but without encoding slashes */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* !"#$%&'()*+,-./ */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, /* 0123456789:;<=>? */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ABCDEFGHIJKLMNO */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* PQRSTUVWXYZ[\]^_ */
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* `abcdefghijklmno */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /* pqrstuvwxyz{|}~ */
+};
+
+
+/* check for top wrong usage strings */
+/*
+static sal_Bool findWrongUsage( const sal_Unicode *path, sal_Int32 len )
+{
+ rtl_uString *pTmp = NULL;
+ sal_Bool bRet;
+
+ rtl_uString_newFromStr_WithLength( &pTmp, path, len );
+
+ rtl_ustr_toAsciiLowerCase_WithLength( pTmp->buffer, pTmp->length );
+
+ bRet = ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "ftp://", 6 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "http://", 7 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "vnd.sun.star", 12 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "private:", 8 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "slot:", 5) );
+
+ rtl_uString_release( pTmp );
+ return bRet;
+}
+*/
+
+
+/****************************************************************************/
+/* osl_getFileURLFromSystemPath */
+/****************************************************************************/
+
+BOOL WINAPI IsValidFilePathComponent(
+ LPCTSTR lpComponent, LPCTSTR *lppComponentEnd, DWORD dwFlags)
+{
+ LPCTSTR lpComponentEnd = NULL;
+ LPCTSTR lpCurrent = lpComponent;
+ BOOL fValid = TRUE; /* Assume success */
+ TCHAR cLast = 0;
+
+ /* Path component length must not exceed MAX_PATH */
+
+ while ( !lpComponentEnd && lpCurrent && lpCurrent - lpComponent < _MAX_PATH )
+ {
+ switch ( *lpCurrent )
+ {
+ /* Both backslash and slash determine the end of a path component */
+ case '\0':
+ case '/':
+ case '\\':
+ switch ( cLast )
+ {
+ /* Component must not end with '.' or blank and can't be empty */
+
+ case '.':
+ if ( dwFlags & VALIDATEPATH_ALLOW_ELLIPSE )
+ {
+ if ( 1 == lpCurrent - lpComponent )
+ {
+ /* Current directory is O.K. */
+ lpComponentEnd = lpCurrent;
+ break;
+ }
+ else if ( 2 == lpCurrent - lpComponent && '.' == *lpComponent )
+ {
+ /* Parent directory is O.K. */
+ lpComponentEnd = lpCurrent;
+ break;
+ }
+ }
+ case 0:
+ case ' ':
+ lpComponentEnd = lpCurrent - 1;
+ fValid = FALSE;
+ break;
+ default:
+ lpComponentEnd = lpCurrent;
+ break;
+ }
+ break;
+ /* '?' and '*' are valid wildcards but not valid file name characters */
+ case '?':
+ case '*':
+ if ( dwFlags & VALIDATEPATH_ALLOW_WILDCARDS )
+ break;
+ /* The following characters are reserved */
+ case '<':
+ case '>':
+ case '\"':
+ case '|':
+ case ':':
+ lpComponentEnd = lpCurrent;
+ fValid = FALSE;
+ break;
+ default:
+ /* Characters below ASCII 32 are not allowed */
+ if ( *lpCurrent < ' ' )
+ {
+ lpComponentEnd = lpCurrent;
+ fValid = FALSE;
+ }
+ break;
+ }
+ cLast = *lpCurrent++;
+ }
+
+ /* If we don't reached the end of the component the length of the component was to long
+ ( See condition of while loop ) */
+ if ( !lpComponentEnd )
+ {
+ fValid = FALSE;
+ lpComponentEnd = lpCurrent;
+ }
+
+ /* Test wether the component specifies a device name what is not allowed */
+
+ // MT: PERFORMANCE:
+ // This is very expensive. A lot of calls to _tcsicmp.
+ // in SRC6870m71 67.000 calls of this method while empty office start result into more than 1.500.00 calls of _tcsicmp!
+ // Possible optimizations
+ // - Array should be const static
+ // - Sorted array, use binary search
+ // - More intelligent check for com1-9, lpt1-9
+ // Maybe make szComponent upper case, don't search case intensitive
+ // Talked to HRO: Could be removed. Shouldn't be used in OOo, and if used for something like a filename, it will lead to an error anyway.
+ /*
+ if ( fValid )
+ {
+ LPCTSTR alpDeviceNames[] =
+ {
+ TEXT("CON"),
+ TEXT("PRN"),
+ TEXT("AUX"),
+ TEXT("CLOCK$"),
+ TEXT("NUL"),
+ TEXT("LPT1"),
+ TEXT("LPT2"),
+ TEXT("LPT3"),
+ TEXT("LPT4"),
+ TEXT("LPT5"),
+ TEXT("LPT6"),
+ TEXT("LPT7"),
+ TEXT("LPT8"),
+ TEXT("LPT9"),
+ TEXT("COM1"),
+ TEXT("COM2"),
+ TEXT("COM3"),
+ TEXT("COM4"),
+ TEXT("COM5"),
+ TEXT("COM6"),
+ TEXT("COM7"),
+ TEXT("COM8"),
+ TEXT("COM9")
+ };
+
+ TCHAR szComponent[MAX_PATH];
+ int nComponentLength;
+ LPCTSTR lpDot;
+ int i;
+
+ // A device name with an extension is also invalid
+ lpDot = _tcschr( lpComponent, '.' );
+
+ if ( !lpDot || lpDot > lpComponentEnd )
+ nComponentLength = lpComponentEnd - lpComponent;
+ else
+ nComponentLength = lpDot - lpComponent;
+
+ _tcsncpy( szComponent, lpComponent, nComponentLength );
+ szComponent[nComponentLength] = 0;
+
+ for ( i = 0; i < sizeof( alpDeviceNames ) / sizeof(LPCTSTR); i++ )
+ {
+ if ( 0 == _tcsicmp( szComponent, alpDeviceNames[i] ) )
+ {
+ lpComponentEnd = lpComponent;
+ fValid = FALSE;
+ break;
+ }
+ }
+ }
+ */
+
+ if ( fValid )
+ {
+ // Empty components are not allowed
+ if ( lpComponentEnd - lpComponent < 1 )
+ fValid = FALSE;
+
+ // If we reached the end of the string NULL is returned
+ else if ( !*lpComponentEnd )
+ lpComponentEnd = NULL;
+
+ }
+
+ if ( lppComponentEnd )
+ *lppComponentEnd = lpComponentEnd;
+
+ return fValid;
+}
+
+//#####################################################
+DWORD WINAPI IsValidFilePath(LPCTSTR lpszPath, LPCTSTR *lppError, DWORD dwFlags)
+{
+ LPCTSTR lpComponent;
+ BOOL fValid = TRUE;
+ DWORD dwPathType = PATHTYPE_ERROR;
+
+ if ( dwFlags & VALIDATEPATH_ALLOW_RELATIVE )
+ dwFlags |= VALIDATEPATH_ALLOW_ELLIPSE;
+
+ if ( !lpszPath )
+ {
+ fValid = FALSE;
+ lpComponent = lpszPath;
+ }
+
+ /* Test for UNC path notation */
+ if ( 2 == _tcsspn( lpszPath, CHARSET_SEPARATOR ) )
+ {
+ /* Place the pointer behind the leading to backslashes */
+
+ lpComponent = lpszPath + 2;
+
+ fValid = IsValidFilePathComponent( lpComponent, &lpComponent, VALIDATEPATH_ALLOW_ELLIPSE );
+
+ /* So far we have a valid servername. Now let's see if we also have a network resource */
+
+ dwPathType = PATHTYPE_ABSOLUTE_UNC;
+
+ if ( fValid )
+ {
+ if ( lpComponent && !*++lpComponent )
+ lpComponent = NULL;
+
+ if ( !lpComponent )
+ {
+#if 0
+ /* We only have a Server specification what is invalid */
+
+ lpComponent = lpszPath;
+ fValid = FALSE;
+#else
+ dwPathType |= PATHTYPE_IS_SERVER;
+#endif
+ }
+ else
+ {
+ /* Now test the network resource */
+
+ fValid = IsValidFilePathComponent( lpComponent, &lpComponent, 0 );
+
+ /* If we now reached the end of the path, everything is O.K. */
+
+
+ if ( fValid && (!lpComponent || lpComponent && !*++lpComponent ) )
+ {
+ lpComponent = NULL;
+ dwPathType |= PATHTYPE_IS_VOLUME;
+ }
+ }
+ }
+ }
+
+ /* Local path verification. Must start with <drive>: */
+ else if ( _istalpha( lpszPath[0] ) && ':' == lpszPath[1] )
+ {
+ /* Place pointer behind correct drive specification */
+
+ lpComponent = lpszPath + 2;
+
+ if ( 1 == _tcsspn( lpComponent, CHARSET_SEPARATOR ) )
+ lpComponent++;
+ else if ( *lpComponent )
+ fValid = FALSE;
+
+ dwPathType = PATHTYPE_ABSOLUTE_LOCAL;
+
+ /* Now we are behind the backslash or it was a simple drive without backslash */
+
+ if ( fValid && !*lpComponent )
+ {
+ lpComponent = NULL;
+ dwPathType |= PATHTYPE_IS_VOLUME;
+ }
+ }
+
+ /* Can be a relative path */
+ else if ( dwFlags & VALIDATEPATH_ALLOW_RELATIVE )
+ {
+ lpComponent = lpszPath;
+
+ /* Relative path can start with a backslash */
+
+ if ( 1 == _tcsspn( lpComponent, CHARSET_SEPARATOR ) )
+ {
+ lpComponent++;
+ if ( !*lpComponent )
+ lpComponent = NULL;
+ }
+
+ dwPathType = PATHTYPE_RELATIVE;
+ }
+
+ /* Anything else is an error */
+ else
+ {
+ fValid = FALSE;
+ lpComponent = lpszPath;
+ }
+
+ /* Now validate each component of the path */
+ while ( fValid && lpComponent )
+ {
+ fValid = IsValidFilePathComponent( lpComponent, &lpComponent, dwFlags );
+
+ if ( fValid && lpComponent )
+ {
+ lpComponent++;
+
+ /* If the string behind the backslash is empty, we've done */
+
+ if ( !*lpComponent )
+ lpComponent = NULL;
+ }
+ }
+
+ if ( fValid && _tcslen( lpszPath ) >= _MAX_PATH )
+ {
+ fValid = FALSE;
+ lpComponent = lpszPath + _MAX_PATH;
+ }
+
+ if ( lppError )
+ *lppError = lpComponent;
+
+ return fValid ? dwPathType : PATHTYPE_ERROR;
+}
+
+sal_Bool _osl_decodeURL( rtl_String* strUTF8, rtl_uString** pstrDecodedURL )
+{
+ sal_Char *pBuffer;
+ const sal_Char *pSrcEnd;
+ const sal_Char *pSrc;
+ sal_Char *pDest;
+ sal_Int32 nSrcLen;
+ sal_Bool bValidEncoded = sal_True; /* Assume success */
+
+ /* The resulting decoded string length is shorter or equal to the source length */
+
+ nSrcLen = rtl_string_getLength(strUTF8);
+ pBuffer = reinterpret_cast<sal_Char*>(rtl_allocateMemory(nSrcLen + 1));
+
+ pDest = pBuffer;
+ pSrc = rtl_string_getStr(strUTF8);
+ pSrcEnd = pSrc + nSrcLen;
+
+ /* Now decode the URL what should result in an UTF8 string */
+ while ( bValidEncoded && pSrc < pSrcEnd )
+ {
+ switch ( *pSrc )
+ {
+ case '%':
+ {
+ sal_Char aToken[3];
+ sal_Char aChar;
+
+ pSrc++;
+ aToken[0] = *pSrc++;
+ aToken[1] = *pSrc++;
+ aToken[2] = 0;
+
+ aChar = (sal_Char)strtoul( aToken, NULL, 16 );
+
+ /* The chars are path delimiters and must not be encoded */
+
+ if ( 0 == aChar || '\\' == aChar || '/' == aChar || ':' == aChar )
+ bValidEncoded = sal_False;
+ else
+ *pDest++ = aChar;
+ }
+ break;
+ default:
+ *pDest++ = *pSrc++;
+ break;
+ }
+ }
+
+ *pDest++ = 0;
+
+ if ( bValidEncoded ) {
+ rtl_string2UString( pstrDecodedURL, pBuffer, rtl_str_getLength(pBuffer), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*pstrDecodedURL != 0);
+ }
+
+ rtl_freeMemory( pBuffer );
+
+ return bValidEncoded;
+}
+
+//#############################################
+void _osl_encodeURL( rtl_uString *strURL, rtl_String **pstrEncodedURL )
+{
+ /* Encode non ascii characters within the URL */
+
+ rtl_String *strUTF8 = NULL;
+ sal_Char *pszEncodedURL;
+ const sal_Char *pURLScan;
+ sal_Char *pURLDest;
+ sal_Int32 nURLScanLen;
+ sal_Int32 nURLScanCount;
+
+ rtl_uString2String( &strUTF8, rtl_uString_getStr( strURL ), rtl_uString_getLength( strURL ), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ pszEncodedURL = (sal_Char*) rtl_allocateMemory( (rtl_string_getLength( strUTF8 ) * 3 + 1) * sizeof(sal_Char) );
+
+ pURLDest = pszEncodedURL;
+ pURLScan = rtl_string_getStr( strUTF8 );
+ nURLScanLen = rtl_string_getLength( strUTF8 );
+ nURLScanCount = 0;
+
+ while ( nURLScanCount < nURLScanLen )
+ {
+ sal_Char cCurrent = *pURLScan;
+
+ switch ( cCurrent )
+ {
+ default:
+ if (!( ( cCurrent >= 'a' && cCurrent <= 'z' ) || ( cCurrent >= 'A' && cCurrent <= 'Z' ) || ( cCurrent >= '0' && cCurrent <= '9' ) ) )
+ {
+ sprintf( pURLDest, "%%%02X", (unsigned char)cCurrent );
+ pURLDest += 3;
+ break;
+ }
+ case '!':
+ case '\'':
+ case '(':
+ case ')':
+ case '*':
+ case '-':
+ case '.':
+ case '_':
+ case '~':
+ case '$':
+ case '&':
+ case '+':
+ case ',':
+ case '=':
+ case '@':
+ case ':':
+ case '/':
+ case '\\':
+ case '|':
+ *pURLDest++ = cCurrent;
+ break;
+ case 0:
+ break;
+ }
+
+ pURLScan++;
+ nURLScanCount++;
+ }
+
+
+ *pURLDest = 0;
+
+ rtl_string_release( strUTF8 );
+ rtl_string_newFromStr( pstrEncodedURL, pszEncodedURL );
+ rtl_freeMemory( pszEncodedURL );
+}
+
+//#############################################
+oslFileError SAL_CALL _osl_getFileURLFromSystemPath( rtl_uString* strPath, rtl_uString** pstrURL )
+{
+ oslFileError nError = osl_File_E_INVAL; /* Assume failure */
+ rtl_uString *strTempURL = NULL;
+ DWORD dwPathType = PATHTYPE_ERROR;
+
+ if (strPath)
+ dwPathType = IsValidFilePath(strPath->buffer, NULL, VALIDATEPATH_ALLOW_RELATIVE);
+
+ if (dwPathType)
+ {
+ rtl_uString *strTempPath = NULL;
+
+ /* Replace backslashes */
+
+ rtl_uString_newReplace( &strTempPath, strPath, '\\', '/' );
+
+ switch ( dwPathType & PATHTYPE_MASK_TYPE )
+ {
+ case PATHTYPE_RELATIVE:
+ rtl_uString_assign( &strTempURL, strTempPath );
+ nError = osl_File_E_None;
+ break;
+ case PATHTYPE_ABSOLUTE_UNC:
+ rtl_uString_newFromAscii( &strTempURL, "file:" );
+ rtl_uString_newConcat( &strTempURL, strTempURL, strTempPath );
+ nError = osl_File_E_None;
+ break;
+ case PATHTYPE_ABSOLUTE_LOCAL:
+ rtl_uString_newFromAscii( &strTempURL, "file:///" );
+ rtl_uString_newConcat( &strTempURL, strTempURL, strTempPath );
+ nError = osl_File_E_None;
+ break;
+ default:
+ break;
+ }
+
+ /* Release temp path */
+
+ rtl_uString_release( strTempPath );
+ }
+
+ if ( osl_File_E_None == nError )
+ {
+ rtl_String *strEncodedURL = NULL;
+
+ /* Encode the URL */
+
+ _osl_encodeURL( strTempURL, &strEncodedURL );
+
+ /* Provide URL via unicode string */
+
+ rtl_string2UString( pstrURL, rtl_string_getStr(strEncodedURL), rtl_string_getLength(strEncodedURL), RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*pstrURL != 0);
+ rtl_string_release( strEncodedURL );
+ }
+
+ /* Release temp URL */
+
+ if ( strTempURL )
+ rtl_uString_release( strTempURL );
+
+ /*
+ OSL_ENSURE_FILE( !nError, "osl_getFileURLFromSystemPath: \"%s\" is not a systemPath !!!", strPath );
+ */
+
+ return nError;
+}
+
+oslFileError SAL_CALL osl_getFileURLFromSystemPath( rtl_uString *ustrSystemPath, rtl_uString **pustrFileURL )
+{
+ return _osl_getFileURLFromSystemPath( ustrSystemPath, pustrFileURL );
+#if 0
+ static const sal_Unicode pDoubleSlash[2] = { '/', '/' };
+
+ rtl_uString *pTmp = NULL;
+ sal_Int32 nIndex;
+
+ if( 0 == ustrSystemPath->length )
+ return osl_File_E_INVAL;
+
+ /* YD convert '\' to '/' */
+ rtl_ustr_replaceChar( ustrSystemPath->buffer, '\\', '/' );
+
+ /* temporary hack: if already file url, return ustrSystemPath */
+ if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( ustrSystemPath->buffer, ustrSystemPath->length,"file:", 5 ) )
+ {
+ /*
+ if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( ustrSystemPath->buffer, ustrSystemPath->length,"file://", 7 ) )
+ {
+ OSL_ENSURE( 0, "osl_getFileURLFromSystemPath: input is already file URL" );
+ rtl_uString_assign( pustrFileURL, ustrSystemPath );
+ }
+ else
+ {
+ rtl_uString *pTmp2 = NULL;
+
+ OSL_ENSURE( 0, "osl_getFileURLFromSystemPath: input is wrong file URL" );
+ rtl_uString_newFromStr_WithLength( pustrFileURL, ustrSystemPath->buffer + 5, ustrSystemPath->length - 5 );
+ rtl_uString_newFromAscii( &pTmp2, "file://" );
+ rtl_uString_newConcat( pustrFileURL, *pustrFileURL, pTmp2 );
+ rtl_uString_release( pTmp2 );
+ }
+ return osl_File_E_None;
+ */
+ return osl_File_E_INVAL;
+ }
+
+
+ /* check if system path starts with ~ or ~user and replace it with the appropriate home dir */
+ if( (sal_Unicode) '~' == ustrSystemPath->buffer[0] )
+ {
+ /* check if another user is specified */
+ if( ( 1 == ustrSystemPath->length ) || ( (sal_Unicode)'/' == ustrSystemPath->buffer[1] ) )
+ {
+ /* osl_getHomeDir returns file URL */
+ osl_getHomeDir( osl_getCurrentSecurity(), &pTmp );
+
+ /* remove "file://" prefix */
+ rtl_uString_newFromStr_WithLength( &pTmp, pTmp->buffer + 7, pTmp->length - 7 );
+
+ /* replace '~' in original string */
+ rtl_uString_newReplaceStrAt( &pTmp, ustrSystemPath, 0, 1, pTmp );
+ }
+
+ else
+ {
+ /* FIXME: replace ~user with users home directory */
+ return osl_File_E_INVAL;
+ }
+ }
+
+ /* check if initial string contains double instances of '/' */
+ nIndex = rtl_ustr_indexOfStr_WithLength( ustrSystemPath->buffer, ustrSystemPath->length, pDoubleSlash, 2 );
+ if( -1 != nIndex )
+ {
+ sal_Int32 nSrcIndex;
+ sal_Int32 nDeleted = 0;
+
+ /* if pTmp is not already allocated, copy ustrSystemPath for modification */
+ if( NULL == pTmp )
+ rtl_uString_newFromString( &pTmp, ustrSystemPath );
+
+ /* adapt index to pTmp */
+ nIndex += pTmp->length - ustrSystemPath->length;
+
+ /* remove all occurances of '//' */
+ for( nSrcIndex = nIndex + 1; nSrcIndex < pTmp->length; nSrcIndex++ )
+ {
+ if( ((sal_Unicode) '/' == pTmp->buffer[nSrcIndex]) && ((sal_Unicode) '/' == pTmp->buffer[nIndex]) )
+ nDeleted++;
+ else
+ pTmp->buffer[++nIndex] = pTmp->buffer[nSrcIndex];
+ }
+
+ /* adjust length member */
+ pTmp->length -= nDeleted;
+ }
+
+ if( NULL == pTmp )
+ rtl_uString_assign( &pTmp, ustrSystemPath );
+
+ /* temporary check for top 5 wrong usage strings (which are valid but unlikly filenames) */
+ /*
+ OSL_ASSERT( !findWrongUsage( pTmp->buffer, pTmp->length ) );
+ */
+
+ /* file URLs must be URI encoded */
+ rtl_uriEncode( pTmp, uriCharClass, rtl_UriEncodeIgnoreEscapes, RTL_TEXTENCODING_UTF8, pustrFileURL );
+
+ rtl_uString_release( pTmp );
+
+ /* absolute urls should start with 'file://' */
+ if( (sal_Unicode)'/' == (*pustrFileURL)->buffer[0] )
+ {
+ rtl_uString *pProtocol = NULL;
+
+ rtl_uString_newFromAscii( &pProtocol, "file://" );
+ rtl_uString_newConcat( pustrFileURL, pProtocol, *pustrFileURL );
+ rtl_uString_release( pProtocol );
+ }
+
+ return osl_File_E_None;
+#endif
+}
+
+//#############################################
+oslFileError SAL_CALL _osl_getSystemPathFromFileURL( rtl_uString *strURL, rtl_uString **pustrPath, sal_Bool bAllowRelative )
+{
+ rtl_String *strUTF8 = NULL;
+ rtl_uString *strDecodedURL = NULL;
+ rtl_uString *strTempPath = NULL;
+ const sal_Unicode *pDecodedURL;
+ sal_uInt32 nDecodedLen;
+ sal_Bool bValidEncoded;
+ oslFileError nError = osl_File_E_INVAL; /* Assume failure */
+
+ /* If someone hasn't encoded the complete URL we convert it to UTF8 now to prevent from
+ having a mixed encoded URL later */
+
+ rtl_uString2String( &strUTF8, rtl_uString_getStr( strURL ), rtl_uString_getLength( strURL ), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ /* If the length of strUTF8 and strURL differs it indicates that the URL was not correct encoded */
+
+ OSL_ENSURE_FILE(
+ strUTF8->length == strURL->length ||
+ 0 != rtl_ustr_ascii_shortenedCompare_WithLength( strURL->buffer, strURL->length, "file:\\\\", 7 )
+ ,"osl_getSystemPathFromFileURL: \"%s\" is not encoded !!!", strURL );
+
+ bValidEncoded = _osl_decodeURL( strUTF8, &strDecodedURL );
+
+ /* Release the encoded UTF8 string */
+
+ rtl_string_release( strUTF8 );
+
+
+ if ( bValidEncoded )
+ {
+ /* Replace backslashes and pipes */
+
+ rtl_uString_newReplace( &strDecodedURL, strDecodedURL, '/', '\\' );
+ rtl_uString_newReplace( &strDecodedURL, strDecodedURL, '|', ':' );
+
+ pDecodedURL = rtl_uString_getStr( strDecodedURL );
+ nDecodedLen = rtl_uString_getLength( strDecodedURL );
+
+ /* Must start with "file://" */
+
+ if ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pDecodedURL, nDecodedLen, "file:\\\\", 7 ) )
+ {
+ sal_uInt32 nSkip;
+
+ if ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pDecodedURL, nDecodedLen, "file:\\\\\\", 8 ) )
+ nSkip = 8;
+ else if (
+ 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pDecodedURL, nDecodedLen, "file:\\\\localhost\\", 17 ) ||
+ 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pDecodedURL, nDecodedLen, "file:\\\\127.0.0.1\\", 17 )
+ )
+ nSkip = 17;
+ else
+ nSkip = 5;
+
+ /* Indicates local root */
+ if ( nDecodedLen == nSkip )
+ rtl_uString_newFromStr_WithLength( &strTempPath, (const sal_Unicode*)WSTR_SYSTEM_ROOT_PATH, ELEMENTS_OF_ARRAY(WSTR_SYSTEM_ROOT_PATH) - 1 );
+ else
+ rtl_uString_newFromStr_WithLength( &strTempPath, pDecodedURL + nSkip, nDecodedLen - nSkip );
+
+ if ( IsValidFilePath( strTempPath->buffer, NULL, VALIDATEPATH_ALLOW_ELLIPSE ) )
+ nError = osl_File_E_None;
+ }
+ else if ( bAllowRelative ) /* This maybe a relative file URL */
+ {
+ rtl_uString_assign( &strTempPath, strDecodedURL );
+
+ if ( IsValidFilePath( strTempPath->buffer, NULL, VALIDATEPATH_ALLOW_RELATIVE | VALIDATEPATH_ALLOW_ELLIPSE ) )
+ nError = osl_File_E_None;
+ }
+ /*
+ else
+ OSL_ENSURE_FILE( !nError, "osl_getSystemPathFromFileURL: \"%s\" is not an absolute FileURL !!!", strURL );
+ */
+
+ }
+
+ if ( strDecodedURL )
+ rtl_uString_release( strDecodedURL );
+
+ if ( osl_File_E_None == nError )
+ rtl_uString_assign( pustrPath, strTempPath );
+
+ if ( strTempPath )
+ rtl_uString_release( strTempPath );
+
+ /*
+ OSL_ENSURE_FILE( !nError, "osl_getSystemPathFromFileURL: \"%s\" is not a FileURL !!!", strURL );
+ */
+
+ return nError;
+}
+
+/****************************************************************************/
+/* osl_getSystemPathFromFileURL */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_getSystemPathFromFileURL( rtl_uString *ustrFileURL, rtl_uString **pustrSystemPath )
+{
+ return _osl_getSystemPathFromFileURL( ustrFileURL, pustrSystemPath, sal_True );
+#if 0
+ sal_Int32 nIndex = 0;
+ rtl_uString * pTmp = NULL;
+
+ sal_Unicode encodedSlash[3] = { '%', '2', 'F' };
+
+ /* temporary hack: if already system path, return ustrFileURL */
+ /*
+ if( (sal_Unicode) '/' == ustrFileURL->buffer[0] )
+ {
+ OSL_ENSURE( 0, "osl_getSystemPathFromFileURL: input is already system path" );
+ rtl_uString_assign( pustrSystemPath, ustrFileURL );
+ return osl_File_E_None;
+ }
+ */
+
+ /* a valid file url may not start with '/' */
+ if( ( 0 == ustrFileURL->length ) || ( (sal_Unicode) '/' == ustrFileURL->buffer[0] ) )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ /* search for encoded slashes (%2F) and decode every single token if we find one */
+ if( -1 != rtl_ustr_indexOfStr_WithLength( ustrFileURL->buffer, ustrFileURL->length, encodedSlash, 3 ) )
+ {
+ rtl_uString * ustrPathToken = NULL;
+ sal_Int32 nOffset = 7;
+
+ do
+ {
+ nOffset += nIndex;
+
+ /* break url down in '/' devided tokens tokens */
+ nIndex = rtl_ustr_indexOfChar_WithLength( ustrFileURL->buffer + nOffset, ustrFileURL->length - nOffset, (sal_Unicode) '/' );
+
+ /* copy token to new string */
+ rtl_uString_newFromStr_WithLength( &ustrPathToken, ustrFileURL->buffer + nOffset,
+ -1 == nIndex ? ustrFileURL->length - nOffset : nIndex++ );
+
+ /* decode token */
+ rtl_uriDecode( ustrPathToken, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8, &pTmp );
+
+ /* the result should not contain any '/' */
+ if( -1 != rtl_ustr_indexOfChar_WithLength( pTmp->buffer, pTmp->length, (sal_Unicode) '/' ) )
+ {
+ rtl_uString_release( pTmp );
+ rtl_uString_release( ustrPathToken );
+
+ return osl_File_E_INVAL;
+ }
+
+ } while( -1 != nIndex );
+
+ /* release temporary string and restore index variable */
+ rtl_uString_release( ustrPathToken );
+ nIndex = 0;
+ }
+
+ /* protocol and server should not be encoded, so decode the whole string */
+ rtl_uriDecode( ustrFileURL, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8, &pTmp );
+
+ /* check if file protocol specified */
+ /* FIXME: use rtl_ustr_ascii_shortenedCompareIgnoreCase_WithLength when available */
+ if( 7 <= pTmp->length )
+ {
+ rtl_uString * pProtocol = NULL;
+ rtl_uString_newFromStr_WithLength( &pProtocol, pTmp->buffer, 7 );
+
+ /* protocol is case insensitive */
+ rtl_ustr_toAsciiLowerCase_WithLength( pProtocol->buffer, pProtocol->length );
+
+ if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pProtocol->buffer, pProtocol->length,"file://", 7 ) )
+ nIndex = 7;
+
+ rtl_uString_release( pProtocol );
+ }
+
+ /* skip "localhost" or "127.0.0.1" if "file://" is specified */
+ /* FIXME: use rtl_ustr_ascii_shortenedCompareIgnoreCase_WithLength when available */
+ if( nIndex && ( 10 <= pTmp->length - nIndex ) )
+ {
+ rtl_uString * pServer = NULL;
+ rtl_uString_newFromStr_WithLength( &pServer, pTmp->buffer + nIndex, 10 );
+
+ /* server is case insensitive */
+ rtl_ustr_toAsciiLowerCase_WithLength( pServer->buffer, pServer->length );
+
+ if( ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pServer->buffer, pServer->length,"localhost/", 10 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pServer->buffer, pServer->length,"127.0.0.1/", 10 ) ) )
+ {
+ /* don't exclude the '/' */
+ nIndex += 9;
+ }
+
+ rtl_uString_release( pServer );
+ }
+
+ if( nIndex )
+ rtl_uString_newFromStr_WithLength( &pTmp, pTmp->buffer + nIndex, pTmp->length - nIndex );
+
+ /* check if system path starts with ~ or ~user and replace it with the appropriate home dir */
+ if( (sal_Unicode) '~' == pTmp->buffer[0] )
+ {
+ /* check if another user is specified */
+ if( ( 1 == pTmp->length ) || ( (sal_Unicode)'/' == pTmp->buffer[1] ) )
+ {
+ rtl_uString *pTmp2 = NULL;
+
+ /* osl_getHomeDir returns file URL */
+ osl_getHomeDir( osl_getCurrentSecurity(), &pTmp2 );
+
+ /* remove "file://" prefix */
+ rtl_uString_newFromStr_WithLength( &pTmp2, pTmp2->buffer + 7, pTmp2->length - 7 );
+
+ /* replace '~' in original string */
+ rtl_uString_newReplaceStrAt( &pTmp, pTmp, 0, 1, pTmp2 );
+ rtl_uString_release( pTmp2 );
+ }
+
+ else
+ {
+ /* FIXME: replace ~user with users home directory */
+ return osl_File_E_INVAL;
+ }
+ }
+
+ /* temporary check for top 5 wrong usage strings (which are valid but unlikly filenames) */
+ /*
+ OSL_ASSERT( !findWrongUsage( pTmp->buffer, pTmp->length ) );
+ */
+
+ *pustrSystemPath = pTmp;
+ return osl_File_E_None;
+#endif // 0
+}
+
+
+/****************************************************************************
+ * osl_getSystemPathFromFileURL_Ex - helper function
+ * clients may specify if they want to accept relative
+ * URLs or not
+ ****************************************************************************/
+
+oslFileError osl_getSystemPathFromFileURL_Ex(
+ rtl_uString *ustrFileURL, rtl_uString **pustrSystemPath, sal_Bool bAllowRelative)
+{
+ return _osl_getSystemPathFromFileURL( ustrFileURL, pustrSystemPath, bAllowRelative);
+#if 0
+ rtl_uString* temp = 0;
+ oslFileError osl_error = osl_getSystemPathFromFileURL(ustrFileURL, &temp);
+
+ if (osl_File_E_None == osl_error)
+ {
+ if (bAllowRelative
+ || (UNICHAR_SLASH == temp->buffer[0])
+ || (UNICHAR_COLON == temp->buffer[1] && UNICHAR_SLASH == temp->buffer[2]))
+ {
+ *pustrSystemPath = temp;
+ }
+ else
+ {
+ rtl_uString_release(temp);
+ osl_error = osl_File_E_INVAL;
+ }
+ }
+
+ return osl_error;
+#endif
+}
+
+namespace /* private */
+{
+
+#if 0 // YD
+
+ /******************************************************
+ * Helper function, return a pinter to the final '\0'
+ * of a string
+ ******************************************************/
+
+ sal_Unicode* ustrtoend(sal_Unicode* pStr)
+ {
+ return (pStr + rtl_ustr_getLength(pStr));
+ }
+
+ /*********************************************
+
+ ********************************************/
+ sal_Unicode* ustrcpy(const sal_Unicode* s, sal_Unicode* d)
+ {
+ const sal_Unicode* sc = s;
+ sal_Unicode* dc = d;
+
+ while ((*dc++ = *sc++))
+ /**/;
+
+ return d;
+ }
+
+ /*********************************************
+
+ ********************************************/
+
+ sal_Unicode* ustrncpy(const sal_Unicode* s, sal_Unicode* d, unsigned int n)
+ {
+ const sal_Unicode* sc = s;
+ sal_Unicode* dc = d;
+ unsigned int i = n;
+
+ while (i--)
+ *dc++ = *sc++;
+
+ if (n)
+ *dc = 0;
+
+ return d;
+ }
+
+ /*********************************************
+
+ ********************************************/
+
+ sal_Unicode* ustrchrcat(const sal_Unicode chr, sal_Unicode* d)
+ {
+ sal_Unicode* p = ustrtoend(d);
+ *p++ = chr;
+ *p = 0;
+ return d;
+ }
+
+ /*********************************************
+
+ ********************************************/
+
+ sal_Unicode* ustrcat(const sal_Unicode* s, sal_Unicode* d)
+ {
+ sal_Unicode* dc = ustrtoend(d);
+ ustrcpy(s, dc);
+ return d;
+ }
+
+ /******************************************************
+ *
+ ******************************************************/
+
+ bool _islastchr(sal_Unicode* pStr, sal_Unicode Chr)
+ {
+ sal_Unicode* p = ustrtoend(pStr);
+ if (p > pStr)
+ p--;
+ return (*p == Chr);
+ }
+
+ /******************************************************
+ * Ensure that the given string has the specified last
+ * character if necessary append it
+ ******************************************************/
+
+ sal_Unicode* _strensurelast(sal_Unicode* pStr, sal_Unicode Chr)
+ {
+ if (!_islastchr(pStr, Chr))
+ ustrchrcat(Chr, pStr);
+ return pStr;
+ }
+
+ /******************************************************
+ * Remove the last part of a path, a path that has
+ * only a '/' or no '/' at all will be returned
+ * unmodified
+ ******************************************************/
+
+ sal_Unicode* _rmlastpathtoken(sal_Unicode* aPath)
+ {
+ /* we always may skip -2 because we
+ may at least stand on a '/' but
+ either there is no other character
+ before this '/' or it's another
+ character than the '/'
+ */
+ sal_Unicode* p = ustrtoend(aPath) - 2;
+
+ // move back to the next path separator
+ // or to the start of the string
+ while ((p > aPath) && (*p != UNICHAR_SLASH))
+ p--;
+
+ if (p >= aPath)
+ {
+ if (UNICHAR_SLASH == *p)
+ {
+ p++;
+ *p = '\0';
+ }
+ else
+ {
+ *p = '\0';
+ }
+ }
+
+ return aPath;
+ }
+
+ /******************************************************
+ *
+ ******************************************************/
+
+ oslFileError _osl_resolvepath(
+ /*inout*/ sal_Unicode* path,
+ /*inout*/ sal_Unicode* current_pos,
+ /*in */ sal_Unicode* sentinel,
+ /*inout*/ bool* failed)
+ {
+ oslFileError ferr = osl_File_E_None;
+
+ if (!*failed)
+ {
+ char unresolved_path[PATH_MAX];
+ if (!UnicodeToText(unresolved_path, sizeof(unresolved_path), path, rtl_ustr_getLength(path)))
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ char resolved_path[PATH_MAX];
+ if (realpath(unresolved_path, resolved_path))
+ {
+ if (!TextToUnicode(resolved_path, strlen(resolved_path), path, PATH_MAX))
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ current_pos = ustrtoend(path) - 1;
+ }
+ else
+ {
+ if (EACCES == errno || ENOTDIR == errno || ENOENT == errno)
+ *failed = true;
+ else
+ ferr = oslTranslateFileError(OSL_FET_ERROR, errno);
+ }
+ }
+
+ return ferr;
+ }
+
+ /******************************************************
+ * Works even with non existing paths. The resulting
+ * path must not exceed PATH_MAX else
+ * osl_File_E_NAMETOOLONG is the result
+ ******************************************************/
+
+ oslFileError osl_getAbsoluteFileURL_impl_(const rtl::OUString& unresolved_path, rtl::OUString& resolved_path)
+ {
+ // the given unresolved path must not exceed PATH_MAX
+ if (unresolved_path.getLength() >= (PATH_MAX - 2))
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ sal_Unicode path_resolved_so_far[PATH_MAX];
+ const sal_Unicode* punresolved = unresolved_path.getStr();
+ sal_Unicode* presolvedsf = path_resolved_so_far;
+
+ // reserve space for leading '/' and trailing '\0'
+ // do not exceed this limit
+ sal_Unicode* sentinel = path_resolved_so_far + PATH_MAX - 2;
+
+ // if realpath fails with error ENOTDIR, EACCES or ENOENT
+ // we will not call it again, because _osl_realpath should also
+ // work with non existing directories etc.
+ bool realpath_failed = false;
+ oslFileError ferr;
+
+ path_resolved_so_far[0] = '\0';
+
+ while (*punresolved != '\0')
+ {
+ // ignore '/.' , skip one part back when '/..'
+
+ if ((UNICHAR_DOT == *punresolved) && (UNICHAR_SLASH == *presolvedsf))
+ {
+ if ('\0' == *(punresolved + 1))
+ {
+ punresolved++;
+ continue;
+ }
+ else if (UNICHAR_SLASH == *(punresolved + 1))
+ {
+ punresolved += 2;
+ continue;
+ }
+ else if ((UNICHAR_DOT == *(punresolved + 1)) && ('\0' == *(punresolved + 2) || (UNICHAR_SLASH == *(punresolved + 2))))
+ {
+ _rmlastpathtoken(path_resolved_so_far);
+
+ presolvedsf = ustrtoend(path_resolved_so_far) - 1;
+
+ if (UNICHAR_SLASH == *(punresolved + 2))
+ punresolved += 3;
+ else
+ punresolved += 2;
+
+ continue;
+ }
+ else // a file or directory name may start with '.'
+ {
+ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel)
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ ustrchrcat(*punresolved++, path_resolved_so_far);
+
+ if ('\0' == *punresolved && !realpath_failed)
+ {
+ ferr = _osl_resolvepath(
+ path_resolved_so_far,
+ presolvedsf,
+ sentinel,
+ &realpath_failed);
+
+ if (osl_File_E_None != ferr)
+ return ferr;
+ }
+ }
+ }
+ else if (UNICHAR_SLASH == *punresolved)
+ {
+ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel)
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ ustrchrcat(*punresolved++, path_resolved_so_far);
+
+ if (!realpath_failed)
+ {
+ ferr = _osl_resolvepath(
+ path_resolved_so_far,
+ presolvedsf,
+ sentinel,
+ &realpath_failed);
+
+ if (osl_File_E_None != ferr)
+ return ferr;
+
+ if (!_islastchr(path_resolved_so_far, UNICHAR_SLASH))
+ {
+ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel)
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ ustrchrcat(UNICHAR_SLASH, path_resolved_so_far);
+ }
+ }
+ }
+ else // any other character
+ {
+ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel)
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ ustrchrcat(*punresolved++, path_resolved_so_far);
+
+ if ('\0' == *punresolved && !realpath_failed)
+ {
+ ferr = _osl_resolvepath(
+ path_resolved_so_far,
+ presolvedsf,
+ sentinel,
+ &realpath_failed);
+
+ if (osl_File_E_None != ferr)
+ return ferr;
+ }
+ }
+ }
+
+ sal_Int32 len = rtl_ustr_getLength(path_resolved_so_far);
+
+ OSL_ASSERT(len < PATH_MAX);
+
+ resolved_path = rtl::OUString(path_resolved_so_far, len);
+
+ return osl_File_E_None;
+ }
+
+#endif // 0 // YD
+
+} // end namespace private
+
+#if OSL_DEBUG_LEVEL > 0
+
+ //#####################################################
+ void _osl_warnFile( const char *message, rtl_uString *ustrFile )
+ {
+ char szBuffer[2048];
+
+ if (ustrFile)
+ {
+ rtl_String *strFile = NULL;
+
+ rtl_uString2String( &strFile, rtl_uString_getStr( ustrFile ), rtl_uString_getLength( ustrFile ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ snprintf( szBuffer, sizeof(szBuffer), message, strFile->buffer );
+ rtl_string_release( strFile );
+
+ message = szBuffer;
+ }
+ OSL_ENSURE( 0, message );
+ }
+
+#endif // OSL_DEBUG_LEVEL > 0
+
+/******************************************************
+ * osl_getAbsoluteFileURL
+ ******************************************************/
+
+//oslFileError osl_getAbsoluteFileURL(rtl_uString* ustrBaseDirURL, rtl_uString* ustrRelativeURL, rtl_uString** pustrAbsoluteURL)
+oslFileError SAL_CALL osl_getAbsoluteFileURL( rtl_uString* ustrBaseURL, rtl_uString* ustrRelativeURL, rtl_uString** pustrAbsoluteURL )
+{
+ oslFileError eError;
+ rtl_uString *ustrRelSysPath = NULL;
+ rtl_uString *ustrBaseSysPath = NULL;
+
+ if ( ustrBaseURL && ustrBaseURL->length )
+ {
+ eError = _osl_getSystemPathFromFileURL( ustrBaseURL, &ustrBaseSysPath, sal_False );
+ OSL_ENSURE( osl_File_E_None == eError, "osl_getAbsoluteFileURL called with relative or invalid base URL" );
+
+ eError = _osl_getSystemPathFromFileURL( ustrRelativeURL, &ustrRelSysPath, sal_True );
+ }
+ else
+ {
+ eError = _osl_getSystemPathFromFileURL( ustrRelativeURL, &ustrRelSysPath, sal_False );
+ OSL_ENSURE( osl_File_E_None == eError, "osl_getAbsoluteFileURL called with empty base URL and/or invalid relative URL" );
+ }
+
+ if ( !eError )
+ {
+ CHAR szBuffer[_MAX_PATH];
+ CHAR szRelSysPath[_MAX_PATH];
+ CHAR szCurrentDir[_MAX_PATH];
+ int result;
+ char* cwd;
+ int rc;
+
+/*@@@ToDo
+ Bad, bad hack, this only works if the base path
+ really exists which is not necessary according
+ to RFC2396
+ The whole FileURL implementation should be merged
+ with the rtl/uri class.
+*/
+ if ( ustrBaseSysPath )
+ {
+ CHAR szBaseSysPath[_MAX_PATH];
+
+ if (!g_CurrentDirectoryMutex)
+ g_CurrentDirectoryMutex = osl_createMutex();
+
+ osl_acquireMutex( g_CurrentDirectoryMutex );
+
+ cwd = getcwd( szCurrentDir, sizeof(szCurrentDir) );
+ UnicodeToText( szBaseSysPath, sizeof(szBaseSysPath), ustrBaseSysPath->buffer, ustrBaseSysPath->length);
+ rc = chdir( szBaseSysPath);
+ }
+
+ UnicodeToText( szRelSysPath, sizeof(szRelSysPath), ustrRelSysPath->buffer, ustrRelSysPath->length);
+ result = !_abspath( szBuffer, szRelSysPath, sizeof(szBuffer));
+
+ if ( ustrBaseSysPath )
+ {
+ rc = chdir( szCurrentDir );
+
+ osl_releaseMutex( g_CurrentDirectoryMutex );
+ }
+
+ if ( result )
+ {
+ rtl_uString *ustrAbsSysPath = NULL;
+
+ oslMakeUStrFromPsz( szBuffer, &ustrAbsSysPath);
+
+ eError = osl_getFileURLFromSystemPath( ustrAbsSysPath, pustrAbsoluteURL );
+
+ if ( ustrAbsSysPath )
+ rtl_uString_release( ustrAbsSysPath );
+ }
+ else
+ eError = osl_File_E_INVAL;
+ }
+
+ if ( ustrBaseSysPath )
+ rtl_uString_release( ustrBaseSysPath );
+
+ if ( ustrRelSysPath )
+ rtl_uString_release( ustrRelSysPath );
+
+ return eError;
+#if 0
+ FileBase::RC rc;
+ rtl::OUString unresolved_path;
+
+ rc = FileBase::getSystemPathFromFileURL(rtl::OUString(ustrRelativeURL), unresolved_path);
+
+ if(FileBase::E_None != rc)
+ return oslFileError(rc);
+
+ if (systemPathIsRelativePath(unresolved_path))
+ {
+ rtl::OUString base_path;
+ rc = (FileBase::RC) osl_getSystemPathFromFileURL_Ex(ustrBaseDirURL, &base_path.pData, sal_False);
+
+ if (FileBase::E_None != rc)
+ return oslFileError(rc);
+
+ rtl::OUString abs_path;
+ systemPathMakeAbsolutePath(base_path, unresolved_path, abs_path);
+
+ unresolved_path = abs_path;
+ }
+
+ rtl::OUString resolved_path;
+ rc = (FileBase::RC) osl_getAbsoluteFileURL_impl_(unresolved_path, resolved_path);
+
+ if (FileBase::E_None == rc)
+ {
+ rc = (FileBase::RC) osl_getFileURLFromSystemPath(resolved_path.pData, pustrAbsoluteURL);
+ OSL_ASSERT(FileBase::E_None == rc);
+ }
+
+ return oslFileError(rc);
+#endif // 0
+}
+
+
+namespace /* private */
+{
+
+ /*********************************************
+ No separate error code if unicode to text
+ conversion or getenv fails because for the
+ caller there is no difference why a file
+ could not be found in $PATH
+ ********************************************/
+
+ bool find_in_PATH(const rtl::OUString& file_path, rtl::OUString& result)
+ {
+ bool bfound = false;
+ rtl::OUString path = rtl::OUString::createFromAscii("PATH");
+ rtl::OUString env_path;
+
+ if (osl_Process_E_None == osl_getEnvironment(path.pData, &env_path.pData))
+ bfound = osl::searchPath(file_path, env_path, result);
+
+ return bfound;
+ }
+
+ /*********************************************
+ No separate error code if unicode to text
+ conversion or getcwd fails because for the
+ caller there is no difference why a file
+ could not be found in CDW
+ ********************************************/
+
+ bool find_in_CWD(const rtl::OUString& file_path, rtl::OUString& result)
+ {
+ bool bfound = false;
+ rtl::OUString cwd_url;
+
+ if (osl_Process_E_None == osl_getProcessWorkingDir(&cwd_url.pData))
+ {
+ rtl::OUString cwd;
+ FileBase::getSystemPathFromFileURL(cwd_url, cwd);
+ bfound = osl::searchPath(file_path, cwd, result);
+ }
+ return bfound;
+ }
+
+ /*********************************************
+
+ ********************************************/
+
+ bool find_in_searchPath(const rtl::OUString& file_path, rtl_uString* search_path, rtl::OUString& result)
+ {
+ return (search_path && osl::searchPath(file_path, rtl::OUString(search_path), result));
+ }
+
+} // end namespace private
+
+
+/****************************************************************************
+ * osl_searchFileURL
+ ***************************************************************************/
+
+oslFileError osl_searchFileURL(rtl_uString* ustrFilePath, rtl_uString* ustrSearchPath, rtl_uString** pustrURL)
+{
+ OSL_PRECOND(ustrFilePath && pustrURL, "osl_searchFileURL: invalid parameter");
+
+ FileBase::RC rc;
+ rtl::OUString file_path;
+
+ // try to interpret search path as file url else assume it's a system path list
+ rc = FileBase::getSystemPathFromFileURL(rtl::OUString(ustrFilePath), file_path);
+ if ((FileBase::E_None != rc) && (FileBase::E_INVAL == rc))
+ file_path = ustrFilePath;
+ else if (FileBase::E_None != rc)
+ return oslFileError(rc);
+
+ bool bfound = false;
+ rtl::OUString result;
+
+ if (find_in_searchPath(file_path, ustrSearchPath, result) ||
+ find_in_PATH(file_path, result) ||
+ find_in_CWD(file_path, result))
+ {
+ rtl::OUString resolved;
+
+ if (osl::realpath(result, resolved))
+ {
+#if OSL_DEBUG_LEVEL > 0
+ oslFileError osl_error =
+#endif
+ osl_getFileURLFromSystemPath(resolved.pData, pustrURL);
+ OSL_ASSERT(osl_File_E_None == osl_error);
+ bfound = true;
+ }
+ }
+ return bfound ? osl_File_E_None : osl_File_E_NOENT;
+}
+
+
+/****************************************************************************
+ * FileURLToPath
+ ***************************************************************************/
+
+oslFileError FileURLToPath(char * buffer, size_t bufLen, rtl_uString* ustrFileURL)
+{
+ rtl_uString* ustrSystemPath = NULL;
+ oslFileError osl_error = osl_getSystemPathFromFileURL(ustrFileURL, &ustrSystemPath);
+
+ if(osl_File_E_None != osl_error)
+ return osl_error;
+
+ osl_systemPathRemoveSeparator(ustrSystemPath);
+
+ /* convert unicode path to text */
+ if(!UnicodeToText( buffer, bufLen, ustrSystemPath->buffer, ustrSystemPath->length))
+ osl_error = oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ rtl_uString_release(ustrSystemPath);
+
+ return osl_error;
+}
diff --git a/sal/osl/os2/file_url.h b/sal/osl/os2/file_url.h
new file mode 100644
index 000000000000..052858503b24
--- /dev/null
+++ b/sal/osl/os2/file_url.h
@@ -0,0 +1,183 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ /***************************************************
+ * Internal header file, declares all functions
+ * that are not part of the offical API and are
+ * not defined in the osl header files
+ **************************************************/
+
+ #ifndef _FILE_URL_H_
+ #define _FILE_URL_H_
+
+ #ifndef _FILE_H_
+ #include <osl/file.h>
+ #endif
+
+
+/***************************************************
+ * constants
+ **************************************************/
+
+#define _tcslen(a) wcslen((const wchar_t *) a)
+#define _tcsspn(a,b) wcsspn((const wchar_t *) a, (const wchar_t *) b)
+#define _istalpha(a) iswalpha((wint_t) a)
+
+const sal_Unicode UNICHAR_SLASH = ((sal_Unicode)'/');
+const sal_Unicode UNICHAR_COLON = ((sal_Unicode)':');
+const sal_Unicode UNICHAR_DOT = ((sal_Unicode)'.');
+
+#define ELEMENTS_OF_ARRAY(arr) (sizeof(arr)/(sizeof((arr)[0])))
+
+#if OSL_DEBUG_LEVEL > 0
+#define OSL_ENSURE_FILE( cond, msg, file ) ( (cond) ? (void)0 : _osl_warnFile( msg, file ) )
+#else
+#define OSL_ENSURE_FILE( cond, msg, file ) ((void)0)
+#endif
+
+typedef sal_Unicode TCHAR;
+typedef sal_Unicode *LPTSTR;
+typedef const sal_Unicode *LPCTSTR;
+typedef wchar_t *LPWSTR;
+typedef const wchar_t *LPCWSTR;
+typedef sal_Unicode DWORD;
+#define WINAPI
+
+#define CHARSET_SEPARATOR L"\\/"
+#define WSTR_SYSTEM_ROOT_PATH L"\\\\.\\"
+
+
+/******************************************************************************
+ *
+ * Data Type Definition
+ *
+ ******************************************************************************/
+
+#define PATHTYPE_ERROR 0
+#define PATHTYPE_RELATIVE 1
+#define PATHTYPE_ABSOLUTE_UNC 2
+#define PATHTYPE_ABSOLUTE_LOCAL 3
+#define PATHTYPE_MASK_TYPE 0xFF
+#define PATHTYPE_IS_VOLUME 0x0100
+#define PATHTYPE_IS_SERVER 0x0200
+
+#define VALIDATEPATH_NORMAL 0x0000
+#define VALIDATEPATH_ALLOW_WILDCARDS 0x0001
+#define VALIDATEPATH_ALLOW_ELLIPSE 0x0002
+#define VALIDATEPATH_ALLOW_RELATIVE 0x0004
+#define VALIDATEPATH_ALLOW_UNC 0x0008
+
+typedef struct {
+ UINT uType;
+ rtl_uString* ustrDrive;
+ rtl_uString* ustrFilePath; /* holds native directory path */
+ int d_attr; /* OS/2 file attributes */
+ int nRefCount;
+}DirectoryItem_Impl;
+
+#define DIRECTORYTYPE_LOCALROOT 0
+#define DIRECTORYTYPE_NETROOT 1
+#define DIRECTORYTYPE_NETRESORCE 2
+#define DIRECTORYTYPE_FILESYSTEM 3
+
+#define DIRECTORYITEM_DRIVE 0
+#define DIRECTORYITEM_FILE 1
+#define DIRECTORYITEM_SERVER 2
+
+typedef struct
+{
+ UINT uType;
+ rtl_uString* ustrPath; /* holds native directory path */
+ DIR* pDirStruct;
+ ULONG ulDriveMap;
+ ULONG ulNextDrive;
+ ULONG ulNextDriveMask;
+} DirectoryImpl;
+
+/* Different types of paths */
+typedef enum _PATHTYPE
+{
+ PATHTYPE_SYNTAXERROR = 0,
+ PATHTYPE_NETROOT,
+ PATHTYPE_NETSERVER,
+ PATHTYPE_VOLUME,
+ PATHTYPE_FILE
+} PATHTYPE;
+
+DWORD WINAPI IsValidFilePath(LPCTSTR, LPCTSTR*, DWORD);
+
+typedef struct
+{
+ rtl_uString* ustrFilePath; /* holds native file path */
+ int fd;
+ sal_Bool bLocked;
+} oslFileHandleImpl;
+
+
+typedef struct _oslVolumeDeviceHandleImpl
+{
+ sal_Char pszMountPoint[PATH_MAX];
+ sal_Char pszFilePath[PATH_MAX];
+ sal_Char pszDevice[PATH_MAX];
+ sal_Char ident[4];
+ sal_uInt32 RefCount;
+} oslVolumeDeviceHandleImpl;
+
+/* OS error to errno values mapping table */
+struct errentry {
+ unsigned long oscode; /* OS return value */
+ int errnocode; /* System V error code */
+};
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**************************************************
+* _osl_getSystemPathFromFileURL
+*************************************************/
+
+#define FURL_ALLOW_RELATIVE sal_True
+#define FURL_DENY_RELATIVE sal_False
+
+oslFileError osl_getSystemPathFromFileURL_Ex(rtl_uString *ustrFileURL, rtl_uString **pustrSystemPath, sal_Bool bAllowRelative);
+
+/**************************************************
+* FileURLToPath
+*************************************************/
+
+oslFileError FileURLToPath(char * buffer, size_t bufLen, rtl_uString* ustrFileURL);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* #define _FILE_URL_H_ */
+
diff --git a/sal/osl/os2/helpers/debug.h b/sal/osl/os2/helpers/debug.h
new file mode 100644
index 000000000000..83edca5db676
--- /dev/null
+++ b/sal/osl/os2/helpers/debug.h
@@ -0,0 +1,1779 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*
+ *@@sourcefile debug.h:
+ * header file for debug.c (exception handling and debugging).
+ * See remarks there.
+ *
+ * Note: Version numbering in this file relates to XWorkplace version
+ * numbering.
+ *
+ *@@changed V0.9.0: included contents of newexe.h
+ *
+ *@@include #define INCL_BASE
+ *@@include #include <os2.h>
+ *@@include #include <stdio.h>
+ *@@include #include "helpers\debug.h"
+ */
+
+/*
+ * This file incorporates code from the following:
+ * -- Marc Fiammante, John Currier, Kim Rasmussen,
+ * Anthony Cruise (EXCEPT3.ZIP package for a generic
+ * exception handling DLL, available at Hobbes).
+ *
+ * This file Copyright (C) 1992-99 Ulrich M�ller,
+ * Kim Rasmussen,
+ * Marc Fiammante,
+ * John Currier,
+ * Anthony Cruise.
+ *
+ * 2009-06-15 published under LGPL3 with Ulrich M�ller permission.
+ *
+ */
+
+#ifndef DEBUG_HEADER_INCLUDED
+ #define DEBUG_HEADER_INCLUDED
+
+ /********************************************************************
+ *
+ * SYM file declarations
+ *
+ ********************************************************************/
+
+ // Pointer means offset from beginning of file or beginning of struct
+ #pragma pack(1)
+
+ typedef struct
+ {
+ unsigned short int ppNextMap; // paragraph pointer to next map
+ unsigned char bFlags; // symbol types
+ unsigned char bReserved1; // reserved
+ unsigned short int pSegEntry; // segment entry point value
+ unsigned short int cConsts; // count of constants in map
+ unsigned short int pConstDef; // pointer to constant chain
+ unsigned short int cSegs; // count of segments in map
+ unsigned short int ppSegDef; // paragraph pointer to first segment
+ unsigned char cbMaxSym; // maximum symbol-name length
+ unsigned char cbModName; // length of module name
+ char achModName[1]; // cbModName Bytes of module-name member
+ } MAPDEF;
+
+ typedef struct
+ {
+ unsigned short int ppNextMap; // always zero
+ unsigned char release; // release number (minor version number)
+ unsigned char version; // major version number
+ } LAST_MAPDEF;
+
+ typedef struct
+ {
+ unsigned short int ppNextSeg; // paragraph pointer to next segment
+ unsigned short int cSymbols; // count of symbols in list
+ unsigned short int pSymDef; // offset of symbol chain
+ unsigned short int wReserved1; // reserved
+ unsigned short int wReserved2; // reserved
+ unsigned short int wReserved3; // reserved
+ unsigned short int wReserved4; // reserved
+ unsigned char bFlags; // symbol types; bit 0 signals 32-bit (*UM)
+ unsigned char bReserved1; // reserved
+ unsigned short int ppLineDef; // offset of line number record
+ unsigned char bReserved2; // reserved
+ unsigned char bReserved3; // reserved
+ unsigned char cbSegName; // length of segment name
+ char achSegName[1]; /* cbSegName Bytes of segment-name member*/
+ } SEGDEF;
+
+ typedef struct
+ {
+ unsigned short int wSymVal; // symbol address or constant
+ unsigned char cbSymName; // length of symbol name
+ char achSymName[1]; // cbSymName Bytes of symbol-name member
+ } SYMDEF16;
+
+ typedef struct
+ {
+ unsigned int wSymVal; // symbol address or constant
+ unsigned char cbSymName; // length of symbol name
+ char achSymName[1]; // cbSymName Bytes of symbol-name member
+ } SYMDEF32;
+
+ typedef struct
+ {
+ unsigned short int ppNextLine; // ptr to next linedef (0 if last)
+ unsigned short int wReserved1; // reserved
+ unsigned short int pLines; // pointer to line numbers
+ unsigned short int cLines; // reserved
+ unsigned char cbFileName; // length of filename
+ char achFileName[1];// cbFileName Bytes of filename
+ } LINEDEF;
+
+ typedef struct
+ {
+ unsigned short int wCodeOffset; // executable offset
+ unsigned short int dwFileOffset; // source offset
+ } LINEINF;
+
+ #define SEGDEFOFFSET(MapDef) (MapDef.ppSegDef*16)
+ #define NEXTSEGDEFOFFSET(SegDef) (SegDef.ppNextSeg*16)
+
+ #define ASYMPTROFFSET(SegDefOffset,Segdef) (SegDefOffset+SegDef.pSymDef)
+ #define SYMDEFOFFSET(SegDefOffset,SegDef,n) (ASYMPTROFFSET(SegDefOffset,SegDef)+(n)*(sizeof(unsigned short int)))
+
+ #define ACONSTPTROFFSET(MapDef) (MapDef.ppConstDef)
+ #define CONSTDEFOFFSET(MapDef,n) ((MapDef.ppConstDef)+(n)*(sizeof(unsigned short int)))
+
+ #define LINEDEFOFFSET(SegDef) (SegDef.ppLineDef*16)
+ #define NEXTLINEDEFOFFSET(LineDef) (LineDef.ppNextLine*16)
+ #define LINESOFFSET(LinedefOffset,LineDef) ((LinedefOffset)+LineDef.pLines)
+
+ /********************************************************************
+ *
+ * EXE declarations taken from exe.h
+ *
+ ********************************************************************/
+
+ #ifndef WORD
+ typedef unsigned short WORD;
+ #endif
+
+ typedef WORD bbmask;
+
+ struct exe {
+ WORD eid; // contains EXEID, below
+ WORD elast; // # of bytes in last page
+ WORD epagsiz; // # of pages in whole file
+ WORD erelcnt; // # of relocation entrys
+ WORD ehdrsiz; // size of header, in paragraphs
+ WORD eminfre; // min # of free paragraphs needed
+ WORD emaxfre; // max # of free paragraphs needed
+ WORD eiSS; // initial SS value
+ WORD eiSP; // initial SP value
+ WORD enegsum; // negative sum of entire file
+ WORD eiIP; // initial IP value
+ WORD eiCS; // initial CS value
+ WORD ereloff; // offset in file of relocation table
+ WORD eovlnum; // number of the overlay
+
+ /* the following fields may not be present.
+ * ereloff = 28 not present
+ * = 30 exe.ever present and valid
+ * = 32 exe.ever field contains garbage
+ * ereloff > 32 exe.ever present and valid
+ * = 0 if "don't know"
+ */
+
+ WORD ever; // version # of producing linker
+ WORD dumy; // unused
+
+ /* the following fields may not be present - if the exe.ereloff
+ * value encompasses the fields then they are present and valid.
+ */
+
+ bbmask ebb; // behavior bits
+ WORD dumy2[7]; // must be 0 until defined
+ };
+
+
+ #define EXEID 0x5a4d // magic ID value
+
+ /********************************************************************
+ *
+ * Object Module Format (OMF) declarations
+ *
+ ********************************************************************/
+
+ struct exehdr_rec
+ {
+ BYTE signature[2]; // Must be "MZ"
+ USHORT image_len; // Image Length
+ USHORT pages; // Pages
+ USHORT reloc_items; // Relocation table items
+ USHORT min_paragraphs; // Mininum 16-bytes paragraphs
+ USHORT max_paragraphs; // Maximum 16-bytes paragraphs
+ USHORT stack_pos; // Stack position
+ USHORT offset_in_sp; // Offset in SP
+ USHORT checksum; // Checksum
+ USHORT offset_in_ip; // Offset in IP
+ USHORT code_pos; // Code segment pos.
+ USHORT reloc_item_pos; // Position of first relocation item
+ USHORT overlay_number; // Overlay number
+ BYTE unused[8]; // Unused bytes
+ USHORT oem_id; // OEM Identifier
+ BYTE oem_info[24]; // OEM Info
+ ULONG lexe_offset; // Offset to linear header
+ };
+
+ struct lexehdr_rec
+ {
+ BYTE signature[2]; // Must be "LX"
+ BYTE b_ord; // Byte ordering
+ BYTE w_ord; // Word ordering
+ ULONG format_level; // Format level
+ USHORT cpu_type; // CPU Type
+ USHORT os_type; // Operating system
+ ULONG module_version; // Module version
+ ULONG mod_flags; // Module flags
+ ULONG mod_pages; // Module pages
+ ULONG EIP_object; // EIP Object no.
+ ULONG EIP; // EIP Value
+ ULONG ESP_object; // ESP Object no
+ ULONG ESP; // ESP Value
+ ULONG page_size; // Page size
+ ULONG page_ofs_shift; // Page offset shift
+ ULONG fixup_sect_size; // Fixup section size
+ ULONG fixup_sect_checksum; // Fixup section checksum
+ ULONG loader_sect_size; // Loader section size
+ ULONG loader_sect_checksum; // Loader section checksum
+ ULONG obj_table_ofs; // Object table offset
+ ULONG obj_count; // Object count
+ ULONG obj_page_tab_ofs; // Object page table offset
+ ULONG obj_iter_page_ofs; // Object iteration pages offset
+ ULONG res_tab_ofs; // Resource table offset
+ ULONG res_table_entries; // Resource table entries
+ ULONG res_name_tab_ofs; // Resident name table offset;
+ ULONG ent_tab_ofs; // Entry table offset
+ ULONG mod_dir_ofs; // Module directives offset
+ ULONG mod_dir_count; // Number of module directives
+ ULONG fixup_page_tab_ofs; // Fixup page table offset
+ ULONG fixup_rec_tab_ofs; // Fixup record table offset
+ ULONG imp_tab_ofs; // Import module table offset
+ ULONG imp_mod_entries; // Import module entries
+ ULONG imp_proc_tab_ofs; // Import proc table offset
+ ULONG per_page_check_ofs; // Per page checksum offset
+ ULONG data_page_offset; // Data pages offset
+ ULONG preload_page_count; // Preload pages count
+ ULONG nonres_tab_ofs; // Nonresident name table offset
+ ULONG nonres_tab_len; // Nonresident name table len
+ ULONG nonres_tab_check; // Nonresident tables checksum
+ ULONG auto_ds_objectno; // Auto DS object number
+ ULONG debug_info_ofs; // Debug info offset
+ ULONG debug_info_len; // Debug info length
+ ULONG inst_preload_count; // Instance preload count
+ ULONG inst_demand_count; // Instance demand count
+ ULONG heapsize; // Heap size
+ ULONG stacksize; // Stack size
+ };
+
+ struct debug_head_rec
+ {
+ BYTE signature[3]; // Debug signature
+ BYTE type; // Debug info type
+ };
+
+ struct dir_inf_rec
+ {
+ USHORT dirstruct_size; // Size of directory structure
+ USHORT number_of_entries; // Number of dnt_rec's in the array
+ USHORT unknown; // Unknown data
+ // Followed by an array of dnt_rec structures
+ };
+
+ struct dnt_rec
+ {
+ USHORT subsect_type; // sst Subsection type
+ USHORT mod_index; // Module index (1-based)
+ ULONG offset; // Offset of start of section
+ ULONG size; // Size of section
+ };
+
+ // Modules subsection
+ struct modules_rec
+ {
+ USHORT code_seg_base; // Code segment base
+ ULONG code_seg_offset; // Code segment offset
+ ULONG code_seg_len; // Code segment length
+ USHORT overlay_no; // Overlay number
+ USHORT lib_idx; // Index into library section or 0
+ BYTE segments; // Number of segments
+ BYTE reserved;
+ BYTE debug_style[2]; // "HL" for HLL, "CV" or 0 for CodeView
+ BYTE debug_version[2]; // 00 01 or 00 03 for HLL, 00 00 for CV
+ BYTE name_len; // Length of name (which follows)
+ };
+
+ // Publics subsection
+ struct publics_rec
+ {
+ ULONG offset; // Offset
+ USHORT segment; // Segment
+ USHORT type; // Type index
+ BYTE name_len; // Length of name (wich follows)
+ };
+
+ #if 0
+ // Linenumbers header
+ struct linhead_rec
+ {
+ BYTE id; // 0x95 for flat mem, 32 bit progs
+ USHORT length; // Record length
+ USHORT base_group; // Base group
+ USHORT base_segment; // Base segment
+ };
+ #endif
+
+ // First linenumber record
+ struct linfirst_rec
+ {
+ USHORT lineno; // Line number (0)
+ BYTE entry_type; // Entry type
+ BYTE reserved; // Reserved
+ USHORT entries_count; // Number of table entries
+ USHORT segment_no; // Segment number
+ ULONG filename_tabsize; // File names table size
+ };
+
+ // Source line numbers
+ struct linsource_rec
+ {
+ USHORT source_line; // Source file line number
+ USHORT source_idx; // Source file index
+ ULONG offset; // Offset into segment
+ };
+
+ // Listing statement numbers
+ struct linlist_rec
+ {
+ ULONG list_line; // Listing file linenumber
+ ULONG statement; // Listing file statement number
+ ULONG offset; // Offset into segment
+ };
+
+ // Source and Listing statement numbers
+ struct linsourcelist_rec
+ {
+ USHORT source_line; // Source file line number
+ USHORT source_idx; // Source file index
+ ULONG list_line; // Listing file linenumber
+ ULONG statement; // Listing file statement number
+ ULONG offset; // Offset into segment
+ };
+
+ // Path table
+ struct pathtab_rec
+ {
+ ULONG offset; // Offset into segment
+ USHORT path_code; // Path code
+ USHORT source_idx; // Source file index
+ };
+
+ // File names table
+ struct filenam_rec
+ {
+ ULONG first_char; // First displayable char in list file
+ ULONG disp_chars; // Number of displayable chars in list line
+ ULONG filecount; // Number of source/listing files
+ };
+
+ // Symbol types
+ #define SYM_BEGIN 0x00 // Begin block
+ #define SYM_PROC 0x01 // Function
+ #define SYM_END 0x02 // End block of function
+ #define SYM_AUTO 0x04 // Auto variable
+ #define SYM_STATIC 0x05 // Static variable
+ #define SYM_LABEL 0x0B // Label
+ #define SYM_WITH 0x0C // With start symbol (not used)
+ #define SYM_REG 0x0D // Register variable
+ #define SYM_CONST 0x0E // Constant
+ #define SYM_ENTRY 0x0F // Secondary entry (not in C)
+ #define SYM_SKIP 0x10 // For incremental linking (not used)
+ #define SYM_CHANGESEG 0x11 // Change segment (#pragma alloc_text)
+ #define SYM_TYPEDEF 0x12 // Typedef variable
+ #define SYM_PUBLIC 0x13 // Public reference
+ #define SYM_MEMBER 0x14 // Member of minor or major structure
+ #define SYM_BASED 0x15 // Based variable
+ #define SYM_TAG 0x16 // Tag in struct, union, enum ...
+ #define SYM_TABLE 0x17 // Table (used in RPG - not C)
+ #define SYM_MAP 0x18 // Map variable (extern in C)
+ #define SYM_CLASS 0x19 // Class symbol (C++)
+ #define SYM_MEMFUNC 0x1A // Member function
+ #define SYM_AUTOSCOPE 0x1B // Scoped auto for C++ (not used)
+ #define SYM_STATICSCOPE 0x1C // scoped static for C++ (not used)
+ #define SYM_CPPPROC 0x1D // C++ Proc
+ #define SYM_CPPSTAT 0x1E // C++ Static var
+ #define SYM_COMP 0x40 // Compiler information
+
+ // Symbolic begin record
+ struct symbegin_rec
+ {
+ ULONG offset; // Segment offset
+ ULONG length; // Length of block
+ BYTE name_len; // Length of block name
+ // Block name follows
+ };
+
+ // Symbolic auto var record
+ struct symauto_rec
+ {
+ ULONG stack_offset; // Stack offset
+ USHORT type_idx; // Type index
+ BYTE name_len; // Length of name
+ // Var name follows
+ };
+
+ // Symbolic procedure record
+ struct symproc_rec
+ {
+ ULONG offset; // Segment offset
+ USHORT type_idx; // Type index
+ ULONG length; // Length of procedure
+ USHORT pro_len; // Length of prologue
+ ULONG pro_bodylen; // Length of prologue + body
+ USHORT class_type; // Class type
+ BYTE near_far; // Near or far
+ BYTE name_len; // Length of name
+ // Function name follows
+ };
+
+ // Symbolic static var record
+ struct symstatic_rec
+ {
+ ULONG offset; // Segment offset
+ USHORT segaddr; // Segment address
+ USHORT type_idx; // Type index
+ BYTE name_len; // Length of name
+ // Var name follows
+ };
+
+ // Symbolic label var record
+ struct symlabel_rec
+ {
+ ULONG offset; // Segment offset
+ BYTE near_far; // Near or far
+ BYTE name_len; // Length of name
+ // Var name follows
+ };
+
+ // Symbolic register var record
+ struct symreg_rec
+ {
+ USHORT type_idx; // Type index
+ BYTE reg_no; // Register number
+ BYTE name_len; // Length of name
+ // Var name follows
+ };
+
+ // Symbolic change-segment record
+ struct symseg_rec
+ {
+ USHORT seg_no; // Segment number
+ };
+
+ // Symbolic typedef record
+ struct symtypedef_rec
+ {
+ USHORT type_idx; // Type index
+ BYTE name_len; // Length of name
+ // Name follows
+ };
+
+ // Symbolic public record
+ struct sympublic_rec
+ {
+ ULONG offset; // Segment offset
+ USHORT segaddr; // Segment address
+ USHORT type_idx; // Type index
+ BYTE name_len; // Length of name
+ // Name follows
+ };
+
+ // Symbolic member record
+ struct symmember_rec
+ {
+ ULONG offset; // Offset to subrecord
+ BYTE name_len; // Length of name
+ // Name follows
+ };
+
+ // Symbolic based record
+ struct symbased_rec
+ {
+ ULONG offset; // Offset to subrecord
+ USHORT type_idx; // Type index
+ BYTE name_len; // Length of name
+ // Name follows
+ };
+
+ // Symbolic tag record
+ struct symtag_rec
+ {
+ USHORT type_idx; // Type index
+ BYTE name_len; // Length of name
+ // Name follows
+ };
+
+ // Symbolic table record
+ struct symtable_rec
+ {
+ ULONG offset; // Segment offset
+ USHORT segaddr; // Segment address
+ USHORT type_idx; // Type index
+ ULONG idx_ofs; // Index offset to subrecord
+ BYTE name_len; // Length of name
+ // Name follows
+ };
+
+ // Type record
+ struct type_rec
+ {
+ USHORT length; // Length of sub-record
+ BYTE type; // Sub-record type
+ BYTE type_qual; // Type qualifier
+ };
+
+ // Types
+ #define TYPE_CLASS 0x40 // Class
+ #define TYPE_BASECLASS 0x41 // Base class
+ #define TYPE_FRIEND 0x42 // Friend
+ #define TYPE_CLASSDEF 0x43 // Class definition
+ #define TYPE_MEMBERFUNC 0x45 // Member function
+ #define TYPE_CLASSMEMBER 0x46 // Class member
+ #define TYPE_REF 0x48 // Reference
+ #define TYPE_MEMBERPTR 0x49 // Member pointer
+ #define TYPE_SCALARS 0x51 // Scalars
+ #define TYPE_SET 0x52 // Set
+ #define TYPE_ENTRY 0x53 // Entry
+ #define TYPE_FUNCTION 0x54 // Function
+ #define TYPE_AREA 0x55 // Area
+ #define TYPE_LOGICAL 0x56 // Logical
+ #define TYPE_STACK 0x57 // Stack
+ #define TYPE_MACRO 0x59 // Macro
+ #define TYPE_BITSTRING 0x5C // Bit string
+ #define TYPE_USERDEF 0x5D // User defined
+ #define TYPE_CHARSTR 0x60 // Character string
+ #define TYPE_PICTURE 0x61 // Picture
+ #define TYPE_GRAPHIC 0x62 // Graphic
+ #define TYPE_FORMATLAB 0x65 // Format label
+ #define TYPE_FILE 0x67 // File
+ #define TYPE_SUBRANGE 0x6F // Subrange
+ #define TYPE_CODELABEL 0x72 // Code label
+ #define TYPE_PROCEDURE 0x75 // Procedure
+ #define TYPE_ARRAY 0x78 // Array
+ #define TYPE_STRUCT 0x79 // Structure / Union / Record
+ #define TYPE_POINTER 0x7A // Pointer
+ #define TYPE_ENUM 0x7B // Enum
+ #define TYPE_LIST 0x7F // List
+
+ // Type userdef
+ struct type_userdefrec
+ {
+ BYTE FID_index; // Field ID
+ USHORT type_index; // Type index
+ BYTE FID_string; // String ID
+ BYTE name_len; // Length of name which follows
+ };
+
+ // Type function
+ struct type_funcrec
+ {
+ USHORT params;
+ USHORT max_params;
+ BYTE FID_index; // Field ID
+ USHORT type_index; // Type index of return value
+ BYTE FID_index1; // String ID
+ USHORT typelist_index; // Index of list of params
+ };
+
+ // Type struct
+ struct type_structrec
+ {
+ ULONG size; // Size of structure
+ USHORT field_count; // Number of fields in structure
+ BYTE FID_index; // Field ID
+ USHORT type_list_idx; // Index to type list
+ BYTE FID_index1; // Field ID
+ USHORT type_name_idx; // Index to names / offsets
+ BYTE dont_know; // Haven't a clue, but it seems to be needed
+ BYTE name_len; // Length of structure name which follows
+ };
+
+ // Type list, type qualifier 1: contains types for structures
+ // This record is repeated for the number of items in the structure definition
+ struct type_list1
+ {
+ BYTE FID_index; // Field identifier for index
+ USHORT type_index; // Type index.
+ };
+
+ // Type list, type qualifier 2: contains names and offsets for structure items
+ // This record is repeated for the number of items in the structure definition
+ struct type_list2
+ {
+ BYTE FID_string; // String identifier
+ BYTE name_len; // Length of name which follows
+ };
+
+ // Type list, subrecord to the above, contains offset of variable in the structure
+ struct type_list2_1
+ {
+ BYTE FID_span; // Defines what type of variable follows
+ union {
+ BYTE b_len;
+ USHORT s_len;
+ ULONG l_len;
+ } u;
+ };
+
+ // Type pointer
+ struct type_pointerrec
+ {
+ BYTE FID_index; // Index identifier
+ USHORT type_index; // Type index
+ BYTE FID_string; // String identifier
+ BYTE name_len; // Length of name which follows
+ };
+
+ /********************************************************************
+ *
+ * Prototypes
+ *
+ ********************************************************************/
+
+ BOOL dbgPrintStackFrame(FILE *LogFile,
+ PSZ pszModuleName, // in: module name (fully q'fied)
+ ULONG ulObject,
+ ULONG ulOffset);
+
+ VOID dbgPrintStack(FILE *file,
+ PUSHORT StackBottom,
+ PUSHORT StackTop,
+ PUSHORT Ebp,
+ PUSHORT ExceptionAddress);
+
+ APIRET APIENTRY DosQueryModFromEIP(HMODULE *phMod, // out: trapping module
+ ULONG *pulObjNum, // out: object/segment number
+ ULONG ulBuffLen, // in: sizeof(*pszBuff)
+ CHAR *pszBuff, // out: module name
+ ULONG *pulOffset, // out: offset in module
+ ULONG ulAddress); // in: address to be analyzed
+
+ APIRET APIENTRY DOSQUERYMODFROMEIP(HMODULE * phMod,
+ ULONG * pObjNum,
+ ULONG BuffLen,
+ PCHAR pBuff,
+ ULONG * pOffset,
+ PVOID Address);
+
+ typedef ULONG *_Seg16 PULONG16;
+ APIRET16 APIENTRY16 DOS16SIZESEG(USHORT Seg, PULONG16 Size);
+ typedef APIRET16(APIENTRY16 _PFN16) (VOID);
+ ULONG APIENTRY DosSelToFlat(ULONG);
+
+ APIRET16 APIENTRY16 DOSQPROCSTATUS(ULONG * _Seg16 pBuf, USHORT cbBuf);
+
+ #define CONVERT(fp,QSsel) MAKEP((QSsel),OFFSETOF(fp))
+
+ #pragma pack() // added V0.9.0
+
+
+ /********************************************************************
+ *
+ * Executable definitions
+ *
+ ********************************************************************/
+
+ #define EXE386 1
+
+ #ifndef __NEWEXE__
+ #define __NEWEXE__
+
+ #pragma pack(1)
+
+ /*_________________________________________________________________*
+ | |
+ | |
+ | DOS3 .EXE FILE HEADER DEFINITION |
+ | |
+ |_________________________________________________________________|
+ * */
+
+
+ #define EMAGIC 0x5A4D // Old magic number
+ #define ENEWEXE sizeof(struct exe_hdr)
+ // Value of E_LFARLC for new .EXEs
+ #define ENEWHDR 0x003C // Offset in old hdr. of ptr. to new
+ #define ERESWDS 0x0010 // No. of reserved words (OLD)
+ #define ERES1WDS 0x0004 // No. of reserved words in e_res
+ #define ERES2WDS 0x000A // No. of reserved words in e_res2
+ #define ECP 0x0004 // Offset in struct of E_CP
+ #define ECBLP 0x0002 // Offset in struct of E_CBLP
+ #define EMINALLOC 0x000A // Offset in struct of E_MINALLOC
+
+ /*
+ *@@ exe_hdr:
+ * DOS 1, 2, 3 .EXE header.
+ */
+
+ struct exe_hdr
+ {
+ unsigned short e_magic; // Magic number
+ unsigned short e_cblp; // Bytes on last page of file
+ unsigned short e_cp; // Pages in file
+ unsigned short e_crlc; // Relocations
+ unsigned short e_cparhdr; // Size of header in paragraphs
+ unsigned short e_minalloc; // Minimum extra paragraphs needed
+ unsigned short e_maxalloc; // Maximum extra paragraphs needed
+ unsigned short e_ss; // Initial (relative) SS value
+ unsigned short e_sp; // Initial SP value
+ unsigned short e_csum; // Checksum
+ unsigned short e_ip; // Initial IP value
+ unsigned short e_cs; // Initial (relative) CS value
+ unsigned short e_lfarlc; // File address of relocation table
+ unsigned short e_ovno; // Overlay number
+ unsigned short e_res[ERES1WDS];// Reserved words
+ unsigned short e_oemid; // OEM identifier (for e_oeminfo)
+ unsigned short e_oeminfo; // OEM information; e_oemid specific
+ unsigned short e_res2[ERES2WDS];// Reserved words
+ long e_lfanew; // File address of new exe header
+ };
+
+ #define E_MAGIC(x) (x).e_magic
+ #define E_CBLP(x) (x).e_cblp
+ #define E_CP(x) (x).e_cp
+ #define E_CRLC(x) (x).e_crlc
+ #define E_CPARHDR(x) (x).e_cparhdr
+ #define E_MINALLOC(x) (x).e_minalloc
+ #define E_MAXALLOC(x) (x).e_maxalloc
+ #define E_SS(x) (x).e_ss
+ #define E_SP(x) (x).e_sp
+ #define E_CSUM(x) (x).e_csum
+ #define E_IP(x) (x).e_ip
+ #define E_CS(x) (x).e_cs
+ #define E_LFARLC(x) (x).e_lfarlc
+ #define E_OVNO(x) (x).e_ovno
+ #define E_RES(x) (x).e_res
+ #define E_OEMID(x) (x).e_oemid
+ #define E_OEMINFO(x) (x).e_oeminfo
+ #define E_RES2(x) (x).e_res2
+ #define E_LFANEW(x) (x).e_lfanew
+
+
+ /*_________________________________________________________________*
+ | |
+ | |
+ | OS/2 & WINDOWS .EXE FILE HEADER DEFINITION - 286 version |
+ | |
+ |_________________________________________________________________|
+ * */
+
+ #define NEMAGIC 0x454E // New magic number
+ #define NERESBYTES 8 // Eight bytes reserved (now)
+ #define NECRC 8 // Offset into new header of NE_CRC
+
+ /*
+ *@@ new_exe:
+ * New Executable (NE) header.
+ * Follows DOS header in the executable file.
+ */
+
+ struct new_exe
+ {
+ unsigned short ne_magic; // Magic number NE_MAGIC
+ unsigned char ne_ver; // Version number
+ unsigned char ne_rev; // Revision number
+ unsigned short ne_enttab; // Offset of Entry Table
+ unsigned short ne_cbenttab; // Number of bytes in Entry Table
+ long ne_crc; // Checksum of whole file
+ unsigned short ne_flags; // Flag word
+ unsigned short ne_autodata; // Automatic data segment number
+ unsigned short ne_heap; // Initial heap allocation
+ unsigned short ne_stack; // Initial stack allocation
+ long ne_csip; // Initial CS:IP setting
+ long ne_sssp; // Initial SS:SP setting
+ unsigned short ne_cseg; // Count of file segments
+ unsigned short ne_cmod; // Entries in Module Reference Table
+ unsigned short ne_cbnrestab; // Size of non-resident name table
+ unsigned short ne_segtab; // Offset of Segment Table
+ unsigned short ne_rsrctab; // Offset of Resource Table
+ unsigned short ne_restab; // Offset of resident name table
+ unsigned short ne_modtab; // Offset of Module Reference Table
+ unsigned short ne_imptab; // Offset of Imported Names Table
+ long ne_nrestab; // Offset of Non-resident Names Table
+ unsigned short ne_cmovent; // Count of movable entries
+ unsigned short ne_align; // Segment alignment shift count
+ unsigned short ne_cres; // Count of resource entries
+ unsigned char ne_exetyp; // Target operating system
+ unsigned char ne_flagsothers; // Other .EXE flags
+ char ne_res[NERESBYTES]; // Pad structure to 64 bytes
+ };
+
+ #pragma pack()
+
+ #define NE_MAGIC(x) (x).ne_magic
+ #define NE_VER(x) (x).ne_ver
+ #define NE_REV(x) (x).ne_rev
+ #define NE_ENTTAB(x) (x).ne_enttab
+ #define NE_CBENTTAB(x) (x).ne_cbenttab
+ #define NE_CRC(x) (x).ne_crc
+ #define NE_FLAGS(x) (x).ne_flags
+ #define NE_AUTODATA(x) (x).ne_autodata
+ #define NE_HEAP(x) (x).ne_heap
+ #define NE_STACK(x) (x).ne_stack
+ #define NE_CSIP(x) (x).ne_csip
+ #define NE_SSSP(x) (x).ne_sssp
+ #define NE_CSEG(x) (x).ne_cseg
+ #define NE_CMOD(x) (x).ne_cmod
+ #define NE_CBNRESTAB(x) (x).ne_cbnrestab
+ #define NE_SEGTAB(x) (x).ne_segtab
+ #define NE_RSRCTAB(x) (x).ne_rsrctab
+ #define NE_RESTAB(x) (x).ne_restab
+ #define NE_MODTAB(x) (x).ne_modtab
+ #define NE_IMPTAB(x) (x).ne_imptab
+ #define NE_NRESTAB(x) (x).ne_nrestab
+ #define NE_CMOVENT(x) (x).ne_cmovent
+ #define NE_ALIGN(x) (x).ne_align
+ #define NE_CRES(x) (x).ne_cres
+ #define NE_RES(x) (x).ne_res
+ #define NE_EXETYP(x) (x).ne_exetyp
+ #define NE_FLAGSOTHERS(x) (x).ne_flagsothers
+
+ #define NE_USAGE(x) (WORD)*((WORD *)(x)+1)
+ #define NE_PNEXTEXE(x) (WORD)(x).ne_cbenttab
+ #define NE_ONEWEXE(x) (WORD)(x).ne_crc
+ #define NE_PFILEINFO(x) (WORD)((DWORD)(x).ne_crc >> 16)
+
+
+ /*
+ * Target operating systems
+ */
+
+ #define NE_UNKNOWN 0x0 /* Unknown (any "new-format" OS) */
+ #define NE_OS2 0x1 /* OS/2 (default) */
+ #define NE_WINDOWS 0x2 /* Windows */
+ #define NE_DOS4 0x3 /* DOS 4.x */
+ #define NE_DEV386 0x4 /* Windows 386 */
+
+
+ /*
+ * Format of NE_FLAGS(x):
+ *
+ * p Not-a-process
+ * x Unused
+ * e Errors in image
+ * x Unused
+ * b Bound Family/API
+ * ttt Application type
+ * f Floating-point instructions
+ * 3 386 instructions
+ * 2 286 instructions
+ * 0 8086 instructions
+ * P Protected mode only
+ * p Per-process library initialization
+ * i Instance data
+ * s Solo data
+ */
+ #define NENOTP 0x8000 /* Not a process */
+ #define NEIERR 0x2000 /* Errors in image */
+ #define NEBOUND 0x0800 /* Bound Family/API */
+ #define NEAPPTYP 0x0700 /* Application type mask */
+ #define NENOTWINCOMPAT 0x0100 /* Not compatible with P.M. Windowing */
+ #define NEWINCOMPAT 0x0200 /* Compatible with P.M. Windowing */
+ #define NEWINAPI 0x0300 /* Uses P.M. Windowing API */
+ #define NEFLTP 0x0080 /* Floating-point instructions */
+ #define NEI386 0x0040 /* 386 instructions */
+ #define NEI286 0x0020 /* 286 instructions */
+ #define NEI086 0x0010 /* 8086 instructions */
+ #define NEPROT 0x0008 /* Runs in protected mode only */
+ #define NEPPLI 0x0004 /* Per-Process Library Initialization */
+ #define NEINST 0x0002 /* Instance data */
+ #define NESOLO 0x0001 /* Solo data */
+
+ /*
+ * Format of NE_FLAGSOTHERS(x):
+ *
+ * 7 6 5 4 3 2 1 0 - bit no
+ * | | | |
+ * | | | +---------------- Support for long file names
+ * | | +------------------ Windows 2.x app runs in prot mode
+ * | +-------------------- Windows 2.x app gets prop. font
+ * +------------------------------ WLO appl on OS/2 (markwlo.exe)
+ *
+ */
+
+ #define NELONGNAMES 0x01
+ #define NEWINISPROT 0x02
+ #define NEWINGETPROPFON 0x04
+ #define NEWLOAPPL 0x80
+
+
+
+ struct new_seg /* New .EXE segment table entry */
+ {
+ unsigned short ns_sector; /* File sector of start of segment */
+ unsigned short ns_cbseg; /* Number of bytes in file */
+ unsigned short ns_flags; /* Attribute flags */
+ unsigned short ns_minalloc; /* Minimum allocation in bytes */
+ };
+
+ #define NS_SECTOR(x) (x).ns_sector
+ #define NS_CBSEG(x) (x).ns_cbseg
+ #define NS_FLAGS(x) (x).ns_flags
+ #define NS_MINALLOC(x) (x).ns_minalloc
+
+
+ /*
+ * Format of NS_FLAGS(x)
+ *
+ * Flag word has the following format:
+ *
+ * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
+ * | | | | | | | | | | | | | | |
+ * | | | | | | | | | | | | +-+-+--- Segment type DATA/CODE
+ * | | | | | | | | | | | +--------- Iterated segment
+ * | | | | | | | | | | +----------- Movable segment
+ * | | | | | | | | | +------------- Segment can be shared
+ * | | | | | | | | +--------------- Preload segment
+ * | | | | | | | +----------------- Execute/read-only for code/data segment
+ * | | | | | | +------------------- Segment has relocations
+ * | | | | | +--------------------- Code conforming/Data is expand down
+ * | | | +--+----------------------- I/O privilege level
+ * | | +----------------------------- Discardable segment
+ * | +-------------------------------- 32-bit code segment
+ * +----------------------------------- Huge segment/GDT allocation requested
+ *
+ */
+
+ #define NSTYPE 0x0007 /* Segment type mask */
+
+ #ifdef EXE386
+ #define NSCODE 0x0000 /* Code segment */
+ #define NSDATA 0x0001 /* Data segment */
+ #define NSITER 0x0008 /* Iterated segment flag */
+ #define NSMOVE 0x0010 /* Movable segment flag */
+ #define NSSHARED 0x0020 /* Shared segment flag */
+ #define NSPRELOAD 0x0040 /* Preload segment flag */
+ #define NSEXRD 0x0080 /* Execute-only (code segment), or
+ * read-only (data segment)
+ */
+ #define NSRELOC 0x0100 /* Segment has relocations */
+ #define NSCONFORM 0x0200 /* Conforming segment */
+ #define NSEXPDOWN 0x0200 /* Data segment is expand down */
+ #define NSDPL 0x0C00 /* I/O privilege level (286 DPL bits) */
+ #define SHIFTDPL 10 /* Left shift count for SEGDPL field */
+ #define NSDISCARD 0x1000 /* Segment is discardable */
+ #define NS32BIT 0x2000 /* 32-bit code segment */
+ #define NSHUGE 0x4000 /* Huge memory segment, length of
+ * segment and minimum allocation
+ * size are in segment sector units
+ */
+ #define NSGDT 0x8000 /* GDT allocation requested */
+
+ #define NSPURE NSSHARED /* For compatibility */
+
+ #define NSALIGN 9 /* Segment data aligned on 512 byte boundaries */
+
+ #define NSLOADED 0x0004 /* ns_sector field contains memory addr */
+ #endif
+
+
+ struct new_segdata /* Segment data */
+ {
+ union
+ {
+ struct
+ {
+ unsigned short ns_niter; /* number of iterations */
+ unsigned short ns_nbytes; /* number of bytes */
+ char ns_iterdata; /* iterated data bytes */
+ } ns_iter;
+ struct
+ {
+ char ns_data; /* data bytes */
+ } ns_noniter;
+ } ns_union;
+ };
+
+ struct new_rlcinfo /* Relocation info */
+ {
+ unsigned short nr_nreloc; /* number of relocation items that */
+ }; /* follow */
+
+ #pragma pack(1)
+
+
+ struct new_rlc /* Relocation item */
+ {
+ char nr_stype; /* Source type */
+ char nr_flags; /* Flag byte */
+ unsigned short nr_soff; /* Source offset */
+ union
+ {
+ struct
+ {
+ char nr_segno; /* Target segment number */
+ char nr_res; /* Reserved */
+ unsigned short nr_entry; /* Target Entry Table offset */
+ } nr_intref; /* Internal reference */
+ struct
+ {
+ unsigned short nr_mod; /* Index into Module Reference Table */
+ unsigned short nr_proc; /* Procedure ordinal or name offset */
+ } nr_import; /* Import */
+ struct
+ {
+ unsigned short nr_ostype; /* OSFIXUP type */
+ unsigned short nr_osres; /* reserved */
+ } nr_osfix; /* Operating system fixup */
+ } nr_union; /* Union */
+ };
+
+ #pragma pack()
+
+
+ #define NR_STYPE(x) (x).nr_stype
+ #define NR_FLAGS(x) (x).nr_flags
+ #define NR_SOFF(x) (x).nr_soff
+ #define NR_SEGNO(x) (x).nr_union.nr_intref.nr_segno
+ #define NR_RES(x) (x).nr_union.nr_intref.nr_res
+ #define NR_ENTRY(x) (x).nr_union.nr_intref.nr_entry
+ #define NR_MOD(x) (x).nr_union.nr_import.nr_mod
+ #define NR_PROC(x) (x).nr_union.nr_import.nr_proc
+ #define NR_OSTYPE(x) (x).nr_union.nr_osfix.nr_ostype
+ #define NR_OSRES(x) (x).nr_union.nr_osfix.nr_osres
+
+
+
+ /*
+ * Format of NR_STYPE(x) and R32_STYPE(x):
+ *
+ * 7 6 5 4 3 2 1 0 - bit no
+ * | | | |
+ * +-+-+-+--- source type
+ *
+ */
+
+ #define NRSTYP 0x0f /* Source type mask */
+ #define NRSBYT 0x00 /* lo byte (8-bits)*/
+ #define NRSSEG 0x02 /* 16-bit segment (16-bits) */
+ #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */
+ #define NRSOFF 0x05 /* 16-bit offset (16-bits) */
+ #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */
+ #define NROFF32 0x07 /* 32-bit offset (32-bits) */
+ #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */
+
+
+ /*
+ * Format of NR_FLAGS(x) and R32_FLAGS(x):
+ *
+ * 7 6 5 4 3 2 1 0 - bit no
+ * | | |
+ * | +-+--- Reference type
+ * +------- Additive fixup
+ */
+
+ #define NRADD 0x04 /* Additive fixup */
+ #define NRRTYP 0x03 /* Reference type mask */
+ #define NRRINT 0x00 /* Internal reference */
+ #define NRRORD 0x01 /* Import by ordinal */
+ #define NRRNAM 0x02 /* Import by name */
+ #define NRROSF 0x03 /* Operating system fixup */
+
+
+ #if (EXE386 == 0)
+
+ /* Resource type or name string */
+ struct rsrc_string
+ {
+ char rs_len; /* number of bytes in string */
+ char rs_string[ 1 ]; /* text of string */
+ };
+
+ #define RS_LEN( x ) (x).rs_len
+ #define RS_STRING( x ) (x).rs_string
+
+ /* Resource type information block */
+ struct rsrc_typeinfo
+ {
+ unsigned short rt_id;
+ unsigned short rt_nres;
+ long rt_proc;
+ };
+
+ #define RT_ID( x ) (x).rt_id
+ #define RT_NRES( x ) (x).rt_nres
+ #define RT_PROC( x ) (x).rt_proc
+
+ /* Resource name information block */
+ struct rsrc_nameinfo
+ {
+ /* The following two fields must be shifted left by the value of */
+ /* the rs_align field to compute their actual value. This allows */
+ /* resources to be larger than 64k, but they do not need to be */
+ /* aligned on 512 byte boundaries, the way segments are */
+ unsigned short rn_offset; /* file offset to resource data */
+ unsigned short rn_length; /* length of resource data */
+ unsigned short rn_flags; /* resource flags */
+ unsigned short rn_id; /* resource name id */
+ unsigned short rn_handle; /* If loaded, then global handle */
+ unsigned short rn_usage; /* Initially zero. Number of times */
+ /* the handle for this resource has */
+ /* been given out */
+ };
+
+ #define RN_OFFSET( x ) (x).rn_offset
+ #define RN_LENGTH( x ) (x).rn_length
+ #define RN_FLAGS( x ) (x).rn_flags
+ #define RN_ID( x ) (x).rn_id
+ #define RN_HANDLE( x ) (x).rn_handle
+ #define RN_USAGE( x ) (x).rn_usage
+
+ #define RSORDID 0x8000 /* if high bit of ID set then integer id */
+ /* otherwise ID is offset of string from
+ the beginning of the resource table */
+
+ /* Ideally these are the same as the */
+ /* corresponding segment flags */
+ #define RNMOVE 0x0010 /* Moveable resource */
+ #define RNPURE 0x0020 /* Pure (read-only) resource */
+ #define RNPRELOAD 0x0040 /* Preloaded resource */
+ #define RNDISCARD 0xF000 /* Discard priority level for resource */
+
+ /* Resource table */
+ struct new_rsrc
+ {
+ unsigned short rs_align; /* alignment shift count for resources */
+ struct rsrc_typeinfo rs_typeinfo;
+ };
+
+ #define RS_ALIGN( x ) (x).rs_align
+
+
+ #endif /* NOT EXE386 */
+
+ #endif /* __NEWEXE__ */
+
+ #ifndef DWORD
+ #define DWORD long int
+ #endif
+
+ #ifndef WORD
+ #define WORD short int
+ #endif
+
+ #ifndef __EXE386__
+ #define __EXE386__
+
+ #pragma pack(1) /* Force byte alignment */
+
+ /*_________________________________________________________________*
+ | |
+ | |
+ | OS/2 .EXE FILE HEADER DEFINITION - 386 version 0:32 |
+ | |
+ |_________________________________________________________________|
+ * */
+
+ #define BITPERWORD 16
+ #define BITPERBYTE 8
+ #define OBJPAGELEN 4096
+ #define E32MAGIC1 'L' /* New magic number "LX" */
+ #define E32MAGIC2 'X' /* New magic number "LX" */
+ #define E32MAGIC 0x584c /* New magic number "LX" */
+ #define E32RESBYTES1 0 /* First bytes reserved */
+ #define E32RESBYTES2 0 /* Second bytes reserved */
+ #define E32RESBYTES3 20 /* Third bytes reserved */
+ #define E32LEBO 0x00 /* Little Endian Byte Order */
+ #define E32BEBO 0x01 /* Big Endian Byte Order */
+ #define E32LEWO 0x00 /* Little Endian Word Order */
+ #define E32BEWO 0x01 /* Big Endian Word Order */
+ #define E32LEVEL 0L /* 32-bit EXE format level */
+ #define E32CPU286 0x001 /* Intel 80286 or upwardly compatibile */
+ #define E32CPU386 0x002 /* Intel 80386 or upwardly compatibile */
+ #define E32CPU486 0x003 /* Intel 80486 or upwardly compatibile */
+
+
+
+ struct e32_exe /* New 32-bit .EXE header */
+ {
+ unsigned char e32_magic[2]; /* Magic number E32_MAGIC */
+ unsigned char e32_border; /* The byte ordering for the .EXE */
+ unsigned char e32_worder; /* The word ordering for the .EXE */
+ unsigned long e32_level; /* The EXE format level for now = 0 */
+ unsigned short e32_cpu; /* The CPU type */
+ unsigned short e32_os; /* The OS type */
+ unsigned long e32_ver; /* Module version */
+ unsigned long e32_mflags; /* Module flags */
+ unsigned long e32_mpages; /* Module # pages */
+ unsigned long e32_startobj; /* Object # for instruction pointer */
+ unsigned long e32_eip; /* Extended instruction pointer */
+ unsigned long e32_stackobj; /* Object # for stack pointer */
+ unsigned long e32_esp; /* Extended stack pointer */
+ unsigned long e32_pagesize; /* .EXE page size */
+ unsigned long e32_pageshift; /* Page alignment shift in .EXE */
+ unsigned long e32_fixupsize; /* Fixup section size */
+ unsigned long e32_fixupsum; /* Fixup section checksum */
+ unsigned long e32_ldrsize; /* Loader section size */
+ unsigned long e32_ldrsum; /* Loader section checksum */
+ unsigned long e32_objtab; /* Object table offset */
+ unsigned long e32_objcnt; /* Number of objects in module */
+ unsigned long e32_objmap; /* Object page map offset */
+ unsigned long e32_itermap; /* Object iterated data map offset */
+ unsigned long e32_rsrctab; /* Offset of Resource Table */
+ unsigned long e32_rsrccnt; /* Number of resource entries */
+ unsigned long e32_restab; /* Offset of resident name table */
+ unsigned long e32_enttab; /* Offset of Entry Table */
+ unsigned long e32_dirtab; /* Offset of Module Directive Table */
+ unsigned long e32_dircnt; /* Number of module directives */
+ unsigned long e32_fpagetab; /* Offset of Fixup Page Table */
+ unsigned long e32_frectab; /* Offset of Fixup Record Table */
+ unsigned long e32_impmod; /* Offset of Import Module Name Table */
+ unsigned long e32_impmodcnt; /* Number of entries in Import Module Name Table */
+ unsigned long e32_impproc; /* Offset of Import Procedure Name Table */
+ unsigned long e32_pagesum; /* Offset of Per-Page Checksum Table */
+ unsigned long e32_datapage; /* Offset of Enumerated Data Pages */
+ unsigned long e32_preload; /* Number of preload pages */
+ unsigned long e32_nrestab; /* Offset of Non-resident Names Table */
+ unsigned long e32_cbnrestab; /* Size of Non-resident Name Table */
+ unsigned long e32_nressum; /* Non-resident Name Table Checksum */
+ unsigned long e32_autodata; /* Object # for automatic data object */
+ unsigned long e32_debuginfo; /* Offset of the debugging information */
+ unsigned long e32_debuglen; /* The length of the debugging info. in bytes */
+ unsigned long e32_instpreload;/* Number of instance pages in preload section of .EXE file */
+ unsigned long e32_instdemand; /* Number of instance pages in demand load section of .EXE file */
+ unsigned long e32_heapsize; /* Size of heap - for 16-bit apps */
+ unsigned long e32_stacksize; /* Size of stack */
+ unsigned char e32_res3[E32RESBYTES3];
+ /* Pad structure to 196 bytes */
+ };
+
+
+
+ #define E32_MAGIC1(x) (x).e32_magic[0]
+ #define E32_MAGIC2(x) (x).e32_magic[1]
+ #define E32_BORDER(x) (x).e32_border
+ #define E32_WORDER(x) (x).e32_worder
+ #define E32_LEVEL(x) (x).e32_level
+ #define E32_CPU(x) (x).e32_cpu
+ #define E32_OS(x) (x).e32_os
+ #define E32_VER(x) (x).e32_ver
+ #define E32_MFLAGS(x) (x).e32_mflags
+ #define E32_MPAGES(x) (x).e32_mpages
+ #define E32_STARTOBJ(x) (x).e32_startobj
+ #define E32_EIP(x) (x).e32_eip
+ #define E32_STACKOBJ(x) (x).e32_stackobj
+ #define E32_ESP(x) (x).e32_esp
+ #define E32_PAGESIZE(x) (x).e32_pagesize
+ #define E32_PAGESHIFT(x) (x).e32_pageshift
+ #define E32_FIXUPSIZE(x) (x).e32_fixupsize
+ #define E32_FIXUPSUM(x) (x).e32_fixupsum
+ #define E32_LDRSIZE(x) (x).e32_ldrsize
+ #define E32_LDRSUM(x) (x).e32_ldrsum
+ #define E32_OBJTAB(x) (x).e32_objtab
+ #define E32_OBJCNT(x) (x).e32_objcnt
+ #define E32_OBJMAP(x) (x).e32_objmap
+ #define E32_ITERMAP(x) (x).e32_itermap
+ #define E32_RSRCTAB(x) (x).e32_rsrctab
+ #define E32_RSRCCNT(x) (x).e32_rsrccnt
+ #define E32_RESTAB(x) (x).e32_restab
+ #define E32_ENTTAB(x) (x).e32_enttab
+ #define E32_DIRTAB(x) (x).e32_dirtab
+ #define E32_DIRCNT(x) (x).e32_dircnt
+ #define E32_FPAGETAB(x) (x).e32_fpagetab
+ #define E32_FRECTAB(x) (x).e32_frectab
+ #define E32_IMPMOD(x) (x).e32_impmod
+ #define E32_IMPMODCNT(x) (x).e32_impmodcnt
+ #define E32_IMPPROC(x) (x).e32_impproc
+ #define E32_PAGESUM(x) (x).e32_pagesum
+ #define E32_DATAPAGE(x) (x).e32_datapage
+ #define E32_PRELOAD(x) (x).e32_preload
+ #define E32_NRESTAB(x) (x).e32_nrestab
+ #define E32_CBNRESTAB(x) (x).e32_cbnrestab
+ #define E32_NRESSUM(x) (x).e32_nressum
+ #define E32_AUTODATA(x) (x).e32_autodata
+ #define E32_DEBUGINFO(x) (x).e32_debuginfo
+ #define E32_DEBUGLEN(x) (x).e32_debuglen
+ #define E32_INSTPRELOAD(x) (x).e32_instpreload
+ #define E32_INSTDEMAND(x) (x).e32_instdemand
+ #define E32_HEAPSIZE(x) (x).e32_heapsize
+ #define E32_STACKSIZE(x) (x).e32_stacksize
+
+
+
+ /*
+ * Format of E32_MFLAGS(x):
+ *
+ * Low word has the following format:
+ *
+ * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
+ * | | | | | | | |
+ * | | | | | | | +------- Per-Process Library Initialization
+ * | | | | | | +--------- SystemDLL (internal fixups discarded)
+ * | | | | | +----------- No Internal Fixups for Module in .EXE
+ * | | | | +------------- No External Fixups for Module in .EXE
+ * | | | +------------------- Incompatible with PM Windowing
+ * | | +--------------------- Compatible with PM Windowing
+ * | | Uses PM Windowing API
+ * | +-------------------------------- Module not Loadable
+ * +-------------------------------------- Library Module
+ */
+
+
+ #define E32NOTP 0x8000L /* Library Module - used as NENOTP */
+ #define E32NOLOAD 0x2000L /* Module not Loadable */
+ #define E32PMAPI 0x0300L /* Uses PM Windowing API */
+ #define E32PMW 0x0200L /* Compatible with PM Windowing */
+ #define E32NOPMW 0x0100L /* Incompatible with PM Windowing */
+ #define E32NOEXTFIX 0x0020L /* NO External Fixups in .EXE */
+ #define E32NOINTFIX 0x0010L /* NO Internal Fixups in .EXE */
+ #define E32SYSDLL 0x0008L /* System DLL, Internal Fixups discarded*/
+ #define E32LIBINIT 0x0004L /* Per-Process Library Initialization */
+ #define E32LIBTERM 0x40000000L /* Per-Process Library Termination */
+ #define E32APPMASK 0x0300L /* Application Type Mask */
+
+
+ /*
+ * Format of E32_MFLAGS(x):
+ *
+ * High word has the following format:
+ *
+ * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
+ * | |
+ * | +--- Protected memory library module
+ * +----- Device driver
+ */
+
+ #define E32PROTDLL 0x10000L /* Protected memory library module */
+ #define E32DEVICE 0x20000L /* Device driver */
+ #define E32MODEXE 0x00000L /* .EXE module */
+ #define E32MODDLL 0x08000L /* .DLL module */
+ #define E32MODPROTDLL 0x18000L /* Protected memory library module */
+ #define E32MODPDEV 0x20000L /* Physical device driver */
+ #define E32MODVDEV 0x28000L /* Virtual device driver */
+ #define E32MODMASK 0x38000L /* Module type mask */
+
+ /*
+ * RELOCATION DEFINITIONS - RUN-TIME FIXUPS
+ */
+
+ typedef union _RELOC_OFS
+ {
+ unsigned short offset16;
+ unsigned long offset32;
+ } RELOC_OFS; /* 16-bit or 32-bit offset */
+
+
+ /***ET+ r32_rlc - Relocation item */
+
+ struct r32_rlc /* Relocation item */
+ {
+ unsigned char nr_stype; /* Source type - field shared with new_rlc */
+ unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
+ short r32_soff; /* Source offset */
+ unsigned short r32_objmod; /* Target object number or Module ordinal */
+
+ union targetid
+ {
+ RELOC_OFS intref; /* Internal fixup */
+
+ union extfixup
+ {
+ RELOC_OFS proc; /* Procedure name offset */
+ unsigned long ord; /* Procedure odrinal */
+ } extref; /* External fixup */
+
+ struct addfixup
+ {
+ unsigned short entry; /* Entry ordinal */
+ RELOC_OFS addval; /* Value added to the address */
+ } addfix; /* Additive fixup */
+ }
+ r32_target; /* Target data */
+ unsigned short r32_srccount; /* Number of chained fixup records */
+ unsigned short r32_chain; /* Chain head */
+ };
+
+ /*
+ * In 32-bit .EXE file run-time relocations are written as varying size
+ * records, so we need many size definitions.
+ */
+
+ #define RINTSIZE16 8
+ #define RINTSIZE32 10
+ #define RORDSIZE 8
+ #define RNAMSIZE16 8
+ #define RNAMSIZE32 10
+ #define RADDSIZE16 10
+ #define RADDSIZE32 12
+
+ #if FALSE
+ /*
+ * Access macros defined in NEWEXE.H !!!
+ */
+ #define NR_STYPE(x) (x).nr_stype
+ #define NR_FLAGS(x) (x).nr_flags
+ #endif
+
+ #define R32_SOFF(x) (x).r32_soff
+ #define R32_OBJNO(x) (x).r32_objmod
+ #define R32_MODORD(x) (x).r32_objmod
+ #define R32_OFFSET16(x) (x).r32_target.intref.offset16
+ #define R32_OFFSET32(x) (x).r32_target.intref.offset32
+ #define R32_PROCOFF16(x) (x).r32_target.extref.proc.offset16
+ #define R32_PROCOFF32(x) (x).r32_target.extref.proc.offset32
+ #define R32_PROCORD(x) (x).r32_target.extref.ord
+ #define R32_ENTRY(x) (x).r32_target.addfix.entry
+ #define R32_ADDVAL16(x) (x).r32_target.addfix.addval.offset16
+ #define R32_ADDVAL32(x) (x).r32_target.addfix.addval.offset32
+ #define R32_SRCCNT(x) (x).r32_srccount
+ #define R32_CHAIN(x) (x).r32_chain
+
+
+
+ /*
+ * Format of NR_STYPE(x)
+ *
+ * 7 6 5 4 3 2 1 0 - bit no
+ * | | | | | |
+ * | | +-+-+-+--- Source type
+ * | +----------- Fixup to 16:16 alias
+ * +------------- List of source offset follows fixup record
+ */
+
+ #if FALSE
+
+ /* DEFINED in newexe.h !!! */
+
+ #define NRSTYP 0x0f /* Source type mask */
+ #define NRSBYT 0x00 /* lo byte (8-bits)*/
+ #define NRSSEG 0x02 /* 16-bit segment (16-bits) */
+ #define NRSPTR 0x03 /* 16:16 pointer (32-bits) */
+ #define NRSOFF 0x05 /* 16-bit offset (16-bits) */
+ #define NRPTR48 0x06 /* 16:32 pointer (48-bits) */
+ #define NROFF32 0x07 /* 32-bit offset (32-bits) */
+ #define NRSOFF32 0x08 /* 32-bit self-relative offset (32-bits) */
+ #endif
+
+
+ #define NRSRCMASK 0x0f /* Source type mask */
+ #define NRALIAS 0x10 /* Fixup to alias */
+ #define NRCHAIN 0x20 /* List of source offset follows */
+ /* fixup record, source offset field */
+ /* in fixup record contains number */
+ /* of elements in list */
+
+ /*
+ * Format of NR_FLAGS(x) and R32_FLAGS(x):
+ *
+ * 7 6 5 4 3 2 1 0 - bit no
+ * | | | | | | |
+ * | | | | | +-+--- Reference type
+ * | | | | +------- Additive fixup
+ * | | | +----------- 32-bit Target Offset Flag (1 - 32-bit; 0 - 16-bit)
+ * | | +------------- 32-bit Additive Flag (1 - 32-bit; 0 - 16-bit)
+ * | +--------------- 16-bit Object/Module ordinal (1 - 16-bit; 0 - 8-bit)
+ * +----------------- 8-bit import ordinal (1 - 8-bit;
+ * 0 - NR32BITOFF toggles
+ * between 16 and 32 bit
+ * ordinal)
+ */
+
+ #ifdef NEVER_INCLUDE_THE_FOLLWING
+ /* DEFINED in newexe.h !!! */
+ #define NRRTYP 0x03 /* Reference type mask */
+ #define NRRINT 0x00 /* Internal reference */
+ #define NRRORD 0x01 /* Import by ordinal */
+ #define NRRNAM 0x02 /* Import by name */
+ #define NRADD 0x04 /* Additive fixup */
+ #endif
+
+ #define NRRENT 0x03 /* Internal entry table fixup */
+
+ #define NR32BITOFF 0x10 /* 32-bit Target Offset */
+ #define NR32BITADD 0x20 /* 32-bit Additive fixup */
+ #define NR16OBJMOD 0x40 /* 16-bit Object/Module ordinal */
+ #define NR8BITORD 0x80 /* 8-bit import ordinal */
+ /*end*/
+
+ /*
+ * Data structures for storing run-time fixups in linker virtual memory.
+ *
+ * Each object has a list of Object Page Directories which specify
+ * fixups for given page. Each page has its own hash table which is
+ * used to detect fixups to the same target.
+ */
+
+ #define PAGEPERDIR 62
+ #define LG2DIR 7
+
+
+ typedef struct _OBJPAGEDIR
+ {
+ DWORD next; /* Virtual pointer to next dir on list */
+ WORD ht[PAGEPERDIR]; /* Pointers to individual hash tables */
+ }
+ OBJPAGEDIR;
+
+ /*
+ * OBJECT TABLE
+ */
+
+ /***ET+ o32_obj Object Table Entry */
+
+ struct o32_obj /* Flat .EXE object table entry */
+ {
+ unsigned long o32_size; /* Object virtual size */
+ unsigned long o32_base; /* Object base virtual address */
+ unsigned long o32_flags; /* Attribute flags */
+ unsigned long o32_pagemap; /* Object page map index */
+ unsigned long o32_mapsize; /* Number of entries in object page map */
+ unsigned long o32_reserved; /* Reserved */
+ };
+
+
+ #define O32_SIZE(x) (x).o32_size
+ #define O32_BASE(x) (x).o32_base
+ #define O32_FLAGS(x) (x).o32_flags
+ #define O32_PAGEMAP(x) (x).o32_pagemap
+ #define O32_MAPSIZE(x) (x).o32_mapsize
+ #define O32_RESERVED(x) (x).o32_reserved
+
+ /*
+ * Format of O32_FLAGS(x)
+ *
+ * High word of dword flag field is not used for now.
+ * Low word has the following format:
+ *
+ * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit no
+ * | | | | | | | | | | | | | | |
+ * | | | | | | | | | | | | | | +--- Readable Object
+ * | | | | | | | | | | | | | +----- Writeable Object
+ * | | | | | | | | | | | | +------- Executable Object
+ * | | | | | | | | | | | +--------- Resource Object
+ * | | | | | | | | | | +----------- Object is Discardable
+ * | | | | | | | | | +------------- Object is Shared
+ * | | | | | | | | +--------------- Object has preload pages
+ * | | | | | | | +----------------- Object has invalid pages
+ * | | | | | | +------------------- Object is permanent and swappable
+ * | | | | | +--------------------- Object is permanent and resident
+ * | | | | +----------------------- Object is permanent and long lockable
+ * | | | +----------------------------- 16:16 alias required (80x86 specific)
+ * | | +-------------------------------- Big/Default bit setting (80x86 specific)
+ * | +----------------------------------- Object is conforming for code (80x86 specific)
+ * +-------------------------------------- Object I/O privilege level (80x86 specific)
+ *
+ */
+
+ #define OBJREAD 0x0001L /* Readable Object */
+ #define OBJWRITE 0x0002L /* Writeable Object */
+ #define OBJRSRC 0x0008L /* Resource Object */
+ #define OBJINVALID 0x0080L /* Object has invalid pages */
+ #define LNKNONPERM 0x0600L /* Object is nonpermanent - should be */
+ #define OBJNONPERM 0x0000L /* zero in the .EXE but LINK386 uses 6 */
+ #define OBJPERM 0x0100L /* Object is permanent and swappable */
+ #define OBJRESIDENT 0x0200L /* Object is permanent and resident */
+ #define OBJCONTIG 0x0300L /* Object is resident and contiguous */
+ #define OBJDYNAMIC 0x0400L /* Object is permanent and long locable */
+ #define OBJTYPEMASK 0x0700L /* Object type mask */
+ #define OBJALIAS16 0x1000L /* 16:16 alias required (80x86 specific) */
+ #define OBJBIGDEF 0x2000L /* Big/Default bit setting (80x86 specific) */
+ #define OBJIOPL 0x8000L /* Object I/O privilege level (80x86 specific) */
+ #if FOR_EXEHDR
+ /*
+ * Name these flags differently for EXEHDR.EXE - avoid conflicts with 286 version
+ */
+ #define OBJDISCARD 0x0010L /* Object is Discardable */
+ #define OBJSHARED 0x0020L /* Object is Shared */
+ #define OBJPRELOAD 0x0040L /* Object has preload pages */
+ #define OBJEXEC 0x0004L /* Executable Object */
+ #define OBJCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */
+ #else
+ /*
+ * Life will be easier, if we keep the same names for the following flags:
+ */
+ #ifndef NSDISCARD
+ #define NSDISCARD 0x0010L /* Object is Discardable */
+ #endif
+ #ifndef NSMOVE
+ #define NSMOVE NSDISCARD /* Moveable object is for sure Discardable */
+ #endif
+ #ifndef NSSHARED
+ #define NSSHARED 0x0020L /* Object is Shared */
+ #endif
+ #ifndef NSPRELOAD
+ #define NSPRELOAD 0x0040L /* Object has preload pages */
+ #endif
+ #ifndef NSEXRD
+ #define NSEXRD 0x0004L /* Executable Object */
+ #endif
+ #ifndef NSCONFORM
+ #define NSCONFORM 0x4000L /* Object is conforming for code (80x86 specific) */
+ #endif
+ #endif
+ /*end*/
+
+ /***ET+ o32_map - Object Page Map entry */
+
+ struct o32_map /* Object Page Table entry */
+ {
+ unsigned long o32_pagedataoffset; /* file offset of page */
+ unsigned short o32_pagesize; /* # bytes of page data */
+ unsigned short o32_pageflags; /* Per-Page attributes */
+ };
+
+
+ #define GETPAGEIDX(x) ((x).o32_pagedataoffset)
+
+ #define PUTPAGEIDX(x,i) ((x).o32_pagedataoffset = ((unsigned long)(i)))
+
+ #define PUTPAGESIZ(x,i) ((x).o32_pagesize = ((unsigned int)(i)))
+
+ #define GETPAGESIZ(x) ((x).o32_pagesize)
+
+ #define PAGEFLAGS(x) (x).o32_pageflags
+
+
+ #define VALID 0x0000 /* Valid Physical Page in .EXE */
+ #define ITERDATA 0x0001 /* Iterated Data Page */
+ #define INVALID 0x0002 /* Invalid Page */
+ #define ZEROED 0x0003 /* Zero Filled Page */
+ #define RANGE 0x0004 /* Range of pages */
+ #define ITERDATA2 0x0005 /* Iterated Data Page Type II */
+ /*end*/
+
+ /*
+ * RESOURCE TABLE
+ */
+
+ /***ET+ rsrc32 - Resource Table Entry */
+
+ struct rsrc32 /* Resource Table Entry */
+ {
+ unsigned short type; /* Resource type */
+ unsigned short name; /* Resource name */
+ unsigned long cb; /* Resource size */
+ unsigned short obj; /* Object number */
+ unsigned long offset; /* Offset within object */
+ };
+ /*end*/
+
+
+ /*
+ * Iteration Record format for 'EXEPACK'ed pages.
+ */
+ struct LX_Iter
+ {
+ unsigned short LX_nIter; /* number of iterations */
+ unsigned short LX_nBytes; /* number of bytes */
+ unsigned char LX_Iterdata; /* iterated data byte(s) */
+ };
+
+
+ /*
+ * ENTRY TABLE DEFINITIONS
+ */
+
+ /***ET+ b32_bundle - Entry Table */
+
+ struct b32_bundle
+ {
+ unsigned char b32_cnt; /* Number of entries in this bundle */
+ unsigned char b32_type; /* Bundle type */
+ unsigned short b32_obj; /* Object number */
+ }; /* Follows entry types */
+
+ struct e32_entry
+ {
+ unsigned char e32_flags; /* Entry point flags */
+ union entrykind
+ {
+ RELOC_OFS e32_offset; /* 16-bit/32-bit offset entry */
+ struct callgate
+ {
+ unsigned short offset; /* Offset in segment */
+ unsigned short callgate; /* Callgate selector */
+ }
+ e32_callgate; /* 286 (16-bit) call gate */
+ struct fwd
+ {
+ unsigned short modord; /* Module ordinal number */
+ unsigned long value; /* Proc name offset or ordinal */
+ }
+ e32_fwd; /* Forwarder */
+ }
+ e32_variant; /* Entry variant */
+ };
+
+
+
+ #define B32_CNT(x) (x).b32_cnt
+ #define B32_TYPE(x) (x).b32_type
+ #define B32_OBJ(x) (x).b32_obj
+
+ #define E32_EFLAGS(x) (x).e32_flags
+ #define E32_OFFSET16(x) (x).e32_variant.e32_offset.offset16
+ #define E32_OFFSET32(x) (x).e32_variant.e32_offset.offset32
+ #define E32_GATEOFF(x) (x).e32_variant.e32_callgate.offset
+ #define E32_GATE(x) (x).e32_variant.e32_callgate.callgate
+ #define E32_MODORD(x) (x).e32_variant.e32_fwd.modord
+ #define E32_VALUE(x) (x).e32_variant.e32_fwd.value
+
+ #define FIXENT16 3
+ #define FIXENT32 5
+ #define GATEENT16 5
+ #define FWDENT 7
+
+ /*
+ * BUNDLE TYPES
+ */
+
+ #define EMPTY 0x00 /* Empty bundle */
+ #define ENTRY16 0x01 /* 16-bit offset entry point */
+ #define GATE16 0x02 /* 286 call gate (16-bit IOPL) */
+ #define ENTRY32 0x03 /* 32-bit offset entry point */
+ #define ENTRYFWD 0x04 /* Forwarder entry point */
+ #define TYPEINFO 0x80 /* Typing information present flag */
+
+
+ /*
+ * Format for E32_EFLAGS(x)
+ *
+ * 7 6 5 4 3 2 1 0 - bit no
+ * | | | | | | | |
+ * | | | | | | | +--- exported entry
+ * | | | | | | +----- uses shared data
+ * +-+-+-+-+-+------- parameter word count
+ */
+
+ #define E32EXPORT 0x01 /* Exported entry */
+ #define E32SHARED 0x02 /* Uses shared data */
+ #define E32PARAMS 0xf8 /* Parameter word count mask */
+
+ /*
+ * Flags for forwarders only:
+ */
+
+ #define FWD_ORDINAL 0x01 /* Imported by ordinal */
+
+
+ #pragma pack() /* Restore default alignment */
+
+ /*end*/
+
+ #endif /* __EXE386__ */
+
+#endif
diff --git a/sal/osl/os2/helpers/dosh.h b/sal/osl/os2/helpers/dosh.h
new file mode 100644
index 000000000000..fe51ee9bc488
--- /dev/null
+++ b/sal/osl/os2/helpers/dosh.h
@@ -0,0 +1,49 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* This file Copyright (C) 1997-2006 Ulrich M�ller,
+ * Dmitry A. Steklenev.
+ * This file is part of the "XWorkplace helpers" source package.
+ *
+ * 2009-06-15 published under LGPL3 with Ulrich M�ller permission.
+ *
+ */
+
+#if __cplusplus
+extern "C" {
+#endif
+
+#ifndef DOSH_HEADER_INCLUDED
+ #define DOSH_HEADER_INCLUDED
+
+ CHAR doshQueryBootDrive(VOID);
+
+#endif
+
+#if __cplusplus
+}
+#endif
diff --git a/sal/osl/os2/helpers/except.h b/sal/osl/os2/helpers/except.h
new file mode 100644
index 000000000000..af303a9827e3
--- /dev/null
+++ b/sal/osl/os2/helpers/except.h
@@ -0,0 +1,255 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*
+ *@@sourcefile except.h:
+ * header file for except.c. See remarks there.
+ *
+ * Note: Version numbering in this file relates to XWorkplace version
+ * numbering.
+ *
+ *@@include #define INCL_DOSEXCEPTIONS
+ *@@include #define INCL_DOSPROCESS
+ *@@include #include <os2.h>
+ *@@include #include <stdio.h>
+ *@@include #include <setjmp.h>
+ *@@include #include "helpers\except.h"
+ */
+
+/*
+ * Copyright (C) 1999-2000 Ulrich M�ller.
+ *
+ * 2009-06-15 published under LGPL3 with Ulrich M�ller permission.
+ *
+ */
+
+#if __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXCEPT_HEADER_INCLUDED
+ #define EXCEPT_HEADER_INCLUDED
+
+ #if defined __IBMCPP__ || defined __IBMC__
+ #ifndef INCL_DOSEXCEPTIONS
+ #error except.h requires INCL_DOSEXCEPTIONS to be defined.
+ #endif
+ #ifndef INCL_DOSPROCESS
+ #error except.h requires INCL_DOSPROCESS to be defined.
+ #endif
+
+ #ifndef __stdio_h
+ #error except.h requires stdio.h to be included.
+ #endif
+ #ifndef __setjmp_h
+ #error except.h requires setjmp.h to be included.
+ #endif
+ #endif
+
+ /********************************************************************
+ *
+ * Declarations
+ *
+ ********************************************************************/
+
+ // forward declaration
+ typedef struct _EXCEPTIONREGISTRATIONRECORD2 *PEXCEPTIONREGISTRATIONRECORD2;
+
+ // "OnKill" function prototype for EXCEPTIONREGISTRATIONRECORD2
+ // added V0.9.0 (99-10-22) [umoeller]
+ // removed V0.9.7 (2000-12-08) [umoeller]
+ // typedef VOID APIENTRY FNEXCONKILL(PEXCEPTIONREGISTRATIONRECORD2);
+ // typedef FNEXCONKILL *PFNEXCONKILL;
+
+ /*
+ *@@ EXCEPTIONREGISTRATIONRECORD2:
+ * replacement EXCEPTIONREGISTRATIONRECORD
+ * struct for thread exception handling.
+ *
+ *@@changed V0.9.0 (99-10-22) [umoeller]: pfnOnKill added
+ *@@changed V0.9.0 (99-10-22) [umoeller]: renamed from REGREC2
+ */
+
+ typedef struct _EXCEPTIONREGISTRATIONRECORD2
+ {
+ PVOID pNext; // as in EXCEPTIONREGISTRATIONRECORD
+ PFN pfnHandler; // as in EXCEPTIONREGISTRATIONRECORD
+ jmp_buf jmpThread; // additional buffer for setjmp
+ EXCEPTIONREPORTRECORD err; // exception handlers copy the report rec here
+ PVOID pvUser; // user ptr
+ } EXCEPTIONREGISTRATIONRECORD2;
+
+ /*
+ *@@ EXCEPTSTRUCT:
+ * structure used with TRY_xxx macros.
+ */
+
+ typedef struct _EXCEPTSTRUCT
+ {
+ EXCEPTIONREGISTRATIONRECORD2 RegRec2;
+ ULONG ulExcpt; // != NULL if exception caught
+ APIRET arc; // rc of DosSetExceptionHandler
+ } EXCEPTSTRUCT, *PEXCEPTSTRUCT;
+
+ // function prototypes for exception hooks (V0.9.0)
+
+ // "open traplog file" hook
+ typedef FILE* APIENTRY FNEXCOPENFILE(VOID);
+ typedef FNEXCOPENFILE *PFNEXCOPENFILE;
+
+ // "exception" hook
+ typedef VOID APIENTRY FNEXCHOOK(FILE*, PTIB, ULONG); // V0.9.16 (2001-12-02) [pr]
+ typedef FNEXCHOOK *PFNEXCHOOK;
+
+ // "error" hook
+ typedef VOID APIENTRY FNEXCHOOKERROR(const char *pcszFile,
+ ULONG ulLine,
+ const char *pcszFunction,
+ APIRET arc);
+ typedef FNEXCHOOKERROR *PFNEXCHOOKERROR;
+
+ /********************************************************************
+ *
+ * Prototypes
+ *
+ ********************************************************************/
+
+ VOID excExplainException(FILE *file,
+ PSZ pszHandlerName,
+ PEXCEPTIONREPORTRECORD pReportRec,
+ PCONTEXTRECORD pContextRec);
+
+ VOID excRegisterHooks(PFNEXCOPENFILE pfnExcOpenFileNew,
+ PFNEXCHOOK pfnExcHookNew,
+ PFNEXCHOOKERROR pfnExcHookError,
+ BOOL fBeepOnExceptionNew);
+
+ ULONG _System excHandlerLoud(PEXCEPTIONREPORTRECORD pReportRec,
+ PEXCEPTIONREGISTRATIONRECORD2 pRegRec2,
+ PCONTEXTRECORD pContextRec,
+ PVOID pv);
+
+ ULONG _System excHandlerQuiet(PEXCEPTIONREPORTRECORD pReportRec,
+ PEXCEPTIONREGISTRATIONRECORD2 pRegRec2,
+ PCONTEXTRECORD pContextRec,
+ PVOID pv);
+
+ extern PFNEXCHOOKERROR G_pfnExcHookError;
+
+ extern ULONG G_ulExplainExceptionRunning;
+
+ /********************************************************************
+ *
+ * Macros
+ *
+ ********************************************************************/
+
+ /* See except.c for explanations how to use these. */
+
+ #ifdef __NO_EXCEPTION_HANDLERS__
+ // exception handlers can completely be disabled
+ #define TRY_LOUD(excptstruct)
+ #else
+ #ifdef __NO_LOUD_EXCEPTION_HANDLERS__
+ #define TRY_LOUD(e) TRY_QUIET(e)
+ #else // __NO_LOUD_EXCEPTION_HANDLERS__
+ #define TRY_LOUD(excptstruct) \
+ { \
+ EXCEPTSTRUCT excptstruct = {0}; \
+ excptstruct.RegRec2.pfnHandler = (PFN)excHandlerLoud; \
+ excptstruct.arc = DosSetExceptionHandler( \
+ (PEXCEPTIONREGISTRATIONRECORD)&(excptstruct.RegRec2)); \
+ if (excptstruct.arc) \
+ if (G_pfnExcHookError) \
+ G_pfnExcHookError(__FILE__, __LINE__, __FUNCTION__, excptstruct.arc); \
+ else \
+ DosBeep(1000, 1000); \
+ excptstruct.ulExcpt = setjmp(excptstruct.RegRec2.jmpThread); \
+ if (excptstruct.ulExcpt == 0) \
+ {
+
+ #endif // __NO_LOUD_EXCEPTION_HANDLERS__
+ #endif
+
+ #ifdef __NO_EXCEPTION_HANDLERS__
+ // exception handlers can completely be disabled
+ #define TRY_QUIET(excptstruct)
+ #else
+ #define TRY_QUIET(excptstruct) \
+ { \
+ EXCEPTSTRUCT excptstruct = {0}; \
+ excptstruct.RegRec2.pfnHandler = (PFN)excHandlerQuiet; \
+ excptstruct.arc = DosSetExceptionHandler( \
+ (PEXCEPTIONREGISTRATIONRECORD)&(excptstruct.RegRec2)); \
+ if (excptstruct.arc) \
+ if (G_pfnExcHookError) \
+ G_pfnExcHookError(__FILE__, __LINE__, __FUNCTION__, excptstruct.arc); \
+ else \
+ DosBeep(1000, 1000); \
+ excptstruct.ulExcpt = setjmp(excptstruct.RegRec2.jmpThread); \
+ if (excptstruct.ulExcpt == 0) \
+ {
+
+ #endif
+
+ #ifdef __NO_EXCEPTION_HANDLERS__
+ // exception handlers can completely be disabled
+ #define CATCH(excptstruct) if (FALSE) {
+ #else
+ #define CATCH(excptstruct) \
+ DosUnsetExceptionHandler( \
+ (PEXCEPTIONREGISTRATIONRECORD)&(excptstruct.RegRec2)); \
+ } /* end of TRY block */ \
+ else \
+ { /* exception occured: */ \
+ DosUnsetExceptionHandler((PEXCEPTIONREGISTRATIONRECORD)&(excptstruct.RegRec2));
+ #endif
+
+ #ifdef __NO_EXCEPTION_HANDLERS__
+ // exception handlers can completely be disabled
+ #define END_CATCH() }
+ #else
+ #define END_CATCH() \
+ } /* end of exception-occured block */ \
+ }
+ #endif
+
+ /*
+ * CRASH:
+ * this macro is helpful for testing
+ * the exception handlers.
+ * This is not for general use. ;-)
+ */
+
+ #define CRASH {PSZ p = NULL; *p = 'a'; }
+
+#endif // EXCEPT_HEADER_INCLUDED
+
+#if __cplusplus
+}
+#endif
+
diff --git a/sal/osl/os2/helpers/setup.h b/sal/osl/os2/helpers/setup.h
new file mode 100644
index 000000000000..b9c6e50f0111
--- /dev/null
+++ b/sal/osl/os2/helpers/setup.h
@@ -0,0 +1,147 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*
+ * setup.h:
+ * sample master include file which gets included
+ * from all helpers *.c sources.
+ */
+
+#ifndef SETUP_HEADER_INCLUDED
+ #define SETUP_HEADER_INCLUDED
+
+ // XWPEXPORT defines the standard linkage for the
+ // XWorkplace helpers.
+ #ifdef __EMX__
+ #define XWPENTRY
+ #elif defined (__IBMCPP__) || defined (__IBMC__)
+ #define XWPENTRY _Optlink
+ #endif
+
+ /*************************************************************
+ * *
+ * Additional stuff for EMX *
+ * *
+ *************************************************************/
+
+ #ifdef __EMX__
+ // EMX doesn't have all these 16-bit typedefs;
+ // added (99-10-22) [umoeller]
+ #define APIENTRY16 _Far16 _Pascal
+ #define PASCAL16 _Far16 _Pascal
+ #define CDECL16 _Far16 _Cdecl
+
+ typedef unsigned short APIRET16;
+ typedef unsigned long APIRET32;
+
+#if 0
+//YD do not use with gcc 3.3.5
+ #define _System
+ #define APIENTRY
+ // with VAC++, this defines _System linkage, which
+ // EMX doesn't have, or does it?!?
+#endif // 0
+
+ #endif
+
+ // the following is a VAC++-specific macro, which doesn't exist
+ // with EMX, so we need to implement this... this was one of
+ // the "undefined symbols" we got (99-10-23) [umoeller]
+ // changed this to prefix underscore, because the STL apparently
+ // redefines this V0.9.3 (2000-05-15) [umoeller]
+ #define _min(a,b) ( ((a) > (b)) ? b : a )
+ #define _max(a,b) ( ((a) > (b)) ? a : b )
+
+ // Uncomment the following if you have trouble with the
+ // exception handlers in helpers\except.c; WarpIN will
+ // then install _no_ additional exception handlers at all
+ // (include\helpers\except.h reacts to these defines).
+ // I'm not sure if the handlers work well with EMX.
+
+ #ifdef __EMX__00
+ #define __NO_EXCEPTION_HANDLERS__
+ #endif
+
+ /*************************************************************
+ * *
+ * Additional stuff for VAC++ 3.0 *
+ * *
+ *************************************************************/
+
+ // all this added V0.9.2 (2000-03-10) [umoeller]
+ #if ( defined ( __IBMCPP__ ) && ( __IBMCPP__ < 400 ) )
+ typedef int bool;
+ #define true 1
+ #define false 0
+ #define _BooleanConst // needed for some VAC headers, which define bool also
+ #endif
+
+ #ifndef __stdlib_h // <stdlib.h>
+ #include <stdlib.h>
+ #endif
+ #ifndef __string_h // <string.h>
+ #include <string.h>
+ #endif
+
+ /*************************************************************
+ * *
+ * Debugging *
+ * *
+ *************************************************************/
+
+ // All the following redone (99-10-23) [umoeller]:
+ // __DEBUG__ is defined as a macro on the compiler
+ // command line by the makefiles if DEBUG was enabled
+ // in \setup.in
+ #ifdef __DEBUG__
+
+ // with debug code, disable the exception handlers
+ #define __NO_EXCEPTION_HANDLERS__
+
+ // If the following is commented out, no PMPRINTF will be
+ // used at all. WarpIN uses Dennis Bareis' PMPRINTF
+ // package to do this.
+
+ // NOTE: We cannot use PmPrintf with EMX,
+ // because pmprintf.lib imports the VAC++ runtimes.
+ // That's the strange errors I was reporting yesterday.
+ #ifndef __EMX__
+ #ifdef OS2_INCLUDED
+ #define _PMPRINTF_
+ #include "helpers/pmprintf.h"
+ #endif
+ #endif
+ #endif
+
+ #ifndef _PMPRINTF_
+ // not defined: define empty macro so we don't
+ // get compiler errors
+ #define _Pmpf(x)
+ #endif
+
+#endif
+
diff --git a/sal/osl/os2/interlck.c b/sal/osl/os2/interlck.c
new file mode 100644
index 000000000000..589005f215b9
--- /dev/null
+++ b/sal/osl/os2/interlck.c
@@ -0,0 +1,51 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <386/builtin.h>
+
+#include "system.h"
+
+#include <osl/interlck.h>
+#include <osl/diagnose.h>
+
+/*****************************************************************************/
+/* osl_incrementInterlockedCount */
+/*****************************************************************************/
+oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount)
+{
+ return __atomic_increment_s32( pCount);
+}
+
+/*****************************************************************************/
+/* osl_decrementInterlockedCount */
+/*****************************************************************************/
+oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount)
+{
+ return __atomic_decrement_s32( pCount);
+}
+
+
diff --git a/sal/osl/os2/libutil.c b/sal/osl/os2/libutil.c
new file mode 100644
index 000000000000..e0f94a8b3235
--- /dev/null
+++ b/sal/osl/os2/libutil.c
@@ -0,0 +1,52 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if 0 // YD
+
+#include <windows.h>
+
+static BOOL g_bInit = FALSE;
+static DWORD g_dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;
+
+DWORD GetPlatformId()
+{
+
+ if (!g_bInit)
+ {
+ OSVERSIONINFO aInfo;
+
+ aInfo.dwOSVersionInfoSize = sizeof(aInfo);
+ if (GetVersionEx(&aInfo))
+ g_dwPlatformId = aInfo.dwPlatformId;
+
+ g_bInit = TRUE;
+ }
+
+ return g_dwPlatformId;
+}
+
+#endif // 0
diff --git a/sal/osl/os2/makefile.mk b/sal/osl/os2/makefile.mk
new file mode 100644
index 000000000000..c9bfd3f96771
--- /dev/null
+++ b/sal/osl/os2/makefile.mk
@@ -0,0 +1,118 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=sal
+TARGET=cpposl
+USE_LDUMP2=TRUE
+
+PROJECTPCH4DLL=TRUE
+PROJECTPCH=cont_pch
+PROJECTPCHSOURCE=cont_pch
+
+MULTITHREAD_OBJ=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# Uncomment the following line if you want to compile with -Wall
+# it disables lots of unnecessary warnings comming from the Win32
+# header files (disabling warnings via command line only works with
+# MSVC >= 7.x)
+#
+# CFLAGS+=/wd4668 /wd4711 /wd4201 /wd4710 /wd4619 /wd4514 /wd4820
+
+# --- Files --------------------------------------------------------
+
+.IF "$(header)" == ""
+
+SLOFILES= $(SLO)$/conditn.obj \
+ $(SLO)$/diagnose.obj \
+ $(SLO)$/dllentry.obj \
+ $(SLO)$/semaphor.obj \
+ $(SLO)$/interlck.obj \
+ $(SLO)$/nlsupport.obj\
+ $(SLO)$/mutex.obj \
+ $(SLO)$/module.obj \
+ $(SLO)$/process.obj \
+ $(SLO)$/time.obj \
+ $(SLO)$/signal.obj \
+ $(SLO)$/pipe.obj \
+ $(SLO)$/util.obj \
+ $(SLO)$/socket.obj \
+ $(SLO)$/thread.obj \
+ $(SLO)$/security.obj \
+ $(SLO)$/profile.obj \
+ $(SLO)$/tempfile.obj \
+ $(SLO)$/process_impl.obj\
+ $(SLO)$/uunxapi.obj\
+ $(SLO)$/file.obj \
+ $(SLO)$/file_url.obj \
+ $(SLO)$/file_error_transl.obj \
+ $(SLO)$/file_path_helper.obj \
+ $(SLO)$/debug.obj \
+ $(SLO)$/except.obj \
+ $(SLO)$/salinit.obj
+
+OBJFILES= $(OBJ)$/conditn.obj \
+ $(OBJ)$/diagnose.obj \
+ $(OBJ)$/libutil.obj \
+ $(OBJ)$/semaphor.obj \
+ $(OBJ)$/interlck.obj \
+ $(OBJ)$/nlsupport.obj\
+ $(OBJ)$/mutex.obj \
+ $(OBJ)$/module.obj \
+ $(OBJ)$/process.obj \
+ $(OBJ)$/time.obj \
+ $(OBJ)$/signal.obj \
+ $(OBJ)$/pipe.obj \
+ $(OBJ)$/util.obj \
+ $(OBJ)$/socket.obj \
+ $(OBJ)$/thread.obj \
+ $(OBJ)$/security.obj \
+ $(OBJ)$/profile.obj \
+ $(OBJ)$/tempfile.obj \
+ $(OBJ)$/process_impl.obj\
+ $(OBJ)$/uunxapi.obj\
+ $(OBJ)$/file.obj \
+ $(OBJ)$/file_url.obj \
+ $(OBJ)$/file_error_transl.obj \
+ $(OBJ)$/file_path_helper.obj \
+ $(OBJ)$/debug.obj \
+ $(OBJ)$/except.obj \
+ $(SLO)$/salinit.obj
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+
+
diff --git a/sal/osl/os2/module.c b/sal/osl/os2/module.c
new file mode 100644
index 000000000000..421b78195d83
--- /dev/null
+++ b/sal/osl/os2/module.c
@@ -0,0 +1,281 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/module.h>
+#include <osl/diagnose.h>
+#include <osl/file.h>
+#include <osl/thread.h>
+
+#include <stdlib.h>
+
+int UnicodeToText(char *, size_t, const sal_Unicode *, sal_Int32);
+
+// static data for holding SAL dll module and full path
+static HMODULE hModSal;
+static char szSalDir[ _MAX_PATH];
+static char szSalDrive[ _MAX_PATH];
+
+/*****************************************************************************/
+/* osl_loadModule */
+/*****************************************************************************/
+
+ULONG APIENTRY _DosLoadModule (PSZ pszObject, ULONG uObjectLen, PCSZ pszModule,
+ PHMODULE phmod)
+{
+ APIRET rc;
+ rc = DosLoadModule( pszObject, uObjectLen, pszModule, phmod);
+ // YD 22/05/06 issue again if first call fails (why?)
+ if (rc == ERROR_INVALID_PARAMETER)
+ rc = DosLoadModule( pszObject, uObjectLen, pszModule, phmod);
+ return rc;
+}
+
+oslModule SAL_CALL osl_loadModule(rtl_uString *ustrModuleName, sal_Int32 nRtldMode)
+{
+ HMODULE hModule;
+ BYTE szErrorMessage[256];
+ APIRET rc;
+ oslModule pModule=0;
+ rtl_uString* ustrTmp = NULL;
+
+ OSL_ENSURE(ustrModuleName,"osl_loadModule : string is not valid");
+
+ /* ensure ustrTmp hold valid string */
+ if( osl_File_E_None != osl_getSystemPathFromFileURL( ustrModuleName, &ustrTmp ) )
+ rtl_uString_assign( &ustrTmp, ustrModuleName );
+
+ if( ustrTmp )
+ {
+ char buffer[PATH_MAX];
+
+ if( UnicodeToText( buffer, PATH_MAX, ustrTmp->buffer, ustrTmp->length ) )
+ {
+ char drive[_MAX_DRIVE], dir[_MAX_DIR];
+ char fname[_MAX_FNAME], ext[_MAX_EXT];
+ char* dot;
+ // 21/02/2006 YD dll names must be 8.3: since .uno.dll files
+ // have hardcoded names, I'm truncating names here and also in
+ // the build system
+ _splitpath (buffer, drive, dir, fname, ext);
+ if (strlen(fname)>8)
+ fname[8] = 0; // truncate to 8.3
+ dot = strchr( fname, '.');
+ if (dot)
+ *dot = '\0'; // truncate on dot
+ // if drive is not specified, remove starting \ from dir name
+ // so dll is loaded from LIBPATH
+ if (drive[0] == 0 && dir[0] == '\\' && dir[1] == '\\') {
+ while( dir[0] == '\\')
+ strcpy( dir, dir+1);
+ }
+ _makepath( buffer, drive, dir, fname, ext);
+
+ rc = _DosLoadModule( szErrorMessage, sizeof( szErrorMessage), (PCSZ)buffer, &hModule);
+ if (rc == NO_ERROR )
+ pModule = (oslModule)hModule;
+ else
+ {
+ if (rc == NO_ERROR )
+ pModule = (oslModule)hModule;
+ else
+ {
+ sal_Char szError[ PATH_MAX*2 ];
+ sprintf( szError, "Module: %s; rc: %d;\nReason: %s;\n"
+ "Please contact technical support and report above informations.\n\n",
+ buffer, rc, szErrorMessage );
+#if OSL_DEBUG_LEVEL>0
+ fprintf( stderr, szError);
+#endif
+ //OSL_TRACE(szError);
+#ifndef OSL_DEBUG_LEVEL
+ WinMessageBox(HWND_DESKTOP,HWND_DESKTOP,
+ szError, "Critical error: DosLoadModule failed",
+ 0, MB_ERROR | MB_OK | MB_MOVEABLE);
+#endif
+ }
+ }
+ }
+ }
+
+ rtl_uString_release( ustrTmp );
+
+ return pModule;
+}
+
+/*****************************************************************************/
+/* osl_getModuleHandle */
+/*****************************************************************************/
+
+sal_Bool SAL_CALL
+osl_getModuleHandle(rtl_uString *pModuleName, oslModule *pResult)
+{
+ HMODULE hmod;
+ APIRET rc;
+ rc = DosQueryModuleHandle(pModuleName->buffer, &hmod);
+ if( rc == NO_ERROR)
+ {
+ *pResult = (oslModule) hmod;
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_unloadModule */
+/*****************************************************************************/
+void SAL_CALL osl_unloadModule(oslModule Module)
+{
+#if OSL_DEBUG_LEVEL>0
+ if (!Module)
+ fprintf( stderr, "osl_unloadModule NULL HANDLE.\n");
+#endif
+
+ DosFreeModule((HMODULE)Module);
+}
+
+/*****************************************************************************/
+/* osl_getSymbol */
+/*****************************************************************************/
+void* SAL_CALL
+osl_getSymbol(oslModule Module, rtl_uString* pSymbolName)
+{
+ return (void *) osl_getFunctionSymbol(Module, pSymbolName);
+}
+
+/*****************************************************************************/
+/* osl_getFunctionSymbol */
+/*****************************************************************************/
+oslGenericFunction SAL_CALL osl_getFunctionSymbol( oslModule Module, rtl_uString *strSymbolName )
+{
+ rtl_String *symbolName = NULL;
+ oslGenericFunction address;
+
+ OSL_ASSERT(Module);
+ OSL_ASSERT(strSymbolName);
+
+ rtl_uString2String(
+ &symbolName,
+ strSymbolName->buffer,
+ strSymbolName->length,
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS
+ );
+
+ address=osl_getAsciiFunctionSymbol(Module, rtl_string_getStr(symbolName));
+ rtl_string_release(symbolName);
+
+ return address;
+}
+
+/*****************************************************************************/
+/* osl_getAsciiFunctionSymbol */
+/*****************************************************************************/
+oslGenericFunction SAL_CALL
+osl_getAsciiFunctionSymbol( oslModule Module, const sal_Char *pSymbol )
+{
+ PFN pFunction;
+ APIRET rc;
+ void* pHandle=0;
+
+ OSL_ENSURE(Module,"osl_getSymbol : module handle is not valid");
+ OSL_ENSURE(Module,"osl_getSymbol : ustrSymbolName");
+
+ if ( Module!= 0 && pSymbol != 0 )
+ {
+
+ rc = DosQueryProcAddr( (HMODULE) Module, 0, (PCSZ)pSymbol, &pFunction );
+ if( rc == NO_ERROR )
+ {
+ pHandle = (void*)pFunction;
+ }
+ else
+ {
+ // YD try again adding the '_' prefix
+ char _pszSymbolName[255];
+ strcpy( _pszSymbolName, "_");
+ strcat( _pszSymbolName, pSymbol);
+ rc = DosQueryProcAddr( (HMODULE) Module, 0, (PCSZ)_pszSymbolName, &pFunction );
+ if( rc == NO_ERROR )
+ pHandle = (void*)pFunction;
+ }
+
+ }
+
+ return pHandle;
+}
+
+/*****************************************************************************/
+/* osl_getModuleURLFromAddress */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibraryUrl)
+{
+ //APIRET APIENTRY DosQueryModFromEIP (HMODULE *phMod, ULONG *pObjNum,
+ // ULONG BuffLen, PCHAR pBuff, ULONG *pOffset, ULONG Address)
+ HMODULE hMod;
+ ULONG ObjNum;
+ CHAR Buff[2*_MAX_PATH];
+ ULONG Offset;
+ APIRET rc;
+
+ // get module handle (and name)
+ rc = DosQueryModFromEIP( &hMod, &ObjNum, sizeof( Buff), Buff, &Offset, (ULONG)addr);
+ if (rc)
+ return sal_False;
+
+ // get module full path
+ rc = DosQueryModuleName( hMod, sizeof( Buff), Buff);
+ if (rc)
+ return sal_False;
+
+#if OSL_DEBUG_LEVEL > 1
+ OSL_TRACE("module.c::osl_getModuleURLFromAddress - %s\n", Buff);
+#endif
+
+ // convert to URL
+ rtl_uString *ustrSysPath = NULL;
+ rtl_string2UString( &ustrSysPath, Buff, strlen(Buff), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(ustrSysPath != NULL);
+ osl_getFileURLFromSystemPath( ustrSysPath, ppLibraryUrl );
+ rtl_uString_release( ustrSysPath );
+
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_getModuleURLFromFunctionAddress */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_getModuleURLFromFunctionAddress( oslGenericFunction addr, rtl_uString ** ppLibraryUrl )
+{
+ return osl_getModuleURLFromAddress( ( void * )addr, ppLibraryUrl );
+}
+
+/*****************************************************************************/
+
diff --git a/sal/osl/os2/mutex.c b/sal/osl/os2/mutex.c
new file mode 100644
index 000000000000..e86b3f965608
--- /dev/null
+++ b/sal/osl/os2/mutex.c
@@ -0,0 +1,167 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <sys/fmutex.h>
+
+#include "system.h"
+
+#include <osl/mutex.h>
+#include <osl/diagnose.h>
+
+/*
+ Implementation notes:
+ The void* hidden by oslMutex points to an OS/2 mutex semaphore.
+*/
+typedef struct _oslMutexImpl {
+ HMTX m_Mutex;
+ int m_Locks;
+ ULONG m_Owner;
+ ULONG m_Requests;
+} oslMutexImpl;
+
+// static mutex to control access to private members of oslMutexImpl
+static HMTX MutexLock = 0;
+
+/*****************************************************************************/
+/* osl_createMutex */
+/*****************************************************************************/
+oslMutex SAL_CALL osl_createMutex()
+{
+ oslMutexImpl *pMutexImpl;
+ HMTX hMutex;
+ APIRET rc;
+
+ pMutexImpl= (oslMutexImpl*)calloc(sizeof(oslMutexImpl), 1);
+ OSL_ASSERT(pMutexImpl); /* alloc successful? */
+
+ /* create semaphore */
+ rc = DosCreateMutexSem( NULL, &pMutexImpl->m_Mutex, 0, FALSE );
+ if( rc != 0 )
+ {
+ free(pMutexImpl);
+ return NULL;
+ }
+
+ // create static mutex for private members
+ if (MutexLock == 0)
+ DosCreateMutexSem( NULL, &MutexLock, 0, FALSE );
+
+ return (oslMutex)pMutexImpl;
+}
+
+/*****************************************************************************/
+/* osl_destroyMutex */
+/*****************************************************************************/
+void SAL_CALL osl_destroyMutex(oslMutex Mutex)
+{
+ oslMutexImpl *pMutexImpl = (oslMutexImpl *)Mutex;
+ if (pMutexImpl)
+ {
+ DosCloseMutexSem( pMutexImpl->m_Mutex);
+ free(pMutexImpl);
+ }
+}
+
+/*****************************************************************************/
+/* osl_acquireMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_acquireMutex(oslMutex Mutex)
+{
+ oslMutexImpl *pMutexImpl = (oslMutexImpl *)Mutex;
+ APIRET rc = 0;
+ OSL_ASSERT(Mutex);
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+ pMutexImpl->m_Requests++;
+ DosReleaseMutexSem( MutexLock);
+
+ rc = DosRequestMutexSem( pMutexImpl->m_Mutex, SEM_INDEFINITE_WAIT );
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+ pMutexImpl->m_Requests--;
+ if (pMutexImpl->m_Locks++ == 0)
+ pMutexImpl->m_Owner = _gettid();
+ DosReleaseMutexSem( MutexLock);
+
+ return( rc == 0 );
+}
+
+/*****************************************************************************/
+/* osl_tryToAcquireMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_tryToAcquireMutex(oslMutex Mutex)
+{
+ sal_Bool ret = sal_False;
+ oslMutexImpl *pMutexImpl = (oslMutexImpl *)Mutex;
+ OSL_ASSERT(Mutex);
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+
+ if ( ((pMutexImpl->m_Requests == 0) && (pMutexImpl->m_Locks == 0)) ||
+ (pMutexImpl->m_Owner == _gettid()) )
+ ret = osl_acquireMutex(Mutex);
+
+ DosReleaseMutexSem( MutexLock);
+
+ return ret;
+}
+
+/*****************************************************************************/
+/* osl_releaseMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_releaseMutex(oslMutex Mutex)
+{
+ oslMutexImpl *pMutexImpl = (oslMutexImpl *)Mutex;
+ APIRET rc;
+ OSL_ASSERT(Mutex);
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+
+ if (--(pMutexImpl->m_Locks) == 0)
+ pMutexImpl->m_Owner = 0;
+
+ DosReleaseMutexSem( MutexLock);
+
+ rc = DosReleaseMutexSem( pMutexImpl->m_Mutex);
+
+ return sal_True;
+}
+
+
+
+/*****************************************************************************/
+/* osl_getGlobalMutex */
+/*****************************************************************************/
+
+oslMutex g_Mutex = NULL;
+
+oslMutex * SAL_CALL osl_getGlobalMutex(void)
+{
+ if (g_Mutex == NULL)
+ g_Mutex = osl_createMutex();
+ return &g_Mutex;
+}
diff --git a/sal/osl/os2/nlsupport.c b/sal/osl/os2/nlsupport.c
new file mode 100644
index 000000000000..ab00443e57d7
--- /dev/null
+++ b/sal/osl/os2/nlsupport.c
@@ -0,0 +1,445 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define INCL_WIN
+#include "svpm.h"
+
+#include <osl/nlsupport.h>
+#include <osl/diagnose.h>
+#include <osl/process.h>
+#include <rtl/memory.h>
+
+#include <string.h>
+
+/*****************************************************************************
+ typedefs
+ *****************************************************************************/
+
+
+typedef struct {
+ const char *key;
+ const rtl_TextEncoding value;
+} _pair;
+
+
+/*****************************************************************************
+ compare function for binary search
+ *****************************************************************************/
+
+static int
+_pair_compare (const char *key, const _pair *pair)
+{
+ int result = rtl_str_compareIgnoreAsciiCase( key, pair->key );
+ return result;
+}
+
+/*****************************************************************************
+ binary search on encoding tables
+ *****************************************************************************/
+
+static const _pair*
+_pair_search (const char *key, const _pair *base, unsigned int member )
+{
+ unsigned int lower = 0;
+ unsigned int upper = member;
+ unsigned int current;
+ int comparison;
+
+ /* check for validity of input */
+ if ( (key == NULL) || (base == NULL) || (member == 0) )
+ return NULL;
+
+ /* binary search */
+ while ( lower < upper )
+ {
+ current = (lower + upper) / 2;
+ comparison = _pair_compare( key, base + current );
+ if (comparison < 0)
+ upper = current;
+ else if (comparison > 0)
+ lower = current + 1;
+ else
+ return base + current;
+ }
+
+ return NULL;
+}
+
+
+/*****************************************************************************
+ convert rtl_Locale to locale string
+ *****************************************************************************/
+
+static char * _compose_locale( rtl_Locale * pLocale, char * buffer, size_t n )
+{
+ /* check if a valid locale is specified */
+ if( pLocale && pLocale->Language && (pLocale->Language->length == 2) )
+ {
+ size_t offset = 0;
+
+ /* convert language code to ascii */
+ {
+ rtl_String *pLanguage = NULL;
+
+ rtl_uString2String( &pLanguage,
+ pLocale->Language->buffer, pLocale->Language->length,
+ RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ if( pLanguage->length < n )
+ {
+ strcpy( buffer, pLanguage->buffer );
+ offset = pLanguage->length;
+ }
+
+ rtl_string_release( pLanguage );
+ }
+
+ /* convert country code to ascii */
+ if( pLocale->Country && (pLocale->Country->length == 2) )
+ {
+ rtl_String *pCountry = NULL;
+
+ rtl_uString2String( &pCountry,
+ pLocale->Country->buffer, pLocale->Country->length,
+ RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ if( offset + pCountry->length + 1 < n )
+ {
+ strcpy( buffer + offset++, "_" );
+ strcpy( buffer + offset, pCountry->buffer );
+ offset += pCountry->length;
+ }
+
+ rtl_string_release( pCountry );
+ }
+
+ /* convert variant to ascii - check if there is enough space for the variant string */
+ if( pLocale->Variant && pLocale->Variant->length &&
+ ( pLocale->Variant->length < n - 6 ) )
+ {
+ rtl_String *pVariant = NULL;
+
+ rtl_uString2String( &pVariant,
+ pLocale->Variant->buffer, pLocale->Variant->length,
+ RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ if( offset + pVariant->length + 1 < n )
+ {
+ strcpy( buffer + offset, pVariant->buffer );
+ offset += pVariant->length;
+ }
+
+ rtl_string_release( pVariant );
+ }
+
+ return buffer;
+ }
+
+ return NULL;
+}
+
+/*****************************************************************************
+ convert locale string to rtl_Locale
+ *****************************************************************************/
+
+static rtl_Locale * _parse_locale( const char * locale )
+{
+ static sal_Unicode c_locale[2] = { (sal_Unicode) 'C', 0 };
+
+ /* check if locale contains a valid string */
+ if( locale )
+ {
+ size_t len = strlen( locale );
+
+ if( len >= 2 )
+ {
+ rtl_uString * pLanguage = NULL;
+ rtl_uString * pCountry = NULL;
+ rtl_uString * pVariant = NULL;
+
+ size_t offset = 2;
+
+ /* convert language code to unicode */
+ rtl_string2UString( &pLanguage, locale, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pLanguage != NULL);
+
+ /* convert country code to unicode */
+ if( len >= 5 && '_' == locale[2] )
+ {
+ rtl_string2UString( &pCountry, locale + 3, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pCountry != NULL);
+ offset = 5;
+ }
+
+ /* convert variant code to unicode - do not rely on "." as delimiter */
+ if( len > offset ) {
+ rtl_string2UString( &pVariant, locale + offset, len - offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pVariant != NULL);
+ }
+
+ rtl_Locale * ret = rtl_locale_register( pLanguage->buffer, pCountry ? pCountry->buffer : c_locale + 1, pVariant ? pVariant->buffer : c_locale + 1 );
+
+ if (pVariant) rtl_uString_release(pVariant);
+ if (pCountry) rtl_uString_release(pCountry);
+ if (pLanguage) rtl_uString_release(pLanguage);
+
+ return ret;
+ }
+ else
+ return rtl_locale_register( c_locale, c_locale + 1, c_locale + 1 );
+ }
+
+ return NULL;
+}
+
+/*
+ * This implementation of osl_getTextEncodingFromLocale maps
+ * from the ISO language codes.
+ */
+
+const _pair _full_locale_list[] = {
+ { "ja_JP.eucJP", RTL_TEXTENCODING_EUC_JP },
+ { "ja_JP.EUC", RTL_TEXTENCODING_EUC_JP },
+ { "ko_KR.EUC", RTL_TEXTENCODING_EUC_KR },
+ { "zh_CN.EUC", RTL_TEXTENCODING_EUC_CN },
+ { "zh_TW.EUC", RTL_TEXTENCODING_EUC_TW }
+};
+
+const _pair _locale_extension_list[] = {
+ { "big5", RTL_TEXTENCODING_BIG5 },
+ { "big5hk", RTL_TEXTENCODING_BIG5_HKSCS },
+ { "gb18030", RTL_TEXTENCODING_GB_18030 },
+ { "euc", RTL_TEXTENCODING_EUC_JP },
+ { "iso8859-1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "iso8859-10", RTL_TEXTENCODING_ISO_8859_10 },
+ { "iso8859-13", RTL_TEXTENCODING_ISO_8859_13 },
+ { "iso8859-14", RTL_TEXTENCODING_ISO_8859_14 },
+ { "iso8859-15", RTL_TEXTENCODING_ISO_8859_15 },
+ { "iso8859-2", RTL_TEXTENCODING_ISO_8859_2 },
+ { "iso8859-3", RTL_TEXTENCODING_ISO_8859_3 },
+ { "iso8859-4", RTL_TEXTENCODING_ISO_8859_4 },
+ { "iso8859-5", RTL_TEXTENCODING_ISO_8859_5 },
+ { "iso8859-6", RTL_TEXTENCODING_ISO_8859_6 },
+ { "iso8859-7", RTL_TEXTENCODING_ISO_8859_7 },
+ { "iso8859-8", RTL_TEXTENCODING_ISO_8859_8 },
+ { "iso8859-9", RTL_TEXTENCODING_ISO_8859_9 },
+ { "koi8-r", RTL_TEXTENCODING_KOI8_R },
+ { "koi8-u", RTL_TEXTENCODING_KOI8_U },
+ { "pck", RTL_TEXTENCODING_MS_932 },
+#if (0)
+ { "sun_eu_greek", RTL_TEXTENCODING_DONTKNOW },
+#endif
+ { "utf-16", RTL_TEXTENCODING_UNICODE },
+ { "utf-7", RTL_TEXTENCODING_UTF7 },
+ { "utf-8", RTL_TEXTENCODING_UTF8 }
+};
+
+const _pair _iso_language_list[] = {
+ { "af", RTL_TEXTENCODING_ISO_8859_1 },
+ { "ar", RTL_TEXTENCODING_ISO_8859_6 },
+ { "az", RTL_TEXTENCODING_ISO_8859_9 },
+ { "be", RTL_TEXTENCODING_ISO_8859_5 },
+ { "bg", RTL_TEXTENCODING_ISO_8859_5 },
+ { "ca", RTL_TEXTENCODING_ISO_8859_1 },
+ { "cs", RTL_TEXTENCODING_ISO_8859_2 },
+ { "da", RTL_TEXTENCODING_ISO_8859_1 },
+ { "de", RTL_TEXTENCODING_ISO_8859_1 },
+ { "el", RTL_TEXTENCODING_ISO_8859_7 },
+ { "en", RTL_TEXTENCODING_ISO_8859_1 },
+ { "es", RTL_TEXTENCODING_ISO_8859_1 },
+ { "et", RTL_TEXTENCODING_ISO_8859_4 },
+ { "eu", RTL_TEXTENCODING_ISO_8859_1 },
+ { "fa", RTL_TEXTENCODING_ISO_8859_6 },
+ { "fi", RTL_TEXTENCODING_ISO_8859_1 },
+ { "fo", RTL_TEXTENCODING_ISO_8859_1 },
+ { "fr", RTL_TEXTENCODING_ISO_8859_1 },
+ { "gr", RTL_TEXTENCODING_ISO_8859_7 },
+ { "he", RTL_TEXTENCODING_ISO_8859_8 },
+ { "hi", RTL_TEXTENCODING_DONTKNOW },
+ { "hr", RTL_TEXTENCODING_ISO_8859_2 },
+ { "hu", RTL_TEXTENCODING_ISO_8859_2 },
+ { "hy", RTL_TEXTENCODING_DONTKNOW },
+ { "id", RTL_TEXTENCODING_ISO_8859_1 },
+ { "is", RTL_TEXTENCODING_ISO_8859_1 },
+ { "it", RTL_TEXTENCODING_ISO_8859_1 },
+ { "iw", RTL_TEXTENCODING_ISO_8859_8 },
+ { "ja", RTL_TEXTENCODING_EUC_JP },
+ { "ka", RTL_TEXTENCODING_DONTKNOW },
+ { "kk", RTL_TEXTENCODING_ISO_8859_5 },
+ { "ko", RTL_TEXTENCODING_EUC_KR },
+ { "lt", RTL_TEXTENCODING_ISO_8859_4 },
+ { "lv", RTL_TEXTENCODING_ISO_8859_4 },
+ { "mk", RTL_TEXTENCODING_ISO_8859_5 },
+ { "mr", RTL_TEXTENCODING_DONTKNOW },
+ { "ms", RTL_TEXTENCODING_ISO_8859_1 },
+ { "nl", RTL_TEXTENCODING_ISO_8859_1 },
+ { "no", RTL_TEXTENCODING_ISO_8859_1 },
+ { "pl", RTL_TEXTENCODING_ISO_8859_2 },
+ { "pt", RTL_TEXTENCODING_ISO_8859_1 },
+ { "ro", RTL_TEXTENCODING_ISO_8859_2 },
+ { "ru", RTL_TEXTENCODING_ISO_8859_5 },
+ { "sa", RTL_TEXTENCODING_DONTKNOW },
+ { "sk", RTL_TEXTENCODING_ISO_8859_2 },
+ { "sl", RTL_TEXTENCODING_ISO_8859_2 },
+ { "sq", RTL_TEXTENCODING_ISO_8859_2 },
+ { "sv", RTL_TEXTENCODING_ISO_8859_1 },
+ { "sw", RTL_TEXTENCODING_ISO_8859_1 },
+ { "ta", RTL_TEXTENCODING_DONTKNOW },
+ { "th", RTL_TEXTENCODING_DONTKNOW },
+ { "tr", RTL_TEXTENCODING_ISO_8859_9 },
+ { "tt", RTL_TEXTENCODING_ISO_8859_5 },
+ { "uk", RTL_TEXTENCODING_ISO_8859_5 },
+ { "ur", RTL_TEXTENCODING_ISO_8859_6 },
+ { "uz", RTL_TEXTENCODING_ISO_8859_9 },
+ { "vi", RTL_TEXTENCODING_DONTKNOW },
+ { "zh", RTL_TEXTENCODING_BIG5 }
+};
+
+/*****************************************************************************
+ return the text encoding corresponding to the given locale
+ *****************************************************************************/
+
+rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale )
+{
+ const _pair *language = 0;
+ char locale_buf[64] = "";
+ char *cp;
+
+ WinMessageBox(HWND_DESKTOP,HWND_DESKTOP,
+ "Please contact technical support and report above informations.\n\n",
+ "Critical error: osl_getTextEncodingFromLocale",
+ 0, MB_ERROR | MB_OK | MB_MOVEABLE);
+
+ /* default to process locale if pLocale == NULL */
+ if( NULL == pLocale )
+ osl_getProcessLocale( &pLocale );
+
+ /* convert rtl_Locale to locale string */
+ if( _compose_locale( pLocale, locale_buf, 64 ) )
+ {
+ /* check special handling list (EUC) first */
+ const unsigned int members = sizeof( _full_locale_list ) / sizeof( _pair );
+ language = _pair_search( locale_buf, _full_locale_list, members);
+
+ if( NULL == language )
+ {
+ /*
+ * check if there is a charset qualifier at the end of the given locale string
+ * e.g. de.ISO8859-15 or de.ISO8859-15@euro which strongly indicates what
+ * charset to use
+ */
+ cp = strrchr( locale_buf, '.' );
+
+ if( NULL != cp )
+ {
+ const unsigned int members = sizeof( _locale_extension_list ) / sizeof( _pair );
+ language = _pair_search( cp + 1, _locale_extension_list, members);
+ }
+ }
+
+ /* use iso language code to determine the charset */
+ if( NULL == language )
+ {
+ const unsigned int members = sizeof( _iso_language_list ) / sizeof( _pair );
+
+ /* iso lang codes have 2 charaters */
+ locale_buf[2] = '\0';
+
+ language = _pair_search( locale_buf, _iso_language_list, members);
+ }
+ }
+
+ /* a matching item in our list provides a mapping from codeset to
+ * rtl-codeset */
+ if ( language != NULL )
+ return language->value;
+
+ return RTL_TEXTENCODING_DONTKNOW;
+}
+
+/*****************************************************************************
+ return the current process locale
+ *****************************************************************************/
+
+void _imp_getProcessLocale( rtl_Locale ** ppLocale )
+{
+ /* simulate behavior off setlocale */
+ char * locale = getenv( "LC_ALL" );
+
+ if( NULL == locale )
+ locale = getenv( "LC_CTYPE" );
+
+ if( NULL == locale )
+ locale = getenv( "LANG" );
+
+ if( NULL == locale )
+ locale = "C";
+
+ *ppLocale = _parse_locale( locale );
+}
+
+/*****************************************************************************
+ set the current process locale
+ *****************************************************************************/
+
+int _imp_setProcessLocale( rtl_Locale * pLocale )
+{
+ char locale_buf[64];
+
+ /* convert rtl_Locale to locale string */
+ if( NULL != _compose_locale( pLocale, locale_buf, 64 ) )
+ {
+ /* only change env vars that exist already */
+ if( getenv( "LC_ALL" ) ) {
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined( __EMX__ )
+ setenv( "LC_ALL", locale_buf, 1);
+#else
+ setenv( "LC_ALL", locale_buf );
+#endif
+ }
+
+ if( getenv( "LC_CTYPE" ) ) {
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined( __EMX__ )
+ setenv("LC_CTYPE", locale_buf, 1 );
+#else
+ setenv( "LC_CTYPE", locale_buf );
+#endif
+ }
+
+ if( getenv( "LANG" ) ) {
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX ) || defined( __EMX__ )
+ setenv("LC_CTYPE", locale_buf, 1 );
+#else
+ setenv( "LANG", locale_buf );
+#endif
+ }
+ }
+
+ return 0;
+}
+
+
diff --git a/sal/osl/os2/path_helper.cxx b/sal/osl/os2/path_helper.cxx
new file mode 100644
index 000000000000..6425927a0021
--- /dev/null
+++ b/sal/osl/os2/path_helper.cxx
@@ -0,0 +1,116 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*******************************************************************
+ Includes
+ ******************************************************************/
+
+#include "path_helper.hxx"
+#include <osl/diagnose.h>
+#include <rtl/ustring.hxx>
+
+#include <algorithm>
+#include <wchar.h>
+#include <wctype.h>
+
+/*******************************************************************
+ Constants
+ ******************************************************************/
+
+const rtl::OUString BACKSLASH = rtl::OUString::createFromAscii("\\");
+const rtl::OUString SLASH = rtl::OUString::createFromAscii("/");
+
+/*******************************************************************
+ osl_systemPathEnsureSeparator
+ ******************************************************************/
+
+void osl_systemPathEnsureSeparator(/*inout*/ rtl_uString** ppustrPath)
+{
+ OSL_PRECOND(ppustrPath && (NULL != *ppustrPath), \
+ "osl_systemPathEnsureSeparator: Invalid parameter");
+
+ rtl::OUString path(*ppustrPath);
+ sal_Int32 i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), path.lastIndexOf(SLASH));
+
+ if (i < (path.getLength()-1))
+ {
+ path += BACKSLASH;
+ rtl_uString_assign(ppustrPath, path.pData);
+ }
+
+ OSL_POSTCOND(path.lastIndexOf(BACKSLASH) == (path.getLength() - 1), \
+ "osl_systemPathEnsureSeparator: Post condition failed");
+}
+
+/*******************************************************************
+ osl_systemPathRemoveSeparator
+ ******************************************************************/
+
+void SAL_CALL osl_systemPathRemoveSeparator(/*inout*/ rtl_uString** ppustrPath)
+{
+ rtl::OUString path(*ppustrPath);
+
+ if (!osl::systemPathIsLogicalDrivePattern(path))
+ {
+ sal_Int32 i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), path.lastIndexOf(SLASH));
+
+ if (i > -1 && (i == (path.getLength() - 1)))
+ {
+ path = rtl::OUString(path.getStr(), path.getLength() - 1);
+ rtl_uString_assign(ppustrPath, path.pData);
+ }
+ }
+}
+
+/*******************************************************************
+ osl_is_logical_drive_pattern
+ ******************************************************************/
+
+// is [A-Za-z]:[/|\]\0
+const sal_Unicode* LDP = L":";
+const sal_Unicode* LDP_WITH_BACKSLASH = L":\\";
+const sal_Unicode* LDP_WITH_SLASH = L":/";
+
+// degenerated case returned by the Windows FileOpen dialog
+// when someone enters for instance "x:filename", the Win32
+// API accepts this case
+const sal_Unicode* LDP_WITH_DOT_BACKSLASH = L":.\\";
+
+sal_Int32 osl_systemPathIsLogicalDrivePattern(/*in*/ const rtl_uString* pustrPath)
+{
+ const sal_Unicode* p = rtl_uString_getStr(const_cast<rtl_uString*>(pustrPath));
+ if (iswalpha(*p++))
+ {
+ return ((0 == wcscmp(p, LDP)) ||
+ (0 == wcscmp(p, LDP_WITH_BACKSLASH)) ||
+ (0 == wcscmp(p, LDP_WITH_SLASH)) ||
+ (0 == wcscmp(p, LDP_WITH_DOT_BACKSLASH)));
+ }
+ return 0;
+}
+
+
diff --git a/sal/osl/os2/path_helper.h b/sal/osl/os2/path_helper.h
new file mode 100644
index 000000000000..79341f538667
--- /dev/null
+++ b/sal/osl/os2/path_helper.h
@@ -0,0 +1,70 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PATH_HELPER_H_
+#define _PATH_HELPER_H_
+
+#include <sal/types.h>
+#include <rtl/ustring.h>
+#include <osl/file.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*******************************************************************
+ osl_systemPathEnsureSeparator
+ Adds a trailing path separator to the given system path if not
+ already there and if the path is not the root path or a logical
+ drive alone
+ ******************************************************************/
+
+void osl_systemPathEnsureSeparator(/*inout*/ rtl_uString** ppustrPath);
+
+/*******************************************************************
+ osl_systemPathRemoveSeparator
+ Removes the last separator from the given system path if any and
+ if the path is not the root path '\'
+ ******************************************************************/
+
+void SAL_CALL osl_systemPathRemoveSeparator(/*inout*/ rtl_uString** ppustrPath);
+
+/*******************************************************************
+ osl_is_logical_drive_pattern
+ Returns whether a given path is only a logical drive pattern or not.
+ A logical drive pattern is something like "a:\", "c:\".
+ No logical drive pattern is something like "c:\test"
+ ******************************************************************/
+
+sal_Int32 osl_systemPathIsLogicalDrivePattern(/*in*/ const rtl_uString* pustrPath);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/osl/os2/path_helper.hxx b/sal/osl/os2/path_helper.hxx
new file mode 100644
index 000000000000..8a301431f610
--- /dev/null
+++ b/sal/osl/os2/path_helper.hxx
@@ -0,0 +1,73 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// YD #pragma warning (disable : 4800)
+
+#ifndef _PATH_HELPER_HXX_
+#define _PATH_HELPER_HXX_
+
+#include "path_helper.h"
+#include <rtl/ustring.hxx>
+
+namespace osl
+{
+
+/*******************************************************************
+ osl_systemPathEnsureSeparator
+ Adds a trailing path separator to the given system path if not
+ already there and if the path is not the root path or a logical
+ drive alone
+ ******************************************************************/
+
+inline void systemPathEnsureSeparator(/*inout*/ rtl::OUString& Path)
+{
+ osl_systemPathEnsureSeparator(&Path.pData);
+}
+
+/*******************************************************************
+ osl_systemPathRemoveSeparator
+ Removes the last separator from the given system path if any and
+ if the path is not the root path '\'
+ ******************************************************************/
+
+inline void systemPathRemoveSeparator(/*inout*/ rtl::OUString& Path)
+{
+ osl_systemPathRemoveSeparator(&Path.pData);
+}
+
+/*******************************************************************
+ osl_systemPathIsLogicalDrivePattern
+ ******************************************************************/
+
+inline bool systemPathIsLogicalDrivePattern(/*in*/ const rtl::OUString& path)
+{
+ return osl_systemPathIsLogicalDrivePattern(path.pData);
+}
+
+} // end namespace osl
+
+#endif
diff --git a/sal/osl/os2/pipe.cxx b/sal/osl/os2/pipe.cxx
new file mode 100644
index 000000000000..20db94bda9eb
--- /dev/null
+++ b/sal/osl/os2/pipe.cxx
@@ -0,0 +1,555 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//#define INCL_DOSERRORS
+#include "system.h"
+
+#include <osl/pipe.h>
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <osl/mutex.h>
+#include <osl/semaphor.h>
+#include <osl/conditn.h>
+#include <osl/interlck.h>
+#include <osl/process.h>
+#include <rtl/ustring.hxx>
+
+#define PIPENAMEMASK "OSL_PIPE_%s"
+#define SECPIPENAMEMASK "OSL_PIPE_%s_%s"
+
+typedef enum {
+ MSG_SYN,
+ MSG_FIN,
+ MSG_DATA,
+ MSG_UNKNOWN
+} MessageType;
+
+struct oslPipeImpl {
+ oslInterlockedCount m_Reference;
+ HPIPE hPipe;
+ HMTX m_NamedObject;
+ APIRET nLastError;
+ //oslSecurity m_Security;
+ sal_Bool m_bClosed;
+};
+
+/* default size for input/output buffer */
+static const ULONG ulBufSize = 4096;
+
+/* OS/2 path for pipes */
+static const CHAR pszPipePath[] = "\\PIPE\\";
+static const UCHAR nPipePathLen = sizeof (pszPipePath) - 1;
+
+/* global last error value to be returned from oslGetLastPipeError */
+static APIRET ngLastError;
+
+using rtl::OString;
+using rtl::OUString;
+using rtl::OUStringToOString;
+
+/*****************************************************************************/
+/* osl_create/destroy-PipeImpl */
+/*****************************************************************************/
+
+static oslInterlockedCount nPipes = 0;
+
+oslPipe __osl_createPipeImpl(void)
+{
+ oslPipe pPipe;
+
+ pPipe = (oslPipe) calloc(1,sizeof(struct oslPipeImpl));
+
+ pPipe->m_bClosed = sal_False;
+ pPipe->m_Reference = 1;
+ pPipe->hPipe = NULL;
+ pPipe->m_NamedObject = NULL;
+
+ return pPipe;
+}
+
+void __osl_destroyPipeImpl(oslPipe pPipe)
+{
+ if (pPipe != NULL)
+ {
+ DosCloseMutexSem( pPipe->m_NamedObject);
+ free(pPipe);
+ }
+}
+
+
+/*****************************************************************************/
+/* osl_createPipe */
+/*****************************************************************************/
+oslPipe SAL_CALL osl_createPipe(rtl_uString *ustrPipeName, oslPipeOptions Options,
+ oslSecurity Security)
+{
+ oslPipe pPipe;
+
+ ULONG ulAction;
+ CHAR strPipeNameBuffer [CCHMAXPATHCOMP];
+ rtl_String* strPipeName=0;
+ sal_Char* pszPipeName=0;
+
+ /* check parameters */
+ OSL_ASSERT( ustrPipeName );
+ //YD 17/04/06 OSL_ASSERT( Security == 0 );
+
+ /* allocate impl-structure */
+ pPipe = __osl_createPipeImpl();
+ if (!pPipe)
+ {
+ OSL_TRACE( "osl_createPipe failed allocating memory.\n" );
+ return NULL;
+ }
+
+ /* create pipe name */
+ OString sPipe = OUStringToOString(ustrPipeName, RTL_TEXTENCODING_ASCII_US);
+#if OSL_DEBUG_LEVEL>0
+ debug_printf("osl_createPipe options 0x%x\n", Options);
+#endif
+
+ switch( Options )
+ {
+ case osl_Pipe_OPEN:
+ {
+ APIRET fPipeAvailable;
+
+ sprintf (strPipeNameBuffer, "\\PIPE\\OSL_PIPE_%s", sPipe.getStr());
+#if OSL_DEBUG_LEVEL>0
+ debug_printf("osl_createPipe %s\n", strPipeNameBuffer);
+#endif
+ ngLastError = DosOpen( (PCSZ)strPipeNameBuffer,
+ &(pPipe->hPipe), &ulAction,
+ 0, FILE_NORMAL, FILE_OPEN,
+ OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE,
+ (PEAOP2) NULL);
+ // if pipe is busy, wait for it
+ if (ngLastError == ERROR_PIPE_BUSY)
+ do
+ {
+ /* free instance should be available first */
+ fPipeAvailable = DosWaitNPipe( (PCSZ)strPipeNameBuffer, -1);
+ /* first try to open system pipe */
+ if ( fPipeAvailable == NO_ERROR )
+ {
+ // We got it !
+ ngLastError = NO_ERROR;
+ break;
+ }
+ // Pipe instance maybe catched by another client -> try again
+ printf("osl_createPipe wait for Pipe available\n");
+ } while ( fPipeAvailable );
+ }
+ break;
+ case osl_Pipe_CREATE:
+ {
+ sprintf (strPipeNameBuffer, "\\SEM32\\OSL_SEM_%s", sPipe.getStr());
+ // check if semaphore exists (pipe create must fail for existig pipes)
+ ngLastError = DosCreateMutexSem( (PCSZ)strPipeNameBuffer, &(pPipe->m_NamedObject), 0, TRUE );
+ if (ngLastError)
+ break;
+
+ sprintf (strPipeNameBuffer, "\\PIPE\\OSL_PIPE_%s", sPipe.getStr());
+#if OSL_DEBUG_LEVEL>0
+ debug_printf("osl_createPipe %s\n", strPipeNameBuffer);
+#endif
+ ngLastError = DosCreateNPipe( (PCSZ)strPipeNameBuffer,
+ &(pPipe->hPipe),
+ NP_ACCESS_DUPLEX, /* open pipe for read and write access */
+ 0xFF, /* allow unlimited number of instances */
+ ulBufSize, /* output buffer size */
+ ulBufSize, /* input buffer size */
+ 0L /* use default time-out time */
+ );
+ }
+ break;
+ default:
+ ngLastError = ERROR_INVALID_PARAMETER;
+ }
+
+ /* if failed, release allocated memory */
+ if (ngLastError)
+ {
+ OSL_TRACE( "osl_createPipe failed %s the pipe %s, Error Code %d.\n",
+ Options == osl_Pipe_OPEN ? "opening" : "creating",
+ strPipeNameBuffer,
+ ngLastError );
+ __osl_destroyPipeImpl(pPipe);
+ return NULL;
+ }
+
+ pPipe->m_Reference= 1;
+ pPipe->m_bClosed = sal_False;
+ //pPipe->m_Security = Security;
+ pPipe->nLastError = NO_ERROR;
+ return (oslPipe)pPipe;
+}
+
+/*****************************************************************************/
+/* osl_copyPipe */
+/*****************************************************************************/
+oslPipe SAL_CALL osl_copyPipe(oslPipe pPipe)
+{
+ //oslPipe* pPipe = (oslPipe*) Pipe;
+ oslPipe pNewPipe;
+
+
+ /* check parameter */
+ OSL_ASSERT (pPipe);
+
+ /* allocate impl-structure */
+ pNewPipe = __osl_createPipeImpl();
+ if (!pNewPipe) return NULL;
+
+ /* create new handle */
+ pNewPipe->hPipe = (HPIPE) -1;
+ ngLastError = DosDupHandle( pPipe->hPipe, &(pNewPipe->hPipe) );
+
+ /* if failed, release allocated memory */
+ if (ngLastError)
+ {
+ OSL_TRACE( "osl_copyPipe failed duplicating pipe handle, Error-Code: %d.\n",
+ ngLastError );
+ free (pNewPipe);
+ return NULL;
+ }
+
+ pNewPipe->nLastError = NO_ERROR;
+ return (oslPipe)pNewPipe;
+}
+
+void SAL_CALL osl_acquirePipe( oslPipe pPipe )
+{
+ osl_incrementInterlockedCount( &(pPipe->m_Reference) );
+}
+
+void SAL_CALL osl_releasePipe( oslPipe pPipe )
+{
+// OSL_ASSERT( pPipe );
+
+ if( 0 == pPipe )
+ return;
+
+ if( 0 == osl_decrementInterlockedCount( &(pPipe->m_Reference) ) )
+ {
+ if( ! pPipe->m_bClosed )
+ osl_closePipe( pPipe );
+
+ __osl_destroyPipeImpl( pPipe );
+ }
+}
+
+/*****************************************************************************/
+/* osl_destroyPipe */
+/*************close****************************************************************/
+void SAL_CALL osl_closePipe(oslPipe pPipe)
+{
+ //oslPipe* pPipe = (oslPipe*) Pipe;
+ /* check parameter */
+ OSL_ASSERT (pPipe);
+
+ if( pPipe && ! pPipe->m_bClosed )
+ {
+ pPipe->m_bClosed = sal_True;
+ /* if we have a system pipe close it */
+ if (pPipe->hPipe != 0)
+ {
+ /* disconnect client */
+ DosDisConnectNPipe (pPipe->hPipe);
+
+ /* close the pipe */
+ DosClose (pPipe->hPipe);
+ }
+ }
+}
+
+/*****************************************************************************/
+/* osl_acceptPipe */
+/*****************************************************************************/
+oslPipe SAL_CALL osl_acceptPipe(oslPipe pPipe)
+{
+
+#define PINFO ((PIPEINFO *) &PipeInfoBuffer)
+
+ ///oslPipe* pPipe = (oslPipe*) Pipe;
+ oslPipe pNewPipe;
+ BYTE PipeInfoBuffer[sizeof(PIPEINFO) + CCHMAXPATHCOMP];
+
+ /* check parameter */
+ OSL_ASSERT (pPipe);
+
+ /* get pipe information */
+ pPipe->nLastError = DosQueryNPipeInfo(pPipe->hPipe,
+ 1,
+ (PVOID) &PipeInfoBuffer,
+ sizeof(PipeInfoBuffer));
+
+ if (pPipe->nLastError)
+ {
+ OSL_TRACE( "osl_acceptPipe failed for requesting pipe information.\n",
+ pPipe->nLastError );
+ return NULL;
+ }
+
+ /* create a new instance of the pipe if possible */
+ if (PINFO->cbMaxInst == -1 || /* unlimited instances */
+ PINFO->cbMaxInst > PINFO->cbCurInst)
+ {
+ HPIPE hPipe;
+
+ pNewPipe = __osl_createPipeImpl();
+
+ if (!pNewPipe)
+ {
+ OSL_TRACE( "osl_acceptPipe failed creating new instance.\n", ngLastError );
+ free(pNewPipe);
+ return NULL;
+ }
+
+ //pNewPipe->m_Security = pPipe->m_Security;
+
+ pNewPipe->nLastError =
+ DosCreateNPipe( (PCSZ)PINFO->szName,
+ &(pNewPipe->hPipe),
+ NP_ACCESS_DUPLEX, /* open pipe for read and write access */
+ 0xFF, /* allow unlimited number of instances */
+ ulBufSize, /* output buffer size */
+ ulBufSize, /* input buffer size */
+ 0L /* use default time-out time */
+ );
+
+ if (pNewPipe->nLastError)
+ {
+ OSL_TRACE( "osl_acceptPipe failed creating new named pipe, Error-Code: %d.\n",
+ pNewPipe->nLastError );
+ free(pNewPipe);
+ return NULL;
+ }
+
+ /* switch pipe handles */
+ hPipe = pPipe->hPipe;
+ pPipe->hPipe = pNewPipe->hPipe;
+ pNewPipe->hPipe = hPipe;
+
+ /* connect new handle to client */
+ pNewPipe->nLastError = DosConnectNPipe( pNewPipe->hPipe );
+
+ /* if failed, release allocated memory */
+ if (pNewPipe->nLastError)
+ {
+ OSL_TRACE( "osl_acceptPipe failed connecting pipe to client, Error-Code: %d.\n",
+ pNewPipe->nLastError );
+
+ osl_closePipe((oslPipe)pNewPipe);
+ return NULL;
+ }
+ return (oslPipe)pNewPipe;
+ }
+ else
+ {
+ /* connect original handle to client */
+ pPipe->nLastError = DosConnectNPipe( pPipe->hPipe );
+
+ if (pPipe->nLastError)
+ {
+ OSL_TRACE( "osl_acceptPipe failed connecting pipe to client, Error-Code: %d.\n",
+ pPipe->nLastError );
+ return NULL;
+ }
+
+ return (oslPipe)pPipe;
+ }
+}
+
+/*****************************************************************************/
+/* osl_receivePipe */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receivePipe(oslPipe pPipe,
+ void* pBuffer,
+ sal_Int32 BytesToRead)
+{
+ //oslPipe* pPipe = (oslPipe*) Pipe;
+ ULONG ulActual;
+
+ /* check parameter */
+ OSL_ASSERT (pPipe);
+
+ /* read data from pipe */
+ pPipe->nLastError = DosRead( pPipe->hPipe, pBuffer, BytesToRead, &ulActual );
+
+ /* return -1 if failed */
+ if( pPipe->nLastError )
+ {
+ OSL_TRACE( "osl_receivePipe failed receiving from Pipe, Error-Code: %d.\n",
+ pPipe->nLastError );
+ return -1;
+ }
+
+ return ulActual;
+}
+
+
+/*****************************************************************************/
+/* osl_sendPipe */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendPipe(oslPipe pPipe,
+ const void* pBuffer,
+ sal_Int32 BytesToSend)
+{
+ //oslPipe* pPipe = (oslPipe*) Pipe;
+ ULONG ulActual;
+
+ /* check parameter */
+ OSL_ASSERT (pPipe);
+
+ /* read data from pipe */
+ pPipe->nLastError = DosWrite( pPipe->hPipe, (PVOID) pBuffer, BytesToSend, &ulActual );
+
+ /* return -1 if failed */
+ if( pPipe->nLastError )
+ {
+ OSL_TRACE( "osl_receivePipe failed writing to Pipe, Error-Code: %d.\n",
+ pPipe->nLastError );
+ return -1;
+ }
+
+ return ulActual;
+}
+
+
+/*****************************************************************************/
+/* osl_getLastPipeError */
+/*****************************************************************************/
+
+oslPipeError SAL_CALL osl_getLastPipeError(oslPipe pPipe)
+{
+ //oslPipe* pPipe = (oslPipe*) Pipe;
+ APIRET rc;
+
+ /* return local error value if possible */
+ if (pPipe)
+ {
+ rc = pPipe->nLastError;
+ pPipe->nLastError = NO_ERROR;
+ } else
+ rc = ngLastError;
+
+ /* map OS/2 error values */
+ switch (rc)
+ {
+ case NO_ERROR: return osl_Pipe_E_None;
+ case ERROR_PATH_NOT_FOUND: return osl_Pipe_E_NotFound;
+ case ERROR_NOT_ENOUGH_MEMORY: return osl_Pipe_E_NoBufferSpace;
+ default: return osl_Pipe_E_invalidError;
+ }
+}
+
+/*****************************************************************************/
+
+sal_Int32 SAL_CALL osl_writePipe( oslPipe pPipe, const void *pBuffer , sal_Int32 n )
+{
+ /* loop until all desired bytes were send or an error occured */
+ sal_Int32 BytesSend= 0;
+ sal_Int32 BytesToSend= n;
+
+ OSL_ASSERT(pPipe);
+ while (BytesToSend > 0)
+ {
+ sal_Int32 RetVal;
+
+ RetVal= osl_sendPipe(pPipe, pBuffer, BytesToSend);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToSend -= RetVal;
+ BytesSend += RetVal;
+ pBuffer= (sal_Char*)pBuffer + RetVal;
+ }
+
+ return BytesSend;
+}
+
+sal_Int32 SAL_CALL osl_readPipe( oslPipe pPipe, void *pBuffer , sal_Int32 n )
+{
+ /* loop until all desired bytes were read or an error occured */
+ sal_Int32 BytesRead= 0;
+ sal_Int32 BytesToRead= n;
+
+ OSL_ASSERT( pPipe );
+ while (BytesToRead > 0)
+ {
+ sal_Int32 RetVal;
+ RetVal= osl_receivePipe(pPipe, pBuffer, BytesToRead);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToRead -= RetVal;
+ BytesRead += RetVal;
+ pBuffer= (sal_Char*)pBuffer + RetVal;
+ }
+ return BytesRead;
+}
+
+
+/******************************************************************************
+ *
+ * New io resource transfer functions
+ *
+ *****************************************************************************/
+
+
+/**********************************************
+ osl_sendResourcePipe
+ *********************************************/
+
+sal_Bool osl_sendResourcePipe(oslPipe pPipe, oslSocket pSocket)
+{
+ sal_Bool bRet = sal_False;
+
+ return bRet;
+}
+
+/**********************************************
+ osl_receiveResourcePipe
+ *********************************************/
+
+oslSocket osl_receiveResourcePipe(oslPipe pPipe)
+{
+ oslSocket pSocket=0;
+
+ return (oslSocket) pSocket;
+}
+
+
diff --git a/sal/osl/os2/pipeimpl.cxx b/sal/osl/os2/pipeimpl.cxx
new file mode 100644
index 000000000000..d08a370c428c
--- /dev/null
+++ b/sal/osl/os2/pipeimpl.cxx
@@ -0,0 +1,755 @@
+# include "pipeimpl.h"
+
+#ifndef _INC_MALLOC
+# include <malloc.h>
+#endif
+
+#ifndef _INC_TCHAR
+# ifdef UNICODE
+# define _UNICODE
+# endif
+# include <tchar.h>
+#endif
+
+const TCHAR PIPE_NAME_PREFIX_MAPPING[] = TEXT("PIPE_FILE_MAPPING_");
+const TCHAR PIPE_NAME_PREFIX_SYNCHRONIZE[] = TEXT("PIPE_SYNCHRONIZE_MUTEX_");
+const TCHAR PIPE_NAME_PREFIX_CONNECTION[] = TEXT("PIPE_CONNECTION_SEMAPHORE_");
+
+const DWORD PIPE_BUFFER_SIZE = 4096;
+
+
+//============================================================================
+// PipeData
+//============================================================================
+
+struct PipeData
+{
+ DWORD dwProcessId;
+ HANDLE hReadPipe;
+ HANDLE hWritePipe;
+};
+
+//============================================================================
+// Pipe
+//============================================================================
+
+#ifdef UNICODE
+#define Pipe PipeW
+#define ClientPipe ClientPipeW
+#define ServerPipe ServerPipeW
+#else
+#define Pipe PipeA
+#define ClientPipe ClientPipeA
+#define ServerPipe ServerPipeA
+#endif
+
+class Pipe
+{
+protected:
+ HANDLE m_hReadPipe; // Handle to use for reading
+ HANDLE m_hWritePipe; // Handle to use for writing
+
+ Pipe( HANDLE hReadPipe, HANDLE hWritePipe );
+
+ static HANDLE CreatePipeDataMutex( LPCTSTR lpName, BOOL bInitialOwner );
+ static HANDLE CreatePipeDataMapping( LPCTSTR lpName );
+ static HANDLE OpenPipeDataMapping( LPCTSTR lpName );
+ static HANDLE CreatePipeConnectionSemaphore( LPCTSTR lpName, LONG lInitialCount, LONG lMaximumcount );
+
+public:
+ Pipe( const Pipe& );
+ const Pipe& operator = ( const Pipe& );
+ virtual ~Pipe();
+
+ virtual bool Close();
+ virtual bool Write( LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, bool bWait = true );
+ virtual bool Read( LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, bool bWait = true );
+
+ virtual Pipe *AcceptConnection()
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return NULL;
+ }
+
+ void * operator new( size_t nBytes )
+ {
+ return HeapAlloc( GetProcessHeap(), 0, nBytes );
+ }
+
+ void operator delete( void *ptr )
+ {
+ HeapFree( GetProcessHeap(), 0, ptr );
+ }
+
+ bool is() const
+ {
+ return (FALSE != HeapValidate( GetProcessHeap(), 0, this ));
+ }
+
+};
+
+//============================================================================
+// ClientPipe
+//============================================================================
+
+class ClientPipe : public Pipe
+{
+protected:
+ ClientPipe( HANDLE hReadPipe, HANDLE hWritePipe );
+public:
+ static ClientPipe* Create( LPCTSTR lpName );
+};
+
+//============================================================================
+// ServerPipe
+//============================================================================
+
+class ServerPipe : public Pipe
+{
+protected:
+ HANDLE m_hMapping;
+ HANDLE m_hSynchronize;
+ LPTSTR m_lpName;
+
+ ServerPipe( LPCTSTR lpName, HANDLE hMapping, HANDLE hSynchronize, HANDLE hReadPipe, HANDLE hWritePipe );
+public:
+ virtual ~ServerPipe();
+
+ static ServerPipe *Create( LPCTSTR lpName );
+
+ virtual Pipe *AcceptConnection();
+};
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+
+HANDLE Pipe::CreatePipeDataMapping( LPCTSTR lpName )
+{
+ HANDLE hMapping = NULL;
+ LPTSTR lpMappingName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_MAPPING) );
+
+ if ( lpMappingName )
+ {
+ _tcscpy( lpMappingName, PIPE_NAME_PREFIX_MAPPING );
+ _tcscat( lpMappingName, lpName );
+
+ LPTSTR lpMappingFileName = (LPTSTR)alloca( MAX_PATH * sizeof(TCHAR) );
+
+ if ( lpMappingFileName )
+ {
+ DWORD nChars = GetTempPath( MAX_PATH, lpMappingFileName );
+
+ if ( MAX_PATH + _tcslen(lpName) < nChars + 1 )
+ {
+ lpMappingFileName = (LPTSTR)alloca( (nChars + 1 + _tcslen(lpName)) * sizeof(TCHAR) );
+ if ( lpMappingFileName )
+ nChars = GetTempPath( nChars, lpMappingFileName );
+ else
+ {
+ nChars = 0;
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ }
+ }
+
+ if ( nChars )
+ {
+ _tcscat( lpMappingFileName, lpMappingName );
+
+ HANDLE hFile = CreateFile(
+ lpMappingFileName,
+ GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_ALWAYS,
+ FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
+ NULL );
+
+ if ( IsValidHandle(hFile) )
+ {
+ hMapping = CreateFileMapping(
+ (HANDLE)hFile,
+ (LPSECURITY_ATTRIBUTES)NULL,
+ PAGE_READWRITE,
+ 0,
+ sizeof(PipeData),
+ lpMappingName );
+
+ CloseHandle( hFile );
+ }
+ }
+ }
+ else
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ }
+
+ return hMapping;
+}
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+
+HANDLE Pipe::OpenPipeDataMapping( LPCTSTR lpName )
+{
+ HANDLE hMapping = NULL;
+ LPTSTR lpMappingName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_MAPPING) );
+
+ if ( lpMappingName )
+ {
+ _tcscpy( lpMappingName, PIPE_NAME_PREFIX_MAPPING );
+ _tcscat( lpMappingName, lpName );
+
+ hMapping = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, lpMappingName );
+ }
+
+ return hMapping;
+}
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+
+HANDLE Pipe::CreatePipeDataMutex( LPCTSTR lpName, BOOL bInitialOwner )
+{
+ HANDLE hMutex = NULL;
+ LPTSTR lpMutexName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_SYNCHRONIZE) );
+
+ if ( lpMutexName )
+ {
+ _tcscpy( lpMutexName, PIPE_NAME_PREFIX_SYNCHRONIZE );
+ _tcscat( lpMutexName, lpName );
+
+ hMutex = CreateMutex( NULL, bInitialOwner, lpMutexName );
+ }
+
+ return hMutex;
+}
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+
+HANDLE Pipe::CreatePipeConnectionSemaphore( LPCTSTR lpName, LONG lInitialCount, LONG lMaximumCount )
+{
+ HANDLE hSemaphore = NULL;
+ LPTSTR lpSemaphoreName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_CONNECTION) );
+
+ if ( lpSemaphoreName )
+ {
+ _tcscpy( lpSemaphoreName, PIPE_NAME_PREFIX_CONNECTION );
+ _tcscat( lpSemaphoreName, lpName );
+
+ hSemaphore = CreateSemaphore( NULL, lInitialCount, lMaximumCount, lpSemaphoreName );
+ }
+
+ return hSemaphore;
+}
+
+
+//----------------------------------------------------------------------------
+// Pipe copy ctor
+//----------------------------------------------------------------------------
+
+Pipe::Pipe( const Pipe& rPipe ) :
+m_hReadPipe( INVALID_HANDLE_VALUE ),
+m_hWritePipe( INVALID_HANDLE_VALUE )
+{
+ DuplicateHandle(
+ GetCurrentProcess(),
+ rPipe.m_hReadPipe,
+ GetCurrentProcess(),
+ &m_hReadPipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ rPipe.m_hWritePipe,
+ GetCurrentProcess(),
+ &m_hWritePipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+}
+
+//----------------------------------------------------------------------------
+// Pipe assignment operator
+//----------------------------------------------------------------------------
+
+const Pipe& Pipe::operator = ( const Pipe& rPipe )
+{
+ Close();
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ rPipe.m_hReadPipe,
+ GetCurrentProcess(),
+ &m_hReadPipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ rPipe.m_hWritePipe,
+ GetCurrentProcess(),
+ &m_hWritePipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ return *this;
+}
+
+//----------------------------------------------------------------------------
+// Pipe ctor
+//----------------------------------------------------------------------------
+
+Pipe::Pipe( HANDLE hReadPipe, HANDLE hWritePipe ) :
+m_hReadPipe( INVALID_HANDLE_VALUE ),
+m_hWritePipe( INVALID_HANDLE_VALUE )
+{
+ DuplicateHandle(
+ GetCurrentProcess(),
+ hReadPipe,
+ GetCurrentProcess(),
+ &m_hReadPipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ hWritePipe,
+ GetCurrentProcess(),
+ &m_hWritePipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+}
+
+//----------------------------------------------------------------------------
+// Pipe dtor
+//----------------------------------------------------------------------------
+
+Pipe::~Pipe()
+{
+ Close();
+}
+
+//----------------------------------------------------------------------------
+// Pipe Close
+//----------------------------------------------------------------------------
+
+bool Pipe::Close()
+{
+ bool fSuccess = false; // Assume failure
+
+ if ( IsValidHandle(m_hReadPipe) )
+ {
+ CloseHandle( m_hReadPipe );
+ m_hReadPipe = INVALID_HANDLE_VALUE;
+ }
+
+ if ( IsValidHandle(m_hWritePipe) )
+ {
+ CloseHandle( m_hWritePipe );
+ m_hWritePipe = INVALID_HANDLE_VALUE;
+ }
+
+ return fSuccess;
+}
+
+//----------------------------------------------------------------------------
+// Pipe Write
+//----------------------------------------------------------------------------
+
+bool Pipe::Write( LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, bool bWait )
+{
+ DWORD dwBytesAvailable = 0;
+ BOOL fSuccess = TRUE;
+
+ if ( !bWait )
+ fSuccess = PeekNamedPipe( m_hReadPipe, NULL, 0, NULL, &dwBytesAvailable, NULL );
+
+ if ( fSuccess )
+ {
+ if ( !bWait && dwBytesToWrite > PIPE_BUFFER_SIZE - dwBytesAvailable )
+ dwBytesToWrite = PIPE_BUFFER_SIZE - dwBytesAvailable ;
+
+ return !!WriteFile( m_hWritePipe, lpBuffer, dwBytesToWrite, lpBytesWritten, NULL );
+ }
+
+ return false;
+}
+
+//----------------------------------------------------------------------------
+// Pipe Read
+//----------------------------------------------------------------------------
+
+bool Pipe::Read( LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, bool bWait )
+{
+ DWORD dwBytesAvailable = 0;
+ BOOL fSuccess = TRUE;
+
+ if ( !bWait )
+ fSuccess = PeekNamedPipe( m_hReadPipe, NULL, 0, NULL, &dwBytesAvailable, NULL );
+
+ if ( fSuccess )
+ {
+ if ( bWait || dwBytesAvailable )
+ return !!ReadFile( m_hReadPipe, lpBuffer, dwBytesToRead, lpBytesRead, NULL );
+ else
+ {
+ *lpBytesRead = 0;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+
+//----------------------------------------------------------------------------
+// Client pipe dtor
+//----------------------------------------------------------------------------
+
+ClientPipe::ClientPipe( HANDLE hReadPipe, HANDLE hWritePipe ) : Pipe( hReadPipe, hWritePipe )
+{
+}
+
+//----------------------------------------------------------------------------
+// Client pipe creation
+//----------------------------------------------------------------------------
+
+ClientPipe *ClientPipe::Create( LPCTSTR lpName )
+{
+ ClientPipe *pPipe = NULL; // Assume failure
+
+ HANDLE hMapping = OpenPipeDataMapping( lpName );
+
+ if ( IsValidHandle(hMapping) )
+ {
+ PipeData *pData = (PipeData*)MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
+
+ if ( pData )
+ {
+ HANDLE hSourceProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, pData->dwProcessId );
+
+ if ( IsValidHandle(hSourceProcess) )
+ {
+ BOOL fSuccess;
+ HANDLE hReadPipe = INVALID_HANDLE_VALUE, hWritePipe = INVALID_HANDLE_VALUE;
+
+ fSuccess = DuplicateHandle(
+ hSourceProcess,
+ pData->hReadPipe,
+ GetCurrentProcess(),
+ &hReadPipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ fSuccess = fSuccess && DuplicateHandle(
+ hSourceProcess,
+ pData->hWritePipe,
+ GetCurrentProcess(),
+ &hWritePipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ if ( fSuccess )
+ pPipe = new ClientPipe( hReadPipe, hWritePipe );
+
+ if ( IsValidHandle(hWritePipe) )
+ CloseHandle( hWritePipe );
+
+ if ( IsValidHandle(hReadPipe) )
+ CloseHandle( hReadPipe );
+
+ HANDLE hConnectionRequest = CreatePipeConnectionSemaphore( lpName, 0, 1 );
+
+ ReleaseSemaphore( hConnectionRequest, 1, NULL );
+
+ CloseHandle( hConnectionRequest );
+
+ CloseHandle( hSourceProcess );
+ }
+
+ UnmapViewOfFile( pData );
+ }
+
+ CloseHandle( hMapping );
+ }
+
+ return pPipe;
+}
+
+
+
+//----------------------------------------------------------------------------
+// ServerPipe ctor
+//----------------------------------------------------------------------------
+
+ServerPipe::ServerPipe( LPCTSTR lpName, HANDLE hMapping, HANDLE hSynchronize, HANDLE hReadPipe, HANDLE hWritePipe ) : Pipe( hReadPipe, hWritePipe ),
+m_hMapping( NULL ),
+m_hSynchronize( NULL ),
+m_lpName( NULL )
+{
+ DuplicateHandle(
+ GetCurrentProcess(),
+ hMapping,
+ GetCurrentProcess(),
+ &m_hMapping,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ hSynchronize,
+ GetCurrentProcess(),
+ &m_hSynchronize,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS
+ );
+ m_lpName = new TCHAR[_tcslen(lpName) + 1];
+ if ( m_lpName )
+ _tcscpy( m_lpName, lpName );
+}
+
+//----------------------------------------------------------------------------
+// ServerPipe dtor
+//----------------------------------------------------------------------------
+
+ServerPipe::~ServerPipe()
+{
+ if ( IsValidHandle(m_hMapping) )
+ CloseHandle( m_hMapping );
+ if ( m_lpName )
+ delete[]m_lpName;
+}
+
+//----------------------------------------------------------------------------
+// ServerPipe AcceptConnection
+//----------------------------------------------------------------------------
+
+Pipe *ServerPipe::AcceptConnection()
+{
+ Pipe *pPipe = NULL; // Assume failure;
+
+ HANDLE hConnectionRequest = CreatePipeConnectionSemaphore( m_lpName, 0, 1 );
+
+ if ( WAIT_OBJECT_0 == WaitForSingleObject( hConnectionRequest, INFINITE ) )
+ {
+ pPipe = new Pipe( *this );
+ Close();
+
+ // Create new inbound Pipe
+
+ HANDLE hClientWritePipe = NULL, hServerReadPipe = NULL;
+
+ BOOL fSuccess = CreatePipe( &hServerReadPipe, &hClientWritePipe, NULL, PIPE_BUFFER_SIZE );
+
+
+ if ( fSuccess )
+ {
+ // Create outbound pipe
+
+ HANDLE hClientReadPipe = NULL, hServerWritePipe = NULL;
+
+ if ( CreatePipe( &hClientReadPipe, &hServerWritePipe, NULL, PIPE_BUFFER_SIZE ) )
+ {
+ m_hReadPipe = hServerReadPipe;
+ m_hWritePipe = hServerWritePipe;
+
+ PipeData *pData = (PipeData *)MapViewOfFile( m_hMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(PipeData) );
+
+ HANDLE hSynchronize = CreatePipeDataMutex( m_lpName, TRUE );
+
+ CloseHandle( pData->hReadPipe );
+ CloseHandle( pData->hWritePipe );
+
+ pData->hReadPipe = hClientReadPipe;
+ pData->hWritePipe = hClientWritePipe;
+
+ ReleaseMutex( hSynchronize );
+
+ CloseHandle( hSynchronize );
+
+ }
+ else
+ {
+ CloseHandle( hClientWritePipe );
+ CloseHandle( hServerWritePipe );
+ }
+ }
+
+ ReleaseMutex( hConnectionRequest );
+ }
+
+ CloseHandle( hConnectionRequest );
+
+ return pPipe;
+}
+
+//----------------------------------------------------------------------------
+// Pipe creation
+//----------------------------------------------------------------------------
+
+ServerPipe *ServerPipe::Create( LPCTSTR lpName )
+{
+ ServerPipe *pPipe = NULL;
+
+ HANDLE hMapping = CreatePipeDataMapping( lpName );
+
+ if ( IsValidHandle(hMapping) )
+ {
+ if ( ERROR_FILE_EXISTS != GetLastError() )
+ {
+ HANDLE hSynchronize = CreatePipeDataMutex( lpName, FALSE);
+
+ WaitForSingleObject( hSynchronize, INFINITE );
+
+ PipeData *pData = (PipeData*)MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
+
+ if ( pData )
+ {
+
+ // Initialize pipe data
+
+ pData->dwProcessId = 0;
+ pData->hReadPipe = NULL;
+ pData->hWritePipe = NULL;
+
+ // Create inbound pipe
+
+ HANDLE hServerReadPipe = NULL, hClientWritePipe = NULL;
+
+ BOOL fSuccess = CreatePipe( &hServerReadPipe, &hClientWritePipe, NULL, PIPE_BUFFER_SIZE );
+
+ if ( fSuccess )
+ {
+ // Create outbound pipe
+
+ HANDLE hServerWritePipe = NULL, hClientReadPipe = NULL;
+
+ fSuccess = CreatePipe( &hClientReadPipe, &hServerWritePipe, NULL, PIPE_BUFFER_SIZE );
+
+ if ( fSuccess )
+ {
+ pData->dwProcessId = GetCurrentProcessId();
+ pData->hReadPipe = hClientReadPipe;
+ pData->hWritePipe = hClientWritePipe;
+ pPipe = new ServerPipe( lpName, hMapping, hSynchronize, hServerReadPipe, hServerWritePipe );
+
+ CloseHandle( hServerWritePipe );
+ CloseHandle( hServerReadPipe );
+ }
+ else
+ {
+ CloseHandle( hServerReadPipe );
+ CloseHandle( hClientWritePipe );
+ }
+ }
+
+ UnmapViewOfFile( pData );
+ }
+
+ ReleaseMutex( hSynchronize );
+ CloseHandle( hSynchronize );
+ }
+
+ CloseHandle( hMapping );
+ }
+
+ return pPipe;
+}
+
+
+//----------------------------------------------------------------------------
+// C style API
+//----------------------------------------------------------------------------
+
+const TCHAR LOCAL_PIPE_PREFIX[] = TEXT("\\\\.\\PIPE\\" );
+
+extern "C" HANDLE WINAPI CreateSimplePipe( LPCTSTR lpName )
+{
+ int nPrefixLen = _tcslen( LOCAL_PIPE_PREFIX );
+ if ( 0 == _tcsnicmp( lpName, LOCAL_PIPE_PREFIX, nPrefixLen ) )
+ lpName += nPrefixLen;
+ return (HANDLE)ServerPipe::Create( lpName );
+}
+
+extern "C" HANDLE WINAPI OpenSimplePipe( LPCTSTR lpName )
+{
+ int nPrefixLen = _tcslen( LOCAL_PIPE_PREFIX );
+ if ( 0 == _tcsnicmp( lpName, LOCAL_PIPE_PREFIX, nPrefixLen ) )
+ lpName += nPrefixLen;
+ return (HANDLE)ClientPipe::Create( lpName );
+}
+
+extern "C" HANDLE WINAPI AcceptSimplePipeConnection( HANDLE hPipe )
+{
+ Pipe *pPipe = (Pipe *)hPipe;
+
+ if ( pPipe->is() )
+ return (HANDLE)pPipe->AcceptConnection();
+ else
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return NULL;
+ }
+}
+
+extern "C" BOOL WINAPI WaitForSimplePipe( LPCTSTR /*lpName*/, DWORD /*dwTimeOut*/ )
+{
+ return FALSE;
+}
+
+extern "C" BOOL WINAPI WriteSimplePipe( HANDLE hPipe, LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, BOOL bWait )
+{
+ Pipe *pPipe = (Pipe *)hPipe;
+
+ if ( pPipe->is() )
+ return pPipe->Write( lpBuffer, dwBytesToWrite, lpBytesWritten, bWait );
+ else
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
+}
+
+extern "C" BOOL WINAPI ReadSimplePipe( HANDLE hPipe, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, BOOL bWait )
+{
+ Pipe *pPipe = (Pipe *)hPipe;
+
+ if ( pPipe->is() )
+ return pPipe->Read( lpBuffer, dwBytesToRead, lpBytesRead, bWait );
+ else
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
+}
+
+extern "C" BOOL WINAPI CloseSimplePipe( HANDLE hPipe )
+{
+ Pipe *pPipe = (Pipe *)hPipe;
+
+ if ( pPipe->is() )
+ {
+ delete pPipe;
+ return TRUE;
+ }
+ else
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
+}
diff --git a/sal/osl/os2/pipeimpl.h b/sal/osl/os2/pipeimpl.h
new file mode 100644
index 000000000000..cff082dee5a3
--- /dev/null
+++ b/sal/osl/os2/pipeimpl.h
@@ -0,0 +1,82 @@
+#ifndef _PIPEIMPL_H_
+#define _PIPEIMPL_H_
+
+#ifndef _WINDOWS_
+# include <windows.h>
+#endif
+
+#ifndef _INC_MALLOC
+# include <malloc.h>
+#endif
+
+#ifndef _INC_TCHAR
+# ifdef UNICODE
+# define _UNICODE
+# endif
+# include <tchar.h>
+#endif
+
+#define EXPORT_PIPE_API
+
+//============================================================================
+// Helper functions
+//============================================================================
+
+// Because the value of an invalid HANDLE returned by API functions differs
+// between different functions and differs on different Windows platforms,
+// this function checks wether the handle has a meaningfull value.
+#ifndef __cplusplus
+
+#define IsValidHandle( handle ) ((DWORD)(handle) + 1 > 1)
+
+#else
+
+inline bool IsValidHandle( HANDLE handle )
+{
+ return INVALID_HANDLE_VALUE != handle && NULL != handle;
+}
+
+extern "C" {
+
+#endif // __cplusplus
+
+
+EXPORT_PIPE_API HANDLE WINAPI CreateSimplePipeA( LPCSTR lpName );
+EXPORT_PIPE_API HANDLE WINAPI CreateSimplePipeW( LPCWSTR lpName );
+
+#ifdef UNICODE
+#define CreateSimplePipe CreateSimplePipeW
+#else
+#define CreateSimplePipe CreateSimplePipeA
+#endif
+
+EXPORT_PIPE_API HANDLE WINAPI OpenSimplePipeA( LPCSTR lpName );
+EXPORT_PIPE_API HANDLE WINAPI OpenSimplePipeW( LPCWSTR lpName );
+
+#ifdef UNICODE
+#define OpenSimplePipe OpenSimplePipeW
+#else
+#define OpenSimplePipe OpenSimplePipeA
+#endif
+
+EXPORT_PIPE_API HANDLE WINAPI AcceptSimplePipeConnection( HANDLE hPipe );
+
+EXPORT_PIPE_API BOOL WINAPI WaitForSimplePipeA( LPCSTR lpName, DWORD dwTimeOut );
+EXPORT_PIPE_API BOOL WINAPI WaitForSimplePipeW( LPCWSTR lpName, DWORD dwTimeOut );
+
+#ifdef UNICODE
+#define WaitForSimplePipe WaitForSimplePipeW
+#else
+#define WaitForSimplePipe WaitForSimplePipeA
+#endif
+
+
+EXPORT_PIPE_API BOOL WINAPI WriteSimplePipe( HANDLE hPipe, LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, BOOL bWait );
+EXPORT_PIPE_API BOOL WINAPI ReadSimplePipe( HANDLE hPipe, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, BOOL bWait );
+EXPORT_PIPE_API BOOL WINAPI CloseSimplePipe( HANDLE hPipe );
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _PIPEIMPL_H_
diff --git a/sal/osl/os2/process.c b/sal/osl/os2/process.c
new file mode 100644
index 000000000000..e83552192bfb
--- /dev/null
+++ b/sal/osl/os2/process.c
@@ -0,0 +1,1013 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+#include <osl/thread.h>
+
+#include <osl/diagnose.h>
+//#include <osl/socket.h>
+
+#ifndef _OSL_FILE_PATH_HELPER_H_
+#include "file_path_helper.h"
+#endif
+
+#include "procimpl.h"
+//#include "sockimpl.h"
+//#include "secimpl.h"
+
+#include <ctype.h>
+
+//#ifndef _RTL_USTRING_HXX_
+#include <rtl/ustring.hxx>
+//#endif
+
+// for exception logging
+#include <stdio.h>
+#include <setjmp.h>
+#include "helpers/except.h"
+
+
+#define MAX_ARGS 255
+#define PIPENAMEMASK "\\PIPE\\OSL_PIPE_%u"
+#define SEMNAMEMASK "\\SEM32\\OSL_SEM_%u"
+
+typedef enum {
+ MSG_DATA,
+ MSG_END,
+ MSG_ACK,
+ MSG_REL,
+ MSG_UNKNOWN
+} MessageType;
+
+typedef struct {
+ MessageType m_Type;
+ oslDescriptorFlag m_Flags;
+ oslDescriptorType m_Data;
+ HANDLE m_Value;
+} Message;
+
+typedef struct {
+ HPIPE m_hPipe;
+} Pipe;
+
+typedef struct _oslSocketCallbackArg {
+ HANDLE m_socket;
+ Pipe* m_pipe;
+} oslSocketCallbackArg;
+
+/* process termination queue */
+static sal_Bool bInitSessionTerm = sal_False;
+static const sal_Char * const SessionTermQueueName = "\\QUEUES\\SESSIONS.QUE";
+static HQUEUE SessionTermQueue;
+
+/******************************************************************************
+ *
+ * Function Declarations
+ *
+ *****************************************************************************/
+
+oslProcessError SAL_CALL osl_psz_executeProcess(sal_Char *pszImageName,
+ sal_Char *pszArguments[],
+ oslProcessOption Options,
+ oslSecurity Security,
+ sal_Char *pszDirectory,
+ sal_Char *pszEnvironments[],
+ oslProcess *pProcess,
+ oslFileHandle *pInputWrite,
+ oslFileHandle *pOutputRead,
+ oslFileHandle *pErrorRead );
+
+/* implemented in file.c */
+extern oslFileError FileURLToPath( char *, size_t, rtl_uString* );
+
+static sal_Bool InitSessionTerm( void )
+{
+ DosCreateQueue( &SessionTermQueue, QUE_FIFO, (PCSZ) SessionTermQueueName );
+
+ return sal_True;
+}
+
+/******************************************************************************
+ *
+ * Functions for starting a process
+ *
+ *****************************************************************************/
+
+/**********************************************
+ osl_executeProcess_WithRedirectedIO
+ *********************************************/
+
+oslProcessError SAL_CALL osl_executeProcess_WithRedirectedIO(
+ rtl_uString *ustrImageName,
+ rtl_uString *ustrArguments[],
+ sal_uInt32 nArguments,
+ oslProcessOption Options,
+ oslSecurity Security,
+ rtl_uString *ustrWorkDir,
+ rtl_uString *ustrEnvironment[],
+ sal_uInt32 nEnvironmentVars,
+ oslProcess *pProcess,
+ oslFileHandle *pInputWrite,
+ oslFileHandle *pOutputRead,
+ oslFileHandle *pErrorRead
+ )
+{
+
+ oslProcessError Error;
+ sal_Char* pszWorkDir=0;
+ sal_Char** pArguments=0;
+ sal_Char** pEnvironment=0;
+ unsigned int index;
+
+ char szImagePath[PATH_MAX] = "";
+ char szWorkDir[PATH_MAX] = "";
+
+#if 0
+ if (Options & osl_Process_SEARCHPATH)
+ {
+ const rtl::OUString PATH1;
+ OUString PATH (RTL_CONSTASCII_USTRINGPARAM("PATH"));
+
+ rtl_uString * pSearchPath = 0;
+ osl_getEnvironment (PATH.pData, &pSearchPath);
+ if (pSearchPath)
+ {
+ rtl_uString * pSearchResult = 0;
+ osl_searchPath (ustrImageName, pSearchPath, &pSearchResult);
+ if (pSearchResult)
+ {
+ rtl_uString_assign (ustrImageName, pSearchResult);
+ rtl_uString_release (pSearchResult);
+ }
+ rtl_uString_release (pSearchPath);
+ }
+ }
+#endif
+
+ if ( ustrImageName && ustrImageName->length )
+ {
+ FileURLToPath( szImagePath, PATH_MAX, ustrImageName );
+ }
+
+ if ( ustrWorkDir != 0 && ustrWorkDir->length )
+ {
+ FileURLToPath( szWorkDir, PATH_MAX, ustrWorkDir );
+ pszWorkDir = szWorkDir;
+ }
+
+ if ( pArguments == 0 && nArguments > 0 )
+ {
+ pArguments = (sal_Char**) malloc( ( nArguments + 2 ) * sizeof(sal_Char*) );
+ }
+
+
+ for ( index = 0 ; index < nArguments ; ++index )
+ {
+ rtl_String* strArg =0;
+
+
+ rtl_uString2String( &strArg,
+ rtl_uString_getStr(ustrArguments[index]),
+ rtl_uString_getLength(ustrArguments[index]),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ pArguments[index]=strdup(rtl_string_getStr(strArg));
+ rtl_string_release(strArg);
+ pArguments[index+1]=0;
+ }
+
+ for ( index = 0 ; index < nEnvironmentVars ; ++index )
+ {
+ rtl_String* strEnv=0;
+
+ if ( pEnvironment == 0 )
+ {
+ pEnvironment = (sal_Char**) malloc( ( nEnvironmentVars + 2 ) * sizeof(sal_Char*) );
+ }
+
+ rtl_uString2String( &strEnv,
+ rtl_uString_getStr(ustrEnvironment[index]),
+ rtl_uString_getLength(ustrEnvironment[index]),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ pEnvironment[index]=strdup(rtl_string_getStr(strEnv));
+ rtl_string_release(strEnv);
+ pEnvironment[index+1]=0;
+ }
+
+ int rc, pid;
+ int saveOutput = -1, saveInput = -1, saveError = -1;
+ int stdOutput[2] = { -1, -1 }, stdInput[2] = { -1, -1 }, stdError[2] = { -1, -1 };
+ FILE *i, *o, *e;
+
+ if (pInputWrite)
+ pipe( stdInput);
+ if (pOutputRead)
+ pipe( stdOutput);
+ if (pErrorRead)
+ pipe( stdError);
+
+ fcntl( stdInput[0], F_SETFD, FD_CLOEXEC);
+ fcntl( stdInput[1], F_SETFD, FD_CLOEXEC);
+ fcntl( stdOutput[0], F_SETFD, FD_CLOEXEC);
+ fcntl( stdOutput[1], F_SETFD, FD_CLOEXEC);
+ fcntl( stdError[0], F_SETFD, FD_CLOEXEC);
+ fcntl( stdError[1], F_SETFD, FD_CLOEXEC);
+
+ saveInput = dup( STDIN_FILENO);
+ fcntl( saveInput, F_SETFD, FD_CLOEXEC);
+ dup2( stdInput[0], STDIN_FILENO );
+ close( stdInput[0] );
+
+ saveOutput = dup( STDOUT_FILENO);
+ fcntl( saveOutput, F_SETFD, FD_CLOEXEC);
+ dup2( stdOutput[1], STDOUT_FILENO );
+ close( stdOutput[1] );
+
+ saveError = dup( STDERR_FILENO);
+ fcntl( saveError, F_SETFD, FD_CLOEXEC);
+ dup2( stdError[1], STDERR_FILENO );
+ close( stdError[1] );
+
+ Error = osl_psz_executeProcess(szImagePath,
+ pArguments,
+ Options,
+ Security,
+ pszWorkDir,
+ pEnvironment,
+ pProcess,
+ pInputWrite,
+ pOutputRead,
+ pErrorRead
+ );
+
+ if ( pInputWrite )
+ *(pInputWrite) = osl_createFileHandleFromFD( stdInput[1] );
+
+ if ( pOutputRead )
+ *(pOutputRead) = osl_createFileHandleFromFD( stdOutput[0] );
+
+ if ( pErrorRead )
+ *(pErrorRead) = osl_createFileHandleFromFD( stdError[0] );
+
+ // restore handles
+ dup2( saveInput, STDIN_FILENO);
+ close( saveInput);
+ dup2( saveOutput, STDOUT_FILENO);
+ close( saveOutput);
+ dup2( saveError, STDERR_FILENO);
+ close( saveError);
+
+ if ( pArguments != 0 )
+ {
+ for ( index = 0 ; index < nArguments ; ++index )
+ {
+ if ( pArguments[index] != 0 )
+ {
+ free(pArguments[index]);
+ }
+ }
+ free(pArguments);
+ }
+
+ if ( pEnvironment != 0 )
+ {
+ for ( index = 0 ; index < nEnvironmentVars ; ++index )
+ {
+ if ( pEnvironment[index] != 0 )
+ {
+ free(pEnvironment[index]);
+ }
+ }
+ free(pEnvironment);
+ }
+
+ return Error;
+}
+
+/**********************************************
+ osl_executeProcess
+ *********************************************/
+
+oslProcessError SAL_CALL osl_executeProcess(
+ rtl_uString *ustrImageName,
+ rtl_uString *ustrArguments[],
+ sal_uInt32 nArguments,
+ oslProcessOption Options,
+ oslSecurity Security,
+ rtl_uString *ustrWorkDir,
+ rtl_uString *ustrEnvironment[],
+ sal_uInt32 nEnvironmentVars,
+ oslProcess *pProcess
+ )
+{
+ return osl_executeProcess_WithRedirectedIO(
+ ustrImageName,
+ ustrArguments,
+ nArguments,
+ Options,
+ Security,
+ ustrWorkDir,
+ ustrEnvironment,
+ nEnvironmentVars,
+ pProcess,
+ NULL,
+ NULL,
+ NULL
+ );
+}
+
+/**********************************************
+ osl_psz_executeProcess
+ *********************************************/
+
+oslProcessError SAL_CALL osl_psz_executeProcess(sal_Char *pszImageName,
+ sal_Char *pszArguments[],
+ oslProcessOption Options,
+ oslSecurity Security,
+ sal_Char *pszDirectory,
+ sal_Char *pszEnvironments[],
+ oslProcess *pProcess,
+ oslFileHandle *pInputWrite,
+ oslFileHandle *pOutputRead,
+ oslFileHandle *pErrorRead
+ )
+{
+ ULONG ulSessID = 0; /* Session ID returned */
+ PID pidProcess;
+ APIRET rc;
+ sal_Char* pStr;
+ sal_Char* args;
+ sal_Char* envs;
+ int i;
+ int n = 1;
+ oslProcessImpl* pProcImpl;
+ ULONG nAppType, nOwnAppType;
+ ULONG nCurrentDisk, nDriveMap, nBufSize;
+ int first = 0;
+ sal_Char path[ _MAX_PATH ];
+ sal_Char currentDir[ _MAX_PATH ];
+ sal_Char ownfilename[ _MAX_PATH ];
+ RESULTCODES resultCode;
+ char** p;
+
+ /* get imagename from arg list, if not specified */
+ if (pszImageName == NULL)
+ pszImageName = pszArguments[first++];
+
+ OSL_ASSERT(pszImageName != NULL);
+
+ /* check application type */
+ rc = DosQueryAppType( (PCSZ) pszImageName, &nAppType );
+ if( rc != NO_ERROR )
+ {
+ if( (rc == ERROR_FILE_NOT_FOUND) || (rc == ERROR_PATH_NOT_FOUND) )
+ return osl_Process_E_NotFound;
+ else
+ return osl_Process_E_Unknown;
+ }
+
+ /* backup current disk information */
+ if(DosQueryCurrentDisk(&nCurrentDisk, &nDriveMap))
+ {
+ nCurrentDisk = 0;
+ }
+
+ /* backup current directory information */
+ nBufSize = _MAX_PATH;
+ if(DosQueryCurrentDir(0, (BYTE*)currentDir, &nBufSize))
+ {
+ *currentDir = '\0';
+ }
+
+ /* change to working directory */
+ if(pszDirectory && pszDirectory[1] == ':')
+ {
+ BYTE nDrive = toupper(pszDirectory[0]) - 'A' + 1;
+
+ if(NO_ERROR == DosSetDefaultDisk(nDrive))
+ {
+ DosSetCurrentDir((PSZ) pszDirectory);
+ }
+ }
+
+ /* query current executable filename and application type */
+ {
+ CHAR szName[CCHMAXPATH];
+ PPIB ppib;
+ PTIB ptib;
+ APIRET rc;
+ rc = DosGetInfoBlocks(&ptib, &ppib);
+ rc = DosQueryModuleName(ppib->pib_hmte, sizeof(szName), szName);
+ DosQueryAppType( (PCSZ)szName, &nOwnAppType );
+ }
+
+ /* combination of flags WAIT and DETACHED not supported */
+ if( (Options & osl_Process_DETACHED) && (Options & osl_Process_WAIT) )
+ Options &= !osl_Process_DETACHED;
+
+ /* start in same session if possible and detached flag not set */
+ if( ((nAppType & 0x00000007) == (nOwnAppType & 0x00000007))
+/* && ((Options & osl_Process_DETACHED) == 0) */ )
+ {
+ CHAR szbuf[CCHMAXPATH];
+
+ /* calculate needed space for arguments */
+ n = strlen( pszImageName ) + 1;
+ if( pszArguments )
+ for (i = first; pszArguments[i] != NULL; i++)
+ n += strlen(pszArguments[i]) + 1;
+
+ /* allocate space for arguments */
+ args = (sal_Char*)malloc(n + 1);
+ pStr = args;
+
+ /* add program name as first string to arguments */
+ memcpy(pStr, pszImageName, strlen( pszImageName ) );
+ pStr += strlen( pszImageName );
+ *pStr++ = '\0';
+
+ /* add given strings to arguments */
+ if( pszArguments )
+ for (i = first; pszArguments[i] != NULL; i++)
+ {
+ memcpy(pStr, pszArguments[i], strlen( pszArguments[i] ) );
+ pStr += strlen( pszArguments[i] );
+ if (pszArguments[i+1] != NULL)
+ *pStr++ = ' ';
+ }
+
+ /* set end marker for arguments */
+ *pStr++ = '\0';
+ *pStr = '\0';
+
+ OSL_TRACE( "osl_executeProcess with DosExecPgm (args: %s)\n", args );
+
+ /* calculate needed space for environment: since enviroment var search
+ is a linear scan of the current enviroment, we place new variables
+ before existing ones; so the child will find new definitions before
+ olders; this doesn't require us to replace existing vars */
+ // existing enviroment size
+ n = 0;
+ p = environ;
+ while( *p)
+ {
+ int l = strlen( *p);
+ n += l + 1;
+ p++;
+ }
+ // new env size (if exists)
+ if( pszEnvironments )
+ {
+ for (i = 0; pszEnvironments[i] != NULL; i++)
+ n += strlen(pszEnvironments[i]) + 1;
+ }
+ /* allocate space for environment */
+ envs = (sal_Char*)malloc(n + 1);
+ pStr = envs;
+
+ // add new vars
+ if( pszEnvironments )
+ {
+ /* add given strings to environment */
+ for (i = 0; pszEnvironments[i] != NULL; i++)
+ {
+ memcpy(pStr, pszEnvironments[i], strlen( pszEnvironments[i] ) );
+ pStr += strlen( pszEnvironments[i] );
+ *pStr++ = '\0';
+ }
+ }
+ // add existing vars
+ p = environ;
+ while( *p)
+ {
+ memcpy(pStr, *p, strlen( *p ) );
+ pStr += strlen( *p );
+ *pStr++ = '\0';
+ p++;
+ }
+ /* set end marker for environment */
+ *pStr = '\0';
+
+
+ if(Options & osl_Process_DETACHED)
+ {
+ rc = DosExecPgm( szbuf, sizeof( szbuf ), EXEC_BACKGROUND,
+ (PSZ) args, (PSZ) envs, &resultCode, (PSZ) pszImageName );
+ }
+ else
+ {
+ rc = DosExecPgm( szbuf, sizeof( szbuf ), EXEC_ASYNCRESULT,
+ (PSZ) args, (PSZ) envs, &resultCode, (PSZ) pszImageName );
+ }
+
+ pidProcess = resultCode.codeTerminate;
+
+ /* cleanup */
+ free(envs);
+ free(args);
+
+ /* error handling */
+ if( rc != NO_ERROR )
+ return osl_Process_E_Unknown;
+ }
+
+ else
+ {
+ STARTDATA SData = { 0 };
+ UCHAR achObjBuf[ 256 ] = { 0 };
+
+ /* combine arguments separated by spaces */
+ if( pszArguments )
+ {
+ for (i = first; pszArguments[i] != NULL; i++)
+ n += strlen(pszArguments[i]) + 1;
+ // YD DosStartSession requires low-mem buffers!
+ args = (sal_Char*)_tmalloc(n);
+ *args = '\0';
+ for (i = first; pszArguments[i] != NULL; i++)
+ {
+ strcat(args, pszArguments[i]);
+ strcat(args, " ");
+ }
+ }
+ else
+ args = NULL;
+
+ /* combine environment separated by NULL */
+ if( pszEnvironments )
+ {
+ for (i = 0; pszEnvironments[i] != NULL; i++)
+ n += strlen(pszEnvironments[i]) + 1;
+ // YD DosStartSession requires low-mem buffers!
+ envs = (sal_Char*)_tmalloc(n + 1);
+ pStr = (sal_Char*)envs;
+ for (i = 0; pszEnvironments[i] != NULL; i++)
+ {
+ memcpy(pStr, pszEnvironments[i], strlen( pszEnvironments[i] ) );
+ pStr += strlen( pszEnvironments[i] );
+ *pStr = '\0';
+ pStr++;
+ }
+ *pStr = '\0';
+ }
+ else
+ envs = NULL;
+
+ /* initialize data structure */
+ memset( &SData, 0, sizeof( STARTDATA ) );
+ SData.Length = sizeof(STARTDATA);
+
+ OSL_TRACE( "osl_executeProcess with DosStartSession (args: %s)\n", args );
+
+ /* OS/2 Application ? */
+ if(nAppType & 0x00000007)
+ {
+
+ /* inherit options from parent */
+ SData.InheritOpt = SSF_INHERTOPT_PARENT;
+
+ switch (Options & (osl_Process_NORMAL | osl_Process_MINIMIZED |
+ osl_Process_MAXIMIZED | osl_Process_FULLSCREEN))
+ {
+ case osl_Process_MINIMIZED:
+ SData.SessionType = SSF_TYPE_DEFAULT;
+ SData.PgmControl |= SSF_CONTROL_MINIMIZE;
+ break;
+
+ case osl_Process_MAXIMIZED:
+ SData.SessionType = SSF_TYPE_DEFAULT;
+ SData.PgmControl |= SSF_CONTROL_MAXIMIZE;
+ break;
+
+ case osl_Process_FULLSCREEN:
+ SData.SessionType = SSF_TYPE_FULLSCREEN;
+ break;
+
+ default:
+ SData.SessionType = SSF_TYPE_DEFAULT;
+ } /* switch */
+ }
+
+
+ if( Options & osl_Process_DETACHED )
+ {
+ /* start an independent session */
+ SData.Related = SSF_RELATED_INDEPENDENT;
+ SData.TermQ = NULL;
+ }
+ else
+ {
+ /* start a child session and set Termination Queue */
+ SData.Related = SSF_RELATED_CHILD;
+
+ if(! bInitSessionTerm)
+ bInitSessionTerm = InitSessionTerm();
+
+ SData.TermQ = (BYTE*) SessionTermQueueName;
+ }
+
+ SData.FgBg = SSF_FGBG_FORE; /* start session in foreground */
+ SData.TraceOpt = SSF_TRACEOPT_NONE; /* No trace */
+
+ SData.PgmTitle = NULL;
+ SData.PgmInputs = (BYTE*)args;
+ SData.PgmName = (PSZ) pszImageName;
+ SData.Environment = (BYTE*)envs;
+
+ if( Options & osl_Process_HIDDEN )
+ SData.PgmControl |= SSF_CONTROL_INVISIBLE;
+ else
+ SData.PgmControl |= SSF_CONTROL_VISIBLE;
+
+ SData.ObjectBuffer = (PSZ) achObjBuf;
+ SData.ObjectBuffLen = (ULONG) sizeof(achObjBuf);
+
+
+ /* Start the session */
+ rc = DosStartSession( &SData, &ulSessID, &pidProcess );
+
+ /* ignore error "session started in background" */
+ if( rc == ERROR_SMG_START_IN_BACKGROUND )
+ rc = NO_ERROR;
+
+
+ if(envs)
+ _tfree(envs);
+ if(args)
+ _tfree(args);
+
+ if( rc != NO_ERROR )
+ return osl_Process_E_Unknown;
+
+ } /* else */
+
+
+ /* restore current disk */
+ if(nCurrentDisk)
+ {
+ DosSetDefaultDisk(nCurrentDisk);
+ }
+
+ /* restore current drive information */
+ if(*currentDir)
+ {
+ DosSetCurrentDir((PCSZ)currentDir);
+ }
+
+ /* allocate intern process structure and store child process ID */
+ pProcImpl = (oslProcessImpl*)malloc(sizeof(oslProcessImpl));
+ pProcImpl->pProcess = pidProcess;
+ pProcImpl->nSessionID = ulSessID;
+
+ pProcImpl->bResultCodeValid = FALSE;
+
+ if( Options & osl_Process_WAIT )
+ osl_joinProcess(pProcImpl);
+
+ *pProcess = (oslProcess)pProcImpl;
+
+ if( rc == NO_ERROR )
+ return osl_Process_E_None;
+ else
+
+ return osl_Process_E_Unknown;
+}
+
+/*----------------------------------------------------------------------------*/
+
+oslProcessError SAL_CALL osl_terminateProcess(oslProcess Process)
+{
+ if (Process == NULL)
+ return osl_Process_E_Unknown;
+
+ /* Stop the session */
+ DosStopSession( STOP_SESSION_SPECIFIED, ((oslProcessImpl*)Process)->nSessionID );
+
+ return osl_Process_E_None;
+}
+
+/*----------------------------------------------------------------------------*/
+
+oslProcess SAL_CALL osl_getProcess(oslProcessIdentifier Ident)
+{
+ HANDLE hProcess;
+ oslProcessImpl* pProcImpl;
+
+ /* check, if given PID is a valid process */
+ if (FALSE)
+ {
+ pProcImpl = (oslProcessImpl*)malloc(sizeof(oslProcessImpl));
+/*
+ pProcImpl->pProcess = pidProcess;
+ pProcImpl->nSessionID = ulSessID;
+*/
+ }
+ else
+ pProcImpl = NULL;
+
+ return (pProcImpl);
+}
+
+/*----------------------------------------------------------------------------*/
+
+void SAL_CALL osl_freeProcessHandle(oslProcess Process)
+{
+ /* free intern process structure */
+ if (Process != NULL)
+ free((oslProcessImpl*)Process);
+}
+
+/*----------------------------------------------------------------------------*/
+
+oslProcessError SAL_CALL osl_joinProcess(oslProcess Process)
+{
+ oslProcessImpl* pProcImpl = (oslProcessImpl*) Process;
+ APIRET rc;
+
+ if (Process == NULL)
+ return osl_Process_E_Unknown;
+
+ /* process of same session ? */
+ if( pProcImpl->nSessionID == 0 )
+ {
+ RESULTCODES resultCode;
+ PID pidEnded;
+
+ rc = DosWaitChild( DCWA_PROCESS, DCWW_WAIT, &resultCode,
+ &pidEnded, pProcImpl->pProcess );
+
+ if( rc == NO_ERROR )
+ {
+ pProcImpl->nResultCode = resultCode.codeResult;
+ pProcImpl->bResultCodeValid = TRUE;
+
+ return osl_Process_E_None;
+ }
+ }
+ else
+ {
+ ULONG pcbData, ulElement = 0;
+ REQUESTDATA rdData;
+ BYTE bPriority;
+ struct {
+ USHORT SessionID;
+ USHORT ReturnValue;
+ } *pvBuffer;
+
+ /* search/wait for the correct entry in termination queue */
+ while( ( rc = DosPeekQueue( SessionTermQueue, &rdData, &pcbData,
+ (PPVOID) &pvBuffer, &ulElement, DCWW_WAIT,
+ &bPriority, NULLHANDLE )) == NO_ERROR )
+ {
+
+ if( pvBuffer->SessionID == pProcImpl->nSessionID )
+ {
+ pProcImpl->nResultCode = pvBuffer->ReturnValue;
+ pProcImpl->bResultCodeValid = TRUE;
+
+ /* remove item from queue */
+ rc = DosReadQueue( SessionTermQueue, &rdData, &pcbData,
+ (PPVOID)&pvBuffer, ulElement, DCWW_WAIT,
+ &bPriority, NULLHANDLE );
+
+ if( rc == NO_ERROR )
+ return osl_Process_E_None;
+ else
+ return osl_Process_E_Unknown;
+ }
+ } /* while */
+ }
+ return osl_Process_E_Unknown;
+}
+
+/***************************************************************************/
+
+//YD FIXME incomplete!
+oslProcessError SAL_CALL osl_joinProcessWithTimeout(oslProcess Process, const TimeValue* pTimeout)
+{
+ return osl_joinProcess( Process);
+}
+
+/*----------------------------------------------------------------------------*/
+
+oslProcessError SAL_CALL osl_getCommandArgs( sal_Char* pszBuffer, sal_uInt32 Max)
+{
+
+ static int CmdLen = -1;
+ static sal_Char CmdLine[_MAX_CMD];
+
+ OSL_ASSERT(pszBuffer);
+ OSL_ASSERT(Max > 1);
+
+ /* Query commandline during first call of function only */
+ if (CmdLen < 0)
+ {
+ sal_Bool bEscaped = sal_False;
+ sal_Bool bSeparated = sal_True;
+ sal_Char* pszBufferOrg = pszBuffer;
+ sal_Char* pszCmdLine;
+
+ /* get pointer to commandline */
+ {
+ PTIB pptib = NULL;
+ PPIB pppib = NULL;
+
+ DosGetInfoBlocks(&pptib, &pppib);
+ pszCmdLine = pppib->pib_pchcmd;
+ }
+
+ /* skip first string */
+ while( *pszCmdLine )
+ pszCmdLine++;
+
+ /* concatenate commandline arguments for the given string */
+ Max -= 2;
+ while ( !((*pszCmdLine == '\0') && (*(pszCmdLine + 1) == '\0')) && (Max > 0))
+ {
+ /*
+ * C-Runtime expects char to be unsigned and so to be
+ * preceeded with 00 instead of FF when converting to int
+ */
+ int n = *((unsigned char *) pszCmdLine);
+ if (! (isspace(n) || (*pszCmdLine == '\0')) )
+ {
+ if (*pszCmdLine == '"')
+ {
+ if (*(pszCmdLine + 1) != '"')
+ bEscaped = ! bEscaped;
+ else
+ {
+ pszCmdLine++;
+ *pszBuffer++ = *pszCmdLine;
+ Max--;
+ }
+ }
+ else
+ {
+ *pszBuffer++ = *pszCmdLine;
+ Max--;
+ }
+ bSeparated = sal_False;
+ }
+ else
+ {
+ if (bEscaped)
+ *pszBuffer++ = *pszCmdLine;
+ else
+ if (! bSeparated)
+ {
+ *pszBuffer++ = '\0';
+ bSeparated = sal_True;
+ }
+ Max--;
+ }
+
+ pszCmdLine++;
+ }
+
+ *pszBuffer++ = '\0';
+ *pszBuffer++ = '\0';
+
+ /* restore pointer and save commandline for next query */
+ CmdLen = pszBuffer - pszBufferOrg;
+ pszBuffer = pszBufferOrg;
+ memcpy( CmdLine, pszBuffer, CmdLen );
+ }
+ else
+ memcpy( pszBuffer, CmdLine, CmdLen );
+
+ OSL_TRACE( "osl_getCommandArgs (args: %s)\n", pszBuffer );
+
+ return osl_Process_E_None;
+}
+
+/*----------------------------------------------------------------------------*/
+
+oslProcessError SAL_CALL osl_getProcessInfo(oslProcess Process, oslProcessData Fields,
+ oslProcessInfo* pInfo)
+{
+ if (! pInfo || (pInfo->Size != sizeof(oslProcessInfo)))
+ return osl_Process_E_Unknown;
+
+ pInfo->Fields = 0;
+
+ if (Fields & osl_Process_IDENTIFIER)
+ {
+ if( Process == NULL )
+ {
+ PTIB pptib = NULL;
+ PPIB pppib = NULL;
+
+ DosGetInfoBlocks( &pptib, &pppib );
+ pInfo->Ident = pppib->pib_ulpid;
+ }
+ else
+ pInfo->Ident = ((oslProcessImpl*)Process)->pProcess;
+
+ pInfo->Fields |= osl_Process_IDENTIFIER;
+ }
+
+ if (Fields & osl_Process_EXITCODE)
+ {
+ oslProcessImpl* pProcImpl = (oslProcessImpl*) Process;
+
+ if( pProcImpl->bResultCodeValid )
+ {
+ pInfo->Code = pProcImpl->nResultCode;
+ pInfo->Fields |= osl_Process_EXITCODE;
+ }
+ else
+ {
+ APIRET rc;
+
+ if( pProcImpl->nSessionID == 0 )
+ {
+ RESULTCODES resultCode;
+ PID pidEnded;
+
+ rc = DosWaitChild( DCWA_PROCESS, DCWW_WAIT, &resultCode,
+ &pidEnded, pProcImpl->pProcess );
+
+ if( rc == NO_ERROR )
+ {
+ pProcImpl->nResultCode = resultCode.codeResult;
+ pProcImpl->bResultCodeValid = TRUE;
+
+ pInfo->Code = pProcImpl->nResultCode;
+ pInfo->Fields |= osl_Process_EXITCODE;
+
+ return osl_Process_E_None;
+ }
+ }
+ else
+ {
+ ULONG pcbData, ulElement = 0;
+ REQUESTDATA rdData;
+ BYTE bPriority;
+ struct {
+ USHORT SessionID;
+ USHORT ReturnValue;
+ } *pvBuffer;
+
+ /* search/wait for the correct entry in termination queue */
+ while( ( rc = DosPeekQueue( SessionTermQueue, &rdData, &pcbData,
+ (PPVOID) &pvBuffer, &ulElement, DCWW_WAIT,
+ &bPriority, NULLHANDLE )) == NO_ERROR )
+ {
+
+ if( pvBuffer->SessionID == pProcImpl->nSessionID )
+ {
+ pProcImpl->nResultCode = pvBuffer->ReturnValue;
+ pProcImpl->bResultCodeValid = TRUE;
+
+ pInfo->Code = pProcImpl->nResultCode;
+ pInfo->Fields |= osl_Process_EXITCODE;
+
+ /* remove item from queue */
+ rc = DosReadQueue( SessionTermQueue, &rdData, &pcbData,
+ (PPVOID)&pvBuffer, ulElement, DCWW_WAIT,
+ &bPriority, NULLHANDLE );
+
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (Fields & osl_Process_HEAPUSAGE)
+ {
+ }
+ if (Fields & osl_Process_CPUTIMES)
+ {
+ }
+
+ return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown;
+}
diff --git a/sal/osl/os2/process_impl.cxx b/sal/osl/os2/process_impl.cxx
new file mode 100644
index 000000000000..be6bb1898e65
--- /dev/null
+++ b/sal/osl/os2/process_impl.cxx
@@ -0,0 +1,463 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#define INCL_DOS
+#include <os2.h>
+
+#include "osl/process.h"
+#include <osl/mutex.h>
+
+#ifndef INCLUDED_LIMITS_H
+#include <limits.h>
+#define INCLUDED_LIMITS_H
+#endif
+
+#ifndef INCLUDED_PTHREAD_H
+#include <pthread.h>
+#define INCLUDED_PTHREAD_H
+#endif
+
+#ifndef INCLUDED_STDLIB_H
+#include <stdlib.h>
+#define INCLUDED_STDLIB_H
+#endif
+
+#ifndef INCLUDED_STRING_H
+#include <string.h>
+#define INCLUDED_STRING_H
+#endif
+#include "osl/diagnose.h"
+#include <osl/file.h>
+#include "osl/module.h"
+#include "osl/thread.h"
+#include "rtl/ustring.hxx"
+
+#ifndef _OSL_FILE_PATH_HELPER_H_
+#include "file_path_helper.h"
+#endif
+
+#ifndef _OSL_UUNXAPI_H_
+#include "uunxapi.h"
+#endif
+
+/***************************************
+ osl_bootstrap_getExecutableFile_Impl().
+
+ @internal
+ @see rtl_bootstrap
+ @see #i37371#
+
+ **************************************/
+
+extern "C" oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
+ rtl_uString ** ppFileURL
+) SAL_THROW_EXTERN_C();
+
+
+oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
+ rtl_uString ** ppFileURL
+) SAL_THROW_EXTERN_C()
+{
+ oslProcessError result = osl_Process_E_NotFound;
+ CHAR szName[CCHMAXPATH];
+ PPIB ppib;
+ PTIB ptib;
+ APIRET rc;
+
+ rc = DosGetInfoBlocks(&ptib, &ppib);
+ rc = DosQueryModuleName(ppib->pib_hmte, sizeof(szName), szName);
+
+ if (rc == 0)
+ {
+ rtl_uString * pAbsPath = 0;
+
+ rtl_string2UString(
+ &pAbsPath,
+ szName, strlen(szName), osl_getThreadTextEncoding(),
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+
+ if (pAbsPath)
+ {
+ /* Convert from path to url. */
+ if (osl_getFileURLFromSystemPath (pAbsPath, ppFileURL) == osl_File_E_None)
+ {
+ /* Success. */
+ result = osl_Process_E_None;
+ }
+ rtl_uString_release (pAbsPath);
+ }
+ }
+
+ return (result);
+}
+
+/***************************************
+ CommandArgs_Impl.
+ **************************************/
+struct CommandArgs_Impl
+{
+ oslMutex m_mutex;
+ sal_uInt32 m_nCount;
+ rtl_uString ** m_ppArgs;
+};
+
+static struct CommandArgs_Impl g_command_args =
+{
+ osl_createMutex(),
+ 0,
+ 0
+};
+
+/***************************************
+ osl_getExecutableFile().
+ **************************************/
+oslProcessError SAL_CALL osl_getExecutableFile (rtl_uString ** ppustrFile)
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ osl_acquireMutex(g_command_args.m_mutex);
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > 0)
+ {
+ /* CommandArgs set. Obtain argv[0]. */
+ rtl_uString_assign (ppustrFile, g_command_args.m_ppArgs[0]);
+ result = osl_Process_E_None;
+ }
+ osl_releaseMutex(g_command_args.m_mutex);
+
+ return (result);
+}
+
+/***************************************
+ osl_getCommandArgCount().
+ **************************************/
+sal_uInt32 SAL_CALL osl_getCommandArgCount (void)
+{
+ sal_uInt32 result = 0;
+
+ osl_acquireMutex(g_command_args.m_mutex);
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > 0)
+ result = g_command_args.m_nCount - 1;
+ osl_releaseMutex(g_command_args.m_mutex);
+
+ return (result);
+}
+
+/***************************************
+ osl_getCommandArg().
+ **************************************/
+oslProcessError SAL_CALL osl_getCommandArg (sal_uInt32 nArg, rtl_uString ** strCommandArg)
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ osl_acquireMutex(g_command_args.m_mutex);
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > (nArg + 1))
+ {
+ rtl_uString_assign (strCommandArg, g_command_args.m_ppArgs[nArg + 1]);
+ result = osl_Process_E_None;
+ }
+ osl_releaseMutex(g_command_args.m_mutex);
+
+ return (result);
+}
+
+/***************************************
+ osl_setCommandArgs().
+ **************************************/
+void SAL_CALL osl_setCommandArgs (int argc, char ** argv)
+{
+ OSL_ASSERT(argc > 0);
+ osl_acquireMutex(g_command_args.m_mutex);
+ OSL_ENSURE (g_command_args.m_nCount == 0, "osl_setCommandArgs(): CommandArgs already set.");
+ if (g_command_args.m_nCount == 0)
+ {
+ rtl_uString** ppArgs = (rtl_uString**)rtl_allocateZeroMemory (argc * sizeof(rtl_uString*));
+ if (ppArgs != 0)
+ {
+ rtl_TextEncoding encoding = osl_getThreadTextEncoding();
+ for (int i = 0; i < argc; i++)
+ {
+ rtl_string2UString (
+ &(ppArgs[i]),
+ argv[i], rtl_str_getLength (argv[i]), encoding,
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ }
+ if (ppArgs[0] != 0)
+ {
+ /* see @ osl_getExecutableFile(). */
+ if (rtl_ustr_indexOfChar (rtl_uString_getStr(ppArgs[0]), sal_Unicode('/')) == -1)
+ {
+ const rtl::OUString PATH (RTL_CONSTASCII_USTRINGPARAM("PATH"));
+
+ rtl_uString * pSearchPath = 0;
+ osl_getEnvironment (PATH.pData, &pSearchPath);
+ if (pSearchPath)
+ {
+ rtl_uString * pSearchResult = 0;
+ osl_searchPath (ppArgs[0], pSearchPath, &pSearchResult);
+ if (pSearchResult)
+ {
+ rtl_uString_assign (&(ppArgs[0]), pSearchResult);
+ rtl_uString_release (pSearchResult);
+ }
+ rtl_uString_release (pSearchPath);
+ }
+ }
+
+ rtl_uString * pArg0 = 0;
+ if (realpath_u (ppArgs[0], &pArg0))
+ {
+ osl_getFileURLFromSystemPath (pArg0, &(ppArgs[0]));
+ rtl_uString_release (pArg0);
+ }
+ }
+ g_command_args.m_nCount = argc;
+ g_command_args.m_ppArgs = ppArgs;
+ }
+ }
+ osl_releaseMutex(g_command_args.m_mutex);
+
+}
+
+/***************************************
+ osl_getEnvironment().
+ **************************************/
+oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uString** ppustrValue)
+{
+ oslProcessError result = osl_Process_E_NotFound;
+ rtl_TextEncoding encoding = osl_getThreadTextEncoding();
+ rtl_String* pstr_env_var = 0;
+
+ OSL_PRECOND(pustrEnvVar, "osl_getEnvironment(): Invalid parameter");
+ OSL_PRECOND(ppustrValue, "osl_getEnvironment(): Invalid parameter");
+
+ rtl_uString2String(
+ &pstr_env_var,
+ rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+ if (pstr_env_var != 0)
+ {
+ const char* p_env_var = getenv (rtl_string_getStr (pstr_env_var));
+ if (p_env_var != 0)
+ {
+ rtl_string2UString(
+ ppustrValue,
+ p_env_var, strlen(p_env_var), encoding,
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ OSL_ASSERT(*ppustrValue != NULL);
+
+ result = osl_Process_E_None;
+ }
+ rtl_string_release(pstr_env_var);
+ }
+
+ return (result);
+}
+
+/***************************************
+ osl_setEnvironment().
+ **************************************/
+oslProcessError SAL_CALL osl_setEnvironment(rtl_uString* pustrEnvVar, rtl_uString* pustrValue)
+{
+ oslProcessError result = osl_Process_E_Unknown;
+ rtl_TextEncoding encoding = osl_getThreadTextEncoding();
+ rtl_String* pstr_env_var = 0;
+ rtl_String* pstr_val = 0;
+
+ OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
+ OSL_PRECOND(pustrValue, "osl_setEnvironment(): Invalid parameter");
+
+ rtl_uString2String(
+ &pstr_env_var,
+ rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ rtl_uString2String(
+ &pstr_val,
+ rtl_uString_getStr(pustrValue), rtl_uString_getLength(pustrValue), encoding,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ if (pstr_env_var != 0 && pstr_val != 0)
+ {
+ //Can't determine if OS/2 EMX has a working setenv or not, so use putenv,
+ //feel free to use setenv here if its available and works
+ rtl_String * pBuffer = NULL;
+
+ sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer,
+ rtl_string_getLength(pstr_env_var) + rtl_string_getLength(pstr_val) + 1,
+ pstr_env_var );
+ rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1);
+ rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length,
+ rtl_string_getStr(pstr_val), rtl_string_getLength(pstr_val) );
+
+ rtl_string_acquire(pBuffer); // argument to putenv must leak on success
+
+ if (putenv(rtl_string_getStr(pBuffer)) == 0)
+ result = osl_Process_E_None;
+ else
+ rtl_string_release(pBuffer);
+ }
+
+ if (pstr_val)
+ rtl_string_release(pstr_val);
+
+ if (pstr_env_var != 0)
+ rtl_string_release(pstr_env_var);
+
+ return (result);
+}
+
+/***************************************
+ osl_clearEnvironment().
+ **************************************/
+oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString* pustrEnvVar)
+{
+ oslProcessError result = osl_Process_E_Unknown;
+ rtl_TextEncoding encoding = osl_getThreadTextEncoding();
+ rtl_String* pstr_env_var = 0;
+
+ OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
+
+ rtl_uString2String(
+ &pstr_env_var,
+ rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ if (pstr_env_var)
+ {
+ //Can't determine if OS/2 EMX has a working unsetenv or not, so use putenv,
+ //feel free to use unsetenv here if its available and works
+ rtl_String * pBuffer = NULL;
+
+ sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer,
+ rtl_string_getLength(pstr_env_var) + 1, pstr_env_var );
+ rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1);
+
+ rtl_string_acquire(pBuffer); // argument to putenv must leak on success
+
+ if (putenv(rtl_string_getStr(pBuffer)) == 0)
+ result = osl_Process_E_None;
+ else
+ rtl_string_release(pBuffer);
+
+ rtl_string_release(pstr_env_var);
+ }
+
+ return (result);
+}
+
+/***************************************
+ osl_getProcessWorkingDir().
+ **************************************/
+oslProcessError SAL_CALL osl_getProcessWorkingDir(rtl_uString **ppustrWorkingDir)
+{
+ oslProcessError result = osl_Process_E_Unknown;
+ char buffer[PATH_MAX];
+
+ OSL_PRECOND(ppustrWorkingDir, "osl_getProcessWorkingDir(): Invalid parameter");
+
+ if (getcwd (buffer, sizeof(buffer)) != 0)
+ {
+ rtl_uString* ustrTmp = 0;
+
+ rtl_string2UString(
+ &ustrTmp,
+ buffer, strlen(buffer), osl_getThreadTextEncoding(),
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ if (ustrTmp != 0)
+ {
+ if (osl_getFileURLFromSystemPath (ustrTmp, ppustrWorkingDir) == osl_File_E_None)
+ result = osl_Process_E_None;
+ rtl_uString_release (ustrTmp);
+ }
+ }
+
+ return (result);
+}
+
+/******************************************************************************
+ *
+ * new functions to set/return the current process locale
+ *
+ *****************************************************************************/
+
+struct ProcessLocale_Impl
+{
+ oslMutex m_mutex;
+ rtl_Locale * m_pLocale;
+};
+
+static struct ProcessLocale_Impl g_process_locale =
+{
+ osl_createMutex(),
+ 0
+};
+
+extern "C" void _imp_getProcessLocale( rtl_Locale ** );
+extern "C" int _imp_setProcessLocale( rtl_Locale * );
+
+/**********************************************
+ osl_getProcessLocale().
+ *********************************************/
+oslProcessError SAL_CALL osl_getProcessLocale( rtl_Locale ** ppLocale )
+{
+ OSL_PRECOND(ppLocale, "osl_getProcessLocale(): Invalid parameter.");
+
+ osl_acquireMutex(g_process_locale.m_mutex);
+
+ if (g_process_locale.m_pLocale == 0)
+ _imp_getProcessLocale (&(g_process_locale.m_pLocale));
+ *ppLocale = g_process_locale.m_pLocale;
+
+ osl_releaseMutex(g_process_locale.m_mutex);
+
+ return (osl_Process_E_None);
+}
+
+/**********************************************
+ osl_setProcessLocale().
+ *********************************************/
+oslProcessError SAL_CALL osl_setProcessLocale( rtl_Locale * pLocale )
+{
+ oslProcessError result = osl_Process_E_Unknown;
+
+ OSL_PRECOND(pLocale, "osl_setProcessLocale(): Invalid parameter.");
+
+ osl_acquireMutex(g_process_locale.m_mutex);
+ if (_imp_setProcessLocale (pLocale) == 0)
+ {
+ g_process_locale.m_pLocale = pLocale;
+ result = osl_Process_E_None;
+ }
+ osl_releaseMutex(g_process_locale.m_mutex);
+
+ return (result);
+}
+
diff --git a/sal/osl/os2/procimpl.h b/sal/osl/os2/procimpl.h
new file mode 100644
index 000000000000..5ff7a9f36b91
--- /dev/null
+++ b/sal/osl/os2/procimpl.h
@@ -0,0 +1,52 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_PROCIMPL_H_
+#define _OSL_PROCIMPL_H_
+
+
+#include <osl/process.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _oslProcessImpl {
+
+ PID pProcess;
+ sal_uInt32 nSessionID;
+ sal_uInt32 nResultCode;
+ BOOL bResultCodeValid;
+} oslProcessImpl;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/sal/osl/os2/profile.c b/sal/osl/os2/profile.c
new file mode 100644
index 000000000000..d9d166d0e091
--- /dev/null
+++ b/sal/osl/os2/profile.c
@@ -0,0 +1,2295 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+// YD #define min(a,b) (((a) < (b)) ? (a) : (b))
+
+#include <osl/security.h>
+#include <osl/diagnose.h>
+#include <osl/profile.h>
+#include <osl/process.h>
+#include <osl/thread.h>
+#include <osl/file.h>
+
+#define LINES_INI 32
+#define LINES_ADD 10
+#define SECTIONS_INI 5
+#define SECTIONS_ADD 3
+#define ENTRIES_INI 5
+#define ENTRIES_ADD 3
+
+
+#define STR_INI_EXTENSION ".ini"
+#define STR_INI_METAHOME "?~"
+#define STR_INI_METASYS "?$"
+#define STR_INI_METACFG "?^"
+#define STR_INI_METAINS "?#"
+
+#define STR_INI_BOOLYES "yes"
+#define STR_INI_BOOLON "on"
+#define STR_INI_BOOLONE "1"
+#define STR_INI_BOOLNO "no"
+#define STR_INI_BOOLOFF "off"
+#define STR_INI_BOOLZERO "0"
+
+#define FLG_USER 0x00FF
+#define FLG_AUTOOPEN 0x0100
+#define FLG_MODIFIED 0x0200
+
+#define SVERSION_LOCATION STR_INI_METACFG
+#define SVERSION_FALLBACK STR_INI_METASYS
+#define SVERSION_NAME "sversion"
+#define SVERSION_SECTION "Versions"
+#define SVERSION_SOFFICE "StarOffice"
+#define SVERSION_PROFILE "soffice.ini"
+#define SVERSION_OPTION "userid:"
+#define SVERSION_DIRS { "bin", "program" }
+#define SVERSION_USER "user"
+
+#define _BUILD_STR_(n) # n
+#define BUILD_STR(n) _BUILD_STR_(n)
+
+/* implemented in file.c */
+extern oslFileError FileURLToPath( char *, size_t, rtl_uString* );
+
+/*****************************************************************************/
+/* Data Type Definition */
+/*****************************************************************************/
+
+typedef struct _osl_TStamp
+{
+ FDATE m_Date;
+ FTIME m_Time;
+} osl_TStamp;
+
+typedef enum _osl_TLockMode
+{
+ un_lock, read_lock, write_lock
+} osl_TLockMode;
+
+typedef struct _osl_TFile
+{
+ HFILE m_Handle;
+/*
+ sal_Char* m_pReadPtr;
+ sal_Char m_ReadBuf[512];
+ sal_Char* m_pWritePtr;
+ sal_Char m_WriteBuf[512];
+*/
+ sal_Char* m_pReadPtr;
+ sal_Char m_ReadBuf[512];
+/* sal_Char* m_pWritePtr; */
+/* sal_Char m_WriteBuf[512]; */
+ sal_Char* m_pWriteBuf;
+ sal_uInt32 m_nWriteBufLen;
+ sal_uInt32 m_nWriteBufFree;
+} osl_TFile;
+
+typedef struct _osl_TProfileEntry
+{
+ sal_uInt32 m_Line;
+ sal_uInt32 m_Offset;
+ sal_uInt32 m_Len;
+} osl_TProfileEntry;
+
+typedef struct _osl_TProfileSection
+{
+ sal_uInt32 m_Line;
+ sal_uInt32 m_Offset;
+ sal_uInt32 m_Len;
+ sal_uInt32 m_NoEntries;
+ sal_uInt32 m_MaxEntries;
+ osl_TProfileEntry* m_Entries;
+} osl_TProfileSection;
+
+
+/*
+ Profile-data structure hidden behind oslProfile:
+*/
+typedef struct _osl_TProfileImpl
+{
+ sal_uInt32 m_Flags;
+ osl_TFile* m_pFile;
+ osl_TStamp m_Stamp;
+ //sal_Char m_Filename[_MAX_PATH + 1];
+ sal_uInt32 m_NoLines;
+ sal_uInt32 m_MaxLines;
+ sal_uInt32 m_NoSections;
+ sal_uInt32 m_MaxSections;
+ sal_Char** m_Lines;
+ rtl_uString *m_strFileName;
+ osl_TProfileSection* m_Sections;
+ HINI m_hIni;
+} osl_TProfileImpl;
+
+
+/*****************************************************************************/
+/* Static Module Function Declarations */
+/*****************************************************************************/
+
+//static osl_TFile* openFile(rtl_uString* pszFilename, sal_Bool bWriteable);
+//static osl_TStamp closeFile(osl_TFile* pFile);
+static osl_TFile* openFileImpl(rtl_uString * strFileName, oslProfileOption ProfileFlags );
+static osl_TStamp closeFileImpl(osl_TFile* pFile);
+static sal_Bool lockFile(const osl_TFile* pFile, osl_TLockMode eMode);
+static sal_Bool rewindFile(osl_TFile* pFile, sal_Bool bTruncate);
+static osl_TStamp getFileStamp(osl_TFile* pFile);
+
+static sal_Bool getLine(osl_TFile* pFile, const sal_Char *pszLine, int MaxLen);
+static sal_Bool putLine(osl_TFile* pFile, const sal_Char *pszLine);
+static const sal_Char* stripBlanks(const sal_Char* String, sal_uInt32* pLen);
+static const sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line);
+static const sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo);
+static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo);
+static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection,
+ sal_uInt32 NoEntry, sal_uInt32 Line,
+ const sal_Char* Entry, sal_uInt32 Len);
+static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection,
+ int Line, const sal_Char* Entry, sal_uInt32 Len);
+static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry);
+static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len);
+static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection);
+static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section,
+ const sal_Char* Entry, sal_uInt32 *pNoEntry);
+static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile);
+static sal_Bool storeProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile, sal_Bool bCleanup);
+static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable);
+static sal_Bool releaseProfile(osl_TProfileImpl* pProfile);
+static sal_Bool lookupProfile(const sal_Char *pszPath, const sal_Char *pszFile, sal_Char *pPath);
+
+
+static sal_Bool SAL_CALL osl_getProfileName(rtl_uString* strPath, rtl_uString* strName, rtl_uString** strProfileName);
+
+sal_Bool SAL_CALL osl_getFullPath(rtl_uString* pszFilename, sal_Char* pszPath, sal_uInt32 MaxLen)
+{
+ return NO_ERROR == DosQueryPathInfo( (PCSZ)pszFilename, FIL_QUERYFULLNAME, pszPath, MaxLen);
+}
+
+
+
+/*****************************************************************************/
+/* Exported Module Functions */
+/*****************************************************************************/
+
+oslProfile SAL_CALL osl_openProfile(rtl_uString *strProfileName, sal_uInt32 Flags)
+{
+ osl_TFile* pFile;
+ osl_TProfileImpl* pProfile;
+ rtl_uString *FileName=NULL;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_openProfile\n");
+#endif
+ OSL_VERIFY(strProfileName);
+
+/* if (rtl_uString_getLength(strProfileName) == 0 )
+ {
+ OSL_VERIFY(osl_getProfileName(NULL, NULL, &FileName));
+ }
+ else
+*/
+ {
+ rtl_uString_assign(&FileName, strProfileName);
+ }
+
+ osl_getSystemPathFromFileURL(FileName, &FileName);
+
+#ifdef DEBUG_OSL_PROFILE
+ Flags=osl_Profile_FLUSHWRITE;
+
+ // OSL_TRACE("opening '%s'\n",FileName);
+ if ( Flags == osl_Profile_DEFAULT )
+ {
+ OSL_TRACE("with osl_Profile_DEFAULT \n");
+ }
+ if ( Flags & osl_Profile_SYSTEM )
+ {
+ OSL_TRACE("with osl_Profile_SYSTEM \n");
+ }
+ if ( Flags & osl_Profile_READLOCK )
+ {
+ OSL_TRACE("with osl_Profile_READLOCK \n");
+ }
+ if ( Flags & osl_Profile_WRITELOCK )
+ {
+ OSL_TRACE("with osl_Profile_WRITELOCK \n");
+ }
+/* if ( Flags & osl_Profile_READWRITE ) */
+/* { */
+/* OSL_TRACE("with osl_Profile_READWRITE \n"); */
+/* } */
+ if ( Flags & osl_Profile_FLUSHWRITE )
+ {
+ OSL_TRACE("with osl_Profile_FLUSHWRITE \n");
+ }
+#endif
+
+ if ((! (Flags & osl_Profile_SYSTEM)) &&
+ ((pFile = openFileImpl(FileName, (Flags & osl_Profile_WRITELOCK) ? sal_True : sal_False)) == NULL))
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_openProfile [not opened]\n");
+#endif
+ if( FileName)
+ rtl_uString_release( FileName);
+
+ return (NULL);
+ }
+
+ pProfile = (osl_TProfileImpl*)calloc(1, sizeof(osl_TProfileImpl));
+
+ pProfile->m_Flags = Flags & FLG_USER;
+ osl_getSystemPathFromFileURL(strProfileName, &pProfile->m_strFileName);
+// rtl_uString_assign(&pProfile->m_strFileName, strProfileName);
+
+ if (Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK))
+ pProfile->m_pFile = pFile;
+
+ pProfile->m_Stamp = getFileStamp(pFile);
+
+ loadProfile(pFile, pProfile);
+
+ if (pProfile->m_pFile == NULL)
+ closeFileImpl(pFile);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_openProfile [ok]\n");
+#endif
+ if( FileName)
+ rtl_uString_release( FileName);
+
+ return pProfile;
+}
+
+sal_Bool SAL_CALL osl_closeProfile(oslProfile Profile)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_closeProfile\n");
+#endif
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [profile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ pProfile = acquireProfile(Profile,sal_True);
+
+ if ( pProfile != 0 )
+ {
+ if ( !( pProfile->m_Flags & osl_Profile_READLOCK ) && ( pProfile->m_Flags & FLG_MODIFIED ) )
+ {
+/* if (pProfile->m_pFile == NULL) */
+/* pProfile->m_pFile = openFileImpl(pProfile->m_Filename, sal_True); */
+
+ storeProfile(pProfile->m_pFile, pProfile, sal_False);
+ }
+ }
+ else
+ {
+ pProfile = acquireProfile(Profile,sal_False);
+ }
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [pProfile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ if (pProfile->m_pFile != NULL)
+ closeFileImpl(pProfile->m_pFile);
+ }
+
+ pProfile->m_pFile = NULL;
+ rtl_uString_release(pProfile->m_strFileName);
+ pProfile->m_strFileName = NULL;
+
+ /* release whole profile data types memory */
+ if ( pProfile->m_NoLines > 0)
+ {
+ unsigned int index=0;
+ if ( pProfile->m_Lines != 0 )
+ {
+ for ( index = 0 ; index < pProfile->m_NoLines ; ++index)
+ {
+ if ( pProfile->m_Lines[index] != 0 )
+ {
+ free(pProfile->m_Lines[index]);
+ }
+ }
+ free(pProfile->m_Lines);
+ }
+ if ( pProfile->m_Sections != 0 )
+ {
+ /*osl_TProfileSection* pSections=pProfile->m_Sections;*/
+ for ( index = 0 ; index < pProfile->m_NoSections ; ++index )
+ {
+ if ( pProfile->m_Sections[index].m_Entries != 0 )
+ {
+ free(pProfile->m_Sections[index].m_Entries);
+ }
+ }
+ free(pProfile->m_Sections);
+ }
+
+ }
+ free(pProfile);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [ok]\n");
+#endif
+ return (sal_True);
+}
+
+sal_Bool SAL_CALL osl_flushProfile(oslProfile Profile)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*) Profile;
+ osl_TFile* pFile;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_flushProfile()\n");
+#endif
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [pProfile == 0]\n");
+#endif
+ return sal_False;
+ }
+
+ pFile = pProfile->m_pFile;
+ if ( !( pFile != 0 && pFile->m_Handle >= 0 ) )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [invalid file]\n");
+#endif
+ return sal_False;
+ }
+
+ if ( pProfile->m_Flags & FLG_MODIFIED )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("swapping to storeprofile\n");
+#endif
+ bRet = storeProfile(pFile,pProfile,sal_False);
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [ok]\n");
+#endif
+ return bRet;
+}
+
+sal_Bool SAL_CALL osl_readProfileString(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Char* pszString, sal_uInt32 MaxLen,
+ const sal_Char* pszDefault)
+{
+ sal_uInt32 NoEntry;
+ const sal_Char* pStr = 0;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileString\n");
+#endif
+
+ pProfile = acquireProfile(Profile, sal_False);
+
+ if (pProfile == NULL)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [pProfile==0]\n");
+#endif
+
+
+ return (sal_False);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) &&
+ (NoEntry < pSec->m_NoEntries) &&
+ ((pStr = strchr(pProfile->m_Lines[pSec->m_Entries[NoEntry].m_Line],
+ '=')) != NULL))
+ pStr++;
+ else
+ pStr = pszDefault;
+
+ if ( pStr != 0 )
+ {
+ pStr = stripBlanks(pStr, NULL);
+ MaxLen = (MaxLen - 1 < strlen(pStr)) ? (MaxLen - 1) : strlen(pStr);
+ pStr = stripBlanks(pStr, &MaxLen);
+ strncpy(pszString, pStr, MaxLen);
+ pszString[MaxLen] = '\0';
+ }
+ }
+ else
+ PrfQueryProfileString(pProfile->m_hIni, (PCSZ)pszSection,
+ (PCSZ)pszEntry, (PCSZ)pszDefault,
+ pszString, MaxLen);
+
+ releaseProfile(pProfile);
+
+ if ( pStr == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [pStr==0]\n");
+#endif
+
+
+ return (sal_False);
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [ok]\n");
+#endif
+
+ return (sal_True);
+}
+
+
+sal_Bool SAL_CALL osl_readProfileBool(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Bool Default)
+{
+ sal_Char Line[32];
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileBool\n");
+#endif
+
+ if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), ""))
+ {
+ if ((stricmp(Line, STR_INI_BOOLYES) == 0) ||
+ (stricmp(Line, STR_INI_BOOLON) == 0) ||
+ (stricmp(Line, STR_INI_BOOLONE) == 0))
+ Default = sal_True;
+ else
+ if ((stricmp(Line, STR_INI_BOOLNO) == 0) ||
+ (stricmp(Line, STR_INI_BOOLOFF) == 0) ||
+ (stricmp(Line, STR_INI_BOOLZERO) == 0))
+ Default = sal_False;
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileBool [ok]\n");
+#endif
+
+ return (Default);
+}
+
+
+sal_uInt32 SAL_CALL osl_readProfileIdent(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_uInt32 FirstId, const sal_Char* Strings[],
+ sal_uInt32 Default)
+{
+ sal_uInt32 i;
+ sal_Char Line[256];
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileIdent\n");
+#endif
+
+ if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), ""))
+ {
+ i = 0;
+ while (Strings[i] != NULL)
+ {
+ if (stricmp(Line, Strings[i]) == 0)
+ {
+ Default = i + FirstId;
+ break;
+ }
+ i++;
+ }
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileIdent [ok]\n");
+#endif
+ return (Default);
+}
+
+
+sal_Bool SAL_CALL osl_writeProfileString(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ const sal_Char* pszString)
+{
+ sal_uInt32 i;
+ sal_Bool bRet = sal_False;
+ sal_uInt32 NoEntry;
+ const sal_Char* pStr;
+ sal_Char Line[4096];
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileString\n");
+#endif
+
+ pProfile = acquireProfile(Profile, sal_True);
+
+ if (pProfile == NULL)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [pProfile==0]\n");
+#endif
+ return (sal_False);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if ((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) == NULL)
+ {
+ Line[0] = '\0';
+ addLine(pProfile, Line);
+
+ Line[0] = '[';
+ strcpy(&Line[1], pszSection);
+ Line[1 + strlen(pszSection)] = ']';
+ Line[2 + strlen(pszSection)] = '\0';
+
+ if (((pStr = addLine(pProfile, Line)) == NULL) ||
+ (! addSection(pProfile, pProfile->m_NoLines - 1, &pStr[1], strlen(pszSection))))
+ {
+ releaseProfile(pProfile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [not added]\n");
+#endif
+ return (sal_False);
+ }
+
+ pSec = &pProfile->m_Sections[pProfile->m_NoSections - 1];
+ NoEntry = pSec->m_NoEntries;
+ }
+
+ Line[0] = '\0';
+ strcpy(&Line[0], pszEntry);
+ Line[0 + strlen(pszEntry)] = '=';
+ strcpy(&Line[1 + strlen(pszEntry)], pszString);
+
+ if (NoEntry >= pSec->m_NoEntries)
+ {
+ if (pSec->m_NoEntries > 0)
+ i = pSec->m_Entries[pSec->m_NoEntries - 1].m_Line + 1;
+ else
+ i = pSec->m_Line + 1;
+
+ if (((pStr = insertLine(pProfile, Line, i)) == NULL) ||
+ (! addEntry(pProfile, pSec, i, pStr, strlen(pszEntry))))
+ {
+ releaseProfile(pProfile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [not inserted]\n");
+#endif
+ return (sal_False);
+ }
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ else
+ {
+ i = pSec->m_Entries[NoEntry].m_Line;
+ free(pProfile->m_Lines[i]);
+ pProfile->m_Lines[i] = strdup(Line);
+ setEntry(pProfile, pSec, NoEntry, i, pProfile->m_Lines[i], strlen(pszEntry));
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ }
+ else
+ PrfWriteProfileString(pProfile->m_hIni, (PCSZ)pszSection,
+ (PCSZ)pszEntry, (PCSZ)pszString);
+
+ bRet = releaseProfile(pProfile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [ok]\n");
+#endif
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_writeProfileBool(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Bool Value)
+{
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileBool\n");
+#endif
+
+ if (Value)
+ bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLONE);
+ else
+ bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLZERO);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileBool [ok]\n");
+#endif
+
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_writeProfileIdent(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_uInt32 FirstId, const sal_Char* Strings[],
+ sal_uInt32 Value)
+{
+ int i, n;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileIdent\n");
+#endif
+
+ for (n = 0; Strings[n] != NULL; n++);
+
+ if ((i = Value - FirstId) >= n)
+ bRet=sal_False;
+ else
+ bRet=osl_writeProfileString(Profile, pszSection, pszEntry, Strings[i]);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileIdent\n");
+#endif
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_removeProfileEntry(oslProfile Profile,
+ const sal_Char *pszSection, const sal_Char *pszEntry)
+{
+ sal_uInt32 NoEntry;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_removeProfileEntry\n");
+#endif
+
+ pProfile = acquireProfile(Profile, sal_True);
+
+ if (pProfile == NULL)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_removeProfileEntry [pProfile==0]\n");
+#endif
+
+
+ return (sal_False);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) &&
+ (NoEntry < pSec->m_NoEntries))
+ {
+ removeLine(pProfile, pSec->m_Entries[NoEntry].m_Line);
+ removeEntry(pSec, NoEntry);
+ if (pSec->m_NoEntries == 0)
+ {
+ removeLine(pProfile, pSec->m_Line);
+
+ /* remove any empty separation line */
+ if ((pSec->m_Line > 0) && (pProfile->m_Lines[pSec->m_Line - 1][0] == '\0'))
+ removeLine(pProfile, pSec->m_Line - 1);
+
+ removeSection(pProfile, pSec);
+ }
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ }
+ else
+ PrfWriteProfileString(pProfile->m_hIni, (PCSZ)pszSection, (PCSZ)pszEntry, NULL);
+
+ bRet = releaseProfile(pProfile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_removeProfileEntry [ok]\n");
+#endif
+ return bRet;
+}
+
+
+sal_uInt32 SAL_CALL osl_getProfileSectionEntries(oslProfile Profile, const sal_Char *pszSection,
+ sal_Char* pszBuffer, sal_uInt32 MaxLen)
+{
+ sal_uInt32 i, n = 0;
+ sal_uInt32 NoEntry;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_getProfileSectionEntries\n");
+#endif
+
+ pProfile = acquireProfile(Profile, sal_False);
+
+ if (pProfile == NULL)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSectionEntries [pProfile=0]\n");
+#endif
+
+
+ return (0);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if ((pSec = findEntry(pProfile, pszSection, "", &NoEntry)) != NULL)
+ {
+ if (MaxLen != 0)
+ {
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ {
+ if ((n + pSec->m_Entries[i].m_Len + 1) < MaxLen)
+ {
+ strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Entries[i].m_Line]
+ [pSec->m_Entries[i].m_Offset], pSec->m_Entries[i].m_Len);
+ n += pSec->m_Entries[i].m_Len;
+ pszBuffer[n++] = '\0';
+ }
+ else
+ break;
+
+ }
+
+ pszBuffer[n++] = '\0';
+ }
+ else
+ {
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ n += pSec->m_Entries[i].m_Len + 1;
+
+ n += 1;
+ }
+ }
+ else
+ n = 0;
+ }
+ else
+ n = PrfQueryProfileString(pProfile->m_hIni, (PCSZ)pszSection, NULL, NULL,
+ pszBuffer, MaxLen );
+
+ releaseProfile(pProfile);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSectionEntries [ok]\n");
+#endif
+
+ return (n);
+}
+
+sal_uInt32 SAL_CALL osl_getProfileSections(oslProfile Profile, sal_Char* pszBuffer, sal_uInt32 MaxLen)
+{
+ sal_uInt32 i, n = 0;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = acquireProfile(Profile, sal_False);
+
+ if (pProfile == NULL)
+ return (0);
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (MaxLen != 0)
+ {
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if ((n + pSec->m_Len + 1) < MaxLen)
+ {
+ strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset],
+ pSec->m_Len);
+ n += pSec->m_Len;
+ pszBuffer[n++] = '\0';
+ }
+ else
+ break;
+ }
+
+ pszBuffer[n++] = '\0';
+ }
+ else
+ {
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ n += pProfile->m_Sections[i].m_Len + 1;
+
+ n += 1;
+ }
+ }
+ else
+ n = PrfQueryProfileString(pProfile->m_hIni, NULL, NULL, NULL,
+ pszBuffer, MaxLen );
+
+ releaseProfile(pProfile);
+
+ return (n);
+}
+
+#if 0 // YD
+sal_Bool SAL_CALL osl_getProfileName(rtl_uString* strPath, rtl_uString* strName, rtl_uString** strProfileName)
+{
+ sal_Bool bFailed;
+ sal_Char File[_MAX_PATH];
+ sal_Char Path[_MAX_PATH];
+ sal_uInt32 nFileLen;
+ sal_uInt32 nPathLen = 0;
+
+ rtl_uString * strTmp = NULL;
+ oslFileError nError;
+
+ /* build file name */
+ if (strName && strName->length)
+ {
+ if(strName->length >= _MAX_PATH)
+ return sal_False;
+
+ strcpy(File, (char*)strName->buffer);
+ nFileLen = strName->length;
+
+ if (rtl_ustr_indexOfChar( File, L'.' ) == -1)
+ {
+ if (nFileLen + strlen(STR_INI_EXTENSION) >= _MAX_PATH)
+ return sal_False;
+
+ /* add default extension */
+ strcpy(File + nFileLen, STR_INI_EXTENSION);
+ nFileLen += strlen(STR_INI_EXTENSION);
+ }
+ }
+ else
+ {
+ rtl_uString *strProgName = NULL;
+ sal_Unicode *pProgName;
+ sal_Int32 nOffset = 0;
+ sal_Int32 nLen;
+ sal_Int32 nPos;
+
+ if (osl_getExecutableFile(&strProgName) != osl_Process_E_None)
+ return sal_False;
+
+ /* remove path and extension from filename */
+ pProgName = strProgName->buffer;
+ nLen = strProgName->length ;
+
+ if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L'/' )) != -1)
+ nOffset = nPos + 1;
+ else if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L':' )) != -1)
+ nOffset = nPos + 1;
+
+ if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L'.' )) != -1 )
+ nLen -= 4;
+
+ if ((nFileLen = nLen - nOffset) >= _MAX_PATH)
+ return sal_False;
+
+ strncpy(File, pProgName + nOffset, nFileLen);
+
+ if (nFileLen + strlen(STR_INI_EXTENSION) >= _MAX_PATH)
+ return sal_False;
+
+ /* add default extension */
+ strcpy(File + nFileLen, STR_INI_EXTENSION);
+ nFileLen += strlen(STR_INI_EXTENSION);
+
+ rtl_uString_release( strProgName );
+ }
+
+ if (File[0] == 0)
+ return sal_False;
+
+ /* build directory path */
+ if (strPath && strPath->length)
+ {
+ sal_Unicode *pPath = rtl_uString_getStr(strPath);
+ sal_Int32 nLen = rtl_uString_getLength(strPath);
+
+ if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METAHOME) , STR_INI_METAHOME) == 0) &&
+ ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METAHOME)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAHOME)] == '/')))
+ {
+ rtl_uString * strHome = NULL;
+ oslSecurity security = osl_getCurrentSecurity();
+
+ bFailed = ! osl_getHomeDir(security, &strHome);
+ osl_freeSecurityHandle(security);
+
+ if (bFailed) return (sal_False);
+
+ if (strHome->length >= _MAX_PATH)
+ return sal_False;
+
+ strcpy( Path, strHome->buffer);
+ nPathLen = strHome->length;
+
+ if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METAHOME))
+ {
+ pPath += RTL_CONSTASCII_LENGTH(STR_INI_METAHOME);
+ nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METAHOME);
+
+ if (nLen + nPathLen >= _MAX_PATH)
+ return sal_False;
+
+ strcpy(Path + nPathLen, pPath);
+ nPathLen += nLen;
+ }
+
+ rtl_uString_release(strHome);
+ }
+
+ else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METACFG), STR_INI_METACFG) == 0) &&
+ ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METACFG)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METACFG)] == '/')))
+ {
+ rtl_uString * strConfig = NULL;
+ oslSecurity security = osl_getCurrentSecurity();
+
+ bFailed = ! osl_getConfigDir(security, &strConfig);
+ osl_freeSecurityHandle(security);
+
+ if (bFailed) return (sal_False);
+
+ if (strConfig->length >= _MAX_PATH)
+ return sal_False;
+
+ strcpy( Path, strConfig->buffer);
+ nPathLen = strConfig->length;
+
+ if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METACFG))
+ {
+ pPath += RTL_CONSTASCII_LENGTH(STR_INI_METACFG);
+ nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METACFG);
+
+ if (nLen + nPathLen >= _MAX_PATH)
+ return sal_False;
+
+ strcpy(Path + nPathLen, pPath);
+ nPathLen += nLen;
+ }
+
+ rtl_uString_release(strConfig);
+ }
+
+ else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METASYS), STR_INI_METASYS) == 0) &&
+ ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METASYS)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METASYS)] == '/')))
+ {
+ if (((nPathLen = GetWindowsDirectoryW(Path, _MAX_PATH)) == 0) || (nPathLen >= _MAX_PATH))
+ return (sal_False);
+
+ if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METASYS))
+ {
+ pPath += RTL_CONSTASCII_LENGTH(STR_INI_METASYS);
+ nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METASYS);
+
+ if (nLen + nPathLen >= MAX_PATH)
+ return sal_False;
+
+ strcpy(Path + nPathLen, pPath);
+ nPathLen += nLen;
+ }
+ }
+
+ else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METAINS), STR_INI_METAINS) == 0) &&
+ ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METAINS)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAINS)] == '/') ||
+ (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAINS)] == '"') ) )
+ {
+ if (! lookupProfile(pPath + RTL_CONSTASCII_LENGTH(STR_INI_METAINS), File, Path))
+ return (sal_False);
+
+ nPathLen = strlen(Path);
+ }
+
+ else if(nLen < MAX_PATH)
+ {
+ strcpy(Path, pPath);
+ nPathLen = strlen(Path);
+ }
+ else
+ return sal_False;
+ }
+ else
+ {
+ rtl_uString * strConfigDir = NULL;
+ oslSecurity security = osl_getCurrentSecurity();
+
+ bFailed = ! osl_getConfigDir(security, &strConfigDir);
+ osl_freeSecurityHandle(security);
+
+ if (bFailed) return (sal_False);
+ if (strConfigDir->length >= MAX_PATH)
+ return sal_False;
+
+ strcpy(Path, strConfigDir->buffer);
+ nPathLen = strConfigDir->length;
+ }
+
+ if (nPathLen && (Path[nPathLen - 1] != L'/') && (Path[nPathLen - 1] != L'\\'))
+ {
+ Path[nPathLen++] = L'\\';
+ Path[nPathLen] = 0;
+ }
+
+ if (nPathLen + nFileLen >= MAX_PATH)
+ return sal_False;
+
+ /* append file name */
+ strcpy(Path + nPathLen, File);
+ nPathLen += nFileLen;
+
+ /* copy filename */
+ rtl_uString_newFromStr_WithLength(&strTmp, Path, nPathLen);
+ nError = osl_getFileURLFromSystemPath(strTmp, strProfileName);
+ rtl_uString_release(strTmp);
+
+ return nError == osl_File_E_None;
+}
+#endif // 0 // YD
+
+
+/*****************************************************************************/
+/* Static Module Functions */
+/*****************************************************************************/
+
+static osl_TStamp getFileStamp(osl_TFile* pFile)
+{
+ osl_TStamp FileTime;
+ FILESTATUS3 FileStatus;
+ sal_uInt32 Bytes;
+
+ Bytes = sizeof( FILESTATUS3 );
+ if ( (!pFile->m_Handle) ||
+ DosQueryFileInfo(pFile->m_Handle, FIL_STANDARD, &FileStatus, Bytes))
+ memset(&FileTime, 0, sizeof(FileTime));
+ else
+ {
+ FileTime.m_Date = FileStatus.fdateLastWrite;
+ FileTime.m_Time = FileStatus.ftimeLastWrite;
+ }
+
+ return (FileTime);
+}
+
+static sal_Bool lockFile(const osl_TFile* pFile, osl_TLockMode eMode)
+{
+ sal_uInt32 status = 1;
+ FILELOCK Lock;
+
+ if (!pFile->m_Handle)
+ return (sal_False);
+
+ Lock.lOffset = 0;
+ Lock.lRange = 0xFFFFFFFF;
+
+ switch (eMode)
+ {
+ case un_lock:
+ status = DosSetFileLocks(pFile->m_Handle, &Lock, NULL, 1000, 0);
+ break;
+
+ case read_lock:
+ status = DosSetFileLocks(pFile->m_Handle, NULL, &Lock, 1000, 1);
+ break;
+
+ case write_lock:
+ status = DosSetFileLocks(pFile->m_Handle, NULL, &Lock, 1000, 0);
+ break;
+ }
+
+ return (status == 0);
+}
+
+//static osl_TFile* openFile(rtl_uString* pszFilename, sal_Bool bWriteable)
+static osl_TFile* openFileImpl(rtl_uString *ustrFileName, oslProfileOption ProfileFlags )
+{
+ sal_uInt32 action;
+ APIRET rc;
+ osl_TFile* pFile = (osl_TFile*)calloc(1, sizeof(osl_TFile));
+
+ ULONG attributes;
+ ULONG flags;
+ ULONG mode;
+ sal_Bool bWriteable = sal_False;
+ rtl_String* strFileName=0;
+ sal_Char* pszFileName=0;
+
+ /* check parameters */
+ OSL_ASSERT( ustrFileName );
+
+ rtl_uString2String( &strFileName,
+ rtl_uString_getStr(ustrFileName),
+ rtl_uString_getLength(ustrFileName),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszFileName = rtl_string_getStr(strFileName);
+
+/* if ( ProfileFlags & ( osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE | osl_Profile_READWRITE ) )*/
+ if ( ProfileFlags & ( osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ) )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("setting bWriteable to TRUE\n");
+#endif
+ bWriteable=sal_True;
+ }
+
+ if (bWriteable)
+ {
+ flags = FILE_NORMAL | FILE_ARCHIVED;
+ attributes = OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS;
+ mode = OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE;
+ }
+ else
+ {
+ flags = FILE_NORMAL;
+ attributes = OPEN_ACTION_FAIL_IF_NEW | OPEN_ACTION_OPEN_IF_EXISTS;
+ mode = OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY;
+ }
+
+ if (rc = DosOpen((PCSZ)pszFileName, &pFile->m_Handle, &action, 0, flags, attributes, mode, NULL))
+ {
+ if (rc == ERROR_TOO_MANY_OPEN_FILES)
+ {
+ LONG fhToAdd = 10;
+ ULONG fhOld = 0;
+ rc = DosSetRelMaxFH(&fhToAdd, &fhOld);
+ rc = DosOpen((PCSZ)pszFileName, &pFile->m_Handle, &action, 0, flags, attributes, mode, NULL);
+ }
+ }
+
+ if ( (rc != NO_ERROR) && bWriteable)
+ {
+ free(pFile);
+ rtl_string_release(strFileName);
+ return (NULL);
+ }
+
+ rtl_string_release(strFileName);
+
+ pFile->m_pWriteBuf=0;
+ pFile->m_nWriteBufFree=0;
+ pFile->m_nWriteBufLen=0;
+
+ if ( ProfileFlags & (osl_Profile_WRITELOCK | osl_Profile_READLOCK ) )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("locking '%s' file\n",pszFilename);
+#endif
+
+ lockFile(pFile, bWriteable ? write_lock : read_lock);
+ }
+
+ /* mfe: new WriteBuf obsolete */
+/* pFile->m_pWritePtr = pFile->m_Buf;*/
+/* pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);*/
+
+ return (pFile);
+}
+
+//static osl_TStamp closeFile(osl_TFile* pFile)
+static osl_TStamp closeFileImpl(osl_TFile* pFile)
+{
+ osl_TStamp stamp = {0, 0};
+
+ if ( pFile == 0 )
+ {
+ return stamp;
+ }
+
+ if (pFile->m_Handle)
+ {
+ /* mfe: new WriteBuf obsolete */
+ /* we just closing the file here, DO NOT write, it has to be handled in higher levels */
+ //if (pFile->m_pWritePtr > pFile->m_WriteBuf)
+ //{
+ // sal_uInt32 Bytes;
+
+ // DosWrite(pFile->m_Handle, pFile->m_WriteBuf,
+ // pFile->m_pWritePtr - pFile->m_WriteBuf,
+ // &Bytes);
+ //}
+
+ stamp = getFileStamp(pFile);
+
+ lockFile(pFile, un_lock);
+
+ DosClose(pFile->m_Handle);
+ }
+
+ if ( pFile->m_pWriteBuf != 0 )
+ {
+ free(pFile->m_pWriteBuf);
+ }
+
+ free(pFile);
+
+ return(stamp);
+}
+
+static sal_Bool rewindFile(osl_TFile* pFile, sal_Bool bTruncate)
+{
+ if (pFile->m_Handle)
+ {
+ sal_uInt32 Position;
+
+ /* mfe: new WriteBuf obsolete */
+ /* we just closing the file here, DO NOT write, it has to be handled in higher levels */
+ /* if (pFile->m_pWritePtr > pFile->m_WriteBuf)
+ {
+ sal_uInt32 Bytes;
+
+ DosWrite(pFile->m_Handle, pFile->m_WriteBuf,
+ pFile->m_pWritePtr - pFile->m_WriteBuf,
+ &Bytes);
+
+ pFile->m_pWritePtr = pFile->m_WriteBuf;
+ } */
+
+ pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);
+
+ DosSetFilePtr(pFile->m_Handle, 0, FILE_BEGIN, &Position);
+
+ if (bTruncate)
+ DosSetFileSize(pFile->m_Handle, 0);
+ }
+
+ return (sal_True);
+}
+
+static sal_Bool getLine(osl_TFile* pFile, const sal_Char *pszLine, int MaxLen)
+{
+ int Free, Bytes;
+ sal_Char* pChr;
+ sal_Char* pLine = (sal_Char *)pszLine;
+ sal_uInt32 Max;
+
+ if (pFile->m_Handle == 0)
+ return (sal_False);
+
+ MaxLen -= 1;
+
+ do
+ {
+ Bytes = sizeof(pFile->m_ReadBuf) - (pFile->m_pReadPtr - pFile->m_ReadBuf);
+
+ if (Bytes <= 1)
+ {
+ /* refill buffer */
+ memcpy(pFile->m_ReadBuf, pFile->m_pReadPtr, Bytes);
+ pFile->m_pReadPtr = pFile->m_ReadBuf;
+
+ Free = sizeof(pFile->m_ReadBuf) - Bytes;
+
+ if (DosRead(pFile->m_Handle, &pFile->m_ReadBuf[Bytes], Free, &Max))
+ {
+ *pLine = '\0';
+ return (sal_False);
+ }
+
+ if (Max < Free)
+ {
+ if ((Max == 0) && (pLine == pszLine))
+ {
+ *pLine = '\0';
+ return (sal_False);
+ }
+
+ pFile->m_ReadBuf[Bytes + Max] = '\0';
+ }
+ }
+
+ for (pChr = pFile->m_pReadPtr;
+ (*pChr != '\n') && (*pChr != '\r') && (*pChr != '\0') &&
+ (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1));
+ pChr++);
+
+ Max = min(pChr - pFile->m_pReadPtr, MaxLen);
+ memcpy(pLine, pFile->m_pReadPtr, Max);
+ MaxLen -= Max;
+ pLine += Max;
+
+ if (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1))
+ {
+ if (*pChr != '\0')
+ {
+ if ((pChr[0] == '\r') && (pChr[1] == '\n'))
+ pChr += 2;
+ else
+ pChr += 1;
+ }
+
+ if ((pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf))) &&
+ (*pChr == '\0'))
+ pChr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);
+
+ *pLine = '\0';
+
+ /* setting MaxLen to -1 indicates terminating read loop */
+ MaxLen = -1;
+ }
+
+ pFile->m_pReadPtr = pChr;
+ }
+ while (MaxLen > 0);
+
+ return (sal_True);
+}
+
+static sal_Bool putLine(osl_TFile* pFile, const sal_Char *pszLine)
+{
+ unsigned int Len = strlen(pszLine);
+
+#ifdef DEBUG_OSL_PROFILE
+ int strLen=0;
+#endif
+
+ if ( pFile == 0 || pFile->m_Handle < 0 )
+ {
+ return (sal_False);
+ }
+
+ if ( pFile->m_pWriteBuf == 0 )
+ {
+ pFile->m_pWriteBuf = (sal_Char*) malloc(Len+3);
+ pFile->m_nWriteBufLen = Len+3;
+ pFile->m_nWriteBufFree = Len+3;
+ }
+ else
+ {
+ if ( pFile->m_nWriteBufFree <= Len + 3 )
+ {
+ sal_Char* pTmp;
+
+ pTmp=(sal_Char*) realloc(pFile->m_pWriteBuf,( ( pFile->m_nWriteBufLen + Len ) * 2) );
+ if ( pTmp == 0 )
+ {
+ return sal_False;
+ }
+ pFile->m_pWriteBuf = pTmp;
+ pFile->m_nWriteBufFree = pFile->m_nWriteBufFree + pFile->m_nWriteBufLen + ( 2 * Len );
+ pFile->m_nWriteBufLen = ( pFile->m_nWriteBufLen + Len ) * 2;
+ memset( (pFile->m_pWriteBuf) + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ), 0, pFile->m_nWriteBufFree);
+ }
+ }
+
+
+
+ memcpy(pFile->m_pWriteBuf + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ),pszLine,Len+1);
+#ifdef DEBUG_OSL_PROFILE
+ strLen = strlen(pFile->m_pWriteBuf);
+#endif
+ pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len]='\r';
+ pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len + 1]='\n';
+ pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len + 2]='\0';
+
+ pFile->m_nWriteBufFree-=Len+2;
+
+#ifdef DEBUG_OSL_PROFILE
+/* OSL_TRACE("File Buffer in _putLine '%s' '%i'(%i)\n",pFile->m_pWriteBuf,strlen(pFile->m_pWriteBuf),pFile->m_nWriteBufLen - pFile->m_nWriteBufFree);*/
+#endif
+
+ return (sal_True);
+}
+
+/* platform specific end */
+
+static const sal_Char* stripBlanks(const sal_Char* String, sal_uInt32* pLen)
+{
+ if ( (pLen != NULL) && ( *pLen != 0 ) )
+ {
+ while ((String[*pLen - 1] == ' ') || (String[*pLen - 1] == '\t'))
+ (*pLen)--;
+
+ while ((*String == ' ') || (*String == '\t'))
+ {
+ String++;
+ (*pLen)--;
+ }
+ }
+ else
+ while ((*String == ' ') || (*String == '\t'))
+ String++;
+
+ return (String);
+}
+
+static const sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line)
+{
+ if (pProfile->m_NoLines >= pProfile->m_MaxLines)
+ {
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_MaxLines = LINES_INI;
+ pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *));
+ }
+ else
+ {
+ pProfile->m_MaxLines += LINES_ADD;
+ pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines,
+ pProfile->m_MaxLines * sizeof(sal_Char *));
+ }
+
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_NoLines = 0;
+ pProfile->m_MaxLines = 0;
+ return (NULL);
+ }
+
+ }
+
+ pProfile->m_Lines[pProfile->m_NoLines++] = strdup(Line);
+
+ return (pProfile->m_Lines[pProfile->m_NoLines - 1]);
+}
+
+static const sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo)
+{
+ if (pProfile->m_NoLines >= pProfile->m_MaxLines)
+ {
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_MaxLines = LINES_INI;
+ pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *));
+ }
+ else
+ {
+ pProfile->m_MaxLines += LINES_ADD;
+ pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines,
+ pProfile->m_MaxLines * sizeof(sal_Char *));
+ }
+
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_NoLines = 0;
+ pProfile->m_MaxLines = 0;
+ return (NULL);
+ }
+
+ }
+
+ LineNo = LineNo > pProfile->m_NoLines ? pProfile->m_NoLines : LineNo;
+
+ if (LineNo < pProfile->m_NoLines)
+ {
+ sal_uInt32 i, n;
+ osl_TProfileSection* pSec;
+
+ memmove(&pProfile->m_Lines[LineNo + 1], &pProfile->m_Lines[LineNo],
+ (pProfile->m_NoLines - LineNo) * sizeof(sal_Char *));
+
+ /* adjust line references */
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if (pSec->m_Line >= LineNo)
+ pSec->m_Line++;
+
+ for (n = 0; n < pSec->m_NoEntries; n++)
+ if (pSec->m_Entries[n].m_Line >= LineNo)
+ pSec->m_Entries[n].m_Line++;
+ }
+ }
+
+ pProfile->m_NoLines++;
+
+ pProfile->m_Lines[LineNo] = strdup(Line);
+
+ return (pProfile->m_Lines[LineNo]);
+}
+
+static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo)
+{
+ if (LineNo < pProfile->m_NoLines)
+ {
+ free(pProfile->m_Lines[LineNo]);
+ if (pProfile->m_NoLines - LineNo > 1)
+ {
+ sal_uInt32 i, n;
+ osl_TProfileSection* pSec;
+
+ memmove(&pProfile->m_Lines[LineNo], &pProfile->m_Lines[LineNo + 1],
+ (pProfile->m_NoLines - LineNo - 1) * sizeof(sal_Char *));
+
+ /* adjust line references */
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if (pSec->m_Line > LineNo)
+ pSec->m_Line--;
+
+ for (n = 0; n < pSec->m_NoEntries; n++)
+ if (pSec->m_Entries[n].m_Line > LineNo)
+ pSec->m_Entries[n].m_Line--;
+ }
+ }
+ else
+ {
+ pProfile->m_Lines[LineNo] = 0;
+ }
+
+ pProfile->m_NoLines--;
+ }
+
+ return;
+}
+
+static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection,
+ sal_uInt32 NoEntry, sal_uInt32 Line,
+ const sal_Char* Entry, sal_uInt32 Len)
+{
+ Entry = stripBlanks(Entry, &Len);
+ pSection->m_Entries[NoEntry].m_Line = Line;
+ pSection->m_Entries[NoEntry].m_Offset = Entry - pProfile->m_Lines[Line];
+ pSection->m_Entries[NoEntry].m_Len = Len;
+
+ return;
+}
+
+static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection,
+ int Line, const sal_Char* Entry, sal_uInt32 Len)
+{
+ if (pSection != NULL)
+ {
+ if (pSection->m_NoEntries >= pSection->m_MaxEntries)
+ {
+ if (pSection->m_Entries == NULL)
+ {
+ pSection->m_MaxEntries = ENTRIES_INI;
+ pSection->m_Entries = (osl_TProfileEntry *)malloc(
+ pSection->m_MaxEntries * sizeof(osl_TProfileEntry));
+ }
+ else
+ {
+ pSection->m_MaxEntries += ENTRIES_ADD;
+ pSection->m_Entries = (osl_TProfileEntry *)realloc(pSection->m_Entries,
+ pSection->m_MaxEntries * sizeof(osl_TProfileEntry));
+ }
+
+ if (pSection->m_Entries == NULL)
+ {
+ pSection->m_NoEntries = 0;
+ pSection->m_MaxEntries = 0;
+ return (sal_False);
+ }
+ }
+
+ pSection->m_NoEntries++;
+
+ Entry = stripBlanks(Entry, &Len);
+ setEntry(pProfile, pSection, pSection->m_NoEntries - 1, Line,
+ Entry, Len);
+
+ return (sal_True);
+ }
+
+ return (sal_False);
+}
+
+static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry)
+{
+ if (NoEntry < pSection->m_NoEntries)
+ {
+ if (pSection->m_NoEntries - NoEntry > 1)
+ memmove(&pSection->m_Entries[NoEntry],
+ &pSection->m_Entries[NoEntry + 1],
+ (pSection->m_NoEntries - NoEntry - 1) * sizeof(osl_TProfileEntry));
+ pSection->m_NoEntries--;
+ }
+
+ return;
+}
+
+static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len)
+{
+ if (pProfile->m_NoSections >= pProfile->m_MaxSections)
+ {
+ if (pProfile->m_Sections == NULL)
+ {
+ pProfile->m_MaxSections = SECTIONS_INI;
+ pProfile->m_Sections = (osl_TProfileSection *)malloc(pProfile->m_MaxSections * sizeof(osl_TProfileSection));
+ }
+ else
+ {
+ pProfile->m_MaxSections += SECTIONS_ADD;
+ pProfile->m_Sections = (osl_TProfileSection *)realloc(pProfile->m_Sections,
+ pProfile->m_MaxSections * sizeof(osl_TProfileSection));
+ }
+
+ if (pProfile->m_Sections == NULL)
+ {
+ pProfile->m_NoSections = 0;
+ pProfile->m_MaxSections = 0;
+ return (sal_False);
+ }
+ }
+
+ pProfile->m_NoSections++;
+
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Entries = NULL;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_NoEntries = 0;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_MaxEntries = 0;
+
+ Section = (sal_Char *)stripBlanks(Section, &Len);
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Line = Line;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Offset = Section - pProfile->m_Lines[Line];
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Len = Len;
+
+ return (sal_True);
+}
+
+static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection)
+{
+ sal_uInt32 Section;
+
+ if ((Section = pSection - pProfile->m_Sections) < pProfile->m_NoSections)
+ {
+ free (pSection->m_Entries);
+ if (pProfile->m_NoSections - Section > 1)
+ {
+ memmove(&pProfile->m_Sections[Section], &pProfile->m_Sections[Section + 1],
+ (pProfile->m_NoSections - Section - 1) * sizeof(osl_TProfileSection));
+ }
+ else
+ {
+ pSection->m_Entries = 0;
+ }
+
+ pProfile->m_NoSections--;
+ }
+
+ return;
+}
+
+static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section,
+ const sal_Char* Entry, sal_uInt32 *pNoEntry)
+{
+static sal_uInt32 Sect = 0;
+ sal_uInt32 i, n;
+ sal_uInt32 Len;
+ const sal_Char* pStr;
+ osl_TProfileSection* pSec;
+
+ Len = strlen(Section);
+ Section = (sal_Char *)stripBlanks(Section, &Len);
+
+ n = Sect;
+
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ n %= pProfile->m_NoSections;
+ pSec = &pProfile->m_Sections[n];
+ if ((Len == pSec->m_Len) &&
+ (strnicmp(Section, &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset], pSec->m_Len)
+ == 0))
+ break;
+ n++;
+ }
+
+ Sect = n;
+
+ if (i < pProfile->m_NoSections)
+ {
+ Len = strlen(Entry);
+ Entry = stripBlanks(Entry, &Len);
+
+ *pNoEntry = pSec->m_NoEntries;
+
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ {
+ pStr = &pProfile->m_Lines[pSec->m_Entries[i].m_Line]
+ [pSec->m_Entries[i].m_Offset];
+ if ((Len == pSec->m_Entries[i].m_Len) &&
+ (strnicmp(Entry, pStr, pSec->m_Entries[i].m_Len)
+ == 0))
+ {
+ *pNoEntry = i;
+ break;
+ }
+ }
+ }
+ else
+ pSec = NULL;
+
+ return (pSec);
+}
+
+static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile)
+{
+ sal_uInt32 i;
+ sal_Char* pStr;
+ sal_Char* pChar;
+ sal_Char Line[1024];
+
+ pProfile->m_NoLines = 0;
+ pProfile->m_NoSections = 0;
+
+ OSL_VERIFY(rewindFile(pFile, sal_False));
+
+ while (getLine(pFile, Line, sizeof(Line)))
+ {
+ if (! addLine(pProfile, Line))
+ return (sal_False);
+ }
+
+ for (i = 0; i < pProfile->m_NoLines; i++)
+ {
+ pStr = (sal_Char *)stripBlanks(pProfile->m_Lines[i], NULL);
+
+ if ((*pStr == '\0') || (*pStr == ';'))
+ continue;
+
+ if ((*pStr != '[') || ((pChar = strrchr(pStr, ']')) == NULL) ||
+ ((pChar - pStr) <= 2))
+ {
+ /* insert entry */
+
+ if (pProfile->m_NoSections < 1)
+ continue;
+
+ if ((pChar = strchr(pStr, '=')) == NULL)
+ pChar = pStr + strlen(pStr);
+
+ if (! addEntry(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1],
+ i, pStr, pChar - pStr))
+ return (sal_False);
+ }
+ else
+ {
+ /* new section */
+
+ if (! addSection(pProfile, i, pStr + 1, pChar - pStr - 1))
+ return (sal_False);
+ }
+ }
+
+ return (sal_True);
+}
+
+static sal_Bool storeProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile, sal_Bool bCleanup)
+{
+ if (pProfile->m_Lines != NULL)
+ {
+ if (pProfile->m_Flags & FLG_MODIFIED)
+ {
+ sal_uInt32 i;
+
+ OSL_VERIFY(rewindFile(pFile, sal_True));
+
+ for (i = 0; i < pProfile->m_NoLines; i++)
+ OSL_VERIFY(putLine(pFile, pProfile->m_Lines[i]));
+
+ pProfile->m_Flags &= ~FLG_MODIFIED;
+ }
+
+ if (bCleanup)
+ {
+ while (pProfile->m_NoLines > 0)
+ removeLine(pProfile, pProfile->m_NoLines - 1);
+
+ free(pProfile->m_Lines);
+ pProfile->m_Lines = NULL;
+ pProfile->m_MaxLines = 0;
+
+ while (pProfile->m_NoSections > 0)
+ removeSection(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1]);
+
+ free(pProfile->m_Sections);
+ pProfile->m_Sections = NULL;
+ pProfile->m_MaxSections = 0;
+ }
+ }
+
+ return (sal_True);
+}
+
+static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile;
+ oslProfileOption PFlags=0;
+
+
+ if ( bWriteable )
+ {
+/* PFlags = osl_Profile_DEFAULT | osl_Profile_READWRITE; */
+ PFlags = osl_Profile_DEFAULT | osl_Profile_WRITELOCK;
+ }
+ else
+ {
+ PFlags = osl_Profile_DEFAULT;
+ }
+
+
+ if (pProfile == NULL)
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("AUTOOPEN MODE\n");
+#endif
+
+ if ((pProfile = (osl_TProfileImpl*)osl_openProfile(NULL, PFlags)) != NULL )
+ {
+ pProfile->m_Flags |= FLG_AUTOOPEN;
+ }
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("try to acquire\n");
+#endif
+
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (! (pProfile->m_Flags & (osl_Profile_READLOCK |
+ osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE)))
+ {
+ osl_TStamp Stamp;
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("DEFAULT MODE\n");
+#endif
+ if (! (pProfile->m_pFile = openFileImpl(pProfile->m_strFileName, pProfile->m_Flags | PFlags)))
+ return NULL;
+
+ Stamp = getFileStamp(pProfile->m_pFile);
+
+ if (memcmp(&Stamp, &(pProfile->m_Stamp), sizeof(osl_TStamp)))
+ {
+ pProfile->m_Stamp = Stamp;
+
+ loadProfile(pProfile->m_pFile, pProfile);
+ }
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("READ/WRITELOCK MODE\n");
+#endif
+
+
+ /* A readlock file could not be written */
+ if ((pProfile->m_Flags & osl_Profile_READLOCK) && bWriteable)
+ {
+ return (NULL);
+ }
+ }
+ }
+ else
+ {
+ sal_Bool bWriteable = sal_False;
+ char pszFilename[PATH_MAX] = "";
+
+ if ( pProfile->m_strFileName != 0 && pProfile->m_strFileName->buffer[0] != 0 )
+ FileURLToPath( pszFilename, PATH_MAX, pProfile->m_strFileName );
+ /* hack: usualy you have a specific HAB, but NULL works here... */
+ pProfile->m_hIni = PrfOpenProfile(NULL, (PCSZ)pszFilename);
+ if (! pProfile->m_hIni)
+ return (NULL);
+ }
+ }
+
+ return (pProfile);
+}
+
+static sal_Bool releaseProfile(osl_TProfileImpl* pProfile)
+{
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In releaseProfile\n");
+#endif
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [profile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (pProfile->m_Flags & FLG_AUTOOPEN)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [AUTOOPEN]\n");
+#endif
+ return (osl_closeProfile((oslProfile)pProfile));
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("DEFAULT MODE\n");
+#endif
+ if (! (pProfile->m_Flags & (osl_Profile_READLOCK |
+ osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE)))
+ {
+ if (pProfile->m_Flags & FLG_MODIFIED)
+ storeProfile(pProfile->m_pFile, pProfile, sal_False);
+
+ closeFileImpl(pProfile->m_pFile);
+ pProfile->m_pFile = NULL;
+ }
+ }
+ }
+ else
+ PrfCloseProfile(pProfile->m_hIni);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [ok]\n");
+#endif
+ return (sal_True);
+}
+
+#if 0 // YD
+
+static sal_Bool lookupProfile(const sal_Char *pszPath, const sal_Char *pszFile, sal_Char *pPath)
+{
+ sal_Char *pChr, *pStr;
+ sal_Char Path[_MAX_PATH] = "";
+ sal_Char Product[132] = "";
+ sal_Char Buffer[1024];
+
+ if (*pszPath == '"')
+ {
+ int i = 0;
+
+ pszPath++;
+
+ while ((*pszPath != '"') && (*pszPath != '\0'))
+ Product[i++] = *pszPath++;
+
+ Product[i] = '\0';
+
+ if (*pszPath == '"')
+ pszPath++;
+
+ if ( (*pszPath == '/') || (*pszPath == '\\') )
+ {
+ pszPath++;
+ }
+ }
+ else
+ {
+ /* if we have not product identfication, do a special handling for soffice.ini */
+ if (stricmp(SVERSION_PROFILE, pszFile) == 0)
+ {
+ sal_Char Profile[_MAX_PATH];
+ sal_Char Dir[_MAX_PATH];
+ oslProfile hProfile;
+
+ /* open sversion.ini in the system directory, and try to locate the entry
+ with the highest version for StarOffice */
+ if ((osl_getProfileName(SVERSION_FALLBACK, SVERSION_NAME, Profile, sizeof(Profile))) &&
+ (hProfile = osl_openProfile(Profile, osl_Profile_READLOCK)))
+ {
+ osl_getProfileSectionEntries(hProfile, SVERSION_SECTION,
+ Buffer, sizeof(Buffer));
+
+ for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1)
+ {
+ if ((strnicmp(pChr, SVERSION_SOFFICE, sizeof(SVERSION_SOFFICE) - 1) == 0) &&
+ (stricmp(Product, pChr) < 0))
+ {
+ osl_readProfileString(hProfile, SVERSION_SECTION, pChr,
+ Dir, sizeof(Dir), "");
+
+ /* check for existence of path */
+ if (access(Dir, 0) >= 0)
+ strcpy(Product, pChr);
+ }
+ }
+
+ osl_closeProfile(hProfile);
+ }
+
+ /* open sversion.ini in the users directory, and try to locate the entry
+ with the highest version for StarOffice */
+ if ((strcmp(SVERSION_LOCATION, SVERSION_FALLBACK) != 0) &&
+ (osl_getProfileName(SVERSION_LOCATION, SVERSION_NAME, Profile, sizeof(Profile))) &&
+ (hProfile = osl_openProfile(Profile, osl_Profile_READLOCK)))
+ {
+ osl_getProfileSectionEntries(hProfile, SVERSION_SECTION,
+ Buffer, sizeof(Buffer));
+
+ for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1)
+ {
+ if ((strnicmp(pChr, SVERSION_SOFFICE, sizeof(SVERSION_SOFFICE) - 1) == 0) &&
+ (stricmp(Product, pChr) < 0))
+ {
+ osl_readProfileString(hProfile, SVERSION_SECTION, pChr,
+ Dir, sizeof(Dir), "");
+
+ /* check for existence of path */
+ if (access(Dir, 0) >= 0)
+ strcpy(Product, pChr);
+ }
+ }
+
+ osl_closeProfile(hProfile);
+ }
+
+ /* remove any trailing build number */
+ if ((pChr = strrchr(Product, '/')) != NULL)
+ *pChr = '\0';
+ }
+ }
+
+
+ /* if we have an userid option eg. "-userid:rh[/usr/home/rh/staroffice]",
+ this will supercede all other locations */
+ if (osl_getCommandArgs(Buffer, sizeof(Buffer)) == osl_Process_E_None)
+ {
+ sal_Char *pStart, *pEnd;
+
+ for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1)
+ if (((*pChr == '-') || (*pChr == '+')) &&
+ (strnicmp(pChr + 1, SVERSION_OPTION, sizeof(SVERSION_OPTION) - 1) == 0))
+ {
+ if (((pStart = strchr(pChr + sizeof(SVERSION_OPTION), '[')) != NULL) &&
+ ((pEnd = strchr(pStart + 1, ']')) != NULL))
+ {
+ strncpy(Path, pStart + 1, pEnd - (pStart + 1));
+ Path[pEnd - (pStart + 1)] = '\0';
+
+ /* build full path */
+ if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\'))
+ {
+ strcat(Path, "\\");
+ }
+
+ pChr =&Path[strlen(Path)];
+ if ( strlen(pszPath) <= 0 )
+ {
+ strcat(Path,SVERSION_USER);
+
+ if ( access(Path, 0) < 0 )
+ {
+ *pChr='\0';
+ }
+ }
+ else
+ {
+ strcat(Path, pszPath);
+ }
+
+ break;
+ }
+ }
+ }
+
+ if (strlen(Path) <= 0)
+ {
+ /* try to find the file in the directory of the executbale */
+ if (osl_getExecutableFile(Path, sizeof(Path)) != osl_Process_E_None)
+ return (sal_False);
+
+ /* seperate path from filename */
+ if ((pChr = strrchr(Path, '\\')) == NULL)
+ if ((pChr = strrchr(Path, ':')) == NULL)
+ return (sal_False);
+ else
+ *pChr = '\0';
+ else
+ *pChr = '\0';
+
+ /* if we have no product identification use the executable file name */
+ if (strlen(Product) <= 0)
+ {
+ strcpy(Product, pChr + 1);
+
+ /* remove extension */
+ if ((pChr = strrchr(Product, '.')) != NULL)
+ *pChr = '\0';
+ }
+
+ /* remember last subdir */
+ pStr = strrchr(Path, '\\');
+
+ strcat(Path, "\\");
+
+ if ( strlen(pszPath) <= 0 )
+ {
+ strcat(Path, pszPath);
+ }
+ else
+ {
+ strcat(Path,pszPath);
+ }
+
+ /* if file not exists, remove any specified subdirectories
+ like "bin" or "program" */
+ if (((access(Path, 0) < 0) && (pStr != NULL)) || (strlen(pszPath) <= 0))
+ {
+ static sal_Char *SubDirs[] = SVERSION_DIRS;
+
+ int i = 0;
+
+ for (i = 0; i < (sizeof(SubDirs) / sizeof(SubDirs[0])); i++)
+ if (strnicmp(pStr + 1, SubDirs[i], strlen(SubDirs[i])) == 0)
+ {
+ if ( strlen(pszPath) <= 0)
+ {
+ strcpy(pStr + 1,SVERSION_USER);
+ if ( access(Path, 0) < 0 )
+ {
+ *(pStr+1)='\0';
+ }
+ }
+ else
+ {
+ strcpy(pStr + 1, pszPath);
+ }
+
+ break;
+ }
+ }
+
+ pChr = &Path[strlen(Path)];
+ if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\'))
+ strcat(Path, "\\");
+ strcat(Path, pszFile);
+
+ if ((access(Path, 0) < 0) && (strlen(Product) > 0))
+ {
+ sal_Char Profile[_MAX_PATH];
+ oslProfile hProfile;
+
+ /* remove appended filename */
+ *pChr = '\0';
+
+ /* open sversion.ini in the system directory, and try to locate the entry
+ with the highest version for StarOffice */
+ if ((osl_getProfileName(SVERSION_LOCATION, SVERSION_NAME, Profile, sizeof(Profile))) &&
+ (hProfile = osl_openProfile(Profile, osl_Profile_READLOCK)))
+ {
+ pChr = &Product[strlen(Product)];
+
+ /* append build number */
+ strcat(Product, "/");
+ strcat(Product, BUILD_STR(SUPD));
+
+ osl_readProfileString(hProfile, SVERSION_SECTION, Product,
+ Buffer, sizeof(Buffer), "");
+
+ /* if not found, try it without build number */
+ if (strlen(Buffer) <= 0)
+ {
+ *pChr = '\0';
+
+ osl_readProfileString(hProfile, SVERSION_SECTION, Product,
+ Buffer, sizeof(Buffer), "");
+
+ osl_closeProfile(hProfile);
+
+ /* if not found, try the fallback */
+ if ((strlen(Buffer) <= 0) && (strcmp(SVERSION_LOCATION, SVERSION_FALLBACK) != 0))
+ {
+ if ((osl_getProfileName(SVERSION_FALLBACK, SVERSION_NAME, Profile, sizeof(Profile))) &&
+ (hProfile = osl_openProfile(Profile, osl_Profile_READLOCK)))
+ {
+ /* prepare build number */
+ *pChr = '/';
+
+ osl_readProfileString(hProfile, SVERSION_SECTION, Product,
+ Buffer, sizeof(Buffer), "");
+
+ /* if not found, try it without build number */
+ if (strlen(Buffer) <= 0)
+ {
+ *pChr = '\0';
+
+ osl_readProfileString(hProfile, SVERSION_SECTION, Product,
+ Buffer, sizeof(Buffer), "");
+ }
+
+ osl_closeProfile(hProfile);
+ }
+ }
+ }
+ else
+ osl_closeProfile(hProfile);
+
+ if (strlen(Buffer) > 0)
+ {
+ strcpy(Path, Buffer);
+
+ /* build full path */
+ if ((Path[strlen(Path) - 1] != '/') && (Path[strlen(Path) - 1] != '\\'))
+ {
+ if ((*pszPath != '/') && (*pszPath != '\\'))
+ strcat(Path, "\\");
+ }
+
+ pChr=&Path[strlen(pszPath)];
+ if ( strlen(pszPath) > 0 )
+ {
+ strcat(Path, pszPath);
+ }
+ else
+ {
+ strcat(Path,SVERSION_USER);
+ if ( access(Path, 0) < 0 )
+ {
+ *pChr='\0';
+ }
+ }
+ }
+ }
+ }
+ else
+ /* remove appended filename */
+ *pChr = '\0';
+ }
+
+ strcpy(pPath, Path);
+
+ return (sal_True);
+}
+
+#endif // 0 // YD
+
diff --git a/sal/osl/os2/salinit.cxx b/sal/osl/os2/salinit.cxx
new file mode 100644
index 000000000000..f932f2ea1b50
--- /dev/null
+++ b/sal/osl/os2/salinit.cxx
@@ -0,0 +1,120 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define INCL_DOS
+#include <os2.h>
+
+#include "precompiled_sal.hxx"
+#include "sal/config.h"
+
+#include "osl/process.h"
+#include "sal/main.h"
+#include "sal/types.h"
+
+// for exception logging
+#include <stdio.h>
+#include <string.h>
+#include <setjmp.h>
+#include "helpers/except.h"
+
+extern "C" {
+
+/*----------------------------------------------------------------------------*/
+
+static CHAR szOOoExe[CCHMAXPATH];
+
+static FILE* APIENTRY _oslExceptOpenLogFile(VOID)
+{
+ FILE *file;
+ DATETIME DT;
+ PPIB pib;
+ PSZ slash;
+
+ // get executable fullpath
+ DosGetInfoBlocks(NULL, &pib);
+ DosQueryModuleName(pib->pib_hmte, sizeof(szOOoExe), szOOoExe);
+ // truncate to exe name
+ slash = (PSZ)strrchr( szOOoExe, '.');
+ *slash = '\0';
+ // make log path
+ strcat( szOOoExe, ".log");
+
+ file = fopen( szOOoExe, "a");
+ if (!file) { // e.g. readonly drive
+ // try again, usually C exist and is writable
+ file = fopen( "c:\\OOo.log", "a");
+ }
+ if (file) {
+ DosGetDateTime(&DT);
+ fprintf(file, "\nTrap message -- Date: %04d-%02d-%02d, Time: %02d:%02d:%02d\n",
+ DT.year, DT.month, DT.day,
+ DT.hours, DT.minutes, DT.seconds);
+ fprintf(file, "-------------------------------------------------------\n"
+ "\nAn internal error occurred (Built " __DATE__ "-" __TIME__ ").\n");
+
+ }
+
+ // ok, return handle
+ return (file);
+}
+
+/*----------------------------------------------------------------------------*/
+
+static EXCEPTSTRUCT g_excptstruct = {0};
+
+void SAL_CALL sal_detail_initialize(int argc, char ** argv)
+{
+ APIRET rc = -1;
+
+#if OSL_DEBUG_LEVEL == 0
+ excRegisterHooks(_oslExceptOpenLogFile, NULL, NULL, FALSE);
+
+ g_excptstruct.RegRec2.pfnHandler = (PFN)excHandlerLoud;
+ g_excptstruct.arc = DosSetExceptionHandler(
+ (PEXCEPTIONREGISTRATIONRECORD)&(g_excptstruct.RegRec2));
+
+ if (g_excptstruct.arc)
+ if (G_pfnExcHookError)
+ G_pfnExcHookError(__FILE__, __LINE__, __FUNCTION__, g_excptstruct.arc);
+ else
+ DosBeep(1000, 1000);
+ g_excptstruct.ulExcpt = setjmp(g_excptstruct.RegRec2.jmpThread);
+#endif
+
+ osl_setCommandArgs(argc, argv);
+}
+
+void SAL_CALL sal_detail_deinitialize()
+{
+ APIRET rc = -1;
+
+#if OSL_DEBUG_LEVEL == 0
+ rc = DosUnsetExceptionHandler((PEXCEPTIONREGISTRATIONRECORD)&(g_excptstruct.RegRec2));
+#endif
+}
+
+}
diff --git a/sal/osl/os2/secimpl.h b/sal/osl/os2/secimpl.h
new file mode 100644
index 000000000000..6922a6d3c0ce
--- /dev/null
+++ b/sal/osl/os2/secimpl.h
@@ -0,0 +1,50 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SECURITYIMPL_H_
+#define _OSL_SECURITYIMPL_H_
+
+#include <osl/security.h>
+
+#define PASSWD_BUFFER_SIZE 1024 /* recommended, see 'man getpwnam_r' */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _oslSecurityImpl {
+ int m_isValid;
+ struct passwd m_pPasswd;
+ sal_Char m_buffer[PASSWD_BUFFER_SIZE];
+} oslSecurityImpl;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/sal/osl/os2/security.c b/sal/osl/os2/security.c
new file mode 100644
index 000000000000..f03be57acc85
--- /dev/null
+++ b/sal/osl/os2/security.c
@@ -0,0 +1,317 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/security.h>
+#include <osl/diagnose.h>
+#include <osl/module.h>
+
+#include "osl/thread.h"
+#include "osl/file.h"
+
+#ifdef SOLARIS
+#include <crypt.h>
+#endif
+
+#include "secimpl.h"
+
+#ifndef PAM_BINARY_MSG
+#define PAM_BINARY_MSG 6
+#endif
+
+extern oslModule SAL_CALL osl_psz_loadModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode);
+extern void* SAL_CALL osl_psz_getSymbol(oslModule hModule, const sal_Char* pszSymbolName);
+extern oslSecurityError SAL_CALL
+osl_psz_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd,
+ oslSecurity* pSecurity);
+sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax);
+sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax);
+sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax);
+sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax);
+
+
+
+oslSecurity SAL_CALL osl_getCurrentSecurity()
+{
+
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl*) malloc(sizeof(oslSecurityImpl));
+ struct passwd *pPasswd = getpwuid(getuid());
+
+ if (pPasswd)
+ {
+ memcpy(&pSecImpl->m_pPasswd, pPasswd, sizeof(pSecImpl->m_pPasswd));
+ pSecImpl->m_isValid = sal_True;
+ }
+ else
+ {
+ /* Some UNIX-OS don't implement getpwuid, e.g. NC OS (special NetBSD) 1.2.1 */
+ /* so we have to catch this in this else branch */
+ pSecImpl->m_pPasswd.pw_name = getenv("USER");
+ pSecImpl->m_pPasswd.pw_dir = getenv("HOME");
+ if (pSecImpl->m_pPasswd.pw_name && pSecImpl->m_pPasswd.pw_dir)
+ pSecImpl->m_isValid = sal_True;
+ else
+ {
+ pSecImpl->m_pPasswd.pw_name = "unknown";
+ pSecImpl->m_pPasswd.pw_dir = "/tmp";
+ pSecImpl->m_isValid = sal_False;
+ }
+ pSecImpl->m_pPasswd.pw_passwd = NULL;
+ pSecImpl->m_pPasswd.pw_uid = getuid();
+ pSecImpl->m_pPasswd.pw_gid = getgid();
+ pSecImpl->m_pPasswd.pw_gecos = "unknown";
+ pSecImpl->m_pPasswd.pw_shell = "unknown";
+ }
+
+
+ return ((oslSecurity)pSecImpl);
+}
+
+
+oslSecurityError SAL_CALL osl_loginUser(
+ rtl_uString *ustrUserName,
+ rtl_uString *ustrPassword,
+ oslSecurity *pSecurity
+ )
+{
+ oslSecurityError ret;
+
+ *pSecurity = osl_getCurrentSecurity();
+ ret = osl_Security_E_None;
+
+ return ret;
+}
+
+
+
+oslSecurityError SAL_CALL osl_loginUserOnFileServer(
+ rtl_uString *strUserName,
+ rtl_uString *strPasswd,
+ rtl_uString *strFileServer,
+ oslSecurity *pSecurity
+ )
+{
+ oslSecurityError erg;
+ return erg = osl_Security_E_UserUnknown;
+}
+
+
+oslSecurityError SAL_CALL osl_psz_loginUserOnFileServer( const sal_Char* pszUserName,
+ const sal_Char* pszPasswd,
+ const sal_Char* pszFileServer,
+ oslSecurity* pSecurity )
+{
+ oslSecurityError erg;
+ return erg = osl_Security_E_UserUnknown;
+}
+
+sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, rtl_uString **ustrIdent)
+{
+ sal_Bool bRet=sal_False;
+ sal_Char pszIdent[1024];
+
+ pszIdent[0] = '\0';
+
+ bRet = osl_psz_getUserIdent(Security,pszIdent,sizeof(pszIdent));
+
+ rtl_string2UString( ustrIdent, pszIdent, rtl_str_getLength( pszIdent ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*ustrIdent != NULL);
+
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax)
+{
+ sal_Char buffer[32];
+ sal_Int32 nChr;
+
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
+
+ if (pSecImpl == NULL)
+ return sal_False;
+
+ nChr = snprintf(buffer, sizeof(buffer), "%u", pSecImpl->m_pPasswd.pw_uid);
+ if ( nChr < 0 || nChr >= sizeof(buffer) || nChr >= nMax )
+ return sal_False; /* leave *pszIdent unmodified in case of failure */
+
+ memcpy(pszIdent, buffer, nChr+1);
+ return sal_True;
+}
+
+sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **ustrName)
+{
+ sal_Bool bRet=sal_False;
+ sal_Char pszName[1024];
+
+ pszName[0] = '\0';
+
+ bRet = osl_psz_getUserName(Security,pszName,sizeof(pszName));
+
+ rtl_string2UString( ustrName, pszName, rtl_str_getLength( pszName ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*ustrName != NULL);
+
+ return bRet;
+}
+
+
+
+sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax)
+{
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
+
+ if ((pSecImpl == NULL) || (! pSecImpl->m_isValid))
+ return sal_False;
+
+ strncpy(pszName, pSecImpl->m_pPasswd.pw_name, nMax);
+
+ return sal_True;
+}
+
+sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **pustrDirectory)
+{
+ sal_Bool bRet=sal_False;
+ sal_Char pszDirectory[PATH_MAX];
+
+ pszDirectory[0] = '\0';
+
+ bRet = osl_psz_getHomeDir(Security,pszDirectory,sizeof(pszDirectory));
+
+ if ( bRet == sal_True )
+ {
+ rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( pszDirectory ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*pustrDirectory != NULL);
+ osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory );
+ }
+
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax)
+{
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
+
+ if (pSecImpl == NULL)
+ return sal_False;
+
+ /* if current user, check also environment for HOME */
+ if (getuid() == pSecImpl->m_pPasswd.pw_uid)
+ {
+ sal_Char *pStr = NULL;
+#ifdef SOLARIS
+ char buffer[8192];
+
+ struct passwd pwd;
+ struct passwd *ppwd;
+
+#ifdef _POSIX_PTHREAD_SEMANTICS
+ if ( 0 != getpwuid_r(getuid(), &pwd, buffer, sizeof(buffer), &ppwd ) )
+ ppwd = NULL;
+#else
+ ppwd = getpwuid_r(getuid(), &pwd, buffer, sizeof(buffer) );
+#endif
+
+ if ( ppwd )
+ pStr = ppwd->pw_dir;
+#else
+ pStr = getenv("HOME");
+#endif
+
+ if ((pStr != NULL) && (strlen(pStr) > 0) &&
+ (access(pStr, 0) == 0))
+ strncpy(pszDirectory, pStr, nMax);
+ else
+ if (pSecImpl->m_isValid)
+ strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax);
+ else
+ return sal_False;
+ }
+ else
+ strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax);
+
+ return sal_True;
+}
+
+sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **pustrDirectory)
+{
+ sal_Bool bRet = sal_False;
+ sal_Char pszDirectory[PATH_MAX];
+
+ pszDirectory[0] = '\0';
+
+ bRet = osl_psz_getConfigDir(Security,pszDirectory,sizeof(pszDirectory));
+
+ if ( bRet == sal_True )
+ {
+ rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( pszDirectory ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*pustrDirectory != NULL);
+ osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory );
+ }
+
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax)
+{
+ return (osl_psz_getHomeDir(Security, pszDirectory, nMax));
+}
+
+sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security)
+{
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
+
+ if (pSecImpl == NULL)
+ return sal_False;
+
+ if (pSecImpl->m_pPasswd.pw_uid != 0)
+ return (sal_False);
+
+ return (sal_True);
+}
+
+void SAL_CALL osl_freeSecurityHandle(oslSecurity Security)
+{
+ if (Security)
+ free ((oslSecurityImpl*)Security);
+}
+
+
+sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security)
+{
+ return sal_False;
+}
+
+void SAL_CALL osl_unloadUserProfile(oslSecurity Security)
+{
+ return;
+}
+
+
diff --git a/sal/osl/os2/semaphor.c b/sal/osl/os2/semaphor.c
new file mode 100644
index 000000000000..8613e3ecd352
--- /dev/null
+++ b/sal/osl/os2/semaphor.c
@@ -0,0 +1,190 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/semaphor.h>
+
+/*
+ Implemetation notes:
+ The void* represented by oslSemaphore is used
+ to store a OS/2 HANDLE.
+*/
+
+typedef struct _oslSemaphoreImpl
+{
+ HEV hevReachedZero;
+ int nCount;
+} oslSemaphoreImpl;
+
+// static mutex to control access to private members of oslMutexImpl
+static HMTX MutexLock = NULL;
+
+/*****************************************************************************/
+/* osl_createSemaphore */
+/*****************************************************************************/
+
+/*
+- Erzeugen der Semaphore
+- Z„hler auf initialCount setzen
+*/
+oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount)
+{
+ APIRET rc;
+ oslSemaphoreImpl * pSemaphoreImpl;
+
+ /* alloc mem. for our internal data structure */
+ pSemaphoreImpl = (oslSemaphoreImpl *) malloc(sizeof(oslSemaphoreImpl));
+ if( pSemaphoreImpl == NULL )
+ return NULL;
+
+ /* create semaphore */
+ rc = DosCreateEventSem( NULL,
+ &pSemaphoreImpl->hevReachedZero,
+ DC_SEM_SHARED,
+ FALSE );
+ if( rc != NO_ERROR )
+ {
+ free( pSemaphoreImpl );
+ return NULL;
+ }
+
+ pSemaphoreImpl->nCount = initialCount;
+
+ // create static mutex for private members
+ if (MutexLock == NULL)
+ DosCreateMutexSem( NULL, &MutexLock, 0, FALSE );
+
+ return (oslSemaphore) pSemaphoreImpl;
+}
+
+/*****************************************************************************/
+/* osl_destroySemaphore */
+/*****************************************************************************/
+
+/*
+- Semaphore l”schen
+*/
+
+void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore)
+{
+ oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore;
+ OSL_ASSERT(Semaphore != 0);
+
+ DosCloseEventSem( pSemaphoreImpl->hevReachedZero );
+
+ free( pSemaphoreImpl );
+}
+
+/*****************************************************************************/
+/* osl_acquireSemaphore */
+/*****************************************************************************/
+/*
+- Z„hler -1
+- wenn Z„hler < 0: blockieren
+*/
+
+sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore)
+{
+ APIRET rc;
+ oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore;
+ int nCount;
+ OSL_ASSERT(Semaphore != 0);
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+
+ while( pSemaphoreImpl->nCount < 1 )
+ {
+ sal_uInt32 nPostCount;
+
+ DosReleaseMutexSem( MutexLock);
+
+ rc = DosWaitEventSem(pSemaphoreImpl->hevReachedZero, SEM_INDEFINITE_WAIT );
+ DosResetEventSem(pSemaphoreImpl->hevReachedZero, &nPostCount);
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+ }
+
+ pSemaphoreImpl->nCount--;
+ DosReleaseMutexSem( MutexLock);
+
+ return( rc == NO_ERROR );
+}
+
+/*****************************************************************************/
+/* osl_tryToAcquireSemaphore */
+/*****************************************************************************/
+/*
+- Z„hler -1, wenn vorher > 0
+- wenn Z„hler < 0: mit FALSE zurueck
+*/
+sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore)
+{
+ APIRET rc;
+ oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore;
+ int nCount;
+ OSL_ASSERT(Semaphore != 0);
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+
+ nCount = pSemaphoreImpl->nCount;
+ if( pSemaphoreImpl->nCount > 0 )
+ pSemaphoreImpl->nCount--;
+
+ DosReleaseMutexSem( MutexLock);
+
+ return( nCount > 0 );
+}
+
+/*****************************************************************************/
+/* osl_releaseSemaphore */
+/*****************************************************************************/
+/*
+- Z„hler +1
+*/
+sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore)
+{
+ APIRET rc;
+ oslSemaphoreImpl* pSemaphoreImpl = (oslSemaphoreImpl*)Semaphore;
+ int nCount;
+ OSL_ASSERT(Semaphore != 0);
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+
+ nCount = pSemaphoreImpl->nCount;
+ pSemaphoreImpl->nCount++;
+
+ DosReleaseMutexSem( MutexLock);
+
+ if( nCount == 0 )
+ DosPostEventSem(pSemaphoreImpl->hevReachedZero);
+
+ return( rc == NO_ERROR );
+}
+
+
diff --git a/sal/osl/os2/signal.c b/sal/osl/os2/signal.c
new file mode 100644
index 000000000000..881db13fe1e1
--- /dev/null
+++ b/sal/osl/os2/signal.c
@@ -0,0 +1,249 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+/* system headers */
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/mutex.h>
+#include <osl/signal.h>
+
+typedef struct _oslSignalHandlerImpl
+{
+ oslSignalHandlerFunction Handler;
+ void* pData;
+ struct _oslSignalHandlerImpl* pNext;
+} oslSignalHandlerImpl;
+
+static sal_Bool bErrorReportingEnabled = sal_True;
+static sal_Bool bInitSignal = sal_False;
+static oslMutex SignalListMutex;
+static oslSignalHandlerImpl* SignalList;
+
+/*static*//* ULONG _Export APIENTRY SignalHandlerFunction(PEXCEPTIONREPORTRECORD pERepRec,
+ PEXCEPTIONREGISTRATIONRECORD,
+ PCONTEXTRECORD, PVOID);
+*/
+/*static*/ ULONG __declspec(dllexport) APIENTRY SignalHandlerFunction(PEXCEPTIONREPORTRECORD pERepRec,
+ PEXCEPTIONREGISTRATIONRECORD,
+ PCONTEXTRECORD, PVOID);
+static EXCEPTIONREGISTRATIONRECORD ExcptHandler = { 0, SignalHandlerFunction };
+
+static sal_Bool InitSignal( void )
+{
+ SignalListMutex = osl_createMutex();
+
+ ExcptHandler.ExceptionHandler = (_ERR *) &SignalHandlerFunction;
+ /* DosSetExceptionHandler(&ExcptHandler); */
+
+ return sal_True;
+}
+
+static sal_Bool DeInitSignal( void )
+{
+ /* DosUnsetExceptionHandler(&ExcptHandler); */
+
+ osl_destroyMutex(SignalListMutex);
+
+ return sal_False;
+}
+
+static oslSignalAction CallSignalHandler(oslSignalInfo *pInfo)
+{
+ oslSignalHandlerImpl* pHandler = SignalList;
+ oslSignalAction Action = osl_Signal_ActCallNextHdl;
+
+ while (pHandler != NULL)
+ {
+ if ((Action = pHandler->Handler(pHandler->pData, pInfo)) != osl_Signal_ActCallNextHdl)
+ break;
+
+ pHandler = pHandler->pNext;
+ }
+
+ return Action;
+}
+
+/*****************************************************************************/
+/* SignalHandlerFunction */
+/*****************************************************************************/
+/*static*/ ULONG __declspec(dllexport) APIENTRY SignalHandlerFunction(PEXCEPTIONREPORTRECORD pERepRec,
+ PEXCEPTIONREGISTRATIONRECORD pERegRec,
+ PCONTEXTRECORD pConRec, PVOID pReserved)
+{
+ oslSignalInfo Info;
+
+ Info.UserSignal = pERepRec->ExceptionNum;
+ Info.UserData = NULL;
+
+ switch (pERepRec->ExceptionNum)
+ {
+ case XCPT_ACCESS_VIOLATION:
+ Info.Signal = osl_Signal_AccessViolation;
+ break;
+
+ case XCPT_INTEGER_DIVIDE_BY_ZERO:
+ Info.Signal = osl_Signal_IntegerDivideByZero;
+ break;
+
+ case XCPT_BREAKPOINT:
+ Info.Signal = osl_Signal_DebugBreak;
+ break;
+
+ default:
+ Info.Signal = osl_Signal_System;
+ break;
+ }
+
+ switch (CallSignalHandler(&Info))
+ {
+ case osl_Signal_ActCallNextHdl:
+ return (XCPT_CONTINUE_SEARCH);
+
+ case osl_Signal_ActAbortApp:
+ return (XCPT_CONTINUE_SEARCH);
+
+ case osl_Signal_ActKillApp:
+ exit(255);
+ break;
+ }
+
+ return (XCPT_CONTINUE_SEARCH);
+}
+
+/*****************************************************************************/
+/* osl_addSignalHandler */
+/*****************************************************************************/
+oslSignalHandler SAL_CALL osl_addSignalHandler(oslSignalHandlerFunction Handler, void* pData)
+{
+ oslSignalHandlerImpl* pHandler;
+
+ OSL_ASSERT(Handler != NULL);
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ pHandler = (oslSignalHandlerImpl*) calloc(1, sizeof(oslSignalHandlerImpl));
+
+ if (pHandler != NULL)
+ {
+ pHandler->Handler = Handler;
+ pHandler->pData = pData;
+
+ osl_acquireMutex(SignalListMutex);
+
+ pHandler->pNext = SignalList;
+ SignalList = pHandler;
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (pHandler);
+ }
+
+ return (NULL);
+}
+
+/*****************************************************************************/
+/* osl_removeSignalHandler */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_removeSignalHandler(oslSignalHandler Handler)
+{
+ oslSignalHandlerImpl *pHandler, *pPrevious = NULL;
+
+ OSL_ASSERT(Handler != NULL);
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ osl_acquireMutex(SignalListMutex);
+
+ pHandler = SignalList;
+
+ while (pHandler != NULL)
+ {
+ if (pHandler == Handler)
+ {
+ if (pPrevious)
+ pPrevious->pNext = pHandler->pNext;
+ else
+ SignalList = pHandler->pNext;
+
+ osl_releaseMutex(SignalListMutex);
+
+ if (SignalList == NULL )
+ bInitSignal = DeInitSignal();
+
+ free(pHandler);
+
+ return (sal_True);
+ }
+
+ pPrevious = pHandler;
+ pHandler = pHandler->pNext;
+ }
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (sal_False);
+}
+
+/*****************************************************************************/
+/* osl_raiseSignal */
+/*****************************************************************************/
+oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData)
+{
+ oslSignalInfo Info;
+ oslSignalAction Action;
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ osl_acquireMutex(SignalListMutex);
+
+ Info.Signal = osl_Signal_User;
+ Info.UserSignal = UserSignal;
+ Info.UserData = UserData;
+
+ Action = CallSignalHandler(&Info);
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (Action);
+}
+
+/*****************************************************************************/
+/* osl_setErrorReporting */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable )
+{
+ sal_Bool bOld = bErrorReportingEnabled;
+ bErrorReportingEnabled = bEnable;
+
+ return bOld;
+}
+
diff --git a/sal/osl/os2/socket.c b/sal/osl/os2/socket.c
new file mode 100644
index 000000000000..6c171016f798
--- /dev/null
+++ b/sal/osl/os2/socket.c
@@ -0,0 +1,3097 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/socket.h>
+#include <osl/diagnose.h>
+#include <osl/mutex.h>
+#include <osl/signal.h>
+
+#include <rtl/alloc.h>
+
+#include <ctype.h>
+#include <sal/types.h>
+
+#include "sockimpl.h"
+
+
+/* defines for poll */
+#ifdef HAVE_POLL_H
+#undef HAVE_POLL_H
+#endif
+
+#if defined(LINUX) || defined(NETBSD) || defined ( FREEBSD ) || defined (MACOSX)
+#include <sys/poll.h>
+#define HAVE_POLL_H
+#endif /* HAVE_POLL_H */
+
+#if defined(SOLARIS)
+#include <poll.h>
+#define HAVE_POLL_H
+#endif /* SOLARIS */
+
+#ifndef HAVE_POLL_H
+#define POLLIN 0x0001
+#define POLLOUT 0x0002
+#define POLLPRI 0x0004
+#endif /* HAVE_POLL_H */
+
+
+/* defines for shutdown */
+#define SD_RECEIVE 0
+#define SD_SEND 1
+#define SD_BOTH 2
+
+
+/*
+ oslSocketAddr is a pointer to a Berkeley struct sockaddr.
+ I refrained from using sockaddr_in because of possible further
+ extensions of this socket-interface (IP-NG?).
+ The intention was to hide all Berkeley data-structures from
+ direct access past the osl-interface.
+
+ The current implementation is internet (IP) centered. All
+ the constructor-functions (osl_create...) take parameters
+ that will probably make sense only in the IP-environment
+ (e.g. because of using the dotted-address-format).
+
+ If the interface will be extended to host other protocol-
+ families, I expect no externally visible changes in the
+ existing functions. You'll probably need only new
+ constructor-functions who take the different address
+ formats into consideration (maybe a long dotted address
+ or whatever).
+*/
+
+/* _Note_ that I rely on the fact that oslSocketAddr and struct sockaddr */
+/* are the same! I don't like it very much but see no other easy way to */
+/* conceal the struct sockaddr from the eyes of the user. */
+
+
+#define OSL_INVALID_SOCKET -1
+#define OSL_SOCKET_ERROR -1
+
+
+/* Buffer size for gethostbyname */
+#define MAX_HOSTBUFFER_SIZE 2048
+
+/*****************************************************************************/
+/* enum oslAddrFamily */
+/*****************************************************************************/
+
+/* map */
+static unsigned long FamilyMap[]= {
+ AF_INET, /* osl_Socket_FamilyInet */
+ AF_IPX, /* osl_Socket_FamilyIpx */
+ 0 /* osl_Socket_FamilyInvalid */
+};
+
+/* reverse map */
+static oslAddrFamily osl_AddrFamilyFromNative(sal_uInt32 nativeType)
+{
+ oslAddrFamily i= (oslAddrFamily)0;
+
+ while(i != osl_Socket_FamilyInvalid)
+ {
+ if(FamilyMap[i] == nativeType)
+ return i;
+ i = (oslAddrFamily) ( i + 1 );
+ }
+
+ return i;
+}
+
+/* macros */
+#define FAMILY_FROM_NATIVE(y) osl_AddrFamilyFromNative(y)
+#define FAMILY_TO_NATIVE(x) (short)FamilyMap[x]
+
+/*****************************************************************************/
+/* enum oslProtocol */
+/*****************************************************************************/
+
+/* map */
+static sal_uInt32 ProtocolMap[]= {
+ 0, /* osl_Socket_ProtocolIp */
+ NSPROTO_IPX, /* osl_Socket_ProtocolIpx */
+ NSPROTO_SPX, /* osl_Socket_ProtocolSpx */
+ NSPROTO_SPXII, /* osl_Socket_ProtocolSpxII */
+ 0 /* osl_Socket_ProtocolInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslProtocol osl_ProtocolFromNative(sal_uInt32 nativeType)
+{
+ oslProtocol i= (oslProtocol)0;
+
+ while(i != osl_Socket_ProtocolInvalid)
+ {
+ if(ProtocolMap[i] == nativeType)
+ return i;
+ i = (oslProtocol) ( i + 1);
+ }
+
+ return i;
+}
+*/
+
+/* macros */
+#define PROTOCOL_FROM_NATIVE(y) osl_ProtocolFromNative(y)
+#define PROTOCOL_TO_NATIVE(x) ProtocolMap[x]
+
+
+/*****************************************************************************/
+/* enum oslSocketType */
+/*****************************************************************************/
+
+/* map */
+static sal_uInt32 TypeMap[]= {
+ SOCK_STREAM, /* osl_Socket_TypeStream */
+ SOCK_DGRAM, /* osl_Socket_TypeDgram */
+ SOCK_RAW, /* osl_Socket_TypeRaw */
+ SOCK_RDM, /* osl_Socket_TypeRdm */
+ SOCK_SEQPACKET, /* osl_Socket_TypeSeqPacket */
+ 0 /* osl_Socket_TypeInvalid */
+};
+
+/* reverse map */
+static oslSocketType osl_SocketTypeFromNative(sal_uInt32 nativeType)
+{
+ oslSocketType i= (oslSocketType)0;
+
+ while(i != osl_Socket_TypeInvalid)
+ {
+ if(TypeMap[i] == nativeType)
+ return i;
+ i = (oslSocketType)(i + 1);
+ }
+
+ return i;
+}
+
+/* macros */
+#define TYPE_TO_NATIVE(x) TypeMap[x]
+#define TYPE_FROM_NATIVE(y) osl_SocketTypeFromNative(y)
+
+
+/*****************************************************************************/
+/* enum oslSocketOption */
+/*****************************************************************************/
+
+/* map */
+static sal_uInt32 OptionMap[]= {
+ SO_DEBUG, /* osl_Socket_OptionDebug */
+ SO_ACCEPTCONN, /* osl_Socket_OptionAcceptConn */
+ SO_REUSEADDR, /* osl_Socket_OptionReuseAddr */
+ SO_KEEPALIVE, /* osl_Socket_OptionKeepAlive */
+ SO_DONTROUTE, /* osl_Socket_OptionDontRoute */
+ SO_BROADCAST, /* osl_Socket_OptionBroadcast */
+ SO_USELOOPBACK, /* osl_Socket_OptionUseLoopback */
+ SO_LINGER, /* osl_Socket_OptionLinger */
+ SO_OOBINLINE, /* osl_Socket_OptionOOBinLine */
+ SO_SNDBUF, /* osl_Socket_OptionSndBuf */
+ SO_RCVBUF, /* osl_Socket_OptionRcvBuf */
+ SO_SNDLOWAT, /* osl_Socket_OptionSndLowat */
+ SO_RCVLOWAT, /* osl_Socket_OptionRcvLowat */
+ SO_SNDTIMEO, /* osl_Socket_OptionSndTimeo */
+ SO_RCVTIMEO, /* osl_Socket_OptionRcvTimeo */
+ SO_ERROR, /* osl_Socket_OptionError */
+ SO_TYPE, /* osl_Socket_OptionType */
+ TCP_NODELAY, /* osl_Socket_OptionTcpNoDelay */
+ 0 /* osl_Socket_OptionInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslSocketOption osl_SocketOptionFromNative(sal_uInt32 nativeType)
+{
+ oslSocketOption i= (oslSocketOption)0;
+
+ while(i != osl_Socket_OptionInvalid)
+ {
+ if(OptionMap[i] == nativeType)
+ return i;
+ i = (oslSocketOption) ( i + 1 );
+ }
+
+ return i;
+}
+*/
+/* macros */
+#define OPTION_TO_NATIVE(x) OptionMap[x]
+#define OPTION_FROM_NATIVE(y) osl_SocketOptionFromNative(y)
+
+
+/*****************************************************************************/
+/* enum oslSocketOptionLevel */
+/*****************************************************************************/
+
+static sal_uInt32 OptionLevelMap[]= {
+ SOL_SOCKET, /* osl_Socket_LevelSocket */
+ IPPROTO_TCP, /* osl_Socket_LevelTcp */
+ 0 /* osl_Socket_LevelInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslSocketOptionLevel osl_SocketOptionLevelFromNative(sal_uInt32 nativeType)
+{
+ oslSocketOptionLevel i= (oslSocketOptionLevel)0;
+
+ while(i != osl_Socket_LevelInvalid)
+ {
+ if(OptionLevelMap[i] == nativeType)
+ return i;
+ i = (oslSocketOptionLevel) ( i + 1 );
+ }
+
+ return i;
+}
+*/
+/* macros */
+#define OPTION_LEVEL_TO_NATIVE(x) OptionLevelMap[x]
+#define OPTION_LEVEL_FROM_NATIVE(y) osl_SocketOptionLevelFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketMsgFlag */
+/*****************************************************************************/
+
+static sal_uInt32 SocketMsgFlagMap[]= {
+ 0, /* osl_Socket_MsgNormal */
+ MSG_OOB, /* osl_Socket_MsgOOB */
+ MSG_PEEK, /* osl_Socket_MsgPeek */
+ MSG_DONTROUTE, /* osl_Socket_MsgDontRoute */
+ MSG_MAXIOVLEN, /* osl_Socket_MsgMaxIOVLen */
+ 0 /* osl_Socket_MsgInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslSocketMsgFlag osl_SocketMsgFlagFromNative(sal_uInt32 nativeType)
+{
+ oslSocketMsgFlag i= (oslSocketMsgFlag)0;
+
+ while(i != osl_Socket_MsgInvalid)
+ {
+ if(SocketMsgFlagMap[i] == nativeType)
+ return i;
+ i = (oslSocketMsgFlag) ( i + 1 );
+ }
+
+ return i;
+}
+*/
+
+/* macros */
+#define MSG_FLAG_TO_NATIVE(x) SocketMsgFlagMap[x]
+#define MSG_FLAG_FROM_NATIVE(y) osl_SocketMsgFlagFromNative(y)
+
+
+/*****************************************************************************/
+/* enum oslSocketDirection */
+/*****************************************************************************/
+
+static sal_uInt32 SocketDirection[]= {
+ SD_RECEIVE, /* osl_Socket_DirRead */
+ SD_SEND, /* osl_Socket_DirWrite */
+ SD_BOTH, /* osl_Socket_DirReadWrite */
+ 0 /* osl_Socket_DirInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslSocketDirection osl_SocketDirectionFromNative(sal_uInt32 nativeType)
+{
+ oslSocketDirection i= (oslSocketDirection)0;
+
+ while(i != osl_Socket_DirInvalid)
+ {
+ if(SocketDirection[i] == nativeType)
+ return i;
+ i = (oslSocketDirection) ( i + 1 );
+ }
+
+ return i;
+}
+*/
+
+/* macros */
+#define DIRECTION_TO_NATIVE(x) SocketDirection[x]
+#define DIRECTION_FROM_NATIVE(y) osl_SocketDirectionFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketError */
+/*****************************************************************************/
+
+static struct
+{
+ int errcode;
+ oslSocketError error;
+} SocketError[]= {
+ { 0, osl_Socket_E_None }, /* no error */
+ { ENOTSOCK, osl_Socket_E_NotSocket }, /* Socket operation on non-socket */
+ { EDESTADDRREQ, osl_Socket_E_DestAddrReq }, /* Destination address required */
+ { EMSGSIZE, osl_Socket_E_MsgSize }, /* Message too long */
+ { EPROTOTYPE, osl_Socket_E_Prototype }, /* Protocol wrong type for socket */
+ { ENOPROTOOPT, osl_Socket_E_NoProtocol }, /* Protocol not available */
+ { EPROTONOSUPPORT, osl_Socket_E_ProtocolNoSupport }, /* Protocol not supported */
+ { ESOCKTNOSUPPORT, osl_Socket_E_TypeNoSupport }, /* Socket type not supported */
+ { EOPNOTSUPP, osl_Socket_E_OpNotSupport }, /* Operation not supported on socket */
+ { EPFNOSUPPORT, osl_Socket_E_PfNoSupport }, /* Protocol family not supported */
+ { EAFNOSUPPORT, osl_Socket_E_AfNoSupport }, /* Address family not supported by */
+ /* protocol family */
+ { EADDRINUSE, osl_Socket_E_AddrInUse }, /* Address already in use */
+ { EADDRNOTAVAIL, osl_Socket_E_AddrNotAvail }, /* Can't assign requested address */
+ { ENETDOWN, osl_Socket_E_NetDown }, /* Network is down */
+ { ENETUNREACH, osl_Socket_E_NetUnreachable }, /* Network is unreachable */
+ { ENETRESET, osl_Socket_E_NetReset }, /* Network dropped connection because */
+ /* of reset */
+ { ECONNABORTED, osl_Socket_E_ConnAborted }, /* Software caused connection abort */
+ { ECONNRESET, osl_Socket_E_ConnReset }, /* Connection reset by peer */
+ { ENOBUFS, osl_Socket_E_NoBufferSpace }, /* No buffer space available */
+ { EISCONN, osl_Socket_E_IsConnected }, /* Socket is already connected */
+ { ENOTCONN, osl_Socket_E_NotConnected }, /* Socket is not connected */
+ { ESHUTDOWN, osl_Socket_E_Shutdown }, /* Can't send after socket shutdown */
+ { ETOOMANYREFS, osl_Socket_E_TooManyRefs }, /* Too many references: can't splice */
+ { ETIMEDOUT, osl_Socket_E_TimedOut }, /* Connection timed out */
+ { ECONNREFUSED, osl_Socket_E_ConnRefused }, /* Connection refused */
+ { EHOSTDOWN, osl_Socket_E_HostDown }, /* Host is down */
+ { EHOSTUNREACH, osl_Socket_E_HostUnreachable }, /* No route to host */
+ { EWOULDBLOCK, osl_Socket_E_WouldBlock }, /* call would block on non-blocking socket */
+ { EALREADY, osl_Socket_E_Already }, /* operation already in progress */
+ { EINPROGRESS, osl_Socket_E_InProgress }, /* operation now in progress */
+ { EAGAIN, osl_Socket_E_WouldBlock }, /* same as EWOULDBLOCK */
+ { -1, osl_Socket_E_InvalidError }
+};
+
+/* map */
+/* mfe: NOT USED
+static int osl_NativeFromSocketError(oslSocketError errorCode)
+{
+ int i = 0;
+
+ while ((SocketError[i].error != osl_Socket_E_InvalidError) &&
+ (SocketError[i].error != errorCode)) i++;
+
+ return SocketError[i].errcode;
+}
+*/
+
+/* reverse map */
+static oslSocketError osl_SocketErrorFromNative(int nativeType)
+{
+ int i = 0;
+
+ while ((SocketError[i].error != osl_Socket_E_InvalidError) &&
+ (SocketError[i].errcode != nativeType)) i++;
+
+ return SocketError[i].error;
+}
+
+/* macros */
+#define ERROR_TO_NATIVE(x) osl_NativeFromSocketError(x)
+#define ERROR_FROM_NATIVE(y) osl_SocketErrorFromNative(y)
+
+/*****************************************************************************/
+/* local function prototypes */
+/*****************************************************************************/
+
+oslSocketAddr SAL_CALL osl_psz_createInetSocketAddr (
+ const sal_Char* pszDottedAddr, sal_Int32 Port);
+
+oslSocketAddr SAL_CALL osl_psz_createIpxSocketAddr (
+ const sal_Char NetNumber[4],
+ const sal_Char NodeNumber[6],
+ sal_uInt32 SocketNumber);
+
+oslHostAddr SAL_CALL osl_psz_createHostAddr (
+ const sal_Char *pszHostname, const oslSocketAddr Addr);
+
+oslHostAddr SAL_CALL osl_psz_createHostAddrByName (
+ const sal_Char *pszHostname);
+
+const sal_Char* SAL_CALL osl_psz_getHostnameOfHostAddr (
+ const oslHostAddr Addr);
+
+oslSocketResult SAL_CALL osl_psz_getLocalHostname (
+ sal_Char *pBuffer, sal_uInt32 nBufLen);
+
+oslSocketAddr SAL_CALL osl_psz_resolveHostname (
+ const sal_Char* pszHostname);
+
+sal_Int32 SAL_CALL osl_psz_getServicePort (
+ const sal_Char* pszServicename, const sal_Char* pszProtocol);
+
+oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr (
+ oslSocketAddr Addr, sal_Char *pBuffer, sal_uInt32 BufferSize);
+
+oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr (
+ oslSocketAddr Addr, sal_Char *pBuffer, sal_uInt32 BufferSize);
+
+void SAL_CALL osl_psz_getLastSocketErrorDescription (
+ oslSocket Socket, sal_Char* pBuffer, sal_uInt32 BufferSize);
+
+/*****************************************************************************/
+/* osl_create/destroy-SocketImpl */
+/*****************************************************************************/
+
+#if OSL_DEBUG_LEVEL > 1
+static sal_uInt32 g_nSocketImpl = 0;
+static sal_uInt32 g_nSocketAddr = 0;
+
+/* sorry, must be implemented otherwise */
+#if 0
+struct LeakWarning
+{
+ ~LeakWarning()
+ {
+ if( g_nSocketImpl )
+ OSL_TRACE( "sal_socket: %d socket instances leak\n" , g_nSocketImpl );
+ if( g_nSocketAddr )
+ OSL_TRACE( "sal_socket: %d socket address instances leak\n" , g_nSocketAddr );
+ }
+};
+LeakWarning socketWarning;
+#endif
+
+#endif /* OSL_DEBUG_LEVEL */
+
+
+oslSocket __osl_createSocketImpl(int Socket)
+{
+ oslSocket pSocket;
+
+ pSocket = (oslSocket)calloc(1, sizeof(struct oslSocketImpl));
+
+ pSocket->m_Socket = Socket;
+ pSocket->m_nLastError = 0;
+ pSocket->m_CloseCallback = 0;
+ pSocket->m_CallbackArg = 0;
+ pSocket->m_nRefCount = 1;
+
+#if defined(LINUX)
+ pSocket->m_bIsAccepting = sal_False;
+#endif
+
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketImpl ++;
+#endif
+ return pSocket;
+}
+
+void __osl_destroySocketImpl(oslSocket Socket)
+{
+ if ( Socket != NULL)
+ free((struct oslSocketImpl *) Socket);
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketImpl --;
+#endif
+}
+
+static oslSocketAddr __osl_createSocketAddr( )
+{
+ oslSocketAddr pAddr = (oslSocketAddr) rtl_allocateZeroMemory( sizeof( struct oslSocketAddrImpl ));
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketAddr ++;
+#endif
+ return pAddr;
+}
+
+static oslSocketAddr __osl_createSocketAddrWithFamily(
+ oslAddrFamily family, sal_Int32 port, sal_uInt32 nAddr )
+{
+ oslSocketAddr pAddr;
+
+ OSL_ASSERT( family == osl_Socket_FamilyInet );
+
+ pAddr = __osl_createSocketAddr();
+ switch( family )
+ {
+ case osl_Socket_FamilyInet:
+ {
+ struct sockaddr_in* pInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+
+ pInetAddr->sin_family = FAMILY_TO_NATIVE(osl_Socket_FamilyInet);
+ pInetAddr->sin_addr.s_addr = nAddr;
+ pInetAddr->sin_port = (sal_uInt16)(port&0xffff);
+ break;
+ }
+ default:
+ pAddr->m_sockaddr.sa_family = FAMILY_TO_NATIVE(family);
+ }
+ return pAddr;
+}
+
+static oslSocketAddr __osl_createSocketAddrFromSystem( struct sockaddr *pSystemSockAddr )
+{
+ oslSocketAddr pAddr = __osl_createSocketAddr();
+ memcpy( &(pAddr->m_sockaddr), pSystemSockAddr, sizeof( struct sockaddr ) );
+ return pAddr;
+}
+
+static void __osl_destroySocketAddr( oslSocketAddr addr )
+{
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketAddr --;
+#endif
+ rtl_freeMemory( addr );
+}
+
+/*****************************************************************************/
+/* osl_createEmptySocketAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createEmptySocketAddr(oslAddrFamily Family)
+{
+ oslSocketAddr pAddr = 0;
+
+ /* is it an internet-Addr? */
+ if (Family == osl_Socket_FamilyInet)
+ {
+ pAddr = __osl_createSocketAddrWithFamily(Family, 0 , htonl(INADDR_ANY) );
+ }
+ else
+ {
+ pAddr = __osl_createSocketAddrWithFamily( Family , 0 , 0 );
+ }
+
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_copySocketAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_copySocketAddr(oslSocketAddr Addr)
+{
+ oslSocketAddr pCopy = 0;
+ if (Addr)
+ {
+ pCopy = __osl_createSocketAddr();
+
+ if (pCopy)
+ memcpy(&(pCopy->m_sockaddr),&(Addr->m_sockaddr), sizeof(struct sockaddr));
+ }
+ return pCopy;
+}
+
+/*****************************************************************************/
+/* osl_isEqualSocketAddr */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isEqualSocketAddr (
+ oslSocketAddr Addr1,
+ oslSocketAddr Addr2)
+{
+ struct sockaddr* pAddr1= &(Addr1->m_sockaddr);
+ struct sockaddr* pAddr2= &(Addr2->m_sockaddr);
+
+ OSL_ASSERT(pAddr1);
+ OSL_ASSERT(pAddr2);
+
+ if (pAddr1->sa_family == pAddr2->sa_family)
+ {
+ switch (pAddr1->sa_family)
+ {
+ case AF_INET:
+ {
+ struct sockaddr_in* pInetAddr1= (struct sockaddr_in*)pAddr1;
+ struct sockaddr_in* pInetAddr2= (struct sockaddr_in*)pAddr2;
+
+ if ((pInetAddr1->sin_family == pInetAddr2->sin_family) &&
+ (pInetAddr1->sin_addr.s_addr == pInetAddr2->sin_addr.s_addr) &&
+ (pInetAddr1->sin_port == pInetAddr2->sin_port))
+ return (sal_True);
+ }
+
+ default:
+ {
+ return (memcmp(pAddr1, Addr2, sizeof(struct sockaddr)) == 0);
+ }
+ }
+ }
+
+ return (sal_False);
+}
+
+/*****************************************************************************/
+/* osl_createInetBroadcastAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createInetBroadcastAddr (
+ rtl_uString *strDottedAddr,
+ sal_Int32 Port)
+{
+ sal_uInt32 nAddr = OSL_INADDR_NONE;
+ oslSocketAddr pAddr;
+
+ if (strDottedAddr && strDottedAddr->length)
+ {
+ /* Dotted host address for limited broadcast */
+ rtl_String *pDottedAddr = NULL;
+
+ rtl_uString2String (
+ &pDottedAddr, strDottedAddr->buffer, strDottedAddr->length,
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ nAddr = inet_addr (pDottedAddr->buffer);
+ rtl_string_release (pDottedAddr);
+ }
+
+ if (nAddr != OSL_INADDR_NONE)
+ {
+ /* Limited broadcast */
+ nAddr = ntohl(nAddr);
+ if (IN_CLASSA(nAddr))
+ {
+ nAddr &= IN_CLASSA_NET;
+ nAddr |= IN_CLASSA_HOST;
+ }
+ else if (IN_CLASSB(nAddr))
+ {
+ nAddr &= IN_CLASSB_NET;
+ nAddr |= IN_CLASSB_HOST;
+ }
+ else if (IN_CLASSC(nAddr))
+ {
+ nAddr &= IN_CLASSC_NET;
+ nAddr |= IN_CLASSC_HOST;
+ }
+ else
+ {
+ /* No broadcast in class D */
+ return ((oslSocketAddr)NULL);
+ }
+ nAddr = htonl(nAddr);
+ }
+
+ pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons(Port), nAddr );
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_createInetSocketAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createInetSocketAddr (
+ rtl_uString *ustrDottedAddr,
+ sal_Int32 Port)
+{
+ rtl_String* strDottedAddr=0;
+ oslSocketAddr Addr;
+ sal_Char* pszDottedAddr=0;
+
+ if ( ustrDottedAddr != 0 )
+ {
+ rtl_uString2String( &strDottedAddr,
+ rtl_uString_getStr(ustrDottedAddr),
+ rtl_uString_getLength(ustrDottedAddr),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+ pszDottedAddr = rtl_string_getStr(strDottedAddr);
+ }
+
+
+ Addr = osl_psz_createInetSocketAddr(pszDottedAddr, Port);
+
+ if ( strDottedAddr != 0 )
+ {
+ rtl_string_release(strDottedAddr);
+ }
+
+ return Addr;
+}
+
+oslSocketAddr SAL_CALL osl_psz_createInetSocketAddr (
+ const sal_Char* pszDottedAddr,
+ sal_Int32 Port)
+{
+ oslSocketAddr pAddr = 0;
+ sal_Int32 Addr = inet_addr(pszDottedAddr);
+ if(Addr != -1)
+ {
+ /* valid dotted addr */
+ pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons(Port) , Addr );
+ }
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_setAddrOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_setAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence *pByteSeq )
+{
+ oslSocketResult res = osl_Socket_Error;
+
+ OSL_ASSERT( pAddr );
+ OSL_ASSERT( pByteSeq );
+
+ if( pAddr && pByteSeq )
+ {
+ struct sockaddr_in * pSystemInetAddr;
+
+ OSL_ASSERT( pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE( osl_Socket_FamilyInet ) );
+ OSL_ASSERT( pByteSeq->nElements == 4 );
+
+ pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr);
+ memcpy( &(pSystemInetAddr->sin_addr) , pByteSeq->elements , 4 );
+ res = osl_Socket_Ok;
+ }
+ return res;
+}
+
+/*****************************************************************************/
+/* osl_getAddrOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence **ppByteSeq )
+{
+ oslSocketResult res = osl_Socket_Error;
+
+ OSL_ASSERT( pAddr );
+ OSL_ASSERT( ppByteSeq );
+
+ if( pAddr && ppByteSeq )
+ {
+ struct sockaddr_in * pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr);
+ rtl_byte_sequence_constructFromArray( ppByteSeq , (sal_Int8 *) &(pSystemInetAddr->sin_addr),4);
+ res = osl_Socket_Ok;
+ }
+ return res;
+}
+
+
+/*****************************************************************************/
+/* _osl_getFullQualifiedDomainName */
+/*****************************************************************************/
+
+/** try to figure out a full-qualified hostname, by adding the current domain
+ as given by the domainname program to the given hostname.
+ This function MUST NOT call gethostbyname since pHostName allready points
+ to data returned by gethostname and would be garbled: use gethostname_r
+ instead!
+ */
+
+/* wrap around different interfaces to reentrant gethostbyname */
+static struct hostent* _osl_gethostbyname_r (
+ const char *name, struct hostent *result,
+ char *buffer, int buflen, int *h_errnop)
+{
+
+#ifdef LINUX
+ struct hostent *__result; /* will be the same as result */
+ int __error;
+ __error = gethostbyname_r (name, result, buffer, buflen,
+ &__result, h_errnop);
+ return __error ? NULL : __result ;
+#elif defined OS2
+ // YD FIXME!!!
+ return 0;
+#else
+ return gethostbyname_r( name, result, buffer, buflen, h_errnop);
+#endif
+}
+
+static sal_Bool _osl_getDomainName (sal_Char *buffer, sal_Int32 bufsiz)
+{
+ sal_Bool result;
+ int p[2];
+
+ result = sal_False;
+
+#if 0 // YD 17/04/06 libc panic for fork() from thread!=1
+
+ if (pipe (p) == 0)
+ {
+ pid_t pid;
+ int nStatus;
+
+ pid = fork();
+ if (pid == 0)
+ {
+ char *argv[] =
+ {
+ "/bin/domainname",
+ NULL
+ };
+
+ close (p[0]);
+ dup2 (p[1], 1);
+ close (p[1]);
+
+ execv ("/bin/domainname", argv);
+ // arriving here means exec failed
+ _exit(-1);
+ }
+ else if (pid > 0)
+ {
+ sal_Int32 k = 0, n = bufsiz;
+
+ close (p[1]);
+ if ((k = read (p[0], buffer, n - 1)) > 0)
+ {
+ buffer[k] = 0;
+ if (buffer[k - 1] == '\n')
+ buffer[k - 1] = 0;
+ result = sal_True;
+ }
+ close (p[0]);
+ waitpid (pid, &nStatus, 0);
+ }
+ else
+ {
+ close (p[0]);
+ close (p[1]);
+ }
+ }
+#endif // 0
+
+ return (result);
+}
+
+static sal_Char* _osl_getFullQualifiedDomainName (const sal_Char *pHostName)
+{
+# define DOMAINNAME_LENGTH 512
+ sal_uInt32 nLengthOfHostName;
+ static sal_uInt32 nLengthOfDomainName = 0;
+ static sal_Char *pDomainName = NULL;
+
+ sal_Char *pFullQualifiedName;
+#if 0 /* OBSOLETE */
+ FILE *pPipeToDomainnameExe;
+#endif /* OBSOLETE */
+
+ /* get a '\0' terminated domainname */
+
+ /* read default domainname default from environment */
+ if (nLengthOfDomainName == 0)
+ {
+ sal_Char *pEnvDomain;
+
+ pEnvDomain = getenv ("STAR_OVERRIDE_DOMAINNAME");
+ if (pEnvDomain)
+ {
+ pDomainName = strdup (pEnvDomain);
+ nLengthOfDomainName = strlen (pDomainName);
+ }
+ }
+
+#if 1 /* NEW */
+ if (nLengthOfDomainName == 0)
+ {
+ sal_Char pDomainNameBuffer[ DOMAINNAME_LENGTH ];
+
+ pDomainNameBuffer[0] = '\0';
+
+ if (_osl_getDomainName (pDomainNameBuffer, DOMAINNAME_LENGTH))
+ {
+ pDomainName = strdup (pDomainNameBuffer);
+ nLengthOfDomainName = strlen (pDomainName);
+ }
+ }
+
+#endif /* NEW */
+#if 0 /* OBSOLETE */
+#ifdef SCO
+
+ /* call 'domainname > /usr/tmp/some-tmp-file', since
+ popen read pclose do block or core-dump,
+ (even the pipe-stuff that comes with pthreads) */
+ if (nLengthOfDomainName == 0)
+ {
+ sal_Char tmp_name[ L_tmpnam ];
+ FILE *tmp_file;
+ sal_Char domain_call [ L_tmpnam + 16 ] = "domainname > ";
+
+ tmp_name[0] = '\0';
+
+ tmpnam ( tmp_name );
+ strcat ( domain_call, tmp_name );
+ if ( (system ( domain_call ) == 0)
+ && ((tmp_file = fopen( tmp_name, "r" )) != NULL ) )
+ {
+ sal_Char pDomainNameBuffer[ DOMAINNAME_LENGTH ];
+
+ pDomainNameBuffer[0] = '\0';
+
+ if ( fgets ( pDomainNameBuffer, DOMAINNAME_LENGTH, tmp_file ) )
+ {
+ pDomainName = strdup( pDomainNameBuffer );
+ nLengthOfDomainName = strlen( pDomainName );
+ if ( ( nLengthOfDomainName > 0 )
+ && ( pDomainName[ nLengthOfDomainName - 1] == '\n' ) )
+ pDomainName[ --nLengthOfDomainName ] = '\0';
+ }
+ fclose ( tmp_file );
+ }
+ unlink( tmp_name );
+ }
+
+#else /* !SCO */
+
+ /* read the domainname from pipe to the program domainname */
+ if ( (nLengthOfDomainName == 0)
+ && (pPipeToDomainnameExe = popen( "domainname", "r")) )
+ {
+ sal_Char c;
+ sal_Char pDomainNameBuffer[ DOMAINNAME_LENGTH ];
+ sal_Char *pDomainNamePointer;
+
+ pDomainNameBuffer[0] = '\0';
+
+ pDomainNamePointer = pDomainNameBuffer;
+ while ( ((c = getc( pPipeToDomainnameExe )) != EOF)
+ && (nLengthOfDomainName < (DOMAINNAME_LENGTH - 1)) )
+ {
+ if (! isspace(c))
+ {
+ nLengthOfDomainName++ ;
+ *pDomainNamePointer++ = (sal_Char)c;
+ }
+ }
+ *pDomainNamePointer = '\0';
+ pDomainName = strdup( pDomainNameBuffer );
+
+ pclose( pPipeToDomainnameExe );
+ }
+
+#endif /* !SCO */
+#endif /* OBSOLETE */
+
+ /* compose hostname and domainname */
+ nLengthOfHostName = strlen( pHostName );
+ pFullQualifiedName = (sal_Char*) malloc( (nLengthOfHostName + 1
+ + nLengthOfDomainName + 1) * sizeof(sal_Char) );
+ memcpy( pFullQualifiedName, pHostName,
+ (nLengthOfHostName + 1) * sizeof(sal_Char) );
+
+ if ( nLengthOfDomainName > 0 )
+ {
+ /* fqdn = hostname + '.' + domainname + '\0' */
+ pFullQualifiedName[ nLengthOfHostName ] = '.';
+ memcpy( pFullQualifiedName + nLengthOfHostName + 1, pDomainName,
+ nLengthOfDomainName + 1 );
+ }
+
+ /* check whether full-qualified name and hostname point to the same host
+ * should almost always be true */
+ if ( nLengthOfDomainName > 0 )
+ {
+ struct hostent *pQualifiedHostByName;
+ struct hostent *pHostByName;
+ sal_Bool bHostsAreEqual;
+
+ /* buffer for calls to reentrant version of gethostbyname */
+ struct hostent aHostByName, aQualifiedHostByName;
+ sal_Char pHostBuffer[ MAX_HOSTBUFFER_SIZE ];
+ sal_Char pQualifiedHostBuffer[ MAX_HOSTBUFFER_SIZE ];
+ int nErrorNo;
+
+ pHostBuffer[0] = '\0';
+ pQualifiedHostBuffer[0] = '\0';
+
+ /* get list of addresses */
+ pQualifiedHostByName = _osl_gethostbyname_r (
+ pFullQualifiedName,
+ &aQualifiedHostByName, pQualifiedHostBuffer,
+ sizeof(pQualifiedHostBuffer), &nErrorNo );
+ pHostByName = _osl_gethostbyname_r (
+ pHostName,
+ &aHostByName, pHostBuffer,
+ sizeof(pHostBuffer), &nErrorNo );
+
+ /* compare addresses */
+ bHostsAreEqual = sal_False;
+ if ( pQualifiedHostByName && pHostByName )
+ {
+ sal_Char **p, **q;
+ struct in_addr in;
+
+ /* lists are expected to be (very) short */
+ for ( p = pQualifiedHostByName->h_addr_list; *p != NULL; p++ )
+ {
+ for ( q = pHostByName->h_addr_list; *q != NULL; q++ )
+ {
+ /* in.s_addr may be in_addr_t or uint32_t or heaven knows */
+ if ( memcmp( *p, *q, sizeof(in.s_addr) ) == 0 )
+ {
+ bHostsAreEqual = sal_True;
+ break;
+ }
+ }
+ if ( bHostsAreEqual )
+ break;
+ }
+ }
+
+ /* very strange case, but have to believe it: reduce the
+ * full qualified name to the unqualified host name */
+ if ( !bHostsAreEqual )
+ {
+ OSL_TRACE("_osl_getFullQualifiedDomainName: "
+ "suspect FQDN: %s\n", pFullQualifiedName);
+
+ pFullQualifiedName[ nLengthOfHostName ] = '\0';
+ pFullQualifiedName = (sal_Char*)realloc ( pFullQualifiedName,
+ (nLengthOfHostName + 1) * sizeof( sal_Char ));
+ }
+ }
+
+ /* always return a hostname looked up as carefully as possible
+ * this string must be freed by the caller */
+ return pFullQualifiedName;
+}
+
+/*****************************************************************************/
+/* _osl_isFullQualifiedDomainName */
+/*****************************************************************************/
+static sal_Bool _osl_isFullQualifiedDomainName (const sal_Char *pHostName)
+{
+ /* a FQDN (aka 'hostname.domain.top_level_domain' )
+ * is a name which contains a dot '.' in it ( would
+ * match as well for 'hostname.' but is good enough
+ * for now )*/
+ return (sal_Bool)( strchr( pHostName, (int)'.' ) != NULL );
+}
+
+/*****************************************************************************/
+/* oslHostAddr */
+/*****************************************************************************/
+struct oslHostAddrImpl
+{
+ sal_Char *pHostName;
+ oslSocketAddr pSockAddr;
+};
+
+static oslHostAddr _osl_hostentToHostAddr (const struct hostent *he)
+{
+ oslHostAddr pAddr= NULL;
+ oslSocketAddr pSockAddr = 0;
+
+
+ if ((he == NULL) || (he->h_name == NULL) || (he->h_addr_list[0] == NULL))
+ return ((oslHostAddr)NULL);
+
+ //YD 18/06/2006 win32 does this with unicode, see socket.cxx
+ sal_Char *cn;
+ cn= (sal_Char *)malloc(strlen (he->h_name) + 1);
+ OSL_ASSERT(cn);
+ if (cn == NULL)
+ return ((oslHostAddr)NULL);
+
+ strcpy(cn, he->h_name);
+
+#if 0 // YD 17/04/06 win32 doesn't it.
+ if (_osl_isFullQualifiedDomainName(he->h_name))
+ {
+ cn= (sal_Char *)malloc(strlen (he->h_name) + 1);
+ OSL_ASSERT(cn);
+ if (cn == NULL)
+ return ((oslHostAddr)NULL);
+
+ strcpy(cn, he->h_name);
+ }
+ else
+ {
+ cn =_osl_getFullQualifiedDomainName (he->h_name);
+ OSL_ASSERT(cn);
+ if (cn == NULL)
+ return ((oslHostAddr)NULL);
+ }
+#endif
+
+ pSockAddr = __osl_createSocketAddr();
+ OSL_ASSERT(pSockAddr);
+ if (pSockAddr == NULL)
+ {
+ free(cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pSockAddr->m_sockaddr.sa_family= he->h_addrtype;
+ if (pSockAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ struct sockaddr_in *sin= (struct sockaddr_in *)&(pSockAddr->m_sockaddr);
+ memcpy (
+ &(sin->sin_addr.s_addr),
+ he->h_addr_list[0],
+ he->h_length);
+ }
+ else
+ {
+ /* unknown address family */
+ /* future extensions for new families might be implemented here */
+
+ OSL_TRACE("_osl_hostentToHostAddr: unknown address family.\n");
+ OSL_ASSERT(sal_False);
+
+ __osl_destroySocketAddr( pSockAddr );
+ free (cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pAddr= (oslHostAddr) malloc(sizeof(struct oslHostAddrImpl));
+ OSL_ASSERT(pAddr);
+ if (pAddr == NULL)
+ {
+ __osl_destroySocketAddr( pSockAddr );
+ free (cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pAddr->pHostName= cn;
+ pAddr->pSockAddr= pSockAddr;
+
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_createHostAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddr (
+ rtl_uString *ustrHostname,
+ const oslSocketAddr Addr)
+{
+ oslHostAddr HostAddr;
+ rtl_String* strHostname=0;
+ sal_Char* pszHostName=0;
+
+ if ( ustrHostname != 0 )
+ {
+ rtl_uString2String( &strHostname,
+ rtl_uString_getStr(ustrHostname),
+ rtl_uString_getLength(ustrHostname),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszHostName = rtl_string_getStr(strHostname);
+ }
+
+ HostAddr = osl_psz_createHostAddr(pszHostName,Addr);
+
+ if ( strHostname != 0 )
+ {
+ rtl_string_release(strHostname);
+ }
+
+
+ return HostAddr;
+}
+
+oslHostAddr SAL_CALL osl_psz_createHostAddr (
+ const sal_Char *pszHostname,
+ const oslSocketAddr pAddr)
+{
+ oslHostAddr pHostAddr;
+ sal_Char *cn;
+
+ OSL_ASSERT(pszHostname && pAddr);
+ if ((pszHostname == NULL) || (pAddr == NULL))
+ return ((oslHostAddr)NULL);
+
+ cn = (sal_Char *)malloc(strlen (pszHostname) + 1);
+ OSL_ASSERT(cn);
+ if (cn == NULL)
+ return ((oslHostAddr)NULL);
+
+ strcpy (cn, pszHostname);
+
+ pHostAddr= (oslHostAddr) malloc(sizeof(struct oslHostAddrImpl));
+ OSL_ASSERT(pHostAddr);
+ if (pAddr == NULL)
+ {
+ free (cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pHostAddr->pHostName= cn;
+ pHostAddr->pSockAddr= osl_copySocketAddr( pAddr );
+
+ return pHostAddr;
+}
+
+/*****************************************************************************/
+/* osl_createHostAddrByName */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddrByName(rtl_uString *ustrHostname)
+{
+ oslHostAddr HostAddr;
+ rtl_String* strHostname=0;
+ sal_Char* pszHostName=0;
+
+ if ( ustrHostname != 0 )
+ {
+ rtl_uString2String( &strHostname,
+ rtl_uString_getStr(ustrHostname),
+ rtl_uString_getLength(ustrHostname),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszHostName=rtl_string_getStr(strHostname);
+ }
+
+ HostAddr = osl_psz_createHostAddrByName(pszHostName);
+
+ if ( strHostname != 0 )
+ {
+ rtl_string_release(strHostname);
+ }
+
+ return HostAddr;
+}
+
+oslHostAddr SAL_CALL osl_psz_createHostAddrByName (const sal_Char *pszHostname)
+{
+ struct hostent *he;
+ oslHostAddr addr;
+
+ static oslMutex mutex = NULL;
+
+ if (mutex == NULL)
+ mutex = osl_createMutex();
+
+ osl_acquireMutex(mutex);
+
+ he = gethostbyname((sal_Char *)pszHostname);
+ addr = _osl_hostentToHostAddr (he);
+
+ osl_releaseMutex(mutex);
+
+ return addr;
+}
+
+/*****************************************************************************/
+/* osl_createHostAddrByAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddrByAddr (const oslSocketAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr == NULL)
+ return ((oslHostAddr)NULL);
+
+ if (pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ const struct sockaddr_in *sin= (const struct sockaddr_in *)&(pAddr->m_sockaddr);
+ struct hostent *he;
+
+ if (sin->sin_addr.s_addr == htonl(INADDR_ANY))
+ return ((oslHostAddr)NULL);
+
+ he= gethostbyaddr((sal_Char *)&(sin->sin_addr),
+ sizeof (sin->sin_addr),
+ sin->sin_family);
+ return _osl_hostentToHostAddr (he);
+ }
+
+ return ((oslHostAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_copyHostAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_copyHostAddr (const oslHostAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr)
+ return osl_psz_createHostAddr (pAddr->pHostName, pAddr->pSockAddr);
+ else
+ return ((oslHostAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_getHostnameOfHostAddr */
+/*****************************************************************************/
+void SAL_CALL osl_getHostnameOfHostAddr (
+ const oslHostAddr Addr,
+ rtl_uString **ustrHostname)
+{
+ const sal_Char* pHostname=0;
+
+ pHostname = osl_psz_getHostnameOfHostAddr(Addr);
+
+ rtl_uString_newFromAscii (ustrHostname, pHostname);
+
+ return;
+}
+
+const sal_Char* SAL_CALL osl_psz_getHostnameOfHostAddr (const oslHostAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr)
+ return pAddr->pHostName;
+ else
+ return NULL;
+}
+
+/*****************************************************************************/
+/* osl_getSocketAddrOfHostAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getSocketAddrOfHostAddr (const oslHostAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr)
+ return ((oslSocketAddr)(pAddr->pSockAddr));
+ else
+ return NULL;
+}
+
+/*****************************************************************************/
+/* osl_destroyHostAddr */
+/*****************************************************************************/
+void SAL_CALL osl_destroyHostAddr (oslHostAddr pAddr)
+{
+ if (pAddr)
+ {
+ if (pAddr->pHostName)
+ free (pAddr->pHostName);
+ if (pAddr->pSockAddr)
+ osl_destroySocketAddr (pAddr->pSockAddr);
+ free (pAddr);
+ }
+}
+
+/*****************************************************************************/
+/* osl_getLocalHostname */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getLocalHostname(rtl_uString **ustrLocalHostname)
+{
+ oslSocketResult Result;
+ sal_Char pszHostname[1024];
+
+ pszHostname[0] = '\0';
+
+ Result = osl_psz_getLocalHostname(pszHostname,sizeof(pszHostname));
+
+ rtl_uString_newFromAscii(ustrLocalHostname,pszHostname);
+
+ return Result;
+}
+
+oslSocketResult SAL_CALL osl_psz_getLocalHostname (
+ sal_Char *pBuffer, sal_uInt32 nBufLen)
+{
+ static sal_Char LocalHostname[256] = "";
+
+ if (strlen(LocalHostname) == 0)
+ {
+ const sal_Char *pStr;
+
+#ifdef SYSV
+ struct utsname uts;
+
+ if (uname(&uts) < 0)
+ return osl_Socket_Error;
+
+ if ((strlen(uts.nodename) + 1) > nBufLen)
+ return osl_Socket_Error;
+
+ strncpy(LocalHostname, uts.nodename, sizeof( LocalHostname ));
+#else /* BSD compatible */
+
+ if (gethostname(LocalHostname, sizeof(LocalHostname)-1) != 0)
+ return osl_Socket_Error;
+ LocalHostname[sizeof(LocalHostname)-1] = 0;
+#endif /* SYSV */
+
+ /* check if we have an FQDN */
+ if (strchr(LocalHostname, '.') == NULL)
+ {
+ oslHostAddr Addr;
+
+ /* no, determine it via dns */
+ Addr = osl_psz_createHostAddrByName(LocalHostname);
+
+ if (Addr && (pStr = osl_psz_getHostnameOfHostAddr(Addr)) != NULL)
+ {
+#if 0 /* OBSOLETE */
+ sal_Char* pChr;
+#endif /* OBSOLETE */
+ strcpy(LocalHostname, pStr);
+
+#if 0 /* OBSOLETE */
+ /* already done by _osl_getFullQualifiedDomainName() with
+ much better heuristics, so this may be contraproductive */
+
+ /* no FQDN, last try append domain name */
+ if ((pChr = strchr(LocalHostname, '.')) == NULL)
+ {
+ FILE *fp;
+
+ pChr = &LocalHostname[strlen(LocalHostname)];
+
+ if ( (fp = popen("domainname", "r")) != 0 )
+ {
+ int c;
+
+ *pChr++ = '.';
+
+ while ((c = getc(fp)) != EOF)
+ {
+ if (! isspace(c))
+ *pChr++ = (sal_Char)c;
+ }
+
+ *pChr = '\0';
+
+ fclose(fp);
+ }
+ else
+ LocalHostname[0] = '\0';
+ }
+#endif /* OBSOLETE */
+
+ }
+ if (Addr)
+ osl_destroyHostAddr(Addr);
+ }
+ }
+
+ if (strlen(LocalHostname) > 0)
+ {
+ strncpy(pBuffer, LocalHostname, nBufLen);
+ pBuffer[nBufLen - 1] = '\0';
+
+ return osl_Socket_Ok;
+ }
+
+ return osl_Socket_Error;
+}
+
+/*****************************************************************************/
+/* osl_resolveHostname */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_resolveHostname(rtl_uString *ustrHostname)
+{
+ oslSocketAddr Addr;
+ rtl_String* strHostname=0;
+ sal_Char* pszHostName=0;
+
+ if ( ustrHostname != 0 )
+ {
+ rtl_uString2String( &strHostname,
+ rtl_uString_getStr(ustrHostname),
+ rtl_uString_getLength(ustrHostname),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszHostName = rtl_string_getStr(strHostname);
+ }
+
+
+ Addr = osl_psz_resolveHostname(pszHostName);
+
+ if ( strHostname != 0 )
+ {
+ rtl_string_release(strHostname);
+ }
+
+
+ return Addr;
+}
+
+
+oslSocketAddr SAL_CALL osl_psz_resolveHostname(const sal_Char* pszHostname)
+{
+ struct oslHostAddrImpl *pAddr = (oslHostAddr)osl_psz_createHostAddrByName(pszHostname);
+
+ if (pAddr)
+ {
+ oslSocketAddr SockAddr = osl_copySocketAddr(pAddr->pSockAddr);
+
+ osl_destroyHostAddr(pAddr);
+
+ return (SockAddr);
+ }
+
+ return ((oslSocketAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_getServicePort */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getServicePort(rtl_uString *ustrServicename, rtl_uString *ustrProtocol)
+{
+ sal_Int32 nPort;
+ rtl_String* strServicename=0;
+ rtl_String* strProtocol=0;
+ sal_Char* pszServiceName=0;
+ sal_Char* pszProtocol=0;
+
+ if ( ustrServicename != 0 )
+ {
+ rtl_uString2String( &strServicename,
+ rtl_uString_getStr(ustrServicename),
+ rtl_uString_getLength(ustrServicename),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszServiceName = rtl_string_getStr(strServicename);
+ }
+
+ if ( ustrProtocol != 0 )
+ {
+ rtl_uString2String( &strProtocol,
+ rtl_uString_getStr(ustrProtocol),
+ rtl_uString_getLength(ustrProtocol),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszProtocol = rtl_string_getStr(strProtocol);
+ }
+
+ nPort = osl_psz_getServicePort(pszServiceName,pszProtocol);
+
+ if ( strServicename != 0 )
+ {
+ rtl_string_release(strServicename);
+ }
+
+ if ( strProtocol != 0 )
+ {
+ rtl_string_release(strProtocol);
+ }
+
+
+ return nPort;
+}
+
+
+sal_Int32 SAL_CALL osl_psz_getServicePort(const sal_Char* pszServicename,
+ const sal_Char* pszProtocol)
+{
+ struct servent* ps;
+
+ ps= getservbyname(pszServicename, pszProtocol);
+
+ if (ps != 0)
+ return ntohs(ps->s_port);
+
+ return OSL_INVALID_PORT;
+}
+
+/*****************************************************************************/
+/* osl_destroySocketAddr */
+/*****************************************************************************/
+void SAL_CALL osl_destroySocketAddr(oslSocketAddr pAddr)
+{
+ __osl_destroySocketAddr( pAddr );
+}
+
+/*****************************************************************************/
+/* osl_getFamilyOfSocketAddr */
+/*****************************************************************************/
+oslAddrFamily SAL_CALL osl_getFamilyOfSocketAddr(oslSocketAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr)
+ return FAMILY_FROM_NATIVE(pAddr->m_sockaddr.sa_family);
+ else
+ return osl_Socket_FamilyInvalid;
+}
+
+/*****************************************************************************/
+/* osl_getInetPortOfSocketAddr */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getInetPortOfSocketAddr(oslSocketAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+ if( pAddr )
+ {
+ struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+
+ if ( pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ return ntohs(pSystemInetAddr->sin_port);
+ }
+ return OSL_INVALID_PORT;
+}
+
+/*****************************************************************************/
+/* osl_setInetPortOfSocketAddr */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setInetPortOfSocketAddr(oslSocketAddr pAddr, sal_Int32 Port)
+{
+ OSL_ASSERT(pAddr);
+ if( pAddr )
+ {
+ struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+ if ( pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ pSystemInetAddr->sin_port= htons((short)Port);
+ return sal_True;
+ }
+ }
+
+ /* this is not a inet-addr => can't set port */
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_getHostnameOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getHostnameOfSocketAddr(oslSocketAddr Addr, rtl_uString **ustrHostname)
+{
+ oslSocketResult Result;
+ sal_Char pszHostname[1024];
+
+ pszHostname[0] = '\0';
+
+ Result = osl_psz_getHostnameOfSocketAddr(Addr,pszHostname,sizeof(pszHostname));
+
+ rtl_uString_newFromAscii(ustrHostname,pszHostname);
+
+ return Result;
+}
+
+
+oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr(oslSocketAddr pAddr,
+ sal_Char *pBuffer, sal_uInt32 BufferSize)
+{
+ oslHostAddr pHostAddr= (oslHostAddr )osl_createHostAddrByAddr(pAddr);
+
+ if (pHostAddr)
+ {
+ strncpy(pBuffer, pHostAddr->pHostName, BufferSize);
+
+ pBuffer[BufferSize - 1] = '\0';
+
+ osl_destroyHostAddr(pHostAddr);
+
+ return osl_Socket_Ok;
+ }
+
+ return osl_Socket_Error;
+}
+
+/*****************************************************************************/
+/* osl_getDottedInetAddrOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getDottedInetAddrOfSocketAddr(oslSocketAddr Addr, rtl_uString **ustrDottedInetAddr)
+{
+ oslSocketResult Result;
+ sal_Char pszDottedInetAddr[1024];
+
+ pszDottedInetAddr[0] = '\0';
+
+ Result = osl_psz_getDottedInetAddrOfSocketAddr(Addr,pszDottedInetAddr,sizeof(pszDottedInetAddr));
+
+ rtl_uString_newFromAscii(ustrDottedInetAddr,pszDottedInetAddr);
+
+ return Result;
+
+}
+
+oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr(oslSocketAddr pAddr,
+ sal_Char *pBuffer, sal_uInt32 BufferSize)
+{
+ OSL_ASSERT(pAddr);
+
+ if( pAddr )
+ {
+ struct sockaddr_in* pSystemInetAddr = ( struct sockaddr_in * ) &(pAddr->m_sockaddr);
+
+ if (pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ strncpy(pBuffer, inet_ntoa(pSystemInetAddr->sin_addr), BufferSize);
+ pBuffer[BufferSize - 1] = '\0';
+
+ return osl_Socket_Ok;
+ }
+ }
+
+ return osl_Socket_Error;
+}
+
+#if 0 /* OBSOLETE */
+/*****************************************************************************/
+/* osl_getIpxNetNumber */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getIpxNetNumber(oslSocketAddr Addr,
+ oslSocketIpxNetNumber NetNumber)
+
+{
+ struct sockaddr_ipx* pAddr;
+
+ pAddr= (struct sockaddr_ipx*)Addr;
+
+ OSL_ASSERT(pAddr);
+
+ if (pAddr && (pAddr->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyIpx)))
+ {
+ memcpy(NetNumber, pAddr->sa_netnum, sizeof(NetNumber));
+
+ return osl_Socket_Ok;
+ }
+ else
+ return osl_Socket_Error;
+}
+
+
+/*****************************************************************************/
+/* osl_getIpxNodeNumber */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getIpxNodeNumber(oslSocketAddr Addr,
+ oslSocketIpxNodeNumber NodeNumber)
+
+{
+ struct sockaddr_ipx* pAddr;
+
+ pAddr= (struct sockaddr_ipx*)Addr;
+
+ OSL_ASSERT(pAddr);
+
+ if (pAddr && (pAddr->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyIpx)))
+ {
+ memcpy(NodeNumber, pAddr->sa_nodenum, sizeof(NodeNumber));
+
+ return osl_Socket_Ok;
+ }
+ else
+ return osl_Socket_Error;
+}
+
+
+/*****************************************************************************/
+/* osl_getIpxSocketNumber */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getIpxSocketNumber(oslSocketAddr Addr)
+{
+ struct sockaddr_ipx* pAddr= (struct sockaddr_ipx*)Addr;
+ OSL_ASSERT(pAddr);
+
+ if (pAddr && (pAddr->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyIpx)))
+ return pAddr->sa_socket;
+ else
+ return OSL_INVALID_IPX_SOCKET_NO;
+}
+
+#endif /* OBSOLETE */
+
+/*****************************************************************************/
+/* osl_createSocket */
+/*****************************************************************************/
+oslSocket SAL_CALL osl_createSocket(oslAddrFamily Family,
+ oslSocketType Type,
+ oslProtocol Protocol)
+{
+ int Flags;
+ oslSocket pSocket;
+
+ /* alloc memory */
+ pSocket= __osl_createSocketImpl(OSL_INVALID_SOCKET);
+
+ /* create socket */
+ pSocket->m_Socket= socket(FAMILY_TO_NATIVE(Family),
+ TYPE_TO_NATIVE(Type),
+ PROTOCOL_TO_NATIVE(Protocol));
+
+ /* creation failed => free memory */
+ if(pSocket->m_Socket == OSL_INVALID_SOCKET)
+ {
+ OSL_TRACE("osl_createSocket failed. Errno: %d; %s\n",
+ errno,
+ strerror(errno));
+
+ __osl_destroySocketImpl((pSocket));
+ pSocket= 0;
+ }
+ else
+ {
+ /* set close-on-exec flag */
+ if ((Flags = fcntl(pSocket->m_Socket, F_GETFD, 0)) != -1)
+ {
+ Flags |= FD_CLOEXEC;
+ if (fcntl(pSocket->m_Socket, F_SETFD, Flags) == -1)
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_createSocket failed changing socket flags. Errno: %d; %s\n",
+ errno,
+ strerror(errno));
+ }
+ }
+ else
+ {
+ pSocket->m_nLastError=errno;
+ }
+
+
+ pSocket->m_CloseCallback = NULL;
+ pSocket->m_CallbackArg = NULL;
+ }
+
+ return pSocket;
+}
+
+void SAL_CALL osl_acquireSocket(oslSocket pSocket)
+{
+ osl_incrementInterlockedCount( &(pSocket->m_nRefCount ) );
+}
+
+void SAL_CALL osl_releaseSocket( oslSocket pSocket )
+{
+ if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) )
+ {
+#if defined(LINUX)
+ if ( pSocket->m_bIsAccepting == sal_True )
+ {
+ OSL_ENSURE(0, "osl_destroySocket : attempt to destroy socket while accepting\n");
+ return;
+ }
+#endif /* LINUX */
+ osl_closeSocket( pSocket );
+ __osl_destroySocketImpl( pSocket );
+ }
+}
+
+
+
+/*****************************************************************************/
+/* osl_closeSocket */
+/*****************************************************************************/
+void SAL_CALL osl_closeSocket(oslSocket pSocket)
+{
+ int nRet;
+ int nFD;
+
+ /* socket already invalid */
+ if(pSocket==0)
+ return;
+
+ pSocket->m_nLastError=0;
+ nFD = pSocket->m_Socket;
+
+ pSocket->m_Socket = OSL_INVALID_SOCKET;
+
+#if defined(LINUX)
+ pSocket->m_bIsInShutdown = sal_True;
+
+ if ( pSocket->m_bIsAccepting == sal_True )
+ {
+ int nConnFD;
+ struct sockaddr aSockAddr;
+ socklen_t nSockLen = sizeof(aSockAddr);
+
+ nRet = getsockname(nFD, &aSockAddr, &nSockLen);
+#if OSL_DEBUG_LEVEL > 1
+ if ( nRet < 0 )
+ {
+ perror("getsockname");
+ }
+#endif /* OSL_DEBUG_LEVEL */
+
+ if ( aSockAddr.sa_family == AF_INET )
+ {
+ struct sockaddr_in* pSockAddrIn = (struct sockaddr_in*) &aSockAddr;
+
+ if ( pSockAddrIn->sin_addr.s_addr == htonl(INADDR_ANY) )
+ {
+ pSockAddrIn->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ }
+
+ nConnFD = socket(AF_INET, SOCK_STREAM, 0);
+#if OSL_DEBUG_LEVEL > 1
+ if ( nConnFD < 0 )
+ {
+ perror("socket");
+ }
+#endif /* OSL_DEBUG_LEVEL */
+
+ nRet = connect(nConnFD, &aSockAddr, sizeof(aSockAddr));
+#if OSL_DEBUG_LEVEL > 1
+ if ( nRet < 0 )
+ {
+ perror("connect");
+ }
+#endif /* OSL_DEBUG_LEVEL */
+ close(nConnFD);
+ }
+ }
+#endif /* LINUX */
+
+ /* registrierten Callback ausfuehren */
+ if (pSocket->m_CloseCallback != NULL)
+ {
+ pSocket->m_CloseCallback(pSocket->m_CallbackArg);
+ }
+
+ nRet=close(nFD);
+ if ( nRet != 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("closeSocket close error '%s'\n",strerror(errno));
+ }
+
+ pSocket->m_Socket = OSL_INVALID_SOCKET;
+}
+
+/*****************************************************************************/
+/* osl_getLocalAddrOfSocket */
+/* Note that I rely on the fact that oslSocketAddr and struct sockaddr */
+/* are the same! I don't like it very much but see no other easy way to conceal */
+/* the struct sockaddr from the eyes of the user. */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getLocalAddrOfSocket(oslSocket pSocket)
+{
+#if defined(LINUX) || defined(FREEBSD)
+ socklen_t AddrLen;
+#else
+ /* mfe: Solaris 'cc +w' means Addrlen should be signed! */
+ /* it's really defined as 'int*' in /usr/include/sys/socket.h! */
+ /* the man page says it expects a 'size_t' */
+ int AddrLen;
+#endif
+ struct sockaddr Addr;
+ oslSocketAddr pAddr;
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return ((oslSocketAddr)NULL);
+
+ AddrLen= sizeof(struct sockaddr);
+
+ if (getsockname(pSocket->m_Socket, &Addr, PTR_SIZE_T(AddrLen)) == OSL_SOCKET_ERROR)
+ return ((oslSocketAddr)NULL);
+
+ pAddr = __osl_createSocketAddrFromSystem( &Addr );
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_getPeerAddrOfSocket */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getPeerAddrOfSocket(oslSocket pSocket)
+{
+ sal_uInt32 AddrLen;
+ struct sockaddr Addr;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return 0;
+ }
+
+ pSocket->m_nLastError=0;
+ AddrLen= sizeof(struct sockaddr);
+
+ if(getpeername(pSocket->m_Socket, &Addr, (int*)PTR_SIZE_T(AddrLen)) == OSL_SOCKET_ERROR)
+ {
+ pSocket->m_nLastError=errno;
+ return 0;
+ }
+ return __osl_createSocketAddrFromSystem( &Addr );
+}
+
+/*****************************************************************************/
+/* osl_bindAddrToSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_bindAddrToSocket(oslSocket pSocket,
+ oslSocketAddr pAddr)
+{
+ int nRet;
+
+ OSL_ASSERT(pSocket && pAddr );
+ if ( pSocket == 0 || pAddr == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRet = bind(pSocket->m_Socket, &(pAddr->m_sockaddr), sizeof(struct sockaddr));
+
+ if ( nRet == OSL_SOCKET_ERROR)
+ {
+ pSocket->m_nLastError=errno;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+
+/*****************************************************************************/
+/* osl_listenOnSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_listenOnSocket(oslSocket pSocket,
+ sal_Int32 MaxPendingConnections)
+{
+ int nRet;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRet = listen(pSocket->m_Socket,
+ MaxPendingConnections == -1 ?
+ SOMAXCONN :
+ MaxPendingConnections);
+ if ( nRet == OSL_SOCKET_ERROR)
+ {
+ pSocket->m_nLastError=errno;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+
+/*****************************************************************************/
+/* osl_connectSocketTo */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket pSocket,
+ oslSocketAddr pAddr,
+ const TimeValue* pTimeout)
+{
+ fd_set WriteSet;
+ fd_set ExcptSet;
+ int ReadyHandles;
+ struct timeval tv;
+ oslSocketResult Result= osl_Socket_Ok;
+
+ OSL_PRECOND(pSocket, "osl_connectSocketTo(): need a valid socket!\n");
+
+ if ( pSocket == 0 )
+ {
+ return osl_Socket_Error;
+ }
+
+ pSocket->m_nLastError=0;
+
+ if (osl_isNonBlockingMode(pSocket))
+ {
+ if (connect(pSocket->m_Socket,
+ &(pAddr->m_sockaddr),
+ sizeof(struct sockaddr)) != OSL_SOCKET_ERROR)
+ return osl_Socket_Ok;
+ else
+ if (errno == EWOULDBLOCK || errno == EINPROGRESS)
+ {
+ pSocket->m_nLastError=EINPROGRESS;
+ return osl_Socket_InProgress;
+ }
+
+
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("can't connect : '%s'",strerror(errno));
+ return osl_Socket_Error;
+ }
+
+ /* set socket temporarily to non-blocking */
+ OSL_VERIFY(osl_enableNonBlockingMode(pSocket, sal_True));
+
+ /* initiate connect */
+ if(connect(pSocket->m_Socket,
+ &(pAddr->m_sockaddr),
+ sizeof(struct sockaddr)) != OSL_SOCKET_ERROR)
+ {
+ /* immediate connection */
+ osl_enableNonBlockingMode(pSocket, sal_False);
+
+ return osl_Socket_Ok;
+ }
+ else
+ {
+ /* really an error or just delayed? */
+ if (errno != EINPROGRESS)
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE(
+ "osl_connectSocketTo(): connect failed: errno: %d (%s)\n",
+ errno, strerror(errno));
+
+ osl_enableNonBlockingMode(pSocket, sal_False);
+ return osl_Socket_Error;
+ }
+ }
+
+
+ /* prepare select set for socket */
+ FD_ZERO(&WriteSet);
+ FD_ZERO(&ExcptSet);
+ FD_SET(pSocket->m_Socket, &WriteSet);
+ FD_SET(pSocket->m_Socket, &ExcptSet);
+
+ /* prepare timeout */
+ if (pTimeout)
+ {
+ /* divide milliseconds into seconds and microseconds */
+ tv.tv_sec= pTimeout->Seconds;
+ tv.tv_usec= pTimeout->Nanosec / 1000L;
+ }
+
+ /* select */
+ ReadyHandles= select(pSocket->m_Socket+1,
+ 0,
+ PTR_FD_SET(WriteSet),
+ PTR_FD_SET(ExcptSet),
+ (pTimeout) ? &tv : 0);
+
+ if (ReadyHandles > 0) /* connected */
+ {
+ if ( FD_ISSET(pSocket->m_Socket, &WriteSet ) )
+ {
+ int nErrorCode = 0;
+#ifdef SOLARIS
+/* mfe: Solaris 'cc +w' means 5th argument should be a 'int*'!
+ it's really defined as 'int*' in /usr/include/sys/socket.h!
+ the man page says it expects a 'size_t*'
+*/
+ int nErrorSize = sizeof( nErrorCode );
+#else
+ size_t nErrorSize = sizeof( nErrorCode );
+#endif
+
+ int nSockOpt;
+
+ nSockOpt = getsockopt ( pSocket->m_Socket, SOL_SOCKET, SO_ERROR,
+#ifdef SOLARIS
+/* mfe: Solaris 'cc +w' means 4th argument should be a 'char*'!
+ it's really defined as 'char*' in /usr/include/sys/socket.h!
+ the man page says it expects a 'void*'
+*/
+ (char*)
+#endif
+ &nErrorCode, (int*)&nErrorSize );
+ if ( (nSockOpt == 0) && (nErrorCode == 0))
+ Result = osl_Socket_Ok;
+ else
+ Result = osl_Socket_Error;
+ }
+ else
+ {
+ Result= osl_Socket_Error;
+ }
+ }
+ else if (ReadyHandles < 0) /* error */
+ {
+ if (errno == EBADF) /* most probably interrupted by close() */
+ {
+ /* do not access pSockImpl because it is about to be or */
+ /* already destroyed */
+ return osl_Socket_Interrupted;
+ }
+ else
+ {
+ pSocket->m_nLastError=errno;
+ Result= osl_Socket_Error;
+ }
+ }
+ else /* timeout */
+ {
+ pSocket->m_nLastError=errno;
+ Result= osl_Socket_TimedOut;
+ }
+
+ osl_enableNonBlockingMode(pSocket, sal_False);
+
+ return Result;
+}
+
+
+/*****************************************************************************/
+/* osl_acceptConnectionOnSocket */
+/*****************************************************************************/
+oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
+ oslSocketAddr* ppAddr)
+{
+ struct sockaddr Addr;
+ int Connection, Flags;
+ sal_uInt32 AddrLen = sizeof(struct sockaddr);
+ oslSocket pConnectionSockImpl;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return 0;
+ }
+
+ pSocket->m_nLastError=0;
+#if defined(LINUX)
+ pSocket->m_bIsAccepting = sal_True;
+#endif /* LINUX */
+
+ if( ppAddr && *ppAddr )
+ {
+ osl_destroySocketAddr( *ppAddr );
+ *ppAddr = 0;
+ }
+
+ /* prevent Linux EINTR behaviour */
+ do
+ {
+ Connection = accept(pSocket->m_Socket, &Addr, (int*)PTR_SIZE_T(AddrLen));
+ } while (Connection == -1 && errno == EINTR);
+
+
+ /* accept failed? */
+ if( Connection == OSL_SOCKET_ERROR )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_acceptConnectionOnSocket : accept error '%s'\n",strerror(errno));
+
+#if defined(LINUX)
+ pSocket->m_bIsAccepting = sal_False;
+#endif /* LINUX */
+ return 0;
+ }
+
+ OSL_ASSERT(AddrLen == sizeof(struct sockaddr));
+
+
+#if defined(LINUX)
+ if ( pSocket->m_bIsInShutdown == sal_True )
+ {
+ close(Connection);
+ OSL_TRACE("osl_acceptConnectionOnSocket : close while accept\n");
+ return 0;
+ }
+#endif /* LINUX */
+
+
+ if(ppAddr)
+ {
+ *ppAddr= __osl_createSocketAddrFromSystem(&Addr);
+ }
+
+ /* alloc memory */
+ pConnectionSockImpl= __osl_createSocketImpl(OSL_INVALID_SOCKET);
+
+ /* set close-on-exec flag */
+ if ((Flags = fcntl(Connection, F_GETFD, 0)) != -1)
+ {
+ Flags |= FD_CLOEXEC;
+ if (fcntl(Connection, F_SETFD, Flags) == -1)
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_acceptConnectionOnSocket failed changing socket flags. Errno: %d (%s)\n",
+ errno,
+ strerror(errno));
+ }
+
+ }
+
+ pConnectionSockImpl->m_Socket = Connection;
+ pConnectionSockImpl->m_nLastError = 0;
+ pConnectionSockImpl->m_CloseCallback = NULL;
+ pConnectionSockImpl->m_CallbackArg = NULL;
+#if defined(LINUX)
+ pConnectionSockImpl->m_bIsAccepting = sal_False;
+
+ pSocket->m_bIsAccepting = sal_False;
+#endif /* LINUX */
+ return pConnectionSockImpl;
+}
+
+/*****************************************************************************/
+/* osl_receiveSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receiveSocket(oslSocket pSocket,
+ void* pBuffer,
+ sal_uInt32 BytesToRead,
+ oslSocketMsgFlag Flag)
+{
+ int nRead;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ OSL_TRACE("osl_receiveSocket : Invalid socket");
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ do
+ {
+ nRead = recv(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToRead,
+ MSG_FLAG_TO_NATIVE(Flag));
+ } while ( nRead < 0 && errno == EINTR );
+
+ if ( nRead < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,strerror(errno));
+ }
+ else if ( nRead == 0 )
+ {
+ OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,"EOL");
+ }
+
+ return nRead;
+}
+
+
+/*****************************************************************************/
+/* osl_receiveFromSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receiveFromSocket(oslSocket pSocket,
+ oslSocketAddr pSenderAddr,
+ void* pBuffer,
+ sal_uInt32 BufferSize,
+ oslSocketMsgFlag Flag)
+{
+ int nRead;
+ struct sockaddr *pSystemSockAddr = 0;
+ int AddrLen = 0;
+ if( pSenderAddr )
+ {
+ AddrLen = sizeof( struct sockaddr );
+ pSystemSockAddr = &(pSenderAddr->m_sockaddr);
+ }
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ OSL_TRACE("osl_receiveFromSocket : Invalid socket");
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRead = recvfrom(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BufferSize,
+ MSG_FLAG_TO_NATIVE(Flag),
+ pSystemSockAddr,
+ PTR_SIZE_T(AddrLen));
+
+ if ( nRead < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_receiveFromSocket failed : %i '%s'",nRead,strerror(errno));
+ }
+ else if ( nRead == 0 )
+ {
+ OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,"EOL");
+ }
+
+ return nRead;
+}
+
+
+/*****************************************************************************/
+/* osl_sendSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendSocket(oslSocket pSocket,
+ const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag)
+{
+ int nWritten;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ OSL_TRACE("osl_sendSocket : Invalid socket");
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ do
+ {
+ nWritten = send(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToSend,
+ MSG_FLAG_TO_NATIVE(Flag));
+ } while ( nWritten < 0 && errno == EINTR );
+
+
+ if ( nWritten < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,strerror(errno));
+ }
+ else if ( nWritten == 0 )
+ {
+ OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,"EOL");
+ }
+
+ return nWritten;
+}
+
+/*****************************************************************************/
+/* osl_sendToSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendToSocket(oslSocket pSocket,
+ oslSocketAddr ReceiverAddr,
+ const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag)
+{
+ int nWritten;
+
+ struct sockaddr *pSystemSockAddr = 0;
+ int AddrLen = 0;
+ if( ReceiverAddr )
+ {
+ pSystemSockAddr = &(ReceiverAddr->m_sockaddr);
+ AddrLen = sizeof( struct sockaddr );
+ }
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ OSL_TRACE("osl_sendToSocket : Invalid socket");
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ /* ReceiverAddr might be 0 when used on a connected socket. */
+ /* Then sendto should behave like send. */
+
+ nWritten = sendto(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToSend,
+ MSG_FLAG_TO_NATIVE(Flag),
+ pSystemSockAddr,
+ AddrLen);
+
+ if ( nWritten < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,strerror(errno));
+ }
+ else if ( nWritten == 0 )
+ {
+ OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,"EOL");
+ }
+
+ return nWritten;
+}
+
+/*****************************************************************************/
+/* osl_readSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_readSocket (
+ oslSocket pSocket, void *pBuffer, sal_Int32 n )
+{
+ sal_uInt8 * Ptr = (sal_uInt8 *)pBuffer;
+ sal_uInt32 BytesRead= 0;
+ sal_uInt32 BytesToRead= n;
+
+ OSL_ASSERT( pSocket);
+
+ /* loop until all desired bytes were read or an error occured */
+ while (BytesToRead > 0)
+ {
+ sal_Int32 RetVal;
+ RetVal= osl_receiveSocket(pSocket,
+ Ptr,
+ BytesToRead,
+ osl_Socket_MsgNormal);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToRead -= RetVal;
+ BytesRead += RetVal;
+ Ptr += RetVal;
+ }
+
+ return BytesRead;
+}
+
+/*****************************************************************************/
+/* osl_writeSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_writeSocket(
+ oslSocket pSocket, const void *pBuffer, sal_Int32 n )
+{
+ /* loop until all desired bytes were send or an error occured */
+ sal_uInt32 BytesSend= 0;
+ sal_uInt32 BytesToSend= n;
+ sal_uInt8 *Ptr = ( sal_uInt8 * )pBuffer;
+
+ OSL_ASSERT( pSocket );
+
+ while (BytesToSend > 0)
+ {
+ sal_Int32 RetVal;
+
+ RetVal= osl_sendSocket( pSocket,Ptr,BytesToSend,osl_Socket_MsgNormal);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToSend -= RetVal;
+ BytesSend += RetVal;
+ Ptr += RetVal;
+
+ }
+ return BytesSend;
+}
+
+/*****************************************************************************/
+/* __osl_socket_poll */
+/*****************************************************************************/
+
+#ifdef HAVE_POLL_H /* poll() */
+
+sal_Bool __osl_socket_poll (
+ oslSocket pSocket,
+ const TimeValue* pTimeout,
+ short nEvent)
+{
+ struct pollfd fds;
+ int timeout;
+ int result;
+
+ OSL_ASSERT(pSocket);
+ pSocket->m_nLastError = 0;
+
+ fds.fd = pSocket->m_Socket;
+ fds.events = nEvent;
+ fds.revents = 0;
+
+ timeout = -1;
+ if (pTimeout)
+ {
+ /* Convert to [ms] */
+ timeout = pTimeout->Seconds * 1000;
+ timeout += pTimeout->Nanosec / (1000 * 1000);
+ }
+
+ result = poll (&fds, 1, timeout);
+ if (result < 0)
+ {
+ pSocket->m_nLastError = errno;
+ OSL_TRACE("__osl_socket_poll(): poll error: %d (%s)",
+ errno, strerror(errno));
+ return sal_False;
+ }
+ if (result == 0)
+ {
+ /* Timeout */
+ return sal_False;
+ }
+
+ return ((fds.revents & nEvent) == nEvent);
+}
+
+#else /* select() */
+
+sal_Bool __osl_socket_poll (
+ oslSocket pSocket,
+ const TimeValue* pTimeout,
+ short nEvent)
+{
+ fd_set fds;
+ struct timeval tv;
+ int result;
+
+ OSL_ASSERT(pSocket);
+ pSocket->m_nLastError = 0;
+
+ FD_ZERO(&fds);
+ FD_SET(pSocket->m_Socket, &fds);
+
+ if (pTimeout)
+ {
+ /* Convert to 'timeval' */
+ tv.tv_sec = pTimeout->Seconds;
+ tv.tv_usec = pTimeout->Nanosec / 1000;
+ }
+
+ result = select (
+ pSocket->m_Socket + 1,
+ (nEvent == POLLIN ) ? PTR_FD_SET(fds) : NULL,
+ (nEvent == POLLOUT) ? PTR_FD_SET(fds) : NULL,
+ (nEvent == POLLPRI) ? PTR_FD_SET(fds) : NULL,
+ (pTimeout) ? &tv : NULL);
+
+ if (result < 0)
+ {
+ pSocket->m_nLastError = errno;
+ OSL_TRACE("__osl_socket_poll(): select error: %d (%s)",
+ errno, strerror(errno));
+ return sal_False;
+ }
+ if (result == 0)
+ {
+ /* Timeout */
+ return sal_False;
+ }
+
+ return (FD_ISSET(pSocket->m_Socket, &fds) ? sal_True : sal_False);
+}
+
+#endif /* HAVE_POLL_H */
+
+/*****************************************************************************/
+/* osl_isReceiveReady */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isReceiveReady (
+ oslSocket pSocket, const TimeValue* pTimeout)
+{
+ OSL_ASSERT(pSocket);
+ if (pSocket == NULL)
+ {
+ /* ENOTSOCK */
+ return sal_False;
+ }
+
+ return __osl_socket_poll (pSocket, pTimeout, POLLIN);
+}
+
+/*****************************************************************************/
+/* osl_isSendReady */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isSendReady (
+ oslSocket pSocket, const TimeValue* pTimeout)
+{
+ OSL_ASSERT(pSocket);
+ if (pSocket == NULL)
+ {
+ /* ENOTSOCK */
+ return sal_False;
+ }
+
+ return __osl_socket_poll (pSocket, pTimeout, POLLOUT);
+}
+
+/*****************************************************************************/
+/* osl_isExceptionPending */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isExceptionPending (
+ oslSocket pSocket, const TimeValue* pTimeout)
+{
+ OSL_ASSERT(pSocket);
+ if (pSocket == NULL)
+ {
+ /* ENOTSOCK */
+ return sal_False;
+ }
+
+ return __osl_socket_poll (pSocket, pTimeout, POLLPRI);
+}
+
+/*****************************************************************************/
+/* osl_shutdownSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_shutdownSocket(oslSocket pSocket,
+ oslSocketDirection Direction)
+{
+ int nRet;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRet=shutdown(pSocket->m_Socket, DIRECTION_TO_NATIVE(Direction));
+ if (nRet != 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("shutdown error '%s'\n",strerror(errno));
+ }
+ return (nRet==0);
+}
+
+
+/*****************************************************************************/
+/* osl_getSocketOption */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getSocketOption(oslSocket pSocket,
+ oslSocketOptionLevel Level,
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen)
+{
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ if(getsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(Level),
+ OPTION_TO_NATIVE(Option),
+ (sal_Char*)pBuffer,
+ (int*)PTR_SIZE_T(BufferLen)) == -1)
+ {
+ pSocket->m_nLastError=errno;
+ return -1;
+ }
+
+ return BufferLen;
+}
+
+/*****************************************************************************/
+/* osl_setSocketOption */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setSocketOption(oslSocket pSocket,
+ oslSocketOptionLevel Level,
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen)
+{
+ int nRet;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRet = setsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(Level),
+ OPTION_TO_NATIVE(Option),
+ (sal_Char*)pBuffer,
+ BufferLen);
+
+ if ( nRet < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_enableNonBlockingMode */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_enableNonBlockingMode(oslSocket pSocket,
+ sal_Bool On)
+{
+ int flags;
+ int nRet;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ flags = fcntl(pSocket->m_Socket, F_GETFL, 0);
+
+ if (On)
+ flags |= O_NONBLOCK;
+ else
+ flags &= ~(O_NONBLOCK);
+
+ nRet = fcntl(pSocket->m_Socket, F_SETFL, flags);
+
+ if ( nRet < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_isNonBlockingMode */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isNonBlockingMode(oslSocket pSocket)
+{
+ int flags;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ flags = fcntl(pSocket->m_Socket, F_GETFL, 0);
+
+ if (flags == -1 || !(flags & O_NONBLOCK))
+ return sal_False;
+ else
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_getSocketType */
+/*****************************************************************************/
+oslSocketType SAL_CALL osl_getSocketType(oslSocket pSocket)
+{
+ int Type=0;
+ sal_uInt32 TypeSize= sizeof(Type);
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return osl_Socket_TypeInvalid;
+ }
+
+ pSocket->m_nLastError=0;
+
+ if(getsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(osl_Socket_LevelSocket),
+ OPTION_TO_NATIVE(osl_Socket_OptionType),
+ (sal_Char*)&Type,
+ (int*)PTR_SIZE_T(TypeSize)) == -1)
+ {
+ /* error */
+ pSocket->m_nLastError=errno;
+ return osl_Socket_TypeInvalid;
+ }
+
+ return TYPE_FROM_NATIVE(Type);
+
+}
+
+/*****************************************************************************/
+/* osl_getLastSocketErrorDescription */
+/*****************************************************************************/
+void SAL_CALL osl_getLastSocketErrorDescription(oslSocket Socket, rtl_uString **ustrError)
+{
+ sal_Char pszError[1024];
+
+ pszError[0] = '\0';
+
+ osl_psz_getLastSocketErrorDescription(Socket,pszError,sizeof(pszError));
+
+ rtl_uString_newFromAscii(ustrError,pszError);
+
+ return;
+}
+
+
+void SAL_CALL osl_psz_getLastSocketErrorDescription(oslSocket pSocket, sal_Char* pBuffer, sal_uInt32 BufferSize)
+{
+ /* make shure pBuffer will be a zero-terminated string even when strncpy has to cut */
+ pBuffer[BufferSize-1]= '\0';
+
+ if ( pSocket == 0 )
+ {
+ strncpy(pBuffer, strerror(EINVAL), BufferSize-1);
+ return;
+ }
+
+ strncpy(pBuffer, strerror(pSocket->m_nLastError), BufferSize-1);
+ return;
+}
+
+/*****************************************************************************/
+/* osl_getLastSocketError */
+/*****************************************************************************/
+oslSocketError SAL_CALL osl_getLastSocketError(oslSocket pSocket)
+{
+ if ( pSocket == 0 )
+ {
+ return ERROR_FROM_NATIVE(EINVAL);
+ }
+
+ return ERROR_FROM_NATIVE(pSocket->m_nLastError);
+}
+
+/*****************************************************************************/
+/* SocketSet */
+/*****************************************************************************/
+typedef struct _TSocketSetImpl
+{
+ int m_MaxHandle; /* for select(), the largest descriptor in the set */
+ fd_set m_Set; /* the set of descriptors */
+
+} TSocketSetImpl;
+
+/*****************************************************************************/
+/* osl_createSocketSet */
+/*****************************************************************************/
+oslSocketSet SAL_CALL osl_createSocketSet()
+{
+ TSocketSetImpl* pSet;
+
+ pSet= (TSocketSetImpl*)malloc(sizeof(TSocketSetImpl));
+
+ OSL_ASSERT(pSet);
+
+ if(pSet)
+ {
+ pSet->m_MaxHandle= 0;
+ FD_ZERO(&pSet->m_Set);
+ }
+
+ return (oslSocketSet)pSet;
+}
+
+/*****************************************************************************/
+/* osl_destroySocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_destroySocketSet(oslSocketSet Set)
+{
+ if(Set)
+ free(Set);
+}
+
+/*****************************************************************************/
+/* osl_clearSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_clearSocketSet(oslSocketSet Set)
+{
+ TSocketSetImpl* pSet;
+ OSL_ASSERT(Set);
+ if ( Set == 0 )
+ {
+ return;
+ }
+
+ pSet= (TSocketSetImpl*)Set;
+ pSet->m_MaxHandle= 0;
+
+ FD_ZERO(&pSet->m_Set);
+}
+
+/*****************************************************************************/
+/* osl_addToSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_addToSocketSet(oslSocketSet Set, oslSocket pSocket)
+{
+ TSocketSetImpl* pSet;
+
+ OSL_ASSERT(Set);
+ OSL_ASSERT(pSocket);
+
+ if ( Set == 0 || pSocket == 0)
+ {
+ return;
+ }
+
+ pSet= (TSocketSetImpl*)Set;
+
+ /* correct max handle */
+ if(pSocket->m_Socket > pSet->m_MaxHandle)
+ pSet->m_MaxHandle= pSocket->m_Socket;
+ FD_SET(pSocket->m_Socket, &pSet->m_Set);
+
+}
+
+/*****************************************************************************/
+/* osl_removeFromSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_removeFromSocketSet(oslSocketSet Set, oslSocket pSocket)
+{
+ TSocketSetImpl* pSet;
+
+ OSL_ASSERT(Set);
+ OSL_ASSERT(pSocket);
+
+ if ( Set == 0 || pSocket == 0)
+ {
+ return;
+ }
+
+ pSet= (TSocketSetImpl*)Set;
+
+ /* correct max handle */
+ if(pSocket->m_Socket == pSet->m_MaxHandle)
+ {
+ /* not optimal, since the next used descriptor might be */
+ /* much smaller than m_Socket-1, but it will do */
+ pSet->m_MaxHandle--;
+ if(pSet->m_MaxHandle < 0)
+ {
+ pSet->m_MaxHandle= 0; /* avoid underflow */
+ }
+ }
+
+ FD_CLR(pSocket->m_Socket, &pSet->m_Set);
+}
+
+/*****************************************************************************/
+/* osl_isInSocketSet */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isInSocketSet(oslSocketSet Set, oslSocket pSocket)
+{
+ TSocketSetImpl* pSet;
+
+ OSL_ASSERT(Set);
+ OSL_ASSERT(pSocket);
+ if ( Set == 0 || pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSet= (TSocketSetImpl*)Set;
+
+ return (FD_ISSET(pSocket->m_Socket, &pSet->m_Set) != 0);
+}
+
+/*****************************************************************************/
+/* osl_demultiplexSocketEvents */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_demultiplexSocketEvents(oslSocketSet IncomingSet,
+ oslSocketSet OutgoingSet,
+ oslSocketSet OutOfBandSet,
+ const TimeValue* pTimeout)
+{
+ int MaxHandle= 0;
+ struct timeval tv;
+ TSocketSetImpl* pInSet;
+ TSocketSetImpl* pOutSet;
+ TSocketSetImpl* pOOBSet;
+
+ if (pTimeout)
+ {
+ /* non-blocking call */
+ tv.tv_sec = pTimeout->Seconds;
+ tv.tv_usec = pTimeout->Nanosec / 1000L;
+ }
+
+ /* map opaque data to impl-types */
+ pInSet= (TSocketSetImpl*)IncomingSet;
+ pOutSet= (TSocketSetImpl*)OutgoingSet;
+ pOOBSet= (TSocketSetImpl*)OutOfBandSet;
+
+ /* get max handle from all sets */
+ if (pInSet)
+ MaxHandle= pInSet->m_MaxHandle;
+
+ if (pOutSet && (pOutSet->m_MaxHandle > MaxHandle))
+ MaxHandle= pOutSet->m_MaxHandle;
+
+ if (pOOBSet && (pOOBSet->m_MaxHandle > MaxHandle))
+ MaxHandle= pOOBSet->m_MaxHandle;
+
+ return select(MaxHandle+1,
+ pInSet ? PTR_FD_SET(pInSet->m_Set) : 0,
+ pOutSet ? PTR_FD_SET(pOutSet->m_Set) : 0,
+ pOOBSet ? PTR_FD_SET(pOOBSet->m_Set) : 0,
+ pTimeout ? &tv : 0);
+}
+
diff --git a/sal/osl/os2/sockimpl.h b/sal/osl/os2/sockimpl.h
new file mode 100644
index 000000000000..38fc26bf0d22
--- /dev/null
+++ b/sal/osl/os2/sockimpl.h
@@ -0,0 +1,80 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SOCKETIMPL_H_
+#define _OSL_SOCKETIMPL_H_
+
+#include <osl/pipe.h>
+#include <osl/socket.h>
+#include <osl/interlck.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* (*oslCloseCallback) (void*);
+
+struct oslSocketImpl {
+ int m_Socket;
+ int m_nLastError;
+ oslCloseCallback m_CloseCallback;
+ void* m_CallbackArg;
+ oslInterlockedCount m_nRefCount;
+#if defined(LINUX)
+ sal_Bool m_bIsAccepting;
+ sal_Bool m_bIsInShutdown;
+#endif
+};
+
+struct oslSocketAddrImpl
+{
+ sal_Int32 m_nRefCount;
+ struct sockaddr m_sockaddr;
+};
+
+/*
+struct oslPipeImpl {
+ int m_Socket;
+ sal_Char m_Name[PATH_MAX + 1];
+ oslInterlockedCount m_nRefCount;
+ sal_Bool m_bClosed;
+#if defined(LINUX)
+ sal_Bool m_bIsAccepting;
+ sal_Bool m_bIsInShutdown;
+#endif
+};
+*/
+
+oslSocket __osl_createSocketImpl(int Socket);
+void __osl_destroySocketImpl(oslSocket pImpl);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/sal/osl/os2/system.h b/sal/osl/os2/system.h
new file mode 100644
index 000000000000..436ae0074a04
--- /dev/null
+++ b/sal/osl/os2/system.h
@@ -0,0 +1,513 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef __OSL_SYSTEM_H__
+#define __OSL_SYSTEM_H__
+
+#define PTHREAD_NONE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <signal.h>
+#include <utime.h>
+
+#include <pwd.h>
+
+#include <netdb.h>
+
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#include <sys/types.h>
+
+/* OS/2 API header */
+#define INCL_WINPROGRAMLIST
+#define INCL_WINSHELLDATA
+#define INCL_BASE
+#define INCL_DOSSIGNALS
+#define INCL_DOSSEMAPHORES
+#define INCL_DOSMODULEMGR
+#define INCL_DOSERRORS
+#define INCL_DOSSESMGR
+#define INCL_DOSPROCESS
+#define INCL_DOSNMPIPES
+#define INCL_DOSMISC
+#include <os2.h>
+
+typedef ULONG HANDLE;
+#define _MAX_ENV 2048
+#define _MAX_CMD 2048
+
+#ifdef __cplusplus
+extern "C"
+#endif
+int debug_printf(const char *f, ...);
+
+/* Make sockets of type AF_UNIX use underlying FS rights */
+#ifdef SOLARIS
+# define _XOPEN_SOURCE 500
+# include <sys/socket.h>
+# undef _XOPEN_SOURCE
+#else
+# include <sys/socket.h>
+#endif
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#define max(a, b) ((a) < (b) ? (b) : (a))
+#define min(a, b) ((a) > (b) ? (b) : (a))
+#ifndef abs
+#define abs(x) ((x) >= 0 ? (x) : -(x))
+#endif
+
+#ifdef SYSV
+# include <sys/utsname.h>
+#endif
+
+#ifdef LINUX
+# ifndef __USE_GNU
+# define __USE_GNU
+# endif
+
+#if GLIBC >= 2
+# include <shadow.h>
+# if ! (defined(SPARC) || defined(X86_64))
+# include <asm/sigcontext.h>
+# endif
+# include <pthread.h>
+# include <sys/file.h>
+# include <sys/ioctl.h>
+# include <sys/uio.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <dlfcn.h>
+# include <endian.h>
+# include <sys/time.h>
+# include <semaphore.h>
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif __BYTE_ORDER == __BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif __BYTE_ORDER == __PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define PTR_SIZE_T(s) ((size_t *)&(s))
+# define IORESOURCE_TRANSFER_BSD
+# define IOCHANNEL_TRANSFER_BSD_RENO
+# define pthread_testcancel()
+# define NO_PTHREAD_PRIORITY
+# define PTHREAD_SIGACTION pthread_sigaction
+#else
+# include <shadow.h>
+# include <asm/sigcontext.h>
+# include <pthread.h>
+# include <sys/file.h>
+# include <sys/ioctl.h>
+# include <linux/net.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <linux/elfcore.h>
+# include <dlfcn.h>
+# include <endian.h>
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif __BYTE_ORDER == __BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif __BYTE_ORDER == __PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define IORESOURCE_TRANSFER_BSD
+# define IOCHANNEL_TRANSFER_BSD_RENO
+# define pthread_testcancel()
+# define NO_PTHREAD_RTL
+# define NO_PTHREAD_PRIORITY
+# define PTHREAD_SIGACTION pthread_sigaction
+#endif
+#endif
+
+#ifdef NETBSD
+# define ETIME ETIMEDOUT
+# define _POSIX_THREAD_SYSCALL_SOFT 1
+# include <pthread.h>
+# include <netdb.h>
+# include <sys/sem.h>
+# include <sys/exec.h>
+# include <sys/filio.h>
+# include <sys/ioctl.h>
+# include <sys/time.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <dlfcn.h>
+# include <machine/endian.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN_OO
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN_OO
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN_OO
+# endif
+# define PTR_SIZE_T(s) ((size_t *)&(s))
+# define IORESOURCE_TRANSFER_BSD
+# define IOCHANNEL_TRANSFER_BSD_RENO
+# define pthread_testcancel()
+# define NO_PTHREAD_PRIORITY
+# define NO_PTHREAD_SEMAPHORES
+# define NO_PTHREAD_RTL
+# define PTHREAD_SIGACTION pthread_sigaction
+#endif
+
+#ifdef FREEBSD
+# define ETIME ETIMEDOUT
+# include <pthread.h>
+# include <sys/sem.h>
+# include <semaphore.h>
+# include <dlfcn.h>
+# include <sys/filio.h>
+# include <sys/ioctl.h>
+# include <sys/param.h>
+# include <sys/time.h>
+# include <sys/uio.h>
+# include <sys/exec.h>
+# include <vm/vm.h>
+# include <vm/vm_param.h>
+# include <vm/pmap.h>
+# include <vm/swap_pager.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# define IORESOURCE_TRANSFER_BSD
+# include <machine/endian.h>
+#if __FreeBSD_version < 500000
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+#endif
+# define NO_PTHREAD_RTL
+#endif
+
+#ifdef SCO
+# define AF_IPX -1
+# include <strings.h>
+# include <pthread.h>
+# include <shadow.h>
+# include <netdb.h>
+# include <sys/un.h>
+# include <sys/netinet/tcp.h>
+# include <sys/types.h>
+# include <sys/byteorder.h>
+# include <dlfcn.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define sched_yield() pthread_yield()
+# define pthread_testcancel()
+# define NO_PTHREAD_RTL
+# define NO_PTHREAD_PRIORITY
+extern int pthread_cancel(pthread_t);
+extern unsigned int nanosleep(unsigned int);
+# define SLEEP_TIMESPEC(timespec) (timespec .tv_sec > 0) ? sleep(timespec .tv_sec), nanosleep(timespec .tv_nsec) : nanosleep(timespec .tv_nsec)
+# define PATH_MAX _POSIX_PATH_MAX
+# define S_ISSOCK S_ISFIFO
+# define PTHREAD_SIGACTION pthread_sigaction
+# define STAT_PARENT stat
+#endif
+
+#ifdef AIX
+# define AF_IPX -1
+# include <strings.h>
+# include <pthread.h>
+# include <sys/time.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <sys/machine.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define sched_yield() pthread_yield()
+# define SLEEP_TIMESPEC(timespec) nsleep(&timespec, 0)
+# define LIBPATH "LIBPATH"
+# define PTR_SIZE_T(s) ((size_t *)&(s))
+# define NO_PTHREAD_SEMAPHORES
+# define NO_DL_FUNCTIONS
+#endif
+
+#ifdef HPUX
+# define AF_IPX -1
+# undef howmany
+# undef MAXINT
+# include <pthread.h>
+# include <sys/un.h>
+# include <sys/sched.h>
+# include <sys/xti.h>
+# include <sys/pstat.h>
+# include <shadow.h>
+# include <crypt.h>
+# include <machine/param.h>
+# define LIBPATH "SHLIB_PATH"
+# define PTR_SIZE_T(s) ((int *)&(s))
+# define PTR_FD_SET(s) ((int *)&(s))
+# define PTHREAD_VALUE(t) ((t).field2)
+# define PTHREAD_NONE_INIT { 0, -1 }
+# define PTHREAD_ATTR_DEFAULT pthread_attr_default
+# define PTHREAD_MUTEXATTR_DEFAULT pthread_mutexattr_default
+# define PTHREAD_CONDATTR_DEFAULT pthread_condattr_default
+# define pthread_detach(t) pthread_detach(&(t))
+# define NO_PTHREAD_PRIORITY
+# define NO_PTHREAD_SEMAPHORES
+# define NO_DL_FUNCTIONS
+# undef sigaction
+# define PTHREAD_SIGACTION cma_sigaction
+#endif
+
+#ifdef SOLARIS
+# include <shadow.h>
+# include <sys/procfs.h>
+# include <sys/un.h>
+# include <stropts.h>
+# include <pthread.h>
+# include <semaphore.h>
+# include <netinet/tcp.h>
+# include <sys/filio.h>
+# include <dlfcn.h>
+# include <sys/isa_defs.h>
+# define IORESOURCE_TRANSFER_SYSV
+# define IOCHANNEL_TRANSFER_BSD
+# define LIBPATH "LD_LIBRARY_PATH"
+# define PTR_SIZE_T(s) ((int *)&(s))
+#endif
+
+#ifdef MACOSX
+# define ETIME ETIMEDOUT
+# include <pthread.h>
+# include <sys/file.h>
+# include <sys/ioctl.h>
+# include <sys/uio.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <machine/endian.h>
+# include <sys/time.h>
+# include <sys/semaphore.h>
+/* fixme are premac and postmac still needed here? */
+# include <premac.h>
+# include <mach-o/dyld.h>
+# include <postmac.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define IOCHANNEL_TRANSFER_BSD_RENO
+# define NO_PTHREAD_RTL
+/* for NSGetArgc/Argv/Environ */
+# include <crt_externs.h>
+char *macxp_tempnam( const char *tmpdir, const char *prefix );
+#endif
+
+#ifdef OS2
+# include <netinet/tcp.h>
+#endif
+
+#if !defined(_WIN32) && !defined(_WIN16) && !defined(OS2) && \
+ !defined(LINUX) && !defined(NETBSD) && !defined(FREEBSD) && !defined(SCO) && \
+ !defined(AIX) && !defined(HPUX) && \
+ !defined(SOLARIS) && !defined(MACOSX)
+# error "Target plattform not specified !"
+#endif
+
+#if defined(NETBSD)
+#if defined _LITTLE_ENDIAN_OO
+# define _OSL_BIGENDIAN
+#elif defined _BIG_ENDIAN_OO
+# define _OSL_LITENDIAN
+#else
+# error undetermined endianess
+#endif
+#else
+#if defined _LITTLE_ENDIAN
+# define _OSL_BIGENDIAN
+#elif defined _BIG_ENDIAN
+# define _OSL_LITENDIAN
+#else
+# error undetermined endianess
+#endif
+#endif
+
+#ifndef PTR_SIZE_T
+# define PTR_SIZE_T(s) (&(s))
+#endif
+
+#ifndef PTR_FD_SET
+# define PTR_FD_SET(s) (&(s))
+#endif
+
+#ifndef NORMALIZE_TIMESPEC
+# define NORMALIZE_TIMESPEC(timespec) \
+ timespec . tv_sec += timespec . tv_nsec / 1000000000; \
+ timespec . tv_nsec %= 1000000000;
+#endif
+
+#ifndef SET_TIMESPEC
+# define SET_TIMESPEC(timespec, sec, nsec) \
+ timespec . tv_sec = (sec); \
+ timespec . tv_nsec = (nsec); \
+ NORMALIZE_TIMESPEC(timespec);
+#endif
+
+#ifndef SLEEP_TIMESPEC
+# define SLEEP_TIMESPEC(timespec) nanosleep(&timespec, 0)
+#endif
+
+#ifndef INIT_GROUPS
+# define INIT_GROUPS(name, gid) ((setgid((gid)) == 0) && (initgroups((name), (gid)) == 0))
+#endif
+
+#ifndef PTHREAD_VALUE
+# define PTHREAD_VALUE(t) (t)
+#endif
+#ifndef PTHREAD_NONE
+extern pthread_t _pthread_none_;
+# define PTHREAD_NONE _pthread_none_
+# ifndef PTHREAD_NONE_INIT
+# define PTHREAD_NONE_INIT ((pthread_t)-1)
+# endif
+#endif
+
+#ifndef PTHREAD_ATTR_DEFAULT
+# define PTHREAD_ATTR_DEFAULT NULL
+#endif
+#ifndef PTHREAD_MUTEXATTR_DEFAULT
+# define PTHREAD_MUTEXATTR_DEFAULT NULL
+#endif
+#ifndef PTHREAD_CONDATTR_DEFAULT
+# define PTHREAD_CONDATTR_DEFAULT NULL
+#endif
+
+#ifndef PTHREAD_SIGACTION
+# define PTHREAD_SIGACTION sigaction
+#endif
+
+#ifndef STAT_PARENT
+# define STAT_PARENT lstat
+#endif
+
+/* socket options which might not be defined on all unx flavors */
+#ifndef SO_ACCEPTCONN
+# define SO_ACCEPTCONN 0
+#endif
+#ifndef SO_SNDLOWAT
+# define SO_SNDLOWAT 0
+#endif
+#ifndef SO_RCVLOWAT
+# define SO_RCVLOWAT 0
+#endif
+#ifndef SO_SNDTIMEO
+# define SO_SNDTIMEO 0
+#endif
+#ifndef SO_RCVTIMEO
+# define SO_RCVTIMEO 0
+#endif
+#ifndef SO_USELOOPBACK
+# define SO_USELOOPBACK 0
+#endif
+#ifndef MSG_MAXIOVLEN
+# define MSG_MAXIOVLEN 0
+#endif
+
+/* BEGIN HACK */
+/* dummy define and declarations for IPX should be replaced by */
+/* original ipx headers when these are available for this platform */
+
+#ifndef SA_FAMILY_DECL
+# define SA_FAMILY_DECL short sa_family
+#endif
+
+typedef struct sockaddr_ipx {
+ SA_FAMILY_DECL;
+ char sa_netnum[4];
+ char sa_nodenum[6];
+ unsigned short sa_socket;
+} SOCKADDR_IPX;
+
+#define NSPROTO_IPX 1000
+#define NSPROTO_SPX 1256
+#define NSPROTO_SPXII 1257
+
+/* END HACK */
+
+#ifdef NO_PTHREAD_SEMAPHORES
+
+typedef struct
+{
+ pthread_mutex_t mutex;
+ pthread_cond_t increased;
+ int value;
+} sem_t;
+extern int sem_init(sem_t* sem, int pshared, unsigned int value);
+extern int sem_destroy(sem_t* sem);
+extern int sem_wait(sem_t* sem);
+extern int sem_trywait(sem_t* sem);
+extern int sem_post(sem_t* sem);
+
+#endif
+
+#ifdef NO_PTHREAD_RTL
+#if !defined FREEBSD || (__FreeBSD_version < 500112)
+struct passwd *getpwent_r(struct passwd *pwd, char *buffer, int buflen);
+extern struct spwd *getspnam_r(const char *name, struct spwd *result,
+ char *buffer, int buflen);
+
+struct tm *localtime_r(const time_t *timep, struct tm *buffer);
+struct tm *gmtime_r(const time_t *timep, struct tm *buffer);
+#endif /* !defined FREEBSD || (__FreeBSD_version < 500112) */
+struct hostent *gethostbyname_r(const char *name, struct hostent *result,
+ char *buffer, int buflen, int *h_errnop);
+#endif
+
+#endif /* __OSL_SYSTEM_H__ */
+
diff --git a/sal/osl/os2/tempfile.c b/sal/osl/os2/tempfile.c
new file mode 100644
index 000000000000..672995563c88
--- /dev/null
+++ b/sal/osl/os2/tempfile.c
@@ -0,0 +1,359 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*****************************************************************/
+/* Includes */
+/*****************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include "system.h"
+#include <osl/file.h>
+#include <osl/thread.h>
+#include <rtl/ustrbuf.h>
+#include <osl/diagnose.h>
+
+#ifndef _FILE_URL_H_
+#include "file_url.h"
+#endif
+
+/*****************************************************************/
+/* osl_getTempFirURL */
+/*****************************************************************/
+
+oslFileError SAL_CALL osl_getTempDirURL( rtl_uString** pustrTempDir )
+{
+ const char *pValue = getenv( "TEMP" );
+
+ if ( !pValue )
+ {
+ pValue = getenv( "TMP" );
+#if defined(SOLARIS) || defined (LINUX) || defined (FREEBSD) || defined (MACOSX)
+ if ( !pValue )
+ pValue = P_tmpdir;
+#endif
+ }
+
+ if ( pValue )
+ {
+ oslFileError error;
+ rtl_uString *ustrTempPath = NULL;
+
+ rtl_string2UString( &ustrTempPath, pValue, strlen( pValue ), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(ustrTempPath != NULL);
+ error = osl_getFileURLFromSystemPath( ustrTempPath, pustrTempDir );
+ rtl_uString_release( ustrTempPath );
+
+ return error;
+ }
+ else
+ return osl_File_E_NOENT;
+}
+
+/******************************************************************
+ * Generates a random unique file name. We're using the scheme
+ * from the standard c-lib function mkstemp to generate a more
+ * or less random unique file name
+ *
+ * @param rand_name
+ * receives the random name
+ ******************************************************************/
+
+static const char LETTERS[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+static const int COUNT_OF_LETTERS = sizeof(LETTERS)/sizeof(LETTERS[0]) - 1;
+
+#define RAND_NAME_LENGTH 6
+
+static void osl_gen_random_name_impl_(rtl_uString** rand_name)
+{
+ static uint64_t value;
+
+ char buffer[RAND_NAME_LENGTH];
+ struct timeval tv;
+ uint64_t v;
+ int i;
+
+ gettimeofday(&tv, NULL);
+
+ value += ((uint64_t)tv.tv_usec << 16) ^ tv.tv_sec ^ getpid();
+
+ v = value;
+
+ for (i = 0; i < RAND_NAME_LENGTH; i++)
+ {
+ buffer[i] = LETTERS[v % COUNT_OF_LETTERS];
+ v /= COUNT_OF_LETTERS;
+ }
+
+ rtl_string2UString(
+ rand_name,
+ buffer,
+ RAND_NAME_LENGTH,
+ RTL_TEXTENCODING_ASCII_US,
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ OSL_ASSERT(*rand_name != NULL);
+}
+
+/*****************************************************************
+ * Helper function
+ * Either use the directory provided or the result of
+ * osl_getTempDirUrl and return it as system path and file url
+ ****************************************************************/
+
+static oslFileError osl_setup_base_directory_impl_(
+ rtl_uString* pustrDirectoryURL,
+ rtl_uString** ppustr_base_dir)
+{
+ rtl_uString* dir_url = 0;
+ rtl_uString* dir = 0;
+ oslFileError error = osl_File_E_None;
+
+ if (pustrDirectoryURL)
+ rtl_uString_assign(&dir_url, pustrDirectoryURL);
+ else
+ error = osl_getTempDirURL(&dir_url);
+
+ if (osl_File_E_None == error)
+ {
+ error = osl_getSystemPathFromFileURL_Ex(dir_url, &dir, FURL_DENY_RELATIVE);
+ rtl_uString_release(dir_url);
+ }
+
+ if (osl_File_E_None == error)
+ {
+ rtl_uString_assign(ppustr_base_dir, dir);
+ rtl_uString_release(dir);
+ }
+
+ return error;
+}
+
+/*****************************************************************
+ * osl_setup_createTempFile_impl
+ * validate input parameter, setup variables
+ ****************************************************************/
+
+ static oslFileError osl_setup_createTempFile_impl_(
+ rtl_uString* pustrDirectoryURL,
+ oslFileHandle* pHandle,
+ rtl_uString** ppustrTempFileURL,
+ rtl_uString** ppustr_base_dir,
+ sal_Bool* b_delete_on_close)
+ {
+ oslFileError osl_error;
+
+ OSL_PRECOND(((0 != pHandle) || (0 != ppustrTempFileURL)), "Invalid parameter!");
+
+ if ((0 == pHandle) && (0 == ppustrTempFileURL))
+ {
+ osl_error = osl_File_E_INVAL;
+ }
+ else
+ {
+ osl_error = osl_setup_base_directory_impl_(
+ pustrDirectoryURL, ppustr_base_dir);
+
+ *b_delete_on_close = (0 == ppustrTempFileURL);
+ }
+
+ return osl_error;
+ }
+
+/*****************************************************************
+ * Create a unique file in the specified directory and return
+ * it's name
+ ****************************************************************/
+
+static oslFileError osl_create_temp_file_impl_(
+ const rtl_uString* pustr_base_directory,
+ oslFileHandle* file_handle,
+ rtl_uString** ppustr_temp_file_name)
+{
+ rtl_uString* rand_name = 0;
+ sal_uInt32 len_base_dir = 0;
+ rtl_uString* tmp_file_path = 0;
+ rtl_uString* tmp_file_url = 0;
+ sal_Int32 capacity = 0;
+ oslFileError osl_error = osl_File_E_None;
+ sal_Int32 offset_file_name;
+ const sal_Unicode* puchr;
+
+ OSL_PRECOND(pustr_base_directory, "Invalid Parameter");
+ OSL_PRECOND(file_handle, "Invalid Parameter");
+ OSL_PRECOND(ppustr_temp_file_name, "Invalid Parameter");
+
+ len_base_dir = rtl_uString_getLength(pustr_base_directory);
+
+ rtl_uStringbuffer_newFromStr_WithLength(
+ &tmp_file_path,
+ rtl_uString_getStr((rtl_uString*)pustr_base_directory),
+ len_base_dir);
+
+ rtl_uStringbuffer_ensureCapacity(
+ &tmp_file_path,
+ &capacity,
+ (len_base_dir + 1 + RAND_NAME_LENGTH));
+
+ offset_file_name = len_base_dir;
+
+ puchr = rtl_uString_getStr(tmp_file_path);
+
+ /* ensure that the last character is a '\' */
+
+ if ((sal_Unicode)'\\' != puchr[len_base_dir - 1])
+ {
+ rtl_uStringbuffer_insert_ascii(
+ &tmp_file_path,
+ &capacity,
+ len_base_dir,
+ "\\",
+ 1);
+
+ offset_file_name++;
+ }
+
+ while(1) /* try until success */
+ {
+ osl_gen_random_name_impl_(&rand_name);
+
+ rtl_uStringbuffer_insert(
+ &tmp_file_path,
+ &capacity,
+ offset_file_name,
+ rtl_uString_getStr(rand_name),
+ rtl_uString_getLength(rand_name));
+
+ osl_error = osl_getFileURLFromSystemPath(
+ tmp_file_path, &tmp_file_url);
+
+ if (osl_File_E_None == osl_error)
+ {
+ /* RW permission for the user only! */
+ mode_t old_mode = umask(077);
+
+ osl_error = osl_openFile(
+ tmp_file_url,
+ file_handle,
+ osl_File_OpenFlag_Read |
+ osl_File_OpenFlag_Write |
+ osl_File_OpenFlag_Create);
+
+ umask(old_mode);
+ }
+
+ /* in case of error osl_File_E_EXIST we simply try again else we give up */
+
+ if ((osl_File_E_None == osl_error) || (osl_error != osl_File_E_EXIST))
+ {
+ if (rand_name)
+ rtl_uString_release(rand_name);
+
+ if (tmp_file_url)
+ rtl_uString_release(tmp_file_url);
+
+ break;
+ }
+ } /* while(1) */
+
+ if (osl_File_E_None == osl_error)
+ rtl_uString_assign(ppustr_temp_file_name, tmp_file_path);
+
+ if (tmp_file_path)
+ rtl_uString_release(tmp_file_path);
+
+ return osl_error;
+}
+
+/*****************************************************************
+ * osl_createTempFile
+ *****************************************************************/
+
+oslFileError SAL_CALL osl_createTempFile(
+ rtl_uString* pustrDirectoryURL,
+ oslFileHandle* pHandle,
+ rtl_uString** ppustrTempFileURL)
+{
+ rtl_uString* base_directory = 0;
+ rtl_uString* temp_file_name = 0;
+ oslFileHandle temp_file_handle;
+ sal_Bool b_delete_on_close;
+ oslFileError osl_error;
+
+ osl_error = osl_setup_createTempFile_impl_(
+ pustrDirectoryURL,
+ pHandle,
+ ppustrTempFileURL,
+ &base_directory,
+ &b_delete_on_close);
+
+ if (osl_File_E_None != osl_error)
+ return osl_error;
+
+ osl_error = osl_create_temp_file_impl_(
+ base_directory, &temp_file_handle, &temp_file_name);
+
+ if (osl_File_E_None == osl_error)
+ {
+ rtl_uString* temp_file_url = 0;
+
+ /* assuming this works */
+ osl_getFileURLFromSystemPath(temp_file_name, &temp_file_url);
+
+ if (b_delete_on_close)
+ {
+ osl_error = osl_removeFile(temp_file_url);
+
+ if (osl_File_E_None == osl_error)
+ *pHandle = temp_file_handle;
+ else
+ osl_closeFile(temp_file_handle);
+ }
+ else
+ {
+ if (pHandle)
+ *pHandle = temp_file_handle;
+ else
+ osl_closeFile(temp_file_handle);
+
+ rtl_uString_assign(ppustrTempFileURL, temp_file_url);
+ }
+
+ if (temp_file_url)
+ rtl_uString_release(temp_file_url);
+
+ if (temp_file_name)
+ rtl_uString_release(temp_file_name);
+ }
+
+ if (base_directory)
+ rtl_uString_release(base_directory);
+
+ return osl_error;
+}
diff --git a/sal/osl/os2/thread.c b/sal/osl/os2/thread.c
new file mode 100644
index 000000000000..313e67c0f925
--- /dev/null
+++ b/sal/osl/os2/thread.c
@@ -0,0 +1,772 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <osl/time.h>
+#include <rtl/alloc.h>
+#include <rtl/tencinfo.h>
+
+/*
+ Thread-data structure hidden behind oslThread:
+*/
+typedef struct _osl_TThreadImpl
+{
+
+ TID m_ThreadId; /* identifier for this thread */
+ sal_Int32 m_Flags;
+ HEV m_hEvent;
+ sal_uInt32 m_Timeout;
+ oslWorkerFunction m_WorkerFunction;
+ void* m_pData;
+ sal_Bool m_StartSuspended;
+ HAB m_hab;
+ HMQ m_hmq;
+
+} osl_TThreadImpl;
+
+#define THREADIMPL_FLAGS_TERMINATE 0x0001
+#define THREADIMPL_FLAGS_SLEEP 0x0002
+
+
+// static mutex to control access to private members of oslMutexImpl
+static HMTX MutexLock = NULL;
+
+/*****************************************************************************/
+
+HAB osl_getPMinternal_HAB(oslThread hThread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)hThread;
+
+ if(pThreadImpl == NULL) /* valid ptr? */
+ {
+ return NULL;
+ }
+ else
+ {
+ return pThreadImpl->m_hab;
+ }
+}
+
+HMQ osl_getPMinternal_HMQ(oslThread hThread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)hThread;
+
+ if(pThreadImpl == NULL) /* valid ptr? */
+ {
+ return NULL;
+ }
+ else
+ {
+ return pThreadImpl->m_hmq;
+ }
+}
+
+
+/*****************************************************************************/
+/* oslWorkerWrapperFunction */
+/*****************************************************************************/
+static void oslWorkerWrapperFunction(void* pData)
+{
+ BOOL rc;
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)pData;
+
+#if OSL_DEBUG_LEVEL>0
+printf("oslWorkerWrapperFunction pThreadImpl %x, pThreadImpl->m_ThreadId %d\n", pThreadImpl, pThreadImpl->m_ThreadId);
+#endif
+ /* Inizialize PM for this thread */
+ pThreadImpl->m_hab = WinInitialize( 0 );
+#if OSL_DEBUG_LEVEL>0
+printf("pThreadImpl->m_ThreadId %d, pThreadImpl->m_hab %x\n", pThreadImpl->m_ThreadId,pThreadImpl->m_hab);
+#endif
+ pThreadImpl->m_hmq = WinCreateMsgQueue( pThreadImpl->m_hab, 0 );
+#if OSL_DEBUG_LEVEL>0
+printf("pThreadImpl->m_ThreadId %d, pThreadImpl->m_hmq %x\n", pThreadImpl->m_ThreadId,pThreadImpl->m_hmq);
+#endif
+
+ /* call worker-function with data */
+ pThreadImpl->m_WorkerFunction( pThreadImpl->m_pData );
+
+ /* Free all PM-resources for this thread */
+#if OSL_DEBUG_LEVEL>0
+printf("pThreadImpl->m_ThreadId %d, about to destroy queue\n", pThreadImpl->m_ThreadId);
+#endif
+ rc = WinDestroyMsgQueue( pThreadImpl->m_hmq );
+#if OSL_DEBUG_LEVEL>0
+printf("pThreadImpl->m_ThreadId %d, WinDestroyMsgQueue rc=%d (should be 1)\n", pThreadImpl->m_ThreadId, rc);
+printf("pThreadImpl->m_ThreadId %d, about to terminate hab\n", pThreadImpl->m_ThreadId);
+#endif
+ rc = WinTerminate( pThreadImpl->m_hab );
+#if OSL_DEBUG_LEVEL>0
+printf("pThreadImpl->m_ThreadId %d, WinTerminate rc=%d (should be 1)\n", pThreadImpl->m_ThreadId, rc);
+#endif
+}
+
+
+/*****************************************************************************/
+/* oslCreateThread */
+/*****************************************************************************/
+static oslThread oslCreateThread(oslWorkerFunction pWorker,
+ void* pThreadData,
+ sal_Bool nFlags)
+{
+ osl_TThreadImpl* pThreadImpl;
+
+ /* alloc mem. for our internal data structure */
+ pThreadImpl = (osl_TThreadImpl*)malloc(sizeof(osl_TThreadImpl));
+
+ OSL_ASSERT(pThreadImpl);
+
+ pThreadImpl->m_WorkerFunction= pWorker;
+ pThreadImpl->m_pData= pThreadData;
+
+ pThreadImpl->m_Flags = 0;
+ pThreadImpl->m_hEvent = 0;
+ pThreadImpl->m_Timeout = 0;
+ pThreadImpl->m_StartSuspended = nFlags;
+ pThreadImpl->m_hab = 0;
+ pThreadImpl->m_hmq = 0;
+
+ if ( nFlags == sal_True )
+ {
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+ }
+
+ pThreadImpl->m_ThreadId = (TID) _beginthread( oslWorkerWrapperFunction, /* worker-function */
+ NULL, /* unused parameter */
+ 1024*1024, /* max. Stacksize */
+ pThreadImpl );
+ if ( nFlags == sal_True )
+ {
+ if( pThreadImpl->m_ThreadId != -1 )
+ DosSuspendThread( pThreadImpl->m_ThreadId );
+ DosReleaseMutexSem( MutexLock);
+ }
+#if OSL_DEBUG_LEVEL>0
+printf("oslCreateThread pThreadImpl %x, pThreadImpl->m_ThreadId %d\n", pThreadImpl, pThreadImpl->m_ThreadId);
+#endif
+ if(pThreadImpl->m_ThreadId == -1)
+ {
+ /* create failed */
+ if (pThreadImpl->m_hEvent != 0)
+ DosCloseEventSem(pThreadImpl->m_hEvent);
+
+ free(pThreadImpl);
+ return 0;
+ }
+
+ pThreadImpl->m_hEvent= 0;
+
+ return pThreadImpl;
+
+}
+
+/*****************************************************************************/
+/* osl_createThread */
+/*****************************************************************************/
+oslThread SAL_CALL osl_createThread(oslWorkerFunction pWorker,
+ void* pThreadData)
+{
+ return oslCreateThread(pWorker,pThreadData,sal_False);
+}
+
+/*****************************************************************************/
+/* osl_createSuspendedThread */
+/*****************************************************************************/
+oslThread SAL_CALL osl_createSuspendedThread(oslWorkerFunction pWorker,
+ void* pThreadData)
+{
+ return oslCreateThread(pWorker,pThreadData,sal_True);
+}
+
+/*****************************************************************************/
+/* osl_getThreadIdentifier */
+/*****************************************************************************/
+oslThreadIdentifier SAL_CALL osl_getThreadIdentifier(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ if (pThreadImpl != NULL)
+ return ((oslThreadIdentifier)pThreadImpl->m_ThreadId);
+ else
+ {
+ PTIB pptib = NULL;
+ PPIB pppib = NULL;
+
+ DosGetInfoBlocks( &pptib, &pppib );
+ return ((oslThreadIdentifier) pptib->tib_ptib2->tib2_ultid );
+ }
+}
+
+/*****************************************************************************/
+/* osl_destroyThread */
+/*****************************************************************************/
+void SAL_CALL osl_destroyThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ if(Thread == 0) /* valid ptr? */
+ {
+ /* thread already destroyed or not created */
+ return;
+ }
+
+ if(pThreadImpl->m_ThreadId != -1) /* valid handle ? */
+ {
+ /* cancel thread */
+ DosKillThread( pThreadImpl->m_ThreadId );
+ }
+}
+
+/*****************************************************************************/
+/* osl_freeThreadHandle */
+/*****************************************************************************/
+void SAL_CALL osl_freeThreadHandle(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ if(Thread == 0) /* valid ptr? */
+ {
+ /* thread already destroyed or not created */
+ return;
+ }
+
+ if (pThreadImpl->m_hEvent != 0)
+ DosCloseEventSem(pThreadImpl->m_hEvent);
+
+ /* free memory */
+ free(Thread);
+}
+
+/*****************************************************************************/
+/* osl_resumeThread */
+/*****************************************************************************/
+void SAL_CALL osl_resumeThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ OSL_ASSERT(pThreadImpl); /* valid ptr? */
+
+ DosResumeThread( pThreadImpl->m_ThreadId );
+}
+
+/*****************************************************************************/
+/* osl_suspendThread */
+/*****************************************************************************/
+void SAL_CALL osl_suspendThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ OSL_ASSERT(pThreadImpl); /* valid ptr? */
+
+ DosSuspendThread( pThreadImpl->m_ThreadId );
+}
+
+/*****************************************************************************/
+/* osl_setThreadPriority */
+/*****************************************************************************/
+void SAL_CALL osl_setThreadPriority(oslThread Thread,
+ oslThreadPriority Priority)
+{
+ ULONG nOs2PriorityClass;
+ ULONG nOs2PriorityDelta;
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ OSL_ASSERT(pThreadImpl); /* valid ptr? */
+
+ switch(Priority) {
+
+ case osl_Thread_PriorityHighest:
+
+ nOs2PriorityClass = PRTYC_REGULAR;
+ nOs2PriorityDelta = PRTYD_MAXIMUM;
+ break;
+
+ case osl_Thread_PriorityAboveNormal:
+
+ nOs2PriorityClass = PRTYC_REGULAR;
+ nOs2PriorityDelta = 16;
+ break;
+
+ case osl_Thread_PriorityNormal:
+
+ nOs2PriorityClass = PRTYC_REGULAR;
+ nOs2PriorityDelta = 0;
+ break;
+
+ case osl_Thread_PriorityBelowNormal:
+
+ nOs2PriorityClass = PRTYC_REGULAR;
+ nOs2PriorityDelta = -16;
+ break;
+
+ case osl_Thread_PriorityLowest:
+
+ nOs2PriorityClass = PRTYC_REGULAR;
+ nOs2PriorityDelta = PRTYD_MINIMUM;
+ break;
+
+ case osl_Thread_PriorityUnknown:
+ OSL_ASSERT(FALSE); /* only fools try this...*/
+
+ /* let release-version behave friendly */
+ return;
+
+ default:
+ OSL_ASSERT(FALSE); /* enum expanded, but forgotten here...*/
+
+ /* let release-version behave friendly */
+ return;
+ }
+
+ DosSetPriority( PRTYS_THREAD,
+ nOs2PriorityClass, nOs2PriorityDelta,
+ pThreadImpl->m_ThreadId );
+
+}
+
+/*****************************************************************************/
+/* osl_getThreadPriority */
+/*****************************************************************************/
+
+#define BYTE1FROMULONG(ul) ((UCHAR) (ul))
+#define BYTE2FROMULONG(ul) ((UCHAR) ((ULONG) ul >> 8))
+
+oslThreadPriority SAL_CALL osl_getThreadPriority(const oslThread Thread)
+{
+ ULONG nOs2PriorityClass;
+ ULONG nOs2PriorityDelta;
+
+ oslThreadPriority Priority;
+
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ /* invalid arguments ?*/
+ if(pThreadImpl==0 || pThreadImpl->m_ThreadId==-1)
+ {
+ return osl_Thread_PriorityUnknown;
+ }
+
+ /* get current priorities */
+ {
+ PTIB pptib = NULL;
+ PPIB pppib = NULL;
+
+ DosGetInfoBlocks( &pptib, &pppib );
+ nOs2PriorityClass = BYTE1FROMULONG( pptib->tib_ptib2->tib2_ulpri );
+ nOs2PriorityDelta = BYTE2FROMULONG( pptib->tib_ptib2->tib2_ulpri );
+ }
+
+ /* map OS2 priority to enum */
+ switch(nOs2PriorityClass)
+ {
+ case PRTYC_TIMECRITICAL:
+ Priority= osl_Thread_PriorityHighest;
+ break;
+
+ case PRTYC_REGULAR:
+
+ if( nOs2PriorityDelta == 0 )
+ {
+ Priority= osl_Thread_PriorityNormal;
+ break;
+ }
+
+ if( nOs2PriorityDelta < -16 )
+ {
+ Priority= osl_Thread_PriorityLowest;
+ break;
+ }
+
+ if( nOs2PriorityDelta < 0 )
+ {
+ Priority= osl_Thread_PriorityBelowNormal;
+ break;
+ }
+
+ if( nOs2PriorityDelta > 0 )
+ {
+ Priority= osl_Thread_PriorityAboveNormal;
+ break;
+ }
+
+ Priority= osl_Thread_PriorityHighest;
+ break;
+
+ case PRTYC_IDLETIME:
+ Priority= osl_Thread_PriorityLowest;
+ break;
+
+ default:
+ OSL_ASSERT(FALSE); /* OS/2 API changed, incorporate new prio-level! */
+
+ /* release-version behaves friendly */
+ Priority= osl_Thread_PriorityUnknown;
+ }
+
+ return Priority;
+}
+
+/*****************************************************************************/
+/* osl_isThreadRunning */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isThreadRunning(const oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+ APIRET rc;
+
+ /* invalid arguments ?*/
+ if(pThreadImpl==0 || pThreadImpl->m_ThreadId==-1)
+ {
+ return sal_False;
+ }
+
+ if( osl_getThreadIdentifier( 0 ) == osl_getThreadIdentifier( Thread ) )
+ return sal_True;
+
+ rc = DosWaitThread( &pThreadImpl->m_ThreadId, DCWW_NOWAIT );
+
+ return( rc != ERROR_INVALID_THREADID );
+}
+
+/*****************************************************************************/
+/* osl_joinWithThread */
+/*****************************************************************************/
+void SAL_CALL osl_joinWithThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ /* invalid arguments?*/
+ if(pThreadImpl==0 || pThreadImpl->m_ThreadId==-1)
+ {
+ /* assume thread is not running */
+ return;
+ }
+
+ DosWaitThread( &pThreadImpl->m_ThreadId, DCWW_WAIT );
+}
+
+/*****************************************************************************/
+/* osl_waitThread */
+/*****************************************************************************/
+void SAL_CALL osl_waitThread(const TimeValue* pDelay)
+{
+ int millisecs;
+
+ OSL_ASSERT(pDelay);
+
+ millisecs = pDelay->Seconds * 1000 + pDelay->Nanosec / 1000000;
+
+ DosSleep(millisecs);
+}
+
+/*****************************************************************************/
+/* osl_terminateThread */
+/*****************************************************************************/
+void SAL_CALL osl_terminateThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ /* invalid arguments?*/
+ if (pThreadImpl==0 || pThreadImpl->m_ThreadId==-1)
+ {
+ /* assume thread is not running */
+ return;
+ }
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+ pThreadImpl->m_Flags |= THREADIMPL_FLAGS_TERMINATE;
+ DosReleaseMutexSem( MutexLock);
+}
+
+
+/*****************************************************************************/
+/* osl_scheduleThread */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_scheduleThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ osl_yieldThread();
+
+ /* invalid arguments?*/
+ if (pThreadImpl==0 || pThreadImpl->m_ThreadId==-1)
+ {
+ /* assume thread is not running */
+ return sal_False;
+ }
+
+ if (pThreadImpl->m_Flags & THREADIMPL_FLAGS_SLEEP)
+ {
+ OSL_ASSERT (pThreadImpl->m_hEvent != 0);
+
+ DosWaitEventSem(pThreadImpl->m_hEvent, pThreadImpl->m_Timeout);
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+
+ pThreadImpl->m_Timeout = 0;
+
+ pThreadImpl->m_Flags &= ~THREADIMPL_FLAGS_SLEEP;
+
+ DosReleaseMutexSem( MutexLock);
+ }
+
+ return ((pThreadImpl->m_Flags & THREADIMPL_FLAGS_TERMINATE) == 0);
+}
+
+/*****************************************************************************/
+/* osl_yieldThread */
+/*****************************************************************************/
+void SAL_CALL osl_yieldThread()
+{
+ DosSleep(0);
+}
+
+typedef struct _TLS
+{
+ PULONG pulPtr;
+ oslThreadKeyCallbackFunction pfnCallback;
+ struct _TLS *pNext, *pPrev;
+} TLS, *PTLS;
+
+static PTLS g_pThreadKeyList = NULL;
+
+static void AddKeyToList( PTLS pTls )
+{
+ if ( pTls )
+ {
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+
+ pTls->pNext = g_pThreadKeyList;
+ pTls->pPrev = 0;
+
+ if ( g_pThreadKeyList )
+ g_pThreadKeyList->pPrev = pTls;
+
+ g_pThreadKeyList = pTls;
+
+ DosReleaseMutexSem( MutexLock);
+ }
+}
+
+static void RemoveKeyFromList( PTLS pTls )
+{
+ if ( pTls )
+ {
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+ if ( pTls->pPrev )
+ pTls->pPrev->pNext = pTls->pNext;
+ else
+ {
+ OSL_ASSERT( pTls == g_pThreadKeyList );
+ g_pThreadKeyList = pTls->pNext;
+ }
+
+ if ( pTls->pNext )
+ pTls->pNext->pPrev = pTls->pPrev;
+ DosReleaseMutexSem( MutexLock);
+ }
+}
+
+void SAL_CALL _osl_callThreadKeyCallbackOnThreadDetach(void)
+{
+ PTLS pTls;
+
+ DosRequestMutexSem( MutexLock, SEM_INDEFINITE_WAIT );
+ pTls = g_pThreadKeyList;
+ while ( pTls )
+ {
+ if ( pTls->pfnCallback )
+ {
+ void *pValue = (void*)*pTls->pulPtr;
+
+ if ( pValue )
+ pTls->pfnCallback( pValue );
+ }
+
+ pTls = pTls->pNext;
+ }
+ DosReleaseMutexSem( MutexLock);
+}
+
+/*****************************************************************************/
+/* osl_createThreadKey */
+/*****************************************************************************/
+oslThreadKey SAL_CALL osl_createThreadKey(oslThreadKeyCallbackFunction pCallback)
+{
+ PTLS pTls = (PTLS)rtl_allocateMemory( sizeof(TLS) );
+
+ if ( pTls )
+ {
+ pTls->pfnCallback = pCallback;
+ if (DosAllocThreadLocalMemory(1, &pTls->pulPtr) != NO_ERROR)
+ {
+ rtl_freeMemory( pTls );
+ pTls = 0;
+ }
+ else
+ {
+ *pTls->pulPtr = 0;
+ AddKeyToList( pTls );
+ }
+ }
+
+ return ((oslThreadKey)pTls);
+}
+
+/*****************************************************************************/
+/* osl_destroyThreadKey */
+/*****************************************************************************/
+void SAL_CALL osl_destroyThreadKey(oslThreadKey Key)
+{
+ if (Key != 0)
+ {
+ PTLS pTls = (PTLS)Key;
+
+ RemoveKeyFromList( pTls );
+ DosFreeThreadLocalMemory(pTls->pulPtr);
+ rtl_freeMemory( pTls );
+ }
+}
+
+/*****************************************************************************/
+/* osl_getThreadKeyData */
+/*****************************************************************************/
+void * SAL_CALL osl_getThreadKeyData(oslThreadKey Key)
+{
+ if (Key != 0)
+ {
+ PTLS pTls = (PTLS)Key;
+
+ return ((void *) *pTls->pulPtr);
+ }
+
+ return (NULL);
+}
+
+/*****************************************************************************/
+/* osl_setThreadKeyData */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setThreadKeyData(oslThreadKey Key, void *pData)
+{
+ if (Key != 0)
+ {
+ PTLS pTls = (PTLS)Key;
+ void* pOldData = NULL;
+ BOOL fSuccess = TRUE; //YD cannot fail
+
+ if ( pTls->pfnCallback )
+ pOldData = (void*)*pTls->pulPtr;
+
+ *pTls->pulPtr = (ULONG)pData;
+
+ if ( fSuccess && pTls->pfnCallback && pOldData )
+ pTls->pfnCallback( pOldData );
+
+ return (sal_Bool)(fSuccess != FALSE);
+ }
+
+ return (sal_False);
+}
+
+
+
+/*****************************************************************************/
+/* osl_getThreadTextEncoding */
+/*****************************************************************************/
+
+ULONG g_dwTLSTextEncodingIndex = (ULONG)-1;
+
+sal_uInt32 SAL_CALL _GetACP( void)
+{
+ APIRET rc;
+ ULONG aulCpList[8] = {0};
+ ULONG ulListSize;
+
+ rc = DosQueryCp( sizeof( aulCpList), aulCpList, &ulListSize);
+ if (rc)
+ return 437; // in case of error, return codepage EN_US
+ // current codepage is first of list, others are the prepared codepages.
+ return aulCpList[0];
+}
+
+rtl_TextEncoding SAL_CALL osl_getThreadTextEncoding(void)
+{
+ rtl_TextEncoding _encoding;
+
+ if ( (ULONG)-1 == g_dwTLSTextEncodingIndex ) {
+ rtl_TextEncoding defaultEncoding;
+ const char * pszEncoding;
+
+ /* create thread specific data key */
+ g_dwTLSTextEncodingIndex = osl_createThreadKey( NULL);
+
+ /* determine default text encoding */
+ pszEncoding = getenv ("SOLAR_USER_RTL_TEXTENCODING");
+ if (pszEncoding)
+ defaultEncoding = atoi(pszEncoding);
+ else
+ defaultEncoding = rtl_getTextEncodingFromWindowsCodePage( _GetACP());
+
+ //OSL_ASSERT(defaultEncoding != RTL_TEXTENCODING_DONTKNOW);
+ //g_thread.m_textencoding.m_default = defaultEncoding;
+ osl_setThreadKeyData( g_dwTLSTextEncodingIndex, (void*)defaultEncoding);
+ }
+
+ _encoding = (rtl_TextEncoding)osl_getThreadKeyData( g_dwTLSTextEncodingIndex );
+ if (0 == _encoding) {
+ const char * pszEncoding;
+ /* determine default text encoding */
+ pszEncoding = getenv ("SOLAR_USER_RTL_TEXTENCODING");
+ if (pszEncoding)
+ _encoding = atoi(pszEncoding);
+ else
+ _encoding = rtl_getTextEncodingFromWindowsCodePage( _GetACP());
+ /* save for future reference */
+ osl_setThreadKeyData( g_dwTLSTextEncodingIndex, (void*)_encoding);
+ }
+
+ return _encoding;
+}
+
+/*****************************************************************************/
+/* osl_getThreadTextEncoding */
+/*****************************************************************************/
+rtl_TextEncoding SAL_CALL osl_setThreadTextEncoding( rtl_TextEncoding Encoding )
+{
+ rtl_TextEncoding oldEncoding = osl_getThreadTextEncoding();
+
+ osl_setThreadKeyData( g_dwTLSTextEncodingIndex, (void*)Encoding);
+
+ return oldEncoding;
+}
+
+
+
diff --git a/sal/osl/os2/time.c b/sal/osl/os2/time.c
new file mode 100644
index 000000000000..c1a98a6b87a9
--- /dev/null
+++ b/sal/osl/os2/time.c
@@ -0,0 +1,269 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/time.h>
+
+/* FIXME: detection should be done in configure script */
+#if defined(MACOSX) || defined(FREEBSD) || defined(NETBSD) || defined(LINUX)
+#define STRUCT_TM_HAS_GMTOFF 1
+
+#elif defined(SOLARIS)
+#define HAS_ALTZONE 1
+#endif
+
+/*--------------------------------------------------
+ * osl_getSystemTime
+ *-------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getSystemTime(TimeValue* TimeValue)
+{
+ struct timeval tp;
+
+ /* FIXME: use higher resolution */
+ gettimeofday(&tp, NULL);
+
+ TimeValue->Seconds = tp.tv_sec;
+ TimeValue->Nanosec = tp.tv_usec * 1000;
+
+ return (sal_True);
+}
+
+
+/*--------------------------------------------------
+ * osl_getDateTimeFromTimeValue
+ *-------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getDateTimeFromTimeValue( TimeValue* pTimeVal, oslDateTime* pDateTime )
+{
+ struct tm *pSystemTime;
+ struct tm tmBuf;
+ time_t atime;
+
+ atime = (time_t)pTimeVal->Seconds;
+
+ /* Convert time from type time_t to struct tm */
+ pSystemTime = gmtime_r( &atime, &tmBuf );
+
+
+ /* Convert struct tm to struct oslDateTime */
+ if ( pSystemTime != NULL )
+ {
+ pDateTime->NanoSeconds = pTimeVal->Nanosec;
+ pDateTime->Seconds = pSystemTime->tm_sec;
+ pDateTime->Minutes = pSystemTime->tm_min;
+ pDateTime->Hours = pSystemTime->tm_hour;
+ pDateTime->Day = pSystemTime->tm_mday;
+ pDateTime->DayOfWeek = pSystemTime->tm_wday;
+ pDateTime->Month = pSystemTime->tm_mon + 1;
+ pDateTime->Year = pSystemTime->tm_year + 1900;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+/*--------------------------------------------------
+ * osl_getTimeValueFromDateTime
+ *--------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getTimeValueFromDateTime( oslDateTime* pDateTime, TimeValue* pTimeVal )
+{
+ struct tm aTime;
+ time_t nSeconds;
+
+ /* Convert struct oslDateTime to struct tm */
+ aTime.tm_sec = pDateTime->Seconds;
+ aTime.tm_min = pDateTime->Minutes;
+ aTime.tm_hour = pDateTime->Hours;
+ aTime.tm_mday = pDateTime->Day;
+ aTime.tm_wday = pDateTime->DayOfWeek;
+
+ if ( pDateTime->Month > 0 )
+ aTime.tm_mon = pDateTime->Month - 1;
+ else
+ return sal_False;
+
+ if ( pDateTime->Year >= 1900 )
+ aTime.tm_year = pDateTime->Year - 1900;
+ else
+ return sal_False;
+
+ aTime.tm_isdst = -1;
+ aTime.tm_wday = 0;
+ aTime.tm_yday = 0;
+
+ /* Convert time to calendar value */
+ nSeconds = mktime( &aTime );
+
+ /*
+ * mktime expects the struct tm to be in local timezone, so we have to adjust
+ * the returned value to be timezone neutral.
+ */
+
+ if ( nSeconds != (time_t) -1 )
+ {
+ time_t bias;
+
+ /* timezone corrections */
+ tzset();
+
+#if defined(STRUCT_TM_HAS_GMTOFF)
+ /* members of struct tm are corrected by mktime */
+ bias = 0 - aTime.tm_gmtoff;
+
+#elif defined(HAS_ALTZONE)
+ /* check if daylight saving time is in effect */
+ bias = aTime.tm_isdst > 0 ? altzone : timezone;
+#else
+ /* exspect daylight saving time to be one hour */
+ bias = aTime.tm_isdst > 0 ? timezone - 3600 : timezone;
+#endif
+
+ pTimeVal->Seconds = nSeconds;
+ pTimeVal->Nanosec = pDateTime->NanoSeconds;
+
+ if ( nSeconds > bias )
+ pTimeVal->Seconds -= bias;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+
+/*--------------------------------------------------
+ * osl_getLocalTimeFromSystemTime
+ *--------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getLocalTimeFromSystemTime( TimeValue* pSystemTimeVal, TimeValue* pLocalTimeVal )
+{
+ struct tm *pLocalTime;
+ struct tm tmBuf;
+ time_t bias;
+ time_t atime;
+
+ atime = (time_t) pSystemTimeVal->Seconds;
+ pLocalTime = localtime_r( &atime, &tmBuf );
+
+#if defined(STRUCT_TM_HAS_GMTOFF)
+ /* members of struct tm are corrected by mktime */
+ bias = 0 - pLocalTime->tm_gmtoff;
+
+#elif defined(HAS_ALTZONE)
+ /* check if daylight saving time is in effect */
+ bias = pLocalTime->tm_isdst > 0 ? altzone : timezone;
+#else
+ /* exspect daylight saving time to be one hour */
+ bias = pLocalTime->tm_isdst > 0 ? timezone - 3600 : timezone;
+#endif
+
+ if ( (sal_Int64) pSystemTimeVal->Seconds > bias )
+ {
+ pLocalTimeVal->Seconds = pSystemTimeVal->Seconds - bias;
+ pLocalTimeVal->Nanosec = pSystemTimeVal->Nanosec;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+/*--------------------------------------------------
+ * osl_getSystemTimeFromLocalTime
+ *--------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getSystemTimeFromLocalTime( TimeValue* pLocalTimeVal, TimeValue* pSystemTimeVal )
+{
+ struct tm *pLocalTime;
+ struct tm tmBuf;
+ time_t bias;
+ time_t atime;
+
+ atime = (time_t) pLocalTimeVal->Seconds;
+
+ /* Convert atime, which is a local time, to it's GMT equivalent. Then, get
+ * the timezone offset for the local time for the GMT equivalent time. Note
+ * that we cannot directly use local time to determine the timezone offset
+ * because GMT is the only reliable time that we can determine timezone
+ * offset from.
+ */
+
+ atime = mktime( gmtime_r( &atime, &tmBuf ) );
+ pLocalTime = localtime_r( &atime, &tmBuf );
+
+#if defined(STRUCT_TM_HAS_GMTOFF)
+ /* members of struct tm are corrected by mktime */
+ bias = 0 - pLocalTime->tm_gmtoff;
+
+#elif defined(HAS_ALTZONE)
+ /* check if daylight saving time is in effect */
+ bias = pLocalTime->tm_isdst > 0 ? altzone : timezone;
+#else
+ /* exspect daylight saving time to be one hour */
+ bias = pLocalTime->tm_isdst > 0 ? timezone - 3600 : timezone;
+#endif
+
+ if ( (sal_Int64) pLocalTimeVal->Seconds + bias > 0 )
+ {
+ pSystemTimeVal->Seconds = pLocalTimeVal->Seconds + bias;
+ pSystemTimeVal->Nanosec = pLocalTimeVal->Nanosec;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+
+
+static struct timeval startTime;
+static sal_Bool bGlobalTimer = sal_False;
+
+sal_uInt32 SAL_CALL osl_getGlobalTimer()
+{
+ struct timeval currentTime;
+ sal_uInt32 nSeconds;
+
+ // FIXME: not thread safe !!
+ if ( bGlobalTimer == sal_False )
+ {
+ gettimeofday( &startTime, NULL );
+ bGlobalTimer=sal_True;
+ }
+
+ gettimeofday( &currentTime, NULL );
+
+ nSeconds = (sal_uInt32)( currentTime.tv_sec - startTime.tv_sec );
+
+ return ( nSeconds * 1000 ) + (long) (( currentTime.tv_usec - startTime.tv_usec) / 1000 );
+}
diff --git a/sal/osl/os2/util.c b/sal/osl/os2/util.c
new file mode 100644
index 000000000000..cfe3eb76c622
--- /dev/null
+++ b/sal/osl/os2/util.c
@@ -0,0 +1,37 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "osl/util.h"
+
+
+
+extern sal_Bool osl_getEthernetAddress( sal_uInt8 * pTargetAddress )
+{
+ return sal_False;
+}
+
+
diff --git a/sal/osl/os2/uunxapi.cxx b/sal/osl/os2/uunxapi.cxx
new file mode 100644
index 000000000000..e86ad31264e0
--- /dev/null
+++ b/sal/osl/os2/uunxapi.cxx
@@ -0,0 +1,86 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ #ifndef _LIMITS_H
+ #include <limits.h>
+ #endif
+
+ #ifndef _RTL_USTRING_HXX_
+ #include <rtl/ustring.hxx>
+ #endif
+
+ #ifndef _OSL_THREAD_H_
+ #include <osl/thread.h>
+ #endif
+
+ #ifndef _OSL_UUNXAPI_HXX_
+ #include "uunxapi.hxx"
+ #endif
+
+ //###########################
+ //access_u
+ int access_u(const rtl_uString* pustrPath, int mode)
+ {
+ return access(OUStringToOString(pustrPath).getStr(), mode);
+ }
+
+ //#########################
+ //realpath_u
+ sal_Bool realpath_u(const rtl_uString* pustrFileName, rtl_uString** ppustrResolvedName)
+ {
+ rtl::OString fn = rtl::OUStringToOString(
+ rtl::OUString(const_cast<rtl_uString*>(pustrFileName)),
+ osl_getThreadTextEncoding());
+
+ char rp[PATH_MAX];
+ bool bRet = realpath(fn.getStr(), rp);
+
+ if (bRet)
+ {
+ rtl::OUString resolved = rtl::OStringToOUString(
+ rtl::OString(static_cast<sal_Char*>(rp)),
+ osl_getThreadTextEncoding());
+
+ rtl_uString_assign(ppustrResolvedName, resolved.pData);
+ }
+ return bRet;
+ }
+
+ //#########################
+ //lstat_u
+ int lstat_u(const rtl_uString* pustrPath, struct stat* buf)
+ {
+ return lstat(OUStringToOString(pustrPath).getStr(), buf);
+ }
+
+ //#########################
+ // @see mkdir
+ int mkdir_u(const rtl_uString* path, mode_t mode)
+ {
+ return mkdir(OUStringToOString(path).getStr(), mode);
+ }
+
diff --git a/sal/osl/os2/uunxapi.h b/sal/osl/os2/uunxapi.h
new file mode 100644
index 000000000000..9eddc5fe4753
--- /dev/null
+++ b/sal/osl/os2/uunxapi.h
@@ -0,0 +1,86 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ #ifndef _OSL_UUNXAPI_H_
+ #define _OSL_UUNXAPI_H_
+
+ #ifndef _UNISTD_H
+ #include <unistd.h>
+ #endif
+
+ #ifndef _STDLIB_H
+ #include <stdlib.h>
+ #endif
+
+ #ifndef _TYPES_H
+ #include <sys/types.h>
+ #endif
+
+ #ifndef _STAT_H
+ #include <sys/stat.h>
+ #endif
+
+ #ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+ #endif
+
+
+ #ifdef __cplusplus
+ extern "C"
+ {
+ #endif
+
+ /* @see access */
+ int access_u(const rtl_uString* pustrPath, int mode);
+
+ /***********************************
+ @descr
+ The return value differs from the
+ realpath function
+
+ @returns sal_True on success else
+ sal_False
+
+ @see realpath
+ **********************************/
+ sal_Bool realpath_u(
+ const rtl_uString* pustrFileName,
+ rtl_uString** ppustrResolvedName);
+
+ /* @see lstat */
+ int lstat_u(const rtl_uString* pustrPath, struct stat* buf);
+
+ /* @see mkdir */
+ int mkdir_u(const rtl_uString* path, mode_t mode);
+
+ #ifdef __cplusplus
+ }
+ #endif
+
+
+ #endif /* _OSL_UUNXAPI_H_ */
+
diff --git a/sal/osl/os2/uunxapi.hxx b/sal/osl/os2/uunxapi.hxx
new file mode 100644
index 000000000000..ab7e5cce890d
--- /dev/null
+++ b/sal/osl/os2/uunxapi.hxx
@@ -0,0 +1,106 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ #ifndef _OSL_UUNXAPI_HXX_
+ #define _OSL_UUNXAPI_HXX_
+
+ #ifndef _OSL_UUNXAPI_H_
+ #include "uunxapi.h"
+ #endif
+
+ #ifndef _RTL_USTRING_HXX_
+ #include <rtl/ustring.hxx>
+ #endif
+
+ //###########################
+ inline rtl::OString OUStringToOString(const rtl_uString* s)
+ {
+ return rtl::OUStringToOString(
+ rtl::OUString(const_cast<rtl_uString*>(s)),
+ osl_getThreadTextEncoding());
+ }
+
+ namespace osl
+ {
+
+ /***********************************
+ osl::access
+
+ @see access
+ **********************************/
+
+ inline int access(const rtl::OUString& ustrPath, int mode)
+ {
+ return access_u(ustrPath.pData, mode);
+ }
+
+ /***********************************
+ osl::realpath
+
+ @descr
+ The return value differs from the
+ realpath function
+
+ @returns sal_True on success else
+ sal_False
+
+ @see realpath
+ **********************************/
+
+ inline sal_Bool realpath(
+ const rtl::OUString& ustrFileName,
+ rtl::OUString& ustrResolvedName)
+ {
+ return realpath_u(ustrFileName.pData, &ustrResolvedName.pData);
+ }
+
+
+ /***********************************
+ osl::lstat
+
+ @see lstat
+ **********************************/
+
+ inline int lstat(const rtl::OUString& ustrPath, struct stat& buf)
+ {
+ return lstat_u(ustrPath.pData, &buf);
+ }
+
+ /***********************************
+ osl::mkdir
+ @see mkdir
+ **********************************/
+ inline int mkdir(const rtl::OUString& aPath, mode_t aMode)
+ {
+ return mkdir_u(aPath.pData, aMode);
+ }
+
+ } // end namespace osl
+
+
+ #endif /* _OSL_UUNXAPI_HXX_ */
+
diff --git a/sal/osl/unx/asm/interlck_sparc.s b/sal/osl/unx/asm/interlck_sparc.s
new file mode 100644
index 000000000000..a33e3539398e
--- /dev/null
+++ b/sal/osl/unx/asm/interlck_sparc.s
@@ -0,0 +1,267 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+/*
+ * Implements osl_[increment|decrement]InterlockedCount in two ways:
+ * sparcv8 architecture: use the "swap" instruction
+ * sparcv9/sparcv8plus architecture: use the "cas" instruction
+ *
+ * 32 bit mode with v8 and v8plus support:
+ * Initialize once with osl_InterlockedCountSetV9(int bv9) if you want to
+ * use the "cas" instruction, which is faster (no spinlock needed)
+ * Default is to use the "swap" instruction, which works on all supported
+ * SPARC cpu's
+ *
+ * osl_InterlockedCountSetV9(int bv9)
+ * bv9 = 0 use sparcv8 "swap" (spinlock)
+ * bv9 = 1 use sparcv9/sparcv8plus "cas" (no spinlock)
+ *
+ * 32 bit mode without v8 support (implies v8plus) or 64 bit mode:
+ * No need (nor the possibilty) to call osl_InterlockedCountSetV9(),
+ * sparcv9 mode is implied. Assemble with -xarch=v8plus (32 bit) or
+ * -xarch=v9 (64 bit).
+ *
+ */
+
+#if !defined(__sparcv8plus) && !defined(__sparcv9) && !defined(__sparc_v9__)
+
+.section ".data"
+.align 4
+osl_incrementInterLockCountFuncPtr:
+.word osl_incrementInterlockedCountV8
+.type osl_incrementInterLockCountFuncPtr,#object
+.size osl_incrementInterLockCountFuncPtr,4
+
+.align 4
+osl_decrementInterLockCountFuncPtr:
+.word osl_decrementInterlockedCountV8
+.type osl_decrementInterLockCountFuncPtr,#object
+.size osl_decrementInterLockCountFuncPtr,4
+
+.section ".text"
+
+#if defined(NETBSD) || defined(LINUX)
+/* add the address of the calling "call" instruction (stored in %o7) to
+ * %o5 which contains _GLOBAL_OFFSET_TABLE_
+ */
+.Laddoseven:
+ retl
+ add %o7, %o5, %o5
+#endif
+
+ .global osl_incrementInterlockedCount
+ .align 4
+
+osl_incrementInterlockedCount:
+
+#if defined(NETBSD) || defined(LINUX)
+ mov %o7, %g1
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o5
+ call .Laddoseven
+ add %o5, %lo(_GLOBAL_OFFSET_TABLE_+4), %o5
+ mov %g1, %o7
+#endif
+ set osl_incrementInterLockCountFuncPtr, %o1
+#if defined(NETBSD)
+ ld [%o1 + %o5], %o1
+#endif
+ ld [%o1], %o1
+ jmp %o1
+ nop ! delay slot
+ .type osl_incrementInterlockedCount,#function
+ .size osl_incrementInterlockedCount,.-osl_incrementInterlockedCount
+
+.section ".text"
+ .global osl_decrementInterlockedCount
+ .align 4
+
+osl_decrementInterlockedCount:
+
+#if defined(NETBSD) || defined(LINUX)
+ mov %o7, %g1
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o5
+ call .Laddoseven
+ add %o5, %lo(_GLOBAL_OFFSET_TABLE_+4), %o5
+ mov %g1, %o7
+#endif
+ set osl_decrementInterLockCountFuncPtr, %o1
+#if defined(NETBSD) || defined(LINUX)
+ ld [%o1 + %o5], %o1
+#endif
+ ld [%o1], %o1
+ jmp %o1
+ nop ! delay slot
+ .type osl_decrementInterlockedCount,#function
+ .size osl_decrementInterlockedCount,.-osl_decrementInterlockedCount
+
+.section ".text"
+ .global osl_InterlockedCountSetV9
+ .align 4
+
+osl_InterlockedCountSetV9:
+
+#if defined(NETBSD) || defined(LINUX)
+ mov %o7, %g1
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %o5
+ call .Laddoseven
+ add %o5, %lo(_GLOBAL_OFFSET_TABLE_+4), %o5
+ mov %g1, %o7
+#endif
+ set osl_incrementInterLockCountFuncPtr, %o1
+ set osl_decrementInterLockCountFuncPtr, %o2
+ cmp %o0, %g0
+ bnz 1f
+ nop ! delay slot
+ set osl_incrementInterlockedCountV8, %o0
+ set osl_decrementInterlockedCountV8, %o3
+#if defined(NETBSD) || defined(LINUX)
+ ld [%o0 + %o5], %o0
+ ld [%o1 + %o5], %o1
+ ld [%o2 + %o5], %o2
+ ld [%o3 + %o5], %o3
+#endif
+ st %o3,[%o2]
+ retl
+ st %o0,[%o1]
+1: set osl_incrementInterlockedCountV9, %o0
+ set osl_decrementInterlockedCountV9, %o3
+#if defined(NETBSD) || defined(LINUX)
+ ld [%o0 + %o5], %o0
+ ld [%o1 + %o5], %o1
+ ld [%o2 + %o5], %o2
+ ld [%o3 + %o5], %o3
+#endif
+ st %o3,[%o2]
+ retl
+ st %o0,[%o1]
+
+ .type osl_InterlockedCountSetV9,#function
+ .size osl_InterlockedCountSetV9,.-osl_InterlockedCountSetV9
+
+
+.section ".text"
+ .local osl_incrementInterlockedCountV8
+ .align 4
+
+! Implements osl_[increment|decrement]InterlockedCount with sparcv8 "swap" instruction.
+! Uses -4096 as lock value for spinlock to allow for small negative counts.
+
+osl_incrementInterlockedCountV8:
+
+1: ld [%o0], %o1
+ cmp %o1, -4096 ! test spinlock
+ be 1b
+ mov -4096, %o1 ! delay slot
+ swap [%o0], %o1
+ cmp %o1, -4096
+ be 1b
+ inc %o1 ! delay slot, if we got spinlock, increment count
+ st %o1, [%o0]
+ retl
+ mov %o1, %o0 ! delay slot
+
+ .type osl_incrementInterlockedCountV8,#function
+ .size osl_incrementInterlockedCountV8,.-osl_incrementInterlockedCountV8
+
+
+.section ".text"
+ .local osl_decrementInterlockedCountV8
+ .align 4
+
+osl_decrementInterlockedCountV8:
+
+1: ld [%o0], %o1
+ cmp %o1, -4096 ! test spinlock
+ be 1b
+ mov -4096, %o1 ! delay slot
+ swap [%o0], %o1
+ cmp %o1, -4096
+ be 1b
+ dec %o1 ! delay slot, if we got spinlock, decrement count
+ st %o1, [%o0] ! delay slot
+ retl
+ mov %o1, %o0 ! delay slot
+
+ .type osl_decrementInterlockedCountV8,#function
+ .size osl_decrementInterlockedCountV8,.-osl_decrementInterlockedCountV8
+
+#endif /* !__sparcv8plus && !__sparcv9 && !_sparcv9__ */
+
+.section ".text"
+#if defined(__sparcv8plus) || defined(__sparcv9) || defined(__sparc_v9__)
+#define osl_incrementInterlockedCountV9 osl_incrementInterlockedCount
+ .global osl_incrementInterlockedCountV9
+#else
+ .local osl_incrementInterlockedCountV9
+#endif
+ .align 8
+
+! Implements osl_[increment|decrement]InterlockedCount with sparcv9(sparcv8plus) "cas"
+! instruction.
+
+osl_incrementInterlockedCountV9:
+
+1: ld [%o0], %o1
+ add %o1, 1, %o2
+! allow linux to build for v8
+ .word 0xD5E21009
+! cas [%o0], %o1, %o2
+ cmp %o1, %o2
+ bne 1b
+ nop ! delay slot
+ retl
+ add %o2, 1, %o0 ! delay slot
+
+ .type osl_incrementInterlockedCountV9,#function
+ .size osl_incrementInterlockedCountV9,.-osl_incrementInterlockedCountV9
+
+
+.section ".text"
+#if defined(__sparcv8plus) || defined(__sparcv9) || defined(__sparc_v9__)
+#define osl_decrementInterlockedCountV9 osl_decrementInterlockedCount
+ .global osl_decrementInterlockedCountV9
+#else
+ .local osl_decrementInterlockedCountV9
+#endif
+ .align 8
+
+osl_decrementInterlockedCountV9:
+
+1: ld [%o0], %o1
+ sub %o1, 1, %o2
+! allow linux to build for v8
+ .word 0xD5E21009
+! cas [%o0], %o1, %o2
+ cmp %o1, %o2
+ bne 1b
+ nop ! delay slot
+ retl
+ sub %o2, 1, %o0 ! delay slot
+
+ .type osl_decrementInterlockedCountV9,#function
+ .size osl_decrementInterlockedCountV9,.-osl_decrementInterlockedCountV9
diff --git a/sal/osl/unx/asm/interlck_x86.s b/sal/osl/unx/asm/interlck_x86.s
new file mode 100644
index 000000000000..c1f99008d406
--- /dev/null
+++ b/sal/osl/unx/asm/interlck_x86.s
@@ -0,0 +1,92 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+.section .text,"ax"
+ .globl osl_incrementInterlockedCount
+
+osl_incrementInterlockedCount:
+
+ push %ebp
+ mov %esp,%ebp
+ push %ebx
+ call 1f
+1:
+ pop %ebx
+ add $_GLOBAL_OFFSET_TABLE_+0x1,%ebx
+ mov 8(%ebp),%ecx
+ mov $1,%eax
+ mov osl_isSingleCPU@GOT(%ebx),%edx
+ cmp $0,(%edx)
+ je 2f
+ xadd %eax,(%ecx)
+ jmp 3f
+2:
+ lock
+ xadd %eax,(%ecx)
+3:
+ inc %eax
+ pop %ebx
+ mov %ebp,%esp
+ pop %ebp
+ ret
+
+ .type osl_incrementInterlockedCount,@function
+ .size osl_incrementInterlockedCount,.-osl_incrementInterlockedCount
+
+.section .text,"ax"
+ .globl osl_decrementInterlockedCount
+
+osl_decrementInterlockedCount:
+
+ push %ebp
+ mov %esp,%ebp
+ push %ebx
+ call 1f
+1:
+ pop %ebx
+ add $_GLOBAL_OFFSET_TABLE_+0x1,%ebx
+ mov 8(%ebp),%ecx
+ orl $-1,%eax
+ mov osl_isSingleCPU@GOT(%ebx),%edx
+ cmp $0,(%edx)
+ je 2f
+ xadd %eax,(%ecx)
+ jmp 3f
+2:
+ lock
+ xadd %eax,(%ecx)
+3:
+ dec %eax
+ pop %ebx
+ mov %ebp,%esp
+ pop %ebp
+ ret
+
+ .type osl_decrementInterlockedCount,@function
+ .size osl_decrementInterlockedCount,.-osl_decrementInterlockedCount
+
diff --git a/sal/osl/unx/backtrace.c b/sal/osl/unx/backtrace.c
new file mode 100755
index 000000000000..00156b80f1d6
--- /dev/null
+++ b/sal/osl/unx/backtrace.c
@@ -0,0 +1,359 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifdef SOLARIS
+
+#include <dlfcn.h>
+#include <pthread.h>
+#include <setjmp.h>
+#include <stdio.h>
+#include <sys/frame.h>
+#include "backtrace.h"
+
+#if defined(SPARC)
+
+#if defined IS_LP64
+
+#define FRAME_PTR_OFFSET 1
+#define FRAME_OFFSET 0
+#define STACK_BIAS 0x7ff
+
+#else
+
+#define FRAME_PTR_OFFSET 1
+#define FRAME_OFFSET 0
+#define STACK_BIAS 0
+
+#endif
+
+#elif defined( INTEL )
+
+#define FRAME_PTR_OFFSET 3
+#define FRAME_OFFSET 0
+#define STACK_BIAS 0
+
+#else
+
+#error Unknown Solaris target platform.
+
+#endif /* defined SPARC or INTEL */
+
+
+int backtrace( void **buffer, int max_frames )
+{
+ jmp_buf ctx;
+ long fpval;
+ struct frame *fp;
+ int i;
+
+ /* flush register windows */
+#ifdef SPARC
+ asm("ta 3");
+#endif
+
+ /* get stack- and framepointer */
+ setjmp(ctx);
+
+ fpval = ((long*)(ctx))[FRAME_PTR_OFFSET];
+ fp = (struct frame*)((char*)(fpval) + STACK_BIAS);
+
+ for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++)
+ fp = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS);
+
+ /* iterate through backtrace */
+ for (i = 0; (fp != 0) && (fp->fr_savpc != 0) && (i < max_frames); i++)
+ {
+ /* saved (prev) frame */
+ struct frame * prev = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS);
+
+ /* store frame */
+ *(buffer++) = (void*)(fp->fr_savpc);
+
+ /* prev frame (w/ stack growing top down) */
+ fp = (prev > fp) ? prev : 0;
+ }
+
+ /* return number of frames stored */
+ return i;
+}
+
+void backtrace_symbols_fd( void **buffer, int size, int fd )
+{
+ FILE *fp = fdopen( fd, "w" );
+
+ if ( fp )
+ {
+ void **pFramePtr;
+
+ for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- )
+ {
+ Dl_info dli;
+ ptrdiff_t offset;
+
+ if ( 0 != dladdr( *pFramePtr, &dli ) )
+ {
+ if ( dli.dli_fname && dli.dli_fbase )
+ {
+ offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase;
+ fprintf( fp, "%s+0x%x", dli.dli_fname, offset );
+ }
+ if ( dli.dli_sname && dli.dli_saddr )
+ {
+ offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr;
+ fprintf( fp, "(%s+0x%x)", dli.dli_sname, offset );
+ }
+ }
+ fprintf( fp, "[0x%x]\n", *pFramePtr );
+ }
+
+ fflush( fp );
+ fclose( fp );
+ }
+}
+
+#endif /* defined SOLARIS */
+
+
+#if defined FREEBSD || defined NETBSD
+#include <dlfcn.h>
+#include <pthread.h>
+#include <setjmp.h>
+#include <stddef.h>
+#include <stdio.h>
+#include "backtrace.h"
+
+#define FRAME_PTR_OFFSET 1
+#define FRAME_OFFSET 0
+
+int backtrace( void **buffer, int max_frames )
+{
+ struct frame *fp;
+ jmp_buf ctx;
+ int i;
+ /* get stack- and framepointer */
+ setjmp(ctx);
+ fp = (struct frame*)(((size_t*)(ctx))[FRAME_PTR_OFFSET]);
+ for ( i=0; (i<FRAME_OFFSET) && (fp!=0); i++)
+ fp = fp->fr_savfp;
+ /* iterate through backtrace */
+ for (i=0; fp && fp->fr_savpc && i<max_frames; i++)
+ {
+ /* store frame */
+ *(buffer++) = (void *)fp->fr_savpc;
+ /* next frame */
+ fp=fp->fr_savfp;
+ }
+ return i;
+}
+
+void backtrace_symbols_fd( void **buffer, int size, int fd )
+{
+ FILE *fp = fdopen( fd, "w" );
+
+ if ( fp )
+ {
+ void **pFramePtr;
+ for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- )
+ {
+ Dl_info dli;
+ ptrdiff_t offset;
+
+ if ( 0 != dladdr( *pFramePtr, &dli ) )
+ {
+ if ( dli.dli_fname && dli.dli_fbase )
+ {
+ offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase;
+ fprintf( fp, "%s+0x%x", dli.dli_fname, offset );
+ }
+ if ( dli.dli_sname && dli.dli_saddr )
+ {
+ offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr;
+ fprintf( fp, "(%s+0x%x)", dli.dli_sname, offset );
+ }
+ }
+ fprintf( fp, "[0x%x]\n", *pFramePtr );
+ }
+ fflush( fp );
+ fclose( fp );
+ }
+}
+#endif /* defined FREEBSD */
+
+#ifdef LINUX
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <dlfcn.h>
+#include <pthread.h>
+#include <setjmp.h>
+#include <stdio.h>
+#include "backtrace.h"
+
+#if defined(SPARC)
+
+#define FRAME_PTR_OFFSET 1
+#define FRAME_OFFSET 0
+
+#else
+
+#error Unknown Linux target platform.
+
+#endif /* defined SPARC or INTEL */
+
+typedef int ptrdiff_t;
+
+int backtrace( void **buffer, int max_frames )
+{
+ struct frame *fp;
+ jmp_buf ctx;
+ int i;
+
+ /* flush register windows */
+#ifdef SPARC
+ asm("ta 3");
+#endif
+ /* get stack- and framepointer */
+ setjmp(ctx);
+ fp = (struct frame*)(((size_t*)(ctx))[FRAME_PTR_OFFSET]);
+ for ( i=0; (i<FRAME_OFFSET) && (fp!=0); i++)
+ fp = fp->fr_savfp;
+
+ /* iterate through backtrace */
+ for (i=0; fp && fp->fr_savpc && i<max_frames; i++)
+ {
+ /* store frame */
+ *(buffer++) = (void *)fp->fr_savpc;
+ /* next frame */
+ fp=fp->fr_savfp;
+ }
+ return i;
+}
+
+void backtrace_symbols_fd( void **buffer, int size, int fd )
+{
+ FILE *fp = fdopen( fd, "w" );
+
+ if ( fp )
+ {
+ void **pFramePtr;
+
+ for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- )
+ {
+ Dl_info dli;
+ ptrdiff_t offset;
+
+ if ( 0 != dladdr( *pFramePtr, &dli ) )
+ {
+ if ( dli.dli_fname && dli.dli_fbase )
+ {
+ offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase;
+ fprintf( fp, "%s+0x%x", dli.dli_fname, offset );
+ }
+ if ( dli.dli_sname && dli.dli_saddr )
+ {
+ offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr;
+ fprintf( fp, "(%s+0x%x)", dli.dli_sname, offset );
+ }
+ }
+ fprintf( fp, "[0x%x]\n", *pFramePtr );
+ }
+
+ fflush( fp );
+ fclose( fp );
+ }
+}
+
+#endif /* defined LINUX */
+
+#if defined( MACOSX )
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include "backtrace.h"
+
+typedef unsigned ptrdiff_t;
+
+/* glib backtrace is only available on MacOsX 10.5 or higher
+ so we do it on our own */
+
+int backtrace( void **buffer, int max_frames )
+{
+ void **frame = (void **)__builtin_frame_address(0);
+ void **bp = ( void **)(*frame);
+ void *ip = frame[1];
+ int i;
+
+ for ( i = 0; bp && ip && i < max_frames; i++ )
+ {
+ *(buffer++) = ip;
+
+ ip = bp[1];
+ bp = (void**)(bp[0]);
+ }
+
+ return i;
+}
+
+
+void backtrace_symbols_fd( void **buffer, int size, int fd )
+{
+ FILE *fp = fdopen( fd, "w" );
+
+ if ( fp )
+ {
+ void **pFramePtr;
+
+ for ( pFramePtr = buffer; size > 0 && pFramePtr && *pFramePtr; pFramePtr++, size-- )
+ {
+ Dl_info dli;
+ ptrdiff_t offset;
+
+ if ( 0 != dladdr( *pFramePtr, &dli ) )
+ {
+ if ( dli.dli_fname && dli.dli_fbase )
+ {
+ offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_fbase;
+ fprintf( fp, "%s+0x%x", dli.dli_fname, offset );
+ }
+ if ( dli.dli_sname && dli.dli_saddr )
+ {
+ offset = (ptrdiff_t)*pFramePtr - (ptrdiff_t)dli.dli_saddr;
+ fprintf( fp, "(%s+0x%x)", dli.dli_sname, offset );
+ }
+ }
+ fprintf( fp, "[0x%x]\n", (unsigned int)*pFramePtr );
+ }
+
+ fflush( fp );
+ fclose( fp );
+ }
+}
+
+#endif /* defined MACOSX */
diff --git a/sal/osl/unx/backtrace.h b/sal/osl/unx/backtrace.h
new file mode 100755
index 000000000000..1ca2ae84c4a0
--- /dev/null
+++ b/sal/osl/unx/backtrace.h
@@ -0,0 +1,99 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#if defined (SOLARIS) || (FREEBSD)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* backtrace function with same behaviour as defined in GNU libc */
+
+int backtrace( void **buffer, int max_frames );
+
+void backtrace_symbols_fd( void **buffer, int size, int fd );
+
+/* no frame.h on FreeBSD */
+#if defined FREEBSD
+struct frame {
+ long arg0[8];
+ long arg1[6];
+ struct frame *fr_savfp;
+ long fr_savpc;
+};
+#endif
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* defined SOLARIS || FREEBSD */
+
+#if defined (LINUX) && defined (SPARC)
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* backtrace function with same behaviour as defined in GNU libc */
+
+int backtrace( void **buffer, int max_frames );
+
+void backtrace_symbols_fd( void **buffer, int size, int fd );
+
+/* no frame.h on linux sparc */
+struct frame {
+ long arg0[8];
+ long arg1[6];
+ struct frame *fr_savfp;
+ long fr_savpc;
+};
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* defined LINUX && SPARC */
+
+#if defined (MACOSX)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* backtrace function with same behaviour as defined in GNU libc */
+
+int backtrace( void **buffer, int max_frames );
+
+void backtrace_symbols_fd( void **buffer, int size, int fd );
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* defined MACOSX */
diff --git a/sal/osl/unx/conditn.c b/sal/osl/unx/conditn.c
new file mode 100644
index 000000000000..ea701d221e55
--- /dev/null
+++ b/sal/osl/unx/conditn.c
@@ -0,0 +1,350 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+#include <sal/types.h>
+
+#include <osl/conditn.h>
+#include <osl/diagnose.h>
+#include <osl/time.h>
+
+
+typedef struct _oslConditionImpl
+{
+ pthread_cond_t m_Condition;
+ pthread_mutex_t m_Lock;
+ sal_Bool m_State;
+} oslConditionImpl;
+
+
+/*****************************************************************************/
+/* osl_createCondition */
+/*****************************************************************************/
+oslCondition SAL_CALL osl_createCondition()
+{
+ oslConditionImpl* pCond;
+ int nRet=0;
+
+ pCond = (oslConditionImpl*) malloc(sizeof(oslConditionImpl));
+
+ OSL_ASSERT(pCond);
+
+ if ( pCond == 0 )
+ {
+ return 0;
+ }
+
+ pCond->m_State = sal_False;
+
+ /* init condition variable with default attr. (PTHREAD_PROCESS_PRIVAT) */
+ nRet = pthread_cond_init(&pCond->m_Condition, PTHREAD_CONDATTR_DEFAULT);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_createCondition : condition init failed. Errno: %d; '%s'\n",
+ nRet, strerror(nRet));
+
+ free(pCond);
+ return 0;
+ }
+
+ nRet = pthread_mutex_init(&pCond->m_Lock, PTHREAD_MUTEXATTR_DEFAULT);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_createCondition : mutex init failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+
+ nRet = pthread_cond_destroy(&pCond->m_Condition);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_createCondition : destroy condition failed. Errno: %d; '%s'\n",
+ nRet, strerror(nRet));
+ }
+
+ free(pCond);
+ pCond = 0;
+ }
+
+ return (oslCondition)pCond;
+}
+
+/*****************************************************************************/
+/* osl_destroyCondition */
+/*****************************************************************************/
+void SAL_CALL osl_destroyCondition(oslCondition Condition)
+{
+ oslConditionImpl* pCond;
+ int nRet = 0;
+
+ if ( Condition )
+ {
+ pCond = (oslConditionImpl*)Condition;
+
+ nRet = pthread_cond_destroy(&pCond->m_Condition);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_destroyCondition : destroy condition failed. Errno: %d; '%s'\n",
+ nRet, strerror(nRet));
+ }
+ nRet = pthread_mutex_destroy(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_destroyCondition : destroy mutex failed. Errno: %d; '%s'\n",
+ nRet, strerror(nRet));
+ }
+
+ free(Condition);
+ }
+
+ return;
+}
+
+/*****************************************************************************/
+/* osl_setCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setCondition(oslCondition Condition)
+{
+ oslConditionImpl* pCond;
+ int nRet=0;
+
+ OSL_ASSERT(Condition);
+ pCond = (oslConditionImpl*)Condition;
+
+ if ( pCond == 0 )
+ {
+ return sal_False;
+ }
+
+ nRet = pthread_mutex_lock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_setCondition : mutex lock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ return sal_False;
+ }
+
+ pCond->m_State = sal_True;
+ nRet = pthread_cond_broadcast(&pCond->m_Condition);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_setCondition : condition broadcast failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ return sal_False;
+ }
+
+ nRet = pthread_mutex_unlock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_setCondition : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ return sal_False;
+ }
+
+ return sal_True;
+
+}
+
+/*****************************************************************************/
+/* osl_resetCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_resetCondition(oslCondition Condition)
+{
+ oslConditionImpl* pCond;
+ int nRet=0;
+
+ OSL_ASSERT(Condition);
+
+ pCond = (oslConditionImpl*)Condition;
+
+ if ( pCond == 0 )
+ {
+ return sal_False;
+ }
+
+ nRet = pthread_mutex_lock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_resetCondition : mutex lock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ return sal_False;
+ }
+
+ pCond->m_State = sal_False;
+
+ nRet = pthread_mutex_unlock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_resetCondition : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_waitCondition */
+/*****************************************************************************/
+oslConditionResult SAL_CALL osl_waitCondition(oslCondition Condition, const TimeValue* pTimeout)
+{
+ oslConditionImpl* pCond;
+ int nRet=0;
+ oslConditionResult Result = osl_cond_result_ok;
+
+ OSL_ASSERT(Condition);
+ pCond = (oslConditionImpl*)Condition;
+
+ if ( pCond == 0 )
+ {
+ return osl_cond_result_error;
+ }
+
+ nRet = pthread_mutex_lock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_waitCondition : mutex lock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ return osl_cond_result_error;
+ }
+
+ if ( pTimeout )
+ {
+ if ( ! pCond->m_State )
+ {
+ int ret;
+ struct timeval tp;
+ struct timespec to;
+
+ gettimeofday(&tp, NULL);
+
+ SET_TIMESPEC( to, tp.tv_sec + pTimeout->Seconds,
+ tp.tv_usec * 1000 + pTimeout->Nanosec );
+
+ /* spurious wake up prevention */
+ do
+ {
+ ret = pthread_cond_timedwait(&pCond->m_Condition, &pCond->m_Lock, &to);
+ if ( ret != 0 )
+ {
+ if ( ret == ETIME || ret == ETIMEDOUT )
+ {
+ Result = osl_cond_result_timeout;
+ nRet = pthread_mutex_unlock(&pCond->m_Lock);
+ if (nRet != 0)
+ {
+ OSL_TRACE("osl_waitCondition : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ }
+
+ return Result;
+ }
+ else if ( ret != EINTR )
+ {
+ Result = osl_cond_result_error;
+ nRet = pthread_mutex_unlock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_waitCondition : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ }
+ return Result;
+ }
+/* OSL_TRACE("EINTR\n");*/
+ }
+ }
+ while ( !pCond->m_State );
+ }
+ }
+ else
+ {
+ while ( !pCond->m_State )
+ {
+ nRet = pthread_cond_wait(&pCond->m_Condition, &pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_waitCondition : condition wait failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ Result = osl_cond_result_error;
+ nRet = pthread_mutex_unlock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_waitCondition : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ }
+
+ return Result;
+ }
+ }
+ }
+
+ nRet = pthread_mutex_unlock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_waitCondition : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ }
+
+ return Result;
+}
+
+/*****************************************************************************/
+/* osl_checkCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_checkCondition(oslCondition Condition)
+{
+ sal_Bool State;
+ oslConditionImpl* pCond;
+ int nRet=0;
+
+ OSL_ASSERT(Condition);
+ pCond = (oslConditionImpl*)Condition;
+
+ if ( pCond == 0 )
+ {
+ return sal_False;
+ }
+
+ nRet = pthread_mutex_lock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_checkCondition : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ }
+
+ State = pCond->m_State;
+
+ nRet = pthread_mutex_unlock(&pCond->m_Lock);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_checkCondition : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ }
+
+ return State;
+}
+
+
diff --git a/sal/osl/unx/diagnose.c b/sal/osl/unx/diagnose.c
new file mode 100644
index 000000000000..bb8cbca406bd
--- /dev/null
+++ b/sal/osl/unx/diagnose.c
@@ -0,0 +1,332 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "osl/diagnose.h"
+#include "system.h"
+
+
+#ifndef HAVE_DLFCN_H
+
+#if defined(LINUX) || defined(SOLARIS)
+#define HAVE_DLFCN_H
+#endif /* LINUX || SOLARIS */
+
+#endif /* HAVE_DLFCN_H */
+
+
+#ifdef HAVE_DLFCN_H
+
+#ifndef INCLUDED_DLFCN_H
+#include <dlfcn.h>
+#define INCLUDED_DLFCN_H
+#endif
+
+#endif /* HAVE_DLFCN_H */
+#include "osl/thread.h"
+
+#ifndef INCLUDED_PTHREAD_H
+#include <pthread.h>
+#define INCLUDED_PTHREAD_H
+#endif
+
+#ifndef INCLUDED_STDDEF_H
+#include <stddef.h>
+#define INCLUDED_STDDEF_H
+#endif
+
+/************************************************************************/
+/* Internal data structures and functions */
+/************************************************************************/
+
+static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+typedef pfunc_osl_printDebugMessage oslDebugMessageFunc;
+static oslDebugMessageFunc volatile g_pDebugMessageFunc = 0;
+
+typedef pfunc_osl_printDetailedDebugMessage oslDetailedDebugMessageFunc;
+static oslDetailedDebugMessageFunc volatile g_pDetailedDebugMessageFunc = 0;
+
+static void osl_diagnose_backtrace_Impl (
+ oslDebugMessageFunc f);
+
+#define OSL_DIAGNOSE_OUTPUTMESSAGE(f, s) \
+((f != 0) ? (*(f))((s)) : (void)fprintf(stderr, "%s", (s)))
+
+#if defined (LINUX) || defined (SOLARIS)
+/************************************************************************/
+/* osl_diagnose_frame_Impl */
+/************************************************************************/
+static void osl_diagnose_frame_Impl (
+ oslDebugMessageFunc f,
+ int depth,
+ void * pc)
+{
+ const char *fname = 0, *sname = 0;
+ void *fbase = 0, *saddr = 0;
+ ptrdiff_t offset;
+ char szMessage[1024];
+
+#ifdef INCLUDED_DLFCN_H
+ Dl_info dli;
+ if (dladdr (pc, &dli) != 0)
+ {
+ fname = dli.dli_fname;
+ fbase = dli.dli_fbase;
+ sname = dli.dli_sname;
+ saddr = dli.dli_saddr;
+ }
+#endif /* INCLUDED_DLFCN_H */
+
+ if (saddr)
+ offset = (ptrdiff_t)(pc) - (ptrdiff_t)(saddr);
+ else if (fbase)
+ offset = (ptrdiff_t)(pc) - (ptrdiff_t)(fbase);
+ else
+ offset = (ptrdiff_t)(pc);
+
+ snprintf (szMessage, sizeof(szMessage),
+ "Backtrace: [%d] %s: %s+0x%" SAL_PRI_PTRDIFFT "x\n",
+ depth,
+ fname ? fname : "<unknown>",
+ sname ? sname : "???",
+ offset);
+
+ OSL_DIAGNOSE_OUTPUTMESSAGE(f, szMessage);
+}
+#endif
+
+/************************************************************************/
+/* osl_diagnose_backtrace_Impl */
+/************************************************************************/
+#if defined(LINUX)
+
+#include <execinfo.h>
+
+#define FRAME_COUNT 64
+#define FRAME_OFFSET 1
+
+static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f)
+{
+ void * ppFrames[FRAME_COUNT];
+ int i, n;
+
+ n = backtrace (ppFrames, FRAME_COUNT);
+ for (i = FRAME_OFFSET; i < n; i++)
+ {
+ osl_diagnose_frame_Impl (f, (i - FRAME_OFFSET), ppFrames[i]);
+ }
+}
+
+#elif defined(SOLARIS)
+
+#include <pthread.h>
+#include <setjmp.h>
+#include <sys/frame.h>
+
+#if defined(SPARC)
+
+#if defined IS_LP64
+
+#define FRAME_PTR_OFFSET 1
+#define FRAME_OFFSET 0
+#define STACK_BIAS 0x7ff
+
+#else
+
+#define FRAME_PTR_OFFSET 1
+#define FRAME_OFFSET 0
+#define STACK_BIAS 0
+
+#endif
+
+#elif defined(INTEL)
+
+#define FRAME_PTR_OFFSET 3
+#define FRAME_OFFSET 0
+#define STACK_BIAS 0
+
+#endif /* (SPARC || INTEL) */
+
+static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f)
+{
+ jmp_buf ctx;
+ long fpval;
+ struct frame * fp;
+ int i;
+
+#if defined(SPARC)
+ asm("ta 3");
+#endif /* SPARC */
+ setjmp (ctx);
+
+ fpval = ((long*)(ctx))[FRAME_PTR_OFFSET];
+ fp = (struct frame*)((char*)(fpval) + STACK_BIAS);
+
+ for (i = 0; (i < FRAME_OFFSET) && (fp != 0); i++)
+ fp = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS);
+
+ for (i = 0; (fp != 0) && (fp->fr_savpc != 0); i++)
+ {
+ struct frame * prev = (struct frame*)((char*)(fp->fr_savfp) + STACK_BIAS);
+ osl_diagnose_frame_Impl (f, i, (void*)(fp->fr_savpc));
+ fp = (prev > fp) ? prev : 0;
+ }
+}
+
+#else /* (LINUX || SOLARIS) */
+
+static void osl_diagnose_backtrace_Impl (oslDebugMessageFunc f)
+{
+ /* not yet implemented */
+}
+
+#endif /* (LINUX || SOLARIS) */
+
+/************************************************************************/
+/* osl_assertFailedLine */
+/************************************************************************/
+sal_Bool SAL_CALL osl_assertFailedLine (
+ const sal_Char* pszFileName,
+ sal_Int32 nLine,
+ const sal_Char* pszMessage)
+{
+ oslDebugMessageFunc f = g_pDebugMessageFunc;
+ char szMessage[1024];
+
+ /* If there's a callback for detailed messages, use it */
+ if ( g_pDetailedDebugMessageFunc != NULL )
+ {
+ g_pDetailedDebugMessageFunc( pszFileName, nLine, pszMessage );
+ return sal_False;
+ }
+
+ /* if SAL assertions are disabled in general, stop here */
+ if ( getenv("DISABLE_SAL_DBGBOX") )
+ return sal_False;
+
+ /* format message into buffer */
+ if (pszMessage != 0)
+ {
+ snprintf(szMessage, sizeof(szMessage),
+ "Error: File %s, Line %" SAL_PRIdINT32 ": %s\n",
+ pszFileName, nLine, pszMessage);
+ }
+ else
+ {
+ snprintf(szMessage, sizeof(szMessage),
+ "Error: File %s, Line %" SAL_PRIdINT32 "\n",
+ pszFileName, nLine);
+ }
+
+ /* acquire lock to serialize output message(s) */
+ pthread_mutex_lock(&g_mutex);
+
+ /* output message buffer */
+ OSL_DIAGNOSE_OUTPUTMESSAGE(f, szMessage);
+
+ /* output backtrace */
+ osl_diagnose_backtrace_Impl(f);
+
+ /* release lock and leave, w/o calling osl_breakDebug() */
+ pthread_mutex_unlock(&g_mutex);
+ return sal_False;
+}
+
+/************************************************************************/
+/* osl_breakDebug */
+/************************************************************************/
+void SAL_CALL osl_breakDebug()
+{
+ exit(0);
+}
+
+/************************************************************************/
+/* osl_reportError */
+/************************************************************************/
+sal_Int32 SAL_CALL osl_reportError (
+ sal_uInt32 nType,
+ const sal_Char* pszMessage)
+{
+ (void) nType; /* unused */
+ fputs(pszMessage, stderr);
+ return 0;
+}
+
+/************************************************************************/
+/* osl_setDebugMessageFunc */
+/************************************************************************/
+oslDebugMessageFunc SAL_CALL osl_setDebugMessageFunc (
+ oslDebugMessageFunc pNewFunc)
+{
+ oslDebugMessageFunc pOldFunc = g_pDebugMessageFunc;
+ g_pDebugMessageFunc = pNewFunc;
+ return pOldFunc;
+}
+
+/************************************************************************/
+/* osl_setDetailedDebugMessageFunc */
+/************************************************************************/
+pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc (
+ pfunc_osl_printDetailedDebugMessage pNewFunc)
+{
+ oslDetailedDebugMessageFunc pOldFunc = g_pDetailedDebugMessageFunc;
+ g_pDetailedDebugMessageFunc = pNewFunc;
+ return pOldFunc;
+}
+
+/************************************************************************/
+/* osl_trace */
+/************************************************************************/
+/* comment this define to stop output thread identifier*/
+#define OSL_TRACE_THREAD 1
+void SAL_CALL osl_trace (
+ const sal_Char* lpszFormat, ...)
+{
+ va_list args;
+
+#if defined(OSL_PROFILING)
+ fprintf(stderr, "Time: %06lu : ", osl_getGlobalTimer() );
+#else
+#if defined(OSL_TRACE_THREAD)
+ fprintf(
+ stderr, "Thread: %6lu :",
+ SAL_INT_CAST(unsigned long, osl_getThreadIdentifier(NULL)));
+#else
+ fprintf(stderr, "Trace Message: ");
+#endif
+#endif
+
+ va_start(args, lpszFormat);
+ vfprintf(stderr, lpszFormat, args);
+ va_end(args);
+
+ fprintf(stderr,"\n");
+ fflush(stderr);
+}
+
+/************************************************************************/
+
diff --git a/sal/osl/unx/file.cxx b/sal/osl/unx/file.cxx
new file mode 100644
index 000000000000..cc0c041bc328
--- /dev/null
+++ b/sal/osl/unx/file.cxx
@@ -0,0 +1,1397 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "osl/file.hxx"
+
+#include "osl/diagnose.h"
+#include "rtl/alloc.h"
+
+#include "system.h"
+#include "file_error_transl.h"
+#include "file_url.h"
+
+#include <algorithm>
+#include <limits>
+
+#include <string.h>
+#include <pthread.h>
+#include <sys/mman.h>
+
+#if defined(MACOSX)
+
+#include <sys/param.h>
+#include <sys/mount.h>
+#define HAVE_O_EXLOCK
+
+// add MACOSX Time Value
+#define TimeValue CFTimeValue
+#include <CoreFoundation/CoreFoundation.h>
+#undef TimeValue
+
+#endif /* MACOSX */
+
+#ifdef DEBUG_OSL_FILE
+# define OSL_FILE_TRACE 0 ? (void)(0) : osl_trace
+# define PERROR( a, b ) perror( a ); fprintf( stderr, b )
+#else
+# define OSL_FILE_TRACE 1 ? (void)(0) : osl_trace
+# define PERROR( a, b )
+#endif
+
+/*******************************************************************
+ *
+ * FileHandle_Impl interface
+ *
+ ******************************************************************/
+struct FileHandle_Impl
+{
+ pthread_mutex_t m_mutex;
+ rtl_String * m_strFilePath; /* holds native file path */
+ int m_fd;
+
+ /** State
+ */
+ enum StateBits
+ {
+ STATE_SEEKABLE = 1, /* default */
+ STATE_READABLE = 2, /* default */
+ STATE_WRITEABLE = 4, /* open() sets, write() requires, else osl_File_E_BADF */
+ STATE_MODIFIED = 8 /* write() sets, flush() resets */
+ };
+ int m_state;
+
+ sal_uInt64 m_size; /* file size */
+ off_t m_offset; /* physical offset from begin of file */
+ off_t m_fileptr; /* logical offset from begin of file */
+
+ off_t m_bufptr; /* buffer offset from begin of file */
+ size_t m_buflen; /* buffer filled [0, m_bufsiz - 1] */
+
+ size_t m_bufsiz;
+ sal_uInt8 * m_buffer;
+
+ explicit FileHandle_Impl (int fd, char const * path = "<anon>");
+ ~FileHandle_Impl();
+
+ static void* operator new (size_t n);
+ static void operator delete (void * p, size_t);
+
+ static size_t getpagesize();
+
+ sal_uInt64 getPos() const;
+ oslFileError setPos (sal_uInt64 uPos);
+
+ sal_uInt64 getSize() const;
+ oslFileError setSize (sal_uInt64 uSize);
+
+ oslFileError readAt (
+ off_t nOffset,
+ void * pBuffer,
+ size_t nBytesRequested,
+ sal_uInt64 * pBytesRead);
+
+ oslFileError writeAt (
+ off_t nOffset,
+ void const * pBuffer,
+ size_t nBytesToWrite,
+ sal_uInt64 * pBytesWritten);
+
+ oslFileError readFileAt (
+ off_t nOffset,
+ void * pBuffer,
+ size_t nBytesRequested,
+ sal_uInt64 * pBytesRead);
+
+ oslFileError writeFileAt (
+ off_t nOffset,
+ void const * pBuffer,
+ size_t nBytesToWrite,
+ sal_uInt64 * pBytesWritten);
+
+ oslFileError readLineAt (
+ off_t nOffset,
+ sal_Sequence ** ppSequence,
+ sal_uInt64 * pBytesRead);
+
+ oslFileError writeSequence_Impl (
+ sal_Sequence ** ppSequence,
+ size_t * pnOffset,
+ const void * pBuffer,
+ size_t nBytes);
+
+ oslFileError syncFile();
+
+ /** Buffer cache / allocator.
+ */
+ class Allocator
+ {
+ rtl_cache_type * m_cache;
+ size_t m_bufsiz;
+
+ Allocator (Allocator const &);
+ Allocator & operator= (Allocator const &);
+
+ public:
+ static Allocator & get();
+
+ void allocate (sal_uInt8 ** ppBuffer, size_t * pnSize);
+ void deallocate (sal_uInt8 * pBuffer);
+
+ protected:
+ Allocator();
+ ~Allocator();
+ };
+
+ /** Guard.
+ */
+ class Guard
+ {
+ pthread_mutex_t * m_mutex;
+
+ public:
+ explicit Guard(pthread_mutex_t * pMutex);
+ ~Guard();
+ };
+};
+
+/*******************************************************************
+ *
+ * FileHandle_Impl implementation
+ *
+ ******************************************************************/
+
+FileHandle_Impl::Allocator &
+FileHandle_Impl::Allocator::get()
+{
+ static Allocator g_aBufferAllocator;
+ return g_aBufferAllocator;
+}
+
+FileHandle_Impl::Allocator::Allocator()
+ : m_cache (0),
+ m_bufsiz (0)
+{
+ size_t const pagesize = FileHandle_Impl::getpagesize();
+ if (size_t(-1) != pagesize)
+ {
+ m_cache = rtl_cache_create (
+ "osl_file_buffer_cache", pagesize, 0, 0, 0, 0, 0, 0, 0);
+ if (0 != m_cache)
+ m_bufsiz = pagesize;
+ }
+}
+FileHandle_Impl::Allocator::~Allocator()
+{
+ rtl_cache_destroy (m_cache), m_cache = 0;
+}
+
+void FileHandle_Impl::Allocator::allocate (sal_uInt8 ** ppBuffer, size_t * pnSize)
+{
+ OSL_PRECOND((0 != ppBuffer) && (0 != pnSize), "FileHandle_Impl::Allocator::allocate(): contract violation");
+ *ppBuffer = static_cast< sal_uInt8* >(rtl_cache_alloc(m_cache)), *pnSize = m_bufsiz;
+}
+void FileHandle_Impl::Allocator::deallocate (sal_uInt8 * pBuffer)
+{
+ if (0 != pBuffer)
+ rtl_cache_free (m_cache, pBuffer);
+}
+
+FileHandle_Impl::Guard::Guard(pthread_mutex_t * pMutex)
+ : m_mutex (pMutex)
+{
+ OSL_PRECOND (m_mutex != 0, "FileHandle_Impl::Guard::Guard(): null pointer.");
+ (void) pthread_mutex_lock (m_mutex); // ignoring EINVAL ...
+}
+FileHandle_Impl::Guard::~Guard()
+{
+ OSL_PRECOND (m_mutex != 0, "FileHandle_Impl::Guard::~Guard(): null pointer.");
+ (void) pthread_mutex_unlock (m_mutex);
+}
+
+FileHandle_Impl::FileHandle_Impl (int fd, char const * path)
+ : m_strFilePath (0),
+ m_fd (fd),
+ m_state (STATE_SEEKABLE | STATE_READABLE),
+ m_size (0),
+ m_offset (0),
+ m_fileptr (0),
+ m_bufptr (-1),
+ m_buflen (0),
+ m_bufsiz (0),
+ m_buffer (0)
+{
+ (void) pthread_mutex_init(&m_mutex, 0);
+ rtl_string_newFromStr (&m_strFilePath, path);
+ Allocator::get().allocate (&m_buffer, &m_bufsiz);
+ if (0 != m_buffer)
+ memset (m_buffer, 0, m_bufsiz);
+}
+FileHandle_Impl::~FileHandle_Impl()
+{
+ Allocator::get().deallocate (m_buffer), m_buffer = 0;
+ rtl_string_release (m_strFilePath), m_strFilePath = 0;
+ (void) pthread_mutex_destroy(&m_mutex); // ignoring EBUSY ...
+}
+
+void* FileHandle_Impl::operator new (size_t n)
+{
+ return rtl_allocateMemory(n);
+}
+void FileHandle_Impl::operator delete (void * p, size_t)
+{
+ rtl_freeMemory(p);
+}
+
+size_t FileHandle_Impl::getpagesize()
+{
+#if defined(FREEBSD) || defined(NETBSD) || defined(MACOSX)
+ return sal::static_int_cast< size_t >(::getpagesize());
+#else /* POSIX */
+ return sal::static_int_cast< size_t >(::sysconf(_SC_PAGESIZE));
+#endif /* xBSD || POSIX */
+}
+
+sal_uInt64 FileHandle_Impl::getPos() const
+{
+ return sal::static_int_cast< sal_uInt64 >(m_fileptr);
+}
+
+oslFileError FileHandle_Impl::setPos (sal_uInt64 uPos)
+{
+ OSL_FILE_TRACE("FileHandle_Impl::setPos(%d, %lld) => %lld", m_fd, getPos(), uPos);
+ m_fileptr = sal::static_int_cast< off_t >(uPos);
+ return osl_File_E_None;
+}
+
+sal_uInt64 FileHandle_Impl::getSize() const
+{
+ off_t const bufend = std::max((off_t)(0), m_bufptr) + m_buflen;
+ return std::max(m_size, sal::static_int_cast< sal_uInt64 >(bufend));
+}
+
+oslFileError FileHandle_Impl::setSize (sal_uInt64 uSize)
+{
+ off_t const nSize = sal::static_int_cast< off_t >(uSize);
+ if (-1 == ftruncate (m_fd, nSize))
+ {
+ /* Failure. Save original result. Try fallback algorithm */
+ oslFileError result = oslTranslateFileError (OSL_FET_ERROR, errno);
+
+ /* Check against current size. Fail upon 'shrink' */
+ if (uSize <= getSize())
+ {
+ /* Failure upon 'shrink'. Return original result */
+ return (result);
+ }
+
+ /* Save current position */
+ off_t const nCurPos = (off_t)lseek (m_fd, (off_t)0, SEEK_CUR);
+ if (nCurPos == (off_t)(-1))
+ return (result);
+
+ /* Try 'expand' via 'lseek()' and 'write()' */
+ if (-1 == lseek (m_fd, (off_t)(nSize - 1), SEEK_SET))
+ return (result);
+
+ if (-1 == write (m_fd, (char*)"", (size_t)1))
+ {
+ /* Failure. Restore saved position */
+ (void) lseek (m_fd, (off_t)(nCurPos), SEEK_SET);
+ return (result);
+ }
+
+ /* Success. Restore saved position */
+ if (-1 == lseek (m_fd, (off_t)nCurPos, SEEK_SET))
+ return (result);
+ }
+
+ OSL_FILE_TRACE("osl_setFileSize(%d, %lld) => %ld", m_fd, getSize(), nSize);
+ m_size = sal::static_int_cast< sal_uInt64 >(nSize);
+ return osl_File_E_None;
+}
+
+oslFileError FileHandle_Impl::readAt (
+ off_t nOffset,
+ void * pBuffer,
+ size_t nBytesRequested,
+ sal_uInt64 * pBytesRead)
+{
+ OSL_PRECOND((m_state & STATE_SEEKABLE), "FileHandle_Impl::readAt(): not seekable");
+ if (!(m_state & STATE_SEEKABLE))
+ return osl_File_E_SPIPE;
+
+ OSL_PRECOND((m_state & STATE_READABLE), "FileHandle_Impl::readAt(): not readable");
+ if (!(m_state & STATE_READABLE))
+ return osl_File_E_BADF;
+
+#if defined(LINUX) || defined(SOLARIS)
+
+ ssize_t nBytes = ::pread (m_fd, pBuffer, nBytesRequested, nOffset);
+ if ((-1 == nBytes) && (EOVERFLOW == errno))
+ {
+ /* Some 'pread()'s fail with EOVERFLOW when reading at (or past)
+ * end-of-file, different from 'lseek() + read()' behaviour.
+ * Returning '0 bytes read' and 'osl_File_E_None' instead.
+ */
+ nBytes = 0;
+ }
+ if (-1 == nBytes)
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+
+#else /* !(LINUX || SOLARIS) */
+
+ if (nOffset != m_offset)
+ {
+ if (-1 == ::lseek (m_fd, nOffset, SEEK_SET))
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+ m_offset = nOffset;
+ }
+
+ ssize_t nBytes = ::read (m_fd, pBuffer, nBytesRequested);
+ if (-1 == nBytes)
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+ m_offset += nBytes;
+
+#endif /* !(LINUX || SOLARIS) */
+
+ OSL_FILE_TRACE("FileHandle_Impl::readAt(%d, %lld, %ld)", m_fd, nOffset, nBytes);
+ *pBytesRead = nBytes;
+ return osl_File_E_None;
+}
+
+oslFileError FileHandle_Impl::writeAt (
+ off_t nOffset,
+ void const * pBuffer,
+ size_t nBytesToWrite,
+ sal_uInt64 * pBytesWritten)
+{
+ OSL_PRECOND((m_state & STATE_SEEKABLE), "FileHandle_Impl::writeAt(): not seekable");
+ if (!(m_state & STATE_SEEKABLE))
+ return osl_File_E_SPIPE;
+
+ OSL_PRECOND((m_state & STATE_WRITEABLE), "FileHandle_Impl::writeAt(): not writeable");
+ if (!(m_state & STATE_WRITEABLE))
+ return osl_File_E_BADF;
+
+#if defined(LINUX) || defined(SOLARIS)
+
+ ssize_t nBytes = ::pwrite (m_fd, pBuffer, nBytesToWrite, nOffset);
+ if (-1 == nBytes)
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+
+#else /* !(LINUX || SOLARIS) */
+
+ if (nOffset != m_offset)
+ {
+ if (-1 == ::lseek (m_fd, nOffset, SEEK_SET))
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+ m_offset = nOffset;
+ }
+
+ ssize_t nBytes = ::write (m_fd, pBuffer, nBytesToWrite);
+ if (-1 == nBytes)
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+ m_offset += nBytes;
+
+#endif /* !(LINUX || SOLARIS) */
+
+ OSL_FILE_TRACE("FileHandle_Impl::writeAt(%d, %lld, %ld)", m_fd, nOffset, nBytes);
+ m_size = std::max (m_size, sal::static_int_cast< sal_uInt64 >(nOffset + nBytes));
+
+ *pBytesWritten = nBytes;
+ return osl_File_E_None;
+}
+
+oslFileError FileHandle_Impl::readFileAt (
+ off_t nOffset,
+ void * pBuffer,
+ size_t nBytesRequested,
+ sal_uInt64 * pBytesRead)
+{
+ if (0 == (m_state & STATE_SEEKABLE))
+ {
+ // not seekable (pipe)
+ ssize_t nBytes = ::read (m_fd, pBuffer, nBytesRequested);
+ if (-1 == nBytes)
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+ *pBytesRead = nBytes;
+ return osl_File_E_None;
+ }
+ else if (0 == m_buffer)
+ {
+ // not buffered
+ return readAt (nOffset, pBuffer, nBytesRequested, pBytesRead);
+ }
+ else
+ {
+ sal_uInt8 * buffer = static_cast<sal_uInt8*>(pBuffer);
+ for (*pBytesRead = 0; nBytesRequested > 0; )
+ {
+ off_t const bufptr = (nOffset / m_bufsiz) * m_bufsiz;
+ size_t const bufpos = (nOffset % m_bufsiz);
+
+ if (bufptr != m_bufptr)
+ {
+ // flush current buffer
+ oslFileError result = syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = -1, m_buflen = 0;
+
+ if (nBytesRequested >= m_bufsiz)
+ {
+ // buffer too small, read through from file
+ sal_uInt64 uDone = 0;
+ result = readAt (nOffset, &(buffer[*pBytesRead]), nBytesRequested, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+
+ nBytesRequested -= uDone, *pBytesRead += uDone;
+ return osl_File_E_None;
+ }
+
+ // update buffer (pointer)
+ sal_uInt64 uDone = 0;
+ result = readAt (bufptr, m_buffer, m_bufsiz, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = bufptr, m_buflen = uDone;
+ }
+ if (bufpos >= m_buflen)
+ {
+ // end of file
+ return osl_File_E_None;
+ }
+
+ size_t const bytes = std::min (m_buflen - bufpos, nBytesRequested);
+ OSL_FILE_TRACE("FileHandle_Impl::readFileAt(%d, %lld, %ld)", m_fd, nOffset, bytes);
+
+ memcpy (&(buffer[*pBytesRead]), &(m_buffer[bufpos]), bytes);
+ nBytesRequested -= bytes, *pBytesRead += bytes, nOffset += bytes;
+ }
+ return osl_File_E_None;
+ }
+}
+
+oslFileError FileHandle_Impl::writeFileAt (
+ off_t nOffset,
+ void const * pBuffer,
+ size_t nBytesToWrite,
+ sal_uInt64 * pBytesWritten)
+{
+ if (0 == (m_state & STATE_SEEKABLE))
+ {
+ // not seekable (pipe)
+ ssize_t nBytes = ::write (m_fd, pBuffer, nBytesToWrite);
+ if (-1 == nBytes)
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+ *pBytesWritten = nBytes;
+ return osl_File_E_None;
+ }
+ else if (0 == m_buffer)
+ {
+ // not buffered
+ return writeAt (nOffset, pBuffer, nBytesToWrite, pBytesWritten);
+ }
+ else
+ {
+ sal_uInt8 const * buffer = static_cast<sal_uInt8 const *>(pBuffer);
+ for (*pBytesWritten = 0; nBytesToWrite > 0; )
+ {
+ off_t const bufptr = (nOffset / m_bufsiz) * m_bufsiz;
+ size_t const bufpos = (nOffset % m_bufsiz);
+ if (bufptr != m_bufptr)
+ {
+ // flush current buffer
+ oslFileError result = syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = -1, m_buflen = 0;
+
+ if (nBytesToWrite >= m_bufsiz)
+ {
+ // buffer to small, write through to file
+ sal_uInt64 uDone = 0;
+ result = writeAt (nOffset, &(buffer[*pBytesWritten]), nBytesToWrite, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ if (uDone != nBytesToWrite)
+ return osl_File_E_IO;
+
+ nBytesToWrite -= uDone, *pBytesWritten += uDone;
+ return osl_File_E_None;
+ }
+
+ // update buffer (pointer)
+ sal_uInt64 uDone = 0;
+ result = readAt (bufptr, m_buffer, m_bufsiz, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = bufptr, m_buflen = uDone;
+ }
+
+ size_t const bytes = std::min (m_bufsiz - bufpos, nBytesToWrite);
+ OSL_FILE_TRACE("FileHandle_Impl::writeFileAt(%d, %lld, %ld)", m_fd, nOffset, bytes);
+
+ memcpy (&(m_buffer[bufpos]), &(buffer[*pBytesWritten]), bytes);
+ nBytesToWrite -= bytes, *pBytesWritten += bytes, nOffset += bytes;
+
+ m_buflen = std::max(m_buflen, bufpos + bytes);
+ m_state |= STATE_MODIFIED;
+ }
+ return osl_File_E_None;
+ }
+}
+
+oslFileError FileHandle_Impl::readLineAt (
+ off_t nOffset,
+ sal_Sequence ** ppSequence,
+ sal_uInt64 * pBytesRead)
+{
+ oslFileError result = osl_File_E_None;
+
+ off_t bufptr = nOffset / m_bufsiz * m_bufsiz;
+ if (bufptr != m_bufptr)
+ {
+ /* flush current buffer */
+ result = syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+
+ /* update buffer (pointer) */
+ sal_uInt64 uDone = 0;
+ result = readAt (bufptr, m_buffer, m_bufsiz, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+
+ m_bufptr = bufptr, m_buflen = uDone;
+ }
+
+ static int const LINE_STATE_BEGIN = 0;
+ static int const LINE_STATE_CR = 1;
+ static int const LINE_STATE_LF = 2;
+
+ size_t bufpos = nOffset - m_bufptr, curpos = bufpos, dstpos = 0;
+ int state = (bufpos >= m_buflen) ? LINE_STATE_LF : LINE_STATE_BEGIN;
+
+ for ( ; state != LINE_STATE_LF; )
+ {
+ if (curpos >= m_buflen)
+ {
+ /* buffer examined */
+ if (0 < (curpos - bufpos))
+ {
+ /* flush buffer to sequence */
+ result = writeSequence_Impl (
+ ppSequence, &dstpos, &(m_buffer[bufpos]), curpos - bufpos);
+ if (result != osl_File_E_None)
+ return (result);
+ *pBytesRead += curpos - bufpos, nOffset += curpos - bufpos;
+ }
+
+ bufptr = nOffset / m_bufsiz * m_bufsiz;
+ if (bufptr != m_bufptr)
+ {
+ /* update buffer (pointer) */
+ sal_uInt64 uDone = 0;
+ result = readAt (bufptr, m_buffer, m_bufsiz, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = bufptr, m_buflen = uDone;
+ }
+
+ bufpos = nOffset - m_bufptr, curpos = bufpos;
+ if (bufpos >= m_buflen)
+ break;
+ }
+ switch (state)
+ {
+ case LINE_STATE_CR:
+ state = LINE_STATE_LF;
+ switch (m_buffer[curpos])
+ {
+ case 0x0A: /* CRLF */
+ /* eat current char */
+ curpos++;
+ break;
+ default: /* single CR */
+ /* keep current char */
+ break;
+ }
+ break;
+ default:
+ /* determine next state */
+ switch (m_buffer[curpos])
+ {
+ case 0x0A: /* single LF */
+ state = LINE_STATE_LF;
+ break;
+ case 0x0D: /* CR */
+ state = LINE_STATE_CR;
+ break;
+ default: /* advance to next char */
+ curpos++;
+ break;
+ }
+ if (state != LINE_STATE_BEGIN)
+ {
+ /* store (and eat) the newline char */
+ m_buffer[curpos] = 0x0A, curpos++;
+
+ /* flush buffer to sequence */
+ result = writeSequence_Impl (
+ ppSequence, &dstpos, &(m_buffer[bufpos]), curpos - bufpos - 1);
+ if (result != osl_File_E_None)
+ return (result);
+ *pBytesRead += curpos - bufpos, nOffset += curpos - bufpos;
+ }
+ break;
+ }
+ }
+
+ result = writeSequence_Impl (ppSequence, &dstpos, 0, 0);
+ if (result != osl_File_E_None)
+ return (result);
+ if (0 < dstpos)
+ return osl_File_E_None;
+ if (bufpos >= m_buflen)
+ return osl_File_E_AGAIN;
+ return osl_File_E_None;
+}
+
+oslFileError FileHandle_Impl::writeSequence_Impl (
+ sal_Sequence ** ppSequence,
+ size_t * pnOffset,
+ const void * pBuffer,
+ size_t nBytes)
+{
+ sal_Int32 nElements = *pnOffset + nBytes;
+ if (!*ppSequence)
+ {
+ /* construct sequence */
+ rtl_byte_sequence_constructNoDefault(ppSequence, nElements);
+ }
+ else if (nElements != (*ppSequence)->nElements)
+ {
+ /* resize sequence */
+ rtl_byte_sequence_realloc(ppSequence, nElements);
+ }
+ if (*ppSequence != 0)
+ {
+ /* fill sequence */
+ memcpy(&((*ppSequence)->elements[*pnOffset]), pBuffer, nBytes), *pnOffset += nBytes;
+ }
+ return (*ppSequence != 0) ? osl_File_E_None : osl_File_E_NOMEM;
+}
+
+oslFileError FileHandle_Impl::syncFile()
+{
+ oslFileError result = osl_File_E_None;
+ if (m_state & STATE_MODIFIED)
+ {
+ sal_uInt64 uDone = 0;
+ result = writeAt (m_bufptr, m_buffer, m_buflen, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ if (uDone != m_buflen)
+ return osl_File_E_IO;
+ m_state &= ~STATE_MODIFIED;
+ }
+ return (result);
+}
+
+/****************************************************************************
+ * osl_createFileHandleFromFD
+ ***************************************************************************/
+extern "C" oslFileHandle osl_createFileHandleFromFD( int fd )
+{
+ if (-1 == fd)
+ return 0; // EINVAL
+
+ struct stat aFileStat;
+ if (-1 == fstat (fd, &aFileStat))
+ return 0; // EBADF
+
+ FileHandle_Impl * pImpl = new FileHandle_Impl (fd);
+ if (0 == pImpl)
+ return 0; // ENOMEM
+
+ // assume writeable
+ pImpl->m_state |= FileHandle_Impl::STATE_WRITEABLE;
+ if (!S_ISREG(aFileStat.st_mode))
+ {
+ /* not a regular file, mark not seekable */
+ pImpl->m_state &= ~FileHandle_Impl::STATE_SEEKABLE;
+ }
+ else
+ {
+ /* regular file, init current size */
+ pImpl->m_size = sal::static_int_cast< sal_uInt64 >(aFileStat.st_size);
+ }
+
+ OSL_FILE_TRACE("osl_createFileHandleFromFD(%d, writeable) => %s",
+ pImpl->m_fd, rtl_string_getStr(pImpl->m_strFilePath));
+ return (oslFileHandle)(pImpl);
+}
+
+/*******************************************************************
+ * osl_file_adjustLockFlags
+ ******************************************************************/
+static int osl_file_adjustLockFlags (const char * path, int flags)
+{
+#ifdef MACOSX
+ /*
+ * The AFP implementation of MacOS X 10.4 treats O_EXLOCK in a way
+ * that makes it impossible for OOo to create a backup copy of the
+ * file it keeps opened. OTOH O_SHLOCK for AFP behaves as desired by
+ * the OOo file handling, so we need to check the path of the file
+ * for the filesystem name.
+ */
+ struct statfs s;
+ if( 0 <= statfs( path, &s ) )
+ {
+ if( 0 == strncmp("afpfs", s.f_fstypename, 5) )
+ {
+ flags &= ~O_EXLOCK;
+ flags |= O_SHLOCK;
+ }
+ else
+ {
+ /* Needed flags to allow opening a webdav file */
+ flags &= ~(O_EXLOCK | O_SHLOCK | O_NONBLOCK);
+ }
+ }
+#endif /* MACOSX */
+
+ (void) path;
+ return flags;
+}
+
+/****************************************************************************
+ * osl_file_queryLocking
+ ***************************************************************************/
+struct Locking_Impl
+{
+ int m_enabled;
+ Locking_Impl() : m_enabled(0)
+ {
+#ifndef HAVE_O_EXLOCK
+ m_enabled = ((getenv("SAL_ENABLE_FILE_LOCKING") != 0) || (getenv("STAR_ENABLE_FILE_LOCKING") != 0));
+#endif /* HAVE_O_EXLOCK */
+ }
+};
+static int osl_file_queryLocking (sal_uInt32 uFlags)
+{
+ if (!(uFlags & osl_File_OpenFlag_NoLock))
+ {
+ if ((uFlags & osl_File_OpenFlag_Write) || (uFlags & osl_File_OpenFlag_Create))
+ {
+ static Locking_Impl g_locking;
+ return (g_locking.m_enabled != 0);
+ }
+ }
+ return 0;
+}
+
+/****************************************************************************
+ * osl_openFile
+ ***************************************************************************/
+#ifdef HAVE_O_EXLOCK
+#define OPEN_WRITE_FLAGS ( O_RDWR | O_EXLOCK | O_NONBLOCK )
+#define OPEN_CREATE_FLAGS ( O_CREAT | O_EXCL | O_RDWR | O_EXLOCK | O_NONBLOCK )
+#else
+#define OPEN_WRITE_FLAGS ( O_RDWR )
+#define OPEN_CREATE_FLAGS ( O_CREAT | O_EXCL | O_RDWR )
+#endif
+
+oslFileError
+SAL_CALL osl_openFile( rtl_uString* ustrFileURL, oslFileHandle* pHandle, sal_uInt32 uFlags )
+{
+ oslFileError eRet;
+
+ if ((ustrFileURL == 0) || (ustrFileURL->length == 0) || (pHandle == 0))
+ return osl_File_E_INVAL;
+
+ /* convert file URL to system path */
+ char buffer[PATH_MAX];
+ eRet = FileURLToPath (buffer, sizeof(buffer), ustrFileURL);
+ if (eRet != osl_File_E_None)
+ return eRet;
+#ifdef MACOSX
+ if (macxp_resolveAlias (buffer, sizeof(buffer)) != 0)
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+#endif /* MACOSX */
+
+ /* set mode and flags */
+ int mode = S_IRUSR | S_IRGRP | S_IROTH;
+ int flags = O_RDONLY;
+ if (uFlags & osl_File_OpenFlag_Write)
+ {
+ mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+ flags = OPEN_WRITE_FLAGS;
+ }
+ if (uFlags & osl_File_OpenFlag_Create)
+ {
+ mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+ flags = OPEN_CREATE_FLAGS;
+ }
+ if (uFlags & osl_File_OpenFlag_NoLock)
+ {
+#ifdef HAVE_O_EXLOCK
+ flags &= ~(O_EXLOCK | O_SHLOCK | O_NONBLOCK);
+#endif /* HAVE_O_EXLOCK */
+ }
+ else
+ {
+ flags = osl_file_adjustLockFlags (buffer, flags);
+ }
+
+ /* open the file */
+ int fd = open( buffer, flags, mode );
+ if (-1 == fd)
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+
+ /* reset O_NONBLOCK flag */
+ if (flags & O_NONBLOCK)
+ {
+ int f = fcntl (fd, F_GETFL, 0);
+ if (-1 == f)
+ {
+ eRet = oslTranslateFileError (OSL_FET_ERROR, errno);
+ (void) close(fd);
+ return eRet;
+ }
+ if (-1 == fcntl (fd, F_SETFL, (f & ~O_NONBLOCK)))
+ {
+ eRet = oslTranslateFileError (OSL_FET_ERROR, errno);
+ (void) close(fd);
+ return eRet;
+ }
+ }
+
+ /* get file status (mode, size) */
+ struct stat aFileStat;
+ if (-1 == fstat (fd, &aFileStat))
+ {
+ eRet = oslTranslateFileError (OSL_FET_ERROR, errno);
+ (void) close(fd);
+ return eRet;
+ }
+ if (!S_ISREG(aFileStat.st_mode))
+ {
+ /* we only open regular files here */
+ (void) close(fd);
+ return osl_File_E_INVAL;
+ }
+
+ if (osl_file_queryLocking (uFlags))
+ {
+#ifdef MACOSX
+ if (-1 == flock (fd, LOCK_EX | LOCK_NB))
+ {
+ /* Mac OSX returns ENOTSUP for webdav drives. We should try read lock */
+ if ((errno != ENOTSUP) || ((-1 == flock (fd, LOCK_SH | LOCK_NB)) && (errno != ENOTSUP)))
+ {
+ eRet = oslTranslateFileError (OSL_FET_ERROR, errno);
+ (void) close(fd);
+ return eRet;
+ }
+ }
+#else /* F_SETLK */
+ {
+ struct flock aflock;
+
+ aflock.l_type = F_WRLCK;
+ aflock.l_whence = SEEK_SET;
+ aflock.l_start = 0;
+ aflock.l_len = 0;
+
+ if (-1 == fcntl (fd, F_SETLK, &aflock))
+ {
+ eRet = oslTranslateFileError (OSL_FET_ERROR, errno);
+ (void) close(fd);
+ return eRet;
+ }
+ }
+#endif /* F_SETLK */
+ }
+
+ /* allocate memory for impl structure */
+ FileHandle_Impl * pImpl = new FileHandle_Impl (fd, buffer);
+ if (!pImpl)
+ {
+ eRet = oslTranslateFileError (OSL_FET_ERROR, ENOMEM);
+ (void) close(fd);
+ return eRet;
+ }
+ if (flags & O_RDWR)
+ pImpl->m_state |= FileHandle_Impl::STATE_WRITEABLE;
+ pImpl->m_size = sal::static_int_cast< sal_uInt64 >(aFileStat.st_size);
+
+ OSL_TRACE("osl_openFile(%d, %s) => %s", pImpl->m_fd,
+ flags & O_RDWR ? "writeable":"readonly",
+ rtl_string_getStr(pImpl->m_strFilePath));
+
+ *pHandle = (oslFileHandle)(pImpl);
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_closeFile */
+/****************************************************************************/
+oslFileError
+SAL_CALL osl_closeFile( oslFileHandle Handle )
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((pImpl == 0) || (pImpl->m_fd < 0))
+ return osl_File_E_INVAL;
+
+ (void) pthread_mutex_lock (&(pImpl->m_mutex));
+
+ /* close(2) implicitly (and unconditionally) unlocks */
+ OSL_TRACE("osl_closeFile(%d) => %s", pImpl->m_fd, rtl_string_getStr(pImpl->m_strFilePath));
+ oslFileError result = pImpl->syncFile();
+ if (result != osl_File_E_None)
+ {
+ /* close, ignoring double failure */
+ (void) close (pImpl->m_fd);
+ }
+ else if (-1 == close (pImpl->m_fd))
+ {
+ /* translate error code */
+ result = oslTranslateFileError (OSL_FET_ERROR, errno);
+ }
+
+ (void) pthread_mutex_unlock (&(pImpl->m_mutex));
+ delete pImpl;
+ return (result);
+}
+
+/************************************************
+ * osl_syncFile
+ ***********************************************/
+oslFileError
+SAL_CALL osl_syncFile(oslFileHandle Handle)
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd))
+ return osl_File_E_INVAL;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+
+ OSL_TRACE("osl_syncFile(%d)", pImpl->m_fd);
+ oslFileError result = pImpl->syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+ if (-1 == fsync (pImpl->m_fd))
+ return oslTranslateFileError (OSL_FET_ERROR, errno);
+
+ return osl_File_E_None;
+}
+
+/*******************************************
+ osl_mapFile
+********************************************/
+oslFileError
+SAL_CALL osl_mapFile (
+ oslFileHandle Handle,
+ void** ppAddr,
+ sal_uInt64 uLength,
+ sal_uInt64 uOffset,
+ sal_uInt32 uFlags
+)
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == ppAddr))
+ return osl_File_E_INVAL;
+ *ppAddr = 0;
+
+ static sal_uInt64 const g_limit_size_t = std::numeric_limits< size_t >::max();
+ if (g_limit_size_t < uLength)
+ return osl_File_E_OVERFLOW;
+ size_t const nLength = sal::static_int_cast< size_t >(uLength);
+
+ static sal_uInt64 const g_limit_off_t = std::numeric_limits< off_t >::max();
+ if (g_limit_off_t < uOffset)
+ return osl_File_E_OVERFLOW;
+ off_t const nOffset = sal::static_int_cast< off_t >(uOffset);
+
+ void* p = mmap(NULL, nLength, PROT_READ, MAP_SHARED, pImpl->m_fd, nOffset);
+ if (MAP_FAILED == p)
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+ *ppAddr = p;
+
+ if (uFlags & osl_File_MapFlag_RandomAccess)
+ {
+ // Determine memory pagesize.
+ size_t const nPageSize = FileHandle_Impl::getpagesize();
+ if (size_t(-1) != nPageSize)
+ {
+ /*
+ * Pagein, touching first byte of every memory page.
+ * Note: volatile disables optimizing the loop away.
+ */
+ sal_uInt8 * pData (reinterpret_cast<sal_uInt8*>(*ppAddr));
+ size_t nSize (nLength);
+
+ volatile sal_uInt8 c = 0;
+ while (nSize > nPageSize)
+ {
+ c ^= pData[0];
+ pData += nPageSize;
+ nSize -= nPageSize;
+ }
+ if (nSize > 0)
+ {
+ c^= pData[0];
+ pData += nSize;
+ nSize -= nSize;
+ }
+ }
+ }
+ if (uFlags & osl_File_MapFlag_WillNeed)
+ {
+ // On Linux, madvise(..., MADV_WILLNEED) appears to have the undesirable
+ // effect of not returning until the data has actually been paged in, so
+ // that its net effect would typically be to slow down the process
+ // (which could start processing at the beginning of the data while the
+ // OS simultaneously pages in the rest); on other platforms, it remains
+ // to be evaluated whether madvise or equivalent is available and
+ // actually useful:
+#if defined MACOSX
+ int e = posix_madvise(p, nLength, POSIX_MADV_WILLNEED);
+ if (e != 0)
+ {
+ OSL_TRACE(
+ "posix_madvise(..., POSIX_MADV_WILLNEED) failed with %d", e);
+ }
+#elif defined SOLARIS
+ if (madvise(static_cast< caddr_t >(p), nLength, MADV_WILLNEED) != 0)
+ {
+ OSL_TRACE("madvise(..., MADV_WILLNEED) failed with %d", errno);
+ }
+#endif
+ }
+ return osl_File_E_None;
+}
+
+/*******************************************
+ osl_unmapFile
+********************************************/
+oslFileError
+SAL_CALL osl_unmapFile (void* pAddr, sal_uInt64 uLength)
+{
+ if (0 == pAddr)
+ return osl_File_E_INVAL;
+
+ static sal_uInt64 const g_limit_size_t = std::numeric_limits< size_t >::max();
+ if (g_limit_size_t < uLength)
+ return osl_File_E_OVERFLOW;
+ size_t const nLength = sal::static_int_cast< size_t >(uLength);
+
+ if (-1 == munmap(static_cast<char*>(pAddr), nLength))
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ return osl_File_E_None;
+}
+
+/*******************************************
+ osl_readLine
+********************************************/
+oslFileError
+SAL_CALL osl_readLine (
+ oslFileHandle Handle,
+ sal_Sequence ** ppSequence)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == ppSequence))
+ return osl_File_E_INVAL;
+ sal_uInt64 uBytesRead = 0;
+
+ // read at current fileptr; fileptr += uBytesRead;
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ oslFileError result = pImpl->readLineAt (
+ pImpl->m_fileptr, ppSequence, &uBytesRead);
+ if (result == osl_File_E_None)
+ pImpl->m_fileptr += uBytesRead;
+ return (result);
+}
+
+/*******************************************
+ osl_readFile
+********************************************/
+oslFileError
+SAL_CALL osl_readFile (
+ oslFileHandle Handle,
+ void * pBuffer,
+ sal_uInt64 uBytesRequested,
+ sal_uInt64 * pBytesRead)
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pBuffer) || (0 == pBytesRead))
+ return osl_File_E_INVAL;
+
+ static sal_uInt64 const g_limit_ssize_t = std::numeric_limits< ssize_t >::max();
+ if (g_limit_ssize_t < uBytesRequested)
+ return osl_File_E_OVERFLOW;
+ size_t const nBytesRequested = sal::static_int_cast< size_t >(uBytesRequested);
+
+ // read at current fileptr; fileptr += *pBytesRead;
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ oslFileError result = pImpl->readFileAt (
+ pImpl->m_fileptr, pBuffer, nBytesRequested, pBytesRead);
+ if (result == osl_File_E_None)
+ pImpl->m_fileptr += *pBytesRead;
+ return (result);
+}
+
+/*******************************************
+ osl_writeFile
+********************************************/
+oslFileError
+SAL_CALL osl_writeFile (
+ oslFileHandle Handle,
+ const void * pBuffer,
+ sal_uInt64 uBytesToWrite,
+ sal_uInt64 * pBytesWritten)
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pBuffer) || (0 == pBytesWritten))
+ return osl_File_E_INVAL;
+ if (0 == (pImpl->m_state & FileHandle_Impl::STATE_WRITEABLE))
+ return osl_File_E_BADF;
+
+ static sal_uInt64 const g_limit_ssize_t = std::numeric_limits< ssize_t >::max();
+ if (g_limit_ssize_t < uBytesToWrite)
+ return osl_File_E_OVERFLOW;
+ size_t const nBytesToWrite = sal::static_int_cast< size_t >(uBytesToWrite);
+
+ // write at current fileptr; fileptr += *pBytesWritten;
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ oslFileError result = pImpl->writeFileAt (
+ pImpl->m_fileptr, pBuffer, nBytesToWrite, pBytesWritten);
+ if (result == osl_File_E_None)
+ pImpl->m_fileptr += *pBytesWritten;
+ return (result);
+}
+
+/*******************************************
+ osl_readFileAt
+********************************************/
+oslFileError
+SAL_CALL osl_readFileAt (
+ oslFileHandle Handle,
+ sal_uInt64 uOffset,
+ void* pBuffer,
+ sal_uInt64 uBytesRequested,
+ sal_uInt64* pBytesRead)
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pBuffer) || (0 == pBytesRead))
+ return osl_File_E_INVAL;
+ if (0 == (pImpl->m_state & FileHandle_Impl::STATE_SEEKABLE))
+ return osl_File_E_SPIPE;
+
+ static sal_uInt64 const g_limit_off_t = std::numeric_limits< off_t >::max();
+ if (g_limit_off_t < uOffset)
+ return osl_File_E_OVERFLOW;
+ off_t const nOffset = sal::static_int_cast< off_t >(uOffset);
+
+ static sal_uInt64 const g_limit_ssize_t = std::numeric_limits< ssize_t >::max();
+ if (g_limit_ssize_t < uBytesRequested)
+ return osl_File_E_OVERFLOW;
+ size_t const nBytesRequested = sal::static_int_cast< size_t >(uBytesRequested);
+
+ // read at specified fileptr
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ return pImpl->readFileAt (nOffset, pBuffer, nBytesRequested, pBytesRead);
+}
+
+/*******************************************
+ osl_writeFileAt
+********************************************/
+oslFileError
+SAL_CALL osl_writeFileAt (
+ oslFileHandle Handle,
+ sal_uInt64 uOffset,
+ const void* pBuffer,
+ sal_uInt64 uBytesToWrite,
+ sal_uInt64* pBytesWritten)
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pBuffer) || (0 == pBytesWritten))
+ return osl_File_E_INVAL;
+ if (0 == (pImpl->m_state & FileHandle_Impl::STATE_SEEKABLE))
+ return osl_File_E_SPIPE;
+ if (0 == (pImpl->m_state & FileHandle_Impl::STATE_WRITEABLE))
+ return osl_File_E_BADF;
+
+ static sal_uInt64 const g_limit_off_t = std::numeric_limits< off_t >::max();
+ if (g_limit_off_t < uOffset)
+ return osl_File_E_OVERFLOW;
+ off_t const nOffset = sal::static_int_cast< off_t >(uOffset);
+
+ static sal_uInt64 const g_limit_ssize_t = std::numeric_limits< ssize_t >::max();
+ if (g_limit_ssize_t < uBytesToWrite)
+ return osl_File_E_OVERFLOW;
+ size_t const nBytesToWrite = sal::static_int_cast< size_t >(uBytesToWrite);
+
+ // write at specified fileptr
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ return pImpl->writeFileAt (nOffset, pBuffer, nBytesToWrite, pBytesWritten);
+}
+
+/****************************************************************************/
+/* osl_isEndOfFile */
+/****************************************************************************/
+oslFileError
+SAL_CALL osl_isEndOfFile( oslFileHandle Handle, sal_Bool *pIsEOF )
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pIsEOF))
+ return osl_File_E_INVAL;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ *pIsEOF = (pImpl->getPos() == pImpl->getSize());
+ return osl_File_E_None;
+}
+
+/************************************************
+ * osl_getFilePos
+ ***********************************************/
+oslFileError
+SAL_CALL osl_getFilePos( oslFileHandle Handle, sal_uInt64* pPos )
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pPos))
+ return osl_File_E_INVAL;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ *pPos = pImpl->getPos();
+ return osl_File_E_None;
+}
+
+/*******************************************
+ osl_setFilePos
+********************************************/
+oslFileError
+SAL_CALL osl_setFilePos (oslFileHandle Handle, sal_uInt32 uHow, sal_Int64 uOffset)
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd))
+ return osl_File_E_INVAL;
+
+ static sal_Int64 const g_limit_off_t = std::numeric_limits< off_t >::max();
+ if (g_limit_off_t < uOffset)
+ return osl_File_E_OVERFLOW;
+ off_t nPos = 0, nOffset = sal::static_int_cast< off_t >(uOffset);
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ switch(uHow)
+ {
+ case osl_Pos_Absolut:
+ if (0 > nOffset)
+ return osl_File_E_INVAL;
+ break;
+
+ case osl_Pos_Current:
+ nPos = sal::static_int_cast< off_t >(pImpl->getPos());
+ if ((0 > nOffset) && (-1*nOffset > nPos))
+ return osl_File_E_INVAL;
+ if (g_limit_off_t < nPos + nOffset)
+ return osl_File_E_OVERFLOW;
+ break;
+
+ case osl_Pos_End:
+ nPos = sal::static_int_cast< off_t >(pImpl->getSize());
+ if ((0 > nOffset) && (-1*nOffset > nPos))
+ return osl_File_E_INVAL;
+ if (g_limit_off_t < nPos + nOffset)
+ return osl_File_E_OVERFLOW;
+ break;
+
+ default:
+ return osl_File_E_INVAL;
+ }
+
+ return pImpl->setPos (nPos + nOffset);
+}
+
+/****************************************************************************
+ * osl_getFileSize
+ ****************************************************************************/
+oslFileError
+SAL_CALL osl_getFileSize( oslFileHandle Handle, sal_uInt64* pSize )
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd) || (0 == pSize))
+ return osl_File_E_INVAL;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ *pSize = pImpl->getSize();
+ return osl_File_E_None;
+}
+
+/************************************************
+ * osl_setFileSize
+ ***********************************************/
+oslFileError
+SAL_CALL osl_setFileSize( oslFileHandle Handle, sal_uInt64 uSize )
+{
+ FileHandle_Impl* pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || (-1 == pImpl->m_fd))
+ return osl_File_E_INVAL;
+ if (0 == (pImpl->m_state & FileHandle_Impl::STATE_WRITEABLE))
+ return osl_File_E_BADF;
+
+ static sal_uInt64 const g_limit_off_t = std::numeric_limits< off_t >::max();
+ if (g_limit_off_t < uSize)
+ return osl_File_E_OVERFLOW;
+
+ oslFileError result = pImpl->syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+ pImpl->m_bufptr = -1, pImpl->m_buflen = 0;
+
+ return pImpl->setSize (uSize);
+}
diff --git a/sal/osl/unx/file_error_transl.cxx b/sal/osl/unx/file_error_transl.cxx
new file mode 100644
index 000000000000..3de829afc391
--- /dev/null
+++ b/sal/osl/unx/file_error_transl.cxx
@@ -0,0 +1,255 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+ #ifndef _ERRNO_H
+ #include <errno.h>
+ #endif
+
+ #ifndef _FILE_ERROR_TRANSL_H_
+ #include "file_error_transl.h"
+ #endif
+
+ #ifndef _OSL_DIAGNOSE_H_
+ #include <osl/diagnose.h>
+ #endif
+
+
+/********************************************
+ * oslTranslateFileError
+ *******************************************/
+
+oslFileError oslTranslateFileError(sal_Bool bIsError, int Errno)
+{
+ oslFileError osl_error = osl_File_E_invalidError;
+
+ OSL_ENSURE((bIsError && (0 != Errno)) || (!bIsError && (0 == Errno)), "oslTranslateFileError strange input combination!");
+
+ /* Have a look at file_error_transl.h for
+ the reason that we do this here */
+ if (bIsError && (0 == Errno))
+ return osl_error;
+
+ switch(Errno)
+ {
+ case 0:
+ osl_error = osl_File_E_None;
+ break;
+
+ case EPERM:
+ osl_error = osl_File_E_PERM;
+ break;
+
+ case ENOENT:
+ osl_error = osl_File_E_NOENT;
+ break;
+
+ case ESRCH:
+ osl_error = osl_File_E_SRCH;
+ break;
+
+ case EINTR:
+ osl_error = osl_File_E_INTR;
+ break;
+
+ case EIO:
+ osl_error = osl_File_E_IO;
+ break;
+
+ case ENXIO:
+ osl_error = osl_File_E_IO;
+ break;
+
+ case E2BIG:
+ osl_error = osl_File_E_2BIG;
+ break;
+
+ case ENOEXEC:
+ osl_error = osl_File_E_NOEXEC;
+ break;
+
+ case EBADF:
+ osl_error = osl_File_E_BADF;
+ break;
+
+ case ECHILD:
+ osl_error = osl_File_E_CHILD;
+ break;
+
+ case EAGAIN:
+ osl_error = osl_File_E_AGAIN;
+ break;
+
+ case ENOMEM:
+ osl_error = osl_File_E_NOMEM;
+ break;
+
+ case EACCES:
+ osl_error = osl_File_E_ACCES;
+ break;
+
+ case EFAULT:
+ osl_error = osl_File_E_FAULT;
+ break;
+
+ case EBUSY:
+ osl_error = osl_File_E_BUSY;
+ break;
+
+ case EEXIST:
+ osl_error = osl_File_E_EXIST;
+ break;
+
+ case EXDEV:
+ osl_error = osl_File_E_XDEV;
+ break;
+
+ case ENODEV:
+ osl_error = osl_File_E_NODEV;
+ break;
+
+ case ENOTDIR:
+ osl_error = osl_File_E_NOTDIR;
+ break;
+
+ case EISDIR:
+ osl_error = osl_File_E_ISDIR;
+ break;
+
+ case EINVAL:
+ osl_error = osl_File_E_INVAL;
+ break;
+
+ case ENFILE:
+ osl_error = osl_File_E_NFILE;
+ break;
+
+ case EMFILE:
+ osl_error = osl_File_E_MFILE;
+ break;
+
+ case ENOTTY:
+ osl_error = osl_File_E_NOTTY;
+ break;
+
+ case EFBIG:
+ osl_error = osl_File_E_FBIG;
+ break;
+
+ case ENOSPC:
+ osl_error = osl_File_E_NOSPC;
+ break;
+
+ case ESPIPE:
+ osl_error = osl_File_E_SPIPE;
+ break;
+
+ case EROFS:
+ osl_error = osl_File_E_ROFS;
+ break;
+
+ case EMLINK:
+ osl_error = osl_File_E_MLINK;
+ break;
+
+ case EPIPE:
+ osl_error = osl_File_E_PIPE;
+ break;
+
+ case EDOM:
+ osl_error = osl_File_E_DOM;
+ break;
+
+ case ERANGE:
+ osl_error = osl_File_E_RANGE;
+ break;
+
+ case EDEADLK:
+ osl_error = osl_File_E_DEADLK;
+ break;
+
+ case ENAMETOOLONG:
+ osl_error = osl_File_E_NAMETOOLONG;
+ break;
+
+ case ENOLCK:
+ osl_error = osl_File_E_NOLCK;
+ break;
+
+ case ENOSYS:
+ osl_error = osl_File_E_NOSYS;
+ break;
+
+ case ENOTEMPTY:
+ osl_error = osl_File_E_NOTEMPTY;
+ break;
+
+ case ELOOP:
+ osl_error = osl_File_E_LOOP;
+ break;
+
+#if !(defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+ case EILSEQ:
+ osl_error = osl_File_E_ILSEQ;
+ break;
+#endif /* MACOSX */
+
+#if !(defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+ case ENOLINK:
+ osl_error = osl_File_E_NOLINK;
+ break;
+#endif /* MACOSX */
+
+#if !(defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+ case EMULTIHOP:
+ osl_error = osl_File_E_MULTIHOP;
+ break;
+#endif /* MACOSX */
+
+ case EUSERS:
+ osl_error = osl_File_E_USERS;
+ break;
+
+ case EOVERFLOW:
+ osl_error = osl_File_E_OVERFLOW;
+ break;
+
+ case ETIMEDOUT:
+ osl_error = osl_File_E_TIMEDOUT;
+ break;
+
+ default:
+ /* FIXME translateFileError: is this alright? Or add a new one: osl_File_E_Unknown? */
+ osl_error = osl_File_E_invalidError;
+ break;
+ }
+
+ return osl_error;
+}
+
diff --git a/sal/osl/unx/file_error_transl.h b/sal/osl/unx/file_error_transl.h
new file mode 100644
index 000000000000..59d7b1d9faec
--- /dev/null
+++ b/sal/osl/unx/file_error_transl.h
@@ -0,0 +1,70 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _FILE_ERROR_TRANSL_H_
+#define _FILE_ERROR_TRANSL_H_
+
+#include <osl/file.h>
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*********************************************
+ oslTranslateFileError
+ Translate errno's to osl file errors
+
+ @param bIsError [in] specifies if nErrno
+ should be interpreted as error,
+ some libc functions signaling an error
+ but errno is nevertheless 0 in this
+ case the function should at least
+ return osl_File_E_Unknown but in no
+ case osl_File_E_None!
+
+ @param nErrno [in] the errno if errno is 0
+ and bIsError is true the function
+ returns osl_File_E_Unknown
+
+ @returns the osl error code appropriate to
+ the errno
+
+ *********************************************/
+
+#define OSL_FET_SUCCESS sal_False
+#define OSL_FET_ERROR sal_True
+
+oslFileError oslTranslateFileError(sal_Bool bIsError, int Errno);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/osl/unx/file_impl.hxx b/sal/osl/unx/file_impl.hxx
new file mode 100644
index 000000000000..5dee69f29b2e
--- /dev/null
+++ b/sal/osl/unx/file_impl.hxx
@@ -0,0 +1,54 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_FILE_IMPL_HXX
+#define INCLUDED_FILE_IMPL_HXX
+
+#include "osl/file.h"
+#include <stddef.h>
+
+struct DirectoryItem_Impl
+{
+ sal_Int32 m_RefCount;
+
+ rtl_uString * m_ustrFilePath; /* holds native file name */
+ unsigned char m_DType;
+
+ explicit DirectoryItem_Impl(
+ rtl_uString * ustrFilePath, unsigned char DType = 0);
+ ~DirectoryItem_Impl();
+
+ static void * operator new(size_t n);
+ static void operator delete (void * p, size_t);
+
+ void acquire(); /* @see osl_acquireDirectoryItem() */
+ void release(); /* @see osl_releaseDirectoryItem() */
+
+ oslFileType getFileType() const;
+};
+
+#endif /* INCLUDED_FILE_IMPL_HXX */
diff --git a/sal/osl/unx/file_misc.cxx b/sal/osl/unx/file_misc.cxx
new file mode 100644
index 000000000000..452d3eb2db70
--- /dev/null
+++ b/sal/osl/unx/file_misc.cxx
@@ -0,0 +1,1066 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "osl/file.hxx"
+
+#include "osl/diagnose.h"
+#include "osl/thread.h"
+#include <osl/signal.h>
+#include "rtl/alloc.h"
+
+#include "system.h"
+#include "file_impl.hxx"
+#include "file_error_transl.h"
+#include "file_path_helper.hxx"
+#include "file_url.h"
+#include "uunxapi.hxx"
+
+#include <sys/types.h>
+#include <errno.h>
+#include <dirent.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+
+#include <algorithm>
+
+/************************************************************************
+ * ToDo
+ *
+ * - Fix: check for corresponding struct sizes in exported functions
+ * - check size/use of oslDirectory
+ * - check size/use of oslDirectoryItem
+ ***********************************************************************/
+/******************************************************************************
+ *
+ * Data Type Definition
+ *
+ ******************************************************************************/
+
+typedef struct
+{
+ rtl_uString* ustrPath; /* holds native directory path */
+ DIR* pDirStruct;
+} oslDirectoryImpl;
+
+#if 0
+/* FIXME: reintroducing this may save some extra bytes per Item */
+typedef struct
+{
+ rtl_uString* ustrFileName; /* holds native file name */
+ rtl_uString* ustrDirPath; /* holds native dir path */
+ sal_uInt32 RefCount;
+} oslDirectoryItemImpl;
+#endif
+
+DirectoryItem_Impl::DirectoryItem_Impl(
+ rtl_uString * ustrFilePath, unsigned char DType)
+ : m_RefCount (1),
+ m_ustrFilePath (ustrFilePath),
+ m_DType (DType)
+{
+ if (m_ustrFilePath != 0)
+ rtl_uString_acquire(m_ustrFilePath);
+}
+DirectoryItem_Impl::~DirectoryItem_Impl()
+{
+ if (m_ustrFilePath != 0)
+ rtl_uString_release(m_ustrFilePath);
+}
+
+void * DirectoryItem_Impl::operator new(size_t n)
+{
+ return rtl_allocateMemory(n);
+}
+void DirectoryItem_Impl::operator delete(void * p, size_t)
+{
+ rtl_freeMemory(p);
+}
+
+void DirectoryItem_Impl::acquire()
+{
+ ++m_RefCount;
+}
+void DirectoryItem_Impl::release()
+{
+ if (0 == --m_RefCount)
+ delete this;
+}
+
+oslFileType DirectoryItem_Impl::getFileType() const
+{
+ switch (m_DType)
+ {
+#ifdef _DIRENT_HAVE_D_TYPE
+ case DT_LNK:
+ return osl_File_Type_Link;
+ case DT_DIR:
+ return osl_File_Type_Directory;
+ case DT_REG:
+ return osl_File_Type_Regular;
+ case DT_FIFO:
+ return osl_File_Type_Fifo;
+ case DT_SOCK:
+ return osl_File_Type_Socket;
+ case DT_CHR:
+ case DT_BLK:
+ return osl_File_Type_Special;
+#endif /* _DIRENT_HAVE_D_TYPE */
+ default:
+ break;
+ }
+ return osl_File_Type_Unknown;
+}
+
+/******************************************************************************
+ *
+ * C-String Function Declarations
+ *
+ *****************************************************************************/
+
+static oslFileError osl_psz_createDirectory(const sal_Char* pszPath);
+static oslFileError osl_psz_removeDirectory(const sal_Char* pszPath);
+
+/*******************************************************************
+ * osl_openDirectory
+ ******************************************************************/
+
+oslFileError SAL_CALL osl_openDirectory(rtl_uString* ustrDirectoryURL, oslDirectory* pDirectory)
+{
+ rtl_uString* ustrSystemPath = NULL;
+ oslFileError eRet;
+
+ char path[PATH_MAX];
+
+ if ((0 == ustrDirectoryURL) || (0 == ustrDirectoryURL->length) || (0 == pDirectory))
+ return osl_File_E_INVAL;
+
+ /* convert file URL to system path */
+ eRet = osl_getSystemPathFromFileURL_Ex(ustrDirectoryURL, &ustrSystemPath, sal_False);
+
+ if( osl_File_E_None != eRet )
+ return eRet;
+
+ osl_systemPathRemoveSeparator(ustrSystemPath);
+
+ /* convert unicode path to text */
+ if ( UnicodeToText( path, PATH_MAX, ustrSystemPath->buffer, ustrSystemPath->length )
+#ifdef MACOSX
+ && macxp_resolveAlias( path, PATH_MAX ) == 0
+#endif /* MACOSX */
+ )
+ {
+ /* open directory */
+ DIR *pdir = opendir( path );
+
+ if( pdir )
+ {
+ /* create and initialize impl structure */
+ oslDirectoryImpl* pDirImpl = (oslDirectoryImpl*) rtl_allocateMemory( sizeof(oslDirectoryImpl) );
+
+ if( pDirImpl )
+ {
+ pDirImpl->pDirStruct = pdir;
+ pDirImpl->ustrPath = ustrSystemPath;
+
+ *pDirectory = (oslDirectory) pDirImpl;
+ return osl_File_E_None;
+ }
+ else
+ {
+ errno = ENOMEM;
+ closedir( pdir );
+ }
+ }
+ else
+ {
+#ifdef DEBUG_OSL_FILE
+ perror ("osl_openDirectory"); fprintf (stderr, path);
+#endif
+ }
+ }
+
+ rtl_uString_release( ustrSystemPath );
+
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+}
+
+/****************************************************************************/
+/* osl_closeDirectory */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_closeDirectory( oslDirectory Directory )
+{
+ oslDirectoryImpl* pDirImpl = (oslDirectoryImpl*) Directory;
+ oslFileError err = osl_File_E_None;
+
+ OSL_ASSERT( Directory );
+
+ if( NULL == pDirImpl )
+ return osl_File_E_INVAL;
+
+ /* close directory */
+ if( closedir( pDirImpl->pDirStruct ) )
+ {
+ err = oslTranslateFileError(OSL_FET_ERROR, errno);
+ }
+
+ /* cleanup members */
+ rtl_uString_release( pDirImpl->ustrPath );
+
+ rtl_freeMemory( pDirImpl );
+
+ return err;
+}
+
+/**********************************************
+ * osl_readdir_impl_
+ *
+ * readdir wrapper, filters out "." and ".."
+ * on request
+ *********************************************/
+
+static struct dirent* osl_readdir_impl_(DIR* pdir, sal_Bool bFilterLocalAndParentDir)
+{
+ struct dirent* pdirent;
+
+ while ((pdirent = readdir(pdir)) != NULL)
+ {
+ if (bFilterLocalAndParentDir &&
+ ((0 == strcmp(pdirent->d_name, ".")) || (0 == strcmp(pdirent->d_name, ".."))))
+ continue;
+ else
+ break;
+ }
+
+ return pdirent;
+}
+
+/****************************************************************************
+ * osl_getNextDirectoryItem
+ ***************************************************************************/
+
+oslFileError SAL_CALL osl_getNextDirectoryItem(oslDirectory Directory, oslDirectoryItem* pItem, sal_uInt32 /*uHint*/)
+{
+ oslDirectoryImpl* pDirImpl = (oslDirectoryImpl*)Directory;
+ rtl_uString* ustrFileName = NULL;
+ rtl_uString* ustrFilePath = NULL;
+ struct dirent* pEntry;
+
+ OSL_ASSERT(Directory);
+ OSL_ASSERT(pItem);
+
+ if ((NULL == Directory) || (NULL == pItem))
+ return osl_File_E_INVAL;
+
+ pEntry = osl_readdir_impl_(pDirImpl->pDirStruct, sal_True);
+
+ if (NULL == pEntry)
+ return osl_File_E_NOENT;
+
+
+#if defined(MACOSX)
+
+ // convert decomposed filename to precomposed unicode
+ char composed_name[BUFSIZ];
+ CFMutableStringRef strRef = CFStringCreateMutable (NULL, 0 );
+ CFStringAppendCString( strRef, pEntry->d_name, kCFStringEncodingUTF8 ); //UTF8 is default on Mac OSX
+ CFStringNormalize( strRef, kCFStringNormalizationFormC );
+ CFStringGetCString( strRef, composed_name, BUFSIZ, kCFStringEncodingUTF8 );
+ CFRelease( strRef );
+ rtl_string2UString( &ustrFileName, composed_name, strlen( composed_name),
+ osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+
+#else // not MACOSX
+ /* convert file name to unicode */
+ rtl_string2UString( &ustrFileName, pEntry->d_name, strlen( pEntry->d_name ),
+ osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(ustrFileName != 0);
+
+#endif
+
+ osl_systemPathMakeAbsolutePath(pDirImpl->ustrPath, ustrFileName, &ustrFilePath);
+ rtl_uString_release( ustrFileName );
+
+ DirectoryItem_Impl * pImpl = static_cast< DirectoryItem_Impl* >(*pItem);
+ if (0 != pImpl)
+ {
+ pImpl->release(), pImpl = 0;
+ }
+#ifdef _DIRENT_HAVE_D_TYPE
+ pImpl = new DirectoryItem_Impl(ustrFilePath, pEntry->d_type);
+#else
+ pImpl = new DirectoryItem_Impl(ustrFilePath);
+#endif /* _DIRENT_HAVE_D_TYPE */
+ *pItem = pImpl;
+ rtl_uString_release( ustrFilePath );
+
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_getDirectoryItem */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_getDirectoryItem( rtl_uString* ustrFileURL, oslDirectoryItem* pItem )
+{
+ rtl_uString* ustrSystemPath = NULL;
+ oslFileError osl_error = osl_File_E_INVAL;
+
+ OSL_ASSERT(ustrFileURL);
+ OSL_ASSERT(pItem);
+
+ if (0 == ustrFileURL->length || NULL == pItem)
+ return osl_File_E_INVAL;
+
+ osl_error = osl_getSystemPathFromFileURL_Ex(ustrFileURL, &ustrSystemPath, sal_False);
+ if (osl_File_E_None != osl_error)
+ return osl_error;
+
+ osl_systemPathRemoveSeparator(ustrSystemPath);
+
+ if (-1 == access_u(ustrSystemPath, F_OK))
+ {
+ osl_error = oslTranslateFileError(OSL_FET_ERROR, errno);
+ }
+ else
+ {
+ *pItem = new DirectoryItem_Impl(ustrSystemPath);
+ }
+ rtl_uString_release(ustrSystemPath);
+
+ return osl_error;
+}
+
+
+/****************************************************************************/
+/* osl_acquireDirectoryItem */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_acquireDirectoryItem( oslDirectoryItem Item )
+{
+ DirectoryItem_Impl * pImpl = static_cast< DirectoryItem_Impl* >(Item);
+ if (0 == pImpl)
+ return osl_File_E_INVAL;
+
+ pImpl->acquire();
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_releaseDirectoryItem */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_releaseDirectoryItem( oslDirectoryItem Item )
+{
+ DirectoryItem_Impl * pImpl = static_cast< DirectoryItem_Impl* >(Item);
+ if (0 == pImpl)
+ return osl_File_E_INVAL;
+
+ pImpl->release();
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_createDirectory */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_createDirectory( rtl_uString* ustrDirectoryURL )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrDirectoryURL );
+
+ /* convert directory url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+#ifdef MACOSX
+ if ( macxp_resolveAlias( path, PATH_MAX ) != 0 )
+ return oslTranslateFileError( OSL_FET_ERROR, errno );
+#endif/* MACOSX */
+
+ return osl_psz_createDirectory( path );
+}
+
+/****************************************************************************/
+/* osl_removeDirectory */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_removeDirectory( rtl_uString* ustrDirectoryURL )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrDirectoryURL );
+
+ /* convert directory url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+#ifdef MACOSX
+ if ( macxp_resolveAlias( path, PATH_MAX ) != 0 )
+ return oslTranslateFileError( OSL_FET_ERROR, errno );
+#endif/* MACOSX */
+
+ return osl_psz_removeDirectory( path );
+}
+
+/*****************************************
+ * osl_psz_createDirectory
+ ****************************************/
+
+static oslFileError osl_psz_createDirectory( const sal_Char* pszPath )
+{
+ int nRet=0;
+ int mode = S_IRWXU | S_IRWXG | S_IRWXO;
+
+ nRet = mkdir(pszPath,mode);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * osl_psz_removeDirectory
+ ****************************************/
+
+static oslFileError osl_psz_removeDirectory( const sal_Char* pszPath )
+{
+ int nRet=0;
+
+ nRet = rmdir(pszPath);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_createDirectoryPath */
+/****************************************************************************/
+
+static int path_make_parent(sal_Unicode* path)
+{
+ int i = rtl_ustr_lastIndexOfChar(path, '/');
+
+ if (i > 0)
+ {
+ *(path + i) = 0;
+ return i;
+ }
+ else
+ return 0;
+}
+
+static int create_dir_with_callback(
+ sal_Unicode* directory_path,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ int mode = S_IRWXU | S_IRWXG | S_IRWXO;
+
+ if (osl::mkdir(directory_path, mode) == 0)
+ {
+ if (aDirectoryCreationCallbackFunc)
+ {
+ rtl::OUString url;
+ osl::FileBase::getFileURLFromSystemPath(directory_path, url);
+ aDirectoryCreationCallbackFunc(pData, url.pData);
+ }
+ return 0;
+ }
+ return errno;
+}
+
+static oslFileError create_dir_recursively_(
+ sal_Unicode* dir_path,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ OSL_PRECOND((rtl_ustr_getLength(dir_path) > 0) && ((dir_path + (rtl_ustr_getLength(dir_path) - 1)) != (dir_path + rtl_ustr_lastIndexOfChar(dir_path, '/'))), \
+ "Path must not end with a slash");
+
+ int native_err = create_dir_with_callback(
+ dir_path, aDirectoryCreationCallbackFunc, pData);
+
+ if (native_err == 0)
+ return osl_File_E_None;
+
+ if (native_err != ENOENT)
+ return oslTranslateFileError(OSL_FET_ERROR, native_err);
+
+ // we step back until '/a_dir' at maximum because
+ // we should get an error unequal ENOENT when
+ // we try to create 'a_dir' at '/' and would so
+ // return before
+ int pos = path_make_parent(dir_path);
+
+ oslFileError osl_error = create_dir_recursively_(
+ dir_path, aDirectoryCreationCallbackFunc, pData);
+
+ if (osl_File_E_None != osl_error)
+ return osl_error;
+
+ dir_path[pos] = '/';
+
+ return create_dir_recursively_(dir_path, aDirectoryCreationCallbackFunc, pData);
+}
+
+oslFileError SAL_CALL osl_createDirectoryPath(
+ rtl_uString* aDirectoryUrl,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ if (aDirectoryUrl == NULL)
+ return osl_File_E_INVAL;
+
+ rtl::OUString sys_path;
+ oslFileError osl_error = osl_getSystemPathFromFileURL_Ex(
+ aDirectoryUrl, &sys_path.pData, sal_False);
+
+ if (osl_error != osl_File_E_None)
+ return osl_error;
+
+ osl::systemPathRemoveSeparator(sys_path);
+
+ // const_cast because sys_path is a local copy which we want to modify inplace instead of
+ // coyp it into another buffer on the heap again
+ return create_dir_recursively_(sys_path.pData->buffer, aDirectoryCreationCallbackFunc, pData);
+}
+
+/******************************************************************************
+ *
+ * C-String Function Declarations
+ *
+ *****************************************************************************/
+
+static oslFileError osl_psz_removeFile(const sal_Char* pszPath);
+static oslFileError osl_psz_copyFile(const sal_Char* pszPath, const sal_Char* pszDestPath);
+static oslFileError osl_psz_moveFile(const sal_Char* pszPath, const sal_Char* pszDestPath);
+
+
+/******************************************************************************
+ *
+ * Static Module Utility Function Declarations
+ *
+ *****************************************************************************/
+
+static oslFileError oslDoCopy(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, mode_t nMode, size_t nSourceSize, int DestFileExists);
+static oslFileError oslChangeFileModes(const sal_Char* pszFileName, mode_t nMode, time_t nAcTime, time_t nModTime, uid_t nUID, gid_t nGID);
+static int oslDoCopyLink(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName);
+static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, size_t nSourceSize, mode_t mode);
+static oslFileError oslDoMoveFile(const sal_Char* pszPath, const sal_Char* pszDestPath);
+
+/****************************************************************************/
+/* osl_moveFile */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_moveFile( rtl_uString* ustrFileURL, rtl_uString* ustrDestURL )
+{
+ char srcPath[PATH_MAX];
+ char destPath[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrFileURL );
+ OSL_ASSERT( ustrDestURL );
+
+ /* convert source url to system path */
+ eRet = FileURLToPath( srcPath, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ /* convert destination url to system path */
+ eRet = FileURLToPath( destPath, PATH_MAX, ustrDestURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+#ifdef MACOSX
+ if ( macxp_resolveAlias( srcPath, PATH_MAX ) != 0 || macxp_resolveAlias( destPath, PATH_MAX ) != 0 )
+ return oslTranslateFileError( OSL_FET_ERROR, errno );
+#endif/* MACOSX */
+
+ return oslDoMoveFile( srcPath, destPath );
+}
+
+/****************************************************************************/
+/* osl_copyFile */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_copyFile( rtl_uString* ustrFileURL, rtl_uString* ustrDestURL )
+{
+ char srcPath[PATH_MAX];
+ char destPath[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrFileURL );
+ OSL_ASSERT( ustrDestURL );
+
+ /* convert source url to system path */
+ eRet = FileURLToPath( srcPath, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+ /* convert destination url to system path */
+ eRet = FileURLToPath( destPath, PATH_MAX, ustrDestURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+#ifdef MACOSX
+ if ( macxp_resolveAlias( srcPath, PATH_MAX ) != 0 || macxp_resolveAlias( destPath, PATH_MAX ) != 0 )
+ return oslTranslateFileError( OSL_FET_ERROR, errno );
+#endif/* MACOSX */
+
+ return osl_psz_copyFile( srcPath, destPath );
+}
+
+/****************************************************************************/
+/* osl_removeFile */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_removeFile( rtl_uString* ustrFileURL )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrFileURL );
+
+ /* convert file url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+#ifdef MACOSX
+ if ( macxp_resolveAlias( path, PATH_MAX ) != 0 )
+ return oslTranslateFileError( OSL_FET_ERROR, errno );
+#endif/* MACOSX */
+
+ return osl_psz_removeFile( path );
+}
+
+/******************************************************************************
+ *
+ * Utility Functions
+ *
+ *****************************************************************************/
+
+/*****************************************
+ * oslDoMoveFile
+ ****************************************/
+
+static oslFileError oslDoMoveFile( const sal_Char* pszPath, const sal_Char* pszDestPath)
+{
+ oslFileError tErr=osl_File_E_invalidError;
+
+ tErr = osl_psz_moveFile(pszPath,pszDestPath);
+ if ( tErr == osl_File_E_None )
+ {
+ return tErr;
+ }
+
+ if ( tErr != osl_File_E_XDEV )
+ {
+ return tErr;
+ }
+
+ tErr=osl_psz_copyFile(pszPath,pszDestPath);
+
+ if ( tErr != osl_File_E_None )
+ {
+ oslFileError tErrRemove;
+ tErrRemove=osl_psz_removeFile(pszDestPath);
+ return tErr;
+ }
+
+ tErr=osl_psz_removeFile(pszPath);
+
+ return tErr;
+}
+
+/*****************************************
+ * osl_psz_removeFile
+ ****************************************/
+static oslFileError osl_psz_removeFile( const sal_Char* pszPath )
+{
+ int nRet=0;
+ struct stat aStat;
+
+ nRet = lstat(pszPath,&aStat);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ if ( S_ISDIR(aStat.st_mode) )
+ {
+ return osl_File_E_ISDIR;
+ }
+
+ nRet = unlink(pszPath);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * osl_psz_moveFile
+ ****************************************/
+
+static oslFileError osl_psz_moveFile(const sal_Char* pszPath, const sal_Char* pszDestPath)
+{
+
+ int nRet = 0;
+
+ nRet = rename(pszPath,pszDestPath);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * osl_psz_copyFile
+ ****************************************/
+
+static oslFileError osl_psz_copyFile( const sal_Char* pszPath, const sal_Char* pszDestPath )
+{
+ time_t nAcTime=0;
+ time_t nModTime=0;
+ uid_t nUID=0;
+ gid_t nGID=0;
+ int nRet=0;
+ mode_t nMode=0;
+ struct stat aFileStat;
+ oslFileError tErr=osl_File_E_invalidError;
+ size_t nSourceSize=0;
+ int DestFileExists=1;
+
+ /* mfe: does the source file really exists? */
+ nRet = lstat(pszPath,&aFileStat);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ /* mfe: we do only copy files here! */
+ if ( S_ISDIR(aFileStat.st_mode) )
+ {
+ return osl_File_E_ISDIR;
+ }
+
+ nSourceSize=(size_t)aFileStat.st_size;
+ nMode=aFileStat.st_mode;
+ nAcTime=aFileStat.st_atime;
+ nModTime=aFileStat.st_mtime;
+ nUID=aFileStat.st_uid;
+ nGID=aFileStat.st_gid;
+
+ nRet = stat(pszDestPath,&aFileStat);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+
+ if ( nRet == ENOENT )
+ {
+ DestFileExists=0;
+ }
+/* return oslTranslateFileError(nRet);*/
+ }
+
+ /* mfe: the destination file must not be a directory! */
+ if ( nRet == 0 && S_ISDIR(aFileStat.st_mode) )
+ {
+ return osl_File_E_ISDIR;
+ }
+ else
+ {
+ /* mfe: file does not exists or is no dir */
+ }
+
+ tErr = oslDoCopy(pszPath,pszDestPath,nMode,nSourceSize,DestFileExists);
+
+ if ( tErr != osl_File_E_None )
+ {
+ return tErr;
+ }
+
+ /*
+ * mfe: ignore return code
+ * since only the success of the copy is
+ * important
+ */
+ oslChangeFileModes(pszDestPath,nMode,nAcTime,nModTime,nUID,nGID);
+
+ return tErr;
+}
+
+
+/******************************************************************************
+ *
+ * Utility Functions
+ *
+ *****************************************************************************/
+
+/*****************************************
+ * oslDoCopy
+ ****************************************/
+
+#define TMP_DEST_FILE_EXTENSION ".osl-tmp"
+
+static oslFileError oslDoCopy(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, mode_t nMode, size_t nSourceSize, int DestFileExists)
+{
+ int nRet=0;
+ sal_Char pszTmpDestFile[PATH_MAX];
+ size_t size_tmp_dest_buff = sizeof(pszTmpDestFile);
+
+ /* Quick fix for #106048, the whole copy file function seems
+ to be erroneous anyway and needs to be rewritten.
+ Besides osl_copyFile is currently not used from OO/SO code.
+ */
+ memset(pszTmpDestFile, 0, size_tmp_dest_buff);
+
+ if ( DestFileExists )
+ {
+ strncpy(pszTmpDestFile, pszDestFileName, size_tmp_dest_buff - 1);
+
+ if ((strlen(pszTmpDestFile) + strlen(TMP_DEST_FILE_EXTENSION)) >= size_tmp_dest_buff)
+ return osl_File_E_NAMETOOLONG;
+
+ strncat(pszTmpDestFile, TMP_DEST_FILE_EXTENSION, strlen(TMP_DEST_FILE_EXTENSION));
+
+ /* FIXME: what if pszTmpDestFile already exists? */
+ /* with getcanonical??? */
+ nRet=rename(pszDestFileName,pszTmpDestFile);
+ }
+
+ /* mfe: should be S_ISREG */
+ if ( !S_ISLNK(nMode) )
+ {
+ /* copy SourceFile to DestFile */
+ nRet = oslDoCopyFile(pszSourceFileName,pszDestFileName,nSourceSize, nMode);
+ }
+ /* mfe: OK redundant at the moment */
+ else if ( S_ISLNK(nMode) )
+ {
+ nRet = oslDoCopyLink(pszSourceFileName,pszDestFileName);
+ }
+ else
+ {
+ /* mfe: what to do here? */
+ nRet=ENOSYS;
+ }
+
+ if ( nRet > 0 && DestFileExists == 1 )
+ {
+ unlink(pszDestFileName);
+ rename(pszTmpDestFile,pszDestFileName);
+ }
+
+ if ( nRet > 0 )
+ {
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ if ( DestFileExists == 1 )
+ {
+ unlink(pszTmpDestFile);
+ }
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * oslChangeFileModes
+ ****************************************/
+
+static oslFileError oslChangeFileModes( const sal_Char* pszFileName, mode_t nMode, time_t nAcTime, time_t nModTime, uid_t nUID, gid_t nGID)
+{
+ int nRet=0;
+ struct utimbuf aTimeBuffer;
+
+ nRet = chmod(pszFileName,nMode);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ aTimeBuffer.actime=nAcTime;
+ aTimeBuffer.modtime=nModTime;
+ nRet=utime(pszFileName,&aTimeBuffer);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ if ( nUID != getuid() )
+ {
+ nUID=getuid();
+ }
+
+ nRet=chown(pszFileName,nUID,nGID);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+
+ /* mfe: do not return an error here! */
+ /* return oslTranslateFileError(nRet);*/
+ }
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * oslDoCopyLink
+ ****************************************/
+
+static int oslDoCopyLink(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName)
+{
+ int nRet=0;
+
+ /* mfe: if dest file is symbolic link remove the link and place the file instead (hro says so) */
+ /* mfe: if source is a link copy the link and not the file it points to (hro says so) */
+ sal_Char pszLinkContent[PATH_MAX];
+
+ pszLinkContent[0] = '\0';
+
+ nRet = readlink(pszSourceFileName,pszLinkContent,PATH_MAX);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return nRet;
+ }
+ else
+ pszLinkContent[ nRet ] = 0;
+
+ nRet = symlink(pszLinkContent,pszDestFileName);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return nRet;
+ }
+
+ return 0;
+}
+
+/*****************************************
+ * oslDoCopyFile
+ ****************************************/
+
+static int oslDoCopyFile(const sal_Char* pszSourceFileName, const sal_Char* pszDestFileName, size_t nSourceSize, mode_t mode)
+{
+ int SourceFileFD=0;
+ int DestFileFD=0;
+ int nRet=0;
+
+ SourceFileFD=open(pszSourceFileName,O_RDONLY);
+ if ( SourceFileFD < 0 )
+ {
+ nRet=errno;
+ return nRet;
+ }
+
+ DestFileFD=open(pszDestFileName, O_WRONLY | O_CREAT, mode);
+
+ if ( DestFileFD < 0 )
+ {
+ nRet=errno;
+ close(SourceFileFD);
+ return nRet;
+ }
+
+ size_t nWritten = 0;
+ size_t nRemains = nSourceSize;
+
+ if ( nRemains )
+ {
+ /* mmap has problems, try the direct streaming */
+ char pBuffer[0x8000];
+ size_t nRead = 0;
+
+ nRemains = nSourceSize;
+
+ do
+ {
+ nRead = 0;
+ nWritten = 0;
+
+ size_t nToRead = std::min( (size_t)0x8000, nRemains );
+ nRead = read( SourceFileFD, pBuffer, nToRead );
+ if ( (size_t)-1 != nRead )
+ nWritten = write( DestFileFD, pBuffer, nRead );
+
+ if ( (size_t)-1 != nWritten )
+ nRemains -= nWritten;
+ }
+ while( nRemains && (size_t)-1 != nRead && nRead == nWritten );
+ }
+
+ if ( nRemains )
+ {
+ if ( errno )
+ nRet = errno;
+ else
+ nRet = ENOSPC;
+ }
+
+ close( SourceFileFD );
+ if ( close( DestFileFD ) == -1 && nRet == 0 )
+ nRet = errno;
+
+ return nRet;
+}
+
diff --git a/sal/osl/unx/file_path_helper.cxx b/sal/osl/unx/file_path_helper.cxx
new file mode 100644
index 000000000000..04fdd13e7c15
--- /dev/null
+++ b/sal/osl/unx/file_path_helper.cxx
@@ -0,0 +1,350 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+ /*******************************************
+ Includes
+ ******************************************/
+
+ #ifndef _OSL_FILE_PATH_HELPER_H_
+ #include "file_path_helper.h"
+ #endif
+
+ #ifndef _OSL_FILE_PATH_HELPER_HXX_
+ #include "file_path_helper.hxx"
+ #endif
+
+ #ifndef _OSL_UUNXAPI_HXX_
+ #include "uunxapi.hxx"
+ #endif
+
+ #ifndef _OSL_DIAGNOSE_H_
+ #include <osl/diagnose.h>
+ #endif
+
+ #ifndef _RTL_USTRING_HXX_
+ #include <rtl/ustring.hxx>
+ #endif
+
+ /*******************************************
+ Constants
+ ******************************************/
+
+ const sal_Unicode FPH_CHAR_PATH_SEPARATOR = (sal_Unicode)'/';
+ const sal_Unicode FPH_CHAR_DOT = (sal_Unicode)'.';
+ const sal_Unicode FPH_CHAR_COLON = (sal_Unicode)':';
+
+ inline const rtl::OUString FPH_PATH_SEPARATOR()
+ { return rtl::OUString::createFromAscii("/"); }
+ inline const rtl::OUString FPH_LOCAL_DIR_ENTRY()
+ { return rtl::OUString::createFromAscii("."); }
+ inline const rtl::OUString FPH_PARENT_DIR_ENTRY()
+ { return rtl::OUString::createFromAscii(".."); }
+
+ /*******************************************
+ * osl_systemPathRemoveSeparator
+ ******************************************/
+
+ void SAL_CALL osl_systemPathRemoveSeparator(rtl_uString* pustrPath)
+ {
+ OSL_PRECOND(pustrPath, "osl_systemPathRemoveSeparator: Invalid parameter");
+
+ // maybe there are more than one separator at end
+ // so we run in a loop
+ while ((pustrPath->length > 1) && (FPH_CHAR_PATH_SEPARATOR == pustrPath->buffer[pustrPath->length - 1]))
+ {
+ pustrPath->length--;
+ pustrPath->buffer[pustrPath->length] = (sal_Unicode)'\0';
+ }
+
+ OSL_POSTCOND((0 == pustrPath->length) || (1 == pustrPath->length) || \
+ (pustrPath->length > 1 && pustrPath->buffer[pustrPath->length - 1] != FPH_CHAR_PATH_SEPARATOR), \
+ "osl_systemPathRemoveSeparator: Post condition failed");
+ }
+
+ /*******************************************
+ osl_systemPathEnsureSeparator
+ ******************************************/
+
+ void SAL_CALL osl_systemPathEnsureSeparator(rtl_uString** ppustrPath)
+ {
+ OSL_PRECOND(ppustrPath && (NULL != *ppustrPath), \
+ "osl_systemPathEnsureSeparator: Invalid parameter");
+
+ rtl::OUString path(*ppustrPath);
+ sal_Int32 lp = path.getLength();
+ sal_Int32 i = path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR);
+
+ if ((lp > 1 && i != (lp - 1)) || ((lp < 2) && i < 0))
+ {
+ path += FPH_PATH_SEPARATOR();
+ rtl_uString_assign(ppustrPath, path.pData);
+ }
+
+ OSL_POSTCOND(path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR) == (path.getLength() - 1), \
+ "osl_systemPathEnsureSeparator: Post condition failed");
+ }
+
+ /*******************************************
+ * osl_systemPathIsRelativePath
+ ******************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsRelativePath(const rtl_uString* pustrPath)
+ {
+ OSL_PRECOND(pustrPath, "osl_systemPathIsRelativePath: Invalid parameter");
+ return ((0 == pustrPath->length) || (pustrPath->buffer[0] != FPH_CHAR_PATH_SEPARATOR));
+ }
+
+ /******************************************
+ osl_systemPathMakeAbsolutePath
+ *****************************************/
+
+ void SAL_CALL osl_systemPathMakeAbsolutePath(
+ const rtl_uString* pustrBasePath,
+ const rtl_uString* pustrRelPath,
+ rtl_uString** ppustrAbsolutePath)
+{
+ rtl::OUString base(rtl_uString_getStr(const_cast<rtl_uString*>(pustrBasePath)));
+ rtl::OUString rel(const_cast<rtl_uString*>(pustrRelPath));
+
+ if (base.getLength() > 0)
+ osl_systemPathEnsureSeparator(&base.pData);
+
+ base += rel;
+
+ rtl_uString_acquire(base.pData);
+ *ppustrAbsolutePath = base.pData;
+}
+
+
+ /*******************************************
+ osl_systemPathGetFileOrLastDirectoryPart
+ ******************************************/
+
+ void SAL_CALL osl_systemPathGetFileNameOrLastDirectoryPart(
+ const rtl_uString* pustrPath,
+ rtl_uString** ppustrFileNameOrLastDirPart)
+{
+ OSL_PRECOND(pustrPath && ppustrFileNameOrLastDirPart, \
+ "osl_systemPathGetFileNameOrLastDirectoryPart: Invalid parameter");
+
+ rtl::OUString path(const_cast<rtl_uString*>(pustrPath));
+
+ osl_systemPathRemoveSeparator(path.pData);
+
+ rtl::OUString last_part;
+
+ if (path.getLength() > 1 || (1 == path.getLength() && *path.getStr() != FPH_CHAR_PATH_SEPARATOR))
+ {
+ sal_Int32 idx_ps = path.lastIndexOf(FPH_CHAR_PATH_SEPARATOR);
+ idx_ps++; // always right to increment by one even if idx_ps == -1!
+ last_part = rtl::OUString(path.getStr() + idx_ps);
+ }
+ rtl_uString_assign(ppustrFileNameOrLastDirPart, last_part.pData);
+}
+
+
+ /********************************************
+ osl_systemPathIsHiddenFileOrDirectoryEntry
+ *********************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsHiddenFileOrDirectoryEntry(
+ const rtl_uString* pustrPath)
+{
+ OSL_PRECOND(pustrPath, "osl_systemPathIsHiddenFileOrDirectoryEntry: Invalid parameter");
+
+ sal_Bool is_hidden = sal_False;
+
+ if (pustrPath->length > 0)
+ {
+ rtl::OUString fdp;
+
+ osl_systemPathGetFileNameOrLastDirectoryPart(pustrPath, &fdp.pData);
+
+ is_hidden = ((fdp.pData->length > 0) && (fdp.pData->buffer[0] == FPH_CHAR_DOT) &&
+ !osl_systemPathIsLocalOrParentDirectoryEntry(fdp.pData));
+ }
+
+ return is_hidden;
+}
+
+
+ /************************************************
+ osl_systemPathIsLocalOrParentDirectoryEntry
+ ************************************************/
+
+sal_Bool SAL_CALL osl_systemPathIsLocalOrParentDirectoryEntry(
+ const rtl_uString* pustrPath)
+{
+ OSL_PRECOND(pustrPath, "osl_systemPathIsLocalOrParentDirectoryEntry: Invalid parameter");
+
+ rtl::OUString dirent;
+
+ osl_systemPathGetFileNameOrLastDirectoryPart(pustrPath, &dirent.pData);
+
+ return (
+ (dirent == FPH_LOCAL_DIR_ENTRY()) ||
+ (dirent == FPH_PARENT_DIR_ENTRY())
+ );
+}
+
+/***********************************************
+ Simple iterator for a path list separated by
+ the specified character
+ **********************************************/
+
+class path_list_iterator
+{
+public:
+
+ /******************************************
+ constructor
+
+ after construction get_current_item
+ returns the first path in list, no need
+ to call reset first
+ *****************************************/
+ path_list_iterator(const rtl::OUString& path_list, sal_Unicode list_separator = FPH_CHAR_COLON) :
+ m_path_list(path_list),
+ m_end(m_path_list.getStr() + m_path_list.getLength() + 1),
+ m_separator(list_separator)
+ {
+ reset();
+ }
+
+ /******************************************
+ reset the iterator
+ *****************************************/
+ void reset()
+ {
+ m_path_segment_begin = m_path_segment_end = m_path_list.getStr();
+ advance();
+ }
+
+ /******************************************
+ move the iterator to the next position
+ *****************************************/
+ void next()
+ {
+ OSL_PRECOND(!done(), "path_list_iterator: Already done!");
+
+ m_path_segment_begin = ++m_path_segment_end;
+ advance();
+ }
+
+ /******************************************
+ check if done
+ *****************************************/
+ bool done() const
+ {
+ return (m_path_segment_end >= m_end);
+ }
+
+ /******************************************
+ return the current item
+ *****************************************/
+ rtl::OUString get_current_item() const
+ {
+ return rtl::OUString(
+ m_path_segment_begin,
+ (m_path_segment_end - m_path_segment_begin));
+ }
+
+private:
+
+ /******************************************
+ move m_path_end to the next separator or
+ to the edn of the string
+ *****************************************/
+ void advance()
+ {
+ while (!done() && *m_path_segment_end && (*m_path_segment_end != m_separator))
+ ++m_path_segment_end;
+
+ OSL_ASSERT(m_path_segment_end <= m_end);
+ }
+
+private:
+ rtl::OUString m_path_list;
+ const sal_Unicode* m_end;
+ const sal_Unicode m_separator;
+ const sal_Unicode* m_path_segment_begin;
+ const sal_Unicode* m_path_segment_end;
+
+// prevent copy and assignment
+private:
+ /******************************************
+ copy constructor
+ remember: do not simply copy m_path_begin
+ and m_path_end because they point to
+ the memory of other.m_path_list!
+ *****************************************/
+ path_list_iterator(const path_list_iterator& other);
+
+ /******************************************
+ assignment operator
+ remember: do not simply copy m_path_begin
+ and m_path_end because they point to
+ the memory of other.m_path_list!
+ *****************************************/
+ path_list_iterator& operator=(const path_list_iterator& other);
+};
+
+ /************************************************
+ osl_searchPath
+ ***********************************************/
+
+sal_Bool SAL_CALL osl_searchPath(
+ const rtl_uString* pustrFilePath,
+ const rtl_uString* pustrSearchPathList,
+ rtl_uString** ppustrPathFound)
+{
+ OSL_PRECOND(pustrFilePath && pustrSearchPathList && ppustrPathFound, "osl_searchPath: Invalid parameter");
+
+ bool bfound = false;
+ rtl::OUString fp(const_cast<rtl_uString*>(pustrFilePath));
+ rtl::OUString pl = rtl::OUString(const_cast<rtl_uString*>(pustrSearchPathList));
+ path_list_iterator pli(pl);
+
+ while (!pli.done())
+ {
+ rtl::OUString p = pli.get_current_item();
+ osl::systemPathEnsureSeparator(p);
+ p += fp;
+
+ if (osl::access(p, F_OK) > -1)
+ {
+ bfound = true;
+ rtl_uString_assign(ppustrPathFound, p.pData);
+ break;
+ }
+ pli.next();
+ }
+ return bfound;
+}
diff --git a/sal/osl/unx/file_path_helper.h b/sal/osl/unx/file_path_helper.h
new file mode 100644
index 000000000000..c1e3908fa9f2
--- /dev/null
+++ b/sal/osl/unx/file_path_helper.h
@@ -0,0 +1,247 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ #ifndef _OSL_FILE_PATH_HELPER_H_
+ #define _OSL_FILE_PATH_HELPER_H_
+
+
+ #ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+ #endif
+
+ #ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+ #endif
+
+
+ #ifdef __cplusplus
+ extern "C"
+ {
+ #endif
+
+
+ /*******************************************
+ osl_systemPathRemoveSeparator
+ Removes the last separator from the
+ given system path if any and if the path
+ is not the root path '/'
+
+ @param ppustrPath [inout] a system path
+ if the path is not the root path
+ and the last character is a
+ path separator it will be cut off
+ ppustrPath must not be NULL and
+ must point to a valid rtl_uString
+
+ @returns nothing
+
+ ******************************************/
+
+ void SAL_CALL osl_systemPathRemoveSeparator(
+ /*inout*/ rtl_uString* pustrPath);
+
+ /*******************************************
+ osl_systemPathEnsureSeparator
+ Adds a trailing path separator to the
+ given system path if not already there
+ and if the path is not the root path '/'
+
+ @param pustrPath [inout] a system path
+ if the path is not the root path
+ '/' and has no trailing separator
+ a separator will be added
+ ppustrPath must not be NULL and
+ must point to a valid rtl_uString
+
+ @returns nothing
+
+ ******************************************/
+
+ void SAL_CALL osl_systemPathEnsureSeparator(
+ /*inout*/ rtl_uString** ppustrPath);
+
+ /*******************************************
+ osl_systemPathIsRelativePath
+ Returns true if the given path is a
+ relative path and so starts not with '/'
+
+ @param pustrPath [in] a system path
+ pustrPath must not be NULL
+
+ @returns sal_True if the given path
+ doesn't start with a separator
+ else sal_False will be returned
+
+ ******************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsRelativePath(
+ const rtl_uString* pustrPath);
+
+ /******************************************
+ osl_systemPathMakeAbsolutePath
+ Append a relative path to a base path
+
+ @param pustrBasePath [in] a system
+ path that will be considered as
+ base path
+ pustrBasePath must not be NULL
+
+ @param pustrRelPath [in] a system path
+ that will be considered as
+ relative path
+ pustrBasePath must not be NULL
+
+ @param ppustrAbsolutePath [out] the
+ resulting path which is a
+ concatination of the base and
+ the relative path
+ if base path is empty the
+ resulting absolute path is the
+ relative path
+ if relative path is empty the
+ resulting absolute path is the
+ base path
+ if base and relative path are
+ empty the resulting absolute
+ path is also empty
+ ppustrAbsolutePath must not be
+ NULL and *ppustrAbsolutePath
+ must be 0 or point to a valid
+ rtl_uString
+
+ *****************************************/
+
+ void SAL_CALL osl_systemPathMakeAbsolutePath(
+ const rtl_uString* pustrBasePath,
+ const rtl_uString* pustrRelPath,
+ rtl_uString** ppustrAbsolutePath);
+
+ /*****************************************
+ osl_systemPathGetFileOrLastDirectoryPart
+ Returns the file or the directory part
+ of the given path
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @param ppustrFileOrDirPart [out] on
+ return receives the last part
+ of the given directory or the
+ file name
+ if pustrPath is the root path
+ '/' an empty string will be
+ returned
+ if pustrPath has a trailing
+ '/' the last part before the
+ '/' will be returned else
+ the part after the last '/'
+ will be returned
+
+ @returns nothing
+
+ ****************************************/
+ void SAL_CALL osl_systemPathGetFileNameOrLastDirectoryPart(
+ const rtl_uString* pustrPath,
+ rtl_uString** ppustrFileNameOrLastDirPart);
+
+
+ /********************************************
+ osl_systemPathIsHiddenFileOrDirectoryEntry
+ Returns sal_True if the last part of
+ given system path is not '.' or '..'
+ alone and starts with a '.'
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @returns sal_True if the last part of
+ the given system path starts
+ with '.' or sal_False the last
+ part is '.' or '..' alone or
+ doesn't start with a dot
+
+ *********************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsHiddenFileOrDirectoryEntry(
+ const rtl_uString* pustrPath);
+
+
+ /************************************************
+ osl_systemPathIsLocalOrParentDirectoryEntry
+ Returns sal_True if the last part of the given
+ system path is the local directory entry '.'
+ or the parent directory entry '..'
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @returns sal_True if the last part of the
+ given system path is '.' or '..'
+ else sal_False
+
+ ************************************************/
+
+ sal_Bool SAL_CALL osl_systemPathIsLocalOrParentDirectoryEntry(
+ const rtl_uString* pustrPath);
+
+
+ /************************************************
+ osl_searchPath
+ Searches for a file name or path name in all
+ directories specified by a given path list.
+ Symbolic links in the resulting path will not be
+ resolved, it's up to the caller to do this.
+
+ @param pustrFilePath [in] a file name or
+ directory name to search for, the name must
+ be provided as system path not as a file URL
+
+ @param pustrSearchPathList [in] a ':'
+ separated list of paths in which to search for
+ the file or directory name
+
+ @ppustrPathFound [out] on success receives the
+ complete path of the file or directory found
+ as a system path
+
+ @returns sal_True if the specified file or
+ directory was found else sal_False
+ ***********************************************/
+
+ sal_Bool SAL_CALL osl_searchPath(
+ const rtl_uString* pustrFilePath,
+ const rtl_uString* pustrSearchPathList,
+ rtl_uString** ppustrPathFound);
+
+
+ #ifdef __cplusplus
+ }
+ #endif
+
+
+ #endif /* #ifndef _OSL_PATH_HELPER_H_ */
+
diff --git a/sal/osl/unx/file_path_helper.hxx b/sal/osl/unx/file_path_helper.hxx
new file mode 100644
index 000000000000..4b429b111799
--- /dev/null
+++ b/sal/osl/unx/file_path_helper.hxx
@@ -0,0 +1,247 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_FILE_PATH_HELPER_HXX_
+#define _OSL_FILE_PATH_HELPER_HXX_
+
+
+#ifndef _OSL_FILE_PATH_HELPER_H_
+#include "file_path_helper.h"
+#endif
+
+#include <rtl/ustring.hxx>
+
+
+namespace osl
+{
+
+ /*******************************************
+ systemPathRemoveSeparator
+ Removes the last separator from the
+ given system path if any and if the path
+ is not the root path '/'
+
+ @param ppustrPath [inout] a system path
+ if the path is not the root path
+ and the last character is a
+ path separator it will be cut off
+ ppustrPath must not be NULL and
+ must point to a valid rtl_uString
+
+ @returns nothing
+
+ ******************************************/
+
+ inline void systemPathRemoveSeparator(/*inout*/ rtl::OUString& Path)
+ {
+ osl_systemPathRemoveSeparator(Path.pData);
+ }
+
+ /*******************************************
+ systemPathEnsureSeparator
+ Adds a trailing path separator to the
+ given system path if not already there
+ and if the path is not the root path '/'
+
+ @param pustrPath [inout] a system path
+ if the path is not the root path
+ '/' and has no trailing separator
+ a separator will be added
+ ppustrPath must not be NULL and
+ must point to a valid rtl_uString
+
+ @returns nothing
+
+ ******************************************/
+
+ inline void systemPathEnsureSeparator(/*inout*/ rtl::OUString& Path)
+ {
+ osl_systemPathEnsureSeparator(&Path.pData);
+ }
+
+ /*******************************************
+ systemPathIsRelativePath
+ Returns true if the given path is a
+ relative path and so starts not with '/'
+
+ @param pustrPath [in] a system path
+ pustrPath must not be NULL
+
+ @returns sal_True if the given path
+ doesn't start with a separator
+ else sal_False will be returned
+
+ ******************************************/
+
+ inline bool systemPathIsRelativePath(const rtl::OUString& Path)
+ {
+ return osl_systemPathIsRelativePath(Path.pData);
+ }
+
+ /******************************************
+ systemPathMakeAbsolutePath
+ Append a relative path to a base path
+
+ @param pustrBasePath [in] a system
+ path that will be considered as
+ base path
+ pustrBasePath must not be NULL
+
+ @param pustrRelPath [in] a system path
+ that will be considered as
+ relative path
+ pustrBasePath must not be NULL
+
+ @param ppustrAbsolutePath [out] the
+ resulting path which is a
+ concatination of the base and
+ the relative path
+ if base path is empty the
+ resulting absolute path is the
+ relative path
+ if relative path is empty the
+ resulting absolute path is the
+ base path
+ if base and relative path are
+ empty the resulting absolute
+ path is also empty
+ ppustrAbsolutePath must not be
+ NULL and *ppustrAbsolutePath
+ must be 0 or point to a valid
+ rtl_uString
+
+ *****************************************/
+
+ inline void systemPathMakeAbsolutePath(
+ const rtl::OUString& BasePath,
+ const rtl::OUString& RelPath,
+ rtl::OUString& AbsolutePath)
+ {
+ osl_systemPathMakeAbsolutePath(
+ BasePath.pData, RelPath.pData, &AbsolutePath.pData);
+ }
+
+ /*****************************************
+ systemPathGetFileOrLastDirectoryPart
+ Returns the file or the directory part
+ of the given path
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @param ppustrFileOrDirPart [out] on
+ return receives the last part
+ of the given directory or the
+ file name
+ if pustrPath is the root path
+ '/' an empty string will be
+ returned
+ if pustrPath has a trailing
+ '/' the last part before the
+ '/' will be returned else
+ the part after the last '/'
+ will be returned
+
+ @returns nothing
+
+ ****************************************/
+
+ inline void systemPathGetFileNameOrLastDirectoryPart(
+ const rtl::OUString& Path,
+ rtl::OUString& FileNameOrLastDirPart)
+ {
+ osl_systemPathGetFileNameOrLastDirectoryPart(
+ Path.pData, &FileNameOrLastDirPart.pData);
+ }
+
+
+ /********************************************
+ systemPathIsHiddenFileOrDirectoryEntry
+ Returns sal_True if the last part of
+ given system path is not '.' or '..'
+ alone and starts with a '.'
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @returns sal_True if the last part of
+ the given system path starts
+ with '.' or sal_False the last
+ part is '.' or '..' alone or
+ doesn't start with a dot
+
+ *********************************************/
+
+ inline bool systemPathIsHiddenFileOrDirectoryEntry(
+ const rtl::OUString& Path)
+ {
+ return osl_systemPathIsHiddenFileOrDirectoryEntry(Path.pData);
+ }
+
+
+ /************************************************
+ systemPathIsLocalOrParentDirectoryEntry
+ Returns sal_True if the last part of the given
+ system path is the local directory entry '.'
+ or the parent directory entry '..'
+
+ @param pustrPath [in] a system path,
+ must not be NULL
+
+ @returns sal_True if the last part of the
+ given system path is '.' or '..'
+ else sal_False
+
+ ************************************************/
+
+ inline bool systemPathIsLocalOrParentDirectoryEntry(
+ const rtl::OUString& Path)
+ {
+ return osl_systemPathIsLocalOrParentDirectoryEntry(Path.pData);
+ }
+
+ /************************************************
+ searchPath
+ ***********************************************/
+
+ inline bool searchPath(
+ const rtl::OUString& ustrFilePath,
+ const rtl::OUString& ustrSearchPathList,
+ rtl::OUString& ustrPathFound)
+ {
+ return osl_searchPath(
+ ustrFilePath.pData,
+ ustrSearchPathList.pData,
+ &ustrPathFound.pData);
+ }
+
+
+ } // namespace osl
+
+
+ #endif /* #ifndef _OSL_PATH_HELPER_HXX_ */
+
diff --git a/sal/osl/unx/file_stat.cxx b/sal/osl/unx/file_stat.cxx
new file mode 100644
index 000000000000..df32fa105a50
--- /dev/null
+++ b/sal/osl/unx/file_stat.cxx
@@ -0,0 +1,492 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "osl/file.h"
+
+#include "system.h"
+#include <sys/types.h>
+#include <dirent.h>
+#include <errno.h>
+#include <limits.h>
+#include <unistd.h>
+
+#include "file_impl.hxx"
+#include "file_error_transl.h"
+#include "file_path_helper.hxx"
+#include "file_url.h"
+#include "uunxapi.hxx"
+
+namespace /* private */
+{
+
+ inline void set_file_type(const struct stat& file_stat, oslFileStatus* pStat)
+ {
+ /* links to directories state also to be a directory */
+ if (S_ISLNK(file_stat.st_mode))
+ pStat->eType = osl_File_Type_Link;
+ else if (S_ISDIR(file_stat.st_mode))
+ pStat->eType = osl_File_Type_Directory;
+ else if (S_ISREG(file_stat.st_mode))
+ pStat->eType = osl_File_Type_Regular;
+ else if (S_ISFIFO(file_stat.st_mode))
+ pStat->eType = osl_File_Type_Fifo;
+ else if (S_ISSOCK(file_stat.st_mode))
+ pStat->eType = osl_File_Type_Socket;
+ else if (S_ISCHR(file_stat.st_mode) || S_ISBLK(file_stat.st_mode))
+ pStat->eType = osl_File_Type_Special;
+ else
+ pStat->eType = osl_File_Type_Unknown;
+
+ pStat->uValidFields |= osl_FileStatus_Mask_Type;
+ }
+
+ inline void set_file_access_mask(const struct stat& file_stat, oslFileStatus* pStat)
+ {
+ // user permissions
+ if (S_IRUSR & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_OwnRead;
+
+ if (S_IWUSR & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_OwnWrite;
+
+ if (S_IXUSR & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_OwnExe;
+
+ // group permissions
+ if (S_IRGRP & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_GrpRead;
+
+ if (S_IWGRP & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_GrpWrite;
+
+ if (S_IXGRP & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_GrpExe;
+
+ // others permissions
+ if (S_IROTH & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_OthRead;
+
+ if (S_IWOTH & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_OthWrite;
+
+ if (S_IXOTH & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_OthExe;
+
+ pStat->uValidFields |= osl_FileStatus_Mask_Attributes;
+ }
+
+ inline void set_file_access_rights(const struct stat& file_stat, int S_IR, int S_IW, int S_IX, oslFileStatus* pStat)
+ {
+ /* we cannot really map osl_File_Attribute_ReadOnly to
+ the Unix access rights, it's a Windows only flag
+ that's why the following hack. We set osl_FileStatus_Mask_Attributes
+ but if there is no read access for a file we clear the flag
+ again to signal to the caller that there are no file attributes
+ to read because that's better than to give them incorrect one.
+ */
+ pStat->uValidFields |= osl_FileStatus_Mask_Attributes;
+
+ if ((0 == (S_IW & file_stat.st_mode)) && (S_IR & file_stat.st_mode))
+ pStat->uAttributes |= osl_File_Attribute_ReadOnly;
+
+ if (S_IX & file_stat.st_mode)
+ pStat->uAttributes |= osl_File_Attribute_Executable;
+ }
+
+ /* a process may belong to up to NGROUPS_MAX groups, so when
+ checking group access rights, we have to check all belonging
+ groups */
+ inline bool is_in_process_grouplist(const gid_t file_group)
+ {
+ // check primary process group
+
+ if (getgid() == file_group)
+ return true;
+
+ // check supplementary process groups
+
+ gid_t grplist[NGROUPS_MAX];
+ int grp_number = getgroups(NGROUPS_MAX, grplist);
+
+ for (int i = 0; i < grp_number; i++)
+ {
+ if (grplist[i] == file_group)
+ return true;
+ }
+ return false;
+ }
+
+ /* Currently we are determining the file access right based
+ on the real user ID not the effective user ID!
+ We don't use access(...) because access follows links which
+ may cause performance problems see #97133.
+ */
+ inline void set_file_access_rights(const struct stat& file_stat, oslFileStatus* pStat)
+ {
+ if (getuid() == file_stat.st_uid)
+ {
+ set_file_access_rights(file_stat, S_IRUSR, S_IWUSR, S_IXUSR, pStat);
+ }
+ else if (is_in_process_grouplist(file_stat.st_gid))
+ {
+ set_file_access_rights(file_stat, S_IRGRP, S_IWGRP, S_IXGRP, pStat);
+ }
+ else
+ {
+ set_file_access_rights(file_stat, S_IROTH, S_IWOTH, S_IXOTH, pStat);
+ }
+ }
+
+ inline void set_file_hidden_status(const rtl::OUString& file_path, oslFileStatus* pStat)
+ {
+ pStat->uAttributes = osl::systemPathIsHiddenFileOrDirectoryEntry(file_path) ? osl_File_Attribute_Hidden : 0;
+ pStat->uValidFields |= osl_FileStatus_Mask_Attributes;
+ }
+
+ /* the set_file_access_rights must be called after set_file_hidden_status(...) and
+ set_file_access_mask(...) because of the hack in set_file_access_rights(...) */
+ inline void set_file_attributes(
+ const rtl::OUString& file_path, const struct stat& file_stat, const sal_uInt32 uFieldMask, oslFileStatus* pStat)
+ {
+ set_file_hidden_status(file_path, pStat);
+ set_file_access_mask(file_stat, pStat);
+
+ // we set the file access rights only on demand
+ // because it's potentially expensive
+ if (uFieldMask & osl_FileStatus_Mask_Attributes)
+ set_file_access_rights(file_stat, pStat);
+ }
+
+ inline void set_file_access_time(const struct stat& file_stat, oslFileStatus* pStat)
+ {
+ pStat->aAccessTime.Seconds = file_stat.st_atime;
+ pStat->aAccessTime.Nanosec = 0;
+ pStat->uValidFields |= osl_FileStatus_Mask_AccessTime;
+ }
+
+ inline void set_file_modify_time(const struct stat& file_stat, oslFileStatus* pStat)
+ {
+ pStat->aModifyTime.Seconds = file_stat.st_mtime;
+ pStat->aModifyTime.Nanosec = 0;
+ pStat->uValidFields |= osl_FileStatus_Mask_ModifyTime;
+ }
+
+ inline void set_file_size(const struct stat& file_stat, oslFileStatus* pStat)
+ {
+ if (S_ISREG(file_stat.st_mode))
+ {
+ pStat->uFileSize = file_stat.st_size;
+ pStat->uValidFields |= osl_FileStatus_Mask_FileSize;
+ }
+ }
+
+ /* we only need to call stat or lstat if one of the
+ following flags is set */
+ inline bool is_stat_call_necessary(sal_uInt32 field_mask, oslFileType file_type = osl_File_Type_Unknown)
+ {
+ return (
+ ((field_mask & osl_FileStatus_Mask_Type) && (file_type == osl_File_Type_Unknown)) ||
+ (field_mask & osl_FileStatus_Mask_Attributes) ||
+ (field_mask & osl_FileStatus_Mask_CreationTime) ||
+ (field_mask & osl_FileStatus_Mask_AccessTime) ||
+ (field_mask & osl_FileStatus_Mask_ModifyTime) ||
+ (field_mask & osl_FileStatus_Mask_FileSize) ||
+ (field_mask & osl_FileStatus_Mask_LinkTargetURL) ||
+ (field_mask & osl_FileStatus_Mask_Validate));
+ }
+
+ inline oslFileError set_link_target_url(const rtl::OUString& file_path, oslFileStatus* pStat)
+ {
+ rtl::OUString link_target;
+ if (!osl::realpath(file_path, link_target))
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ oslFileError osl_error = osl_getFileURLFromSystemPath(link_target.pData, &pStat->ustrLinkTargetURL);
+ if (osl_error != osl_File_E_None)
+ return osl_error;
+
+ pStat->uValidFields |= osl_FileStatus_Mask_LinkTargetURL;
+ return osl_File_E_None;
+ }
+
+ inline oslFileError setup_osl_getFileStatus(
+ DirectoryItem_Impl * pImpl, oslFileStatus* pStat, rtl::OUString& file_path)
+ {
+ if ((NULL == pImpl) || (NULL == pStat))
+ return osl_File_E_INVAL;
+
+ file_path = rtl::OUString(pImpl->m_ustrFilePath);
+ OSL_ASSERT(file_path.getLength() > 0);
+ if (file_path.getLength() <= 0)
+ return osl_File_E_INVAL;
+
+ pStat->uValidFields = 0;
+ return osl_File_E_None;
+ }
+
+} // end namespace private
+
+
+/****************************************************************************
+ * osl_getFileStatus
+ ****************************************************************************/
+
+oslFileError SAL_CALL osl_getFileStatus(oslDirectoryItem Item, oslFileStatus* pStat, sal_uInt32 uFieldMask)
+{
+ DirectoryItem_Impl * pImpl = static_cast< DirectoryItem_Impl* >(Item);
+
+ rtl::OUString file_path;
+ oslFileError osl_error = setup_osl_getFileStatus(pImpl, pStat, file_path);
+ if (osl_File_E_None != osl_error)
+ return osl_error;
+
+#if defined(__GNUC__) && (__GNUC__ < 3)
+ struct ::stat file_stat;
+#else
+ struct stat file_stat;
+#endif
+
+ bool bStatNeeded = is_stat_call_necessary(uFieldMask, pImpl->getFileType());
+ if (bStatNeeded && (0 != osl::lstat(file_path, file_stat)))
+ return oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ if (bStatNeeded)
+ {
+ // we set all these attributes because it's cheap
+ set_file_type(file_stat, pStat);
+ set_file_access_time(file_stat, pStat);
+ set_file_modify_time(file_stat, pStat);
+ set_file_size(file_stat, pStat);
+ set_file_attributes(file_path, file_stat, uFieldMask, pStat);
+
+ // file exists semantic of osl_FileStatus_Mask_Validate
+ if ((uFieldMask & osl_FileStatus_Mask_LinkTargetURL) && S_ISLNK(file_stat.st_mode))
+ {
+ osl_error = set_link_target_url(file_path, pStat);
+ if (osl_error != osl_File_E_None)
+ return osl_error;
+ }
+ }
+#ifdef _DIRENT_HAVE_D_TYPE
+ else if (uFieldMask & osl_FileStatus_Mask_Type)
+ {
+ pStat->eType = pImpl->getFileType();
+ pStat->uValidFields |= osl_FileStatus_Mask_Type;
+ }
+#endif /* _DIRENT_HAVE_D_TYPE */
+
+ if (uFieldMask & osl_FileStatus_Mask_FileURL)
+ {
+ if ((osl_error = osl_getFileURLFromSystemPath(file_path.pData, &pStat->ustrFileURL)) != osl_File_E_None)
+ return osl_error;
+
+ pStat->uValidFields |= osl_FileStatus_Mask_FileURL;
+ }
+
+ if (uFieldMask & osl_FileStatus_Mask_FileName)
+ {
+ osl_systemPathGetFileNameOrLastDirectoryPart(file_path.pData, &pStat->ustrFileName);
+ pStat->uValidFields |= osl_FileStatus_Mask_FileName;
+ }
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_setFileAttributes */
+/****************************************************************************/
+
+static oslFileError osl_psz_setFileAttributes( const sal_Char* pszFilePath, sal_uInt64 uAttributes )
+{
+ oslFileError osl_error = osl_File_E_None;
+ mode_t nNewMode = 0;
+
+ OSL_ENSURE(!(osl_File_Attribute_Hidden & uAttributes), "osl_File_Attribute_Hidden doesn't work under Unix");
+
+ if (uAttributes & osl_File_Attribute_OwnRead)
+ nNewMode |= S_IRUSR;
+
+ if (uAttributes & osl_File_Attribute_OwnWrite)
+ nNewMode|=S_IWUSR;
+
+ if (uAttributes & osl_File_Attribute_OwnExe)
+ nNewMode|=S_IXUSR;
+
+ if (uAttributes & osl_File_Attribute_GrpRead)
+ nNewMode|=S_IRGRP;
+
+ if (uAttributes & osl_File_Attribute_GrpWrite)
+ nNewMode|=S_IWGRP;
+
+ if (uAttributes & osl_File_Attribute_GrpExe)
+ nNewMode|=S_IXGRP;
+
+ if (uAttributes & osl_File_Attribute_OthRead)
+ nNewMode|=S_IROTH;
+
+ if (uAttributes & osl_File_Attribute_OthWrite)
+ nNewMode|=S_IWOTH;
+
+ if (uAttributes & osl_File_Attribute_OthExe)
+ nNewMode|=S_IXOTH;
+
+ if (chmod(pszFilePath, nNewMode) < 0)
+ osl_error = oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ return osl_error;
+}
+
+oslFileError SAL_CALL osl_setFileAttributes( rtl_uString* ustrFileURL, sal_uInt64 uAttributes )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrFileURL );
+
+ /* convert file url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+#ifdef MACOSX
+ if ( macxp_resolveAlias( path, PATH_MAX ) != 0 )
+ return oslTranslateFileError( OSL_FET_ERROR, errno );
+#endif/* MACOSX */
+
+ return osl_psz_setFileAttributes( path, uAttributes );
+}
+
+/****************************************************************************/
+/* osl_setFileTime */
+/****************************************************************************/
+
+static oslFileError osl_psz_setFileTime (
+ const sal_Char* pszFilePath,
+ const TimeValue* /*pCreationTime*/,
+ const TimeValue* pLastAccessTime,
+ const TimeValue* pLastWriteTime )
+{
+ int nRet=0;
+ struct utimbuf aTimeBuffer;
+ struct stat aFileStat;
+#ifdef DEBUG_OSL_FILE
+ struct tm* pTM=0;
+#endif
+
+ nRet = lstat(pszFilePath,&aFileStat);
+
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"File Times are (in localtime):\n");
+ pTM=localtime(&aFileStat.st_ctime);
+ fprintf(stderr,"CreationTime is '%s'\n",asctime(pTM));
+ pTM=localtime(&aFileStat.st_atime);
+ fprintf(stderr,"AccessTime is '%s'\n",asctime(pTM));
+ pTM=localtime(&aFileStat.st_mtime);
+ fprintf(stderr,"Modification is '%s'\n",asctime(pTM));
+
+ fprintf(stderr,"File Times are (in UTC):\n");
+ fprintf(stderr,"CreationTime is '%s'\n",ctime(&aFileStat.st_ctime));
+ fprintf(stderr,"AccessTime is '%s'\n",ctime(&aTimeBuffer.actime));
+ fprintf(stderr,"Modification is '%s'\n",ctime(&aTimeBuffer.modtime));
+#endif
+
+ if ( pLastAccessTime != 0 )
+ {
+ aTimeBuffer.actime=pLastAccessTime->Seconds;
+ }
+ else
+ {
+ aTimeBuffer.actime=aFileStat.st_atime;
+ }
+
+ if ( pLastWriteTime != 0 )
+ {
+ aTimeBuffer.modtime=pLastWriteTime->Seconds;
+ }
+ else
+ {
+ aTimeBuffer.modtime=aFileStat.st_mtime;
+ }
+
+ /* mfe: Creation time not used here! */
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"File Times are (in localtime):\n");
+ pTM=localtime(&aFileStat.st_ctime);
+ fprintf(stderr,"CreationTime now '%s'\n",asctime(pTM));
+ pTM=localtime(&aTimeBuffer.actime);
+ fprintf(stderr,"AccessTime now '%s'\n",asctime(pTM));
+ pTM=localtime(&aTimeBuffer.modtime);
+ fprintf(stderr,"Modification now '%s'\n",asctime(pTM));
+
+ fprintf(stderr,"File Times are (in UTC):\n");
+ fprintf(stderr,"CreationTime now '%s'\n",ctime(&aFileStat.st_ctime));
+ fprintf(stderr,"AccessTime now '%s'\n",ctime(&aTimeBuffer.actime));
+ fprintf(stderr,"Modification now '%s'\n",ctime(&aTimeBuffer.modtime));
+#endif
+
+ nRet=utime(pszFilePath,&aTimeBuffer);
+ if ( nRet < 0 )
+ {
+ nRet=errno;
+ return oslTranslateFileError(OSL_FET_ERROR, nRet);
+ }
+
+ return osl_File_E_None;
+}
+
+oslFileError SAL_CALL osl_setFileTime (
+ rtl_uString* ustrFileURL,
+ const TimeValue* pCreationTime,
+ const TimeValue* pLastAccessTime,
+ const TimeValue* pLastWriteTime )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrFileURL );
+
+ /* convert file url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrFileURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+#ifdef MACOSX
+ if ( macxp_resolveAlias( path, PATH_MAX ) != 0 )
+ return oslTranslateFileError( OSL_FET_ERROR, errno );
+#endif/* MACOSX */
+
+ return osl_psz_setFileTime( path, pCreationTime, pLastAccessTime, pLastWriteTime );
+}
diff --git a/sal/osl/unx/file_url.cxx b/sal/osl/unx/file_url.cxx
new file mode 100644
index 000000000000..26290957f802
--- /dev/null
+++ b/sal/osl/unx/file_url.cxx
@@ -0,0 +1,962 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "file_url.h"
+
+#include "system.h"
+
+#include <limits.h>
+#include <errno.h>
+#include <strings.h>
+#include <unistd.h>
+
+#include "osl/file.hxx"
+#include <osl/security.h>
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <osl/process.h>
+
+#include <rtl/uri.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.h>
+#include "rtl/textcvt.h"
+
+#include "file_error_transl.h"
+#include "file_path_helper.hxx"
+
+#include "uunxapi.hxx"
+
+/***************************************************
+
+ General note
+
+ This file contains the part that handles File URLs.
+
+ File URLs as scheme specific notion of URIs
+ (RFC2396) may be handled platform independend, but
+ will not in osl which is considered wrong.
+ Future version of osl should handle File URLs this
+ way. In rtl/uri there is already an URI parser etc.
+ so this code should be consolidated.
+
+ **************************************************/
+/************************************************************************
+ * ToDo
+ *
+ * Fix osl_getCanonicalName
+ *
+ ***********************************************************************/
+
+
+/***************************************************
+ * namespace directives
+ **************************************************/
+
+using namespace osl;
+
+/***************************************************
+ * constants
+ **************************************************/
+
+const sal_Unicode UNICHAR_SLASH = ((sal_Unicode)'/');
+const sal_Unicode UNICHAR_COLON = ((sal_Unicode)':');
+const sal_Unicode UNICHAR_DOT = ((sal_Unicode)'.');
+
+/******************************************************************************
+ *
+ * Exported Module Functions
+ *
+ *****************************************************************************/
+
+/* a slightly modified version of Pchar in rtl/source/uri.c */
+const sal_Bool uriCharClass[128] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Pchar but without encoding slashes */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* !"#$%&'()*+,-./ */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, /* 0123456789:;<=>? */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ABCDEFGHIJKLMNO */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* PQRSTUVWXYZ[\]^_ */
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* `abcdefghijklmno */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /* pqrstuvwxyz{|}~ */
+};
+
+
+/* check for top wrong usage strings */
+/*
+static sal_Bool findWrongUsage( const sal_Unicode *path, sal_Int32 len )
+{
+ rtl_uString *pTmp = NULL;
+ sal_Bool bRet;
+
+ rtl_uString_newFromStr_WithLength( &pTmp, path, len );
+
+ rtl_ustr_toAsciiLowerCase_WithLength( pTmp->buffer, pTmp->length );
+
+ bRet = ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "ftp://", 6 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "http://", 7 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "vnd.sun.star", 12 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "private:", 8 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pTmp->buffer, pTmp->length, "slot:", 5) );
+
+ rtl_uString_release( pTmp );
+ return bRet;
+}
+*/
+
+/****************************************************************************/
+/* osl_getCanonicalName */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_getCanonicalName( rtl_uString* ustrFileURL, rtl_uString** pustrValidURL )
+{
+ OSL_ENSURE(0, "osl_getCanonicalName not implemented");
+
+ rtl_uString_newFromString(pustrValidURL, ustrFileURL);
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_getSystemPathFromFileURL */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_getSystemPathFromFileURL( rtl_uString *ustrFileURL, rtl_uString **pustrSystemPath )
+{
+ sal_Int32 nIndex;
+ rtl_uString * pTmp = NULL;
+
+ sal_Unicode encodedSlash[3] = { '%', '2', 'F' };
+ sal_Unicode protocolDelimiter[3] = { ':', '/', '/' };
+
+ /* temporary hack: if already system path, return ustrFileURL */
+ /*
+ if( (sal_Unicode) '/' == ustrFileURL->buffer[0] )
+ {
+ OSL_ENSURE( 0, "osl_getSystemPathFromFileURL: input is already system path" );
+ rtl_uString_assign( pustrSystemPath, ustrFileURL );
+ return osl_File_E_None;
+ }
+ */
+
+ /* a valid file url may not start with '/' */
+ if( ( 0 == ustrFileURL->length ) || ( (sal_Unicode) '/' == ustrFileURL->buffer[0] ) )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ /* Check for non file:// protocols */
+
+ nIndex = rtl_ustr_indexOfStr_WithLength( ustrFileURL->buffer, ustrFileURL->length, protocolDelimiter, 3 );
+ if ( -1 != nIndex && (4 != nIndex || 0 != rtl_ustr_ascii_shortenedCompare_WithLength( ustrFileURL->buffer, ustrFileURL->length,"file", 4 ) ) )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ /* search for encoded slashes (%2F) and decode every single token if we find one */
+
+ nIndex = 0;
+
+ if( -1 != rtl_ustr_indexOfStr_WithLength( ustrFileURL->buffer, ustrFileURL->length, encodedSlash, 3 ) )
+ {
+ rtl_uString * ustrPathToken = NULL;
+ sal_Int32 nOffset = 7;
+
+ do
+ {
+ nOffset += nIndex;
+
+ /* break url down in '/' devided tokens tokens */
+ nIndex = rtl_ustr_indexOfChar_WithLength( ustrFileURL->buffer + nOffset, ustrFileURL->length - nOffset, (sal_Unicode) '/' );
+
+ /* copy token to new string */
+ rtl_uString_newFromStr_WithLength( &ustrPathToken, ustrFileURL->buffer + nOffset,
+ -1 == nIndex ? ustrFileURL->length - nOffset : nIndex++ );
+
+ /* decode token */
+ rtl_uriDecode( ustrPathToken, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8, &pTmp );
+
+ /* the result should not contain any '/' */
+ if( -1 != rtl_ustr_indexOfChar_WithLength( pTmp->buffer, pTmp->length, (sal_Unicode) '/' ) )
+ {
+ rtl_uString_release( pTmp );
+ rtl_uString_release( ustrPathToken );
+
+ return osl_File_E_INVAL;
+ }
+
+ } while( -1 != nIndex );
+
+ /* release temporary string and restore index variable */
+ rtl_uString_release( ustrPathToken );
+ nIndex = 0;
+ }
+
+ /* protocol and server should not be encoded, so decode the whole string */
+ rtl_uriDecode( ustrFileURL, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8, &pTmp );
+
+ /* check if file protocol specified */
+ /* FIXME: use rtl_ustr_ascii_shortenedCompareIgnoreCase_WithLength when available */
+ if( 7 <= pTmp->length )
+ {
+ rtl_uString * pProtocol = NULL;
+ rtl_uString_newFromStr_WithLength( &pProtocol, pTmp->buffer, 7 );
+
+ /* protocol is case insensitive */
+ rtl_ustr_toAsciiLowerCase_WithLength( pProtocol->buffer, pProtocol->length );
+
+ if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pProtocol->buffer, pProtocol->length,"file://", 7 ) )
+ nIndex = 7;
+
+ rtl_uString_release( pProtocol );
+ }
+
+ /* skip "localhost" or "127.0.0.1" if "file://" is specified */
+ /* FIXME: use rtl_ustr_ascii_shortenedCompareIgnoreCase_WithLength when available */
+ if( nIndex && ( 10 <= pTmp->length - nIndex ) )
+ {
+ rtl_uString * pServer = NULL;
+ rtl_uString_newFromStr_WithLength( &pServer, pTmp->buffer + nIndex, 10 );
+
+ /* server is case insensitive */
+ rtl_ustr_toAsciiLowerCase_WithLength( pServer->buffer, pServer->length );
+
+ if( ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pServer->buffer, pServer->length,"localhost/", 10 ) ) ||
+ ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( pServer->buffer, pServer->length,"127.0.0.1/", 10 ) ) )
+ {
+ /* don't exclude the '/' */
+ nIndex += 9;
+ }
+
+ rtl_uString_release( pServer );
+ }
+
+ if( nIndex )
+ rtl_uString_newFromStr_WithLength( &pTmp, pTmp->buffer + nIndex, pTmp->length - nIndex );
+
+ /* check if system path starts with ~ or ~user and replace it with the appropriate home dir */
+ if( (sal_Unicode) '~' == pTmp->buffer[0] )
+ {
+ /* check if another user is specified */
+ if( ( 1 == pTmp->length ) || ( (sal_Unicode)'/' == pTmp->buffer[1] ) )
+ {
+ rtl_uString *pTmp2 = NULL;
+
+ /* osl_getHomeDir returns file URL */
+ osl_getHomeDir( osl_getCurrentSecurity(), &pTmp2 );
+
+ /* remove "file://" prefix */
+ rtl_uString_newFromStr_WithLength( &pTmp2, pTmp2->buffer + 7, pTmp2->length - 7 );
+
+ /* replace '~' in original string */
+ rtl_uString_newReplaceStrAt( &pTmp, pTmp, 0, 1, pTmp2 );
+ rtl_uString_release( pTmp2 );
+ }
+
+ else
+ {
+ /* FIXME: replace ~user with users home directory */
+ return osl_File_E_INVAL;
+ }
+ }
+
+ /* temporary check for top 5 wrong usage strings (which are valid but unlikly filenames) */
+ /*
+ OSL_ASSERT( !findWrongUsage( pTmp->buffer, pTmp->length ) );
+ */
+
+ *pustrSystemPath = pTmp;
+ return osl_File_E_None;
+}
+
+/****************************************************************************/
+/* osl_getFileURLFromSystemPath */
+/****************************************************************************/
+
+oslFileError SAL_CALL osl_getFileURLFromSystemPath( rtl_uString *ustrSystemPath, rtl_uString **pustrFileURL )
+{
+ static const sal_Unicode pDoubleSlash[2] = { '/', '/' };
+
+ rtl_uString *pTmp = NULL;
+ sal_Int32 nIndex;
+
+ if( 0 == ustrSystemPath->length )
+ return osl_File_E_INVAL;
+
+ /* temporary hack: if already file url, return ustrSystemPath */
+
+ if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( ustrSystemPath->buffer, ustrSystemPath->length,"file:", 5 ) )
+ {
+ /*
+ if( 0 == rtl_ustr_ascii_shortenedCompare_WithLength( ustrSystemPath->buffer, ustrSystemPath->length,"file://", 7 ) )
+ {
+ OSL_ENSURE( 0, "osl_getFileURLFromSystemPath: input is already file URL" );
+ rtl_uString_assign( pustrFileURL, ustrSystemPath );
+ }
+ else
+ {
+ rtl_uString *pTmp2 = NULL;
+
+ OSL_ENSURE( 0, "osl_getFileURLFromSystemPath: input is wrong file URL" );
+ rtl_uString_newFromStr_WithLength( pustrFileURL, ustrSystemPath->buffer + 5, ustrSystemPath->length - 5 );
+ rtl_uString_newFromAscii( &pTmp2, "file://" );
+ rtl_uString_newConcat( pustrFileURL, *pustrFileURL, pTmp2 );
+ rtl_uString_release( pTmp2 );
+ }
+ return osl_File_E_None;
+ */
+ return osl_File_E_INVAL;
+ }
+
+
+ /* check if system path starts with ~ or ~user and replace it with the appropriate home dir */
+ if( (sal_Unicode) '~' == ustrSystemPath->buffer[0] )
+ {
+ /* check if another user is specified */
+ if( ( 1 == ustrSystemPath->length ) || ( (sal_Unicode)'/' == ustrSystemPath->buffer[1] ) )
+ {
+ /* osl_getHomeDir returns file URL */
+ osl_getHomeDir( osl_getCurrentSecurity(), &pTmp );
+
+ /* remove "file://" prefix */
+ rtl_uString_newFromStr_WithLength( &pTmp, pTmp->buffer + 7, pTmp->length - 7 );
+
+ /* replace '~' in original string */
+ rtl_uString_newReplaceStrAt( &pTmp, ustrSystemPath, 0, 1, pTmp );
+ }
+
+ else
+ {
+ /* FIXME: replace ~user with users home directory */
+ return osl_File_E_INVAL;
+ }
+ }
+
+ /* check if initial string contains double instances of '/' */
+ nIndex = rtl_ustr_indexOfStr_WithLength( ustrSystemPath->buffer, ustrSystemPath->length, pDoubleSlash, 2 );
+ if( -1 != nIndex )
+ {
+ sal_Int32 nSrcIndex;
+ sal_Int32 nDeleted = 0;
+
+ /* if pTmp is not already allocated, copy ustrSystemPath for modification */
+ if( NULL == pTmp )
+ rtl_uString_newFromString( &pTmp, ustrSystemPath );
+
+ /* adapt index to pTmp */
+ nIndex += pTmp->length - ustrSystemPath->length;
+
+ /* remove all occurances of '//' */
+ for( nSrcIndex = nIndex + 1; nSrcIndex < pTmp->length; nSrcIndex++ )
+ {
+ if( ((sal_Unicode) '/' == pTmp->buffer[nSrcIndex]) && ((sal_Unicode) '/' == pTmp->buffer[nIndex]) )
+ nDeleted++;
+ else
+ pTmp->buffer[++nIndex] = pTmp->buffer[nSrcIndex];
+ }
+
+ /* adjust length member */
+ pTmp->length -= nDeleted;
+ }
+
+ if( NULL == pTmp )
+ rtl_uString_assign( &pTmp, ustrSystemPath );
+
+ /* temporary check for top 5 wrong usage strings (which are valid but unlikly filenames) */
+ /*
+ OSL_ASSERT( !findWrongUsage( pTmp->buffer, pTmp->length ) );
+ */
+
+ /* file URLs must be URI encoded */
+ rtl_uriEncode( pTmp, uriCharClass, rtl_UriEncodeIgnoreEscapes, RTL_TEXTENCODING_UTF8, pustrFileURL );
+
+ rtl_uString_release( pTmp );
+
+ /* absolute urls should start with 'file://' */
+ if( (sal_Unicode)'/' == (*pustrFileURL)->buffer[0] )
+ {
+ rtl_uString *pProtocol = NULL;
+
+ rtl_uString_newFromAscii( &pProtocol, "file://" );
+ rtl_uString_newConcat( pustrFileURL, pProtocol, *pustrFileURL );
+ rtl_uString_release( pProtocol );
+ }
+
+ return osl_File_E_None;
+}
+
+/****************************************************************************
+ * osl_getSystemPathFromFileURL_Ex - helper function
+ * clients may specify if they want to accept relative
+ * URLs or not
+ ****************************************************************************/
+
+oslFileError osl_getSystemPathFromFileURL_Ex(
+ rtl_uString *ustrFileURL, rtl_uString **pustrSystemPath, sal_Bool bAllowRelative)
+{
+ rtl_uString* temp = 0;
+ oslFileError osl_error = osl_getSystemPathFromFileURL(ustrFileURL, &temp);
+
+ if (osl_File_E_None == osl_error)
+ {
+ if (bAllowRelative || (UNICHAR_SLASH == temp->buffer[0]))
+ {
+ *pustrSystemPath = temp;
+ }
+ else
+ {
+ rtl_uString_release(temp);
+ osl_error = osl_File_E_INVAL;
+ }
+ }
+
+ return osl_error;
+}
+
+namespace /* private */
+{
+
+ /******************************************************
+ * Helper function, return a pinter to the final '\0'
+ * of a string
+ ******************************************************/
+
+ sal_Unicode* ustrtoend(sal_Unicode* pStr)
+ {
+ return (pStr + rtl_ustr_getLength(pStr));
+ }
+
+ /*********************************************
+
+ ********************************************/
+
+ sal_Unicode* ustrchrcat(const sal_Unicode chr, sal_Unicode* d)
+ {
+ sal_Unicode* p = ustrtoend(d);
+ *p++ = chr;
+ *p = 0;
+ return d;
+ }
+
+ /******************************************************
+ *
+ ******************************************************/
+
+ bool _islastchr(sal_Unicode* pStr, sal_Unicode Chr)
+ {
+ sal_Unicode* p = ustrtoend(pStr);
+ if (p > pStr)
+ p--;
+ return (*p == Chr);
+ }
+
+ /******************************************************
+ * Remove the last part of a path, a path that has
+ * only a '/' or no '/' at all will be returned
+ * unmodified
+ ******************************************************/
+
+ sal_Unicode* _rmlastpathtoken(sal_Unicode* aPath)
+ {
+ /* we always may skip -2 because we
+ may at least stand on a '/' but
+ either there is no other character
+ before this '/' or it's another
+ character than the '/'
+ */
+ sal_Unicode* p = ustrtoend(aPath) - 2;
+
+ // move back to the next path separator
+ // or to the start of the string
+ while ((p > aPath) && (*p != UNICHAR_SLASH))
+ p--;
+
+ if (p >= aPath)
+ {
+ if (UNICHAR_SLASH == *p)
+ {
+ p++;
+ *p = '\0';
+ }
+ else
+ {
+ *p = '\0';
+ }
+ }
+
+ return aPath;
+ }
+
+ /******************************************************
+ *
+ ******************************************************/
+
+ oslFileError _osl_resolvepath(
+ /*inout*/ sal_Unicode* path,
+ /*inout*/ sal_Unicode* current_pos,
+ /*inout*/ bool* failed)
+ {
+ oslFileError ferr = osl_File_E_None;
+
+ if (!*failed)
+ {
+ char unresolved_path[PATH_MAX];
+ if (!UnicodeToText(unresolved_path, sizeof(unresolved_path), path, rtl_ustr_getLength(path)))
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ char resolved_path[PATH_MAX];
+ if (realpath(unresolved_path, resolved_path))
+ {
+ if (!TextToUnicode(resolved_path, strlen(resolved_path), path, PATH_MAX))
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ current_pos = ustrtoend(path) - 1;
+ }
+ else
+ {
+ if (EACCES == errno || ENOTDIR == errno || ENOENT == errno)
+ *failed = true;
+ else
+ ferr = oslTranslateFileError(OSL_FET_ERROR, errno);
+ }
+ }
+
+ return ferr;
+ }
+
+ /******************************************************
+ * Works even with non existing paths. The resulting
+ * path must not exceed PATH_MAX else
+ * osl_File_E_NAMETOOLONG is the result
+ ******************************************************/
+
+ oslFileError osl_getAbsoluteFileURL_impl_(const rtl::OUString& unresolved_path, rtl::OUString& resolved_path)
+ {
+ // the given unresolved path must not exceed PATH_MAX
+ if (unresolved_path.getLength() >= (PATH_MAX - 2))
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ sal_Unicode path_resolved_so_far[PATH_MAX];
+ const sal_Unicode* punresolved = unresolved_path.getStr();
+ sal_Unicode* presolvedsf = path_resolved_so_far;
+
+ // reserve space for leading '/' and trailing '\0'
+ // do not exceed this limit
+ sal_Unicode* sentinel = path_resolved_so_far + PATH_MAX - 2;
+
+ // if realpath fails with error ENOTDIR, EACCES or ENOENT
+ // we will not call it again, because _osl_realpath should also
+ // work with non existing directories etc.
+ bool realpath_failed = false;
+ oslFileError ferr;
+
+ path_resolved_so_far[0] = '\0';
+
+ while (*punresolved != '\0')
+ {
+ // ignore '/.' , skip one part back when '/..'
+
+ if ((UNICHAR_DOT == *punresolved) && (UNICHAR_SLASH == *presolvedsf))
+ {
+ if ('\0' == *(punresolved + 1))
+ {
+ punresolved++;
+ continue;
+ }
+ else if (UNICHAR_SLASH == *(punresolved + 1))
+ {
+ punresolved += 2;
+ continue;
+ }
+ else if ((UNICHAR_DOT == *(punresolved + 1)) && ('\0' == *(punresolved + 2) || (UNICHAR_SLASH == *(punresolved + 2))))
+ {
+ _rmlastpathtoken(path_resolved_so_far);
+
+ presolvedsf = ustrtoend(path_resolved_so_far) - 1;
+
+ if (UNICHAR_SLASH == *(punresolved + 2))
+ punresolved += 3;
+ else
+ punresolved += 2;
+
+ continue;
+ }
+ else // a file or directory name may start with '.'
+ {
+ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel)
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ ustrchrcat(*punresolved++, path_resolved_so_far);
+
+ if ('\0' == *punresolved && !realpath_failed)
+ {
+ ferr = _osl_resolvepath(
+ path_resolved_so_far,
+ presolvedsf,
+ &realpath_failed);
+
+ if (osl_File_E_None != ferr)
+ return ferr;
+ }
+ }
+ }
+ else if (UNICHAR_SLASH == *punresolved)
+ {
+ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel)
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ ustrchrcat(*punresolved++, path_resolved_so_far);
+
+ if (!realpath_failed)
+ {
+ ferr = _osl_resolvepath(
+ path_resolved_so_far,
+ presolvedsf,
+ &realpath_failed);
+
+ if (osl_File_E_None != ferr)
+ return ferr;
+
+ if (!_islastchr(path_resolved_so_far, UNICHAR_SLASH))
+ {
+ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel)
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ ustrchrcat(UNICHAR_SLASH, path_resolved_so_far);
+ }
+ }
+ }
+ else // any other character
+ {
+ if ((presolvedsf = ustrtoend(path_resolved_so_far)) > sentinel)
+ return oslTranslateFileError(OSL_FET_ERROR, ENAMETOOLONG);
+
+ ustrchrcat(*punresolved++, path_resolved_so_far);
+
+ if ('\0' == *punresolved && !realpath_failed)
+ {
+ ferr = _osl_resolvepath(
+ path_resolved_so_far,
+ presolvedsf,
+ &realpath_failed);
+
+ if (osl_File_E_None != ferr)
+ return ferr;
+ }
+ }
+ }
+
+ sal_Int32 len = rtl_ustr_getLength(path_resolved_so_far);
+
+ OSL_ASSERT(len < PATH_MAX);
+
+ resolved_path = rtl::OUString(path_resolved_so_far, len);
+
+ return osl_File_E_None;
+ }
+
+} // end namespace private
+
+
+/******************************************************
+ * osl_getAbsoluteFileURL
+ ******************************************************/
+
+oslFileError osl_getAbsoluteFileURL(rtl_uString* ustrBaseDirURL, rtl_uString* ustrRelativeURL, rtl_uString** pustrAbsoluteURL)
+{
+ FileBase::RC rc;
+ rtl::OUString unresolved_path;
+
+ rc = FileBase::getSystemPathFromFileURL(rtl::OUString(ustrRelativeURL), unresolved_path);
+
+ if(FileBase::E_None != rc)
+ return oslFileError(rc);
+
+ if (systemPathIsRelativePath(unresolved_path))
+ {
+ rtl::OUString base_path;
+ rc = (FileBase::RC) osl_getSystemPathFromFileURL_Ex(ustrBaseDirURL, &base_path.pData, sal_False);
+
+ if (FileBase::E_None != rc)
+ return oslFileError(rc);
+
+ rtl::OUString abs_path;
+ systemPathMakeAbsolutePath(base_path, unresolved_path, abs_path);
+
+ unresolved_path = abs_path;
+ }
+
+ rtl::OUString resolved_path;
+ rc = (FileBase::RC) osl_getAbsoluteFileURL_impl_(unresolved_path, resolved_path);
+
+ if (FileBase::E_None == rc)
+ {
+ rc = (FileBase::RC) osl_getFileURLFromSystemPath(resolved_path.pData, pustrAbsoluteURL);
+ OSL_ASSERT(FileBase::E_None == rc);
+ }
+
+ return oslFileError(rc);
+}
+
+
+namespace /* private */
+{
+
+ /*********************************************
+ No separate error code if unicode to text
+ conversion or getenv fails because for the
+ caller there is no difference why a file
+ could not be found in $PATH
+ ********************************************/
+
+ bool find_in_PATH(const rtl::OUString& file_path, rtl::OUString& result)
+ {
+ bool bfound = false;
+ rtl::OUString path = rtl::OUString::createFromAscii("PATH");
+ rtl::OUString env_path;
+
+ if (osl_Process_E_None == osl_getEnvironment(path.pData, &env_path.pData))
+ bfound = osl::searchPath(file_path, env_path, result);
+
+ return bfound;
+ }
+
+ /*********************************************
+ No separate error code if unicode to text
+ conversion or getcwd fails because for the
+ caller there is no difference why a file
+ could not be found in CDW
+ ********************************************/
+
+ bool find_in_CWD(const rtl::OUString& file_path, rtl::OUString& result)
+ {
+ bool bfound = false;
+ rtl::OUString cwd_url;
+
+ if (osl_Process_E_None == osl_getProcessWorkingDir(&cwd_url.pData))
+ {
+ rtl::OUString cwd;
+ FileBase::getSystemPathFromFileURL(cwd_url, cwd);
+ bfound = osl::searchPath(file_path, cwd, result);
+ }
+ return bfound;
+ }
+
+ /*********************************************
+
+ ********************************************/
+
+ bool find_in_searchPath(const rtl::OUString& file_path, rtl_uString* search_path, rtl::OUString& result)
+ {
+ return (search_path && osl::searchPath(file_path, rtl::OUString(search_path), result));
+ }
+
+} // end namespace private
+
+
+/****************************************************************************
+ * osl_searchFileURL
+ ***************************************************************************/
+
+oslFileError osl_searchFileURL(rtl_uString* ustrFilePath, rtl_uString* ustrSearchPath, rtl_uString** pustrURL)
+{
+ OSL_PRECOND(ustrFilePath && pustrURL, "osl_searchFileURL: invalid parameter");
+
+ FileBase::RC rc;
+ rtl::OUString file_path;
+
+ // try to interpret search path as file url else assume it's a system path list
+ rc = FileBase::getSystemPathFromFileURL(rtl::OUString(ustrFilePath), file_path);
+ if ((FileBase::E_None != rc) && (FileBase::E_INVAL == rc))
+ file_path = ustrFilePath;
+ else if (FileBase::E_None != rc)
+ return oslFileError(rc);
+
+ bool bfound = false;
+ rtl::OUString result;
+
+ if (find_in_searchPath(file_path, ustrSearchPath, result) ||
+ find_in_PATH(file_path, result) ||
+ find_in_CWD(file_path, result))
+ {
+ rtl::OUString resolved;
+
+ if (osl::realpath(result, resolved))
+ {
+#if OSL_DEBUG_LEVEL > 0
+ oslFileError osl_error =
+#endif
+ osl_getFileURLFromSystemPath(resolved.pData, pustrURL);
+ OSL_ASSERT(osl_File_E_None == osl_error);
+ bfound = true;
+ }
+ }
+ return bfound ? osl_File_E_None : osl_File_E_NOENT;
+}
+
+
+/****************************************************************************
+ * FileURLToPath
+ ***************************************************************************/
+
+oslFileError FileURLToPath(char * buffer, size_t bufLen, rtl_uString* ustrFileURL)
+{
+ rtl_uString* ustrSystemPath = NULL;
+ oslFileError osl_error = osl_getSystemPathFromFileURL(ustrFileURL, &ustrSystemPath);
+
+ if(osl_File_E_None != osl_error)
+ return osl_error;
+
+ osl_systemPathRemoveSeparator(ustrSystemPath);
+
+ /* convert unicode path to text */
+ if(!UnicodeToText( buffer, bufLen, ustrSystemPath->buffer, ustrSystemPath->length))
+ osl_error = oslTranslateFileError(OSL_FET_ERROR, errno);
+
+ rtl_uString_release(ustrSystemPath);
+
+ return osl_error;
+}
+
+/*****************************************************************************
+ * UnicodeToText
+ ****************************************************************************/
+
+namespace /* private */
+{
+ class UnicodeToTextConverter_Impl
+ {
+ rtl_UnicodeToTextConverter m_converter;
+
+ UnicodeToTextConverter_Impl()
+ : m_converter (rtl_createUnicodeToTextConverter (osl_getThreadTextEncoding()))
+ {}
+
+ ~UnicodeToTextConverter_Impl()
+ {
+ rtl_destroyUnicodeToTextConverter (m_converter);
+ }
+ public:
+ static UnicodeToTextConverter_Impl & getInstance()
+ {
+ static UnicodeToTextConverter_Impl g_theConverter;
+ return g_theConverter;
+ }
+
+ sal_Size convert(
+ sal_Unicode const * pSrcBuf, sal_Size nSrcChars, sal_Char * pDstBuf, sal_Size nDstBytes,
+ sal_uInt32 nFlags, sal_uInt32 * pInfo, sal_Size * pSrcCvtChars)
+ {
+ OSL_ASSERT(m_converter != 0);
+ return rtl_convertUnicodeToText (
+ m_converter, 0, pSrcBuf, nSrcChars, pDstBuf, nDstBytes, nFlags, pInfo, pSrcCvtChars);
+ }
+ };
+} // end namespace private
+
+int UnicodeToText( char * buffer, size_t bufLen, const sal_Unicode * uniText, sal_Int32 uniTextLen )
+{
+ sal_uInt32 nInfo = 0;
+ sal_Size nSrcChars = 0;
+
+ sal_Size nDestBytes = UnicodeToTextConverter_Impl::getInstance().convert (
+ uniText, uniTextLen, buffer, bufLen,
+ OUSTRING_TO_OSTRING_CVTFLAGS | RTL_UNICODETOTEXT_FLAGS_FLUSH, &nInfo, &nSrcChars);
+
+ if( nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL )
+ {
+ errno = EOVERFLOW;
+ return 0;
+ }
+
+ /* ensure trailing '\0' */
+ buffer[nDestBytes] = '\0';
+ return nDestBytes;
+}
+
+/*****************************************************************************
+ * TextToUnicode
+ ****************************************************************************/
+
+namespace /* private */
+{
+ class TextToUnicodeConverter_Impl
+ {
+ rtl_TextToUnicodeConverter m_converter;
+
+ TextToUnicodeConverter_Impl()
+ : m_converter (rtl_createTextToUnicodeConverter (osl_getThreadTextEncoding()))
+ {}
+
+ ~TextToUnicodeConverter_Impl()
+ {
+ rtl_destroyTextToUnicodeConverter (m_converter);
+ }
+
+ public:
+ static TextToUnicodeConverter_Impl & getInstance()
+ {
+ static TextToUnicodeConverter_Impl g_theConverter;
+ return g_theConverter;
+ }
+
+ sal_Size convert(
+ sal_Char const * pSrcBuf, sal_Size nSrcBytes, sal_Unicode * pDstBuf, sal_Size nDstChars,
+ sal_uInt32 nFlags, sal_uInt32 * pInfo, sal_Size * pSrcCvtBytes)
+ {
+ OSL_ASSERT(m_converter != 0);
+ return rtl_convertTextToUnicode (
+ m_converter, 0, pSrcBuf, nSrcBytes, pDstBuf, nDstChars, nFlags, pInfo, pSrcCvtBytes);
+ }
+ };
+} // end namespace private
+
+int TextToUnicode(
+ const char* text,
+ size_t text_buffer_size,
+ sal_Unicode* unic_text,
+ sal_Int32 unic_text_buffer_size)
+{
+ sal_uInt32 nInfo = 0;
+ sal_Size nSrcChars = 0;
+
+ sal_Size nDestBytes = TextToUnicodeConverter_Impl::getInstance().convert(
+ text, text_buffer_size, unic_text, unic_text_buffer_size,
+ OSTRING_TO_OUSTRING_CVTFLAGS | RTL_TEXTTOUNICODE_FLAGS_FLUSH, &nInfo, &nSrcChars);
+
+ if (nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL)
+ {
+ errno = EOVERFLOW;
+ return 0;
+ }
+
+ /* ensure trailing '\0' */
+ unic_text[nDestBytes] = '\0';
+ return nDestBytes;
+}
diff --git a/sal/osl/unx/file_url.h b/sal/osl/unx/file_url.h
new file mode 100644
index 000000000000..0a0d07823bba
--- /dev/null
+++ b/sal/osl/unx/file_url.h
@@ -0,0 +1,69 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_FILE_URL_H
+#define INCLUDED_FILE_URL_H
+
+#include "osl/file.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**************************************************
+ * osl_getSystemPathFromFileURL_Ex
+ *************************************************/
+
+#define FURL_ALLOW_RELATIVE sal_True
+#define FURL_DENY_RELATIVE sal_False
+
+oslFileError osl_getSystemPathFromFileURL_Ex(rtl_uString *ustrFileURL, rtl_uString **pustrSystemPath, sal_Bool bAllowRelative);
+
+/**************************************************
+ * FileURLToPath
+ *************************************************/
+
+oslFileError FileURLToPath(char * buffer, size_t bufLen, rtl_uString* ustrFileURL);
+
+/***************************************************
+ * UnicodeToText
+ **************************************************/
+
+int UnicodeToText(char * buffer, size_t bufLen, const sal_Unicode * uniText, sal_Int32 uniTextLen);
+
+/***************************************************
+ * TextToUniCode
+ **************************************************/
+
+int TextToUnicode(const char* text, size_t text_buffer_size, sal_Unicode* unic_text, sal_Int32 unic_text_buffer_size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* #define INCLUDED_FILE_URL_H */
diff --git a/sal/osl/unx/file_volume.cxx b/sal/osl/unx/file_volume.cxx
new file mode 100644
index 000000000000..cc7f61ec6a8b
--- /dev/null
+++ b/sal/osl/unx/file_volume.cxx
@@ -0,0 +1,1155 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "osl/file.h"
+
+#include "osl/diagnose.h"
+#include "osl/thread.h"
+#include "rtl/alloc.h"
+
+#include "file_error_transl.h"
+#include "file_url.h"
+#include "system.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+#ifdef HAVE_STATFS_H
+#undef HAVE_STATFS_H
+#endif
+
+#if defined(LINUX) && defined(__FreeBSD_kernel__)
+#undef LINUX
+#define FREEBSD 1
+#endif
+
+
+#if defined(SOLARIS)
+
+#include <sys/mnttab.h>
+#include <sys/statvfs.h>
+#define HAVE_STATFS_H
+#include <sys/fs/ufs_quota.h>
+static const sal_Char* MOUNTTAB="/etc/mnttab";
+
+#elif defined(LINUX)
+
+#include <mntent.h>
+#include <sys/vfs.h>
+#define HAVE_STATFS_H
+#include <sys/quota.h>
+//#include <ctype.h>
+static const sal_Char* MOUNTTAB="/etc/mtab";
+
+#elif defined(NETBSD) || defined(FREEBSD)
+
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+#include <ufs/ufs/quota.h>
+//#include <ctype.h>
+#define HAVE_STATFS_H
+
+/* No mounting table on *BSD
+ * This information is stored only in the kernel. */
+/* static const sal_Char* MOUNTTAB="/etc/mtab"; */
+
+#elif defined(MACOSX)
+
+#include <ufs/ufs/quota.h>
+//#include <ctype.h>
+#include <sys/param.h>
+#include <sys/mount.h>
+#define HAVE_STATFS_H
+// static const sal_Char* MOUNTTAB="/etc/mtab";
+
+#endif /* HAVE_STATFS_H */
+
+/************************************************************************
+ * ToDo
+ *
+ * - Fix: check for corresponding struct sizes in exported functions
+ * - check size/use of oslVolumeDeviceHandle
+ * - check size/use of oslVolumeInfo
+ ***********************************************************************/
+/******************************************************************************
+ *
+ * Data Type Definition
+ *
+ ******************************************************************************/
+
+typedef struct _oslVolumeDeviceHandleImpl
+{
+ sal_Char pszMountPoint[PATH_MAX];
+ sal_Char pszFilePath[PATH_MAX];
+ sal_Char pszDevice[PATH_MAX];
+ sal_Char ident[4];
+ sal_uInt32 RefCount;
+} oslVolumeDeviceHandleImpl;
+
+/******************************************************************************
+ *
+ * 'removeable device' aka floppy functions
+ *
+ *****************************************************************************/
+
+static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath);
+static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy);
+static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy);
+
+#if defined(SOLARIS)
+static sal_Bool osl_isFloppyMounted(sal_Char* pszPath, sal_Char* pszMountPath);
+static sal_Bool osl_getFloppyMountEntry(const sal_Char* pszPath, sal_Char* pBuffer);
+static sal_Bool osl_checkFloppyPath(sal_Char* pszPath, sal_Char* pszFilePath, sal_Char* pszDevicePath);
+#endif /* SOLARIS */
+
+#if defined(LINUX)
+static sal_Bool osl_isFloppyMounted(oslVolumeDeviceHandleImpl* pDevice);
+static sal_Bool osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem);
+#endif /* LINUX */
+
+#ifdef DEBUG_OSL_FILE
+static void osl_printFloppyHandle(oslVolumeDeviceHandleImpl* hFloppy);
+#endif /* DEBUG_OSL_FILE */
+
+/******************************************************************************
+ *
+ * C-String Function Declarations
+ *
+ *****************************************************************************/
+
+static oslFileError osl_psz_getVolumeInformation(const sal_Char* , oslVolumeInfo* pInfo, sal_uInt32 uFieldMask);
+
+/****************************************************************************/
+/* osl_getVolumeInformation */
+/****************************************************************************/
+
+oslFileError osl_getVolumeInformation( rtl_uString* ustrDirectoryURL, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask )
+{
+ char path[PATH_MAX];
+ oslFileError eRet;
+
+ OSL_ASSERT( ustrDirectoryURL );
+ OSL_ASSERT( pInfo );
+
+ /* convert directory url to system path */
+ eRet = FileURLToPath( path, PATH_MAX, ustrDirectoryURL );
+ if( eRet != osl_File_E_None )
+ return eRet;
+
+#ifdef MACOSX
+ if ( macxp_resolveAlias( path, PATH_MAX ) != 0 )
+ return oslTranslateFileError( OSL_FET_ERROR, errno );
+#endif/* MACOSX */
+
+ return osl_psz_getVolumeInformation( path, pInfo, uFieldMask);
+}
+
+/******************************************************************************
+ *
+ * C-String Versions of Exported Module Functions
+ *
+ *****************************************************************************/
+
+#ifdef HAVE_STATFS_H
+
+#if defined(FREEBSD) || defined(NETBSD) || defined(MACOSX)
+# define __OSL_STATFS_STRUCT struct statfs
+# define __OSL_STATFS(dir, sfs) statfs((dir), (sfs))
+# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_bsize))
+# define __OSL_STATFS_TYPENAME(a) ((a).f_fstypename)
+# define __OSL_STATFS_ISREMOTE(a) (((a).f_type & MNT_LOCAL) == 0)
+
+/* always return true if queried for the properties of
+ the file system. If you think this is wrong under any
+ of the target platforms fix it!!!! */
+# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1)
+# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
+#endif /* FREEBSD || NETBSD || MACOSX */
+
+#if defined(LINUX)
+# define __OSL_NFS_SUPER_MAGIC 0x6969
+# define __OSL_SMB_SUPER_MAGIC 0x517B
+# define __OSL_MSDOS_SUPER_MAGIC 0x4d44
+# define __OSL_NTFS_SUPER_MAGIC 0x5346544e
+# define __OSL_STATFS_STRUCT struct statfs
+# define __OSL_STATFS(dir, sfs) statfs((dir), (sfs))
+# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_bsize))
+# define __OSL_STATFS_IS_NFS(a) (__OSL_NFS_SUPER_MAGIC == (a).f_type)
+# define __OSL_STATFS_IS_SMB(a) (__OSL_SMB_SUPER_MAGIC == (a).f_type)
+# define __OSL_STATFS_ISREMOTE(a) (__OSL_STATFS_IS_NFS((a)) || __OSL_STATFS_IS_SMB((a)))
+# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) ((__OSL_MSDOS_SUPER_MAGIC != (a).f_type) && (__OSL_NTFS_SUPER_MAGIC != (a).f_type))
+# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) ((__OSL_MSDOS_SUPER_MAGIC != (a).f_type))
+#endif /* LINUX */
+
+#if defined(SOLARIS)
+# define __OSL_STATFS_STRUCT struct statvfs
+# define __OSL_STATFS(dir, sfs) statvfs((dir), (sfs))
+# define __OSL_STATFS_BLKSIZ(a) ((sal_uInt64)((a).f_frsize))
+# define __OSL_STATFS_TYPENAME(a) ((a).f_basetype)
+# define __OSL_STATFS_ISREMOTE(a) (rtl_str_compare((a).f_basetype, "nfs") == 0)
+
+/* always return true if queried for the properties of
+ the file system. If you think this is wrong under any
+ of the target platforms fix it!!!! */
+# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1)
+# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
+#endif /* SOLARIS */
+
+# define __OSL_STATFS_INIT(a) (memset(&(a), 0, sizeof(__OSL_STATFS_STRUCT)))
+
+#else /* no statfs available */
+
+# define __OSL_STATFS_STRUCT struct dummy {int i;}
+# define __OSL_STATFS_INIT(a) ((void)0)
+# define __OSL_STATFS(dir, sfs) (1)
+# define __OSL_STATFS_ISREMOTE(sfs) (0)
+# define __OSL_STATFS_IS_CASE_SENSITIVE_FS(a) (1)
+# define __OSL_STATFS_IS_CASE_PRESERVING_FS(a) (1)
+#endif /* HAVE_STATFS_H */
+
+
+static oslFileError osl_psz_getVolumeInformation (
+ const sal_Char* pszDirectory, oslVolumeInfo* pInfo, sal_uInt32 uFieldMask)
+{
+ __OSL_STATFS_STRUCT sfs;
+
+ if (!pInfo)
+ return osl_File_E_INVAL;
+
+ __OSL_STATFS_INIT(sfs);
+
+ pInfo->uValidFields = 0;
+ pInfo->uAttributes = 0;
+
+ if ((__OSL_STATFS(pszDirectory, &sfs)) < 0)
+ {
+ oslFileError result = oslTranslateFileError(OSL_FET_ERROR, errno);
+ return (result);
+ }
+
+ /* FIXME: how to detect the kind of storage (fixed, cdrom, ...) */
+ if (uFieldMask & osl_VolumeInfo_Mask_Attributes)
+ {
+ if (__OSL_STATFS_ISREMOTE(sfs))
+ pInfo->uAttributes |= osl_Volume_Attribute_Remote;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+ }
+
+ if (uFieldMask & osl_VolumeInfo_Mask_FileSystemCaseHandling)
+ {
+ if (__OSL_STATFS_IS_CASE_SENSITIVE_FS(sfs))
+ pInfo->uAttributes |= osl_Volume_Attribute_Case_Sensitive;
+
+ if (__OSL_STATFS_IS_CASE_PRESERVING_FS(sfs))
+ pInfo->uAttributes |= osl_Volume_Attribute_Case_Is_Preserved;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+ }
+
+ pInfo->uTotalSpace = 0;
+ pInfo->uFreeSpace = 0;
+ pInfo->uUsedSpace = 0;
+
+#if defined(__OSL_STATFS_BLKSIZ)
+
+ if ((uFieldMask & osl_VolumeInfo_Mask_TotalSpace) ||
+ (uFieldMask & osl_VolumeInfo_Mask_UsedSpace))
+ {
+ pInfo->uTotalSpace = __OSL_STATFS_BLKSIZ(sfs);
+ pInfo->uTotalSpace *= (sal_uInt64)(sfs.f_blocks);
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_TotalSpace;
+ }
+
+ if ((uFieldMask & osl_VolumeInfo_Mask_FreeSpace) ||
+ (uFieldMask & osl_VolumeInfo_Mask_UsedSpace))
+ {
+ pInfo->uFreeSpace = __OSL_STATFS_BLKSIZ(sfs);
+
+ if (getuid() == 0)
+ pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bfree);
+ else
+ pInfo->uFreeSpace *= (sal_uInt64)(sfs.f_bavail);
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_FreeSpace;
+ }
+
+#endif /* __OSL_STATFS_BLKSIZ */
+
+ if ((pInfo->uValidFields & osl_VolumeInfo_Mask_TotalSpace) &&
+ (pInfo->uValidFields & osl_VolumeInfo_Mask_FreeSpace ))
+ {
+ pInfo->uUsedSpace = pInfo->uTotalSpace - pInfo->uFreeSpace;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_UsedSpace;
+ }
+
+ pInfo->uMaxNameLength = 0;
+ if (uFieldMask & osl_VolumeInfo_Mask_MaxNameLength)
+ {
+ long nLen = pathconf(pszDirectory, _PC_NAME_MAX);
+ if (nLen > 0)
+ {
+ pInfo->uMaxNameLength = (sal_uInt32)nLen;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxNameLength;
+ }
+ }
+
+ pInfo->uMaxPathLength = 0;
+ if (uFieldMask & osl_VolumeInfo_Mask_MaxPathLength)
+ {
+ long nLen = pathconf (pszDirectory, _PC_PATH_MAX);
+ if (nLen > 0)
+ {
+ pInfo->uMaxPathLength = (sal_uInt32)nLen;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxPathLength;
+ }
+ }
+
+#if defined(__OSL_STATFS_TYPENAME)
+
+ if (uFieldMask & osl_VolumeInfo_Mask_FileSystemName)
+ {
+ rtl_string2UString(
+ &(pInfo->ustrFileSystemName),
+ __OSL_STATFS_TYPENAME(sfs),
+ rtl_str_getLength(__OSL_STATFS_TYPENAME(sfs)),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+ OSL_ASSERT(pInfo->ustrFileSystemName != 0);
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_FileSystemName;
+ }
+
+#endif /* __OSL_STATFS_TYPENAME */
+
+ if (uFieldMask & osl_VolumeInfo_Mask_DeviceHandle)
+ {
+ /* FIXME: check also entries in mntent for the device
+ and fill it with correct values */
+
+ *pInfo->pDeviceHandle = osl_isFloppyDrive(pszDirectory);
+
+ if (*pInfo->pDeviceHandle)
+ {
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_DeviceHandle;
+ pInfo->uAttributes |= osl_Volume_Attribute_Removeable;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+ }
+ }
+ return osl_File_E_None;
+}
+
+/******************************************************************************
+ *
+ * GENERIC FLOPPY FUNCTIONS
+ *
+ *****************************************************************************/
+
+
+/*****************************************
+ * osl_unmountVolumeDevice
+ ****************************************/
+
+oslFileError osl_unmountVolumeDevice( oslVolumeDeviceHandle Handle )
+{
+ oslFileError tErr = osl_File_E_NOSYS;
+
+ tErr = osl_unmountFloppy(Handle);
+
+ /* Perhaps current working directory is set to mount point */
+
+ if ( tErr )
+ {
+ sal_Char *pszHomeDir = getenv("HOME");
+
+ if ( pszHomeDir && strlen( pszHomeDir ) && 0 == chdir( pszHomeDir ) )
+ {
+ /* try again */
+
+ tErr = osl_unmountFloppy(Handle);
+
+ OSL_ENSURE( tErr, "osl_unmountvolumeDevice: CWD was set to volume mount point" );
+ }
+ }
+
+ return tErr;
+}
+
+/*****************************************
+ * osl_automountVolumeDevice
+ ****************************************/
+
+oslFileError osl_automountVolumeDevice( oslVolumeDeviceHandle Handle )
+{
+ oslFileError tErr = osl_File_E_NOSYS;
+
+ tErr = osl_mountFloppy(Handle);
+
+ return tErr;
+}
+
+/*****************************************
+ * osl_getVolumeDeviceMountPath
+ ****************************************/
+static rtl_uString* oslMakeUStrFromPsz(const sal_Char* pszStr, rtl_uString** ustrValid)
+{
+ rtl_string2UString(
+ ustrValid,
+ pszStr,
+ rtl_str_getLength( pszStr ),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*ustrValid != 0);
+
+ return *ustrValid;
+}
+
+oslFileError osl_getVolumeDeviceMountPath( oslVolumeDeviceHandle Handle, rtl_uString **pstrPath )
+{
+ oslVolumeDeviceHandleImpl* pItem = (oslVolumeDeviceHandleImpl*) Handle;
+ sal_Char Buffer[PATH_MAX];
+
+ Buffer[0] = '\0';
+
+ if ( pItem == 0 || pstrPath == 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+ return osl_File_E_INVAL;
+ }
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"Handle is:\n");
+ osl_printFloppyHandle(pItem);
+#endif
+
+ snprintf(Buffer, sizeof(Buffer), "file://%s", pItem->pszMountPoint);
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"Mount Point is: '%s'\n",Buffer);
+#endif
+
+ oslMakeUStrFromPsz(Buffer, pstrPath);
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * osl_acquireVolumeDeviceHandle
+ ****************************************/
+
+oslFileError SAL_CALL osl_acquireVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
+{
+ oslVolumeDeviceHandleImpl* pItem =(oslVolumeDeviceHandleImpl*) Handle;
+
+ if ( pItem == 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ ++pItem->RefCount;
+
+ return osl_File_E_None;
+}
+
+/*****************************************
+ * osl_releaseVolumeDeviceHandle
+ ****************************************/
+
+oslFileError osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
+{
+ oslVolumeDeviceHandleImpl* pItem =(oslVolumeDeviceHandleImpl*) Handle;
+
+ if ( pItem == 0 )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+ return osl_File_E_INVAL;
+ }
+
+ --pItem->RefCount;
+
+ if ( pItem->RefCount == 0 )
+ {
+ rtl_freeMemory(pItem);
+ }
+
+ return osl_File_E_None;
+}
+
+#ifndef MACOSX
+
+/*****************************************
+ * osl_newVolumeDeviceHandleImpl
+ ****************************************/
+
+static oslVolumeDeviceHandleImpl* osl_newVolumeDeviceHandleImpl()
+{
+ oslVolumeDeviceHandleImpl* pHandle;
+ const size_t nSizeOfHandle = sizeof(oslVolumeDeviceHandleImpl);
+
+ pHandle = (oslVolumeDeviceHandleImpl*) rtl_allocateMemory (nSizeOfHandle);
+ if (pHandle != NULL)
+ {
+ pHandle->ident[0] = 'O';
+ pHandle->ident[1] = 'V';
+ pHandle->ident[2] = 'D';
+ pHandle->ident[3] = 'H';
+ pHandle->pszMountPoint[0] = '\0';
+ pHandle->pszFilePath[0] = '\0';
+ pHandle->pszDevice[0] = '\0';
+ pHandle->RefCount = 1;
+ }
+ return pHandle;
+}
+
+/*****************************************
+ * osl_freeVolumeDeviceHandleImpl
+ ****************************************/
+
+static void osl_freeVolumeDeviceHandleImpl (oslVolumeDeviceHandleImpl* pHandle)
+{
+ if (pHandle != NULL)
+ rtl_freeMemory (pHandle);
+}
+#endif
+
+/******************************************************************************
+ *
+ * SOLARIS FLOPPY FUNCTIONS
+ *
+ *****************************************************************************/
+
+#if defined(SOLARIS)
+/* compare a given devicename with the typical device names on a Solaris box */
+static sal_Bool
+osl_isAFloppyDevice (const char* pDeviceName)
+{
+ const char* pFloppyDevice [] = {
+ "/dev/fd", "/dev/rfd",
+ "/dev/diskette", "/dev/rdiskette",
+ "/vol/dev/diskette", "/vol/dev/rdiskette"
+ };
+
+ int i;
+ for (i = 0; i < (sizeof(pFloppyDevice)/sizeof(pFloppyDevice[0])); i++)
+ {
+ if (strncmp(pDeviceName, pFloppyDevice[i], strlen(pFloppyDevice[i])) == 0)
+ return sal_True;
+ }
+ return sal_False;
+}
+
+/* compare two directories whether the first may be a parent of the second. this
+ * does not realpath() resolving */
+static sal_Bool
+osl_isAParentDirectory (const char* pParentDir, const char* pSubDir)
+{
+ return strncmp(pParentDir, pSubDir, strlen(pParentDir)) == 0;
+}
+
+/* the name of the routine is obviously silly. But anyway create a
+ * oslVolumeDeviceHandle with correct mount point, device name and a resolved filepath
+ * only if pszPath points to file or directory on a floppy */
+static oslVolumeDeviceHandle
+osl_isFloppyDrive(const sal_Char* pszPath)
+{
+ FILE* pMountTab;
+ struct mnttab aMountEnt;
+ oslVolumeDeviceHandleImpl* pHandle;
+
+ if ((pHandle = osl_newVolumeDeviceHandleImpl()) == NULL)
+ {
+ return NULL;
+ }
+ if (realpath(pszPath, pHandle->pszFilePath) == NULL)
+ {
+ osl_freeVolumeDeviceHandleImpl (pHandle);
+ return NULL;
+ }
+ if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL)
+ {
+ osl_freeVolumeDeviceHandleImpl (pHandle);
+ return NULL;
+ }
+
+ while (getmntent(pMountTab, &aMountEnt) == 0)
+ {
+ const char *pMountPoint = aMountEnt.mnt_mountp;
+ const char *pDevice = aMountEnt.mnt_special;
+ if ( osl_isAParentDirectory (aMountEnt.mnt_mountp, pHandle->pszFilePath)
+ && osl_isAFloppyDevice (aMountEnt.mnt_special))
+ {
+ /* skip the last item for it is the name of the disk */
+ char * pc = strrchr( aMountEnt.mnt_special, '/' );
+
+ if ( NULL != pc )
+ {
+ int len = pc - aMountEnt.mnt_special;
+
+ strncpy( pHandle->pszDevice, aMountEnt.mnt_special, len );
+ pHandle->pszDevice[len] = '\0';
+ }
+ else
+ {
+ /* #106048 use save str functions to avoid buffer overflows */
+ memset(pHandle->pszDevice, 0, sizeof(pHandle->pszDevice));
+ strncpy(pHandle->pszDevice, aMountEnt.mnt_special, sizeof(pHandle->pszDevice) - 1);
+ }
+
+ /* remember the mount point */
+ memset(pHandle->pszMountPoint, 0, sizeof(pHandle->pszMountPoint));
+ strncpy(pHandle->pszMountPoint, aMountEnt.mnt_mountp, sizeof(pHandle->pszMountPoint) - 1);
+
+ fclose (pMountTab);
+ return pHandle;
+ }
+ }
+
+ fclose (pMountTab);
+ osl_freeVolumeDeviceHandleImpl (pHandle);
+ return NULL;
+}
+
+static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
+{
+ FILE* pMountTab;
+ struct mnttab aMountEnt;
+ oslVolumeDeviceHandleImpl* pHandle = (oslVolumeDeviceHandleImpl*) hFloppy;
+
+ int nRet=0;
+ sal_Char pszCmd[512] = "";
+
+ if ( pHandle == 0 )
+ return osl_File_E_INVAL;
+
+ /* FIXME: don't know what this is good for */
+ if ( pHandle->ident[0] != 'O' || pHandle->ident[1] != 'V' || pHandle->ident[2] != 'D' || pHandle->ident[3] != 'H' )
+ return osl_File_E_INVAL;
+
+ snprintf(pszCmd, sizeof(pszCmd), "eject -q %s > /dev/null 2>&1", pHandle->pszDevice);
+
+ nRet = system( pszCmd );
+
+ switch ( WEXITSTATUS(nRet) )
+ {
+ case 0:
+ {
+ /* lookup the device in mount tab again */
+ if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL)
+ return osl_File_E_BUSY;
+
+ while (getmntent(pMountTab, &aMountEnt) == 0)
+ {
+ const char *pMountPoint = aMountEnt.mnt_mountp;
+ const char *pDevice = aMountEnt.mnt_special;
+ if ( 0 == strncmp( pHandle->pszDevice, aMountEnt.mnt_special, strlen(pHandle->pszDevice) ) )
+ {
+ memset(pHandle->pszMountPoint, 0, sizeof(pHandle->pszMountPoint));
+ strncpy (pHandle->pszMountPoint, aMountEnt.mnt_mountp, sizeof(pHandle->pszMountPoint) - 1);
+
+ fclose (pMountTab);
+ return osl_File_E_None;
+ }
+ }
+
+ fclose (pMountTab);
+ return osl_File_E_BUSY;
+ }
+ //break; // break not necessary here, see return statements before
+
+ case 1:
+ return osl_File_E_BUSY;
+
+ default:
+ break;
+ }
+
+ return osl_File_E_BUSY;
+}
+
+static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
+{
+// FILE* pMountTab;
+// struct mnttab aMountEnt;
+ oslVolumeDeviceHandleImpl* pHandle = (oslVolumeDeviceHandleImpl*) hFloppy;
+
+ int nRet=0;
+ sal_Char pszCmd[512] = "";
+
+ if ( pHandle == 0 )
+ return osl_File_E_INVAL;
+
+ /* FIXME: don't know what this is good for */
+ if ( pHandle->ident[0] != 'O' || pHandle->ident[1] != 'V' || pHandle->ident[2] != 'D' || pHandle->ident[3] != 'H' )
+ return osl_File_E_INVAL;
+
+ snprintf(pszCmd, sizeof(pszCmd), "eject %s > /dev/null 2>&1", pHandle->pszDevice);
+
+ nRet = system( pszCmd );
+
+ switch ( WEXITSTATUS(nRet) )
+ {
+ case 0:
+ {
+ FILE* pMountTab;
+ struct mnttab aMountEnt;
+
+ /* lookup if device is still in mount tab */
+ if ((pMountTab = fopen (MOUNTTAB, "r")) == NULL)
+ return osl_File_E_BUSY;
+
+ while (getmntent(pMountTab, &aMountEnt) == 0)
+ {
+ const char *pMountPoint = aMountEnt.mnt_mountp;
+ const char *pDevice = aMountEnt.mnt_special;
+ if ( 0 == strncmp( pHandle->pszDevice, aMountEnt.mnt_special, strlen(pHandle->pszDevice) ) )
+ {
+ fclose (pMountTab);
+ return osl_File_E_BUSY;
+ }
+ }
+
+ fclose (pMountTab);
+ pHandle->pszMountPoint[0] = 0;
+ return osl_File_E_None;
+ }
+
+ //break; //break not necessary, see return statements before
+
+ case 1:
+ return osl_File_E_NODEV;
+
+ case 4:
+ pHandle->pszMountPoint[0] = 0;
+ return osl_File_E_None;
+
+ default:
+ break;
+ }
+
+ return osl_File_E_BUSY;
+}
+
+#endif /* SOLARIS */
+
+/******************************************************************************
+ *
+ * LINUX FLOPPY FUNCTIONS
+ *
+ *****************************************************************************/
+
+#if defined(LINUX)
+static oslVolumeDeviceHandle
+osl_isFloppyDrive (const sal_Char* pszPath)
+{
+ oslVolumeDeviceHandleImpl* pItem = osl_newVolumeDeviceHandleImpl();
+ if (osl_getFloppyMountEntry(pszPath, pItem))
+ return (oslVolumeDeviceHandle) pItem;
+
+ osl_freeVolumeDeviceHandleImpl (pItem);
+ return 0;
+}
+#endif /* LINUX */
+
+#if defined(LINUX)
+static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
+{
+ sal_Bool bRet = sal_False;
+ oslVolumeDeviceHandleImpl* pItem=0;
+ int nRet;
+ sal_Char pszCmd[PATH_MAX];
+ const sal_Char* pszMountProg = "mount";
+ sal_Char* pszSuDo = 0;
+ sal_Char* pszTmp = 0;
+
+ pszCmd[0] = '\0';
+
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"In osl_mountFloppy\n");
+#endif
+
+ pItem = (oslVolumeDeviceHandleImpl*) hFloppy;
+
+ if ( pItem == 0 )
+ {
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"Out osl_mountFloppy [pItem == 0]\n");
+#endif
+
+ return osl_File_E_INVAL;
+ }
+
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"Out osl_mountFloppy [invalid handle]\n");
+#endif
+ return osl_File_E_INVAL;
+ }
+
+ bRet = osl_isFloppyMounted(pItem);
+ if ( bRet == sal_True )
+ {
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"detected mounted floppy at '%s'\n",pItem->pszMountPoint);
+#endif
+ return osl_File_E_BUSY;
+ }
+
+ /* mfe: we can't use the mount(2) system call!!! */
+ /* even if we are root */
+ /* since mtab is not updated!!! */
+ /* but we need it to be updated */
+ /* some "magic" must be done */
+
+/* nRet = mount(pItem->pszDevice,pItem->pszMountPoint,0,0,0); */
+/* if ( nRet != 0 ) */
+/* { */
+/* nRet=errno; */
+/* #ifdef DEBUG_OSL_FILE */
+/* perror("mount"); */
+/* #endif */
+/* } */
+
+ pszTmp = getenv("SAL_MOUNT_MOUNTPROG");
+ if ( pszTmp != 0 )
+ {
+ pszMountProg=pszTmp;
+ }
+
+ pszTmp=getenv("SAL_MOUNT_SU_DO");
+ if ( pszTmp != 0 )
+ {
+ pszSuDo=pszTmp;
+ }
+
+ if ( pszSuDo != 0 )
+ {
+ snprintf(pszCmd, sizeof(pszCmd), "%s %s %s %s",pszSuDo,pszMountProg,pItem->pszDevice,pItem->pszMountPoint);
+ }
+ else
+ {
+ snprintf(pszCmd, sizeof(pszCmd), "%s %s",pszMountProg,pItem->pszMountPoint);
+ }
+
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"executing '%s'\n",pszCmd);
+#endif
+
+ nRet = system(pszCmd);
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"call returned '%i'\n",nRet);
+ fprintf(stderr,"exit status is '%i'\n", WEXITSTATUS(nRet));
+#endif
+
+
+ switch ( WEXITSTATUS(nRet) )
+ {
+ case 0:
+ nRet=0;
+ break;
+
+ case 2:
+ nRet=EPERM;
+ break;
+
+ case 4:
+ nRet=ENOENT;
+ break;
+
+ case 8:
+ nRet=EINTR;
+ break;
+
+ case 16:
+ nRet=EPERM;
+ break;
+
+ case 32:
+ nRet=EBUSY;
+ break;
+
+ case 64:
+ nRet=EAGAIN;
+ break;
+
+ default:
+ nRet=EBUSY;
+ break;
+ }
+
+ return ((0 == nRet) ? oslTranslateFileError(OSL_FET_SUCCESS, nRet) : oslTranslateFileError(OSL_FET_ERROR, nRet));
+}
+#endif /* LINUX */
+
+
+#if defined(LINUX)
+static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
+{
+ oslVolumeDeviceHandleImpl* pItem=0;
+ int nRet=0;
+ sal_Char pszCmd[PATH_MAX];
+ sal_Char* pszTmp = 0;
+ sal_Char* pszSuDo = 0;
+ const sal_Char* pszUmountProg = "umount";
+
+ pszCmd[0] = '\0';
+
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"In osl_unmountFloppy\n");
+#endif
+
+ pItem = (oslVolumeDeviceHandleImpl*) hFloppy;
+
+ if ( pItem == 0 )
+ {
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"Out osl_unmountFloppy [pItem==0]\n");
+#endif
+ return osl_File_E_INVAL;
+ }
+
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"Out osl_unmountFloppy [invalid handle]\n");
+#endif
+ return osl_File_E_INVAL;
+ }
+
+ /* mfe: we can't use the umount(2) system call!!! */
+ /* even if we are root */
+ /* since mtab is not updated!!! */
+ /* but we need it to be updated */
+ /* some "magic" must be done */
+
+/* nRet=umount(pItem->pszDevice); */
+/* if ( nRet != 0 ) */
+/* { */
+/* nRet = errno; */
+
+/* #ifdef DEBUG_OSL_FILE */
+/* perror("mount"); */
+/* #endif */
+/* } */
+
+
+ pszTmp = getenv("SAL_MOUNT_UMOUNTPROG");
+ if ( pszTmp != 0 )
+ {
+ pszUmountProg=pszTmp;
+ }
+
+ pszTmp = getenv("SAL_MOUNT_SU_DO");
+ if ( pszTmp != 0 )
+ {
+ pszSuDo=pszTmp;
+ }
+
+ if ( pszSuDo != 0 )
+ {
+ snprintf(pszCmd, sizeof(pszCmd), "%s %s %s",pszSuDo,pszUmountProg,pItem->pszMountPoint);
+ }
+ else
+ {
+ snprintf(pszCmd, sizeof(pszCmd), "%s %s",pszUmountProg,pItem->pszMountPoint);
+ }
+
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"executing '%s'\n",pszCmd);
+#endif
+
+ nRet = system(pszCmd);
+
+#ifdef DEBUG_OSL_FILE
+ fprintf(stderr,"call returned '%i'\n",nRet);
+ fprintf(stderr,"exit status is '%i'\n", WEXITSTATUS(nRet));
+#endif
+
+ switch ( WEXITSTATUS(nRet) )
+ {
+ case 0:
+ nRet=0;
+ break;
+
+ default:
+ nRet=EBUSY;
+ break;
+ }
+
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"Out osl_unmountFloppy [ok]\n");
+#endif
+
+ return ((0 == nRet) ? oslTranslateFileError(OSL_FET_SUCCESS, nRet) : oslTranslateFileError(OSL_FET_ERROR, nRet));
+
+/* return osl_File_E_None;*/
+}
+
+#endif /* LINUX */
+
+#if defined(LINUX)
+static sal_Bool
+osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem)
+{
+ struct mntent* pMountEnt;
+ FILE* pMountTab;
+
+ pMountTab = setmntent (MOUNTTAB, "r");
+ if (pMountTab == 0)
+ return sal_False;
+
+ while ((pMountEnt = getmntent(pMountTab)) != 0)
+ {
+ if ( strncmp(pMountEnt->mnt_dir, pszPath, strlen(pMountEnt->mnt_dir)) == 0
+ && strncmp(pMountEnt->mnt_fsname, "/dev/fd", strlen("/dev/fd")) == 0)
+ {
+ memset(pItem->pszMountPoint, 0, sizeof(pItem->pszMountPoint));
+ strncpy(pItem->pszMountPoint, pMountEnt->mnt_dir, sizeof(pItem->pszMountPoint) - 1);
+
+ memset(pItem->pszFilePath, 0, sizeof(pItem->pszFilePath));
+ strncpy(pItem->pszFilePath, pMountEnt->mnt_dir, sizeof(pItem->pszFilePath) - 1);
+
+ memset(pItem->pszDevice, 0, sizeof(pItem->pszDevice));
+ strncpy(pItem->pszDevice, pMountEnt->mnt_fsname, sizeof(pItem->pszDevice) - 1);
+
+ endmntent (pMountTab);
+ return sal_True;
+ }
+ }
+
+ endmntent (pMountTab);
+ return sal_False;
+}
+#endif /* LINUX */
+
+#if defined(LINUX)
+static sal_Bool
+osl_isFloppyMounted (oslVolumeDeviceHandleImpl* pDevice)
+{
+ oslVolumeDeviceHandleImpl aItem;
+
+ if ( osl_getFloppyMountEntry (pDevice->pszMountPoint, &aItem)
+ && strcmp (aItem.pszMountPoint, pDevice->pszMountPoint) == 0
+ && strcmp (aItem.pszDevice, pDevice->pszDevice) == 0)
+ {
+ return sal_True;
+ }
+ return sal_False;
+}
+#endif /* LINUX */
+
+/* NetBSD floppy functions have to be added here. Until we have done that,
+ * we use the MACOSX definitions for nonexistent floppy.
+ * */
+
+/******************************************************************************
+ *
+ * MAC OS X FLOPPY FUNCTIONS
+ *
+ *****************************************************************************/
+
+#if (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+static oslVolumeDeviceHandle osl_isFloppyDrive(const sal_Char* pszPath)
+{
+ return NULL;
+}
+#endif /* MACOSX */
+
+#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+static oslFileError osl_mountFloppy(oslVolumeDeviceHandle hFloppy)
+{
+ return osl_File_E_BUSY;
+}
+#endif /* MACOSX */
+
+#if ( defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+static oslFileError osl_unmountFloppy(oslVolumeDeviceHandle hFloppy)
+{
+ return osl_File_E_BUSY;
+}
+#endif /* MACOSX */
+
+#if ( defined(NETBSD) || defined(FREEBSD) )
+static sal_Bool osl_getFloppyMountEntry(const sal_Char* pszPath, oslVolumeDeviceHandleImpl* pItem)
+{
+ return sal_False;
+}
+#endif /* NETBSD || FREEBSD */
+
+#if ( defined(NETBSD) || defined(FREEBSD) )
+static sal_Bool osl_isFloppyMounted(oslVolumeDeviceHandleImpl* pDevice)
+{
+ return sal_False;
+}
+#endif /* NETBSD || FREEBSD */
+
+
+#ifdef DEBUG_OSL_FILE
+static void osl_printFloppyHandle(oslVolumeDeviceHandleImpl* pItem)
+{
+ if (pItem == 0 )
+ {
+ fprintf(stderr,"NULL Handle\n");
+ return;
+ }
+ if ( pItem->ident[0] != 'O' || pItem->ident[1] != 'V' || pItem->ident[2] != 'D' || pItem->ident[3] != 'H' )
+ {
+#ifdef TRACE_OSL_FILE
+ fprintf(stderr,"Invalid Handle]\n");
+#endif
+ return;
+ }
+
+
+ fprintf(stderr,"MountPoint : '%s'\n",pItem->pszMountPoint);
+ fprintf(stderr,"FilePath : '%s'\n",pItem->pszFilePath);
+ fprintf(stderr,"Device : '%s'\n",pItem->pszDevice);
+
+ return;
+}
+#endif
diff --git a/sal/osl/unx/interlck.c b/sal/osl/unx/interlck.c
new file mode 100644
index 000000000000..0342cdd983b4
--- /dev/null
+++ b/sal/osl/unx/interlck.c
@@ -0,0 +1,170 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/interlck.h>
+#include <osl/diagnose.h>
+
+#if ( defined ( SOLARIS ) || defined ( NETBSD ) ) && defined ( SPARC )
+#error please use asm/interlck_sparc.s
+#elif defined ( SOLARIS) && defined ( X86 )
+#error please use asm/interlck_x86.s
+#elif defined ( GCC ) && ( defined ( X86 ) || defined ( X86_64 ) )
+/* That's possible on x86-64 too since oslInterlockedCount is a sal_Int32 */
+
+extern int osl_isSingleCPU;
+
+/*****************************************************************************/
+/* osl_incrementInterlockedCount */
+/*****************************************************************************/
+oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount)
+{
+ register oslInterlockedCount nCount asm("%eax");
+
+ nCount = 1;
+
+ if ( osl_isSingleCPU ) {
+ __asm__ __volatile__ (
+ "xaddl %0, %1\n\t"
+ : "+r" (nCount), "+m" (*pCount)
+ : /* nothing */
+ : "memory");
+ }
+ else {
+ __asm__ __volatile__ (
+ "lock\n\t"
+ "xaddl %0, %1\n\t"
+ : "+r" (nCount), "+m" (*pCount)
+ : /* nothing */
+ : "memory");
+ }
+
+ return ++nCount;
+}
+
+oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount)
+{
+ register oslInterlockedCount nCount asm("%eax");
+
+ nCount = -1;
+
+ if ( osl_isSingleCPU ) {
+ __asm__ __volatile__ (
+ "xaddl %0, %1\n\t"
+ : "+r" (nCount), "+m" (*pCount)
+ : /* nothing */
+ : "memory");
+ }
+ else {
+ __asm__ __volatile__ (
+ "lock\n\t"
+ "xaddl %0, %1\n\t"
+ : "+r" (nCount), "+m" (*pCount)
+ : /* nothing */
+ : "memory");
+ }
+
+ return --nCount;
+}
+
+#elif defined ( GCC ) && defined ( POWERPC )
+
+/*****************************************************************************/
+/* osl_incrementInterlockedCount */
+/*****************************************************************************/
+oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount)
+{
+ /* "addi" doesn't work with r0 as second parameter */
+ register oslInterlockedCount nCount __asm__ ("r4");
+
+ __asm__ __volatile__ (
+ "1: lwarx %0,0,%2\n\t"
+ " addi %0,%0,1\n\t"
+ " stwcx. %0,0,%2\n\t"
+ " bne- 1b\n\t"
+ " isync"
+ : "=&r" (nCount), "=m" (*pCount)
+ : "r" (pCount)
+ : "memory");
+
+ return nCount;
+}
+
+oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount)
+{
+ /* "subi" doesn't work with r0 as second parameter */
+ register oslInterlockedCount nCount __asm__ ("r4");
+
+ __asm__ __volatile__ (
+ "1: lwarx %0,0,%2\n\t"
+ " subi %0,%0,1\n\t"
+ " stwcx. %0,0,%2\n\t"
+ " bne- 1b\n\t"
+ " isync"
+ : "=&r" (nCount), "=m" (*pCount)
+ : "r" (pCount)
+ : "memory");
+
+ return nCount;
+}
+
+#else
+/* use only if nothing else works, expensive due to single mutex for all reference counts */
+
+static pthread_mutex_t InterLock = PTHREAD_MUTEX_INITIALIZER;
+
+/*****************************************************************************/
+/* osl_incrementInterlockedCount */
+/*****************************************************************************/
+oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount)
+{
+ oslInterlockedCount Count;
+
+ pthread_mutex_lock(&InterLock);
+ Count = ++(*pCount);
+ pthread_mutex_unlock(&InterLock);
+
+ return (Count);
+}
+
+/*****************************************************************************/
+/* osl_decrementInterlockedCount */
+/*****************************************************************************/
+oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount)
+{
+ oslInterlockedCount Count;
+
+ pthread_mutex_lock(&InterLock);
+ Count = --(*pCount);
+ pthread_mutex_unlock(&InterLock);
+
+ return (Count);
+}
+
+#endif /* default */
diff --git a/sal/osl/unx/makefile.mk b/sal/osl/unx/makefile.mk
new file mode 100644
index 000000000000..1dd47fb4d19b
--- /dev/null
+++ b/sal/osl/unx/makefile.mk
@@ -0,0 +1,189 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=sal
+.IF "$(WORK_STAMP)"=="MIX364"
+TARGET=cppsal
+.ELSE
+TARGET=cpposl
+.ENDIF
+USE_LDUMP2=TRUE
+
+PROJECTPCH4DLL=TRUE
+PROJECTPCH=cont_pch
+PROJECTPCHSOURCE=cont_pch
+
+TARGETTYPE=CUI
+
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+SLOFILES= \
+ $(SLO)$/conditn.obj \
+ $(SLO)$/diagnose.obj \
+ $(SLO)$/semaphor.obj \
+ $(SLO)$/socket.obj \
+ $(SLO)$/interlck.obj \
+ $(SLO)$/mutex.obj \
+ $(SLO)$/nlsupport.obj \
+ $(SLO)$/thread.obj \
+ $(SLO)$/module.obj \
+ $(SLO)$/process.obj \
+ $(SLO)$/security.obj \
+ $(SLO)$/profile.obj \
+ $(SLO)$/time.obj \
+ $(SLO)$/signal.obj \
+ $(SLO)$/pipe.obj \
+ $(SLO)$/system.obj \
+ $(SLO)$/util.obj \
+ $(SLO)$/tempfile.obj\
+ $(SLO)$/file.obj \
+ $(SLO)$/file_misc.obj\
+ $(SLO)$/file_url.obj\
+ $(SLO)$/file_error_transl.obj\
+ $(SLO)$/file_path_helper.obj\
+ $(SLO)$/file_stat.obj \
+ $(SLO)$/file_volume.obj \
+ $(SLO)$/uunxapi.obj\
+ $(SLO)$/process_impl.obj\
+ $(SLO)$/salinit.obj
+
+
+#.IF "$(UPDATER)"=="YES"
+OBJFILES= $(OBJ)$/conditn.obj \
+ $(OBJ)$/diagnose.obj \
+ $(OBJ)$/semaphor.obj \
+ $(OBJ)$/socket.obj \
+ $(OBJ)$/interlck.obj \
+ $(OBJ)$/mutex.obj \
+ $(OBJ)$/nlsupport.obj \
+ $(OBJ)$/thread.obj \
+ $(OBJ)$/module.obj \
+ $(OBJ)$/process.obj \
+ $(OBJ)$/security.obj \
+ $(OBJ)$/profile.obj \
+ $(OBJ)$/time.obj \
+ $(OBJ)$/signal.obj \
+ $(OBJ)$/pipe.obj \
+ $(OBJ)$/system.obj \
+ $(OBJ)$/util.obj \
+ $(OBJ)$/tempfile.obj\
+ $(OBJ)$/file.obj \
+ $(OBJ)$/file_misc.obj\
+ $(OBJ)$/file_url.obj\
+ $(OBJ)$/file_error_transl.obj\
+ $(OBJ)$/file_path_helper.obj\
+ $(OBJ)$/file_stat.obj \
+ $(OBJ)$/file_volume.obj \
+ $(OBJ)$/uunxapi.obj\
+ $(OBJ)$/process_impl.obj\
+ $(OBJ)$/salinit.obj
+
+#.ENDIF
+
+.IF "$(OS)"=="MACOSX"
+SLOFILES += $(SLO)$/osxlocale.obj
+.ENDIF
+
+.IF "$(OS)"=="SOLARIS" || "$(OS)"=="FREEBSD" || "$(OS)"=="NETBSD" || "$(OS)$(CPU)"=="LINUXS" || "$(OS)"=="MACOSX"
+SLOFILES += $(SLO)$/backtrace.obj
+OBJFILES += $(OBJ)$/backtrace.obj
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.IF "$(COM)"=="C50"
+APP1STDLIBS+=-lC
+.ENDIF
+
+.IF "$(OS)" == "LINUX"
+.IF "$(PAM)" == "NO"
+CFLAGS+=-DNOPAM
+.IF "$(NEW_SHADOW_API)" == "YES"
+CFLAGS+=-DNEW_SHADOW_API
+.ENDIF
+.ENDIF
+.IF "$(PAM_LINK)" == "YES"
+CFLAGS+=-DPAM_LINK
+.ENDIF
+.IF "$(CRYPT_LINK)" == "YES"
+CFLAGS+=-DCRYPT_LINK
+.ENDIF
+.ENDIF
+
+.IF "$(ENABLE_CRASHDUMP)" != "" || "$(PRODUCT)" == ""
+CFLAGS+=-DSAL_ENABLE_CRASH_REPORT
+.ENDIF
+
+.INCLUDE : target.mk
+
+.IF "$(OS)$(CPU)"=="SOLARISU" || "$(OS)$(CPU)"=="SOLARISS" || "$(OS)$(CPU)"=="NETBSDS" || "$(OS)$(CPU)"=="LINUXS"
+
+$(SLO)$/interlck.obj: $(SLO)$/interlck.o
+ touch $(SLO)$/interlck.obj
+
+$(OBJ)$/interlck.obj: $(OBJ)$/interlck.o
+ touch $(OBJ)$/interlck.obj
+
+$(SLO)$/interlck.o: $(MISC)$/interlck_sparc.s
+ $(ASM) $(AFLAGS) -o $@ $<
+
+$(OBJ)$/interlck.o: $(MISC)$/interlck_sparc.s
+ $(ASM) $(AFLAGS) -o $@ $<
+
+$(MISC)$/interlck_sparc.s: asm/interlck_sparc.s
+ tr -d "\015" < $< > $@
+
+.ENDIF
+
+.IF "$(OS)$(CPU)"=="SOLARISI"
+
+$(SLO)$/interlck.obj: $(SLO)$/interlck.o
+ touch $(SLO)$/interlck.obj
+
+$(OBJ)$/interlck.obj: $(OBJ)$/interlck.o
+ touch $(OBJ)$/interlck.obj
+
+$(SLO)$/interlck.o: $(MISC)$/interlck_x86.s
+ $(ASM) $(AFLAGS) -o $@ $<
+
+$(OBJ)$/interlck.o: $(MISC)$/interlck_x86.s
+ $(ASM) $(AFLAGS) -o $@ $<
+
+$(MISC)$/interlck_x86.s: asm/interlck_x86.s
+ tr -d "\015" < $< > $@
+
+.ENDIF
diff --git a/sal/osl/unx/module.c b/sal/osl/unx/module.c
new file mode 100644
index 000000000000..8f8f76a8656c
--- /dev/null
+++ b/sal/osl/unx/module.c
@@ -0,0 +1,242 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <sal/types.h>
+#include <osl/diagnose.h>
+#include <osl/module.h>
+#include <osl/thread.h>
+#include <osl/process.h>
+#include <osl/file.h>
+
+#include "system.h"
+
+#if OSL_DEBUG_LEVEL > 1
+#include <stdio.h>
+#endif
+
+/* implemented in file.c */
+extern int UnicodeToText(char *, size_t, const sal_Unicode *, sal_Int32);
+
+oslModule SAL_CALL osl_psz_loadModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode);
+
+/*****************************************************************************/
+/* osl_loadModule */
+/*****************************************************************************/
+
+oslModule SAL_CALL osl_loadModule(rtl_uString *ustrModuleName, sal_Int32 nRtldMode)
+{
+ oslModule pModule=0;
+ rtl_uString* ustrTmp = NULL;
+
+ OSL_ENSURE(ustrModuleName,"osl_loadModule : string is not valid");
+
+ /* ensure ustrTmp hold valid string */
+ if (osl_File_E_None != osl_getSystemPathFromFileURL(ustrModuleName, &ustrTmp))
+ rtl_uString_assign(&ustrTmp, ustrModuleName);
+
+ if (ustrTmp)
+ {
+ char buffer[PATH_MAX];
+
+ if (UnicodeToText(buffer, PATH_MAX, ustrTmp->buffer, ustrTmp->length))
+ pModule = osl_psz_loadModule(buffer, nRtldMode);
+ rtl_uString_release(ustrTmp);
+ }
+
+ return pModule;
+}
+
+/*****************************************************************************/
+/* osl_psz_loadModule */
+/*****************************************************************************/
+
+oslModule SAL_CALL osl_psz_loadModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode)
+{
+ OSL_ASSERT(
+ (nRtldMode & SAL_LOADMODULE_LAZY) == 0 ||
+ (nRtldMode & SAL_LOADMODULE_NOW) == 0); /* only either LAZY or NOW */
+ if (pszModuleName)
+ {
+#ifndef NO_DL_FUNCTIONS
+ int rtld_mode =
+ ((nRtldMode & SAL_LOADMODULE_NOW) ? RTLD_NOW : RTLD_LAZY) |
+ ((nRtldMode & SAL_LOADMODULE_GLOBAL) ? RTLD_GLOBAL : RTLD_LOCAL);
+ void* pLib = dlopen(pszModuleName, rtld_mode);
+
+#if OSL_DEBUG_LEVEL > 1
+ if (pLib == 0)
+ OSL_TRACE("Error osl_loadModule: %s\n", dlerror());
+#endif /* OSL_DEBUG_LEVEL */
+
+ return ((oslModule)(pLib));
+
+#else /* NO_DL_FUNCTIONS */
+ printf("No DL Functions\n");
+#endif /* NO_DL_FUNCTIONS */
+ }
+ return NULL;
+}
+
+/*****************************************************************************/
+/* osl_getModuleHandle */
+/*****************************************************************************/
+
+sal_Bool SAL_CALL
+osl_getModuleHandle(rtl_uString *pModuleName, oslModule *pResult)
+{
+ (void) pModuleName; /* avoid warning about unused parameter */
+ *pResult = (oslModule) RTLD_DEFAULT;
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_unloadModule */
+/*****************************************************************************/
+void SAL_CALL osl_unloadModule(oslModule hModule)
+{
+ if (hModule)
+ {
+#ifndef NO_DL_FUNCTIONS
+ int nRet = dlclose(hModule);
+
+#if OSL_DEBUG_LEVEL > 1
+ if (nRet != 0)
+ {
+ fprintf(stderr, "Error osl_unloadModule: %s\n", dlerror());
+ }
+#else
+ (void) nRet;
+#endif /* if OSL_DEBUG_LEVEL */
+
+#endif /* ifndef NO_DL_FUNCTIONS */
+ }
+}
+
+/*****************************************************************************/
+/* osl_getSymbol */
+/*****************************************************************************/
+void* SAL_CALL
+osl_getSymbol(oslModule Module, rtl_uString* pSymbolName)
+{
+ return (void *) osl_getFunctionSymbol(Module, pSymbolName);
+}
+
+
+/*****************************************************************************/
+/* osl_getAsciiFunctionSymbol */
+/*****************************************************************************/
+oslGenericFunction SAL_CALL
+osl_getAsciiFunctionSymbol(oslModule Module, const sal_Char *pSymbol)
+{
+ void *fcnAddr = NULL;
+
+#ifndef NO_DL_FUNCTIONS
+ if (pSymbol)
+ {
+ fcnAddr = dlsym(Module, pSymbol);
+
+ if (!fcnAddr)
+ OSL_TRACE("Error osl_getAsciiFunctionSymbol: %s\n", dlerror());
+ }
+#endif
+
+ return (oslGenericFunction) fcnAddr;
+}
+
+/*****************************************************************************/
+/* osl_getFunctionSymbol */
+/*****************************************************************************/
+oslGenericFunction SAL_CALL
+osl_getFunctionSymbol(oslModule module, rtl_uString *puFunctionSymbolName)
+{
+ oslGenericFunction pSymbol = NULL;
+
+ if( puFunctionSymbolName )
+ {
+ rtl_String* pSymbolName = NULL;
+
+ rtl_uString2String( &pSymbolName,
+ rtl_uString_getStr(puFunctionSymbolName),
+ rtl_uString_getLength(puFunctionSymbolName),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ if( pSymbolName != NULL )
+ {
+ pSymbol = osl_getAsciiFunctionSymbol(module, rtl_string_getStr(pSymbolName));
+ rtl_string_release(pSymbolName);
+ }
+ }
+
+ return pSymbol;
+}
+
+/*****************************************************************************/
+/* osl_getModuleURLFromAddress */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_getModuleURLFromAddress(void * addr, rtl_uString ** ppLibraryUrl)
+{
+ sal_Bool result = sal_False;
+ Dl_info dl_info;
+
+ if ((result = dladdr(addr, &dl_info)) != 0)
+ {
+ rtl_uString * workDir = NULL;
+ osl_getProcessWorkingDir(&workDir);
+ if (workDir)
+ {
+#if OSL_DEBUG_LEVEL > 1
+ OSL_TRACE("module.c::osl_getModuleURLFromAddress - %s\n", dl_info.dli_fname);
+#endif
+ rtl_string2UString(ppLibraryUrl,
+ dl_info.dli_fname,
+ strlen(dl_info.dli_fname),
+ osl_getThreadTextEncoding(),
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+
+ OSL_ASSERT(*ppLibraryUrl != NULL);
+ osl_getFileURLFromSystemPath(*ppLibraryUrl, ppLibraryUrl);
+ osl_getAbsoluteFileURL(workDir, *ppLibraryUrl, ppLibraryUrl);
+
+ rtl_uString_release(workDir);
+ result = sal_True;
+ }
+ else
+ {
+ result = sal_False;
+ }
+ }
+ return result;
+}
+
+/*****************************************************************************/
+/* osl_getModuleURLFromFunctionAddress */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_getModuleURLFromFunctionAddress(oslGenericFunction addr, rtl_uString ** ppLibraryUrl)
+{
+ return osl_getModuleURLFromAddress((void*)addr, ppLibraryUrl);
+}
diff --git a/sal/osl/unx/mutex.c b/sal/osl/unx/mutex.c
new file mode 100644
index 000000000000..2f47ba8791ad
--- /dev/null
+++ b/sal/osl/unx/mutex.c
@@ -0,0 +1,221 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/mutex.h>
+#include <osl/diagnose.h>
+
+#include <pthread.h>
+#include <stdlib.h>
+
+#if defined LINUX /* bad hack */
+int pthread_mutexattr_setkind_np(pthread_mutexattr_t *, int);
+#define pthread_mutexattr_settype pthread_mutexattr_setkind_np
+#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP
+#endif
+
+/*
+ Implementation notes:
+ oslMutex hides a pointer to the oslMutexImpl structure, which
+ ist needed to manage recursive locks on a mutex.
+
+*/
+
+typedef struct _oslMutexImpl
+{
+ pthread_mutex_t mutex;
+} oslMutexImpl;
+
+
+/*****************************************************************************/
+/* osl_createMutex */
+/*****************************************************************************/
+oslMutex SAL_CALL osl_createMutex()
+{
+ oslMutexImpl* pMutex = (oslMutexImpl*) malloc(sizeof(oslMutexImpl));
+ pthread_mutexattr_t aMutexAttr;
+ int nRet=0;
+
+ OSL_ASSERT(pMutex);
+
+ if ( pMutex == 0 )
+ {
+ return 0;
+ }
+
+ pthread_mutexattr_init(&aMutexAttr);
+
+ nRet = pthread_mutexattr_settype(&aMutexAttr, PTHREAD_MUTEX_RECURSIVE);
+
+ nRet = pthread_mutex_init(&(pMutex->mutex), &aMutexAttr);
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_createMutex : mutex init failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+
+ free(pMutex);
+ pMutex = 0;
+ }
+
+ pthread_mutexattr_destroy(&aMutexAttr);
+
+ return (oslMutex) pMutex;
+}
+
+/*****************************************************************************/
+/* osl_destroyMutex */
+/*****************************************************************************/
+void SAL_CALL osl_destroyMutex(oslMutex Mutex)
+{
+ oslMutexImpl* pMutex = (oslMutexImpl*) Mutex;
+
+ OSL_ASSERT(pMutex);
+
+ if ( pMutex != 0 )
+ {
+ int nRet=0;
+
+ nRet = pthread_mutex_destroy(&(pMutex->mutex));
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_destroyMutex : mutex destroy failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ }
+
+ free(pMutex);
+ }
+
+ return;
+}
+
+/*****************************************************************************/
+/* osl_acquireMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_acquireMutex(oslMutex Mutex)
+{
+ oslMutexImpl* pMutex = (oslMutexImpl*) Mutex;
+
+ OSL_ASSERT(pMutex);
+
+ if ( pMutex != 0 )
+ {
+ int nRet=0;
+
+ nRet = pthread_mutex_lock(&(pMutex->mutex));
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_acquireMutex : mutex lock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ return sal_False;
+ }
+ return sal_True;
+ }
+
+ /* not initialized */
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_tryToAcquireMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_tryToAcquireMutex(oslMutex Mutex)
+{
+ oslMutexImpl* pMutex = (oslMutexImpl*) Mutex;
+
+ OSL_ASSERT(pMutex);
+
+ if ( pMutex )
+ {
+ int nRet = 0;
+ nRet = pthread_mutex_trylock(&(pMutex->mutex));
+ if ( nRet != 0 )
+ return sal_False;
+
+ return sal_True;
+ }
+
+ /* not initialized */
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_releaseMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_releaseMutex(oslMutex Mutex)
+{
+ oslMutexImpl* pMutex = (oslMutexImpl*) Mutex;
+
+ OSL_ASSERT(pMutex);
+
+ if ( pMutex )
+ {
+ int nRet=0;
+ nRet = pthread_mutex_unlock(&(pMutex->mutex));
+ if ( nRet != 0 )
+ {
+ OSL_TRACE("osl_releaseMutex : mutex unlock failed. Errno: %d; %s\n",
+ nRet, strerror(nRet));
+ return sal_False;
+ }
+
+ return sal_True;
+ }
+
+ /* not initialized */
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_getGlobalMutex */
+/*****************************************************************************/
+
+static oslMutexImpl globalMutexImpl;
+
+static void globalMutexInitImpl(void) {
+ pthread_mutexattr_t attr;
+ if (pthread_mutexattr_init(&attr) != 0 ||
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) ||
+ pthread_mutex_init(&globalMutexImpl.mutex, &attr) != 0 ||
+ pthread_mutexattr_destroy(&attr) != 0)
+ {
+ abort();
+ }
+}
+
+oslMutex * SAL_CALL osl_getGlobalMutex()
+{
+ /* necessary to get a "oslMutex *" */
+ static oslMutex globalMutex = (oslMutex) &globalMutexImpl;
+
+ static pthread_once_t once = PTHREAD_ONCE_INIT;
+ if (pthread_once(&once, &globalMutexInitImpl) != 0) {
+ abort();
+ }
+
+ return &globalMutex;
+}
diff --git a/sal/osl/unx/nlsupport.c b/sal/osl/unx/nlsupport.c
new file mode 100644
index 000000000000..af7d420ee524
--- /dev/null
+++ b/sal/osl/unx/nlsupport.c
@@ -0,0 +1,949 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <osl/nlsupport.h>
+#include <osl/diagnose.h>
+#include <osl/process.h>
+#include <rtl/memory.h>
+
+#if defined(LINUX) || defined(SOLARIS) || defined(NETBSD) || defined(FREEBSD) || defined(MACOSX)
+#include <pthread.h>
+#ifndef MACOSX
+ #include <locale.h>
+ #include <langinfo.h>
+#else
+#include <osl/module.h>
+#include <osl/thread.h>
+#endif /* !MACOSX */
+#endif /* LINUX || SOLARIS || NETBSD || MACOSX */
+
+#include <string.h>
+
+/*****************************************************************************
+ typedefs
+ *****************************************************************************/
+
+
+typedef struct {
+ const char *key;
+ const rtl_TextEncoding value;
+} _pair;
+
+
+/*****************************************************************************
+ compare function for binary search
+ *****************************************************************************/
+
+static int
+_pair_compare (const char *key, const _pair *pair)
+{
+ int result = rtl_str_compareIgnoreAsciiCase( key, pair->key );
+ return result;
+}
+
+/*****************************************************************************
+ binary search on encoding tables
+ *****************************************************************************/
+
+static const _pair*
+_pair_search (const char *key, const _pair *base, unsigned int member )
+{
+ unsigned int lower = 0;
+ unsigned int upper = member;
+ unsigned int current;
+ int comparison;
+
+ /* check for validity of input */
+ if ( (key == NULL) || (base == NULL) || (member == 0) )
+ return NULL;
+
+ /* binary search */
+ while ( lower < upper )
+ {
+ current = (lower + upper) / 2;
+ comparison = _pair_compare( key, base + current );
+ if (comparison < 0)
+ upper = current;
+ else if (comparison > 0)
+ lower = current + 1;
+ else
+ return base + current;
+ }
+
+ return NULL;
+}
+
+
+/*****************************************************************************
+ convert rtl_Locale to locale string
+ *****************************************************************************/
+
+static char * _compose_locale( rtl_Locale * pLocale, char * buffer, size_t n )
+{
+ /* check if a valid locale is specified */
+ if( pLocale && pLocale->Language &&
+ (pLocale->Language->length == 2 || pLocale->Language->length == 3) )
+ {
+ size_t offset = 0;
+
+ /* convert language code to ascii */
+ {
+ rtl_String *pLanguage = NULL;
+
+ rtl_uString2String( &pLanguage,
+ pLocale->Language->buffer, pLocale->Language->length,
+ RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ if( SAL_INT_CAST(sal_uInt32, pLanguage->length) < n )
+ {
+ strcpy( buffer, pLanguage->buffer );
+ offset = pLanguage->length;
+ }
+
+ rtl_string_release( pLanguage );
+ }
+
+ /* convert country code to ascii */
+ if( pLocale->Country && (pLocale->Country->length == 2) )
+ {
+ rtl_String *pCountry = NULL;
+
+ rtl_uString2String( &pCountry,
+ pLocale->Country->buffer, pLocale->Country->length,
+ RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ if( offset + pCountry->length + 1 < n )
+ {
+ strcpy( buffer + offset++, "_" );
+ strcpy( buffer + offset, pCountry->buffer );
+ offset += pCountry->length;
+ }
+
+ rtl_string_release( pCountry );
+ }
+
+ /* convert variant to ascii - check if there is enough space for the variant string */
+ if( pLocale->Variant && pLocale->Variant->length &&
+ ( SAL_INT_CAST(sal_uInt32, pLocale->Variant->length) < n - 6 ) )
+ {
+ rtl_String *pVariant = NULL;
+
+ rtl_uString2String( &pVariant,
+ pLocale->Variant->buffer, pLocale->Variant->length,
+ RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ if( offset + pVariant->length + 1 < n )
+ {
+ strcpy( buffer + offset, pVariant->buffer );
+ offset += pVariant->length;
+ }
+
+ rtl_string_release( pVariant );
+ }
+
+ return buffer;
+ }
+
+ return NULL;
+}
+
+/*****************************************************************************
+ convert locale string to rtl_Locale
+ *****************************************************************************/
+
+static rtl_Locale * _parse_locale( const char * locale )
+{
+ static sal_Unicode c_locale[2] = { (sal_Unicode) 'C', 0 };
+
+ /* check if locale contains a valid string */
+ if( locale )
+ {
+ size_t len = strlen( locale );
+
+ if( len >= 2 )
+ {
+ rtl_uString * pLanguage = NULL;
+ rtl_uString * pCountry = NULL;
+ rtl_uString * pVariant = NULL;
+
+ size_t offset = 2;
+
+ rtl_Locale * ret;
+
+ /* language is a two or three letter code */
+ if( (len > 3 && '_' == locale[3]) || (len == 3 && '_' != locale[2]) )
+ offset = 3;
+
+ /* convert language code to unicode */
+ rtl_string2UString( &pLanguage, locale, offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pLanguage != NULL);
+
+ /* convert country code to unicode */
+ if( len >= offset+3 && '_' == locale[offset] )
+ {
+ rtl_string2UString( &pCountry, locale + offset + 1, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pCountry != NULL);
+ offset += 3;
+ }
+
+ /* convert variant code to unicode - do not rely on "." as delimiter */
+ if( len > offset ) {
+ rtl_string2UString( &pVariant, locale + offset, len - offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(pVariant != NULL);
+ }
+
+ ret = rtl_locale_register( pLanguage->buffer, pCountry ? pCountry->buffer : c_locale + 1, pVariant ? pVariant->buffer : c_locale + 1 );
+
+ if (pVariant) rtl_uString_release(pVariant);
+ if (pCountry) rtl_uString_release(pCountry);
+ if (pLanguage) rtl_uString_release(pLanguage);
+
+ return ret;
+ }
+ else
+ return rtl_locale_register( c_locale, c_locale + 1, c_locale + 1 );
+ }
+
+ return NULL;
+}
+
+#if defined(LINUX) || defined(SOLARIS) || defined(NETBSD) || defined(FREEBSD)
+
+/*
+ * This implementation of osl_getTextEncodingFromLocale maps
+ * from nl_langinfo(CODESET) to rtl_textencoding defines.
+ * nl_langinfo() is supported only on Linux, Solaris,
+ * >= NetBSD 1.6 and >= FreeBSD 4.4
+ *
+ * This routine is SLOW because of the setlocale call, so
+ * grab the result and cache it.
+ *
+ * XXX this code has the usual mt problems aligned with setlocale() XXX
+ */
+
+#ifdef LINUX
+#if !defined(CODESET)
+#define CODESET _NL_CTYPE_CODESET_NAME
+#endif
+#endif
+
+/*
+ * _nl_language_list[] is an array list of supported encodings. Because
+ * we are using a binary search, the list has to be in ascending order.
+ * We are comparing the encodings case insensitiv, so the list has
+ * to be completly upper- , or lowercase.
+ */
+
+#if defined(SOLARIS)
+
+/* The values in the below list can be obtained with a script like
+ * #!/bin/sh
+ * for i in `locale -a`; do
+ * LC_ALL=$i locale -k code_set_name
+ * done
+ */
+const _pair _nl_language_list[] = {
+ { "5601", RTL_TEXTENCODING_EUC_KR }, /* ko_KR.EUC */
+ { "646", RTL_TEXTENCODING_ISO_8859_1 }, /* fake: ASCII_US */
+ { "ANSI-1251", RTL_TEXTENCODING_MS_1251 }, /* ru_RU.ANSI1251 */
+ { "BIG5", RTL_TEXTENCODING_BIG5 }, /* zh_CN.BIG5 */
+ { "BIG5-HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* zh_CN.BIG5HK */
+ { "CNS11643", RTL_TEXTENCODING_EUC_TW }, /* zh_TW.EUC */
+ { "EUCJP", RTL_TEXTENCODING_EUC_JP }, /* ja_JP.eucjp */
+ { "GB18030", RTL_TEXTENCODING_GB_18030 }, /* zh_CN.GB18030 */
+ { "GB2312", RTL_TEXTENCODING_GB_2312 }, /* zh_CN */
+ { "GBK", RTL_TEXTENCODING_GBK }, /* zh_CN.GBK */
+ { "ISO8859-1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "ISO8859-10", RTL_TEXTENCODING_ISO_8859_10 },
+ { "ISO8859-13", RTL_TEXTENCODING_ISO_8859_13 }, /* lt_LT lv_LV */
+ { "ISO8859-14", RTL_TEXTENCODING_ISO_8859_14 },
+ { "ISO8859-15", RTL_TEXTENCODING_ISO_8859_15 },
+ { "ISO8859-2", RTL_TEXTENCODING_ISO_8859_2 },
+ { "ISO8859-3", RTL_TEXTENCODING_ISO_8859_3 },
+ { "ISO8859-4", RTL_TEXTENCODING_ISO_8859_4 },
+ { "ISO8859-5", RTL_TEXTENCODING_ISO_8859_5 },
+ { "ISO8859-6", RTL_TEXTENCODING_ISO_8859_6 },
+ { "ISO8859-7", RTL_TEXTENCODING_ISO_8859_7 },
+ { "ISO8859-8", RTL_TEXTENCODING_ISO_8859_8 },
+ { "ISO8859-9", RTL_TEXTENCODING_ISO_8859_9 },
+ { "KOI8-R", RTL_TEXTENCODING_KOI8_R },
+ { "KOI8-U", RTL_TEXTENCODING_KOI8_U },
+ { "PCK", RTL_TEXTENCODING_MS_932 },
+ { "SUN_EU_GREEK", RTL_TEXTENCODING_ISO_8859_7 }, /* 8859-7 + Euro */
+ { "TIS620.2533", RTL_TEXTENCODING_MS_874 }, /* th_TH.TIS620 */
+ { "UTF-8", RTL_TEXTENCODING_UTF8 }
+};
+
+/* XXX MS-874 is an extension to tis620, so this is not
+ * really equivalent */
+
+#elif defined(LINUX) || defined(NETBSD)
+
+const _pair _nl_language_list[] = {
+ { "ANSI_X3.110-1983", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-99 NAPLPS */
+ { "ANSI_X3.4-1968", RTL_TEXTENCODING_ISO_8859_1 }, /* fake: ASCII_US */
+ { "ASMO_449", RTL_TEXTENCODING_DONTKNOW }, /* ISO_9036 ARABIC7 */
+ { "BALTIC", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-179 */
+ { "BIG5", RTL_TEXTENCODING_BIG5 }, /* locale: zh_TW */
+ { "BIG5-HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* locale: zh_CN.BIG5HK */
+ { "BIG5HKSCS", RTL_TEXTENCODING_BIG5_HKSCS }, /* depricated */
+ { "BS_4730", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-4 ISO646-GB */
+ { "BS_VIEWDATA", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-47 */
+ { "CP1250", RTL_TEXTENCODING_MS_1250 }, /* MS-EE */
+ { "CP1251", RTL_TEXTENCODING_MS_1251 }, /* MS-CYRL */
+ { "CP1252", RTL_TEXTENCODING_MS_1252 }, /* MS-ANSI */
+ { "CP1253", RTL_TEXTENCODING_MS_1253 }, /* MS-GREEK */
+ { "CP1254", RTL_TEXTENCODING_MS_1254 }, /* MS-TURK */
+ { "CP1255", RTL_TEXTENCODING_MS_1255 }, /* MS-HEBR */
+ { "CP1256", RTL_TEXTENCODING_MS_1256 }, /* MS-ARAB */
+ { "CP1257", RTL_TEXTENCODING_MS_1257 }, /* WINBALTRIM */
+ { "CSA_Z243.4-1985-1", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-121 */
+ { "CSA_Z243.4-1985-2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-122 CSA7-2 */
+ { "CSA_Z243.4-1985-GR", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-123 */
+ { "CSN_369103", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-139 */
+ { "CWI", RTL_TEXTENCODING_DONTKNOW }, /* CWI-2 CP-HU */
+ { "DEC-MCS", RTL_TEXTENCODING_DONTKNOW }, /* DEC */
+ { "DIN_66003", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-21 */
+ { "DS_2089", RTL_TEXTENCODING_DONTKNOW }, /* DS2089 ISO646-DK */
+ { "EBCDIC-AT-DE", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-AT-DE-A", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-CA-FR", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-DK-NO", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-DK-NO-A", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-ES", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-ES-A", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-ES-S", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-FI-SE", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-FI-SE-A", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-FR", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-IS-FRISS", RTL_TEXTENCODING_DONTKNOW }, /* FRISS */
+ { "EBCDIC-IT", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-PT", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-UK", RTL_TEXTENCODING_DONTKNOW },
+ { "EBCDIC-US", RTL_TEXTENCODING_DONTKNOW },
+ { "ECMA-CYRILLIC", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-111 */
+ { "ES", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-17 */
+ { "ES2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-85 */
+ { "EUC-JP", RTL_TEXTENCODING_EUC_JP }, /* locale: ja_JP.eucjp */
+ { "EUC-KR", RTL_TEXTENCODING_EUC_KR }, /* locale: ko_KR.euckr */
+ { "EUC-TW", RTL_TEXTENCODING_EUC_TW }, /* locale: zh_TW.euctw */
+ { "GB18030", RTL_TEXTENCODING_GB_18030 }, /* locale: zh_CN.gb18030 */
+ { "GB2312", RTL_TEXTENCODING_GB_2312 }, /* locale: zh_CN */
+ { "GB_1988-80", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-57 */
+ { "GBK", RTL_TEXTENCODING_GBK }, /* locale: zh_CN.GBK */
+ { "GOST_19768-74", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-153 */
+ { "GREEK-CCITT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-150 */
+ { "GREEK7", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-88 */
+ { "GREEK7-OLD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-18 */
+ { "HP-ROMAN8", RTL_TEXTENCODING_DONTKNOW }, /* ROMAN8 R8 */
+ { "IBM037", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-[US|CA|WT] */
+ { "IBM038", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-INT CP038 */
+ { "IBM1004", RTL_TEXTENCODING_DONTKNOW }, /* CP1004 OS2LATIN1 */
+ { "IBM1026", RTL_TEXTENCODING_DONTKNOW }, /* CP1026 1026 */
+ { "IBM1047", RTL_TEXTENCODING_DONTKNOW }, /* CP1047 1047 */
+ { "IBM256", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-INT1 */
+ { "IBM273", RTL_TEXTENCODING_DONTKNOW }, /* CP273 */
+ { "IBM274", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-BE CP274 */
+ { "IBM275", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-BR CP275 */
+ { "IBM277", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-[DK|NO] */
+ { "IBM278", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-[FISE]*/
+ { "IBM280", RTL_TEXTENCODING_DONTKNOW }, /* CP280 EBCDIC-CP-IT*/
+ { "IBM281", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-JP-E CP281 */
+ { "IBM284", RTL_TEXTENCODING_DONTKNOW }, /* CP284 EBCDIC-CP-ES */
+ { "IBM285", RTL_TEXTENCODING_DONTKNOW }, /* CP285 EBCDIC-CP-GB */
+ { "IBM290", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-JP-KANA */
+ { "IBM297", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-FR */
+ { "IBM420", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-AR1 */
+ { "IBM423", RTL_TEXTENCODING_DONTKNOW }, /* CP423 EBCDIC-CP-GR */
+ { "IBM424", RTL_TEXTENCODING_DONTKNOW }, /* CP424 EBCDIC-CP-HE */
+ { "IBM437", RTL_TEXTENCODING_IBM_437 }, /* CP437 437 */
+ { "IBM500", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CP-[BE|CH] */
+ { "IBM850", RTL_TEXTENCODING_IBM_850 }, /* CP850 850 */
+ { "IBM851", RTL_TEXTENCODING_DONTKNOW }, /* CP851 851 */
+ { "IBM852", RTL_TEXTENCODING_IBM_852 }, /* CP852 852 */
+ { "IBM855", RTL_TEXTENCODING_IBM_855 }, /* CP855 855 */
+ { "IBM857", RTL_TEXTENCODING_IBM_857 }, /* CP857 857 */
+ { "IBM860", RTL_TEXTENCODING_IBM_860 }, /* CP860 860 */
+ { "IBM861", RTL_TEXTENCODING_IBM_861 }, /* CP861 861 CP-IS */
+ { "IBM862", RTL_TEXTENCODING_IBM_862 }, /* CP862 862 */
+ { "IBM863", RTL_TEXTENCODING_IBM_863 }, /* CP863 863 */
+ { "IBM864", RTL_TEXTENCODING_IBM_864 }, /* CP864 */
+ { "IBM865", RTL_TEXTENCODING_IBM_865 }, /* CP865 865 */
+ { "IBM866", RTL_TEXTENCODING_IBM_866 }, /* CP866 866 */
+ { "IBM868", RTL_TEXTENCODING_DONTKNOW }, /* CP868 CP-AR */
+ { "IBM869", RTL_TEXTENCODING_IBM_869 }, /* CP869 869 CP-GR */
+ { "IBM870", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-[ROECE|YU] */
+ { "IBM871", RTL_TEXTENCODING_DONTKNOW }, /* CP871 EBCDIC-CP-IS */
+ { "IBM875", RTL_TEXTENCODING_DONTKNOW }, /* CP875 EBCDIC-GREEK */
+ { "IBM880", RTL_TEXTENCODING_DONTKNOW }, /* EBCDIC-CYRILLIC */
+ { "IBM891", RTL_TEXTENCODING_DONTKNOW }, /* CP891 */
+ { "IBM903", RTL_TEXTENCODING_DONTKNOW }, /* CP903 */
+ { "IBM904", RTL_TEXTENCODING_DONTKNOW }, /* CP904 904 */
+ { "IBM905", RTL_TEXTENCODING_DONTKNOW }, /* CP905 EBCDIC-CP-TR */
+ { "IBM918", RTL_TEXTENCODING_DONTKNOW }, /* CP918 EBCDIC-AR2 */
+ { "IEC_P27-1", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-143 */
+ { "INIS", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-49 */
+ { "INIS-8", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-50 */
+ { "INIS-CYRILLIC", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-51 */
+ { "INVARIANT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-170 */
+ { "ISO-8859-1", RTL_TEXTENCODING_ISO_8859_1 }, /* ISO-IR-100 CP819 */
+ { "ISO-8859-10", RTL_TEXTENCODING_ISO_8859_10 }, /* ISO-IR-157 LATIN6 */
+ { "ISO-8859-13", RTL_TEXTENCODING_ISO_8859_13 }, /* ISO-IR-179 LATIN7 */
+ { "ISO-8859-14", RTL_TEXTENCODING_ISO_8859_14 }, /* LATIN8 L8 */
+ { "ISO-8859-15", RTL_TEXTENCODING_ISO_8859_15 },
+ { "ISO-8859-2", RTL_TEXTENCODING_ISO_8859_2 }, /* LATIN2 L2 */
+ { "ISO-8859-3", RTL_TEXTENCODING_ISO_8859_3 }, /* LATIN3 L3 */
+ { "ISO-8859-4", RTL_TEXTENCODING_ISO_8859_4 }, /* LATIN4 L4 */
+ { "ISO-8859-5", RTL_TEXTENCODING_ISO_8859_5 }, /* CYRILLIC */
+ { "ISO-8859-6", RTL_TEXTENCODING_ISO_8859_6 }, /* ECMA-114 ARABIC */
+ { "ISO-8859-7", RTL_TEXTENCODING_ISO_8859_7 }, /* ECMA-118 GREEK8 */
+ { "ISO-8859-8", RTL_TEXTENCODING_ISO_8859_8 }, /* ISO_8859-8 HEBREW */
+ { "ISO-8859-9", RTL_TEXTENCODING_ISO_8859_9 }, /* ISO_8859-9 LATIN5 */
+ { "ISO-IR-90", RTL_TEXTENCODING_DONTKNOW }, /* ISO_6937-2:1983 */
+ { "ISO_10367-BOX", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-155 */
+ { "ISO_2033-1983", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-98 E13B */
+ { "ISO_5427", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-37 KOI-7 */
+ { "ISO_5427-EXT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-54 */
+ { "ISO_5428", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-55 */
+ { "ISO_646.BASIC", RTL_TEXTENCODING_ASCII_US }, /* REF */
+ { "ISO_646.IRV", RTL_TEXTENCODING_ASCII_US }, /* ISO-IR-2 IRV */
+ { "ISO_646.IRV:1983", RTL_TEXTENCODING_ISO_8859_1 }, /* fake: ASCII_US, used for "C" locale*/
+ { "ISO_6937", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-156 ISO6937*/
+ { "ISO_6937-2-25", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-152 */
+ { "ISO_6937-2-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-142 */
+ { "ISO_8859-SUPP", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-154 */
+ { "IT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-15 */
+ { "JIS_C6220-1969-JP", RTL_TEXTENCODING_DONTKNOW }, /* KATAKANA X0201-7 */
+ { "JIS_C6220-1969-RO", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-14 */
+ { "JIS_C6229-1984-A", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-91 */
+ { "JIS_C6229-1984-B", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-92 */
+ { "JIS_C6229-1984-B-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-93 */
+ { "JIS_C6229-1984-HAND", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-94 */
+ { "JIS_C6229-1984-HAND-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-95 */
+ { "JIS_C6229-1984-KANA", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-96 */
+ { "JIS_X0201", RTL_TEXTENCODING_DONTKNOW }, /* X0201 */
+ { "JUS_I.B1.002", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-141 */
+ { "JUS_I.B1.003-MAC", RTL_TEXTENCODING_DONTKNOW }, /* MACEDONIAN */
+ { "JUS_I.B1.003-SERB", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-146 SERBIAN */
+ { "KOI-8", RTL_TEXTENCODING_DONTKNOW },
+ { "KOI8-R", RTL_TEXTENCODING_KOI8_R },
+ { "KOI8-U", RTL_TEXTENCODING_KOI8_U },
+ { "KSC5636", RTL_TEXTENCODING_DONTKNOW }, /* ISO646-KR */
+ { "LATIN-GREEK", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-19 */
+ { "LATIN-GREEK-1", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-27 */
+ { "MAC-IS", RTL_TEXTENCODING_APPLE_ROMAN },
+ { "MAC-UK", RTL_TEXTENCODING_APPLE_ROMAN },
+ { "MACINTOSH", RTL_TEXTENCODING_APPLE_ROMAN }, /* MAC */
+ { "MSZ_7795.3", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-86 */
+ { "NATS-DANO", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-9-1 */
+ { "NATS-DANO-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-9-2 */
+ { "NATS-SEFI", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-8-1 */
+ { "NATS-SEFI-ADD", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-8-2 */
+ { "NC_NC00-10", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-151 */
+ { "NEXTSTEP", RTL_TEXTENCODING_DONTKNOW }, /* NEXT */
+ { "NF_Z_62-010", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-69 */
+ { "NF_Z_62-010_(1973)", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-25 */
+ { "NS_4551-1", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-60 */
+ { "NS_4551-2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-61 */
+ { "PT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-16 */
+ { "PT2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-84 */
+ { "SAMI", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-158 */
+ { "SEN_850200_B", RTL_TEXTENCODING_DONTKNOW }, /* ISO646-[FI|SE] */
+ { "SEN_850200_C", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-11 */
+ { "T.101-G2", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-128 */
+ { "T.61-7BIT", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-102 */
+ { "T.61-8BIT", RTL_TEXTENCODING_DONTKNOW }, /* T.61 ISO-IR-103 */
+ { "TIS-620", RTL_TEXTENCODING_MS_874 }, /* locale: th_TH */
+ { "UTF-8", RTL_TEXTENCODING_UTF8 }, /* ISO-10646/UTF-8 */
+ { "VIDEOTEX-SUPPL", RTL_TEXTENCODING_DONTKNOW }, /* ISO-IR-70 */
+ { "WIN-SAMI-2", RTL_TEXTENCODING_DONTKNOW } /* WS2 */
+};
+
+#elif defined(FREEBSD)
+
+const _pair _nl_language_list[] = {
+ { "ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */
+ { "BIG5", RTL_TEXTENCODING_BIG5 }, /* China - Traditional Chinese */
+ { "CP1251", RTL_TEXTENCODING_MS_1251 }, /* MS-CYRL */
+ { "CP866", RTL_TEXTENCODING_IBM_866 }, /* CP866 866 */
+ { "EUCCN", RTL_TEXTENCODING_EUC_CN }, /* China - Simplified Chinese */
+ { "EUCJP", RTL_TEXTENCODING_EUC_JP }, /* Japan */
+ { "EUCKR", RTL_TEXTENCODING_EUC_KR }, /* Korea */
+ { "ISO8859-1", RTL_TEXTENCODING_ISO_8859_1 }, /* Western */
+ { "ISO8859-15", RTL_TEXTENCODING_ISO_8859_15 }, /* Western Updated (w/Euro sign) */
+ { "ISO8859-2", RTL_TEXTENCODING_ISO_8859_2 }, /* Central European */
+ { "ISO8859-4", RTL_TEXTENCODING_ISO_8859_4 }, /* LATIN4 L4 */
+ { "ISO8859-5", RTL_TEXTENCODING_ISO_8859_5 }, /* Cyrillic */
+ { "ISO8859-7", RTL_TEXTENCODING_ISO_8859_7 }, /* Greek */
+ { "ISO8859-9", RTL_TEXTENCODING_ISO_8859_9 }, /* Turkish */
+ { "KOI8-R", RTL_TEXTENCODING_KOI8_R }, /* KOI8-R */
+ { "KOI8-U", RTL_TEXTENCODING_KOI8_U }, /* KOI8-U */
+ { "SJIS", RTL_TEXTENCODING_SHIFT_JIS }, /* Japan */
+ { "US-ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */
+ { "UTF-8", RTL_TEXTENCODING_UTF8 } /* ISO-10646/UTF-8 */
+};
+
+#elif defined(NETBSD)
+
+const _pair _nl_language_list[] = {
+ { "ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */
+ { "BIG5", RTL_TEXTENCODING_BIG5 }, /* China - Traditional Chinese */
+ { "CP1251", RTL_TEXTENCODING_MS_1251 }, /* MS-CYRL */
+ { "CP866", RTL_TEXTENCODING_IBM_866 }, /* CP866 866 */
+ { "CTEXT", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */
+ { "EUCCN", RTL_TEXTENCODING_EUC_CN }, /* China - Simplified Chinese */
+ { "EUCJP", RTL_TEXTENCODING_EUC_JP }, /* Japan */
+ { "EUCKR", RTL_TEXTENCODING_EUC_KR }, /* Korea */
+ { "EUCTW", RTL_TEXTENCODING_EUC_TW }, /* China - Traditional Chinese */
+ { "ISO-2022-JP", RTL_TEXTENCODING_DONTKNOW }, /* */
+ { "ISO-2022-JP-2", RTL_TEXTENCODING_DONTKNOW }, /* */
+ { "ISO8859-1", RTL_TEXTENCODING_ISO_8859_1 }, /* Western */
+ { "ISO8859-15", RTL_TEXTENCODING_ISO_8859_15 }, /* Western Updated (w/Euro sign) */
+ { "ISO8859-2", RTL_TEXTENCODING_ISO_8859_2 }, /* Central European */
+ { "ISO8859-4", RTL_TEXTENCODING_ISO_8859_4 }, /* LATIN4 L4 */
+ { "ISO8859-5", RTL_TEXTENCODING_ISO_8859_5 }, /* Cyrillic */
+ { "ISO8859-7", RTL_TEXTENCODING_ISO_8859_7 }, /* Greek */
+ { "ISO8859-9", RTL_TEXTENCODING_ISO_8859_9 }, /* Turkish */
+ { "KOI8-R", RTL_TEXTENCODING_KOI8_R }, /* KOI8-R */
+ { "KOI8-U", RTL_TEXTENCODING_KOI8_U }, /* KOI8-U */
+ { "SJIS", RTL_TEXTENCODING_SHIFT_JIS }, /* Japan */
+ { "US-ASCII", RTL_TEXTENCODING_ASCII_US }, /* US-ASCII */
+ { "UTF-8", RTL_TEXTENCODING_UTF8 } /* ISO-10646/UTF-8 */
+};
+
+#endif /* ifdef SOLARIS LINUX FREEBSD NETBSD */
+
+static pthread_mutex_t aLocalMutex = PTHREAD_MUTEX_INITIALIZER;
+
+/*****************************************************************************
+ return the text encoding corresponding to the given locale
+ *****************************************************************************/
+
+rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale )
+{
+ const _pair *language=0;
+
+ char locale_buf[64] = "";
+ char codeset_buf[64];
+
+ char *ctype_locale = 0;
+ char *codeset = 0;
+
+ /* default to process locale if pLocale == NULL */
+ if( NULL == pLocale )
+ osl_getProcessLocale( &pLocale );
+
+ /* convert rtl_Locale to locale string */
+ _compose_locale( pLocale, locale_buf, 64 );
+
+ /* basic thread safeness */
+ pthread_mutex_lock( &aLocalMutex );
+
+ /* remember the charset as indicated by the LC_CTYPE locale */
+ ctype_locale = setlocale( LC_CTYPE, NULL );
+
+ /* set the desired LC_CTYPE locale */
+ if( NULL == setlocale( LC_CTYPE, locale_buf ) )
+ {
+ pthread_mutex_unlock(&aLocalMutex);
+ return RTL_TEXTENCODING_DONTKNOW;
+ }
+
+ /* get the charset as indicated by the LC_CTYPE locale */
+#if defined(NETBSD) && !defined(CODESET)
+ codeset = NULL;
+#else
+ codeset = nl_langinfo( CODESET );
+#endif
+
+ if ( codeset != NULL )
+ {
+ /* get codeset into mt save memory */
+ strncpy( codeset_buf, codeset, sizeof(codeset_buf) );
+ codeset_buf[sizeof(codeset_buf) - 1] = 0;
+ codeset = codeset_buf;
+ }
+
+ /* restore the original value of locale */
+ if ( ctype_locale != NULL )
+ setlocale( LC_CTYPE, ctype_locale );
+
+ pthread_mutex_unlock( &aLocalMutex );
+
+ /* search the codeset in our language list */
+ if ( codeset != NULL )
+ {
+ const unsigned int members = sizeof(_nl_language_list) / sizeof(_pair);
+ language = _pair_search (codeset, _nl_language_list, members);
+ }
+
+ OSL_ASSERT( language && ( RTL_TEXTENCODING_DONTKNOW != language->value ) );
+
+ /* a matching item in our list provides a mapping from codeset to
+ * rtl-codeset */
+ if ( language != NULL )
+ return language->value;
+
+ return RTL_TEXTENCODING_DONTKNOW;
+}
+
+/*****************************************************************************
+ return the current process locale
+ *****************************************************************************/
+
+void _imp_getProcessLocale( rtl_Locale ** ppLocale )
+{
+ char * locale;
+
+ /* basic thread safeness */
+ pthread_mutex_lock( &aLocalMutex );
+
+ /* set the locale defined by the env vars */
+ locale = setlocale( LC_CTYPE, "" );
+
+ /* fallback to the current locale */
+ if( NULL == locale )
+ locale = setlocale( LC_CTYPE, NULL );
+
+ /* return the LC_CTYPE locale */
+ *ppLocale = _parse_locale( locale );
+
+ pthread_mutex_unlock( &aLocalMutex );
+}
+
+/*****************************************************************************
+ set the current process locale
+ *****************************************************************************/
+
+int _imp_setProcessLocale( rtl_Locale * pLocale )
+{
+ char locale_buf[64] = "";
+ int ret = 0;
+
+ /* convert rtl_Locale to locale string */
+ _compose_locale( pLocale, locale_buf, 64 );
+
+ /* basic thread safeness */
+ pthread_mutex_lock( &aLocalMutex );
+
+ /* try to set LC_ALL locale */
+ if( NULL == setlocale( LC_ALL, locale_buf ) )
+ ret = -1;
+
+ pthread_mutex_unlock( &aLocalMutex );
+ return ret;
+}
+
+#else /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */
+
+/*
+ * This implementation of osl_getTextEncodingFromLocale maps
+ * from the ISO language codes.
+ */
+
+const _pair _full_locale_list[] = {
+ { "ja_JP.eucJP", RTL_TEXTENCODING_EUC_JP },
+ { "ja_JP.EUC", RTL_TEXTENCODING_EUC_JP },
+ { "ko_KR.EUC", RTL_TEXTENCODING_EUC_KR },
+ { "zh_CN.EUC", RTL_TEXTENCODING_EUC_CN },
+ { "zh_TW.EUC", RTL_TEXTENCODING_EUC_TW }
+};
+
+const _pair _locale_extension_list[] = {
+ { "big5", RTL_TEXTENCODING_BIG5 },
+ { "big5hk", RTL_TEXTENCODING_BIG5_HKSCS },
+ { "gb18030", RTL_TEXTENCODING_GB_18030 },
+ { "euc", RTL_TEXTENCODING_EUC_JP },
+ { "iso8859-1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "iso8859-10", RTL_TEXTENCODING_ISO_8859_10 },
+ { "iso8859-13", RTL_TEXTENCODING_ISO_8859_13 },
+ { "iso8859-14", RTL_TEXTENCODING_ISO_8859_14 },
+ { "iso8859-15", RTL_TEXTENCODING_ISO_8859_15 },
+ { "iso8859-2", RTL_TEXTENCODING_ISO_8859_2 },
+ { "iso8859-3", RTL_TEXTENCODING_ISO_8859_3 },
+ { "iso8859-4", RTL_TEXTENCODING_ISO_8859_4 },
+ { "iso8859-5", RTL_TEXTENCODING_ISO_8859_5 },
+ { "iso8859-6", RTL_TEXTENCODING_ISO_8859_6 },
+ { "iso8859-7", RTL_TEXTENCODING_ISO_8859_7 },
+ { "iso8859-8", RTL_TEXTENCODING_ISO_8859_8 },
+ { "iso8859-9", RTL_TEXTENCODING_ISO_8859_9 },
+ { "koi8-r", RTL_TEXTENCODING_KOI8_R },
+ { "koi8-u", RTL_TEXTENCODING_KOI8_U },
+ { "pck", RTL_TEXTENCODING_MS_932 },
+#if (0)
+ { "sun_eu_greek", RTL_TEXTENCODING_DONTKNOW },
+#endif
+ { "utf-16", RTL_TEXTENCODING_UNICODE },
+ { "utf-7", RTL_TEXTENCODING_UTF7 },
+ { "utf-8", RTL_TEXTENCODING_UTF8 }
+};
+
+const _pair _iso_language_list[] = {
+ { "af", RTL_TEXTENCODING_ISO_8859_1 },
+ { "ar", RTL_TEXTENCODING_ISO_8859_6 },
+ { "az", RTL_TEXTENCODING_ISO_8859_9 },
+ { "be", RTL_TEXTENCODING_ISO_8859_5 },
+ { "bg", RTL_TEXTENCODING_ISO_8859_5 },
+ { "ca", RTL_TEXTENCODING_ISO_8859_1 },
+ { "cs", RTL_TEXTENCODING_ISO_8859_2 },
+ { "da", RTL_TEXTENCODING_ISO_8859_1 },
+ { "de", RTL_TEXTENCODING_ISO_8859_1 },
+ { "el", RTL_TEXTENCODING_ISO_8859_7 },
+ { "en", RTL_TEXTENCODING_ISO_8859_1 },
+ { "es", RTL_TEXTENCODING_ISO_8859_1 },
+ { "et", RTL_TEXTENCODING_ISO_8859_4 },
+ { "eu", RTL_TEXTENCODING_ISO_8859_1 },
+ { "fa", RTL_TEXTENCODING_ISO_8859_6 },
+ { "fi", RTL_TEXTENCODING_ISO_8859_1 },
+ { "fo", RTL_TEXTENCODING_ISO_8859_1 },
+ { "fr", RTL_TEXTENCODING_ISO_8859_1 },
+ { "gr", RTL_TEXTENCODING_ISO_8859_7 },
+ { "he", RTL_TEXTENCODING_ISO_8859_8 },
+ { "hi", RTL_TEXTENCODING_DONTKNOW },
+ { "hr", RTL_TEXTENCODING_ISO_8859_2 },
+ { "hu", RTL_TEXTENCODING_ISO_8859_2 },
+ { "hy", RTL_TEXTENCODING_DONTKNOW },
+ { "id", RTL_TEXTENCODING_ISO_8859_1 },
+ { "is", RTL_TEXTENCODING_ISO_8859_1 },
+ { "it", RTL_TEXTENCODING_ISO_8859_1 },
+ { "iw", RTL_TEXTENCODING_ISO_8859_8 },
+ { "ja", RTL_TEXTENCODING_EUC_JP },
+ { "ka", RTL_TEXTENCODING_DONTKNOW },
+ { "kk", RTL_TEXTENCODING_ISO_8859_5 },
+ { "ko", RTL_TEXTENCODING_EUC_KR },
+ { "lt", RTL_TEXTENCODING_ISO_8859_4 },
+ { "lv", RTL_TEXTENCODING_ISO_8859_4 },
+ { "mk", RTL_TEXTENCODING_ISO_8859_5 },
+ { "mr", RTL_TEXTENCODING_DONTKNOW },
+ { "ms", RTL_TEXTENCODING_ISO_8859_1 },
+ { "nl", RTL_TEXTENCODING_ISO_8859_1 },
+ { "no", RTL_TEXTENCODING_ISO_8859_1 },
+ { "pl", RTL_TEXTENCODING_ISO_8859_2 },
+ { "pt", RTL_TEXTENCODING_ISO_8859_1 },
+ { "ro", RTL_TEXTENCODING_ISO_8859_2 },
+ { "ru", RTL_TEXTENCODING_ISO_8859_5 },
+ { "sa", RTL_TEXTENCODING_DONTKNOW },
+ { "sk", RTL_TEXTENCODING_ISO_8859_2 },
+ { "sl", RTL_TEXTENCODING_ISO_8859_2 },
+ { "sq", RTL_TEXTENCODING_ISO_8859_2 },
+ { "sv", RTL_TEXTENCODING_ISO_8859_1 },
+ { "sw", RTL_TEXTENCODING_ISO_8859_1 },
+ { "ta", RTL_TEXTENCODING_DONTKNOW },
+ { "th", RTL_TEXTENCODING_DONTKNOW },
+ { "tr", RTL_TEXTENCODING_ISO_8859_9 },
+ { "tt", RTL_TEXTENCODING_ISO_8859_5 },
+ { "uk", RTL_TEXTENCODING_ISO_8859_5 },
+ { "ur", RTL_TEXTENCODING_ISO_8859_6 },
+ { "uz", RTL_TEXTENCODING_ISO_8859_9 },
+ { "vi", RTL_TEXTENCODING_DONTKNOW },
+ { "zh", RTL_TEXTENCODING_BIG5 }
+};
+
+/*****************************************************************************
+ return the text encoding corresponding to the given locale
+ *****************************************************************************/
+
+rtl_TextEncoding osl_getTextEncodingFromLocale( rtl_Locale * pLocale )
+{
+ const _pair *language = 0;
+ char locale_buf[64] = "";
+ char *cp;
+
+ /* default to process locale if pLocale == NULL */
+ if( NULL == pLocale )
+ osl_getProcessLocale( &pLocale );
+
+ /* convert rtl_Locale to locale string */
+ if( _compose_locale( pLocale, locale_buf, 64 ) )
+ {
+ /* check special handling list (EUC) first */
+ const unsigned int members = sizeof( _full_locale_list ) / sizeof( _pair );
+ language = _pair_search( locale_buf, _full_locale_list, members);
+
+ if( NULL == language )
+ {
+ /*
+ * check if there is a charset qualifier at the end of the given locale string
+ * e.g. de.ISO8859-15 or de.ISO8859-15@euro which strongly indicates what
+ * charset to use
+ */
+ cp = strrchr( locale_buf, '.' );
+
+ if( NULL != cp )
+ {
+ const unsigned int members = sizeof( _locale_extension_list ) / sizeof( _pair );
+ language = _pair_search( cp + 1, _locale_extension_list, members);
+ }
+ }
+
+ /* use iso language code to determine the charset */
+ if( NULL == language )
+ {
+ const unsigned int members = sizeof( _iso_language_list ) / sizeof( _pair );
+
+ /* iso lang codes have 2 charaters */
+ locale_buf[2] = '\0';
+
+ language = _pair_search( locale_buf, _iso_language_list, members);
+ }
+ }
+
+ /* a matching item in our list provides a mapping from codeset to
+ * rtl-codeset */
+ if ( language != NULL )
+ return language->value;
+
+ return RTL_TEXTENCODING_DONTKNOW;
+}
+
+#ifdef MACOSX
+#include "system.h"
+
+/* OS X locale discovery function */
+int (*pGetOSXLocale)( char *, sal_uInt32 );
+
+oslModule SAL_CALL osl_psz_loadModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode);
+/*****************************************************************************
+ return the current process locale
+ *****************************************************************************/
+
+int macosx_getLocale(char *locale, sal_uInt32 bufferLen);
+
+void _imp_getProcessLocale( rtl_Locale ** ppLocale )
+{
+ static char *locale = NULL;
+
+ /* basic thread safeness */
+// pthread_mutex_lock( &aLocalMutex );
+
+ /* Only fetch the locale once and cache it */
+ if ( NULL == locale )
+ {
+
+ locale = (char *)malloc( 128 );
+ if ( locale )
+ macosx_getLocale( locale, 128 );
+ else
+ fprintf( stderr, "nlsupport.c: locale allocation returned NULL!\n" );
+ }
+
+ /* handle the case where OS specific method of finding locale fails */
+ if ( NULL == locale )
+ {
+ /* simulate behavior of setlocale */
+ locale = getenv( "LC_ALL" );
+
+ if( NULL == locale )
+ locale = getenv( "LC_CTYPE" );
+
+ if( NULL == locale )
+ locale = getenv( "LANG" );
+
+ if( NULL == locale )
+ locale = "C";
+ }
+
+ /* return the locale */
+ *ppLocale = _parse_locale( locale );
+
+ setenv( "LC_ALL", locale, 1);
+ setenv("LC_CTYPE", locale, 1 );
+ setenv("LANG", locale, 1 );
+
+#ifdef DEBUG
+ fprintf( stderr, "nlsupport.c: _imp_getProcessLocale() returning %s as current locale.\n", locale );
+#endif
+
+// pthread_mutex_unlock( &aLocalMutex );
+
+}
+#else
+/*****************************************************************************
+ return the current process locale
+ *****************************************************************************/
+
+void _imp_getProcessLocale( rtl_Locale ** ppLocale )
+{
+ /* simulate behavior off setlocale */
+ char * locale = getenv( "LC_ALL" );
+
+ if( NULL == locale )
+ locale = getenv( "LC_CTYPE" );
+
+ if( NULL == locale )
+ locale = getenv( "LANG" );
+
+ if( NULL == locale )
+ locale = "C";
+
+ *ppLocale = _parse_locale( locale );
+}
+#endif
+
+/*****************************************************************************
+ set the current process locale
+ *****************************************************************************/
+
+int _imp_setProcessLocale( rtl_Locale * pLocale )
+{
+ char locale_buf[64];
+
+ /* convert rtl_Locale to locale string */
+ if( NULL != _compose_locale( pLocale, locale_buf, 64 ) )
+ {
+ /* only change env vars that exist already */
+ if( getenv( "LC_ALL" ) ) {
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+ setenv( "LC_ALL", locale_buf, 1);
+#else
+ setenv( "LC_ALL", locale_buf );
+#endif
+ }
+
+ if( getenv( "LC_CTYPE" ) ) {
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+ setenv("LC_CTYPE", locale_buf, 1 );
+#else
+ setenv( "LC_CTYPE", locale_buf );
+#endif
+ }
+
+ if( getenv( "LANG" ) ) {
+#if defined( FREEBSD ) || defined( NETBSD ) || defined( MACOSX )
+ setenv("LC_CTYPE", locale_buf, 1 );
+#else
+ setenv( "LANG", locale_buf );
+#endif
+ }
+ }
+
+ return 0;
+}
+
+#endif /* ifdef LINUX || SOLARIS || MACOSX || NETBSD */
+
+
diff --git a/sal/osl/unx/osxlocale.cxx b/sal/osl/unx/osxlocale.cxx
new file mode 100644
index 000000000000..9a20fd9ceb12
--- /dev/null
+++ b/sal/osl/unx/osxlocale.cxx
@@ -0,0 +1,129 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <sal/types.h>
+#include <assert.h>
+
+#include <premac.h>
+#include <CoreServices/CoreServices.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <postmac.h>
+
+namespace /* private */
+{
+ template <typename T>
+ class CFGuard
+ {
+ public:
+ explicit CFGuard(T& rT) : rT_(rT) {}
+ ~CFGuard() { if (rT_) CFRelease(rT_); }
+ private:
+ T& rT_;
+ };
+
+ typedef CFGuard<CFArrayRef> CFArrayGuard;
+ typedef CFGuard<CFStringRef> CFStringGuard;
+ typedef CFGuard<CFPropertyListRef> CFPropertyListGuard;
+
+ /** Get the current process locale from system
+ */
+ CFStringRef getProcessLocale()
+ {
+ CFPropertyListRef pref = CFPreferencesCopyAppValue(CFSTR("AppleLocale"), kCFPreferencesCurrentApplication);
+ CFPropertyListGuard proplGuard(pref);
+
+ if (pref == NULL) // return fallback value 'en_US'
+ return CFStringCreateWithCString(kCFAllocatorDefault, "en_US", kCFStringEncodingASCII);
+
+ CFStringRef sref = (CFGetTypeID(pref) == CFArrayGetTypeID()) ? (CFStringRef)CFArrayGetValueAtIndex((CFArrayRef)pref, 0) : (CFStringRef)pref;
+
+ // NOTE: this API is only available with Mac OS X >=10.3. We need to use it because
+ // Apple used non-ISO values on systems <10.2 like "German" for instance but didn't
+ // upgrade those values during upgrade to newer Mac OS X versions. See also #i54337#
+ return CFLocaleCreateCanonicalLocaleIdentifierFromString(kCFAllocatorDefault, sref);
+ }
+} // namespace private
+
+/** Grab current locale from system.
+*/
+extern "C" {
+int macosx_getLocale(char *locale, sal_uInt32 bufferLen)
+{
+ CFStringRef sref = getProcessLocale();
+ CFStringGuard sGuard(sref);
+
+ assert(sref != NULL && "osxlocale.cxx: getProcessLocale must return a non-NULL value");
+
+ // split the string into substrings; the first two (if there are two) substrings
+ // are language and country
+ CFArrayRef subs = CFStringCreateArrayBySeparatingStrings(NULL, sref, CFSTR("_"));
+ CFArrayGuard arrGuard(subs);
+
+ CFStringRef lang = (CFStringRef)CFArrayGetValueAtIndex(subs, 0);
+ CFStringGetCString(lang, locale, bufferLen, kCFStringEncodingASCII);
+
+ // country also available? Assumption: if the array contains more than one
+ // value the second value is always the country!
+ if (CFArrayGetCount(subs) > 1)
+ {
+ strlcat(locale, "_", bufferLen - strlen(locale));
+
+ CFStringRef country = (CFStringRef)CFArrayGetValueAtIndex(subs, 1);
+ CFStringGetCString(country, locale + strlen(locale), bufferLen - strlen(locale), kCFStringEncodingASCII);
+ }
+ // Append 'UTF-8' to the locale because the Mac OS X file
+ // system interface is UTF-8 based and sal tries to determine
+ // the file system locale from the locale information
+ strlcat(locale, ".UTF-8", bufferLen - strlen(locale));
+
+ return noErr;
+}
+}
+
+
+
+/*
+ * macxp_OSXConvertCFEncodingToIANACharSetName
+ *
+ * Convert a CoreFoundation text encoding to an IANA charset name.
+ */
+extern "C" int macxp_OSXConvertCFEncodingToIANACharSetName( char *buffer, unsigned int bufferLen, CFStringEncoding cfEncoding )
+{
+ CFStringRef sCFEncodingName;
+
+ sCFEncodingName = CFStringConvertEncodingToIANACharSetName( cfEncoding );
+ CFStringGetCString( sCFEncodingName, buffer, bufferLen, cfEncoding );
+
+ if ( sCFEncodingName )
+ CFRelease( sCFEncodingName );
+
+ return( noErr );
+}
+
diff --git a/sal/osl/unx/pipe.c b/sal/osl/unx/pipe.c
new file mode 100644
index 000000000000..ede4cd7e074f
--- /dev/null
+++ b/sal/osl/unx/pipe.c
@@ -0,0 +1,592 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/pipe.h>
+#include <osl/diagnose.h>
+/*#include <osl/signal.h>*/
+#include <osl/thread.h>
+#include <osl/interlck.h>
+
+#include "sockimpl.h"
+
+#define PIPEDEFAULTPATH "/tmp"
+#define PIPEALTERNATEPATH "/var/tmp"
+
+#define PIPENAMEMASK "OSL_PIPE_%s"
+#define SECPIPENAMEMASK "OSL_PIPE_%s_%s"
+
+sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax);
+oslPipe SAL_CALL osl_psz_createPipe(const sal_Char *pszPipeName, oslPipeOptions Options, oslSecurity Security);
+
+/*#define DEBUG_OSL_PIPE*/
+/*#define TRACE_OSL_PIPE*/
+
+
+/*****************************************************************************/
+/* enum oslPipeError */
+/*****************************************************************************/
+
+static struct
+{
+ int errcode;
+ oslPipeError error;
+} PipeError[]= {
+ { 0, osl_Pipe_E_None }, /* no error */
+ { EPROTOTYPE, osl_Pipe_E_NoProtocol }, /* Protocol wrong type for socket */
+ { ENOPROTOOPT, osl_Pipe_E_NoProtocol }, /* Protocol not available */
+ { EPROTONOSUPPORT, osl_Pipe_E_NoProtocol }, /* Protocol not supported */
+ { ESOCKTNOSUPPORT, osl_Pipe_E_NoProtocol }, /* Socket type not supported */
+ { EPFNOSUPPORT, osl_Pipe_E_NoProtocol }, /* Protocol family not supported */
+ { EAFNOSUPPORT, osl_Pipe_E_NoProtocol }, /* Address family not supported by */
+ /* protocol family */
+ { ENETRESET, osl_Pipe_E_NetworkReset }, /* Network dropped connection because */
+ /* of reset */
+ { ECONNABORTED, osl_Pipe_E_ConnectionAbort }, /* Software caused connection abort */
+ { ECONNRESET, osl_Pipe_E_ConnectionReset }, /* Connection reset by peer */
+ { ENOBUFS, osl_Pipe_E_NoBufferSpace }, /* No buffer space available */
+ { ETIMEDOUT, osl_Pipe_E_TimedOut }, /* Connection timed out */
+ { ECONNREFUSED, osl_Pipe_E_ConnectionRefused }, /* Connection refused */
+ { -1, osl_Pipe_E_invalidError }
+};
+
+
+/* map */
+/* mfe: NOT USED
+ static int osl_NativeFromPipeError(oslPipeError errorCode)
+ {
+ int i = 0;
+
+ while ((PipeError[i].error != osl_Pipe_E_invalidError) &&
+ (PipeError[i].error != errorCode)) i++;
+
+ return PipeError[i].errcode;
+
+ }
+*/
+
+/* reverse map */
+static oslPipeError osl_PipeErrorFromNative(int nativeType)
+{
+ int i = 0;
+
+ while ((PipeError[i].error != osl_Pipe_E_invalidError) &&
+ (PipeError[i].errcode != nativeType)) i++;
+
+ return PipeError[i].error;
+}
+
+
+/* macros */
+#define ERROR_TO_NATIVE(x) osl_NativeFromPipeError(x)
+#define ERROR_FROM_NATIVE(y) osl_PipeErrorFromNative(y)
+
+
+/*****************************************************************************/
+/* osl_create/destroy-PipeImpl */
+/*****************************************************************************/
+
+oslPipe __osl_createPipeImpl()
+{
+ oslPipe pPipeImpl;
+
+ pPipeImpl = (oslPipe)calloc(1, sizeof(struct oslPipeImpl));
+ pPipeImpl->m_nRefCount =1;
+ pPipeImpl->m_bClosed = sal_False;
+#if defined(LINUX)
+ pPipeImpl->m_bIsInShutdown = sal_False;
+ pPipeImpl->m_bIsAccepting = sal_False;
+#endif
+ return pPipeImpl;
+}
+
+void __osl_destroyPipeImpl(oslPipe pImpl)
+{
+ if (pImpl != NULL)
+ free(pImpl);
+}
+
+
+/*****************************************************************************/
+/* osl_createPipe */
+/*****************************************************************************/
+oslPipe SAL_CALL osl_createPipe(rtl_uString *ustrPipeName, oslPipeOptions Options, oslSecurity Security)
+{
+ oslPipe pPipe=0;
+ rtl_String* strPipeName=0;
+ sal_Char* pszPipeName=0;
+
+ if ( ustrPipeName != 0 )
+ {
+ rtl_uString2String( &strPipeName,
+ rtl_uString_getStr(ustrPipeName),
+ rtl_uString_getLength(ustrPipeName),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszPipeName = rtl_string_getStr(strPipeName);
+ pPipe = osl_psz_createPipe(pszPipeName, Options, Security);
+
+ if ( strPipeName != 0 )
+ {
+ rtl_string_release(strPipeName);
+ }
+ }
+
+ return pPipe;
+
+}
+
+oslPipe SAL_CALL osl_psz_createPipe(const sal_Char *pszPipeName, oslPipeOptions Options,
+ oslSecurity Security)
+{
+ int Flags;
+ size_t len;
+ struct sockaddr_un addr;
+
+ sal_Char name[PATH_MAX + 1];
+ oslPipe pPipe;
+
+ if (access(PIPEDEFAULTPATH, R_OK|W_OK) == 0)
+ {
+ strncpy(name, PIPEDEFAULTPATH, sizeof(name));
+ }
+ else
+ {
+ strncpy(name, PIPEALTERNATEPATH, sizeof(name));
+ }
+
+
+ strncat(name, "/", sizeof(name));
+
+ if (Security)
+ {
+ sal_Char Ident[256];
+
+ Ident[0] = '\0';
+
+ OSL_VERIFY(osl_psz_getUserIdent(Security, Ident, sizeof(Ident)));
+
+ snprintf(&name[strlen(name)], sizeof(name), SECPIPENAMEMASK, Ident, pszPipeName);
+ }
+ else
+ {
+ snprintf(&name[strlen(name)], sizeof(name), PIPENAMEMASK, pszPipeName);
+ }
+
+
+ /* alloc memory */
+ pPipe= __osl_createPipeImpl();
+
+ /* create socket */
+ pPipe->m_Socket = socket(AF_UNIX, SOCK_STREAM, 0);
+ if ( pPipe->m_Socket < 0 )
+ {
+ OSL_TRACE("osl_createPipe socket failed. Errno: %d; %s\n",errno, strerror(errno));
+ __osl_destroyPipeImpl(pPipe);
+ return NULL;
+ }
+
+/* OSL_TRACE("osl_createPipe : new Pipe on fd %i\n",pPipe->m_Socket);*/
+
+ /* set close-on-exec flag */
+ if ((Flags = fcntl(pPipe->m_Socket, F_GETFD, 0)) != -1)
+ {
+ Flags |= FD_CLOEXEC;
+ if (fcntl(pPipe->m_Socket, F_SETFD, Flags) == -1)
+ {
+ OSL_TRACE("osl_createPipe failed changing socket flags. Errno: %d; %s\n",errno,strerror(errno));
+ }
+ }
+
+ memset(&addr, 0, sizeof(addr));
+
+ OSL_TRACE("osl_createPipe : Pipe Name '%s'",name);
+
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, name, sizeof(addr.sun_path));
+#if defined(FREEBSD)
+ len = SUN_LEN(&addr);
+#else
+ len = sizeof(addr);
+#endif
+
+ if ( Options & osl_Pipe_CREATE )
+ {
+ struct stat status;
+
+ /* check if there exists an orphan filesystem entry */
+ if ( ( stat(name, &status) == 0) &&
+ ( S_ISSOCK(status.st_mode) || S_ISFIFO(status.st_mode) ) )
+ {
+ if ( connect(pPipe->m_Socket,(struct sockaddr *)&addr,len) >= 0 )
+ {
+ OSL_TRACE("osl_createPipe : Pipe already in use. Errno: %d; %s\n",errno,strerror(errno));
+ close (pPipe->m_Socket);
+ __osl_destroyPipeImpl(pPipe);
+ return NULL;
+ }
+
+ unlink(name);
+ }
+
+ /* ok, fs clean */
+ if ( bind(pPipe->m_Socket, (struct sockaddr *)&addr, len) < 0 )
+ {
+ OSL_TRACE("osl_createPipe : failed to bind socket. Errno: %d; %s\n",errno,strerror(errno));
+ close (pPipe->m_Socket);
+ __osl_destroyPipeImpl(pPipe);
+ return NULL;
+ }
+
+ /* Only give access to all if no security handle was specified, otherwise security
+ depends on umask */
+
+ if ( !Security )
+ chmod(name,S_IRWXU | S_IRWXG |S_IRWXO);
+
+
+ strncpy(pPipe->m_Name, name, sizeof(pPipe->m_Name));
+
+ if ( listen(pPipe->m_Socket, 5) < 0 )
+ {
+ OSL_TRACE("osl_createPipe failed to listen. Errno: %d; %s\n",errno,strerror(errno));
+ unlink(name); /* remove filesystem entry */
+ close (pPipe->m_Socket);
+ __osl_destroyPipeImpl(pPipe);
+ return NULL;
+ }
+
+ return (pPipe);
+ }
+ else
+ { /* osl_pipe_OPEN */
+ if ( access(name, F_OK) != -1 )
+ {
+ if ( connect( pPipe->m_Socket, (struct sockaddr *)&addr, len) >= 0 )
+ {
+ return (pPipe);
+ }
+
+ OSL_TRACE("osl_createPipe failed to connect. Errno: %d; %s\n",errno,strerror(errno));
+ }
+
+ close (pPipe->m_Socket);
+ __osl_destroyPipeImpl(pPipe);
+ return NULL;
+ }
+}
+
+void SAL_CALL osl_acquirePipe( oslPipe pPipe )
+{
+ osl_incrementInterlockedCount( &(pPipe->m_nRefCount) );
+}
+
+void SAL_CALL osl_releasePipe( oslPipe pPipe )
+{
+
+ if( 0 == pPipe )
+ return;
+
+ if( 0 == osl_decrementInterlockedCount( &(pPipe->m_nRefCount) ) )
+ {
+ if( ! pPipe->m_bClosed )
+ osl_closePipe( pPipe );
+
+ __osl_destroyPipeImpl( pPipe );
+ }
+}
+
+void SAL_CALL osl_closePipe( oslPipe pPipe )
+{
+ int nRet;
+#if defined(LINUX)
+ size_t len;
+ struct sockaddr_un addr;
+ int fd;
+#endif
+ int ConnFD;
+
+ if( ! pPipe )
+ {
+ return;
+ }
+
+ if( pPipe->m_bClosed )
+ {
+ return;
+ }
+
+ ConnFD = pPipe->m_Socket;
+
+ /*
+ Thread does not return from accept on linux, so
+ connect to the accepting pipe
+ */
+#if defined(LINUX)
+ if ( pPipe->m_bIsAccepting )
+ {
+ pPipe->m_bIsInShutdown = sal_True;
+ pPipe->m_Socket = -1;
+ fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ memset(&addr, 0, sizeof(addr));
+
+ OSL_TRACE("osl_destroyPipe : Pipe Name '%s'",pPipe->m_Name);
+
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, pPipe->m_Name, sizeof(addr.sun_path));
+ len = sizeof(addr);
+
+ nRet = connect( fd, (struct sockaddr *)&addr, len);
+#if OSL_DEBUG_LEVEL > 1
+ if ( nRet < 0 )
+ {
+ perror("connect in osl_destroyPipe");
+ }
+#endif /* OSL_DEBUG_LEVEL */
+ close(fd);
+ }
+#endif /* LINUX */
+
+
+ nRet = shutdown(ConnFD, 2);
+ if ( nRet < 0 )
+ {
+ OSL_TRACE("shutdown in destroyPipe failed : '%s'\n",strerror(errno));
+ }
+
+ nRet = close(ConnFD);
+ if ( nRet < 0 )
+ {
+ OSL_TRACE("close in destroyPipe failed : '%s'\n",strerror(errno));
+ }
+ /* remove filesystem entry */
+ if ( strlen(pPipe->m_Name) > 0 )
+ {
+ unlink(pPipe->m_Name);
+ }
+ pPipe->m_bClosed = sal_True;
+
+/* OSL_TRACE("Out osl_destroyPipe"); */
+}
+
+
+/*****************************************************************************/
+/* osl_acceptPipe */
+/*****************************************************************************/
+oslPipe SAL_CALL osl_acceptPipe(oslPipe pPipe)
+{
+ int s, flags;
+ oslPipe pAcceptedPipe;
+
+ OSL_ASSERT(pPipe);
+ if ( pPipe == 0 )
+ {
+ return NULL;
+ }
+
+ OSL_ASSERT(strlen(pPipe->m_Name) > 0);
+
+#if defined(LINUX)
+ pPipe->m_bIsAccepting = sal_True;
+#endif
+
+ s = accept(pPipe->m_Socket, NULL, NULL);
+
+#if defined(LINUX)
+ pPipe->m_bIsAccepting = sal_False;
+#endif
+
+ if (s < 0)
+ {
+ OSL_TRACE("osl_acceptPipe : accept error '%s'", strerror(errno));
+ return NULL;
+ }
+
+#if defined(LINUX)
+ if ( pPipe->m_bIsInShutdown )
+ {
+ close(s);
+ return NULL;
+ }
+#endif /* LINUX */
+ else
+ {
+ /* alloc memory */
+ pAcceptedPipe= __osl_createPipeImpl();
+
+ OSL_ASSERT(pAcceptedPipe);
+ if(pAcceptedPipe==NULL)
+ {
+ close(s);
+ return NULL;
+ }
+
+ /* set close-on-exec flag */
+ if (!((flags = fcntl(s, F_GETFD, 0)) < 0))
+ {
+ flags |= FD_CLOEXEC;
+ if (fcntl(s, F_SETFD, flags) < 0)
+ {
+ OSL_TRACE("osl_acceptPipe: error changing socket flags. "
+ "Errno: %d; %s",errno,strerror(errno));
+ }
+ }
+
+ pAcceptedPipe->m_Socket = s;
+ }
+
+ return pAcceptedPipe;
+}
+
+/*****************************************************************************/
+/* osl_receivePipe */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receivePipe(oslPipe pPipe,
+ void* pBuffer,
+ sal_Int32 BytesToRead)
+{
+ int nRet = 0;
+
+ OSL_ASSERT(pPipe);
+
+ if ( pPipe == 0 )
+ {
+ OSL_TRACE("osl_receivePipe : Invalid socket");
+ errno=EINVAL;
+ return -1;
+ }
+
+ nRet = recv(pPipe->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToRead, 0);
+
+ if ( nRet <= 0 )
+ {
+ OSL_TRACE("osl_receivePipe failed : %i '%s'",nRet,strerror(errno));
+ }
+
+ return nRet;
+}
+
+
+/*****************************************************************************/
+/* osl_sendPipe */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendPipe(oslPipe pPipe,
+ const void* pBuffer,
+ sal_Int32 BytesToSend)
+{
+ int nRet=0;
+
+ OSL_ASSERT(pPipe);
+
+ if ( pPipe == 0 )
+ {
+ OSL_TRACE("osl_sendPipe : Invalid socket");
+ errno=EINVAL;
+ return -1;
+ }
+
+ nRet = send(pPipe->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToSend, 0);
+
+
+ if ( nRet <= 0 )
+ {
+ OSL_TRACE("osl_sendPipe failed : %i '%s'",nRet,strerror(errno));
+ }
+
+ return nRet;
+}
+
+
+/*****************************************************************************/
+/* osl_getLastPipeError */
+/*****************************************************************************/
+oslPipeError SAL_CALL osl_getLastPipeError(oslPipe pPipe)
+{
+ (void) pPipe; /* unused */
+ return ERROR_FROM_NATIVE(errno);
+}
+
+
+sal_Int32 SAL_CALL osl_writePipe( oslPipe pPipe, const void *pBuffer , sal_Int32 n )
+{
+ /* loop until all desired bytes were send or an error occured */
+ sal_Int32 BytesSend= 0;
+ sal_Int32 BytesToSend= n;
+
+ OSL_ASSERT(pPipe);
+ while (BytesToSend > 0)
+ {
+ sal_Int32 RetVal;
+
+ RetVal= osl_sendPipe(pPipe, pBuffer, BytesToSend);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToSend -= RetVal;
+ BytesSend += RetVal;
+ pBuffer= (sal_Char*)pBuffer + RetVal;
+ }
+
+ return BytesSend;
+}
+
+sal_Int32 SAL_CALL osl_readPipe( oslPipe pPipe, void *pBuffer , sal_Int32 n )
+{
+ /* loop until all desired bytes were read or an error occured */
+ sal_Int32 BytesRead= 0;
+ sal_Int32 BytesToRead= n;
+
+ OSL_ASSERT( pPipe );
+ while (BytesToRead > 0)
+ {
+ sal_Int32 RetVal;
+ RetVal= osl_receivePipe(pPipe, pBuffer, BytesToRead);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToRead -= RetVal;
+ BytesRead += RetVal;
+ pBuffer= (sal_Char*)pBuffer + RetVal;
+ }
+ return BytesRead;
+}
+
+
diff --git a/sal/osl/unx/process.c b/sal/osl/unx/process.c
new file mode 100644
index 000000000000..300a1446e81a
--- /dev/null
+++ b/sal/osl/unx/process.c
@@ -0,0 +1,1536 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+/*
+ * ToDo:
+ * - cleanup of process status things
+ * - cleanup of process spawning
+ * - cleanup of resource transfer
+ */
+
+#if defined(SOLARIS)
+ // The procfs may only be used without LFS in 32bits.
+# ifdef _FILE_OFFSET_BITS
+# undef _FILE_OFFSET_BITS
+# endif
+#endif
+
+
+#ifdef FREEBSD
+#include <machine/param.h>
+#endif
+
+#include "system.h"
+#if defined(SOLARIS)
+# include <sys/procfs.h>
+#endif
+#include <osl/diagnose.h>
+#include <osl/mutex.h>
+
+#ifndef _OSL_CONDITN_H_
+#include <osl/conditn.h>
+#endif
+#include <osl/thread.h>
+#include <osl/file.h>
+#include <osl/signal.h>
+#include <rtl/alloc.h>
+
+#include <grp.h>
+
+#include "procimpl.h"
+#include "sockimpl.h"
+#include "secimpl.h"
+
+
+#define MAX_ARGS 255
+#define MAX_ENVS 255
+
+#if defined(MACOSX) || defined(IORESOURCE_TRANSFER_BSD)
+#define CONTROLLEN (sizeof(struct cmsghdr) + sizeof(int))
+#endif
+
+/* implemented in file.c */
+extern oslFileError FileURLToPath( char *, size_t, rtl_uString* );
+extern oslFileHandle osl_createFileHandleFromFD( int fd );
+
+/******************************************************************************
+ *
+ * Data Type Definition
+ *
+ ******************************************************************************/
+
+typedef struct {
+ int m_hPipe;
+ int m_hConn;
+ sal_Char m_Name[PATH_MAX + 1];
+} Pipe;
+
+typedef struct {
+ const sal_Char* m_pszArgs[MAX_ARGS + 1];
+ oslProcessOption m_options;
+ const sal_Char* m_pszDir;
+ sal_Char* m_pszEnv[MAX_ENVS + 1];
+ uid_t m_uid;
+ gid_t m_gid;
+ sal_Char* m_name;
+ oslCondition m_started;
+ oslProcessImpl* m_pProcImpl;
+ oslFileHandle *m_pInputWrite;
+ oslFileHandle *m_pOutputRead;
+ oslFileHandle *m_pErrorRead;
+} ProcessData;
+
+typedef struct _oslPipeImpl {
+ int m_Socket;
+ sal_Char m_Name[PATH_MAX + 1];
+} oslPipeImpl;
+
+
+/******************************************************************************
+ *
+ * Function Declarations
+ *
+ *****************************************************************************/
+
+oslProcessError SAL_CALL osl_psz_executeProcess(sal_Char *pszImageName,
+ sal_Char *pszArguments[],
+ oslProcessOption Options,
+ oslSecurity Security,
+ sal_Char *pszDirectory,
+ sal_Char *pszEnvironments[],
+ oslProcess *pProcess,
+ oslFileHandle *pInputWrite,
+ oslFileHandle *pOutputRead,
+ oslFileHandle *pErrorRead );
+
+
+oslProcessError SAL_CALL osl_searchPath_impl(
+ const sal_Char* pszName,
+ const sal_Char* pszPath,
+ sal_Char Separator,
+ sal_Char *pszBuffer,
+ sal_uInt32 Max);
+
+
+sal_Bool osl_getFullPath(const sal_Char* pszFilename, sal_Char* pszPath, sal_uInt32 MaxLen);
+
+static oslProcessImpl* ChildList;
+static oslMutex ChildListMutex;
+
+/******************************************************************************
+ Deprecated
+ Old and buggy implementation of osl_searchPath used only by
+ osl_psz_executeProcess.
+ A new implemenation is in file_path_helper.cxx
+ *****************************************************************************/
+
+oslProcessError SAL_CALL osl_searchPath_impl(const sal_Char* pszName, const sal_Char* pszPath,
+ sal_Char Separator, sal_Char *pszBuffer, sal_uInt32 Max)
+{
+ sal_Char path[PATH_MAX + 1];
+ sal_Char *pchr;
+
+ path[0] = '\0';
+
+ OSL_ASSERT(pszName != NULL);
+
+ if ( pszName == 0 )
+ {
+ return osl_Process_E_NotFound;
+ }
+
+ if (pszPath == NULL)
+ pszPath = "PATH";
+
+ if (Separator == '\0')
+ Separator = ':';
+
+
+ if ( (pchr = getenv(pszPath)) != 0 )
+ {
+ sal_Char *pstr;
+
+ while (*pchr != '\0')
+ {
+ pstr = path;
+
+ while ((*pchr != '\0') && (*pchr != Separator))
+ *pstr++ = *pchr++;
+
+ if ((pstr > path) && ((*(pstr - 1) != '/')))
+ *pstr++ = '/';
+
+ *pstr = '\0';
+
+ strcat(path, pszName);
+
+ if (access(path, 0) == 0)
+ {
+ char szRealPathBuf[PATH_MAX] = "";
+
+ if( NULL == realpath(path, szRealPathBuf) || (strlen(szRealPathBuf) >= (sal_uInt32)Max))
+ return osl_Process_E_Unknown;
+
+ strcpy(pszBuffer, path);
+
+ return osl_Process_E_None;
+ }
+
+ if (*pchr == Separator)
+ pchr++;
+ }
+ }
+
+ return osl_Process_E_NotFound;
+}
+
+/******************************************************************************
+ *
+ * New io resource transfer functions
+ *
+ *****************************************************************************/
+
+
+/**********************************************
+ sendFdPipe
+ *********************************************/
+
+static sal_Bool sendFdPipe(int PipeFD, int SocketFD)
+{
+ sal_Bool bRet = sal_False;
+
+ struct iovec iov[1];
+ struct msghdr msg;
+ char buf[2]; /* send_fd()/recv_fd() 2-byte protocol */
+ int nSend;
+ int RetCode=0;
+
+#if defined(IOCHANNEL_TRANSFER_BSD)
+
+ OSL_TRACE("IOCHANNEL_TRANSFER_BSD send");
+/* OSL_TRACE("sending fd %i\n",SocketFD); */
+
+ iov[0].iov_base = buf;
+ iov[0].iov_len = sizeof(buf);
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+
+ msg.msg_accrights = (caddr_t) &SocketFD; /* addr of descriptor */
+ msg.msg_accrightslen = sizeof(int); /* pass 1 descriptor */
+ buf[1] = 0; /* zero status means OK */
+ buf[0] = 0; /* null byte flag to recv_fd() */
+
+#else
+
+ struct cmsghdr* cmptr = (struct cmsghdr*)malloc(CONTROLLEN);
+
+ OSL_TRACE("!!!!!! IOCHANNEL_TRANSFER_BSD_RENO send");
+/* OSL_TRACE("sending fd %i\n",SocketFD); */
+
+ iov[0].iov_base = buf;
+ iov[0].iov_len = sizeof(buf);
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+ msg.msg_control = (caddr_t) cmptr;
+ msg.msg_controllen = CONTROLLEN;
+
+ cmptr->cmsg_level = SOL_SOCKET;
+ cmptr->cmsg_type = SCM_RIGHTS;
+ cmptr->cmsg_len = CONTROLLEN;
+ memcpy(CMSG_DATA(cmptr), &SocketFD, sizeof(int));
+
+#endif
+
+ if ( ( nSend = sendmsg(PipeFD, &msg, 0) ) > 0 )
+ {
+ bRet = sal_True;
+ OSL_TRACE("sendFdPipe : send '%i' bytes\n",nSend);
+
+ }
+ else
+ {
+ OSL_TRACE("sendFdPipe : sending failed (%s)",strerror(errno));
+ }
+
+ nSend=read(PipeFD,&RetCode,sizeof(RetCode));
+
+ if ( nSend > 0 && RetCode == 1 )
+ {
+ OSL_TRACE("sendFdPipe : resource was received\n");
+ }
+ else
+ {
+ OSL_TRACE("sendFdPipe : resource wasn't received\n");
+ }
+
+#if defined(IOCHANNEL_TRANSFER_BSD_RENO)
+ free(cmptr);
+#endif
+
+ return bRet;
+}
+
+/**********************************************
+ receiveFdPipe
+ *********************************************/
+
+static oslSocket receiveFdPipe(int PipeFD)
+{
+ oslSocket pSocket = 0;
+ struct msghdr msghdr;
+ struct iovec iov[1];
+ char buffer[2];
+ sal_Int32 nRead;
+ int newfd=-1;
+ int nRetCode=0;
+/* char *ptr; */
+
+#if defined(IOCHANNEL_TRANSFER_BSD)
+
+ OSL_TRACE("IOCHANNEL_TRANSFER_BSD receive\n");
+
+ iov[0].iov_base = buffer;
+ iov[0].iov_len = sizeof(buffer);
+ msghdr.msg_name = NULL;
+ msghdr.msg_namelen = 0;
+ msghdr.msg_iov = iov;
+ msghdr.msg_iovlen = 1;
+ msghdr.msg_accrights = (caddr_t) &newfd; /* addr of descriptor */
+ msghdr.msg_accrightslen = sizeof(int); /* receive 1 descriptor */
+
+#else
+ struct cmsghdr* cmptr = (struct cmsghdr*)malloc(CONTROLLEN);
+
+ OSL_TRACE(" !!!! IOCHANNEL_TRANSFER_BSD_RENO receive");
+
+ iov[0].iov_base = buffer;
+ iov[0].iov_len = sizeof(buffer);
+ msghdr.msg_name = NULL;
+ msghdr.msg_namelen = 0;
+ msghdr.msg_iov = iov;
+ msghdr.msg_iovlen = 1;
+
+ msghdr.msg_control = (caddr_t) cmptr;
+ msghdr.msg_controllen = CONTROLLEN;
+
+#endif
+
+
+#if defined(IOCHANNEL_TRANSFER_BSD)
+
+ if ( ( nRead = recvmsg(PipeFD, &msghdr, 0) ) > 0 )
+ {
+ OSL_TRACE("receiveFdPipe : received '%i' bytes\n",nRead);
+ }
+#else
+
+ if ( ( ( nRead = recvmsg(PipeFD, &msghdr, 0) ) > 0 ) &&
+ ( msghdr.msg_controllen == CONTROLLEN ) )
+ {
+ OSL_TRACE("receiveFdPipe : received '%i' bytes\n",nRead);
+ memcpy(&newfd, CMSG_DATA(cmptr), sizeof(int));
+ }
+#endif
+ else
+ {
+ OSL_TRACE("receiveFdPipe : receiving failed (%s)",strerror(errno));
+ }
+
+ if ( newfd >= 0 )
+ {
+ pSocket = __osl_createSocketImpl(newfd);
+ nRetCode=1;
+ OSL_TRACE("received fd %i\n",newfd);
+ }
+
+ OSL_TRACE("receiveFdPipe : writing back %i",nRetCode);
+ nRead=write(PipeFD,&nRetCode,sizeof(nRetCode));
+
+#if defined(IOCHANNEL_TRANSFER_BSD_RENO)
+ free(cmptr);
+#endif
+
+ return pSocket;
+}
+
+/**********************************************
+ osl_sendResourcePipe
+ *********************************************/
+
+sal_Bool osl_sendResourcePipe(oslPipe pPipe, oslSocket pSocket)
+{
+ sal_Bool bRet = sal_False;
+
+ if ( pSocket == 0 || pPipe == 0 )
+ {
+ return sal_False;
+ }
+
+ bRet = sendFdPipe(pPipe->m_Socket,pSocket->m_Socket);
+
+ return bRet;
+}
+
+/**********************************************
+ osl_receiveResourcePipe
+ *********************************************/
+
+oslSocket osl_receiveResourcePipe(oslPipe pPipe)
+{
+ oslSocket pSocket=0;
+
+ if ( pPipe == 0 )
+ {
+ return 0;
+ }
+
+ pSocket = receiveFdPipe(pPipe->m_Socket);
+
+ return (oslSocket) pSocket;
+}
+
+
+
+/******************************************************************************
+ *
+ * Functions for starting a process
+ *
+ *****************************************************************************/
+
+static void ChildStatusProc(void *pData)
+{
+ pid_t pid = -1;
+ int status = 0;
+ int channel[2];
+ ProcessData data;
+ ProcessData *pdata;
+ int stdOutput[2] = { -1, -1 }, stdInput[2] = { -1, -1 }, stdError[2] = { -1, -1 };
+
+ pdata = (ProcessData *)pData;
+
+ /* make a copy of our data, because forking will only copy
+ our local stack of the thread, so the process data will not be accessible
+ in our child process */
+ memcpy(&data, pData, sizeof(data));
+
+ if (socketpair(AF_UNIX, SOCK_STREAM, 0, channel) == -1)
+ status = errno;
+
+ fcntl(channel[0], F_SETFD, FD_CLOEXEC);
+ fcntl(channel[1], F_SETFD, FD_CLOEXEC);
+
+ /* Create redirected IO pipes */
+ if ( status == 0 && data.m_pInputWrite )
+ if (pipe( stdInput ) == -1)
+ status = errno;
+
+ if ( status == 0 && data.m_pOutputRead )
+ if (pipe( stdOutput ) == -1)
+ status = errno;
+
+ if ( status == 0 && data.m_pErrorRead )
+ if (pipe( stdError ) == -1)
+ status = errno;
+
+ if ( (status == 0) && ((pid = fork()) == 0) )
+ {
+ /* Child */
+ int chstatus = 0;
+ sal_Int32 nWrote;
+
+ if (channel[0] != -1) close(channel[0]);
+
+ if ((data.m_uid != (uid_t)-1) && ((data.m_uid != getuid()) || (data.m_gid != getgid())))
+ {
+ OSL_ASSERT(geteuid() == 0); /* must be root */
+
+ if (! INIT_GROUPS(data.m_name, data.m_gid) || (setuid(data.m_uid) != 0))
+ OSL_TRACE("Failed to change uid and guid, errno=%d (%s)\n", errno, strerror(errno));
+#if defined(LINUX) || defined (FREEBSD)
+ unsetenv("HOME");
+#else
+ putenv("HOME=");
+#endif
+ }
+
+ if (data.m_pszDir)
+ chstatus = chdir(data.m_pszDir);
+
+ if (chstatus == 0 && ((data.m_uid == (uid_t)-1) || ((data.m_uid == getuid()) && (data.m_gid == getgid()))))
+ {
+ int i;
+ for (i = 0; data.m_pszEnv[i] != NULL; i++)
+ {
+ if (strchr(data.m_pszEnv[i], '=') == NULL)
+ {
+ unsetenv(data.m_pszEnv[i]); /*TODO: check error return*/
+ }
+ else
+ {
+ putenv(data.m_pszEnv[i]); /*TODO: check error return*/
+ }
+ }
+
+ OSL_TRACE("ChildStatusProc : starting '%s'",data.m_pszArgs[0]);
+
+ /* Connect std IO to pipe ends */
+
+ /* Write end of stdInput not used in child process */
+ if (stdInput[1] != -1) close( stdInput[1] );
+
+ /* Read end of stdOutput not used in child process */
+ if (stdOutput[0] != -1) close( stdOutput[0] );
+
+ /* Read end of stdError not used in child process */
+ if (stdError[0] != -1) close( stdError[0] );
+
+ /* Redirect pipe ends to std IO */
+
+ if ( stdInput[0] != STDIN_FILENO )
+ {
+ dup2( stdInput[0], STDIN_FILENO );
+ if (stdInput[0] != -1) close( stdInput[0] );
+ }
+
+ if ( stdOutput[1] != STDOUT_FILENO )
+ {
+ dup2( stdOutput[1], STDOUT_FILENO );
+ if (stdOutput[1] != -1) close( stdOutput[1] );
+ }
+
+ if ( stdError[1] != STDERR_FILENO )
+ {
+ dup2( stdError[1], STDERR_FILENO );
+ if (stdError[1] != -1) close( stdError[1] );
+ }
+
+ pid=execv(data.m_pszArgs[0], (sal_Char **)data.m_pszArgs);
+
+ }
+
+ OSL_TRACE("Failed to exec, errno=%d (%s)\n", errno, strerror(errno));
+
+ OSL_TRACE("ChildStatusProc : starting '%s' failed",data.m_pszArgs[0]);
+
+ /* if we reach here, something went wrong */
+ nWrote = write(channel[1], &errno, sizeof(errno));
+ if (nWrote != sizeof(errno))
+ OSL_TRACE("sendFdPipe : sending failed (%s)",strerror(errno));
+
+ if (channel[1] != -1) close(channel[1]);
+
+ _exit(255);
+ }
+ else
+ { /* Parent */
+ int i = -1;
+ if (channel[1] != -1) close(channel[1]);
+
+ /* Close unused pipe ends */
+ if (stdInput[0] != -1) close( stdInput[0] );
+ if (stdOutput[1] != -1) close( stdOutput[1] );
+ if (stdError[1] != -1) close( stdError[1] );
+
+ if (pid > 0)
+ {
+ while (((i = read(channel[0], &status, sizeof(status))) < 0))
+ {
+ if (errno != EINTR)
+ break;
+ }
+ }
+
+ if (channel[0] != -1) close(channel[0]);
+
+ if ((pid > 0) && (i == 0))
+ {
+ pid_t child_pid;
+ osl_acquireMutex(ChildListMutex);
+
+ pdata->m_pProcImpl->m_pid = pid;
+ pdata->m_pProcImpl->m_pnext = ChildList;
+ ChildList = pdata->m_pProcImpl;
+
+ /* Store used pipe ends in data structure */
+
+ if ( pdata->m_pInputWrite )
+ *(pdata->m_pInputWrite) = osl_createFileHandleFromFD( stdInput[1] );
+
+ if ( pdata->m_pOutputRead )
+ *(pdata->m_pOutputRead) = osl_createFileHandleFromFD( stdOutput[0] );
+
+ if ( pdata->m_pErrorRead )
+ *(pdata->m_pErrorRead) = osl_createFileHandleFromFD( stdError[0] );
+
+ osl_releaseMutex(ChildListMutex);
+
+ osl_setCondition(pdata->m_started);
+
+ do
+ {
+ child_pid = waitpid(pid, &status, 0);
+ } while ( 0 > child_pid && EINTR == errno );
+
+ if ( child_pid < 0)
+ {
+ OSL_TRACE("Failed to wait for child process, errno=%d (%s)\n", errno, strerror(errno));
+
+ /*
+ We got an other error than EINTR. Anyway we have to wake up the
+ waiting thread under any circumstances */
+
+ child_pid = pid;
+ }
+
+
+ if ( child_pid > 0 )
+ {
+ oslProcessImpl* pChild;
+
+ osl_acquireMutex(ChildListMutex);
+
+ pChild = ChildList;
+
+ /* check if it is one of our child processes */
+ while (pChild != NULL)
+ {
+ if (pChild->m_pid == child_pid)
+ {
+ if (WIFEXITED(status))
+ pChild->m_status = WEXITSTATUS(status);
+ else
+ pChild->m_status = -1;
+
+ osl_setCondition(pChild->m_terminated);
+ }
+
+ pChild = pChild->m_pnext;
+ }
+
+ osl_releaseMutex(ChildListMutex);
+ }
+ }
+ else
+ {
+ OSL_TRACE("ChildStatusProc : starting '%s' failed",data.m_pszArgs[0]);
+ OSL_TRACE("Failed to launch child process, child reports errno=%d (%s)\n", status, strerror(status));
+
+ /* Close pipe ends */
+ if ( pdata->m_pInputWrite )
+ *pdata->m_pInputWrite = NULL;
+
+ if ( pdata->m_pOutputRead )
+ *pdata->m_pOutputRead = NULL;
+
+ if ( pdata->m_pErrorRead )
+ *pdata->m_pErrorRead = NULL;
+
+ if (stdInput[1] != -1) close( stdInput[1] );
+ if (stdOutput[0] != -1) close( stdOutput[0] );
+ if (stdError[0] != -1) close( stdError[0] );
+
+ //if pid > 0 then a process was created, even if it later failed
+ //e.g. bash searching for a command to execute, and we still
+ //need to clean it up to avoid "defunct" processes
+ if (pid > 0)
+ {
+ pid_t child_pid;
+ do
+ {
+ child_pid = waitpid(pid, &status, 0);
+ } while ( 0 > child_pid && EINTR == errno );
+ }
+
+ /* notify (and unblock) parent thread */
+ osl_setCondition(pdata->m_started);
+ }
+ }
+}
+
+/**********************************************
+ osl_executeProcess_WithRedirectedIO
+ *********************************************/
+
+oslProcessError SAL_CALL osl_executeProcess_WithRedirectedIO(
+ rtl_uString *ustrImageName,
+ rtl_uString *ustrArguments[],
+ sal_uInt32 nArguments,
+ oslProcessOption Options,
+ oslSecurity Security,
+ rtl_uString *ustrWorkDir,
+ rtl_uString *ustrEnvironment[],
+ sal_uInt32 nEnvironmentVars,
+ oslProcess *pProcess,
+ oslFileHandle *pInputWrite,
+ oslFileHandle *pOutputRead,
+ oslFileHandle *pErrorRead
+ )
+{
+
+ oslProcessError Error;
+ sal_Char* pszWorkDir=0;
+ sal_Char** pArguments=0;
+ sal_Char** pEnvironment=0;
+ unsigned int idx;
+
+ char szImagePath[PATH_MAX] = "";
+ char szWorkDir[PATH_MAX] = "";
+
+ if ( ustrImageName && ustrImageName->length )
+ {
+ FileURLToPath( szImagePath, PATH_MAX, ustrImageName );
+ }
+
+ if ( ustrWorkDir != 0 && ustrWorkDir->length )
+ {
+ FileURLToPath( szWorkDir, PATH_MAX, ustrWorkDir );
+ pszWorkDir = szWorkDir;
+ }
+
+ if ( pArguments == 0 && nArguments > 0 )
+ {
+ pArguments = (sal_Char**) malloc( ( nArguments + 2 ) * sizeof(sal_Char*) );
+ }
+
+
+ for ( idx = 0 ; idx < nArguments ; ++idx )
+ {
+ rtl_String* strArg =0;
+
+
+ rtl_uString2String( &strArg,
+ rtl_uString_getStr(ustrArguments[idx]),
+ rtl_uString_getLength(ustrArguments[idx]),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ pArguments[idx]=strdup(rtl_string_getStr(strArg));
+ rtl_string_release(strArg);
+ pArguments[idx+1]=0;
+ }
+
+ for ( idx = 0 ; idx < nEnvironmentVars ; ++idx )
+ {
+ rtl_String* strEnv=0;
+
+ if ( pEnvironment == 0 )
+ {
+ pEnvironment = (sal_Char**) malloc( ( nEnvironmentVars + 2 ) * sizeof(sal_Char*) );
+ }
+
+ rtl_uString2String( &strEnv,
+ rtl_uString_getStr(ustrEnvironment[idx]),
+ rtl_uString_getLength(ustrEnvironment[idx]),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ pEnvironment[idx]=strdup(rtl_string_getStr(strEnv));
+ rtl_string_release(strEnv);
+ pEnvironment[idx+1]=0;
+ }
+
+
+ Error = osl_psz_executeProcess(szImagePath,
+ pArguments,
+ Options,
+ Security,
+ pszWorkDir,
+ pEnvironment,
+ pProcess,
+ pInputWrite,
+ pOutputRead,
+ pErrorRead
+ );
+
+ if ( pArguments != 0 )
+ {
+ for ( idx = 0 ; idx < nArguments ; ++idx )
+ {
+ if ( pArguments[idx] != 0 )
+ {
+ free(pArguments[idx]);
+ }
+ }
+ free(pArguments);
+ }
+
+ if ( pEnvironment != 0 )
+ {
+ for ( idx = 0 ; idx < nEnvironmentVars ; ++idx )
+ {
+ if ( pEnvironment[idx] != 0 )
+ {
+ free(pEnvironment[idx]);
+ }
+ }
+ free(pEnvironment);
+ }
+
+ return Error;
+}
+
+/**********************************************
+ osl_executeProcess
+ *********************************************/
+
+oslProcessError SAL_CALL osl_executeProcess(
+ rtl_uString *ustrImageName,
+ rtl_uString *ustrArguments[],
+ sal_uInt32 nArguments,
+ oslProcessOption Options,
+ oslSecurity Security,
+ rtl_uString *ustrWorkDir,
+ rtl_uString *ustrEnvironment[],
+ sal_uInt32 nEnvironmentVars,
+ oslProcess *pProcess
+ )
+{
+ return osl_executeProcess_WithRedirectedIO(
+ ustrImageName,
+ ustrArguments,
+ nArguments,
+ Options,
+ Security,
+ ustrWorkDir,
+ ustrEnvironment,
+ nEnvironmentVars,
+ pProcess,
+ NULL,
+ NULL,
+ NULL
+ );
+}
+
+/**********************************************
+ osl_psz_executeProcess
+ *********************************************/
+
+oslProcessError SAL_CALL osl_psz_executeProcess(sal_Char *pszImageName,
+ sal_Char *pszArguments[],
+ oslProcessOption Options,
+ oslSecurity Security,
+ sal_Char *pszDirectory,
+ sal_Char *pszEnvironments[],
+ oslProcess *pProcess,
+ oslFileHandle *pInputWrite,
+ oslFileHandle *pOutputRead,
+ oslFileHandle *pErrorRead
+ )
+{
+ int i;
+ sal_Char path[PATH_MAX + 1];
+ ProcessData Data;
+ oslThread hThread;
+
+ path[0] = '\0';
+
+ memset(&Data,0,sizeof(ProcessData));
+ Data.m_pInputWrite = pInputWrite;
+ Data.m_pOutputRead = pOutputRead;
+ Data.m_pErrorRead = pErrorRead;
+
+ if (pszImageName == NULL)
+ pszImageName = pszArguments[0];
+
+ OSL_ASSERT(pszImageName != NULL);
+
+ if ( pszImageName == 0 )
+ {
+ return osl_Process_E_NotFound;
+ }
+
+ if ((Options & osl_Process_SEARCHPATH) &&
+ (osl_searchPath_impl(pszImageName, NULL, '\0', path, sizeof(path)) == osl_Process_E_None))
+ pszImageName = path;
+
+ Data.m_pszArgs[0] = strdup(pszImageName);
+ Data.m_pszArgs[1] = 0;
+
+ if ( pszArguments != 0 )
+ {
+ for (i = 0; ((i + 2) < MAX_ARGS) && (pszArguments[i] != NULL); i++)
+ Data.m_pszArgs[i+1] = strdup(pszArguments[i]);
+ Data.m_pszArgs[i+2] = NULL;
+ }
+
+ Data.m_options = Options;
+ Data.m_pszDir = (pszDirectory != NULL) ? strdup(pszDirectory) : NULL;
+
+ if (pszEnvironments != NULL)
+ {
+ for (i = 0; ((i + 1) < MAX_ENVS) && (pszEnvironments[i] != NULL); i++)
+ Data.m_pszEnv[i] = strdup(pszEnvironments[i]);
+ Data.m_pszEnv[i+1] = NULL;
+ }
+ else
+ Data.m_pszEnv[0] = NULL;
+
+ if (Security != NULL)
+ {
+ Data.m_uid = ((oslSecurityImpl*)Security)->m_pPasswd.pw_uid;
+ Data.m_gid = ((oslSecurityImpl*)Security)->m_pPasswd.pw_gid;
+ Data.m_name = ((oslSecurityImpl*)Security)->m_pPasswd.pw_name;
+ }
+ else
+ Data.m_uid = (uid_t)-1;
+
+ Data.m_pProcImpl = (oslProcessImpl*) malloc(sizeof(oslProcessImpl));
+ Data.m_pProcImpl->m_pid = 0;
+ Data.m_pProcImpl->m_terminated = osl_createCondition();
+ Data.m_pProcImpl->m_pnext = NULL;
+
+ if (ChildListMutex == NULL)
+ ChildListMutex = osl_createMutex();
+
+ Data.m_started = osl_createCondition();
+
+ hThread = osl_createThread(ChildStatusProc, &Data);
+
+ osl_waitCondition(Data.m_started, NULL);
+ osl_destroyCondition(Data.m_started);
+
+ for (i = 0; Data.m_pszArgs[i] != NULL; i++)
+ free((void *)Data.m_pszArgs[i]);
+
+ for (i = 0; Data.m_pszEnv[i] != NULL; i++)
+ free((void *)Data.m_pszEnv[i]);
+
+ if ( Data.m_pszDir != 0 )
+ {
+ free((void *)Data.m_pszDir);
+ }
+
+ osl_destroyThread(hThread);
+
+ if (Data.m_pProcImpl->m_pid != 0)
+ {
+ *pProcess = Data.m_pProcImpl;
+
+ if (Options & osl_Process_WAIT)
+ osl_joinProcess(*pProcess);
+
+ return osl_Process_E_None;
+ }
+
+ osl_destroyCondition(Data.m_pProcImpl->m_terminated);
+ free(Data.m_pProcImpl);
+
+ return osl_Process_E_Unknown;
+}
+
+
+/******************************************************************************
+ *
+ * Functions for processes
+ *
+ *****************************************************************************/
+
+
+/**********************************************
+ osl_terminateProcess
+ *********************************************/
+
+oslProcessError SAL_CALL osl_terminateProcess(oslProcess Process)
+{
+ if (Process == NULL)
+ return osl_Process_E_Unknown;
+
+ if (kill(((oslProcessImpl*)Process)->m_pid, SIGKILL) != 0)
+ {
+ switch (errno)
+ {
+ case EPERM:
+ return osl_Process_E_NoPermission;
+
+ case ESRCH:
+ return osl_Process_E_NotFound;
+
+ default:
+ return osl_Process_E_Unknown;
+ }
+ }
+
+ return osl_Process_E_None;
+}
+
+/**********************************************
+ osl_getProcess
+ *********************************************/
+
+oslProcess SAL_CALL osl_getProcess(oslProcessIdentifier Ident)
+{
+ oslProcessImpl *pProcImpl;
+
+ if (kill(Ident, 0) != -1)
+ {
+ oslProcessImpl* pChild;
+
+ if (ChildListMutex == NULL)
+ ChildListMutex = osl_createMutex();
+
+ osl_acquireMutex(ChildListMutex);
+
+ pChild = ChildList;
+
+ /* check if it is one of our child processes */
+ while (pChild != NULL)
+ {
+ if (Ident == (sal_uInt32) pChild->m_pid)
+ break;
+
+ pChild = pChild->m_pnext;
+ }
+
+ pProcImpl = (oslProcessImpl*) malloc(sizeof(oslProcessImpl));
+ pProcImpl->m_pid = Ident;
+ pProcImpl->m_terminated = osl_createCondition();
+
+ if (pChild != NULL)
+ {
+ /* process is a child so insert into list */
+ pProcImpl->m_pnext = pChild->m_pnext;
+ pChild->m_pnext = pProcImpl;
+
+ pProcImpl->m_status = pChild->m_status;
+
+ if (osl_checkCondition(pChild->m_terminated))
+ osl_setCondition(pProcImpl->m_terminated);
+ }
+ else
+ pProcImpl->m_pnext = NULL;
+
+ osl_releaseMutex(ChildListMutex);
+ }
+ else
+ pProcImpl = NULL;
+
+ return (pProcImpl);
+}
+
+/**********************************************
+ osl_freeProcessHandle
+ *********************************************/
+
+void SAL_CALL osl_freeProcessHandle(oslProcess Process)
+{
+ if (Process != NULL)
+ {
+ oslProcessImpl *pChild, *pPrev = NULL;
+
+ OSL_ASSERT(ChildListMutex != NULL);
+
+ if ( ChildListMutex == 0 )
+ {
+ return;
+ }
+
+ osl_acquireMutex(ChildListMutex);
+
+ pChild = ChildList;
+
+ /* remove process from child list */
+ while (pChild != NULL)
+ {
+ if (pChild == (oslProcessImpl*)Process)
+ {
+ if (pPrev != NULL)
+ pPrev->m_pnext = pChild->m_pnext;
+ else
+ ChildList = pChild->m_pnext;
+
+ break;
+ }
+
+ pPrev = pChild;
+ pChild = pChild->m_pnext;
+ }
+
+ osl_releaseMutex(ChildListMutex);
+
+ osl_destroyCondition(((oslProcessImpl*)Process)->m_terminated);
+
+ free(Process);
+ }
+}
+
+#if defined(LINUX)
+struct osl_procStat
+{
+ /* from 'stat' */
+ pid_t pid; /* pid */
+ char command[16]; /* 'argv[0]' */ /* mfe: it all right char comm[16] in kernel! */
+ char state; /* state (running, stopped, ...) */
+ pid_t ppid; /* parent pid */
+ pid_t pgrp; /* parent group */
+ int session; /* session ID */
+ int tty; /* no of tty */
+ pid_t tpgid; /* group of process owning the tty */
+ unsigned long flags; /* flags dunno */
+ unsigned long minflt; /* minor page faults */
+ unsigned long cminflt; /* minor page faults with children */
+ unsigned long majflt; /* major page faults */
+ unsigned long cmajflt; /* major page faults with children */
+ unsigned long utime; /* no of jiffies in user mode */
+ unsigned long stime; /* no of jiffies in kernel mode */
+ unsigned long cutime; /* no of jiffies in user mode with children */
+ unsigned long cstime; /* no of jiffies in kernel mode with children */
+ unsigned long priority; /* nice value + 15 (kernel scheduling prio)*/
+ long nice; /* nice value */
+ long timeout; /* no of jiffies of next process timeout */
+ long itrealvalue; /* no jiffies before next SIGALRM */
+ unsigned long starttime; /* process started this no of jiffies after boot */
+ unsigned long vsize; /* virtual memory size (in bytes) */
+ long rss; /* resident set size (in pages) */
+ unsigned long rss_rlim; /* rss limit (in bytes) */
+ unsigned long startcode; /* address above program text can run */
+ unsigned long endcode; /* address below program text can run */
+ unsigned long startstack; /* address of start of stack */
+ unsigned long kstkesp; /* current value of 'esp' (stack pointer) */
+ unsigned long kstkeip; /* current value of 'eip' (instruction pointer) */
+ /* mfe: Linux > 2.1.7x have more signals (88) */
+/*#ifdef LINUX */
+ char signal[24]; /* pending signals */
+ char blocked[24]; /* blocked signals */
+ char sigignore[24]; /* ignored signals */
+ char sigcatch[24]; /* catched signals */
+/*#else*/
+/* long long signal;*/
+/* long long blocked;*/
+/* long long sigignore;*/
+/* long long sigcatch;*/
+/*#endif */
+ unsigned long wchan; /* 'channel' the process is waiting in */
+ unsigned long nswap; /* ? */
+ unsigned long cnswap; /* ? */
+
+ /* from 'status' */
+ int ruid; /* real uid */
+ int euid; /* effective uid */
+ int suid; /* saved uid */
+ int fuid; /* file access uid */
+ int rgid; /* real gid */
+ int egid; /* effective gid */
+ int sgid; /* saved gid */
+ int fgid; /* file access gid */
+ unsigned long vm_size; /* like vsize but on kb */
+ unsigned long vm_lock; /* locked pages in kb */
+ unsigned long vm_rss; /* like rss but in kb */
+ unsigned long vm_data; /* data size */
+ unsigned long vm_stack; /* stack size */
+ unsigned long vm_exe; /* executable size */
+ unsigned long vm_lib; /* library size */
+};
+
+/**********************************************
+ osl_getProcStat
+ *********************************************/
+
+sal_Bool osl_getProcStat(pid_t pid, struct osl_procStat* procstat)
+{
+ int fd = 0;
+ sal_Bool bRet = sal_False;
+ char name[PATH_MAX + 1];
+ snprintf(name, sizeof(name), "/proc/%u/stat", pid);
+
+ if ((fd = open(name,O_RDONLY)) >=0 )
+ {
+ char* tmp=0;
+ char prstatbuf[512];
+ memset(prstatbuf,0,512);
+ bRet = read(fd,prstatbuf,511) == 511;
+
+ close(fd);
+ /*printf("%s\n\n",prstatbuf);*/
+
+ if (!bRet)
+ return sal_False;
+
+ tmp = strrchr(prstatbuf, ')');
+ *tmp = '\0';
+ memset(procstat->command, 0, sizeof(procstat->command));
+
+ sscanf(prstatbuf, "%d (%15c", &procstat->pid, procstat->command);
+ sscanf(tmp + 2,
+ "%c"
+ "%i %i %i %i %i"
+ "%lu %lu %lu %lu %lu"
+ "%lu %lu %lu %lu"
+ "%lu %li %li %li"
+ "%lu %lu %li %lu"
+ "%lu %lu %lu %lu %lu"
+ "%s %s %s %s"
+ "%lu %lu %lu",
+ &procstat->state,
+ &procstat->ppid, &procstat->pgrp, &procstat->session, &procstat->tty, &procstat->tpgid,
+ &procstat->flags, &procstat->minflt, &procstat->cminflt, &procstat->majflt, &procstat->cmajflt,
+ &procstat->utime, &procstat->stime, &procstat->cutime, &procstat->cstime,
+ &procstat->priority, &procstat->nice, &procstat->timeout, &procstat->itrealvalue,
+ &procstat->starttime, &procstat->vsize, &procstat->rss, &procstat->rss_rlim,
+ &procstat->startcode, &procstat->endcode, &procstat->startstack, &procstat->kstkesp, &procstat->kstkeip,
+ procstat->signal, procstat->blocked, procstat->sigignore, procstat->sigcatch,
+ &procstat->wchan, &procstat->nswap, &procstat->cnswap
+ );
+ }
+ return bRet;
+}
+
+/**********************************************
+ osl_getProcStatus
+ *********************************************/
+
+sal_Bool osl_getProcStatus(pid_t pid, struct osl_procStat* procstat)
+{
+ int fd = 0;
+ char name[PATH_MAX + 1];
+ snprintf(name, sizeof(name), "/proc/%u/status", pid);
+
+ sal_Bool bRet = sal_False;
+
+ if ((fd = open(name,O_RDONLY)) >=0 )
+ {
+ char* tmp=0;
+ char prstatusbuf[512];
+ memset(prstatusbuf,0,512);
+ bRet = read(fd,prstatusbuf,511) == 511;
+
+ close(fd);
+
+ /* printf("\n\n%s\n\n",prstatusbuf);*/
+
+ if (!bRet)
+ return sal_False;
+
+ tmp = strstr(prstatusbuf,"Uid:");
+ if(tmp)
+ {
+ sscanf(tmp,"Uid:\t%d\t%d\t%d\t%d",
+ &procstat->ruid, &procstat->euid, &procstat->suid, &procstat->fuid
+ );
+ }
+
+
+ tmp = strstr(prstatusbuf,"Gid:");
+ if(tmp)
+ {
+ sscanf(tmp,"Gid:\t%d\t%d\t%d\t%d",
+ &procstat->rgid, &procstat->egid, &procstat->sgid, &procstat->fgid
+ );
+ }
+
+ tmp = strstr(prstatusbuf,"VmSize:");
+ if(tmp)
+ {
+ sscanf(tmp,
+ "VmSize: %lu kB\n"
+ "VmLck: %lu kB\n"
+ "VmRSS: %lu kB\n"
+ "VmData: %lu kB\n"
+ "VmStk: %lu kB\n"
+ "VmExe: %lu kB\n"
+ "VmLib: %lu kB\n",
+ &procstat->vm_size, &procstat->vm_lock, &procstat->vm_rss, &procstat->vm_data,
+ &procstat->vm_stack, &procstat->vm_exe, &procstat->vm_lib
+ );
+ }
+
+ tmp = strstr(prstatusbuf,"SigPnd:");
+ if(tmp)
+ {
+ sscanf(tmp, "SigPnd: %s SigBlk: %s SigIgn: %s %*s %s",
+ procstat->signal, procstat->blocked, procstat->sigignore, procstat->sigcatch
+ );
+ }
+ }
+ return bRet;
+}
+
+#endif
+
+/**********************************************
+ osl_getProcessInfo
+ *********************************************/
+
+oslProcessError SAL_CALL osl_getProcessInfo(oslProcess Process, oslProcessData Fields, oslProcessInfo* pInfo)
+{
+ pid_t pid;
+
+ if (Process == NULL)
+ pid = getpid();
+ else
+ pid = ((oslProcessImpl*)Process)->m_pid;
+
+ if (! pInfo || (pInfo->Size != sizeof(oslProcessInfo)))
+ return osl_Process_E_Unknown;
+
+ pInfo->Fields = 0;
+
+ if (Fields & osl_Process_IDENTIFIER)
+ {
+ pInfo->Ident = pid;
+ pInfo->Fields |= osl_Process_IDENTIFIER;
+ }
+
+ if (Fields & osl_Process_EXITCODE)
+ {
+ if ((Process != NULL) &&
+ osl_checkCondition(((oslProcessImpl*)Process)->m_terminated))
+ {
+ pInfo->Code = ((oslProcessImpl*)Process)->m_status;
+ pInfo->Fields |= osl_Process_EXITCODE;
+ }
+ }
+
+ if (Fields & (osl_Process_HEAPUSAGE | osl_Process_CPUTIMES))
+ {
+
+#if defined(SOLARIS)
+
+ int fd;
+ sal_Char name[PATH_MAX + 1];
+
+ snprintf(name, sizeof(name), "/proc/%u", pid);
+
+ if ((fd = open(name, O_RDONLY)) >= 0)
+ {
+ prstatus_t prstatus;
+
+ if (ioctl(fd, PIOCSTATUS, &prstatus) >= 0)
+ {
+ if (Fields & osl_Process_CPUTIMES)
+ {
+ pInfo->UserTime.Seconds = prstatus.pr_utime.tv_sec;
+ pInfo->UserTime.Nanosec = prstatus.pr_utime.tv_nsec;
+ pInfo->SystemTime.Seconds = prstatus.pr_stime.tv_sec;
+ pInfo->SystemTime.Nanosec = prstatus.pr_stime.tv_nsec;
+
+ pInfo->Fields |= osl_Process_CPUTIMES;
+ }
+
+ if (Fields & osl_Process_HEAPUSAGE)
+ {
+ pInfo->HeapUsage = prstatus.pr_brksize;
+
+ pInfo->Fields |= osl_Process_HEAPUSAGE;
+ }
+
+ close(fd);
+
+ return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown;
+ }
+ else
+ close(fd);
+ }
+
+#elif defined(HPUX)
+
+ struct pst_status prstatus;
+
+ if (pstat_getproc(&prstatus, sizeof(prstatus), (size_t)0, pid) == 1)
+ {
+ if (Fields & osl_Process_CPUTIMES)
+ {
+ pInfo->UserTime.Seconds = prstatus.pst_utime;
+ pInfo->UserTime.Nanosec = 500000L;
+ pInfo->SystemTime.Seconds = prstatus.pst_stime;
+ pInfo->SystemTime.Nanosec = 500000L;
+
+ pInfo->Fields |= osl_Process_CPUTIMES;
+ }
+
+ if (Fields & osl_Process_HEAPUSAGE)
+ {
+ pInfo->HeapUsage = prstatus.pst_vdsize*PAGESIZE;
+
+ pInfo->Fields |= osl_Process_HEAPUSAGE;
+ }
+
+ return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown;
+ }
+
+#elif defined(LINUX)
+
+ if ( (Fields & osl_Process_CPUTIMES) || (Fields & osl_Process_HEAPUSAGE) )
+ {
+ struct osl_procStat procstat;
+ memset(&procstat,0,sizeof(procstat));
+
+ if ( (Fields & osl_Process_CPUTIMES) && osl_getProcStat(pid, &procstat) )
+ {
+ /*
+ * mfe:
+ * We calculate only time of the process proper.
+ * Threads are processes, we do not consider their time here!
+ * (For this, cutime and cstime should be used, it seems not
+ * to work in 2.0.36)
+ */
+
+ long clktck;
+ unsigned long hz;
+ unsigned long userseconds;
+ unsigned long systemseconds;
+
+ clktck = sysconf(_SC_CLK_TCK);
+ if (clktck < 0) {
+ return osl_Process_E_Unknown;
+ }
+ hz = (unsigned long) clktck;
+
+ userseconds = procstat.utime/hz;
+ systemseconds = procstat.stime/hz;
+
+ pInfo->UserTime.Seconds = userseconds;
+ pInfo->UserTime.Nanosec = procstat.utime - (userseconds * hz);
+ pInfo->SystemTime.Seconds = systemseconds;
+ pInfo->SystemTime.Nanosec = procstat.stime - (systemseconds * hz);
+
+ pInfo->Fields |= osl_Process_CPUTIMES;
+ }
+
+ if ( (Fields & osl_Process_HEAPUSAGE) && osl_getProcStatus(pid, &procstat) )
+ {
+ /*
+ * mfe:
+ * vm_data (found in status) shows the size of the data segment
+ * it a rough approximation of the core heap size
+ */
+ pInfo->HeapUsage = procstat.vm_data*1024;
+
+ pInfo->Fields |= osl_Process_HEAPUSAGE;
+ }
+ }
+
+ return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown;
+#endif
+
+ }
+
+ return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown;
+}
+
+
+/***********************************************
+ helper function for osl_joinProcessWithTimeout
+ **********************************************/
+
+static int is_timeout(const struct timeval* tend)
+{
+ struct timeval tcurrent;
+ gettimeofday(&tcurrent, NULL);
+ return (tcurrent.tv_sec >= tend->tv_sec);
+}
+
+/**********************************************
+ kill(pid, 0) is usefull for checking if a
+ process is still alive, but remember that
+ kill even returns 0 if the process is already
+ a zombie.
+ *********************************************/
+
+static int is_process_dead(pid_t pid)
+{
+ return ((-1 == kill(pid, 0)) && (ESRCH == errno));
+}
+
+/**********************************************
+ osl_joinProcessWithTimeout
+ *********************************************/
+
+oslProcessError SAL_CALL osl_joinProcessWithTimeout(oslProcess Process, const TimeValue* pTimeout)
+{
+ oslProcessImpl* pChild = ChildList;
+ oslProcessError osl_error = osl_Process_E_None;
+
+ OSL_PRECOND(Process, "osl_joinProcess: Invalid parameter");
+ OSL_ASSERT(ChildListMutex);
+
+ if (NULL == Process || 0 == ChildListMutex)
+ return osl_Process_E_Unknown;
+
+ osl_acquireMutex(ChildListMutex);
+
+ /* check if process is a child of ours */
+ while (pChild != NULL)
+ {
+ if (pChild == (oslProcessImpl*)Process)
+ break;
+
+ pChild = pChild->m_pnext;
+ }
+
+ osl_releaseMutex(ChildListMutex);
+
+ if (pChild != NULL)
+ {
+ oslConditionResult cond_res = osl_waitCondition(pChild->m_terminated, pTimeout);
+
+ if (osl_cond_result_timeout == cond_res)
+ osl_error = osl_Process_E_TimedOut;
+ else if (osl_cond_result_ok != cond_res)
+ osl_error = osl_Process_E_Unknown;
+ }
+ else /* alien process; StatusThread will not be able
+ to set the condition terminated */
+ {
+ pid_t pid = ((oslProcessImpl*)Process)->m_pid;
+
+ if (pTimeout)
+ {
+ int timeout = 0;
+ struct timeval tend;
+
+ gettimeofday(&tend, NULL);
+
+ tend.tv_sec += pTimeout->Seconds;
+
+ while (!is_process_dead(pid) && ((timeout = is_timeout(&tend)) == 0))
+ sleep(1);
+
+ if (timeout)
+ osl_error = osl_Process_E_TimedOut;
+ }
+ else /* infinite */
+ {
+ while (!is_process_dead(pid))
+ sleep(1);
+ }
+ }
+ return osl_error;
+}
+
+/**********************************************
+ osl_joinProcess
+ *********************************************/
+
+oslProcessError SAL_CALL osl_joinProcess(oslProcess Process)
+{
+ return osl_joinProcessWithTimeout(Process, NULL);
+}
diff --git a/sal/osl/unx/process_impl.cxx b/sal/osl/unx/process_impl.cxx
new file mode 100644
index 000000000000..66c0d0f5c701
--- /dev/null
+++ b/sal/osl/unx/process_impl.cxx
@@ -0,0 +1,517 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "osl/process.h"
+
+#ifndef INCLUDED_LIMITS_H
+#include <limits.h>
+#define INCLUDED_LIMITS_H
+#endif
+
+#ifndef INCLUDED_PTHREAD_H
+#include <pthread.h>
+#define INCLUDED_PTHREAD_H
+#endif
+
+#ifndef INCLUDED_STDLIB_H
+#include <stdlib.h>
+#define INCLUDED_STDLIB_H
+#endif
+
+#ifndef INCLUDED_STRING_H
+#include <string.h>
+#define INCLUDED_STRING_H
+#endif
+#include "osl/diagnose.h"
+#include "osl/file.h"
+#include "osl/module.h"
+#include "osl/thread.h"
+#include "rtl/ustring.hxx"
+#include "rtl/strbuf.h"
+
+#ifndef _OSL_FILE_PATH_HELPER_H_
+#include "file_path_helper.h"
+#endif
+
+#ifndef _OSL_UUNXAPI_H_
+#include "uunxapi.h"
+#endif
+
+/***************************************
+ osl_bootstrap_getExecutableFile_Impl().
+
+ @internal
+ @see rtl_bootstrap
+ @see #i37371#
+
+ **************************************/
+
+extern "C" oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
+ rtl_uString ** ppFileURL
+) SAL_THROW_EXTERN_C();
+
+
+#if defined(MACOSX)
+#include <mach-o/dyld.h>
+
+oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
+ rtl_uString ** ppFileURL
+) SAL_THROW_EXTERN_C()
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ char buffer[PATH_MAX];
+ size_t buflen = sizeof(buffer);
+
+#if __GNUC__ >= 4 && defined(MACOSX)
+ if (_NSGetExecutablePath (buffer, (uint32_t*)&buflen) == 0)
+#else
+ if (_NSGetExecutablePath (buffer, &buflen) == 0)
+#endif
+ {
+ /* Determine absolute path. */
+ char abspath[PATH_MAX];
+ if (realpath (buffer, abspath) != 0)
+ {
+ /* Convert from utf8 to unicode. */
+ rtl_uString * pAbsPath = 0;
+ rtl_string2UString (
+ &(pAbsPath),
+ abspath, rtl_str_getLength (abspath),
+ RTL_TEXTENCODING_UTF8,
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+
+ if (pAbsPath)
+ {
+ /* Convert from path to url. */
+ if (osl_getFileURLFromSystemPath (pAbsPath, ppFileURL) == osl_File_E_None)
+ {
+ /* Success. */
+ result = osl_Process_E_None;
+ }
+ rtl_uString_release (pAbsPath);
+ }
+ }
+ }
+
+ return (result);
+}
+
+#elif !defined(NO_DL_FUNCTIONS)
+#include <dlfcn.h>
+
+oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
+ rtl_uString ** ppFileURL
+) SAL_THROW_EXTERN_C()
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ /* Determine address of "main()" function. */
+ void * addr = dlsym (RTLD_DEFAULT, "main");
+ if (addr != 0)
+ {
+ /* Determine module URL. */
+ if (osl_getModuleURLFromAddress (addr, ppFileURL))
+ {
+ /* Success. */
+ result = osl_Process_E_None;
+ }
+ }
+
+ return (result);
+}
+
+#else /* NO_DL_FUNCTIONS */
+
+oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
+ rtl_uString ** ppFileURL
+) SAL_THROW_EXTERN_C()
+{
+ /* Fallback to ordinary osl_getExecutableFile(). */
+ return osl_getExecutableFile (ppFileURL);
+}
+
+#endif /* NO_DL_FUNCTIONS */
+
+/***************************************
+ CommandArgs_Impl.
+ **************************************/
+struct CommandArgs_Impl
+{
+ pthread_mutex_t m_mutex;
+ sal_uInt32 m_nCount;
+ rtl_uString ** m_ppArgs;
+};
+
+static struct CommandArgs_Impl g_command_args =
+{
+ PTHREAD_MUTEX_INITIALIZER,
+ 0,
+ 0
+};
+
+/***************************************
+ osl_getExecutableFile().
+ **************************************/
+oslProcessError SAL_CALL osl_getExecutableFile (rtl_uString ** ppustrFile)
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ pthread_mutex_lock (&(g_command_args.m_mutex));
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > 0)
+ {
+ /* CommandArgs set. Obtain argv[0]. */
+ rtl_uString_assign (ppustrFile, g_command_args.m_ppArgs[0]);
+ result = osl_Process_E_None;
+ }
+ pthread_mutex_unlock (&(g_command_args.m_mutex));
+
+ return (result);
+}
+
+/***************************************
+ osl_getCommandArgCount().
+ **************************************/
+sal_uInt32 SAL_CALL osl_getCommandArgCount (void)
+{
+ sal_uInt32 result = 0;
+
+ pthread_mutex_lock (&(g_command_args.m_mutex));
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > 0)
+ result = g_command_args.m_nCount - 1;
+ pthread_mutex_unlock (&(g_command_args.m_mutex));
+
+ return (result);
+}
+
+/***************************************
+ osl_getCommandArg().
+ **************************************/
+oslProcessError SAL_CALL osl_getCommandArg (sal_uInt32 nArg, rtl_uString ** strCommandArg)
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ pthread_mutex_lock (&(g_command_args.m_mutex));
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > (nArg + 1))
+ {
+ rtl_uString_assign (strCommandArg, g_command_args.m_ppArgs[nArg + 1]);
+ result = osl_Process_E_None;
+ }
+ pthread_mutex_unlock (&(g_command_args.m_mutex));
+
+ return (result);
+}
+
+/***************************************
+ osl_setCommandArgs().
+ **************************************/
+void SAL_CALL osl_setCommandArgs (int argc, char ** argv)
+{
+ OSL_ASSERT(argc > 0);
+ pthread_mutex_lock (&(g_command_args.m_mutex));
+ OSL_ENSURE (g_command_args.m_nCount == 0, "osl_setCommandArgs(): CommandArgs already set.");
+ if (g_command_args.m_nCount == 0)
+ {
+ rtl_uString** ppArgs = (rtl_uString**)rtl_allocateZeroMemory (argc * sizeof(rtl_uString*));
+ if (ppArgs != 0)
+ {
+ rtl_TextEncoding encoding = osl_getThreadTextEncoding();
+ for (int i = 0; i < argc; i++)
+ {
+ rtl_string2UString (
+ &(ppArgs[i]),
+ argv[i], rtl_str_getLength (argv[i]), encoding,
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ }
+ if (ppArgs[0] != 0)
+ {
+ /* see @ osl_getExecutableFile(). */
+ if (rtl_ustr_indexOfChar (rtl_uString_getStr(ppArgs[0]), sal_Unicode('/')) == -1)
+ {
+ const rtl::OUString PATH (RTL_CONSTASCII_USTRINGPARAM("PATH"));
+
+ rtl_uString * pSearchPath = 0;
+ osl_getEnvironment (PATH.pData, &pSearchPath);
+ if (pSearchPath)
+ {
+ rtl_uString * pSearchResult = 0;
+ osl_searchPath (ppArgs[0], pSearchPath, &pSearchResult);
+ if (pSearchResult)
+ {
+ rtl_uString_assign (&(ppArgs[0]), pSearchResult);
+ rtl_uString_release (pSearchResult);
+ }
+ rtl_uString_release (pSearchPath);
+ }
+ }
+
+ rtl_uString * pArg0 = 0;
+ if (realpath_u (ppArgs[0], &pArg0))
+ {
+ osl_getFileURLFromSystemPath (pArg0, &(ppArgs[0]));
+ rtl_uString_release (pArg0);
+ }
+ }
+ g_command_args.m_nCount = argc;
+ g_command_args.m_ppArgs = ppArgs;
+ }
+ }
+ pthread_mutex_unlock (&(g_command_args.m_mutex));
+}
+
+/***************************************
+ osl_getEnvironment().
+ **************************************/
+oslProcessError SAL_CALL osl_getEnvironment(rtl_uString* pustrEnvVar, rtl_uString** ppustrValue)
+{
+ oslProcessError result = osl_Process_E_NotFound;
+ rtl_TextEncoding encoding = osl_getThreadTextEncoding();
+ rtl_String* pstr_env_var = 0;
+
+ OSL_PRECOND(pustrEnvVar, "osl_getEnvironment(): Invalid parameter");
+ OSL_PRECOND(ppustrValue, "osl_getEnvironment(): Invalid parameter");
+
+ rtl_uString2String(
+ &pstr_env_var,
+ rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+ if (pstr_env_var != 0)
+ {
+ const char* p_env_var = getenv (rtl_string_getStr (pstr_env_var));
+ if (p_env_var != 0)
+ {
+ rtl_string2UString(
+ ppustrValue,
+ p_env_var, strlen(p_env_var), encoding,
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ OSL_ASSERT(*ppustrValue != NULL);
+
+ result = osl_Process_E_None;
+ }
+ rtl_string_release(pstr_env_var);
+ }
+
+ return (result);
+}
+
+/***************************************
+ osl_setEnvironment().
+ **************************************/
+oslProcessError SAL_CALL osl_setEnvironment(rtl_uString* pustrEnvVar, rtl_uString* pustrValue)
+{
+ oslProcessError result = osl_Process_E_Unknown;
+ rtl_TextEncoding encoding = osl_getThreadTextEncoding();
+ rtl_String* pstr_env_var = 0;
+ rtl_String* pstr_val = 0;
+
+ OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
+ OSL_PRECOND(pustrValue, "osl_setEnvironment(): Invalid parameter");
+
+ rtl_uString2String(
+ &pstr_env_var,
+ rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ rtl_uString2String(
+ &pstr_val,
+ rtl_uString_getStr(pustrValue), rtl_uString_getLength(pustrValue), encoding,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ if (pstr_env_var != 0 && pstr_val != 0)
+ {
+#if defined (SOLARIS)
+ rtl_String * pBuffer = NULL;
+
+ sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer,
+ rtl_string_getLength(pstr_env_var) + rtl_string_getLength(pstr_val) + 1,
+ pstr_env_var );
+ rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1);
+ rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length,
+ rtl_string_getStr(pstr_val), rtl_string_getLength(pstr_val) );
+
+ rtl_string_acquire(pBuffer); // argument to putenv must leak on success
+
+ if (putenv(rtl_string_getStr(pBuffer)) == 0)
+ result = osl_Process_E_None;
+ else
+ rtl_string_release(pBuffer);
+#else
+ if (setenv(rtl_string_getStr(pstr_env_var), rtl_string_getStr(pstr_val), 1) == 0)
+ result = osl_Process_E_None;
+#endif
+ }
+
+ if (pstr_val)
+ rtl_string_release(pstr_val);
+
+ if (pstr_env_var != 0)
+ rtl_string_release(pstr_env_var);
+
+ return (result);
+}
+
+/***************************************
+ osl_clearEnvironment().
+ **************************************/
+oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString* pustrEnvVar)
+{
+ oslProcessError result = osl_Process_E_Unknown;
+ rtl_TextEncoding encoding = osl_getThreadTextEncoding();
+ rtl_String* pstr_env_var = 0;
+
+ OSL_PRECOND(pustrEnvVar, "osl_setEnvironment(): Invalid parameter");
+
+ rtl_uString2String(
+ &pstr_env_var,
+ rtl_uString_getStr(pustrEnvVar), rtl_uString_getLength(pustrEnvVar), encoding,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ if (pstr_env_var)
+ {
+#if defined (SOLARIS)
+ rtl_String * pBuffer = NULL;
+
+ sal_Int32 nCapacity = rtl_stringbuffer_newFromStringBuffer( &pBuffer,
+ rtl_string_getLength(pstr_env_var) + 1, pstr_env_var );
+ rtl_stringbuffer_insert( &pBuffer, &nCapacity, pBuffer->length, "=", 1);
+
+ rtl_string_acquire(pBuffer); // argument to putenv must leak on success
+
+ if (putenv(rtl_string_getStr(pBuffer)) == 0)
+ result = osl_Process_E_None;
+ else
+ rtl_string_release(pBuffer);
+#elif (defined(MACOSX) || defined(NETBSD) || defined(FREEBSD))
+ //MacOSX baseline is 10.4, which has an old-school void return
+ //for unsetenv.
+ //See: http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/10.4/man3/unsetenv.3.html?useVersion=10.4
+ unsetenv(rtl_string_getStr(pstr_env_var));
+ result = osl_Process_E_None;
+#else
+ if (unsetenv(rtl_string_getStr(pstr_env_var)) == 0)
+ result = osl_Process_E_None;
+#endif
+ rtl_string_release(pstr_env_var);
+ }
+
+ return (result);
+}
+
+
+/***************************************
+ osl_getProcessWorkingDir().
+ **************************************/
+oslProcessError SAL_CALL osl_getProcessWorkingDir(rtl_uString **ppustrWorkingDir)
+{
+ oslProcessError result = osl_Process_E_Unknown;
+ char buffer[PATH_MAX];
+
+ OSL_PRECOND(ppustrWorkingDir, "osl_getProcessWorkingDir(): Invalid parameter");
+
+ if (getcwd (buffer, sizeof(buffer)) != 0)
+ {
+ rtl_uString* ustrTmp = 0;
+
+ rtl_string2UString(
+ &ustrTmp,
+ buffer, strlen(buffer), osl_getThreadTextEncoding(),
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ if (ustrTmp != 0)
+ {
+ if (osl_getFileURLFromSystemPath (ustrTmp, ppustrWorkingDir) == osl_File_E_None)
+ result = osl_Process_E_None;
+ rtl_uString_release (ustrTmp);
+ }
+ }
+
+ return (result);
+}
+
+/******************************************************************************
+ *
+ * new functions to set/return the current process locale
+ *
+ *****************************************************************************/
+
+struct ProcessLocale_Impl
+{
+ pthread_mutex_t m_mutex;
+ rtl_Locale * m_pLocale;
+};
+
+static struct ProcessLocale_Impl g_process_locale =
+{
+ PTHREAD_MUTEX_INITIALIZER,
+ 0
+};
+
+extern "C" void _imp_getProcessLocale( rtl_Locale ** );
+extern "C" int _imp_setProcessLocale( rtl_Locale * );
+
+/**********************************************
+ osl_getProcessLocale().
+ *********************************************/
+oslProcessError SAL_CALL osl_getProcessLocale( rtl_Locale ** ppLocale )
+{
+ OSL_PRECOND(ppLocale, "osl_getProcessLocale(): Invalid parameter.");
+
+ pthread_mutex_lock(&(g_process_locale.m_mutex));
+
+ if (g_process_locale.m_pLocale == 0)
+ _imp_getProcessLocale (&(g_process_locale.m_pLocale));
+ *ppLocale = g_process_locale.m_pLocale;
+
+ pthread_mutex_unlock (&(g_process_locale.m_mutex));
+
+ return (osl_Process_E_None);
+}
+
+/**********************************************
+ osl_setProcessLocale().
+ *********************************************/
+oslProcessError SAL_CALL osl_setProcessLocale( rtl_Locale * pLocale )
+{
+ oslProcessError result = osl_Process_E_Unknown;
+
+ OSL_PRECOND(pLocale, "osl_setProcessLocale(): Invalid parameter.");
+
+ pthread_mutex_lock(&(g_process_locale.m_mutex));
+ if (_imp_setProcessLocale (pLocale) == 0)
+ {
+ g_process_locale.m_pLocale = pLocale;
+ result = osl_Process_E_None;
+ }
+ pthread_mutex_unlock (&(g_process_locale.m_mutex));
+
+ return (result);
+}
diff --git a/sal/osl/unx/procimpl.h b/sal/osl/unx/procimpl.h
new file mode 100644
index 000000000000..1a08d72ffe5a
--- /dev/null
+++ b/sal/osl/unx/procimpl.h
@@ -0,0 +1,50 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_PROCIMPL_H_
+#define _OSL_PROCIMPL_H_
+
+#include <osl/process.h>
+#include <osl/conditn.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _oslProcessImpl {
+ pid_t m_pid;
+ oslCondition m_terminated;
+ int m_status;
+ struct _oslProcessImpl* m_pnext;
+} oslProcessImpl;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/sal/osl/unx/profile.c b/sal/osl/unx/profile.c
new file mode 100644
index 000000000000..c77a27543261
--- /dev/null
+++ b/sal/osl/unx/profile.c
@@ -0,0 +1,2221 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/profile.h>
+#include <osl/process.h>
+#include <osl/thread.h>
+#include <rtl/alloc.h>
+#include <osl/util.h>
+
+#define LINES_INI 32
+#define LINES_ADD 10
+#define SECTIONS_INI 5
+#define SECTIONS_ADD 3
+#define ENTRIES_INI 5
+#define ENTRIES_ADD 3
+
+
+#define STR_INI_EXTENSION "rc"
+#define STR_INI_METAHOME "?~"
+#define STR_INI_METASYS "?$"
+#define STR_INI_METACFG "?^"
+#define STR_INI_METAINS "?#"
+
+#define STR_INI_BOOLYES "yes"
+#define STR_INI_BOOLON "on"
+#define STR_INI_BOOLONE "1"
+#define STR_INI_BOOLNO "no"
+#define STR_INI_BOOLOFF "off"
+#define STR_INI_BOOLZERO "0"
+
+#define FLG_USER 0x00FF
+#define FLG_AUTOOPEN 0x0100
+#define FLG_MODIFIED 0x0200
+
+#define SVERSION_LOCATION STR_INI_METACFG
+#define SVERSION_FALLBACK STR_INI_METASYS
+#define SVERSION_NAME "sversion"
+#define SVERSION_SECTION "Versions"
+#define SVERSION_SOFFICE "StarOffice"
+#define SVERSION_PROFILE "sofficerc"
+#define SVERSION_OPTION "userid:"
+#define SVERSION_DIRS { "bin", "program" }
+#define SVERSION_USER "user"
+
+#define DEFAULT_PMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
+
+#define _BUILD_STR_(n) # n
+#define BUILD_STR(n) _BUILD_STR_(n)
+
+
+/*#define DEBUG_OSL_PROFILE*/
+/*#define TRACE_OSL_PROFILE*/
+
+/*****************************************************************************/
+/* Data Type Definition */
+/*****************************************************************************/
+
+typedef time_t osl_TStamp;
+
+typedef enum _osl_TLockMode
+{
+ un_lock, read_lock, write_lock
+} osl_TLockMode;
+
+typedef struct _osl_TFile
+{
+ int m_Handle;
+ sal_Char* m_pReadPtr;
+ sal_Char m_ReadBuf[512];
+ sal_Char* m_pWriteBuf;
+ sal_uInt32 m_nWriteBufLen;
+ sal_uInt32 m_nWriteBufFree;
+} osl_TFile;
+
+typedef struct _osl_TProfileEntry
+{
+ sal_uInt32 m_Line;
+ sal_uInt32 m_Offset;
+ sal_uInt32 m_Len;
+} osl_TProfileEntry;
+
+typedef struct _osl_TProfileSection
+{
+ sal_uInt32 m_Line;
+ sal_uInt32 m_Offset;
+ sal_uInt32 m_Len;
+ sal_uInt32 m_NoEntries;
+ sal_uInt32 m_MaxEntries;
+ osl_TProfileEntry* m_Entries;
+} osl_TProfileSection;
+
+
+/*
+ Profile-data structure hidden behind oslProfile:
+*/
+typedef struct _osl_TProfileImpl
+{
+ sal_uInt32 m_Flags;
+ osl_TFile* m_pFile;
+ osl_TStamp m_Stamp;
+ sal_Char m_FileName[PATH_MAX + 1];
+ sal_uInt32 m_NoLines;
+ sal_uInt32 m_MaxLines;
+ sal_uInt32 m_NoSections;
+ sal_uInt32 m_MaxSections;
+ sal_Char** m_Lines;
+ osl_TProfileSection* m_Sections;
+ pthread_mutex_t m_AccessLock;
+ sal_Bool m_bIsValid;
+} osl_TProfileImpl;
+
+
+/*****************************************************************************/
+/* Static Module Function Declarations */
+/*****************************************************************************/
+
+static osl_TFile* openFileImpl(const sal_Char* pszFilename, oslProfileOption ProfileFlags);
+static osl_TStamp closeFileImpl(osl_TFile* pFile, oslProfileOption Flags);
+static sal_Bool OslProfile_lockFile(const osl_TFile* pFile, osl_TLockMode eMode);
+static sal_Bool OslProfile_rewindFile(osl_TFile* pFile, sal_Bool bTruncate);
+static osl_TStamp OslProfile_getFileStamp(osl_TFile* pFile);
+
+static sal_Char* OslProfile_getLine(osl_TFile* pFile);
+static sal_Bool OslProfile_putLine(osl_TFile* pFile, const sal_Char *pszLine);
+static sal_Char* stripBlanks(sal_Char* String, sal_uInt32* pLen);
+static sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line);
+static sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo);
+static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo);
+static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection,
+ sal_uInt32 NoEntry, sal_uInt32 Line,
+ sal_Char* Entry, sal_uInt32 Len);
+static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection,
+ int Line, sal_Char* Entry, sal_uInt32 Len);
+static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry);
+static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len);
+static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection);
+static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section,
+ const sal_Char* Entry, sal_uInt32 *pNoEntry);
+static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile);
+static sal_Bool storeProfile(osl_TProfileImpl* pProfile, sal_Bool bCleanup);
+static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable);
+static sal_Bool releaseProfile(osl_TProfileImpl* pProfile);
+
+static sal_Bool writeProfileImpl (osl_TFile* pFile);
+static osl_TFile* osl_openTmpProfileImpl(osl_TProfileImpl*);
+static sal_Bool osl_ProfileSwapProfileNames(osl_TProfileImpl*);
+static void osl_ProfileGenerateExtension(sal_Char* pszFileName, sal_Char* pszExtension, sal_Char* pszTmpName);
+static oslProfile SAL_CALL osl_psz_openProfile(const sal_Char *pszProfileName, oslProfileOption Flags);
+
+/* implemented in file.c */
+extern oslFileError FileURLToPath( char *, size_t, rtl_uString* );
+
+/*****************************************************************************/
+/* Exported Module Functions */
+/*****************************************************************************/
+oslProfile SAL_CALL osl_openProfile(rtl_uString *ustrProfileName, oslProfileOption Options)
+{
+ char profilePath[PATH_MAX] = "";
+
+ if ( ustrProfileName != 0 && ustrProfileName->buffer[0] != 0 )
+ FileURLToPath( profilePath, PATH_MAX, ustrProfileName );
+
+ return osl_psz_openProfile( profilePath,Options );
+}
+
+
+static oslProfile SAL_CALL osl_psz_openProfile(const sal_Char *pszProfileName, oslProfileOption Flags)
+{
+ osl_TFile* pFile;
+ osl_TProfileImpl* pProfile;
+ sal_Char Filename[PATH_MAX];
+ sal_Bool bRet = sal_False;
+
+ Filename[0] = '\0';
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_openProfile\n");
+#endif
+
+#ifdef DEBUG_OSL_PROFILE
+ Flags=osl_Profile_FLUSHWRITE;
+
+ OSL_TRACE("opening '%s'\n",pszProfileName);
+ if ( Flags == osl_Profile_DEFAULT )
+ {
+ OSL_TRACE("with osl_Profile_DEFAULT\n");
+ }
+ if ( Flags & osl_Profile_SYSTEM )
+ {
+ OSL_TRACE("with osl_Profile_SYSTEM\n");
+ }
+ if ( Flags & osl_Profile_READLOCK )
+ {
+ OSL_TRACE("with osl_Profile_READLOCK\n");
+ }
+ if ( Flags & osl_Profile_WRITELOCK )
+ {
+ OSL_TRACE("with osl_Profile_WRITELOCK\n");
+ }
+ if ( Flags & osl_Profile_FLUSHWRITE )
+ {
+ OSL_TRACE("with osl_Profile_FLUSHWRITE\n");
+ }
+#endif
+
+
+ if ( ( pFile = openFileImpl(pszProfileName, Flags ) ) == NULL )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_openProfile [not opened]\n");
+#endif
+ return (NULL);
+ }
+
+
+ pProfile = (osl_TProfileImpl*)calloc(1, sizeof(osl_TProfileImpl));
+
+ if ( pProfile == 0 )
+ {
+ return 0;
+ }
+
+ pProfile->m_Flags = Flags & FLG_USER;
+
+ if ( Flags & ( osl_Profile_READLOCK | osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ) )
+ {
+ pProfile->m_pFile = pFile;
+ }
+
+ pthread_mutex_init(&(pProfile->m_AccessLock),PTHREAD_MUTEXATTR_DEFAULT);
+ pProfile->m_bIsValid=sal_True;
+
+ pProfile->m_Stamp = OslProfile_getFileStamp(pFile);
+ bRet=loadProfile(pFile, pProfile);
+ bRet &= realpath(pszProfileName, pProfile->m_FileName) != NULL;
+ OSL_ASSERT(bRet);
+
+ if (pProfile->m_pFile == NULL)
+ closeFileImpl(pFile,pProfile->m_Flags);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_openProfile [ok]\n");
+#endif
+ return (pProfile);
+}
+
+sal_Bool SAL_CALL osl_closeProfile(oslProfile Profile)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_closeProfile\n");
+#endif
+
+ if ( Profile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [profile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ pthread_mutex_lock(&(pProfile->m_AccessLock));
+
+ if ( pProfile->m_bIsValid == sal_False )
+ {
+ OSL_ASSERT(pProfile->m_bIsValid);
+ pthread_mutex_unlock(&(pProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [not valid]\n");
+#endif
+ return sal_False;
+ }
+
+ pProfile->m_bIsValid=sal_False;
+
+ if ( ! ( pProfile->m_Flags & osl_Profile_READLOCK ) && ( pProfile->m_Flags & FLG_MODIFIED ) )
+ {
+ pProfile = acquireProfile(Profile,sal_True);
+
+ if ( pProfile != 0 )
+ {
+ bRet=storeProfile(pProfile, sal_True);
+ OSL_ASSERT(bRet);
+ }
+ }
+ else
+ {
+ pProfile = acquireProfile(Profile,sal_False);
+ }
+
+
+ if ( pProfile == 0 )
+ {
+ pthread_mutex_unlock(&(pProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [pProfile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ if (pProfile->m_pFile != NULL)
+ closeFileImpl(pProfile->m_pFile,pProfile->m_Flags);
+
+ pProfile->m_pFile = NULL;
+ pProfile->m_FileName[0] = '\0';
+
+ /* release whole profile data types memory */
+ if ( pProfile->m_NoLines > 0)
+ {
+ unsigned int idx=0;
+ if ( pProfile->m_Lines != 0 )
+ {
+ for ( idx = 0 ; idx < pProfile->m_NoLines ; ++idx)
+ {
+ if ( pProfile->m_Lines[idx] != 0 )
+ {
+ free(pProfile->m_Lines[idx]);
+ pProfile->m_Lines[idx]=0;
+ }
+ }
+ free(pProfile->m_Lines);
+ pProfile->m_Lines=0;
+ }
+ if ( pProfile->m_Sections != 0 )
+ {
+ /*osl_TProfileSection* pSections=pProfile->m_Sections;*/
+ for ( idx = 0 ; idx < pProfile->m_NoSections ; ++idx )
+ {
+ if ( pProfile->m_Sections[idx].m_Entries != 0 )
+ {
+ free(pProfile->m_Sections[idx].m_Entries);
+ pProfile->m_Sections[idx].m_Entries=0;
+ }
+ }
+ free(pProfile->m_Sections);
+ pProfile->m_Sections=0;
+ }
+ }
+
+ pthread_mutex_unlock(&(pProfile->m_AccessLock));
+
+ pthread_mutex_destroy(&(pProfile->m_AccessLock));
+
+ free(pProfile);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [ok]\n");
+#endif
+ return (sal_True);
+}
+
+
+sal_Bool SAL_CALL osl_flushProfile(oslProfile Profile)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*) Profile;
+ osl_TFile* pFile;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_flushProfile()\n");
+#endif
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [pProfile == 0]\n");
+#endif
+ return sal_False;
+ }
+
+ pthread_mutex_lock(&(pProfile->m_AccessLock));
+
+ if ( pProfile->m_bIsValid == sal_False )
+ {
+ OSL_ASSERT(pProfile->m_bIsValid);
+ pthread_mutex_unlock(&(pProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile [not valid]\n");
+#endif
+ return sal_False;
+ }
+
+ pFile = pProfile->m_pFile;
+ if ( !( pFile != 0 && pFile->m_Handle >= 0 ) )
+ {
+ pthread_mutex_unlock(&(pProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [invalid file]\n");
+#endif
+ return sal_False;
+ }
+
+ if ( pProfile->m_Flags & FLG_MODIFIED )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("swapping to storeprofile\n");
+#endif
+ bRet = storeProfile(pProfile,sal_False);
+ OSL_ASSERT(bRet);
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [ok]\n");
+#endif
+ pthread_mutex_unlock(&(pProfile->m_AccessLock));
+ return bRet;
+}
+
+static sal_Bool writeProfileImpl(osl_TFile* pFile)
+{
+ int BytesWritten=0;
+#if OSL_DEBUG_LEVEL > 1
+ unsigned int nLen=0;
+#endif
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileImpl()\n");
+#endif
+
+ if ( !( pFile != 0 && pFile->m_Handle >= 0 ) || ( pFile->m_pWriteBuf == 0 ) )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileImpl() [invalid args]\n");
+#endif
+ return sal_False;
+ }
+
+#if OSL_DEBUG_LEVEL > 1
+ nLen=strlen(pFile->m_pWriteBuf);
+ OSL_ASSERT(nLen == (pFile->m_nWriteBufLen - pFile->m_nWriteBufFree));
+#endif
+
+ BytesWritten = write(pFile->m_Handle, pFile->m_pWriteBuf, pFile->m_nWriteBufLen - pFile->m_nWriteBufFree);
+
+ if ( BytesWritten <= 0 )
+ {
+ OSL_TRACE("write failed '%s'\n",strerror(errno));
+ return (sal_False);
+ }
+
+#if OSL_DEBUG_LEVEL > 1
+ OSL_ASSERT(
+ BytesWritten >= 0 && SAL_INT_CAST(unsigned int, BytesWritten) == nLen);
+#endif
+
+ free(pFile->m_pWriteBuf);
+ pFile->m_pWriteBuf=0;
+ pFile->m_nWriteBufLen=0;
+ pFile->m_nWriteBufFree=0;
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileImpl() [ok]\n");
+#endif
+ return sal_True;
+}
+
+
+sal_Bool SAL_CALL osl_readProfileString(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Char* pszString, sal_uInt32 MaxLen,
+ const sal_Char* pszDefault)
+{
+ sal_uInt32 NoEntry;
+ sal_Char* pStr=0;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile=0;
+ osl_TProfileImpl* pTmpProfile=0;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileString\n");
+#endif
+
+ pTmpProfile = (osl_TProfileImpl*) Profile;
+
+ if ( pTmpProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [pTmpProfile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ pthread_mutex_lock(&(pTmpProfile->m_AccessLock));
+
+ if ( pTmpProfile->m_bIsValid == sal_False )
+ {
+ OSL_ASSERT(pProfile->m_bIsValid);
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [not valid]\n");
+#endif
+ return sal_False;
+ }
+
+ pProfile = acquireProfile(Profile, sal_False);
+
+ if ( pProfile == NULL )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [pProfile==0]\n");
+#endif
+ return (sal_False);
+ }
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) &&
+ (NoEntry < pSec->m_NoEntries) &&
+ ((pStr = strchr(pProfile->m_Lines[pSec->m_Entries[NoEntry].m_Line],
+ '=')) != NULL))
+ {
+ pStr++;
+ }
+ else
+ {
+ pStr=(sal_Char*)pszDefault;
+ }
+
+ if ( pStr != 0 )
+ {
+ pStr = stripBlanks(pStr, NULL);
+ MaxLen = (MaxLen - 1 < strlen(pStr)) ? (MaxLen - 1) : strlen(pStr);
+ pStr = stripBlanks(pStr, &MaxLen);
+ strncpy(pszString, pStr, MaxLen);
+ pszString[MaxLen] = '\0';
+ }
+ }
+ else
+ { /* not implemented */ }
+
+
+ bRet=releaseProfile(pProfile);
+ OSL_ASSERT(bRet);
+
+ if ( pStr == 0 )
+ {
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [pStr==0]\n");
+#endif
+ return sal_False;
+ }
+
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [ok]\n");
+#endif
+
+ return (sal_True);
+}
+
+
+sal_Bool SAL_CALL osl_readProfileBool(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Bool Default)
+{
+ sal_Char Line[32];
+ Line[0] = '\0';
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileBool\n");
+#endif
+
+ if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), ""))
+ {
+ if ((strcasecmp(Line, STR_INI_BOOLYES) == 0) ||
+ (strcasecmp(Line, STR_INI_BOOLON) == 0) ||
+ (strcasecmp(Line, STR_INI_BOOLONE) == 0))
+ Default = sal_True;
+ else
+ if ((strcasecmp(Line, STR_INI_BOOLNO) == 0) ||
+ (strcasecmp(Line, STR_INI_BOOLOFF) == 0) ||
+ (strcasecmp(Line, STR_INI_BOOLZERO) == 0))
+ Default = sal_False;
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileBool [ok]\n");
+#endif
+
+ return (Default);
+}
+
+
+sal_uInt32 SAL_CALL osl_readProfileIdent(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_uInt32 FirstId, const sal_Char* Strings[],
+ sal_uInt32 Default)
+{
+ sal_uInt32 i;
+ sal_Char Line[256];
+ Line[0] = '\0';
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileIdent\n");
+#endif
+
+ if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), ""))
+ {
+ i = 0;
+ while (Strings[i] != NULL)
+ {
+ if (strcasecmp(Line, Strings[i]) == 0)
+ {
+ Default = i + FirstId;
+ break;
+ }
+ i++;
+ }
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileIdent [ok]\n");
+#endif
+ return (Default);
+}
+
+sal_Bool SAL_CALL osl_writeProfileString(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ const sal_Char* pszString)
+{
+ sal_uInt32 i;
+ sal_Bool bRet = sal_False;
+ sal_uInt32 NoEntry;
+ sal_Char* pStr;
+ sal_Char* Line = 0;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+ osl_TProfileImpl* pTmpProfile = 0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileString\n");
+#endif
+
+ pTmpProfile = (osl_TProfileImpl*) Profile;
+
+ if ( pTmpProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [pTmpProfile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ pthread_mutex_lock(&(pTmpProfile->m_AccessLock));
+
+ if ( pTmpProfile->m_bIsValid == sal_False )
+ {
+ OSL_ASSERT(pTmpProfile->m_bIsValid);
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [not valid]\n");
+#endif
+ return sal_False;
+ }
+
+ pProfile=acquireProfile(Profile, sal_True);
+
+ if (pProfile == NULL)
+ {
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [pProfile==0]\n");
+#endif
+ return (sal_False);
+ }
+
+ Line = (sal_Char*) malloc(strlen(pszEntry)+strlen(pszString)+48);
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if ((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) == NULL)
+ {
+ Line[0] = '\0';
+ addLine(pProfile, Line);
+
+ Line[0] = '[';
+ strcpy(&Line[1], pszSection);
+ Line[1 + strlen(pszSection)] = ']';
+ Line[2 + strlen(pszSection)] = '\0';
+
+ if (((pStr = addLine(pProfile, Line)) == NULL) ||
+ (! addSection(pProfile, pProfile->m_NoLines - 1, &pStr[1], strlen(pszSection))))
+ {
+ bRet=releaseProfile(pProfile);
+ OSL_ASSERT(bRet);
+
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+
+ free(Line);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [not added]\n");
+#endif
+ return (sal_False);
+ }
+
+ pSec = &pProfile->m_Sections[pProfile->m_NoSections - 1];
+ NoEntry = pSec->m_NoEntries;
+ }
+
+ Line[0] = '\0';
+ strcpy(&Line[0], pszEntry);
+ Line[0 + strlen(pszEntry)] = '=';
+ strcpy(&Line[1 + strlen(pszEntry)], pszString);
+
+ if (NoEntry >= pSec->m_NoEntries)
+ {
+ if (pSec->m_NoEntries > 0)
+ i = pSec->m_Entries[pSec->m_NoEntries - 1].m_Line + 1;
+ else
+ i = pSec->m_Line + 1;
+
+ if (((pStr = insertLine(pProfile, Line, i)) == NULL) ||
+ (! addEntry(pProfile, pSec, i, pStr, strlen(pszEntry))))
+ {
+ bRet=releaseProfile(pProfile);
+ OSL_ASSERT(bRet);
+
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+ free(Line);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [not inserted]\n");
+#endif
+ return (sal_False);
+ }
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ else
+ {
+ i = pSec->m_Entries[NoEntry].m_Line;
+ free(pProfile->m_Lines[i]);
+ pProfile->m_Lines[i] = strdup(Line);
+ setEntry(pProfile, pSec, NoEntry, i, pProfile->m_Lines[i], strlen(pszEntry));
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ }
+ else {
+ /* not implemented */
+ }
+
+ bRet = releaseProfile(pProfile);
+ OSL_ASSERT(bRet);
+
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+ if ( Line!= 0 )
+ {
+ free(Line);
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [ok]\n");
+#endif
+
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_writeProfileBool(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Bool Value)
+{
+ sal_Bool bRet=sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileBool\n");
+#endif
+
+ if (Value)
+ bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLONE);
+ else
+ bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLZERO);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileBool [ok]\n");
+#endif
+
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_writeProfileIdent(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_uInt32 FirstId, const sal_Char* Strings[],
+ sal_uInt32 Value)
+{
+ int i, n;
+ sal_Bool bRet=sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileIdent\n");
+#endif
+
+ for (n = 0; Strings[n] != NULL; n++);
+
+ if ((i = Value - FirstId) >= n)
+ bRet=sal_False;
+ else
+ bRet = osl_writeProfileString(Profile, pszSection, pszEntry, Strings[i]);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileIdent\n");
+#endif
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_removeProfileEntry(oslProfile Profile,
+ const sal_Char *pszSection, const sal_Char *pszEntry)
+{
+ sal_uInt32 NoEntry;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+ osl_TProfileImpl* pTmpProfile = 0;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_removeProfileEntry\n");
+#endif
+
+ pTmpProfile = (osl_TProfileImpl*) Profile;
+
+ if ( pTmpProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_removeProfileEntry [pProfile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ pthread_mutex_lock(&(pTmpProfile->m_AccessLock));
+
+ if ( pTmpProfile->m_bIsValid == sal_False )
+ {
+ OSL_ASSERT(pTmpProfile->m_bIsValid);
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_removeProfileEntry [not valid]\n");
+#endif
+ return sal_False;
+ }
+
+
+ pProfile = acquireProfile(Profile, sal_True);
+
+ if (pProfile == NULL)
+ {
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_removeProfileEntry [pProfile==0]\n");
+#endif
+ return (sal_False);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) &&
+ (NoEntry < pSec->m_NoEntries))
+ {
+ removeLine(pProfile, pSec->m_Entries[NoEntry].m_Line);
+ removeEntry(pSec, NoEntry);
+ if (pSec->m_NoEntries == 0)
+ {
+ removeLine(pProfile, pSec->m_Line);
+
+ /* remove any empty separation line */
+ if ((pSec->m_Line > 0) && (pProfile->m_Lines[pSec->m_Line - 1][0] == '\0'))
+ removeLine(pProfile, pSec->m_Line - 1);
+
+ removeSection(pProfile, pSec);
+ }
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ }
+ else
+ { /* not implemented */ }
+
+
+ bRet = releaseProfile(pProfile);
+ OSL_ASSERT(bRet);
+
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_removeProfileEntry [ok]\n");
+#endif
+ return bRet;
+}
+
+
+sal_uInt32 SAL_CALL osl_getProfileSectionEntries(oslProfile Profile, const sal_Char *pszSection,
+ sal_Char* pszBuffer, sal_uInt32 MaxLen)
+{
+ sal_uInt32 i, n = 0;
+ sal_uInt32 NoEntry;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+ osl_TProfileImpl* pTmpProfile = 0;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_getProfileSectionEntries\n");
+#endif
+
+ pTmpProfile = (osl_TProfileImpl*) Profile;
+
+ if ( pTmpProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSectionEntries [pTmpProfile==0]\n");
+#endif
+ return sal_False;
+
+ }
+
+ pthread_mutex_lock(&(pTmpProfile->m_AccessLock));
+
+ if ( pTmpProfile->m_bIsValid == sal_False )
+ {
+ OSL_ASSERT(pTmpProfile->m_bIsValid);
+
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSectionEntries [not valid]\n");
+#endif
+
+ return sal_False;
+ }
+
+ pProfile = acquireProfile(Profile, sal_False);
+
+ if (pProfile == NULL)
+ {
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSectionEntries [pProfile=0]\n");
+#endif
+
+ return (0);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if ((pSec = findEntry(pProfile, pszSection, "", &NoEntry)) != NULL)
+ {
+ if (MaxLen != 0)
+ {
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ {
+ if ((n + pSec->m_Entries[i].m_Len + 1) < MaxLen)
+ {
+ strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Entries[i].m_Line]
+ [pSec->m_Entries[i].m_Offset], pSec->m_Entries[i].m_Len);
+ n += pSec->m_Entries[i].m_Len;
+ pszBuffer[n++] = '\0';
+ }
+ else
+ break;
+
+ }
+
+ pszBuffer[n++] = '\0';
+ }
+ else
+ {
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ n += pSec->m_Entries[i].m_Len + 1;
+
+ n += 1;
+ }
+ }
+ else
+ n = 0;
+ }
+ else {
+ /* not implemented */
+ }
+
+ bRet=releaseProfile(pProfile);
+ OSL_ASSERT(bRet);
+
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSectionEntries [ok]\n");
+#endif
+
+ return (n);
+}
+
+sal_uInt32 SAL_CALL osl_getProfileSections(oslProfile Profile, sal_Char* pszBuffer, sal_uInt32 MaxLen)
+{
+ sal_uInt32 i, n = 0;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+ osl_TProfileImpl* pTmpProfile = 0;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_getProfileSections\n");
+#endif
+
+ pTmpProfile = (osl_TProfileImpl*) Profile;
+
+ if ( pTmpProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSections [pTmpProfile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ pthread_mutex_lock(&(pTmpProfile->m_AccessLock));
+
+ if ( pTmpProfile->m_bIsValid == sal_False )
+ {
+ OSL_ASSERT(pTmpProfile->m_bIsValid);
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSections [not valid]\n");
+#endif
+ return sal_False;
+ }
+
+ pProfile = acquireProfile(Profile, sal_False);
+
+ if (pProfile == NULL)
+ {
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSections [pProfile==0]\n");
+#endif
+ return (0);
+ }
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (MaxLen != 0)
+ {
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if ((n + pSec->m_Len + 1) < MaxLen)
+ {
+ strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset],
+ pSec->m_Len);
+ n += pSec->m_Len;
+ pszBuffer[n++] = '\0';
+ }
+ else
+ break;
+ }
+
+ pszBuffer[n++] = '\0';
+ }
+ else
+ {
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ n += pProfile->m_Sections[i].m_Len + 1;
+
+ n += 1;
+ }
+ }
+ else
+ { /* not implemented */ }
+
+
+ bRet=releaseProfile(pProfile);
+ OSL_ASSERT(bRet);
+
+ pthread_mutex_unlock(&(pTmpProfile->m_AccessLock));
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSections [ok]\n");
+#endif
+
+ return (n);
+}
+
+/*****************************************************************************/
+/* Static Module Functions */
+/*****************************************************************************/
+
+static osl_TStamp OslProfile_getFileStamp(osl_TFile* pFile)
+{
+ struct stat status;
+
+ if ( (pFile->m_Handle < 0) || (fstat(pFile->m_Handle, &status) < 0) )
+ {
+ return (0);
+ }
+
+
+ return (status.st_mtime);
+}
+
+static sal_Bool OslProfile_lockFile(const osl_TFile* pFile, osl_TLockMode eMode)
+{
+ struct flock lock;
+ /* boring hack, but initializers for static vars must be constant */
+ static sal_Bool bIsInitialized = sal_False;
+ static sal_Bool bLockingDisabled;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In OslProfile_lockFile\n");
+#endif
+
+ if ( !bIsInitialized )
+ {
+ sal_Char* pEnvValue;
+ pEnvValue = getenv( "STAR_PROFILE_LOCKING_DISABLED" );
+
+ if ( pEnvValue == 0 )
+ {
+ bLockingDisabled = sal_False;
+
+ }
+ else
+ {
+ bLockingDisabled = sal_True;
+ }
+
+ bIsInitialized = sal_True;
+ }
+
+ if (pFile->m_Handle < 0)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out OslProfile_lockFile [invalid file handle]\n");
+#endif
+ return (sal_False);
+ }
+
+
+ if ( bLockingDisabled )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out OslProfile_lockFile [locking disabled]\n");
+#endif
+ return (sal_True);
+ }
+
+
+ lock.l_start = 0;
+ lock.l_whence = SEEK_SET;
+ lock.l_len = 0;
+
+ switch (eMode)
+ {
+ case un_lock:
+ lock.l_type = F_UNLCK;
+ break;
+
+ case read_lock:
+ lock.l_type = F_RDLCK;
+ break;
+
+ case write_lock:
+ lock.l_type = F_WRLCK;
+ break;
+ }
+
+#ifndef MACOSX // not MAC OSX
+ if ( fcntl(pFile->m_Handle, F_SETLKW, &lock) == -1 )
+#else
+ /* Mac OSX will return ENOTSUP for webdav drives so we should ignore it */
+ if ( fcntl(pFile->m_Handle, F_SETLKW, &lock) == -1 && errno != ENOTSUP )
+#endif /* MACOSX */
+ {
+ OSL_TRACE("fcntl returned -1 (%s)\n",strerror(errno));
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out OslProfile_lockFile [fcntl F_SETLKW]\n");
+#endif
+ return sal_False;
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out OslProfile_lockFile [ok]\n");
+#endif
+ return sal_True;
+}
+
+static osl_TFile* openFileImpl(const sal_Char* pszFilename, oslProfileOption ProfileFlags )
+{
+ int Flags;
+ osl_TFile* pFile = (osl_TFile*) calloc(1, sizeof(osl_TFile));
+ sal_Bool bWriteable = sal_False;
+
+ if ( ProfileFlags & ( osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ) )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("setting bWriteable to TRUE\n");
+#endif
+ bWriteable=sal_True;
+ }
+
+ if (! bWriteable)
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("opening '%s' read only\n",pszFilename);
+#endif
+
+ pFile->m_Handle = open(pszFilename, O_RDONLY);
+ /* mfe: argghh!!! do not check if the file could be openend */
+ /* default mode expects it that way!!! */
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("opening '%s' read/write\n",pszFilename);
+#endif
+ if (((pFile->m_Handle = open(pszFilename, O_RDWR | O_CREAT | O_EXCL, DEFAULT_PMODE)) < 0) &&
+ ((pFile->m_Handle = open(pszFilename, O_RDWR)) < 0))
+ {
+ free(pFile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out openFileImpl [open read/write]\n");
+#endif
+ return (NULL);
+ }
+ }
+
+ /* set close-on-exec flag */
+ if ((Flags = fcntl(pFile->m_Handle, F_GETFD, 0)) != -1)
+ {
+ Flags |= FD_CLOEXEC;
+ fcntl(pFile->m_Handle, F_SETFD, Flags);
+ }
+
+ pFile->m_pWriteBuf=0;
+ pFile->m_nWriteBufFree=0;
+ pFile->m_nWriteBufLen=0;
+
+ if ( ProfileFlags & (osl_Profile_WRITELOCK | osl_Profile_READLOCK ) )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("locking '%s' file\n",pszFilename);
+#endif
+ OslProfile_lockFile(pFile, bWriteable ? write_lock : read_lock);
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out openFileImpl [ok]\n");
+#endif
+ return (pFile);
+}
+
+static osl_TStamp closeFileImpl(osl_TFile* pFile, oslProfileOption Flags)
+{
+ osl_TStamp stamp = 0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In closeFileImpl\n");
+#endif
+
+ if ( pFile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out closeFileImpl [pFile == 0]\n");
+#endif
+ return stamp;
+ }
+
+ if ( pFile->m_Handle >= 0 )
+ {
+ stamp = OslProfile_getFileStamp(pFile);
+
+ if ( Flags & (osl_Profile_WRITELOCK | osl_Profile_WRITELOCK ) )
+ {
+ OslProfile_lockFile(pFile, un_lock);
+ }
+
+ close(pFile->m_Handle);
+ pFile->m_Handle = -1;
+ }
+
+
+ if ( pFile->m_pWriteBuf )
+ {
+ free(pFile->m_pWriteBuf);
+ }
+
+ free(pFile);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out closeFileImpl [ok]\n");
+#endif
+
+ return(stamp);
+}
+
+static sal_Bool OslProfile_rewindFile(osl_TFile* pFile, sal_Bool bTruncate)
+{
+ sal_Bool bRet = sal_True;
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_OslProfile_rewindFile\n");
+#endif
+
+ if (pFile->m_Handle >= 0)
+ {
+ pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);
+
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("rewinding\n");
+#endif
+ bRet = (lseek(pFile->m_Handle, SEEK_SET, 0L) == 0L);
+
+ if (bTruncate)
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("truncating\n");
+#endif
+ bRet &= (ftruncate(pFile->m_Handle, 0L) == 0);
+ }
+
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_OslProfile_rewindFile [ok]\n");
+#endif
+ return bRet;
+}
+
+
+static sal_Char* OslProfile_getLine(osl_TFile* pFile)
+{
+ int Max, Free, Bytes, nLineBytes = 0;
+ sal_Char* pChr;
+ sal_Char* pLine = NULL;
+ sal_Char* pNewLine;
+
+ if ( pFile == 0 )
+ {
+ return 0;
+ }
+
+ if (pFile->m_Handle < 0)
+ return NULL;
+
+ do
+ {
+ Bytes = sizeof(pFile->m_ReadBuf) - (pFile->m_pReadPtr - pFile->m_ReadBuf);
+
+ if (Bytes <= 1)
+ {
+ /* refill buffer */
+ memcpy(pFile->m_ReadBuf, pFile->m_pReadPtr, Bytes);
+ pFile->m_pReadPtr = pFile->m_ReadBuf;
+
+ Free = sizeof(pFile->m_ReadBuf) - Bytes;
+
+ if ((Max = read(pFile->m_Handle, &pFile->m_ReadBuf[Bytes], Free)) < 0)
+ {
+ OSL_TRACE("read failed '%s'\n",strerror(errno));
+
+ if( pLine )
+ rtl_freeMemory( pLine );
+ pLine = NULL;
+ break;
+ }
+
+ if (Max < Free)
+ {
+ if ((Max == 0) && ! pLine)
+ break;
+
+ pFile->m_ReadBuf[Bytes + Max] = '\0';
+ }
+ }
+
+ for (pChr = pFile->m_pReadPtr;
+ (*pChr != '\n') && (*pChr != '\r') && (*pChr != '\0') &&
+ (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1));
+ pChr++);
+
+ Max = pChr - pFile->m_pReadPtr;
+ pNewLine = (sal_Char*) rtl_allocateMemory( nLineBytes + Max + 1 );
+ if( pLine )
+ {
+ memcpy( pNewLine, pLine, nLineBytes );
+ rtl_freeMemory( pLine );
+ }
+ memcpy(pNewLine+nLineBytes, pFile->m_pReadPtr, Max);
+ nLineBytes += Max;
+ pNewLine[ nLineBytes ] = 0;
+ pLine = pNewLine;
+
+ if (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1))
+ {
+ if (*pChr != '\0')
+ {
+ if ((pChr[0] == '\r') && (pChr[1] == '\n'))
+ pChr += 2;
+ else
+ pChr += 1;
+ }
+
+ if ((pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf))) &&
+ (*pChr == '\0'))
+ pChr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);
+
+ /* setting Max to -1 indicates terminating read loop */
+ Max = -1;
+ }
+
+ pFile->m_pReadPtr = pChr;
+ }
+ while (Max > 0);
+
+ return pLine;
+}
+
+static sal_Bool OslProfile_putLine(osl_TFile* pFile, const sal_Char *pszLine)
+{
+ unsigned int Len = strlen(pszLine);
+
+#ifdef DEBUG_OSL_PROFILE
+ int strLen=0;
+#endif
+
+ if ( pFile == 0 || pFile->m_Handle < 0 )
+ {
+ return (sal_False);
+ }
+
+ if ( pFile->m_pWriteBuf == 0 )
+ {
+ pFile->m_pWriteBuf = (sal_Char*) malloc(Len+3);
+ pFile->m_nWriteBufLen = Len+3;
+ pFile->m_nWriteBufFree = Len+3;
+ }
+ else
+ {
+ if ( pFile->m_nWriteBufFree <= Len + 3 )
+ {
+ sal_Char* pTmp;
+
+ pTmp=(sal_Char*) realloc(pFile->m_pWriteBuf,( ( pFile->m_nWriteBufLen + Len ) * 2) );
+ if ( pTmp == 0 )
+ {
+ return sal_False;
+ }
+ pFile->m_pWriteBuf = pTmp;
+ pFile->m_nWriteBufFree = pFile->m_nWriteBufFree + pFile->m_nWriteBufLen + ( 2 * Len );
+ pFile->m_nWriteBufLen = ( pFile->m_nWriteBufLen + Len ) * 2;
+ memset( (pFile->m_pWriteBuf) + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ), 0, pFile->m_nWriteBufFree);
+ }
+ }
+
+
+
+ memcpy(pFile->m_pWriteBuf + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ),pszLine,Len+1);
+#ifdef DEBUG_OSL_PROFILE
+ strLen = strlen(pFile->m_pWriteBuf);
+#endif
+ pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len]='\n';
+ pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len + 1]='\0';
+
+ pFile->m_nWriteBufFree-=Len+1;
+
+ return sal_True;
+}
+
+/* platform specific end */
+
+static sal_Char* stripBlanks(sal_Char* String, sal_uInt32* pLen)
+{
+ if ( ( pLen != NULL ) && ( *pLen != 0 ) )
+ {
+ while ((String[*pLen - 1] == ' ') || (String[*pLen - 1] == '\t'))
+ (*pLen)--;
+
+ while ( (*String == ' ') || (*String == '\t') )
+ {
+ String++;
+ (*pLen)--;
+ }
+ }
+ else
+ while ( (*String == ' ') || (*String == '\t') )
+ String++;
+
+ return (String);
+}
+
+static sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line)
+{
+ if (pProfile->m_NoLines >= pProfile->m_MaxLines)
+ {
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_MaxLines = LINES_INI;
+ pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *));
+ memset(pProfile->m_Lines,0,pProfile->m_MaxLines * sizeof(sal_Char *));
+ }
+ else
+ {
+ unsigned int idx=0;
+ unsigned int oldmax=pProfile->m_MaxLines;
+
+ pProfile->m_MaxLines += LINES_ADD;
+ pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines,
+ pProfile->m_MaxLines * sizeof(sal_Char *));
+ for ( idx = oldmax ; idx < pProfile->m_MaxLines ; ++idx )
+ {
+ pProfile->m_Lines[idx]=0;
+ }
+ }
+
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_NoLines = 0;
+ pProfile->m_MaxLines = 0;
+ return (NULL);
+ }
+
+ }
+
+ if ( pProfile->m_Lines != 0 && pProfile->m_Lines[pProfile->m_NoLines] != 0 )
+ {
+ free(pProfile->m_Lines[pProfile->m_NoLines]);
+ }
+ pProfile->m_Lines[pProfile->m_NoLines++] = strdup(Line);
+
+ return (pProfile->m_Lines[pProfile->m_NoLines - 1]);
+}
+
+static sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo)
+{
+ if (pProfile->m_NoLines >= pProfile->m_MaxLines)
+ {
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_MaxLines = LINES_INI;
+ pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *));
+ memset(pProfile->m_Lines,0,pProfile->m_MaxLines * sizeof(sal_Char *));
+ }
+ else
+ {
+ pProfile->m_MaxLines += LINES_ADD;
+ pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines,
+ pProfile->m_MaxLines * sizeof(sal_Char *));
+
+ memset(&pProfile->m_Lines[pProfile->m_NoLines],
+ 0,
+ (pProfile->m_MaxLines - pProfile->m_NoLines - 1) * sizeof(sal_Char*));
+ }
+
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_NoLines = 0;
+ pProfile->m_MaxLines = 0;
+ return (NULL);
+ }
+ }
+
+ LineNo = LineNo > pProfile->m_NoLines ? pProfile->m_NoLines : LineNo;
+
+ if (LineNo < pProfile->m_NoLines)
+ {
+ sal_uInt32 i, n;
+ osl_TProfileSection* pSec;
+
+ memmove(&pProfile->m_Lines[LineNo + 1], &pProfile->m_Lines[LineNo],
+ (pProfile->m_NoLines - LineNo) * sizeof(sal_Char *));
+
+
+ /* adjust line references */
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if (pSec->m_Line >= LineNo)
+ pSec->m_Line++;
+
+ for (n = 0; n < pSec->m_NoEntries; n++)
+ if (pSec->m_Entries[n].m_Line >= LineNo)
+ pSec->m_Entries[n].m_Line++;
+ }
+ }
+
+ pProfile->m_NoLines++;
+
+ pProfile->m_Lines[LineNo] = strdup(Line);
+
+ return (pProfile->m_Lines[LineNo]);
+}
+
+static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo)
+{
+ if (LineNo < pProfile->m_NoLines)
+ {
+ free(pProfile->m_Lines[LineNo]);
+ pProfile->m_Lines[LineNo]=0;
+ if (pProfile->m_NoLines - LineNo > 1)
+ {
+ sal_uInt32 i, n;
+ osl_TProfileSection* pSec;
+
+ memmove(&pProfile->m_Lines[LineNo], &pProfile->m_Lines[LineNo + 1],
+ (pProfile->m_NoLines - LineNo - 1) * sizeof(sal_Char *));
+
+ memset(&pProfile->m_Lines[pProfile->m_NoLines - 1],
+ 0,
+ (pProfile->m_MaxLines - pProfile->m_NoLines) * sizeof(sal_Char*));
+
+ /* adjust line references */
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if (pSec->m_Line > LineNo)
+ pSec->m_Line--;
+
+ for (n = 0; n < pSec->m_NoEntries; n++)
+ if (pSec->m_Entries[n].m_Line > LineNo)
+ pSec->m_Entries[n].m_Line--;
+ }
+ }
+ else
+ {
+ pProfile->m_Lines[LineNo] = 0;
+ }
+
+ pProfile->m_NoLines--;
+ }
+
+ return;
+}
+
+static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection,
+ sal_uInt32 NoEntry, sal_uInt32 Line,
+ sal_Char* Entry, sal_uInt32 Len)
+{
+ Entry = stripBlanks(Entry, &Len);
+ pSection->m_Entries[NoEntry].m_Line = Line;
+ pSection->m_Entries[NoEntry].m_Offset = Entry - pProfile->m_Lines[Line];
+ pSection->m_Entries[NoEntry].m_Len = Len;
+
+ return;
+}
+
+static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection,
+ int Line, sal_Char* Entry, sal_uInt32 Len)
+{
+ if (pSection != NULL)
+ {
+ if (pSection->m_NoEntries >= pSection->m_MaxEntries)
+ {
+ if (pSection->m_Entries == NULL)
+ {
+ pSection->m_MaxEntries = ENTRIES_INI;
+ pSection->m_Entries = (osl_TProfileEntry *)malloc(
+ pSection->m_MaxEntries * sizeof(osl_TProfileEntry));
+ }
+ else
+ {
+ pSection->m_MaxEntries += ENTRIES_ADD;
+ pSection->m_Entries = (osl_TProfileEntry *)realloc(pSection->m_Entries,
+ pSection->m_MaxEntries * sizeof(osl_TProfileEntry));
+ }
+
+ if (pSection->m_Entries == NULL)
+ {
+ pSection->m_NoEntries = 0;
+ pSection->m_MaxEntries = 0;
+ return (sal_False);
+ }
+ }
+
+ pSection->m_NoEntries++;
+
+ Entry = stripBlanks(Entry, &Len);
+ setEntry(pProfile, pSection, pSection->m_NoEntries - 1, Line,
+ Entry, Len);
+
+ return (sal_True);
+ }
+
+ return (sal_False);
+}
+
+static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry)
+{
+ if (NoEntry < pSection->m_NoEntries)
+ {
+ if (pSection->m_NoEntries - NoEntry > 1)
+ {
+ memmove(&pSection->m_Entries[NoEntry],
+ &pSection->m_Entries[NoEntry + 1],
+ (pSection->m_NoEntries - NoEntry - 1) * sizeof(osl_TProfileEntry));
+ pSection->m_Entries[pSection->m_NoEntries - 1].m_Line=0;
+ pSection->m_Entries[pSection->m_NoEntries - 1].m_Offset=0;
+ pSection->m_Entries[pSection->m_NoEntries - 1].m_Len=0;
+ }
+
+ pSection->m_NoEntries--;
+ }
+
+ return;
+}
+
+static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len)
+{
+ if (pProfile->m_NoSections >= pProfile->m_MaxSections)
+ {
+ if (pProfile->m_Sections == NULL)
+ {
+ pProfile->m_MaxSections = SECTIONS_INI;
+ pProfile->m_Sections = (osl_TProfileSection *)malloc(pProfile->m_MaxSections * sizeof(osl_TProfileSection));
+ memset(pProfile->m_Sections,0,pProfile->m_MaxSections * sizeof(osl_TProfileSection));
+ }
+ else
+ {
+ unsigned int idx=0;
+ unsigned int oldmax=pProfile->m_MaxSections;
+
+ pProfile->m_MaxSections += SECTIONS_ADD;
+ pProfile->m_Sections = (osl_TProfileSection *)realloc(pProfile->m_Sections,
+ pProfile->m_MaxSections * sizeof(osl_TProfileSection));
+ for ( idx = oldmax ; idx < pProfile->m_MaxSections ; ++idx )
+ {
+ pProfile->m_Sections[idx].m_Entries=0;
+ }
+ }
+
+ if (pProfile->m_Sections == NULL)
+ {
+ pProfile->m_NoSections = 0;
+ pProfile->m_MaxSections = 0;
+ return (sal_False);
+ }
+ }
+
+ pProfile->m_NoSections++;
+
+ if ( pProfile->m_Sections[(pProfile->m_NoSections) - 1].m_Entries != 0 )
+ {
+ free(pProfile->m_Sections[(pProfile->m_NoSections) - 1].m_Entries);
+ }
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Entries = NULL;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_NoEntries = 0;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_MaxEntries = 0;
+
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Line = Line;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Offset = Section - pProfile->m_Lines[Line];
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Len = Len;
+
+ return (sal_True);
+}
+
+static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection)
+{
+ sal_uInt32 Section;
+
+ if ((Section = pSection - pProfile->m_Sections) < pProfile->m_NoSections)
+ {
+ free (pSection->m_Entries);
+ pSection->m_Entries=0;
+ if (pProfile->m_NoSections - Section > 1)
+ {
+ memmove(&pProfile->m_Sections[Section], &pProfile->m_Sections[Section + 1],
+ (pProfile->m_NoSections - Section - 1) * sizeof(osl_TProfileSection));
+
+ memset(&pProfile->m_Sections[pProfile->m_NoSections - 1],
+ 0,
+ (pProfile->m_MaxSections - pProfile->m_NoSections) * sizeof(osl_TProfileSection));
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Entries = 0;
+ }
+ else
+ {
+ pSection->m_Entries = 0;
+ }
+
+ pProfile->m_NoSections--;
+ }
+
+ return;
+}
+
+static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section,
+ const sal_Char* Entry, sal_uInt32 *pNoEntry)
+{
+static sal_uInt32 Sect = 0;
+ sal_uInt32 i, n;
+ sal_uInt32 Len;
+ const sal_Char* pStr;
+ osl_TProfileSection* pSec=0;
+
+ Len = strlen(Section);
+
+ n = Sect;
+
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ n %= pProfile->m_NoSections;
+ pSec = &pProfile->m_Sections[n];
+ if ((Len == pSec->m_Len) &&
+ (strncasecmp(Section, &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset], pSec->m_Len)
+ == 0))
+ break;
+ n++;
+ }
+
+ Sect = n;
+
+ if (i < pProfile->m_NoSections)
+ {
+ Len = strlen(Entry);
+
+ *pNoEntry = pSec->m_NoEntries;
+
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ {
+ pStr = &pProfile->m_Lines[pSec->m_Entries[i].m_Line]
+ [pSec->m_Entries[i].m_Offset];
+ if ((Len == pSec->m_Entries[i].m_Len) &&
+ (strncasecmp(Entry, pStr, pSec->m_Entries[i].m_Len)
+ == 0))
+ {
+ *pNoEntry = i;
+ break;
+ }
+ }
+ }
+ else
+ pSec = NULL;
+
+ return (pSec);
+}
+
+static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile)
+{
+ sal_uInt32 i;
+ sal_Char* pStr;
+ sal_Char* pChar;
+
+ sal_Char* pLine;
+ sal_Char* bWasAdded = NULL;
+
+ pProfile->m_NoLines = 0;
+ pProfile->m_NoSections = 0;
+
+ if ( pFile == 0 )
+ {
+ return sal_False;
+ }
+
+ if ( pProfile == 0 )
+ {
+ return sal_False;
+ }
+
+ OSL_VERIFY(OslProfile_rewindFile(pFile, sal_False));
+
+ while ( ( pLine=OslProfile_getLine(pFile) ) != 0 )
+ {
+ bWasAdded = addLine( pProfile, pLine );
+ rtl_freeMemory( pLine );
+ OSL_ASSERT(bWasAdded);
+ if ( ! bWasAdded )
+ return (sal_False);
+ }
+
+ for (i = 0; i < pProfile->m_NoLines; i++)
+ {
+ pStr = (sal_Char *)stripBlanks(pProfile->m_Lines[i], NULL);
+
+ if ((*pStr == '\0') || (*pStr == ';'))
+ continue;
+
+ if ((*pStr != '[') || ((pChar = strrchr(pStr, ']')) == NULL) ||
+ ((pChar - pStr) <= 2))
+ {
+ /* insert entry */
+
+ if (pProfile->m_NoSections < 1)
+ continue;
+
+ if ((pChar = strchr(pStr, '=')) == NULL)
+ pChar = pStr + strlen(pStr);
+
+ if (! addEntry(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1],
+ i, pStr, pChar - pStr))
+ {
+ OSL_ASSERT(0);
+ continue;
+ }
+
+ }
+ else
+ {
+ /* new section */
+
+ if (! addSection(pProfile, i, pStr + 1, pChar - pStr - 1))
+ {
+ OSL_ASSERT(0);
+ continue;
+ }
+
+ }
+ }
+
+ return (sal_True);
+}
+
+static sal_Bool storeProfile(osl_TProfileImpl* pProfile, sal_Bool bCleanup)
+{
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In storeProfile\n");
+#endif
+
+ if (pProfile->m_Lines != NULL)
+ {
+ if (pProfile->m_Flags & FLG_MODIFIED)
+ {
+ sal_uInt32 i;
+
+ osl_TFile* pTmpFile = osl_openTmpProfileImpl(pProfile);
+
+ if ( pTmpFile == 0 )
+ {
+ return sal_False;
+ }
+
+ OSL_VERIFY(OslProfile_rewindFile(pTmpFile, sal_True));
+
+ for ( i = 0 ; i < pProfile->m_NoLines ; i++ )
+ {
+ OSL_VERIFY(OslProfile_putLine(pTmpFile, pProfile->m_Lines[i]));
+ }
+
+ if ( ! writeProfileImpl(pTmpFile) )
+ {
+ if ( pTmpFile->m_pWriteBuf != 0 )
+ {
+ free(pTmpFile->m_pWriteBuf);
+ }
+
+ pTmpFile->m_pWriteBuf=0;
+ pTmpFile->m_nWriteBufLen=0;
+ pTmpFile->m_nWriteBufFree=0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out storeProfile [not flushed]\n");
+#endif
+ closeFileImpl(pTmpFile,pProfile->m_Flags);
+
+ return sal_False;
+ }
+
+ pProfile->m_Flags &= ~FLG_MODIFIED;
+
+ closeFileImpl(pProfile->m_pFile,pProfile->m_Flags);
+ closeFileImpl(pTmpFile,pProfile->m_Flags);
+
+ osl_ProfileSwapProfileNames(pProfile);
+
+ pProfile->m_pFile = openFileImpl(pProfile->m_FileName,pProfile->m_Flags);
+
+ }
+
+ if (bCleanup)
+ {
+ while (pProfile->m_NoLines > 0)
+ removeLine(pProfile, pProfile->m_NoLines - 1);
+
+ free(pProfile->m_Lines);
+ pProfile->m_Lines = NULL;
+ pProfile->m_NoLines = 0;
+ pProfile->m_MaxLines = 0;
+
+ while (pProfile->m_NoSections > 0)
+ removeSection(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1]);
+
+ free(pProfile->m_Sections);
+ pProfile->m_Sections = NULL;
+ pProfile->m_NoSections = 0;
+ pProfile->m_MaxSections = 0;
+ }
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out storeProfile [ok]\n");
+#endif
+ return (sal_True);
+}
+
+
+static osl_TFile* osl_openTmpProfileImpl(osl_TProfileImpl* pProfile)
+{
+ osl_TFile* pFile=0;
+ sal_Char* pszExtension = "tmp";
+ sal_Char pszTmpName[PATH_MAX];
+ oslProfileOption PFlags=0;
+
+ pszTmpName[0] = '\0';
+
+ /* generate tmp profilename */
+ osl_ProfileGenerateExtension(pProfile->m_FileName,pszExtension,pszTmpName);
+
+ if ( pszTmpName[0] == 0 )
+ {
+ return 0;
+ }
+
+ if ( ! ( pProfile->m_Flags & osl_Profile_READLOCK ) )
+ {
+ PFlags |= osl_Profile_WRITELOCK;
+ }
+
+ /* open this file */
+ pFile = openFileImpl(pszTmpName,pProfile->m_Flags | PFlags);
+
+
+ /* return new pFile */
+ return pFile;
+}
+
+static sal_Bool osl_ProfileSwapProfileNames(osl_TProfileImpl* pProfile)
+{
+ sal_Bool bRet = sal_False;
+
+ sal_Char pszBakFile[PATH_MAX];
+ sal_Char pszTmpFile[PATH_MAX];
+ sal_Char pszIniFile[PATH_MAX];
+
+ pszBakFile[0] = '\0';
+ pszTmpFile[0] = '\0';
+ pszIniFile[0] = '\0';
+
+ osl_ProfileGenerateExtension(pProfile->m_FileName,"bak",pszBakFile);
+
+ strcpy(pszIniFile,pProfile->m_FileName);
+
+ osl_ProfileGenerateExtension(pProfile->m_FileName,"tmp",pszTmpFile);
+
+ /* unlink bak */
+ unlink( pszBakFile );
+
+ /* rename ini bak */
+ rename( pszIniFile, pszBakFile );
+
+ /* rename tmp ini */
+ rename( pszTmpFile, pszIniFile );
+
+ return bRet;
+}
+
+
+static void osl_ProfileGenerateExtension(sal_Char* pszFileName, sal_Char* pszExtension, sal_Char* pszTmpName)
+{
+
+ strcpy(pszTmpName,pszFileName);
+ strcat(pszTmpName,".");
+ strcat(pszTmpName,pszExtension);
+
+ return;
+}
+
+
+static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile;
+ oslProfileOption PFlags=0;
+ sal_Bool bRet=sal_False;
+
+ if ( bWriteable )
+ {
+ PFlags = osl_Profile_DEFAULT | osl_Profile_WRITELOCK;
+ }
+ else
+ {
+ PFlags = osl_Profile_DEFAULT;
+ }
+
+
+ if (pProfile == NULL)
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("AUTOOPEN MODE\n");
+#endif
+
+ if ( ( pProfile = (osl_TProfileImpl*) osl_openProfile(0, PFlags ) ) != NULL )
+ {
+ pProfile->m_Flags |= FLG_AUTOOPEN;
+ }
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("try to acquire\n");
+#endif
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (! (pProfile->m_Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE )))
+ {
+ osl_TStamp Stamp;
+
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("Profile acquire DEFAULT MODE\n");
+#endif
+ if (! (pProfile->m_pFile = openFileImpl(pProfile->m_FileName, pProfile->m_Flags | PFlags )))
+ return NULL;
+
+ Stamp = OslProfile_getFileStamp(pProfile->m_pFile);
+
+ if (memcmp(&Stamp, &(pProfile->m_Stamp), sizeof(osl_TStamp)))
+ {
+ pProfile->m_Stamp = Stamp;
+
+ bRet=loadProfile(pProfile->m_pFile, pProfile);
+ OSL_ASSERT(bRet);
+ }
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("Profile acquire READ/WRITELOCK MODE\n");
+#endif
+ /* A readlock file could not be written */
+ if ((pProfile->m_Flags & osl_Profile_READLOCK) && bWriteable)
+ {
+ return (NULL);
+ }
+ }
+ }
+ }
+
+ return (pProfile);
+}
+
+static sal_Bool releaseProfile(osl_TProfileImpl* pProfile)
+{
+ sal_Bool bRet=sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In releaseProfile\n");
+#endif
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [profile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ if (pProfile->m_Flags & FLG_AUTOOPEN)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [AUTOOPEN]\n");
+#endif
+ return (osl_closeProfile((oslProfile)pProfile));
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("DEFAULT MODE\n");
+#endif
+ if (! (pProfile->m_Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE )))
+ {
+ if (pProfile->m_Flags & FLG_MODIFIED)
+ {
+ bRet=storeProfile(pProfile, sal_False);
+ OSL_ASSERT(bRet);
+ }
+
+
+ closeFileImpl(pProfile->m_pFile,pProfile->m_Flags);
+ pProfile->m_pFile = NULL;
+ }
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [ok]\n");
+#endif
+ return (sal_True);
+}
diff --git a/sal/osl/unx/salinit.cxx b/sal/osl/unx/salinit.cxx
new file mode 100644
index 000000000000..7090a381235c
--- /dev/null
+++ b/sal/osl/unx/salinit.cxx
@@ -0,0 +1,43 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "precompiled_sal.hxx"
+#include "sal/config.h"
+
+#include "osl/process.h"
+#include "sal/main.h"
+#include "sal/types.h"
+
+extern "C" {
+
+void SAL_CALL sal_detail_initialize(int argc, char ** argv) {
+ osl_setCommandArgs(argc, argv);
+}
+
+void SAL_CALL sal_detail_deinitialize() {}
+
+}
diff --git a/sal/osl/unx/secimpl.h b/sal/osl/unx/secimpl.h
new file mode 100644
index 000000000000..1d8f2aaa9419
--- /dev/null
+++ b/sal/osl/unx/secimpl.h
@@ -0,0 +1,47 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SECURITYIMPL_H_
+#define _OSL_SECURITYIMPL_H_
+
+#include <pwd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _oslSecurityImpl {
+ struct passwd m_pPasswd;
+ char m_buffer[1]; /* should be a C99 flexible array member */
+} oslSecurityImpl;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/sal/osl/unx/security.c b/sal/osl/unx/security.c
new file mode 100644
index 000000000000..d08326e65ebe
--- /dev/null
+++ b/sal/osl/unx/security.c
@@ -0,0 +1,862 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <stddef.h>
+
+/* Solaris 8 has no C99 stdint.h, and Solaris generally seems not to miss it for
+ SIZE_MAX: */
+#if !defined __SUNPRO_C
+#include <stdint.h>
+#endif
+
+#include "system.h"
+
+#include <osl/security.h>
+#include <osl/diagnose.h>
+
+#include "osl/thread.h"
+#include "osl/file.h"
+
+#if defined LINUX || defined SOLARIS
+#include <crypt.h>
+#endif
+
+#include "secimpl.h"
+
+#ifndef NOPAM
+#ifndef PAM_BINARY_MSG
+#define PAM_BINARY_MSG 6
+#endif
+#endif
+
+static oslSecurityError SAL_CALL
+osl_psz_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd,
+ oslSecurity* pSecurity);
+sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax);
+static sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax);
+static sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax);
+static sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax);
+
+static sal_Bool sysconf_SC_GETPW_R_SIZE_MAX(size_t * value) {
+#if defined _SC_GETPW_R_SIZE_MAX
+ long m;
+ errno = 0;
+ m = sysconf(_SC_GETPW_R_SIZE_MAX);
+ if (m == -1) {
+ /* _SC_GETPW_R_SIZE_MAX has no limit; some platforms like certain
+ FreeBSD versions support sysconf(_SC_GETPW_R_SIZE_MAX) in a broken
+ way and always set EINVAL, so be resilient here: */
+ return sal_False;
+ } else {
+ OSL_ASSERT(m >= 0 && (unsigned long) m < SIZE_MAX);
+ *value = (size_t) m;
+ return sal_True;
+ }
+#else
+ /* some platforms like Mac OS X 1.3 do not define _SC_GETPW_R_SIZE_MAX: */
+ return sal_False;
+#endif
+}
+
+static oslSecurityImpl * growSecurityImpl(
+ oslSecurityImpl * impl, size_t * bufSize)
+{
+ size_t n = 0;
+ oslSecurityImpl * p = NULL;
+ if (impl == NULL) {
+ if (!sysconf_SC_GETPW_R_SIZE_MAX(&n)) {
+ /* choose something sensible (the callers of growSecurityImpl will
+ detect it if the allocated buffer is too small: */
+ n = 1024;
+ }
+ } else if (*bufSize <= SIZE_MAX / 2) {
+ n = 2 * *bufSize;
+ }
+ if (n != 0) {
+ if (n <= SIZE_MAX - offsetof(oslSecurityImpl, m_buffer)) {
+ *bufSize = n;
+ n += offsetof(oslSecurityImpl, m_buffer);
+ } else {
+ *bufSize = SIZE_MAX - offsetof(oslSecurityImpl, m_buffer);
+ n = SIZE_MAX;
+ }
+ p = realloc(impl, n);
+ }
+ if (p == NULL) {
+ free(impl);
+ }
+ return p;
+}
+
+static void deleteSecurityImpl(oslSecurityImpl * impl) {
+ free(impl);
+}
+
+oslSecurity SAL_CALL osl_getCurrentSecurity()
+{
+ size_t n = 0;
+ oslSecurityImpl * p = NULL;
+ for (;;) {
+ struct passwd * found;
+ p = growSecurityImpl(p, &n);
+ if (p == NULL) {
+ return NULL;
+ }
+ switch (getpwuid_r(getuid(), &p->m_pPasswd, p->m_buffer, n, &found)) {
+ case ERANGE:
+ break;
+ case 0:
+ if (found != NULL) {
+ return p;
+ }
+ /* fall through */
+ default:
+ deleteSecurityImpl(p);
+ return NULL;
+ }
+ }
+}
+
+
+#if defined LINUX && !defined NOPAM
+
+/*
+ *
+ * osl Routines for Pluggable Authentication Modules (PAM)
+ * tested with Linux-PAM 0.66 on Redhat-6.0 and
+ * Linux-PAM 0.64 on RedHat-5.2,
+ * XXX Will probably not run on PAM 0.59 or prior, since
+ * number of pam_response* responses has changed
+ *
+ */
+
+#include <security/pam_appl.h>
+
+typedef struct {
+ char* name;
+ char* password;
+} sal_PamData;
+
+typedef struct {
+ int (*pam_start)(const char *service_name, const char *user,
+ const struct pam_conv *pam_conversation,
+ pam_handle_t **pamh);
+ int (*pam_end) (pam_handle_t *pamh, int pam_status);
+ int (*pam_authenticate) (pam_handle_t *pamh, int flags);
+ int (*pam_acct_mgmt) (pam_handle_t *pamh, int flags);
+} sal_PamModule;
+
+/*
+ * Implement a pam-conversation callback-routine,
+ * it just supply name and password instead of prompting the user.
+ * I guess that echo-off means 'ask for password' and echo-on means
+ * 'ask for user-name'. In fact I've never been asked anything else
+ * than the password
+ * XXX Please notice that if a pam-module does ask anything else, we
+ * are completely lost, and a pam-module is free to do so
+ * XXX
+ */
+
+static int
+osl_PamConversation (int num_msg, const struct pam_message **msgm,
+ struct pam_response **response, void *appdata_ptr)
+{
+ int i;
+ sal_Bool error;
+ sal_PamData *pam_data;
+ struct pam_response *p_reply;
+
+ /* resource initialization */
+ pam_data = (sal_PamData*) appdata_ptr;
+ p_reply = (struct pam_response *) calloc( num_msg,
+ sizeof(struct pam_response));
+ if ( p_reply == NULL || pam_data == NULL )
+ {
+ if ( p_reply != NULL )
+ free ( p_reply );
+ *response = NULL;
+ return PAM_CONV_ERR;
+ }
+
+ /* pseudo dialog */
+ error = sal_False;
+ for ( i = 0; i < num_msg ; i++ )
+ {
+ switch ( msgm[ i ]->msg_style )
+ {
+ case PAM_PROMPT_ECHO_OFF:
+ p_reply[ i ].resp_retcode = 0;
+ p_reply[ i ].resp = strdup( pam_data->password );
+ break;
+ case PAM_PROMPT_ECHO_ON:
+ p_reply[ i ].resp_retcode = 0;
+ p_reply[ i ].resp = strdup( pam_data->name );
+ break;
+ case PAM_ERROR_MSG:
+ case PAM_TEXT_INFO:
+ case PAM_BINARY_PROMPT:
+ case PAM_BINARY_MSG:
+ p_reply[ i ].resp_retcode = 0;
+ p_reply[ i ].resp = NULL;
+ break;
+ default:
+ error = sal_True;
+ break;
+ }
+ }
+
+ /* free resources on error */
+ if ( error )
+ {
+ for ( i = 0; i < num_msg ; i++ )
+ if ( p_reply[ i ].resp )
+ {
+ memset ( p_reply[ i ].resp, 0,
+ strlen( p_reply[ i ].resp ) );
+ free ( p_reply[ i ].resp );
+ }
+ free ( p_reply );
+
+ *response = NULL;
+ return PAM_CONV_ERR;
+ }
+
+ /* well done */
+ *response = p_reply;
+ return PAM_SUCCESS;
+}
+
+#ifndef PAM_LINK
+/*
+ * avoid linking against libpam.so, since it is not available on all systems,
+ * instead load-on-call, returns structure which holds pointer to
+ * pam-functions,
+ * library is never closed in case of success
+ */
+
+static sal_PamModule* osl_getPAM()
+{
+ static sal_PamModule *pam_module = NULL;
+ static sal_Bool load_once = sal_False;
+
+ if ( !load_once )
+ {
+ /* get library-handle. cannot use osl-module, since
+ RTLD_GLOBAL is required for PAM-0.64 RH 5.2
+ (but not for PAM-0.66 RH 6.0) */
+ void *pam_hdl;
+
+ pam_hdl = dlopen( "libpam.so.0", RTLD_GLOBAL | RTLD_LAZY );
+
+ if ( pam_hdl != NULL )
+ pam_module = (sal_PamModule*)calloc( 1, sizeof(sal_PamModule) );
+
+ /* load functions */
+ if ( pam_module != NULL )
+ {
+ pam_module->pam_acct_mgmt = (int (*)(pam_handle_t *, int)) dlsym ( pam_hdl, "pam_acct_mgmt" );
+ pam_module->pam_authenticate
+ = (int (*)(pam_handle_t *, int)) dlsym ( pam_hdl, "pam_authenticate" );
+ pam_module->pam_end = (int (*)(pam_handle_t *, int)) dlsym ( pam_hdl, "pam_end" );
+ pam_module->pam_start = (int (*)(const char *, const char *, const struct pam_conv *, pam_handle_t **)) dlsym ( pam_hdl, "pam_start" );
+
+ /* free resources, if not completely successful */
+ if ( (pam_module->pam_start == NULL)
+ || (pam_module->pam_end == NULL)
+ || (pam_module->pam_authenticate == NULL)
+ || (pam_module->pam_acct_mgmt == NULL) )
+ {
+ free( pam_module );
+ pam_module = NULL;
+ dlclose( pam_hdl );
+ }
+ }
+
+ /* never try again */
+ load_once = sal_True;
+ }
+
+ return pam_module;
+}
+#endif
+
+/*
+ * User Identification using PAM
+ */
+
+static sal_Bool
+osl_PamAuthentification( const sal_Char* name, const sal_Char* password )
+{
+ sal_Bool success = sal_False;
+
+#ifndef PAM_LINK
+ sal_PamModule* pam_module;
+
+ pam_module = osl_getPAM();
+ if ( pam_module != NULL )
+ {
+#endif
+ pam_handle_t *pam_handle = NULL;
+ struct pam_conv pam_conversation;
+ sal_PamData pam_data;
+
+ int return_value;
+
+ pam_data.name = (char*) name;
+ pam_data.password = (char*) password;
+
+ pam_conversation.conv = osl_PamConversation;
+ pam_conversation.appdata_ptr = (void*)(&pam_data);
+
+#ifndef PAM_LINK
+ return_value = pam_module->pam_start( "su", name,
+ &pam_conversation, &pam_handle);
+#else
+ return_value = pam_start( "su", name,
+ &pam_conversation, &pam_handle);
+#endif
+ if (return_value == PAM_SUCCESS )
+#ifndef PAM_LINK
+ return_value = pam_module->pam_authenticate(pam_handle, 0);
+#else
+ return_value = pam_authenticate(pam_handle, 0);
+#endif
+ if (return_value == PAM_SUCCESS )
+#ifndef PAM_LINK
+ return_value = pam_module->pam_acct_mgmt(pam_handle, 0);
+ pam_module->pam_end( pam_handle, return_value );
+#else
+ return_value = pam_acct_mgmt(pam_handle, 0);
+ pam_end( pam_handle, return_value );
+#endif
+
+ success = (sal_Bool)(return_value == PAM_SUCCESS);
+#ifndef PAM_LINK
+ }
+#endif
+
+ return success;
+}
+
+
+#ifndef CRYPT_LINK
+/* dummy crypt, matches the interface of
+ crypt() but does not encrypt at all */
+static const sal_Char* SAL_CALL
+osl_noCrypt ( const sal_Char *key, const sal_Char *salt )
+{
+ (void) salt; /* unused */
+ return key;
+}
+
+/* load-on-call crypt library and crypt symbol */
+static void* SAL_CALL
+osl_getCrypt()
+{
+ static char* (*crypt_sym)(const char*, const char*) = NULL;
+ static sal_Bool load_once = sal_False;
+
+ if ( !load_once )
+ {
+ void * crypt_library;
+
+ crypt_library = dlopen( "libcrypt.so.1", RTLD_GLOBAL | RTLD_LAZY ); /* never closed */
+ if ( crypt_library != NULL )
+ crypt_sym = (char* (*)(const char *, const char *)) dlsym(crypt_library, "crypt" );
+ if ( crypt_sym == NULL ) /* no libcrypt or libcrypt without crypt */
+ crypt_sym = (char* (*)(const char *, const char *)) &osl_noCrypt;
+
+ load_once = sal_True;
+ }
+
+ return (void*)crypt_sym;
+}
+
+/* replacement for crypt function for password encryption, uses either
+ strong encryption of dlopen'ed libcrypt.so.1 or dummy implementation
+ with no encryption. Objective target is to avoid linking against
+ libcrypt (not available on caldera open linux 2.2 #63822#) */
+static sal_Char* SAL_CALL
+osl_dynamicCrypt ( const sal_Char *key, const sal_Char *salt )
+{
+ char* (*dynamic_crypt)(char *, char *);
+
+ dynamic_crypt = (char * (*)(char *, char *)) osl_getCrypt();
+
+ return dynamic_crypt( (sal_Char*)key, (sal_Char*)salt );
+}
+#endif
+
+/*
+ * compare an encrypted and an unencrypted password for equality
+ * returns true if passwords are equal, false otherwise
+ * Note: uses crypt() and a mutex instead of crypt_r() since crypt_r needs
+ * more than 128KByte of external buffer for struct crypt_data
+ */
+
+static sal_Bool SAL_CALL
+osl_equalPasswords ( const sal_Char *pEncryptedPassword, const sal_Char *pPlainPassword )
+{
+ static pthread_mutex_t crypt_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+ sal_Bool success;
+ sal_Char salt[3];
+ sal_Char *encrypted_plain;
+
+ salt[0] = pEncryptedPassword[0];
+ salt[1] = pEncryptedPassword[1];
+ salt[2] = '\0';
+
+ pthread_mutex_lock(&crypt_mutex);
+
+#ifndef CRYPT_LINK
+ encrypted_plain = (sal_Char *)osl_dynamicCrypt( pPlainPassword, salt );
+#else
+ encrypted_plain = (sal_Char *)crypt( pPlainPassword, salt );
+#endif
+ success = (sal_Bool) (strcmp(pEncryptedPassword, encrypted_plain) == 0);
+
+ pthread_mutex_unlock(&crypt_mutex);
+
+ return success;
+}
+
+#endif /* defined LINUX && !defined NOPAM */
+oslSecurityError SAL_CALL osl_loginUser(
+ rtl_uString *ustrUserName,
+ rtl_uString *ustrPassword,
+ oslSecurity *pSecurity
+ )
+{
+ oslSecurityError Error;
+ rtl_String* strUserName=0;
+ rtl_String* strPassword=0;
+ sal_Char* pszUserName=0;
+ sal_Char* pszPassword=0;
+
+ if ( ustrUserName != 0 )
+ {
+
+ rtl_uString2String( &strUserName,
+ rtl_uString_getStr(ustrUserName),
+ rtl_uString_getLength(ustrUserName),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszUserName = rtl_string_getStr(strUserName);
+ }
+
+
+ if ( ustrPassword != 0 )
+ {
+ rtl_uString2String( &strPassword,
+ rtl_uString_getStr(ustrPassword),
+ rtl_uString_getLength(ustrPassword),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszPassword = rtl_string_getStr(strPassword);
+ }
+
+
+ Error=osl_psz_loginUser(pszUserName,pszPassword,pSecurity);
+
+ if ( strUserName != 0 )
+ {
+ rtl_string_release(strUserName);
+ }
+
+ if ( strPassword)
+ {
+ rtl_string_release(strPassword);
+ }
+
+
+ return Error;
+}
+
+
+static oslSecurityError SAL_CALL
+osl_psz_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd,
+ oslSecurity* pSecurity)
+{
+#if defined NETBSD || defined SCO || defined AIX || defined FREEBSD || \
+ defined MACOSX
+
+ return osl_Security_E_None;
+
+#else
+
+ oslSecurityError nError = osl_Security_E_Unknown;
+ oslSecurityImpl * p = NULL;
+ if (pszUserName != NULL && pszPasswd != NULL && pSecurity != NULL) {
+ /* get nis or normal password, should succeed for any known user, but
+ perhaps the password is wrong (i.e. 'x') if shadow passwords are in
+ use or authentication must be done by PAM */
+ size_t n = 0;
+ int err = 0;
+ struct passwd * found = NULL;
+ for (;;) {
+ p = growSecurityImpl(p, &n);
+ if (p == NULL) {
+ break;
+ }
+ err = getpwnam_r(
+ pszUserName, &p->m_pPasswd, p->m_buffer, n, &found);
+ if (err != ERANGE) {
+ break;
+ }
+ }
+ if (p != NULL && err == 0) {
+ if (found == NULL) {
+ nError = osl_Security_E_UserUnknown;
+ } else {
+#if defined LINUX && !defined NOPAM
+ /* only root is able to read the /etc/shadow passwd, a normal
+ user even can't read his own encrypted passwd */
+ if (osl_equalPasswords(p->m_pPasswd.pw_passwd, pszPasswd) ||
+ osl_PamAuthentification(pszUserName, pszPasswd))
+ {
+ nError = osl_Security_E_None;
+ } else {
+ char buffer[1024];
+ struct spwd result_buf;
+ struct spwd * pShadowPasswd;
+ buffer[0] = '\0';
+ if (getspnam_r(
+ pszUserName, &result_buf, buffer, sizeof buffer,
+ &pShadowPasswd) == 0 &&
+ pShadowPasswd != NULL)
+ {
+ nError =
+ osl_equalPasswords(
+ pShadowPasswd->sp_pwdp, pszPasswd)
+ ? osl_Security_E_None
+ : osl_Security_E_WrongPassword;
+ } else if (getuid() == 0) {
+ /* mfe: Try to verify the root-password via nis */
+ if (getspnam_r(
+ "root", &result_buf, buffer, sizeof buffer,
+ &pShadowPasswd) == 0 &&
+ pShadowPasswd != NULL &&
+ osl_equalPasswords(
+ pShadowPasswd->sp_pwdp, pszPasswd))
+ {
+ nError = osl_Security_E_None;
+ } else {
+ /* mfe: we can't get via nis (glibc2.0.x has bug in
+ getspnam_r) we try it with the normal getspnam */
+ static pthread_mutex_t pwmutex =
+ PTHREAD_MUTEX_INITIALIZER;
+ pthread_mutex_lock(&pwmutex);
+ pShadowPasswd = getspnam("root");
+ pthread_mutex_unlock(&pwmutex);
+ nError =
+ ((pShadowPasswd != NULL &&
+ osl_equalPasswords(
+ pShadowPasswd->sp_pwdp, pszPasswd)) ||
+ osl_PamAuthentification("root", pszPasswd))
+ ? osl_Security_E_None
+ : osl_Security_E_WrongPassword;
+ }
+ }
+ }
+#else
+ char buffer[1024];
+ struct spwd spwdStruct;
+ buffer[0] = '\0';
+#ifndef NEW_SHADOW_API
+ if (getspnam_r(pszUserName, &spwdStruct, buffer, sizeof buffer) != NULL)
+#else
+ if (getspnam_r(pszUserName, &spwdStruct, buffer, sizeof buffer, NULL) == 0)
+#endif
+ {
+ char salt[3];
+ char * cryptPasswd;
+ strncpy(salt, spwdStruct.sp_pwdp, 2);
+ salt[2] = '\0';
+ cryptPasswd = (char *) crypt(pszPasswd, salt);
+ if (strcmp(spwdStruct.sp_pwdp, cryptPasswd) == 0) {
+ nError = osl_Security_E_None;
+ } else if (getuid() == 0 &&
+#ifndef NEW_SHADOW_API
+ (getspnam_r("root", &spwdStruct, buffer, sizeof buffer) != NULL))
+#else
+ (getspnam_r("root", &spwdStruct, buffer, sizeof buffer, NULL) == 0))
+#endif
+ {
+ /* if current process is running as root, allow to logon
+ as any other user */
+ strncpy(salt, spwdStruct.sp_pwdp, 2);
+ salt[2] = '\0';
+ cryptPasswd = (char *) crypt(pszPasswd, salt);
+ if (strcmp(spwdStruct.sp_pwdp, cryptPasswd) == 0) {
+ nError = osl_Security_E_None;
+ }
+ } else {
+ nError = osl_Security_E_WrongPassword;
+ }
+ }
+#endif
+ }
+ }
+ }
+ if (nError == osl_Security_E_None) {
+ *pSecurity = p;
+ } else {
+ deleteSecurityImpl(p);
+ *pSecurity = NULL;
+ }
+ return nError;
+
+#endif
+}
+
+oslSecurityError SAL_CALL osl_loginUserOnFileServer(
+ rtl_uString *strUserName,
+ rtl_uString *strPasswd,
+ rtl_uString *strFileServer,
+ oslSecurity *pSecurity
+ )
+{
+ (void) strUserName; /* unused */
+ (void) strPasswd; /* unused */
+ (void) strFileServer; /* unused */
+ (void) pSecurity; /* unused */
+ return osl_Security_E_UserUnknown;
+}
+
+
+sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, rtl_uString **ustrIdent)
+{
+ sal_Bool bRet=sal_False;
+ sal_Char pszIdent[1024];
+
+ pszIdent[0] = '\0';
+
+ bRet = osl_psz_getUserIdent(Security,pszIdent,sizeof(pszIdent));
+
+ rtl_string2UString( ustrIdent, pszIdent, rtl_str_getLength( pszIdent ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*ustrIdent != NULL);
+
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax)
+{
+ sal_Char buffer[32];
+ sal_Int32 nChr;
+
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
+
+ if (pSecImpl == NULL)
+ return sal_False;
+
+ nChr = snprintf(buffer, sizeof(buffer), "%u", pSecImpl->m_pPasswd.pw_uid);
+ if ( nChr < 0 || SAL_INT_CAST(sal_uInt32, nChr) >= sizeof(buffer)
+ || SAL_INT_CAST(sal_uInt32, nChr) >= nMax )
+ return sal_False; /* leave *pszIdent unmodified in case of failure */
+
+ memcpy(pszIdent, buffer, nChr+1);
+ return sal_True;
+}
+
+sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **ustrName)
+{
+ sal_Bool bRet=sal_False;
+ sal_Char pszName[1024];
+
+ pszName[0] = '\0';
+
+ bRet = osl_psz_getUserName(Security,pszName,sizeof(pszName));
+
+ rtl_string2UString( ustrName, pszName, rtl_str_getLength( pszName ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*ustrName != NULL);
+
+ return bRet;
+}
+
+
+
+static sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax)
+{
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
+
+ if (pSecImpl == NULL)
+ return sal_False;
+
+ strncpy(pszName, pSecImpl->m_pPasswd.pw_name, nMax);
+
+ return sal_True;
+}
+
+sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **pustrDirectory)
+{
+ sal_Bool bRet=sal_False;
+ sal_Char pszDirectory[PATH_MAX];
+
+ pszDirectory[0] = '\0';
+
+ bRet = osl_psz_getHomeDir(Security,pszDirectory,sizeof(pszDirectory));
+
+ if ( bRet == sal_True )
+ {
+ rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( pszDirectory ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*pustrDirectory != NULL);
+ osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory );
+ }
+
+ return bRet;
+}
+
+
+static sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax)
+{
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
+
+ if (pSecImpl == NULL)
+ return sal_False;
+
+ /* if current user, check also environment for HOME */
+ if (getuid() == pSecImpl->m_pPasswd.pw_uid)
+ {
+ sal_Char *pStr = NULL;
+#ifdef SOLARIS
+ char buffer[8192];
+
+ struct passwd pwd;
+ struct passwd *ppwd;
+
+#ifdef _POSIX_PTHREAD_SEMANTICS
+ if ( 0 != getpwuid_r(getuid(), &pwd, buffer, sizeof(buffer), &ppwd ) )
+ ppwd = NULL;
+#else
+ ppwd = getpwuid_r(getuid(), &pwd, buffer, sizeof(buffer) );
+#endif
+
+ if ( ppwd )
+ pStr = ppwd->pw_dir;
+#else
+ pStr = getenv("HOME");
+#endif
+
+ if ((pStr != NULL) && (strlen(pStr) > 0) &&
+ (access(pStr, 0) == 0))
+ strncpy(pszDirectory, pStr, nMax);
+ else
+ strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax);
+ }
+ else
+ strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax);
+
+ return sal_True;
+}
+
+sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **pustrDirectory)
+{
+ sal_Bool bRet = sal_False;
+ sal_Char pszDirectory[PATH_MAX];
+
+ pszDirectory[0] = '\0';
+
+ bRet = osl_psz_getConfigDir(Security,pszDirectory,sizeof(pszDirectory));
+
+ if ( bRet == sal_True )
+ {
+ rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( pszDirectory ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*pustrDirectory != NULL);
+ osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory );
+ }
+
+ return bRet;
+}
+
+#ifndef MACOSX
+
+static sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax)
+{
+ sal_Char *pStr = getenv("XDG_CONFIG_HOME");
+
+ if ((pStr == NULL) || (strlen(pStr) == 0) ||
+ (access(pStr, 0) != 0))
+ return (osl_psz_getHomeDir(Security, pszDirectory, nMax));
+
+ strncpy(pszDirectory, pStr, nMax);
+ return sal_True;
+}
+
+#else
+
+/*
+ * FIXME: rewrite to use more flexible
+ * NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES)
+ * as soon as we can bumb the baseline to Tiger (for NSApplicationSupportDirectory) and have
+ * support for Objective-C in the build environment
+ */
+
+#define MACOSX_CONFIG_DIR "/Library/Application Support"
+static sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax)
+{
+ if( osl_psz_getHomeDir(Security, pszDirectory, nMax - sizeof(MACOSX_CONFIG_DIR) + 1) )
+ {
+ strcat( pszDirectory, MACOSX_CONFIG_DIR );
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+#endif
+
+sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security)
+{
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security;
+
+ if (pSecImpl == NULL)
+ return sal_False;
+
+ if (pSecImpl->m_pPasswd.pw_uid != 0)
+ return (sal_False);
+
+ return (sal_True);
+}
+
+void SAL_CALL osl_freeSecurityHandle(oslSecurity Security)
+{
+ deleteSecurityImpl(Security);
+}
+
+
+sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security)
+{
+ (void) Security; /* unused */
+ return sal_False;
+}
+
+void SAL_CALL osl_unloadUserProfile(oslSecurity Security)
+{
+ (void) Security; /* unused */
+}
diff --git a/sal/osl/unx/semaphor.c b/sal/osl/unx/semaphor.c
new file mode 100644
index 000000000000..c514b2dacff6
--- /dev/null
+++ b/sal/osl/unx/semaphor.c
@@ -0,0 +1,314 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/semaphor.h>
+#include <osl/diagnose.h>
+
+#ifndef OSL_USE_SYS_V_SEMAPHORE
+
+/* This is the (default) POSIX thread-local semaphore variant */
+
+/*
+ Implemetation notes:
+ The void* represented by oslSemaphore is used
+ as a pointer to an sem_t struct
+*/
+
+/*****************************************************************************/
+/* osl_createSemaphore */
+/*****************************************************************************/
+
+oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount)
+{
+ int ret = 0;
+ oslSemaphore Semaphore;
+
+ Semaphore= malloc(sizeof(sem_t));
+
+ OSL_ASSERT(Semaphore); /* ptr valid? */
+
+ if ( Semaphore == 0 )
+ {
+ return 0;
+ }
+
+ /* unnamed semaphore, not shared between processes */
+
+ ret= sem_init((sem_t*)Semaphore, 0, initialCount);
+
+ /* create failed? */
+ if (ret != 0)
+ {
+ OSL_TRACE("osl_createSemaphore failed. Errno: %d; %s\n",
+ errno,
+ strerror(errno));
+
+ free(Semaphore);
+ Semaphore = NULL;
+ }
+
+ return Semaphore;
+}
+
+/*****************************************************************************/
+/* osl_destroySemaphore */
+/*****************************************************************************/
+void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore)
+{
+ if(Semaphore) /* ptr valid? */
+ {
+ sem_destroy((sem_t*)Semaphore);
+ free(Semaphore);
+ }
+}
+
+/*****************************************************************************/
+/* osl_acquireSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore) {
+
+ OSL_ASSERT(Semaphore != 0); /* abort in debug mode */
+
+ if (Semaphore != 0) /* be tolerant in release mode */
+ {
+ return (sem_wait((sem_t*)Semaphore) == 0);
+ }
+
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_tryToAcquireSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore) {
+
+ OSL_ASSERT(Semaphore != 0); /* abort in debug mode */
+ if (Semaphore != 0) /* be tolerant in release mode */
+ {
+ return (sem_trywait((sem_t*)Semaphore) == 0);
+ }
+
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_releaseSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore) {
+
+ OSL_ASSERT(Semaphore != 0); /* abort in debug mode */
+
+ if (Semaphore != 0) /* be tolerant in release mode */
+ {
+ return (sem_post((sem_t*)Semaphore) == 0);
+ }
+
+ return sal_False;
+}
+
+#else /* OSL_USE_SYS_V_SEMAPHORE */
+
+/*******************************************************************************/
+
+/* This is the SYS V private semaphore variant */
+
+/*
+ Implemetation notes:
+ The void* represented by oslSemaphore is used
+ as a pointer to an osl_TSemImpl struct
+*/
+
+
+#if defined(NETBSD)
+union semun {
+ int val; /* value for SETVAL */
+ struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
+ u_short *array; /* array for GETALL & SETALL */
+};
+#endif
+
+typedef struct _osl_TSemImpl
+{
+ int m_Id;
+
+} osl_TSemImpl;
+
+/*****************************************************************************/
+/* osl_createSemaphore */
+/*****************************************************************************/
+oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount)
+{
+ union semun arg;
+
+ oslSemaphore Semaphore;
+ osl_TSemImpl* pSem;
+
+ Semaphore= malloc(sizeof(osl_TSemImpl));
+ OSL_POSTCOND(Semaphore, "malloc failed\n"); /* ptr valid? */
+
+ pSem= (osl_TSemImpl*)Semaphore;
+
+
+ /* unnamed (private) semaphore */
+
+ pSem->m_Id= semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT);
+
+
+ /* create failed? */
+ if (pSem->m_Id < 0)
+ {
+ OSL_TRACE("osl_createSemaphore failed (semget). Errno: %d; %s\n",
+ errno,
+ strerror(errno));
+
+ free(Semaphore);
+ return 0;
+ }
+
+ /* set initial count */
+
+ arg.val= initialCount;
+
+ if(semctl(pSem->m_Id, 0, SETVAL, arg) < 0)
+ {
+ OSL_TRACE("osl_createSemaphore failed (semctl(SETVAL)). Errno: %d; %s\n",
+ errno,
+ strerror(errno));
+
+ if(semctl(pSem->m_Id, 0, IPC_RMID, arg) < 0)
+ {
+ OSL_TRACE("semctl(IPC_RMID) failed. Errno: %d; %s\n", errno, strerror(errno));
+ }
+
+ free(Semaphore);
+ return 0;
+ }
+
+
+ return Semaphore;
+}
+
+/*****************************************************************************/
+/* osl_destroySemaphore */
+/*****************************************************************************/
+void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore) {
+
+ if(Semaphore) /* ptr valid? */
+ {
+ union semun arg;
+
+ osl_TSemImpl* pSem= (osl_TSemImpl*)Semaphore;
+
+ if(semctl(pSem->m_Id, 0, IPC_RMID, arg) < 0)
+
+ {
+ OSL_TRACE("osl_destroySemaphore failed. (semctl(IPC_RMID)). Errno: %d; %s\n",
+ errno,
+ strerror(errno));
+ }
+
+ free(Semaphore);
+ }
+}
+
+/*****************************************************************************/
+/* osl_acquireSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore) {
+
+ /* abort in debug mode */
+ OSL_PRECOND(Semaphore != 0, "Semaphore not created\n");
+
+
+ if (Semaphore != 0) /* be tolerant in release mode */
+ {
+ struct sembuf op;
+ osl_TSemImpl* pSem= (osl_TSemImpl*)Semaphore;
+
+ op.sem_num= 0;
+ op.sem_op= -1;
+ op.sem_flg= SEM_UNDO;
+
+ return semop(pSem->m_Id, &op, 1) >= 0;
+
+ }
+
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_tryToAcquireSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore) {
+
+ /* abort in debug mode */
+ OSL_PRECOND(Semaphore != 0, "Semaphore not created\n");
+
+ if (Semaphore != 0) /* be tolerant in release mode */
+ {
+ struct sembuf op;
+ osl_TSemImpl* pSem= (osl_TSemImpl*)Semaphore;
+
+ op.sem_num= 0;
+ op.sem_op= -1;
+ op.sem_flg= SEM_UNDO | IPC_NOWAIT;
+
+ return semop(pSem->m_Id, &op, 1) >= 0;
+ }
+
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_releaseSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore)
+{
+
+ /* abort in debug mode */
+ OSL_PRECOND(Semaphore != 0, "Semaphore not created\n");
+
+ if (Semaphore != 0) /* be tolerant in release mode */
+ {
+ struct sembuf op;
+ osl_TSemImpl* pSem= (osl_TSemImpl*)Semaphore;
+
+ op.sem_num= 0;
+ op.sem_op= 1;
+ op.sem_flg= SEM_UNDO;
+
+ return semop(pSem->m_Id, &op, 1) >= 0;
+ }
+
+ return sal_False;
+}
+
+#endif /* OSL_USE_SYS_V_SEMAPHORE */
+
diff --git a/sal/osl/unx/signal.c b/sal/osl/unx/signal.c
new file mode 100644
index 000000000000..5563375d9567
--- /dev/null
+++ b/sal/osl/unx/signal.c
@@ -0,0 +1,1093 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+/* system headers */
+#include "system.h"
+
+#define MAX_STACK_FRAMES 256
+
+#if defined( MACOSX )
+
+#if defined( INTEL )
+#include "backtrace.h"
+#define INCLUDE_BACKTRACE
+#define STACKTYPE "MacOsX_X86"
+#endif /* INTEL */
+
+#endif /* MACOSX */
+
+#ifdef LINUX
+#include <execinfo.h>
+#include <link.h>
+#define INCLUDE_BACKTRACE
+#define STACKTYPE "Linux"
+#endif
+
+#ifdef SOLARIS
+
+#include "backtrace.h"
+#define INCLUDE_BACKTRACE
+
+#if defined( SPARC )
+#define STACKTYPE "Solaris_Sparc"
+#elif defined( INTEL )
+#define STACKTYPE "Solaris_X86"
+#else
+#define STACKTYPE "Solaris_Unknown"
+#endif
+
+#endif /* defined SOLARIS */
+
+#include <osl/diagnose.h>
+#include <osl/mutex.h>
+#include <osl/signal.h>
+#include <osl/process.h>
+#include <osl/thread.h>
+#include <rtl/bootstrap.h>
+#include <rtl/digest.h>
+
+#include "file_path_helper.h"
+
+#define ACT_IGNORE 1
+#define ACT_EXIT 2
+#define ACT_SYSTEM 3
+#define ACT_HIDE 4
+#ifdef SAL_ENABLE_CRASH_REPORT
+# define ACT_ABORT 5
+#else
+# define ACT_ABORT ACT_SYSTEM
+#endif
+
+#define MAX_PATH_LEN 2048
+
+typedef struct _oslSignalHandlerImpl
+{
+ oslSignalHandlerFunction Handler;
+ void* pData;
+ struct _oslSignalHandlerImpl* pNext;
+} oslSignalHandlerImpl;
+
+static struct SignalAction
+{
+ int Signal;
+ int Action;
+ void (*Handler)(int);
+} Signals[] =
+{
+ { SIGHUP, ACT_IGNORE, NULL }, /* hangup */
+ { SIGINT, ACT_EXIT, NULL }, /* interrupt (rubout) */
+ { SIGQUIT, ACT_EXIT, NULL }, /* quit (ASCII FS) */
+ { SIGILL, ACT_SYSTEM, NULL }, /* illegal instruction (not reset when caught) */
+/* changed from ACT_ABOUT to ACT_SYSTEM to try and get collector to run*/
+ { SIGTRAP, ACT_ABORT, NULL }, /* trace trap (not reset when caught) */
+#if ( SIGIOT != SIGABRT )
+ { SIGIOT, ACT_ABORT, NULL }, /* IOT instruction */
+#endif
+ { SIGABRT, ACT_ABORT, NULL }, /* used by abort, replace SIGIOT in the future */
+#ifdef SIGEMT
+ { SIGEMT, ACT_SYSTEM, NULL }, /* EMT instruction */
+/* changed from ACT_ABORT to ACT_SYSTEM to remove handler*/
+/* SIGEMT may also be used by the profiler - so it is probably not a good
+plan to have the new handler use this signal*/
+#endif
+ { SIGFPE, ACT_ABORT, NULL }, /* floating point exception */
+ { SIGKILL, ACT_SYSTEM, NULL }, /* kill (cannot be caught or ignored) */
+ { SIGBUS, ACT_ABORT, NULL }, /* bus error */
+ { SIGSEGV, ACT_ABORT, NULL }, /* segmentation violation */
+#ifdef SIGSYS
+ { SIGSYS, ACT_ABORT, NULL }, /* bad argument to system call */
+#endif
+ { SIGPIPE, ACT_HIDE, NULL }, /* write on a pipe with no one to read it */
+ { SIGALRM, ACT_EXIT, NULL }, /* alarm clock */
+ { SIGTERM, ACT_EXIT, NULL }, /* software termination signal from kill */
+ { SIGUSR1, ACT_SYSTEM, NULL }, /* user defined signal 1 */
+ { SIGUSR2, ACT_SYSTEM, NULL }, /* user defined signal 2 */
+ { SIGCHLD, ACT_SYSTEM, NULL }, /* child status change */
+#ifdef SIGPWR
+ { SIGPWR, ACT_IGNORE, NULL }, /* power-fail restart */
+#endif
+ { SIGWINCH, ACT_IGNORE, NULL }, /* window size change */
+ { SIGURG, ACT_EXIT, NULL }, /* urgent socket condition */
+#ifdef SIGPOLL
+ { SIGPOLL, ACT_EXIT, NULL }, /* pollable event occured */
+#endif
+ { SIGSTOP, ACT_SYSTEM, NULL }, /* stop (cannot be caught or ignored) */
+ { SIGTSTP, ACT_SYSTEM, NULL }, /* user stop requested from tty */
+ { SIGCONT, ACT_SYSTEM, NULL }, /* stopped process has been continued */
+ { SIGTTIN, ACT_SYSTEM, NULL }, /* background tty read attempted */
+ { SIGTTOU, ACT_SYSTEM, NULL }, /* background tty write attempted */
+ { SIGVTALRM, ACT_EXIT, NULL }, /* virtual timer expired */
+ { SIGPROF, ACT_SYSTEM, NULL }, /* profiling timer expired */
+/*Change from ACT_EXIT to ACT_SYSTEM for SIGPROF is so that profiling signals do
+not get taken by the new handler - the new handler does not pass on context
+information which causes 'collect' to crash. This is a way of avoiding
+what looks like a bug in the new handler*/
+ { SIGXCPU, ACT_ABORT, NULL }, /* exceeded cpu limit */
+ { SIGXFSZ, ACT_ABORT, NULL } /* exceeded file size limit */
+};
+const int NoSignals = sizeof(Signals) / sizeof(struct SignalAction);
+
+static sal_Bool bErrorReportingEnabled = sal_True;
+static sal_Bool bInitSignal = sal_False;
+static oslMutex SignalListMutex;
+static oslSignalHandlerImpl* SignalList;
+static sal_Bool bDoHardKill = sal_False;
+static sal_Bool bSetSEGVHandler = sal_False;
+static sal_Bool bSetWINCHHandler = sal_False;
+static sal_Bool bSetILLHandler = sal_False;
+
+static void SignalHandlerFunction(int);
+
+static void getExecutableName_Impl (rtl_String ** ppstrProgName)
+{
+ rtl_uString * ustrProgFile = 0;
+ osl_getExecutableFile (&ustrProgFile);
+ if (ustrProgFile)
+ {
+ rtl_uString * ustrProgName = 0;
+ osl_systemPathGetFileNameOrLastDirectoryPart (ustrProgFile, &ustrProgName);
+ if (ustrProgName != 0)
+ {
+ rtl_uString2String (
+ ppstrProgName,
+ rtl_uString_getStr (ustrProgName), rtl_uString_getLength (ustrProgName),
+ osl_getThreadTextEncoding(),
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+ rtl_uString_release (ustrProgName);
+ }
+ rtl_uString_release (ustrProgFile);
+ }
+}
+
+static sal_Bool is_soffice_Impl (void)
+{
+ sal_Int32 idx = -1;
+ rtl_String * strProgName = 0;
+
+ getExecutableName_Impl (&strProgName);
+ if (strProgName)
+ {
+ idx = rtl_str_indexOfStr (rtl_string_getStr (strProgName), "soffice");
+ rtl_string_release (strProgName);
+ }
+ return (idx != -1);
+}
+
+static sal_Bool InitSignal()
+{
+ int i;
+ struct sigaction act;
+ struct sigaction oact;
+ sigset_t unset;
+
+ if (is_soffice_Impl())
+ {
+ sal_uInt32 argi;
+ sal_uInt32 argc;
+ rtl_uString *ustrCommandArg = 0;
+
+ argc = osl_getCommandArgCount();
+ for ( argi = 0; argi < argc; argi++ )
+ {
+ if (osl_Process_E_None == osl_getCommandArg (argi, &ustrCommandArg))
+ {
+ if (0 == rtl_ustr_ascii_compare (rtl_uString_getStr (ustrCommandArg), "-bean"))
+ {
+ bDoHardKill = sal_True;
+ break;
+ }
+ }
+ }
+ if (ustrCommandArg)
+ {
+ rtl_uString_release (ustrCommandArg);
+ ustrCommandArg = 0;
+ }
+
+ // WORKAROUND FOR SEGV HANDLER CONFLICT
+ //
+ // the java jit needs SIGSEGV for proper work
+ // and we need SIGSEGV for the office crashguard
+ //
+ // TEMPORARY SOLUTION:
+ // the office sets the signal handler during startup
+ // java can than overwrite it, if needed
+ bSetSEGVHandler = sal_True;
+
+ // WORKAROUND FOR WINCH HANDLER (SEE ABOVE)
+ bSetWINCHHandler = sal_True;
+
+ // WORKAROUND FOR ILLEGAL INSTRUCTION HANDLER (SEE ABOVE)
+ bSetILLHandler = sal_True;
+ }
+
+ SignalListMutex = osl_createMutex();
+
+ act.sa_handler = SignalHandlerFunction;
+ act.sa_flags = SA_RESTART;
+
+ sigfillset(&(act.sa_mask));
+
+ /* Initialize the rest of the signals */
+ for (i = 0; i < NoSignals; i++)
+ {
+ /* hack: stomcatd is attaching JavaVM wich dont work with an sigaction(SEGV) */
+ if ((bSetSEGVHandler || Signals[i].Signal != SIGSEGV)
+ && (bSetWINCHHandler || Signals[i].Signal != SIGWINCH)
+ && (bSetILLHandler || Signals[i].Signal != SIGILL))
+ {
+ if (Signals[i].Action != ACT_SYSTEM)
+ {
+ if (Signals[i].Action == ACT_HIDE)
+ {
+ struct sigaction ign;
+
+ ign.sa_handler = SIG_IGN;
+ ign.sa_flags = 0;
+ sigemptyset(&ign.sa_mask);
+
+ if (sigaction(Signals[i].Signal, &ign, &oact) == 0)
+ Signals[i].Handler = oact.sa_handler;
+ else
+ Signals[i].Handler = SIG_DFL;
+ }
+ else
+ if (sigaction(Signals[i].Signal, &act, &oact) == 0)
+ Signals[i].Handler = oact.sa_handler;
+ else
+ Signals[i].Handler = SIG_DFL;
+ }
+ }
+ }
+
+ /* Clear signal mask inherited from parent process (on Mac OS X, upon a
+ crash soffice re-execs itself from within the signal handler, so the
+ second soffice would have the guilty signal blocked and would freeze upon
+ encountering a similar crash again): */
+ if (sigemptyset(&unset) < 0 ||
+ pthread_sigmask(SIG_SETMASK, &unset, NULL) < 0)
+ {
+ OSL_TRACE("sigemptyset or pthread_sigmask failed");
+ }
+
+ return sal_True;
+}
+
+static sal_Bool DeInitSignal()
+{
+ int i;
+ struct sigaction act;
+
+ act.sa_flags = 0;
+ sigemptyset(&(act.sa_mask));
+
+ /* Initialize the rest of the signals */
+ for (i = NoSignals - 1; i >= 0; i--)
+ if (Signals[i].Action != ACT_SYSTEM)
+ {
+ act.sa_handler = Signals[i].Handler;
+
+ sigaction(Signals[i].Signal, &act, NULL);
+ }
+
+ osl_destroyMutex(SignalListMutex);
+
+ return sal_False;
+}
+
+#if defined (SAL_ENABLE_CRASH_REPORT) && defined(INCLUDE_BACKTRACE)
+
+/*****************************************************************************/
+/* Generate MD5 checksum */
+/*****************************************************************************/
+
+static sal_uInt32 calc_md5_checksum( const char *filename, sal_uInt8 *pChecksum, sal_uInt32 nChecksumLen )
+{
+ sal_uInt32 nBytesProcessed = 0;
+
+ FILE *fp = fopen( filename, "r" );
+
+ if ( fp )
+ {
+ rtlDigest digest = rtl_digest_createMD5();
+
+ if ( digest )
+ {
+ size_t nBytesRead;
+ sal_uInt8 buffer[4096];
+ rtlDigestError error = rtl_Digest_E_None;
+
+ while ( rtl_Digest_E_None == error &&
+ 0 != (nBytesRead = fread( buffer, 1, sizeof(buffer), fp )) )
+ {
+ error = rtl_digest_updateMD5( digest, buffer, nBytesRead );
+ nBytesProcessed += nBytesRead;
+ }
+
+ if ( rtl_Digest_E_None == error )
+ {
+ error = rtl_digest_getMD5( digest, pChecksum, nChecksumLen );
+ }
+
+ if ( rtl_Digest_E_None != error )
+ nBytesProcessed = 0;
+
+ rtl_digest_destroyMD5( digest );
+ }
+
+ fclose( fp );
+ }
+
+ return nBytesProcessed;
+}
+
+/*****************************************************************************/
+/* Call crash reporter */
+/*****************************************************************************/
+
+/* Helper function to encode and write a string to a stream */
+
+static int fputs_xml( const char *string, FILE *stream )
+{
+ int result = 0;
+
+ while ( result >= 0 && *string )
+ {
+ switch( *string )
+ {
+ case '&':
+ result = fputs( "&amp;", stream );
+ break;
+ case '<':
+ result = fputs( "&lt;", stream );
+ break;
+ case '>':
+ result = fputs( "&gt;", stream );
+ break;
+ default:
+ result = fputc( *string, stream );
+ break;
+ }
+
+ string++;
+ }
+
+ return result;
+}
+#endif
+
+/* Create intermediate files and run crash reporter */
+
+#define REPORTENV_PARAM "-crashreportenv:"
+
+#if defined SAL_ENABLE_CRASH_REPORT && defined INCLUDE_BACKTRACE && \
+ defined LINUX
+
+typedef struct
+{
+ const char *name;
+ ElfW(Off) offset;
+} dynamic_entry;
+
+static int
+callback(struct dl_phdr_info *info, size_t size, void *data)
+{
+ const ElfW(Phdr) *pDynamic = NULL;
+
+ if (size == sizeof(struct dl_phdr_info))
+ {
+ int i;
+ for (i = 0; i < info->dlpi_phnum; ++i)
+ {
+ if (info->dlpi_phdr[i].p_type == PT_DYNAMIC)
+ {
+ pDynamic = &(info->dlpi_phdr[i]);
+ break;
+ }
+ }
+ }
+
+ if (pDynamic)
+ {
+ char buffer[100];
+ int len;
+ char exe[PATH_MAX];
+ const char *dsoname = info->dlpi_name;
+
+ dynamic_entry* entry = (dynamic_entry*)data;
+
+ if (strcmp(dsoname, "") == 0)
+ {
+ snprintf(buffer, sizeof(buffer), "/proc/%d/exe", getpid());
+ if ((len = readlink(buffer, exe, PATH_MAX)) != -1)
+ {
+ exe[len] = '\0';
+ dsoname = exe;
+ }
+ }
+
+ if (strcmp(dsoname, entry->name) == 0)
+ {
+ entry->offset = pDynamic->p_offset;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/* Get the location of the .dynamic section offset for the given elf file.
+ * i.e. same as the "Offset" value shown for DYNAMIC from readelf -l foo
+ *
+ * We want to know this value so that if the binaries have been modifed
+ * by prelink then we can still process the call stack on server side
+ * by comparing this value to that of an "un-prelinked but known to be
+ * otherwise equivalent" version of those binaries and adjust the call
+ * stack addresses by the differences between .dynamic addresses so as
+ * to be able to map the prelinked addresses back to the unprelinked
+ * addresses
+ *
+ * cmc@openoffice.org
+ */
+static ElfW(Off)
+dynamic_section_offset(const char *name)
+{
+ dynamic_entry entry;
+
+ entry.name = name;
+ entry.offset = 0;
+
+ dl_iterate_phdr(callback, &entry);
+
+ return entry.offset;
+}
+#endif
+
+static int ReportCrash( int Signal )
+{
+#ifdef SAL_ENABLE_CRASH_REPORT
+ static sal_Bool bCrashReporterExecuted = sal_False;
+ sal_Bool bAutoCrashReport = sal_False;
+
+ sal_uInt32 argi;
+ sal_uInt32 argc;
+ rtl_uString *ustrCommandArg = NULL;
+
+ if ( !bErrorReportingEnabled )
+ return -1;
+
+ argc = osl_getCommandArgCount();
+
+ for ( argi = 0; argi < argc; argi++ )
+ {
+ if ( osl_Process_E_None == osl_getCommandArg( argi, &ustrCommandArg ) )
+ {
+ if ( 0 == rtl_ustr_ascii_compare( rtl_uString_getStr( ustrCommandArg ), "-nocrashreport" ) )
+ {
+ rtl_uString_release( ustrCommandArg );
+ return -1;
+ }
+ else if ( 0 == rtl_ustr_ascii_compare( rtl_uString_getStr( ustrCommandArg ), "-autocrashreport" ) )
+ {
+ bAutoCrashReport = sal_True;
+ }
+ else if ( 0 == rtl_ustr_ascii_shortenedCompare_WithLength(
+ rtl_uString_getStr( ustrCommandArg ), rtl_uString_getLength( ustrCommandArg ),
+ REPORTENV_PARAM, strlen(REPORTENV_PARAM) )
+ )
+ {
+ rtl_uString *ustrEnvironment = NULL;
+ rtl_String *strEnv = NULL;
+
+ rtl_uString_newFromStr( &ustrEnvironment, rtl_uString_getStr( ustrCommandArg ) + strlen(REPORTENV_PARAM) );
+
+ if ( ustrEnvironment )
+ {
+ rtl_uString2String(
+ &strEnv,
+ rtl_uString_getStr( ustrEnvironment ), rtl_uString_getLength( ustrEnvironment ),
+ osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS
+ );
+
+ if ( strEnv )
+ {
+ putenv( rtl_string_getStr( strEnv ) );
+ rtl_string_release( strEnv );
+ }
+
+ rtl_uString_release( ustrEnvironment );
+ }
+
+ }
+
+ }
+ }
+
+ if ( ustrCommandArg )
+ rtl_uString_release( ustrCommandArg );
+
+ if ( !bCrashReporterExecuted )
+ {
+ int i;
+ /* struct sigaction act; */
+
+ for (i = 0; i < NoSignals; i++)
+ {
+ if (Signals[i].Signal == Signal && Signals[i].Action == ACT_ABORT )
+ {
+ int ret;
+ char szShellCmd[512] = { '\0' };
+ char *pXMLTempName = NULL;
+ char *pStackTempName = NULL;
+ char *pChecksumTempName = NULL;
+
+#ifdef INCLUDE_BACKTRACE
+ char szXMLTempNameBuffer[L_tmpnam];
+ char szChecksumTempNameBuffer[L_tmpnam];
+ char szStackTempNameBuffer[L_tmpnam];
+
+ void *stackframes[MAX_STACK_FRAMES];
+ int iFrame;
+ int nFrames = backtrace( stackframes, sizeof(stackframes)/sizeof(stackframes[0]));
+
+ FILE *xmlout = NULL, *stackout = NULL, *checksumout = NULL;
+ int fdxml, fdstk, fdchksum;
+
+ strncpy( szXMLTempNameBuffer, P_tmpdir, sizeof(szXMLTempNameBuffer) );
+ strncat( szXMLTempNameBuffer, "/crxmlXXXXXX", sizeof(szXMLTempNameBuffer) );
+
+ strncpy( szStackTempNameBuffer, P_tmpdir, sizeof(szStackTempNameBuffer) );
+ strncat( szStackTempNameBuffer, "/crstkXXXXXX", sizeof(szStackTempNameBuffer) );
+
+ strncpy( szChecksumTempNameBuffer, P_tmpdir, sizeof(szChecksumTempNameBuffer) );
+ strncat( szChecksumTempNameBuffer, "/crchkXXXXXX", sizeof(szChecksumTempNameBuffer) );
+
+ fdxml = mkstemp(szXMLTempNameBuffer);
+ fdstk = mkstemp(szStackTempNameBuffer);
+ fdchksum = mkstemp(szChecksumTempNameBuffer);
+
+ xmlout = fdopen( fdxml , "w" );
+ stackout = fdopen( fdstk , "w" );
+ checksumout = fdopen( fdchksum, "w" );
+
+ pXMLTempName = szXMLTempNameBuffer;
+ pStackTempName = szStackTempNameBuffer;
+ pChecksumTempName = szChecksumTempNameBuffer;
+
+
+ if ( xmlout && stackout && checksumout )
+ {
+ fprintf( xmlout, "<errormail:Stack type=\"%s\">\n", STACKTYPE );
+
+ fprintf( checksumout, "<errormail:Checksums type=\"MD5\">\n" );
+
+ for ( iFrame = 0; iFrame < nFrames; iFrame++ )
+ {
+ Dl_info dl_info;
+
+ fprintf( stackout, "0x%" SAL_PRIxUINTPTR ":",
+ SAL_INT_CAST(sal_uIntPtr, stackframes[iFrame]) );
+
+ fprintf( xmlout, "<errormail:StackInfo pos=\"%d\" ip=\"0x%" SAL_PRIxUINTPTR "\"",
+ iFrame,
+ SAL_INT_CAST(sal_uIntPtr, stackframes[iFrame])
+ );
+
+ memset( &dl_info, 0, sizeof(dl_info) );
+
+ /* dladdr may fail */
+ if ( dladdr( stackframes[iFrame], &dl_info) )
+ {
+ const char *dli_fname = NULL;
+ char *dli_fdir = NULL;
+ char szDirectory[PATH_MAX];
+ char szCanonicDirectory[PATH_MAX];
+
+ /* Don't expect that dladdr filled all members of dl_info */
+
+ dli_fname = dl_info.dli_fname ? strrchr( dl_info.dli_fname, '/' ) : NULL;
+ if ( dli_fname )
+ {
+ ++dli_fname;
+ memcpy( szDirectory, dl_info.dli_fname, dli_fname - dl_info.dli_fname );
+ szDirectory[dli_fname - dl_info.dli_fname] = 0;
+
+ dli_fdir = realpath( szDirectory, szCanonicDirectory ) ? szCanonicDirectory : szDirectory;
+
+ if ( *dli_fdir && dli_fdir[ strlen(dli_fdir) - 1 ] != '/' )
+ strcat( dli_fdir, "/" );
+ }
+ else
+ dli_fname = dl_info.dli_fname;
+
+ /* create checksum of library on stack */
+ if ( dli_fname )
+ {
+ sal_uInt8 checksum[RTL_DIGEST_LENGTH_MD5];
+
+ sal_uInt32 nBytesProcessed = calc_md5_checksum(
+ dl_info.dli_fname, checksum, sizeof(checksum) );
+ if ( nBytesProcessed )
+ {
+ int j;
+
+ fprintf( checksumout, "<errormail:Checksum sum=\"0x" );
+ for ( j = 0; j < 16; fprintf( checksumout, "%02X", checksum[j++] ) );
+ fprintf( checksumout,
+ "\" bytes=\"%lu\" file=\"%s\"/>\n",
+ SAL_INT_CAST(
+ unsigned long, nBytesProcessed),
+ dli_fname );
+ }
+ }
+
+ if ( dl_info.dli_fbase && dl_info.dli_fname )
+ {
+#ifdef LINUX
+ ElfW(Off) dynamic_offset = dynamic_section_offset(dl_info.dli_fname);
+ fprintf( stackout, " 0x%" SAL_PRI_SIZET "x:", dynamic_offset);
+#endif
+
+ fprintf( stackout, " %s + 0x%" SAL_PRI_PTRDIFFT "x",
+ dl_info.dli_fname,
+ (char*)stackframes[iFrame] - (char*)dl_info.dli_fbase
+ );
+
+ fprintf( xmlout, " rel=\"0x%" SAL_PRI_PTRDIFFT "x\"", (char *)stackframes[iFrame] - (char *)dl_info.dli_fbase );
+ if ( dli_fname )
+ fprintf( xmlout, " name=\"%s\"", dli_fname );
+
+ if ( dli_fdir )
+ fprintf( xmlout, " path=\"%s\"", dli_fdir );
+
+#ifdef LINUX
+ fprintf( xmlout, " dynamicoffset=\"0x%" SAL_PRI_SIZET "x\"", dynamic_offset );
+#endif
+ }
+ else
+ fprintf( stackout, " ????????" );
+
+ if ( dl_info.dli_sname && dl_info.dli_saddr )
+ {
+ fputs( " (", stackout );
+ fputs_xml( dl_info.dli_sname, stackout );
+ fprintf( stackout, " + 0x%" SAL_PRI_PTRDIFFT "x)",
+ (char*)stackframes[iFrame] - (char*)dl_info.dli_saddr );
+
+ fputs( " ordinal=\"", xmlout );
+ fputs_xml( dl_info.dli_sname, xmlout );
+ fprintf( xmlout, "+0x%" SAL_PRI_PTRDIFFT "x\"",
+ (char *)stackframes[iFrame] - (char *)dl_info.dli_saddr );
+ }
+
+ }
+ else /* dladdr failed */
+ {
+ fprintf( stackout, " ????????" );
+ }
+
+ fprintf( stackout, "\n" );
+ fprintf( xmlout, "/>\n" );
+
+ }
+
+ fprintf( xmlout, "</errormail:Stack>\n" );
+ fprintf( checksumout, "</errormail:Checksums>\n" );
+ }
+ else
+ {
+ pXMLTempName = NULL;
+ pStackTempName = NULL;
+ pChecksumTempName = NULL;
+ }
+
+ if ( stackout )
+ fclose( stackout );
+ if ( xmlout )
+ fclose( xmlout );
+ if ( checksumout )
+ fclose( checksumout );
+
+ if ( pXMLTempName && pChecksumTempName && pStackTempName )
+#endif /* INCLUDE_BACKTRACE */
+ {
+ rtl_uString * crashrep_url = NULL;
+ rtl_uString * crashrep_path = NULL;
+ rtl_String * crashrep_path_system = NULL;
+ rtl_string2UString(
+ &crashrep_url,
+ RTL_CONSTASCII_USTRINGPARAM(
+ "$BRAND_BASE_DIR/program/crashrep"),
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ rtl_bootstrap_expandMacros(&crashrep_url);
+ osl_getSystemPathFromFileURL(crashrep_url, &crashrep_path);
+ rtl_uString2String(
+ &crashrep_path_system,
+ rtl_uString_getStr(crashrep_path),
+ rtl_uString_getLength(crashrep_path),
+ osl_getThreadTextEncoding(),
+ (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR));
+ rtl_uString_release(crashrep_url);
+ rtl_uString_release(crashrep_path);
+#if defined INCLUDE_BACKTRACE && (defined LINUX || defined MACOSX)
+ snprintf( szShellCmd, sizeof(szShellCmd)/sizeof(szShellCmd[0]),
+ "%s -p %d -s %d -xml %s -chksum %s -stack %s -noui%s",
+ rtl_string_getStr(crashrep_path_system),
+ getpid(),
+ Signal,
+ pXMLTempName,
+ pChecksumTempName,
+ pStackTempName,
+ bAutoCrashReport ? " -send" : "" );
+#elif defined INCLUDE_BACKTRACE && defined SOLARIS
+ snprintf( szShellCmd, sizeof(szShellCmd)/sizeof(szShellCmd[0]),
+ "%s -p %d -s %d -xml %s -chksum %s -noui%s",
+ rtl_string_getStr(crashrep_path_system),
+ getpid(),
+ Signal,
+ pXMLTempName,
+ pChecksumTempName,
+ bAutoCrashReport ? " -send" : "" );
+#else
+ snprintf( szShellCmd, sizeof(szShellCmd)/sizeof(szShellCmd[0]),
+ "%s -p %d -s %d -noui%s",
+ rtl_string_getStr(crashrep_path_system),
+ getpid(), Signal, bAutoCrashReport ? " -send" : "" );
+#endif
+ rtl_string_release(crashrep_path_system);
+ }
+
+ ret = szShellCmd[0] == '\0' ? -1 : system( szShellCmd );
+
+ if ( pXMLTempName )
+ unlink( pXMLTempName );
+
+ if ( pStackTempName )
+ unlink( pStackTempName );
+
+ if ( pChecksumTempName )
+ unlink( pChecksumTempName );
+
+ if ( -1 != ret )
+ {
+ bCrashReporterExecuted = sal_True;
+ return 1;
+ }
+ else
+ return -1;
+
+ }
+ }
+
+ return 0;
+ }
+
+ return 1;
+#else /* defined SAL_ENABLE_CRASH_REPORT */
+ /* the utility crash_report is not build, so do the same as when
+ the option -nocrashreport is used */
+ (void) Signal; // avoid warnings
+ return -1;
+#endif /* defined SAL_ENABLE_CRASH_REPORT */
+}
+
+static void PrintStack( int sig )
+{
+#if ! defined(MACOSX) || defined(INCLUDE_BACKTRACE)
+ void *buffer[MAX_STACK_FRAMES];
+ int size = backtrace( buffer, sizeof(buffer) / sizeof(buffer[0]) );
+#endif
+
+ fprintf( stderr, "\n\nFatal exception: Signal %d\n", sig );
+
+#if defined(MACOSX) && ! defined(INCLUDE_BACKTRACE)
+ fprintf( stderr, "Please turn on Enable Crash Reporting and\nAutomatic Display of Crashlogs in the Console application\n" );
+#else
+ if ( size > 0 )
+ {
+ fputs( "Stack:\n", stderr );
+ backtrace_symbols_fd( buffer, size, fileno(stderr) );
+ }
+#endif
+}
+
+static oslSignalAction CallSignalHandler(oslSignalInfo *pInfo)
+{
+ oslSignalHandlerImpl* pHandler = SignalList;
+ oslSignalAction Action = osl_Signal_ActCallNextHdl;
+
+ while (pHandler != NULL)
+ {
+ if ((Action = pHandler->Handler(pHandler->pData, pInfo))
+ != osl_Signal_ActCallNextHdl)
+ break;
+
+ pHandler = pHandler->pNext;
+ }
+
+ return Action;
+}
+
+void CallSystemHandler(int Signal)
+{
+ int i;
+ struct sigaction act;
+
+ for (i = 0; i < NoSignals; i++)
+ {
+ if (Signals[i].Signal == Signal)
+ break;
+ }
+
+ if (i < NoSignals)
+ {
+ if ((Signals[i].Handler == NULL) ||
+ (Signals[i].Handler == SIG_DFL) ||
+ (Signals[i].Handler == SIG_IGN) ||
+ (Signals[i].Handler == SIG_ERR))
+ {
+ switch (Signals[i].Action)
+ {
+ case ACT_EXIT: /* terminate */
+ /* prevent dumping core on exit() */
+ _exit(255);
+ break;
+
+ case ACT_ABORT: /* terminate witch core dump */
+ ReportCrash( Signal );
+ act.sa_handler = SIG_DFL;
+ act.sa_flags = 0;
+ sigemptyset(&(act.sa_mask));
+ sigaction(SIGABRT, &act, NULL);
+ PrintStack( Signal );
+ abort();
+ break;
+
+ case ACT_IGNORE: /* ignore */
+ break;
+
+ default: /* should never happen */
+ OSL_ASSERT(0);
+ }
+ }
+ else
+ (*Signals[i].Handler)(Signal);
+ }
+}
+
+
+/*****************************************************************************/
+/* SignalHandlerFunction */
+/*****************************************************************************/
+void SignalHandlerFunction(int Signal)
+{
+ oslSignalInfo Info;
+ struct sigaction act;
+
+ Info.UserSignal = Signal;
+ Info.UserData = NULL;
+
+ switch (Signal)
+ {
+ case SIGBUS:
+ case SIGILL:
+ case SIGSEGV:
+ case SIGIOT:
+#if ( SIGIOT != SIGABRT )
+ case SIGABRT:
+#endif
+ Info.Signal = osl_Signal_AccessViolation;
+ break;
+
+ case -1:
+ Info.Signal = osl_Signal_IntegerDivideByZero;
+ break;
+
+ case SIGFPE:
+ Info.Signal = osl_Signal_FloatDivideByZero;
+ break;
+
+ case SIGINT:
+ case SIGTERM:
+ case SIGQUIT:
+ case SIGHUP:
+ Info.Signal = osl_Signal_Terminate;
+ break;
+
+ default:
+ Info.Signal = osl_Signal_System;
+ break;
+ }
+
+ ReportCrash( Signal );
+
+ /* Portal Demo HACK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
+ if (bDoHardKill && (Info.Signal == osl_Signal_AccessViolation))
+ _exit(255);
+ /* Portal Demo HACK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
+
+
+ switch (CallSignalHandler(&Info))
+ {
+ case osl_Signal_ActCallNextHdl:
+ CallSystemHandler(Signal);
+ break;
+
+ case osl_Signal_ActAbortApp:
+ ReportCrash( Signal );
+ act.sa_handler = SIG_DFL;
+ act.sa_flags = 0;
+ sigemptyset(&(act.sa_mask));
+ sigaction(SIGABRT, &act, NULL);
+ PrintStack( Signal );
+ abort();
+ break;
+
+ case osl_Signal_ActKillApp:
+ /* prevent dumping core on exit() */
+ _exit(255);
+ break;
+ default:
+ break;
+ }
+}
+
+/*****************************************************************************/
+/* osl_addSignalHandler */
+/*****************************************************************************/
+oslSignalHandler SAL_CALL osl_addSignalHandler(oslSignalHandlerFunction Handler, void* pData)
+{
+ oslSignalHandlerImpl* pHandler;
+
+ OSL_ASSERT(Handler != NULL);
+ if ( Handler == 0 )
+ {
+ return 0;
+ }
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ pHandler = (oslSignalHandlerImpl*) calloc(1, sizeof(oslSignalHandlerImpl));
+
+ if (pHandler != NULL)
+ {
+ pHandler->Handler = Handler;
+ pHandler->pData = pData;
+
+ osl_acquireMutex(SignalListMutex);
+
+ pHandler->pNext = SignalList;
+ SignalList = pHandler;
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (pHandler);
+ }
+
+ return (NULL);
+}
+
+/*****************************************************************************/
+/* osl_removeSignalHandler */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_removeSignalHandler(oslSignalHandler Handler)
+{
+ oslSignalHandlerImpl *pHandler, *pPrevious = NULL;
+
+ OSL_ASSERT(Handler != NULL);
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ osl_acquireMutex(SignalListMutex);
+
+ pHandler = SignalList;
+
+ while (pHandler != NULL)
+ {
+ if (pHandler == Handler)
+ {
+ if (pPrevious)
+ pPrevious->pNext = pHandler->pNext;
+ else
+ SignalList = pHandler->pNext;
+
+ osl_releaseMutex(SignalListMutex);
+
+ if (SignalList == NULL)
+ bInitSignal = DeInitSignal();
+
+ free(pHandler);
+
+ return (sal_True);
+ }
+
+ pPrevious = pHandler;
+ pHandler = pHandler->pNext;
+ }
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (sal_False);
+}
+
+/*****************************************************************************/
+/* osl_raiseSignal */
+/*****************************************************************************/
+oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData)
+{
+ oslSignalInfo Info;
+ oslSignalAction Action;
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ osl_acquireMutex(SignalListMutex);
+
+ Info.Signal = osl_Signal_User;
+ Info.UserSignal = UserSignal;
+ Info.UserData = UserData;
+
+ Action = CallSignalHandler(&Info);
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (Action);
+}
+
+/*****************************************************************************/
+/* osl_setErrorReporting */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable )
+{
+ sal_Bool bOld = bErrorReportingEnabled;
+ bErrorReportingEnabled = bEnable;
+
+ return bOld;
+}
diff --git a/sal/osl/unx/socket.c b/sal/osl/unx/socket.c
new file mode 100644
index 000000000000..c8faf6c028f5
--- /dev/null
+++ b/sal/osl/unx/socket.c
@@ -0,0 +1,3062 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/socket.h>
+#include <osl/diagnose.h>
+#include <osl/mutex.h>
+#include <osl/signal.h>
+
+#include <rtl/alloc.h>
+
+#include <ctype.h>
+#include <sal/types.h>
+
+#include "sockimpl.h"
+
+
+/* defines for poll */
+#ifdef HAVE_POLL_H
+#undef HAVE_POLL_H
+#endif
+
+#if defined(LINUX) || defined(NETBSD) || defined ( FREEBSD ) || defined (MACOSX)
+#include <sys/poll.h>
+#define HAVE_POLL_H
+#endif /* HAVE_POLL_H */
+
+#if defined(SOLARIS)
+#include <poll.h>
+#define HAVE_POLL_H
+#endif /* SOLARIS */
+
+#ifndef HAVE_POLL_H
+#define POLLIN 0x0001
+#define POLLOUT 0x0002
+#define POLLPRI 0x0004
+#endif /* HAVE_POLL_H */
+
+
+/* defines for shutdown */
+#define SD_RECEIVE 0
+#define SD_SEND 1
+#define SD_BOTH 2
+
+
+/*
+ oslSocketAddr is a pointer to a Berkeley struct sockaddr.
+ I refrained from using sockaddr_in because of possible further
+ extensions of this socket-interface (IP-NG?).
+ The intention was to hide all Berkeley data-structures from
+ direct access past the osl-interface.
+
+ The current implementation is internet (IP) centered. All
+ the constructor-functions (osl_create...) take parameters
+ that will probably make sense only in the IP-environment
+ (e.g. because of using the dotted-address-format).
+
+ If the interface will be extended to host other protocol-
+ families, I expect no externally visible changes in the
+ existing functions. You'll probably need only new
+ constructor-functions who take the different address
+ formats into consideration (maybe a long dotted address
+ or whatever).
+*/
+
+/* _Note_ that I rely on the fact that oslSocketAddr and struct sockaddr */
+/* are the same! I don't like it very much but see no other easy way to */
+/* conceal the struct sockaddr from the eyes of the user. */
+
+
+#define OSL_INVALID_SOCKET -1
+#define OSL_SOCKET_ERROR -1
+
+
+/* Buffer size for gethostbyname */
+#define MAX_HOSTBUFFER_SIZE 2048
+
+/*****************************************************************************/
+/* enum oslAddrFamily */
+/*****************************************************************************/
+
+/* map */
+static unsigned long FamilyMap[]= {
+ AF_INET, /* osl_Socket_FamilyInet */
+ AF_IPX, /* osl_Socket_FamilyIpx */
+ 0 /* osl_Socket_FamilyInvalid */
+};
+
+/* reverse map */
+static oslAddrFamily osl_AddrFamilyFromNative(sal_uInt32 nativeType)
+{
+ oslAddrFamily i= (oslAddrFamily)0;
+
+ while(i != osl_Socket_FamilyInvalid)
+ {
+ if(FamilyMap[i] == nativeType)
+ return i;
+ i = (oslAddrFamily) ( i + 1 );
+ }
+
+ return i;
+}
+
+/* macros */
+#define FAMILY_FROM_NATIVE(y) osl_AddrFamilyFromNative(y)
+#define FAMILY_TO_NATIVE(x) (short)FamilyMap[x]
+
+/*****************************************************************************/
+/* enum oslProtocol */
+/*****************************************************************************/
+
+/* map */
+static sal_uInt32 ProtocolMap[]= {
+ 0, /* osl_Socket_ProtocolIp */
+ NSPROTO_IPX, /* osl_Socket_ProtocolIpx */
+ NSPROTO_SPX, /* osl_Socket_ProtocolSpx */
+ NSPROTO_SPXII, /* osl_Socket_ProtocolSpxII */
+ 0 /* osl_Socket_ProtocolInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslProtocol osl_ProtocolFromNative(sal_uInt32 nativeType)
+{
+ oslProtocol i= (oslProtocol)0;
+
+ while(i != osl_Socket_ProtocolInvalid)
+ {
+ if(ProtocolMap[i] == nativeType)
+ return i;
+ i = (oslProtocol) ( i + 1);
+ }
+
+ return i;
+}
+*/
+
+/* macros */
+#define PROTOCOL_FROM_NATIVE(y) osl_ProtocolFromNative(y)
+#define PROTOCOL_TO_NATIVE(x) ProtocolMap[x]
+
+
+/*****************************************************************************/
+/* enum oslSocketType */
+/*****************************************************************************/
+
+/* map */
+static sal_uInt32 TypeMap[]= {
+ SOCK_STREAM, /* osl_Socket_TypeStream */
+ SOCK_DGRAM, /* osl_Socket_TypeDgram */
+ SOCK_RAW, /* osl_Socket_TypeRaw */
+ SOCK_RDM, /* osl_Socket_TypeRdm */
+ SOCK_SEQPACKET, /* osl_Socket_TypeSeqPacket */
+ 0 /* osl_Socket_TypeInvalid */
+};
+
+/* reverse map */
+static oslSocketType osl_SocketTypeFromNative(sal_uInt32 nativeType)
+{
+ oslSocketType i= (oslSocketType)0;
+
+ while(i != osl_Socket_TypeInvalid)
+ {
+ if(TypeMap[i] == nativeType)
+ return i;
+ i = (oslSocketType)(i + 1);
+ }
+
+ return i;
+}
+
+/* macros */
+#define TYPE_TO_NATIVE(x) TypeMap[x]
+#define TYPE_FROM_NATIVE(y) osl_SocketTypeFromNative(y)
+
+
+/*****************************************************************************/
+/* enum oslSocketOption */
+/*****************************************************************************/
+
+/* map */
+static sal_uInt32 OptionMap[]= {
+ SO_DEBUG, /* osl_Socket_OptionDebug */
+ SO_ACCEPTCONN, /* osl_Socket_OptionAcceptConn */
+ SO_REUSEADDR, /* osl_Socket_OptionReuseAddr */
+ SO_KEEPALIVE, /* osl_Socket_OptionKeepAlive */
+ SO_DONTROUTE, /* osl_Socket_OptionDontRoute */
+ SO_BROADCAST, /* osl_Socket_OptionBroadcast */
+ SO_USELOOPBACK, /* osl_Socket_OptionUseLoopback */
+ SO_LINGER, /* osl_Socket_OptionLinger */
+ SO_OOBINLINE, /* osl_Socket_OptionOOBinLine */
+ SO_SNDBUF, /* osl_Socket_OptionSndBuf */
+ SO_RCVBUF, /* osl_Socket_OptionRcvBuf */
+ SO_SNDLOWAT, /* osl_Socket_OptionSndLowat */
+ SO_RCVLOWAT, /* osl_Socket_OptionRcvLowat */
+ SO_SNDTIMEO, /* osl_Socket_OptionSndTimeo */
+ SO_RCVTIMEO, /* osl_Socket_OptionRcvTimeo */
+ SO_ERROR, /* osl_Socket_OptionError */
+ SO_TYPE, /* osl_Socket_OptionType */
+ TCP_NODELAY, /* osl_Socket_OptionTcpNoDelay */
+ 0 /* osl_Socket_OptionInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslSocketOption osl_SocketOptionFromNative(sal_uInt32 nativeType)
+{
+ oslSocketOption i= (oslSocketOption)0;
+
+ while(i != osl_Socket_OptionInvalid)
+ {
+ if(OptionMap[i] == nativeType)
+ return i;
+ i = (oslSocketOption) ( i + 1 );
+ }
+
+ return i;
+}
+*/
+/* macros */
+#define OPTION_TO_NATIVE(x) OptionMap[x]
+#define OPTION_FROM_NATIVE(y) osl_SocketOptionFromNative(y)
+
+
+/*****************************************************************************/
+/* enum oslSocketOptionLevel */
+/*****************************************************************************/
+
+static sal_uInt32 OptionLevelMap[]= {
+ SOL_SOCKET, /* osl_Socket_LevelSocket */
+ IPPROTO_TCP, /* osl_Socket_LevelTcp */
+ 0 /* osl_Socket_LevelInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslSocketOptionLevel osl_SocketOptionLevelFromNative(sal_uInt32 nativeType)
+{
+ oslSocketOptionLevel i= (oslSocketOptionLevel)0;
+
+ while(i != osl_Socket_LevelInvalid)
+ {
+ if(OptionLevelMap[i] == nativeType)
+ return i;
+ i = (oslSocketOptionLevel) ( i + 1 );
+ }
+
+ return i;
+}
+*/
+/* macros */
+#define OPTION_LEVEL_TO_NATIVE(x) OptionLevelMap[x]
+#define OPTION_LEVEL_FROM_NATIVE(y) osl_SocketOptionLevelFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketMsgFlag */
+/*****************************************************************************/
+
+static sal_uInt32 SocketMsgFlagMap[]= {
+ 0, /* osl_Socket_MsgNormal */
+ MSG_OOB, /* osl_Socket_MsgOOB */
+ MSG_PEEK, /* osl_Socket_MsgPeek */
+ MSG_DONTROUTE, /* osl_Socket_MsgDontRoute */
+ MSG_MAXIOVLEN, /* osl_Socket_MsgMaxIOVLen */
+ 0 /* osl_Socket_MsgInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslSocketMsgFlag osl_SocketMsgFlagFromNative(sal_uInt32 nativeType)
+{
+ oslSocketMsgFlag i= (oslSocketMsgFlag)0;
+
+ while(i != osl_Socket_MsgInvalid)
+ {
+ if(SocketMsgFlagMap[i] == nativeType)
+ return i;
+ i = (oslSocketMsgFlag) ( i + 1 );
+ }
+
+ return i;
+}
+*/
+
+/* macros */
+#define MSG_FLAG_TO_NATIVE(x) SocketMsgFlagMap[x]
+#define MSG_FLAG_FROM_NATIVE(y) osl_SocketMsgFlagFromNative(y)
+
+
+/*****************************************************************************/
+/* enum oslSocketDirection */
+/*****************************************************************************/
+
+static sal_uInt32 SocketDirection[]= {
+ SD_RECEIVE, /* osl_Socket_DirRead */
+ SD_SEND, /* osl_Socket_DirWrite */
+ SD_BOTH, /* osl_Socket_DirReadWrite */
+ 0 /* osl_Socket_DirInvalid */
+};
+
+/* reverse map */
+/* mfe: NOT USED
+static oslSocketDirection osl_SocketDirectionFromNative(sal_uInt32 nativeType)
+{
+ oslSocketDirection i= (oslSocketDirection)0;
+
+ while(i != osl_Socket_DirInvalid)
+ {
+ if(SocketDirection[i] == nativeType)
+ return i;
+ i = (oslSocketDirection) ( i + 1 );
+ }
+
+ return i;
+}
+*/
+
+/* macros */
+#define DIRECTION_TO_NATIVE(x) SocketDirection[x]
+#define DIRECTION_FROM_NATIVE(y) osl_SocketDirectionFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketError */
+/*****************************************************************************/
+
+static struct
+{
+ int errcode;
+ oslSocketError error;
+} SocketError[]= {
+ { 0, osl_Socket_E_None }, /* no error */
+ { ENOTSOCK, osl_Socket_E_NotSocket }, /* Socket operation on non-socket */
+ { EDESTADDRREQ, osl_Socket_E_DestAddrReq }, /* Destination address required */
+ { EMSGSIZE, osl_Socket_E_MsgSize }, /* Message too long */
+ { EPROTOTYPE, osl_Socket_E_Prototype }, /* Protocol wrong type for socket */
+ { ENOPROTOOPT, osl_Socket_E_NoProtocol }, /* Protocol not available */
+ { EPROTONOSUPPORT, osl_Socket_E_ProtocolNoSupport }, /* Protocol not supported */
+ { ESOCKTNOSUPPORT, osl_Socket_E_TypeNoSupport }, /* Socket type not supported */
+ { EOPNOTSUPP, osl_Socket_E_OpNotSupport }, /* Operation not supported on socket */
+ { EPFNOSUPPORT, osl_Socket_E_PfNoSupport }, /* Protocol family not supported */
+ { EAFNOSUPPORT, osl_Socket_E_AfNoSupport }, /* Address family not supported by */
+ /* protocol family */
+ { EADDRINUSE, osl_Socket_E_AddrInUse }, /* Address already in use */
+ { EADDRNOTAVAIL, osl_Socket_E_AddrNotAvail }, /* Can't assign requested address */
+ { ENETDOWN, osl_Socket_E_NetDown }, /* Network is down */
+ { ENETUNREACH, osl_Socket_E_NetUnreachable }, /* Network is unreachable */
+ { ENETRESET, osl_Socket_E_NetReset }, /* Network dropped connection because */
+ /* of reset */
+ { ECONNABORTED, osl_Socket_E_ConnAborted }, /* Software caused connection abort */
+ { ECONNRESET, osl_Socket_E_ConnReset }, /* Connection reset by peer */
+ { ENOBUFS, osl_Socket_E_NoBufferSpace }, /* No buffer space available */
+ { EISCONN, osl_Socket_E_IsConnected }, /* Socket is already connected */
+ { ENOTCONN, osl_Socket_E_NotConnected }, /* Socket is not connected */
+ { ESHUTDOWN, osl_Socket_E_Shutdown }, /* Can't send after socket shutdown */
+ { ETOOMANYREFS, osl_Socket_E_TooManyRefs }, /* Too many references: can't splice */
+ { ETIMEDOUT, osl_Socket_E_TimedOut }, /* Connection timed out */
+ { ECONNREFUSED, osl_Socket_E_ConnRefused }, /* Connection refused */
+ { EHOSTDOWN, osl_Socket_E_HostDown }, /* Host is down */
+ { EHOSTUNREACH, osl_Socket_E_HostUnreachable }, /* No route to host */
+ { EWOULDBLOCK, osl_Socket_E_WouldBlock }, /* call would block on non-blocking socket */
+ { EALREADY, osl_Socket_E_Already }, /* operation already in progress */
+ { EINPROGRESS, osl_Socket_E_InProgress }, /* operation now in progress */
+ { EAGAIN, osl_Socket_E_WouldBlock }, /* same as EWOULDBLOCK */
+ { -1, osl_Socket_E_InvalidError }
+};
+
+/* map */
+/* mfe: NOT USED
+static int osl_NativeFromSocketError(oslSocketError errorCode)
+{
+ int i = 0;
+
+ while ((SocketError[i].error != osl_Socket_E_InvalidError) &&
+ (SocketError[i].error != errorCode)) i++;
+
+ return SocketError[i].errcode;
+}
+*/
+
+/* reverse map */
+static oslSocketError osl_SocketErrorFromNative(int nativeType)
+{
+ int i = 0;
+
+ while ((SocketError[i].error != osl_Socket_E_InvalidError) &&
+ (SocketError[i].errcode != nativeType)) i++;
+
+ return SocketError[i].error;
+}
+
+/* macros */
+#define ERROR_TO_NATIVE(x) osl_NativeFromSocketError(x)
+#define ERROR_FROM_NATIVE(y) osl_SocketErrorFromNative(y)
+
+/*****************************************************************************/
+/* local function prototypes */
+/*****************************************************************************/
+
+oslSocketAddr SAL_CALL osl_psz_createInetSocketAddr (
+ const sal_Char* pszDottedAddr, sal_Int32 Port);
+
+oslSocketAddr SAL_CALL osl_psz_createIpxSocketAddr (
+ const sal_Char NetNumber[4],
+ const sal_Char NodeNumber[6],
+ sal_uInt32 SocketNumber);
+
+oslHostAddr SAL_CALL osl_psz_createHostAddr (
+ const sal_Char *pszHostname, const oslSocketAddr Addr);
+
+oslHostAddr SAL_CALL osl_psz_createHostAddrByName (
+ const sal_Char *pszHostname);
+
+const sal_Char* SAL_CALL osl_psz_getHostnameOfHostAddr (
+ const oslHostAddr Addr);
+
+oslSocketResult SAL_CALL osl_psz_getLocalHostname (
+ sal_Char *pBuffer, sal_uInt32 nBufLen);
+
+oslSocketAddr SAL_CALL osl_psz_resolveHostname (
+ const sal_Char* pszHostname);
+
+sal_Int32 SAL_CALL osl_psz_getServicePort (
+ const sal_Char* pszServicename, const sal_Char* pszProtocol);
+
+oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr (
+ oslSocketAddr Addr, sal_Char *pBuffer, sal_uInt32 BufferSize);
+
+oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr (
+ oslSocketAddr Addr, sal_Char *pBuffer, sal_uInt32 BufferSize);
+
+void SAL_CALL osl_psz_getLastSocketErrorDescription (
+ oslSocket Socket, sal_Char* pBuffer, sal_uInt32 BufferSize);
+
+/*****************************************************************************/
+/* osl_create/destroy-SocketImpl */
+/*****************************************************************************/
+
+#if OSL_DEBUG_LEVEL > 1
+static sal_uInt32 g_nSocketImpl = 0;
+static sal_uInt32 g_nSocketAddr = 0;
+
+/* sorry, must be implemented otherwise */
+#if 0
+struct LeakWarning
+{
+ ~LeakWarning()
+ {
+ if( g_nSocketImpl )
+ OSL_TRACE( "sal_socket: %d socket instances leak\n" , g_nSocketImpl );
+ if( g_nSocketAddr )
+ OSL_TRACE( "sal_socket: %d socket address instances leak\n" , g_nSocketAddr );
+ }
+};
+LeakWarning socketWarning;
+#endif
+
+#endif /* OSL_DEBUG_LEVEL */
+
+
+oslSocket __osl_createSocketImpl(int Socket)
+{
+ oslSocket pSocket;
+
+ pSocket = (oslSocket)calloc(1, sizeof(struct oslSocketImpl));
+
+ pSocket->m_Socket = Socket;
+ pSocket->m_nLastError = 0;
+ pSocket->m_CloseCallback = 0;
+ pSocket->m_CallbackArg = 0;
+ pSocket->m_nRefCount = 1;
+
+#if defined(LINUX)
+ pSocket->m_bIsAccepting = sal_False;
+#endif
+
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketImpl ++;
+#endif
+ return pSocket;
+}
+
+void __osl_destroySocketImpl(oslSocket Socket)
+{
+ if ( Socket != NULL)
+ free((struct oslSocketImpl *) Socket);
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketImpl --;
+#endif
+}
+
+static oslSocketAddr __osl_createSocketAddr( )
+{
+ oslSocketAddr pAddr = (oslSocketAddr) rtl_allocateZeroMemory( sizeof( struct oslSocketAddrImpl ));
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketAddr ++;
+#endif
+ return pAddr;
+}
+
+static oslSocketAddr __osl_createSocketAddrWithFamily(
+ oslAddrFamily family, sal_Int32 port, sal_uInt32 nAddr )
+{
+ oslSocketAddr pAddr;
+
+ OSL_ASSERT( family == osl_Socket_FamilyInet );
+
+ pAddr = __osl_createSocketAddr();
+ switch( family )
+ {
+ case osl_Socket_FamilyInet:
+ {
+ struct sockaddr_in* pInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+
+ pInetAddr->sin_family = FAMILY_TO_NATIVE(osl_Socket_FamilyInet);
+ pInetAddr->sin_addr.s_addr = nAddr;
+ pInetAddr->sin_port = (sal_uInt16)(port&0xffff);
+ break;
+ }
+ default:
+ pAddr->m_sockaddr.sa_family = FAMILY_TO_NATIVE(family);
+ }
+ return pAddr;
+}
+
+static oslSocketAddr __osl_createSocketAddrFromSystem( struct sockaddr *pSystemSockAddr )
+{
+ oslSocketAddr pAddr = __osl_createSocketAddr();
+ memcpy( &(pAddr->m_sockaddr), pSystemSockAddr, sizeof( struct sockaddr ) );
+ return pAddr;
+}
+
+static void __osl_destroySocketAddr( oslSocketAddr addr )
+{
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketAddr --;
+#endif
+ rtl_freeMemory( addr );
+}
+
+/*****************************************************************************/
+/* osl_createEmptySocketAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createEmptySocketAddr(oslAddrFamily Family)
+{
+ oslSocketAddr pAddr = 0;
+
+ /* is it an internet-Addr? */
+ if (Family == osl_Socket_FamilyInet)
+ {
+ pAddr = __osl_createSocketAddrWithFamily(Family, 0 , htonl(INADDR_ANY) );
+ }
+ else
+ {
+ pAddr = __osl_createSocketAddrWithFamily( Family , 0 , 0 );
+ }
+
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_copySocketAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_copySocketAddr(oslSocketAddr Addr)
+{
+ oslSocketAddr pCopy = 0;
+ if (Addr)
+ {
+ pCopy = __osl_createSocketAddr();
+
+ if (pCopy)
+ memcpy(&(pCopy->m_sockaddr),&(Addr->m_sockaddr), sizeof(struct sockaddr));
+ }
+ return pCopy;
+}
+
+/*****************************************************************************/
+/* osl_isEqualSocketAddr */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isEqualSocketAddr (
+ oslSocketAddr Addr1,
+ oslSocketAddr Addr2)
+{
+ struct sockaddr* pAddr1= &(Addr1->m_sockaddr);
+ struct sockaddr* pAddr2= &(Addr2->m_sockaddr);
+
+ OSL_ASSERT(pAddr1);
+ OSL_ASSERT(pAddr2);
+
+ if (pAddr1->sa_family == pAddr2->sa_family)
+ {
+ switch (pAddr1->sa_family)
+ {
+ case AF_INET:
+ {
+ struct sockaddr_in* pInetAddr1= (struct sockaddr_in*)pAddr1;
+ struct sockaddr_in* pInetAddr2= (struct sockaddr_in*)pAddr2;
+
+ if ((pInetAddr1->sin_family == pInetAddr2->sin_family) &&
+ (pInetAddr1->sin_addr.s_addr == pInetAddr2->sin_addr.s_addr) &&
+ (pInetAddr1->sin_port == pInetAddr2->sin_port))
+ return (sal_True);
+ }
+
+ default:
+ {
+ return (memcmp(pAddr1, Addr2, sizeof(struct sockaddr)) == 0);
+ }
+ }
+ }
+
+ return (sal_False);
+}
+
+/*****************************************************************************/
+/* osl_createInetBroadcastAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createInetBroadcastAddr (
+ rtl_uString *strDottedAddr,
+ sal_Int32 Port)
+{
+ sal_uInt32 nAddr = OSL_INADDR_NONE;
+ oslSocketAddr pAddr;
+
+ if (strDottedAddr && strDottedAddr->length)
+ {
+ /* Dotted host address for limited broadcast */
+ rtl_String *pDottedAddr = NULL;
+
+ rtl_uString2String (
+ &pDottedAddr, strDottedAddr->buffer, strDottedAddr->length,
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ nAddr = inet_addr (pDottedAddr->buffer);
+ rtl_string_release (pDottedAddr);
+ }
+
+ if (nAddr != OSL_INADDR_NONE)
+ {
+ /* Limited broadcast */
+ nAddr = ntohl(nAddr);
+ if (IN_CLASSA(nAddr))
+ {
+ nAddr &= IN_CLASSA_NET;
+ nAddr |= IN_CLASSA_HOST;
+ }
+ else if (IN_CLASSB(nAddr))
+ {
+ nAddr &= IN_CLASSB_NET;
+ nAddr |= IN_CLASSB_HOST;
+ }
+ else if (IN_CLASSC(nAddr))
+ {
+ nAddr &= IN_CLASSC_NET;
+ nAddr |= IN_CLASSC_HOST;
+ }
+ else
+ {
+ /* No broadcast in class D */
+ return ((oslSocketAddr)NULL);
+ }
+ nAddr = htonl(nAddr);
+ }
+
+ pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons(Port), nAddr );
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_createInetSocketAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createInetSocketAddr (
+ rtl_uString *ustrDottedAddr,
+ sal_Int32 Port)
+{
+ rtl_String* strDottedAddr=0;
+ oslSocketAddr Addr;
+ sal_Char* pszDottedAddr=0;
+
+ if ( ustrDottedAddr != 0 )
+ {
+ rtl_uString2String( &strDottedAddr,
+ rtl_uString_getStr(ustrDottedAddr),
+ rtl_uString_getLength(ustrDottedAddr),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS);
+ pszDottedAddr = rtl_string_getStr(strDottedAddr);
+ }
+
+
+ Addr = osl_psz_createInetSocketAddr(pszDottedAddr, Port);
+
+ if ( strDottedAddr != 0 )
+ {
+ rtl_string_release(strDottedAddr);
+ }
+
+ return Addr;
+}
+
+oslSocketAddr SAL_CALL osl_psz_createInetSocketAddr (
+ const sal_Char* pszDottedAddr,
+ sal_Int32 Port)
+{
+ oslSocketAddr pAddr = 0;
+ sal_Int32 Addr = inet_addr(pszDottedAddr);
+ if(Addr != -1)
+ {
+ /* valid dotted addr */
+ pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons(Port) , Addr );
+ }
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_setAddrOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_setAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence *pByteSeq )
+{
+ oslSocketResult res = osl_Socket_Error;
+
+ OSL_ASSERT( pAddr );
+ OSL_ASSERT( pByteSeq );
+
+ if( pAddr && pByteSeq )
+ {
+ struct sockaddr_in * pSystemInetAddr;
+
+ OSL_ASSERT( pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE( osl_Socket_FamilyInet ) );
+ OSL_ASSERT( pByteSeq->nElements == 4 );
+
+ pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr);
+ memcpy( &(pSystemInetAddr->sin_addr) , pByteSeq->elements , 4 );
+ res = osl_Socket_Ok;
+ }
+ return res;
+}
+
+/*****************************************************************************/
+/* osl_getAddrOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence **ppByteSeq )
+{
+ oslSocketResult res = osl_Socket_Error;
+
+ OSL_ASSERT( pAddr );
+ OSL_ASSERT( ppByteSeq );
+
+ if( pAddr && ppByteSeq )
+ {
+ struct sockaddr_in * pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr);
+ rtl_byte_sequence_constructFromArray( ppByteSeq , (sal_Int8 *) &(pSystemInetAddr->sin_addr),4);
+ res = osl_Socket_Ok;
+ }
+ return res;
+}
+
+
+/*****************************************************************************/
+/* _osl_getFullQualifiedDomainName */
+/*****************************************************************************/
+
+/** try to figure out a full-qualified hostname, by adding the current domain
+ as given by the domainname program to the given hostname.
+ This function MUST NOT call gethostbyname since pHostName allready points
+ to data returned by gethostname and would be garbled: use gethostname_r
+ instead!
+ */
+
+/* wrap around different interfaces to reentrant gethostbyname */
+static struct hostent* _osl_gethostbyname_r (
+ const char *name, struct hostent *result,
+ char *buffer, int buflen, int *h_errnop)
+{
+#if defined(LINUX) || (defined(FREEBSD) && (__FreeBSD_version >= 601103))
+ struct hostent *__result; /* will be the same as result */
+ int __error;
+ __error = gethostbyname_r (name, result, buffer, buflen,
+ &__result, h_errnop);
+ return __error ? NULL : __result ;
+#else
+ return gethostbyname_r( name, result, buffer, buflen, h_errnop);
+#endif
+}
+
+static sal_Bool _osl_getDomainName (sal_Char *buffer, sal_Int32 bufsiz)
+{
+ sal_Bool result;
+ int p[2];
+
+ result = sal_False;
+ if (pipe (p) == 0)
+ {
+ pid_t pid;
+ int nStatus;
+
+ pid = fork();
+ if (pid == 0)
+ {
+ char *argv[] =
+ {
+ "/bin/domainname",
+ NULL
+ };
+
+ close (p[0]);
+ dup2 (p[1], 1);
+ close (p[1]);
+
+ execv ("/bin/domainname", argv);
+ // arriving here means exec failed
+ _exit(-1);
+ }
+ else if (pid > 0)
+ {
+ sal_Int32 k = 0, n = bufsiz;
+
+ close (p[1]);
+ if ((k = read (p[0], buffer, n - 1)) > 0)
+ {
+ buffer[k] = 0;
+ if (buffer[k - 1] == '\n')
+ buffer[k - 1] = 0;
+ result = sal_True;
+ }
+ close (p[0]);
+ waitpid (pid, &nStatus, 0);
+ }
+ else
+ {
+ close (p[0]);
+ close (p[1]);
+ }
+ }
+ return (result);
+}
+
+static sal_Char* _osl_getFullQualifiedDomainName (const sal_Char *pHostName)
+{
+# define DOMAINNAME_LENGTH 512
+ sal_uInt32 nLengthOfHostName;
+ static sal_uInt32 nLengthOfDomainName = 0;
+ static sal_Char *pDomainName = NULL;
+
+ sal_Char *pFullQualifiedName;
+#if 0 /* OBSOLETE */
+ FILE *pPipeToDomainnameExe;
+#endif /* OBSOLETE */
+
+ /* get a '\0' terminated domainname */
+
+ /* read default domainname default from environment */
+ if (nLengthOfDomainName == 0)
+ {
+ sal_Char *pEnvDomain;
+
+ pEnvDomain = getenv ("STAR_OVERRIDE_DOMAINNAME");
+ if (pEnvDomain)
+ {
+ pDomainName = strdup (pEnvDomain);
+ nLengthOfDomainName = strlen (pDomainName);
+ }
+ }
+
+#if 1 /* NEW */
+ if (nLengthOfDomainName == 0)
+ {
+ sal_Char pDomainNameBuffer[ DOMAINNAME_LENGTH ];
+
+ pDomainNameBuffer[0] = '\0';
+
+ if (_osl_getDomainName (pDomainNameBuffer, DOMAINNAME_LENGTH))
+ {
+ pDomainName = strdup (pDomainNameBuffer);
+ nLengthOfDomainName = strlen (pDomainName);
+ }
+ }
+
+#endif /* NEW */
+#if 0 /* OBSOLETE */
+#ifdef SCO
+
+ /* call 'domainname > /usr/tmp/some-tmp-file', since
+ popen read pclose do block or core-dump,
+ (even the pipe-stuff that comes with pthreads) */
+ if (nLengthOfDomainName == 0)
+ {
+ sal_Char tmp_name[ L_tmpnam ];
+ FILE *tmp_file;
+ sal_Char domain_call [ L_tmpnam + 16 ] = "domainname > ";
+
+ tmp_name[0] = '\0';
+
+ tmpnam ( tmp_name );
+ strcat ( domain_call, tmp_name );
+ if ( (system ( domain_call ) == 0)
+ && ((tmp_file = fopen( tmp_name, "r" )) != NULL ) )
+ {
+ sal_Char pDomainNameBuffer[ DOMAINNAME_LENGTH ];
+
+ pDomainNameBuffer[0] = '\0';
+
+ if ( fgets ( pDomainNameBuffer, DOMAINNAME_LENGTH, tmp_file ) )
+ {
+ pDomainName = strdup( pDomainNameBuffer );
+ nLengthOfDomainName = strlen( pDomainName );
+ if ( ( nLengthOfDomainName > 0 )
+ && ( pDomainName[ nLengthOfDomainName - 1] == '\n' ) )
+ pDomainName[ --nLengthOfDomainName ] = '\0';
+ }
+ fclose ( tmp_file );
+ }
+ unlink( tmp_name );
+ }
+
+#else /* !SCO */
+
+ /* read the domainname from pipe to the program domainname */
+ if ( (nLengthOfDomainName == 0)
+ && (pPipeToDomainnameExe = popen( "domainname", "r")) )
+ {
+ sal_Char c;
+ sal_Char pDomainNameBuffer[ DOMAINNAME_LENGTH ];
+ sal_Char *pDomainNamePointer;
+
+ pDomainNameBuffer[0] = '\0';
+
+ pDomainNamePointer = pDomainNameBuffer;
+ while ( ((c = getc( pPipeToDomainnameExe )) != EOF)
+ && (nLengthOfDomainName < (DOMAINNAME_LENGTH - 1)) )
+ {
+ if (! isspace(c))
+ {
+ nLengthOfDomainName++ ;
+ *pDomainNamePointer++ = (sal_Char)c;
+ }
+ }
+ *pDomainNamePointer = '\0';
+ pDomainName = strdup( pDomainNameBuffer );
+
+ pclose( pPipeToDomainnameExe );
+ }
+
+#endif /* !SCO */
+#endif /* OBSOLETE */
+
+ /* compose hostname and domainname */
+ nLengthOfHostName = strlen( pHostName );
+ pFullQualifiedName = (sal_Char*) malloc( (nLengthOfHostName + 1
+ + nLengthOfDomainName + 1) * sizeof(sal_Char) );
+ memcpy( pFullQualifiedName, pHostName,
+ (nLengthOfHostName + 1) * sizeof(sal_Char) );
+
+ if ( nLengthOfDomainName > 0 )
+ {
+ /* fqdn = hostname + '.' + domainname + '\0' */
+ pFullQualifiedName[ nLengthOfHostName ] = '.';
+ memcpy( pFullQualifiedName + nLengthOfHostName + 1, pDomainName,
+ nLengthOfDomainName + 1 );
+ }
+
+ /* check whether full-qualified name and hostname point to the same host
+ * should almost always be true */
+ if ( nLengthOfDomainName > 0 )
+ {
+ struct hostent *pQualifiedHostByName;
+ struct hostent *pHostByName;
+ sal_Bool bHostsAreEqual;
+
+ /* buffer for calls to reentrant version of gethostbyname */
+ struct hostent aHostByName, aQualifiedHostByName;
+ sal_Char pHostBuffer[ MAX_HOSTBUFFER_SIZE ];
+ sal_Char pQualifiedHostBuffer[ MAX_HOSTBUFFER_SIZE ];
+ int nErrorNo;
+
+ pHostBuffer[0] = '\0';
+ pQualifiedHostBuffer[0] = '\0';
+
+ /* get list of addresses */
+ pQualifiedHostByName = _osl_gethostbyname_r (
+ pFullQualifiedName,
+ &aQualifiedHostByName, pQualifiedHostBuffer,
+ sizeof(pQualifiedHostBuffer), &nErrorNo );
+ pHostByName = _osl_gethostbyname_r (
+ pHostName,
+ &aHostByName, pHostBuffer,
+ sizeof(pHostBuffer), &nErrorNo );
+
+ /* compare addresses */
+ bHostsAreEqual = sal_False;
+ if ( pQualifiedHostByName && pHostByName )
+ {
+ sal_Char **p, **q;
+ struct in_addr in;
+
+ /* lists are expected to be (very) short */
+ for ( p = pQualifiedHostByName->h_addr_list; *p != NULL; p++ )
+ {
+ for ( q = pHostByName->h_addr_list; *q != NULL; q++ )
+ {
+ /* in.s_addr may be in_addr_t or uint32_t or heaven knows */
+ if ( memcmp( *p, *q, sizeof(in.s_addr) ) == 0 )
+ {
+ bHostsAreEqual = sal_True;
+ break;
+ }
+ }
+ if ( bHostsAreEqual )
+ break;
+ }
+ }
+
+ /* very strange case, but have to believe it: reduce the
+ * full qualified name to the unqualified host name */
+ if ( !bHostsAreEqual )
+ {
+ OSL_TRACE("_osl_getFullQualifiedDomainName: "
+ "suspect FQDN: %s\n", pFullQualifiedName);
+
+ pFullQualifiedName[ nLengthOfHostName ] = '\0';
+ pFullQualifiedName = (sal_Char*)realloc ( pFullQualifiedName,
+ (nLengthOfHostName + 1) * sizeof( sal_Char ));
+ }
+ }
+
+ /* always return a hostname looked up as carefully as possible
+ * this string must be freed by the caller */
+ return pFullQualifiedName;
+}
+
+/*****************************************************************************/
+/* _osl_isFullQualifiedDomainName */
+/*****************************************************************************/
+static sal_Bool _osl_isFullQualifiedDomainName (const sal_Char *pHostName)
+{
+ /* a FQDN (aka 'hostname.domain.top_level_domain' )
+ * is a name which contains a dot '.' in it ( would
+ * match as well for 'hostname.' but is good enough
+ * for now )*/
+ return (sal_Bool)( strchr( pHostName, (int)'.' ) != NULL );
+}
+
+/*****************************************************************************/
+/* oslHostAddr */
+/*****************************************************************************/
+struct oslHostAddrImpl
+{
+ sal_Char *pHostName;
+ oslSocketAddr pSockAddr;
+};
+
+static oslHostAddr _osl_hostentToHostAddr (const struct hostent *he)
+{
+ oslHostAddr pAddr= NULL;
+ oslSocketAddr pSockAddr = 0;
+
+ sal_Char *cn;
+
+ if ((he == NULL) || (he->h_name == NULL) || (he->h_addr_list[0] == NULL))
+ return ((oslHostAddr)NULL);
+
+ if (_osl_isFullQualifiedDomainName(he->h_name))
+ {
+ cn= (sal_Char *)malloc(strlen (he->h_name) + 1);
+ OSL_ASSERT(cn);
+ if (cn == NULL)
+ return ((oslHostAddr)NULL);
+
+ strcpy(cn, he->h_name);
+ }
+ else
+ {
+ cn =_osl_getFullQualifiedDomainName (he->h_name);
+ OSL_ASSERT(cn);
+ if (cn == NULL)
+ return ((oslHostAddr)NULL);
+ }
+
+ pSockAddr = __osl_createSocketAddr();
+ OSL_ASSERT(pSockAddr);
+ if (pSockAddr == NULL)
+ {
+ free(cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pSockAddr->m_sockaddr.sa_family= he->h_addrtype;
+ if (pSockAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ struct sockaddr_in *sin= (struct sockaddr_in *)&(pSockAddr->m_sockaddr);
+ memcpy (
+ &(sin->sin_addr.s_addr),
+ he->h_addr_list[0],
+ he->h_length);
+ }
+ else
+ {
+ /* unknown address family */
+ /* future extensions for new families might be implemented here */
+
+ OSL_TRACE("_osl_hostentToHostAddr: unknown address family.\n");
+ OSL_ASSERT(sal_False);
+
+ __osl_destroySocketAddr( pSockAddr );
+ free (cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pAddr= (oslHostAddr) malloc(sizeof(struct oslHostAddrImpl));
+ OSL_ASSERT(pAddr);
+ if (pAddr == NULL)
+ {
+ __osl_destroySocketAddr( pSockAddr );
+ free (cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pAddr->pHostName= cn;
+ pAddr->pSockAddr= pSockAddr;
+
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_createHostAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddr (
+ rtl_uString *ustrHostname,
+ const oslSocketAddr Addr)
+{
+ oslHostAddr HostAddr;
+ rtl_String* strHostname=0;
+ sal_Char* pszHostName=0;
+
+ if ( ustrHostname != 0 )
+ {
+ rtl_uString2String( &strHostname,
+ rtl_uString_getStr(ustrHostname),
+ rtl_uString_getLength(ustrHostname),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszHostName = rtl_string_getStr(strHostname);
+ }
+
+ HostAddr = osl_psz_createHostAddr(pszHostName,Addr);
+
+ if ( strHostname != 0 )
+ {
+ rtl_string_release(strHostname);
+ }
+
+
+ return HostAddr;
+}
+
+oslHostAddr SAL_CALL osl_psz_createHostAddr (
+ const sal_Char *pszHostname,
+ const oslSocketAddr pAddr)
+{
+ oslHostAddr pHostAddr;
+ sal_Char *cn;
+
+ OSL_ASSERT(pszHostname && pAddr);
+ if ((pszHostname == NULL) || (pAddr == NULL))
+ return ((oslHostAddr)NULL);
+
+ cn = (sal_Char *)malloc(strlen (pszHostname) + 1);
+ OSL_ASSERT(cn);
+ if (cn == NULL)
+ return ((oslHostAddr)NULL);
+
+ strcpy (cn, pszHostname);
+
+ pHostAddr= (oslHostAddr) malloc(sizeof(struct oslHostAddrImpl));
+ OSL_ASSERT(pHostAddr);
+ if (pAddr == NULL)
+ {
+ free (cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pHostAddr->pHostName= cn;
+ pHostAddr->pSockAddr= osl_copySocketAddr( pAddr );
+
+ return pHostAddr;
+}
+
+/*****************************************************************************/
+/* osl_createHostAddrByName */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddrByName(rtl_uString *ustrHostname)
+{
+ oslHostAddr HostAddr;
+ rtl_String* strHostname=0;
+ sal_Char* pszHostName=0;
+
+ if ( ustrHostname != 0 )
+ {
+ rtl_uString2String( &strHostname,
+ rtl_uString_getStr(ustrHostname),
+ rtl_uString_getLength(ustrHostname),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszHostName=rtl_string_getStr(strHostname);
+ }
+
+ HostAddr = osl_psz_createHostAddrByName(pszHostName);
+
+ if ( strHostname != 0 )
+ {
+ rtl_string_release(strHostname);
+ }
+
+ return HostAddr;
+}
+
+oslHostAddr SAL_CALL osl_psz_createHostAddrByName (const sal_Char *pszHostname)
+{
+ struct hostent *he;
+ oslHostAddr addr;
+
+ static oslMutex mutex = NULL;
+
+ if (mutex == NULL)
+ mutex = osl_createMutex();
+
+ osl_acquireMutex(mutex);
+
+ he = gethostbyname((sal_Char *)pszHostname);
+ addr = _osl_hostentToHostAddr (he);
+
+ osl_releaseMutex(mutex);
+
+ return addr;
+}
+
+/*****************************************************************************/
+/* osl_createHostAddrByAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddrByAddr (const oslSocketAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr == NULL)
+ return ((oslHostAddr)NULL);
+
+ if (pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ const struct sockaddr_in *sin= (const struct sockaddr_in *)&(pAddr->m_sockaddr);
+ struct hostent *he;
+
+ if (sin->sin_addr.s_addr == htonl(INADDR_ANY))
+ return ((oslHostAddr)NULL);
+
+ he= gethostbyaddr((sal_Char *)&(sin->sin_addr),
+ sizeof (sin->sin_addr),
+ sin->sin_family);
+ return _osl_hostentToHostAddr (he);
+ }
+
+ return ((oslHostAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_copyHostAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_copyHostAddr (const oslHostAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr)
+ return osl_psz_createHostAddr (pAddr->pHostName, pAddr->pSockAddr);
+ else
+ return ((oslHostAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_getHostnameOfHostAddr */
+/*****************************************************************************/
+void SAL_CALL osl_getHostnameOfHostAddr (
+ const oslHostAddr Addr,
+ rtl_uString **ustrHostname)
+{
+ const sal_Char* pHostname=0;
+
+ pHostname = osl_psz_getHostnameOfHostAddr(Addr);
+
+ rtl_uString_newFromAscii (ustrHostname, pHostname);
+
+ return;
+}
+
+const sal_Char* SAL_CALL osl_psz_getHostnameOfHostAddr (const oslHostAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr)
+ return pAddr->pHostName;
+ else
+ return NULL;
+}
+
+/*****************************************************************************/
+/* osl_getSocketAddrOfHostAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getSocketAddrOfHostAddr (const oslHostAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr)
+ return ((oslSocketAddr)(pAddr->pSockAddr));
+ else
+ return NULL;
+}
+
+/*****************************************************************************/
+/* osl_destroyHostAddr */
+/*****************************************************************************/
+void SAL_CALL osl_destroyHostAddr (oslHostAddr pAddr)
+{
+ if (pAddr)
+ {
+ if (pAddr->pHostName)
+ free (pAddr->pHostName);
+ if (pAddr->pSockAddr)
+ osl_destroySocketAddr (pAddr->pSockAddr);
+ free (pAddr);
+ }
+}
+
+/*****************************************************************************/
+/* osl_getLocalHostname */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getLocalHostname(rtl_uString **ustrLocalHostname)
+{
+ oslSocketResult Result;
+ sal_Char pszHostname[1024];
+
+ pszHostname[0] = '\0';
+
+ Result = osl_psz_getLocalHostname(pszHostname,sizeof(pszHostname));
+
+ rtl_uString_newFromAscii(ustrLocalHostname,pszHostname);
+
+ return Result;
+}
+
+oslSocketResult SAL_CALL osl_psz_getLocalHostname (
+ sal_Char *pBuffer, sal_uInt32 nBufLen)
+{
+ static sal_Char LocalHostname[256] = "";
+
+ if (strlen(LocalHostname) == 0)
+ {
+ const sal_Char *pStr;
+
+#ifdef SYSV
+ struct utsname uts;
+
+ if (uname(&uts) < 0)
+ return osl_Socket_Error;
+
+ if ((strlen(uts.nodename) + 1) > nBufLen)
+ return osl_Socket_Error;
+
+ strncpy(LocalHostname, uts.nodename, sizeof( LocalHostname ));
+#else /* BSD compatible */
+
+ if (gethostname(LocalHostname, sizeof(LocalHostname)-1) != 0)
+ return osl_Socket_Error;
+ LocalHostname[sizeof(LocalHostname)-1] = 0;
+#endif /* SYSV */
+
+ /* check if we have an FQDN */
+ if (strchr(LocalHostname, '.') == NULL)
+ {
+ oslHostAddr Addr;
+
+ /* no, determine it via dns */
+ Addr = osl_psz_createHostAddrByName(LocalHostname);
+
+ if ((pStr = osl_psz_getHostnameOfHostAddr(Addr)) != NULL)
+ {
+#if 0 /* OBSOLETE */
+ sal_Char* pChr;
+#endif /* OBSOLETE */
+ strcpy(LocalHostname, pStr);
+
+#if 0 /* OBSOLETE */
+ /* already done by _osl_getFullQualifiedDomainName() with
+ much better heuristics, so this may be contraproductive */
+
+ /* no FQDN, last try append domain name */
+ if ((pChr = strchr(LocalHostname, '.')) == NULL)
+ {
+ FILE *fp;
+
+ pChr = &LocalHostname[strlen(LocalHostname)];
+
+ if ( (fp = popen("domainname", "r")) != 0 )
+ {
+ int c;
+
+ *pChr++ = '.';
+
+ while ((c = getc(fp)) != EOF)
+ {
+ if (! isspace(c))
+ *pChr++ = (sal_Char)c;
+ }
+
+ *pChr = '\0';
+
+ fclose(fp);
+ }
+ else
+ LocalHostname[0] = '\0';
+ }
+#endif /* OBSOLETE */
+
+ }
+ osl_destroyHostAddr(Addr);
+ }
+ }
+
+ if (strlen(LocalHostname) > 0)
+ {
+ strncpy(pBuffer, LocalHostname, nBufLen);
+ pBuffer[nBufLen - 1] = '\0';
+
+ return osl_Socket_Ok;
+ }
+
+ return osl_Socket_Error;
+}
+
+/*****************************************************************************/
+/* osl_resolveHostname */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_resolveHostname(rtl_uString *ustrHostname)
+{
+ oslSocketAddr Addr;
+ rtl_String* strHostname=0;
+ sal_Char* pszHostName=0;
+
+ if ( ustrHostname != 0 )
+ {
+ rtl_uString2String( &strHostname,
+ rtl_uString_getStr(ustrHostname),
+ rtl_uString_getLength(ustrHostname),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszHostName = rtl_string_getStr(strHostname);
+ }
+
+
+ Addr = osl_psz_resolveHostname(pszHostName);
+
+ if ( strHostname != 0 )
+ {
+ rtl_string_release(strHostname);
+ }
+
+
+ return Addr;
+}
+
+
+oslSocketAddr SAL_CALL osl_psz_resolveHostname(const sal_Char* pszHostname)
+{
+ struct oslHostAddrImpl *pAddr = (oslHostAddr)osl_psz_createHostAddrByName(pszHostname);
+
+ if (pAddr)
+ {
+ oslSocketAddr SockAddr = osl_copySocketAddr(pAddr->pSockAddr);
+
+ osl_destroyHostAddr(pAddr);
+
+ return (SockAddr);
+ }
+
+ return ((oslSocketAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_getServicePort */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getServicePort(rtl_uString *ustrServicename, rtl_uString *ustrProtocol)
+{
+ sal_Int32 nPort;
+ rtl_String* strServicename=0;
+ rtl_String* strProtocol=0;
+ sal_Char* pszServiceName=0;
+ sal_Char* pszProtocol=0;
+
+ if ( ustrServicename != 0 )
+ {
+ rtl_uString2String( &strServicename,
+ rtl_uString_getStr(ustrServicename),
+ rtl_uString_getLength(ustrServicename),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszServiceName = rtl_string_getStr(strServicename);
+ }
+
+ if ( ustrProtocol != 0 )
+ {
+ rtl_uString2String( &strProtocol,
+ rtl_uString_getStr(ustrProtocol),
+ rtl_uString_getLength(ustrProtocol),
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS );
+ pszProtocol = rtl_string_getStr(strProtocol);
+ }
+
+ nPort = osl_psz_getServicePort(pszServiceName,pszProtocol);
+
+ if ( strServicename != 0 )
+ {
+ rtl_string_release(strServicename);
+ }
+
+ if ( strProtocol != 0 )
+ {
+ rtl_string_release(strProtocol);
+ }
+
+
+ return nPort;
+}
+
+
+sal_Int32 SAL_CALL osl_psz_getServicePort(const sal_Char* pszServicename,
+ const sal_Char* pszProtocol)
+{
+ struct servent* ps;
+
+ ps= getservbyname(pszServicename, pszProtocol);
+
+ if (ps != 0)
+ return ntohs(ps->s_port);
+
+ return OSL_INVALID_PORT;
+}
+
+/*****************************************************************************/
+/* osl_destroySocketAddr */
+/*****************************************************************************/
+void SAL_CALL osl_destroySocketAddr(oslSocketAddr pAddr)
+{
+ __osl_destroySocketAddr( pAddr );
+}
+
+/*****************************************************************************/
+/* osl_getFamilyOfSocketAddr */
+/*****************************************************************************/
+oslAddrFamily SAL_CALL osl_getFamilyOfSocketAddr(oslSocketAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+
+ if (pAddr)
+ return FAMILY_FROM_NATIVE(pAddr->m_sockaddr.sa_family);
+ else
+ return osl_Socket_FamilyInvalid;
+}
+
+/*****************************************************************************/
+/* osl_getInetPortOfSocketAddr */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getInetPortOfSocketAddr(oslSocketAddr pAddr)
+{
+ OSL_ASSERT(pAddr);
+ if( pAddr )
+ {
+ struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+
+ if ( pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ return ntohs(pSystemInetAddr->sin_port);
+ }
+ return OSL_INVALID_PORT;
+}
+
+/*****************************************************************************/
+/* osl_setInetPortOfSocketAddr */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setInetPortOfSocketAddr(oslSocketAddr pAddr, sal_Int32 Port)
+{
+ OSL_ASSERT(pAddr);
+ if( pAddr )
+ {
+ struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+ if ( pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ pSystemInetAddr->sin_port= htons((short)Port);
+ return sal_True;
+ }
+ }
+
+ /* this is not a inet-addr => can't set port */
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_getHostnameOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getHostnameOfSocketAddr(oslSocketAddr Addr, rtl_uString **ustrHostname)
+{
+ oslSocketResult Result;
+ sal_Char pszHostname[1024];
+
+ pszHostname[0] = '\0';
+
+ Result = osl_psz_getHostnameOfSocketAddr(Addr,pszHostname,sizeof(pszHostname));
+
+ rtl_uString_newFromAscii(ustrHostname,pszHostname);
+
+ return Result;
+}
+
+
+oslSocketResult SAL_CALL osl_psz_getHostnameOfSocketAddr(oslSocketAddr pAddr,
+ sal_Char *pBuffer, sal_uInt32 BufferSize)
+{
+ oslHostAddr pHostAddr= (oslHostAddr )osl_createHostAddrByAddr(pAddr);
+
+ if (pHostAddr)
+ {
+ strncpy(pBuffer, pHostAddr->pHostName, BufferSize);
+
+ pBuffer[BufferSize - 1] = '\0';
+
+ osl_destroyHostAddr(pHostAddr);
+
+ return osl_Socket_Ok;
+ }
+
+ return osl_Socket_Error;
+}
+
+/*****************************************************************************/
+/* osl_getDottedInetAddrOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getDottedInetAddrOfSocketAddr(oslSocketAddr Addr, rtl_uString **ustrDottedInetAddr)
+{
+ oslSocketResult Result;
+ sal_Char pszDottedInetAddr[1024];
+
+ pszDottedInetAddr[0] = '\0';
+
+ Result = osl_psz_getDottedInetAddrOfSocketAddr(Addr,pszDottedInetAddr,sizeof(pszDottedInetAddr));
+
+ rtl_uString_newFromAscii(ustrDottedInetAddr,pszDottedInetAddr);
+
+ return Result;
+
+}
+
+oslSocketResult SAL_CALL osl_psz_getDottedInetAddrOfSocketAddr(oslSocketAddr pAddr,
+ sal_Char *pBuffer, sal_uInt32 BufferSize)
+{
+ OSL_ASSERT(pAddr);
+
+ if( pAddr )
+ {
+ struct sockaddr_in* pSystemInetAddr = ( struct sockaddr_in * ) &(pAddr->m_sockaddr);
+
+ if (pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ strncpy(pBuffer, inet_ntoa(pSystemInetAddr->sin_addr), BufferSize);
+ pBuffer[BufferSize - 1] = '\0';
+
+ return osl_Socket_Ok;
+ }
+ }
+
+ return osl_Socket_Error;
+}
+
+#if 0 /* OBSOLETE */
+/*****************************************************************************/
+/* osl_getIpxNetNumber */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getIpxNetNumber(oslSocketAddr Addr,
+ oslSocketIpxNetNumber NetNumber)
+
+{
+ struct sockaddr_ipx* pAddr;
+
+ pAddr= (struct sockaddr_ipx*)Addr;
+
+ OSL_ASSERT(pAddr);
+
+ if (pAddr && (pAddr->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyIpx)))
+ {
+ memcpy(NetNumber, pAddr->sa_netnum, sizeof(NetNumber));
+
+ return osl_Socket_Ok;
+ }
+ else
+ return osl_Socket_Error;
+}
+
+
+/*****************************************************************************/
+/* osl_getIpxNodeNumber */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getIpxNodeNumber(oslSocketAddr Addr,
+ oslSocketIpxNodeNumber NodeNumber)
+
+{
+ struct sockaddr_ipx* pAddr;
+
+ pAddr= (struct sockaddr_ipx*)Addr;
+
+ OSL_ASSERT(pAddr);
+
+ if (pAddr && (pAddr->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyIpx)))
+ {
+ memcpy(NodeNumber, pAddr->sa_nodenum, sizeof(NodeNumber));
+
+ return osl_Socket_Ok;
+ }
+ else
+ return osl_Socket_Error;
+}
+
+
+/*****************************************************************************/
+/* osl_getIpxSocketNumber */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getIpxSocketNumber(oslSocketAddr Addr)
+{
+ struct sockaddr_ipx* pAddr= (struct sockaddr_ipx*)Addr;
+ OSL_ASSERT(pAddr);
+
+ if (pAddr && (pAddr->sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyIpx)))
+ return pAddr->sa_socket;
+ else
+ return OSL_INVALID_IPX_SOCKET_NO;
+}
+
+#endif /* OBSOLETE */
+
+/*****************************************************************************/
+/* osl_createSocket */
+/*****************************************************************************/
+oslSocket SAL_CALL osl_createSocket(oslAddrFamily Family,
+ oslSocketType Type,
+ oslProtocol Protocol)
+{
+ int Flags;
+ oslSocket pSocket;
+
+ /* alloc memory */
+ pSocket= __osl_createSocketImpl(OSL_INVALID_SOCKET);
+
+ /* create socket */
+ pSocket->m_Socket= socket(FAMILY_TO_NATIVE(Family),
+ TYPE_TO_NATIVE(Type),
+ PROTOCOL_TO_NATIVE(Protocol));
+
+ /* creation failed => free memory */
+ if(pSocket->m_Socket == OSL_INVALID_SOCKET)
+ {
+ OSL_TRACE("osl_createSocket failed. Errno: %d; %s\n",
+ errno,
+ strerror(errno));
+
+ __osl_destroySocketImpl((pSocket));
+ pSocket= 0;
+ }
+ else
+ {
+ /* set close-on-exec flag */
+ if ((Flags = fcntl(pSocket->m_Socket, F_GETFD, 0)) != -1)
+ {
+ Flags |= FD_CLOEXEC;
+ if (fcntl(pSocket->m_Socket, F_SETFD, Flags) == -1)
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_createSocket failed changing socket flags. Errno: %d; %s\n",
+ errno,
+ strerror(errno));
+ }
+ }
+ else
+ {
+ pSocket->m_nLastError=errno;
+ }
+
+
+ pSocket->m_CloseCallback = NULL;
+ pSocket->m_CallbackArg = NULL;
+ }
+
+ return pSocket;
+}
+
+void SAL_CALL osl_acquireSocket(oslSocket pSocket)
+{
+ osl_incrementInterlockedCount( &(pSocket->m_nRefCount ) );
+}
+
+void SAL_CALL osl_releaseSocket( oslSocket pSocket )
+{
+ if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) )
+ {
+#if defined(LINUX)
+ if ( pSocket->m_bIsAccepting == sal_True )
+ {
+ OSL_ENSURE(0, "osl_destroySocket : attempt to destroy socket while accepting\n");
+ return;
+ }
+#endif /* LINUX */
+ osl_closeSocket( pSocket );
+ __osl_destroySocketImpl( pSocket );
+ }
+}
+
+
+
+/*****************************************************************************/
+/* osl_closeSocket */
+/*****************************************************************************/
+void SAL_CALL osl_closeSocket(oslSocket pSocket)
+{
+ int nRet;
+ int nFD;
+
+ /* socket already invalid */
+ if(pSocket==0)
+ return;
+
+ pSocket->m_nLastError=0;
+ nFD = pSocket->m_Socket;
+
+ if (nFD == OSL_INVALID_SOCKET)
+ return;
+
+ pSocket->m_Socket = OSL_INVALID_SOCKET;
+
+#if defined(LINUX)
+ pSocket->m_bIsInShutdown = sal_True;
+
+ if ( pSocket->m_bIsAccepting == sal_True )
+ {
+ int nConnFD;
+ union {
+ struct sockaddr aSockAddr;
+ struct sockaddr_in aSockAddrIn;
+ } s;
+ socklen_t nSockLen = sizeof(s.aSockAddr);
+
+ nRet = getsockname(nFD, &s.aSockAddr, &nSockLen);
+#if OSL_DEBUG_LEVEL > 1
+ if ( nRet < 0 )
+ {
+ perror("getsockname");
+ }
+#endif /* OSL_DEBUG_LEVEL */
+
+ if ( s.aSockAddr.sa_family == AF_INET )
+ {
+ if ( s.aSockAddrIn.sin_addr.s_addr == htonl(INADDR_ANY) )
+ {
+ s.aSockAddrIn.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ }
+
+ nConnFD = socket(AF_INET, SOCK_STREAM, 0);
+#if OSL_DEBUG_LEVEL > 1
+ if ( nConnFD < 0 )
+ {
+ perror("socket");
+ }
+#endif /* OSL_DEBUG_LEVEL */
+
+ nRet = connect(nConnFD, &s.aSockAddr, sizeof(s.aSockAddr));
+#if OSL_DEBUG_LEVEL > 1
+ if ( nRet < 0 )
+ {
+ perror("connect");
+ }
+#endif /* OSL_DEBUG_LEVEL */
+ close(nConnFD);
+ }
+ pSocket->m_bIsAccepting = sal_False;
+ }
+#endif /* LINUX */
+
+ /* registrierten Callback ausfuehren */
+ if (pSocket->m_CloseCallback != NULL)
+ {
+ pSocket->m_CloseCallback(pSocket->m_CallbackArg);
+ }
+
+ nRet=close(nFD);
+ if ( nRet != 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("closeSocket close error '%s'\n",strerror(errno));
+ }
+
+ pSocket->m_Socket = OSL_INVALID_SOCKET;
+}
+
+/*****************************************************************************/
+/* osl_getLocalAddrOfSocket */
+/* Note that I rely on the fact that oslSocketAddr and struct sockaddr */
+/* are the same! I don't like it very much but see no other easy way to conceal */
+/* the struct sockaddr from the eyes of the user. */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getLocalAddrOfSocket(oslSocket pSocket)
+{
+ socklen_t AddrLen;
+ struct sockaddr Addr;
+ oslSocketAddr pAddr;
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return ((oslSocketAddr)NULL);
+
+ AddrLen= sizeof(struct sockaddr);
+
+ if (getsockname(pSocket->m_Socket, &Addr, &AddrLen) == OSL_SOCKET_ERROR)
+ return ((oslSocketAddr)NULL);
+
+ pAddr = __osl_createSocketAddrFromSystem( &Addr );
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_getPeerAddrOfSocket */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getPeerAddrOfSocket(oslSocket pSocket)
+{
+ socklen_t AddrLen;
+ struct sockaddr Addr;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return 0;
+ }
+
+ pSocket->m_nLastError=0;
+ AddrLen= sizeof(struct sockaddr);
+
+ if(getpeername(pSocket->m_Socket, &Addr, &AddrLen) == OSL_SOCKET_ERROR)
+ {
+ pSocket->m_nLastError=errno;
+ return 0;
+ }
+ return __osl_createSocketAddrFromSystem( &Addr );
+}
+
+/*****************************************************************************/
+/* osl_bindAddrToSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_bindAddrToSocket(oslSocket pSocket,
+ oslSocketAddr pAddr)
+{
+ int nRet;
+
+ OSL_ASSERT(pSocket && pAddr );
+ if ( pSocket == 0 || pAddr == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRet = bind(pSocket->m_Socket, &(pAddr->m_sockaddr), sizeof(struct sockaddr));
+
+ if ( nRet == OSL_SOCKET_ERROR)
+ {
+ pSocket->m_nLastError=errno;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+
+/*****************************************************************************/
+/* osl_listenOnSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_listenOnSocket(oslSocket pSocket,
+ sal_Int32 MaxPendingConnections)
+{
+ int nRet;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRet = listen(pSocket->m_Socket,
+ MaxPendingConnections == -1 ?
+ SOMAXCONN :
+ MaxPendingConnections);
+ if ( nRet == OSL_SOCKET_ERROR)
+ {
+ pSocket->m_nLastError=errno;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+
+/*****************************************************************************/
+/* osl_connectSocketTo */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_connectSocketTo(oslSocket pSocket,
+ oslSocketAddr pAddr,
+ const TimeValue* pTimeout)
+{
+ fd_set WriteSet;
+ fd_set ExcptSet;
+ int ReadyHandles;
+ struct timeval tv;
+ oslSocketResult Result= osl_Socket_Ok;
+
+ OSL_PRECOND(pSocket, "osl_connectSocketTo(): need a valid socket!\n");
+
+ if ( pSocket == 0 )
+ {
+ return osl_Socket_Error;
+ }
+
+ pSocket->m_nLastError=0;
+
+ if (osl_isNonBlockingMode(pSocket))
+ {
+ if (connect(pSocket->m_Socket,
+ &(pAddr->m_sockaddr),
+ sizeof(struct sockaddr)) != OSL_SOCKET_ERROR)
+ return osl_Socket_Ok;
+ else
+ if (errno == EWOULDBLOCK || errno == EINPROGRESS)
+ {
+ pSocket->m_nLastError=EINPROGRESS;
+ return osl_Socket_InProgress;
+ }
+
+
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("can't connect : '%s'",strerror(errno));
+ return osl_Socket_Error;
+ }
+
+ /* set socket temporarily to non-blocking */
+ OSL_VERIFY(osl_enableNonBlockingMode(pSocket, sal_True));
+
+ /* initiate connect */
+ if(connect(pSocket->m_Socket,
+ &(pAddr->m_sockaddr),
+ sizeof(struct sockaddr)) != OSL_SOCKET_ERROR)
+ {
+ /* immediate connection */
+ osl_enableNonBlockingMode(pSocket, sal_False);
+
+ return osl_Socket_Ok;
+ }
+ else
+ {
+ /* really an error or just delayed? */
+ if (errno != EINPROGRESS)
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE(
+ "osl_connectSocketTo(): connect failed: errno: %d (%s)\n",
+ errno, strerror(errno));
+
+ osl_enableNonBlockingMode(pSocket, sal_False);
+ return osl_Socket_Error;
+ }
+ }
+
+
+ /* prepare select set for socket */
+ FD_ZERO(&WriteSet);
+ FD_ZERO(&ExcptSet);
+ FD_SET(pSocket->m_Socket, &WriteSet);
+ FD_SET(pSocket->m_Socket, &ExcptSet);
+
+ /* prepare timeout */
+ if (pTimeout)
+ {
+ /* divide milliseconds into seconds and microseconds */
+ tv.tv_sec= pTimeout->Seconds;
+ tv.tv_usec= pTimeout->Nanosec / 1000L;
+ }
+
+ /* select */
+ ReadyHandles= select(pSocket->m_Socket+1,
+ 0,
+ PTR_FD_SET(WriteSet),
+ PTR_FD_SET(ExcptSet),
+ (pTimeout) ? &tv : 0);
+
+ if (ReadyHandles > 0) /* connected */
+ {
+ if ( FD_ISSET(pSocket->m_Socket, &WriteSet ) )
+ {
+ int nErrorCode = 0;
+ socklen_t nErrorSize = sizeof( nErrorCode );
+
+ int nSockOpt;
+
+ nSockOpt = getsockopt ( pSocket->m_Socket, SOL_SOCKET, SO_ERROR,
+ &nErrorCode, &nErrorSize );
+ if ( (nSockOpt == 0) && (nErrorCode == 0))
+ Result = osl_Socket_Ok;
+ else
+ Result = osl_Socket_Error;
+ }
+ else
+ {
+ Result= osl_Socket_Error;
+ }
+ }
+ else if (ReadyHandles < 0) /* error */
+ {
+ if (errno == EBADF) /* most probably interrupted by close() */
+ {
+ /* do not access pSockImpl because it is about to be or */
+ /* already destroyed */
+ return osl_Socket_Interrupted;
+ }
+ else
+ {
+ pSocket->m_nLastError=errno;
+ Result= osl_Socket_Error;
+ }
+ }
+ else /* timeout */
+ {
+ pSocket->m_nLastError=errno;
+ Result= osl_Socket_TimedOut;
+ }
+
+ osl_enableNonBlockingMode(pSocket, sal_False);
+
+ return Result;
+}
+
+
+/*****************************************************************************/
+/* osl_acceptConnectionOnSocket */
+/*****************************************************************************/
+oslSocket SAL_CALL osl_acceptConnectionOnSocket(oslSocket pSocket,
+ oslSocketAddr* ppAddr)
+{
+ struct sockaddr Addr;
+ int Connection, Flags;
+ oslSocket pConnectionSockImpl;
+
+ socklen_t AddrLen = sizeof(struct sockaddr);
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return 0;
+ }
+
+ pSocket->m_nLastError=0;
+#if defined(LINUX)
+ pSocket->m_bIsAccepting = sal_True;
+#endif /* LINUX */
+
+ if( ppAddr && *ppAddr )
+ {
+ osl_destroySocketAddr( *ppAddr );
+ *ppAddr = 0;
+ }
+
+ /* prevent Linux EINTR behaviour */
+ do
+ {
+ Connection = accept(pSocket->m_Socket, &Addr, &AddrLen);
+ } while (Connection == -1 && errno == EINTR);
+
+
+ /* accept failed? */
+ if( Connection == OSL_SOCKET_ERROR )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_acceptConnectionOnSocket : accept error '%s'\n",strerror(errno));
+
+#if defined(LINUX)
+ pSocket->m_bIsAccepting = sal_False;
+#endif /* LINUX */
+ return 0;
+ }
+
+ OSL_ASSERT(AddrLen == sizeof(struct sockaddr));
+
+
+#if defined(LINUX)
+ if ( pSocket->m_bIsInShutdown == sal_True )
+ {
+ close(Connection);
+ OSL_TRACE("osl_acceptConnectionOnSocket : close while accept\n");
+ return 0;
+ }
+#endif /* LINUX */
+
+
+ if(ppAddr)
+ {
+ *ppAddr= __osl_createSocketAddrFromSystem(&Addr);
+ }
+
+ /* alloc memory */
+ pConnectionSockImpl= __osl_createSocketImpl(OSL_INVALID_SOCKET);
+
+ /* set close-on-exec flag */
+ if ((Flags = fcntl(Connection, F_GETFD, 0)) != -1)
+ {
+ Flags |= FD_CLOEXEC;
+ if (fcntl(Connection, F_SETFD, Flags) == -1)
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_acceptConnectionOnSocket failed changing socket flags. Errno: %d (%s)\n",
+ errno,
+ strerror(errno));
+ }
+
+ }
+
+ pConnectionSockImpl->m_Socket = Connection;
+ pConnectionSockImpl->m_nLastError = 0;
+ pConnectionSockImpl->m_CloseCallback = NULL;
+ pConnectionSockImpl->m_CallbackArg = NULL;
+#if defined(LINUX)
+ pConnectionSockImpl->m_bIsAccepting = sal_False;
+
+ pSocket->m_bIsAccepting = sal_False;
+#endif /* LINUX */
+ return pConnectionSockImpl;
+}
+
+/*****************************************************************************/
+/* osl_receiveSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receiveSocket(oslSocket pSocket,
+ void* pBuffer,
+ sal_uInt32 BytesToRead,
+ oslSocketMsgFlag Flag)
+{
+ int nRead;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ OSL_TRACE("osl_receiveSocket : Invalid socket");
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ do
+ {
+ nRead = recv(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToRead,
+ MSG_FLAG_TO_NATIVE(Flag));
+ } while ( nRead < 0 && errno == EINTR );
+
+ if ( nRead < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,strerror(errno));
+ }
+ else if ( nRead == 0 )
+ {
+ OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,"EOL");
+ }
+
+ return nRead;
+}
+
+
+/*****************************************************************************/
+/* osl_receiveFromSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receiveFromSocket(oslSocket pSocket,
+ oslSocketAddr pSenderAddr,
+ void* pBuffer,
+ sal_uInt32 BufferSize,
+ oslSocketMsgFlag Flag)
+{
+ int nRead;
+ struct sockaddr *pSystemSockAddr = 0;
+ socklen_t AddrLen = 0;
+ if( pSenderAddr )
+ {
+ AddrLen = sizeof( struct sockaddr );
+ pSystemSockAddr = &(pSenderAddr->m_sockaddr);
+ }
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ OSL_TRACE("osl_receiveFromSocket : Invalid socket");
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRead = recvfrom(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BufferSize,
+ MSG_FLAG_TO_NATIVE(Flag),
+ pSystemSockAddr,
+ &AddrLen);
+
+ if ( nRead < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_receiveFromSocket failed : %i '%s'",nRead,strerror(errno));
+ }
+ else if ( nRead == 0 )
+ {
+ OSL_TRACE("osl_receiveSocket failed : %i '%s'",nRead,"EOL");
+ }
+
+ return nRead;
+}
+
+
+/*****************************************************************************/
+/* osl_sendSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendSocket(oslSocket pSocket,
+ const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag)
+{
+ int nWritten;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ OSL_TRACE("osl_sendSocket : Invalid socket");
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ do
+ {
+ nWritten = send(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToSend,
+ MSG_FLAG_TO_NATIVE(Flag));
+ } while ( nWritten < 0 && errno == EINTR );
+
+
+ if ( nWritten < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,strerror(errno));
+ }
+ else if ( nWritten == 0 )
+ {
+ OSL_TRACE("osl_sendSocket failed : %i '%s'",nWritten,"EOL");
+ }
+
+ return nWritten;
+}
+
+/*****************************************************************************/
+/* osl_sendToSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendToSocket(oslSocket pSocket,
+ oslSocketAddr ReceiverAddr,
+ const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag)
+{
+ int nWritten;
+
+ struct sockaddr *pSystemSockAddr = 0;
+ int AddrLen = 0;
+ if( ReceiverAddr )
+ {
+ pSystemSockAddr = &(ReceiverAddr->m_sockaddr);
+ AddrLen = sizeof( struct sockaddr );
+ }
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ OSL_TRACE("osl_sendToSocket : Invalid socket");
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ /* ReceiverAddr might be 0 when used on a connected socket. */
+ /* Then sendto should behave like send. */
+
+ nWritten = sendto(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToSend,
+ MSG_FLAG_TO_NATIVE(Flag),
+ pSystemSockAddr,
+ AddrLen);
+
+ if ( nWritten < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,strerror(errno));
+ }
+ else if ( nWritten == 0 )
+ {
+ OSL_TRACE("osl_sendToSocket failed : %i '%s'",nWritten,"EOL");
+ }
+
+ return nWritten;
+}
+
+/*****************************************************************************/
+/* osl_readSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_readSocket (
+ oslSocket pSocket, void *pBuffer, sal_Int32 n )
+{
+ sal_uInt8 * Ptr = (sal_uInt8 *)pBuffer;
+ sal_uInt32 BytesRead= 0;
+ sal_uInt32 BytesToRead= n;
+
+ OSL_ASSERT( pSocket);
+
+ /* loop until all desired bytes were read or an error occured */
+ while (BytesToRead > 0)
+ {
+ sal_Int32 RetVal;
+ RetVal= osl_receiveSocket(pSocket,
+ Ptr,
+ BytesToRead,
+ osl_Socket_MsgNormal);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToRead -= RetVal;
+ BytesRead += RetVal;
+ Ptr += RetVal;
+ }
+
+ return BytesRead;
+}
+
+/*****************************************************************************/
+/* osl_writeSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_writeSocket(
+ oslSocket pSocket, const void *pBuffer, sal_Int32 n )
+{
+ /* loop until all desired bytes were send or an error occured */
+ sal_uInt32 BytesSend= 0;
+ sal_uInt32 BytesToSend= n;
+ sal_uInt8 *Ptr = ( sal_uInt8 * )pBuffer;
+
+ OSL_ASSERT( pSocket );
+
+ while (BytesToSend > 0)
+ {
+ sal_Int32 RetVal;
+
+ RetVal= osl_sendSocket( pSocket,Ptr,BytesToSend,osl_Socket_MsgNormal);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToSend -= RetVal;
+ BytesSend += RetVal;
+ Ptr += RetVal;
+
+ }
+ return BytesSend;
+}
+
+/*****************************************************************************/
+/* __osl_socket_poll */
+/*****************************************************************************/
+
+#ifdef HAVE_POLL_H /* poll() */
+
+sal_Bool __osl_socket_poll (
+ oslSocket pSocket,
+ const TimeValue* pTimeout,
+ short nEvent)
+{
+ struct pollfd fds;
+ int timeout;
+ int result;
+
+ OSL_ASSERT(pSocket);
+ pSocket->m_nLastError = 0;
+
+ fds.fd = pSocket->m_Socket;
+ fds.events = nEvent;
+ fds.revents = 0;
+
+ timeout = -1;
+ if (pTimeout)
+ {
+ /* Convert to [ms] */
+ timeout = pTimeout->Seconds * 1000;
+ timeout += pTimeout->Nanosec / (1000 * 1000);
+ }
+
+ result = poll (&fds, 1, timeout);
+ if (result < 0)
+ {
+ pSocket->m_nLastError = errno;
+ OSL_TRACE("__osl_socket_poll(): poll error: %d (%s)",
+ errno, strerror(errno));
+ return sal_False;
+ }
+ if (result == 0)
+ {
+ /* Timeout */
+ return sal_False;
+ }
+
+ return ((fds.revents & nEvent) == nEvent);
+}
+
+#else /* select() */
+
+sal_Bool __osl_socket_poll (
+ oslSocket pSocket,
+ const TimeValue* pTimeout,
+ short nEvent)
+{
+ fd_set fds;
+ struct timeval tv;
+ int result;
+
+ OSL_ASSERT(pSocket);
+ pSocket->m_nLastError = 0;
+
+ FD_ZERO(&fds);
+ FD_SET(pSocket->m_Socket, &fds);
+
+ if (pTimeout)
+ {
+ /* Convert to 'timeval' */
+ tv.tv_sec = pTimeout->Seconds;
+ tv.tv_usec = pTimeout->Nanosec / 1000;
+ }
+
+ result = select (
+ pSocket->m_Socket + 1,
+ (nEvent == POLLIN ) ? PTR_FD_SET(fds) : NULL,
+ (nEvent == POLLOUT) ? PTR_FD_SET(fds) : NULL,
+ (nEvent == POLLPRI) ? PTR_FD_SET(fds) : NULL,
+ (pTimeout) ? &tv : NULL);
+
+ if (result < 0)
+ {
+ pSocket->m_nLastError = errno;
+ OSL_TRACE("__osl_socket_poll(): select error: %d (%s)",
+ errno, strerror(errno));
+ return sal_False;
+ }
+ if (result == 0)
+ {
+ /* Timeout */
+ return sal_False;
+ }
+
+ return (FD_ISSET(pSocket->m_Socket, &fds) ? sal_True : sal_False);
+}
+
+#endif /* HAVE_POLL_H */
+
+/*****************************************************************************/
+/* osl_isReceiveReady */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isReceiveReady (
+ oslSocket pSocket, const TimeValue* pTimeout)
+{
+ OSL_ASSERT(pSocket);
+ if (pSocket == NULL)
+ {
+ /* ENOTSOCK */
+ return sal_False;
+ }
+
+ return __osl_socket_poll (pSocket, pTimeout, POLLIN);
+}
+
+/*****************************************************************************/
+/* osl_isSendReady */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isSendReady (
+ oslSocket pSocket, const TimeValue* pTimeout)
+{
+ OSL_ASSERT(pSocket);
+ if (pSocket == NULL)
+ {
+ /* ENOTSOCK */
+ return sal_False;
+ }
+
+ return __osl_socket_poll (pSocket, pTimeout, POLLOUT);
+}
+
+/*****************************************************************************/
+/* osl_isExceptionPending */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isExceptionPending (
+ oslSocket pSocket, const TimeValue* pTimeout)
+{
+ OSL_ASSERT(pSocket);
+ if (pSocket == NULL)
+ {
+ /* ENOTSOCK */
+ return sal_False;
+ }
+
+ return __osl_socket_poll (pSocket, pTimeout, POLLPRI);
+}
+
+/*****************************************************************************/
+/* osl_shutdownSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_shutdownSocket(oslSocket pSocket,
+ oslSocketDirection Direction)
+{
+ int nRet;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRet=shutdown(pSocket->m_Socket, DIRECTION_TO_NATIVE(Direction));
+ if (nRet != 0 )
+ {
+ pSocket->m_nLastError=errno;
+ OSL_TRACE("shutdown error '%s'\n",strerror(errno));
+ }
+ return (nRet==0);
+}
+
+
+/*****************************************************************************/
+/* osl_getSocketOption */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getSocketOption(oslSocket pSocket,
+ oslSocketOptionLevel Level,
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen)
+{
+ socklen_t nOptLen = (socklen_t) BufferLen;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return -1;
+ }
+
+ pSocket->m_nLastError=0;
+
+ if(getsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(Level),
+ OPTION_TO_NATIVE(Option),
+ (sal_Char*)pBuffer,
+ &nOptLen) == -1)
+ {
+ pSocket->m_nLastError=errno;
+ return -1;
+ }
+
+ return BufferLen;
+}
+
+/*****************************************************************************/
+/* osl_setSocketOption */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setSocketOption(oslSocket pSocket,
+ oslSocketOptionLevel Level,
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen)
+{
+ int nRet;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ nRet = setsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(Level),
+ OPTION_TO_NATIVE(Option),
+ (sal_Char*)pBuffer,
+ BufferLen);
+
+ if ( nRet < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_enableNonBlockingMode */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_enableNonBlockingMode(oslSocket pSocket,
+ sal_Bool On)
+{
+ int flags;
+ int nRet;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ flags = fcntl(pSocket->m_Socket, F_GETFL, 0);
+
+ if (On)
+ flags |= O_NONBLOCK;
+ else
+ flags &= ~(O_NONBLOCK);
+
+ nRet = fcntl(pSocket->m_Socket, F_SETFL, flags);
+
+ if ( nRet < 0 )
+ {
+ pSocket->m_nLastError=errno;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_isNonBlockingMode */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isNonBlockingMode(oslSocket pSocket)
+{
+ int flags;
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSocket->m_nLastError=0;
+
+ flags = fcntl(pSocket->m_Socket, F_GETFL, 0);
+
+ if (flags == -1 || !(flags & O_NONBLOCK))
+ return sal_False;
+ else
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_getSocketType */
+/*****************************************************************************/
+oslSocketType SAL_CALL osl_getSocketType(oslSocket pSocket)
+{
+ int Type=0;
+ socklen_t TypeSize= sizeof(Type);
+
+ OSL_ASSERT(pSocket);
+ if ( pSocket == 0 )
+ {
+ return osl_Socket_TypeInvalid;
+ }
+
+ pSocket->m_nLastError=0;
+
+ if(getsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(osl_Socket_LevelSocket),
+ OPTION_TO_NATIVE(osl_Socket_OptionType),
+ (sal_Char*)&Type,
+ &TypeSize) == -1)
+ {
+ /* error */
+ pSocket->m_nLastError=errno;
+ return osl_Socket_TypeInvalid;
+ }
+
+ return TYPE_FROM_NATIVE(Type);
+
+}
+
+/*****************************************************************************/
+/* osl_getLastSocketErrorDescription */
+/*****************************************************************************/
+void SAL_CALL osl_getLastSocketErrorDescription(oslSocket Socket, rtl_uString **ustrError)
+{
+ sal_Char pszError[1024];
+
+ pszError[0] = '\0';
+
+ osl_psz_getLastSocketErrorDescription(Socket,pszError,sizeof(pszError));
+
+ rtl_uString_newFromAscii(ustrError,pszError);
+
+ return;
+}
+
+
+void SAL_CALL osl_psz_getLastSocketErrorDescription(oslSocket pSocket, sal_Char* pBuffer, sal_uInt32 BufferSize)
+{
+ /* make shure pBuffer will be a zero-terminated string even when strncpy has to cut */
+ pBuffer[BufferSize-1]= '\0';
+
+ if ( pSocket == 0 )
+ {
+ strncpy(pBuffer, strerror(EINVAL), BufferSize-1);
+ return;
+ }
+
+ strncpy(pBuffer, strerror(pSocket->m_nLastError), BufferSize-1);
+ return;
+}
+
+/*****************************************************************************/
+/* osl_getLastSocketError */
+/*****************************************************************************/
+oslSocketError SAL_CALL osl_getLastSocketError(oslSocket pSocket)
+{
+ if ( pSocket == 0 )
+ {
+ return ERROR_FROM_NATIVE(EINVAL);
+ }
+
+ return ERROR_FROM_NATIVE(pSocket->m_nLastError);
+}
+
+/*****************************************************************************/
+/* SocketSet */
+/*****************************************************************************/
+typedef struct _TSocketSetImpl
+{
+ int m_MaxHandle; /* for select(), the largest descriptor in the set */
+ fd_set m_Set; /* the set of descriptors */
+
+} TSocketSetImpl;
+
+/*****************************************************************************/
+/* osl_createSocketSet */
+/*****************************************************************************/
+oslSocketSet SAL_CALL osl_createSocketSet()
+{
+ TSocketSetImpl* pSet;
+
+ pSet= (TSocketSetImpl*)malloc(sizeof(TSocketSetImpl));
+
+ OSL_ASSERT(pSet);
+
+ if(pSet)
+ {
+ pSet->m_MaxHandle= 0;
+ FD_ZERO(&pSet->m_Set);
+ }
+
+ return (oslSocketSet)pSet;
+}
+
+/*****************************************************************************/
+/* osl_destroySocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_destroySocketSet(oslSocketSet Set)
+{
+ if(Set)
+ free(Set);
+}
+
+/*****************************************************************************/
+/* osl_clearSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_clearSocketSet(oslSocketSet Set)
+{
+ TSocketSetImpl* pSet;
+ OSL_ASSERT(Set);
+ if ( Set == 0 )
+ {
+ return;
+ }
+
+ pSet= (TSocketSetImpl*)Set;
+ pSet->m_MaxHandle= 0;
+
+ FD_ZERO(&pSet->m_Set);
+}
+
+/*****************************************************************************/
+/* osl_addToSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_addToSocketSet(oslSocketSet Set, oslSocket pSocket)
+{
+ TSocketSetImpl* pSet;
+
+ OSL_ASSERT(Set);
+ OSL_ASSERT(pSocket);
+
+ if ( Set == 0 || pSocket == 0)
+ {
+ return;
+ }
+
+ pSet= (TSocketSetImpl*)Set;
+
+ /* correct max handle */
+ if(pSocket->m_Socket > pSet->m_MaxHandle)
+ pSet->m_MaxHandle= pSocket->m_Socket;
+ FD_SET(pSocket->m_Socket, &pSet->m_Set);
+
+}
+
+/*****************************************************************************/
+/* osl_removeFromSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_removeFromSocketSet(oslSocketSet Set, oslSocket pSocket)
+{
+ TSocketSetImpl* pSet;
+
+ OSL_ASSERT(Set);
+ OSL_ASSERT(pSocket);
+
+ if ( Set == 0 || pSocket == 0)
+ {
+ return;
+ }
+
+ pSet= (TSocketSetImpl*)Set;
+
+ /* correct max handle */
+ if(pSocket->m_Socket == pSet->m_MaxHandle)
+ {
+ /* not optimal, since the next used descriptor might be */
+ /* much smaller than m_Socket-1, but it will do */
+ pSet->m_MaxHandle--;
+ if(pSet->m_MaxHandle < 0)
+ {
+ pSet->m_MaxHandle= 0; /* avoid underflow */
+ }
+ }
+
+ FD_CLR(pSocket->m_Socket, &pSet->m_Set);
+}
+
+/*****************************************************************************/
+/* osl_isInSocketSet */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isInSocketSet(oslSocketSet Set, oslSocket pSocket)
+{
+ TSocketSetImpl* pSet;
+
+ OSL_ASSERT(Set);
+ OSL_ASSERT(pSocket);
+ if ( Set == 0 || pSocket == 0 )
+ {
+ return sal_False;
+ }
+
+ pSet= (TSocketSetImpl*)Set;
+
+ return (FD_ISSET(pSocket->m_Socket, &pSet->m_Set) != 0);
+}
+
+/*****************************************************************************/
+/* osl_demultiplexSocketEvents */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_demultiplexSocketEvents(oslSocketSet IncomingSet,
+ oslSocketSet OutgoingSet,
+ oslSocketSet OutOfBandSet,
+ const TimeValue* pTimeout)
+{
+ int MaxHandle= 0;
+ struct timeval tv;
+ TSocketSetImpl* pInSet;
+ TSocketSetImpl* pOutSet;
+ TSocketSetImpl* pOOBSet;
+
+ if (pTimeout)
+ {
+ /* non-blocking call */
+ tv.tv_sec = pTimeout->Seconds;
+ tv.tv_usec = pTimeout->Nanosec / 1000L;
+ }
+
+ /* map opaque data to impl-types */
+ pInSet= (TSocketSetImpl*)IncomingSet;
+ pOutSet= (TSocketSetImpl*)OutgoingSet;
+ pOOBSet= (TSocketSetImpl*)OutOfBandSet;
+
+ /* get max handle from all sets */
+ if (pInSet)
+ MaxHandle= pInSet->m_MaxHandle;
+
+ if (pOutSet && (pOutSet->m_MaxHandle > MaxHandle))
+ MaxHandle= pOutSet->m_MaxHandle;
+
+ if (pOOBSet && (pOOBSet->m_MaxHandle > MaxHandle))
+ MaxHandle= pOOBSet->m_MaxHandle;
+
+ return select(MaxHandle+1,
+ pInSet ? PTR_FD_SET(pInSet->m_Set) : 0,
+ pOutSet ? PTR_FD_SET(pOutSet->m_Set) : 0,
+ pOOBSet ? PTR_FD_SET(pOOBSet->m_Set) : 0,
+ pTimeout ? &tv : 0);
+}
+
diff --git a/sal/osl/unx/sockimpl.h b/sal/osl/unx/sockimpl.h
new file mode 100644
index 000000000000..86122e850875
--- /dev/null
+++ b/sal/osl/unx/sockimpl.h
@@ -0,0 +1,78 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SOCKETIMPL_H_
+#define _OSL_SOCKETIMPL_H_
+
+#include <osl/pipe.h>
+#include <osl/socket.h>
+#include <osl/interlck.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* (*oslCloseCallback) (void*);
+
+struct oslSocketImpl {
+ int m_Socket;
+ int m_nLastError;
+ oslCloseCallback m_CloseCallback;
+ void* m_CallbackArg;
+ oslInterlockedCount m_nRefCount;
+#if defined(LINUX)
+ sal_Bool m_bIsAccepting;
+ sal_Bool m_bIsInShutdown;
+#endif
+};
+
+struct oslSocketAddrImpl
+{
+ sal_Int32 m_nRefCount;
+ struct sockaddr m_sockaddr;
+};
+
+struct oslPipeImpl {
+ int m_Socket;
+ sal_Char m_Name[PATH_MAX + 1];
+ oslInterlockedCount m_nRefCount;
+ sal_Bool m_bClosed;
+#if defined(LINUX)
+ sal_Bool m_bIsAccepting;
+ sal_Bool m_bIsInShutdown;
+#endif
+};
+
+oslSocket __osl_createSocketImpl(int Socket);
+void __osl_destroySocketImpl(oslSocket pImpl);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/sal/osl/unx/system.c b/sal/osl/unx/system.c
new file mode 100644
index 000000000000..0ea3b819438c
--- /dev/null
+++ b/sal/osl/unx/system.c
@@ -0,0 +1,599 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#ifdef NO_PTHREAD_RTL
+
+static pthread_mutex_t getrtl_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* struct passwd differs on some platforms */
+#if defined NETBSD
+struct passwd *getpwnam_r(const char* name, struct passwd* s, char* buffer, int size )
+{
+ struct passwd* res;
+
+ pthread_mutex_lock(&getrtl_mutex);
+
+ if ( (res = getpwnam(name)) )
+ {
+ int nname, npasswd, nclass, ngecos, ndir;
+
+ nname= strlen(res->pw_name)+1;
+ npasswd= strlen(res->pw_passwd)+1;
+ nclass= strlen(res->pw_class)+1;
+ ngecos= strlen(res->pw_gecos)+1;
+ ndir= strlen(res->pw_dir)+1;
+
+ if (nname+npasswd+nclass+ngecos
+ +ndir+strlen(res->pw_shell) < size)
+ {
+ memcpy(s, res, sizeof(struct passwd));
+
+ strcpy(buffer, res->pw_name);
+ s->pw_name = buffer;
+ buffer += nname;
+
+ strcpy(buffer, res->pw_passwd);
+ s->pw_passwd = buffer;
+ buffer += npasswd;
+
+ strcpy(buffer, res->pw_class);
+ s->pw_class = buffer;
+ buffer += nclass;
+
+ strcpy(buffer, res->pw_gecos);
+ s->pw_gecos = buffer;
+ buffer += ngecos;
+
+ strcpy(buffer, res->pw_dir);
+ s->pw_dir = buffer;
+ buffer += ndir;
+
+ strcpy(buffer, res->pw_shell);
+ s->pw_shell = buffer;
+
+ res = s;
+ }
+ else
+ res = 0;
+ }
+
+ pthread_mutex_unlock(&getrtl_mutex);
+
+ return(res);
+}
+
+int getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer,
+ size_t buflen, struct passwd **result)
+{
+ struct passwd* res;
+ int retval = 0;
+
+ pthread_mutex_lock(&getrtl_mutex);
+
+ if ( (res = getpwuid(uid)) )
+ {
+ size_t pw_name, pw_passwd, pw_class, pw_gecos, pw_dir, pw_shell;
+
+ pw_name = strlen(res->pw_name)+1;
+ pw_passwd = strlen(res->pw_passwd)+1;
+ pw_class = strlen(res->pw_class)+1;
+ pw_gecos = strlen(res->pw_gecos)+1;
+ pw_dir = strlen(res->pw_dir)+1;
+ pw_shell = strlen(res->pw_shell)+1;
+
+ if (pw_name+pw_passwd+pw_class+pw_gecos
+ +pw_dir+pw_shell < buflen)
+ {
+ memcpy(pwd, res, sizeof(struct passwd));
+
+ strncpy(buffer, res->pw_name, pw_name);
+ pwd->pw_name = buffer;
+ buffer += pw_name;
+
+ strncpy(buffer, res->pw_passwd, pw_passwd);
+ pwd->pw_passwd = buffer;
+ buffer += pw_passwd;
+
+ strncpy(buffer, res->pw_class, pw_class);
+ pwd->pw_class = buffer;
+ buffer += pw_class;
+
+ strncpy(buffer, res->pw_gecos, pw_gecos);
+ pwd->pw_gecos = buffer;
+ buffer += pw_gecos;
+
+ strncpy(buffer, res->pw_dir, pw_dir);
+ pwd->pw_dir = buffer;
+ buffer += pw_dir;
+
+ strncpy(buffer, res->pw_shell, pw_shell);
+ pwd->pw_shell = buffer;
+ buffer += pw_shell;
+
+ *result = pwd ;
+ retval = 0 ;
+
+ }
+ else
+ retval = ENOMEM;
+ }
+ else
+ retval = errno ;
+
+ pthread_mutex_unlock(&getrtl_mutex);
+
+ return retval;
+}
+
+struct tm *localtime_r(const time_t *timep, struct tm *buffer)
+{
+ struct tm* res;
+
+ pthread_mutex_lock(&getrtl_mutex);
+
+ if ( (res = localtime(timep)))
+ {
+ memcpy(buffer, res, sizeof(struct tm));
+ res = buffer;
+ }
+
+ pthread_mutex_unlock(&getrtl_mutex);
+
+ return res;
+}
+
+struct tm *gmtime_r(const time_t *timep, struct tm *buffer)
+{
+ struct tm* res;
+
+ pthread_mutex_lock(&getrtl_mutex);
+
+ if ( (res = gmtime(timep)) )
+ {
+ memcpy(buffer, res, sizeof(struct tm));
+ res = buffer;
+ }
+
+ pthread_mutex_unlock(&getrtl_mutex);
+
+ return res;
+}
+#endif /* defined NETBSD */
+
+#ifdef SCO
+#include <pwd.h>
+#include <shadow.h>
+#include <sys/types.h>
+
+struct spwd *getspnam_r(const char *name, struct spwd* s, char* buffer, int size )
+{
+ struct spwd* res;
+
+ pthread_mutex_lock(&getrtl_mutex);
+
+ if ( res = getspnam(name) )
+ {
+ int nnamp;
+
+ nnamp = strlen(res->sp_namp)+1;
+
+ if (nnamp+strlen(res->sp_pwdp) < size) {
+ memcpy(s, res, sizeof(struct spwd));
+
+ strcpy(buffer, res->sp_namp);
+ s->sp_namp = buffer;
+ buffer += nnamp;
+
+ strcpy(buffer, res->sp_pwdp);
+ s->sp_pwdp = buffer;
+
+ res = s;
+ }
+ else
+ res = 0;
+ }
+
+ pthread_mutex_unlock(&getrtl_mutex);
+
+ return res;
+}
+
+struct passwd *getpwnam_r(const char* name, struct passwd* s, char* buffer, int size )
+{
+ struct passwd* res;
+
+ pthread_mutex_lock(&getrtl_mutex);
+
+ if ( res = getpwnam(name) )
+ {
+ int nname, npasswd, nage;
+ int ncomment, ngecos, ndir;
+
+ nname= strlen(res->pw_name)+1;
+ npasswd= strlen(res->pw_passwd)+1;
+ nage= strlen(res->pw_age)+1;
+ ncomment= strlen(res->pw_comment)+1;
+ ngecos= strlen(res->pw_gecos)+1;
+ ndir= strlen(res->pw_dir)+1;
+
+ if (nname+npasswd+nage+ncomment+ngecos+ndir
+ +strlen(res->pw_shell) < size)
+ {
+ memcpy(s, res, sizeof(struct passwd));
+
+ strcpy(buffer, res->pw_name);
+ s->pw_name = buffer;
+ buffer += nname;
+
+ strcpy(buffer, res->pw_passwd);
+ s->pw_passwd = buffer;
+ buffer += npasswd;
+
+ strcpy(buffer, res->pw_age);
+ s->pw_age = buffer;
+ buffer += nage;
+
+ strcpy(buffer, res->pw_comment);
+ s->pw_comment = buffer;
+ buffer += ncomment;
+
+ strcpy(buffer, res->pw_gecos);
+ s->pw_gecos = buffer;
+ buffer += ngecos;
+
+ strcpy(buffer, res->pw_dir);
+ s->pw_dir = buffer;
+ buffer += ndir;
+
+ strcpy(buffer, res->pw_shell);
+ s->pw_shell = buffer;
+
+ res = s;
+ }
+ else
+ res = 0;
+ }
+
+ pthread_mutex_unlock(&getrtl_mutex);
+
+ return res;
+}
+#endif /* defined SCO */
+
+#if !defined(FREEBSD) || (__FreeBSD_version < 601103)
+
+extern int h_errno;
+
+struct hostent *gethostbyname_r(const char *name, struct hostent *result,
+ char *buffer, int buflen, int *h_errnop)
+{
+ /* buffer layout: name\0
+ * array_of_pointer_to_aliases
+ * NULL
+ * alias1\0...aliasn\0
+ * array_of_pointer_to_addresses
+ * NULL
+ * addr1addr2addr3...addrn
+ */
+ struct hostent* res;
+
+ pthread_mutex_lock(&getrtl_mutex);
+
+ if ( (res = gethostbyname(name)) )
+ {
+ int nname, naliases, naddr_list, naliasesdata, n;
+ char **p, **parray, *data;
+
+ /* Check buffer size before copying, we want to leave the
+ * buffers unmodified in case something goes wrong.
+ *
+ * Is this required?
+ */
+
+ nname= strlen(res->h_name)+1;
+
+ naliases = naddr_list = naliasesdata = 0;
+
+ for ( p = res->h_aliases; *p != NULL; p++) {
+ naliases++;
+ naliasesdata += strlen(*p)+1;
+ }
+
+ for ( p = res->h_addr_list; *p != NULL; p++)
+ naddr_list++;
+
+ if ( nname
+ + (naliases+1)*sizeof(char*) + naliasesdata
+ + (naddr_list+1)*sizeof(char*) + naddr_list*res->h_length
+ <= buflen )
+ {
+ memcpy(result, res, sizeof(struct hostent));
+
+ strcpy(buffer, res->h_name);
+ result->h_name = buffer;
+ buffer += nname;
+
+ parray = (char**)buffer;
+ result->h_aliases = parray;
+ data = buffer + (naliases+1)*sizeof(char*);
+ for ( p = res->h_aliases; *p != NULL; p++) {
+ n = strlen(*p)+1;
+ *parray++ = data;
+ memcpy(data, *p, n);
+ data += n;
+ }
+ *parray = NULL;
+ buffer = data;
+ parray = (char**)buffer;
+ result->h_addr_list = parray;
+ data = buffer + (naddr_list+1)*sizeof(char*);
+ for ( p = res->h_addr_list; *p != NULL; p++) {
+ *parray++ = data;
+ memcpy(data, *p, res->h_length);
+ data += res->h_length;
+ }
+ *parray = NULL;
+
+ res = result;
+ }
+ else
+ {
+ errno = ERANGE;
+ res = NULL;
+ }
+ }
+ else
+ {
+ *h_errnop = h_errno;
+ }
+
+ pthread_mutex_unlock(&getrtl_mutex);
+
+ return res;
+}
+#endif /* !defined(FREEBSD) || (__FreeBSD_version < 601103) */
+
+#if defined(MACOSX)
+/*
+ * Add support for resolving Mac native alias files (not the same as unix alias files)
+ * returns 0 on success.
+ */
+int macxp_resolveAlias(char *path, int buflen)
+{
+ FSRef aFSRef;
+ OSStatus nErr;
+ Boolean bFolder;
+ Boolean bAliased;
+ char *unprocessedPath = path;
+
+ if ( *unprocessedPath == '/' )
+ unprocessedPath++;
+
+ int nRet = 0;
+ while ( !nRet && unprocessedPath && *unprocessedPath )
+ {
+ unprocessedPath = strchr( unprocessedPath, '/' );
+ if ( unprocessedPath )
+ *unprocessedPath = '\0';
+
+ nErr = noErr;
+ bFolder = FALSE;
+ bAliased = FALSE;
+ if ( FSPathMakeRef( (const UInt8 *)path, &aFSRef, 0 ) == noErr )
+ {
+ nErr = FSResolveAliasFileWithMountFlags( &aFSRef, TRUE, &bFolder, &bAliased, kResolveAliasFileNoUI );
+ if ( nErr == nsvErr )
+ {
+ errno = ENOENT;
+ nRet = -1;
+ }
+ else if ( nErr == noErr && bAliased )
+ {
+ char tmpPath[ PATH_MAX ];
+ if ( FSRefMakePath( &aFSRef, (UInt8 *)tmpPath, PATH_MAX ) == noErr )
+ {
+ int nLen = strlen( tmpPath ) + ( unprocessedPath ? strlen( unprocessedPath + 1 ) + 1 : 0 );
+ if ( nLen < buflen && nLen < PATH_MAX )
+ {
+ if ( unprocessedPath )
+ {
+ int nTmpPathLen = strlen( tmpPath );
+ strcat( tmpPath, "/" );
+ strcat( tmpPath, unprocessedPath + 1 );
+ strcpy( path, tmpPath);
+ unprocessedPath = path + nTmpPathLen;
+ }
+ else if ( !unprocessedPath )
+ {
+ strcpy( path, tmpPath);
+ }
+ }
+ else
+ {
+ errno = ENAMETOOLONG;
+ nRet = -1;
+ }
+ }
+ }
+ }
+
+ if ( unprocessedPath )
+ *unprocessedPath++ = '/';
+ }
+
+ return nRet;
+}
+
+#endif /* defined MACOSX */
+
+#endif /* NO_PTHREAD_RTL */
+
+#if (defined (LINUX) && (GLIBC >= 2))
+/* The linux kernel thread implemention, always return the pid of the
+ thread subprocess and not of the main process. So we save the main
+ pid at startup
+*/
+
+// Directly from libc.so.6, obviously missing from some unistd.h:
+extern __pid_t __getpid(void);
+
+static pid_t pid = -1;
+
+static void savePid(void) __attribute__((constructor));
+
+static void savePid(void)
+{
+ if (pid == -1)
+ pid = __getpid();
+}
+
+pid_t getpid(void)
+{
+ if (pid == -1)
+ savePid();
+
+ return (pid);
+}
+#endif /* (defined (LINUX) && (GLIBC >= 2)) */
+
+#ifdef NO_PTHREAD_SEMAPHORES
+int sem_init(sem_t* sem, int pshared, unsigned int value)
+{
+ pthread_mutex_init(&sem->mutex, PTHREAD_MUTEXATTR_DEFAULT);
+ pthread_cond_init(&sem->increased, PTHREAD_CONDATTR_DEFAULT);
+
+ sem->value = (int)value;
+ return 0;
+}
+
+int sem_destroy(sem_t* sem)
+{
+ pthread_mutex_destroy(&sem->mutex);
+ pthread_cond_destroy(&sem->increased);
+ sem->value = 0;
+ return 0;
+}
+
+int sem_wait(sem_t* sem)
+{
+ pthread_mutex_lock(&sem->mutex);
+
+ while (sem->value <= 0)
+ {
+ pthread_cond_wait(&sem->increased, &sem->mutex);
+ }
+
+ sem->value--;
+ pthread_mutex_unlock(&sem->mutex);
+
+ return 0;
+}
+
+int sem_trywait(sem_t* sem)
+{
+ int result = 0;
+
+ pthread_mutex_lock(&sem->mutex);
+
+ if (sem->value > 0)
+ {
+ sem->value--;
+ }
+ else
+ {
+ errno = EAGAIN;
+ result = -1;
+ }
+
+ pthread_mutex_unlock(&sem->mutex);
+
+ return result;
+}
+
+int sem_post(sem_t* sem)
+{
+ pthread_mutex_lock(&sem->mutex);
+
+ sem->value++;
+
+ pthread_mutex_unlock(&sem->mutex);
+
+ pthread_cond_signal(&sem->increased);
+
+ return 0;
+}
+#endif
+
+#if defined(FREEBSD)
+char *fcvt(double value, int ndigit, int *decpt, int *sign)
+{
+ static char ret[256];
+ char buf[256],zahl[256],format[256]="%";
+ char *v1,*v2;
+
+ if (value==0.0) value=1e-30;
+
+ if (value<0.0) *sign=1; else *sign=0;
+
+ if (value<1.0)
+ {
+ *decpt=(int)log10(value);
+ value*=pow(10.0,1-*decpt);
+ ndigit+=*decpt-1;
+ if (ndigit<0) ndigit=0;
+ }
+ else
+ {
+ *decpt=(int)log10(value)+1;
+ }
+
+ sprintf(zahl,"%d",ndigit);
+ strcat(format,zahl);
+ strcat(format,".");
+ strcat(format,zahl);
+ strcat(format,"f");
+
+ sprintf(buf,format,value);
+
+ if (ndigit!=0)
+ {
+ v1=strtok(buf,".");
+ v2=strtok(NULL,".");
+ strcpy(ret,v1);
+ strcat(ret,v2);
+ }
+ else
+ {
+ strcpy(ret,buf);
+ }
+
+ return(ret);
+}
+
+#endif
diff --git a/sal/osl/unx/system.h b/sal/osl/unx/system.h
new file mode 100644
index 000000000000..1cb0979490c0
--- /dev/null
+++ b/sal/osl/unx/system.h
@@ -0,0 +1,495 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef __OSL_SYSTEM_H__
+#define __OSL_SYSTEM_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <signal.h>
+#include <utime.h>
+
+#include <pwd.h>
+
+#include <netdb.h>
+
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+#include <sys/types.h>
+
+/* Make sockets of type AF_UNIX use underlying FS rights */
+#ifdef SOLARIS
+# define _XOPEN_SOURCE 500
+# include <sys/socket.h>
+# undef _XOPEN_SOURCE
+#else
+# include <sys/socket.h>
+#endif
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#ifdef SYSV
+# include <sys/utsname.h>
+#endif
+
+#ifdef LINUX
+# ifndef __USE_GNU
+# define __USE_GNU
+# endif
+
+#if GLIBC >= 2
+# include <shadow.h>
+# include <pthread.h>
+# include <sys/file.h>
+# include <sys/ioctl.h>
+# include <sys/uio.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <dlfcn.h>
+# include <endian.h>
+# include <sys/time.h>
+# include <semaphore.h>
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif __BYTE_ORDER == __BIG_ENDIAN
+# ifndef _BIG_ENDIAN
+# define _BIG_ENDIAN
+# endif
+# elif __BYTE_ORDER == __PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define IORESOURCE_TRANSFER_BSD
+# define IOCHANNEL_TRANSFER_BSD_RENO
+# define pthread_testcancel()
+# define NO_PTHREAD_PRIORITY
+# define PTHREAD_SIGACTION pthread_sigaction
+#else
+# include <shadow.h>
+# include <asm/sigcontext.h>
+# include <pthread.h>
+# include <sys/file.h>
+# include <sys/ioctl.h>
+# include <linux/net.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <linux/elfcore.h>
+# include <dlfcn.h>
+# include <endian.h>
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif __BYTE_ORDER == __BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif __BYTE_ORDER == __PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define IORESOURCE_TRANSFER_BSD
+# define IOCHANNEL_TRANSFER_BSD_RENO
+# define pthread_testcancel()
+# define NO_PTHREAD_RTL
+# define NO_PTHREAD_PRIORITY
+# define PTHREAD_SIGACTION pthread_sigaction
+#endif
+
+# ifndef ETIME
+# define ETIME ETIMEDOUT
+# endif
+
+#endif
+
+#ifdef NETBSD
+# define ETIME ETIMEDOUT
+# define _POSIX_THREAD_SYSCALL_SOFT 1
+# include <pthread.h>
+# include <netdb.h>
+# include <sys/sem.h>
+# include <sys/exec.h>
+# include <sys/filio.h>
+# include <sys/ioctl.h>
+# include <sys/time.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <dlfcn.h>
+# include <machine/endian.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN_OO
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN_OO
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN_OO
+# endif
+# define IORESOURCE_TRANSFER_BSD
+# define IOCHANNEL_TRANSFER_BSD_RENO
+# define pthread_testcancel()
+# define NO_PTHREAD_PRIORITY
+# define NO_PTHREAD_SEMAPHORES
+# define NO_PTHREAD_RTL
+# define PTHREAD_SIGACTION pthread_sigaction
+#endif
+
+#ifdef FREEBSD
+# define ETIME ETIMEDOUT
+# include <pthread.h>
+# include <sys/sem.h>
+# include <semaphore.h>
+# include <dlfcn.h>
+# include <sys/filio.h>
+# include <sys/ioctl.h>
+# include <sys/param.h>
+# include <sys/time.h>
+# include <sys/uio.h>
+# include <sys/exec.h>
+# include <vm/vm.h>
+# include <vm/vm_param.h>
+# include <vm/pmap.h>
+# include <vm/swap_pager.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# define IORESOURCE_TRANSFER_BSD
+# include <machine/endian.h>
+#if __FreeBSD_version < 500000
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+#endif
+# define NO_PTHREAD_RTL
+#endif
+
+#ifdef SCO
+# define AF_IPX -1
+# include <strings.h>
+# include <pthread.h>
+# include <shadow.h>
+# include <netdb.h>
+# include <sys/un.h>
+# include <sys/netinet/tcp.h>
+# include <sys/types.h>
+# include <sys/byteorder.h>
+# include <dlfcn.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define sched_yield() pthread_yield()
+# define pthread_testcancel()
+# define NO_PTHREAD_RTL
+# define NO_PTHREAD_PRIORITY
+extern int pthread_cancel(pthread_t);
+extern unsigned int nanosleep(unsigned int);
+# define SLEEP_TIMESPEC(timespec) (timespec .tv_sec > 0) ? sleep(timespec .tv_sec), nanosleep(timespec .tv_nsec) : nanosleep(timespec .tv_nsec)
+# define PATH_MAX _POSIX_PATH_MAX
+# define S_ISSOCK S_ISFIFO
+# define PTHREAD_SIGACTION pthread_sigaction
+# define STAT_PARENT stat
+#endif
+
+#ifdef AIX
+# define AF_IPX -1
+# include <strings.h>
+# include <pthread.h>
+# include <sys/time.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <sys/machine.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# elif BYTE_ORDER == BIG_ENDIAN
+# define _BIG_ENDIAN
+# elif BYTE_ORDER == PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# define sched_yield() pthread_yield()
+# define SLEEP_TIMESPEC(timespec) nsleep(&timespec, 0)
+# define LIBPATH "LIBPATH"
+# define NO_PTHREAD_SEMAPHORES
+# define NO_DL_FUNCTIONS
+#endif
+
+#ifdef HPUX
+# define AF_IPX -1
+# undef howmany
+# undef MAXINT
+# include <pthread.h>
+# include <sys/un.h>
+# include <sys/sched.h>
+# include <sys/xti.h>
+# include <sys/pstat.h>
+# include <shadow.h>
+# include <crypt.h>
+# include <machine/param.h>
+# define LIBPATH "SHLIB_PATH"
+# define PTR_FD_SET(s) ((int *)&(s))
+# define PTHREAD_VALUE(t) ((t).field2)
+# define PTHREAD_NONE_INIT { 0, -1 }
+# define PTHREAD_ATTR_DEFAULT pthread_attr_default
+# define PTHREAD_MUTEXATTR_DEFAULT pthread_mutexattr_default
+# define PTHREAD_CONDATTR_DEFAULT pthread_condattr_default
+# define pthread_detach(t) pthread_detach(&(t))
+# define NO_PTHREAD_PRIORITY
+# define NO_PTHREAD_SEMAPHORES
+# define NO_DL_FUNCTIONS
+# undef sigaction
+# define PTHREAD_SIGACTION cma_sigaction
+#endif
+
+#ifdef SOLARIS
+# include <shadow.h>
+# include <sys/un.h>
+# include <stropts.h>
+# include <pthread.h>
+# include <semaphore.h>
+# include <netinet/tcp.h>
+# include <sys/filio.h>
+# include <dlfcn.h>
+# include <sys/isa_defs.h>
+# define IORESOURCE_TRANSFER_SYSV
+# define IOCHANNEL_TRANSFER_BSD
+# define LIBPATH "LD_LIBRARY_PATH"
+#endif
+
+#ifdef MACOSX
+#define __OPENTRANSPORTPROVIDERS__ // these are already defined
+#define TimeValue CFTimeValue // Do not conflict with TimeValue in sal/inc/osl/time.h
+#include <Carbon/Carbon.h>
+#undef TimeValue
+# ifndef ETIME
+# define ETIME ETIMEDOUT
+# endif
+# include <dlfcn.h>
+# include <pthread.h>
+# include <sys/file.h>
+# include <sys/ioctl.h>
+# include <sys/uio.h>
+# include <sys/un.h>
+# include <netinet/tcp.h>
+# include <machine/endian.h>
+# include <sys/time.h>
+# include <sys/semaphore.h>
+/* fixme are premac and postmac still needed here? */
+# include <premac.h>
+# include <mach-o/dyld.h>
+# include <postmac.h>
+# if BYTE_ORDER == LITTLE_ENDIAN
+# ifndef _LITTLE_ENDIAN
+# define _LITTLE_ENDIAN
+# endif
+# elif BYTE_ORDER == BIG_ENDIAN
+# ifndef _BIG_ENDIAN
+# define _BIG_ENDIAN
+# endif
+# elif BYTE_ORDER == PDP_ENDIAN
+# ifndef _PDP_ENDIAN
+# define _PDP_ENDIAN
+# endif
+# endif
+# define IOCHANNEL_TRANSFER_BSD_RENO
+# define NO_PTHREAD_RTL
+/* for NSGetArgc/Argv/Environ */
+# include <crt_externs.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+int macxp_resolveAlias(char *path, int buflen);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+#if !defined(_WIN32) && !defined(_WIN16) && !defined(OS2) && \
+ !defined(LINUX) && !defined(NETBSD) && !defined(FREEBSD) && !defined(SCO) && \
+ !defined(AIX) && !defined(HPUX) && \
+ !defined(SOLARIS) && !defined(MACOSX)
+# error "Target platform not specified!"
+#endif
+
+#if defined(NETBSD)
+#if defined _LITTLE_ENDIAN_OO
+# define _OSL_BIGENDIAN
+#elif defined _BIG_ENDIAN_OO
+# define _OSL_LITENDIAN
+#else
+# error undetermined endianess
+#endif
+#else
+#if defined _LITTLE_ENDIAN
+# define _OSL_BIGENDIAN
+#elif defined _BIG_ENDIAN
+# define _OSL_LITENDIAN
+#else
+# error undetermined endianess
+#endif
+#endif
+
+#ifndef PTR_FD_SET
+# define PTR_FD_SET(s) (&(s))
+#endif
+
+#ifndef NORMALIZE_TIMESPEC
+# define NORMALIZE_TIMESPEC(timespec) \
+ timespec . tv_sec += timespec . tv_nsec / 1000000000; \
+ timespec . tv_nsec %= 1000000000;
+#endif
+
+#ifndef SET_TIMESPEC
+# define SET_TIMESPEC(timespec, sec, nsec) \
+ timespec . tv_sec = (sec); \
+ timespec . tv_nsec = (nsec); \
+ NORMALIZE_TIMESPEC(timespec);
+#endif
+
+#ifndef SLEEP_TIMESPEC
+# define SLEEP_TIMESPEC(timespec) nanosleep(&timespec, 0)
+#endif
+
+#ifndef INIT_GROUPS
+# define INIT_GROUPS(name, gid) ((setgid((gid)) == 0) && (initgroups((name), (gid)) == 0))
+#endif
+
+#ifndef PTHREAD_VALUE
+# define PTHREAD_VALUE(t) (t)
+#endif
+#ifndef PTHREAD_NONE
+# if (__GNUC__ < 4) && !defined(MACOSX)
+extern pthread_t _pthread_none_;
+# endif
+# define PTHREAD_NONE _pthread_none_
+# ifndef PTHREAD_NONE_INIT
+# define PTHREAD_NONE_INIT ((pthread_t)-1)
+# endif
+#endif
+
+#ifndef PTHREAD_ATTR_DEFAULT
+# define PTHREAD_ATTR_DEFAULT NULL
+#endif
+#ifndef PTHREAD_MUTEXATTR_DEFAULT
+# define PTHREAD_MUTEXATTR_DEFAULT NULL
+#endif
+#ifndef PTHREAD_CONDATTR_DEFAULT
+# define PTHREAD_CONDATTR_DEFAULT NULL
+#endif
+
+#ifndef PTHREAD_SIGACTION
+# define PTHREAD_SIGACTION sigaction
+#endif
+
+#ifndef STAT_PARENT
+# define STAT_PARENT lstat
+#endif
+
+/* socket options which might not be defined on all unx flavors */
+#ifndef SO_ACCEPTCONN
+# define SO_ACCEPTCONN 0
+#endif
+#ifndef SO_SNDLOWAT
+# define SO_SNDLOWAT 0
+#endif
+#ifndef SO_RCVLOWAT
+# define SO_RCVLOWAT 0
+#endif
+#ifndef SO_SNDTIMEO
+# define SO_SNDTIMEO 0
+#endif
+#ifndef SO_RCVTIMEO
+# define SO_RCVTIMEO 0
+#endif
+#ifndef SO_USELOOPBACK
+# define SO_USELOOPBACK 0
+#endif
+#ifndef MSG_MAXIOVLEN
+# define MSG_MAXIOVLEN 0
+#endif
+
+/* BEGIN HACK */
+/* dummy define and declarations for IPX should be replaced by */
+/* original ipx headers when these are available for this platform */
+
+#ifndef SA_FAMILY_DECL
+# define SA_FAMILY_DECL short sa_family
+#endif
+
+typedef struct sockaddr_ipx {
+ SA_FAMILY_DECL;
+ char sa_netnum[4];
+ char sa_nodenum[6];
+ unsigned short sa_socket;
+} SOCKADDR_IPX;
+
+#define NSPROTO_IPX 1000
+#define NSPROTO_SPX 1256
+#define NSPROTO_SPXII 1257
+
+/* END HACK */
+
+#ifdef NO_PTHREAD_SEMAPHORES
+
+typedef struct
+{
+ pthread_mutex_t mutex;
+ pthread_cond_t increased;
+ int value;
+} sem_t;
+extern int sem_init(sem_t* sem, int pshared, unsigned int value);
+extern int sem_destroy(sem_t* sem);
+extern int sem_wait(sem_t* sem);
+extern int sem_trywait(sem_t* sem);
+extern int sem_post(sem_t* sem);
+
+#endif
+
+#ifdef NO_PTHREAD_RTL
+#if !defined FREEBSD || (__FreeBSD_version < 500112)
+struct passwd *getpwent_r(struct passwd *pwd, char *buffer, int buflen);
+extern struct spwd *getspnam_r(const char *name, struct spwd *result,
+ char *buffer, int buflen);
+
+struct tm *localtime_r(const time_t *timep, struct tm *buffer);
+struct tm *gmtime_r(const time_t *timep, struct tm *buffer);
+#endif /* !defined FREEBSD || (__FreeBSD_version < 500112) */
+#if !defined(FREEBSD) || (__FreeBSD_version < 601103)
+struct hostent *gethostbyname_r(const char *name, struct hostent *result,
+ char *buffer, int buflen, int *h_errnop);
+#endif /* !defined(FREEBSD) || (__FreeBSD_version < 601103) */
+#endif
+
+#endif /* __OSL_SYSTEM_H__ */
+
diff --git a/sal/osl/unx/tempfile.c b/sal/osl/unx/tempfile.c
new file mode 100644
index 000000000000..e10fffaa5ce2
--- /dev/null
+++ b/sal/osl/unx/tempfile.c
@@ -0,0 +1,370 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/*****************************************************************/
+/* Includes */
+/*****************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include "system.h"
+#include <osl/file.h>
+#include <osl/thread.h>
+#include <rtl/ustrbuf.h>
+#include <osl/diagnose.h>
+
+#ifndef _FILE_URL_H_
+#include "file_url.h"
+#endif
+
+/*****************************************************************/
+/* osl_getTempFirURL */
+/*****************************************************************/
+
+oslFileError SAL_CALL osl_getTempDirURL( rtl_uString** pustrTempDir )
+{
+#ifdef MACOSX
+ const char *pValue = getenv( "TMPDIR" );
+
+ /* If TMPDIR environment variable is not set, use "/tmp" instead
+ of P_tmpdir because its value is "/var/tmp" and it is not
+ deleted on system start up */
+ if ( !pValue )
+ pValue = "/tmp";
+#else
+
+ const char *pValue = getenv( "TEMP" );
+
+ if ( !pValue )
+ {
+ pValue = getenv( "TMP" );
+#if defined(SOLARIS) || defined (LINUX) || defined (FREEBSD)
+ if ( !pValue )
+ pValue = P_tmpdir;
+#endif
+ }
+#endif /* MACOSX */
+
+ if ( pValue )
+ {
+ oslFileError error;
+ rtl_uString *ustrTempPath = NULL;
+
+ rtl_string2UString( &ustrTempPath, pValue, strlen( pValue ), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(ustrTempPath != NULL);
+ error = osl_getFileURLFromSystemPath( ustrTempPath, pustrTempDir );
+ rtl_uString_release( ustrTempPath );
+
+ return error;
+ }
+ else
+ return osl_File_E_NOENT;
+}
+
+/******************************************************************
+ * Generates a random unique file name. We're using the scheme
+ * from the standard c-lib function mkstemp to generate a more
+ * or less random unique file name
+ *
+ * @param rand_name
+ * receives the random name
+ ******************************************************************/
+
+static const char LETTERS[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+static const int COUNT_OF_LETTERS = sizeof(LETTERS)/sizeof(LETTERS[0]) - 1;
+
+#define RAND_NAME_LENGTH 6
+
+static void osl_gen_random_name_impl_(rtl_uString** rand_name)
+{
+ static uint64_t value;
+
+ char buffer[RAND_NAME_LENGTH];
+ struct timeval tv;
+ uint64_t v;
+ int i;
+
+ gettimeofday(&tv, NULL);
+
+ value += ((uint64_t)tv.tv_usec << 16) ^ tv.tv_sec ^ getpid();
+
+ v = value;
+
+ for (i = 0; i < RAND_NAME_LENGTH; i++)
+ {
+ buffer[i] = LETTERS[v % COUNT_OF_LETTERS];
+ v /= COUNT_OF_LETTERS;
+ }
+
+ rtl_string2UString(
+ rand_name,
+ buffer,
+ RAND_NAME_LENGTH,
+ RTL_TEXTENCODING_ASCII_US,
+ OSTRING_TO_OUSTRING_CVTFLAGS);
+ OSL_ASSERT(*rand_name != NULL);
+}
+
+/*****************************************************************
+ * Helper function
+ * Either use the directory provided or the result of
+ * osl_getTempDirUrl and return it as system path and file url
+ ****************************************************************/
+
+static oslFileError osl_setup_base_directory_impl_(
+ rtl_uString* pustrDirectoryURL,
+ rtl_uString** ppustr_base_dir)
+{
+ rtl_uString* dir_url = 0;
+ rtl_uString* dir = 0;
+ oslFileError error = osl_File_E_None;
+
+ if (pustrDirectoryURL)
+ rtl_uString_assign(&dir_url, pustrDirectoryURL);
+ else
+ error = osl_getTempDirURL(&dir_url);
+
+ if (osl_File_E_None == error)
+ {
+ error = osl_getSystemPathFromFileURL_Ex(dir_url, &dir, FURL_DENY_RELATIVE);
+ rtl_uString_release(dir_url);
+ }
+
+ if (osl_File_E_None == error)
+ {
+ rtl_uString_assign(ppustr_base_dir, dir);
+ rtl_uString_release(dir);
+ }
+
+ return error;
+}
+
+/*****************************************************************
+ * osl_setup_createTempFile_impl
+ * validate input parameter, setup variables
+ ****************************************************************/
+
+ static oslFileError osl_setup_createTempFile_impl_(
+ rtl_uString* pustrDirectoryURL,
+ oslFileHandle* pHandle,
+ rtl_uString** ppustrTempFileURL,
+ rtl_uString** ppustr_base_dir,
+ sal_Bool* b_delete_on_close)
+ {
+ oslFileError osl_error;
+
+ OSL_PRECOND(((0 != pHandle) || (0 != ppustrTempFileURL)), "Invalid parameter!");
+
+ if ((0 == pHandle) && (0 == ppustrTempFileURL))
+ {
+ osl_error = osl_File_E_INVAL;
+ }
+ else
+ {
+ osl_error = osl_setup_base_directory_impl_(
+ pustrDirectoryURL, ppustr_base_dir);
+
+ *b_delete_on_close = (0 == ppustrTempFileURL);
+ }
+
+ return osl_error;
+ }
+
+/*****************************************************************
+ * Create a unique file in the specified directory and return
+ * it's name
+ ****************************************************************/
+
+static oslFileError osl_create_temp_file_impl_(
+ const rtl_uString* pustr_base_directory,
+ oslFileHandle* file_handle,
+ rtl_uString** ppustr_temp_file_name)
+{
+ rtl_uString* rand_name = 0;
+ sal_uInt32 len_base_dir = 0;
+ rtl_uString* tmp_file_path = 0;
+ rtl_uString* tmp_file_url = 0;
+ sal_Int32 capacity = 0;
+ oslFileError osl_error = osl_File_E_None;
+ sal_Int32 offset_file_name;
+ const sal_Unicode* puchr;
+
+ OSL_PRECOND(pustr_base_directory, "Invalid Parameter");
+ OSL_PRECOND(file_handle, "Invalid Parameter");
+ OSL_PRECOND(ppustr_temp_file_name, "Invalid Parameter");
+
+ len_base_dir = rtl_uString_getLength(pustr_base_directory);
+
+ rtl_uStringbuffer_newFromStr_WithLength(
+ &tmp_file_path,
+ rtl_uString_getStr((rtl_uString*)pustr_base_directory),
+ len_base_dir);
+
+ rtl_uStringbuffer_ensureCapacity(
+ &tmp_file_path,
+ &capacity,
+ (len_base_dir + 1 + RAND_NAME_LENGTH));
+
+ offset_file_name = len_base_dir;
+
+ puchr = rtl_uString_getStr(tmp_file_path);
+
+ /* ensure that the last character is a '/' */
+
+ if ((sal_Unicode)'/' != puchr[len_base_dir - 1])
+ {
+ rtl_uStringbuffer_insert_ascii(
+ &tmp_file_path,
+ &capacity,
+ len_base_dir,
+ "/",
+ 1);
+
+ offset_file_name++;
+ }
+
+ while(1) /* try until success */
+ {
+ osl_gen_random_name_impl_(&rand_name);
+
+ rtl_uStringbuffer_insert(
+ &tmp_file_path,
+ &capacity,
+ offset_file_name,
+ rtl_uString_getStr(rand_name),
+ rtl_uString_getLength(rand_name));
+
+ osl_error = osl_getFileURLFromSystemPath(
+ tmp_file_path, &tmp_file_url);
+
+ if (osl_File_E_None == osl_error)
+ {
+ /* RW permission for the user only! */
+ mode_t old_mode = umask(077);
+
+ osl_error = osl_openFile(
+ tmp_file_url,
+ file_handle,
+ osl_File_OpenFlag_Read |
+ osl_File_OpenFlag_Write |
+ osl_File_OpenFlag_Create);
+
+ umask(old_mode);
+ }
+
+ /* in case of error osl_File_E_EXIST we simply try again else we give up */
+
+ if ((osl_File_E_None == osl_error) || (osl_error != osl_File_E_EXIST))
+ {
+ if (rand_name)
+ rtl_uString_release(rand_name);
+
+ if (tmp_file_url)
+ rtl_uString_release(tmp_file_url);
+
+ break;
+ }
+ } /* while(1) */
+
+ if (osl_File_E_None == osl_error)
+ rtl_uString_assign(ppustr_temp_file_name, tmp_file_path);
+
+ if (tmp_file_path)
+ rtl_uString_release(tmp_file_path);
+
+ return osl_error;
+}
+
+/*****************************************************************
+ * osl_createTempFile
+ *****************************************************************/
+
+oslFileError SAL_CALL osl_createTempFile(
+ rtl_uString* pustrDirectoryURL,
+ oslFileHandle* pHandle,
+ rtl_uString** ppustrTempFileURL)
+{
+ rtl_uString* base_directory = 0;
+ rtl_uString* temp_file_name = 0;
+ oslFileHandle temp_file_handle;
+ sal_Bool b_delete_on_close;
+ oslFileError osl_error;
+
+ osl_error = osl_setup_createTempFile_impl_(
+ pustrDirectoryURL,
+ pHandle,
+ ppustrTempFileURL,
+ &base_directory,
+ &b_delete_on_close);
+
+ if (osl_File_E_None != osl_error)
+ return osl_error;
+
+ osl_error = osl_create_temp_file_impl_(
+ base_directory, &temp_file_handle, &temp_file_name);
+
+ if (osl_File_E_None == osl_error)
+ {
+ rtl_uString* temp_file_url = 0;
+
+ /* assuming this works */
+ osl_getFileURLFromSystemPath(temp_file_name, &temp_file_url);
+
+ if (b_delete_on_close)
+ {
+ osl_error = osl_removeFile(temp_file_url);
+
+ if (osl_File_E_None == osl_error)
+ *pHandle = temp_file_handle;
+ else
+ osl_closeFile(temp_file_handle);
+ }
+ else
+ {
+ if (pHandle)
+ *pHandle = temp_file_handle;
+ else
+ osl_closeFile(temp_file_handle);
+
+ rtl_uString_assign(ppustrTempFileURL, temp_file_url);
+ }
+
+ if (temp_file_url)
+ rtl_uString_release(temp_file_url);
+
+ if (temp_file_name)
+ rtl_uString_release(temp_file_name);
+ }
+
+ if (base_directory)
+ rtl_uString_release(base_directory);
+
+ return osl_error;
+}
diff --git a/sal/osl/unx/thread.c b/sal/osl/unx/thread.c
new file mode 100644
index 000000000000..fe53915b792f
--- /dev/null
+++ b/sal/osl/unx/thread.c
@@ -0,0 +1,1035 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+#include <string.h>
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <osl/nlsupport.h>
+#ifndef _RTL_TEXTENC_H_
+#include <rtl/textenc.h>
+#endif
+
+/****************************************************************************
+ * @@@ TODO @@@
+ *
+ * (1) 'osl_thread_priority_init_Impl()'
+ * - insane assumption that initializing caller is main thread
+ * - use _POSIX_THREAD_PRIORITY_SCHEDULING, not NO_PTHREAD_PRIORITY (?)
+ * - POSIX doesn't require defined prio's for SCHED_OTHER (!)
+ * - use SCHED_RR instead of SCHED_OTHER for defined behaviour (?)
+ * (2) 'oslThreadIdentifier' and '{insert|remove|lookup}ThreadId()'
+ * - cannot reliably be applied to 'alien' threads;
+ * - memory leak for 'alien' thread 'HashEntry's;
+ * - use 'PTHREAD_VALUE(pthread_t)' as identifier instead (?)
+ * - if yes, change 'oslThreadIdentifier' to 'intptr_t' or similar
+ * (3) 'oslSigAlarmHandler()' (#71232#)
+ * - [Under Solaris we get SIGALRM in e.g. pthread_join which terminates
+ * the process. So we initialize our signal handling module and do
+ * register a SIGALRM Handler which catches and ignores it]
+ * - should this still happen, 'signal.c' needs to be fixed instead.
+ *
+ ****************************************************************************/
+
+/*****************************************************************************/
+/* Internal data structures and functions */
+/*****************************************************************************/
+
+#define THREADIMPL_FLAGS_TERMINATE 0x00001
+#define THREADIMPL_FLAGS_STARTUP 0x00002
+#define THREADIMPL_FLAGS_SUSPENDED 0x00004
+#define THREADIMPL_FLAGS_ACTIVE 0x00008
+#define THREADIMPL_FLAGS_ATTACHED 0x00010
+#define THREADIMPL_FLAGS_DESTROYED 0x00020
+
+typedef struct osl_thread_impl_st
+{
+ pthread_t m_hThread;
+ sal_uInt16 m_Ident; /* @@@ see TODO @@@ */
+ short m_Flags;
+ oslWorkerFunction m_WorkerFunction;
+ void* m_pData;
+ pthread_mutex_t m_Lock;
+ pthread_cond_t m_Cond;
+} Thread_Impl;
+
+struct osl_thread_priority_st
+{
+ int m_Highest;
+ int m_Above_Normal;
+ int m_Normal;
+ int m_Below_Normal;
+ int m_Lowest;
+};
+
+#define OSL_THREAD_PRIORITY_INITIALIZER { 127, 96, 64, 32, 0 }
+static void osl_thread_priority_init_Impl (void);
+
+struct osl_thread_textencoding_st
+{
+ pthread_key_t m_key; /* key to store thread local text encoding */
+ rtl_TextEncoding m_default; /* the default text encoding */
+};
+
+#define OSL_THREAD_TEXTENCODING_INITIALIZER { 0, RTL_TEXTENCODING_DONTKNOW }
+static void osl_thread_textencoding_init_Impl (void);
+
+struct osl_thread_global_st
+{
+ pthread_once_t m_once;
+ struct osl_thread_priority_st m_priority;
+ struct osl_thread_textencoding_st m_textencoding;
+};
+
+static struct osl_thread_global_st g_thread =
+{
+ PTHREAD_ONCE_INIT,
+ OSL_THREAD_PRIORITY_INITIALIZER,
+ OSL_THREAD_TEXTENCODING_INITIALIZER
+};
+
+static void osl_thread_init_Impl (void);
+
+static Thread_Impl* osl_thread_construct_Impl (void);
+static void osl_thread_destruct_Impl (Thread_Impl ** ppImpl);
+
+static void* osl_thread_start_Impl (void * pData);
+static void osl_thread_cleanup_Impl (void * pData);
+
+static oslThread osl_thread_create_Impl (
+ oslWorkerFunction pWorker, void * pThreadData, short nFlags);
+
+static void osl_thread_join_cleanup_Impl (void * opaque);
+static void osl_thread_wait_cleanup_Impl (void * opaque);
+
+/* @@@ see TODO @@@ */
+static sal_uInt16 insertThreadId (pthread_t hThread);
+static sal_uInt16 lookupThreadId (pthread_t hThread);
+static void removeThreadId (pthread_t hThread);
+
+/*****************************************************************************/
+/* osl_thread_init_Impl */
+/*****************************************************************************/
+static void osl_thread_init_Impl (void)
+{
+ osl_thread_priority_init_Impl();
+ osl_thread_textencoding_init_Impl();
+}
+
+/*****************************************************************************/
+/* osl_thread_join_cleanup_Impl */
+/*****************************************************************************/
+static void osl_thread_join_cleanup_Impl (void * opaque)
+{
+ pthread_t hThread = (pthread_t)(opaque);
+ pthread_detach (hThread);
+}
+
+/*****************************************************************************/
+/* osl_thread_wait_cleanup_Impl */
+/*****************************************************************************/
+static void osl_thread_wait_cleanup_Impl (void * opaque)
+{
+ pthread_mutex_t * pMutex = (pthread_mutex_t*)(opaque);
+ pthread_mutex_unlock (pMutex);
+}
+
+/*****************************************************************************/
+/* osl_thread_construct_Impl */
+/*****************************************************************************/
+Thread_Impl* osl_thread_construct_Impl (void)
+{
+ Thread_Impl* pImpl = malloc (sizeof(Thread_Impl));
+ if (pImpl)
+ {
+ memset (pImpl, 0, sizeof(Thread_Impl));
+
+ pthread_mutex_init (&(pImpl->m_Lock), PTHREAD_MUTEXATTR_DEFAULT);
+ pthread_cond_init (&(pImpl->m_Cond), PTHREAD_CONDATTR_DEFAULT);
+ }
+ return (pImpl);
+}
+
+/*****************************************************************************/
+/* osl_thread_destruct_Impl */
+/*****************************************************************************/
+static void osl_thread_destruct_Impl (Thread_Impl ** ppImpl)
+{
+ OSL_ASSERT(ppImpl);
+ if (*ppImpl)
+ {
+ pthread_cond_destroy (&((*ppImpl)->m_Cond));
+ pthread_mutex_destroy (&((*ppImpl)->m_Lock));
+
+ free (*ppImpl);
+ (*ppImpl) = 0;
+ }
+}
+
+/*****************************************************************************/
+/* osl_thread_cleanup_Impl */
+/*****************************************************************************/
+static void osl_thread_cleanup_Impl (void* pData)
+{
+ pthread_t thread;
+ int attached;
+ int destroyed;
+ Thread_Impl* pImpl= (Thread_Impl*)pData;
+
+ pthread_mutex_lock (&(pImpl->m_Lock));
+
+ thread = pImpl->m_hThread;
+ attached = (pImpl->m_Flags & THREADIMPL_FLAGS_ATTACHED) != 0;
+ destroyed = (pImpl->m_Flags & THREADIMPL_FLAGS_DESTROYED) != 0;
+ pImpl->m_Flags &= ~(THREADIMPL_FLAGS_ACTIVE | THREADIMPL_FLAGS_ATTACHED);
+
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+
+ /* release oslThreadIdentifier @@@ see TODO @@@ */
+ removeThreadId (thread);
+
+ if (attached)
+ {
+ pthread_detach (thread);
+ }
+
+ if (destroyed)
+ {
+ osl_thread_destruct_Impl (&pImpl);
+ }
+}
+
+/*****************************************************************************/
+/* osl_thread_start_Impl */
+/*****************************************************************************/
+static void* osl_thread_start_Impl (void* pData)
+{
+ int terminate;
+ Thread_Impl* pImpl= (Thread_Impl*)pData;
+
+ OSL_ASSERT(pImpl);
+
+ pthread_mutex_lock (&(pImpl->m_Lock));
+
+ /* install cleanup handler */
+ pthread_cleanup_push (osl_thread_cleanup_Impl, pData);
+
+ /* request oslThreadIdentifier @@@ see TODO @@@ */
+ pImpl->m_Ident = insertThreadId (pImpl->m_hThread);
+
+ /* signal change from STARTUP to ACTIVE state */
+ pImpl->m_Flags &= ~THREADIMPL_FLAGS_STARTUP;
+ pImpl->m_Flags |= THREADIMPL_FLAGS_ACTIVE;
+ pthread_cond_signal (&(pImpl->m_Cond));
+
+ /* Check if thread is started in SUSPENDED state */
+ while (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED)
+ {
+ /* wait until SUSPENDED flag is cleared */
+ pthread_cleanup_push (osl_thread_wait_cleanup_Impl, &(pImpl->m_Lock));
+ pthread_cond_wait (&(pImpl->m_Cond), &(pImpl->m_Lock));
+ pthread_cleanup_pop (0);
+ }
+
+ /* check for SUSPENDED to TERMINATE state change */
+ terminate = ((pImpl->m_Flags & THREADIMPL_FLAGS_TERMINATE) > 0);
+
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+
+ if (!terminate)
+ {
+ /* call worker function */
+ pImpl->m_WorkerFunction(pImpl->m_pData);
+ }
+
+ /* call cleanup handler and leave */
+ pthread_cleanup_pop (1);
+ return (0);
+}
+
+/*****************************************************************************/
+/* osl_thread_create_Impl */
+/*****************************************************************************/
+static oslThread osl_thread_create_Impl (
+ oslWorkerFunction pWorker,
+ void* pThreadData,
+ short nFlags)
+{
+ Thread_Impl* pImpl;
+ int nRet=0;
+
+ pImpl = osl_thread_construct_Impl();
+ if (!pImpl)
+ return (0); /* ENOMEM */
+
+ pImpl->m_WorkerFunction = pWorker;
+ pImpl->m_pData = pThreadData;
+ pImpl->m_Flags = nFlags | THREADIMPL_FLAGS_STARTUP;
+
+ pthread_mutex_lock (&(pImpl->m_Lock));
+
+ if ((nRet = pthread_create (
+ &(pImpl->m_hThread),
+ PTHREAD_ATTR_DEFAULT,
+ osl_thread_start_Impl,
+ (void*)(pImpl))) != 0)
+ {
+ OSL_TRACE("osl_thread_create_Impl(): errno: %d, %s\n",
+ nRet, strerror(nRet));
+
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+ osl_thread_destruct_Impl (&pImpl);
+
+ return (0);
+ }
+
+ /* wait for change from STARTUP to ACTIVE state */
+ while (pImpl->m_Flags & THREADIMPL_FLAGS_STARTUP)
+ {
+ /* wait until STARTUP flag is cleared */
+ pthread_cleanup_push (osl_thread_wait_cleanup_Impl, &(pImpl->m_Lock));
+ pthread_cond_wait (&(pImpl->m_Cond), &(pImpl->m_Lock));
+ pthread_cleanup_pop (0);
+ }
+
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+
+ return ((oslThread)(pImpl));
+}
+
+/*****************************************************************************/
+/* osl_createThread */
+/*****************************************************************************/
+oslThread osl_createThread (
+ oslWorkerFunction pWorker,
+ void * pThreadData)
+{
+ return osl_thread_create_Impl (
+ pWorker,
+ pThreadData,
+ THREADIMPL_FLAGS_ATTACHED);
+}
+
+/*****************************************************************************/
+/* osl_createSuspendedThread */
+/*****************************************************************************/
+oslThread osl_createSuspendedThread (
+ oslWorkerFunction pWorker,
+ void * pThreadData)
+{
+ return osl_thread_create_Impl (
+ pWorker,
+ pThreadData,
+ THREADIMPL_FLAGS_ATTACHED |
+ THREADIMPL_FLAGS_SUSPENDED );
+}
+
+/*****************************************************************************/
+/* osl_destroyThread */
+/*****************************************************************************/
+void SAL_CALL osl_destroyThread(oslThread Thread)
+{
+ if (Thread != NULL) {
+ Thread_Impl * impl = (Thread_Impl *) Thread;
+ int active;
+ pthread_mutex_lock(&impl->m_Lock);
+ active = (impl->m_Flags & THREADIMPL_FLAGS_ACTIVE) != 0;
+ impl->m_Flags |= THREADIMPL_FLAGS_DESTROYED;
+ pthread_mutex_unlock(&impl->m_Lock);
+ if (!active) {
+ osl_thread_destruct_Impl(&impl);
+ }
+ }
+}
+
+/*****************************************************************************/
+/* osl_resumeThread */
+/*****************************************************************************/
+void SAL_CALL osl_resumeThread(oslThread Thread)
+{
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+
+ OSL_ASSERT(pImpl);
+ if (!pImpl)
+ return; /* EINVAL */
+
+ pthread_mutex_lock (&(pImpl->m_Lock));
+
+ if (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED)
+ {
+ /* clear SUSPENDED flag */
+ pImpl->m_Flags &= ~THREADIMPL_FLAGS_SUSPENDED;
+ pthread_cond_signal (&(pImpl->m_Cond));
+ }
+
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+}
+
+/*****************************************************************************/
+/* osl_suspendThread */
+/*****************************************************************************/
+void SAL_CALL osl_suspendThread(oslThread Thread)
+{
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+
+ OSL_ASSERT(pImpl);
+ if (!pImpl)
+ return; /* EINVAL */
+
+ pthread_mutex_lock (&(pImpl->m_Lock));
+
+ pImpl->m_Flags |= THREADIMPL_FLAGS_SUSPENDED;
+
+ if (pthread_equal (pthread_self(), pImpl->m_hThread))
+ {
+ /* self suspend */
+ while (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED)
+ {
+ /* wait until SUSPENDED flag is cleared */
+ pthread_cleanup_push (osl_thread_wait_cleanup_Impl, &(pImpl->m_Lock));
+ pthread_cond_wait (&(pImpl->m_Cond), &(pImpl->m_Lock));
+ pthread_cleanup_pop (0);
+ }
+ }
+
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+}
+
+/*****************************************************************************/
+/* osl_isThreadRunning */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isThreadRunning(const oslThread Thread)
+{
+ sal_Bool active;
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+
+ if (!pImpl)
+ return sal_False;
+
+ pthread_mutex_lock (&(pImpl->m_Lock));
+ active = ((pImpl->m_Flags & THREADIMPL_FLAGS_ACTIVE) > 0);
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+
+ return (active);
+}
+
+/*****************************************************************************/
+/* osl_joinWithThread */
+/*****************************************************************************/
+void SAL_CALL osl_joinWithThread(oslThread Thread)
+{
+ pthread_t thread;
+ int attached;
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+
+ if (!pImpl)
+ return;
+
+ pthread_mutex_lock (&(pImpl->m_Lock));
+
+ if (pthread_equal (pthread_self(), pImpl->m_hThread))
+ {
+ /* self join */
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+ return; /* EDEADLK */
+ }
+
+ thread = pImpl->m_hThread;
+ attached = ((pImpl->m_Flags & THREADIMPL_FLAGS_ATTACHED) > 0);
+ pImpl->m_Flags &= ~THREADIMPL_FLAGS_ATTACHED;
+
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+
+ if (attached)
+ {
+ /* install cleanup handler to ensure consistent flags and state */
+ pthread_cleanup_push (
+ osl_thread_join_cleanup_Impl, (void*)thread);
+
+ /* join */
+ pthread_join (thread, NULL);
+
+ /* remove cleanup handler */
+ pthread_cleanup_pop (0);
+ }
+}
+
+/*****************************************************************************/
+/* osl_terminateThread */
+/*****************************************************************************/
+void SAL_CALL osl_terminateThread(oslThread Thread)
+{
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+
+ OSL_ASSERT(pImpl);
+ if (!pImpl)
+ return; /* EINVAL */
+
+ pthread_mutex_lock (&(pImpl->m_Lock));
+
+ if (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED)
+ {
+ /* clear SUSPENDED flag */
+ pImpl->m_Flags &= ~THREADIMPL_FLAGS_SUSPENDED;
+ pthread_cond_signal (&(pImpl->m_Cond));
+ }
+
+ pImpl->m_Flags |= THREADIMPL_FLAGS_TERMINATE;
+
+ pthread_mutex_unlock (&(pImpl->m_Lock));
+}
+
+/*****************************************************************************/
+/* osl_scheduleThread */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_scheduleThread(oslThread Thread)
+{
+ int terminate;
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+
+ OSL_ASSERT(pImpl);
+ if (!pImpl)
+ return sal_False; /* EINVAL */
+
+ OSL_ASSERT(pthread_equal (pthread_self(), pImpl->m_hThread));
+ if (!(pthread_equal (pthread_self(), pImpl->m_hThread)))
+ return sal_False; /* EINVAL */
+
+ pthread_testcancel();
+ pthread_mutex_lock (&(pImpl->m_Lock));
+
+ while (pImpl->m_Flags & THREADIMPL_FLAGS_SUSPENDED)
+ {
+ /* wait until SUSPENDED flag is cleared */
+ pthread_cleanup_push (osl_thread_wait_cleanup_Impl, &(pImpl->m_Lock));
+ pthread_cond_wait (&(pImpl->m_Cond), &(pImpl->m_Lock));
+ pthread_cleanup_pop (0);
+ }
+
+ terminate = ((pImpl->m_Flags & THREADIMPL_FLAGS_TERMINATE) > 0);
+
+ pthread_mutex_unlock(&(pImpl->m_Lock));
+ pthread_testcancel();
+
+ return (terminate == 0);
+}
+
+/*****************************************************************************/
+/* osl_waitThread */
+/*****************************************************************************/
+void SAL_CALL osl_waitThread(const TimeValue* pDelay)
+{
+ if (pDelay)
+ {
+ struct timespec delay;
+
+ SET_TIMESPEC(delay, pDelay->Seconds, pDelay->Nanosec);
+
+ SLEEP_TIMESPEC(delay);
+ }
+}
+
+/*****************************************************************************/
+/* osl_yieldThread */
+/*
+ Note that POSIX scheduling _really_ requires threads to call this
+ functions, since a thread only reschedules to other thread, when
+ it blocks (sleep, blocking I/O) OR calls sched_yield().
+*/
+/*****************************************************************************/
+void SAL_CALL osl_yieldThread()
+{
+ sched_yield();
+}
+
+/*****************************************************************************/
+/* osl_getThreadIdentifier @@@ see TODO @@@ */
+/*****************************************************************************/
+
+#define HASHID(x) ((unsigned int)PTHREAD_VALUE(x) % HashSize)
+
+typedef struct _HashEntry
+{
+ pthread_t Handle;
+ sal_uInt16 Ident;
+ struct _HashEntry *Next;
+} HashEntry;
+
+static HashEntry* HashTable[31];
+static int HashSize = sizeof(HashTable) / sizeof(HashTable[0]);
+
+static pthread_mutex_t HashLock = PTHREAD_MUTEX_INITIALIZER;
+
+static sal_uInt16 LastIdent = 0;
+
+static sal_uInt16 lookupThreadId (pthread_t hThread)
+{
+ HashEntry *pEntry;
+
+ pthread_mutex_lock(&HashLock);
+
+ pEntry = HashTable[HASHID(hThread)];
+ while (pEntry != NULL)
+ {
+ if (pthread_equal(pEntry->Handle, hThread))
+ {
+ pthread_mutex_unlock(&HashLock);
+ return (pEntry->Ident);
+ }
+ pEntry = pEntry->Next;
+ }
+
+ pthread_mutex_unlock(&HashLock);
+
+ return (0);
+}
+
+static sal_uInt16 insertThreadId (pthread_t hThread)
+{
+ HashEntry *pEntry, *pInsert = NULL;
+
+ pthread_mutex_lock(&HashLock);
+
+ pEntry = HashTable[HASHID(hThread)];
+
+ while (pEntry != NULL)
+ {
+ if (pthread_equal(pEntry->Handle, hThread))
+ break;
+
+ pInsert = pEntry;
+ pEntry = pEntry->Next;
+ }
+
+ if (pEntry == NULL)
+ {
+ pEntry = (HashEntry*) calloc(sizeof(HashEntry), 1);
+
+ pEntry->Handle = hThread;
+
+ ++ LastIdent;
+
+ if ( LastIdent == 0 )
+ LastIdent = 1;
+
+ pEntry->Ident = LastIdent;
+
+ if (pInsert)
+ pInsert->Next = pEntry;
+ else
+ HashTable[HASHID(hThread)] = pEntry;
+ }
+
+ pthread_mutex_unlock(&HashLock);
+
+ return (pEntry->Ident);
+}
+
+static void removeThreadId (pthread_t hThread)
+{
+ HashEntry *pEntry, *pRemove = NULL;
+
+ pthread_mutex_lock(&HashLock);
+
+ pEntry = HashTable[HASHID(hThread)];
+ while (pEntry != NULL)
+ {
+ if (pthread_equal(pEntry->Handle, hThread))
+ break;
+
+ pRemove = pEntry;
+ pEntry = pEntry->Next;
+ }
+
+ if (pEntry != NULL)
+ {
+ if (pRemove)
+ pRemove->Next = pEntry->Next;
+ else
+ HashTable[HASHID(hThread)] = pEntry->Next;
+
+ free(pEntry);
+ }
+
+ pthread_mutex_unlock(&HashLock);
+}
+
+oslThreadIdentifier SAL_CALL osl_getThreadIdentifier(oslThread Thread)
+{
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+ sal_uInt16 Ident;
+
+ if (pImpl)
+ Ident = pImpl->m_Ident;
+ else
+ {
+ /* current thread */
+ pthread_t current = pthread_self();
+
+ Ident = lookupThreadId (current);
+ if (Ident == 0)
+ /* @@@ see TODO: alien pthread_self() @@@ */
+ Ident = insertThreadId (current);
+ }
+
+ return ((oslThreadIdentifier)(Ident));
+}
+
+/*****************************************************************************
+ @@@ see TODO @@@
+ osl_thread_priority_init_Impl
+
+ set the base-priority of the main-thread to
+ oslThreadPriorityNormal (64) since 0 (lowest) is
+ the system default. This behaviour collides with
+ our enum-priority definition (highest..normal..lowest).
+ A normaluser will expect the main-thread of an app.
+ to have the "normal" priority.
+
+*****************************************************************************/
+static void osl_thread_priority_init_Impl (void)
+{
+#ifndef NO_PTHREAD_PRIORITY
+ struct sched_param param;
+ int policy=0;
+ int nRet=0;
+
+/* @@@ see TODO: calling thread may not be main thread @@@ */
+
+ if ((nRet = pthread_getschedparam(pthread_self(), &policy, &param)) != 0)
+ {
+ OSL_TRACE("failed to get priority of thread [%s]\n",strerror(nRet));
+ return;
+ }
+
+#if defined (SOLARIS)
+ if ( policy >= _SCHED_NEXT)
+ {
+ /* mfe: pthread_getschedparam on Solaris has a possible Bug */
+ /* one gets 959917873 as the policy */
+ /* so set the policy to a default one */
+ policy=SCHED_OTHER;
+ }
+#endif /* SOLARIS */
+
+ if ((nRet = sched_get_priority_min(policy) ) != -1)
+ {
+ OSL_TRACE("Min Prioriy for policy '%i' == '%i'\n",policy,nRet);
+ g_thread.m_priority.m_Lowest=nRet;
+ }
+#if OSL_DEBUG_LEVEL > 1
+ else
+ {
+ fprintf(stderr,"failed to get min sched param [%s]\n",strerror(errno));
+ }
+#endif /* OSL_DEBUG_LEVEL */
+
+ if ((nRet = sched_get_priority_max(policy) ) != -1)
+ {
+ OSL_TRACE("Max Prioriy for policy '%i' == '%i'\n",policy,nRet);
+ g_thread.m_priority.m_Highest=nRet;
+ }
+#if OSL_DEBUG_LEVEL > 1
+ else
+ {
+ fprintf(stderr,"failed to get max sched param [%s]\n",strerror(errno));
+ }
+#endif /* OSL_DEBUG_LEVEL */
+
+ g_thread.m_priority.m_Normal =
+ (g_thread.m_priority.m_Lowest + g_thread.m_priority.m_Highest) / 2;
+ g_thread.m_priority.m_Below_Normal =
+ (g_thread.m_priority.m_Lowest + g_thread.m_priority.m_Normal) / 2;
+ g_thread.m_priority.m_Above_Normal =
+ (g_thread.m_priority.m_Normal + g_thread.m_priority.m_Highest) / 2;
+
+/* @@@ set prio of calling (not main) thread (?) @@@ */
+
+ param.sched_priority= g_thread.m_priority.m_Normal;
+
+ if ((nRet = pthread_setschedparam(pthread_self(), policy, &param)) != 0)
+ {
+ OSL_TRACE("failed to change base priority of thread [%s]\n",strerror(nRet));
+ OSL_TRACE("Thread ID '%i', Policy '%i', Priority '%i'\n",pthread_self(),policy,param.sched_priority);
+ }
+
+#endif /* NO_PTHREAD_PRIORITY */
+}
+
+/*****************************************************************************/
+/* osl_setThreadPriority */
+/*
+ Impl-Notes: contrary to solaris-docu, which claims
+ valid priority-levels from 0 .. INT_MAX, only the
+ range 0..127 is accepted. (0 lowest, 127 highest)
+*/
+/*****************************************************************************/
+void SAL_CALL osl_setThreadPriority (
+ oslThread Thread,
+ oslThreadPriority Priority)
+{
+#ifndef NO_PTHREAD_PRIORITY
+
+ struct sched_param Param;
+ int policy;
+ int nRet;
+
+#endif /* NO_PTHREAD_PRIORITY */
+
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+
+ OSL_ASSERT(pImpl);
+ if (!pImpl)
+ return; /* EINVAL */
+
+#ifdef NO_PTHREAD_PRIORITY
+ (void) Priority; /* unused */
+#else /* NO_PTHREAD_PRIORITY */
+
+ if (pthread_getschedparam(pImpl->m_hThread, &policy, &Param) != 0)
+ return; /* ESRCH */
+
+#if defined (SOLARIS)
+ if ( policy >= _SCHED_NEXT)
+ {
+ /* mfe: pthread_getschedparam on Solaris has a possible Bug */
+ /* one gets 959917873 as the policy */
+ /* so set the policy to a default one */
+ policy=SCHED_OTHER;
+ }
+#endif /* SOLARIS */
+
+ pthread_once (&(g_thread.m_once), osl_thread_init_Impl);
+
+ switch(Priority)
+ {
+ case osl_Thread_PriorityHighest:
+ Param.sched_priority= g_thread.m_priority.m_Highest;
+ break;
+
+ case osl_Thread_PriorityAboveNormal:
+ Param.sched_priority= g_thread.m_priority.m_Above_Normal;
+ break;
+
+ case osl_Thread_PriorityNormal:
+ Param.sched_priority= g_thread.m_priority.m_Normal;
+ break;
+
+ case osl_Thread_PriorityBelowNormal:
+ Param.sched_priority= g_thread.m_priority.m_Below_Normal;
+ break;
+
+ case osl_Thread_PriorityLowest:
+ Param.sched_priority= g_thread.m_priority.m_Lowest;
+ break;
+
+ case osl_Thread_PriorityUnknown:
+ OSL_ASSERT(sal_False); /* only fools try this...*/
+
+ /* let release-version behave friendly */
+ return;
+
+ default:
+ /* enum expanded, but forgotten here...*/
+ OSL_ENSURE(sal_False,"osl_setThreadPriority : unknown priority\n");
+
+ /* let release-version behave friendly */
+ return;
+ }
+
+ if ((nRet = pthread_setschedparam(pImpl->m_hThread, policy, &Param)) != 0)
+ {
+ OSL_TRACE("failed to change thread priority [%s]\n",strerror(nRet));
+ }
+
+#endif /* NO_PTHREAD_PRIORITY */
+}
+
+/*****************************************************************************/
+/* osl_getThreadPriority */
+/*****************************************************************************/
+oslThreadPriority SAL_CALL osl_getThreadPriority(const oslThread Thread)
+{
+#ifndef NO_PTHREAD_PRIORITY
+
+ struct sched_param Param;
+ int Policy;
+
+#endif /* NO_PTHREAD_PRIORITY */
+
+ oslThreadPriority Priority = osl_Thread_PriorityNormal;
+ Thread_Impl* pImpl= (Thread_Impl*)Thread;
+
+ OSL_ASSERT(pImpl);
+ if (!pImpl)
+ return osl_Thread_PriorityUnknown; /* EINVAL */
+
+#ifndef NO_PTHREAD_PRIORITY
+
+ if (pthread_getschedparam(pImpl->m_hThread, &Policy, &Param) != 0)
+ return osl_Thread_PriorityUnknown; /* ESRCH */
+
+ pthread_once (&(g_thread.m_once), osl_thread_init_Impl);
+
+ /* map pthread priority to enum */
+ if (Param.sched_priority==g_thread.m_priority.m_Highest)
+ {
+ /* 127 - highest */
+ Priority= osl_Thread_PriorityHighest;
+ }
+ else if (Param.sched_priority > g_thread.m_priority.m_Normal)
+ {
+ /* 65..126 - above normal */
+ Priority= osl_Thread_PriorityAboveNormal;
+ }
+ else if (Param.sched_priority == g_thread.m_priority.m_Normal)
+ {
+ /* normal */
+ Priority= osl_Thread_PriorityNormal;
+ }
+ else if (Param.sched_priority > g_thread.m_priority.m_Lowest)
+ {
+ /* 63..1 -below normal */
+ Priority= osl_Thread_PriorityBelowNormal;
+ }
+ else if (Param.sched_priority == g_thread.m_priority.m_Lowest)
+ {
+ /* 0 - lowest */
+ Priority= osl_Thread_PriorityLowest;
+ }
+ else
+ {
+ /* unknown */
+ Priority= osl_Thread_PriorityUnknown;
+ }
+
+#endif /* NO_PTHREAD_PRIORITY */
+
+ return Priority;
+}
+
+/*****************************************************************************/
+/* osl_createThreadKey */
+/*****************************************************************************/
+oslThreadKey SAL_CALL osl_createThreadKey( oslThreadKeyCallbackFunction pCallback )
+{
+ pthread_key_t key;
+
+ if (pthread_key_create(&key, pCallback) != 0)
+ key = 0;
+
+ return ((oslThreadKey)key);
+}
+
+/*****************************************************************************/
+/* osl_destroyThreadKey */
+/*****************************************************************************/
+void SAL_CALL osl_destroyThreadKey(oslThreadKey Key)
+{
+ pthread_key_delete((pthread_key_t)Key);
+}
+
+/*****************************************************************************/
+/* osl_getThreadKeyData */
+/*****************************************************************************/
+void* SAL_CALL osl_getThreadKeyData(oslThreadKey Key)
+{
+ return (pthread_getspecific((pthread_key_t)Key));
+}
+
+/*****************************************************************************/
+/* osl_setThreadKeyData */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setThreadKeyData(oslThreadKey Key, void *pData)
+{
+ return (pthread_setspecific((pthread_key_t)Key, pData) == 0);
+}
+
+/*****************************************************************************/
+/* Thread Local Text Encoding */
+/*****************************************************************************/
+static void osl_thread_textencoding_init_Impl (void)
+{
+ rtl_TextEncoding defaultEncoding;
+ const char * pszEncoding;
+
+ /* create thread specific data key */
+ pthread_key_create (&(g_thread.m_textencoding.m_key), NULL);
+
+ /* determine default text encoding */
+ pszEncoding = getenv ("SOLAR_USER_RTL_TEXTENCODING");
+ if (pszEncoding)
+ defaultEncoding = atoi(pszEncoding);
+ else
+ defaultEncoding = osl_getTextEncodingFromLocale(NULL);
+
+ OSL_ASSERT(defaultEncoding != RTL_TEXTENCODING_DONTKNOW);
+
+ /*
+ Tools string functions call abort() on an unknown encoding so ASCII
+ is a meaningfull fallback regardless wether the assertion makes sense.
+ */
+
+ if ( RTL_TEXTENCODING_DONTKNOW == defaultEncoding )
+ defaultEncoding = RTL_TEXTENCODING_ASCII_US;
+
+ g_thread.m_textencoding.m_default = defaultEncoding;
+}
+
+/*****************************************************************************/
+/* osl_getThreadTextEncoding */
+/*****************************************************************************/
+rtl_TextEncoding SAL_CALL osl_getThreadTextEncoding()
+{
+ rtl_TextEncoding threadEncoding;
+
+ pthread_once (&(g_thread.m_once), osl_thread_init_Impl);
+
+ /* check for thread specific encoding, use default if not set */
+ threadEncoding = SAL_INT_CAST(
+ rtl_TextEncoding,
+ (sal_uIntPtr) pthread_getspecific(g_thread.m_textencoding.m_key));
+ if (0 == threadEncoding)
+ threadEncoding = g_thread.m_textencoding.m_default;
+
+ return threadEncoding;
+}
+
+/*****************************************************************************/
+/* osl_setThreadTextEncoding */
+/*****************************************************************************/
+rtl_TextEncoding osl_setThreadTextEncoding(rtl_TextEncoding Encoding)
+{
+ rtl_TextEncoding oldThreadEncoding = osl_getThreadTextEncoding();
+
+ /* save encoding in thread local storage */
+ pthread_setspecific (
+ g_thread.m_textencoding.m_key,
+ (void*) SAL_INT_CAST(sal_uIntPtr, Encoding));
+
+ return oldThreadEncoding;
+}
diff --git a/sal/osl/unx/time.c b/sal/osl/unx/time.c
new file mode 100644
index 000000000000..c1a98a6b87a9
--- /dev/null
+++ b/sal/osl/unx/time.c
@@ -0,0 +1,269 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/time.h>
+
+/* FIXME: detection should be done in configure script */
+#if defined(MACOSX) || defined(FREEBSD) || defined(NETBSD) || defined(LINUX)
+#define STRUCT_TM_HAS_GMTOFF 1
+
+#elif defined(SOLARIS)
+#define HAS_ALTZONE 1
+#endif
+
+/*--------------------------------------------------
+ * osl_getSystemTime
+ *-------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getSystemTime(TimeValue* TimeValue)
+{
+ struct timeval tp;
+
+ /* FIXME: use higher resolution */
+ gettimeofday(&tp, NULL);
+
+ TimeValue->Seconds = tp.tv_sec;
+ TimeValue->Nanosec = tp.tv_usec * 1000;
+
+ return (sal_True);
+}
+
+
+/*--------------------------------------------------
+ * osl_getDateTimeFromTimeValue
+ *-------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getDateTimeFromTimeValue( TimeValue* pTimeVal, oslDateTime* pDateTime )
+{
+ struct tm *pSystemTime;
+ struct tm tmBuf;
+ time_t atime;
+
+ atime = (time_t)pTimeVal->Seconds;
+
+ /* Convert time from type time_t to struct tm */
+ pSystemTime = gmtime_r( &atime, &tmBuf );
+
+
+ /* Convert struct tm to struct oslDateTime */
+ if ( pSystemTime != NULL )
+ {
+ pDateTime->NanoSeconds = pTimeVal->Nanosec;
+ pDateTime->Seconds = pSystemTime->tm_sec;
+ pDateTime->Minutes = pSystemTime->tm_min;
+ pDateTime->Hours = pSystemTime->tm_hour;
+ pDateTime->Day = pSystemTime->tm_mday;
+ pDateTime->DayOfWeek = pSystemTime->tm_wday;
+ pDateTime->Month = pSystemTime->tm_mon + 1;
+ pDateTime->Year = pSystemTime->tm_year + 1900;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+/*--------------------------------------------------
+ * osl_getTimeValueFromDateTime
+ *--------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getTimeValueFromDateTime( oslDateTime* pDateTime, TimeValue* pTimeVal )
+{
+ struct tm aTime;
+ time_t nSeconds;
+
+ /* Convert struct oslDateTime to struct tm */
+ aTime.tm_sec = pDateTime->Seconds;
+ aTime.tm_min = pDateTime->Minutes;
+ aTime.tm_hour = pDateTime->Hours;
+ aTime.tm_mday = pDateTime->Day;
+ aTime.tm_wday = pDateTime->DayOfWeek;
+
+ if ( pDateTime->Month > 0 )
+ aTime.tm_mon = pDateTime->Month - 1;
+ else
+ return sal_False;
+
+ if ( pDateTime->Year >= 1900 )
+ aTime.tm_year = pDateTime->Year - 1900;
+ else
+ return sal_False;
+
+ aTime.tm_isdst = -1;
+ aTime.tm_wday = 0;
+ aTime.tm_yday = 0;
+
+ /* Convert time to calendar value */
+ nSeconds = mktime( &aTime );
+
+ /*
+ * mktime expects the struct tm to be in local timezone, so we have to adjust
+ * the returned value to be timezone neutral.
+ */
+
+ if ( nSeconds != (time_t) -1 )
+ {
+ time_t bias;
+
+ /* timezone corrections */
+ tzset();
+
+#if defined(STRUCT_TM_HAS_GMTOFF)
+ /* members of struct tm are corrected by mktime */
+ bias = 0 - aTime.tm_gmtoff;
+
+#elif defined(HAS_ALTZONE)
+ /* check if daylight saving time is in effect */
+ bias = aTime.tm_isdst > 0 ? altzone : timezone;
+#else
+ /* exspect daylight saving time to be one hour */
+ bias = aTime.tm_isdst > 0 ? timezone - 3600 : timezone;
+#endif
+
+ pTimeVal->Seconds = nSeconds;
+ pTimeVal->Nanosec = pDateTime->NanoSeconds;
+
+ if ( nSeconds > bias )
+ pTimeVal->Seconds -= bias;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+
+/*--------------------------------------------------
+ * osl_getLocalTimeFromSystemTime
+ *--------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getLocalTimeFromSystemTime( TimeValue* pSystemTimeVal, TimeValue* pLocalTimeVal )
+{
+ struct tm *pLocalTime;
+ struct tm tmBuf;
+ time_t bias;
+ time_t atime;
+
+ atime = (time_t) pSystemTimeVal->Seconds;
+ pLocalTime = localtime_r( &atime, &tmBuf );
+
+#if defined(STRUCT_TM_HAS_GMTOFF)
+ /* members of struct tm are corrected by mktime */
+ bias = 0 - pLocalTime->tm_gmtoff;
+
+#elif defined(HAS_ALTZONE)
+ /* check if daylight saving time is in effect */
+ bias = pLocalTime->tm_isdst > 0 ? altzone : timezone;
+#else
+ /* exspect daylight saving time to be one hour */
+ bias = pLocalTime->tm_isdst > 0 ? timezone - 3600 : timezone;
+#endif
+
+ if ( (sal_Int64) pSystemTimeVal->Seconds > bias )
+ {
+ pLocalTimeVal->Seconds = pSystemTimeVal->Seconds - bias;
+ pLocalTimeVal->Nanosec = pSystemTimeVal->Nanosec;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+/*--------------------------------------------------
+ * osl_getSystemTimeFromLocalTime
+ *--------------------------------------------------*/
+
+sal_Bool SAL_CALL osl_getSystemTimeFromLocalTime( TimeValue* pLocalTimeVal, TimeValue* pSystemTimeVal )
+{
+ struct tm *pLocalTime;
+ struct tm tmBuf;
+ time_t bias;
+ time_t atime;
+
+ atime = (time_t) pLocalTimeVal->Seconds;
+
+ /* Convert atime, which is a local time, to it's GMT equivalent. Then, get
+ * the timezone offset for the local time for the GMT equivalent time. Note
+ * that we cannot directly use local time to determine the timezone offset
+ * because GMT is the only reliable time that we can determine timezone
+ * offset from.
+ */
+
+ atime = mktime( gmtime_r( &atime, &tmBuf ) );
+ pLocalTime = localtime_r( &atime, &tmBuf );
+
+#if defined(STRUCT_TM_HAS_GMTOFF)
+ /* members of struct tm are corrected by mktime */
+ bias = 0 - pLocalTime->tm_gmtoff;
+
+#elif defined(HAS_ALTZONE)
+ /* check if daylight saving time is in effect */
+ bias = pLocalTime->tm_isdst > 0 ? altzone : timezone;
+#else
+ /* exspect daylight saving time to be one hour */
+ bias = pLocalTime->tm_isdst > 0 ? timezone - 3600 : timezone;
+#endif
+
+ if ( (sal_Int64) pLocalTimeVal->Seconds + bias > 0 )
+ {
+ pSystemTimeVal->Seconds = pLocalTimeVal->Seconds + bias;
+ pSystemTimeVal->Nanosec = pLocalTimeVal->Nanosec;
+
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+
+
+static struct timeval startTime;
+static sal_Bool bGlobalTimer = sal_False;
+
+sal_uInt32 SAL_CALL osl_getGlobalTimer()
+{
+ struct timeval currentTime;
+ sal_uInt32 nSeconds;
+
+ // FIXME: not thread safe !!
+ if ( bGlobalTimer == sal_False )
+ {
+ gettimeofday( &startTime, NULL );
+ bGlobalTimer=sal_True;
+ }
+
+ gettimeofday( &currentTime, NULL );
+
+ nSeconds = (sal_uInt32)( currentTime.tv_sec - startTime.tv_sec );
+
+ return ( nSeconds * 1000 ) + (long) (( currentTime.tv_usec - startTime.tv_usec) / 1000 );
+}
diff --git a/sal/osl/unx/util.c b/sal/osl/unx/util.c
new file mode 100644
index 000000000000..5ba04db56021
--- /dev/null
+++ b/sal/osl/unx/util.c
@@ -0,0 +1,350 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+
+#ifdef SOLARIS
+#include <sys/sockio.h>
+#endif
+
+#include "osl/util.h"
+
+
+
+/*****************************************************************************/
+/* Static Module Functions */
+/*****************************************************************************/
+
+static int osl_getHWAddr(const char *ifname, char* hard_addr);
+static int osl_checkAddr(const char* addr);
+
+
+/*****************************************************************************/
+/* osl_getEthernetAddress */
+/*****************************************************************************/
+
+sal_Bool SAL_CALL osl_getEthernetAddress( sal_uInt8 * pAddr )
+{
+ char buff[1024];
+ char hard_addr[64];
+ struct ifconf ifc;
+ struct ifreq *ifr;
+ int i;
+ int so;
+
+#ifdef SOLARIS
+ /** algorithm doesn't work on solaris */
+ return sal_False;
+#else
+
+ if ( pAddr == 0 )
+ {
+ return sal_False;
+ }
+
+
+ /*
+ * All we need is ... a network file descriptor.
+ * Normally, this is a very socket.
+ */
+
+ so = socket(AF_INET, SOCK_DGRAM, 0);
+
+
+ /*
+ * The first thing we have to do, get the interface configuration.
+ * It is a list of attached/configured interfaces
+ */
+
+ ifc.ifc_len = sizeof(buff);
+ ifc.ifc_buf = buff;
+ if ( ioctl(so, SIOCGIFCONF, &ifc) < 0 )
+ {
+/* fprintf(stderr, "SIOCGIFCONF: %s\n", strerror(errno));*/
+ close(so);
+ return sal_False;
+ }
+
+ close(so);
+
+ /*
+ * For each of the interfaces in the interface list,
+ * try to get the hardware address
+ */
+
+ ifr = ifc.ifc_req;
+ for ( i = ifc.ifc_len / sizeof(struct ifreq) ; --i >= 0 ; ifr++ )
+ {
+ int nRet=0;
+ nRet = osl_getHWAddr(ifr->ifr_name,hard_addr);
+ if ( nRet > 0 )
+ {
+ memcpy( pAddr , hard_addr, 6 );
+ return sal_True;
+ }
+ }
+
+ return sal_False;
+#endif
+}
+
+
+/*****************************************************************************/
+/* osl_getHWAddr */
+/*****************************************************************************/
+
+static int osl_getHWAddr(const char *ifname, char* hard_addr)
+{
+ int ret=0;
+ struct ifreq ifr;
+ int so = socket(AF_INET, SOCK_DGRAM, 0);
+
+ strcpy(ifr.ifr_name, ifname);
+
+ /*
+ * First, get the Interface-FLAGS
+ */
+
+ ret=ioctl(so, SIOCGIFFLAGS, &ifr) ;
+
+ if ( ret < 0 )
+ {
+/* fprintf(stderr, "SIOCGIFFLAGS: %s\n", strerror(errno)); */
+ close(so);
+ return ret;
+ }
+
+
+ /*
+ * If it is the loopback device, do not consider it any further
+ */
+
+ if (ifr.ifr_flags & IFF_LOOPBACK)
+ {
+/* fprintf(stderr, "SIOCGIFFLAGS : is LOOPBACK : %s\n", strerror(errno));*/
+ close(so);
+ return 0;
+ }
+
+
+ /*
+ * And now, the real thing: the get address
+ */
+
+#ifdef SIOCGIFHWADDR
+ ret=ioctl(so, SIOCGIFHWADDR, &ifr);
+#else
+ ret=ioctl(so, SIOCGIFADDR, &ifr);
+#endif
+
+ if (ret < 0) {
+/* fprintf(stderr, "SIOCGIFADDR: %s\n", strerror(errno));*/
+ memset(hard_addr, 0, 32);
+ close(so);
+ return ret;
+ }
+
+ close(so);
+
+#ifdef SIOCGIFHWADDR
+ memcpy(hard_addr,ifr.ifr_hwaddr.sa_data,8);
+#else
+ memcpy(hard_addr,ifr.ifr_ifru.ifru_addr.sa_data,8);
+#endif
+
+
+ /*
+ * Check, if no real, i.e. 00:00:00:00:00:00, address was retrieved.
+ * The Linux dummy device has this kind of behaviour
+ */
+
+ ret=osl_checkAddr(hard_addr);
+
+ if (ret < 0) {
+/* fprintf(stderr, "SIOCGIFADDR got '00:00:00:00:00:00'\n"); */
+ return ret;
+ }
+
+/* fprintf(stderr,"interface : %s -- ",ifname);*/
+/* fprintf(stderr,"HWaddr : %s\n", print_ether(hard_addr));*/
+
+ return 1;
+}
+
+
+/*****************************************************************************/
+/* osl_checkAddr */
+/*****************************************************************************/
+
+static int osl_checkAddr(const char* addr)
+{
+ if (addr[0]==0 && addr[1]==0 &&
+ addr[2]==0 && addr[3]==0 &&
+ addr[4]==0 && addr[5]==0)
+ {
+ return -1;
+ }
+ return 0;
+}
+
+
+#if defined (SPARC)
+
+#if defined (SOLARIS) && !defined(__sparcv8plus) && !defined(__sparcv9)
+#include <sys/types.h>
+#include <sys/processor.h>
+
+/*****************************************************************************/
+/* osl_InitSparcV9 */
+/*****************************************************************************/
+
+void osl_InterlockedCountSetV9(sal_Bool bV9);
+
+/*
+ * osl_InitSparcV9() should be executed as early as possible. We place it in the
+ * .init section of sal
+ */
+#if defined ( __SUNPRO_C ) || defined ( __SUNPRO_CC )
+void osl_InitSparcV9(void);
+#pragma init (osl_InitSparcV9)
+#elif defined ( __GNUC__ )
+void osl_InitSparcV9(void) __attribute__((constructor));
+#endif
+
+void osl_InitSparcV9(void)
+{
+ /* processor_info() identifies SPARCV8 (ie sun4c machines) simply as "sparc"
+ * and SPARCV9 (ie ultra sparcs, sun4u) as "sparcv9". Since we know that we
+ * run at least on a SPARCV8 architecture or better, any processor type != "sparc"
+ * and != "i386" is considered to be SPARCV9 or better
+ *
+ * This way we are certain that this will still work if someone names SPARCV10
+ * "foobar"
+ */
+ processor_info_t aInfo;
+ int rc;
+
+ rc = processor_info(0, &aInfo);
+
+ if ( rc != -1 ) {
+ if ( !strcmp( "sparc", aInfo.pi_processor_type ) /* SPARCV8 */
+ || !strcmp( "i386", aInfo.pi_processor_type ) ) /* can't happen, but ... */
+ return;
+ /* we are reasonably certain to be on sparcv9/sparcv8plus or better */
+ osl_InterlockedCountSetV9(sal_True);
+ }
+}
+
+#endif /* SOLARIS */
+
+#if defined(NETBSD) && defined(GCC) && !defined(__sparcv9) && !defined(__sparc_v9__)
+
+#include <sys/param.h>
+#include <sys/sysctl.h>
+void osl_InitSparcV9(void) __attribute__((constructor));
+void osl_InterlockedCountSetV9(sal_Bool bV9);
+
+/* Determine which processor we are running on (sparc v8 or v9)
+ * The approach is very similar to Solaris.
+ */
+
+void osl_InitSparcV9(void)
+{
+ int mib[2]={CTL_HW,HW_MACHINE};
+ char processorname[256];
+ size_t len=256;
+
+ /* get the machine name */
+ sysctl(mib, 2, processorname, &len, NULL, 0);
+ if (!strncmp("sparc64",processorname, len)) {
+ osl_InterlockedCountSetV9(sal_True);
+ }
+}
+
+#endif /* NETBSD */
+
+#endif /* SPARC */
+
+#if defined ( LINUX ) && defined ( SPARC )
+#include <sys/utsname.h>
+void osl_InitSparcV9(void) __attribute__((constructor));
+void osl_InterlockedCountSetV9(sal_Bool bV9);
+/* Determine which processor we are running on (sparc v8 or v9)
+ * The approach is very similar to Solaris.
+ */
+void osl_InitSparcV9(void)
+{
+ struct utsname name;
+ int rc;
+ rc = uname(&name);
+ if ( rc != -1 ) {
+ if ( !strcmp( "sparc", name.machine ))
+ return;
+ osl_InterlockedCountSetV9(sal_True);
+ }
+}
+#endif
+
+#if ( defined(__GNUC__) && (defined(X86) || defined(X86_64)) )\
+ || ( defined(SOLARIS) && defined (__SUNPRO_C) && defined(__i386) )
+
+/* Safe default */
+int osl_isSingleCPU = 0;
+
+/* Determine if we are on a multiprocessor/multicore/HT x86/x64 system
+ *
+ * The lock prefix for atomic operations in osl_[inc|de]crementInterlockedCount()
+ * comes with a cost and is especially expensive on pre HT x86 single processor
+ * systems, where it isn't needed at all.
+ *
+ * This should be run as early as possible, thus it's placed in the init section
+ */
+#if defined(_SC_NPROCESSORS_CONF) /* i.e. MACOSX for Intel doesn't have this */
+#if defined(__GNUC__)
+void osl_interlockedCountCheckForSingleCPU(void) __attribute__((constructor));
+#elif defined(__SUNPRO_C)
+void osl_interlockedCountCheckForSingleCPU(void);
+#pragma init (osl_interlockedCountCheckForSingleCPU)
+#endif
+
+void osl_interlockedCountCheckForSingleCPU(void)
+{
+ /* In case sysconfig fails be on the safe side,
+ * consider it a multiprocessor/multicore/HT system */
+ if ( sysconf(_SC_NPROCESSORS_CONF) == 1 ) {
+ osl_isSingleCPU = 1;
+ }
+}
+#endif /* defined(_SC_NPROCESSORS_CONF) */
+#endif
diff --git a/sal/osl/unx/uunxapi.cxx b/sal/osl/unx/uunxapi.cxx
new file mode 100644
index 000000000000..299ea4198fdc
--- /dev/null
+++ b/sal/osl/unx/uunxapi.cxx
@@ -0,0 +1,130 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+ #ifndef _OSL_UUNXAPI_H_
+ #include "uunxapi.h"
+ #endif
+
+ #ifndef __OSL_SYSTEM_H__
+ #include "system.h"
+ #endif
+
+ #ifndef _LIMITS_H
+ #include <limits.h>
+ #endif
+
+ #ifndef _RTL_USTRING_HXX_
+ #include <rtl/ustring.hxx>
+ #endif
+
+ #ifndef _OSL_THREAD_H_
+ #include <osl/thread.h>
+ #endif
+
+ //###########################
+ inline rtl::OString OUStringToOString(const rtl_uString* s)
+ {
+ return rtl::OUStringToOString(
+ rtl::OUString(const_cast<rtl_uString*>(s)),
+ osl_getThreadTextEncoding());
+ }
+
+ //###########################
+#ifdef MACOSX
+/*
+ * Helper function for resolving Mac native alias files (not the same as unix alias files)
+ * and to return the resolved alias as rtl::OString
+ */
+ inline rtl::OString macxp_resolveAliasAndConvert(const rtl_uString* s)
+ {
+ rtl::OString p = OUStringToOString(s);
+ sal_Char path[PATH_MAX];
+ if (p.getLength() < PATH_MAX)
+ {
+ strcpy(path, p.getStr());
+ macxp_resolveAlias(path, PATH_MAX);
+ p = rtl::OString(path);
+ }
+ return p;
+ }
+#endif /* MACOSX */
+
+ //###########################
+ //access_u
+ int access_u(const rtl_uString* pustrPath, int mode)
+ {
+#ifndef MACOSX // not MACOSX
+ return access(OUStringToOString(pustrPath).getStr(), mode);
+#else
+ return access(macxp_resolveAliasAndConvert(pustrPath).getStr(), mode);
+#endif
+ }
+
+ //#########################
+ //realpath_u
+ sal_Bool realpath_u(const rtl_uString* pustrFileName, rtl_uString** ppustrResolvedName)
+ {
+#ifndef MACOSX // not MACOSX
+ rtl::OString fn = OUStringToOString(pustrFileName);
+#else
+ rtl::OString fn = macxp_resolveAliasAndConvert(pustrFileName);
+#endif
+ char rp[PATH_MAX];
+ bool bRet = realpath(fn.getStr(), rp);
+
+ if (bRet)
+ {
+ rtl::OUString resolved = rtl::OStringToOUString(
+ rtl::OString(static_cast<sal_Char*>(rp)),
+ osl_getThreadTextEncoding());
+
+ rtl_uString_assign(ppustrResolvedName, resolved.pData);
+ }
+ return bRet;
+ }
+
+ //#########################
+ //lstat_u
+ int lstat_u(const rtl_uString* pustrPath, struct stat* buf)
+ {
+#ifndef MACOSX // not MACOSX
+ return lstat(OUStringToOString(pustrPath).getStr(), buf);
+#else
+ return lstat(macxp_resolveAliasAndConvert(pustrPath).getStr(), buf);
+#endif
+ }
+
+ //#########################
+ // @see mkdir
+ int mkdir_u(const rtl_uString* path, mode_t mode)
+ {
+ return mkdir(OUStringToOString(path).getStr(), mode);
+ }
+
diff --git a/sal/osl/unx/uunxapi.h b/sal/osl/unx/uunxapi.h
new file mode 100644
index 000000000000..9eddc5fe4753
--- /dev/null
+++ b/sal/osl/unx/uunxapi.h
@@ -0,0 +1,86 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ #ifndef _OSL_UUNXAPI_H_
+ #define _OSL_UUNXAPI_H_
+
+ #ifndef _UNISTD_H
+ #include <unistd.h>
+ #endif
+
+ #ifndef _STDLIB_H
+ #include <stdlib.h>
+ #endif
+
+ #ifndef _TYPES_H
+ #include <sys/types.h>
+ #endif
+
+ #ifndef _STAT_H
+ #include <sys/stat.h>
+ #endif
+
+ #ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+ #endif
+
+
+ #ifdef __cplusplus
+ extern "C"
+ {
+ #endif
+
+ /* @see access */
+ int access_u(const rtl_uString* pustrPath, int mode);
+
+ /***********************************
+ @descr
+ The return value differs from the
+ realpath function
+
+ @returns sal_True on success else
+ sal_False
+
+ @see realpath
+ **********************************/
+ sal_Bool realpath_u(
+ const rtl_uString* pustrFileName,
+ rtl_uString** ppustrResolvedName);
+
+ /* @see lstat */
+ int lstat_u(const rtl_uString* pustrPath, struct stat* buf);
+
+ /* @see mkdir */
+ int mkdir_u(const rtl_uString* path, mode_t mode);
+
+ #ifdef __cplusplus
+ }
+ #endif
+
+
+ #endif /* _OSL_UUNXAPI_H_ */
+
diff --git a/sal/osl/unx/uunxapi.hxx b/sal/osl/unx/uunxapi.hxx
new file mode 100644
index 000000000000..7f1a9072e8cc
--- /dev/null
+++ b/sal/osl/unx/uunxapi.hxx
@@ -0,0 +1,98 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+ #ifndef _OSL_UUNXAPI_HXX_
+ #define _OSL_UUNXAPI_HXX_
+
+ #ifndef _OSL_UUNXAPI_H_
+ #include "uunxapi.h"
+ #endif
+
+ #ifndef _RTL_USTRING_HXX_
+ #include <rtl/ustring.hxx>
+ #endif
+
+ namespace osl
+ {
+
+ /***********************************
+ osl::access
+
+ @see access
+ **********************************/
+
+ inline int access(const rtl::OUString& ustrPath, int mode)
+ {
+ return access_u(ustrPath.pData, mode);
+ }
+
+ /***********************************
+ osl::realpath
+
+ @descr
+ The return value differs from the
+ realpath function
+
+ @returns sal_True on success else
+ sal_False
+
+ @see realpath
+ **********************************/
+
+ inline sal_Bool realpath(
+ const rtl::OUString& ustrFileName,
+ rtl::OUString& ustrResolvedName)
+ {
+ return realpath_u(ustrFileName.pData, &ustrResolvedName.pData);
+ }
+
+
+ /***********************************
+ osl::lstat
+
+ @see lstat
+ **********************************/
+
+ inline int lstat(const rtl::OUString& ustrPath, struct stat& buf)
+ {
+ return lstat_u(ustrPath.pData, &buf);
+ }
+
+ /***********************************
+ osl::mkdir
+ @see mkdir
+ **********************************/
+ inline int mkdir(const rtl::OUString& aPath, mode_t aMode)
+ {
+ return mkdir_u(aPath.pData, aMode);
+ }
+
+ } // end namespace osl
+
+
+ #endif /* _OSL_UUNXAPI_HXX_ */
+
diff --git a/sal/osl/w32/MAKEFILE.MK b/sal/osl/w32/MAKEFILE.MK
new file mode 100644
index 000000000000..4749048847b5
--- /dev/null
+++ b/sal/osl/w32/MAKEFILE.MK
@@ -0,0 +1,118 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=sal
+TARGET=cpposl
+USE_LDUMP2=TRUE
+
+PROJECTPCH4DLL=TRUE
+PROJECTPCH=cont_pch
+PROJECTPCHSOURCE=cont_pch
+
+MULTITHREAD_OBJ=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# Uncomment the following line if you want to compile with -Wall
+# it disables lots of unnecessary warnings comming from the Win32
+# header files (disabling warnings via command line only works with
+# MSVC >= 7.x)
+#
+# CFLAGS+=/wd4668 /wd4711 /wd4201 /wd4710 /wd4619 /wd4514 /wd4820
+
+# --- Files --------------------------------------------------------
+.IF "$(CCNUMVER)" >= "001400000000"
+CDEFS+=-D_CRT_NON_CONFORMING_SWPRINTFS
+.ENDIF
+
+.IF "$(header)" == ""
+
+SLOFILES= $(SLO)$/conditn.obj \
+ $(SLO)$/diagnose.obj \
+ $(SLO)$/dllentry.obj \
+ $(SLO)$/semaphor.obj \
+ $(SLO)$/socket.obj \
+ $(SLO)$/interlck.obj \
+ $(SLO)$/nlsupport.obj\
+ $(SLO)$/mutex.obj \
+ $(SLO)$/thread.obj \
+ $(SLO)$/module.obj \
+ $(SLO)$/process.obj \
+ $(SLO)$/security.obj \
+ $(SLO)$/profile.obj \
+ $(SLO)$/time.obj \
+ $(SLO)$/signal.obj \
+ $(SLO)$/pipeimpl.obj \
+ $(SLO)$/pipe.obj \
+ $(SLO)$/util.obj \
+ $(SLO)$/file.obj\
+ $(SLO)$/file_dirvol.obj\
+ $(SLO)$/file_error.obj\
+ $(SLO)$/file_url.obj\
+ $(SLO)$/tempfile.obj\
+ $(SLO)$/path_helper.obj\
+ $(SLO)$/procimpl.obj \
+ $(SLO)$/salinit.obj
+
+OBJFILES= $(OBJ)$/conditn.obj \
+ $(OBJ)$/diagnose.obj \
+ $(OBJ)$/libutil.obj \
+ $(OBJ)$/semaphor.obj \
+ $(OBJ)$/socket.obj \
+ $(OBJ)$/interlck.obj \
+ $(OBJ)$/nlsupport.obj\
+ $(OBJ)$/mutex.obj \
+ $(OBJ)$/thread.obj \
+ $(OBJ)$/module.obj \
+ $(OBJ)$/process.obj \
+ $(OBJ)$/security.obj \
+ $(OBJ)$/profile.obj \
+ $(OBJ)$/time.obj \
+ $(OBJ)$/signal.obj \
+ $(OBJ)$/pipeimpl.obj \
+ $(OBJ)$/pipe.obj \
+ $(OBJ)$/util.obj \
+ $(OBJ)$/file.obj\
+ $(OBJ)$/file_dirvol.obj\
+ $(OBJ)$/file_error.obj\
+ $(OBJ)$/file_url.obj\
+ $(OBJ)$/tempfile.obj\
+ $(OBJ)$/path_helper.obj\
+ $(OBJ)$/procimpl.obj \
+ $(OBJ)$/salinit.obj
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+
diff --git a/sal/osl/w32/conditn.c b/sal/osl/w32/conditn.c
new file mode 100644
index 000000000000..1a382af89fcf
--- /dev/null
+++ b/sal/osl/w32/conditn.c
@@ -0,0 +1,141 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/conditn.h>
+#include <osl/diagnose.h>
+#include <osl/time.h>
+
+/*
+ under WIN32, we use the void* oslCondition
+ as a WIN32 HANDLE (which is also a 32-bit value)
+*/
+
+/*****************************************************************************/
+/* osl_createCondition */
+/*****************************************************************************/
+oslCondition SAL_CALL osl_createCondition(void)
+{
+ oslCondition Condition;
+
+ Condition= (oslCondition)CreateEvent(0, /* no security */
+ sal_True, /* manual reset */
+ sal_False, /* initial state not signaled */
+ 0); /* automatic name */
+
+ return Condition;
+
+}
+
+/*****************************************************************************/
+/* osl_destroyCondition */
+/*****************************************************************************/
+void SAL_CALL osl_destroyCondition(oslCondition Condition)
+{
+ if(Condition)
+ {
+ OSL_VERIFY(CloseHandle(Condition));
+ }
+}
+
+/*****************************************************************************/
+/* osl_setCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setCondition(oslCondition Condition)
+{
+ OSL_ASSERT(Condition);
+
+ return (sal_Bool)(SetEvent((HANDLE)Condition) != FALSE);
+}
+
+/*****************************************************************************/
+/* osl_resetCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_resetCondition(oslCondition Condition)
+{
+ OSL_ASSERT(Condition);
+
+ return (sal_Bool)(ResetEvent((HANDLE)Condition) != FALSE);
+}
+
+/*****************************************************************************/
+/* osl_waitCondition */
+/*****************************************************************************/
+oslConditionResult SAL_CALL osl_waitCondition(oslCondition Condition,
+ const TimeValue* pTimeout)
+{
+ DWORD timeout;
+
+ OSL_ASSERT(Condition);
+
+ if (pTimeout)
+ timeout = pTimeout->Seconds * 1000 + pTimeout->Nanosec / 1000000L;
+ else
+ timeout = INFINITE;
+
+ /* It's necessary to process SendMessage calls to the current thread to give other threads
+ access to COM objects instatiated in this thread */
+
+ while ( 1 )
+ {
+ /* Only wake up if a SendMessage call to the threads message loop is detected */
+ switch( MsgWaitForMultipleObjects( 1, (HANDLE *)(&Condition), FALSE, timeout, QS_SENDMESSAGE ) )
+ {
+ case WAIT_OBJECT_0 + 1:
+ {
+ MSG msg;
+
+ /* We Must not dispatch the message. PM_NOREMOVE leaves the message queue untouched
+ but dispatches SendMessage calls automatically */
+
+ PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE );
+ }
+ break;
+
+ case WAIT_OBJECT_0:
+ return (osl_cond_result_ok);
+
+ case WAIT_TIMEOUT:
+ return (osl_cond_result_timeout);
+
+ default:
+ return (osl_cond_result_error);
+ }
+ }
+}
+
+/*****************************************************************************/
+/* osl_checkCondition */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_checkCondition(oslCondition Condition)
+{
+ OSL_ASSERT(Condition);
+
+ return (sal_Bool)(WaitForSingleObject((HANDLE)Condition, 0) == WAIT_OBJECT_0);
+}
+
diff --git a/sal/osl/w32/diagnose.c b/sal/osl/w32/diagnose.c
new file mode 100644
index 000000000000..b46bff44b73c
--- /dev/null
+++ b/sal/osl/w32/diagnose.c
@@ -0,0 +1,188 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#define NO_DEBUG_CRT
+
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+
+#define NO_DEBUG_CRT
+
+static pfunc_osl_printDebugMessage _pPrintDebugMessage = NULL;
+static pfunc_osl_printDetailedDebugMessage _pPrintDetailedDebugMessage = NULL;
+
+pfunc_osl_printDebugMessage SAL_CALL osl_setDebugMessageFunc( pfunc_osl_printDebugMessage pNewFunc )
+{
+ pfunc_osl_printDebugMessage pOldFunc = _pPrintDebugMessage;
+ _pPrintDebugMessage = pNewFunc;
+
+ return pOldFunc;
+}
+
+pfunc_osl_printDetailedDebugMessage SAL_CALL osl_setDetailedDebugMessageFunc( pfunc_osl_printDetailedDebugMessage pNewFunc )
+{
+ pfunc_osl_printDetailedDebugMessage pOldFunc = _pPrintDetailedDebugMessage;
+ _pPrintDetailedDebugMessage = pNewFunc;
+ return pOldFunc;
+}
+
+/*
+ Trace output
+*/
+
+void SAL_CALL osl_breakDebug(void)
+{
+ DebugBreak();
+}
+
+
+
+/* Uncomment this define to get profiling time output */
+/* #define OSL_PROFILING */
+/* comment this define to stop output thread identifier*/
+#define OSL_TRACE_THREAD 1
+void SAL_CALL osl_trace(const sal_Char* lpszFormat, ...)
+{
+ va_list args;
+ int written = 0;
+
+ va_start(args, lpszFormat);
+
+#if defined(OSL_PROFILING)
+ fprintf(stderr, "time : %06lu : ", osl_getGlobalTimer() );
+#else
+#if defined(OSL_TRACE_THREAD)
+ fprintf(stderr,"Thread: %6d :",osl_getThreadIdentifier(NULL));
+#else
+ fprintf(stderr,"Trace Message : ");
+#endif
+#endif
+
+ if ( IsDebuggerPresent() )
+ {
+ sal_Char szMessage[512];
+ written = _vsnprintf( szMessage, sizeof(szMessage) - 2, lpszFormat, args );
+ if ( written == -1 )
+ written = sizeof(szMessage) - 2;
+ szMessage[ written++ ] = '\n';
+ szMessage[ written ] = 0;
+ OutputDebugString( szMessage );
+ }
+
+ vfprintf(stderr,lpszFormat, args);
+
+ fprintf(stderr,"\n");
+
+ fflush(stderr);
+
+ va_end(args);
+}
+
+sal_Bool SAL_CALL osl_assertFailedLine(const sal_Char* pszFileName, sal_Int32 nLine, const sal_Char* pszMessage)
+{
+#ifndef NO_DEBUG_CRT
+ return (_CrtDbgReport(_CRT_ASSERT, pszFileName, nLine, NULL, pszMessage));
+#else
+ HWND hWndParent;
+ UINT nFlags;
+ int nCode;
+
+ /* get app name or NULL if unknown (don't call assert) */
+ LPCSTR lpszAppName = "Error";
+ sal_Char szMessage[512];
+
+ /* format message into buffer */
+ szMessage[sizeof(szMessage)-1] = '\0'; /* zero terminate always */
+ _snprintf(szMessage, sizeof(szMessage)-1, "%s: File %hs, Line %d\n:%s\n",
+ lpszAppName, pszFileName, nLine, pszMessage);
+
+ OutputDebugString(szMessage);
+
+ if ( _pPrintDetailedDebugMessage )
+ _pPrintDetailedDebugMessage( pszFileName, nLine, pszMessage );
+ else if ( _pPrintDebugMessage )
+ _pPrintDebugMessage( szMessage );
+ else if ( !getenv( "DISABLE_SAL_DBGBOX" ) )
+ {
+ TCHAR szBoxMessage[1024];
+
+ /* active popup window for the current thread */
+ hWndParent = GetActiveWindow();
+ if (hWndParent != NULL)
+ hWndParent = GetLastActivePopup(hWndParent);
+
+ /* set message box flags */
+ nFlags = MB_TASKMODAL | MB_ICONWARNING | MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_SETFOREGROUND;
+ if (hWndParent == NULL)
+ nFlags |= MB_SERVICE_NOTIFICATION;
+
+ /* display the assert */
+
+ szBoxMessage[sizeof(szBoxMessage)-1] = 0;
+ _snprintf(szBoxMessage, sizeof(szBoxMessage)-1, "%s\n( Yes=Abort / No=Ignore / Cancel=Debugger )",
+ szMessage);
+
+ nCode = MessageBox(hWndParent, szBoxMessage, "Assertion Failed!", nFlags);
+
+ if (nCode == IDYES)
+ FatalExit(-1);
+
+ if (nCode == IDNO)
+ return sal_False; /* ignore */
+
+ if (nCode == IDCANCEL)
+ return sal_True; /* will cause oslDebugBreak */
+ }
+#endif /* NO_DEBUG_CRT */
+ return sal_False; /* not shure, not care */
+}
+
+sal_Int32 SAL_CALL osl_reportError(sal_uInt32 nType, const sal_Char* pszMessage)
+{
+ UINT nFlags;
+ int nDisposition;
+
+ // active popup window for the current thread
+ HWND hWndParent = GetActiveWindow();
+ if (hWndParent != NULL)
+ hWndParent = GetLastActivePopup(hWndParent);
+
+ nType = nType; /* avoid warnings */
+
+ /* set message box flags */
+ nFlags = MB_TASKMODAL | MB_ICONERROR | MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_SETFOREGROUND;
+ if (hWndParent == NULL)
+ nFlags |= MB_SERVICE_NOTIFICATION;
+
+ // display the assert
+ nDisposition = MessageBox(hWndParent, pszMessage, "Exception!", nFlags);
+
+ return nDisposition;
+}
+
diff --git a/sal/osl/w32/dllentry.c b/sal/osl/w32/dllentry.c
new file mode 100644
index 000000000000..b6a21d6c2724
--- /dev/null
+++ b/sal/osl/w32/dllentry.c
@@ -0,0 +1,370 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifdef _MSC_VER
+#pragma warning(push,1) /* disable warnings within system headers */
+#endif
+#include <windows.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#include <tlhelp32.h>
+#include <systools/win32/uwinapi.h>
+#include <winsock.h>
+#include <osl/diagnose.h>
+#include <sal/types.h>
+#include <float.h>
+
+#include <osl/diagnose.h>
+#include <osl/mutex.h>
+#include <sal/types.h>
+
+//------------------------------------------------------------------------------
+// externals
+//------------------------------------------------------------------------------
+
+extern DWORD g_dwTLSTextEncodingIndex;
+extern void SAL_CALL _osl_callThreadKeyCallbackOnThreadDetach(void);
+extern CRITICAL_SECTION g_ThreadKeyListCS;
+extern oslMutex g_Mutex;
+extern oslMutex g_CurrentDirectoryMutex;
+
+extern void rtl_locale_fini (void);
+extern void rtl_memory_fini (void);
+extern void rtl_cache_fini (void);
+extern void rtl_arena_fini (void);
+
+#ifdef __MINGW32__
+
+typedef void (*func_ptr) (void);
+extern func_ptr __CTOR_LIST__[];
+extern func_ptr __DTOR_LIST__[];
+
+static void do_startup(void);
+static void do_cleanup(void);
+
+#else
+
+/*
+This is needed because DllMain is called after static constructors. A DLL's
+startup and shutdown sequence looks like this:
+
+_pRawDllMain()
+_CRT_INIT()
+DllMain()
+....
+DllMain()
+_CRT_INIT()
+_pRawDllMain()
+
+*/
+
+static BOOL WINAPI _RawDllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved );
+extern BOOL (WINAPI *_pRawDllMain)(HANDLE, DWORD, LPVOID) = _RawDllMain;
+
+#endif
+
+//------------------------------------------------------------------------------
+// globales
+//------------------------------------------------------------------------------
+
+DWORD g_dwPlatformId = VER_PLATFORM_WIN32_WINDOWS; // remember plattform
+
+//------------------------------------------------------------------------------
+// DllMain
+//------------------------------------------------------------------------------
+#ifdef _M_IX86
+int osl_isSingleCPU = 0;
+#endif
+
+#ifdef __MINGW32__
+
+void
+__do_global_dtors (void)
+{
+ static func_ptr *p = __DTOR_LIST__ + 1;
+
+ /*
+ * Call each destructor in the destructor list until a null pointer
+ * is encountered.
+ */
+ while (*p)
+ {
+ (*(p)) ();
+ p++;
+ }
+}
+
+void
+__do_global_ctors (void)
+{
+ unsigned long nptrs = (unsigned long) __CTOR_LIST__[0];
+ unsigned i;
+
+ /*
+ * If the first entry in the constructor list is -1 then the list
+ * is terminated with a null entry. Otherwise the first entry was
+ * the number of pointers in the list.
+ */
+ if (nptrs == -1)
+ {
+ for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++)
+ ;
+ }
+
+ /*
+ * Go through the list backwards calling constructors.
+ */
+ for (i = nptrs; i >= 1; i--)
+ {
+ __CTOR_LIST__[i] ();
+ }
+
+ /*
+ * Register the destructors for processing on exit.
+ */
+ atexit (__do_global_dtors);
+}
+
+static int initialized = 0;
+
+void
+__main (void)
+{
+ if (!initialized)
+ {
+ initialized = 1;
+ do_startup();
+ __do_global_ctors ();
+ }
+}
+
+static void do_startup( void )
+{
+#else
+static BOOL WINAPI _RawDllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
+{
+ (void)hinstDLL; /* avoid warnings */
+ (void)lpvReserved; /* avoid warnings */
+
+ switch (fdwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ {
+#endif
+ OSVERSIONINFO aInfo;
+
+#ifdef _M_IX86
+ SYSTEM_INFO SystemInfo;
+
+ GetSystemInfo(&SystemInfo);
+
+ /* Determine if we are on a multiprocessor/multicore/HT x86/x64 system
+ *
+ * The lock prefix for atomic operations in osl_[inc|de]crementInterlockedCount()
+ * comes with a cost and is especially expensive on pre HT x86 single processor
+ * systems, where it isn't needed at all.
+ */
+ if ( SystemInfo.dwNumberOfProcessors == 1 ) {
+ osl_isSingleCPU = 1;
+ }
+#endif
+ /* Suppress file error messages from system like "Floppy A: not inserted" */
+ SetErrorMode( SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS );
+
+ /* initialize global mutex */
+ g_Mutex = osl_createMutex();
+
+ /* initialize "current directory" mutex */
+ g_CurrentDirectoryMutex = osl_createMutex();
+
+
+ /* initialize Win9x unicode functions */
+ aInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
+
+ if ( GetVersionEx(&aInfo) )
+ g_dwPlatformId = aInfo.dwPlatformId;
+
+ g_dwTLSTextEncodingIndex = TlsAlloc();
+ InitializeCriticalSection( &g_ThreadKeyListCS );
+
+ //We disable floating point exceptions. This is the usual state at program startup
+ //but on Windows 98 and ME this is not always the case.
+ _control87(_MCW_EM, _MCW_EM);
+#ifdef __MINGW32__
+ atexit(do_cleanup);
+}
+
+void do_cleanup( void )
+{
+#else
+ break;
+ }
+
+ case DLL_PROCESS_DETACH:
+#endif
+
+ WSACleanup( );
+
+ TlsFree( g_dwTLSTextEncodingIndex );
+ DeleteCriticalSection( &g_ThreadKeyListCS );
+
+ osl_destroyMutex( g_Mutex );
+
+ osl_destroyMutex( g_CurrentDirectoryMutex );
+
+#ifndef __MINGW32__
+
+ /*
+
+ On a product build memory management finalization might
+ cause a crash without assertion (assertions off) if heap is
+ corrupted. But a crash report won't help here because at
+ this point all other threads have been terminated and only
+ ntdll is on the stack. No chance to find the reason for the
+ corrupted heap if so.
+
+ So annoying the user with a crash report is completly useless.
+
+ */
+
+#ifndef DBG_UTIL
+ __try
+#endif
+ {
+ /* cleanup locale hashtable */
+ rtl_locale_fini();
+
+ /* finalize memory management */
+ rtl_memory_fini();
+ rtl_cache_fini();
+ rtl_arena_fini();
+ }
+#ifndef DBG_UTIL
+ __except( EXCEPTION_EXECUTE_HANDLER )
+ {
+ }
+#endif
+ break;
+ }
+
+ return TRUE;
+#endif
+}
+
+static DWORD GetParentProcessId()
+{
+ DWORD dwParentProcessId = 0;
+ HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
+
+ if ( IsValidHandle( hSnapshot ) )
+ {
+ PROCESSENTRY32 pe;
+ BOOL fSuccess;
+
+ ZeroMemory( &pe, sizeof(pe) );
+ pe.dwSize = sizeof(pe);
+ fSuccess = Process32First( hSnapshot, &pe );
+
+ while( fSuccess )
+ {
+ if ( GetCurrentProcessId() == pe.th32ProcessID )
+ {
+ dwParentProcessId = pe.th32ParentProcessID;
+ break;
+ }
+
+ fSuccess = Process32Next( hSnapshot, &pe );
+ }
+
+ CloseHandle( hSnapshot );
+ }
+
+ return dwParentProcessId;
+}
+
+static DWORD WINAPI ParentMonitorThreadProc( LPVOID lpParam )
+{
+ DWORD dwParentProcessId = (DWORD)lpParam;
+
+ HANDLE hParentProcess = OpenProcess( SYNCHRONIZE, FALSE, dwParentProcessId );
+ if ( IsValidHandle( hParentProcess ) )
+ {
+ if ( WAIT_OBJECT_0 == WaitForSingleObject( hParentProcess, INFINITE ) )
+ {
+ TerminateProcess( GetCurrentProcess(), 0 );
+ }
+ CloseHandle( hParentProcess );
+ }
+ return 0;
+}
+
+BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
+{
+ (void)hinstDLL; /* avoid warning */
+ (void)lpvReserved; /* avoid warning */
+ switch (fdwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ {
+ TCHAR szBuffer[64];
+
+ // This code will attach the process to it's parent process
+ // if the parent process had set the environment variable.
+ // The corresponding code (setting the environment variable)
+ // is is desktop/win32/source/officeloader.cxx
+
+
+ DWORD dwResult = GetEnvironmentVariable( "ATTACHED_PARENT_PROCESSID", szBuffer, sizeof(szBuffer) );
+
+ if ( dwResult && dwResult < sizeof(szBuffer) )
+ {
+ DWORD dwThreadId = 0;
+
+ DWORD dwParentProcessId = (DWORD)atol( szBuffer );
+
+ if ( dwParentProcessId && GetParentProcessId() == dwParentProcessId )
+ {
+ // No error check, it works or it does not
+ // Thread should only be started for headless mode, see desktop/win32/source/officeloader.cxx
+ CreateThread( NULL, 0, ParentMonitorThreadProc, (LPVOID)dwParentProcessId, 0, &dwThreadId ); //
+ }
+ }
+
+ return TRUE;
+ }
+
+ case DLL_THREAD_ATTACH:
+ break;
+
+ case DLL_THREAD_DETACH:
+ _osl_callThreadKeyCallbackOnThreadDetach( );
+ break;
+ }
+
+ return TRUE;
+}
diff --git a/sal/osl/w32/file.cxx b/sal/osl/w32/file.cxx
new file mode 100644
index 000000000000..7728189387cd
--- /dev/null
+++ b/sal/osl/w32/file.cxx
@@ -0,0 +1,1194 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#define UNICODE
+#define _UNICODE
+#define _WIN32_WINNT 0x0500
+#include "systools/win32/uwinapi.h"
+
+#include "osl/file.hxx"
+
+#include "file_url.h"
+#include "file_error.h"
+
+#include "osl/diagnose.h"
+#include "rtl/alloc.h"
+#include "rtl/byteseq.h"
+#include "rtl/ustring.hxx"
+
+#include <stdio.h>
+#include <tchar.h>
+
+#ifdef __MINGW32__
+#include <wchar.h>
+#include <ctype.h>
+#endif
+
+#include <algorithm>
+#include <limits>
+
+#ifdef max /* conflict w/ std::numeric_limits<T>::max() */
+#undef max
+#endif
+#ifdef min
+#undef min
+#endif
+
+//##################################################################
+// File handle implementation
+//##################################################################
+struct FileHandle_Impl
+{
+ CRITICAL_SECTION m_mutex;
+ HANDLE m_hFile;
+
+ /** State
+ */
+ enum StateBits
+ {
+ STATE_SEEKABLE = 1, /* open() sets, iff regular file */
+ STATE_READABLE = 2, /* open() sets, read() requires */
+ STATE_WRITEABLE = 4, /* open() sets, write() requires */
+ STATE_MODIFIED = 8 /* write() sets, flush() resets */
+ };
+ int m_state;
+
+ sal_uInt64 m_size; /* file size */
+ LONGLONG m_offset; /* physical offset from begin of file */
+ LONGLONG m_filepos; /* logical offset from begin of file */
+
+ LONGLONG m_bufptr; /* buffer offset from begin of file */
+ SIZE_T m_buflen; /* buffer filled [0, m_bufsiz - 1] */
+
+ SIZE_T m_bufsiz;
+ sal_uInt8 * m_buffer;
+
+ explicit FileHandle_Impl (HANDLE hFile);
+ ~FileHandle_Impl();
+
+ static void* operator new(size_t n);
+ static void operator delete(void * p, size_t);
+ static SIZE_T getpagesize();
+
+ sal_uInt64 getPos() const;
+ oslFileError setPos (sal_uInt64 uPos);
+
+ sal_uInt64 getSize() const;
+ oslFileError setSize (sal_uInt64 uPos);
+
+ oslFileError readAt (
+ LONGLONG nOffset,
+ void * pBuffer,
+ DWORD nBytesRequested,
+ sal_uInt64 * pBytesRead);
+
+ oslFileError writeAt (
+ LONGLONG nOffset,
+ void const * pBuffer,
+ DWORD nBytesToWrite,
+ sal_uInt64 * pBytesWritten);
+
+ oslFileError readFileAt (
+ LONGLONG nOffset,
+ void * pBuffer,
+ sal_uInt64 uBytesRequested,
+ sal_uInt64 * pBytesRead);
+
+ oslFileError writeFileAt (
+ LONGLONG nOffset,
+ void const * pBuffer,
+ sal_uInt64 uBytesToWrite,
+ sal_uInt64 * pBytesWritten);
+
+ oslFileError readLineAt (
+ LONGLONG nOffset,
+ sal_Sequence ** ppSequence,
+ sal_uInt64 * pBytesRead);
+
+ oslFileError writeSequence_Impl (
+ sal_Sequence ** ppSequence,
+ SIZE_T * pnOffset,
+ const void * pBuffer,
+ SIZE_T nBytes);
+
+ oslFileError syncFile();
+
+ /** Buffer cache / allocator.
+ */
+ class Allocator
+ {
+ rtl_cache_type * m_cache;
+ SIZE_T m_bufsiz;
+
+ Allocator (Allocator const &);
+ Allocator & operator= (Allocator const &);
+
+ public:
+ static Allocator & get();
+
+ void allocate (sal_uInt8 ** ppBuffer, SIZE_T * pnSize);
+ void deallocate (sal_uInt8 * pBuffer);
+
+ protected:
+ Allocator();
+ ~Allocator();
+ };
+
+ /** Guard.
+ */
+ class Guard
+ {
+ LPCRITICAL_SECTION m_mutex;
+
+ public:
+ explicit Guard(LPCRITICAL_SECTION pMutex);
+ ~Guard();
+ };
+};
+
+FileHandle_Impl::Allocator &
+FileHandle_Impl::Allocator::get()
+{
+ static Allocator g_aBufferAllocator;
+ return g_aBufferAllocator;
+}
+
+FileHandle_Impl::Allocator::Allocator()
+ : m_cache (0),
+ m_bufsiz (0)
+{
+ SIZE_T const pagesize = FileHandle_Impl::getpagesize();
+ m_cache = rtl_cache_create (
+ "osl_file_buffer_cache", pagesize, 0, 0, 0, 0, 0, 0, 0);
+ if (0 != m_cache)
+ m_bufsiz = pagesize;
+}
+
+FileHandle_Impl::Allocator::~Allocator()
+{
+ rtl_cache_destroy(m_cache), m_cache = 0;
+}
+
+void FileHandle_Impl::Allocator::allocate (sal_uInt8 ** ppBuffer, SIZE_T * pnSize)
+{
+ OSL_PRECOND((0 != ppBuffer) && (0 != pnSize), "FileHandle_Impl::Allocator::allocate(): contract violation");
+ *ppBuffer = static_cast< sal_uInt8* >(rtl_cache_alloc(m_cache)), *pnSize = m_bufsiz;
+}
+
+void FileHandle_Impl::Allocator::deallocate (sal_uInt8 * pBuffer)
+{
+ if (0 != pBuffer)
+ rtl_cache_free (m_cache, pBuffer);
+}
+
+FileHandle_Impl::Guard::Guard(LPCRITICAL_SECTION pMutex)
+ : m_mutex (pMutex)
+{
+ OSL_PRECOND (m_mutex != 0, "FileHandle_Impl::Guard::Guard(): null pointer.");
+ ::EnterCriticalSection (m_mutex);
+}
+FileHandle_Impl::Guard::~Guard()
+{
+ OSL_PRECOND (m_mutex != 0, "FileHandle_Impl::Guard::~Guard(): null pointer.");
+ ::LeaveCriticalSection (m_mutex);
+}
+
+FileHandle_Impl::FileHandle_Impl(HANDLE hFile)
+ : m_hFile (hFile),
+ m_state (STATE_READABLE | STATE_WRITEABLE),
+ m_size (0),
+ m_offset (0),
+ m_filepos (0),
+ m_bufptr (-1),
+ m_buflen (0),
+ m_bufsiz (0),
+ m_buffer (0)
+{
+ ::InitializeCriticalSection (&m_mutex);
+ Allocator::get().allocate (&m_buffer, &m_bufsiz);
+ if (m_buffer != 0)
+ memset (m_buffer, 0, m_bufsiz);
+}
+
+FileHandle_Impl::~FileHandle_Impl()
+{
+ Allocator::get().deallocate (m_buffer), m_buffer = 0;
+ ::DeleteCriticalSection (&m_mutex);
+}
+
+void * FileHandle_Impl::operator new(size_t n)
+{
+ return rtl_allocateMemory(n);
+}
+
+void FileHandle_Impl::operator delete(void * p, size_t)
+{
+ rtl_freeMemory(p);
+}
+
+SIZE_T FileHandle_Impl::getpagesize()
+{
+ SYSTEM_INFO info;
+ ::GetSystemInfo (&info);
+ return sal::static_int_cast< SIZE_T >(info.dwPageSize);
+}
+
+sal_uInt64 FileHandle_Impl::getPos() const
+{
+ return sal::static_int_cast< sal_uInt64 >(m_filepos);
+}
+
+oslFileError FileHandle_Impl::setPos (sal_uInt64 uPos)
+{
+ m_filepos = sal::static_int_cast< LONGLONG >(uPos);
+ return osl_File_E_None;
+}
+
+sal_uInt64 FileHandle_Impl::getSize() const
+{
+ LONGLONG bufend = std::max((LONGLONG)(0), m_bufptr) + m_buflen;
+ return std::max(m_size, sal::static_int_cast< sal_uInt64 >(bufend));
+}
+
+oslFileError FileHandle_Impl::setSize (sal_uInt64 uSize)
+{
+ LARGE_INTEGER nDstPos; nDstPos.QuadPart = sal::static_int_cast< LONGLONG >(uSize);
+ if (!::SetFilePointerEx(m_hFile, nDstPos, 0, FILE_BEGIN))
+ return oslTranslateFileError( GetLastError() );
+
+ if (!::SetEndOfFile(m_hFile))
+ return oslTranslateFileError( GetLastError() );
+ m_size = uSize;
+
+ nDstPos.QuadPart = m_offset;
+ if (!::SetFilePointerEx(m_hFile, nDstPos, 0, FILE_BEGIN))
+ return oslTranslateFileError( GetLastError() );
+
+ return osl_File_E_None;
+}
+
+oslFileError FileHandle_Impl::readAt (
+ LONGLONG nOffset,
+ void * pBuffer,
+ DWORD nBytesRequested,
+ sal_uInt64 * pBytesRead)
+{
+ OSL_PRECOND(m_state & STATE_SEEKABLE, "FileHandle_Impl::readAt(): not seekable");
+ if (!(m_state & STATE_SEEKABLE))
+ return osl_File_E_SPIPE;
+
+ OSL_PRECOND(m_state & STATE_READABLE, "FileHandle_Impl::readAt(): not readable");
+ if (!(m_state & STATE_READABLE))
+ return osl_File_E_BADF;
+
+ if (nOffset != m_offset)
+ {
+ LARGE_INTEGER liOffset; liOffset.QuadPart = nOffset;
+ if (!::SetFilePointerEx(m_hFile, liOffset, 0, FILE_BEGIN))
+ return oslTranslateFileError( GetLastError() );
+ m_offset = nOffset;
+ }
+
+ DWORD dwDone = 0;
+ if (!::ReadFile(m_hFile, pBuffer, nBytesRequested, &dwDone, 0))
+ return oslTranslateFileError( GetLastError() );
+ m_offset += dwDone;
+
+ *pBytesRead = dwDone;
+ return osl_File_E_None;
+}
+
+oslFileError FileHandle_Impl::writeAt (
+ LONGLONG nOffset,
+ void const * pBuffer,
+ DWORD nBytesToWrite,
+ sal_uInt64 * pBytesWritten)
+{
+ OSL_PRECOND(m_state & STATE_SEEKABLE, "FileHandle_Impl::writeAt(): not seekable");
+ if (!(m_state & STATE_SEEKABLE))
+ return osl_File_E_SPIPE;
+
+ OSL_PRECOND(m_state & STATE_WRITEABLE, "FileHandle_Impl::writeAt(): not writeable");
+ if (!(m_state & STATE_WRITEABLE))
+ return osl_File_E_BADF;
+
+ if (nOffset != m_offset)
+ {
+ LARGE_INTEGER liOffset; liOffset.QuadPart = nOffset;
+ if (!::SetFilePointerEx (m_hFile, liOffset, 0, FILE_BEGIN))
+ return oslTranslateFileError( GetLastError() );
+ m_offset = nOffset;
+ }
+
+ DWORD dwDone = 0;
+ if (!::WriteFile(m_hFile, pBuffer, nBytesToWrite, &dwDone, 0))
+ return oslTranslateFileError( GetLastError() );
+ m_offset += dwDone;
+
+ m_size = std::max(m_size, sal::static_int_cast< sal_uInt64 >(m_offset));
+
+ *pBytesWritten = dwDone;
+ return osl_File_E_None;
+}
+
+oslFileError FileHandle_Impl::readFileAt (
+ LONGLONG nOffset,
+ void * pBuffer,
+ sal_uInt64 uBytesRequested,
+ sal_uInt64 * pBytesRead)
+{
+ static sal_uInt64 const g_limit_dword = std::numeric_limits< DWORD >::max();
+ if (g_limit_dword < uBytesRequested)
+ return osl_File_E_OVERFLOW;
+ DWORD nBytesRequested = sal::static_int_cast< DWORD >(uBytesRequested);
+
+ if (0 == (m_state & STATE_SEEKABLE))
+ {
+ // not seekable (pipe)
+ DWORD dwDone = 0;
+ if (!::ReadFile(m_hFile, pBuffer, nBytesRequested, &dwDone, 0))
+ return oslTranslateFileError( GetLastError() );
+ *pBytesRead = dwDone;
+ return osl_File_E_None;
+ }
+ else if (0 == m_buffer)
+ {
+ // not buffered
+ return readAt (nOffset, pBuffer, nBytesRequested, pBytesRead);
+ }
+ else
+ {
+ sal_uInt8 * buffer = static_cast< sal_uInt8* >(pBuffer);
+ for (*pBytesRead = 0; nBytesRequested > 0; )
+ {
+ LONGLONG const bufptr = (nOffset / m_bufsiz) * m_bufsiz;
+ SIZE_T const bufpos = (nOffset % m_bufsiz);
+
+ if (bufptr != m_bufptr)
+ {
+ // flush current buffer
+ oslFileError result = syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = -1, m_buflen = 0;
+
+ if (nBytesRequested >= m_bufsiz)
+ {
+ // buffer too small, read through from file
+ sal_uInt64 uDone = 0;
+ result = readAt (nOffset, &(buffer[*pBytesRead]), nBytesRequested, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+
+ nBytesRequested -= sal::static_int_cast< DWORD >(uDone), *pBytesRead += uDone;
+ return osl_File_E_None;
+ }
+
+ // update buffer (pointer)
+ sal_uInt64 uDone = 0;
+ result = readAt (bufptr, m_buffer, m_bufsiz, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = bufptr, m_buflen = sal::static_int_cast< SIZE_T >(uDone);
+ }
+ if (bufpos >= m_buflen)
+ {
+ // end of file
+ return osl_File_E_None;
+ }
+
+ SIZE_T const bytes = std::min(m_buflen - bufpos, nBytesRequested);
+ memcpy (&(buffer[*pBytesRead]), &(m_buffer[bufpos]), bytes);
+ nBytesRequested -= bytes, *pBytesRead += bytes, nOffset += bytes;
+ }
+ return osl_File_E_None;
+ }
+}
+
+oslFileError FileHandle_Impl::writeFileAt (
+ LONGLONG nOffset,
+ void const * pBuffer,
+ sal_uInt64 uBytesToWrite,
+ sal_uInt64 * pBytesWritten)
+{
+ static sal_uInt64 const g_limit_dword = std::numeric_limits< DWORD >::max();
+ if (g_limit_dword < uBytesToWrite)
+ return osl_File_E_OVERFLOW;
+ DWORD nBytesToWrite = sal::static_int_cast< DWORD >(uBytesToWrite);
+
+ if (0 == (m_state & STATE_SEEKABLE))
+ {
+ // not seekable (pipe)
+ DWORD dwDone = 0;
+ if (!::WriteFile(m_hFile, pBuffer, nBytesToWrite, &dwDone, 0))
+ return oslTranslateFileError( GetLastError() );
+ *pBytesWritten = dwDone;
+ return osl_File_E_None;
+ }
+ else if (0 == m_buffer)
+ {
+ // not buffered
+ return writeAt(nOffset, pBuffer, nBytesToWrite, pBytesWritten);
+ }
+ else
+ {
+ sal_uInt8 const * buffer = static_cast< sal_uInt8 const* >(pBuffer);
+ for (*pBytesWritten = 0; nBytesToWrite > 0; )
+ {
+ LONGLONG const bufptr = (nOffset / m_bufsiz) * m_bufsiz;
+ SIZE_T const bufpos = (nOffset % m_bufsiz);
+ if (bufptr != m_bufptr)
+ {
+ // flush current buffer
+ oslFileError result = syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = -1, m_buflen = 0;
+
+ if (nBytesToWrite >= m_bufsiz)
+ {
+ // buffer too small, write through to file
+ sal_uInt64 uDone = 0;
+ result = writeAt (nOffset, &(buffer[*pBytesWritten]), nBytesToWrite, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ if (uDone != nBytesToWrite)
+ return osl_File_E_IO;
+
+ nBytesToWrite -= sal::static_int_cast< DWORD >(uDone), *pBytesWritten += uDone;
+ return osl_File_E_None;
+ }
+
+ // update buffer (pointer)
+ sal_uInt64 uDone = 0;
+ result = readAt (bufptr, m_buffer, m_bufsiz, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = bufptr, m_buflen = sal::static_int_cast< SIZE_T >(uDone);
+ }
+
+ SIZE_T const bytes = std::min(m_bufsiz - bufpos, nBytesToWrite);
+ memcpy (&(m_buffer[bufpos]), &(buffer[*pBytesWritten]), bytes);
+ nBytesToWrite -= bytes, *pBytesWritten += bytes, nOffset += bytes;
+
+ m_buflen = std::max(m_buflen, bufpos + bytes);
+ m_state |= STATE_MODIFIED;
+ }
+ return osl_File_E_None;
+ }
+}
+
+oslFileError FileHandle_Impl::readLineAt (
+ LONGLONG nOffset,
+ sal_Sequence ** ppSequence,
+ sal_uInt64 * pBytesRead)
+{
+ oslFileError result = osl_File_E_None;
+
+ LONGLONG bufptr = (nOffset / m_bufsiz) * m_bufsiz;
+ if (bufptr != m_bufptr)
+ {
+ /* flush current buffer */
+ result = syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+
+ /* update buffer (pointer) */
+ sal_uInt64 uDone = 0;
+ result = readAt (bufptr, m_buffer, m_bufsiz, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+
+ m_bufptr = bufptr, m_buflen = sal::static_int_cast< SIZE_T >(uDone);
+ }
+
+ static int const LINE_STATE_BEGIN = 0;
+ static int const LINE_STATE_CR = 1;
+ static int const LINE_STATE_LF = 2;
+
+ SIZE_T bufpos = sal::static_int_cast< SIZE_T >(nOffset - m_bufptr), curpos = bufpos, dstpos = 0;
+ int state = (bufpos >= m_buflen) ? LINE_STATE_LF : LINE_STATE_BEGIN;
+
+ for ( ; state != LINE_STATE_LF; )
+ {
+ if (curpos >= m_buflen)
+ {
+ /* buffer examined */
+ if (0 < (curpos - bufpos))
+ {
+ /* flush buffer to sequence */
+ result = writeSequence_Impl (
+ ppSequence, &dstpos, &(m_buffer[bufpos]), curpos - bufpos);
+ if (result != osl_File_E_None)
+ return (result);
+ *pBytesRead += curpos - bufpos, nOffset += curpos - bufpos;
+ }
+
+ bufptr = nOffset / m_bufsiz * m_bufsiz;
+ if (bufptr != m_bufptr)
+ {
+ /* update buffer (pointer) */
+ sal_uInt64 uDone = 0;
+ result = readAt (bufptr, m_buffer, m_bufsiz, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ m_bufptr = bufptr, m_buflen = sal::static_int_cast< SIZE_T >(uDone);
+ }
+
+ bufpos = sal::static_int_cast< SIZE_T >(nOffset - m_bufptr), curpos = bufpos;
+ if (bufpos >= m_buflen)
+ break;
+ }
+ switch (state)
+ {
+ case LINE_STATE_CR:
+ state = LINE_STATE_LF;
+ switch (m_buffer[curpos])
+ {
+ case 0x0A: /* CRLF */
+ /* eat current char */
+ curpos++;
+ break;
+ default: /* single CR */
+ /* keep current char */
+ break;
+ }
+ break;
+ default:
+ /* determine next state */
+ switch (m_buffer[curpos])
+ {
+ case 0x0A: /* single LF */
+ state = LINE_STATE_LF;
+ break;
+ case 0x0D: /* CR */
+ state = LINE_STATE_CR;
+ break;
+ default: /* advance to next char */
+ curpos++;
+ break;
+ }
+ if (state != LINE_STATE_BEGIN)
+ {
+ /* store (and eat) the newline char */
+ m_buffer[curpos] = 0x0A, curpos++;
+
+ /* flush buffer to sequence */
+ result = writeSequence_Impl (
+ ppSequence, &dstpos, &(m_buffer[bufpos]), curpos - bufpos - 1);
+ if (result != osl_File_E_None)
+ return (result);
+ *pBytesRead += curpos - bufpos, nOffset += curpos - bufpos;
+ }
+ break;
+ }
+ }
+
+ result = writeSequence_Impl (ppSequence, &dstpos, 0, 0);
+ if (result != osl_File_E_None)
+ return (result);
+ if (0 < dstpos)
+ return osl_File_E_None;
+ if (bufpos >= m_buflen)
+ return osl_File_E_AGAIN;
+ return osl_File_E_None;
+}
+
+oslFileError FileHandle_Impl::writeSequence_Impl (
+ sal_Sequence ** ppSequence,
+ SIZE_T * pnOffset,
+ const void * pBuffer,
+ SIZE_T nBytes)
+{
+ sal_Int32 nElements = *pnOffset + nBytes;
+ if (!*ppSequence)
+ {
+ /* construct sequence */
+ rtl_byte_sequence_constructNoDefault(ppSequence, nElements);
+ }
+ else if (nElements != (*ppSequence)->nElements)
+ {
+ /* resize sequence */
+ rtl_byte_sequence_realloc(ppSequence, nElements);
+ }
+ if (*ppSequence != 0)
+ {
+ /* fill sequence */
+ memcpy(&((*ppSequence)->elements[*pnOffset]), pBuffer, nBytes), *pnOffset += nBytes;
+ }
+ return (*ppSequence != 0) ? osl_File_E_None : osl_File_E_NOMEM;
+}
+
+oslFileError FileHandle_Impl::syncFile()
+{
+ oslFileError result = osl_File_E_None;
+ if (m_state & STATE_MODIFIED)
+ {
+ sal_uInt64 uDone = 0;
+ result = writeAt (m_bufptr, m_buffer, m_buflen, &uDone);
+ if (result != osl_File_E_None)
+ return (result);
+ if (uDone != m_buflen)
+ return osl_File_E_IO;
+ m_state &= ~STATE_MODIFIED;
+ }
+ return (result);
+}
+
+//##################################################################
+// File I/O functions
+//##################################################################
+
+extern "C" oslFileHandle
+SAL_CALL osl_createFileHandleFromOSHandle (
+ HANDLE hFile,
+ sal_uInt32 uFlags)
+{
+ if ( !IsValidHandle(hFile) )
+ return 0; // EINVAL
+
+ FileHandle_Impl * pImpl = new FileHandle_Impl(hFile);
+ if (pImpl == 0)
+ {
+ // cleanup and fail
+ (void) ::CloseHandle(hFile);
+ return 0; // ENOMEM
+ }
+
+ /* check for regular file */
+ if (FILE_TYPE_DISK == GetFileType(hFile))
+ {
+ /* mark seekable */
+ pImpl->m_state |= FileHandle_Impl::STATE_SEEKABLE;
+
+ /* init current size */
+ LARGE_INTEGER uSize = { 0, 0 };
+ (void) ::GetFileSizeEx(hFile, &uSize);
+ pImpl->m_size = (sal::static_int_cast<sal_uInt64>(uSize.HighPart) << 32) + uSize.LowPart;
+ }
+
+ if (!(uFlags & osl_File_OpenFlag_Read))
+ pImpl->m_state &= ~FileHandle_Impl::STATE_READABLE;
+ if (!(uFlags & osl_File_OpenFlag_Write))
+ pImpl->m_state &= ~FileHandle_Impl::STATE_WRITEABLE;
+
+ OSL_POSTCOND(
+ (uFlags & osl_File_OpenFlag_Read) || (uFlags & osl_File_OpenFlag_Write),
+ "osl_createFileHandleFromOSHandle(): missing read/write access flags");
+ return (oslFileHandle)(pImpl);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_openFile(
+ rtl_uString * strPath,
+ oslFileHandle * pHandle,
+ sal_uInt32 uFlags )
+{
+ rtl_uString * strSysPath = 0;
+ oslFileError result = _osl_getSystemPathFromFileURL( strPath, &strSysPath, sal_False );
+ if (result != osl_File_E_None)
+ return (result);
+
+ DWORD dwAccess = GENERIC_READ, dwShare = FILE_SHARE_READ, dwCreation = 0, dwAttributes = 0;
+
+ if ( uFlags & osl_File_OpenFlag_Write )
+ dwAccess |= GENERIC_WRITE;
+ else
+ dwShare |= FILE_SHARE_WRITE;
+
+ if ( uFlags & osl_File_OpenFlag_NoLock )
+ dwShare |= FILE_SHARE_WRITE;
+
+ if ( uFlags & osl_File_OpenFlag_Create )
+ dwCreation |= CREATE_NEW;
+ else
+ dwCreation |= OPEN_EXISTING;
+
+ HANDLE hFile = CreateFileW(
+ reinterpret_cast<LPCWSTR>(rtl_uString_getStr( strSysPath )),
+ dwAccess, dwShare, NULL, dwCreation, dwAttributes, NULL );
+
+ // @@@ ERROR HANDLING @@@
+ if ( !IsValidHandle( hFile ) )
+ result = oslTranslateFileError( GetLastError() );
+
+ *pHandle = osl_createFileHandleFromOSHandle (hFile, uFlags | osl_File_OpenFlag_Read);
+
+ rtl_uString_release( strSysPath );
+ return (result);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_syncFile(oslFileHandle Handle)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile))
+ return osl_File_E_INVAL;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+
+ oslFileError result = pImpl->syncFile();
+ if (result != osl_File_E_None)
+ return result;
+
+ if (!FlushFileBuffers(pImpl->m_hFile))
+ return oslTranslateFileError(GetLastError());
+
+ return osl_File_E_None;
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_closeFile(oslFileHandle Handle)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile))
+ return osl_File_E_INVAL;
+
+ ::EnterCriticalSection (&(pImpl->m_mutex));
+
+ oslFileError result = pImpl->syncFile();
+ if (result != osl_File_E_None)
+ {
+ /* ignore double failure */
+ (void)::CloseHandle(pImpl->m_hFile);
+ }
+ else if (!::CloseHandle(pImpl->m_hFile))
+ {
+ /* translate error code */
+ result = oslTranslateFileError( GetLastError() );
+ }
+
+ ::LeaveCriticalSection (&(pImpl->m_mutex));
+ delete pImpl;
+ return (result);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_mapFile(
+ oslFileHandle Handle,
+ void** ppAddr,
+ sal_uInt64 uLength,
+ sal_uInt64 uOffset,
+ sal_uInt32 uFlags)
+{
+ struct FileMapping
+ {
+ HANDLE m_handle;
+
+ explicit FileMapping (HANDLE hMap)
+ : m_handle (hMap)
+ {}
+
+ ~FileMapping()
+ {
+ (void)::CloseHandle(m_handle);
+ }
+ };
+
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == ppAddr))
+ return osl_File_E_INVAL;
+ *ppAddr = 0;
+
+ static SIZE_T const nLimit = std::numeric_limits< SIZE_T >::max();
+ if (uLength > nLimit)
+ return osl_File_E_OVERFLOW;
+ SIZE_T const nLength = sal::static_int_cast< SIZE_T >(uLength);
+
+ OSVERSIONINFO osinfo;
+ osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ (void)::GetVersionEx(&osinfo);
+
+ if (VER_PLATFORM_WIN32_NT != osinfo.dwPlatformId)
+ return osl_File_E_NOSYS; // Unsupported
+
+ FileMapping aMap( ::CreateFileMapping (pImpl->m_hFile, NULL, SEC_COMMIT | PAGE_READONLY, 0, 0, NULL) );
+ if (!IsValidHandle(aMap.m_handle))
+ return oslTranslateFileError( GetLastError() );
+
+ DWORD const dwOffsetHi = sal::static_int_cast<DWORD>(uOffset >> 32);
+ DWORD const dwOffsetLo = sal::static_int_cast<DWORD>(uOffset & 0xFFFFFFFF);
+
+ *ppAddr = ::MapViewOfFile( aMap.m_handle, FILE_MAP_READ, dwOffsetHi, dwOffsetLo, nLength );
+ if (0 == *ppAddr)
+ return oslTranslateFileError( GetLastError() );
+
+ if (uFlags & osl_File_MapFlag_RandomAccess)
+ {
+ // Determine memory pagesize.
+ SYSTEM_INFO info;
+ ::GetSystemInfo( &info );
+ DWORD const dwPageSize = info.dwPageSize;
+
+ /*
+ * Pagein, touching first byte of each memory page.
+ * Note: volatile disables optimizing the loop away.
+ */
+ BYTE * pData (reinterpret_cast<BYTE*>(*ppAddr));
+ SIZE_T nSize (nLength);
+
+ volatile BYTE c = 0;
+ while (nSize > dwPageSize)
+ {
+ c ^= pData[0];
+ pData += dwPageSize;
+ nSize -= dwPageSize;
+ }
+ if (nSize > 0)
+ {
+ c ^= pData[0];
+ pData += nSize;
+ nSize -= nSize;
+ }
+ }
+ return osl_File_E_None;
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_unmapFile(void* pAddr, sal_uInt64 /* uLength */)
+{
+ if (0 == pAddr)
+ return osl_File_E_INVAL;
+
+ if (!::UnmapViewOfFile (pAddr))
+ return oslTranslateFileError( GetLastError() );
+
+ return osl_File_E_None;
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_readLine(
+ oslFileHandle Handle,
+ sal_Sequence ** ppSequence)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == ppSequence))
+ return osl_File_E_INVAL;
+ sal_uInt64 uBytesRead = 0;
+
+ // read at current filepos; filepos += uBytesRead;
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ oslFileError result = pImpl->readLineAt (
+ pImpl->m_filepos, ppSequence, &uBytesRead);
+ if (result == osl_File_E_None)
+ pImpl->m_filepos += uBytesRead;
+ return (result);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_readFile(
+ oslFileHandle Handle,
+ void * pBuffer,
+ sal_uInt64 uBytesRequested,
+ sal_uInt64 * pBytesRead)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == pBuffer) || (0 == pBytesRead))
+ return osl_File_E_INVAL;
+
+ // read at current filepos; filepos += *pBytesRead;
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ oslFileError result = pImpl->readFileAt (
+ pImpl->m_filepos, pBuffer, uBytesRequested, pBytesRead);
+ if (result == osl_File_E_None)
+ pImpl->m_filepos += *pBytesRead;
+ return (result);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_writeFile(
+ oslFileHandle Handle,
+ const void * pBuffer,
+ sal_uInt64 uBytesToWrite,
+ sal_uInt64 * pBytesWritten )
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == pBuffer) || (0 == pBytesWritten))
+ return osl_File_E_INVAL;
+
+ // write at current filepos; filepos += *pBytesWritten;
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ oslFileError result = pImpl->writeFileAt (
+ pImpl->m_filepos, pBuffer, uBytesToWrite, pBytesWritten);
+ if (result == osl_File_E_None)
+ pImpl->m_filepos += *pBytesWritten;
+ return (result);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_readFileAt(
+ oslFileHandle Handle,
+ sal_uInt64 uOffset,
+ void* pBuffer,
+ sal_uInt64 uBytesRequested,
+ sal_uInt64* pBytesRead)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == pBuffer) || (0 == pBytesRead))
+ return osl_File_E_INVAL;
+ if (0 == (pImpl->m_state & FileHandle_Impl::STATE_SEEKABLE))
+ return osl_File_E_SPIPE;
+
+ static sal_uInt64 const g_limit_longlong = std::numeric_limits< LONGLONG >::max();
+ if (g_limit_longlong < uOffset)
+ return osl_File_E_OVERFLOW;
+ LONGLONG const nOffset = sal::static_int_cast< LONGLONG >(uOffset);
+
+ // read at specified fileptr
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ return pImpl->readFileAt (nOffset, pBuffer, uBytesRequested, pBytesRead);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_writeFileAt(
+ oslFileHandle Handle,
+ sal_uInt64 uOffset,
+ const void* pBuffer,
+ sal_uInt64 uBytesToWrite,
+ sal_uInt64* pBytesWritten)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == pBuffer) || (0 == pBytesWritten))
+ return osl_File_E_INVAL;
+ if (0 == (pImpl->m_state & FileHandle_Impl::STATE_SEEKABLE))
+ return osl_File_E_SPIPE;
+
+ static sal_uInt64 const g_limit_longlong = std::numeric_limits< LONGLONG >::max();
+ if (g_limit_longlong < uOffset)
+ return osl_File_E_OVERFLOW;
+ LONGLONG const nOffset = sal::static_int_cast< LONGLONG >(uOffset);
+
+ // write at specified fileptr
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ return pImpl->writeFileAt (nOffset, pBuffer, uBytesToWrite, pBytesWritten);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_isEndOfFile (oslFileHandle Handle, sal_Bool *pIsEOF)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == pIsEOF))
+ return osl_File_E_INVAL;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ *pIsEOF = (pImpl->getPos() == pImpl->getSize());
+ return osl_File_E_None;
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_getFilePos(oslFileHandle Handle, sal_uInt64 *pPos)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == pPos))
+ return osl_File_E_INVAL;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ *pPos = pImpl->getPos();
+ return osl_File_E_None;
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_setFilePos(oslFileHandle Handle, sal_uInt32 uHow, sal_Int64 uOffset)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile))
+ return osl_File_E_INVAL;
+
+ static sal_Int64 const g_limit_longlong = std::numeric_limits< LONGLONG >::max();
+ if (g_limit_longlong < uOffset)
+ return osl_File_E_OVERFLOW;
+ LONGLONG nPos = 0, nOffset = sal::static_int_cast< LONGLONG >(uOffset);
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ switch (uHow)
+ {
+ case osl_Pos_Absolut:
+ if (0 > nOffset)
+ return osl_File_E_INVAL;
+ break;
+
+ case osl_Pos_Current:
+ nPos = sal::static_int_cast< LONGLONG >(pImpl->getPos());
+ if ((0 > nOffset) && (-1*nOffset > nPos))
+ return osl_File_E_INVAL;
+ if (g_limit_longlong < nPos + nOffset)
+ return osl_File_E_OVERFLOW;
+ break;
+
+ case osl_Pos_End:
+ nPos = sal::static_int_cast< LONGLONG >(pImpl->getSize());
+ if ((0 > nOffset) && (-1*nOffset > nPos))
+ return osl_File_E_INVAL;
+ if (g_limit_longlong < nPos + nOffset)
+ return osl_File_E_OVERFLOW;
+ break;
+
+ default:
+ return osl_File_E_INVAL;
+ }
+
+ return pImpl->setPos (nPos + nOffset);
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_getFileSize (oslFileHandle Handle, sal_uInt64 *pSize)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile) || (0 == pSize))
+ return osl_File_E_INVAL;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ *pSize = pImpl->getSize();
+ return osl_File_E_None;
+}
+
+//#############################################
+oslFileError
+SAL_CALL osl_setFileSize (oslFileHandle Handle, sal_uInt64 uSize)
+{
+ FileHandle_Impl * pImpl = static_cast<FileHandle_Impl*>(Handle);
+
+ if ((0 == pImpl) || !IsValidHandle(pImpl->m_hFile))
+ return osl_File_E_INVAL;
+ if (0 == (pImpl->m_state & FileHandle_Impl::STATE_WRITEABLE))
+ return osl_File_E_BADF;
+
+ static sal_uInt64 const g_limit_longlong = std::numeric_limits< LONGLONG >::max();
+ if (g_limit_longlong < uSize)
+ return osl_File_E_OVERFLOW;
+
+ FileHandle_Impl::Guard lock (&(pImpl->m_mutex));
+ oslFileError result = pImpl->syncFile();
+ if (result != osl_File_E_None)
+ return (result);
+ pImpl->m_bufptr = -1, pImpl->m_buflen = 0;
+
+ return pImpl->setSize (uSize);
+}
+
+//##################################################################
+// File handling functions
+//##################################################################
+
+//#############################################
+oslFileError SAL_CALL osl_removeFile( rtl_uString* strPath )
+{
+ rtl_uString *strSysPath = NULL;
+ oslFileError error = _osl_getSystemPathFromFileURL( strPath, &strSysPath, sal_False );
+
+ if ( osl_File_E_None == error )
+ {
+ if ( DeleteFile( reinterpret_cast<LPCTSTR>(rtl_uString_getStr( strSysPath )) ) )
+ error = osl_File_E_None;
+ else
+ error = oslTranslateFileError( GetLastError() );
+
+ rtl_uString_release( strSysPath );
+ }
+ return error;
+}
+
+//#############################################
+#define osl_File_CopyRecursive 0x0001
+#define osl_File_CopyOverwrite 0x0002
+
+oslFileError SAL_CALL osl_copyFile( rtl_uString* strPath, rtl_uString *strDestPath )
+{
+ rtl_uString *strSysPath = NULL, *strSysDestPath = NULL;
+ oslFileError error = _osl_getSystemPathFromFileURL( strPath, &strSysPath, sal_False );
+
+ if ( osl_File_E_None == error )
+ error = _osl_getSystemPathFromFileURL( strDestPath, &strSysDestPath, sal_False );
+
+ if ( osl_File_E_None == error )
+ {
+ LPCTSTR src = reinterpret_cast<LPCTSTR>(rtl_uString_getStr( strSysPath ));
+ LPCTSTR dst = reinterpret_cast<LPCTSTR>(rtl_uString_getStr( strSysDestPath ));
+
+ if ( CopyFile( src, dst, FALSE ) )
+ error = osl_File_E_None;
+ else
+ error = oslTranslateFileError( GetLastError() );
+ }
+
+ if ( strSysPath )
+ rtl_uString_release( strSysPath );
+ if ( strSysDestPath )
+ rtl_uString_release( strSysDestPath );
+
+ return error;
+}
+
+//#############################################
+oslFileError SAL_CALL osl_moveFile( rtl_uString* strPath, rtl_uString *strDestPath )
+{
+ rtl_uString *strSysPath = NULL, *strSysDestPath = NULL;
+ oslFileError error = _osl_getSystemPathFromFileURL( strPath, &strSysPath, sal_False );
+
+ if ( osl_File_E_None == error )
+ error = _osl_getSystemPathFromFileURL( strDestPath, &strSysDestPath, sal_False );
+
+ if ( osl_File_E_None == error )
+ {
+ LPCTSTR src = reinterpret_cast<LPCTSTR>(rtl_uString_getStr( strSysPath ));
+ LPCTSTR dst = reinterpret_cast<LPCTSTR>(rtl_uString_getStr( strSysDestPath ));
+
+ if ( MoveFileEx( src, dst, MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING ) )
+ error = osl_File_E_None;
+ else
+ error = oslTranslateFileError( GetLastError() );
+ }
+
+ if ( strSysPath )
+ rtl_uString_release( strSysPath );
+ if ( strSysDestPath )
+ rtl_uString_release( strSysDestPath );
+
+ return error;
+}
diff --git a/sal/osl/w32/file_dirvol.cxx b/sal/osl/w32/file_dirvol.cxx
new file mode 100644
index 000000000000..09bdec7988c3
--- /dev/null
+++ b/sal/osl/w32/file_dirvol.cxx
@@ -0,0 +1,1867 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define UNICODE
+#define _UNICODE
+#define _WIN32_WINNT_0x0500
+#include "systools/win32/uwinapi.h"
+
+#include "osl/file.h"
+
+#include "file_url.h"
+#include "file_error.h"
+
+#include "path_helper.hxx"
+
+#include "osl/diagnose.h"
+#include "osl/time.h"
+#include "rtl/alloc.h"
+#include "rtl/ustring.hxx"
+
+#include <tchar.h>
+#ifdef __MINGW32__
+#include <ctype.h>
+#endif
+
+//#####################################################
+#define ELEMENTS_OF_ARRAY(arr) (sizeof(arr)/(sizeof((arr)[0])))
+
+static const wchar_t UNC_PREFIX[] = L"\\\\";
+static const wchar_t BACKSLASH = '\\';
+static const wchar_t SLASH = '/';
+
+//#####################################################
+extern "C" BOOL TimeValueToFileTime(const TimeValue *cpTimeVal, FILETIME *pFTime)
+{
+ SYSTEMTIME BaseSysTime;
+ FILETIME BaseFileTime;
+ FILETIME FTime;
+ __int64 localTime;
+ BOOL fSuccess = FALSE;
+
+ BaseSysTime.wYear = 1970;
+ BaseSysTime.wMonth = 1;
+ BaseSysTime.wDayOfWeek = 0;
+ BaseSysTime.wDay = 1;
+ BaseSysTime.wHour = 0;
+ BaseSysTime.wMinute = 0;
+ BaseSysTime.wSecond = 0;
+ BaseSysTime.wMilliseconds = 0;
+
+ if (cpTimeVal==NULL)
+ return fSuccess;
+
+ if ( SystemTimeToFileTime(&BaseSysTime, &BaseFileTime) )
+ {
+ __int64 timeValue;
+ localTime=cpTimeVal->Seconds*(__int64)10000000+cpTimeVal->Nanosec/100;
+ *(__int64 *)&FTime=localTime;
+ fSuccess = 0 <= (timeValue= *((__int64 *)&BaseFileTime) + *((__int64 *) &FTime));
+ if (fSuccess)
+ *(__int64 *)pFTime=timeValue;
+ }
+ return fSuccess;
+}
+
+//#####################################################
+extern "C" BOOL FileTimeToTimeValue(const FILETIME *cpFTime, TimeValue *pTimeVal)
+{
+ SYSTEMTIME BaseSysTime;
+ FILETIME BaseFileTime;
+ BOOL fSuccess = FALSE; /* Assume failure */
+
+ BaseSysTime.wYear = 1970;
+ BaseSysTime.wMonth = 1;
+ BaseSysTime.wDayOfWeek = 0;
+ BaseSysTime.wDay = 1;
+ BaseSysTime.wHour = 0;
+ BaseSysTime.wMinute = 0;
+ BaseSysTime.wSecond = 0;
+ BaseSysTime.wMilliseconds = 0;
+
+ if ( SystemTimeToFileTime(&BaseSysTime, &BaseFileTime) )
+ {
+ __int64 Value;
+
+ fSuccess = 0 <= (Value = *((__int64 *)cpFTime) - *((__int64 *)&BaseFileTime));
+
+ if ( fSuccess )
+ {
+ pTimeVal->Seconds = (unsigned long) (Value / 10000000L);
+ pTimeVal->Nanosec = (unsigned long)((Value % 10000000L) * 100);
+ }
+ }
+ return fSuccess;
+}
+
+//#####################################################
+namespace /* private */
+{
+ //#####################################################
+ struct Component
+ {
+ Component() :
+ begin_(0), end_(0)
+ {}
+
+ bool isPresent() const
+ { return (static_cast<sal_IntPtr>(end_ - begin_) > 0); }
+
+ const sal_Unicode* begin_;
+ const sal_Unicode* end_;
+ };
+
+ //#####################################################
+ struct UNCComponents
+ {
+ Component server_;
+ Component share_;
+ Component resource_;
+ };
+
+ //#####################################################
+ inline bool is_UNC_path(const sal_Unicode* path)
+ { return (0 == wcsncmp(UNC_PREFIX, reinterpret_cast<LPCWSTR>(path), ELEMENTS_OF_ARRAY(UNC_PREFIX) - 1)); }
+
+ //#####################################################
+ inline bool is_UNC_path(const rtl::OUString& path)
+ { return is_UNC_path(path.getStr()); }
+
+ //#####################################################
+ void parse_UNC_path(const sal_Unicode* path, UNCComponents* puncc)
+ {
+ OSL_PRECOND(is_UNC_path(path), "Precondition violated: No UNC path");
+ OSL_PRECOND(rtl_ustr_indexOfChar(path, SLASH) != -1, "Path must not contain slashes");
+
+ const sal_Unicode* pend = path + rtl_ustr_getLength(path);
+ const sal_Unicode* ppos = path + 2;
+
+ puncc->server_.begin_ = ppos;
+ while ((ppos < pend) && (*ppos != BACKSLASH))
+ ppos++;
+
+ puncc->server_.end_ = ppos;
+
+ if (BACKSLASH == *ppos)
+ {
+ puncc->share_.begin_ = ++ppos;
+ while ((ppos < pend) && (*ppos != BACKSLASH))
+ ppos++;
+
+ puncc->share_.end_ = ppos;
+
+ if (BACKSLASH == *ppos)
+ {
+ puncc->resource_.begin_ = ++ppos;
+ while (ppos < pend)
+ ppos++;
+
+ puncc->resource_.end_ = ppos;
+ }
+ }
+
+ OSL_POSTCOND(puncc->server_.isPresent() && puncc->share_.isPresent(), \
+ "Postcondition violated: Invalid UNC path detected");
+ }
+
+ //#####################################################
+ void parse_UNC_path(const rtl::OUString& path, UNCComponents* puncc)
+ { parse_UNC_path(path.getStr(), puncc); }
+
+
+ //#####################################################
+ bool has_path_parent(const sal_Unicode* path)
+ {
+ // Has the given path a parent or are we already there,
+ // e.g. 'c:\' or '\\server\share\'?
+
+ bool has_parent = false;
+ if (is_UNC_path(path))
+ {
+ UNCComponents unc_comp;
+ parse_UNC_path(path, &unc_comp);
+ has_parent = unc_comp.resource_.isPresent();
+ }
+ else
+ {
+ has_parent = !osl::systemPathIsLogicalDrivePattern(path);
+ }
+ return has_parent;
+ }
+
+ //#####################################################
+ inline bool has_path_parent(const rtl::OUString& path)
+ { return has_path_parent(path.getStr()); }
+
+} // end namespace private
+
+//#####################################################
+// volume handling functions
+//#####################################################
+
+//#####################################################
+oslFileError SAL_CALL osl_unmountVolumeDevice( oslVolumeDeviceHandle Handle )
+{
+ if ( Handle )
+ return osl_File_E_None;
+ else
+ return osl_File_E_INVAL;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_automountVolumeDevice( oslVolumeDeviceHandle Handle )
+{
+ if ( Handle )
+ return osl_File_E_None;
+ else
+ return osl_File_E_INVAL;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_acquireVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
+{
+ if ( Handle )
+ {
+ rtl_uString_acquire( (rtl_uString *)Handle );
+ return osl_File_E_None;
+ }
+ else
+ return osl_File_E_INVAL;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_releaseVolumeDeviceHandle( oslVolumeDeviceHandle Handle )
+{
+ if ( Handle )
+ {
+ rtl_uString_release( (rtl_uString *)Handle );
+ return osl_File_E_None;
+ }
+ else
+ return osl_File_E_INVAL;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_getVolumeDeviceMountPath( oslVolumeDeviceHandle Handle, rtl_uString **pstrPath )
+{
+ if ( Handle && pstrPath )
+ {
+ rtl_uString_assign( pstrPath, (rtl_uString *)Handle );
+ return osl_File_E_None;
+ }
+ else
+ return osl_File_E_INVAL;
+}
+
+//##################################################################
+// directory handling functions
+//##################################################################
+
+#define DIRECTORYITEM_DRIVE 0
+#define DIRECTORYITEM_FILE 1
+#define DIRECTORYITEM_SERVER 2
+
+struct DirectoryItem_Impl
+{
+ UINT uType;
+ union {
+ WIN32_FIND_DATA FindData;
+ TCHAR cDriveString[MAX_PATH];
+ };
+ rtl_uString* m_pFullPath;
+ BOOL bFullPathNormalized;
+ int nRefCount;
+};
+
+//#####################################################
+
+#define DIRECTORYTYPE_LOCALROOT 0
+#define DIRECTORYTYPE_NETROOT 1
+#define DIRECTORYTYPE_NETRESORCE 2
+#define DIRECTORYTYPE_FILESYSTEM 3
+
+struct Directory_Impl
+{
+ UINT uType;
+ union {
+ HANDLE hDirectory;
+ HANDLE hEnumDrives;
+ };
+ rtl_uString* m_pDirectoryPath;
+};
+
+//#####################################################
+
+typedef struct tagDRIVEENUM
+{
+ LPCTSTR lpIdent;
+ TCHAR cBuffer[/*('Z' - 'A' + 1) * sizeof("A:\\") + 1*/256];
+ LPCTSTR lpCurrent;
+} DRIVEENUM, * PDRIVEENUM, FAR * LPDRIVEENUM;
+
+//#####################################################
+
+static HANDLE WINAPI OpenLogicalDrivesEnum(void)
+{
+ LPDRIVEENUM pEnum = (LPDRIVEENUM)HeapAlloc( GetProcessHeap(), 0, sizeof(DRIVEENUM) );
+ if ( pEnum )
+ {
+ DWORD dwNumCopied = GetLogicalDriveStrings( (sizeof(pEnum->cBuffer) - 1) / sizeof(TCHAR), pEnum->cBuffer );
+
+ if ( dwNumCopied && dwNumCopied < sizeof(pEnum->cBuffer) / sizeof(TCHAR) )
+ {
+ pEnum->lpCurrent = pEnum->cBuffer;
+ pEnum->lpIdent = L"tagDRIVEENUM";
+ }
+ else
+ {
+ HeapFree( GetProcessHeap(), 0, pEnum );
+ pEnum = NULL;
+ }
+ }
+ return pEnum ? (HANDLE)pEnum : INVALID_HANDLE_VALUE;
+}
+
+//#####################################################
+static BOOL WINAPI EnumLogicalDrives(HANDLE hEnum, LPTSTR lpBuffer)
+{
+ BOOL fSuccess = FALSE;
+ LPDRIVEENUM pEnum = (LPDRIVEENUM)hEnum;
+
+ if ( pEnum )
+ {
+ int nLen = _tcslen( pEnum->lpCurrent );
+
+ if ( nLen )
+ {
+ CopyMemory( lpBuffer, pEnum->lpCurrent, (nLen + 1) * sizeof(TCHAR) );
+ pEnum->lpCurrent += nLen + 1;
+ fSuccess = TRUE;
+ }
+ else
+ SetLastError( ERROR_NO_MORE_FILES );
+ }
+ else
+ SetLastError( ERROR_INVALID_HANDLE );
+
+ return fSuccess;
+}
+
+//#####################################################
+static BOOL WINAPI CloseLogicalDrivesEnum(HANDLE hEnum)
+{
+ BOOL fSuccess = FALSE;
+ LPDRIVEENUM pEnum = (LPDRIVEENUM)hEnum;
+
+ if ( pEnum )
+ {
+ HeapFree( GetProcessHeap(), 0, pEnum );
+ fSuccess = TRUE;
+ }
+ else
+ SetLastError( ERROR_INVALID_HANDLE );
+
+ return fSuccess;
+}
+
+//#####################################################
+typedef struct tagDIRECTORY
+{
+ HANDLE hFind;
+ WIN32_FIND_DATA aFirstData;
+} DIRECTORY, *PDIRECTORY, FAR *LPDIRECTORY;
+
+//#####################################################
+static HANDLE WINAPI OpenDirectory( rtl_uString* pPath)
+{
+ LPDIRECTORY pDirectory = NULL;
+
+ if ( pPath )
+ {
+ sal_uInt32 nLen = rtl_uString_getLength( pPath );
+ if ( nLen )
+ {
+ TCHAR* pSuffix = 0;
+ sal_uInt32 nSuffLen = 0;
+
+ if ( pPath->buffer[nLen - 1] != L'\\' )
+ {
+ pSuffix = L"\\*.*";
+ nSuffLen = 4;
+ }
+ else
+ {
+ pSuffix = L"*.*";
+ nSuffLen = 3;
+ }
+
+ TCHAR* szFileMask = reinterpret_cast< TCHAR* >( rtl_allocateMemory( sizeof( TCHAR ) * ( nLen + nSuffLen + 1 ) ) );
+
+ _tcscpy( szFileMask, reinterpret_cast<LPCTSTR>( rtl_uString_getStr( pPath ) ) );
+ _tcscat( szFileMask, pSuffix );
+
+ pDirectory = (LPDIRECTORY)HeapAlloc(GetProcessHeap(), 0, sizeof(DIRECTORY));
+ pDirectory->hFind = FindFirstFile(szFileMask, &pDirectory->aFirstData);
+
+ if (!IsValidHandle(pDirectory->hFind))
+ {
+ if ( GetLastError() != ERROR_NO_MORE_FILES )
+ {
+ HeapFree(GetProcessHeap(), 0, pDirectory);
+ pDirectory = NULL;
+ }
+ }
+ }
+ }
+
+ return (HANDLE)pDirectory;
+}
+
+//#####################################################
+BOOL WINAPI EnumDirectory(HANDLE hDirectory, LPWIN32_FIND_DATA pFindData)
+{
+ BOOL fSuccess = FALSE;
+ LPDIRECTORY pDirectory = (LPDIRECTORY)hDirectory;
+
+ if ( pDirectory )
+ {
+ BOOL fValid;
+
+ do
+ {
+ if ( pDirectory->aFirstData.cFileName[0] )
+ {
+ *pFindData = pDirectory->aFirstData;
+ fSuccess = TRUE;
+ pDirectory->aFirstData.cFileName[0] = 0;
+ }
+ else if ( IsValidHandle( pDirectory->hFind ) )
+ fSuccess = FindNextFile( pDirectory->hFind, pFindData );
+ else
+ {
+ fSuccess = FALSE;
+ SetLastError( ERROR_NO_MORE_FILES );
+ }
+
+ fValid = fSuccess && _tcscmp( TEXT("."), pFindData->cFileName ) != 0 && _tcscmp( TEXT(".."), pFindData->cFileName ) != 0;
+
+ } while( fSuccess && !fValid );
+ }
+ else
+ SetLastError( ERROR_INVALID_HANDLE );
+
+ return fSuccess;
+}
+
+//#####################################################
+static BOOL WINAPI CloseDirectory(HANDLE hDirectory)
+{
+ BOOL fSuccess = FALSE;
+ LPDIRECTORY pDirectory = (LPDIRECTORY)hDirectory;
+
+ if (pDirectory)
+ {
+ if (IsValidHandle(pDirectory->hFind))
+ fSuccess = FindClose(pDirectory->hFind);
+
+ fSuccess = HeapFree(GetProcessHeap(), 0, pDirectory) && fSuccess;
+ }
+ else
+ SetLastError(ERROR_INVALID_HANDLE);
+
+ return fSuccess;
+}
+
+//#####################################################
+static oslFileError osl_openLocalRoot(
+ rtl_uString *strDirectoryPath, oslDirectory *pDirectory)
+{
+ rtl_uString *strSysPath = NULL;
+ oslFileError error;
+
+ if ( !pDirectory )
+ return osl_File_E_INVAL;
+
+ *pDirectory = NULL;
+
+ error = _osl_getSystemPathFromFileURL( strDirectoryPath, &strSysPath, sal_False );
+ if ( osl_File_E_None == error )
+ {
+ Directory_Impl *pDirImpl;
+
+ pDirImpl = reinterpret_cast<Directory_Impl*>(rtl_allocateMemory( sizeof(Directory_Impl)));
+ ZeroMemory( pDirImpl, sizeof(Directory_Impl) );
+ rtl_uString_newFromString( &pDirImpl->m_pDirectoryPath, strSysPath );
+
+ /* Append backslash if neccessary */
+
+ /* @@@ToDo
+ use function ensure backslash
+ */
+ sal_uInt32 nLen = rtl_uString_getLength( pDirImpl->m_pDirectoryPath );
+ if ( nLen && pDirImpl->m_pDirectoryPath->buffer[nLen - 1] != L'\\' )
+ {
+ rtl_uString* pCurDir = 0;
+ rtl_uString* pBackSlash = 0;
+
+ rtl_uString_assign( &pCurDir, pDirImpl->m_pDirectoryPath );
+ rtl_uString_newFromAscii( &pBackSlash, "\\" );
+ rtl_uString_newConcat( &pDirImpl->m_pDirectoryPath, pCurDir, pBackSlash );
+ rtl_uString_release( pBackSlash );
+ rtl_uString_release( pCurDir );
+ }
+
+ pDirImpl->uType = DIRECTORYTYPE_LOCALROOT;
+ pDirImpl->hEnumDrives = OpenLogicalDrivesEnum();
+
+ /* @@@ToDo
+ Use IsValidHandle(...)
+ */
+ if ( pDirImpl->hEnumDrives != INVALID_HANDLE_VALUE )
+ {
+ *pDirectory = (oslDirectory)pDirImpl;
+ error = osl_File_E_None;
+ }
+ else
+ {
+ if ( pDirImpl )
+ {
+ if ( pDirImpl->m_pDirectoryPath )
+ {
+ rtl_uString_release( pDirImpl->m_pDirectoryPath );
+ pDirImpl->m_pDirectoryPath = 0;
+ }
+
+ rtl_freeMemory(pDirImpl);
+ pDirImpl = 0;
+ }
+
+ error = oslTranslateFileError( GetLastError() );
+ }
+
+ rtl_uString_release( strSysPath );
+ }
+ return error;
+}
+
+//#####################################################
+static oslFileError SAL_CALL osl_openFileDirectory(
+ rtl_uString *strDirectoryPath, oslDirectory *pDirectory)
+{
+ oslFileError error = osl_File_E_None;
+
+ if ( !pDirectory )
+ return osl_File_E_INVAL;
+ *pDirectory = NULL;
+
+ Directory_Impl *pDirImpl = reinterpret_cast<Directory_Impl*>(rtl_allocateMemory(sizeof(Directory_Impl)));
+ ZeroMemory( pDirImpl, sizeof(Directory_Impl) );
+ rtl_uString_newFromString( &pDirImpl->m_pDirectoryPath, strDirectoryPath );
+
+ /* Append backslash if neccessary */
+
+ /* @@@ToDo
+ use function ensure backslash
+ */
+ sal_uInt32 nLen = rtl_uString_getLength( pDirImpl->m_pDirectoryPath );
+ if ( nLen && pDirImpl->m_pDirectoryPath->buffer[nLen - 1] != L'\\' )
+ {
+ rtl_uString* pCurDir = 0;
+ rtl_uString* pBackSlash = 0;
+
+ rtl_uString_assign( &pCurDir, pDirImpl->m_pDirectoryPath );
+ rtl_uString_newFromAscii( &pBackSlash, "\\" );
+ rtl_uString_newConcat( &pDirImpl->m_pDirectoryPath, pCurDir, pBackSlash );
+ rtl_uString_release( pBackSlash );
+ rtl_uString_release( pCurDir );
+ }
+
+
+ pDirImpl->uType = DIRECTORYTYPE_FILESYSTEM;
+ pDirImpl->hDirectory = OpenDirectory( pDirImpl->m_pDirectoryPath );
+
+ if ( !pDirImpl->hDirectory )
+ {
+ error = oslTranslateFileError( GetLastError() );
+
+ if ( pDirImpl->m_pDirectoryPath )
+ {
+ rtl_uString_release( pDirImpl->m_pDirectoryPath );
+ pDirImpl->m_pDirectoryPath = 0;
+ }
+
+ rtl_freeMemory(pDirImpl), pDirImpl = 0;
+ }
+
+ *pDirectory = (oslDirectory)(pDirImpl);
+ return error;
+}
+
+//#####################################################
+static oslFileError SAL_CALL osl_openNetworkServer(
+ rtl_uString *strSysDirPath, oslDirectory *pDirectory)
+{
+ NETRESOURCEW aNetResource;
+ HANDLE hEnum;
+ DWORD dwError;
+
+ ZeroMemory( &aNetResource, sizeof(aNetResource) );
+
+ aNetResource.lpRemoteName = reinterpret_cast<LPWSTR>(strSysDirPath->buffer);
+
+ dwError = WNetOpenEnumW(
+ RESOURCE_GLOBALNET,
+ RESOURCETYPE_DISK,
+ RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER,
+ &aNetResource,
+ &hEnum );
+
+ if ( ERROR_SUCCESS == dwError )
+ {
+ Directory_Impl *pDirImpl;
+
+ pDirImpl = reinterpret_cast<Directory_Impl*>(rtl_allocateMemory(sizeof(Directory_Impl)));
+ ZeroMemory( pDirImpl, sizeof(Directory_Impl) );
+ pDirImpl->uType = DIRECTORYTYPE_NETROOT;
+ pDirImpl->hDirectory = hEnum;
+ *pDirectory = (oslDirectory)pDirImpl;
+ }
+ return oslTranslateFileError( dwError );
+}
+
+//#############################################
+static DWORD create_dir_with_callback(
+ rtl_uString * dir_path,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ // Create the specified directory and call the
+ // user specified callback function. On success
+ // the function returns ERROR_SUCCESS else a Win32 error code.
+
+ BOOL bCreated = FALSE;
+
+ bCreated = CreateDirectoryW( reinterpret_cast<LPCWSTR>(rtl_uString_getStr( dir_path )), NULL );
+
+ if ( bCreated )
+ {
+ if (aDirectoryCreationCallbackFunc)
+ {
+ rtl::OUString url;
+ _osl_getFileURLFromSystemPath(dir_path, &(url.pData));
+ aDirectoryCreationCallbackFunc(pData, url.pData);
+ }
+ return ERROR_SUCCESS;
+ }
+ return GetLastError();
+}
+
+//#############################################
+static int path_make_parent(sal_Unicode* path)
+{
+ /* Cut off the last part of the given path to
+ get the parent only, e.g. 'c:\dir\subdir' ->
+ 'c:\dir' or '\\share\sub\dir' -> '\\share\sub'
+ @return The position where the path has been cut
+ off (this is the posistion of the last backslash).
+ If there are no more parents 0 will be returned,
+ e.g. 'c:\' or '\\Share' have no more parents */
+
+ OSL_PRECOND(rtl_ustr_indexOfChar(path, SLASH) != -1, "Path must not contain slashes");
+ OSL_PRECOND(has_path_parent(path), "Path must have a parent");
+
+ sal_Unicode* pos_last_backslash = path + rtl_ustr_lastIndexOfChar(path, BACKSLASH);
+ *pos_last_backslash = 0;
+ return (pos_last_backslash - path);
+}
+
+//#############################################
+static DWORD create_dir_recursively_(
+ rtl_uString * dir_path,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ OSL_PRECOND(
+ rtl_ustr_lastIndexOfChar_WithLength(dir_path->buffer, dir_path->length, BACKSLASH) != dir_path->length,
+ "Path must not end with a backslash");
+
+ DWORD w32_error = create_dir_with_callback(
+ dir_path, aDirectoryCreationCallbackFunc, pData);
+ if (w32_error == ERROR_SUCCESS)
+ return ERROR_SUCCESS;
+
+ if ((w32_error != ERROR_PATH_NOT_FOUND) || !has_path_parent(dir_path->buffer))
+ return w32_error;
+
+ int pos = path_make_parent(dir_path->buffer); // dir_path->buffer[pos] = 0, restore below
+
+ w32_error = create_dir_recursively_(
+ dir_path, aDirectoryCreationCallbackFunc, pData);
+
+ dir_path->buffer[pos] = BACKSLASH; // restore
+
+ if (ERROR_SUCCESS != w32_error)
+ return w32_error;
+
+ return create_dir_recursively_(dir_path, aDirectoryCreationCallbackFunc, pData);
+}
+
+//#############################################
+oslFileError SAL_CALL osl_createDirectoryPath(
+ rtl_uString* aDirectoryUrl,
+ oslDirectoryCreationCallbackFunc aDirectoryCreationCallbackFunc,
+ void* pData)
+{
+ if (aDirectoryUrl == NULL)
+ return osl_File_E_INVAL;
+
+ rtl::OUString sys_path;
+ oslFileError osl_error =
+ _osl_getSystemPathFromFileURL(aDirectoryUrl, &sys_path.pData, sal_False);
+
+ if (osl_error != osl_File_E_None)
+ return osl_error;
+
+ osl::systemPathRemoveSeparator(sys_path);
+
+ // const_cast because sys_path is a local copy
+ // which we want to modify inplace instead of
+ // coyp it into another buffer on the heap again
+ return oslTranslateFileError(create_dir_recursively_(
+ sys_path.pData, aDirectoryCreationCallbackFunc, pData));
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_createDirectory(rtl_uString* strPath)
+{
+ rtl_uString *strSysPath = NULL;
+ oslFileError error = _osl_getSystemPathFromFileURL( strPath, &strSysPath, sal_False );
+
+ if ( osl_File_E_None == error )
+ {
+ BOOL bCreated = FALSE;
+
+ bCreated = CreateDirectoryW( reinterpret_cast<LPCWSTR>(rtl_uString_getStr( strSysPath )), NULL );
+
+ if ( !bCreated )
+ {
+ /*@@@ToDo
+ The following case is a hack because the ucb or the webtop had some
+ problems with the error code that CreateDirectory returns in
+ case the path is only a logical drive, should be removed!
+ */
+
+ const sal_Unicode *pBuffer = rtl_uString_getStr( strSysPath );
+ sal_Int32 nLen = rtl_uString_getLength( strSysPath );
+
+ if (
+ ( ( pBuffer[0] >= 'A' && pBuffer[0] <= 'Z' ) ||
+ ( pBuffer[0] >= 'a' && pBuffer[0] <= 'z' ) ) &&
+ pBuffer[1] == ':' && ( nLen ==2 || ( nLen == 3 && pBuffer[2] == '\\' ) )
+ )
+ SetLastError( ERROR_ALREADY_EXISTS );
+
+ error = oslTranslateFileError( GetLastError() );
+ }
+
+ rtl_uString_release( strSysPath );
+ }
+ return error;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_removeDirectory(rtl_uString* strPath)
+{
+ rtl_uString *strSysPath = NULL;
+ oslFileError error = _osl_getSystemPathFromFileURL( strPath, &strSysPath, sal_False );
+
+ if ( osl_File_E_None == error )
+ {
+ if ( RemoveDirectory( reinterpret_cast<LPCTSTR>(rtl_uString_getStr( strSysPath )) ) )
+ error = osl_File_E_None;
+ else
+ error = oslTranslateFileError( GetLastError() );
+
+ rtl_uString_release( strSysPath );
+ }
+ return error;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_openDirectory(rtl_uString *strDirectoryPath, oslDirectory *pDirectory)
+{
+ oslFileError error;
+
+ if ( 0 == rtl_ustr_ascii_compareIgnoreAsciiCase( strDirectoryPath->buffer, "file:///" ) )
+ error = osl_openLocalRoot( strDirectoryPath, pDirectory );
+ else
+ {
+ rtl_uString *strSysDirectoryPath = NULL;
+ DWORD dwPathType;
+
+ error = _osl_getSystemPathFromFileURL( strDirectoryPath, &strSysDirectoryPath, sal_False );
+
+ if ( osl_File_E_None != error )
+ return error;
+
+ dwPathType = IsValidFilePath( strSysDirectoryPath, NULL, VALIDATEPATH_NORMAL, NULL );
+
+ if ( dwPathType & PATHTYPE_IS_SERVER )
+ {
+ error = osl_openNetworkServer( strSysDirectoryPath, pDirectory );
+ }
+ else
+ error = osl_openFileDirectory( strSysDirectoryPath, pDirectory );
+
+ rtl_uString_release( strSysDirectoryPath );
+ }
+ return error;
+}
+
+//#####################################################
+static oslFileError SAL_CALL osl_getNextNetResource(
+ oslDirectory Directory, oslDirectoryItem *pItem, sal_uInt32 uHint )
+{
+ Directory_Impl *pDirImpl = (Directory_Impl *)Directory;
+ DirectoryItem_Impl *pItemImpl = NULL;
+ BYTE buffer[16384];
+ LPNETRESOURCEW lpNetResource = (LPNETRESOURCEW)buffer;
+ DWORD dwError, dwCount, dwBufSize;
+
+ uHint = uHint; /* to get no warning */
+
+ if ( !pItem )
+ return osl_File_E_INVAL;
+ *pItem = NULL;
+
+ if ( !pDirImpl )
+ return osl_File_E_INVAL;
+
+ dwCount = 1;
+ dwBufSize = sizeof(buffer);
+ dwError = WNetEnumResource( pDirImpl->hDirectory, &dwCount, lpNetResource, &dwBufSize );
+
+ switch ( dwError )
+ {
+ case NO_ERROR:
+ case ERROR_MORE_DATA:
+ {
+ pItemImpl = reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+ if ( !pItemImpl )
+ return osl_File_E_NOMEM;
+
+ ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_DRIVE;
+ osl_acquireDirectoryItem( (oslDirectoryItem)pItemImpl );
+
+ wcscpy( pItemImpl->cDriveString, lpNetResource->lpRemoteName );
+
+ *pItem = pItemImpl;
+ }
+ return osl_File_E_None;
+ case ERROR_NO_MORE_ITEMS:
+ return osl_File_E_NOENT;
+ default:
+ return oslTranslateFileError( dwError );
+ }
+}
+
+//#####################################################
+static oslFileError SAL_CALL osl_getNextDrive(
+ oslDirectory Directory, oslDirectoryItem *pItem, sal_uInt32 uHint )
+{
+ Directory_Impl *pDirImpl = (Directory_Impl *)Directory;
+ DirectoryItem_Impl *pItemImpl = NULL;
+ BOOL fSuccess;
+
+ uHint = uHint; /* avoid warnings */
+
+ if ( !pItem )
+ return osl_File_E_INVAL;
+ *pItem = NULL;
+
+ if ( !pDirImpl )
+ return osl_File_E_INVAL;
+
+ pItemImpl = reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+ if ( !pItemImpl )
+ return osl_File_E_NOMEM;
+
+ ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_DRIVE;
+ osl_acquireDirectoryItem( (oslDirectoryItem)pItemImpl );
+ fSuccess = EnumLogicalDrives( pDirImpl->hEnumDrives, pItemImpl->cDriveString );
+
+ if ( fSuccess )
+ {
+ *pItem = pItemImpl;
+ return osl_File_E_None;
+ }
+ else
+ {
+ if ( pItemImpl->m_pFullPath )
+ {
+ rtl_uString_release( pItemImpl->m_pFullPath );
+ pItemImpl->m_pFullPath = 0;
+ }
+
+ rtl_freeMemory( pItemImpl );
+ return oslTranslateFileError( GetLastError() );
+ }
+}
+
+//#####################################################
+static oslFileError SAL_CALL osl_getNextFileItem(
+ oslDirectory Directory, oslDirectoryItem *pItem, sal_uInt32 uHint)
+{
+ Directory_Impl *pDirImpl = (Directory_Impl *)Directory;
+ DirectoryItem_Impl *pItemImpl = NULL;
+ BOOL fFound;
+
+ uHint = uHint; /* avoid warnings */
+
+ if ( !pItem )
+ return osl_File_E_INVAL;
+ *pItem = NULL;
+
+ if ( !pDirImpl )
+ return osl_File_E_INVAL;
+
+ pItemImpl = reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+ if ( !pItemImpl )
+ return osl_File_E_NOMEM;
+
+ memset( pItemImpl, 0, sizeof(DirectoryItem_Impl) );
+ fFound = EnumDirectory( pDirImpl->hDirectory, &pItemImpl->FindData );
+
+ if ( fFound )
+ {
+ pItemImpl->uType = DIRECTORYITEM_FILE;
+ pItemImpl->nRefCount = 1;
+
+ rtl_uString* pTmpFileName = 0;
+ rtl_uString_newFromStr( &pTmpFileName, reinterpret_cast<const sal_Unicode *>(pItemImpl->FindData.cFileName) );
+ rtl_uString_newConcat( &pItemImpl->m_pFullPath, pDirImpl->m_pDirectoryPath, pTmpFileName );
+ rtl_uString_release( pTmpFileName );
+
+ pItemImpl->bFullPathNormalized = FALSE;
+ *pItem = (oslDirectoryItem)pItemImpl;
+ return osl_File_E_None;
+ }
+ else
+ {
+ if ( pItemImpl->m_pFullPath )
+ {
+ rtl_uString_release( pItemImpl->m_pFullPath );
+ pItemImpl->m_pFullPath = 0;
+ }
+
+ rtl_freeMemory( pItemImpl );
+ return oslTranslateFileError( GetLastError() );
+ }
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_getNextDirectoryItem(
+ oslDirectory Directory, oslDirectoryItem *pItem, sal_uInt32 uHint)
+{
+ Directory_Impl *pDirImpl = (Directory_Impl *)Directory;
+
+ /* Assume failure */
+
+ if ( !pItem )
+ return osl_File_E_INVAL;
+ *pItem = NULL;
+
+ if ( !pDirImpl )
+ return osl_File_E_INVAL;
+
+ switch ( pDirImpl->uType )
+ {
+ case DIRECTORYTYPE_LOCALROOT:
+ return osl_getNextDrive( Directory, pItem, uHint );
+ case DIRECTORYTYPE_NETROOT:
+ return osl_getNextNetResource( Directory, pItem, uHint );
+ case DIRECTORYTYPE_FILESYSTEM:
+ return osl_getNextFileItem( Directory, pItem, uHint );
+ default:
+ return osl_File_E_INVAL;
+ }
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_closeDirectory(oslDirectory Directory)
+{
+ Directory_Impl *pDirImpl = (Directory_Impl *)Directory;
+ oslFileError eError = osl_File_E_INVAL;
+
+ if ( pDirImpl )
+ {
+ switch ( pDirImpl->uType )
+ {
+ case DIRECTORYTYPE_FILESYSTEM:
+ eError = CloseDirectory( pDirImpl->hDirectory ) ? osl_File_E_None : oslTranslateFileError( GetLastError() );
+ break;
+ case DIRECTORYTYPE_LOCALROOT:
+ eError = CloseLogicalDrivesEnum( pDirImpl->hEnumDrives ) ? osl_File_E_None : oslTranslateFileError( GetLastError() );
+ break;
+ case DIRECTORYTYPE_NETROOT:
+ {
+ DWORD err = WNetCloseEnum(pDirImpl->hDirectory);
+ eError = (err == NO_ERROR) ? osl_File_E_None : oslTranslateFileError(err);
+ }
+ break;
+ default:
+ OSL_ENSURE( 0, "Invalid directory type" );
+ break;
+ }
+
+ if ( pDirImpl->m_pDirectoryPath )
+ {
+ rtl_uString_release( pDirImpl->m_pDirectoryPath );
+ pDirImpl->m_pDirectoryPath = 0;
+ }
+
+ rtl_freeMemory(pDirImpl);
+ }
+ return eError;
+}
+
+//#####################################################
+/* Different types of paths */
+typedef enum _PATHTYPE
+{
+ PATHTYPE_SYNTAXERROR = 0,
+ PATHTYPE_NETROOT,
+ PATHTYPE_NETSERVER,
+ PATHTYPE_VOLUME,
+ PATHTYPE_FILE
+} PATHTYPE;
+
+oslFileError SAL_CALL osl_getDirectoryItem(rtl_uString *strFilePath, oslDirectoryItem *pItem)
+{
+ oslFileError error = osl_File_E_None;
+ rtl_uString* strSysFilePath = NULL;
+ PATHTYPE type = PATHTYPE_FILE;
+ DWORD dwPathType;
+
+ /* Assume failure */
+
+ if ( !pItem )
+ return osl_File_E_INVAL;
+
+ *pItem = NULL;
+
+
+ error = _osl_getSystemPathFromFileURL( strFilePath, &strSysFilePath, sal_False );
+
+ if ( osl_File_E_None != error )
+ return error;
+
+ dwPathType = IsValidFilePath( strSysFilePath, NULL, VALIDATEPATH_NORMAL, NULL );
+
+ if ( dwPathType & PATHTYPE_IS_VOLUME )
+ type = PATHTYPE_VOLUME;
+ else if ( dwPathType & PATHTYPE_IS_SERVER )
+ type = PATHTYPE_NETSERVER;
+ else
+ type = PATHTYPE_FILE;
+
+ switch ( type )
+ {
+ case PATHTYPE_NETSERVER:
+ {
+ DirectoryItem_Impl* pItemImpl =
+ reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+
+ if ( !pItemImpl )
+ error = osl_File_E_NOMEM;
+
+ if ( osl_File_E_None == error )
+ {
+ ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_SERVER;
+
+ osl_acquireDirectoryItem( (oslDirectoryItem)pItemImpl );
+ rtl_uString_newFromString( &pItemImpl->m_pFullPath, strSysFilePath );
+
+ // Assign a title anyway
+ {
+ int iSrc = 2;
+ int iDst = 0;
+
+ while( iSrc < strSysFilePath->length && strSysFilePath->buffer[iSrc] && strSysFilePath->buffer[iSrc] != '\\' )
+ {
+ pItemImpl->FindData.cFileName[iDst++] = strSysFilePath->buffer[iSrc++];
+ }
+ }
+
+ *pItem = pItemImpl;
+ }
+ }
+ break;
+ case PATHTYPE_VOLUME:
+ {
+ DirectoryItem_Impl* pItemImpl =
+ reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+
+ if ( !pItemImpl )
+ error = osl_File_E_NOMEM;
+
+ if ( osl_File_E_None == error )
+ {
+ ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) );
+ pItemImpl->uType = DIRECTORYITEM_DRIVE;
+
+ osl_acquireDirectoryItem( (oslDirectoryItem)pItemImpl );
+
+ _tcscpy( pItemImpl->cDriveString, reinterpret_cast<LPCTSTR>(strSysFilePath->buffer) );
+ pItemImpl->cDriveString[0] = _toupper( pItemImpl->cDriveString[0] );
+
+ if ( pItemImpl->cDriveString[_tcslen(pItemImpl->cDriveString) - 1] != '\\' )
+ _tcscat( pItemImpl->cDriveString, TEXT( "\\" ) );
+
+ *pItem = pItemImpl;
+ }
+ }
+ break;
+ case PATHTYPE_SYNTAXERROR:
+ case PATHTYPE_NETROOT:
+ case PATHTYPE_FILE:
+ {
+ HANDLE hFind;
+ WIN32_FIND_DATA aFindData;
+
+ if ( strSysFilePath->length > 0 && strSysFilePath->buffer[strSysFilePath->length - 1] == '\\' )
+ rtl_uString_newFromStr_WithLength( &strSysFilePath, strSysFilePath->buffer, strSysFilePath->length - 1 );
+
+ hFind = FindFirstFile( reinterpret_cast<LPCTSTR>(rtl_uString_getStr(strSysFilePath)), &aFindData );
+
+ if ( hFind != INVALID_HANDLE_VALUE )
+ {
+ DirectoryItem_Impl *pItemImpl =
+ reinterpret_cast<DirectoryItem_Impl*>(rtl_allocateMemory(sizeof(DirectoryItem_Impl)));
+
+ ZeroMemory( pItemImpl, sizeof(DirectoryItem_Impl) );
+ osl_acquireDirectoryItem( (oslDirectoryItem)pItemImpl );
+
+ CopyMemory( &pItemImpl->FindData, &aFindData, sizeof(WIN32_FIND_DATA) );
+ rtl_uString_newFromString( &pItemImpl->m_pFullPath, strSysFilePath );
+
+ // MT: This costs 600ms startup time on fast v60x!
+ // GetCaseCorrectPathName( pItemImpl->szFullPath, pItemImpl->szFullPath, sizeof(pItemImpl->szFullPath) );
+
+ pItemImpl->uType = DIRECTORYITEM_FILE;
+ *pItem = pItemImpl;
+ FindClose( hFind );
+ }
+ else
+ error = oslTranslateFileError( GetLastError() );
+ }
+ break;
+ }
+
+ if ( strSysFilePath )
+ rtl_uString_release( strSysFilePath );
+
+ return error;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_acquireDirectoryItem( oslDirectoryItem Item )
+{
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ pItemImpl->nRefCount++;
+ return osl_File_E_None;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_releaseDirectoryItem( oslDirectoryItem Item )
+{
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ if ( ! --pItemImpl->nRefCount )
+ {
+ if ( pItemImpl->m_pFullPath )
+ {
+ rtl_uString_release( pItemImpl->m_pFullPath );
+ pItemImpl->m_pFullPath = 0;
+ }
+
+ rtl_freeMemory( pItemImpl );
+ }
+
+ return osl_File_E_None;
+}
+
+//#####################################################
+// volume / file info handling functions
+//#####################################################
+
+//#####################################################
+static inline bool is_floppy_A_present()
+{ return (GetLogicalDrives() & 1); }
+
+//#####################################################
+static inline bool is_floppy_B_present()
+{ return (GetLogicalDrives() & 2); }
+
+//#####################################################
+bool is_floppy_volume_mount_point(const rtl::OUString& path)
+{
+ // determines if a volume mount point shows to a floppy
+ // disk by comparing the unique volume names
+ static const LPCWSTR FLOPPY_A = L"A:\\";
+ static const LPCWSTR FLOPPY_B = L"B:\\";
+
+ rtl::OUString p(path);
+ osl::systemPathEnsureSeparator(p);
+
+ TCHAR vn[51];
+ if (GetVolumeNameForVolumeMountPoint(reinterpret_cast<LPCTSTR>(p.getStr()), vn, ELEMENTS_OF_ARRAY(vn)))
+ {
+ TCHAR vnfloppy[51];
+ if (is_floppy_A_present() &&
+ GetVolumeNameForVolumeMountPoint(FLOPPY_A, vnfloppy, ELEMENTS_OF_ARRAY(vnfloppy)) &&
+ (0 == wcscmp(vn, vnfloppy)))
+ return true;
+
+ if (is_floppy_B_present() &&
+ GetVolumeNameForVolumeMountPoint(FLOPPY_B, vnfloppy, ELEMENTS_OF_ARRAY(vnfloppy)) &&
+ (0 == wcscmp(vn, vnfloppy)))
+ return true;
+ }
+ return false;
+}
+
+//################################################
+static bool is_floppy_drive(const rtl::OUString& path)
+{
+ static const LPCWSTR FLOPPY_DRV_LETTERS = TEXT("AaBb");
+
+ // we must take into account that even a floppy
+ // drive may be mounted to a directory so checking
+ // for the drive letter alone is not sufficient
+ // we must compare the unique volume name with
+ // that of the available floppy disks
+
+ const sal_Unicode* pszPath = path.getStr();
+ return ((wcschr(FLOPPY_DRV_LETTERS, pszPath[0]) && (L':' == pszPath[1])) || is_floppy_volume_mount_point(path));
+}
+
+//#####################################################
+static bool is_volume_mount_point(const rtl::OUString& path)
+{
+ rtl::OUString p(path);
+ osl::systemPathRemoveSeparator(p);
+
+ bool is_volume_root = false;
+
+ if (!is_floppy_drive(p))
+ {
+ DWORD fattr = GetFileAttributes(reinterpret_cast<LPCTSTR>(p.getStr()));
+
+ if ((INVALID_FILE_ATTRIBUTES != fattr) &&
+ (FILE_ATTRIBUTE_REPARSE_POINT & fattr))
+ {
+ WIN32_FIND_DATA find_data;
+ HANDLE h_find = FindFirstFile(reinterpret_cast<LPCTSTR>(p.getStr()), &find_data);
+
+ if (IsValidHandle(h_find) &&
+ (FILE_ATTRIBUTE_REPARSE_POINT & find_data.dwFileAttributes) &&
+ (IO_REPARSE_TAG_MOUNT_POINT == find_data.dwReserved0))
+ {
+ is_volume_root = true;
+ }
+ if (IsValidHandle(h_find))
+ FindClose(h_find);
+ }
+ }
+ return is_volume_root;
+}
+
+//#############################################
+static UINT get_volume_mount_point_drive_type(const rtl::OUString& path)
+{
+ if (0 == path.getLength())
+ return GetDriveType(NULL);
+
+ rtl::OUString p(path);
+ osl::systemPathEnsureSeparator(p);
+
+ TCHAR vn[51];
+ if (GetVolumeNameForVolumeMountPoint(reinterpret_cast<LPCTSTR>(p.getStr()), vn, ELEMENTS_OF_ARRAY(vn)))
+ return GetDriveType(vn);
+
+ return DRIVE_NO_ROOT_DIR;
+}
+
+//#############################################
+static inline bool is_drivetype_request(sal_uInt32 field_mask)
+{
+ return (field_mask & osl_VolumeInfo_Mask_Attributes);
+}
+
+//#############################################
+static oslFileError osl_get_drive_type(
+ const rtl::OUString& path, oslVolumeInfo* pInfo)
+{
+ // GetDriveType fails on empty volume mount points
+ // see Knowledge Base Q244089
+ UINT drive_type;
+ if (is_volume_mount_point(path))
+ drive_type = get_volume_mount_point_drive_type(path);
+ else
+ drive_type = GetDriveType(reinterpret_cast<LPCTSTR>(path.getStr()));
+
+ if (DRIVE_NO_ROOT_DIR == drive_type)
+ return oslTranslateFileError(ERROR_INVALID_DRIVE);
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+
+ switch (drive_type)
+ {
+ case DRIVE_CDROM:
+ pInfo->uAttributes |= osl_Volume_Attribute_CompactDisc | osl_Volume_Attribute_Removeable;
+ break;
+ case DRIVE_REMOVABLE:
+ pInfo->uAttributes |= osl_Volume_Attribute_Removeable;
+ if (is_floppy_drive(path))
+ pInfo->uAttributes |= osl_Volume_Attribute_FloppyDisk;
+ break;
+ case DRIVE_FIXED:
+ pInfo->uAttributes |= osl_Volume_Attribute_FixedDisk;
+ break;
+ case DRIVE_RAMDISK:
+ pInfo->uAttributes |= osl_Volume_Attribute_RAMDisk;
+ break;
+ case DRIVE_REMOTE:
+ pInfo->uAttributes |= osl_Volume_Attribute_Remote;
+ break;
+ case DRIVE_UNKNOWN:
+ pInfo->uAttributes = 0;
+ break;
+ default:
+ pInfo->uValidFields &= ~osl_VolumeInfo_Mask_Attributes;
+ pInfo->uAttributes = 0;
+ break;
+ }
+ return osl_File_E_None;
+}
+
+//#############################################
+static inline bool is_volume_space_info_request(sal_uInt32 field_mask)
+{
+ return (field_mask &
+ (osl_VolumeInfo_Mask_TotalSpace |
+ osl_VolumeInfo_Mask_UsedSpace |
+ osl_VolumeInfo_Mask_FreeSpace));
+}
+
+//#############################################
+static void get_volume_space_information(
+ const rtl::OUString& path, oslVolumeInfo *pInfo)
+{
+ BOOL ret = GetDiskFreeSpaceEx(
+ reinterpret_cast<LPCTSTR>(path.getStr()),
+ (PULARGE_INTEGER)&(pInfo->uFreeSpace),
+ (PULARGE_INTEGER)&(pInfo->uTotalSpace),
+ NULL);
+
+ if (ret)
+ {
+ pInfo->uUsedSpace = pInfo->uTotalSpace - pInfo->uFreeSpace;
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_TotalSpace |
+ osl_VolumeInfo_Mask_UsedSpace |
+ osl_VolumeInfo_Mask_FreeSpace;
+ }
+}
+
+//#############################################
+static inline bool is_filesystem_attributes_request(sal_uInt32 field_mask)
+{
+ return (field_mask &
+ (osl_VolumeInfo_Mask_MaxNameLength |
+ osl_VolumeInfo_Mask_MaxPathLength |
+ osl_VolumeInfo_Mask_FileSystemName |
+ osl_VolumeInfo_Mask_FileSystemCaseHandling));
+}
+
+//#############################################
+static oslFileError get_filesystem_attributes(
+ const rtl::OUString& path, sal_uInt32 field_mask, oslVolumeInfo* pInfo)
+{
+ pInfo->uAttributes = 0;
+
+ // osl_get_drive_type must be called first because
+ // this function resets osl_VolumeInfo_Mask_Attributes
+ // on failure
+ if (is_drivetype_request(field_mask))
+ {
+ oslFileError osl_error = osl_get_drive_type(path, pInfo);
+ if (osl_File_E_None != osl_error)
+ return osl_error;
+ }
+ if (is_filesystem_attributes_request(field_mask))
+ {
+ /* the following two parameters can not be longer than MAX_PATH+1 */
+ WCHAR vn[MAX_PATH+1];
+ WCHAR fsn[MAX_PATH+1];
+
+ DWORD serial;
+ DWORD mcl;
+ DWORD flags;
+
+ LPCTSTR pszPath = reinterpret_cast<LPCTSTR>(path.getStr());
+ if (GetVolumeInformation(pszPath, vn, MAX_PATH+1, &serial, &mcl, &flags, fsn, MAX_PATH+1))
+ {
+ // Currently sal does not use this value, instead MAX_PATH is used
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxNameLength;
+ pInfo->uMaxNameLength = mcl;
+
+ // Should the uMaxPathLength be set to 32767, "\\?\" prefix allowes it
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_MaxPathLength;
+ pInfo->uMaxPathLength = MAX_PATH;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_FileSystemName;
+ rtl_uString_newFromStr(&pInfo->ustrFileSystemName, reinterpret_cast<const sal_Unicode*>(fsn));
+
+ // volumes (even NTFS) will always be considered case
+ // insensitive because the Win32 API is not able to
+ // deal with case sensitive volumes see M$ Knowledge Base
+ // article 100625 that's why we never set the attribute
+ // osl_Volume_Attribute_Case_Sensitive
+
+ if (flags & FS_CASE_IS_PRESERVED)
+ pInfo->uAttributes |= osl_Volume_Attribute_Case_Is_Preserved;
+
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_Attributes;
+ }
+ }
+ return osl_File_E_None;
+}
+
+//#####################################################
+static bool path_get_parent(rtl::OUString& path)
+{
+ OSL_PRECOND(path.lastIndexOf(SLASH) == -1, "Path must not have slashes");
+
+ if (!has_path_parent(path))
+ {
+ sal_Int32 i = path.lastIndexOf(BACKSLASH);
+ if (-1 < i)
+ {
+ path = rtl::OUString(path.getStr(), i);
+ return true;
+ }
+ }
+ return false;
+}
+
+//#####################################################
+static void path_travel_to_volume_root(const rtl::OUString& system_path, rtl::OUString& volume_root)
+{
+ rtl::OUString sys_path(system_path);
+
+ while(!is_volume_mount_point(sys_path) && path_get_parent(sys_path))
+ /**/;
+
+ volume_root = sys_path;
+ osl::systemPathEnsureSeparator(volume_root);
+}
+
+//#############################################
+oslFileError SAL_CALL osl_getVolumeInformation(
+ rtl_uString *ustrURL, oslVolumeInfo *pInfo, sal_uInt32 uFieldMask )
+{
+ if (!pInfo)
+ return osl_File_E_INVAL;
+
+ rtl::OUString system_path;
+ oslFileError error = _osl_getSystemPathFromFileURL(ustrURL, &system_path.pData, sal_False);
+
+ if (osl_File_E_None != error)
+ return error;
+
+ rtl::OUString volume_root;
+ path_travel_to_volume_root(system_path, volume_root);
+
+ pInfo->uValidFields = 0;
+
+ if ((error = get_filesystem_attributes(volume_root, uFieldMask, pInfo)) != osl_File_E_None)
+ return error;
+
+ if (is_volume_space_info_request(uFieldMask))
+ get_volume_space_information(volume_root, pInfo);
+
+ if (uFieldMask & osl_VolumeInfo_Mask_DeviceHandle)
+ {
+ pInfo->uValidFields |= osl_VolumeInfo_Mask_DeviceHandle;
+ osl_getFileURLFromSystemPath(volume_root.pData, (rtl_uString**)&pInfo->pDeviceHandle);
+ }
+
+ return osl_File_E_None;
+}
+
+//#####################################################
+static oslFileError SAL_CALL osl_getDriveInfo(
+ oslDirectoryItem Item, oslFileStatus *pStatus, sal_uInt32 uFieldMask)
+{
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+ TCHAR cDrive[3] = TEXT("A:");
+ TCHAR cRoot[4] = TEXT("A:\\");
+
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ pStatus->uValidFields = 0;
+
+ cDrive[0] = pItemImpl->cDriveString[0];
+ cRoot[0] = pItemImpl->cDriveString[0];
+
+ if ( uFieldMask & osl_FileStatus_Mask_FileName )
+ {
+ if ( pItemImpl->cDriveString[0] == '\\' && pItemImpl->cDriveString[1] == '\\' )
+ {
+ LPCWSTR lpFirstBkSlash = wcschr( &pItemImpl->cDriveString[2], '\\' );
+
+ if ( lpFirstBkSlash && lpFirstBkSlash[1] )
+ {
+ LPCWSTR lpLastBkSlash = wcschr( &lpFirstBkSlash[1], '\\' );
+
+ if ( lpLastBkSlash )
+ rtl_uString_newFromStr_WithLength( &pStatus->ustrFileName, reinterpret_cast<const sal_Unicode*>(&lpFirstBkSlash[1]), lpLastBkSlash - lpFirstBkSlash - 1 );
+ else
+ rtl_uString_newFromStr( &pStatus->ustrFileName, reinterpret_cast<const sal_Unicode*>(&lpFirstBkSlash[1]) );
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+ }
+ }
+ else switch ( GetDriveType( cRoot ) )
+ {
+ case DRIVE_REMOTE:
+ {
+ TCHAR szBuffer[1024];
+ DWORD const dwBufsizeConst = ELEMENTS_OF_ARRAY(szBuffer);
+ DWORD dwBufsize = dwBufsizeConst;
+
+ DWORD dwResult = WNetGetConnection( cDrive, szBuffer, &dwBufsize );
+ if ( NO_ERROR == dwResult )
+ {
+ TCHAR szFileName[dwBufsizeConst + 16];
+
+ swprintf( szFileName, L"%s [%s]", cDrive, szBuffer );
+ rtl_uString_newFromStr( &pStatus->ustrFileName, reinterpret_cast<const sal_Unicode*>(szFileName) );
+ }
+ else
+ rtl_uString_newFromStr( &pStatus->ustrFileName, reinterpret_cast<const sal_Unicode*>(cDrive) );
+ }
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+ break;
+ case DRIVE_FIXED:
+ {
+ TCHAR szVolumeNameBuffer[1024];
+ DWORD const dwBufsizeConst = ELEMENTS_OF_ARRAY(szVolumeNameBuffer);
+
+ if ( GetVolumeInformation( cRoot, szVolumeNameBuffer, dwBufsizeConst, NULL, NULL, NULL, NULL, 0 ) )
+ {
+ TCHAR szFileName[dwBufsizeConst + 16];
+
+ swprintf( szFileName, L"%s [%s]", cDrive, szVolumeNameBuffer );
+ rtl_uString_newFromStr( &pStatus->ustrFileName, reinterpret_cast<const sal_Unicode*>(szFileName) );
+ }
+ else
+ rtl_uString_newFromStr( &pStatus->ustrFileName, reinterpret_cast<const sal_Unicode*>(cDrive) );
+ }
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+ break;
+ case DRIVE_CDROM:
+ case DRIVE_REMOVABLE:
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+ rtl_uString_newFromStr( &pStatus->ustrFileName, reinterpret_cast<const sal_Unicode*>(cRoot) );
+ break;
+ case DRIVE_UNKNOWN:
+ default:
+ break;
+ }
+ }
+
+ pStatus->eType = osl_File_Type_Volume;
+ pStatus->uValidFields |= osl_FileStatus_Mask_Type;
+
+ if ( uFieldMask & osl_FileStatus_Mask_FileURL )
+ {
+ rtl_uString *ustrSystemPath = NULL;
+
+ rtl_uString_newFromStr( &ustrSystemPath, reinterpret_cast<const sal_Unicode*>(pItemImpl->cDriveString) );
+ osl_getFileURLFromSystemPath( ustrSystemPath, &pStatus->ustrFileURL );
+ rtl_uString_release( ustrSystemPath );
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileURL;
+ }
+ return osl_File_E_None;
+}
+
+//#####################################################
+static oslFileError SAL_CALL osl_getServerInfo(
+ oslDirectoryItem Item, oslFileStatus *pStatus, sal_uInt32 uFieldMask )
+{
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ pStatus->uValidFields = 0;
+
+ // pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+
+ // if ( _tcscmp( pItemImpl->FindData.cFileName, TEXT(".") ) == 0 )
+ // rtl_uString_newFromAscii( &pStatus->ustrFileName, "/" );
+ // else
+ // rtl_uString_newFromStr( &pStatus->ustrFileName, pItemImpl->FindData.cFileName );
+
+ pStatus->eType = osl_File_Type_Directory;
+ pStatus->uValidFields |= osl_FileStatus_Mask_Type;
+
+ if ( uFieldMask & osl_FileStatus_Mask_FileURL )
+ {
+ osl_getFileURLFromSystemPath( pItemImpl->m_pFullPath, &pStatus->ustrFileURL );
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileURL;
+ }
+ return osl_File_E_None;
+}
+
+//#############################################
+oslFileError SAL_CALL osl_getFileStatus(
+ oslDirectoryItem Item,
+ oslFileStatus *pStatus,
+ sal_uInt32 uFieldMask )
+{
+ DirectoryItem_Impl *pItemImpl = (DirectoryItem_Impl *)Item;
+
+ if ( !pItemImpl )
+ return osl_File_E_INVAL;
+
+ switch ( pItemImpl->uType )
+ {
+ case DIRECTORYITEM_DRIVE:
+ return osl_getDriveInfo( Item, pStatus, uFieldMask );
+ case DIRECTORYITEM_SERVER:
+ return osl_getServerInfo( Item, pStatus, uFieldMask );
+ default:
+ break;
+ }
+
+ if ( uFieldMask & osl_FileStatus_Mask_Validate )
+ {
+ HANDLE hFind = FindFirstFile( reinterpret_cast<LPCTSTR>( rtl_uString_getStr( pItemImpl->m_pFullPath ) ), &pItemImpl->FindData );
+
+ if ( hFind != INVALID_HANDLE_VALUE )
+ FindClose( hFind );
+ else
+ return oslTranslateFileError( GetLastError() );
+
+ uFieldMask &= ~ osl_FileStatus_Mask_Validate;
+ }
+
+ /* If no fields to retrieve left ignore pStatus */
+ if ( !uFieldMask )
+ return osl_File_E_None;
+
+ /* Otherwise, this must be a valid pointer */
+ if ( !pStatus )
+ return osl_File_E_INVAL;
+
+ if ( pStatus->uStructSize != sizeof(oslFileStatus) )
+ return osl_File_E_INVAL;
+
+ pStatus->uValidFields = 0;
+
+ /* File time stamps */
+
+ if ( (uFieldMask & osl_FileStatus_Mask_ModifyTime) &&
+ FileTimeToTimeValue( &pItemImpl->FindData.ftLastWriteTime, &pStatus->aModifyTime ) )
+ pStatus->uValidFields |= osl_FileStatus_Mask_ModifyTime;
+
+ if ( (uFieldMask & osl_FileStatus_Mask_AccessTime) &&
+ FileTimeToTimeValue( &pItemImpl->FindData.ftLastAccessTime, &pStatus->aAccessTime ) )
+ pStatus->uValidFields |= osl_FileStatus_Mask_AccessTime;
+
+ if ( (uFieldMask & osl_FileStatus_Mask_CreationTime) &&
+ FileTimeToTimeValue( &pItemImpl->FindData.ftCreationTime, &pStatus->aCreationTime ) )
+ pStatus->uValidFields |= osl_FileStatus_Mask_CreationTime;
+
+ /* Most of the fields are already set, regardless of requiered fields */
+
+ rtl_uString_newFromStr( &pStatus->ustrFileName, reinterpret_cast<const sal_Unicode*>(pItemImpl->FindData.cFileName) );
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileName;
+
+ if ((FILE_ATTRIBUTE_REPARSE_POINT & pItemImpl->FindData.dwFileAttributes) &&
+ (IO_REPARSE_TAG_MOUNT_POINT == pItemImpl->FindData.dwReserved0))
+ pStatus->eType = osl_File_Type_Volume;
+ else if (pItemImpl->FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ pStatus->eType = osl_File_Type_Directory;
+ else
+ pStatus->eType = osl_File_Type_Regular;
+
+ pStatus->uValidFields |= osl_FileStatus_Mask_Type;
+
+ pStatus->uAttributes = pItemImpl->FindData.dwFileAttributes;
+ pStatus->uValidFields |= osl_FileStatus_Mask_Attributes;
+
+ pStatus->uFileSize = (sal_uInt64)pItemImpl->FindData.nFileSizeLow + ((sal_uInt64)pItemImpl->FindData.nFileSizeHigh << 32);
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileSize;
+
+ if ( uFieldMask & osl_FileStatus_Mask_LinkTargetURL )
+ {
+ osl_getFileURLFromSystemPath( pItemImpl->m_pFullPath, &pStatus->ustrLinkTargetURL );
+
+ pStatus->uValidFields |= osl_FileStatus_Mask_LinkTargetURL;
+ }
+
+ if ( uFieldMask & osl_FileStatus_Mask_FileURL )
+ {
+ if ( !pItemImpl->bFullPathNormalized )
+ {
+ sal_uInt32 nLen = rtl_uString_getLength( pItemImpl->m_pFullPath );
+ ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
+ sal_uInt32 nNewLen = GetCaseCorrectPathName( reinterpret_cast<LPCTSTR>( rtl_uString_getStr( pItemImpl->m_pFullPath ) ),
+ ::osl::mingw_reinterpret_cast<LPTSTR>( aBuffer ),
+ aBuffer.getBufSizeInSymbols(),
+ sal_True );
+
+ if ( nNewLen )
+ {
+ rtl_uString_newFromStr( &pItemImpl->m_pFullPath, aBuffer );
+ pItemImpl->bFullPathNormalized = TRUE;
+ }
+ }
+
+ osl_getFileURLFromSystemPath( pItemImpl->m_pFullPath, &pStatus->ustrFileURL );
+ pStatus->uValidFields |= osl_FileStatus_Mask_FileURL;
+ }
+
+ return osl_File_E_None;
+}
+
+//#####################################################
+// file attributes handling functions
+//#####################################################
+
+//#############################################
+oslFileError SAL_CALL osl_setFileAttributes(
+ rtl_uString *ustrFileURL,
+ sal_uInt64 uAttributes )
+{
+ oslFileError error;
+ rtl_uString *ustrSysPath = NULL;
+ DWORD dwFileAttributes;
+ BOOL fSuccess;
+
+ // Converts the normalized path into a systempath
+ error = _osl_getSystemPathFromFileURL( ustrFileURL, &ustrSysPath, sal_False );
+
+ if ( osl_File_E_None != error )
+ return error;
+
+ dwFileAttributes = GetFileAttributes( reinterpret_cast<LPCTSTR>(rtl_uString_getStr(ustrSysPath)) );
+
+ if ( (DWORD)-1 != dwFileAttributes )
+ {
+ dwFileAttributes &= ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN);
+
+ if ( uAttributes & osl_File_Attribute_ReadOnly )
+ dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
+
+ if ( uAttributes & osl_File_Attribute_Hidden )
+ dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN;
+
+ fSuccess = SetFileAttributes( reinterpret_cast<LPCTSTR>(rtl_uString_getStr(ustrSysPath)), dwFileAttributes );
+ }
+ else
+ fSuccess = FALSE;
+
+ if ( !fSuccess )
+ error = oslTranslateFileError( GetLastError() );
+
+ rtl_uString_release( ustrSysPath );
+
+ return error;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_setFileTime(
+ rtl_uString *filePath,
+ const TimeValue *aCreationTime,
+ const TimeValue *aLastAccessTime,
+ const TimeValue *aLastWriteTime)
+{
+ oslFileError error;
+ rtl_uString *sysPath=NULL;
+ FILETIME *lpCreationTime=NULL;
+ FILETIME *lpLastAccessTime=NULL;
+ FILETIME *lpLastWriteTime=NULL;
+ FILETIME ftCreationTime;
+ FILETIME ftLastAccessTime;
+ FILETIME ftLastWriteTime;
+ HANDLE hFile;
+ BOOL fSuccess;
+
+
+ error=_osl_getSystemPathFromFileURL(filePath, &sysPath, sal_False);
+
+ if (error==osl_File_E_INVAL)
+ return error;
+
+ hFile=CreateFileW(reinterpret_cast<LPCWSTR>(rtl_uString_getStr(sysPath)), GENERIC_WRITE, 0, NULL , OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ rtl_uString_release(sysPath);
+
+ if (hFile==INVALID_HANDLE_VALUE)
+ return osl_File_E_NOENT;
+
+ if (TimeValueToFileTime(aCreationTime, &ftCreationTime))
+ lpCreationTime=&ftCreationTime;
+
+ if (TimeValueToFileTime(aLastAccessTime, &ftLastAccessTime))
+ lpLastAccessTime=&ftLastAccessTime;
+
+ if (TimeValueToFileTime(aLastWriteTime, &ftLastWriteTime))
+ lpLastWriteTime=&ftLastWriteTime;
+
+ fSuccess=SetFileTime(hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime);
+
+ CloseHandle(hFile);
+
+ if (!fSuccess)
+ return osl_File_E_INVAL;
+ else
+ return osl_File_E_None;
+}
diff --git a/sal/osl/w32/file_error.c b/sal/osl/w32/file_error.c
new file mode 100644
index 000000000000..26e749cc5451
--- /dev/null
+++ b/sal/osl/w32/file_error.c
@@ -0,0 +1,151 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define UNICODE
+#define _UNICODE
+#define _WIN32_WINNT_0x0500
+#include "systools/win32/uwinapi.h"
+
+#include "file_error.h"
+
+#include "osl/diagnose.h"
+#include "osl/thread.h"
+
+/* OS error to oslFileError values mapping table */
+struct osl_file_error_entry
+{
+ unsigned long oscode; /* OS return value */
+ int errnocode; /* oslFileError code */
+};
+
+static const struct osl_file_error_entry errtable[] = {
+ { ERROR_SUCCESS, osl_File_E_None }, /* 0 */
+ { ERROR_INVALID_FUNCTION, osl_File_E_INVAL }, /* 1 */
+ { ERROR_FILE_NOT_FOUND, osl_File_E_NOENT }, /* 2 */
+ { ERROR_PATH_NOT_FOUND, osl_File_E_NOENT }, /* 3 */
+ { ERROR_TOO_MANY_OPEN_FILES, osl_File_E_MFILE }, /* 4 */
+ { ERROR_ACCESS_DENIED, osl_File_E_ACCES }, /* 5 */
+ { ERROR_INVALID_HANDLE, osl_File_E_BADF }, /* 6 */
+ { ERROR_ARENA_TRASHED, osl_File_E_NOMEM }, /* 7 */
+ { ERROR_NOT_ENOUGH_MEMORY, osl_File_E_NOMEM }, /* 8 */
+ { ERROR_INVALID_BLOCK, osl_File_E_NOMEM }, /* 9 */
+ { ERROR_BAD_ENVIRONMENT, osl_File_E_2BIG }, /* 10 */
+ { ERROR_BAD_FORMAT, osl_File_E_NOEXEC }, /* 11 */
+ { ERROR_INVALID_ACCESS, osl_File_E_INVAL }, /* 12 */
+ { ERROR_INVALID_DATA, osl_File_E_INVAL }, /* 13 */
+ { ERROR_INVALID_DRIVE, osl_File_E_NOENT }, /* 15 */
+ { ERROR_CURRENT_DIRECTORY, osl_File_E_ACCES }, /* 16 */
+ { ERROR_NOT_SAME_DEVICE, osl_File_E_XDEV }, /* 17 */
+ { ERROR_NO_MORE_FILES, osl_File_E_NOENT }, /* 18 */
+ { ERROR_NOT_READY, osl_File_E_NOTREADY }, /* 21 */
+ { ERROR_LOCK_VIOLATION, osl_File_E_ACCES }, /* 33 */
+ { ERROR_BAD_NETPATH, osl_File_E_NOENT }, /* 53 */
+ { ERROR_NETWORK_ACCESS_DENIED, osl_File_E_ACCES }, /* 65 */
+ { ERROR_BAD_NET_NAME, osl_File_E_NOENT }, /* 67 */
+ { ERROR_FILE_EXISTS, osl_File_E_EXIST }, /* 80 */
+ { ERROR_CANNOT_MAKE, osl_File_E_ACCES }, /* 82 */
+ { ERROR_FAIL_I24, osl_File_E_ACCES }, /* 83 */
+ { ERROR_INVALID_PARAMETER, osl_File_E_INVAL }, /* 87 */
+ { ERROR_NO_PROC_SLOTS, osl_File_E_AGAIN }, /* 89 */
+ { ERROR_DRIVE_LOCKED, osl_File_E_ACCES }, /* 108 */
+ { ERROR_BROKEN_PIPE, osl_File_E_PIPE }, /* 109 */
+ { ERROR_DISK_FULL, osl_File_E_NOSPC }, /* 112 */
+ { ERROR_INVALID_TARGET_HANDLE, osl_File_E_BADF }, /* 114 */
+ { ERROR_INVALID_HANDLE, osl_File_E_INVAL }, /* 124 */
+ { ERROR_WAIT_NO_CHILDREN, osl_File_E_CHILD }, /* 128 */
+ { ERROR_CHILD_NOT_COMPLETE, osl_File_E_CHILD }, /* 129 */
+ { ERROR_DIRECT_ACCESS_HANDLE, osl_File_E_BADF }, /* 130 */
+ { ERROR_NEGATIVE_SEEK, osl_File_E_INVAL }, /* 131 */
+ { ERROR_SEEK_ON_DEVICE, osl_File_E_ACCES }, /* 132 */
+ { ERROR_DIR_NOT_EMPTY, osl_File_E_NOTEMPTY }, /* 145 */
+ { ERROR_NOT_LOCKED, osl_File_E_ACCES }, /* 158 */
+ { ERROR_BAD_PATHNAME, osl_File_E_NOENT }, /* 161 */
+ { ERROR_MAX_THRDS_REACHED, osl_File_E_AGAIN }, /* 164 */
+ { ERROR_LOCK_FAILED, osl_File_E_ACCES }, /* 167 */
+ { ERROR_ALREADY_EXISTS, osl_File_E_EXIST }, /* 183 */
+ { ERROR_FILENAME_EXCED_RANGE, osl_File_E_NOENT }, /* 206 */
+ { ERROR_NESTING_NOT_ALLOWED, osl_File_E_AGAIN }, /* 215 */
+ { ERROR_DIRECTORY, osl_File_E_NOENT }, /* 267 */
+ { ERROR_NOT_ENOUGH_QUOTA, osl_File_E_NOMEM }, /* 1816 */
+ { ERROR_UNEXP_NET_ERR, osl_File_E_NETWORK } /* 59 */
+};
+
+/* The following two constants must be the minimum and maximum
+ values in the (contiguous) range of osl_File_E_xec Failure errors.
+*/
+#define MIN_EXEC_ERROR ERROR_INVALID_STARTING_CODESEG
+#define MAX_EXEC_ERROR ERROR_INFLOOP_IN_RELOC_CHAIN
+
+/* These are the low and high value in the range of errors that are
+ access violations
+*/
+#define MIN_EACCES_RANGE ERROR_WRITE_PROTECT
+#define MAX_EACCES_RANGE ERROR_SHARING_BUFFER_EXCEEDED
+
+oslFileError oslTranslateFileError (/*DWORD*/ unsigned long dwError)
+{
+ static const int n = sizeof(errtable)/sizeof(errtable[0]);
+
+ int i;
+ for (i = 0; i < n; ++i )
+ {
+ if (dwError == errtable[i].oscode)
+ return (oslFileError)(errtable[i].errnocode);
+ }
+
+ /* The error code wasn't in the table. We check for a range of
+ osl_File_E_ACCES errors or exec failure errors (ENOEXEC).
+ Otherwise osl_File_E_INVAL is returned.
+ */
+ if ( (dwError >= MIN_EACCES_RANGE) && (dwError <= MAX_EACCES_RANGE) )
+ return osl_File_E_ACCES;
+ else if ( (dwError >= MIN_EXEC_ERROR) && (dwError <= MAX_EXEC_ERROR) )
+ return osl_File_E_NOEXEC;
+ else
+ return osl_File_E_INVAL;
+}
+
+//#####################################################
+#if OSL_DEBUG_LEVEL > 0
+void _osl_warnFile( const char *message, rtl_uString *ustrFile )
+{
+ char szBuffer[2048];
+
+ if (ustrFile)
+ {
+ rtl_String *strFile = NULL;
+
+ rtl_uString2String( &strFile, rtl_uString_getStr( ustrFile ), rtl_uString_getLength( ustrFile ),
+ osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS );
+ snprintf( szBuffer, sizeof(szBuffer), message, strFile->buffer );
+ rtl_string_release( strFile );
+
+ message = szBuffer;
+ }
+ OSL_ENSURE( 0, message );
+}
+#endif /* OSL_DEBUG_LEVEL */
diff --git a/sal/osl/w32/file_error.h b/sal/osl/w32/file_error.h
new file mode 100644
index 000000000000..3815a021bb5e
--- /dev/null
+++ b/sal/osl/w32/file_error.h
@@ -0,0 +1,51 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_OSL_FILE_ERROR_H
+#define INCLUDED_OSL_FILE_ERROR_H
+
+#include "osl/file.h"
+#include "rtl/ustring.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+oslFileError oslTranslateFileError (/*DWORD*/ unsigned long dwError);
+
+#if OSL_DEBUG_LEVEL > 0
+void _osl_warnFile (const char * message, rtl_uString * ustrFile);
+#define OSL_ENSURE_FILE( cond, msg, file ) ( (cond) ? (void)0 : _osl_warnFile( msg, file ) )
+#else
+#define OSL_ENSURE_FILE( cond, msg, file ) ((void)0)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INCLUDED_OSL_FILE_ERROR_H */
diff --git a/sal/osl/w32/file_url.cxx b/sal/osl/w32/file_url.cxx
new file mode 100644
index 000000000000..90140cda97c6
--- /dev/null
+++ b/sal/osl/w32/file_url.cxx
@@ -0,0 +1,1143 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define UNICODE
+#define _UNICODE
+#define _WIN32_WINNT_0x0500
+#include "systools/win32/uwinapi.h"
+
+#include "file_url.h"
+#include "file_error.h"
+
+#include "rtl/alloc.h"
+#include "osl/diagnose.h"
+#include "osl/file.h"
+#include "osl/mutex.h"
+
+#include "path_helper.hxx"
+
+#include <stdio.h>
+#include <tchar.h>
+
+#if OSL_DEBUG_LEVEL > 0
+#define OSL_ENSURE_FILE( cond, msg, file ) ( (cond) ? (void)0 : _osl_warnFile( msg, file ) )
+#else
+#define OSL_ENSURE_FILE( cond, msg, file ) ((void)0)
+#endif
+
+#define ELEMENTS_OF_ARRAY(arr) (sizeof(arr)/(sizeof((arr)[0])))
+
+#define WSTR_SYSTEM_ROOT_PATH L"\\\\.\\"
+#define WSTR_LONG_PATH_PREFIX L"\\\\?\\"
+#define WSTR_LONG_PATH_PREFIX_UNC L"\\\\?\\UNC\\"
+
+
+//##################################################################
+// FileURL functions
+//##################################################################
+
+extern "C" oslMutex g_CurrentDirectoryMutex; /* Initialized in dllentry.c */
+oslMutex g_CurrentDirectoryMutex = 0;
+
+//#####################################################
+static BOOL IsValidFilePathComponent(
+ LPCTSTR lpComponent, LPCTSTR *lppComponentEnd, DWORD dwFlags)
+{
+ LPCTSTR lpComponentEnd = NULL;
+ LPCTSTR lpCurrent = lpComponent;
+ BOOL fValid = TRUE; /* Assume success */
+ TCHAR cLast = 0;
+
+ /* Path component length must not exceed MAX_PATH even if long path with "\\?\" prefix is used */
+
+ while ( !lpComponentEnd && lpCurrent && lpCurrent - lpComponent < MAX_PATH )
+ {
+ switch ( *lpCurrent )
+ {
+ /* Both backslash and slash determine the end of a path component */
+ case '\0':
+ case '/':
+ case '\\':
+ switch ( cLast )
+ {
+ /* Component must not end with '.' or blank and can't be empty */
+
+ case '.':
+ if ( dwFlags & VALIDATEPATH_ALLOW_ELLIPSE )
+ {
+ if ( 1 == lpCurrent - lpComponent )
+ {
+ /* Current directory is O.K. */
+ lpComponentEnd = lpCurrent;
+ break;
+ }
+ else if ( 2 == lpCurrent - lpComponent && '.' == *lpComponent )
+ {
+ /* Parent directory is O.K. */
+ lpComponentEnd = lpCurrent;
+ break;
+ }
+ }
+ case 0:
+ case ' ':
+ lpComponentEnd = lpCurrent - 1;
+ fValid = FALSE;
+ break;
+ default:
+ lpComponentEnd = lpCurrent;
+ break;
+ }
+ break;
+ /* '?' and '*' are valid wildcards but not valid file name characters */
+ case '?':
+ case '*':
+ if ( dwFlags & VALIDATEPATH_ALLOW_WILDCARDS )
+ break;
+ /* The following characters are reserved */
+ case '<':
+ case '>':
+ case '\"':
+ case '|':
+ case ':':
+ lpComponentEnd = lpCurrent;
+ fValid = FALSE;
+ break;
+ default:
+ /* Characters below ASCII 32 are not allowed */
+ if ( *lpCurrent < ' ' )
+ {
+ lpComponentEnd = lpCurrent;
+ fValid = FALSE;
+ }
+ break;
+ }
+ cLast = *lpCurrent++;
+ }
+
+ /* If we don't reached the end of the component the length of the component was to long
+ ( See condition of while loop ) */
+ if ( !lpComponentEnd )
+ {
+ fValid = FALSE;
+ lpComponentEnd = lpCurrent;
+ }
+
+ /* Test wether the component specifies a device name what is not allowed */
+
+ // MT: PERFORMANCE:
+ // This is very expensive. A lot of calls to _tcsicmp.
+ // in SRC6870m71 67.000 calls of this method while empty office start result into more than 1.500.00 calls of _tcsicmp!
+ // Possible optimizations
+ // - Array should be const static
+ // - Sorted array, use binary search
+ // - More intelligent check for com1-9, lpt1-9
+ // Maybe make szComponent upper case, don't search case intensitive
+ // Talked to HRO: Could be removed. Shouldn't be used in OOo, and if used for something like a filename, it will lead to an error anyway.
+ /*
+ if ( fValid )
+ {
+ LPCTSTR alpDeviceNames[] =
+ {
+ TEXT("CON"),
+ TEXT("PRN"),
+ TEXT("AUX"),
+ TEXT("CLOCK$"),
+ TEXT("NUL"),
+ TEXT("LPT1"),
+ TEXT("LPT2"),
+ TEXT("LPT3"),
+ TEXT("LPT4"),
+ TEXT("LPT5"),
+ TEXT("LPT6"),
+ TEXT("LPT7"),
+ TEXT("LPT8"),
+ TEXT("LPT9"),
+ TEXT("COM1"),
+ TEXT("COM2"),
+ TEXT("COM3"),
+ TEXT("COM4"),
+ TEXT("COM5"),
+ TEXT("COM6"),
+ TEXT("COM7"),
+ TEXT("COM8"),
+ TEXT("COM9")
+ };
+
+ TCHAR szComponent[MAX_PATH];
+ int nComponentLength;
+ LPCTSTR lpDot;
+ int i;
+
+ // A device name with an extension is also invalid
+ lpDot = _tcschr( lpComponent, '.' );
+
+ if ( !lpDot || lpDot > lpComponentEnd )
+ nComponentLength = lpComponentEnd - lpComponent;
+ else
+ nComponentLength = lpDot - lpComponent;
+
+ _tcsncpy( szComponent, lpComponent, nComponentLength );
+ szComponent[nComponentLength] = 0;
+
+ for ( i = 0; i < sizeof( alpDeviceNames ) / sizeof(LPCTSTR); i++ )
+ {
+ if ( 0 == _tcsicmp( szComponent, alpDeviceNames[i] ) )
+ {
+ lpComponentEnd = lpComponent;
+ fValid = FALSE;
+ break;
+ }
+ }
+ }
+ */
+
+ if ( fValid )
+ {
+ // Empty components are not allowed
+ if ( lpComponentEnd - lpComponent < 1 )
+ fValid = FALSE;
+
+ // If we reached the end of the string NULL is returned
+ else if ( !*lpComponentEnd )
+ lpComponentEnd = NULL;
+
+ }
+
+ if ( lppComponentEnd )
+ *lppComponentEnd = lpComponentEnd;
+
+ return fValid;
+}
+
+//#####################################################
+#define CHARSET_SEPARATOR TEXT("\\/")
+
+DWORD IsValidFilePath(rtl_uString *path, LPCTSTR *lppError, DWORD dwFlags, rtl_uString **corrected)
+{
+ LPCTSTR lpszPath = reinterpret_cast< LPCTSTR >(path->buffer);
+ LPCTSTR lpComponent = lpszPath;
+ BOOL fValid = TRUE;
+ DWORD dwPathType = PATHTYPE_ERROR;
+ sal_Int32 nLength = rtl_uString_getLength( path );
+
+ if ( dwFlags & VALIDATEPATH_ALLOW_RELATIVE )
+ dwFlags |= VALIDATEPATH_ALLOW_ELLIPSE;
+
+ if ( !lpszPath )
+ fValid = FALSE;
+
+ DWORD dwCandidatPathType = PATHTYPE_ERROR;
+
+ if ( 0 == rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( path->buffer, nLength, reinterpret_cast<const sal_Unicode *>(WSTR_LONG_PATH_PREFIX_UNC), ELEMENTS_OF_ARRAY(WSTR_LONG_PATH_PREFIX_UNC) - 1, ELEMENTS_OF_ARRAY(WSTR_LONG_PATH_PREFIX_UNC) - 1 ) )
+ {
+ /* This is long path in UNC notation */
+ lpComponent = lpszPath + ELEMENTS_OF_ARRAY(WSTR_LONG_PATH_PREFIX_UNC) - 1;
+ dwCandidatPathType = PATHTYPE_ABSOLUTE_UNC | PATHTYPE_IS_LONGPATH;
+ }
+ else if ( 0 == rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( path->buffer, nLength, reinterpret_cast<const sal_Unicode *>(WSTR_LONG_PATH_PREFIX), ELEMENTS_OF_ARRAY(WSTR_LONG_PATH_PREFIX) - 1, ELEMENTS_OF_ARRAY(WSTR_LONG_PATH_PREFIX) - 1 ) )
+ {
+ /* This is long path */
+ lpComponent = lpszPath + ELEMENTS_OF_ARRAY(WSTR_LONG_PATH_PREFIX) - 1;
+
+ if ( _istalpha( lpComponent[0] ) && ':' == lpComponent[1] )
+ {
+ lpComponent += 2;
+ dwCandidatPathType = PATHTYPE_ABSOLUTE_LOCAL | PATHTYPE_IS_LONGPATH;
+ }
+ }
+ else if ( 2 == _tcsspn( lpszPath, CHARSET_SEPARATOR ) )
+ {
+ /* The UNC path notation */
+ lpComponent = lpszPath + 2;
+ dwCandidatPathType = PATHTYPE_ABSOLUTE_UNC;
+ }
+ else if ( _istalpha( lpszPath[0] ) && ':' == lpszPath[1] )
+ {
+ /* Local path verification. Must start with <drive>: */
+ lpComponent = lpszPath + 2;
+ dwCandidatPathType = PATHTYPE_ABSOLUTE_LOCAL;
+ }
+
+ if ( ( dwCandidatPathType & PATHTYPE_MASK_TYPE ) == PATHTYPE_ABSOLUTE_UNC )
+ {
+ fValid = IsValidFilePathComponent( lpComponent, &lpComponent, VALIDATEPATH_ALLOW_ELLIPSE );
+
+ /* So far we have a valid servername. Now let's see if we also have a network resource */
+
+ dwPathType = dwCandidatPathType;
+
+ if ( fValid )
+ {
+ if ( lpComponent && !*++lpComponent )
+ lpComponent = NULL;
+
+ if ( !lpComponent )
+ {
+ #if 0
+ /* We only have a Server specification what is invalid */
+
+ lpComponent = lpszPath;
+ fValid = FALSE;
+ #else
+ dwPathType |= PATHTYPE_IS_SERVER;
+ #endif
+ }
+ else
+ {
+ /* Now test the network resource */
+
+ fValid = IsValidFilePathComponent( lpComponent, &lpComponent, 0 );
+
+ /* If we now reached the end of the path, everything is O.K. */
+
+
+ if ( fValid && (!lpComponent || lpComponent && !*++lpComponent ) )
+ {
+ lpComponent = NULL;
+ dwPathType |= PATHTYPE_IS_VOLUME;
+ }
+ }
+ }
+ }
+ else if ( ( dwCandidatPathType & PATHTYPE_MASK_TYPE ) == PATHTYPE_ABSOLUTE_LOCAL )
+ {
+ if ( 1 == _tcsspn( lpComponent, CHARSET_SEPARATOR ) )
+ lpComponent++;
+ else if ( *lpComponent )
+ fValid = FALSE;
+
+ dwPathType = dwCandidatPathType;
+
+ /* Now we are behind the backslash or it was a simple drive without backslash */
+
+ if ( fValid && !*lpComponent )
+ {
+ lpComponent = NULL;
+ dwPathType |= PATHTYPE_IS_VOLUME;
+ }
+ }
+ else if ( dwFlags & VALIDATEPATH_ALLOW_RELATIVE )
+ {
+ /* Can be a relative path */
+ lpComponent = lpszPath;
+
+ /* Relative path can start with a backslash */
+
+ if ( 1 == _tcsspn( lpComponent, CHARSET_SEPARATOR ) )
+ {
+ lpComponent++;
+ if ( !*lpComponent )
+ lpComponent = NULL;
+ }
+
+ dwPathType = PATHTYPE_RELATIVE;
+ }
+ else
+ {
+ /* Anything else is an error */
+ fValid = FALSE;
+ lpComponent = lpszPath;
+ }
+
+ /* Now validate each component of the path */
+ while ( fValid && lpComponent )
+ {
+ // Correct path by merging consecutive slashes:
+ if (*lpComponent == '\\' && corrected != NULL) {
+ sal_Int32 i = lpComponent - lpszPath;
+ rtl_uString_newReplaceStrAt(corrected, path, i, 1, NULL);
+ //TODO: handle out-of-memory
+ lpszPath = reinterpret_cast< LPCTSTR >((*corrected)->buffer);
+ lpComponent = lpszPath + i;
+ }
+
+ fValid = IsValidFilePathComponent( lpComponent, &lpComponent, dwFlags );
+
+ if ( fValid && lpComponent )
+ {
+ lpComponent++;
+
+ /* If the string behind the backslash is empty, we've done */
+
+ if ( !*lpComponent )
+ lpComponent = NULL;
+ }
+ }
+
+ /* The path can be longer than MAX_PATH only in case it has the longpath prefix */
+ if ( fValid && !( dwPathType & PATHTYPE_IS_LONGPATH ) && _tcslen( lpszPath ) >= MAX_PATH )
+ {
+ fValid = FALSE;
+ lpComponent = lpszPath + MAX_PATH;
+ }
+
+ if ( lppError )
+ *lppError = lpComponent;
+
+ return fValid ? dwPathType : PATHTYPE_ERROR;
+}
+
+//#####################################################
+static sal_Int32 PathRemoveFileSpec(LPTSTR lpPath, LPTSTR lpFileName, sal_Int32 nFileBufLen )
+{
+ sal_Int32 nRemoved = 0;
+
+ if ( nFileBufLen )
+ {
+ lpFileName[0] = 0;
+ LPTSTR lpLastBkSlash = _tcsrchr( lpPath, '\\' );
+ LPTSTR lpLastSlash = _tcsrchr( lpPath, '/' );
+ LPTSTR lpLastDelimiter = lpLastSlash > lpLastBkSlash ? lpLastSlash : lpLastBkSlash;
+
+ if ( lpLastDelimiter )
+ {
+ sal_Int32 nDelLen = _tcslen( lpLastDelimiter );
+ if ( 1 == nDelLen )
+ {
+ if ( lpLastDelimiter > lpPath && *(lpLastDelimiter - 1) != ':' )
+ {
+ *lpLastDelimiter = 0;
+ *lpFileName = 0;
+ nRemoved = nDelLen;
+ }
+ }
+ else if ( nDelLen && nDelLen - 1 < nFileBufLen )
+ {
+ _tcscpy( lpFileName, lpLastDelimiter + 1 );
+ *(++lpLastDelimiter) = 0;
+ nRemoved = nDelLen - 1;
+ }
+ }
+ }
+
+ return nRemoved;
+}
+
+//#####################################################
+// Undocumented in SHELL32.DLL ordinal 32
+static LPTSTR PathAddBackslash(LPTSTR lpPath, sal_Int32 nBufLen)
+{
+ LPTSTR lpEndPath = NULL;
+
+ if ( lpPath )
+ {
+ int nLen = _tcslen(lpPath);
+
+ if ( !nLen || lpPath[nLen-1] != '\\' && lpPath[nLen-1] != '/' && nLen < nBufLen - 1 )
+ {
+ lpEndPath = lpPath + nLen;
+ *lpEndPath++ = '\\';
+ *lpEndPath = 0;
+ }
+ }
+ return lpEndPath;
+}
+
+//#####################################################
+// Same as GetLongPathName but also 95/NT4
+static DWORD GetCaseCorrectPathNameEx(
+ LPTSTR lpszPath, // path buffer to convert
+ DWORD cchBuffer, // size of path buffer
+ DWORD nSkipLevels,
+ BOOL bCheckExistence )
+{
+ ::osl::LongPathBuffer< WCHAR > szFile( MAX_PATH + 1 );
+ sal_Int32 nRemoved = PathRemoveFileSpec( lpszPath, szFile, MAX_PATH + 1 );
+ sal_Int32 nLastStepRemoved = nRemoved;
+ while ( nLastStepRemoved && szFile[0] == 0 )
+ {
+ // remove separators
+ nLastStepRemoved = PathRemoveFileSpec( lpszPath, szFile, MAX_PATH + 1 );
+ nRemoved += nLastStepRemoved;
+ }
+
+ if ( nRemoved )
+ {
+ BOOL bSkipThis = FALSE;
+
+ if ( 0 == _tcscmp( szFile, TEXT("..") ) )
+ {
+ bSkipThis = TRUE;
+ nSkipLevels += 1;
+ }
+ else if ( 0 == _tcscmp( szFile, TEXT(".") ) )
+ {
+ bSkipThis = TRUE;
+ }
+ else if ( nSkipLevels )
+ {
+ bSkipThis = TRUE;
+ nSkipLevels--;
+ }
+ else
+ bSkipThis = FALSE;
+
+ GetCaseCorrectPathNameEx( lpszPath, cchBuffer, nSkipLevels, bCheckExistence );
+
+ PathAddBackslash( lpszPath, cchBuffer );
+
+ /* Analyze parent if not only a trailing backslash was cutted but a real file spec */
+ if ( !bSkipThis )
+ {
+ if ( bCheckExistence )
+ {
+ ::osl::LongPathBuffer< WCHAR > aShortPath( MAX_LONG_PATH );
+ _tcscpy( aShortPath, lpszPath );
+ _tcscat( aShortPath, szFile );
+
+ WIN32_FIND_DATA aFindFileData;
+ HANDLE hFind = FindFirstFile( aShortPath, &aFindFileData );
+
+ if ( IsValidHandle(hFind) )
+ {
+ _tcscat( lpszPath, aFindFileData.cFileName[0] ? aFindFileData.cFileName : aFindFileData.cAlternateFileName );
+
+ FindClose( hFind );
+ }
+ else
+ lpszPath[0] = 0;
+ }
+ else
+ {
+ /* add the segment name back */
+ _tcscat( lpszPath, szFile );
+ }
+ }
+ }
+ else
+ {
+ /* File specification can't be removed therefore the short path is either a drive
+ or a network share. If still levels to skip are left, the path specification
+ tries to travel below the file system root */
+ if ( nSkipLevels )
+ lpszPath[0] = 0;
+ else
+ _tcsupr( lpszPath );
+ }
+
+ return _tcslen( lpszPath );
+}
+
+//#####################################################
+#define WSTR_SYSTEM_ROOT_PATH L"\\\\.\\"
+
+DWORD GetCaseCorrectPathName(
+ LPCTSTR lpszShortPath, // file name
+ LPTSTR lpszLongPath, // path buffer
+ DWORD cchBuffer, // size of path buffer
+ BOOL bCheckExistence
+)
+{
+ /* Special handling for "\\.\" as system root */
+ if ( lpszShortPath && 0 == wcscmp( lpszShortPath, WSTR_SYSTEM_ROOT_PATH ) )
+ {
+ if ( cchBuffer >= ELEMENTS_OF_ARRAY(WSTR_SYSTEM_ROOT_PATH) )
+ {
+ wcscpy( lpszLongPath, WSTR_SYSTEM_ROOT_PATH );
+ return ELEMENTS_OF_ARRAY(WSTR_SYSTEM_ROOT_PATH) - 1;
+ }
+ else
+ {
+ return ELEMENTS_OF_ARRAY(WSTR_SYSTEM_ROOT_PATH) - 1;
+ }
+ }
+ else if ( lpszShortPath )
+ {
+ if ( _tcslen( lpszShortPath ) <= cchBuffer )
+ {
+ _tcscpy( lpszLongPath, lpszShortPath );
+ return GetCaseCorrectPathNameEx( lpszLongPath, cchBuffer, 0, bCheckExistence );
+ }
+ }
+
+ return 0;
+}
+
+
+//#############################################
+static sal_Bool _osl_decodeURL( rtl_String* strUTF8, rtl_uString** pstrDecodedURL )
+{
+ sal_Char *pBuffer;
+ const sal_Char *pSrcEnd;
+ const sal_Char *pSrc;
+ sal_Char *pDest;
+ sal_Int32 nSrcLen;
+ sal_Bool bValidEncoded = sal_True; /* Assume success */
+
+ /* The resulting decoded string length is shorter or equal to the source length */
+
+ nSrcLen = rtl_string_getLength(strUTF8);
+ pBuffer = reinterpret_cast<sal_Char*>(rtl_allocateMemory(nSrcLen + 1));
+
+ pDest = pBuffer;
+ pSrc = rtl_string_getStr(strUTF8);
+ pSrcEnd = pSrc + nSrcLen;
+
+ /* Now decode the URL what should result in an UTF8 string */
+ while ( bValidEncoded && pSrc < pSrcEnd )
+ {
+ switch ( *pSrc )
+ {
+ case '%':
+ {
+ sal_Char aToken[3];
+ sal_Char aChar;
+
+ pSrc++;
+ aToken[0] = *pSrc++;
+ aToken[1] = *pSrc++;
+ aToken[2] = 0;
+
+ aChar = (sal_Char)strtoul( aToken, NULL, 16 );
+
+ /* The chars are path delimiters and must not be encoded */
+
+ if ( 0 == aChar || '\\' == aChar || '/' == aChar || ':' == aChar )
+ bValidEncoded = sal_False;
+ else
+ *pDest++ = aChar;
+ }
+ break;
+ default:
+ *pDest++ = *pSrc++;
+ break;
+ }
+ }
+
+ *pDest++ = 0;
+
+ if ( bValidEncoded )
+ {
+ rtl_string2UString( pstrDecodedURL, pBuffer, rtl_str_getLength(pBuffer), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*pstrDecodedURL != 0);
+ }
+
+ rtl_freeMemory( pBuffer );
+
+ return bValidEncoded;
+}
+
+//#############################################
+static void _osl_encodeURL( rtl_uString *strURL, rtl_String **pstrEncodedURL )
+{
+ /* Encode non ascii characters within the URL */
+
+ rtl_String *strUTF8 = NULL;
+ sal_Char *pszEncodedURL;
+ const sal_Char *pURLScan;
+ sal_Char *pURLDest;
+ sal_Int32 nURLScanLen;
+ sal_Int32 nURLScanCount;
+
+ rtl_uString2String( &strUTF8, rtl_uString_getStr( strURL ), rtl_uString_getLength( strURL ), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ pszEncodedURL = (sal_Char*) rtl_allocateMemory( (rtl_string_getLength( strUTF8 ) * 3 + 1) * sizeof(sal_Char) );
+
+ pURLDest = pszEncodedURL;
+ pURLScan = rtl_string_getStr( strUTF8 );
+ nURLScanLen = rtl_string_getLength( strUTF8 );
+ nURLScanCount = 0;
+
+ while ( nURLScanCount < nURLScanLen )
+ {
+ sal_Char cCurrent = *pURLScan;
+ switch ( cCurrent )
+ {
+ default:
+ if (!( ( cCurrent >= 'a' && cCurrent <= 'z' ) || ( cCurrent >= 'A' && cCurrent <= 'Z' ) || ( cCurrent >= '0' && cCurrent <= '9' ) ) )
+ {
+ sprintf( pURLDest, "%%%02X", (unsigned char)cCurrent );
+ pURLDest += 3;
+ break;
+ }
+ case '!':
+ case '\'':
+ case '(':
+ case ')':
+ case '*':
+ case '-':
+ case '.':
+ case '_':
+ case '~':
+ case '$':
+ case '&':
+ case '+':
+ case ',':
+ case '=':
+ case '@':
+ case ':':
+ case '/':
+ case '\\':
+ case '|':
+ *pURLDest++ = cCurrent;
+ break;
+ case 0:
+ break;
+ }
+
+ pURLScan++;
+ nURLScanCount++;
+ }
+
+ *pURLDest = 0;
+
+ rtl_string_release( strUTF8 );
+ rtl_string_newFromStr( pstrEncodedURL, pszEncodedURL );
+ rtl_freeMemory( pszEncodedURL );
+}
+
+//#############################################
+
+oslFileError _osl_getSystemPathFromFileURL( rtl_uString *strURL, rtl_uString **pustrPath, sal_Bool bAllowRelative )
+{
+ rtl_String *strUTF8 = NULL;
+ rtl_uString *strDecodedURL = NULL;
+ rtl_uString *strTempPath = NULL;
+ const sal_Unicode *pDecodedURL;
+ sal_uInt32 nDecodedLen;
+ sal_Bool bValidEncoded;
+ oslFileError nError = osl_File_E_INVAL; /* Assume failure */
+
+ /* If someone hasn't encoded the complete URL we convert it to UTF8 now to prevent from
+ having a mixed encoded URL later */
+
+ rtl_uString2String( &strUTF8, rtl_uString_getStr( strURL ), rtl_uString_getLength( strURL ), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS );
+
+ /* If the length of strUTF8 and strURL differs it indicates that the URL was not correct encoded */
+
+ OSL_ENSURE_FILE(
+ strUTF8->length == strURL->length ||
+ 0 != rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( strURL->buffer, strURL->length, "file:\\\\", 7 )
+ ,"osl_getSystemPathFromFileURL: \"%s\" is not encoded !!!", strURL );
+
+ bValidEncoded = _osl_decodeURL( strUTF8, &strDecodedURL );
+
+ /* Release the encoded UTF8 string */
+ rtl_string_release( strUTF8 );
+
+ if ( bValidEncoded )
+ {
+ /* Replace backslashes and pipes */
+
+ rtl_uString_newReplace( &strDecodedURL, strDecodedURL, '/', '\\' );
+ rtl_uString_newReplace( &strDecodedURL, strDecodedURL, '|', ':' );
+
+ pDecodedURL = rtl_uString_getStr( strDecodedURL );
+ nDecodedLen = rtl_uString_getLength( strDecodedURL );
+
+ /* Must start with "file://" */
+ if ( 0 == rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pDecodedURL, nDecodedLen, "file:\\\\", 7 ) )
+ {
+ sal_uInt32 nSkip;
+
+ if ( 0 == rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pDecodedURL, nDecodedLen, "file:\\\\\\", 8 ) )
+ nSkip = 8;
+ else if (
+ 0 == rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pDecodedURL, nDecodedLen, "file:\\\\localhost\\", 17 ) ||
+ 0 == rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pDecodedURL, nDecodedLen, "file:\\\\127.0.0.1\\", 17 )
+ )
+ nSkip = 17;
+ else
+ nSkip = 5;
+
+ /* Indicates local root */
+ if ( nDecodedLen == nSkip )
+ rtl_uString_newFromStr_WithLength( &strTempPath, reinterpret_cast<const sal_Unicode*>(WSTR_SYSTEM_ROOT_PATH), ELEMENTS_OF_ARRAY(WSTR_SYSTEM_ROOT_PATH) - 1 );
+ else
+ {
+ /* do not separate the directory and file case, so the maximal path lengs without prefix is MAX_PATH-12 */
+ if ( nDecodedLen - nSkip <= MAX_PATH - 12 )
+ {
+ rtl_uString_newFromStr_WithLength( &strTempPath, pDecodedURL + nSkip, nDecodedLen - nSkip );
+ }
+ else
+ {
+ ::osl::LongPathBuffer< sal_Unicode > aBuf( MAX_LONG_PATH );
+ sal_uInt32 nNewLen = GetCaseCorrectPathName( reinterpret_cast<LPCTSTR>(pDecodedURL + nSkip),
+ ::osl::mingw_reinterpret_cast<LPTSTR>(aBuf),
+ aBuf.getBufSizeInSymbols(),
+ sal_False );
+
+ if ( nNewLen <= MAX_PATH - 12
+ || 0 == rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( pDecodedURL + nSkip, nDecodedLen - nSkip, reinterpret_cast<const sal_Unicode*>(WSTR_SYSTEM_ROOT_PATH), ELEMENTS_OF_ARRAY(WSTR_SYSTEM_ROOT_PATH) - 1, ELEMENTS_OF_ARRAY(WSTR_SYSTEM_ROOT_PATH) - 1 )
+ || 0 == rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( pDecodedURL + nSkip, nDecodedLen - nSkip, reinterpret_cast<const sal_Unicode*>(WSTR_LONG_PATH_PREFIX), ELEMENTS_OF_ARRAY(WSTR_LONG_PATH_PREFIX) - 1, ELEMENTS_OF_ARRAY(WSTR_LONG_PATH_PREFIX) - 1 ) )
+ {
+ rtl_uString_newFromStr_WithLength( &strTempPath, aBuf, nNewLen );
+ }
+ else if ( pDecodedURL[nSkip] == (sal_Unicode)'\\' && pDecodedURL[nSkip+1] == (sal_Unicode)'\\' )
+ {
+ /* it should be an UNC path, use the according prefix */
+ rtl_uString *strSuffix = NULL;
+ rtl_uString *strPrefix = NULL;
+ rtl_uString_newFromStr_WithLength( &strPrefix, reinterpret_cast<const sal_Unicode*>(WSTR_LONG_PATH_PREFIX_UNC), ELEMENTS_OF_ARRAY( WSTR_LONG_PATH_PREFIX_UNC ) - 1 );
+ rtl_uString_newFromStr_WithLength( &strSuffix, aBuf + 2, nNewLen - 2 );
+
+ rtl_uString_newConcat( &strTempPath, strPrefix, strSuffix );
+
+ rtl_uString_release( strPrefix );
+ rtl_uString_release( strSuffix );
+ }
+ else
+ {
+ rtl_uString *strSuffix = NULL;
+ rtl_uString *strPrefix = NULL;
+ rtl_uString_newFromStr_WithLength( &strPrefix, reinterpret_cast<const sal_Unicode*>(WSTR_LONG_PATH_PREFIX), ELEMENTS_OF_ARRAY( WSTR_LONG_PATH_PREFIX ) - 1 );
+ rtl_uString_newFromStr_WithLength( &strSuffix, aBuf, nNewLen );
+
+ rtl_uString_newConcat( &strTempPath, strPrefix, strSuffix );
+
+ rtl_uString_release( strPrefix );
+ rtl_uString_release( strSuffix );
+ }
+ }
+ }
+
+ if ( IsValidFilePath( strTempPath, NULL, VALIDATEPATH_ALLOW_ELLIPSE, &strTempPath ) )
+ nError = osl_File_E_None;
+ }
+ else if ( bAllowRelative ) /* This maybe a relative file URL */
+ {
+ /* In future the relative path could be converted to absolute if it is too long */
+ rtl_uString_assign( &strTempPath, strDecodedURL );
+
+ if ( IsValidFilePath( strTempPath, NULL, VALIDATEPATH_ALLOW_RELATIVE | VALIDATEPATH_ALLOW_ELLIPSE, &strTempPath ) )
+ nError = osl_File_E_None;
+ }
+ /*
+ else
+ OSL_ENSURE_FILE( !nError, "osl_getSystemPathFromFileURL: \"%s\" is not an absolute FileURL !!!", strURL );
+ */
+
+ }
+
+ if ( strDecodedURL )
+ rtl_uString_release( strDecodedURL );
+
+ if ( osl_File_E_None == nError )
+ rtl_uString_assign( pustrPath, strTempPath );
+
+ if ( strTempPath )
+ rtl_uString_release( strTempPath );
+
+ /*
+ OSL_ENSURE_FILE( !nError, "osl_getSystemPathFromFileURL: \"%s\" is not a FileURL !!!", strURL );
+ */
+
+ return nError;
+}
+
+//#############################################
+oslFileError _osl_getFileURLFromSystemPath( rtl_uString* strPath, rtl_uString** pstrURL )
+{
+ oslFileError nError = osl_File_E_INVAL; /* Assume failure */
+ rtl_uString *strTempURL = NULL;
+ DWORD dwPathType = PATHTYPE_ERROR;
+
+ if (strPath)
+ dwPathType = IsValidFilePath(strPath, NULL, VALIDATEPATH_ALLOW_RELATIVE, NULL);
+
+ if (dwPathType)
+ {
+ rtl_uString *strTempPath = NULL;
+
+ if ( dwPathType & PATHTYPE_IS_LONGPATH )
+ {
+ rtl_uString *strBuffer = NULL;
+ sal_uInt32 nIgnore = 0;
+ sal_uInt32 nLength = 0;
+
+ /* the path has the longpath prefix, lets remove it */
+ switch ( dwPathType & PATHTYPE_MASK_TYPE )
+ {
+ case PATHTYPE_ABSOLUTE_UNC:
+ nIgnore = ELEMENTS_OF_ARRAY( WSTR_LONG_PATH_PREFIX_UNC ) - 1;
+ OSL_ENSURE( nIgnore == 8, "Unexpected long path UNC prefix!" );
+
+ /* generate the normal UNC path */
+ nLength = rtl_uString_getLength( strPath );
+ rtl_uString_newFromStr_WithLength( &strBuffer, strPath->buffer + nIgnore - 2, nLength - nIgnore + 2 );
+ strBuffer->buffer[0] = '\\';
+
+ rtl_uString_newReplace( &strTempPath, strBuffer, '\\', '/' );
+ rtl_uString_release( strBuffer );
+ break;
+
+ case PATHTYPE_ABSOLUTE_LOCAL:
+ nIgnore = ELEMENTS_OF_ARRAY( WSTR_LONG_PATH_PREFIX ) - 1;
+ OSL_ENSURE( nIgnore == 4, "Unexpected long path prefix!" );
+
+ /* generate the normal path */
+ nLength = rtl_uString_getLength( strPath );
+ rtl_uString_newFromStr_WithLength( &strBuffer, strPath->buffer + nIgnore, nLength - nIgnore );
+
+ rtl_uString_newReplace( &strTempPath, strBuffer, '\\', '/' );
+ rtl_uString_release( strBuffer );
+ break;
+
+ default:
+ OSL_ASSERT( "Unexpected long path format!" );
+ rtl_uString_newReplace( &strTempPath, strPath, '\\', '/' );
+ break;
+ }
+ }
+ else
+ {
+ /* Replace backslashes */
+ rtl_uString_newReplace( &strTempPath, strPath, '\\', '/' );
+ }
+
+ switch ( dwPathType & PATHTYPE_MASK_TYPE )
+ {
+ case PATHTYPE_RELATIVE:
+ rtl_uString_assign( &strTempURL, strTempPath );
+ nError = osl_File_E_None;
+ break;
+ case PATHTYPE_ABSOLUTE_UNC:
+ rtl_uString_newFromAscii( &strTempURL, "file:" );
+ rtl_uString_newConcat( &strTempURL, strTempURL, strTempPath );
+ nError = osl_File_E_None;
+ break;
+ case PATHTYPE_ABSOLUTE_LOCAL:
+ rtl_uString_newFromAscii( &strTempURL, "file:///" );
+ rtl_uString_newConcat( &strTempURL, strTempURL, strTempPath );
+ nError = osl_File_E_None;
+ break;
+ default:
+ break;
+ }
+
+ /* Release temp path */
+ rtl_uString_release( strTempPath );
+ }
+
+ if ( osl_File_E_None == nError )
+ {
+ rtl_String *strEncodedURL = NULL;
+
+ /* Encode the URL */
+ _osl_encodeURL( strTempURL, &strEncodedURL );
+
+ /* Provide URL via unicode string */
+ rtl_string2UString( pstrURL, rtl_string_getStr(strEncodedURL), rtl_string_getLength(strEncodedURL), RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS );
+ OSL_ASSERT(*pstrURL != 0);
+ rtl_string_release( strEncodedURL );
+ }
+
+ /* Release temp URL */
+ if ( strTempURL )
+ rtl_uString_release( strTempURL );
+
+ /*
+ OSL_ENSURE_FILE( !nError, "osl_getFileURLFromSystemPath: \"%s\" is not a systemPath !!!", strPath );
+ */
+ return nError;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_getFileURLFromSystemPath(
+ rtl_uString* ustrPath, rtl_uString** pustrURL )
+{
+ return _osl_getFileURLFromSystemPath( ustrPath, pustrURL );
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_getSystemPathFromFileURL(
+ rtl_uString *ustrURL, rtl_uString **pustrPath)
+{
+ return _osl_getSystemPathFromFileURL( ustrURL, pustrPath, sal_True );
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_searchFileURL(
+ rtl_uString *ustrFileName,
+ rtl_uString *ustrSystemSearchPath,
+ rtl_uString **pustrPath)
+{
+ rtl_uString *ustrUNCPath = NULL;
+ rtl_uString *ustrSysPath = NULL;
+ oslFileError error;
+
+ /* First try to interpret the file name as an URL even a relative one */
+ error = _osl_getSystemPathFromFileURL( ustrFileName, &ustrUNCPath, sal_True );
+
+ /* So far we either have an UNC path or something invalid
+ Now create a system path */
+ if ( osl_File_E_None == error )
+ error = _osl_getSystemPathFromFileURL( ustrUNCPath, &ustrSysPath, sal_True );
+
+ if ( osl_File_E_None == error )
+ {
+ DWORD nBufferLength;
+ DWORD dwResult;
+ LPTSTR lpBuffer = NULL;
+ LPTSTR lpszFilePart;
+
+ /* Repeat calling SearchPath ...
+ Start with MAX_PATH for the buffer. In most cases this
+ will be enough and does not force the loop to runtwice */
+ dwResult = MAX_PATH;
+
+ do
+ {
+ /* If search path is empty use a NULL pointer instead according to MSDN documentation of SearchPath */
+ LPCTSTR lpszSearchPath = ustrSystemSearchPath && ustrSystemSearchPath->length ? reinterpret_cast<LPCTSTR>(ustrSystemSearchPath->buffer) : NULL;
+ LPCTSTR lpszSearchFile = reinterpret_cast<LPCTSTR>(ustrSysPath->buffer);
+
+ /* Allocate space for buffer according to previous returned count of required chars */
+ /* +1 is not neccessary if we follow MSDN documentation but for robustness we do so */
+ nBufferLength = dwResult + 1;
+ lpBuffer = lpBuffer ?
+ reinterpret_cast<LPTSTR>(rtl_reallocateMemory(lpBuffer, nBufferLength * sizeof(TCHAR))) :
+ reinterpret_cast<LPTSTR>(rtl_allocateMemory(nBufferLength * sizeof(TCHAR)));
+
+ dwResult = SearchPath( lpszSearchPath, lpszSearchFile, NULL, nBufferLength, lpBuffer, &lpszFilePart );
+ } while ( dwResult && dwResult >= nBufferLength );
+
+ /* ... until an error occures or buffer is large enough.
+ dwResult == nBufferLength can not happen according to documentation but lets be robust ;-) */
+
+ if ( dwResult )
+ {
+ rtl_uString_newFromStr( &ustrSysPath, reinterpret_cast<const sal_Unicode*>(lpBuffer) );
+ error = osl_getFileURLFromSystemPath( ustrSysPath, pustrPath );
+ }
+ else
+ {
+ WIN32_FIND_DATA aFindFileData;
+ HANDLE hFind;
+
+ /* Somthing went wrong, perhaps the path was absolute */
+ error = oslTranslateFileError( GetLastError() );
+
+ hFind = FindFirstFile( reinterpret_cast<LPCTSTR>(ustrSysPath->buffer), &aFindFileData );
+
+ if ( IsValidHandle(hFind) )
+ {
+ error = osl_getFileURLFromSystemPath( ustrSysPath, pustrPath );
+ FindClose( hFind );
+ }
+ }
+
+ rtl_freeMemory( lpBuffer );
+ }
+
+ if ( ustrSysPath )
+ rtl_uString_release( ustrSysPath );
+
+ if ( ustrUNCPath )
+ rtl_uString_release( ustrUNCPath );
+
+ return error;
+}
+
+//#####################################################
+
+oslFileError SAL_CALL osl_getAbsoluteFileURL( rtl_uString* ustrBaseURL, rtl_uString* ustrRelativeURL, rtl_uString** pustrAbsoluteURL )
+{
+ oslFileError eError;
+ rtl_uString *ustrRelSysPath = NULL;
+ rtl_uString *ustrBaseSysPath = NULL;
+
+ if ( ustrBaseURL && ustrBaseURL->length )
+ {
+ eError = _osl_getSystemPathFromFileURL( ustrBaseURL, &ustrBaseSysPath, sal_False );
+ OSL_ENSURE( osl_File_E_None == eError, "osl_getAbsoluteFileURL called with relative or invalid base URL" );
+
+ eError = _osl_getSystemPathFromFileURL( ustrRelativeURL, &ustrRelSysPath, sal_True );
+ }
+ else
+ {
+ eError = _osl_getSystemPathFromFileURL( ustrRelativeURL, &ustrRelSysPath, sal_False );
+ OSL_ENSURE( osl_File_E_None == eError, "osl_getAbsoluteFileURL called with empty base URL and/or invalid relative URL" );
+ }
+
+ if ( !eError )
+ {
+ ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
+ ::osl::LongPathBuffer< sal_Unicode > aCurrentDir( MAX_LONG_PATH );
+ LPTSTR lpFilePart = NULL;
+ DWORD dwResult;
+
+/*@@@ToDo
+ Bad, bad hack, this only works if the base path
+ really exists which is not necessary according
+ to RFC2396
+ The whole FileURL implementation should be merged
+ with the rtl/uri class.
+*/
+ if ( ustrBaseSysPath )
+ {
+ osl_acquireMutex( g_CurrentDirectoryMutex );
+
+ GetCurrentDirectoryW( aCurrentDir.getBufSizeInSymbols(), ::osl::mingw_reinterpret_cast<LPWSTR>(aCurrentDir) );
+ SetCurrentDirectoryW( reinterpret_cast<LPCWSTR>(ustrBaseSysPath->buffer) );
+ }
+
+ dwResult = GetFullPathNameW( reinterpret_cast<LPCWSTR>(ustrRelSysPath->buffer), aBuffer.getBufSizeInSymbols(), ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer), &lpFilePart );
+
+ if ( ustrBaseSysPath )
+ {
+ SetCurrentDirectoryW( ::osl::mingw_reinterpret_cast<LPCWSTR>(aCurrentDir) );
+
+ osl_releaseMutex( g_CurrentDirectoryMutex );
+ }
+
+ if ( dwResult )
+ {
+ if ( dwResult >= aBuffer.getBufSizeInSymbols() )
+ eError = osl_File_E_INVAL;
+ else
+ {
+ rtl_uString *ustrAbsSysPath = NULL;
+
+ rtl_uString_newFromStr( &ustrAbsSysPath, aBuffer );
+
+ eError = osl_getFileURLFromSystemPath( ustrAbsSysPath, pustrAbsoluteURL );
+
+ if ( ustrAbsSysPath )
+ rtl_uString_release( ustrAbsSysPath );
+ }
+ }
+ else
+ eError = oslTranslateFileError( GetLastError() );
+ }
+
+ if ( ustrBaseSysPath )
+ rtl_uString_release( ustrBaseSysPath );
+
+ if ( ustrRelSysPath )
+ rtl_uString_release( ustrRelSysPath );
+
+ return eError;
+}
+
+//#####################################################
+oslFileError SAL_CALL osl_getCanonicalName( rtl_uString *strRequested, rtl_uString **strValid )
+{
+ rtl_uString_newFromString(strValid, strRequested);
+ return osl_File_E_None;
+}
diff --git a/sal/osl/w32/file_url.h b/sal/osl/w32/file_url.h
new file mode 100644
index 000000000000..d9137c8c2fcc
--- /dev/null
+++ b/sal/osl/w32/file_url.h
@@ -0,0 +1,96 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_OSL_FILE_URL_H
+#define INCLUDED_OSL_FILE_URL_H
+
+#include "sal/types.h"
+#include "rtl/ustring.h"
+#include "osl/file.h"
+
+#ifdef _MSC_VER
+#pragma warning(push,1)
+#endif
+
+#define WINDOWS_LEAN_AND_MEAN
+#include <windows.h>
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PATHTYPE_ERROR 0
+#define PATHTYPE_RELATIVE 1
+#define PATHTYPE_ABSOLUTE_UNC 2
+#define PATHTYPE_ABSOLUTE_LOCAL 3
+#define PATHTYPE_MASK_TYPE 0xFF
+#define PATHTYPE_IS_VOLUME 0x0100
+#define PATHTYPE_IS_SERVER 0x0200
+#define PATHTYPE_IS_LONGPATH 0x0400
+
+#define VALIDATEPATH_NORMAL 0x0000
+#define VALIDATEPATH_ALLOW_WILDCARDS 0x0001
+#define VALIDATEPATH_ALLOW_ELLIPSE 0x0002
+#define VALIDATEPATH_ALLOW_RELATIVE 0x0004
+#define VALIDATEPATH_ALLOW_UNC 0x0008
+
+#define MAX_LONG_PATH 32767
+
+DWORD IsValidFilePath (
+ rtl_uString * path,
+ LPCTSTR * lppError,
+ DWORD dwFlags,
+ rtl_uString ** corrected
+);
+
+DWORD GetCaseCorrectPathName (
+ LPCTSTR lpszShortPath, // file name
+ LPTSTR lpszLongPath, // path buffer
+ DWORD cchBuffer, // size of path buffer
+ BOOL bCheckExistence
+);
+
+oslFileError _osl_getSystemPathFromFileURL (
+ rtl_uString * strURL,
+ rtl_uString ** pustrPath,
+ sal_Bool bAllowRelative
+);
+
+oslFileError _osl_getFileURLFromSystemPath (
+ rtl_uString * strPath,
+ rtl_uString ** pstrURL
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INCLUDED_OSL_FILE_URL_H */
diff --git a/sal/osl/w32/interlck.c b/sal/osl/w32/interlck.c
new file mode 100644
index 000000000000..14589e56184a
--- /dev/null
+++ b/sal/osl/w32/interlck.c
@@ -0,0 +1,142 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/interlck.h>
+#include <osl/diagnose.h>
+
+extern int osl_isSingleCPU;
+
+/* For all Intel x86 above x486 we use a spezial inline assembler implementation.
+ The main reason is that WIN9? does not return the result of the operation.
+ Instead there is only returned a value greater than zero is the increment
+ result is greater than zero, but not the the result of the addition.
+ For Windows NT the native function could be used, because the correct result
+ is returned. Beacuse of simpler code maintance and performace reasons we use
+ on every x86-Windows-Platform the inline assembler implementation.
+*/
+
+/*****************************************************************************/
+/* osl_incrementInterlockedCount */
+/*****************************************************************************/
+oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount)
+#ifdef _M_IX86
+#ifdef __MINGW32__
+{
+ asm
+ (
+ " movl %0, %%ecx\n"
+ " movl $1, %%eax\n"
+ " movl %1, %%edx\n"
+ " cmpl $0, %%edx\n"
+ " je 1f\n"
+ " xadd %%eax, (%%ecx)\n"
+ " jmp 2f\n"
+ "1:\n"
+ " lock xadd %%eax, (%%ecx)\n"
+ "2:\n"
+ " incl %%eax\n"
+ ::"m"(pCount),"m"(osl_isSingleCPU)
+ );
+}
+#else
+#pragma warning(disable: 4035)
+{
+ __asm
+ {
+ mov ecx, pCount
+ mov eax, 1
+ mov edx, osl_isSingleCPU
+ cmp edx, 0
+ je is_not_single
+ xadd dword ptr [ecx],eax
+ jmp cont
+ is_not_single:
+ lock xadd dword ptr [ecx],eax
+ cont:
+ inc eax
+ }
+}
+#pragma warning(default: 4035)
+#endif
+#else
+#pragma message("WARNING: Using system InterlockedIncrement")
+{
+ return (InterlockedIncrement(pCount));
+}
+#endif
+
+/*****************************************************************************/
+/* osl_decrementInterlockedCount */
+/*****************************************************************************/
+oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount)
+#ifdef _M_IX86
+#ifdef __MINGW32__
+{
+ asm
+ (
+ " movl %0, %%ecx\n"
+ " orl $-1, %%eax\n"
+ " movl %1, %%edx\n"
+ " cmpl $0, %%edx\n"
+ " je 1f\n"
+ " xadd %%eax, (%%ecx)\n"
+ " jmp 2f\n"
+ "1:\n"
+ " lock xadd %%eax, (%%ecx)\n"
+ "2:\n"
+ " decl %%eax\n"
+ ::"m"(pCount),"m"(osl_isSingleCPU)
+ );
+}
+#else
+#pragma warning(disable: 4035)
+{
+ __asm
+ {
+ mov ecx, pCount
+ or eax, -1
+ mov edx, osl_isSingleCPU
+ cmp edx, 0
+ je is_not_single
+ xadd dword ptr [ecx],eax
+ jmp cont
+ is_not_single:
+ lock xadd dword ptr [ecx],eax
+ cont:
+ dec eax
+ }
+}
+#pragma warning(default: 4035)
+#endif
+#else
+#pragma message("WARNING: Using system InterlockedDecrement")
+{
+ return (InterlockedDecrement(pCount));
+}
+#endif
diff --git a/sal/osl/w32/libutil.c b/sal/osl/w32/libutil.c
new file mode 100644
index 000000000000..e00aef2e158d
--- /dev/null
+++ b/sal/osl/w32/libutil.c
@@ -0,0 +1,54 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifdef _MSC_VER
+#pragma warning(push,1) /* disable warnings within system headers */
+#endif
+#include <windows.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+static BOOL g_bInit = FALSE;
+static DWORD g_dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;
+
+DWORD GetPlatformId()
+{
+
+ if (!g_bInit)
+ {
+ OSVERSIONINFO aInfo;
+
+ aInfo.dwOSVersionInfoSize = sizeof(aInfo);
+ if (GetVersionEx(&aInfo))
+ g_dwPlatformId = aInfo.dwPlatformId;
+
+ g_bInit = TRUE;
+ }
+
+ return g_dwPlatformId;
+}
diff --git a/sal/osl/w32/module.cxx b/sal/osl/w32/module.cxx
new file mode 100644
index 000000000000..b730bd3347df
--- /dev/null
+++ b/sal/osl/w32/module.cxx
@@ -0,0 +1,480 @@
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#include "system.h"
+#include <tlhelp32.h>
+
+#include "file_url.h"
+#include "path_helper.hxx"
+
+#include <osl/module.h>
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <osl/file.h>
+#include <rtl/logfile.h>
+
+/*
+ under WIN32, we use the void* oslModule
+ as a WIN32 HANDLE (which is also a 32-bit value)
+*/
+
+/*****************************************************************************/
+/* osl_loadModule */
+/*****************************************************************************/
+oslModule SAL_CALL osl_loadModule(rtl_uString *strModuleName, sal_Int32 nRtldMode )
+{
+ HINSTANCE hInstance;
+ UINT errorMode = SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
+ rtl_uString* Module = NULL;
+ oslModule ret = 0;
+ oslFileError nError;
+
+ RTL_LOGFILE_TRACE1( "{ osl_loadModule start: %S", (LPTSTR)&strModuleName->buffer );
+
+ OSL_ASSERT(strModuleName);
+
+ nRtldMode = nRtldMode; /* avoid warnings */
+
+ nError = osl_getSystemPathFromFileURL(strModuleName, &Module);
+
+ if ( osl_File_E_None != nError )
+ rtl_uString_assign(&Module, strModuleName);
+
+ hInstance = LoadLibraryW(reinterpret_cast<LPCWSTR>(Module->buffer));
+ if (hInstance == NULL)
+ hInstance = LoadLibraryExW(reinterpret_cast<LPCWSTR>(Module->buffer), NULL,
+ LOAD_WITH_ALTERED_SEARCH_PATH);
+
+ if (hInstance <= (HINSTANCE)HINSTANCE_ERROR)
+ hInstance = 0;
+
+ ret = (oslModule) hInstance;
+ rtl_uString_release(Module);
+ SetErrorMode(errorMode);
+
+ RTL_LOGFILE_TRACE1( "} osl_loadModule end: %S", (LPTSTR)&strModuleName->buffer );
+
+ return ret;
+}
+
+/*****************************************************************************/
+/* osl_getModuleHandle */
+/*****************************************************************************/
+
+sal_Bool SAL_CALL
+osl_getModuleHandle(rtl_uString *pModuleName, oslModule *pResult)
+{
+ HINSTANCE hInstance = GetModuleHandleW(reinterpret_cast<LPCWSTR>(pModuleName->buffer));
+ if( hInstance )
+ {
+ *pResult = (oslModule) hInstance;
+ return sal_True;
+ }
+
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_unloadModule */
+/*****************************************************************************/
+void SAL_CALL osl_unloadModule(oslModule Module)
+{
+ FreeLibrary((HINSTANCE)Module);
+}
+
+/*****************************************************************************/
+/* osl_getSymbol */
+/*****************************************************************************/
+void* SAL_CALL osl_getSymbol(oslModule Module, rtl_uString *strSymbolName)
+{
+ /* casting from a function pointer to a data pointer is invalid
+ be in this case unavoidable because the API has to stay
+ compitable we need to keep this function which returns a
+ void* by definition */
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4054)
+#endif
+ return (void*)(osl_getFunctionSymbol(Module, strSymbolName));
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+}
+
+/*****************************************************************************/
+/* osl_getFunctionSymbol */
+/*****************************************************************************/
+oslGenericFunction SAL_CALL osl_getFunctionSymbol( oslModule Module, rtl_uString *strSymbolName )
+{
+ rtl_String *symbolName = NULL;
+ oslGenericFunction address;
+
+ OSL_ASSERT(Module);
+ OSL_ASSERT(strSymbolName);
+
+ rtl_uString2String(
+ &symbolName,
+ strSymbolName->buffer,
+ strSymbolName->length,
+ RTL_TEXTENCODING_UTF8,
+ OUSTRING_TO_OSTRING_CVTFLAGS
+ );
+
+ address=osl_getAsciiFunctionSymbol(Module, rtl_string_getStr(symbolName));
+ rtl_string_release(symbolName);
+
+ return address;
+}
+
+/*****************************************************************************/
+/* osl_getAsciiFunctionSymbol */
+/*****************************************************************************/
+oslGenericFunction SAL_CALL
+osl_getAsciiFunctionSymbol( oslModule Module, const sal_Char *pSymbol )
+{
+ oslGenericFunction fncAddr = NULL;
+
+ if( pSymbol )
+ fncAddr=(oslGenericFunction)GetProcAddress((HINSTANCE) Module, pSymbol);
+
+ return fncAddr;
+}
+
+
+
+/*****************************************************************************/
+/* osl_addressGetModuleURL */
+/*****************************************************************************/
+
+/*****************************************************************************/
+/* Implementation for Windows 95, 98 and Me */
+/*****************************************************************************/
+
+/* Undefine because there is no explicit "A" definition */
+
+#ifdef MODULEENTRY32
+#undef MODULEENTRY32
+#endif
+
+#ifdef LPMODULEENTRY32
+#undef LPMODULEENTRY32
+#endif
+
+typedef HANDLE (WINAPI *CreateToolhelp32Snapshot_PROC)( DWORD dwFlags, DWORD th32ProcessID );
+typedef BOOL (WINAPI *Module32First_PROC)( HANDLE hSnapshot, LPMODULEENTRY32 lpme32 );
+typedef BOOL (WINAPI *Module32Next_PROC)( HANDLE hSnapshot, LPMODULEENTRY32 lpme32 );
+
+static sal_Bool SAL_CALL _osl_addressGetModuleURL_Windows( void *pv, rtl_uString **pustrURL )
+{
+ sal_Bool bSuccess = sal_False; /* Assume failure */
+ HMODULE hModKernel32 = GetModuleHandleA( "KERNEL32.DLL" );
+
+ if ( hModKernel32 )
+ {
+ CreateToolhelp32Snapshot_PROC lpfnCreateToolhelp32Snapshot = (CreateToolhelp32Snapshot_PROC)GetProcAddress( hModKernel32, "CreateToolhelp32Snapshot" );
+ Module32First_PROC lpfnModule32First = (Module32First_PROC)GetProcAddress( hModKernel32, "Module32First" );
+ Module32Next_PROC lpfnModule32Next = (Module32Next_PROC)GetProcAddress( hModKernel32, "Module32Next" );
+
+ if ( lpfnCreateToolhelp32Snapshot && lpfnModule32First && lpfnModule32Next )
+ {
+ HANDLE hModuleSnap = NULL;
+ DWORD dwProcessId = GetCurrentProcessId();
+
+ // Take a snapshot of all modules in the specified process.
+
+ hModuleSnap = lpfnCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId );
+
+ if ( INVALID_HANDLE_VALUE != hModuleSnap )
+ {
+ MODULEENTRY32 me32 = {0};
+
+ // Fill the size of the structure before using it.
+
+ me32.dwSize = sizeof(MODULEENTRY32);
+
+ // Walk the module list of the process, and find the module of
+ // interest. Then copy the information to the buffer pointed
+ // to by lpMe32 so that it can be returned to the caller.
+
+ if ( lpfnModule32First(hModuleSnap, &me32) )
+ {
+ do
+ {
+ if ( (BYTE *)pv >= (BYTE *)me32.hModule && (BYTE *)pv < (BYTE *)me32.hModule + me32.modBaseSize )
+ {
+ rtl_uString *ustrSysPath = NULL;
+
+ rtl_string2UString( &ustrSysPath, me32.szExePath, strlen(me32.szExePath), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(ustrSysPath != NULL);
+ osl_getFileURLFromSystemPath( ustrSysPath, pustrURL );
+ rtl_uString_release( ustrSysPath );
+
+ bSuccess = sal_True;
+ }
+
+ } while ( !bSuccess && lpfnModule32Next( hModuleSnap, &me32 ) );
+ }
+
+
+ // Do not forget to clean up the snapshot object.
+
+ CloseHandle (hModuleSnap);
+ }
+
+ }
+ }
+
+ return bSuccess;
+}
+
+/***************************************************************************************/
+/* Implementation for Windows NT, 2K and XP (2K and XP could use the above method too) */
+/***************************************************************************************/
+
+#ifdef _MSC_VER
+#pragma warning(push,1) /* disable warnings within system headers */
+#endif
+#include <imagehlp.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+typedef BOOL (WINAPI *SymInitialize_PROC)(
+ HANDLE hProcess,
+ LPSTR UserSearchPath,
+ BOOL fInvadeProcess
+ );
+
+typedef BOOL (WINAPI *SymCleanup_PROC)(
+ HANDLE hProcess
+ );
+
+typedef BOOL (WINAPI *SymGetModuleInfo_PROC)(
+ HANDLE hProcess,
+ DWORD dwAddr,
+ PIMAGEHLP_MODULE ModuleInfo
+ );
+
+/* Seems that IMAGEHLP.DLL is always availiable on NT 4. But MSDN from Platform SDK says Win 2K is required. MSDN from VS 6.0a says
+ it's O.K on NT 4 ???!!!
+ BTW: We are using ANSI function because not all version of IMAGEHLP.DLL contain Unicode support
+*/
+
+static sal_Bool SAL_CALL _osl_addressGetModuleURL_NT4( void *pv, rtl_uString **pustrURL )
+{
+ sal_Bool bSuccess = sal_False; /* Assume failure */
+
+ /* IMAGEHELP.DLL has a bug that it recursivly scans subdirectories of
+ the root when calling SymInitialize(), so we preferr DBGHELP.DLL
+ which exports the same symbols and is shipped with OOo */
+
+ HMODULE hModImageHelp = LoadLibrary( "DBGHELP.DLL" );
+
+ if ( !hModImageHelp )
+ hModImageHelp = LoadLibrary( "IMAGEHLP.DLL" );
+
+ if ( hModImageHelp )
+ {
+ SymGetModuleInfo_PROC lpfnSymGetModuleInfo;
+ SymInitialize_PROC lpfnSymInitialize;
+ SymCleanup_PROC lpfnSymCleanup;
+
+
+ lpfnSymInitialize = (SymInitialize_PROC)GetProcAddress( hModImageHelp, "SymInitialize" );
+ lpfnSymCleanup = (SymCleanup_PROC)GetProcAddress( hModImageHelp, "SymCleanup" );
+ lpfnSymGetModuleInfo = (SymGetModuleInfo_PROC)GetProcAddress( hModImageHelp, "SymGetModuleInfo" );
+
+
+ if ( lpfnSymInitialize && lpfnSymCleanup && lpfnSymGetModuleInfo )
+ {
+ IMAGEHLP_MODULE ModuleInfo;
+ ::osl::LongPathBuffer< sal_Char > aModuleFileName( MAX_LONG_PATH );
+ LPSTR lpSearchPath = NULL;
+
+ if ( GetModuleFileNameA( NULL, aModuleFileName, aModuleFileName.getBufSizeInSymbols() ) )
+ {
+ char *pLastBkSlash = strrchr( aModuleFileName, '\\' );
+
+ if (
+ pLastBkSlash &&
+ pLastBkSlash > (sal_Char*)aModuleFileName
+ && *(pLastBkSlash - 1) != ':'
+ && *(pLastBkSlash - 1) != '\\'
+ )
+ {
+ *pLastBkSlash = 0;
+ lpSearchPath = aModuleFileName;
+ }
+ }
+
+ lpfnSymInitialize( GetCurrentProcess(), lpSearchPath, TRUE );
+
+ ZeroMemory( &ModuleInfo, sizeof(ModuleInfo) );
+ ModuleInfo.SizeOfStruct = sizeof(ModuleInfo);
+
+ bSuccess = (sal_Bool)(!!lpfnSymGetModuleInfo( GetCurrentProcess(), (DWORD)pv, &ModuleInfo ));
+
+ if ( bSuccess )
+ {
+ /* #99182 On localized (non-english) NT4 and XP (!!!) for some libraries the LoadedImageName member of ModuleInfo isn't filled. Because
+ other members ModuleName and ImageName do not contain the full path we can cast the Member
+ BaseOfImage to a HMODULE (on NT it's the same) and use GetModuleFileName to retrieve the full
+ path of the loaded image */
+
+ if ( ModuleInfo.LoadedImageName[0] || GetModuleFileNameA( (HMODULE)ModuleInfo.BaseOfImage, ModuleInfo.LoadedImageName, sizeof(ModuleInfo.LoadedImageName) ) )
+ {
+ rtl_uString *ustrSysPath = NULL;
+
+ rtl_string2UString( &ustrSysPath, ModuleInfo.LoadedImageName, strlen(ModuleInfo.LoadedImageName), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(ustrSysPath != NULL);
+ osl_getFileURLFromSystemPath( ustrSysPath, pustrURL );
+ rtl_uString_release( ustrSysPath );
+ }
+ else
+ bSuccess = sal_False;
+ }
+
+ lpfnSymCleanup( GetCurrentProcess() );
+ }
+
+ FreeLibrary( hModImageHelp );
+ }
+
+ return bSuccess;
+}
+
+
+typedef struct _MODULEINFO {
+ LPVOID lpBaseOfDll;
+ DWORD SizeOfImage;
+ LPVOID EntryPoint;
+} MODULEINFO, *LPMODULEINFO;
+
+typedef BOOL (WINAPI *EnumProcessModules_PROC)(
+ HANDLE hProcess, // handle to the process
+ HMODULE * lphModule, // array to receive the module handles
+ DWORD cb, // size of the array
+ LPDWORD lpcbNeeded // receives the number of bytes returned
+);
+
+typedef BOOL (WINAPI *GetModuleInformation_PROC)(
+ HANDLE hProcess, // handle to the process
+ HMODULE hModule, // handle to the module
+ LPMODULEINFO lpmodinfo, // structure that receives information
+ DWORD cb // size of the structure
+);
+
+#define bufsizeof(buffer) (sizeof(buffer) / sizeof((buffer)[0]))
+
+/* This version can fail because PSAPI.DLL is not always part of NT 4 despite MSDN Libary 6.0a say so */
+
+static sal_Bool SAL_CALL _osl_addressGetModuleURL_NT( void *pv, rtl_uString **pustrURL )
+{
+ sal_Bool bSuccess = sal_False; /* Assume failure */
+ static HMODULE hModPsapi = NULL;
+
+ if ( !hModPsapi )
+ hModPsapi = LoadLibrary( "PSAPI.DLL" );
+
+ if ( hModPsapi )
+ {
+ EnumProcessModules_PROC lpfnEnumProcessModules = (EnumProcessModules_PROC)GetProcAddress( hModPsapi, "EnumProcessModules" );
+ GetModuleInformation_PROC lpfnGetModuleInformation = (GetModuleInformation_PROC)GetProcAddress( hModPsapi, "GetModuleInformation" );
+
+ if ( lpfnEnumProcessModules && lpfnGetModuleInformation )
+ {
+ DWORD cbNeeded = 0;
+ HMODULE *lpModules = NULL;
+ DWORD nModules = 0;
+ UINT iModule = 0;
+ MODULEINFO modinfo;
+
+ lpfnEnumProcessModules( GetCurrentProcess(), NULL, 0, &cbNeeded );
+
+ lpModules = (HMODULE *)_alloca( cbNeeded );
+ lpfnEnumProcessModules( GetCurrentProcess(), lpModules, cbNeeded, &cbNeeded );
+
+ nModules = cbNeeded / sizeof(HMODULE);
+
+ for ( iModule = 0; !bSuccess && iModule < nModules; iModule++ )
+ {
+ lpfnGetModuleInformation( GetCurrentProcess(), lpModules[iModule], &modinfo, sizeof(modinfo) );
+
+ if ( (BYTE *)pv >= (BYTE *)modinfo.lpBaseOfDll && (BYTE *)pv < (BYTE *)modinfo.lpBaseOfDll + modinfo.SizeOfImage )
+ {
+ ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
+ rtl_uString *ustrSysPath = NULL;
+
+ GetModuleFileNameW( lpModules[iModule], ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer), aBuffer.getBufSizeInSymbols() );
+
+ rtl_uString_newFromStr( &ustrSysPath, aBuffer );
+ osl_getFileURLFromSystemPath( ustrSysPath, pustrURL );
+ rtl_uString_release( ustrSysPath );
+
+ bSuccess = sal_True;
+ }
+ }
+ }
+
+ }
+
+ return bSuccess;
+}
+
+/*****************************************************************************/
+/* Dispatcher for osl_osl_addressGetModuleURL */
+/*****************************************************************************/
+
+sal_Bool SAL_CALL osl_getModuleURLFromAddress( void *pv, rtl_uString **pustrURL )
+{
+ /* Use ..._NT first because ..._NT4 is much slower */
+ if ( IS_NT )
+ return _osl_addressGetModuleURL_NT( pv, pustrURL ) || _osl_addressGetModuleURL_NT4( pv, pustrURL );
+ else
+ return _osl_addressGetModuleURL_Windows( pv, pustrURL );
+}
+
+/*****************************************************************************/
+/* osl_getModuleURLFromFunctionAddress */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_getModuleURLFromFunctionAddress( oslGenericFunction addr, rtl_uString ** ppLibraryUrl )
+{
+ /* casting a function pointer to a data pointer (void*) is
+ not allowed according to the C/C++ standards. In this case
+ it is unavoidable because we have to stay compatible we
+ cannot remove any function. */
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4054)
+#endif
+ return osl_getModuleURLFromAddress((void*)addr, ppLibraryUrl);
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+}
+
+
diff --git a/sal/osl/w32/mutex.c b/sal/osl/w32/mutex.c
new file mode 100644
index 000000000000..db16459d7fe7
--- /dev/null
+++ b/sal/osl/w32/mutex.c
@@ -0,0 +1,206 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/mutex.h>
+#include <osl/diagnose.h>
+
+/*
+ Implementation notes:
+ The void* hidden by oslMutex points to a WIN32
+ CRITICAL_SECTION structure.
+*/
+
+typedef struct _oslMutexImpl {
+ CRITICAL_SECTION m_Mutex;
+ int m_Locks;
+ DWORD m_Owner;
+ DWORD m_Requests;
+} oslMutexImpl;
+
+static BOOL (WINAPI *lpfTryEnterCriticalSection)(LPCRITICAL_SECTION)
+ = (BOOL (WINAPI *)(LPCRITICAL_SECTION))0xFFFFFFFF;
+
+static CRITICAL_SECTION MutexLock;
+
+/*****************************************************************************/
+/* osl_createMutex */
+/*****************************************************************************/
+oslMutex SAL_CALL osl_createMutex(void)
+{
+ oslMutexImpl *pMutexImpl;
+
+ /* Window 95 does not support "TryEnterCriticalSection" */
+
+ if (lpfTryEnterCriticalSection ==
+ (BOOL (WINAPI *)(LPCRITICAL_SECTION))0xFFFFFFFF)
+ {
+ OSVERSIONINFO VersionInformation =
+
+ {
+ sizeof(OSVERSIONINFO),
+ 0,
+ 0,
+ 0,
+ 0,
+ "",
+ };
+
+ /* ts: Window 98 does not support "TryEnterCriticalSection" but export the symbol !!!
+ calls to that symbol always returns FALSE */
+ if (
+ GetVersionEx(&VersionInformation) &&
+ (VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ )
+ {
+ lpfTryEnterCriticalSection = (BOOL (WINAPI *)(LPCRITICAL_SECTION))
+ GetProcAddress(GetModuleHandle("KERNEL32"),
+ "TryEnterCriticalSection");
+ }
+ else
+ {
+ lpfTryEnterCriticalSection = (BOOL (WINAPI *)(LPCRITICAL_SECTION))NULL;
+ }
+
+
+ InitializeCriticalSection(&MutexLock);
+ }
+
+ pMutexImpl= calloc(sizeof(oslMutexImpl), 1);
+
+ OSL_ASSERT(pMutexImpl); /* alloc successful? */
+
+ InitializeCriticalSection(&pMutexImpl->m_Mutex);
+
+ return (oslMutex)pMutexImpl;
+}
+
+/*****************************************************************************/
+/* osl_destroyMutex */
+/*****************************************************************************/
+void SAL_CALL osl_destroyMutex(oslMutex Mutex)
+{
+ oslMutexImpl *pMutexImpl = (oslMutexImpl *)Mutex;
+
+ if (pMutexImpl)
+ {
+ DeleteCriticalSection(&pMutexImpl->m_Mutex);
+ free(pMutexImpl);
+ }
+}
+
+/*****************************************************************************/
+/* osl_acquireMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_acquireMutex(oslMutex Mutex)
+{
+ oslMutexImpl *pMutexImpl = (oslMutexImpl *)Mutex;
+
+ OSL_ASSERT(Mutex);
+
+ if (lpfTryEnterCriticalSection == NULL)
+ {
+ EnterCriticalSection(&MutexLock);
+ pMutexImpl->m_Requests++;
+ LeaveCriticalSection(&MutexLock);
+
+ EnterCriticalSection(&pMutexImpl->m_Mutex);
+
+ EnterCriticalSection(&MutexLock);
+ pMutexImpl->m_Requests--;
+ if (pMutexImpl->m_Locks++ == 0)
+ pMutexImpl->m_Owner = GetCurrentThreadId();
+ LeaveCriticalSection(&MutexLock);
+ }
+ else
+ EnterCriticalSection(&pMutexImpl->m_Mutex);
+
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_tryToAcquireMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_tryToAcquireMutex(oslMutex Mutex)
+{
+ sal_Bool ret = sal_False;
+ oslMutexImpl *pMutexImpl = (oslMutexImpl *)Mutex;
+
+ OSL_ASSERT(Mutex);
+
+ if (lpfTryEnterCriticalSection != NULL)
+ return (sal_Bool)(lpfTryEnterCriticalSection(&pMutexImpl->m_Mutex) != FALSE);
+ else
+ {
+ EnterCriticalSection(&MutexLock);
+
+ if ( ((pMutexImpl->m_Requests == 0) && (pMutexImpl->m_Locks == 0)) ||
+ (pMutexImpl->m_Owner == GetCurrentThreadId()) )
+ ret = osl_acquireMutex(Mutex);
+
+ LeaveCriticalSection(&MutexLock);
+ }
+
+ return ret;
+}
+
+/*****************************************************************************/
+/* osl_releaseMutex */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_releaseMutex(oslMutex Mutex)
+{
+ oslMutexImpl *pMutexImpl = (oslMutexImpl *)Mutex;
+
+ OSL_ASSERT(Mutex);
+
+ if (lpfTryEnterCriticalSection == NULL)
+ {
+ EnterCriticalSection(&MutexLock);
+
+ if (--(pMutexImpl->m_Locks) == 0)
+ pMutexImpl->m_Owner = 0;
+
+ LeaveCriticalSection(&MutexLock);
+ }
+
+ LeaveCriticalSection(&pMutexImpl->m_Mutex);
+
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_getGlobalMutex */
+/*****************************************************************************/
+
+/* initialized in dllentry.c */
+oslMutex g_Mutex;
+
+oslMutex * SAL_CALL osl_getGlobalMutex(void)
+{
+ return &g_Mutex;
+}
diff --git a/sal/osl/w32/nlsupport.c b/sal/osl/w32/nlsupport.c
new file mode 100644
index 000000000000..ad9de5f8492c
--- /dev/null
+++ b/sal/osl/w32/nlsupport.c
@@ -0,0 +1,231 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define UNICODE
+#ifdef _MSC_VER
+#pragma warning(push,1) /* disable warnings within system headers */
+#endif
+#include <windows.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#include <wchar.h>
+
+#include <osl/mutex.h>
+#include <osl/nlsupport.h>
+#include <osl/diagnose.h>
+#include <osl/process.h>
+#include <rtl/tencinfo.h>
+
+struct EnumLocalesParams
+{
+ WCHAR Language[3];
+ WCHAR Country[3];
+ LCID Locale;
+};
+
+static DWORD g_dwTLSLocaleEncId = (DWORD) -1;
+
+/*****************************************************************************/
+/* callback function test
+/*
+/* osl_getTextEncodingFromLocale calls EnumSystemLocalesA, so that we don't
+/* need to provide a unicode wrapper for this function under Win9x
+/* that means the callback function has an ansi prototype and receives
+/* the locale strings as ansi strings
+/*****************************************************************************/
+
+BOOL CALLBACK EnumLocalesProcA( LPSTR lpLocaleStringA )
+{
+ struct EnumLocalesParams * params;
+
+ LCID localeId;
+ LPSTR pszEndA;
+
+ WCHAR langCode[4];
+
+ /* convert hex-string to LCID */
+ localeId = strtol( lpLocaleStringA, &pszEndA, 16 );
+
+ /* check params received via TLS */
+ params = (struct EnumLocalesParams *) TlsGetValue( g_dwTLSLocaleEncId );
+ if( NULL == params || '\0' == params->Language[0] )
+ return FALSE;
+
+ /*
+ get the ISO language code for this locale
+
+ remeber: we call the GetLocaleInfoW function
+ because the ansi version of this function returns
+ an error under WinNT/2000 when called with an
+ unicode only lcid
+ */
+ if( GetLocaleInfo( localeId, LOCALE_SISO639LANGNAME , langCode, 4 ) )
+ {
+ WCHAR ctryCode[4];
+
+ /* continue if language code does not match */
+ if( 0 != wcscmp( langCode, params->Language ) )
+ return TRUE;
+
+ /* check if country code is set and equals the current locale */
+ if( '\0' != params->Country[0] && GetLocaleInfo( localeId, LOCALE_SISO3166CTRYNAME , ctryCode, 4 ) )
+ {
+ /* save return value in TLS and break if found desired locale */
+ if( 0 == wcscmp( ctryCode, params->Country ) )
+ {
+ params->Locale = localeId;
+ return FALSE;
+ }
+ }
+ else
+ {
+ /* fill with default values for that language */
+ LANGID langId = LANGIDFROMLCID( localeId );
+
+ /* exchange sublanguage with SUBLANG_NEUTRAL */
+ langId = MAKELANGID( PRIMARYLANGID( langId ), SUBLANG_NEUTRAL );
+
+ /* and use default sorting order */
+ params->Locale = MAKELCID( langId, SORT_DEFAULT );
+
+ return FALSE;
+ }
+ }
+
+ /* retry by going on */
+ return TRUE;
+}
+
+
+/*****************************************************************************/
+/* GetTextEncodingFromLCID
+/*****************************************************************************/
+
+rtl_TextEncoding GetTextEncodingFromLCID( LCID localeId )
+{
+ rtl_TextEncoding Encoding = RTL_TEXTENCODING_DONTKNOW;
+ WCHAR ansiCP[6];
+
+ /* query ansi codepage for given locale */
+ if( localeId && GetLocaleInfo( localeId, LOCALE_IDEFAULTANSICODEPAGE, ansiCP, 6 ) )
+ {
+ /* if GetLocaleInfo returns "0", it is a UNICODE only locale */
+ if( 0 != wcscmp( ansiCP, L"0" ) )
+ {
+ WCHAR *pwcEnd;
+ UINT codepage;
+
+ /* values returned from GetLocaleInfo are dezimal based */
+ codepage = wcstol( ansiCP, &pwcEnd, 10 );
+
+ /* find matching rtl encoding */
+ Encoding = rtl_getTextEncodingFromWindowsCodePage( codepage );
+ }
+ else
+ Encoding = RTL_TEXTENCODING_UNICODE;
+ }
+
+ return Encoding;
+}
+
+
+/*****************************************************************************/
+/* osl_getTextEncodingFromLocale
+/*****************************************************************************/
+
+rtl_TextEncoding SAL_CALL osl_getTextEncodingFromLocale( rtl_Locale * pLocale )
+{
+ struct EnumLocalesParams params = { L"", L"", 0 };
+
+ /* initialise global TLS id */
+ if( (DWORD) -1 == g_dwTLSLocaleEncId )
+ {
+ oslMutex globalMutex = * osl_getGlobalMutex();
+
+ /* initializing must be thread save */
+ osl_acquireMutex( globalMutex );
+
+ if( (DWORD) -1 == g_dwTLSLocaleEncId )
+ g_dwTLSLocaleEncId = TlsAlloc();
+
+ osl_releaseMutex( globalMutex );
+ }
+
+ /* if pLocale is NULL, use process locale as default */
+ if( NULL == pLocale )
+ osl_getProcessLocale( &pLocale );
+
+ /* copy in parameters to structure */
+ if( pLocale && pLocale->Language )
+ {
+ wcscpy( params.Language, pLocale->Language->buffer );
+
+ if( pLocale->Country )
+ wcscpy( params.Country, pLocale->Country->buffer );
+
+ /* save pointer to local structure in TLS */
+ TlsSetValue( g_dwTLSLocaleEncId, &params );
+
+ /* enum all locales known to Windows */
+ EnumSystemLocalesA( EnumLocalesProcA, LCID_SUPPORTED );
+
+ /* use the LCID found in iteration */
+ return GetTextEncodingFromLCID( params.Locale );
+ }
+
+ return RTL_TEXTENCODING_DONTKNOW;
+}
+
+/*****************************************************************************/
+/* imp_getProcessLocale
+/*****************************************************************************/
+
+void _imp_getProcessLocale( rtl_Locale ** ppLocale )
+{
+ WCHAR langCode[4];
+ WCHAR ctryCode[4];
+ LCID localeId;
+
+ OSL_ASSERT( ppLocale );
+
+ /* get the LCID to retrieve information from */
+ localeId = GetUserDefaultLCID();
+
+ /* call GetLocaleInfo to retrieve the iso codes */
+ if( GetLocaleInfo( localeId, LOCALE_SISO639LANGNAME , langCode, 4 ) &&
+ GetLocaleInfo( localeId, LOCALE_SISO3166CTRYNAME , ctryCode, 4 ) )
+ {
+ *ppLocale = rtl_locale_register( langCode, ctryCode, L"" );
+ }
+ else
+ {
+ *ppLocale = rtl_locale_register( L"C", L"", L"" );
+ }
+}
+
+
diff --git a/sal/osl/w32/path_helper.cxx b/sal/osl/w32/path_helper.cxx
new file mode 100644
index 000000000000..a43ff8bca1d8
--- /dev/null
+++ b/sal/osl/w32/path_helper.cxx
@@ -0,0 +1,118 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/*******************************************************************
+ Includes
+ ******************************************************************/
+
+#include "path_helper.hxx"
+#include <osl/diagnose.h>
+#include <rtl/ustring.hxx>
+
+#include <algorithm>
+#include <wchar.h>
+
+/*******************************************************************
+ Constants
+ ******************************************************************/
+
+const rtl::OUString BACKSLASH = rtl::OUString::createFromAscii("\\");
+const rtl::OUString SLASH = rtl::OUString::createFromAscii("/");
+
+/*******************************************************************
+ osl_systemPathEnsureSeparator
+ ******************************************************************/
+
+void osl_systemPathEnsureSeparator(/*inout*/ rtl_uString** ppustrPath)
+{
+ OSL_PRECOND(ppustrPath && (NULL != *ppustrPath), \
+ "osl_systemPathEnsureSeparator: Invalid parameter");
+
+ rtl::OUString path(*ppustrPath);
+ sal_Int32 i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), path.lastIndexOf(SLASH));
+
+ if (i < (path.getLength()-1))
+ {
+ path += BACKSLASH;
+ rtl_uString_assign(ppustrPath, path.pData);
+ }
+
+ OSL_POSTCOND(path.lastIndexOf(BACKSLASH) == (path.getLength() - 1), \
+ "osl_systemPathEnsureSeparator: Post condition failed");
+}
+
+/*******************************************************************
+ osl_systemPathRemoveSeparator
+ ******************************************************************/
+
+void SAL_CALL osl_systemPathRemoveSeparator(/*inout*/ rtl_uString** ppustrPath)
+{
+ rtl::OUString path(*ppustrPath);
+
+ if (!osl::systemPathIsLogicalDrivePattern(path))
+ {
+ sal_Int32 i = std::max<sal_Int32>(path.lastIndexOf(BACKSLASH), path.lastIndexOf(SLASH));
+
+ if (i > -1 && (i == (path.getLength() - 1)))
+ {
+ path = rtl::OUString(path.getStr(), path.getLength() - 1);
+ rtl_uString_assign(ppustrPath, path.pData);
+ }
+ }
+}
+
+/*******************************************************************
+ osl_is_logical_drive_pattern
+ ******************************************************************/
+
+// is [A-Za-z]:[/|\]\0
+const sal_Char* LDP = ":";
+const sal_Char* LDP_WITH_BACKSLASH = ":\\";
+const sal_Char* LDP_WITH_SLASH = ":/";
+
+// degenerated case returned by the Windows FileOpen dialog
+// when someone enters for instance "x:filename", the Win32
+// API accepts this case
+const sal_Char* LDP_WITH_DOT_BACKSLASH = ":.\\";
+
+sal_Int32 osl_systemPathIsLogicalDrivePattern(/*in*/ const rtl_uString* pustrPath)
+{
+ const sal_Unicode* p = rtl_uString_getStr(const_cast<rtl_uString*>(pustrPath));
+ if (iswalpha(*p++))
+ {
+ return ((0 == rtl_ustr_ascii_compare(p, LDP)) ||
+ (0 == rtl_ustr_ascii_compare(p, LDP_WITH_BACKSLASH)) ||
+ (0 == rtl_ustr_ascii_compare(p, LDP_WITH_SLASH)) ||
+ (0 == rtl_ustr_ascii_compare(p, LDP_WITH_DOT_BACKSLASH)));
+ }
+ return 0;
+}
+
+
diff --git a/sal/osl/w32/path_helper.h b/sal/osl/w32/path_helper.h
new file mode 100644
index 000000000000..79341f538667
--- /dev/null
+++ b/sal/osl/w32/path_helper.h
@@ -0,0 +1,70 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _PATH_HELPER_H_
+#define _PATH_HELPER_H_
+
+#include <sal/types.h>
+#include <rtl/ustring.h>
+#include <osl/file.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*******************************************************************
+ osl_systemPathEnsureSeparator
+ Adds a trailing path separator to the given system path if not
+ already there and if the path is not the root path or a logical
+ drive alone
+ ******************************************************************/
+
+void osl_systemPathEnsureSeparator(/*inout*/ rtl_uString** ppustrPath);
+
+/*******************************************************************
+ osl_systemPathRemoveSeparator
+ Removes the last separator from the given system path if any and
+ if the path is not the root path '\'
+ ******************************************************************/
+
+void SAL_CALL osl_systemPathRemoveSeparator(/*inout*/ rtl_uString** ppustrPath);
+
+/*******************************************************************
+ osl_is_logical_drive_pattern
+ Returns whether a given path is only a logical drive pattern or not.
+ A logical drive pattern is something like "a:\", "c:\".
+ No logical drive pattern is something like "c:\test"
+ ******************************************************************/
+
+sal_Int32 osl_systemPathIsLogicalDrivePattern(/*in*/ const rtl_uString* pustrPath);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/sal/osl/w32/path_helper.hxx b/sal/osl/w32/path_helper.hxx
new file mode 100644
index 000000000000..d157b42aa428
--- /dev/null
+++ b/sal/osl/w32/path_helper.hxx
@@ -0,0 +1,118 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifdef _MSC_VER
+#pragma warning (disable : 4800)
+#endif
+
+#ifndef _PATH_HELPER_HXX_
+#define _PATH_HELPER_HXX_
+
+#include "path_helper.h"
+#include <rtl/ustring.hxx>
+#include <rtl/allocator.hxx>
+
+namespace osl
+{
+
+/*******************************************************************
+ osl_systemPathEnsureSeparator
+ Adds a trailing path separator to the given system path if not
+ already there and if the path is not the root path or a logical
+ drive alone
+ ******************************************************************/
+
+inline void systemPathEnsureSeparator(/*inout*/ rtl::OUString& Path)
+{
+ osl_systemPathEnsureSeparator(&Path.pData);
+}
+
+/*******************************************************************
+ osl_systemPathRemoveSeparator
+ Removes the last separator from the given system path if any and
+ if the path is not the root path '\'
+ ******************************************************************/
+
+inline void systemPathRemoveSeparator(/*inout*/ rtl::OUString& Path)
+{
+ osl_systemPathRemoveSeparator(&Path.pData);
+}
+
+/*******************************************************************
+ osl_systemPathIsLogicalDrivePattern
+ ******************************************************************/
+
+inline bool systemPathIsLogicalDrivePattern(/*in*/ const rtl::OUString& path)
+{
+ return osl_systemPathIsLogicalDrivePattern(path.pData);
+}
+
+/*******************************************************************
+ LongPathBuffer
+ ******************************************************************/
+template< class T >
+class LongPathBuffer
+{
+ T* m_pBuffer;
+ sal_uInt32 m_nCharNum;
+
+ LongPathBuffer();
+ LongPathBuffer( const LongPathBuffer& );
+ LongPathBuffer& operator=( const LongPathBuffer& );
+
+public:
+ LongPathBuffer( sal_uInt32 nCharNum )
+ : m_pBuffer( reinterpret_cast<T*>( rtl_allocateMemory( nCharNum * sizeof( T ) ) ) )
+ , m_nCharNum( nCharNum )
+ {
+ OSL_ENSURE( m_pBuffer, "Can not allocate the buffer!" );
+ }
+
+ ~LongPathBuffer()
+ {
+ if ( m_pBuffer )
+ rtl_freeMemory( m_pBuffer );
+ m_pBuffer = 0;
+ }
+
+ sal_uInt32 getBufSizeInSymbols()
+ {
+ return m_nCharNum;
+ }
+
+ operator T* ()
+ {
+ return m_pBuffer;
+ }
+
+};
+
+ template< class U, class T > U mingw_reinterpret_cast(LongPathBuffer<T>& a) { return reinterpret_cast<U>(static_cast<T*>(a)); }
+
+} // end namespace osl
+
+#endif
diff --git a/sal/osl/w32/pipe.c b/sal/osl/w32/pipe.c
new file mode 100644
index 000000000000..bd5185a2ba2b
--- /dev/null
+++ b/sal/osl/w32/pipe.c
@@ -0,0 +1,636 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include "pipeimpl.h"
+
+#include <osl/pipe.h>
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <osl/mutex.h>
+#include <osl/semaphor.h>
+#include <osl/conditn.h>
+#include <osl/interlck.h>
+#include <osl/process.h>
+
+#include <rtl/alloc.h>
+#include <rtl/memory.h>
+
+#define PIPESYSTEM "\\\\.\\pipe\\"
+#define PIPEPREFIX "OSL_PIPE_"
+
+typedef struct
+{
+ sal_uInt32 m_Size;
+ sal_uInt32 m_ReadPos;
+ sal_uInt32 m_WritePos;
+ BYTE m_Data[1];
+
+} oslPipeBuffer;
+
+/*****************************************************************************/
+/* oslPipeImpl */
+/*****************************************************************************/
+
+struct oslPipeImpl {
+ oslInterlockedCount m_Reference;
+ HANDLE m_File;
+ HANDLE m_NamedObject;
+ PSECURITY_ATTRIBUTES m_Security;
+ HANDLE m_ReadEvent;
+ HANDLE m_WriteEvent;
+ HANDLE m_AcceptEvent;
+ rtl_uString* m_Name;
+ oslPipeError m_Error;
+ sal_Bool m_bClosed;
+};
+
+
+/*****************************************************************************/
+/* osl_create/destroy-PipeImpl */
+/*****************************************************************************/
+
+static oslInterlockedCount nPipes = 0;
+
+oslPipe __osl_createPipeImpl(void)
+{
+ oslPipe pPipe;
+
+ pPipe = (oslPipe) rtl_allocateZeroMemory(sizeof(struct oslPipeImpl));
+
+ pPipe->m_bClosed = sal_False;
+ pPipe->m_Reference = 0;
+ pPipe->m_Name = NULL;
+ pPipe->m_File = INVALID_HANDLE_VALUE;
+ pPipe->m_NamedObject = INVALID_HANDLE_VALUE;
+
+ pPipe->m_ReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ pPipe->m_WriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ pPipe->m_AcceptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ return pPipe;
+}
+
+void __osl_destroyPipeImpl(oslPipe pPipe)
+{
+ if (pPipe != NULL)
+ {
+ if ( pPipe->m_NamedObject != INVALID_HANDLE_VALUE && pPipe->m_NamedObject != NULL )
+ CloseHandle( pPipe->m_NamedObject );
+
+ if (pPipe->m_Security != NULL)
+ {
+ rtl_freeMemory(pPipe->m_Security->lpSecurityDescriptor);
+ rtl_freeMemory(pPipe->m_Security);
+ }
+
+ CloseHandle(pPipe->m_ReadEvent);
+ CloseHandle(pPipe->m_WriteEvent);
+ CloseHandle(pPipe->m_AcceptEvent);
+
+ if (pPipe->m_Name)
+ rtl_uString_release(pPipe->m_Name);
+
+ rtl_freeMemory(pPipe);
+ }
+}
+
+
+
+/*****************************************************************************/
+/* osl_createPipe */
+/*****************************************************************************/
+oslPipe SAL_CALL osl_createPipe(rtl_uString *strPipeName, oslPipeOptions Options,
+ oslSecurity Security)
+{
+ rtl_uString* name = NULL;
+ rtl_uString* path = NULL;
+ rtl_uString* temp = NULL;
+ oslPipe pPipe;
+
+ PSECURITY_ATTRIBUTES pSecAttr = NULL;
+
+ rtl_uString_newFromAscii(&path, PIPESYSTEM);
+ rtl_uString_newFromAscii(&name, PIPEPREFIX);
+
+ if ( /*IS_NT &&*/ Security)
+ {
+ rtl_uString *Ident = NULL;
+ rtl_uString *Delim = NULL;
+
+ OSL_VERIFY(osl_getUserIdent(Security, &Ident));
+ rtl_uString_newFromAscii(&Delim, "_");
+
+ rtl_uString_newConcat(&temp, name, Ident);
+ rtl_uString_newConcat(&name, temp, Delim);
+
+ rtl_uString_release(Ident);
+ rtl_uString_release(Delim);
+ }
+ else
+ {
+ if (Options & osl_Pipe_CREATE)
+ {
+ PSECURITY_DESCRIPTOR pSecDesc;
+
+ pSecDesc = (PSECURITY_DESCRIPTOR) rtl_allocateMemory(SECURITY_DESCRIPTOR_MIN_LENGTH);
+
+ /* add a NULL disc. ACL to the security descriptor */
+ OSL_VERIFY(InitializeSecurityDescriptor(pSecDesc, SECURITY_DESCRIPTOR_REVISION));
+ OSL_VERIFY(SetSecurityDescriptorDacl(pSecDesc, TRUE, (PACL) NULL, FALSE));
+
+ pSecAttr = rtl_allocateMemory(sizeof(SECURITY_ATTRIBUTES));
+ pSecAttr->nLength = sizeof(SECURITY_ATTRIBUTES);
+ pSecAttr->lpSecurityDescriptor = pSecDesc;
+ pSecAttr->bInheritHandle = TRUE;
+ }
+ }
+
+ rtl_uString_assign(&temp, name);
+ rtl_uString_newConcat(&name, temp, strPipeName);
+
+ /* alloc memory */
+ pPipe= __osl_createPipeImpl();
+ osl_incrementInterlockedCount(&(pPipe->m_Reference));
+
+ /* build system pipe name */
+ rtl_uString_assign(&temp, path);
+ rtl_uString_newConcat(&path, temp, name);
+ rtl_uString_release(temp);
+ temp = NULL;
+
+ if (Options & osl_Pipe_CREATE)
+ {
+ SetLastError( ERROR_SUCCESS );
+
+ if ( IS_NT )
+ pPipe->m_NamedObject = CreateMutexW( NULL, FALSE, name->buffer );
+ else
+ {
+ LPSTR pszTempBuffer = NULL;
+ int nCharsNeeded;
+
+ nCharsNeeded = WideCharToMultiByte( CP_ACP, 0, name->buffer, name->length, NULL, 0, NULL, NULL );
+ pszTempBuffer = alloca( nCharsNeeded * sizeof(CHAR) );
+ nCharsNeeded = WideCharToMultiByte( CP_ACP, 0, name->buffer, name->length, pszTempBuffer, nCharsNeeded, NULL, NULL );
+ pszTempBuffer[nCharsNeeded-1] = 0;
+
+ pPipe->m_NamedObject = CreateMutexA( NULL, FALSE, pszTempBuffer );
+ }
+
+ if ( pPipe->m_NamedObject != INVALID_HANDLE_VALUE && pPipe->m_NamedObject != NULL )
+ {
+ if ( GetLastError() != ERROR_ALREADY_EXISTS )
+ {
+ pPipe->m_Security = pSecAttr;
+ rtl_uString_assign(&pPipe->m_Name, name);
+
+ if (IS_NT)
+ {
+ /* try to open system pipe */
+ pPipe->m_File = CreateNamedPipeW(
+ path->buffer,
+ PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
+ PIPE_WAIT | PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE,
+ PIPE_UNLIMITED_INSTANCES,
+ 4096, 4096,
+ NMPWAIT_WAIT_FOREVER,
+ pPipe->m_Security);
+
+ if (pPipe->m_File != INVALID_HANDLE_VALUE)
+ {
+ rtl_uString_release( name );
+ rtl_uString_release( path );
+
+ return pPipe;
+ }
+ }
+ else /* Win 9x */
+ {
+ LPSTR pszTempBuffer = NULL;
+ int nCharsNeeded;
+
+ nCharsNeeded = WideCharToMultiByte( CP_ACP, 0, path->buffer, path->length, NULL, 0, NULL, NULL );
+ pszTempBuffer = alloca( nCharsNeeded * sizeof(CHAR) );
+ nCharsNeeded = WideCharToMultiByte( CP_ACP, 0, path->buffer, path->length, pszTempBuffer, nCharsNeeded, NULL, NULL );
+ pszTempBuffer[nCharsNeeded-1] = 0;
+
+ pPipe->m_File = CreateSimplePipe( pszTempBuffer );
+
+ if ( IsValidHandle(pPipe->m_File) )
+ {
+ rtl_uString_release( name );
+ rtl_uString_release( path );
+
+ return pPipe;
+ }
+ }
+ }
+ else
+ {
+ CloseHandle( pPipe->m_NamedObject );
+ pPipe->m_NamedObject = INVALID_HANDLE_VALUE;
+ }
+ }
+ }
+ else
+ {
+ if (IS_NT)
+ {
+ BOOL fPipeAvailable;
+
+ do
+ {
+ /* free instance should be available first */
+ fPipeAvailable = WaitNamedPipeW(path->buffer, NMPWAIT_WAIT_FOREVER);
+
+ /* first try to open system pipe */
+ if ( fPipeAvailable )
+ {
+ pPipe->m_File = CreateFileW(
+ path->buffer,
+ GENERIC_READ|GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
+ NULL);
+
+ if ( pPipe->m_File != INVALID_HANDLE_VALUE )
+ {
+ // We got it !
+ rtl_uString_release( name );
+ rtl_uString_release( path );
+
+ return (pPipe);
+ }
+ else
+ {
+ // Pipe instance maybe catched by another client -> try again
+ }
+ }
+ } while ( fPipeAvailable );
+ }
+ else /* Win 9x */
+ {
+ LPSTR pszTempBuffer = NULL;
+ int nCharsNeeded;
+
+ nCharsNeeded = WideCharToMultiByte( CP_ACP, 0, path->buffer, path->length, NULL, 0, NULL, NULL );
+ pszTempBuffer = alloca( nCharsNeeded * sizeof(CHAR) );
+ nCharsNeeded = WideCharToMultiByte( CP_ACP, 0, path->buffer, path->length, pszTempBuffer, nCharsNeeded, NULL, NULL );
+ pszTempBuffer[nCharsNeeded-1] = 0;
+
+ pPipe->m_File = OpenSimplePipe( pszTempBuffer );
+
+ if ( IsValidHandle(pPipe->m_File) )
+ {
+ // We got it !
+ rtl_uString_release( name );
+ rtl_uString_release( path );
+
+ return (pPipe);
+ }
+ }
+ }
+
+ /* if we reach here something went wrong */
+ __osl_destroyPipeImpl(pPipe);
+
+ return NULL;
+}
+
+void SAL_CALL osl_acquirePipe( oslPipe pPipe )
+{
+ osl_incrementInterlockedCount( &(pPipe->m_Reference) );
+}
+
+void SAL_CALL osl_releasePipe( oslPipe pPipe )
+{
+// OSL_ASSERT( pPipe );
+
+ if( 0 == pPipe )
+ return;
+
+ if( 0 == osl_decrementInterlockedCount( &(pPipe->m_Reference) ) )
+ {
+ if( ! pPipe->m_bClosed )
+ osl_closePipe( pPipe );
+
+ __osl_destroyPipeImpl( pPipe );
+ }
+}
+
+void SAL_CALL osl_closePipe( oslPipe pPipe )
+{
+ if( pPipe && ! pPipe->m_bClosed )
+ {
+ pPipe->m_bClosed = sal_True;
+ if (IS_NT)
+ {
+ /* if we have a system pipe close it */
+ if (pPipe->m_File != INVALID_HANDLE_VALUE)
+ {
+ /* FlushFileBuffers(pPipe->m_File); */
+ DisconnectNamedPipe(pPipe->m_File);
+ CloseHandle(pPipe->m_File);
+ }
+ }
+ else
+ {
+ CloseSimplePipe( pPipe->m_File );
+ }
+
+ }
+}
+
+/*****************************************************************************/
+/* osl_acceptPipe */
+/*****************************************************************************/
+oslPipe SAL_CALL osl_acceptPipe(oslPipe pPipe)
+{
+ oslPipe pAcceptedPipe = NULL;
+
+ HANDLE Event;
+ OVERLAPPED os;
+
+ OSL_ASSERT(pPipe);
+
+ if (IS_NT)
+ {
+ DWORD nBytesTransfered;
+ rtl_uString* path = NULL;
+ rtl_uString* temp = NULL;
+
+ OSL_ASSERT (pPipe->m_File != INVALID_HANDLE_VALUE);
+
+ Event = pPipe->m_AcceptEvent;
+ rtl_zeroMemory(&os, sizeof(OVERLAPPED));
+ os.hEvent = pPipe->m_AcceptEvent;
+ ResetEvent(pPipe->m_AcceptEvent);
+
+ if ( !ConnectNamedPipe(pPipe->m_File, &os))
+ {
+ switch ( GetLastError() )
+ {
+ case ERROR_PIPE_CONNECTED: // Client already connected to pipe
+ case ERROR_NO_DATA: // Client was connected but has already closed pipe end
+ // should only appear in nonblocking mode but in fact does
+ // in blocking asynchronous mode.
+ break;
+ case ERROR_PIPE_LISTENING: // Only for nonblocking mode but see ERROR_NO_DATA
+ case ERROR_IO_PENDING: // This is normal if not client is connected yet
+ case ERROR_MORE_DATA: // Should not happen
+ // blocking call to accept
+ if( !GetOverlappedResult( pPipe->m_File, &os, &nBytesTransfered, TRUE ) )
+ {
+ // Possible error could be that between ConnectNamedPipe and GetOverlappedResult a connect
+ // took place.
+
+ switch ( GetLastError() )
+ {
+ case ERROR_PIPE_CONNECTED: // Pipe was already connected
+ case ERROR_NO_DATA: // Pipe was connected but client has already closed -> ver fast client ;-)
+ break; // Everything's fine !!!
+ default:
+ // Something went wrong
+ return 0;
+ }
+ }
+ break;
+ default: // All other error say that somethings going wrong.
+ return 0;
+ }
+ }
+
+
+ pAcceptedPipe = __osl_createPipeImpl();
+ OSL_ASSERT(pAcceptedPipe);
+
+ osl_incrementInterlockedCount(&(pAcceptedPipe->m_Reference));
+ rtl_uString_assign(&pAcceptedPipe->m_Name, pPipe->m_Name);
+ pAcceptedPipe->m_File = pPipe->m_File;
+
+ rtl_uString_newFromAscii(&temp, PIPESYSTEM);
+ rtl_uString_newConcat(&path, temp, pPipe->m_Name);
+ rtl_uString_release(temp);
+
+ // prepare for next accept
+ pPipe->m_File =
+ CreateNamedPipeW(path->buffer,
+ PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
+ PIPE_WAIT | PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE,
+ PIPE_UNLIMITED_INSTANCES,
+ 4096, 4096,
+ NMPWAIT_WAIT_FOREVER,
+ pAcceptedPipe->m_Security);
+ rtl_uString_release( path );
+ }
+ else /* Win9x */
+ {
+ pAcceptedPipe = __osl_createPipeImpl();
+ OSL_ASSERT(pAcceptedPipe);
+
+ osl_incrementInterlockedCount(&(pAcceptedPipe->m_Reference));
+ rtl_uString_assign(&pAcceptedPipe->m_Name, pPipe->m_Name);
+ pAcceptedPipe->m_File = pPipe->m_File;
+
+ pAcceptedPipe->m_File = AcceptSimplePipeConnection( pPipe->m_File );
+ }
+
+ return pAcceptedPipe;
+}
+
+/*****************************************************************************/
+/* osl_receivePipe */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receivePipe(oslPipe pPipe,
+ void* pBuffer,
+ sal_Int32 BytesToRead)
+{
+ DWORD nBytes;
+
+ OSL_ASSERT(pPipe);
+
+ /* if we have a system pipe use it */
+ if ( IS_NT /*pPipe->m_File != INVALID_HANDLE_VALUE*/)
+ {
+ OVERLAPPED os;
+ rtl_zeroMemory(&os,sizeof(OVERLAPPED));
+ os.hEvent = pPipe->m_ReadEvent;
+
+ ResetEvent(pPipe->m_ReadEvent);
+
+ if (! ReadFile(pPipe->m_File, pBuffer, BytesToRead, &nBytes, &os) &&
+ ((GetLastError() != ERROR_IO_PENDING) ||
+ ! GetOverlappedResult(pPipe->m_File, &os, &nBytes, TRUE)))
+ {
+ DWORD lastError = GetLastError();
+
+ if (lastError == ERROR_MORE_DATA)
+ nBytes = BytesToRead;
+ else
+ {
+ if (lastError == ERROR_PIPE_NOT_CONNECTED)
+ nBytes = 0;
+ else
+ nBytes = (DWORD) -1;
+
+ pPipe->m_Error = osl_Pipe_E_ConnectionAbort;
+ }
+ }
+ }
+ else
+ {
+ BOOL fSuccess = ReadSimplePipe( pPipe->m_File, pBuffer, BytesToRead, &nBytes, TRUE );
+
+ if ( !fSuccess )
+ {
+ nBytes = 0;
+ pPipe->m_Error = osl_Pipe_E_ConnectionAbort;
+ }
+
+ }
+
+ return (nBytes);
+}
+
+/*****************************************************************************/
+/* osl_sendPipe */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendPipe(oslPipe pPipe,
+ const void* pBuffer,
+ sal_Int32 BytesToSend)
+{
+ DWORD nBytes;
+ OSL_ASSERT(pPipe);
+
+ if (IS_NT/*pPipe->m_File != INVALID_HANDLE_VALUE*/)
+ {
+ OVERLAPPED os;
+ rtl_zeroMemory(&os, sizeof(OVERLAPPED));
+ os.hEvent = pPipe->m_WriteEvent;
+ ResetEvent(pPipe->m_WriteEvent);
+
+ if (! WriteFile(pPipe->m_File, pBuffer, BytesToSend, &nBytes, &os) &&
+ ((GetLastError() != ERROR_IO_PENDING) ||
+ ! GetOverlappedResult(pPipe->m_File, &os, &nBytes, TRUE)))
+ {
+ if (GetLastError() == ERROR_PIPE_NOT_CONNECTED)
+ nBytes = 0;
+ else
+ nBytes = (DWORD) -1;
+
+ pPipe->m_Error = osl_Pipe_E_ConnectionAbort;
+ }
+ }
+ else
+ {
+ BOOL fSuccess = WriteSimplePipe( pPipe->m_File, pBuffer, BytesToSend, &nBytes, TRUE );
+
+ if ( !fSuccess )
+ {
+ nBytes = 0;
+ pPipe->m_Error = osl_Pipe_E_ConnectionAbort;
+ }
+ }
+
+ return (nBytes);
+}
+
+sal_Int32 SAL_CALL osl_writePipe( oslPipe pPipe, const void *pBuffer , sal_Int32 n )
+{
+ /* loop until all desired bytes were send or an error occured */
+ sal_Int32 BytesSend= 0;
+ sal_Int32 BytesToSend= n;
+
+ OSL_ASSERT(pPipe);
+ while (BytesToSend > 0)
+ {
+ sal_Int32 RetVal;
+
+ RetVal= osl_sendPipe(pPipe, pBuffer, BytesToSend);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToSend -= RetVal;
+ BytesSend += RetVal;
+ pBuffer= (sal_Char*)pBuffer + RetVal;
+ }
+
+ return BytesSend;
+}
+
+sal_Int32 SAL_CALL osl_readPipe( oslPipe pPipe, void *pBuffer , sal_Int32 n )
+{
+ /* loop until all desired bytes were read or an error occured */
+ sal_Int32 BytesRead= 0;
+ sal_Int32 BytesToRead= n;
+
+ OSL_ASSERT( pPipe );
+ while (BytesToRead > 0)
+ {
+ sal_Int32 RetVal;
+ RetVal= osl_receivePipe(pPipe, pBuffer, BytesToRead);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToRead -= RetVal;
+ BytesRead += RetVal;
+ pBuffer= (sal_Char*)pBuffer + RetVal;
+ }
+ return BytesRead;
+}
+
+
+/*****************************************************************************/
+/* osl_getLastPipeError */
+/*****************************************************************************/
+oslPipeError SAL_CALL osl_getLastPipeError(oslPipe pPipe)
+{
+ oslPipeError Error;
+
+ if (pPipe != NULL)
+ {
+ Error = pPipe->m_Error;
+ pPipe->m_Error = osl_Pipe_E_None;
+ }
+ else
+ Error = osl_Pipe_E_NotFound;
+
+ return (Error);
+}
+
diff --git a/sal/osl/w32/pipeimpl.cxx b/sal/osl/w32/pipeimpl.cxx
new file mode 100644
index 000000000000..1d492115e8c5
--- /dev/null
+++ b/sal/osl/w32/pipeimpl.cxx
@@ -0,0 +1,785 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+# include "pipeimpl.h"
+
+#ifndef _INC_MALLOC
+# include <malloc.h>
+#endif
+
+#ifndef _INC_TCHAR
+# ifdef UNICODE
+# define _UNICODE
+# endif
+# include <tchar.h>
+#endif
+
+const TCHAR PIPE_NAME_PREFIX_MAPPING[] = TEXT("PIPE_FILE_MAPPING_");
+const TCHAR PIPE_NAME_PREFIX_SYNCHRONIZE[] = TEXT("PIPE_SYNCHRONIZE_MUTEX_");
+const TCHAR PIPE_NAME_PREFIX_CONNECTION[] = TEXT("PIPE_CONNECTION_SEMAPHORE_");
+
+const DWORD PIPE_BUFFER_SIZE = 4096;
+
+
+//============================================================================
+// PipeData
+//============================================================================
+
+struct PipeData
+{
+ DWORD dwProcessId;
+ HANDLE hReadPipe;
+ HANDLE hWritePipe;
+};
+
+//============================================================================
+// Pipe
+//============================================================================
+
+#ifdef UNICODE
+#define Pipe PipeW
+#define ClientPipe ClientPipeW
+#define ServerPipe ServerPipeW
+#else
+#define Pipe PipeA
+#define ClientPipe ClientPipeA
+#define ServerPipe ServerPipeA
+#endif
+
+class Pipe
+{
+protected:
+ HANDLE m_hReadPipe; // Handle to use for reading
+ HANDLE m_hWritePipe; // Handle to use for writing
+
+ Pipe( HANDLE hReadPipe, HANDLE hWritePipe );
+
+ static HANDLE CreatePipeDataMutex( LPCTSTR lpName, BOOL bInitialOwner );
+ static HANDLE CreatePipeDataMapping( LPCTSTR lpName );
+ static HANDLE OpenPipeDataMapping( LPCTSTR lpName );
+ static HANDLE CreatePipeConnectionSemaphore( LPCTSTR lpName, LONG lInitialCount, LONG lMaximumcount );
+
+public:
+ Pipe( const Pipe& );
+ const Pipe& operator = ( const Pipe& );
+ virtual ~Pipe();
+
+ virtual bool Close();
+ virtual bool Write( LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, bool bWait = true );
+ virtual bool Read( LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, bool bWait = true );
+
+ virtual Pipe *AcceptConnection()
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return NULL;
+ }
+
+ void * operator new( size_t nBytes )
+ {
+ return HeapAlloc( GetProcessHeap(), 0, nBytes );
+ }
+
+ void operator delete( void *ptr )
+ {
+ HeapFree( GetProcessHeap(), 0, ptr );
+ }
+
+ bool is() const
+ {
+ return (FALSE != HeapValidate( GetProcessHeap(), 0, this ));
+ }
+
+};
+
+//============================================================================
+// ClientPipe
+//============================================================================
+
+class ClientPipe : public Pipe
+{
+protected:
+ ClientPipe( HANDLE hReadPipe, HANDLE hWritePipe );
+public:
+ static ClientPipe* Create( LPCTSTR lpName );
+};
+
+//============================================================================
+// ServerPipe
+//============================================================================
+
+class ServerPipe : public Pipe
+{
+protected:
+ HANDLE m_hMapping;
+ HANDLE m_hSynchronize;
+ LPTSTR m_lpName;
+
+ ServerPipe( LPCTSTR lpName, HANDLE hMapping, HANDLE hSynchronize, HANDLE hReadPipe, HANDLE hWritePipe );
+public:
+ virtual ~ServerPipe();
+
+ static ServerPipe *Create( LPCTSTR lpName );
+
+ virtual Pipe *AcceptConnection();
+};
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+
+HANDLE Pipe::CreatePipeDataMapping( LPCTSTR lpName )
+{
+ HANDLE hMapping = NULL;
+ LPTSTR lpMappingName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_MAPPING) );
+
+ if ( lpMappingName )
+ {
+ _tcscpy( lpMappingName, PIPE_NAME_PREFIX_MAPPING );
+ _tcscat( lpMappingName, lpName );
+
+ LPTSTR lpMappingFileName = (LPTSTR)alloca( MAX_PATH * sizeof(TCHAR) );
+
+ if ( lpMappingFileName )
+ {
+ DWORD nChars = GetTempPath( MAX_PATH, lpMappingFileName );
+
+ if ( MAX_PATH + _tcslen(lpName) < nChars + 1 )
+ {
+ lpMappingFileName = (LPTSTR)alloca( (nChars + 1 + _tcslen(lpName)) * sizeof(TCHAR) );
+ if ( lpMappingFileName )
+ nChars = GetTempPath( nChars, lpMappingFileName );
+ else
+ {
+ nChars = 0;
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ }
+ }
+
+ if ( nChars )
+ {
+ _tcscat( lpMappingFileName, lpMappingName );
+
+ HANDLE hFile = CreateFile(
+ lpMappingFileName,
+ GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_ALWAYS,
+ FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
+ NULL );
+
+ if ( IsValidHandle(hFile) )
+ {
+ hMapping = CreateFileMapping(
+ (HANDLE)hFile,
+ (LPSECURITY_ATTRIBUTES)NULL,
+ PAGE_READWRITE,
+ 0,
+ sizeof(PipeData),
+ lpMappingName );
+
+ CloseHandle( hFile );
+ }
+ }
+ }
+ else
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ }
+
+ return hMapping;
+}
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+
+HANDLE Pipe::OpenPipeDataMapping( LPCTSTR lpName )
+{
+ HANDLE hMapping = NULL;
+ LPTSTR lpMappingName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_MAPPING) );
+
+ if ( lpMappingName )
+ {
+ _tcscpy( lpMappingName, PIPE_NAME_PREFIX_MAPPING );
+ _tcscat( lpMappingName, lpName );
+
+ hMapping = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, lpMappingName );
+ }
+
+ return hMapping;
+}
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+
+HANDLE Pipe::CreatePipeDataMutex( LPCTSTR lpName, BOOL bInitialOwner )
+{
+ HANDLE hMutex = NULL;
+ LPTSTR lpMutexName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_SYNCHRONIZE) );
+
+ if ( lpMutexName )
+ {
+ _tcscpy( lpMutexName, PIPE_NAME_PREFIX_SYNCHRONIZE );
+ _tcscat( lpMutexName, lpName );
+
+ hMutex = CreateMutex( NULL, bInitialOwner, lpMutexName );
+ }
+
+ return hMutex;
+}
+
+//----------------------------------------------------------------------------
+//
+//----------------------------------------------------------------------------
+
+HANDLE Pipe::CreatePipeConnectionSemaphore( LPCTSTR lpName, LONG lInitialCount, LONG lMaximumCount )
+{
+ HANDLE hSemaphore = NULL;
+ LPTSTR lpSemaphoreName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_CONNECTION) );
+
+ if ( lpSemaphoreName )
+ {
+ _tcscpy( lpSemaphoreName, PIPE_NAME_PREFIX_CONNECTION );
+ _tcscat( lpSemaphoreName, lpName );
+
+ hSemaphore = CreateSemaphore( NULL, lInitialCount, lMaximumCount, lpSemaphoreName );
+ }
+
+ return hSemaphore;
+}
+
+
+//----------------------------------------------------------------------------
+// Pipe copy ctor
+//----------------------------------------------------------------------------
+
+Pipe::Pipe( const Pipe& rPipe ) :
+m_hReadPipe( INVALID_HANDLE_VALUE ),
+m_hWritePipe( INVALID_HANDLE_VALUE )
+{
+ DuplicateHandle(
+ GetCurrentProcess(),
+ rPipe.m_hReadPipe,
+ GetCurrentProcess(),
+ &m_hReadPipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ rPipe.m_hWritePipe,
+ GetCurrentProcess(),
+ &m_hWritePipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+}
+
+//----------------------------------------------------------------------------
+// Pipe assignment operator
+//----------------------------------------------------------------------------
+
+const Pipe& Pipe::operator = ( const Pipe& rPipe )
+{
+ Close();
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ rPipe.m_hReadPipe,
+ GetCurrentProcess(),
+ &m_hReadPipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ rPipe.m_hWritePipe,
+ GetCurrentProcess(),
+ &m_hWritePipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ return *this;
+}
+
+//----------------------------------------------------------------------------
+// Pipe ctor
+//----------------------------------------------------------------------------
+
+Pipe::Pipe( HANDLE hReadPipe, HANDLE hWritePipe ) :
+m_hReadPipe( INVALID_HANDLE_VALUE ),
+m_hWritePipe( INVALID_HANDLE_VALUE )
+{
+ DuplicateHandle(
+ GetCurrentProcess(),
+ hReadPipe,
+ GetCurrentProcess(),
+ &m_hReadPipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ hWritePipe,
+ GetCurrentProcess(),
+ &m_hWritePipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+}
+
+//----------------------------------------------------------------------------
+// Pipe dtor
+//----------------------------------------------------------------------------
+
+Pipe::~Pipe()
+{
+ Close();
+}
+
+//----------------------------------------------------------------------------
+// Pipe Close
+//----------------------------------------------------------------------------
+
+bool Pipe::Close()
+{
+ bool fSuccess = false; // Assume failure
+
+ if ( IsValidHandle(m_hReadPipe) )
+ {
+ CloseHandle( m_hReadPipe );
+ m_hReadPipe = INVALID_HANDLE_VALUE;
+ }
+
+ if ( IsValidHandle(m_hWritePipe) )
+ {
+ CloseHandle( m_hWritePipe );
+ m_hWritePipe = INVALID_HANDLE_VALUE;
+ }
+
+ return fSuccess;
+}
+
+//----------------------------------------------------------------------------
+// Pipe Write
+//----------------------------------------------------------------------------
+
+bool Pipe::Write( LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, bool bWait )
+{
+ DWORD dwBytesAvailable = 0;
+ BOOL fSuccess = TRUE;
+
+ if ( !bWait )
+ fSuccess = PeekNamedPipe( m_hReadPipe, NULL, 0, NULL, &dwBytesAvailable, NULL );
+
+ if ( fSuccess )
+ {
+ if ( !bWait && dwBytesToWrite > PIPE_BUFFER_SIZE - dwBytesAvailable )
+ dwBytesToWrite = PIPE_BUFFER_SIZE - dwBytesAvailable ;
+
+ return !!WriteFile( m_hWritePipe, lpBuffer, dwBytesToWrite, lpBytesWritten, NULL );
+ }
+
+ return false;
+}
+
+//----------------------------------------------------------------------------
+// Pipe Read
+//----------------------------------------------------------------------------
+
+bool Pipe::Read( LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, bool bWait )
+{
+ DWORD dwBytesAvailable = 0;
+ BOOL fSuccess = TRUE;
+
+ if ( !bWait )
+ fSuccess = PeekNamedPipe( m_hReadPipe, NULL, 0, NULL, &dwBytesAvailable, NULL );
+
+ if ( fSuccess )
+ {
+ if ( bWait || dwBytesAvailable )
+ return !!ReadFile( m_hReadPipe, lpBuffer, dwBytesToRead, lpBytesRead, NULL );
+ else
+ {
+ *lpBytesRead = 0;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+
+//----------------------------------------------------------------------------
+// Client pipe dtor
+//----------------------------------------------------------------------------
+
+ClientPipe::ClientPipe( HANDLE hReadPipe, HANDLE hWritePipe ) : Pipe( hReadPipe, hWritePipe )
+{
+}
+
+//----------------------------------------------------------------------------
+// Client pipe creation
+//----------------------------------------------------------------------------
+
+ClientPipe *ClientPipe::Create( LPCTSTR lpName )
+{
+ ClientPipe *pPipe = NULL; // Assume failure
+
+ HANDLE hMapping = OpenPipeDataMapping( lpName );
+
+ if ( IsValidHandle(hMapping) )
+ {
+ PipeData *pData = (PipeData*)MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
+
+ if ( pData )
+ {
+ HANDLE hSourceProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, pData->dwProcessId );
+
+ if ( IsValidHandle(hSourceProcess) )
+ {
+ BOOL fSuccess;
+ HANDLE hReadPipe = INVALID_HANDLE_VALUE, hWritePipe = INVALID_HANDLE_VALUE;
+
+ fSuccess = DuplicateHandle(
+ hSourceProcess,
+ pData->hReadPipe,
+ GetCurrentProcess(),
+ &hReadPipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ fSuccess = fSuccess && DuplicateHandle(
+ hSourceProcess,
+ pData->hWritePipe,
+ GetCurrentProcess(),
+ &hWritePipe,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ if ( fSuccess )
+ pPipe = new ClientPipe( hReadPipe, hWritePipe );
+
+ if ( IsValidHandle(hWritePipe) )
+ CloseHandle( hWritePipe );
+
+ if ( IsValidHandle(hReadPipe) )
+ CloseHandle( hReadPipe );
+
+ HANDLE hConnectionRequest = CreatePipeConnectionSemaphore( lpName, 0, 1 );
+
+ ReleaseSemaphore( hConnectionRequest, 1, NULL );
+
+ CloseHandle( hConnectionRequest );
+
+ CloseHandle( hSourceProcess );
+ }
+
+ UnmapViewOfFile( pData );
+ }
+
+ CloseHandle( hMapping );
+ }
+
+ return pPipe;
+}
+
+
+
+//----------------------------------------------------------------------------
+// ServerPipe ctor
+//----------------------------------------------------------------------------
+
+ServerPipe::ServerPipe( LPCTSTR lpName, HANDLE hMapping, HANDLE hSynchronize, HANDLE hReadPipe, HANDLE hWritePipe ) : Pipe( hReadPipe, hWritePipe ),
+m_hMapping( NULL ),
+m_hSynchronize( NULL ),
+m_lpName( NULL )
+{
+ DuplicateHandle(
+ GetCurrentProcess(),
+ hMapping,
+ GetCurrentProcess(),
+ &m_hMapping,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS );
+
+ DuplicateHandle(
+ GetCurrentProcess(),
+ hSynchronize,
+ GetCurrentProcess(),
+ &m_hSynchronize,
+ 0,
+ FALSE,
+ DUPLICATE_SAME_ACCESS
+ );
+ m_lpName = new TCHAR[_tcslen(lpName) + 1];
+ if ( m_lpName )
+ _tcscpy( m_lpName, lpName );
+}
+
+//----------------------------------------------------------------------------
+// ServerPipe dtor
+//----------------------------------------------------------------------------
+
+ServerPipe::~ServerPipe()
+{
+ if ( IsValidHandle(m_hMapping) )
+ CloseHandle( m_hMapping );
+ if ( m_lpName )
+ delete[]m_lpName;
+}
+
+//----------------------------------------------------------------------------
+// ServerPipe AcceptConnection
+//----------------------------------------------------------------------------
+
+Pipe *ServerPipe::AcceptConnection()
+{
+ Pipe *pPipe = NULL; // Assume failure;
+
+ HANDLE hConnectionRequest = CreatePipeConnectionSemaphore( m_lpName, 0, 1 );
+
+ if ( WAIT_OBJECT_0 == WaitForSingleObject( hConnectionRequest, INFINITE ) )
+ {
+ pPipe = new Pipe( *this );
+ Close();
+
+ // Create new inbound Pipe
+
+ HANDLE hClientWritePipe = NULL, hServerReadPipe = NULL;
+
+ BOOL fSuccess = CreatePipe( &hServerReadPipe, &hClientWritePipe, NULL, PIPE_BUFFER_SIZE );
+
+
+ if ( fSuccess )
+ {
+ // Create outbound pipe
+
+ HANDLE hClientReadPipe = NULL, hServerWritePipe = NULL;
+
+ if ( CreatePipe( &hClientReadPipe, &hServerWritePipe, NULL, PIPE_BUFFER_SIZE ) )
+ {
+ m_hReadPipe = hServerReadPipe;
+ m_hWritePipe = hServerWritePipe;
+
+ PipeData *pData = (PipeData *)MapViewOfFile( m_hMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(PipeData) );
+
+ HANDLE hSynchronize = CreatePipeDataMutex( m_lpName, TRUE );
+
+ CloseHandle( pData->hReadPipe );
+ CloseHandle( pData->hWritePipe );
+
+ pData->hReadPipe = hClientReadPipe;
+ pData->hWritePipe = hClientWritePipe;
+
+ ReleaseMutex( hSynchronize );
+
+ CloseHandle( hSynchronize );
+
+ }
+ else
+ {
+ CloseHandle( hClientWritePipe );
+ CloseHandle( hServerWritePipe );
+ }
+ }
+
+ ReleaseMutex( hConnectionRequest );
+ }
+
+ CloseHandle( hConnectionRequest );
+
+ return pPipe;
+}
+
+//----------------------------------------------------------------------------
+// Pipe creation
+//----------------------------------------------------------------------------
+
+ServerPipe *ServerPipe::Create( LPCTSTR lpName )
+{
+ ServerPipe *pPipe = NULL;
+
+ HANDLE hMapping = CreatePipeDataMapping( lpName );
+
+ if ( IsValidHandle(hMapping) )
+ {
+ if ( ERROR_FILE_EXISTS != GetLastError() )
+ {
+ HANDLE hSynchronize = CreatePipeDataMutex( lpName, FALSE);
+
+ WaitForSingleObject( hSynchronize, INFINITE );
+
+ PipeData *pData = (PipeData*)MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
+
+ if ( pData )
+ {
+
+ // Initialize pipe data
+
+ pData->dwProcessId = 0;
+ pData->hReadPipe = NULL;
+ pData->hWritePipe = NULL;
+
+ // Create inbound pipe
+
+ HANDLE hServerReadPipe = NULL, hClientWritePipe = NULL;
+
+ BOOL fSuccess = CreatePipe( &hServerReadPipe, &hClientWritePipe, NULL, PIPE_BUFFER_SIZE );
+
+ if ( fSuccess )
+ {
+ // Create outbound pipe
+
+ HANDLE hServerWritePipe = NULL, hClientReadPipe = NULL;
+
+ fSuccess = CreatePipe( &hClientReadPipe, &hServerWritePipe, NULL, PIPE_BUFFER_SIZE );
+
+ if ( fSuccess )
+ {
+ pData->dwProcessId = GetCurrentProcessId();
+ pData->hReadPipe = hClientReadPipe;
+ pData->hWritePipe = hClientWritePipe;
+ pPipe = new ServerPipe( lpName, hMapping, hSynchronize, hServerReadPipe, hServerWritePipe );
+
+ CloseHandle( hServerWritePipe );
+ CloseHandle( hServerReadPipe );
+ }
+ else
+ {
+ CloseHandle( hServerReadPipe );
+ CloseHandle( hClientWritePipe );
+ }
+ }
+
+ UnmapViewOfFile( pData );
+ }
+
+ ReleaseMutex( hSynchronize );
+ CloseHandle( hSynchronize );
+ }
+
+ CloseHandle( hMapping );
+ }
+
+ return pPipe;
+}
+
+
+//----------------------------------------------------------------------------
+// C style API
+//----------------------------------------------------------------------------
+
+const TCHAR LOCAL_PIPE_PREFIX[] = TEXT("\\\\.\\PIPE\\" );
+
+extern "C" HANDLE WINAPI CreateSimplePipe( LPCTSTR lpName )
+{
+ int nPrefixLen = _tcslen( LOCAL_PIPE_PREFIX );
+ if ( 0 == _tcsnicmp( lpName, LOCAL_PIPE_PREFIX, nPrefixLen ) )
+ lpName += nPrefixLen;
+ return (HANDLE)ServerPipe::Create( lpName );
+}
+
+extern "C" HANDLE WINAPI OpenSimplePipe( LPCTSTR lpName )
+{
+ int nPrefixLen = _tcslen( LOCAL_PIPE_PREFIX );
+ if ( 0 == _tcsnicmp( lpName, LOCAL_PIPE_PREFIX, nPrefixLen ) )
+ lpName += nPrefixLen;
+ return (HANDLE)ClientPipe::Create( lpName );
+}
+
+extern "C" HANDLE WINAPI AcceptSimplePipeConnection( HANDLE hPipe )
+{
+ Pipe *pPipe = (Pipe *)hPipe;
+
+ if ( pPipe->is() )
+ return (HANDLE)pPipe->AcceptConnection();
+ else
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return NULL;
+ }
+}
+
+extern "C" BOOL WINAPI WaitForSimplePipe( LPCTSTR /*lpName*/, DWORD /*dwTimeOut*/ )
+{
+ return FALSE;
+}
+
+extern "C" BOOL WINAPI WriteSimplePipe( HANDLE hPipe, LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, BOOL bWait )
+{
+ Pipe *pPipe = (Pipe *)hPipe;
+
+ if ( pPipe->is() )
+ return pPipe->Write( lpBuffer, dwBytesToWrite, lpBytesWritten, bWait );
+ else
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
+}
+
+extern "C" BOOL WINAPI ReadSimplePipe( HANDLE hPipe, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, BOOL bWait )
+{
+ Pipe *pPipe = (Pipe *)hPipe;
+
+ if ( pPipe->is() )
+ return pPipe->Read( lpBuffer, dwBytesToRead, lpBytesRead, bWait );
+ else
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
+}
+
+extern "C" BOOL WINAPI CloseSimplePipe( HANDLE hPipe )
+{
+ Pipe *pPipe = (Pipe *)hPipe;
+
+ if ( pPipe->is() )
+ {
+ delete pPipe;
+ return TRUE;
+ }
+ else
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ return FALSE;
+ }
+}
diff --git a/sal/osl/w32/pipeimpl.h b/sal/osl/w32/pipeimpl.h
new file mode 100644
index 000000000000..83f678f6c49d
--- /dev/null
+++ b/sal/osl/w32/pipeimpl.h
@@ -0,0 +1,88 @@
+#ifndef _PIPEIMPL_H_
+#define _PIPEIMPL_H_
+
+#ifndef _WINDOWS_
+# ifdef _MSC_VER
+# pragma warning(push,1) /* disable warnings within system headers */
+# endif
+# include <windows.h>
+# ifdef _MSC_VER
+# pragma warning(pop)
+# endif
+#endif
+
+#ifndef _INC_MALLOC
+# include <malloc.h>
+#endif
+
+#ifndef _INC_TCHAR
+# ifdef UNICODE
+# define _UNICODE
+# endif
+# include <tchar.h>
+#endif
+
+#define EXPORT_PIPE_API
+
+//============================================================================
+// Helper functions
+//============================================================================
+
+// Because the value of an invalid HANDLE returned by API functions differs
+// between different functions and differs on different Windows platforms,
+// this function checks wether the handle has a meaningfull value.
+#ifndef __cplusplus
+
+#define IsValidHandle( handle ) ((DWORD)(handle) + 1 > 1)
+
+#else
+
+inline bool IsValidHandle( HANDLE handle )
+{
+ return INVALID_HANDLE_VALUE != handle && NULL != handle;
+}
+
+extern "C" {
+
+#endif // __cplusplus
+
+
+EXPORT_PIPE_API HANDLE WINAPI CreateSimplePipeA( LPCSTR lpName );
+EXPORT_PIPE_API HANDLE WINAPI CreateSimplePipeW( LPCWSTR lpName );
+
+#ifdef UNICODE
+#define CreateSimplePipe CreateSimplePipeW
+#else
+#define CreateSimplePipe CreateSimplePipeA
+#endif
+
+EXPORT_PIPE_API HANDLE WINAPI OpenSimplePipeA( LPCSTR lpName );
+EXPORT_PIPE_API HANDLE WINAPI OpenSimplePipeW( LPCWSTR lpName );
+
+#ifdef UNICODE
+#define OpenSimplePipe OpenSimplePipeW
+#else
+#define OpenSimplePipe OpenSimplePipeA
+#endif
+
+EXPORT_PIPE_API HANDLE WINAPI AcceptSimplePipeConnection( HANDLE hPipe );
+
+EXPORT_PIPE_API BOOL WINAPI WaitForSimplePipeA( LPCSTR lpName, DWORD dwTimeOut );
+EXPORT_PIPE_API BOOL WINAPI WaitForSimplePipeW( LPCWSTR lpName, DWORD dwTimeOut );
+
+#ifdef UNICODE
+#define WaitForSimplePipe WaitForSimplePipeW
+#else
+#define WaitForSimplePipe WaitForSimplePipeA
+#endif
+
+
+EXPORT_PIPE_API BOOL WINAPI WriteSimplePipe( HANDLE hPipe, LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, BOOL bWait );
+EXPORT_PIPE_API BOOL WINAPI ReadSimplePipe( HANDLE hPipe, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, BOOL bWait );
+EXPORT_PIPE_API BOOL WINAPI CloseSimplePipe( HANDLE hPipe );
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _PIPEIMPL_H_
diff --git a/sal/osl/w32/process.cxx b/sal/osl/w32/process.cxx
new file mode 100644
index 000000000000..521ac6f76ad4
--- /dev/null
+++ b/sal/osl/w32/process.cxx
@@ -0,0 +1,639 @@
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#define UNICODE
+#include "system.h"
+#ifdef _MSC_VER
+#pragma warning(push,1) /* disable warnings within system headers */
+#endif
+#include <shellapi.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#include <osl/diagnose.h>
+#include <osl/security.h>
+#include <osl/nlsupport.h>
+#include <osl/mutex.h>
+#include <osl/thread.h>
+
+#include "procimpl.h"
+#include "sockimpl.h"
+#include "file_url.h"
+#include "path_helper.hxx"
+#include <rtl/ustrbuf.h>
+#include <rtl/alloc.h>
+
+/***************************************************************************
+ * Process.
+ ***************************************************************************/
+
+oslProcessError SAL_CALL osl_terminateProcess(oslProcess Process)
+{
+ if (Process == NULL)
+ return osl_Process_E_Unknown;
+
+ if (TerminateProcess(((oslProcessImpl*)Process)->m_hProcess, 0))
+ return osl_Process_E_None;
+
+
+ return osl_Process_E_Unknown;
+}
+
+/***************************************************************************/
+
+oslProcess SAL_CALL osl_getProcess(oslProcessIdentifier Ident)
+{
+ oslProcessImpl* pProcImpl;
+ HANDLE hProcess = OpenProcess(
+ STANDARD_RIGHTS_REQUIRED | PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, (DWORD)Ident);
+
+ if (hProcess)
+ {
+ pProcImpl = reinterpret_cast< oslProcessImpl*>( rtl_allocateMemory(sizeof(oslProcessImpl)) );
+ pProcImpl->m_hProcess = hProcess;
+ pProcImpl->m_IdProcess = Ident;
+ }
+ else
+ pProcImpl = NULL;
+
+ return (pProcImpl);
+}
+
+/***************************************************************************/
+
+void SAL_CALL osl_freeProcessHandle(oslProcess Process)
+{
+ if (Process != NULL)
+ {
+ CloseHandle(((oslProcessImpl*)Process)->m_hProcess);
+
+ rtl_freeMemory((oslProcessImpl*)Process);
+ }
+}
+
+/***************************************************************************/
+
+oslProcessError SAL_CALL osl_getProcessInfo(oslProcess Process, oslProcessData Fields,
+ oslProcessInfo* pInfo)
+{
+ HANDLE hProcess;
+ DWORD IdProcess;
+
+ if (Process == NULL)
+ {
+ hProcess = GetCurrentProcess();
+ IdProcess = GetCurrentProcessId();
+ }
+ else
+ {
+ hProcess = ((oslProcessImpl*)Process)->m_hProcess;
+ IdProcess = ((oslProcessImpl*)Process)->m_IdProcess;
+ }
+
+ if (! pInfo || (pInfo->Size != sizeof(oslProcessInfo)))
+ return osl_Process_E_Unknown;
+
+ pInfo->Fields = 0;
+
+ if (Fields & osl_Process_IDENTIFIER)
+ {
+ pInfo->Ident = IdProcess;
+ pInfo->Fields |= osl_Process_IDENTIFIER;
+ }
+
+ if (Fields & osl_Process_EXITCODE)
+ {
+ if (GetExitCodeProcess(hProcess, &(pInfo->Code)) && (pInfo->Code != STILL_ACTIVE))
+ pInfo->Fields |= osl_Process_EXITCODE;
+ }
+
+ if (Fields & osl_Process_HEAPUSAGE)
+ {
+ void* lpAddress=0;
+ MEMORY_BASIC_INFORMATION Info;
+
+ pInfo->HeapUsage = 0;
+
+ do
+ {
+ if (VirtualQueryEx(hProcess, lpAddress, &Info, sizeof(Info)) == 0)
+ break;
+
+ if ((Info.State == MEM_COMMIT) && (Info.Type == MEM_PRIVATE))
+ pInfo->HeapUsage += Info.RegionSize;
+
+ lpAddress = (LPBYTE)lpAddress + Info.RegionSize;
+ }
+ while (lpAddress < (void *)0x80000000); // 2GB address space
+
+ pInfo->Fields |= osl_Process_HEAPUSAGE;
+ }
+
+ if (Fields & osl_Process_CPUTIMES)
+ {
+ FILETIME CreationTime, ExitTime, KernelTime, UserTime;
+
+ if (GetProcessTimes(hProcess, &CreationTime, &ExitTime,
+ &KernelTime, &UserTime))
+ {
+ __int64 Value;
+
+ Value = *((__int64 *)&UserTime);
+ pInfo->UserTime.Seconds = (unsigned long) (Value / 10000000L);
+ pInfo->UserTime.Nanosec = (unsigned long)((Value % 10000000L) * 100);
+
+ Value = *((__int64 *)&KernelTime);
+ pInfo->SystemTime.Seconds = (unsigned long) (Value / 10000000L);
+ pInfo->SystemTime.Nanosec = (unsigned long)((Value % 10000000L) * 100);
+
+ pInfo->Fields |= osl_Process_CPUTIMES;
+ }
+ }
+
+ return (pInfo->Fields == Fields) ? osl_Process_E_None : osl_Process_E_Unknown;
+}
+
+/***************************************************************************/
+
+oslProcessError SAL_CALL osl_joinProcess(oslProcess Process)
+{
+ return osl_joinProcessWithTimeout(Process, NULL);
+}
+
+/***************************************************************************/
+
+oslProcessError SAL_CALL osl_joinProcessWithTimeout(oslProcess Process, const TimeValue* pTimeout)
+{
+ DWORD timeout = INFINITE;
+ oslProcessError osl_error = osl_Process_E_None;
+ DWORD ret;
+
+ if (NULL == Process)
+ return osl_Process_E_Unknown;
+
+ if (pTimeout)
+ timeout = pTimeout->Seconds * 1000 + pTimeout->Nanosec / 1000000L;
+
+ ret = WaitForSingleObject(((oslProcessImpl*)Process)->m_hProcess, timeout);
+
+ if (WAIT_FAILED == ret)
+ osl_error = osl_Process_E_Unknown;
+ else if (WAIT_TIMEOUT == ret)
+ osl_error = osl_Process_E_TimedOut;
+
+ return osl_error;
+}
+
+/***************************************************************************
+ * osl_bootstrap_getExecutableFile_Impl().
+ *
+ * @internal
+ * @see rtl_bootstrap
+ * @see #i37371#
+ *
+ ***************************************************************************/
+
+extern "C" oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
+ rtl_uString ** ppFileURL
+) SAL_THROW_EXTERN_C()
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
+ DWORD buflen = 0;
+
+ if ((buflen = GetModuleFileNameW (0, ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer), aBuffer.getBufSizeInSymbols())) > 0)
+ {
+ rtl_uString * pAbsPath = 0;
+ rtl_uString_newFromStr_WithLength (&(pAbsPath), aBuffer, buflen);
+ if (pAbsPath)
+ {
+ /* Convert from path to url. */
+ if (osl_getFileURLFromSystemPath (pAbsPath, ppFileURL) == osl_File_E_None)
+ {
+ /* Success. */
+ result = osl_Process_E_None;
+ }
+ rtl_uString_release (pAbsPath);
+ }
+ }
+
+ return (result);
+}
+
+/***************************************************************************
+ * Command Line Arguments.
+ ***************************************************************************/
+
+struct CommandArgs_Impl
+{
+ sal_uInt32 m_nCount;
+ rtl_uString ** m_ppArgs;
+};
+
+static struct CommandArgs_Impl g_command_args =
+{
+ 0,
+ 0
+};
+
+#ifdef _MSC_VER
+#pragma warning( push )
+#pragma warning( disable: 4100 )
+#endif
+static rtl_uString ** osl_createCommandArgs_Impl (int argc, char ** argv)
+{
+ rtl_uString ** ppArgs =
+ (rtl_uString**)rtl_allocateZeroMemory (argc * sizeof(rtl_uString*));
+ if (ppArgs != 0)
+ {
+ int i;
+ int nArgs;
+ LPWSTR *wargv = CommandLineToArgvW( GetCommandLineW(), &nArgs );
+ OSL_ASSERT( nArgs == argc );
+ for (i = 0; i < nArgs; i++)
+ {
+ /* Convert to unicode */
+ rtl_uString_newFromStr( &(ppArgs[i]), reinterpret_cast<const sal_Unicode*>(wargv[i]) );
+ }
+ if (ppArgs[0] != 0)
+ {
+ /* Ensure absolute path */
+ ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
+ DWORD dwResult = 0;
+
+ dwResult = SearchPath (
+ 0, reinterpret_cast<LPCWSTR>(ppArgs[0]->buffer), L".exe", aBuffer.getBufSizeInSymbols(), ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer), 0);
+ if ((0 < dwResult) && (dwResult < aBuffer.getBufSizeInSymbols()))
+ {
+ /* Replace argv[0] with it's absolute path */
+ rtl_uString_newFromStr_WithLength(
+ &(ppArgs[0]), aBuffer, dwResult);
+ }
+ }
+ if (ppArgs[0] != 0)
+ {
+ /* Convert to FileURL, see @ osl_getExecutableFile() */
+ rtl_uString * pResult = 0;
+ osl_getFileURLFromSystemPath (ppArgs[0], &pResult);
+ if (pResult != 0)
+ {
+ rtl_uString_assign (&(ppArgs[0]), pResult);
+ rtl_uString_release (pResult);
+ }
+ }
+ }
+ return (ppArgs);
+
+}
+#ifdef _MSC_VER
+#pragma warning( pop )
+#endif
+
+/***************************************************************************/
+
+oslProcessError SAL_CALL osl_getExecutableFile( rtl_uString **ppustrFile )
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ osl_acquireMutex (*osl_getGlobalMutex());
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > 0)
+ {
+ /* CommandArgs set. Obtain arv[0]. */
+ rtl_uString_assign (ppustrFile, g_command_args.m_ppArgs[0]);
+ result = osl_Process_E_None;
+ }
+ osl_releaseMutex (*osl_getGlobalMutex());
+
+ return (result);
+}
+
+/***************************************************************************/
+
+sal_uInt32 SAL_CALL osl_getCommandArgCount(void)
+{
+ sal_uInt32 result = 0;
+
+ osl_acquireMutex (*osl_getGlobalMutex());
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > 0)
+ {
+ /* We're not counting argv[0] here. */
+ result = g_command_args.m_nCount - 1;
+ }
+ osl_releaseMutex (*osl_getGlobalMutex());
+
+ return (result);
+}
+
+/***************************************************************************/
+
+oslProcessError SAL_CALL osl_getCommandArg( sal_uInt32 nArg, rtl_uString **strCommandArg)
+{
+ oslProcessError result = osl_Process_E_NotFound;
+
+ osl_acquireMutex (*osl_getGlobalMutex());
+ OSL_ASSERT(g_command_args.m_nCount > 0);
+ if (g_command_args.m_nCount > (nArg + 1))
+ {
+ /* We're not counting argv[0] here. */
+ rtl_uString_assign (strCommandArg, g_command_args.m_ppArgs[nArg + 1]);
+ result = osl_Process_E_None;
+ }
+ osl_releaseMutex (*osl_getGlobalMutex());
+
+ return (result);
+}
+
+/***************************************************************************/
+
+void SAL_CALL osl_setCommandArgs (int argc, char ** argv)
+{
+ OSL_ASSERT(argc > 0);
+ osl_acquireMutex (*osl_getGlobalMutex());
+ if (g_command_args.m_nCount == 0)
+ {
+ rtl_uString** ppArgs = osl_createCommandArgs_Impl (argc, argv);
+ if (ppArgs != 0)
+ {
+ g_command_args.m_nCount = argc;
+ g_command_args.m_ppArgs = ppArgs;
+ }
+ }
+ osl_releaseMutex (*osl_getGlobalMutex());
+}
+
+/***************************************************************************
+ * Environment
+ ***************************************************************************/
+/*
+ #109941# because of a bug in the M$ unicows library we have to
+ allocate a buffer large enough to hold the requested environment
+ variable instead of testing for the required size. This wastes
+ some stack space, maybe we should revoke this work around if
+ unicows library is fixed.
+*/
+#define ENV_BUFFER_SIZE (32*1024-1)
+
+oslProcessError SAL_CALL osl_getEnvironment(rtl_uString *ustrVar, rtl_uString **ustrValue)
+{
+ WCHAR buff[ENV_BUFFER_SIZE];
+
+ if (GetEnvironmentVariableW(reinterpret_cast<LPCWSTR>(ustrVar->buffer), buff, ENV_BUFFER_SIZE) > 0)
+ {
+ rtl_uString_newFromStr(ustrValue, reinterpret_cast<const sal_Unicode*>(buff));
+ return osl_Process_E_None;
+ }
+ return osl_Process_E_Unknown;
+}
+
+oslProcessError SAL_CALL osl_setEnvironment(rtl_uString *ustrVar, rtl_uString *ustrValue)
+{
+ LPCWSTR lpName = reinterpret_cast<LPCWSTR>(ustrVar->buffer);
+ LPCWSTR lpValue = reinterpret_cast<LPCWSTR>(ustrValue->buffer);
+ if (SetEnvironmentVariableW(lpName, lpValue))
+ return osl_Process_E_None;
+ return osl_Process_E_Unknown;
+}
+
+oslProcessError SAL_CALL osl_clearEnvironment(rtl_uString *ustrVar)
+{
+ //If the second parameter is NULL, the variable is deleted from the current
+ //process's environment.
+ LPCWSTR lpName = reinterpret_cast<LPCWSTR>(ustrVar->buffer);
+ if (SetEnvironmentVariableW(lpName, NULL))
+ return osl_Process_E_None;
+ return osl_Process_E_Unknown;
+}
+
+/***************************************************************************
+ * Current Working Directory.
+ ***************************************************************************/
+
+extern "C" oslMutex g_CurrentDirectoryMutex;
+
+oslProcessError SAL_CALL osl_getProcessWorkingDir( rtl_uString **pustrWorkingDir )
+{
+ ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
+ DWORD dwLen = 0;
+
+
+ osl_acquireMutex( g_CurrentDirectoryMutex );
+ dwLen = GetCurrentDirectory( aBuffer.getBufSizeInSymbols(), ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer) );
+ osl_releaseMutex( g_CurrentDirectoryMutex );
+
+ if ( dwLen && dwLen < aBuffer.getBufSizeInSymbols() )
+ {
+ oslFileError eError;
+ rtl_uString *ustrTemp = NULL;;
+
+ rtl_uString_newFromStr_WithLength( &ustrTemp, aBuffer, dwLen );
+ eError = osl_getFileURLFromSystemPath( ustrTemp, pustrWorkingDir );
+
+ rtl_uString_release( ustrTemp );
+
+ if ( osl_File_E_None != eError )
+ return osl_Process_E_Unknown;
+ else
+ return osl_Process_E_None;
+ }
+ else
+ return osl_Process_E_Unknown;
+}
+
+/***************************************************************************
+ * Process Locale.
+ ***************************************************************************/
+
+extern "C" void _imp_getProcessLocale( rtl_Locale ** ppLocale );
+
+static rtl_Locale * g_theProcessLocale = NULL;
+
+/***************************************************************************/
+
+oslProcessError SAL_CALL osl_getProcessLocale( rtl_Locale ** ppLocale )
+{
+ osl_acquireMutex( *osl_getGlobalMutex() );
+
+ /* determine the users default locale */
+ if( NULL == g_theProcessLocale )
+ _imp_getProcessLocale( &g_theProcessLocale );
+
+ /* or return the cached value */
+ *ppLocale = g_theProcessLocale;
+
+ osl_releaseMutex( *osl_getGlobalMutex() );
+ return osl_Process_E_None;
+}
+
+/***************************************************************************/
+
+oslProcessError SAL_CALL osl_setProcessLocale( rtl_Locale * pLocale )
+{
+ osl_acquireMutex( *osl_getGlobalMutex() );
+
+ /* check if locale is supported */
+ if( RTL_TEXTENCODING_DONTKNOW == osl_getTextEncodingFromLocale( pLocale ) )
+ return osl_Process_E_Unknown;
+
+ /* just remember the locale here */
+ g_theProcessLocale = pLocale;
+
+ osl_releaseMutex( *osl_getGlobalMutex() );
+ return osl_Process_E_None;
+}
+
+/************************************************
+ * Portal send/receive interface implementation
+ ************************************************/
+
+static sal_Bool ReadPipe(oslPipe hPipe,
+ void* pBuffer,
+ sal_Int32 BytesToRead,
+ sal_Int32* nBytes)
+{
+ *nBytes = osl_receivePipe(hPipe, pBuffer, BytesToRead);
+ OSL_TRACE("tried to recieve %d, recieved %d.\n",
+ BytesToRead, *nBytes);
+ return (sal_Bool)((*nBytes >= 0) && (osl_getLastPipeError(hPipe) == osl_Pipe_E_None));
+}
+
+static sal_Bool WritePipe(oslPipe hPipe,
+ void* pBuffer,
+ sal_Int32 BytesToSend,
+ sal_Int32* nBytes)
+{
+ *nBytes = osl_sendPipe(hPipe, pBuffer, BytesToSend);
+ OSL_TRACE("tried to send %d, sent %d\n",
+ BytesToSend, *nBytes);
+ return (sal_Bool)((*nBytes == BytesToSend) && (osl_getLastPipeError(hPipe) == osl_Pipe_E_None));
+}
+
+sal_Bool SAL_CALL osl_sendResourcePipe(oslPipe hPipe, oslSocket pSocket)
+{
+ sal_Bool bRet = sal_False;
+ sal_Int32 bytes = 0;
+
+ /* duplicate handle on this other side ->
+ receive remote process
+ duplicate handle and send it */
+ DWORD remoteProcessID = 0;
+ HANDLE fd = (HANDLE)pSocket->m_Socket;
+ oslDescriptorType code = osl_Process_TypeSocket;
+
+ OSL_TRACE("osl_sendResourcePipe: enter...");
+
+ if (ReadPipe(hPipe, &remoteProcessID, sizeof(remoteProcessID), &bytes))
+ {
+ HANDLE hRemoteProc = OpenProcess(PROCESS_DUP_HANDLE,
+ FALSE,
+ remoteProcessID);
+
+ if (hRemoteProc != (HANDLE)NULL)
+ {
+ HANDLE newFd;
+
+ if (DuplicateHandle(GetCurrentProcess(),
+ fd,
+ hRemoteProc,
+ &newFd,
+ 0, FALSE, DUPLICATE_SAME_ACCESS))
+ {
+ if (
+ WritePipe(hPipe, &code, sizeof(code), &bytes) &&
+ WritePipe(hPipe, &newFd, sizeof(fd), &bytes)
+ )
+ bRet = sal_True;
+ }
+
+ CloseHandle(hRemoteProc);
+ }
+ }
+
+ if (bRet)
+ {
+ sal_Int32 commitCode;
+ OSL_TRACE("osl_sendResourcePipe: handle sent successfully, verify...\n");
+
+ if (
+ !ReadPipe(hPipe, &commitCode, sizeof(commitCode), &bytes) ||
+ (commitCode <= 0)
+ )
+ bRet = sal_False;
+ }
+
+ OSL_TRACE("osl_sendResourcePipe: exit... %d\n", bRet);
+ return(bRet);
+}
+
+
+oslSocket SAL_CALL osl_receiveResourcePipe(oslPipe hPipe)
+{
+ sal_Bool bRet = sal_False;
+ sal_Int32 bytes = 0;
+ sal_Int32 commitCode;
+ oslSocket pSocket = NULL;
+
+ /* duplicate handle on the other side ->
+ send my process id receive duplicated handle */
+ HANDLE fd = INVALID_HANDLE_VALUE;
+ DWORD myProcessID = GetCurrentProcessId();
+ oslDescriptorType code = osl_Process_TypeNone;
+
+ OSL_TRACE("osl_receiveResourcePipe: enter...\n");
+
+ if (
+ WritePipe(hPipe, &myProcessID, sizeof(myProcessID), &bytes) &&
+ ReadPipe(hPipe, &code, sizeof(code), &bytes) &&
+ ReadPipe(hPipe, &fd, sizeof(fd), &bytes)
+ )
+ {
+ if (code == osl_Process_TypeSocket)
+ {
+ pSocket = __osl_createSocketImpl((SOCKET)fd);
+ bRet = sal_True;
+ }
+ else
+ {
+ OSL_TRACE("osl_receiveResourcePipe: UKNOWN\n");
+ bRet = sal_False;
+ }
+ }
+
+ if (bRet)
+ commitCode = 1;
+ else
+ commitCode = 0;
+
+ WritePipe(hPipe, &commitCode, sizeof(commitCode), &bytes);
+
+ OSL_TRACE("osl_receiveResourcePipe: exit... %d, %p\n", bRet, pSocket);
+
+ return pSocket;
+}
diff --git a/sal/osl/w32/procimpl.cxx b/sal/osl/w32/procimpl.cxx
new file mode 100644
index 000000000000..fc04d5b84a8f
--- /dev/null
+++ b/sal/osl/w32/procimpl.cxx
@@ -0,0 +1,606 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#define UNICODE
+#define _UNICODE
+
+#ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+# ifdef _MSC_VER
+# pragma warning(push,1) /* disable warnings within system headers */
+# endif
+# include <windows.h>
+# ifdef _MSC_VER
+# pragma warning(pop)
+# endif
+# include <tchar.h>
+# undef WIN32_LEAN_AND_MEAN
+#endif
+#include "procimpl.h"
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
+#include "secimpl.h"
+#include "rtl/allocator.hxx"
+#include <osl/file.hxx>
+
+#include <list>
+#include <vector>
+#include <algorithm>
+#include <string>
+
+//#################################################
+extern "C" oslFileHandle SAL_CALL osl_createFileHandleFromOSHandle( HANDLE hFile, sal_uInt32 uFlags );
+
+//#################################################
+const sal_Unicode NAME_VALUE_SEPARATOR = TEXT('=');
+const sal_Char* SPACE = " ";
+const rtl::OUString ENV_COMSPEC = rtl::OUString::createFromAscii("COMSPEC");
+const rtl::OUString QUOTE = rtl::OUString::createFromAscii("\"");
+
+namespace /* private */
+{
+ //#################################################
+ typedef std::list<rtl::OUString, rtl::Allocator<rtl::OUString> > string_container_t;
+ typedef string_container_t::iterator string_container_iterator_t;
+ typedef string_container_t::const_iterator string_container_const_iterator_t;
+ typedef std::pair<string_container_iterator_t, string_container_iterator_t> iterator_pair_t;
+ typedef std::vector<sal_Unicode, rtl::Allocator<sal_Unicode> > environment_container_t;
+
+ //#################################################
+ /* Function object that compares two strings that are
+ expected to be environment variables in the form
+ "name=value". Only the 'name' part will be compared.
+ The comparison is in upper case and returns true
+ if the first of both strings is less than the
+ second one. */
+ struct less_environment_variable :
+ public std::binary_function<rtl::OUString, rtl::OUString, bool>
+ {
+ bool operator() (const rtl::OUString& lhs, const rtl::OUString& rhs) const
+ {
+ OSL_ENSURE((lhs.indexOf(NAME_VALUE_SEPARATOR) > -1) && \
+ (rhs.indexOf(NAME_VALUE_SEPARATOR) > -1), \
+ "Malformed environment variable");
+
+ // Windows compares environment variables uppercase
+ // so we do it, too
+ return (rtl_ustr_compare_WithLength(
+ lhs.toAsciiUpperCase().pData->buffer,
+ lhs.indexOf(NAME_VALUE_SEPARATOR),
+ rhs.toAsciiUpperCase().pData->buffer,
+ rhs.indexOf(NAME_VALUE_SEPARATOR)) < 0);
+ }
+ };
+
+ //#################################################
+ /* Function object used by for_each algorithm to
+ calculate the sum of the length of all strings
+ in a string container. */
+ class sum_of_string_lengths
+ {
+ public:
+ //--------------------------------
+ sum_of_string_lengths() : sum_(0) {}
+
+ //--------------------------------
+ void operator() (const rtl::OUString& string)
+ {
+ OSL_ASSERT(string.getLength());
+
+ // always include the terminating '\0'
+ if (string.getLength())
+ sum_ += string.getLength() + 1;
+ }
+
+ //--------------------------------
+ operator size_t () const
+ {
+ return sum_;
+ }
+ private:
+ size_t sum_;
+ };
+
+ //#################################################
+ inline size_t calc_sum_of_string_lengths(const string_container_t& string_cont)
+ {
+ return std::for_each(
+ string_cont.begin(), string_cont.end(), sum_of_string_lengths());
+ }
+
+ //#################################################
+ void read_environment(/*out*/ string_container_t* environment)
+ {
+ // GetEnvironmentStrings returns a sorted list, Windows
+ // sorts environment variables upper case
+ LPTSTR env = reinterpret_cast<LPTSTR>(GetEnvironmentStrings());
+ LPTSTR p = env;
+
+ while (size_t l = _tcslen(p))
+ {
+ environment->push_back(reinterpret_cast<const sal_Unicode*>(p));
+ p += l + 1;
+ }
+ FreeEnvironmentStrings(env);
+ }
+
+ //#################################################
+ /* the environment list must be sorted, new values
+ should either replace existing ones or should be
+ added to the list, environment variables will
+ be handled case-insensitive */
+ bool create_merged_environment(
+ rtl_uString* env_vars[],
+ sal_uInt32 env_vars_count,
+ /*in|out*/ string_container_t* merged_env)
+ {
+ OSL_ASSERT(env_vars && env_vars_count > 0 && merged_env);
+
+ read_environment(merged_env);
+
+ for (sal_uInt32 i = 0; i < env_vars_count; i++)
+ {
+ rtl::OUString env_var = rtl::OUString(env_vars[i]);
+
+ if (env_var.getLength() == 0)
+ return false;
+
+ iterator_pair_t iter_pair = std::equal_range(
+ merged_env->begin(),
+ merged_env->end(),
+ env_var,
+ less_environment_variable());
+
+ if (env_var.indexOf(NAME_VALUE_SEPARATOR) == -1)
+ {
+ merged_env->erase(iter_pair.first, iter_pair.second);
+ }
+ else
+ {
+ if (iter_pair.first != iter_pair.second) // found
+ *iter_pair.first = env_var;
+ else // not found
+ merged_env->insert(iter_pair.first, env_var);
+ }
+ }
+ return true;
+ }
+
+ //#################################################
+ /* Create a merged environment */
+ bool setup_process_environment(
+ rtl_uString* environment_vars[],
+ sal_uInt32 n_environment_vars,
+ /*in|out*/ environment_container_t& environment)
+ {
+ string_container_t merged_env;
+ if (!create_merged_environment(environment_vars, n_environment_vars, &merged_env))
+ return false;
+
+ // allocate enough space for the '\0'-separated environment strings and
+ // a final '\0'
+ environment.resize(calc_sum_of_string_lengths(merged_env) + 1);
+
+ string_container_const_iterator_t iter = merged_env.begin();
+ string_container_const_iterator_t iter_end = merged_env.end();
+
+ sal_uInt32 pos = 0;
+ for (/**/; iter != iter_end; ++iter)
+ {
+ rtl::OUString envv = *iter;
+
+ OSL_ASSERT(envv.getLength());
+
+ sal_uInt32 n = envv.getLength() + 1; // copy the final '\0', too
+ rtl_copyMemory(
+ reinterpret_cast<void*>(&environment[pos]),
+ reinterpret_cast<const void*>(envv.getStr()),
+ n * sizeof(sal_Unicode));
+ pos += n;
+ }
+ environment[pos] = 0; // append a final '\0'
+
+ return true;
+ }
+
+ //##########################################################
+ /* In contrast to the Win32 API function CreatePipe with
+ this function the caller is able to determine separately
+ which handle of the pipe is inheritable. */
+ bool create_pipe(
+ PHANDLE p_read_pipe,
+ bool b_read_pipe_inheritable,
+ PHANDLE p_write_pipe,
+ bool b_write_pipe_inheritable,
+ LPVOID p_security_descriptor = NULL,
+ DWORD pipe_size = 0)
+ {
+ SECURITY_ATTRIBUTES sa;
+ sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+ sa.lpSecurityDescriptor = p_security_descriptor;
+ sa.bInheritHandle = b_read_pipe_inheritable || b_write_pipe_inheritable;
+
+ BOOL bRet = FALSE;
+ HANDLE hTemp = NULL;
+
+ if (!b_read_pipe_inheritable && b_write_pipe_inheritable)
+ {
+ bRet = CreatePipe(&hTemp, p_write_pipe, &sa, pipe_size);
+
+ if (bRet && !DuplicateHandle(GetCurrentProcess(), hTemp,
+ GetCurrentProcess(), p_read_pipe, 0, FALSE,
+ DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))
+ {
+ CloseHandle(hTemp);
+ CloseHandle(*p_read_pipe);
+ return false;
+ }
+ }
+ else if (b_read_pipe_inheritable && !b_write_pipe_inheritable)
+ {
+ bRet = CreatePipe(p_read_pipe, &hTemp, &sa, pipe_size);
+
+ if (bRet && !DuplicateHandle(GetCurrentProcess(), hTemp,
+ GetCurrentProcess(), p_write_pipe, 0, FALSE,
+ DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))
+ {
+ CloseHandle(hTemp);
+ CloseHandle(*p_write_pipe);
+ return false;
+ }
+ }
+ else
+ {
+ bRet = CreatePipe(p_read_pipe, p_write_pipe, &sa, pipe_size);
+ }
+ return bRet;
+ }
+
+ //#########################################################
+ // Add a quote sign to the start and the end of a string
+ // if not already present
+ rtl::OUString quote_string(const rtl::OUString& string)
+ {
+ rtl::OUStringBuffer quoted;
+ if (string.indexOf(QUOTE) != 0)
+ quoted.append(QUOTE);
+
+ quoted.append(string);
+
+ if (string.lastIndexOf(QUOTE) != (string.getLength() - 1))
+ quoted.append(QUOTE);
+
+ return quoted.makeStringAndClear();
+ }
+
+ //##########################################################
+ // Returns the system path of the executable which can either
+ // be provided via the strImageName parameter or as first
+ // element of the strArguments list.
+ // The returned path will be quoted if it contains spaces.
+ rtl::OUString get_executable_path(
+ rtl_uString* image_name,
+ rtl_uString* cmdline_args[],
+ sal_uInt32 n_cmdline_args,
+ bool search_path)
+ {
+ rtl::OUString exe_name;
+
+ if (image_name)
+ exe_name = image_name;
+ else if (n_cmdline_args)
+ exe_name = rtl::OUString(cmdline_args[0]);
+
+ rtl::OUString exe_url = exe_name;
+ if (search_path)
+ osl_searchFileURL(exe_name.pData, NULL, &exe_url.pData);
+
+ rtl::OUString exe_path;
+ if (osl_File_E_None != osl::FileBase::getSystemPathFromFileURL(exe_url, exe_path))
+ return rtl::OUString();
+
+ if (exe_path.indexOf(' ') != -1)
+ exe_path = quote_string(exe_path);
+
+ return exe_path;
+ }
+
+ //##########################################################
+ rtl::OUString get_file_extension(const rtl::OUString& file_name)
+ {
+ sal_Int32 index = file_name.lastIndexOf('.');
+ if ((index != -1) && ((index + 1) < file_name.getLength()))
+ return file_name.copy(index + 1);
+
+ return rtl::OUString();
+ }
+
+ //##########################################################
+ bool is_batch_file(const rtl::OUString& file_name)
+ {
+ rtl::OUString ext = get_file_extension(file_name);
+ return (ext.equalsIgnoreAsciiCaseAscii("bat") ||
+ ext.equalsIgnoreAsciiCaseAscii("cmd") ||
+ ext.equalsIgnoreAsciiCaseAscii("btm"));
+ }
+
+ //##########################################################
+ rtl::OUString get_batch_processor()
+ {
+ rtl::OUString comspec;
+ osl_getEnvironment(ENV_COMSPEC.pData, &comspec.pData);
+
+ OSL_ASSERT(comspec.getLength());
+
+ /* check if comspec path contains blanks and quote it if any */
+ if (comspec.indexOf(' ') != -1)
+ comspec = quote_string(comspec);
+
+ return comspec;
+ }
+
+} // namespace private
+
+
+//#################################################
+oslProcessError SAL_CALL osl_executeProcess(
+ rtl_uString *strImageName,
+ rtl_uString *strArguments[],
+ sal_uInt32 nArguments,
+ oslProcessOption Options,
+ oslSecurity Security,
+ rtl_uString *strDirectory,
+ rtl_uString *strEnvironmentVars[],
+ sal_uInt32 nEnvironmentVars,
+ oslProcess *pProcess
+)
+{
+ return osl_executeProcess_WithRedirectedIO(
+ strImageName,
+ strArguments,
+ nArguments,
+ Options,
+ Security,
+ strDirectory,
+ strEnvironmentVars,
+ nEnvironmentVars,
+ pProcess,
+ NULL, NULL, NULL );
+}
+
+//#################################################
+oslProcessError SAL_CALL osl_executeProcess_WithRedirectedIO(
+ rtl_uString *ustrImageName,
+ rtl_uString *ustrArguments[],
+ sal_uInt32 nArguments,
+ oslProcessOption Options,
+ oslSecurity Security,
+ rtl_uString *ustrDirectory,
+ rtl_uString *ustrEnvironmentVars[],
+ sal_uInt32 nEnvironmentVars,
+ oslProcess *pProcess,
+ oslFileHandle *pProcessInputWrite,
+ oslFileHandle *pProcessOutputRead,
+ oslFileHandle *pProcessErrorRead)
+{
+ rtl::OUString exe_path = get_executable_path(
+ ustrImageName, ustrArguments, nArguments, (Options & osl_Process_SEARCHPATH));
+
+ if (0 == exe_path.getLength())
+ return osl_Process_E_NotFound;
+
+ if (pProcess == NULL)
+ return osl_Process_E_InvalidError;
+
+ DWORD flags = NORMAL_PRIORITY_CLASS;
+ rtl::OUStringBuffer command_line;
+
+ if (is_batch_file(exe_path))
+ {
+ rtl::OUString batch_processor = get_batch_processor();
+
+ if (batch_processor.getLength())
+ {
+ /* cmd.exe does not work without a console window */
+ if (!(Options & osl_Process_WAIT) || (Options & osl_Process_DETACHED))
+ flags |= CREATE_NEW_CONSOLE;
+
+ command_line.append(batch_processor);
+ command_line.appendAscii(" /c ");
+ }
+ else
+ // should we return here in case of error?
+ return osl_Process_E_Unknown;
+ }
+
+ command_line.append(exe_path);
+
+ /* Add remaining arguments to command line. If ustrImageName is NULL
+ the first parameter is the name of the executable so we have to
+ start at 1 instead of 0 */
+ for (sal_uInt32 n = (NULL != ustrImageName) ? 0 : 1; n < nArguments; n++)
+ {
+ command_line.appendAscii(SPACE);
+
+ /* Quote arguments containing blanks */
+ if (rtl::OUString(ustrArguments[n]).indexOf(' ') != -1)
+ command_line.append(quote_string(ustrArguments[n]));
+ else
+ command_line.append(ustrArguments[n]);
+ }
+
+ environment_container_t environment;
+ LPVOID p_environment = NULL;
+
+ if (nEnvironmentVars && ustrEnvironmentVars)
+ {
+ if (!setup_process_environment(
+ ustrEnvironmentVars, nEnvironmentVars, environment))
+ return osl_Process_E_InvalidError;
+
+ flags |= CREATE_UNICODE_ENVIRONMENT;
+ p_environment = &environment[0];
+ }
+
+ rtl::OUString cwd;
+ if (ustrDirectory && ustrDirectory->length && (osl_File_E_None != osl::FileBase::getSystemPathFromFileURL(ustrDirectory, cwd)))
+ return osl_Process_E_InvalidError;
+
+ LPCWSTR p_cwd = (cwd.getLength()) ? reinterpret_cast<LPCWSTR>(cwd.getStr()) : NULL;
+
+ if ((Options & osl_Process_DETACHED) && !(flags & CREATE_NEW_CONSOLE))
+ flags |= DETACHED_PROCESS;
+
+ STARTUPINFO startup_info;
+ memset(&startup_info, 0, sizeof(STARTUPINFO));
+
+ startup_info.cb = sizeof(STARTUPINFO);
+ startup_info.dwFlags = STARTF_USESHOWWINDOW;
+ startup_info.lpDesktop = L"";
+
+ /* Create pipes for redirected IO */
+ HANDLE hInputRead = NULL;
+ HANDLE hInputWrite = NULL;
+ if (pProcessInputWrite && create_pipe(&hInputRead, true, &hInputWrite, false))
+ startup_info.hStdInput = hInputRead;
+
+ HANDLE hOutputRead = NULL;
+ HANDLE hOutputWrite = NULL;
+ if (pProcessOutputRead && create_pipe(&hOutputRead, false, &hOutputWrite, true))
+ startup_info.hStdOutput = hOutputWrite;
+
+ HANDLE hErrorRead = NULL;
+ HANDLE hErrorWrite = NULL;
+ if (pProcessErrorRead && create_pipe(&hErrorRead, false, &hErrorWrite, true))
+ startup_info.hStdError = hErrorWrite;
+
+ bool b_inherit_handles = false;
+ if (pProcessInputWrite || pProcessOutputRead || pProcessErrorRead)
+ {
+ startup_info.dwFlags |= STARTF_USESTDHANDLES;
+ b_inherit_handles = true;
+ }
+
+ switch(Options & (osl_Process_NORMAL | osl_Process_HIDDEN | osl_Process_MINIMIZED | osl_Process_MAXIMIZED | osl_Process_FULLSCREEN))
+ {
+ case osl_Process_HIDDEN:
+ startup_info.wShowWindow = SW_HIDE;
+ flags |= CREATE_NO_WINDOW; // ignored for non-console
+ // applications; ignored on
+ // Win9x
+ break;
+
+ case osl_Process_MINIMIZED:
+ startup_info.wShowWindow = SW_MINIMIZE;
+ break;
+
+ case osl_Process_MAXIMIZED:
+ case osl_Process_FULLSCREEN:
+ startup_info.wShowWindow = SW_MAXIMIZE;
+ break;
+
+ default:
+ startup_info.wShowWindow = SW_NORMAL;
+ }
+
+ rtl::OUString cmdline = command_line.makeStringAndClear();
+ PROCESS_INFORMATION process_info;
+ BOOL bRet = FALSE;
+
+ if ((Security != NULL) && (((oslSecurityImpl*)Security)->m_hToken != NULL))
+ {
+ bRet = CreateProcessAsUser(
+ ((oslSecurityImpl*)Security)->m_hToken,
+ NULL, const_cast<LPTSTR>(reinterpret_cast<LPCTSTR>(cmdline.getStr())), NULL, NULL,
+ b_inherit_handles, flags, p_environment, p_cwd,
+ &startup_info, &process_info);
+ }
+ else
+ {
+ bRet = CreateProcess(
+ NULL, const_cast<LPTSTR>(reinterpret_cast<LPCTSTR>(cmdline.getStr())), NULL, NULL,
+ b_inherit_handles, flags, p_environment, p_cwd,
+ &startup_info, &process_info);
+ }
+
+ /* Now we can close the pipe ends that are used by the child process */
+
+ if (hInputRead)
+ CloseHandle(hInputRead);
+
+ if (hOutputWrite)
+ CloseHandle(hOutputWrite);
+
+ if (hErrorWrite)
+ CloseHandle(hErrorWrite);
+
+ if (bRet)
+ {
+ CloseHandle(process_info.hThread);
+
+ oslProcessImpl* pProcImpl = reinterpret_cast<oslProcessImpl*>(
+ rtl_allocateMemory(sizeof(oslProcessImpl)));
+
+ if (pProcImpl != NULL)
+ {
+ pProcImpl->m_hProcess = process_info.hProcess;
+ pProcImpl->m_IdProcess = process_info.dwProcessId;
+
+ *pProcess = (oslProcess)pProcImpl;
+
+ if (Options & osl_Process_WAIT)
+ WaitForSingleObject(pProcImpl->m_hProcess, INFINITE);
+
+ if (pProcessInputWrite)
+ *pProcessInputWrite = osl_createFileHandleFromOSHandle(hInputWrite, osl_File_OpenFlag_Write);
+
+ if (pProcessOutputRead)
+ *pProcessOutputRead = osl_createFileHandleFromOSHandle(hOutputRead, osl_File_OpenFlag_Read);
+
+ if (pProcessErrorRead)
+ *pProcessErrorRead = osl_createFileHandleFromOSHandle(hErrorRead, osl_File_OpenFlag_Read);
+
+ return osl_Process_E_None;
+ }
+ }
+
+ /* if an error occured we have to close the server side pipe ends too */
+
+ if (hInputWrite)
+ CloseHandle(hInputWrite);
+
+ if (hOutputRead)
+ CloseHandle(hOutputRead);
+
+ if (hErrorRead)
+ CloseHandle(hErrorRead);
+
+ return osl_Process_E_Unknown;
+}
diff --git a/sal/osl/w32/procimpl.h b/sal/osl/w32/procimpl.h
new file mode 100644
index 000000000000..b783f9b52ae2
--- /dev/null
+++ b/sal/osl/w32/procimpl.h
@@ -0,0 +1,47 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_PROCIMPL_H_
+#define _OSL_PROCIMPL_H_
+
+#include <osl/process.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _oslProcessImpl {
+ HANDLE m_hProcess;
+ DWORD m_IdProcess;
+} oslProcessImpl;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/sal/osl/w32/profile.cxx b/sal/osl/w32/profile.cxx
new file mode 100644
index 000000000000..9f4ea5630e1f
--- /dev/null
+++ b/sal/osl/w32/profile.cxx
@@ -0,0 +1,2707 @@
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#include "system.h"
+
+#include "file_url.h"
+#include "path_helper.hxx"
+
+#include <osl/diagnose.h>
+#include <osl/profile.h>
+#include <osl/process.h>
+#include <osl/file.h>
+#include <osl/util.h>
+#include <rtl/alloc.h>
+#include <algorithm>
+using std::min;
+static inline void copy_ustr_n( void *dest, const void *source, size_t length ) { rtl_copyMemory(dest, source, length*sizeof(sal_Unicode)); }
+
+#define LINES_INI 32
+#define LINES_ADD 10
+#define SECTIONS_INI 5
+#define SECTIONS_ADD 3
+#define ENTRIES_INI 5
+#define ENTRIES_ADD 3
+
+
+#define STR_INI_EXTENSION L".ini"
+#define STR_INI_METAHOME "?~"
+#define STR_INI_METASYS "?$"
+#define STR_INI_METACFG "?^"
+#define STR_INI_METAINS "?#"
+
+#define STR_INI_BOOLYES "yes"
+#define STR_INI_BOOLON "on"
+#define STR_INI_BOOLONE "1"
+#define STR_INI_BOOLNO "no"
+#define STR_INI_BOOLOFF "off"
+#define STR_INI_BOOLZERO "0"
+
+#define FLG_USER 0x00FF
+#define FLG_AUTOOPEN 0x0100
+#define FLG_MODIFIED 0x0200
+
+#define SVERSION_LOCATION STR_INI_METACFG
+#define SVERSION_FALLBACK STR_INI_METASYS
+#define SVERSION_NAME "sversion"
+#define SVERSION_SECTION "Versions"
+#define SVERSION_SOFFICE "StarOffice"
+#define SVERSION_PROFILE "soffice.ini"
+#define SVERSION_OPTION "userid:"
+#define SVERSION_DIRS { "bin", "program" }
+#define SVERSION_USER "user"
+
+#define DEFAULT_PMODE (_S_IREAD | _S_IWRITE)
+
+#define _BUILD_STR_(n) # n
+#define BUILD_STR(n) _BUILD_STR_(n)
+
+
+/*#define DEBUG_OSL_PROFILE 1*/
+/*#define TRACE_OSL_PROFILE 1*/
+
+
+/*****************************************************************************/
+/* Data Type Definition */
+/*****************************************************************************/
+
+typedef FILETIME osl_TStamp;
+
+typedef enum _osl_TLockMode
+{
+ un_lock, read_lock, write_lock
+} osl_TLockMode;
+
+typedef struct _osl_TFile
+{
+ HANDLE m_Handle;
+ sal_Char* m_pReadPtr;
+ sal_Char m_ReadBuf[512];
+/* sal_Char* m_pWritePtr; */
+/* sal_Char m_WriteBuf[512]; */
+ sal_Char* m_pWriteBuf;
+ sal_uInt32 m_nWriteBufLen;
+ sal_uInt32 m_nWriteBufFree;
+} osl_TFile;
+
+typedef struct _osl_TProfileEntry
+{
+ sal_uInt32 m_Line;
+ sal_uInt32 m_Offset;
+ sal_uInt32 m_Len;
+} osl_TProfileEntry;
+
+typedef struct _osl_TProfileSection
+{
+ sal_uInt32 m_Line;
+ sal_uInt32 m_Offset;
+ sal_uInt32 m_Len;
+ sal_uInt32 m_NoEntries;
+ sal_uInt32 m_MaxEntries;
+ osl_TProfileEntry* m_Entries;
+} osl_TProfileSection;
+
+
+/*
+ Profile-data structure hidden behind oslProfile:
+*/
+typedef struct _osl_TProfileImpl
+{
+ sal_uInt32 m_Flags;
+ osl_TFile* m_pFile;
+ osl_TStamp m_Stamp;
+ sal_uInt32 m_NoLines;
+ sal_uInt32 m_MaxLines;
+ sal_uInt32 m_NoSections;
+ sal_uInt32 m_MaxSections;
+ sal_Char** m_Lines;
+ rtl_uString *m_strFileName;
+ osl_TProfileSection* m_Sections;
+} osl_TProfileImpl;
+
+
+/*****************************************************************************/
+/* Static Module Function Declarations */
+/*****************************************************************************/
+
+static osl_TFile* openFileImpl(rtl_uString * strFileName, oslProfileOption ProfileFlags );
+static osl_TStamp closeFileImpl(osl_TFile* pFile);
+static sal_Bool lockFile(const osl_TFile* pFile, osl_TLockMode eMode);
+static sal_Bool rewindFile(osl_TFile* pFile, sal_Bool bTruncate);
+static osl_TStamp getFileStamp(osl_TFile* pFile);
+
+static sal_Bool getLine(osl_TFile* pFile, const sal_Char *pszLine, int MaxLen);
+static sal_Bool putLine(osl_TFile* pFile, const sal_Char *pszLine);
+static const sal_Char* stripBlanks(const sal_Char* String, sal_uInt32* pLen);
+static const sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line);
+static const sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo);
+static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo);
+static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection,
+ sal_uInt32 NoEntry, sal_uInt32 Line,
+ const sal_Char* Entry, sal_uInt32 Len);
+static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection,
+ int Line, const sal_Char* Entry, sal_uInt32 Len);
+static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry);
+static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len);
+static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection);
+static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section,
+ const sal_Char* Entry, sal_uInt32 *pNoEntry);
+static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile);
+static sal_Bool storeProfile(osl_TProfileImpl* pProfile, sal_Bool bCleanup);
+static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable);
+static sal_Bool releaseProfile(osl_TProfileImpl* pProfile);
+static sal_Bool lookupProfile(const sal_Unicode *strPath, const sal_Unicode *strFile, sal_Unicode *strProfile);
+
+static sal_Bool writeProfileImpl (osl_TFile* pFile);
+static osl_TFile* osl_openTmpProfileImpl(osl_TProfileImpl*);
+static sal_Bool osl_ProfileSwapProfileNames(osl_TProfileImpl*);
+static rtl_uString* osl_ProfileGenerateExtension(rtl_uString* ustrFileName, rtl_uString* ustrExtension);
+
+static sal_Bool SAL_CALL osl_getProfileName(rtl_uString* strPath, rtl_uString* strName, rtl_uString** strProfileName);
+
+/*****************************************************************************/
+/* Exported Module Functions */
+/*****************************************************************************/
+
+oslProfile SAL_CALL osl_openProfile(rtl_uString *strProfileName, sal_uInt32 Flags)
+{
+ osl_TFile* pFile = NULL;
+ osl_TProfileImpl* pProfile;
+ rtl_uString *FileName=NULL;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_openProfile\n");
+#endif
+ OSL_VERIFY(strProfileName);
+
+ if (rtl_uString_getLength(strProfileName) == 0 )
+ {
+ OSL_VERIFY(osl_getProfileName(NULL, NULL, &FileName));
+ }
+ else
+ {
+ rtl_uString_assign(&FileName, strProfileName);
+ }
+
+
+ osl_getSystemPathFromFileURL(FileName, &FileName);
+
+
+#ifdef DEBUG_OSL_PROFILE
+ Flags=osl_Profile_FLUSHWRITE;
+
+ // OSL_TRACE("opening '%s'\n",FileName);
+ if ( Flags == osl_Profile_DEFAULT )
+ {
+ OSL_TRACE("with osl_Profile_DEFAULT \n");
+ }
+ if ( Flags & osl_Profile_SYSTEM )
+ {
+ OSL_TRACE("with osl_Profile_SYSTEM \n");
+ }
+ if ( Flags & osl_Profile_READLOCK )
+ {
+ OSL_TRACE("with osl_Profile_READLOCK \n");
+ }
+ if ( Flags & osl_Profile_WRITELOCK )
+ {
+ OSL_TRACE("with osl_Profile_WRITELOCK \n");
+ }
+/* if ( Flags & osl_Profile_READWRITE ) */
+/* { */
+/* OSL_TRACE("with osl_Profile_READWRITE \n"); */
+/* } */
+ if ( Flags & osl_Profile_FLUSHWRITE )
+ {
+ OSL_TRACE("with osl_Profile_FLUSHWRITE \n");
+ }
+#endif
+
+ if ( (! (Flags & osl_Profile_SYSTEM)) && ( (pFile = openFileImpl(FileName, Flags) ) == NULL ) )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_openProfile [not opened]\n");
+#endif
+ if( FileName)
+ rtl_uString_release( FileName);
+
+ return (NULL);
+ }
+
+
+ pProfile = (osl_TProfileImpl*)calloc(1, sizeof(osl_TProfileImpl));
+
+
+ pProfile->m_Flags = Flags & FLG_USER;
+ osl_getSystemPathFromFileURL(strProfileName, &pProfile->m_strFileName);
+// rtl_uString_assign(&pProfile->m_strFileName, strProfileName);
+
+ if (Flags & (osl_Profile_READLOCK | osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ))
+ pProfile->m_pFile = pFile;
+
+ pProfile->m_Stamp = getFileStamp(pFile);
+
+ loadProfile(pFile, pProfile);
+
+ if (pProfile->m_pFile == NULL)
+ closeFileImpl(pFile);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_openProfile [ok]\n");
+#endif
+ if( FileName)
+ rtl_uString_release( FileName);
+
+ return (pProfile);
+}
+
+sal_Bool SAL_CALL osl_closeProfile(oslProfile Profile)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_closeProfile\n");
+#endif
+
+ if ( Profile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [profile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ pProfile = acquireProfile(Profile,sal_True);
+
+ if ( pProfile != 0 )
+ {
+ if ( !( pProfile->m_Flags & osl_Profile_READLOCK ) && ( pProfile->m_Flags & FLG_MODIFIED ) )
+ {
+/* if (pProfile->m_pFile == NULL) */
+/* pProfile->m_pFile = openFileImpl(pProfile->m_Filename, sal_True); */
+
+ storeProfile(pProfile, sal_False);
+ }
+ }
+ else
+ {
+ pProfile = acquireProfile(Profile,sal_False);
+ }
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [pProfile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ if (pProfile->m_pFile != NULL)
+ closeFileImpl(pProfile->m_pFile);
+ }
+
+ pProfile->m_pFile = NULL;
+ rtl_uString_release(pProfile->m_strFileName);
+ pProfile->m_strFileName = NULL;
+
+ /* release whole profile data types memory */
+ if ( pProfile->m_NoLines > 0)
+ {
+ unsigned int index=0;
+ if ( pProfile->m_Lines != 0 )
+ {
+ for ( index = 0 ; index < pProfile->m_NoLines ; ++index)
+ {
+ if ( pProfile->m_Lines[index] != 0 )
+ {
+ free(pProfile->m_Lines[index]);
+ }
+ }
+ free(pProfile->m_Lines);
+ }
+ if ( pProfile->m_Sections != 0 )
+ {
+ /*osl_TProfileSection* pSections=pProfile->m_Sections;*/
+ for ( index = 0 ; index < pProfile->m_NoSections ; ++index )
+ {
+ if ( pProfile->m_Sections[index].m_Entries != 0 )
+ {
+ free(pProfile->m_Sections[index].m_Entries);
+ }
+ }
+ free(pProfile->m_Sections);
+ }
+
+ }
+ free(pProfile);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_closeProfile [ok]\n");
+#endif
+ return (sal_True);
+}
+
+
+sal_Bool SAL_CALL osl_flushProfile(oslProfile Profile)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*) Profile;
+ osl_TFile* pFile;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_flushProfile()\n");
+#endif
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [pProfile == 0]\n");
+#endif
+ return sal_False;
+ }
+
+ pFile = pProfile->m_pFile;
+ if ( !( pFile != 0 && pFile->m_Handle >= 0 ) )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [invalid file]\n");
+#endif
+ return sal_False;
+ }
+
+ if ( pProfile->m_Flags & FLG_MODIFIED )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("swapping to storeprofile\n");
+#endif
+ bRet = storeProfile(pProfile,sal_False);
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_flushProfile() [ok]\n");
+#endif
+ return bRet;
+}
+
+static sal_Bool writeProfileImpl(osl_TFile* pFile)
+{
+ DWORD BytesWritten=0;
+ BOOL bRet;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileImpl()\n");
+#endif
+
+ if ( !( pFile != 0 && pFile->m_Handle != INVALID_HANDLE_VALUE ) || ( pFile->m_pWriteBuf == 0 ) )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileImpl() [invalid args]\n");
+#endif
+ return sal_False;
+ }
+
+#ifdef DEBUG_OSL_PROFILE
+/* OSL_TRACE("File Buffer in writeProfileImpl '%s' size == '%i' '%i'(%i)\n",
+ pFile->m_pWriteBuf,pFile->m_nWriteBufLen,strlen(pFile->m_pWriteBuf),pFile->m_nWriteBufLen - pFile->m_nWriteBufFree);*/
+#endif
+
+ bRet=WriteFile(pFile->m_Handle, pFile->m_pWriteBuf, pFile->m_nWriteBufLen - pFile->m_nWriteBufFree,&BytesWritten,NULL);
+
+ if ( bRet == 0 || BytesWritten <= 0 )
+ {
+ OSL_ENSURE(bRet,"WriteFile failed!!!");
+
+ OSL_TRACE("write failed '%s'\n",strerror(errno));
+
+/* OSL_TRACE("Out osl_writeProfileImpl() [write '%s']\n",strerror(errno));*/
+ return (sal_False);
+ }
+
+ free(pFile->m_pWriteBuf);
+ pFile->m_pWriteBuf=0;
+ pFile->m_nWriteBufLen=0;
+ pFile->m_nWriteBufFree=0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileImpl() [ok]\n");
+#endif
+ return sal_True;
+}
+
+
+sal_Bool SAL_CALL osl_readProfileString(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Char* pszString, sal_uInt32 MaxLen,
+ const sal_Char* pszDefault)
+{
+ sal_uInt32 NoEntry;
+ const sal_Char* pStr = 0;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileString\n");
+#endif
+
+ pProfile = acquireProfile(Profile, sal_False);
+
+ if (pProfile == NULL)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [pProfile==0]\n");
+#endif
+
+
+ return (sal_False);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) &&
+ (NoEntry < pSec->m_NoEntries) &&
+ ((pStr = strchr(pProfile->m_Lines[pSec->m_Entries[NoEntry].m_Line],
+ '=')) != NULL))
+ pStr++;
+ else
+ pStr = pszDefault;
+
+ if ( pStr != 0 )
+ {
+ pStr = stripBlanks(pStr, NULL);
+ MaxLen = (MaxLen - 1 < strlen(pStr)) ? (MaxLen - 1) : strlen(pStr);
+ pStr = stripBlanks(pStr, &MaxLen);
+ strncpy(pszString, pStr, MaxLen);
+ pszString[MaxLen] = '\0';
+ }
+ }
+ else
+ {
+ ::osl::LongPathBuffer< sal_Char > aFileName( MAX_LONG_PATH );
+
+ WideCharToMultiByte(CP_ACP,0, reinterpret_cast<LPCWSTR>(pProfile->m_strFileName->buffer), -1, aFileName, aFileName.getBufSizeInSymbols(), NULL, NULL);
+ GetPrivateProfileString(pszSection, pszEntry, pszDefault, pszString, MaxLen, aFileName);
+ }
+
+ releaseProfile(pProfile);
+
+ if ( pStr == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [pStr==0]\n");
+#endif
+
+
+ return (sal_False);
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileString [ok]\n");
+#endif
+
+
+
+
+ return (sal_True);
+}
+
+
+sal_Bool SAL_CALL osl_readProfileBool(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Bool Default)
+{
+ sal_Char Line[32];
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileBool\n");
+#endif
+
+ if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), ""))
+ {
+ if ((stricmp(Line, STR_INI_BOOLYES) == 0) ||
+ (stricmp(Line, STR_INI_BOOLON) == 0) ||
+ (stricmp(Line, STR_INI_BOOLONE) == 0))
+ Default = sal_True;
+ else
+ if ((stricmp(Line, STR_INI_BOOLNO) == 0) ||
+ (stricmp(Line, STR_INI_BOOLOFF) == 0) ||
+ (stricmp(Line, STR_INI_BOOLZERO) == 0))
+ Default = sal_False;
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileBool [ok]\n");
+#endif
+
+ return (Default);
+}
+
+
+sal_uInt32 SAL_CALL osl_readProfileIdent(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_uInt32 FirstId, const sal_Char* Strings[],
+ sal_uInt32 Default)
+{
+ sal_uInt32 i;
+ sal_Char Line[256];
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_readProfileIdent\n");
+#endif
+
+ if (osl_readProfileString(Profile, pszSection, pszEntry, Line, sizeof(Line), ""))
+ {
+ i = 0;
+ while (Strings[i] != NULL)
+ {
+ if (stricmp(Line, Strings[i]) == 0)
+ {
+ Default = i + FirstId;
+ break;
+ }
+ i++;
+ }
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_readProfileIdent [ok]\n");
+#endif
+ return (Default);
+}
+
+sal_Bool SAL_CALL osl_writeProfileString(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ const sal_Char* pszString)
+{
+ sal_uInt32 i;
+ sal_Bool bRet = sal_False;
+ sal_uInt32 NoEntry;
+ const sal_Char* pStr;
+ sal_Char Line[4096];
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileString\n");
+#endif
+
+ pProfile = acquireProfile(Profile, sal_True);
+
+ if (pProfile == NULL)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [pProfile==0]\n");
+#endif
+ return (sal_False);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if ((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) == NULL)
+ {
+ Line[0] = '\0';
+ addLine(pProfile, Line);
+
+ Line[0] = '[';
+ strcpy(&Line[1], pszSection);
+ Line[1 + strlen(pszSection)] = ']';
+ Line[2 + strlen(pszSection)] = '\0';
+
+ if (((pStr = addLine(pProfile, Line)) == NULL) ||
+ (! addSection(pProfile, pProfile->m_NoLines - 1, &pStr[1], strlen(pszSection))))
+ {
+ releaseProfile(pProfile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [not added]\n");
+#endif
+ return (sal_False);
+ }
+
+ pSec = &pProfile->m_Sections[pProfile->m_NoSections - 1];
+ NoEntry = pSec->m_NoEntries;
+ }
+
+ Line[0] = '\0';
+ strcpy(&Line[0], pszEntry);
+ Line[0 + strlen(pszEntry)] = '=';
+ strcpy(&Line[1 + strlen(pszEntry)], pszString);
+
+ if (NoEntry >= pSec->m_NoEntries)
+ {
+ if (pSec->m_NoEntries > 0)
+ i = pSec->m_Entries[pSec->m_NoEntries - 1].m_Line + 1;
+ else
+ i = pSec->m_Line + 1;
+
+ if (((pStr = insertLine(pProfile, Line, i)) == NULL) ||
+ (! addEntry(pProfile, pSec, i, pStr, strlen(pszEntry))))
+ {
+ releaseProfile(pProfile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [not inserted]\n");
+#endif
+ return (sal_False);
+ }
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ else
+ {
+ i = pSec->m_Entries[NoEntry].m_Line;
+ free(pProfile->m_Lines[i]);
+ pProfile->m_Lines[i] = strdup(Line);
+ setEntry(pProfile, pSec, NoEntry, i, pProfile->m_Lines[i], strlen(pszEntry));
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ }
+ else
+ {
+ ::osl::LongPathBuffer< sal_Char > aFileName( MAX_LONG_PATH );
+
+ WideCharToMultiByte(CP_ACP,0, reinterpret_cast<LPCWSTR>(pProfile->m_strFileName->buffer), -1, aFileName, aFileName.getBufSizeInSymbols(), NULL, NULL);
+ WritePrivateProfileString(pszSection, pszEntry, pszString, aFileName);
+ }
+
+ bRet = releaseProfile(pProfile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileString [ok]\n");
+#endif
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_writeProfileBool(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_Bool Value)
+{
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileBool\n");
+#endif
+
+ if (Value)
+ bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLONE);
+ else
+ bRet=osl_writeProfileString(Profile, pszSection, pszEntry, STR_INI_BOOLZERO);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileBool [ok]\n");
+#endif
+
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_writeProfileIdent(oslProfile Profile,
+ const sal_Char* pszSection, const sal_Char* pszEntry,
+ sal_uInt32 FirstId, const sal_Char* Strings[],
+ sal_uInt32 Value)
+{
+ int i, n;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_writeProfileIdent\n");
+#endif
+
+ for (n = 0; Strings[n] != NULL; n++);
+
+ if ((i = Value - FirstId) >= n)
+ bRet=sal_False;
+ else
+ bRet=osl_writeProfileString(Profile, pszSection, pszEntry, Strings[i]);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_writeProfileIdent\n");
+#endif
+ return bRet;
+}
+
+
+sal_Bool SAL_CALL osl_removeProfileEntry(oslProfile Profile,
+ const sal_Char *pszSection, const sal_Char *pszEntry)
+{
+ sal_uInt32 NoEntry;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+ sal_Bool bRet = sal_False;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_removeProfileEntry\n");
+#endif
+
+ pProfile = acquireProfile(Profile, sal_True);
+
+ if (pProfile == NULL)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_removeProfileEntry [pProfile==0]\n");
+#endif
+
+
+ return (sal_False);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (((pSec = findEntry(pProfile, pszSection, pszEntry, &NoEntry)) != NULL) &&
+ (NoEntry < pSec->m_NoEntries))
+ {
+ removeLine(pProfile, pSec->m_Entries[NoEntry].m_Line);
+ removeEntry(pSec, NoEntry);
+ if (pSec->m_NoEntries == 0)
+ {
+ removeLine(pProfile, pSec->m_Line);
+
+ /* remove any empty separation line */
+ if ((pSec->m_Line > 0) && (pProfile->m_Lines[pSec->m_Line - 1][0] == '\0'))
+ removeLine(pProfile, pSec->m_Line - 1);
+
+ removeSection(pProfile, pSec);
+ }
+
+ pProfile->m_Flags |= FLG_MODIFIED;
+ }
+ }
+ else
+ {
+ ::osl::LongPathBuffer< sal_Char > aFileName( MAX_LONG_PATH );
+
+ WideCharToMultiByte(CP_ACP,0, reinterpret_cast<LPCWSTR>(pProfile->m_strFileName->buffer), -1, aFileName, aFileName.getBufSizeInSymbols(), NULL, NULL);
+ WritePrivateProfileString(pszSection, pszEntry, NULL, aFileName);
+ }
+
+ bRet = releaseProfile(pProfile);
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_removeProfileEntry [ok]\n");
+#endif
+ return bRet;
+}
+
+
+sal_uInt32 SAL_CALL osl_getProfileSectionEntries(oslProfile Profile, const sal_Char *pszSection,
+ sal_Char* pszBuffer, sal_uInt32 MaxLen)
+{
+ sal_uInt32 i, n = 0;
+ sal_uInt32 NoEntry;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = 0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In osl_getProfileSectionEntries\n");
+#endif
+
+ pProfile = acquireProfile(Profile, sal_False);
+
+ if (pProfile == NULL)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSectionEntries [pProfile=0]\n");
+#endif
+
+
+ return (0);
+ }
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if ((pSec = findEntry(pProfile, pszSection, "", &NoEntry)) != NULL)
+ {
+ if (MaxLen != 0)
+ {
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ {
+ if ((n + pSec->m_Entries[i].m_Len + 1) < MaxLen)
+ {
+ strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Entries[i].m_Line]
+ [pSec->m_Entries[i].m_Offset], pSec->m_Entries[i].m_Len);
+ n += pSec->m_Entries[i].m_Len;
+ pszBuffer[n++] = '\0';
+ }
+ else
+ break;
+
+ }
+
+ pszBuffer[n++] = '\0';
+ }
+ else
+ {
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ n += pSec->m_Entries[i].m_Len + 1;
+
+ n += 1;
+ }
+ }
+ else
+ n = 0;
+ }
+ else
+ {
+ ::osl::LongPathBuffer< sal_Char > aFileName( MAX_LONG_PATH );
+
+ WideCharToMultiByte(CP_ACP,0, reinterpret_cast<LPCWSTR>(pProfile->m_strFileName->buffer), -1, aFileName, aFileName.getBufSizeInSymbols(), NULL, NULL);
+ n = GetPrivateProfileString(pszSection, NULL, NULL, pszBuffer, MaxLen, aFileName);
+ }
+
+ releaseProfile(pProfile);
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out osl_getProfileSectionEntries [ok]\n");
+#endif
+
+ return (n);
+}
+
+
+sal_Bool SAL_CALL osl_getProfileName(rtl_uString* strPath, rtl_uString* strName, rtl_uString** strProfileName)
+{
+ sal_Bool bFailed;
+ ::osl::LongPathBuffer< sal_Unicode > aFile( MAX_LONG_PATH );
+ ::osl::LongPathBuffer< sal_Unicode > aPath( MAX_LONG_PATH );
+ sal_uInt32 nFileLen = 0;
+ sal_uInt32 nPathLen = 0;
+
+ rtl_uString * strTmp = NULL;
+ oslFileError nError;
+
+ /* build file name */
+ if (strName && strName->length)
+ {
+ if( ::sal::static_int_cast< sal_uInt32 >( strName->length ) >= aFile.getBufSizeInSymbols() )
+ return sal_False;
+
+ copy_ustr_n( aFile, strName->buffer, strName->length+1);
+ nFileLen = strName->length;
+
+ if (rtl_ustr_indexOfChar( aFile, L'.' ) == -1)
+ {
+ if (nFileLen + wcslen(STR_INI_EXTENSION) >= aFile.getBufSizeInSymbols())
+ return sal_False;
+
+ /* add default extension */
+ copy_ustr_n( aFile + nFileLen, STR_INI_EXTENSION, wcslen(STR_INI_EXTENSION)+1 );
+ nFileLen += wcslen(STR_INI_EXTENSION);
+ }
+ }
+ else
+ {
+ rtl_uString *strProgName = NULL;
+ sal_Unicode *pProgName;
+ sal_Int32 nOffset = 0;
+ sal_Int32 nLen;
+ sal_Int32 nPos;
+
+ if (osl_getExecutableFile(&strProgName) != osl_Process_E_None)
+ return sal_False;
+
+ /* remove path and extension from filename */
+ pProgName = strProgName->buffer;
+ nLen = strProgName->length ;
+
+ if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L'/' )) != -1)
+ nOffset = nPos + 1;
+ else if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L':' )) != -1)
+ nOffset = nPos + 1;
+
+ if ((nPos = rtl_ustr_lastIndexOfChar( pProgName, L'.' )) != -1 )
+ nLen -= 4;
+
+ if ((nFileLen = nLen - nOffset) >= aFile.getBufSizeInSymbols())
+ return sal_False;
+
+ copy_ustr_n(aFile, pProgName + nOffset, nFileLen);
+
+ if (nFileLen + wcslen(STR_INI_EXTENSION) >= aFile.getBufSizeInSymbols())
+ return sal_False;
+
+ /* add default extension */
+ copy_ustr_n(aFile + nFileLen, STR_INI_EXTENSION, wcslen(STR_INI_EXTENSION)+1);
+ nFileLen += wcslen(STR_INI_EXTENSION);
+
+ rtl_uString_release( strProgName );
+ }
+
+ if (aFile[0] == 0)
+ return sal_False;
+
+ /* build directory path */
+ if (strPath && strPath->length)
+ {
+ sal_Unicode *pPath = rtl_uString_getStr(strPath);
+ sal_Int32 nLen = rtl_uString_getLength(strPath);
+
+ if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METAHOME) , STR_INI_METAHOME) == 0) &&
+ ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METAHOME)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAHOME)] == '/')))
+ {
+ rtl_uString * strHome = NULL;
+ oslSecurity security = osl_getCurrentSecurity();
+
+ bFailed = ! osl_getHomeDir(security, &strHome);
+ osl_freeSecurityHandle(security);
+
+ if (bFailed) return (sal_False);
+
+ if ( ::sal::static_int_cast< sal_uInt32 >( strHome->length ) >= aPath.getBufSizeInSymbols())
+ return sal_False;
+
+ copy_ustr_n( aPath, strHome->buffer, strHome->length+1);
+ nPathLen = strHome->length;
+
+ if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METAHOME))
+ {
+ pPath += RTL_CONSTASCII_LENGTH(STR_INI_METAHOME);
+ nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METAHOME);
+
+ if (nLen + nPathLen >= aPath.getBufSizeInSymbols())
+ return sal_False;
+
+ copy_ustr_n(aPath + nPathLen, pPath, nLen+1);
+ nPathLen += nLen;
+ }
+
+ rtl_uString_release(strHome);
+ }
+
+ else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METACFG), STR_INI_METACFG) == 0) &&
+ ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METACFG)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METACFG)] == '/')))
+ {
+ rtl_uString * strConfig = NULL;
+ oslSecurity security = osl_getCurrentSecurity();
+
+ bFailed = ! osl_getConfigDir(security, &strConfig);
+ osl_freeSecurityHandle(security);
+
+ if (bFailed) return (sal_False);
+
+ if ( ::sal::static_int_cast< sal_uInt32 >( strConfig->length ) >= aPath.getBufSizeInSymbols())
+ return sal_False;
+
+ copy_ustr_n( aPath, strConfig->buffer, strConfig->length+1 );
+ nPathLen = strConfig->length;
+
+ if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METACFG))
+ {
+ pPath += RTL_CONSTASCII_LENGTH(STR_INI_METACFG);
+ nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METACFG);
+
+ if (nLen + nPathLen >= aPath.getBufSizeInSymbols())
+ return sal_False;
+
+ copy_ustr_n(aPath + nPathLen, pPath, nLen+1);
+ nPathLen += nLen;
+ }
+
+ rtl_uString_release(strConfig);
+ }
+
+ else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METASYS), STR_INI_METASYS) == 0) &&
+ ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METASYS)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METASYS)] == '/')))
+ {
+ if (((nPathLen = GetWindowsDirectoryW(::osl::mingw_reinterpret_cast<LPWSTR>(aPath), aPath.getBufSizeInSymbols())) == 0) || (nPathLen >= aPath.getBufSizeInSymbols()))
+ return (sal_False);
+
+ if (nLen > RTL_CONSTASCII_LENGTH(STR_INI_METASYS))
+ {
+ pPath += RTL_CONSTASCII_LENGTH(STR_INI_METASYS);
+ nLen -= RTL_CONSTASCII_LENGTH(STR_INI_METASYS);
+
+ if (nLen + nPathLen >= aPath.getBufSizeInSymbols())
+ return sal_False;
+
+ copy_ustr_n(aPath + nPathLen, pPath, nLen+1);
+ nPathLen += nLen;
+ }
+ }
+
+ else if ((rtl_ustr_ascii_compare_WithLength(pPath, RTL_CONSTASCII_LENGTH(STR_INI_METAINS), STR_INI_METAINS) == 0) &&
+ ((nLen == RTL_CONSTASCII_LENGTH(STR_INI_METAINS)) || (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAINS)] == '/') ||
+ (pPath[RTL_CONSTASCII_LENGTH(STR_INI_METAINS)] == '"') ) )
+ {
+ if (! lookupProfile(pPath + RTL_CONSTASCII_LENGTH(STR_INI_METAINS), aFile, aPath))
+ return (sal_False);
+
+ nPathLen = rtl_ustr_getLength(aPath);
+ }
+
+ else if( ::sal::static_int_cast< sal_uInt32 >( nLen ) < aPath.getBufSizeInSymbols())
+ {
+ copy_ustr_n(aPath, pPath, nLen+1);
+ nPathLen = rtl_ustr_getLength(aPath);
+ }
+ else
+ return sal_False;
+ }
+ else
+ {
+ rtl_uString * strConfigDir = NULL;
+ oslSecurity security = osl_getCurrentSecurity();
+
+ bFailed = ! osl_getConfigDir(security, &strConfigDir);
+ osl_freeSecurityHandle(security);
+
+ if (bFailed) return (sal_False);
+ if ( ::sal::static_int_cast< sal_uInt32 >( strConfigDir->length ) >= aPath.getBufSizeInSymbols() )
+ return sal_False;
+
+ copy_ustr_n(aPath, strConfigDir->buffer, strConfigDir->length+1);
+ nPathLen = strConfigDir->length;
+ }
+
+ if (nPathLen && (aPath[nPathLen - 1] != L'/') && (aPath[nPathLen - 1] != L'\\'))
+ {
+ aPath[nPathLen++] = L'\\';
+ aPath[nPathLen] = 0;
+ }
+
+ if (nPathLen + nFileLen >= aPath.getBufSizeInSymbols())
+ return sal_False;
+
+ /* append file name */
+ copy_ustr_n(aPath + nPathLen, aFile, nFileLen+1);
+ nPathLen += nFileLen;
+
+ /* copy filename */
+ rtl_uString_newFromStr_WithLength(&strTmp, aPath, nPathLen);
+ nError = osl_getFileURLFromSystemPath(strTmp, strProfileName);
+ rtl_uString_release(strTmp);
+
+ return (sal_Bool) (nError == osl_File_E_None);
+}
+
+
+sal_uInt32 SAL_CALL osl_getProfileSections(oslProfile Profile, sal_Char* pszBuffer, sal_uInt32 MaxLen)
+{
+ sal_uInt32 i, n = 0;
+ osl_TProfileSection* pSec;
+ osl_TProfileImpl* pProfile = acquireProfile(Profile, sal_False);
+
+ if (pProfile == NULL)
+ return (0);
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (MaxLen != 0)
+ {
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if ((n + pSec->m_Len + 1) < MaxLen)
+ {
+ strncpy(&pszBuffer[n], &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset],
+ pSec->m_Len);
+ n += pSec->m_Len;
+ pszBuffer[n++] = '\0';
+ }
+ else
+ break;
+ }
+
+ pszBuffer[n++] = '\0';
+ }
+ else
+ {
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ n += pProfile->m_Sections[i].m_Len + 1;
+
+ n += 1;
+ }
+ }
+ else
+ {
+ ::osl::LongPathBuffer< sal_Char > aFileName( MAX_LONG_PATH );
+
+ WideCharToMultiByte(CP_ACP,0, reinterpret_cast<LPCWSTR>(pProfile->m_strFileName->buffer), -1, aFileName, aFileName.getBufSizeInSymbols(), NULL, NULL);
+ n = GetPrivateProfileSectionNames(pszBuffer, MaxLen, aFileName);
+ }
+
+ releaseProfile(pProfile);
+
+ return (n);
+}
+
+
+
+
+/*****************************************************************************/
+/* Static Module Functions */
+/*****************************************************************************/
+
+static osl_TStamp getFileStamp(osl_TFile* pFile)
+{
+ FILETIME FileTime;
+
+ if ((pFile->m_Handle == INVALID_HANDLE_VALUE) ||
+ (! GetFileTime(pFile->m_Handle, NULL, NULL, &FileTime)))
+ memset(&FileTime, 0, sizeof(FileTime));
+
+ return (FileTime);
+}
+
+
+
+static sal_Bool lockFile(const osl_TFile* pFile, osl_TLockMode eMode)
+{
+ sal_Bool status = sal_False;
+ OVERLAPPED Overlapped;
+
+ if (pFile->m_Handle == INVALID_HANDLE_VALUE)
+ return (sal_False);
+
+ memset(&Overlapped, 0, sizeof(Overlapped));
+
+ switch (eMode)
+ {
+ case un_lock:
+ status = (sal_Bool) UnlockFileEx(
+ pFile->m_Handle, 0, 0xFFFFFFFF, 0, &Overlapped);
+ break;
+
+ case read_lock:
+ status = (sal_Bool) LockFileEx(
+ pFile->m_Handle, 0, 0, 0xFFFFFFFF, 0, &Overlapped);
+ break;
+
+ case write_lock:
+ status = (sal_Bool) LockFileEx(
+ pFile->m_Handle, LOCKFILE_EXCLUSIVE_LOCK, 0, 0xFFFFFFFF, 0,
+ &Overlapped);
+ break;
+ }
+
+ return (status);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+static osl_TFile* openFileImpl(rtl_uString * strFileName, oslProfileOption ProfileFlags )
+{
+ osl_TFile* pFile = reinterpret_cast< osl_TFile*>( calloc( 1, sizeof(osl_TFile) ) );
+ sal_Bool bWriteable = sal_False;
+
+/* if ( ProfileFlags & ( osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE | osl_Profile_READWRITE ) )*/
+ if ( ProfileFlags & ( osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE ) )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("setting bWriteable to TRUE\n");
+#endif
+ bWriteable=sal_True;
+ }
+
+ if (! bWriteable)
+ {
+#if 0
+//#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("opening '%s' read only\n",pszFilename);
+#endif
+
+ pFile->m_Handle = CreateFileW( reinterpret_cast<LPCWSTR>(rtl_uString_getStr( strFileName )), GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+
+ /* mfe: argghh!!! do not check if the file could be openend */
+ /* default mode expects it that way!!! */
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("opening '%s' read/write\n",pszFilename);
+#endif
+
+ if ((pFile->m_Handle = CreateFileW( reinterpret_cast<LPCWSTR>(rtl_uString_getStr( strFileName )), GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))
+ == INVALID_HANDLE_VALUE)
+ {
+ free(pFile);
+ return (NULL);
+ }
+ }
+
+ pFile->m_pWriteBuf=0;
+ pFile->m_nWriteBufFree=0;
+ pFile->m_nWriteBufLen=0;
+
+ if ( ProfileFlags & (osl_Profile_WRITELOCK | osl_Profile_READLOCK ) )
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("locking '%s' file\n",pszFilename);
+#endif
+
+ lockFile(pFile, bWriteable ? write_lock : read_lock);
+ }
+
+ /* mfe: new WriteBuf obsolete */
+/* pFile->m_pWritePtr = pFile->m_Buf;*/
+/* pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);*/
+
+ return (pFile);
+}
+
+
+
+
+
+
+
+
+
+static osl_TStamp closeFileImpl(osl_TFile* pFile)
+{
+ osl_TStamp stamp = {0, 0};
+
+ if ( pFile == 0 )
+ {
+ return stamp;
+ }
+
+ if (pFile->m_Handle != INVALID_HANDLE_VALUE)
+ {
+ /* mfe: new WriteBuf obsolete */
+ /* we just closing the file here, DO NOT write, it has to be handled in higher levels */
+/* if (pFile->m_pWritePtr > pFile->m_Buf)*/
+/* {*/
+/* DWORD Bytes;*/
+
+/* WriteFile(pFile->m_Handle, pFile->m_WriteBuf,*/
+/* pFile->m_pWritePtr - pFile->m_WriteBuf,*/
+/* &Bytes, NULL);*/
+/* }*/
+
+ stamp = getFileStamp(pFile);
+
+ lockFile(pFile, un_lock);
+
+ CloseHandle(pFile->m_Handle);
+ pFile->m_Handle = INVALID_HANDLE_VALUE;
+ }
+
+ if ( pFile->m_pWriteBuf != 0 )
+ {
+ free(pFile->m_pWriteBuf);
+ }
+
+ free(pFile);
+
+ return(stamp);
+}
+
+
+
+
+
+
+
+
+static sal_Bool rewindFile(osl_TFile* pFile, sal_Bool bTruncate)
+{
+ if (pFile->m_Handle != INVALID_HANDLE_VALUE)
+ {
+ /* mfe: new WriteBuf obsolete */
+ /* we just closing the file here, DO NOT write, it has to be handled in higher levels */
+/* if (pFile->m_pWritePtr > pFile->m_WriteBuf)*/
+/* {*/
+/* DWORD Bytes;*/
+
+/* WriteFile(pFile->m_Handle, pFile->m_WriteBuf,*/
+/* pFile->m_pWritePtr - pFile->m_WriteBuf,*/
+/* &Bytes, NULL);*/
+
+/* pFile->m_pWritePtr = pFile->m_WriteBuf;*/
+/* }*/
+
+ pFile->m_pReadPtr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);
+
+ SetFilePointer(pFile->m_Handle, 0, NULL, FILE_BEGIN);
+
+ if (bTruncate)
+ SetEndOfFile(pFile->m_Handle);
+ }
+
+ return (sal_True);
+}
+
+
+
+
+
+
+
+
+
+
+static sal_Bool getLine(osl_TFile* pFile, const sal_Char *pszLine, int MaxLen)
+{
+ DWORD Max;
+ size_t Free, Bytes;
+ sal_Char* pChr;
+ sal_Char* pLine = (sal_Char *)pszLine;
+
+ if (pFile->m_Handle == INVALID_HANDLE_VALUE)
+ return (sal_False);
+
+ MaxLen -= 1;
+
+ do
+ {
+ Bytes = sizeof(pFile->m_ReadBuf) - (pFile->m_pReadPtr - pFile->m_ReadBuf);
+
+ if (Bytes <= 1)
+ {
+ /* refill buffer */
+ memcpy(pFile->m_ReadBuf, pFile->m_pReadPtr, Bytes);
+ pFile->m_pReadPtr = pFile->m_ReadBuf;
+
+ Free = sizeof(pFile->m_ReadBuf) - Bytes;
+
+ if (! ReadFile(pFile->m_Handle, &pFile->m_ReadBuf[Bytes], Free, &Max, NULL))
+ {
+ *pLine = '\0';
+ return (sal_False);
+ }
+
+ if (Max < Free)
+ {
+ if ((Max == 0) && (pLine == pszLine))
+ {
+ *pLine = '\0';
+ return (sal_False);
+ }
+
+ pFile->m_ReadBuf[Bytes + Max] = '\0';
+ }
+ }
+
+ for (pChr = pFile->m_pReadPtr;
+ (*pChr != '\n') && (*pChr != '\r') && (*pChr != '\0') &&
+ (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1));
+ pChr++);
+
+ Max = min(pChr - pFile->m_pReadPtr, MaxLen);
+ memcpy(pLine, pFile->m_pReadPtr, Max);
+ MaxLen -= Max;
+ pLine += Max;
+
+ if (pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf) - 1))
+ {
+ if (*pChr != '\0')
+ {
+ if ((pChr[0] == '\r') && (pChr[1] == '\n'))
+ pChr += 2;
+ else
+ pChr += 1;
+ }
+
+ if ((pChr < (pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf))) &&
+ (*pChr == '\0'))
+ pChr = pFile->m_ReadBuf + sizeof(pFile->m_ReadBuf);
+
+ *pLine = '\0';
+
+ /* setting MaxLen to -1 indicates terminating read loop */
+ MaxLen = -1;
+ }
+
+ pFile->m_pReadPtr = pChr;
+ }
+ while (MaxLen > 0);
+
+ return (sal_True);
+}
+
+
+
+
+
+
+
+
+
+
+static sal_Bool putLine(osl_TFile* pFile, const sal_Char *pszLine)
+{
+ unsigned int Len = strlen(pszLine);
+
+#ifdef DEBUG_OSL_PROFILE
+ int strLen=0;
+#endif
+
+ if ( pFile == 0 || pFile->m_Handle < 0 )
+ {
+ return (sal_False);
+ }
+
+ if ( pFile->m_pWriteBuf == 0 )
+ {
+ pFile->m_pWriteBuf = (sal_Char*) malloc(Len+3);
+ pFile->m_nWriteBufLen = Len+3;
+ pFile->m_nWriteBufFree = Len+3;
+ }
+ else
+ {
+ if ( pFile->m_nWriteBufFree <= Len + 3 )
+ {
+ sal_Char* pTmp;
+
+ pTmp=(sal_Char*) realloc(pFile->m_pWriteBuf,( ( pFile->m_nWriteBufLen + Len ) * 2) );
+ if ( pTmp == 0 )
+ {
+ return sal_False;
+ }
+ pFile->m_pWriteBuf = pTmp;
+ pFile->m_nWriteBufFree = pFile->m_nWriteBufFree + pFile->m_nWriteBufLen + ( 2 * Len );
+ pFile->m_nWriteBufLen = ( pFile->m_nWriteBufLen + Len ) * 2;
+ memset( (pFile->m_pWriteBuf) + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ), 0, pFile->m_nWriteBufFree);
+ }
+ }
+
+
+
+ memcpy(pFile->m_pWriteBuf + ( pFile->m_nWriteBufLen - pFile->m_nWriteBufFree ),pszLine,Len+1);
+#ifdef DEBUG_OSL_PROFILE
+ strLen = strlen(pFile->m_pWriteBuf);
+#endif
+ pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len]='\r';
+ pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len + 1]='\n';
+ pFile->m_pWriteBuf[pFile->m_nWriteBufLen - pFile->m_nWriteBufFree + Len + 2]='\0';
+
+ pFile->m_nWriteBufFree-=Len+2;
+
+#ifdef DEBUG_OSL_PROFILE
+/* OSL_TRACE("File Buffer in _putLine '%s' '%i'(%i)\n",pFile->m_pWriteBuf,strlen(pFile->m_pWriteBuf),pFile->m_nWriteBufLen - pFile->m_nWriteBufFree);*/
+#endif
+
+ return (sal_True);
+}
+
+/* platform specific end */
+
+
+static const sal_Char* stripBlanks(const sal_Char* String, sal_uInt32* pLen)
+{
+ if ( (pLen != NULL) && ( *pLen != 0 ) )
+ {
+ while ((String[*pLen - 1] == ' ') || (String[*pLen - 1] == '\t'))
+ (*pLen)--;
+
+ while ((*String == ' ') || (*String == '\t'))
+ {
+ String++;
+ (*pLen)--;
+ }
+ }
+ else
+ while ((*String == ' ') || (*String == '\t'))
+ String++;
+
+ return (String);
+}
+
+static const sal_Char* addLine(osl_TProfileImpl* pProfile, const sal_Char* Line)
+{
+ if (pProfile->m_NoLines >= pProfile->m_MaxLines)
+ {
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_MaxLines = LINES_INI;
+ pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *));
+ memset(pProfile->m_Lines,0,pProfile->m_MaxLines * sizeof(sal_Char *));
+ }
+ else
+ {
+ unsigned int index=0;
+ unsigned int oldmax=pProfile->m_MaxLines;
+
+ pProfile->m_MaxLines += LINES_ADD;
+ pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines, pProfile->m_MaxLines * sizeof(sal_Char *));
+
+ for ( index = oldmax ; index < pProfile->m_MaxLines ; ++index )
+ {
+ pProfile->m_Lines[index]=0;
+ }
+ }
+
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_NoLines = 0;
+ pProfile->m_MaxLines = 0;
+ return (NULL);
+ }
+
+ }
+
+ if ( pProfile->m_Lines != 0 && pProfile->m_Lines[pProfile->m_NoLines] != 0 )
+ {
+ free(pProfile->m_Lines[pProfile->m_NoLines]);
+ }
+ pProfile->m_Lines[pProfile->m_NoLines++] = strdup(Line);
+
+ return (pProfile->m_Lines[pProfile->m_NoLines - 1]);
+}
+
+static const sal_Char* insertLine(osl_TProfileImpl* pProfile, const sal_Char* Line, sal_uInt32 LineNo)
+{
+ if (pProfile->m_NoLines >= pProfile->m_MaxLines)
+ {
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_MaxLines = LINES_INI;
+ pProfile->m_Lines = (sal_Char **)malloc(pProfile->m_MaxLines * sizeof(sal_Char *));
+ memset(pProfile->m_Lines,0,pProfile->m_MaxLines * sizeof(sal_Char *));
+ }
+ else
+ {
+ pProfile->m_MaxLines += LINES_ADD;
+ pProfile->m_Lines = (sal_Char **)realloc(pProfile->m_Lines,
+ pProfile->m_MaxLines * sizeof(sal_Char *));
+
+ memset(&pProfile->m_Lines[pProfile->m_NoLines],
+ 0,
+ (pProfile->m_MaxLines - pProfile->m_NoLines - 1) * sizeof(sal_Char*));
+ }
+
+ if (pProfile->m_Lines == NULL)
+ {
+ pProfile->m_NoLines = 0;
+ pProfile->m_MaxLines = 0;
+ return (NULL);
+ }
+ }
+
+ LineNo = LineNo > pProfile->m_NoLines ? pProfile->m_NoLines : LineNo;
+
+ if (LineNo < pProfile->m_NoLines)
+ {
+ sal_uInt32 i, n;
+ osl_TProfileSection* pSec;
+
+ memmove(&pProfile->m_Lines[LineNo + 1], &pProfile->m_Lines[LineNo],
+ (pProfile->m_NoLines - LineNo) * sizeof(sal_Char *));
+
+
+ /* adjust line references */
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if (pSec->m_Line >= LineNo)
+ pSec->m_Line++;
+
+ for (n = 0; n < pSec->m_NoEntries; n++)
+ if (pSec->m_Entries[n].m_Line >= LineNo)
+ pSec->m_Entries[n].m_Line++;
+ }
+ }
+
+ pProfile->m_NoLines++;
+
+ pProfile->m_Lines[LineNo] = strdup(Line);
+
+ return (pProfile->m_Lines[LineNo]);
+}
+
+static void removeLine(osl_TProfileImpl* pProfile, sal_uInt32 LineNo)
+{
+ if (LineNo < pProfile->m_NoLines)
+ {
+ free(pProfile->m_Lines[LineNo]);
+ pProfile->m_Lines[LineNo]=0;
+ if (pProfile->m_NoLines - LineNo > 1)
+ {
+ sal_uInt32 i, n;
+ osl_TProfileSection* pSec;
+
+ memmove(&pProfile->m_Lines[LineNo], &pProfile->m_Lines[LineNo + 1],
+ (pProfile->m_NoLines - LineNo - 1) * sizeof(sal_Char *));
+
+ memset(&pProfile->m_Lines[pProfile->m_NoLines - 1],
+ 0,
+ (pProfile->m_MaxLines - pProfile->m_NoLines) * sizeof(sal_Char*));
+
+ /* adjust line references */
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ pSec = &pProfile->m_Sections[i];
+
+ if (pSec->m_Line > LineNo)
+ pSec->m_Line--;
+
+ for (n = 0; n < pSec->m_NoEntries; n++)
+ if (pSec->m_Entries[n].m_Line > LineNo)
+ pSec->m_Entries[n].m_Line--;
+ }
+ }
+ else
+ {
+ pProfile->m_Lines[LineNo] = 0;
+ }
+
+ pProfile->m_NoLines--;
+ }
+
+ return;
+}
+
+static void setEntry(osl_TProfileImpl* pProfile, osl_TProfileSection* pSection,
+ sal_uInt32 NoEntry, sal_uInt32 Line,
+ const sal_Char* Entry, sal_uInt32 Len)
+{
+ Entry = stripBlanks(Entry, &Len);
+ pSection->m_Entries[NoEntry].m_Line = Line;
+ pSection->m_Entries[NoEntry].m_Offset = Entry - pProfile->m_Lines[Line];
+ pSection->m_Entries[NoEntry].m_Len = Len;
+
+ return;
+}
+
+static sal_Bool addEntry(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection,
+ int Line, const sal_Char* Entry, sal_uInt32 Len)
+{
+ if (pSection != NULL)
+ {
+ if (pSection->m_NoEntries >= pSection->m_MaxEntries)
+ {
+ if (pSection->m_Entries == NULL)
+ {
+ pSection->m_MaxEntries = ENTRIES_INI;
+ pSection->m_Entries = (osl_TProfileEntry *)malloc(
+ pSection->m_MaxEntries * sizeof(osl_TProfileEntry));
+ }
+ else
+ {
+ pSection->m_MaxEntries += ENTRIES_ADD;
+ pSection->m_Entries = (osl_TProfileEntry *)realloc(pSection->m_Entries,
+ pSection->m_MaxEntries * sizeof(osl_TProfileEntry));
+ }
+
+ if (pSection->m_Entries == NULL)
+ {
+ pSection->m_NoEntries = 0;
+ pSection->m_MaxEntries = 0;
+ return (sal_False);
+ }
+ }
+
+ pSection->m_NoEntries++;
+
+ Entry = stripBlanks(Entry, &Len);
+ setEntry(pProfile, pSection, pSection->m_NoEntries - 1, Line,
+ Entry, Len);
+
+ return (sal_True);
+ }
+
+ return (sal_False);
+}
+
+static void removeEntry(osl_TProfileSection *pSection, sal_uInt32 NoEntry)
+{
+ if (NoEntry < pSection->m_NoEntries)
+ {
+ if (pSection->m_NoEntries - NoEntry > 1)
+ {
+ memmove(&pSection->m_Entries[NoEntry],
+ &pSection->m_Entries[NoEntry + 1],
+ (pSection->m_NoEntries - NoEntry - 1) * sizeof(osl_TProfileEntry));
+ pSection->m_Entries[pSection->m_NoEntries - 1].m_Line=0;
+ pSection->m_Entries[pSection->m_NoEntries - 1].m_Offset=0;
+ pSection->m_Entries[pSection->m_NoEntries - 1].m_Len=0;
+ }
+
+ pSection->m_NoEntries--;
+ }
+
+ return;
+}
+
+static sal_Bool addSection(osl_TProfileImpl* pProfile, int Line, const sal_Char* Section, sal_uInt32 Len)
+{
+ if (pProfile->m_NoSections >= pProfile->m_MaxSections)
+ {
+ if (pProfile->m_Sections == NULL)
+ {
+ pProfile->m_MaxSections = SECTIONS_INI;
+ pProfile->m_Sections = (osl_TProfileSection *)malloc(pProfile->m_MaxSections * sizeof(osl_TProfileSection));
+ memset(pProfile->m_Sections,0,pProfile->m_MaxSections * sizeof(osl_TProfileSection));
+ }
+ else
+ {
+ unsigned int index=0;
+ unsigned int oldmax=pProfile->m_MaxSections;
+
+ pProfile->m_MaxSections += SECTIONS_ADD;
+ pProfile->m_Sections = (osl_TProfileSection *)realloc(pProfile->m_Sections,
+ pProfile->m_MaxSections * sizeof(osl_TProfileSection));
+ for ( index = oldmax ; index < pProfile->m_MaxSections ; ++index )
+ {
+ pProfile->m_Sections[index].m_Entries=0;
+ }
+ }
+
+ if (pProfile->m_Sections == NULL)
+ {
+ pProfile->m_NoSections = 0;
+ pProfile->m_MaxSections = 0;
+ return (sal_False);
+ }
+ }
+
+ pProfile->m_NoSections++;
+
+ if ( pProfile->m_Sections[(pProfile->m_NoSections) - 1].m_Entries != 0 )
+ {
+ free(pProfile->m_Sections[(pProfile->m_NoSections) - 1].m_Entries);
+ }
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Entries = NULL;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_NoEntries = 0;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_MaxEntries = 0;
+
+ Section = (sal_Char *)stripBlanks(Section, &Len);
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Line = Line;
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Offset = Section - pProfile->m_Lines[Line];
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Len = Len;
+
+ return (sal_True);
+}
+
+static void removeSection(osl_TProfileImpl* pProfile, osl_TProfileSection *pSection)
+{
+ sal_uInt32 Section;
+
+ if ((Section = pSection - pProfile->m_Sections) < pProfile->m_NoSections)
+ {
+ free (pSection->m_Entries);
+ pSection->m_Entries=0;
+ if (pProfile->m_NoSections - Section > 1)
+ {
+ memmove(&pProfile->m_Sections[Section], &pProfile->m_Sections[Section + 1],
+ (pProfile->m_NoSections - Section - 1) * sizeof(osl_TProfileSection));
+
+ memset(&pProfile->m_Sections[pProfile->m_NoSections - 1],
+ 0,
+ (pProfile->m_MaxSections - pProfile->m_NoSections) * sizeof(osl_TProfileSection));
+ pProfile->m_Sections[pProfile->m_NoSections - 1].m_Entries = 0;
+ }
+ else
+ {
+ pSection->m_Entries = 0;
+ }
+
+ pProfile->m_NoSections--;
+ }
+
+ return;
+}
+
+static osl_TProfileSection* findEntry(osl_TProfileImpl* pProfile, const sal_Char* Section,
+ const sal_Char* Entry, sal_uInt32 *pNoEntry)
+{
+static sal_uInt32 Sect = 0;
+ sal_uInt32 i, n;
+ sal_uInt32 Len;
+ const sal_Char* pStr;
+ osl_TProfileSection* pSec = NULL;
+
+ Len = strlen(Section);
+ Section = (sal_Char *)stripBlanks(Section, &Len);
+
+ n = Sect;
+
+ for (i = 0; i < pProfile->m_NoSections; i++)
+ {
+ n %= pProfile->m_NoSections;
+ pSec = &pProfile->m_Sections[n];
+ if ((Len == pSec->m_Len) &&
+ (strnicmp(Section, &pProfile->m_Lines[pSec->m_Line][pSec->m_Offset], pSec->m_Len)
+ == 0))
+ break;
+ n++;
+ }
+
+ Sect = n;
+
+ if (i < pProfile->m_NoSections)
+ {
+ Len = strlen(Entry);
+ Entry = stripBlanks(Entry, &Len);
+
+ *pNoEntry = pSec->m_NoEntries;
+
+ for (i = 0; i < pSec->m_NoEntries; i++)
+ {
+ pStr = &pProfile->m_Lines[pSec->m_Entries[i].m_Line]
+ [pSec->m_Entries[i].m_Offset];
+ if ((Len == pSec->m_Entries[i].m_Len) &&
+ (strnicmp(Entry, pStr, pSec->m_Entries[i].m_Len)
+ == 0))
+ {
+ *pNoEntry = i;
+ break;
+ }
+ }
+ }
+ else
+ pSec = NULL;
+
+ return (pSec);
+}
+
+static sal_Bool loadProfile(osl_TFile* pFile, osl_TProfileImpl* pProfile)
+{
+ sal_uInt32 i;
+ sal_Char* pStr;
+ sal_Char* pChar;
+ sal_Char Line[4096];
+
+ pProfile->m_NoLines = 0;
+ pProfile->m_NoSections = 0;
+
+ OSL_VERIFY(rewindFile(pFile, sal_False));
+
+ while (getLine(pFile, Line, sizeof(Line)))
+ {
+ if (! addLine(pProfile, Line))
+ return (sal_False);
+ }
+
+ for (i = 0; i < pProfile->m_NoLines; i++)
+ {
+ pStr = (sal_Char *)stripBlanks(pProfile->m_Lines[i], NULL);
+
+ if ((*pStr == '\0') || (*pStr == ';'))
+ continue;
+
+ if ((*pStr != '[') || ((pChar = strrchr(pStr, ']')) == NULL) ||
+ ((pChar - pStr) <= 2))
+ {
+ /* insert entry */
+
+ if (pProfile->m_NoSections < 1)
+ continue;
+
+ if ((pChar = strchr(pStr, '=')) == NULL)
+ pChar = pStr + strlen(pStr);
+
+ if (! addEntry(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1],
+ i, pStr, pChar - pStr))
+ return (sal_False);
+ }
+ else
+ {
+ /* new section */
+
+ if (! addSection(pProfile, i, pStr + 1, pChar - pStr - 1))
+ return (sal_False);
+ }
+ }
+
+ return (sal_True);
+}
+
+
+
+
+
+static sal_Bool storeProfile(osl_TProfileImpl* pProfile, sal_Bool bCleanup)
+{
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In storeProfile\n");
+#endif
+
+ if (pProfile->m_Lines != NULL)
+ {
+ if (pProfile->m_Flags & FLG_MODIFIED)
+ {
+ sal_uInt32 i;
+
+ osl_TFile* pTmpFile = osl_openTmpProfileImpl(pProfile);
+
+ if ( pTmpFile == 0 )
+ {
+ return sal_False;
+ }
+
+ OSL_VERIFY(rewindFile(pTmpFile, sal_True));
+
+ for (i = 0; i < pProfile->m_NoLines; i++)
+ {
+ OSL_VERIFY(putLine(pTmpFile, pProfile->m_Lines[i]));
+ }
+
+ if ( ! writeProfileImpl(pTmpFile) )
+ {
+ if ( pTmpFile->m_pWriteBuf != 0 )
+ {
+ free(pTmpFile->m_pWriteBuf);
+ }
+
+ pTmpFile->m_pWriteBuf=0;
+ pTmpFile->m_nWriteBufLen=0;
+ pTmpFile->m_nWriteBufFree=0;
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out storeProfile [not flushed]\n");
+#endif
+ closeFileImpl(pTmpFile);
+
+ return sal_False;
+ }
+
+ pProfile->m_Flags &= ~FLG_MODIFIED;
+
+ closeFileImpl(pProfile->m_pFile);
+ closeFileImpl(pTmpFile);
+
+ osl_ProfileSwapProfileNames(pProfile);
+
+/* free(pProfile->m_pFile);*/
+/* free(pTmpFile);*/
+
+ pProfile->m_pFile = openFileImpl(pProfile->m_strFileName,pProfile->m_Flags);
+
+ }
+
+ if (bCleanup)
+ {
+ while (pProfile->m_NoLines > 0)
+ removeLine(pProfile, pProfile->m_NoLines - 1);
+
+ free(pProfile->m_Lines);
+ pProfile->m_Lines = NULL;
+ pProfile->m_MaxLines = 0;
+
+ while (pProfile->m_NoSections > 0)
+ removeSection(pProfile, &pProfile->m_Sections[pProfile->m_NoSections - 1]);
+
+ free(pProfile->m_Sections);
+ pProfile->m_Sections = NULL;
+ pProfile->m_MaxSections = 0;
+ }
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out storeProfile [ok]\n");
+#endif
+ return (sal_True);
+}
+
+
+static osl_TFile* osl_openTmpProfileImpl(osl_TProfileImpl* pProfile)
+{
+ osl_TFile* pFile=0;
+ rtl_uString* ustrExtension=0;
+ rtl_uString* ustrTmpName=0;
+ oslProfileOption PFlags=0;
+
+ rtl_uString_newFromAscii(&ustrExtension,"tmp");
+
+
+ /* generate tmp profilename */
+ ustrTmpName=osl_ProfileGenerateExtension(pProfile->m_strFileName,ustrExtension);
+ rtl_uString_release(ustrExtension);
+
+ if ( ustrTmpName == 0 )
+ {
+ return 0;
+ }
+
+
+ if ( ! ( pProfile->m_Flags & osl_Profile_READLOCK ) )
+ {
+ PFlags |= osl_Profile_WRITELOCK;
+ }
+
+ /* open this file */
+ pFile = openFileImpl(ustrTmpName,pProfile->m_Flags | PFlags);
+
+
+ /* return new pFile */
+ return pFile;
+}
+
+
+static sal_Bool osl_ProfileSwapProfileNames(osl_TProfileImpl* pProfile)
+{
+ sal_Bool bRet = sal_False;
+
+ rtl_uString* ustrBakFile=0;
+ rtl_uString* ustrTmpFile=0;
+ rtl_uString* ustrIniFile=0;
+ rtl_uString* ustrExtension=0;
+
+
+ rtl_uString_newFromAscii(&ustrExtension,"bak");
+
+ ustrBakFile=osl_ProfileGenerateExtension(pProfile->m_strFileName,ustrExtension);
+ rtl_uString_release(ustrExtension);
+ ustrExtension=0;
+
+
+ rtl_uString_newFromAscii(&ustrExtension,"ini");
+
+ ustrIniFile=osl_ProfileGenerateExtension(pProfile->m_strFileName,ustrExtension);
+ rtl_uString_release(ustrExtension);
+ ustrExtension=0;
+
+
+ rtl_uString_newFromAscii(&ustrExtension,"tmp");
+
+ ustrTmpFile=osl_ProfileGenerateExtension(pProfile->m_strFileName,ustrExtension);
+ rtl_uString_release(ustrExtension);
+ ustrExtension=0;
+
+
+ /* unlink bak */
+ DeleteFileW( reinterpret_cast<LPCWSTR>(rtl_uString_getStr( ustrBakFile )) );
+
+ /* rename ini bak */
+ MoveFileExW( reinterpret_cast<LPCWSTR>(rtl_uString_getStr( ustrIniFile )), reinterpret_cast<LPCWSTR>(rtl_uString_getStr( ustrBakFile )), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH );
+
+ /* rename tmp ini */
+ MoveFileExW( reinterpret_cast<LPCWSTR>(rtl_uString_getStr( ustrTmpFile )), reinterpret_cast<LPCWSTR>(rtl_uString_getStr( ustrIniFile )), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH );
+
+ return bRet;
+}
+
+
+static rtl_uString* osl_ProfileGenerateExtension(rtl_uString* ustrFileName, rtl_uString* ustrExtension)
+{
+ rtl_uString* ustrNewFileName=0;
+ rtl_uString* ustrOldExtension = 0;
+ sal_Unicode* pExtensionBuf = 0;
+ sal_Unicode* pFileNameBuf = 0;
+ sal_Int32 nIndex = -1;
+
+ pFileNameBuf = rtl_uString_getStr(ustrFileName);
+
+ rtl_uString_newFromAscii(&ustrOldExtension,".");
+
+ pExtensionBuf = rtl_uString_getStr(ustrOldExtension);
+
+ nIndex = rtl_ustr_lastIndexOfChar(pFileNameBuf,*pExtensionBuf);
+
+ rtl_uString_newReplaceStrAt(&ustrNewFileName,
+ ustrFileName,
+ nIndex+1,
+ 3,
+ ustrExtension);
+
+ return ustrNewFileName;
+}
+
+
+static osl_TProfileImpl* acquireProfile(oslProfile Profile, sal_Bool bWriteable)
+{
+ osl_TProfileImpl* pProfile = (osl_TProfileImpl*)Profile;
+ oslProfileOption PFlags=0;
+
+
+ if ( bWriteable )
+ {
+/* PFlags = osl_Profile_DEFAULT | osl_Profile_READWRITE; */
+ PFlags = osl_Profile_DEFAULT | osl_Profile_WRITELOCK;
+ }
+ else
+ {
+ PFlags = osl_Profile_DEFAULT;
+ }
+
+
+ if (pProfile == NULL)
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("AUTOOPEN MODE\n");
+#endif
+
+
+
+ if ( ( pProfile = (osl_TProfileImpl*)osl_openProfile( NULL, PFlags ) ) != NULL )
+ {
+ pProfile->m_Flags |= FLG_AUTOOPEN;
+ }
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("try to acquire\n");
+#endif
+
+
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (! (pProfile->m_Flags & (osl_Profile_READLOCK |
+ osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE)))
+ {
+ osl_TStamp Stamp;
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("DEFAULT MODE\n");
+#endif
+ pProfile->m_pFile = openFileImpl(
+ pProfile->m_strFileName, pProfile->m_Flags | PFlags);
+ if (!pProfile->m_pFile)
+ return NULL;
+
+ Stamp = getFileStamp(pProfile->m_pFile);
+
+ if (memcmp(&Stamp, &(pProfile->m_Stamp), sizeof(osl_TStamp)))
+ {
+ pProfile->m_Stamp = Stamp;
+
+ loadProfile(pProfile->m_pFile, pProfile);
+ }
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("READ/WRITELOCK MODE\n");
+#endif
+
+
+ /* A readlock file could not be written */
+ if ((pProfile->m_Flags & osl_Profile_READLOCK) && bWriteable)
+ {
+ return (NULL);
+ }
+ }
+ }
+ }
+
+ return (pProfile);
+}
+
+static sal_Bool releaseProfile(osl_TProfileImpl* pProfile)
+{
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("In releaseProfile\n");
+#endif
+
+ if ( pProfile == 0 )
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [profile==0]\n");
+#endif
+ return sal_False;
+ }
+
+ if (! (pProfile->m_Flags & osl_Profile_SYSTEM))
+ {
+ if (pProfile->m_Flags & FLG_AUTOOPEN)
+ {
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [AUTOOPEN]\n");
+#endif
+ return (osl_closeProfile((oslProfile)pProfile));
+ }
+ else
+ {
+#ifdef DEBUG_OSL_PROFILE
+ OSL_TRACE("DEFAULT MODE\n");
+#endif
+ if (! (pProfile->m_Flags & (osl_Profile_READLOCK |
+ osl_Profile_WRITELOCK | osl_Profile_FLUSHWRITE)))
+ {
+ if (pProfile->m_Flags & FLG_MODIFIED)
+ storeProfile(pProfile, sal_False);
+
+ closeFileImpl(pProfile->m_pFile);
+ pProfile->m_pFile = NULL;
+ }
+ }
+ }
+
+#ifdef TRACE_OSL_PROFILE
+ OSL_TRACE("Out releaseProfile [ok]\n");
+#endif
+ return (sal_True);
+}
+
+static sal_Bool lookupProfile(const sal_Unicode *strPath, const sal_Unicode *strFile, sal_Unicode *strProfile)
+{
+ sal_Char *pChr, *pStr;
+ sal_Char Buffer[4096] = "";
+ sal_Char Product[132] = "";
+
+ ::osl::LongPathBuffer< sal_Unicode > aPath( MAX_LONG_PATH );
+ aPath[0] = 0;
+ DWORD dwPathLen = 0;
+
+ if (*strPath == L'"')
+ {
+ int i = 0;
+
+ strPath++;
+
+ while ((strPath[i] != L'"') && (strPath[i] != L'\0'))
+ i++;
+
+ WideCharToMultiByte(CP_ACP,0, reinterpret_cast<LPCWSTR>(strPath), i, Product, sizeof(Product), NULL, NULL);
+ Product[i] = '\0';
+ strPath += i;
+
+ if (*strPath == L'"')
+ strPath++;
+
+ if ( (*strPath == L'/') || (*strPath == L'\\') )
+ {
+ strPath++;
+ }
+ }
+
+ else
+ {
+ /* if we have not product identfication, do a special handling for soffice.ini */
+ if (rtl_ustr_ascii_compare(strFile, SVERSION_PROFILE) == 0)
+ {
+ rtl_uString * strSVProfile = NULL;
+ rtl_uString * strSVFallback = NULL;
+ rtl_uString * strSVLocation = NULL;
+ rtl_uString * strSVName = NULL;
+ ::osl::LongPathBuffer< sal_Char > aDir( MAX_LONG_PATH );
+ oslProfile hProfile;
+
+ rtl_uString_newFromAscii(&strSVFallback, SVERSION_FALLBACK);
+ rtl_uString_newFromAscii(&strSVLocation, SVERSION_LOCATION);
+ rtl_uString_newFromAscii(&strSVName, SVERSION_NAME);
+
+ /* open sversion.ini in the system directory, and try to locate the entry
+ with the highest version for StarOffice */
+ if (osl_getProfileName( strSVFallback, strSVName, &strSVProfile))
+ {
+ hProfile = osl_openProfile(strSVProfile, osl_Profile_READLOCK);
+ if (hProfile)
+ {
+ osl_getProfileSectionEntries(
+ hProfile, SVERSION_SECTION, Buffer, sizeof(Buffer));
+
+ for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1)
+ {
+ if ((strnicmp(
+ pChr, SVERSION_SOFFICE,
+ sizeof(SVERSION_SOFFICE) - 1)
+ == 0)
+ && (stricmp(Product, pChr) < 0))
+ {
+ osl_readProfileString(
+ hProfile, SVERSION_SECTION, pChr, aDir,
+ aDir.getBufSizeInSymbols(), "");
+
+ /* check for existence of path */
+ if (access(aDir, 0) >= 0)
+ strcpy(Product, pChr);
+ }
+ }
+
+ osl_closeProfile(hProfile);
+ }
+ rtl_uString_release(strSVProfile);
+ strSVProfile = NULL;
+ }
+
+ /* open sversion.ini in the users directory, and try to locate the entry
+ with the highest version for StarOffice */
+ if ((strcmp(SVERSION_LOCATION, SVERSION_FALLBACK) != 0) &&
+ (osl_getProfileName(strSVLocation, strSVName, &strSVProfile)))
+ {
+ hProfile = osl_openProfile(strSVProfile, osl_Profile_READLOCK);
+ if (hProfile)
+ {
+ osl_getProfileSectionEntries(
+ hProfile, SVERSION_SECTION, Buffer, sizeof(Buffer));
+
+ for (pChr = Buffer; *pChr != '\0'; pChr += strlen(pChr) + 1)
+ {
+ if ((strnicmp(
+ pChr, SVERSION_SOFFICE,
+ sizeof(SVERSION_SOFFICE) - 1)
+ == 0)
+ && (stricmp(Product, pChr) < 0))
+ {
+ osl_readProfileString(
+ hProfile, SVERSION_SECTION, pChr, aDir,
+ aDir.getBufSizeInSymbols(), "");
+
+ /* check for existence of path */
+ if (access(aDir, 0) >= 0)
+ strcpy(Product, pChr);
+ }
+ }
+
+ osl_closeProfile(hProfile);
+ }
+ rtl_uString_release(strSVProfile);
+ }
+
+ rtl_uString_release(strSVFallback);
+ rtl_uString_release(strSVLocation);
+ rtl_uString_release(strSVName);
+
+ /* remove any trailing build number */
+ if ((pChr = strrchr(Product, '/')) != NULL)
+ *pChr = '\0';
+ }
+ }
+
+ /* if we have an userid option eg. "-userid:rh[/usr/home/rh/staroffice]",
+ this will supercede all other locations */
+ {
+ sal_uInt32 n, nArgs = osl_getCommandArgCount();
+
+ for (n = 0; n < nArgs; n++)
+ {
+ rtl_uString * strCommandArg = NULL;
+
+ if ((osl_getCommandArg( n, &strCommandArg ) == osl_Process_E_None) &&
+ ((strCommandArg->buffer[0] == L'-') || (strCommandArg->buffer[0] == L'+')) &&
+ (rtl_ustr_ascii_compare_WithLength(strCommandArg->buffer, RTL_CONSTASCII_LENGTH(SVERSION_OPTION), SVERSION_OPTION)))
+ {
+ sal_Unicode *pCommandArg = strCommandArg->buffer + RTL_CONSTASCII_LENGTH(SVERSION_OPTION);
+ sal_Int32 nStart, nEnd;
+
+ if (((nStart = rtl_ustr_indexOfChar(pCommandArg, L'[')) != -1) &&
+ ((nEnd = rtl_ustr_indexOfChar(pCommandArg + nStart + 1, L']')) != -1))
+ {
+ dwPathLen = nEnd;
+ copy_ustr_n(aPath, pCommandArg + nStart + 1, dwPathLen);
+ aPath[dwPathLen] = 0;
+
+ /* build full path */
+ if ((aPath[dwPathLen - 1] != L'/') && (aPath[dwPathLen - 1] != L'\\'))
+ {
+ copy_ustr_n(aPath + dwPathLen++, L"/", 2);
+ }
+
+ if (*strPath)
+ {
+ copy_ustr_n(aPath + dwPathLen, strPath, rtl_ustr_getLength(strPath)+1);
+ dwPathLen += rtl_ustr_getLength(strPath);
+ }
+ else
+ {
+ ::osl::LongPathBuffer< sal_Char > aTmpPath( MAX_LONG_PATH );
+ int n;
+
+ if ((n = WideCharToMultiByte(CP_ACP,0, ::osl::mingw_reinterpret_cast<LPCWSTR>(aPath), -1, aTmpPath, aTmpPath.getBufSizeInSymbols(), NULL, NULL)) > 0)
+ {
+ strcpy(aTmpPath + n, SVERSION_USER);
+ if (access(aTmpPath, 0) >= 0)
+ {
+ dwPathLen += MultiByteToWideChar( CP_ACP, 0, SVERSION_USER, -1, reinterpret_cast<LPWSTR>(aPath + dwPathLen), aPath.getBufSizeInSymbols() - dwPathLen );
+ }
+ }
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+
+ if (dwPathLen == 0)
+ {
+ rtl_uString * strExecutable = NULL;
+ rtl_uString * strTmp = NULL;
+ sal_Int32 nPos;
+
+ /* try to find the file in the directory of the executbale */
+ if (osl_getExecutableFile(&strTmp) != osl_Process_E_None)
+ return (sal_False);
+
+ /* convert to native path */
+ if (osl_getSystemPathFromFileURL(strTmp, &strExecutable) != osl_File_E_None)
+ {
+ rtl_uString_release(strTmp);
+ return sal_False;
+ }
+
+ rtl_uString_release(strTmp);
+
+ /* seperate path from filename */
+ if ((nPos = rtl_ustr_lastIndexOfChar(strExecutable->buffer, L'\\')) == -1)
+ {
+ if ((nPos = rtl_ustr_lastIndexOfChar(strExecutable->buffer, L':')) == -1)
+ {
+ return sal_False;
+ }
+ else
+ {
+ copy_ustr_n(aPath, strExecutable->buffer, nPos);
+ aPath[nPos] = 0;
+ dwPathLen = nPos;
+ }
+ }
+ else
+ {
+ copy_ustr_n(aPath, strExecutable->buffer, nPos);
+ dwPathLen = nPos;
+ aPath[dwPathLen] = 0;
+ }
+
+ /* if we have no product identification use the executable file name */
+ if (*Product == 0)
+ {
+ WideCharToMultiByte(CP_ACP,0, reinterpret_cast<LPCWSTR>(strExecutable->buffer + nPos + 1), -1, Product, sizeof(Product), NULL, NULL);
+
+ /* remove extension */
+ if ((pChr = strrchr(Product, '.')) != NULL)
+ *pChr = '\0';
+ }
+
+ rtl_uString_release(strExecutable);
+
+ /* remember last subdir */
+ nPos = rtl_ustr_lastIndexOfChar(aPath, L'\\');
+
+ copy_ustr_n(aPath + dwPathLen++, L"\\", 2);
+
+ if (*strPath)
+ {
+ copy_ustr_n(aPath + dwPathLen, strPath, rtl_ustr_getLength(strPath)+1);
+ dwPathLen += rtl_ustr_getLength(strPath);
+ }
+
+ {
+ ::osl::LongPathBuffer< sal_Char > aTmpPath( MAX_LONG_PATH );
+
+ WideCharToMultiByte(CP_ACP,0, ::osl::mingw_reinterpret_cast<LPCWSTR>(aPath), -1, aTmpPath, aTmpPath.getBufSizeInSymbols(), NULL, NULL);
+
+ /* if file not exists, remove any specified subdirectories
+ like "bin" or "program" */
+
+ if (((access(aTmpPath, 0) < 0) && (nPos != -1)) || (*strPath == 0))
+ {
+ static sal_Char *SubDirs[] = SVERSION_DIRS;
+
+ int i = 0;
+ pStr = aTmpPath + nPos;
+
+ for (i = 0; i < (sizeof(SubDirs) / sizeof(SubDirs[0])); i++)
+ if (strnicmp(pStr + 1, SubDirs[i], strlen(SubDirs[i])) == 0)
+ {
+ if ( *strPath == 0)
+ {
+ strcpy(pStr + 1,SVERSION_USER);
+ if ( access(aTmpPath, 0) < 0 )
+ {
+ *(pStr+1)='\0';
+ }
+ else
+ {
+ dwPathLen = nPos + MultiByteToWideChar( CP_ACP, 0, SVERSION_USER, -1, reinterpret_cast<LPWSTR>(aPath + nPos + 1), aPath.getBufSizeInSymbols() - (nPos + 1) );
+ }
+ }
+ else
+ {
+ copy_ustr_n(aPath + nPos + 1, strPath, rtl_ustr_getLength(strPath)+1);
+ dwPathLen = nPos + 1 + rtl_ustr_getLength(strPath);
+ }
+
+ break;
+ }
+ }
+ }
+
+ if ((aPath[dwPathLen - 1] != L'/') && (aPath[dwPathLen - 1] != L'\\'))
+ {
+ aPath[dwPathLen++] = L'\\';
+ aPath[dwPathLen] = 0;
+ }
+
+ copy_ustr_n(aPath + dwPathLen, strFile, rtl_ustr_getLength(strFile)+1);
+
+ {
+ ::osl::LongPathBuffer< sal_Char > aTmpPath( MAX_LONG_PATH );
+
+ WideCharToMultiByte(CP_ACP,0, ::osl::mingw_reinterpret_cast<LPCWSTR>(aPath), -1, aTmpPath, aTmpPath.getBufSizeInSymbols(), NULL, NULL);
+
+ if ((access(aTmpPath, 0) < 0) && (strlen(Product) > 0))
+ {
+ rtl_uString * strSVFallback = NULL;
+ rtl_uString * strSVProfile = NULL;
+ rtl_uString * strSVLocation = NULL;
+ rtl_uString * strSVName = NULL;
+ oslProfile hProfile;
+
+ rtl_uString_newFromAscii(&strSVFallback, SVERSION_FALLBACK);
+ rtl_uString_newFromAscii(&strSVLocation, SVERSION_LOCATION);
+ rtl_uString_newFromAscii(&strSVName, SVERSION_NAME);
+
+ /* open sversion.ini in the system directory, and try to locate the entry
+ with the highest version for StarOffice */
+ if (osl_getProfileName(strSVLocation, strSVName, &strSVProfile))
+ {
+ hProfile = osl_openProfile(
+ strSVProfile, osl_Profile_READLOCK);
+ if (hProfile)
+ {
+ osl_readProfileString(
+ hProfile, SVERSION_SECTION, Product, Buffer,
+ sizeof(Buffer), "");
+ osl_closeProfile(hProfile);
+
+ /* if not found, try the fallback */
+ if ((strlen(Buffer) <= 0)
+ && (strcmp(SVERSION_LOCATION, SVERSION_FALLBACK)
+ != 0))
+ {
+ if (osl_getProfileName(
+ strSVFallback, strSVName, &strSVProfile))
+ {
+ hProfile = osl_openProfile(
+ strSVProfile, osl_Profile_READLOCK);
+ if (hProfile)
+ {
+ osl_readProfileString(
+ hProfile, SVERSION_SECTION, Product,
+ Buffer, sizeof(Buffer), "");
+ }
+ }
+
+ osl_closeProfile(hProfile);
+ }
+
+ if (strlen(Buffer) > 0)
+ {
+ dwPathLen = MultiByteToWideChar(
+ CP_ACP, 0, Buffer, -1, ::osl::mingw_reinterpret_cast<LPWSTR>(aPath), aPath.getBufSizeInSymbols() );
+ dwPathLen -=1;
+
+ /* build full path */
+ if ((aPath[dwPathLen - 1] != L'/')
+ && (aPath[dwPathLen - 1] != L'\\'))
+ {
+ copy_ustr_n(aPath + dwPathLen++, L"\\", 2);
+ }
+
+ if (*strPath)
+ {
+ copy_ustr_n(aPath + dwPathLen, strPath, rtl_ustr_getLength(strPath)+1);
+ dwPathLen += rtl_ustr_getLength(strPath);
+ }
+ else
+ {
+ ::osl::LongPathBuffer< sal_Char > aTmpPath( MAX_LONG_PATH );
+ int n;
+
+ if ((n = WideCharToMultiByte(
+ CP_ACP,0, ::osl::mingw_reinterpret_cast<LPCWSTR>(aPath), -1, aTmpPath,
+ aTmpPath.getBufSizeInSymbols(), NULL, NULL))
+ > 0)
+ {
+ strcpy(aTmpPath + n, SVERSION_USER);
+ if (access(aTmpPath, 0) >= 0)
+ {
+ dwPathLen += MultiByteToWideChar(
+ CP_ACP, 0, SVERSION_USER, -1,
+ reinterpret_cast<LPWSTR>(aPath + dwPathLen),
+ aPath.getBufSizeInSymbols() - dwPathLen );
+ }
+ }
+ }
+ }
+ }
+
+ rtl_uString_release(strSVProfile);
+ }
+
+ rtl_uString_release(strSVFallback);
+ rtl_uString_release(strSVLocation);
+ rtl_uString_release(strSVName);
+ }
+ }
+
+ aPath[dwPathLen] = 0;
+ }
+
+ /* copy filename */
+ copy_ustr_n(strProfile, aPath, dwPathLen+1);
+
+ return sal_True;
+}
+
+
diff --git a/sal/osl/w32/salinit.cxx b/sal/osl/w32/salinit.cxx
new file mode 100644
index 000000000000..ab124620a07c
--- /dev/null
+++ b/sal/osl/w32/salinit.cxx
@@ -0,0 +1,102 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "system.h"
+#include <osl/process.h>
+#include <sal/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Prototypes for initialization and deinitialization of SAL library
+
+void SAL_CALL sal_detail_initialize(int argc, char ** argv)
+{
+ // SetProcessDEPPolicy(PROCESS_DEP_ENABLE);
+ // SetDllDirectoryW(L"");
+ // SetSearchPathMode(
+ // BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT);
+ HMODULE h = GetModuleHandleW(L"kernel32.dll");
+ if (h != 0) {
+ FARPROC p = GetProcAddress(h, "SetProcessDEPPolicy");
+ if (p != 0) {
+ reinterpret_cast< BOOL (WINAPI *)(DWORD) >(p)(0x00000001);
+ }
+ p = GetProcAddress(h, "SetDllDirectoryW");
+ if (p != 0) {
+ reinterpret_cast< BOOL (WINAPI *)(LPCWSTR) >(p)(L"");
+ }
+ p = GetProcAddress(h, "SetSearchPathMode");
+ if (p != 0) {
+ reinterpret_cast< BOOL (WINAPI *)(DWORD) >(p)(0x8001);
+ }
+ }
+
+ WSADATA wsaData;
+ int error;
+ WORD wVersionRequested;
+
+ wVersionRequested = MAKEWORD(1, 1);
+
+ error = WSAStartup(wVersionRequested, &wsaData);
+ if ( 0 == error )
+ {
+ WORD wMajorVersionRequired = 1;
+ WORD wMinorVersionRequired = 1;
+
+ if ((LOBYTE(wsaData.wVersion) < wMajorVersionRequired) ||
+ (LOBYTE(wsaData.wVersion) == wMajorVersionRequired) &&
+ ((HIBYTE(wsaData.wVersion) < wMinorVersionRequired)))
+ {
+ // How to handle a very unlikely error ???
+ }
+ }
+ else
+ {
+ // How to handle a very unlikely error ???
+ }
+
+ osl_setCommandArgs(argc, argv);
+}
+
+void SAL_CALL sal_detail_deinitialize()
+{
+ if ( SOCKET_ERROR == WSACleanup() )
+ {
+ // We should never reach this point or we did wrong elsewhere
+ }
+}
+
+
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
diff --git a/sal/osl/w32/secimpl.h b/sal/osl/w32/secimpl.h
new file mode 100644
index 000000000000..97a9d9c44f9e
--- /dev/null
+++ b/sal/osl/w32/secimpl.h
@@ -0,0 +1,54 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SECURITYIMPL_H_
+#define _OSL_SECURITYIMPL_H_
+
+#include <winnetwk.h>
+
+#include <osl/security.h>
+
+#define USER_BUFFER_SIZE 256
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _oslSecurityImpl {
+ HANDLE m_hProfile;
+ HANDLE m_hToken;
+ sal_Unicode m_User[USER_BUFFER_SIZE];
+/* ts: Erweiterung um Fileserver-login */
+ NETRESOURCEW *m_pNetResource;
+} oslSecurityImpl;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/sal/osl/w32/security.c b/sal/osl/w32/security.c
new file mode 100644
index 000000000000..237ea67dc949
--- /dev/null
+++ b/sal/osl/w32/security.c
@@ -0,0 +1,991 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "system.h"
+
+#include <osl/security.h>
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <osl/file.h>
+#include <systools/win32/uwinapi.h>
+#include "secimpl.h"
+
+/*****************************************************************************/
+/* Data Type Definition */
+/*****************************************************************************/
+
+
+/* Data for use in (un)LoadProfile Functions */
+/* Declarations based on USERENV.H for Windows 2000 Beta 2 */
+#define PI_NOUI 0x00000001 // Prevents displaying of messages
+#define PI_APPLYPOLICY 0x00000002 // Apply NT4 style policy
+
+typedef struct _PROFILEINFOW {
+ DWORD dwSize; // Must be set to sizeof(PROFILEINFO)
+ DWORD dwFlags; // See flags above
+ LPWSTR lpUserName; // User name (required)
+ LPWSTR lpProfilePath; // Roaming profile path
+ LPWSTR lpDefaultPath; // Default user profile path
+ LPWSTR lpServerName; // Validating DC name in netbios format
+ LPWSTR lpPolicyPath; // Path to the NT4 style policy file
+ HANDLE hProfile; // Registry key handle - filled by function
+} PROFILEINFOW, FAR * LPPROFILEINFOW;
+
+/* Typedefs for function pointers in USERENV.DLL */
+typedef BOOL (STDMETHODCALLTYPE FAR * LPFNLOADUSERPROFILE) (
+ HANDLE hToken,
+ LPPROFILEINFOW lpProfileInfo
+);
+
+typedef BOOL (STDMETHODCALLTYPE FAR * LPFNUNLOADUSERPROFILE) (
+ HANDLE hToken,
+ HANDLE hProfile
+);
+
+typedef BOOL (STDMETHODCALLTYPE FAR * LPFNGETUSERPROFILEDIR) (
+ HANDLE hToken,
+ LPTSTR lpProfileDir,
+ LPDWORD lpcchSize
+);
+
+/* To get an impersonation token we need to create an impersonation
+ duplicate so every access token has to be created with duplicate
+ access rights */
+
+#define TOKEN_DUP_QUERY (TOKEN_QUERY|TOKEN_DUPLICATE)
+
+/*****************************************************************************/
+/* Static Module Function Declarations */
+/*****************************************************************************/
+
+static sal_Bool isWNT(void);
+static sal_Bool GetSpecialFolder(rtl_uString **strPath,int nFolder);
+static BOOL Privilege(LPTSTR pszPrivilege, BOOL bEnable);
+static sal_Bool SAL_CALL getUserNameImpl(oslSecurity Security, rtl_uString **strName, sal_Bool bIncludeDomain);
+
+/*****************************************************************************/
+/* Exported Module Functions */
+/*****************************************************************************/
+
+oslSecurity SAL_CALL osl_getCurrentSecurity(void)
+{
+ oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
+
+ pSecImpl->m_pNetResource = NULL;
+ pSecImpl->m_User[0] = '\0';
+ pSecImpl->m_hToken = NULL;
+ pSecImpl->m_hProfile = NULL;
+
+ return ((oslSecurity)pSecImpl);
+}
+
+oslSecurityError SAL_CALL osl_loginUser( rtl_uString *strUserName, rtl_uString *strPasswd, oslSecurity *pSecurity )
+{
+ oslSecurityError ret;
+
+ if (!isWNT())
+ {
+ *pSecurity = osl_getCurrentSecurity();
+ ret = osl_Security_E_None;
+ }
+ else
+ {
+ sal_Unicode* strUser;
+ sal_Unicode* strDomain = _wcsdup(rtl_uString_getStr(strUserName));
+ HANDLE hUserToken;
+
+ #if OSL_DEBUG_LEVEL > 0
+ LUID luid;
+ #endif
+
+ if (NULL != (strUser = wcschr(strDomain, L'/')))
+ *strUser++ = L'\0';
+ else
+ {
+ strUser = strDomain;
+ strDomain = NULL;
+ }
+
+ // this process must have the right: 'act as a part of operatingsystem'
+ OSL_ASSERT(LookupPrivilegeValue(NULL, SE_TCB_NAME, &luid));
+
+ if (LogonUserW(strUser, strDomain ? strDomain : L"", rtl_uString_getStr(strPasswd),
+ LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
+ &hUserToken))
+ {
+ oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
+
+ pSecImpl->m_pNetResource = NULL;
+ pSecImpl->m_hToken = hUserToken;
+ pSecImpl->m_hProfile = NULL;
+ wcscpy(pSecImpl->m_User, strUser);
+
+ *pSecurity = (oslSecurity)pSecImpl;
+ ret = osl_Security_E_None;
+ }
+ else
+ ret = osl_Security_E_UserUnknown;
+
+ if (strDomain)
+ free(strDomain);
+ else
+ free(strUser);
+ }
+
+ return ret;
+}
+
+oslSecurityError SAL_CALL osl_loginUserOnFileServer(rtl_uString *strUserName,
+ rtl_uString *strPasswd,
+ rtl_uString *strFileServer,
+ oslSecurity *pSecurity)
+{
+ oslSecurityError ret;
+ DWORD err;
+ NETRESOURCEW netResource;
+ sal_Unicode* remoteName;
+ sal_Unicode* userName;
+
+ remoteName = malloc(rtl_uString_getLength(strFileServer) + rtl_uString_getLength(strUserName) + 4);
+ userName = malloc(rtl_uString_getLength(strFileServer) + rtl_uString_getLength(strUserName) + 2);
+
+ wcscpy(remoteName, L"\\\\");
+ wcscat(remoteName, rtl_uString_getStr(strFileServer));
+ wcscat(remoteName, L"\\");
+ wcscat(remoteName, rtl_uString_getStr(strUserName));
+
+ wcscpy(userName, rtl_uString_getStr(strFileServer));
+ wcscat(userName, L"\\");
+ wcscat(userName, rtl_uString_getStr(strUserName));
+
+ netResource.dwScope = RESOURCE_GLOBALNET;
+ netResource.dwType = RESOURCETYPE_DISK;
+ netResource.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
+ netResource.dwUsage = RESOURCEUSAGE_CONNECTABLE;
+ netResource.lpLocalName = NULL;
+ netResource.lpRemoteName = remoteName;
+ netResource.lpComment = NULL;
+ netResource.lpProvider = NULL;
+
+ err = WNetAddConnection2W(&netResource, rtl_uString_getStr(strPasswd), userName, 0);
+
+ if ((err == NO_ERROR) || (err == ERROR_ALREADY_ASSIGNED))
+ {
+ oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
+
+ pSecImpl->m_pNetResource = malloc(sizeof(NETRESOURCE));
+ *pSecImpl->m_pNetResource = netResource;
+
+ pSecImpl->m_hToken = NULL;
+ pSecImpl->m_hProfile = NULL;
+ wcscpy(pSecImpl->m_User, rtl_uString_getStr(strUserName));
+
+ *pSecurity = (oslSecurity)pSecImpl;
+
+ ret = osl_Security_E_None;
+ }
+ else
+ ret = osl_Security_E_UserUnknown;
+
+ free(remoteName);
+ free(userName);
+
+ return ret;
+}
+
+
+static BOOL WINAPI CheckTokenMembership_Stub( HANDLE TokenHandle, PSID SidToCheck, PBOOL IsMember )
+{
+ typedef BOOL (WINAPI *CheckTokenMembership_PROC)( HANDLE, PSID, PBOOL );
+
+ static HMODULE hModule = NULL;
+ static CheckTokenMembership_PROC pCheckTokenMembership = NULL;
+
+ if ( !hModule )
+ {
+ /* SAL is always linked against ADVAPI32 so we can rely on that it is already mapped */
+
+ hModule = GetModuleHandleA( "ADVAPI32.DLL" );
+
+ pCheckTokenMembership = (CheckTokenMembership_PROC)GetProcAddress( hModule, "CheckTokenMembership" );
+ }
+
+ if ( pCheckTokenMembership )
+ return pCheckTokenMembership( TokenHandle, SidToCheck, IsMember );
+ else
+ {
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+ }
+
+}
+
+
+sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security)
+{
+ if (Security != NULL)
+ {
+ /* ts: on Window 95 systems any user seems to be an adminstrator */
+ if (!isWNT())
+ {
+ return(sal_True);
+ }
+ else
+ {
+ HANDLE hImpersonationToken = NULL;
+ PSID psidAdministrators;
+ SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY;
+ sal_Bool bSuccess = sal_False;
+
+
+ /* If Security contains an access token we need to duplicate it to an impersonation
+ access token. NULL works with CheckTokenMembership() as the current effective
+ impersonation token
+ */
+
+ if ( ((oslSecurityImpl*)Security)->m_hToken )
+ {
+ if ( !DuplicateToken (((oslSecurityImpl*)Security)->m_hToken, SecurityImpersonation, &hImpersonationToken) )
+ return sal_False;
+ }
+
+ /* CheckTokenMembership() can be used on W2K and higher (NT4 no longer supported by OOo)
+ and also works on Vista to retrieve the effective user rights. Just checking for
+ membership of Administrators group is not enough on Vista this would require additional
+ complicated checks as described in KB arcticle Q118626: http://support.microsoft.com/kb/118626/en-us
+ */
+
+ if (AllocateAndInitializeSid(&siaNtAuthority,
+ 2,
+ SECURITY_BUILTIN_DOMAIN_RID,
+ DOMAIN_ALIAS_RID_ADMINS,
+ 0, 0, 0, 0, 0, 0,
+ &psidAdministrators))
+ {
+ BOOL fSuccess = FALSE;
+
+ if ( CheckTokenMembership_Stub( hImpersonationToken, psidAdministrators, &fSuccess ) && fSuccess )
+ bSuccess = sal_True;
+
+ FreeSid(psidAdministrators);
+ }
+
+ if ( hImpersonationToken )
+ CloseHandle( hImpersonationToken );
+
+ return (bSuccess);
+ }
+ }
+ else
+ return (sal_False);
+}
+
+
+void SAL_CALL osl_freeSecurityHandle(oslSecurity Security)
+{
+ if (Security)
+ {
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
+
+ if (pSecImpl->m_pNetResource != NULL)
+ {
+ WNetCancelConnection2W(pSecImpl->m_pNetResource->lpRemoteName, 0, sal_True);
+
+ free(pSecImpl->m_pNetResource->lpRemoteName);
+ free(pSecImpl->m_pNetResource);
+ }
+
+ if (pSecImpl->m_hToken)
+ CloseHandle(pSecImpl->m_hToken);
+
+ if ( pSecImpl->m_hProfile )
+ CloseHandle(pSecImpl->m_hProfile);
+
+ free (pSecImpl);
+ }
+}
+
+
+sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, rtl_uString **strIdent)
+{
+ if (Security != NULL)
+ {
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
+
+ HANDLE hAccessToken = pSecImpl->m_hToken;
+
+ if (hAccessToken == NULL)
+ OpenProcessToken(GetCurrentProcess(), TOKEN_DUP_QUERY, &hAccessToken);
+
+ if (hAccessToken)
+ {
+ sal_Char *Ident;
+ DWORD nInfoBuffer = 512;
+ UCHAR* pInfoBuffer = malloc(nInfoBuffer);
+
+
+ while (!GetTokenInformation(hAccessToken, TokenUser,
+ pInfoBuffer, nInfoBuffer, &nInfoBuffer))
+ {
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
+ else
+ {
+ free(pInfoBuffer);
+ pInfoBuffer = NULL;
+ break;
+ }
+ }
+
+ if (pSecImpl->m_hToken == NULL)
+ CloseHandle(hAccessToken);
+
+ if (pInfoBuffer)
+ {
+ PSID pSid = ((PTOKEN_USER)pInfoBuffer)->User.Sid;
+ PSID_IDENTIFIER_AUTHORITY psia;
+ DWORD dwSubAuthorities;
+ DWORD dwSidRev=SID_REVISION;
+ DWORD dwCounter;
+ DWORD dwSidSize;
+
+ /* obtain SidIdentifierAuthority */
+ psia=GetSidIdentifierAuthority(pSid);
+
+ /* obtain sidsubauthority count */
+ dwSubAuthorities=min(*GetSidSubAuthorityCount(pSid), 5);
+
+ /* buffer length: S-SID_REVISION- + identifierauthority- + subauthorities- + NULL */
+ Ident=malloc(88*sizeof(sal_Char));
+
+ /* prepare S-SID_REVISION- */
+ dwSidSize=wsprintf(Ident, TEXT("S-%lu-"), dwSidRev);
+
+ /* prepare SidIdentifierAuthority */
+ if ((psia->Value[0] != 0) || (psia->Value[1] != 0))
+ {
+ dwSidSize+=wsprintf(Ident + strlen(Ident),
+ TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
+ (USHORT)psia->Value[0],
+ (USHORT)psia->Value[1],
+ (USHORT)psia->Value[2],
+ (USHORT)psia->Value[3],
+ (USHORT)psia->Value[4],
+ (USHORT)psia->Value[5]);
+ }
+ else
+ {
+ dwSidSize+=wsprintf(Ident + strlen(Ident),
+ TEXT("%lu"),
+ (ULONG)(psia->Value[5] ) +
+ (ULONG)(psia->Value[4] << 8) +
+ (ULONG)(psia->Value[3] << 16) +
+ (ULONG)(psia->Value[2] << 24) );
+ }
+
+ /* loop through SidSubAuthorities */
+ for (dwCounter=0; dwCounter < dwSubAuthorities; dwCounter++)
+ {
+ dwSidSize+=wsprintf(Ident + dwSidSize, TEXT("-%lu"),
+ *GetSidSubAuthority(pSid, dwCounter) );
+ }
+
+ rtl_uString_newFromAscii( strIdent, Ident );
+
+ free(pInfoBuffer);
+ free(Ident);
+
+ return (sal_True);
+ }
+ }
+ else
+ {
+ DWORD needed=0;
+ sal_Unicode *Ident;
+
+ WNetGetUserA(NULL, NULL, &needed);
+ needed = max( 16 , needed );
+ Ident=malloc(needed*sizeof(sal_Unicode));
+
+ if (WNetGetUserW(NULL, Ident, &needed) != NO_ERROR)
+ {
+ wcscpy(Ident, L"unknown");
+ Ident[7] = L'\0';
+ }
+
+ rtl_uString_newFromStr( strIdent, Ident);
+
+ free(Ident);
+
+ return sal_True;
+ }
+ }
+
+ return sal_False;
+}
+
+
+
+sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **strName)
+{
+ return getUserNameImpl(Security, strName, sal_True);
+}
+
+
+sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **pustrDirectory)
+{
+ rtl_uString *ustrSysDir = NULL;
+ sal_Bool bSuccess = sal_False;
+
+ if (Security != NULL)
+ {
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
+
+ if (pSecImpl->m_pNetResource != NULL)
+ {
+ rtl_uString_newFromStr( &ustrSysDir, pSecImpl->m_pNetResource->lpRemoteName);
+
+ bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath( ustrSysDir, pustrDirectory ));
+ }
+ else
+ {
+#if 0
+ if (pSecImpl->m_hToken)
+ {
+ DWORD nInfoBuffer = 512;
+ UCHAR* pInfoBuffer = malloc(nInfoBuffer);
+
+ while (!GetTokenInformation(pSecImpl->m_hToken, TokenUser,
+ pInfoBuffer, nInfoBuffer, &nInfoBuffer))
+ {
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
+ else
+ {
+ free(pInfoBuffer);
+ pInfoBuffer = NULL;
+ break;
+ }
+ }
+
+ /* not implemented */
+ OSL_ASSERT(sal_False);
+
+ if (pInfoBuffer)
+ {
+ /* if (EqualSid() ... */
+
+ }
+ }
+ else
+#endif
+
+ bSuccess = (sal_Bool)(GetSpecialFolder(&ustrSysDir, CSIDL_PERSONAL) &&
+ (osl_File_E_None == osl_getFileURLFromSystemPath(ustrSysDir, pustrDirectory)));
+ }
+ }
+
+ if ( ustrSysDir )
+ rtl_uString_release( ustrSysDir );
+
+ return bSuccess;
+}
+
+sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **pustrDirectory)
+{
+ sal_Bool bSuccess = sal_False;
+
+ if (Security != NULL)
+ {
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
+
+ if (pSecImpl->m_pNetResource != NULL)
+ {
+ rtl_uString *ustrSysDir = NULL;
+
+ rtl_uString_newFromStr( &ustrSysDir, pSecImpl->m_pNetResource->lpRemoteName);
+ bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath( ustrSysDir, pustrDirectory));
+
+ if ( ustrSysDir )
+ rtl_uString_release( ustrSysDir );
+ }
+ else
+ {
+ if (pSecImpl->m_hToken)
+ {
+ /* not implemented */
+ OSL_ASSERT(sal_False);
+ }
+ else
+ {
+ rtl_uString *ustrFile = NULL;
+ sal_Unicode sFile[_MAX_PATH];
+
+ if ( !GetSpecialFolder( &ustrFile, CSIDL_APPDATA) )
+ {
+ OSL_VERIFY(GetWindowsDirectoryW(sFile, _MAX_DIR) > 0);
+
+ rtl_uString_newFromStr( &ustrFile, sFile);
+ }
+
+ bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath(ustrFile, pustrDirectory));
+
+ if ( ustrFile )
+ rtl_uString_release( ustrFile );
+ }
+ }
+ }
+
+ return bSuccess;
+}
+
+
+sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security)
+{
+ /* CreateProcessAsUser does not load the specified user's profile
+ into the HKEY_USERS registry key. This means that access to information
+ in the HKEY_CURRENT_USER registry key may not produce results consistent
+ with a normal interactive logon.
+ It is your responsibility to load the user's registry hive into HKEY_USERS
+ with the LoadUserProfile function before calling CreateProcessAsUser.
+ */
+ BOOL bOk = FALSE;
+
+ RegCloseKey(HKEY_CURRENT_USER);
+
+ if (Privilege(SE_RESTORE_NAME, TRUE))
+ {
+ HMODULE hUserEnvLib = NULL;
+ LPFNLOADUSERPROFILE fLoadUserProfile = NULL;
+ LPFNUNLOADUSERPROFILE fUnloadUserProfile = NULL;
+ HANDLE hAccessToken = ((oslSecurityImpl*)Security)->m_hToken;
+ DWORD nError = 0;
+
+ /* try to create user profile */
+ if ( !hAccessToken )
+ {
+ /* retrieve security handle if not done before e.g. osl_getCurrentSecurity()
+ */
+ HANDLE hProcess = GetCurrentProcess();
+
+ if (hProcess != NULL)
+ {
+ OpenProcessToken(hProcess, TOKEN_IMPERSONATE, &hAccessToken);
+ CloseHandle(hProcess);
+ }
+ }
+
+ hUserEnvLib = LoadLibraryA("userenv.dll");
+
+ if (hUserEnvLib)
+ {
+ fLoadUserProfile = (LPFNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "LoadUserProfileW");
+ fUnloadUserProfile = (LPFNUNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "UnloadUserProfile");
+
+ if (fLoadUserProfile && fUnloadUserProfile)
+ {
+ rtl_uString *buffer = 0;
+ PROFILEINFOW pi;
+
+ getUserNameImpl(Security, &buffer, sal_False);
+
+ ZeroMemory( &pi, sizeof(pi) );
+ pi.dwSize = sizeof(pi);
+ pi.lpUserName = rtl_uString_getStr(buffer);
+ pi.dwFlags = PI_NOUI;
+
+ if (fLoadUserProfile(hAccessToken, &pi))
+ {
+ fUnloadUserProfile(hAccessToken, pi.hProfile);
+
+ bOk = TRUE;
+ }
+ else
+ nError = GetLastError();
+
+ rtl_uString_release(buffer);
+ }
+
+ FreeLibrary(hUserEnvLib);
+ }
+
+ if (hAccessToken && (hAccessToken != ((oslSecurityImpl*)Security)->m_hToken))
+ CloseHandle(hAccessToken);
+ }
+
+ return (sal_Bool)bOk;
+}
+
+
+void SAL_CALL osl_unloadUserProfile(oslSecurity Security)
+{
+ if ( ((oslSecurityImpl*)Security)->m_hProfile != NULL )
+ {
+ HMODULE hUserEnvLib = NULL;
+ LPFNLOADUSERPROFILE fLoadUserProfile = NULL;
+ LPFNUNLOADUSERPROFILE fUnloadUserProfile = NULL;
+ BOOL bOk = FALSE;
+ HANDLE hAccessToken = ((oslSecurityImpl*)Security)->m_hToken;
+
+ if ( !hAccessToken )
+ {
+ /* retrieve security handle if not done before e.g. osl_getCurrentSecurity()
+ */
+ HANDLE hProcess = GetCurrentProcess();
+
+ if (hProcess != NULL)
+ {
+ OpenProcessToken(hProcess, TOKEN_IMPERSONATE, &hAccessToken);
+ CloseHandle(hProcess);
+ }
+ }
+
+ hUserEnvLib = LoadLibrary("userenv.dll");
+
+ if (hUserEnvLib)
+ {
+ fLoadUserProfile = (LPFNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "LoadUserProfileA");
+ fUnloadUserProfile = (LPFNUNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "UnloadUserProfile");
+
+ if (fLoadUserProfile && fUnloadUserProfile)
+ {
+ /* unloading the user profile */
+ if (fLoadUserProfile && fUnloadUserProfile)
+ bOk = fUnloadUserProfile(hAccessToken, ((oslSecurityImpl*)Security)->m_hProfile);
+
+ if (hUserEnvLib)
+ FreeLibrary(hUserEnvLib);
+ }
+ }
+
+ ((oslSecurityImpl*)Security)->m_hProfile;
+
+ if (hAccessToken && (hAccessToken != ((oslSecurityImpl*)Security)->m_hToken))
+ {
+ CloseHandle(hAccessToken);
+ }
+ }
+}
+
+/*****************************************************************************/
+/* Static Module Functions */
+/*****************************************************************************/
+
+
+static sal_Bool GetSpecialFolder(rtl_uString **strPath, int nFolder)
+{
+ sal_Bool bRet = sal_False;
+ HINSTANCE hLibrary;
+ sal_Char PathA[_MAX_PATH];
+ sal_Unicode PathW[_MAX_PATH];
+
+ if ((hLibrary = LoadLibrary("shell32.dll")) != NULL)
+ {
+ BOOL (WINAPI *pSHGetSpecialFolderPathA)(HWND, LPSTR, int, BOOL);
+ BOOL (WINAPI *pSHGetSpecialFolderPathW)(HWND, LPWSTR, int, BOOL);
+
+ pSHGetSpecialFolderPathA = (BOOL (WINAPI *)(HWND, LPSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathA");
+ pSHGetSpecialFolderPathW = (BOOL (WINAPI *)(HWND, LPWSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathW");
+
+ if (pSHGetSpecialFolderPathA)
+ {
+ if (pSHGetSpecialFolderPathA(GetActiveWindow(), PathA, nFolder, TRUE))
+ {
+ rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS);
+ OSL_ASSERT(*strPath != NULL);
+ bRet = sal_True;
+ }
+ }
+ else if (pSHGetSpecialFolderPathW)
+ {
+ if (pSHGetSpecialFolderPathW(GetActiveWindow(), PathW, nFolder, TRUE))
+ {
+ rtl_uString_newFromStr( strPath, PathW);
+ bRet = sal_True;
+ }
+ }
+ else
+ {
+ HRESULT (WINAPI *pSHGetSpecialFolderLocation)(HWND, int, LPITEMIDLIST *) = (HRESULT (WINAPI *)(HWND, int, LPITEMIDLIST *))GetProcAddress(hLibrary, "SHGetSpecialFolderLocation");
+ BOOL (WINAPI *pSHGetPathFromIDListA)(LPCITEMIDLIST, LPSTR) = (BOOL (WINAPI *)(LPCITEMIDLIST, LPSTR))GetProcAddress(hLibrary, "SHGetPathFromIDListA");
+ BOOL (WINAPI *pSHGetPathFromIDListW)(LPCITEMIDLIST, LPWSTR) = (BOOL (WINAPI *)(LPCITEMIDLIST, LPWSTR))GetProcAddress(hLibrary, "SHGetPathFromIDListW");
+ HRESULT (WINAPI *pSHGetMalloc)(LPMALLOC *) = (HRESULT (WINAPI *)(LPMALLOC *))GetProcAddress(hLibrary, "SHGetMalloc");
+
+
+ if (pSHGetSpecialFolderLocation && (pSHGetPathFromIDListA || pSHGetPathFromIDListW ) && pSHGetMalloc )
+ {
+ LPITEMIDLIST pidl;
+ LPMALLOC pMalloc;
+ HRESULT hr;
+
+ hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl);
+
+ /* Get SHGetSpecialFolderLocation fails if directory does not exists. */
+ /* If it fails we try to create the directory and redo the call */
+ if (! SUCCEEDED(hr))
+ {
+ HKEY hRegKey;
+
+ if (RegOpenKey(HKEY_CURRENT_USER,
+ "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
+ &hRegKey) == ERROR_SUCCESS)
+ {
+ LONG lRet;
+ DWORD lSize = elementsof(PathA);
+ DWORD Type = REG_SZ;
+
+ switch (nFolder)
+ {
+ case CSIDL_APPDATA:
+ lRet = RegQueryValueEx(hRegKey, "AppData", NULL, &Type, (LPBYTE)PathA, &lSize);
+ break;
+
+ case CSIDL_PERSONAL:
+ lRet = RegQueryValueEx(hRegKey, "Personal", NULL, &Type, (LPBYTE)PathA, &lSize);
+ break;
+
+ default:
+ lRet = -1l;
+ }
+
+ if ((lRet == ERROR_SUCCESS) && (Type == REG_SZ))
+ {
+ if (_access(PathA, 0) < 0)
+ CreateDirectory(PathA, NULL);
+
+ hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl);
+ }
+
+ RegCloseKey(hRegKey);
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ if (pSHGetPathFromIDListW && pSHGetPathFromIDListW(pidl, PathW))
+ {
+ /* if directory does not exist, create it */
+ if (_waccess(PathW, 0) < 0)
+ CreateDirectoryW(PathW, NULL);
+
+ rtl_uString_newFromStr( strPath, PathW);
+ bRet = sal_True;
+ }
+ else if (pSHGetPathFromIDListA && pSHGetPathFromIDListA(pidl, PathA))
+ {
+ /* if directory does not exist, create it */
+ if (_access(PathA, 0) < 0)
+ CreateDirectoryA(PathA, NULL);
+
+ rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS);
+ OSL_ASSERT(*strPath != NULL);
+ bRet = sal_True;
+ }
+ }
+
+ if (SUCCEEDED(pSHGetMalloc(&pMalloc)))
+ {
+ pMalloc->lpVtbl->Free(pMalloc, pidl);
+ pMalloc->lpVtbl->Release(pMalloc);
+ }
+ }
+ }
+ }
+
+ FreeLibrary(hLibrary);
+
+ return (bRet);
+}
+
+
+static sal_Bool isWNT(void)
+{
+ static sal_Bool isInit = sal_False;
+ static sal_Bool isWNT = sal_False;
+
+ if (!isInit)
+ {
+ OSVERSIONINFO VersionInformation =
+
+ {
+ sizeof(OSVERSIONINFO),
+ 0,
+ 0,
+ 0,
+ 0,
+ "",
+ };
+
+ if (
+ GetVersionEx(&VersionInformation) &&
+ (VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ )
+ {
+ isWNT = sal_True;
+ }
+
+ isInit = sal_True;
+ }
+
+ return(isWNT);
+}
+
+static BOOL Privilege(LPTSTR strPrivilege, BOOL bEnable)
+{
+ HANDLE hToken;
+ TOKEN_PRIVILEGES tp;
+
+ /*
+ obtain the processes token
+ */
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_DUP_QUERY, &hToken))
+ return FALSE;
+
+ /*
+ get the luid
+ */
+ if (!LookupPrivilegeValue(NULL, strPrivilege, &tp.Privileges[0].Luid))
+ return FALSE;
+
+ tp.PrivilegeCount = 1;
+
+ if (bEnable)
+ tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+ else
+ tp.Privileges[0].Attributes = 0;
+
+ /*
+ enable or disable the privilege
+ */
+ if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
+ return FALSE;
+
+ if (!CloseHandle(hToken))
+ return FALSE;
+
+ return TRUE;
+}
+
+static sal_Bool SAL_CALL getUserNameImpl(oslSecurity Security, rtl_uString **strName, sal_Bool bIncludeDomain)
+{
+ if (Security != NULL)
+ {
+ oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
+
+ HANDLE hAccessToken = pSecImpl->m_hToken;
+
+ if (hAccessToken == NULL)
+ OpenProcessToken(GetCurrentProcess(), TOKEN_DUP_QUERY, &hAccessToken);
+
+ if (hAccessToken)
+ {
+ DWORD nInfoBuffer = 512;
+ UCHAR* pInfoBuffer = malloc(nInfoBuffer);
+
+ while (!GetTokenInformation(hAccessToken, TokenUser,
+ pInfoBuffer, nInfoBuffer, &nInfoBuffer))
+ {
+ if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
+ else
+ {
+ free(pInfoBuffer);
+ pInfoBuffer = NULL;
+ break;
+ }
+ }
+
+ if (pSecImpl->m_hToken == NULL)
+ CloseHandle(hAccessToken);
+
+ if (pInfoBuffer)
+ {
+ sal_Unicode UserName[128];
+ sal_Unicode DomainName[128];
+ sal_Unicode Name[257];
+ DWORD nUserName = sizeof(UserName);
+ DWORD nDomainName = sizeof(DomainName);
+ SID_NAME_USE sUse;
+
+ if (LookupAccountSidW(NULL, ((PTOKEN_USER)pInfoBuffer)->User.Sid,
+ UserName, &nUserName,
+ DomainName, &nDomainName, &sUse))
+ {
+ if (bIncludeDomain)
+ {
+ wcscpy(Name, DomainName);
+ wcscat(Name, L"/");
+ wcscat(Name, UserName);
+ }
+ else
+ {
+ wcscpy(Name, UserName);
+ }
+ }
+ rtl_uString_newFromStr( strName, Name);
+
+ free(pInfoBuffer);
+
+ return (sal_True);
+ }
+ }
+ else
+ {
+ DWORD needed=0;
+ sal_Unicode *pNameW=NULL;
+
+ WNetGetUserW(NULL, NULL, &needed);
+ pNameW = malloc (needed*sizeof(sal_Unicode));
+
+ if (WNetGetUserW(NULL, pNameW, &needed) == NO_ERROR)
+ {
+ rtl_uString_newFromStr( strName, pNameW);
+
+ if (pNameW)
+ free(pNameW);
+ return (sal_True);
+ }
+ else
+ if (wcslen(pSecImpl->m_User) > 0)
+ {
+ rtl_uString_newFromStr( strName, pSecImpl->m_pNetResource->lpRemoteName);
+
+ if (pNameW)
+ free(pNameW);
+
+ return (sal_True);
+ }
+
+ if (pNameW)
+ free(pNameW);
+ }
+ }
+
+ return sal_False;
+}
+
diff --git a/sal/osl/w32/semaphor.c b/sal/osl/w32/semaphor.c
new file mode 100644
index 000000000000..e16a73d998fa
--- /dev/null
+++ b/sal/osl/w32/semaphor.c
@@ -0,0 +1,111 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/semaphor.h>
+
+/*
+ Implemetation notes:
+ The void* represented by oslSemaphore is used
+ to store a WIN32 HANDLE.
+*/
+
+
+/*****************************************************************************/
+/* osl_createSemaphore */
+/*****************************************************************************/
+oslSemaphore SAL_CALL osl_createSemaphore(sal_uInt32 initialCount)
+{
+ oslSemaphore Semaphore;
+
+ Semaphore= CreateSemaphore(0, initialCount, INT_MAX, 0);
+
+ /* create failed? */
+ if((HANDLE)Semaphore == INVALID_HANDLE_VALUE)
+ {
+ Semaphore= 0;
+ }
+
+ return Semaphore;
+}
+
+/*****************************************************************************/
+/* osl_destroySemaphore */
+/*****************************************************************************/
+void SAL_CALL osl_destroySemaphore(oslSemaphore Semaphore)
+{
+
+
+ if(Semaphore != 0)
+ {
+ CloseHandle((HANDLE)Semaphore);
+ }
+
+}
+
+/*****************************************************************************/
+/* osl_acquireSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_acquireSemaphore(oslSemaphore Semaphore)
+{
+ OSL_ASSERT(Semaphore != 0);
+
+ switch ( WaitForSingleObject( (HANDLE)Semaphore, INFINITE ) )
+ {
+ case WAIT_OBJECT_0:
+ return sal_True;
+
+ default:
+ return (sal_False);
+ }
+}
+
+/*****************************************************************************/
+/* osl_tryToAcquireSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_tryToAcquireSemaphore(oslSemaphore Semaphore)
+{
+ OSL_ASSERT(Semaphore != 0);
+ return (sal_Bool)(WaitForSingleObject((HANDLE)Semaphore, 0) == WAIT_OBJECT_0);
+}
+
+
+/*****************************************************************************/
+/* osl_releaseSemaphore */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_releaseSemaphore(oslSemaphore Semaphore)
+{
+ OSL_ASSERT(Semaphore != 0);
+
+ /* increase count by one, not interested in previous count */
+ return (sal_Bool)(ReleaseSemaphore((HANDLE)Semaphore, 1, NULL) != FALSE);
+}
+
+
+
diff --git a/sal/osl/w32/signal.cxx b/sal/osl/w32/signal.cxx
new file mode 100644
index 000000000000..a74baaefc057
--- /dev/null
+++ b/sal/osl/w32/signal.cxx
@@ -0,0 +1,436 @@
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+/* system headers */
+#include "system.h"
+#include <tchar.h>
+
+#include "file_url.h"
+#include "path_helper.hxx"
+
+#include <osl/diagnose.h>
+#include <osl/mutex.h>
+#include <osl/signal.h>
+#ifndef __MINGW32__
+#include <DbgHelp.h>
+#endif
+#include <ErrorRep.h>
+#include <systools/win32/uwinapi.h>
+
+typedef struct _oslSignalHandlerImpl
+{
+ oslSignalHandlerFunction Handler;
+ void* pData;
+ struct _oslSignalHandlerImpl* pNext;
+} oslSignalHandlerImpl;
+
+static sal_Bool bErrorReportingEnabled = sal_True;
+static sal_Bool bInitSignal = sal_False;
+static oslMutex SignalListMutex;
+static oslSignalHandlerImpl* SignalList;
+
+static long WINAPI SignalHandlerFunction(LPEXCEPTION_POINTERS lpEP);
+
+static sal_Bool InitSignal(void)
+{
+ HMODULE hFaultRep;
+
+ SignalListMutex = osl_createMutex();
+
+ SetUnhandledExceptionFilter(SignalHandlerFunction);
+
+ hFaultRep = LoadLibrary( "faultrep.dll" );
+ if ( hFaultRep )
+ {
+#ifdef __MINGW32__
+typedef BOOL (WINAPI *pfn_ADDEREXCLUDEDAPPLICATIONW)(LPCWSTR);
+#endif
+ pfn_ADDEREXCLUDEDAPPLICATIONW pfn = (pfn_ADDEREXCLUDEDAPPLICATIONW)GetProcAddress( hFaultRep, "AddERExcludedApplicationW" );
+ if ( pfn )
+ pfn( L"SOFFICE.EXE" );
+ FreeLibrary( hFaultRep );
+ }
+
+ return sal_True;
+}
+
+static sal_Bool DeInitSignal(void)
+{
+ SetUnhandledExceptionFilter(NULL);
+
+ osl_destroyMutex(SignalListMutex);
+
+ return sal_False;
+}
+
+static oslSignalAction CallSignalHandler(oslSignalInfo *pInfo)
+{
+ oslSignalHandlerImpl* pHandler = SignalList;
+ oslSignalAction Action = osl_Signal_ActCallNextHdl;
+
+ while (pHandler != NULL)
+ {
+ if ((Action = pHandler->Handler(pHandler->pData, pInfo)) != osl_Signal_ActCallNextHdl)
+ break;
+
+ pHandler = pHandler->pNext;
+ }
+
+ return Action;
+}
+
+/*****************************************************************************/
+/* SignalHandlerFunction */
+/*****************************************************************************/
+
+#define REPORTENV_PARAM "-crashreportenv:"
+#define REPORTENV_PARAM2 "/crashreportenv:"
+
+static BOOL ReportCrash( LPEXCEPTION_POINTERS lpEP )
+{
+ BOOL fSuccess = FALSE;
+ BOOL fAutoReport = FALSE;
+ TCHAR szBuffer[1024];
+ ::osl::LongPathBuffer< sal_Char > aPath( MAX_LONG_PATH );
+ LPTSTR lpFilePart;
+ PROCESS_INFORMATION ProcessInfo;
+ STARTUPINFO StartupInfo;
+ int argi;
+
+ if ( !bErrorReportingEnabled )
+ return FALSE;
+
+ /* Check if crash reporter was disabled by command line */
+
+ for ( argi = 1; argi < __argc; argi++ )
+ {
+ if (
+ 0 == stricmp( __argv[argi], "-nocrashreport" ) ||
+ 0 == stricmp( __argv[argi], "/nocrashreport" )
+ )
+ return FALSE;
+ else if (
+ 0 == stricmp( __argv[argi], "-autocrashreport" ) ||
+ 0 == stricmp( __argv[argi], "/autocrashreport" )
+ )
+ fAutoReport = TRUE;
+ else if (
+ 0 == strnicmp( __argv[argi], REPORTENV_PARAM, strlen(REPORTENV_PARAM) ) ||
+ 0 == strnicmp( __argv[argi], REPORTENV_PARAM2, strlen(REPORTENV_PARAM2) )
+ )
+ {
+ const char *envparam = __argv[argi] + strlen(REPORTENV_PARAM);
+ const char *delim = strchr(envparam, '=' );
+
+ if ( delim )
+ {
+ CHAR *lpVariable;
+ CHAR *lpValue;
+ const char *variable = envparam;
+ size_t variable_len = delim - envparam;
+ const char *value = delim + 1;
+ size_t value_len = strlen(envparam) - variable_len - 1;
+
+ if ( '\"' == *value )
+ {
+ const char *quote;
+
+ value++;
+ value_len--;
+
+ quote = strchr( value, '\"' );
+ if ( quote )
+ value_len = quote - value;
+ }
+
+ lpVariable = reinterpret_cast< CHAR* >( _alloca( variable_len + 1 ) );
+ memcpy( lpVariable, variable, variable_len );
+ lpVariable[variable_len] = 0;
+
+ lpValue = reinterpret_cast< CHAR* >( _alloca( value_len + 1) );
+ memcpy( lpValue, value, value_len );
+ lpValue[value_len] = 0;
+
+ SetEnvironmentVariable( lpVariable, lpValue );
+ }
+ }
+ }
+
+ if ( SearchPath( NULL, TEXT( "crashrep.exe" ), NULL, aPath.getBufSizeInSymbols(), aPath, &lpFilePart ) )
+ {
+ ZeroMemory( &StartupInfo, sizeof(StartupInfo) );
+ StartupInfo.cb = sizeof(StartupInfo.cb);
+
+
+ sntprintf( szBuffer, elementsof(szBuffer),
+ _T("%s -p %u -excp 0x%p -t %u%s"),
+ static_cast<sal_Char*>( aPath ),
+ GetCurrentProcessId(),
+ lpEP,
+ GetCurrentThreadId(),
+ fAutoReport ? _T(" -noui -send") : _T(" -noui") );
+
+ if (
+ CreateProcess(
+ NULL,
+ szBuffer,
+ NULL,
+ NULL,
+ FALSE,
+#ifdef UNICODE
+ CREATE_UNICODE_ENVIRONMENT,
+#else
+ 0,
+#endif
+ NULL, NULL, &StartupInfo, &ProcessInfo )
+ )
+ {
+ DWORD dwExitCode;
+
+ WaitForSingleObject( ProcessInfo.hProcess, INFINITE );
+ if ( GetExitCodeProcess( ProcessInfo.hProcess, &dwExitCode ) && 0 == dwExitCode )
+
+ fSuccess = TRUE;
+
+ }
+ }
+
+ return fSuccess;
+}
+
+/*****************************************************************************/
+/* SignalHandlerFunction */
+/*****************************************************************************/
+
+static BOOL WINAPI IsWin95A(void)
+{
+ OSVERSIONINFO ovi;
+
+ ZeroMemory( &ovi, sizeof(ovi) );
+ ovi.dwOSVersionInfoSize = sizeof(ovi);
+
+ if ( GetVersionEx( &ovi ) )
+ /* See MSDN January 2000 documentation of GetVersionEx */
+ return (ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) &&
+ (ovi.dwMajorVersion <= 4) &&
+ (ovi.dwMinorVersion == 0) &&
+ (ovi.dwBuildNumber == 0x040003B6);
+
+ /* Something wrent wrong. So assume we have an older operating prior Win95 */
+
+ return TRUE;
+}
+
+/* magic Microsoft C++ compiler exception constant */
+#define EXCEPTION_MSC_CPP_EXCEPTION 0xe06d7363
+
+static long WINAPI SignalHandlerFunction(LPEXCEPTION_POINTERS lpEP)
+{
+ static sal_Bool bNested = sal_False;
+ sal_Bool bRaiseCrashReporter = sal_False;
+ oslSignalInfo Info;
+ oslSignalAction Action;
+
+ Info.UserSignal = lpEP->ExceptionRecord->ExceptionCode;
+ Info.UserData = NULL;
+
+ switch (lpEP->ExceptionRecord->ExceptionCode)
+ {
+ /* Transform unhandled exceptions into access violations.
+ Microsoft C++ compiler (add more for other compilers if necessary).
+ */
+ case EXCEPTION_MSC_CPP_EXCEPTION:
+ case EXCEPTION_ACCESS_VIOLATION:
+ Info.Signal = osl_Signal_AccessViolation;
+ bRaiseCrashReporter = sal_True;
+ break;
+
+ case EXCEPTION_INT_DIVIDE_BY_ZERO:
+ Info.Signal = osl_Signal_IntegerDivideByZero;
+ bRaiseCrashReporter = sal_True;
+ break;
+
+ case EXCEPTION_FLT_DIVIDE_BY_ZERO:
+ Info.Signal = osl_Signal_FloatDivideByZero;
+ bRaiseCrashReporter = sal_True;
+ break;
+
+ case EXCEPTION_BREAKPOINT:
+ Info.Signal = osl_Signal_DebugBreak;
+ break;
+
+ default:
+ Info.Signal = osl_Signal_System;
+ bRaiseCrashReporter = sal_True;
+ break;
+ }
+
+ if ( !bNested )
+ {
+ bNested = sal_True;
+
+ if ( bRaiseCrashReporter && ReportCrash( lpEP ) || IsWin95A() )
+ {
+ CallSignalHandler(&Info);
+ Action = osl_Signal_ActKillApp;
+ }
+ else
+ Action = CallSignalHandler(&Info);
+ }
+ else
+ Action = osl_Signal_ActKillApp;
+
+
+ switch ( Action )
+ {
+ case osl_Signal_ActCallNextHdl:
+ return (EXCEPTION_CONTINUE_SEARCH);
+
+ case osl_Signal_ActAbortApp:
+ return (EXCEPTION_EXECUTE_HANDLER);
+
+ case osl_Signal_ActKillApp:
+ SetErrorMode(SEM_NOGPFAULTERRORBOX);
+ exit(255);
+ break;
+ default:
+ break;
+ }
+
+ return (EXCEPTION_CONTINUE_EXECUTION);
+}
+
+/*****************************************************************************/
+/* osl_addSignalHandler */
+/*****************************************************************************/
+oslSignalHandler SAL_CALL osl_addSignalHandler(oslSignalHandlerFunction Handler, void* pData)
+{
+ oslSignalHandlerImpl* pHandler;
+
+ OSL_ASSERT(Handler != NULL);
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ pHandler = reinterpret_cast< oslSignalHandlerImpl* >( calloc( 1, sizeof(oslSignalHandlerImpl) ) );
+
+ if (pHandler != NULL)
+ {
+ pHandler->Handler = Handler;
+ pHandler->pData = pData;
+
+ osl_acquireMutex(SignalListMutex);
+
+ pHandler->pNext = SignalList;
+ SignalList = pHandler;
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (pHandler);
+ }
+
+ return (NULL);
+}
+
+/*****************************************************************************/
+/* osl_removeSignalHandler */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_removeSignalHandler(oslSignalHandler Handler)
+{
+ oslSignalHandlerImpl *pHandler, *pPrevious = NULL;
+
+ OSL_ASSERT(Handler != NULL);
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ osl_acquireMutex(SignalListMutex);
+
+ pHandler = SignalList;
+
+ while (pHandler != NULL)
+ {
+ if (pHandler == Handler)
+ {
+ if (pPrevious)
+ pPrevious->pNext = pHandler->pNext;
+ else
+ SignalList = pHandler->pNext;
+
+ osl_releaseMutex(SignalListMutex);
+
+ if (SignalList == NULL)
+ bInitSignal = DeInitSignal();
+
+ free(pHandler);
+
+ return (sal_True);
+ }
+
+ pPrevious = pHandler;
+ pHandler = pHandler->pNext;
+ }
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (sal_False);
+}
+
+/*****************************************************************************/
+/* osl_raiseSignal */
+/*****************************************************************************/
+oslSignalAction SAL_CALL osl_raiseSignal(sal_Int32 UserSignal, void* UserData)
+{
+ oslSignalInfo Info;
+ oslSignalAction Action;
+
+ if (! bInitSignal)
+ bInitSignal = InitSignal();
+
+ osl_acquireMutex(SignalListMutex);
+
+ Info.Signal = osl_Signal_User;
+ Info.UserSignal = UserSignal;
+ Info.UserData = UserData;
+
+ Action = CallSignalHandler(&Info);
+
+ osl_releaseMutex(SignalListMutex);
+
+ return (Action);
+}
+
+/*****************************************************************************/
+/* osl_setErrorReporting */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setErrorReporting( sal_Bool bEnable )
+{
+ sal_Bool bOld = bErrorReportingEnabled;
+ bErrorReportingEnabled = bEnable;
+
+ return bOld;
+}
diff --git a/sal/osl/w32/socket.cxx b/sal/osl/w32/socket.cxx
new file mode 100644
index 000000000000..191c31fb986a
--- /dev/null
+++ b/sal/osl/w32/socket.cxx
@@ -0,0 +1,2190 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "system.h"
+
+#include <osl/socket.h>
+#include <osl/diagnose.h>
+#include <rtl/alloc.h>
+
+#include "sockimpl.h"
+
+extern "C" {
+
+/* defines for shutdown */
+#ifdef GCC
+# define SD_RECEIVE 0
+# define SD_SEND 1
+# define SD_BOTH 2
+#endif
+
+/*
+ oslSocketAddr is a pointer to a Berkeley struct sockaddr.
+ I refrained from using sockaddr_in because of possible further
+ extensions of this socket-interface (IP-NG?).
+ The intention was to hide all Berkeley data-structures from
+ direct access past the osl-interface.
+
+ The current implementation is internet (IP) centered. All
+ the constructor-functions (osl_create...) take parameters
+ that will probably make sense only in the IP-environment
+ (e.g. because of using the dotted-Addr-format).
+
+ If the interface will be extended to host other protocol-
+ families, I expect no externally visible changes in the
+ existing functions. You'll probably need only new
+ constructor-functions who take the different Addr
+ formats into consideration (maybe a long dotted Addr
+ or whatever).
+*/
+
+/*
+ _Note_ that I rely on the fact that oslSocketAddr and struct sockaddr
+ are the same! I don't like it very much but see no other easy way to
+ conceal the struct sockaddr from the eyes of the user.
+*/
+
+#define OSL_INVALID_SOCKET INVALID_SOCKET /* WIN32 */
+#define OSL_SOCKET_ERROR SOCKET_ERROR /* WIN32 */
+
+/*****************************************************************************/
+/* enum oslAddrFamily */
+/*****************************************************************************/
+
+/* map */
+static DWORD FamilyMap[]= {
+ AF_INET, /* osl_Socket_FamilyInet */
+ AF_IPX, /* osl_Socket_FamilyIpx */
+ 0 /* osl_Socket_FamilyInvalid */
+};
+
+/* reverse map */
+static oslAddrFamily osl_AddrFamilyFromNative(DWORD nativeType)
+{
+ oslAddrFamily i= (oslAddrFamily) 0;
+ while(i != osl_Socket_FamilyInvalid)
+ {
+ if(FamilyMap[i] == nativeType)
+ return i;
+ i = (oslAddrFamily) ( (int)i + 1);
+ }
+ return i;
+}
+
+/* macros */
+#define FAMILY_FROM_NATIVE(y) osl_AddrFamilyFromNative(y)
+#define FAMILY_TO_NATIVE(x) (short)FamilyMap[x]
+
+/*****************************************************************************/
+/* enum oslProtocol */
+/*****************************************************************************/
+
+/* map */
+static DWORD ProtocolMap[]= {
+ 0, /* osl_Socket_FamilyInet */
+ NSPROTO_IPX, /* osl_Socket_FamilyIpx */
+ NSPROTO_SPX, /* osl_Socket_ProtocolSpx */
+ NSPROTO_SPXII, /* osl_Socket_ProtocolSpx_ii */
+ 0 /* osl_Socket_ProtocolInvalid */
+};
+
+/* macros */
+#define PROTOCOL_FROM_NATIVE(y) osl_ProtocolFromNative(y)
+#define PROTOCOL_TO_NATIVE(x) ProtocolMap[x]
+
+/*****************************************************************************/
+/* enum oslSocketType */
+/*****************************************************************************/
+
+/* map */
+static DWORD TypeMap[]= {
+ SOCK_STREAM, /* osl_Socket_TypeStream */
+ SOCK_DGRAM, /* osl_Socket_TypeDgram */
+ SOCK_RAW, /* osl_Socket_TypeRaw */
+ SOCK_RDM, /* osl_Socket_TypeRdm */
+ SOCK_SEQPACKET, /* osl_Socket_TypeSeqPacket */
+ 0 /* osl_Socket_TypeInvalid */
+};
+
+/* reverse map */
+static oslSocketType osl_SocketTypeFromNative(DWORD nativeType)
+{
+ oslSocketType i= (oslSocketType)0;
+ while(i != osl_Socket_TypeInvalid)
+ {
+ if(TypeMap[i] == nativeType)
+ return i;
+ i = (oslSocketType)((int)i+1);
+ }
+ return i;
+}
+
+/* macros */
+#define TYPE_TO_NATIVE(x) TypeMap[x]
+#define TYPE_FROM_NATIVE(y) osl_SocketTypeFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketOption */
+/*****************************************************************************/
+
+/* map */
+static DWORD OptionMap[]= {
+ SO_DEBUG, /* osl_Socket_OptionDebug */
+ SO_ACCEPTCONN, /* osl_Socket_OptionAcceptConn */
+ SO_REUSEADDR, /* osl_Socket_OptionReuseAddr */
+ SO_KEEPALIVE, /* osl_Socket_OptionKeepAlive */
+ SO_DONTROUTE, /* osl_Socket_OptionDontRoute */
+ SO_BROADCAST, /* osl_Socket_OptionBroadcast */
+ SO_USELOOPBACK, /* osl_Socket_OptionUseLoopback */
+ SO_LINGER, /* osl_Socket_OptionLinger */
+ SO_OOBINLINE, /* osl_Socket_OptionOOBinLine */
+ SO_SNDBUF, /* osl_Socket_OptionSndBuf */
+ SO_RCVBUF, /* osl_Socket_OptionRcvBuf */
+ SO_SNDLOWAT, /* osl_Socket_OptionSndLowat */
+ SO_RCVLOWAT, /* osl_Socket_OptionRcvLowat */
+ SO_SNDTIMEO, /* osl_Socket_OptionSndTimeo */
+ SO_RCVTIMEO, /* osl_Socket_OptionRcvTimeo */
+ SO_ERROR, /* osl_Socket_OptionError */
+ SO_TYPE, /* osl_Socket_OptionType */
+ TCP_NODELAY, /* osl_Socket_OptionTcpNoDelay */
+ 0 /* osl_Socket_OptionInvalid */
+};
+
+/* macros */
+#define OPTION_TO_NATIVE(x) OptionMap[x]
+#define OPTION_FROM_NATIVE(y) osl_SocketOptionFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketOptionLevel */
+/*****************************************************************************/
+
+static DWORD OptionLevelMap[]= {
+ SOL_SOCKET, /* osl_Socket_LevelSocket */
+ IPPROTO_TCP, /* osl_Socket_LevelTcp */
+ 0 /* osl_invalid_SocketLevel */
+};
+
+/* macros */
+#define OPTION_LEVEL_TO_NATIVE(x) OptionLevelMap[x]
+#define OPTION_LEVEL_FROM_NATIVE(y) osl_SocketOptionLevelFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketMsgFlag */
+/*****************************************************************************/
+
+static DWORD SocketMsgFlagMap[]= {
+ 0, /* osl_Socket_MsgNormal */
+ MSG_OOB, /* osl_Socket_MsgOOB */
+ MSG_PEEK, /* osl_Socket_MsgPeek */
+ MSG_DONTROUTE, /* osl_Socket_MsgDontRoute */
+ MSG_MAXIOVLEN /* osl_Socket_MsgMaxIOVLen */
+};
+
+/* macros */
+#define MSG_FLAG_TO_NATIVE(x) SocketMsgFlagMap[x]
+#define MSG_FLAG_FROM_NATIVE(y) osl_SocketMsgFlagFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketDirection */
+/*****************************************************************************/
+
+static DWORD SocketDirection[]= {
+ SD_RECEIVE, /* osl_Socket_DirRead */
+ SD_SEND, /* osl_Socket_DirWrite */
+ SD_BOTH /* osl_Socket_DirReadwrite */
+};
+
+/* macros */
+#define DIRECTION_TO_NATIVE(x) SocketDirection[x]
+#define DIRECTION_FROM_NATIVE(y) osl_SocketDirectionFromNative(y)
+
+/*****************************************************************************/
+/* enum oslSocketError */
+/*****************************************************************************/
+
+static int SocketError[]= {
+
+ 0, /* no error */
+ WSAENOTSOCK, /* Socket operation on non-socket */
+ WSAEDESTADDRREQ, /* Destination address required */
+ WSAEMSGSIZE, /* Message too long */
+ WSAEPROTOTYPE, /* Protocol wrong type for socket */
+ WSAENOPROTOOPT, /* Protocol not available */
+ WSAEPROTONOSUPPORT, /* Protocol not supported */
+ WSAESOCKTNOSUPPORT, /* Socket type not supported */
+ WSAEOPNOTSUPP, /* Operation not supported on socket */
+ WSAEPFNOSUPPORT, /* Protocol family not supported */
+ WSAEAFNOSUPPORT, /* Address family not supported by */
+ /* protocol family */
+ WSAEADDRINUSE, /* Address already in use */
+ WSAEADDRNOTAVAIL, /* Can't assign requested address */
+ WSAENETDOWN, /* Network is down */
+ WSAENETUNREACH, /* Network is unreachable */
+ WSAENETRESET, /* Network dropped connection because */
+ /* of reset */
+ WSAECONNABORTED, /* Software caused connection abort */
+ WSAECONNRESET, /* Connection reset by peer */
+ WSAENOBUFS, /* No buffer space available */
+ WSAEISCONN, /* Socket is already connected */
+ WSAENOTCONN, /* Socket is not connected */
+ WSAESHUTDOWN, /* Can't send after socket shutdown */
+ WSAETOOMANYREFS, /* Too many references: can't splice */
+ WSAETIMEDOUT, /* Connection timed out */
+ WSAECONNREFUSED, /* Connection refused */
+ WSAEHOSTDOWN, /* Host is down */
+ WSAEHOSTUNREACH, /* No route to host */
+ WSAEWOULDBLOCK, /* call would block on non-blocking socket */
+ WSAEALREADY, /* operation already in progress */
+ WSAEINPROGRESS /* operation now in progress */
+};
+
+/* reverse map */
+static oslSocketError osl_SocketErrorFromNative(int nativeType)
+{
+ oslSocketError i= (oslSocketError)0;
+
+ while(i != osl_Socket_E_InvalidError)
+ {
+ if(SocketError[i] == nativeType)
+ return i;
+
+ i = (oslSocketError)( (int) i + 1);
+ }
+ return i;
+}
+
+/* macros */
+#define ERROR_TO_NATIVE(x) SocketError[x]
+#define ERROR_FROM_NATIVE(y) osl_SocketErrorFromNative(y)
+
+/*****************************************************************************/
+/* oslSocketDialupImpl */
+/*****************************************************************************/
+static oslSocketDialupImpl *pDialupImpl = NULL;
+
+#if 0 /* INTERNAL DEBUG ONLY */
+BOOL WINAPI __osl_autodial_Impl (DWORD dwFlags, DWORD dwReserved)
+{
+ return 0;
+}
+
+BOOL WINAPI __osl_autodialHangup_Impl (DWORD dwReserved)
+{
+ return 1;
+}
+
+BOOL WINAPI __osl_getConnectedState_Impl (LPDWORD lpdwFlags, DWORD dwReserved)
+{
+ if (lpdwFlags)
+ *lpdwFlags = 0;
+ return 0;
+}
+#endif /* INTERNAL DEBUG ONLY */
+
+/*
+ * __osl_createSocketDialupImpl.
+ */
+static oslSocketDialupImpl* __osl_createSocketDialupImpl (void)
+{
+ oslSocketDialupImpl *pImpl;
+ pImpl = (oslSocketDialupImpl*)rtl_allocateZeroMemory( sizeof (oslSocketDialupImpl));
+
+ InitializeCriticalSection (&pImpl->m_hMutex);
+
+ return (pImpl);
+}
+
+/*
+ * __osl_initSocketDialupImpl.
+ */
+static void __osl_initSocketDialupImpl (oslSocketDialupImpl *pImpl)
+{
+#ifdef SOCKET_USE_AUTODIAL
+ if (pImpl)
+ {
+ HINSTANCE hModule;
+
+ EnterCriticalSection (&pImpl->m_hMutex);
+
+ hModule = LoadLibrary (INTERNET_MODULE_NAME);
+ if (!(hModule <= (HINSTANCE)HINSTANCE_ERROR))
+ {
+ pImpl->m_pfnAttemptConnect = (INTERNETATTEMPTCONNECT)
+ (GetProcAddress (hModule, "InternetAttemptConnect"));
+ pImpl->m_pfnAutodial = (INTERNETAUTODIAL)
+ (GetProcAddress (hModule, "InternetAutodial"));
+ pImpl->m_pfnAutodialHangup = (INTERNETAUTODIALHANGUP)
+ (GetProcAddress (hModule, "InternetAutodialHangup"));
+ pImpl->m_pfnGetConnectedState = (INTERNETGETCONNECTEDSTATE)
+ (GetProcAddress (hModule, "InternetGetConnectedState"));
+ pImpl->m_hModule = hModule;
+ }
+
+ LeaveCriticalSection (&pImpl->m_hMutex);
+ }
+#else
+ pImpl = pImpl; /* avoid warnings */
+#endif
+}
+
+/*
+ * __osl_destroySocketDialupImpl.
+ */
+static void __osl_destroySocketDialupImpl (oslSocketDialupImpl *pImpl)
+{
+ if (pImpl)
+ {
+ EnterCriticalSection (&pImpl->m_hMutex);
+
+ if (pImpl->m_dwFlags & INTERNET_CONNECTION_HANGUP)
+ {
+ if (pImpl->m_pfnAutodialHangup)
+ {
+ (pImpl->m_pfnAutodialHangup)(0);
+ pImpl->m_dwFlags &= ~INTERNET_CONNECTION_HANGUP;
+ }
+ }
+
+ if (pImpl->m_hModule)
+ FreeLibrary (pImpl->m_hModule);
+
+ LeaveCriticalSection (&pImpl->m_hMutex);
+ DeleteCriticalSection (&pImpl->m_hMutex);
+
+ rtl_freeMemory (pImpl);
+ }
+}
+
+/*
+ * __osl_querySocketDialupImpl.
+ */
+static sal_Bool __osl_querySocketDialupImpl (void)
+{
+ sal_Bool result;
+
+ if (pDialupImpl == NULL)
+ {
+ pDialupImpl = __osl_createSocketDialupImpl();
+ __osl_initSocketDialupImpl (pDialupImpl);
+ }
+
+ EnterCriticalSection (&pDialupImpl->m_hMutex);
+
+ result = sal_True;
+ if (pDialupImpl->m_pfnGetConnectedState)
+ {
+ DWORD dwFlags = 0;
+
+ result = (sal_Bool)(pDialupImpl->m_pfnGetConnectedState)(&dwFlags, 0);
+ pDialupImpl->m_dwFlags |= dwFlags;
+ }
+
+ LeaveCriticalSection (&pDialupImpl->m_hMutex);
+ return (result);
+}
+
+/*
+ * __osl_attemptSocketDialupImpl.
+ */
+static sal_Bool __osl_attemptSocketDialupImpl (void)
+{
+ sal_Bool result;
+
+ if (pDialupImpl == NULL)
+ {
+ pDialupImpl = __osl_createSocketDialupImpl();
+ __osl_initSocketDialupImpl (pDialupImpl);
+ }
+
+ EnterCriticalSection (&pDialupImpl->m_hMutex);
+
+ result = __osl_querySocketDialupImpl();
+ if (!result)
+ {
+ result = sal_True;
+ if (pDialupImpl->m_pfnAutodial)
+ {
+ result = (sal_Bool)(pDialupImpl->m_pfnAutodial)(0, 0);
+ if (result)
+ pDialupImpl->m_dwFlags |= INTERNET_CONNECTION_HANGUP;
+ else
+ WSASetLastError (WSAENETDOWN);
+ }
+ }
+
+ LeaveCriticalSection (&pDialupImpl->m_hMutex);
+ return (result);
+}
+
+/*****************************************************************************/
+/* oslSocketImpl */
+/*****************************************************************************/
+static sal_uInt32 g_nSocketImpl = 0;
+
+#if OSL_DEBUG_LEVEL > 1
+static sal_uInt32 g_nSocketAddr = 0;
+struct LeakWarning
+{
+ ~LeakWarning()
+ {
+ if( g_nSocketImpl )
+ OSL_TRACE( "sal_socket: %d socket instances leak\n" , g_nSocketImpl );
+ if( g_nSocketAddr )
+ OSL_TRACE( "sal_socket: %d socket address instances leak\n" , g_nSocketAddr );
+ }
+};
+LeakWarning socketWarning;
+#endif
+
+/*
+ * __osl_createSocketImpl.
+ */
+oslSocket __osl_createSocketImpl(SOCKET Socket)
+{
+ oslSocket pSockImpl = (oslSocket) rtl_allocateZeroMemory( sizeof(struct oslSocketImpl));
+ pSockImpl->m_Socket = Socket;
+ pSockImpl->m_nRefCount = 1;
+
+ g_nSocketImpl++;
+
+ return (pSockImpl);
+}
+
+/*
+ * __osl_destroySocketImpl.
+ */
+void __osl_destroySocketImpl(oslSocketImpl *pImpl)
+{
+ if (pImpl)
+ {
+ if (--g_nSocketImpl == 0)
+ {
+ __osl_destroySocketDialupImpl (pDialupImpl);
+ pDialupImpl = NULL;
+ }
+ rtl_freeMemory (pImpl);
+ }
+}
+/*****************************************************************************/
+static oslSocketAddr __osl_createSocketAddr( )
+{
+ oslSocketAddr pAddr = (oslSocketAddr) rtl_allocateZeroMemory( sizeof( struct oslSocketAddrImpl ));
+ pAddr->m_nRefCount = 1;
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketAddr ++;
+#endif
+ return pAddr;
+}
+
+static oslSocketAddr __osl_createSocketAddrWithFamily(
+ oslAddrFamily family, sal_Int32 port, sal_uInt32 nAddr )
+{
+ OSL_ASSERT( family == osl_Socket_FamilyInet );
+
+ oslSocketAddr pAddr = __osl_createSocketAddr();
+ switch( family )
+ {
+ case osl_Socket_FamilyInet:
+ {
+ struct sockaddr_in* pInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+
+ pInetAddr->sin_family = FAMILY_TO_NATIVE(osl_Socket_FamilyInet);
+ pInetAddr->sin_addr.s_addr = nAddr;
+ pInetAddr->sin_port = (sal_uInt16)(port&0xffff);
+ break;
+ }
+ default:
+ pAddr->m_sockaddr.sa_family = FAMILY_TO_NATIVE(family);
+ }
+ return pAddr;
+}
+
+static oslSocketAddr __osl_createSocketAddrFromSystem( struct sockaddr *pSystemSockAddr )
+{
+ oslSocketAddr pAddr = __osl_createSocketAddr();
+ memcpy( &(pAddr->m_sockaddr), pSystemSockAddr, sizeof( sockaddr ) );
+ return pAddr;
+}
+
+static void __osl_destroySocketAddr( oslSocketAddr addr )
+{
+#if OSL_DEBUG_LEVEL > 1
+ g_nSocketAddr --;
+#endif
+ rtl_freeMemory( addr );
+}
+/*****************************************************************************/
+/* osl_createEmptySocketAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createEmptySocketAddr(oslAddrFamily Family)
+{
+ oslSocketAddr pAddr = 0;
+
+ /* is it an internet-Addr? */
+ if (Family == osl_Socket_FamilyInet)
+ {
+ pAddr = __osl_createSocketAddrWithFamily(Family, 0 , htonl(INADDR_ANY) );
+ }
+ else
+ {
+ pAddr = __osl_createSocketAddrWithFamily( Family , 0 , 0 );
+ }
+
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_copySocketAddr */
+/*****************************************************************************/
+// @deprecated, to be removed
+oslSocketAddr SAL_CALL osl_copySocketAddr(oslSocketAddr Addr)
+{
+ oslSocketAddr pCopy = 0;
+ if (Addr)
+ {
+ pCopy = __osl_createSocketAddr();
+
+ if (pCopy)
+ memcpy(&(pCopy->m_sockaddr),&(Addr->m_sockaddr), sizeof(struct sockaddr));
+ }
+ return pCopy;
+}
+
+/*****************************************************************************/
+/* osl_isEqualSocketAddr */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isEqualSocketAddr(oslSocketAddr Addr1, oslSocketAddr Addr2)
+{
+ struct sockaddr* pAddr1= &(Addr1->m_sockaddr);
+ struct sockaddr* pAddr2= &(Addr2->m_sockaddr);
+
+ OSL_ASSERT(pAddr1);
+ OSL_ASSERT(pAddr2);
+
+ if (pAddr1->sa_family == pAddr2->sa_family)
+ {
+ switch (pAddr1->sa_family)
+ {
+ case AF_INET:
+ {
+ struct sockaddr_in* pInetAddr1= (struct sockaddr_in*)pAddr1;
+ struct sockaddr_in* pInetAddr2= (struct sockaddr_in*)pAddr2;
+
+ if ((pInetAddr1->sin_family == pInetAddr2->sin_family) &&
+ (pInetAddr1->sin_addr.s_addr == pInetAddr2->sin_addr.s_addr) &&
+ (pInetAddr1->sin_port == pInetAddr2->sin_port))
+ return (sal_True);
+ }
+
+ default:
+ {
+ return (memcmp(pAddr1, Addr2, sizeof(struct sockaddr)) == 0);
+ }
+ }
+ }
+
+ return (sal_False);
+}
+
+/*****************************************************************************/
+/* osl_createInetBroadcastAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createInetBroadcastAddr (
+ rtl_uString *strDottedAddr,
+ sal_Int32 Port)
+{
+ sal_uInt32 nAddr = OSL_INADDR_NONE;
+
+ if (strDottedAddr && strDottedAddr->length)
+ {
+ /* Dotted host address for limited broadcast */
+ rtl_String *pDottedAddr = NULL;
+
+ rtl_uString2String (
+ &pDottedAddr, strDottedAddr->buffer, strDottedAddr->length,
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ nAddr = inet_addr (pDottedAddr->buffer);
+ rtl_string_release (pDottedAddr);
+ }
+
+ if (nAddr != OSL_INADDR_NONE)
+ {
+ /* Limited broadcast */
+ nAddr = ntohl(nAddr);
+ if (IN_CLASSA(nAddr))
+ {
+ nAddr &= IN_CLASSA_NET;
+ nAddr |= IN_CLASSA_HOST;
+ }
+ else if (IN_CLASSB(nAddr))
+ {
+ nAddr &= IN_CLASSB_NET;
+ nAddr |= IN_CLASSB_HOST;
+ }
+ else if (IN_CLASSC(nAddr))
+ {
+ nAddr &= IN_CLASSC_NET;
+ nAddr |= IN_CLASSC_HOST;
+ }
+ else
+ {
+ /* No broadcast in class D */
+ return ((oslSocketAddr)NULL);
+ }
+ nAddr = htonl(nAddr);
+ }
+
+ oslSocketAddr pAddr =
+ __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons( (sal_uInt16) Port), nAddr );
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_createInetSocketAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_createInetSocketAddr (
+ rtl_uString *strDottedAddr,
+ sal_Int32 Port)
+{
+ DWORD Addr;
+ rtl_String *pDottedAddr=NULL;
+
+ rtl_uString2String(
+ &pDottedAddr, strDottedAddr->buffer, strDottedAddr->length,
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ Addr= inet_addr (pDottedAddr->buffer);
+ rtl_string_release (pDottedAddr);
+
+ oslSocketAddr pAddr = 0;
+ if(Addr != -1)
+ {
+ pAddr = __osl_createSocketAddrWithFamily( osl_Socket_FamilyInet, htons( (sal_uInt16)Port), Addr );
+ }
+ return pAddr;
+}
+
+oslSocketResult SAL_CALL osl_setAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence *pByteSeq )
+{
+ OSL_ASSERT( pAddr );
+ OSL_ASSERT( pByteSeq );
+
+ oslSocketResult res = osl_Socket_Error;
+ if( pAddr && pByteSeq )
+ {
+ OSL_ASSERT( pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE( osl_Socket_FamilyInet ) );
+ OSL_ASSERT( pByteSeq->nElements == 4 );
+ struct sockaddr_in * pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr);
+ memcpy( &(pSystemInetAddr->sin_addr) , pByteSeq->elements , 4 );
+ res = osl_Socket_Ok;
+ }
+ return res;
+}
+
+/** Returns the addr field in the struct sockaddr. ppByteSeq is in network byteorder. *ppByteSeq may
+ either be 0 or contain a constructed sal_Sequence.
+ */
+oslSocketResult SAL_CALL osl_getAddrOfSocketAddr( oslSocketAddr pAddr, sal_Sequence **ppByteSeq )
+{
+ OSL_ASSERT( pAddr );
+ OSL_ASSERT( ppByteSeq );
+
+ oslSocketResult res = osl_Socket_Error;
+ if( pAddr && ppByteSeq )
+ {
+ struct sockaddr_in * pSystemInetAddr = (struct sockaddr_in * ) &(pAddr->m_sockaddr);
+ rtl_byte_sequence_constructFromArray( ppByteSeq , (sal_Int8 *) &(pSystemInetAddr->sin_addr),4);
+ res = osl_Socket_Ok;
+ }
+ return res;
+}
+
+/*****************************************************************************/
+/* oslHostAddr */
+/*****************************************************************************/
+struct oslHostAddrImpl {
+ rtl_uString *pHostName;
+ oslSocketAddr pSockAddr;
+} ;
+
+static oslHostAddr __osl_hostentToHostAddr (const struct hostent *he)
+{
+ oslHostAddr pAddr= NULL;
+ oslSocketAddr pSocketAddr = 0;
+
+ rtl_uString *cn= NULL;
+
+ if ((he == NULL) || (he->h_name == NULL) || (he->h_addr_list[0] == NULL))
+ return ((oslHostAddr)NULL);
+
+ rtl_string2UString(
+ &cn, he->h_name, strlen(he->h_name),
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+ OSL_ASSERT(cn != 0);
+
+ pSocketAddr = __osl_createSocketAddr();
+
+ if (pSocketAddr == NULL)
+ {
+ rtl_uString_release(cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pSocketAddr->m_sockaddr.sa_family = he->h_addrtype;
+ if (pSocketAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ struct sockaddr_in *sin= (struct sockaddr_in *)&(pSocketAddr->m_sockaddr);
+ memcpy (
+ &(sin->sin_addr.s_addr),
+ he->h_addr_list[0],
+ he->h_length);
+ }
+ else
+ {
+ /* unknown address family */
+ /* future extensions for new families might be implemented here */
+
+ OSL_TRACE("_osl_hostentToHostAddr(): unknown address family.\n");
+ OSL_ASSERT(sal_False);
+
+ __osl_destroySocketAddr( pSocketAddr );
+ rtl_uString_release(cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pAddr= (oslHostAddr )rtl_allocateMemory (sizeof (struct oslHostAddrImpl));
+
+ if (pAddr == NULL)
+ {
+ __osl_destroySocketAddr( pSocketAddr );
+ rtl_uString_release(cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pAddr->pHostName= cn;
+ pAddr->pSockAddr= pSocketAddr;
+
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_createHostAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddr (
+ rtl_uString *strHostname,
+ const oslSocketAddr pSocketAddr)
+{
+ oslHostAddr pAddr;
+ rtl_uString *cn= NULL;
+
+ if ((strHostname == NULL) || (strHostname->length == 0) || (pSocketAddr == NULL))
+ return ((oslHostAddr)NULL);
+
+ rtl_uString_newFromString( &cn, strHostname);
+
+ if ( ! pSocketAddr )
+ {
+ rtl_uString_release(cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pAddr= (oslHostAddr)rtl_allocateMemory (sizeof (struct oslHostAddrImpl));
+
+ if (pAddr == NULL)
+ {
+ rtl_uString_release(cn);
+ return ((oslHostAddr)NULL);
+ }
+
+ pAddr->pHostName= cn;
+ pAddr->pSockAddr= osl_copySocketAddr( pSocketAddr );
+
+ return ((oslHostAddr)pAddr);
+}
+
+/*****************************************************************************/
+/* osl_createHostAddrByName */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddrByName(rtl_uString *strHostname)
+{
+ if ((strHostname == NULL) || (strHostname->length == 0))
+ return ((oslHostAddr)NULL);
+
+ if (__osl_attemptSocketDialupImpl())
+ {
+ struct hostent *he;
+ rtl_String *Hostname= NULL;
+
+ rtl_uString2String(
+ &Hostname, strHostname->buffer, strHostname->length,
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ he= gethostbyname (Hostname->buffer);
+
+ rtl_string_release (Hostname);
+ return __osl_hostentToHostAddr (he);
+ }
+ return ((oslHostAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_createHostAddrByAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_createHostAddrByAddr(const oslSocketAddr pAddr)
+{
+ if (pAddr == NULL)
+ return ((oslHostAddr)NULL);
+
+ if (pAddr->m_sockaddr.sa_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ {
+ const struct sockaddr_in *sin= (const struct sockaddr_in *)&(pAddr->m_sockaddr);
+
+ if (sin->sin_addr.s_addr == htonl(INADDR_ANY))
+ return ((oslHostAddr)NULL);
+
+ if (__osl_attemptSocketDialupImpl())
+ {
+ struct hostent *he;
+ he= gethostbyaddr ((const sal_Char *)&(sin->sin_addr),
+ sizeof (sin->sin_addr),
+ sin->sin_family);
+ return __osl_hostentToHostAddr (he);
+ }
+ }
+
+ return ((oslHostAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_copyHostAddr */
+/*****************************************************************************/
+oslHostAddr SAL_CALL osl_copyHostAddr(const oslHostAddr Addr)
+{
+ oslHostAddr pAddr= (oslHostAddr)Addr;
+
+ if (pAddr)
+ return osl_createHostAddr (pAddr->pHostName, pAddr->pSockAddr);
+ else
+ return ((oslHostAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_getHostnameOfHostAddr */
+/*****************************************************************************/
+void SAL_CALL osl_getHostnameOfHostAddr(
+ const oslHostAddr pAddr, rtl_uString **strHostname)
+{
+ if (pAddr)
+ rtl_uString_assign (strHostname, pAddr->pHostName);
+ else
+ rtl_uString_new (strHostname);
+}
+
+/*****************************************************************************/
+/* osl_getSocketAddrOfHostAddr */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getSocketAddrOfHostAddr(const oslHostAddr pAddr)
+{
+ if (pAddr)
+ return (const oslSocketAddr)(pAddr->pSockAddr);
+ else
+ return NULL;
+}
+
+/*****************************************************************************/
+/* osl_destroyHostAddr */
+/*****************************************************************************/
+void SAL_CALL osl_destroyHostAddr(oslHostAddr pAddr)
+{
+ if (pAddr)
+ {
+ if (pAddr->pHostName)
+ rtl_uString_release (pAddr->pHostName);
+ if (pAddr->pSockAddr)
+ osl_destroySocketAddr( pAddr->pSockAddr );
+
+ rtl_freeMemory (pAddr);
+ }
+}
+
+/*****************************************************************************/
+/* osl_getLocalHostname */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getLocalHostname (rtl_uString **strLocalHostname)
+{
+ static sal_Unicode LocalHostname[256] = {0};
+
+ if (rtl_ustr_getLength(LocalHostname) == 0)
+ {
+ sal_Char Host[256]= "";
+ if (gethostname(Host, sizeof(Host)) == 0)
+ {
+ /* check if we have an FQDN */
+ if (strchr(Host, '.') == NULL)
+ {
+ oslHostAddr pAddr;
+ rtl_uString *hostName= NULL;
+
+ rtl_string2UString(
+ &hostName, Host, strlen(Host),
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+ OSL_ASSERT(hostName != 0);
+
+ /* no, determine it via dns */
+ pAddr = osl_createHostAddrByName(hostName);
+ rtl_uString_release (hostName);
+
+ if (pAddr && pAddr->pHostName)
+ memcpy(LocalHostname, pAddr->pHostName->buffer, sizeof(sal_Unicode)*(rtl_ustr_getLength(pAddr->pHostName->buffer)+1));
+ else
+ memset(LocalHostname, 0, sizeof(LocalHostname));
+
+ osl_destroyHostAddr ((oslHostAddr)pAddr);
+ }
+ }
+ }
+
+ if (rtl_ustr_getLength(LocalHostname) > 0)
+ {
+ rtl_uString_newFromStr (strLocalHostname, LocalHostname);
+ return osl_Socket_Ok;
+ }
+
+ return osl_Socket_Error;
+}
+
+/*****************************************************************************/
+/* osl_resolveHostname */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_resolveHostname(rtl_uString* strHostname)
+{
+ oslHostAddr pAddr=
+ (oslHostAddr )osl_createHostAddrByName (strHostname);
+ if (pAddr)
+ {
+ oslSocketAddr SockAddr = osl_copySocketAddr( pAddr->pSockAddr );
+ osl_destroyHostAddr(pAddr);
+ return (SockAddr);
+ }
+ return ((oslSocketAddr)NULL);
+}
+
+/*****************************************************************************/
+/* osl_getServicePort */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getServicePort (
+ rtl_uString* strServicename,
+ rtl_uString* strProtocol)
+{
+ struct servent* ps;
+
+ rtl_String *str_Servicename=NULL;
+ rtl_String *str_Protocol=NULL;
+
+ rtl_uString2String(
+ &str_Servicename,
+ rtl_uString_getStr(strServicename),
+ rtl_uString_getLength(strServicename),
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+ rtl_uString2String(
+ &str_Protocol,
+ rtl_uString_getStr(strProtocol),
+ rtl_uString_getLength(strProtocol),
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ ps= getservbyname(
+ rtl_string_getStr(str_Servicename),
+ rtl_string_getStr(str_Protocol));
+
+ rtl_string_release( str_Servicename );
+ rtl_string_release( str_Protocol );
+
+ if (ps != 0)
+ return ntohs(ps->s_port);
+
+ return OSL_INVALID_PORT;
+}
+
+/*****************************************************************************/
+/* osl_destroySocketAddr */
+/*****************************************************************************/
+void SAL_CALL osl_destroySocketAddr(oslSocketAddr pAddr)
+{
+ __osl_destroySocketAddr( pAddr );
+}
+
+/*****************************************************************************/
+/* osl_getFamilyOfSocketAddr */
+/*****************************************************************************/
+oslAddrFamily SAL_CALL osl_getFamilyOfSocketAddr(oslSocketAddr pAddr)
+{
+ if (pAddr)
+ return FAMILY_FROM_NATIVE(pAddr->m_sockaddr.sa_family);
+ else
+ return osl_Socket_FamilyInvalid;
+}
+
+/*****************************************************************************/
+/* osl_getInetPortOfSocketAddr */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getInetPortOfSocketAddr(oslSocketAddr pAddr)
+{
+ if( pAddr )
+ {
+ struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+
+ if ( (pSystemInetAddr->sin_family == FAMILY_TO_NATIVE(osl_Socket_FamilyInet)))
+ return ntohs(pSystemInetAddr->sin_port);
+ }
+ return OSL_INVALID_PORT;
+}
+
+/*****************************************************************************/
+/* osl_setInetPortOfSocketAddr */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setInetPortOfSocketAddr (
+ oslSocketAddr pAddr,
+ sal_Int32 Port)
+{
+ if (pAddr == NULL)
+ return sal_False;
+
+ struct sockaddr_in* pSystemInetAddr= (struct sockaddr_in*)&(pAddr->m_sockaddr);
+
+ if (pSystemInetAddr->sin_family != FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ return sal_False;
+
+ pSystemInetAddr->sin_port= htons((short)Port);
+ return sal_True;
+}
+
+/*****************************************************************************/
+/* osl_getHostnameOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getHostnameOfSocketAddr (
+ oslSocketAddr Addr,
+ rtl_uString **strHostName)
+{
+ oslHostAddr pAddr= osl_createHostAddrByAddr (Addr);
+
+ if (pAddr)
+ {
+ rtl_uString_newFromString(strHostName, pAddr->pHostName);
+
+ osl_destroyHostAddr(pAddr);
+
+ return osl_Socket_Ok;
+ }
+
+ return osl_Socket_Error;
+}
+
+/*****************************************************************************/
+/* osl_getDottedInetAddrOfSocketAddr */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_getDottedInetAddrOfSocketAddr (
+ oslSocketAddr pAddr,
+ rtl_uString **strDottedInetAddr)
+{
+ sal_Char *pDotted;
+
+ if (pAddr == NULL)
+ return osl_Socket_Error;
+
+ struct sockaddr_in *pSystemInetAddr = (struct sockaddr_in*) &(pAddr->m_sockaddr);
+ if (pSystemInetAddr->sin_family != FAMILY_TO_NATIVE(osl_Socket_FamilyInet))
+ return osl_Socket_Error;
+
+ pDotted = inet_ntoa (pSystemInetAddr->sin_addr);
+ rtl_string2UString(
+ strDottedInetAddr, pDotted, strlen (pDotted),
+ RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+ OSL_ASSERT(*strDottedInetAddr != 0);
+
+ return osl_Socket_Ok;
+}
+
+/*****************************************************************************/
+/* osl_createSocket */
+/*****************************************************************************/
+oslSocket SAL_CALL osl_createSocket (
+ oslAddrFamily Family,
+ oslSocketType Type,
+ oslProtocol Protocol)
+{
+ /* alloc memory */
+ oslSocket pSocket = __osl_createSocketImpl(0);
+
+ if (pSocket == NULL)
+ return 0;
+
+ /* create socket */
+ pSocket->m_Socket= socket(FAMILY_TO_NATIVE(Family),
+ TYPE_TO_NATIVE(Type),
+ PROTOCOL_TO_NATIVE(Protocol));
+
+ /* creation failed => free memory */
+ if(pSocket->m_Socket == OSL_INVALID_SOCKET)
+ {
+ __osl_destroySocketImpl(pSocket);
+ pSocket= 0;
+ }
+ else
+ {
+ pSocket->m_Flags = 0;
+ pSocket->m_CloseCallback = NULL;
+ pSocket->m_CallbackArg = NULL;
+ }
+
+ return pSocket;
+}
+
+void SAL_CALL osl_acquireSocket( oslSocket pSocket )
+{
+ osl_incrementInterlockedCount( &(pSocket->m_nRefCount) );
+}
+
+void SAL_CALL osl_releaseSocket( oslSocket pSocket )
+{
+ if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) )
+ {
+ osl_closeSocket( pSocket );
+ __osl_destroySocketImpl( pSocket );
+ }
+}
+
+/*****************************************************************************/
+/* osl_closeSocket */
+/*****************************************************************************/
+void SAL_CALL osl_closeSocket(oslSocket pSocket)
+{
+ /* socket already invalid */
+ if(pSocket==0)
+ return;
+
+ /* close */
+ closesocket(pSocket->m_Socket);
+
+ pSocket->m_Socket = OSL_INVALID_SOCKET;
+
+ /* registrierten Callback ausfuehren */
+ if (pSocket->m_CloseCallback != NULL)
+ {
+ pSocket->m_CloseCallback(pSocket->m_CallbackArg);
+ }
+}
+
+/*****************************************************************************/
+/* osl_getLocalAddrOfSocket */
+/* Note that I rely on the fact that oslSocketAddr and struct sockaddr */
+/* are the same! I don't like it very much but see no other easy way */
+/* to conceal the struct sockaddr from the eyes of the user. */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getLocalAddrOfSocket(oslSocket pSocket)
+{
+ struct sockaddr Addr;
+ int AddrLen;
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return ((oslSocketAddr)NULL);
+
+ AddrLen= sizeof(struct sockaddr);
+
+ if (getsockname(pSocket->m_Socket, &Addr, &AddrLen) == OSL_SOCKET_ERROR)
+ return ((oslSocketAddr)NULL);
+
+ oslSocketAddr pAddr = __osl_createSocketAddrFromSystem( &Addr );
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_getPeerAddrOfSocket */
+/*****************************************************************************/
+oslSocketAddr SAL_CALL osl_getPeerAddrOfSocket(oslSocket pSocket)
+{
+ struct sockaddr Addr;
+ int AddrLen;
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return ((oslSocketAddr)NULL);
+
+ AddrLen= sizeof(struct sockaddr);
+
+ if (getpeername(pSocket->m_Socket, &Addr, &AddrLen) == OSL_SOCKET_ERROR)
+ return ((oslSocketAddr)NULL);
+
+ oslSocketAddr pAddr = __osl_createSocketAddrFromSystem( &Addr );
+ return pAddr;
+}
+
+/*****************************************************************************/
+/* osl_bindAddrToSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_bindAddrToSocket ( oslSocket pSocket, oslSocketAddr pAddr)
+{
+ OSL_ASSERT( pAddr );
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ return (bind(pSocket->m_Socket,
+ &(pAddr->m_sockaddr),
+ sizeof(struct sockaddr)) != OSL_SOCKET_ERROR);
+}
+
+/*****************************************************************************/
+/* osl_connectSocketTo */
+/*****************************************************************************/
+oslSocketResult SAL_CALL osl_connectSocketTo (
+ oslSocket pSocket,
+ oslSocketAddr pAddr,
+ const TimeValue* pTimeout)
+{
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return osl_Socket_Error;
+
+ if (pAddr == NULL) /* EDESTADDRREQ */
+ return osl_Socket_Error;
+
+ if (!__osl_attemptSocketDialupImpl()) /* ENETDOWN */
+ return osl_Socket_Error;
+
+ if (pTimeout == NULL)
+ {
+ if(connect(pSocket->m_Socket,
+ &(pAddr->m_sockaddr),
+ sizeof(struct sockaddr)) == OSL_SOCKET_ERROR)
+ return osl_Socket_Error;
+ else
+ return osl_Socket_Ok;
+ }
+ else
+ {
+ fd_set fds;
+ int error;
+ struct timeval tv;
+ unsigned long Param;
+ oslSocketResult Result= osl_Socket_Ok;
+
+ if (pSocket->m_Flags & OSL_SOCKET_FLAGS_NONBLOCKING)
+ {
+ if (connect(pSocket->m_Socket,
+ &(pAddr->m_sockaddr),
+ sizeof(struct sockaddr)) == OSL_SOCKET_ERROR)
+ {
+ switch (WSAGetLastError())
+ {
+ case WSAEWOULDBLOCK:
+ case WSAEINPROGRESS:
+ return osl_Socket_InProgress;
+
+ default:
+ return osl_Socket_Error;
+ }
+ }
+ else
+ return osl_Socket_Ok;
+ }
+
+ /* set socket temporarily to non-blocking */
+ Param= 1;
+ OSL_VERIFY(ioctlsocket(
+ pSocket->m_Socket, FIONBIO, &Param) != OSL_SOCKET_ERROR);
+
+ /* initiate connect */
+ if (connect(pSocket->m_Socket,
+ &(pAddr->m_sockaddr),
+ sizeof(struct sockaddr)) != OSL_SOCKET_ERROR)
+ {
+ /* immediate connection */
+
+ Param= 0;
+ ioctlsocket(pSocket->m_Socket, FIONBIO, &Param);
+
+ return osl_Socket_Ok;
+ }
+ else
+ {
+ error = WSAGetLastError();
+
+ /* really an error or just delayed? */
+ if (error != WSAEWOULDBLOCK && error != WSAEINPROGRESS)
+ {
+ Param= 0;
+ ioctlsocket(pSocket->m_Socket, FIONBIO, &Param);
+
+ return osl_Socket_Error;
+ }
+ }
+
+ /* prepare select set for socket */
+ FD_ZERO(&fds);
+ FD_SET(pSocket->m_Socket, &fds);
+
+ /* divide milliseconds into seconds and microseconds */
+ tv.tv_sec= pTimeout->Seconds;
+ tv.tv_usec= pTimeout->Nanosec / 1000L;
+
+ /* select */
+ error= select(pSocket->m_Socket+1,
+ 0,
+ &fds,
+ 0,
+ &tv);
+
+ if (error > 0) /* connected */
+ {
+ OSL_POSTCOND(
+ FD_ISSET(pSocket->m_Socket, &fds),
+ "osl_connectSocketTo(): select returned but socket not set\n");
+
+ Result= osl_Socket_Ok;
+
+ }
+ else if(error < 0) /* error */
+ {
+ /* errno == EBADF: most probably interrupted by close() */
+ if(WSAGetLastError() == WSAEBADF)
+ {
+ /* do not access pSockImpl because it is about to be or */
+ /* already destroyed */
+ return osl_Socket_Interrupted;
+ }
+ else
+ Result= osl_Socket_Error;
+
+ }
+ else /* timeout */
+ Result= osl_Socket_TimedOut;
+
+
+ /* clean up */
+ Param= 0;
+ ioctlsocket(pSocket->m_Socket, FIONBIO, &Param);
+
+ return Result;
+ }
+}
+
+/*****************************************************************************/
+/* osl_listenOnSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_listenOnSocket (
+ oslSocket pSocket,
+ sal_Int32 MaxPendingConnections)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ return (listen(pSocket->m_Socket,
+ MaxPendingConnections == -1 ?
+ SOMAXCONN :
+ MaxPendingConnections) != OSL_SOCKET_ERROR);
+}
+
+/*****************************************************************************/
+/* osl_acceptConnectionOnSocket */
+/*****************************************************************************/
+oslSocket SAL_CALL osl_acceptConnectionOnSocket (
+ oslSocket pSocket,
+ oslSocketAddr* ppAddr)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return ((oslSocket)NULL);
+
+ SOCKET Connection;
+ if(ppAddr)
+ {
+ if( *ppAddr )
+ {
+ osl_destroySocketAddr( *ppAddr );
+ *ppAddr = 0;
+ }
+ int AddrLen= sizeof(struct sockaddr);
+
+ /* user wants to know peer Addr */
+ struct sockaddr Addr;
+
+ Connection= accept(pSocket->m_Socket, &Addr, &AddrLen);
+ OSL_ASSERT(AddrLen == sizeof(struct sockaddr));
+
+ if(Connection != OSL_SOCKET_ERROR)
+ *ppAddr= __osl_createSocketAddrFromSystem(&Addr);
+ else
+ *ppAddr = NULL;
+ }
+ else
+ {
+ /* user is not interested in peer-addr */
+ Connection= accept(pSocket->m_Socket, 0, 0);
+ }
+
+ /* accept failed? */
+ if(Connection == OSL_SOCKET_ERROR)
+ return ((oslSocket)NULL);
+
+ /* alloc memory */
+ oslSocket pConnectionSocket;
+ pConnectionSocket= __osl_createSocketImpl(Connection);
+
+ pConnectionSocket->m_Flags = 0;
+ pConnectionSocket->m_CloseCallback = NULL;
+ pConnectionSocket->m_CallbackArg = NULL;
+
+ return pConnectionSocket;
+}
+
+/*****************************************************************************/
+/* osl_receiveSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receiveSocket (
+ oslSocket pSocket,
+ void* pBuffer,
+ sal_uInt32 BytesToRead,
+ oslSocketMsgFlag Flag)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return osl_Socket_Error;
+
+ return recv(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToRead,
+ MSG_FLAG_TO_NATIVE(Flag));
+}
+
+/*****************************************************************************/
+/* osl_receiveFromSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_receiveFromSocket (
+ oslSocket pSocket,
+ oslSocketAddr SenderAddr,
+ void* pBuffer,
+ sal_uInt32 BufferSize,
+ oslSocketMsgFlag Flag)
+{
+ struct sockaddr *pSystemSockAddr = 0;
+ int AddrLen = 0;
+ if( SenderAddr )
+ {
+ AddrLen = sizeof( struct sockaddr );
+ pSystemSockAddr = &(SenderAddr->m_sockaddr);
+ }
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return osl_Socket_Error;
+
+ return recvfrom(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BufferSize,
+ MSG_FLAG_TO_NATIVE(Flag),
+ pSystemSockAddr,
+ &AddrLen);
+}
+
+/*****************************************************************************/
+/* osl_sendSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendSocket (
+ oslSocket pSocket,
+ const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return osl_Socket_Error;
+
+ return send(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToSend,
+ MSG_FLAG_TO_NATIVE(Flag));
+}
+
+/*****************************************************************************/
+/* osl_sendToSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_sendToSocket (
+ oslSocket pSocket,
+ oslSocketAddr ReceiverAddr,
+ const void* pBuffer,
+ sal_uInt32 BytesToSend,
+ oslSocketMsgFlag Flag)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return osl_Socket_Error;
+
+ /* ReceiverAddr might be 0 when used on a connected socket. */
+ /* Then sendto should behave like send. */
+
+ struct sockaddr *pSystemSockAddr = 0;
+ if( ReceiverAddr )
+ pSystemSockAddr = &(ReceiverAddr->m_sockaddr);
+
+ return sendto(pSocket->m_Socket,
+ (sal_Char*)pBuffer,
+ BytesToSend,
+ MSG_FLAG_TO_NATIVE(Flag),
+ pSystemSockAddr,
+ pSystemSockAddr == 0 ? 0 : sizeof(struct sockaddr));
+}
+
+/*****************************************************************************/
+/* osl_readSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_readSocket( oslSocket pSocket, void *pBuffer, sal_Int32 n )
+{
+ sal_uInt8 * Ptr = (sal_uInt8 *)pBuffer;
+
+ OSL_ASSERT( pSocket);
+
+ /* loop until all desired bytes were read or an error occured */
+ sal_uInt32 BytesRead= 0;
+ sal_uInt32 BytesToRead= n;
+ while (BytesToRead > 0)
+ {
+ sal_Int32 RetVal;
+ RetVal= osl_receiveSocket(pSocket,
+ Ptr,
+ BytesToRead,
+ osl_Socket_MsgNormal);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToRead -= RetVal;
+ BytesRead += RetVal;
+ Ptr += RetVal;
+ }
+
+ return BytesRead;
+}
+
+/*****************************************************************************/
+/* osl_writeSocket */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_writeSocket( oslSocket pSocket, const void *pBuffer, sal_Int32 n )
+{
+ OSL_ASSERT( pSocket );
+
+ /* loop until all desired bytes were send or an error occured */
+ sal_uInt32 BytesSend= 0;
+ sal_uInt32 BytesToSend= n;
+ sal_uInt8 *Ptr = ( sal_uInt8 * )pBuffer;
+ while (BytesToSend > 0)
+ {
+ sal_Int32 RetVal;
+
+ RetVal= osl_sendSocket( pSocket,Ptr,BytesToSend,osl_Socket_MsgNormal);
+
+ /* error occured? */
+ if(RetVal <= 0)
+ {
+ break;
+ }
+
+ BytesToSend -= RetVal;
+ BytesSend += RetVal;
+ Ptr += RetVal;
+
+ }
+ return BytesSend;
+}
+
+
+/*****************************************************************************/
+/* osl_isReceiveReady */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isReceiveReady (
+ oslSocket pSocket,
+ const TimeValue* pTimeout)
+{
+ fd_set fds;
+ struct timeval tv;
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ FD_ZERO(&fds);
+ FD_SET(pSocket->m_Socket, &fds);
+
+ if (pTimeout)
+ {
+ tv.tv_sec = pTimeout->Seconds;
+ tv.tv_usec = pTimeout->Nanosec / 1000L;
+ }
+
+ return (select(pSocket->m_Socket + 1, /* no of sockets to monitor */
+ &fds, /* check read operations */
+ 0, /* check write ops */
+ 0, /* ckeck for OOB */
+ (pTimeout) ? &tv : 0)==1); /* use timeout? */
+}
+
+/*****************************************************************************/
+/* osl_isSendReady */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isSendReady (
+ oslSocket pSocket,
+ const TimeValue* pTimeout)
+{
+ fd_set fds;
+ struct timeval tv;
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ FD_ZERO(&fds);
+ FD_SET(pSocket->m_Socket, &fds);
+
+ if (pTimeout)
+ {
+ tv.tv_sec = pTimeout->Seconds;
+ tv.tv_usec = pTimeout->Nanosec / 1000L;
+ }
+
+ return (select(pSocket->m_Socket + 1, /* no of sockets to monitor */
+ 0, /* check read operations */
+ &fds, /* check write ops */
+ 0, /* ckeck for OOB */
+ (pTimeout) ? &tv : 0)==1); /* use timeout? */
+}
+
+/*****************************************************************************/
+/* osl_isExceptionPending */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isExceptionPending (
+ oslSocket pSocket,
+ const TimeValue* pTimeout)
+{
+ fd_set fds;
+ struct timeval tv;
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ FD_ZERO(&fds);
+ FD_SET(pSocket->m_Socket, &fds);
+
+ if (pTimeout)
+ {
+ tv.tv_sec = pTimeout->Seconds;
+ tv.tv_usec = pTimeout->Nanosec / 1000L;
+ }
+
+ return (select(pSocket->m_Socket + 1, /* no of sockets to monitor */
+ 0, /* check read operations */
+ 0, /* check write ops */
+ &fds, /* ckeck for OOB */
+ (pTimeout) ? &tv : 0)==1); /* use timeout? */
+}
+
+/*****************************************************************************/
+/* osl_shutdownSocket */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_shutdownSocket (
+ oslSocket pSocket,
+ oslSocketDirection Direction)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ return (shutdown(pSocket->m_Socket, DIRECTION_TO_NATIVE(Direction))==0);
+}
+
+/*****************************************************************************/
+/* osl_getSocketOption */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_getSocketOption (
+ oslSocket pSocket,
+ oslSocketOptionLevel Level,
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return osl_Socket_Error;
+
+ if (getsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(Level),
+ OPTION_TO_NATIVE(Option),
+ (sal_Char*)pBuffer,
+ (int*)&BufferLen) == -1)
+ {
+ return -1;
+ }
+
+ return (sal_Int32)BufferLen;
+}
+
+/*****************************************************************************/
+/* osl_setSocketOption */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setSocketOption (
+ oslSocket pSocket,
+ oslSocketOptionLevel Level,
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ return(setsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(Level),
+ OPTION_TO_NATIVE(Option),
+ (sal_Char*)pBuffer,
+ BufferLen) == 0);
+}
+
+/*****************************************************************************/
+/* osl_enableNonBlockingMode */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_enableNonBlockingMode ( oslSocket pSocket, sal_Bool On)
+{
+ unsigned long Param= On ? 1 : 0;
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ pSocket->m_Flags = Param ?
+ (pSocket->m_Flags | OSL_SOCKET_FLAGS_NONBLOCKING) :
+ (pSocket->m_Flags & ~OSL_SOCKET_FLAGS_NONBLOCKING) ;
+
+ return (
+ ioctlsocket(pSocket->m_Socket, FIONBIO, &Param) != OSL_SOCKET_ERROR);
+}
+
+/*****************************************************************************/
+/* osl_isNonBlockingMode */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isNonBlockingMode(oslSocket pSocket)
+{
+ if (pSocket == NULL) /* ENOTSOCK */
+ return sal_False;
+
+ return (sal_Bool)((pSocket->m_Flags & OSL_SOCKET_FLAGS_NONBLOCKING) != 0);
+}
+
+/*****************************************************************************/
+/* osl_getSocketType */
+/*****************************************************************************/
+oslSocketType SAL_CALL osl_getSocketType(oslSocket pSocket)
+{
+ int Type=0;
+ int TypeSize= sizeof(Type);
+
+ if (pSocket == NULL) /* ENOTSOCK */
+ return osl_Socket_TypeInvalid;
+
+ if(getsockopt(pSocket->m_Socket,
+ OPTION_LEVEL_TO_NATIVE(osl_Socket_LevelSocket),
+ OPTION_TO_NATIVE(osl_Socket_OptionType),
+ (sal_Char *)&Type,
+ &TypeSize) == -1)
+ {
+ /* error */
+ return osl_Socket_TypeInvalid;
+ }
+
+ return TYPE_FROM_NATIVE(Type);
+}
+
+/*****************************************************************************/
+/* osl_getLastSocketErrorDescription */
+/*****************************************************************************/
+void SAL_CALL osl_getLastSocketErrorDescription (
+ oslSocket /*Socket*/,
+ rtl_uString **strError)
+{
+ int error;
+
+ switch(error = WSAGetLastError())
+ {
+ case WSAENOTSOCK:
+ rtl_uString_newFromAscii (strError, "WSAENOTSOCK, Socket operation on non-socket. A socket created in one process is used by another process.");
+ break;
+
+ case WSAEDESTADDRREQ:
+ rtl_uString_newFromAscii (strError, "WSAEDESTADDRREQ, Destination Addr required");
+ break;
+
+ case WSAEMSGSIZE:
+ rtl_uString_newFromAscii (strError, "WSAEMSGSIZE, Message too long");
+ break;
+
+ case WSAEPROTOTYPE:
+ rtl_uString_newFromAscii (strError, "WSAEPROTOTYPE, Protocol wrong type for socket");
+ break;
+
+ case WSAENOPROTOOPT:
+ rtl_uString_newFromAscii (strError, "WSAENOPROTOOPT, Protocol not available");
+ break;
+
+ case WSAEPROTONOSUPPORT:
+ rtl_uString_newFromAscii (strError, "WSAEPROTONOSUPPORT, Protocol not supported");
+ break;
+
+ case WSAESOCKTNOSUPPORT:
+ rtl_uString_newFromAscii (strError, "WSAESOCKTNOSUPPORT, Socket type not supported");
+ break;
+
+ case WSAEOPNOTSUPP:
+ rtl_uString_newFromAscii (strError, "WSAEOPNOTSUPP, Operation not supported on socket");
+ break;
+
+ case WSAEPFNOSUPPORT:
+ rtl_uString_newFromAscii (strError, "WSAEPFNOSUPPORT, Protocol family not supported");
+ break;
+
+ case WSAEAFNOSUPPORT:
+ rtl_uString_newFromAscii (strError, "WSEAFNOSUPPORT, Addr family not supported by protocol family");
+ break;
+
+ case WSAEADDRINUSE:
+ rtl_uString_newFromAscii (strError, "WSAEADDRINUSE, Triggered by bind() because a process went down without closing a socket.");
+ break;
+
+ case WSAEADDRNOTAVAIL:
+ rtl_uString_newFromAscii (strError, "WSAEADDRNOTAVAIL, Can't assign requested Addr");
+ break;
+
+ case WSAENETDOWN:
+ rtl_uString_newFromAscii (strError, "WSAENETDOWN, Network is down");
+ break;
+
+ case WSAENETUNREACH:
+ rtl_uString_newFromAscii (strError, "WSAENETUNREACH, Network is unreachable");
+ break;
+
+ case WSAENETRESET:
+ rtl_uString_newFromAscii (strError, "WSAENETRESET, Network dropped connection or reset");
+ break;
+
+ case WSAECONNABORTED:
+ rtl_uString_newFromAscii (strError, "WSAECONNABORTED, Software caused connection abort");
+ break;
+
+ case WSAECONNRESET:
+ rtl_uString_newFromAscii (strError, "WSAECONNRESET, Connection reset by peer");
+ break;
+
+ case WSAENOBUFS:
+ rtl_uString_newFromAscii (strError, "WSAENOBUFS, No buffer space available.");
+ break;
+
+ case WSAEISCONN:
+ rtl_uString_newFromAscii (strError, "WSAEISCONN, Socket is already connected");
+ break;
+
+ case WSAENOTCONN:
+ rtl_uString_newFromAscii (strError, "WSAENOTCONN, Socket is not connected");
+ break;
+
+ case WSAESHUTDOWN:
+ rtl_uString_newFromAscii (strError, "WSAESHUTDOWN, Can't send after socket shutdown");
+ break;
+
+ case WSAETIMEDOUT:
+ rtl_uString_newFromAscii (strError, "WSAETIMEDOUT, Connection timed out");
+ break;
+
+ case WSAECONNREFUSED:
+ rtl_uString_newFromAscii (strError, "WSAECONNREFUSED, Connection refused");
+ break;
+
+ case WSAEHOSTDOWN:
+ rtl_uString_newFromAscii (strError, "WSAEHOSTDOWN, Networking subsystem not started");
+ break;
+
+ case WSAEHOSTUNREACH:
+ rtl_uString_newFromAscii (strError, "WSAEHOSTUNREACH, No route to host");
+ break;
+
+ case WSAEWOULDBLOCK:
+ rtl_uString_newFromAscii (strError, "WSAEWOULDBLOCK, Operation would block");
+ break;
+
+ case WSAEINPROGRESS:
+ rtl_uString_newFromAscii (strError, "WSAEINPROGRESS, Operation now in progress");
+ break;
+
+ case WSAEALREADY:
+ rtl_uString_newFromAscii (strError, "WSAEALREADY, Operation already in progress");
+ break;
+
+ case WSAEINTR:
+ rtl_uString_newFromAscii (strError, "WSAEALREADY, Operation was interrupted");
+ break;
+
+ case WSAEBADF:
+ rtl_uString_newFromAscii (strError, "WSAEBADF, Bad file number");
+ break;
+
+ case WSAEACCES:
+ rtl_uString_newFromAscii (strError, "WSAEACCES, Access is denied");
+ break;
+
+ case WSAEFAULT:
+ rtl_uString_newFromAscii (strError, "WSAEFAULT, Bad memory Addr");
+ break;
+
+ case WSAEINVAL:
+ rtl_uString_newFromAscii (strError, "WSAEINVAL, The socket has not been bound with bind() or is already connected");
+ break;
+
+ case WSAEMFILE:
+ rtl_uString_newFromAscii (strError, "WSAEMFILE, No more file descriptors are available");
+ break;
+
+ case WSAETOOMANYREFS:
+ rtl_uString_newFromAscii (strError, "WSAETOOMANYREFS, Undocumented WinSock error");
+ break;
+
+ case WSAENAMETOOLONG:
+ rtl_uString_newFromAscii (strError, "WSAENAMETOOLONG, Undocumented WinSock error");
+ break;
+
+ case WSAENOTEMPTY:
+ rtl_uString_newFromAscii (strError, "WSAENOTEMPTY, Undocumented WinSock error");
+ break;
+
+ case WSAEPROCLIM:
+ rtl_uString_newFromAscii (strError, "WSAEPROCLIM, Undocumented WinSock error");
+ break;
+
+ case WSAEUSERS:
+ rtl_uString_newFromAscii (strError, "WSAEUSERS, Undocumented WinSock error");
+ break;
+
+ case WSAEDQUOT:
+ rtl_uString_newFromAscii (strError, "WSAEDQUOT, Undocumented WinSock error");
+ break;
+
+ case WSAESTALE:
+ rtl_uString_newFromAscii (strError, "WSAESTALE, Undocumented WinSock error");
+ break;
+
+ case WSAEREMOTE:
+ rtl_uString_newFromAscii (strError, "WSAEREMOTE, Undocumented WinSock error");
+ break;
+
+ case WSAEDISCON:
+ rtl_uString_newFromAscii (strError, "WSAEDISCON, Circuit was gracefully terminated");
+ break;
+
+ case WSASYSNOTREADY:
+ rtl_uString_newFromAscii (strError, "WSASYSNOTREADY, The underlying network subsystem is not ready for network communication");
+ break;
+
+ case WSAVERNOTSUPPORTED:
+ rtl_uString_newFromAscii (strError, "WSAVERNOTSUPPORTED, The version of Windows Sockets API support requested is not provided by this particular Windows Sockets implementation");
+ break;
+
+ case WSANOTINITIALISED:
+ rtl_uString_newFromAscii (strError, "WSANOTINITIALISED, WSAStartup() has not been called");
+ break;
+
+ case WSAHOST_NOT_FOUND:
+ rtl_uString_newFromAscii (strError, "WSAHOST_NOT_FOUND, Authoritative answer host not found");
+ break;
+
+ case WSATRY_AGAIN:
+ rtl_uString_newFromAscii (strError, "WSATRY_AGAIN, Non-authoritative answer host not found or SERVERFAIL");
+ break;
+
+ case WSANO_RECOVERY:
+ rtl_uString_newFromAscii (strError, "WSANO_RECOVERY, Non recoverable errors, FORMERR, REFUSED, NOTIMP");
+ break;
+
+ case WSANO_DATA:
+ rtl_uString_newFromAscii (strError, "WSANO_DATA or WSANO_ADDRESS, Valid name, no data record of requested type");
+ break;
+
+ default:
+ {
+ sal_Unicode message[128];
+
+ wsprintfW(reinterpret_cast<LPWSTR>(message), L"Unknown WinSock Error Number %d", error);
+ rtl_uString_newFromStr (strError, message);
+ }
+
+ return;
+
+ }
+}
+
+/*****************************************************************************/
+/* osl_getLastSocketError */
+/*****************************************************************************/
+oslSocketError SAL_CALL osl_getLastSocketError(oslSocket /*Socket*/)
+{
+ return ERROR_FROM_NATIVE(WSAGetLastError());
+}
+
+/*****************************************************************************/
+/* SocketSet */
+/*****************************************************************************/
+typedef struct _TSocketSetImpl
+{
+ fd_set m_Set; /* the set of descriptors */
+
+} TSocketSetImpl;
+
+/*****************************************************************************/
+/* osl_createSocketSet */
+/*****************************************************************************/
+oslSocketSet SAL_CALL osl_createSocketSet()
+{
+ TSocketSetImpl* pSet;
+
+ pSet = (TSocketSetImpl*) rtl_allocateMemory(sizeof(TSocketSetImpl));
+
+ if(pSet)
+ {
+ FD_ZERO(&pSet->m_Set);
+ }
+
+ return (oslSocketSet)pSet;
+}
+
+/*****************************************************************************/
+/* osl_destroySocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_destroySocketSet (oslSocketSet Set)
+{
+ if(Set)
+ rtl_freeMemory(Set);
+}
+
+/*****************************************************************************/
+/* osl_clearSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_clearSocketSet (oslSocketSet Set)
+{
+ TSocketSetImpl* pSet;
+
+ pSet= (TSocketSetImpl*)Set;
+
+ if (pSet)
+ FD_ZERO(&pSet->m_Set);
+}
+
+/*****************************************************************************/
+/* osl_addToSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_addToSocketSet (
+ oslSocketSet Set,
+ oslSocket Socket)
+{
+ TSocketSetImpl* pSet;
+ oslSocketImpl* pSockImpl;
+
+ pSet= (TSocketSetImpl*)Set;
+ pSockImpl= (oslSocketImpl*)Socket;
+
+ if (pSet && pSockImpl)
+ FD_SET(pSockImpl->m_Socket, &pSet->m_Set);
+}
+
+/*****************************************************************************/
+/* osl_removeFromSocketSet */
+/*****************************************************************************/
+void SAL_CALL osl_removeFromSocketSet (
+ oslSocketSet Set,
+ oslSocket Socket)
+{
+ TSocketSetImpl* pSet;
+ oslSocketImpl* pSockImpl;
+
+ pSet= (TSocketSetImpl*)Set;
+ pSockImpl= (oslSocketImpl*)Socket;
+
+ if (pSet && pSockImpl)
+ FD_CLR(pSockImpl->m_Socket, &pSet->m_Set);
+}
+
+/*****************************************************************************/
+/* osl_isInSocketSet */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isInSocketSet (
+ oslSocketSet Set,
+ oslSocket Socket)
+{
+ TSocketSetImpl* pSet;
+ oslSocketImpl* pSockImpl;
+
+ pSet= (TSocketSetImpl*)Set;
+ pSockImpl= (oslSocketImpl*)Socket;
+
+ if (pSet && pSockImpl)
+ return (FD_ISSET(pSockImpl->m_Socket, &pSet->m_Set) != 0);
+ else
+ return sal_False;
+}
+
+/*****************************************************************************/
+/* osl_demultiplexSocketEvents */
+/*****************************************************************************/
+sal_Int32 SAL_CALL osl_demultiplexSocketEvents (
+ oslSocketSet IncomingSet,
+ oslSocketSet OutgoingSet,
+ oslSocketSet OutOfBandSet,
+ const TimeValue* pTimeout)
+{
+ int MaxHandle= 0;
+ struct timeval tv;
+ TSocketSetImpl* pInSet;
+ TSocketSetImpl* pOutSet;
+ TSocketSetImpl* pOOBSet;
+
+ if(pTimeout)
+ {
+ /* divide milliseconds into seconds and microseconds */
+ tv.tv_sec = pTimeout->Seconds;
+ tv.tv_usec = pTimeout->Nanosec / 1000L;
+ }
+
+ /* map opaque data to impl-types */
+ pInSet= (TSocketSetImpl*)IncomingSet;
+ pOutSet= (TSocketSetImpl*)OutgoingSet;
+ pOOBSet= (TSocketSetImpl*)OutOfBandSet;
+
+ return select(MaxHandle, /* redundant in WIN32 */
+ pInSet ? &pInSet->m_Set : 0,
+ pOutSet ? &pOutSet->m_Set : 0,
+ pOOBSet ? &pOOBSet->m_Set : 0,
+ pTimeout ? &tv : 0);
+}
+
+}
diff --git a/sal/osl/w32/sockimpl.h b/sal/osl/w32/sockimpl.h
new file mode 100644
index 000000000000..d1278ee8e6ac
--- /dev/null
+++ b/sal/osl/w32/sockimpl.h
@@ -0,0 +1,108 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_SOCKETIMPL_H_
+#define _OSL_SOCKETIMPL_H_
+
+#include <osl/socket.h>
+#include <osl/interlck.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************/
+/* oslSocketImpl */
+/*****************************************************************************/
+#define OSL_SOCKET_FLAGS_NONBLOCKING 0x0001
+
+typedef void* (SAL_CALL * oslCloseCallback) (void*);
+
+struct oslSocketImpl {
+ oslInterlockedCount m_nRefCount;
+ SOCKET m_Socket;
+ int m_Flags;
+ oslCloseCallback m_CloseCallback;
+ void* m_CallbackArg;
+};
+
+struct oslSocketAddrImpl
+{
+ struct sockaddr m_sockaddr;
+ oslInterlockedCount m_nRefCount;
+};
+
+oslSocket __osl_createSocketImpl(SOCKET Socket);
+void __osl_destroySocketImpl(oslSocket pImpl);
+
+/*****************************************************************************/
+/* oslSocketDialupImpl */
+/*****************************************************************************/
+#define INTERNET_MODULE_NAME "wininet.dll"
+
+#define INTERNET_CONNECTION_MODEM 0x00000001L
+#define INTERNET_CONNECTION_LAN 0x00000002L
+#define INTERNET_CONNECTION_HANGUP 0x80000000L
+
+typedef DWORD (WINAPI *INTERNETATTEMPTCONNECT) (
+ DWORD dwReserved);
+typedef BOOL (WINAPI *INTERNETAUTODIAL) (
+ DWORD dwFlags, DWORD dwReserved);
+typedef BOOL (WINAPI *INTERNETAUTODIALHANGUP) (
+ DWORD dwReserved);
+typedef BOOL (WINAPI *INTERNETGETCONNECTEDSTATE) (
+ LPDWORD lpdwFlags, DWORD dwReserved);
+
+typedef struct osl_socket_dialup_impl_st
+{
+ CRITICAL_SECTION m_hMutex;
+ HINSTANCE m_hModule;
+ INTERNETATTEMPTCONNECT m_pfnAttemptConnect;
+ INTERNETAUTODIAL m_pfnAutodial;
+ INTERNETAUTODIALHANGUP m_pfnAutodialHangup;
+ INTERNETGETCONNECTEDSTATE m_pfnGetConnectedState;
+ DWORD m_dwFlags;
+} oslSocketDialupImpl;
+
+static oslSocketDialupImpl* __osl_createSocketDialupImpl (void);
+static void __osl_initSocketDialupImpl (oslSocketDialupImpl *pImpl);
+static void __osl_destroySocketDialupImpl (oslSocketDialupImpl *pImpl);
+
+static sal_Bool __osl_querySocketDialupImpl (void);
+static sal_Bool __osl_attemptSocketDialupImpl (void);
+
+/*****************************************************************************/
+/* The End */
+/*****************************************************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/sal/osl/w32/system.h b/sal/osl/w32/system.h
new file mode 100644
index 000000000000..1bd86994e6ce
--- /dev/null
+++ b/sal/osl/w32/system.h
@@ -0,0 +1,126 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if OSL_DEBUG_LEVEL == 0
+# define NO_DEBUG_CRT
+#endif
+
+#ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0400
+# define _CTYPE_DISABLE_MACROS /* wg. dynamischer C-Runtime MH */
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <malloc.h>
+#include <limits.h>
+#include <process.h>
+#include <time.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <io.h>
+#include <share.h>
+#include <direct.h>
+
+/* Must define this else build breaks because Winsock2.h
+ includes Windows.h and without WIN32_LEAN_AND_MEAN
+ also includes mswsock.h which needs a forward typedef
+ of SOCKET ...
+*/
+#define WIN32_LEAN_AND_MEAN
+
+#ifdef GCC
+ // windows.h includes winsock2.h
+ // if _WIN32_WINNT > 0x0400
+ // so someone cannot include winsock.h
+ // at the same time without patching
+ // windows.h
+ #include <windows.h>
+#ifdef __MINGW32__
+ #include <winsock2.h>
+ #include <ws2tcpip.h>
+#endif
+ #include <shlobj.h>
+ #ifndef NO_DEBUG_CRT
+ #include <crtdbg.h>
+ #endif
+#else
+ // winsock2.h includes windows.h
+ #pragma warning(push,1) /* disable warnings within system headers */
+ #pragma warning(disable:4917)
+ #include <winsock2.h>
+ #include <wsipx.h>
+ #include <shlobj.h>
+ #ifndef NO_DEBUG_CRT
+ #include <crtdbg.h>
+ #endif
+ #pragma warning(pop)
+#endif
+
+#define _MAX_CMD 4096 /* maximum length of commandline */
+/* #define _MAX_ENV 4096 maximum length of environment var (isn't used anywhere) */
+
+#ifdef GCC
+ # ifndef SA_FAMILY_DECL
+ # define SA_FAMILY_DECL short sa_family
+ # endif
+
+ typedef struct sockaddr_ipx {
+ SA_FAMILY_DECL;
+ char sa_netnum[4];
+ char sa_nodenum[6];
+ unsigned short sa_socket;
+ } SOCKADDR_IPX;
+
+ # define NSPROTO_IPX 1000
+ # define NSPROTO_SPX 1256
+ # define NSPROTO_SPXII 1257
+#endif // #ifdef GCC
+
+#ifdef _DLL_
+
+#ifdef __cplusplus
+ extern "C" DWORD g_dwPlatformId;
+#else
+ extern DWORD g_dwPlatformId;
+#endif // #ifdef __cplusplus
+
+ #define IS_NT (g_dwPlatformId == VER_PLATFORM_WIN32_NT)
+#else
+
+#ifdef __cplusplus
+ extern "C" DWORD GetPlatformId(void);
+#else
+ extern DWORD GetPlatformId(void);
+#endif // #ifdef __cplusplus
+
+ #define IS_NT (GetPlatformId() == VER_PLATFORM_WIN32_NT)
+#endif // #ifdef _DLL_
+
diff --git a/sal/osl/w32/tempfile.cxx b/sal/osl/w32/tempfile.cxx
new file mode 100644
index 000000000000..6a3d2549004a
--- /dev/null
+++ b/sal/osl/w32/tempfile.cxx
@@ -0,0 +1,274 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define UNICODE
+#define _UNICODE
+#define _WIN32_WINNT_0x0500
+#include "systools/win32/uwinapi.h"
+
+#include "osl/file.h"
+
+#include "file_error.h"
+#include "file_url.h"
+#include "path_helper.hxx"
+
+#include "osl/diagnose.h"
+
+#include <malloc.h>
+#include <tchar.h>
+
+//#####################################################
+#define ELEMENTS_OF_ARRAY(arr) (sizeof(arr)/(sizeof((arr)[0])))
+
+// Allocate n number of t's on the stack return a pointer to it in p
+#ifdef __MINGW32__
+#define STACK_ALLOC(p, t, n) (p) = reinterpret_cast<t*>(_alloca((n)*sizeof(t)));
+#else
+#define STACK_ALLOC(p, t, n) __try {(p) = reinterpret_cast<t*>(_alloca((n)*sizeof(t)));} \
+ __except(EXCEPTION_EXECUTE_HANDLER) {(p) = 0;}
+#endif
+
+extern "C" oslFileHandle SAL_CALL osl_createFileHandleFromOSHandle(HANDLE hFile, sal_uInt32 uFlags);
+
+//#####################################################
+// Temp file functions
+//#####################################################
+
+static oslFileError osl_setup_base_directory_impl_(
+ rtl_uString* pustrDirectoryURL,
+ rtl_uString** ppustr_base_dir)
+{
+ rtl_uString* dir_url = 0;
+ rtl_uString* dir = 0;
+ oslFileError error = osl_File_E_None;
+
+ if (pustrDirectoryURL)
+ rtl_uString_assign(&dir_url, pustrDirectoryURL);
+ else
+ error = osl_getTempDirURL(&dir_url);
+
+ if (osl_File_E_None == error)
+ {
+ error = _osl_getSystemPathFromFileURL(dir_url, &dir, sal_False);
+ rtl_uString_release(dir_url);
+ }
+
+ if (osl_File_E_None == error )
+ {
+ rtl_uString_assign(ppustr_base_dir, dir);
+ rtl_uString_release(dir);
+ }
+
+ return error;
+}
+
+//#####################################################
+static oslFileError osl_setup_createTempFile_impl_(
+ rtl_uString* pustrDirectoryURL,
+ oslFileHandle* pHandle,
+ rtl_uString** ppustrTempFileURL,
+ rtl_uString** ppustr_base_dir,
+ sal_Bool* b_delete_on_close)
+{
+ oslFileError osl_error;
+
+ OSL_PRECOND(((0 != pHandle) || (0 != ppustrTempFileURL)), "Invalid parameter!");
+
+ if ((0 == pHandle) && (0 == ppustrTempFileURL))
+ {
+ osl_error = osl_File_E_INVAL;
+ }
+ else
+ {
+ osl_error = osl_setup_base_directory_impl_(
+ pustrDirectoryURL, ppustr_base_dir);
+
+ *b_delete_on_close = (sal_Bool)(0 == ppustrTempFileURL);
+ }
+
+ return osl_error;
+}
+
+//#####################################################
+static oslFileError osl_win32_GetTempFileName_impl_(
+ rtl_uString* base_directory, LPWSTR temp_file_name)
+{
+ oslFileError osl_error = osl_File_E_None;
+
+ if (0 == GetTempFileNameW(
+ reinterpret_cast<LPCWSTR>(rtl_uString_getStr(base_directory)),
+ L"",
+ 0,
+ temp_file_name))
+ {
+ osl_error = oslTranslateFileError(GetLastError());
+ }
+
+ return osl_error;
+}
+
+//#####################################################
+static sal_Bool osl_win32_CreateFile_impl_(
+ LPCWSTR file_name, sal_Bool b_delete_on_close, oslFileHandle* p_handle)
+{
+ DWORD flags = FILE_ATTRIBUTE_NORMAL;
+ HANDLE hFile;
+
+ OSL_ASSERT(p_handle);
+
+ if (b_delete_on_close)
+ flags |= FILE_FLAG_DELETE_ON_CLOSE;
+
+ hFile = CreateFileW(
+ file_name,
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ NULL,
+ TRUNCATE_EXISTING,
+ flags,
+ NULL);
+
+ // @@@ ERROR HANDLING @@@
+ if (IsValidHandle(hFile))
+ *p_handle = osl_createFileHandleFromOSHandle(hFile, osl_File_OpenFlag_Read | osl_File_OpenFlag_Write);
+
+ return (sal_Bool)IsValidHandle(hFile);
+}
+
+//#############################################
+static oslFileError osl_createTempFile_impl_(
+ rtl_uString* base_directory,
+ LPWSTR tmp_name,
+ sal_Bool b_delete_on_close,
+ oslFileHandle* pHandle,
+ rtl_uString** ppustrTempFileURL)
+{
+ oslFileError osl_error;
+
+ do
+ {
+ osl_error = osl_win32_GetTempFileName_impl_(base_directory, tmp_name);
+
+ /* if file could not be opened try again */
+
+ if ((osl_File_E_None != osl_error) || (0 == pHandle) ||
+ osl_win32_CreateFile_impl_(tmp_name, b_delete_on_close, pHandle))
+ break;
+
+ } while(1); // try until success
+
+ if ((osl_File_E_None == osl_error) && !b_delete_on_close)
+ {
+ rtl_uString* pustr = 0;
+ rtl_uString_newFromStr(&pustr, reinterpret_cast<const sal_Unicode*>(tmp_name));
+ osl_getFileURLFromSystemPath(pustr, ppustrTempFileURL);
+ rtl_uString_release(pustr);
+ }
+
+ return osl_error;
+}
+
+//#############################################
+oslFileError SAL_CALL osl_createTempFile(
+ rtl_uString* pustrDirectoryURL,
+ oslFileHandle* pHandle,
+ rtl_uString** ppustrTempFileURL)
+{
+ rtl_uString* base_directory = 0;
+ LPWSTR tmp_name;
+ sal_Bool b_delete_on_close;
+ oslFileError osl_error;
+
+ osl_error = osl_setup_createTempFile_impl_(
+ pustrDirectoryURL,
+ pHandle,
+ ppustrTempFileURL,
+ &base_directory,
+ &b_delete_on_close);
+
+ if (osl_File_E_None != osl_error)
+ return osl_error;
+
+ /* allocate enough space on the stack, the file name can not be longer than MAX_PATH */
+ STACK_ALLOC(tmp_name, WCHAR, (rtl_uString_getLength(base_directory) + MAX_PATH));
+
+ if (tmp_name)
+ {
+ osl_createTempFile_impl_(
+ base_directory,
+ tmp_name,
+ b_delete_on_close,
+ pHandle,
+ ppustrTempFileURL);
+ }
+ else // stack alloc failed
+ {
+ osl_error = osl_File_E_NOMEM;
+ }
+
+ if (base_directory)
+ rtl_uString_release(base_directory);
+
+ return osl_error;
+}
+
+//#############################################
+oslFileError SAL_CALL osl_getTempDirURL(rtl_uString** pustrTempDir)
+{
+ ::osl::LongPathBuffer< sal_Unicode > aBuffer( MAX_LONG_PATH );
+ LPWSTR lpBuffer = ::osl::mingw_reinterpret_cast<LPWSTR>(aBuffer);
+ DWORD nBufferLength = aBuffer.getBufSizeInSymbols() - 1;
+
+ DWORD nLength;
+ oslFileError error;
+
+ nLength = GetTempPathW( aBuffer.getBufSizeInSymbols(), lpBuffer );
+
+ if ( nLength > nBufferLength )
+ {
+ // the provided path has invalid length
+ error = osl_File_E_NOENT;
+ }
+ else if ( nLength )
+ {
+ rtl_uString *ustrTempPath = NULL;
+
+ if ( '\\' == lpBuffer[nLength-1] )
+ lpBuffer[nLength-1] = 0;
+
+ rtl_uString_newFromStr( &ustrTempPath, reinterpret_cast<const sal_Unicode*>(lpBuffer) );
+
+ error = osl_getFileURLFromSystemPath( ustrTempPath, pustrTempDir );
+
+ rtl_uString_release( ustrTempPath );
+ }
+ else
+ error = oslTranslateFileError( GetLastError() );
+
+ return error;
+}
+
diff --git a/sal/osl/w32/thread.c b/sal/osl/w32/thread.c
new file mode 100644
index 000000000000..88ce87cdf175
--- /dev/null
+++ b/sal/osl/w32/thread.c
@@ -0,0 +1,593 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/thread.h>
+#include <rtl/alloc.h>
+#include <osl/time.h>
+#include <osl/interlck.h>
+#include <rtl/tencinfo.h>
+
+/*
+ Thread-data structure hidden behind oslThread:
+*/
+typedef struct _osl_TThreadImpl
+{
+ HANDLE m_hThread; /* OS-handle used for all thread-functions */
+ unsigned m_ThreadId; /* identifier for this thread */
+ sal_Int32 m_nTerminationRequested;
+ oslWorkerFunction m_WorkerFunction;
+ void* m_pData;
+
+} osl_TThreadImpl;
+
+#define THREADIMPL_FLAGS_TERMINATE 0x0001
+
+static unsigned __stdcall oslWorkerWrapperFunction(void* pData);
+static oslThread oslCreateThread(oslWorkerFunction pWorker, void* pThreadData, sal_uInt32 nFlags);
+
+/*****************************************************************************/
+/* oslWorkerWrapperFunction */
+/*****************************************************************************/
+static unsigned __stdcall oslWorkerWrapperFunction(void* pData)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)pData;
+
+ /* Initialize COM */
+
+ CoInitializeEx(NULL, COINIT_MULTITHREADED);
+
+ /* call worker-function with data */
+
+ pThreadImpl->m_WorkerFunction(pThreadImpl->m_pData);
+
+ CoUninitialize();
+
+ return (0);
+}
+
+/*****************************************************************************/
+/* oslCreateThread */
+/*****************************************************************************/
+static oslThread oslCreateThread(oslWorkerFunction pWorker,
+ void* pThreadData,
+ sal_uInt32 nFlags)
+{
+ osl_TThreadImpl* pThreadImpl;
+
+ /* alloc mem. for our internal data structure */
+ pThreadImpl= malloc(sizeof(osl_TThreadImpl));
+
+ OSL_ASSERT(pThreadImpl);
+
+ if ( pThreadImpl == 0 )
+ {
+ return 0;
+ }
+
+ pThreadImpl->m_WorkerFunction= pWorker;
+ pThreadImpl->m_pData= pThreadData;
+ pThreadImpl->m_nTerminationRequested= 0;
+
+ pThreadImpl->m_hThread=
+ (HANDLE)_beginthreadex(NULL, /* no security */
+ 0, /* default stack-size */
+ oslWorkerWrapperFunction, /* worker-function */
+ pThreadImpl, /* provide worker-function with data */
+ nFlags, /* start thread immediately or suspended */
+ &pThreadImpl->m_ThreadId);
+
+ if(pThreadImpl->m_hThread == 0)
+ {
+ /* create failed */
+ free(pThreadImpl);
+ return 0;
+ }
+
+ return (oslThread)pThreadImpl;
+}
+
+/*****************************************************************************/
+/* osl_createThread */
+/*****************************************************************************/
+oslThread SAL_CALL osl_createThread(oslWorkerFunction pWorker,
+ void* pThreadData)
+{
+ return oslCreateThread(pWorker, pThreadData, 0);
+}
+
+/*****************************************************************************/
+/* osl_createSuspendedThread */
+/*****************************************************************************/
+oslThread SAL_CALL osl_createSuspendedThread(oslWorkerFunction pWorker,
+ void* pThreadData)
+{
+ return oslCreateThread(pWorker, pThreadData, CREATE_SUSPENDED);
+}
+
+/*****************************************************************************/
+/* osl_getThreadIdentifier */
+/*****************************************************************************/
+oslThreadIdentifier SAL_CALL osl_getThreadIdentifier(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ if (pThreadImpl != NULL)
+ return ((oslThreadIdentifier)pThreadImpl->m_ThreadId);
+ else
+ return ((oslThreadIdentifier)GetCurrentThreadId());
+}
+
+/*****************************************************************************/
+/* osl_destroyThread */
+/*****************************************************************************/
+void SAL_CALL osl_destroyThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ if (Thread == 0) /* valid ptr? */
+ {
+ /* thread already destroyed or not created */
+ return;
+ }
+
+ /* !!!! _exitthreadex does _not_ call CloseHandle !!! */
+ CloseHandle( pThreadImpl->m_hThread );
+
+ /* free memory */
+ free(Thread);
+}
+
+/*****************************************************************************/
+/* osl_resumeThread */
+/*****************************************************************************/
+void SAL_CALL osl_resumeThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ OSL_ASSERT(pThreadImpl); /* valid ptr? */
+
+ ResumeThread(pThreadImpl->m_hThread);
+}
+
+/*****************************************************************************/
+/* osl_suspendThread */
+/*****************************************************************************/
+void SAL_CALL osl_suspendThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ OSL_ASSERT(pThreadImpl); /* valid ptr? */
+
+ SuspendThread(pThreadImpl->m_hThread);
+}
+
+/*****************************************************************************/
+/* osl_setThreadPriority */
+/*****************************************************************************/
+void SAL_CALL osl_setThreadPriority(oslThread Thread,
+ oslThreadPriority Priority)
+{
+ int winPriority;
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ OSL_ASSERT(pThreadImpl); /* valid ptr? */
+
+
+ /* map enum to WIN32 levels
+ it would be faster and more elegant to preset
+ the enums, but that would require an #ifdef in
+ the exported header, which is not desired.
+ */
+ switch(Priority) {
+
+ case osl_Thread_PriorityHighest:
+ winPriority= THREAD_PRIORITY_HIGHEST;
+ break;
+
+ case osl_Thread_PriorityAboveNormal:
+ winPriority= THREAD_PRIORITY_ABOVE_NORMAL;
+ break;
+
+ case osl_Thread_PriorityNormal:
+ winPriority= THREAD_PRIORITY_NORMAL;
+ break;
+
+ case osl_Thread_PriorityBelowNormal:
+ winPriority= THREAD_PRIORITY_BELOW_NORMAL;
+ break;
+
+ case osl_Thread_PriorityLowest:
+ winPriority= THREAD_PRIORITY_LOWEST;
+ break;
+
+ case osl_Thread_PriorityUnknown:
+ OSL_ASSERT(FALSE); /* only fools try this...*/
+
+ /* let release-version behave friendly */
+ return;
+
+ default:
+ OSL_ASSERT(FALSE); /* enum expanded, but forgotten here...*/
+
+ /* let release-version behave friendly */
+ return;
+ }
+
+ SetThreadPriority(pThreadImpl->m_hThread, winPriority);
+}
+
+/*****************************************************************************/
+/* osl_getThreadPriority */
+/*****************************************************************************/
+oslThreadPriority SAL_CALL osl_getThreadPriority(const oslThread Thread)
+{
+ int winPriority;
+ oslThreadPriority Priority;
+
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ /* invalid arguments ?*/
+ if(pThreadImpl==0 || pThreadImpl->m_hThread==0)
+ {
+ return osl_Thread_PriorityUnknown;
+ }
+
+ winPriority=
+ GetThreadPriority(pThreadImpl->m_hThread);
+
+
+ if(winPriority == THREAD_PRIORITY_ERROR_RETURN)
+ {
+ return osl_Thread_PriorityUnknown;
+ }
+
+ /* map WIN32 priority to enum */
+ switch(winPriority)
+ {
+ case THREAD_PRIORITY_TIME_CRITICAL:
+ case THREAD_PRIORITY_HIGHEST:
+ Priority= osl_Thread_PriorityHighest;
+ break;
+
+ case THREAD_PRIORITY_ABOVE_NORMAL:
+ Priority= osl_Thread_PriorityAboveNormal;
+ break;
+
+ case THREAD_PRIORITY_NORMAL:
+ Priority= osl_Thread_PriorityNormal;
+ break;
+
+ case THREAD_PRIORITY_BELOW_NORMAL:
+ Priority= osl_Thread_PriorityBelowNormal;
+ break;
+
+ case THREAD_PRIORITY_IDLE:
+ case THREAD_PRIORITY_LOWEST:
+ Priority= osl_Thread_PriorityLowest;
+ break;
+
+ default:
+ OSL_ASSERT(FALSE); /* WIN32 API changed, incorporate new prio-level! */
+
+ /* release-version behaves friendly */
+ Priority= osl_Thread_PriorityUnknown;
+ }
+
+ return Priority;
+}
+
+/*****************************************************************************/
+/* osl_isThreadRunning */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_isThreadRunning(const oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ /* invalid arguments ?*/
+ if(pThreadImpl==0 || pThreadImpl->m_hThread==0)
+ {
+ return sal_False;
+ }
+
+ return (sal_Bool)(WaitForSingleObject(pThreadImpl->m_hThread, 0) != WAIT_OBJECT_0);
+}
+
+/*****************************************************************************/
+/* osl_joinWithThread */
+/*****************************************************************************/
+void SAL_CALL osl_joinWithThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ /* invalid arguments?*/
+ if(pThreadImpl==0 || pThreadImpl->m_hThread==0)
+ {
+ /* assume thread is not running */
+ return;
+ }
+
+ WaitForSingleObject(pThreadImpl->m_hThread, INFINITE);
+}
+
+/*****************************************************************************/
+/* osl_waitThread */
+/*****************************************************************************/
+void SAL_CALL osl_waitThread(const TimeValue* pDelay)
+{
+ if (pDelay)
+ {
+ DWORD millisecs = pDelay->Seconds * 1000L + pDelay->Nanosec / 1000000L;
+
+ Sleep(millisecs);
+ }
+}
+
+/*****************************************************************************/
+/* osl_terminateThread */
+/*****************************************************************************/
+void SAL_CALL osl_terminateThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ /* invalid arguments?*/
+ if (pThreadImpl==0 || pThreadImpl->m_hThread==0)
+ {
+ /* assume thread is not running */
+ return;
+ }
+
+ osl_incrementInterlockedCount(&(pThreadImpl->m_nTerminationRequested));
+}
+
+
+/*****************************************************************************/
+/* osl_scheduleThread */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_scheduleThread(oslThread Thread)
+{
+ osl_TThreadImpl* pThreadImpl= (osl_TThreadImpl*)Thread;
+
+ osl_yieldThread();
+
+ /* invalid arguments?*/
+ if (pThreadImpl==0 || pThreadImpl->m_hThread==0)
+ {
+ /* assume thread is not running */
+ return sal_False;
+ }
+
+ return (sal_Bool)(0 == pThreadImpl->m_nTerminationRequested);
+}
+
+/*****************************************************************************/
+/* osl_yieldThread */
+/*****************************************************************************/
+void SAL_CALL osl_yieldThread(void)
+{
+ Sleep(0);
+}
+
+typedef struct _TLS
+{
+ DWORD dwIndex;
+ oslThreadKeyCallbackFunction pfnCallback;
+ struct _TLS *pNext, *pPrev;
+} TLS, *PTLS;
+
+static PTLS g_pThreadKeyList = NULL;
+CRITICAL_SECTION g_ThreadKeyListCS;
+
+static void AddKeyToList( PTLS pTls )
+{
+ if ( pTls )
+ {
+ EnterCriticalSection( &g_ThreadKeyListCS );
+
+ pTls->pNext = g_pThreadKeyList;
+ pTls->pPrev = 0;
+
+ if ( g_pThreadKeyList )
+ g_pThreadKeyList->pPrev = pTls;
+
+ g_pThreadKeyList = pTls;
+
+ LeaveCriticalSection( &g_ThreadKeyListCS );
+ }
+}
+
+static void RemoveKeyFromList( PTLS pTls )
+{
+ if ( pTls )
+ {
+ EnterCriticalSection( &g_ThreadKeyListCS );
+ if ( pTls->pPrev )
+ pTls->pPrev->pNext = pTls->pNext;
+ else
+ {
+ OSL_ASSERT( pTls == g_pThreadKeyList );
+ g_pThreadKeyList = pTls->pNext;
+ }
+
+ if ( pTls->pNext )
+ pTls->pNext->pPrev = pTls->pPrev;
+ LeaveCriticalSection( &g_ThreadKeyListCS );
+ }
+}
+
+void SAL_CALL _osl_callThreadKeyCallbackOnThreadDetach(void)
+{
+ PTLS pTls;
+
+
+ EnterCriticalSection( &g_ThreadKeyListCS );
+ pTls = g_pThreadKeyList;
+ while ( pTls )
+ {
+ if ( pTls->pfnCallback )
+ {
+ void *pValue = TlsGetValue( pTls->dwIndex );
+
+ if ( pValue )
+ pTls->pfnCallback( pValue );
+ }
+
+ pTls = pTls->pNext;
+ }
+ LeaveCriticalSection( &g_ThreadKeyListCS );
+}
+
+/*****************************************************************************/
+/* osl_createThreadKey */
+/*****************************************************************************/
+oslThreadKey SAL_CALL osl_createThreadKey(oslThreadKeyCallbackFunction pCallback)
+{
+ PTLS pTls = rtl_allocateMemory( sizeof(TLS) );
+
+ if ( pTls )
+ {
+ pTls->pfnCallback = pCallback;
+ if ( (DWORD)-1 == (pTls->dwIndex = TlsAlloc()) )
+ {
+ rtl_freeMemory( pTls );
+ pTls = 0;
+ }
+ else
+ AddKeyToList( pTls );
+ }
+
+ return ((oslThreadKey)pTls);
+}
+
+/*****************************************************************************/
+/* osl_destroyThreadKey */
+/*****************************************************************************/
+void SAL_CALL osl_destroyThreadKey(oslThreadKey Key)
+{
+ if (Key != 0)
+ {
+ PTLS pTls = (PTLS)Key;
+
+ RemoveKeyFromList( pTls );
+ TlsFree( pTls->dwIndex );
+ rtl_freeMemory( pTls );
+ }
+}
+
+/*****************************************************************************/
+/* osl_getThreadKeyData */
+/*****************************************************************************/
+void* SAL_CALL osl_getThreadKeyData(oslThreadKey Key)
+{
+ if (Key != 0)
+ {
+ PTLS pTls = (PTLS)Key;
+
+ return (TlsGetValue( pTls->dwIndex ));
+ }
+
+ return (NULL);
+}
+
+/*****************************************************************************/
+/* osl_setThreadKeyData */
+/*****************************************************************************/
+sal_Bool SAL_CALL osl_setThreadKeyData(oslThreadKey Key, void *pData)
+{
+ if (Key != 0)
+ {
+ PTLS pTls = (PTLS)Key;
+ void* pOldData = NULL;
+ BOOL fSuccess;
+
+ if ( pTls->pfnCallback )
+ pOldData = TlsGetValue( pTls->dwIndex );
+
+ fSuccess = TlsSetValue( pTls->dwIndex, pData );
+
+ if ( fSuccess && pTls->pfnCallback && pOldData )
+ pTls->pfnCallback( pOldData );
+
+ return (sal_Bool)(fSuccess != FALSE);
+ }
+
+ return (sal_False);
+}
+
+
+/*****************************************************************************/
+/* osl_getThreadTextEncoding */
+/*****************************************************************************/
+
+DWORD g_dwTLSTextEncodingIndex = (DWORD)-1;
+
+
+rtl_TextEncoding SAL_CALL osl_getThreadTextEncoding(void)
+{
+ DWORD dwEncoding;
+ rtl_TextEncoding _encoding;
+ BOOL gotACP;
+
+ if ( (DWORD)-1 == g_dwTLSTextEncodingIndex )
+ g_dwTLSTextEncodingIndex = TlsAlloc();
+
+ dwEncoding = (DWORD)TlsGetValue( g_dwTLSTextEncodingIndex );
+ _encoding = LOWORD(dwEncoding);
+ gotACP = HIWORD(dwEncoding);
+
+
+ if ( !gotACP )
+ {
+ char *pszEncoding;
+
+ if ( NULL != (pszEncoding = getenv( "SOLAR_USER_RTL_TEXTENCODING" )) )
+ _encoding = (rtl_TextEncoding)atoi(pszEncoding);
+ else
+ _encoding = rtl_getTextEncodingFromWindowsCodePage( GetACP() );
+
+ TlsSetValue( g_dwTLSTextEncodingIndex, (LPVOID)MAKELONG( _encoding, TRUE ) );
+ }
+
+ return _encoding;
+}
+
+/*****************************************************************************/
+/* osl_getThreadTextEncoding */
+/*****************************************************************************/
+rtl_TextEncoding SAL_CALL osl_setThreadTextEncoding( rtl_TextEncoding Encoding )
+{
+ rtl_TextEncoding oldEncoding = osl_getThreadTextEncoding();
+
+ TlsSetValue( g_dwTLSTextEncodingIndex, (LPVOID)MAKELONG( Encoding, TRUE) );
+
+ return oldEncoding;
+}
+
+
+
diff --git a/sal/osl/w32/time.c b/sal/osl/w32/time.c
new file mode 100644
index 000000000000..a4d0b6fffbad
--- /dev/null
+++ b/sal/osl/w32/time.c
@@ -0,0 +1,216 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "system.h"
+
+#include <osl/diagnose.h>
+#include <osl/time.h>
+#include <sys/timeb.h>
+
+extern sal_Bool TimeValueToFileTime(const TimeValue *cpTimeVal, FILETIME *pFTime);
+
+extern BOOL FileTimeToTimeValue( const FILETIME *cpFTime, TimeValue *pTimeVal );
+
+//--------------------------------------------------
+// osl_getSystemTime
+//--------------------------------------------------
+
+sal_Bool SAL_CALL osl_getSystemTime(TimeValue* pTimeVal)
+{
+ SYSTEMTIME SystemTime;
+ FILETIME CurTime, OffTime;
+ __int64 Value;
+
+ OSL_ASSERT(pTimeVal != 0);
+
+ GetSystemTime(&SystemTime);
+ SystemTimeToFileTime(&SystemTime, &CurTime);
+
+ SystemTime.wYear = 1970;
+ SystemTime.wMonth = 1;
+ SystemTime.wDayOfWeek = 0;
+ SystemTime.wDay = 1;
+ SystemTime.wHour = 0;
+ SystemTime.wMinute = 0;
+ SystemTime.wSecond = 0;
+ SystemTime.wMilliseconds = 0;
+
+ SystemTimeToFileTime(&SystemTime, &OffTime);
+
+ Value = *((__int64 *)&CurTime) - *((__int64 *)&OffTime);
+
+ pTimeVal->Seconds = (unsigned long) (Value / 10000000L);
+ pTimeVal->Nanosec = (unsigned long)((Value % 10000000L) * 100);
+
+ return (sal_True);
+}
+
+//--------------------------------------------------
+// osl_getDateTimeFromTimeValue
+//--------------------------------------------------
+
+sal_Bool SAL_CALL osl_getDateTimeFromTimeValue( TimeValue* pTimeVal, oslDateTime* pDateTime )
+{
+ FILETIME aFileTime;
+ SYSTEMTIME aSystemTime;
+
+ if ( TimeValueToFileTime(pTimeVal, &aFileTime) )
+ {
+ if ( FileTimeToSystemTime( &aFileTime, &aSystemTime ) )
+ {
+ pDateTime->NanoSeconds = pTimeVal->Nanosec;
+
+ pDateTime->Seconds = aSystemTime.wSecond;
+ pDateTime->Minutes = aSystemTime.wMinute;
+ pDateTime->Hours = aSystemTime.wHour;
+ pDateTime->Day = aSystemTime.wDay;
+ pDateTime->DayOfWeek = aSystemTime.wDayOfWeek;
+ pDateTime->Month = aSystemTime.wMonth;
+ pDateTime->Year = aSystemTime.wYear;
+
+ return sal_True;
+ }
+ }
+
+ return sal_False;
+}
+
+//--------------------------------------------------
+// osl_getTimeValueFromDateTime
+//--------------------------------------------------
+
+sal_Bool SAL_CALL osl_getTimeValueFromDateTime( oslDateTime* pDateTime, TimeValue* pTimeVal )
+{
+ FILETIME aFileTime;
+ SYSTEMTIME aSystemTime;
+
+ aSystemTime.wMilliseconds = 0;
+ aSystemTime.wSecond = pDateTime->Seconds;
+ aSystemTime.wMinute = pDateTime->Minutes;
+ aSystemTime.wHour = pDateTime->Hours;
+ aSystemTime.wDay = pDateTime->Day;
+ aSystemTime.wDayOfWeek = pDateTime->DayOfWeek;
+ aSystemTime.wMonth = pDateTime->Month;
+ aSystemTime.wYear = pDateTime->Year;
+
+ if ( SystemTimeToFileTime( &aSystemTime, &aFileTime ) )
+ {
+ if (FileTimeToTimeValue( &aFileTime, pTimeVal ) )
+ {
+ pTimeVal->Nanosec = pDateTime->NanoSeconds;
+ return sal_True;
+ }
+ }
+
+ return sal_False;
+}
+
+
+//--------------------------------------------------
+// osl_getLocalTimeFromSystemTime
+//--------------------------------------------------
+
+sal_Bool SAL_CALL osl_getLocalTimeFromSystemTime( TimeValue* pSystemTimeVal, TimeValue* pLocalTimeVal )
+{
+ TIME_ZONE_INFORMATION aTimeZoneInformation;
+ DWORD Success;
+ sal_Int64 bias;
+
+ // get timezone information
+ if ( ( Success=GetTimeZoneInformation( &aTimeZoneInformation ) ) != TIME_ZONE_ID_INVALID)
+ {
+ bias=aTimeZoneInformation.Bias;
+
+ // add bias for daylight saving time
+ if ( Success== TIME_ZONE_ID_DAYLIGHT )
+ bias+=aTimeZoneInformation.DaylightBias;
+
+ if ( (sal_Int64) pSystemTimeVal->Seconds > ( bias * 60 ) )
+ {
+ pLocalTimeVal->Seconds = (sal_uInt32) (pSystemTimeVal->Seconds - ( bias * 60) );
+ pLocalTimeVal->Nanosec = pSystemTimeVal->Nanosec;
+
+ return sal_True;
+ }
+ }
+
+ return sal_False;
+}
+
+//--------------------------------------------------
+// osl_getSystemTimeFromLocalTime
+//--------------------------------------------------
+
+sal_Bool SAL_CALL osl_getSystemTimeFromLocalTime( TimeValue* pLocalTimeVal, TimeValue* pSystemTimeVal )
+{
+ TIME_ZONE_INFORMATION aTimeZoneInformation;
+ DWORD Success;
+ sal_Int64 bias;
+
+ // get timezone information
+ if ( ( Success=GetTimeZoneInformation( &aTimeZoneInformation ) ) != TIME_ZONE_ID_INVALID)
+ {
+ bias=aTimeZoneInformation.Bias;
+
+ // add bias for daylight saving time
+ if ( Success== TIME_ZONE_ID_DAYLIGHT )
+ bias+=aTimeZoneInformation.DaylightBias;
+
+ if ( (sal_Int64) pLocalTimeVal->Seconds + ( bias * 60 ) > 0 )
+ {
+ pSystemTimeVal->Seconds = (sal_uInt32) ( pLocalTimeVal->Seconds + ( bias * 60) );
+ pSystemTimeVal->Nanosec = pLocalTimeVal->Nanosec;
+
+ return sal_True;
+ }
+ }
+
+ return sal_False;
+}
+
+
+static struct _timeb startTime;
+static sal_Bool bGlobalTimer = sal_False;
+
+sal_uInt32 SAL_CALL osl_getGlobalTimer(void)
+{
+ struct _timeb currentTime;
+ sal_uInt32 nSeconds;
+
+ if ( bGlobalTimer == sal_False )
+ {
+ _ftime( &startTime );
+ bGlobalTimer=sal_True;
+ }
+
+ _ftime( &currentTime );
+
+ nSeconds = (sal_uInt32)( currentTime.time - startTime.time );
+
+ return ( nSeconds * 1000 ) + (long)( currentTime.millitm - startTime.millitm );
+}
+
diff --git a/sal/osl/w32/util.c b/sal/osl/w32/util.c
new file mode 100644
index 000000000000..f4d8cbf52d20
--- /dev/null
+++ b/sal/osl/w32/util.c
@@ -0,0 +1,37 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "osl/util.h"
+
+
+
+extern sal_Bool SAL_CALL osl_getEthernetAddress( sal_uInt8 *pAddr )
+{
+ pAddr = pAddr; /* avoid warnings */
+ return sal_False;
+}
+
diff --git a/sal/prj/build.lst b/sal/prj/build.lst
new file mode 100644
index 000000000000..06e3958443e9
--- /dev/null
+++ b/sal/prj/build.lst
@@ -0,0 +1,23 @@
+sa sal : xml2cmp stlport external BOOST:boost CPPUNIT:cppunit NULL
+sa sal usr1 - all sa_mkout NULL
+sa sal\inc nmake - all sa_inc NULL
+sa sal\typesconfig nmake - u sa_tc sa_inc NULL
+sa sal\cpprt nmake - u sa_cpprt sa_util sa_inc NULL
+sa sal\rtl\source nmake - all sa_rtl sa_tc.u sa_inc NULL
+sa sal\textenc nmake - all sa_textenc sa_tc.u sa_inc NULL
+sa sal\systools\win32\uwinapi nmake - n sa_uwinapi sa_inc NULL
+sa sal\systools\win32\kill nmake - n sa_kill sa_uwinapi.n sa_inc NULL
+sa sal\systools\win32\onlineupdate nmake - n sa_onlineupdate sa_uwinapi.n sa_inc NULL
+sa sal\osl\w32 nmake - n sa_osln sa_inc NULL
+sa sal\osl\os2 nmake - p sa_oslp sa_inc NULL
+sa sal\qa nmake - all sa_qa sa_util NULL
+sa sal\osl\unx nmake - u sa_oslu sa_tc.u sa_inc NULL
+sa sal\osl\all nmake - all sa_oslall sa_tc.u sa_inc NULL
+sa sal\util nmake - all sa_util sa_tc.u sa_oslall sa_uwinapi.n sa_kill.n sa_onlineupdate.n sa_osln.n sa_oslp.p sa_oslu.u sa_rtl sa_textenc NULL
+sa sal\cppunittester nmake - all sa_cppunittester sa_cpprt.u sa_util NULL
+sa sal\qa\ByteSequence nmake - all sa_qa_ByteSequence sa_cppunittester sa_util NULL
+sa sal\qa\OStringBuffer nmake - all sa_qa_OStringBuffer sa_cppunittester sa_util NULL
+sa sal\qa\osl\mutex nmake - all sa_qa_osl_mutex sa_cppunittester sa_util NULL
+sa sal\qa\osl\pipe nmake - all sa_qa_osl_pipe sa_cppunittester sa_util NULL
+sa sal\qa\osl\profile nmake - all sa_qa_osl_profile sa_cppunittester sa_util NULL
+sa sal\qa\rtl\math nmake - all sa_qa_rtl_math sa_cppunittester sa_util NULL
diff --git a/sal/prj/d.lst b/sal/prj/d.lst
new file mode 100644
index 000000000000..3ce270bbbfc4
--- /dev/null
+++ b/sal/prj/d.lst
@@ -0,0 +1,38 @@
+mkdir: %_DEST%\inc%_EXT%\sal
+mkdir: %_DEST%\inc%_EXT%\osl
+mkdir: %_DEST%\inc%_EXT%\rtl
+mkdir: %_DEST%\inc%_EXT%\systools
+mkdir: %_DEST%\inc%_EXT%\systools\win32
+
+..\%__SRC%\inc\rtlbootstrap.mk %_DEST%\inc%_EXT%\rtlbootstrap.mk
+..\inc\sal\*.h %_DEST%\inc%_EXT%\sal\*.h
+..\%__SRC%\inc\sal\typesizes.h %_DEST%\inc%_EXT%\sal\typesizes.h
+..\inc\osl\*.h %_DEST%\inc%_EXT%\osl\*.h
+..\inc\osl\*.hxx %_DEST%\inc%_EXT%\osl\*.hxx
+..\inc\rtl\*.h %_DEST%\inc%_EXT%\rtl\*.h
+..\inc\rtl\*.hxx %_DEST%\inc%_EXT%\rtl\*.hxx
+..\inc\systools\win32\*.h %_DEST%\inc%_EXT%\systools\win32\*.h
+..\inc\systools\win32\*.hxx %_DEST%\inc%_EXT%\systools\win32\*.hxx
+
+..\%__SRC%\lib\libsalalloc_malloc.so.3 %_DEST%\lib%_EXT%\libsalalloc_malloc.so.3
+symlink: %_DEST%\lib%_EXT%\libsalalloc_malloc.so.3 %_DEST%\lib%_EXT%\libsalalloc_malloc.so
+..\%__SRC%\lib\libuno_sal.so.3 %_DEST%\lib%_EXT%\libuno_sal.so.3
+symlink: %_DEST%\lib%_EXT%\libuno_sal.so.3 %_DEST%\lib%_EXT%\libuno_sal.so
+..\%__SRC%\lib\libuno_sal.dylib.3 %_DEST%\lib%_EXT%\libuno_sal.dylib.3
+symlink: %_DEST%\lib%_EXT%\libuno_sal.dylib.3 %_DEST%\lib%_EXT%\libuno_sal.dylib
+..\%__SRC%\lib\*.sl %_DEST%\lib%_EXT%\*.sl
+..\%__SRC%\lib\*.a %_DEST%\lib%_EXT%\*.a
+
+..\%__SRC%\slb\sal.lib %_DEST%\lib%_EXT%\xsal.lib
+
+..\%__SRC%\bin\kill.exe %_DEST%\bin%_EXT%\kill.exe
+..\%__SRC%\bin\*.dll %_DEST%\bin%_EXT%\*.dll
+..\%__SRC%\lib\*.lib %_DEST%\lib%_EXT%\*.lib
+..\%__SRC%\bin\*.bin %_DEST%\bin%_EXT%\*.bin
+..\%__SRC%\misc\*.hid %_DEST%\bin%_EXT%\*.hid
+..\%__SRC%\bin\*.res %_DEST%\bin%_EXT%\*.res
+
+..\%__SRC%\inc\udkversion.h %_DEST%\inc%_EXT%\sal\udkversion.h
+
+..\%__SRC%\bin\cppunittester %_DEST%\bin%_EXT%\cppunittester
+..\%__SRC%\bin\cppunittester.exe %_DEST%\bin%_EXT%\cppunittester.exe
diff --git a/sal/qa/ByteSequence/ByteSequence.cxx b/sal/qa/ByteSequence/ByteSequence.cxx
new file mode 100644
index 000000000000..7c9ff2eaef94
--- /dev/null
+++ b/sal/qa/ByteSequence/ByteSequence.cxx
@@ -0,0 +1,194 @@
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#include "precompiled_sal.hxx"
+#include "sal/config.h"
+
+#include "cppunit/TestAssert.h"
+#include "cppunit/TestFixture.h"
+#include "cppunit/extensions/HelperMacros.h"
+#include "cppunit/plugin/TestPlugIn.h"
+#include "rtl/byteseq.hxx"
+#include "sal/types.h"
+
+namespace {
+
+class Test: public CppUnit::TestFixture {
+public:
+ void test_default() {
+ rtl::ByteSequence s;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), s.getLength());
+ }
+
+ void test_size0() {
+ rtl::ByteSequence s(sal_Int32(0));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), s.getLength());
+ }
+
+ void test_size5() {
+ rtl::ByteSequence s(5);
+ sal_Int8 const * p = s.getConstArray();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), s.getLength());
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(0), p[0]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(0), p[1]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(0), p[2]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(0), p[3]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(0), p[4]);
+ }
+
+ void test_noinit0() {
+ rtl::ByteSequence s(0, rtl::BYTESEQ_NODEFAULT);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), s.getLength());
+ }
+
+ void test_noinit5() {
+ rtl::ByteSequence s(5, rtl::BYTESEQ_NODEFAULT);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), s.getLength());
+ }
+
+ void test_elem0() {
+ rtl::ByteSequence s(0, 0);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), s.getLength());
+ }
+
+ void test_elem5() {
+ sal_Int8 const a[5] = { 0, 1, 2, 3, 4 };
+ rtl::ByteSequence s(a, 5);
+ sal_Int8 const * p = s.getConstArray();
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), s.getLength());
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(0), p[0]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(1), p[1]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(2), p[2]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(3), p[3]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(4), p[4]);
+ }
+
+ void test_copy() {
+ rtl::ByteSequence s1(5);
+ {
+ rtl::ByteSequence s2(s1);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), s2.getLength());
+ CPPUNIT_ASSERT_EQUAL(s1.getConstArray(), s2.getConstArray());
+ CPPUNIT_ASSERT_EQUAL(s1.getHandle(), s2.getHandle());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), s1.getHandle()->nRefCount);
+ }
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), s1.getHandle()->nRefCount);
+ }
+
+ void test_fromC() {
+ sal_Sequence c = { 1, 1, { 0 } };
+ {
+ rtl::ByteSequence s(&c);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), s.getLength());
+ CPPUNIT_ASSERT_EQUAL(
+ static_cast< void const * >(c.elements),
+ static_cast< void const * >(s.getConstArray()));
+ CPPUNIT_ASSERT_EQUAL(&c, s.getHandle());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), c.nRefCount);
+ }
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), c.nRefCount);
+ }
+
+ void test_noacquire() {
+ sal_Sequence c = { 2, 1, { 0 } };
+ {
+ rtl::ByteSequence s(&c, rtl::BYTESEQ_NOACQUIRE);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), s.getLength());
+ CPPUNIT_ASSERT_EQUAL(
+ static_cast< void const * >(c.elements),
+ static_cast< void const * >(s.getConstArray()));
+ CPPUNIT_ASSERT_EQUAL(&c, s.getHandle());
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), c.nRefCount);
+ }
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), c.nRefCount);
+ }
+
+ void test_getArray() {
+ sal_Int8 const a[5] = { 0, 1, 2, 3, 4 };
+ rtl::ByteSequence s1(a, 5);
+ rtl::ByteSequence s2(s1);
+ sal_Int8 * p = s2.getArray();
+ p[2] = 10;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), s1.getHandle()->nRefCount);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), s2.getHandle()->nRefCount);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(2), s1.getConstArray()[2]);
+ CPPUNIT_ASSERT_EQUAL(sal_Int8(10), s2.getConstArray()[2]);
+ }
+
+ void test_same0() {
+ rtl::ByteSequence s1;
+ rtl::ByteSequence s2;
+ CPPUNIT_ASSERT_EQUAL(sal_True, s1 == s2);
+ CPPUNIT_ASSERT_EQUAL(sal_True, s2 == s1);
+ CPPUNIT_ASSERT_EQUAL(sal_False, s1 != s2);
+ CPPUNIT_ASSERT_EQUAL(sal_False, s2 != s1);
+ }
+
+ void test_diffLen() {
+ sal_Int8 const a[5] = { 0, 1, 2, 3, 4 };
+ rtl::ByteSequence s1(a, 5);
+ rtl::ByteSequence s2(a, 4);
+ CPPUNIT_ASSERT_EQUAL(sal_False, s1 == s2);
+ CPPUNIT_ASSERT_EQUAL(sal_False, s2 == s1);
+ CPPUNIT_ASSERT_EQUAL(sal_True, s1 != s2);
+ CPPUNIT_ASSERT_EQUAL(sal_True, s2 != s1);
+ }
+
+ void test_diffElem() {
+ sal_Int8 const a1[5] = { 0, 1, 2, 3, 4 };
+ rtl::ByteSequence s1(a1, 5);
+ sal_Int8 const a2[5] = { 0, 1, 10, 3, 4 };
+ rtl::ByteSequence s2(a2, 5);
+ CPPUNIT_ASSERT_EQUAL(sal_False, s1 == s2);
+ CPPUNIT_ASSERT_EQUAL(sal_False, s2 == s1);
+ CPPUNIT_ASSERT_EQUAL(sal_True, s1 != s2);
+ CPPUNIT_ASSERT_EQUAL(sal_True, s2 != s1);
+ }
+
+ CPPUNIT_TEST_SUITE(Test);
+ CPPUNIT_TEST(test_default);
+ CPPUNIT_TEST(test_size0);
+ CPPUNIT_TEST(test_size5);
+ CPPUNIT_TEST(test_noinit0);
+ CPPUNIT_TEST(test_noinit5);
+ CPPUNIT_TEST(test_elem0);
+ CPPUNIT_TEST(test_elem5);
+ CPPUNIT_TEST(test_copy);
+ CPPUNIT_TEST(test_fromC);
+ CPPUNIT_TEST(test_noacquire);
+ CPPUNIT_TEST(test_getArray);
+ CPPUNIT_TEST(test_same0);
+ CPPUNIT_TEST(test_diffLen);
+ CPPUNIT_TEST(test_diffElem);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(Test);
+
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sal/qa/ByteSequence/makefile.mk b/sal/qa/ByteSequence/makefile.mk
new file mode 100644
index 000000000000..9f7bfcfd25ce
--- /dev/null
+++ b/sal/qa/ByteSequence/makefile.mk
@@ -0,0 +1,55 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#***********************************************************************/
+
+.IF "$(OOO_SUBSEQUENT_TESTS)" == ""
+nothing .PHONY:
+.ELSE
+
+PRJ = ../..
+PRJNAME = sal
+TARGET = qa_ByteSequence
+
+ENABLE_EXCEPTIONS = TRUE
+
+.INCLUDE: settings.mk
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+SHL1IMPLIB = i$(SHL1TARGET)
+SHL1OBJS = $(SLO)/ByteSequence.obj
+SHL1RPATH = NONE
+SHL1STDLIBS = $(CPPUNITLIB) $(SALLIB)
+SHL1TARGET = rtl_ByteSequence
+SHL1VERSIONMAP = $(PRJ)/qa/export.map
+DEF1NAME = $(SHL1TARGET)
+
+SLOFILES = $(SHL1OBJS)
+
+.INCLUDE: target.mk
+.INCLUDE: _cppunit.mk
+
+.END
diff --git a/sal/qa/OStringBuffer/makefile.mk b/sal/qa/OStringBuffer/makefile.mk
new file mode 100644
index 000000000000..e0c1a81d66e3
--- /dev/null
+++ b/sal/qa/OStringBuffer/makefile.mk
@@ -0,0 +1,78 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+.IF "$(OOO_SUBSEQUENT_TESTS)" == ""
+nothing .PHONY:
+.ELSE
+
+PRJ=..$/..
+
+PRJNAME=sal
+TARGET=qa_ostringbuffer
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES= \
+# $(SLO)$/OStringBuffer.obj
+
+#----------------------------------- OStringBuffer -----------------------------------
+
+SHL1OBJS= \
+ $(SLO)$/rtl_OStringBuffer.obj \
+ $(SLO)$/rtl_String_Utils.obj
+
+SHL1TARGET= rtl_OStringBuffer
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+SHL1RPATH = NONE
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
+.END
diff --git a/sal/qa/OStringBuffer/rtl_OStringBuffer.cxx b/sal/qa/OStringBuffer/rtl_OStringBuffer.cxx
new file mode 100644
index 000000000000..e6a42793b15d
--- /dev/null
+++ b/sal/qa/OStringBuffer/rtl_OStringBuffer.cxx
@@ -0,0 +1,18422 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+// -----------------------------------------------------------------------------
+#include <rtl/string.hxx>
+#include <rtl_String_Const.h>
+#include <rtl_String_Utils.hxx>
+
+#include <rtl/strbuf.hxx>
+
+#include "cppunit/TestAssert.h"
+#include "cppunit/TestFixture.h"
+#include "cppunit/extensions/HelperMacros.h"
+#include "cppunit/plugin/TestPlugIn.h"
+
+#include <string.h>
+
+using namespace rtl;
+
+//------------------------------------------------------------------------
+// test classes
+//------------------------------------------------------------------------
+// const MAXBUFLENGTH = 255;
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+//------------------------------------------------------------------------
+// testing constructors
+//------------------------------------------------------------------------
+
+// LLA: there exist some #if WITH_CORE #endif envelopes, which contain test code, which will core dump
+// due to the fact, that we can't handle MAXINT32 right.
+
+namespace rtl_OStringBuffer
+{
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+
+ void ctor_001()
+ {
+ ::rtl::OStringBuffer aStrBuf;
+ const sal_Char* pStr = aStrBuf.getStr();
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "New OStringBuffer containing no characters",
+ aStrBuf.getLength() == 0 &&
+ *pStr == '\0' && aStrBuf.getCapacity() == 16
+ );
+ }
+
+ void ctor_002()
+ {
+ ::rtl::OString aStrtmp( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuftmp( aStrtmp );
+ ::rtl::OStringBuffer aStrBuf( aStrBuftmp );
+ // sal_Bool res = cmpstr(aStrBuftmp.getStr(),aStrBuf.getStr());
+
+ sal_Int32 nLenStrBuftmp = aStrBuftmp.getLength();
+
+ rtl::OString sStr(aStrBuftmp.getStr());
+ sal_Bool res = aStrtmp.equals( sStr );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "New OStringBuffer from another OStringBuffer",
+ aStrBuf.getLength() == nLenStrBuftmp &&
+ aStrBuf.getCapacity() == aStrBuftmp.getCapacity() &&
+ res
+ );
+
+ }
+
+ void ctor_003()
+ {
+ ::rtl::OStringBuffer aStrBuf1(kTestStr2Len);
+#ifdef WITH_CORE
+ ::rtl::OStringBuffer aStrBuf2(kSInt32Max); //will core dump
+ // LLA: will core, due to the fact, that ksint32max is too big, the max length can't
+ // use, because there are some internal bytes, which we can't calculate.
+
+#else
+ ::rtl::OStringBuffer aStrBuf2(0);
+#endif
+
+ const sal_Char* pStr1 = aStrBuf1.getStr();
+ const sal_Char* pStr2 = aStrBuf2.getStr();
+
+#ifdef WITH_CORE
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "New OStringBuffer containing no characters and contain assigned capacity",
+ aStrBuf1.getLength() == 0 &&
+ ! *(aStrBuf1.getStr()) && aStrBuf1.getCapacity() == kTestStr2Len &&
+ aStrBuf2.getLength() == 0 &&
+ ! *(aStrBuf2.getStr()) && aStrBuf2.getCapacity() == kSInt32Max
+
+ );
+#else
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "New OStringBuffer containing no characters and contain assigned capacity",
+ aStrBuf1.getLength() == 0 &&
+ *pStr1 == '\0' &&
+ aStrBuf1.getCapacity() == kTestStr2Len &&
+ aStrBuf2.getLength() == 0 &&
+ *pStr2 == '\0' &&
+ aStrBuf2.getCapacity() == 0
+ );
+#endif
+
+ }
+
+ void ctor_003_1()
+ {
+ // LLA: StringBuffer with created negativ size are the same as empty StringBuffers
+ ::rtl::OStringBuffer aStrBuf3(kNonSInt32Max);
+
+ const sal_Char* pStr = aStrBuf3.getStr();
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "New OStringBuffer containing no characters and contain assigned capacity",
+ aStrBuf3.getLength() == 0 &&
+ *pStr == '\0' &&
+ aStrBuf3.getCapacity() == kNonSInt32Max
+ );
+ }
+
+ void ctor_004()
+ {
+ ::rtl::OString aStrtmp( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( aStrtmp );
+ sal_Int32 leg = aStrBuf.getLength();
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "New OStringBuffer from Ostring",
+ aStrBuf.getStr() == aStrtmp &&
+ leg == aStrtmp.pData->length &&
+ aStrBuf.getCapacity() == leg+16
+
+ );
+ }
+
+ void ctor_005() {
+ rtl::OStringBuffer b1;
+ b1.makeStringAndClear();
+ rtl::OStringBuffer b2(b1);
+ }
+
+ CPPUNIT_TEST_SUITE(ctors);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST(ctor_002);
+ CPPUNIT_TEST(ctor_003);
+ CPPUNIT_TEST(ctor_003_1);
+ CPPUNIT_TEST(ctor_004);
+ CPPUNIT_TEST(ctor_005);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+
+
+// -----------------------------------------------------------------------------
+
+ class makeStringAndClear : public CppUnit::TestFixture
+ {
+ OString* arrOUS[6];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr1 );
+ arrOUS[1] = new OString( kTestStr14 );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( kTestStr27 );
+ arrOUS[4] = new OString( kTestStr29 );
+ arrOUS[5] = new OString( "\0" );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4]; delete arrOUS[5];
+ }
+
+ void makeStringAndClear_001()
+ {
+ ::rtl::OStringBuffer aStrBuf1;
+ ::rtl::OString aStr1;
+
+ sal_Bool lastRes = (aStrBuf1.makeStringAndClear() == aStr1 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "two empty strings(def. constructor)",
+ lastRes && ( aStrBuf1.getCapacity() == 0 ) &&
+ ( *(aStrBuf1.getStr()) == '\0' )
+ );
+
+ }
+
+ void makeStringAndClear_002()
+ {
+ ::rtl::OStringBuffer aStrBuf2(26);
+ ::rtl::OString aStr2;
+
+ sal_Bool lastRes = (aStrBuf2.makeStringAndClear() == aStr2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "two empty strings(with a argu)",
+ lastRes && ( aStrBuf2.getCapacity() == 0 ) &&
+ ( *(aStrBuf2.getStr()) == '\0' )
+ );
+
+ }
+
+ void makeStringAndClear_003()
+ {
+ ::rtl::OStringBuffer aStrBuf3(*arrOUS[0]);
+ ::rtl::OString aStr3(*arrOUS[0]);
+
+ sal_Bool lastRes = (aStrBuf3.makeStringAndClear() == aStr3 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "normal string",
+ lastRes && ( aStrBuf3.getCapacity() == 0 ) &&
+ ( *(aStrBuf3.getStr()) == '\0' )
+ );
+
+ }
+
+ void makeStringAndClear_004()
+ {
+ ::rtl::OStringBuffer aStrBuf4(*arrOUS[1]);
+ ::rtl::OString aStr4(*arrOUS[1]);
+
+ sal_Bool lastRes = (aStrBuf4.makeStringAndClear() == aStr4 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "string with space ",
+ lastRes && ( aStrBuf4.getCapacity() == 0 ) &&
+ ( *(aStrBuf4.getStr()) == '\0' )
+ );
+ }
+
+ void makeStringAndClear_005()
+ {
+ ::rtl::OStringBuffer aStrBuf5(*arrOUS[2]);
+ ::rtl::OString aStr5(*arrOUS[2]);
+
+ sal_Bool lastRes = (aStrBuf5.makeStringAndClear() == aStr5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "empty string",
+ lastRes && ( aStrBuf5.getCapacity() == 0 ) &&
+ ( *(aStrBuf5.getStr()) == '\0' )
+ );
+ }
+
+ void makeStringAndClear_006()
+ {
+ ::rtl::OStringBuffer aStrBuf6(*arrOUS[3]);
+ ::rtl::OString aStr6(*arrOUS[3]);
+
+ sal_Bool lastRes = (aStrBuf6.makeStringAndClear() == aStr6 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "string with a character",
+ lastRes && ( aStrBuf6.getCapacity() == 0 ) &&
+ ( *(aStrBuf6.getStr()) == '\0' )
+ );
+ }
+
+ void makeStringAndClear_007()
+ {
+ ::rtl::OStringBuffer aStrBuf7(*arrOUS[4]);
+ ::rtl::OString aStr7(*arrOUS[4]);
+
+ sal_Bool lastRes = (aStrBuf7.makeStringAndClear() == aStr7 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "string with special characters",
+ lastRes && ( aStrBuf7.getCapacity() == 0 ) &&
+ ( *(aStrBuf7.getStr()) == '\0' )
+ );
+ }
+
+ void makeStringAndClear_008()
+ {
+ ::rtl::OStringBuffer aStrBuf8(*arrOUS[5]);
+ ::rtl::OString aStr8(*arrOUS[5]);
+
+ sal_Bool lastRes = (aStrBuf8.makeStringAndClear() == aStr8 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "string only with (\0)",
+ lastRes && ( aStrBuf8.getCapacity() == 0 ) &&
+ ( *(aStrBuf8.getStr()) == '\0' )
+ );
+ }
+
+ CPPUNIT_TEST_SUITE(makeStringAndClear);
+ CPPUNIT_TEST(makeStringAndClear_001);
+ CPPUNIT_TEST(makeStringAndClear_002);
+ CPPUNIT_TEST(makeStringAndClear_003);
+ CPPUNIT_TEST(makeStringAndClear_004);
+ CPPUNIT_TEST(makeStringAndClear_005);
+ CPPUNIT_TEST(makeStringAndClear_006);
+ CPPUNIT_TEST(makeStringAndClear_007);
+ CPPUNIT_TEST(makeStringAndClear_008);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+
+ class getLength : public CppUnit::TestFixture
+ {
+ OString* arrOUS[6];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr1 );
+ arrOUS[1] = new OString( "1" );
+ arrOUS[2] = new OString( );
+ arrOUS[3] = new OString( "" );
+ arrOUS[4] = new OString( "\0" );
+ arrOUS[5] = new OString( kTestStr2 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4]; delete arrOUS[5];
+ }
+
+ void getLength_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 expVal = kTestStr1Len;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "length of ascii string",
+ aStrBuf.getLength() == expVal
+ );
+
+ }
+
+ void getLength_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Int32 expVal = 1;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "length of ascci string of size 1",
+ aStrBuf.getLength() == expVal
+ );
+ }
+
+ void getLength_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 expVal = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "length of empty string",
+ aStrBuf.getLength() == expVal
+ );
+ }
+
+ void getLength_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Int32 expVal = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "length of empty string (empty ascii string arg)",
+ aStrBuf.getLength() == expVal
+ );
+ }
+
+ void getLength_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Int32 expVal = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "length of empty string (string arg = '\\0')",
+ aStrBuf.getLength() == expVal
+ );
+ }
+
+ void getLength_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[5] );
+ sal_Int32 expVal = kTestStr2Len;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "length(>16) of ascii string",
+ aStrBuf.getLength() == expVal
+ );
+ }
+
+ void getLength_007()
+ {
+ ::rtl::OStringBuffer aStrBuf;
+ sal_Int32 expVal = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "length of empty string (default constructor)",
+ aStrBuf.getLength()== expVal
+ );
+ }
+
+ void getLength_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( 26 );
+ sal_Int32 expVal = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "length of empty string (with capacity)",
+ aStrBuf.getLength()== expVal
+ );
+ }
+
+ CPPUNIT_TEST_SUITE( getLength );
+ CPPUNIT_TEST( getLength_001 );
+ CPPUNIT_TEST( getLength_002 );
+ CPPUNIT_TEST( getLength_003 );
+ CPPUNIT_TEST( getLength_004 );
+ CPPUNIT_TEST( getLength_005 );
+ CPPUNIT_TEST( getLength_006 );
+ CPPUNIT_TEST( getLength_007 );
+ CPPUNIT_TEST( getLength_008 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+
+ class getCapacity : public CppUnit::TestFixture
+ {
+ OString* arrOUS[6];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr1 );
+ arrOUS[1] = new OString( "1" );
+ arrOUS[2] = new OString( );
+ arrOUS[3] = new OString( "" );
+ arrOUS[4] = new OString( "\0" );
+ arrOUS[5] = new OString( kTestStr2 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4]; delete arrOUS[5];
+ }
+
+ void getCapacity_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 expVal = kTestStr1Len+16;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of ascii string",
+ aStrBuf.getCapacity()== expVal
+ );
+
+ }
+
+ void getCapacity_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Int32 expVal = 1+16;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of ascci string of size 1",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ void getCapacity_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 expVal = 0+16;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ void getCapacity_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Int32 expVal = 0+16;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (empty ascii string arg)",
+ aStrBuf.getCapacity()== expVal
+ );
+ }
+
+ void getCapacity_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Int32 expVal = 0+16;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (string arg = '\\0')",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ void getCapacity_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[5] );
+ sal_Int32 expVal = kTestStr2Len+16;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity(>16) of ascii string",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ void getCapacity_007()
+ {
+ ::rtl::OStringBuffer aStrBuf;
+ sal_Int32 expVal = 16;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (default constructor)",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+#ifdef WITH_CORE
+ void getCapacity_008()
+ {
+ ::rtl::OStringBuffer aStrBuf ( kSInt32Max );
+ sal_Int32 expVal = kSInt32Max;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (with capacity 2147483647)(code will core dump)",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+#endif
+ void getCapacity_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( kNonSInt32Max );
+ sal_Int32 expVal = kNonSInt32Max;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (with capacity -2147483648)",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ void getCapacity_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( 16 );
+ sal_Int32 expVal = 16;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (with capacity 16)",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ void getCapacity_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( 6 );
+ sal_Int32 expVal = 6;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (with capacity 6)",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ void getCapacity_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( 0 );
+ sal_Int32 expVal = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (with capacity 0)",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ void getCapacity_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( -2 );
+ sal_Int32 expVal = -2;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity of empty string (with capacity -2)",
+ aStrBuf.getCapacity() == expVal
+ );
+ }
+
+ CPPUNIT_TEST_SUITE( getCapacity );
+ CPPUNIT_TEST( getCapacity_001 );
+ CPPUNIT_TEST( getCapacity_002 );
+ CPPUNIT_TEST( getCapacity_003 );
+ CPPUNIT_TEST( getCapacity_004 );
+ CPPUNIT_TEST( getCapacity_005 );
+ CPPUNIT_TEST( getCapacity_006 );
+ CPPUNIT_TEST( getCapacity_007 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( getCapacity_008 );
+#endif
+ CPPUNIT_TEST( getCapacity_009 );
+ CPPUNIT_TEST( getCapacity_010 );
+ CPPUNIT_TEST( getCapacity_011 );
+ CPPUNIT_TEST( getCapacity_012 );
+ CPPUNIT_TEST( getCapacity_013 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+// -----------------------------------------------------------------------------
+
+ class ensureCapacity : public CppUnit::TestFixture
+ {
+ void ensureCapacity_001()
+ {
+ sal_Int32 expVal = 16;
+ ::rtl::OStringBuffer aStrBuf;
+ sal_Int32 input = 5;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 16, minimum is 5",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_002()
+ {
+ sal_Int32 expVal = 16;
+ ::rtl::OStringBuffer aStrBuf;
+ sal_Int32 input = -5;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 16, minimum is -5",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_003()
+ {
+ sal_Int32 expVal = 16;
+ ::rtl::OStringBuffer aStrBuf;
+ sal_Int32 input = 0;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 16, minimum is 0",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_004() //the testcase is based on comments
+ {
+ sal_Int32 expVal = 20;
+ ::rtl::OStringBuffer aStrBuf;
+ sal_Int32 input = 20;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 16, minimum is 20",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_005()
+ {
+ sal_Int32 expVal = 50;
+ ::rtl::OStringBuffer aStrBuf;
+ sal_Int32 input = 50;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 16, minimum is 50",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_006()
+ {
+ sal_Int32 expVal = 20;
+ ::rtl::OStringBuffer aStrBuf( 6 );
+ sal_Int32 input = 20;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 6, minimum is 20",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_007()
+ {
+ sal_Int32 expVal = 6;
+ ::rtl::OStringBuffer aStrBuf( 6 );
+ sal_Int32 input = 2;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 6, minimum is 2",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_008()
+ {
+ sal_Int32 expVal = 6;
+ ::rtl::OStringBuffer aStrBuf( 6 );
+ sal_Int32 input = -6;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 6, minimum is -6",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_009() //the testcase is based on comments
+ {
+ sal_Int32 expVal = 10;
+ ::rtl::OStringBuffer aStrBuf( 6 );
+ sal_Int32 input = 10;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 6, minimum is -6",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_010()
+ {
+ sal_Int32 expVal = 6;
+ ::rtl::OStringBuffer aStrBuf( 0 );
+ sal_Int32 input = 6;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 0, minimum is 6",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_011() //the testcase is based on comments
+ {
+ sal_Int32 expVal = 2; // capacity is x = (str->length + 1) * 2; minimum < x ? x : minimum
+ ::rtl::OStringBuffer aStrBuf( 0 );
+ sal_Int32 input = 1;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 0, minimum is 1",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_012()
+ {
+ sal_Int32 expVal = 0;
+ ::rtl::OStringBuffer aStrBuf( 0 );
+ sal_Int32 input = -1;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 0, minimum is -1",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+#ifdef WITH_CORE
+ void ensureCapacity_013() //will core dump
+ {
+ sal_Int32 expVal = kSInt32Max;
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Int32 input = 65535;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 2147483647, minimum is 65535",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_014() //will core dump
+ {
+ sal_Int32 expVal = kSInt32Max;
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Int32 input = kSInt32Max;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 2147483647, minimum is 2147483647",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_015() //will core dump
+ {
+ sal_Int32 expVal = kSInt32Max;
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Int32 input = -1;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 2147483647, minimum is -1",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_016() //will core dump
+ {
+ sal_Int32 expVal = kSInt32Max;
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Int32 input = 0;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 2147483647, minimum is 0",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_017() //will core dump
+ {
+ sal_Int32 expVal = kSInt32Max;
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Int32 input = kNonSInt32Max;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to 2147483647, minimum is -2147483648",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+#endif
+ void ensureCapacity_018()
+ {
+ sal_Int32 expVal = 65535;
+ ::rtl::OStringBuffer aStrBuf( kNonSInt32Max );
+ sal_Int32 input = 65535;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to -2147483648, minimum is 65535",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+#ifdef WITH_CORE
+ void ensureCapacity_019() //will core dump
+ {
+ sal_Int32 expVal = 2147483647;
+ ::rtl::OStringBuffer aStrBuf( kNonSInt32Max );
+ sal_Int32 input = 2147483647;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to -2147483648, minimum is 2147483647",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+#endif
+ void ensureCapacity_020()
+ {
+ sal_Int32 expVal = 2;
+ ::rtl::OStringBuffer aStrBuf( kNonSInt32Max );
+ sal_Int32 input = -1;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to -2147483648, minimum is -1",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_021()
+ {
+ sal_Int32 expVal = 2;
+ ::rtl::OStringBuffer aStrBuf( kNonSInt32Max );
+ sal_Int32 input = 0;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to -2147483648, minimum is 0",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ void ensureCapacity_022()
+ {
+ sal_Int32 expVal = kNonSInt32Max;
+ ::rtl::OStringBuffer aStrBuf( kNonSInt32Max );
+ sal_Int32 input = kNonSInt32Max;
+
+ aStrBuf.ensureCapacity( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "capacity equal to -2147483648, minimum is -2147483648",
+ aStrBuf.getCapacity() == expVal
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE( ensureCapacity );
+ CPPUNIT_TEST( ensureCapacity_001 );
+ CPPUNIT_TEST( ensureCapacity_002 );
+ CPPUNIT_TEST( ensureCapacity_003 );
+ CPPUNIT_TEST( ensureCapacity_004 );
+ CPPUNIT_TEST( ensureCapacity_005 );
+ CPPUNIT_TEST( ensureCapacity_006 );
+ CPPUNIT_TEST( ensureCapacity_007 );
+ CPPUNIT_TEST( ensureCapacity_008 );
+ CPPUNIT_TEST( ensureCapacity_009 );
+ CPPUNIT_TEST( ensureCapacity_010 );
+ CPPUNIT_TEST( ensureCapacity_011 );
+ CPPUNIT_TEST( ensureCapacity_012 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( ensureCapacity_013 );
+ CPPUNIT_TEST( ensureCapacity_014 );
+ CPPUNIT_TEST( ensureCapacity_015 );
+ CPPUNIT_TEST( ensureCapacity_016 );
+ CPPUNIT_TEST( ensureCapacity_017 );
+#endif
+ CPPUNIT_TEST( ensureCapacity_018 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( ensureCapacity_019 );
+#endif
+ CPPUNIT_TEST( ensureCapacity_020 );
+ CPPUNIT_TEST( ensureCapacity_021 );
+ CPPUNIT_TEST( ensureCapacity_022 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+
+ class setLength : public CppUnit::TestFixture
+ {
+ OString* arrOUS[6];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr1 );
+ arrOUS[1] = new OString( "1" );
+ arrOUS[2] = new OString( );
+ arrOUS[3] = new OString( "" );
+ arrOUS[4] = new OString( "\0" );
+ arrOUS[5] = new OString( kTestStr2 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4]; delete arrOUS[5];
+ }
+
+ void setLength_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 expVal1 = 50;
+ ::rtl::OString expVal2( kTestStr1 );
+ sal_Int32 expVal3 = 50;
+ sal_Int32 input = 50;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the capacity of OStringBuffer(kTestStr1)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 expVal1 = kTestStr13Len;
+ ::rtl::OString expVal2( kTestStr1 );
+ sal_Int32 expVal3 = 32;
+ sal_Int32 input = kTestStr13Len;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the length of OStringBuffer(kTestStr1)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 expVal1 = kTestStr1Len;
+ ::rtl::OString expVal2( kTestStr1 );
+ sal_Int32 expVal3 = 32;
+ sal_Int32 input = kTestStr1Len;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength equal to the length of OStringBuffer(kTestStr1)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 expVal1 = kTestStr7Len;
+ ::rtl::OString expVal2( kTestStr7 );
+ sal_Int32 expVal3 = 32;
+ sal_Int32 input = kTestStr7Len;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength less than the length of OStringBuffer(kTestStr1)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 expVal1 = 0;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 32;
+ sal_Int32 input = 0;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength equal to 0",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Int32 expVal1 = 25;
+ ::rtl::OString expVal2( *arrOUS[1] );
+ sal_Int32 expVal3 = 25;
+ sal_Int32 input = 25;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the capacity of OStringBuffer(1)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Int32 expVal1 = kTestStr27Len;
+ ::rtl::OString expVal2( *arrOUS[1] );
+ sal_Int32 expVal3 = 17;
+ sal_Int32 input = kTestStr27Len;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength equal to the length of OStringBuffer(1)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Int32 expVal1 = 0;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 17;
+ sal_Int32 input = 0;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength less than the length of OUStringBuffer(1)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 expVal1 = 20;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 20;
+ sal_Int32 input = 20;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the capacity of OStringBuffer()",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 expVal1 = 3;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 16;
+ sal_Int32 input = 3;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the length of OStringBuffer()",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 expVal1 = 0;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 16;
+ sal_Int32 input = 0;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the length of OStringBuffer()",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Int32 expVal1 = 20;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 20;
+ sal_Int32 input = 20;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the capacity of OStringBuffer("")",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Int32 expVal1 = 5;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 16;
+ sal_Int32 input = 5;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the length of OStringBuffer("")",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Int32 expVal1 = 0;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 16;
+ sal_Int32 input = 0;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength less than the length of OStringBuffer("")",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Int32 expVal1 = 20;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 20;
+ sal_Int32 input = 20;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the length of OStringBuffer(\0)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Int32 expVal1 = 5;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 16;
+ sal_Int32 input = 5;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the length of OStringBuffer(\0)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Int32 expVal1 = 0;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 16;
+ sal_Int32 input = 0;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength less than the length of OStringBuffer(\0)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[5] );
+ sal_Int32 expVal1 = 50;
+ ::rtl::OString expVal2( kTestStr2 );
+ sal_Int32 expVal3 = 66;
+ sal_Int32 input = 50;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the capacity of OStringBuffer(kTestStr2)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[5] );
+ sal_Int32 expVal1 = 40;
+ ::rtl::OString expVal2(kTestStr2);
+ sal_Int32 expVal3 = 48;
+ sal_Int32 input = 40;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength more than the length of OStringBuffer(kTestStr2)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[5] );
+ sal_Int32 expVal1 = kTestStr2Len;
+ ::rtl::OString expVal2(kTestStr2);
+ sal_Int32 expVal3 = 48;
+ sal_Int32 input = kTestStr2Len;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength equal to the length of OUStringBuffer(kTestStr2)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[5] );
+ sal_Int32 expVal1 = kTestStr7Len;
+ ::rtl::OString expVal2(kTestStr7);
+ sal_Int32 expVal3 = 48;
+ sal_Int32 input = kTestStr7Len;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength less than the length of OUStringBuffer(TestStr2)",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+ void setLength_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[5] );
+ sal_Int32 expVal1 = 0;
+ ::rtl::OString expVal2;
+ sal_Int32 expVal3 = 48;
+ sal_Int32 input = 0;
+
+ aStrBuf.setLength( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "newLength equal to 0",
+ aStrBuf.getStr() == expVal2 &&
+ aStrBuf.getLength() == expVal1 &&
+ aStrBuf.getCapacity() == expVal3
+ );
+
+ }
+
+
+
+ CPPUNIT_TEST_SUITE( setLength );
+ CPPUNIT_TEST( setLength_001 );
+ CPPUNIT_TEST( setLength_002 );
+ CPPUNIT_TEST( setLength_003 );
+ CPPUNIT_TEST( setLength_004 );
+ CPPUNIT_TEST( setLength_005 );
+ CPPUNIT_TEST( setLength_006 );
+ CPPUNIT_TEST( setLength_007 );
+ CPPUNIT_TEST( setLength_008 );
+ CPPUNIT_TEST( setLength_009 );
+ CPPUNIT_TEST( setLength_010 );
+ CPPUNIT_TEST( setLength_011 );
+ CPPUNIT_TEST( setLength_012 );
+ CPPUNIT_TEST( setLength_013 );
+ CPPUNIT_TEST( setLength_014 );
+ CPPUNIT_TEST( setLength_015 );
+ CPPUNIT_TEST( setLength_016 );
+ CPPUNIT_TEST( setLength_017 );
+ CPPUNIT_TEST( setLength_018 );
+ CPPUNIT_TEST( setLength_019 );
+ CPPUNIT_TEST( setLength_020 );
+ CPPUNIT_TEST( setLength_021 );
+ CPPUNIT_TEST( setLength_022 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+
+ class charAt : public CppUnit::TestFixture
+ {
+ OString* arrOUS[4];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr1 );
+ arrOUS[1] = new OString( kTestStr27 );
+ arrOUS[2] = new OString( kTestStr28 );
+ arrOUS[3] = new OString( );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3];
+ }
+
+ void charAt_001()
+ {
+ sal_Unicode expVal = 83;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 input = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "return the first character of OStringBuffer(kTestStr1)",
+ aStrBuf.charAt(input) == expVal
+ );
+
+ }
+
+ void charAt_002()
+ {
+ sal_Unicode expVal = 32;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 input = 3;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "return the middle character of OStringBuffer(kTestStr1)",
+ aStrBuf.charAt(input) == expVal
+ );
+
+ }
+
+ void charAt_003()
+ {
+ sal_Unicode expVal = 115;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 input = 15;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "return the last character of OStringBuffer(kTestStr1)",
+ aStrBuf.charAt(input) == expVal
+ );
+
+ }
+
+ void charAt_004()
+ {
+ sal_Unicode expVal = 115;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Int32 input = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "return the only character of OStringBuffer(kTestStr27)",
+ aStrBuf.charAt(input) == expVal
+ );
+
+ }
+
+ void charAt_005()
+ {
+ sal_Unicode expVal = 40;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 input = 0;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "return the first of OStringBuffer(kTestStr28) with special character",
+ aStrBuf.charAt(input) == expVal
+ );
+
+ }
+
+ void charAt_006()
+ {
+ sal_Unicode expVal = 11;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 input = 5;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "return the mid of OStringBuffer(kTestStr28) with special character",
+ aStrBuf.charAt(input) == expVal
+ );
+
+ }
+
+ void charAt_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "invalid character of OStringBuffer()",
+ sal_True
+ );
+
+ }
+
+ void charAt_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "invalid character of OStringBuffer()",
+ sal_True
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE( charAt );
+ CPPUNIT_TEST( charAt_001 );
+ CPPUNIT_TEST( charAt_002 );
+ CPPUNIT_TEST( charAt_003 );
+ CPPUNIT_TEST( charAt_004 );
+ CPPUNIT_TEST( charAt_005 );
+ CPPUNIT_TEST( charAt_006 );
+ CPPUNIT_TEST( charAt_007 );
+ CPPUNIT_TEST( charAt_008 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+// -----------------------------------------------------------------------------
+
+
+ class csuc : public CppUnit::TestFixture
+ {
+ void csuc_001()
+ {
+ const sal_Char* expVal = kTestStr1;
+ ::rtl::OStringBuffer aStrBuf( kTestStr1 );
+ sal_Int32 cmpLen = kTestStr1Len;
+
+ // LLA: wrong access! const sal_Char* pstr = *&aStrBuf;
+ const sal_Char* pstr = aStrBuf.getStr();
+ int nEqual = strncmp(pstr, expVal, cmpLen);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "test normal string",
+ /* cmpstr( pstr, expVal, cmpLen ) */
+ nEqual == 0
+ );
+
+ }
+
+ void csuc_002()
+ {
+ ::rtl::OStringBuffer aStrBuf;
+
+ // LLA: wrong access! const sal_Char* pstr = *&aStrBuf;
+ const sal_Char* pstr = aStrBuf.getStr();
+ sal_Int32 nLen = strlen(pstr);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "test empty string",
+ // cmpstr( pstr, &expVal, cmpLen )
+ nLen == 0
+ );
+
+ }
+
+
+ CPPUNIT_TEST_SUITE( csuc );
+ CPPUNIT_TEST( csuc_001 );
+ CPPUNIT_TEST( csuc_002 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+
+// -----------------------------------------------------------------------------
+
+ class getStr : public CppUnit::TestFixture
+ {
+ void getStr_001()
+ {
+ const sal_Char* expVal = kTestStr1;
+ ::rtl::OStringBuffer aStrBuf( kTestStr1 );
+ sal_Int32 cmpLen = kTestStr1Len;
+
+ const sal_Char* pstr = aStrBuf.getStr();
+ int nEqual = strncmp(pstr, expVal, cmpLen);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "test normal string",
+ nEqual == 0
+ );
+
+ }
+
+ void getStr_002()
+ {
+ // const sal_Char tmpUC=0x0;
+ // const sal_Char* expVal=&tmpUC;
+ ::rtl::OStringBuffer aStrBuf;
+ // sal_Int32 cmpLen = 1;
+
+ const sal_Char* pstr = aStrBuf.getStr();
+ sal_Int32 nLen = strlen(pstr);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "test empty string",
+ pstr != 0 &&
+ nLen == 0
+ );
+
+ }
+
+
+ CPPUNIT_TEST_SUITE( getStr );
+ CPPUNIT_TEST( getStr_001 );
+ CPPUNIT_TEST( getStr_002 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+
+ class setCharAt : public CppUnit::TestFixture
+ {
+ OString* arrOUS[4];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr1 );
+ arrOUS[1] = new OString( kTestStr27 );
+ arrOUS[2] = new OString( kTestStr28 );
+ arrOUS[3] = new OString( );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3];
+ }
+
+ void setCharAt_001()
+ {
+ OString expVal( kTestStr31 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 input1 = 0;
+ sal_Char input2 = 's';
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "set the first character of OStringBuffer(kTestStr1) with s",
+ (aStrBuf.setCharAt(input1, input2)).getStr() == expVal
+ );
+
+ }
+
+ void setCharAt_002()
+ {
+ OString expVal( kTestStr3 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 input1 = 4;
+ sal_Char input2 = 'm';
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "set the middle character of OStringBuffer(kTestStr1) with m",
+ (aStrBuf.setCharAt(input1, input2)).getStr() == expVal
+ );
+
+ }
+
+ void setCharAt_003()
+ {
+ OString expVal( kTestStr32 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Int32 input1 = 15;
+ sal_Char input2 = ' ';
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "set the last character of OStringBuffer(kTestStr1) with ' '",
+ (aStrBuf.setCharAt(input1, input2)).getStr() == expVal
+ );
+
+ }
+
+
+ void setCharAt_004()
+ {
+ OString expVal( kTestStr33 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Int32 input1 = 0;
+ sal_Char input2 = ' ';
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "set the only character of OStringBuffer(kTestStr27) with ' '",
+ (aStrBuf.setCharAt(input1, input2)).getStr() == expVal
+ );
+
+ }
+
+
+ void setCharAt_005()
+ {
+ OString expVal( kTestStr34 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 input1 = 1;
+ sal_Char input2 = (sal_Char)5;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "set the only of OStringBuffer(kTestStr28) with special character",
+ (aStrBuf.setCharAt(input1, input2)).getStr() == expVal
+ );
+
+ }
+
+ void setCharAt_006()
+ {
+ OString expVal( kTestStr35 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Int32 input1 = 1;
+ sal_Char input2 = (sal_Char)-5;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "set the only of OStringBuffer(kTestStr28) with special character",
+ (aStrBuf.setCharAt(input1, input2)).getStr() == expVal
+ );
+
+ }
+#ifdef WITH_CORE
+ void setCharAt_007()
+ {
+ OString* expVal = 0;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Int32 input1 = 0;
+ sal_Char input2 = (sal_Char)5;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "invalid character of OStringBuffer()",
+ sal_True
+ );
+
+ delete expVal;
+
+ }
+
+ void setCharAt_008()
+ {
+ OString* expVal = 0;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Int32 input1 = -2;
+ sal_Char input2 = (sal_Char)5;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "invalid character of OStringBuffer()",
+ sal_True
+ );
+
+ delete expVal;
+
+ }
+
+ void setCharAt_009()
+ {
+ OString* expVal = 0;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Int32 input1 = 3;
+ sal_Char input2 = (sal_Char)5;
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "invalid character of OStringBuffer()",
+ sal_True
+ );
+
+ delete expVal;
+
+ }
+#endif
+ CPPUNIT_TEST_SUITE( setCharAt );
+ CPPUNIT_TEST( setCharAt_001 );
+ CPPUNIT_TEST( setCharAt_002 );
+ CPPUNIT_TEST( setCharAt_003 );
+ CPPUNIT_TEST( setCharAt_004 );
+ CPPUNIT_TEST( setCharAt_005 );
+ CPPUNIT_TEST( setCharAt_006 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( setCharAt_007 );
+ CPPUNIT_TEST( setCharAt_008 );
+ CPPUNIT_TEST( setCharAt_009 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+
+ class append_001 : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001_001()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString input2( kTestStr8 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_001_002()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString input2( kTestStr36 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_003()
+ {
+ OString expVal( kTestStr37 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString input2( kTestStr23 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_004()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString input2;
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_005()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString input2( kTestStr7 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_006()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString input2( kTestStr2 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_007()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString input2( kTestStr1 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_008()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString input2;
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_009()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString input2( kTestStr7 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_010()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString input2( kTestStr2 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_011()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString input2( kTestStr1 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_012()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString input2;
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_013()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString input2( kTestStr7 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_014()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString input2( kTestStr2 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_015()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString input2( kTestStr1 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_016()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString input2;
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_017()
+ {
+ OString expVal( kTestStr29 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString input2( kTestStr38 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_018()
+ {
+ OString expVal( kTestStr39 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString input2( kTestStr17 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_019()
+ {
+ OString expVal( kTestStr40 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString input2( kTestStr31 );
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_001_020()
+ {
+ OString expVal( kTestStr28 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString input2;
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+#ifdef WITH_CORE
+ void append_001_021()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString input2;
+
+ aStrBuf.append( input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_001 );
+ CPPUNIT_TEST( append_001_001 );
+ CPPUNIT_TEST( append_001_002 );
+ CPPUNIT_TEST( append_001_003 );
+ CPPUNIT_TEST( append_001_004 );
+ CPPUNIT_TEST( append_001_005 );
+ CPPUNIT_TEST( append_001_006 );
+ CPPUNIT_TEST( append_001_007 );
+ CPPUNIT_TEST( append_001_008 );
+ CPPUNIT_TEST( append_001_009 );
+ CPPUNIT_TEST( append_001_010 );
+ CPPUNIT_TEST( append_001_011 );
+ CPPUNIT_TEST( append_001_012 );
+ CPPUNIT_TEST( append_001_013 );
+ CPPUNIT_TEST( append_001_014 );
+ CPPUNIT_TEST( append_001_015 );
+ CPPUNIT_TEST( append_001_016 );
+ CPPUNIT_TEST( append_001_017 );
+ CPPUNIT_TEST( append_001_018 );
+ CPPUNIT_TEST( append_001_019 );
+ CPPUNIT_TEST( append_001_020 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_001_021 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+
+ class append_002 : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_002_001()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ const sal_Char* input = kTestStr8;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_002()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ const sal_Char* input = kTestStr36;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_003()
+ {
+ OString expVal( kTestStr37 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ const sal_Char* input = kTestStr23;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_004()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ const sal_Char* input = kTestStr25;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_005()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ const sal_Char* input = kTestStr7;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_006()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ const sal_Char* input = kTestStr2;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_007()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ const sal_Char* input = kTestStr1;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_008()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ const sal_Char* input = kTestStr25;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_009()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ const sal_Char* input = kTestStr7;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_010()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ const sal_Char* input = kTestStr2;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_011()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ const sal_Char* input = kTestStr1;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_012()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ const sal_Char* input = kTestStr25;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_013()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ const sal_Char* input = kTestStr7;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_014()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ const sal_Char* input = kTestStr2;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_015()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ const sal_Char* input = kTestStr1;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_016()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ const sal_Char* input = kTestStr25;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_017()
+ {
+ OString expVal( kTestStr29 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ const sal_Char* input = kTestStr38;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_018()
+ {
+ OString expVal( kTestStr39 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ const sal_Char* input = kTestStr17;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_019()
+ {
+ OString expVal( kTestStr40 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ const sal_Char* input = kTestStr31;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002_020()
+ {
+ OString expVal( kTestStr28 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ const sal_Char* input = kTestStr25;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+#ifdef WITH_CORE
+ void append_002_021()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ const sal_Char* input = kTestStr25;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer(with INT_MAX)",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_002 );
+ CPPUNIT_TEST( append_002_001 );
+ CPPUNIT_TEST( append_002_002 );
+ CPPUNIT_TEST( append_002_003 );
+ CPPUNIT_TEST( append_002_004 );
+ CPPUNIT_TEST( append_002_005 );
+ CPPUNIT_TEST( append_002_006 );
+ CPPUNIT_TEST( append_002_007 );
+ CPPUNIT_TEST( append_002_008 );
+ CPPUNIT_TEST( append_002_009 );
+ CPPUNIT_TEST( append_002_010 );
+ CPPUNIT_TEST( append_002_011 );
+ CPPUNIT_TEST( append_002_012 );
+ CPPUNIT_TEST( append_002_013 );
+ CPPUNIT_TEST( append_002_014 );
+ CPPUNIT_TEST( append_002_015 );
+ CPPUNIT_TEST( append_002_016 );
+ CPPUNIT_TEST( append_002_017 );
+ CPPUNIT_TEST( append_002_018 );
+ CPPUNIT_TEST( append_002_019 );
+ CPPUNIT_TEST( append_002_020 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_002_021 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+// -----------------------------------------------------------------------------
+
+ class append_003 : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_003_001()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ const sal_Char* input1 = kTestStr36;
+ sal_Int32 input2 = 12;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_002()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ const sal_Char* input1 = kTestStr36;
+ sal_Int32 input2 = 28;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_003()
+ {
+ OString expVal( kTestStr37 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ const sal_Char* input1 = kTestStr23;
+ sal_Int32 input2 = 16;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_004()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 0;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_005()
+ {
+ // LLA: this is an illegal test, the input2 value must non-negative
+ // LLA: OString expVal( kTestStr41 );
+ // LLA: ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: const sal_Char* input1 = kTestStr2;
+ // LLA: sal_Int32 input2 = -1;
+ // LLA:
+ // LLA: aStrBuf.append( input1, input2 );
+ // LLA:
+ // LLA: CPPUNIT_ASSERT_MESSAGE
+ // LLA: (
+ // LLA: "Appends the string(length less than 0) to the string buffer arrOUS[0]",
+ // LLA: ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ // LLA: );
+
+ }
+
+ void append_003_006()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 4;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_007()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 32;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_008()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 16;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_009()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 0;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_010()
+ {
+ // LLA: this is an illegal test, the input2 value must non-negative
+ // LLA: OString expVal;
+ // LLA: ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: const sal_Char* input1 = kTestStr2;
+ // LLA: sal_Int32 input2 = -1;
+ // LLA:
+ // LLA: aStrBuf.append( input1, input2 );
+ // LLA:
+ // LLA: CPPUNIT_ASSERT_MESSAGE
+ // LLA: (
+ // LLA: "Appends the string(length less than 0) to the string buffer arrOUS[1]",
+ // LLA: ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ // LLA: );
+ }
+
+ void append_003_011()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 4;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_012()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 32;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_013()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 16;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_014()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 0;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_015()
+ {
+ // LLA: this is an illegal test, the input2 value must non-negative
+ // LLA: OString expVal;
+ // LLA: ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: const sal_Char* input1 = kTestStr2;
+ // LLA: sal_Int32 input2 = -1;
+ // LLA:
+ // LLA: aStrBuf.append( input1, input2 );
+ // LLA:
+ // LLA: CPPUNIT_ASSERT_MESSAGE
+ // LLA: (
+ // LLA: "Appends the string(length less than 0) to the string buffer arrOUS[2]",
+ // LLA: ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ // LLA: );
+
+ }
+
+ void append_003_016()
+ {
+ OString expVal( kTestStr7 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 4;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_017()
+ {
+ OString expVal( kTestStr2 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 32;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_018()
+ {
+ OString expVal( kTestStr1 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 16;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_019()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 0;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_020()
+ {
+ // LLA: this is an illegal test, the input2 value must non-negative
+ // LLA: OString expVal;
+ // LLA: ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: const sal_Char* input1 = kTestStr2;
+ // LLA: sal_Int32 input2 = -1;
+ // LLA:
+ // LLA: aStrBuf.append( input1, input2 );
+ // LLA:
+ // LLA: CPPUNIT_ASSERT_MESSAGE
+ // LLA: (
+ // LLA: "Appends the string(length less than 0) to the string buffer arrOUS[3]",
+ // LLA: ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ // LLA: );
+
+ }
+
+ void append_003_021()
+ {
+ OString expVal( kTestStr29 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ const sal_Char* input1 = kTestStr38;
+ sal_Int32 input2 = 7;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length less than 16) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_022()
+ {
+ OString expVal( kTestStr39 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ const sal_Char* input1 = kTestStr17;
+ sal_Int32 input2 = 22;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length more than 16) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_023()
+ {
+ OString expVal( kTestStr40 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ const sal_Char* input1 = kTestStr31;
+ sal_Int32 input2 = 16;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 16) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_024()
+ {
+ OString expVal( kTestStr28 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ const sal_Char* input1 = kTestStr2;
+ sal_Int32 input2 = 0;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003_025()
+ {
+ // LLA: this is an illegal test, the input2 value must non-negative
+ // LLA: OString expVal( kTestStr42 );
+ // LLA: ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: const sal_Char* input1 = kTestStr2;
+ // LLA: sal_Int32 input2 = -1;
+ // LLA:
+ // LLA: aStrBuf.append( input1, input2 );
+ // LLA:
+ // LLA: CPPUNIT_ASSERT_MESSAGE
+ // LLA: (
+ // LLA: "Appends the string(length less than 0) to the string buffer arrOUS[4]",
+ // LLA: ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ // LLA: );
+
+ }
+
+#ifdef WITH_CORE
+ void append_003_026()
+ {
+ OString expVal;
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ const sal_Char* input1 = kTestStr25;
+ sal_Int32 input2 = 0;
+
+ aStrBuf.append( input1, input2 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the string(length equal to 0) to the string buffer(with INT_MAX)",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_003 );
+ CPPUNIT_TEST( append_003_001 );
+ CPPUNIT_TEST( append_003_002 );
+ CPPUNIT_TEST( append_003_003 );
+ CPPUNIT_TEST( append_003_004 );
+ CPPUNIT_TEST( append_003_005 );
+ CPPUNIT_TEST( append_003_006 );
+ CPPUNIT_TEST( append_003_007 );
+ CPPUNIT_TEST( append_003_008 );
+ CPPUNIT_TEST( append_003_009 );
+ CPPUNIT_TEST( append_003_010 );
+ CPPUNIT_TEST( append_003_011 );
+ CPPUNIT_TEST( append_003_012 );
+ CPPUNIT_TEST( append_003_013 );
+ CPPUNIT_TEST( append_003_014 );
+ CPPUNIT_TEST( append_003_015 );
+ CPPUNIT_TEST( append_003_016 );
+ CPPUNIT_TEST( append_003_017 );
+ CPPUNIT_TEST( append_003_018 );
+ CPPUNIT_TEST( append_003_019 );
+ CPPUNIT_TEST( append_003_020 );
+ CPPUNIT_TEST( append_003_021 );
+ CPPUNIT_TEST( append_003_022 );
+ CPPUNIT_TEST( append_003_023 );
+ CPPUNIT_TEST( append_003_024 );
+ CPPUNIT_TEST( append_003_025 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_003_026 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+// -----------------------------------------------------------------------------
+
+ class append_004 : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_004_001()
+ {
+ OString expVal( kTestStr45 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Bool input = sal_True;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_True) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_002()
+ {
+ OString expVal( kTestStr46 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Bool input = sal_False;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_False) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_003()
+ {
+ OString expVal( kTestStr47 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Bool input = sal_True;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_True) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_004()
+ {
+ OString expVal( kTestStr48 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Bool input = sal_False;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_False) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_005()
+ {
+ OString expVal( kTestStr47 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Bool input = sal_True;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_True) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_006()
+ {
+ OString expVal( kTestStr48 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Bool input = sal_False;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_False) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_007()
+ {
+ OString expVal( kTestStr47 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Bool input = sal_True;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_True) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_008()
+ {
+ OString expVal( kTestStr48 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Bool input = sal_False;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_False) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_009()
+ {
+ OString expVal( kTestStr49 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Bool input = sal_True;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_True) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_010()
+ {
+ OString expVal( kTestStr50 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Bool input = sal_False;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_False) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+#ifdef WITH_CORE
+ void append_004_011()
+ {
+ OString expVal( kTestStr47 );
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Bool input = sal_True;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_True) to the string buffer(with INT_MAX)",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004_012()
+ {
+ OString expVal( kTestStr48 );
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Bool input = sal_False;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Bool(sal_False) to the string buffer(with INT_MAX)",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_004 );
+ CPPUNIT_TEST( append_004_001 );
+ CPPUNIT_TEST( append_004_002 );
+ CPPUNIT_TEST( append_004_003 );
+ CPPUNIT_TEST( append_004_004 );
+ CPPUNIT_TEST( append_004_005 );
+ CPPUNIT_TEST( append_004_006 );
+ CPPUNIT_TEST( append_004_007 );
+ CPPUNIT_TEST( append_004_008 );
+ CPPUNIT_TEST( append_004_009 );
+ CPPUNIT_TEST( append_004_010 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_004_011 );
+ CPPUNIT_TEST( append_004_012 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append(sal_Char c)
+//------------------------------------------------------------------------
+ class append_005 : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ OString expVal( kTestStr51 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Char input = 'M';
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(M) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_002()
+ {
+ OString expVal( kTestStr143 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ sal_Char input = static_cast<sal_Char>(SAL_MAX_UINT8);
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Unicode(kSInt8Max) to the string buffer arrOUS[0]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_003()
+ {
+ OString expVal( kTestStr27 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Char input = 's';
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(s) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_004()
+ {
+ OString expVal( kTestStr144 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ sal_Char input = static_cast<sal_Char>(SAL_MAX_UINT8);
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(kSInt8Max) to the string buffer arrOUS[1]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_005_005()
+ {
+ OString expVal( kTestStr27 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Char input = 's';
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(s) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_006()
+ {
+ OString expVal( kTestStr144 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ sal_Char input = static_cast<sal_Char>(SAL_MAX_UINT8);
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(kSInt8Max) to the string buffer arrOUS[2]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_007()
+ {
+ OString expVal( kTestStr27 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Char input = 's';
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(s) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_008()
+ {
+ OString expVal( kTestStr144 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ sal_Char input = static_cast<sal_Char>(SAL_MAX_UINT8);
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(kSInt8Max) to the string buffer arrOUS[3]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_009()
+ {
+ OString expVal( kTestStr56 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Char input = 's';
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(s) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_010()
+ {
+ OString expVal( kTestStr145 );
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ sal_Char input = static_cast<sal_Char>(SAL_MAX_UINT8);
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(kSInt8Max) to the string buffer arrOUS[4]",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+#ifdef WITH_CORE
+ void append_011()
+ {
+ OString expVal( kTestStr27 );
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Char input = 's';
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(s) to the string buffer(with INT_MAX)",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+
+ void append_012()
+ {
+ OString expVal( kTestStr144 );
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ sal_Char input = static_cast<sal_Char>(SAL_MAX_UINT8);
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the sal_Char(kSInt8Max) to the string buffer with INT_MAX)",
+ ( aStrBuf.getStr()== expVal) &&( aStrBuf.getLength() == expVal.getLength() )
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_005 );
+ CPPUNIT_TEST( append_001 );
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005_005 );
+ CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 );
+ CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 );
+ CPPUNIT_TEST( append_010 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_011 );
+ CPPUNIT_TEST( append_012 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+/**
+ * Calls the method append(T, radix) and compares
+ * returned OUString with OUString that passed in the array resArray.
+ *
+ * @param T, type of argument, passed to append
+ * @param resArray, array of result ustrings to compare to
+ * @param n the number of elements in the array resArray (testcases)
+ * @param pTestResult the instance of the class TestResult
+ * @param inArray [optional], array of value that is passed as first argument
+ * to append
+ *
+ * @return true, if all returned OUString are equal to corresponding OUString in
+ * resArray else, false.
+ */
+/*template <class T>
+sal_Bool test_append( const char** resArray, int n, sal_Int16 radix,
+ const T *inArray, OStringBuffer &aStr1 )
+{
+ sal_Bool bRes = sal_True;
+
+ //sal_Char methName[MAXBUFLENGTH];
+ //sal_Char* pMeth = methName;
+ sal_Int32 i;
+// static sal_Unicode aUchar[80]={0x12};
+
+ for (i = 0; i < n; i++)
+ {
+
+ OSL_ENSURE( i < 80, "ERROR: leave aUchar bound");
+
+// AStringToUStringCopy(aUchar,resArray[i]);
+
+ ::rtl::OString aStr2(aStr1.getStr());
+ ::rtl::OString aStr3( "-" );
+
+ if (inArray == 0)
+ {
+ aStr2 += OString(resArray[i]);
+ aStr1.append((T)i, radix);
+ }
+ else
+ {
+ // sal_Unicode aStr4[100];
+ if ( inArray[i] < 0 )
+ {
+ aStr2 += aStr3;
+
+ }
+// if(AStringToUStringCopy(aStr4,resArray[i]))
+// {
+ aStr2 += OString(resArray[i]);
+// }
+ aStr1.append((T)inArray[i], radix);
+ }
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStr1.getStr()== aStr2 &&
+ aStr1.getLength() == aStr2.getLength()
+ );
+ }
+
+ return (bRes);
+}
+#define test_append_Int32 test_append<sal_Int32>
+#define test_append_Int64 test_append<sal_Int64>
+#define test_append_float test_append<float>
+#define test_append_double test_append<double>*/
+//------------------------------------------------------------------------
+// testing the method append( sal_Int32 i, sal_Int16 radix=2 )
+// testing the method append( sal_Int32 i, sal_Int16 radix=8 )
+// testing the method append( sal_Int32 i, sal_Int16 radix=10 )
+// testing the method append( sal_Int32 i, sal_Int16 radix=16 )
+// testing the method append( sal_Int32 i, sal_Int16 radix=36 )
+//------------------------------------------------------------------------
+ class append_006_Int32 : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ /*test_append_Int32((const char**)kBinaryNumsStr,
+ kBinaryNumsCount, kRadixBinary,
+ 0, aStrBuf );*/
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_043()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_044()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_045()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_046()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_047()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_048()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_049()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_050()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_051()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_052()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_053()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_054()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_055()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_056()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_057()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_058()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_059()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_060()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_061()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_062()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_063()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_064()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_065()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_066()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_067()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_068()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_069()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_070()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_071()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_072()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_073()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_074()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_075()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_076()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_077()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_078()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_079()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_080()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_081()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_082()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_083()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_084()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_085()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_086()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_087()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_088()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_089()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_090()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_091()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_092()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_093()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_094()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_095()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_096()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_097()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_098()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_099()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_100()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE( append_006_Int32 );
+ CPPUNIT_TEST( append_001 ); CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 ); CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 ); CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 ); CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 ); CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 ); CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 ); CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 ); CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 ); CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 ); CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 ); CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 ); CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 ); CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 ); CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 ); CPPUNIT_TEST( append_030 );
+ CPPUNIT_TEST( append_031 ); CPPUNIT_TEST( append_032 );
+ CPPUNIT_TEST( append_033 ); CPPUNIT_TEST( append_034 );
+ CPPUNIT_TEST( append_035 ); CPPUNIT_TEST( append_036 );
+ CPPUNIT_TEST( append_037 ); CPPUNIT_TEST( append_038 );
+ CPPUNIT_TEST( append_039 ); CPPUNIT_TEST( append_040 );
+ CPPUNIT_TEST( append_041 ); CPPUNIT_TEST( append_042 );
+ CPPUNIT_TEST( append_043 ); CPPUNIT_TEST( append_044 );
+ CPPUNIT_TEST( append_045 ); CPPUNIT_TEST( append_046 );
+ CPPUNIT_TEST( append_047 ); CPPUNIT_TEST( append_048 );
+ CPPUNIT_TEST( append_049 ); CPPUNIT_TEST( append_050 );
+ CPPUNIT_TEST( append_051 ); CPPUNIT_TEST( append_052 );
+ CPPUNIT_TEST( append_053 ); CPPUNIT_TEST( append_054 );
+ CPPUNIT_TEST( append_055 ); CPPUNIT_TEST( append_056 );
+ CPPUNIT_TEST( append_057 ); CPPUNIT_TEST( append_058 );
+ CPPUNIT_TEST( append_059 ); CPPUNIT_TEST( append_060 );
+ CPPUNIT_TEST( append_061 ); CPPUNIT_TEST( append_062 );
+ CPPUNIT_TEST( append_063 ); CPPUNIT_TEST( append_064 );
+ CPPUNIT_TEST( append_065 ); CPPUNIT_TEST( append_066 );
+ CPPUNIT_TEST( append_067 ); CPPUNIT_TEST( append_068 );
+ CPPUNIT_TEST( append_069 ); CPPUNIT_TEST( append_070 );
+ CPPUNIT_TEST( append_071 ); CPPUNIT_TEST( append_072 );
+ CPPUNIT_TEST( append_073 ); CPPUNIT_TEST( append_074 );
+ CPPUNIT_TEST( append_075 ); CPPUNIT_TEST( append_076 );
+ CPPUNIT_TEST( append_077 ); CPPUNIT_TEST( append_078 );
+ CPPUNIT_TEST( append_079 ); CPPUNIT_TEST( append_080 );
+ CPPUNIT_TEST( append_081 ); CPPUNIT_TEST( append_082 );
+ CPPUNIT_TEST( append_083 ); CPPUNIT_TEST( append_084 );
+ CPPUNIT_TEST( append_085 ); CPPUNIT_TEST( append_086 );
+ CPPUNIT_TEST( append_087 ); CPPUNIT_TEST( append_088 );
+ CPPUNIT_TEST( append_089 ); CPPUNIT_TEST( append_090 );
+ CPPUNIT_TEST( append_091 ); CPPUNIT_TEST( append_092 );
+ CPPUNIT_TEST( append_093 ); CPPUNIT_TEST( append_094 );
+ CPPUNIT_TEST( append_095 ); CPPUNIT_TEST( append_096 );
+ CPPUNIT_TEST( append_097 ); CPPUNIT_TEST( append_098 );
+ CPPUNIT_TEST( append_099 ); CPPUNIT_TEST( append_100 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( sal_Int32 i, sal_Int16 radix=2 )
+// where i = large constants
+// testing the method append( sal_Int32 i, sal_Int16 radix=8 )
+// where i = large constants
+// testing the method append( sal_Int32 i, sal_Int16 radix=10 )
+// where i = large constants
+// testing the method append( sal_Int32 i, sal_Int16 radix=16 )
+// where i = large constants
+// testing the method append( sal_Int32 i, sal_Int16 radix=36 )
+// where i = large constants
+//------------------------------------------------------------------------
+ class append_006_Int32_Bounderies : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "2147483647" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "zik0zj" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "2147483647" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "zik0zj" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "2147483647" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "zik0zj" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "2147483647" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "zik0zj" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_043()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_044()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_045()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_046()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "2147483647" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_047()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_048()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_049()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_050()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = kSInt32Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "zik0zj" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE( append_006_Int32_Bounderies );
+ CPPUNIT_TEST( append_001 ); CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 ); CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 ); CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 ); CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 ); CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 ); CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 ); CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 ); CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 ); CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 ); CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 ); CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 ); CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 ); CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 ); CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 ); CPPUNIT_TEST( append_030 );
+ CPPUNIT_TEST( append_031 ); CPPUNIT_TEST( append_032 );
+ CPPUNIT_TEST( append_033 ); CPPUNIT_TEST( append_034 );
+ CPPUNIT_TEST( append_035 ); CPPUNIT_TEST( append_036 );
+ CPPUNIT_TEST( append_037 ); CPPUNIT_TEST( append_038 );
+ CPPUNIT_TEST( append_039 ); CPPUNIT_TEST( append_040 );
+ CPPUNIT_TEST( append_041 ); CPPUNIT_TEST( append_042 );
+ CPPUNIT_TEST( append_043 ); CPPUNIT_TEST( append_044 );
+ CPPUNIT_TEST( append_045 ); CPPUNIT_TEST( append_046 );
+ CPPUNIT_TEST( append_047 ); CPPUNIT_TEST( append_048 );
+ CPPUNIT_TEST( append_049 ); CPPUNIT_TEST( append_050 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( sal_Int32 i, sal_Int16 radix=2 )
+// for negative value
+// testing the method append( sal_Int32 i, sal_Int16 radix=8 )
+// for negative value
+// testing the method append( sal_Int32 i, sal_Int16 radix=10 )
+// for negative value
+// testing the method append( sal_Int32 i, sal_Int16 radix=16 )
+// for negative value
+// testing the method append( sal_Int32 i, sal_Int16 radix=36 )
+// for negative value
+//------------------------------------------------------------------------
+ class append_006_Int32_Negative : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_043()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_044()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_045()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_046()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_047()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_048()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_049()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_050()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_051()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_052()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_053()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_054()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_055()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_056()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_057()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_058()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_059()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_060()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_061()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_062()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_063()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_064()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_065()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_066()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_067()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_068()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_069()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_070()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_071()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_072()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_073()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_074()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_075()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_076()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_077()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_078()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_079()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_080()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_081()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_082()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_083()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_084()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 2)_006_negative_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_085()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_086()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_087()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_088()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 8)_006_negative_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_089()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_090()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_091()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_092()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 10)_006_negative_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_093()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_094()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_095()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_096()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 16)_006_negative_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_097()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_098()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_099()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_100()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int32 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int32, radix 36)_006_negative_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE( append_006_Int32_Negative );
+ CPPUNIT_TEST( append_001 ); CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 ); CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 ); CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 ); CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 ); CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 ); CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 ); CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 ); CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 ); CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 ); CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 ); CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 ); CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 ); CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 ); CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 ); CPPUNIT_TEST( append_030 );
+ CPPUNIT_TEST( append_031 ); CPPUNIT_TEST( append_032 );
+ CPPUNIT_TEST( append_033 ); CPPUNIT_TEST( append_034 );
+ CPPUNIT_TEST( append_035 ); CPPUNIT_TEST( append_036 );
+ CPPUNIT_TEST( append_037 ); CPPUNIT_TEST( append_038 );
+ CPPUNIT_TEST( append_039 ); CPPUNIT_TEST( append_040 );
+ CPPUNIT_TEST( append_041 ); CPPUNIT_TEST( append_042 );
+ CPPUNIT_TEST( append_043 ); CPPUNIT_TEST( append_044 );
+ CPPUNIT_TEST( append_045 ); CPPUNIT_TEST( append_046 );
+ CPPUNIT_TEST( append_047 ); CPPUNIT_TEST( append_048 );
+ CPPUNIT_TEST( append_049 ); CPPUNIT_TEST( append_050 );
+ CPPUNIT_TEST( append_051 ); CPPUNIT_TEST( append_052 );
+ CPPUNIT_TEST( append_053 ); CPPUNIT_TEST( append_054 );
+ CPPUNIT_TEST( append_055 ); CPPUNIT_TEST( append_056 );
+ CPPUNIT_TEST( append_057 ); CPPUNIT_TEST( append_058 );
+ CPPUNIT_TEST( append_059 ); CPPUNIT_TEST( append_060 );
+ CPPUNIT_TEST( append_061 ); CPPUNIT_TEST( append_062 );
+ CPPUNIT_TEST( append_063 ); CPPUNIT_TEST( append_064 );
+ CPPUNIT_TEST( append_065 ); CPPUNIT_TEST( append_066 );
+ CPPUNIT_TEST( append_067 ); CPPUNIT_TEST( append_068 );
+ CPPUNIT_TEST( append_069 ); CPPUNIT_TEST( append_070 );
+ CPPUNIT_TEST( append_071 ); CPPUNIT_TEST( append_072 );
+ CPPUNIT_TEST( append_073 ); CPPUNIT_TEST( append_074 );
+ CPPUNIT_TEST( append_075 ); CPPUNIT_TEST( append_076 );
+ CPPUNIT_TEST( append_077 ); CPPUNIT_TEST( append_078 );
+ CPPUNIT_TEST( append_079 ); CPPUNIT_TEST( append_080 );
+ CPPUNIT_TEST( append_081 ); CPPUNIT_TEST( append_082 );
+ CPPUNIT_TEST( append_083 ); CPPUNIT_TEST( append_084 );
+ CPPUNIT_TEST( append_085 ); CPPUNIT_TEST( append_086 );
+ CPPUNIT_TEST( append_087 ); CPPUNIT_TEST( append_088 );
+ CPPUNIT_TEST( append_089 ); CPPUNIT_TEST( append_090 );
+ CPPUNIT_TEST( append_091 ); CPPUNIT_TEST( append_092 );
+ CPPUNIT_TEST( append_093 ); CPPUNIT_TEST( append_094 );
+ CPPUNIT_TEST( append_095 ); CPPUNIT_TEST( append_096 );
+ CPPUNIT_TEST( append_097 ); CPPUNIT_TEST( append_098 );
+ CPPUNIT_TEST( append_099 ); CPPUNIT_TEST( append_100 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( sal_Int32 i, sal_Int16 radix ) where radix = -5
+//------------------------------------------------------------------------
+ class append_006_Int32_WrongRadix : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+ sal_Int32 intVal;
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+ intVal = 11;
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr59 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[0]",
+ sal_True
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr60 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[1]",
+ sal_True
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr60 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[2]",
+ sal_True
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr60 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[3]",
+ sal_True
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr61 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[4]",
+ sal_True
+ );
+
+ }
+#ifdef WITH_CORE
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr60 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer(with INT_MAX)",
+ sal_True
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_006_Int32_WrongRadix );
+ CPPUNIT_TEST( append_001 );
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_006 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+ class append_006_Int32_defaultParam : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr59 );
+ sal_Int32 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 11 and return OStringBuffer[0]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr62 );
+ sal_Int32 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 0 and return OStringBuffer[0]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr63 );
+ sal_Int32 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -11 and return OStringBuffer[0]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr64 );
+ sal_Int32 input = 2147483647;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 2147483647 and return OStringBuffer[0]+2147483647",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr65 );
+ sal_Int32 input = kNonSInt32Max;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -2147483648 and return OStringBuffer[0]+(-2147483648)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr60 );
+ sal_Int32 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 11 and return OStringBuffer[1]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr66 );
+ sal_Int32 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 0 and return OStringBuffer[1]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr67 );
+ sal_Int32 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -11 and return OStringBuffer[1]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr68 );
+ sal_Int32 input = 2147483647;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 2147483647 and return OStringBuffer[1]+2147483647",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr69 );
+ sal_Int32 input = SAL_MIN_INT32 /*-2147483648*/;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -2147483648 and return OStringBuffer[1]+(-2147483648)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr60 );
+ sal_Int32 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 11 and return OStringBuffer[2]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr66 );
+ sal_Int32 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 0 and return OUStringBuffer[2]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr67 );
+ sal_Int32 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -11 and return OUStringBuffer[2]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr68 );
+ sal_Int32 input = 2147483647;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 2147483647 and return OStringBuffer[2]+2147483647",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr69 );
+ sal_Int32 input = SAL_MIN_INT32;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -2147483648 and return OStringBuffer[2]+(-2147483648)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr60 );
+ sal_Int32 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 11 and return OStringBuffer[3]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr66 );
+ sal_Int32 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 0 and return OStringBuffer[3]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr67 );
+ sal_Int32 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -11 and return OStringBuffer[3]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr68 );
+ sal_Int32 input = 2147483647;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 2147483647 and return OStringBuffer[3]+2147483647",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr69 );
+ sal_Int32 input = SAL_MIN_INT32;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -2147483648 and return OStringBuffer[3]+(-2147483648)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr61 );
+ sal_Int32 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 11 and return OStringBuffer[4]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr70 );
+ sal_Int32 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 0 and return OStringBuffer[4]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr71 );
+ sal_Int32 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -11 and return OStringBuffer[4]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr72 );
+ sal_Int32 input = 2147483647;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 2147483647 and return OStringBuffer[4]+2147483647",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr73 );
+ sal_Int32 input = SAL_MIN_INT32;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -2147483648 and return OStringBuffer[4]+(-2147483648)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+#ifdef WITH_CORE
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr60 );
+ sal_Int32 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 11 and return OStringBuffer(kSInt32Max)+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr66 );
+ sal_Int32 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 0 and return OStringBuffer(kSInt32Max)+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr67 );
+ sal_Int32 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -11 and return OStringBuffer(kSInt32Max)+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr68 );
+ sal_Int32 input = 2147483647;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 2147483647 and return OStringBuffer(kSInt32Max)+2147483647",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr69 );
+ sal_Int32 input = SAL_MIN_INT32;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int32 -2147483648 and return OStringBuffer(kSInt32Max)+(-2147483648)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_006_Int32_defaultParam );
+ CPPUNIT_TEST( append_001 );
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 );
+ CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 );
+ CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 );
+ CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 );
+ CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 );
+ CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 );
+ CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 );
+ CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 );
+ CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 );
+ CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 );
+ CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 );
+ CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 );
+ CPPUNIT_TEST( append_030 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( sal_Int64 l, sal_Int16 radix=2 )
+// testing the method append( sal_Int64 l, sal_Int16 radix=8 )
+// testing the method append( sal_Int64 l, sal_Int16 radix=10 )
+// testing the method append( sal_Int64 l, sal_Int16 radix=16 )
+// testing the method append( sal_Int64 l, sal_Int16 radix=36 )
+//------------------------------------------------------------------------
+ class append_007_Int64 : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_043()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_044()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_045()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_046()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_047()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_048()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_049()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_050()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_051()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_052()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_053()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_054()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_055()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_056()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_057()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_058()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_059()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_060()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_061()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_062()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_063()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_064()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_065()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_066()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_067()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_068()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_069()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_070()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_071()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_072()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_073()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_074()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_075()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_076()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_077()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_078()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_079()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_080()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_081()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_082()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_083()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_084()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_085()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_086()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_087()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_088()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_089()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_090()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_091()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_092()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_093()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_094()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_095()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_096()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_097()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_098()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_099()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_100()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = 35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE( append_007_Int64 );
+ CPPUNIT_TEST( append_001 ); CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 ); CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 ); CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 ); CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 ); CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 ); CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 ); CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 ); CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 ); CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 ); CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 ); CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 ); CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 ); CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 ); CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 ); CPPUNIT_TEST( append_030 );
+ CPPUNIT_TEST( append_031 ); CPPUNIT_TEST( append_032 );
+ CPPUNIT_TEST( append_033 ); CPPUNIT_TEST( append_034 );
+ CPPUNIT_TEST( append_035 ); CPPUNIT_TEST( append_036 );
+ CPPUNIT_TEST( append_037 ); CPPUNIT_TEST( append_038 );
+ CPPUNIT_TEST( append_039 ); CPPUNIT_TEST( append_040 );
+ CPPUNIT_TEST( append_041 ); CPPUNIT_TEST( append_042 );
+ CPPUNIT_TEST( append_043 ); CPPUNIT_TEST( append_044 );
+ CPPUNIT_TEST( append_045 ); CPPUNIT_TEST( append_046 );
+ CPPUNIT_TEST( append_047 ); CPPUNIT_TEST( append_048 );
+ CPPUNIT_TEST( append_049 ); CPPUNIT_TEST( append_050 );
+ CPPUNIT_TEST( append_051 ); CPPUNIT_TEST( append_052 );
+ CPPUNIT_TEST( append_053 ); CPPUNIT_TEST( append_054 );
+ CPPUNIT_TEST( append_055 ); CPPUNIT_TEST( append_056 );
+ CPPUNIT_TEST( append_057 ); CPPUNIT_TEST( append_058 );
+ CPPUNIT_TEST( append_059 ); CPPUNIT_TEST( append_060 );
+ CPPUNIT_TEST( append_061 ); CPPUNIT_TEST( append_062 );
+ CPPUNIT_TEST( append_063 ); CPPUNIT_TEST( append_064 );
+ CPPUNIT_TEST( append_065 ); CPPUNIT_TEST( append_066 );
+ CPPUNIT_TEST( append_067 ); CPPUNIT_TEST( append_068 );
+ CPPUNIT_TEST( append_069 ); CPPUNIT_TEST( append_070 );
+ CPPUNIT_TEST( append_071 ); CPPUNIT_TEST( append_072 );
+ CPPUNIT_TEST( append_073 ); CPPUNIT_TEST( append_074 );
+ CPPUNIT_TEST( append_075 ); CPPUNIT_TEST( append_076 );
+ CPPUNIT_TEST( append_077 ); CPPUNIT_TEST( append_078 );
+ CPPUNIT_TEST( append_079 ); CPPUNIT_TEST( append_080 );
+ CPPUNIT_TEST( append_081 ); CPPUNIT_TEST( append_082 );
+ CPPUNIT_TEST( append_083 ); CPPUNIT_TEST( append_084 );
+ CPPUNIT_TEST( append_085 ); CPPUNIT_TEST( append_086 );
+ CPPUNIT_TEST( append_087 ); CPPUNIT_TEST( append_088 );
+ CPPUNIT_TEST( append_089 ); CPPUNIT_TEST( append_090 );
+ CPPUNIT_TEST( append_091 ); CPPUNIT_TEST( append_092 );
+ CPPUNIT_TEST( append_093 ); CPPUNIT_TEST( append_094 );
+ CPPUNIT_TEST( append_095 ); CPPUNIT_TEST( append_096 );
+ CPPUNIT_TEST( append_097 ); CPPUNIT_TEST( append_098 );
+ CPPUNIT_TEST( append_099 ); CPPUNIT_TEST( append_100 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( sal_Int64 i, sal_Int16 radix=2 )
+// where i = large constants
+// testing the method append( sal_Int64 i, sal_Int16 radix=8 )
+// where i = large constants
+// testing the method append( sal_Int64 i, sal_Int16 radix=10 )
+// where i = large constants
+// testing the method append( sal_Int64 i, sal_Int16 radix=16 )
+// where i = large constants
+// testing the method append( sal_Int64 i, sal_Int16 radix=36 )
+// where i = large constants
+//------------------------------------------------------------------------
+ class append_007_Int64_Bounderies : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "111111111111111111111111111111111111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "777777777777777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "9223372036854775807" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffffffffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "1y2p0ij32e8e7" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "111111111111111111111111111111111111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "777777777777777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "9223372036854775807" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffffffffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "1y2p0ij32e8e7" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "111111111111111111111111111111111111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "777777777777777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "9223372036854775807" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffffffffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "1y2p0ij32e8e7" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "111111111111111111111111111111111111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "777777777777777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "9223372036854775807" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffffffffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "1y2p0ij32e8e7" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "1111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "111111111111111111111111111111111111111111111111111111111111111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_043()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "177" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_044()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "777777777777777777777" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_045()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "127" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_046()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "9223372036854775807" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_047()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_048()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "7fffffffffffffff" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_049()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt8Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "3j" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_050()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = kSInt64Max;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "1y2p0ij32e8e7" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_Bounderies_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE( append_007_Int64_Bounderies );
+ CPPUNIT_TEST( append_001 ); CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 ); CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 ); CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 ); CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 ); CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 ); CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 ); CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 ); CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 ); CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 ); CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 ); CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 ); CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 ); CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 ); CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 ); CPPUNIT_TEST( append_030 );
+ CPPUNIT_TEST( append_031 ); CPPUNIT_TEST( append_032 );
+ CPPUNIT_TEST( append_033 ); CPPUNIT_TEST( append_034 );
+ CPPUNIT_TEST( append_035 ); CPPUNIT_TEST( append_036 );
+ CPPUNIT_TEST( append_037 ); CPPUNIT_TEST( append_038 );
+ CPPUNIT_TEST( append_039 ); CPPUNIT_TEST( append_040 );
+ CPPUNIT_TEST( append_041 ); CPPUNIT_TEST( append_042 );
+ CPPUNIT_TEST( append_043 ); CPPUNIT_TEST( append_044 );
+ CPPUNIT_TEST( append_045 ); CPPUNIT_TEST( append_046 );
+ CPPUNIT_TEST( append_047 ); CPPUNIT_TEST( append_048 );
+ CPPUNIT_TEST( append_049 ); CPPUNIT_TEST( append_050 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( sal_Int64 i, sal_Int16 radix=2 )
+// for negative value
+// testing the method append( sal_Int64 i, sal_Int16 radix=8 )
+// for negative value
+// testing the method append( sal_Int64 i, sal_Int16 radix=10 )
+// for negative value
+// testing the method append( sal_Int64 i, sal_Int16 radix=16 )
+// for negative value
+// testing the method append( sal_Int64 i, sal_Int16 radix=36 )
+// for negative value
+//------------------------------------------------------------------------
+ class append_007_Int64_Negative : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[0]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[1]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_043()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_044()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_045()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_046()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_047()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_048()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_049()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_050()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_051()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_052()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_053()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_054()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_055()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_056()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_057()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_058()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_059()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_060()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[2]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_061()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_062()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_063()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_064()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_065()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_066()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_067()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_068()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_069()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_070()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_071()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_072()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_073()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_074()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_075()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_076()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_077()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_078()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_079()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_080()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[3]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_081()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_082()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "100" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_083()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1000" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_084()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 2;
+
+ expVal += OString( "-" );
+ expVal += OString( "1111" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 2)_006_negative_kRadixBinary for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_085()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_086()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_087()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "10" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_088()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 8;
+
+ expVal += OString( "-" );
+ expVal += OString( "17" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 8)_006_negative_kRadixOctol for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_089()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_090()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_091()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_092()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 10;
+
+ expVal += OString( "-" );
+ expVal += OString( "15" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 10)_006_negative_kRadixDecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_093()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_094()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_095()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_096()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -15;
+ sal_Int16 radix = 16;
+
+ expVal += OString( "-" );
+ expVal += OString( "f" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 16)_006_negative_kRadixHexdecimal for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_097()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -0;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "0" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_098()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -4;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "4" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_099()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -8;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "8" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_100()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( aStrBuf.getStr() );
+ sal_Int64 input = -35;
+ sal_Int16 radix = 36;
+
+ expVal += OString( "-" );
+ expVal += OString( "z" );
+ aStrBuf.append( input, radix );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "append(sal_Int64, radix 36)_006_negative_kRadixBase36 for arrOUS[4]",
+ aStrBuf.getStr()== expVal &&
+ aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE( append_007_Int64_Negative );
+ CPPUNIT_TEST( append_001 ); CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 ); CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 ); CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 ); CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 ); CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 ); CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 ); CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 ); CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 ); CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 ); CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 ); CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 ); CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 ); CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 ); CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 ); CPPUNIT_TEST( append_030 );
+ CPPUNIT_TEST( append_031 ); CPPUNIT_TEST( append_032 );
+ CPPUNIT_TEST( append_033 ); CPPUNIT_TEST( append_034 );
+ CPPUNIT_TEST( append_035 ); CPPUNIT_TEST( append_036 );
+ CPPUNIT_TEST( append_037 ); CPPUNIT_TEST( append_038 );
+ CPPUNIT_TEST( append_039 ); CPPUNIT_TEST( append_040 );
+ CPPUNIT_TEST( append_041 ); CPPUNIT_TEST( append_042 );
+ CPPUNIT_TEST( append_043 ); CPPUNIT_TEST( append_044 );
+ CPPUNIT_TEST( append_045 ); CPPUNIT_TEST( append_046 );
+ CPPUNIT_TEST( append_047 ); CPPUNIT_TEST( append_048 );
+ CPPUNIT_TEST( append_049 ); CPPUNIT_TEST( append_050 );
+ CPPUNIT_TEST( append_051 ); CPPUNIT_TEST( append_052 );
+ CPPUNIT_TEST( append_053 ); CPPUNIT_TEST( append_054 );
+ CPPUNIT_TEST( append_055 ); CPPUNIT_TEST( append_056 );
+ CPPUNIT_TEST( append_057 ); CPPUNIT_TEST( append_058 );
+ CPPUNIT_TEST( append_059 ); CPPUNIT_TEST( append_060 );
+ CPPUNIT_TEST( append_061 ); CPPUNIT_TEST( append_062 );
+ CPPUNIT_TEST( append_063 ); CPPUNIT_TEST( append_064 );
+ CPPUNIT_TEST( append_065 ); CPPUNIT_TEST( append_066 );
+ CPPUNIT_TEST( append_067 ); CPPUNIT_TEST( append_068 );
+ CPPUNIT_TEST( append_069 ); CPPUNIT_TEST( append_070 );
+ CPPUNIT_TEST( append_071 ); CPPUNIT_TEST( append_072 );
+ CPPUNIT_TEST( append_073 ); CPPUNIT_TEST( append_074 );
+ CPPUNIT_TEST( append_075 ); CPPUNIT_TEST( append_076 );
+ CPPUNIT_TEST( append_077 ); CPPUNIT_TEST( append_078 );
+ CPPUNIT_TEST( append_079 ); CPPUNIT_TEST( append_080 );
+ CPPUNIT_TEST( append_081 ); CPPUNIT_TEST( append_082 );
+ CPPUNIT_TEST( append_083 ); CPPUNIT_TEST( append_084 );
+ CPPUNIT_TEST( append_085 ); CPPUNIT_TEST( append_086 );
+ CPPUNIT_TEST( append_087 ); CPPUNIT_TEST( append_088 );
+ CPPUNIT_TEST( append_089 ); CPPUNIT_TEST( append_090 );
+ CPPUNIT_TEST( append_091 ); CPPUNIT_TEST( append_092 );
+ CPPUNIT_TEST( append_093 ); CPPUNIT_TEST( append_094 );
+ CPPUNIT_TEST( append_095 ); CPPUNIT_TEST( append_096 );
+ CPPUNIT_TEST( append_097 ); CPPUNIT_TEST( append_098 );
+ CPPUNIT_TEST( append_099 ); CPPUNIT_TEST( append_100 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( sal_Int64 i, sal_Int16 radix ) where radix = -5
+//------------------------------------------------------------------------
+ class append_007_Int64_WrongRadix : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+ sal_Int64 intVal;
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+ intVal = 11;
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr59 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[0]",
+ sal_True
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr60 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[1]",
+ sal_True
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr60 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[2]",
+ sal_True
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr60 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[3]",
+ sal_True
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr61 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer arrOUS[4]",
+ sal_True
+ );
+
+ }
+#ifdef WITH_CORE
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt64Max );
+ OString expVal( kTestStr60 );
+
+ aStrBuf.append( intVal, -5 );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Appends the WrongRadix to the string buffer(with INT_MAX)",
+ sal_True
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_007_Int64_WrongRadix );
+ CPPUNIT_TEST( append_001 );
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_006 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+ class append_007_Int64_defaultParam : public CppUnit::TestFixture
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr59 );
+ sal_Int64 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 11 and return OStringBuffer[0]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr62 );
+ sal_Int64 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 0 and return OStringBuffer[0]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr63 );
+ sal_Int64 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -11 and return OStringBuffer[0]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr116 );
+ sal_Int64 input = SAL_CONST_INT64(9223372036854775807);
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 9223372036854775807 and return OStringBuffer[0]+9223372036854775807",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr117 );
+ sal_Int64 input = SAL_MIN_INT64/*-9223372036854775808*/; // LLA: this is not the same :-( kNonSInt64Max;
+
+ aStrBuf.append( input );
+
+ sal_Bool bRes = expVal.equals( aStrBuf.getStr() );
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -9223372036854775808 and return OStringBuffer[0]+(-9223372036854775808)",
+ bRes && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr60 );
+ sal_Int64 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 11 and return OStringBuffer[1]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr66 );
+ sal_Int64 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 0 and return OStringBuffer[1]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr67 );
+ sal_Int64 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -11 and return OStringBuffer[1]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr118 );
+ sal_Int64 input = SAL_CONST_INT64(9223372036854775807);
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 9223372036854775807 and return OStringBuffer[1]+9223372036854775807",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr119 );
+ sal_Int64 input = SAL_MIN_INT64; // LLA: this is not the same :-( kNonSInt64Max;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -9223372036854775808 and return OStringBuffer[1]+(-9223372036854775808)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr60 );
+ sal_Int64 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 11 and return OStringBuffer[2]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr66 );
+ sal_Int64 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 0 and return OUStringBuffer[2]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr67 );
+ sal_Int64 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -11 and return OUStringBuffer[2]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr118 );
+ sal_Int64 input = SAL_CONST_INT64(9223372036854775807);
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 9223372036854775807 and return OStringBuffer[2]+9223372036854775807",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr119 );
+ sal_Int64 input = SAL_MIN_INT64; // LLA: this is not the same :-( kNonSInt64Max;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -9223372036854775808 and return OStringBuffer[2]+(-9223372036854775808)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr60 );
+ sal_Int64 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 11 and return OStringBuffer[3]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr66 );
+ sal_Int64 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 0 and return OStringBuffer[3]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr67 );
+ sal_Int64 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -11 and return OStringBuffer[3]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr118 );
+ sal_Int64 input = SAL_CONST_INT64(9223372036854775807);
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 9223372036854775807 and return OStringBuffer[3]+9223372036854775807",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr119 );
+ sal_Int64 input = SAL_MIN_INT64; // LLA: this is not the same :-( kNonSInt64Max;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -9223372036854775808 and return OStringBuffer[3]+(-9223372036854775808)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr61 );
+ sal_Int64 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 11 and return OStringBuffer[4]+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr70 );
+ sal_Int64 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 0 and return OStringBuffer[4]+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr71 );
+ sal_Int64 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -11 and return OStringBuffer[4]+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr120 );
+ sal_Int64 input = SAL_CONST_INT64(9223372036854775807);
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 9223372036854775807 and return OStringBuffer[4]+9223372036854775807",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr121 );
+ sal_Int64 input = SAL_MIN_INT64; // LLA: this is not the same :-( kNonSInt64Max;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -9223372036854775808 and return OStringBuffer[4]+(-9223372036854775808)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+#ifdef WITH_CORE
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt64Max );
+ OString expVal( kTestStr60 );
+ sal_Int64 input = 11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 11 and return OStringBuffer(kSInt64Max)+11",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt64Max );
+ OString expVal( kTestStr66 );
+ sal_Int64 input = 0;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 0 and return OStringBuffer(kSInt64Max)+0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt64Max );
+ OString expVal( kTestStr67 );
+ sal_Int64 input = -11;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -11 and return OStringBuffer(kSInt64Max)+(-11)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt64Max );
+ OString expVal( kTestStr118 );
+ sal_Int64 input = 9223372036854775807;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 9223372036854775807 and return OStringBuffer(kSInt64Max)+9223372036854775807",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt64Max );
+ OString expVal( kTestStr119 );
+ sal_Int64 input = SAL_MIN_INT64; // LLA: this is not the same :-( kNonSInt64Max;
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "input Int64 -9223372036854775808 and return OStringBuffer(kSInt64Max)+(-9223372036854775808)",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_007_Int64_defaultParam );
+ CPPUNIT_TEST( append_001 );
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 );
+ CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 );
+ CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 );
+ CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 );
+ CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 );
+ CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 );
+ CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 );
+ CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 );
+ CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 );
+ CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 );
+ CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 );
+ CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 );
+ CPPUNIT_TEST( append_030 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( float f )
+//------------------------------------------------------------------------
+ class checkfloat : public CppUnit::TestFixture
+ {
+ public:
+ bool checkIfStrBufContainAtPosTheFloat(rtl::OStringBuffer const& _sStrBuf, sal_Int32 _nLen, float _nFloat)
+ {
+ OString sFloatValue;
+ sFloatValue = rtl::OString::valueOf(_nFloat);
+
+ OString sBufferString(_sStrBuf.getStr());
+ sal_Int32 nPos = sBufferString.indexOf(sFloatValue);
+ if ( nPos >= 0 && nPos == _nLen)
+ {
+ return true;
+ }
+ return false;
+ }
+ };
+// -----------------------------------------------------------------------------
+ class append_008_float : public checkfloat
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr74 );
+ float input = (float)atof("3.0");
+
+ // LLA:
+ // the complex problem is here, that a float value is not really what we write.
+ // So a 3.0 could also be 3 or 3.0 or 3.0000001 or 2.9999999
+ // this has to be checked.
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr75 );
+ float input = (float)atof("3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr76 );
+ float input = (float)atof("3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr77 );
+ float input = (float)atof("3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr78 );
+ float input = (float)atof("3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr79 );
+ float input = (float)atof("3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr80 );
+ float input = (float)atof("3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr81 );
+ float input = (float)atof("3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr82 );
+ float input = (float)atof("3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr83 );
+ float input = (float)atof("3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr84 );
+ float input = (float)atof("3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr85 );
+ float input = (float)atof("3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr86 );
+ float input = (float)atof("3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr87 );
+ float input = (float)atof("3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr81 );
+ float input = (float)atof("3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr82 );
+ float input = (float)atof("3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr83 );
+ float input = (float)atof("3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr84 );
+ float input = (float)atof("3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr85 );
+ float input = (float)atof("3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr86 );
+ float input = (float)atof("3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr87 );
+ float input = (float)atof("3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr81 );
+ float input = (float)atof("3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr82 );
+ float input = (float)atof("3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr83 );
+ float input = (float)atof("3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr84 );
+ float input = (float)atof("3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr85 );
+ float input = (float)atof("3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr86 );
+ float input = (float)atof("3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr87 );
+ float input = (float)atof("3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr88 );
+ float input = (float)atof("3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr89 );
+ float input = (float)atof("3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr90 );
+ float input = (float)atof("3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr91 );
+ float input = (float)atof("3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr92 );
+ float input = (float)atof("3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr93 );
+ float input = (float)atof("3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr94 );
+ float input = (float)atof("3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+#ifdef WITH_CORE
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr81 );
+ float input = (float)atof("3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr82 );
+ float input = (float)atof("3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr83 );
+ float input = (float)atof("3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr84 );
+ float input = (float)atof("3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr85 );
+ float input = (float)atof("3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr86 );
+ float input = (float)atof("3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr87 );
+ float input = (float)atof("3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_008_float );
+ CPPUNIT_TEST( append_001 );
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 );
+ CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 );
+ CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 );
+ CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 );
+ CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 );
+ CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 );
+ CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 );
+ CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 );
+ CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 );
+ CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 );
+ CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 );
+ CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 );
+ CPPUNIT_TEST( append_030 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( float f ) for negative value
+//------------------------------------------------------------------------
+ class append_008_Float_Negative : public checkfloat
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr95 );
+ float input = (float)atof("-3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr96 );
+ float input = (float)atof("-3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr97 );
+ float input = (float)atof("-3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr98 );
+ float input = (float)atof("-3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr99 );
+ float input = (float)atof("-3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr100 );
+ float input = (float)atof("-3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr101 );
+ float input = (float)atof("-3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr102 );
+ float input = (float)atof("-3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr103 );
+ float input = (float)atof("-3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr104 );
+ float input = (float)atof("-3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr105 );
+ float input = (float)atof("-3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr106 );
+ float input = (float)atof("-3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr107 );
+ float input = (float)atof("-3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ // LLA: OString expVal( kTestStr108 );
+ float input = (float)atof("-3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr102 );
+ float input = (float)atof("-3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr103 );
+ float input = (float)atof("-3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr104 );
+ float input = (float)atof("-3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr105 );
+ float input = (float)atof("-3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr106 );
+ float input = (float)atof("-3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr107 );
+ float input = (float)atof("-3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ // LLA: OString expVal( kTestStr108 );
+ float input = (float)atof("-3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr102 );
+ float input = (float)atof("-3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr103 );
+ float input = (float)atof("-3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr104 );
+ float input = (float)atof("-3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr105 );
+ float input = (float)atof("-3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr106 );
+ float input = (float)atof("-3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr107 );
+ float input = (float)atof("-3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ // LLA: OString expVal( kTestStr108 );
+ float input = (float)atof("-3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr109 );
+ float input = (float)atof("-3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr110 );
+ float input = (float)atof("-3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr111 );
+ float input = (float)atof("-3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr112 );
+ float input = (float)atof("-3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr113 );
+ float input = (float)atof("-3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr114 );
+ float input = (float)atof("-3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr115 );
+ float input = (float)atof("-3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+#ifdef WITH_CORE
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr102 );
+ float input = (float)atof("-3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.0",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr103 );
+ float input = (float)atof("-3.5");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.5",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr104 );
+ float input = (float)atof("-3.0625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.0625",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr105 );
+ float input = (float)atof("-3.502525");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.502525",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr106 );
+ float input = (float)atof("-3.141592");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.141592",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr107 );
+ float input = (float)atof("-3.5025255");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.5025255",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ // LLA: OString expVal( kTestStr108 );
+ float input = (float)atof("-3.00390625");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.0039062",
+ checkIfStrBufContainAtPosTheFloat(aStrBuf, nLen, input)
+ );
+
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( append_008_Float_Negative );
+ CPPUNIT_TEST( append_001 );
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 );
+ CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 );
+ CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 );
+ CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 );
+ CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 );
+ CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 );
+ CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 );
+ CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 );
+ CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 );
+ CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 );
+ CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 );
+ CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 );
+ CPPUNIT_TEST( append_030 );
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( double d )
+//------------------------------------------------------------------------
+
+ class checkdouble : public CppUnit::TestFixture
+ {
+ public:
+ bool checkIfStrBufContainAtPosTheDouble(rtl::OStringBuffer const& _sStrBuf, sal_Int32 _nLen, double _nDouble)
+ {
+ OString sDoubleValue;
+ sDoubleValue = rtl::OString::valueOf(_nDouble);
+
+ OString sBufferString(_sStrBuf.getStr());
+ sal_Int32 nPos = sBufferString.indexOf(sDoubleValue);
+ if ( nPos >= 0 && nPos == _nLen)
+ {
+ return true;
+ }
+ return false;
+ }
+ };
+
+ class append_009_double : public checkdouble
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr74 );
+ double input = atof("3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.0",
+ checkIfStrBufContainAtPosTheDouble(aStrBuf, nLen, input)
+ );
+
+ }
+
+/*
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr75 );
+ double input = atof("3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr76 );
+ double input = atof("3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr122 );
+ double input = atof("3.1415926535");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.1415926535",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr123 );
+ double input = atof("3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr124 );
+ double input = atof("3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr125 );
+ double input = atof("3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append 3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr81 );
+ double input = atof("3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr82 );
+ double input = atof("3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr83 );
+ double input = atof("3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr126 );
+ double input = atof("3.1415926535");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.1415926535",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr127 );
+ double input = atof("3.141592653589793");
+
+ aStrBuf.append( input );
+ OString *result = new OString( aStrBuf.getStr());
+ double output = result->toDouble();
+ OString *final = new OString();
+ *final = final->valueOf(output);
+t_print("the OStringvalus is:");
+for(int m=0;m<final->getLength();m++)
+{
+ t_print("%c",final->pData->buffer[m]);
+}
+t_print("\n");
+t_print("the OStringBuffer is %d\n", aStrBuf.getLength());
+t_print("the expVal is %d\n", expVal.getLength());
+t_print("the OStringbuffervalus is:");
+for(int j=0;j<aStrBuf.getLength();j++)
+{
+ t_print("%c",*(aStrBuf.getStr()+j));
+}
+t_print("\n");
+t_print("the expVlavalus is:");
+for(int k=0;k<expVal.getLength();k++)
+{
+ t_print("%c",expVal.pData->buffer[k]);
+}
+t_print("\n");
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr128 );
+ double input = atof("3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr129 );
+ double input = atof("3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr81 );
+ double input = atof("3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr82 );
+ double input = atof("3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr83 );
+ double input = atof("3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr126 );
+ double input = atof("3.1415926535");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.1415926535",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr127 );
+ double input = atof("3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr128 );
+ double input = atof("3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr129 );
+ double input = atof("3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append 3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr81 );
+ double input = atof("3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr82 );
+ double input = atof("3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr83 );
+ double input = atof("3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr126 );
+ double input = atof("3.1415926535");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.1415926535",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr127 );
+ double input = atof("3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr128 );
+ double input = atof("3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append 3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr129 );
+ double input = atof("3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append 3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr88 );
+ double input = atof("3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr89 );
+ double input = atof("3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr90 );
+ double input = atof("3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr130 );
+ double input = atof("3.1415926535");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.1415926535",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr131 );
+ double input = atof("3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr132 );
+ double input = atof("3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+*/
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr133 );
+ double input = atof("3.141592653589793238462643");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append 3.141592653589793238462643",
+ checkIfStrBufContainAtPosTheDouble(aStrBuf, nLen, input)
+ );
+
+ }
+/*
+#ifdef WITH_CORE
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr81 );
+ double input = atof("3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr82 );
+ double input = atof("3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr83 );
+ double input = atof("3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr126 );
+ double input = atof("3.1415926535");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.1415926535",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr127 );
+ double input = atof("3.141592653589793";
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr128 );
+ double input = atof("3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr129 );
+ double input = atof("3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append 3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+#endif
+*/
+ CPPUNIT_TEST_SUITE( append_009_double );
+ CPPUNIT_TEST( append_001 );
+/*
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 );
+ CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 );
+ CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 );
+ CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 );
+ CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 );
+ CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 );
+ CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 );
+ CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 );
+ CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 );
+ CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 );
+ CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 );
+ CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 );
+ CPPUNIT_TEST( append_030 );
+#endif
+*/
+ CPPUNIT_TEST( append_035 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+//------------------------------------------------------------------------
+// testing the method append( double f ) for negative value
+//------------------------------------------------------------------------
+ class append_009_Double_Negative : public checkdouble
+ {
+ OString* arrOUS[5];
+
+ public:
+ void setUp()
+ {
+ arrOUS[0] = new OString( kTestStr7 );
+ arrOUS[1] = new OString( );
+ arrOUS[2] = new OString( kTestStr25 );
+ arrOUS[3] = new OString( "\0" );
+ arrOUS[4] = new OString( kTestStr28 );
+
+ }
+
+ void tearDown()
+ {
+ delete arrOUS[0]; delete arrOUS[1]; delete arrOUS[2];
+ delete arrOUS[3]; delete arrOUS[4];
+ }
+
+ void append_001()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ // LLA: OString expVal( kTestStr95 );
+ double input = atof("-3.0");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.0",
+ checkIfStrBufContainAtPosTheDouble(aStrBuf, nLen, input)
+ );
+
+ }
+/*
+ void append_002()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr96 );
+ double input = atof("-3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_003()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr97 );
+ double input = atof("-3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_004()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr98 );
+ double input = atof("-3.502525");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.502525",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_005()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr134 );
+ double input = atof("-3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_006()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr135 );
+ double input = atof("-3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_007()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[0] );
+ OString expVal( kTestStr136 );
+ double input = atof("-3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[0] append -3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_008()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr102 );
+ double input = atof("-3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_009()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr103 );
+ double input = atof("-3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_010()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr104 );
+ double input = atof("-3.0625");
+
+ aStrBuf.append( input );
+ OString *result = new OString( aStrBuf.getStr());
+ double output = result->toDouble();
+ OString *final = new OString();
+ *final = final->valueOf(output);
+t_print("the OStringvalus is:");
+for(int m=0;m<final->getLength();m++)
+{
+ t_print("%c",final->pData->buffer[m]);
+}
+t_print("\n");
+t_print("the OStringBuffer is %d\n", aStrBuf.getLength());
+t_print("the expVal is %d\n", expVal.getLength());
+t_print("the OStringbuffervalus is:");
+for(int j=0;j<aStrBuf.getLength();j++)
+{
+ t_print("%c",*(aStrBuf.getStr()+j));
+}
+t_print("\n");
+t_print("the expVlavalus is:");
+for(int k=0;k<expVal.getLength();k++)
+{
+ t_print("%c",expVal.pData->buffer[k]);
+}
+t_print("\n");
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_011()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr105 );
+ double input = atof("-3.502525");
+
+ aStrBuf.append( input );
+
+ double output = atof("-3.50252");
+ OString *final = new OString();
+ *final = final->valueOf(output);
+t_print("the OStringvalus is:");
+for(int m=0;m<final->getLength();m++)
+{
+ t_print("%c",final->pData->buffer[m]);
+}
+t_print("\n");
+t_print("the OStringBuffer is %d\n", aStrBuf.getLength());
+t_print("the expVal is %d\n", expVal.getLength());
+t_print("the OStringbuffervalus is:");
+for(int j=0;j<aStrBuf.getLength();j++)
+{
+ t_print("%c",*(aStrBuf.getStr()+j));
+}
+t_print("\n");
+t_print("the expVlavalus is:");
+for(int k=0;k<expVal.getLength();k++)
+{
+ t_print("%c",expVal.pData->buffer[k]);
+}
+t_print("\n");
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.502525",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_012()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr137 );
+ double input = atof("-3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_013()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr138 );
+ double input = atof("-3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_014()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[1] );
+ OString expVal( kTestStr139 );
+ double input = atof("-3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_015()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr102 );
+ double input = atof("-3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_016()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr103 );
+ double input = atof("-3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_017()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr104 );
+ double input = atof("-3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_018()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr105 );
+ double input = atof("-3.502525");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.502525",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_019()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr137 );
+ double input = atof("-3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_020()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr138 );
+ double input = atof("-3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_021()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[2] );
+ OString expVal( kTestStr139 );
+ double input = atof("-3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[2] append -3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_022()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr102 );
+ double input = atof("-3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_023()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr103 );
+ double input = atof("-3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_024()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr104 );
+ double input = atof("-3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_025()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr105 );
+ double input = atof("-3.502525");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.502525",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_026()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr137 );
+ double input = atof("-3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_027()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr138 );
+ double input = atof("-3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[1] append -3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_028()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[3] );
+ OString expVal( kTestStr139 );
+ double input = atof("-3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[3] append -3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_029()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr109 );
+ double input = atof("-3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_030()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr110 );
+ double input = atof("-3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_031()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr111 );
+ double input = atof("-3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_032()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr112 );
+ double input = atof("-3.502525");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.502525",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_033()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr140 );
+ double input = atof("-3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_034()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ OString expVal( kTestStr141 );
+ double input = atof("-3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+*/
+ void append_035()
+ {
+ ::rtl::OStringBuffer aStrBuf( *arrOUS[4] );
+ // LLA: OString expVal( kTestStr142 );
+ double input = atof("-3.141592653589793238462643");
+
+ sal_Int32 nLen = aStrBuf.getLength();
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "arrOUS[4] append -3.141592653589793238462643",
+ checkIfStrBufContainAtPosTheDouble(aStrBuf, nLen, input)
+ );
+
+ }
+/*
+#ifdef WITH_CORE
+ void append_036()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr102 );
+ double input = atof("-3.0");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.0",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_037()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr103 );
+ double input = atof("-3.5");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.5",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_038()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr104 );
+ double input = atof("-3.0625");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.0625",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_039()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr105 );
+ double input = atof("-3.502525");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.502525",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_040()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr137 );
+ double input = atof("-3.141592653589793");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.141592653589793",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_041()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr138 );
+ double input = atof("-3.14159265358979323");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.14159265358979323",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+
+ void append_042()
+ {
+ ::rtl::OStringBuffer aStrBuf( kSInt32Max );
+ OString expVal( kTestStr139 );
+ double input = atof("-3.141592653589793238462643");
+
+ aStrBuf.append( input );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "OStringBuffer( kSInt32Max ) append -3.141592653589793238462643",
+ aStrBuf == expVal && aStrBuf.getLength() == expVal.getLength()
+ );
+
+ }
+#endif
+*/
+ CPPUNIT_TEST_SUITE( append_009_Double_Negative );
+ CPPUNIT_TEST( append_001 );
+/*
+ CPPUNIT_TEST( append_002 );
+ CPPUNIT_TEST( append_003 );
+ CPPUNIT_TEST( append_004 );
+ CPPUNIT_TEST( append_005 );
+ CPPUNIT_TEST( append_006 );
+ CPPUNIT_TEST( append_007 );
+ CPPUNIT_TEST( append_008 );
+ CPPUNIT_TEST( append_009 );
+ CPPUNIT_TEST( append_010 );
+ CPPUNIT_TEST( append_011 );
+ CPPUNIT_TEST( append_012 );
+ CPPUNIT_TEST( append_013 );
+ CPPUNIT_TEST( append_014 );
+ CPPUNIT_TEST( append_015 );
+ CPPUNIT_TEST( append_016 );
+ CPPUNIT_TEST( append_017 );
+ CPPUNIT_TEST( append_018 );
+ CPPUNIT_TEST( append_019 );
+ CPPUNIT_TEST( append_020 );
+ CPPUNIT_TEST( append_021 );
+ CPPUNIT_TEST( append_022 );
+ CPPUNIT_TEST( append_023 );
+ CPPUNIT_TEST( append_024 );
+ CPPUNIT_TEST( append_025 );
+#ifdef WITH_CORE
+ CPPUNIT_TEST( append_026 );
+ CPPUNIT_TEST( append_027 );
+ CPPUNIT_TEST( append_028 );
+ CPPUNIT_TEST( append_029 );
+ CPPUNIT_TEST( append_030 );
+#endif
+*/
+ CPPUNIT_TEST( append_035 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+} // namespace rtl_OStringBuffer
+
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::ctors);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::makeStringAndClear);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::getLength);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::getCapacity);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::ensureCapacity);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::setLength);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::charAt);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::csuc);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::getStr);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::setCharAt);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_001);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_002);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_003);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_004);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_005);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_006_Int32);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_006_Int32_Bounderies);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_006_Int32_Negative);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_006_Int32_WrongRadix);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_006_Int32_defaultParam);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_007_Int64);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_007_Int64_Bounderies);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_007_Int64_Negative);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_007_Int64_WrongRadix);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_007_Int64_defaultParam);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_008_float);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_008_Float_Negative);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_009_double);
+CPPUNIT_TEST_SUITE_REGISTRATION(rtl_OStringBuffer::append_009_Double_Negative);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sal/qa/OStringBuffer/rtl_String_Const.h b/sal/qa/OStringBuffer/rtl_String_Const.h
new file mode 100644
index 000000000000..fbddc8f10d97
--- /dev/null
+++ b/sal/qa/OStringBuffer/rtl_String_Const.h
@@ -0,0 +1,552 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _RTL_STRING_CONST_H_
+#define _RTL_STRING_CONST_H_
+
+#ifndef _RTL_STRING_UTILS_HXX_
+ #include <rtl_String_Utils.hxx>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#include <limits.h>
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+#ifndef _RTL_TEXTENC_H
+ #include <rtl/textenc.h>
+#endif
+
+#ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const rtl_TextEncoding kEncodingRTLTextUSASCII = RTL_TEXTENCODING_ASCII_US;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_uInt32 kConvertFlagsOUStringToOString = OUSTRING_TO_OSTRING_CVTFLAGS;
+static const sal_uInt32 kConvertFlagsOStringToOUString = OSTRING_TO_OUSTRING_CVTFLAGS;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Char *kTestStr1 = "Sun Microsystems";
+static const sal_Char *kTestStr2 = "Sun Microsystems Java Technology";
+static const sal_Char *kTestStr3 = "Sun microsystems";
+static const sal_Char *kTestStr7 = "Sun ";
+static const sal_Char *kTestStr8 = "Microsystems";
+static const sal_Char *kTestStr14 = " Sun Microsystems";
+static const sal_Char *kTestStr17 = " Sun Microsystems ";
+static const sal_Char *kTestStr23 = " Java Technology";
+static const sal_Char *kTestStr25 = "";
+static const sal_Char *kTestStr27 = "s";
+static const sal_Char *kTestStr28 = "\50\3\5\7\11\13\15\17sun";
+static const sal_Char *kTestStr29 = "\50\3\5\7\11\13\15\17sun\21\23\25\27\31\33\50";
+static const sal_Char *kTestStr31 = "sun Microsystems";
+static const sal_Char *kTestStr32 = "Sun Microsystem ";
+static const sal_Char *kTestStr33 = " ";
+static const sal_Char *kTestStr34 = "\50\5\5\7\11\13\15\17sun";
+static const sal_Char *kTestStr35 = "\50\373\5\7\11\13\15\17sun";
+static const sal_Char *kTestStr36 = "Microsystems Java Technology";
+static const sal_Char *kTestStr37 = "Sun Java Technology";
+static const sal_Char *kTestStr38 = "\21\23\25\27\31\33\50";
+static const sal_Char *kTestStr39 = "\50\3\5\7\11\13\15\17sun Sun Microsystems ";
+static const sal_Char *kTestStr40 = "\50\3\5\7\11\13\15\17sunsun Microsystems";
+static const sal_Char *kTestStr45 = "Sun true";
+static const sal_Char *kTestStr46 = "Sun false";
+static const sal_Char *kTestStr47 = "true";
+static const sal_Char *kTestStr48 = "false";
+static const sal_Char *kTestStr49 = "\50\3\5\7\11\13\15\17suntrue";
+static const sal_Char *kTestStr50 = "\50\3\5\7\11\13\15\17sunfalse";
+static const sal_Char *kTestStr51 = "Sun M";
+//static const sal_Char *kTestStr52 = "Sun \077777";
+//static const sal_Char *kTestStr53 = "Sun \100000";
+//static const sal_Char *kTestStr54 = "\77777";
+//static const sal_Char *kTestStr55 = "\100000";
+static const sal_Char *kTestStr56 = "\50\3\5\7\11\13\15\17suns";
+//static const sal_Char *kTestStr57 = "\50\3\5\7\11\13\15\17sun\77777";
+//static const sal_Char *kTestStr58 = "\50\3\5\7\11\13\15\17sun\10000";
+static const sal_Char *kTestStr59 = "Sun 11";
+static const sal_Char *kTestStr60 = "11";
+static const sal_Char *kTestStr61 = "\50\3\5\7\11\13\15\17sun11";
+static const sal_Char *kTestStr62 = "Sun 0";
+static const sal_Char *kTestStr63 = "Sun -11";
+static const sal_Char *kTestStr64 = "Sun 2147483647";
+static const sal_Char *kTestStr65 = "Sun -2147483648";
+static const sal_Char *kTestStr66 = "0";
+static const sal_Char *kTestStr67 = "-11";
+static const sal_Char *kTestStr68 = "2147483647";
+static const sal_Char *kTestStr69 = "-2147483648";
+static const sal_Char *kTestStr70 = "\50\3\5\7\11\13\15\17sun0";
+static const sal_Char *kTestStr71 = "\50\3\5\7\11\13\15\17sun-11";
+static const sal_Char *kTestStr72 = "\50\3\5\7\11\13\15\17sun2147483647";
+static const sal_Char *kTestStr73 = "\50\3\5\7\11\13\15\17sun-2147483648";
+static const sal_Char *kTestStr116 = "Sun 9223372036854775807";
+static const sal_Char *kTestStr117 = "Sun -9223372036854775808";
+static const sal_Char *kTestStr118 = "9223372036854775807";
+static const sal_Char *kTestStr119 = "-9223372036854775808";
+static const sal_Char *kTestStr120 = "\50\3\5\7\11\13\15\17sun9223372036854775807";
+static const sal_Char *kTestStr121 = "\50\3\5\7\11\13\15\17sun-9223372036854775808";
+static const sal_Char *kTestStr143 = "Sun \377";
+static const sal_Char *kTestStr144 = "\377";
+static const sal_Char *kTestStr145 = "\50\3\5\7\11\13\15\17sun\377";
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int32 kTestStr1Len = 16;
+static const sal_Int32 kTestStr2Len = 32;
+static const sal_Int32 kTestStr3Len = 16;
+static const sal_Int32 kTestStr4Len = 16;
+static const sal_Int32 kTestStr5Len = 16;
+static const sal_Int32 kTestStr6Len = 15;
+static const sal_Int32 kTestStr7Len = 4;
+static const sal_Int32 kTestStr8Len = 12;
+static const sal_Int32 kTestStr9Len = 32;
+static const sal_Int32 kTestStr10Len = 17;
+static const sal_Int32 kTestStr11Len = 17;
+static const sal_Int32 kTestStr12Len = 18;
+static const sal_Int32 kTestStr13Len = 19;
+static const sal_Int32 kTestStr14Len = 19;
+static const sal_Int32 kTestStr15Len = 20;
+static const sal_Int32 kTestStr16Len = 20;
+static const sal_Int32 kTestStr17Len = 22;
+static const sal_Int32 kTestStr18Len = 16;
+static const sal_Int32 kTestStr19Len = 22;
+static const sal_Int32 kTestStr20Len = 3;
+static const sal_Int32 kTestStr21Len = 3;
+static const sal_Int32 kTestStr22Len = 32;
+static const sal_Int32 kTestStr23Len = 16;
+static const sal_Int32 kTestStr24Len = 31;
+static const sal_Int32 kTestStr25Len = 0;
+static const sal_Int32 kTestStr26Len = 4;
+static const sal_Int32 kTestStr27Len = 1;
+static const sal_Int32 kTestStr28Len = 11;
+static const sal_Int32 kTestStr29Len = 18;
+static const sal_Int32 kTestStr30Len = 10;
+static const sal_Int32 kTestStr31Len = 16;
+static const sal_Int32 kTestStr32Len = 16;
+static const sal_Int32 kTestStr33Len = 1;
+static const sal_Int32 kTestStr34Len = 11;
+static const sal_Int32 kTestStr35Len = 11;
+static const sal_Int32 kTestStr36Len = 28;
+static const sal_Int32 kTestStr37Len = 20;
+static const sal_Int32 kTestStr38Len = 7;
+static const sal_Int32 kTestStr39Len = 33;
+static const sal_Int32 kTestStr40Len = 27;
+static const sal_Int32 kTestStr41Len = 3;
+static const sal_Int32 kTestStr42Len = 10;
+static const sal_Int32 kTestStr43Len = 13;
+static const sal_Int32 kTestStr44Len = 2;
+static const sal_Int32 kTestStr45Len = 8;
+static const sal_Int32 kTestStr46Len = 9;
+static const sal_Int32 kTestStr47Len = 4;
+static const sal_Int32 kTestStr48Len = 5;
+static const sal_Int32 kTestStr49Len = 15;
+static const sal_Int32 kTestStr50Len = 16;
+static const sal_Int32 kTestStr51Len = 5;
+static const sal_Int32 kTestStr52Len = 5;
+static const sal_Int32 kTestStr53Len = 5;
+static const sal_Int32 kTestStr54Len = 1;
+static const sal_Int32 kTestStr55Len = 1;
+static const sal_Int32 kTestStr56Len = 12;
+static const sal_Int32 kTestStr57Len = 12;
+static const sal_Int32 kTestStr58Len = 12;
+static const sal_Int32 kTestStr59Len = 6;
+static const sal_Int32 kTestStr60Len = 2;
+static const sal_Int32 kTestStr61Len = 13;
+static const sal_Int32 kTestStr62Len = 5;
+static const sal_Int32 kTestStr63Len = 7;
+static const sal_Int32 kTestStr64Len = 14;
+static const sal_Int32 kTestStr65Len = 15;
+static const sal_Int32 kTestStr66Len = 1;
+static const sal_Int32 kTestStr67Len = 3;
+static const sal_Int32 kTestStr68Len = 10;
+static const sal_Int32 kTestStr69Len = 11;
+static const sal_Int32 kTestStr70Len = 12;
+static const sal_Int32 kTestStr71Len = 14;
+static const sal_Int32 kTestStr72Len = 21;
+static const sal_Int32 kTestStr73Len = 22;
+static const sal_Int32 kTestStr74Len = 7;
+static const sal_Int32 kTestStr75Len = 7;
+static const sal_Int32 kTestStr76Len = 10;
+static const sal_Int32 kTestStr77Len = 12;
+static const sal_Int32 kTestStr78Len = 12;
+static const sal_Int32 kTestStr79Len = 13;
+static const sal_Int32 kTestStr80Len = 13;
+static const sal_Int32 kTestStr81Len = 3;
+static const sal_Int32 kTestStr82Len = 3;
+static const sal_Int32 kTestStr83Len = 6;
+static const sal_Int32 kTestStr84Len = 8;
+static const sal_Int32 kTestStr85Len = 8;
+static const sal_Int32 kTestStr86Len = 9;
+static const sal_Int32 kTestStr87Len = 9;
+static const sal_Int32 kTestStr88Len = 14;
+static const sal_Int32 kTestStr89Len = 14;
+static const sal_Int32 kTestStr90Len = 17;
+static const sal_Int32 kTestStr91Len = 19;
+static const sal_Int32 kTestStr92Len = 19;
+static const sal_Int32 kTestStr93Len = 20;
+static const sal_Int32 kTestStr94Len = 20;
+static const sal_Int32 kTestStr95Len = 8;
+static const sal_Int32 kTestStr96Len = 8;
+static const sal_Int32 kTestStr97Len = 11;
+static const sal_Int32 kTestStr98Len = 13;
+static const sal_Int32 kTestStr99Len = 13;
+static const sal_Int32 kTestStr100Len = 14;
+static const sal_Int32 kTestStr101Len = 14;
+static const sal_Int32 kTestStr102Len = 4;
+static const sal_Int32 kTestStr103Len = 4;
+static const sal_Int32 kTestStr104Len = 7;
+static const sal_Int32 kTestStr105Len = 9;
+static const sal_Int32 kTestStr106Len = 9;
+static const sal_Int32 kTestStr107Len = 10;
+static const sal_Int32 kTestStr108Len = 10;
+static const sal_Int32 kTestStr109Len = 15;
+static const sal_Int32 kTestStr110Len = 15;
+static const sal_Int32 kTestStr111Len = 18;
+static const sal_Int32 kTestStr112Len = 20;
+static const sal_Int32 kTestStr113Len = 20;
+static const sal_Int32 kTestStr114Len = 21;
+static const sal_Int32 kTestStr115Len = 21;
+static const sal_Int32 kTestStr116Len = 23;
+static const sal_Int32 kTestStr117Len = 24;
+static const sal_Int32 kTestStr118Len = 19;
+static const sal_Int32 kTestStr119Len = 20;
+static const sal_Int32 kTestStr120Len = 30;
+static const sal_Int32 kTestStr121Len = 31;
+static const sal_Int32 kTestStr122Len = 16;
+static const sal_Int32 kTestStr123Len = 21;
+static const sal_Int32 kTestStr124Len = 23;
+static const sal_Int32 kTestStr125Len = 30;
+static const sal_Int32 kTestStr126Len = 12;
+static const sal_Int32 kTestStr127Len = 17;
+static const sal_Int32 kTestStr128Len = 19;
+static const sal_Int32 kTestStr129Len = 26;
+static const sal_Int32 kTestStr130Len = 23;
+static const sal_Int32 kTestStr131Len = 28;
+static const sal_Int32 kTestStr132Len = 30;
+static const sal_Int32 kTestStr133Len = 37;
+static const sal_Int32 kTestStr134Len = 22;
+static const sal_Int32 kTestStr135Len = 24;
+static const sal_Int32 kTestStr136Len = 31;
+static const sal_Int32 kTestStr137Len = 18;
+static const sal_Int32 kTestStr138Len = 20;
+static const sal_Int32 kTestStr139Len = 27;
+static const sal_Int32 kTestStr140Len = 29;
+static const sal_Int32 kTestStr141Len = 31;
+static const sal_Int32 kTestStr142Len = 38;
+static const sal_Int32 kTestStr143Len = 5;
+static const sal_Int32 kTestStr144Len = 1;
+static const sal_Int32 kTestStr145Len = 12;
+static const sal_Int32 kTestStr146Len = 19;
+static const sal_Int32 kTestStr147Len = 19;
+static const sal_Int32 kTestStr148Len = 19;
+static const sal_Int32 kTestStr149Len = 32;
+static const sal_Int32 kTestStr150Len = 32;
+static const sal_Int32 kTestStr151Len = 31;
+static const sal_Int32 kTestStr152Len = 31;
+static const sal_Int32 kTestStr153Len = 31;
+static const sal_Int32 kTestStr154Len = 36;
+static const sal_Int32 kTestStr155Len = 36;
+static const sal_Int32 kTestStr156Len = 36;
+static const sal_Int32 kTestStr157Len = 49;
+static const sal_Int32 kTestStr158Len = 49;
+static const sal_Int32 kTestStr159Len = 49;
+static const sal_Int32 kTestStr160Len = 48;
+static const sal_Int32 kTestStr161Len = 48;
+static const sal_Int32 kTestStr162Len = 48;
+static const sal_Int32 kTestStr163Len = 15;
+static const sal_Int32 kTestStr164Len = 15;
+static const sal_Int32 kTestStr165Len = 15;
+static const sal_Int32 kTestStr166Len = 28;
+static const sal_Int32 kTestStr167Len = 28;
+static const sal_Int32 kTestStr168Len = 28;
+static const sal_Int32 kTestStr169Len = 27;
+static const sal_Int32 kTestStr170Len = 27;
+static const sal_Int32 kTestStr171Len = 27;
+static const sal_Int32 kTestStr1PlusStr6Len = kTestStr1Len + kTestStr6Len;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+static const sal_Int32 uTestStr1Len = 16;
+static const sal_Int32 uTestStr2Len = 32;
+static const sal_Int32 uTestStr3Len = 16;
+static const sal_Int32 uTestStr4Len = 16;
+static const sal_Int32 uTestStr5Len = 16;
+static const sal_Int32 uTestStr9Len = 32;
+static const sal_Int32 uTestStr22Len = 32;
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+const sal_Unicode uTestStr31[]= {0x400,0x410,0x4DF};
+const sal_Unicode uTestStr32[]= {0x9F9F,0xA000,0x8F80,0x9AD9};
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int32 uTestStr31Len = 3;
+static const sal_Int32 uTestStr32Len = 4;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int16 kRadixBinary = 2;
+static const sal_Int16 kRadixOctol = 8;
+static const sal_Int16 kRadixDecimal = 10;
+static const sal_Int16 kRadixHexdecimal = 16;
+static const sal_Int16 kRadixBase36 = 36;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int8 kSInt8Max = SCHAR_MAX;
+static const sal_Int16 kUInt8Max = UCHAR_MAX;
+static const sal_Int16 kSInt16Max = SHRT_MAX;
+static const sal_Int32 kUInt16Max = USHRT_MAX;
+static const sal_Int32 kSInt32Max = INT_MAX;
+static const sal_Int64 kUInt32Max = UINT_MAX;
+static const sal_Int64 kSInt64Max = SAL_CONST_INT64(9223372036854775807);
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kInt32MaxNumsCount = 5;
+
+static const sal_Int32 kInt32MaxNums[kInt32MaxNumsCount] =
+ {
+ kSInt8Max, kUInt8Max,
+ kSInt16Max, kUInt16Max,
+ kSInt32Max
+ };
+
+static const sal_Int32 kInt64MaxNumsCount = 7;
+
+static const sal_Int64 kInt64MaxNums[kInt64MaxNumsCount] =
+ {
+ kSInt8Max, kUInt8Max,
+ kSInt16Max, kUInt16Max,
+ kSInt32Max, kUInt32Max,
+ kSInt64Max
+ };
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int32 kBinaryNumsCount = 16;
+
+static const sal_Int32 kBinaryMaxNumsCount = 7;
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kOctolNumsCount = 16;
+
+static const sal_Int32 kOctolMaxNumsCount = 7;
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kDecimalNumsCount = 16;
+
+static const sal_Int32 kDecimalMaxNumsCount = 7;
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kHexDecimalNumsCount = 16;
+
+static const sal_Int32 kHexDecimalMaxNumsCount = 7;
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kBase36NumsCount = 36;
+
+static const sal_Int32 kBase36MaxNumsCount = 7;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+static const sal_Int32 nDoubleCount=24;
+static const double expValDouble[nDoubleCount]=
+ {
+ 3.0,3.1,3.1415,3.1415926535,3.141592653589793,
+ 3.1415926535897932,3.14159265358979323,3.1,
+ 3.141592653589793238462643,9.1096e-31,2.997925e8,6.241e18,5.381e18,
+ 1.7e-309,6.5822e-16,1.7e+307,2.2e30,3.1,3.1,-3.1,
+ 0.0,0.0,0.0,1.00e+308
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nFloatCount=22;
+static const float expValFloat[nFloatCount] =
+ {
+ 3.0f,3.1f,3.1415f,3.14159f,3.141592f,
+ 3.1415926f,3.14159265f,3.141592653589793238462643f,
+ 6.5822e-16f,9.1096e-31f,2.997925e8f,6.241e18f,
+ 1.00e38f,6.241e-37f,6.241e37f,3.1f,3.1f,-3.1f,
+ 3.1f,0.0f,0.0f,0.0f
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nCharCount=15;
+static const sal_Unicode expValChar[nCharCount] =
+ {
+ 65,97,48,45,95,
+ 21,27,29,
+ 64,10,39,34,
+ 0,0,83
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nDefaultCount=6;
+static const sal_Unicode input1Default[nDefaultCount] =
+ {
+ 77,115,85,119,32,0
+ };
+static const sal_Int32 input2Default[nDefaultCount] =
+ {
+ 0,0,0,0,0,0
+ };
+static const sal_Int32 expValDefault[nDefaultCount] =
+ {
+ 4,9,-1,-1,3,-1
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nNormalCount=10;
+static const sal_Unicode input1Normal[nNormalCount] =
+ {
+ 77,77,77,115,115,115,119,119,0,0
+ };
+static const sal_Int32 input2Normal[nNormalCount] =
+ {
+ 0,32,80,0,13,20,0,80,0,32
+ };
+static const sal_Int32 expValNormal[nNormalCount] =
+ {
+ 4,-1,-1,9,15,-1,-1,-1,-1,-1
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nlastDefaultCount=5;
+static const sal_Unicode input1lastDefault[nlastDefaultCount] =
+ {
+ 77,115,119,32,0
+ };
+static const sal_Int32 input2lastDefault[nlastDefaultCount] =
+ {
+ 31,31,31,31,31
+ };
+static const sal_Int32 expVallastDefault[nlastDefaultCount] =
+ {
+ 4,15,-1,21,-1
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nlastNormalCount=8;
+static const sal_Unicode input1lastNormal[nlastNormalCount] =
+ {
+ 77,77,77,115,115,119,119,0
+ };
+static const sal_Int32 input2lastNormal[nlastNormalCount] =
+ {
+ 29,0,80,31,3,31,80,31
+ };
+static const sal_Int32 expVallastNormal[nlastNormalCount] =
+ {
+ 4,-1,4,15,-1,-1,-1,-1
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nStrDefaultCount=6;
+static const sal_Int32 input2StrDefault[nStrDefaultCount] =
+ {
+ 0,0,0,0,0,0
+ };
+static const sal_Int32 expValStrDefault[nStrDefaultCount] =
+ {
+ 0,4,-1,-1,-1,3
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nStrNormalCount=9;
+static const sal_Int32 input2StrNormal[nStrNormalCount] =
+ {
+ 0,32,0,30,0,0,0,32,0
+ };
+static const sal_Int32 expValStrNormal[nStrNormalCount] =
+ {
+ 0,-1,4,-1,-1,-1,-1,-1,3
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nStrLastDefaultCount=6;
+static const sal_Int32 input2StrLastDefault[nStrLastDefaultCount] =
+ {
+ 31,31,31,31,31,31
+ };
+static const sal_Int32 expValStrLastDefault[nStrLastDefaultCount] =
+ {
+ 0,4,-1,-1,-1,3
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nStrLastNormalCount=12;
+static const sal_Int32 input2StrLastNormal[nStrLastNormalCount] =
+ {
+ 31,0,80,31,2,31,31,31,0,31,31,14
+ };
+static const sal_Int32 expValStrLastNormal[nStrLastNormalCount] =
+ {
+ 0,-1,0,4,-1,-1,-1,-1,-1,3,15,11
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 kNonSInt32Max = INT_MIN;
+static const sal_Int32 kNonSInt16Max = SHRT_MIN;
+//------------------------------------------------------------------------
+#ifdef __cplusplus
+}
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#endif /* _RTL_STRING_CONST_H_ */
+
diff --git a/sal/qa/OStringBuffer/rtl_String_Utils.cxx b/sal/qa/OStringBuffer/rtl_String_Utils.cxx
new file mode 100644
index 000000000000..74b3e80e47c1
--- /dev/null
+++ b/sal/qa/OStringBuffer/rtl_String_Utils.cxx
@@ -0,0 +1,615 @@
+/*************************************************************************
+#
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+#*************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#include <math.h>
+#include <stdlib.h>
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+#ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+#endif
+
+#ifndef _RTL_STRING_HXX_
+ #include <rtl/string.hxx>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _RTL_STRING_UTILS_CONST_H_
+ #include <rtl_String_Utils_Const.h>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+using namespace rtl;
+
+sal_uInt32 AStringLen( const sal_Char *pAStr )
+{
+ sal_uInt32 nStrLen = 0;
+
+ if ( pAStr != NULL )
+ {
+ const sal_Char *pTempStr = pAStr;
+
+ while( *pTempStr )
+ {
+ pTempStr++;
+ } // while
+
+ nStrLen = (sal_uInt32)( pTempStr - pAStr );
+ } // if
+
+ return nStrLen;
+} // AStringLen
+/* disable assignment within condition expression */
+#ifdef WNT
+#pragma warning( disable : 4706 )
+#endif
+sal_Char* cpystr( sal_Char* dst, const sal_Char* src )
+{
+ const sal_Char* psrc = src;
+ sal_Char* pdst = dst;
+
+ while( (*pdst++ = *psrc++) );
+ return ( dst );
+}
+
+sal_Char* cpynstr( sal_Char* dst, const sal_Char* src, sal_uInt32 cnt )
+{
+
+ const sal_Char* psrc = src;
+ sal_Char* pdst = dst;
+ sal_uInt32 len = cnt;
+ sal_uInt32 i;
+
+ if ( len >= AStringLen(src) )
+ {
+ return( cpystr( dst, src ) );
+ }
+
+ // copy string by char
+ for( i = 0; i < len; i++ )
+ *pdst++ = *psrc++;
+ *pdst = '\0';
+
+ return ( dst );
+}
+
+//------------------------------------------------------------------------
+sal_Bool cmpstr( const sal_Char* str1, const sal_Char* str2, sal_uInt32 len )
+{
+ const sal_Char* pBuf1 = str1;
+ const sal_Char* pBuf2 = str2;
+ sal_uInt32 i = 0;
+
+ while ( (*pBuf1 == *pBuf2) && i < len )
+ {
+ (pBuf1)++;
+ (pBuf2)++;
+ i++;
+ }
+ return( i == len );
+}
+//-----------------------------------------------------------------------
+sal_Bool cmpstr( const sal_Char* str1, const sal_Char* str2 )
+{
+ const sal_Char* pBuf1 = str1;
+ const sal_Char* pBuf2 = str2;
+ sal_Bool res = sal_True;
+
+ while ( (*pBuf1 == *pBuf2) && *pBuf1 !='\0' && *pBuf2 != '\0')
+ {
+ (pBuf1)++;
+ (pBuf2)++;
+ }
+ if (*pBuf1 == '\0' && *pBuf2 == '\0')
+ res = sal_True;
+ else
+ res = sal_False;
+ return (res);
+}
+//------------------------------------------------------------------------
+sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2, sal_uInt32 len )
+{
+ const sal_Unicode* pBuf1 = str1;
+ const sal_Unicode* pBuf2 = str2;
+ sal_uInt32 i = 0;
+
+ while ( (*pBuf1 == *pBuf2) && i < len )
+ {
+ (pBuf1)++;
+ (pBuf2)++;
+ i++;
+ }
+ return( i == len );
+}
+
+//-----------------------------------------------------------------------
+sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2 )
+{
+ const sal_Unicode* pBuf1 = str1;
+ const sal_Unicode* pBuf2 = str2;
+ sal_Bool res = sal_True;
+
+ while ( (*pBuf1 == *pBuf2) && *pBuf1 !='\0' && *pBuf2 != '\0')
+ {
+ (pBuf1)++;
+ (pBuf2)++;
+ }
+ if (*pBuf1 == '\0' && *pBuf2 == '\0')
+ res = sal_True;
+ else
+ res = sal_False;
+ return (res);
+}
+
+sal_Char* createName( sal_Char* dst, const sal_Char* meth, sal_uInt32 cnt )
+{
+ sal_Char* pdst = dst;
+ sal_Char nstr[16];
+ sal_Char* pstr = nstr;
+ rtl_str_valueOfInt32( pstr, cnt, 10 );
+
+ cpystr( pdst, meth );
+ cpystr( pdst+ AStringLen(meth), "_" );
+
+ if ( cnt < 100 )
+ {
+ cpystr(pdst + AStringLen(pdst), "0" );
+ }
+ if ( cnt < 10 )
+ {
+ cpystr(pdst + AStringLen(pdst), "0" );
+ }
+
+ cpystr( pdst + AStringLen(pdst), nstr );
+ return( pdst );
+}
+
+//------------------------------------------------------------------------
+// testing the method compareTo( const OString & aStr )
+//------------------------------------------------------------------------
+void makeComment( char *com, const char *str1, const char *str2,
+ sal_Int32 sgn )
+{
+ cpystr(com, str1);
+ int str1Length = AStringLen( str1 );
+ const char *sign = (sgn == 0) ? " == " : (sgn > 0) ? " > " : " < " ;
+ cpystr(com + str1Length, sign);
+ int signLength = AStringLen(sign);
+ cpystr(com + str1Length + signLength, str2);
+ com[str1Length + signLength + AStringLen(str2)] = 0;
+}
+
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToFloatCompare ( const sal_Char *pStr,
+ const float nX,
+ const float nEPS
+ )
+{
+ sal_Bool cmp = sal_False;
+
+ if ( pStr != NULL )
+ {
+ ::rtl::OString aStr(pStr);
+
+ float actNum = 0;
+ float expNum = nX;
+ float eps = nEPS;
+
+ actNum = aStr.toFloat();
+
+ if ( abs( (int)(actNum - expNum) ) <= eps )
+ {
+ cmp = sal_True;
+ } // if
+ } // if
+
+ return cmp;
+} // AStringToFloatCompare
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToDoubleCompare ( const sal_Char *pStr,
+ const double nX,
+ const double nEPS
+ )
+{
+ sal_Bool cmp = sal_False;
+
+ if ( pStr != NULL )
+ {
+ ::rtl::OString aStr(pStr);
+
+ double actNum = 0;
+ double expNum = nX;
+ double eps = nEPS;
+
+ actNum = aStr.toDouble();
+
+ if ( abs( (int)(actNum - expNum) ) <= eps )
+ {
+ cmp = sal_True;
+ } // if
+ } // if
+
+ return cmp;
+} // AStringToDoubleCompare
+
+//------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------
+
+sal_uInt32 UStringLen( const sal_Unicode *pUStr )
+{
+ sal_uInt32 nUStrLen = 0;
+
+ if ( pUStr != NULL )
+ {
+ const sal_Unicode *pTempUStr = pUStr;
+
+ while( *pTempUStr )
+ {
+ pTempUStr++;
+ } // while
+
+ nUStrLen = (sal_uInt32)( pTempUStr - pUStr );
+ } // if
+
+ return nUStrLen;
+} // UStringLen
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringIsValid( const sal_Char *pAStr )
+{
+ if ( pAStr != NULL )
+ {
+ sal_uInt32 nLen = AStringLen( pAStr );
+ sal_uChar uChar = 0;
+
+ while ( *pAStr )
+ {
+ uChar = (unsigned char)*pAStr;
+
+ if ( uChar > 127 )
+ {
+ return sal_False;
+ } // if
+
+ pAStr++;
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nLen > 0 )
+ {
+ nLen--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+ } // if
+
+ return sal_True;
+} // AStringIsValid
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringNIsValid( const sal_Char *pAStr,
+ const sal_uInt32 nStrLen
+ )
+{
+ sal_uInt32 nLen = nStrLen;
+ sal_uChar uChar = 0;
+
+ while ( *pAStr )
+ {
+ uChar = (unsigned char)*pAStr;
+
+ if ( uChar > 127 )
+ {
+ return sal_False;
+ } // if
+
+ pAStr++;
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nLen > 0 )
+ {
+ nLen--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+
+ return sal_True;
+} // AStringNIsValid
+
+//------------------------------------------------------------------------
+
+static inline sal_Int32 ACharToUCharCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr
+ )
+{
+ sal_Int32 nCmp = 0;
+ sal_Int32 nUChar = (sal_Int32)*pUStr;
+ sal_Int32 nChar = (sal_Int32)((unsigned char)*pAStr);
+
+ nCmp = nUChar - nChar;
+
+ return nCmp;
+} // ACharToUCharCompare
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToUStringCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr
+ )
+{
+ sal_Int32 nCmp = kErrCompareAStringToUString;
+
+ if ( ( pUStr != NULL ) && ( pAStr != NULL ) )
+ {
+ nCmp = ACharToUCharCompare( pUStr, pAStr );
+
+ while ( ( nCmp == 0 ) && ( *pAStr ) )
+ {
+ pUStr++;
+ pAStr++;
+
+ nCmp = ACharToUCharCompare( pUStr, pAStr );
+ } // while
+ } // if
+
+ return nCmp;
+} // AStringToUStringCompare
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToUStringNCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr,
+ const sal_uInt32 nAStrCount
+ )
+{
+ sal_Int32 nCmp = kErrCompareNAStringToUString;
+
+ if ( ( pUStr != NULL ) && ( pAStr != NULL ) )
+ {
+ sal_uInt32 nCount = nAStrCount;
+
+ nCmp = ACharToUCharCompare( pUStr, pAStr );
+
+ while ( ( nCmp == 0 ) && ( *pAStr ) && ( nCount ) )
+ {
+ pUStr++;
+ pAStr++;
+
+ nCmp = ACharToUCharCompare( pUStr, pAStr );
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nCount > 0 )
+ {
+ nCount--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+ } // if
+
+ return nCmp;
+} // AStringToUStringNCompare
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToRTLUStringCompare( const rtl_uString *pRTLUStr,
+ const sal_Char *pAStr
+ )
+{
+ sal_Int32 nCmp = kErrCompareAStringToRTLUString;
+
+ if ( ( pRTLUStr != NULL ) && ( pAStr != NULL ) )
+ {
+ rtl_uString *pRTLUStrCopy = NULL;
+
+ rtl_uString_newFromString( &pRTLUStrCopy, pRTLUStr );
+
+ if ( pRTLUStrCopy != NULL )
+ {
+ const sal_Unicode *pUStr = rtl_uString_getStr( pRTLUStrCopy );
+
+ if ( pUStr != NULL )
+ {
+ nCmp = AStringToUStringCompare( pUStr, pAStr );
+ } // if
+
+ rtl_uString_release( pRTLUStrCopy );
+
+ pRTLUStrCopy = NULL;
+ } // if
+ } // if
+
+ return nCmp;
+} // AStringToRTLUStringCompare
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToRTLUStringNCompare( const rtl_uString *pRTLUStr,
+ const sal_Char *pAStr,
+ const sal_uInt32 nAStrCount
+ )
+{
+ sal_Int32 nCmp = kErrCompareNAStringToRTLUString;
+
+ if ( ( pRTLUStr != NULL ) && ( pAStr != NULL ) )
+ {
+ rtl_uString *pRTLUStrCopy = NULL;
+
+ rtl_uString_newFromString( &pRTLUStrCopy, pRTLUStr );
+
+ if ( pRTLUStrCopy != NULL )
+ {
+ const sal_Unicode *pUStr = rtl_uString_getStr( pRTLUStrCopy );
+
+ if ( pUStr != NULL )
+ {
+ nCmp = AStringToUStringNCompare( pUStr, pAStr, nAStrCount );
+ } // if
+
+ rtl_uString_release( pRTLUStrCopy );
+
+ pRTLUStrCopy = NULL;
+ } // if
+ } // if
+
+ return nCmp;
+} // AStringToRTLUStringNCompare
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToUStringCopy( sal_Unicode *pDest,
+ const sal_Char *pSrc
+ )
+{
+ sal_Bool bCopied = sal_False;
+ sal_uInt32 nCount = AStringLen( pSrc );
+ sal_uInt32 nLen = nCount;
+
+ if ( ( pDest != NULL )
+ && ( pSrc != NULL )
+ && ( AStringNIsValid( pSrc, nLen ) )
+ )
+ {
+ for (;;)
+ {
+ *pDest = (unsigned char)*pSrc;
+
+ pDest++;
+ pSrc++;
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nCount > 0 )
+ {
+ nCount--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+
+ if ( nCount == 0 )
+ {
+ bCopied = sal_True;
+ } // if
+ } // if
+
+ return bCopied;
+} // AStringToUStringCopy
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToUStringNCopy( sal_Unicode *pDest,
+ const sal_Char *pSrc,
+ const sal_uInt32 nSrcLen
+ )
+{
+ sal_Bool bCopied = sal_False;
+ sal_uInt32 nCount = nSrcLen;
+ sal_uInt32 nLen = nSrcLen;
+
+ if ( ( pDest != NULL )
+ && ( pSrc != NULL )
+ && ( AStringNIsValid( pSrc, nLen ) )
+ )
+ {
+ for (;;)
+ {
+ *pDest = (unsigned char)*pSrc;
+
+ pDest++;
+ pSrc++;
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nCount > 0 )
+ {
+ nCount--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+
+ if ( nCount == 0 )
+ {
+ bCopied = sal_True;
+ } // if
+ } // if
+
+ return bCopied;
+} // AStringToUStringNCopy
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
diff --git a/sal/qa/OStringBuffer/rtl_String_Utils.hxx b/sal/qa/OStringBuffer/rtl_String_Utils.hxx
new file mode 100644
index 000000000000..b3ba990eb87e
--- /dev/null
+++ b/sal/qa/OStringBuffer/rtl_String_Utils.hxx
@@ -0,0 +1,138 @@
+/*************************************************************************
+#
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+#*************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _RTL_STRING_UTILS_HXX_
+#define _RTL_STRING_UTILS_HXX_
+
+#ifdef __cplusplus
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#include <math.h>
+#include <stdlib.h>
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+#ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+#endif
+
+#ifndef _RTL_STRING_HXX_
+ #include <rtl/string.hxx>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+sal_Char* cpystr( sal_Char* dst, const sal_Char* src );
+sal_Char* cpynstr( sal_Char* dst, const sal_Char* src, sal_uInt32 cnt );
+
+sal_Bool cmpstr( const sal_Char* str1, const sal_Char* str2, sal_uInt32 len );
+sal_Bool cmpstr( const sal_Char* str1, const sal_Char* str2 );
+sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2, sal_uInt32 len );
+sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2 );
+
+sal_Char* createName( sal_Char* dst, const sal_Char* src, sal_uInt32 cnt );
+void makeComment(char *com, const char *str1, const char *str2, sal_Int32 sgn);
+
+
+sal_uInt32 AStringLen( const sal_Char *pAStr );
+
+sal_uInt32 UStringLen( const sal_Unicode *pUStr );
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToFloatCompare ( const sal_Char *pStr,
+ const float nX,
+ const float nEPS
+ );
+
+sal_Bool AStringToDoubleCompare ( const sal_Char *pStr,
+ const double nX,
+ const double nEPS
+ );
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringIsValid( const sal_Char *pAStr );
+
+sal_Bool AStringNIsValid( const sal_Char *pAStr,
+ const sal_uInt32 nStrLen
+ );
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToUStringCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr
+ );
+
+sal_Int32 AStringToUStringNCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr,
+ const sal_uInt32 nAStrCount
+ );
+
+sal_Int32 AStringToRTLUStringCompare( const rtl_uString *pRTLUStr,
+ const sal_Char *pAStr
+ );
+
+sal_Int32 AStringToRTLUStringNCompare( const rtl_uString *pRTLUStr,
+ const sal_Char *pAStr,
+ const sal_uInt32 nAStrCount
+ );
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToUStringCopy( sal_Unicode *pDest,
+ const sal_Char *pSrc
+ );
+
+sal_Bool AStringToUStringNCopy( sal_Unicode *pDest,
+ const sal_Char *pSrc,
+ const sal_uInt32 nSrcLen
+ );
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#endif /* __cplusplus */
+
+#endif /* _RTL_STRING_UTILS_HXX */
+
+
+
+
+
+
+
diff --git a/sal/qa/OStringBuffer/rtl_String_Utils_Const.h b/sal/qa/OStringBuffer/rtl_String_Utils_Const.h
new file mode 100644
index 000000000000..29d6eb69c1fc
--- /dev/null
+++ b/sal/qa/OStringBuffer/rtl_String_Utils_Const.h
@@ -0,0 +1,74 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _RTL_STRING_UTILS_CONST_H_
+#define _RTL_STRING_UTILS_CONST_H_
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int32 kErrCompareAStringToUString = -2;
+static const sal_Int32 kErrCompareNAStringToUString = -3;
+static const sal_Int32 kErrCompareAStringToRTLUString = -4;
+static const sal_Int32 kErrCompareNAStringToRTLUString = -5;
+static const sal_Int32 kErrAStringToByteStringCompare = -6;
+static const sal_Int32 kErrAStringToByteStringNCompare = -7;
+static const sal_Int32 kErrCompareAStringToString = -8;
+static const sal_Int32 kErrCompareNAStringToString = -9;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+}
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#endif /* _RTL_STRING_UTILS_CONST_H_ */
+
+
+
diff --git a/sal/qa/buildall.pl b/sal/qa/buildall.pl
new file mode 100644
index 000000000000..03eadb1b7fc0
--- /dev/null
+++ b/sal/qa/buildall.pl
@@ -0,0 +1,507 @@
+eval 'exec perl -wS $0 ${1+"$@"}'
+ if 0;
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#************************************************************************
+
+# #!/usr/bin/perl -w
+
+use strict;
+use POSIX;
+use Cwd;
+use File::Path;
+use English;
+use Cwd 'chdir';
+
+my $cwd = getcwd();
+
+# Prototypes
+sub initEnvironment();
+sub main($);
+sub checkForKillobj();
+sub checkARGVFor($);
+
+my $g_sTempDir = "";
+my $FS = "";
+
+my $nGlobalFailures = 0;
+
+my %libraryRunThrough;
+my $bBuildAll = 0;
+
+# LLA: this does not exist, ... use a little bit simpler method.
+# use File::Temp qw/ :POSIX /;
+
+my $params;
+my $param;
+
+if ($#ARGV < 0)
+{
+ $params = "test "; # debug=t TESTOPTADD=\"-boom\" TESTOPTADD=\"-noerroronexit\"
+
+ # my $nNumber = 55;
+ # my $sLocalParams = $params;
+ # $sLocalParams =~ s/test\s/test$nNumber /;
+ # print "Testparams: $sLocalParams\n";
+ # exit 1;
+ print "Default ";
+}
+else
+{
+ # special hack!
+ if (checkForKillobj() == 1)
+ {
+ $params = "killobj";
+ }
+ elsif (checkARGVFor("buildall") == 1)
+ {
+ $bBuildAll = 1;
+ $params = "test";
+ }
+ else
+ {
+ # always run test, but envelope the other in 'TESTOPT="..."'
+ $params = "test TESTOPT=\"";
+
+ foreach $param (@ARGV)
+ {
+ $params = $params . " " . $param;
+ }
+ $params = $params . "\"";
+ }
+ print "User defined ";
+}
+
+print "parameters for dmake: $params\n";
+
+initEnvironment();
+main($params);
+
+# ------------------------------------------------------------------------------
+sub checkARGVFor($)
+{
+ my $sCheckValue = shift;
+ my $sLocalParam;
+ my $nBackValue = 0;
+ foreach $sLocalParam (@ARGV)
+ {
+ if ($sLocalParam =~ /^${sCheckValue}$/)
+ {
+ $nBackValue = 1;
+ last;
+ }
+ }
+ return $nBackValue;
+}
+# ------------------------------------------------------------------------------
+sub checkForKillobj()
+{
+ my $sLocalParam;
+ my $nBackValue = 0;
+ foreach $sLocalParam (@ARGV)
+ {
+ if ($sLocalParam =~ /^killobj$/)
+ {
+ $nBackValue = 1;
+ last;
+ }
+ }
+ return $nBackValue;
+}
+
+# ------------------------------------------------------------------------------
+sub initEnvironment()
+{
+ my $gui = $ENV{GUI};
+ # no error output in forms of message boxes
+ $ENV{'DISABLE_SAL_DBGBOX'}="t";
+
+ SWITCH: {
+ if ( $gui eq "WNT" ) {
+ $FS = "\\";
+ $g_sTempDir = $ENV{TMP} ? "$ENV{TMP}${FS}" : "c:${FS}tmp${FS}";
+ last SWITCH;
+ }
+ if ( $gui eq "WIN" ) {
+ $FS = "\\";
+ $g_sTempDir = $ENV{TMP} ? "$ENV{TMP}${FS}" : "c:${FS}tmp${FS}";
+ last SWITCH;
+ }
+ if ( $gui eq "OS2" ) {
+ $FS = "\\";
+ $g_sTempDir = $ENV{TMP} ? "$ENV{TMP}${FS}" : "c:${FS}tmp${FS}";
+ last SWITCH;
+ }
+ if ( $gui eq "UNX" ) {
+ $FS = "/";
+ $g_sTempDir = $ENV{TMP} ? "$ENV{TMP}${FS}" : "${FS}tmp${FS}";
+ last SWITCH;
+ }
+ print STDERR "buildall.pl: unkown platform\n";
+ exit(1);
+ }
+}
+# ------------------------------------------------------------------------------
+
+sub trim($)
+{
+ my $oldstr = shift;
+ $oldstr =~ s/^\s*(.*?)\s*$/$1/;
+ return $oldstr;
+}
+
+# ------------------------------------------------------------------------------
+sub getLibName($)
+{
+ my $sFile = shift;
+ if ($OSNAME eq "linux" || $OSNAME eq "solaris")
+ {
+ return "lib" . $sFile . ".so";
+ }
+ if ($OSNAME eq "MSWin32" || $OSNAME eq "OS2")
+ {
+ return $sFile . ".dll";
+ }
+ return $sFile;
+}
+# ------------------------------------------------------------------------------
+sub giveOutAll($)
+{
+ my $sFailureFile = shift;
+ local *IN;
+ if (! open(IN, $sFailureFile))
+ {
+ print "ERROR: Can't open output file $sFailureFile\n";
+ return;
+ }
+ my $line;
+ while ($line = <IN>)
+ {
+ chomp($line);
+ print "$line\n";
+ }
+ close(IN);
+}
+# ------------------------------------------------------------------------------
+sub giveOutFailures($$)
+{
+ my $sTest = shift;
+ my $sFailureFile = shift;
+
+ my $bBegin = 0;
+ my $nFailures = 0;
+
+ my $line;
+ local *IN;
+ if (! open(IN, $sFailureFile))
+ {
+ print "ERROR: Can't open output file $sFailureFile\n";
+ return;
+ }
+
+ my $bStartUnitTest = 0;
+ while ($line = <IN>)
+ {
+ chomp($line);
+ if ( $line =~ /^- start unit test/)
+ {
+ $bStartUnitTest = 1;
+ }
+ }
+ close(IN);
+
+ if ($bStartUnitTest == 0)
+ {
+ print "\nFailure: Unit test not started. Maybe compiler error.\n";
+ giveOutAll($sFailureFile);
+ $nFailures++;
+ # exit(1);
+ }
+ else
+ {
+ open(IN, $sFailureFile);
+ # check if testshl2 was started
+ while ($line = <IN>)
+ {
+ chomp($line);
+
+ # handling of the states
+ if ( $line =~ /^\# -- BEGIN:/)
+ {
+ $bBegin = 1;
+ }
+ elsif ( $line =~ /^\# -- END:/)
+ {
+ $bBegin = 0;
+ }
+ else
+ {
+ if ($bBegin == 1)
+ {
+ print "$line\n";
+ $nFailures++;
+ }
+ }
+ }
+ close(IN);
+ }
+
+ if ($nFailures > 0)
+ {
+ # extra return for a better output
+ print "\nFailures occured: $nFailures\n";
+ print "The whole output can be found in $sFailureFile\n";
+ print "\n";
+
+ # Statistics
+ $nGlobalFailures += $nFailures;
+ }
+}
+# ------------------------------------------------------------------------------
+sub printOnLibrary($)
+{
+ my $sTarget = shift;
+ print " on library: " . getLibName($sTarget);
+}
+# ------------------------------------------------------------------------------
+sub runASingleTest($$)
+{
+ my $sTarget = shift;
+ my $params = shift;
+ my $dmake = "dmake $params";
+
+ my $sLogPath = $g_sTempDir . "dmake_out_$$";
+ mkdir($sLogPath);
+ my $sLogFile = $sLogPath . "/" . $sTarget . ".out";
+
+ # due to the fact, a library name in one project is distinct, we should remember all already run through libraries and
+ # supress same libraries, if they occur one more.
+
+ if (exists $libraryRunThrough{getLibName($sTarget)})
+ {
+ # already done
+ return;
+ }
+ printOnLibrary($sTarget);
+ print "\n";
+
+# redirect tcsh ">&" (stdout, stderr)
+# redirect 4nt ">" (stdout), "2>" (stderr)
+# print "OSNAME: $OSNAME\n";
+# LLA: redirect check canceled, seems to be not work as I want.
+# my $redirect = "";
+# if ($OSNAME eq "linux" || $OSNAME eq "solaris")
+# {
+# # print "UNIX, linux or solaris\n";
+# $redirect = '>>&!' . $sLogFile;
+# }
+# else
+# {
+# if ($OSNAME eq "MSWin32" || $OSNAME eq "OS2")
+# {
+# # test
+# $redirect = ">>$sLogFile 2>>$sLogFile";
+# }
+# }
+# print "$dmake $redirect\n";
+
+# LLA: so system does also not work as I imagine
+# system("$dmake $redirect");
+
+# LLA: next check, use open with pipe
+
+ local *LOGFILE;
+ if (! open( LOGFILE, '>' . "$sLogFile"))
+ {
+ print "ERROR: can't open logfile: $sLogFile\n";
+ return;
+ }
+
+ my $line;
+ local *DMAKEOUTPUT;
+ if (! open( DMAKEOUTPUT, "$dmake 2>&1 |"))
+ {
+ print "ERROR: can't open dmake\n";
+ return;
+ }
+ while ($line = <DMAKEOUTPUT>)
+ {
+ chomp($line);
+ print LOGFILE "$line\n";
+ }
+ close(DMAKEOUTPUT);
+ close(LOGFILE);
+
+ giveOutFailures($sTarget, $sLogFile);
+
+ $libraryRunThrough{getLibName($sTarget)} = "done";
+}
+
+# ------------------------------------------------------------------------------
+sub interpretLine($)
+{
+ my $line = shift;
+
+ my $path;
+ my $file;
+
+ if ($line =~ /^\#/ || $line =~ /^$/)
+ {
+ # remark or empty line
+ }
+ else
+ {
+ # special format, $file == $path
+ ($path, $file) = split(/;/, $line);
+ if (! $file)
+ {
+ $file = $path;
+ }
+ $file = trim($file);
+ $path = trim($path);
+ }
+ return $path, $file;
+}
+# ------------------------------------------------------------------------------
+sub runTestsOnPath($$$)
+{
+ my $path = shift;
+ my $file = shift;
+ my $params = shift;
+
+ # empty values
+ if (!$path || $path eq "")
+ {
+ # DBG: print "empty path '$path'\n";
+ return;
+ }
+ if (!$file || $file eq "")
+ {
+ # DBG: print "empty file '$file'\n";
+ return;
+ }
+
+# print "File: '$file', Path: '$path'\n";
+ print "Work in directory: $path\n";
+ my $newpath = $cwd . $FS . $path;
+# print "chdir to $newpath\n";
+
+ my $error = chdir($newpath);
+ cwd();
+
+ # run through the hole makefile.mk and check if SHL<D>TARGET = ... exist, for every target call "dmake test<D>"
+
+ local *MAKEFILE_MK;
+ if (! open(MAKEFILE_MK, "makefile.mk"))
+ {
+ print "ERROR: can't open makefile.mk in path: $newpath\n";
+ print "please check your libs2test.txt file in qa directory.\n";
+ }
+ my $line;
+ my $nNumber;
+ my $sTarget;
+ my $sLocalParams;
+
+ while($line = <MAKEFILE_MK>)
+ {
+ chomp($line);
+
+ if ($line =~ /SHL(\d)TARGET=(.*)/)
+ {
+ $nNumber = $1;
+ $sTarget = trim($2);
+
+ # DBG: print "test$number is lib: $target\n";
+ $sLocalParams = $params . " "; # append a whitespace, so we can check if 'test' exist without additional digits
+ $sLocalParams =~ s/test\s/test$nNumber/;
+ # DBG: print "$sLocalParams\n";
+ if ($bBuildAll == 1 ||
+ $file eq $sTarget)
+ {
+ # print "runASingleTest on Target: $sTarget 'dmake $sLocalParams'\n";
+ runASingleTest($sTarget, $sLocalParams);
+ }
+ else
+ {
+ # printOnLibrary($sTarget);
+ # print " suppressed, not in libs2test.txt\n";
+ }
+ }
+ }
+ close(MAKEFILE_MK);
+}
+
+# ------------------------------------------------------------------------------
+
+sub main($)
+{
+ my $params = shift;
+# my $sLogFile = shift; # "buildall_$$.out";
+ local *LIBS2TEST;
+ my $filename = "libs2test.txt";
+ my $line;
+
+ open(LIBS2TEST, $filename) || die "can't open $filename\n";
+
+ while($line = <LIBS2TEST>)
+ {
+ chomp($line);
+ # DOS Hack grrrr...
+ while ($line =~ /
+$/)
+ {
+ $line = substr($line, 0, -1);
+ }
+
+ # print "$line\n";
+ my $path;
+ my $file;
+ ($path, $file) = interpretLine($line);
+ runTestsOnPath($path, $file, $params);
+ }
+ close(LIBS2TEST);
+
+ print "\nComplete logging information will be found in dir: ".$g_sTempDir."dmake_out_$$/\n";
+
+ if ($nGlobalFailures > 0)
+ {
+ print "\nFailures over all occured: $nGlobalFailures\n";
+ print "\nPASSED FAILED.\n";
+ }
+ else
+ {
+ print "\nPASSED OK.\n";
+ }
+}
+
+# ------------------------------------------------------------------------------
+
+# TODO:
+# -verbose
+# -fan - \ | /
+
+# END!
+
diff --git a/sal/qa/export.map b/sal/qa/export.map
new file mode 100755
index 000000000000..3308588ef6f8
--- /dev/null
+++ b/sal/qa/export.map
@@ -0,0 +1,34 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+UDK_3_0_0 {
+ global:
+ cppunitTestPlugIn;
+
+ local:
+ *;
+};
diff --git a/sal/qa/helper/gcov/build_coverage b/sal/qa/helper/gcov/build_coverage
new file mode 100755
index 000000000000..8948789a87e7
--- /dev/null
+++ b/sal/qa/helper/gcov/build_coverage
@@ -0,0 +1,23 @@
+
+# this is a helper, to build sal with the right compiler parameters
+# IMPORTANT, this works only within Linux
+
+if ( `uname` == "Linux" ) then
+ echo "running on Linux Intel, ok."
+
+ build killobj
+
+ # setenv OLDCFLAGS $ENVCFLAGS
+
+ setenv ENVCFLAGS "-fprofile-arcs -ftest-coverage"
+
+ build
+
+ # setenv ENVCFLAGS $OLDCFLAGS
+
+else
+
+ echo "Sorry, gcov works only within Linux environment."
+
+endif
+
diff --git a/sal/qa/helper/gcov/deprecated.txt b/sal/qa/helper/gcov/deprecated.txt
new file mode 100644
index 000000000000..a46a94acca65
--- /dev/null
+++ b/sal/qa/helper/gcov/deprecated.txt
@@ -0,0 +1,213 @@
+# contain all functions, which are mark as deprecated
+# this function will removed from the allexportlist
+# Format of a line MUST be / (.*);/
+
+ rtl_ustr_trim;
+ rtl_str_trim;
+
+# since 16.9.2003
+# Function List:
+# A. deprecated functions:
+# 1) Profile class and all its sub C API:
+ osl_openProfile;
+ osl_closeProfile;
+ osl_flushProfile;
+ osl_readProfileString;
+
+ osl_readProfileBool;
+ osl_readProfileIdent;
+ osl_writeProfileString;
+
+ osl_writeProfileBool;
+ osl_writeProfileIdent;
+ osl_removeProfileEntry;
+
+ osl_getProfileSectionEntries;
+ osl_getProfileSections;
+
+# 2) VolumeDevice class and all this sub C API:
+ osl_unmountVolumeDevice;
+ osl_automountVolumeDevice;
+ osl_releaseVolumeDeviceHandle;
+
+ osl_acquireVolumeDeviceHandle;
+ osl_getVolumeDeviceMountPath;
+
+# 3) in FileBase class:
+ osl_getCanonicalName;
+
+# B. untested functions:
+# functions need Client/Server model and blocking mode of transmission. some of the functions
+# can not run through on testshl2 env while the same code can run successfully in normal seperate
+# files.
+# 1) in DatagramSocket class:
+# osl_receiveFromSocket;
+# osl_sendToSocket;
+
+# 2) in StreamSocket class:
+# osl_readSocket;
+# osl_writeSocket;
+# osl_receiveSocket;
+# osl_sendSocket;
+
+# 3) in Socket class:
+ osl_isExceptionPending;
+# osl_shutdownSocket;
+
+# 4) in Pipe class:
+# osl_acceptPipe;
+
+# 5) in StreamPipe class:
+# osl_readPipe;
+# osl_writePipe;
+# osl_receivePipe;
+# osl_sendPipe;
+
+#C. unreachable functions
+# (*)in .map file but does not appear in.hxx header file thus unreachable,
+# mostly for internal use, can not be reached by accessing class, so need
+# not be tested.
+# 1) in file module*:
+ osl_abbreviateSystemPath;
+
+# 2) in socket module*:
+ osl_addToSocketSet;
+ osl_clearSocketSet;
+ osl_createSocketSet;
+ osl_destroySocketSet;
+ osl_isInSocketSet;
+ osl_removeFromSocketSet
+
+ osl_createHostAddrByName;
+ osl_createHostAddrByAddr;
+
+ osl_createHostAddr;
+ osl_copyHostAddr;
+ osl_destroyHostAddr;
+ osl_getHostnameOfHostAddr;
+ osl_getSocketAddrOfHostAddr;
+ osl_createInetBroadcastAddr;
+
+ osl_demultiplexSocketEvents;
+ osl_getDottedInetAddrOfSocketAddr;
+ osl_getFamilyOfSocketAddr;
+
+# 3) in thread module*:
+ osl_createThread;
+ osl_setThreadTextEncoding;
+
+# or (#)does not wrapper into a class, only in C API. does not in our Class
+# check list.
+# 1) all diagnose module#:
+ osl_breakDebug;
+ osl_assertFailedLine;
+ osl_trace;
+ osl_reportError;
+
+ osl_setDebugMessageFunc;
+
+# 2) all signal module#:
+ osl_addSignalHandler;
+ osl_removeSignalHandler;
+ osl_raiseSignal;
+
+# 3) all time module#:
+ osl_getSystemTime;
+ osl_getDateTimeFromTimeValue;
+
+ osl_getTimeValueFromDateTime;
+ osl_getLocalTimeFromSystemTime;
+
+ osl_getSystemTimeFromLocalTime;
+ osl_getGlobalTimer;
+
+# 4) all process module#:
+ osl_executeProcess;
+ osl_executeProcess_WithRedirectedIO;
+
+ osl_terminateProcess;
+ osl_getProcess;
+
+ osl_freeProcessHandle;
+ osl_joinProcess;
+ osl_joinProcessWithTimeout;
+
+ osl_getProcessInfo;
+ osl_getExecutableFile;
+ osl_getCommandArgCount;
+
+ osl_getCommandArg;
+ osl_getEnvironment;
+ osl_getProcessWorkingDir;
+
+ osl_getProcessLocale;
+ osl_setProcessLocale;
+ osl_sendResourcePipe;
+
+ osl_receiveResourcePipe;
+
+# 5) all util module#:
+ osl_getEthernetAddress;
+
+
+
+###
+# LLA:
+# this functions are not deprecated, they only marked as deprecated, to say that
+# there is no test need.
+###
+ rtl_zeroMemory;
+ rtl_fillMemory;
+ rtl_copyMemory;
+ rtl_moveMemory;
+ rtl_compareMemory;
+ rtl_findInMemory;
+
+# LLA:
+# Marked as deprecated by Stephan Bergmann
+
+ rtl_byte_sequence_reference2One;
+ rtl_byte_sequence_realloc;
+ rtl_byte_sequence_acquire;
+ rtl_byte_sequence_release;
+ rtl_byte_sequence_construct;
+ rtl_byte_sequence_constructNoDefault;
+ rtl_byte_sequence_constructFromArray;
+ rtl_byte_sequence_assign;
+ rtl_byte_sequence_equals;
+ rtl_byte_sequence_getConstArray;
+ rtl_byte_sequence_getLength;
+
+# LLA:
+# old test environment need no extra test
+ rtl_tres_create;
+ rtl_tres_destroy;
+
+# LLA:
+# found in source code, marked as deprecated
+# rtl_locale_getDefault;
+# rtl_locale_setDefault;
+
+# LLA:
+# marked as deprecated, due to the fact there is no access from outside
+# so this functions are not really accessable
+# They are used in rtl/source/locale.c
+ rtl_hashentry_destroy;
+ rtl_hashfunc;
+ rtl_hashtable_add;
+ rtl_hashtable_destroy;
+ rtl_hashtable_find;
+ rtl_hashtable_grow;
+ rtl_hashtable_init;
+
+# LLA:
+# marked as deprecated by Joachim Lingner 20040414
+ rtl_moduleCount_acquire;
+ rtl_moduleCount_release;
+ rtl_moduleCount_canUnload;
+ rtl_registerModuleForUnloading;
+ rtl_unregisterModuleForUnloading;
+ rtl_unloadUnusedModules;
+ rtl_addUnloadingListener;
+ rtl_removeUnloadingListener;
+
diff --git a/sal/qa/helper/gcov/gcov_all b/sal/qa/helper/gcov/gcov_all
new file mode 100755
index 000000000000..dad1f736c688
--- /dev/null
+++ b/sal/qa/helper/gcov/gcov_all
@@ -0,0 +1,15 @@
+#!/bin/bash
+# $Id: gcov_all,v 1.4 2005-11-02 17:23:43 kz Exp $
+# This helper run lists all c and cxx files from selected directories.
+
+# PRJ points to the flat project directory
+PRJ='../../..'
+
+# selected directories
+FILES=`/bin/ls $PRJ/osl/unx/*.c $PRJ/osl/unx/*.cxx $PRJ/rtl/source/*.c $PRJ/rtl/source/*.cxx $PRJ/osl/all/*.c $PRJ/osl/all/*.cxx $PRJ/textenc/*.c`
+
+# Use gcov_filter on every c/cxx file.
+for file in $FILES; do
+ # echo $file
+ perl gcov_filter.pl -o $PRJ/unxlngi6/slo -i $PRJ/util/sal.map $file $*
+done
diff --git a/sal/qa/helper/gcov/gcov_filter.pl b/sal/qa/helper/gcov/gcov_filter.pl
new file mode 100755
index 000000000000..5074c0251ce5
--- /dev/null
+++ b/sal/qa/helper/gcov/gcov_filter.pl
@@ -0,0 +1,427 @@
+#!/usr/bin/perl -w
+#
+# $Id: gcov_filter.pl,v 1.4 2005-11-02 17:23:57 kz Exp $
+#
+
+# GCOV_FILTER
+#
+# Helper to filter the gcov output.
+# Handle a compare between the hole gcov output and a given select list of exported functions.
+#
+# Q: Why perl?
+# A: regexp ;-)
+#
+
+
+use strict;
+use File::Basename;
+use Getopt::Long;
+
+# Global constants
+our $version_info = 'gcov helper $Revision: 1.4 $ ';
+our $help; # Help option flag
+our $version; # Version option flag
+our $cwd = `pwd`; # current working directory
+chomp($cwd);
+# our $tool_dir = dirname($0);
+# our $tool_file = basename($0);
+
+# our $output_filename;
+our $input_allfunc;
+# our $input_filename;
+
+our $allfuncinfo; # allfuncinfo option flag
+our $showallfunc; # showallfunc option flag
+our $no_percentage; # no_percentage option flag
+our $donotfilter; # donotfilter option flag
+our $objectdir;
+
+# Prototypes
+sub print_usage(*);
+sub read_gcov_function_file($);
+sub get_PRJ_from_makefile_mk();
+# sub read_ExportedFunctionList();
+sub read_List($);
+
+# if (! ($tool_dir =~ /^\/(.*)$/))
+# {
+# $tool_dir = "$cwd/$tool_dir";
+# }
+
+# Parse command line options
+if (!GetOptions( "input-allfunc=s" => \$input_allfunc,
+ "allfuncinfo" => \$allfuncinfo,
+ "showallfunc" => \$showallfunc,
+ "no-percentage" => \$no_percentage,
+ "do-not-filter" => \$donotfilter,
+ "objectdir=s" => \$objectdir,
+ "help" => \$help,
+ "version" => \$version
+ ))
+{
+ print_usage(*STDERR);
+ exit(1);
+}
+
+# Check for help option
+if ($help)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+
+# Check for version option
+if ($version)
+{
+ print("$version_info\n");
+ exit(0);
+}
+
+# check if enough parameters
+if ($#ARGV < 0)
+{
+ print("No input filename specified\n");
+ print_usage(*STDERR);
+ exit(1);
+}
+
+# special case:
+# the filename contains a . or '/' at the beginning
+my $startdir = $ARGV[0];
+if ( ($startdir =~ /^\.\./) ||
+ ($startdir =~ /^\//) )
+{
+ $startdir = dirname($startdir);
+ # print("start directory is $startdir\n");
+ # chdir $startdir;
+}
+else
+{
+ $startdir = "";
+}
+
+# check for sal.map
+if ( ! $input_allfunc )
+{
+ # this is a try, to get the project directory form a found makefile.mk
+ # may work, but fails due to some disunderstandings may be problems in perl :-(
+ my $sDir = get_PRJ_from_makefile_mk();
+ # chomp($sDir);
+ # HDW: print("PRJ is $dir\n");
+
+ # $sDir2 = "../..";
+ my $sMapFile = "$sDir" . "/util/sal.map";
+ # $sMapFile = "$sDir2" . "/util/sal.map";
+
+ if ( -e $sMapFile)
+ {
+ $input_allfunc = $sMapFile;
+ }
+ else
+ {
+ print("No input-allfunc filename specified\n");
+ print_usage(*STDERR);
+ exit(1);
+ }
+}
+our @aDeprecatedList;
+our @aExportedFunctionList;
+# read_ExportedFunctionList();
+@aExportedFunctionList = read_List($input_allfunc);
+@aDeprecatedList = read_List("deprecated.txt");
+
+if ($allfuncinfo)
+{
+ print("Count of all functions: $#aExportedFunctionList\n");
+ exit(0);
+}
+
+if ($showallfunc)
+{
+ my $func;
+ foreach $func (@aExportedFunctionList)
+ {
+ print("$func\n");
+ }
+ exit(0);
+}
+
+# back to current directory
+# this chdir was for a before chdir (in $startdir creation) but due to the fact,
+# that the get_PRJ_from_makefile_mk works but the after concat of strings not, this
+# chdir is also remarked.
+# chdir $cwd;
+
+# HWD: print "count of param: \n";
+# $input_filename = $ARGV[0];
+
+my $nCount = $#ARGV + 1;
+my $nIdx;
+
+for ($nIdx = 0; $nIdx < $nCount ; ++$nIdx)
+{
+ my $file = $ARGV[$nIdx];
+ # print("processing: $file\n");
+
+ # change directory, to the current file, due to the fact, that we may be need to call gcov
+ # and gcov will create some extra files, like *.gcov near the current file.
+ # if ( $startdir ne "" )
+ # {
+ # chdir $startdir;
+ # $file = basename($file);
+ # }
+
+ my $OBJECTS="";
+ if ($objectdir)
+ {
+ $OBJECTS = "-o " . $objectdir;
+ }
+
+ if (! ($file =~ /\.f$/ ))
+ {
+ my $filef = "$file.f";
+ # if (! -e $filef )
+ # {
+ # print "gcov $OBJECTS -l -f $file >$filef\n";
+ my $blah = `gcov $OBJECTS -n -f $file >$filef`;
+ # }
+ $file = $filef;
+ }
+ read_gcov_function_file($file);
+
+ # go back to old directory, because it's possible to change relative to an other directory.
+ if ( $startdir ne "" )
+ {
+ chdir $cwd;
+ }
+}
+
+# print "$tool_dir\n";
+# print "all is right\n";
+exit(0);
+
+
+# --------------------------------------------------------------------------------
+# Read the map file, which should contain all exported functions.
+sub read_List($)
+{
+ local *INPUT_HANDLE;
+ my $filename = $_[0];
+ my @list;
+ my $line = "";
+ open(INPUT_HANDLE, $filename);
+ # or die("ERROR: cannot open $filename!\n");
+
+ while ($line = <INPUT_HANDLE>)
+ {
+ chomp($line);
+ # reg exp: [spaces]functionname[semicolon][line end]
+ if ($line =~ /^\s+(\w*);$/)
+ {
+ # print("$1\n");
+ push(@list, $1);
+ }
+ }
+ close(INPUT_HANDLE);
+ return @list;
+}
+
+# --------------------------------------------------------------------------------
+# Helper function, test is a given value is found in the global exported function list.
+# the given value format could be a simple function name
+# or a prototype
+# e.g.
+# osl_getSystemPathFromFileURL
+# or
+# void getSystemPathFromFileURL( const char* rtl_...)
+#
+sub contain_in_List($$)
+{
+ my $func;
+ my $value = $_[0];
+ my $list = $_[1];
+
+ if ($donotfilter)
+ {
+ return $value;
+ }
+
+ foreach $func (@$list) # (@aExportedFunctionList)
+ {
+ # first try, direct check
+ if ($value eq $func)
+ {
+ # HWD: print("$value eq $func\n");
+ return $value;
+ }
+
+ # value not found, second try, may be we found it if we search word wise.
+ # helper, to insert a space after the word, before '('
+ $value =~ s/\(/ \(/g;
+ # may be here we should replace all white spaces by ' '
+
+ # split by 'space'
+ my @list = split(' ', $value);
+ for(@list)
+ {
+ # HWD: print "$list[$n]\n";
+ if ($_ eq $func)
+ {
+ # HWD: print ("found $func in $value\n");
+ return $_;
+ }
+ }
+ }
+ # not found
+ return "";
+}
+# --------------------------------------------------------------------------------
+# Read the gcov function (gcov -f) file
+# and compare line by line with the export function list
+# so we get a list of functions, which are only exported, and not all stuff.
+# sample of output
+# new gcov gcc 3.4 format
+sub read_gcov_function_file($)
+{
+ local *INPUT_HANDLE;
+ my $file = $_[0];
+ my $line = "";
+ open(INPUT_HANDLE, $file)
+ or die("ERROR: cannot open $file!\n");
+
+ while ($line = <INPUT_HANDLE>)
+ {
+ chomp($line);
+ # sample line (for reg exp:)
+ # 100.00% of 3 source lines executed in function osl_thread_init_Impl
+ if ($line =~ /^Function \`(.*)\'$/ )
+ {
+ my $sFunctionName = $1;
+ my $sPercentage;
+ $line = <INPUT_HANDLE>;
+ if ($line =~ /^Lines executed:(.*)% of/ )
+ {
+ $sPercentage = $1;
+ }
+ my $value = contain_in_List( $sFunctionName, \@aExportedFunctionList );
+ if ($value)
+ {
+ my $isDeprecated = contain_in_List( $sFunctionName, \@aDeprecatedList );
+ if ($isDeprecated)
+ {
+ # Function is deprecated, do not export it.
+ }
+ else
+ {
+ if ($no_percentage)
+ {
+ print("$value\n");
+ }
+ else
+ {
+ print("$sPercentage $value\n");
+ }
+ }
+ }
+ # push(@aExportedFunctionList, $1);
+ }
+ }
+ close(INPUT_HANDLE);
+}
+
+# gcov format since gcc 3.3.6
+# 100.00% von 3 Zeilen in function helloworld ausgeführt
+# 100.00% von 5 Zeilen in function main ausgeführt
+# 100.00% von 8 Zeilen in file tmp.c ausgeführt
+sub read_gcov_function_file_old_gcc_3($)
+{
+ local *INPUT_HANDLE;
+ my $file = $_[0];
+ my $line = "";
+ open(INPUT_HANDLE, $file)
+ or die("ERROR: cannot open $file!\n");
+
+ while ($line = <INPUT_HANDLE>)
+ {
+ chomp($line);
+ # sample line (for reg exp:)
+ # 100.00% of 3 source lines executed in function osl_thread_init_Impl
+ if ($line =~ /^(.*)% of \d+ source lines executed in function (.*)$/ )
+ {
+ my $value = contain_in_List( $2, \@aExportedFunctionList );
+ if ($value)
+ {
+ my $isDeprecated = contain_in_List( $2, \@aDeprecatedList );
+ if ($isDeprecated)
+ {
+ # Function is deprecated, do not export it.
+ }
+ else
+ {
+ if ($no_percentage)
+ {
+ print("$value\n");
+ }
+ else
+ {
+ print("$1 $value\n");
+ }
+ }
+ }
+ # push(@aExportedFunctionList, $1);
+ }
+ }
+ close(INPUT_HANDLE);
+}
+
+# ------------------------------------------------------------------------------
+# helper, to read the PRJ value out of a makefile.mk file
+sub get_PRJ_from_makefile_mk()
+{
+ local *INPUT_HANDLE;
+ # my $startdir = @_[0];
+ my $line = "";
+ my $value = "";
+ open(INPUT_HANDLE, "makefile.mk")
+ or die("ERROR: cannot open makefile.mk\n");
+
+ while ($line = <INPUT_HANDLE>)
+ {
+ chomp($line);
+ # sample line
+ # PRJ=
+ # HWD: print("$line\n");
+ if ($line =~ /^PRJ\s*=(.*)\s*$/)
+ {
+ # HWD: print("FOUND #####\n");
+ $value = $1;
+ chomp($value);
+ $value =~ s/\$\//\//g;
+ }
+ }
+ close(INPUT_HANDLE);
+ return $value;
+}
+
+# ----------------------------------------------------------------------------
+sub print_usage(*)
+{
+ local *HANDLE = $_[0];
+ my $tool_name = basename($0);
+
+ print(HANDLE <<END_OF_USAGE);
+
+Usage: $tool_name [OPTIONS] INPUTFILE
+
+ -h, --help Print this help, then exit
+ -v, --version Print version number, then exit
+ -i, --input-allfunc FILENAME Map file, which contain all exported functions
+ -s, --showallfunc Shows all exported functions then exit
+ -a, --allfuncinfo Shows the count of all exported functions then quit
+ -n, --no-percentage Suppress the output of the percent value for tested functions
+ -d, --do-not-filter Show all functions, which gcov -f produce
+
+END_OF_USAGE
+ ;
+}
+
diff --git a/sal/qa/helper/gcov/gcov_result.pl b/sal/qa/helper/gcov/gcov_result.pl
new file mode 100644
index 000000000000..414eac2c828b
--- /dev/null
+++ b/sal/qa/helper/gcov/gcov_result.pl
@@ -0,0 +1,232 @@
+#!/usr/bin/perl -w
+#
+# $Id: gcov_result.pl,v 1.2 2003-06-11 16:36:30 vg Exp $
+#
+
+# GCOV_RESULT
+#
+# Helper, to interpret the result and put the result via html in a database.
+# Put into DB works via php.
+#
+# Q: Why perl?
+# A: regexp ;-)
+#
+
+use strict;
+use File::Basename;
+use Getopt::Long;
+use Time::localtime;
+
+our $version_info = 'gcov helper $Revision: 1.2 $ ';
+
+our $help; # Help option flag
+our $version; # Version option flag
+# our $infile;
+
+our $usedFunctions; # name of all functions filename, which have a value > 0
+our $nonusedFunctions; # name of all functions filename, which have a value == 0
+our $complete; # name of all functions filename, which have a value == 100
+our $incomplete; # name of all functions filename, which have a value > 0 && < 100
+
+our $environment;
+our $major;
+our $minor;
+our $cwsname;
+our $outputDir;
+
+# Prototypes
+sub print_usage(*);
+sub read_gcov_function_file($);
+sub create2DigitNumber($);
+
+# Parse command line options
+if (!GetOptions(
+ "help" => \$help,
+ "version" => \$version,
+
+ "usedfunctions=s" => \$usedFunctions,
+ "nonusedfunctions=s" => \$nonusedFunctions,
+ "complete=s" => \$complete,
+ "incomplete=s" => \$incomplete,
+ "cwsname=s" => \$cwsname,
+ "major=s" => \$major,
+ "minor=s" => \$minor,
+ "environment=s" => \$environment,
+ "outputdir=s" => \$outputDir
+ ))
+{
+ print_usage(*STDERR);
+ exit(1);
+}
+
+# Check for help option
+if ($help)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+
+# Check for version option
+if ($version)
+{
+ print("$version_info\n");
+ exit(0);
+}
+
+# check if enough parameters
+# if ($#ARGV < 0)
+# {
+# print("No input filename specified\n");
+# print_usage(*STDERR);
+# exit(1);
+# }
+
+# ------------------------------------------------------------------------------
+
+my $sURL = "http://mahler.germany.sun.com/qadev/baselib/gcov_result_in_db_putter.php";
+
+my $next = "?";
+
+if ($complete)
+{
+ my $result = `cat $complete | wc -l`;
+ chomp($result);
+ $result =~ / *(\d+)/;
+ $sURL = $sURL . "$next" . "complete=$1";
+ $next = "&";
+}
+
+if ($nonusedFunctions)
+{
+ my $result = `cat $nonusedFunctions | wc -l`;
+ chomp($result);
+ $result =~ / *(\d+)/;
+ $sURL = $sURL . "$next" . "notused=$1";
+ $next = "&";
+}
+if ($usedFunctions)
+{
+ my $result = `cat $usedFunctions | wc -l`;
+ chomp($result);
+ $result =~ / *(\d+)/;
+ $sURL = $sURL . "$next" . "used=$1";
+ $next = "&";
+}
+if ($incomplete)
+{
+ my $result = `cat $incomplete | wc -l`;
+ chomp($result);
+ $result =~ / *(\d+)/;
+ $sURL = $sURL . "$next" . "incomplete=$1";
+ $next = "&";
+}
+
+if ($cwsname)
+{
+ # qadev8
+ $sURL = $sURL . "$next" . "cwsname=$cwsname";
+ $next = "&";
+}
+if ($major)
+{
+ # srx645
+ $sURL = $sURL . "$next" . "major=$major";
+ $next = "&";
+}
+if ($minor)
+{
+ # m3s1
+ $sURL = $sURL . "$next" . "minor=$minor";
+ $next = "&";
+}
+
+if ($environment)
+{
+ # unxlngi5
+ $sURL = $sURL . "$next" . "environment=$environment";
+ $next = "&";
+}
+
+my $year = localtime->year() + 1900;
+my $month = create2DigitNumber(localtime->mon() + 1);
+my $day = create2DigitNumber(localtime->mday());
+$sURL = $sURL . "$next" . "date=$year-$month-$day";
+$next = "&";
+
+my $output;
+if ($outputDir)
+{
+ chomp($outputDir);
+ $output = $outputDir;
+}
+
+# check if output ends with "/"
+if ( $output =~ /\/$/ )
+{
+ print "Output name ends with '/'\n";
+}
+else
+{
+ print "Output name does not end with '/'\n";
+ $output = $output . "/";
+}
+$output = $output . "php_result.txt";
+
+my $result = `wget -O $output "$sURL"`;
+print "$sURL\n";
+
+print `cat $output`;
+
+
+# ----------------------------------------------------------------------------
+sub print_usage(*)
+{
+ local *HANDLE = $_[0];
+ my $tool_name = basename($0);
+
+ print(HANDLE <<END_OF_USAGE);
+
+Usage: $tool_name [OPTIONS]
+
+ -u, --usedfunctions count of all functions, which have a value > 0
+ -n, --nonusedfunctions count of all functions, which have a value == 0
+ -co, --complete count of all functions, which have a value == 100
+ -i, --incomplete count of all functions, which have a value > 0 && < 100
+
+ -cw, --cwsname set cwsname
+ -ma, --major set major number
+ -mi, --minor set minor number
+ -e, --environment set environment
+
+ -o, --outputdir set the directory, where to store the wget result
+
+ -h, --help Print this help, then exit
+ -v, --version Print version number, then exit
+
+END_OF_USAGE
+ ;
+}
+# ------------------------------------------------------------------------------
+sub create2DigitNumber($)
+{
+ my $digit = $_[0];
+ my $str;
+ my $nDigitLen = length $digit;
+
+ if ($nDigitLen == 1)
+ {
+ $str = "0" . $digit;
+ }
+ else
+ {
+ if ($nDigitLen > 2)
+ {
+ $str = substr $digit, $nDigitLen - 2, 2;
+ }
+ else
+ {
+ $str = $digit;
+ }
+ }
+ return $str;
+}
diff --git a/sal/qa/helper/gcov/gcov_resultcompare.pl b/sal/qa/helper/gcov/gcov_resultcompare.pl
new file mode 100644
index 000000000000..d52316fac0e7
--- /dev/null
+++ b/sal/qa/helper/gcov/gcov_resultcompare.pl
@@ -0,0 +1,151 @@
+#!/usr/bin/perl -w
+#
+# $Id: gcov_resultcompare.pl,v 1.2 2004-03-19 14:46:51 obo Exp $
+#
+
+# GCOV_RESULTCOMPARE
+#
+# Helper, to compare two different results
+#
+# Q: Why perl?
+# A: regexp ;-)
+#
+
+use strict;
+use File::Basename;
+use Getopt::Long;
+
+our $version_info = 'gcov_resultcompare $Revision: 1.2 $ ';
+
+our $help; # Help option flag
+our $version; # Version option flag
+# our $infile;
+
+our $orig;
+our $compare;
+
+# Prototypes
+sub print_usage(*);
+sub read_gcov_function_file($);
+
+# Parse command line options
+if (!GetOptions(
+ "o=s" => \$orig,
+ "c=s" => \$compare,
+ "help" => \$help,
+ "version" => \$version
+ ))
+{
+ print_usage(*STDERR);
+ exit(1);
+}
+
+# Check for help option
+if ($help)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+
+# Check for version option
+if ($version)
+{
+ print("$version_info\n");
+ exit(0);
+}
+
+# check if enough parameters
+# if ($#ARGV < 1)
+# {
+# print("No input filenames specified\n");
+# print_usage(*STDERR);
+# exit(1);
+# }
+
+if (! $orig)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+if (! $compare)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+
+# ------------------------------------------------------------------------------
+
+my %origlist = read_gcov_function_file($orig);
+my %cmplist = read_gcov_function_file($compare);
+
+my $key;
+my $value;
+
+while (($key, $value) = each %origlist)
+{
+ my $cmpvalue = $cmplist{$key};
+
+ if ($cmpvalue != 0.00)
+ {
+ if ($value < 100.00)
+ {
+ if ($cmpvalue > $value && $value < 90.0)
+ {
+ print "$key, $value, CMP:$cmpvalue\n";
+ }
+ }
+ }
+}
+
+# --------------------------------------------------------------------------------
+# Read the gcov function (gcov -f) file
+# and compare line by line with the export function list
+# so we get a list of functions, which are only exported, and not all stuff.
+
+sub read_gcov_function_file($)
+{
+ local *INPUT_HANDLE;
+ my $file = shift;
+ my %list;
+ my $line = "";
+
+ open(INPUT_HANDLE, $file)
+ or die("ERROR: cannot open $file!\n");
+
+ while ($line = <INPUT_HANDLE>)
+ {
+ chomp($line);
+ # sample line (for reg exp:)
+ # 100.00 rtl_ustr_toDouble
+ if ($line =~ /^(.{6}) (\w+)$/ )
+ {
+ my $percent = $1;
+ my $value = $2;
+
+ $list{$value} = $percent;
+ }
+ }
+ close(INPUT_HANDLE);
+ return %list;
+}
+
+# ----------------------------------------------------------------------------
+sub print_usage(*)
+{
+ local *HANDLE = $_[0];
+ my $tool_name = basename($0);
+
+ print(HANDLE <<END_OF_USAGE);
+
+Usage: $tool_name [OPTIONS] INPUTFILE
+
+ -o Original File, which gives the main values
+ if here a value is smaller than in compare, the found value is a candidate for better check.
+ -c Compare file.
+
+ -h, --help Print this help, then exit
+ -v, --version Print version number, then exit
+
+END_OF_USAGE
+ ;
+}
diff --git a/sal/qa/helper/gcov/gcov_resultinterpreter.pl b/sal/qa/helper/gcov/gcov_resultinterpreter.pl
new file mode 100644
index 000000000000..b01506b20634
--- /dev/null
+++ b/sal/qa/helper/gcov/gcov_resultinterpreter.pl
@@ -0,0 +1,172 @@
+#!/usr/bin/perl -w
+#
+# $Id: gcov_resultinterpreter.pl,v 1.3 2005-11-02 17:24:12 kz Exp $
+#
+
+# GCOV_RESULTINTERPRETER
+#
+# Helper, to interpret the result
+#
+# Q: Why perl?
+# A: regexp ;-)
+#
+
+use strict;
+use File::Basename;
+use Getopt::Long;
+
+our $version_info = 'gcov helper $Revision: 1.3 $ ';
+
+our $help; # Help option flag
+our $version; # Version option flag
+# our $infile;
+
+our $usedFunctions; # show all functions, which have a value > 0
+our $nonusedFunctions; # show all functions, which have a value == 0
+our $nPercent; # show all functions, which have a value > $nPercent
+our $complete; # show all functions, which have a value == 100
+our $incomplete; # show all functions, which have a value > 0 && < 100
+
+# Prototypes
+sub print_usage(*);
+sub read_gcov_function_file($);
+
+# Parse command line options
+if (!GetOptions(
+ "usedfunctions" => \$usedFunctions,
+ "nonusedfunctions" => \$nonusedFunctions,
+ "percent=s" => \$nPercent,
+ "complete" => \$complete,
+ "incomplete" => \$incomplete,
+ "help" => \$help,
+ "version" => \$version
+ ))
+{
+ print_usage(*STDERR);
+ exit(1);
+}
+
+# Check for help option
+if ($help)
+{
+ print_usage(*STDOUT);
+ exit(0);
+}
+
+# Check for version option
+if ($version)
+{
+ print("$version_info\n");
+ exit(0);
+}
+
+# check if enough parameters
+if ($#ARGV < 0)
+{
+ print("No input filename specified\n");
+ print_usage(*STDERR);
+ exit(1);
+}
+
+if ($complete)
+{
+ $nPercent = 100.00;
+}
+# ------------------------------------------------------------------------------
+
+my %list = read_gcov_function_file($ARGV[0]);
+
+my $key;
+my $value;
+
+while (($key, $value) = each %list)
+{
+ # print "function: $key = $value\n";
+ if ($nonusedFunctions)
+ {
+ if ($value <= 0.00)
+ {
+ print "$key\n";
+ }
+ }
+ elsif ($usedFunctions)
+ {
+ if ($value != 0.00)
+ {
+ print "$key, $value\n";
+ }
+ }
+ elsif ($nPercent)
+ {
+ if ($value >= $nPercent)
+ {
+ print "$key, $value\n";
+ }
+ }
+ elsif ($incomplete)
+ {
+ if ($value > 0.00 && $value < 100.00)
+ {
+ print "$key, $value\n";
+ }
+ }
+ else
+ {
+ print "$key, $value\n";
+ }
+}
+
+# --------------------------------------------------------------------------------
+# Read the gcov function (gcov -f) file
+# and compare line by line with the export function list
+# so we get a list of functions, which are only exported, and not all stuff.
+
+sub read_gcov_function_file($)
+{
+ local *INPUT_HANDLE;
+ my $file = $_[0];
+ my %list;
+ my $line = "";
+
+ open(INPUT_HANDLE, $file)
+ or die("ERROR: cannot open $file!\n");
+
+ while ($line = <INPUT_HANDLE>)
+ {
+ chomp($line);
+ # sample line (for reg exp:)
+ # 100.00 rtl_ustr_toDouble
+ if ($line =~ /^(.*) (\w+)$/ )
+ {
+ my $percent = $1;
+ my $value = $2;
+
+ $list{$value} = $percent;
+ }
+ }
+ close(INPUT_HANDLE);
+ return %list;
+}
+
+# ----------------------------------------------------------------------------
+sub print_usage(*)
+{
+ local *HANDLE = $_[0];
+ my $tool_name = basename($0);
+
+ print(HANDLE <<END_OF_USAGE);
+
+Usage: $tool_name [OPTIONS] INPUTFILE
+
+ -u, --usedFunctions show all functions, which have a value > 0
+ -n, --nonusedFunctions show all functions, which have a value == 0
+ -p, --percent show all functions, which have a value > percent
+ -c, --complete show all functions, which have a value == 100
+ -i, --incomplete show all functions, which have a value > 0 && < 100
+
+ -h, --help Print this help, then exit
+ -v, --version Print version number, then exit
+
+END_OF_USAGE
+ ;
+}
diff --git a/sal/qa/helper/gcov/gcov_run.sh b/sal/qa/helper/gcov/gcov_run.sh
new file mode 100755
index 000000000000..31a4c4e44dec
--- /dev/null
+++ b/sal/qa/helper/gcov/gcov_run.sh
@@ -0,0 +1,64 @@
+#!/bin/tcsh -f
+
+# This is a helper file, to start a coverage test by hand
+
+# ----- INIT ENVIRONMENT -----
+# setup a complete build environment, copy from our beanshell environment
+setenv SHELL /bin/tcsh
+source /net/margritte/usr/qaapi/workspace/qadev/scripts/init/staroffice.cshrc
+
+# do a setsolar
+
+setenv SOURCE_ROOT /cws/so-cwsserv06/qadev16
+setsolar -cwsname qadev16 -sourceroot -src680 -ver m25 -jdk14 unxlngi5
+
+
+# ----- CLEAN OLD COVERAGE INFOS -----
+
+setenv SALDIR /cws/so-cwsserv06/qadev16/SRC680/src.m25/sal
+
+# this is a patch for sal, to see also "ustr" in string
+cd $SALDIR/rtl/source
+
+# strtmpl.c contains code, which is used for strings and ustrings. This file contain lot of makros
+# which unpacked at compile time. Due to the fact, gcov has some problems with such things, an idea is
+# to copy strtmpl.c to ustrtmpl.c and replace the include command in ustring.c
+# this is done be the follows lines.
+
+# cat ustring.c | sed -e "s/strtmpl.c/ustrtmpl.c/" > ustring.c.new ; mv -f ustring.c.new ustring.c
+# cp strtmpl.c ustrtmpl.c
+
+cd $SALDIR
+
+rm -f `find . -type f -name '*.bb' -print`
+rm -f `find . -type f -name '*.bbg' -print`
+rm -f `find . -type f -name '*.f' -print`
+rm -f `find . -type f -name '*.da' -print`
+rm -f `find . -type f -name '*.gcov' -print`
+
+rm -rf unxlngi5
+
+# ----- START A NEW BUILD WITH COVERAGE -----
+setenv ENVCFLAGS "-O0 -ftest-coverage -fprofile-arcs"
+build TESTCOVERAGE=t
+deliver
+
+
+# ----- START THE TESTS -----
+
+# unsetenv ENVCFLAGS
+cd cd $SALDIR/qa
+# cd qa/osl/file
+dmake test
+
+
+# ----- BUILD GCOV (coverage) FILES -----
+cd cd $SALDIR/qa/helper/gcov
+statistics
+
+# the statistics file create some *.txt files, the most interesting one is realallchecked.txt,
+# which contain only the interface functions and it's run through in percent.
+# the gcov_resultcompare.pl use two of these files to give out a compare.
+
+# usage: gcov_resultcompare.pl -o realallchecked.txt -c <other>/realallchecked.txt
+
diff --git a/sal/qa/helper/gcov/readme.txt b/sal/qa/helper/gcov/readme.txt
new file mode 100644
index 000000000000..6c9f46b225cb
--- /dev/null
+++ b/sal/qa/helper/gcov/readme.txt
@@ -0,0 +1,13 @@
+GCOV Coverage information helper functions
+
+# Files:
+deprecated.txt
+gcov_all
+gcov_filter.pl
+gcov_result.pl
+gcov_resultinterpreter.pl
+statistics
+
+\\mahler\automat\docs\qadev\baselib\gcov_result_in_db_putter.php
+
+
diff --git a/sal/qa/helper/gcov/statistics b/sal/qa/helper/gcov/statistics
new file mode 100755
index 000000000000..cbb374c172d2
--- /dev/null
+++ b/sal/qa/helper/gcov/statistics
@@ -0,0 +1,20 @@
+#!/bin/bash
+# $Id: statistics,v 1.3 2003-06-11 16:38:03 vg Exp $
+
+./gcov_filter.pl -i ../../../util/sal.map --showallfunc FOO | sort | uniq >exportedfunctions.txt
+
+# gives the number off all files.
+./gcov_filter.pl -i ../../../util/sal.map --allfuncinfo FOO
+
+./gcov_all --no-percentage | sort | uniq >allchecked.txt
+
+# gives the number of all testable functions
+echo -n " testable functions: "
+cat allchecked.txt | wc -l
+
+# gives a list of all checked functions within gcov.
+./gcov_all | sort +1 | uniq >realallchecked.txt
+
+# output all functions, which are not tested by gcov -f, due to the fact, that they where not found
+comm -3 exportedfunctions.txt allchecked.txt >notfound.txt
+
diff --git a/sal/qa/inc/stringhelper.hxx b/sal/qa/inc/stringhelper.hxx
new file mode 100644
index 000000000000..b284d1c0c06c
--- /dev/null
+++ b/sal/qa/inc/stringhelper.hxx
@@ -0,0 +1,16 @@
+#ifndef STRINGHELPER_HXX
+#define STRINGHELPER_HXX
+
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+
+inline void operator <<= (rtl::OString& _rAsciiString, rtl::OUString const & _rUnicodeString)
+{
+ _rAsciiString = rtl::OUStringToOString(_rUnicodeString,RTL_TEXTENCODING_ASCII_US);
+}
+inline void operator <<= (rtl::OUString& _rUnicodeString, rtl::OString const & _rAsciiString )
+{
+ _rUnicodeString = rtl::OStringToOUString(_rAsciiString, RTL_TEXTENCODING_ASCII_US);
+}
+
+#endif
diff --git a/sal/qa/inc/valueequal.hxx b/sal/qa/inc/valueequal.hxx
new file mode 100644
index 000000000000..df989c1e90a8
--- /dev/null
+++ b/sal/qa/inc/valueequal.hxx
@@ -0,0 +1,133 @@
+#include <math.h>
+
+#define PREC_float 1
+#define PREC_double 2
+#define PREC_long_double 3
+
+template<class T>
+bool is_equal(T x, T y, sal_Int16 _nPrec)
+{
+ // due to the fact that this check looks only if both values are equal
+ // we only need to look on one value
+
+ // 14 digits will announce the checkPrecisionSize
+
+ sal_Int32 nPRECISION;
+ switch(_nPrec)
+ {
+ case PREC_float:
+ nPRECISION = 6;
+ break;
+ case PREC_double:
+ nPRECISION = 14;
+ break;
+ case PREC_long_double:
+ nPRECISION = 20;
+ break;
+ default:
+ nPRECISION = 2;
+ }
+
+ if (x < 0)
+ {
+ x = -x;
+ }
+ if (y < 0)
+ {
+ y = -y;
+ }
+
+ // LLA: due to a bug in printf with '%f' and long double within linux environment
+ // we have to use %lf instead.
+
+ if (_nPrec != PREC_long_double)
+ {
+ t_print(T_VERBOSE, "double equal: %.20f\n", x);
+ t_print(T_VERBOSE, " %.20f\n", y);
+ }
+ //here nPrecOfN is the number after dot
+ sal_Int32 nBeforeDot = sal_Int32( log10(x) );
+ if ( nBeforeDot < 0)
+ {
+ nBeforeDot = 0;
+ }
+ //t_print(T_VERBOSE, "nPRECISION is %d\n", nPRECISION);
+ sal_Int32 nPrecOfN = -nPRECISION + nBeforeDot;
+
+ if (_nPrec != PREC_long_double)
+ t_print(T_VERBOSE, "nPrecOfN is %d\n", nPrecOfN);
+
+ long double nPrec = pow(0.1, -nPrecOfN);
+
+ if (_nPrec != PREC_long_double)
+ t_print(T_VERBOSE, " prec: %.20f\n", nPrec);
+
+ long double nDelta = fabs( x - y ) ;
+
+ if (_nPrec != PREC_long_double)
+ {
+ t_print(T_VERBOSE, " delta: %.20f\n", nDelta);
+ t_print(T_VERBOSE, " nPrec: %.20f\n", nPrec);
+ t_print(T_VERBOSE, "delta must be less or equal to prec!\n\n");
+ }
+
+ if (nDelta > nPrec)
+ {
+ // t_print(T_VERBOSE, "values are not equal! ndelta:%.20f\n", nDelta);
+ return false;
+ }
+ // else
+ // {
+ // t_print(T_VERBOSE, "values are equal. ndelta:%.20f\n", nDelta);
+ return true;
+ // }
+}
+
+// LLA: bool is_float_equal(float x, float y)
+// LLA: {
+// LLA: // due to the fact that this check looks only if both values are equal
+// LLA: // we only need to look on one value
+// LLA:
+// LLA: // 6 digits will announce the checkPrecisionSize
+// LLA:
+// LLA: const sal_Int32 nPRECISION = 6;
+// LLA: if (x < 0)
+// LLA: {
+// LLA: x = -x;
+// LLA: }
+// LLA: if (y < 0)
+// LLA: {
+// LLA: y = -y;
+// LLA: }
+// LLA:
+// LLA: t_print(T_VERBOSE, "double equal: %.20f\n# %.20f\n", x, y);
+// LLA: sal_Int32 nPrecOfN = -nPRECISION + sal_Int32( log10(x) );
+// LLA:
+// LLA: t_print(T_VERBOSE, "prec: %d\n", nPrecOfN);
+// LLA: double nPrec = pow(10, nPrecOfN) * 1;
+// LLA:
+// LLA: t_print(T_VERBOSE, " prec: %.20f\n", nPrec);
+// LLA:
+// LLA: double nDelta = fabs( x - y );
+// LLA: t_print(T_VERBOSE, " delta: %.20f\n\n", nDelta);
+// LLA:
+// LLA: if (nDelta > nPrec)
+// LLA: {
+// LLA: // t_print(T_VERBOSE, "values are not equal! ndelta:%.20f\n", nDelta);
+// LLA: return false;
+// LLA: }
+// LLA: // else
+// LLA: // {
+// LLA: // t_print(T_VERBOSE, "values are equal. ndelta:%.20f\n", nDelta);
+// LLA: return true;
+// LLA: // }
+// LLA: }
+
+bool is_float_equal(float x, float y)
+{
+ return is_equal<float>(x, y, PREC_float);
+}
+bool is_double_equal(double x, double y)
+{
+ return is_equal<double>(x, y, PREC_double);
+}
diff --git a/sal/qa/libs2test.txt b/sal/qa/libs2test.txt
new file mode 100644
index 000000000000..36a9f7f70c98
--- /dev/null
+++ b/sal/qa/libs2test.txt
@@ -0,0 +1,86 @@
+# This file contain a list of todos for testshl2 automated tests.
+#
+# $Id: libs2test.txt,v 1.13 2007-11-20 19:25:30 ihi Exp $
+#
+# Legend:
+# there exist 2 formats
+# 1. file
+# 2. path ; file
+#
+# 1. if only a file exist, it will be assume, that a directory with name 'file'
+# exist, and a library with name 'file' create.
+# 2. if the path to the file differ from the library file, use this format.
+#
+
+
+# LLA: marked as deprecated by Stephan Bergmann
+ByteSequence ; rtl_ByteSequence
+
+OStringBuffer ; rtl_OStringBuffer
+
+rtl_strings ; rtl_OUString
+rtl_strings ; rtl_OString
+rtl_strings ; rtl_OUStringBuffer
+
+# replacements for old rtl::XString tests
+rtl/oustring ; rtl_OUString2
+rtl/ostring ; rtl_OString2
+
+osl/file ; osl_File
+# LLA: temporaly removed, there are lot of problems with our environment
+osl/socket ; osl_StreamSocket
+osl/socket ; osl_DatagramSocket
+osl/socket ; osl_SocketAddr
+osl/socket ; osl_Socket2
+osl/socket ; osl_ConnectorSocket
+osl/socket ; osl_AcceptorSocket
+
+osl/mutex ; osl_Mutex
+osl/pipe ; osl_Pipe
+osl/semaphore ; osl_Semaphore
+osl/condition ; osl_Condition
+osl/module ; osl_Module
+osl/security ; osl_Security
+
+rtl/math ; rtl_math
+rtl/math ; rtl_math2
+
+# new 20040315
+rtl/alloc ; rtl_Alloc
+rtl/crc32 ; rtl_crc32
+rtl/digest ; rtl_digest
+rtl/bootstrap ; rtl_Bootstrap
+rtl/ostring ; rtl_str
+rtl/ostring ; rtl_string
+rtl/random ; rtl_Random
+
+# new 20040324
+rtl/oustring ; rtl_ustr
+
+# new 20040326
+rtl/cipher ; rtl_cipher
+
+# new 20040331
+rtl/locale ; rtl_locale
+rtl/uuid ; rtl_Uuid
+rtl/process ; rtl_Process
+
+# new 20040413
+rtl/textenc ; rtl_textcvt
+rtl/textenc ; rtl_tencinfo
+rtl/oustringbuffer; rtl_OUStringBuffer2
+
+# new 20040420
+rtl/uri ; rtl_Uri
+rtl/logfile ; rtl_logfile
+
+# LLA: Due to the fact, that thread testing seams to be little bit error prone, now
+# check this at the end.
+osl/process ; osl_Thread
+
+# not ready yet
+# strings ; test_oustring
+
+# new 20041025
+rtl/doublelock ; rtl_doublelocking
+
diff --git a/sal/qa/makefile.mk b/sal/qa/makefile.mk
new file mode 100644
index 000000000000..391ac66b8ade
--- /dev/null
+++ b/sal/qa/makefile.mk
@@ -0,0 +1,62 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..
+
+PRJNAME=sal
+TARGET=whole_sal_qa
+
+# LLA: irrelevant
+# ENABLE_EXCEPTIONS=TRUE
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+# BEGIN ------------------------------------------------------------
+# END --------------------------------------------------------------
+
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(runtests)"!=""
+ALLTAR : test_all
+.ENDIF
+
+# OTHER STUFF ------------------------------------------------------
+# test : test_all
+
+# start tests with consideration of libs2test.txt with 'dmake test'
+# run through all tests directories (from libs2test.txt) and try to start all tests
+# use 'dmake test TESTOPT="buildall"'
+
+# ALLTAR
+test_all:
+ @echo ----------------------------------------------------------
+ @echo - start sal unit tests
+ @echo ----------------------------------------------------------
+ $(PERL) buildall.pl $(TESTOPT)
diff --git a/sal/qa/osl/condition/makefile.mk b/sal/qa/osl/condition/makefile.mk
new file mode 100644
index 000000000000..b822ba575bb8
--- /dev/null
+++ b/sal/qa/osl/condition/makefile.mk
@@ -0,0 +1,60 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_osl_condition
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Condition by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/osl_Condition.obj
+
+SHL1TARGET= osl_Condition
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+# auto generated Target:Condition
+# END ------------------------------------------------------------------
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/osl/condition/osl_Condition.cxx b/sal/qa/osl/condition/osl_Condition.cxx
new file mode 100644
index 000000000000..59cfcce9d77a
--- /dev/null
+++ b/sal/qa/osl/condition/osl_Condition.cxx
@@ -0,0 +1,384 @@
+ /*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+#include <osl_Condition_Const.h>
+
+using namespace osl;
+using namespace rtl;
+
+
+//------------------------------------------------------------------------
+// helper functions and classes
+//------------------------------------------------------------------------
+
+/** print Boolean value.
+*/
+inline void printBool( sal_Bool bOk )
+{
+ t_print("#printBool# " );
+ ( sal_True == bOk ) ? t_print("TRUE!\n" ): t_print("FALSE!\n" );
+}
+
+/** print a UNI_CODE String.
+*/
+inline void printUString( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ t_print("#printUString_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", aString.getStr( ) );
+}
+
+/** wait _nSec seconds.
+*/
+void thread_sleep( sal_Int32 _nSec )
+{
+ /// print statement in thread process must use fflush() to force display.
+ t_print("# wait %d seconds. ", _nSec );
+ fflush( stdout );
+
+#ifdef WNT //Windows
+ Sleep( _nSec * 1000 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ sleep( _nSec );
+#endif
+ t_print("# done\n" );
+}
+
+enum ConditionType
+{
+ thread_type_set,
+ thread_type_reset,
+ thread_type_wait,
+ thread_type_check
+};
+
+/** thread for testing Condition.
+ */
+class ConditionThread : public Thread
+{
+public:
+ //get the Condition to operate
+ ConditionThread( ::osl::Condition& Con, ConditionType tType): m_MyCon( Con ), m_MyType( tType ) { }
+
+ ~ConditionThread( )
+ {
+ // LLA: do not throw in DTors!
+ // LLA: CPPUNIT_ASSERT_MESSAGE( "#ConditionThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ ::osl::Condition& m_MyCon;
+ ConditionType m_MyType;
+
+ void SAL_CALL run()
+ {
+ switch ( m_MyType )
+ {
+ case thread_type_wait:
+ m_MyCon.wait(); break;
+ case thread_type_set:
+ m_MyCon.set(); break;
+ case thread_type_reset:
+ m_MyCon.reset(); break;
+ default:
+ break;
+ }
+ }
+};
+
+
+//------------------------------------------------------------------------
+// test code start here
+//------------------------------------------------------------------------
+
+namespace osl_Condition
+{
+
+ /** testing the method:
+ Condition()
+ */
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void ctors_001( )
+ {
+ ::osl::Condition aCond;
+ bRes = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition its initial check state should be sal_False.",
+ sal_False == bRes );
+ }
+
+ void ctors_002( )
+ {
+ ::osl::Condition aCond;
+ aCond.set( );
+ bRes = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition and set it.",
+ sal_True == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST( ctors_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class ctors
+
+
+ /** testing the method:
+ void set()
+ */
+ class set : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1, bRes2;
+
+ void set_001( )
+ {
+ ::osl::Condition aCond;
+ aCond.set( );
+ bRes = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: check state should be sal_True after set.",
+ sal_True == bRes );
+ }
+
+ void set_002( )
+ {
+ ::osl::Condition aCond;
+ ConditionThread myThread1( aCond, thread_type_wait );
+ myThread1.create();
+ bRes = myThread1.isRunning( );
+
+ ConditionThread myThread2( aCond, thread_type_set );
+ myThread2.create();
+ thread_sleep(1);
+ bRes1 = myThread1.isRunning( );
+ bRes2 = aCond.check( );
+
+ myThread1.join( );
+ myThread2.join( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: use one thread to set the condition in order to release another thread.",
+ sal_True == bRes && sal_False == bRes1 && sal_True == bRes2 );
+ }
+
+
+ CPPUNIT_TEST_SUITE( set );
+ CPPUNIT_TEST( set_001 );
+ CPPUNIT_TEST( set_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class set
+
+
+ /** testing the method:
+ void reset()
+ */
+ class reset : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1, bRes2;
+
+ void reset_001( )
+ {
+ ::osl::Condition aCond;
+ aCond.reset( );
+
+ ConditionThread myThread( aCond, thread_type_wait );
+ myThread.create();
+ bRes = myThread.isRunning( );
+ bRes2 = aCond.check( );
+
+ aCond.set( );
+ myThread.join( );
+ bRes1 = myThread.isRunning( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: wait will cause a reset thread block, use set to release it.",
+ sal_True == bRes && sal_False == bRes1 && sal_False == bRes2 );
+ }
+
+ void reset_002( )
+ {
+ ::osl::Condition aCond;
+ aCond.reset( );
+ bRes = aCond.check( );
+ aCond.set( );
+ bRes1 = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition and reset/set it.",
+ ( sal_False == bRes && sal_True == bRes1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( reset );
+ CPPUNIT_TEST( reset_001 );
+ CPPUNIT_TEST( reset_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class reset
+
+
+ /** testing the method:
+ Result wait(const TimeValue *pTimeout = 0)
+ */
+ class wait : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1, bRes2;
+ TimeValue *tv1;
+
+ void setUp( )
+ {
+ tv1 = (TimeValue*)malloc(sizeof(TimeValue));
+ tv1->Seconds = 1;
+
+ }
+
+ void tearDown( )
+ {
+ free( tv1 );
+ }
+
+
+ void wait_001( )
+ {
+ ::osl::Condition cond1;
+ ::osl::Condition cond2;
+ ::osl::Condition cond3;
+
+ cond1.set();
+ cond2.set();
+
+osl::Condition::Result r1=cond1.wait(tv1);
+osl::Condition::Result r2=cond2.wait();
+osl::Condition::Result r3=cond3.wait(tv1);
+fprintf(stderr,"%d %d %d\n",r1,r2,r3);
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test three types of wait.",
+ (cond1.wait(tv1) == ::osl::Condition::result_ok) &&
+ (cond2.wait() == ::osl::Condition::result_ok) &&
+ (cond3.wait(tv1) == ::osl::Condition::result_timeout) );
+
+ }
+
+ void wait_002( )
+ {
+ ::osl::Condition aCond;
+ ::osl::Condition::Result wRes, wRes1;
+
+ aCond.reset( );
+ bRes = aCond.check( );
+ wRes = aCond.wait( tv1 );
+
+ aCond.set( );
+ wRes1 = aCond.wait( tv1 );
+ bRes1 = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: wait a condition after set/reset.",
+ ( sal_False == bRes ) && ( sal_True == bRes1 ) &&
+ ( ::osl::Condition::result_timeout == wRes ) &&
+ ( ::osl::Condition::result_ok == wRes1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( wait );
+ CPPUNIT_TEST( wait_001 );
+ CPPUNIT_TEST( wait_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class wait
+
+
+ /** testing the method:
+ sal_Bool check()
+ */
+ class check : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1, bRes2;
+
+ void check_001( )
+ {
+ ::osl::Condition aCond;
+
+ aCond.reset( );
+ bRes = aCond.check( );
+ aCond.set( );
+ bRes1 = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: check the condition states.",
+ ( sal_False == bRes && sal_True == bRes1 ) );
+ }
+
+ void check_002( )
+ {
+ ::osl::Condition aCond;
+ aCond.reset( );
+
+ ConditionThread myThread( aCond, thread_type_set );
+ myThread.create( );
+ myThread.join( );
+ bRes = aCond.check( );
+
+ ConditionThread myThread1( aCond, thread_type_reset );
+ myThread1.create( );
+ myThread1.join( );
+ bRes1 = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: use threads to set/reset Condition and check it in main routine.",
+ ( sal_True == bRes && sal_False == bRes1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( check );
+ CPPUNIT_TEST( check_001 );
+ CPPUNIT_TEST( check_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class check
+
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::ctors, "osl_Condition");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::set, "osl_Condition");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::reset, "osl_Condition");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::wait, "osl_Condition");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Condition::check, "osl_Condition");
+// -----------------------------------------------------------------------------
+
+} // namespace osl_Condition
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/condition/osl_Condition_Const.h b/sal/qa/osl/condition/osl_Condition_Const.h
new file mode 100644
index 000000000000..1a5fb1e3f4ce
--- /dev/null
+++ b/sal/qa/osl/condition/osl_Condition_Const.h
@@ -0,0 +1,72 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _OSL_CONDITION_CONST_H_
+#define _OSL_CONDITION_CONST_H_
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+
+#ifndef _OSL_THREAD_HXX_
+#include <osl/thread.hxx>
+#endif
+#include <osl/mutex.hxx>
+#include <osl/pipe.hxx>
+
+#ifndef _OSL_SEMAPHOR_HXX_
+#include <osl/semaphor.hxx>
+#endif
+
+#ifndef _OSL_CONDITION_HXX_
+#include <osl/conditn.hxx>
+#endif
+#include <osl/time.h>
+
+#ifdef UNX
+#include <unistd.h>
+#endif
+
+#include <testshl/simpleheader.hxx>
+
+#define OSLTEST_DECLARE_USTRING( str_name, str_value ) \
+ ::rtl::OUString a##str_name = rtl::OUString::createFromAscii( str_value )
+
+//------------------------------------------------------------------------
+// condition names
+//------------------------------------------------------------------------
+OSLTEST_DECLARE_USTRING( TestCon, "testcondition" );
+
+const char pTestString[17] = "Sun Microsystems";
+
+
+#endif /* _OSL_CONDITION_CONST_H_ */
diff --git a/sal/qa/osl/file/makefile.mk b/sal/qa/osl/file/makefile.mk
new file mode 100644
index 000000000000..e13de9f5d5af
--- /dev/null
+++ b/sal/qa/osl/file/makefile.mk
@@ -0,0 +1,85 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_osl_file
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- BEGIN --------------------------------------------------------
+SHL1OBJS= \
+ $(SLO)$/osl_File.obj
+SHL1TARGET= osl_File
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+#-------------------------------------------------------------------
+
+SHL2OBJS=$(SLO)$/test_cpy_wrt_file.obj
+SHL2TARGET=tcwf
+SHL2STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+SHL2IMPLIB=i$(SHL2TARGET)
+SHL2DEF=$(MISC)$/$(SHL2TARGET).def
+SHL2VERSIONMAP = $(PRJ)$/qa$/export.map
+DEF2NAME =$(SHL2TARGET)
+
+
+# END --------------------------------------------------------------
+
+# --- BEGIN --------------------------------------------------------
+SHL3OBJS= \
+ $(SLO)$/osl_old_test_file.obj
+SHL3TARGET= osl_old_test_file
+SHL3STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL3IMPLIB= i$(SHL3TARGET)
+
+DEF3NAME =$(SHL3TARGET)
+SHL3VERSIONMAP = $(PRJ)$/qa$/export.map
+# END --------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/osl/file/osl_File.cxx b/sal/qa/osl/file/osl_File.cxx
new file mode 100644
index 000000000000..1450d49874bd
--- /dev/null
+++ b/sal/qa/osl/file/osl_File.cxx
@@ -0,0 +1,6856 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
+
+#include "osl/thread.h"
+
+#include "rtl/ustrbuf.hxx"
+#include <osl/file.hxx>
+#include <osl_File_Const.h>
+
+#include <testshl/simpleheader.hxx>
+
+// #ifdef WNT
+// # define UNICODE
+// # define WIN32_LEAN_AND_MEAN
+// # include <windows.h>
+// # include <tchar.h>
+// #endif
+
+
+using namespace osl;
+using namespace rtl;
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+/** detailed wrong message.
+*/
+inline ::rtl::OString errorToString( const ::osl::FileBase::RC _nError )
+{
+ ::rtl::OString sResult;
+ switch ( _nError ) {
+ case ::osl::FileBase::E_None:
+ sResult = "Success";
+ break;
+ case ::osl::FileBase::E_PERM:
+ sResult = "Operation not permitted";
+ break;
+ case ::osl::FileBase::E_NOENT:
+ sResult = "No such file or directory";
+ break;
+ case ::osl::FileBase::E_EXIST:
+ sResult = "Already Exist";
+ break;
+ case ::osl::FileBase::E_ACCES:
+ sResult = "Permission denied";
+ break;
+ case ::osl::FileBase::E_INVAL:
+ sResult = "The format of the parameters was not valid";
+ break;
+ case ::osl::FileBase::E_NOTDIR:
+ sResult = "Not a directory";
+ break;
+ case ::osl::FileBase::E_ISDIR:
+ sResult = "Is a directory";
+ break;
+ case ::osl::FileBase::E_BADF:
+ sResult = "Bad file";
+ break;
+ case ::osl::FileBase::E_NOTEMPTY:
+ sResult = "The directory is not empty";
+ break;
+ default:
+ sResult = "Unknown Error";
+ break;
+ }
+ return sResult;
+}
+
+rtl::OUString errorToStr( ::osl::FileBase::RC const& nError)
+{
+ rtl::OUStringBuffer suBuf;
+ suBuf.append( rtl::OUString::createFromAscii("The returned error is: ") );
+ suBuf.append( rtl::OStringToOUString(errorToString(nError), RTL_TEXTENCODING_ASCII_US) );
+ suBuf.append( rtl::OUString::createFromAscii("!\n") );
+ return suBuf.makeStringAndClear();
+}
+
+/** print a file type name.
+*/
+inline void printFileType( const ::osl::FileStatus::Type nType )
+{
+ t_print( "#printFileType# " );
+ switch ( nType ) {
+ case ::osl::FileStatus::Directory:
+ t_print( "This file is a: Directory.\n" );
+ break;
+ case ::osl::FileStatus::Volume:
+ t_print( "This file is a: volume device.\n" );
+ break;
+ case ::osl::FileStatus::Regular:
+ t_print( "This file is a: regular file.\n" );
+ break;
+ case ::osl::FileStatus::Fifo:
+ t_print( "This file is a: fifo.\n" );
+ break;
+ case ::osl::FileStatus::Socket:
+ t_print( "This file is a: socket.\n" );
+ break;
+ case ::osl::FileStatus::Link:
+ t_print( "This file is a: link file.\n" );
+ break;
+ case ::osl::FileStatus::Special:
+ t_print( "This file is a: special.\n" );
+ break;
+ case ::osl::FileStatus::Unknown:
+ t_print( "The file type is unknown %d \n", nType );
+ break;
+ }
+}
+
+/** print a file attributes.
+*/
+inline void printFileAttributes( const sal_Int64 nAttributes )
+{
+ t_print( "#printFileAttributes# This file is a: (" );
+ if ( ( nAttributes | Attribute_ReadOnly ) == nAttributes )
+ t_print( " ReadOnly " );
+ if ( ( nAttributes | Attribute_Hidden ) == nAttributes )
+ t_print( " Hidden " );
+ if ( ( nAttributes | Attribute_Executable ) == nAttributes )
+ t_print( " Executable " );
+ if ( ( nAttributes | Attribute_GrpWrite ) == nAttributes )
+ t_print( " GrpWrite " );
+ if ( ( nAttributes | Attribute_GrpRead ) == nAttributes )
+ t_print( " GrpRead " );
+ if ( ( nAttributes | Attribute_GrpExe ) == nAttributes )
+ t_print( " GrpExe " );
+ if ( ( nAttributes | Attribute_OwnWrite ) == nAttributes )
+ t_print( " OwnWrite " );
+ if ( ( nAttributes | Attribute_OwnRead ) == nAttributes )
+ t_print( " OwnRead " );
+ if ( ( nAttributes | Attribute_OwnExe ) == nAttributes )
+ t_print( " OwnExe " );
+ if ( ( nAttributes | Attribute_OthWrite ) == nAttributes )
+ t_print( " OthWrite " );
+ if ( ( nAttributes | Attribute_OthRead ) == nAttributes )
+ t_print( " OthRead " );
+ if ( ( nAttributes | Attribute_OthExe ) == nAttributes )
+ t_print( " OthExe " );
+ t_print( ") file!\n" );
+}
+
+/** print a UNI_CODE file name.
+*/
+inline void printFileName( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ t_print( "#printFileName_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print( "%s\n", aString.getStr( ) );
+}
+
+/** print a ASCII_CODE file name.
+*/
+inline void printFileName( const sal_Char * str )
+{
+ t_print( "#printFileName_a# " );
+ t_print( "%s\n", str );
+}
+
+/** print an output wrong message.
+*/
+inline void printError( const ::osl::FileBase::RC nError )
+{
+ t_print( "#printError# " );
+ printFileName( errorToStr(nError) );
+}
+
+/** print an signed Integer Number.
+*/
+inline void printInt( sal_Int64 i )
+{
+ t_print( "#printInt_i64# " );
+ t_print( "The Integer64 is %lld\n", i);
+}
+
+/** print an unsigned Integer Number.
+*/
+inline void printInt( sal_uInt64 i )
+{
+ t_print( "#printInt_u64# " );
+ t_print( "The unsigned Integer64 is %llu\n", i);
+}
+
+/** print Boolean value.
+*/
+inline void printBool( sal_Bool bOk )
+{
+ t_print( "#printBool# " );
+ ( sal_True == bOk ) ? t_print( "YES!\n" ): t_print( "NO!\n" );
+}
+
+/** print struct TimeValue in local time format.
+*/
+inline void printTime( TimeValue *tv )
+{
+ oslDateTime *pDateTime = ( oslDateTime* )malloc( sizeof( oslDateTime ) ) ;
+ CPPUNIT_ASSERT_MESSAGE( "Error in printTime() function,malloc ", pDateTime != NULL );
+ TimeValue *pLocalTV = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ CPPUNIT_ASSERT_MESSAGE( "Error in printTime() function,malloc ", pLocalTV != NULL );
+
+ CPPUNIT_ASSERT_MESSAGE( "Error in printTime() function,osl_getLocalTimeFromSystemTime ",sal_True == osl_getLocalTimeFromSystemTime( tv, pLocalTV ) );
+ CPPUNIT_ASSERT_MESSAGE( "Error in printTime() function,osl_gepDateTimeFromTimeValue ",sal_True == osl_getDateTimeFromTimeValue( pLocalTV, pDateTime ) );
+
+ t_print( "#printTime# " );
+ t_print( " Time is: %d/%d/%d ", pDateTime->Month, pDateTime->Day, pDateTime->Year);
+ switch ( pDateTime->DayOfWeek )
+ {
+ case 0: t_print("Sun. "); break;
+ case 1: t_print("Mon. "); break;
+ case 2: t_print("Tue. "); break;
+ case 3: t_print("Thr. "); break;
+ case 4: t_print("Wen. "); break;
+ case 5: t_print("Fri. "); break;
+ case 6: t_print("Sat. "); break;
+ }
+ t_print( " %d:%d:%d %d nsecs\n", pDateTime->Hours, pDateTime->Minutes, pDateTime->Seconds, pDateTime->NanoSeconds);
+
+ free( pDateTime );
+ free( pLocalTV );
+}
+
+/** compare two TimeValue, unit is "ms", since Windows time precision is better than UNX.
+*/
+
+#if ( defined UNX ) || ( defined OS2 ) //precision of time in Windows is better than UNX
+# define delta 2000 //time precision, 2000ms
+#else
+# define delta 1800 //time precision, 1.8s
+#endif
+
+inline sal_Int64 t_abs64(sal_Int64 _nValue)
+{
+ // std::abs() seems to have some ambiguity problems (so-texas)
+ // return abs(_nValue);
+ t_print("t_abs64(%ld)\n", _nValue);
+ // CPPUNIT_ASSERT(_nValue < 2147483647);
+
+ if (_nValue < 0)
+ {
+ _nValue = -_nValue;
+ }
+ return _nValue;
+}
+
+inline sal_Bool t_compareTime( TimeValue *m_aEndTime, TimeValue *m_aStartTime, sal_Int32 nDelta)
+{
+ // sal_uInt64 uTimeValue;
+ // sal_Int64 iTimeValue;
+ //
+ // iTimeValue = t_abs64(( tv1->Seconds - tv2->Seconds) * 1000000000 + tv1->Nanosec - tv2->Nanosec);
+ // uTimeValue = ( iTimeValue / 1000000 );
+
+ sal_Int32 nDeltaSeconds = m_aEndTime->Seconds - m_aStartTime->Seconds;
+ sal_Int32 nDeltaNanoSec = sal_Int32(m_aEndTime->Nanosec) - sal_Int32(m_aStartTime->Nanosec);
+ if (nDeltaNanoSec < 0)
+ {
+ nDeltaNanoSec = 1000000000 + nDeltaNanoSec;
+ nDeltaSeconds--;
+ }
+
+ sal_Int32 nDeltaMilliSec = (nDeltaSeconds * 1000) + (nDeltaNanoSec / 1000000);
+ return ( nDeltaMilliSec < nDelta );
+}
+
+/** compare two OUString file name.
+*/
+inline sal_Bool compareFileName( const ::rtl::OUString & ustr1, const ::rtl::OUString & ustr2 )
+{
+ sal_Bool bOk;
+//on Windows, the seperatar is '\', so here change to '/', then compare
+#if defined (WNT )
+ ::rtl::OUString ustr1new,ustr2new;
+ sal_Unicode reverseSlash = (sal_Unicode)'\\';
+
+ if (ustr1.lastIndexOf(reverseSlash) != -1)
+ ustr1new = ustr1.replace(reverseSlash,(sal_Unicode)'/');
+ else
+ ustr1new = ustr1;
+ if (ustr2.lastIndexOf(reverseSlash) != -1)
+ ustr2new = ustr2.replace(reverseSlash,(sal_Unicode)'/');
+ else
+ ustr2new = ustr2;
+ bOk = ustr1new.equalsIgnoreAsciiCase( ustr2new ) ;
+#else
+ bOk = ustr1.equalsIgnoreAsciiCase( ustr2 );
+#endif
+ return bOk;
+}
+
+/** compare a OUString and an ASCII file name.
+*/
+inline sal_Bool compareFileName( const ::rtl::OUString & ustr, const sal_Char *astr )
+{
+ (void)ustr;
+ ::rtl::OUString ustr1 = rtl::OUString::createFromAscii( astr );
+ sal_Bool bOk = ustr1.equalsIgnoreAsciiCase( ustr1 );
+
+ return bOk;
+}
+
+/** simple version to judge if a file name or directory name is a URL or a system path, just to see if it
+ is start with "file:///";.
+*/
+inline sal_Bool isURL( const sal_Char *pathname )
+{
+ return ( 0 == strncmp( pathname, FILE_PREFIX, sizeof( FILE_PREFIX ) - 1 ) );
+}
+
+/** simple version to judge if a file name or directory name is a URL or a system path, just to see if it
+ is start with "file:///";.
+*/
+inline sal_Bool isURL( const ::rtl::OUString pathname )
+{
+ return ( ( pathname.indexOf( aPreURL ) == 0 ) ? sal_True : sal_False );
+}
+
+/** concat two part to form a URL or system path, add PATH_SEPERATOR between them if necessary, add "file:///" to begining if necessary.
+*/
+inline void concatURL( ::rtl::OUString & pathname1, const ::rtl::OUString & pathname2 )
+{
+ //check if pathname1 is full qualified URL;
+ if ( !isURL( pathname1 ) )
+ {
+ ::rtl::OUString aPathName = pathname1.copy( 0 );
+ ::osl::FileBase::getFileURLFromSystemPath( pathname1, aPathName ); //convert if not full qualified URL
+ pathname1 = aPathName.copy( 0 );
+ }
+
+ sal_Int32 index = 0;
+ //check if '/' is in the end of pathname1 or at the begin of pathname2;
+ if ( ( ( index = pathname1.lastIndexOf( aSlashURL ) ) != ( pathname1.getLength( ) - 1 ) ) &&
+ ( ( index = pathname2.indexOf( aSlashURL ) ) != 0 ) )
+ pathname1 += aSlashURL;
+ pathname1 += pathname2;
+}
+
+/** create a temp test file using OUString name of full qualified URL or system path.
+*/
+inline void createTestFile( const ::rtl::OUString filename )
+{
+ ::rtl::OUString aPathURL = filename.copy( 0 );
+ ::osl::FileBase::RC nError;
+
+ if ( !isURL( filename ) )
+ ::osl::FileBase::getFileURLFromSystemPath( filename, aPathURL ); //convert if not full qualified URL
+
+ //::std::auto_ptr<File> pFile( new File( aPathURL ) );
+ File aFile(aPathURL);
+ //nError = pFile->open( OpenFlag_Read | OpenFlag_Write | OpenFlag_Create );
+ nError = aFile.open( OpenFlag_Read | OpenFlag_Write | OpenFlag_Create );
+ //CPPUNIT_ASSERT_MESSAGE( "In createTestFile Function: creation ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_EXIST ) );
+ if ( ( ::osl::FileBase::E_None != nError ) && ( nError != ::osl::FileBase::E_EXIST ))
+ {
+ t_print("createTestFile failed!\n");
+ }
+ aFile.close();
+
+}
+
+/** create a temp test file using OUString name of full qualified URL or system path in a base directory.
+*/
+inline void createTestFile( const ::rtl::OUString basename, const ::rtl::OUString filename )
+{
+ ::rtl::OUString aBaseURL = basename.copy( 0 );
+
+ concatURL( aBaseURL, filename );
+ createTestFile( aBaseURL );
+}
+
+/** detete a temp test file using OUString name.
+*/
+inline void deleteTestFile( const ::rtl::OUString filename )
+{
+ // LLA: t_print("deleteTestFile\n");
+ ::rtl::OUString aPathURL = filename.copy( 0 );
+ ::osl::FileBase::RC nError;
+
+ if ( !isURL( filename ) )
+ ::osl::FileBase::getFileURLFromSystemPath( filename, aPathURL ); //convert if not full qualified URL
+
+ nError = ::osl::File::setAttributes( aPathURL, Attribute_GrpWrite| Attribute_OwnWrite| Attribute_OthWrite ); // if readonly, make writtenable.
+ CPPUNIT_ASSERT_MESSAGE( "In deleteTestFile Function: set writtenable ", ( ::osl::FileBase::E_None == nError ) || ( ::osl::FileBase::E_NOENT == nError ) );
+
+ nError = ::osl::File::remove( aPathURL );
+ CPPUNIT_ASSERT_MESSAGE( "In deleteTestFile Function: remove ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT ) );
+}
+
+/** delete a temp test file using OUString name of full qualified URL or system path in a base directory.
+*/
+inline void deleteTestFile( const ::rtl::OUString basename, const ::rtl::OUString filename )
+{
+ ::rtl::OUString aBaseURL = basename.copy( 0 );
+
+ concatURL( aBaseURL, filename );
+ deleteTestFile( aBaseURL );
+}
+
+/** create a temp test directory using OUString name of full qualified URL or system path.
+*/
+inline void createTestDirectory( const ::rtl::OUString dirname )
+{
+ ::rtl::OUString aPathURL = dirname.copy( 0 );
+ ::osl::FileBase::RC nError;
+
+ if ( !isURL( dirname ) )
+ ::osl::FileBase::getFileURLFromSystemPath( dirname, aPathURL ); //convert if not full qualified URL
+ nError = ::osl::Directory::create( aPathURL );
+ //CPPUNIT_ASSERT_MESSAGE( "In createTestDirectory Function: creation: ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_EXIST ) );
+ if ( ( ::osl::FileBase::E_None != nError ) && ( nError != ::osl::FileBase::E_EXIST ))
+ t_print("createTestDirectory failed!\n");
+}
+
+/** create a temp test directory using OUString name of full qualified URL or system path in a base directory.
+*/
+inline void createTestDirectory( const ::rtl::OUString basename, const ::rtl::OUString dirname )
+{
+ ::rtl::OUString aBaseURL = basename.copy( 0 );
+ ::rtl::OString aString;
+
+ concatURL( aBaseURL, dirname );
+ createTestDirectory( aBaseURL );
+}
+
+/** delete a temp test directory using OUString name of full qualified URL or system path.
+*/
+inline void deleteTestDirectory( const ::rtl::OUString dirname )
+{
+ // LLA: t_print("deleteTestDirectory\n");
+ ::rtl::OUString aPathURL = dirname.copy( 0 );
+ ::osl::FileBase::RC nError;
+ // LLA: printFileName(aPathURL);
+ if ( !isURL( dirname ) )
+ ::osl::FileBase::getFileURLFromSystemPath( dirname, aPathURL ); //convert if not full qualified URL
+
+ ::osl::Directory testDir( aPathURL );
+ if ( testDir.isOpen( ) == sal_True )
+ {
+ // LLA: t_print("#close Dir\n");
+ testDir.close( ); //close if still open.
+ }
+
+ nError = ::osl::Directory::remove( aPathURL );
+ // LLA: printError(nError);
+ // LLA: if (( ::osl::FileBase::E_None == nError ))
+ // LLA: {
+ // LLA: t_print("nError == E_None\n");
+ // LLA: }
+ // LLA: else if ( ( nError == ::osl::FileBase::E_NOENT ))
+ // LLA: {
+ // LLA: t_print("nError == E_NOENT\n");
+ // LLA: }
+ // LLA: else
+ // LLA: {
+ // LLA: // t_print("nError == %d\n", nError);
+ // LLA: }
+ rtl::OUString strError = rtl::OUString::createFromAscii( "In deleteTestDirectory function: remove Directory ");
+ strError += aPathURL;
+ CPPUNIT_ASSERT_MESSAGE( strError, ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT ) );
+ // LLA: if (! ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT ))
+ // LLA: {
+ // LLA: t_print("In deleteTestDirectory function: remove\n");
+ // LLA: }
+}
+
+/** delete a temp test directory using OUString name of full qualified URL or system path in a base directory.
+*/
+inline void deleteTestDirectory( const ::rtl::OUString basename, const ::rtl::OUString dirname )
+{
+ ::rtl::OUString aBaseURL = basename.copy( 0 );
+
+ concatURL( aBaseURL, dirname );
+ deleteTestDirectory( aBaseURL );
+}
+
+
+/** Check for the file and directory access right.
+*/
+typedef enum {
+ osl_Check_Mode_Exist,
+ osl_Check_Mode_OpenAccess,
+ osl_Check_Mode_ReadAccess,
+ osl_Check_Mode_WriteAccess
+} oslCheckMode;
+
+// not used here
+inline sal_Bool checkFile( const ::rtl::OUString & str, oslCheckMode nCheckMode )
+{
+ ::osl::FileBase::RC nError1, nError2;
+ ::osl::File testFile( str );
+ sal_Bool bCheckResult;
+
+ bCheckResult = sal_False;
+ nError1 = testFile.open ( OpenFlag_Read );
+ if ( ( ::osl::FileBase::E_NOENT != nError1 ) && ( ::osl::FileBase::E_ACCES != nError1 ) ){
+
+ switch ( nCheckMode ) {
+ case osl_Check_Mode_Exist:
+ /// check if the file is exist.
+ if ( ::osl::FileBase::E_None == nError1 )
+ bCheckResult = sal_True;
+ break;
+ case osl_Check_Mode_OpenAccess:
+ /// check if the file is openable.
+ if ( ::osl::FileBase::E_None == nError1 )
+ bCheckResult = sal_True;
+ break;
+ case osl_Check_Mode_WriteAccess:
+ /// check the file name and whether it can be write.
+ /// write chars into the file.
+ //testFile.close( );
+ //testFile.open( OpenFlag_Write );
+ sal_uInt64 nCount_write;
+ nError2 = testFile.write( pBuffer_Char, 10, nCount_write );
+ if ( ::osl::FileBase::E_None == nError2 )
+ bCheckResult = sal_True;
+ break;
+
+ default:
+ bCheckResult = sal_False;
+ }/// swith
+
+ nError2 = testFile.close( );
+ CPPUNIT_ASSERT_MESSAGE( " in CheckFile() function, close file ", nError2 == FileBase::E_None );
+
+ }
+
+ return bCheckResult;
+}
+
+//check if the file exist
+inline sal_Bool ifFileExist( const ::rtl::OUString & str )
+{
+ sal_Bool bCheckResult = sal_False;
+
+/*#ifdef WNT
+ ::rtl::OUString aUStr = str.copy( 0 );
+ if ( isURL( str ) )
+ ::osl::FileBase::getSystemPathFromFileURL( str, aUStr );
+
+ ::rtl::OString aString = ::rtl::OUStringToOString( aUStr, RTL_TEXTENCODING_ASCII_US );
+ const char *path = aString.getStr( );
+ if (( _access( path, 0 ) ) != -1 )
+ bCheckResult = sal_True;
+#else*/
+ ::rtl::OString aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ // const char *path = aString.getStr( );
+ ::osl::File testFile( str );
+ bCheckResult = ( osl::FileBase::E_None == testFile.open( OpenFlag_Read ) );
+ //if (bCheckResult)
+ //t_print("%s exist!\n", path);
+ //else
+ //t_print("%s not exist!\n", path);
+//#endif
+ return bCheckResult;
+
+}
+
+//check if the file can be writen
+inline sal_Bool ifFileCanWrite( const ::rtl::OUString & str )
+{
+ sal_Bool bCheckResult = sal_False;
+ //on Windows, the file has no write right, but can be written
+#ifdef WNT
+ ::rtl::OUString aUStr = str.copy( 0 );
+ if ( isURL( str ) )
+ ::osl::FileBase::getSystemPathFromFileURL( str, aUStr );
+
+ ::rtl::OString aString = ::rtl::OUStringToOString( aUStr, RTL_TEXTENCODING_ASCII_US );
+ const char *path = aString.getStr( );
+ if (( _access( path, 2 ) ) != -1 )
+ bCheckResult = sal_True;
+ //on UNX, just test if open success with OpenFlag_Write
+#else
+ ::osl::File testFile( str );
+ bCheckResult = (osl::FileBase::E_None == testFile.open( OpenFlag_Write ));
+#endif
+ return bCheckResult;
+}
+
+inline sal_Bool checkDirectory( const ::rtl::OUString & str, oslCheckMode nCheckMode )
+{
+ rtl::OUString aUString;
+ DirectoryItem rItem;
+ FileBase::RC rc;
+ sal_Bool bCheckResult= sal_False;
+
+ //::std::auto_ptr<Directory> pDir( new Directory( str ) );
+ Directory aDir( str );
+ rc = aDir.open( );
+
+ if ( ( ::osl::FileBase::E_NOENT != rc ) && ( ::osl::FileBase::E_ACCES != rc ) ){
+
+ switch ( nCheckMode ) {
+ case osl_Check_Mode_Exist:
+ if ( rc == ::osl::FileBase::E_None )
+ bCheckResult = sal_True;
+ break;
+ case osl_Check_Mode_OpenAccess:
+ if ( rc == ::osl::FileBase::E_None )
+ bCheckResult = sal_True;
+ break;
+ case osl_Check_Mode_ReadAccess:
+ //rc = pDir->getNextItem( rItem, 0 );
+ rc = aDir.getNextItem( rItem, 0 );
+ if ( ( rc == ::osl::FileBase::E_None ) || ( rc == ::osl::FileBase::E_NOENT ) )
+ bCheckResult = sal_True;
+ else
+ bCheckResult = sal_False;
+ break;
+ case osl_Check_Mode_WriteAccess:
+ ( ( aUString += str ) += aSlashURL ) += aTmpName2;
+ //if ( ( rc = pDir->create( aUString ) ) == ::osl::FileBase::E_None )
+ if ( ( rc = Directory::create( aUString ) ) == ::osl::FileBase::E_None )
+ {
+ bCheckResult = sal_True;
+ //rc = pDir->remove( aUString );
+ rc = Directory::remove( aUString );
+ CPPUNIT_ASSERT( rc == ::osl::FileBase::E_None );
+ }
+ else
+ bCheckResult = sal_False;
+ break;
+
+ default:
+ bCheckResult = sal_False;
+ }// switch
+
+ rc = aDir.close( );
+ CPPUNIT_ASSERT( rc == FileBase::E_None );
+
+ }//if
+
+ return bCheckResult;
+}
+
+/** construct error message
+*/
+inline ::rtl::OUString outputError( const ::rtl::OUString & returnVal, const ::rtl::OUString & rightVal, const sal_Char * msg = "")
+{
+ ::rtl::OUString aUString;
+ if ( returnVal.equals( rightVal ) )
+ return aUString;
+ aUString += ::rtl::OUString::createFromAscii(msg);
+ aUString += ::rtl::OUString::createFromAscii(": the returned value is '");
+ aUString += returnVal;
+ aUString += ::rtl::OUString::createFromAscii("', but the value should be '");
+ aUString += rightVal;
+ aUString += ::rtl::OUString::createFromAscii("'.");
+ return aUString;
+}
+
+/** Change file mode, two version in UNIX and Windows;.
+*/
+#if ( defined UNX ) || ( defined OS2 ) //chmod() method is differ in Windows
+inline void changeFileMode( ::rtl::OUString & filepath, sal_Int32 mode )
+{
+ rtl::OString aString;
+ rtl::OUString aUStr = filepath.copy( 0 );
+
+ if ( isURL( filepath ) )
+ ::osl::FileBase::getSystemPathFromFileURL( filepath, aUStr );
+ aString = ::rtl::OUStringToOString( aUStr, RTL_TEXTENCODING_ASCII_US );
+ chmod( aString.getStr( ), mode );
+}
+#else //Windows version
+inline void changeFileMode( ::rtl::OUString & filepath, sal_Int32 mode )
+{
+ (void)filepath;
+ (void)mode;
+ t_print("this method is not implemented yet");
+}
+#endif
+
+inline ::rtl::OUString getCurrentPID( void );
+
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for FileBase class
+//------------------------------------------------------------------------
+namespace osl_FileBase
+{
+
+#if 0 //~ this function has been deprecated
+ //---------------------------------------------------------------------
+ // testing the method
+ // static inline RC getCanonicalName( const ::rtl::OUString& ustrRequestedURL, ::rtl::OUString& ustrValidURL )
+ //
+ // The illegal characters are ;+=[]',\"*\\<>/?:|.
+ // because getCanonicalName method is not implemented yet and will be deprecated in the future, this test is not necessary.
+ //---------------------------------------------------------------------
+
+ class getCanonicalName:public CppUnit::TestFixture
+ {
+
+ public:
+ ::osl::FileBase::RC nError;
+
+ void getCanonicalName_001( )
+ {
+ ::rtl::OUString aUStr_ValidURL;
+ nError = ::osl::FileBase::getCanonicalName( aCanURL1, aUStr_ValidURL );
+
+ CPPUNIT_ASSERT_MESSAGE("test for getCanonicalName function: check valid and unused file name",
+ ( osl::FileBase::E_None == nError ) && aUStr_ValidURL.equalsIgnoreAsciiCase( aCanURL1 ) );
+ }
+
+ void getCanonicalName_002( )
+ {
+ ::rtl::OUString aUStr_ValidURL;
+
+ createTestFile( aCanURL1 );
+ nError = ::osl::FileBase::getCanonicalName( aCanURL1, aUStr_ValidURL );
+ deleteTestFile( aCanURL1 );
+
+ CPPUNIT_ASSERT_MESSAGE( " test for getCanonicalName function: an existed file name, should different from the request, it did not passed(W32)(UNX)",
+ ( osl::FileBase::E_None == nError ) && aUStr_ValidURL.equalsIgnoreAsciiCase( aCanURL1 ) );
+ }
+
+ void getCanonicalName_003( )
+ {
+ ::rtl::OUString aUStr_ValidURL;
+ nError = ::osl::FileBase::getCanonicalName ( aCanURL2, aUStr_ValidURL );
+
+ CPPUNIT_ASSERT_MESSAGE( " test for getCanonicalName function: invalid file name, should different from the request, it did not passed(W32)(UNX)",
+ ( osl::FileBase::E_None == nError ) && aUStr_ValidURL.equalsIgnoreAsciiCase( aCanURL2 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getCanonicalName );
+ CPPUNIT_TEST( getCanonicalName_001 );
+ CPPUNIT_TEST( getCanonicalName_002 );
+ CPPUNIT_TEST( getCanonicalName_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getCanonicalName
+#endif
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // static inline RC getAbsoluteFileURL( const ::rtl::OUString& ustrBaseDirectoryURL,
+ // const ::rtl::OUString& ustrRelativeFileURL,
+ // ::rtl::OUString& ustrAbsoluteFileURL )
+ //---------------------------------------------------------------------
+
+ class getAbsoluteFileURL:public CppUnit::TestFixture
+ {
+ //::osl::FileBase aFileBase;
+ ::rtl::OUString aResultURL1, aResultURL2, aResultURL3, aResultURL4, aResultURL5, aResultURL6;
+ // ::osl::FileBase::RC nError;
+ sal_Bool bOk;
+
+ public:
+
+ void check_getAbsoluteFileURL( rtl::OUString const& _suBaseURL, rtl::OString const& _sRelativeURL, ::osl::FileBase::RC _nAssumeError, rtl::OUString const& _suAssumeResultStr );
+
+ void getAbsoluteFileURL_001_1();
+ void getAbsoluteFileURL_001_2();
+ void getAbsoluteFileURL_001_3();
+ void getAbsoluteFileURL_001_4();
+ void getAbsoluteFileURL_001_5();
+ void getAbsoluteFileURL_001_6();
+ void getAbsoluteFileURL_001_7();
+ void getAbsoluteFileURL_001_8();
+ void getAbsoluteFileURL_002();
+ void getAbsoluteFileURL_003();
+ void getAbsoluteFileURL_004();
+
+ CPPUNIT_TEST_SUITE( getAbsoluteFileURL );
+ CPPUNIT_TEST( getAbsoluteFileURL_001_1 );
+ CPPUNIT_TEST( getAbsoluteFileURL_001_2 );
+ CPPUNIT_TEST( getAbsoluteFileURL_001_3 );
+ CPPUNIT_TEST( getAbsoluteFileURL_001_4 );
+ CPPUNIT_TEST( getAbsoluteFileURL_001_5 );
+ CPPUNIT_TEST( getAbsoluteFileURL_001_6 );
+ CPPUNIT_TEST( getAbsoluteFileURL_001_7 );
+ CPPUNIT_TEST( getAbsoluteFileURL_001_8 );
+ CPPUNIT_TEST( getAbsoluteFileURL_002 );
+ CPPUNIT_TEST( getAbsoluteFileURL_003 );
+ CPPUNIT_TEST( getAbsoluteFileURL_004 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; //class getAbsoluteFileURL
+
+/* use coding format as same as getSystemPathFromFileURL
+ // initialization
+ void setUp( )
+ {
+ sal_Char pResultURL1[] = "/relative/file1";
+ sal_Char pResultURL2[] = "/relative/file2";
+ sal_Char pResultURL3[] = "/file3";
+ sal_Char pResultURL4[] = "/file4";
+ sal_Char pResultURL5[] = "/canonical.name";
+ sal_Char pResultURL6[] = "/relative/";
+ aResultURL1 = aUserDirectoryURL.concat( rtl::OUString::createFromAscii( pResultURL1 ) );
+ aResultURL2 = aUserDirectoryURL.concat( rtl::OUString::createFromAscii( pResultURL2 ) );
+ aResultURL3 = aUserDirectoryURL.concat( rtl::OUString::createFromAscii( pResultURL3 ) );
+ aResultURL4 = aUserDirectoryURL.concat( rtl::OUString::createFromAscii( pResultURL4 ) );
+ aResultURL5 = aUserDirectoryURL.concat( rtl::OUString::createFromAscii( pResultURL5 ) );
+ aResultURL6 = aUserDirectoryURL.concat( rtl::OUString::createFromAscii( pResultURL6 ) );
+ }
+
+ void tearDown( )
+ {
+ }
+
+ // test code
+ void getAbsoluteFileURL_001( )
+ {
+ ::rtl::OUString aUStr_AbsURL;
+
+ ::osl::FileBase::RC nError11 = aFileBase.getAbsoluteFileURL( aUserDirectoryURL, aRelURL1, aUStr_AbsURL );
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii("test for getAbsoluteFileURL(' ");
+ suError += aUserDirectoryURL;
+ suError += ::rtl::OUString::createFromAscii("', '");
+ suError += aRelURL1;
+ suError += ::rtl::OUString::createFromAscii("', '");
+ suError += aUStr_AbsURL;
+ suError += outputError( aUStr_AbsURL, aResultURL1, "' ),");
+
+ sal_Bool nError12 = aUStr_AbsURL.equals( aResultURL1 );
+ ::osl::FileBase::RC nError21 = aFileBase.getAbsoluteFileURL( aUserDirectoryURL, aRelURL2, aUStr_AbsURL );
+ sal_Bool nError22 = aUStr_AbsURL.equals( aResultURL2 );
+ ::osl::FileBase::RC nError31 = aFileBase.getAbsoluteFileURL( aUserDirectoryURL, aRelURL3, aUStr_AbsURL );
+ sal_Bool nError32 = aUStr_AbsURL.equals( aResultURL3 );
+ ::osl::FileBase::RC nError41 = aFileBase.getAbsoluteFileURL( aUserDirectoryURL, aRelURL4, aUStr_AbsURL );
+ sal_Bool nError42 = aUStr_AbsURL.equals( aResultURL4 );
+ ::osl::FileBase::RC nError61 = aFileBase.getAbsoluteFileURL( aUserDirectoryURL, aRelURL6, aUStr_AbsURL );
+ sal_Bool nError62 = aUStr_AbsURL.equals( aResultURL6 );
+ printFileName( aUStr_AbsURL );
+ printFileName( aResultURL6 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for getAbsoluteFileURL function: valid file name with valid directory",
+ ( ::osl::FileBase::E_None == nError11 ) && ( sal_True == nError12 ) &&
+ ( ::osl::FileBase::E_None == nError21 ) && ( sal_True == nError22 ) &&
+ ( ::osl::FileBase::E_None == nError31 ) && ( sal_True == nError32 ) &&
+ ( ::osl::FileBase::E_None == nError41 ) && ( sal_True == nError42 ) &&
+ ( ::osl::FileBase::E_None == nError61 ) && ( sal_True == nError62 ) );
+ }
+
+
+#if ( defined UNX ) || ( defined OS2 ) //Link is not defined in Windows
+ void getAbsoluteFileURL_002( )
+ {
+ ::rtl::OUString aUStr_AbsURL, aUStr_LnkFileSys( aTempDirectorySys ), aUStr_SrcFileSys( aTempDirectorySys );
+ ( ( aUStr_LnkFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/link.file");
+ ( ( aUStr_SrcFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/canonical.name");
+
+ rtl::OString strLinkFileName, strSrcFileName;
+ strLinkFileName = OUStringToOString( aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US );
+ strSrcFileName = OUStringToOString( aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US );
+
+ createTestFile( aCanURL1 );
+ sal_Int32 fd = symlink( strSrcFileName.getStr(), strLinkFileName.getStr() );
+ CPPUNIT_ASSERT( fd == 0 );
+
+ nError = aFileBase.getAbsoluteFileURL( aUserDirectoryURL, aLnkURL1, aUStr_AbsURL );
+ bOk = aUStr_AbsURL.equals( aResultURL5 );
+
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii("test for getAbsoluteFileURL(' ");
+ suError += aUserDirectoryURL;
+ suError += ::rtl::OUString::createFromAscii("', '");
+ suError += aLnkURL1;
+ suError += ::rtl::OUString::createFromAscii("', '");
+ suError += aUStr_AbsURL;
+ suError += outputError( aUStr_AbsURL, aResultURL5, "' ),");
+ //printFileName(suError);
+
+ deleteTestFile( aCanURL1 );
+ fd = remove( strLinkFileName.getStr() );
+ CPPUNIT_ASSERT( fd == 0 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for getAbsoluteFileURL function: URL contain link( Solaris version )",
+ ( ::osl::FileBase::E_None == nError ) && ( sal_True == bOk ) );
+ }
+#else //Windows version
+ void getAbsoluteFileURL_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE("test for getAbsoluteFileURL function: URL contain link( Windows version )",
+ 1 );
+ }
+#endif
+
+ void getAbsoluteFileURL_003( )
+ {
+// LLA: may be a wrong test, aTmpName1 not a real URL
+#if 0
+ ::rtl::OUString aUStr_AbsURL;
+
+ nError = aFileBase.getAbsoluteFileURL( aTmpName1, aRelURL1, aUStr_AbsURL ); //base dir invalid error
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii("test for getAbsoluteFileURL('");
+ suError += aTmpName1;
+ suError += ::rtl::OUString::createFromAscii("', '");
+ suError += aRelURL1;
+ suError += ::rtl::OUString::createFromAscii("', '");
+ suError += aUStr_AbsURL;
+ suError += ::rtl::OUString::createFromAscii("' ),Parameter is invalid. it ignore the invalid base in Windows, did not pass in (W32), the reason maybe caused by the similar bug with getSystemPathFromFileURL() ");
+
+ CPPUNIT_ASSERT_MESSAGE( suError, ( ::osl::FileBase::E_INVAL == nError ) );
+#endif
+ }
+
+ //use ".." in relartive path, the BasePath must exist on the file system
+ void getAbsoluteFileURL_004( )
+ {
+ //create two level directories under $Temp/PID/
+ ::rtl::OUString aUStrUpBase = aUserDirectoryURL + ::rtl::OUString::createFromAscii("/test1");
+ createTestDirectory( aUStrUpBase );
+ ::rtl::OUString aUStrBase = aUserDirectoryURL + ::rtl::OUString::createFromAscii("/test1/dir1");
+ createTestDirectory( aUStrBase );
+
+ ::rtl::OUString aUStrRelar = ::rtl::OUString::createFromAscii("../../mytestfile");
+ ::rtl::OUString aUStr_AbsURL;
+ ::rtl::OUString aResultURL6 = aUserDirectoryURL + ::rtl::OUString::createFromAscii("/mytestfile");
+
+ nError = aFileBase.getAbsoluteFileURL( aUStrBase, aUStrRelar, aUStr_AbsURL );
+ bOk = aUStr_AbsURL.equals( aResultURL6 );
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii("test for getAbsoluteFileURL('");
+ suError += aUStrBase;
+ suError += ::rtl::OUString::createFromAscii("', '");
+ suError += aUStrRelar;
+ suError += ::rtl::OUString::createFromAscii("', '");
+ suError += aUStr_AbsURL;
+ suError += outputError( aUStr_AbsURL, aResultURL6, "' ), did not pass on Win32 ");
+
+ deleteTestDirectory( aUStrBase );
+ deleteTestDirectory( aUStrUpBase );
+
+ CPPUNIT_ASSERT_MESSAGE( suError, ( ::osl::FileBase::E_None == nError ) && ( sal_True == bOk ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getAbsoluteFileURL );
+ CPPUNIT_TEST( getAbsoluteFileURL_001 );
+ CPPUNIT_TEST( getAbsoluteFileURL_002 );
+ CPPUNIT_TEST( getAbsoluteFileURL_003 );
+ CPPUNIT_TEST( getAbsoluteFileURL_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getAbsoluteFileURL*/
+
+ void getAbsoluteFileURL::check_getAbsoluteFileURL( rtl::OUString const& _suBaseURL, rtl::OString const& _sRelativeURL, ::osl::FileBase::RC _nAssumeError, rtl::OUString const& _suAssumeResultStr )
+ {
+ rtl::OUString suRelativeURL = rtl::OStringToOUString(_sRelativeURL, RTL_TEXTENCODING_UTF8);
+ rtl::OString sBaseURL = rtl::OUStringToOString(_suBaseURL, RTL_TEXTENCODING_UTF8);
+ rtl::OUString suResultURL;
+ osl::FileBase::RC nError = FileBase::getAbsoluteFileURL( _suBaseURL, suRelativeURL, suResultURL );
+ rtl::OString sResultURL = rtl::OUStringToOString( suResultURL, RTL_TEXTENCODING_UTF8);
+ rtl::OString sError = errorToString(nError);
+ t_print("getAbsoluteFileURL('%s','%s') deliver absolute URL: '%s', error '%s'\n", sBaseURL.getStr(), _sRelativeURL.getStr(),sResultURL.getStr(), sError.getStr() );
+ CPPUNIT_ASSERT_MESSAGE( "Assumption is wrong: error number is wrong", nError == _nAssumeError );
+ if ( nError == ::osl::FileBase::E_None )
+ {
+ sal_Bool bStrAreEqual = _suAssumeResultStr.equals( suResultURL );
+ CPPUNIT_ASSERT_MESSAGE( "Assumption is wrong: ResultURL is not equal to expected URL ", bStrAreEqual == sal_True );
+ }
+ }
+
+ void getAbsoluteFileURL::getAbsoluteFileURL_001_1()
+ {
+ rtl::OUString suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/relative/file1") );
+ check_getAbsoluteFileURL( aUserDirectoryURL, "relative/file1",::osl::FileBase::E_None, suAssume );
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_001_2()
+ {
+ rtl::OUString suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/relative/file2") );
+ check_getAbsoluteFileURL( aUserDirectoryURL, "relative/./file2",::osl::FileBase::E_None, suAssume );
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_001_3()
+ {
+ rtl::OUString suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/file3") );
+ check_getAbsoluteFileURL( aUserDirectoryURL, "relative/../file3",::osl::FileBase::E_None, suAssume );
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_001_4()
+ {
+ rtl::OUString suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/file4") );
+ check_getAbsoluteFileURL( aUserDirectoryURL, "././relative/../file4",::osl::FileBase::E_None, suAssume );
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_001_5()
+ {
+ rtl::OUString suAssume;
+#if ( defined UNX )
+ suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/relative/") );
+#else
+ suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/relative") );
+#endif
+ check_getAbsoluteFileURL( aUserDirectoryURL, "././relative/.",::osl::FileBase::E_None, suAssume );
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_001_6()
+ {
+ rtl::OUString suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/.relative") );
+ check_getAbsoluteFileURL( aUserDirectoryURL, "./.relative",::osl::FileBase::E_None, suAssume );
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_001_7()
+ {
+ rtl::OUString suAssume;
+#if (defined UNX )
+ suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/.a/") );
+#else //windows
+ suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/.a") );
+#endif
+ check_getAbsoluteFileURL( aUserDirectoryURL, "./.a/mydir/..",::osl::FileBase::E_None, suAssume );
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_001_8()
+ {
+ rtl::OUString suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/tmp/ok") );
+#if ( defined UNX ) || ( defined OS2 )
+ check_getAbsoluteFileURL( aUserDirectoryURL, "tmp//ok",::osl::FileBase::E_None, suAssume );
+#else
+ check_getAbsoluteFileURL( aUserDirectoryURL, "tmp//ok",::osl::FileBase::E_INVAL, suAssume );
+#endif
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_002()
+ {
+#if ( defined UNX ) || ( defined OS2 ) //Link is not defined in Windows
+ ::rtl::OUString aUStr_AbsURL, aUStr_LnkFileSys( aTempDirectorySys ), aUStr_SrcFileSys( aTempDirectorySys );
+ ( ( aUStr_LnkFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/link.file");
+ ( ( aUStr_SrcFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/canonical.name");
+
+ rtl::OString strLinkFileName, strSrcFileName;
+ strLinkFileName = OUStringToOString( aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US );
+ strSrcFileName = OUStringToOString( aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US );
+
+ createTestFile( aCanURL1 );
+ sal_Int32 fd = symlink( strSrcFileName.getStr(), strLinkFileName.getStr() );
+ CPPUNIT_ASSERT( fd == 0 );
+ rtl::OString sLnkURL = OUStringToOString( aLnkURL1, RTL_TEXTENCODING_ASCII_US );
+ rtl::OUString suAssume = aUserDirectoryURL.concat( rtl::OUString::createFromAscii("/canonical.name") );
+ check_getAbsoluteFileURL( aUserDirectoryURL, sLnkURL, ::osl::FileBase::E_None, suAssume );
+ deleteTestFile( aCanURL1 );
+ fd = remove( strLinkFileName.getStr() );
+ CPPUNIT_ASSERT( fd == 0 );
+#endif
+ }
+ //please see line# 930
+ void getAbsoluteFileURL::getAbsoluteFileURL_003()
+ {
+ }
+ void getAbsoluteFileURL::getAbsoluteFileURL_004()
+ {
+ //create two level directories under $Temp/PID/
+ ::rtl::OUString aUStrUpBase = aUserDirectoryURL + ::rtl::OUString::createFromAscii("/test1");
+ createTestDirectory( aUStrUpBase );
+ ::rtl::OUString aUStrBase = aUserDirectoryURL + ::rtl::OUString::createFromAscii("/test1/dir1");
+ createTestDirectory( aUStrBase );
+
+ ::rtl::OUString suAssume = aUserDirectoryURL.concat( ::rtl::OUString::createFromAscii("/mytestfile") );
+ check_getAbsoluteFileURL( aUStrBase, "../../mytestfile" , ::osl::FileBase::E_None, suAssume );
+ deleteTestDirectory( aUStrBase );
+ deleteTestDirectory( aUStrUpBase );
+ }
+ //---------------------------------------------------------------------
+ // testing two methods:
+ // static inline RC getSystemPathFromFileURL( const ::rtl::OUString& ustrFileURL,
+ // ::rtl::OUString& ustrSystemPath )
+ // static RC getFileURLFromSystemPath( const ::rtl::OUString & ustrSystemPath,
+ // ::rtl::OUString & ustrFileURL );
+ //---------------------------------------------------------------------
+ class SystemPath_FileURL:public CppUnit::TestFixture
+ {
+ //::osl::FileBase aFileBase;
+ // ::rtl::OUString aUStr;
+ // ::osl::FileBase::RC nError;
+
+ //void check_getSystemPathFromFileURL(rtl::OString const& _sURL, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sAssumeResultStr);
+ void check_SystemPath_FileURL(rtl::OString const& _sSource, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sAssumeResultStr, sal_Bool bDirection = sal_True );
+ void checkWNTBehaviour_getSystemPathFromFileURL(rtl::OString const& _sURL, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sWNTAssumeResultString );
+ void checkUNXBehaviour_getSystemPathFromFileURL(rtl::OString const& _sURL, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sUnixAssumeResultString );
+ void checkWNTBehaviour_getFileURLFromSystemPath(rtl::OString const& _sSysPath, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sWNTAssumeResultString);
+ void checkUNXBehaviour_getFileURLFromSystemPath(rtl::OString const& _sSysPath, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sUnixAssumeResultString);
+
+ public:
+ // test code.
+ void getSystemPathFromFileURL_001_1( );
+ void getSystemPathFromFileURL_001_2( );
+ void getSystemPathFromFileURL_001_21( );
+ void getSystemPathFromFileURL_001_22( );
+ void getSystemPathFromFileURL_001_3( );
+ void getSystemPathFromFileURL_001_31( );
+ void getSystemPathFromFileURL_001_4( );
+ void getSystemPathFromFileURL_001_41( );
+ void getSystemPathFromFileURL_001_5( );
+ void getSystemPathFromFileURL_001_51( );
+ void getSystemPathFromFileURL_001_52( );
+ void getSystemPathFromFileURL_001_53( );
+ void getSystemPathFromFileURL_001_6( );
+ void getSystemPathFromFileURL_001_61( );
+ void getSystemPathFromFileURL_001_7( );
+ void getSystemPathFromFileURL_001_71( );
+ void getSystemPathFromFileURL_001_8( );
+ void getSystemPathFromFileURL_001_81( );
+ void getSystemPathFromFileURL_001_9( );
+ void getSystemPathFromFileURL_001_91( );
+ void getSystemPathFromFileURL_001_92( );
+ void getSystemPathFromFileURL_004( );
+ void getSystemPathFromFileURL_005( );
+
+ //test case fot getFileURLFromSystemPath
+ void getFileURLFromSystemPath_001( );
+ void getFileURLFromSystemPath_002( );
+ void getFileURLFromSystemPath_003( );
+ void getFileURLFromSystemPath_004( );
+ void getFileURLFromSystemPath_005( );
+
+ CPPUNIT_TEST_SUITE( SystemPath_FileURL );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_1 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_2 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_21 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_22 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_3 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_31 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_4 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_41 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_5 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_51 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_52 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_53 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_6 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_61 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_7 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_71 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_8 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_81 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_9 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_91 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_001_92 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_004 );
+ CPPUNIT_TEST( getSystemPathFromFileURL_005 );
+ CPPUNIT_TEST( getFileURLFromSystemPath_001 );
+ CPPUNIT_TEST( getFileURLFromSystemPath_002 );
+ CPPUNIT_TEST( getFileURLFromSystemPath_003 );
+ CPPUNIT_TEST( getFileURLFromSystemPath_004 );
+ CPPUNIT_TEST( getFileURLFromSystemPath_005 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class SystemPath_FileURL
+
+
+ // test code.
+
+ /* void getSystemPathFromFileURL::check_getSystemPathFromFileURL(rtl::OString const& _sURL, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sAssumeResultStr)
+ {
+ // PRE: URL as String
+ rtl::OUString suURL;
+ rtl::OUString suStr;
+ suURL = rtl::OStringToOUString(_sURL, RTL_TEXTENCODING_UTF8);
+ ::osl::FileBase::RC nError = osl::FileBase::getSystemPathFromFileURL( suURL, suStr ); // start with /
+
+ // if the given string is gt length 0,
+ // we check also this string
+ rtl::OString sStr = rtl::OUStringToOString(suStr, RTL_TEXTENCODING_UTF8);
+ rtl::OString sError = errorToString(nError);
+ t_print("getSystemPathFromFileURL('%s') deliver system path: '%s', error '%s'\n", _sURL.getStr(), sStr.getStr(), sError.getStr() );
+
+ // rtl::OUString suStrEncode = rtl::Uri::encode(suStr, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8);
+ // sStr = rtl::OUStringToOString(suStr, RTL_TEXTENCODING_UTF8);
+ // t_print("UTF8: %s\n", sStr.getStr() );
+
+ if (_sAssumeResultStr.getLength() > 0)
+ {
+ sal_Bool bStrAreEqual = _sAssumeResultStr.equals(sStr);
+ CPPUNIT_ASSERT_MESSAGE( "Assumption is wrong",
+ nError == _nAssumeError && bStrAreEqual == sal_True );
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE( "Assumption is wrong", nError == _nAssumeError );
+ }
+ }*/
+
+ // if bDirection==sal_True, check getSystemPathFromFileURL
+ // if bDirection==sal_False, check getFileURLFromSystemPath
+ void SystemPath_FileURL::check_SystemPath_FileURL(rtl::OString const& _sSource, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sAssumeResultStr, sal_Bool bDirection)
+ {
+ // PRE: URL as String
+ rtl::OUString suSource;
+ rtl::OUString suStr;
+ suSource = rtl::OStringToOUString(_sSource, RTL_TEXTENCODING_UTF8);
+ ::osl::FileBase::RC nError;
+ if ( bDirection == sal_True )
+ nError = osl::FileBase::getSystemPathFromFileURL( suSource, suStr );
+ else
+ nError = osl::FileBase::getFileURLFromSystemPath( suSource, suStr );
+
+ // if the given string is gt length 0,
+ // we check also this string
+ rtl::OString sStr = rtl::OUStringToOString(suStr, RTL_TEXTENCODING_UTF8);
+ rtl::OString sError = errorToString(nError);
+ if ( bDirection == sal_True )
+ t_print("getSystemPathFromFileURL('%s') deliver system path: '%s', error '%s'\n", _sSource.getStr(), sStr.getStr(), sError.getStr() );
+ else
+ t_print("getFileURLFromSystemPath('%s') deliver File URL: '%s', error '%s'\n", _sSource.getStr(), sStr.getStr(), sError.getStr() );
+
+ // rtl::OUString suStrEncode = rtl::Uri::encode(suStr, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8);
+ // sStr = rtl::OUStringToOString(suStr, RTL_TEXTENCODING_UTF8);
+ // t_print("UTF8: %s\n", sStr.getStr() );
+
+ if (_sAssumeResultStr.getLength() > 0)
+ {
+ sal_Bool bStrAreEqual = _sAssumeResultStr.equals(sStr);
+ CPPUNIT_ASSERT_MESSAGE( "Assumption is wrong",
+ nError == _nAssumeError && bStrAreEqual == sal_True );
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE( "Assumption is wrong", nError == _nAssumeError );
+ }
+ }
+ void SystemPath_FileURL::checkWNTBehaviour_getSystemPathFromFileURL(rtl::OString const& _sURL, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sWNTAssumeResultString)
+ {
+#if ( defined WNT )
+ check_SystemPath_FileURL(_sURL, _nAssumeError, _sWNTAssumeResultString);
+#else
+ (void)_sURL;
+ (void)_nAssumeError;
+ (void)_sWNTAssumeResultString;
+#endif
+ }
+
+ void SystemPath_FileURL::checkUNXBehaviour_getSystemPathFromFileURL(rtl::OString const& _sURL, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sUnixAssumeResultString)
+ {
+#if ( defined UNX )
+ check_SystemPath_FileURL(_sURL, _nAssumeError, _sUnixAssumeResultString);
+#else
+ (void)_sURL;
+ (void)_nAssumeError;
+ (void)_sUnixAssumeResultString;
+#endif
+ }
+
+ void SystemPath_FileURL::checkWNTBehaviour_getFileURLFromSystemPath(rtl::OString const& _sSysPath, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sWNTAssumeResultString)
+ {
+#if ( defined WNT )
+ check_SystemPath_FileURL(_sSysPath, _nAssumeError, _sWNTAssumeResultString, sal_False );
+#else
+ (void)_sSysPath;
+ (void)_nAssumeError;
+ (void)_sWNTAssumeResultString;
+#endif
+ }
+
+ void SystemPath_FileURL::checkUNXBehaviour_getFileURLFromSystemPath(rtl::OString const& _sSysPath, ::osl::FileBase::RC _nAssumeError, rtl::OString const& _sUnixAssumeResultString)
+ {
+#if ( defined UNX )
+ check_SystemPath_FileURL(_sSysPath, _nAssumeError, _sUnixAssumeResultString, sal_False );
+#else
+ (void)_sSysPath;
+ (void)_nAssumeError;
+ (void)_sUnixAssumeResultString;
+#endif
+ }
+
+ /** LLA: Test for getSystemPathFromFileURL()
+ this test is splitted into 2 different OS tests,
+ the first function checkUNXBehaviour... runs only on Unix based Systems,
+ the second only on windows based systems
+ the first parameter are a file URL where we want to get the system path of,
+ the second parameter is the assumed error of the osl_getSystemPathFromFileURL() function,
+ the thrid parameter is the assumed result string, the string will only test, if it's length is greater 0
+ */
+
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_1()
+ {
+ rtl::OString sURL("");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_2()
+ {
+ rtl::OString sURL("/");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "\\");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_21()
+ {
+ // rtl::OString sURL("%2f");
+ rtl::OString sURL("%2F");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/"); // LLA: this is may be a BUG
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_22()
+ {
+ rtl::OString sURL("file:///tmp%2Fmydir");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_3()
+ {
+ rtl::OString sURL("a");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "a");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "a");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_31()
+ {
+ rtl::OString sURL("tmpname");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "tmpname");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "tmpname");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_4()
+ {
+ rtl::OString sURL("file://");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_41()
+ {
+ rtl::OString sURL("file://localhost/tmp");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_5()
+ {
+ rtl::OString sURL("file:///tmp");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/tmp");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_51()
+ {
+ rtl::OString sURL("file://c:/tmp");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:/tmp"); // LLA: this is may be a BUG
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_52()
+ {
+ rtl::OString sURL("file:///c:/tmp");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c:/tmp");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_53()
+ {
+// LLA: is this a legal file path?
+ rtl::OString sURL("file:///c|/tmp");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c|/tmp");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_6()
+ {
+ rtl::OString sURL("file:///tmp/first");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/tmp/first");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_61()
+ {
+ rtl::OString sURL("file:///c:/tmp/first");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c:/tmp/first");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp\\first");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_7()
+ {
+ rtl::OString sURL("file:///tmp/../second");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/tmp/../second"); // LLA: may be a BUG
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_71()
+ {
+ rtl::OString sURL("file:///c:/tmp/../second");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c:/tmp/../second");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp\\..\\second");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_8()
+ {
+ rtl::OString sURL("../tmp");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "../tmp");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "..\\tmp");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_81()
+ {
+ rtl::OString sURL("file://~/tmp");
+ char* home_path;
+ home_path = getenv("HOME");
+ rtl::OString expResult(home_path);
+ expResult += "/tmp";
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, expResult );
+ // checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "\\tmp");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_9()
+ {
+ rtl::OString sURL("file:///tmp/first%20second");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/tmp/first second");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_91()
+ {
+ rtl::OString sURL("file:///c:/tmp/first%20second");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "/c:/tmp/first second");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "c:\\tmp\\first second");
+ }
+
+ void SystemPath_FileURL::getSystemPathFromFileURL_001_92()
+ {
+ rtl::OString sURL("ca@#;+.,$///78no%01ni..name");
+ checkUNXBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_None, "");
+ checkWNTBehaviour_getSystemPathFromFileURL(sURL, osl::FileBase::E_INVAL, "");
+ }
+
+#if 0
+ void SystemPath_FileURL::getSystemPathFromFileURL_003( )
+ {
+// LLA: ???
+//!! seams to be, that the directories do not pass together
+ ::rtl::OUString aUStr;
+ ::rtl::OUString aRelativeURL = ::rtl::OUString::createFromAscii("../../relartive/file3");
+ ::rtl::OUString aResultURL ( aSysPath4 );
+ ::osl::FileBase::RC nError = osl::FileBase::getSystemPathFromFileURL( aRelativeURL, aUStr );
+
+ sal_Bool bOk = compareFileName( aUStr, aResultURL );
+
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii("test for getSystemPathFromFileURL(");
+ suError += aRelativeURL;
+ suError += ::rtl::OUString::createFromAscii(") function:use a relative file URL, did not pass in(W32), it did not specified in method declaration of relative path issue, ");
+ suError += outputError(aUStr, aResultURL);
+ CPPUNIT_ASSERT_MESSAGE( suError, ( osl::FileBase::E_None == nError ) && ( sal_True == bOk ) );
+ }
+#endif
+
+ //normal legal case
+ void SystemPath_FileURL::getSystemPathFromFileURL_004( )
+ {
+ ::rtl::OUString aUStr;
+ ::rtl::OUString aNormalURL( aTmpName6 );
+ ::rtl::OUString aResultURL ( aSysPath4 );
+ ::osl::FileBase::RC nError = osl::FileBase::getSystemPathFromFileURL( aNormalURL, aUStr );
+
+ sal_Bool bOk = compareFileName( aUStr, aResultURL );
+
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii("test for getSystemPathFromFileURL(' ");
+ suError += aNormalURL;
+ suError += ::rtl::OUString::createFromAscii(" ') function:use an absolute file URL, ");
+ suError += outputError(aUStr, aResultURL);
+
+ CPPUNIT_ASSERT_MESSAGE( suError, ( osl::FileBase::E_None == nError ) && ( sal_True == bOk ) );
+
+ }
+
+ //CJK charactors case
+ void SystemPath_FileURL::getSystemPathFromFileURL_005( )
+ {
+ ::rtl::OUString aUStr;
+ createTestDirectory( aTmpName10 );
+ ::rtl::OUString aNormalURL( aTmpName10 );
+ ::rtl::OUString aResultURL ( aSysPath5 );
+
+ ::osl::FileBase::RC nError = osl::FileBase::getSystemPathFromFileURL( aNormalURL, aUStr );
+
+ sal_Bool bOk = compareFileName( aUStr, aResultURL );
+
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii("test for getSystemPathFromFileURL(' ");
+ suError += aNormalURL;
+ suError += ::rtl::OUString::createFromAscii(" ') function:use a CJK coded absolute URL, ");
+ suError += outputError(aUStr, aResultURL);
+ deleteTestDirectory( aTmpName10 );
+
+ CPPUNIT_ASSERT_MESSAGE( suError, ( osl::FileBase::E_None == nError ) && ( sal_True == bOk ) );
+ }
+ void SystemPath_FileURL::getFileURLFromSystemPath_001()
+ {
+ rtl::OString sSysPath("~/tmp");
+ char* home_path;
+ home_path = getenv("HOME");
+ rtl::OString expResult(home_path);
+ expResult = "file://"+ expResult + "/tmp";
+ checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, expResult );
+ checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "~/tmp");
+ }
+ void SystemPath_FileURL::getFileURLFromSystemPath_002()
+ {
+ rtl::OString sSysPath("c:/tmp");
+ checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "c:/tmp");
+ checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "file:///c:/tmp");
+ }
+ void SystemPath_FileURL::getFileURLFromSystemPath_003()
+ {
+ rtl::OString sSysPath("file:///temp");
+ checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, "");
+ checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getFileURLFromSystemPath_004()
+ {
+ rtl::OString sSysPath("//tmp//first start");
+ checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_None, "file:///tmp/first%20start");
+ checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, "");
+ }
+ void SystemPath_FileURL::getFileURLFromSystemPath_005()
+ {
+ rtl::OString sSysPath("");
+ checkUNXBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, "");
+ checkWNTBehaviour_getFileURLFromSystemPath(sSysPath, osl::FileBase::E_INVAL, "");
+ }
+ // start with "~user", not impletment
+ // void SystemPath_FileURL::getFileURLFromSystemPath_006()
+
+
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // static inline RC searchFileURL( const ::rtl::OUString& ustrFileName,
+ // const ::rtl::OUString& ustrSearchPath,
+ // ::rtl::OUString& ustrFileURL )
+ //---------------------------------------------------------------------
+ class searchFileURL:public CppUnit::TestFixture
+ {
+ //::osl::FileBase aFileBase;
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1, nError2, nError3,nError4;
+
+ public:
+
+ // test code.
+ void searchFileURL_001( )
+ {
+ /* search file is passed by system filename */
+ nError1 = ::osl::FileBase::searchFileURL( aTmpName1, aUserDirectorySys, aUStr );
+ /* search file is passed by full qualified file URL */
+ nError2 = ::osl::FileBase::searchFileURL( aCanURL1, aUserDirectorySys, aUStr );
+ /* search file is passed by relative file path */
+ nError3 = ::osl::FileBase::searchFileURL( aRelURL4, aUserDirectorySys, aUStr );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for searchFileURL function: system filename/URL filename/relative path, system directory, searched files that is not exist, but it reply invalid error, did not pass in (W32) ",
+ ( osl::FileBase::E_NOENT == nError1 ) &&
+ ( osl::FileBase::E_NOENT == nError2 ) &&
+ ( osl::FileBase::E_NOENT == nError3 ));
+ }
+
+ void searchFileURL_002( )
+ {
+ /* search file is passed by system filename */
+ nError1 = ::osl::FileBase::searchFileURL( aTempDirectorySys, aRootSys, aUStr );
+ sal_Bool bOk1 = compareFileName( aUStr, aTempDirectoryURL );
+ /* search file is passed by full qualified file URL */
+ nError2 = ::osl::FileBase::searchFileURL( aTempDirectoryURL, aRootSys, aUStr );
+ sal_Bool bOk2 = compareFileName( aUStr, aTempDirectoryURL );
+ /* search file is passed by relative file path */
+ nError3 = ::osl::FileBase::searchFileURL( aRelURL5, aRootSys, aUStr );
+ sal_Bool bOk3 = compareFileName( aUStr, aTempDirectoryURL );
+ /* search file is passed by an exist file */
+ createTestFile( aCanURL1 );
+ nError4 = ::osl::FileBase::searchFileURL( aCanURL4, aUserDirectorySys, aUStr );
+ sal_Bool bOk4 = compareFileName( aUStr, aCanURL1 );
+ deleteTestFile( aCanURL1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for searchFileURL function: system filename/URL filename/relative path, system directory, searched file already exist.",
+ ( osl::FileBase::E_None == nError1 ) &&
+ ( osl::FileBase::E_None == nError2 ) &&
+ ( osl::FileBase::E_None == nError3 ) &&
+ ( osl::FileBase::E_None == nError4 ) &&
+ ( sal_True == bOk1 ) &&
+ ( sal_True == bOk2 ) &&
+ ( sal_True == bOk3 ) &&
+ ( sal_True == bOk4 ) );
+ }
+
+
+ void searchFileURL_003( )
+ {
+ OSLTEST_DECLARE( SystemPathList, TEST_PLATFORM_ROOT":"TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP":"TEST_PLATFORM_ROOT"system/path" );
+ nError1 = ::osl::FileBase::searchFileURL( aUserDirectoryURL, aSystemPathList, aUStr );
+ sal_Bool bOk = compareFileName( aUStr, aUserDirectoryURL );
+ CPPUNIT_ASSERT_MESSAGE( "test for searchFileURL function: search directory is a list of system paths",
+ ( osl::FileBase::E_None == nError1 ) &&
+ ( sal_True == bOk ) );
+ }
+
+ void searchFileURL_004( )
+ {
+ OSLTEST_DECLARE( SystemPathList, TEST_PLATFORM_ROOT PATH_LIST_DELIMITER TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP PATH_LIST_DELIMITER TEST_PLATFORM_ROOT "system/path/../name" );
+ nError1 = ::osl::FileBase::searchFileURL( aUserDirectoryURL, aSystemPathList, aUStr );
+ sal_Bool bOk = compareFileName( aUStr, aUserDirectoryURL );
+ CPPUNIT_ASSERT_MESSAGE( "test for searchFileURL function: search directory is a list of system paths",
+ ( osl::FileBase::E_None == nError1 ) &&
+ ( sal_True == bOk ) );
+ }
+
+ void searchFileURL_005( )
+ {
+ nError1 = ::osl::FileBase::searchFileURL( aUserDirectoryURL, aNullURL, aUStr );
+ sal_Bool bOk = compareFileName( aUStr, aUserDirectoryURL );
+ CPPUNIT_ASSERT_MESSAGE( "test for searchFileURL function: search directory is NULL",
+ ( osl::FileBase::E_None == nError1 ) &&
+ ( sal_True == bOk ) );
+ }
+
+ CPPUNIT_TEST_SUITE( searchFileURL );
+ CPPUNIT_TEST( searchFileURL_001 );
+ CPPUNIT_TEST( searchFileURL_002 );
+ CPPUNIT_TEST( searchFileURL_003 );
+ CPPUNIT_TEST( searchFileURL_004 );
+ CPPUNIT_TEST( searchFileURL_005 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class searchFileURL
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // static inline RC getTempDirURL( ::rtl::OUString& ustrTempDirURL )
+ //---------------------------------------------------------------------
+ class getTempDirURL:public CppUnit::TestFixture
+ {
+ //::osl::FileBase aFileBase;
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ nError = FileBase::getTempDirURL( aUStr );
+ }
+
+ void tearDown( )
+ {
+ }
+
+ // test code.
+ void getTempDirURL_001( )
+ {
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getTempDirURL function: excution",
+ ( osl::FileBase::E_None == nError ) );
+ }
+
+ void getTempDirURL_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getTempDirURL function: test for open and write access rights",
+ checkDirectory( aUStr, osl_Check_Mode_OpenAccess ) &&
+ checkDirectory( aUStr, osl_Check_Mode_ReadAccess ) &&
+ checkDirectory( aUStr,osl_Check_Mode_WriteAccess ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getTempDirURL );
+ CPPUNIT_TEST( getTempDirURL_001 );
+ CPPUNIT_TEST( getTempDirURL_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getTempDirURL
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // static inline RC createTempFile( ::rtl::OUString* pustrDirectoryURL,
+ // oslFileHandle* pHandle,
+ // ::rtl::OUString* pustrTempFileURL)
+ //---------------------------------------------------------------------
+ class createTempFile:public CppUnit::TestFixture
+ {
+ //::osl::FileBase aFileBase;
+ ::osl::FileBase::RC nError1, nError2;
+ sal_Bool bOK;
+
+ oslFileHandle *pHandle;
+ ::rtl::OUString *pUStr_DirURL;
+ ::rtl::OUString *pUStr_FileURL;
+
+ public:
+
+ // initialization
+ void setUp( )
+ {
+ pHandle = new oslFileHandle();
+ pUStr_DirURL = new ::rtl::OUString( aUserDirectoryURL );
+ pUStr_FileURL = new ::rtl::OUString();
+ //*pUStr_DirURL = aUserDirectoryURL; /// create temp file in /tmp/PID or c:\temp\PID.*/
+ }
+
+ void tearDown( )
+ {
+ delete pUStr_DirURL;
+ delete pUStr_FileURL;
+ delete pHandle;
+ }
+
+ // test code.
+ void createTempFile_001( )
+ {
+ nError1 = FileBase::createTempFile( pUStr_DirURL, pHandle, pUStr_FileURL );
+ ::osl::File testFile( *pUStr_FileURL );
+ //printFileName(*pUStr_FileURL);
+ nError2 = testFile.open( OpenFlag_Create );
+ if ( osl::FileBase::E_EXIST == nError2 ) {
+ osl_closeFile( *pHandle );
+ deleteTestFile( *pUStr_FileURL );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "test for createTempFile function: create temp file and test the existence",
+ ( osl::FileBase::E_None == nError1 ) && ( pHandle != NULL ) && ( osl::FileBase::E_EXIST== nError2 ) );
+ }
+
+ void createTempFile_002( )
+ {
+ bOK = sal_False;
+ nError1 = FileBase::createTempFile( pUStr_DirURL, pHandle, pUStr_FileURL );
+ ::osl::File testFile( *pUStr_FileURL );
+ nError2 = testFile.open( OpenFlag_Create );
+
+ CPPUNIT_ASSERT_MESSAGE( "createTempFile function: create a temp file, but it does not exist",
+ ( osl::FileBase::E_None == nError1 ) && ( pHandle != NULL ) &&
+ ( osl::FileBase::E_EXIST == nError2 ) );
+
+ //check file if have the write permission
+ if ( osl::FileBase::E_EXIST == nError2 ) {
+ bOK = ifFileCanWrite( *pUStr_FileURL );
+ osl_closeFile( *pHandle );
+ deleteTestFile( *pUStr_FileURL );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open and write access rights, in (W32), it did not have write access right, but it should be writtenable.",
+ ( sal_True == bOK ) );
+ }
+
+ void createTempFile_003( )
+ {
+ nError1 = FileBase::createTempFile( pUStr_DirURL, pHandle, 0 );
+ //the temp file will be removed when return from createTempFile
+ bOK = ( pHandle != NULL && pHandle != 0);
+ if ( sal_True == bOK )
+ osl_closeFile( *pHandle );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for createTempFile function: set pUStrFileURL to 0 to let it remove the file after call.",
+ ( ::osl::FileBase::E_None == nError1 ) &&( sal_True == bOK ) );
+ }
+ void createTempFile_004( )
+ {
+ nError1 = FileBase::createTempFile( pUStr_DirURL, 0, pUStr_FileURL );
+ bOK = ( pUStr_FileURL != 0);
+ ::osl::File testFile( *pUStr_FileURL );
+ nError2 = testFile.open( OpenFlag_Create );
+ deleteTestFile( *pUStr_FileURL );
+ CPPUNIT_ASSERT_MESSAGE( "createTempFile function: create a temp file, but it does not exist",
+ ( osl::FileBase::E_None == nError1 ) && ( osl::FileBase::E_EXIST == nError2 ) &&( sal_True == bOK ) );
+
+ }
+
+ CPPUNIT_TEST_SUITE( createTempFile );
+ CPPUNIT_TEST( createTempFile_001 );
+ CPPUNIT_TEST( createTempFile_002 );
+ CPPUNIT_TEST( createTempFile_003 );
+ CPPUNIT_TEST( createTempFile_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class createTempFile
+
+ // -----------------------------------------------------------------------------
+#if 0 //~ this function has been deprecated.
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileBase::getCanonicalName, "osl_FileBase" );
+#endif
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileBase::getAbsoluteFileURL, "osl_FileBase" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileBase::SystemPath_FileURL, "osl_FileBase" );
+ // CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileBase::getFileURLFromSystemPath, "osl_FileBase" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileBase::searchFileURL, "osl_FileBase" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileBase::getTempDirURL, "osl_FileBase" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileBase::createTempFile, "osl_FileBase" );
+}// namespace osl_FileBase
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for VolumeDevice class
+//------------------------------------------------------------------------
+
+#if 0 //~ this Class has been deprecated
+namespace osl_VolumeDevice
+{
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // VolumeDevice() : _aHandle( NULL )
+ //---------------------------------------------------------------------
+ class ctors : public CppUnit::TestFixture
+ {
+ ::osl::VolumeDevice aVolumeDevice;
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+ }
+
+ // test code.
+ void ctors_001( )
+ {
+ ::osl::VolumeDevice aVolumeDevice1;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: Constructor for VolumeDevice with no args.",
+ ( osl::FileBase::E_None != aVolumeDevice1.automount( ) ) &&
+ ( osl::FileBase::E_None != aVolumeDevice1.unmount( ) ) &&
+ ( aNullURL.equals( aVolumeDevice1.getMountPath( ) ) ) );
+ }
+
+ void ctors_002( )
+ {
+ ::osl::VolumeInfo aVolumeInfo( VolumeInfoMask_Attributes );
+ nError1 = ::osl::Directory::getVolumeInfo( aRootURL, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+
+ ::osl::VolumeDevice aVolumeDevice1( aVolumeInfo.getDeviceHandle( ) );
+ sal_Bool bOk = compareFileName( aNullURL, aVolumeDevice1.getMountPath( ) );
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: Copy constructor for VolumeDevice, the copied VolumeDevice should have a mount path file:///, but it returned an empty OUString, it also may be the error from getDeviceHandle(), it did not pass in (UNX), (W32).",
+ sal_False == bOk );
+ }
+
+ void ctors_003( )
+ {
+ ::osl::VolumeInfo aVolumeInfo( VolumeInfoMask_Attributes );
+ nError1 = ::osl::Directory::getVolumeInfo( aRootURL, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+
+ ::osl::VolumeDevice aVolumeDevice1 = aVolumeInfo.getDeviceHandle( );
+ sal_Bool bOk = compareFileName( aNullURL, aVolumeDevice1.getMountPath( ) );
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: Assigned operator for VolumeDevice, the assigned VolumeDevice should have a mount path file:///, but it returned an empty OUString, it also may be the error from getDeviceHandle(),it did not pass in (UNX), (W32).",
+ sal_False == bOk );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST( ctors_002 );
+ CPPUNIT_TEST( ctors_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class ctors
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC automount()
+ //---------------------------------------------------------------------
+ class automount : public CppUnit::TestFixture
+ {
+ ::osl::VolumeDevice aVolumeDevice;
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+
+ }
+
+ // test code.
+ void automount_001( )
+ {
+ ::osl::VolumeDevice aVolumeDevice1;
+ nError1 = aVolumeDevice1.automount( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for automount function: invalid parameter.",
+ ( osl::FileBase::E_INVAL == nError1 ) );
+ }
+
+ void automount_002( )
+ {
+ ::osl::VolumeInfo aVolumeInfo( VolumeInfoMask_Attributes );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL2, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+
+ ::osl::VolumeDevice aVolumeDevice1( aVolumeInfo.getDeviceHandle( ) );
+ nError1 = aVolumeDevice1.unmount( );
+ nError1 = aVolumeDevice1.automount( );
+ CPPUNIT_ASSERT_MESSAGE( "test for automount function: this test is not implemented yet, it did not pass in (UNX), (W32).",
+ ( osl::FileBase::E_None == nError1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( automount );
+ CPPUNIT_TEST( automount_001 );
+ CPPUNIT_TEST( automount_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class automount
+
+
+ // -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeDevice::ctors, "osl_VolumeDevice" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeDevice::automount, "osl_VolumeDevice" );
+}// namespace osl_VolumeDevice
+#endif
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for VolumeInfo class
+//------------------------------------------------------------------------
+namespace osl_VolumeInfo
+{
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // VolumeInfo( sal_uInt32 nMask ): _nMask( nMask )
+ //---------------------------------------------------------------------
+ class ctors : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1, nError2;
+
+ ::osl::VolumeDevice aVolumeDevice1;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+ }
+
+ // test code.
+ void ctors_001( )
+ {
+ ::osl::VolumeInfo aVolumeInfo( 0 );
+ nError1 = ::osl::Directory::getVolumeInfo( aRootURL, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_uInt64 uiTotalSpace = aVolumeInfo.getTotalSpace( );
+ sal_uInt32 uiMaxPathLength = aVolumeInfo.getMaxPathLength( );
+ aUStr = aVolumeInfo.getFileSystemName( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: mask is empty",
+ ( 0 == uiTotalSpace ) &&
+ ( 0 == uiMaxPathLength ) &&
+ sal_True == compareFileName( aUStr, aNullURL ) );
+ }
+
+#if ( defined UNX ) || ( defined OS2 )
+ void ctors_002( )
+ {
+ ::osl::VolumeInfo aVolumeInfo( VolumeInfoMask_TotalSpace |
+ VolumeInfoMask_UsedSpace |
+ VolumeInfoMask_FileSystemName );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL4, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ //CPPUNIT_ASSERT( aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiTotalSpace = aVolumeInfo.getTotalSpace( );
+ sal_uInt64 uiUsedSpace = aVolumeInfo.getUsedSpace( );
+ aUStr = aVolumeInfo.getFileSystemName( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: mask is specified as certain valid fields, and get the masked fields",
+ ( 0 != uiTotalSpace ) &&
+ ( 0 != uiUsedSpace ) &&
+ sal_True == compareFileName( aUStr, "nfs" ) );
+ }
+#else /// Windows version,here we can not determine whichvolume in Windows is serve as an nfs volume.
+ void ctors_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: mask is specified as certain valid fields, and get the masked fields( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+ void ctors_003( )
+ {
+
+ sal_Int32 mask1 = VolumeInfoMask_FreeSpace;
+ ::osl::VolumeInfo aVolumeInfo1( mask1 );
+ nError1 = ::osl::Directory::getVolumeInfo( aRootURL, aVolumeInfo1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo1.isValid( mask1 ) );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+
+ sal_uInt64 uiTotalSpace1 = aVolumeInfo1.getTotalSpace( );
+ aUStr = aVolumeInfo1.getFileSystemName( );
+
+ sal_Int32 mask2 = VolumeInfoMask_TotalSpace;
+ ::osl::VolumeInfo aVolumeInfo2( mask2 );
+ nError2 = ::osl::Directory::getVolumeInfo( aRootURL, aVolumeInfo2 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo2.isValid( mask2 ) );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError2 );
+
+ sal_uInt64 uiTotalSpace2 = aVolumeInfo2.getTotalSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: mask is specified as certain valid fields, but get unmasked fields, use mask to FreeSpace, but I can get TotalSpace, did not pass in (UNX)(W32)",
+ ( 0 == uiTotalSpace1 ) && ( 0 != uiTotalSpace2 ) &&
+ sal_True == compareFileName( aUStr, aNullURL ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST( ctors_002 );
+ CPPUNIT_TEST( ctors_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class ctors
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool isValid( sal_uInt32 nMask ) const
+ //---------------------------------------------------------------------
+ class isValid : public CppUnit::TestFixture
+ {
+ ::osl::VolumeDevice aVolumeDevice;
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+
+ }
+
+ // test code.
+ void isValid_001( )
+ {
+ sal_Int32 mask = 0;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL4, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isValid function: no fields specified.",
+ sal_True == aVolumeInfo.isValid( mask ) );
+ }
+
+#if ( defined UNX ) || ( defined OS2 )
+ void isValid_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes | VolumeInfoMask_TotalSpace | osl_VolumeInfo_Mask_UsedSpace |
+ osl_VolumeInfo_Mask_FreeSpace | osl_VolumeInfo_Mask_MaxNameLength |
+ osl_VolumeInfo_Mask_MaxPathLength | osl_VolumeInfo_Mask_FileSystemName;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL4, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isValid function: all valid fields specified for a nfs volume.",
+ sal_True == aVolumeInfo.isValid( mask ) );
+ }
+#else /// Windows version,here we can not determine whichvolume in Windows is serve as an nfs volume.
+ void isValid_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for isValid function: all valid fields specified for a nfs volume.( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+ void isValid_003( )
+ {
+ ::osl::VolumeDevice aVolumeDevice1;
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk1 = aVolumeInfo.isValid( mask );
+
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL2, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk2 = aVolumeInfo.isValid( mask );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isValid function: VolumeInfoMask_Attributes, it should be valid for some volume such as /, floppy, cdrom, etc. but it did not pass",
+ ( sal_True == bOk1 ) && ( sal_True == bOk2 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( isValid );
+ CPPUNIT_TEST( isValid_001 );
+ CPPUNIT_TEST( isValid_002 );
+ CPPUNIT_TEST( isValid_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class isValid
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool getRemoteFlag() const
+ //---------------------------------------------------------------------
+ class getRemoteFlag : public CppUnit::TestFixture
+ {
+ ::osl::VolumeDevice aVolumeDevice;
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // test code.
+ void getRemoteFlag_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getRemoteFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getRemoteFlag function: get a volume device which is not remote.",
+ ( sal_False == bOk ) );
+ }
+
+ #if ( defined UNX ) || ( defined OS2 ) //remote Volume is different in Solaris and Windows
+ void getRemoteFlag_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL4, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getRemoteFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getRemoteFlag function: get a volume device which is remote( Solaris version ).",
+ ( sal_True == bOk ) );
+ }
+#else //Windows version
+ void getRemoteFlag_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getRemoteFlag function: get a volume device which is remote( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( getRemoteFlag );
+ CPPUNIT_TEST( getRemoteFlag_001 );
+ CPPUNIT_TEST( getRemoteFlag_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getRemoteFlag
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool getRemoveableFlag() const
+ //---------------------------------------------------------------------
+ class getRemoveableFlag : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // test code.
+ void getRemoveableFlag_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getRemoveableFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getRemoveableFlag function: get a volume device which is not removable.",
+ sal_False == bOk );
+ }
+
+ void getRemoveableFlag_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL2, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getRemoveableFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getRemoveableFlag function: get a volume device which is removable, not sure, here we use floppy disk, but it did not pass.",
+ sal_True == bOk );
+ }
+ CPPUNIT_TEST_SUITE( getRemoveableFlag );
+ CPPUNIT_TEST( getRemoveableFlag_001 );
+ CPPUNIT_TEST( getRemoveableFlag_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getRemoveableFlag
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool getCompactDiscFlag() const
+ //---------------------------------------------------------------------
+ class getCompactDiscFlag : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getCompactDiscFlag_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getCompactDiscFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getCompactDiscFlag function: get a volume device which is not a cdrom.",
+ ( sal_False == bOk ) );
+ }
+
+ void getCompactDiscFlag_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL6, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getCompactDiscFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getCompactDiscFlag function: get a cdrom volume device flag, it did not pass.",
+ ( sal_True == bOk ) );
+ }
+ CPPUNIT_TEST_SUITE( getCompactDiscFlag );
+ CPPUNIT_TEST( getCompactDiscFlag_001 );
+ CPPUNIT_TEST( getCompactDiscFlag_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getCompactDiscFlag
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool getFloppyDiskFlag() const
+ //---------------------------------------------------------------------
+ class getFloppyDiskFlag : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getFloppyDiskFlag_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getFloppyDiskFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFloppyDiskFlag function: get a volume device which is not a floppy disk.",
+ ( sal_False == bOk ) );
+ }
+
+ void getFloppyDiskFlag_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL2, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getFloppyDiskFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFloppyDiskFlag function: get a floppy volume device flag, it did not pass.",
+ ( sal_True == bOk ) );
+ }
+ CPPUNIT_TEST_SUITE( getFloppyDiskFlag );
+ CPPUNIT_TEST( getFloppyDiskFlag_001 );
+ CPPUNIT_TEST( getFloppyDiskFlag_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFloppyDiskFlag
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool getFixedDiskFlag() const
+ //---------------------------------------------------------------------
+ class getFixedDiskFlag : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getFixedDiskFlag_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL2, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getFixedDiskFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFixedDiskFlag function: get a volume device which is not a fixed disk.",
+ ( sal_False == bOk ) );
+ }
+
+ void getFixedDiskFlag_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getFixedDiskFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFixedDiskFlag function: get a fixed disk volume device flag, it did not pass.",
+ ( sal_True == bOk ) );
+ }
+ CPPUNIT_TEST_SUITE( getFixedDiskFlag );
+ CPPUNIT_TEST( getFixedDiskFlag_001 );
+ CPPUNIT_TEST( getFixedDiskFlag_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFixedDiskFlag
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool getRAMDiskFlag() const
+ //---------------------------------------------------------------------
+ class getRAMDiskFlag : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getRAMDiskFlag_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getRAMDiskFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getRAMDiskFlag function: get a volume device which is not a RAM disk.",
+ ( sal_False == bOk ) );
+ }
+
+ void getRAMDiskFlag_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = aVolumeInfo.getRAMDiskFlag( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getRAMDiskFlag function: FIX ME, don't know how to get a RAM disk flag, perhaps Windows 98 boot disk can create a RAM disk, it did not pass in (UNX)(W32).",
+ ( sal_True == bOk ) );
+ }
+ CPPUNIT_TEST_SUITE( getRAMDiskFlag );
+ CPPUNIT_TEST( getRAMDiskFlag_001 );
+ CPPUNIT_TEST( getRAMDiskFlag_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getRAMDiskFlag
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_uInt64 getTotalSpace() const
+ //---------------------------------------------------------------------
+ class getTotalSpace : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getTotalSpace_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_TotalSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiTotalSpace = aVolumeInfo.getTotalSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getTotalSpace function: get total space of Fixed disk volume mounted on /, it should not be 0",
+ 0 != uiTotalSpace );
+ }
+
+ #if defined( UNX )
+ void getTotalSpace_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_TotalSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL3, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiTotalSpace = aVolumeInfo.getTotalSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getTotalSpace function: get total space of /proc, it should be 0",
+ 0 == uiTotalSpace );
+ }
+#else /// Windows version, in Windows, there is no /proc directory
+ void getTotalSpace_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getTotalSpace function:not applicable for /proc( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+
+
+#if defined(SOLARIS)
+ void getTotalSpace_003( )
+ {
+ struct statvfs aStatFS;
+ static const sal_Char name[] = "/";
+
+ memset (&aStatFS, 0, sizeof(aStatFS));
+ statvfs( name, &aStatFS);
+ sal_uInt64 TotalSpace = aStatFS.f_frsize * aStatFS.f_blocks ;
+
+ sal_Int32 mask = VolumeInfoMask_TotalSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiTotalSpace = aVolumeInfo.getTotalSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getTotalSpace function: get total space by hand, then compare with getTotalSpace, it did not pass",
+ uiTotalSpace == TotalSpace );
+ }
+#else /// Windows version
+ void getTotalSpace_003( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getTotalSpace function:not implemented yet( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( getTotalSpace );
+ CPPUNIT_TEST( getTotalSpace_001 );
+ CPPUNIT_TEST( getTotalSpace_002 );
+ CPPUNIT_TEST( getTotalSpace_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getTotalSpace
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_uInt64 getFreeSpace() const
+ //---------------------------------------------------------------------
+ class getFreeSpace : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getFreeSpace_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_FreeSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiFreeSpace = aVolumeInfo.getFreeSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFreeSpace function: get free space of Fixed disk volume mounted on /, it should not be 0, suggestion: returned value, -1 is better, since some times the free space may be 0",
+ 0 != uiFreeSpace );
+ }
+
+#if defined( UNX )
+ void getFreeSpace_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_FreeSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL3, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiFreeSpace = aVolumeInfo.getFreeSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFreeSpace function: get free space of /proc, it should be 0",
+ 0 == uiFreeSpace );
+ }
+#else /// Windows version, in Windows, there is no /proc directory
+ void getFreeSpace_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getFreeSpace function: not applicable for /proc( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+
+#if defined(SOLARIS)
+ void getFreeSpace_003( )
+ {
+ struct statvfs aStatFS;
+ static const sal_Char name[] = "/";
+
+ memset (&aStatFS, 0, sizeof(aStatFS));
+ statvfs( name, &aStatFS);
+ sal_uInt64 FreeSpace = aStatFS.f_bfree * aStatFS.f_frsize ;
+
+ sal_Int32 mask = VolumeInfoMask_FreeSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiFreeSpace = aVolumeInfo.getFreeSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFreeSpace function: get free space by hand, then compare with getFreeSpace, it did not pass",
+ uiFreeSpace == FreeSpace );
+ }
+#else //Windows version
+ void getFreeSpace_003( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getFreeSpace function: not implemented yet( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+
+ CPPUNIT_TEST_SUITE( getFreeSpace );
+ CPPUNIT_TEST( getFreeSpace_001 );
+ CPPUNIT_TEST( getFreeSpace_002 );
+ CPPUNIT_TEST( getFreeSpace_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFreeSpace
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_uInt64 getUsedSpace() const
+ //---------------------------------------------------------------------
+ class getUsedSpace : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getUsedSpace_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_UsedSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiUsedSpace = aVolumeInfo.getUsedSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getUsedSpace function: get used space of Fixed disk volume mounted on /, it should not be 0, suggestion: returned value, -1 is better, since some times the used space may be 0",
+ 0 != uiUsedSpace );
+ }
+
+#if defined( UNX )
+ void getUsedSpace_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_UsedSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL3, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiUsedSpace = aVolumeInfo.getUsedSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getUsedSpace function: get used space of /proc, it should be 0",
+ 0 == uiUsedSpace );
+ }
+#else /// Windows version, in Windows, there is no /proc directory
+ void getUsedSpace_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getUsedSpace function: not applicable for /proc( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+
+#if defined(SOLARIS)
+ void getUsedSpace_003( )
+ {
+ struct statvfs aStatFS;
+ static const sal_Char name[] = "/";
+
+ memset (&aStatFS, 0, sizeof(aStatFS));
+ statvfs( name, &aStatFS);
+ sal_uInt64 UsedSpace = ( aStatFS.f_blocks - aStatFS.f_bavail ) * aStatFS.f_frsize;
+
+
+ sal_Int32 mask = VolumeInfoMask_UsedSpace;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiUsedSpace = aVolumeInfo.getUsedSpace( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getUsedSpace function: get used space by hand, then compare with getUsedSpace, it did not pass",
+ uiUsedSpace == UsedSpace );
+ }
+#else //Windows version
+ void getUsedSpace_003( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getUsedSpace function: not implemented yet( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+
+ CPPUNIT_TEST_SUITE( getUsedSpace );
+ CPPUNIT_TEST( getUsedSpace_001 );
+ CPPUNIT_TEST( getUsedSpace_002 );
+ CPPUNIT_TEST( getUsedSpace_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getUsedSpace
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_uInt32 getMaxNameLength() const
+ //---------------------------------------------------------------------
+ class getMaxNameLength : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getMaxNameLength_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_MaxNameLength;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt32 uiMaxNameLength = aVolumeInfo.getMaxNameLength( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getMaxNameLength function: get max name length of Fixed disk volume mounted on /, it should not be 0",
+ 0 != uiMaxNameLength );
+ }
+
+
+#if ( defined UNX ) || ( defined OS2 )
+ void getMaxNameLength_002( )
+ {
+ struct statvfs aStatFS;
+ static const sal_Char name[] = "/";
+
+ memset (&aStatFS, 0, sizeof(aStatFS));
+ statvfs( name, &aStatFS);
+ sal_uInt64 MaxNameLength = aStatFS.f_namemax;
+
+ sal_Int32 mask = VolumeInfoMask_MaxNameLength;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiMaxNameLength = aVolumeInfo.getMaxNameLength( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getMaxNameLength function: get max name length by hand, then compare with getMaxNameLength",
+ uiMaxNameLength == MaxNameLength );
+ }
+#else //Windows version
+ void getMaxNameLength_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getMaxNameLength function: not implemented yet( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( getMaxNameLength );
+ CPPUNIT_TEST( getMaxNameLength_001 );
+ CPPUNIT_TEST( getMaxNameLength_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getMaxNameLength
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_uInt32 getMaxPathLength() const
+ //---------------------------------------------------------------------
+ class getMaxPathLength : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getMaxPathLength_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_MaxPathLength;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt32 uiMaxPathLength = aVolumeInfo.getMaxPathLength( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getMaxPathLength function: get max path length of Fixed disk volume mounted on /, it should not be 0",
+ 0 != uiMaxPathLength );
+ }
+
+
+#if ( defined UNX ) || ( defined OS2 )
+ void getMaxPathLength_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_MaxPathLength;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ sal_uInt64 uiMaxPathLength = aVolumeInfo.getMaxPathLength( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getMaxPathLength function: get max path length by hand, then compare with getMaxPathLength",
+ uiMaxPathLength == PATH_MAX );
+ }
+#else //Windows version
+ void getMaxPathLength_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getMaxPathLength function: not implemented yet( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+
+ CPPUNIT_TEST_SUITE( getMaxPathLength );
+ CPPUNIT_TEST( getMaxPathLength_001 );
+ CPPUNIT_TEST( getMaxPathLength_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getMaxPathLength
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline ::rtl::OUString getFileSystemName() const
+ //---------------------------------------------------------------------
+ class getFileSystemName : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getFileSystemName_001( )
+ {
+ sal_Int32 mask = VolumeInfoMask_FileSystemName;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ aUStr = aVolumeInfo.getFileSystemName( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileSystemName function: get file system name of Fixed disk volume mounted on /, it should not be empty string",
+ sal_False == compareFileName( aNullURL, aUStr ) );
+ }
+
+
+#if defined(SOLARIS)
+ void getFileSystemName_002( )
+ {
+ struct statvfs aStatFS;
+ static const sal_Char name[] = "/";
+
+ memset (&aStatFS, 0, sizeof(aStatFS));
+ statvfs( name, &aStatFS);
+ sal_Char * astrFileSystemName = aStatFS.f_basetype;
+
+ sal_Int32 mask = VolumeInfoMask_FileSystemName;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+ CPPUNIT_ASSERT( sal_True == aVolumeInfo.isValid( mask ) );
+ aUStr = aVolumeInfo.getFileSystemName( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileSystemName function: get file system name by hand, then compare with getFileSystemName",
+ sal_True == compareFileName( aUStr, astrFileSystemName ) );
+ }
+#else //Windows version
+ void getFileSystemName_002( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileSystemName function: not implemented yet( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+
+ CPPUNIT_TEST_SUITE( getFileSystemName );
+ CPPUNIT_TEST( getFileSystemName_001 );
+ CPPUNIT_TEST( getFileSystemName_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFileSystemName
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline VolumeDevice getDeviceHandle() const
+ //---------------------------------------------------------------------
+ class getDeviceHandle : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1;
+
+ public:
+ // test code.
+ void getDeviceHandle_001( )
+ {
+ ::osl::VolumeInfo aVolumeInfo( VolumeInfoMask_Attributes );
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ CPPUNIT_ASSERT( osl::FileBase::E_None == nError1 );
+
+ ::osl::VolumeDevice aVolumeDevice1( aVolumeInfo.getDeviceHandle( ) );
+ sal_Bool bOk = compareFileName( aNullURL, aVolumeDevice1.getMountPath( ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getDeviceHandle function: get device handle of Fixed disk volume mounted on /, it should not be NULL, it did not pass in (W32) (UNX).",
+ ( sal_False == bOk ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getDeviceHandle );
+ CPPUNIT_TEST( getDeviceHandle_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getDeviceHandle
+
+
+ // -----------------------------------------------------------------------------
+ /*CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::ctors, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::isValid, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getRemoteFlag, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getRemoveableFlag, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getCompactDiscFlag, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getFloppyDiskFlag, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getFixedDiskFlag, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getRAMDiskFlag, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getTotalSpace, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getFreeSpace, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getUsedSpace, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getMaxNameLength, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getMaxPathLength, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getFileSystemName, "osl_VolumeInfo" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_VolumeInfo::getDeviceHandle, "osl_VolumeInfo" );*/
+}// namespace osl_VolumeInfo
+
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for VolumeDevice class
+//------------------------------------------------------------------------
+namespace osl_FileStatus
+{
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // FileStatus( sal_uInt32 nMask ): _nMask( nMask )
+ //---------------------------------------------------------------------
+ class ctors : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1, nError2;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ ::std::auto_ptr<Directory> pDir( new Directory( aTmpName3 ) );
+ nError1 = pDir->open( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = pDir->getNextItem( rItem, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ pDir->close();
+ /*
+ Directory aDir( aTmpName3 );
+ nError1 = aDir.open();
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = aDir.getNextItem( rItem, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ aDir.close();
+ */
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void ctors_001( )
+ {
+ ::osl::FileStatus rFileStatus( FileStatusMask_All );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ aUStr = rFileStatus.getFileName( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: mask all and see the file name",
+ sal_True == compareFileName( aUStr, aTmpName2) );
+ }
+
+ void ctors_002( )
+ {
+ ::osl::FileStatus rFileStatus( 0 );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ aUStr = rFileStatus.getFileName( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: mask is empty",
+ sal_True == compareFileName( aUStr, aNullURL) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST( ctors_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class ctors
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool isValid( sal_uInt32 nMask ) const
+ //---------------------------------------------------------------------
+ class isValid : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aUStr;
+ ::osl::Directory *pDir;
+ ::osl::DirectoryItem rItem_file, rItem_link;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ pDir = new Directory( aTmpName3 );
+ //::std::auto_ptr<Directory> pDir( new Directory( aTmpName3 ) );
+ ::osl::FileBase::RC nError1 = pDir->open( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = pDir->getNextItem( rItem_file, 1 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ ::osl::FileBase::RC nError1 = pDir->close( );
+ delete pDir;
+ CPPUNIT_ASSERT_MESSAGE( errorToStr(nError1), ::osl::FileBase::E_None == nError1 );
+
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void isValid_001( )
+ {
+ sal_uInt32 mask = 0;
+ ::osl::FileStatus rFileStatus( mask );
+ ::osl::FileBase::RC nError1 = rItem_file.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ sal_Bool bOk = rFileStatus.isValid( mask );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isValid function: no fields specified",
+ ( sal_True == bOk ) );
+ }
+
+ void check_FileStatus(::osl::FileStatus const& _aStatus)
+ {
+ rtl::OString sStat;
+ if (_aStatus.isValid(FileStatusMask_Type))
+ {
+ sStat += "type ";
+ }
+ if (_aStatus.isValid(FileStatusMask_Attributes))
+ {
+ sStat += "attributes ";
+ }
+ if (_aStatus.isValid(FileStatusMask_CreationTime))
+ {
+ sStat += "ctime ";
+ }
+ if (_aStatus.isValid(FileStatusMask_AccessTime))
+ {
+ sStat += "atime ";
+ }
+ if (_aStatus.isValid(FileStatusMask_ModifyTime))
+ {
+ sStat += "mtime ";
+ }
+ if (_aStatus.isValid(FileStatusMask_FileSize))
+ {
+ sStat += "filesize ";
+ }
+ if (_aStatus.isValid(FileStatusMask_FileName))
+ {
+ sStat += "filename ";
+ }
+ if (_aStatus.isValid(FileStatusMask_FileURL))
+ {
+ sStat += "fileurl ";
+ }
+ t_print("mask: %s\n", sStat.getStr());
+ }
+
+ void isValid_002( )
+ {
+ createTestFile( aTmpName6 );
+ sal_uInt32 mask_file = ( FileStatusMask_Type | FileStatusMask_Attributes |
+ FileStatusMask_CreationTime | FileStatusMask_AccessTime |
+ FileStatusMask_ModifyTime | FileStatusMask_FileSize |
+ FileStatusMask_FileName | FileStatusMask_FileURL) ;
+ ::osl::FileStatus rFileStatus( mask_file );
+ ::osl::FileBase::RC nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem_file );
+ nError1 = rItem_file.getFileStatus( rFileStatus );
+
+ CPPUNIT_ASSERT_MESSAGE( errorToStr(nError1), ::osl::FileBase::E_None == nError1 );
+
+// LLA: this is wrong, we never should try to check on all masks
+// only on one.
+// Second, it's not a bug, if a value is not valid, it's an unhandled feature.
+
+// sal_Bool bOk = rFileStatus.isValid( mask_file );
+
+ check_FileStatus(rFileStatus);
+ deleteTestFile( aTmpName6 );
+
+ // CPPUNIT_ASSERT_MESSAGE( "test for isValid function: regular file mask fields test, #FileStatusMask_CreationTime# should be valid field for regular file, but feedback is invalid",
+ // ( sal_True == bOk ) );
+ }
+
+ //Link is not defined in Windows, and on Linux, we can not get the directory item of the link file
+ // LLA: we have to differ to filesystems, normal filesystems support links (EXT2, ...)
+ // castrated filesystems don't (FAT, FAT32)
+ // Windows NT NTFS support links, but the windows api don't :-(
+
+ void isValid_003( )
+ {
+#if defined ( UNX )
+ // ::osl::FileBase::RC nError;
+ sal_Int32 fd;
+
+ ::rtl::OUString aUStr_LnkFileSys( aTempDirectorySys ), aUStr_SrcFileSys( aTempDirectorySys );
+ ( ( aUStr_LnkFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/tmpdir/link.file");
+ ( ( aUStr_SrcFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/tmpdir/tmpname");
+
+ rtl::OString strLinkFileName;
+ rtl::OString strSrcFileName;
+ strLinkFileName = OUStringToOString( aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US );
+ strSrcFileName = OUStringToOString( aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US );
+
+ //create a link file and link it to file "/tmp/PID/tmpdir/tmpname"
+ fd = symlink( strSrcFileName.getStr(), strLinkFileName.getStr() );
+ CPPUNIT_ASSERT( fd == 0 );
+
+ // testDirectory is "/tmp/PID/tmpdir/"
+ ::osl::Directory testDirectory( aTmpName3 );
+ ::osl::FileBase::RC nError1 = testDirectory.open( );
+ ::rtl::OUString aFileName = ::rtl::OUString::createFromAscii("link.file");
+ sal_Bool bOk = sal_False;
+ while (1) {
+ nError1 = testDirectory.getNextItem( rItem_link, 4 );
+ if (::osl::FileBase::E_None == nError1) {
+ sal_uInt32 mask_link = FileStatusMask_FileName | FileStatusMask_LinkTargetURL;
+ ::osl::FileStatus rFileStatus( mask_link );
+ rItem_link.getFileStatus( rFileStatus );
+ //printFileName( rFileStatus.getFileName( ) );
+ if ( compareFileName( rFileStatus.getFileName( ), aFileName) == sal_True )
+ {
+ //t_print("find the link file");
+ if ( sal_True == rFileStatus.isValid( FileStatusMask_LinkTargetURL ) )
+ {
+ bOk = sal_True;
+ break;
+ }
+ }
+ }
+ else
+ break;
+ };
+
+ fd = remove( strLinkFileName );
+ CPPUNIT_ASSERT( fd == 0 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for isValid function: link file, check for LinkTargetURL",
+ ( sal_True == bOk ) );
+#endif
+ }
+
+ void isValid_004( )
+ {
+ sal_uInt32 mask_file_all = FileStatusMask_All;
+ ::osl::FileStatus rFileStatus_all( mask_file_all );
+ ::osl::FileBase::RC nError1 = rItem_file.getFileStatus( rFileStatus_all );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ check_FileStatus(rFileStatus_all);
+// LLA: this is wrong
+// sal_Bool bOk1 = rFileStatus_all.isValid( mask_file_all );
+
+ sal_uInt32 mask_file_val = FileStatusMask_Validate;
+ ::osl::FileStatus rFileStatus_val( mask_file_val );
+ nError1 = rItem_file.getFileStatus( rFileStatus_val );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ // sal_Bool bOk2 = rFileStatus_val.isValid( mask_file_val );
+
+ check_FileStatus(rFileStatus_val);
+ // CPPUNIT_ASSERT_MESSAGE( "test for isValid function: check for Mask_All and Validate, really not sure what validate used for and how to use it, help me. did not pass (W32)(UNX).",
+ // ( sal_False == bOk1 ) && ( sal_True == bOk2 ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( isValid );
+ CPPUNIT_TEST( isValid_001 );
+ CPPUNIT_TEST( isValid_002 );
+ CPPUNIT_TEST( isValid_003 );
+ CPPUNIT_TEST( isValid_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class ctors
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline Type getFileType() const
+ //---------------------------------------------------------------------
+ class getFileType : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aUStr;
+ ::osl::FileBase::RC nError1, nError2;
+
+ ::osl::DirectoryItem m_aItem_1, m_aItem_2, m_aVolumeItem, m_aFifoItem;
+ ::osl::DirectoryItem m_aLinkItem, m_aSocketItem, m_aSpecialItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile: $TEMP/tmpdir/tmpname.
+ // a tempdirectory: $TEMP/tmpdir/tmpdir.
+ // use $ROOT/staroffice as volume ---> use dev/fd as volume.
+ // and get their directory item.
+ createTestDirectory( aTmpName3 );
+ //printFileName( aTmpName2);
+ createTestFile( aTmpName3, aTmpName2 );
+ createTestDirectory( aTmpName3, aTmpName1 );
+
+ ::std::auto_ptr<Directory> pDir( new Directory( aTmpName3 ) );
+ nError1 = pDir->open( );
+ CPPUNIT_ASSERT_MESSAGE("open aTmpName3 failed!", ::osl::FileBase::E_None == nError1 );
+ //getNextItem can not assure which item retrieved
+ nError1 = pDir->getNextItem( m_aItem_1, 1 );
+ CPPUNIT_ASSERT_MESSAGE("get first item failed!", ::osl::FileBase::E_None == nError1 );
+
+ nError1 = pDir->getNextItem( m_aItem_2 );
+ CPPUNIT_ASSERT_MESSAGE("get second item failed!", ::osl::FileBase::E_None == nError1 );
+ pDir->close();
+ //mindy: failed on my RH9,so removed temporaly
+ //nError1 = ::osl::DirectoryItem::get( aVolURL2, m_aVolumeItem );
+ //CPPUNIT_ASSERT_MESSAGE("get volume item failed!", ::osl::FileBase::E_None == nError1 );
+
+ }
+
+ void tearDown( )
+ {
+ // remove all in $TEMP/tmpdir.
+ deleteTestDirectory( aTmpName3, aTmpName1 );
+ deleteTestFile( aTmpName3, aTmpName2 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void getFileType_001( )
+ {
+ ::osl::FileStatus rFileStatus( FileStatusMask_Type | FileStatusMask_FileName );
+ nError1 = m_aItem_1.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT_MESSAGE("getFileStatus failed", ::osl::FileBase::E_None == nError1 );
+
+ check_FileType(rFileStatus);
+ }
+
+ void check_FileType(osl::FileStatus const& _rFileStatus )
+ {
+ sal_Bool bOK = sal_False;
+ if ( _rFileStatus.isValid(FileStatusMask_FileName))
+ {
+ rtl::OUString suFilename = _rFileStatus.getFileName();
+
+ if ( _rFileStatus.isValid(FileStatusMask_Type))
+ {
+ osl::FileStatus::Type eType = _rFileStatus.getFileType( );
+
+ if ( compareFileName( suFilename, aTmpName2) == sal_True )
+ {
+ // regular
+ bOK = ( eType == osl::FileStatus::Regular );
+ }
+ if ( compareFileName( suFilename, aTmpName1) == sal_True )
+ {
+ // directory
+ bOK = ( eType == ::osl::FileStatus::Directory );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileType function: ",
+ ( bOK == sal_True ) );
+ }
+ }
+ // LLA: it's not a bug, if a FileStatus not exist, so no else
+ }
+
+ void getFileType_002( )
+ {
+ ::osl::FileStatus rFileStatus( FileStatusMask_Type | FileStatusMask_FileName );
+ nError1 = m_aItem_2.getFileStatus( rFileStatus );
+
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ check_FileType(rFileStatus);
+ }
+
+ void getFileType_003( )
+ {
+#if 0
+// LLA: this have to be discussed.
+ ::osl::FileStatus rFileStatus( FileStatusMask_Type );
+ nError1 = m_aVolumeItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ if (rFileStatus.isValid(FileStatusMask_Type))
+ {
+ osl::FileStatus::Type eType = rFileStatus.getFileType( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileType function: Volume, it seems the volume part of the field is not implemented, it did not pass in (W32)(UNX).",
+ ( eType == ::osl::FileStatus::Volume ) );
+ }
+#endif
+ }
+
+
+ void getFileType_004( )
+ {
+#if ( defined UNX ) || ( defined OS2 ) //Fifo creation is differ in Windows
+
+ //create a fifo in $ROOT/tmp/tmpdir, get its DirectoryItem.
+ rtl::OString strFifoSys;
+ strFifoSys = OUStringToOString( aFifoSys, RTL_TEXTENCODING_ASCII_US );
+ ::rtl::OUString aFifoURL;
+
+ int fd = mkfifo( strFifoSys.getStr(), O_RDWR | O_CREAT );
+ CPPUNIT_ASSERT_MESSAGE("mkfifo failed!", fd == 0 );
+ ::osl::FileBase::getFileURLFromSystemPath( aFifoSys, aFifoURL );
+
+ nError1 = ::osl::DirectoryItem::get( aFifoURL, m_aFifoItem );
+ CPPUNIT_ASSERT_MESSAGE("get item failed!", ::osl::FileBase::E_None == nError1 );
+
+ //check for File type
+ ::osl::FileStatus rFileStatus( FileStatusMask_Type );
+ nError1 = m_aFifoItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT_MESSAGE("get Status failed!", ::osl::FileBase::E_None == nError1 );
+
+ //delete fifo
+ nError1 = ::osl::File::remove( aFifoURL );
+ CPPUNIT_ASSERT_MESSAGE("remove file failed!", ::osl::FileBase::E_None == nError1 );
+
+ if (rFileStatus.isValid(FileStatusMask_Type))
+ {
+ osl::FileStatus::Type eType = rFileStatus.getFileType( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileType function: Fifo, Solaris version ",
+ ( eType == ::osl::FileStatus::Fifo ) );
+ }
+#endif
+ }
+
+/*
+ * LLA: removed, m_aSocketItem is wrong initialised.
+ */
+
+// LLA: void getFileType_005( )
+// LLA: {
+// LLA: #if defined ( SOLARIS ) //Socket file may differ in Windows
+// LLA: // nError1 = ::osl::DirectoryItem::get( aTypeURL1, m_aSocketItem );
+// LLA: nError1 = ::osl::DirectoryItem::get( rtl::OUString::createFromAscii("/dev/null"), m_aSocketItem );
+// LLA: printError(nError1);
+// LLA: CPPUNIT_ASSERT_MESSAGE("get Socket type file failed", ::osl::FileBase::E_None == nError1 );
+// LLA:
+// LLA: //check for File type
+// LLA: ::osl::FileStatus rFileStatus( FileStatusMask_Type );
+// LLA:
+// LLA: nError1 = m_aSocketItem.getFileStatus( rFileStatus );
+// LLA: CPPUNIT_ASSERT_MESSAGE("getFileStatus failed", ::osl::FileBase::E_None == nError1 );
+// LLA:
+// LLA: if (rFileStatus.isValid( FileStatusMask_Type ))
+// LLA: {
+// LLA: osl::FileStatus::Type eType = rFileStatus.getFileType( );
+// LLA: printFileType(eType);
+// LLA: CPPUNIT_ASSERT_MESSAGE( "test for getFileType function: Socket, Solaris version ",
+// LLA: ( eType == ::osl::FileStatus::Socket ) );
+// LLA: }
+// LLA: #endif
+// LLA: }
+
+
+// deprecated since there is a same case Directory::getNextItem_004
+/*#if defined 0 //( UNX ) //( SOLARIS ) //Link file is not defined in Windows
+ void getFileType_006( )
+ {
+ nError1 = ::osl::DirectoryItem::get( aTypeURL3, m_aLinkItem );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //check for File type
+ ::osl::FileStatus rFileStatus( FileStatusMask_Type );
+ nError1 = m_aLinkItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileType function: Link, UNX version ",
+ ( ::osl::FileStatus::Link == rFileStatus.getFileType( ) ) );
+ }
+#endif */
+
+ void getFileType_007( )
+ {
+#if defined ( SOLARIS ) //Special file is differ in Windows
+ nError1 = ::osl::DirectoryItem::get( aTypeURL2, m_aSpecialItem );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //check for File type
+ ::osl::FileStatus rFileStatus( FileStatusMask_Type );
+ nError1 = m_aSpecialItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ if (rFileStatus.isValid(FileStatusMask_Type))
+ {
+ osl::FileStatus::Type eType = rFileStatus.getFileType( );
+
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileType function: Special, Solaris version ",
+ ( eType == ::osl::FileStatus::Special ) );
+ }
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( getFileType );
+ CPPUNIT_TEST( getFileType_001 );
+ CPPUNIT_TEST( getFileType_002 );
+ CPPUNIT_TEST( getFileType_003 );
+ CPPUNIT_TEST( getFileType_004 );
+ // LLA: CPPUNIT_TEST( getFileType_005 );
+ //CPPUNIT_TEST( getFileType_006 );
+ CPPUNIT_TEST( getFileType_007 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFileType
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_uInt64 getAttributes() const
+ //---------------------------------------------------------------------
+ class getAttributes : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aTypeURL, aTypeURL_Hid;
+ ::osl::FileBase::RC nError;
+ ::osl::DirectoryItem rItem, rItem_hidden;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ aTypeURL = aUserDirectoryURL.copy( 0 );
+ concatURL( aTypeURL, aTmpName2 );
+ createTestFile( aTypeURL );
+ nError = ::osl::DirectoryItem::get( aTypeURL, rItem );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ aTypeURL_Hid = aUserDirectoryURL.copy( 0 );
+ concatURL( aTypeURL_Hid, aHidURL1 );
+ createTestFile( aTypeURL_Hid );
+ nError = ::osl::DirectoryItem::get( aTypeURL_Hid, rItem_hidden );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+ }
+
+ void tearDown( )
+ {
+ deleteTestFile( aTypeURL );
+ deleteTestFile( aTypeURL_Hid );
+ }
+
+ // test code.
+#if ( defined UNX ) || ( defined OS2 )
+//windows only 3 file attributes: normal, readonly, hidden
+ void getAttributes_001( )
+ {
+ changeFileMode( aTypeURL, S_IRUSR | S_IRGRP | S_IROTH );
+
+ ::osl::FileStatus rFileStatus( FileStatusMask_Attributes );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getAttributes function: ReadOnly, GrpRead, OwnRead, OthRead( UNX version ) ",
+ ( Attribute_ReadOnly | Attribute_GrpRead | Attribute_OwnRead | Attribute_OthRead ) ==
+ rFileStatus.getAttributes( ) );
+ }
+#else //Windows version
+ void getAttributes_001( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getAttributes function: ReadOnly, GrpRead, OwnRead, OthRead( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+
+ void getAttributes_002( )
+ {
+#if ( defined UNX ) || ( defined OS2 )
+ changeFileMode( aTypeURL, S_IXUSR | S_IXGRP | S_IXOTH );
+
+ ::osl::FileStatus rFileStatus( FileStatusMask_Attributes );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getAttributes function: Executable, GrpExe, OwnExe, OthExe, the result is Readonly, Executable, GrpExe, OwnExe, OthExe, it partly not pass( Solaris version )",
+ ( Attribute_ReadOnly | Attribute_Executable | Attribute_GrpExe | Attribute_OwnExe | Attribute_OthExe ) ==
+ rFileStatus.getAttributes( ) );
+#endif
+ }
+
+
+#if ( defined UNX ) || ( defined OS2 )
+ void getAttributes_003( )
+ {
+ changeFileMode( aTypeURL, S_IWUSR | S_IWGRP | S_IWOTH );
+
+ ::osl::FileStatus rFileStatus( FileStatusMask_Attributes );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getAttributes function: GrpWrite, OwnWrite, OthWrite( Solaris version )",
+ ( Attribute_GrpWrite | Attribute_OwnWrite | Attribute_OthWrite ) ==
+ rFileStatus.getAttributes( ) );
+ }
+#else //Windows version
+ void getAttributes_003( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getAttributes function: GrpWrite, OwnWrite, OthWrite( Windows version )",
+ 1 == 1 );
+ }
+#endif
+
+#if ( defined UNX ) || ( defined OS2 ) //hidden file definition may different in Windows
+ void getAttributes_004( )
+ {
+ sal_Int32 test_Attributes = Attribute_Hidden;
+ ::osl::FileStatus rFileStatus( FileStatusMask_Attributes );
+ nError = rItem_hidden.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+ test_Attributes &= rFileStatus.getAttributes( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getAttributes function: Hidden files( Solaris version )",
+ test_Attributes == Attribute_Hidden );
+ }
+#else //Windows version
+ void getAttributes_004( )
+ {
+ ::rtl::OUString aUserHiddenFileURL = ::rtl::OUString::createFromAscii("file:///c:/AUTOEXEC.BAT");
+ nError = ::osl::DirectoryItem::get( aUserHiddenFileURL, rItem_hidden );
+ //printFileName( aUserHiddenFileURL );
+ CPPUNIT_ASSERT_MESSAGE("get item fail", nError == FileBase::E_None );
+ ::osl::FileStatus rFileStatus( FileStatusMask_Attributes );
+ nError = rItem_hidden.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "Hidden files(Windows version), please check if hidden file c:/AUTOEXEC.BAT exists ",
+ (rFileStatus.getAttributes( ) & Attribute_Hidden)!= 0 );
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( getAttributes );
+ CPPUNIT_TEST( getAttributes_001 );
+ CPPUNIT_TEST( getAttributes_002 );
+ CPPUNIT_TEST( getAttributes_003 );
+ CPPUNIT_TEST( getAttributes_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getAttributes
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline TimeValue getAccessTime() const
+ //---------------------------------------------------------------------
+ class getAccessTime : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aTypeURL;
+ ::osl::FileBase::RC nError;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ aTypeURL = aUserDirectoryURL.copy( 0 );
+ concatURL( aTypeURL, aTmpName2 );
+ createTestFile( aTypeURL );
+ nError = ::osl::DirectoryItem::get( aTypeURL, rItem );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ }
+
+ void tearDown( )
+ {
+ deleteTestFile( aTypeURL );
+ }
+
+ // test code.
+ void getAccessTime_001( )
+ {
+ TimeValue *pTV_current = NULL;
+ CPPUNIT_ASSERT( ( pTV_current = ( TimeValue* )malloc( sizeof( TimeValue ) ) ) != NULL );
+ TimeValue *pTV_access = NULL;
+ CPPUNIT_ASSERT( ( pTV_access = ( TimeValue* )malloc( sizeof( TimeValue ) ) ) != NULL );
+
+ ::osl::FileStatus rFileStatus( FileStatusMask_AccessTime );
+ nError = rItem.getFileStatus( rFileStatus );
+ sal_Bool bOk = osl_getSystemTime( pTV_current );
+ CPPUNIT_ASSERT( sal_True == bOk && nError == FileBase::E_None );
+
+ *pTV_access = rFileStatus.getAccessTime( );
+
+ sal_Bool bOK = t_compareTime( pTV_access, pTV_current, delta );
+ free( pTV_current );
+ free( pTV_access );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getAccessTime function: This test turns out that UNX pricision is no more than 1 sec, don't know how to test this function, in Windows test, it lost hour min sec, only have date time. ",
+ sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getAccessTime );
+ CPPUNIT_TEST( getAccessTime_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getAccessTime
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline TimeValue getModifyTime() const
+ //---------------------------------------------------------------------
+ class getModifyTime : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aTypeURL;
+ ::osl::FileBase::RC nError;
+ ::osl::DirectoryItem rItem;
+
+ public:
+
+ // test code.
+ void getModifyTime_001( )
+ {
+ TimeValue *pTV_current = NULL;
+ CPPUNIT_ASSERT( ( pTV_current = ( TimeValue* )malloc( sizeof( TimeValue ) ) ) != NULL );
+
+ //create file
+ aTypeURL = aUserDirectoryURL.copy( 0 );
+ concatURL( aTypeURL, aTmpName2 );
+ createTestFile( aTypeURL );
+
+ //get current time
+ sal_Bool bOk = osl_getSystemTime( pTV_current );
+ CPPUNIT_ASSERT( sal_True == bOk );
+
+ //get instance item and filestatus
+ nError = ::osl::DirectoryItem::get( aTypeURL, rItem );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+ ::osl::FileStatus rFileStatus( FileStatusMask_ModifyTime );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ //get modify time
+ TimeValue *pTV_modify = NULL;
+ CPPUNIT_ASSERT( ( pTV_modify = ( TimeValue* )malloc( sizeof( TimeValue ) ) ) != NULL );
+ *pTV_modify = rFileStatus.getModifyTime( );
+
+ sal_Bool bOK = t_compareTime( pTV_modify, pTV_current, delta );
+ //delete file
+ deleteTestFile( aTypeURL );
+ free( pTV_current );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getModifyTime function: This test turns out that UNX pricision is no more than 1 sec, don't know how to improve this function. ",
+ sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getModifyTime );
+ CPPUNIT_TEST( getModifyTime_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getModifyTime
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_uInt64 getFileSize() const
+ //---------------------------------------------------------------------
+ class getFileSize : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aTypeURL;
+ ::osl::FileBase::RC nError;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ aTypeURL = aUserDirectoryURL.copy( 0 );
+ concatURL( aTypeURL, aTmpName2 );
+ createTestFile( aTypeURL );
+ nError = ::osl::DirectoryItem::get( aTypeURL, rItem );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+ }
+
+ void tearDown( )
+ {
+ deleteTestFile( aTypeURL );
+ }
+
+ // test code.
+ void getFileSize_001( )
+ {
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileSize );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ sal_uInt64 uFileSize = rFileStatus.getFileSize( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileSize function: empty file ",
+ 0 == uFileSize );
+ }
+
+ void getFileSize_002( )
+ {
+ ::osl::File testfile( aTypeURL );
+ nError = testfile.open( OpenFlag_Write | OpenFlag_Read );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError );
+ nError = testfile.setSize( TEST_FILE_SIZE );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError );
+
+ nError = ::osl::DirectoryItem::get( aTypeURL, rItem );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileSize );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+ sal_uInt64 uFileSize = rFileStatus.getFileSize( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileSize function: file with size of TEST_FILE_SIZE, did not pass in (W32). ",
+ TEST_FILE_SIZE == uFileSize );
+ }
+ CPPUNIT_TEST_SUITE( getFileSize );
+ CPPUNIT_TEST( getFileSize_001 );
+ CPPUNIT_TEST( getFileSize_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFileSize
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline ::rtl::OUString getFileName() const
+ //---------------------------------------------------------------------
+ class getFileName : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aTypeURL;
+ ::osl::FileBase::RC nError;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ aTypeURL = aUserDirectoryURL.copy( 0 );
+ concatURL( aTypeURL, aTmpName2 );
+ createTestFile( aTypeURL );
+ nError = ::osl::DirectoryItem::get( aTypeURL, rItem );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+ }
+
+ void tearDown( )
+ {
+ deleteTestFile( aTypeURL );
+ }
+
+ // test code.
+ void getFileName_001( )
+ {
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ ::rtl::OUString aFileName = rFileStatus.getFileName( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileName function: name compare with specify",
+ sal_True == compareFileName( aFileName, aTmpName2 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getFileName );
+ CPPUNIT_TEST( getFileName_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFileName
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline ::rtl::OUString getFileURL() const
+ //---------------------------------------------------------------------
+ class getFileURL : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aTypeURL;
+ ::osl::FileBase::RC nError;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ createTestFile( aTmpName6 );
+ nError = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+ }
+
+ void tearDown( )
+ {
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void getFileURL_001( )
+ {
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileURL );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError == FileBase::E_None );
+
+ ::rtl::OUString aFileURL = rFileStatus.getFileURL( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileURL function: ",
+ sal_True == compareFileName( aFileURL, aTmpName6 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getFileURL );
+ CPPUNIT_TEST( getFileURL_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFileURL
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline ::rtl::OUString getLinkTargetURL() const
+ //---------------------------------------------------------------------
+ class getLinkTargetURL : public CppUnit::TestFixture
+ {
+ ::rtl::OUString aTypeURL;
+ ::osl::FileBase::RC nError;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // test code.
+ // initialization
+ void setUp( )
+ {
+ aTypeURL = aUserDirectoryURL.copy( 0 );
+ concatURL( aTypeURL, aTmpName2 );
+ createTestFile( aTypeURL );
+ }
+
+ void tearDown( )
+ {
+ deleteTestFile( aTypeURL );
+ }
+
+#if ( defined UNX ) || ( defined OS2 ) //Link file is not define in Windows
+ void getLinkTargetURL_001( )
+ {
+ //create a link file;
+ ::rtl::OUString aUStr_LnkFileSys( aTempDirectorySys ), aUStr_SrcFileSys( aTempDirectorySys );
+ ( ( aUStr_LnkFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/link.file");
+ ( ( aUStr_SrcFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/tmpname");
+
+ rtl::OString strLinkFileName, strSrcFileName;
+ strLinkFileName = OUStringToOString( aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US );
+ strSrcFileName = OUStringToOString( aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US );
+
+ sal_Int32 fd;
+ fd = symlink( strSrcFileName.getStr(), strLinkFileName.getStr() );
+ CPPUNIT_ASSERT_MESSAGE( "in creating link file", fd == 0 );
+
+ //get linkTarget URL
+ nError = ::osl::DirectoryItem::get( aLnkURL1, rItem );
+ CPPUNIT_ASSERT_MESSAGE( "in getting link file item", nError == FileBase::E_None );
+
+ ::osl::FileStatus rFileStatus( FileStatusMask_LinkTargetURL );
+ nError = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT_MESSAGE( "in getting link file status", nError == FileBase::E_None );
+ ::rtl::OUString aFileURL = rFileStatus.getLinkTargetURL( );
+
+ //remove link file
+ fd = remove( strLinkFileName.getStr() );
+ CPPUNIT_ASSERT_MESSAGE( "in deleting link file", fd == 0 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getLinkTargetURL function: Solaris version, creat a file, and a link file link to it, get its LinkTargetURL and compare",
+ sal_True == compareFileName( aFileURL, aTypeURL ) );
+ }
+#else
+ void getLinkTargetURL_001( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getLinkTargetURL function: Windows version, not tested",
+ 1 );
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( getLinkTargetURL );
+ CPPUNIT_TEST( getLinkTargetURL_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getLinkTargetURL
+
+ // -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::ctors, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::isValid, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::getFileType, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::getAttributes, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::getAccessTime, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::getModifyTime, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::getFileSize, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::getFileName, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::getFileURL, "osl_FileStatus" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_FileStatus::getLinkTargetURL, "osl_FileStatus" );
+}// namespace osl_FileStatus
+
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for File class
+//------------------------------------------------------------------------
+namespace osl_File
+{
+ //---------------------------------------------------------------------
+ // testing the method
+ // File( const ::rtl::OUString& ustrFileURL )
+ //---------------------------------------------------------------------
+ class ctors : public CppUnit::TestFixture
+ {
+ // ::osl::FileBase::RC nError1;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void ctors_001( )
+ {
+ ::osl::File testFile( aTmpName4 );
+
+ ::osl::FileBase::RC nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ ::osl::FileBase::RC nError2 = testFile.close( );
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: initialize a File and test its open and close",
+ ( ::osl::FileBase::E_None == nError1 ) && ( ::osl::FileBase::E_None == nError2 ) );
+ }
+
+ void ctors_002( )
+ {
+ ::osl::File testFile( aTmpName5 );
+ sal_Char buffer[30] = "Test for File constructor";
+ sal_uInt64 nCount;
+
+ ::osl::FileBase::RC nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ ::osl::FileBase::RC nError2 = testFile.write( buffer, 30, nCount );
+ testFile.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: test relative file URL, this test show that relative file URL is also acceptable",
+ ( ::osl::FileBase::E_None == nError1 ) && ( ::osl::FileBase::E_None == nError2 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST( ctors_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class ctors
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC open( sal_uInt32 uFlags )
+ //---------------------------------------------------------------------
+ class open : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2, nError3;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void open_001( )
+ {
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ nError2 = testFile.close( );
+ CPPUNIT_ASSERT_MESSAGE("close error", ::osl::FileBase::E_None == nError2 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: open a regular file",
+ ::osl::FileBase::E_None == nError1 );
+ }
+
+ void open_002( )
+ {
+ ::osl::File testFile( aTmpName3 );
+
+ nError1 = testFile.open( OpenFlag_Read );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: open a directory",
+ ( File::E_INVAL == nError1 ) || ( File::E_ACCES == nError1 ) );
+ }
+
+ void open_003( )
+ {
+ ::osl::File testFile( aCanURL1 );
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: open a non-exist file",
+ File::E_NOENT == nError1 );
+ }
+
+ void open_004( )
+ {
+ ::rtl::OUString aTestFile( aRootURL );
+ concatURL( aTestFile, aTmpName2 );
+ ::osl::File testFile( aTestFile );
+
+ nError1 = testFile.open( OpenFlag_Create );
+ sal_Bool bOK = ( File::E_ACCES == nError1 );
+#if defined (WNT )
+ bOK = sal_True; /// in Windows, you can create file in c:/ any way.
+ testFile.close( );
+ deleteTestFile( aTestFile);
+#endif
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: create an illegal file",
+ bOK == sal_True );
+ }
+
+ void open_005( )
+ {
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Create );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: create an exist file",
+ File::E_EXIST == nError1 );
+ }
+
+ void open_006( )
+ {
+ ::osl::File testFile( aCanURL1 );
+ sal_Char buffer_write[30] = "Test for File open";
+ sal_Char buffer_read[30];
+ sal_uInt64 nCount_write, nCount_read;
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write | OpenFlag_Create );
+ nError2 = testFile.write( buffer_write, 30, nCount_write );
+ ::osl::FileBase::RC nError4 = testFile.setPos( Pos_Absolut, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError4 );
+ nError3 = testFile.read( buffer_read, 10, nCount_read );
+
+ ::osl::FileBase::RC nError5 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError5 );
+ ::osl::FileBase::RC nError6 = testFile.remove( aCanURL1 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError6 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: test for OpenFlag_Read,OpenFlag_Write and OpenFlag_Create",
+ ( ::osl::FileBase::E_None == nError1 ) &&
+ ( ::osl::FileBase::E_None == nError2 ) &&
+ ( ::osl::FileBase::E_None == nError3 ) &&
+ ( 30 == nCount_write ) &&
+ ( 10 == nCount_read ) );
+ }
+
+ CPPUNIT_TEST_SUITE( open );
+ CPPUNIT_TEST( open_001 );
+ CPPUNIT_TEST( open_002 );
+ CPPUNIT_TEST( open_003 );
+ CPPUNIT_TEST( open_004 );
+ CPPUNIT_TEST( open_005 );
+ CPPUNIT_TEST( open_006 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class open
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC close()
+ //---------------------------------------------------------------------
+ class close : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2, nError3;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void close_001( )
+ {
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError2 = testFile.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close function: close a regular file",
+ ::osl::FileBase::E_None == nError2 );
+ }
+
+ void close_002( )
+ {
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError2 = testFile.close( );
+
+ nError3 = testFile.setPos( Pos_Absolut, 0 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close function: manipulate a file after it has been closed",
+ ( ::osl::FileBase::E_None == nError2 ) &&
+ ( ::osl::FileBase::E_None != nError3 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( close );
+ CPPUNIT_TEST( close_001 );
+ CPPUNIT_TEST( close_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class close
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC setPos( sal_uInt32 uHow, sal_Int64 uPos )
+ //---------------------------------------------------------------------
+ class setPos : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ //write chars into the file.
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.write( pBuffer_Char, sizeof( pBuffer_Char ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void setPos_001( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ sal_Char buffer_read[2];
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.setPos( Pos_Absolut, 26 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.read( buffer_read, 1, nCount_read );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPos function: test for Pos_Absolut, set the position to 26, test if the 26th char in file is correct",
+ buffer_read[0] == pBuffer_Char[26] );
+ }
+
+ void setPos_002( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ sal_Char buffer_read[2];
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.setPos( Pos_Absolut, sizeof( pBuffer_Char ) - 2 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.setPos( Pos_Current, 0);
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.read( buffer_read, 1, nCount_read );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPos function: test for Pos_Current, set the position to end, test if the ( end -1 ) char in file is correct",
+ buffer_read[0] == pBuffer_Char[sizeof( pBuffer_Char ) - 2] );
+ }
+
+ void setPos_003( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ sal_Char buffer_read[2];
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //the file size is smaller than 100
+ nError1 = testFile.setPos( Pos_End, -100 );
+ CPPUNIT_ASSERT_MESSAGE( "should return error", ::osl::FileBase::E_INVAL == nError1 );
+
+ nError1 = testFile.setPos( Pos_End, -53 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.read( buffer_read, 1, nCount_read );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPos function: test for Pos_End, set the position to end, test if the first char in file is correct",
+ buffer_read[0] == pBuffer_Char[0] );
+ }
+
+ CPPUNIT_TEST_SUITE( setPos );
+ CPPUNIT_TEST( setPos_001 );
+ CPPUNIT_TEST( setPos_002 );
+ CPPUNIT_TEST( setPos_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class setPos
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC getPos( sal_uInt64& uPos )
+ //---------------------------------------------------------------------
+ class getPos : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ //write chars into the file.
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.write( pBuffer_Char, sizeof( pBuffer_Char ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void getPos_001( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ sal_uInt64 nFilePointer;
+
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_INVAL == nError1 );
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.setPos( Pos_Absolut, 26 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPos function: set the position to 26, get position and check if it is right",
+ 26 == nFilePointer );
+ }
+
+ CPPUNIT_TEST_SUITE( getPos );
+ CPPUNIT_TEST( getPos_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getPos
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC isEndOfFile( sal_Bool *pIsEOF )
+ //---------------------------------------------------------------------
+ class isEndOfFile : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ //write chars into the file.
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.write( pBuffer_Char, sizeof( pBuffer_Char ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void isEndOfFile_001( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ sal_Bool bEOF = sal_False;
+ sal_Bool *pEOF = &bEOF;
+
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.setPos( Pos_End, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.isEndOfFile( pEOF );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isEndOfFile function: set the position to end, check if reach end",
+ sal_True == *pEOF );
+ }
+
+ void isEndOfFile_002( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ sal_Bool bEOF = sal_False;
+ sal_Bool *pEOF = &bEOF;
+ sal_uInt64 nFilePointer = 0;
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.setPos( Pos_Absolut, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ *pEOF = sal_False;
+ while ( !( *pEOF ) )
+ {
+ nError1 = testFile.isEndOfFile( pEOF );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.setPos( Pos_Current, 1 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isEndOfFile function: use isEndOfFile to move pointer step by step",
+ sizeof( pBuffer_Char ) + 1 == nFilePointer );
+ }
+ CPPUNIT_TEST_SUITE( isEndOfFile );
+ CPPUNIT_TEST( isEndOfFile_001 );
+ CPPUNIT_TEST( isEndOfFile_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class isEndOfFile
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC setSize( sal_uInt64 uSize )
+ //---------------------------------------------------------------------
+ class setSize : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ //write chars into the file.
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.write( pBuffer_Char, sizeof( pBuffer_Char ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void setSize_001( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ // sal_Bool bEOF = sal_False;
+ // sal_Bool *pEOF = &bEOF;
+ sal_uInt64 nFilePointer;
+
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //enlarge the file to size of 100;
+ nError1 = testFile.setSize( 100 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //get the file size;
+ nError1 = testFile.setPos( Pos_End, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setSize function: enlarge the file ",
+ 100 == nFilePointer );
+ }
+
+ void setSize_002( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ // sal_Bool bEOF = sal_False;
+ // sal_Bool *pEOF = &bEOF;
+ sal_uInt64 nFilePointer;
+
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //enlarge the file to size of 100;
+ nError1 = testFile.setSize( 10 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //get the file size;
+ nError1 = testFile.setPos( Pos_End, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setSize function: truncate the file ",
+ 10 == nFilePointer );
+ }
+ /* void setSize_003( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ // sal_Bool bEOF = sal_False;
+ // sal_Bool *pEOF = &bEOF;
+ sal_uInt64 nFilePointer;
+
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //enlarge the file to size of 100;
+ nError1 = testFile.setSize( 10 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //get the file size;
+ nError1 = testFile.setPos( Pos_End, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setSize function: truncate the file ",
+ 10 == nFilePointer );
+ }
+ */
+
+ CPPUNIT_TEST_SUITE( setSize );
+ CPPUNIT_TEST( setSize_001 );
+ CPPUNIT_TEST( setSize_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class setSize
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC read( void *pBuffer, sal_uInt64 uBytesRequested, sal_uInt64& rBytesRead )
+ //---------------------------------------------------------------------
+ class read : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ //write chars into the file.
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.write( pBuffer_Char, sizeof( pBuffer_Char ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void read_001( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ sal_uInt64 nFilePointer;
+ sal_Char buffer_read[10];
+
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.read( buffer_read, 10, nCount_read );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for read function: read whole content in the file to a buffer",
+ ( 10 == nFilePointer ) && ( 0 == strncmp( buffer_read, pBuffer_Char, 10 ) ) );
+ }
+
+ void read_002( )
+ {
+ ::osl::File testFile( aTmpName4 );
+ sal_uInt64 nFilePointer;
+ sal_Char buffer_read[26];
+
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.setPos( Pos_Absolut, 26 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.read( buffer_read, 26, nCount_read );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for read function: read from a special positon in the file",
+ ( 52 == nFilePointer ) && ( 26 == nCount_read ) && ( 0 == strncmp( buffer_read, &pBuffer_Char[26], 26 ) ) );
+ }
+
+ CPPUNIT_TEST_SUITE( read );
+ CPPUNIT_TEST( read_001 );
+ CPPUNIT_TEST( read_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class read
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC write(const void *pBuffer, sal_uInt64 uBytesToWrite, sal_uInt64& rBytesWritten)
+ //---------------------------------------------------------------------
+ class write : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpname.
+ createTestFile( aTmpName6 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void write_001( )
+ {
+ ::osl::File testFile( aTmpName6 );
+ sal_uInt64 nFilePointer;
+ sal_Char buffer_read[10];
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //write chars into the file.
+ nError1 = testFile.write( pBuffer_Char, 10, nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //get the current pointer;
+ nError1 = testFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //reset pointer to the begining;
+ nError1 = testFile.setPos( Pos_Absolut, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.read( buffer_read, 10, nCount_read );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for write function: read whole content in the file to a buffer. Note, buffer size can not smaller than the read size",
+ ( 10 == nFilePointer ) &&
+ ( 0 == strncmp( buffer_read, pBuffer_Char, 10 ) ) &&
+ ( 10 == nCount_write ) );
+ }
+
+ CPPUNIT_TEST_SUITE( write );
+ CPPUNIT_TEST( write_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class write
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC readLine( ::rtl::ByteSequence& aSeq )
+ //---------------------------------------------------------------------
+ class readLine : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+ sal_uInt64 nCount_write, nCount_read;
+ ::rtl::ByteSequence aSequence;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpname.
+ createTestFile( aTmpName6 );
+
+ //write some strings into the file.
+ ::osl::File testFile( aTmpName6 );
+ sal_Char ppStrSeq[3][27] = { "abcde\n",
+ "1234567890\n",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ };
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ for ( int nCount = 0; nCount < 3; nCount++ )
+ {
+ nError1 = testFile.write( ppStrSeq[nCount], strlen( ppStrSeq[nCount] ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void readLine_001( )
+ {
+ ::osl::File testFile( aTmpName6 );
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.readLine( aSequence );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for readLine function: read the first line of the file.",
+ ( ::osl::FileBase::E_None == nError1 ) &&
+ ( 0 == strncmp( ( const char * )aSequence.getArray( ), pBuffer_Char, 5 ) ) );
+ }
+
+ void readLine_002( )
+ {
+ ::osl::File testFile( aTmpName6 );
+ sal_Bool bEOF = sal_False;
+ sal_Bool *pEOF = &bEOF;
+
+ nError1 = testFile.open( OpenFlag_Read | OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ for ( int nCount = 0; nCount < 3; nCount++ )
+ {
+ nError1 = testFile.readLine( aSequence );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+ nError1 = testFile.isEndOfFile( pEOF );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for readLine function: read three lines of the file and check the file pointer moving.",
+ *pEOF &&
+ ( 0 == strncmp( ( const char * )aSequence.getArray( ), &pBuffer_Char[26], 26 ) ) );
+ }
+ CPPUNIT_TEST_SUITE( readLine );
+ CPPUNIT_TEST( readLine_001 );
+ CPPUNIT_TEST( readLine_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class readLine
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC copy( const ::rtl::OUString& ustrSourceFileURL, const ::rtl::OUString& ustrDestFileURL )
+ //---------------------------------------------------------------------
+ class copy : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ //write chars into the file.
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.write( pBuffer_Char, sizeof( pBuffer_Char ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void copy_001( )
+ {
+ ::osl::File testFile( aTmpName6 );
+
+ //copy $TEMP/tmpdir/tmpname to $TEMP/tmpname.
+ nError1 = ::osl::File::copy( aTmpName4, aTmpName6 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //check
+ nError1 = testFile.open( OpenFlag_Create );
+ deleteTestFile( aTmpName6 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for copy function: copy file to upper directory",
+ ::osl::FileBase::E_EXIST == nError1 );
+ }
+
+ void copy_002( )
+ {
+ //copy $TEMP/tmpdir/tmpname to $TEMP/tmpdir.
+ nError1 = ::osl::File::copy( aTmpName4, aTmpName3 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for copy function: use directory as destination",
+ ( ::osl::FileBase::E_ISDIR == nError1 ) ||( ::osl::FileBase::E_ACCES == nError1 ) );
+ }
+
+ void copy_003( )
+ {
+ //copy $TEMP/tmpdir/tmpname to $ROOT/tmpname.
+ nError1 = ::osl::File::copy( aTmpName4, aTmpName7 );
+#if defined (WNT )
+ nError1 = ::osl::FileBase::E_ACCES; /// for Windows, c:/ is writtenable any way.
+ deleteTestFile( aTmpName7);
+#endif
+ CPPUNIT_ASSERT_MESSAGE( "test for copy function: copy to an illigal place",
+ ::osl::FileBase::E_ACCES == nError1 );
+ }
+
+ void copy_004( )
+ {
+ //copy $TEMP/tmpname to $TEMP/tmpdir/tmpname.
+ nError1 = ::osl::File::copy( aTmpName6, aTmpName4 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for copy function: copy a not exist file",
+ ::osl::FileBase::E_NOENT == nError1 );
+ }
+
+ void copy_005( )
+ {
+ //copy $TEMP/tmpname to $TEMP/system.path using system path.
+ nError1 = ::osl::File::copy( aTmpName6, aSysPath1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for copy function: copy a file using system file path",
+ ::osl::FileBase::E_INVAL == nError1 );
+ }
+ void copy_006( )
+ {
+ createTestFile( aTmpName6 );
+ File tmpFile( aTmpName6 );
+ FileBase::RC err = tmpFile.open( OpenFlag_Write | OpenFlag_Read );
+ (void)err;
+ tmpFile.setSize( 200 );
+ tmpFile.close();
+ //copy to new path
+ nError1 = ::osl::File::copy( aTmpName6, aTmpName4 );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None );
+
+ //check if is the new file
+ File newFile( aTmpName4 );
+ newFile.open( OpenFlag_Write | OpenFlag_Read );
+ newFile.setPos( Pos_End, 0 );
+ // CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ sal_uInt64 nFilePointer;
+ nError1 = newFile.getPos( nFilePointer );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ newFile.close( );
+ deleteTestFile( aTmpName6 );
+ CPPUNIT_ASSERT_MESSAGE( "test for copy function: the dest file exist",
+ nFilePointer == 200 );
+ }
+ //copyLink has not been impletmented yet
+ void copy_007( )
+ {
+#if ( defined UNX )
+
+ CPPUNIT_ASSERT_MESSAGE( "test for copy function: source file is link file",
+ ::osl::FileBase::E_INVAL == nError1 );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( copy );
+ CPPUNIT_TEST( copy_001 );
+ CPPUNIT_TEST( copy_002 );
+ CPPUNIT_TEST( copy_003 );
+ CPPUNIT_TEST( copy_004 );
+ CPPUNIT_TEST( copy_005 );
+ CPPUNIT_TEST( copy_006 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class copy
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC move( const ::rtl::OUString& ustrSourceFileURL, const ::rtl::OUString& ustrDestFileURL )
+ //---------------------------------------------------------------------
+ class move : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ //write chars into the file.
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.write( pBuffer_Char, sizeof( pBuffer_Char ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void move_001( )
+ {
+ //rename $TEMP/tmpdir/tmpname to $TEMP/canonical.name.
+ nError1 = ::osl::File::move( aTmpName4, aCanURL1 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //check
+ ::osl::File testFile( aCanURL1 );
+ nError2 = testFile.open( OpenFlag_Create );
+ deleteTestFile( aCanURL1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for move function: rename file to another directory",
+ ::osl::FileBase::E_EXIST == nError2 );
+ }
+
+ void move_002( )
+ {
+ //move $TEMP/tmpdir/tmpname to $TEMP/tmpdir.
+ nError1 = ::osl::File::move( aTmpName4, aTmpName3 );
+ //returned ::osl::FileBase::E_ACCES on WNT
+ CPPUNIT_ASSERT_MESSAGE( "test for move function: use directory as destination",
+ ( ::osl::FileBase::E_ACCES == nError1 || ::osl::FileBase::E_ISDIR == nError1 ) ||( ::osl::FileBase::E_EXIST == nError1 ) );
+ }
+
+ void move_003( )
+ {
+ //move $TEMP/tmpdir/tmpname to $ROOT/tmpname.
+ nError1 = ::osl::File::move( aTmpName4, aTmpName7 );
+#if defined (WNT )
+ nError1 = ::osl::FileBase::E_ACCES; /// for Windows, c:/ is writtenable any way.
+ deleteTestFile( aTmpName7);
+#endif
+
+ CPPUNIT_ASSERT_MESSAGE( "test for move function: move to an illigal place",
+ ::osl::FileBase::E_ACCES == nError1 );
+ }
+
+ void move_004( )
+ {
+ //move $TEMP/tmpname to $TEMP/tmpdir/tmpname.
+ nError1 = ::osl::File::move( aTmpName6, aTmpName4 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for move function: move a not exist file",
+ ::osl::FileBase::E_NOENT == nError1 );
+ }
+
+ void move_005( )
+ {
+ //move $TEMP/tmpname to $TEMP/system.path using system path.
+ nError1 = ::osl::File::move( aTmpName6, aSysPath1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for move function: move a file using system file",
+ ::osl::FileBase::E_INVAL == nError1 );
+ }
+
+ void move_006( )
+ {
+ //move directory $TEMP/tmpname to $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName6 );
+ nError1 = ::osl::File::move( aTmpName6, aTmpName4 );
+ //move file $TEMP/tmpdir/tmpname to $TEMP/tmpname
+ nError2 = ::osl::File::move( aTmpName4, aTmpName6 );
+ deleteTestDirectory( aTmpName6 );
+#if defined ( WNT )
+ deleteTestDirectory( aTmpName4 );// in Windows, it can be moved!!!!! this is only for not influence the following test.
+ deleteTestFile( aTmpName6 );
+ nError1 = ::osl::FileBase::E_NOTDIR;
+ nError2 = ::osl::FileBase::E_ISDIR;
+#endif
+ CPPUNIT_ASSERT_MESSAGE( "test for move function: move a directory to an exist file with same name, did not pass in (W32)",
+ ::osl::FileBase::E_NOTDIR == nError1 && ::osl::FileBase::E_ISDIR == nError2 );
+ }
+
+ void move_007( )
+ {
+ //create directory $TEMP/tmpname.
+ createTestDirectory( aTmpName6 );
+ //move directory $TEMP/tmpdir to $TEMP/tmpname/tmpdir
+ nError1 = ::osl::File::move( aTmpName3, aTmpName8 );
+ //check
+ nError2 = ::osl::Directory::create( aTmpName8 );
+ ::osl::File::move( aTmpName8, aTmpName3 );
+ deleteTestDirectory( aTmpName6 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for move function: move a directory to an exist file with same name",
+ (::osl::FileBase::E_None == nError1 ) &&
+ (::osl::FileBase::E_EXIST == nError2 ) );
+ }
+ // oldpath and newpath are not on the same filesystem.EXDEV,no such error no on Solaris, only on linux
+ void move_008( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "oldpath and newpath are not on the same filesystem, should error returns",
+ ::osl::FileBase::E_None == nError1 );
+ }
+ //bugid# 115420, after the bug fix, add the case
+ void move_009( )
+ {
+ //create directory $TEMP/tmpname.
+ createTestDirectory( aTmpName6 );
+ //create directory $TEMP/tmpname/tmpdir
+ createTestDirectory( aTmpName8 );
+ //move directory $TEMP/tmpname to $TEMP/tmpname/tmpdir/tmpname
+ rtl::OUString newName = aTmpName8 + OUString::createFromAscii("/tmpname");
+ //printFileName( newName );
+ nError1 = ::osl::File::move( aTmpName3, newName );
+ //deleteTestDirectory( newName + OUString::createFromAscii("/tmpname") );
+ //deleteTestDirectory( newName );
+ deleteTestDirectory( aTmpName8 );
+ deleteTestDirectory( aTmpName6 );
+ CPPUNIT_ASSERT_MESSAGE( "test for move function: move a directory to it's subdirectory",
+ ::osl::FileBase::E_None != nError1 );
+ }
+
+ CPPUNIT_TEST_SUITE( move );
+ CPPUNIT_TEST( move_001 );
+ CPPUNIT_TEST( move_002 );
+ CPPUNIT_TEST( move_003 );
+ CPPUNIT_TEST( move_004 );
+ CPPUNIT_TEST( move_005 );
+ CPPUNIT_TEST( move_006 );
+ CPPUNIT_TEST( move_007 );
+ // CPPUNIT_TEST( move_008 );
+ //CPPUNIT_TEST( move_009 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class move
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC remove( const ::rtl::OUString& ustrFileURL )
+ //---------------------------------------------------------------------
+ class remove : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+ sal_uInt64 nCount_write, nCount_read;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+
+ //write chars into the file.
+ ::osl::File testFile( aTmpName4 );
+
+ nError1 = testFile.open( OpenFlag_Write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.write( pBuffer_Char, sizeof( pBuffer_Char ), nCount_write );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = testFile.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void remove_001( )
+ {
+ //remove $TEMP/tmpdir/tmpname.
+ nError1 = ::osl::File::remove( aTmpName4 );
+ //check
+ ::osl::File testFile( aTmpName4 );
+ nError2 = testFile.open( OpenFlag_Create );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for remove function: remove a file",
+ ( ::osl::FileBase::E_None == nError1 ) &&
+ ( ::osl::FileBase::E_EXIST != nError2 ) );
+ }
+
+ void remove_002( )
+ {
+ //remove $TEMP/tmpname.
+ nError1 = ::osl::File::remove( aTmpName6 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for remove function: remove a file not exist",
+ ( ::osl::FileBase::E_NOENT == nError1 ) );
+ }
+
+ void remove_003( )
+ {
+ //remove $TEMP/system/path.
+ nError1 = ::osl::File::remove( aSysPath2 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for remove function: removing a file not using full qualified URL",
+ ( ::osl::FileBase::E_INVAL == nError1 ) );
+ }
+
+ void remove_004( )
+ {
+ //remove $TEMP/tmpdir.
+ nError1 = ::osl::File::remove( aTmpName3 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for remove function: remove a directory",
+ ( ::osl::FileBase::E_ISDIR == nError1 ) || ( ::osl::FileBase::E_ACCES == nError1 ));
+ }
+
+ CPPUNIT_TEST_SUITE( remove );
+ CPPUNIT_TEST( remove_001 );
+ CPPUNIT_TEST( remove_002 );
+ CPPUNIT_TEST( remove_003 );
+ CPPUNIT_TEST( remove_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class remove
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC setAttributes( const ::rtl::OUString& ustrFileURL, sal_uInt64 uAttributes )
+ //---------------------------------------------------------------------
+ class setAttributes : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+ ::osl::DirectoryItem rItem, rItem_hidden;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestFile( aTmpName6 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void setAttributes_001( )
+ {
+ //on windows, only can set 2 attributes: Attribute_ReadOnly, Attribute_HIDDEN
+#ifdef UNX
+ //set the file to readonly
+ nError2 = ::osl::File::setAttributes( aTmpName6, Attribute_ReadOnly | Attribute_GrpRead | Attribute_OwnRead | Attribute_OthRead );
+ CPPUNIT_ASSERT( nError2 == FileBase::E_None);
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None);
+ //get the file attributes
+ ::osl::FileStatus rFileStatus( FileStatusMask_Attributes );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setAttributes function: set file attributes and get it to verify.",
+ ( Attribute_ReadOnly | Attribute_GrpRead | Attribute_OwnRead | Attribute_OthRead ) ==
+ rFileStatus.getAttributes( ) );
+#else
+ //please see GetFileAttributes
+ nError2 = ::osl::File::setAttributes( aTmpName6, Attribute_ReadOnly );
+ CPPUNIT_ASSERT( nError2 == FileBase::E_None);
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None);
+ //get the file attributes
+ ::osl::FileStatus rFileStatus( FileStatusMask_Attributes );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None );
+ //here the file has 2 Attributes: FILE_ATTRIBUTE_READONLY and FILE_ATTRIBUTE_NORMAL,
+ // but FILE_ATTRIBUTE_NORMAL is valid only if used alone, so this is maybe a bug
+ /*::rtl::OString aString = ::rtl::OUStringToOString( aTmpName6, RTL_TEXTENCODING_ASCII_US );
+ DWORD dwFileAttributes = GetFileAttributes( aString.getStr( ) );
+ if (dwFileAttributes & FILE_ATTRIBUTE_NORMAL)
+ t_print("has normal attribute");
+ if (dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+ t_print("has readonly attribute");
+ */
+ CPPUNIT_ASSERT_MESSAGE( "test for setAttributes function: set file attributes READONLY and get it to verify.",
+ (Attribute_ReadOnly & rFileStatus.getAttributes( )) != 0 );
+#endif
+ }
+ void setAttributes_002( )
+ {
+ //on UNX, can not set hidden attribute to file, rename file can set the attribute
+#ifdef WNT
+ //set the file to hidden
+ nError2 = ::osl::File::setAttributes( aTmpName6, Attribute_Hidden);
+
+ CPPUNIT_ASSERT( nError2 == FileBase::E_None);
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None);
+ //get the file attributes
+ ::osl::FileStatus rFileStatus( FileStatusMask_Attributes );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setAttributes function: set file attributes and get it to verify.",
+ (Attribute_Hidden & rFileStatus.getAttributes( )) != 0 );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( setAttributes );
+ CPPUNIT_TEST( setAttributes_001 );
+ CPPUNIT_TEST( setAttributes_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class setAttributes
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC setTime(
+ // const ::rtl::OUString& ustrFileURL,
+ // const TimeValue& rCreationTime,
+ // const TimeValue& rLastAccessTime,
+ // const TimeValue& rLastWriteTime )
+ //---------------------------------------------------------------------
+ class setTime : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestFile( aTmpName6 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void setTime_001( )
+ {
+ TimeValue *pTV_current = NULL;
+ CPPUNIT_ASSERT( ( pTV_current = ( TimeValue* )malloc( sizeof( TimeValue ) ) ) != NULL );
+ TimeValue *pTV_creation = NULL;
+ CPPUNIT_ASSERT( ( pTV_creation = ( TimeValue* )malloc( sizeof( TimeValue ) ) ) != NULL );
+ TimeValue *pTV_access = NULL;
+ CPPUNIT_ASSERT( ( pTV_access = ( TimeValue* )malloc( sizeof( TimeValue ) ) ) != NULL );
+ TimeValue *pTV_modify = NULL;
+ CPPUNIT_ASSERT( ( pTV_modify = ( TimeValue* )malloc( sizeof( TimeValue ) ) ) != NULL );
+
+ //get current time
+ sal_Bool bOk = osl_getSystemTime( pTV_current );
+ CPPUNIT_ASSERT( sal_True == bOk );
+
+ //set the file time
+ nError2 = ::osl::File::setTime( aTmpName6, *pTV_current, *pTV_current, *pTV_current );
+ CPPUNIT_ASSERT_MESSAGE( errorToStr( nError2 ), nError2 == FileBase::E_None);
+
+ //get the file access time, creation time, modify time
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT_MESSAGE( errorToStr( nError1 ), nError1 == FileBase::E_None);
+
+ ::osl::FileStatus rFileStatus( FileStatusMask_AccessTime );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT_MESSAGE( errorToStr( nError1 ),nError1 == FileBase::E_None );
+ *pTV_access = rFileStatus.getAccessTime( );
+
+ ::osl::FileStatus rFileStatus1( FileStatusMask_CreationTime );
+ nError1 = rItem.getFileStatus( rFileStatus1 );
+ CPPUNIT_ASSERT_MESSAGE( errorToStr( nError1 ), nError1 == FileBase::E_None );
+ *pTV_creation = rFileStatus1.getCreationTime( );
+
+ ::osl::FileStatus rFileStatus2( FileStatusMask_ModifyTime );
+ nError1 = rItem.getFileStatus( rFileStatus2 );
+ CPPUNIT_ASSERT_MESSAGE( errorToStr( nError1 ), nError1 == FileBase::E_None );
+ *pTV_modify = rFileStatus2.getModifyTime( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setTime function: set access time then get it. time precision is still a problem for it cut off the nanosec.",
+ sal_True == t_compareTime( pTV_access, pTV_current, delta ) );
+#if defined ( WNT )
+ //Unfortunately there is no way to get the creation time of a file under Unix (its a Windows only feature).
+ //That means the flag osl_FileStatus_Mask_CreationTime should be deprecated under Unix.
+ CPPUNIT_ASSERT_MESSAGE( "test for setTime function: set creation time then get it. ",
+ sal_True == t_compareTime( pTV_creation, pTV_current, delta ) ) ;
+#endif
+ CPPUNIT_ASSERT_MESSAGE( "test for setTime function: set modify time then get it. ",
+ sal_True == t_compareTime( pTV_modify, pTV_current, delta ) );
+ free( pTV_current );
+ free( pTV_creation );
+ free( pTV_access );
+ free( pTV_modify );
+ }
+
+ CPPUNIT_TEST_SUITE( setTime );
+ CPPUNIT_TEST( setTime_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class setTime
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC sync()
+ //---------------------------------------------------------------------
+ class sync : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestFile( aTmpName6 );
+
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test case: if The file is located on a read only file system.
+ void sync_001( )
+ {
+#ifdef UNX
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None);
+
+ File tmp_file( aTmpName6 );
+ FileBase::RC err = tmp_file.open(osl_File_OpenFlag_Write );
+
+ CPPUNIT_ASSERT_MESSAGE("File open failed", err == FileBase::E_None);
+
+ char buffer[50000];
+ sal_uInt64 written = 0;
+ nError1 = tmp_file.write((void*)buffer, sizeof(buffer), written);
+ CPPUNIT_ASSERT_MESSAGE("write failed!", nError1 == FileBase::E_None);
+
+ //set the file to readonly
+ nError2 = ::osl::File::setAttributes( aTmpName6, Attribute_ReadOnly | Attribute_GrpRead | Attribute_OwnRead | Attribute_OthRead );
+ CPPUNIT_ASSERT( nError2 == FileBase::E_None);
+
+ nError2 = tmp_file.sync();
+
+ CPPUNIT_ASSERT_MESSAGE("can not sync to readonly file!", nError2 == FileBase::E_None);
+
+ tmp_file.close();
+#endif
+ }
+ //test case:no enough space, how to create such case???see test_cpy_wrt_file.cxx::test_osl_writeFile
+
+
+
+ CPPUNIT_TEST_SUITE( sync );
+ CPPUNIT_TEST( sync_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class setTime
+
+ // -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::ctors, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::open, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::close, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::setPos, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::getPos, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::isEndOfFile, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::setSize, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::read, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::write, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::readLine, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::copy, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::move, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::remove, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::setAttributes, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::setTime, "osl_File" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_File::sync, "osl_File" );
+
+}// namespace osl_File
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for DirectoryItem class
+//------------------------------------------------------------------------
+namespace osl_DirectoryItem
+{
+ //---------------------------------------------------------------------
+ // testing the method
+ // DirectoryItem(): _pData( NULL )
+ //---------------------------------------------------------------------
+ class ctors : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpname.
+ createTestFile( aTmpName6 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void ctors_001( )
+ {
+ ::osl::File testFile( aTmpName6 );
+ ::osl::DirectoryItem rItem; //constructor
+
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: initialize a new instance of DirectoryItem and get an item to check.",
+ ::osl::FileBase::E_None == nError1 );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class ctors
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // DirectoryItem( const DirectoryItem& rItem ): _pData( rItem._pData)
+ //---------------------------------------------------------------------
+ class copy_assin_Ctors : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpname.
+ createTestFile( aTmpName6 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void copy_assin_Ctors_001( )
+ {
+ ::osl::DirectoryItem rItem; //constructor
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( FileBase::E_None == nError1 );
+
+ ::osl::DirectoryItem copyItem( rItem ); //copy constructor
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ nError1 = copyItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for copy_assin_Ctors function: use copy constructor to get an item and check filename.",
+ ( sal_True == compareFileName( rFileStatus.getFileName( ), aTmpName2 ) ) );
+ }
+
+ void copy_assin_Ctors_002( )
+ {
+ ::osl::DirectoryItem rItem; //constructor
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( FileBase::E_None == nError1 );
+
+ ::osl::DirectoryItem copyItem;
+ copyItem = rItem; //assinment operator
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ nError1 = copyItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for copy_assin_Ctors function: test assinment operator here since it is same as copy constructor in test way.",
+ ( sal_True == compareFileName( rFileStatus.getFileName( ), aTmpName2 ) ) );
+ }
+
+ CPPUNIT_TEST_SUITE( copy_assin_Ctors );
+ CPPUNIT_TEST( copy_assin_Ctors_001 );
+ CPPUNIT_TEST( copy_assin_Ctors_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class copy_assin_Ctors
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool is()
+ //---------------------------------------------------------------------
+ class is : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpname.
+ createTestFile( aTmpName6 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void is_001( )
+ {
+ ::osl::DirectoryItem rItem; //constructor
+
+ CPPUNIT_ASSERT_MESSAGE( "test for is function: use an uninitialized instance.",
+ !rItem.is( ) );
+ }
+
+ void is_002( )
+ {
+ ::osl::DirectoryItem rItem; //constructor
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+ CPPUNIT_ASSERT( FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for is function: use an uninitialized instance.",
+ ( sal_True == rItem.is( ) ) );
+ }
+
+ CPPUNIT_TEST_SUITE( is );
+ CPPUNIT_TEST( is_001 );
+ CPPUNIT_TEST( is_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class is
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // static inline RC get( const ::rtl::OUString& ustrFileURL, DirectoryItem& rItem )
+ //---------------------------------------------------------------------
+ class get : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpname.
+ createTestFile( aTmpName6 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpname.
+ deleteTestFile( aTmpName6 );
+ }
+
+ // test code.
+ void get_001( )
+ {
+ ::osl::DirectoryItem rItem; //constructor
+ //get the DirectoryItem.
+ nError2 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+
+ //check the file name
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( nError1 == FileBase::E_None );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for get function: use copy constructor to get an item and check filename.",
+ ( ::osl::FileBase::E_None == nError2 ) &&
+ ( sal_True == compareFileName( rFileStatus.getFileName( ), aTmpName2 ) ) );
+ }
+
+ void get_002( )
+ {
+ ::osl::DirectoryItem rItem;
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aSysPath1, rItem );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for get function: use a system name instead of a URL.",
+ FileBase::E_INVAL == nError1 );
+ }
+
+ void get_003( )
+ {
+ ::osl::DirectoryItem rItem;
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aTmpName3, rItem );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for get function: use a non existed file URL.",
+ FileBase::E_NOENT == nError1 );
+ }
+
+ CPPUNIT_TEST_SUITE( get );
+ CPPUNIT_TEST( get_001 );
+ CPPUNIT_TEST( get_002 );
+ CPPUNIT_TEST( get_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class get
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC getFileStatus( FileStatus& rStatus )
+ //---------------------------------------------------------------------
+ class getFileStatus : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void getFileStatus_001( )
+ {
+ ::osl::DirectoryItem rItem; //constructor
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aTmpName4, rItem );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //check the file name
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ nError2 = rItem.getFileStatus( rFileStatus );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileStatus function: get file status and check filename",
+ ( ::osl::FileBase::E_None == nError2 ) &&
+ ( sal_True == compareFileName( rFileStatus.getFileName( ), aTmpName2 ) ) );
+ }
+
+ void getFileStatus_002( )
+ {
+ ::osl::DirectoryItem rItem; //constructor
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aTmpName6, rItem );
+
+ //check the file name
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ nError2 = rItem.getFileStatus( rFileStatus );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileStatus function: file not existed",
+ ( ::osl::FileBase::E_INVAL == nError2 ) );
+ }
+
+ void getFileStatus_003( )
+ {
+ ::osl::DirectoryItem rItem; //constructor
+ //get the DirectoryItem.
+ nError1 = ::osl::DirectoryItem::get( aTmpName3, rItem );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //check the file name
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ nError2 = rItem.getFileStatus( rFileStatus );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getFileStatus function: get directory information",
+ ( ::osl::FileBase::E_None == nError2 ) &&
+ ( sal_True == compareFileName( rFileStatus.getFileName( ), aTmpName1 ) ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( getFileStatus );
+ CPPUNIT_TEST( getFileStatus_001 );
+ CPPUNIT_TEST( getFileStatus_002 );
+ CPPUNIT_TEST( getFileStatus_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getFileStatus
+
+
+
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_DirectoryItem::ctors, "osl_DirectoryItem" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_DirectoryItem::copy_assin_Ctors, "osl_DirectoryItem" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_DirectoryItem::is, "osl_DirectoryItem" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_DirectoryItem::get, "osl_DirectoryItem" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_DirectoryItem::getFileStatus, "osl_DirectoryItem" );
+}// namespace osl_DirectoryItem
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for Directory class
+//------------------------------------------------------------------------
+namespace osl_Directory
+{
+ //---------------------------------------------------------------------
+ // testing the method
+ // Directory( const ::rtl::OUString& strPath ): _pData( 0 ), _aPath( strPath )
+ //---------------------------------------------------------------------
+ class ctors : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ // LLA: t_print("tearDown done.\n");
+ }
+
+ // test code.
+ void ctors_001( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //close a directory
+ nError2 = testDirectory.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError2 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: create an instance and check open and close",
+ ( ::osl::FileBase::E_None == nError1 ) &&
+ ( ::osl::FileBase::E_None == nError2 ) );
+ }
+
+ void ctors_002( )
+ {
+ ::osl::Directory testDirectory( aTmpName9 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //close a directory
+ nError2 = testDirectory.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError2 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors function: relative URL, :-), it is also worked",
+ ( ::osl::FileBase::E_None == nError1 ) &&
+ ( ::osl::FileBase::E_None == nError2 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST( ctors_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class ctors
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC open()
+ //---------------------------------------------------------------------
+ class open : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void open_001( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ //check if directory is opened.
+ sal_Bool bOk = testDirectory.isOpen( );
+ //close a directory
+ nError2 = testDirectory.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: open a directory and check for open",
+ ( sal_True == bOk ) &&
+ ( ::osl::FileBase::E_None == nError1 ) &&
+ ( ::osl::FileBase::E_None == nError2 ) );
+ }
+
+ void open_002( )
+ {
+ ::osl::Directory testDirectory( aTmpName6 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ if ( ::osl::FileBase::E_None == nError1 )
+ {
+ nError2 = testDirectory.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError2 );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: open a file that is not existed",
+ ( ::osl::FileBase::E_NOENT == nError1 ) );
+ }
+
+ void open_003( )
+ {
+ ::osl::Directory testDirectory( aUserDirectorySys ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ if ( ::osl::FileBase::E_None == nError1 )
+ {
+ nError2 = testDirectory.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError2 );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: using system path",
+ ( ::osl::FileBase::E_INVAL == nError1 ) );
+ }
+
+ void open_004( )
+ {
+ ::osl::Directory testDirectory( aTmpName4 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ if ( ::osl::FileBase::E_None == nError1 )
+ {
+ nError2 = testDirectory.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError2 );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "test for open function: open a file instead of a directory",
+ ( ::osl::FileBase::E_NOTDIR == nError1 ) || ( ::osl::FileBase::E_ACCES ) );
+ }
+
+ CPPUNIT_TEST_SUITE( open );
+ CPPUNIT_TEST( open_001 );
+ CPPUNIT_TEST( open_002 );
+ CPPUNIT_TEST( open_003 );
+ CPPUNIT_TEST( open_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class open
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline sal_Bool isOpen() { return _pData != NULL; };
+ //---------------------------------------------------------------------
+ class isOpen : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempfile in $TEMP/tmpdir/tmpname.
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+ }
+
+ void tearDown( )
+ {
+ // remove the tempfile in $TEMP/tmpdir/tmpname.
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void isOpen_001( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ //check if directory is opened.
+ sal_Bool bOk = testDirectory.isOpen( );
+ //close a directory
+ nError2 = testDirectory.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isOpen function: open a directory and check for open",
+ ( sal_True == bOk ) );
+ }
+
+ void isOpen_002( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //check if directory is opened.
+ sal_Bool bOk = testDirectory.isOpen( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isOpen function: do not open a directory and check for open",
+ !( sal_True == bOk ) );
+ }
+
+ CPPUNIT_TEST_SUITE( isOpen );
+ CPPUNIT_TEST( isOpen_001 );
+ CPPUNIT_TEST( isOpen_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class isOpen
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC close()
+ //---------------------------------------------------------------------
+ class close : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempdirectory : $TEMP/tmpdir.
+ createTestDirectory( aTmpName3 );
+ }
+
+ void tearDown( )
+ {
+ // remove a tempdirectory : $TEMP/tmpdir.
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void close_001( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ //close a directory
+ nError2 = testDirectory.close( );
+ //check if directory is opened.
+ sal_Bool bOk = testDirectory.isOpen( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isOpen function: close a directory and check for open",
+ !( sal_True == bOk ) );
+ }
+
+ void close_002( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //close a directory
+ nError1 = testDirectory.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isOpen function: close a not opened directory",
+ ( ::osl::FileBase::E_BADF == nError1 ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( close );
+ CPPUNIT_TEST( close_001 );
+ CPPUNIT_TEST( close_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class close
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC reset()
+ //---------------------------------------------------------------------
+ class reset : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempdirectory : $TEMP/tmpdir.
+ createTestDirectory( aTmpName3 );
+ // create three files : $TEMP/tmpdir/tmpname, $TEMP/tmpdir/tmpdir, $TEMP/tmpdir/hiddenfile,
+ createTestFile( aTmpName3, aTmpName2);
+ createTestFile( aTmpName3, aTmpName1);
+ createTestFile( aTmpName3, aHidURL1);
+ }
+
+ void tearDown( )
+ {
+ // remove three files : $TEMP/tmpdir/tmpname, $TEMP/tmpdir/tmpdir, $TEMP/tmpdir/hiddenfile,
+ deleteTestFile( aTmpName3, aHidURL1);
+ deleteTestFile( aTmpName3, aTmpName1);
+ deleteTestFile( aTmpName3, aTmpName2);
+ // remove a tempdirectory : $TEMP/tmpdir.
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void reset_001( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //get first Item
+ nError1 = testDirectory.getNextItem( rItem, 1 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //get second Item
+ //mindy: nError1 = testDirectory.getNextItem( rItem, 0 );
+ //mindy: CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //reset enumeration
+ nError2 = testDirectory.reset( );
+ //get reseted Item, if reset does not work, getNextItem() should return the second Item (aTmpName1)
+ nError1 = testDirectory.getNextItem( rItem, 0 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //check the file name
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ //close a directory
+ nError1 = testDirectory.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ sal_Bool bOK1,bOK2;
+ bOK1 = compareFileName( rFileStatus.getFileName( ), aTmpName2 );
+ bOK2 = compareFileName( rFileStatus.getFileName( ), aHidURL1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for reset function: get two directory item, reset it, then get again, check the filename",
+ ( ::osl::FileBase::E_None == nError2 ) &&
+ ( sal_True == bOK1 || bOK2 ) );
+ }
+
+ void reset_002( )
+ {
+ ::osl::Directory testDirectory( aTmpName6 ); //constructor
+
+ //close a directory
+ nError1 = testDirectory.reset( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for reset function: reset a non existed directory",
+ ( ::osl::FileBase::E_NOENT == nError1 ) );
+ }
+
+
+ void reset_003( )
+ {
+ ::osl::Directory testDirectory( aTmpName4 ); //constructor
+
+ //close a directory
+ nError1 = testDirectory.reset( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for reset function: reset a file instead of a directory",
+ ( ::osl::FileBase::E_NOTDIR == nError1 ) || ( ::osl::FileBase::E_NOENT == nError1 ) );
+ }
+
+ void reset_004( )
+ {
+ ::osl::Directory testDirectory( aUserDirectorySys ); //constructor
+
+ //close a directory
+ nError1 = testDirectory.reset( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for reset function: use a system path",
+ ( ::osl::FileBase::E_INVAL == nError1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( reset );
+ CPPUNIT_TEST( reset_001 );
+ CPPUNIT_TEST( reset_002 );
+ CPPUNIT_TEST( reset_003 );
+ CPPUNIT_TEST( reset_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class reset
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline RC getNextItem( DirectoryItem& rItem, sal_uInt32 nHint = 0 )
+ //---------------------------------------------------------------------
+ class getNextItem : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+ ::osl::DirectoryItem rItem;
+
+ public:
+ // initialization
+ void setUp( )
+ {
+ // create a tempdirectory : $TEMP/tmpdir.
+ createTestDirectory( aTmpName3 );
+ // create three files : $TEMP/tmpdir/tmpname, $TEMP/tmpdir/tmpdir, $TEMP/tmpdir/hiddenfile,
+ createTestFile( aTmpName3, aTmpName2 );
+ createTestFile( aTmpName3, aTmpName1 );
+ createTestFile( aTmpName3, aHidURL1 );
+
+ }
+
+ void tearDown( )
+ {
+ // remove three files : $TEMP/tmpdir/tmpname, $TEMP/tmpdir/tmpdir, $TEMP/tmpdir/hiddenfile,
+ deleteTestFile( aTmpName3, aHidURL1 );
+ deleteTestFile( aTmpName3, aTmpName1 );
+ deleteTestFile( aTmpName3, aTmpName2 );
+ // remove a tempdirectory : $TEMP/tmpdir.
+ deleteTestDirectory( aTmpName3 );
+ }
+
+ // test code.
+ void getNextItem_001( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ //check the file name
+ ::rtl::OUString strFilename;
+ sal_Bool bOk1 = sal_False;
+ sal_Bool bOk2 = sal_False;
+ sal_Bool bOk3 = sal_False;
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName );
+ for ( int nCount = 0; nCount < 3; nCount++ )
+ {
+ //get three Items
+ nError1 = testDirectory.getNextItem( rItem, 2 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ nError1 = rItem.getFileStatus( rFileStatus );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ switch ( nCount )
+ {
+ case 0: bOk1 = compareFileName( rFileStatus.getFileName( ), aTmpName2 ) || compareFileName( rFileStatus.getFileName( ), aHidURL1);
+ break;
+ case 1: bOk2 = compareFileName( rFileStatus.getFileName( ), aTmpName1 );
+ break;
+ case 2: bOk3 = compareFileName( rFileStatus.getFileName( ), aHidURL1) || compareFileName( rFileStatus.getFileName( ), aTmpName2 );
+ }
+ }
+
+ //close a directory
+ nError1 = testDirectory.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getNextItem function: retrive three items and check their names.",
+ ( sal_True == bOk1 ) && ( sal_True == bOk2 ) && ( sal_True == bOk3 ) );
+ }
+
+ void getNextItem_002( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+ nError1 = testDirectory.getNextItem( rItem );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getNextItem function: retrive an item in a directory which is not opened, also test for nHint's default value.",
+ ( ::osl::FileBase::E_INVAL == nError1 ) );
+ }
+
+ void getNextItem_003( )
+ {
+ ::osl::Directory testDirectory( aTmpName3 ); //constructor
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ for ( int nCount = 0; nCount < 4; nCount++ )
+ {
+ nError2 = testDirectory.getNextItem( rItem, 3 );
+ }
+
+ //close a directory
+ nError1 = testDirectory.close( );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getNextItem function: retrive 4 times in a directory which contain only 3 files.",
+ ( ::osl::FileBase::E_NOENT == nError2 ) );
+ }
+
+ void getNextItem_004( )
+ {
+ //create a link file(can not on Windows), then check if getNextItem can get it.
+#ifdef UNX
+ sal_Bool bOK = sal_False;
+ ::rtl::OUString aUStr_LnkFileSys( aTempDirectorySys ), aUStr_SrcFileSys( aTempDirectorySys );
+ ( ( aUStr_LnkFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/tmpdir/link.file");
+ ( ( aUStr_SrcFileSys += aSlashURL ) += getCurrentPID( ) ) += ::rtl::OUString::createFromAscii("/tmpdir/tmpname");
+ rtl::OString strLinkFileName, strSrcFileName;
+ strLinkFileName = OUStringToOString( aUStr_LnkFileSys, RTL_TEXTENCODING_ASCII_US );
+ strSrcFileName = OUStringToOString( aUStr_SrcFileSys, RTL_TEXTENCODING_ASCII_US );
+
+ //create a link file and link it to file "/tmp/PID/tmpdir/tmpname"
+ sal_Int32 fd = symlink( strSrcFileName.getStr(), strLinkFileName.getStr() );
+ CPPUNIT_ASSERT( fd == 0 );
+ ::osl::Directory testDirectory( aTmpName3 );
+
+ //open a directory
+ nError1 = testDirectory.open( );
+ ::rtl::OUString aFileName = ::rtl::OUString::createFromAscii("link.file");
+
+ while (1) {
+ nError1 = testDirectory.getNextItem( rItem, 4 );
+ if (::osl::FileBase::E_None == nError1) {
+ ::osl::FileStatus rFileStatus( FileStatusMask_FileName | FileStatusMask_Type );
+ rItem.getFileStatus( rFileStatus );
+ if ( compareFileName( rFileStatus.getFileName( ), aFileName) == sal_True )
+ {
+ if ( FileStatus::Link == rFileStatus.getFileType( ))
+ {
+ bOK = sal_True;
+ break;
+ }
+ }
+ }
+ else
+ break;
+ };
+ fd = std::remove( strLinkFileName.getStr() );
+ CPPUNIT_ASSERT_MESSAGE( "remove link file failed", fd == 0 );
+ CPPUNIT_ASSERT_MESSAGE( "test for getNextItem function: check if can retrieve the link file name",
+ ( bOK == sal_True ) );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( getNextItem );
+ CPPUNIT_TEST( getNextItem_001 );
+ CPPUNIT_TEST( getNextItem_002 );
+ CPPUNIT_TEST( getNextItem_003 );
+ CPPUNIT_TEST( getNextItem_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getNextItem
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC getVolumeInfo( const ::rtl::OUString& ustrDirectoryURL, VolumeInfo& rInfo )
+ //---------------------------------------------------------------------
+ class getVolumeInfo : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+
+ // test code.
+ void checkValidMask(osl::VolumeInfo const& _aVolumeInfo, sal_Int32 _nMask)
+ {
+ if (_nMask == VolumeInfoMask_FileSystemName)
+ {
+ //get file system name
+ ::rtl::OUString aFileSysName( aNullURL );
+ aFileSysName = _aVolumeInfo.getFileSystemName( );
+
+ sal_Bool bRes2 = compareFileName( aFileSysName, aNullURL );
+ CPPUNIT_ASSERT_MESSAGE( "test for getVolumeInfo function: getVolumeInfo of root directory.",
+ ( osl::FileBase::E_None == nError1 ) &&
+ ( sal_False == bRes2 ) );
+ }
+ if (_nMask == VolumeInfoMask_Attributes)
+ {
+ sal_Bool b1 = _aVolumeInfo.getRemoteFlag();
+ sal_Bool b2 = _aVolumeInfo.getRemoveableFlag();
+ sal_Bool b3 = _aVolumeInfo.getCompactDiscFlag();
+ sal_Bool b4 = _aVolumeInfo.getFloppyDiskFlag();
+ sal_Bool b5 = _aVolumeInfo.getFixedDiskFlag();
+ sal_Bool b6 = _aVolumeInfo.getRAMDiskFlag();
+
+ rtl::OString sAttr;
+ if (b1) sAttr = "Remote";
+ if (b2) sAttr += " Removeable";
+ if (b3) sAttr += " CDROM";
+ if (b4) sAttr += " Floppy";
+ if (b5) sAttr += " FixedDisk";
+ if (b6) sAttr += " RAMDisk";
+
+ t_print("Attributes: %s\n", sAttr.getStr() );
+ }
+ if (_nMask == VolumeInfoMask_TotalSpace)
+ {
+ // within Linux, df / * 1024 bytes is the result
+ sal_uInt64 nSize = _aVolumeInfo.getTotalSpace();
+ t_print("Total space: %lld\n", nSize);
+ }
+ if (_nMask == VolumeInfoMask_UsedSpace)
+ {
+ sal_uInt64 nSize = _aVolumeInfo.getUsedSpace();
+ t_print(" Used space: %lld\n", nSize);
+ }
+ if (_nMask == VolumeInfoMask_FreeSpace)
+ {
+ sal_uInt64 nSize = _aVolumeInfo.getFreeSpace();
+ t_print(" Free space: %lld\n", nSize);
+ }
+ if (_nMask == VolumeInfoMask_MaxNameLength)
+ {
+ sal_uInt32 nLength = _aVolumeInfo.getMaxNameLength();
+ t_print("max name length: %ld\n", nLength);
+ }
+ if (_nMask == VolumeInfoMask_MaxPathLength)
+ {
+ sal_uInt32 nLength = _aVolumeInfo.getMaxPathLength();
+ t_print("max path length: %ld\n", nLength);
+ }
+ if (_nMask == VolumeInfoMask_FileSystemCaseHandling)
+ {
+ bool bIsCase = _aVolumeInfo.isCaseSensitiveFileSystem();
+ t_print("filesystem case sensitive: %s\n", bIsCase ? "yes" : "no");
+ }
+ }
+
+ void checkVolumeInfo(sal_Int32 _nMask)
+ {
+ ::osl::VolumeInfo aVolumeInfo( _nMask );
+ //call getVolumeInfo here
+ nError1 = ::osl::Directory::getVolumeInfo( aVolURL1, aVolumeInfo );
+ // LLA: IMHO it's not a bug, if VolumeInfo is not valid, it's a feature
+ // LLA: CPPUNIT_ASSERT_MESSAGE("mask is not valid", sal_True == aVolumeInfo.isValid( _nMask ) );
+ if (aVolumeInfo.isValid( _nMask))
+ {
+ checkValidMask(aVolumeInfo, _nMask);
+ }
+ }
+
+
+ void getVolumeInfo_001_1( )
+ {
+ sal_Int32 mask = VolumeInfoMask_FileSystemName;
+ checkVolumeInfo(mask);
+ }
+ void getVolumeInfo_001_2( )
+ {
+ sal_Int32 mask = VolumeInfoMask_Attributes;
+ checkVolumeInfo(mask);
+ }
+ void getVolumeInfo_001_3( )
+ {
+ sal_Int32 mask = VolumeInfoMask_TotalSpace;
+ checkVolumeInfo(mask);
+ }
+ void getVolumeInfo_001_4( )
+ {
+ sal_Int32 mask = VolumeInfoMask_UsedSpace;
+ checkVolumeInfo(mask);
+ }
+ void getVolumeInfo_001_5( )
+ {
+ sal_Int32 mask = VolumeInfoMask_FreeSpace;
+ checkVolumeInfo(mask);
+ }
+ void getVolumeInfo_001_6( )
+ {
+ sal_Int32 mask = VolumeInfoMask_MaxNameLength;
+ checkVolumeInfo(mask);
+ }
+ void getVolumeInfo_001_7( )
+ {
+ sal_Int32 mask = VolumeInfoMask_MaxPathLength;
+ checkVolumeInfo(mask);
+ }
+ void getVolumeInfo_001_8( )
+ {
+ sal_Int32 mask = VolumeInfoMask_FileSystemCaseHandling;
+ checkVolumeInfo(mask);
+ }
+
+ void getVolumeInfo_002( )
+ {
+ sal_Int32 mask = VolumeInfoMask_FileSystemName;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ //call getVolumeInfo here
+
+ // LLA: rtl::OUString aRootSysURL;
+ // LLA: nError1 = osl::File::getFileURLFromSystemPath(aRootSys, aRootSysURL);
+ // LLA:
+ // LLA: CPPUNIT_ASSERT_MESSAGE( "can't convert root path to file url",
+ // LLA: ( osl::FileBase::E_NONE == nError1 ) );
+
+ nError1 = ::osl::Directory::getVolumeInfo( aRootSys, aVolumeInfo );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getVolumeInfo function: use system path as parameter.",
+ ( osl::FileBase::E_INVAL == nError1 ) );
+ }
+
+ void getVolumeInfo_003( )
+ {
+ sal_Int32 mask = VolumeInfoMask_FileSystemName;
+ ::osl::VolumeInfo aVolumeInfo( mask );
+ //call getVolumeInfo here
+ nError1 = ::osl::Directory::getVolumeInfo( aTmpName3, aVolumeInfo );
+
+// LLA: in Windows, it reply no error, it did not pass in (W32).
+#ifdef UNX
+ CPPUNIT_ASSERT_MESSAGE( "test for getVolumeInfo function: non-existence test. ",
+ ( osl::FileBase::E_NOENT == nError1 ) );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( getVolumeInfo );
+ CPPUNIT_TEST( getVolumeInfo_001_1 );
+ CPPUNIT_TEST( getVolumeInfo_001_2 );
+ CPPUNIT_TEST( getVolumeInfo_001_3 );
+ CPPUNIT_TEST( getVolumeInfo_001_4 );
+ CPPUNIT_TEST( getVolumeInfo_001_5 );
+ CPPUNIT_TEST( getVolumeInfo_001_6 );
+ CPPUNIT_TEST( getVolumeInfo_001_7 );
+ CPPUNIT_TEST( getVolumeInfo_001_8 );
+ CPPUNIT_TEST( getVolumeInfo_002 );
+ CPPUNIT_TEST( getVolumeInfo_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class getVolumeInfo
+
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC create( const ::rtl::OUString& ustrDirectoryURL )
+ //---------------------------------------------------------------------
+ class create : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+
+ // test code.
+ void create_001( )
+ {
+ //create directory in $TEMP/tmpdir
+ nError1 = ::osl::Directory::create( aTmpName3 );
+ //check for existence
+ nError2 = ::osl::Directory::create( aTmpName3 );
+ //remove it
+ deleteTestDirectory( aTmpName3 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for create function: create a directory and check its existence.",
+ ( osl::FileBase::E_None == nError1 ) &&
+ ( osl::FileBase::E_EXIST== nError2 ) );
+ }
+
+ void create_002( )
+ {
+ //create directory in /tmpname
+ nError1 = ::osl::Directory::create( aTmpName7 );
+#if defined (WNT )
+ nError1 = osl::FileBase::E_ACCES; /// in Windows, you can create directory in c:/ any way.
+ deleteTestDirectory( aTmpName7 );
+#endif
+
+ CPPUNIT_ASSERT_MESSAGE( "test for create function: create a directory in root for access test.",
+ ( osl::FileBase::E_ACCES == nError1 ) );
+ }
+
+ void create_003( )
+ {
+ //create directory in /tmpname
+ nError1 = ::osl::Directory::create( aSysPath1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for create function: create a directory using system path.",
+ ( osl::FileBase::E_INVAL == nError1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( create );
+ CPPUNIT_TEST( create_001 );
+ CPPUNIT_TEST( create_002 );
+ CPPUNIT_TEST( create_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class create
+
+ //---------------------------------------------------------------------
+ // testing the method
+ // inline static RC remove( const ::rtl::OUString& ustrDirectoryURL )
+ //---------------------------------------------------------------------
+ class remove : public CppUnit::TestFixture
+ {
+ ::osl::FileBase::RC nError1, nError2;
+
+ public:
+
+ // test code.
+ void remove_001( )
+ {
+ //create directory in $TEMP/tmpdir
+ nError1 = ::osl::Directory::create( aTmpName3 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //remove it
+ nError1 = ::osl::Directory::remove( aTmpName3 );
+ //check for existence
+ ::osl::Directory rDirectory( aTmpName3 );
+ nError2 = rDirectory.open( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for remove function: remove a directory and check its existence.",
+ ( osl::FileBase::E_None == nError1 ) &&
+ ( osl::FileBase::E_NOENT == nError2 ) );
+ }
+
+ void remove_002( )
+ {
+ //create directory in $TEMP/tmpdir
+ nError1 = ::osl::Directory::create( aTmpName3 );
+ CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 );
+ //try to remove it by system path
+ nError1 = ::osl::Directory::remove( aSysPath3 );
+ //check for existence
+ ::osl::Directory rDirectory( aTmpName3 );
+ nError2 = rDirectory.open( );
+ if ( osl::FileBase::E_NOENT != nError2 )
+ ::osl::Directory::remove( aTmpName3 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for remove function: remove a directory by its system path, and check its existence.",
+ ( osl::FileBase::E_INVAL == nError1 ) );
+ }
+
+ void remove_003( )
+ {
+ //try to remove a non-existed directory
+ nError1 = ::osl::Directory::remove( aTmpName6 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for remove function: try to remove a non-existed directory.",
+ ( osl::FileBase::E_NOENT == nError1 ) );
+ }
+
+ void remove_004( )
+ {
+ createTestFile( aTmpName6 );
+ sal_Bool bExist = ifFileExist( aTmpName6 );
+ //try to remove file.
+ nError1 = ::osl::Directory::remove( aTmpName6 );
+ deleteTestFile( aTmpName6 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for remove function: try to remove a file but not directory.",
+ bExist == sal_True &&(( osl::FileBase::E_NOTDIR == nError1 ) || ( osl::FileBase::E_NOENT == nError1 )) );
+ }
+
+ void remove_005( )
+ {
+ createTestDirectory( aTmpName3 );
+ createTestFile( aTmpName4 );
+ nError1 = ::osl::Directory::remove( aTmpName3 );
+ deleteTestFile( aTmpName4 );
+ deleteTestDirectory( aTmpName3 );
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii("test for remove function: try to remove a directory that is not empty.") + errorToStr( nError1 );
+#if defined ( SOLARIS )
+ //on UNX, the implementation uses rmdir(), which EEXIST is thrown on Solaris when the directory is not empty, refer to: 'man -s 2 rmdir', while on linux, ENOTEMPTY is thrown.
+ //EEXIST The directory contains entries other than those for "." and "..".
+ t_print("#Solaris test\n");
+ CPPUNIT_ASSERT_MESSAGE( suError, ( osl::FileBase::E_EXIST == nError1 ) );
+#else
+ CPPUNIT_ASSERT_MESSAGE( suError, ( osl::FileBase::E_NOTEMPTY == nError1 ) );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( remove );
+ CPPUNIT_TEST( remove_001 );
+ CPPUNIT_TEST( remove_002 );
+ CPPUNIT_TEST( remove_003 );
+ CPPUNIT_TEST( remove_004 );
+ CPPUNIT_TEST( remove_005 );
+ CPPUNIT_TEST_SUITE_END( );
+ };// class remove
+
+ //########################################
+ // TEST Directory::createPath
+ //########################################
+
+ #ifdef WNT
+ # define PATH_BUFFER_SIZE MAX_PATH
+ #else
+ # define PATH_BUFFER_SIZE PATH_MAX
+ #endif
+
+ char TEST_PATH_POSTFIX[] = "hello/world";
+
+ //########################################
+ OUString get_test_path()
+ {
+ OUString tmp;
+ FileBase::RC rc = FileBase::getTempDirURL(tmp);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Test path creation failed",
+ rc == FileBase::E_None
+ );
+
+ OUStringBuffer b(tmp);
+ if (tmp.lastIndexOf('/') != (tmp.getLength() - 1))
+ b.appendAscii("/");
+
+ b.appendAscii(TEST_PATH_POSTFIX);
+
+ return b.makeStringAndClear();
+ }
+
+ //########################################
+ void rm_test_path(const OUString& path)
+ {
+ sal_Unicode buffer[PATH_BUFFER_SIZE];
+ rtl_copyMemory(buffer, path.getStr(), (path.getLength() + 1) * sizeof(sal_Unicode));
+
+ sal_Int32 i = rtl_ustr_lastIndexOfChar(buffer, '/');
+ if (i == path.getLength())
+ buffer[i] = 0;
+
+ Directory::remove(buffer);
+
+ i = rtl_ustr_lastIndexOfChar(buffer, '/');
+ buffer[i] = 0;
+ Directory::remove(buffer);
+ }
+
+ //########################################
+ class DirCreatedObserver : public DirectoryCreationObserver
+ {
+ public:
+ DirCreatedObserver() : i(0)
+ {
+ }
+
+ virtual void DirectoryCreated(const rtl::OUString& /*aDirectoryUrl*/)
+ {
+ i++;
+ };
+
+ int number_of_dirs_created() const
+ {
+ return i;
+ }
+
+ private:
+ int i;
+ };
+
+
+ //########################################
+ class createPath : public CppUnit::TestFixture
+ {
+ public:
+ //##########################################
+ createPath()
+ {}
+
+ //##########################################
+ void with_relative_path()
+ {
+ FileBase::RC rc = Directory::createPath(
+ OUString::createFromAscii(TEST_PATH_POSTFIX));
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createDirectoryPath contract broken",
+ rc == FileBase::E_INVAL
+ );
+ }
+
+ //##########################################
+ void without_callback()
+ {
+ OUString tp_url = get_test_path();
+
+ rm_test_path(tp_url);
+
+ FileBase::RC rc = Directory::createPath(tp_url);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createDirectoryPath failed",
+ rc == FileBase::E_None
+ );
+ }
+
+ //##########################################
+ void with_callback()
+ {
+ OUString tp_url = get_test_path();
+
+ rm_test_path(tp_url);
+
+ DirCreatedObserver* observer = new DirCreatedObserver;
+ FileBase::RC rc = Directory::createPath(tp_url, observer);
+ int nDirs = observer->number_of_dirs_created();
+ delete observer;
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createDirectoryPath failed",
+ (rc == FileBase::E_None) && (nDirs > 0)
+ );
+
+ }
+
+#ifdef WNT
+
+ //##########################################
+ char* get_unused_drive_letter()
+ {
+ static char m_aBuff[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ DWORD ld = GetLogicalDrives();
+ DWORD i = 4;
+ DWORD j = 2;
+
+ while ((ld & i) && (i > 1))
+ { i = i << 1; j++; }
+
+ if (i > 2)
+ return m_aBuff + j;
+
+ return NULL;
+ }
+
+ //##########################################
+ void at_invalid_logical_drive()
+ {
+ char* drv = get_unused_drive_letter();
+ char buff[PATH_BUFFER_SIZE];
+ rtl_zeroMemory(buff, sizeof(buff));
+
+ strncpy(buff, drv, 1);
+ strcat(buff, ":\\");
+ strcat(buff, TEST_PATH_POSTFIX);
+
+ OUString path = OUString::createFromAscii(buff);
+ OUString tp_url;
+ FileBase::getFileURLFromSystemPath(path, tp_url);
+
+ FileBase::RC rc = Directory::createPath(tp_url);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createDirectoryPath doesn't fail on unused logical drive letters",
+ rc != FileBase::E_None
+ );
+ }
+
+ //##########################################
+ void with_UNC_path()
+ {
+
+ OUString tp_unc = OUString::createFromAscii("\\\\Tra-1\\TRA_D\\hello\\world\\");
+ OUString tp_url;
+ FileBase::getFileURLFromSystemPath(tp_unc, tp_url);
+
+ FileBase::RC rc = Directory::createPath(tp_url);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createDirectoryPath fails with UNC path",
+ rc == FileBase::E_None
+ );
+ }
+
+#endif /* WNT */
+
+ CPPUNIT_TEST_SUITE(createPath);
+ CPPUNIT_TEST(with_relative_path);
+ CPPUNIT_TEST(without_callback);
+ CPPUNIT_TEST(with_callback);
+#ifdef WNT
+ CPPUNIT_TEST(at_invalid_logical_drive);
+
+ // adapt the UNC path in method createDirectoryPath_with_UNC_path
+ // in order to run this test successfully
+ //CPPUNIT_TEST(with_UNC_path);
+#endif
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class createPath
+
+ // -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::ctors, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::open, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::isOpen, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::close, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::reset, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::getNextItem, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::getVolumeInfo, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::create, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::remove, "osl_Directory" );
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_Directory::createPath, "osl_Directory" );
+}// namespace osl_Directory
+
+
+// -----------------------------------------------------------------------------
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+// -----------------------------------------------------------------------------
+
+/// NOADDITIONAL;
+
+
+
+/** get Current PID.
+*/
+inline ::rtl::OUString getCurrentPID( )
+{
+ //~ Get current PID and turn it into OUString;
+ int nPID = 0;
+#ifdef WNT
+ nPID = GetCurrentProcessId();
+#else
+ nPID = getpid();
+#endif
+ return ( ::rtl::OUString::valueOf( ( long )nPID ) );
+}
+
+
+/** Insert Current PID to the URL to avoid access violation between multiuser execution.
+*/
+inline void insertPID( ::rtl::OUString & pathname )
+{
+ //~ check if the path contain the temp directory, do nothing changes if not;
+ if ( pathname.indexOf( aTempDirectoryURL ) && pathname.indexOf( aTempDirectorySys ) )
+ return;
+
+ //~ format pathname to TEMP/USERPID/URL style;
+ if ( !pathname.indexOf( aTempDirectoryURL ) )
+ {
+ ::rtl::OUString strPID( getCurrentPID( ) );
+ ::rtl::OUString pathLeft = aTempDirectoryURL.copy( 0 );
+ ::rtl::OUString pathRight = pathname.copy( aTempDirectoryURL.getLength( ) );
+ pathname = pathLeft.copy( 0 );
+ ( ( pathname += aSlashURL ) += strPID ) += pathRight;
+ }
+ else
+ {
+ ::rtl::OUString strPID( getCurrentPID( ) );
+ ::rtl::OUString pathLeft = aTempDirectorySys.copy( 0 );
+ ::rtl::OUString pathRight = pathname.copy( aTempDirectorySys.getLength( ) );
+ pathname = pathLeft.copy( 0 );
+ ( ( pathname += aSlashURL ) += strPID ) += pathRight;
+ }
+
+
+}
+
+/** to do some initialized work, we replace the NOADDITIONAL macro with the initialize work which
+ will check the file and directory existence. and set some variables for test use.
+ to simplify the initialize work, we seperate it into UNIX section and Windows section, the main task
+ of initialization is adapt all URL defined in osl_File_Const.h to TEMP/USERPID/URL style format,
+ since there may be an instance that multiuser execute test at the same time, and the temp file
+ may not be clean up in this case due to access right problem.
+*/
+void RegisterAdditionalFunctions( FktRegFuncPtr _pFunc )
+{
+ (void)_pFunc;
+ t_print( "Initializing..." );
+
+ //~ make sure the c:\temp exist, if not, create it.
+#if ( defined WNT )
+ if ( checkDirectory( aTempDirectoryURL, osl_Check_Mode_Exist ) != sal_True ) {
+ t_print( "\n#C:\\temp is not exist, now creating\n" );
+ createTestDirectory( aTempDirectoryURL );
+ };
+#endif
+
+ //~ make sure the c:\temp\PID or /tmp/PID exist, if not, create it. initialize the user directory.
+ ( aUserDirectoryURL += aSlashURL ) += getCurrentPID( );
+ ( aUserDirectorySys += aSlashURL ) += getCurrentPID( );
+
+ if ( checkDirectory( aUserDirectoryURL, osl_Check_Mode_Exist ) != sal_True ) {
+ createTestDirectory( aUserDirectoryURL );
+ }
+
+ //~ adapt all URL to the TEMP/USERPID/URL format;
+ insertPID( aCanURL1 );
+ insertPID( aTmpName3 );
+ insertPID( aTmpName4 );
+ insertPID( aTmpName5 );
+ insertPID( aTmpName6 );
+ insertPID( aTmpName8 );
+ insertPID( aTmpName9 );
+ insertPID( aLnkURL1 );
+ insertPID( aFifoSys );
+ insertPID( aSysPath1 );
+ insertPID( aSysPath2 );
+ insertPID( aSysPath3 );
+ insertPID( aSysPath4 );
+
+ t_print( "Done.\n" );
+
+}
+
+
+//~ do some clean up work after all test completed.
+class GlobalObject
+{
+ public:
+ ~GlobalObject()
+ {
+ try
+ {
+ //~ make sure the c:\temp\PID or /tmp/PID exist, if yes, delete it.
+ t_print( "\n#Do some clean-ups ...\n" );
+ if ( checkDirectory( aUserDirectoryURL, osl_Check_Mode_Exist ) == sal_True ) {
+ deleteTestDirectory( aUserDirectoryURL );
+ }
+
+ // LLA: t_print("after deleteTestDirectory\n");
+ //~ special clean up task in Windows and Unix seperately;
+#if ( defined UNX ) || ( defined OS2 )
+ //~ some clean up task for UNIX OS
+ ;
+#else
+ //~ some clean up task for Windows OS
+ //~ check if some files are in the way, remove them if necessary.
+ if ( ifFileExist( aTmpName6 ) == sal_True )
+ deleteTestFile( aTmpName6 );
+ if ( ifFileExist( aTmpName4 ) == sal_True )
+ deleteTestFile( aTmpName4 );
+ if ( checkDirectory( aTmpName4, osl_Check_Mode_Exist ) == sal_True )
+ deleteTestDirectory( aTmpName4 );
+ if ( ifFileExist( aTmpName3 ) == sal_True )
+ deleteTestFile( aTmpName3 );
+ if ( checkDirectory( aTmpName3, osl_Check_Mode_Exist ) == sal_True )
+ deleteTestDirectory( aTmpName3 );
+
+ ::rtl::OUString aUStr( aUserDirectoryURL );
+ concatURL( aUStr, aHidURL1 );
+ if ( ifFileExist( aUStr ) == sal_True )
+ deleteTestFile( aUStr );
+
+ ::rtl::OUString aUStr1( aRootURL );
+ concatURL( aUStr1, aTmpName2 );
+ if ( ifFileExist( aUStr1 ) == sal_True )
+ deleteTestFile( aUStr1 );
+#endif
+
+ }
+ catch (CppUnit::Exception &e)
+ {
+ t_print("Exception caught in GlobalObject dtor(). Exception message: '%s'. Source line: %d\n", e.what(), e.sourceLine().lineNumber());
+ }
+ catch (...)
+ {
+ t_print("Exception caught (...) in GlobalObject dtor()\n");
+ }
+ }
+};
+
+GlobalObject theGlobalObject;
diff --git a/sal/qa/osl/file/osl_File_Const.h b/sal/qa/osl/file/osl_File_Const.h
new file mode 100644
index 000000000000..7072b6ea6b11
--- /dev/null
+++ b/sal/qa/osl/file/osl_File_Const.h
@@ -0,0 +1,242 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _OSL_FILE_CONST_H_
+#define _OSL_FILE_CONST_H_
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sal/types.h>
+#include <rtl/textenc.h>
+
+#include <rtl/ustring.hxx>
+#include <rtl/uri.hxx>
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+
+//------------------------------------------------------------------------
+// common used string resource
+// these common used string will be used as assist resource in test
+// they are mostly OS independent, some of the resource can be reused
+// so, acommon test data repository will be better since it can be
+// shared among all test code
+//------------------------------------------------------------------------
+
+const sal_Char pBuffer_Char[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+const sal_Char pBuffer_Number[] = "1234567890";
+const sal_Char pBuffer_Blank[] = "";
+
+#define TRUNC_LEN 10;
+#define ENLARG_LEN 100;
+
+
+
+//------------------------------------------------------------------------
+// OS dependent/independent definitions/includes
+// we use FILE_PREFIX for URL prefix,
+// TEST_PLATFORM for test platform initial,
+// TEST_PLATFORM_ROOT for root dir in comrresponding platform,
+// TEST_PLATFORM_TEMP for temp dir in comrresponding platform,
+// PATH_LIST_DELIMITER for seperator of path list in comrresponding platform,
+// PATH_SEPERATOR for seperator in URL or system path in comrresponding platform,
+// PATH_MAX/MAX_PATH for max path length in comrresponding platform,
+//------------------------------------------------------------------------
+
+//------------------------------------------------------------------------
+// OS independent const definition
+//------------------------------------------------------------------------
+# define FILE_PREFIX "file:///"
+# define TEST_FILE_SIZE 1024
+
+//------------------------------------------------------------------------
+// OS dependent declaration and includes
+//------------------------------------------------------------------------
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+# include <unistd.h>
+# include <limits.h>
+# include <math.h>
+# include <errno.h>
+# include <fcntl.h>
+# include <sys/stat.h>
+# include <sys/statfs.h>
+# include <sys/statvfs.h>
+# include <sys/types.h>
+# define TEST_PLATFORM ""
+# define TEST_PLATFORM_ROOT "/"
+# define TEST_PLATFORM_TEMP "tmp"
+# define PATH_LIST_DELIMITER ":"
+# define PATH_SEPERATOR "/"
+#endif
+#if (defined WNT ) // Windows
+#include <tools/prewin.h>
+// # include <windows.h>
+# include <tchar.h>
+# include <io.h>
+# include <stdio.h>
+# include <stdlib.h>
+#include <tools/postwin.h>
+# define PATH_MAX MAX_PATH
+# define TEST_PLATFORM "c:/"
+# define TEST_PLATFORM_ROOT "c:/"
+# define TEST_PLATFORM_TEMP "temp"
+# define PATH_LIST_DELIMITER ";"
+# define PATH_SEPERATOR "/"
+#endif
+
+
+//------------------------------------------------------------------------
+// macro definition for the ASCII array/OUString declarations,
+// we use p### for the ASCII array,
+// a### for the OUString,
+// n###Len for its length
+//------------------------------------------------------------------------
+
+#define OSLTEST_DECLARE( str_name, str_value ) \
+ ::rtl::OUString a##str_name = rtl::OUString::createFromAscii( ( str_value ) )
+
+#define OSLTEST_DECLARE_UTF8(str_name, str_value ) \
+ ::rtl::OUString a##str_name = ::rtl::Uri::decode( ::rtl::OUString::createFromAscii( ( str_value ) ), rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8)
+
+//------------------------------------------------------------------------
+// OS independent file definition
+//------------------------------------------------------------------------
+OSLTEST_DECLARE( NullURL, "" );
+OSLTEST_DECLARE( SlashURL, PATH_SEPERATOR );
+OSLTEST_DECLARE( PreURL, FILE_PREFIX );
+OSLTEST_DECLARE( RootURL, FILE_PREFIX TEST_PLATFORM );
+
+OSLTEST_DECLARE( TempDirectoryURL, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP );
+OSLTEST_DECLARE( TempDirectorySys, TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP );
+OSLTEST_DECLARE( UserDirectoryURL, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "" );
+OSLTEST_DECLARE( UserDirectorySys, TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP "" );
+
+//------------------------------------------------------------------------
+// common used URL:temp, canonical, root, relative, link,etc
+//------------------------------------------------------------------------
+OSLTEST_DECLARE( CanURL1, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/canonical.name" );
+OSLTEST_DECLARE( CanURL2, "ca@#;+.,$///78no\0ni..name" );
+OSLTEST_DECLARE( CanURL3, "ca@#;+.,$//tmp/678nonical//name" );
+OSLTEST_DECLARE( CanURL4, "canonical.name" );
+OSLTEST_DECLARE( TmpName1, "tmpdir" );
+OSLTEST_DECLARE( TmpName2, "tmpname" );
+OSLTEST_DECLARE( TmpName3, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/tmpdir" );
+OSLTEST_DECLARE( TmpName4, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/tmpdir/tmpname" );
+OSLTEST_DECLARE( TmpName5, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/tmpdir/../tmpdir/./tmpname" );
+OSLTEST_DECLARE( TmpName6, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/tmpname" );
+OSLTEST_DECLARE( TmpName7, FILE_PREFIX TEST_PLATFORM "tmpname" );
+OSLTEST_DECLARE( TmpName8, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/tmpname/tmpdir" );
+OSLTEST_DECLARE( TmpName9, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/tmpdir/../tmpdir/./" );
+OSLTEST_DECLARE_UTF8( TmpName10, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/%E6%9C%AA%E5%91%BD%E5%90%8Dzhgb18030" );
+
+OSLTEST_DECLARE( RelURL1, "relative/file1" );
+OSLTEST_DECLARE( RelURL2, "relative/./file2" );
+OSLTEST_DECLARE( RelURL3, "relative/../file3" );
+OSLTEST_DECLARE( RelURL4, "././relative/../file4" );
+OSLTEST_DECLARE( RelURL5, TEST_PLATFORM_TEMP "/./../" TEST_PLATFORM_TEMP );
+OSLTEST_DECLARE( LnkURL1, FILE_PREFIX TEST_PLATFORM TEST_PLATFORM_TEMP "/link.file" );
+OSLTEST_DECLARE( HidURL1, ".hiddenfile" );
+
+//------------------------------------------------------------------------
+// common used System Path:temp, root,etc
+//------------------------------------------------------------------------
+OSLTEST_DECLARE( RootSys, TEST_PLATFORM_ROOT );
+OSLTEST_DECLARE( SysPath1, TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP "/system.path" );
+OSLTEST_DECLARE( SysPath2, TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP "/system/path" );
+OSLTEST_DECLARE( SysPath3, TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP "/tmpdir" );
+OSLTEST_DECLARE( SysPath4, TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP "/tmpname" );
+OSLTEST_DECLARE_UTF8( SysPath5, TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP "/%E6%9C%AA%E5%91%BD%E5%90%8Dzhgb18030" );
+OSLTEST_DECLARE( FifoSys, TEST_PLATFORM_ROOT TEST_PLATFORM_TEMP "/tmpdir/fifo" );
+
+//------------------------------------------------------------------------
+// FileType URL, we pick some canonical file in corresponding system for test:
+// socket, link, etc.
+// Note that this may be changed in the different platform, so be careful to use.
+//------------------------------------------------------------------------
+#if ( defined UNX ) || ( defined OS2 ) // Unix
+OSLTEST_DECLARE( TypeURL1, FILE_PREFIX "dev/ccv"); //socket Solaris/Linux
+OSLTEST_DECLARE( TypeURL2, FILE_PREFIX "devices/pseudo/tcp@0:tcp"); //special Solaris/Linux
+OSLTEST_DECLARE( TypeURL3, FILE_PREFIX "lib" ); //link Solaris
+#else // Windows
+OSLTEST_DECLARE( TypeURL1, FILE_PREFIX "" );
+OSLTEST_DECLARE( TypeURL2, FILE_PREFIX "" );
+OSLTEST_DECLARE( TypeURL3, FILE_PREFIX "" );
+#endif
+
+//------------------------------------------------------------------------
+// Volume device URL, we pick some canonical volume device for test:
+// UNIX file system, Floppy Disk, Proc file system, Temp file system, Compact Disk.
+//------------------------------------------------------------------------
+#if ( defined UNX ) || ( defined OS2 ) // Unix
+OSLTEST_DECLARE( VolURL1, FILE_PREFIX ""); //ufs Solaris/Linux
+#ifdef SOLARIS
+OSLTEST_DECLARE( VolURL2, FILE_PREFIX "dev/fd" ); //fd Solaris
+#else
+OSLTEST_DECLARE( VolURL2, FILE_PREFIX "dev/floppy/0u1440" ); //fd0 Linux
+#endif
+OSLTEST_DECLARE( VolURL3, FILE_PREFIX "proc" ); //proc Solaris/Linux
+OSLTEST_DECLARE( VolURL4, FILE_PREFIX "staroffice" ); //nfs Solaris/Linux
+OSLTEST_DECLARE( VolURL5, FILE_PREFIX "tmp" ); //tmpfs Solaris
+OSLTEST_DECLARE( VolURL6, FILE_PREFIX "cdrom" ); //cd Solaris
+#else // Windows
+OSLTEST_DECLARE( VolURL1, FILE_PREFIX "c:/" );
+OSLTEST_DECLARE( VolURL2, FILE_PREFIX "a:/" );
+OSLTEST_DECLARE( VolURL3, FILE_PREFIX "" );
+OSLTEST_DECLARE( VolURL4, FILE_PREFIX "" );
+OSLTEST_DECLARE( VolURL5, FILE_PREFIX "c:/temp" );
+OSLTEST_DECLARE( VolURL6, FILE_PREFIX "e:/" );
+#endif
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+}
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+#endif /* _OSL_FILE_CONST_H_ */
diff --git a/sal/qa/osl/file/osl_old_test_file.cxx b/sal/qa/osl/file/osl_old_test_file.cxx
new file mode 100644
index 000000000000..674e685449be
--- /dev/null
+++ b/sal/qa/osl/file/osl_old_test_file.cxx
@@ -0,0 +1,273 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+// LLA:
+// this file is converted to use with testshl2
+// original was placed in sal/test/textenc.cxx
+
+#include <stdio.h>
+
+#include <osl/file.h>
+#include <osl/process.h>
+#include <rtl/ustring.hxx>
+#ifdef SAL_UNX
+#include <unistd.h>
+#include <limits.h>
+#include <string.h>
+#include <sys/stat.h>
+#define TEST_VOLUME ""
+#else
+// WINDOWS
+#define TEST_VOLUME "c:/"
+#endif
+
+#include <testshl/simpleheader.hxx>
+
+namespace osl_test_file
+{
+
+// -----------------------------------------------------------------------------
+
+class oldtestfile : public CppUnit::TestFixture
+{
+public:
+ void test_file_001();
+ void test_file_002();
+ void test_file_003();
+ void test_file_004();
+
+ CPPUNIT_TEST_SUITE( oldtestfile );
+ CPPUNIT_TEST( test_file_001 );
+ CPPUNIT_TEST( test_file_002 );
+ CPPUNIT_TEST( test_file_003 );
+ CPPUNIT_TEST( test_file_004 );
+ CPPUNIT_TEST_SUITE_END( );
+};
+
+char *aSource1[] =
+{
+ "a" , "file:///" TEST_VOLUME "bla/a",
+ "a/" , "file:///" TEST_VOLUME "bla/a",
+ "../a" , "file:///" TEST_VOLUME "a" ,
+ "a/.." , "file:///" TEST_VOLUME "bla",
+ "a/../b" , "file:///" TEST_VOLUME "bla/b",
+ ".." , "file:///" TEST_VOLUME "",
+ "a/b/c/d/" , "file:///" TEST_VOLUME "bla/a/b/c/d",
+ "a/./c" , "file:///" TEST_VOLUME "bla/a/c",
+ "file:///bla/blub", "file:///" TEST_VOLUME "bla/blub",
+ 0 , 0
+};
+
+char *aSource2[ ] =
+{
+ "a" , "file:///" TEST_VOLUME "bla/blubs/schnubbel/a",
+ "a/", "file:///" TEST_VOLUME "bla/blubs/schnubbel/a",
+ "../a", "file:///" TEST_VOLUME "bla/blubs/a",
+ "../../a", "file:///" TEST_VOLUME "bla/a",
+ "../../../a", "file:///" TEST_VOLUME "a",
+ "../../../a/b/c/d", "file:///" TEST_VOLUME "a/b/c/d",
+ 0,0
+};
+
+char *aSource3[ ] =
+{
+ ".." , "/a",
+ "../a" , "/a/a",
+ "e/f" , "/c/e/f",
+ "../..", "",
+ 0,0
+};
+
+using namespace rtl;
+
+void oldtestfile::test_file_001()
+{
+#ifdef WIN32
+ return;
+#endif
+
+ OUString base1( RTL_CONSTASCII_USTRINGPARAM( "file:///" TEST_VOLUME "bla" ) );
+ int i;
+ for( i = 0 ; aSource1[i] ; i +=2 )
+ {
+ OUString target;
+ OUString rel = OUString::createFromAscii( aSource1[i] );
+ oslFileError e = osl_getAbsoluteFileURL( base1.pData, rel.pData , &target.pData );
+ CPPUNIT_ASSERT_MESSAGE("failure #1", osl_File_E_None == e );
+ if( osl_File_E_None == e )
+ {
+ CPPUNIT_ASSERT_MESSAGE("failure #1.1", target.equalsAscii( aSource1[i+1] ) );
+ }
+ OString o = OUStringToOString( target , RTL_TEXTENCODING_ASCII_US );
+ OString obase = OUStringToOString( base1 , RTL_TEXTENCODING_ASCII_US );
+ fprintf( stderr, "%d %s + %s = %s\n" ,e, obase.getStr(), aSource1[i], o.pData->buffer );
+ }
+
+ OUString err1( RTL_CONSTASCII_USTRINGPARAM( "../.." ) );
+ OUString target;
+ CPPUNIT_ASSERT_MESSAGE("failure #11", osl_File_E_None != osl_getAbsoluteFileURL( base1.pData , err1.pData , &target.pData ) );
+
+}
+
+void oldtestfile::test_file_002()
+{
+#ifdef WIN32
+ return;
+#endif
+
+ OUString base2( RTL_CONSTASCII_USTRINGPARAM( "file:///" TEST_VOLUME "bla/blubs/schnubbel" ) );
+ int i;
+ for( i = 0 ; aSource2[i] ; i +=2 )
+ {
+ OUString target;
+ OUString rel = OUString::createFromAscii( aSource2[i] );
+ oslFileError e = osl_getAbsoluteFileURL( base2.pData, rel.pData , &target.pData );
+ CPPUNIT_ASSERT_MESSAGE("failure #2", osl_File_E_None == e );
+ if( osl_File_E_None == e )
+ {
+ CPPUNIT_ASSERT_MESSAGE("failure #2.1", target.equalsAscii( aSource2[i+1] ) );
+ }
+ OString o = OUStringToOString( target , RTL_TEXTENCODING_ASCII_US );
+ OString obase = OUStringToOString( base2 , RTL_TEXTENCODING_ASCII_US );
+// fprintf( stderr, "%d %s + %s = %s\n" ,e, obase.getStr(), aSource2[i], o.pData->buffer );
+ }
+}
+
+void oldtestfile::test_file_003()
+{
+#ifdef WIN32
+ return;
+#endif
+
+ // links !
+#ifdef UNX
+ int i;
+ char buf[PATH_MAX];
+ if( getcwd( buf, PATH_MAX ) )
+ {
+ char buf2[PATH_MAX];
+ strcpy( buf2 , buf );
+ strcat( buf2, "/a" );
+
+ if( 0 == mkdir( buf2 , S_IRWXG | S_IRWXO | S_IRWXU ) )
+ {
+ strcat( buf2, "/b" );
+ if( 0 == mkdir( buf2, S_IRWXU | S_IRWXO | S_IRWXU ) )
+ {
+ if( 0 == symlink( buf2 , "c" ) )
+ {
+ OUString dir;
+ osl_getProcessWorkingDir( &(dir.pData) );
+
+ OUString base3 = dir;
+ base3 += OUString( RTL_CONSTASCII_USTRINGPARAM( "/c" ) );
+ for( i = 0 ; aSource3[i] ; i +=2 )
+ {
+ OUString target;
+ OUString rel = OUString::createFromAscii( aSource3[i] );
+ oslFileError e = osl_getAbsoluteFileURL( base3.pData, rel.pData , &target.pData );
+ CPPUNIT_ASSERT_MESSAGE("failure #3", osl_File_E_None == e );
+ if( osl_File_E_None == e )
+ {
+ CPPUNIT_ASSERT_MESSAGE("failure #4", target.getLength() >= dir.getLength() );
+ if( target.getLength() >= dir.getLength() )
+ {
+ int j;
+ for( j = dir.getLength() ;
+ j < target.getLength() &&
+ aSource3[i+1][j-dir.getLength()] == target[j] ; j++ );
+ CPPUNIT_ASSERT_MESSAGE("failure #5", j == target.getLength() );
+ }
+ }
+ OString o = OUStringToOString( target , RTL_TEXTENCODING_ASCII_US );
+ OString obase = OUStringToOString( base3 , RTL_TEXTENCODING_ASCII_US );
+ fprintf( stderr, "%d %s + %s = %s\n" ,e, obase.getStr(), aSource3[i], o.pData->buffer );
+ }
+ unlink( "c" );
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE("failure #6", 0 );
+ }
+ rmdir( "a/b" );
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE("failure #7", 0 );
+ }
+ rmdir( "a" );
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE("failure #8", 0 );
+ }
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE("failure #9", 0 );
+ }
+#endif
+}
+
+void oldtestfile::test_file_004()
+{
+#ifdef WIN32
+ return;
+#endif
+
+ OUString base4( RTL_CONSTASCII_USTRINGPARAM( "file:///" TEST_VOLUME "bla/" ) );
+ int i;
+ for( i = 0 ; aSource1[i] ; i +=2 )
+ {
+ OUString target;
+ OUString rel = OUString::createFromAscii( aSource1[i] );
+ oslFileError e = osl_getAbsoluteFileURL( base4.pData, rel.pData , &target.pData );
+ CPPUNIT_ASSERT_MESSAGE("failure #10", osl_File_E_None == e );
+ if( osl_File_E_None == e )
+ {
+ CPPUNIT_ASSERT_MESSAGE("failure #10.1", target.equalsAscii( aSource1[i+1] ) );
+ }
+ OString o = OUStringToOString( target , RTL_TEXTENCODING_ASCII_US );
+ OString obase = OUStringToOString( base4 , RTL_TEXTENCODING_ASCII_US );
+ fprintf( stderr, "%d %s + %s = %s\n" ,e, obase.getStr(), aSource1[i], o.pData->buffer );
+ }
+
+
+// fprintf( stderr, "test_file done\n" );
+}
+
+} // namespace osl_test_file
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_test_file::oldtestfile, "osl_File" );
+
+// -----------------------------------------------------------------------------
+NOADDITIONAL;
+
diff --git a/sal/qa/osl/file/test_cpy_wrt_file.cxx b/sal/qa/osl/file/test_cpy_wrt_file.cxx
new file mode 100755
index 000000000000..3bd5ac4cd6d1
--- /dev/null
+++ b/sal/qa/osl/file/test_cpy_wrt_file.cxx
@@ -0,0 +1,111 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <testshl/simpleheader.hxx>
+#include <osl/file.hxx>
+#include <osl/thread.h>
+#include <rtl/ustring.hxx>
+
+using namespace osl;
+using namespace rtl;
+
+//########################################
+#ifdef UNX
+# define COPY_SOURCE_PATH "/home/tr109510/ucbhelper.cxx"
+# define COPY_DEST_PATH "/mnt/mercury08/ucbhelper.cxx"
+#else /* if WNT */
+# define COPY_SOURCE_PATH "d:\\msvcr70.dll"
+# define COPY_DEST_PATH "x:\\tra\\msvcr70.dll"
+#endif
+
+class test_osl_copyFile : public CppUnit::TestFixture
+{
+public:
+ void cp_file()
+ {
+ rtl::OUString src_url;
+ FileBase::getFileURLFromSystemPath(rtl::OUString::createFromAscii(COPY_SOURCE_PATH), src_url);
+
+ rtl::OUString dest_url;
+ FileBase::getFileURLFromSystemPath(rtl::OUString::createFromAscii(COPY_DEST_PATH), dest_url);
+
+ FileBase::RC err = File::copy(src_url, dest_url);
+ CPPUNIT_ASSERT_MESSAGE("Copy didn't recognized disk full", err != FileBase::E_None);
+ }
+
+ CPPUNIT_TEST_SUITE(test_osl_copyFile);
+ CPPUNIT_TEST(cp_file);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+//########################################
+#ifdef UNX
+# define WRITE_DEST_PATH "/mnt/mercury08/muell.tmp"
+#else /* if WNT */
+# define WRITE_DEST_PATH "d:\\tmp_data.tmp"
+#endif
+
+class test_osl_writeFile : public CppUnit::TestFixture
+{
+public:
+ void wrt_file()
+ {
+ rtl::OUString dest_url;
+ FileBase::getFileURLFromSystemPath(rtl::OUString::createFromAscii(WRITE_DEST_PATH), dest_url);
+
+ File tmp_file(dest_url);
+ rtl::OUString suErrorMsg = rtl::OUString::createFromAscii("File creation failed: ")+ dest_url;
+ FileBase::RC err = tmp_file.open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Create);
+
+ CPPUNIT_ASSERT_MESSAGE( suErrorMsg, err == FileBase::E_None || err == FileBase::E_EXIST );
+
+ char buffer[50000];
+ sal_uInt64 written = 0;
+ err = tmp_file.write((void*)buffer, sizeof(buffer), written);
+
+ err = tmp_file.sync();
+
+ CPPUNIT_ASSERT_MESSAGE("Write didn't recognized disk full", err != FileBase::E_None);
+
+ tmp_file.close();
+ }
+
+ CPPUNIT_TEST_SUITE(test_osl_writeFile);
+ CPPUNIT_TEST(wrt_file);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+//#####################################
+// register test suites
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_osl_writeFile, "test_osl_writeFile");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_osl_copyFile, "test_osl_copyFile");
+
+NOADDITIONAL;
+
diff --git a/sal/qa/osl/module/export_dll.map b/sal/qa/osl/module/export_dll.map
new file mode 100644
index 000000000000..87c701f21d91
--- /dev/null
+++ b/sal/qa/osl/module/export_dll.map
@@ -0,0 +1,34 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+UDK_3_0_0 {
+ global:
+ firstfunc;
+
+ local:
+ *;
+};
diff --git a/sal/qa/osl/module/makefile.mk b/sal/qa/osl/module/makefile.mk
new file mode 100644
index 000000000000..409a28ea02ac
--- /dev/null
+++ b/sal/qa/osl/module/makefile.mk
@@ -0,0 +1,79 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_module
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+
+# --- test dll ------------------------------------------------------
+SHL1TARGET = Module_DLL
+SHL1OBJS = $(SLO)$/osl_Module_DLL.obj
+SHL1STDLIBS = $(SALLIB)
+SHL1IMPLIB = i$(SHL1TARGET)
+SHL1DEF = $(MISC)$/$(SHL1TARGET).def
+DEF1NAME = $(SHL1TARGET)
+SHL1VERSIONMAP = export_dll.map
+
+
+# --- main l ------------------------------------------------------
+SHL2OBJS= $(SLO)$/osl_Module.obj
+
+SHL2TARGET= osl_Module
+SHL2STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+.IF "$(GUI)" == "WNT"
+SHL2STDLIBS+=i$(SHL2TARGET).lib
+.ENDIF
+.IF "$(GUI)" == "UNX"
+APP3STDLIBS+=-l$(SHL2TARGET)
+.ENDIF
+
+SHL2DEPN= $(SHL1OBJS)
+SHL2IMPLIB= i$(SHL2TARGET)
+SHL2DEF= $(MISC)$/$(SHL2TARGET).def
+
+DEF2NAME =$(SHL2TARGET)
+SHL2VERSIONMAP= $(PRJ)$/qa$/export.map
+# END ------------------------------------------------------------------
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/osl/module/osl_Module.cxx b/sal/qa/osl/module/osl_Module.cxx
new file mode 100644
index 000000000000..d7ddb866d57d
--- /dev/null
+++ b/sal/qa/osl/module/osl_Module.cxx
@@ -0,0 +1,522 @@
+ /*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+#include <osl_Module_Const.h>
+
+using namespace osl;
+using namespace rtl;
+
+
+//------------------------------------------------------------------------
+// helper functions and classes
+//------------------------------------------------------------------------
+
+/** print Boolean value.
+*/
+inline void printBool( sal_Bool bOk )
+{
+ t_print("#printBool# " );
+ ( sal_True == bOk ) ? t_print("TRUE!\n" ): t_print("FALSE!\n" );
+}
+
+/** print a UNI_CODE String.
+*/
+inline void printUString( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ t_print("#printUString_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", aString.getStr( ) );
+}
+
+/** get dll file URL.
+*/
+inline ::rtl::OUString getDllURL( void )
+{
+#if ( defined WNT ) // lib in Unix and lib in Windows are not same in file name.
+ ::rtl::OUString libPath( rtl::OUString::createFromAscii( "Module_DLL.dll" ) );
+#else
+ ::rtl::OUString libPath( rtl::OUString::createFromAscii( "libModule_DLL.so" ) );
+#endif
+
+ ::rtl::OUString dirPath, dllPath;
+ osl::Module::getUrlFromAddress( ( void* ) &getDllURL, dirPath );
+ dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') + 1);
+ osl::FileBase::getAbsoluteFileURL( dirPath, libPath, dllPath );
+
+ return dllPath;
+}
+
+/** print a UNI_CODE file name.
+*/
+inline void printFileName( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ t_print("#printFileName_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", aString.getStr( ) );
+}
+
+inline sal_Bool isURL( const ::rtl::OUString pathname )
+{
+ ::rtl::OUString aPreURL( rtl::OUString::createFromAscii( "file:///" ) );
+ return ( ( pathname.indexOf( aPreURL ) == 0 ) ? sal_True : sal_False );
+}
+
+/** create a temp test directory using OUString name of full qualified URL or system path.
+*/
+inline void createTestDirectory( const ::rtl::OUString dirname )
+{
+ ::rtl::OUString aPathURL = dirname.copy( 0 );
+ ::osl::FileBase::RC nError;
+
+ if ( !isURL( dirname ) )
+ ::osl::FileBase::getFileURLFromSystemPath( dirname, aPathURL ); //convert if not full qualified URL
+ nError = ::osl::Directory::create( aPathURL );
+ CPPUNIT_ASSERT_MESSAGE( "In createTestDirectory Function: creation: ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_EXIST ) );
+}
+
+/** delete a temp test directory using OUString name of full qualified URL or system path.
+*/
+inline void deleteTestDirectory( const ::rtl::OUString dirname )
+{
+ ::rtl::OUString aPathURL = dirname.copy( 0 );
+ ::osl::FileBase::RC nError;
+ if ( !isURL( dirname ) )
+ ::osl::FileBase::getFileURLFromSystemPath( dirname, aPathURL ); //convert if not full qualified URL
+
+ ::osl::Directory testDir( aPathURL );
+ if ( testDir.isOpen( ) == sal_True )
+ {
+ testDir.close( ); //close if still open.
+ }
+
+ nError = ::osl::Directory::remove( aPathURL );
+ CPPUNIT_ASSERT_MESSAGE( "In deleteTestDirectory function: remove ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT ) );
+}
+
+//check if the file exist
+inline sal_Bool ifFileExist( const ::rtl::OUString & str )
+{
+ ::rtl::OUString aUStr;
+ if ( isURL( str ) )
+ ::osl::FileBase::getSystemPathFromFileURL( str, aUStr );
+ else
+ return sal_False;
+
+ ::osl::File strFile( aUStr );
+ ::osl::FileBase::RC nError = strFile.open( OpenFlag_Read );
+ if ( ::File::E_NOENT == nError )
+ return sal_False;
+ else{
+ strFile.close( );
+ return sal_True;
+ }
+}
+
+/** detete a temp test file using OUString name.
+*/
+inline void deleteTestFile( const ::rtl::OUString filename )
+{
+ ::rtl::OUString aPathURL = filename.copy( 0 );
+ ::osl::FileBase::RC nError;
+
+ if ( !isURL( filename ) )
+ ::osl::FileBase::getFileURLFromSystemPath( filename, aPathURL ); //convert if not full qualified URL
+
+ nError = ::osl::File::setAttributes( aPathURL, Attribute_GrpWrite| Attribute_OwnWrite| Attribute_OthWrite ); // if readonly, make writtenable.
+ CPPUNIT_ASSERT_MESSAGE( "In deleteTestFile Function: set writtenable ", ( ::osl::FileBase::E_None == nError ) || ( ::osl::FileBase::E_NOENT == nError ) );
+
+ nError = ::osl::File::remove( aPathURL );
+ CPPUNIT_ASSERT_MESSAGE( "In deleteTestFile Function: remove ", ( ::osl::FileBase::E_None == nError ) || ( nError == ::osl::FileBase::E_NOENT ) );
+}
+
+
+//------------------------------------------------------------------------
+// test code start here
+//------------------------------------------------------------------------
+
+namespace osl_Module
+{
+
+ /** class and member function that is available for module test :
+ */
+
+ class testClass
+ {
+ public:
+ static void myFunc()
+ {
+ t_print("#Sun Microsystem\n");
+ };
+ };
+
+
+ /** testing the methods:
+ Module();
+ Module( const ::rtl::OUString& strModuleName, sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT);
+ */
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void ctors_none( )
+ {
+ ::osl::Module aMod;
+ bRes = aMod.is();
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor without parameter.",
+ sal_False == bRes );
+ }
+
+ void ctors_name_mode( )
+ {
+ OUString aFileURL;
+ bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL );
+
+ if ( !( bRes ) )
+ {
+ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", sal_False );
+ }
+
+ ::osl::Module aMod( aFileURL );
+ bRes = aMod.is( );
+ aMod.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with load action.",
+ sal_True == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_name_mode );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class ctors
+
+
+ /** testing the methods:
+ static sal_Bool getUrlFromAddress(void * addr, ::rtl::OUString & libraryUrl)
+ */
+ class getUrlFromAddress : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void getUrlFromAddress_001( )
+ {
+ OUString aFileURL;
+ bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL ) ;
+ if ( !( bRes ) )
+ {
+ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", sal_False );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test get Module URL from address.",
+ sal_True == bRes && 0 < aFileURL.lastIndexOf('/') );
+ }
+
+ void getUrlFromAddress_002( )
+ {
+ ::osl::Module aMod( getDllURL( ) );
+ FuncPtr pFunc = ( FuncPtr ) aMod.getSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
+
+ OUString aFileURL;
+ bRes = osl::Module::getUrlFromAddress( ( void* )pFunc, aFileURL );
+ if ( !( bRes ) )
+ {
+ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", sal_False );
+ }
+ aMod.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load an external library, get its function address and get its URL.",
+ sal_True == bRes && 0 < aFileURL.lastIndexOf('/') && aFileURL.equalsIgnoreAsciiCase( getDllURL( ) ) );
+ }
+
+ /* tester comments: another case is getFunctionSymbol_001*/
+
+ CPPUNIT_TEST_SUITE( getUrlFromAddress );
+ CPPUNIT_TEST( getUrlFromAddress_001 );
+ CPPUNIT_TEST( getUrlFromAddress_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getUrlFromAddress
+
+
+ /** testing the method:
+ sal_Bool SAL_CALL load( const ::rtl::OUString& strModuleName,
+ sal_Int32 nRtldMode = SAL_LOADMODULE_DEFAULT)
+ */
+ class load : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void load_001( )
+ {
+ ::osl::Module aMod( getDllURL( ) );
+ ::osl::Module aMod1;
+
+ aMod1.load( getDllURL( ) );
+ bRes = oslModule(aMod) == oslModule(aMod1);
+ aMod.unload( );
+ aMod1.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load function should do the same thing as constructor with library name.",
+ sal_True == bRes );
+ }
+ // load lib which is under a CJK directory
+ void load_002( )
+ {
+#ifdef UNX
+ //Can not get a CJK directory already exist, so here create one. Perhaps reason is encoding problem.
+ ::rtl::OUString aPidDirURL = rtl::OUString::createFromAscii( "file:///tmp/" ) + ::rtl::OUString::valueOf( ( long )getpid( ) );
+ ::rtl::OUString aMyDirURL = aPidDirURL + aKname;
+ createTestDirectory( aPidDirURL );
+ createTestDirectory( aMyDirURL );
+
+ ::rtl::OUString aDLLURL = aMyDirURL + rtl::OUString::createFromAscii( "/libModule_DLL.so" );
+ //check if the lib exist.
+ //FIXME: if assert condition is false, the case will return, so the directory will not be clean-up
+ CPPUNIT_ASSERT_MESSAGE( "#Source file is not exist. please manually clean-up directory and file under /tmp", ifFileExist( getDllURL( ) ) == sal_True );
+ ::osl::FileBase::RC nError = ::osl::File::copy( getDllURL( ), aDLLURL );
+ CPPUNIT_ASSERT_MESSAGE( "#copy failed. please manually clean-up directory and file under /tmp", nError == ::osl::FileBase::E_None );
+ //ifFileExist returned false but the file exist
+ CPPUNIT_ASSERT_MESSAGE( "#This file is not exist, copy failed. please manually clean-up directory and file under /tmp", ifFileExist( aDLLURL ) == sal_True );
+
+ //test if can create a normal file
+ ::rtl::OUString aFileURL = aMyDirURL + rtl::OUString::createFromAscii( "/test_file" );
+ ::osl::File testFile( aFileURL );
+ nError = testFile.open( OpenFlag_Create );
+ CPPUNIT_ASSERT_MESSAGE( "#create failed. please manually clean-up directory and file under /tmp", nError == ::osl::FileBase::E_None );
+ CPPUNIT_ASSERT_MESSAGE( "#This file is not exist, create failed. please manually clean-up directory and file under /tmp", ifFileExist( aFileURL ) == sal_True );
+
+ //load the copied dll
+ ::osl::Module aMod( aDLLURL );
+ ::osl::Module aMod1;
+
+ sal_Bool bOK = aMod1.load( aDLLURL );
+ bRes = oslModule(aMod) == oslModule(aMod1);
+ aMod.unload( );
+ aMod1.unload( );
+ deleteTestFile( aFileURL );
+ deleteTestFile( aDLLURL );
+ deleteTestDirectory( aMyDirURL );
+ deleteTestDirectory( aPidDirURL );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load lib which is under a CJK directory.",
+ sal_True == bRes && bOK == sal_True );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( load );
+ CPPUNIT_TEST( load_001 );
+ CPPUNIT_TEST( load_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class load
+
+
+ /** testing the method:
+ void SAL_CALL unload()
+ */
+ class unload : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void unload_001( )
+ {
+ ::osl::Module aMod( getDllURL( ) );
+
+ aMod.unload( );
+ bRes = oslModule(aMod) ==NULL;
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: unload function should do the same thing as destructor.",
+ sal_True == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( unload );
+ CPPUNIT_TEST( unload_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class unload
+
+
+ /** testing the methods:
+ sal_Bool SAL_CALL is() const
+ */
+ class is : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void is_001( )
+ {
+ OUString aFileURL;
+ bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL );
+ if ( !( bRes ) )
+ {
+ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module - using executable instead", sal_False );
+ }
+
+ ::osl::Module aMod;
+ bRes = aMod.is( );
+ aMod.load( aFileURL );
+ bRes1 = aMod.is( );
+ aMod.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test if a module is a loaded module.",
+ sal_False == bRes && sal_True == bRes1);
+ }
+ CPPUNIT_TEST_SUITE( is );
+ CPPUNIT_TEST( is_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class is
+
+
+ /** testing the methods:
+ void* SAL_CALL getSymbol( const ::rtl::OUString& strSymbolName)
+ */
+ class getSymbol : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes;
+
+ void getSymbol_001( )
+ {
+ ::osl::Module aMod( getDllURL( ) );
+ FuncPtr pFunc = ( FuncPtr ) aMod.getSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
+ bRes = sal_False;
+ if ( pFunc )
+ bRes = pFunc( bRes );
+ aMod.unload();
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load a dll and call one function in it.",
+ sal_True == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( getSymbol );
+ CPPUNIT_TEST( getSymbol_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getSymbol
+
+
+ /** testing the methods:
+ operator oslModule() const
+ */
+ class optr_oslModule : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void optr_oslModule_001( )
+ {
+ ::osl::Module aMod;
+ bRes = ( (oslModule)aMod == NULL );
+
+ aMod.load( getDllURL( ) );
+ bRes1 = (oslModule)aMod != NULL;
+
+ aMod.unload( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: the m_Module of a Module instance will be NULL when is not loaded, it will not be NULL after loaded.",
+ sal_True == bRes && sal_True == bRes1);
+ }
+
+ void optr_oslModule_002( )
+ {
+ ::osl::Module aMod( getDllURL( ) );
+ ::rtl::OUString funcName(::rtl::OUString::createFromAscii( "firstfunc" ) );
+
+ FuncPtr pFunc = ( FuncPtr ) osl_getSymbol( (oslModule)aMod, funcName.pData );
+ bRes = sal_False;
+ if ( pFunc )
+ bRes = pFunc( bRes );
+
+ aMod.unload();
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: use m_Module to call osl_getSymbol() function.",
+ sal_True == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( optr_oslModule );
+ CPPUNIT_TEST( optr_oslModule_001 );
+ CPPUNIT_TEST( optr_oslModule_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class optr_oslModule
+
+ /** testing the methods:
+ oslGenericFunction SAL_CALL getFunctionSymbol( const ::rtl::OUString& ustrFunctionSymbolName )
+ */
+ class getFunctionSymbol : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void getFunctionSymbol_001( )
+ {
+ ::osl::Module aMod( getDllURL( ) );
+ oslGenericFunction oslFunc = aMod.getFunctionSymbol( rtl::OUString::createFromAscii( "firstfunc" ) );
+ ::rtl::OUString aLibraryURL;
+ bRes = ::osl::Module::getUrlFromAddress( oslFunc, aLibraryURL);
+ aMod.unload();
+ printFileName( aLibraryURL );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: load a dll and get its function addr and get its URL.",
+ sal_True == bRes && aLibraryURL.equalsIgnoreAsciiCase( getDllURL() ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getFunctionSymbol );
+ CPPUNIT_TEST( getFunctionSymbol_001 );
+ //CPPUNIT_TEST( getFunctionSymbol_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getFunctionSymbol
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::ctors, "osl_Module");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::getUrlFromAddress, "osl_Module");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::load, "osl_Module");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::unload, "osl_Module");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::is, "osl_Module");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::getSymbol, "osl_Module");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::optr_oslModule, "osl_Module");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Module::getFunctionSymbol, "osl_Module");
+// -----------------------------------------------------------------------------
+
+} // namespace osl_Module
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/module/osl_Module_Const.h b/sal/qa/osl/module/osl_Module_Const.h
new file mode 100644
index 000000000000..21b1b743c6ee
--- /dev/null
+++ b/sal/qa/osl/module/osl_Module_Const.h
@@ -0,0 +1,66 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _OSL_MODULE_CONST_H_
+#define _OSL_MODULE_CONST_H_
+
+
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+#include <osl/module.hxx>
+#include <osl/file.hxx>
+
+#include <testshl/simpleheader.hxx>
+
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+# include <unistd.h>
+#endif
+#if ( defined WNT ) // Windows
+#include <tools/prewin.h>
+// # include <windows.h>
+# include <io.h>
+#include <tools/postwin.h>
+#endif
+
+# define FILE_PREFIX "file:///"
+
+//Korea charactors
+::rtl::OUString aKname(
+ RTL_CONSTASCII_STRINGPARAM(
+ "/\xEC\x95\x88\xEB\x85\x95\xED\x95\x98\xEC\x84\xB8\xEC\x9A\x94"),
+ RTL_TEXTENCODING_ISO_8859_1);
+ // zero-extend the individual byte-sized characters one-to-one to individual
+ // sal_Unicode-sized characters; not sure whether this is what was
+ // intended...
+
+//------------------------------------------------------------------------
+// function pointer type.
+//------------------------------------------------------------------------
+typedef sal_Bool (* FuncPtr )( sal_Bool );
+
+
+#endif /* _OSL_MODULE_CONST_H_ */
diff --git a/sal/qa/osl/module/osl_Module_DLL.cxx b/sal/qa/osl/module/osl_Module_DLL.cxx
new file mode 100644
index 000000000000..38ab7d29abd4
--- /dev/null
+++ b/sal/qa/osl/module/osl_Module_DLL.cxx
@@ -0,0 +1,43 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <stdio.h>
+#include <sal/types.h>
+#include <testshl/simpleheader.hxx>
+
+extern "C" sal_Bool SAL_CALL firstfunc( sal_Bool bRes )
+{
+ return ( bRes = sal_True );
+}
+extern "C" void SAL_CALL secondfunc()
+{
+ printf("second func called.\n");
+}
+
diff --git a/sal/qa/osl/mutex/makefile.mk b/sal/qa/osl/mutex/makefile.mk
new file mode 100755
index 000000000000..de4121e3a0b9
--- /dev/null
+++ b/sal/qa/osl/mutex/makefile.mk
@@ -0,0 +1,73 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+.IF "$(OOO_SUBSEQUENT_TESTS)" == ""
+nothing .PHONY:
+.ELSE
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_osl_mutex
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Socket by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/osl_Mutex.obj
+
+SHL1TARGET= osl_Mutex
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB)
+.IF "$(GUI)" == "WNT"
+SHL1STDLIBS += $(WS2_32LIB)
+.ENDIF
+
+SHL1IMPLIB= i$(SHL1TARGET)
+
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+SHL1RPATH = NONE
+
+# auto generated Target:Socket
+# END ------------------------------------------------------------------
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
+.END
diff --git a/sal/qa/osl/mutex/osl_Mutex.cxx b/sal/qa/osl/mutex/osl_Mutex.cxx
new file mode 100755
index 000000000000..4b1b078785d3
--- /dev/null
+++ b/sal/qa/osl/mutex/osl_Mutex.cxx
@@ -0,0 +1,949 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+#include "cppunit/TestAssert.h"
+#include "cppunit/TestFixture.h"
+#include "cppunit/extensions/HelperMacros.h"
+#include "cppunit/plugin/TestPlugIn.h"
+#include <osl_Mutex_Const.h>
+
+using namespace osl;
+using namespace rtl;
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+/** print a UNI_CODE String.
+*/
+inline void printUString( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ printf("#printUString_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ printf("%s\n", aString.getStr( ) );
+}
+
+/** print Boolean value.
+*/
+inline void printBool( sal_Bool bOk )
+{
+ printf("#printBool# " );
+ ( sal_True == bOk ) ? printf("YES!\n" ): printf("NO!\n" );
+}
+
+/** pause nSec seconds helper function.
+*/
+namespace ThreadHelper
+{
+ void thread_sleep( sal_Int32 _nSec )
+ {
+ /// print statement in thread process must use fflush() to force display.
+ // t_print("# wait %d seconds. ", _nSec );
+ fflush(stdout);
+
+#ifdef WNT //Windows
+ Sleep( _nSec * 1000 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ sleep( _nSec );
+#endif
+ // printf("# done\n" );
+ }
+ void thread_sleep_tenth_sec(sal_Int32 _nTenthSec)
+ {
+#ifdef WNT //Windows
+ Sleep(_nTenthSec * 100 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ TimeValue nTV;
+ nTV.Seconds = static_cast<sal_uInt32>( _nTenthSec/10 );
+ nTV.Nanosec = ( (_nTenthSec%10 ) * 100000000 );
+ osl_waitThread(&nTV);
+#endif
+ }
+}
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for osl_Mutex class
+//------------------------------------------------------------------------
+
+
+/** mutually exclusive data
+*/
+struct resource {
+ sal_Int32 data1;
+ sal_Int32 data2;
+ Mutex lock;
+};
+
+/** IncreaseThread provide data.
+*/
+class IncreaseThread : public Thread
+{
+public:
+ IncreaseThread( struct resource *pData ): pResource( pData ) { }
+
+ ~IncreaseThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#IncreaseThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ struct resource *pResource;
+
+ void SAL_CALL run( )
+ {
+ pResource->lock.acquire( );
+ for( sal_Int8 i = 0; i < 3; i++ )
+ {
+ pResource->data1++;
+ yield( ); //yield() give CPU time to other thread, other thread if not block, they will change the data;
+ }
+ if ( pResource->data2 == 0 )
+ pResource->data2 = ( pResource->data1 > 0 ? pResource->data1 : 0 - pResource->data1 );
+ pResource->lock.release();
+ }
+};
+
+/** DecreaseThread consume data.
+*/
+class DecreaseThread : public Thread
+{
+public:
+ DecreaseThread( struct resource *pData ): pResource( pData ) { }
+
+ ~DecreaseThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#DecreaseThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ struct resource *pResource;
+
+ void SAL_CALL run( )
+ {
+ pResource->lock.acquire( );
+ for( sal_Int8 i = 0; i < 3; i++ )
+ {
+ pResource->data1--;
+ yield( ); //yield() give CPU time to other thread, other thread if not block, they will change the data;
+ }
+ if ( pResource->data2 == 0 )
+ pResource->data2 = ( pResource->data1 > 0 ? pResource->data1 : 0 - pResource->data1 );
+ pResource->lock.release();
+ }
+};
+
+
+/** chain structure used in Threads as critical resource
+*/
+struct chain {
+ sal_Int32 buffer[ BUFFER_SIZE ];
+ Mutex lock;
+ sal_Int8 pos;
+};
+
+/** PutThread write to the chain structure in a mutex manner.
+*/
+class PutThread : public Thread
+{
+public:
+ //get the struct pointer to write data to buffer
+ PutThread( struct chain* pData ): pChain( pData ) { }
+
+ ~PutThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#PutThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ struct chain* pChain;
+
+ void SAL_CALL run( )
+ {
+ //block here if the mutex has been acquired
+ pChain->lock.acquire( );
+
+ //current position in buffer to write
+ sal_Int8 nPos = pChain->pos;
+ oslThreadIdentifier oId = getIdentifier( );
+ //write data
+ sal_Int8 i;
+ for ( i = 0; i < 5; i++ )
+ {
+ pChain->buffer[ nPos + i ] = oId;
+ yield( );
+ }
+ //revise the position
+ pChain->pos = nPos + i;
+
+ //finish writing, release the mutex
+ pChain->lock.release();
+ }
+};
+
+/** thread for testing Mutex acquire.
+ */
+class HoldThread : public Thread
+{
+public:
+ //get the Mutex pointer to operate
+ HoldThread( Mutex* pMutex ): pMyMutex( pMutex ) { }
+
+ ~HoldThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#HoldThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ Mutex* pMyMutex;
+
+ void SAL_CALL run()
+ {
+ // block here if the mutex has been acquired
+ pMyMutex->acquire( );
+ printf("# Mutex acquired. \n" );
+ pMyMutex->release( );
+ }
+};
+
+class WaitThread : public Thread
+{
+public:
+ //get the Mutex pointer to operate
+ WaitThread( Mutex* pMutex ): pMyMutex( pMutex ) { }
+
+ ~WaitThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#WaitThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ Mutex* pMyMutex;
+
+ void SAL_CALL run( )
+ {
+ // block here if the mutex has been acquired
+ pMyMutex->acquire( );
+ ThreadHelper::thread_sleep_tenth_sec( 2 );
+ pMyMutex->release( );
+ }
+};
+
+/** thread for testing getGlobalMutex.
+ */
+class GlobalMutexThread : public Thread
+{
+public:
+ //get the Mutex pointer to operate
+ GlobalMutexThread( ){ }
+
+ ~GlobalMutexThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#GlobalMutexThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ void SAL_CALL run( )
+ {
+ // block here if the mutex has been acquired
+ Mutex* pGlobalMutex;
+ pGlobalMutex = pGlobalMutex->getGlobalMutex( );
+ pGlobalMutex->acquire( );
+ printf("# Global Mutex acquired. \n" );
+ pGlobalMutex->release( );
+ }
+};
+
+
+//--------------------------------------------------------------
+namespace osl_Mutex
+{
+
+ /** Test of the osl::Mutex::constructor
+ */
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ struct chain m_Data;
+ struct resource m_Res;
+
+ void setUp( )
+ {
+ for ( sal_Int8 i=0; i < BUFFER_SIZE; i++ )
+ m_Data.buffer[i] = 0;
+ m_Data.pos = 0;
+
+ m_Res.data1 = 0;
+ m_Res.data2 = 0;
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** Create two threads to write data to the same buffer, use Mutex to assure
+ during one thread write data five times, the other thread should not begin writing.
+ the two threads wrote two different datas: their thread ID, so we can check the datas
+ in buffer to know the order of the two threads writing
+ */
+ void ctor_001()
+ {
+ PutThread myThread1( &m_Data );
+ PutThread myThread2( &m_Data );
+
+ myThread1.create( );
+ myThread2.create( );
+
+ //wait until the two threads terminate
+ myThread1.join( );
+ myThread2.join( );
+
+ sal_Bool bRes = sal_False;
+
+ // every 5 datas should the same
+ // LLA: this is not a good check, it's too fix
+ if (m_Data.buffer[0] == m_Data.buffer[1] &&
+ m_Data.buffer[1] == m_Data.buffer[2] &&
+ m_Data.buffer[2] == m_Data.buffer[3] &&
+ m_Data.buffer[3] == m_Data.buffer[4] &&
+ m_Data.buffer[5] == m_Data.buffer[6] &&
+ m_Data.buffer[6] == m_Data.buffer[7] &&
+ m_Data.buffer[7] == m_Data.buffer[8] &&
+ m_Data.buffer[8] == m_Data.buffer[9])
+ bRes = sal_True;
+
+ /*for (sal_Int8 i=0; i<BUFFER_SIZE; i++)
+ printf("#data in buffer is %d\n", m_Data.buffer[i]);
+ */
+
+ CPPUNIT_ASSERT_MESSAGE("Mutex ctor", bRes == sal_True);
+
+ }
+
+ /** Create two threads to write data to operate on the same number , use Mutex to assure,
+ one thread increase data 3 times, the other thread decrease 3 times, store the operate
+ result when the first thread complete, if it is interrupt by the other thread, the stored
+ number will not be 3.
+ */
+ void ctor_002()
+ {
+ IncreaseThread myThread1( &m_Res );
+ DecreaseThread myThread2( &m_Res );
+
+ myThread1.create( );
+ myThread2.create( );
+
+ //wait until the two threads terminate
+ myThread1.join( );
+ myThread2.join( );
+
+ sal_Bool bRes = sal_False;
+
+ // every 5 datas should the same
+ if ( ( m_Res.data1 == 0 ) && ( m_Res.data2 == 3 ) )
+ bRes = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test Mutex ctor function: increase and decrease a number 3 times without interrupt.", bRes == sal_True );
+ }
+
+ CPPUNIT_TEST_SUITE( ctor );
+ CPPUNIT_TEST( ctor_001 );
+ CPPUNIT_TEST( ctor_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class ctor
+
+
+ /** Test of the osl::Mutex::acquire method
+ */
+ class acquire : public CppUnit::TestFixture
+ {
+ public:
+ // acquire mutex in main thread, and then call acquire again in myThread,
+ // the child thread should block, wait 2 secs, it still block.
+ // Then release mutex in main thread, the child thread could return from acquire,
+ // and go to exec next statement, so could terminate quickly.
+ void acquire_001( )
+ {
+ Mutex aMutex;
+ //acquire here
+ sal_Bool bRes = aMutex.acquire( );
+ // pass the pointer of mutex to child thread
+ HoldThread myThread( &aMutex );
+ myThread.create( );
+
+ ThreadHelper::thread_sleep_tenth_sec( 2 );
+ // if acquire in myThread does not work, 2 secs is long enough,
+ // myThread should terminate now, and bRes1 should be sal_False
+ sal_Bool bRes1 = myThread.isRunning( );
+
+ aMutex.release( );
+ ThreadHelper::thread_sleep_tenth_sec( 1 );
+ // after release mutex, myThread stops blocking and will terminate immediately
+ sal_Bool bRes2 = myThread.isRunning( );
+ myThread.join( );
+
+ CPPUNIT_ASSERT_MESSAGE( "Mutex acquire",
+ bRes == sal_True && bRes1 == sal_True && bRes2 == sal_False );
+ }
+
+ //in the same thread, acquire twice should success
+ void acquire_002()
+ {
+ Mutex aMutex;
+ //acquire here
+ sal_Bool bRes = aMutex.acquire();
+ sal_Bool bRes1 = aMutex.acquire();
+
+ sal_Bool bRes2 = aMutex.tryToAcquire();
+
+ aMutex.release();
+
+ CPPUNIT_ASSERT_MESSAGE("Mutex acquire",
+ bRes == sal_True && bRes1 == sal_True && bRes2 == sal_True);
+
+ }
+
+ CPPUNIT_TEST_SUITE( acquire );
+ CPPUNIT_TEST( acquire_001 );
+ CPPUNIT_TEST( acquire_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class acquire
+
+
+ /** Test of the osl::Mutex::tryToAcquire method
+ */
+ class tryToAcquire : public CppUnit::TestFixture
+ {
+ public:
+ // First let child thread acquire the mutex, and wait 2 secs, during the 2 secs,
+ // in main thread, tryToAcquire mutex should return False
+ // then after the child thread terminated, tryToAcquire should return True
+ void tryToAcquire_001()
+ {
+ Mutex aMutex;
+ WaitThread myThread(&aMutex);
+ myThread.create();
+
+ // ensure the child thread acquire the mutex
+ ThreadHelper::thread_sleep_tenth_sec(1);
+
+ sal_Bool bRes1 = aMutex.tryToAcquire();
+
+ if (bRes1 == sal_True)
+ aMutex.release();
+ // wait the child thread terminate
+ myThread.join();
+
+ sal_Bool bRes2 = aMutex.tryToAcquire();
+
+ if (bRes2 == sal_True)
+ aMutex.release();
+
+ CPPUNIT_ASSERT_MESSAGE("Try to acquire Mutex",
+ bRes1 == sal_False && bRes2 == sal_True);
+ }
+
+ CPPUNIT_TEST_SUITE(tryToAcquire);
+ CPPUNIT_TEST(tryToAcquire_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class tryToAcquire
+
+ /** Test of the osl::Mutex::release method
+ */
+ class release : public CppUnit::TestFixture
+ {
+ public:
+ /** acquire/release are not used in pairs: after child thread acquired mutex,
+ the main thread release it, then any thread could acquire it.
+ */
+ void release_001()
+ {
+ Mutex aMutex;
+ WaitThread myThread( &aMutex );
+ myThread.create( );
+
+ // ensure the child thread acquire the mutex
+ ThreadHelper::thread_sleep_tenth_sec( 1 );
+
+ sal_Bool bRunning = myThread.isRunning( );
+ sal_Bool bRes1 = aMutex.tryToAcquire( );
+ // wait the child thread terminate
+ myThread.join( );
+
+ sal_Bool bRes2 = aMutex.tryToAcquire( );
+
+ if ( bRes2 == sal_True )
+ aMutex.release( );
+
+ CPPUNIT_ASSERT_MESSAGE( "release Mutex: try to aquire before and after the mutex has been released",
+ bRes1 == sal_False && bRes2 == sal_True && bRunning == sal_True );
+
+ }
+
+ // how about release twice?
+ void release_002()
+ {
+// LLA: is this a real test?
+#if 0
+ Mutex aMutex;
+ sal_Bool bRes1 = aMutex.release( );
+ sal_Bool bRes2 = aMutex.release( );
+
+ CPPUNIT_ASSERT_MESSAGE( "release Mutex: mutex should not be released without aquire, should not release twice. although the behaviour is still under discussion, this test is passed on (LINUX), not passed on (SOLARIS)&(WINDOWS)",
+ bRes1 == sal_False && bRes2 == sal_False );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( release );
+ CPPUNIT_TEST( release_001 );
+ CPPUNIT_TEST( release_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class release
+
+
+
+ /** Test of the osl::Mutex::getGlobalMutex method
+ */
+ class getGlobalMutex : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void getGlobalMutex_001()
+ {
+ Mutex* pGlobalMutex;
+ pGlobalMutex = pGlobalMutex->getGlobalMutex();
+ pGlobalMutex->acquire();
+
+ GlobalMutexThread myThread;
+ myThread.create();
+
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ sal_Bool bRes1 = myThread.isRunning();
+
+ pGlobalMutex->release();
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ // after release mutex, myThread stops blocking and will terminate immediately
+ sal_Bool bRes2 = myThread.isRunning();
+
+ CPPUNIT_ASSERT_MESSAGE("Global Mutex works",
+ bRes1 == sal_True && bRes2 == sal_False);
+ }
+
+ void getGlobalMutex_002( )
+ {
+ sal_Bool bRes;
+
+ Mutex *pGlobalMutex;
+ pGlobalMutex = pGlobalMutex->getGlobalMutex( );
+ pGlobalMutex->acquire( );
+ {
+ Mutex *pGlobalMutex1;
+ pGlobalMutex1 = pGlobalMutex1->getGlobalMutex( );
+ bRes = pGlobalMutex1->release( );
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( "Global Mutex works: if the code between {} get the different mutex as the former one, it will return false when release.",
+ bRes == sal_True );
+ }
+
+ CPPUNIT_TEST_SUITE(getGlobalMutex);
+ CPPUNIT_TEST(getGlobalMutex_001);
+ CPPUNIT_TEST(getGlobalMutex_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class getGlobalMutex
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Mutex::ctor, "osl_Mutex");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Mutex::acquire, "osl_Mutex");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Mutex::tryToAcquire, "osl_Mutex");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Mutex::release, "osl_Mutex");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Mutex::getGlobalMutex, "osl_Mutex");
+} // namespace osl_Mutex
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for osl_Guard class
+//------------------------------------------------------------------------
+
+class GuardThread : public Thread
+{
+public:
+ //get the Mutex pointer to operate
+ GuardThread( Mutex* pMutex ): pMyMutex( pMutex ) { }
+
+ ~GuardThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#GuardThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ Mutex* pMyMutex;
+
+ void SAL_CALL run( )
+ {
+ // block here if the mutex has been acquired
+ MutexGuard aGuard( pMyMutex );
+ ThreadHelper::thread_sleep_tenth_sec( 2 );
+ }
+};
+
+
+namespace osl_Guard
+{
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ // insert your test code here.
+ void ctor_001()
+ {
+ Mutex aMutex;
+ GuardThread myThread(&aMutex);
+ myThread.create();
+
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ sal_Bool bRes = aMutex.tryToAcquire();
+ // after 1 second, the mutex has been guarded, and the child thread should be running
+ sal_Bool bRes1 = myThread.isRunning();
+
+ myThread.join();
+ sal_Bool bRes2 = aMutex.tryToAcquire();
+
+ CPPUNIT_ASSERT_MESSAGE("GuardThread constructor",
+ bRes == sal_False && bRes1 == sal_True && bRes2 == sal_True);
+ }
+
+ void ctor_002( )
+ {
+ Mutex aMutex;
+
+ /// use reference constructor here
+ MutexGuard myGuard( aMutex );
+
+ /// the GuardThread will block here when it is initialised.
+ GuardThread myThread( &aMutex );
+ myThread.create( );
+
+ /// is it still blocking?
+ ThreadHelper::thread_sleep_tenth_sec( 2 );
+ sal_Bool bRes = myThread.isRunning( );
+
+ /// oh, release him.
+ aMutex.release( );
+ myThread.join( );
+
+ CPPUNIT_ASSERT_MESSAGE("GuardThread constructor: reference initialization, aquire the mutex before running the thread, then check if it is blocking.",
+ bRes == sal_True);
+ }
+
+ CPPUNIT_TEST_SUITE(ctor);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST(ctor_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ctor
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Guard::ctor, "osl_Guard");
+} // namespace osl_Guard
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for osl_ClearableGuard class
+//------------------------------------------------------------------------
+
+/** Thread for test ClearableGuard
+ */
+class ClearGuardThread : public Thread
+{
+public:
+ //get the Mutex pointer to operate
+ ClearGuardThread( Mutex* pMutex ): pMyMutex( pMutex ) {}
+
+ ~ClearGuardThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#ClearGuardThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ Mutex* pMyMutex;
+
+ void SAL_CALL run( )
+ {
+ // acquire the mutex
+ // printf("# ClearGuardThread" );
+ ClearableMutexGuard aGuard( pMyMutex );
+ ThreadHelper::thread_sleep( 5 );
+
+ // release the mutex
+ aGuard.clear( );
+ ThreadHelper::thread_sleep( 2 );
+ }
+};
+
+// -----------------------------------------------------------------------------
+namespace osl_ClearableGuard
+{
+
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ void ctor_001()
+ {
+ Mutex aMutex;
+
+ /// now, the aMutex has been guarded.
+ ClearableMutexGuard myMutexGuard( &aMutex );
+
+ /// it will return sal_False if the aMutex has not been Guarded.
+ sal_Bool bRes = aMutex.release( );
+
+ CPPUNIT_ASSERT_MESSAGE("ClearableMutexGuard constructor, test the aquire operation when initilized.",
+ bRes == sal_True );
+ }
+
+ void ctor_002( )
+ {
+ Mutex aMutex;
+
+ /// now, the aMutex has been guarded, this time, we use reference constructor.
+ ClearableMutexGuard myMutexGuard( aMutex );
+
+ /// it will return sal_False if the aMutex has not been Guarded.
+ sal_Bool bRes = aMutex.release( );
+
+ CPPUNIT_ASSERT_MESSAGE("ClearableMutexGuard constructor, test the aquire operation when initilized, we use reference constructor this time.",
+ bRes == sal_True );
+ }
+
+ CPPUNIT_TEST_SUITE(ctor);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST(ctor_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ctor
+
+ class clear : public CppUnit::TestFixture
+ {
+ public:
+ void clear_001()
+ {
+ Mutex aMutex;
+ ClearGuardThread myThread(&aMutex);
+ myThread.create();
+
+ TimeValue aTimeVal_befor;
+ osl_getSystemTime( &aTimeVal_befor );
+ // wait 1 second to assure the child thread has begun
+ ThreadHelper::thread_sleep(1);
+
+ while (1)
+ {
+ if (aMutex.tryToAcquire() == sal_True)
+ {
+ break;
+ }
+ ThreadHelper::thread_sleep(1);
+ }
+ TimeValue aTimeVal_after;
+ osl_getSystemTime( &aTimeVal_after );
+ sal_Int32 nSec = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
+ printf("nSec is %"SAL_PRIdINT32"\n", nSec);
+
+ myThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE("ClearableGuard method: clear",
+ nSec < 7 && nSec > 1);
+ }
+
+ void clear_002( )
+ {
+ Mutex aMutex;
+
+ /// now, the aMutex has been guarded.
+ ClearableMutexGuard myMutexGuard( &aMutex );
+
+ /// launch the HoldThread, it will be blocked here.
+ HoldThread myThread( &aMutex );
+ myThread.create( );
+
+ /// is it blocking?
+ ThreadHelper::thread_sleep_tenth_sec( 4 );
+ sal_Bool bRes = myThread.isRunning( );
+
+ /// use clear to release.
+ myMutexGuard.clear( );
+ myThread.join( );
+ sal_Bool bRes1 = myThread.isRunning( );
+
+ CPPUNIT_ASSERT_MESSAGE( "ClearableGuard method: clear, control the HoldThread's running status!",
+ ( sal_True == bRes ) && ( sal_False == bRes1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( clear );
+ CPPUNIT_TEST( clear_001 );
+ CPPUNIT_TEST( clear_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class clear
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_ClearableGuard::ctor, "osl_ClearableGuard" );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( osl_ClearableGuard::clear, "osl_ClearableGuard" );
+} // namespace osl_ClearableGuard
+
+
+//------------------------------------------------------------------------
+// Beginning of the test cases for osl_ResettableGuard class
+//------------------------------------------------------------------------
+
+/** Thread for test ResettableGuard
+ */
+class ResetGuardThread : public Thread
+{
+public:
+ //get the Mutex pointer to operate
+ ResetGuardThread( Mutex* pMutex ): pMyMutex( pMutex ) {}
+
+ ~ResetGuardThread( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#ResetGuardThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ Mutex* pMyMutex;
+
+ void SAL_CALL run( )
+ {
+ // acquire the mutex
+ printf("# ResettableGuard\n" );
+ ResettableMutexGuard aGuard( pMyMutex );
+ // release the mutex
+ aGuard.clear( );
+ ThreadHelper::thread_sleep_tenth_sec( 2 );
+ }
+};
+
+// -----------------------------------------------------------------------------
+namespace osl_ResettableGuard
+{
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ void ctor_001()
+ {
+ Mutex aMutex;
+
+ /// now, the aMutex has been guarded.
+ ResettableMutexGuard myMutexGuard( &aMutex );
+
+ /// it will return sal_False if the aMutex has not been Guarded.
+ sal_Bool bRes = aMutex.release( );
+
+ CPPUNIT_ASSERT_MESSAGE("ResettableMutexGuard constructor, test the aquire operation when initilized.",
+ bRes == sal_True );
+ }
+
+ void ctor_002( )
+ {
+ Mutex aMutex;
+
+ /// now, the aMutex has been guarded, this time, we use reference constructor.
+ ResettableMutexGuard myMutexGuard( aMutex );
+
+ /// it will return sal_False if the aMutex has not been Guarded.
+ sal_Bool bRes = aMutex.release( );
+
+ CPPUNIT_ASSERT_MESSAGE( "ResettableMutexGuard constructor, test the aquire operation when initilized, we use reference constructor this time.",
+ bRes == sal_True );
+ }
+
+
+ CPPUNIT_TEST_SUITE(ctor);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST(ctor_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ctor
+
+ class reset : public CppUnit::TestFixture
+ {
+ public:
+ void reset_001( )
+ {
+ Mutex aMutex;
+ ResetGuardThread myThread( &aMutex );
+ ResettableMutexGuard myMutexGuard( aMutex );
+ myThread.create( );
+
+ /// is it running? and clear done?
+ sal_Bool bRes = myThread.isRunning( );
+ myMutexGuard.clear( );
+ ThreadHelper::thread_sleep_tenth_sec( 1 );
+
+ /// if reset is not success, the release will return sal_False
+ myMutexGuard.reset( );
+ sal_Bool bRes1 = aMutex.release( );
+ myThread.join( );
+
+ CPPUNIT_ASSERT_MESSAGE( "ResettableMutexGuard method: reset",
+ ( sal_True == bRes ) && ( sal_True == bRes1 ) );
+ }
+
+ void reset_002( )
+ {
+ Mutex aMutex;
+ ResettableMutexGuard myMutexGuard( &aMutex );
+
+ /// shouldn't release after clear;
+ myMutexGuard.clear( );
+ sal_Bool bRes = aMutex.release( );
+
+ /// can release after reset.
+ myMutexGuard.reset( );
+ sal_Bool bRes1 = aMutex.release( );
+
+ CPPUNIT_ASSERT_MESSAGE( "ResettableMutexGuard method: reset, release after clear and reset, on Solaris, the mutex can be release without aquire, so it can not passed on (SOLARIS), but not the reason for reset_002",
+ ( sal_False == bRes ) && ( sal_True == bRes1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE(reset);
+ CPPUNIT_TEST(reset_001);
+#ifdef LINUX
+ CPPUNIT_TEST(reset_002);
+#endif
+ CPPUNIT_TEST_SUITE_END();
+ }; // class reset
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_ResettableGuard::ctor);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_ResettableGuard::reset);
+} // namespace osl_ResettableGuard
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+// The following sets variables for GNU EMACS
+// Local Variables:
+// tab-width:4
+// End:
diff --git a/sal/qa/osl/mutex/osl_Mutex_Const.h b/sal/qa/osl/mutex/osl_Mutex_Const.h
new file mode 100755
index 000000000000..30d321775f01
--- /dev/null
+++ b/sal/qa/osl/mutex/osl_Mutex_Const.h
@@ -0,0 +1,56 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _OSL_MUTEX_CONST_H_
+#define _OSL_MUTEX_CONST_H_
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+
+#ifndef _OSL_THREAD_HXX
+#include <osl/thread.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX
+#include <osl/mutex.hxx>
+#endif
+#include <osl/time.h>
+
+#ifdef UNX
+#include <unistd.h>
+#endif
+
+#define BUFFER_SIZE 16
+
+
+#endif /* _OSL_MUTEX_CONST_H_ */
diff --git a/sal/qa/osl/pipe/makefile.mk b/sal/qa/osl/pipe/makefile.mk
new file mode 100644
index 000000000000..85452eac8655
--- /dev/null
+++ b/sal/qa/osl/pipe/makefile.mk
@@ -0,0 +1,70 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+.IF "$(OOO_SUBSEQUENT_TESTS)" == ""
+nothing .PHONY:
+.ELSE
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_osl_pipe
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Pipe by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/osl_Pipe.obj
+
+SHL1TARGET= osl_Pipe
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTLIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+SHL1RPATH = NONE
+# auto generated Target:Pipe
+# END ------------------------------------------------------------------
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
+.END
diff --git a/sal/qa/osl/pipe/osl_Pipe.cxx b/sal/qa/osl/pipe/osl_Pipe.cxx
new file mode 100644
index 000000000000..ffb9f314a5bf
--- /dev/null
+++ b/sal/qa/osl/pipe/osl_Pipe.cxx
@@ -0,0 +1,1060 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+
+#include "cppunit/TestAssert.h"
+#include "cppunit/TestFixture.h"
+#include "cppunit/extensions/HelperMacros.h"
+#include "cppunit/plugin/TestPlugIn.h"
+#include "test/uniquepipename.hxx"
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+
+#ifndef _OSL_THREAD_HXX
+#include <osl/thread.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX
+#include <osl/mutex.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX
+#include <osl/pipe.hxx>
+#endif
+#include <osl/time.h>
+
+#ifdef UNX
+#include <unistd.h>
+#endif
+#include <string.h>
+
+using namespace osl;
+using namespace rtl;
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+/** print Boolean value.
+ */
+inline void printBool( sal_Bool bOk )
+{
+ printf("#printBool# " );
+ ( sal_True == bOk ) ? printf("YES!\n" ): printf("NO!\n" );
+}
+
+/** print a UNI_CODE String.
+ */
+inline void printUString( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ printf("#printUString_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ printf("%s\n", aString.getStr( ) );
+}
+
+/** print last error of pipe system.
+ */
+inline void printPipeError( ::osl::Pipe aPipe )
+{
+ oslPipeError nError = aPipe.getError( );
+ printf("#printPipeError# " );
+ switch ( nError ) {
+ case osl_Pipe_E_None:
+ printf("Success!\n" );
+ break;
+ case osl_Pipe_E_NotFound:
+ printf("The returned error is: Not found!\n" );
+ break;
+ case osl_Pipe_E_AlreadyExists:
+ printf("The returned error is: Already exist!\n" );
+ break;
+ case osl_Pipe_E_NoProtocol:
+ printf("The returned error is: No protocol!\n" );
+ break;
+ case osl_Pipe_E_NetworkReset:
+ printf("The returned error is: Network reset!\n" );
+ break;
+ case osl_Pipe_E_ConnectionAbort:
+ printf("The returned error is: Connection aborted!\n" );
+ break;
+ case osl_Pipe_E_ConnectionReset:
+ printf("The returned error is: Connection reset!\n" );
+ break;
+ case osl_Pipe_E_NoBufferSpace:
+ printf("The returned error is: No buffer space!\n" );
+ break;
+ case osl_Pipe_E_TimedOut:
+ printf("The returned error is: Timeout!\n" );
+ break;
+ case osl_Pipe_E_ConnectionRefused:
+ printf("The returned error is: Connection refused!\n" );
+ break;
+ case osl_Pipe_E_invalidError:
+ printf("The returned error is: Invalid error!\n" );
+ break;
+ default:
+ printf("The returned error is: Number %d, Unknown Error\n", nError );
+ break;
+ }
+}
+
+
+
+//------------------------------------------------------------------------
+// pipe name and transfer contents
+//------------------------------------------------------------------------
+const rtl::OUString aTestPipeName = rtl::OUString::createFromAscii( "testpipe2" );
+const rtl::OUString aTestPipe1 = rtl::OUString::createFromAscii( "testpipe1" );
+const rtl::OUString aTestString = rtl::OUString::createFromAscii( "Sun Microsystems" );
+
+const OString m_pTestString1("Sun Microsystems");
+const OString m_pTestString2("test pipe PASS/OK");
+
+//------------------------------------------------------------------------
+// test code start here
+//------------------------------------------------------------------------
+
+namespace osl_Pipe
+{
+
+//------------------------------------------------------------------------
+// most return value -1 denote a fail of operation.
+//------------------------------------------------------------------------
+#define OSL_PIPE_FAIL -1
+
+ /** testing the methods:
+ inline Pipe();
+ inline Pipe(const ::rtl::OUString& strName, oslPipeOptions Options);
+ inline Pipe(const ::rtl::OUString& strName, oslPipeOptions Options,const Security & rSecurity);
+ inline Pipe(const Pipe& pipe);
+ inline Pipe(oslPipe pipe, __sal_NoAcquire noacquire );
+ inline Pipe(oslPipe Pipe);
+ */
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+ }
+
+ void ctors_none( )
+ {
+ ::osl::Pipe aPipe;
+ bRes = aPipe.is( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no parameter, yet no case to test.",
+ sal_False == bRes );
+ }
+
+ void ctors_name_option( )
+ {
+ /// create a named pipe.
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ ::osl::Pipe aAssignPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
+
+ bRes = aPipe.is( ) && aAssignPipe.is( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with name and option.",
+ sal_True == bRes );
+ }
+
+ void ctors_name_option_security( )
+ {
+ /// create a security pipe.
+ const ::osl::Security rSecurity;
+ ::osl::Pipe aSecurityPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSecurity );
+
+ bRes = aSecurityPipe.is( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with name, option and security, the test of security is not implemented yet.",
+ sal_True == bRes );
+ }
+
+ void ctors_copy( )
+ {
+ /// create a pipe.
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ /// create a pipe using copy constructor.
+ ::osl::Pipe aCopyPipe( aPipe );
+
+ bRes = aCopyPipe.is( ) && aCopyPipe == aPipe;
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test copy constructor.",
+ sal_True == bRes );
+ }
+
+ /** tester comment:
+
+ When test the following two constructors, don't know how to test the
+ acquire and no acquire action. possible plans:
+ 1.release one handle and check the other( did not success since the
+ other still exist and valid. )
+ 2. release one handle twice to see getLastError( )(the getLastError
+ always returns invalidError(LINUX)).
+ */
+
+ void ctors_no_acquire( )
+ {
+ /// create a pipe.
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ /// constructs a pipe reference without acquiring the handle.
+ ::osl::Pipe aNoAcquirePipe( aPipe.getHandle( ), SAL_NO_ACQUIRE );
+
+ bRes = aNoAcquirePipe.is( );
+ ///aPipe.clear( );
+ ///bRes1 = aNoAcquirePipe.is( );
+
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no aquire of handle, only validation test, do not know how to test no acquire.",
+ sal_True == bRes );
+ }
+
+ void ctors_acquire( )
+ {
+ /// create a base pipe.
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ /// constructs two pipes without acquiring the handle on the base pipe.
+ ::osl::Pipe aAcquirePipe( aPipe.getHandle( ) );
+ ::osl::Pipe aAcquirePipe1( NULL );
+
+ bRes = aAcquirePipe.is( );
+ bRes1 = aAcquirePipe1.is( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no aquire of handle.only validation test, do not know how to test no acquire.",
+ sal_True == bRes && sal_False == bRes1 );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_name_option );
+ CPPUNIT_TEST( ctors_name_option_security );
+ CPPUNIT_TEST( ctors_copy );
+ CPPUNIT_TEST( ctors_no_acquire );
+ CPPUNIT_TEST( ctors_acquire );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class ctors
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL is() const;
+ */
+ class is : public CppUnit::TestFixture
+ {
+ public:
+ void is_001( )
+ {
+ ::osl::Pipe aPipe;
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test is(), check if the pipe is a valid one.", sal_False == aPipe.is( ) );
+ }
+
+ void is_002( )
+ {
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test is(), a normal pipe creation.", sal_True == aPipe.is( ) );
+ }
+
+ void is_003( )
+ {
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ aPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test is(), an invalid case.", sal_False == aPipe.is( ) );
+ }
+
+ void is_004( )
+ {
+ ::osl::Pipe aPipe( NULL );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test is(), an invalid constructor.", sal_False == aPipe.is( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( is );
+ CPPUNIT_TEST( is_001 );
+ CPPUNIT_TEST( is_002 );
+ CPPUNIT_TEST( is_003 );
+ CPPUNIT_TEST( is_004 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class is
+
+
+ /** testing the methods:
+ inline sal_Bool create( const ::rtl::OUString & strName,
+ oslPipeOptions Options, const Security &rSec );
+ nline sal_Bool create( const ::rtl::OUString & strName,
+ oslPipeOptions Options = osl_Pipe_OPEN );
+ */
+ class create : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ /** tester comment:
+
+ security create only be tested creation, security section is
+ untested yet.
+ */
+
+ void create_named_security_001( )
+ {
+ const Security rSec;
+ ::osl::Pipe aPipe;
+ bRes = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSec );
+ bRes1 = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSec );
+ aPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test creation.",
+ sal_True == bRes && sal_False == bRes1);
+ }
+
+ void create_named_security_002( )
+ {
+ const Security rSec;
+ ::osl::Pipe aPipe, aPipe1;
+ bRes = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSec );
+ bRes1 = aPipe1.create( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN, rSec );
+ aPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test creation and open.",
+ sal_True == bRes && sal_True == bRes1);
+ }
+
+ void create_named_001( )
+ {
+ ::osl::Pipe aPipe;
+ bRes = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ bRes1 = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ aPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test creation.",
+ sal_True == bRes && sal_False == bRes1);
+ }
+
+ void create_named_002( )
+ {
+ ::osl::Pipe aPipe, aPipe1;
+ bRes = aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ bRes1 = aPipe1.create( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
+ aPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test creation and open.",
+ sal_True == bRes && sal_True == bRes1);
+ }
+
+ void create_named_003( )
+ {
+ ::osl::Pipe aPipe;
+ bRes = aPipe.create( test::uniquePipeName(aTestPipeName) );
+ aPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test default option is open.",
+ sal_False == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( create );
+ CPPUNIT_TEST( create_named_security_001 );
+ CPPUNIT_TEST( create_named_security_002 );
+ CPPUNIT_TEST( create_named_001 );
+ CPPUNIT_TEST( create_named_002 );
+ CPPUNIT_TEST( create_named_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class create
+
+
+ /** testing the method:
+ inline void SAL_CALL clear();
+ */
+ class clear : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void clear_001( )
+ {
+ ::osl::Pipe aPipe;
+ aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ aPipe.clear( );
+ bRes = aPipe.is( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test clear.",
+ sal_False == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( clear );
+ CPPUNIT_TEST( clear_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class clear
+
+
+ /** testing the methods:
+ inline Pipe& SAL_CALL operator= (const Pipe& pipe);
+ inline Pipe& SAL_CALL operator= (const oslPipe pipe );
+ */
+ class assign : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void assign_ref( )
+ {
+ ::osl::Pipe aPipe, aPipe1;
+ aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ aPipe1 = aPipe;
+ bRes = aPipe1.is( );
+ bRes1 = aPipe == aPipe1;
+ aPipe.close( );
+ aPipe1.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test assign with reference.",
+ sal_True == bRes && sal_True == bRes1 );
+ }
+
+ void assign_handle( )
+ {
+ ::osl::Pipe aPipe, aPipe1;
+ aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ aPipe1 = aPipe.getHandle( );
+ bRes = aPipe1.is( );
+ bRes1 = aPipe == aPipe1;
+ aPipe.close( );
+ aPipe1.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test assign with handle.",
+ sal_True == bRes && sal_True == bRes1 );
+ }
+
+ CPPUNIT_TEST_SUITE( assign );
+ CPPUNIT_TEST( assign_ref );
+ CPPUNIT_TEST( assign_handle );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class assign
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL isValid() const;
+ isValid( ) has not been implemented under the following platforms, please refer to osl/pipe.hxx
+ */
+ /*class isValid : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void isValid_001( )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: isValid() has not been implemented on all platforms.",
+ sal_False );
+ }
+
+ CPPUNIT_TEST_SUITE( isValid );
+ CPPUNIT_TEST( isValid_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };*/ // class isValid
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL operator==( const Pipe& rPipe ) const;
+ */
+ class isEqual : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void isEqual_001( )
+ {
+ ::osl::Pipe aPipe;
+ aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ bRes = aPipe == aPipe;
+ aPipe.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test isEqual(), compare its self.",
+ sal_True == bRes );
+ }
+
+ void isEqual_002( )
+ {
+ ::osl::Pipe aPipe, aPipe1, aPipe2;
+ aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+
+ aPipe1 = aPipe;
+ aPipe2.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+
+ bRes = aPipe == aPipe1;
+ bRes1 = aPipe == aPipe2;
+ aPipe.close( );
+ aPipe1.close( );
+ aPipe2.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test isEqual(),create one copy instance, and compare.",
+ sal_True == bRes && sal_False == bRes1 );
+ }
+
+ CPPUNIT_TEST_SUITE( isEqual );
+ CPPUNIT_TEST( isEqual_001 );
+ CPPUNIT_TEST( isEqual_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class isEqual
+
+
+ /** testing the method:
+ inline void SAL_CALL close();
+ */
+ class close : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void close_001( )
+ {
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipe1), osl_Pipe_CREATE );
+ aPipe.close( );
+ bRes = aPipe.is( );
+
+ aPipe.clear( );
+ bRes1 = aPipe.is( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: difference between close and clear.",
+ sal_True == bRes && sal_False == bRes1);
+ }
+
+ void close_002( )
+ {
+ ::osl::StreamPipe aPipe( test::uniquePipeName(aTestPipe1), osl_Pipe_CREATE );
+ aPipe.close( );
+ int nRet = aPipe.send( m_pTestString1.getStr(), 3 );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: use after close.",
+ OSL_PIPE_FAIL == nRet );
+ }
+
+ CPPUNIT_TEST_SUITE( close );
+ CPPUNIT_TEST( close_001 );
+ CPPUNIT_TEST( close_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class close
+
+
+ /** testing the method:
+ inline oslPipeError SAL_CALL accept(StreamPipe& Connection);
+ please refer to StreamPipe::recv
+ */
+ /* class accept : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void accept_001( )
+ {
+
+ // CPPUNIT_ASSERT_MESSAGE( "#test comment#: accept, untested.", 1 == 1 );
+ //CPPUNIT_ASSERT_STUB();
+ }
+
+ CPPUNIT_TEST_SUITE( accept );
+ CPPUNIT_TEST( accept_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };*/ // class accept
+
+
+ /** testing the method:
+ inline oslPipeError SAL_CALL getError() const;
+ */
+ class getError : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+ /*
+ PipeError[]= {
+ { 0, osl_Pipe_E_None }, // no error
+ { EPROTOTYPE, osl_Pipe_E_NoProtocol }, // Protocol wrong type for socket
+ { ENOPROTOOPT, osl_Pipe_E_NoProtocol }, // Protocol not available
+ { EPROTONOSUPPORT, osl_Pipe_E_NoProtocol }, // Protocol not supported
+ { ESOCKTNOSUPPORT, osl_Pipe_E_NoProtocol }, // Socket type not supported
+ { EPFNOSUPPORT, osl_Pipe_E_NoProtocol }, // Protocol family not supported
+ { EAFNOSUPPORT, osl_Pipe_E_NoProtocol }, // Address family not supported by
+ // protocol family
+ { ENETRESET, osl_Pipe_E_NetworkReset }, // Network dropped connection because
+ // of reset
+ { ECONNABORTED, osl_Pipe_E_ConnectionAbort }, // Software caused connection abort
+ { ECONNRESET, osl_Pipe_E_ConnectionReset }, // Connection reset by peer
+ { ENOBUFS, osl_Pipe_E_NoBufferSpace }, // No buffer space available
+ { ETIMEDOUT, osl_Pipe_E_TimedOut }, // Connection timed out
+ { ECONNREFUSED, osl_Pipe_E_ConnectionRefused }, // Connection refused
+ { -1, osl_Pipe_E_invalidError }
+ };
+ did not define osl_Pipe_E_NotFound, osl_Pipe_E_AlreadyExists
+ */
+
+ void getError_001( )
+ {
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
+ oslPipeError nError = aPipe.getError( );
+ printPipeError( aPipe );
+ aPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: open a non-exist pipe.",
+ nError != osl_Pipe_E_None );
+ }
+
+ void getError_002( )
+ {
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ ::osl::Pipe aPipe1( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ oslPipeError nError = aPipe.getError( );
+ printPipeError( aPipe );
+ aPipe.clear( );
+ aPipe1.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: create an already exist pipe.",
+ nError != osl_Pipe_E_None );
+ }
+
+ CPPUNIT_TEST_SUITE( getError );
+ CPPUNIT_TEST( getError_001 );
+ CPPUNIT_TEST( getError_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getError
+
+
+ /** testing the method:
+ inline oslPipe SAL_CALL getHandle() const;
+ */
+ class getHandle : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void getHandle_001( )
+ {
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
+ bRes = aPipe == aPipe.getHandle( );
+ aPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: one pipe should equal to its handle.",
+ sal_True == bRes );
+ }
+
+ void getHandle_002( )
+ {
+ ::osl::Pipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ ::osl::Pipe aPipe1( aPipe.getHandle( ) );
+ bRes = aPipe == aPipe1;
+ aPipe.clear( );
+ aPipe1.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: one pipe derived from another pipe's handle.",
+ sal_True == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( getHandle );
+ CPPUNIT_TEST( getHandle_001 );
+ CPPUNIT_TEST( getHandle_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getHandle
+
+
+// -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::ctors);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::is);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::create);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::clear);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::assign);
+//CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::isValid);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::isEqual);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::close);
+ //CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::accept);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::getError);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_Pipe::getHandle);
+// -----------------------------------------------------------------------------
+
+} // namespace osl_Pipe
+
+
+namespace osl_StreamPipe
+{
+
+ /** testing the methods:
+ inline StreamPipe();
+ inline StreamPipe(oslPipe Pipe);;
+ inline StreamPipe(const StreamPipe& Pipe);
+ inline StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options = osl_Pipe_OPEN);
+ inline StreamPipe(const ::rtl::OUString& strName, oslPipeOptions Options, const Security &rSec );
+ inline StreamPipe( oslPipe pipe, __sal_NoAcquire noacquire );
+ */
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void ctors_none( )
+ {
+ // create a pipe.
+ ::osl::StreamPipe aStreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ // create an unattached pipe.
+ ::osl::StreamPipe aStreamPipe1;
+ bRes = aStreamPipe1.is( );
+
+ // assign it and check.
+ aStreamPipe1 = aStreamPipe;
+ bRes1 = aStreamPipe1.is( );
+ aStreamPipe.clear( );
+ aStreamPipe1.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no parameter, before and after assign.",
+ sal_False == bRes && sal_True == bRes1 );
+ }
+
+ void ctors_handle( )
+ {
+ // create a pipe.
+ ::osl::StreamPipe aStreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ // create a pipe with last handle.
+ ::osl::StreamPipe aStreamPipe1( aStreamPipe.getHandle( ) );
+ bRes = aStreamPipe1.is( ) && aStreamPipe == aStreamPipe1;
+ aStreamPipe.clear( );
+ aStreamPipe1.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with other's handle.",
+ sal_True == bRes );
+ }
+
+ void ctors_copy( )
+ {
+ // create a pipe.
+ ::osl::StreamPipe aStreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ // create an unattached pipe.
+ ::osl::StreamPipe aStreamPipe1( aStreamPipe );
+ bRes = aStreamPipe1.is( ) && aStreamPipe == aStreamPipe1;
+ aStreamPipe.clear( );
+ aStreamPipe1.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test copy constructor.",
+ sal_True == bRes );
+ }
+
+ void ctors_name_option( )
+ {
+ // create a pipe.
+ ::osl::StreamPipe aStreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ // create an unattached pipe.
+ ::osl::StreamPipe aStreamPipe1( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN );
+ bRes = aStreamPipe1.is( ) && aStreamPipe.is( );
+ aStreamPipe.clear( );
+ aStreamPipe1.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with name and option.",
+ sal_True == bRes );
+ }
+
+ void ctors_name_option_security( )
+ {
+ /// create a security pipe.
+ const ::osl::Security rSecurity;
+ ::osl::StreamPipe aSecurityPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE, rSecurity );
+
+ bRes = aSecurityPipe.is( );
+ aSecurityPipe.clear( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with name, option and security, the test of security is not implemented yet.",
+ sal_True == bRes );
+ }
+
+ /** tester comment:
+
+ When test the following constructor, don't know how to test the
+ acquire and no acquire action. possible plans:
+ 1.release one handle and check the other( did not success since the
+ other still exist and valid. )
+ 2. release one handle twice to see getLastError( )(the getLastError
+ always returns invalidError(LINUX)).
+ */
+
+ void ctors_no_acquire( )
+ {
+ // create a pipe.
+ ::osl::StreamPipe aPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ // constructs a pipe reference without acquiring the handle.
+ ::osl::StreamPipe aNoAcquirePipe( aPipe.getHandle( ), SAL_NO_ACQUIRE );
+
+ bRes = aNoAcquirePipe.is( );
+ aPipe.clear( );
+ // bRes1 = aNoAcquirePipe.is( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test constructor with no aquire of handle, only validation test, do not know how to test no acquire.",
+ sal_True == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_handle );
+ CPPUNIT_TEST( ctors_copy );
+ CPPUNIT_TEST( ctors_name_option );
+ CPPUNIT_TEST( ctors_name_option_security );
+ CPPUNIT_TEST( ctors_no_acquire );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class ctors
+
+
+ /** testing the methods:
+ inline StreamPipe & SAL_CALL operator=(oslPipe Pipe);
+ inline StreamPipe& SAL_CALL operator=(const Pipe& pipe);
+ mindy: not implementated in osl/pipe.hxx, so remove the cases
+ */
+ /*
+ class assign : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void assign_ref( )
+ {
+ ::osl::StreamPipe aPipe, aPipe1;
+ aPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ aPipe1 = aPipe;
+ bRes = aPipe1.is( );
+ bRes1 = aPipe == aPipe1;
+ aPipe.close( );
+ aPipe1.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test assign with reference.",
+ sal_True == bRes && sal_True == bRes1 );
+ }
+
+ void assign_handle( )
+ {
+ ::osl::StreamPipe * pPipe = new ::osl::StreamPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ ::osl::StreamPipe * pAssignPipe = new ::osl::StreamPipe;
+ *pAssignPipe = pPipe->getHandle( );
+
+ bRes = pAssignPipe->is( );
+ bRes1 = ( *pPipe == *pAssignPipe );
+ pPipe->close( );
+
+ delete pAssignPipe;
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test assign with handle., seems not implemented under (LINUX)(W32)",
+ sal_True == bRes && sal_True == bRes1 );
+ }
+
+ CPPUNIT_TEST_SUITE( assign );
+ CPPUNIT_TEST( assign_ref );
+ CPPUNIT_TEST( assign_handle );
+ CPPUNIT_TEST_SUITE_END( );
+ };*/ // class assign
+
+
+ /** wait _nSec seconds.
+ */
+ void thread_sleep( sal_Int32 _nSec )
+ {
+ /// print statement in thread process must use fflush() to force display.
+ // printf("wait %d seconds. ", _nSec );
+ fflush(stdout);
+
+#ifdef WNT //Windows
+ Sleep( _nSec * 1000 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ sleep( _nSec );
+#endif
+ // printf("done\n" );
+ }
+ // test read/write & send/recv data to pipe
+ // -----------------------------------------------------------------------------
+
+ class Pipe_DataSink_Thread : public Thread
+ {
+ public:
+ sal_Char buf[256];
+ Pipe_DataSink_Thread( ) { }
+
+ ~Pipe_DataSink_Thread( )
+ {
+ }
+ protected:
+ void SAL_CALL run( )
+ {
+ sal_Int32 nChars = 0;
+
+ printf("open pipe\n");
+ ::osl::StreamPipe aSenderPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_OPEN ); // test::uniquePipeName(aTestPipeName) is a string = "TestPipe"
+ if ( aSenderPipe.is() == sal_False )
+ {
+ printf("pipe open failed! \n");
+ }
+ else
+ {
+ printf("read\n");
+ nChars = aSenderPipe.read( buf, m_pTestString1.getLength() + 1 );
+ if ( nChars < 0 )
+ {
+ printf("read failed! \n");
+ return;
+ }
+ printf("buffer is %s \n", buf);
+ printf("send\n");
+ nChars = aSenderPipe.send( m_pTestString2.getStr(), m_pTestString2.getLength() + 1 );
+ if ( nChars < 0 )
+ {
+ printf("client send failed! \n");
+ return;
+ }
+ }
+ }
+
+ };
+
+ // -----------------------------------------------------------------------------
+
+ class Pipe_DataSource_Thread : public Thread
+ {
+ public:
+ sal_Char buf[256];
+ //::osl::StreamPipe aListenPipe; //( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ ::osl::Pipe aListenPipe;
+ ::osl::StreamPipe aConnectionPipe;
+ Pipe_DataSource_Thread( )
+ {
+ printf("create pipe\n");
+ aListenPipe.create( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ }
+ ~Pipe_DataSource_Thread( )
+ {
+ aListenPipe.close();
+ }
+ protected:
+ void SAL_CALL run( )
+ {
+ //create pipe.
+ sal_Int32 nChars;
+ //::osl::StreamPipe aListenPipe( test::uniquePipeName(aTestPipeName), osl_Pipe_CREATE );
+ printf("listen\n");
+ if ( aListenPipe.is() == sal_False )
+ {
+ printf("pipe create failed! \n");
+ }
+ else
+ {
+ //::osl::StreamPipe aConnectionPipe;
+
+ //start server and wait for connection.
+ printf("accept\n");
+ if ( osl_Pipe_E_None != aListenPipe.accept( aConnectionPipe ) )
+ {
+ printf("pipe accept failed!");
+ return;
+ }
+ printf("write\n");
+ // write to pipe
+ nChars = aConnectionPipe.write( m_pTestString1.getStr(), m_pTestString1.getLength() + 1 );
+ if ( nChars < 0)
+ {
+ printf("server write failed! \n");
+ return;
+ }
+ printf("recv\n");
+ nChars = aConnectionPipe.recv( buf, 256 );
+
+ if ( nChars < 0)
+ {
+ printf("server receive failed! \n");
+ return;
+ }
+ //thread_sleep( 2 );
+ printf("received message is: %s\n", buf );
+ //aConnectionPipe.close();
+ }
+ }
+ };
+
+ /** testing the method: read/write/send/recv and Pipe::accept
+ */
+ class recv : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void recv_001( )
+ {
+ //launch threads.
+ Pipe_DataSource_Thread myDataSourceThread;
+ Pipe_DataSink_Thread myDataSinkThread;
+ myDataSourceThread.create( );
+ thread_sleep( 1 );
+ myDataSinkThread.create( );
+
+ //wait until the thread terminate
+ myDataSinkThread.join( );
+ myDataSourceThread.join( );
+
+ int nCompare1 = strcmp( myDataSinkThread.buf, m_pTestString1.getStr() );
+ int nCompare2 = strcmp( myDataSourceThread.buf, m_pTestString2.getStr() );
+ CPPUNIT_ASSERT_MESSAGE( "test send/recv/write/read.", nCompare1 == 0 && nCompare2 == 0 );
+ }
+ //close pipe when accept
+ void recv_002()
+ {
+ thread_sleep( 1 );
+
+ Pipe_DataSource_Thread myDataSourceThread;
+ Pipe_DataSink_Thread myDataSinkThread;
+ myDataSourceThread.create( );
+ thread_sleep( 1 );
+ myDataSourceThread.aListenPipe.close();
+ myDataSourceThread.join( );
+ //no condition judgement here, if the case could finish excuting within 1 or 2 seconds, it passes.
+ }
+
+ CPPUNIT_TEST_SUITE( recv );
+ CPPUNIT_TEST( recv_001 );
+ CPPUNIT_TEST( recv_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class recv
+
+// -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_StreamPipe::ctors);
+//CPPUNIT_TEST_SUITE_REGISTRATION(osl_StreamPipe::assign);
+ CPPUNIT_TEST_SUITE_REGISTRATION(osl_StreamPipe::recv);
+// -----------------------------------------------------------------------------
+
+} // namespace osl_StreamPipe
+
+CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sal/qa/osl/process/batch.bat b/sal/qa/osl/process/batch.bat
new file mode 100755
index 000000000000..7a47559e9b6e
--- /dev/null
+++ b/sal/qa/osl/process/batch.bat
@@ -0,0 +1,2 @@
+@echo off
+echo "Hello world" \ No newline at end of file
diff --git a/sal/qa/osl/process/export.exp b/sal/qa/osl/process/export.exp
new file mode 100644
index 000000000000..a13529da5876
--- /dev/null
+++ b/sal/qa/osl/process/export.exp
@@ -0,0 +1 @@
+registerAllTestFunction
diff --git a/sal/qa/osl/process/makefile.mk b/sal/qa/osl/process/makefile.mk
new file mode 100644
index 000000000000..e113ac86edee
--- /dev/null
+++ b/sal/qa/osl/process/makefile.mk
@@ -0,0 +1,108 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_osl_process
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:testjob by codegen.pl
+
+.IF "$(GUI)" == "WNT"
+ CFLAGS+=/Ob1
+.ENDIF
+
+SHL1OBJS= \
+ $(SLO)$/osl_Thread.obj
+
+SHL1TARGET= osl_Thread
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END ------------------------------------------------------------------
+
+#.IF "$(GUI)" == "WNT"
+
+SHL2OBJS=$(SLO)$/osl_process.obj
+SHL2TARGET=osl_process
+SHL2STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL2IMPLIB=i$(SHL2TARGET)
+SHL2DEF=$(MISC)$/$(SHL2TARGET).def
+DEF2NAME=$(SHL2TARGET)
+DEF2EXPORTFILE=export.exp
+
+# END ------------------------------------------------------------------
+
+OBJ3FILES=$(OBJ)$/osl_process_child.obj
+APP3TARGET=osl_process_child
+APP3OBJS=$(OBJ3FILES)
+
+# .IF "$(GUI)" == "UNX"
+# APP3STDLIBS=$(LB)$/libsal.so
+# .ENDIF
+# .IF "$(GUI)" == "WNT"
+# APP3STDLIBS=$(KERNEL32LIB) $(LB)$/isal.lib
+# .ENDIF
+APP3STDLIBS=$(SALLIB)
+
+#.ENDIF # "$(GUI)" == "WNT"
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+
+.IF "$(GUI)" == "OS2"
+
+SLOFILES=$(SHL2OBJS)
+
+.ELSE
+
+SLOFILES=$(SHL1OBJS) $(SHL2OBJS)
+
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/osl/process/osl_Thread.cxx b/sal/qa/osl/process/osl_Thread.cxx
new file mode 100644
index 000000000000..794fcc82f9c9
--- /dev/null
+++ b/sal/qa/osl/process/osl_Thread.cxx
@@ -0,0 +1,2344 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+#include <sal/types.h>
+
+#ifndef _RTL_USTRING_HXX_
+#include <rtl/string.hxx>
+#endif
+
+#ifndef _RTL_USTRING_HXX_
+#include <rtl/strbuf.hxx>
+#endif
+
+#ifndef _OSL_THREAD_HXX
+#include <osl/thread.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX
+#include <osl/mutex.hxx>
+#endif
+#include <osl/time.h>
+
+#include <testshl/simpleheader.hxx>
+
+using namespace osl;
+using namespace rtl;
+
+#ifdef UNX
+#include <unistd.h>
+#include <time.h>
+#endif
+// -----------------------------------------------------------------------------
+// Kleine Stopuhr
+class StopWatch {
+ TimeValue t1,t2; // Start und Stopzeit
+
+protected:
+ sal_Int32 m_nNanoSec;
+ sal_Int32 m_nSeconds;
+
+ bool m_bIsValid; // TRUE, wenn gestartet und gestoppt
+ bool m_bIsRunning; // TRUE, wenn gestartet.
+
+public:
+ StopWatch();
+ ~StopWatch() {}
+
+ void start(); // Startet Timer
+ void stop(); // Stoppt Timer
+
+ double getSeconds() const;
+ double getTenthSec() const;
+};
+
+// ================================= Stop Watch =================================
+
+// Eine kleine Stop-Uhr fuer den internen Gebrauch.
+// (c) Lars Langhans 29.12.1996 22:10
+
+StopWatch::StopWatch():m_bIsValid(false),m_bIsRunning(false) {}
+
+void StopWatch::start()
+{
+// pre: %
+// post: Start Timer
+
+ m_bIsValid = false;
+ m_bIsRunning = true;
+ osl_getSystemTime( &t1 );
+ t_print("# %d %d nsecs\n", t1.Seconds, t1.Nanosec);
+ // gettimeofday(&t1, 0);
+}
+
+void StopWatch::stop()
+{
+// pre: Timer should be started
+// post: Timer will stopped
+
+ // gettimeofday(&t2, 0); // Timer ausfragen
+ osl_getSystemTime( &t2 );
+ t_print("# %d %d nsecs\n", t2.Seconds, t2.Nanosec);
+
+ if (m_bIsRunning)
+ { // check ob gestartet.
+// LLA: old m_nNanoSec = static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
+// LLA: old m_nSeconds = static_cast<sal_Int32>(t2.Seconds) - static_cast<sal_Int32>(t1.Seconds);
+// LLA: old if (m_nNanoSec < 0)
+// LLA: old {
+// LLA: old m_nNanoSec += 1000000000;
+// LLA: old m_nSeconds -= 1;
+// LLA: old }
+ //m_nNanoSec = t2.Nanosec - t1.Nanosec;
+ m_nSeconds = static_cast<sal_Int32>(t2.Seconds) - static_cast<sal_Int32>(t1.Seconds);
+ if ( t2.Nanosec > t1.Nanosec )
+ m_nNanoSec = static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
+ else
+ {
+ m_nNanoSec = 1000000000 + static_cast<sal_Int32>(t2.Nanosec) - static_cast<sal_Int32>(t1.Nanosec);
+ m_nSeconds -= 1;
+ }
+ t_print("# %d %d nsecs\n", m_nSeconds, m_nNanoSec );
+ //if (m_nNanoSec < 0)
+ //{
+ //m_nNanoSec += 1000000000;
+ //m_nSeconds -= 1;
+ //}
+ m_bIsValid = true;
+ m_bIsRunning = false;
+ }
+}
+
+double StopWatch::getSeconds() const
+{
+// pre: gueltig = TRUE
+// BACK: Zeit in Sekunden.
+
+ double nValue = 0.0;
+ if (m_bIsValid)
+ {
+ nValue = double(m_nNanoSec) / 1000000000.0 + m_nSeconds; // milli micro nano
+ }
+ return nValue;
+}
+
+double StopWatch::getTenthSec() const
+{
+ double nValue = 0.0;
+ if (m_bIsValid)
+ {
+ nValue = double(m_nNanoSec) / 100000000.0 + m_nSeconds * 10;
+ }
+ return nValue ;
+}
+
+// -----------------------------------------------------------------------------
+template <class T>
+class ThreadSafeValue
+{
+ T m_nFlag;
+ Mutex m_aMutex;
+public:
+ ThreadSafeValue(T n = 0): m_nFlag(n) {}
+ T getValue()
+ {
+ //block if already acquired by another thread.
+ osl::MutexGuard g(m_aMutex);
+ return m_nFlag;
+ }
+ void addValue(T n)
+ {
+ //only one thread operate on the flag.
+ osl::MutexGuard g(m_aMutex);
+ m_nFlag += n;
+ }
+ void acquire() {m_aMutex.acquire();}
+ void release() {m_aMutex.release();}
+};
+
+// -----------------------------------------------------------------------------
+namespace ThreadHelper
+{
+ // typedef enum {
+ // QUIET=1,
+ // VERBOSE
+ // } eSleepVerboseMode;
+
+ void thread_sleep_tenth_sec(sal_Int32 _nTenthSec/*, eSleepVerboseMode nVerbose = VERBOSE*/)
+ {
+ // if (nVerbose == VERBOSE)
+ // {
+ // t_print("wait %d tenth seconds. ", _nTenthSec );
+ // fflush(stdout);
+ // }
+#ifdef WNT //Windows
+ Sleep(_nTenthSec * 100 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ TimeValue nTV;
+ nTV.Seconds = static_cast<sal_uInt32>( _nTenthSec/10 );
+ nTV.Nanosec = ( (_nTenthSec%10 ) * 100000000 );
+ osl_waitThread(&nTV);
+#endif
+ // if (nVerbose == VERBOSE)
+ // {
+ // t_print("done\n");
+ // }
+ }
+
+ void outputPriority(oslThreadPriority const& _aPriority)
+ {
+ // LLA: output the priority
+ if (_aPriority == osl_Thread_PriorityHighest)
+ {
+ t_print("Prio is High\n");
+ }
+ else if (_aPriority == osl_Thread_PriorityAboveNormal)
+ {
+ t_print("Prio is above normal\n");
+ }
+ else if (_aPriority == osl_Thread_PriorityNormal)
+ {
+ t_print("Prio is normal\n");
+ }
+ else if (_aPriority == osl_Thread_PriorityBelowNormal)
+ {
+ t_print("Prio is below normal\n");
+ }
+ else if (_aPriority == osl_Thread_PriorityLowest)
+ {
+ t_print("Prio is lowest\n");
+ }
+ else
+ {
+ t_print("Prio is unknown\n");
+ }
+ }
+}
+
+/** Simple thread for testing Thread-create.
+
+ Just add 1 of value 0, and after running, result is 1.
+ */
+class myThread : public Thread
+{
+ ThreadSafeValue<sal_Int32> m_aFlag;
+public:
+ sal_Int32 getValue() { return m_aFlag.getValue(); }
+protected:
+ /** guarded value which initialized 0
+
+ @see ThreadSafeValue
+ */
+ void SAL_CALL run()
+ {
+ while(schedule())
+ {
+ m_aFlag.addValue(1);
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ }
+ }
+
+public:
+
+ virtual void SAL_CALL suspend()
+ {
+ m_aFlag.acquire();
+ ::osl::Thread::suspend();
+ m_aFlag.release();
+ }
+
+ ~myThread()
+ {
+ if (isRunning())
+ {
+ t_print("error: not terminated.\n");
+ }
+ }
+
+};
+
+// -----------------------------------------------------------------------------
+/** Thread which has a flag add 1 every second until 20
+ */
+class OCountThread : public Thread
+{
+ ThreadSafeValue<sal_Int32> m_aFlag;
+public:
+ OCountThread()
+ {
+ m_nWaitSec = 0;
+ t_print("new OCountThread thread %d!\n", getIdentifier());
+ }
+ sal_Int32 getValue() { return m_aFlag.getValue(); }
+
+ void setWait(sal_Int32 nSec)
+ {
+ m_nWaitSec = nSec;
+ //m_bWait = sal_True;
+ }
+
+ virtual void SAL_CALL suspend()
+ {
+ m_aFlag.acquire();
+ ::osl::Thread::suspend();
+ m_aFlag.release();
+ }
+
+protected:
+ //sal_Bool m_bWait;
+ sal_Int32 m_nWaitSec;
+
+ void SAL_CALL run()
+ {
+ /// if the thread should terminate, schedule return false
+ while (m_aFlag.getValue() < 20 && schedule() == sal_True)
+ {
+ m_aFlag.addValue(1);
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ // TimeValue nTV;
+ // nTV.Seconds = 1;
+ // nTV.Nanosec = 0;
+ // wait(nTV);
+
+ if (m_nWaitSec != 0)
+ {
+ //ThreadHelper::thread_sleep_tenth_sec(m_nWaitSec * 10);
+ TimeValue nTV;
+ nTV.Seconds = m_nWaitSec / 10 ;
+ nTV.Nanosec = ( m_nWaitSec%10 ) * 100000000 ;
+ wait( nTV );
+ m_nWaitSec = 0;
+ }
+ }
+ }
+ void SAL_CALL onTerminated()
+ {
+ t_print("normally terminate this thread %d!\n", getIdentifier());
+ }
+public:
+
+ ~OCountThread()
+ {
+ if (isRunning())
+ {
+ t_print("error: not terminated.\n");
+ }
+ }
+
+};
+
+/** call suspend in the run method
+*/
+class OSuspendThread : public Thread
+{
+ ThreadSafeValue<sal_Int32> m_aFlag;
+public:
+ OSuspendThread(){ m_bSuspend = sal_False; }
+ sal_Int32 getValue() { return m_aFlag.getValue(); }
+ void setSuspend()
+ {
+ m_bSuspend = sal_True;
+ }
+ virtual void SAL_CALL suspend()
+ {
+ m_aFlag.acquire();
+ ::osl::Thread::suspend();
+ m_aFlag.release();
+ }
+protected:
+ sal_Bool m_bSuspend;
+ void SAL_CALL run()
+ {
+ //if the thread should terminate, schedule return false
+ while (schedule() == sal_True)
+ {
+ m_aFlag.addValue(1);
+
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ // m_bWait = sal_False;
+ // TimeValue nTV;
+ // nTV.Seconds = 1;
+ // nTV.Nanosec = 0;
+ // wait(nTV);
+ if (m_bSuspend == sal_True)
+ {
+ suspend();
+ m_bSuspend = sal_False;
+ }
+ }
+ }
+public:
+
+ ~OSuspendThread()
+ {
+ if (isRunning())
+ {
+ t_print("error: not terminated.\n");
+ }
+ }
+
+};
+
+/** no call schedule in the run method
+*/
+class ONoScheduleThread : public Thread
+{
+ ThreadSafeValue<sal_Int32> m_aFlag;
+public:
+ sal_Int32 getValue() { return m_aFlag.getValue(); }
+
+ virtual void SAL_CALL suspend()
+ {
+ m_aFlag.acquire();
+ ::osl::Thread::suspend();
+ m_aFlag.release();
+ }
+protected:
+ void SAL_CALL run()
+ {
+ while (m_aFlag.getValue() < 10)
+ {
+ m_aFlag.addValue(1);
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ // TimeValue nTV;
+ // nTV.Seconds = 1;
+ // nTV.Nanosec = 0;
+ // wait(nTV);
+ }
+ }
+ void SAL_CALL onTerminated()
+ {
+ t_print("normally terminate this thread %d!\n", getIdentifier());
+ }
+public:
+ ONoScheduleThread()
+ {
+ t_print("new thread id %d!\n", getIdentifier());
+ }
+ ~ONoScheduleThread()
+ {
+ if (isRunning())
+ {
+ t_print("error: not terminated.\n");
+ }
+ }
+
+};
+
+/**
+*/
+class OAddThread : public Thread
+{
+ ThreadSafeValue<sal_Int32> m_aFlag;
+public:
+ //oslThreadIdentifier m_id, m_CurId;
+ OAddThread(){}
+ sal_Int32 getValue() { return m_aFlag.getValue(); }
+
+ virtual void SAL_CALL suspend()
+ {
+ m_aFlag.acquire();
+ ::osl::Thread::suspend();
+ m_aFlag.release();
+ }
+protected:
+ void SAL_CALL run()
+ {
+ //if the thread should terminate, schedule return false
+ while (schedule() == sal_True)
+ {
+ m_aFlag.addValue(1);
+ }
+ }
+ void SAL_CALL onTerminated()
+ {
+ // t_print("normally terminate this thread %d!\n", getIdentifier());
+ }
+public:
+
+ ~OAddThread()
+ {
+ if (isRunning())
+ {
+ // t_print("error: not terminated.\n");
+ }
+ }
+
+};
+
+namespace osl_Thread
+{
+
+ void resumeAndWaitThread(Thread* _pThread)
+ {
+ // This functions starts a thread, wait a second and suspends the thread
+ // Due to the fact, that a suspend and never run thread never really exists.
+
+ // Note: on UNX, after createSuspended, and then terminate the thread, it performs well;
+ // while on Windows, after createSuspended, the thread can not terminate, wait endlessly,
+ // so here call resume at first, then call terminate.
+#ifdef WNT
+ t_print("resumeAndWaitThread\n");
+ _pThread->resume();
+ ThreadHelper::thread_sleep_tenth_sec(1);
+#else
+ _pThread->resume();
+#endif
+ // ThreadHelper::thread_sleep_tenth_sec(1);
+ // _pThread->suspend();
+ // ThreadHelper::thread_sleep_tenth_sec(1);
+ }
+
+ // kill a running thread and join it, if it has terminated, do nothing
+ void termAndJoinThread(Thread* _pThread)
+ {
+ _pThread->terminate();
+
+// LLA: Windows feature???, a suspended thread can not terminated, so we have to weak it up
+#ifdef WNT
+ _pThread->resume();
+ ThreadHelper::thread_sleep_tenth_sec(1);
+#endif
+ t_print("#wait for join.\n");
+ _pThread->join();
+ }
+/** Test of the osl::Thread::create method
+ */
+
+ class create : public CppUnit::TestFixture
+ {
+ public:
+
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** Simple create a thread.
+
+ Create a simple thread, it just does add 1 to value(which initialized 0),
+ if the thread run, the value should be 1.
+ */
+ void create_001()
+ {
+ myThread* newthread = new myThread();
+ sal_Bool bRes = newthread->create();
+ CPPUNIT_ASSERT_MESSAGE("Can not creates a new thread!\n", bRes == sal_True );
+
+ ThreadHelper::thread_sleep_tenth_sec(1); // wait short
+ sal_Bool isRunning = newthread->isRunning(); // check if thread is running
+ /// wait for the new thread to assure it has run
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ sal_Int32 nValue = newthread->getValue();
+ /// to assure the new thread has terminated
+ termAndJoinThread(newthread);
+ delete newthread;
+
+ t_print(" nValue = %d\n", nValue);
+ t_print("isRunning = %d\n", isRunning);
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Creates a new thread",
+ nValue >= 1 && isRunning == sal_True
+ );
+
+ }
+
+ /** only one running thread per instance, return false if create secondly
+ */
+ void create_002()
+ {
+ myThread* newthread = new myThread();
+ sal_Bool res1 = newthread->create();
+ sal_Bool res2 = newthread->create();
+ t_print("In non pro, an assertion should occured. This behaviour is right.\n");
+ termAndJoinThread(newthread);
+ delete newthread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Creates a new thread: can not create two threads per instance",
+ res1 && !res2
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE(create);
+ CPPUNIT_TEST(create_001);
+ CPPUNIT_TEST(create_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class create
+
+
+
+ /** Test of the osl::Thread::createSuspended method
+ */
+ class createSuspended : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** Create a suspended thread, use the same class as create_001
+
+ after create, wait enough time, check the value, if it's still the initial value, pass
+ */
+ void createSuspended_001()
+ {
+ myThread* newthread = new myThread();
+ sal_Bool bRes = newthread->createSuspended();
+ CPPUNIT_ASSERT_MESSAGE("Can not creates a new thread!", bRes == sal_True );
+
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ sal_Bool isRunning = newthread->isRunning();
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ sal_Int32 nValue = newthread->getValue();
+
+ resumeAndWaitThread(newthread);
+
+ termAndJoinThread(newthread);
+ delete newthread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Creates a new suspended thread",
+ nValue == 0 && isRunning
+ );
+ }
+
+ void createSuspended_002()
+ {
+ myThread* newthread = new myThread();
+ sal_Bool res1 = newthread->createSuspended();
+ sal_Bool res2 = newthread->createSuspended();
+
+ resumeAndWaitThread(newthread);
+
+ termAndJoinThread(newthread);
+
+ delete newthread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Creates a new thread: can not create two threads per instance",
+ res1 && !res2
+ );
+ }
+
+ CPPUNIT_TEST_SUITE(createSuspended);
+ CPPUNIT_TEST(createSuspended_001);
+ // LLA: Deadlocked!!!
+ CPPUNIT_TEST(createSuspended_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class createSuspended
+
+ /** when the count value equal to or more than 3, suspend the thread.
+ */
+ void suspendCountThread(OCountThread* _pCountThread)
+ {
+ sal_Int32 nValue = 0;
+ while (1)
+ {
+ nValue = _pCountThread->getValue();
+ if (nValue >= 3)
+ {
+ _pCountThread->suspend();
+ break;
+ }
+ }
+ }
+
+ /** Test of the osl::Thread::suspend method
+ */
+ class suspend : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** Use a thread which has a flag added 1 every second
+
+ ALGORITHM:
+ create the thread, after running special time, record value of flag, then suspend it,
+ wait a long time, check the flag, if it remains unchanged during suspending
+ */
+ void suspend_001()
+ {
+ OCountThread* aCountThread = new OCountThread();
+ sal_Bool bRes = aCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+ // the thread run for some seconds, but not terminate
+ suspendCountThread( aCountThread );
+
+ // the value just after calling suspend
+ sal_Int32 nValue = aCountThread->getValue(); // (2)
+
+ ThreadHelper::thread_sleep_tenth_sec(3);
+
+ // the value after waiting 3 seconds
+ sal_Int32 nLaterValue = aCountThread->getValue(); // (3)
+
+ resumeAndWaitThread(aCountThread);
+ termAndJoinThread(aCountThread);
+ delete aCountThread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Suspend the thread",
+ bRes == sal_True && nValue == nLaterValue
+ );
+
+ }
+ /** suspend a thread in it's worker-function, the ALGORITHM is same as suspend_001
+ reason of deadlocked I think: no schedule can schedule other threads to go on excuting
+ */
+ void suspend_002()
+ {
+ OSuspendThread* aThread = new OSuspendThread();
+ sal_Bool bRes = aThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+ // first the thread run for some seconds, but not terminate
+ sal_Int32 nValue = 0;
+ //while (1)
+ //{
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ nValue = aThread->getValue(); // (1)
+ t_print(" getValue is %d !", nValue );
+ if (nValue >= 2)
+ {
+ aThread->setSuspend();
+ //break;
+ }
+ //}
+ t_print(" after while!");
+ // the value just after calling suspend
+ nValue = aThread->getValue(); // (2)
+
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ t_print(" after sleep!");
+ // the value after waiting 3 seconds
+ sal_Int32 nLaterValue = aThread->getValue(); // (3)
+
+ //resumeAndWaitThread(aThread);
+ aThread->resume();
+ termAndJoinThread(aThread);
+ delete aThread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Suspend the thread",
+ bRes == sal_True && nValue == nLaterValue
+ );
+ }
+
+ CPPUNIT_TEST_SUITE(suspend);
+ CPPUNIT_TEST(suspend_001);
+ // LLA: Deadlocked!!!
+ // CPPUNIT_TEST(createSuspended_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class suspend
+
+ /** Test of the osl::Thread::resume method
+ */
+ class resume : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** check if the thread run samely as usual after suspend and resume
+
+ ALGORITHM:
+ compare the values before and after suspend, they should be same,
+ then compare values before and after resume, the difference should be same as the sleep seconds number
+ */
+ void resume_001()
+ {
+ OCountThread* pCountThread = new OCountThread();
+ sal_Bool bRes = pCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ suspendCountThread(pCountThread);
+
+ sal_Int32 nSuspendValue = pCountThread->getValue(); // (2)
+ // suspend for 3 seconds
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ pCountThread->resume();
+
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ sal_Int32 nResumeValue = pCountThread->getValue();
+
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ sal_Int32 nLaterValue = pCountThread->getValue();
+
+ termAndJoinThread(pCountThread);
+ delete pCountThread;
+
+ t_print("SuspendValue: %d\n", nSuspendValue);
+ t_print("ResumeValue: %d\n", nResumeValue);
+ t_print("LaterValue: %d\n", nLaterValue);
+
+ /* LLA: this assumption is no longer relevant: nResumeValue == nSuspendValue && */
+ CPPUNIT_ASSERT_MESSAGE(
+ "Suspend then resume the thread",
+ nLaterValue >= 9 &&
+ nResumeValue > nSuspendValue &&
+ nLaterValue > nResumeValue
+ );
+
+ }
+
+ /** Create a suspended thread then resume, check if the thread has run
+ */
+ void resume_002()
+ {
+ myThread* newthread = new myThread();
+ sal_Bool bRes = newthread->createSuspended();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't create thread!", bRes == sal_True );
+
+ newthread->resume();
+ ThreadHelper::thread_sleep_tenth_sec(2);
+ sal_Int32 nValue = newthread->getValue();
+
+ termAndJoinThread(newthread);
+ delete newthread;
+
+ t_print(" nValue = %d\n", nValue);
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Creates a suspended thread, then resume",
+ nValue >= 1
+ );
+ }
+
+ CPPUNIT_TEST_SUITE(resume);
+ CPPUNIT_TEST(resume_001);
+ CPPUNIT_TEST(resume_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class resume
+
+ /** Test of the osl::Thread::terminate method
+ */
+ class terminate : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** Check after call terminate if the running thread running go on executing
+
+ ALGORITHM:
+ before and after call terminate, the values should be the same
+ */
+ void terminate_001()
+ {
+ OCountThread* aCountThread = new OCountThread();
+ sal_Bool bRes = aCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ ThreadHelper::thread_sleep_tenth_sec(2);
+ sal_Int32 nValue = aCountThread->getValue();
+ aCountThread->terminate();
+ ThreadHelper::thread_sleep_tenth_sec(2);
+ sal_Int32 nLaterValue = aCountThread->getValue();
+
+ // isRunning should be false after terminate
+ sal_Bool isRunning = aCountThread->isRunning();
+ aCountThread->join();
+ delete aCountThread;
+
+ t_print(" nValue = %d\n", nValue);
+ t_print("nLaterValue = %d\n", nLaterValue);
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Terminate the thread",
+ isRunning == sal_False && nLaterValue >= nValue
+ );
+ }
+ /** Check if a suspended thread will terminate after call terminate, different on w32 and on UNX
+ */
+ void terminate_002()
+ {
+ OCountThread* aCountThread = new OCountThread();
+ sal_Bool bRes = aCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ suspendCountThread(aCountThread);
+ sal_Int32 nValue = aCountThread->getValue();
+
+ // seems a suspended thread can not be terminated on W32, while on Solaris can
+ resumeAndWaitThread(aCountThread);
+
+ ThreadHelper::thread_sleep_tenth_sec(2);
+
+ termAndJoinThread(aCountThread);
+ sal_Int32 nLaterValue = aCountThread->getValue();
+ delete aCountThread;
+
+ t_print(" nValue = %d\n", nValue);
+ t_print("nLaterValue = %d\n", nLaterValue);
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Suspend then resume the thread",
+ nLaterValue > nValue );
+ }
+
+ CPPUNIT_TEST_SUITE(terminate);
+ CPPUNIT_TEST(terminate_001);
+ CPPUNIT_TEST(terminate_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class terminate
+
+ /** Test of the osl::Thread::join method
+ */
+ class join : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** Check after call terminate if the thread running function will not go on executing
+
+ the next statement after join will not exec before the thread terminate
+ ALGORITHM:
+ recode system time at the beginning of the thread run, call join, then record system time again,
+ the difference of the two time should be equal or more than 20 seconds, the CountThead normally terminate
+ */
+ void join_001()
+ {
+ OCountThread *aCountThread = new OCountThread();
+ sal_Bool bRes = aCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ StopWatch aStopWatch;
+ aStopWatch.start();
+ // TimeValue aTimeVal_befor;
+ // osl_getSystemTime( &aTimeVal_befor );
+ //t_print("#join:the system time is %d,%d\n", pTimeVal_befor->Seconds,pTimeVal_befor->Nanosec);
+
+ aCountThread->join();
+
+ //the below line will be executed after aCountThread terminate
+ // TimeValue aTimeVal_after;
+ // osl_getSystemTime( &aTimeVal_after );
+ aStopWatch.stop();
+ // sal_uInt32 nSec = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
+ double nSec = aStopWatch.getSeconds();
+ t_print("join_001 nSec=%f\n", nSec);
+ delete aCountThread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Join the thread: after the thread terminate",
+ nSec >= 2
+ );
+
+ }
+ /** after terminated by another thread, join exited immediately
+
+ ALGORITHM:
+ terminate the thread when value>=3, call join, check the beginning time and time after join,
+ the difference should be 3 seconds, join costs little time
+ */
+ void join_002()
+ {
+ OCountThread *aCountThread = new OCountThread();
+ sal_Bool bRes = aCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ //record the time when the running begin
+ // TimeValue aTimeVal_befor;
+ // osl_getSystemTime( &aTimeVal_befor );
+ StopWatch aStopWatch;
+ aStopWatch.start();
+
+ ThreadHelper::thread_sleep_tenth_sec(10);
+ termAndJoinThread(aCountThread);
+
+ //the below line will be executed after aCountThread terminate
+ // TimeValue aTimeVal_after;
+ // osl_getSystemTime( &aTimeVal_after );
+ // sal_uInt32 nSec = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
+ aStopWatch.stop();
+ double nSec = aStopWatch.getSeconds();
+ t_print("join_002 nSec=%f\n", nSec);
+
+ delete aCountThread;
+ CPPUNIT_ASSERT_MESSAGE(
+ "Join the thread: after thread terminate by another thread",
+ nSec >= 1
+ );
+ }
+
+ CPPUNIT_TEST_SUITE(join);
+ CPPUNIT_TEST(join_001);
+ CPPUNIT_TEST(join_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class join
+
+ /** Test of the osl::Thread::isRunning method
+ */
+ class isRunning : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /**
+ */
+ void isRunning_001()
+ {
+ OCountThread *aCountThread = new OCountThread();
+ sal_Bool bRes = aCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ sal_Bool bRun = aCountThread->isRunning();
+
+ ThreadHelper::thread_sleep_tenth_sec(2);
+ termAndJoinThread(aCountThread);
+ sal_Bool bTer = aCountThread->isRunning();
+ delete aCountThread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Test isRunning",
+ bRun == sal_True && bTer == sal_False
+ );
+ }
+ /** check the value of isRunning when suspending and after resume
+ */
+ void isRunning_002()
+ {
+ OCountThread *aCountThread = new OCountThread();
+ sal_Bool bRes = aCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ // sal_Bool bRunning = aCountThread->isRunning();
+ // sal_Int32 nValue = 0;
+ suspendCountThread(aCountThread);
+
+ sal_Bool bRunning_sup = aCountThread->isRunning();
+ ThreadHelper::thread_sleep_tenth_sec(2);
+ aCountThread->resume();
+ ThreadHelper::thread_sleep_tenth_sec(2);
+ sal_Bool bRunning_res = aCountThread->isRunning();
+ termAndJoinThread(aCountThread);
+ sal_Bool bRunning_ter = aCountThread->isRunning();
+ delete aCountThread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Test isRunning",
+ bRes == sal_True &&
+ bRunning_sup == sal_True &&
+ bRunning_res == sal_True &&
+ bRunning_ter == sal_False
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE(isRunning);
+ CPPUNIT_TEST(isRunning_001);
+ CPPUNIT_TEST(isRunning_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class isRunning
+
+
+ /// check osl::Thread::setPriority
+ class setPriority : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ rtl::OString getPrioName(oslThreadPriority _aPriority)
+ {
+ rtl::OString sPrioStr;
+ switch (_aPriority)
+ {
+ case osl_Thread_PriorityHighest:
+ sPrioStr = "Highest";
+ break;
+
+ case osl_Thread_PriorityAboveNormal:
+ sPrioStr = "AboveNormal";
+
+ case osl_Thread_PriorityNormal:
+ sPrioStr = "Normal";
+
+ case osl_Thread_PriorityBelowNormal:
+ sPrioStr = "BelowNormal";
+ break;
+
+ case osl_Thread_PriorityLowest:
+ sPrioStr = "Lowest";
+ break;
+ default:
+ sPrioStr = "unknown";
+ }
+ return sPrioStr;
+ }
+
+
+ /** check 2 threads.
+
+ ALGORITHM:
+ Here the function should show, that 2 different threads,
+ which only increase a value, should run at the same time with same prio.
+ The test fails, if the difference between the two values is more than 5%
+ but IMHO this isn't a failure, it's only a feature of the OS.
+ */
+
+ void check2Threads(oslThreadPriority _aPriority)
+ {
+ // initial 5 threads with different priorities
+ OAddThread* pThread = new OAddThread();
+ OAddThread* p2Thread = new OAddThread();
+
+ //Create them and start running at the same time
+ pThread->create();
+ pThread->setPriority(_aPriority);
+ p2Thread->create();
+ p2Thread->setPriority(_aPriority);
+
+ ThreadHelper::thread_sleep_tenth_sec(5);
+
+ pThread->terminate();
+ p2Thread->terminate();
+
+ sal_Int32 nValueNormal = 0;
+ nValueNormal = pThread->getValue();
+
+ sal_Int32 nValueNormal2 = 0;
+ nValueNormal2 = p2Thread->getValue();
+
+ rtl::OString sPrio = getPrioName(_aPriority);
+ t_print("After 10 tenth seconds\n");
+
+ t_print("nValue in %s Prio Thread is %d\n",sPrio.getStr(), nValueNormal);
+ t_print("nValue in %s Prio Thread is %d\n", sPrio.getStr(), nValueNormal2);
+
+ // ThreadHelper::thread_sleep_tenth_sec(1);
+ pThread->join();
+ p2Thread->join();
+
+ delete pThread;
+ delete p2Thread;
+
+ sal_Int32 nDelta = abs(nValueNormal - nValueNormal2);
+ double nQuotient = std::max(nValueNormal, nValueNormal2);
+ CPPUNIT_ASSERT_MESSAGE(
+ "Quotient is zero, which means, there exist no right values.",
+ nQuotient != 0
+ );
+ double nDeltaPercent = nDelta / nQuotient * 100;
+
+ t_print("Delta value %d, percent %f\n",nDelta, nDeltaPercent);
+
+ // LLA: it's not a bug if the current OS is not able to handle thread scheduling right and good.
+ // like Windows XP
+ // LLA: CPPUNIT_ASSERT_MESSAGE(
+ // LLA: "Run 2 normal threads, the count diff more than 5 percent.",
+ // LLA: nDeltaPercent <= 5
+ // LLA: );
+ }
+
+ void setPriority_001_1()
+ {
+ check2Threads(osl_Thread_PriorityHighest);
+ }
+ void setPriority_001_2()
+ {
+ check2Threads(osl_Thread_PriorityAboveNormal);
+ }
+ void setPriority_001_3()
+ {
+ check2Threads(osl_Thread_PriorityNormal);
+ }
+ void setPriority_001_4()
+ {
+ check2Threads(osl_Thread_PriorityBelowNormal);
+ }
+ void setPriority_001_5()
+ {
+ check2Threads(osl_Thread_PriorityLowest);
+ }
+
+ void setPriority_002()
+ {
+ // initial 5 threads with different priorities
+
+ OAddThread aHighestThread;
+ OAddThread aAboveNormalThread;
+ OAddThread aNormalThread;
+ //OAddThread *aBelowNormalThread = new OAddThread();
+ //OAddThread *aLowestThread = new OAddThread();
+
+ //Create them and start running at the same time
+ aHighestThread.createSuspended();
+ aHighestThread.setPriority(osl_Thread_PriorityHighest);
+
+ aAboveNormalThread.createSuspended();
+ aAboveNormalThread.setPriority(osl_Thread_PriorityAboveNormal);
+
+ aNormalThread.createSuspended();
+ aNormalThread.setPriority(osl_Thread_PriorityNormal);
+ /*aBelowNormalThread->create();
+ aBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
+ aLowestThread->create();
+ aLowestThread->setPriority(osl_Thread_PriorityLowest);
+ */
+
+ aHighestThread.resume();
+ aAboveNormalThread.resume();
+ aNormalThread.resume();
+
+ ThreadHelper::thread_sleep_tenth_sec(5);
+
+ aHighestThread.suspend();
+ aAboveNormalThread.suspend();
+ aNormalThread.suspend();
+
+ termAndJoinThread(&aNormalThread);
+ termAndJoinThread(&aAboveNormalThread);
+ termAndJoinThread(&aHighestThread);
+ //aBelowNormalThread->terminate();
+ //aLowestThread->terminate();
+
+ sal_Int32 nValueHighest = 0;
+ nValueHighest = aHighestThread.getValue();
+
+ sal_Int32 nValueAboveNormal = 0;
+ nValueAboveNormal = aAboveNormalThread.getValue();
+
+ sal_Int32 nValueNormal = 0;
+ nValueNormal = aNormalThread.getValue();
+
+ // sal_Int32 nValueBelowNormal = 0;
+ //nValueBelowNormal = aBelowNormalThread->getValue();
+ // sal_Int32 nValueLowest = 0;
+ //nValueLowest = aLowestThread->getValue();
+ t_print("After 10 tenth seconds\n");
+ t_print("nValue in Highest Prio Thread is %d\n",nValueHighest);
+ t_print("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
+ t_print("nValue in Normal Prio Thread is %d\n",nValueNormal);
+
+ // LLA: this is not a save test, so we only check if all values not zero
+ // LLA: CPPUNIT_ASSERT_MESSAGE(
+ // LLA: "SetPriority",
+ // LLA: nValueHighest >= nValueAboveNormal &&
+ // LLA: nValueAboveNormal >= nValueNormal &&
+ // LLA: nValueNormal > 0
+ // LLA: );
+
+// LLA: windows let starve threads with lower priority
+#ifndef WNT
+ CPPUNIT_ASSERT_MESSAGE(
+ "SetPriority",
+ nValueHighest > 0 &&
+ nValueAboveNormal > 0 &&
+ nValueNormal > 0
+ );
+#endif
+ }
+
+ void setPriority_003()
+ {
+ // initial 5 threads with different priorities
+ OAddThread *pHighestThread = new OAddThread();
+ OAddThread *pAboveNormalThread = new OAddThread();
+ OAddThread *pNormalThread = new OAddThread();
+ OAddThread *pBelowNormalThread = new OAddThread();
+ OAddThread *pLowestThread = new OAddThread();
+
+ //Create them and start running at the same time
+ pHighestThread->createSuspended();
+ pHighestThread->setPriority(osl_Thread_PriorityHighest);
+
+ pAboveNormalThread->createSuspended();
+ pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
+
+ pNormalThread->createSuspended();
+ pNormalThread->setPriority(osl_Thread_PriorityNormal);
+
+ pBelowNormalThread->createSuspended();
+ pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
+
+ pLowestThread->createSuspended();
+ pLowestThread->setPriority(osl_Thread_PriorityLowest);
+
+ pHighestThread->resume();
+ pAboveNormalThread->resume();
+ pNormalThread->resume();
+ pBelowNormalThread->resume();
+ pLowestThread->resume();
+
+ ThreadHelper::thread_sleep_tenth_sec(5);
+
+ pHighestThread->suspend();
+ pAboveNormalThread->suspend();
+ pNormalThread->suspend();
+ pBelowNormalThread->suspend();
+ pLowestThread->suspend();
+
+ termAndJoinThread(pHighestThread);
+ termAndJoinThread(pAboveNormalThread);
+ termAndJoinThread(pNormalThread);
+ termAndJoinThread(pBelowNormalThread);
+ termAndJoinThread(pLowestThread);
+
+ sal_Int32 nValueHighest = 0;
+ nValueHighest = pHighestThread->getValue();
+
+ sal_Int32 nValueAboveNormal = 0;
+ nValueAboveNormal = pAboveNormalThread->getValue();
+
+ sal_Int32 nValueNormal = 0;
+ nValueNormal = pNormalThread->getValue();
+
+ sal_Int32 nValueBelowNormal = 0;
+ nValueBelowNormal = pBelowNormalThread->getValue();
+
+ sal_Int32 nValueLowest = 0;
+ nValueLowest = pLowestThread->getValue();
+
+ t_print("After 10 tenth seconds\n");
+ t_print("nValue in Highest Prio Thread is %d\n",nValueHighest);
+ t_print("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
+ t_print("nValue in Normal Prio Thread is %d\n",nValueNormal);
+ t_print("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
+ t_print("nValue in Lowest Prio Thread is %d\n",nValueLowest);
+
+ delete pHighestThread;
+ delete pAboveNormalThread;
+ delete pNormalThread;
+ delete pBelowNormalThread;
+ delete pLowestThread;
+
+ // LLA: this is not a save test, so we only check if all values not zero
+ // LLA: CPPUNIT_ASSERT_MESSAGE(
+ // LLA: "SetPriority",
+ // LLA: nValueHighest > nValueAboveNormal &&
+ // LLA: nValueAboveNormal > nValueNormal &&
+ // LLA: nValueNormal > nValueBelowNormal &&
+ // LLA: nValueBelowNormal > nValueLowest &&
+ // LLA: nValueLowest > 0
+ // LLA: );
+
+// LLA: windows let starve threads with lower priority
+#ifndef WNT
+ CPPUNIT_ASSERT_MESSAGE(
+ "SetPriority",
+ nValueHighest > 0 &&
+ nValueAboveNormal > 0 &&
+ nValueNormal > 0 &&
+ nValueBelowNormal > 0 &&
+ nValueLowest > 0
+ );
+#endif
+ }
+
+ void setPriority_004()
+ {
+ // initial 5 threads with different priorities
+ // OAddThread *pHighestThread = new OAddThread();
+ OAddThread *pAboveNormalThread = new OAddThread();
+ OAddThread *pNormalThread = new OAddThread();
+ OAddThread *pBelowNormalThread = new OAddThread();
+ OAddThread *pLowestThread = new OAddThread();
+
+ //Create them and start running at the same time
+ // pHighestThread->createSuspended();
+ // pHighestThread->setPriority(osl_Thread_PriorityHighest);
+
+ pAboveNormalThread->createSuspended();
+ pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
+
+ pNormalThread->createSuspended();
+ pNormalThread->setPriority(osl_Thread_PriorityNormal);
+
+ pBelowNormalThread->createSuspended();
+ pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
+
+ pLowestThread->createSuspended();
+ pLowestThread->setPriority(osl_Thread_PriorityLowest);
+
+ // pHighestThread->resume();
+ pAboveNormalThread->resume();
+ pNormalThread->resume();
+ pBelowNormalThread->resume();
+ pLowestThread->resume();
+
+ ThreadHelper::thread_sleep_tenth_sec(5);
+
+ // pHighestThread->suspend();
+ pAboveNormalThread->suspend();
+ pNormalThread->suspend();
+ pBelowNormalThread->suspend();
+ pLowestThread->suspend();
+
+ // termAndJoinThread(pHighestThread);
+ termAndJoinThread(pAboveNormalThread);
+ termAndJoinThread(pNormalThread);
+ termAndJoinThread(pBelowNormalThread);
+ termAndJoinThread(pLowestThread);
+
+ // sal_Int32 nValueHighest = 0;
+ // nValueHighest = pHighestThread->getValue();
+
+ sal_Int32 nValueAboveNormal = 0;
+ nValueAboveNormal = pAboveNormalThread->getValue();
+
+ sal_Int32 nValueNormal = 0;
+ nValueNormal = pNormalThread->getValue();
+
+ sal_Int32 nValueBelowNormal = 0;
+ nValueBelowNormal = pBelowNormalThread->getValue();
+
+ sal_Int32 nValueLowest = 0;
+ nValueLowest = pLowestThread->getValue();
+
+ t_print("After 5 tenth seconds\n");
+ // t_print("nValue in Highest Prio Thread is %d\n",nValueHighest);
+ t_print("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
+ t_print("nValue in Normal Prio Thread is %d\n",nValueNormal);
+ t_print("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
+ t_print("nValue in Lowest Prio Thread is %d\n",nValueLowest);
+
+ // delete pHighestThread;
+ delete pAboveNormalThread;
+ delete pNormalThread;
+ delete pBelowNormalThread;
+ delete pLowestThread;
+
+ // LLA: this is not a save test, so we only check if all values not zero
+ // LLA: CPPUNIT_ASSERT_MESSAGE(
+ // LLA: "SetPriority",
+ // LLA: nValueHighest > nValueAboveNormal &&
+ // LLA: nValueAboveNormal > nValueNormal &&
+ // LLA: nValueNormal > nValueBelowNormal &&
+ // LLA: nValueBelowNormal > nValueLowest &&
+ // LLA: nValueLowest > 0
+ // LLA: );
+
+// LLA: windows let starve threads with lower priority
+#ifndef WNT
+ CPPUNIT_ASSERT_MESSAGE(
+ "SetPriority",
+ /* nValueHighest > 0 && */
+ nValueAboveNormal > 0 &&
+ nValueNormal > 0 &&
+ nValueBelowNormal > 0 &&
+ nValueLowest > 0
+ );
+#endif
+ }
+ void setPriority_005()
+ {
+ // initial 5 threads with different priorities
+ // OAddThread *pHighestThread = new OAddThread();
+ // OAddThread *pAboveNormalThread = new OAddThread();
+ OAddThread *pNormalThread = new OAddThread();
+ OAddThread *pBelowNormalThread = new OAddThread();
+ OAddThread *pLowestThread = new OAddThread();
+
+ //Create them and start running at the same time
+ // pHighestThread->createSuspended();
+ // pHighestThread->setPriority(osl_Thread_PriorityHighest);
+
+ // pAboveNormalThread->createSuspended();
+ // pAboveNormalThread->setPriority(osl_Thread_PriorityAboveNormal);
+
+ pNormalThread->createSuspended();
+ pNormalThread->setPriority(osl_Thread_PriorityNormal);
+
+ pBelowNormalThread->createSuspended();
+ pBelowNormalThread->setPriority(osl_Thread_PriorityBelowNormal);
+
+ pLowestThread->createSuspended();
+ pLowestThread->setPriority(osl_Thread_PriorityLowest);
+
+ // pHighestThread->resume();
+ // pAboveNormalThread->resume();
+ pNormalThread->resume();
+ pBelowNormalThread->resume();
+ pLowestThread->resume();
+
+ ThreadHelper::thread_sleep_tenth_sec(5);
+
+ // pHighestThread->suspend();
+ // pAboveNormalThread->suspend();
+ pNormalThread->suspend();
+ pBelowNormalThread->suspend();
+ pLowestThread->suspend();
+
+ // termAndJoinThread(pHighestThread);
+ // termAndJoinThread(pAboveNormalThread);
+ termAndJoinThread(pNormalThread);
+ termAndJoinThread(pBelowNormalThread);
+ termAndJoinThread(pLowestThread);
+
+ // sal_Int32 nValueHighest = 0;
+ // nValueHighest = pHighestThread->getValue();
+
+ // sal_Int32 nValueAboveNormal = 0;
+ // nValueAboveNormal = pAboveNormalThread->getValue();
+
+ sal_Int32 nValueNormal = 0;
+ nValueNormal = pNormalThread->getValue();
+
+ sal_Int32 nValueBelowNormal = 0;
+ nValueBelowNormal = pBelowNormalThread->getValue();
+
+ sal_Int32 nValueLowest = 0;
+ nValueLowest = pLowestThread->getValue();
+
+ t_print("After 5 tenth seconds\n");
+ // t_print("nValue in Highest Prio Thread is %d\n",nValueHighest);
+ // t_print("nValue in AboveNormal Prio Thread is %d\n",nValueAboveNormal);
+ t_print("nValue in Normal Prio Thread is %d\n",nValueNormal);
+ t_print("nValue in BelowNormal Prio Thread is %d\n",nValueBelowNormal);
+ t_print("nValue in Lowest Prio Thread is %d\n",nValueLowest);
+
+ // delete pHighestThread;
+ // delete pAboveNormalThread;
+ delete pNormalThread;
+ delete pBelowNormalThread;
+ delete pLowestThread;
+
+ // LLA: this is not a save test, so we only check if all values not zero
+ // LLA: CPPUNIT_ASSERT_MESSAGE(
+ // LLA: "SetPriority",
+ // LLA: nValueHighest > nValueAboveNormal &&
+ // LLA: nValueAboveNormal > nValueNormal &&
+ // LLA: nValueNormal > nValueBelowNormal &&
+ // LLA: nValueBelowNormal > nValueLowest &&
+ // LLA: nValueLowest > 0
+ // LLA: );
+
+// LLA: windows let starve threads with lower priority
+#ifndef WNT
+ CPPUNIT_ASSERT_MESSAGE(
+ "SetPriority",
+ /* nValueHighest > 0 && */
+ /* nValueAboveNormal > 0 && */
+ nValueNormal > 0 &&
+ nValueBelowNormal > 0 &&
+ nValueLowest > 0
+ );
+#endif
+ }
+
+
+ CPPUNIT_TEST_SUITE(setPriority);
+#ifndef SOLARIS
+ CPPUNIT_TEST(setPriority_002);
+ CPPUNIT_TEST(setPriority_003);
+ CPPUNIT_TEST(setPriority_004);
+ CPPUNIT_TEST(setPriority_005);
+#endif
+ CPPUNIT_TEST(setPriority_001_1);
+ CPPUNIT_TEST(setPriority_001_2);
+ CPPUNIT_TEST(setPriority_001_3);
+ CPPUNIT_TEST(setPriority_001_4);
+ CPPUNIT_TEST(setPriority_001_5);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class setPriority
+
+ /** Test of the osl::Thread::getPriority method
+ */
+ class getPriority : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void getPriority_001()
+ {
+ OAddThread *pHighestThread = new OAddThread();
+
+ //Create them and start running at the same time
+ pHighestThread->create();
+ pHighestThread->setPriority(osl_Thread_PriorityHighest);
+
+ oslThreadPriority aPriority = pHighestThread->getPriority();
+ termAndJoinThread(pHighestThread);
+ delete pHighestThread;
+
+ ThreadHelper::outputPriority(aPriority);
+
+// LLA: Priority settings may not work within some OS versions.
+#if ( defined WNT ) || ( defined SOLARIS )
+ CPPUNIT_ASSERT_MESSAGE(
+ "getPriority",
+ aPriority == osl_Thread_PriorityHighest
+ );
+#else
+// LLA: Linux
+// NO_PTHREAD_PRIORITY ???
+ CPPUNIT_ASSERT_MESSAGE(
+ "getPriority",
+ aPriority == osl_Thread_PriorityNormal
+ );
+#endif
+ }
+
+ void getPriority_002()
+ {
+
+ }
+
+ CPPUNIT_TEST_SUITE(getPriority);
+ CPPUNIT_TEST(getPriority_001);
+ CPPUNIT_TEST(getPriority_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class getPriority
+
+
+ class getIdentifier : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void getIdentifier_001()
+ {
+
+ }
+
+ void getIdentifier_002()
+ {
+
+ }
+
+ CPPUNIT_TEST_SUITE(getIdentifier);
+ CPPUNIT_TEST(getIdentifier_001);
+ CPPUNIT_TEST(getIdentifier_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class getIdentifier
+
+ /** Test of the osl::Thread::getCurrentIdentifier method
+ */
+ class getCurrentIdentifier : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void getCurrentIdentifier_001()
+ {
+ oslThreadIdentifier oId;
+ OCountThread* pCountThread = new OCountThread;
+ //OCountThread* pCountThread2 = new OCountThread;
+ pCountThread->create();
+ //pCountThread2->create();
+ pCountThread->setWait(3);
+ oId = Thread::getCurrentIdentifier();
+ oslThreadIdentifier oIdChild = pCountThread->getIdentifier();
+ //t_print("CurrentId is %ld, Child1 id is %ld, Child2 id is %ld\n",oId, oIdChild,pCountThread2->m_id );
+ termAndJoinThread(pCountThread);
+ delete pCountThread;
+ //termAndJoinThread(pCountThread2);
+ //delete pCountThread2;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Get the identifier for the current active thread.",
+ oId != oIdChild
+ );
+
+ }
+
+ void getCurrentIdentifier_002()
+ {
+ }
+
+ CPPUNIT_TEST_SUITE(getCurrentIdentifier);
+ CPPUNIT_TEST(getCurrentIdentifier_001);
+ //CPPUNIT_TEST(getCurrentIdentifier_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class getCurrentIdentifier
+
+ /** Test of the osl::Thread::wait method
+ */
+ class wait : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** call wait in the run method
+
+ ALGORITHM:
+ tested thread wait nWaitSec seconds, main thread sleep (2) seconds,
+ then terminate the tested thread, due to the fact that the thread do a sleep(1) + wait(5)
+ it's finish after 6 seconds.
+ */
+ void wait_001()
+ {
+ OCountThread *aCountThread = new OCountThread();
+ sal_Int32 nWaitSec = 5;
+ aCountThread->setWait(nWaitSec);
+ // thread runs at least 5 seconds.
+ sal_Bool bRes = aCountThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ //record the time when the running begin
+ StopWatch aStopWatch;
+ aStopWatch.start();
+
+ // wait a little bit, to let the thread the time, to start
+ ThreadHelper::thread_sleep_tenth_sec( 4 );
+
+ // if wait works,
+ // this function returns, after 4 sec. later
+ termAndJoinThread(aCountThread);
+
+ // value should be one.
+ sal_Int32 nValue = aCountThread->getValue();
+
+ aStopWatch.stop();
+
+ // sal_uInt32 nSec = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
+ double nTenthSec = aStopWatch.getTenthSec();
+ double nSec = aStopWatch.getSeconds();
+ delete aCountThread;
+ t_print("nTenthSec = %f \n", nTenthSec);
+ t_print("nSec = %f \n", nSec);
+ t_print("nValue = %d \n", nValue);
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Wait: Blocks the calling thread for the given number of time.",
+ nTenthSec >= 5 && nValue == 1
+ );
+
+ }
+// LLA: wait_001 does the same.
+// LLA: /** wait then terminate the thread
+// LLA:
+// LLA: ALGORITHM:
+// LLA: wait nWaitSec seconds, and terminate when the wait does not finish
+// LLA: Windows & UNX: thread terminates immediatlly
+// LLA: */
+// LLA: void wait_002()
+// LLA: {
+// LLA: OCountThread aThread;
+// LLA:
+// LLA: sal_Int32 nWaitSec = 3;
+// LLA: aThread.setWait(nWaitSec);
+// LLA:
+// LLA: sal_Bool bRes = aThread.create();
+// LLA: CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+// LLA:
+// LLA: StopWatch aStopWatch;
+// LLA: // TimeValue aTimeVal_befor;
+// LLA: // osl_getSystemTime( &aTimeVal_befor );
+// LLA: aStopWatch.start();
+// LLA:
+// LLA: termAndJoinThread(&aThread);
+// LLA: sal_Int32 nValue = aThread.getValue();
+// LLA:
+// LLA: // TimeValue aTimeVal_after;
+// LLA: // osl_getSystemTime( &aTimeVal_after );
+// LLA: aStopWatch.stop();
+// LLA: // sal_Int32 nSec = aTimeVal_after.Seconds - aTimeVal_befor.Seconds;
+// LLA: double nSec = aStopWatch.getSeconds();
+// LLA: t_print("sec=%f\n", nSec);
+// LLA: t_print("nValue = %d\n", nValue);
+// LLA:
+// LLA: CPPUNIT_ASSERT_MESSAGE(
+// LLA: "Wait: Blocks the calling thread for the given number of time.",
+// LLA: nSec < 1 && nValue == 0
+// LLA: );
+// LLA: }
+
+ CPPUNIT_TEST_SUITE(wait);
+ CPPUNIT_TEST(wait_001);
+ // LLA: CPPUNIT_TEST(wait_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class wait
+
+ /** osl::Thread::yield method: can not design good test scenario to test up to now
+ */
+ class yield : public CppUnit::TestFixture
+ {
+ public:
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void yield_001()
+ {
+ }
+
+
+ CPPUNIT_TEST_SUITE(yield);
+ CPPUNIT_TEST(yield_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class yield
+
+ /** Test of the osl::Thread::schedule method
+ */
+ class schedule : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** The requested thread will get terminate the next time schedule() is called.
+
+ Note: on UNX, if call suspend thread is not the to be suspended thread, the to be
+ suspended thread will get suspended the next time schedule() is called,
+ while on w32, it's nothing with schedule.
+
+ check if suspend and terminate work well via schedule
+ */
+ void schedule_001()
+ {
+ OAddThread* aThread = new OAddThread();
+ sal_Bool bRes = aThread->create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ ThreadHelper::thread_sleep_tenth_sec(2);
+ aThread->suspend();
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ sal_Int32 nValue = aThread->getValue();
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ sal_Int32 nLaterValue = aThread->getValue();
+ // resumeAndWaitThread(aThread);
+ t_print(" value = %d\n", nValue);
+ t_print("later value = %d\n", nLaterValue);
+ // if value and latervalue not equal, than the thread would not suspended
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Schedule: suspend works.",
+ nLaterValue == nValue
+ );
+
+ aThread->resume();
+ ThreadHelper::thread_sleep_tenth_sec(2);
+
+ aThread->terminate();
+ sal_Int32 nValue_term = aThread->getValue();
+
+ aThread->join();
+ sal_Int32 nValue_join = aThread->getValue();
+
+ t_print("value after term = %d\n", nValue_term);
+ t_print("value after join = %d\n", nValue_join);
+
+ // nValue_term and nValue_join should be the same
+ // but should be differ from nValue
+
+ delete aThread;
+ //check if thread really terminate after call terminate, if join immediatlly return
+ CPPUNIT_ASSERT_MESSAGE(
+ "Schedule: Returns False if the thread should terminate.",
+ nValue_join - nValue_term <= 1 && nValue_join - nValue_term >= 0
+ );
+
+ }
+
+ /** design a thread that has not call schedule in the workfunction--run method
+ */
+ void schedule_002()
+ {
+ ONoScheduleThread aThread; // this thread runs 10 sec. (no schedule() used)
+ sal_Bool bRes = aThread.create();
+ CPPUNIT_ASSERT_MESSAGE ( "Can't start thread!", bRes == sal_True );
+
+ ThreadHelper::thread_sleep_tenth_sec(2);
+ aThread.suspend();
+ sal_Int32 nValue = aThread.getValue();
+
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ sal_Int32 nLaterValue = aThread.getValue();
+ ThreadHelper::thread_sleep_tenth_sec(5);
+
+ resumeAndWaitThread(&aThread);
+
+ t_print(" value = %d\n", nValue);
+ t_print("later value = %d\n", nLaterValue);
+
+ //On windows, suspend works, so the values are same
+#ifdef WNT
+ CPPUNIT_ASSERT_MESSAGE(
+ "Schedule: don't schedule in thread run method, suspend works.",
+ nLaterValue == nValue
+ );
+#endif
+
+ //On UNX, suspend does not work, so the difference of the values equals to sleep seconds number
+#ifdef UNX
+ aThread.resume();
+ CPPUNIT_ASSERT_MESSAGE(
+ "Schedule: don't schedule in thread run method, suspend does not work too.",
+ nLaterValue > nValue
+ );
+#endif
+
+ // terminate will not work if no schedule in thread's work function
+ termAndJoinThread(&aThread);
+ sal_Int32 nValue_term = aThread.getValue();
+
+ t_print(" value term = %d\n", nValue_term);
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Schedule: don't schedule in thread run method, terminate failed.",
+ nValue_term == 10
+ );
+ }
+
+ CPPUNIT_TEST_SUITE(schedule);
+ CPPUNIT_TEST(schedule_001);
+ CPPUNIT_TEST(schedule_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class schedule
+
+// -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::create, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::createSuspended, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::suspend, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::resume, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::terminate, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::join, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::isRunning, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::setPriority, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::getPriority, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::getIdentifier, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::getCurrentIdentifier, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::wait, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::yield, "osl_Thread");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Thread::schedule, "osl_Thread");
+} // namespace osl_Thread
+
+
+// -----------------------------------------------------------------------------
+// destroy function when the binding thread terminate
+void SAL_CALL destroyCallback(void * data)
+{
+ t_print("destroying local data %s\n", (char *) data);
+ delete[] (char *) data;
+}
+
+static ThreadData myThreadData(destroyCallback);
+
+/**
+*/
+class myKeyThread : public Thread
+{
+public:
+ // a public char member for test result checking
+ char m_Char_Test;
+ // for pass thread-special data to thread
+ myKeyThread(const char cData)
+ {
+ m_nData = cData;
+ }
+private:
+ char m_nData;
+
+ void SAL_CALL run()
+ {
+ char * pc = new char[2];
+// strcpy(pc, &m_nData);
+ memcpy(pc, &m_nData, 1);
+ pc[1] = '\0';
+
+ myThreadData.setData(pc);
+ char* pData = (char*)myThreadData.getData();
+ m_Char_Test = *pData;
+ // wait for long time to check the data value in main thread
+ ThreadHelper::thread_sleep_tenth_sec(3);
+ }
+public:
+ ~myKeyThread()
+ {
+ if (isRunning())
+ {
+ t_print("error: not terminated.\n");
+ }
+ }
+};
+
+static ThreadData idData;
+
+class idThread: public Thread
+{
+public:
+ oslThreadIdentifier m_Id;
+private:
+ void SAL_CALL run()
+ {
+ oslThreadIdentifier* pId = new oslThreadIdentifier;
+ *pId = getIdentifier();
+ idData.setData(pId);
+ oslThreadIdentifier* pIdData = (oslThreadIdentifier*)idData.getData();
+ //t_print("Thread %d has Data %d\n", getIdentifier(), *pIdData);
+ m_Id = *pIdData;
+ delete pId;
+ }
+
+public:
+ ~idThread()
+ {
+ if (isRunning())
+ {
+ t_print("error: not terminated.\n");
+ }
+ }
+};
+
+namespace osl_ThreadData
+{
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void ctor_001()
+ {
+
+ }
+
+ CPPUNIT_TEST_SUITE(ctors);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ctors
+
+
+ class setData : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ /** the same instance of the class can have different values in different threads
+ */
+ void setData_001()
+ {
+ idThread aThread1;
+ aThread1.create();
+ idThread aThread2;
+ aThread2.create();
+
+ aThread1.join();
+ aThread2.join();
+
+ oslThreadIdentifier aThreadId1 = aThread1.getIdentifier();
+ oslThreadIdentifier aThreadId2 = aThread2.getIdentifier();
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "ThreadData setData: ",
+ aThread1.m_Id == aThreadId1 && aThread2.m_Id == aThreadId2
+ );
+
+ }
+
+ void setData_002()
+ {
+ // at first, set the data a value
+ char* pc = new char[2];
+ char m_nData = 'm';
+// LLA: this is a copy functions only and really only for \0 terminated strings
+// m_nData is not a string, it's a character
+// strcpy(pc, &m_nData);
+ memcpy(pc, &m_nData, 1);
+ pc[1] = '\0';
+
+ myThreadData.setData(pc);
+
+ myKeyThread aThread1('a');
+ aThread1.create();
+ myKeyThread aThread2('b');
+ aThread2.create();
+ // aThread1 and aThread2 should have not terminated yet, check current data, not 'a' 'b'
+ char* pChar = (char*)myThreadData.getData();
+ char aChar = *pChar;
+
+ aThread1.join();
+ aThread2.join();
+
+ // the saved thread data of aThread1 & aThread2, different
+ char cData1 = aThread1.m_Char_Test;
+ char cData2 = aThread2.m_Char_Test;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "ThreadData setData: ",
+ cData1 == 'a' && cData2 == 'b' && aChar == 'm'
+ );
+
+ }
+ /** setData the second time, and then getData
+ */
+ void setData_003()
+ {
+ // at first, set the data a value
+ char* pc = new char[2];
+ char m_nData = 'm';
+// strcpy(pc, &m_nData);
+ memcpy(pc, &m_nData, 1);
+ pc[1] = '\0';
+ myThreadData.setData(pc);
+
+ myKeyThread aThread1('a');
+ aThread1.create();
+ myKeyThread aThread2('b');
+ aThread2.create();
+ // aThread1 and aThread2 should have not terminated yet
+ // setData the second time
+ char* pc2 = new char[2];
+ m_nData = 'o';
+// strcpy(pc2, &m_nData);
+ memcpy(pc2, &m_nData, 1);
+ pc2[1] = '\0';
+
+ myThreadData.setData(pc2);
+ char* pChar = (char*)myThreadData.getData();
+ char aChar = *pChar;
+
+ aThread1.join();
+ aThread2.join();
+
+ // the saved thread data of aThread1 & aThread2, different
+ char cData1 = aThread1.m_Char_Test;
+ char cData2 = aThread2.m_Char_Test;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "ThreadData setData: ",
+ cData1 == 'a' && cData2 == 'b' && aChar == 'o'
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE(setData);
+ CPPUNIT_TEST(setData_001);
+ CPPUNIT_TEST(setData_002);
+ CPPUNIT_TEST(setData_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class setData
+
+ //sal_Bool buildTwoThreads(char)
+
+ class getData : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // After setData in child threads, get Data in the main thread, should be independent
+ void getData_001()
+ {
+ char* pc = new char[2];
+ char m_nData[] = "i";
+ strcpy(pc, m_nData);
+ t_print("pc %s\n", pc);
+ myThreadData.setData(pc);
+
+ myKeyThread aThread1('c');
+ aThread1.create();
+ myKeyThread aThread2('d');
+ aThread2.create();
+
+ aThread1.join();
+ aThread2.join();
+
+ char cData1 = aThread1.m_Char_Test;
+ char cData2 = aThread2.m_Char_Test;
+
+ char* pChar = (char*)myThreadData.getData();
+ char aChar = *pChar;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "ThreadData setData: ",
+ cData1 == 'c' && cData2 == 'd' && aChar == 'i'
+ );
+
+ }
+
+ // setData then change the value in the address data pointer points,
+ // and then getData, should get the new value
+ void getData_002()
+ {
+ char* pc = new char[2];
+ char m_nData = 'i';
+// strcpy(pc, &m_nData);
+ memcpy(pc, &m_nData, 1);
+ pc[1] = '\0';
+// strncpy(pc, &m_nData, sizeof(char);
+
+ t_print("pc %s\n", pc);
+ myThreadData.setData(pc);
+
+ myKeyThread aThread1('a');
+ aThread1.create();
+ myKeyThread aThread2('b');
+ aThread2.create();
+
+ // change the value which pc points
+ char m_nData2 = 'j';
+ // strcpy(pc, &m_nData2);
+ memcpy(pc, &m_nData2, 1);
+ pc[1] = '\0';
+
+ //t_print("pc %s\n", pc);
+ void* pChar = myThreadData.getData();
+ char aChar = *(char*)pChar;
+
+ aThread1.join();
+ aThread2.join();
+
+ char cData1 = aThread1.m_Char_Test;
+ char cData2 = aThread2.m_Char_Test;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "ThreadData setData: ",
+ cData1 == 'a' && cData2 == 'b' && aChar == 'j'
+ );
+
+ }
+
+ CPPUNIT_TEST_SUITE(getData);
+ CPPUNIT_TEST(getData_001);
+ CPPUNIT_TEST(getData_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class getData
+
+// -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ThreadData::ctors, "osl_ThreadData");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ThreadData::setData, "osl_ThreadData");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ThreadData::getData, "osl_ThreadData");
+} // namespace osl_ThreadData
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
diff --git a/sal/qa/osl/process/osl_Thread.xsce b/sal/qa/osl/process/osl_Thread.xsce
new file mode 100644
index 000000000000..42d9ef269178
--- /dev/null
+++ b/sal/qa/osl/process/osl_Thread.xsce
@@ -0,0 +1 @@
+osl_Thread.setPriority.setPriority_001_1 unxsols4
diff --git a/sal/qa/osl/process/osl_process.cxx b/sal/qa/osl/process/osl_process.cxx
new file mode 100644
index 000000000000..776aa42c0707
--- /dev/null
+++ b/sal/qa/osl/process/osl_process.cxx
@@ -0,0 +1,684 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <testshl/simpleheader.hxx>
+#include <osl/process.h>
+#include <osl/file.hxx>
+#include <osl/thread.h>
+#include <rtl/ustring.hxx>
+#include <unistd.h>
+#include <signal.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <osl/module.hxx>
+
+#if ( defined WNT ) // Windows
+#include <tools/prewin.h>
+# define WIN32_LEAN_AND_MEAN
+// # include <windows.h>
+# include <tchar.h>
+#include <tools/postwin.h>
+#endif
+
+#include "rtl/allocator.hxx"
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <algorithm>
+#include <iterator>
+#include <string>
+
+#if defined(WNT) || defined(OS2)
+ const rtl::OUString EXECUTABLE_NAME = rtl::OUString::createFromAscii("osl_process_child.exe");
+#else
+ const rtl::OUString EXECUTABLE_NAME = rtl::OUString::createFromAscii("osl_process_child");
+#endif
+
+
+//########################################
+std::string OUString_to_std_string(const rtl::OUString& oustr)
+{
+ rtl::OString ostr = rtl::OUStringToOString(oustr, osl_getThreadTextEncoding());
+ return std::string(ostr.getStr());
+}
+
+//########################################
+using namespace osl;
+using namespace rtl;
+
+/** print a UNI_CODE String.
+*/
+inline void printUString( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ t_print("#printUString_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", aString.getStr( ) );
+}
+
+/** get binary Path.
+*/
+inline ::rtl::OUString getExecutablePath( void )
+{
+ ::rtl::OUString dirPath;
+ osl::Module::getUrlFromAddress( ( void* ) &getExecutablePath, dirPath );
+ dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') );
+ dirPath = dirPath.copy( 0, dirPath.lastIndexOf('/') + 1);
+ dirPath += rtl::OUString::createFromAscii("bin");
+ return dirPath;
+}
+
+//rtl::OUString CWD = getExecutablePath();
+
+//########################################
+class Test_osl_joinProcess : public CppUnit::TestFixture
+{
+ const OUString join_param_;
+ const OUString wait_time_;
+ OUString suCWD;
+ OUString suExecutableFileURL;
+
+ rtl_uString* parameters_[2];
+ int parameters_count_;
+
+public:
+
+ Test_osl_joinProcess() :
+ join_param_(OUString::createFromAscii("-join")),
+ wait_time_(OUString::createFromAscii("1")),
+ parameters_count_(2)
+ {
+ parameters_[0] = join_param_.pData;
+ parameters_[1] = wait_time_.pData;
+ suCWD = getExecutablePath();
+ suExecutableFileURL = suCWD;
+ suExecutableFileURL += rtl::OUString::createFromAscii("/");
+ suExecutableFileURL += EXECUTABLE_NAME;
+ }
+
+ /*-------------------------------------
+ Start a process and join with this
+ process specify a timeout so that
+ osl_joinProcessWithTimeout returns
+ osl_Process_E_TimedOut
+ -------------------------------------*/
+
+ void osl_joinProcessWithTimeout_timeout_failure()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ suExecutableFileURL.pData,
+ parameters_,
+ parameters_count_,
+ osl_Process_NORMAL,
+ osl_getCurrentSecurity(),
+ suCWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ TimeValue timeout;
+ timeout.Seconds = 1;
+ timeout.Nanosec = 0;
+
+ osl_error = osl_joinProcessWithTimeout(process, &timeout);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcessWithTimeout returned without timeout failure",
+ osl_Process_E_TimedOut == osl_error
+ );
+
+ osl_error = osl_terminateProcess(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_terminateProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ /*-------------------------------------
+ Start a process and join with this
+ process specify a timeout so that
+ osl_joinProcessWithTimeout returns
+ osl_Process_E_None
+ -------------------------------------*/
+
+ void osl_joinProcessWithTimeout_without_timeout_failure()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ suExecutableFileURL.pData,
+ parameters_,
+ parameters_count_,
+ osl_Process_NORMAL,
+ osl_getCurrentSecurity(),
+ suCWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ TimeValue timeout;
+ timeout.Seconds = 10;
+ timeout.Nanosec = 0;
+
+ osl_error = osl_joinProcessWithTimeout(process, &timeout);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcessWithTimeout returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ /*-------------------------------------
+ Start a process and join with this
+ process specify an infinite timeout
+ -------------------------------------*/
+
+ void osl_joinProcessWithTimeout_infinite()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ suExecutableFileURL.pData,
+ parameters_,
+ parameters_count_,
+ osl_Process_NORMAL,
+ osl_getCurrentSecurity(),
+ suCWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_error = osl_joinProcessWithTimeout(process, NULL);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcessWithTimeout returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ /*-------------------------------------
+ Start a process and join with this
+ process using osl_joinProcess
+ -------------------------------------*/
+
+ void osl_joinProcess()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ suExecutableFileURL.pData,
+ parameters_,
+ parameters_count_,
+ osl_Process_NORMAL,
+ osl_getCurrentSecurity(),
+ suCWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_error = ::osl_joinProcess(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcess returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ CPPUNIT_TEST_SUITE(Test_osl_joinProcess);
+ CPPUNIT_TEST(osl_joinProcessWithTimeout_timeout_failure);
+ CPPUNIT_TEST(osl_joinProcessWithTimeout_without_timeout_failure);
+ CPPUNIT_TEST(osl_joinProcessWithTimeout_infinite);
+ CPPUNIT_TEST(osl_joinProcess);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+//#########################################################
+
+typedef std::vector<std::string, rtl::Allocator<std::string> > string_container_t;
+typedef string_container_t::const_iterator string_container_const_iter_t;
+typedef string_container_t::iterator string_container_iter_t;
+
+//#########################################################
+class exclude : public std::unary_function<std::string, bool>
+{
+public:
+ //------------------------------------------------
+ exclude(const string_container_t& exclude_list)
+ {
+ string_container_const_iter_t iter = exclude_list.begin();
+ string_container_const_iter_t iter_end = exclude_list.end();
+ for (/**/; iter != iter_end; ++iter)
+ exclude_list_.push_back(env_var_name(*iter));
+ }
+
+ //------------------------------------------------
+ bool operator() (const std::string& env_var) const
+ {
+ return (exclude_list_.end() !=
+ std::find(
+ exclude_list_.begin(),
+ exclude_list_.end(),
+ env_var_name(env_var)));
+ }
+
+private:
+ //-------------------------------------------------
+ // extract the name from an environment variable
+ // that is given in the form "NAME=VALUE"
+ std::string env_var_name(const std::string& env_var) const
+ {
+ std::string::size_type pos_equal_sign =
+ env_var.find_first_of("=");
+
+ if (std::string::npos != pos_equal_sign)
+ return std::string(env_var, 0, pos_equal_sign);
+
+ return std::string();
+ }
+
+private:
+ string_container_t exclude_list_;
+};
+
+#ifdef WNT
+ void read_parent_environment(string_container_t* env_container)
+ {
+ LPTSTR env = reinterpret_cast<LPTSTR>(GetEnvironmentStrings());
+ LPTSTR p = env;
+
+ while (size_t l = _tcslen(p))
+ {
+ env_container->push_back(std::string(p));
+ p += l + 1;
+ }
+ FreeEnvironmentStrings(env);
+ }
+#else
+ extern char** environ;
+ void read_parent_environment(string_container_t* env_container)
+ {
+ for (int i = 0; NULL != environ[i]; i++)
+ env_container->push_back(std::string(environ[i]));
+ }
+#endif
+
+//#########################################################
+class Test_osl_executeProcess : public CppUnit::TestFixture
+{
+ const OUString env_param_;
+
+ OUString temp_file_path_;
+ rtl_uString* parameters_[2];
+ int parameters_count_;
+ OUString suCWD;
+ OUString suExecutableFileURL;
+
+public:
+
+ //------------------------------------------------
+ // ctor
+ Test_osl_executeProcess() :
+ env_param_(OUString::createFromAscii("-env")),
+ parameters_count_(2)
+ {
+ parameters_[0] = env_param_.pData;
+ suCWD = getExecutablePath();
+ suExecutableFileURL = suCWD;
+ suExecutableFileURL += rtl::OUString::createFromAscii("/");
+ suExecutableFileURL += EXECUTABLE_NAME;
+ }
+
+ //------------------------------------------------
+ virtual void setUp()
+ {
+ temp_file_path_ = create_temp_file();
+ parameters_[1] = temp_file_path_.pData;
+ }
+
+ //------------------------------------------------
+ OUString create_temp_file()
+ {
+ OUString temp_file_url;
+ FileBase::RC rc = FileBase::createTempFile(0, 0, &temp_file_url);
+ CPPUNIT_ASSERT_MESSAGE("createTempFile failed", FileBase::E_None == rc);
+
+ OUString temp_file_path;
+ rc = FileBase::getSystemPathFromFileURL(temp_file_url, temp_file_path);
+ CPPUNIT_ASSERT_MESSAGE("getSystemPathFromFileURL failed", FileBase::E_None == rc);
+
+ return temp_file_path;
+ }
+
+ //------------------------------------------------
+ void read_child_environment(string_container_t* env_container)
+ {
+ OString temp_file_name = OUStringToOString(OUString(
+ parameters_[1]), osl_getThreadTextEncoding());
+ std::ifstream file(temp_file_name.getStr());
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "I/O error, cannot open child environment file",
+ file.is_open()
+ );
+
+ std::string line;
+ while (std::getline(file, line))
+ env_container->push_back(line);
+ }
+
+ //------------------------------------------------
+ void dump_env(const string_container_t& env, OUString file_name)
+ {
+ OString fname = OUStringToOString(file_name, osl_getThreadTextEncoding());
+ std::ofstream file(fname.getStr());
+ std::ostream_iterator<std::string> oi(file, "\n");
+ std::copy(env.begin(), env.end(), oi);
+ }
+
+ //------------------------------------------------
+ // environment of the child process that was
+ // started. The child process writes his
+ // environment into a file
+ bool compare_environments()
+ {
+ string_container_t parent_env;
+ read_parent_environment(&parent_env);
+
+ string_container_t child_env;
+ read_child_environment(&child_env);
+
+ return ((parent_env.size() == child_env.size()) &&
+ (std::equal(child_env.begin(), child_env.end(), parent_env.begin())));
+ }
+
+ //------------------------------------------------
+ // compare the equal environment parts and the
+ // different part of the child environment
+ bool compare_merged_environments(const string_container_t& different_env_vars)
+ {
+ string_container_t parent_env;
+ read_parent_environment(&parent_env);
+
+ //remove the environment variables that we have changed
+ //in the child environment from the read parent environment
+ parent_env.erase(
+ std::remove_if(parent_env.begin(), parent_env.end(), exclude(different_env_vars)),
+ parent_env.end());
+
+ //read the child environment and exclude the variables that
+ //are different
+ string_container_t child_env;
+ read_child_environment(&child_env);
+
+ //partition the child environment into the variables that
+ //are different to the parent environment (they come first)
+ //and the variables that should be equal between parent
+ //and child environment
+ string_container_iter_t iter_logical_end =
+ std::stable_partition(child_env.begin(), child_env.end(), exclude(different_env_vars));
+
+ string_container_t different_child_env_vars(child_env.begin(), iter_logical_end);
+ child_env.erase(child_env.begin(), iter_logical_end);
+
+ bool common_env_size_equals = (parent_env.size() == child_env.size());
+ bool common_env_content_equals = std::equal(child_env.begin(), child_env.end(), parent_env.begin());
+
+ bool different_env_size_equals = (different_child_env_vars.size() == different_env_vars.size());
+ bool different_env_content_equals =
+ std::equal(different_env_vars.begin(), different_env_vars.end(), different_child_env_vars.begin());
+
+ return (common_env_size_equals && common_env_content_equals &&
+ different_env_size_equals && different_env_content_equals);
+ }
+
+ //------------------------------------------------
+ // test that parent and child process have the
+ // same environment when osl_executeProcess will
+ // be called with out setting new environment
+ // variables
+ void osl_execProc_parent_equals_child_environment()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ suExecutableFileURL.pData,
+ parameters_,
+ parameters_count_,
+ osl_Process_NORMAL,
+ NULL,
+ suCWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_error = ::osl_joinProcess(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcess returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "Parent an child environment not equal",
+ compare_environments()
+ );
+ }
+
+ //------------------------------------------------
+ #define ENV1 "PAT=a:\\"
+ #define ENV2 "PATHb=b:\\"
+ #define ENV3 "Patha=c:\\"
+ #define ENV4 "Patha=d:\\"
+
+ void osl_execProc_merged_child_environment()
+ {
+ rtl_uString* child_env[4];
+ OUString env1 = OUString::createFromAscii(ENV1);
+ OUString env2 = OUString::createFromAscii(ENV2);
+ OUString env3 = OUString::createFromAscii(ENV3);
+ OUString env4 = OUString::createFromAscii(ENV4);
+
+ child_env[0] = env1.pData;
+ child_env[1] = env2.pData;
+ child_env[2] = env3.pData;
+ child_env[3] = env4.pData;
+
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ suExecutableFileURL.pData,
+ parameters_,
+ parameters_count_,
+ osl_Process_NORMAL,
+ NULL,
+ suCWD.pData,
+ child_env,
+ sizeof(child_env)/sizeof(child_env[0]),
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_error = ::osl_joinProcess(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcess returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+
+ string_container_t different_child_env_vars;
+ different_child_env_vars.push_back(ENV1);
+ different_child_env_vars.push_back(ENV2);
+ different_child_env_vars.push_back(ENV4);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_execProc_merged_child_environment",
+ compare_merged_environments(different_child_env_vars)
+ );
+ }
+
+ void osl_execProc_test_batch()
+ {
+ oslProcess process;
+ rtl::OUString suBatch = suCWD + rtl::OUString::createFromAscii("/") + rtl::OUString::createFromAscii("batch.bat");
+ oslProcessError osl_error = osl_executeProcess(
+ suBatch.pData,
+ NULL,
+ 0,
+ osl_Process_NORMAL,
+ NULL,
+ suCWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_error = ::osl_joinProcess(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcess returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ void osl_execProc_exe_name_in_argument_list()
+ {
+ rtl_uString* params[3];
+
+ params[0] = suExecutableFileURL.pData;
+ params[1] = env_param_.pData;
+ params[2] = temp_file_path_.pData;
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ NULL,
+ params,
+ 3,
+ osl_Process_NORMAL,
+ NULL,
+ suCWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_error = ::osl_joinProcess(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcess returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ CPPUNIT_TEST_SUITE(Test_osl_executeProcess);
+ CPPUNIT_TEST(osl_execProc_parent_equals_child_environment);
+ CPPUNIT_TEST(osl_execProc_merged_child_environment);
+ CPPUNIT_TEST(osl_execProc_test_batch);
+ CPPUNIT_TEST(osl_execProc_exe_name_in_argument_list);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+//#####################################
+// register test suites
+//CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(Test_osl_joinProcess, "Test_osl_joinProcess");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(Test_osl_executeProcess, "Test_osl_executeProcess");
+
+NOADDITIONAL;
+
diff --git a/sal/qa/osl/process/osl_process_child.cxx b/sal/qa/osl/process/osl_process_child.cxx
new file mode 100644
index 000000000000..8d488ad7c403
--- /dev/null
+++ b/sal/qa/osl/process/osl_process_child.cxx
@@ -0,0 +1,131 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//########################################
+// includes
+
+#if ( defined WNT ) // Windows
+#include <tools/prewin.h>
+# define UNICODE
+# define _UNICODE
+# define WIN32_LEAN_AND_MEAN
+// # include <windows.h>
+# include <tchar.h>
+#include <tools/postwin.h>
+#else
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <iostream>
+#include <fstream>
+
+#include <rtl/ustring.hxx>
+
+//########################################
+// defines
+
+#ifdef WNT
+# define SLEEP(t) (Sleep((t)*1000))
+#else
+# define SLEEP(t) (sleep((t)))
+#endif
+
+//########################################
+void wait_for_seconds(char* time)
+{
+ SLEEP(atoi(time));
+}
+
+//########################################
+
+#ifdef WNT
+//########################################
+void w_to_a(LPCTSTR _strW, LPSTR strA, DWORD size)
+{
+ LPCWSTR strW = reinterpret_cast<LPCWSTR>(_strW);
+ WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, size, NULL, NULL);
+}
+//########################################
+ void dump_env(char* file_path)
+ {
+ LPTSTR env = reinterpret_cast<LPTSTR>(
+ GetEnvironmentStrings());
+ LPTSTR p = env;
+
+ std::ofstream file(file_path);
+
+ char buffer[32767];
+ while (size_t l = _tcslen(reinterpret_cast<wchar_t*>(p)))
+ {
+ w_to_a(p, buffer, sizeof(buffer));
+ file << buffer << std::endl;
+ p += l + 1;
+ }
+ FreeEnvironmentStrings(env);
+ }
+#else
+ extern char** environ;
+
+ void dump_env(char* file_path)
+ {
+ std::ofstream file(file_path);
+ for (int i = 0; NULL != environ[i]; i++)
+ file << environ[i] << std::endl;
+ }
+#endif
+
+//########################################
+int main(int argc, char* argv[])
+{
+ rtl::OUString s;
+
+ //t_print("Parameter: ");
+ printf("child process Parameter: ");
+ for (int i = 1; i < argc; i++)
+ printf("%s ", argv[i]);
+ printf("\n");
+
+ if (argc > 2)
+ {
+ if (0 == strcmp("-join", argv[1]))
+ {
+ wait_for_seconds(argv[2]);
+ }
+ else if (0 == strcmp("-env", argv[1]))
+ {
+ dump_env(argv[2]);
+ }
+ }
+
+ return (0);
+}
+
diff --git a/sal/qa/osl/profile/makefile.mk b/sal/qa/osl/profile/makefile.mk
new file mode 100644
index 000000000000..67ad60057c07
--- /dev/null
+++ b/sal/qa/osl/profile/makefile.mk
@@ -0,0 +1,72 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+.IF "$(OOO_SUBSEQUENT_TESTS)" == ""
+nothing .PHONY:
+.ELSE
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_osl_profile
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+SHL1OBJS= \
+ $(SLO)$/osl_old_testprofile.obj
+
+SHL1TARGET= osl_old_testprofile
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+SHL1RPATH = NONE
+# END ------------------------------------------------------------------
+
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+SLOFILES=\
+ $(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
+.END
diff --git a/sal/qa/osl/profile/osl_old_testprofile.cxx b/sal/qa/osl/profile/osl_old_testprofile.cxx
new file mode 100644
index 000000000000..966a453dc79f
--- /dev/null
+++ b/sal/qa/osl/profile/osl_old_testprofile.cxx
@@ -0,0 +1,99 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+// LLA:
+// this file is converted to use with testshl2
+// original was placed in sal/test/textenc.cxx
+
+
+// -----------------------------------------------------------------------------
+#include <stdio.h>
+#include <osl/profile.h>
+
+#include "cppunit/TestAssert.h"
+#include "cppunit/TestFixture.h"
+#include "cppunit/extensions/HelperMacros.h"
+#include "cppunit/plugin/TestPlugIn.h"
+
+//==================================================================================================
+// -----------------------------------------------------------------------------
+namespace osl_Profile
+{
+ class oldtests : public CppUnit::TestFixture
+ {
+ public:
+ void test_profile();
+
+ CPPUNIT_TEST_SUITE( oldtests );
+ CPPUNIT_TEST( test_profile );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+void oldtests::test_profile(void)
+{
+ oslProfile hProfile;
+ rtl_uString* ustrProfileName=0;
+ rtl_uString* ustrProfileName2=0;
+
+ rtl_uString_newFromAscii(&ustrProfileName,"//./tmp/soffice.ini");
+ rtl_uString_newFromAscii(&ustrProfileName2,"//./tmp/not_existing_path/soffice.ini");
+
+
+ // successful write
+ hProfile = osl_openProfile( ustrProfileName, 0 );
+ if (hProfile != 0)
+ {
+ if (! osl_writeProfileBool( hProfile, "testsection", "testbool", 1 ))
+ printf( "### cannot write into init file!\n" );
+
+ osl_closeProfile( hProfile );
+ }
+
+ // unsuccessful write
+ hProfile = osl_openProfile( ustrProfileName2, 0 );
+ if (hProfile != 0)
+ {
+ if (osl_writeProfileBool( hProfile, "testsection", "testbool", 1 ))
+ printf( "### unexpected success writing into test2.ini!\n" );
+
+ osl_closeProfile( hProfile );
+ }
+
+ rtl_uString_release(ustrProfileName);
+ rtl_uString_release(ustrProfileName2);
+}
+
+} // namespace osl_Profile
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION( osl_Profile::oldtests );
+
+// -----------------------------------------------------------------------------
+CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sal/qa/osl/security/makefile.mk b/sal/qa/osl/security/makefile.mk
new file mode 100755
index 000000000000..c371bbf4610d
--- /dev/null
+++ b/sal/qa/osl/security/makefile.mk
@@ -0,0 +1,64 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_osl_security
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Security by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/osl_Security.obj
+
+SHL1TARGET= osl_Security
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+.IF "$(GUI)" == "WNT"
+SHL1STDLIBS+= $(ADVAPI32LIB)
+.ENDIF
+
+SHL1IMPLIB= i$(SHL1TARGET)
+SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:Security
+# END ------------------------------------------------------------------
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/osl/security/osl_Security.cxx b/sal/qa/osl/security/osl_Security.cxx
new file mode 100755
index 000000000000..cc125eefada2
--- /dev/null
+++ b/sal/qa/osl/security/osl_Security.cxx
@@ -0,0 +1,678 @@
+ /*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// header file
+//------------------------------------------------------------------------
+#include <osl_Security_Const.h>
+
+using namespace osl;
+using namespace rtl;
+
+
+//------------------------------------------------------------------------
+// helper functions and classes
+//------------------------------------------------------------------------
+
+/** print Boolean value.
+*/
+inline void printBool( sal_Bool bOk )
+{
+ //t_print("#printBool# " );
+ ( sal_True == bOk ) ? t_print("TRUE!\n" ): t_print("FALSE!\n" );
+}
+
+/** print a UNI_CODE String.
+*/
+inline void printUString( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ //t_print("#printUString_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", aString.getStr( ) );
+}
+
+
+//------------------------------------------------------------------------
+// test code start here
+//------------------------------------------------------------------------
+
+namespace osl_Security
+{
+
+ /** testing the method:
+ Security()
+ */
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void ctors_001( )
+ {
+ ::osl::Security aSec;
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a security its handle should not be NULL.",
+ aSec.getHandle( ) != NULL );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class ctors
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL logonUser(const ::rtl::OUString& strName,
+ const ::rtl::OUString& strPasswd);
+ inline sal_Bool SAL_CALL logonUser(const ::rtl::OUString & strName,
+ const ::rtl::OUString & strPasswd,
+ const ::rtl::OUString & strFileServer);
+ */
+ class logonUser : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes;
+
+ void logonUser_user_pwd( )
+ {
+ ::osl::Security aSec;
+ bRes = aSec.logonUser( aLogonUser, aLogonPasswd );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: check logon user through forwarded user name, pwd, passed in (UNX), failed in (W32).",
+ ( sal_True == bRes ) );
+ }
+
+ void logonUser_user_pwd_server( )
+ {
+ ::osl::Security aSec;
+ bRes = aSec.logonUser( aLogonUser, aLogonPasswd, aFileServer );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: check logon user through forwarded user name, pwd and server name, failed in (UNX)(W32).",
+ ( sal_True == bRes ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( logonUser );
+ if ( !aStringForward.equals( aNullURL ) && aStringForward.indexOf( (sal_Unicode)' ' ) != -1 && ( aStringForward.indexOf( ( sal_Unicode ) ' ' ) == aStringForward.lastIndexOf( ( sal_Unicode ) ' ' ) ) )
+ /// if user name and passwd are forwarded
+ {
+ CPPUNIT_TEST( logonUser_user_pwd );
+ }
+ if ( !aStringForward.equals( aNullURL ) && aStringForward.indexOf( (sal_Unicode)' ' ) != -1 && ( aStringForward.indexOf( ( sal_Unicode ) ' ' ) != aStringForward.lastIndexOf( ( sal_Unicode ) ' ' ) ) )
+ /// if user name and passwd and file server are forwarded
+ {
+ CPPUNIT_TEST( logonUser_user_pwd_server );
+ }
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class logonUser
+
+
+ /** testing the method:
+ inline sal_Bool Security::getUserIdent( rtl::OUString& strIdent) const
+ */
+ class getUserIdent : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void getUserIdent_001( )
+ {
+ ::osl::Security aSec;
+ ::rtl::OUString strID;
+ bRes = aSec.getUserIdent( strID );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: get UserID and compare it with names got at the beginning of the test.",
+ ( sal_True == strUserID.equals( strID ) ) && ( sal_True == bRes ));
+ }
+
+ CPPUNIT_TEST_SUITE( getUserIdent );
+ CPPUNIT_TEST( getUserIdent_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getUserIdent
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL getUserName( ::rtl::OUString& strName) const;
+ */
+ class getUserName : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void getUserName_001( )
+ {
+ ::osl::Security aSec;
+#ifdef WNT
+ ::rtl::OUString strName( strUserName ), strGetName;
+#else
+ ::rtl::OUString strName( strUserName ), strGetName;
+#endif
+ bRes = aSec.getUserName( strGetName );
+
+ sal_Int32 nPos = -1;
+ if (strName.getLength() > 0)
+ {
+ nPos = strGetName.indexOf(strName);
+ }
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: get UserName and compare it with names got at the beginning of the test.",
+ ( nPos >= 0 ) && ( sal_True == bRes ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getUserName );
+ CPPUNIT_TEST( getUserName_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getUserName
+
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL getHomeDir( ::rtl::OUString& strDirectory) const;
+ */
+ class getHomeDir : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void getHomeDir_001( )
+ {
+ ::osl::Security aSec;
+ ::rtl::OUString strHome;
+ bRes = aSec.getHomeDir( strHome );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: getHomeDir and compare it with the info we get at the beginning.",
+ ( sal_True == strHomeDirectory.equals( strHome ) ) && ( sal_True == bRes ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getHomeDir );
+ CPPUNIT_TEST( getHomeDir_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getHomeDir
+
+ /** testing the method:
+ inline sal_Bool Security::getConfigDir( rtl::OUString& strDirectory ) const
+ */
+ class getConfigDir : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void getConfigDir_001( )
+ {
+ ::osl::Security aSec;
+ ::rtl::OUString strConfig;
+ bRes = aSec.getConfigDir( strConfig );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: getHomeDir and compare it with the info we get at the beginning.",
+ ( sal_True == strConfigDirectory.equals( strConfig ) ) && ( sal_True == bRes ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getConfigDir );
+ CPPUNIT_TEST( getConfigDir_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getConfigDir
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL isAdministrator() const;
+ */
+ class isAdministrator : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes;
+
+ void isAdministrator_001( )
+ {
+ ::osl::Security aSec;
+ bRes = aSec.isAdministrator( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: check if the user is administrator at beginning, compare here.",
+ bRes == isAdmin );
+ }
+
+ CPPUNIT_TEST_SUITE( isAdministrator );
+ CPPUNIT_TEST( isAdministrator_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class isAdministrator
+
+ /** testing the method:
+ inline oslSecurity getHandle() const;
+ */
+ class getHandle : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes;
+
+ void getHandle_001( )
+ {
+ ::osl::Security aSec;
+ bRes = aSec.isAdministrator( ) == osl_isAdministrator( aSec.getHandle( ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: use getHandle function to call C API.",
+ bRes == sal_True );
+ }
+
+ CPPUNIT_TEST_SUITE( getHandle );
+ CPPUNIT_TEST( getHandle_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class getHandle
+
+
+ class UserProfile : public CppUnit::TestFixture
+ {
+ public:
+
+ void loadUserProfile( )
+ {
+ ::osl::Security aSec;
+ sal_Bool bValue = osl_loadUserProfile(aSec.getHandle());
+
+ CPPUNIT_ASSERT_MESSAGE( "empty function.", bValue == sal_False );
+ }
+
+ void unloadUserProfile( )
+ {
+ ::osl::Security aSec;
+ osl_unloadUserProfile(aSec.getHandle());
+ CPPUNIT_ASSERT_MESSAGE( "empty function.", sal_True );
+ }
+
+ CPPUNIT_TEST_SUITE( UserProfile );
+ CPPUNIT_TEST( loadUserProfile );
+ CPPUNIT_TEST( unloadUserProfile );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class UserProfile
+
+ class loginUserOnFileServer : public CppUnit::TestFixture
+ {
+ public:
+
+ void loginUserOnFileServer_001( )
+ {
+ rtl::OUString suUserName;
+ rtl::OUString suPassword;
+ rtl::OUString suFileServer;
+ ::osl::Security aSec;
+ oslSecurity pSec = aSec.getHandle();
+
+ oslSecurityError erg = osl_loginUserOnFileServer(suUserName.pData, suPassword.pData, suFileServer.pData, &pSec);
+
+ CPPUNIT_ASSERT_MESSAGE( "empty function.", erg == osl_Security_E_UserUnknown );
+ }
+
+ CPPUNIT_TEST_SUITE( loginUserOnFileServer );
+ CPPUNIT_TEST( loginUserOnFileServer_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class loginUserOnFileServer
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::ctors, "osl_Security");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::logonUser, "osl_Security");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getUserIdent, "osl_Security");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getUserName, "osl_Security");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getHomeDir, "osl_Security");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getConfigDir, "osl_Security");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::isAdministrator, "osl_Security");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::getHandle, "osl_Security");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::UserProfile, "osl_Security");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Security::loginUserOnFileServer, "osl_Security");
+
+// -----------------------------------------------------------------------------
+
+} // namespace osl_Security
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+
+/** to do some initialized work, we replace the NOADDITIONAL macro with the initialize work which
+ get current user name, .
+*/
+
+void RegisterAdditionalFunctions(FktRegFuncPtr)
+{
+ /// start message
+ t_print("#Initializing ...\n" );
+ t_print("#\n#logonUser function need root/Administrator account to test.\n" );
+ t_print("#You can test by login with root/Administrator, and excute:\n" );
+ t_print("#testshl2 -forward \"username password\" ../../../wntmsci9/bin/Security.dll\n" );
+ t_print("# where username and password are forwarded account info.\n" );
+ t_print("#if no text forwarded, this function will be skipped.\n" );
+
+ /// get system information
+#if ( defined UNX ) || ( defined OS2 )
+ /// some initialization work for UNIX OS
+
+
+ struct passwd* pw;
+ CPPUNIT_ASSERT_MESSAGE( "getpwuid: no password entry\n",( pw = getpwuid( getuid() ) ) != NULL );
+
+ /// get user ID;
+ strUserID = ::rtl::OUString::valueOf( ( sal_Int32 )getuid( ) );
+
+ /// get user Name;
+ strUserName = ::rtl::OUString::createFromAscii( pw->pw_name );
+
+ /// get home directory;
+ CPPUNIT_ASSERT_MESSAGE( "#Convert from system path to URL failed.",
+ ::osl::File::E_None == ::osl::File::getFileURLFromSystemPath( ::rtl::OUString::createFromAscii( pw->pw_dir ), strHomeDirectory ) );
+
+ /// get config directory;
+ strConfigDirectory = strHomeDirectory.copy(0);
+
+ /// is administrator;
+ if( !getuid( ) )
+ isAdmin = sal_True;
+
+#endif
+#if defined ( WNT )
+ /// some initialization work for Windows OS
+
+
+ /// Get the user name, computer name, user home directory.
+ LPTSTR lpszSystemInfo; // pointer to system information string
+ DWORD cchBuff = BUFSIZE; // size of computer or user name
+ TCHAR tchBuffer[BUFSIZE]; // buffer for string
+
+ lpszSystemInfo = tchBuffer;
+ cchBuff = BUFSIZE;
+ if( GetUserNameA(lpszSystemInfo, &cchBuff) )
+ strUserName = ::rtl::OUString::createFromAscii( lpszSystemInfo );
+
+ if( GetComputerName(lpszSystemInfo, &cchBuff) )
+ strComputerName = ::rtl::OUString::createFromAscii( lpszSystemInfo );
+
+ /// Get user home directory.
+ HKEY hRegKey;
+ sal_Char PathA[_MAX_PATH];
+ ::rtl::OUString strHome;
+ if (RegOpenKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", &hRegKey) == ERROR_SUCCESS)
+ {
+ LONG lRet, lSize = sizeof(PathA);
+ DWORD Type;
+
+ lRet = RegQueryValueEx(hRegKey, "AppData", NULL, &Type, ( unsigned char * )PathA, ( unsigned long * )&lSize);
+ if ( ( lRet == ERROR_SUCCESS ) && ( Type == REG_SZ ) && ( _access( PathA, 0 ) == 0 ) )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#Convert from system path to URL failed.",
+ ::osl::File::E_None == ::osl::File::getFileURLFromSystemPath( ::rtl::OUString::createFromAscii( PathA ), strConfigDirectory ) );
+ }
+
+ lRet = RegQueryValueEx(hRegKey, "Personal", NULL, &Type, ( unsigned char * )PathA, ( unsigned long * )&lSize);
+ if ( ( lRet == ERROR_SUCCESS ) && ( Type == REG_SZ ) && ( _access( PathA, 0 ) == 0 ) )
+ {
+ CPPUNIT_ASSERT_MESSAGE( "#Convert from system path to URL failed.",
+ ::osl::File::E_None == ::osl::File::getFileURLFromSystemPath( ::rtl::OUString::createFromAscii( PathA ), strHomeDirectory ) );
+ }
+
+ RegCloseKey(hRegKey);
+ }
+
+
+ /// Get user Security ID:
+
+ // Create buffers that may be large enough. If a buffer is too small, the count parameter will be set to the size needed.
+ const DWORD INITIAL_SIZE = 32;
+ DWORD cbSid = 0;
+ DWORD dwSidBufferSize = INITIAL_SIZE;
+ DWORD cchDomainName = 0;
+ DWORD dwDomainBufferSize = INITIAL_SIZE;
+ WCHAR * wszDomainName = NULL;
+ SID_NAME_USE eSidType;
+ DWORD dwErrorCode = 0;
+
+ LPCWSTR wszAccName = ( LPWSTR ) strUserName.getStr( );
+
+ // Create buffers for the SID and the domain name.
+ PSID pSid = (PSID) new WIN_BYTE[dwSidBufferSize];
+ CPPUNIT_ASSERT_MESSAGE("# creating SID buffer failed.\n", pSid!= NULL );
+ memset( pSid, 0, dwSidBufferSize);
+
+ wszDomainName = new WCHAR[dwDomainBufferSize];
+ CPPUNIT_ASSERT_MESSAGE("# creating Domain name buffer failed.\n", wszDomainName != NULL );
+ memset(wszDomainName, 0, dwDomainBufferSize*sizeof(WCHAR));
+
+ // Obtain the SID for the account name passed.
+ for ( ; ; )
+ {
+ // Set the count variables to the buffer sizes and retrieve the SID.
+ cbSid = dwSidBufferSize;
+ cchDomainName = dwDomainBufferSize;
+ if (LookupAccountNameW(
+ NULL, // Computer name. NULL for the local computer
+ wszAccName,
+ pSid, // Pointer to the SID buffer. Use NULL to get the size needed,
+ &cbSid, // Size of the SID buffer needed.
+ wszDomainName, // wszDomainName,
+ &cchDomainName,
+ &eSidType
+ ))
+ {
+ if (IsValidSid( pSid) == FALSE)
+ wprintf(L"# The SID for %s is invalid.\n", wszAccName);
+ break;
+ }
+ dwErrorCode = GetLastError();
+
+ // Check if one of the buffers was too small.
+ if (dwErrorCode == ERROR_INSUFFICIENT_BUFFER)
+ {
+ if (cbSid > dwSidBufferSize)
+ {
+ // Reallocate memory for the SID buffer.
+ wprintf(L"# The SID buffer was too small. It will be reallocated.\n");
+ FreeSid( pSid);
+ pSid = (PSID) new WIN_BYTE[cbSid];
+ CPPUNIT_ASSERT_MESSAGE("# re-creating SID buffer failed.\n", pSid!= NULL );
+ memset( pSid, 0, cbSid);
+ dwSidBufferSize = cbSid;
+ }
+ if (cchDomainName > dwDomainBufferSize)
+ {
+ // Reallocate memory for the domain name buffer.
+ wprintf(L"# The domain name buffer was too small. It will be reallocated.\n");
+ delete [] wszDomainName;
+ wszDomainName = new WCHAR[cchDomainName];
+ CPPUNIT_ASSERT_MESSAGE("# re-creating domain name buffer failed.\n", wszDomainName!= NULL );
+ memset(wszDomainName, 0, cchDomainName*sizeof(WCHAR));
+ dwDomainBufferSize = cchDomainName;
+ }
+ }
+ else
+ {
+ wprintf(L"# LookupAccountNameW failed. GetLastError returned: %d\n", dwErrorCode);
+ break;
+ }
+ }
+
+ // now got SID successfully, only need to compare SID, so I copied the rest lines from source to convert SID to OUString.
+ PSID_IDENTIFIER_AUTHORITY psia;
+ DWORD dwSubAuthorities;
+ DWORD dwSidRev=SID_REVISION;
+ DWORD dwCounter;
+ DWORD dwSidSize;
+ sal_Char *Ident;
+
+ /* obtain SidIdentifierAuthority */
+ psia=GetSidIdentifierAuthority(pSid);
+
+ /* obtain sidsubauthority count */
+ dwSubAuthorities=*GetSidSubAuthorityCount(pSid)<=5?*GetSidSubAuthorityCount(pSid):5;
+
+ /* buffer length: S-SID_REVISION- + identifierauthority- + subauthorities- + NULL */
+ Ident=(sal_Char * )malloc(88*sizeof(sal_Char));
+
+ /* prepare S-SID_REVISION- */
+ dwSidSize=wsprintf(Ident, TEXT("S-%lu-"), dwSidRev);
+
+ /* prepare SidIdentifierAuthority */
+ if ((psia->Value[0] != 0) || (psia->Value[1] != 0))
+ {
+ dwSidSize+=wsprintf(Ident + strlen(Ident),
+ TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
+ (USHORT)psia->Value[0],
+ (USHORT)psia->Value[1],
+ (USHORT)psia->Value[2],
+ (USHORT)psia->Value[3],
+ (USHORT)psia->Value[4],
+ (USHORT)psia->Value[5]);
+ }
+ else
+ {
+ dwSidSize+=wsprintf(Ident + strlen(Ident),
+ TEXT("%lu"),
+ (ULONG)(psia->Value[5] ) +
+ (ULONG)(psia->Value[4] << 8) +
+ (ULONG)(psia->Value[3] << 16) +
+ (ULONG)(psia->Value[2] << 24) );
+ }
+
+ /* loop through SidSubAuthorities */
+ for (dwCounter=0; dwCounter < dwSubAuthorities; dwCounter++)
+ {
+ dwSidSize+=wsprintf(Ident + dwSidSize, TEXT("-%lu"),
+ *GetSidSubAuthority(pSid, dwCounter) );
+ }
+
+ strUserID = ::rtl::OUString::createFromAscii( Ident );
+
+ free(Ident);
+ delete pSid;
+ delete [] wszDomainName;
+
+
+ /// check if logged in user is administrator:
+
+ WIN_BOOL b;
+ SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
+ PSID AdministratorsGroup;
+ b = AllocateAndInitializeSid(
+ &NtAuthority,
+ 2,
+ SECURITY_BUILTIN_DOMAIN_RID,
+ DOMAIN_ALIAS_RID_ADMINS,
+ 0, 0, 0, 0, 0, 0,
+ &AdministratorsGroup);
+ if(b)
+ {
+ if (!CheckTokenMembership( NULL, AdministratorsGroup, &b))
+ {
+ b = FALSE;
+ }
+ FreeSid(AdministratorsGroup);
+ }
+
+ isAdmin = ( sal_Bool )b;
+
+#endif
+
+ /// print the information.
+ t_print("#\n#Retrived system information is below:\n");
+
+ t_print("Computer Name: ");
+ if ( strComputerName == aNullURL )
+ t_print(" Not retrived\n" );
+ else
+ printUString( strComputerName );
+
+ t_print("Current User Name: ");
+ if ( strUserName == aNullURL )
+ t_print(" Not retrived\n" );
+ else
+ printUString( strUserName );
+
+ t_print("Current User Home Directory:");
+ if ( strHomeDirectory == aNullURL )
+ t_print(" Not retrived\n" );
+ else
+ printUString( strHomeDirectory );
+
+ t_print("Current Config Directory: ");
+ if ( strConfigDirectory == aNullURL )
+ t_print(" Not retrived\n" );
+ else
+ printUString( strConfigDirectory );
+
+ t_print("Current UserID: ");
+ if ( strUserID == aNullURL )
+ t_print(" Not retrived\n" );
+ else
+ printUString( strUserID );
+
+ t_print("Current User is");
+ if ( isAdmin == sal_False )
+ t_print(" NOT Administrator.\n" );
+ else
+ t_print(" Administrator.\n" );
+
+
+ /// get and display forwarded text if available.
+ aStringForward = ::rtl::OUString::createFromAscii( getForwardString() );
+ if ( !aStringForward.equals( aNullURL ) && aStringForward.indexOf( (sal_Unicode)' ' ) != -1 )
+ {
+ sal_Int32 nFirstSpacePoint = aStringForward.indexOf( (sal_Unicode)' ' );;
+ sal_Int32 nLastSpacePoint = aStringForward.lastIndexOf( (sal_Unicode)' ' );;
+ if ( nFirstSpacePoint == nLastSpacePoint )
+ /// only forwarded two parameters, username and password.
+ {
+ aLogonUser = aStringForward.copy( 0, nFirstSpacePoint );
+ t_print("\n#Forwarded username: ");
+ printUString( aLogonUser);
+
+ aLogonPasswd = aStringForward.copy( nFirstSpacePoint +1, aStringForward.getLength( ) - 1 );
+ t_print("#Forwarded password: ");
+ for ( int i = nFirstSpacePoint +1; i <= aStringForward.getLength( ) - 1; i++, t_print("*") );
+ t_print("\n" );
+ }
+ else
+ /// forwarded three parameters, username, password and fileserver.
+ {
+ aLogonUser = aStringForward.copy( 0, nFirstSpacePoint );
+ t_print("#Forwarded username: ");
+ printUString( aLogonUser);
+
+ aLogonPasswd = aStringForward.copy( nFirstSpacePoint +1, nLastSpacePoint );
+ t_print("#Forwarded password: ");
+ for ( int i = nFirstSpacePoint +1; i <= nLastSpacePoint; i++, t_print("*") );
+ t_print("\n" );
+
+ aFileServer = aStringForward.copy( nLastSpacePoint +1, aStringForward.getLength( ) - 1 );
+ t_print("#Forwarded FileServer: ");
+ printUString( aFileServer );
+
+ }
+ }
+
+ t_print("#\n#Initialization Done.\n" );
+
+}
diff --git a/sal/qa/osl/security/osl_Security_Const.h b/sal/qa/osl/security/osl_Security_Const.h
new file mode 100755
index 000000000000..0687a69345de
--- /dev/null
+++ b/sal/qa/osl/security/osl_Security_Const.h
@@ -0,0 +1,80 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _OSL_SECURITY_CONST_H_
+#define _OSL_SECURITY_CONST_H_
+
+#if ( defined WNT ) // Windows
+//#define UNICODE
+#include <tools/prewin.h>
+// #include <windows.h>
+#include <io.h>
+#include <tools/postwin.h>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+#include <sal/types.h>
+#include <rtl/ustring.hxx>
+#include <osl/file.hxx>
+#include <osl/security.hxx>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if ( defined UNX ) || ( defined OS2 )
+#include <unistd.h>
+#include <pwd.h>
+#endif
+
+#include <testshl/simpleheader.hxx>
+// LLA: #include <testshl2/cmdlinebits.hxx>
+
+
+#define BUFSIZE 1024
+const char pTestString[17] = "Sun Microsystems";
+
+
+#define OSLTEST_DECLARE_USTRING( str_name, str_value ) \
+ ::rtl::OUString a##str_name = rtl::OUString::createFromAscii( str_value )
+
+//------------------------------------------------------------------------
+// condition names
+//------------------------------------------------------------------------
+OSLTEST_DECLARE_USTRING( TestSec, "testsecurity" );
+OSLTEST_DECLARE_USTRING( NullURL, "" );
+
+::rtl::OUString aLogonUser( aNullURL ), aLogonPasswd( aNullURL ), aFileServer( aNullURL ), aStringForward( aNullURL );
+::rtl::OUString strUserName( aNullURL ) , strComputerName( aNullURL ) , strHomeDirectory( aNullURL );
+::rtl::OUString strConfigDirectory( aNullURL ), strUserID( aNullURL );
+
+sal_Bool isAdmin = sal_False;
+
+#endif /* _OSL_SECURITY_CONST_H_ */
diff --git a/sal/qa/osl/socket/export.exp b/sal/qa/osl/socket/export.exp
new file mode 100755
index 000000000000..a13529da5876
--- /dev/null
+++ b/sal/qa/osl/socket/export.exp
@@ -0,0 +1 @@
+registerAllTestFunction
diff --git a/sal/qa/osl/socket/makefile.mk b/sal/qa/osl/socket/makefile.mk
new file mode 100755
index 000000000000..bd92b5f40f3a
--- /dev/null
+++ b/sal/qa/osl/socket/makefile.mk
@@ -0,0 +1,223 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_osl_socket
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Socket by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/osl_Socket.obj
+
+SHL1TARGET=osl_SocketOld
+SHL1STDLIBS= $(SALLIB) $CPPUNITLIB) $(TESTSHL2LIB)
+
+.IF "$(GUI)" == "WNT"
+SHL1STDLIBS+= $(WS2_32LIB)
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL1STDLIBS+= -ldl -lnsl
+.ENDIF
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+DEF1NAME=$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+# auto generated Target:Socket
+# END ------------------------------------------------------------------
+
+# --- BEGIN --------------------------------------------------------
+SHL2OBJS= \
+ $(SLO)$/osl_Socket_tests.obj
+SHL2TARGET= osl_Socket_tests
+SHL2STDLIBS= $(SALLIB) $CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL2IMPLIB= i$(SHL2TARGET)
+DEF2NAME= $(SHL2TARGET)
+SHL2VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END --------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Socket by codegen.pl
+SHL3OBJS= \
+ $(SLO)$/sockethelper.obj \
+ $(SLO)$/osl_StreamSocket.obj
+
+SHL3TARGET= osl_StreamSocket
+SHL3STDLIBS= $(SALLIB) $CPPUNITLIB) $(TESTSHL2LIB)
+
+.IF "$(GUI)" == "WNT"
+SHL3STDLIBS += $(WS2_32LIB)
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL3STDLIBS += -ldl -lnsl
+.ENDIF
+
+SHL3IMPLIB= i$(SHL3TARGET)
+DEF3NAME= $(SHL3TARGET)
+SHL3VERSIONMAP = $(PRJ)$/qa$/export.map
+# auto generated Target:Socket
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Socket by codegen.pl
+SHL4OBJS= \
+ $(SLO)$/sockethelper.obj \
+ $(SLO)$/osl_DatagramSocket.obj
+
+SHL4TARGET= osl_DatagramSocket
+SHL4STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+.IF "$(GUI)" == "WNT"
+SHL4STDLIBS += $(WS2_32LIB)
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL4STDLIBS += -ldl -lnsl
+.ENDIF
+
+SHL4IMPLIB= i$(SHL4TARGET)
+DEF4NAME= $(SHL4TARGET)
+SHL4VERSIONMAP = $(PRJ)$/qa$/export.map
+# auto generated Target:Socket
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Socket by codegen.pl
+SHL5OBJS= \
+ $(SLO)$/sockethelper.obj \
+ $(SLO)$/osl_SocketAddr.obj
+
+SHL5TARGET= osl_SocketAddr
+SHL5STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+.IF "$(GUI)" == "WNT"
+SHL5STDLIBS += $(WS2_32LIB)
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL5STDLIBS += -ldl -lnsl
+.ENDIF
+
+SHL5IMPLIB= i$(SHL5TARGET)
+DEF5NAME= $(SHL5TARGET)
+SHL5VERSIONMAP = $(PRJ)$/qa$/export.map
+# auto generated Target:Socket
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Socket by codegen.pl
+SHL6OBJS= \
+ $(SLO)$/sockethelper.obj \
+ $(SLO)$/osl_Socket2.obj
+
+SHL6TARGET= osl_Socket2
+SHL6STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+.IF "$(GUI)" == "WNT"
+SHL6STDLIBS += $(WS2_32LIB)
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL6STDLIBS += -ldl -lnsl
+.ENDIF
+
+SHL6IMPLIB= i$(SHL6TARGET)
+DEF6NAME= $(SHL6TARGET)
+SHL6VERSIONMAP = $(PRJ)$/qa$/export.map
+# auto generated Target:Socket
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Socket by codegen.pl
+SHL7OBJS= \
+ $(SLO)$/sockethelper.obj \
+ $(SLO)$/osl_ConnectorSocket.obj
+
+SHL7TARGET= osl_ConnectorSocket
+SHL7STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+.IF "$(GUI)" == "WNT"
+SHL7STDLIBS += $(WS2_32LIB)
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL7STDLIBS += -ldl -lnsl
+.ENDIF
+
+SHL7IMPLIB= i$(SHL7TARGET)
+DEF7NAME= $(SHL7TARGET)
+SHL7VERSIONMAP = $(PRJ)$/qa$/export.map
+# auto generated Target:Socket
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:Socket by codegen.pl
+SHL8OBJS= \
+ $(SLO)$/sockethelper.obj \
+ $(SLO)$/osl_AcceptorSocket.obj
+
+SHL8TARGET= osl_AcceptorSocket
+SHL8STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+.IF "$(GUI)" == "WNT"
+SHL8STDLIBS += $(WS2_32LIB)
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL8STDLIBS += -ldl -lnsl
+.ENDIF
+
+SHL8IMPLIB= i$(SHL8TARGET)
+DEF8NAME= $(SHL8TARGET)
+SHL8VERSIONMAP = $(PRJ)$/qa$/export.map
+# auto generated Target:Socket
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS) $(SHL2OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/osl/socket/osl_AcceptorSocket.cxx b/sal/qa/osl/socket/osl_AcceptorSocket.cxx
new file mode 100644
index 000000000000..e98af5f9d3b0
--- /dev/null
+++ b/sal/qa/osl/socket/osl_AcceptorSocket.cxx
@@ -0,0 +1,302 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/** test coder preface:
+ 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform
+ if you are not including ws2_32.lib in makefile.mk, the including format will be like this:
+
+ .IF "$(GUI)" == "WNT"
+ SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib
+ SHL1STDLIBS += ws2_32.lib
+ .ENDIF
+
+ likewise on Solaris platform.
+ .IF "$(GUI)" == "UNX"
+ SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+ SHL1STDLIBS += -lsocket -ldl -lnsl
+ .ENDIF
+
+ 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4
+ category.
+
+ 3. some fragment of Socket source implementation are lack of comment so it is hard for testers
+ guess what the exact functionality or usage of a member. Hope the Socket section's comment
+ will be added.
+
+ 4. following functions are declared but not implemented:
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
+ */
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+
+#include <testshl/simpleheader.hxx>
+
+#include "osl_Socket_Const.h"
+#include "sockethelper.hxx"
+
+using namespace osl;
+using namespace rtl;
+
+#define IP_PORT_FTP 21
+#define IP_PORT_MYPORT9 8897
+#define IP_PORT_MYPORT4 8885
+#define IP_PORT_MYPORT3 8884
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+// just used to test socket::close() when accepting
+class AcceptorThread : public Thread
+{
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::rtl::OUString aHostIP;
+ sal_Bool bOK;
+protected:
+ void SAL_CALL run( )
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIP, IP_PORT_MYPORT9 );
+ ::osl::StreamSocket ssStreamConnection;
+
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ if ( sal_True != bOK1 )
+ {
+ t_print("# AcceptorSocket bind address failed.\n" ) ;
+ return;
+ }
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ if ( sal_True != bOK2 )
+ {
+ t_print("# AcceptorSocket listen address failed.\n" ) ;
+ return;
+ }
+
+ asAcceptorSocket.enableNonBlockingMode( sal_False );
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ bOK = sal_True;
+ t_print("AcceptorThread: acceptConnection failed! \n");
+ }
+ }
+public:
+ AcceptorThread(::osl::AcceptorSocket & asSocket, ::rtl::OUString const& aBindIP )
+ : asAcceptorSocket( asSocket ), aHostIP( aBindIP )
+ {
+ bOK = sal_False;
+ }
+
+ sal_Bool isOK() { return bOK; }
+
+ ~AcceptorThread( )
+ {
+ if ( isRunning( ) )
+ {
+ asAcceptorSocket.shutdown();
+ t_print("# error: Acceptor thread not terminated.\n" );
+ }
+ }
+};
+
+namespace osl_AcceptorSocket
+{
+
+ /** testing the methods:
+ inline AcceptorSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+
+ void ctors_001()
+ {
+ /// Socket constructor.
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the acceptor socket was created successfully.",
+ osl_Socket_TypeStream == asSocket.getType( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+#if 0 /* OBSOLETE */
+ class operator_assign : public CppUnit::TestFixture
+ {
+ public:
+
+ void assign_001()
+ {
+#if defined(LINUX)
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::AcceptorSocket asSocketAssign( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ asSocket.setOption( osl_Socket_OptionReuseAddr, 1);
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT4 );
+ asSocket.bind( saSocketAddr );
+
+ AcceptorThread myAcceptorThread( asSocketAssign, rtl::OUString::createFromAscii("127.0.0.1") );
+ myAcceptorThread.create();
+
+ thread_sleep( 1 );
+ //when accepting, assign another socket to the socket, the thread will not be closed, so is blocking
+ asSocketAssign = asSocket;
+
+ t_print("#asSocketAssign port number is %d\n", asSocketAssign.getLocalPort() );
+
+ asSocketAssign.shutdown();
+ myAcceptorThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.",
+ myAcceptorThread.isOK() == sal_True );
+
+
+#endif /* LINUX */
+ }
+
+
+ CPPUNIT_TEST_SUITE( operator_assign );
+ CPPUNIT_TEST( assign_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class operator_assign
+#endif /* OBSOLETE */
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL listen(sal_Int32 MaxPendingConnections= -1);
+ inline oslSocketResult SAL_CALL acceptConnection( StreamSocket& Connection);
+ inline oslSocketResult SAL_CALL acceptConnection( StreamSocket& Connection, SocketAddr & PeerAddr);
+ */
+
+ class listen_accept : public CppUnit::TestFixture
+ {
+ public:
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1);
+ // sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ // sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void listen_accept_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT3 );
+ ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT3 );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ CPPUNIT_ASSERT_MESSAGE( "test for listen_accept function: try to create a connection with remote host, using listen and accept.",
+ ( osl_Socket_Ok == eResult ) );
+ }
+
+ void listen_accept_002()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT4 );
+ ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT4 );
+ ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection(ssConnection, saPeerSocketAddr); /// waiting for incoming connection...
+
+ CPPUNIT_ASSERT_MESSAGE( "test for listen_accept function: try to create a connection with remote host, using listen and accept, accept with peer address.",
+ ( sal_True == bOK2 ) &&
+ ( osl_Socket_Ok == eResult ) &&
+ ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( listen_accept );
+ CPPUNIT_TEST( listen_accept_001 );
+ CPPUNIT_TEST( listen_accept_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class listen_accept
+
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::ctors, "osl_AcceptorSocket");
+//CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::operator_assign, "osl_AcceptorSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::listen_accept, "osl_AcceptorSocket");
+
+} // namespace osl_AcceptorSocket
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/socket/osl_ConnectorSocket.cxx b/sal/qa/osl/socket/osl_ConnectorSocket.cxx
new file mode 100644
index 000000000000..4a5273e5a0e8
--- /dev/null
+++ b/sal/qa/osl/socket/osl_ConnectorSocket.cxx
@@ -0,0 +1,264 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/** test coder preface:
+ 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform
+ if you are not including ws2_32.lib in makefile.mk, the including format will be like this:
+
+ .IF "$(GUI)" == "WNT"
+ SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib
+ SHL1STDLIBS += ws2_32.lib
+ .ENDIF
+
+ likewise on Solaris platform.
+ .IF "$(GUI)" == "UNX"
+ SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+ SHL1STDLIBS += -lsocket -ldl -lnsl
+ .ENDIF
+
+ 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4
+ category.
+
+ 3. some fragment of Socket source implementation are lack of comment so it is hard for testers
+ guess what the exact functionality or usage of a member. Hope the Socket section's comment
+ will be added.
+
+ 4. following functions are declared but not implemented:
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
+ */
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+
+#include <testshl/simpleheader.hxx>
+
+#include "osl_Socket_Const.h"
+#include "sockethelper.hxx"
+
+using namespace osl;
+using namespace rtl;
+
+#define IP_PORT_MYPORT2 8883
+#define IP_PORT_FTP 21
+#define IP_PORT_MYPORT3 8884
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+class CloseSocketThread : public Thread
+{
+ ::osl::Socket &m_sSocket;
+protected:
+ void SAL_CALL run( )
+ {
+ thread_sleep( 1 );
+ m_sSocket.close( );
+ }
+public:
+ CloseSocketThread(::osl::Socket & sSocket )
+ : m_sSocket( sSocket )
+ {
+ }
+
+ ~CloseSocketThread( )
+ {
+ if ( isRunning( ) )
+ {
+ t_print("# error: CloseSocketThread not terminated.\n" );
+ }
+ }
+};
+
+namespace osl_ConnectorSocket
+{
+
+ /** testing the method:
+ ConnectorSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ void ctors_001()
+ {
+ /// Socket constructor.
+ ::osl::ConnectorSocket csSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the connector socket was created successfully.",
+ osl_Socket_TypeStream == csSocket.getType( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+ /** testing the method:
+ oslSocketResult SAL_CALL connect(const SocketAddr& TargetHost, const TimeValue* pTimeout = 0);
+ */
+
+ class connect : public CppUnit::TestFixture
+ {
+ public:
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ // sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ // sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void connect_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT2 );
+ ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT2 );
+ ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+
+ //asAcceptorSocket.enableNonBlockingMode( sal_True );
+ //oslSocketResult eResultAccept = asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+ //CPPUNIT_ASSERT_MESSAGE( "accept failed.", osl_Socket_Ok == eResultAccept );
+ /// launch client socket
+ oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+ CPPUNIT_ASSERT_MESSAGE( "connect failed.", osl_Socket_Ok == eResult );
+
+ /// get peer information
+ csConnectorSocket.getPeerAddr( saPeerSocketAddr );/// connected.
+
+ CPPUNIT_ASSERT_MESSAGE( "test for connect function: try to create a connection with remote host. and check the setup address.",
+ ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) &&
+ ( osl_Socket_Ok == eResult ));
+ }
+ //non-blocking mode connect?
+ void connect_002()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT3 );
+ ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT3 );
+ ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+
+ csConnectorSocket.enableNonBlockingMode( sal_True );
+
+ oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+ CPPUNIT_ASSERT_MESSAGE( "connect failed.", osl_Socket_InProgress == eResult || osl_Socket_Ok == eResult );
+
+ /// get peer information
+ csConnectorSocket.getPeerAddr( saPeerSocketAddr );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for connect function: try to create a connection with remote host. and check the setup address.",
+ sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) ;
+ }
+ // really an error or just delayed
+ // how to design senarios that will return osl_Socket_Interrupted, osl_Socket_TimedOut
+ void connect_003()
+ {
+ ::osl::SocketAddr saTargetSocketAddr1( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT3 );
+ ::osl::SocketAddr saTargetSocketAddr2( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT3 );
+
+ csConnectorSocket.enableNonBlockingMode( sal_False );
+
+ oslSocketResult eResult1 = csConnectorSocket.connect( saTargetSocketAddr1, pTimeout );
+ oslSocketResult eResult2 = csConnectorSocket.connect( saTargetSocketAddr2, pTimeout );
+ CloseSocketThread myCloseThread( csConnectorSocket );
+ oslSocketResult eResult3 = csConnectorSocket.connect( saTargetSocketAddr2, pTimeout );
+ myCloseThread.join();
+ CPPUNIT_ASSERT_MESSAGE( "connect should failed.", osl_Socket_Error == eResult1 &&
+ osl_Socket_Error == eResult2 && osl_Socket_Error == eResult3 );
+
+ }
+
+ // really an error in non-blocking mode
+ void connect_004()
+ {
+ ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT3 );
+
+ csConnectorSocket.enableNonBlockingMode( sal_True );
+
+ oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+ CPPUNIT_ASSERT_MESSAGE( "connect should failed.", osl_Socket_Error == eResult );
+ }
+ /** here need a case: immediate connection, say in non-blocking mode connect return osl_Socket_Ok
+ */
+
+ CPPUNIT_TEST_SUITE( connect );
+ CPPUNIT_TEST( connect_001 );
+ CPPUNIT_TEST( connect_002 );
+ CPPUNIT_TEST( connect_003 );
+ CPPUNIT_TEST( connect_004 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class connect
+
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ConnectorSocket::ctors, "osl_ConnectorSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ConnectorSocket::connect, "osl_ConnectorSocket");
+
+} // namespace osl_ConnectorSocket
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/socket/osl_ConnectorSocket.xsce b/sal/qa/osl/socket/osl_ConnectorSocket.xsce
new file mode 100644
index 000000000000..6c04ae2eb6f3
--- /dev/null
+++ b/sal/qa/osl/socket/osl_ConnectorSocket.xsce
@@ -0,0 +1 @@
+osl_ConnectorSocket.connect.connect_003 wntmsci
diff --git a/sal/qa/osl/socket/osl_DatagramSocket.cxx b/sal/qa/osl/socket/osl_DatagramSocket.cxx
new file mode 100644
index 000000000000..9a60bb8249b3
--- /dev/null
+++ b/sal/qa/osl/socket/osl_DatagramSocket.cxx
@@ -0,0 +1,316 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/** test coder preface:
+ 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform
+ if you are not including ws2_32.lib in makefile.mk, the including format will be like this:
+
+ .IF "$(GUI)" == "WNT"
+ SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib
+ SHL1STDLIBS += ws2_32.lib
+ .ENDIF
+
+ likewise on Solaris platform.
+ .IF "$(GUI)" == "UNX"
+ SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+ SHL1STDLIBS += -lsocket -ldl -lnsl
+ .ENDIF
+
+ 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4
+ category.
+
+ 3. some fragment of Socket source implementation are lack of comment so it is hard for testers
+ guess what the exact functionality or usage of a member. Hope the Socket section's comment
+ will be added.
+
+ 4. following functions are declared but not implemented:
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
+ */
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+
+#include <testshl/simpleheader.hxx>
+
+//#include "osl_Socket_Const.h"
+#include "sockethelper.hxx"
+
+using namespace osl;
+using namespace rtl;
+
+#define IP_PORT_MYPORT9 8897
+#define IP_PORT_MYPORT10 8898
+
+const char * pTestString1 = "test socket";
+const char * pTestString2 = " Passed#OK";
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+class CloseSocketThread : public Thread
+{
+ ::osl::Socket m_sSocket;
+protected:
+ void SAL_CALL run( )
+ {
+ thread_sleep( 1 );
+ m_sSocket.close( );
+ }
+public:
+ CloseSocketThread(::osl::Socket & sSocket )
+ : m_sSocket( sSocket )
+ {
+ }
+
+ ~CloseSocketThread( )
+ {
+ if ( isRunning( ) )
+ {
+ t_print("# error: CloseSocketThread not terminated.\n" );
+ }
+ }
+};
+
+//------------------------------------------------------------------------
+// tests cases begins here
+//------------------------------------------------------------------------
+
+namespace osl_DatagramSocket
+{
+
+ /** testing the methods:
+ inline DatagramSocket(oslAddrFamily Family= osl_Socket_FamilyInet,
+ oslProtocol Protocol= osl_Socket_ProtocolIp,
+ oslSocketType Type= osl_Socket_TypeDgram);
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+
+ void ctors_001()
+ {
+ /// Socket constructor.
+ ::osl::DatagramSocket dsSocket;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the datagram socket was created successfully.",
+ osl_Socket_TypeDgram == dsSocket.getType( ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+/**thread do sendTo, refer to http://www.coding-zone.co.uk/cpp/articles/140101networkprogrammingv.shtml
+*/
+class TalkerThread : public Thread
+{
+protected:
+ ::osl::SocketAddr saTargetSocketAddr;
+ ::osl::DatagramSocket dsSocket;
+
+ void SAL_CALL run( )
+ {
+ dsSocket.sendTo( saTargetSocketAddr, pTestString1, strlen( pTestString1 ) + 1 ); // "test socket"
+ dsSocket.shutdown();
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ }
+
+public:
+ TalkerThread( ):
+ saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT9 )
+ {
+ }
+
+ ~TalkerThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: TalkerThread not terminated normally.\n" );
+ }
+};
+
+/**thread do listen, refer to http://www.coding-zone.co.uk/cpp/articles/140101networkprogrammingv.shtml
+*/
+class ListenerThread : public Thread
+{
+protected:
+ ::osl::SocketAddr saTargetSocketAddr;
+ ::osl::DatagramSocket dsSocket;
+
+ void SAL_CALL run( )
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT10 );
+ dsSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+ if ( dsSocket.bind( saLocalSocketAddr ) == sal_False )
+ {
+ t_print("DatagramSocket bind failed \n");
+ return;
+ }
+ //blocking mode: default
+ sal_Int32 nRecv = dsSocket.recvFrom( pRecvBuffer, 30, &saTargetSocketAddr); //strlen( pTestString2 ) + 1
+ t_print("After recvFrom, nRecv is %d\n", nRecv);
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ }
+
+public:
+ sal_Char pRecvBuffer[30];
+ ListenerThread( ):
+ saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT10 )
+ {
+ pRecvBuffer[0] = '\0';
+ }
+
+ ~ListenerThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: ListenerThread not terminated normally.\n" );
+ }
+
+};
+
+ /** testing the methods:
+ inline sal_Int32 DatagramSocket::recvFrom(void* pBuffer, sal_uInt32 BufferSize,
+ SocketAddr* pSenderAddr, oslSocketMsgFlag Flag )
+ inline sal_Int32 DatagramSocket::sendTo( const SocketAddr& ReceiverAddr,
+ const void* pBuffer, sal_uInt32 BufferSize, oslSocketMsgFlag Flag )
+ */
+
+ class sendTo_recvFrom : public CppUnit::TestFixture
+ {
+ public:
+
+ void sr_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT9 );
+ ::osl::DatagramSocket dsSocket;
+ dsSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+ dsSocket.bind( saLocalSocketAddr );
+
+ sal_Char pReadBuffer[30];
+ TalkerThread myTalkThread;
+ myTalkThread.create();
+ sal_Int32 nRecv = dsSocket.recvFrom( pReadBuffer, 30, &saLocalSocketAddr);
+ myTalkThread.join();
+ //t_print("#received buffer is %s# \n", pReadBuffer);
+
+ sal_Bool bOk = ( strcmp(pReadBuffer, pTestString1) == 0 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for sendTo/recvFrom function: create a talker thread and recvFrom in the main thread, check if the datagram socket can communicate successfully.",
+ nRecv > 0 && bOk == sal_True );
+ }
+
+ void sr_002()
+ {
+ ::osl::SocketAddr saListenSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT10 );
+ ::osl::DatagramSocket dsSocket;
+
+ //listener thread construct a DatagramSocket, recvFrom waiting for data, then main thread sendto data
+ ListenerThread myListenThread;
+ myListenThread.create();
+ //to grantee the recvFrom is before sendTo
+ thread_sleep( 1 );
+
+ sal_Int32 nSend = dsSocket.sendTo( saListenSocketAddr, pTestString2, strlen( pTestString2 ) + 1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo failed: nSend <= 0.", nSend > 0);
+
+ myListenThread.join();
+ //t_print("#received buffer is %s# \n", myListenThread.pRecvBuffer);
+
+ sal_Bool bOk = ( strcmp( myListenThread.pRecvBuffer, pTestString2) == 0 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for sendTo/recvFrom function: create a listener thread and sendTo in the main thread, check if the datagram socket can communicate successfully.",
+ bOk == sal_True );
+ }
+
+ //sendTo error, return -1; recvFrom error, return -1
+ void sr_003()
+ {
+ ::osl::SocketAddr saListenSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT10 );
+ ::osl::DatagramSocket dsSocket;
+ // Transport endpoint is not connected
+ sal_Int32 nSend = dsSocket.sendTo( saListenSocketAddr, pTestString2, strlen( pTestString2 ) + 1 );
+ CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo should fail: nSend <= 0.",
+ nSend == -1 );
+ }
+
+ void sr_004()
+ {
+ ::osl::SocketAddr saListenSocketAddr1( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT10 );
+ ::osl::SocketAddr saListenSocketAddr2( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_MYPORT10 );
+ ::osl::DatagramSocket dsSocket;
+
+ dsSocket.enableNonBlockingMode( sal_True );
+
+ sal_Char pReadBuffer[30];
+ //sal_Int32 nRecv1 = dsSocket.recvFrom( pReadBuffer, 30, &saListenSocketAddr1 );
+
+ // will block ?
+ CloseSocketThread myThread( dsSocket );
+ myThread.create();
+ sal_Int32 nRecv2 = dsSocket.recvFrom( pReadBuffer, 30, &saListenSocketAddr1 );
+ myThread.join();
+ //t_print("#nRecv1 is %d nRecv2 is %d\n", nRecv1, nRecv2 );
+ CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo should fail: nSend <= 0.",
+ nRecv2 == -1 );
+ }
+
+ CPPUNIT_TEST_SUITE( sendTo_recvFrom );
+ CPPUNIT_TEST( sr_001 );
+ CPPUNIT_TEST( sr_002 );
+ CPPUNIT_TEST( sr_003 );
+ CPPUNIT_TEST( sr_004 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class sendTo_recvFrom
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DatagramSocket::ctors, "osl_DatagramSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DatagramSocket::sendTo_recvFrom, "osl_DatagramSocket");
+
+} // namespace osl_DatagramSocket
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/socket/osl_Socket.cxx b/sal/qa/osl/socket/osl_Socket.cxx
new file mode 100755
index 000000000000..4a981bc7faa9
--- /dev/null
+++ b/sal/qa/osl/socket/osl_Socket.cxx
@@ -0,0 +1,3723 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/** test coder preface:
+ 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform
+ if you are not including ws2_32.lib in makefile.mk, the including format will be like this:
+
+ .IF "$(GUI)" == "WNT"
+ SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib
+ SHL1STDLIBS += ws2_32.lib
+ .ENDIF
+
+ likewise on Solaris platform.
+ .IF "$(GUI)" == "UNX"
+ SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+ SHL1STDLIBS += -lsocket -ldl -lnsl
+ .ENDIF
+
+ 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4
+ category.
+
+ 3. some fragment of Socket source implementation are lack of comment so it is hard for testers
+ guess what the exact functionality or usage of a member. Hope the Socket section's comment
+ will be added.
+
+ 4. following functions are declared but not implemented:
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
+ */
+
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+
+#ifndef _OSL_SOCKET_CONST_H_
+#include <osl_Socket_Const_orig.h>
+#endif
+
+#include <testshl/simpleheader.hxx>
+
+using namespace osl;
+using namespace rtl;
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+/** compare two OUString.
+*/
+inline sal_Bool compareUString( const ::rtl::OUString & ustr1, const ::rtl::OUString & ustr2 )
+{
+ sal_Bool bOk = ustr1.equalsIgnoreAsciiCase( ustr2 );
+
+ return bOk;
+}
+
+/** compare a OUString and an ASCII string.
+*/
+inline sal_Bool compareUString( const ::rtl::OUString & ustr, const sal_Char *astr )
+{
+ ::rtl::OUString ustr2 = rtl::OUString::createFromAscii( astr );
+ sal_Bool bOk = ustr.equalsIgnoreAsciiCase( ustr2 );
+
+ return bOk;
+}
+
+/** compare two socket address.
+*/
+inline sal_Bool compareSocketAddr( const ::osl::SocketAddr & addr1 , const ::osl::SocketAddr & addr2 )
+{
+ return ( ( sal_True == compareUString( addr1.getHostname( 0 ), addr2.getHostname( 0 ) ) ) && ( addr2.getPort( ) == addr2.getPort( ) ) );
+}
+
+inline char * oustring2char( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ return (char *)aString.getStr( );
+}
+
+/** print a UNI_CODE String. And also print some comments of the string.
+*/
+inline void printUString( const ::rtl::OUString & str, const sal_Char * msg = "" )
+{
+ t_print("#%s #printUString_u# ", msg );
+ t_print("%s\n", oustring2char( str ) );
+}
+
+/** get the local host name.
+ mindy: gethostbyname( "localhost" ), on Linux, it returns the hostname in /etc/hosts + domain name,
+ if no entry in /etc/hosts, it returns "localhost" + domain name
+*/
+inline ::rtl::OUString getHost( void )
+{
+ struct hostent *hptr;
+
+ hptr = gethostbyname( "localhost" );
+ CPPUNIT_ASSERT_MESSAGE( "#In getHostname function, error on gethostbyname()", hptr != NULL );
+ ::rtl::OUString aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) hptr->h_name );
+
+ return aUString;
+}
+
+/** get the full host name of the current processor, such as "aegean.prc.sun.com" --mindyliu
+*/
+inline ::rtl::OUString getThisHostname( void )
+{
+ ::rtl::OUString aUString;
+#ifdef WNT
+ struct hostent *hptr;
+ hptr = gethostbyname( "localhost" );
+ CPPUNIT_ASSERT_MESSAGE( "#In getHostname function, error on gethostbyname()", hptr != NULL );
+ aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) hptr->h_name );
+#else
+ char hostname[255];
+ CPPUNIT_ASSERT_MESSAGE( "#Error: gethostname failed.", gethostname(hostname, 255) == 0 );
+
+ struct hostent *hptr;
+ //first search /ets/hosts, then search from dns
+ hptr = gethostbyname( hostname);
+ if ( hptr != NULL )
+ {
+ strcpy( hostname, hptr->h_name );
+ }
+
+ t_print("hostname is %s \n", hostname );
+ aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) hostname );
+#endif
+ return aUString;
+}
+
+/** get IP by name, search /etc/hosts first, then search from dns, fail return OUString("")
+*/
+inline ::rtl::OUString getIPbyName( rtl::OString const& str_name )
+{
+ ::rtl::OUString aUString;
+ struct hostent *hptr;
+ //first search /ets/hosts, then search from dns
+ hptr = gethostbyname( str_name.getStr());
+ if ( hptr != NULL )
+ {
+ struct in_addr ** addrptr;
+ addrptr = (struct in_addr **) hptr->h_addr_list ;
+ //if there are more than one IPs on the same machine, we select one
+ for (; *addrptr; addrptr++)
+ {
+ t_print("#Local IP Address: %s\n", inet_ntoa(**addrptr));
+ aUString = ::rtl::OUString::createFromAscii( (sal_Char *) (inet_ntoa(**addrptr)) );
+ }
+ }
+ return aUString;
+}
+
+/** get local ethernet IP
+*/
+inline ::rtl::OUString getLocalIP( )
+{
+ char hostname[255];
+ gethostname(hostname, 255);
+
+ return getIPbyName( hostname );
+}
+
+/** construct error message
+*/
+inline ::rtl::OUString outputError( const ::rtl::OUString & returnVal, const ::rtl::OUString & rightVal, const sal_Char * msg = "")
+{
+ ::rtl::OUString aUString;
+ if ( returnVal.equals( rightVal ) )
+ return aUString;
+ aUString += ::rtl::OUString::createFromAscii(msg);
+ aUString += ::rtl::OUString::createFromAscii(": the returned value is '");
+ aUString += returnVal;
+ aUString += ::rtl::OUString::createFromAscii("', but the value should be '");
+ aUString += rightVal;
+ aUString += ::rtl::OUString::createFromAscii("'.");
+ return aUString;
+}
+
+/** wait _nSec seconds.
+*/
+void thread_sleep( sal_Int32 _nSec )
+{
+ /// print statement in thread process must use fflush() to force display.
+ t_print("# wait %d seconds. ", _nSec );
+ fflush(stdout);
+
+#ifdef WNT //Windows
+ Sleep( _nSec * 100 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ usleep(_nSec * 100000);
+#endif
+ t_print("# done\n" );
+}
+
+/** print Boolean value.
+*/
+inline void printBool( sal_Bool bOk )
+{
+ t_print("#printBool# " );
+ ( sal_True == bOk ) ? t_print("YES!\n" ): t_print("NO!\n" );
+}
+
+/** print content of a ByteSequence.
+*/
+inline void printByteSequence_IP( const ::rtl::ByteSequence & bsByteSeq, sal_Int32 nLen )
+{
+ t_print("#ByteSequence is: " );
+ for ( int i = 0; i < nLen; i++ ){
+ if ( bsByteSeq[i] < 0 )
+ t_print("%d ", 256 + bsByteSeq[i] );
+ else
+ t_print("%d ", bsByteSeq[i] );
+ }
+ t_print(" .\n" );
+}
+
+/** convert an IP which is stored as a UString format to a ByteSequence array for later use.
+*/
+inline ::rtl::ByteSequence UStringIPToByteSequence( ::rtl::OUString aUStr )
+{
+
+ rtl::OString aString = ::rtl::OUStringToOString( aUStr, RTL_TEXTENCODING_ASCII_US );
+ const sal_Char *pChar = aString.getStr( ) ;
+ sal_Char tmpBuffer[4];
+ sal_Int32 nCharCounter = 0;
+ ::rtl::ByteSequence bsByteSequence( IP_VER );
+ sal_Int32 nByteSeqCounter = 0;
+
+ for ( int i = 0; i < aString.getLength( ) + 1 ; i++ )
+ {
+ if ( ( *pChar != '.' ) && ( i !=aString.getLength( ) ) )
+ tmpBuffer[nCharCounter++] = *pChar;
+ else
+ {
+ tmpBuffer[nCharCounter] = '\0';
+ nCharCounter = 0;
+ bsByteSequence[nByteSeqCounter++] = static_cast<sal_Int8>( atoi( tmpBuffer ) );
+ }
+ pChar++;
+ }
+ return bsByteSequence;
+}
+
+/** print a socket result name.
+*/
+inline void printSocketResult( oslSocketResult eResult )
+{
+ t_print("#printSocketResult# " );
+ if (!eResult)
+ switch (eResult)
+ {
+ case osl_Socket_Ok:
+ t_print("client connected\n");
+ break;
+ case osl_Socket_Error:
+ t_print("got an error ... exiting\r\n\r\n" );
+ break;
+ case osl_Socket_TimedOut:
+ t_print("timeout\n");
+ break;
+
+ case osl_Socket_FORCE_EQUAL_SIZE:
+ t_print("FORCE EQUAL SIZE\n");
+ break;
+ case osl_Socket_InProgress:
+ t_print("In Progress\n");
+ break;
+ case osl_Socket_Interrupted:
+ t_print("Interrupted\n");
+ break;
+ }
+}
+
+/** Client Socket Thread, served as a temp little client to communicate with server.
+*/
+class ClientSocketThread : public Thread
+{
+protected:
+ oslThreadIdentifier m_id;
+ ::osl::SocketAddr saTargetSocketAddr;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+ void SAL_CALL run( )
+ {
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 5;
+ pTimeout->Nanosec = 0;
+
+ /// if the thread should terminate, schedule return false
+ //while ( schedule( ) == sal_True )
+ //{
+ if ( osl_Socket_Ok == csConnectorSocket.connect( saTargetSocketAddr, pTimeout ))
+ {
+ csConnectorSocket.send( pTestString1, 11 ); // "test socket"
+ csConnectorSocket.send( pTestString2, 10);
+ }
+ else
+ t_print("# ClientSocketThread: connect failed! \n");
+ // terminate();
+ //}
+ csConnectorSocket.close();
+ free( pTimeout );
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this thread %d!\n", m_id );
+ }
+
+public:
+ ClientSocketThread( ):
+ saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT9 ),
+ csConnectorSocket( )
+ {
+ m_id = getIdentifier( );
+ //t_print("# successfully creat this client thread %d!\n", m_id );
+ }
+
+ ~ClientSocketThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: client thread not terminated.\n" );
+ }
+
+};
+
+
+/** Server Socket Thread, served as a temp little server to communicate with client.
+*/
+class ServerSocketThread : public Thread
+{
+protected:
+ oslThreadIdentifier m_id;
+
+ void SAL_CALL run( )
+ {
+ ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9 );
+ ::osl::StreamSocket ssStreamConnection;
+
+ //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True);
+ while ( schedule( ) == sal_True )
+ {
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ if ( sal_True != bOK1 )
+ {
+ t_print("# ServerSocketThread: AcceptorSocket bind address failed.\n" ) ;
+ break;
+ }
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ if ( sal_True != bOK2 )
+ {
+ t_print("# ServerSocketThread: AcceptorSocket listen address failed.\n" ) ;
+ break;
+ }
+
+ asAcceptorSocket.enableNonBlockingMode( sal_False );
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ t_print("ServerSocketThread: acceptConnection failed! \n");
+ break;
+ }
+ sal_Int32 nReadNumber1 = ssStreamConnection.recv( pReadBuffer, 11 );
+ sal_Int32 nReadNumber2 = ssStreamConnection.recv( pReadBuffer + nReadNumber1, 11 );
+ pReadBuffer[nReadNumber1 + nReadNumber2] = '\0';
+ //t_print("# read buffer content: %s\n", pReadBuffer );
+ break;
+ }
+ ssStreamConnection.close();
+ asAcceptorSocket.close();
+
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this server thread %d!\n", m_id );
+ }
+
+public:
+ // public to check if data transmition is OK
+ sal_Char pReadBuffer[30];
+ ServerSocketThread( )
+ {
+ m_id = getIdentifier( );
+ //t_print("# successfully creat this server thread %d!\n", m_id );
+ }
+
+ ~ServerSocketThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: server thread not terminated.\n" );
+ }
+};
+
+// -----------------------------------------------------------------------------
+// Helper functions, to create buffers, check buffers
+class ValueCheckProvider
+{
+ bool m_bFoundFailure;
+ char *m_pBuffer;
+ sal_Int32 m_nBufferSize;
+
+public:
+ ValueCheckProvider()
+ :
+ m_bFoundFailure(false),
+ m_pBuffer(NULL),
+ m_nBufferSize(0)
+ {
+ }
+
+ bool isFailure() {return m_bFoundFailure;}
+
+ const char* getBuffer() {return m_pBuffer;}
+ char* getWriteBuffer() {return m_pBuffer;}
+
+ sal_Int32 getBufferSize() {return m_nBufferSize;}
+
+ bool checkValues(sal_Int32 _nLength, int _nValue)
+ {
+ m_bFoundFailure = false;
+ for(sal_Int32 i=0;i<_nLength;i++)
+ {
+ if (m_pBuffer[i] != _nValue)
+ {
+ m_bFoundFailure = true;
+ }
+ }
+ return m_bFoundFailure;
+ }
+
+ void createBuffer(sal_Int32 _nLength, int _nValue)
+ {
+ m_nBufferSize = _nLength;
+ m_pBuffer = (char*) malloc(m_nBufferSize);
+ if (m_pBuffer)
+ {
+ memset(m_pBuffer, _nValue, m_nBufferSize);
+ }
+ }
+
+ void freeBuffer()
+ {
+ if (m_pBuffer) free(m_pBuffer);
+ }
+
+};
+
+// -----------------------------------------------------------------------------
+/** Client Socket Thread, served as a temp little client to communicate with server.
+*/
+
+class ReadSocketThread : public Thread
+{
+ int m_nValue;
+ ValueCheckProvider m_aValues;
+
+protected:
+ oslThreadIdentifier m_id;
+ ::osl::SocketAddr saTargetSocketAddr;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+ void SAL_CALL run( )
+ {
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 5;
+ pTimeout->Nanosec = 0;
+
+ /// if the thread should terminate, schedule return false
+ //while ( schedule( ) == sal_True )
+ //{
+ if ( osl_Socket_Ok == csConnectorSocket.connect( saTargetSocketAddr, pTimeout ))
+ {
+ sal_Int32 nReadCount = csConnectorSocket.read( m_aValues.getWriteBuffer(), m_aValues.getBufferSize() );
+ m_aValues.checkValues(nReadCount, m_nValue);
+ }
+ else
+ {
+ t_print("# ReadSocketThread: connect failed! \n");
+ }
+ // terminate();
+ //}
+ //remove this line for deadlock on solaris( margritte.germany )
+ csConnectorSocket.close();
+ free( pTimeout );
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this thread %d!\n", m_id );
+ }
+
+public:
+ sal_Int32 getCount() {return m_aValues.getBufferSize();}
+ bool isOk() {return m_aValues.isFailure() == true ? false : true;}
+
+ ReadSocketThread(sal_Int32 _nBufferSize, int _nValue )
+ :
+ m_nValue( _nValue ),
+ saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT10 ),
+ csConnectorSocket( )
+ {
+ m_id = getIdentifier( );
+ //t_print("# successfully creat this client thread %d!\n", m_id );
+ m_aValues.createBuffer(_nBufferSize, 0);
+ }
+
+ ~ReadSocketThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: client thread not terminated.\n" );
+ m_aValues.freeBuffer();
+ }
+
+};
+
+/** Server Socket Thread, write a file which is large
+*/
+class WriteSocketThread : public Thread
+{
+ ValueCheckProvider m_aValues;
+
+protected:
+ oslThreadIdentifier m_id;
+
+ void SAL_CALL run( )
+ {
+ ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT10 );
+ ::osl::StreamSocket ssStreamConnection;
+
+ //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ /// if the thread should terminate, schedule return false
+ while ( schedule( ) == sal_True )
+ {
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ if ( sal_True != bOK1 )
+ {
+ t_print("# WriteSocketThread: AcceptorSocket bind address failed. \n" ) ;
+ break;
+ }
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ if ( sal_True != bOK2 )
+ {
+ t_print("# WriteSocketThread: AcceptorSocket listen address failed. \n" ) ;
+ break;
+ }
+ // blocking mode, if read/recv failed, block until success
+ asAcceptorSocket.enableNonBlockingMode( sal_False);
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ t_print("WriteSocketThread: acceptConnection failed! \n");
+ break;
+ }
+
+ ssStreamConnection.write( m_aValues.getBuffer(), m_aValues.getBufferSize() );
+ break;
+ }
+ ssStreamConnection.close();
+ asAcceptorSocket.close();
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this server thread %d!\n", m_id );
+ }
+
+public:
+ // public to check if data transmition is OK
+ WriteSocketThread(sal_Int32 _nBufferSize, int _nValue )
+ {
+ m_id = getIdentifier( );
+ //t_print("# successfully creat this server thread %d!\n", m_id );
+
+ m_aValues.createBuffer(_nBufferSize, _nValue);
+ }
+
+ ~WriteSocketThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: server thread not terminated.\n" );
+ m_aValues.freeBuffer();
+ }
+
+};
+
+// -----------------------------------------------------------------------------
+// just used to test socket::close() when accepting
+class AcceptorThread : public Thread
+{
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::rtl::OUString aHostIP;
+ sal_Bool bOK;
+protected:
+ void SAL_CALL run( )
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIP, IP_PORT_MYPORT9 );
+ ::osl::StreamSocket ssStreamConnection;
+
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ if ( sal_True != bOK1 )
+ {
+ t_print("# AcceptorSocket bind address failed.\n" ) ;
+ return;
+ }
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ if ( sal_True != bOK2 )
+ {
+ t_print("# AcceptorSocket listen address failed.\n" ) ;
+ return;
+ }
+
+ asAcceptorSocket.enableNonBlockingMode( sal_False );
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ bOK = sal_True;
+ t_print("AcceptorThread: acceptConnection failed! \n");
+ }
+ }
+public:
+ AcceptorThread(::osl::AcceptorSocket & asSocket, ::rtl::OUString & aBindIP )
+ : asAcceptorSocket( asSocket ), aHostIP( aBindIP )
+ {
+ bOK = sal_False;
+ }
+
+ sal_Bool isOK() { return bOK; }
+
+ ~AcceptorThread( )
+ {
+ if ( isRunning( ) )
+ {
+ asAcceptorSocket.shutdown();
+ t_print("# error: Acceptor thread not terminated.\n" );
+ }
+ }
+};
+
+class CloseSocketThread : public Thread
+{
+ ::osl::Socket m_sSocket;
+protected:
+ void SAL_CALL run( )
+ {
+ thread_sleep( 1 );
+ m_sSocket.close( );
+ }
+public:
+ CloseSocketThread(::osl::Socket & sSocket )
+ : m_sSocket( sSocket )
+ {
+ }
+
+ ~CloseSocketThread( )
+ {
+ if ( isRunning( ) )
+ {
+ t_print("# error: CloseSocketThread not terminated.\n" );
+ }
+ }
+};
+
+//------------------------------------------------------------------------
+// tests cases begins here
+//------------------------------------------------------------------------
+
+namespace osl_SocketAddr
+{
+
+ /** testing the methods:
+ inline SocketAddr();
+ inline SocketAddr(const SocketAddr& Addr);
+ inline SocketAddr(const oslSocketAddr , __osl_socket_NoCopy nocopy );
+ inline SocketAddr(oslSocketAddr Addr);
+ inline SocketAddr( const ::rtl::OUString& strAddrOrHostName, sal_Int32 nPort );
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+
+ void ctors_none()
+ {
+ /// SocketAddr constructor.
+ ::osl::SocketAddr saSocketAddr;
+
+ // oslSocketResult aResult;
+ // rtl::OUString suHost = saSocketAddr.getLocalHostname( &aResult);
+
+ // rtl::OUString suHost2 = getThisHostname();
+
+ CPPUNIT_ASSERT_MESSAGE("test for none parameter constructor function: check if the socket address was created successfully",
+ sal_True == saSocketAddr.is( ) );
+ }
+
+ void ctors_none_000()
+ {
+ /// SocketAddr constructor.
+ ::osl::SocketAddr saSocketAddr;
+
+ oslSocketResult aResult;
+ rtl::OUString suHost = saSocketAddr.getLocalHostname( &aResult);
+ rtl::OUString suHost2 = getThisHostname();
+
+ sal_Bool bOk = compareUString(suHost, suHost2);
+
+ rtl::OUString suError = rtl::OUString::createFromAscii("Host names should be the same. From SocketAddr.getLocalHostname() it is'");
+ suError += suHost;
+ suError += rtl::OUString::createFromAscii("', from getThisHostname() it is '");
+ suError += suHost2;
+ suError += rtl::OUString::createFromAscii("'.");
+
+ CPPUNIT_ASSERT_MESSAGE(suError, sal_True == bOk);
+ }
+
+ void ctors_copy()
+ {
+ /// SocketAddr copy constructor.
+ ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_HTTP1 );
+ ::osl::SocketAddr saCopySocketAddr( saSocketAddr );
+
+ sal_Int32 nPort = saCopySocketAddr.getPort( );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy constructor function: copy constructor, do an action of copy construction then check the port with original set.",
+ ( sal_True == saCopySocketAddr.is( ) ) && ( nPort == IP_PORT_HTTP1 ) );
+ }
+
+ void ctors_copy_no_001()
+ {
+#if 0
+ ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_HTTP1 );
+ oslSocketAddr psaOSLSocketAddr = saSocketAddr.getHandle( );
+
+ ::osl::SocketAddr saSocketAddrCopy( psaOSLSocketAddr, SAL_NO_COPY );
+ saSocketAddrCopy.setPort( IP_PORT_HTTP2 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ saSocketAddr.getPort( ) == IP_PORT_HTTP2 );
+#endif
+ ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( aHostName1, IP_PORT_HTTP1 );
+ CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
+
+ oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
+
+ ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
+
+ pSocketAddrCopy->setPort( IP_PORT_HTTP2 );
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ pSocketAddr->getPort( ) == IP_PORT_HTTP2 );
+
+ delete pSocketAddrCopy;
+ // LLA: don't do this also: delete pSocketAddr;
+ }
+
+ void ctors_copy_no_002()
+ {
+ ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( aHostName1, IP_PORT_HTTP1 );
+ CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
+ oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
+ ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ pSocketAddr->getHandle( ) == pSocketAddrCopy->getHandle( ) );
+
+ delete pSocketAddrCopy;
+ }
+
+ void ctors_copy_handle_001()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_HTTP1 );
+ ::osl::SocketAddr saSocketAddrCopy( saSocketAddr.getHandle( ) );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy handle constructor function: copy another Socket's handle, get its port to check copy effect.",
+ saSocketAddrCopy.getPort( ) == IP_PORT_HTTP1 );
+ }
+
+ void ctors_copy_handle_002()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_HTTP1 );
+ ::osl::SocketAddr saSocketAddrCopy( saSocketAddr.getHandle( ) );
+ saSocketAddrCopy.setPort( IP_PORT_HTTP2 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy handle constructor function: copy another Socket's handle, the original one should not be changed.",
+ saSocketAddr.getPort( ) != IP_PORT_HTTP2 );
+ }
+
+ void ctors_hostname_port_001()
+ {
+ /// tcpip-specif constructor.
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP );
+ printUString(saSocketAddr.getHostname( ), "ctors_hostname_port_001:getHostname");
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr tcpip specif constructor function: do a constructor using tcpip spec, check the result.",
+ saSocketAddr.is( ) == sal_True &&
+ ( saSocketAddr.getPort( ) == IP_PORT_FTP )/*&&
+ ( sal_True == compareUString( saSocketAddr.getHostname( ), aHostName1 ) ) */);
+ }
+
+ //same as is_002
+ void ctors_hostname_port_002()
+ {
+ /// tcpip-specif constructor.
+ ::osl::SocketAddr saSocketAddr( aHostIpInval1, IP_PORT_MYPORT2 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr tcpip specif constructor function: using an invalid IP address, the socketaddr ctors should fail", sal_False == saSocketAddr.is( ));
+ }
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_none_000 );
+ CPPUNIT_TEST( ctors_copy );
+ CPPUNIT_TEST( ctors_copy_no_001 );
+ CPPUNIT_TEST( ctors_copy_no_002 );
+ CPPUNIT_TEST( ctors_copy_handle_001 );
+ CPPUNIT_TEST( ctors_copy_handle_002 );
+ CPPUNIT_TEST( ctors_hostname_port_001 );
+ CPPUNIT_TEST( ctors_hostname_port_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+
+ /** testing the method:
+ inline sal_Bool is() const;
+ */
+
+ class is : public CppUnit::TestFixture
+ {
+ public:
+ void is_001()
+ {
+ ::osl::SocketAddr saSocketAddr;
+
+ CPPUNIT_ASSERT_MESSAGE("test for is() function: create an unknown type socket, it should be True when call is.",
+ sal_True == saSocketAddr.is( ) );
+ }
+ // refer to setPort_003()
+ void is_002()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_INVAL );
+
+ CPPUNIT_ASSERT_MESSAGE("test for is() function: create a tcp-ip socket using invalid port number",
+ sal_True == saSocketAddr.is( ) );
+ }
+
+ void is_003()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIpInval1, IP_PORT_MYPORT );
+
+ CPPUNIT_ASSERT_MESSAGE("test for is() function: create a tcp-ip socket using invalid Ip number",
+ sal_True != saSocketAddr.is( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( is );
+ CPPUNIT_TEST( is_001 );
+ CPPUNIT_TEST( is_002 );
+ CPPUNIT_TEST( is_003 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class is
+
+
+ /** testing the method:
+ inline ::rtl::OUString SAL_CALL getHostname( oslSocketResult *pResult = 0 ) const;
+ */
+
+ class getHostname : public CppUnit::TestFixture
+ {
+ public:
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void getHostname_000()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp4, IP_PORT_FTP );
+
+ }
+
+ /** it will search the Ip in current machine's /etc/hosts at first, if find, then return the
+ mapped hostname, otherwise, it will search via DNS server, and often return hostname+ Domain name
+ like "sceri.PRC.Sun.COM"
+ The process is same as Socket::getLocalHost(), but getLocalHost can only return hostname of the current machine.
+ */
+ void getHostname_001()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp4, IP_PORT_FTP );
+ rtl::OUString suResult = saSocketAddr.getHostname( 0 );
+ rtl::OUString suError = outputError(suResult, aHostName4, "test for getHostname(0)");
+ sal_Bool bOK = compareUString( suResult, aHostName4 );
+ // search the returned hostname in /etc/hosts, if find, and the IP in the row is same as IP
+ // in the Addr, it's right also.
+ if ( bOK == sal_False)
+ {
+ if ( compareUString( getIPbyName( oustring2char( suResult ) ), aHostIp4 ) == sal_True )
+ bOK = sal_True;
+ }
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK);
+ }
+
+// LLA: now we have to control, if this behaviour is right.
+// LLA: this function does not work in company (Linux, Windows) but at home
+ void getHostname_002()
+ {
+ rtl::OUString suHostname = rtl::OUString::createFromAscii("cn-1.germany.sun.com");
+ rtl::OUString aHostIP = getIPbyName( oustring2char( suHostname ) );
+
+ ::osl::SocketAddr saSocketAddr( aHostName1, IP_PORT_FTP );
+ sal_Bool bOK = saSocketAddr.setHostname( suHostname );
+ CPPUNIT_ASSERT_MESSAGE("#SocketAddr.setHostname failed", sal_True == bOK );
+ oslSocketResult aResult;
+ rtl::OUString suResult = saSocketAddr.getHostname( &aResult );
+ CPPUNIT_ASSERT_MESSAGE("SocketAddr.getHostname failed.", aResult == osl_Socket_Ok);
+
+ rtl::OUString suError = outputError(suResult, suHostname, "test for getHostname(0)");
+ bOK = compareUString( suResult, suHostname );
+ if ( bOK == sal_False)
+ {
+ rtl::OString aString = ::rtl::OUStringToOString( suResult, RTL_TEXTENCODING_ASCII_US );
+ if ( compareUString( getIPbyName( aString) , aHostIp6 ) == sal_True )
+ {
+ bOK = sal_True;
+ }
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+
+ CPPUNIT_TEST_SUITE( getHostname );
+ CPPUNIT_TEST( getHostname_001 );
+ CPPUNIT_TEST( getHostname_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getHostname
+
+
+ /** testing the method:
+ inline sal_Int32 SAL_CALL getPort() const;
+ */
+
+ class getPort : public CppUnit::TestFixture
+ {
+ public:
+ void getPort_001()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPort() function: get a normal port number.",
+ IP_PORT_FTP == saSocketAddr.getPort( ) );
+ }
+
+ void getPort_002()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp2, IP_PORT_INVAL );
+
+ //t_print("#getPort_002: Port number is %d \n", saSocketAddr.getPort( ));
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPort( ) function: give an invalid port to a SocketAddr, get the port to see if it can detect. it did not pass in (W32).",
+ saSocketAddr.getPort( )>=1 && saSocketAddr.getPort( ) <= 65535 );
+ }
+ //two cases will return OSL_INVALID_PORT: 1. not valid SocketAddr
+ //2. SocketAddr family is not osl_Socket_FamilyInet, but case 2 could not be constructed
+ void getPort_003()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIpInval1, IP_PORT_MYPORT );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPort( ) function: give an invalid IP to a SocketAddr, get the port to see returned value. ",
+ saSocketAddr.getPort( ) == OSL_INVALID_PORT );
+ }
+
+ CPPUNIT_TEST_SUITE( getPort );
+ CPPUNIT_TEST( getPort_001 );
+ CPPUNIT_TEST( getPort_002 );
+ CPPUNIT_TEST( getPort_003 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getPort
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL setPort( sal_Int32 nPort );
+ rfc1413.txt: TCP port numbers are from 1-65535
+ rfc1700.txt: 0/tcp Reserved ; 0/udp Reserved
+ */
+
+ class setPort : public CppUnit::TestFixture
+ {
+ public:
+ void setPort_001()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP );
+ sal_Bool bOK = saSocketAddr.setPort( IP_PORT_TELNET );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPort() function: modify a port number setting, and check it.",
+ ( sal_True == bOK ) &&
+ ( IP_PORT_TELNET == saSocketAddr.getPort( ) ) );
+ }
+
+ /** 0 to 1024 is known as the reserved port range (traditionally only root can assign programs to ports in
+ this range) and the ephemeral port range from 1025 to 65535.
+ As many of you programmers will know, when you specify the source port of 0 when you connect to a host,
+ the OS automatically reassigns the port number to high numbered ephemeral port. The same happens if you
+ try to bind a listening socket to port 0.
+ http://www.securiteam.com/securityreviews/5XP0Q2AAKS.html
+ another: http://www.muq.org/~cynbe/muq/mufref_564.html
+ */
+ void setPort_002()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP );
+ sal_Bool bOK = saSocketAddr.setPort( IP_PORT_ZERO );
+
+ oslSocket sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 );//sal_True);
+ sal_Bool bOK1 = sSocket.bind( saSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "bind SocketAddr failed", bOK1 == sal_True );
+
+ sal_Int32 newPort = sSocket.getLocalPort();
+ //t_print("#new port is %d\n", newPort );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPort() function: port number should be in 1 ~ 65535, set port 0, it should be converted to a port number between 1024~65535.",
+ ( 1024 <= newPort ) && ( 65535 >= newPort ) && ( bOK == sal_True ) );
+
+ }
+
+ void setPort_003()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP);
+ sal_Bool bOK = saSocketAddr.setPort( IP_PORT_INVAL );
+ //on Linux, getPort return 34463
+ //t_print("#Port number is %d \n", saSocketAddr.getPort( ));
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPort( ) function: set an address with invalid port. it should return error or convert it to a valid port.",
+ ( ( 1 <= saSocketAddr.getPort( ) ) && ( 65535 >= saSocketAddr.getPort( ) ) &&( bOK == sal_True ) ) ||
+ bOK == sal_False);
+ }
+
+ /* this is not a inet-addr => can't set port */
+ void setPort_004()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIpInval1, IP_PORT_FTP);
+ sal_Bool bOK = saSocketAddr.setPort( IP_PORT_MYPORT );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPort( ) function: set an invalid address with valid port. it should return error.",
+ bOK == sal_False);
+ }
+
+
+ CPPUNIT_TEST_SUITE( setPort );
+ CPPUNIT_TEST( setPort_001 );
+ CPPUNIT_TEST( setPort_002 );
+ CPPUNIT_TEST( setPort_003 );
+ CPPUNIT_TEST( setPort_004 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class setPort
+
+
+ /** tester comment:
+
+ In the following two functions, it use ::rtl::ByteSequence as an intermediate storage for address,
+ the ByteSequence object can hold sal_Int8 arrays, which is raged [-127, 127], in case of IP addr
+ that is greater than 127, say 129.158.217.202, it will stored as -127, -98, -39, -54, it is unique
+ in the range of sal_Int8, but lack of readability.
+ so may be a sal_uInt8 array is better.
+ */
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL setAddr( const ::rtl::ByteSequence & address );
+ */
+
+ class setAddr : public CppUnit::TestFixture
+ {
+ public:
+ void setAddr_001()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp2, IP_PORT_FTP );
+ saSocketAddr.setAddr( UStringIPToByteSequence( aHostIp1 ) );
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( 0 );
+ sal_Bool bOK = sal_False;
+
+ if ( ( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) && ( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ bOK = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setAddr() function: construct Addr with \"129.158.217.202\", set it to \"127.0.0.1\", and check the correctness ",
+ sal_True == bOK );
+ }
+
+
+ CPPUNIT_TEST_SUITE( setAddr );
+ CPPUNIT_TEST( setAddr_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class setAddr
+
+
+ /** testing the method:
+ inline ::rtl::ByteSequence SAL_CALL getAddr( oslSocketResult *pResult = 0 ) const;
+ */
+
+ class getAddr : public CppUnit::TestFixture
+ {
+ public:
+ void getAddr_001()
+ {
+ oslSocketResult SocketResult;
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_FTP );
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( &SocketResult );
+
+ sal_Bool bOK = sal_False;
+
+ if ( ( osl_Socket_Ok == SocketResult ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ bOK = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getAddr() function: construct a socketaddr with IP assigned, get the address to check correctness.Caught unknown exception on (Win32)",
+ sal_True == bOK && SocketResult == osl_Socket_Ok);
+ }
+
+ CPPUNIT_TEST_SUITE( getAddr );
+ CPPUNIT_TEST( getAddr_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getAddr
+
+
+ /** testing the methods:
+ inline SocketAddr & SAL_CALL operator= (oslSocketAddr Addr);
+ inline SocketAddr & SAL_CALL operator= (const SocketAddr& Addr);
+ inline SocketAddr & SAL_CALL assign( oslSocketAddr Addr, __osl_socket_NoCopy nocopy );
+ inline sal_Bool SAL_CALL operator== (oslSocketAddr Addr) const;
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const; /// not implemented.
+ */
+
+ class operator_equal : public CppUnit::TestFixture
+ {
+ public:
+ void operator_equal_001()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrEqual( aHostIp2, IP_PORT_FTP );
+
+ saSocketAddrEqual = saSocketAddr;
+ sal_Bool bOK = sal_False;
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddrEqual.getAddr( 0 );
+
+ if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ bOK = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal() function: use operator= to assign Ip1 to Ip2, check its modification.",
+ sal_True == bOK );
+ }
+
+
+ void operator_equal_002()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp3, IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrEqual( aHostIp2, IP_PORT_FTP );
+
+ saSocketAddrEqual = saSocketAddr;
+ CPPUNIT_ASSERT_MESSAGE( "after assign, the assigned SocketAddr is not same as the original Addr",
+ IP_PORT_TELNET == saSocketAddrEqual.getPort( ) );
+ saSocketAddrEqual.setPort( IP_PORT_MYPORT3 );
+ saSocketAddr.setPort( IP_PORT_HTTP2 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal() function: perform an equal action, then try to change the original address's port. it should not be changed ( handle released), it did not pass in (W32), this is under discussion.",
+ IP_PORT_MYPORT3 == saSocketAddrEqual.getPort( ) );
+ }
+
+ void operator_equal_const_001()
+ {
+ const ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrEqual( aHostIp2, IP_PORT_FTP );
+
+ saSocketAddrEqual = saSocketAddr;
+ sal_Bool bOK = sal_False;
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddrEqual.getAddr( 0 );
+
+ if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ bOK = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_const() function: use operator= const to assign Ip1 to Ip2, verify the change on the second one.",
+ sal_True == bOK );
+ }
+
+ void operator_equal_const_002()
+ {
+ const ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrEqual( aHostIp2, IP_PORT_FTP );
+
+ saSocketAddrEqual = saSocketAddr;
+ saSocketAddrEqual.setPort( IP_PORT_HTTP1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_const() function: change the second instance, the first one should not be altered, since it does not released the handle.",
+ IP_PORT_HTTP1 != saSocketAddr.getPort( ) );
+ }
+
+ void operator_equal_assign_001()
+ {
+ ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( aHostIp1, IP_PORT_TELNET );
+ CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
+ ::osl::SocketAddr* pSocketAddrAssign = new ::osl::SocketAddr( aHostIp2, IP_PORT_FTP );
+ oslSocketAddr poslSocketAddr = pSocketAddr->getHandle( );
+ //if( m_handle ) osl_destroySocketAddr( m_handle ); so pSocketAddrAssign had been destroyed and then point to pSocketAddr
+ pSocketAddrAssign->assign(poslSocketAddr, SAL_NO_COPY);
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ pSocketAddrAssign->getPort( ) == IP_PORT_TELNET );
+
+ delete pSocketAddrAssign;
+ }
+
+ void operator_is_equal_001()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrequal( aHostIp1, IP_PORT_TELNET );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_equal() function: check two identical Address.",
+ sal_True == ( saSocketAddrequal == saSocketAddr.getHandle( ) ) );
+ }
+
+ void operator_is_equal_002()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostIp2, IP_PORT_FTP);
+ ::osl::SocketAddr saSocketAddrequal( aHostIp1, IP_PORT_TELNET );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_equal() function: check two different Address.",
+ sal_False == ( saSocketAddrequal == saSocketAddr.getHandle( ) ) );
+ }
+
+ CPPUNIT_TEST_SUITE( operator_equal );
+ CPPUNIT_TEST( operator_equal_001 );
+ CPPUNIT_TEST( operator_equal_002 );
+ CPPUNIT_TEST( operator_equal_const_001 );
+ CPPUNIT_TEST( operator_equal_const_002 );
+ CPPUNIT_TEST( operator_equal_assign_001 );
+ CPPUNIT_TEST( operator_is_equal_001 );
+ CPPUNIT_TEST( operator_is_equal_002 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class operator_equal
+
+
+
+ /** testing the method:
+ inline oslSocketAddr SAL_CALL getHandle() const;
+ */
+
+ class getSocketAddrHandle : public CppUnit::TestFixture
+ {
+ public:
+
+ void getSocketAddrHandle_001()
+ {
+ ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( aHostName1, IP_PORT_HTTP1 );
+ CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
+ oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
+ ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ pSocketAddr->getHandle( ) == pSocketAddrCopy->getHandle( ) );
+
+ delete pSocketAddrCopy;
+ }
+
+ void getSocketAddrHandle_002()
+ {
+ ::osl::SocketAddr saSocketAddr( aHostName3, IP_PORT_MYPORT4 );
+ oslSocketAddr poslSocketAddr = saSocketAddr.getHandle( );
+
+ sal_Bool bOK = ( saSocketAddr == poslSocketAddr );
+ //t_print("getSocketAddrHandle_002\n");
+ CPPUNIT_ASSERT_MESSAGE( "test for getHandle() function: use getHandle() function as an intermediate way to create identical address.",
+ sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getSocketAddrHandle );
+ CPPUNIT_TEST( getSocketAddrHandle_001 );
+ CPPUNIT_TEST( getSocketAddrHandle_002 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getSocketAddrHandle
+
+
+ /** testing the method:
+ static inline ::rtl::OUString SAL_CALL getLocalHostname( oslSocketResult *pResult = 0);
+ */
+
+ class getLocalHostname : public CppUnit::TestFixture
+ {
+ public:
+ /* the process of getLocalHostname: 1.gethostname (same as /bin/hostname) returned name A
+ 2. search A in /etc/hosts, if there is an alias name is A, return the name in the same row
+ */
+
+ void getLocalHostname_000()
+ {
+ // _osl_getFullQualifiedDomainName( );
+ oslSocketResult aResult = osl_Socket_Error;
+ rtl::OUString suHostname = osl::SocketAddr::getLocalHostname(&aResult);
+ CPPUNIT_ASSERT_MESSAGE("getLocalHostname failed", aResult == osl_Socket_Ok);
+ }
+
+ void getLocalHostname_001()
+ {
+ oslSocketResult *pResult = NULL;
+ //printSocketResult(*pResult);
+ ::rtl::OUString suResult = ::osl::SocketAddr::getLocalHostname( pResult );
+
+ // LLA: IMHO localhost, or hostname by itself should be ok.
+ rtl::OUString suThisHost = getThisHostname( );
+ bool bOk = false;
+ if (suThisHost.equals(rtl::OUString::createFromAscii("localhost")))
+ {
+ bOk = true;
+ }
+ else
+ {
+ if (suThisHost.equals(suResult))
+ {
+ bOk = true;
+ }
+ }
+
+ ::rtl::OUString suError;
+ suError = outputError(suResult, getThisHostname( ), "test for getLocalHostname() function");
+
+ CPPUNIT_ASSERT_MESSAGE( suError, bOk == true );
+ }
+
+ CPPUNIT_TEST_SUITE( getLocalHostname );
+ CPPUNIT_TEST( getLocalHostname_000 );
+ CPPUNIT_TEST( getLocalHostname_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getLocalHostname
+
+
+ /** testing the method:
+ static inline void SAL_CALL resolveHostname( const ::rtl::OUString & strHostName , SocketAddr & Addr );
+ */
+
+ class resolveHostname : public CppUnit::TestFixture
+ {
+ public:
+ void resolveHostname_001()
+ {
+ ::osl::SocketAddr saSocketAddr;
+ ::osl::SocketAddr::resolveHostname( aHostIp1, saSocketAddr );
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( 0 );
+ sal_Bool bOK = sal_False;
+
+ if ( ( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ bOK = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for resolveHostname() function: try to resolve localhost to 127.0.0.1.",
+ sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( resolveHostname );
+ CPPUNIT_TEST( resolveHostname_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class resolveHostname
+
+
+ /** testing the method:
+ static inline sal_Int32 SAL_CALL getServicePort(
+ const ::rtl::OUString& strServiceName,
+ const ::rtl::OUString & strProtocolName= ::rtl::OUString::createFromAscii( "tcp" ) );
+ */
+
+ class gettheServicePort : public CppUnit::TestFixture
+ {
+ public:
+ void gettheServicePort_001()
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get ftp service port on TCP protocol.",
+ IP_PORT_FTP== ::osl::SocketAddr::getServicePort( aServiceFTP, aProtocolTCP ) );
+ }
+
+ void gettheServicePort_002()
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get telnet service port on TCP protocol.",
+ IP_PORT_TELNET== ::osl::SocketAddr::getServicePort( aServiceTELNET, aProtocolTCP ) );
+ }
+
+ void gettheServicePort_003()
+ {
+ //Solaris has no service called "https", please see /etc/services
+ CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get netbios-ssn service port on UDP protocol.",
+ IP_PORT_NETBIOS_DGM == ::osl::SocketAddr::getServicePort( aServiceNETBIOS, aProtocolUDP ) );
+ }
+
+ void gettheServicePort_004()
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get a service port which is not exist.",
+ OSL_INVALID_PORT == ::osl::SocketAddr::getServicePort( ::rtl::OUString::createFromAscii( "notexist" ), aProtocolUDP ) );
+ }
+
+ CPPUNIT_TEST_SUITE( gettheServicePort );
+ CPPUNIT_TEST( gettheServicePort_001 );
+ CPPUNIT_TEST( gettheServicePort_002 );
+ CPPUNIT_TEST( gettheServicePort_003 );
+ CPPUNIT_TEST( gettheServicePort_004 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class gettheServicePort
+
+// -----------------------------------------------------------------------------
+
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::ctors, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::is, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getHostname, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getPort, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::setPort, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::setAddr, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getAddr, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::operator_equal, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getSocketAddrHandle, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getLocalHostname, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::resolveHostname, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::gettheServicePort, "osl_SocketAddr");
+
+
+} // namespace osl_SocketAddr
+
+
+
+namespace osl_Socket
+{
+
+ /** testing the methods:
+ inline Socket( );
+ inline Socket( const Socket & socket );
+ inline Socket( oslSocket socketHandle );
+ inline Socket( oslSocket socketHandle, __sal_NoAcquire noacquire );
+ */
+
+ /** test writer's comment:
+
+ class Socket can not be initialized by its protected constructor, though the protected
+ constructor is the most convenient way to create a new socket.
+ it only allow the method of C function osl_createSocket like:
+ ::osl::Socket sSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream,
+ osl_Socket_ProtocolIp ) );
+ the use of C method lost some of the transparent of tester using C++ wrapper.
+ */
+
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void ctors_none()
+ {
+ /// Socket constructor.
+ // ::osl::Socket sSocket;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_none constructor function: check if the socket was created successfully, if no exception occured",
+ 1 == 1 );
+ }
+
+ void ctors_acquire()
+ {
+ /// Socket constructor.
+ ::osl::Socket sSocket( sHandle );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_acquire constructor function: check if the socket was created successfully",
+ osl_Socket_TypeStream == sSocket.getType( ) );
+ }
+
+ void ctors_no_acquire()
+ {
+ /// Socket constructor.
+ ::osl::Socket sSocket( sHandle, SAL_NO_ACQUIRE );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for ctors_no_acquire constructor function: check if the socket was created successfully",
+ osl_Socket_TypeStream == sSocket.getType( ) );
+ }
+
+ void ctors_copy_ctor()
+ {
+ ::osl::Socket sSocket( sHandle );
+ /// Socket copy constructor.
+ ::osl::Socket copySocket( sSocket );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for ctors_copy_ctor constructor function: create new Socket instance using copy constructor",
+ osl_Socket_TypeStream == copySocket.getType( ) );
+ }
+
+ void ctors_TypeRaw()
+ {
+#ifdef WNT
+ oslSocket sHandleRaw = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp );
+// LLA: ? ::osl::Socket sSocket( sHandleRaw );
+ CPPUNIT_ASSERT_MESSAGE( " type osl_Socket_TypeRaw socket create failed on UNX ", sHandleRaw != NULL);
+#else
+ oslSocket sHandleRaw = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp );
+ CPPUNIT_ASSERT_MESSAGE( " can't create socket with type osl_Socket_TypeRaw within UNX is ok.", sHandleRaw == NULL);
+#endif
+ }
+
+ void ctors_family_Ipx()
+ {
+ oslSocket sHandleIpx = osl_createSocket( osl_Socket_FamilyIpx, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ CPPUNIT_ASSERT_MESSAGE( " family osl_Socket_FamilyIpx socket create failed! ", sHandleIpx != NULL);
+ ::osl::Socket sSocket( sHandleIpx ); //, SAL_NO_ACQUIRE );
+ t_print("#Type is %d \n", sSocket.getType( ) );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for create new Socket instance that family is osl_Socket_FamilyIpx",
+ osl_Socket_TypeStream == sSocket.getType( ) );
+ }
+
+
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_acquire );
+ CPPUNIT_TEST( ctors_no_acquire );
+ CPPUNIT_TEST( ctors_copy_ctor );
+ CPPUNIT_TEST( ctors_TypeRaw );
+ CPPUNIT_TEST( ctors_family_Ipx );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+
+ /** testing the methods:
+ inline Socket& SAL_CALL operator= ( oslSocket socketHandle);
+ inline Socket& SAL_CALL operator= (const Socket& sock);
+ inline sal_Bool SAL_CALL operator==( const Socket& rSocket ) const ;
+ inline sal_Bool SAL_CALL operator==( const oslSocket socketHandle ) const;
+ */
+
+ class operators : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ /** test writer's comment:
+
+ the assignment operator does not support direct assinment like:
+ ::osl::Socket sSocket = sHandle.
+ */
+ void operators_assignment_handle()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::Socket assignSocket = sSocket.getHandle();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment_handle function: test the assignment operator.",
+ osl_Socket_TypeStream == assignSocket.getType( ) );
+ }
+
+ void operators_assignment()
+ {
+ ::osl::Socket sSocket( sHandle );
+ ::osl::Socket assignSocket = sSocket;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment function: assignment operator",
+ osl_Socket_TypeStream == assignSocket.getType( ) );
+ }
+
+ void operators_equal_handle_001()
+ {
+ /// Socket constructor.
+ ::osl::Socket sSocket( sHandle );
+ ::osl::Socket equalSocket = sSocket;
+
+ CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_handle_001 function: check equal.",
+ equalSocket == sHandle );
+ }
+
+ void operators_equal_handle_002()
+ {
+ /// Socket constructor.
+ ::osl::Socket equalSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ) );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_handle_001 function: check unequal.",
+ !( equalSocket == sHandle ) );
+ }
+
+ void operators_equal_001()
+ {
+ ::osl::Socket sSocket( sHandle );
+ /// Socket copy constructor.
+ ::osl::Socket equalSocket( sSocket );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for operators_equal function: check equal.",
+ equalSocket == sSocket );
+ }
+
+ void operators_equal_002()
+ {
+ ::osl::Socket sSocket( sHandle );
+ /// Socket copy constructor.
+ ::osl::Socket equalSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ) );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_002 function: check unequal.",
+ !( equalSocket == sSocket ) );
+ }
+
+ CPPUNIT_TEST_SUITE( operators );
+ CPPUNIT_TEST( operators_assignment_handle );
+ CPPUNIT_TEST( operators_assignment );
+ CPPUNIT_TEST( operators_equal_handle_001 );
+ CPPUNIT_TEST( operators_equal_handle_002 );
+ CPPUNIT_TEST( operators_equal_001 );
+ CPPUNIT_TEST( operators_equal_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class operators
+
+
+ /** testing the methods:
+ inline void SAL_CALL shutdown( oslSocketDirection Direction = osl_Socket_DirReadWrite );
+ inline void SAL_CALL close();
+ */
+
+ class close : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void close_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ sSocket.close();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close_001 function: this function is reserved for test.",
+ sSocket.getHandle() == sHandle );
+ }
+
+ void close_002()
+ {
+//#if defined(LINUX)
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ AcceptorThread myAcceptorThread( asSocket, aHostIp1 );
+ myAcceptorThread.create();
+
+ thread_sleep( 1 );
+ //when accepting, close the socket, the thread will not block for accepting
+ //man close:Any locks held on the file it was associated with, and owned by the process, are removed
+ asSocket.close();
+ //thread_sleep( 2 );
+ myAcceptorThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.",
+ myAcceptorThread.isOK() == sal_True );
+//#endif
+ }
+
+ // to cover "if ( pSockAddrIn->sin_addr.s_addr == htonl(INADDR_ANY) )" in osl_closeSocket( )
+ void close_003()
+ {
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ AcceptorThread myAcceptorThread( asSocket, aHostIpZero );
+ myAcceptorThread.create();
+
+ thread_sleep( 1 );
+ asSocket.close();
+ myAcceptorThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.",
+ myAcceptorThread.isOK() == sal_True );
+ }
+
+ CPPUNIT_TEST_SUITE( close );
+ CPPUNIT_TEST( close_001 );
+ CPPUNIT_TEST( close_002 );
+ CPPUNIT_TEST( close_003 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class close
+
+ /** testing the method:
+ inline void SAL_CALL getLocalAddr( SocketAddr &Addr ) const;
+ */
+
+ class getLocalAddr : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+ // get the Address of the local end of the socket
+ void getLocalAddr_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( aHostIp1, IP_PORT_MYPORT8 );
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString();
+ CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 );
+
+ sSocket.getLocalAddr( saLocalSocketAddr );
+
+ sal_Bool bOK = compareUString( saLocalSocketAddr.getHostname( 0 ), sSocket.getLocalHost() ) ;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getLocalAddr function: first create a new socket, then a socket address, bind them, and check the address.",
+ sal_True == bOK );
+ }
+
+
+ CPPUNIT_TEST_SUITE( getLocalAddr );
+ CPPUNIT_TEST( getLocalAddr_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getLocalAddr
+
+
+ /** testing the method:
+ inline sal_Int32 SAL_CALL getLocalPort() const;
+ */
+
+ class getLocalPort : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void getLocalPort_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( aHostIp1, IP_PORT_MYPORT7 ); // aHostIp1 localhost
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString();
+ CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 );
+ sal_Bool bOK = ( IP_PORT_MYPORT7 == sSocket.getLocalPort( ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getLocalPort function: first create a new socket, then a socket address, bind them, and check the port.",
+ sal_True == bOK );
+ }
+
+ /** test writer's comment:
+
+ the invalid port number can not be set by giving invalid port number
+ such as 99999 or -1, it will convert to ( x mod 65535 ), so it will always be
+ valid, the only instance that the getLocalPort returns OSL_INVALID_PORT
+ is when saSocketAddr itself is an invalid one, that is , the IP or host name
+ can not be found, then the created socket address is not valid.
+ */
+ void getLocalPort_002()
+ {
+ ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_TELNET);
+#ifdef WNT
+ ::osl::Socket sSocket(sHandle);
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True);
+ sSocket.bind( saBindSocketAddr );
+ //Invalid IP, so bind should fail
+ ::rtl::OUString suError = outputError(::rtl::OUString::valueOf(sSocket.getLocalPort( )),
+ ::rtl::OUString::valueOf((sal_Int32)OSL_INVALID_PORT),
+ "test for getLocalPort function: first create a new socket, then an invalid socket address, bind them, and check the port assigned.");
+ sal_Bool bOK = ( OSL_INVALID_PORT == sSocket.getLocalPort( ) );
+ (void)bOK;
+#else
+ //on Unix, if Addr is not an address of type osl_Socket_FamilyInet, it returns OSL_INVALID_PORT
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii( "on Unix, if Addr is not an address of type osl_Socket_FamilyInet, it returns OSL_INVALID_PORT, but can not create Addr of that case");
+#endif
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_False );
+
+ }
+
+ void getLocalPort_003()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( getLocalIP(), IP_PORT_INVAL);
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString();
+ CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 );
+ ::rtl::OUString suError = outputError(::rtl::OUString::valueOf(sSocket.getLocalPort( )),
+ ::rtl::OUString::createFromAscii("34463"),
+ "test for getLocalPort function: first create a new socket, then an invalid socket address, bind them, and check the port assigned");
+ sal_Bool bOK = ( sSocket.getLocalPort( ) >= 1 && sSocket.getLocalPort( ) <= 65535);
+
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getLocalPort );
+ CPPUNIT_TEST( getLocalPort_001 );
+// LLA: CPPUNIT_TEST( getLocalPort_002 );
+ CPPUNIT_TEST( getLocalPort_003 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getLocalPort
+
+
+ /** testing the method:
+ inline ::rtl::OUString SAL_CALL getLocalHost() const;
+
+ Mindyliu: on Linux, at first it will check the binded in /etc/hosts, if it has the binded IP, it will return the hostname in it;
+ else if the binded IP is "127.0.0.1", it will return "localhost", if it's the machine's ethernet ip such as "129.158.217.90", it
+ will return hostname of current processor such as "aegean.PRC.Sun.COM"
+ */
+
+ class getLocalHost : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void getLocalHost_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ //port number from IP_PORT_HTTP1 to IP_PORT_MYPORT6, mindyliu
+ ::osl::SocketAddr saBindSocketAddr( aHostIp1, IP_PORT_MYPORT6 );
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString();
+ CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 );
+ sal_Bool bOK;
+ ::rtl::OUString suError;
+#ifdef WNT
+ bOK = compareUString( sSocket.getLocalHost( ), getThisHostname( ) ) ;
+ suError = outputError(sSocket.getLocalHost( ), getThisHostname( ),
+"test for getLocalHost function: create localhost socket and check name");
+#else
+ ::rtl::OUString aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) "localhost" );
+ sal_Bool bRes1, bRes2;
+ bRes1 = compareUString( sSocket.getLocalHost( ), aUString ) ;
+ bRes2 = compareUString( sSocket.getLocalHost( ), saBindSocketAddr.getHostname(0) ) ;
+ bOK = bRes1 || bRes2;
+ suError = outputError(sSocket.getLocalHost( ), aUString, "test for getLocalHost function: create localhost socket and check name");
+#endif
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+ void getLocalHost_002()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_POP3);
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sSocket.bind( saBindSocketAddr );
+ //Invalid IP, so bind should fail
+ sal_Bool bOK = compareUString( sSocket.getLocalHost( ), aNullURL ) ;
+ ::rtl::OUString suError = outputError(sSocket.getLocalHost( ), aNullURL, "test for getLocalHost function: getLocalHost with invalid SocketAddr");
+
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getLocalHost );
+ CPPUNIT_TEST( getLocalHost_001 );
+ CPPUNIT_TEST( getLocalHost_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getLocalHost
+
+
+ /** testing the methods:
+ inline void SAL_CALL getPeerAddr( SocketAddr & Addr) const;
+ inline sal_Int32 SAL_CALL getPeerPort() const;
+ inline ::rtl::OUString SAL_CALL getPeerHost() const;
+ */
+ class getPeer : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void getPeer_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT );
+ ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT );
+ ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ /// launch server socket
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind '127.0.0.1' address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ /// get peer information
+ csConnectorSocket.getPeerAddr( saPeerSocketAddr );/// connected.
+ sal_Int32 peerPort = csConnectorSocket.getPeerPort( );
+ ::rtl::OUString peerHost = csConnectorSocket.getPeerHost( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPeer function: setup a connection and then get the peer address, port and host from client side.",
+ ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) )&&
+ ( sal_True == compareUString( peerHost, saLocalSocketAddr.getHostname( 0 ) ) ) &&
+ ( peerPort == saLocalSocketAddr.getPort( ) ));
+ }
+
+
+ CPPUNIT_TEST_SUITE( getPeer );
+ CPPUNIT_TEST( getPeer_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getPeer
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL bind(const SocketAddr& LocalInterface);
+ */
+
+
+ class bind : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void bind_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ //bind must use local IP address ---mindyliu
+ ::osl::SocketAddr saBindSocketAddr( getLocalIP(), IP_PORT_MYPORT5 );
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "Socket bind fail.", sal_True == bOK1 );
+
+ sal_Bool bOK2 = compareUString( sSocket.getLocalHost( ), saBindSocketAddr.getHostname( ) ) ;
+
+ sSocket.close();
+ CPPUNIT_ASSERT_MESSAGE( "test for bind function: bind a valid address.", sal_True == bOK2 );
+ }
+
+ void bind_002()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_NETBIOS );
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1); // sal_True);
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ sal_Bool bOK2 = compareUString( sSocket.getLocalHost( ), getThisHostname( ) ) ;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for bind function: bind a valid address.",
+ ( sal_False == bOK1 ) && ( sal_False == bOK2 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( bind );
+ CPPUNIT_TEST( bind_001 );
+ CPPUNIT_TEST( bind_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class bind
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL isRecvReady(const TimeValue *pTimeout = 0) const;
+
+ */
+ class isRecvReady : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void isRecvReady_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT1 );
+ ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT1 );
+ ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ /// is receive ready?
+ sal_Bool bOK3 = asAcceptorSocket.isRecvReady( pTimeout );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isRecvReady function: setup a connection and then check if it can transmit data.",
+ ( sal_True == bOK3 ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( isRecvReady );
+ CPPUNIT_TEST( isRecvReady_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class isRecvReady
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL isSendReady(const TimeValue *pTimeout = 0) const;
+ */
+ class isSendReady : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void isSendReady_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT );
+ ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT );
+ ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ /// is send ready?
+ sal_Bool bOK3 = csConnectorSocket.isSendReady( pTimeout );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isSendReady function: setup a connection and then check if it can transmit data.",
+ ( sal_True == bOK3 ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( isSendReady );
+ CPPUNIT_TEST( isSendReady_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class isSendReady
+
+
+ /** testing the methods:
+ inline oslSocketType SAL_CALL getType() const;
+
+ */
+
+ class getType : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void getType_001()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.",
+ osl_Socket_TypeStream == sSocket.getType( ) );
+ }
+
+ void getType_002()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.",
+ osl_Socket_TypeDgram == sSocket.getType( ) );
+ }
+
+#ifdef UNX
+ // mindy: since on LINUX and SOLARIS, Raw type socket can not be created, so do not test getType() here
+ // mindy: and add one test case to test creating Raw type socket--> ctors_TypeRaw()
+ void getType_003()
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.this is not passed in (LINUX, SOLARIS), the osl_Socket_TypeRaw, type socket can not be created.",
+ sal_True);
+ }
+#else
+ void getType_003()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.",
+ osl_Socket_TypeRaw == sSocket.getType( ) );
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( getType );
+ CPPUNIT_TEST( getType_001 );
+ CPPUNIT_TEST( getType_002 );
+ CPPUNIT_TEST( getType_003 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getType
+
+
+
+ /** testing the methods:
+ inline sal_Int32 SAL_CALL getOption(
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen,
+ oslSocketOptionLevel Level= osl_Socket_LevelSocket) const;
+
+ inline sal_Int32 getOption( oslSocketOption option ) const;
+
+ */
+
+ class getOption : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+ /** test writer's comment:
+
+ in oslSocketOption, the osl_Socket_OptionType denote 1 as osl_Socket_TypeStream.
+ 2 as osl_Socket_TypeDgram, etc which is not mapping the oslSocketType enum. differ
+ in 1.
+ */
+
+ void getOption_001()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+ sal_Int32 * pType = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) );
+ *pType = 0;
+ sSocket.getOption( osl_Socket_OptionType, pType, sizeof ( sal_Int32 ) );
+ sal_Bool bOK = ( SOCK_STREAM == *pType );
+ // there is a TypeMap(socket.c) which map osl_Socket_TypeStream to SOCK_STREAM on UNX, and SOCK_STREAM != osl_Socket_TypeStream
+ //sal_Bool bOK = ( TYPE_TO_NATIVE(osl_Socket_TypeStream) == *pType );
+ free( pType );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get type option of socket.",
+ sal_True == bOK );
+ }
+
+ // getsockopt error
+ void getOption_004()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ sal_Bool * pbDontRoute = ( sal_Bool * )malloc( sizeof ( sal_Bool ) );
+ sal_Int32 nRes = sSocket.getOption( osl_Socket_OptionInvalid, pbDontRoute, sizeof ( sal_Bool ) );
+ free( pbDontRoute );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get invalid option of socket, should return -1.",
+ nRes == -1 );
+ }
+
+ void getOption_simple_001()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ sal_Bool bOK = ( sal_False == sSocket.getOption( osl_Socket_OptionDontRoute ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get debug option of socket.",
+ sal_True == bOK );
+ }
+
+ void getOption_simple_002()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ sal_Bool bOK = ( sal_False == sSocket.getOption( osl_Socket_OptionDebug ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get debug option of socket.",
+ sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getOption );
+ CPPUNIT_TEST( getOption_001 );
+ CPPUNIT_TEST( getOption_004 );
+ CPPUNIT_TEST( getOption_simple_001 );
+ CPPUNIT_TEST( getOption_simple_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getOption
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL setOption( oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen,
+ oslSocketOptionLevel Level= osl_Socket_LevelSocket ) const;
+ */
+
+ class setOption : public CppUnit::TestFixture
+ {
+ public:
+ TimeValue *pTimeout;
+// LLA: maybe there is an error in the source,
+// as long as I remember, if a derived class do not overload all ctors there is a problem.
+
+ ::osl::AcceptorSocket asAcceptorSocket;
+
+ void setUp( )
+ {
+
+ }
+
+ void tearDown( )
+ {
+ asAcceptorSocket.close( );
+ }
+
+
+ // LLA:
+ // getSocketOption returns BufferLen, or -1 if something failed
+
+ // setSocketOption returns sal_True, if option could stored
+ // else sal_False
+
+ void setOption_001()
+ {
+ /// set and get option.
+ int nBufferLen = sizeof ( sal_Int32);
+ // LLA: SO_DONTROUTE expect an integer boolean, what ever it is, it's not sal_Bool!
+
+ sal_Int32 * pbDontRouteSet = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) );
+ *pbDontRouteSet = 1; // sal_True;
+
+ sal_Int32 * pGetBuffer = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) );
+ *pGetBuffer = 0;
+
+ // maybe asAcceptorSocket is not right initialized
+ sal_Bool b1 = asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontRouteSet, nBufferLen );
+ CPPUNIT_ASSERT_MESSAGE( "setOption function failed.", ( sal_True == b1 ) );
+ sal_Int32 n2 = asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pGetBuffer, nBufferLen );
+ CPPUNIT_ASSERT_MESSAGE( "getOption function failed.", ( n2 == nBufferLen ) );
+
+ // on Linux, the value of option is 1, on Solaris, it's 16, but it's not important the exact value,
+ // just judge it is zero or not!
+ sal_Bool bOK = ( 0 != *pGetBuffer );
+ t_print("#setOption_001: getOption is %d \n", *pGetBuffer);
+
+ // toggle check, set to 0
+ *pbDontRouteSet = 0;
+
+ sal_Bool b3 = asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontRouteSet, sizeof ( sal_Int32 ) );
+ CPPUNIT_ASSERT_MESSAGE( "setOption function failed.", ( sal_True == b3 ) );
+ sal_Int32 n4 = asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pGetBuffer, nBufferLen );
+ CPPUNIT_ASSERT_MESSAGE( "getOption (DONTROUTE) function failed.", ( n4 == nBufferLen ) );
+
+ sal_Bool bOK2 = ( 0 == *pGetBuffer );
+
+ t_print("#setOption_001: getOption is %d \n", *pGetBuffer);
+
+// LLA: sal_Bool * pbDontTouteSet = ( sal_Bool * )malloc( sizeof ( sal_Bool ) );
+// LLA: *pbDontTouteSet = sal_True;
+// LLA: sal_Bool * pbDontTouteGet = ( sal_Bool * )malloc( sizeof ( sal_Bool ) );
+// LLA: *pbDontTouteGet = sal_False;
+// LLA: asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontTouteSet, sizeof ( sal_Bool ) );
+// LLA: asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pbDontTouteGet, sizeof ( sal_Bool ) );
+// LLA: ::rtl::OUString suError = outputError(::rtl::OUString::valueOf((sal_Int32)*pbDontTouteGet),
+// LLA: ::rtl::OUString::valueOf((sal_Int32)*pbDontTouteSet),
+// LLA: "test for setOption function: set osl_Socket_OptionDontRoute and then check");
+// LLA:
+// LLA: sal_Bool bOK = ( sal_True == *pbDontTouteGet );
+// LLA: free( pbDontTouteSet );
+// LLA: free( pbDontTouteGet );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.",
+ ( sal_True == bOK ) && (sal_True == bOK2) );
+
+ free( pbDontRouteSet );
+ free( pGetBuffer );
+// LLA: CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+ void setOption_002()
+ {
+ /// set and get option.
+
+ // sal_Int32 * pbLingerSet = ( sal_Int32 * )malloc( nBufferLen );
+ // *pbLingerSet = 7;
+ // sal_Int32 * pbLingerGet = ( sal_Int32 * )malloc( nBufferLen );
+ /* struct */linger aLingerSet;
+ sal_Int32 nBufferLen = sizeof( struct linger );
+ aLingerSet.l_onoff = 1;
+ aLingerSet.l_linger = 7;
+
+ linger aLingerGet;
+
+ asAcceptorSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, nBufferLen );
+
+ sal_Int32 n1 = asAcceptorSocket.getOption( osl_Socket_OptionLinger, &aLingerGet, nBufferLen );
+ CPPUNIT_ASSERT_MESSAGE( "getOption (SO_LINGER) function failed.", ( n1 == nBufferLen ) );
+
+ //t_print("#setOption_002: getOption is %d \n", aLingerGet.l_linger);
+ sal_Bool bOK = ( 7 == aLingerGet.l_linger );
+ CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check. ",
+ sal_True == bOK );
+
+ }
+
+ void setOption_003()
+ {
+ linger aLingerSet;
+ aLingerSet.l_onoff = 1;
+ aLingerSet.l_linger = 7;
+
+ sal_Bool b1 = asAcceptorSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, 0 );
+ printUString( asAcceptorSocket.getErrorAsString() );
+ CPPUNIT_ASSERT_MESSAGE( "setOption (SO_LINGER) function failed for optlen is 0.",
+ ( b1 == sal_False ) );
+ }
+
+ void setOption_simple_001()
+ {
+ /// set and get option.
+ asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, 1 ); //sal_True );
+ sal_Bool bOK = ( 0 != asAcceptorSocket.getOption( osl_Socket_OptionDontRoute ) );
+
+ t_print("setOption_simple_001(): getoption is %d \n", asAcceptorSocket.getOption( osl_Socket_OptionDontRoute ) );
+ CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.",
+ ( sal_True == bOK ) );
+ }
+
+ void setOption_simple_002()
+ {
+ /// set and get option.
+ // LLA: this does not work, due to the fact that SO_LINGER is a structure
+// LLA: asAcceptorSocket.setOption( osl_Socket_OptionLinger, 7 );
+// LLA: sal_Bool bOK = ( 7 == asAcceptorSocket.getOption( osl_Socket_OptionLinger ) );
+
+// LLA: CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.",
+// LLA: ( sal_True == bOK ) );
+ }
+
+ CPPUNIT_TEST_SUITE( setOption );
+ CPPUNIT_TEST( setOption_001 );
+ CPPUNIT_TEST( setOption_002 );
+ CPPUNIT_TEST( setOption_003 );
+ CPPUNIT_TEST( setOption_simple_001 );
+// LLA: CPPUNIT_TEST( setOption_simple_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class setOption
+
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL enableNonBlockingMode( sal_Bool bNonBlockingMode);
+ */
+ class enableNonBlockingMode : public CppUnit::TestFixture
+ {
+ public:
+ ::osl::AcceptorSocket asAcceptorSocket;
+
+ void enableNonBlockingMode_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// if reach this statement, it is non-blocking mode, since acceptConnection will blocked by default.
+ sal_Bool bOK = sal_True;
+ asAcceptorSocket.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for enableNonBlockingMode function: launch a server socket and make it non blocking. if it can pass the acceptConnection statement, it is non-blocking",
+ ( sal_True == bOK ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( enableNonBlockingMode );
+ CPPUNIT_TEST( enableNonBlockingMode_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class enableNonBlockingMode
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL isNonBlockingMode() const;
+ */
+ class isNonBlockingMode : public CppUnit::TestFixture
+ {
+ public:
+ ::osl::AcceptorSocket asAcceptorSocket;
+
+ void isNonBlockingMode_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+
+ sal_Bool bOK3 = asAcceptorSocket.isNonBlockingMode( );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// if reach this statement, it is non-blocking mode, since acceptConnection will blocked by default.
+ sal_Bool bOK4 = asAcceptorSocket.isNonBlockingMode( );
+ asAcceptorSocket.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isNonBlockingMode function: launch a server socket and make it non blocking. it is expected to change from blocking mode to non-blocking mode.",
+ ( sal_False == bOK3 ) && ( sal_True == bOK4 ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( isNonBlockingMode );
+ CPPUNIT_TEST( isNonBlockingMode_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class isNonBlockingMode
+
+ /** testing the method:
+ inline void SAL_CALL clearError() const;
+ */
+ class clearError : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void clearError_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_HTTP2 );
+ ::osl::SocketAddr saLocalSocketAddr;
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sSocket.bind( saBindSocketAddr );//build an error "osl_Socket_E_AddrNotAvail"
+ oslSocketError seBind = sSocket.getError( );
+ sSocket.clearError( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for clearError function: trick an error called sSocket.getError( ), and then clear the error states, check the result.",
+ osl_Socket_E_None == sSocket.getError( ) && seBind != osl_Socket_E_None );
+ }
+
+
+ CPPUNIT_TEST_SUITE( clearError );
+ CPPUNIT_TEST( clearError_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class clearError
+
+
+ /** testing the methods:
+ inline oslSocketError getError() const;
+ inline ::rtl::OUString getErrorAsString( ) const;
+ */
+ class getError : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void getError_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( aHostIp1, IP_PORT_FTP );
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getError function: should get no error.",
+ osl_Socket_E_None == sSocket.getError( ) );
+ }
+
+ void getError_002()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( aHostIpInval, IP_PORT_FTP );
+ ::osl::SocketAddr saLocalSocketAddr;
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sSocket.bind( saBindSocketAddr );//build an error "osl_Socket_E_AddrNotAvail"
+ //on Solaris, the error no is EACCES, but it has no mapped value, so getError() returned osl_Socket_E_InvalidError.
+#if defined(SOLARIS)
+ CPPUNIT_ASSERT_MESSAGE( "trick an error called sSocket.getError( ), check the getError result.Failed on Solaris, returned osl_Socket_E_InvalidError because no entry to map the errno EACCES. ",
+ osl_Socket_E_InvalidError == sSocket.getError( ) );
+#else
+ //while on Linux & Win32, the errno is EADDRNOTAVAIL, getError returned osl_Socket_E_AddrNotAvail.
+
+ CPPUNIT_ASSERT_MESSAGE( "trick an error called sSocket.getError( ), check the getError result.Failed on Solaris, returned osl_Socket_E_InvalidError because no entry to map the errno EACCES. Passed on Linux & Win32",
+ osl_Socket_E_AddrNotAvail == sSocket.getError( ) );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( getError );
+ CPPUNIT_TEST( getError_001 );
+ CPPUNIT_TEST( getError_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getError
+
+
+
+ /** testing the methods:
+ inline oslSocket getHandle() const;
+ */
+
+ class getHandle : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+ void getHandle_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::Socket assignSocket = sSocket.getHandle();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment_handle function: test the assignment operator.",
+ osl_Socket_TypeStream == assignSocket.getType( ) );
+ }
+
+ void getHandle_002()
+ {
+ ::osl::Socket sSocket( sHandle );
+ ::osl::Socket assignSocket ( sSocket.getHandle( ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment function: assignment operator",
+ osl_Socket_TypeStream == assignSocket.getType( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getHandle );
+ CPPUNIT_TEST( getHandle_001 );
+ CPPUNIT_TEST( getHandle_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getHandle
+
+
+// -----------------------------------------------------------------------------
+
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::ctors, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::operators, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::close, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalAddr, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalPort, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalHost, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getPeer, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::bind, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isRecvReady, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isSendReady, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getType, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getOption, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::setOption, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::enableNonBlockingMode, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isNonBlockingMode, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::clearError, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getError, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getHandle, "osl_Socket");
+
+} // namespace osl_Socket
+
+
+
+namespace osl_StreamSocket
+{
+
+ /** testing the methods:
+ inline StreamSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+
+ inline StreamSocket( const StreamSocket & );
+
+ inline StreamSocket( oslSocket Socket , __sal_NoAcquire noacquire );
+
+ inline StreamSocket( oslSocket Socket );
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void ctors_none()
+ {
+ /// Socket constructor.
+ ::osl::StreamSocket ssSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_none constructor function: check if the stream socket was created successfully.",
+ osl_Socket_TypeStream == ssSocket.getType( ) );
+ }
+
+ void ctors_acquire()
+ {
+ /// Socket constructor.
+ ::osl::StreamSocket ssSocket( sHandle );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_acquire constructor function: check if the socket was created successfully",
+ osl_Socket_TypeStream == ssSocket.getType( ) );
+ }
+
+ void ctors_no_acquire()
+ {
+ /// Socket constructor.
+ ::osl::StreamSocket ssSocket( sHandle, SAL_NO_ACQUIRE );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for ctors_no_acquire constructor function: check if the socket was created successfully",
+ osl_Socket_TypeStream == ssSocket.getType( ) );
+ }
+
+ void ctors_copy_ctor()
+ {
+ /// Socket constructor.
+ ::osl::StreamSocket ssSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ /// Socket copy constructor.
+ ::osl::StreamSocket copySocket( ssSocket );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for ctors_copy_ctor constructor function: create new Socket instance using copy constructor",
+ osl_Socket_TypeStream == copySocket.getType( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_acquire );
+ CPPUNIT_TEST( ctors_no_acquire );
+ CPPUNIT_TEST( ctors_copy_ctor );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+ class send_recv: public CppUnit::TestFixture
+ {
+ public:
+ // initialization
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+
+ }
+
+ void send_recv1()
+ {
+ //client sent two strings, and server received, check the order and value
+ ServerSocketThread myServerThread;
+ ClientSocketThread myClientThread;
+ myServerThread.create( );
+ myClientThread.create( );
+
+ //wait until the thread terminate
+ myClientThread.join( );
+ myServerThread.join( );
+ sal_Char myStr[30] = "";
+ strcat( myStr, pTestString1 );
+ strcat( myStr, pTestString2 );
+ sal_Int32 nRes = strcmp( myServerThread.pReadBuffer, myStr );
+ CPPUNIT_ASSERT_MESSAGE(" test for send/recv with two threads: launch Server/Client threads, send data from client, check received data in Server thread.",
+ nRes == 0 );
+ }
+
+ // error when recv
+ void send_recv2()
+ {
+ ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9 );
+ ::osl::StreamSocket ssStreamConnection;
+ sal_Char pReadBuffer[30] = "";
+
+ ClientSocketThread myClientThread;
+ myClientThread.create( );
+
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+
+ asAcceptorSocket.bind( saLocalSocketAddr );
+ asAcceptorSocket.listen( 1 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection( ssStreamConnection );
+ sal_Int32 nReadNumber = ssStreamConnection.recv( pReadBuffer, 11 );
+
+ myClientThread.join( ) ;
+ ssStreamConnection.close();
+ asAcceptorSocket.close();
+ CPPUNIT_ASSERT_MESSAGE(" test for send/recv, recv error!", nReadNumber == -1 );
+ }
+
+ void write_read(sal_Int32 _nBufferSize, int _nValue)
+ {
+ //client sent two strings, and server received, check the order and value
+ WriteSocketThread myServerThread(_nBufferSize, _nValue);
+ ReadSocketThread myClientThread(_nBufferSize, _nValue);
+ myServerThread.create( );
+// thread_sleep( 1 );
+ myClientThread.create( );
+
+ //wait until the thread terminate
+ myClientThread.join( );
+ myServerThread.join( );
+
+ //Maximum Packet Size is ( ARPANET, MILNET = 1007 Ethernet (10Mb) = 1500
+ // Proteon PRONET = 2046), so here test read 4000 bytes
+ sal_Int32 nLength = myClientThread.getCount();
+ bool bIsOk = myClientThread.isOk(); // check if the values are right.
+
+ t_print("Length:=%d\n", nLength);
+ t_print(" bIsOk:=%d\n", bIsOk);
+
+ CPPUNIT_ASSERT_MESSAGE(" test for write/read values with two threads: send data from server, check readed data in client.",
+ nLength == _nBufferSize && bIsOk == true);
+ }
+
+ void write_read_001()
+ {
+ write_read(50, 10);
+ }
+ void write_read_002()
+ {
+ write_read(1024, 20);
+ }
+ void write_read_003()
+ {
+ write_read(4000, 1);
+ }
+ void write_read_004()
+ {
+ write_read(8192, 3);
+ }
+
+ CPPUNIT_TEST_SUITE( send_recv );
+ CPPUNIT_TEST( write_read_001 );
+ CPPUNIT_TEST( write_read_002 );
+ CPPUNIT_TEST( write_read_003 );
+ CPPUNIT_TEST( write_read_004 );
+ CPPUNIT_TEST( send_recv1 );
+ CPPUNIT_TEST( send_recv2 );
+// CPPUNIT_TEST( write_read );
+ CPPUNIT_TEST_SUITE_END();
+ }; // class send_recv
+
+class SendClientThread : public ClientSocketThread
+{
+protected:
+
+ void SAL_CALL run( )
+ {
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 5;
+ pTimeout->Nanosec = 0;
+
+ if ( osl_Socket_Ok == csConnectorSocket.connect( saTargetSocketAddr, pTimeout ))
+ {
+ sal_Int32 nWrite1 = csConnectorSocket.write( pTestString1, 11 ); // "test socket"
+
+ sal_Int32 nWrite2 = csConnectorSocket.write( pTestString2, strlen( pTestString2 ) + 1 );
+ thread_sleep( 2 );
+ csConnectorSocket.write( pTestString2, strlen( pTestString2 ) + 1 );
+ t_print("nWrite1 is %d, nWrite2 is %d\n", nWrite1, nWrite2 );
+ //thread_sleep( 1 );
+ }
+ else
+ t_print("# SendClientThread: connect failed! \n");
+
+ csConnectorSocket.close();
+ free( pTimeout );
+ }
+
+};
+
+ class shutdown: public CppUnit::TestFixture
+ {
+ public:
+ // initialization
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+
+ }
+
+ // similar to close_002
+ void shutdown_001()
+ {
+#if defined(LINUX)
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ AcceptorThread myAcceptorThread( asSocket, aHostIp1 );
+ myAcceptorThread.create();
+
+ thread_sleep( 1 );
+
+ //when accepting, shutdown the socket, the thread will not block for accepting
+ asSocket.shutdown();
+ myAcceptorThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.",
+ myAcceptorThread.isOK( ) == sal_True );
+#endif
+ }
+
+ void shutdown_002()
+ {
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9);
+ asSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: bind fail", asSocket.bind( saLocalSocketAddr ) == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: listen fail", asSocket.listen( 1 ) == sal_True );
+ sal_Char pReadBuffer[40];
+ SendClientThread mySendThread;
+ mySendThread.create();
+
+ asSocket.enableNonBlockingMode( sal_False );
+ ::osl::StreamSocket ssConnectionSocket;
+ oslSocketResult eResult = asSocket.acceptConnection( ssConnectionSocket );
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: acceptConnection fail", eResult == osl_Socket_Ok );
+
+ /* set socket option SO_LINGER 0, so close immediatly */
+ linger aLingerSet;
+ sal_Int32 nBufferLen = sizeof( struct linger );
+ aLingerSet.l_onoff = 0;
+ aLingerSet.l_linger = 0;
+
+ ssConnectionSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, nBufferLen );
+ thread_sleep( 1 );
+ //sal_uInt32 nRecv1 = 0;
+ sal_Int32 nRead1 = ssConnectionSocket.read( pReadBuffer, 11 );
+
+ //shutdown read after client the first send complete
+ ssConnectionSocket.shutdown( osl_Socket_DirRead );
+
+ sal_Int32 nRead2 = ssConnectionSocket.read( pReadBuffer + nRead1, 12 );
+ sal_Int32 nRead3 = ssConnectionSocket.read( pReadBuffer + nRead1 + nRead2, 12 );
+ t_print("after read 2, nRead1 is %d, nRead2 is %d, nRead3 is %d \n", nRead1, nRead2, nRead3 );
+ mySendThread.join();
+
+ ssConnectionSocket.close();
+ asSocket.close();
+
+ /* on Linux, if send is before shutdown(DirRead), can read, nRecv2 still > 0,
+ http://dbforums.com/arch/186/2002/12/586417
+ While on Solaris, after shutdown(DirRead), all read will return 0
+ */
+#ifdef LINUX
+ CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not read(recv).",
+ nRead1 > 0 && nRead3 == 0 );
+#else
+ CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not read(recv).",
+ nRead1 > 0 && nRead2 == 0 && nRead3 == 0 );
+#endif
+
+ }
+
+ void shutdown_003()
+ {
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9);
+ asSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: bind fail", asSocket.bind( saLocalSocketAddr ) == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: listen fail", asSocket.listen( 1 ) == sal_True );
+ sal_Char pReadBuffer[40];
+ SendClientThread mySendThread;
+ mySendThread.create();
+
+ asSocket.enableNonBlockingMode( sal_False );
+ ::osl::StreamSocket ssConnectionSocket;
+ oslSocketResult eResult = asSocket.acceptConnection( ssConnectionSocket );
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: acceptConnection fail", eResult == osl_Socket_Ok );
+
+ thread_sleep( 1 );
+ //shutdown write after client the first send complete
+ ssConnectionSocket.shutdown( osl_Socket_DirWrite );
+
+ // recv should not shutdown
+ sal_Int32 nRead1 = ssConnectionSocket.read( pReadBuffer, 11 );
+
+ sal_Int32 nWrite = ssConnectionSocket.write( pReadBuffer, 11 );
+ // still can read
+ sal_Int32 nRead3 = ssConnectionSocket.read( pReadBuffer + nRead1 , 12 );
+ t_print("after read 2, nRead1 is %d, nWrite is %d, nRead3 is %d\n", nRead1, nWrite, nRead3 );
+ mySendThread.join();
+ ssConnectionSocket.close();
+ asSocket.close();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not send(write).",
+ nRead1 > 0 && nWrite == 0 && nRead3 > 0);
+
+ }
+
+ CPPUNIT_TEST_SUITE( shutdown );
+ CPPUNIT_TEST( shutdown_001 );
+ CPPUNIT_TEST( shutdown_002 );
+ CPPUNIT_TEST( shutdown_003 );
+ CPPUNIT_TEST_SUITE_END();
+ }; // class shutdown
+
+ class isExceptionPending: public CppUnit::TestFixture
+ {
+ public:
+ void isExPending_001()
+ {
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ sal_Bool bOk = asSocket.isExceptionPending( pTimeout );
+ free( pTimeout );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isExceptionPending.",
+ bOk == sal_False );
+ }
+
+ /**tester's comments: lack of a case that return sal_True, do not know when it will return sal_True*/
+
+
+ CPPUNIT_TEST_SUITE( isExceptionPending );
+ CPPUNIT_TEST( isExPending_001 );
+ CPPUNIT_TEST_SUITE_END();
+ }; // class isExceptionPending
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::ctors, "osl_StreamSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::send_recv, "osl_StreamSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::shutdown, "osl_StreamSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::isExceptionPending, "osl_StreamSocket");
+
+} // namespace osl_StreamSocket
+
+
+namespace osl_ConnectorSocket
+{
+
+ /** testing the method:
+ ConnectorSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ void ctors_001()
+ {
+ /// Socket constructor.
+ ::osl::ConnectorSocket csSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the connector socket was created successfully.",
+ osl_Socket_TypeStream == csSocket.getType( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+ /** testing the method:
+ oslSocketResult SAL_CALL connect(const SocketAddr& TargetHost, const TimeValue* pTimeout = 0);
+ */
+
+ class connect : public CppUnit::TestFixture
+ {
+ public:
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ // sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ // sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void connect_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT2 );
+ ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT2 );
+ ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+
+ //asAcceptorSocket.enableNonBlockingMode( sal_True );
+ //oslSocketResult eResultAccept = asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+ //CPPUNIT_ASSERT_MESSAGE( "accept failed.", osl_Socket_Ok == eResultAccept );
+ /// launch client socket
+ oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+ CPPUNIT_ASSERT_MESSAGE( "connect failed.", osl_Socket_Ok == eResult );
+
+ /// get peer information
+ csConnectorSocket.getPeerAddr( saPeerSocketAddr );/// connected.
+
+ CPPUNIT_ASSERT_MESSAGE( "test for connect function: try to create a connection with remote host. and check the setup address.",
+ ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) &&
+ ( osl_Socket_Ok == eResult ));
+ }
+ //non-blocking mode connect?
+ void connect_002()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT3 );
+ ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT3 );
+ ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP );
+
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+
+ csConnectorSocket.enableNonBlockingMode( sal_True );
+
+ oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+ CPPUNIT_ASSERT_MESSAGE( "connect failed.", osl_Socket_InProgress == eResult || osl_Socket_Ok == eResult );
+
+ /// get peer information
+ csConnectorSocket.getPeerAddr( saPeerSocketAddr );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for connect function: try to create a connection with remote host. and check the setup address.",
+ sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) ;
+ }
+ // really an error or just delayed
+ // how to design senarios that will return osl_Socket_Interrupted, osl_Socket_TimedOut
+ void connect_003()
+ {
+ ::osl::SocketAddr saTargetSocketAddr1( aHostIp1, IP_PORT_MYPORT3 );
+ ::osl::SocketAddr saTargetSocketAddr2( aHostIpInval1, IP_PORT_MYPORT3 );
+
+ csConnectorSocket.enableNonBlockingMode( sal_False );
+
+ oslSocketResult eResult1 = csConnectorSocket.connect( saTargetSocketAddr1, pTimeout );
+ oslSocketResult eResult2 = csConnectorSocket.connect( saTargetSocketAddr2, pTimeout );
+ CloseSocketThread myCloseThread( csConnectorSocket );
+ oslSocketResult eResult3 = csConnectorSocket.connect( saTargetSocketAddr2, pTimeout );
+ myCloseThread.join();
+ CPPUNIT_ASSERT_MESSAGE( "connect should failed.", osl_Socket_Error == eResult1 &&
+ osl_Socket_Error == eResult2 && osl_Socket_Error == eResult3 );
+
+ }
+
+ // really an error in non-blocking mode
+ void connect_004()
+ {
+ ::osl::SocketAddr saTargetSocketAddr( aHostIpInval1, IP_PORT_MYPORT3 );
+
+ csConnectorSocket.enableNonBlockingMode( sal_True );
+
+ oslSocketResult eResult = csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+ CPPUNIT_ASSERT_MESSAGE( "connect should failed.", osl_Socket_Error == eResult );
+ }
+ /** here need a case: immediate connection, say in non-blocking mode connect return osl_Socket_Ok
+ */
+
+ CPPUNIT_TEST_SUITE( connect );
+ CPPUNIT_TEST( connect_001 );
+ CPPUNIT_TEST( connect_002 );
+ CPPUNIT_TEST( connect_003 );
+ CPPUNIT_TEST( connect_004 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class connect
+
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ConnectorSocket::ctors, "osl_ConnectorSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_ConnectorSocket::connect, "osl_ConnectorSocket");
+
+} // namespace osl_ConnectorSocket
+
+
+
+namespace osl_AcceptorSocket
+{
+
+ /** testing the methods:
+ inline AcceptorSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+
+ void ctors_001()
+ {
+ /// Socket constructor.
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the acceptor socket was created successfully.",
+ osl_Socket_TypeStream == asSocket.getType( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+#if 0
+ class operator_assign : public CppUnit::TestFixture
+ {
+ public:
+
+ void assign_001()
+ {
+#if defined(LINUX)
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::AcceptorSocket asSocketAssign( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ asSocket.setOption( osl_Socket_OptionReuseAddr, 1);
+ ::osl::SocketAddr saSocketAddr( aHostIp1, IP_PORT_MYPORT4 );
+ asSocket.bind( saSocketAddr );
+
+ AcceptorThread myAcceptorThread( asSocketAssign, aHostIp1 );
+ myAcceptorThread.create();
+
+ thread_sleep( 1 );
+ //when accepting, assign another socket to the socket, the thread will not be closed, so is blocking
+ asSocketAssign = asSocket;
+
+ t_print("#asSocketAssign port number is %d\n", asSocketAssign.getLocalPort() );
+
+ asSocketAssign.shutdown();
+ myAcceptorThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.",
+ myAcceptorThread.isOK() == sal_True );
+
+
+#endif /* LINUX */
+ }
+
+
+ CPPUNIT_TEST_SUITE( operator_assign );
+ CPPUNIT_TEST( assign_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class operator_assign
+#endif
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL listen(sal_Int32 MaxPendingConnections= -1);
+ inline oslSocketResult SAL_CALL acceptConnection( StreamSocket& Connection);
+ inline oslSocketResult SAL_CALL acceptConnection( StreamSocket& Connection, SocketAddr & PeerAddr);
+ */
+
+ class listen_accept : public CppUnit::TestFixture
+ {
+ public:
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1);
+ // sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ // sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void listen_accept_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT3 );
+ ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT3 );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ CPPUNIT_ASSERT_MESSAGE( "test for listen_accept function: try to create a connection with remote host, using listen and accept.",
+ ( osl_Socket_Ok == eResult ) );
+ }
+
+ void listen_accept_002()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT4 );
+ ::osl::SocketAddr saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT4 );
+ ::osl::SocketAddr saPeerSocketAddr( aHostIp2, IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection(ssConnection, saPeerSocketAddr); /// waiting for incoming connection...
+
+ CPPUNIT_ASSERT_MESSAGE( "test for listen_accept function: try to create a connection with remote host, using listen and accept, accept with peer address.",
+ ( sal_True == bOK2 ) &&
+ ( osl_Socket_Ok == eResult ) &&
+ ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) ) );
+ }
+
+ void listen_accept_003()
+ {
+
+ }
+
+ CPPUNIT_TEST_SUITE( listen_accept );
+ CPPUNIT_TEST( listen_accept_001 );
+ CPPUNIT_TEST( listen_accept_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class listen_accept
+
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::ctors, "osl_AcceptorSocket");
+//CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::operator_assign, "osl_AcceptorSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_AcceptorSocket::listen_accept, "osl_AcceptorSocket");
+
+} // namespace osl_AcceptorSocket
+
+
+namespace osl_DatagramSocket
+{
+
+ /** testing the methods:
+ inline DatagramSocket(oslAddrFamily Family= osl_Socket_FamilyInet,
+ oslProtocol Protocol= osl_Socket_ProtocolIp,
+ oslSocketType Type= osl_Socket_TypeDgram);
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+
+ void ctors_001()
+ {
+ /// Socket constructor.
+ ::osl::DatagramSocket dsSocket;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_001 constructor function: check if the datagram socket was created successfully.",
+ osl_Socket_TypeDgram == dsSocket.getType( ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+/**thread do sendTo, refer to http://www.coding-zone.co.uk/cpp/articles/140101networkprogrammingv.shtml
+*/
+class TalkerThread : public Thread
+{
+protected:
+ ::osl::SocketAddr saTargetSocketAddr;
+ ::osl::DatagramSocket dsSocket;
+
+ void SAL_CALL run( )
+ {
+ dsSocket.sendTo( saTargetSocketAddr, pTestString1, strlen( pTestString1 ) + 1 ); // "test socket"
+ dsSocket.shutdown();
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ }
+
+public:
+ TalkerThread( ):
+ saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT9 )
+ {
+ }
+
+ ~TalkerThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: TalkerThread not terminated normally.\n" );
+ }
+};
+
+/**thread do listen, refer to http://www.coding-zone.co.uk/cpp/articles/140101networkprogrammingv.shtml
+*/
+class ListenerThread : public Thread
+{
+protected:
+ ::osl::SocketAddr saTargetSocketAddr;
+ ::osl::DatagramSocket dsSocket;
+
+ void SAL_CALL run( )
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT10 );
+ dsSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+ if ( dsSocket.bind( saLocalSocketAddr ) == sal_False )
+ {
+ t_print("DatagramSocket bind failed \n");
+ return;
+ }
+ //blocking mode: default
+ sal_Int32 nRecv = dsSocket.recvFrom( pRecvBuffer, 30, &saTargetSocketAddr); //strlen( pTestString2 ) + 1
+ t_print("After recvFrom, nRecv is %d\n", nRecv);
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ }
+
+public:
+ sal_Char pRecvBuffer[30];
+ ListenerThread( ):
+ saTargetSocketAddr( aHostIp1, IP_PORT_MYPORT10 )
+ {
+ pRecvBuffer[0] = '\0';
+ }
+
+ ~ListenerThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: ListenerThread not terminated normally.\n" );
+ }
+
+};
+
+ /** testing the methods:
+ inline sal_Int32 DatagramSocket::recvFrom(void* pBuffer, sal_uInt32 BufferSize,
+ SocketAddr* pSenderAddr, oslSocketMsgFlag Flag )
+ inline sal_Int32 DatagramSocket::sendTo( const SocketAddr& ReceiverAddr,
+ const void* pBuffer, sal_uInt32 BufferSize, oslSocketMsgFlag Flag )
+ */
+
+ class sendTo_recvFrom : public CppUnit::TestFixture
+ {
+ public:
+
+ void sr_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIp1, IP_PORT_MYPORT9 );
+ ::osl::DatagramSocket dsSocket;
+ dsSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+ dsSocket.bind( saLocalSocketAddr );
+
+ sal_Char pReadBuffer[30];
+ TalkerThread myTalkThread;
+ myTalkThread.create();
+ sal_Int32 nRecv = dsSocket.recvFrom( pReadBuffer, 30, &saLocalSocketAddr);
+ myTalkThread.join();
+ //t_print("#received buffer is %s# \n", pReadBuffer);
+
+ sal_Bool bOk = ( strcmp(pReadBuffer, pTestString1) == 0 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for sendTo/recvFrom function: create a talker thread and recvFrom in the main thread, check if the datagram socket can communicate successfully.",
+ nRecv > 0 && bOk == sal_True );
+ }
+
+ void sr_002()
+ {
+ ::osl::SocketAddr saListenSocketAddr( aHostIp1, IP_PORT_MYPORT10 );
+ ::osl::DatagramSocket dsSocket;
+
+ //listener thread construct a DatagramSocket, recvFrom waiting for data, then main thread sendto data
+ ListenerThread myListenThread;
+ myListenThread.create();
+ //to grantee the recvFrom is before sendTo
+ thread_sleep( 1 );
+
+ sal_Int32 nSend = dsSocket.sendTo( saListenSocketAddr, pTestString2, strlen( pTestString2 ) + 1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo failed: nSend <= 0.", nSend > 0);
+
+ myListenThread.join();
+ //t_print("#received buffer is %s# \n", myListenThread.pRecvBuffer);
+
+ sal_Bool bOk = ( strcmp( myListenThread.pRecvBuffer, pTestString2) == 0 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for sendTo/recvFrom function: create a listener thread and sendTo in the main thread, check if the datagram socket can communicate successfully.",
+ bOk == sal_True );
+ }
+
+ //sendTo error, return -1; recvFrom error, return -1
+ void sr_003()
+ {
+ ::osl::SocketAddr saListenSocketAddr( aHostIpInval1, IP_PORT_MYPORT10 );
+ ::osl::DatagramSocket dsSocket;
+ // Transport endpoint is not connected
+ sal_Int32 nSend = dsSocket.sendTo( saListenSocketAddr, pTestString2, strlen( pTestString2 ) + 1 );
+ CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo should fail: nSend <= 0.",
+ nSend == -1 );
+ }
+
+ void sr_004()
+ {
+ ::osl::SocketAddr saListenSocketAddr1( aHostIpInval1, IP_PORT_MYPORT10 );
+ ::osl::SocketAddr saListenSocketAddr2( aHostIp2, IP_PORT_MYPORT10 );
+ ::osl::DatagramSocket dsSocket;
+
+ dsSocket.enableNonBlockingMode( sal_True );
+
+ sal_Char pReadBuffer[30];
+ //sal_Int32 nRecv1 = dsSocket.recvFrom( pReadBuffer, 30, &saListenSocketAddr1 );
+
+ // will block ?
+ CloseSocketThread myThread( dsSocket );
+ myThread.create();
+ sal_Int32 nRecv2 = dsSocket.recvFrom( pReadBuffer, 30, &saListenSocketAddr1 );
+ myThread.join();
+ //t_print("#nRecv1 is %d nRecv2 is %d\n", nRecv1, nRecv2 );
+ CPPUNIT_ASSERT_MESSAGE( "DatagramSocket sendTo should fail: nSend <= 0.",
+ nRecv2 == -1 );
+ }
+
+ CPPUNIT_TEST_SUITE( sendTo_recvFrom );
+ CPPUNIT_TEST( sr_001 );
+ CPPUNIT_TEST( sr_002 );
+ CPPUNIT_TEST( sr_003 );
+ CPPUNIT_TEST( sr_004 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class sendTo_recvFrom
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DatagramSocket::ctors, "osl_DatagramSocket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_DatagramSocket::sendTo_recvFrom, "osl_DatagramSocket");
+
+} // namespace osl_DatagramSocket
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/socket/osl_Socket.xsce b/sal/qa/osl/socket/osl_Socket.xsce
new file mode 100644
index 000000000000..38c02c8c75a3
--- /dev/null
+++ b/sal/qa/osl/socket/osl_Socket.xsce
@@ -0,0 +1,5 @@
+osl_Socket.ctors.ctors_family_Ipx
+osl_SocketAddr.getHostname.getHostname_002
+
+osl_StreamSocket.send_recv.write_read_003 unxsols
+osl_StreamSocket.send_recv.write_read_004 unxsols
diff --git a/sal/qa/osl/socket/osl_Socket2.cxx b/sal/qa/osl/socket/osl_Socket2.cxx
new file mode 100644
index 000000000000..83ec82b5a77a
--- /dev/null
+++ b/sal/qa/osl/socket/osl_Socket2.cxx
@@ -0,0 +1,1468 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/** test coder preface:
+ 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform
+ if you are not including ws2_32.lib in makefile.mk, the including format will be like this:
+
+ .IF "$(GUI)" == "WNT"
+ SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib
+ SHL1STDLIBS += ws2_32.lib
+ .ENDIF
+
+ likewise on Solaris platform.
+ .IF "$(GUI)" == "UNX"
+ SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+ SHL1STDLIBS += -lsocket -ldl -lnsl
+ .ENDIF
+
+ 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4
+ category.
+
+ 3. some fragment of Socket source implementation are lack of comment so it is hard for testers
+ guess what the exact functionality or usage of a member. Hope the Socket section's comment
+ will be added.
+
+ 4. following functions are declared but not implemented:
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
+ */
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+
+#include <testshl/simpleheader.hxx>
+
+//#include "osl_Socket_Const.h"
+#include "sockethelper.hxx"
+
+using namespace osl;
+using namespace rtl;
+
+#define IP_PORT_FTP 21
+#define IP_PORT_TELNET 23
+#define IP_PORT_HTTP2 8080
+#define IP_PORT_INVAL 99999
+#define IP_PORT_POP3 110
+#define IP_PORT_NETBIOS 139
+#define IP_PORT_MYPORT 8881
+#define IP_PORT_MYPORT1 8882
+#define IP_PORT_MYPORT5 8886
+#define IP_PORT_MYPORT6 8887
+#define IP_PORT_MYPORT7 8895
+#define IP_PORT_MYPORT8 8896
+#define IP_PORT_MYPORT9 8897
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+// just used to test socket::close() when accepting
+class AcceptorThread : public Thread
+{
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::rtl::OUString aHostIP;
+ sal_Bool bOK;
+protected:
+ void SAL_CALL run( )
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIP, IP_PORT_MYPORT9 );
+ ::osl::StreamSocket ssStreamConnection;
+
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ if ( sal_True != bOK1 )
+ {
+ t_print("# AcceptorSocket bind address failed.\n" ) ;
+ return;
+ }
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ if ( sal_True != bOK2 )
+ {
+ t_print("# AcceptorSocket listen address failed.\n" ) ;
+ return;
+ }
+
+ asAcceptorSocket.enableNonBlockingMode( sal_False );
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ bOK = sal_True;
+ t_print("AcceptorThread: acceptConnection failed! \n");
+ }
+ }
+public:
+ AcceptorThread(::osl::AcceptorSocket & asSocket, ::rtl::OUString const& aBindIP )
+ : asAcceptorSocket( asSocket ), aHostIP( aBindIP )
+ {
+ bOK = sal_False;
+ }
+
+ sal_Bool isOK() { return bOK; }
+
+ ~AcceptorThread( )
+ {
+ if ( isRunning( ) )
+ {
+ asAcceptorSocket.shutdown();
+ t_print("# error: Acceptor thread not terminated.\n" );
+ }
+ }
+};
+
+namespace osl_Socket
+{
+
+ /** testing the methods:
+ inline Socket( );
+ inline Socket( const Socket & socket );
+ inline Socket( oslSocket socketHandle );
+ inline Socket( oslSocket socketHandle, __sal_NoAcquire noacquire );
+ */
+
+ /** test writer's comment:
+
+ class Socket can not be initialized by its protected constructor, though the protected
+ constructor is the most convenient way to create a new socket.
+ it only allow the method of C function osl_createSocket like:
+ ::osl::Socket sSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream,
+ osl_Socket_ProtocolIp ) );
+ the use of C method lost some of the transparent of tester using C++ wrapper.
+ */
+
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void ctors_none()
+ {
+ /// Socket constructor.
+ // ::osl::Socket sSocket();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_none constructor function: check if the socket was created successfully, if no exception occured",
+ 1 == 1 );
+ }
+
+ void ctors_acquire()
+ {
+ /// Socket constructor.
+ ::osl::Socket sSocket( sHandle );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_acquire constructor function: check if the socket was created successfully",
+ osl_Socket_TypeStream == sSocket.getType( ) );
+ }
+
+ void ctors_no_acquire()
+ {
+ /// Socket constructor.
+ ::osl::Socket sSocket( sHandle, SAL_NO_ACQUIRE );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for ctors_no_acquire constructor function: check if the socket was created successfully",
+ osl_Socket_TypeStream == sSocket.getType( ) );
+ }
+
+ void ctors_copy_ctor()
+ {
+ ::osl::Socket sSocket( sHandle );
+ /// Socket copy constructor.
+ ::osl::Socket copySocket( sSocket );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for ctors_copy_ctor constructor function: create new Socket instance using copy constructor",
+ osl_Socket_TypeStream == copySocket.getType( ) );
+ }
+
+ void ctors_TypeRaw()
+ {
+#ifdef WNT
+ oslSocket sHandleRaw = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp );
+// LLA: ? ::osl::Socket sSocket( sHandleRaw );
+ CPPUNIT_ASSERT_MESSAGE( " type osl_Socket_TypeRaw socket create failed on UNX ", sHandleRaw != NULL);
+#else
+ oslSocket sHandleRaw = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp );
+ CPPUNIT_ASSERT_MESSAGE( " can't create socket with type osl_Socket_TypeRaw within UNX is ok.", sHandleRaw == NULL);
+#endif
+ }
+
+ void ctors_family_Ipx()
+ {
+ oslSocket sHandleIpx = osl_createSocket( osl_Socket_FamilyIpx, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ CPPUNIT_ASSERT_MESSAGE( " family osl_Socket_FamilyIpx socket create failed! ", sHandleIpx != NULL);
+ ::osl::Socket sSocket( sHandleIpx ); //, SAL_NO_ACQUIRE );
+ t_print("#Type is %d \n", sSocket.getType( ) );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for create new Socket instance that family is osl_Socket_FamilyIpx",
+ osl_Socket_TypeStream == sSocket.getType( ) );
+ }
+
+
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_acquire );
+ CPPUNIT_TEST( ctors_no_acquire );
+ CPPUNIT_TEST( ctors_copy_ctor );
+ CPPUNIT_TEST( ctors_TypeRaw );
+ CPPUNIT_TEST( ctors_family_Ipx );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+
+ /** testing the methods:
+ inline Socket& SAL_CALL operator= ( oslSocket socketHandle);
+ inline Socket& SAL_CALL operator= (const Socket& sock);
+ inline sal_Bool SAL_CALL operator==( const Socket& rSocket ) const ;
+ inline sal_Bool SAL_CALL operator==( const oslSocket socketHandle ) const;
+ */
+
+ class operators : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ /** test writer's comment:
+
+ the assignment operator does not support direct assinment like:
+ ::osl::Socket sSocket = sHandle.
+ */
+ void operators_assignment_handle()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::Socket assignSocket = sSocket.getHandle();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment_handle function: test the assignment operator.",
+ osl_Socket_TypeStream == assignSocket.getType( ) );
+ }
+
+ void operators_assignment()
+ {
+ ::osl::Socket sSocket( sHandle );
+ ::osl::Socket assignSocket = sSocket;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment function: assignment operator",
+ osl_Socket_TypeStream == assignSocket.getType( ) );
+ }
+
+ void operators_equal_handle_001()
+ {
+ /// Socket constructor.
+ ::osl::Socket sSocket( sHandle );
+ ::osl::Socket equalSocket = sSocket;
+
+ CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_handle_001 function: check equal.",
+ equalSocket == sHandle );
+ }
+
+ void operators_equal_handle_002()
+ {
+ /// Socket constructor.
+ ::osl::Socket equalSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ) );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_handle_001 function: check unequal.",
+ !( equalSocket == sHandle ) );
+ }
+
+ void operators_equal_001()
+ {
+ ::osl::Socket sSocket( sHandle );
+ /// Socket copy constructor.
+ ::osl::Socket equalSocket( sSocket );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for operators_equal function: check equal.",
+ equalSocket == sSocket );
+ }
+
+ void operators_equal_002()
+ {
+ ::osl::Socket sSocket( sHandle );
+ /// Socket copy constructor.
+ ::osl::Socket equalSocket( osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp ) );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for operators_equal_002 function: check unequal.",
+ !( equalSocket == sSocket ) );
+ }
+
+ CPPUNIT_TEST_SUITE( operators );
+ CPPUNIT_TEST( operators_assignment_handle );
+ CPPUNIT_TEST( operators_assignment );
+ CPPUNIT_TEST( operators_equal_handle_001 );
+ CPPUNIT_TEST( operators_equal_handle_002 );
+ CPPUNIT_TEST( operators_equal_001 );
+ CPPUNIT_TEST( operators_equal_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class operators
+
+
+ /** testing the methods:
+ inline void SAL_CALL shutdown( oslSocketDirection Direction = osl_Socket_DirReadWrite );
+ inline void SAL_CALL close();
+ */
+
+ class close : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void close_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ sSocket.close();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close_001 function: this function is reserved for test.",
+ sSocket.getHandle() == sHandle );
+ }
+
+ void close_002()
+ {
+//#if defined(LINUX)
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ AcceptorThread myAcceptorThread( asSocket, rtl::OUString::createFromAscii("127.0.0.1") );
+ myAcceptorThread.create();
+
+ thread_sleep( 1 );
+ //when accepting, close the socket, the thread will not block for accepting
+ //man close:Any locks held on the file it was associated with, and owned by the process, are removed
+ asSocket.close();
+ //thread_sleep( 2 );
+ myAcceptorThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.",
+ myAcceptorThread.isOK() == sal_True );
+//#endif
+ }
+
+ // to cover "if ( pSockAddrIn->sin_addr.s_addr == htonl(INADDR_ANY) )" in osl_closeSocket( )
+ void close_003()
+ {
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ AcceptorThread myAcceptorThread( asSocket, rtl::OUString::createFromAscii("0.0.0.0") );
+ myAcceptorThread.create();
+
+ thread_sleep( 1 );
+ asSocket.close();
+ myAcceptorThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.",
+ myAcceptorThread.isOK() == sal_True );
+ }
+
+ CPPUNIT_TEST_SUITE( close );
+ CPPUNIT_TEST( close_001 );
+ CPPUNIT_TEST( close_002 );
+ CPPUNIT_TEST( close_003 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class close
+
+ /** testing the method:
+ inline void SAL_CALL getLocalAddr( SocketAddr &Addr ) const;
+ */
+
+ class getLocalAddr : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+ // get the Address of the local end of the socket
+ void getLocalAddr_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT8 );
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString();
+ CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 );
+
+ sSocket.getLocalAddr( saLocalSocketAddr );
+
+ sal_Bool bOK = compareUString( saLocalSocketAddr.getHostname( 0 ), sSocket.getLocalHost() ) ;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getLocalAddr function: first create a new socket, then a socket address, bind them, and check the address.",
+ sal_True == bOK );
+ }
+
+
+ CPPUNIT_TEST_SUITE( getLocalAddr );
+ CPPUNIT_TEST( getLocalAddr_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getLocalAddr
+
+
+ /** testing the method:
+ inline sal_Int32 SAL_CALL getLocalPort() const;
+ */
+
+ class getLocalPort : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void getLocalPort_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT7 ); // aHostIp1 localhost
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString();
+ CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 );
+ sal_Bool bOK = ( IP_PORT_MYPORT7 == sSocket.getLocalPort( ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getLocalPort function: first create a new socket, then a socket address, bind them, and check the port.",
+ sal_True == bOK );
+ }
+
+ /** test writer's comment:
+
+ the invalid port number can not be set by giving invalid port number
+ such as 99999 or -1, it will convert to ( x mod 65535 ), so it will always be
+ valid, the only instance that the getLocalPort returns OSL_INVALID_PORT
+ is when saSocketAddr itself is an invalid one, that is , the IP or host name
+ can not be found, then the created socket address is not valid.
+ */
+ void getLocalPort_002()
+ {
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_TELNET);
+#ifdef WNT
+ ::osl::Socket sSocket(sHandle);
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True);
+ sSocket.bind( saBindSocketAddr );
+ //Invalid IP, so bind should fail
+ ::rtl::OUString suError = outputError(::rtl::OUString::valueOf(sSocket.getLocalPort( )),
+ ::rtl::OUString::valueOf((sal_Int32)OSL_INVALID_PORT),
+ "test for getLocalPort function: first create a new socket, then an invalid socket address, bind them, and check the port assigned.");
+ sal_Bool bOK = ( OSL_INVALID_PORT == sSocket.getLocalPort( ) );
+ (void)bOK;
+#else
+ //on Unix, if Addr is not an address of type osl_Socket_FamilyInet, it returns OSL_INVALID_PORT
+ ::rtl::OUString suError = ::rtl::OUString::createFromAscii( "on Unix, if Addr is not an address of type osl_Socket_FamilyInet, it returns OSL_INVALID_PORT, but can not create Addr of that case");
+#endif
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_False );
+
+ }
+
+ void getLocalPort_003()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( getLocalIP(), IP_PORT_INVAL);
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString();
+ CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 );
+ ::rtl::OUString suError = outputError(::rtl::OUString::valueOf(sSocket.getLocalPort( )),
+ ::rtl::OUString::createFromAscii("34463"),
+ "test for getLocalPort function: first create a new socket, then an invalid socket address, bind them, and check the port assigned");
+ sal_Bool bOK = ( sSocket.getLocalPort( ) >= 1 && sSocket.getLocalPort( ) <= 65535);
+
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getLocalPort );
+ CPPUNIT_TEST( getLocalPort_001 );
+// LLA: CPPUNIT_TEST( getLocalPort_002 );
+ CPPUNIT_TEST( getLocalPort_003 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getLocalPort
+
+
+ /** testing the method:
+ inline ::rtl::OUString SAL_CALL getLocalHost() const;
+
+ Mindyliu: on Linux, at first it will check the binded in /etc/hosts, if it has the binded IP, it will return the hostname in it;
+ else if the binded IP is "127.0.0.1", it will return "localhost", if it's the machine's ethernet ip such as "129.158.217.90", it
+ will return hostname of current processor such as "aegean.PRC.Sun.COM"
+ */
+
+ class getLocalHost : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void getLocalHost_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ //port number from IP_PORT_HTTP1 to IP_PORT_MYPORT6, mindyliu
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT6 );
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ ::rtl::OUString suError1 = ::rtl::OUString::createFromAscii("Socket bind fail:") + sSocket.getErrorAsString();
+ CPPUNIT_ASSERT_MESSAGE( suError1, sal_True == bOK1 );
+ sal_Bool bOK;
+ ::rtl::OUString suError;
+#ifdef WNT
+ bOK = compareUString( sSocket.getLocalHost( ), getThisHostname( ) ) ;
+ suError = outputError(sSocket.getLocalHost( ), getThisHostname( ),
+"test for getLocalHost function: create localhost socket and check name");
+#else
+ ::rtl::OUString aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) "localhost" );
+ sal_Bool bRes1, bRes2;
+ bRes1 = compareUString( sSocket.getLocalHost( ), aUString ) ;
+ bRes2 = compareUString( sSocket.getLocalHost( ), saBindSocketAddr.getHostname(0) ) ;
+ bOK = bRes1 || bRes2;
+ suError = outputError(sSocket.getLocalHost( ), aUString, "test for getLocalHost function: create localhost socket and check name");
+#endif
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+ void getLocalHost_002()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_POP3);
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sSocket.bind( saBindSocketAddr );
+ //Invalid IP, so bind should fail
+ sal_Bool bOK = compareUString( sSocket.getLocalHost( ), rtl::OUString::createFromAscii("") ) ;
+ ::rtl::OUString suError = outputError(sSocket.getLocalHost( ), rtl::OUString::createFromAscii(""), "test for getLocalHost function: getLocalHost with invalid SocketAddr");
+
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getLocalHost );
+ CPPUNIT_TEST( getLocalHost_001 );
+ CPPUNIT_TEST( getLocalHost_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getLocalHost
+
+
+ /** testing the methods:
+ inline void SAL_CALL getPeerAddr( SocketAddr & Addr) const;
+ inline sal_Int32 SAL_CALL getPeerPort() const;
+ inline ::rtl::OUString SAL_CALL getPeerHost() const;
+ */
+ class getPeer : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void getPeer_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT );
+ ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT );
+ ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ /// launch server socket
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind '127.0.0.1' address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ /// get peer information
+ csConnectorSocket.getPeerAddr( saPeerSocketAddr );/// connected.
+ sal_Int32 peerPort = csConnectorSocket.getPeerPort( );
+ ::rtl::OUString peerHost = csConnectorSocket.getPeerHost( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPeer function: setup a connection and then get the peer address, port and host from client side.",
+ ( sal_True == compareSocketAddr( saPeerSocketAddr, saLocalSocketAddr ) )&&
+ ( sal_True == compareUString( peerHost, saLocalSocketAddr.getHostname( 0 ) ) ) &&
+ ( peerPort == saLocalSocketAddr.getPort( ) ));
+ }
+
+
+ CPPUNIT_TEST_SUITE( getPeer );
+ CPPUNIT_TEST( getPeer_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getPeer
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL bind(const SocketAddr& LocalInterface);
+ */
+
+
+ class bind : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void bind_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ //bind must use local IP address ---mindyliu
+ ::osl::SocketAddr saBindSocketAddr( getLocalIP(), IP_PORT_MYPORT5 );
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "Socket bind fail.", sal_True == bOK1 );
+
+ sal_Bool bOK2 = compareUString( sSocket.getLocalHost( ), saBindSocketAddr.getHostname( ) ) ;
+
+ sSocket.close();
+ CPPUNIT_ASSERT_MESSAGE( "test for bind function: bind a valid address.", sal_True == bOK2 );
+ }
+
+ void bind_002()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_NETBIOS );
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1); // sal_True);
+ sal_Bool bOK1 = sSocket.bind( saBindSocketAddr );
+ sal_Bool bOK2 = compareUString( sSocket.getLocalHost( ), getThisHostname( ) ) ;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for bind function: bind a valid address.",
+ ( sal_False == bOK1 ) && ( sal_False == bOK2 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( bind );
+ CPPUNIT_TEST( bind_001 );
+ CPPUNIT_TEST( bind_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class bind
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL isRecvReady(const TimeValue *pTimeout = 0) const;
+
+ */
+ class isRecvReady : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void isRecvReady_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT1 );
+ ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT1 );
+ ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ /// is receive ready?
+ sal_Bool bOK3 = asAcceptorSocket.isRecvReady( pTimeout );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isRecvReady function: setup a connection and then check if it can transmit data.",
+ ( sal_True == bOK3 ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( isRecvReady );
+ CPPUNIT_TEST( isRecvReady_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class isRecvReady
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL isSendReady(const TimeValue *pTimeout = 0) const;
+ */
+ class isSendReady : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ TimeValue *pTimeout;
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::osl::ConnectorSocket csConnectorSocket;
+
+
+ // initialization
+ void setUp( )
+ {
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ free( pTimeout );
+ sHandle = NULL;
+ asAcceptorSocket.close( );
+ csConnectorSocket.close( );
+ }
+
+
+ void isSendReady_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT );
+ ::osl::SocketAddr saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT );
+ ::osl::SocketAddr saPeerSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// launch client socket
+ csConnectorSocket.connect( saTargetSocketAddr, pTimeout ); /// connecting to server...
+
+ /// is send ready?
+ sal_Bool bOK3 = csConnectorSocket.isSendReady( pTimeout );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isSendReady function: setup a connection and then check if it can transmit data.",
+ ( sal_True == bOK3 ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( isSendReady );
+ CPPUNIT_TEST( isSendReady_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class isSendReady
+
+
+ /** testing the methods:
+ inline oslSocketType SAL_CALL getType() const;
+
+ */
+
+ class getType : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void getType_001()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.",
+ osl_Socket_TypeStream == sSocket.getType( ) );
+ }
+
+ void getType_002()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.",
+ osl_Socket_TypeDgram == sSocket.getType( ) );
+ }
+
+#ifdef UNX
+ // mindy: since on LINUX and SOLARIS, Raw type socket can not be created, so do not test getType() here
+ // mindy: and add one test case to test creating Raw type socket--> ctors_TypeRaw()
+ void getType_003()
+ {
+ CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.this is not passed in (LINUX, SOLARIS), the osl_Socket_TypeRaw, type socket can not be created.",
+ sal_True);
+ }
+#else
+ void getType_003()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeRaw, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getType function: get type of socket.",
+ osl_Socket_TypeRaw == sSocket.getType( ) );
+ }
+#endif
+
+ CPPUNIT_TEST_SUITE( getType );
+ CPPUNIT_TEST( getType_001 );
+ CPPUNIT_TEST( getType_002 );
+ CPPUNIT_TEST( getType_003 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getType
+
+
+
+ /** testing the methods:
+ inline sal_Int32 SAL_CALL getOption(
+ oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen,
+ oslSocketOptionLevel Level= osl_Socket_LevelSocket) const;
+
+ inline sal_Int32 getOption( oslSocketOption option ) const;
+
+ */
+
+ class getOption : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+ /** test writer's comment:
+
+ in oslSocketOption, the osl_Socket_OptionType denote 1 as osl_Socket_TypeStream.
+ 2 as osl_Socket_TypeDgram, etc which is not mapping the oslSocketType enum. differ
+ in 1.
+ */
+
+ void getOption_001()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+ sal_Int32 * pType = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) );
+ *pType = 0;
+ sSocket.getOption( osl_Socket_OptionType, pType, sizeof ( sal_Int32 ) );
+ sal_Bool bOK = ( SOCK_STREAM == *pType );
+ // there is a TypeMap(socket.c) which map osl_Socket_TypeStream to SOCK_STREAM on UNX, and SOCK_STREAM != osl_Socket_TypeStream
+ //sal_Bool bOK = ( TYPE_TO_NATIVE(osl_Socket_TypeStream) == *pType );
+ free( pType );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get type option of socket.",
+ sal_True == bOK );
+ }
+
+ // getsockopt error
+ void getOption_004()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ sal_Bool * pbDontRoute = ( sal_Bool * )malloc( sizeof ( sal_Bool ) );
+ sal_Int32 nRes = sSocket.getOption( osl_Socket_OptionInvalid, pbDontRoute, sizeof ( sal_Bool ) );
+ free( pbDontRoute );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get invalid option of socket, should return -1.",
+ nRes == -1 );
+ }
+
+ void getOption_simple_001()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ sal_Bool bOK = ( sal_False == sSocket.getOption( osl_Socket_OptionDontRoute ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get debug option of socket.",
+ sal_True == bOK );
+ }
+
+ void getOption_simple_002()
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeDgram, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+
+ sal_Bool bOK = ( sal_False == sSocket.getOption( osl_Socket_OptionDebug ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getOption function: get debug option of socket.",
+ sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getOption );
+ CPPUNIT_TEST( getOption_001 );
+ CPPUNIT_TEST( getOption_004 );
+ CPPUNIT_TEST( getOption_simple_001 );
+ CPPUNIT_TEST( getOption_simple_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getOption
+
+
+ /** testing the methods:
+ inline sal_Bool SAL_CALL setOption( oslSocketOption Option,
+ void* pBuffer,
+ sal_uInt32 BufferLen,
+ oslSocketOptionLevel Level= osl_Socket_LevelSocket ) const;
+ */
+
+ class setOption : public CppUnit::TestFixture
+ {
+ public:
+ TimeValue *pTimeout;
+// LLA: maybe there is an error in the source,
+// as long as I remember, if a derived class do not overload all ctors there is a problem.
+
+ ::osl::AcceptorSocket asAcceptorSocket;
+
+ void setUp( )
+ {
+
+ }
+
+ void tearDown( )
+ {
+ asAcceptorSocket.close( );
+ }
+
+
+ // LLA:
+ // getSocketOption returns BufferLen, or -1 if something failed
+
+ // setSocketOption returns sal_True, if option could stored
+ // else sal_False
+
+ void setOption_001()
+ {
+ /// set and get option.
+ int nBufferLen = sizeof ( sal_Int32);
+ // LLA: SO_DONTROUTE expect an integer boolean, what ever it is, it's not sal_Bool!
+
+ sal_Int32 * pbDontRouteSet = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) );
+ *pbDontRouteSet = 1; // sal_True;
+
+ sal_Int32 * pGetBuffer = ( sal_Int32 * )malloc( sizeof ( sal_Int32 ) );
+ *pGetBuffer = 0;
+
+ // maybe asAcceptorSocket is not right initialized
+ sal_Bool b1 = asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontRouteSet, nBufferLen );
+ CPPUNIT_ASSERT_MESSAGE( "setOption function failed.", ( sal_True == b1 ) );
+ sal_Int32 n2 = asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pGetBuffer, nBufferLen );
+ CPPUNIT_ASSERT_MESSAGE( "getOption function failed.", ( n2 == nBufferLen ) );
+
+ // on Linux, the value of option is 1, on Solaris, it's 16, but it's not important the exact value,
+ // just judge it is zero or not!
+ sal_Bool bOK = ( 0 != *pGetBuffer );
+ t_print("#setOption_001: getOption is %d \n", *pGetBuffer);
+
+ // toggle check, set to 0
+ *pbDontRouteSet = 0;
+
+ sal_Bool b3 = asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontRouteSet, sizeof ( sal_Int32 ) );
+ CPPUNIT_ASSERT_MESSAGE( "setOption function failed.", ( sal_True == b3 ) );
+ sal_Int32 n4 = asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pGetBuffer, nBufferLen );
+ CPPUNIT_ASSERT_MESSAGE( "getOption (DONTROUTE) function failed.", ( n4 == nBufferLen ) );
+
+ sal_Bool bOK2 = ( 0 == *pGetBuffer );
+
+ t_print("#setOption_001: getOption is %d \n", *pGetBuffer);
+
+// LLA: sal_Bool * pbDontTouteSet = ( sal_Bool * )malloc( sizeof ( sal_Bool ) );
+// LLA: *pbDontTouteSet = sal_True;
+// LLA: sal_Bool * pbDontTouteGet = ( sal_Bool * )malloc( sizeof ( sal_Bool ) );
+// LLA: *pbDontTouteGet = sal_False;
+// LLA: asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, pbDontTouteSet, sizeof ( sal_Bool ) );
+// LLA: asAcceptorSocket.getOption( osl_Socket_OptionDontRoute, pbDontTouteGet, sizeof ( sal_Bool ) );
+// LLA: ::rtl::OUString suError = outputError(::rtl::OUString::valueOf((sal_Int32)*pbDontTouteGet),
+// LLA: ::rtl::OUString::valueOf((sal_Int32)*pbDontTouteSet),
+// LLA: "test for setOption function: set osl_Socket_OptionDontRoute and then check");
+// LLA:
+// LLA: sal_Bool bOK = ( sal_True == *pbDontTouteGet );
+// LLA: free( pbDontTouteSet );
+// LLA: free( pbDontTouteGet );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.",
+ ( sal_True == bOK ) && (sal_True == bOK2) );
+
+ free( pbDontRouteSet );
+ free( pGetBuffer );
+// LLA: CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+ void setOption_002()
+ {
+ /// set and get option.
+
+ // sal_Int32 * pbLingerSet = ( sal_Int32 * )malloc( nBufferLen );
+ // *pbLingerSet = 7;
+ // sal_Int32 * pbLingerGet = ( sal_Int32 * )malloc( nBufferLen );
+ /* struct */linger aLingerSet;
+ sal_Int32 nBufferLen = sizeof( struct linger );
+ aLingerSet.l_onoff = 1;
+ aLingerSet.l_linger = 7;
+
+ linger aLingerGet;
+
+ asAcceptorSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, nBufferLen );
+
+ sal_Int32 n1 = asAcceptorSocket.getOption( osl_Socket_OptionLinger, &aLingerGet, nBufferLen );
+ CPPUNIT_ASSERT_MESSAGE( "getOption (SO_LINGER) function failed.", ( n1 == nBufferLen ) );
+
+ //t_print("#setOption_002: getOption is %d \n", aLingerGet.l_linger);
+ sal_Bool bOK = ( 7 == aLingerGet.l_linger );
+ CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check. ",
+ sal_True == bOK );
+
+ }
+
+ void setOption_003()
+ {
+ linger aLingerSet;
+ aLingerSet.l_onoff = 1;
+ aLingerSet.l_linger = 7;
+
+ sal_Bool b1 = asAcceptorSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, 0 );
+ printUString( asAcceptorSocket.getErrorAsString( ) );
+ CPPUNIT_ASSERT_MESSAGE( "setOption (SO_LINGER) function failed for optlen is 0.",
+ ( b1 == sal_False ) );
+ }
+
+ void setOption_simple_001()
+ {
+ /// set and get option.
+ asAcceptorSocket.setOption( osl_Socket_OptionDontRoute, 1 ); //sal_True );
+ sal_Bool bOK = ( 0 != asAcceptorSocket.getOption( osl_Socket_OptionDontRoute ) );
+
+ t_print("setOption_simple_001(): getoption is %d \n", asAcceptorSocket.getOption( osl_Socket_OptionDontRoute ) );
+ CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.",
+ ( sal_True == bOK ) );
+ }
+
+ void setOption_simple_002()
+ {
+ /// set and get option.
+ // LLA: this does not work, due to the fact that SO_LINGER is a structure
+// LLA: asAcceptorSocket.setOption( osl_Socket_OptionLinger, 7 );
+// LLA: sal_Bool bOK = ( 7 == asAcceptorSocket.getOption( osl_Socket_OptionLinger ) );
+
+// LLA: CPPUNIT_ASSERT_MESSAGE( "test for setOption function: set option of a socket and then check.",
+// LLA: ( sal_True == bOK ) );
+ }
+
+ CPPUNIT_TEST_SUITE( setOption );
+ CPPUNIT_TEST( setOption_001 );
+ CPPUNIT_TEST( setOption_002 );
+ CPPUNIT_TEST( setOption_003 );
+ CPPUNIT_TEST( setOption_simple_001 );
+// LLA: CPPUNIT_TEST( setOption_simple_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class setOption
+
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL enableNonBlockingMode( sal_Bool bNonBlockingMode);
+ */
+ class enableNonBlockingMode : public CppUnit::TestFixture
+ {
+ public:
+ ::osl::AcceptorSocket asAcceptorSocket;
+
+ void enableNonBlockingMode_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// if reach this statement, it is non-blocking mode, since acceptConnection will blocked by default.
+ sal_Bool bOK = sal_True;
+ asAcceptorSocket.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for enableNonBlockingMode function: launch a server socket and make it non blocking. if it can pass the acceptConnection statement, it is non-blocking",
+ ( sal_True == bOK ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( enableNonBlockingMode );
+ CPPUNIT_TEST( enableNonBlockingMode_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class enableNonBlockingMode
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL isNonBlockingMode() const;
+ */
+ class isNonBlockingMode : public CppUnit::TestFixture
+ {
+ public:
+ ::osl::AcceptorSocket asAcceptorSocket;
+
+ void isNonBlockingMode_001()
+ {
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT );
+ ::osl::StreamSocket ssConnection;
+
+ /// launch server socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); // sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket bind address failed.", sal_True == bOK1 );
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ CPPUNIT_ASSERT_MESSAGE( "AcceptorSocket listen failed.", sal_True == bOK2 );
+
+ sal_Bool bOK3 = asAcceptorSocket.isNonBlockingMode( );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ asAcceptorSocket.acceptConnection(ssConnection); /// waiting for incoming connection...
+
+ /// if reach this statement, it is non-blocking mode, since acceptConnection will blocked by default.
+ sal_Bool bOK4 = asAcceptorSocket.isNonBlockingMode( );
+ asAcceptorSocket.close( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isNonBlockingMode function: launch a server socket and make it non blocking. it is expected to change from blocking mode to non-blocking mode.",
+ ( sal_False == bOK3 ) && ( sal_True == bOK4 ) );
+ }
+
+
+ CPPUNIT_TEST_SUITE( isNonBlockingMode );
+ CPPUNIT_TEST( isNonBlockingMode_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class isNonBlockingMode
+
+ /** testing the method:
+ inline void SAL_CALL clearError() const;
+ */
+ class clearError : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void clearError_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_HTTP2 );
+ ::osl::SocketAddr saLocalSocketAddr;
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sSocket.bind( saBindSocketAddr );//build an error "osl_Socket_E_AddrNotAvail"
+ oslSocketError seBind = sSocket.getError( );
+ sSocket.clearError( );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for clearError function: trick an error called sSocket.getError( ), and then clear the error states, check the result.",
+ osl_Socket_E_None == sSocket.getError( ) && seBind != osl_Socket_E_None );
+ }
+
+
+ CPPUNIT_TEST_SUITE( clearError );
+ CPPUNIT_TEST( clearError_001 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class clearError
+
+
+ /** testing the methods:
+ inline oslSocketError getError() const;
+ inline ::rtl::OUString getErrorAsString( ) const;
+ */
+ class getError : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void getError_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
+ ::osl::SocketAddr saLocalSocketAddr;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getError function: should get no error.",
+ osl_Socket_E_None == sSocket.getError( ) );
+ }
+
+ void getError_002()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::SocketAddr saBindSocketAddr( rtl::OUString::createFromAscii("123.45.67.89"), IP_PORT_FTP );
+ ::osl::SocketAddr saLocalSocketAddr;
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+ sSocket.bind( saBindSocketAddr );//build an error "osl_Socket_E_AddrNotAvail"
+ //on Solaris, the error no is EACCES, but it has no mapped value, so getError() returned osl_Socket_E_InvalidError.
+#if defined(SOLARIS)
+ CPPUNIT_ASSERT_MESSAGE( "trick an error called sSocket.getError( ), check the getError result.Failed on Solaris, returned osl_Socket_E_InvalidError because no entry to map the errno EACCES. ",
+ osl_Socket_E_InvalidError == sSocket.getError( ) );
+#else
+ //while on Linux & Win32, the errno is EADDRNOTAVAIL, getError returned osl_Socket_E_AddrNotAvail.
+
+ CPPUNIT_ASSERT_MESSAGE( "trick an error called sSocket.getError( ), check the getError result.Failed on Solaris, returned osl_Socket_E_InvalidError because no entry to map the errno EACCES. Passed on Linux & Win32",
+ osl_Socket_E_AddrNotAvail == sSocket.getError( ) );
+#endif
+ }
+
+ CPPUNIT_TEST_SUITE( getError );
+ CPPUNIT_TEST( getError_001 );
+ CPPUNIT_TEST( getError_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getError
+
+
+
+ /** testing the methods:
+ inline oslSocket getHandle() const;
+ */
+
+ class getHandle : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+ void getHandle_001()
+ {
+ ::osl::Socket sSocket(sHandle);
+ ::osl::Socket assignSocket = sSocket.getHandle();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment_handle function: test the assignment operator.",
+ osl_Socket_TypeStream == assignSocket.getType( ) );
+ }
+
+ void getHandle_002()
+ {
+ ::osl::Socket sSocket( sHandle );
+ ::osl::Socket assignSocket ( sSocket.getHandle( ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operators_assignment function: assignment operator",
+ osl_Socket_TypeStream == assignSocket.getType( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( getHandle );
+ CPPUNIT_TEST( getHandle_001 );
+ CPPUNIT_TEST( getHandle_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getHandle
+
+
+// -----------------------------------------------------------------------------
+
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::ctors, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::operators, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::close, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalAddr, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalPort, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getLocalHost, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getPeer, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::bind, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isRecvReady, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isSendReady, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getType, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getOption, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::setOption, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::enableNonBlockingMode, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::isNonBlockingMode, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::clearError, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getError, "osl_Socket");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::getHandle, "osl_Socket");
+
+} // namespace osl_Socket
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/socket/osl_Socket2.xsce b/sal/qa/osl/socket/osl_Socket2.xsce
new file mode 100644
index 000000000000..66e3bf1379ec
--- /dev/null
+++ b/sal/qa/osl/socket/osl_Socket2.xsce
@@ -0,0 +1,2 @@
+osl_Socket.ctors.ctors_family_Ipx
+osl_Socket.getLocalHost.getLocalHost_001 wntmsci
diff --git a/sal/qa/osl/socket/osl_SocketAddr.cxx b/sal/qa/osl/socket/osl_SocketAddr.cxx
new file mode 100644
index 000000000000..6c68287ae748
--- /dev/null
+++ b/sal/qa/osl/socket/osl_SocketAddr.cxx
@@ -0,0 +1,895 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/** test coder preface:
+ 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform
+ if you are not including ws2_32.lib in makefile.mk, the including format will be like this:
+
+ .IF "$(GUI)" == "WNT"
+ SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib
+ SHL1STDLIBS += ws2_32.lib
+ .ENDIF
+
+ likewise on Solaris platform.
+ .IF "$(GUI)" == "UNX"
+ SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+ SHL1STDLIBS += -lsocket -ldl -lnsl
+ .ENDIF
+
+ 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4
+ category.
+
+ 3. some fragment of Socket source implementation are lack of comment so it is hard for testers
+ guess what the exact functionality or usage of a member. Hope the Socket section's comment
+ will be added.
+
+ 4. following functions are declared but not implemented:
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
+ */
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+
+#include <testshl/simpleheader.hxx>
+
+//#include "osl_Socket_Const.h"
+#include "sockethelper.hxx"
+
+using namespace osl;
+using namespace rtl;
+
+#define IP_PORT_ZERO 0
+#define IP_PORT_FTP 21
+#define IP_PORT_TELNET 23
+#define IP_PORT_HTTP1 80
+#define IP_PORT_HTTP2 8080
+
+#define IP_PORT_MYPORT 8881 //8888
+#define IP_PORT_MYPORT2 8883 //8890
+#define IP_PORT_MYPORT3 8884 //8891
+#define IP_PORT_INVAL 99999
+#define IP_PORT_MYPORT4 8885 //8892
+#define IP_PORT_NETBIOS_DGM 138
+
+
+namespace osl_SocketAddr
+{
+
+ /** testing the methods:
+ inline SocketAddr();
+ inline SocketAddr(const SocketAddr& Addr);
+ inline SocketAddr(const oslSocketAddr , __osl_socket_NoCopy nocopy );
+ inline SocketAddr(oslSocketAddr Addr);
+ inline SocketAddr( const ::rtl::OUString& strAddrOrHostName, sal_Int32 nPort );
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+
+ void ctors_none()
+ {
+ /// SocketAddr constructor.
+ ::osl::SocketAddr saSocketAddr;
+
+ // oslSocketResult aResult;
+ // rtl::OUString suHost = saSocketAddr.getLocalHostname( &aResult);
+
+ // rtl::OUString suHost2 = getThisHostname();
+
+ CPPUNIT_ASSERT_MESSAGE("test for none parameter constructor function: check if the socket address was created successfully",
+ sal_True == saSocketAddr.is( ) );
+ }
+
+ void ctors_none_000()
+ {
+ /// SocketAddr constructor.
+ ::osl::SocketAddr saSocketAddr;
+
+ oslSocketResult aResult;
+ rtl::OUString suHost = saSocketAddr.getLocalHostname( &aResult);
+ rtl::OUString suHost2 = getThisHostname();
+
+ sal_Bool bOk = compareUString(suHost, suHost2);
+
+ rtl::OUString suError = rtl::OUString::createFromAscii("Host names should be the same. From SocketAddr.getLocalHostname() it is'");
+ suError += suHost;
+ suError += rtl::OUString::createFromAscii("', from getThisHostname() it is '");
+ suError += suHost2;
+ suError += rtl::OUString::createFromAscii("'.");
+
+ CPPUNIT_ASSERT_MESSAGE(suError, sal_True == bOk);
+ }
+
+ void ctors_copy()
+ {
+ /// SocketAddr copy constructor.
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
+ ::osl::SocketAddr saCopySocketAddr( saSocketAddr );
+
+ sal_Int32 nPort = saCopySocketAddr.getPort( );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy constructor function: copy constructor, do an action of copy construction then check the port with original set.",
+ ( sal_True == saCopySocketAddr.is( ) ) && ( nPort == IP_PORT_HTTP1 ) );
+ }
+
+ void ctors_copy_no_001()
+ {
+#if 0
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
+ oslSocketAddr psaOSLSocketAddr = saSocketAddr.getHandle( );
+
+ ::osl::SocketAddr saSocketAddrCopy( psaOSLSocketAddr, SAL_NO_COPY );
+ saSocketAddrCopy.setPort( IP_PORT_HTTP2 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ saSocketAddr.getPort( ) == IP_PORT_HTTP2 );
+#endif
+ ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
+ CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
+
+ oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
+
+ ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
+
+ pSocketAddrCopy->setPort( IP_PORT_HTTP2 );
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ pSocketAddr->getPort( ) == IP_PORT_HTTP2 );
+
+ delete pSocketAddrCopy;
+ // LLA: don't do this also: delete pSocketAddr;
+ }
+
+ void ctors_copy_no_002()
+ {
+ ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
+ CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
+ oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
+ ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ pSocketAddr->getHandle( ) == pSocketAddrCopy->getHandle( ) );
+
+ delete pSocketAddrCopy;
+ }
+
+ void ctors_copy_handle_001()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
+ ::osl::SocketAddr saSocketAddrCopy( saSocketAddr.getHandle( ) );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy handle constructor function: copy another Socket's handle, get its port to check copy effect.",
+ saSocketAddrCopy.getPort( ) == IP_PORT_HTTP1 );
+ }
+
+ void ctors_copy_handle_002()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
+ ::osl::SocketAddr saSocketAddrCopy( saSocketAddr.getHandle( ) );
+ saSocketAddrCopy.setPort( IP_PORT_HTTP2 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr copy handle constructor function: copy another Socket's handle, the original one should not be changed.",
+ saSocketAddr.getPort( ) != IP_PORT_HTTP2 );
+ }
+
+ void ctors_hostname_port_001()
+ {
+ /// tcpip-specif constructor.
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
+ printUString( saSocketAddr.getHostname( ), "ctors_hostname_port_001:getHostname");
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr tcpip specif constructor function: do a constructor using tcpip spec, check the result.",
+ saSocketAddr.is( ) == sal_True &&
+ ( saSocketAddr.getPort( ) == IP_PORT_FTP )/*&&
+ ( sal_True == compareUString( saSocketAddr.getHostname( ), aHostName1 ) ) */);
+ }
+
+ //same as is_002
+ void ctors_hostname_port_002()
+ {
+ /// tcpip-specif constructor.
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT2 );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr tcpip specif constructor function: using an invalid IP address, the socketaddr ctors should fail", sal_False == saSocketAddr.is( ));
+ }
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_none_000 );
+ CPPUNIT_TEST( ctors_copy );
+ CPPUNIT_TEST( ctors_copy_no_001 );
+ CPPUNIT_TEST( ctors_copy_no_002 );
+ CPPUNIT_TEST( ctors_copy_handle_001 );
+ CPPUNIT_TEST( ctors_copy_handle_002 );
+ CPPUNIT_TEST( ctors_hostname_port_001 );
+ CPPUNIT_TEST( ctors_hostname_port_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+
+ /** testing the method:
+ inline sal_Bool is() const;
+ */
+
+ class is : public CppUnit::TestFixture
+ {
+ public:
+ void is_001()
+ {
+ ::osl::SocketAddr saSocketAddr;
+
+ CPPUNIT_ASSERT_MESSAGE("test for is() function: create an unknown type socket, it should be True when call is.",
+ sal_True == saSocketAddr.is( ) );
+ }
+ // refer to setPort_003()
+ void is_002()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_INVAL );
+
+ CPPUNIT_ASSERT_MESSAGE("test for is() function: create a tcp-ip socket using invalid port number",
+ sal_True == saSocketAddr.is( ) );
+ }
+
+ void is_003()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_MYPORT );
+
+ CPPUNIT_ASSERT_MESSAGE("test for is() function: create a tcp-ip socket using invalid Ip number",
+ sal_True != saSocketAddr.is( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( is );
+ CPPUNIT_TEST( is_001 );
+ CPPUNIT_TEST( is_002 );
+ CPPUNIT_TEST( is_003 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class is
+
+
+ /** testing the method:
+ inline ::rtl::OUString SAL_CALL getHostname( oslSocketResult *pResult = 0 ) const;
+ */
+
+ class getHostname : public CppUnit::TestFixture
+ {
+ public:
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void getHostname_000()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.107"), IP_PORT_FTP );
+ rtl::OUString suResult = saSocketAddr.getHostname( 0 );
+
+ }
+
+ /** it will search the Ip in current machine's /etc/hosts at first, if find, then return the
+ mapped hostname, otherwise, it will search via DNS server, and often return hostname+ Domain name
+ like "sceri.PRC.Sun.COM"
+ The process is same as Socket::getLocalHost(), but getLocalHost can only return hostname of the current machine.
+ */
+ void getHostname_001()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.107"), IP_PORT_FTP );
+ rtl::OUString suResult = saSocketAddr.getHostname( 0 );
+ rtl::OUString suError = outputError(suResult, rtl::OUString::createFromAscii("sceri.PRC.Sun.COM"), "test for getHostname(0)");
+ sal_Bool bOK = compareUString( suResult, rtl::OUString::createFromAscii("sceri.PRC.Sun.COM") );
+ // search the returned hostname in /etc/hosts, if find, and the IP in the row is same as IP
+ // in the Addr, it's right also.
+ if ( bOK == sal_False)
+ {
+ rtl::OString aString = ::rtl::OUStringToOString( suResult, RTL_TEXTENCODING_ASCII_US );
+ if ( compareUString( getIPbyName( aString ), rtl::OUString::createFromAscii("129.158.217.107") ) == sal_True )
+ bOK = sal_True;
+ }
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK);
+ }
+
+// LLA: now we have to control, if this behaviour is right.
+// LLA: this function does not work in company (Linux, Windows) but at home
+ void getHostname_002()
+ {
+ rtl::OUString suHostname = rtl::OUString::createFromAscii("cn-1.germany.sun.com");
+ rtl::OString aString = ::rtl::OUStringToOString( suHostname, RTL_TEXTENCODING_ASCII_US );
+ rtl::OUString aHostIP = getIPbyName( aString );
+
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_FTP );
+ sal_Bool bOK = saSocketAddr.setHostname( suHostname );
+ CPPUNIT_ASSERT_MESSAGE("#SocketAddr.setHostname failed", sal_True == bOK );
+ oslSocketResult aResult;
+ rtl::OUString suResult = saSocketAddr.getHostname( &aResult );
+ CPPUNIT_ASSERT_MESSAGE("SocketAddr.getHostname failed.", aResult == osl_Socket_Ok);
+
+ rtl::OUString suError = outputError(suResult, suHostname, "test for getHostname(0)");
+ bOK = compareUString( suResult, suHostname );
+ if ( bOK == sal_False)
+ {
+ rtl::OString aStringResult = ::rtl::OUStringToOString( suResult, RTL_TEXTENCODING_ASCII_US );
+ rtl::OString aStringHostname = ::rtl::OUStringToOString( suHostname, RTL_TEXTENCODING_ASCII_US );
+ if ( compareUString( getIPbyName( aStringResult ) , getIPbyName( aStringHostname ) ) == sal_True )
+ {
+ bOK = sal_True;
+ }
+ }
+
+ CPPUNIT_ASSERT_MESSAGE( suError, sal_True == bOK );
+ }
+
+
+ CPPUNIT_TEST_SUITE( getHostname );
+ CPPUNIT_TEST( getHostname_001 );
+ CPPUNIT_TEST( getHostname_002 );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class getHostname
+
+
+ /** testing the method:
+ inline sal_Int32 SAL_CALL getPort() const;
+ */
+
+ class getPort : public CppUnit::TestFixture
+ {
+ public:
+ void getPort_001()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPort() function: get a normal port number.",
+ IP_PORT_FTP == saSocketAddr.getPort( ) );
+ }
+
+ void getPort_002()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_INVAL );
+
+ //t_print("#getPort_002: Port number is %d \n", saSocketAddr.getPort( ));
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPort( ) function: give an invalid port to a SocketAddr, get the port to see if it can detect. it did not pass in (W32).",
+ saSocketAddr.getPort( )>=1 && saSocketAddr.getPort( ) <= 65535 );
+ }
+ //two cases will return OSL_INVALID_PORT: 1. not valid SocketAddr
+ //2. SocketAddr family is not osl_Socket_FamilyInet, but case 2 could not be constructed
+ void getPort_003()
+ {
+ rtl::OUString suInvalidIP = rtl::OUString::createFromAscii("123.345.67.89");
+ ::osl::SocketAddr saSocketAddr( suInvalidIP, IP_PORT_MYPORT );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getPort( ) function: give an invalid IP to a SocketAddr, get the port to see returned value. ",
+ saSocketAddr.getPort( ) == OSL_INVALID_PORT );
+ }
+
+ CPPUNIT_TEST_SUITE( getPort );
+ CPPUNIT_TEST( getPort_001 );
+ CPPUNIT_TEST( getPort_002 );
+ CPPUNIT_TEST( getPort_003 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getPort
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL setPort( sal_Int32 nPort );
+ rfc1413.txt: TCP port numbers are from 1-65535
+ rfc1700.txt: 0/tcp Reserved ; 0/udp Reserved
+ */
+
+ class setPort : public CppUnit::TestFixture
+ {
+ public:
+ void setPort_001()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
+ sal_Bool bOK = saSocketAddr.setPort( IP_PORT_TELNET );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPort() function: modify a port number setting, and check it.",
+ ( sal_True == bOK ) &&
+ ( IP_PORT_TELNET == saSocketAddr.getPort( ) ) );
+ }
+
+ /** 0 to 1024 is known as the reserved port range (traditionally only root can assign programs to ports in
+ this range) and the ephemeral port range from 1025 to 65535.
+ As many of you programmers will know, when you specify the source port of 0 when you connect to a host,
+ the OS automatically reassigns the port number to high numbered ephemeral port. The same happens if you
+ try to bind a listening socket to port 0.
+ http://www.securiteam.com/securityreviews/5XP0Q2AAKS.html
+ another: http://www.muq.org/~cynbe/muq/mufref_564.html
+ */
+ void setPort_002()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
+ sal_Bool bOK = saSocketAddr.setPort( IP_PORT_ZERO );
+
+ oslSocket sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ ::osl::Socket sSocket(sHandle);
+ sSocket.setOption( osl_Socket_OptionReuseAddr, 1 );//sal_True);
+ sal_Bool bOK1 = sSocket.bind( saSocketAddr );
+ CPPUNIT_ASSERT_MESSAGE( "bind SocketAddr failed", bOK1 == sal_True );
+
+ sal_Int32 newPort = sSocket.getLocalPort();
+ //t_print("#new port is %d\n", newPort );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPort() function: port number should be in 1 ~ 65535, set port 0, it should be converted to a port number between 1024~65535.",
+ ( 1024 <= newPort ) && ( 65535 >= newPort ) && ( bOK == sal_True ) );
+
+ }
+
+ void setPort_003()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP);
+ sal_Bool bOK = saSocketAddr.setPort( IP_PORT_INVAL );
+ //on Linux, getPort return 34463
+ //t_print("#Port number is %d \n", saSocketAddr.getPort( ));
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPort( ) function: set an address with invalid port. it should return error or convert it to a valid port.",
+ ( ( 1 <= saSocketAddr.getPort( ) ) && ( 65535 >= saSocketAddr.getPort( ) ) &&( bOK == sal_True ) ) ||
+ bOK == sal_False);
+ }
+
+ /* this is not a inet-addr => can't set port */
+ void setPort_004()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("123.345.67.89"), IP_PORT_FTP);
+ sal_Bool bOK = saSocketAddr.setPort( IP_PORT_MYPORT );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setPort( ) function: set an invalid address with valid port. it should return error.",
+ bOK == sal_False);
+ }
+
+
+ CPPUNIT_TEST_SUITE( setPort );
+ CPPUNIT_TEST( setPort_001 );
+ CPPUNIT_TEST( setPort_002 );
+ CPPUNIT_TEST( setPort_003 );
+ CPPUNIT_TEST( setPort_004 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class setPort
+
+
+ /** tester comment:
+
+ In the following two functions, it use ::rtl::ByteSequence as an intermediate storage for address,
+ the ByteSequence object can hold sal_Int8 arrays, which is raged [-127, 127], in case of IP addr
+ that is greater than 127, say 129.158.217.202, it will stored as -127, -98, -39, -54, it is unique
+ in the range of sal_Int8, but lack of readability.
+ so may be a sal_uInt8 array is better.
+ */
+
+
+ /** testing the method:
+ inline sal_Bool SAL_CALL setAddr( const ::rtl::ByteSequence & address );
+ */
+
+ class setAddr : public CppUnit::TestFixture
+ {
+ public:
+ void setAddr_001()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+ saSocketAddr.setAddr( UStringIPToByteSequence( rtl::OUString::createFromAscii("127.0.0.1") ) );
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( 0 );
+ sal_Bool bOK = sal_False;
+
+ // if ( ( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) && ( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ // bOK = sal_True;
+ bOK = ifIpv4is( bsSocketAddr, 127, 0, 0, 1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for setAddr() function: construct Addr with \"129.158.217.202\", set it to \"127.0.0.1\", and check the correctness ",
+ sal_True == bOK );
+ }
+
+
+ CPPUNIT_TEST_SUITE( setAddr );
+ CPPUNIT_TEST( setAddr_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class setAddr
+
+
+ /** testing the method:
+ inline ::rtl::ByteSequence SAL_CALL getAddr( oslSocketResult *pResult = 0 ) const;
+ */
+
+ class getAddr : public CppUnit::TestFixture
+ {
+ public:
+ void getAddr_001()
+ {
+ oslSocketResult SocketResult;
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_FTP );
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( &SocketResult );
+
+ sal_Bool bOK = sal_False;
+
+ //if ( ( osl_Socket_Ok == SocketResult ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ // bOK = sal_True;
+ bOK = ifIpv4is( bsSocketAddr, 127, 0, 0, 1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getAddr() function: construct a socketaddr with IP assigned, get the address to check correctness.Caught unknown exception on (Win32)",
+ sal_True == bOK && SocketResult == osl_Socket_Ok);
+ }
+
+ CPPUNIT_TEST_SUITE( getAddr );
+ CPPUNIT_TEST( getAddr_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getAddr
+
+
+ /** testing the methods:
+ inline SocketAddr & SAL_CALL operator= (oslSocketAddr Addr);
+ inline SocketAddr & SAL_CALL operator= (const SocketAddr& Addr);
+ inline SocketAddr & SAL_CALL assign( oslSocketAddr Addr, __osl_socket_NoCopy nocopy );
+ inline sal_Bool SAL_CALL operator== (oslSocketAddr Addr) const;
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const; /// not implemented.
+ */
+
+ class operator_equal : public CppUnit::TestFixture
+ {
+ public:
+ void operator_equal_001()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrEqual( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+
+ saSocketAddrEqual = saSocketAddr;
+ sal_Bool bOK = sal_False;
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddrEqual.getAddr( 0 );
+
+ // if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) && ( ifIpv4is( bsSocketAddr, 127, 0, 0, 1 ) == sal_True ) )
+ bOK = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal() function: use operator= to assign Ip1 to Ip2, check its modification.",
+ sal_True == bOK );
+ }
+
+
+ void operator_equal_002()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.199"), IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrEqual( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+
+ saSocketAddrEqual = saSocketAddr;
+ CPPUNIT_ASSERT_MESSAGE( "after assign, the assigned SocketAddr is not same as the original Addr",
+ IP_PORT_TELNET == saSocketAddrEqual.getPort( ) );
+ saSocketAddrEqual.setPort( IP_PORT_MYPORT3 );
+ saSocketAddr.setPort( IP_PORT_HTTP2 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal() function: perform an equal action, then try to change the original address's port. it should not be changed ( handle released), it did not pass in (W32), this is under discussion.",
+ IP_PORT_MYPORT3 == saSocketAddrEqual.getPort( ) );
+ }
+
+ void operator_equal_const_001()
+ {
+ const ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrEqual( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+
+ saSocketAddrEqual = saSocketAddr;
+ sal_Bool bOK = sal_False;
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddrEqual.getAddr( 0 );
+
+ // if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) &&( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ if ( ( IP_PORT_TELNET == saSocketAddrEqual.getPort( ) ) && ifIpv4is( bsSocketAddr, 127, 0, 0, 1 ) == sal_True )
+ bOK = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_const() function: use operator= const to assign Ip1 to Ip2, verify the change on the second one.",
+ sal_True == bOK );
+ }
+
+ void operator_equal_const_002()
+ {
+ const ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrEqual( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+
+ saSocketAddrEqual = saSocketAddr;
+ saSocketAddrEqual.setPort( IP_PORT_HTTP1 );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_const() function: change the second instance, the first one should not be altered, since it does not released the handle.",
+ IP_PORT_HTTP1 != saSocketAddr.getPort( ) );
+ }
+
+ void operator_equal_assign_001()
+ {
+ ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET );
+ CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
+ ::osl::SocketAddr* pSocketAddrAssign = new ::osl::SocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP );
+ oslSocketAddr poslSocketAddr = pSocketAddr->getHandle( );
+ //if( m_handle ) osl_destroySocketAddr( m_handle ); so pSocketAddrAssign had been destroyed and then point to pSocketAddr
+ pSocketAddrAssign->assign(poslSocketAddr, SAL_NO_COPY);
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ pSocketAddrAssign->getPort( ) == IP_PORT_TELNET );
+
+ delete pSocketAddrAssign;
+ }
+
+ void operator_is_equal_001()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET);
+ ::osl::SocketAddr saSocketAddrequal( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_equal() function: check two identical Address.",
+ sal_True == ( saSocketAddrequal == saSocketAddr.getHandle( ) ) );
+ }
+
+ void operator_is_equal_002()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("129.158.217.202"), IP_PORT_FTP);
+ ::osl::SocketAddr saSocketAddrequal( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_TELNET );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for operator_equal_equal() function: check two different Address.",
+ sal_False == ( saSocketAddrequal == saSocketAddr.getHandle( ) ) );
+ }
+
+ CPPUNIT_TEST_SUITE( operator_equal );
+ CPPUNIT_TEST( operator_equal_001 );
+ CPPUNIT_TEST( operator_equal_002 );
+ CPPUNIT_TEST( operator_equal_const_001 );
+ CPPUNIT_TEST( operator_equal_const_002 );
+ CPPUNIT_TEST( operator_equal_assign_001 );
+ CPPUNIT_TEST( operator_is_equal_001 );
+ CPPUNIT_TEST( operator_is_equal_002 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class operator_equal
+
+
+
+ /** testing the method:
+ inline oslSocketAddr SAL_CALL getHandle() const;
+ */
+
+ class getSocketAddrHandle : public CppUnit::TestFixture
+ {
+ public:
+
+ void getSocketAddrHandle_001()
+ {
+ ::osl::SocketAddr* pSocketAddr = new ::osl::SocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
+ CPPUNIT_ASSERT_MESSAGE("check for new SocketAddr", pSocketAddr != NULL);
+ oslSocketAddr psaOSLSocketAddr = pSocketAddr->getHandle( );
+ ::osl::SocketAddr* pSocketAddrCopy = new ::osl::SocketAddr( psaOSLSocketAddr, SAL_NO_COPY );
+
+ CPPUNIT_ASSERT_MESSAGE("test for SocketAddr no copy constructor function: do a no copy constructor on a given SocketAddr instance, modify the new instance's port, check the original one.",
+ pSocketAddr->getHandle( ) == pSocketAddrCopy->getHandle( ) );
+
+ delete pSocketAddrCopy;
+ }
+
+ void getSocketAddrHandle_002()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("deuce.PRC.Sun.COM"), IP_PORT_MYPORT4 );
+ oslSocketAddr poslSocketAddr = saSocketAddr.getHandle( );
+
+ sal_Bool bOK = ( saSocketAddr == poslSocketAddr );
+ //t_print("getSocketAddrHandle_002\n");
+ CPPUNIT_ASSERT_MESSAGE( "test for getHandle() function: use getHandle() function as an intermediate way to create identical address.",
+ sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( getSocketAddrHandle );
+ CPPUNIT_TEST( getSocketAddrHandle_001 );
+ CPPUNIT_TEST( getSocketAddrHandle_002 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getSocketAddrHandle
+
+
+ /** testing the method:
+ static inline ::rtl::OUString SAL_CALL getLocalHostname( oslSocketResult *pResult = 0);
+ */
+
+ class getLocalHostname : public CppUnit::TestFixture
+ {
+ public:
+ /* the process of getLocalHostname: 1.gethostname (same as /bin/hostname) returned name A
+ 2. search A in /etc/hosts, if there is an alias name is A, return the name in the same row
+ */
+
+ void getLocalHostname_000()
+ {
+ // _osl_getFullQualifiedDomainName( );
+ oslSocketResult aResult = osl_Socket_Error;
+ rtl::OUString suHostname = osl::SocketAddr::getLocalHostname(&aResult);
+ CPPUNIT_ASSERT_MESSAGE("getLocalHostname failed", aResult == osl_Socket_Ok);
+ }
+
+ void getLocalHostname_001()
+ {
+ oslSocketResult *pResult = NULL;
+ //printSocketResult(*pResult);
+ ::rtl::OUString suResult = ::osl::SocketAddr::getLocalHostname( pResult );
+
+ // LLA: IMHO localhost, or hostname by itself should be ok.
+ rtl::OUString suThisHost = getThisHostname( );
+ bool bOk = false;
+ if (suThisHost.equals(rtl::OUString::createFromAscii("localhost")))
+ {
+ bOk = true;
+ }
+ else
+ {
+ if (suThisHost.equals(suResult))
+ {
+ bOk = true;
+ }
+ }
+
+ ::rtl::OUString suError;
+ suError = outputError(suResult, getThisHostname( ), "test for getLocalHostname() function");
+
+ CPPUNIT_ASSERT_MESSAGE( suError, bOk == true );
+ }
+
+ CPPUNIT_TEST_SUITE( getLocalHostname );
+ CPPUNIT_TEST( getLocalHostname_000 );
+ CPPUNIT_TEST( getLocalHostname_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getLocalHostname
+
+
+ /** testing the method:
+ static inline void SAL_CALL resolveHostname( const ::rtl::OUString & strHostName , SocketAddr & Addr );
+ */
+
+ class resolveHostname : public CppUnit::TestFixture
+ {
+ public:
+ void resolveHostname_001()
+ {
+ ::osl::SocketAddr saSocketAddr;
+ ::osl::SocketAddr::resolveHostname( rtl::OUString::createFromAscii("127.0.0.1"), saSocketAddr );
+ ::rtl::ByteSequence bsSocketAddr = saSocketAddr.getAddr( 0 );
+ sal_Bool bOK = sal_False;
+
+ if ( ( bsSocketAddr[0] == 127 ) && ( bsSocketAddr[1] == 0 ) &&( bsSocketAddr[2] == 0 ) && ( bsSocketAddr[3] == 1 ) )
+ bOK = sal_True;
+
+ CPPUNIT_ASSERT_MESSAGE( "test for resolveHostname() function: try to resolve localhost to 127.0.0.1.",
+ sal_True == bOK );
+ }
+
+ CPPUNIT_TEST_SUITE( resolveHostname );
+ CPPUNIT_TEST( resolveHostname_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class resolveHostname
+
+
+ /** testing the method:
+ static inline sal_Int32 SAL_CALL getServicePort(
+ const ::rtl::OUString& strServiceName,
+ const ::rtl::OUString & strProtocolName= ::rtl::OUString::createFromAscii( "tcp" ) );
+ */
+
+ class gettheServicePort : public CppUnit::TestFixture
+ {
+ public:
+ void gettheServicePort_001()
+ {
+ rtl::OUString suServiceFTP = rtl::OUString::createFromAscii( "ftp" );
+ rtl::OUString suProtocolTCP = rtl::OUString::createFromAscii( "tcp" );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get ftp service port on TCP protocol.",
+ IP_PORT_FTP== ::osl::SocketAddr::getServicePort( suServiceFTP, suProtocolTCP ) );
+ }
+
+ void gettheServicePort_002()
+ {
+ rtl::OUString suServiceTELNET = rtl::OUString::createFromAscii( "telnet" );
+ rtl::OUString suProtocolTCP = rtl::OUString::createFromAscii( "tcp" );
+ CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get telnet service port on TCP protocol.",
+ IP_PORT_TELNET== ::osl::SocketAddr::getServicePort( suServiceTELNET, suProtocolTCP ) );
+ }
+
+ void gettheServicePort_003()
+ {
+ //Solaris has no service called "https", please see /etc/services
+ rtl::OUString suServiceNETBIOS = rtl::OUString::createFromAscii( "netbios-dgm" );
+ rtl::OUString suProtocolUDP = rtl::OUString::createFromAscii( "udp" );
+ CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get netbios-ssn service port on UDP protocol.",
+ IP_PORT_NETBIOS_DGM == ::osl::SocketAddr::getServicePort( suServiceNETBIOS, suProtocolUDP ) );
+ }
+
+ void gettheServicePort_004()
+ {
+ rtl::OUString suProtocolUDP = rtl::OUString::createFromAscii( "udp" );
+ CPPUNIT_ASSERT_MESSAGE( "test for getServicePort() function: try to get a service port which is not exist.",
+ OSL_INVALID_PORT == ::osl::SocketAddr::getServicePort( ::rtl::OUString::createFromAscii( "notexist" ), suProtocolUDP ) );
+ }
+
+ CPPUNIT_TEST_SUITE( gettheServicePort );
+ CPPUNIT_TEST( gettheServicePort_001 );
+ CPPUNIT_TEST( gettheServicePort_002 );
+ CPPUNIT_TEST( gettheServicePort_003 );
+ CPPUNIT_TEST( gettheServicePort_004 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class gettheServicePort
+
+ /** testing the method:
+
+ */
+
+ class getFamilyOfSocketAddr : public CppUnit::TestFixture
+ {
+ public:
+ void getFamilyOfSocketAddr_001()
+ {
+ ::osl::SocketAddr saSocketAddr( rtl::OUString::createFromAscii("localhost"), IP_PORT_HTTP1 );
+ oslSocketAddr psaOSLSocketAddr = saSocketAddr.getHandle( );
+ CPPUNIT_ASSERT_EQUAL(
+ osl_Socket_FamilyInet,
+ osl_getFamilyOfSocketAddr( psaOSLSocketAddr ) );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for osl_getFamilyOfSocketAddr.",
+ osl_getFamilyOfSocketAddr( psaOSLSocketAddr ) == osl_Socket_FamilyInet );
+ }
+
+ CPPUNIT_TEST_SUITE( getFamilyOfSocketAddr );
+ CPPUNIT_TEST( getFamilyOfSocketAddr_001 );
+ CPPUNIT_TEST_SUITE_END( );
+
+ }; // class getFamilyOfSocketAddr
+
+// -----------------------------------------------------------------------------
+
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::ctors, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::is, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getHostname, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getPort, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::setPort, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::setAddr, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getAddr, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::operator_equal, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getSocketAddrHandle, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getLocalHostname, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::resolveHostname, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::gettheServicePort, "osl_SocketAddr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_SocketAddr::getFamilyOfSocketAddr, "osl_SocketAddr");
+
+} // namespace osl_SocketAddr
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/socket/osl_SocketAddr.xsce b/sal/qa/osl/socket/osl_SocketAddr.xsce
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/sal/qa/osl/socket/osl_SocketAddr.xsce
diff --git a/sal/qa/osl/socket/osl_SocketOld.xsce b/sal/qa/osl/socket/osl_SocketOld.xsce
new file mode 100644
index 000000000000..3f8120fc6943
--- /dev/null
+++ b/sal/qa/osl/socket/osl_SocketOld.xsce
@@ -0,0 +1,14 @@
+osl_Socket.ctors.ctors_family_Ipx
+osl_SocketAddr.getHostname.getHostname_002
+osl_StreamSocket.send_recv.write_read_001
+
+osl_ConnectorSocket.connect.connect_003 wntmsci
+osl_Socket.getLocalHost.getLocalHost_001 wntmsci
+
+# hangs within solaris
+osl_StreamSocket.send_recv.write_read_002 unxsols
+osl_StreamSocket.send_recv.write_read_003 unxsols
+osl_StreamSocket.send_recv.write_read_004 unxsols
+
+# hangs within solaris
+osl_StreamSocket.send_recv.send_recv1 unxsols
diff --git a/sal/qa/osl/socket/osl_Socket_Const.h b/sal/qa/osl/socket/osl_Socket_Const.h
new file mode 100755
index 000000000000..554b188fa1ad
--- /dev/null
+++ b/sal/qa/osl/socket/osl_Socket_Const.h
@@ -0,0 +1,196 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _OSL_SOCKET_CONST_H_
+#define _OSL_SOCKET_CONST_H_
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+#include <sal/types.h>
+#include <rtl/textenc.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustring.h>
+
+#ifndef _OSL_SOCLET_HXX_
+#include <osl/socket.hxx>
+#endif
+#include <osl/socket.h>
+
+#ifndef _OSL_THREAD_HXX
+#include <osl/thread.hxx>
+#endif
+
+#ifndef _OSL_FILE_HXX
+#include <osl/file.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX
+#include <osl/mutex.hxx>
+#endif
+#include <osl/time.h>
+
+const char * pTestString1 = "test socket";
+const char * pTestString2 = " Passed#OK";
+//define read count
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+# include <stdio.h>
+//------------------------------------------------------------------------
+// OS dependent declaration and includes
+//------------------------------------------------------------------------
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+# include <unistd.h>
+# include <limits.h>
+# include <string.h>
+# include <math.h>
+# include <errno.h>
+# include <fcntl.h>
+# include <sys/stat.h>
+# include <sys/statfs.h>
+# include <sys/statvfs.h>
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netdb.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+#endif
+#if ( defined WNT ) // Windows
+#include <tools/prewin.h>
+// # include <windows.h>
+# include <winsock.h>
+# include <string.h>
+#include <tools/postwin.h>
+#endif
+
+
+//------------------------------------------------------------------------
+// macro definition for the ASCII array/OUString declarations,
+// we use p### for the ASCII array,
+// a### for the OUString,
+// n###Len for its length
+//------------------------------------------------------------------------
+
+#define OSLTEST_DECLARE( str_name, str_value ) \
+ static const sal_Char p##str_name[] = str_value; \
+ static const sal_Int32 n##str_name##Len = sizeof( p##str_name ) -1; \
+ ::rtl::OUString a##str_name = rtl::OUString::createFromAscii( p##str_name )
+
+
+//------------------------------------------------------------------------
+// Ip version definition
+//------------------------------------------------------------------------
+#define IP_VER 4 /// currently only IPv4 is considered.
+
+//------------------------------------------------------------------------
+// Ip port definition
+//------------------------------------------------------------------------
+// #define IP_PORT_ZERO 0
+// #define IP_PORT_TELNET 23
+// #define IP_PORT_SMTP 25
+// #define IP_PORT_GOPHER 70
+// #define IP_PORT_POP3 110
+// #define IP_PORT_NETBIOS_DGM 138
+// #define IP_PORT_NETBIOS 139
+// #define IP_PORT_IMAP 143
+// #define IP_PORT_HTTPS 443
+// /**reference: http://www.iana.org/assignments/port-numbers */
+// #define IP_PORT_MYPORT 8881 //8888
+// #define IP_PORT_MYPORT1 8882 //8889
+// #define IP_PORT_MYPORT3 8884 //8891
+// #define IP_PORT_MYPORT4 8885 //8892
+// #define IP_PORT_MYPORT5 8886 //8893
+// #define IP_PORT_MYPORT6 8887 //8894
+// #define IP_PORT_MYPORT7 8895
+// #define IP_PORT_MYPORT8 8896
+// #define IP_PORT_MYPORT9 8897
+// #define IP_PORT_MYPORT10 8898
+//
+// #define IP_PORT_TMP 9999
+// #define IP_PORT_INVAL 99999
+
+//------------------------------------------------------------------------
+// service definitions.
+//------------------------------------------------------------------------
+// OSLTEST_DECLARE( ServiceFTP, "ftp" );
+// OSLTEST_DECLARE( ServiceTELNET, "telnet" );
+// OSLTEST_DECLARE( ServiceGOPHER, "gopher" );
+// OSLTEST_DECLARE( ServiceIMAP, "imap" );
+// OSLTEST_DECLARE( ServiceHTTPS, "https" );
+// OSLTEST_DECLARE( ServiceNETBIOS, "netbios-dgm" );
+
+//------------------------------------------------------------------------
+// protocol definitions.
+//------------------------------------------------------------------------
+// OSLTEST_DECLARE( ProtocolTCP, "tcp" );
+// OSLTEST_DECLARE( ProtocolUDP, "udp" );
+
+//------------------------------------------------------------------------
+// Hostnames.
+//------------------------------------------------------------------------
+// OSLTEST_DECLARE( HostName1, "localhost" );
+// OSLTEST_DECLARE( HostIp1, "127.0.0.1" );
+OSLTEST_DECLARE( HostName2, "longshot.prc.sun.com" );
+OSLTEST_DECLARE( HostIp2, "129.158.217.202" );
+OSLTEST_DECLARE( HostName3, "deuce.prc.sun.com" );
+OSLTEST_DECLARE( HostIp3, "129.158.217.199" );
+OSLTEST_DECLARE( HostName4, "sceri.PRC.Sun.COM" ); //Beijing server for test
+OSLTEST_DECLARE( HostIp4, "129.158.217.107" );
+OSLTEST_DECLARE( HostName5, "koori.SFBay.Sun.COM" ); //"grande.Germany.Sun.COM" ); //Germany server for test
+OSLTEST_DECLARE( HostIp5, "10.5.32.20" );
+OSLTEST_DECLARE( HostName6, "crumple.SFBay.Sun.COM" ); //sfbay
+OSLTEST_DECLARE( HostIp6, "10.6.103.83" );
+OSLTEST_DECLARE( HostIpInval, "123.45.67.89" ); //this is valid ip number,but can not arrive --mindy
+// OSLTEST_DECLARE( HostIpInval1, "123.345.67.89" ); //this is real invalid ip number --mindy
+OSLTEST_DECLARE( HostNameInval, "www.the_hostname_that_can_not_resolvable_to_an_IP_Address.com" );
+OSLTEST_DECLARE( HostIpZero, "0.0.0.0" );
+
+//------------------------------------------------------------------------
+// OS independent file definition
+//------------------------------------------------------------------------
+OSLTEST_DECLARE( NullURL, "" );
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+}
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+#endif /* _OSL_SOCKET_CONST_H_ */
diff --git a/sal/qa/osl/socket/osl_Socket_Const_orig.h b/sal/qa/osl/socket/osl_Socket_Const_orig.h
new file mode 100644
index 000000000000..36272a5694d4
--- /dev/null
+++ b/sal/qa/osl/socket/osl_Socket_Const_orig.h
@@ -0,0 +1,200 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _OSL_SOCKET_CONST_H_
+#define _OSL_SOCKET_CONST_H_
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+#include <sal/types.h>
+#include <rtl/textenc.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustring.h>
+
+#ifndef _OSL_SOCLET_HXX_
+#include <osl/socket.hxx>
+#endif
+#include <osl/socket.h>
+
+#ifndef _OSL_THREAD_HXX
+#include <osl/thread.hxx>
+#endif
+
+#ifndef _OSL_FILE_HXX
+#include <osl/file.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX
+#include <osl/mutex.hxx>
+#endif
+#include <osl/time.h>
+
+const char * pTestString1 = "test socket";
+const char * pTestString2 = " Passed#OK";
+//define read count
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+# include <stdio.h>
+//------------------------------------------------------------------------
+// OS dependent declaration and includes
+//------------------------------------------------------------------------
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+# include <unistd.h>
+# include <limits.h>
+# include <string.h>
+# include <math.h>
+# include <errno.h>
+# include <fcntl.h>
+# include <sys/stat.h>
+# include <sys/statfs.h>
+# include <sys/statvfs.h>
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netdb.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+#endif
+#if ( defined WNT ) // Windows
+#include <tools/prewin.h>
+// # include <windows.h>
+# include <winsock.h>
+# include <string.h>
+#include <tools/postwin.h>
+#endif
+
+
+//------------------------------------------------------------------------
+// macro definition for the ASCII array/OUString declarations,
+// we use p### for the ASCII array,
+// a### for the OUString,
+// n###Len for its length
+//------------------------------------------------------------------------
+
+#define OSLTEST_DECLARE( str_name, str_value ) \
+ static const sal_Char p##str_name[] = str_value; \
+ static const sal_Int32 n##str_name##Len = sizeof( p##str_name ) -1; \
+ ::rtl::OUString a##str_name = rtl::OUString::createFromAscii( p##str_name )
+
+
+//------------------------------------------------------------------------
+// Ip version definition
+//------------------------------------------------------------------------
+#define IP_VER 4 /// currently only IPv4 is considered.
+
+//------------------------------------------------------------------------
+// Ip port definition
+//------------------------------------------------------------------------
+#define IP_PORT_ZERO 0
+#define IP_PORT_FTP 21
+#define IP_PORT_TELNET 23
+#define IP_PORT_SMTP 25
+#define IP_PORT_GOPHER 70
+#define IP_PORT_HTTP1 80
+#define IP_PORT_POP3 110
+#define IP_PORT_NETBIOS_DGM 138
+#define IP_PORT_NETBIOS 139
+#define IP_PORT_IMAP 143
+#define IP_PORT_HTTPS 443
+#define IP_PORT_HTTP2 8080
+/**reference: http://www.iana.org/assignments/port-numbers */
+#define IP_PORT_MYPORT 8881 //8888
+#define IP_PORT_MYPORT1 8882 //8889
+#define IP_PORT_MYPORT2 8883 //8890
+#define IP_PORT_MYPORT3 8884 //8891
+#define IP_PORT_MYPORT4 8885 //8892
+#define IP_PORT_MYPORT5 8886 //8893
+#define IP_PORT_MYPORT6 8887 //8894
+#define IP_PORT_MYPORT7 8895
+#define IP_PORT_MYPORT8 8896
+#define IP_PORT_MYPORT9 8897
+#define IP_PORT_MYPORT10 8898
+
+#define IP_PORT_TMP 9999
+#define IP_PORT_INVAL 99999
+
+//------------------------------------------------------------------------
+// service definitions.
+//------------------------------------------------------------------------
+OSLTEST_DECLARE( ServiceFTP, "ftp" );
+OSLTEST_DECLARE( ServiceTELNET, "telnet" );
+OSLTEST_DECLARE( ServiceGOPHER, "gopher" );
+OSLTEST_DECLARE( ServiceIMAP, "imap" );
+OSLTEST_DECLARE( ServiceHTTPS, "https" );
+OSLTEST_DECLARE( ServiceNETBIOS, "netbios-dgm" );
+
+//------------------------------------------------------------------------
+// protocol definitions.
+//------------------------------------------------------------------------
+OSLTEST_DECLARE( ProtocolTCP, "tcp" );
+OSLTEST_DECLARE( ProtocolUDP, "udp" );
+
+//------------------------------------------------------------------------
+// Hostnames.
+//------------------------------------------------------------------------
+OSLTEST_DECLARE( HostName1, "localhost" );
+OSLTEST_DECLARE( HostIp1, "127.0.0.1" );
+OSLTEST_DECLARE( HostName2, "longshot.prc.sun.com" );
+OSLTEST_DECLARE( HostIp2, "129.158.217.202" );
+OSLTEST_DECLARE( HostName3, "deuce.prc.sun.com" );
+OSLTEST_DECLARE( HostIp3, "129.158.217.199" );
+OSLTEST_DECLARE( HostName4, "sceri.PRC.Sun.COM" ); //Beijing server for test
+OSLTEST_DECLARE( HostIp4, "129.158.217.107" );
+OSLTEST_DECLARE( HostName5, "koori.SFBay.Sun.COM" ); //"grande.Germany.Sun.COM" ); //Germany server for test
+OSLTEST_DECLARE( HostIp5, "10.5.32.20" );
+OSLTEST_DECLARE( HostName6, "crumple.SFBay.Sun.COM" ); //sfbay
+OSLTEST_DECLARE( HostIp6, "10.6.103.83" );
+OSLTEST_DECLARE( HostIpInval, "123.45.67.89" ); //this is valid ip number,but can not arrive --mindy
+OSLTEST_DECLARE( HostIpInval1, "123.345.67.89" ); //this is real invalid ip number --mindy
+OSLTEST_DECLARE( HostNameInval, "www.the_hostname_that_can_not_resolvable_to_an_IP_Address.com" );
+OSLTEST_DECLARE( HostIpZero, "0.0.0.0" );
+
+//------------------------------------------------------------------------
+// OS independent file definition
+//------------------------------------------------------------------------
+OSLTEST_DECLARE( NullURL, "" );
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+}
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+
+#endif /* _OSL_SOCKET_CONST_H_ */
diff --git a/sal/qa/osl/socket/osl_Socket_tests.cxx b/sal/qa/osl/socket/osl_Socket_tests.cxx
new file mode 100644
index 000000000000..3434d48203a0
--- /dev/null
+++ b/sal/qa/osl/socket/osl_Socket_tests.cxx
@@ -0,0 +1,88 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+#include <osl_Socket_Const.h>
+
+#include <testshl/simpleheader.hxx>
+#include <osl/socket.hxx>
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+//------------------------------------------------------------------------
+// tests cases begins here
+//------------------------------------------------------------------------
+
+namespace osl_Socket
+{
+
+ class tests : public CppUnit::TestFixture
+ {
+ public:
+
+ void test_001()
+ {
+ // _osl_getFullQualifiedDomainName( );
+ oslSocketResult aResult;
+ rtl::OUString suHostname = osl::SocketAddr::getLocalHostname(&aResult);
+ CPPUNIT_ASSERT_MESSAGE("getLocalHostname failed", aResult == osl_Socket_Ok);
+ }
+
+ CPPUNIT_TEST_SUITE( tests );
+ CPPUNIT_TEST( test_001 );
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_Socket::tests, "osl_SocketTest");
+}
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+
+/*#if (defined LINUX)
+
+void RegisterAdditionalFunctions( FktRegFuncPtr _pFunc )
+{
+ // for cover lines in _osl_getFullQualifiedDomainName( )
+ // STAR_OVERRIDE_DOMAINNAME is more an internal HACK for 5.2, which should remove from sal
+ setenv( "STAR_OVERRIDE_DOMAINNAME", "PRC.Sun.COM", 0 );
+}
+
+#else*/
+
+NOADDITIONAL;
+
+//#endif
diff --git a/sal/qa/osl/socket/osl_Socket_tests.xsce b/sal/qa/osl/socket/osl_Socket_tests.xsce
new file mode 100644
index 000000000000..d247b2365273
--- /dev/null
+++ b/sal/qa/osl/socket/osl_Socket_tests.xsce
@@ -0,0 +1 @@
+osl_SocketTest.tests.test_001
diff --git a/sal/qa/osl/socket/osl_StreamSocket.cxx b/sal/qa/osl/socket/osl_StreamSocket.cxx
new file mode 100644
index 000000000000..9883511cb43e
--- /dev/null
+++ b/sal/qa/osl/socket/osl_StreamSocket.cxx
@@ -0,0 +1,1506 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/** test coder preface:
+ 1. the BSD socket function will meet "unresolved external symbol error" on Windows platform
+ if you are not including ws2_32.lib in makefile.mk, the including format will be like this:
+
+ .IF "$(GUI)" == "WNT"
+ SHL1STDLIBS += $(SOLARLIBDIR)$/cppunit.lib
+ SHL1STDLIBS += ws2_32.lib
+ .ENDIF
+
+ likewise on Solaris platform.
+ .IF "$(GUI)" == "UNX"
+ SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+ SHL1STDLIBS += -lsocket -ldl -lnsl
+ .ENDIF
+
+ 2. since the Socket implementation of osl is only IPv4 oriented, our test are mainly focus on IPv4
+ category.
+
+ 3. some fragment of Socket source implementation are lack of comment so it is hard for testers
+ guess what the exact functionality or usage of a member. Hope the Socket section's comment
+ will be added.
+
+ 4. following functions are declared but not implemented:
+ inline sal_Bool SAL_CALL operator== (const SocketAddr & Addr) const;
+*/
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+
+#include <testshl/simpleheader.hxx>
+
+//#include "osl_Socket_Const.h"
+#include "sockethelper.hxx"
+#include <osl/conditn.hxx>
+
+using namespace osl;
+using namespace rtl;
+
+#define IP_PORT_MYPORT9 8897
+#define IP_PORT_MYPORT10 18900
+
+const char * pTestString1 = "test socket";
+const char * pTestString2 = " Passed#OK";
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+// just used to test socket::close() when accepting
+class AcceptorThread : public Thread
+{
+ ::osl::AcceptorSocket asAcceptorSocket;
+ ::rtl::OUString aHostIP;
+ sal_Bool bOK;
+protected:
+ void SAL_CALL run( )
+ {
+ ::osl::SocketAddr saLocalSocketAddr( aHostIP, IP_PORT_MYPORT9 );
+ ::osl::StreamSocket ssStreamConnection;
+
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True);
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ if ( sal_True != bOK1 )
+ {
+ t_print("# AcceptorSocket bind address failed.\n" ) ;
+ return;
+ }
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ if ( sal_True != bOK2 )
+ {
+ t_print("# AcceptorSocket listen address failed.\n" ) ;
+ return;
+ }
+
+ asAcceptorSocket.enableNonBlockingMode( sal_False );
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ bOK = sal_True;
+ t_print("AcceptorThread: acceptConnection failed! \n");
+ }
+ }
+public:
+ AcceptorThread(::osl::AcceptorSocket & asSocket, ::rtl::OUString const& aBindIP )
+ : asAcceptorSocket( asSocket ), aHostIP( aBindIP )
+ {
+ bOK = sal_False;
+ }
+
+ sal_Bool isOK() { return bOK; }
+
+ ~AcceptorThread( )
+ {
+ if ( isRunning( ) )
+ {
+ asAcceptorSocket.shutdown();
+ t_print("# error: Acceptor thread not terminated.\n" );
+ }
+ }
+};
+
+/** Server Socket Thread, served as a temp little server to communicate with client.
+ */
+class ServerSocketThread : public Thread
+{
+ osl::Condition &m_aCondition;
+protected:
+ oslThreadIdentifier m_id;
+
+ void SAL_CALL run( )
+ {
+ ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT9 );
+ ::osl::StreamSocket ssStreamConnection;
+
+ //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //integer not sal_Bool : sal_True);
+ while ( schedule( ) == sal_True )
+ {
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ if ( sal_True != bOK1 )
+ {
+ t_print("# ServerSocketThread: AcceptorSocket bind address failed.\n" ) ;
+ break;
+ }
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ if ( sal_True != bOK2 )
+ {
+ t_print("# ServerSocketThread: AcceptorSocket listen address failed.\n" ) ;
+ break;
+ }
+
+ asAcceptorSocket.enableNonBlockingMode( sal_False );
+ m_aCondition.set();
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ t_print("ServerSocketThread: acceptConnection failed! \n");
+ break;
+ }
+ sal_Int32 nReadNumber1 = ssStreamConnection.recv( pReadBuffer, 11 );
+ sal_Int32 nReadNumber2 = ssStreamConnection.recv( pReadBuffer + nReadNumber1, 11 );
+ pReadBuffer[nReadNumber1 + nReadNumber2] = '\0';
+ //t_print("# read buffer content: %s\n", pReadBuffer );
+ break;
+ }
+ ssStreamConnection.close();
+ asAcceptorSocket.close();
+
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this server thread %d!\n", m_id );
+ }
+
+public:
+ // public to check if data transmition is OK
+ sal_Char pReadBuffer[30];
+ ServerSocketThread( osl::Condition &_aCond ):m_aCondition(_aCond)
+ {
+ m_aCondition.reset();
+ t_print("#init ServerSocketThread\n");
+ m_id = getIdentifier( );
+ //t_print("# successfully creat this ServerSocketThread %d!\n", m_id );
+ }
+
+ ~ServerSocketThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: ServerSocketThread has not terminated.\n" );
+ }
+};
+
+/** Client Socket Thread, served as a temp little client to communicate with server.
+ */
+class ClientSocketThread : public Thread
+{
+protected:
+ osl::Condition &m_aCondition;
+ oslThreadIdentifier m_id;
+ ::osl::SocketAddr m_saTargetSocketAddr;
+ ::osl::ConnectorSocket m_csConnectorSocket;
+
+ void SAL_CALL run( )
+ {
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 5;
+ pTimeout->Nanosec = 0;
+
+ /// if the thread should terminate, schedule return false
+ //while ( schedule( ) == sal_True )
+ //{
+ if ( osl::Condition::result_ok != m_aCondition.wait( pTimeout ) )
+ {
+ free( pTimeout );
+ return;
+ }
+
+ if ( osl_Socket_Ok == m_csConnectorSocket.connect( m_saTargetSocketAddr, pTimeout ))
+ {
+ m_csConnectorSocket.send( pTestString1, 11 ); // "test socket"
+ m_csConnectorSocket.send( pTestString2, 10);
+ }
+ else
+ t_print("# ClientSocketThread: connect failed! \n");
+ // terminate();
+ //}
+ m_csConnectorSocket.close();
+ free( pTimeout );
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this thread %d!\n", m_id );
+ }
+
+public:
+ ClientSocketThread( osl::Condition &_aCond ):
+ m_aCondition(_aCond),
+ m_saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT9 ),
+ m_csConnectorSocket( )
+ {
+ m_id = getIdentifier( );
+ //t_print("# successfully creat this client thread %d!\n", m_id );
+ }
+
+ ~ClientSocketThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: client thread not terminated.\n" );
+ }
+
+};
+
+// -----------------------------------------------------------------------------
+// Helper functions, to create buffers, check buffers
+class ValueCheckProvider
+{
+ bool m_bFoundFailure;
+ char *m_pBuffer;
+ sal_Int32 m_nBufferSize;
+
+public:
+ ValueCheckProvider()
+ :m_bFoundFailure(false),
+ m_pBuffer(NULL),
+ m_nBufferSize(0)
+ {
+ }
+
+ bool isFailure() {return m_bFoundFailure;}
+
+ const char* getBuffer() {return m_pBuffer;}
+ char* getWriteBuffer() {return m_pBuffer;}
+
+ sal_Int32 getBufferSize() {return m_nBufferSize;}
+
+ bool checkValues(sal_Int32 _nLength, int _nValue)
+ {
+ m_bFoundFailure = false;
+ for(sal_Int32 i=0;i<_nLength;i++)
+ {
+ if (m_pBuffer[i] != _nValue)
+ {
+ m_bFoundFailure = true;
+ }
+ }
+ return m_bFoundFailure;
+ }
+
+ void createBuffer(sal_Int32 _nLength, int _nValue)
+ {
+ m_nBufferSize = _nLength;
+ m_pBuffer = (char*) malloc(m_nBufferSize);
+ if (m_pBuffer)
+ {
+ memset(m_pBuffer, _nValue, m_nBufferSize);
+ }
+ }
+
+ void freeBuffer()
+ {
+ if (m_pBuffer) free(m_pBuffer);
+ }
+
+};
+
+// -----------------------------------------------------------------------------
+/** Client Socket Thread, served as a temp little client to communicate with server.
+ */
+
+class ReadSocketThread : public Thread
+{
+ ValueCheckProvider m_aValues;
+ int m_nValue;
+ osl::Condition &m_aCondition;
+
+protected:
+ oslThreadIdentifier m_id;
+
+ void SAL_CALL run( )
+ {
+ ::osl::SocketAddr m_aTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT10 );
+ ::osl::ConnectorSocket m_aConnectorSocket;
+
+ if (! m_aTargetSocketAddr.is())
+ {
+ t_print("# SocketAddr was NOT created successfully!\n");
+ }
+ else
+ {
+ t_print("start ReadSocketThread\n");
+
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 5;
+ pTimeout->Nanosec = 0;
+
+ m_aCondition.wait();
+
+ t_print("connect()\n");
+
+ oslSocketResult eResult = m_aConnectorSocket.connect( m_aTargetSocketAddr, pTimeout );
+ if ( osl_Socket_Ok == eResult )
+ {
+ sal_Int32 nReadCount = m_aConnectorSocket.read( m_aValues.getWriteBuffer(), m_aValues.getBufferSize() );
+ m_aValues.checkValues(nReadCount, m_nValue);
+ }
+ else
+ {
+ t_print("# ReadSocketThread: connect failed! \n");
+ printSocketResult(eResult);
+ }
+
+ //remove this line for deadlock on solaris( margritte.germany )
+ m_aConnectorSocket.close();
+ free( pTimeout );
+ }
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this thread %d!\n", m_id );
+ }
+
+public:
+ sal_Int32 getCount() {return m_aValues.getBufferSize();}
+ bool isOk() {return m_aValues.isFailure() == true ? false : true;}
+
+ ReadSocketThread(sal_Int32 _nBufferSize, int _nValue, osl::Condition &_aCond )
+ : m_nValue( _nValue ),
+ m_aCondition(_aCond)
+ {
+ t_print("#init ReadSocketThread\n");
+ m_id = getIdentifier( );
+
+ //t_print("# successfully creat this client thread %d!\n", m_id );
+ m_aValues.createBuffer(_nBufferSize, 0);
+ }
+
+ ~ReadSocketThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: client thread not terminated.\n" );
+ m_aValues.freeBuffer();
+ }
+
+};
+
+/** Server Socket Thread, write a file which is large
+ */
+class WriteSocketThread : public Thread
+{
+ ValueCheckProvider m_aValues;
+ osl::Condition &m_aCondition;
+
+protected:
+ oslThreadIdentifier m_id;
+
+ void SAL_CALL run( )
+ {
+ t_print("start WriteSocketThread\n");
+ ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT10 );
+ if (! saLocalSocketAddr.is())
+ {
+ t_print("LocalSocketAddr was NOT created successfully!\n");
+ }
+
+ ::osl::StreamSocket ssStreamConnection;
+
+ //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ /// if the thread should terminate, schedule return false
+ // while ( schedule( ) == sal_True )
+ // {
+ t_print("bind()\n");
+ sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+ if ( sal_True != bOK1 )
+ {
+ t_print("# WriteSocketThread: AcceptorSocket bind address failed. \n" ) ;
+ }
+ else
+ {
+ t_print("listen()\n");
+ sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+ if ( sal_True != bOK2 )
+ {
+ t_print("# WriteSocketThread: AcceptorSocket listen address failed. \n" ) ;
+ }
+ else
+ {
+
+ // blocking mode, if read/recv failed, block until success
+ asAcceptorSocket.enableNonBlockingMode( sal_False);
+ t_print("acceptConnection()\n");
+ m_aCondition.set();
+
+ oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ t_print("WriteSocketThread: acceptConnection failed! \n");
+ }
+ else
+ {
+
+// LLA: removed, due to the fact, this is to error prone
+// LLA: char * pSrcRoot = getenv("SOURCE_ROOT");
+// LLA: // LLA: This is absolute wrong!
+// LLA: // strcat( pSrcRoot, "/sal/inc/osl/file.hxx");
+// LLA: rtl::OString sSrcRoot(pSrcRoot);
+// LLA: sSrcRoot += "/sal/inc/osl/file.hxx";
+// LLA:
+// LLA: ::rtl::OUString sFilePath = ::rtl::OUString::createFromAscii( sSrcRoot.getStr() );
+// LLA: #ifdef WNT
+// LLA: while (sFilePath.lastIndexOf('/') != -1)
+// LLA: sFilePath = sFilePath.replace('/',(sal_Unicode)'\\');
+// LLA: #endif
+// LLA: FILE *stream;
+// LLA: sal_uInt64 nCount_read;
+// LLA: sal_Char buffer_read[FILE_READ];
+// LLA:
+// LLA: if( (stream = fopen( oustring2char( sFilePath ), "r+t" )) != NULL )
+// LLA: {
+// LLA: /* Attempt to read in 25 characters */
+// LLA: nCount_read = fread( buffer_read, sizeof( char ), FILE_READ, stream );
+// LLA: fclose( stream );
+// LLA: }
+// LLA: else
+// LLA: t_print("# File $SRC_ROOT/sal/inc/osl/file.hxx could not be opened\n" );
+
+ t_print("write()\n");
+
+ ssStreamConnection.write( m_aValues.getBuffer(), m_aValues.getBufferSize() );
+ t_print("done written.\n");
+ }
+ }
+ }
+ ssStreamConnection.close();
+ asAcceptorSocket.close();
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this server thread %d!\n", m_id );
+ }
+
+public:
+ // public to check if data transmition is OK
+ WriteSocketThread(sal_Int32 _nBufferSize, int _nValue, osl::Condition &_aCond )
+ : m_aCondition(_aCond)
+ {
+ m_aCondition.reset();
+
+ t_print("#init WriteSocketThread\n");
+ m_id = getIdentifier( );
+ //t_print("# successfully creat this server thread %d!\n", m_id );
+
+ m_aValues.createBuffer(_nBufferSize, _nValue);
+ }
+
+ ~WriteSocketThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: server thread not terminated.\n" );
+ m_aValues.freeBuffer();
+ }
+};
+
+// -----------------------------------------------------------------------------
+
+namespace osl_StreamSocket
+{
+
+ /** testing the methods:
+ inline StreamSocket(oslAddrFamily Family = osl_Socket_FamilyInet,
+ oslProtocol Protocol = osl_Socket_ProtocolIp,
+ oslSocketType Type = osl_Socket_TypeStream);
+
+ inline StreamSocket( const StreamSocket & );
+
+ inline StreamSocket( oslSocket Socket , __sal_NoAcquire noacquire );
+
+ inline StreamSocket( oslSocket Socket );
+ */
+
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ oslSocket sHandle;
+ // initialization
+ void setUp( )
+ {
+ sHandle = osl_createSocket( osl_Socket_FamilyInet, osl_Socket_TypeStream, osl_Socket_ProtocolIp );
+ }
+
+ void tearDown( )
+ {
+ sHandle = NULL;
+ }
+
+
+ void ctors_none()
+ {
+ /// Socket constructor.
+ ::osl::StreamSocket ssSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_none constructor function: check if the stream socket was created successfully.",
+ osl_Socket_TypeStream == ssSocket.getType( ) );
+ }
+
+ void ctors_acquire()
+ {
+ /// Socket constructor.
+ ::osl::StreamSocket ssSocket( sHandle );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for ctors_acquire constructor function: check if the socket was created successfully",
+ osl_Socket_TypeStream == ssSocket.getType( ) );
+ }
+
+ void ctors_no_acquire()
+ {
+ /// Socket constructor.
+ ::osl::StreamSocket ssSocket( sHandle, SAL_NO_ACQUIRE );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for ctors_no_acquire constructor function: check if the socket was created successfully",
+ osl_Socket_TypeStream == ssSocket.getType( ) );
+ }
+
+ void ctors_copy_ctor()
+ {
+ /// Socket constructor.
+ ::osl::StreamSocket ssSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ /// Socket copy constructor.
+ ::osl::StreamSocket copySocket( ssSocket );
+
+ CPPUNIT_ASSERT_MESSAGE(" test for ctors_copy_ctor constructor function: create new Socket instance using copy constructor",
+ osl_Socket_TypeStream == copySocket.getType( ) );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_none );
+ CPPUNIT_TEST( ctors_acquire );
+ CPPUNIT_TEST( ctors_no_acquire );
+ CPPUNIT_TEST( ctors_copy_ctor );
+ CPPUNIT_TEST_SUITE_END();
+
+ }; // class ctors
+
+ class send_recv: public CppUnit::TestFixture
+ {
+ public:
+ // initialization
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+
+ }
+
+ void send_recv1()
+ {
+ osl::Condition aCondition;
+ //client sent two strings, and server received, check the order and value
+ ServerSocketThread myServerThread( aCondition );
+ ClientSocketThread myClientThread( aCondition );
+ myServerThread.create( );
+ myClientThread.create( );
+
+ //wait until the thread terminate
+ myClientThread.join( );
+ myServerThread.join( );
+ sal_Char myStr[30] = "";
+ strcat( myStr, pTestString1 );
+ strcat( myStr, pTestString2 );
+ sal_Int32 nRes = strcmp( myServerThread.pReadBuffer, myStr );
+ CPPUNIT_ASSERT_MESSAGE(" test for send/recv with two threads: launch Server/Client threads, send data from client, check received data in Server thread.",
+ nRes == 0 );
+ }
+
+ // error when recv
+ void send_recv2()
+ {
+ ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT9 );
+ ::osl::StreamSocket ssStreamConnection;
+ sal_Char pReadBuffer[30] = "";
+
+ osl::Condition aCondition;
+ aCondition.reset();
+ ClientSocketThread myClientThread( aCondition );
+ myClientThread.create( );
+
+ asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+
+ asAcceptorSocket.bind( saLocalSocketAddr );
+ asAcceptorSocket.listen( 1 );
+ asAcceptorSocket.enableNonBlockingMode( sal_True );
+ aCondition.set();
+
+ asAcceptorSocket.acceptConnection( ssStreamConnection );
+ sal_Int32 nReadNumber = ssStreamConnection.recv( pReadBuffer, 11 );
+
+ myClientThread.join( ) ;
+ ssStreamConnection.close();
+ asAcceptorSocket.close();
+ CPPUNIT_ASSERT_MESSAGE(" test for send/recv, recv error!", nReadNumber == -1 );
+ }
+
+ // LLA: This is a helper function, which create 2 threads, a server and a client.
+ // the server writes the buffersize to the client.
+
+ void write_read(sal_Int32 _nBufferSize, int _nValue)
+ {
+ //client sent two strings, and server received, check the order and value
+ osl::Condition aCondition;
+ WriteSocketThread myServerThread(_nBufferSize, _nValue, aCondition);
+ ReadSocketThread myClientThread(_nBufferSize, _nValue, aCondition);
+ myServerThread.create( );
+// thread_sleep( 1 );
+ myClientThread.create( );
+
+ //wait until the thread terminate
+ myClientThread.join( );
+ myServerThread.join( );
+
+ //Maximum Packet Size is ( ARPANET, MILNET = 1007 Ethernet (10Mb) = 1500
+ // Proteon PRONET = 2046), so here test read 4000 bytes
+ sal_Int32 nLength = myClientThread.getCount();
+ bool bIsOk = myClientThread.isOk(); // check if the values are right.
+
+ t_print("Length:=%d\n", nLength);
+ t_print(" bIsOk:=%d\n", bIsOk);
+
+ CPPUNIT_ASSERT_MESSAGE(" test for write/read values with two threads: send data from server, check readed data in client.",
+ nLength == _nBufferSize && bIsOk == true);
+ }
+
+ // Tests with different values and sizes
+ void write_read_001()
+ {
+ write_read(50, 10);
+ }
+ void write_read_002()
+ {
+ write_read(1024, 20);
+ }
+ void write_read_003()
+ {
+ write_read(4000, 1);
+ }
+ void write_read_004()
+ {
+ write_read(8192, 3);
+ }
+ void write_read_005()
+ {
+ write_read(32768, 3);
+ }
+
+ CPPUNIT_TEST_SUITE( send_recv );
+ CPPUNIT_TEST( write_read_001 );
+ CPPUNIT_TEST( write_read_002 );
+ CPPUNIT_TEST( write_read_003 );
+ CPPUNIT_TEST( write_read_004 );
+ CPPUNIT_TEST( write_read_005 );
+ CPPUNIT_TEST( send_recv1 );
+ CPPUNIT_TEST( send_recv2 );
+// CPPUNIT_TEST( write_read );
+ CPPUNIT_TEST_SUITE_END();
+ }; // class send_recv
+
+// -----------------------------------------------------------------------------
+
+ class SendClientThread : public Thread
+ {
+ protected:
+ ::osl::SocketAddr m_saTargetSocketAddr;
+ ::osl::ConnectorSocket m_csConnectorSocket;
+ void SAL_CALL run( )
+ {
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 5;
+ pTimeout->Nanosec = 0;
+
+ if ( osl_Socket_Ok == m_csConnectorSocket.connect( m_saTargetSocketAddr, pTimeout ))
+ {
+ sal_Int32 nWrite1 = m_csConnectorSocket.write( pTestString1, 11 ); // "test socket"
+
+ sal_Int32 nWrite2 = m_csConnectorSocket.write( pTestString2, strlen( pTestString2 ) + 1 );
+ thread_sleep( 2 );
+ m_csConnectorSocket.write( pTestString2, strlen( pTestString2 ) + 1 );
+ t_print("nWrite1 is %d, nWrite2 is %d\n", nWrite1, nWrite2 );
+ //thread_sleep( 1 );
+ }
+ else
+ t_print("# SendClientThread: connect failed! \n");
+
+ m_csConnectorSocket.close();
+ free( pTimeout );
+ }
+ public:
+ SendClientThread( ):
+ m_saTargetSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT9 ),
+ m_csConnectorSocket( )
+ {
+ //t_print("# successfully creat this SendClientThread %d!\n", m_id );
+ }
+
+ ~SendClientThread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: SendClientThread has not terminated.\n" );
+ }
+
+ };
+
+ class shutdown: public CppUnit::TestFixture
+ {
+ public:
+ // initialization
+ void setUp( )
+ {
+ }
+
+ void tearDown( )
+ {
+
+ }
+
+ // similar to close_002
+ void shutdown_001()
+ {
+#if defined(LINUX)
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ AcceptorThread myAcceptorThread( asSocket, rtl::OUString::createFromAscii("127.0.0.1") );
+ myAcceptorThread.create();
+
+ thread_sleep( 1 );
+
+ //when accepting, shutdown the socket, the thread will not block for accepting
+ asSocket.shutdown();
+ myAcceptorThread.join();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for close when is accepting: the socket will quit accepting status.",
+ myAcceptorThread.isOK( ) == sal_True );
+#endif
+ }
+
+ void shutdown_002()
+ {
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT9);
+ asSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: bind fail", asSocket.bind( saLocalSocketAddr ) == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: listen fail", asSocket.listen( 1 ) == sal_True );
+ sal_Char pReadBuffer[40];
+// osl::Condition aCondition;
+ SendClientThread mySendThread;
+ mySendThread.create();
+
+ asSocket.enableNonBlockingMode( sal_False );
+ ::osl::StreamSocket ssConnectionSocket;
+ oslSocketResult eResult = asSocket.acceptConnection( ssConnectionSocket );
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: acceptConnection fail", eResult == osl_Socket_Ok );
+
+ /* set socket option SO_LINGER 0, so close immediatly */
+ linger aLingerSet;
+ sal_Int32 nBufferLen = sizeof( struct linger );
+ aLingerSet.l_onoff = 0;
+ aLingerSet.l_linger = 0;
+
+ ssConnectionSocket.setOption( osl_Socket_OptionLinger, &aLingerSet, nBufferLen );
+ thread_sleep( 1 );
+ //sal_uInt32 nRecv1 = 0;
+ sal_Int32 nRead1 = ssConnectionSocket.read( pReadBuffer, 11 );
+
+ //shutdown read after client the first send complete
+ ssConnectionSocket.shutdown( osl_Socket_DirRead );
+
+ sal_Int32 nRead2 = ssConnectionSocket.read( pReadBuffer + nRead1, 12 );
+ sal_Int32 nRead3 = ssConnectionSocket.read( pReadBuffer + nRead1 + nRead2, 12 );
+ t_print("after read 2, nRead1 is %d, nRead2 is %d, nRead3 is %d \n", nRead1, nRead2, nRead3 );
+ mySendThread.join();
+
+ ssConnectionSocket.close();
+ asSocket.close();
+
+ /* on Linux, if send is before shutdown(DirRead), can read, nRecv2 still > 0,
+ http://dbforums.com/arch/186/2002/12/586417
+ While on Solaris, after shutdown(DirRead), all read will return 0
+ */
+#ifdef LINUX
+ CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not read(recv).",
+ nRead1 > 0 && nRead3 == 0 );
+#else
+ CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not read(recv).",
+ nRead1 > 0 && nRead2 == 0 && nRead3 == 0 );
+#endif
+
+ }
+
+ void shutdown_003()
+ {
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("127.0.0.1"), IP_PORT_MYPORT9);
+ asSocket.setOption( osl_Socket_OptionReuseAddr, 1 );
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: bind fail", asSocket.bind( saLocalSocketAddr ) == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: listen fail", asSocket.listen( 1 ) == sal_True );
+ sal_Char pReadBuffer[40];
+ osl::Condition aCondition;
+ SendClientThread mySendThread;
+ mySendThread.create();
+
+ asSocket.enableNonBlockingMode( sal_False );
+ ::osl::StreamSocket ssConnectionSocket;
+ oslSocketResult eResult = asSocket.acceptConnection( ssConnectionSocket );
+ CPPUNIT_ASSERT_MESSAGE("shutdown_002: acceptConnection fail", eResult == osl_Socket_Ok );
+
+ thread_sleep( 1 );
+ //shutdown write after client the first send complete
+ ssConnectionSocket.shutdown( osl_Socket_DirWrite );
+
+ // recv should not shutdown
+ sal_Int32 nRead1 = ssConnectionSocket.read( pReadBuffer, 11 );
+
+ sal_Int32 nWrite = ssConnectionSocket.write( pReadBuffer, 11 );
+ // still can read
+ sal_Int32 nRead3 = ssConnectionSocket.read( pReadBuffer + nRead1 , 12 );
+ t_print("after read 2, nRead1 is %d, nWrite is %d, nRead3 is %d\n", nRead1, nWrite, nRead3 );
+ mySendThread.join();
+ ssConnectionSocket.close();
+ asSocket.close();
+
+ CPPUNIT_ASSERT_MESSAGE( "test for shutdown read direction: the socket can not send(write).",
+ nRead1 > 0 && nWrite == 0 && nRead3 > 0);
+
+ }
+
+ CPPUNIT_TEST_SUITE( shutdown );
+ CPPUNIT_TEST( shutdown_001 );
+ CPPUNIT_TEST( shutdown_002 );
+ CPPUNIT_TEST( shutdown_003 );
+ CPPUNIT_TEST_SUITE_END();
+ }; // class shutdown
+
+ class isExceptionPending: public CppUnit::TestFixture
+ {
+ public:
+ void isExPending_001()
+ {
+ ::osl::AcceptorSocket asSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+ sal_Bool bOk = asSocket.isExceptionPending( pTimeout );
+ free( pTimeout );
+
+ CPPUNIT_ASSERT_MESSAGE( "test for isExceptionPending.",
+ bOk == sal_False );
+ }
+
+ /**tester's comments: lack of a case that return sal_True, do not know when it will return sal_True*/
+
+
+ CPPUNIT_TEST_SUITE( isExceptionPending );
+ CPPUNIT_TEST( isExPending_001 );
+ CPPUNIT_TEST_SUITE_END();
+ }; // class isExceptionPending
+
+// -----------------------------------------------------------------------------
+/** Server Socket Thread, write a file which is large
+ */
+// LLA: class WriteSocketThread : public Thread
+// LLA: {
+// LLA: ValueCheckProvider m_aValues;
+// LLA:
+// LLA: protected:
+// LLA: oslThreadIdentifier m_id;
+// LLA:
+// LLA: void SAL_CALL run( )
+// LLA: {
+// LLA: ::osl::AcceptorSocket asAcceptorSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+// LLA: ::osl::SocketAddr saLocalSocketAddr( rtl::OUString::createFromAscii("10.16.66.252"), 8888 );
+// LLA: ::osl::StreamSocket ssStreamConnection;
+// LLA:
+// LLA: //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+// LLA: asAcceptorSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+// LLA:
+// LLA: /// if the thread should terminate, schedule return false
+// LLA: while ( schedule( ) == sal_True )
+// LLA: {
+// LLA: sal_Bool bOK1 = asAcceptorSocket.bind( saLocalSocketAddr );
+// LLA: if ( sal_True != bOK1 )
+// LLA: {
+// LLA: t_print("# WriteSocketThread: AcceptorSocket bind address failed. \n" ) ;
+// LLA: break;
+// LLA: }
+// LLA: sal_Bool bOK2 = asAcceptorSocket.listen( 1 );
+// LLA: if ( sal_True != bOK2 )
+// LLA: {
+// LLA: t_print("# WriteSocketThread: AcceptorSocket listen address failed. \n" ) ;
+// LLA: break;
+// LLA: }
+// LLA: // blocking mode, if read/recv failed, block until success
+// LLA: asAcceptorSocket.enableNonBlockingMode( sal_False);
+// LLA:
+// LLA: oslSocketResult eResult = asAcceptorSocket.acceptConnection( ssStreamConnection );
+// LLA: if (eResult != osl_Socket_Ok )
+// LLA: {
+// LLA: t_print("WriteSocketThread: acceptConnection failed! \n");
+// LLA: break;
+// LLA: }
+// LLA:
+// LLA:
+// LLA: sal_Int32 nReadNumber1 = ssStreamConnection.write( m_aValues.getBuffer(), m_aValues.getBufferSize() );
+// LLA: break;
+// LLA: }
+// LLA: ssStreamConnection.close();
+// LLA: asAcceptorSocket.close();
+// LLA: }
+// LLA: }
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+/** Client Socket Thread, served as a temp little client to communicate with server.
+ */
+
+#define IP_PORT_TEST 8900
+
+ class ReadSocket2Thread : public Thread
+ {
+ osl::Condition &m_aCondition;
+ char* m_pBuffer;
+ sal_Int32 m_nBufferSize;
+ sal_Int32 m_nReadCount;
+ rtl::OString m_sAddr;
+
+ bool m_bOk;
+
+ void setFailed()
+ {
+ m_bOk = false;
+ }
+
+ protected:
+ oslThreadIdentifier m_id;
+
+ void read()
+ {
+ if (m_sAddr.getLength() == 0)
+ {
+ setFailed();
+ return;
+ }
+
+ // 10.16.66.252
+ ::osl::SocketAddr aSocketAddr( rtl::OUString::createFromAscii(m_sAddr.getStr()), IP_PORT_TEST );
+ ::osl::ConnectorSocket aSocket; // ( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+
+ aSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True;
+
+ m_aCondition.wait();
+ t_print("wait done\n");
+
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 20;
+ pTimeout->Nanosec = 0;
+
+
+ // blocking mode, if read/recv failed, block until success
+ t_print("enableNonBlockingMode(false)\n");
+ aSocket.enableNonBlockingMode( sal_False );
+
+
+ t_print("connect()\n");
+ oslSocketResult eResult = aSocket.connect( aSocketAddr, pTimeout );
+ if ( osl_Socket_Ok == eResult)
+ {
+ if (m_pBuffer)
+ {
+ t_print("read()\n");
+ m_nReadCount = aSocket.read( m_pBuffer, m_nBufferSize );
+ t_print("%d bytes recived.\n", m_nReadCount);
+ }
+ }
+ else
+ {
+ t_print("# ReadSocket2Thread: connect failed! \n");
+ printSocketResult(eResult);
+ setFailed();
+ }
+
+ //remove this line for deadlock on solaris( margritte.germany )
+ aSocket.close();
+ free( pTimeout );
+ }
+
+ void SAL_CALL run( )
+ {
+ read();
+ }
+
+ void SAL_CALL onTerminated( )
+ {
+ //t_print("# normally terminate this thread %d!\n", m_id );
+ }
+
+ public:
+ sal_Int32 getCount() {return m_nReadCount;}
+ bool isOk() {return m_nReadCount == 0 ? false : true;}
+ bool getFailed() {return m_bOk == false ? true : false;}
+
+ ReadSocket2Thread(osl::Condition &_aCondition)
+ :m_aCondition(_aCondition),
+ m_nReadCount(0),
+ m_bOk( true )
+ {
+ m_aCondition.reset();
+ m_pBuffer = (char*) malloc(1024);
+ if (m_pBuffer)
+ {
+ m_nBufferSize = 1024;
+ }
+
+ m_id = getIdentifier( );
+ //t_print("# successfully creat this client thread %d!\n", m_id );
+ }
+
+ void setAddr(rtl::OString const& _sAddr)
+ {
+ m_sAddr = _sAddr;
+ }
+
+ ~ReadSocket2Thread( )
+ {
+ if ( isRunning( ) )
+ t_print("# error: client thread not terminated.\n" );
+ free(m_pBuffer);
+ }
+
+ };
+
+ // -----------------------------------------------------------------------------
+
+ class justtest : public CppUnit::TestFixture
+ {
+ void send_Acceptor(rtl::OString const& _sAddr, osl::Condition &)
+ {
+ ::osl::AcceptorSocket aSocket; // ( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr aSocketAddr;
+
+ if (! aSocketAddr.setPort(IP_PORT_TEST))
+ {
+ t_print("# cant set port\n" );
+ }
+
+ if (! aSocketAddr.setHostname(rtl::OUString::createFromAscii(_sAddr.getStr())))
+ {
+ t_print("# cant set hostname/ip\n" );
+ }
+
+ rtl::OUString aHostname = aSocketAddr.getHostname();
+ aSocketAddr.getPort();
+
+
+ //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+ aSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True);
+
+ /// if the thread should terminate, schedule return false
+ // while ( schedule( ) == sal_True )
+ // {
+ if (! aSocket.bind( aSocketAddr ))
+ {
+ t_print("# can't bind.\n" );
+ }
+ if (! aSocket.listen( ))
+ {
+ t_print("# can't listen. \n" );
+ }
+
+ // blocking mode, if read/recv failed, block until success
+ aSocket.enableNonBlockingMode( sal_False);
+ ::osl::StreamSocket ssStreamConnection;
+
+ oslSocketResult eResult = aSocket.acceptConnection( ssStreamConnection );
+ if (eResult != osl_Socket_Ok )
+ {
+ t_print("WriteSocketThread: acceptConnection failed! \n");
+ // break;
+ }
+ char const * pBuffer = "Test String\n";
+ sal_Int32 nBufferSize = strlen(pBuffer);
+ ssStreamConnection.write( pBuffer, nBufferSize );
+ // break;
+ // }
+
+ // ssStreamConnection.close();
+ aSocket.close();
+ }
+
+ // -----------------------------------------------------------------------------
+
+ void send_Connector(rtl::OString const& _sAddr, osl::Condition &/*_aCondition*/ )
+ {
+ ::osl::ConnectorSocket aSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr aSocketAddr( rtl::OUString::createFromAscii(_sAddr.getStr()), IP_PORT_TEST );
+
+ if (! aSocketAddr.is())
+ {
+ t_print("is failed.\n");
+ return;
+ }
+
+ //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+ aSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True;
+
+ oslSocketResult aResult = aSocket.connect( aSocketAddr );
+ if ( aResult != osl_Socket_Ok )
+ {
+ t_print("# send_Connector: connect failed. \n" );
+ }
+ else
+ {
+ // blocking mode, if read/recv failed, block until success
+// aSocket.enableNonBlockingMode( sal_False );
+
+// _aCondition.set();
+
+ ::osl::StreamSocket ssStreamConnection(aSocket);
+
+ char const * pBuffer = "GET / HTTP/1.0\015\012\015\012";
+ sal_Int32 nBufferSize = strlen(pBuffer);
+ ssStreamConnection.write( pBuffer, nBufferSize );
+
+ char *pBufferPeek = (char*) malloc(1024);
+ sal_Int32 nReadNumber = ssStreamConnection.recv( pBufferPeek, 1024, osl_Socket_MsgPeek);
+ free(pBufferPeek);
+
+ char *pBuffer2 = (char*) malloc(nReadNumber + 1);
+ sal_Int32 nReadNumberReal = ssStreamConnection.read( pBuffer2, nReadNumber );
+ pBuffer2[nReadNumberReal] = '\0';
+
+ t_print("received: %s\n", pBuffer2);
+
+ // char * pBuffer3 = "quit\n";
+ // nBufferSize = strlen(pBuffer3);
+ // nWriteNumber = ssStreamConnection.write( pBuffer3, nBufferSize );
+
+ rtl::OUString suError = ssStreamConnection.getErrorAsString();
+ free(pBuffer2);
+ // ssStreamConnection.close();
+
+ // ssStreamConnection.close();
+ }
+ aSocket.shutdown(osl_Socket_DirReadWrite);
+ aSocket.close();
+ }
+
+
+ public:
+// LLA: orig void send_recv()
+// LLA: orig {
+// LLA: orig if ( ifAvailable(rtl::OUString::createFromAscii("margritte.germany")) == sal_True )
+// LLA: orig t_print("margritte is alive ! \n");
+// LLA: orig if ( ifAvailable(rtl::OUString::createFromAscii("10.16.66.252")) == sal_False )
+// LLA: orig {
+// LLA: orig t_print("ip 10.16.66.252 is not alive! \n");
+// LLA: orig return;
+// LLA: orig }
+// LLA: orig ReadSocket2Thread myReadThread;
+// LLA: orig myReadThread.create();
+// LLA: orig
+// LLA: orig thread_sleep( 2 );
+// LLA: orig // send_Acceptor();
+// LLA: orig send_Connector();
+// LLA: orig
+// LLA: orig myReadThread.join();
+// LLA: orig
+// LLA: orig // statistics
+// LLA: orig sal_uInt32 nLength = myReadThread.getCount();
+// LLA: orig bool bIsOk = myReadThread.isOk(); // check if the values are right.
+// LLA: orig
+// LLA: orig t_print("Length:=%d\n", nLength);
+// LLA: orig t_print(" bIsOk:=%d\n", bIsOk);
+// LLA: orig }
+
+ // -----------------------------------------------------------------------------
+
+ // LLA: send_Connector_2_margritte works, it send strings to echo server on margritte
+ // but can not receive anything
+
+ void send_Connector_2_margritte(rtl::OString const& _sAddr)
+ {
+ ::osl::ConnectorSocket aSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr aSocketAddr( rtl::OUString::createFromAscii(_sAddr.getStr()), IP_PORT_TEST );
+
+ //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+ aSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True;
+
+ oslSocketResult aResult = aSocket.connect( aSocketAddr );
+ if ( aResult != osl_Socket_Ok )
+ {
+ t_print("# connect failed. \n" );
+ }
+ else
+ {
+ // blocking mode, if read/recv failed, block until success
+ aSocket.enableNonBlockingMode( sal_False );
+
+ ::osl::StreamSocket ssStreamConnection(aSocket);
+
+ char const * pBuffer = "Test String\n";
+ sal_Int32 nBufferSize = strlen(pBuffer);
+ sal_Int32 nWriteNumber = ssStreamConnection.write( pBuffer, nBufferSize );
+
+ // char * pBuffer2 = " ";
+ // sal_Int32 nReadNumber = ssStreamConnection.read( pBuffer2, strlen(pBuffer2) );
+
+ char const * pBuffer3 = "quit\n";
+ nBufferSize = strlen(pBuffer3);
+ nWriteNumber = ssStreamConnection.write( pBuffer3, nBufferSize );
+
+ ssStreamConnection.close();
+ }
+ aSocket.close();
+ }
+
+ void send_recv_2_margritte()
+ {
+ rtl::OString sAddr;
+ sAddr = "margritte.germany.sun.com";
+ if ( ifAvailable(rtl::OUString::createFromAscii(sAddr.getStr())) == sal_True )
+ {
+ t_print("found %s!\n", sAddr.getStr());
+ }
+ send_Connector_2_margritte(sAddr);
+ }
+
+ // -----------------------------------------------------------------------------
+
+ void send_recv()
+ {
+ rtl::OString sAddr;
+ // if ( ifAvailable(rtl::OUString::createFromAscii("margritte.germany")) == sal_True )
+ // {
+ // t_print("margritte is alive ! \n");
+ // sAddr = "margritte.germany";
+ // }
+
+ sAddr = "margritte.germany.sun.com";
+ if ( ifAvailable(rtl::OUString::createFromAscii(sAddr.getStr())) == sal_True )
+ {
+ t_print("found %s!\n", sAddr.getStr());
+ }
+// else
+// {
+// if ( ifAvailable(rtl::OUString::createFromAscii("192.168.7.2")) == sal_True )
+// {
+// sAddr = "192.168.7.2";
+// t_print("moon found ! \n");
+// }
+// else
+// {
+// if ( ifAvailable(rtl::OUString::createFromAscii("moon.linux.bogus")) == sal_True )
+// {
+// sAddr = "moon.linux.bogus";
+// t_print("moon found ! \n");
+// }
+// else
+// {
+// if ( ifAvailable(rtl::OUString::createFromAscii("moon")) == sal_True )
+// {
+// sAddr = "moon";
+// t_print("moon found ! \n");
+// }
+// }
+// }
+// }
+
+ // if ( ifAvailable(rtl::OUString::createFromAscii("10.16.64.196")) == sal_False )
+ // {
+ // t_print("ip 10.16.64.196 is not alive! \n");
+ // return;
+ // }
+
+ osl::Condition aCondition;
+ ReadSocket2Thread myReadThread(aCondition);
+ myReadThread.setAddr(sAddr);
+// myReadThread.create();
+
+ thread_sleep( 2 );
+ if (! myReadThread.getFailed())
+ {
+ // send_Acceptor(sAddr, aCondition);
+ send_Connector(sAddr, aCondition);
+
+ thread_sleep( 2 );
+ if (myReadThread.isRunning())
+ {
+ myReadThread.join();
+ }
+ // termAndJoinThread(&myReadThread);
+
+ // statistics
+ sal_uInt32 nLength = myReadThread.getCount();
+ bool bIsOk = myReadThread.isOk(); // check if the values are right.
+
+ t_print("Length:=%d\n", nLength);
+ t_print(" bIsOk:=%d\n", bIsOk);
+ }
+ else
+ {
+ t_print("ERROR: No echo Server on %s found.\n", sAddr.getStr());
+ }
+ }
+
+
+ void getPage(rtl::OString const& _sAddr);
+ void test_getPage()
+ {
+ // rtl::OString sPage("lla-1.germany.sun.com");
+ // getPage(sPage);
+
+ rtl::OString sPage("lla-1");
+ getPage(sPage);
+ }
+
+ CPPUNIT_TEST_SUITE( justtest );
+ CPPUNIT_TEST( send_recv );
+ CPPUNIT_TEST( test_getPage );
+ CPPUNIT_TEST_SUITE_END();
+ }; // class isExceptionPending
+
+
+ void justtest::getPage(rtl::OString const& _sAddr)
+ {
+ rtl::OUString suAddr = rtl::OUString::createFromAscii(_sAddr.getStr());
+ ::osl::ConnectorSocket aSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr aSocketAddr( suAddr, 80 );
+
+ {
+ // some checks
+ aSocketAddr.getPort();
+ oslSocketResult aResult;
+ rtl::ByteSequence aSeq = aSocketAddr.getAddr(&aResult);
+ if (aResult != osl_Socket_Ok)
+ {
+ t_print("problem with getAddr: ");
+ printSocketResult(aResult);
+ }
+
+ rtl::OUString sStr = aSocketAddr.getHostname(&aResult);
+ if (aResult != osl_Socket_Ok)
+ {
+ t_print("problem with hostname: ");
+ printSocketResult(aResult);
+ }
+ }
+
+ oslSocketResult aResult;
+
+ // SocketAddr::resolveHostname(suAddr, aSocketAddr);
+ // if (! aSocketAddr.is())
+ // {
+ // t_print("Can't resolve Hostname.\n");
+ // return;
+ // }
+ // rtl::OUString sStr = aSocketAddr.getHostname(&aResult);
+ // if (aResult != osl_Socket_Ok)
+ // {
+ // t_print("problem with hostname: ");
+ // printSocketResult(aResult);
+ //
+ // }
+
+ if (! aSocketAddr.is())
+ {
+ t_print("SocketAddr::is() failed.\n");
+ return;
+ }
+
+ //if has not set this option, socket addr can not be binded in some time(maybe 2 minutes) by another socket
+ aSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True;
+
+ aResult = aSocket.connect( aSocketAddr );
+ if ( aResult != osl_Socket_Ok )
+ {
+ t_print("# send_Connector: connect failed. \n" );
+ }
+ else
+ {
+ // blocking mode, if read/recv failed, block until success
+// aSocket.enableNonBlockingMode( sal_False );
+
+// _aCondition.set();
+
+ ::osl::StreamSocket ssStreamConnection(aSocket);
+
+ char const * pBuffer = "GET / HTTP/1.0\015\012\015\012";
+ sal_Int32 nBufferSize = strlen(pBuffer);
+ ssStreamConnection.write( pBuffer, nBufferSize );
+
+
+ char *pBufferPeek = (char*) malloc(1024);
+ sal_Int32 nReadNumber = 1;
+ while ( nReadNumber != 0)
+ {
+ nReadNumber = ssStreamConnection.recv( pBufferPeek, 1024, osl_Socket_MsgPeek);
+ if (nReadNumber > 0)
+ {
+ char *pBuffer2 = (char*) malloc(nReadNumber + 1);
+ sal_Int32 nReadNumberReal = ssStreamConnection.read( pBuffer2, nReadNumber );
+ pBuffer2[nReadNumberReal] = '\0';
+ t_print("%s", pBuffer2);
+ free(pBuffer2);
+ }
+ }
+ free(pBufferPeek);
+
+ // char * pBuffer3 = "quit\n";
+ // nBufferSize = strlen(pBuffer3);
+ // nWriteNumber = ssStreamConnection.write( pBuffer3, nBufferSize );
+
+ rtl::OUString suError = ssStreamConnection.getErrorAsString();
+ }
+ aSocket.shutdown(osl_Socket_DirReadWrite);
+ aSocket.close();
+ }
+
+// -----------------------------------------------------------------------------
+
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::ctors, "osl_StreamSocket");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::send_recv, "osl_StreamSocket");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::shutdown, "osl_StreamSocket");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::isExceptionPending, "osl_StreamSocket");
+
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(osl_StreamSocket::justtest, "osl_StreamSocket");
+
+} // namespace osl_StreamSocket
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/osl/socket/osl_StreamSocket.xsce b/sal/qa/osl/socket/osl_StreamSocket.xsce
new file mode 100644
index 000000000000..9c9513969d4a
--- /dev/null
+++ b/sal/qa/osl/socket/osl_StreamSocket.xsce
@@ -0,0 +1,4 @@
+osl_StreamSocket.send_recv.send_recv2
+osl_StreamSocket.send_recv.write_read_001 wntmsci unxsols
+osl_StreamSocket.justtest.test_getPage wntmsci
+
diff --git a/sal/qa/osl/socket/sockethelper.cxx b/sal/qa/osl/socket/sockethelper.cxx
new file mode 100644
index 000000000000..4568f042dc15
--- /dev/null
+++ b/sal/qa/osl/socket/sockethelper.cxx
@@ -0,0 +1,401 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include "sockethelper.hxx"
+#include <testshl/simpleheader.hxx>
+
+//------------------------------------------------------------------------
+// Ip version definition
+//------------------------------------------------------------------------
+#define IP_VER 4 /// currently only IPv4 is considered.
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+/** compare two OUString.
+*/
+sal_Bool compareUString( const ::rtl::OUString & ustr1, const ::rtl::OUString & ustr2 )
+{
+ sal_Bool bOk = ustr1.equalsIgnoreAsciiCase( ustr2 );
+
+ return bOk;
+}
+
+/** compare a OUString and an ASCII string.
+*/
+sal_Bool compareUString( const ::rtl::OUString & ustr, const sal_Char *astr )
+{
+ ::rtl::OUString ustr2 = rtl::OUString::createFromAscii( astr );
+ sal_Bool bOk = ustr.equalsIgnoreAsciiCase( ustr2 );
+
+ return bOk;
+}
+
+/** compare two socket address.
+*/
+sal_Bool compareSocketAddr( const ::osl::SocketAddr & addr1 , const ::osl::SocketAddr & addr2 )
+{
+ return ( ( sal_True == compareUString( addr1.getHostname( 0 ), addr2.getHostname( 0 ) ) ) && ( addr2.getPort( ) == addr2.getPort( ) ) );
+}
+
+/*char * oustring2char( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("oustring2char %s\n", aString.getStr( ) );
+ sal_Char * sStr = aString.getStr( );
+ return (char *)sStr;
+}*/
+
+/** print a UNI_CODE String. And also print some comments of the string.
+*/
+void printUString( const ::rtl::OUString & str, const char* msg)
+{
+ t_print("#%s #printUString_u# ", msg );
+ rtl::OString aString;
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ //char * sStr = aString.getStr( );
+ t_print("%s\n", aString.getStr( ) );
+}
+
+/** get the local host name.
+ mindy: gethostbyname( "localhost" ), on Linux, it returns the hostname in /etc/hosts + domain name,
+ if no entry in /etc/hosts, it returns "localhost" + domain name
+*/
+::rtl::OUString getHost( void )
+{
+ struct hostent *hptr;
+
+ hptr = gethostbyname( "localhost" );
+ OSL_ENSURE( hptr != NULL, "#In getHostname function, error on gethostbyname()" );
+ ::rtl::OUString aUString = ::rtl::OUString::createFromAscii( (const sal_Char *) hptr->h_name );
+
+ return aUString;
+}
+
+/** get the full host name of the current processor, such as "aegean.prc.sun.com" --mindyliu
+*/
+::rtl::OUString getThisHostname( void )
+{
+ ::rtl::OUString aUString;
+#ifdef WNT
+ struct hostent *hptr;
+ hptr = gethostbyname( "localhost" );
+ OSL_ENSURE( hptr != NULL, "#In getHostname function, error on gethostbyname()" );
+ rtl::OString sHostname(hptr->h_name);
+ aUString = ::rtl::OStringToOUString(sHostname, RTL_TEXTENCODING_ASCII_US);
+#else
+ char hostname[255];
+ if (gethostname(hostname, 255) != 0) {
+ OSL_ENSURE( false, "#Error: gethostname failed." );
+ }
+
+ struct hostent *hptr;
+ //first search /ets/hosts, then search from dns
+ hptr = gethostbyname( hostname);
+ if ( hptr != NULL )
+ {
+ strcpy( hostname, hptr->h_name );
+ }
+
+ t_print("hostname is %s \n", hostname );
+ rtl::OString sHostname( hostname );
+ aUString = ::rtl::OStringToOUString( sHostname, RTL_TEXTENCODING_ASCII_US );
+ aUString.getLength();
+#endif
+ return aUString;
+}
+
+/** get IP by name, search /etc/hosts first, then search from dns, fail return OUString("")
+*/
+::rtl::OUString getIPbyName( rtl::OString const& str_name )
+{
+ ::rtl::OUString aUString;
+ struct hostent *hptr;
+ //first search /ets/hosts, then search from dns
+ hptr = gethostbyname( str_name.getStr());
+ if ( hptr != NULL )
+ {
+ struct in_addr ** addrptr;
+ addrptr = (struct in_addr **) hptr->h_addr_list ;
+ //if there are more than one IPs on the same machine, we select one
+ for (; *addrptr; addrptr++)
+ {
+ t_print("#Local IP Address: %s\n", inet_ntoa(**addrptr));
+ aUString = ::rtl::OUString::createFromAscii( (sal_Char *) (inet_ntoa(**addrptr)) );
+ }
+ }
+ return aUString;
+}
+
+/** get local ethernet IP
+*/
+::rtl::OUString getLocalIP( )
+{
+ char hostname[255];
+ gethostname(hostname, 255);
+
+ return getIPbyName( hostname );
+}
+
+/** construct error message
+*/
+::rtl::OUString outputError( const ::rtl::OUString & returnVal, const ::rtl::OUString & rightVal, const sal_Char * msg )
+{
+ ::rtl::OUString aUString;
+ if ( returnVal.equals( rightVal ) )
+ return aUString;
+ aUString += ::rtl::OUString::createFromAscii(msg);
+ aUString += ::rtl::OUString::createFromAscii(": the returned value is '");
+ aUString += returnVal;
+ aUString += ::rtl::OUString::createFromAscii("', but the value should be '");
+ aUString += rightVal;
+ aUString += ::rtl::OUString::createFromAscii("'.");
+ return aUString;
+}
+
+/** wait _nSec seconds.
+*/
+void thread_sleep( sal_Int32 _nSec )
+{
+ /// print statement in thread process must use fflush() to force display.
+ // printf("wait %d seconds. ", _nSec );
+ // fflush(stdout);
+
+#ifdef WNT //Windows
+ Sleep( _nSec * 100 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ usleep(_nSec * 100000);
+#endif
+ // t_print("# done\n" );
+}
+
+/** print Boolean value.
+*/
+void printBool( sal_Bool bOk )
+{
+ t_print("printBool " );
+ ( sal_True == bOk ) ? t_print("YES!" ): t_print("NO!");
+ t_print("\n");
+}
+
+/** print content of a ByteSequence.
+*/
+void printByteSequence_IP( const ::rtl::ByteSequence & bsByteSeq, sal_Int32 nLen )
+{
+ t_print("ByteSequence is: " );
+ for ( int i = 0; i < nLen; i++ ){
+ if ( bsByteSeq[i] < 0 )
+ t_print("%d ", 256 + bsByteSeq[i] );
+ else
+ t_print("%d ", bsByteSeq[i] );
+ }
+ t_print(" .\n" );
+}
+
+/** convert an IP which is stored as a UString format to a ByteSequence array for later use.
+*/
+::rtl::ByteSequence UStringIPToByteSequence( ::rtl::OUString aUStr )
+{
+
+ rtl::OString aString = ::rtl::OUStringToOString( aUStr, RTL_TEXTENCODING_ASCII_US );
+ const sal_Char *pChar = aString.getStr( ) ;
+ sal_Char tmpBuffer[4];
+ sal_Int32 nCharCounter = 0;
+ ::rtl::ByteSequence bsByteSequence( IP_VER );
+ sal_Int32 nByteSeqCounter = 0;
+
+ for ( int i = 0; i < aString.getLength( ) + 1 ; i++ )
+ {
+ if ( ( *pChar != '.' ) && ( i !=aString.getLength( ) ) )
+ tmpBuffer[nCharCounter++] = *pChar;
+ else
+ {
+ tmpBuffer[nCharCounter] = '\0';
+ nCharCounter = 0;
+ bsByteSequence[nByteSeqCounter++] = static_cast<sal_Int8>(atoi( tmpBuffer ));
+ }
+ pChar++;
+ }
+ return bsByteSequence;
+}
+
+/** print a socket result name.
+*/
+void printSocketResult( oslSocketResult eResult )
+{
+ t_print("printSocketResult: " );
+ if (!eResult)
+ switch (eResult)
+ {
+ case osl_Socket_Ok:
+ t_print("client connected\n");
+ break;
+ case osl_Socket_Error:
+ t_print("got an error ... exiting\r\n\r\n" );
+ break;
+ case osl_Socket_TimedOut:
+ t_print("timeout\n");
+ break;
+ case osl_Socket_Interrupted:
+ t_print("interrupted\n");
+ break;
+ case osl_Socket_InProgress:
+ t_print("in progress\n");
+ break;
+ default:
+ t_print("unknown result\n");
+ break;
+ }
+}
+
+/** if 4 parts of an IP addr are equal to specified values
+*/
+sal_Bool ifIpv4is( const ::rtl::ByteSequence Ipaddr, sal_Int8 seq1, sal_Int8 seq2, sal_Int8 seq3, sal_Int8 seq4 )
+{
+ if ( ( Ipaddr[0] == seq1 ) && ( Ipaddr[1] == seq2 ) && ( Ipaddr[2] == seq3 ) && ( Ipaddr[3] == seq4 ) )
+ return sal_True;
+ return sal_False;
+}
+
+/** if the IP or hostname is availble( alive )
+*/
+/*sal_Bool ifAvailable( const char * stringAddrOrHostName )
+{
+ sal_Bool result;
+ int p[2];
+ sal_Char buffer[2000];
+ char stringhost[20];
+ strcpy(stringhost, stringAddrOrHostName );
+
+ result = sal_False;
+ if (pipe (p) == 0)
+ {
+ pid_t pid;
+ int nStatus;
+ pid = fork();
+ if (pid == 0)
+ {
+#if ( defined LINUX )
+ char *argv[] =
+ {
+ "/bin/ping",
+ "-c", "3",
+ "-W", "3",
+ stringhost,
+ NULL
+ };
+#endif
+#if ( defined SOLARIS )
+ char *argv[] =
+ {
+ "/usr/sbin/ping",
+ stringhost,
+ "3",
+ NULL
+ };
+#endif
+ close (p[0]);
+ dup2 (p[1], 1);
+ close (p[1]);
+#if ( defined LINUX )
+ execv ("/bin/ping", argv);
+#endif
+#if ( defined SOLARIS )
+ execv ("/usr/sbin/ping", argv);
+#endif
+ // arriving here means exec failed
+ _exit(-1);
+ }
+ else if (pid > 0)
+ {
+ sal_Int32 k = 0, n = 2000;
+ close (p[1]);
+ if ((k = read (p[0], buffer, n - 1)) > 0)
+ {
+ buffer[k] = 0;
+ if (buffer[k - 1] == '\n')
+ buffer[k - 1] = 0;
+#if ( defined LINUX )
+ char strOK[] = "bytes from";
+#endif
+#if ( defined SOLARIS )
+ char strOK[] = "is alive";
+#endif
+ if (strstr( buffer, strOK ) != NULL )
+ result = sal_True;
+ t_print("buffer is %s\n", buffer );
+ }
+ close (p[0]);
+ waitpid (pid, &nStatus, 0);
+ }
+ else
+ {
+ close (p[0]);
+ close (p[1]);
+ }
+
+ }
+ return result;
+}*/
+
+sal_Bool ifAvailable( rtl::OUString const& strAddrOrHostName )
+{
+ ::osl::ConnectorSocket aSocket( osl_Socket_FamilyInet, osl_Socket_ProtocolIp, osl_Socket_TypeStream );
+ ::osl::SocketAddr aSocketAddr( strAddrOrHostName, 7 );
+
+ if (! aSocketAddr.is())
+ {
+ aSocket.close();
+ return sal_False;
+ }
+
+ aSocket.setOption( osl_Socket_OptionReuseAddr, 1 ); //sal_True;
+
+ TimeValue *pTimeout;
+ pTimeout = ( TimeValue* )malloc( sizeof( TimeValue ) );
+ pTimeout->Seconds = 3;
+ pTimeout->Nanosec = 0;
+
+ oslSocketResult aResult = aSocket.connect( aSocketAddr, pTimeout );
+ free( pTimeout );
+ aSocket.close();
+ if ( aResult != osl_Socket_Ok )
+ {
+ t_print("Error: ");
+ printSocketResult(aResult);
+ t_print("\n");
+
+ return sal_False;
+ }
+ return sal_True;
+}
diff --git a/sal/qa/osl/socket/sockethelper.hxx b/sal/qa/osl/socket/sockethelper.hxx
new file mode 100644
index 000000000000..414447cca003
--- /dev/null
+++ b/sal/qa/osl/socket/sockethelper.hxx
@@ -0,0 +1,165 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SOCKETHELPER_HXX_
+#define _SOCKETHELPER_HXX_
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+#include <sal/types.h>
+#include <rtl/textenc.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustring.h>
+
+#ifndef _OSL_SOCLET_HXX_
+#include <osl/socket.hxx>
+#endif
+#include <osl/socket.h>
+
+#ifndef _OSL_THREAD_HXX
+#include <osl/thread.hxx>
+#endif
+
+#ifndef _OSL_FILE_HXX
+#include <osl/file.hxx>
+#endif
+
+#ifndef _OSL_MUTEX_HXX
+#include <osl/mutex.hxx>
+#endif
+#include <osl/time.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//------------------------------------------------------------------------
+// OS dependent declaration and includes
+//------------------------------------------------------------------------
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+
+#include <unistd.h>
+#include <limits.h>
+#include <string.h>
+#include <math.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/statfs.h>
+#include <sys/statvfs.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/wait.h>
+#endif
+
+#ifndef _OSL_SOCKET_CONST_H_
+
+#if ( defined WNT ) // Windows
+#include <tools/prewin.h>
+// #include <windows.h>
+#include <winsock.h>
+#include <string.h>
+#include <tools/postwin.h>
+#endif
+
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+}
+#endif
+
+/** compare two OUString.
+*/
+sal_Bool compareUString( const ::rtl::OUString & ustr1, const ::rtl::OUString & ustr2 );
+/** compare a OUString and an ASCII string.
+*/
+sal_Bool compareUString( const ::rtl::OUString & ustr, const sal_Char *astr );
+/** compare two socket address.
+*/
+sal_Bool compareSocketAddr( const ::osl::SocketAddr & addr1 , const ::osl::SocketAddr & addr2 );
+//char * oustring2char( const ::rtl::OUString & str );
+/** print a UNI_CODE String. And also print some comments of the string.
+*/
+void printUString( const ::rtl::OUString & str, const char * msg = "" );
+/** get the local host name.
+ mindy: gethostbyname( "localhost" ), on Linux, it returns the hostname in /etc/hosts + domain name,
+ if no entry in /etc/hosts, it returns "localhost" + domain name
+*/
+::rtl::OUString getHost( void );
+/** get the full host name of the current processor, such as "aegean.prc.sun.com" --mindyliu
+*/
+::rtl::OUString getThisHostname( void );
+/** get IP by name, search /etc/hosts first, then search from dns, fail return OUString("")
+*/
+::rtl::OUString getIPbyName( rtl::OString const& str_name );
+/** get local ethernet IP
+*/
+::rtl::OUString getLocalIP( );
+/** construct error message
+*/
+::rtl::OUString outputError( const ::rtl::OUString & returnVal, const ::rtl::OUString & rightVal, const sal_Char * msg = "");
+void thread_sleep( sal_Int32 _nSec );
+/** print Boolean value.
+*/
+void printBool( sal_Bool bOk );
+/** print content of a ByteSequence.
+*/
+void printByteSequence_IP( const ::rtl::ByteSequence & bsByteSeq, sal_Int32 nLen );
+/** convert an IP which is stored as a UString format to a ByteSequence array for later use.
+*/
+::rtl::ByteSequence UStringIPToByteSequence( ::rtl::OUString aUStr );
+/** print a socket result name.
+*/
+void printSocketResult( oslSocketResult eResult );
+/** if 4 parts of an IP addr are equal to specified values
+*/
+sal_Bool ifIpv4is( const ::rtl::ByteSequence Ipaddr, sal_Int8 seq1, sal_Int8 seq2, sal_Int8 seq3, sal_Int8 seq4 );
+/** if the IP or hostname is availble( alive )
+*/
+//sal_Bool ifAvailable( const char * stringAddrOrHostName );
+sal_Bool ifAvailable( rtl::OUString const& strAddrOrHostName );
+/*
+class ClientSocketThread : public Thread
+class ServerSocketThread : public Thread
+class ValueCheckProvider
+class ClientReadSocketThread : public Thread
+class ServerWriteSocketThread : public Thread
+class AcceptorThread : public Thread
+class CloseSocketThread : public Thread
+
+*/
+
+#endif
diff --git a/sal/qa/osl/thread/makefile.mk b/sal/qa/osl/thread/makefile.mk
new file mode 100644
index 000000000000..033e8f829b55
--- /dev/null
+++ b/sal/qa/osl/thread/makefile.mk
@@ -0,0 +1,52 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ := ..$/..$/..
+PRJNAME := sal
+TARGET := qa_osl_thread
+
+ENABLE_EXCEPTIONS := TRUE
+
+.INCLUDE: settings.mk
+
+DLLPRE = # no leading "lib" on .so files
+
+SHL1TARGET = $(TARGET)
+SHL1OBJS = $(SLO)$/test_thread.obj
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+SHL1VERSIONMAP = version.map
+SHL1IMPLIB = i$(SHL1TARGET)
+DEF1NAME = $(SHL1TARGET)
+
+SLOFILES = $(SHL1OBJS)
+
+.INCLUDE: target.mk
+
+ALLTAR: test
+
+test .PHONY: $(SHL1TARGETN)
+ testshl2 $(SHL1TARGETN)
diff --git a/sal/qa/osl/thread/test_thread.cxx b/sal/qa/osl/thread/test_thread.cxx
new file mode 100644
index 000000000000..8a0c25e8df5b
--- /dev/null
+++ b/sal/qa/osl/thread/test_thread.cxx
@@ -0,0 +1,89 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "sal/config.h"
+
+#include "testshl/simpleheader.hxx"
+#include "osl/conditn.hxx"
+#include "osl/thread.hxx"
+#include "osl/time.h"
+#include "sal/types.h"
+
+namespace {
+
+osl::Condition global;
+
+class Thread: public osl::Thread {
+public:
+ explicit Thread(osl::Condition & cond): m_cond(cond) {}
+
+private:
+ virtual void SAL_CALL run() {}
+
+ virtual void SAL_CALL onTerminated() {
+ m_cond.set();
+ CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, global.wait());
+ }
+
+ osl::Condition & m_cond;
+};
+
+class Test: public CppUnit::TestFixture {
+public:
+ // Nondeterministic, best effort test that an osl::Thread can be destroyed
+ // (and in particular osl_destroyThread---indirectly---be called) before the
+ // corresponding thread has terminated:
+ void test() {
+ for (int i = 0; i < 50; ++i) {
+ osl::Condition c;
+ Thread t(c);
+ CPPUNIT_ASSERT(t.create());
+ // Make sure virtual Thread::run/onTerminated are called before
+ // Thread::~Thread:
+ CPPUNIT_ASSERT_EQUAL(osl::Condition::result_ok, c.wait());
+ }
+ // Make sure Thread::~Thread is called before each spawned thread
+ // terminates:
+ global.set();
+ // Give the spawned threads enough time to terminate:
+ TimeValue const twentySeconds = { 20, 0 };
+ osl::Thread::wait(twentySeconds);
+ }
+
+ CPPUNIT_TEST_SUITE(Test);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(Test, "alltests");
+
+}
+
+NOADDITIONAL;
diff --git a/sal/qa/osl/thread/version.map b/sal/qa/osl/thread/version.map
new file mode 100644
index 000000000000..7321bbca16ad
--- /dev/null
+++ b/sal/qa/osl/thread/version.map
@@ -0,0 +1,34 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+UDK_3_0_0 {
+ global:
+ registerAllTestFunction;
+
+ local:
+ *;
+};
diff --git a/sal/qa/rtl/alloc/jobfile.txt b/sal/qa/rtl/alloc/jobfile.txt
new file mode 100755
index 000000000000..012ae24b4439
--- /dev/null
+++ b/sal/qa/rtl/alloc/jobfile.txt
@@ -0,0 +1,8 @@
+# JobFile for rtl_alloc
+# header source sal/inc/rtl/alloc.h
+
+rtl_alloc.test.rtl_allocateMemory_001
+rtl_alloc.test.rtl_reallocateMemory_001
+rtl_alloc.test.rtl_freeMemory_001
+rtl_alloc.test.rtl_allocateZeroMemory_001
+
diff --git a/sal/qa/rtl/alloc/makefile.mk b/sal/qa/rtl/alloc/makefile.mk
new file mode 100755
index 000000000000..db4f01eb439b
--- /dev/null
+++ b/sal/qa/rtl/alloc/makefile.mk
@@ -0,0 +1,68 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_alloc
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:jobfile by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_alloc.obj
+
+SHL1TARGET= rtl_Alloc
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:jobfile
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/alloc/rtl_alloc.cxx b/sal/qa/rtl/alloc/rtl_alloc.cxx
new file mode 100755
index 000000000000..b6ed4d53eb91
--- /dev/null
+++ b/sal/qa/rtl/alloc/rtl_alloc.cxx
@@ -0,0 +1,179 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// autogenerated file with codegen.pl
+
+#include <rtl/alloc.h>
+#include <testshl/simpleheader.hxx>
+
+namespace rtl_alloc
+{
+
+ // small memory check routine, which return false, if there is a problem
+
+ bool checkMemory(char* _pMemory, sal_uInt32 _nSize, char _n)
+ {
+ bool bOk = true;
+
+ for (sal_uInt32 i=0;i<_nSize;i++)
+ {
+ if (_pMemory[i] != _n)
+ {
+ bOk = false;
+ }
+ }
+ return bOk;
+ }
+
+class Memory : public CppUnit::TestFixture
+{
+ // for normal alloc functions
+ char *m_pMemory;
+ sal_uInt32 m_nSizeOfMemory;
+
+public:
+ Memory()
+ :m_pMemory(NULL),
+ m_nSizeOfMemory(50 * 1024 * 1024)
+ {
+ }
+
+ // initialise your test code values here.
+ void setUp()
+ {
+ t_print("allocate memory\n");
+ m_pMemory = (char*) rtl_allocateMemory( m_nSizeOfMemory );
+ }
+
+ void tearDown()
+ {
+ t_print("free memory\n");
+ rtl_freeMemory(m_pMemory);
+ m_pMemory = NULL;
+ }
+
+ // insert your test code here.
+ void rtl_allocateMemory_001()
+ {
+ // this is demonstration code
+ // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
+
+ CPPUNIT_ASSERT_MESSAGE( "Can get zero memory.", m_pMemory != NULL);
+ memset(m_pMemory, 1, m_nSizeOfMemory);
+ CPPUNIT_ASSERT_MESSAGE( "memory contains wrong value.", checkMemory(m_pMemory, m_nSizeOfMemory, 1) == true);
+ }
+
+ void rtl_reallocateMemory_001()
+ {
+ t_print("reallocate memory\n");
+ sal_uInt32 nSize = 10 * 1024 * 1024;
+ m_pMemory = (char*)rtl_reallocateMemory(m_pMemory, nSize);
+
+ CPPUNIT_ASSERT_MESSAGE( "Can reallocate memory.", m_pMemory != NULL);
+ memset(m_pMemory, 2, nSize);
+ CPPUNIT_ASSERT_MESSAGE( "memory contains wrong value.", checkMemory(m_pMemory, nSize, 2) == true);
+ }
+
+ // void rtl_freeMemory_001()
+ // {
+ // // CPPUNIT_ASSERT_STUB();
+ // }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(Memory);
+ CPPUNIT_TEST(rtl_allocateMemory_001);
+ CPPUNIT_TEST(rtl_reallocateMemory_001);
+ // CPPUNIT_TEST(rtl_freeMemory_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class test
+
+class ZeroMemory : public CppUnit::TestFixture
+{
+ // for zero functions
+ char *m_pZeroMemory;
+ sal_uInt32 m_nSizeOfZeroMemory;
+
+public:
+ ZeroMemory()
+ :m_pZeroMemory(NULL),
+ m_nSizeOfZeroMemory( 50 * 1024 * 1024 )
+ {
+ }
+
+ // initialise your test code values here.
+ void setUp()
+ {
+ t_print("allocate zero memory\n");
+ m_pZeroMemory = (char*) rtl_allocateZeroMemory( m_nSizeOfZeroMemory );
+ }
+
+ void tearDown()
+ {
+ t_print("free zero memory\n");
+ rtl_freeZeroMemory(m_pZeroMemory, m_nSizeOfZeroMemory);
+ // LLA: no check possible, may GPF if there is something wrong.
+ // CPPUNIT_ASSERT_MESSAGE( "Can get zero memory.", pZeroMemory != NULL);
+ }
+
+ // insert your test code here.
+
+ void rtl_allocateZeroMemory_001()
+ {
+ CPPUNIT_ASSERT_MESSAGE( "Can get zero memory.", m_pZeroMemory != NULL);
+ CPPUNIT_ASSERT_MESSAGE( "memory contains wrong value.", checkMemory(m_pZeroMemory, m_nSizeOfZeroMemory, 0) == true);
+
+ memset(m_pZeroMemory, 3, m_nSizeOfZeroMemory);
+ CPPUNIT_ASSERT_MESSAGE( "memory contains wrong value.", checkMemory(m_pZeroMemory, m_nSizeOfZeroMemory, 3) == true);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(ZeroMemory);
+ CPPUNIT_TEST(rtl_allocateZeroMemory_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class test
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_alloc::Memory, "rtl_alloc");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_alloc::ZeroMemory, "rtl_alloc");
+} // namespace rtl_alloc
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
diff --git a/sal/qa/rtl/bootstrap/bootstrap_process.cxx b/sal/qa/rtl/bootstrap/bootstrap_process.cxx
new file mode 100644
index 000000000000..85dbfa90b4a3
--- /dev/null
+++ b/sal/qa/rtl/bootstrap/bootstrap_process.cxx
@@ -0,0 +1,118 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <stdlib.h>
+#include <stdio.h>
+#include "sal/main.h"
+#include <rtl/bootstrap.hxx>
+#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
+
+using namespace ::rtl;
+
+// ----------------------------------- Main -----------------------------------
+SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
+{
+ (void)argc;
+ Bootstrap aBootstrap;
+ //custom .ini/rc file
+ Bootstrap aBs_custom( OUString::createFromAscii(argv[3]) );
+ OUString suValue;
+ OUString suDefault( OUString::createFromAscii("mydefault") );
+ int flag = atoi( argv[1] );
+
+ switch( flag ) {
+ case 1:
+ // parameters may be passed by command line arguments
+ aBootstrap.getFrom(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("UNO_SERVICES")),
+ suValue );
+ if (suValue.equalsAscii("service.rdb") )
+ {
+ return 10;
+ }
+ else
+ return 11;
+ case 2:
+ // parameters may be passed by ini file
+ aBootstrap.getFrom(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("EXECUTABLE_RC")),
+ suValue );
+ if (suValue.equalsAscii("true") )
+ {
+ return 20;
+ }
+ else
+ return 21;
+ case 3:
+ // parameters may be passed by command line arguments
+ aBootstrap.getFrom(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("QADEV_BOOTSTRAP")),
+ suValue );
+ if (suValue.equalsAscii("sun&ms") )
+ {
+ return 30;
+ }
+ else
+ return 31;
+ case 4:
+ // parameters may be passed by custom .ini/rc file
+ aBs_custom.getFrom(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("RTLVALUE")),
+ suValue );
+ if (suValue.equalsAscii("qadev17") )
+ {
+ return 40;
+ }
+ else
+ return 41;
+ case 5:
+ // parameters may be passed by inheritance
+ aBs_custom.getFrom(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("EXECUTABLE_RC")),
+ suValue );
+ if (suValue.equalsAscii("true") )
+ {
+ return 50;
+ }
+ else
+ return 51;
+ default:
+ // parameters may be passed by inheritance
+ aBs_custom.getFrom(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("ABCDE")),
+ suValue, suDefault );
+ if (suValue.equalsAscii("mydefault") )
+ {
+ return 60;
+ }
+ else
+ return 61;
+ }
+}
diff --git a/sal/qa/rtl/bootstrap/makefile.mk b/sal/qa/rtl/bootstrap/makefile.mk
new file mode 100644
index 000000000000..d32f9db35383
--- /dev/null
+++ b/sal/qa/rtl/bootstrap/makefile.mk
@@ -0,0 +1,90 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=rtl_bootstrap
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+.IF "$(GUI)"=="WNT"
+#BOOTSTRAPSCRIPT=bootstrap.bat
+BOOTSTRAPINI=testshl2.ini
+MY_SCRIPTCAT=cat
+.ELSE
+#BOOTSTRAPSCRIPT=bootstrap
+BOOTSTRAPINI=testshl2rc
+MY_SCRIPTCAT=tr -d "\015" <
+.ENDIF
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:joblist by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_Bootstrap.obj
+
+SHL1TARGET= rtl_Bootstrap
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# END ------------------------------------------------------------------
+
+OBJ2FILES=$(OBJ)$/bootstrap_process.obj
+APP2TARGET=bootstrap_process
+APP2OBJS=$(OBJ2FILES)
+
+# .IF "$(GUI)" == "UNX"
+# APP2STDLIBS=$(LB)$/libsal.so
+# .ENDIF
+# .IF "$(GUI)" == "WNT"
+# APP2STDLIBS=$(KERNEL32LIB) $(LB)$/isal.lib
+# .ENDIF
+APP2STDLIBS=$(SALLIB)
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/bootstrap/rtl_Bootstrap.cxx b/sal/qa/rtl/bootstrap/rtl_Bootstrap.cxx
new file mode 100644
index 000000000000..efaa7dc531bc
--- /dev/null
+++ b/sal/qa/rtl/bootstrap/rtl_Bootstrap.cxx
@@ -0,0 +1,1040 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+// Documentation about bootstraping can be found at:
+// http://udk.openoffice.org/common/man/concept/micro_deployment.html
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <algorithm> // STL
+
+#include "testshl/stringhelper.hxx"
+
+#include <testshl/simpleheader.hxx>
+//#include "stringhelper.hxx"
+//#include "valueequal.hxx"
+#include <rtl/bootstrap.hxx>
+
+#include <rtl/ustrbuf.hxx>
+#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
+#include <osl/file.hxx>
+#include <osl/module.hxx>
+#include <osl/process.h> /* osl_getExecutableFile() */
+
+#include <osl/thread.hxx>
+
+// using namespace osl;
+using namespace rtl;
+
+#define TESTSHL2_INI "testshl2"
+#define PSEUDO_INI "pseudo"
+
+/** print a UNI_CODE String. And also print some comments of the string.
+ */
+inline void printUString( const ::rtl::OUString & str, const sal_Char * msg = "" )
+{
+
+ if (strlen(msg) > 0)
+ {
+ t_print("%s: ", msg );
+ }
+ rtl::OString aString;
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", (char *)aString.getStr( ) );
+}
+
+/** if the file exist
+ */
+bool t_fileExist(rtl::OUString const& _sFilename)
+{
+ ::osl::FileBase::RC nError1;
+ ::osl::File aTestFile( _sFilename );
+ nError1 = aTestFile.open ( OpenFlag_Read );
+ if ( ( ::osl::FileBase::E_NOENT != nError1 ) && ( ::osl::FileBase::E_ACCES != nError1 ) )
+ {
+ aTestFile.close( );
+ return true;
+ }
+ return false;
+}
+
+/** get the exectutable path ( here is bootstrap_process), on Linux, such as "sal/unxlngi4.pro/bin/"
+ */
+inline ::rtl::OUString getModulePath( void )
+{
+ ::rtl::OUString suDirPath;
+ ::osl::Module::getUrlFromAddress( ( oslGenericFunction ) &getModulePath, suDirPath );
+
+ suDirPath = suDirPath.copy( 0, suDirPath.lastIndexOf('/') );
+ suDirPath = suDirPath.copy( 0, suDirPath.lastIndexOf('/') + 1);
+ suDirPath += rtl::OUString::createFromAscii("bin");
+ return suDirPath;
+}
+
+#define TESTSHL2_INI "testshl2"
+#define PSEUDO_INI "pseudo"
+
+
+static rtl::OUString getExecutableDirectory()
+{
+ rtl::OUString fileName;
+ osl_getExecutableFile(&fileName.pData);
+
+ sal_Int32 nDirEnd = fileName.lastIndexOf('/');
+
+ OSL_ENSURE(nDirEnd >= 0, "Cannot locate executable directory");
+
+ rtl::OUString aDirURL = fileName.copy(0, nDirEnd);
+ return aDirURL;
+}
+
+
+// get the URL of testshl2rc/rtlrc/pseudorc
+inline rtl::OUString t_getSourcePath(rtl::OString const& _sFilename)
+{
+
+ rtl::OUString aDirURL(getExecutableDirectory());
+ aDirURL += OUString::createFromAscii( "/");
+ aDirURL += OUString::createFromAscii( _sFilename.getStr() );
+#if defined(WNT) || defined(OS2)
+ aDirURL += rtl::OUString::createFromAscii(".ini");
+#else
+ aDirURL += rtl::OUString::createFromAscii("rc");
+#endif
+ return aDirURL;
+
+// LLA: does not right work on my personal laptop, SRC_ROOT does not show where the source is :-(.
+/*
+ sal_Char * pStr = getenv("SRC_ROOT");
+ rtl::OUString suPath;
+ if (filename != "")
+ {
+ suPath = rtl::OUString::createFromAscii(pStr) + rtl::OUString::createFromAscii( "/sal/qa/rtl/bootstrap/" )
+ + rtl::OUString::createFromAscii( filename );
+ }
+ else
+ {
+ suPath = rtl::OUString::createFromAscii(pStr) + rtl::OUString::createFromAscii( "/sal/qa/rtl/bootstrap" );
+ }
+ rtl::OUString suURL;
+ ::osl::FileBase::getFileURLFromSystemPath( suPath, suURL );
+ return suURL;
+*/
+}
+
+void thread_sleep_tenth_sec(sal_Int32 _nTenthSec)
+{
+#ifdef WNT //Windows
+ Sleep(_nTenthSec * 100 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ TimeValue nTV;
+ nTV.Seconds = static_cast<sal_uInt32>( _nTenthSec/10 );
+ nTV.Nanosec = ( (_nTenthSec%10 ) * 100000000 );
+ osl_waitThread(&nTV);
+#endif
+}
+
+// -----------------------------------------------------------------------------
+
+namespace rtl_Bootstrap
+{
+ class ctor : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // ctor with ini name
+ void ctor_001()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ printUString( suIniname );
+ Bootstrap aBootstrap( suIniname );
+ rtl::OUString suGetname; // = rtl::OUString::createFromAscii("");
+ aBootstrap.getIniName( suGetname );
+ printUString( suGetname );
+
+ // LLA: first: this seems to be a wrong test.
+ // second: there seems to be a design hole, if I give a absolute path ini file,
+ // but try to use ${file::KEYVALUE} than 'file' will only used out of the 'executable path'/file
+ // not from the path given from the absolute path.
+
+ // Due to the fact, we create at this position a file (createTestshl2rc() ), we check for existance
+ bool bFileExist = t_fileExist( suGetname );
+ CPPUNIT_ASSERT_MESSAGE("ctor error with initial file.", bFileExist == true );
+ }
+
+ void ctor_002()
+ {
+ rtl::Bootstrap aBootstrap;
+ rtl::OUString suGetname;
+ aBootstrap.getIniName( suGetname );
+ printUString( suGetname );
+ CPPUNIT_ASSERT_MESSAGE("ctor error without initial file.", suGetname.getLength() != 0 );
+ }
+
+ CPPUNIT_TEST_SUITE(ctor);
+ CPPUNIT_TEST(ctor_001);
+ CPPUNIT_TEST(ctor_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ctor
+
+ class getFrom : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+ // get the value of env variable
+ void getFrom_001()
+ {
+ Bootstrap aBootstrap;
+ rtl::OUString suValue;
+ rtl::OUString suValuename = rtl::OUString::createFromAscii( "SOLAR_JAVA" );
+ //aBootstrap.getFrom( suValuename, suValue );
+ aBootstrap.getFrom( suValuename, suValue );
+ sal_Char * pStr = getenv("SOLAR_JAVA");
+ // printUString( suGetname );
+ CPPUNIT_ASSERT_MESSAGE("get the value of environment variable.", suValue.compareToAscii( pStr ) == 0 );
+ }
+ /* Notes on Windows:
+ void getFrom_001_1()
+ {
+ Bootstrap aBootstrap;
+ rtl::OUString suValue;
+ rtl::OUString suValuename = rtl::OUString::createFromAscii( "SRC_ROOT" );
+ //aBootstrap.getFrom( suValuename, suValue );
+ aBootstrap.getFrom( suValuename, suValue );
+ sal_Char * pStr = getenv("SRC_ROOT");
+ // printUString( suGetname );
+ CPPUNIT_ASSERT_MESSAGE("get the value of environment variable.", suValue.compareToAscii( pStr ) == 0 );
+ }
+ The result on Windows:
+ # # the SRC_ROOT is e:\Qadev\cvs\m19
+ # # suValue is e:Qadevcvsm19
+ reason:
+ The problem is that the internally getenv()ed variable SRC_ROOT is macro expanded,
+ thus every \ will introduce an escape.
+ */
+
+ // get the value of a variable in ini file
+ void getFrom_002()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ Bootstrap aBootstrap( suIniname );
+ rtl::OUString suGetname;
+ rtl::OUString suValuename = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
+ aBootstrap.getFrom( suValuename, suGetname );
+ printUString( suGetname );
+ CPPUNIT_ASSERT_MESSAGE("get the value of a variable in ini file.", suGetname.getLength() != 0 );
+ }
+
+ //use defaut value
+ void getFrom_003()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ Bootstrap aBootstrap( suIniname );
+ rtl::OUString suGetname;
+ rtl::OUString suValuename = rtl::OUString::createFromAscii( "MY_VALUE" );
+ rtl::OUString myDefault = rtl::OUString::createFromAscii( "2" );
+ aBootstrap.getFrom( suValuename, suGetname, myDefault );
+ //printUString( suGetname );
+ CPPUNIT_ASSERT_MESSAGE("getFrom use default.", suGetname.compareTo( myDefault ) == 0 );
+ }
+
+ void getFrom_004()
+ {
+ t_print("1\n");
+ // initialise Bootstrap with an own ini file
+ // PSEUDO_INI is pseudo(rc|.ini) created be create_pseudorc()
+ rtl::OUString suIniname = t_getSourcePath(PSEUDO_INI);
+ Bootstrap aBootstrap( suIniname );
+
+ rtl::OUString suGetIniName;
+ aBootstrap.getIniName( suGetIniName );
+
+ printUString(suGetIniName, "Current bootstrap file");
+ sal_Int32 nIndex = suGetIniName.indexOf(rtl::OUString::createFromAscii( "pseudo" ));
+ CPPUNIT_ASSERT_MESSAGE("ini name must have 'pseudo' in name.", nIndex > 0);
+
+ // rtlBootstrapHandle bsHandle = aBootstrap.getHandle();
+ // CPPUNIT_ASSERT_MESSAGE("getHandle return NULL!", bsHandle != 0);
+
+ rtl::OUString suValue;
+ rtl::OUString suKeyName = rtl::OUString::createFromAscii( "FILE" );
+ aBootstrap.getFrom( suKeyName, suValue );
+ printUString( suValue );
+ sal_Int32 nCompare = suValue.compareTo( rtl::OUString::createFromAscii("pseudo file") );
+
+ CPPUNIT_ASSERT_MESSAGE("<Bootstrap('pseudo')>.getFrom('FILE', ...) result is unexpected.", nCompare == 0);
+ }
+ void getFrom_004_1()
+ {
+ // get the same key out of the default context
+ rtl::OUString suKeyName = rtl::OUString::createFromAscii( "FILE" );
+ rtl::OUString suGetValue;
+ Bootstrap::get( suKeyName, suGetValue );
+ printUString( suGetValue );
+
+ CPPUNIT_ASSERT_MESSAGE("Bootstrap::get('FILE', ...)", suGetValue.compareTo( rtl::OUString::createFromAscii("testshl2 file") ) == 0 );
+ }
+
+ /** helper function: return the child process's ret value( typedef sal_uInt32 oslProcessExitCode;)
+ * param1 is the process's name(only file name, not include path)
+ */
+ oslProcessExitCode ini_execProcess( const sal_Char* process_name, const sal_Char * flag )
+ {
+ rtl::OUString suCWD = getModulePath();
+ oslProcess hProcess = NULL;
+ rtl::OUString suFileURL = suCWD;
+ suFileURL += rtl::OUString::createFromAscii("/") + rtl::OUString::createFromAscii(process_name) ;
+#if defined(WNT) || defined(OS2)
+ suFileURL += rtl::OUString::createFromAscii(".exe");
+#endif
+ const int nParameterCount = 3;
+ rtl_uString* pParameters[ nParameterCount ];
+ OUString suFlag( OUString::createFromAscii(flag) );
+ OUString suEnv1( OUString::createFromAscii("-env:UNO_SERVICES=service.rdb"));
+ OUString suIniname = t_getSourcePath("rtl");
+ printUString( suIniname, "rtl path:");
+ //OUString suEnv2( OUString::createFromAscii("-env:MYENV=bootstrap_process"));
+
+ pParameters[0] = suFlag.pData;
+ pParameters[1] = suEnv1.pData;
+ // the custom ini/rc file's URL
+ pParameters[2] = suIniname.pData;
+
+ oslProcessError osl_error = osl_executeProcess(
+ suFileURL.pData,
+ pParameters,
+ nParameterCount,
+ osl_Process_WAIT,
+ 0,
+ suCWD.pData,
+ NULL,
+ 0,
+ &hProcess );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+ osl_joinProcess(hProcess);
+ oslProcessInfo* pInfo = new oslProcessInfo;
+ pInfo->Size = sizeof( oslProcessInfo );
+ osl_error = osl_getProcessInfo( hProcess, osl_Process_EXITCODE, pInfo );
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_getProcessInfo returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ t_print("the exit code is %d.\n", pInfo->Code );
+ oslProcessExitCode nCode = pInfo->Code;
+ delete pInfo;
+ return nCode;
+ }
+
+ void getFrom_005_1()
+ {
+ oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "1" );
+ CPPUNIT_ASSERT_MESSAGE("Parameters passed by command line can not be gotten!",
+ nExitCode == 10 );
+ }
+ void getFrom_005_2()
+ {
+ oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "2" );
+ CPPUNIT_ASSERT_MESSAGE("Parameters passed by .ini/rc file can not be gotten!",
+ nExitCode == 20 );
+ }
+ void getFrom_005_3()
+ {
+#if (defined WNT) || (defined SOLARIS)
+ putenv(const_cast< char * >("QADEV_BOOTSTRAP=sun&ms"));
+#else
+ setenv("QADEV_BOOTSTRAP", "sun&ms", 0);
+#endif
+ oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "3" );
+ CPPUNIT_ASSERT_MESSAGE("Parameters passed by environment variables can not be gotten!",
+ nExitCode == 30 );
+ }
+ void getFrom_005_4()
+ {
+ oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "4" );
+ CPPUNIT_ASSERT_MESSAGE("Parameters passed by customed .ini/rc file can not be gotten!",
+ nExitCode == 40 );
+ }
+ void getFrom_005_5()
+ {
+ oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "5" );
+ CPPUNIT_ASSERT_MESSAGE("Parameters passed by inheritance can not be gotten!",
+ nExitCode == 50 );
+ }
+ void getFrom_005_6()
+ {
+ oslProcessExitCode nExitCode = ini_execProcess( "bootstrap_process", "6" );
+ CPPUNIT_ASSERT_MESSAGE("Parameters passed by default can not be gotten!",
+ nExitCode == 60 );
+ }
+
+ CPPUNIT_TEST_SUITE(getFrom);
+ CPPUNIT_TEST(getFrom_001);
+ CPPUNIT_TEST(getFrom_002);
+ CPPUNIT_TEST(getFrom_003);
+ CPPUNIT_TEST(getFrom_004);
+ CPPUNIT_TEST(getFrom_004_1);
+ CPPUNIT_TEST(getFrom_005_1);
+ CPPUNIT_TEST(getFrom_005_2);
+ CPPUNIT_TEST(getFrom_005_3);
+ CPPUNIT_TEST(getFrom_005_4);
+ CPPUNIT_TEST(getFrom_005_5);
+ CPPUNIT_TEST(getFrom_005_6);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class getFrom
+
+ class setIniFilename : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void setIniFilename_001()
+ {
+ Bootstrap aBootstrap;
+
+ rtl::OUString suGetIniname;
+ aBootstrap.getIniName( suGetIniname );
+ //which should be .....testshl2rc
+ //printUString( suGetIniname );
+
+ rtl::OUString suIniname = t_getSourcePath(PSEUDO_INI);
+ Bootstrap::setIniFilename( suIniname );
+
+ rtl::OUString suGetname;
+ aBootstrap.getIniName( suGetname );
+
+ printUString( suGetname );
+ CPPUNIT_ASSERT_MESSAGE("setIniFilename then get it.", suGetname.compareTo( suIniname ) == 0
+ && suGetname.compareTo( suGetIniname ) != 0 );
+ }
+
+ void setIniFilename_002()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ // CPPUNIT_ASSERT_MESSAGE("test failed, Bootstrap ini does not exist.", t_fileExist(suIniname ) == true);
+
+ Bootstrap::setIniFilename( suIniname );
+ //rtl_bootstrap_args_open( suIniname.pData );
+ rtl::OUString suGetname;
+ rtl::OUString suValuename = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
+ //aBootstrap.getFrom( suValuename, suGetname );
+ Bootstrap::get( suValuename, suGetname );
+ printUString( suGetname );
+ CPPUNIT_ASSERT_MESSAGE("setIniFilename and get value of the argument.", suGetname.getLength() != 0 );
+ }
+
+ CPPUNIT_TEST_SUITE(setIniFilename);
+ CPPUNIT_TEST(setIniFilename_001);
+ CPPUNIT_TEST(setIniFilename_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class setIniFilename
+
+ class getHandle : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void getHandle_001()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ Bootstrap aBootstrap;
+ rtlBootstrapHandle bsHandle = aBootstrap.getHandle();
+ CPPUNIT_ASSERT_MESSAGE("getHandle should return 0 if the bootstrap has no ini file!", bsHandle == 0 );
+ }
+ void getHandle_002()
+ {
+ rtl::OUString suIniname = t_getSourcePath(PSEUDO_INI);
+ Bootstrap aBootstrap( suIniname );
+
+ rtlBootstrapHandle bsHandle = aBootstrap.getHandle();
+ CPPUNIT_ASSERT_MESSAGE("getHandle return NULL!", bsHandle != 0);
+
+ //rtl::OUString iniName;
+ //rtl_bootstrap_get_iniName_from_handle( bsHandle, &iniName.pData );
+
+ rtl::OUString suValue;
+ rtl::OUString suKeyName = rtl::OUString::createFromAscii( "PSEUDOFILE" );
+ rtl_bootstrap_get_from_handle(bsHandle, suKeyName.pData, &suValue.pData, NULL);
+ printUString( suValue);
+
+ CPPUNIT_ASSERT_MESSAGE("Can not use the handle which is returned by getHandle!", suValue.equals( rtl::OUString::createFromAscii("be pseudo") ) == sal_True );
+
+ // CPPUNIT_ASSERT_MESSAGE("Can not use the handle which is returned by getHandle!",
+ // suGetname.equalsIgnoreAsciiCase( iniName ) == sal_True );
+ }
+
+ CPPUNIT_TEST_SUITE(getHandle);
+ CPPUNIT_TEST(getHandle_001);
+ CPPUNIT_TEST(getHandle_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class getHandle
+
+ class set : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void set_001()
+ {
+ //in ini fle, INHERITED_VALUE=inherited_value
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ Bootstrap aBootstrap( suIniname);
+ rtl::OUString suName = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
+ rtl::OUString suValue = rtl::OUString::createFromAscii( "ok" );
+ // set to another value
+ Bootstrap::set( suName, suValue );
+ rtl::OUString suGetValue;
+ Bootstrap::get( suName, suGetValue);
+ CPPUNIT_ASSERT_MESSAGE("set and get argument failed.", suGetValue.compareTo(suValue) == 0 );
+ }
+ void set_002()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ Bootstrap myBootstrap( suIniname);
+ rtl::OUString suName = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
+ rtl::OUString suGetOrientValue;
+ Bootstrap::get( suName, suGetOrientValue);
+ // ?? INHERITED_VALUE = ok now, which is set in set_001
+ printUString( suGetOrientValue );
+
+ rtl::OUString suValue = rtl::OUString::createFromAscii( TESTSHL2_INI );
+ // set to another value
+ Bootstrap::set( suName, suValue );
+ rtl::OUString suGetValue;
+ Bootstrap::get( suName, suGetValue);
+ CPPUNIT_ASSERT_MESSAGE("set and get argument failed.", suGetValue.compareTo(suValue) == 0 );
+ }
+
+ CPPUNIT_TEST_SUITE(set);
+ CPPUNIT_TEST(set_001);
+ CPPUNIT_TEST(set_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class set
+
+ class expandMacrosFrom : public CppUnit::TestFixture
+ {
+ public:
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+ void expandMacrosFrom_001()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ Bootstrap aBootstrap( suIniname);
+ rtl::OUString suMacro = rtl::OUString::createFromAscii( "$MYVAR/expand1" );
+ //printUString( suMacro );
+ //expandMacro now
+ aBootstrap.expandMacrosFrom( suMacro );
+ rtl::OUString suExpectedMacro = rtl::OUString::createFromAscii( "src680_test/expand1" );
+ //printUString( suMacro );
+ CPPUNIT_ASSERT_MESSAGE("expandMacrosFrom failed.", suMacro.compareTo(suExpectedMacro) == 0 );
+ }
+
+ /** here a special macro should expand
+ * if rtlrc is under sal/qa/rtl/bootstrap/, "${rtlrc:Bootstrap:RTLVALUE}" could be expanded
+ * else rtlrc is under solver/680/unxlngi4.pro/bin/, "${file:/// ....solver/680/unxlngi4.pro/bin/rtlrc:Bootstrap:RTLVALUE}"
+ * could not be expanded
+ */
+ void expandMacrosFrom_002()
+ {
+ // Build a string with '${rtl.ini:RTLVALUE}' and try to expand it.
+ // In function 'create_rtlrc() is the content of the rtl.ini file.
+
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ t_print("inifile is:");
+ printUString( suIniname );
+ Bootstrap aBootstrap( suIniname) ;
+ rtl::OUString suMacro = rtl::OUString::createFromAscii( "${" ); //rtlrc:Bootstrap:RTLVALUE}");
+
+ rtl::OUString aDirURL = OUString::createFromAscii( "$ORIGIN");
+ aDirURL += OUString::createFromAscii( "/");
+ aDirURL += OUString::createFromAscii( "rtl" );
+#if defined(WNT) || defined(OS2)
+ aDirURL += rtl::OUString::createFromAscii(".ini");
+#else
+ aDirURL += rtl::OUString::createFromAscii("rc");
+#endif
+
+ suMacro += aDirURL;//t_getSourcePath("rtl");
+ suMacro += rtl::OUString::createFromAscii( "::RTLVALUE}");
+
+ t_print("created macro is: ");
+ printUString( suMacro );
+ //expandMacro now
+ aBootstrap.expandMacrosFrom( suMacro );
+ t_print("expanded macro is:");
+ printUString( suMacro );
+ rtl::OUString suExpectedMacro = rtl::OUString::createFromAscii( "qadev17" );
+ CPPUNIT_ASSERT_MESSAGE("failed, can't expand '${file:///.../" SAL_CONFIGFILE("rtl") "::RTLVALUE}' to 'qadev17'", suMacro.compareTo(suExpectedMacro) == 0 );
+ }
+ void expandMacrosFrom_002_1()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ t_print("inifile is:");
+ printUString( suIniname );
+ Bootstrap aBootstrap( suIniname);
+
+ rtl::OUString suMacro;
+ // just a simple test, if this really work.
+ aBootstrap.getFrom(rtl::OUString::createFromAscii( "SOFROMVALUE2" ), suMacro );
+ t_print("SOFROMVALUE2:");
+ printUString( suMacro );
+ CPPUNIT_ASSERT_MESSAGE("'SOFROMVALUE2' seems to do not exist.", suMacro.getLength() > 0 );
+
+ aBootstrap.getFrom(rtl::OUString::createFromAscii( "SOFROMVALUE" ), suMacro );
+
+ t_print("SOFROMVALUE:");
+ printUString( suMacro );
+
+ //expandMacro now
+ // seems to be, that getFrom() already expand the string
+ // t_print("expanded macro is:");
+ // aBootstrap.expandMacrosFrom( suMacro );
+ // printUString( suMacro );
+ rtl::OUString suExpectedMacro = rtl::OUString::createFromAscii( "src680_qadev" );
+ CPPUNIT_ASSERT_MESSAGE("failed, can't expand '${" SAL_CONFIGFILE("rtl") "::SOVALUE}' to 'src680_qadev'", suMacro.compareTo(suExpectedMacro) == 0 );
+ }
+ void expandMacrosFrom_002_2()
+ {
+ // test, to read and expand SOFROMVALUE3
+ // SOFROMVALUE3 is 'rtl(.ini|rc)::TESTSHL_SOVALUE' which should expand to 'rtlfile' if all is ok.
+
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ t_print("inifile is:");
+ printUString( suIniname );
+ Bootstrap aBootstrap( suIniname);
+
+ rtl::OUString suMacro;
+ aBootstrap.getFrom(rtl::OUString::createFromAscii( "SOFROMVALUE3" ), suMacro );
+
+ t_print("SOFROMVALUE3:");
+ printUString( suMacro );
+
+ if (suMacro.equals(rtl::OUString::createFromAscii("testshl2_file") ) == sal_True)
+ {
+ CPPUNIT_ASSERT_MESSAGE("Value 'SOFROMVALUE3' is read from the wrong ini file.", 0 );
+ }
+ else
+ {
+ CPPUNIT_ASSERT_MESSAGE("SOFROMVALUE3 should contain 'rtlfile'.", suMacro.equals(rtl::OUString::createFromAscii("rtlfile") ) == sal_True );
+ }
+ }
+//? I don't know if this is a right test.
+// void expandMacrosFrom_002_3()
+// {
+// // test, to read and expand SOFROMVALUE4
+// // SOFROMVALUE4 is 'rtl(.ini|rc):Other_Section:TESTSHL_SOVALUE' which should expand to '' if all is ok.
+//
+// rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+// t_print("inifile is:");
+// printUString( suIniname );
+// Bootstrap aBootstrap( suIniname);
+//
+// rtl::OUString suMacro;
+// aBootstrap.getFrom(rtl::OUString::createFromAscii( "SOFROMVALUE4" ), suMacro );
+//
+// t_print("SOFROMVALUE4:");
+// printUString( suMacro );
+//
+// if (suMacro.equals(rtl::OUString::createFromAscii("testshl2_file") ) == sal_True)
+// {
+// CPPUNIT_ASSERT_MESSAGE("Value 'SOFROMVALUE4' is read from the wrong section out of the wrong ini file.", 0 );
+// }
+// else if (suMacro.equals(rtl::OUString::createFromAscii("testshl2_file_other") ) == sal_True)
+// {
+// CPPUNIT_ASSERT_MESSAGE("Value 'SOFROMVALUE4' is read from the wrong ini file.", 0 );
+// }
+// else
+// {
+// CPPUNIT_ASSERT_MESSAGE("Value 'SOFROMVALUE4' should contain 'rtlfile_other'.", suMacro.equals(rtl::OUString::createFromAscii("rtlfile_other") ) == sal_True );
+// }
+// }
+ void expandMacrosFrom_003()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ Bootstrap aBootstrap( suIniname);
+ rtl::OUString suMacro[4];
+ suMacro[0] = rtl::OUString::createFromAscii( "$SYSUSERCONFIG" );
+ suMacro[1] = rtl::OUString::createFromAscii( "$SYSUSERHOME" );
+ suMacro[2] = rtl::OUString::createFromAscii( "$SYSBINDIR" );
+ suMacro[3] = rtl::OUString::createFromAscii( "$ORIGIN" );
+
+ for ( int i = 0; i < 4; i++ )
+ {
+ aBootstrap.expandMacrosFrom( suMacro[i] );
+ printUString(suMacro[i]);
+ }
+ // printUString( t_getSourcePath("") );
+ // CPPUNIT_ASSERT_MESSAGE("some integral variables.", suMacro[3].equalsIgnoreAsciiCase(t_getSourcePath("")) == sal_True );
+ CPPUNIT_ASSERT_MESSAGE("some integral variables.", suMacro[0].getLength() > 0 &&
+ suMacro[1].getLength() > 0 &&
+ suMacro[2].getLength() > 0 &&
+ suMacro[3].getLength() > 0);
+ }
+
+ void testRecursion() {
+ rtl::OUString t(RTL_CONSTASCII_USTRINGPARAM("$RECURSIVE"));
+ Bootstrap(t_getSourcePath(TESTSHL2_INI)).expandMacrosFrom(t);
+ CPPUNIT_ASSERT_MESSAGE(
+ "recursion detection",
+ t.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("***RECURSION DETECTED***")));
+ }
+
+ void testLink() {
+ rtl::OUString t(RTL_CONSTASCII_USTRINGPARAM("$LINKED"));
+ Bootstrap(t_getSourcePath(TESTSHL2_INI)).expandMacrosFrom(t);
+ CPPUNIT_ASSERT_MESSAGE(
+ "link file",
+ t.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("qadev17")));
+ }
+
+ void testOverride() {
+ rtl::OUString t1(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "${.override:$ORIGIN/" SAL_CONFIGFILE("rtl") ":ORIGIN}"));
+ Bootstrap(t_getSourcePath("rtl")).expandMacrosFrom(t1);
+ CPPUNIT_ASSERT_MESSAGE(
+ "override ORIGIN",
+ t1.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("direct")));
+ rtl::OUString t2(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "${.override:$ORIGIN/" SAL_CONFIGFILE("none") ":MYVAR}"));
+ Bootstrap::expandMacros(t2);
+ CPPUNIT_ASSERT_MESSAGE(
+ "override MYVAR",
+ t2.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("src680_test")));
+ }
+
+ void testNonexisting() {
+ rtl::OUString t(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "${$ORIGIN/" SAL_CONFIGFILE("none") ":MYVAR}"));
+ Bootstrap::expandMacros(t);
+ CPPUNIT_ASSERT_MESSAGE(
+ "nonexisting",
+ t.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("src680_test")));
+ }
+
+ void testSection() {
+ rtl::OUStringBuffer b;
+ b.appendAscii(RTL_CONSTASCII_STRINGPARAM("${"));
+ rtl::OUString p(t_getSourcePath(TESTSHL2_INI));
+ for (sal_Int32 i = 0; i < p.getLength(); ++i) {
+ if (p[i] != 'u') {
+ b.append(static_cast< sal_Unicode >('\\'));
+ }
+ b.append(p[i]);
+ }
+ b.appendAscii(RTL_CONSTASCII_STRINGPARAM(":Other_Section:EXPAND}"));
+ rtl::OUString t(b.makeStringAndClear());
+ Bootstrap(t_getSourcePath(TESTSHL2_INI)).expandMacrosFrom(t);
+ CPPUNIT_ASSERT_MESSAGE(
+ "section expansion",
+ t.equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("$FILE")));
+ // the correct answer would be "testshl2 file" instead, but
+ // expansion including a section currently erroneously does not
+ // recursively expand macros in the resulting replacement text
+ }
+
+ CPPUNIT_TEST_SUITE(expandMacrosFrom);
+ CPPUNIT_TEST(expandMacrosFrom_001);
+ CPPUNIT_TEST(expandMacrosFrom_002);
+ CPPUNIT_TEST(expandMacrosFrom_002_1);
+ CPPUNIT_TEST(expandMacrosFrom_002_2);
+//? CPPUNIT_TEST(expandMacrosFrom_002_3);
+ CPPUNIT_TEST(expandMacrosFrom_003);
+ CPPUNIT_TEST(testRecursion);
+ CPPUNIT_TEST(testLink);
+ CPPUNIT_TEST(testOverride);
+ CPPUNIT_TEST(testNonexisting);
+ CPPUNIT_TEST(testSection);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class expandMacrosFrom
+
+ class expandMacros : public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void expandMacros_001()
+ {
+ rtl::OUString suIniname = t_getSourcePath(TESTSHL2_INI);
+ Bootstrap aBootstrap( suIniname) ;
+ rtl::OUString suMacro = rtl::OUString::createFromAscii( "$INHERITED_VALUE/well" );
+ Bootstrap::expandMacros( suMacro );
+
+ rtl::OUString suName = rtl::OUString::createFromAscii( "INHERITED_VALUE" );
+ OUString suGetValue;
+ Bootstrap::get( suName, suGetValue );
+ suGetValue += OUString::createFromAscii( "/well" );
+ CPPUNIT_ASSERT_MESSAGE("expandMacros failed.", suGetValue.compareTo(suMacro) == 0 );
+ }
+
+ CPPUNIT_TEST_SUITE(expandMacros);
+ CPPUNIT_TEST(expandMacros_001);
+ // CPPUNIT_TEST(expandMacros_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class expandMacros
+
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::ctor, "rtl_Bootstrap");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::getFrom, "rtl_Bootstrap");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::setIniFilename, "rtl_Bootstrap");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::getHandle, "rtl_Bootstrap");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::set, "rtl_Bootstrap");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::expandMacrosFrom, "rtl_Bootstrap");
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Bootstrap::expandMacros, "rtl_Bootstrap");
+
+} // namespace rtl_Bootstrap
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+// NOADDITIONAL;
+
+
+// Here are some helpers, which create a new file 'rtlrc' at the executable path position
+// and fill the file with some information.
+// static rtl::OUString getExecutableDirectory()
+// {
+// rtl::OUString fileName;
+// osl_getExecutableFile(&fileName.pData);
+//
+// sal_Int32 nDirEnd = fileName.lastIndexOf('/');
+//
+// OSL_ENSURE(nDirEnd >= 0, "Cannot locate executable directory");
+//
+// rtl::OUString aDirURL = fileName.copy(0, nDirEnd);
+// return aDirURL;
+// }
+
+static void removeAndCreateFile(rtl::OUString const& _suFileURL, rtl::OString const& _sContent)
+{
+ osl::File::remove(_suFileURL);
+
+ ::std::auto_ptr<osl::File> pFile( new osl::File( _suFileURL ) );
+ ::osl::FileBase::RC nError = pFile->open( OpenFlag_Write | OpenFlag_Create );
+ if ( ::osl::FileBase::E_None == nError || ::osl::FileBase::E_EXIST == nError )
+ {
+ t_print(T_VERBOSE, "%s\n" , OString(_suFileURL, _suFileURL.getLength(), RTL_TEXTENCODING_ASCII_US).getStr());
+ sal_uInt64 nWritenBytes;
+ pFile->write(_sContent.getStr(), _sContent.getLength(), nWritenBytes);
+ // t_print("nBytes: %ld\n", nBytes);
+
+ rtl::OString sError = "can't write enough bytes to file";
+ sError += OString(_suFileURL, _suFileURL.getLength(), RTL_TEXTENCODING_ASCII_US);
+ OSL_ENSURE(nWritenBytes == _sContent.getLength(), sError.getStr());
+
+ pFile->close();
+ }
+ else
+ {
+ rtl::OString sError = "can't create file URL: '";
+ rtl::OString sFile;
+ sFile <<= _suFileURL;
+ sError += sFile;
+ sError += "' maybe no write access. If it is true with no write access, please create a local environment and start these tests again. rtl::Bootstrap test must quit.";
+ t_print("%s\n", sError.getStr() );
+ exit(1);
+ }
+ OSL_ASSERT(t_fileExist(_suFileURL) == true);
+}
+
+// -----------------------------------------------------------------------------
+static void create_rtlrc()
+{
+ rtl::OUString aFileURL(getExecutableDirectory());
+#if defined(WNT) || defined(OS2)
+ aFileURL += rtl::OUString::createFromAscii("/rtl.ini");
+#else
+ aFileURL += rtl::OUString::createFromAscii("/rtlrc");
+#endif
+
+ rtl::OString sLines;
+ sLines += "[Bootstrap]\n";
+ sLines += "SOVALUE=src680_qadev\n";
+ sLines += "RTLVALUE=qadev17\n";
+ sLines += "TESTSHL_SOVALUE=rtlfile\n";
+ sLines += "RECURSIVE=${$ORIGIN/" SAL_CONFIGFILE("testshl2") ":RECURSIVE}\n";
+ sLines += "ORIGIN=direct\n";
+ sLines += "[Other_Section]\n";
+ sLines += "TESTSHL_SOVALUE=rtlfile_other\n";
+
+ removeAndCreateFile(aFileURL, sLines);
+}
+
+// -----------------------------------------------------------------------------
+static void create_testshl2rc()
+{
+ rtl::OUString aFileURL(getExecutableDirectory());
+#if defined(WNT) || defined(OS2)
+ aFileURL += rtl::OUString::createFromAscii("/testshl2.ini");
+#else
+ aFileURL += rtl::OUString::createFromAscii("/testshl2rc");
+#endif
+ rtl::OString sLines;
+ sLines += "[Bootstrap]\n";
+ sLines += "FILE=testshl2 file\n";
+ sLines += "MYBOOTSTRAPTESTVALUE=file\n";
+ sLines += "INHERITED_VALUE=inherited_value\n";
+ sLines += "INHERITED_OVERWRITTEN_VALUE=not_overwritten\n";
+ sLines += "MYVAR=src680_test\n";
+ sLines += "SOFROMVALUE=${$ORIGIN/" SAL_CONFIGFILE("rtl") "::SOVALUE}\n";
+ sLines += "SOFROMVALUE2=test\n";
+ sLines += "SOFROMVALUE3=${$ORIGIN/" SAL_CONFIGFILE("rtl") "::TESTSHL_SOVALUE}\n";
+ sLines += "TESTSHL_SOVALUE=testshl2_file\n";
+ //? sLines += "SOFROMVALUE4=${" SAL_CONFIGFILE("rtl") ":Other_Section:TESTSHL_SOVALUE}\n";
+ sLines += "ILLEGAL VALUE=test\n";
+ sLines += "ILLEGAL.DOT=test\n";
+ sLines += "ILLEGAL;SEMICOLON=test\n";
+ sLines += "ILLEGAL:COLON=test\n";
+ sLines += " KEY_FOR_TRIM_TEST = value for trim test \n";
+ sLines += "RECURSIVE=${$ORIGIN/" SAL_CONFIGFILE("rtl") ":RECURSIVE}\n";
+ sLines += "LINKED=${${.link:$ORIGIN/testshl2-link}:RTLVALUE}\n";
+ sLines += "[Other_Section]\n";
+ sLines += "FILE=testshl2 file other\n";
+ sLines += "EXPAND=$FILE\n";
+ //? sLines += "TESTSHL_SOVALUE=testshl2_file_other\n";
+
+ removeAndCreateFile(aFileURL, sLines);
+
+ removeAndCreateFile(
+ (getExecutableDirectory() +
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/testshl2-link"))),
+ SAL_CONFIGFILE("rtl"));
+}
+
+// -----------------------------------------------------------------------------
+
+static void create_pseudorc()
+{
+ rtl::OUString aFileURL(getExecutableDirectory());
+#if defined(WNT) || defined(OS2)
+ aFileURL += rtl::OUString::createFromAscii("/pseudo.ini");
+#else
+ aFileURL += rtl::OUString::createFromAscii("/pseudorc");
+#endif
+ rtl::OString sLines;
+ sLines += "[Bootstrap]\n";
+ sLines += "FILE=pseudo file\n";
+ sLines += "PSEUDOFILE=be pseudo\n";
+
+ removeAndCreateFile(aFileURL, sLines);
+}
+
+// -----------------------------------------------------------------------------
+void create_bootstrap_processrc()
+{
+ rtl::OUString aDirURL(getModulePath());
+#if defined(WNT) || defined(OS2)
+ aDirURL += rtl::OUString::createFromAscii("/bootstrap_process.ini");
+#else
+ aDirURL += rtl::OUString::createFromAscii("/bootstrap_processrc");
+#endif
+ rtl::OString sLines;
+ sLines += "[Bootstrap]\n";
+ sLines += "EXECUTABLE_RC=true\n";
+ sLines += "IF_CUSTOM_RC=false\n";
+
+ removeAndCreateFile(aDirURL, sLines);
+}
+// -----------------------------------------------------------------------------
+
+void RegisterAdditionalFunctions(FktRegFuncPtr _pFunc)
+{
+ (void) _pFunc;
+ // start message
+ t_print(T_VERBOSE, "Initializing ...\n" );
+ create_rtlrc();
+ create_testshl2rc();
+ create_pseudorc();
+ create_bootstrap_processrc();
+
+ t_print(T_VERBOSE, "Initialization Done.\n" );
+}
+
diff --git a/sal/qa/rtl/bootstrap/rtl_Bootstrap.xsce b/sal/qa/rtl/bootstrap/rtl_Bootstrap.xsce
new file mode 100644
index 000000000000..df73669613f0
--- /dev/null
+++ b/sal/qa/rtl/bootstrap/rtl_Bootstrap.xsce
@@ -0,0 +1,7 @@
+#i27888#
+rtl_Bootstrap.getFrom.getFrom_004
+
+#i27893#
+#rtl_Bootstrap.expandMacrosFrom.expandMacrosFrom_002
+#rtl_Bootstrap.expandMacrosFrom.expandMacrosFrom_002_1
+rtl_Bootstrap.expandMacrosFrom.expandMacrosFrom_002_2
diff --git a/sal/qa/rtl/cipher/makefile.mk b/sal/qa/rtl/cipher/makefile.mk
new file mode 100644
index 000000000000..b89e392d71d6
--- /dev/null
+++ b/sal/qa/rtl/cipher/makefile.mk
@@ -0,0 +1,70 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=qa_rtl_cipher
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:joblist by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_cipher.obj
+
+SHL1TARGET= rtl_cipher
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF2EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:joblist
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/cipher/rtl_cipher.cxx b/sal/qa/rtl/cipher/rtl_cipher.cxx
new file mode 100644
index 000000000000..127ceef5a27e
--- /dev/null
+++ b/sal/qa/rtl/cipher/rtl_cipher.cxx
@@ -0,0 +1,717 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <testshl/simpleheader.hxx>
+#include <rtl/strbuf.hxx>
+#include <rtl/cipher.h>
+
+// -----------------------------------------------------------------------------
+namespace rtl_cipher
+{
+
+rtl::OString createHex(sal_uInt8 *_pKeyBuffer, sal_uInt32 _nKeyLen)
+{
+ // Create hex-value string from the value to keep the string size minimal
+ rtl::OStringBuffer aBuffer( _nKeyLen * 2 + 1 );
+ for ( sal_uInt32 i = 0; i < _nKeyLen; i++ )
+ {
+ sal_Int32 nValue = (sal_Int32)_pKeyBuffer[i];
+ if (nValue < 16) // maximul hex value for 1 byte
+ {
+ aBuffer.append( sal_Int32(0), 16 /* radix */ );
+ }
+ aBuffer.append( nValue, 16 /* radix */ );
+ }
+
+ return aBuffer.makeStringAndClear();
+}
+
+// -----------------------------------------------------------------------------
+
+class create : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void create_001()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+ rtl_cipher_destroy(aCipher);
+ }
+ void create_002()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmInvalid, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create provide wrong object.", aCipher == NULL);
+ }
+ void create_003()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeCBC);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+ rtl_cipher_destroy(aCipher);
+ }
+ void create_004()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmInvalid, rtl_Cipher_ModeCBC);
+ CPPUNIT_ASSERT_MESSAGE("create provide wrong object.", aCipher == NULL);
+ }
+ void create_005()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeStream);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+ rtl_cipher_destroy(aCipher);
+ }
+ void create_006()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmInvalid, rtl_Cipher_ModeStream);
+ CPPUNIT_ASSERT_MESSAGE("create provide wrong object.", aCipher == NULL);
+ }
+ void create_007()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeInvalid);
+ CPPUNIT_ASSERT_MESSAGE("create provide wrong object.", aCipher == NULL);
+ }
+ void create_008()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmInvalid, rtl_Cipher_ModeInvalid);
+ CPPUNIT_ASSERT_MESSAGE("create provide wrong object.", aCipher == NULL);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(create);
+ CPPUNIT_TEST(create_001);
+ CPPUNIT_TEST(create_002);
+ CPPUNIT_TEST(create_003);
+ CPPUNIT_TEST(create_004);
+ CPPUNIT_TEST(create_005);
+ CPPUNIT_TEST(create_006);
+ CPPUNIT_TEST(create_007);
+ CPPUNIT_TEST(create_008);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+// -----------------------------------------------------------------------------
+class createBF : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void createBF_001()
+ {
+ rtlCipher aCipher = rtl_cipher_createBF(rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+ rtl_cipher_destroy(aCipher);
+ }
+ void createBF_002()
+ {
+ rtlCipher aCipher = rtl_cipher_createBF(rtl_Cipher_ModeCBC);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+ rtl_cipher_destroy(aCipher);
+ }
+ void createBF_003()
+ {
+ rtlCipher aCipher = rtl_cipher_createBF(rtl_Cipher_ModeStream);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+ rtl_cipher_destroy(aCipher);
+ }
+ void createBF_004()
+ {
+ rtlCipher aCipher = rtl_cipher_createBF(rtl_Cipher_ModeInvalid);
+ CPPUNIT_ASSERT_MESSAGE("create provide wrong object.", aCipher == NULL);
+ // rtl_cipher_destroy(aCipher);
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(createBF);
+ CPPUNIT_TEST(createBF_001);
+ CPPUNIT_TEST(createBF_002);
+ CPPUNIT_TEST(createBF_003);
+ CPPUNIT_TEST(createBF_004);
+ CPPUNIT_TEST_SUITE_END();
+}; // class createBF
+// -----------------------------------------------------------------------------
+class decode : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void test_encode(sal_uInt8 _nKeyValue, sal_uInt8 _nArgValue, rtl::OString const& _sPlainTextStr)
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+
+ sal_uInt32 nKeyLen = 16;
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ memset(pKeyBuffer, 0, nKeyLen);
+ pKeyBuffer[0] = _nKeyValue;
+
+ sal_uInt32 nArgLen = 16;
+ sal_uInt8 *pArgBuffer = new sal_uInt8[ nArgLen ];
+ memset(pArgBuffer, 0, nArgLen);
+ pArgBuffer[0] = _nArgValue;
+
+ t_print(T_VERBOSE, " init Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, " init Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ rtlCipherError aError = rtl_cipher_init(aCipher, rtl_Cipher_DirectionEncode, pKeyBuffer, nKeyLen, pArgBuffer, nArgLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong init", aError == rtl_Cipher_E_None);
+
+ sal_uInt32 nPlainTextLen = 16;
+ sal_uInt8 *pPlainTextBuffer = new sal_uInt8[ nPlainTextLen ];
+ memset(pPlainTextBuffer, 0, nPlainTextLen);
+ strncpy((char*)pPlainTextBuffer, _sPlainTextStr.getStr(), 16);
+
+ sal_uInt32 nCipherLen = 16;
+ sal_uInt8 *pCipherBuffer = new sal_uInt8[ nCipherLen ];
+ memset(pCipherBuffer, 0, nCipherLen);
+
+ /* rtlCipherError */ aError = rtl_cipher_encode(aCipher, pPlainTextBuffer, nPlainTextLen, pCipherBuffer, nCipherLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong encode", aError == rtl_Cipher_E_None);
+
+ t_print(T_VERBOSE, " Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, " Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+ t_print(T_VERBOSE, " Plain: %s\n", createHex(pPlainTextBuffer, nPlainTextLen).getStr());
+ t_print( "Cipher Buf: %s\n", createHex(pCipherBuffer, nCipherLen).getStr());
+
+ sal_uInt32 nPlainText2Len = 16;
+ sal_uInt8 *pPlainText2Buffer = new sal_uInt8[ nPlainText2Len ];
+ memset(pPlainText2Buffer, 0, nPlainText2Len);
+
+ /* rtlCipherError */ aError = rtl_cipher_decode(aCipher, pCipherBuffer, nCipherLen, pPlainText2Buffer, nPlainText2Len);
+ CPPUNIT_ASSERT_MESSAGE("decode should not work", aError != rtl_Cipher_E_None);
+
+ // rtl::OString sPlainText2Str((char*)pPlainText2Buffer, nPlainText2Len);
+ // t_print(T_VERBOSE, " Plain: %s\n", createHex(pPlainText2Buffer, nPlainText2Len).getStr());
+ // t_print(T_VERBOSE, " ascii: %s\n", sPlainText2Str.getStr());
+ //
+ // // t_print(" Buf: %s\n", createHex(pCipherBuffer, nCipherLen).getStr());
+ //
+ // sal_Int32 nCompare = memcmp(pPlainTextBuffer, pPlainText2Buffer, 16);
+ //
+ // CPPUNIT_ASSERT_MESSAGE("compare between plain and decoded plain failed", nCompare == 0);
+ //
+ // delete [] pPlainText2Buffer;
+ //
+ // delete [] pCipherBuffer;
+ // delete [] pPlainTextBuffer;
+ //
+ // delete [] pArgBuffer;
+ // delete [] pKeyBuffer;
+ //
+ // rtl_cipher_destroy(aCipher);
+ }
+
+ void test_encode_and_decode(sal_uInt8 _nKeyValue, sal_uInt8 _nArgValue, rtl::OString const& _sPlainTextStr)
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+
+ sal_uInt32 nKeyLen = 16;
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ memset(pKeyBuffer, 0, nKeyLen);
+ pKeyBuffer[0] = _nKeyValue;
+
+ sal_uInt32 nArgLen = 16;
+ sal_uInt8 *pArgBuffer = new sal_uInt8[ nArgLen ];
+ memset(pArgBuffer, 0, nArgLen);
+ pArgBuffer[0] = _nArgValue;
+
+ t_print(T_VERBOSE, " init Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, " init Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ rtlCipherError aError = rtl_cipher_init(aCipher, rtl_Cipher_DirectionBoth, pKeyBuffer, nKeyLen, pArgBuffer, nArgLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong init", aError == rtl_Cipher_E_None);
+
+ sal_uInt32 nPlainTextLen = 16;
+ sal_uInt8 *pPlainTextBuffer = new sal_uInt8[ nPlainTextLen ];
+ memset(pPlainTextBuffer, 0, nPlainTextLen);
+ strncpy((char*)pPlainTextBuffer, _sPlainTextStr.getStr(), 16);
+
+ sal_uInt32 nCipherLen = 16;
+ sal_uInt8 *pCipherBuffer = new sal_uInt8[ nCipherLen ];
+ memset(pCipherBuffer, 0, nCipherLen);
+
+ /* rtlCipherError */ aError = rtl_cipher_encode(aCipher, pPlainTextBuffer, nPlainTextLen, pCipherBuffer, nCipherLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong encode", aError == rtl_Cipher_E_None);
+
+ t_print(T_VERBOSE, " Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, " Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+ t_print(T_VERBOSE, " Plain: %s\n", createHex(pPlainTextBuffer, nPlainTextLen).getStr());
+ t_print( "Cipher Buf: %s\n", createHex(pCipherBuffer, nCipherLen).getStr());
+
+ sal_uInt32 nPlainText2Len = 16;
+ sal_uInt8 *pPlainText2Buffer = new sal_uInt8[ nPlainText2Len ];
+ memset(pPlainText2Buffer, 0, nPlainText2Len);
+
+ /* rtlCipherError */ aError = rtl_cipher_decode(aCipher, pCipherBuffer, nCipherLen, pPlainText2Buffer, nPlainText2Len);
+ CPPUNIT_ASSERT_MESSAGE("wrong decode", aError == rtl_Cipher_E_None);
+
+ rtl::OString sPlainText2Str((char*)pPlainText2Buffer, nPlainText2Len);
+ t_print(T_VERBOSE, " Plain: %s\n", createHex(pPlainText2Buffer, nPlainText2Len).getStr());
+ t_print(T_VERBOSE, " as ascii: %s\n", sPlainText2Str.getStr());
+
+ // t_print(" Buf: %s\n", createHex(pCipherBuffer, nCipherLen).getStr());
+
+ sal_Int32 nCompare = memcmp(pPlainTextBuffer, pPlainText2Buffer, 16);
+
+ CPPUNIT_ASSERT_MESSAGE("compare between plain and decoded plain failed", nCompare == 0);
+
+ delete [] pPlainText2Buffer;
+
+ delete [] pCipherBuffer;
+ delete [] pPlainTextBuffer;
+
+ delete [] pArgBuffer;
+ delete [] pKeyBuffer;
+
+ rtl_cipher_destroy(aCipher);
+ }
+
+ void decode_001()
+ {
+ test_encode_and_decode(0,0,"");
+ test_encode_and_decode(0,0,"hallo");
+ test_encode_and_decode(1,0,"B2Aahg5B");
+ test_encode_and_decode(1,2,"Longer text string");
+ }
+
+ void decode_002()
+ {
+ test_encode(0,0,"");
+ test_encode(0,0,"hallo");
+ test_encode(1,0,"B2Aahg5B");
+ test_encode(1,2,"Longer text string");
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(decode);
+ CPPUNIT_TEST(decode_001);
+ CPPUNIT_TEST(decode_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class decode
+// -----------------------------------------------------------------------------
+class decodeBF : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void decodeBF_001()
+ {
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(decodeBF);
+ CPPUNIT_TEST(decodeBF_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class decodeBF
+// -----------------------------------------------------------------------------
+class destroy : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void destroy_001()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeCBC);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+ rtl_cipher_destroy(aCipher);
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(destroy);
+ CPPUNIT_TEST(destroy_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class destroy
+// -----------------------------------------------------------------------------
+class destroyBF : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void destroyBF_001()
+ {
+ rtlCipher aCipher = rtl_cipher_createBF(rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+ rtl_cipher_destroyBF(aCipher);
+ // more proforma
+ // should not GPF
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(destroyBF);
+ CPPUNIT_TEST(destroyBF_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class destroyBF
+// -----------------------------------------------------------------------------
+class encode : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void test_encode(sal_uInt8 _nKeyValue, sal_uInt8 _nArgValue, sal_uInt8 _nDataValue)
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+
+ sal_uInt32 nKeyLen = 16;
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ memset(pKeyBuffer, 0, nKeyLen);
+ pKeyBuffer[0] = _nKeyValue;
+
+ sal_uInt32 nArgLen = 16;
+ sal_uInt8 *pArgBuffer = new sal_uInt8[ nArgLen ];
+ memset(pArgBuffer, 0, nArgLen);
+ pArgBuffer[0] = _nArgValue;
+
+ t_print(T_VERBOSE, "init Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "init Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ rtlCipherError aError = rtl_cipher_init(aCipher, rtl_Cipher_DirectionEncode, pKeyBuffer, nKeyLen, pArgBuffer, nArgLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong init", aError == rtl_Cipher_E_None);
+
+ sal_uInt32 nDataLen = 16;
+ sal_uInt8 *pDataBuffer = new sal_uInt8[ nDataLen ];
+ memset(pDataBuffer, 0, nDataLen);
+ pDataBuffer[0] = _nDataValue;
+
+ sal_uInt32 nLen = 16;
+ sal_uInt8 *pBuffer = new sal_uInt8[ nLen ];
+ memset(pBuffer, 0, nLen);
+
+ /* rtlCipherError */ aError = rtl_cipher_encode(aCipher, pDataBuffer, nDataLen, pBuffer, nLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong encode", aError == rtl_Cipher_E_None);
+
+ t_print(T_VERBOSE, " Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, " Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+ t_print(T_VERBOSE, "Data: %s\n", createHex(pDataBuffer, nDataLen).getStr());
+ t_print(T_VERBOSE, " Buf: %s\n", createHex(pBuffer, nLen).getStr());
+
+ delete [] pBuffer;
+ delete [] pDataBuffer;
+
+ delete [] pArgBuffer;
+ delete [] pKeyBuffer;
+
+ rtl_cipher_destroy(aCipher);
+ }
+
+ void encode_001()
+ {
+ test_encode(0,0,0);
+ test_encode(1,0,0);
+ test_encode(0,1,0);
+ test_encode(1,1,0);
+
+ test_encode(0,0,1);
+ test_encode(1,0,1);
+ test_encode(0,1,1);
+ test_encode(1,1,1);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(encode);
+ CPPUNIT_TEST(encode_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class encode
+// -----------------------------------------------------------------------------
+class encodeBF : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void encodeBF_001()
+ {
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(encodeBF);
+ CPPUNIT_TEST(encodeBF_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class encodeBF
+// -----------------------------------------------------------------------------
+class init : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void init_001()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+
+ sal_uInt32 nKeyLen = 16;
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ memset(pKeyBuffer, 0, nKeyLen);
+
+ sal_uInt32 nArgLen = 16;
+ sal_uInt8 *pArgBuffer = new sal_uInt8[ nArgLen ];
+ memset(pArgBuffer, 0, nArgLen);
+
+ t_print(T_VERBOSE, "Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ rtlCipherError aError = rtl_cipher_init(aCipher, rtl_Cipher_DirectionEncode, pKeyBuffer, nKeyLen, pArgBuffer, nArgLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong init", aError == rtl_Cipher_E_None);
+
+ t_print(T_VERBOSE, "Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ delete [] pArgBuffer;
+ delete [] pKeyBuffer;
+
+ rtl_cipher_destroy(aCipher);
+ }
+
+ void init_002()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+
+ sal_uInt32 nKeyLen = 16;
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ memset(pKeyBuffer, 0, nKeyLen);
+ pKeyBuffer[0] = 1;
+
+ sal_uInt32 nArgLen = 16;
+ sal_uInt8 *pArgBuffer = new sal_uInt8[ nArgLen ];
+ memset(pArgBuffer, 0, nArgLen);
+
+ t_print(T_VERBOSE, "Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ rtlCipherError aError = rtl_cipher_init(aCipher, rtl_Cipher_DirectionEncode, pKeyBuffer, nKeyLen, pArgBuffer, nArgLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong init", aError == rtl_Cipher_E_None);
+
+ t_print(T_VERBOSE, "Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ delete [] pArgBuffer;
+ delete [] pKeyBuffer;
+
+ rtl_cipher_destroy(aCipher);
+ }
+ void init_003()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+
+ sal_uInt32 nKeyLen = 16;
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ memset(pKeyBuffer, 0, nKeyLen);
+
+ sal_uInt32 nArgLen = 16;
+ sal_uInt8 *pArgBuffer = new sal_uInt8[ nArgLen ];
+ memset(pArgBuffer, 0, nArgLen);
+ pArgBuffer[0] = 1;
+
+ t_print(T_VERBOSE, "Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ rtlCipherError aError = rtl_cipher_init(aCipher, rtl_Cipher_DirectionEncode, pKeyBuffer, nKeyLen, pArgBuffer, nArgLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong init", aError == rtl_Cipher_E_None);
+
+ t_print(T_VERBOSE, "Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ delete [] pArgBuffer;
+ delete [] pKeyBuffer;
+
+ rtl_cipher_destroy(aCipher);
+ }
+ void init_004()
+ {
+ rtlCipher aCipher = rtl_cipher_create(rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ CPPUNIT_ASSERT_MESSAGE("create failed.", aCipher != NULL);
+
+ sal_uInt32 nKeyLen = 16;
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ memset(pKeyBuffer, 0, nKeyLen);
+ pKeyBuffer[0] = 1;
+
+ sal_uInt32 nArgLen = 16;
+ sal_uInt8 *pArgBuffer = new sal_uInt8[ nArgLen ];
+ memset(pArgBuffer, 0, nArgLen);
+ pArgBuffer[0] = 1;
+
+ t_print(T_VERBOSE, "Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ rtlCipherError aError = rtl_cipher_init(aCipher, rtl_Cipher_DirectionEncode, pKeyBuffer, nKeyLen, pArgBuffer, nArgLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong init", aError == rtl_Cipher_E_None);
+
+ t_print(T_VERBOSE, "Key: %s\n", createHex(pKeyBuffer, nKeyLen).getStr());
+ t_print(T_VERBOSE, "Arg: %s\n", createHex(pArgBuffer, nArgLen).getStr());
+
+ delete [] pArgBuffer;
+ delete [] pKeyBuffer;
+
+ rtl_cipher_destroy(aCipher);
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(init);
+ CPPUNIT_TEST(init_001);
+ CPPUNIT_TEST(init_002);
+ CPPUNIT_TEST(init_003);
+ CPPUNIT_TEST(init_004);
+ CPPUNIT_TEST_SUITE_END();
+}; // class init
+// -----------------------------------------------------------------------------
+class initBF : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void initBF_001()
+ {
+ // seems to be the same as init, so empty
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(initBF);
+ CPPUNIT_TEST(initBF_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class initBF
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::create, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::createBF, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::decode, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::decodeBF, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::destroy, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::destroyBF, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::encode, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::encodeBF, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::init, "rtl_cipher");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_cipher::initBF, "rtl_cipher");
+
+} // namespace rtl_cipher
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/rtl/crc32/jobfile.txt b/sal/qa/rtl/crc32/jobfile.txt
new file mode 100755
index 000000000000..ddf886ba24aa
--- /dev/null
+++ b/sal/qa/rtl/crc32/jobfile.txt
@@ -0,0 +1,5 @@
+# JobFile for rtl_crc32
+# header source sal/inc/rtl/crc.h
+
+rtl_crc32.test.rtl_crc32_001
+rtl_crc32.test.rtl_crc32_002
diff --git a/sal/qa/rtl/crc32/makefile.mk b/sal/qa/rtl/crc32/makefile.mk
new file mode 100755
index 000000000000..704c149d45cd
--- /dev/null
+++ b/sal/qa/rtl/crc32/makefile.mk
@@ -0,0 +1,68 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_crc32
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:jobfile by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_crc32.obj
+
+SHL1TARGET= rtl_crc32
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:jobfile
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/crc32/rtl_crc32.cxx b/sal/qa/rtl/crc32/rtl_crc32.cxx
new file mode 100755
index 000000000000..64033b7b8ca9
--- /dev/null
+++ b/sal/qa/rtl/crc32/rtl_crc32.cxx
@@ -0,0 +1,181 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// autogenerated file with codegen.pl
+
+#include <testshl/simpleheader.hxx>
+#include <rtl/crc.h>
+
+namespace rtl_CRC32
+{
+
+class test : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+
+ // insert your test code here.
+ void rtl_crc32_001()
+ {
+ // this is demonstration code
+ // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
+
+ sal_uInt32 nCRC = 0;
+
+ char buf[] = {0};
+ int num = 0;
+
+ nCRC = rtl_crc32(nCRC, buf, num);
+
+ CPPUNIT_ASSERT_MESSAGE("empty crc buffer", nCRC == 0);
+ }
+
+ void rtl_crc32_002()
+ {
+ sal_uInt32 nCRC = 0;
+
+ char buf[] = {0,0};
+ int num = sizeof(buf);
+
+ nCRC = rtl_crc32(nCRC, buf, num);
+
+ CPPUNIT_ASSERT_MESSAGE("buffer contain 2 empty bytes, crc is zero", nCRC != 0);
+ }
+
+ void rtl_crc32_002_1()
+ {
+ sal_uInt32 nCRC = 0;
+
+ char buf[] = {0,0,0};
+ int num = sizeof(buf);
+
+ nCRC = rtl_crc32(nCRC, buf, num);
+
+ CPPUNIT_ASSERT_MESSAGE("buffer contain 3 empty bytes, crc is zero", nCRC != 0);
+ }
+
+ /**
+ * crc32 check:
+ * Build checksum on two buffers with same size but different content,
+ * the result (crc32 checksum) must differ
+ */
+
+ void rtl_crc32_003()
+ {
+ sal_uInt32 nCRC1 = 0;
+ char buf1[] = {2};
+ int num1 = sizeof(buf1);
+
+ nCRC1 = rtl_crc32(nCRC1, buf1, num1);
+
+ sal_uInt32 nCRC2 = 0;
+ char buf2[] = {3};
+ int num2 = sizeof(buf2);
+
+ nCRC2 = rtl_crc32(nCRC2, buf2, num2);
+
+ CPPUNIT_ASSERT_MESSAGE("checksum should differ for buf1 and buf2", nCRC1 != nCRC2);
+ }
+
+ /** check if the crc32 only use as much values, as given
+ *
+ */
+ void rtl_crc32_003_1()
+ {
+ sal_uInt32 nCRC1 = 0;
+ char buf1[] = {2,1};
+ int num1 = sizeof(buf1) - 1;
+
+ nCRC1 = rtl_crc32(nCRC1, buf1, num1);
+
+ sal_uInt32 nCRC2 = 0;
+ char buf2[] = {2,2};
+ int num2 = sizeof(buf2) - 1;
+
+ nCRC2 = rtl_crc32(nCRC2, buf2, num2);
+
+ CPPUNIT_ASSERT_MESSAGE("checksum leave it's bounds", nCRC1 == nCRC2);
+ }
+
+ /** check if the crc32 differ at same content in reverse order
+ *
+ */
+ void rtl_crc32_003_2()
+ {
+ sal_uInt32 nCRC1 = 0;
+ char buf1[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
+ int num1 = sizeof(buf1);
+
+ nCRC1 = rtl_crc32(nCRC1, buf1, num1);
+
+ sal_uInt32 nCRC2 = 0;
+ char buf2[] = {20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
+ int num2 = sizeof(buf2);
+
+ nCRC2 = rtl_crc32(nCRC2, buf2, num2);
+
+ CPPUNIT_ASSERT_MESSAGE("checksum should differ", nCRC1 != nCRC2);
+ }
+
+
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(test);
+ CPPUNIT_TEST(rtl_crc32_001);
+ CPPUNIT_TEST(rtl_crc32_002);
+ CPPUNIT_TEST(rtl_crc32_002_1);
+ CPPUNIT_TEST(rtl_crc32_003);
+ CPPUNIT_TEST(rtl_crc32_003_1);
+ CPPUNIT_TEST(rtl_crc32_003_2);
+ CPPUNIT_TEST_SUITE_END();
+}; // class test
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_CRC32::test, "rtl_crc32");
+} // namespace rtl_CRC32
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
diff --git a/sal/qa/rtl/digest/makefile.mk b/sal/qa/rtl/digest/makefile.mk
new file mode 100644
index 000000000000..7798004ed854
--- /dev/null
+++ b/sal/qa/rtl/digest/makefile.mk
@@ -0,0 +1,64 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=rtl_digest
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+#----------------------------------- OStringBuffer -----------------------------------
+
+SHL1OBJS= \
+ $(SLO)$/rtl_digest.obj
+
+SHL1TARGET= rtl_digest
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+DEF1NAME= $(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/digest/rtl_digest.cxx b/sal/qa/rtl/digest/rtl_digest.cxx
new file mode 100644
index 000000000000..1a99ff285762
--- /dev/null
+++ b/sal/qa/rtl/digest/rtl_digest.cxx
@@ -0,0 +1,1451 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <testshl/simpleheader.hxx>
+
+#include <rtl/digest.h>
+#include <rtl/ustring.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <rtl/strbuf.hxx>
+
+// sample, how to use digest
+
+rtl::OUString CreateMD5FromString( const rtl::OUString& aMsg )
+{
+ // PRE: aStr "file"
+ // BACK: Str "ababab....0f" Hexcode String
+
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+ if ( handle > 0 )
+ {
+ const sal_uInt8* pData = (const sal_uInt8*)aMsg.getStr();
+ sal_uInt32 nSize = ( aMsg.getLength() * sizeof( sal_Unicode ));
+ sal_uInt32 nMD5KeyLen = rtl_digest_queryLength( handle );
+ sal_uInt8* pMD5KeyBuffer = new sal_uInt8[ nMD5KeyLen ];
+
+ rtl_digest_init( handle, pData, nSize );
+ rtl_digest_update( handle, pData, nSize );
+ rtl_digest_get( handle, pMD5KeyBuffer, nMD5KeyLen );
+ rtl_digest_destroy( handle );
+
+ // Create hex-value string from the MD5 value to keep the string size minimal
+ rtl::OUStringBuffer aBuffer( nMD5KeyLen * 2 + 1 );
+ for ( sal_uInt32 i = 0; i < nMD5KeyLen; i++ )
+ aBuffer.append( (sal_Int32)pMD5KeyBuffer[i], 16 );
+
+ delete [] pMD5KeyBuffer;
+ return aBuffer.makeStringAndClear();
+ }
+
+ return rtl::OUString();
+}
+
+// -----------------------------------------------------------------------------
+namespace rtl_digest
+{
+
+ rtl::OString sSampleString = "This is a sample sentence, which we use to check some crypto functions in sal.";
+ rtl::OString sSampleString_MD2 = "647ee6c9d4aa5fdd374ed9d7a156acbf";
+ rtl::OString sSampleString_MD5 = "b16b903e6fc0b62ae389013ed93fe531";
+ rtl::OString sSampleString_SHA = "eab2814429b2613301c8a077b806af3680548914";
+ rtl::OString sSampleString_SHA1 = "2bc5bdb7506a2cdc2fd27fc8b9889343012d5008";
+ rtl::OString sSampleString_HMAC_MD5 = "dd9cba48c972fba0a882baa72b079674";
+ rtl::OString sSampleString_HMAC_SHA1 = "5d7f43ce6abd1de4438d7e69e01495864490cf3e";
+
+ rtl::OString sSampleString_only_one_diff = "This is a sample sentence. which we use to check some crypto functions in sal.";
+
+class create : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void create_001()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmMD5", handle != 0);
+ rtl_digest_destroy( handle );
+ }
+ void create_002()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD2 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmMD2", handle != 0);
+ rtl_digest_destroy( handle );
+ }
+ void create_003()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmSHA );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmSHA", handle != 0);
+ rtl_digest_destroy( handle );
+ }
+ void create_004()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmSHA1", handle != 0);
+ rtl_digest_destroy( handle );
+ }
+ void create_005()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmHMAC_MD5 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmHMAC_MD5", handle != 0);
+ rtl_digest_destroy( handle );
+ }
+ void create_006()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmHMAC_SHA1 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmHMAC_SHA1", handle != 0);
+ rtl_digest_destroy( handle );
+ }
+
+ void create_007()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmInvalid );
+ t_print("Handle is %x\n", handle);
+ CPPUNIT_ASSERT_MESSAGE("create with NULL", handle == 0);
+ rtl_digest_destroy( handle );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(create);
+ CPPUNIT_TEST(create_001);
+ CPPUNIT_TEST(create_002);
+ CPPUNIT_TEST(create_003);
+ CPPUNIT_TEST(create_004);
+ CPPUNIT_TEST(create_005);
+ CPPUNIT_TEST(create_006);
+ CPPUNIT_TEST(create_007);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+
+
+
+// -----------------------------------------------------------------------------
+
+class createMD5 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void createMD5_001()
+ {
+ rtlDigest handle = rtl_digest_createMD5();
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmMD5 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ CPPUNIT_TEST_SUITE(createMD5);
+ CPPUNIT_TEST(createMD5_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+
+// -----------------------------------------------------------------------------
+
+class createMD2 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void createMD2_001()
+ {
+ rtlDigest handle = rtl_digest_createMD2( );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmMD2 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ CPPUNIT_TEST_SUITE(createMD2);
+ CPPUNIT_TEST(createMD2_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+// -----------------------------------------------------------------------------
+
+class createSHA : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void createSHA_001()
+ {
+ rtlDigest handle = rtl_digest_createSHA( );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmSHA == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ CPPUNIT_TEST_SUITE(createSHA);
+ CPPUNIT_TEST(createSHA_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+
+class createSHA1 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void createSHA1_001()
+ {
+ rtlDigest handle = rtl_digest_createSHA1();
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmSHA1 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ CPPUNIT_TEST_SUITE(createSHA1);
+ CPPUNIT_TEST(createSHA1_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+
+class createHMAC_MD5 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void createHMAC_MD5_001()
+ {
+ rtlDigest handle = rtl_digest_createHMAC_MD5();
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmHMAC_MD5 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ CPPUNIT_TEST_SUITE(createHMAC_MD5);
+ CPPUNIT_TEST(createHMAC_MD5_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+
+class createHMAC_SHA1 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void createHMAC_SHA1_001()
+ {
+ rtlDigest handle = rtl_digest_createHMAC_SHA1();
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmHMAC_SHA1 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+
+
+ CPPUNIT_TEST_SUITE(createHMAC_SHA1);
+ CPPUNIT_TEST(createHMAC_SHA1_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+// -----------------------------------------------------------------------------
+
+class queryAlgorithm : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void query_001()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmMD5 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ void query_002()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD2 );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmMD2 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ void query_003()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmSHA );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmSHA == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ void query_004()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmSHA1 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ void query_005()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmHMAC_MD5 );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmHMAC_MD5 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ void query_006()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmHMAC_SHA1 );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmHMAC_SHA1 == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+ void query_007()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmInvalid );
+
+ rtlDigestAlgorithm aAlgo = rtl_digest_queryAlgorithm(handle);
+ CPPUNIT_ASSERT_MESSAGE("query handle", rtl_Digest_AlgorithmInvalid == aAlgo);
+
+ rtl_digest_destroy( handle );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(queryAlgorithm);
+ CPPUNIT_TEST( query_001 );
+ CPPUNIT_TEST( query_002 );
+ CPPUNIT_TEST( query_003 );
+ CPPUNIT_TEST( query_004 );
+ CPPUNIT_TEST( query_005 );
+ CPPUNIT_TEST( query_006 );
+ CPPUNIT_TEST( query_007 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+
+// -----------------------------------------------------------------------------
+class queryLength : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void queryLength_MD5()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+
+ sal_uInt32 nAlgoLength = rtl_digest_queryLength(handle);
+ // t_print("nAlgoLength:=%d\n", nAlgoLength);
+ CPPUNIT_ASSERT_MESSAGE("query Length", RTL_DIGEST_LENGTH_MD5 == nAlgoLength);
+
+ rtl_digest_destroy( handle );
+ }
+ void queryLength_MD2()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD2 );
+
+ sal_uInt32 nAlgoLength = rtl_digest_queryLength(handle);
+ // t_print("nAlgoLength:=%d\n", nAlgoLength);
+ CPPUNIT_ASSERT_MESSAGE("query length", RTL_DIGEST_LENGTH_MD2 == nAlgoLength);
+
+ rtl_digest_destroy( handle );
+ }
+ void queryLength_SHA()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmSHA );
+
+ sal_uInt32 nAlgoLength = rtl_digest_queryLength(handle);
+ // t_print("nAlgoLength:=%d\n", nAlgoLength);
+ CPPUNIT_ASSERT_MESSAGE("query length", RTL_DIGEST_LENGTH_SHA == nAlgoLength);
+
+ rtl_digest_destroy( handle );
+ }
+ void queryLength_SHA1()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+
+ sal_uInt32 nAlgoLength = rtl_digest_queryLength(handle);
+ // t_print("nAlgoLength:=%d\n", nAlgoLength);
+ CPPUNIT_ASSERT_MESSAGE("query length", RTL_DIGEST_LENGTH_SHA1 == nAlgoLength);
+
+ rtl_digest_destroy( handle );
+ }
+ void queryLength_HMAC_MD5()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmHMAC_MD5 );
+
+ sal_uInt32 nAlgoLength = rtl_digest_queryLength(handle);
+ // t_print("nAlgoLength:=%d\n", nAlgoLength);
+ CPPUNIT_ASSERT_MESSAGE("query length", RTL_DIGEST_LENGTH_HMAC_MD5 == nAlgoLength);
+
+ rtl_digest_destroy( handle );
+ }
+ void queryLength_HMAC_SHA1()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmHMAC_SHA1 );
+
+ sal_uInt32 nAlgoLength = rtl_digest_queryLength(handle);
+ // t_print("nAlgoLength:=%d\n", nAlgoLength);
+ CPPUNIT_ASSERT_MESSAGE("query length", RTL_DIGEST_LENGTH_HMAC_SHA1 == nAlgoLength);
+
+ rtl_digest_destroy( handle );
+ }
+
+ void queryLength_Illegal()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmInvalid );
+
+ sal_uInt32 nAlgoLength = rtl_digest_queryLength(handle);
+ // t_print("nAlgoLength:=%d\n", nAlgoLength);
+ CPPUNIT_ASSERT_MESSAGE("query length", 0 == nAlgoLength);
+
+ rtl_digest_destroy( handle );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(queryLength);
+ CPPUNIT_TEST( queryLength_MD2 );
+ CPPUNIT_TEST( queryLength_MD5 );
+ CPPUNIT_TEST( queryLength_SHA );
+ CPPUNIT_TEST( queryLength_SHA1 );
+ CPPUNIT_TEST( queryLength_HMAC_MD5 );
+ CPPUNIT_TEST( queryLength_HMAC_SHA1 );
+ CPPUNIT_TEST( queryLength_Illegal );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+// -----------------------------------------------------------------------------
+
+rtl::OString createHex(sal_uInt8 *_pMD5KeyBuffer, sal_uInt32 _nMD5KeyLen)
+{
+ // Create hex-value string from the MD5 value to keep the string size minimal
+ rtl::OStringBuffer aBuffer( _nMD5KeyLen * 2 + 1 );
+ for ( sal_uInt32 i = 0; i < _nMD5KeyLen; i++ )
+ {
+ sal_Int32 nValue = (sal_Int32)_pMD5KeyBuffer[i];
+ if (nValue < 16) // maximul hex value for 1 byte
+ {
+ aBuffer.append( sal_Int32(0), 16 /* radix */ );
+ }
+ aBuffer.append( nValue, 16 /* radix */ );
+ }
+
+ return aBuffer.makeStringAndClear();
+}
+
+
+// -----------------------------------------------------------------------------
+class init : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void init_000()
+ {
+ rtlDigest handle = NULL;
+
+ rtlDigestError aError = rtl_digest_init(handle, NULL, 0);
+
+ CPPUNIT_ASSERT_MESSAGE("init(NULL, 0, 0)", aError == rtl_Digest_E_Argument);
+ }
+
+ void init_001()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+
+ rtlDigestError aError = rtl_digest_init(handle, NULL, 0);
+
+ CPPUNIT_ASSERT_MESSAGE("init(handle, 0, 0)", aError == rtl_Digest_E_None);
+
+ rtl_digest_destroy( handle );
+ }
+
+ // ------------------------------------
+ void init_MD2()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD2 );
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8 *pData = (const sal_uInt8*)aMsg.getStr();
+ sal_uInt32 nSize = ( aMsg.getLength() );
+
+ rtlDigestError aError = rtl_digest_init(handle, pData, nSize);
+
+ CPPUNIT_ASSERT_MESSAGE("init(handle, pData, nSize)", aError == rtl_Digest_E_None);
+
+ rtl_digest_update( handle, pData, nSize );
+
+ sal_uInt32 nKeyLen = rtl_digest_queryLength( handle );
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+
+ rtl_digest_get( handle, pKeyBuffer, nKeyLen );
+ rtl::OString aSum = createHex(pKeyBuffer, nKeyLen);
+ delete [] pKeyBuffer;
+
+ t_print("MD2 Sum: %s\n", aSum.getStr());
+ // LLA: how to check right values
+ // samples?
+
+ rtl_digest_destroy( handle );
+ }
+
+ void init_MD5()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8 *pData = (const sal_uInt8*)aMsg.getStr();
+ sal_uInt32 nSize = ( aMsg.getLength() );
+
+ rtlDigestError aError = rtl_digest_init(handle, pData, nSize);
+
+ CPPUNIT_ASSERT_MESSAGE("init(handle, pData, nSize)", aError == rtl_Digest_E_None);
+
+ rtl_digest_update( handle, pData, nSize );
+
+ sal_uInt32 nKeyLen = rtl_digest_queryLength( handle );
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+
+ rtl_digest_get( handle, pKeyBuffer, nKeyLen );
+ rtl::OString aSum = createHex(pKeyBuffer, nKeyLen);
+ delete [] pKeyBuffer;
+
+ t_print("MD5 Sum: %s\n", aSum.getStr());
+ // LLA: how to check right values
+ // samples?
+
+ rtl_digest_destroy( handle );
+ }
+
+ void init_SHA()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmSHA );
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8 *pData = (const sal_uInt8*)aMsg.getStr();
+ sal_uInt32 nSize = ( aMsg.getLength() );
+
+ rtlDigestError aError = rtl_digest_init(handle, pData, nSize);
+
+ CPPUNIT_ASSERT_MESSAGE("init(handle, pData, nSize)", aError == rtl_Digest_E_None);
+
+ rtl_digest_update( handle, pData, nSize );
+
+ sal_uInt32 nKeyLen = rtl_digest_queryLength( handle );
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+
+ rtl_digest_get( handle, pKeyBuffer, nKeyLen );
+ rtl::OString aSum = createHex(pKeyBuffer, nKeyLen);
+ delete [] pKeyBuffer;
+
+ t_print("SHA Sum: %s\n", aSum.getStr());
+ // LLA: how to check right values
+ // samples?
+
+ rtl_digest_destroy( handle );
+ }
+ void init_SHA1()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmSHA1 );
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8 *pData = (const sal_uInt8*)aMsg.getStr();
+ sal_uInt32 nSize = ( aMsg.getLength() );
+
+ rtlDigestError aError = rtl_digest_init(handle, pData, nSize);
+
+ CPPUNIT_ASSERT_MESSAGE("init(handle, pData, nSize)", aError == rtl_Digest_E_None);
+
+ rtl_digest_update( handle, pData, nSize );
+
+ sal_uInt32 nKeyLen = rtl_digest_queryLength( handle );
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+
+ rtl_digest_get( handle, pKeyBuffer, nKeyLen );
+ rtl::OString aSum = createHex(pKeyBuffer, nKeyLen);
+ delete [] pKeyBuffer;
+
+ t_print("SHA1 Sum: %s\n", aSum.getStr());
+ // LLA: how to check right values
+ // samples?
+
+ rtl_digest_destroy( handle );
+ }
+ void init_HMAC_MD5()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmHMAC_MD5 );
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8 *pData = (const sal_uInt8*)aMsg.getStr();
+ sal_uInt32 nSize = ( aMsg.getLength() );
+
+ sal_uInt32 nKeyLen = rtl_digest_queryLength( handle );
+ CPPUNIT_ASSERT_MESSAGE( "Keylen must be greater 0", nKeyLen );
+
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ CPPUNIT_ASSERT( pKeyBuffer );
+ memset(pKeyBuffer, 0, nKeyLen);
+
+ rtlDigestError aError = rtl_digest_init(handle, pKeyBuffer, nKeyLen );
+
+ CPPUNIT_ASSERT_MESSAGE("init(handle, pData, nSize)", aError == rtl_Digest_E_None);
+
+ rtl_digest_update( handle, pData, nSize );
+
+ rtl_digest_get( handle, pKeyBuffer, nKeyLen );
+ rtl::OString aSum = createHex(pKeyBuffer, nKeyLen);
+ delete [] pKeyBuffer;
+
+ t_print("HMAC_MD5 Sum: %s\n", aSum.getStr());
+ // LLA: how to check right values
+ // samples?
+
+ rtl_digest_destroy( handle );
+ }
+ void init_HMAC_SHA1()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmHMAC_SHA1 );
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8 *pData = (const sal_uInt8*)aMsg.getStr();
+ sal_uInt32 nSize = ( aMsg.getLength() );
+
+ sal_uInt32 nKeyLen = rtl_digest_queryLength( handle );
+ CPPUNIT_ASSERT_MESSAGE( "Keylen must be greater 0", nKeyLen );
+
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ CPPUNIT_ASSERT( pKeyBuffer );
+ memset(pKeyBuffer, 0, nKeyLen);
+
+ rtlDigestError aError = rtl_digest_init(handle, pKeyBuffer, nKeyLen );
+
+ CPPUNIT_ASSERT_MESSAGE("init(handle, pData, nSize)", aError == rtl_Digest_E_None);
+
+ rtl_digest_update( handle, pData, nSize );
+
+ rtl_digest_get( handle, pKeyBuffer, nKeyLen );
+ rtl::OString aSum = createHex(pKeyBuffer, nKeyLen);
+ delete [] pKeyBuffer;
+
+ t_print("HMAC_SHA1 Sum: %s\n", aSum.getStr());
+ // LLA: how to check right values
+ // samples?
+
+ rtl_digest_destroy( handle );
+ }
+
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(init);
+ CPPUNIT_TEST( init_000 );
+ CPPUNIT_TEST( init_001 );
+ CPPUNIT_TEST( init_MD2 );
+ CPPUNIT_TEST( init_MD5 );
+ CPPUNIT_TEST( init_SHA );
+ CPPUNIT_TEST( init_SHA1 );
+ CPPUNIT_TEST( init_HMAC_MD5 );
+ CPPUNIT_TEST( init_HMAC_SHA1 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class init
+
+// ------------------------------------
+
+rtl::OString getMD5Sum(rtl::OString const& _aMsg )
+{
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+
+ const sal_uInt8 *pData = (const sal_uInt8*)_aMsg.getStr();
+ sal_uInt32 nSize = ( _aMsg.getLength() );
+
+ rtl_digest_init(handle, pData, nSize);
+ rtl_digest_update( handle, pData, nSize );
+
+ sal_uInt32 nMD5KeyLen = rtl_digest_queryLength( handle );
+ sal_uInt8 *pMD5KeyBuffer = new sal_uInt8[ nMD5KeyLen ];
+
+ rtl_digest_get( handle, pMD5KeyBuffer, nMD5KeyLen );
+ rtl::OString aMD5Sum = createHex(pMD5KeyBuffer, nMD5KeyLen);
+ delete [] pMD5KeyBuffer;
+
+ rtl_digest_destroy( handle );
+ return aMD5Sum;
+}
+
+// -----------------------------------------------------------------------------
+
+class equalTests : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // ------------------------------------
+ void equal_001()
+ {
+ rtl::OString aMsg1 = sSampleString;
+ rtl::OString aMsg2 = sSampleString;
+
+ rtl::OString aMsgMD5Sum1 = getMD5Sum(aMsg1);
+ rtl::OString aMsgMD5Sum2 = getMD5Sum(aMsg2);
+
+ CPPUNIT_ASSERT_MESSAGE("md5sum must have a length", aMsgMD5Sum1.getLength() == 32 && aMsgMD5Sum2.getLength() == 32 );
+ CPPUNIT_ASSERT_MESSAGE("source is the same, dest must be also the same", aMsgMD5Sum1.equals(aMsgMD5Sum2) == sal_True);
+ }
+ // ------------------------------------
+ void equal_002()
+ {
+ rtl::OString aMsg1 = sSampleString;
+ rtl::OString aMsg2 = sSampleString_only_one_diff;
+
+ rtl::OString aMsgMD5Sum1 = getMD5Sum(aMsg1);
+ rtl::OString aMsgMD5Sum2 = getMD5Sum(aMsg2);
+
+ CPPUNIT_ASSERT_MESSAGE("md5sum must have a length", aMsgMD5Sum1.getLength() == 32 && aMsgMD5Sum2.getLength() == 32 );
+ CPPUNIT_ASSERT_MESSAGE("differ only in one char", aMsgMD5Sum1.equals(aMsgMD5Sum2) == sal_False);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(equalTests);
+ CPPUNIT_TEST( equal_001 );
+ CPPUNIT_TEST( equal_002 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+
+// -----------------------------------------------------------------------------
+class digest_MD2 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // ------------------------------------
+ void MD2_001()
+ {
+ rtl::OString aMsg1 = sSampleString;
+
+ sal_uInt8 *pBuffer = new sal_uInt8[ RTL_DIGEST_LENGTH_MD2 ];
+ CPPUNIT_ASSERT( pBuffer );
+ memset(pBuffer, 0, RTL_DIGEST_LENGTH_MD2 );
+
+ sal_uInt8 *pMsg1 = (sal_uInt8*)aMsg1.getStr();
+ sal_Int32 nLen = aMsg1.getLength();
+
+ rtlDigestError aError = rtl_digest_MD2(pMsg1, nLen, pBuffer, RTL_DIGEST_LENGTH_MD2);
+
+ CPPUNIT_ASSERT(aError == rtl_Digest_E_None );
+
+ rtl::OString aStr = createHex(pBuffer, RTL_DIGEST_LENGTH_MD2);
+ t_print("Decrypt MD2: %s\n", aStr.getStr());
+ CPPUNIT_ASSERT_MESSAGE("checksum of sample string is wrong. Code changes or sample problems, please check.", aStr.equals(sSampleString_MD2) );
+
+ delete [] pBuffer;
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(digest_MD2);
+ CPPUNIT_TEST( MD2_001 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+class digest_MD5 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+ // ------------------------------------
+ void MD5_001()
+ {
+ rtl::OString aMsg1 = sSampleString;
+
+ sal_uInt8 *pBuffer = new sal_uInt8[ RTL_DIGEST_LENGTH_MD5 ];
+ CPPUNIT_ASSERT( pBuffer );
+ memset(pBuffer, 0, RTL_DIGEST_LENGTH_MD5 );
+
+ sal_uInt8 *pMsg1 = (sal_uInt8*)aMsg1.getStr();
+ sal_Int32 nLen = aMsg1.getLength();
+
+ rtlDigestError aError = rtl_digest_MD5(pMsg1, nLen, pBuffer, RTL_DIGEST_LENGTH_MD5);
+
+ CPPUNIT_ASSERT(aError == rtl_Digest_E_None );
+
+ rtl::OString aStr = createHex(pBuffer, RTL_DIGEST_LENGTH_MD5);
+ t_print("Decrypt MD5: %s\n", aStr.getStr());
+ CPPUNIT_ASSERT_MESSAGE("checksum of sample string is wrong. Code changes or sample problems, please check.", aStr.equals(sSampleString_MD5) );
+
+ delete [] pBuffer;
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(digest_MD5);
+ CPPUNIT_TEST( MD5_001 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+// -----------------------------------------------------------------------------
+class digest_SHA : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // ------------------------------------
+ void SHA_001()
+ {
+ rtl::OString aMsg1 = sSampleString;
+
+ sal_uInt8 *pBuffer = new sal_uInt8[ RTL_DIGEST_LENGTH_SHA ];
+ CPPUNIT_ASSERT( pBuffer );
+ memset(pBuffer, 0, RTL_DIGEST_LENGTH_SHA);
+
+ sal_uInt8 *pMsg1 = (sal_uInt8*)aMsg1.getStr();
+ sal_Int32 nLen = aMsg1.getLength();
+
+ rtlDigestError aError = rtl_digest_SHA(pMsg1, nLen, pBuffer, RTL_DIGEST_LENGTH_SHA);
+
+ CPPUNIT_ASSERT(aError == rtl_Digest_E_None );
+
+ rtl::OString aStr = createHex(pBuffer, RTL_DIGEST_LENGTH_SHA);
+ t_print("Decrypt SHA: %s\n", aStr.getStr());
+ CPPUNIT_ASSERT_MESSAGE("checksum of sample string is wrong. Code changes or sample problems, please check.", aStr.equals(sSampleString_SHA) );
+
+ delete [] pBuffer;
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(digest_SHA);
+ CPPUNIT_TEST( SHA_001 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+// -----------------------------------------------------------------------------
+class digest_SHA1 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // ------------------------------------
+ void SHA1_001()
+ {
+ rtl::OString aMsg1 = sSampleString;
+
+ sal_uInt8 *pBuffer = new sal_uInt8[ RTL_DIGEST_LENGTH_SHA1 ];
+ CPPUNIT_ASSERT( pBuffer );
+ memset(pBuffer, 0, RTL_DIGEST_LENGTH_SHA1);
+
+ sal_uInt8 *pMsg1 = (sal_uInt8*)aMsg1.getStr();
+ sal_Int32 nLen = aMsg1.getLength();
+
+ rtlDigestError aError = rtl_digest_SHA1(pMsg1, nLen, pBuffer, RTL_DIGEST_LENGTH_SHA1);
+
+ CPPUNIT_ASSERT(aError == rtl_Digest_E_None );
+
+ rtl::OString aStr = createHex(pBuffer, RTL_DIGEST_LENGTH_SHA1);
+ t_print("Decrypt SHA1: %s\n", aStr.getStr());
+ CPPUNIT_ASSERT_MESSAGE("checksum of sample string is wrong. Code changes or sample problems, please check.", aStr.equals(sSampleString_SHA1) );
+
+ delete [] pBuffer;
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(digest_SHA1);
+ CPPUNIT_TEST( SHA1_001 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+class digest_HMAC_MD5 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // ------------------------------------
+ void HMAC_MD5_001()
+ {
+ rtl::OString aMsg1 = sSampleString;
+
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ RTL_DIGEST_LENGTH_HMAC_MD5 ];
+ CPPUNIT_ASSERT( pKeyBuffer );
+ memset(pKeyBuffer, 0, RTL_DIGEST_LENGTH_HMAC_MD5);
+
+ sal_uInt8 *pBuffer = new sal_uInt8[ RTL_DIGEST_LENGTH_HMAC_MD5 ];
+ CPPUNIT_ASSERT( pBuffer );
+ memset(pBuffer, 0, RTL_DIGEST_LENGTH_HMAC_MD5);
+
+ sal_uInt8 *pMsg1 = (sal_uInt8*)aMsg1.getStr();
+ sal_Int32 nLen = aMsg1.getLength();
+
+ rtlDigestError aError = rtl_digest_HMAC_MD5(pKeyBuffer, RTL_DIGEST_LENGTH_HMAC_MD5, pMsg1, nLen, pBuffer, RTL_DIGEST_LENGTH_HMAC_MD5);
+
+ CPPUNIT_ASSERT(aError == rtl_Digest_E_None );
+
+ rtl::OString aStr = createHex(pBuffer, RTL_DIGEST_LENGTH_HMAC_MD5);
+ t_print("Decrypt HMAC_MD5: %s\n", aStr.getStr());
+ CPPUNIT_ASSERT_MESSAGE("md5sum of sample string is wrong. Code changes or sample problems, please check.", aStr.equals(sSampleString_HMAC_MD5) );
+
+ delete [] pBuffer;
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(digest_HMAC_MD5);
+ CPPUNIT_TEST( HMAC_MD5_001 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+class digest_HMAC_SHA1 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // ------------------------------------
+ void HMAC_SHA1_001()
+ {
+ rtl::OString aMsg1 = sSampleString;
+
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ RTL_DIGEST_LENGTH_HMAC_SHA1 ];
+ CPPUNIT_ASSERT( pKeyBuffer );
+ memset(pKeyBuffer, 0, RTL_DIGEST_LENGTH_HMAC_SHA1);
+
+ sal_uInt8 *pBuffer = new sal_uInt8[ RTL_DIGEST_LENGTH_HMAC_SHA1 ];
+ CPPUNIT_ASSERT( pBuffer );
+ memset(pBuffer, 0, RTL_DIGEST_LENGTH_HMAC_SHA1);
+
+ sal_uInt8 *pMsg1 = (sal_uInt8*)aMsg1.getStr();
+ sal_Int32 nLen = aMsg1.getLength();
+
+ rtlDigestError aError = rtl_digest_HMAC_SHA1(pKeyBuffer, RTL_DIGEST_LENGTH_HMAC_SHA1, pMsg1, nLen, pBuffer, RTL_DIGEST_LENGTH_HMAC_SHA1);
+
+ CPPUNIT_ASSERT(aError == rtl_Digest_E_None );
+
+ rtl::OString aStr = createHex(pBuffer, RTL_DIGEST_LENGTH_HMAC_SHA1);
+ t_print("Decrypt HMAC_SHA1: %s\n", aStr.getStr());
+ CPPUNIT_ASSERT_MESSAGE("md5sum of sample string is wrong. Code changes or sample problems, please check.", aStr.equals(sSampleString_HMAC_SHA1) );
+
+ delete [] pBuffer;
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(digest_HMAC_SHA1);
+ CPPUNIT_TEST( HMAC_SHA1_001 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+class digest_PBKDF2 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // ------------------------------------
+ rtl::OString /* key */ run_check_PBKDF2(rtl::OString const& _sPassword, bool _bClearSalt, sal_uInt32 _nCount)
+ {
+ sal_uInt32 nKeyLen = RTL_DIGEST_LENGTH_HMAC_SHA1;
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+ CPPUNIT_ASSERT( pKeyBuffer );
+ memset(pKeyBuffer, 0, nKeyLen);
+
+ sal_uInt8 *pPassword = (sal_uInt8*)_sPassword.getStr();
+ sal_Int32 nPasswordLen = _sPassword.getLength();
+
+ sal_uInt32 nSaltDataLen = RTL_DIGEST_LENGTH_HMAC_SHA1;
+ sal_uInt8 *pSaltData = new sal_uInt8[ nSaltDataLen ];
+ CPPUNIT_ASSERT( pSaltData );
+ memset(pSaltData, 0, nSaltDataLen);
+
+ if (! _bClearSalt)
+ {
+ // wilful contamination
+ pSaltData[0] = 1;
+ }
+
+ rtlDigestError aError = rtl_digest_PBKDF2(pKeyBuffer, nKeyLen, pPassword, nPasswordLen, pSaltData, nSaltDataLen, _nCount);
+
+ CPPUNIT_ASSERT(aError == rtl_Digest_E_None );
+
+ rtl::OString aKey = createHex(pKeyBuffer, nKeyLen);
+ t_print("Key: %s\n", aKey.getStr());
+
+ // rtl::OString sSalt = createHex(pSaltData, nSaltDataLen);
+ // t_print("Salt: %s\n", sSalt.getStr());
+
+ // CPPUNIT_ASSERT_MESSAGE("md5sum of sample string is wrong. Code changes or sample problems, please check.", aStr.equals(sSampleString_PBKDF2) );
+
+ delete [] pSaltData;
+ delete [] pKeyBuffer;
+ return aKey;
+ }
+
+ void PBKDF2_001()
+ {
+ rtl::OString aPassword = "Password";
+
+ // all permutations
+ run_check_PBKDF2(aPassword, false, 1);
+ run_check_PBKDF2(aPassword, false, 2);
+ run_check_PBKDF2(aPassword, true, 1);
+ run_check_PBKDF2(aPassword, true, 2);
+ run_check_PBKDF2(aPassword, false, 3);
+ run_check_PBKDF2(aPassword, false, 4);
+ run_check_PBKDF2(aPassword, true, 3);
+ run_check_PBKDF2(aPassword, true, 4);
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(digest_PBKDF2);
+ CPPUNIT_TEST( PBKDF2_001 );
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+
+class update : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void update_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_update(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+
+ void updateMD2_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_updateMD2(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+
+ void updateMD2_001()
+ {
+ rtlDigest aHandle = rtl_digest_create( rtl_Digest_AlgorithmMD2 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmMD2", aHandle != 0);
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8* pData = (const sal_uInt8*)aMsg.getStr();
+
+ rtlDigestError aError = rtl_digest_updateMD2(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("handle parameter 'pData' wrong", aError == rtl_Digest_E_Argument );
+
+ /* rtlDigestError */ aError = rtl_digest_updateMD2(aHandle, pData, 0);
+ CPPUNIT_ASSERT_MESSAGE("handle parameter 'nSize' wrong", aError == rtl_Digest_E_None );
+
+ rtl_digest_destroyMD2(aHandle);
+ }
+ void updateMD5_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_updateMD5(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+
+ void updateMD5_001()
+ {
+ // use wrong Algorithm!!! This is volitional!
+ rtlDigest aHandle = rtl_digest_create( rtl_Digest_AlgorithmMD2 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmMD2", aHandle != 0);
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8* pData = (const sal_uInt8*)aMsg.getStr();
+ sal_uInt32 nSize = ( aMsg.getLength() );
+
+ rtlDigestError aError = rtl_digest_updateMD5(aHandle, pData, nSize);
+ CPPUNIT_ASSERT_MESSAGE("handle parameter 'handle' wrong", aError == rtl_Digest_E_Algorithm );
+
+ rtl_digest_destroyMD5(aHandle);
+ }
+
+ void updateMD5_002()
+ {
+ rtlDigest aHandle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmMD5", aHandle != 0);
+
+ rtl::OString aMsg = sSampleString;
+ const sal_uInt8* pData = (const sal_uInt8*)aMsg.getStr();
+
+ rtlDigestError aError = rtl_digest_updateMD5(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("handle parameter 'pData' wrong", aError == rtl_Digest_E_Argument );
+
+ /* rtlDigestError */ aError = rtl_digest_updateMD5(aHandle, pData, 0);
+ CPPUNIT_ASSERT_MESSAGE("handle parameter 'nSize' wrong", aError == rtl_Digest_E_None );
+
+ rtl_digest_destroyMD5(aHandle);
+ }
+
+ void updateSHA_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_updateSHA(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+
+ void updateSHA1_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_updateSHA1(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+
+ void updateHMAC_MD5_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_updateHMAC_MD5(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+
+ void updateHMAC_SHA1_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_updateHMAC_SHA1(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(update);
+ CPPUNIT_TEST(update_000);
+ CPPUNIT_TEST(updateMD5_000);
+ CPPUNIT_TEST(updateMD5_001);
+ CPPUNIT_TEST(updateMD5_002);
+ CPPUNIT_TEST(updateMD5_000);
+ CPPUNIT_TEST(updateSHA_000);
+ CPPUNIT_TEST(updateSHA1_000);
+ CPPUNIT_TEST(updateHMAC_MD5_000);
+ CPPUNIT_TEST(updateHMAC_SHA1_000);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+
+class get : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void get_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_get(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+ void getMD5_000()
+ {
+ rtlDigest aHandle = NULL;
+ rtlDigestError aError = rtl_digest_getMD5(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("does not handle wrong parameter", aError == rtl_Digest_E_Argument );
+ }
+ void getMD5_001()
+ {
+ // test with wrong algorithm
+ rtlDigest aHandle = rtl_digest_create( rtl_Digest_AlgorithmMD2 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmMD2", aHandle != 0);
+
+ sal_uInt32 nKeyLen = rtl_digest_queryLength( aHandle );
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+
+ rtlDigestError aError = rtl_digest_getMD5(aHandle, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("handle 2. parameter wrong", aError == rtl_Digest_E_Argument );
+
+ /* rtlDigestError */ aError = rtl_digest_getMD5(aHandle, pKeyBuffer, 0);
+ CPPUNIT_ASSERT_MESSAGE("handle parameter 'handle' wrong", aError == rtl_Digest_E_Algorithm );
+
+ rtl_digest_destroyMD2(aHandle);
+ }
+
+ void getMD5_002()
+ {
+ rtlDigest aHandle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmMD5", aHandle != 0);
+
+ sal_uInt32 nKeyLen = rtl_digest_queryLength( aHandle );
+ sal_uInt8 *pKeyBuffer = new sal_uInt8[ nKeyLen ];
+
+ rtlDigestError aError = rtl_digest_getMD5(aHandle, NULL /* pKeyBuffer */ , nKeyLen);
+ CPPUNIT_ASSERT_MESSAGE("handle parameter 'pData' wrong", aError == rtl_Digest_E_Argument );
+
+ /* rtlDigestError */ aError = rtl_digest_getMD5(aHandle, pKeyBuffer, 0);
+ CPPUNIT_ASSERT_MESSAGE("handle parameter 'nSize' wrong", aError == rtl_Digest_E_BufferSize );
+
+ rtl_digest_destroyMD5(aHandle);
+ delete [] pKeyBuffer;
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(get);
+ CPPUNIT_TEST(get_000);
+ CPPUNIT_TEST(getMD5_000);
+ CPPUNIT_TEST(getMD5_001);
+ CPPUNIT_TEST(getMD5_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+
+// -----------------------------------------------------------------------------
+class destroy : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void destroy_001()
+ {
+ rtlDigest handle = rtl_digest_create( rtl_Digest_AlgorithmMD5 );
+ CPPUNIT_ASSERT_MESSAGE("create with rtl_Digest_AlgorithmMD5", handle != 0);
+
+ // not really testable
+ // LLA: good will test.
+ rtl_digest_destroy( handle );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(destroy);
+ CPPUNIT_TEST(destroy_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class create
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::create, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::createMD2, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::createMD5, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::createSHA, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::createSHA1, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::createHMAC_MD5, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::createHMAC_SHA1, "rtl_digest");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::destroy, "rtl_digest");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::queryAlgorithm, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::queryLength, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::init, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::equalTests, "rtl_digest");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::digest_MD2, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::digest_MD5, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::digest_SHA, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::digest_SHA1, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::digest_HMAC_MD5, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::digest_HMAC_SHA1, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::digest_PBKDF2, "rtl_digest");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::update, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::get, "rtl_digest");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_digest::destroy, "rtl_digest");
+} // namespace rtl_digest
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/rtl/doublelock/makefile.mk b/sal/qa/rtl/doublelock/makefile.mk
new file mode 100644
index 000000000000..45259fd3cba0
--- /dev/null
+++ b/sal/qa/rtl/doublelock/makefile.mk
@@ -0,0 +1,70 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_doublelock
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:testjob by codegen.pl
+
+.IF "$(GUI)" == "WNT"
+ CFLAGS+=/Ob1
+.ENDIF
+
+SHL1OBJS= \
+ $(SLO)$/rtl_doublelocking.obj
+
+SHL1TARGET= rtl_doublelocking
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+
+SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/rtl/doublelock/rtl_doublelocking.cxx b/sal/qa/rtl/doublelock/rtl_doublelocking.cxx
new file mode 100644
index 000000000000..716a37df0281
--- /dev/null
+++ b/sal/qa/rtl/doublelock/rtl_doublelocking.cxx
@@ -0,0 +1,260 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+#include <sal/types.h>
+
+#ifndef _RTL_USTRING_HXX_
+#include <rtl/string.hxx>
+#endif
+
+#ifndef _OSL_THREAD_HXX
+#include <osl/thread.hxx>
+#endif
+#include <osl/time.h>
+
+#include <rtl/instance.hxx>
+
+#include <testshl/simpleheader.hxx>
+
+// -----------------------------------------------------------------------------
+#define CONST_TEST_STRING "gregorian"
+
+namespace {
+struct Gregorian : public rtl::StaticWithInit<const ::rtl::OUString, Gregorian> {
+ const ::rtl::OUString operator () () {
+ return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( CONST_TEST_STRING ));
+ }
+};
+}
+
+inline void printOUString( ::rtl::OUString const & _suStr )
+{
+ rtl::OString aString;
+
+ t_print( "OUString: " );
+ aString = ::rtl::OUStringToOString( _suStr, RTL_TEXTENCODING_ASCII_US );
+ t_print( "'%s'\n", aString.getStr( ) );
+}
+
+// -----------------------------------------------------------------------------
+namespace ThreadHelper
+{
+ // typedef enum {
+ // QUIET=1,
+ // VERBOSE
+ // } eSleepVerboseMode;
+
+ void thread_sleep_tenth_sec(sal_Int32 _nTenthSec/*, eSleepVerboseMode nVerbose = VERBOSE*/)
+ {
+ // if (nVerbose == VERBOSE)
+ // {
+ // t_print("wait %d tenth seconds. ", _nTenthSec );
+ // fflush(stdout);
+ // }
+#ifdef WNT //Windows
+ Sleep(_nTenthSec * 100 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ TimeValue nTV;
+ nTV.Seconds = static_cast<sal_uInt32>( _nTenthSec/10 );
+ nTV.Nanosec = ( (_nTenthSec%10 ) * 100000000 );
+ osl_waitThread(&nTV);
+#endif
+ // if (nVerbose == VERBOSE)
+ // {
+ // t_print("done\n");
+ // }
+ }
+}
+
+// -----------------------------------------------------------------------------
+
+/** Simple thread for testing Thread-create.
+ * Just add 1 of value 0, and after running, result is 1.
+ */
+class OGetThread : public osl::Thread
+{
+ sal_Int32 m_nOK;
+ sal_Int32 m_nFails;
+
+ rtl::OUString m_sConstStr;
+public:
+ OGetThread()
+ :m_nOK(0),
+ m_nFails(0)
+ {
+ m_sConstStr = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( CONST_TEST_STRING ));
+ }
+
+ sal_Int32 getOK() { return m_nOK; }
+ sal_Int32 getFails() {return m_nFails;}
+
+protected:
+
+ /** guarded value which initialized 0
+
+ @see ThreadSafeValue
+ */
+ void SAL_CALL run()
+ {
+ while(schedule())
+ {
+ rtl::OUString aStr = Gregorian::get();
+ // printOUString(aStr);
+ // printOUString(m_sConstStr);
+ if (aStr.equals(m_sConstStr))
+ {
+ m_nOK++;
+ }
+ else
+ {
+ m_nFails++;
+ }
+ ThreadHelper::thread_sleep_tenth_sec(1);
+ }
+ }
+
+public:
+
+ virtual void SAL_CALL suspend()
+ {
+ ::osl::Thread::suspend();
+ }
+
+ ~OGetThread()
+ {
+ if (isRunning())
+ {
+ t_print("error: not terminated.\n");
+ }
+ }
+};
+
+// -----------------------------------------------------------------------------
+namespace rtl_DoubleLocking
+{
+
+/** Test of the osl::Thread::create method
+ */
+
+ class getValue : public CppUnit::TestFixture
+ {
+ public:
+
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+
+ void getValue_001()
+ {
+ rtl::OUString aStr = Gregorian::get();
+ printOUString(aStr);
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "Gregorian::get() failed, wrong value expected.",
+ aStr.getLength() != 0
+ );
+ }
+
+ /** check 2 threads.
+
+ ALGORITHM:
+ Here the function should show, that 2 different threads,
+ which only increase a value, should run at the same time with same prio.
+ The test fails, if the difference between the two values is more than 5%
+ but IMHO this isn't a failure, it's only a feature of the OS.
+ */
+
+ void getValue_002()
+ {
+ // initial 5 threads with different priorities
+ OGetThread* pThread = new OGetThread();
+ OGetThread* p2Thread = new OGetThread();
+
+ //Create them and start running at the same time
+ pThread->create();
+ p2Thread->create();
+
+ ThreadHelper::thread_sleep_tenth_sec(50);
+
+ pThread->terminate();
+ p2Thread->terminate();
+
+ sal_Int32 nValueOK = 0;
+ nValueOK = pThread->getOK();
+
+ sal_Int32 nValueOK2 = 0;
+ nValueOK2 = p2Thread->getOK();
+
+ t_print("Value in Thread #1 is %d\n", nValueOK);
+ t_print("Value in Thread #2 is %d\n", nValueOK2);
+
+ sal_Int32 nValueFails = 0;
+ nValueFails = pThread->getFails();
+
+ sal_Int32 nValueFails2 = 0;
+ nValueFails2 = p2Thread->getFails();
+
+ t_print("Fails in Thread #1 is %d\n", nValueFails);
+ t_print("Fails in Thread #2 is %d\n", nValueFails2);
+
+ // ThreadHelper::thread_sleep_tenth_sec(1);
+ pThread->join();
+ p2Thread->join();
+
+ delete pThread;
+ delete p2Thread;
+
+ CPPUNIT_ASSERT_MESSAGE(
+ "getValue() failed, wrong value expected.",
+ nValueOK != 0 && nValueFails == 0 && nValueFails2 == 0
+ );
+ }
+
+ CPPUNIT_TEST_SUITE(getValue);
+ CPPUNIT_TEST(getValue_001);
+ CPPUNIT_TEST(getValue_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class create
+// -----------------------------------------------------------------------------
+ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_DoubleLocking::getValue, "rtl_DoubleLocking");
+} // namespace rtl_DoubleLocking
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/rtl/locale/makefile.mk b/sal/qa/rtl/locale/makefile.mk
new file mode 100644
index 000000000000..d6c9c6b674a3
--- /dev/null
+++ b/sal/qa/rtl/locale/makefile.mk
@@ -0,0 +1,69 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_locale
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:locale by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_locale.obj
+
+SHL1TARGET= rtl_locale
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:locale
+# END ------------------------------------------------------------------
+
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/locale/rtl_locale.cxx b/sal/qa/rtl/locale/rtl_locale.cxx
new file mode 100644
index 000000000000..3879ad8a2048
--- /dev/null
+++ b/sal/qa/rtl/locale/rtl_locale.cxx
@@ -0,0 +1,343 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// autogenerated file with codegen.pl
+
+#include <testshl/simpleheader.hxx>
+#include <rtl/locale.hxx>
+#include <osl/thread.h>
+
+namespace rtl_locale
+{
+ // default locale for test purpose
+ void setDefaultLocale()
+ {
+ rtl::OLocale::setDefault(rtl::OUString::createFromAscii("de"), rtl::OUString::createFromAscii("DE"), /* rtl::OUString() */ rtl::OUString::createFromAscii("hochdeutsch") );
+ }
+
+class getDefault : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void getDefault_000()
+ {
+ // this is demonstration code
+ // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
+
+ // due to the fact, we set the default locale at first, this test is no longer possible
+ // ::rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ // CPPUNIT_ASSERT_MESSAGE("locale must be null", aLocale.getData() == NULL);
+
+ }
+
+ void getDefault_001()
+ {
+ // rtl::OLocale::setDefault(rtl::OUString::createFromAscii("de"), rtl::OUString::createFromAscii("DE"), rtl::OUString());
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ CPPUNIT_ASSERT_MESSAGE("locale must not null", aLocale.getData() != NULL);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(getDefault);
+ CPPUNIT_TEST(getDefault_000);
+ CPPUNIT_TEST(getDefault_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getDefault
+
+
+class setDefault : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ setDefaultLocale();
+ }
+
+ // insert your test code here.
+ void setDefault_001()
+ {
+ rtl::OLocale::setDefault(rtl::OUString::createFromAscii("en"), rtl::OUString::createFromAscii("US"), rtl::OUString());
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ CPPUNIT_ASSERT_MESSAGE("locale must not null", aLocale.getData() != NULL);
+
+ // be sure to not GPF
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(setDefault);
+ CPPUNIT_TEST(setDefault_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class setDefault
+
+
+class getLanguage : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void getLanguage_001()
+ {
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ rtl::OUString suLanguage = aLocale.getLanguage();
+ t_print("Language: %s\n", rtl::OUStringToOString(suLanguage, osl_getThreadTextEncoding()).getStr());
+ CPPUNIT_ASSERT_MESSAGE("locale language must be 'de'", suLanguage.equals(rtl::OUString::createFromAscii("de")));
+ }
+ void getLanguage_002()
+ {
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ rtl::OUString suLanguage = rtl_locale_getLanguage(aLocale.getData());
+ t_print("Language: %s\n", rtl::OUStringToOString(suLanguage, osl_getThreadTextEncoding()).getStr());
+ CPPUNIT_ASSERT_MESSAGE("locale language must be 'de'", suLanguage.equals(rtl::OUString::createFromAscii("de")));
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(getLanguage);
+ CPPUNIT_TEST(getLanguage_001);
+ CPPUNIT_TEST(getLanguage_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getLanguage
+
+
+class getCountry : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void getCountry_001()
+ {
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ rtl::OUString suCountry = aLocale.getCountry();
+ t_print("Country: %s\n", rtl::OUStringToOString(suCountry, osl_getThreadTextEncoding()).getStr());
+ CPPUNIT_ASSERT_MESSAGE("locale country must be 'DE'", suCountry.equals(rtl::OUString::createFromAscii("DE")));
+ }
+ void getCountry_002()
+ {
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ rtl::OUString suCountry = rtl_locale_getCountry(aLocale.getData());
+ t_print("Country: %s\n", rtl::OUStringToOString(suCountry, osl_getThreadTextEncoding()).getStr());
+ CPPUNIT_ASSERT_MESSAGE("locale country must be 'DE'", suCountry.equals(rtl::OUString::createFromAscii("DE")));
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(getCountry);
+ CPPUNIT_TEST(getCountry_001);
+ CPPUNIT_TEST(getCountry_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getCountry
+
+
+class getVariant : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void getVariant_001()
+ {
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ rtl::OUString suVariant = aLocale.getVariant();
+ t_print("Variant: %s\n", rtl::OUStringToOString(suVariant, osl_getThreadTextEncoding()).getStr());
+ CPPUNIT_ASSERT_MESSAGE("locale variant must be 'hochdeutsch'", suVariant.equals(rtl::OUString::createFromAscii("hochdeutsch")));
+ }
+ void getVariant_002()
+ {
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ rtl::OUString suVariant = rtl_locale_getVariant(aLocale.getData());
+ t_print("Variant: %s\n", rtl::OUStringToOString(suVariant, osl_getThreadTextEncoding()).getStr());
+ CPPUNIT_ASSERT_MESSAGE("locale variant must be 'hochdeutsch'", suVariant.equals(rtl::OUString::createFromAscii("hochdeutsch")));
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(getVariant);
+ CPPUNIT_TEST(getVariant_001);
+ CPPUNIT_TEST(getVariant_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getVariant
+
+
+class hashCode : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void hashCode_001()
+ {
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ sal_Int32 nHashCode = aLocale.hashCode();
+ t_print("Hashcode: %d\n", nHashCode);
+ CPPUNIT_ASSERT_MESSAGE("locale hashcode must be 3831", nHashCode != 0);
+ }
+ void hashCode_002()
+ {
+ rtl::OLocale aLocale = ::rtl::OLocale::getDefault();
+ sal_Int32 nHashCode = rtl_locale_hashCode(aLocale.getData());
+ t_print("Hashcode: %d\n", nHashCode);
+ CPPUNIT_ASSERT_MESSAGE("locale hashcode must be 3831", nHashCode != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(hashCode);
+ CPPUNIT_TEST(hashCode_001);
+ CPPUNIT_TEST(hashCode_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class hashCode
+
+
+class equals : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void equals_001()
+ {
+ rtl::OLocale aLocale1 = rtl::OLocale::registerLocale(rtl::OUString::createFromAscii("en"), rtl::OUString::createFromAscii("US"), rtl::OUString());
+ rtl::OLocale aLocale2 = rtl::OLocale::registerLocale(rtl::OUString::createFromAscii("en"), rtl::OUString::createFromAscii("US"));
+
+ sal_Bool bLocaleAreEqual = sal_False;
+ bLocaleAreEqual = (aLocale1 == aLocale2);
+
+ CPPUNIT_ASSERT_MESSAGE("check operator ==()", bLocaleAreEqual == sal_True);
+ }
+
+ void equals_002()
+ {
+ rtl::OLocale aLocale1 = rtl::OLocale::registerLocale(rtl::OUString::createFromAscii("en"), rtl::OUString::createFromAscii("US"), rtl::OUString());
+ rtl::OLocale aLocale2 = rtl::OLocale::registerLocale(rtl::OUString::createFromAscii("en"), rtl::OUString::createFromAscii("US"));
+
+ sal_Int32 nEqual = rtl_locale_equals(aLocale1.getData(), aLocale2.getData());
+ t_print("rtl_locale_equals() result: %d\n", nEqual);
+ CPPUNIT_ASSERT(nEqual != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(equals);
+ CPPUNIT_TEST(equals_001);
+ CPPUNIT_TEST(equals_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class equals
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_locale::getDefault, "rtl_locale");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_locale::setDefault, "rtl_locale");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_locale::getLanguage, "rtl_locale");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_locale::getCountry, "rtl_locale");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_locale::getVariant, "rtl_locale");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_locale::hashCode, "rtl_locale");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_locale::equals, "rtl_locale");
+} // namespace rtl_locale
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+// NOADDITIONAL;
+
+void RegisterAdditionalFunctions(FktRegFuncPtr)
+{
+ // start message
+ t_print("Initializing ...\n" );
+ rtl_locale::setDefaultLocale();
+ t_print("Initialization Done.\n" );
+}
diff --git a/sal/qa/rtl/logfile/makefile.mk b/sal/qa/rtl/logfile/makefile.mk
new file mode 100644
index 000000000000..9b52e0a45b37
--- /dev/null
+++ b/sal/qa/rtl/logfile/makefile.mk
@@ -0,0 +1,63 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_logfile
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# --- BEGIN --------------------------------------------------------
+SHL1OBJS= \
+ $(SLO)$/rtl_logfile.obj
+SHL1TARGET= rtl_logfile
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END --------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/rtl/logfile/rtl_logfile.cxx b/sal/qa/rtl/logfile/rtl_logfile.cxx
new file mode 100644
index 000000000000..bae6e5c4d3e8
--- /dev/null
+++ b/sal/qa/rtl/logfile/rtl_logfile.cxx
@@ -0,0 +1,260 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// LLA:
+// this file is converted to use with testshl2
+// original was placed in sal/test/textenc.cxx
+
+
+// -----------------------------------------------------------------------------
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(UNX) || defined(OS2)
+# include <unistd.h>
+#endif
+
+#include <rtl/logfile.hxx>
+#include <testshl/simpleheader.hxx>
+
+// #ifndef _OSL_MODULE_HXX_
+// #include <osl/module.hxx>
+// #endif
+#include <osl/file.hxx>
+#if ( defined WNT ) // Windows
+#include <tools/prewin.h>
+// #define UNICODE
+// #define WIN32_LEAN_AND_MEAN
+// #include <windows.h>
+#include <tchar.h>
+#include <tools/postwin.h>
+#endif
+
+using namespace ::osl;
+
+inline void printUString( const ::rtl::OUString & str, const sal_Char * msg = "" )
+{
+
+ if (strlen(msg) > 0)
+ {
+ t_print("%s: ", msg );
+ }
+ rtl::OString aString;
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", (char *)aString.getStr( ) );
+}
+
+/** get the absolute source file URL "file:///.../sal/qa/rtl/logfile/"
+ */
+
+inline ::rtl::OUString getTempPath( void )
+{
+#ifdef UNX
+ rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///tmp/"));
+#else /* Windows */
+ rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///c:/temp/"));
+#endif
+ return suDirURL;
+}
+
+/** if the file exist
+ */
+bool t_fileExist(rtl::OUString const& _sFilename)
+{
+ ::osl::FileBase::RC nError1;
+ ::osl::File aTestFile( _sFilename );
+ nError1 = aTestFile.open ( OpenFlag_Read );
+ if ( ( ::osl::FileBase::E_NOENT != nError1 ) && ( ::osl::FileBase::E_ACCES != nError1 ) )
+ {
+ aTestFile.close( );
+ return true;
+ }
+ return false;
+}
+/** get Current PID.
+*/
+inline ::rtl::OUString getCurrentPID( )
+{
+ //~ Get current PID and turn it into OUString;
+ int nPID = 0;
+#ifdef WNT
+ nPID = GetCurrentProcessId();
+#else
+ nPID = getpid();
+#endif
+ return ( ::rtl::OUString::valueOf( ( long )nPID ) );
+}
+
+
+// -----------------------------------------------------------------------------
+/*
+ * LLA:
+ * check if logfile is create
+ * be careful with relative logfiles they will create near the source, maybe it's no write access to it.
+ * use absolute path to logfile instead.
+ */
+namespace rtl_logfile
+{
+ class logfile : public CppUnit::TestFixture
+ {
+ public:
+
+ //directly call rtl_logfile_trace
+ void logfile_001()
+ {
+#ifdef SOLARIS
+ putenv(const_cast< char * >("RTL_LOGFILE=/tmp/logfile1"));
+#endif
+#ifdef WNT
+ putenv("RTL_LOGFILE=c:\\temp\\logfile1");
+#endif
+#ifdef LINUX
+ setenv("RTL_LOGFILE", "/tmp/logfile1", 0);
+#endif
+ rtl_logfile_trace("trace %d\n", 2 );
+ rtl_logfile_trace("trace %d %d\n" , 1,2 );
+ rtl_logfile_trace("trace %d %d %d\n" , 1 , 2 ,3 );
+
+ rtl::OUString suFilePath = getTempPath();
+ suFilePath += rtl::OUString::createFromAscii("logfile1_") + getCurrentPID( );
+ suFilePath += rtl::OUString::createFromAscii(".log");
+
+ ::osl::FileBase::RC nError1;
+ ::osl::File aTestFile( suFilePath );
+ printUString( suFilePath );
+ nError1 = aTestFile.open ( OpenFlag_Read );
+ CPPUNIT_ASSERT_MESSAGE("create the log file: but the logfile does not exist",
+ ( ::osl::FileBase::E_NOENT != nError1 ) &&
+ ( ::osl::FileBase::E_ACCES != nError1 ) );
+ sal_Char buffer_read[400];
+ sal_uInt64 nCount_read;
+ nError1 = aTestFile.read( buffer_read, 400, nCount_read );
+ //t_print("buffer is %s\n", buffer_read );
+ CPPUNIT_ASSERT_MESSAGE("write right logs", strstr( buffer_read, "trace 1 2 3") != NULL );
+ aTestFile.sync();
+ aTestFile.close();
+ /*// delete logfile on the disk
+
+ nError1 = osl::File::remove( suFilePath );
+ printError( nError1 );
+ CPPUNIT_ASSERT_MESSAGE( "In deleteTestFile Function: remove ", ( ::osl::FileBase::E_None == nError1 ) || ( nError1 == ::osl::FileBase::E_NOENT ) );
+ */
+ }
+ //Profiling output should only be generated for a special product version of OpenOffice
+ // which is compiled with a defined preprocessor symbol 'TIMELOG'. Now, the symbol not defined
+ void logfile_002()
+ {
+#ifdef SOLARIS
+ putenv(const_cast< char * >("RTL_LOGFILE=/tmp/logfile2"));
+#endif
+#ifdef WNT
+ putenv("RTL_LOGFILE=c:\\temp\\logfile2");
+#endif
+#ifdef LINUX
+ setenv("RTL_LOGFILE", "/tmp/logfile2", 0);
+#endif
+ RTL_LOGFILE_TRACE( "trace the log" );
+ RTL_LOGFILE_TRACE1( "trace %d" , 1 );
+ RTL_LOGFILE_TRACE2( "trace %d %d" , 1,2 );
+ RTL_LOGFILE_TRACE3( "trace %d %d %d" , 1 , 2 ,3 );
+// TODO: assertion test!
+ }
+
+ void logfile_003()
+ {
+#ifdef SOLARIS
+ putenv(const_cast< char * >("RTL_LOGFILE=/tmp/logfile2"));
+#endif
+#ifdef WNT
+ putenv("RTL_LOGFILE=c:\\temp\\logfile2");
+#endif
+#ifdef LINUX
+ setenv("RTL_LOGFILE", "/tmp/logfile2", 0);
+#endif
+ RTL_LOGFILE_CONTEXT ( foo , "foo-function" );
+ RTL_LOGFILE_CONTEXT_TRACE ( foo , "trace" );
+ RTL_LOGFILE_CONTEXT_TRACE1 ( foo , "trace %d" , 1 );
+ RTL_LOGFILE_CONTEXT_TRACE2 ( foo , "trace %d %d" , 1 , 2 );
+ RTL_LOGFILE_CONTEXT_TRACE3 ( foo , "trace %d %d %d" , 1 , 2 , 3);
+// TODO: assertion test!
+ }
+
+
+ CPPUNIT_TEST_SUITE( logfile );
+ CPPUNIT_TEST( logfile_001 );
+ CPPUNIT_TEST( logfile_002 );
+ CPPUNIT_TEST( logfile_003 );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+} // namespace rtl_logfile
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_logfile::logfile, "rtl_logfile" );
+
+// -----------------------------------------------------------------------------
+NOADDITIONAL;
+
+//~ do some clean up work after all test completed.
+class GlobalObject
+{
+public:
+ ~GlobalObject()
+ {
+ try
+ {
+ t_print( "\n#Do some clean-ups ... only delete logfile1_*.log here!\n" );
+ rtl::OUString suFilePath = getTempPath();
+ suFilePath += rtl::OUString::createFromAscii("logfile1_") + getCurrentPID( );
+ suFilePath += rtl::OUString::createFromAscii(".log");
+
+ //if ( ifFileExist( suFilePath ) == sal_True )
+ ::osl::FileBase::RC nError1;
+ nError1 = osl::File::remove( suFilePath );
+#ifdef WNT
+ t_print("Please remove logfile* manully! Error is Permision denied!");
+#endif
+ }
+ catch (CppUnit::Exception &e)
+ {
+ t_print("Exception caught in GlobalObject dtor(). Exception message: '%s'. Source line: %d\n", e.what(), e.sourceLine().lineNumber());
+ }
+ catch (...)
+ {
+ t_print("Exception caught (...) in GlobalObject dtor()\n");
+ }
+ }
+};
+
+GlobalObject theGlobalObject;
+
+
+
diff --git a/sal/qa/rtl/math/makefile.mk b/sal/qa/rtl/math/makefile.mk
new file mode 100644
index 000000000000..59f2ecc495bb
--- /dev/null
+++ b/sal/qa/rtl/math/makefile.mk
@@ -0,0 +1,55 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#***********************************************************************/
+
+.IF "$(OOO_SUBSEQUENT_TESTS)" == ""
+nothing .PHONY:
+.ELSE
+
+PRJ = ../../..
+PRJNAME = sal
+TARGET = qa_rtl_profile
+
+ENABLE_EXCEPTIONS = TRUE
+
+.INCLUDE: settings.mk
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+SHL1IMPLIB = i$(SHL1TARGET)
+SHL1OBJS = $(SLO)/test-rtl-math.obj
+SHL1RPATH = NONE
+SHL1STDLIBS = $(CPPUNITLIB) $(SALLIB)
+SHL1TARGET = test-rtl-math
+SHL1VERSIONMAP = $(PRJ)/qa/export.map
+DEF1NAME = $(SHL1TARGET)
+
+SLOFILES = $(SHL1OBJS)
+
+.INCLUDE: target.mk
+.INCLUDE: _cppunit.mk
+
+.END
diff --git a/sal/qa/rtl/math/test-rtl-math.cxx b/sal/qa/rtl/math/test-rtl-math.cxx
new file mode 100644
index 000000000000..8e9875444280
--- /dev/null
+++ b/sal/qa/rtl/math/test-rtl-math.cxx
@@ -0,0 +1,76 @@
+/*************************************************************************
+*
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* Copyright 2000, 2010 Oracle and/or its affiliates.
+*
+* OpenOffice.org - a multi-platform office productivity suite
+*
+* This file is part of OpenOffice.org.
+*
+* OpenOffice.org is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License version 3
+* only, as published by the Free Software Foundation.
+*
+* OpenOffice.org is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Lesser General Public License version 3 for more details
+* (a copy is included in the LICENSE file that accompanied this code).
+*
+* You should have received a copy of the GNU Lesser General Public License
+* version 3 along with OpenOffice.org. If not, see
+* <http://www.openoffice.org/license.html>
+* for a copy of the LGPLv3 License.
+*
+************************************************************************/
+
+#include "precompiled_sal.hxx"
+#include "sal/config.h"
+
+#include "cppunit/TestAssert.h"
+#include "cppunit/TestFixture.h"
+#include "cppunit/extensions/HelperMacros.h"
+#include "cppunit/plugin/TestPlugIn.h"
+#include "rtl/math.hxx"
+#include "rtl/ustring.h"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+
+namespace {
+
+class Test: public CppUnit::TestFixture {
+public:
+ void test_stringToDouble_good() {
+ rtl_math_ConversionStatus status;
+ sal_Int32 end;
+ double res = rtl::math::stringToDouble(
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" +1.E01foo")),
+ sal_Unicode('.'), sal_Unicode(','), &status, &end);
+ CPPUNIT_ASSERT_EQUAL(rtl_math_ConversionStatus_Ok, status);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(RTL_CONSTASCII_LENGTH(" +1.E01")), end);
+ CPPUNIT_ASSERT_EQUAL(10.0, res);
+ }
+
+ void test_stringToDouble_bad() {
+ rtl_math_ConversionStatus status;
+ sal_Int32 end;
+ double res = rtl::math::stringToDouble(
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" +Efoo")),
+ sal_Unicode('.'), sal_Unicode(','), &status, &end);
+ CPPUNIT_ASSERT_EQUAL(rtl_math_ConversionStatus_Ok, status);
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), end);
+ CPPUNIT_ASSERT_EQUAL(0.0, res);
+ }
+
+ CPPUNIT_TEST_SUITE(Test);
+ CPPUNIT_TEST(test_stringToDouble_good);
+ CPPUNIT_TEST(test_stringToDouble_bad);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(Test);
+
+}
+
+CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sal/qa/rtl/ostring/joblist.txt b/sal/qa/rtl/ostring/joblist.txt
new file mode 100644
index 000000000000..81d1b7a6ba8e
--- /dev/null
+++ b/sal/qa/rtl/ostring/joblist.txt
@@ -0,0 +1,10 @@
+# JobFile for rtl_OString
+# header source sal/inc/rtl/string.hxx
+
+rtl_OString.valueOf.valueOf_test_001
+rtl_OString.valueOf.valueOf_test_002
+rtl_OString.valueOf.valueOf_test_003
+rtl_OString.valueOf.valueOf_test_004
+rtl_OString.valueOf.valueOf_test_005
+rtl_OString.valueOf.valueOf_test_006
+rtl_OString.valueOf.valueOf_test_007
diff --git a/sal/qa/rtl/ostring/makefile.mk b/sal/qa/rtl/ostring/makefile.mk
new file mode 100644
index 000000000000..06469b38a407
--- /dev/null
+++ b/sal/qa/rtl/ostring/makefile.mk
@@ -0,0 +1,93 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=qa_rtl_ostring2
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:joblist by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_OString2.obj
+
+SHL1TARGET= rtl_OString2
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF2EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:joblist
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+SHL2OBJS= \
+ $(SLO)$/rtl_str.obj
+
+SHL2TARGET= rtl_str
+SHL2STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL2IMPLIB= i$(SHL2TARGET)
+DEF2NAME =$(SHL2TARGET)
+SHL2VERSIONMAP= $(PRJ)$/qa$/export.map
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+SHL3OBJS= \
+ $(SLO)$/rtl_string.obj
+
+SHL3TARGET= rtl_string
+SHL3STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL3IMPLIB= i$(SHL3TARGET)
+DEF3NAME =$(SHL3TARGET)
+SHL3VERSIONMAP= $(PRJ)$/qa$/export.map
+# END ------------------------------------------------------------------
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/ostring/rtl_OString2.cxx b/sal/qa/rtl/ostring/rtl_OString2.cxx
new file mode 100644
index 000000000000..ee380c86812d
--- /dev/null
+++ b/sal/qa/rtl/ostring/rtl_OString2.cxx
@@ -0,0 +1,568 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// autogenerated file with codegen.pl
+// There exist some more test code in sal/qa/rtl_strings/rtl_OString.cxx
+
+#include <testshl/simpleheader.hxx>
+#include "valueequal.hxx"
+
+namespace rtl_OString
+{
+
+class valueOf : public CppUnit::TestFixture
+{
+ void valueOf_float_test_impl(float _nValue)
+ {
+ rtl::OString sValue;
+ sValue = rtl::OString::valueOf( _nValue );
+ t_print(T_VERBOSE, "nFloat := %.9f sValue := %s\n", _nValue, sValue.getStr());
+
+ float nValueATOF = static_cast<float>(atof( sValue.getStr() ));
+
+ bool bEqualResult = is_float_equal(_nValue, nValueATOF);
+ CPPUNIT_ASSERT_MESSAGE("Values are not equal.", bEqualResult == true);
+ }
+
+ void valueOf_float_test(float _nValue)
+ {
+ valueOf_float_test_impl(_nValue);
+
+ // test also the negative part.
+ float nNegativeValue = -_nValue;
+ valueOf_float_test_impl(nNegativeValue);
+ }
+
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void valueOf_float_test_001()
+ {
+ // this is demonstration code
+ // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
+ float nValue = 3.0f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_002()
+ {
+ float nValue = 3.5f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_003()
+ {
+ float nValue = 3.0625f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_004()
+ {
+ float nValue = 3.502525f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_005()
+ {
+ float nValue = 3.141592f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_006()
+ {
+ float nValue = 3.5025255f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_007()
+ {
+ float nValue = 3.0039062f;
+ valueOf_float_test(nValue);
+ }
+
+private:
+
+ void valueOf_double_test_impl(double _nValue)
+ {
+ rtl::OString sValue;
+ sValue = rtl::OString::valueOf( _nValue );
+ t_print(T_VERBOSE, "nDouble := %.20f sValue := %s\n", _nValue, sValue.getStr());
+
+ double nValueATOF = atof( sValue.getStr() );
+
+ bool bEqualResult = is_double_equal(_nValue, nValueATOF);
+ CPPUNIT_ASSERT_MESSAGE("Values are not equal.", bEqualResult == true);
+ }
+
+ void valueOf_double_test(double _nValue)
+ {
+ valueOf_double_test_impl(_nValue);
+
+ // test also the negative part.
+ double nNegativeValue = -_nValue;
+ valueOf_double_test_impl(nNegativeValue);
+ }
+public:
+
+ // valueOf double
+ void valueOf_double_test_001()
+ {
+ double nValue = 3.0;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_002()
+ {
+ double nValue = 3.5;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_003()
+ {
+ double nValue = 3.0625;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_004()
+ {
+ double nValue = 3.1415926535;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_005()
+ {
+ double nValue = 3.141592653589793;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_006()
+ {
+ double nValue = 3.1415926535897932;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_007()
+ {
+ double nValue = 3.14159265358979323;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_008()
+ {
+ double nValue = 3.141592653589793238462643;
+ valueOf_double_test(nValue);
+ }
+
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(valueOf);
+ CPPUNIT_TEST(valueOf_float_test_001);
+ CPPUNIT_TEST(valueOf_float_test_002);
+ CPPUNIT_TEST(valueOf_float_test_003);
+ CPPUNIT_TEST(valueOf_float_test_004);
+ CPPUNIT_TEST(valueOf_float_test_005);
+ CPPUNIT_TEST(valueOf_float_test_006);
+ CPPUNIT_TEST(valueOf_float_test_007);
+
+ CPPUNIT_TEST(valueOf_double_test_001);
+ CPPUNIT_TEST(valueOf_double_test_002);
+ CPPUNIT_TEST(valueOf_double_test_003);
+ CPPUNIT_TEST(valueOf_double_test_004);
+ CPPUNIT_TEST(valueOf_double_test_005);
+ CPPUNIT_TEST(valueOf_double_test_006);
+ CPPUNIT_TEST(valueOf_double_test_007);
+ CPPUNIT_TEST(valueOf_double_test_008);
+ CPPUNIT_TEST_SUITE_END();
+}; // class valueOf
+
+// -----------------------------------------------------------------------------
+// - toDouble (tests)
+// -----------------------------------------------------------------------------
+class toDouble : public CppUnit::TestFixture
+{
+
+public:
+
+ toDouble()
+ {
+ // testPrecision a;
+ }
+
+
+
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void toDouble_test_impl(rtl::OString const& _sValue)
+ {
+ double nValueATOF = atof( _sValue.getStr() );
+
+ // rtl::OUString suValue = rtl::OUString::createFromAscii( _sValue.getStr() );
+ double nValueToDouble = _sValue.toDouble();
+
+ bool bEqualResult = is_double_equal(nValueToDouble, nValueATOF);
+ CPPUNIT_ASSERT_MESSAGE("Values are not equal.", bEqualResult == true);
+ }
+
+ void toDouble_test(rtl::OString const& _sValue)
+ {
+ toDouble_test_impl(_sValue);
+
+ // test also the negativ part.
+ rtl::OString sNegativValue("-");
+ sNegativValue += _sValue;
+ toDouble_test_impl(sNegativValue);
+ }
+
+ // insert your test code here.
+ void toDouble_selftest()
+ {
+ t_print("Start selftest:\n");
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.01) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.00001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.00000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.000000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0000000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.00000000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.000000000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0000000000001) == false);
+ // we check til 14 values after comma
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.00000000000001) == true);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.000000000000001) == true);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0000000000000001) == true);
+ t_print("Selftest done.\n");
+ }
+
+ void toDouble_test_3()
+ {
+ rtl::OString sValue("3");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_3_5()
+ {
+ rtl::OString sValue("3.5");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_3_0625()
+ {
+ rtl::OString sValue("3.0625");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_pi()
+ {
+ // value from http://www.angio.net/pi/digits/50.txt
+ rtl::OString sValue("3.141592653589793238462643383279502884197169399375");
+ toDouble_test(sValue);
+ }
+
+ void toDouble_test_1()
+ {
+ rtl::OString sValue("1");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_10()
+ {
+ rtl::OString sValue("10");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_100()
+ {
+ rtl::OString sValue("100");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_1000()
+ {
+ rtl::OString sValue("1000");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_10000()
+ {
+ rtl::OString sValue("10000");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_1e99()
+ {
+ rtl::OString sValue("1e99");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_1e_n99()
+ {
+ rtl::OString sValue("1e-99");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_1e308()
+ {
+ rtl::OString sValue("1e308");
+ toDouble_test(sValue);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toDouble);
+ CPPUNIT_TEST(toDouble_selftest);
+
+ CPPUNIT_TEST(toDouble_test_3);
+ CPPUNIT_TEST(toDouble_test_3_5);
+ CPPUNIT_TEST(toDouble_test_3_0625);
+ CPPUNIT_TEST(toDouble_test_pi);
+ CPPUNIT_TEST(toDouble_test_1);
+ CPPUNIT_TEST(toDouble_test_10);
+ CPPUNIT_TEST(toDouble_test_100);
+ CPPUNIT_TEST(toDouble_test_1000);
+ CPPUNIT_TEST(toDouble_test_10000);
+ CPPUNIT_TEST(toDouble_test_1e99);
+ CPPUNIT_TEST(toDouble_test_1e_n99);
+ CPPUNIT_TEST(toDouble_test_1e308);
+ CPPUNIT_TEST_SUITE_END();
+}; // class toDouble
+
+// -----------------------------------------------------------------------------
+// - getToken (tests)
+// -----------------------------------------------------------------------------
+class getToken : public CppUnit::TestFixture
+{
+
+public:
+
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // -----------------------------------------------------------------------------
+
+ void getToken_000()
+ {
+ rtl::OString sTokenStr;
+
+ sal_Int32 nIndex = 0;
+ do
+ {
+ rtl::OString sToken = sTokenStr.getToken( 0, ';', nIndex );
+ }
+ while ( nIndex >= 0 );
+ // t_print("Index %d\n", nIndex);
+ // should not GPF
+ }
+
+ void getToken_001()
+ {
+ rtl::OString sTokenStr = "a;b";
+
+ sal_Int32 nIndex = 0;
+
+ rtl::OString sToken = sTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'a'", sToken.equals("a") == sal_True);
+
+ /* rtl::OString */ sToken = sTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'b'", sToken.equals("b") == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("index should be negative", nIndex == -1);
+ }
+
+ void getToken_002()
+ {
+ rtl::OString sTokenStr = "a;b.c";
+
+ sal_Int32 nIndex = 0;
+
+ rtl::OString sToken = sTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'a'", sToken.equals("a") == sal_True);
+
+ /* rtl::OString */ sToken = sTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'b'", sToken.equals("b") == sal_True);
+
+ /* rtl::OString */ sToken = sTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'c'", sToken.equals("c") == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("index should be negative", nIndex == -1);
+ }
+
+ void getToken_003()
+ {
+ rtl::OString sTokenStr = "a;;b";
+
+ sal_Int32 nIndex = 0;
+
+ rtl::OString sToken = sTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'a'", sToken.equals("a") == sal_True);
+
+ /* rtl::OString */ sToken = sTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be empty", sToken.getLength() == 0);
+
+ /* rtl::OString */ sToken = sTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'b'", sToken.equals("b") == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("index should be negative", nIndex == -1);
+ }
+
+ void getToken_004()
+ {
+ rtl::OString sTokenStr = "longer.then.ever.";
+
+ sal_Int32 nIndex = 0;
+
+ rtl::OString sToken = sTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be 'longer'", sToken.equals("longer") == sal_True);
+
+ /* rtl::OString */ sToken = sTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be 'then'", sToken.equals("then") == sal_True);
+
+ /* rtl::OString */ sToken = sTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be 'ever'", sToken.equals("ever") == sal_True);
+
+ /* rtl::OString */ sToken = sTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be empty", sToken.getLength() == 0);
+
+ CPPUNIT_ASSERT_MESSAGE("index should be negative", nIndex == -1);
+ }
+
+
+ CPPUNIT_TEST_SUITE(getToken);
+ CPPUNIT_TEST(getToken_000);
+ CPPUNIT_TEST(getToken_001);
+ CPPUNIT_TEST(getToken_002);
+ CPPUNIT_TEST(getToken_003);
+ CPPUNIT_TEST(getToken_004);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getToken
+
+// -----------------------------------------------------------------------------
+// testing the method replaceAt( sal_Int32 index, sal_Int32 count,
+// const OString& newStr )
+// -----------------------------------------------------------------------------
+
+// Developer note: Mindy Liu, 2004-04-23
+// stollen from sal/qa/rtl_strings/rtl_OString.cxx
+
+class replaceAt : public CppUnit::TestFixture
+{
+
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+ sal_Bool check_replaceAt( const rtl::OString* expVal, const rtl::OString* input,
+ const rtl::OString* newStr, sal_Int32 index, sal_Int32 count)
+ {
+ ::rtl::OString aStr1;
+ aStr1= input->replaceAt( index, count, *newStr );
+
+ t_print("the result OString is %s#\n", aStr1.getStr() );
+
+ sal_Bool bRes = ( expVal->compareTo(aStr1) == 0 );
+ return bRes;
+ }
+ // -----------------------------------------------------------------------------
+
+ void replaceAt_001()
+ {
+ sal_Bool bRes = check_replaceAt(new rtl::OString("Java@Sun"),
+ new rtl::OString("Sun java"), new rtl::OString("Java@Sun"), 0, 8 );
+ CPPUNIT_ASSERT_MESSAGE("string differs, replace whole string", bRes == sal_True);
+ }
+
+ void replaceAt_002()
+ {
+ sal_Bool bRes = check_replaceAt(new rtl::OString("Sun Java desktop system"),
+ new rtl::OString("Sun "), new rtl::OString("Java desktop system"), 10, 8 );
+ CPPUNIT_ASSERT_MESSAGE("index > length of input string", bRes == sal_True);
+ }
+
+ void replaceAt_003()
+ {
+ sal_Bool bRes = check_replaceAt(new rtl::OString("SuJava desktop system"),
+ new rtl::OString("Sun "), new rtl::OString("Java desktop system"), 2, 64 );
+ CPPUNIT_ASSERT_MESSAGE("larger count", bRes == sal_True);
+ }
+
+ void replaceAt_004()
+ {
+
+ sal_Bool bRes = check_replaceAt(new rtl::OString("Java desktop system"),
+ new rtl::OString("Sun "), new rtl::OString("Java desktop system"), -4, 8 );
+ CPPUNIT_ASSERT_MESSAGE("navigate index", bRes == sal_True);
+ }
+ void replaceAt_005()
+ {
+
+ sal_Bool bRes = check_replaceAt(new rtl::OString("Sun Jesktop System"),
+ new rtl::OString("Sun Java Desktop System"), new rtl::OString(""), 5, 5 );
+ CPPUNIT_ASSERT_MESSAGE("replace with null string", bRes == sal_True);
+ }
+
+
+ CPPUNIT_TEST_SUITE(replaceAt);
+ CPPUNIT_TEST(replaceAt_001);
+ CPPUNIT_TEST(replaceAt_002);
+ CPPUNIT_TEST(replaceAt_003);
+ CPPUNIT_TEST(replaceAt_004);
+ CPPUNIT_TEST(replaceAt_005);
+ CPPUNIT_TEST_SUITE_END();
+}; // class replaceAt
+
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OString::valueOf, "rtl_OString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OString::toDouble, "rtl_OString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OString::getToken, "rtl_OString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OString::replaceAt, "rtl_OString");
+
+} // namespace rtl_OString
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
diff --git a/sal/qa/rtl/ostring/rtl_str.cxx b/sal/qa/rtl/ostring/rtl_str.cxx
new file mode 100644
index 000000000000..b513c6cb1398
--- /dev/null
+++ b/sal/qa/rtl/ostring/rtl_str.cxx
@@ -0,0 +1,890 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <testshl/simpleheader.hxx>
+
+namespace rtl_str
+{
+
+ class compare : public CppUnit::TestFixture
+ {
+ public:
+
+ void compare_000()
+ {
+ rtl_str_compare( NULL, NULL);
+ }
+
+ void compare_000_1()
+ {
+ rtl::OString aStr1 = "Line must be equal.";
+ rtl_str_compare( aStr1.getStr(), NULL);
+ }
+ void compare_001()
+ {
+ rtl::OString aStr1 = "";
+ rtl::OString aStr2 = "";
+
+ sal_Int32 nValue = rtl_str_compare( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002()
+ {
+ rtl::OString aStr1 = "Line must be equal.";
+ rtl::OString aStr2 = "Line must be equal.";
+
+ sal_Int32 nValue = rtl_str_compare( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_003()
+ {
+ rtl::OString aStr1 = "Line must differ.";
+ rtl::OString aStr2 = "Line foo bar, ok, differ.";
+
+ sal_Int32 nValue = rtl_str_compare( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(compare);
+ CPPUNIT_TEST(compare_000);
+ CPPUNIT_TEST(compare_000_1);
+ CPPUNIT_TEST(compare_001);
+ CPPUNIT_TEST(compare_002);
+ CPPUNIT_TEST(compare_003);
+ CPPUNIT_TEST_SUITE_END();
+}; // class compare
+
+
+ class compareIgnoreAsciiCase : public CppUnit::TestFixture
+ {
+ public:
+
+ void compare_000()
+ {
+ rtl_str_compareIgnoreAsciiCase( NULL, NULL);
+ }
+
+ void compare_000_1()
+ {
+ rtl::OString aStr1 = "Line must be equal.";
+ rtl_str_compareIgnoreAsciiCase( aStr1.getStr(), NULL);
+ }
+ void compare_001()
+ {
+ rtl::OString aStr1 = "";
+ rtl::OString aStr2 = "";
+
+ sal_Int32 nValue = rtl_str_compareIgnoreAsciiCase( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002()
+ {
+ rtl::OString aStr1 = "Line must be equal.";
+ rtl::OString aStr2 = "Line must be equal.";
+
+ sal_Int32 nValue = rtl_str_compareIgnoreAsciiCase( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002_1()
+ {
+ rtl::OString aStr1 = "Line must be equal.";
+ rtl::OString aStr2 = "LINE MUST BE EQUAL.";
+
+ sal_Int32 nValue = rtl_str_compareIgnoreAsciiCase( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal (if case insensitve).", nValue == 0);
+ }
+
+ void compare_003()
+ {
+ rtl::OString aStr1 = "Line must differ.";
+ rtl::OString aStr2 = "Line foo bar, ok, differ.";
+
+ sal_Int32 nValue = rtl_str_compareIgnoreAsciiCase( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(compareIgnoreAsciiCase);
+ CPPUNIT_TEST(compare_000);
+ CPPUNIT_TEST(compare_000_1);
+ CPPUNIT_TEST(compare_001);
+ CPPUNIT_TEST(compare_002);
+ CPPUNIT_TEST(compare_002_1);
+ CPPUNIT_TEST(compare_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class compareIgnoreAsciiCase
+
+// -----------------------------------------------------------------------------
+
+ class shortenedCompareIgnoreAsciiCase_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void compare_000()
+ {
+ rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( NULL, 0, NULL, 0, 0);
+ }
+
+ void compare_000_1()
+ {
+ rtl::OString aStr1 = "Line must be equal.";
+ rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(), NULL, 0, 1);
+ }
+ void compare_001()
+ {
+ rtl::OString aStr1 = "";
+ rtl::OString aStr2 = "";
+
+ sal_Int32 nValue = rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(), aStr2.getStr(), aStr2.getLength(), aStr1.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002()
+ {
+ rtl::OString aStr1 = "Line must be equal.";
+ rtl::OString aStr2 = "Line must be equal.";
+
+ sal_Int32 nValue = rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(),
+ aStr2.getStr(), aStr2.getLength(),
+ aStr1.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002_1()
+ {
+ rtl::OString aStr1 = "Line must be equal.";
+ rtl::OString aStr2 = "LINE MUST BE EQUAL.";
+
+ sal_Int32 nValue = rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(),
+ aStr2.getStr(), aStr2.getLength(),
+ aStr1.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal (if case insensitve).", nValue == 0);
+ }
+
+ void compare_003()
+ {
+ rtl::OString aStr1 = "Line must differ.";
+ rtl::OString aStr2 = "Line foo bar, ok, differ.";
+
+ sal_Int32 nValue = rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(),
+ aStr2.getStr(), aStr2.getLength(),
+ 5);
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal first 5 characters.", nValue == 0);
+ }
+
+ void compare_004()
+ {
+ rtl::OString aStr1 = "Line must differ.";
+ rtl::OString aStr2 = "Line foo bar, ok, differ.";
+
+ sal_Int32 nValue = rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(),
+ aStr2.getStr(), aStr2.getLength(),
+ aStr1.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(shortenedCompareIgnoreAsciiCase_WithLength);
+ CPPUNIT_TEST(compare_000);
+ CPPUNIT_TEST(compare_000_1);
+ CPPUNIT_TEST(compare_001);
+ CPPUNIT_TEST(compare_002);
+ CPPUNIT_TEST(compare_002_1);
+ CPPUNIT_TEST(compare_003);
+ CPPUNIT_TEST(compare_004);
+ CPPUNIT_TEST_SUITE_END();
+}; // class compare
+
+
+// -----------------------------------------------------------------------------
+
+ class hashCode : public CppUnit::TestFixture
+ {
+ public:
+
+ void hashCode_000()
+ {
+ rtl_str_hashCode( NULL );
+ }
+
+ void hashCode_001()
+ {
+ rtl::OString aStr1 = "Line for a hashCode.";
+ sal_Int32 nHashCode = rtl_str_hashCode( aStr1.getStr() );
+ t_print("hashcode: %d\n", nHashCode);
+ // CPPUNIT_ASSERT_MESSAGE("failed.", nValue == 0);
+ }
+
+ void hashCode_002()
+ {
+ rtl::OString aStr1 = "Line for a hashCode.";
+ sal_Int32 nHashCode1 = rtl_str_hashCode( aStr1.getStr() );
+
+ rtl::OString aStr2 = "Line for a hashCode.";
+ sal_Int32 nHashCode2 = rtl_str_hashCode( aStr2.getStr() );
+
+ CPPUNIT_ASSERT_MESSAGE("hashcodes must be equal.", nHashCode1 == nHashCode2 );
+ }
+
+ void hashCode_003()
+ {
+ rtl::OString aStr1 = "Line for a hashCode.";
+ sal_Int32 nHashCode1 = rtl_str_hashCode( aStr1.getStr() );
+
+ rtl::OString aStr2 = "Line for an other hashcode.";
+ sal_Int32 nHashCode2 = rtl_str_hashCode( aStr2.getStr() );
+
+ CPPUNIT_ASSERT_MESSAGE("hashcodes must differ.", nHashCode1 != nHashCode2 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(hashCode);
+ CPPUNIT_TEST(hashCode_000);
+ CPPUNIT_TEST(hashCode_001);
+ CPPUNIT_TEST(hashCode_002);
+ CPPUNIT_TEST(hashCode_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class compare
+
+
+// -----------------------------------------------------------------------------
+
+ class indexOfChar : public CppUnit::TestFixture
+ {
+ public:
+
+ void indexOfChar_000()
+ {
+ rtl_str_indexOfChar( NULL, 0 );
+ }
+
+ void indexOfChar_001()
+ {
+ rtl::OString aStr1 = "Line for a indexOfChar.";
+
+ sal_Int32 nIndex = rtl_str_indexOfChar( aStr1.getStr(), 'L' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 0);
+
+ /* sal_Int32 */ nIndex = rtl_str_indexOfChar( aStr1.getStr(), 'i' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 1);
+
+ /* sal_Int32 */ nIndex = rtl_str_indexOfChar( aStr1.getStr(), 'n' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 2);
+
+ /* sal_Int32 */ nIndex = rtl_str_indexOfChar( aStr1.getStr(), 'e' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 3);
+ }
+
+ void indexOfChar_002()
+ {
+ rtl::OString aStr1 = "Line for a indexOfChar.";
+ sal_Int32 nIndex = rtl_str_indexOfChar( aStr1.getStr(), 'y' );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(indexOfChar);
+ CPPUNIT_TEST(indexOfChar_000);
+ CPPUNIT_TEST(indexOfChar_001);
+ CPPUNIT_TEST(indexOfChar_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class compare
+
+// -----------------------------------------------------------------------------
+ class lastIndexOfChar : public CppUnit::TestFixture
+ {
+ public:
+
+ void lastIndexOfChar_000()
+ {
+ rtl_str_lastIndexOfChar( NULL, 0 );
+ }
+
+ void lastIndexOfChar_001()
+ {
+ rtl::OString aStr1 = "Line for a lastIndexOfChar.";
+
+ sal_Int32 nIndex = rtl_str_lastIndexOfChar( aStr1.getStr(), 'C' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 22);
+
+ /* sal_Int32 */ nIndex = rtl_str_lastIndexOfChar( aStr1.getStr(), 'h' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 23);
+
+ /* sal_Int32 */ nIndex = rtl_str_lastIndexOfChar( aStr1.getStr(), 'a' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 24);
+
+ /* sal_Int32 */ nIndex = rtl_str_lastIndexOfChar( aStr1.getStr(), 'r' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 25);
+ }
+
+ void lastIndexOfChar_002()
+ {
+ rtl::OString aStr1 = "Line for a lastIndexOfChar.";
+ sal_Int32 nIndex = rtl_str_lastIndexOfChar( aStr1.getStr(), 'y' );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(lastIndexOfChar);
+ CPPUNIT_TEST(lastIndexOfChar_000);
+ CPPUNIT_TEST(lastIndexOfChar_001);
+ CPPUNIT_TEST(lastIndexOfChar_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class lastIndexOfChar
+
+
+// -----------------------------------------------------------------------------
+
+ class indexOfStr : public CppUnit::TestFixture
+ {
+ public:
+
+ void indexOfStr_000()
+ {
+ rtl_str_indexOfStr( NULL, 0 );
+ }
+
+ void indexOfStr_000_1()
+ {
+ rtl::OString aStr1 = "Line for a indexOfStr.";
+ rtl_str_indexOfStr( aStr1.getStr(), 0 );
+ }
+
+ void indexOfStr_001()
+ {
+ rtl::OString aStr1 = "Line for a indexOfStr.";
+
+ sal_Int32 nIndex = rtl_str_indexOfStr( aStr1.getStr(), "Line" );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 0);
+
+ /* sal_Int32 */ nIndex = rtl_str_indexOfStr( aStr1.getStr(), "for" );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 5);
+
+ /* sal_Int32 */ nIndex = rtl_str_indexOfStr( aStr1.getStr(), "a" );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 9);
+
+ /* sal_Int32 */ nIndex = rtl_str_indexOfStr( aStr1.getStr(), "a index" );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex ==9);
+ }
+
+ void indexOfStr_002()
+ {
+ rtl::OString aStr1 = "Line for a indexOfStr.";
+ sal_Int32 nIndex = rtl_str_indexOfStr( aStr1.getStr(), "not exist" );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(indexOfStr);
+ CPPUNIT_TEST(indexOfStr_000);
+ CPPUNIT_TEST(indexOfStr_001);
+ CPPUNIT_TEST(indexOfStr_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class compare
+// -----------------------------------------------------------------------------
+
+
+ class lastIndexOfStr : public CppUnit::TestFixture
+ {
+ public:
+
+ void lastIndexOfStr_000()
+ {
+ rtl_str_lastIndexOfStr( NULL, NULL );
+ }
+
+ void lastIndexOfStr_000_1()
+ {
+ rtl::OString aStr1 = "Line for a lastIndexOfStr.";
+ rtl_str_lastIndexOfStr( aStr1.getStr(), NULL );
+ }
+
+ void lastIndexOfStr_001()
+ {
+ rtl::OString aStr1 = "Line for a lastIndexOfStr.";
+ rtl::OString aSearchStr = "Index";
+
+ sal_Int32 nIndex = rtl_str_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 15);
+
+ /* rtl::OString */ aSearchStr = "Line";
+ /* sal_Int32 */ nIndex = rtl_str_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 0);
+
+ /* rtl::OString */ aSearchStr = "";
+ /* sal_Int32 */ nIndex = rtl_str_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1);
+ }
+
+ void lastIndexOfStr_002()
+ {
+ rtl::OString aStr1 = "Line for a lastIndexOfStr.";
+ rtl::OString aSearchStr = "foo";
+ sal_Int32 nIndex = rtl_str_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1 );
+ }
+
+ void lastIndexOfStr_003()
+ {
+ rtl::OString aStr1 = "Line for a lastIndexOfStr.";
+ rtl::OString aSearchStr = "O";
+ sal_Int32 nIndex = rtl_str_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 20 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(lastIndexOfStr);
+ CPPUNIT_TEST(lastIndexOfStr_000);
+ CPPUNIT_TEST(lastIndexOfStr_001);
+ CPPUNIT_TEST(lastIndexOfStr_002);
+ CPPUNIT_TEST(lastIndexOfStr_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class lastIndexOfStr
+
+// -----------------------------------------------------------------------------
+
+ class replaceChar : public CppUnit::TestFixture
+ {
+ public:
+
+ void replaceChar_000()
+ {
+ rtl_str_replaceChar( NULL, 0, 0 );
+ }
+
+ void replaceChar_001()
+ {
+ rtl::OString aStr1 = "replace char.";
+ rtl::OString aShouldStr1 = "ruplacu char.";
+
+ sal_Char* pStr = (sal_Char*) malloc(aStr1.getLength() + 1);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ strcpy(pStr, aStr1.getStr());
+
+ rtl_str_replaceChar( pStr, 'e', 'u' );
+
+ CPPUNIT_ASSERT_MESSAGE("replace failed", aShouldStr1.equals(rtl::OString(pStr)) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(replaceChar);
+ CPPUNIT_TEST(replaceChar_000);
+ CPPUNIT_TEST(replaceChar_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+// -----------------------------------------------------------------------------
+
+ class replaceChar_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void replaceChar_WithLength_000()
+ {
+ rtl_str_replaceChar_WithLength( NULL, 0, 0, 0 );
+ }
+
+ void replaceChar_WithLength_000_1()
+ {
+ rtl_str_replaceChar_WithLength( NULL, 1, 0, 0 );
+ }
+ void replaceChar_WithLength_001()
+ {
+ rtl::OString aStr1 = "replace char.";
+ rtl::OString aShouldStr1 = "ruplace char.";
+
+ sal_Char* pStr = (sal_Char*) malloc(aStr1.getLength() + 1);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ strcpy(pStr, aStr1.getStr());
+
+ rtl_str_replaceChar_WithLength( pStr, 6, 'e', 'u' );
+
+ CPPUNIT_ASSERT_MESSAGE("replace failed", aShouldStr1.equals(rtl::OString(pStr)) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(replaceChar_WithLength);
+ CPPUNIT_TEST(replaceChar_WithLength_000);
+ CPPUNIT_TEST(replaceChar_WithLength_000_1);
+ CPPUNIT_TEST(replaceChar_WithLength_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+
+// -----------------------------------------------------------------------------
+
+ class toAsciiLowerCase : public CppUnit::TestFixture
+ {
+ public:
+
+ void toAsciiLowerCase_000()
+ {
+ rtl_str_toAsciiLowerCase( NULL );
+ }
+
+ void toAsciiLowerCase_001()
+ {
+ rtl::OString aStr1 = "CHANGE THIS TO ASCII LOWER CASE.";
+ rtl::OString aShouldStr1 = "change this to ascii lower case.";
+
+ sal_Char* pStr = (sal_Char*) malloc(aStr1.getLength() + 1);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ strcpy(pStr, aStr1.getStr());
+
+ rtl_str_toAsciiLowerCase( pStr );
+
+ CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(rtl::OString(pStr)) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toAsciiLowerCase);
+ CPPUNIT_TEST(toAsciiLowerCase_000);
+ CPPUNIT_TEST(toAsciiLowerCase_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+
+ class toAsciiLowerCase_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void toAsciiLowerCase_WithLength_000()
+ {
+ rtl_str_toAsciiLowerCase_WithLength( NULL, 0 );
+ }
+
+ void toAsciiLowerCase_WithLength_001()
+ {
+ rtl::OString aStr1 = "CHANGE THIS TO ASCII LOWER CASE.";
+ rtl::OString aShouldStr1 = "change thiS TO ASCII LOWER CASE.";
+
+ sal_Char* pStr = (sal_Char*) malloc(aStr1.getLength() + 1);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ strcpy(pStr, aStr1.getStr());
+
+ rtl_str_toAsciiLowerCase_WithLength( pStr, 10 );
+
+ t_print("Lowercase with length: '%s'\n", pStr);
+ CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(rtl::OString(pStr)) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toAsciiLowerCase_WithLength);
+ CPPUNIT_TEST(toAsciiLowerCase_WithLength_000);
+ CPPUNIT_TEST(toAsciiLowerCase_WithLength_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+// -----------------------------------------------------------------------------
+
+ class toAsciiUpperCase : public CppUnit::TestFixture
+ {
+ public:
+
+ void toAsciiUpperCase_000()
+ {
+ rtl_str_toAsciiUpperCase( NULL );
+ }
+
+ void toAsciiUpperCase_001()
+ {
+ rtl::OString aStr1 = "change this to ascii upper case.";
+ rtl::OString aShouldStr1 = "CHANGE THIS TO ASCII UPPER CASE.";
+
+ sal_Char* pStr = (sal_Char*) malloc(aStr1.getLength() + 1);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ strcpy(pStr, aStr1.getStr());
+
+ rtl_str_toAsciiUpperCase( pStr );
+
+ CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(rtl::OString(pStr)) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toAsciiUpperCase);
+ CPPUNIT_TEST(toAsciiUpperCase_000);
+ CPPUNIT_TEST(toAsciiUpperCase_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+
+ class toAsciiUpperCase_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void toAsciiUpperCase_WithLength_000()
+ {
+ rtl_str_toAsciiUpperCase_WithLength( NULL, 0 );
+ }
+
+ void toAsciiUpperCase_WithLength_001()
+ {
+ rtl::OString aStr1 = "change this to ascii lower case.";
+ rtl::OString aShouldStr1 = "CHANGE THIs to ascii lower case.";
+
+ sal_Char* pStr = (sal_Char*) malloc(aStr1.getLength() + 1);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+
+ strcpy(pStr, aStr1.getStr());
+ rtl_str_toAsciiUpperCase_WithLength( pStr, 10 );
+
+ t_print("Uppercase with length: '%s'\n", aStr1.getStr());
+ CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(rtl::OString(pStr)) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toAsciiUpperCase_WithLength);
+ CPPUNIT_TEST(toAsciiUpperCase_WithLength_000);
+ CPPUNIT_TEST(toAsciiUpperCase_WithLength_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+
+ // -----------------------------------------------------------------------------
+
+ class trim_WithLength : public CppUnit::TestFixture
+ {
+ public:
+ void trim_WithLength_000()
+ {
+ rtl_str_trim_WithLength(NULL, 0);
+ // should not GPF
+ }
+
+ void trim_WithLength_000_1()
+ {
+ char pStr[] = { " trim this" };
+ rtl_str_trim_WithLength( pStr, 0 );
+ }
+
+ void trim_WithLength_001()
+ {
+ char const *pStr = " trim this";
+ sal_Char *pStr2 = (sal_Char*)malloc(strlen(pStr) + 1);
+ if (pStr2)
+ {
+ strcpy(pStr2, pStr);
+ rtl_str_trim_WithLength( pStr2, 2 );
+
+ CPPUNIT_ASSERT_MESSAGE("string should be empty", strlen(pStr2) == 0);
+ free(pStr2);
+ }
+ }
+
+ void trim_WithLength_002()
+ {
+ char const *pStr = "trim this";
+ sal_Char *pStr2 = (sal_Char*)malloc(strlen(pStr) + 1);
+ if (pStr2)
+ {
+ strcpy(pStr2, pStr);
+ rtl_str_trim_WithLength( pStr2, 5 );
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'trim'", strlen(pStr2) == 4);
+ free(pStr2);
+ }
+ }
+
+ void trim_WithLength_003()
+ {
+ char const *pStr = " trim this";
+ sal_Char *pStr2 = (sal_Char*)malloc(strlen(pStr) + 1);
+ if (pStr2)
+ {
+ strcpy(pStr2, pStr);
+ rtl_str_trim_WithLength( pStr2, 11 );
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'trim'", strlen(pStr2) == 4);
+ free(pStr2);
+ }
+ }
+
+ void trim_WithLength_004()
+ {
+ char const *pStr = "\r\n\t \n\r trim \n this";
+ sal_Char *pStr2 = (sal_Char*)malloc(strlen(pStr) + 1);
+ if (pStr2)
+ {
+ strcpy(pStr2, pStr);
+ rtl_str_trim_WithLength( pStr2, 17 );
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'trim'", strlen(pStr2) == 4);
+ free(pStr2);
+ }
+ }
+
+ void trim_WithLength_005()
+ {
+ char const *pStr = "\r\n\t \n\r trim \t this \n\r\t\t ";
+ sal_Char *pStr2 = (sal_Char*)malloc(strlen(pStr) + 1);
+ if (pStr2)
+ {
+ strcpy(pStr2, pStr);
+ rtl_str_trim_WithLength( pStr2, strlen(pStr2) );
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'trim'", strlen(pStr2) == 11);
+ free(pStr2);
+ }
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(trim_WithLength);
+ CPPUNIT_TEST(trim_WithLength_000);
+ CPPUNIT_TEST(trim_WithLength_000_1);
+ CPPUNIT_TEST(trim_WithLength_001);
+ CPPUNIT_TEST(trim_WithLength_002);
+ CPPUNIT_TEST(trim_WithLength_003);
+ CPPUNIT_TEST(trim_WithLength_004);
+ CPPUNIT_TEST(trim_WithLength_005);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+ // -----------------------------------------------------------------------------
+
+ class valueOfChar : public CppUnit::TestFixture
+ {
+ public:
+ void valueOfChar_000()
+ {
+ rtl_str_valueOfChar(NULL, 0);
+ // should not GPF
+ }
+ void valueOfChar_001()
+ {
+ sal_Char *pStr = (sal_Char*)malloc(RTL_STR_MAX_VALUEOFCHAR);
+ if (pStr)
+ {
+ rtl_str_valueOfChar(pStr, 'A');
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'A'", pStr[0] == 'A');
+ free(pStr);
+ }
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(valueOfChar);
+ CPPUNIT_TEST(valueOfChar_000);
+ CPPUNIT_TEST(valueOfChar_001);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::compare, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::compareIgnoreAsciiCase, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::shortenedCompareIgnoreAsciiCase_WithLength, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::hashCode, "rtl_str");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::indexOfChar, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::lastIndexOfChar, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::indexOfStr, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::lastIndexOfStr, "rtl_str");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::replaceChar, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::replaceChar_WithLength, "rtl_str");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::toAsciiLowerCase, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::toAsciiLowerCase_WithLength, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::toAsciiUpperCase, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::toAsciiUpperCase_WithLength, "rtl_str");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::trim_WithLength, "rtl_str");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_str::valueOfChar, "rtl_str");
+
+} // namespace rtl_str
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/rtl/ostring/rtl_str.xsce b/sal/qa/rtl/ostring/rtl_str.xsce
new file mode 100644
index 000000000000..e7a624ae2710
--- /dev/null
+++ b/sal/qa/rtl/ostring/rtl_str.xsce
@@ -0,0 +1,26 @@
+# signaled with SIGNAL 11
+rtl_str.compare.compare_000
+rtl_str.compare.compare_000_1
+
+rtl_str.compareIgnoreAsciiCase.compare_000
+rtl_str.compareIgnoreAsciiCase.compare_000_1
+
+rtl_str.hashCode.hashCode_000
+
+rtl_str.indexOfChar.indexOfChar_000
+
+rtl_str.lastIndexOfChar.lastIndexOfChar_000
+
+rtl_str.indexOfStr.indexOfStr_000
+
+rtl_str.lastIndexOfStr.lastIndexOfStr_000
+
+rtl_str.replaceChar.replaceChar_000
+
+rtl_str.replaceChar_WithLength.replaceChar_WithLength_000_1
+
+rtl_str.toAsciiLowerCase.toAsciiLowerCase_000
+
+rtl_str.toAsciiUpperCase.toAsciiUpperCase_000
+
+rtl_str.valueOfChar.valueOfChar_000
diff --git a/sal/qa/rtl/ostring/rtl_string.cxx b/sal/qa/rtl/ostring/rtl_string.cxx
new file mode 100644
index 000000000000..e252476f3f8c
--- /dev/null
+++ b/sal/qa/rtl/ostring/rtl_string.cxx
@@ -0,0 +1,183 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <testshl/simpleheader.hxx>
+
+namespace rtl_string
+{
+
+ class getLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void getLength_000()
+ {
+ rtl_string_getLength( NULL );
+ // should not GPF
+ }
+
+ void getLength_001()
+ {
+ rtl::OString aStr("Test Length.");
+ sal_Int32 nValue = rtl_string_getLength( aStr.pData );
+
+ CPPUNIT_ASSERT_MESSAGE("Length must equal getLength()", aStr.getLength() == nValue);
+ CPPUNIT_ASSERT_MESSAGE(
+ "Length must equal strlen()",
+ nValue >= 0
+ && (strlen(aStr.getStr())
+ == sal::static_int_cast< sal_uInt32 >(nValue)));
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(getLength);
+ CPPUNIT_TEST(getLength_000);
+ CPPUNIT_TEST(getLength_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class getLength
+
+// -----------------------------------------------------------------------------
+
+ class newFromString : public CppUnit::TestFixture
+ {
+ public:
+
+ // void newFromString_000()
+ // {
+ // sal_Int32 nValue = rtl_string_newFromString( NULL, NULL );
+ // // should not GPF
+ // }
+
+ void newFromString_001()
+ {
+ rtl::OString aStr("Test Length.");
+ rtl_String *pStr = NULL;
+
+ rtl_string_newFromString( &pStr, aStr.pData );
+
+ rtl::OString aNewStr(pStr);
+ CPPUNIT_ASSERT_MESSAGE("Strings must be equal", aStr.equals(aNewStr) == sal_True);
+
+ rtl_string_release(pStr);
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(newFromString);
+ // CPPUNIT_TEST(newFromString_000);
+ CPPUNIT_TEST(newFromString_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class newFromString
+
+ // -----------------------------------------------------------------------------
+
+ class convertUStringToString : public CppUnit::TestFixture
+ {
+ public:
+
+ // void newFromString_000()
+ // {
+ // sal_Int32 nValue = rtl_string_newFromString( NULL, NULL );
+ // // should not GPF
+ // }
+
+ void convertUStringToString_001()
+ {
+ rtl::OUString suString = rtl::OUString::createFromAscii("Hello");
+ rtl::OString sString;
+ sal_Bool bRet = rtl_convertUStringToString(&sString.pData, suString.getStr(), suString.getLength(), RTL_TEXTENCODING_ASCII_US, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ CPPUNIT_ASSERT_MESSAGE("Strings must be equal", bRet == sal_True && sString.equals(rtl::OString("Hello")) == sal_True);
+ }
+
+ void convertUStringToString_002()
+ {
+ rtl::OString sStr("H\xE4llo");
+ rtl::OUString suString = rtl::OStringToOUString(sStr, RTL_TEXTENCODING_ISO_8859_15);
+
+ rtl::OString sString;
+ sal_Bool bRet = rtl_convertUStringToString(&sString.pData, suString.getStr(), suString.getLength(), RTL_TEXTENCODING_ISO_8859_15, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ CPPUNIT_ASSERT_MESSAGE("Strings must be equal", bRet == sal_True && sString.equals(rtl::OString("H\xE4llo")) == sal_True);
+ }
+
+ void convertUStringToString_003()
+ {
+ rtl::OString sStr("H\xC3\xA4llo");
+ rtl::OUString suString = rtl::OStringToOUString(sStr, RTL_TEXTENCODING_UTF8);
+
+ rtl::OString sString;
+ sal_Bool bRet = rtl_convertUStringToString(&sString.pData, suString.getStr(), suString.getLength(), RTL_TEXTENCODING_ISO_8859_15, OUSTRING_TO_OSTRING_CVTFLAGS);
+
+ CPPUNIT_ASSERT_MESSAGE("Strings must be equal", bRet == sal_True && sString.equals(rtl::OString("H\xE4llo")) == sal_True);
+ }
+
+ void convertUStringToString_004()
+ {
+ rtl::OString sStr("Tsch\xFC\xDF");
+ rtl::OUString suString = rtl::OStringToOUString(sStr, RTL_TEXTENCODING_ISO_8859_15);
+ rtl::OString sString;
+
+ sal_Bool bRet = rtl_convertUStringToString(&sString.pData, suString.getStr(), suString.getLength(), RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
+ /* sal_Bool */ bRet = rtl_convertUStringToString(&sString.pData, suString.getStr(), suString.getLength(), RTL_TEXTENCODING_ISO_8859_15, OUSTRING_TO_OSTRING_CVTFLAGS);
+ CPPUNIT_ASSERT_MESSAGE("Strings must be equal", bRet == sal_True && sString.equals(rtl::OString("Tsch\xFC\xDF")) == sal_True);
+ }
+
+
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(convertUStringToString);
+ CPPUNIT_TEST(convertUStringToString_001);
+ CPPUNIT_TEST(convertUStringToString_002);
+ CPPUNIT_TEST(convertUStringToString_003);
+ CPPUNIT_TEST(convertUStringToString_004);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class convertUStringToString
+
+
+
+} // namespace rtl_string
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_string::getLength, "rtl_string");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_string::newFromString, "rtl_string");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_string::convertUStringToString, "rtl_string");
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/rtl/ostring/rtl_string.xsce b/sal/qa/rtl/ostring/rtl_string.xsce
new file mode 100644
index 000000000000..0e37ab00baab
--- /dev/null
+++ b/sal/qa/rtl/ostring/rtl_string.xsce
@@ -0,0 +1 @@
+rtl_string.getLength.getLength_000
diff --git a/sal/qa/rtl/oustring/joblist.txt b/sal/qa/rtl/oustring/joblist.txt
new file mode 100644
index 000000000000..5d52da1e3008
--- /dev/null
+++ b/sal/qa/rtl/oustring/joblist.txt
@@ -0,0 +1,10 @@
+# JobFile for rtl_OUString
+# header source sal/inc/rtl/ustring.hxx
+
+rtl_OUString.valueOf.valueOf_double_001
+rtl_OUString.valueOf.valueOf_double_002
+rtl_OUString.valueOf.valueOf_double_003
+rtl_OUString.valueOf.valueOf_double_004
+rtl_OUString.valueOf.valueOf_double_005
+rtl_OUString.valueOf.valueOf_double_006
+rtl_OUString.valueOf.valueOf_double_007
diff --git a/sal/qa/rtl/oustring/makefile.mk b/sal/qa/rtl/oustring/makefile.mk
new file mode 100644
index 000000000000..6f15637651c6
--- /dev/null
+++ b/sal/qa/rtl/oustring/makefile.mk
@@ -0,0 +1,82 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=rtl_oustring2
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:joblist by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_OUString2.obj
+
+SHL1TARGET= rtl_OUString2
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:joblist
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+SHL2OBJS= \
+ $(SLO)$/rtl_ustr.obj
+
+SHL2TARGET= rtl_ustr
+SHL2STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL2IMPLIB= i$(SHL2TARGET)
+DEF2NAME =$(SHL2TARGET)
+SHL2VERSIONMAP= $(PRJ)$/qa$/export.map
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/oustring/rtl_OUString2.cxx b/sal/qa/rtl/oustring/rtl_OUString2.cxx
new file mode 100644
index 000000000000..878f42713278
--- /dev/null
+++ b/sal/qa/rtl/oustring/rtl_OUString2.cxx
@@ -0,0 +1,1280 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// autogenerated file with codegen.pl
+
+#include <math.h>
+#include <stdio.h>
+
+#include <algorithm> // STL
+
+#include <testshl/simpleheader.hxx>
+#include "stringhelper.hxx"
+#include "valueequal.hxx"
+
+inline void printOUString( ::rtl::OUString const & _suStr )
+{
+ rtl::OString aString;
+
+ t_print( "OUString: " );
+ aString = ::rtl::OUStringToOString( _suStr, RTL_TEXTENCODING_ASCII_US );
+ t_print( "'%s'\n", aString.getStr( ) );
+}
+
+namespace rtl_OUString
+{
+
+ class ctors_rtl_uString : public CppUnit::TestFixture
+ {
+
+ public:
+ /// test of OUString(rtl_uString*)
+ void ctors_001()
+ {
+ rtl::OUString *pStr = new rtl::OUString( rtl::OUString::createFromAscii("a String") );
+
+ rtl::OUString aStrToTest(pStr->pData);
+ delete pStr;
+
+ // maybe here should we do something with current memory
+ char* pBuffer = (char*) malloc(2 * 8);
+ memset(pBuffer, 0, 2 * 8);
+ free(pBuffer);
+
+ sal_Bool bResult = aStrToTest.equals(rtl::OUString::createFromAscii("a String"));
+ CPPUNIT_ASSERT_MESSAGE("String must not be empty", bResult == sal_True);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(ctors_rtl_uString);
+ CPPUNIT_TEST(ctors_001);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+class valueOf : public CppUnit::TestFixture
+{
+ void valueOf_float_test_impl(float _nValue)
+ {
+ rtl::OUString suValue;
+ suValue = rtl::OUString::valueOf( _nValue );
+ rtl::OString sValue;
+ sValue <<= suValue;
+ t_print(T_VERBOSE, "nFloat := %.9f sValue := %s\n", _nValue, sValue.getStr());
+
+ float nValueATOF = static_cast<float>(atof( sValue.getStr() ));
+
+ bool bEqualResult = is_float_equal(_nValue, nValueATOF);
+ CPPUNIT_ASSERT_MESSAGE("Values are not equal.", bEqualResult == true);
+ }
+
+ void valueOf_float_test(float _nValue)
+ {
+ valueOf_float_test_impl(_nValue);
+
+ // test also the negative part.
+ float nNegativeValue = -_nValue;
+ valueOf_float_test_impl(nNegativeValue);
+ }
+
+public:
+ // insert your test code here.
+ void valueOf_float_test_001()
+ {
+ // this is demonstration code
+ // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
+ float nValue = 3.0f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_002()
+ {
+ float nValue = 3.5f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_003()
+ {
+ float nValue = 3.0625f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_004()
+ {
+ float nValue = 3.502525f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_005()
+ {
+ float nValue = 3.141592f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_006()
+ {
+ float nValue = 3.5025255f;
+ valueOf_float_test(nValue);
+ }
+
+ void valueOf_float_test_007()
+ {
+ float nValue = 3.0039062f;
+ valueOf_float_test(nValue);
+ }
+
+private:
+
+ void valueOf_double_test_impl(double _nValue)
+ {
+ rtl::OUString suValue;
+ suValue = rtl::OUString::valueOf( _nValue );
+ rtl::OString sValue;
+ sValue <<= suValue;
+ t_print(T_VERBOSE, "nDouble := %.20f sValue := %s\n", _nValue, sValue.getStr());
+
+ double nValueATOF = atof( sValue.getStr() );
+
+ bool bEqualResult = is_double_equal(_nValue, nValueATOF);
+ CPPUNIT_ASSERT_MESSAGE("Values are not equal.", bEqualResult == true);
+ }
+
+ void valueOf_double_test(double _nValue)
+ {
+ valueOf_double_test_impl(_nValue);
+
+ // test also the negative part.
+ double nNegativeValue = -_nValue;
+ valueOf_double_test_impl(nNegativeValue);
+ }
+public:
+
+ // valueOf double
+ void valueOf_double_test_001()
+ {
+ double nValue = 3.0;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_002()
+ {
+ double nValue = 3.5;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_003()
+ {
+ double nValue = 3.0625;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_004()
+ {
+ double nValue = 3.1415926535;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_005()
+ {
+ double nValue = 3.141592653589793;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_006()
+ {
+ double nValue = 3.1415926535897932;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_007()
+ {
+ double nValue = 3.14159265358979323;
+ valueOf_double_test(nValue);
+ }
+ void valueOf_double_test_008()
+ {
+ double nValue = 3.141592653589793238462643;
+ valueOf_double_test(nValue);
+ }
+
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(valueOf);
+ CPPUNIT_TEST(valueOf_float_test_001);
+ CPPUNIT_TEST(valueOf_float_test_002);
+ CPPUNIT_TEST(valueOf_float_test_003);
+ CPPUNIT_TEST(valueOf_float_test_004);
+ CPPUNIT_TEST(valueOf_float_test_005);
+ CPPUNIT_TEST(valueOf_float_test_006);
+ CPPUNIT_TEST(valueOf_float_test_007);
+
+ CPPUNIT_TEST(valueOf_double_test_001);
+ CPPUNIT_TEST(valueOf_double_test_002);
+ CPPUNIT_TEST(valueOf_double_test_003);
+ CPPUNIT_TEST(valueOf_double_test_004);
+ CPPUNIT_TEST(valueOf_double_test_005);
+ CPPUNIT_TEST(valueOf_double_test_006);
+ CPPUNIT_TEST(valueOf_double_test_007);
+ CPPUNIT_TEST(valueOf_double_test_008);
+ CPPUNIT_TEST_SUITE_END();
+}; // class valueOf
+
+//------------------------------------------------------------------------
+// testing the method toDouble()
+//------------------------------------------------------------------------
+template<class T>
+sal_Int16 SAL_CALL checkPrecisionSize()
+{
+ // sal_Int16 nSize = sizeof(T);
+ volatile T nCalcValue = 1.0;
+
+
+ // (i + 1) is the current precision
+ // numerical series
+ // 1.1
+ // 10.1
+ // 100.1
+ // ...
+ // 1000...0.1
+
+ sal_Int16 i = 0;
+ for (i=0;i<50;i++)
+ {
+ nCalcValue *= 10;
+ volatile T nValue = nCalcValue + static_cast<T>(0.1);
+ volatile T dSub = nValue - nCalcValue;
+ // ----- 0.11 ---- 0.1 ---- 0.09 -----
+ if (0.11 > dSub && dSub < 0.09)
+ {
+ // due to the fact, that the value is break down we sub 1 from the precision value
+ // but to suppress this, we start at zero, precision is i+1 till here --i;
+ break;
+ }
+ }
+
+ sal_Int16 j= 0;
+ nCalcValue = 1.0;
+
+ // numerical series
+ // 1.1
+ // 1.01
+ // 1.001
+ // ...
+ // 1.000...001
+
+ for (j=0;j<50;j++)
+ {
+ nCalcValue /= 10;
+ volatile T nValue = nCalcValue + static_cast<T>(1.0);
+ volatile T dSub = nValue - static_cast<T>(1.0);
+ // ---- 0.02 ----- 0.01 ---- 0 --- -0.99 ---- -0.98 ----
+ // volatile T dSubAbsolut = fabs(dSub);
+ // ---- 0.02 ----- 0.01 ---- 0 (cut)
+ if ( dSub == 0)
+ break;
+ }
+ if (i != j)
+ {
+ // hmmm....
+ // imho i +- 1 == j is a good value
+ int n = i - j;
+ if (n < 0) n = -n;
+ if (n <= 1)
+ {
+ return std::min(i,j);
+ }
+ else
+ {
+ t_print("warning: presision differs more than 1!\n");
+ }
+ }
+
+ return i;
+}
+
+// -----------------------------------------------------------------------------
+
+ class testPrecision
+ {
+ public:
+ testPrecision()
+ {
+ sal_Int16 nPrecision;
+ nPrecision = checkPrecisionSize<float>();
+ t_print("precision of float: %d sizeof()=%d \n", nPrecision, sizeof(float));
+
+ nPrecision = checkPrecisionSize<double>();
+ t_print("precision of double: %d sizeof()=%d \n", nPrecision, sizeof(double));
+
+ nPrecision = checkPrecisionSize<long double>();
+ t_print("precision of long double: %d sizeof()=%d \n", nPrecision, sizeof(long double));
+
+ }
+
+ };
+
+ class toInt: public CppUnit::TestFixture {
+ public:
+ void test() {
+ CPPUNIT_ASSERT_EQUAL(
+ static_cast< sal_Int32 >(-0x76543210),
+ (rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-76543210")).
+ toInt32(16)));
+ CPPUNIT_ASSERT_EQUAL(
+ static_cast< sal_Int32 >(0xFEDCBA98),
+ (rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("+FEDCBA98")).
+ toInt32(16)));
+ CPPUNIT_ASSERT_EQUAL(
+ static_cast< sal_Int64 >(-SAL_CONST_INT64(0x76543210FEDCBA98)),
+ (rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("-76543210FEDCBA98")).
+ toInt64(16)));
+ CPPUNIT_ASSERT_EQUAL(
+ static_cast< sal_Int64 >(SAL_CONST_INT64(0xFEDCBA9876543210)),
+ (rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("+FEDCBA9876543210")).
+ toInt64(16)));
+ }
+
+ CPPUNIT_TEST_SUITE(toInt);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+// - toDouble (tests)
+// -----------------------------------------------------------------------------
+ class toDouble : public CppUnit::TestFixture
+ {
+ public:
+ void toDouble_test_impl(rtl::OString const& _sValue)
+ {
+ //t_print("the original str is %s\n", _sValue.getStr());
+ double nValueATOF = atof( _sValue.getStr() );
+ //t_print("original data is %e\n", nValueATOF);
+ rtl::OUString suValue = rtl::OUString::createFromAscii( _sValue.getStr() );
+ double nValueToDouble = suValue.toDouble();
+ //t_print("result data is %e\n", nValueToDouble);
+
+ bool bEqualResult = is_double_equal(nValueToDouble, nValueATOF);
+ CPPUNIT_ASSERT_MESSAGE("Values are not equal.", bEqualResult == true);
+ }
+
+ void toDouble_test(rtl::OString const& _sValue)
+ {
+ toDouble_test_impl(_sValue);
+
+ // test also the negativ part.
+ rtl::OString sNegativValue("-");
+ sNegativValue += _sValue;
+ toDouble_test_impl(sNegativValue);
+ }
+
+ // insert your test code here.
+ void toDouble_selftest()
+ {
+ t_print("Start selftest:\n");
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.01) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.00001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.00000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.000000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0000000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.00000000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.000000000001) == false);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0000000000001) == false);
+ // we check til 15 values after comma
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.00000000000001) == true);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.000000000000001) == true);
+ CPPUNIT_ASSERT (is_double_equal(1.0, 1.0000000000000001) == true);
+ t_print("Selftest done.\n");
+ }
+
+ void toDouble_test_3()
+ {
+ rtl::OString sValue("3");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_3_5()
+ {
+ rtl::OString sValue("3.5");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_3_0625()
+ {
+ rtl::OString sValue("3.0625");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_pi()
+ {
+ // value from http://www.angio.net/pi/digits/50.txt
+ rtl::OString sValue("3.141592653589793238462643383279502884197169399375");
+ toDouble_test(sValue);
+ }
+
+ void toDouble_test_1()
+ {
+ rtl::OString sValue("1");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_10()
+ {
+ rtl::OString sValue("10");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_100()
+ {
+ rtl::OString sValue("100");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_1000()
+ {
+ rtl::OString sValue("1000");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_10000()
+ {
+ rtl::OString sValue("10000");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_1e99()
+ {
+ rtl::OString sValue("1e99");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_1e_n99()
+ {
+ rtl::OString sValue("1e-99");
+ toDouble_test(sValue);
+ }
+ void toDouble_test_1e308()
+ {
+ rtl::OString sValue("1e308");
+ toDouble_test(sValue);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toDouble);
+ CPPUNIT_TEST(toDouble_selftest);
+
+ CPPUNIT_TEST(toDouble_test_3);
+ CPPUNIT_TEST(toDouble_test_3_5);
+ CPPUNIT_TEST(toDouble_test_3_0625);
+ CPPUNIT_TEST(toDouble_test_pi);
+ CPPUNIT_TEST(toDouble_test_1);
+ CPPUNIT_TEST(toDouble_test_10);
+ CPPUNIT_TEST(toDouble_test_100);
+ CPPUNIT_TEST(toDouble_test_1000);
+ CPPUNIT_TEST(toDouble_test_10000);
+ CPPUNIT_TEST(toDouble_test_1e99);
+ CPPUNIT_TEST(toDouble_test_1e_n99);
+ CPPUNIT_TEST(toDouble_test_1e308);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class toDouble
+
+// -----------------------------------------------------------------------------
+// - toFloat (tests)
+// -----------------------------------------------------------------------------
+ class toFloat : public CppUnit::TestFixture
+ {
+ public:
+ void toFloat_test_impl(rtl::OString const& _sValue)
+ {
+ //t_print("the original str is %s\n", _sValue.getStr());
+ float nValueATOF = static_cast<float>(atof( _sValue.getStr() ));
+ //t_print("the original str is %.10f\n", nValueATOF);
+ rtl::OUString suValue = rtl::OUString::createFromAscii( _sValue.getStr() );
+ float nValueToFloat = suValue.toFloat();
+ //t_print("the result str is %.10f\n", nValueToFloat);
+
+ bool bEqualResult = is_float_equal(nValueToFloat, nValueATOF);
+ CPPUNIT_ASSERT_MESSAGE("Values are not equal.", bEqualResult == true);
+ }
+
+ void toFloat_test(rtl::OString const& _sValue)
+ {
+ toFloat_test_impl(_sValue);
+
+ // test also the negativ part.
+ rtl::OString sNegativValue("-");
+ sNegativValue += _sValue;
+ toFloat_test_impl(sNegativValue);
+ }
+
+ // insert your test code here.
+ void toFloat_selftest()
+ {
+ t_print("Start selftest:\n");
+ CPPUNIT_ASSERT (is_float_equal(1.0f, 1.01f) == false);
+ CPPUNIT_ASSERT (is_float_equal(1.0f, 1.001f) == false);
+ CPPUNIT_ASSERT (is_float_equal(1.0f, 1.0001f) == false);
+ CPPUNIT_ASSERT (is_float_equal(1.0f, 1.00001f) == false);
+ CPPUNIT_ASSERT (is_float_equal(1.0f, 1.000002f) == false);
+ CPPUNIT_ASSERT (is_float_equal(1.0f, 1.0000001f) == true);
+ CPPUNIT_ASSERT (is_float_equal(1.0f, 1.00000001f) == true);
+ CPPUNIT_ASSERT (is_float_equal(1.0f, 1.000000001f) == true);
+
+ t_print("Selftest done.\n");
+ }
+
+ void toFloat_test_3()
+ {
+ rtl::OString sValue("3");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_3_5()
+ {
+ rtl::OString sValue("3.5");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_3_0625()
+ {
+ rtl::OString sValue("3.0625");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_3_0625_e()
+ {
+ rtl::OString sValue("3.0625e-4");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_pi()
+ {
+ // value from http://www.angio.net/pi/digits/50.txt
+ rtl::OString sValue("3.141592653589793238462643383279502884197169399375");
+ toFloat_test(sValue);
+ }
+
+ void toFloat_test_1()
+ {
+ rtl::OString sValue("1");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_10()
+ {
+ rtl::OString sValue("10");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_100()
+ {
+ rtl::OString sValue("100");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_1000()
+ {
+ rtl::OString sValue("1000");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_10000()
+ {
+ rtl::OString sValue("10000");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_mix()
+ {
+ rtl::OString sValue("456789321455.123456789012");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_1e99()
+ {
+ rtl::OString sValue("1e99");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_1e_n99()
+ {
+ rtl::OString sValue("1e-9");
+ toFloat_test(sValue);
+ }
+ void toFloat_test_1e308()
+ {
+ rtl::OString sValue("1e308");
+ toFloat_test(sValue);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toFloat);
+ CPPUNIT_TEST(toFloat_selftest);
+
+ CPPUNIT_TEST(toFloat_test_3);
+ CPPUNIT_TEST(toFloat_test_3_5);
+ CPPUNIT_TEST(toFloat_test_3_0625);
+ CPPUNIT_TEST(toFloat_test_3_0625_e);
+ CPPUNIT_TEST(toFloat_test_pi);
+ CPPUNIT_TEST(toFloat_test_1);
+ CPPUNIT_TEST(toFloat_test_10);
+ CPPUNIT_TEST(toFloat_test_100);
+ CPPUNIT_TEST(toFloat_test_1000);
+ CPPUNIT_TEST(toFloat_test_10000);
+ CPPUNIT_TEST(toFloat_test_mix);
+ CPPUNIT_TEST(toFloat_test_1e99);
+ CPPUNIT_TEST(toFloat_test_1e_n99);
+ CPPUNIT_TEST(toFloat_test_1e308);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class toFloat
+
+// -----------------------------------------------------------------------------
+// - lastIndexOf (tests)
+// -----------------------------------------------------------------------------
+class lastIndexOf : public CppUnit::TestFixture
+{
+
+public:
+ void lastIndexOf_oustring(rtl::OUString const& _suStr, rtl::OUString const& _suSearchStr, sal_Int32 _nExpectedResultPos)
+ {
+ // Algorithm
+ // search the string _suSearchStr (rtl::OUString) in the string _suStr.
+ // check if the _nExpectedResultPos occurs.
+
+ sal_Int32 nPos = _suStr.lastIndexOf(_suSearchStr);
+ CPPUNIT_ASSERT_MESSAGE("expected position is wrong", nPos == _nExpectedResultPos);
+ }
+
+ void lastIndexOf_salunicode(rtl::OUString const& _suStr, sal_Unicode _cuSearchChar, sal_Int32 _nExpectedResultPos)
+ {
+ // Algorithm
+ // search the unicode char _suSearchChar (sal_Unicode) in the string _suStr.
+ // check if the _nExpectedResultPos occurs.
+
+ sal_Int32 nPos = _suStr.lastIndexOf(_cuSearchChar);
+ CPPUNIT_ASSERT_MESSAGE("expected position is wrong", nPos == _nExpectedResultPos);
+ }
+
+ void lastIndexOf_oustring_offset(rtl::OUString const& _suStr, rtl::OUString const& _suSearchStr, sal_Int32 _nExpectedResultPos, sal_Int32 _nStartOffset)
+ {
+ sal_Int32 nPos = _suStr.lastIndexOf(_suSearchStr, _nStartOffset);
+ CPPUNIT_ASSERT_MESSAGE("expected position is wrong", nPos == _nExpectedResultPos);
+ }
+
+ void lastIndexOf_salunicode_offset(rtl::OUString const& _suStr, sal_Unicode _cuSearchChar, sal_Int32 _nExpectedResultPos, sal_Int32 _nStartOffset)
+ {
+ sal_Int32 nPos = _suStr.lastIndexOf(_cuSearchChar, _nStartOffset);
+ CPPUNIT_ASSERT_MESSAGE("expected position is wrong", nPos == _nExpectedResultPos);
+ }
+
+ // -----------------------------------------------------------------------------
+
+ void lastIndexOf_test_oustring_offset_001()
+ {
+ // search for sun, start at the end, found (pos==0)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("sun java system");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring_offset(aStr, aSearchStr, 0, aStr.getLength());
+ }
+
+ void lastIndexOf_test_oustring_offset_002()
+ {
+ // search for sun, start at pos = 3, found (pos==0)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("sun java system");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring_offset(aStr, aSearchStr, 0, 3);
+ }
+
+ void lastIndexOf_test_oustring_offset_003()
+ {
+ // search for sun, start at pos = 2, found (pos==-1)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("sun java system");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring_offset(aStr, aSearchStr, -1, 2);
+ }
+
+ void lastIndexOf_test_oustring_offset_004()
+ {
+ // search for sun, start at the end, found (pos==0)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("sun java system");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring_offset(aStr, aSearchStr, -1, -1);
+ }
+
+ void lastIndexOf_test_oustring_001()
+ {
+ // search for sun, found (pos==0)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("sun java system");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring(aStr, aSearchStr, 0);
+ }
+
+ void lastIndexOf_test_oustring_002()
+ {
+ // search for sun, found (pos==4)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun java system");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring(aStr, aSearchStr, 4);
+ }
+
+ void lastIndexOf_test_oustring_003()
+ {
+ // search for sun, found (pos==8)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun sun java system");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring(aStr, aSearchStr, 8);
+ }
+
+ void lastIndexOf_test_oustring_004()
+ {
+ // search for sun, found (pos==8)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun sun");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring(aStr, aSearchStr, 8);
+ }
+
+ void lastIndexOf_test_oustring_005()
+ {
+ // search for sun, found (pos==4)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun su");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring(aStr, aSearchStr, 4);
+ }
+
+ void lastIndexOf_test_oustring_006()
+ {
+ // search for sun, found (pos==-1)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the su su");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("sun");
+ lastIndexOf_oustring(aStr, aSearchStr, -1);
+ }
+
+ void lastIndexOf_test_oustring_007()
+ {
+ // search for earth, not found (-1)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the su su");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("earth");
+ lastIndexOf_oustring(aStr, aSearchStr, -1);
+ }
+
+ void lastIndexOf_test_oustring_008()
+ {
+ // search for earth, not found (-1)
+ rtl::OUString aStr = rtl::OUString();
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("earth");
+ lastIndexOf_oustring(aStr, aSearchStr, -1);
+ }
+
+ void lastIndexOf_test_oustring_009()
+ {
+ // search for earth, not found (-1)
+ rtl::OUString aStr = rtl::OUString();
+ rtl::OUString aSearchStr = rtl::OUString();
+ lastIndexOf_oustring(aStr, aSearchStr, -1);
+
+ }
+
+ void lastIndexOf_test_salunicode_001()
+ {
+ // search for 's', found (19)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun sun java system");
+ sal_Unicode suChar = L's';
+ lastIndexOf_salunicode(aStr, suChar, 19);
+ }
+
+ void lastIndexOf_test_salunicode_002()
+ {
+ // search for 'x', not found (-1)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun sun java system");
+ sal_Unicode suChar = L'x';
+ lastIndexOf_salunicode(aStr, suChar, -1);
+ }
+
+ void lastIndexOf_test_salunicode_offset_001()
+ {
+ // search for 's', start from pos last char, found (19)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun sun java system");
+ sal_Unicode cuChar = L's';
+ lastIndexOf_salunicode_offset(aStr, cuChar, 19, aStr.getLength());
+ }
+ void lastIndexOf_test_salunicode_offset_002()
+ {
+ // search for 's', start pos is last occur from search behind, found (17)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun sun java system");
+ sal_Unicode cuChar = L's';
+ lastIndexOf_salunicode_offset(aStr, cuChar, 17, 19);
+ }
+ void lastIndexOf_test_salunicode_offset_003()
+ {
+ // search for 't', start pos is 1, found (0)
+ rtl::OUString aStr = rtl::OUString::createFromAscii("the sun sun java system");
+ sal_Unicode cuChar = L't';
+ lastIndexOf_salunicode_offset(aStr, cuChar, 0, 1);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(lastIndexOf);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_001);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_002);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_003);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_004);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_005);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_006);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_007);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_008);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_009);
+
+ CPPUNIT_TEST(lastIndexOf_test_oustring_offset_001);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_offset_002);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_offset_003);
+ CPPUNIT_TEST(lastIndexOf_test_oustring_offset_004);
+
+ CPPUNIT_TEST(lastIndexOf_test_salunicode_001);
+ CPPUNIT_TEST(lastIndexOf_test_salunicode_002);
+
+ CPPUNIT_TEST(lastIndexOf_test_salunicode_offset_001);
+ CPPUNIT_TEST(lastIndexOf_test_salunicode_offset_002);
+ CPPUNIT_TEST(lastIndexOf_test_salunicode_offset_003);
+
+ CPPUNIT_TEST_SUITE_END();
+}; // class lastIndexOf
+
+
+// -----------------------------------------------------------------------------
+// - getToken (tests)
+// -----------------------------------------------------------------------------
+class getToken : public CppUnit::TestFixture
+{
+
+public:
+ void getToken_000()
+ {
+ rtl::OUString suTokenStr;
+
+ sal_Int32 nIndex = 0;
+ do
+ {
+ rtl::OUString suToken = suTokenStr.getToken( 0, ';', nIndex );
+ }
+ while ( nIndex >= 0 );
+ t_print("Index %d\n", nIndex);
+ // should not GPF
+ }
+
+ void getToken_001()
+ {
+ rtl::OUString suTokenStr = rtl::OUString::createFromAscii("a;b");
+
+ sal_Int32 nIndex = 0;
+
+ rtl::OUString suToken = suTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'a'", suToken.equals(rtl::OUString::createFromAscii("a")) == sal_True);
+
+ /* rtl::OUString */ suToken = suTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'b'", suToken.equals(rtl::OUString::createFromAscii("b")) == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("index should be negative", nIndex == -1);
+ }
+
+ void getToken_002()
+ {
+ rtl::OUString suTokenStr = rtl::OUString::createFromAscii("a;b.c");
+
+ sal_Int32 nIndex = 0;
+
+ rtl::OUString suToken = suTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'a'", suToken.equals(rtl::OUString::createFromAscii("a")) == sal_True);
+
+ /* rtl::OUString */ suToken = suTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'b'", suToken.equals(rtl::OUString::createFromAscii("b")) == sal_True);
+
+ /* rtl::OUString */ suToken = suTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'c'", suToken.equals(rtl::OUString::createFromAscii("c")) == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("index should be negative", nIndex == -1);
+ }
+
+ void getToken_003()
+ {
+ rtl::OUString suTokenStr = rtl::OUString::createFromAscii("a;;b");
+
+ sal_Int32 nIndex = 0;
+
+ rtl::OUString suToken = suTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'a'", suToken.equals(rtl::OUString::createFromAscii("a")) == sal_True);
+
+ /* rtl::OUString */ suToken = suTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be empty", suToken.getLength() == 0);
+
+ /* rtl::OUString */ suToken = suTokenStr.getToken( 0, ';', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be a 'b'", suToken.equals(rtl::OUString::createFromAscii("b")) == sal_True);
+ CPPUNIT_ASSERT_MESSAGE("index should be negative", nIndex == -1);
+ }
+
+ void getToken_004()
+ {
+ rtl::OUString suTokenStr = rtl::OUString::createFromAscii("longer.then.ever.");
+
+ sal_Int32 nIndex = 0;
+
+ rtl::OUString suToken = suTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be 'longer'", suToken.equals(rtl::OUString::createFromAscii("longer")) == sal_True);
+
+ /* rtl::OUString */ suToken = suTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be 'then'", suToken.equals(rtl::OUString::createFromAscii("then")) == sal_True);
+
+ /* rtl::OUString */ suToken = suTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be 'ever'", suToken.equals(rtl::OUString::createFromAscii("ever")) == sal_True);
+
+ /* rtl::OUString */ suToken = suTokenStr.getToken( 0, '.', nIndex );
+ CPPUNIT_ASSERT_MESSAGE("Token should be empty", suToken.getLength() == 0);
+
+ CPPUNIT_ASSERT_MESSAGE("index should be negative", nIndex == -1);
+ }
+
+ void getToken_005() {
+ rtl::OUString ab(RTL_CONSTASCII_USTRINGPARAM("ab"));
+ sal_Int32 n = 0;
+ CPPUNIT_ASSERT_MESSAGE(
+ "token should be 'ab'", ab.getToken(0, '-', n) == ab);
+ CPPUNIT_ASSERT_MESSAGE("n should be -1", n == -1);
+ CPPUNIT_ASSERT_MESSAGE(
+ "token should be empty", ab.getToken(0, '-', n).getLength() == 0);
+ }
+
+ CPPUNIT_TEST_SUITE(getToken);
+ CPPUNIT_TEST(getToken_000);
+ CPPUNIT_TEST(getToken_001);
+ CPPUNIT_TEST(getToken_002);
+ CPPUNIT_TEST(getToken_003);
+ CPPUNIT_TEST(getToken_004);
+ CPPUNIT_TEST(getToken_005);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getToken
+
+class convertToString: public CppUnit::TestFixture {
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(convertToString);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void convertToString::test() {
+ static sal_Unicode const utf16[] = { 0x0041, 0x00E4, 0x0061 };
+ rtl::OString s;
+ CPPUNIT_ASSERT(
+ rtl::OUString(utf16, sizeof utf16 / sizeof utf16[0]).convertToString(
+ &s, RTL_TEXTENCODING_UTF7,
+ (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
+ RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR)));
+ CPPUNIT_ASSERT_EQUAL(
+ rtl::OString(RTL_CONSTASCII_STRINGPARAM("A+AOQ-a")), s);
+}
+
+// -----------------------------------------------------------------------------
+// - string construction & interning (tests)
+// -----------------------------------------------------------------------------
+class construction : public CppUnit::TestFixture
+{
+public:
+ void construct()
+ {
+#ifdef RTL_INLINE_STRINGS
+ ::rtl::OUString aFoo( RTL_CONSTASCII_USTRINGPARAM("foo") );
+ CPPUNIT_ASSERT_MESSAGE("string contents", aFoo[0] == 'f');
+ CPPUNIT_ASSERT_MESSAGE("string contents", aFoo[1] == 'o');
+ CPPUNIT_ASSERT_MESSAGE("string contents", aFoo[2] == 'o');
+ CPPUNIT_ASSERT_MESSAGE("string length", aFoo.getLength() == 3);
+
+ ::rtl::OUString aBaa( RTL_CONSTASCII_USTRINGPARAM("this is a very long string with a lot of long things inside it and it goes on and on and on forever etc.") );
+ CPPUNIT_ASSERT_MESSAGE("string length", aBaa.getLength() == 104);
+ // Dig at the internals ... FIXME: should we have the bit-flag defines public ?
+ CPPUNIT_ASSERT_MESSAGE("string static flags", (aBaa.pData->refCount & 1<<30) != 0);
+#endif
+ }
+
+ void intern()
+ {
+ // The empty string is 'static' a special case ...
+ rtl::OUString aEmpty = rtl::OUString().intern();
+ rtl::OUString aEmpty2 = rtl::OUString::intern( RTL_CONSTASCII_USTRINGPARAM( "" ) );
+
+ ::rtl::OUString aFoo( RTL_CONSTASCII_USTRINGPARAM("foo") );
+ ::rtl::OUString aFooIntern = aFoo.intern();
+ CPPUNIT_ASSERT_MESSAGE("string contents", aFooIntern.equalsAscii("foo"));
+ CPPUNIT_ASSERT_MESSAGE("string length", aFooIntern.getLength() == 3);
+ // We have to dup due to no atomic 'intern' bit-set operation
+ CPPUNIT_ASSERT_MESSAGE("intern dups", aFoo.pData != aFooIntern.pData);
+
+ // Test interning lots of things
+ int i;
+ static const int nSequence = 4096;
+ rtl::OUString *pStrs;
+ sal_uIntPtr *pValues;
+
+ pStrs = new rtl::OUString[nSequence];
+ pValues = new sal_uIntPtr[nSequence];
+ for (i = 0; i < nSequence; i++)
+ {
+ pStrs[i] = rtl::OUString::valueOf( sqrt( static_cast<double>(i) ) ).intern();
+ pValues[i] = reinterpret_cast<sal_uIntPtr>( pStrs[i].pData );
+ }
+ for (i = 0; i < nSequence; i++)
+ {
+ rtl::OUString aNew = rtl::OUString::valueOf( sqrt( static_cast<double>(i) ) ).intern();
+ CPPUNIT_ASSERT_MESSAGE("double intern failed",
+ aNew.pData == pStrs[i].pData);
+ }
+
+ // Free strings to check for leaks
+ for (i = 0; i < nSequence; i++)
+ {
+ // Overwrite - hopefully this re-uses the memory
+ pStrs[i] = rtl::OUString();
+ pStrs[i] = rtl::OUString::valueOf( sqrt( static_cast<double>(i) ) );
+ }
+
+ for (i = 0; i < nSequence; i++)
+ {
+ rtl::OUString aIntern;
+ sal_uIntPtr nValue;
+ aIntern = rtl::OUString::valueOf( sqrt( static_cast<double>(i) ) ).intern();
+
+ nValue = reinterpret_cast<sal_uIntPtr>( aIntern.pData );
+ // This may not be 100% reliable: memory may
+ // have been re-used, but it's worth checking.
+ CPPUNIT_ASSERT_MESSAGE("intern leaking", nValue != pValues[i]);
+ }
+ delete [] pValues;
+ delete [] pStrs;
+ }
+
+ CPPUNIT_TEST_SUITE(construction);
+ CPPUNIT_TEST(construct);
+ CPPUNIT_TEST(intern);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+class indexOfAscii: public CppUnit::TestFixture {
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(indexOfAscii);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void indexOfAscii::test() {
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Int32(-1),
+ rtl::OUString().indexOfAsciiL(RTL_CONSTASCII_STRINGPARAM("")));
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Int32(-1),
+ rtl::OUString().lastIndexOfAsciiL(RTL_CONSTASCII_STRINGPARAM("")));
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Int32(0),
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("foo")).indexOfAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("foo")));
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Int32(0),
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("foo")).lastIndexOfAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("foo")));
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Int32(2),
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("fofoobar")).indexOfAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("foo")));
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Int32(3),
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("foofoofob")).
+ lastIndexOfAsciiL(RTL_CONSTASCII_STRINGPARAM("foo")));
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Int32(3),
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("foofoobar")).indexOfAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("foo"), 1));
+}
+
+class endsWith: public CppUnit::TestFixture {
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(endsWith);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void endsWith::test() {
+ CPPUNIT_ASSERT_EQUAL(
+ true,
+ rtl::OUString().endsWithAsciiL(RTL_CONSTASCII_STRINGPARAM("")));
+ CPPUNIT_ASSERT_EQUAL(
+ false,
+ rtl::OUString().endsWithAsciiL(RTL_CONSTASCII_STRINGPARAM("foo")));
+ CPPUNIT_ASSERT_EQUAL(
+ true,
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("bar")).endsWithAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("bar")));
+ CPPUNIT_ASSERT_EQUAL(
+ true,
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("foobar")).endsWithAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("bar")));
+ CPPUNIT_ASSERT_EQUAL(
+ false,
+ rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FOOBAR")).endsWithAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("bar")));
+}
+
+class createFromCodePoints: public CppUnit::TestFixture {
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(createFromCodePoints);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void createFromCodePoints::test() {
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Int32(0),
+ rtl::OUString(static_cast< sal_uInt32 const * >(NULL), 0).getLength());
+ static sal_uInt32 const cp[] = { 0, 0xD800, 0xFFFF, 0x10000, 0x10FFFF };
+ rtl::OUString s(cp, sizeof cp / sizeof (sal_uInt32));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(7), s.getLength());
+ CPPUNIT_ASSERT_EQUAL(sal_Unicode(0), s[0]);
+ CPPUNIT_ASSERT_EQUAL(sal_Unicode(0xD800), s[1]);
+ CPPUNIT_ASSERT_EQUAL(sal_Unicode(0xFFFF), s[2]);
+ CPPUNIT_ASSERT_EQUAL(sal_Unicode(0xD800), s[3]);
+ CPPUNIT_ASSERT_EQUAL(sal_Unicode(0xDC00), s[4]);
+ CPPUNIT_ASSERT_EQUAL(sal_Unicode(0xDBFF), s[5]);
+ CPPUNIT_ASSERT_EQUAL(sal_Unicode(0xDFFF), s[6]);
+}
+
+class iterateCodePoints: public CppUnit::TestFixture {
+public:
+ void testNotWellFormed();
+
+ CPPUNIT_TEST_SUITE(iterateCodePoints);
+ CPPUNIT_TEST(testNotWellFormed);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void iterateCodePoints::testNotWellFormed() {
+ static sal_Unicode const utf16[] =
+ { 0xD800, 0xDC00, 0x0041, 0xDBFF, 0xDFFF, 0xDDEF, 0xD9AB };
+ rtl::OUString s(utf16, sizeof utf16 / sizeof (sal_Unicode));
+ sal_Int32 i = 0;
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0x10000), s.iterateCodePoints(&i));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0x0041), s.iterateCodePoints(&i));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0x10FFFF), s.iterateCodePoints(&i));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0xDDEF), s.iterateCodePoints(&i));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0xD9AB), s.iterateCodePoints(&i));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(7), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0xD9AB), s.iterateCodePoints(&i, -1));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(6), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0xDDEF), s.iterateCodePoints(&i, -1));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(5), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0x10FFFF), s.iterateCodePoints(&i, -1));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0x0041), s.iterateCodePoints(&i, -1));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(2), i);
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0x10000), s.iterateCodePoints(&i, -1));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i);
+ i = 1;
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0xDC00), s.iterateCodePoints(&i, 2));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(3), i);
+ i = 4;
+ CPPUNIT_ASSERT_EQUAL(sal_uInt32(0x10000), s.iterateCodePoints(&i, -3));
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), i);
+}
+
+class convertFromString: public CppUnit::TestFixture {
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(createFromCodePoints);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void convertFromString::test() {
+ rtl::OUString t;
+ CPPUNIT_ASSERT(
+ !rtl_convertStringToUString(
+ &t.pData, RTL_CONSTASCII_STRINGPARAM("\x80"), RTL_TEXTENCODING_UTF8,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)));
+ CPPUNIT_ASSERT(
+ !rtl_convertStringToUString(
+ &t.pData, RTL_CONSTASCII_STRINGPARAM("\xC0"), RTL_TEXTENCODING_UTF8,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)));
+ CPPUNIT_ASSERT(
+ !rtl_convertStringToUString(
+ &t.pData, RTL_CONSTASCII_STRINGPARAM("\xFF"), RTL_TEXTENCODING_UTF8,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)));
+ CPPUNIT_ASSERT(
+ rtl_convertStringToUString(
+ &t.pData, RTL_CONSTASCII_STRINGPARAM("abc"), RTL_TEXTENCODING_UTF8,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)));
+ CPPUNIT_ASSERT(t.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("abc")));
+}
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUString::valueOf, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUString::toInt, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUString::toDouble, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUString::toFloat, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUString::lastIndexOf, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUString::getToken, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(
+ rtl_OUString::convertToString, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUString::construction, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(
+ rtl_OUString::indexOfAscii, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUString::endsWith, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(
+ rtl_OUString::createFromCodePoints, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(
+ rtl_OUString::iterateCodePoints, "rtl_OUString");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(
+ rtl_OUString::convertFromString, "rtl_OUString");
+
+} // namespace rtl_OUString
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/rtl/oustring/rtl_ustr.cxx b/sal/qa/rtl/oustring/rtl_ustr.cxx
new file mode 100644
index 000000000000..fd207ef0778c
--- /dev/null
+++ b/sal/qa/rtl/oustring/rtl_ustr.cxx
@@ -0,0 +1,1424 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <testshl/simpleheader.hxx>
+
+/** print a UNI_CODE file name.
+*/
+inline void printOUString( ::rtl::OUString const & _suStr )
+{
+ rtl::OString aString;
+
+ t_print( "OUString: " );
+ aString = ::rtl::OUStringToOString( _suStr, RTL_TEXTENCODING_ASCII_US );
+ t_print( "%s\n", aString.getStr( ) );
+}
+
+
+namespace rtl_ustr
+{
+
+ class compare : public CppUnit::TestFixture
+ {
+ public:
+
+
+ void compare_000()
+ {
+ rtl_ustr_compare( NULL, NULL);
+ // should not GPF
+ }
+
+ void compare_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl_ustr_compare( aStr1.getStr(), NULL);
+ // should not GPF
+ }
+ void compare_001()
+ {
+ rtl::OUString aStr1;
+ rtl::OUString aStr2;
+
+ sal_Int32 nValue = rtl_ustr_compare( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("Line must be equal.");
+
+ sal_Int32 nValue = rtl_ustr_compare( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_003()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("Line foo bar, ok, differ.");
+
+ sal_Int32 nValue = rtl_ustr_compare( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(compare);
+ CPPUNIT_TEST(compare_000);
+ CPPUNIT_TEST(compare_000_1);
+ CPPUNIT_TEST(compare_001);
+ CPPUNIT_TEST(compare_002);
+ CPPUNIT_TEST(compare_003);
+ CPPUNIT_TEST_SUITE_END();
+}; // class compare
+
+
+ class compareIgnoreAsciiCase : public CppUnit::TestFixture
+ {
+ public:
+
+ void compare_000()
+ {
+ rtl_ustr_compareIgnoreAsciiCase( NULL, NULL);
+ }
+
+ void compare_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl_ustr_compareIgnoreAsciiCase( aStr1.getStr(), NULL);
+ }
+ void compare_001()
+ {
+ rtl::OUString aStr1;
+ rtl::OUString aStr2;
+
+ sal_Int32 nValue = rtl_ustr_compareIgnoreAsciiCase( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("Line must be equal.");
+
+ sal_Int32 nValue = rtl_ustr_compareIgnoreAsciiCase( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("LINE MUST BE EQUAL.");
+
+ sal_Int32 nValue = rtl_ustr_compareIgnoreAsciiCase( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal (if case insensitve).", nValue == 0);
+ }
+
+ void compare_003()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("Line foo bar, ok, differ.");
+
+ sal_Int32 nValue = rtl_ustr_compareIgnoreAsciiCase( aStr1.getStr(), aStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(compareIgnoreAsciiCase);
+ CPPUNIT_TEST(compare_000);
+ CPPUNIT_TEST(compare_000_1);
+ CPPUNIT_TEST(compare_001);
+ CPPUNIT_TEST(compare_002);
+ CPPUNIT_TEST(compare_002_1);
+ CPPUNIT_TEST(compare_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class compareIgnoreAsciiCase
+
+// -----------------------------------------------------------------------------
+
+ class shortenedCompareIgnoreAsciiCase_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void compare_000()
+ {
+ rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( NULL, 0, NULL, 0, 0);
+ }
+
+ void compare_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(), NULL, 0, 1);
+ }
+ void compare_001()
+ {
+ rtl::OUString aStr1;
+ rtl::OUString aStr2;
+
+ sal_Int32 nValue = rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(), aStr2.getStr(), aStr2.getLength(), aStr1.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("Line must be equal.");
+
+ sal_Int32 nValue = rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(),
+ aStr2.getStr(), aStr2.getLength(),
+ aStr1.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void compare_002_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("LINE MUST BE EQUAL.");
+
+ sal_Int32 nValue = rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(),
+ aStr2.getStr(), aStr2.getLength(),
+ aStr1.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal (if case insensitve).", nValue == 0);
+ }
+
+ void compare_003()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("Line foo bar, ok, differ.");
+
+ sal_Int32 nValue = rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(),
+ aStr2.getStr(), aStr2.getLength(),
+ 5);
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal first 5 characters.", nValue == 0);
+ }
+
+ void compare_004()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OUString aStr2 = rtl::OUString::createFromAscii("Line foo bar, ok, differ.");
+
+ sal_Int32 nValue = rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(),
+ aStr2.getStr(), aStr2.getLength(),
+ aStr1.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(shortenedCompareIgnoreAsciiCase_WithLength);
+ CPPUNIT_TEST(compare_000);
+ CPPUNIT_TEST(compare_000_1);
+ CPPUNIT_TEST(compare_001);
+ CPPUNIT_TEST(compare_002);
+ CPPUNIT_TEST(compare_002_1);
+ CPPUNIT_TEST(compare_003);
+ CPPUNIT_TEST(compare_004);
+ CPPUNIT_TEST_SUITE_END();
+}; // class compare
+
+
+// // -----------------------------------------------------------------------------
+//
+// class hashCode : public CppUnit::TestFixture
+// {
+// public:
+//
+// void hashCode_000()
+// {
+// sal_Int32 nHashCode = rtl_ustr_hashCode( NULL );
+// volatile int dummy = 0;
+// }
+//
+// void hashCode_001()
+// {
+// rtl::OString aStr1 = "Line for a hashCode.";
+// sal_Int32 nHashCode = rtl_ustr_hashCode( aStr1.getStr() );
+// t_print("hashcode: %d\n", nHashCode);
+// // CPPUNIT_ASSERT_MESSAGE("failed.", nValue == 0);
+// }
+//
+// void hashCode_002()
+// {
+// rtl::OString aStr1 = "Line for a hashCode.";
+// sal_Int32 nHashCode1 = rtl_ustr_hashCode( aStr1.getStr() );
+//
+// rtl::OString aStr2 = "Line for a hashCode.";
+// sal_Int32 nHashCode2 = rtl_ustr_hashCode( aStr2.getStr() );
+//
+// CPPUNIT_ASSERT_MESSAGE("hashcodes must be equal.", nHashCode1 == nHashCode2 );
+// }
+//
+// void hashCode_003()
+// {
+// rtl::OString aStr1 = "Line for a hashCode.";
+// sal_Int32 nHashCode1 = rtl_ustr_hashCode( aStr1.getStr() );
+//
+// rtl::OString aStr2 = "Line for an other hashcode.";
+// sal_Int32 nHashCode2 = rtl_ustr_hashCode( aStr2.getStr() );
+//
+// CPPUNIT_ASSERT_MESSAGE("hashcodes must differ.", nHashCode1 != nHashCode2 );
+// }
+//
+// // Change the following lines only, if you add, remove or rename
+// // member functions of the current class,
+// // because these macros are need by auto register mechanism.
+//
+// CPPUNIT_TEST_SUITE(hashCode);
+// CPPUNIT_TEST(hashCode_000);
+// CPPUNIT_TEST(hashCode_001);
+// CPPUNIT_TEST(hashCode_002);
+// CPPUNIT_TEST(hashCode_003);
+// CPPUNIT_TEST_SUITE_END();
+// }; // class compare
+//
+//
+// // -----------------------------------------------------------------------------
+//
+ class indexOfChar : public CppUnit::TestFixture
+ {
+ public:
+
+ void indexOfChar_000()
+ {
+ rtl_ustr_indexOfChar( NULL, 0 );
+ }
+
+ void indexOfChar_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a indexOfChar.");
+
+ sal_Int32 nIndex = rtl_ustr_indexOfChar( aStr1.getStr(), 'L' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 0);
+
+ /* sal_Int32 */ nIndex = rtl_ustr_indexOfChar( aStr1.getStr(), 'i' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 1);
+
+ /* sal_Int32 */ nIndex = rtl_ustr_indexOfChar( aStr1.getStr(), 'n' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 2);
+
+ /* sal_Int32 */ nIndex = rtl_ustr_indexOfChar( aStr1.getStr(), 'e' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 3);
+ }
+
+ void indexOfChar_002()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a indexOfChar.");
+ sal_Int32 nIndex = rtl_ustr_indexOfChar( aStr1.getStr(), 'y' );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(indexOfChar);
+ CPPUNIT_TEST(indexOfChar_000);
+ CPPUNIT_TEST(indexOfChar_001);
+ CPPUNIT_TEST(indexOfChar_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class indexOfChar
+
+// // -----------------------------------------------------------------------------
+ class lastIndexOfChar : public CppUnit::TestFixture
+ {
+ public:
+
+ void lastIndexOfChar_000()
+ {
+ rtl_ustr_lastIndexOfChar( NULL, 0 );
+ }
+
+ void lastIndexOfChar_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a lastIndexOfChar.");
+
+ sal_Int32 nIndex = rtl_ustr_lastIndexOfChar( aStr1.getStr(), 'C' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 22);
+
+ /* sal_Int32 */ nIndex = rtl_ustr_lastIndexOfChar( aStr1.getStr(), 'h' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 23);
+
+ /* sal_Int32 */ nIndex = rtl_ustr_lastIndexOfChar( aStr1.getStr(), 'a' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 24);
+
+ /* sal_Int32 */ nIndex = rtl_ustr_lastIndexOfChar( aStr1.getStr(), 'r' );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 25);
+ }
+
+ void lastIndexOfChar_002()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a lastIndexOfChar.");
+ sal_Int32 nIndex = rtl_ustr_lastIndexOfChar( aStr1.getStr(), 'y' );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(lastIndexOfChar);
+ CPPUNIT_TEST(lastIndexOfChar_000);
+ CPPUNIT_TEST(lastIndexOfChar_001);
+ CPPUNIT_TEST(lastIndexOfChar_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class lastIndexOfChar
+
+
+// -----------------------------------------------------------------------------
+
+ class indexOfStr : public CppUnit::TestFixture
+ {
+ public:
+
+ void indexOfStr_000()
+ {
+ rtl_ustr_indexOfStr( NULL, 0 );
+ }
+
+ void indexOfStr_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a indexOfStr.");
+ rtl_ustr_indexOfStr( aStr1.getStr(), 0 );
+ }
+
+ void indexOfStr_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a indexOfStr.");
+
+ rtl::OUString suSearch = rtl::OUString::createFromAscii("Line");
+ sal_Int32 nIndex = rtl_ustr_indexOfStr( aStr1.getStr(), suSearch );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 0);
+
+ /* rtl::OUString */ suSearch = rtl::OUString::createFromAscii("for");
+ /* sal_Int32 */ nIndex = rtl_ustr_indexOfStr( aStr1.getStr(), suSearch );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 5);
+
+ /* rtl::OUString */ suSearch = rtl::OUString::createFromAscii("a");
+ /* sal_Int32 */ nIndex = rtl_ustr_indexOfStr( aStr1.getStr(), suSearch );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 9);
+
+ /* rtl::OUString */ suSearch = rtl::OUString::createFromAscii("a index");
+ /* sal_Int32 */ nIndex = rtl_ustr_indexOfStr( aStr1.getStr(), suSearch );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex ==9);
+ }
+
+ void indexOfStr_002()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a indexOfStr.");
+ rtl::OUString suSearch = rtl::OUString::createFromAscii("not exist");
+ sal_Int32 nIndex = rtl_ustr_indexOfStr( aStr1.getStr(), suSearch );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(indexOfStr);
+ CPPUNIT_TEST(indexOfStr_000);
+ CPPUNIT_TEST(indexOfStr_001);
+ CPPUNIT_TEST(indexOfStr_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class compare
+// -----------------------------------------------------------------------------
+
+
+ class lastIndexOfStr : public CppUnit::TestFixture
+ {
+ public:
+
+ void lastIndexOfStr_000()
+ {
+ rtl_ustr_lastIndexOfStr( NULL, NULL );
+ }
+
+ void lastIndexOfStr_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a lastIndexOfStr.");
+ rtl_ustr_lastIndexOfStr( aStr1.getStr(), NULL );
+ }
+
+ void lastIndexOfStr_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a lastIndexOfStr.");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("Index");
+
+ sal_Int32 nIndex = rtl_ustr_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 15);
+
+ /* rtl::OString */ aSearchStr = rtl::OUString::createFromAscii("Line");
+ /* sal_Int32 */ nIndex = rtl_ustr_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 0);
+
+ /* rtl::OString */ aSearchStr = rtl::OUString::createFromAscii("");
+ /* sal_Int32 */ nIndex = rtl_ustr_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1);
+ }
+
+ void lastIndexOfStr_002()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a lastIndexOfStr.");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("foo");
+ sal_Int32 nIndex = rtl_ustr_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == -1 );
+ }
+
+ void lastIndexOfStr_003()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line for a lastIndexOfStr.");
+ rtl::OUString aSearchStr = rtl::OUString::createFromAscii("O");
+ sal_Int32 nIndex = rtl_ustr_lastIndexOfStr( aStr1.getStr(), aSearchStr.getStr() );
+
+ CPPUNIT_ASSERT_MESSAGE("index is wrong.", nIndex == 20 );
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(lastIndexOfStr);
+ CPPUNIT_TEST(lastIndexOfStr_000);
+ CPPUNIT_TEST(lastIndexOfStr_001);
+ CPPUNIT_TEST(lastIndexOfStr_002);
+ CPPUNIT_TEST(lastIndexOfStr_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class lastIndexOfStr
+
+// -----------------------------------------------------------------------------
+
+ class replaceChar : public CppUnit::TestFixture
+ {
+ public:
+
+ void replaceChar_000()
+ {
+ rtl_ustr_replaceChar( NULL, 0, 0 );
+ }
+
+ void replaceChar_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("replace char.");
+ rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("ruplacu char.");
+
+ sal_uInt32 nLength = aStr1.getLength() * sizeof(sal_Unicode);
+ sal_Unicode* pStr = (sal_Unicode*) malloc( nLength + sizeof(sal_Unicode)); // length + 1 (null terminator)
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ memset(pStr, 0, nLength + sizeof(sal_Unicode));
+ memcpy(pStr, aStr1.getStr(), nLength);
+
+ rtl_ustr_replaceChar( pStr, 'e', 'u' );
+ rtl::OUString suStr(pStr, aStr1.getLength());
+
+ CPPUNIT_ASSERT_MESSAGE("replace failed", aShouldStr1.equals(suStr) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(replaceChar);
+ CPPUNIT_TEST(replaceChar_000);
+ CPPUNIT_TEST(replaceChar_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+// -----------------------------------------------------------------------------
+
+ class replaceChar_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void replaceChar_WithLength_000()
+ {
+ rtl_ustr_replaceChar_WithLength( NULL, 0, 0, 0 );
+ }
+
+ void replaceChar_WithLength_000_1()
+ {
+ rtl_ustr_replaceChar_WithLength( NULL, 1, 0, 0 );
+ }
+ void replaceChar_WithLength_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("replace char.");
+ rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("ruplace char.");
+
+ sal_uInt32 nLength = aStr1.getLength() * sizeof(sal_Unicode);
+ sal_Unicode* pStr = (sal_Unicode*) malloc(nLength);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ memcpy(pStr, aStr1.getStr(), nLength);
+
+ rtl_ustr_replaceChar_WithLength( pStr, 6, 'e', 'u' );
+ rtl::OUString suStr(pStr, aStr1.getLength());
+
+ CPPUNIT_ASSERT_MESSAGE("replace failed", aShouldStr1.equals(suStr) == sal_True);
+ free(pStr);
+ }
+
+ void replaceChar_WithLength_002()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("eeeeeeeeeeeee");
+ rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("uuuuuueeeeeee");
+
+ sal_uInt32 nLength = aStr1.getLength() * sizeof(sal_Unicode);
+ sal_Unicode* pStr = (sal_Unicode*) malloc(nLength); // no null terminator is need
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ memcpy(pStr, aStr1.getStr(), nLength);
+
+ rtl_ustr_replaceChar_WithLength( pStr, 6, 'e', 'u' );
+ rtl::OUString suStr(pStr, aStr1.getLength());
+
+ CPPUNIT_ASSERT_MESSAGE("replace failed", aShouldStr1.equals(suStr) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(replaceChar_WithLength);
+ CPPUNIT_TEST(replaceChar_WithLength_000);
+ CPPUNIT_TEST(replaceChar_WithLength_000_1);
+ CPPUNIT_TEST(replaceChar_WithLength_001);
+ CPPUNIT_TEST(replaceChar_WithLength_002);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+
+// -----------------------------------------------------------------------------
+
+ class toAsciiLowerCase : public CppUnit::TestFixture
+ {
+ public:
+
+ void toAsciiLowerCase_000()
+ {
+ rtl_ustr_toAsciiLowerCase( NULL );
+ }
+
+ void toAsciiLowerCase_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("CHANGE THIS TO ASCII LOWER CASE.");
+ rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("change this to ascii lower case.");
+
+ sal_uInt32 nLength = aStr1.getLength() * sizeof(sal_Unicode);
+ sal_Unicode* pStr = (sal_Unicode*) malloc(nLength + sizeof(sal_Unicode) ); // we need to add '\0' so one more
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ memset(pStr, 0, nLength + sizeof(sal_Unicode)); // empty the sal_Unicode array
+ memcpy(pStr, aStr1.getStr(), nLength);
+
+ rtl_ustr_toAsciiLowerCase( pStr );
+ rtl::OUString suStr(pStr, aStr1.getLength());
+
+ CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(suStr) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toAsciiLowerCase);
+ CPPUNIT_TEST(toAsciiLowerCase_000);
+ CPPUNIT_TEST(toAsciiLowerCase_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+
+ class toAsciiLowerCase_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void toAsciiLowerCase_WithLength_000()
+ {
+ rtl_ustr_toAsciiLowerCase_WithLength( NULL, 0 );
+ }
+
+ void toAsciiLowerCase_WithLength_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("CHANGE THIS TO ASCII LOWER CASE.");
+ rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("change thiS TO ASCII LOWER CASE.");
+
+ sal_uInt32 nLength = aStr1.getLength() * sizeof(sal_Unicode);
+ sal_Unicode* pStr = (sal_Unicode*) malloc(nLength);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ memcpy(pStr, aStr1.getStr(), nLength);
+
+ rtl_ustr_toAsciiLowerCase_WithLength( pStr, 10 );
+
+ rtl::OUString suStr(pStr, aStr1.getLength());
+ sal_Bool bResult = aShouldStr1.equals(suStr);
+
+ printOUString(suStr);
+ t_print("Result length: %d\n", suStr.getLength() );
+ t_print("Result: %d\n", bResult);
+
+ CPPUNIT_ASSERT_MESSAGE("failed", bResult == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toAsciiLowerCase_WithLength);
+ CPPUNIT_TEST(toAsciiLowerCase_WithLength_000);
+ CPPUNIT_TEST(toAsciiLowerCase_WithLength_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+// -----------------------------------------------------------------------------
+
+ class toAsciiUpperCase : public CppUnit::TestFixture
+ {
+ public:
+
+ void toAsciiUpperCase_000()
+ {
+ rtl_ustr_toAsciiUpperCase( NULL );
+ }
+
+ void toAsciiUpperCase_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("change this to ascii upper case.");
+ rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("CHANGE THIS TO ASCII UPPER CASE.");
+
+ sal_uInt32 nLength = aStr1.getLength() * sizeof(sal_Unicode);
+ sal_Unicode* pStr = (sal_Unicode*) malloc(nLength + sizeof(sal_Unicode)); // length + null terminator
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ memset(pStr, 0, nLength + sizeof(sal_Unicode));
+ memcpy(pStr, aStr1.getStr(), nLength);
+
+ rtl_ustr_toAsciiUpperCase( pStr );
+ rtl::OUString suStr(pStr, aStr1.getLength());
+
+ CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(suStr) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toAsciiUpperCase);
+ CPPUNIT_TEST(toAsciiUpperCase_000);
+ CPPUNIT_TEST(toAsciiUpperCase_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+
+ class toAsciiUpperCase_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void toAsciiUpperCase_WithLength_000()
+ {
+ rtl_ustr_toAsciiUpperCase_WithLength( NULL, 0 );
+ }
+
+ void toAsciiUpperCase_WithLength_001()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("change this to ascii lower case.");
+ rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("CHANGE THIs to ascii lower case.");
+
+ sal_uInt32 nLength = aStr1.getLength() * sizeof(sal_Unicode);
+ sal_Unicode* pStr = (sal_Unicode*) malloc(nLength);
+ CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+
+ memcpy(pStr, aStr1.getStr(), nLength);
+ rtl_ustr_toAsciiUpperCase_WithLength( pStr, 10 );
+ rtl::OUString suStr(pStr, aStr1.getLength());
+
+ // t_print("Uppercase with length: '%s'\n", aStr1.getStr());
+ CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(suStr) == sal_True);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(toAsciiUpperCase_WithLength);
+ CPPUNIT_TEST(toAsciiUpperCase_WithLength_000);
+ CPPUNIT_TEST(toAsciiUpperCase_WithLength_001);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class replaceChar
+
+
+ // -----------------------------------------------------------------------------
+
+ class trim_WithLength : public CppUnit::TestFixture
+ {
+ public:
+ void trim_WithLength_000()
+ {
+ rtl_ustr_trim_WithLength(NULL, 0);
+ // should not GPF
+ }
+
+ void trim_WithLength_000_1()
+ {
+ rtl::OUString suStr = rtl::OUString::createFromAscii(" trim this");
+
+ sal_uInt32 nLength = suStr.getLength() * sizeof(sal_Unicode);
+ sal_Unicode *pStr = (sal_Unicode*)malloc(nLength);
+ memcpy(pStr, suStr.getStr(), nLength);
+
+ rtl_ustr_trim_WithLength( pStr, 0 );
+ free(pStr);
+ }
+
+ void trim_WithLength_001()
+ {
+ rtl::OUString suStr = rtl::OUString::createFromAscii(" trim this");
+ sal_uInt32 nLength = suStr.getLength() * sizeof(sal_Unicode);
+ sal_Unicode *pStr = (sal_Unicode*)malloc(nLength);
+ memcpy(pStr, suStr.getStr(), nLength);
+
+ rtl_ustr_trim_WithLength( pStr, 2 );
+
+ CPPUNIT_ASSERT_MESSAGE("string should be empty", rtl::OUString(pStr).getLength() == 0);
+ free(pStr);
+ }
+
+
+ void trim_WithLength_002()
+ {
+ rtl::OUString suStr = rtl::OUString::createFromAscii("trim this");
+
+ sal_uInt32 nLength = suStr.getLength() * sizeof(sal_Unicode);
+ sal_Unicode *pStr = (sal_Unicode*)malloc(nLength);
+ memcpy(pStr, suStr.getStr(), nLength);
+
+ rtl_ustr_trim_WithLength( pStr, 5 );
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'trim'", rtl::OUString(pStr).getLength() == 4);
+ free(pStr);
+ }
+
+
+ void trim_WithLength_003()
+ {
+ rtl::OUString suStr = rtl::OUString::createFromAscii(" trim this");
+
+ sal_uInt32 nLength = suStr.getLength() * sizeof(sal_Unicode);
+ sal_Unicode *pStr = (sal_Unicode*)malloc(nLength);
+ memcpy(pStr, suStr.getStr(), nLength);
+
+ rtl_ustr_trim_WithLength( pStr, 11 );
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'trim'", rtl::OUString(pStr).getLength() == 4);
+ free(pStr);
+ }
+
+ void trim_WithLength_004()
+ {
+ rtl::OUString suStr = rtl::OUString::createFromAscii("\r\n\t \n\r trim \n this");
+
+ sal_uInt32 nLength = suStr.getLength() * sizeof(sal_Unicode);
+ sal_Unicode *pStr = (sal_Unicode*)malloc(nLength);
+ memcpy(pStr, suStr.getStr(), nLength);
+
+ rtl_ustr_trim_WithLength( pStr, 17 );
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'trim'", rtl::OUString(pStr).getLength() == 4);
+ free(pStr);
+ }
+
+ void trim_WithLength_005()
+ {
+ rtl::OUString suStr = rtl::OUString::createFromAscii("\r\n\t \n\r trim \t this \n\r\t\t ");
+
+ sal_uInt32 nLength = suStr.getLength() * sizeof(sal_Unicode);
+ sal_Unicode *pStr = (sal_Unicode*)malloc(nLength);
+ memcpy(pStr, suStr.getStr(), nLength);
+
+ rtl_ustr_trim_WithLength( pStr, suStr.getLength() );
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'trim \\t this'", rtl::OUString(pStr).getLength() == 11);
+ free(pStr);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(trim_WithLength);
+ CPPUNIT_TEST(trim_WithLength_000);
+ CPPUNIT_TEST(trim_WithLength_000_1);
+ CPPUNIT_TEST(trim_WithLength_001);
+ CPPUNIT_TEST(trim_WithLength_002);
+ CPPUNIT_TEST(trim_WithLength_003);
+ CPPUNIT_TEST(trim_WithLength_004);
+ CPPUNIT_TEST(trim_WithLength_005);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+ // -----------------------------------------------------------------------------
+
+ class valueOfChar : public CppUnit::TestFixture
+ {
+ public:
+ void valueOfChar_000()
+ {
+ rtl_ustr_valueOfChar(NULL, 0);
+ // should not GPF
+ }
+ void valueOfChar_001()
+ {
+ sal_Unicode *pStr = (sal_Unicode*)malloc(RTL_USTR_MAX_VALUEOFCHAR);
+ if (pStr)
+ {
+ rtl_ustr_valueOfChar(pStr, 'A');
+
+ CPPUNIT_ASSERT_MESSAGE("string should contain 'A'", pStr[0] == L'A');
+ free(pStr);
+ }
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(valueOfChar);
+ CPPUNIT_TEST(valueOfChar_000);
+ CPPUNIT_TEST(valueOfChar_001);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+
+
+
+ class ascii_compare_WithLength : public CppUnit::TestFixture
+ {
+ public:
+ void zero_length()
+ {
+ sal_Unicode pUnicode[] = {0xffff, 0xffff};
+ char const * pAscii = "reference";
+
+ sal_Int32 value = rtl_ustr_ascii_compare_WithLength(pUnicode, 0, pAscii);
+ CPPUNIT_ASSERT_MESSAGE("ref string is empty, compare failed, needs to be <0.", value < 0);
+ }
+
+ void equal_ascii_shorter()
+ {
+ rtl::OUString refStr(RTL_CONSTASCII_USTRINGPARAM("referenceString"));
+ char const * pAscii = "reference";
+
+ sal_Int32 value = rtl_ustr_ascii_compare_WithLength(refStr.pData->buffer, refStr.pData->length, pAscii);
+ CPPUNIT_ASSERT_MESSAGE("ref string is bigger, compare failed, needs to be >0.", value > 0);
+ }
+
+ void equal_ascii_shorter_asciiLength()
+ {
+ rtl::OUString refStr(RTL_CONSTASCII_USTRINGPARAM("referenceString"));
+ char const * pAscii = "reference";
+
+ sal_Int32 value = rtl_ustr_ascii_compare_WithLength(refStr.pData->buffer, rtl_str_getLength(pAscii), pAscii);
+ CPPUNIT_ASSERT_MESSAGE("ref string is bigger despite ascii length, compare failed, needs to be == 0.", value == 0);
+ }
+
+ void equal_ref_shorter()
+ {
+ rtl::OUString refStr(RTL_CONSTASCII_USTRINGPARAM("reference"));
+ char const * pAscii = "referenceString";
+
+ sal_Int32 value = rtl_ustr_ascii_compare_WithLength(refStr.pData->buffer, refStr.pData->length, pAscii);
+ CPPUNIT_ASSERT_MESSAGE("ascii string is bigger, but only compared to ref length, needs to be 0.", value < 0);
+ }
+
+ void equal()
+ {
+ rtl::OUString refStr(RTL_CONSTASCII_USTRINGPARAM("reference"));
+ char const * pAscii = "reference";
+
+ sal_Int32 value = rtl_ustr_ascii_compare_WithLength(refStr.pData->buffer, refStr.pData->length, pAscii);
+ CPPUNIT_ASSERT_MESSAGE("strings are equal, compare failed, needs to be 0.", value == 0);
+ }
+
+ void unequal_reference_bigger()
+ {
+ rtl::OUString refStr(RTL_CONSTASCII_USTRINGPARAM("defghi"));
+ char const * pAscii = "abc";
+
+ sal_Int32 value = rtl_ustr_ascii_compare_WithLength(refStr.pData->buffer, refStr.pData->length, pAscii);
+ CPPUNIT_ASSERT_MESSAGE("strings are unequal and ref is bigger, needs to be >0.", value > 0);
+ }
+
+ void unequal_ascii_bigger()
+ {
+ rtl::OUString refStr(RTL_CONSTASCII_USTRINGPARAM("abc"));
+ char const * pAscii = "defghi";
+
+ sal_Int32 value = rtl_ustr_ascii_compare_WithLength(refStr.pData->buffer, refStr.pData->length, pAscii);
+
+ CPPUNIT_ASSERT_MESSAGE("strings are unequal and ascii is bigger, needs to be <0.", value < 0);
+ }
+
+ CPPUNIT_TEST_SUITE(ascii_compare_WithLength);
+ CPPUNIT_TEST(zero_length);
+ CPPUNIT_TEST(equal_ascii_shorter);
+ CPPUNIT_TEST(equal_ascii_shorter_asciiLength);
+ CPPUNIT_TEST(equal_ref_shorter);
+ CPPUNIT_TEST(equal);
+ CPPUNIT_TEST(unequal_reference_bigger);
+ CPPUNIT_TEST(unequal_ascii_bigger);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+
+
+
+ class ascii_shortenedCompareIgnoreAsciiCase_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void ascii_shortenedCompareIgnoreAsciiCase_WithLength_000()
+ {
+ rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( NULL, 0, NULL, 0);
+ // should not GPF
+ }
+
+ void ascii_shortenedCompareIgnoreAsciiCase_WithLength_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), aStr1.getLength(), NULL, 0);
+ // should not GPF
+ }
+ void ascii_shortenedCompareIgnoreAsciiCase_WithLength_000_2()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OString sStr2 = "Line is shorter.";
+ rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( aStr1.getStr(), sStr2.getLength(), sStr2.getStr(), 0);
+ // should not GPF
+ }
+ void ascii_shortenedCompareIgnoreAsciiCase_WithLength_001()
+ {
+ rtl::OUString suStr1;
+ rtl::OString sStr2;
+
+ sal_Int32 nValue = rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( suStr1, 0, sStr2.getStr(), 0);
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_shortenedCompareIgnoreAsciiCase_WithLength_002()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OString sStr2 = "Line must be equal.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( suStr1.getStr(), suStr1.getLength(), sStr2.getStr(), sStr2.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_shortenedCompareIgnoreAsciiCase_WithLength_003()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OString sStr2 = "Line must be differ and longer.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( suStr1.getStr(), suStr1.getLength(), sStr2.getStr(), sStr2.getLength());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(ascii_shortenedCompareIgnoreAsciiCase_WithLength);
+ CPPUNIT_TEST(ascii_shortenedCompareIgnoreAsciiCase_WithLength_000);
+ CPPUNIT_TEST(ascii_shortenedCompareIgnoreAsciiCase_WithLength_000_1);
+ CPPUNIT_TEST(ascii_shortenedCompareIgnoreAsciiCase_WithLength_000_2);
+ CPPUNIT_TEST(ascii_shortenedCompareIgnoreAsciiCase_WithLength_001);
+ CPPUNIT_TEST(ascii_shortenedCompareIgnoreAsciiCase_WithLength_002);
+ CPPUNIT_TEST(ascii_shortenedCompareIgnoreAsciiCase_WithLength_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ascii_shortenedCompareIgnoreAsciiCase_WithLength
+
+// -----------------------------------------------------------------------------
+
+ class ascii_compareIgnoreAsciiCase_WithLength : public CppUnit::TestFixture
+ {
+ public:
+
+ void ascii_compareIgnoreAsciiCase_WithLength_000()
+ {
+ rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( NULL, 0, NULL);
+ // should not GPF
+ }
+
+ void ascii_compareIgnoreAsciiCase_WithLength_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( aStr1.getStr(), 0, NULL);
+ // should not GPF
+ }
+ void ascii_compareIgnoreAsciiCase_WithLength_000_2()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OString sStr2 = "Line is shorter.";
+ rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( aStr1.getStr(), sStr2.getLength(), sStr2.getStr());
+ // should not GPF
+ }
+ void ascii_compareIgnoreAsciiCase_WithLength_001()
+ {
+ rtl::OUString suStr1;
+ rtl::OString sStr2;
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( suStr1, 0, sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compareIgnoreAsciiCase_WithLength failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_compareIgnoreAsciiCase_WithLength_002()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OString sStr2 = "Line must be equal.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( suStr1.getStr(), suStr1.getLength(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_compareIgnoreAsciiCase_WithLength_003()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OString sStr2 = "Line must be differ and longer.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( suStr1.getStr(), suStr1.getLength(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(ascii_compareIgnoreAsciiCase_WithLength);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_WithLength_000);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_WithLength_000_1);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_WithLength_000_2);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_WithLength_001);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_WithLength_002);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_WithLength_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ascii_compareIgnoreAsciiCase_WithLength
+
+// -----------------------------------------------------------------------------
+
+ class ascii_compare : public CppUnit::TestFixture
+ {
+ public:
+
+ void ascii_compare_000()
+ {
+ rtl_ustr_ascii_compare( NULL, NULL);
+ // should not GPF
+ }
+
+ void ascii_compare_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl_ustr_ascii_compare( aStr1.getStr(), NULL);
+ // should not GPF
+ }
+ void ascii_compare_001()
+ {
+ rtl::OUString suStr1;
+ rtl::OString sStr2;
+
+ sal_Int32 nValue = rtl_ustr_ascii_compare( suStr1, sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_compare_002()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OString sStr2 = "Line must be equal.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compare( suStr1.getStr(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_compare_003()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OString sStr2 = "Line foo bar, ok, differ.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compare( suStr1.getStr(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(ascii_compare);
+ CPPUNIT_TEST(ascii_compare_000);
+ CPPUNIT_TEST(ascii_compare_000_1);
+ CPPUNIT_TEST(ascii_compare_001);
+ CPPUNIT_TEST(ascii_compare_002);
+ CPPUNIT_TEST(ascii_compare_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ascii_compare
+
+// -----------------------------------------------------------------------------
+
+ class ascii_compareIgnoreAsciiCase : public CppUnit::TestFixture
+ {
+ public:
+
+ void ascii_compareIgnoreAsciiCase_000()
+ {
+ rtl_ustr_ascii_compareIgnoreAsciiCase( NULL, NULL);
+ // should not GPF
+ }
+
+ void ascii_compareIgnoreAsciiCase_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl_ustr_ascii_compareIgnoreAsciiCase( aStr1.getStr(), NULL);
+ // should not GPF
+ }
+ void ascii_compareIgnoreAsciiCase_001()
+ {
+ rtl::OUString suStr1;
+ rtl::OString sStr2;
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase( suStr1, sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_compareIgnoreAsciiCase_002()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OString sStr2 = "Line must be equal.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase( suStr1.getStr(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_compareIgnoreAsciiCase_002_1()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must be equal, when ignore case.");
+ rtl::OString sStr2 = "LINE MUST BE EQUAL, WHEN IGNORE CASE.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase( suStr1.getStr(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal (if case insensitve).", nValue == 0);
+ }
+
+ void ascii_compareIgnoreAsciiCase_003()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OString sStr2 = "Line foo bar, ok, differ.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase( suStr1.getStr(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ //! LLA: some more tests with some high level strings
+
+ // void ascii_compareIgnoreAsciiCase_001()
+ // {
+ // rtl::OUString suStr1 = rtl::OUString::createFromAscii("change this to ascii upper case.");
+ // rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("CHANGE THIS TO ASCII UPPER CASE.");
+ //
+ // sal_uInt32 nLength = suStr1.getLength() * sizeof(sal_Unicode);
+ // sal_Unicode* pStr = (sal_Unicode*) malloc(nLength + sizeof(sal_Unicode)); // length + null terminator
+ // CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ // memset(pStr, 0, nLength + sizeof(sal_Unicode));
+ // memcpy(pStr, suStr1.getStr(), nLength);
+ //
+ // rtl_ustr_ascii_compareIgnoreAsciiCase( pStr );
+ // rtl::OUString suStr(pStr, suStr1.getLength());
+ //
+ // CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(suStr) == sal_True);
+ // free(pStr);
+ // }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(ascii_compareIgnoreAsciiCase);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_000);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_000_1);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_001);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_002);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_002_1);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ascii_compareIgnoreAsciiCase
+
+
+ // sample out of inc/rtl/ustring.hxx
+ // rtl_uString * pToken = NULL;
+ // sal_Int32 nIndex = 0;
+ // do
+ // {
+ // ...
+ // nIndex = rtl_uString_getToken(&pToken, pStr, 0, ';', nIndex);
+ // ...
+ // }
+ // while (nIndex >= 0);
+
+ class getToken : public CppUnit::TestFixture
+ {
+ public:
+
+ void getToken_000()
+ {
+ rtl_ustr_ascii_compareIgnoreAsciiCase( NULL, NULL);
+ // should not GPF
+ }
+
+ void ascii_compareIgnoreAsciiCase_000_1()
+ {
+ rtl::OUString aStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl_ustr_ascii_compareIgnoreAsciiCase( aStr1.getStr(), NULL);
+ // should not GPF
+ }
+ void ascii_compareIgnoreAsciiCase_001()
+ {
+ rtl::OUString suStr1;
+ rtl::OString sStr2;
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase( suStr1, sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_compareIgnoreAsciiCase_002()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must be equal.");
+ rtl::OString sStr2 = "Line must be equal.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase( suStr1.getStr(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal.", nValue == 0);
+ }
+
+ void ascii_compareIgnoreAsciiCase_002_1()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must be equal, when ignore case.");
+ rtl::OString sStr2 = "LINE MUST BE EQUAL, WHEN IGNORE CASE.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase( suStr1.getStr(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings are equal (if case insensitve).", nValue == 0);
+ }
+
+ void ascii_compareIgnoreAsciiCase_003()
+ {
+ rtl::OUString suStr1 = rtl::OUString::createFromAscii("Line must differ.");
+ rtl::OString sStr2 = "Line foo bar, ok, differ.";
+
+ sal_Int32 nValue = rtl_ustr_ascii_compareIgnoreAsciiCase( suStr1.getStr(), sStr2.getStr());
+ CPPUNIT_ASSERT_MESSAGE("compare failed, strings differ.", nValue != 0);
+ }
+
+ //! LLA: some more tests with some high level strings
+
+ // void ascii_compareIgnoreAsciiCase_001()
+ // {
+ // rtl::OUString suStr1 = rtl::OUString::createFromAscii("change this to ascii upper case.");
+ // rtl::OUString aShouldStr1 = rtl::OUString::createFromAscii("CHANGE THIS TO ASCII UPPER CASE.");
+ //
+ // sal_uInt32 nLength = suStr1.getLength() * sizeof(sal_Unicode);
+ // sal_Unicode* pStr = (sal_Unicode*) malloc(nLength + sizeof(sal_Unicode)); // length + null terminator
+ // CPPUNIT_ASSERT_MESSAGE("can't get memory for test", pStr != NULL);
+ // memset(pStr, 0, nLength + sizeof(sal_Unicode));
+ // memcpy(pStr, suStr1.getStr(), nLength);
+ //
+ // rtl_ustr_ascii_compareIgnoreAsciiCase( pStr );
+ // rtl::OUString suStr(pStr, suStr1.getLength());
+ //
+ // CPPUNIT_ASSERT_MESSAGE("failed", aShouldStr1.equals(suStr) == sal_True);
+ // free(pStr);
+ // }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(ascii_compareIgnoreAsciiCase);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_000);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_000_1);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_001);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_002);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_002_1);
+ CPPUNIT_TEST(ascii_compareIgnoreAsciiCase_003);
+ CPPUNIT_TEST_SUITE_END();
+ }; // class ascii_compareIgnoreAsciiCase
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::compare, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::compareIgnoreAsciiCase, "rtl_ustr");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::ascii_compare_WithLength, "rtl_ustr");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::shortenedCompareIgnoreAsciiCase_WithLength, "rtl_ustr");
+// CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::hashCode, "rtl_ustr");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::indexOfChar, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::lastIndexOfChar, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::indexOfStr, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::lastIndexOfStr, "rtl_ustr");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::replaceChar, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::replaceChar_WithLength, "rtl_ustr");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::toAsciiLowerCase, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::toAsciiLowerCase_WithLength, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::toAsciiUpperCase, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::toAsciiUpperCase_WithLength, "rtl_ustr");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::trim_WithLength, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::valueOfChar, "rtl_ustr");
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::ascii_compare, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::ascii_compareIgnoreAsciiCase, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::ascii_compareIgnoreAsciiCase_WithLength, "rtl_ustr");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_ustr::ascii_shortenedCompareIgnoreAsciiCase_WithLength, "rtl_ustr");
+
+} // namespace rtl_ustr
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
+
diff --git a/sal/qa/rtl/oustring/rtl_ustr.xsce b/sal/qa/rtl/oustring/rtl_ustr.xsce
new file mode 100644
index 000000000000..0c098eb83571
--- /dev/null
+++ b/sal/qa/rtl/oustring/rtl_ustr.xsce
@@ -0,0 +1,33 @@
+# functions which are gpf
+
+rtl_ustr.compare.compare_000
+rtl_ustr.compare.compare_000_1
+
+rtl_ustr.compareIgnoreAsciiCase.compare_000
+rtl_ustr.compareIgnoreAsciiCase.compare_000_1
+
+rtl_ustr.indexOfChar.indexOfChar_000
+
+rtl_ustr.lastIndexOfChar.lastIndexOfChar_000
+
+rtl_ustr.indexOfStr.indexOfStr_000
+
+rtl_ustr.lastIndexOfStr.lastIndexOfStr_000
+
+rtl_ustr.replaceChar.replaceChar_000
+
+rtl_ustr.replaceChar_WithLength.replaceChar_WithLength_000_1
+
+rtl_ustr.toAsciiLowerCase.toAsciiLowerCase_000
+
+rtl_ustr.toAsciiUpperCase.toAsciiUpperCase_000
+
+rtl_ustr.valueOfChar.valueOfChar_000
+
+rtl_ustr.ascii_compare.ascii_compare_000
+rtl_ustr.ascii_compare.ascii_compare_000_1
+rtl_ustr.ascii_compareIgnoreAsciiCase.ascii_compareIgnoreAsciiCase_000
+rtl_ustr.ascii_compareIgnoreAsciiCase.ascii_compareIgnoreAsciiCase_000_1
+rtl_ustr.ascii_compareIgnoreAsciiCase_WithLength.ascii_compareIgnoreAsciiCase_WithLength_000
+rtl_ustr.ascii_compareIgnoreAsciiCase_WithLength.ascii_compareIgnoreAsciiCase_WithLength_000_1
+
diff --git a/sal/qa/rtl/oustringbuffer/makefile.mk b/sal/qa/rtl/oustringbuffer/makefile.mk
new file mode 100644
index 000000000000..544f7b7df170
--- /dev/null
+++ b/sal/qa/rtl/oustringbuffer/makefile.mk
@@ -0,0 +1,70 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=rtl_oustringbuffer2
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:joblist by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_OUStringBuffer2.obj
+
+SHL1TARGET= rtl_OUStringBuffer2
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:joblist
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/oustringbuffer/rtl_OUStringBuffer2.cxx b/sal/qa/rtl/oustringbuffer/rtl_OUStringBuffer2.cxx
new file mode 100644
index 000000000000..b70ce5ae4bae
--- /dev/null
+++ b/sal/qa/rtl/oustringbuffer/rtl_OUStringBuffer2.cxx
@@ -0,0 +1,101 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <testshl/simpleheader.hxx>
+#include "stringhelper.hxx"
+#include <rtl/ustrbuf.hxx>
+#include <rtl/uri.hxx>
+
+namespace rtl_OUStringBuffer
+{
+
+
+class insertUtf32 : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void insertUtf32_001()
+ {
+ ::rtl::OUStringBuffer aUStrBuf(4);
+ aUStrBuf.insertUtf32(0,0x10ffff);
+
+ rtl::OUString suStr = aUStrBuf.makeStringAndClear();
+ rtl::OUString suStr2 = rtl::Uri::encode(suStr, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8);
+
+ rtl::OString sStr;
+ sStr <<= suStr2;
+ t_print("%s\n", sStr.getStr());
+
+ CPPUNIT_ASSERT_MESSAGE("Strings must be '%F4%8F%BF%BF'", sStr.equals(rtl::OString("%F4%8F%BF%BF")) == sal_True);
+ }
+
+ void insertUtf32_002()
+ {
+ ::rtl::OUStringBuffer aUStrBuf(4);
+ aUStrBuf.insertUtf32(0,0x41);
+ aUStrBuf.insertUtf32(1,0x42);
+ aUStrBuf.insertUtf32(2,0x43);
+
+ rtl::OUString suStr = aUStrBuf.makeStringAndClear();
+ rtl::OUString suStr2 = rtl::Uri::encode(suStr, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8);
+
+ rtl::OString sStr;
+ sStr <<= suStr2;
+ t_print("%s\n", sStr.getStr());
+
+ CPPUNIT_ASSERT_MESSAGE("Strings must be 'ABC'", sStr.equals(rtl::OString("ABC")) == sal_True);
+ }
+
+ CPPUNIT_TEST_SUITE(insertUtf32);
+ CPPUNIT_TEST(insertUtf32_001);
+ CPPUNIT_TEST(insertUtf32_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getToken
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_OUStringBuffer::insertUtf32, "rtl_OUStringBuffer");
+
+} // namespace rtl_OUStringBuffer
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
diff --git a/sal/qa/rtl/process/child_process.cxx b/sal/qa/rtl/process/child_process.cxx
new file mode 100644
index 000000000000..6264be018376
--- /dev/null
+++ b/sal/qa/rtl/process/child_process.cxx
@@ -0,0 +1,71 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <stdio.h>
+#include "sal/main.h"
+#include <rtl/process.h>
+#include <rtl_Process_Const.h>
+
+using namespace ::rtl;
+
+// ----------------------------------- Main -----------------------------------
+SAL_IMPLEMENT_MAIN_WITH_ARGS(, argv)
+{
+ printf("# %s is called.\n", argv[0]);
+
+ sal_Int32 nCount = rtl_getAppCommandArgCount();
+ if ( nCount != 4 )
+ {
+ printf(
+ "# not enough arguments found, need 4 found %ld.\n",
+ sal::static_int_cast< long >(nCount));
+ return 0;
+ }
+
+ OUString suArg[4];
+ for( sal_Int32 i = 0 ; i < nCount ; i ++ )
+ {
+ rtl_getAppCommandArg( i , &(suArg[i].pData) );
+ rtl::OString aString;
+ aString = ::rtl::OUStringToOString( suArg[i], RTL_TEXTENCODING_ASCII_US );
+ printf(
+ "# Parameter[%ld] is %s\n", sal::static_int_cast< long >(i),
+ aString.getStr());
+ }
+
+ if ( suArg[0].compareTo( suParam0) != 0 ||
+ suArg[1].compareTo( suParam1) != 0 ||
+ suArg[2].compareTo( suParam2) != 0 ||
+ suArg[3].compareTo( suParam3) != 0 )
+ {
+ return 0;
+ }
+ return 2;
+}
diff --git a/sal/qa/rtl/process/child_process_id.cxx b/sal/qa/rtl/process/child_process_id.cxx
new file mode 100644
index 000000000000..f859a4b814c9
--- /dev/null
+++ b/sal/qa/rtl/process/child_process_id.cxx
@@ -0,0 +1,63 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <stdio.h>
+#include "sal/main.h"
+#include <rtl/process.h>
+#include <rtl_Process_Const.h>
+
+void printUuid( sal_uInt8 *pNode )
+{
+ for( sal_Int32 i1 = 0 ; i1 < 4 ; i1++ )
+ {
+ for( sal_Int32 i2 = 0 ; i2 < 4 ; i2++ )
+ {
+ sal_uInt8 nValue = pNode[i1*4 +i2];
+ if (nValue < 16)
+ {
+ printf( "0");
+ }
+ printf( "%02x" ,nValue );
+ }
+ if( i1 == 3 )
+ break;
+ //printf( "-" );
+ }
+}
+
+// ----------------------------------- Main -----------------------------------
+
+SAL_IMPLEMENT_MAIN()
+{
+ sal_uInt8 pTargetUUID[16];
+ rtl_getGlobalProcessId( pTargetUUID );
+ printUuid( pTargetUUID );
+ return 1;
+}
diff --git a/sal/qa/rtl/process/makefile.mk b/sal/qa/rtl/process/makefile.mk
new file mode 100644
index 000000000000..5df9dc01504e
--- /dev/null
+++ b/sal/qa/rtl/process/makefile.mk
@@ -0,0 +1,93 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=rtl_Process
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:joblist by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_Process.obj
+
+SHL1TARGET= rtl_Process
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# END ------------------------------------------------------------------
+
+OBJ3FILES=$(OBJ)$/child_process.obj
+APP3TARGET=child_process
+APP3OBJS=$(OBJ3FILES)
+
+#.IF "$(GUI)" == "UNX"
+#APP3STDLIBS=$(LB)$/libsal.so
+#.ENDIF
+#.IF "$(GUI)" == "WNT"
+#APP3STDLIBS=$(KERNEL32LIB) $(LB)$/isal.lib
+#.ENDIF
+APP3STDLIBS=$(SALLIB)
+
+OBJ4FILES=$(OBJ)$/child_process_id.obj
+APP4TARGET=child_process_id
+APP4OBJS=$(OBJ4FILES)
+
+# .IF "$(GUI)" == "UNX"
+# APP4STDLIBS=$(LB)$/libsal.so
+# .ENDIF
+# .IF "$(GUI)" == "WNT"
+# APP4STDLIBS=$(KERNEL32LIB) $(LB)$/isal.lib
+# .ENDIF
+APP4STDLIBS=$(SALLIB)
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/process/rtl_Process.cxx b/sal/qa/rtl/process/rtl_Process.cxx
new file mode 100644
index 000000000000..8c712668e634
--- /dev/null
+++ b/sal/qa/rtl/process/rtl_Process.cxx
@@ -0,0 +1,296 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sal/types.h>
+
+#include <testshl/simpleheader.hxx>
+#include <rtl/ustring.hxx>
+#include <rtl/string.hxx>
+#include <rtl/process.h>
+#include <osl/process.h>
+#include <osl/module.hxx>
+
+#include "rtl_Process_Const.h"
+
+using namespace osl;
+using namespace rtl;
+
+/** print a UNI_CODE String. And also print some comments of the string.
+*/
+inline void printUString( const ::rtl::OUString & str, const sal_Char * msg = NULL )
+{
+ if ( msg != NULL )
+ {
+ t_print("#%s #printUString_u# ", msg );
+ }
+ rtl::OString aString;
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", (char *)aString.getStr( ) );
+}
+
+// -----------------------------------------------------------------------------
+inline ::rtl::OUString getModulePath( void )
+{
+ ::rtl::OUString suDirPath;
+ ::osl::Module::getUrlFromAddress(
+ reinterpret_cast< oslGenericFunction >(getModulePath), suDirPath );
+
+ printUString(suDirPath, "modulePath:");
+ suDirPath = suDirPath.copy( 0, suDirPath.lastIndexOf('/') );
+ suDirPath = suDirPath.copy( 0, suDirPath.lastIndexOf('/') + 1);
+ suDirPath += rtl::OUString::createFromAscii("bin");
+ return suDirPath;
+}
+
+// -----------------------------------------------------------------------------
+
+namespace rtl_Process
+{
+class getAppCommandArg : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void getAppCommandArg_001()
+ {
+#if defined(WNT) || defined(OS2)
+ const rtl::OUString EXECUTABLE_NAME = rtl::OUString::createFromAscii("child_process.exe");
+#else
+ const rtl::OUString EXECUTABLE_NAME = rtl::OUString::createFromAscii("child_process");
+#endif
+ rtl::OUString suCWD = getModulePath();
+ // rtl::OUString suCWD2 = getExecutableDirectory();
+
+ printUString(suCWD, "path to the current module");
+ // printUString(suCWD2, "suCWD2");
+
+ oslProcess hProcess = NULL;
+
+ const int nParameterCount = 4;
+ rtl_uString* pParameters[ nParameterCount ];
+
+ pParameters[0] = suParam0.pData;
+ pParameters[1] = suParam1.pData;
+ pParameters[2] = suParam2.pData;
+ pParameters[3] = suParam3.pData;
+
+ rtl::OUString suFileURL = suCWD;
+ suFileURL += rtl::OUString::createFromAscii("/");
+ suFileURL += EXECUTABLE_NAME;
+
+ oslProcessError osl_error = osl_executeProcess(
+ suFileURL.pData,
+ pParameters,
+ nParameterCount,
+ osl_Process_WAIT,
+ 0, /* osl_getCurrentSecurity() */
+ suCWD.pData,
+ NULL,
+ 0,
+ &hProcess );
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+ //we could get return value only after the process terminated
+ osl_joinProcess(hProcess);
+ // CPPUNIT_ASSERT_MESSAGE
+ // (
+ // "osl_joinProcess returned with failure",
+ // osl_Process_E_None == osl_error
+ // );
+ oslProcessInfo* pInfo = new oslProcessInfo;
+ //please pay attention to initial the Size to sizeof(oslProcessInfo), or else
+ //you will get unknow error when call osl_getProcessInfo
+ pInfo->Size = sizeof(oslProcessInfo);
+ osl_error = osl_getProcessInfo( hProcess, osl_Process_EXITCODE, pInfo );
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_getProcessInfo returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ t_print("the exit code is %d.\n", pInfo->Code );
+ CPPUNIT_ASSERT_MESSAGE("rtl_getAppCommandArg or rtl_getAppCommandArgCount error.", pInfo->Code == 2);
+ delete pInfo;
+ }
+
+
+ CPPUNIT_TEST_SUITE(getAppCommandArg);
+ CPPUNIT_TEST(getAppCommandArg_001);
+ // CPPUNIT_TEST(getAppCommandArg_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getAppCommandArg
+
+/************************************************************************
+ * For diagnostics( from sal/test/testuuid.cxx )
+ ************************************************************************/
+void printUuid( sal_uInt8 *pNode )
+{
+ printf("# UUID is: ");
+ for( sal_Int32 i1 = 0 ; i1 < 4 ; i1++ )
+ {
+ for( sal_Int32 i2 = 0 ; i2 < 4 ; i2++ )
+ {
+ sal_uInt8 nValue = pNode[i1*4 +i2];
+ if (nValue < 16)
+ {
+ printf( "0");
+ }
+ printf( "%02x" ,nValue );
+ }
+ if( i1 == 3 )
+ break;
+ printf( "-" );
+ }
+ printf("\n");
+}
+
+/**************************************************************************
+ * output UUID to a string
+ **************************************************************************/
+void printUuidtoBuffer( sal_uInt8 *pNode, sal_Char * pBuffer )
+{
+ sal_Int8 nPtr = 0;
+ for( sal_Int32 i1 = 0 ; i1 < 16 ; i1++ )
+ {
+ sal_uInt8 nValue = pNode[i1];
+ if (nValue < 16)
+ {
+ sprintf( (sal_Char *)(pBuffer + nPtr), "0");
+ nPtr++;
+ }
+ sprintf( (sal_Char *)(pBuffer + nPtr), "%02x", nValue );
+ nPtr += 2 ;
+ }
+}
+
+class getGlobalProcessId : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+ //gets a 16-byte fixed size identifier which is guaranteed not to change during the current process.
+ void getGlobalProcessId_001()
+ {
+ sal_uInt8 pTargetUUID1[16];
+ sal_uInt8 pTargetUUID2[16];
+ rtl_getGlobalProcessId( pTargetUUID1 );
+ rtl_getGlobalProcessId( pTargetUUID2 );
+ CPPUNIT_ASSERT_MESSAGE("getGlobalProcessId: got two same ProcessIds.", !memcmp( pTargetUUID1 , pTargetUUID2 , 16 ) );
+ }
+ //different processes different pids
+ void getGlobalProcessId_002()
+ {
+#if defined(WNT) || defined(OS2)
+ const rtl::OUString EXEC_NAME = rtl::OUString::createFromAscii("child_process_id.exe");
+#else
+ const rtl::OUString EXEC_NAME = rtl::OUString::createFromAscii("child_process_id");
+#endif
+ sal_uInt8 pTargetUUID1[16];
+ rtl_getGlobalProcessId( pTargetUUID1 );
+ printUuid( pTargetUUID1 );
+ sal_Char pUUID1[32];
+ printUuidtoBuffer( pTargetUUID1, pUUID1 );
+ printf("# UUID to String is %s\n", pUUID1);
+
+ rtl::OUString suCWD = getModulePath();
+ oslProcess hProcess = NULL;
+ rtl::OUString suFileURL = suCWD;
+ suFileURL += rtl::OUString::createFromAscii("/");
+ suFileURL += EXEC_NAME;
+ oslFileHandle* pChildOutputRead = new oslFileHandle();
+ oslProcessError osl_error = osl_executeProcess_WithRedirectedIO(
+ suFileURL.pData,
+ NULL,
+ 0,
+ osl_Process_WAIT,
+ 0,
+ suCWD.pData,
+ NULL,
+ 0,
+ &hProcess,
+ NULL,
+ pChildOutputRead,
+ NULL);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+ //we could get return value only after the process terminated
+ osl_joinProcess(hProcess);
+
+ sal_Char pUUID2[33];
+ pUUID2[32] = '\0';
+ sal_uInt64 nRead = 0;
+ osl_readFile( *pChildOutputRead, pUUID2, 32, &nRead );
+ t_print("read buffer is %s, nRead is %d \n", pUUID2, nRead );
+ OUString suUUID2 = OUString::createFromAscii( pUUID2 );
+ CPPUNIT_ASSERT_MESSAGE("getGlobalProcessId: got two same ProcessIds.", suUUID2.equalsAsciiL( pUUID1, 32) == sal_False );
+ }
+
+ CPPUNIT_TEST_SUITE(getGlobalProcessId);
+ CPPUNIT_TEST(getGlobalProcessId_001);
+ CPPUNIT_TEST(getGlobalProcessId_002);
+ CPPUNIT_TEST_SUITE_END();
+
+}; // class getGlobalProcessId
+
+} // namespace rtl_Process
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Process::getAppCommandArg, "rtl_Process");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Process::getGlobalProcessId, "rtl_Process");
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
diff --git a/sal/qa/rtl/process/rtl_Process_Const.h b/sal/qa/rtl/process/rtl_Process_Const.h
new file mode 100644
index 000000000000..a66d244a0cfe
--- /dev/null
+++ b/sal/qa/rtl/process/rtl_Process_Const.h
@@ -0,0 +1,26 @@
+
+#ifndef _RTL_PROCESS_CONST_H_
+#define _RTL_PROCESS_CONST_H_
+
+//------------------------------------------------------------------------
+#include <rtl/ustring.hxx>
+
+using namespace ::rtl;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+//------------------------------------------------------------------------
+//::rtl::OUString suParam[4];
+::rtl::OUString suParam0 = ::rtl::OUString::createFromAscii("-join");
+::rtl::OUString suParam1 = OUString::createFromAscii("-with");
+::rtl::OUString suParam2 = OUString::createFromAscii("-child");
+::rtl::OUString suParam3 = OUString::createFromAscii("-process");
+
+//------------------------------------------------------------------------
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RTL_PROCESS_CONST_H*/
diff --git a/sal/qa/rtl/random/makefile.add b/sal/qa/rtl/random/makefile.add
new file mode 100644
index 000000000000..eb45c312ed40
--- /dev/null
+++ b/sal/qa/rtl/random/makefile.add
@@ -0,0 +1,19 @@
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:job by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_random.obj
+
+SHL1TARGET= job
+SHL1STDLIBS=\
+ $(SALLIB) \
+ $(CPPUNITLIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= export.map
+# auto generated Target:job
+# END ------------------------------------------------------------------
+
diff --git a/sal/qa/rtl/random/makefile.mk b/sal/qa/rtl/random/makefile.mk
new file mode 100644
index 000000000000..ef8616a90916
--- /dev/null
+++ b/sal/qa/rtl/random/makefile.mk
@@ -0,0 +1,64 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_random
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:job by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_random.obj
+
+SHL1TARGET= rtl_Random
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:job
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/rtl/random/random.txt b/sal/qa/rtl/random/random.txt
new file mode 100644
index 000000000000..d7eb1f1b2311
--- /dev/null
+++ b/sal/qa/rtl/random/random.txt
@@ -0,0 +1,5 @@
+rtl_random.createPool.createPool_001
+rtl_random.destroyPool.destroyPool_001
+rtl_random.addBytes.addBytes_001
+rtl_random.getBytes.getBytes_001
+
diff --git a/sal/qa/rtl/random/rtl_random.cxx b/sal/qa/rtl/random/rtl_random.cxx
new file mode 100644
index 000000000000..47ff63e480c4
--- /dev/null
+++ b/sal/qa/rtl/random/rtl_random.cxx
@@ -0,0 +1,412 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// autogenerated file with codegen.pl
+
+#include <algorithm> // STL
+
+#include <testshl/simpleheader.hxx>
+#include <rtl/random.h>
+
+namespace rtl_random
+{
+
+class createPool : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ // this is only demonstration code
+ void createPool_001()
+ {
+ // this is demonstration code
+
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ // LLA: seems to be that an other test is not possible for createPool()
+ CPPUNIT_ASSERT_MESSAGE("create failed", aPool != NULL);
+
+ rtl_random_destroyPool(aPool);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(createPool);
+ CPPUNIT_TEST(createPool_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class createPool
+
+
+class destroyPool : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void destroyPool_000()
+ {
+ // GPF, if failed
+ rtl_random_destroyPool(NULL);
+ }
+
+ void destroyPool_001()
+ {
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ // LLA: seems to be that an other test is not possible for createPool()
+ CPPUNIT_ASSERT_MESSAGE("create failed", aPool != NULL);
+
+ rtl_random_destroyPool(aPool);
+ }
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(destroyPool);
+ CPPUNIT_TEST(destroyPool_000);
+ CPPUNIT_TEST(destroyPool_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class destroyPool
+
+
+class addBytes : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ // this is only demonstration code
+ void addBytes_000()
+ {
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ sal_uInt32 nBufLen = 4;
+ sal_uInt8 *pBuffer = new sal_uInt8[ nBufLen ];
+ memset(pBuffer, 0, nBufLen);
+
+ rtlRandomError aError = rtl_random_addBytes(NULL, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_Argument);
+
+ /* rtlRandomError */ aError = rtl_random_addBytes(aPool, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_Argument);
+
+ /* rtlRandomError */ aError = rtl_random_addBytes(aPool, pBuffer, nBufLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_None);
+
+ rtl_random_destroyPool(aPool);
+ delete [] pBuffer;
+
+ }
+
+ void addBytes_001()
+ {
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ sal_uInt32 nBufLen = 4;
+ sal_uInt8 *pBuffer = new sal_uInt8[ nBufLen ];
+
+ memset(pBuffer, 0, nBufLen);
+
+ rtl_random_addBytes(aPool, pBuffer, nBufLen);
+
+ t_print("%2x %2x %2x %2x\n", pBuffer[0], pBuffer[1], pBuffer[2], pBuffer[3]);
+
+ rtl_random_destroyPool(aPool);
+ delete [] pBuffer;
+ }
+
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(addBytes);
+ CPPUNIT_TEST(addBytes_000);
+ CPPUNIT_TEST(addBytes_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class addBytes
+
+
+class Statistics
+{
+ int m_nDispensation[256];
+
+ int m_nMin;
+ int m_nMax;
+ int m_nAverage;
+ int m_nMinDeviation;
+ int m_nMaxDeviation;
+
+public:
+ void clearDispensation()
+ {
+ for (int i = 0;i < 256;i ++) // clear array
+ {
+ m_nDispensation[i] = 0;
+ }
+ }
+ Statistics()
+ {
+ clearDispensation();
+ }
+ ~Statistics(){}
+
+ void addValue(sal_Int16 _nIndex, sal_Int32 _nValue)
+ {
+ OSL_ASSERT(_nIndex >= 0 && _nIndex < 256);
+ m_nDispensation[_nIndex] += _nValue;
+ }
+
+ void build(sal_Int32 _nCountMax)
+ {
+ m_nMin = _nCountMax;
+ m_nMax = 0;
+
+ m_nAverage = _nCountMax / 256;
+
+ m_nMinDeviation = _nCountMax;
+ m_nMaxDeviation = 0;
+
+ for (int i = 0;i < 256;i ++) // show dispensation
+ {
+ m_nMin = std::min(m_nMin, m_nDispensation[i]);
+ m_nMax = std::max(m_nMax, m_nDispensation[i]);
+
+ m_nMinDeviation = std::min(m_nMinDeviation, abs(m_nAverage - m_nDispensation[i]));
+ m_nMaxDeviation = std::max(m_nMaxDeviation, abs(m_nAverage - m_nDispensation[i]));
+ }
+ }
+
+ void print()
+ {
+ // LLA: these are only info values
+ t_print("\nSome statistics\n");
+ t_print("Min: %d\n", m_nMin);
+ t_print("Max: %d\n", m_nMax);
+ t_print("Average: %d\n", m_nAverage);
+ t_print("Min abs deviation: %d\n", m_nMinDeviation);
+ t_print("Max abs deviation: %d\n", m_nMaxDeviation);
+ }
+
+ sal_Int32 getAverage() {return m_nAverage;}
+ sal_Int32 getMaxDeviation() {return m_nMaxDeviation;}
+
+};
+
+class getBytes : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // insert your test code here.
+ void getBytes_000()
+ {
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ sal_uInt32 nBufLen = 4;
+ sal_uInt8 *pBuffer = new sal_uInt8[ nBufLen ];
+ memset(pBuffer, 0, nBufLen);
+
+ rtlRandomError aError = rtl_random_getBytes(NULL, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_Argument);
+
+ /* rtlRandomError */ aError = rtl_random_getBytes(aPool, NULL, 0);
+ CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_Argument);
+
+ /* rtlRandomError */ aError = rtl_random_getBytes(aPool, pBuffer, nBufLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_None);
+
+ rtl_random_destroyPool(aPool);
+ delete [] pBuffer;
+ }
+
+ void getBytes_001()
+ {
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ sal_uInt32 nBufLen = 4;
+ sal_uInt8 *pBuffer = new sal_uInt8[ nBufLen ];
+ memset(pBuffer, 0, nBufLen);
+
+ rtlRandomError aError = rtl_random_getBytes(aPool, pBuffer, nBufLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_None);
+
+ t_print("%2x %2x %2x %2x\n", pBuffer[0], pBuffer[1], pBuffer[2], pBuffer[3]);
+
+ rtl_random_destroyPool(aPool);
+ delete [] pBuffer;
+ }
+
+ void getBytes_002()
+ {
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ sal_uInt32 nBufLen = 4;
+ sal_uInt8 *pBuffer = new sal_uInt8[ nBufLen << 1 ];
+ memset(pBuffer, 0, nBufLen << 1);
+
+ CPPUNIT_ASSERT_MESSAGE("memset failed", pBuffer[4] == 0 && pBuffer[5] == 0 && pBuffer[6] == 0 && pBuffer[7] == 0);
+
+ rtlRandomError aError = rtl_random_getBytes(aPool, pBuffer, nBufLen);
+ CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_None);
+
+ t_print("%2x %2x %2x %2x %2x %2x %2x %2x\n", pBuffer[0], pBuffer[1], pBuffer[2], pBuffer[3], pBuffer[4], pBuffer[5], pBuffer[6], pBuffer[7]);
+
+ CPPUNIT_ASSERT_MESSAGE("internal memory overwrite", pBuffer[4] == 0 && pBuffer[5] == 0 && pBuffer[6] == 0 && pBuffer[7] == 0);
+
+ rtl_random_destroyPool(aPool);
+ delete [] pBuffer;
+ }
+
+ void getBytes_003()
+ {
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ sal_uInt32 nBufLen = 1;
+ sal_uInt8 *pBuffer = new sal_uInt8[ nBufLen ];
+ memset(pBuffer, 0, nBufLen);
+
+ Statistics aStat;
+
+ CPPUNIT_ASSERT_MESSAGE("memset failed", pBuffer[0] == 0);
+
+ int nCount = 0;
+
+ int nCountMax = 1000000;
+ for(nCount = 0;nCount < nCountMax; nCount ++) // run 100000000 through getBytes(...)
+ {
+ /* rtlRandomError aError = */ rtl_random_getBytes(aPool, pBuffer, nBufLen);
+ /* CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_None); */
+
+ aStat.addValue(pBuffer[0], 1);
+ }
+
+ aStat.build(nCountMax);
+ aStat.print();
+
+ CPPUNIT_ASSERT_MESSAGE("deviation should be less average", aStat.getMaxDeviation() < aStat.getAverage());
+
+ rtl_random_destroyPool(aPool);
+ delete [] pBuffer;
+ }
+
+ void getBytes_003_1()
+ {
+ rtlRandomPool aPool = rtl_random_createPool();
+
+ sal_uInt32 nBufLen = 256;
+ sal_uInt8 *pBuffer = new sal_uInt8[ nBufLen ];
+ memset(pBuffer, 0, nBufLen);
+
+ Statistics aStat;
+
+ CPPUNIT_ASSERT_MESSAGE("memset failed", pBuffer[0] == 0);
+
+ int nCount = 0;
+
+ int nCountMax = 10000;
+ for(nCount = 0;nCount < nCountMax; nCount ++) // run 100000000 through getBytes(...)
+ {
+ /* rtlRandomError aError = */ rtl_random_getBytes(aPool, pBuffer, nBufLen);
+ // CPPUNIT_ASSERT_MESSAGE("wrong parameter", aError == rtl_Random_E_None);
+
+ for (sal_uInt32 i=0;i<nBufLen;i++)
+ {
+ aStat.addValue(pBuffer[i], 1);
+ }
+ }
+
+ aStat.build(nCountMax * nBufLen);
+ aStat.print();
+
+ CPPUNIT_ASSERT_MESSAGE("deviation should be less average", aStat.getMaxDeviation() < aStat.getAverage());
+
+ rtl_random_destroyPool(aPool);
+ delete [] pBuffer;
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(getBytes);
+ CPPUNIT_TEST(getBytes_000);
+ CPPUNIT_TEST(getBytes_001);
+ CPPUNIT_TEST(getBytes_002);
+ CPPUNIT_TEST(getBytes_003);
+ CPPUNIT_TEST(getBytes_003_1);
+ CPPUNIT_TEST_SUITE_END();
+}; // class getBytes
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_random::createPool, "rtl_random");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_random::destroyPool, "rtl_random");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_random::addBytes, "rtl_random");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_random::getBytes, "rtl_random");
+} // namespace rtl_random
+
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
diff --git a/sal/qa/rtl/strings/makefile.mk b/sal/qa/rtl/strings/makefile.mk
new file mode 100644
index 000000000000..3c1b9219642f
--- /dev/null
+++ b/sal/qa/rtl/strings/makefile.mk
@@ -0,0 +1,55 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ := ..$/..$/..
+PRJNAME := sal
+
+TARGET := qa_rtl_strings
+
+ENABLE_EXCEPTIONS := TRUE
+
+.INCLUDE: settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+SHL1TARGET := $(TARGET)
+SHL1OBJS := \
+ $(SLO)$/test_oustringbuffer_utf32.obj \
+ $(SLO)$/test_oustring_compare.obj \
+ $(SLO)$/test_oustring_convert.obj \
+ $(SLO)$/test_oustring_endswith.obj \
+ $(SLO)$/test_oustring_noadditional.obj
+SHL1IMPLIB := i$(SHL1TARGET)
+SHL1STDLIBS := $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+SHL1VERSIONMAP := $(PRJ)$/qa$/export.map
+DEF1NAME := $(SHL1TARGET)
+
+.INCLUDE: target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/rtl/strings/test_oustring_compare.cxx b/sal/qa/rtl/strings/test_oustring_compare.cxx
new file mode 100644
index 000000000000..7a0455c92c16
--- /dev/null
+++ b/sal/qa/rtl/strings/test_oustring_compare.cxx
@@ -0,0 +1,67 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "testshl/simpleheader.hxx"
+#include "rtl/string.h"
+#include "rtl/ustring.hxx"
+
+namespace test { namespace oustring {
+
+class Compare: public CppUnit::TestFixture
+{
+private:
+ void equalsIgnoreAsciiCaseAscii();
+
+ CPPUNIT_TEST_SUITE(Compare);
+ CPPUNIT_TEST(equalsIgnoreAsciiCaseAscii);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+} }
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test::oustring::Compare, "alltest");
+
+void test::oustring::Compare::equalsIgnoreAsciiCaseAscii()
+{
+ CPPUNIT_ASSERT(!rtl::OUString().equalsIgnoreAsciiCaseAscii("abc"));
+ CPPUNIT_ASSERT(!rtl::OUString().equalsIgnoreAsciiCaseAsciiL(
+ RTL_CONSTASCII_STRINGPARAM("abc")));
+ CPPUNIT_ASSERT(!rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("abc")).
+ equalsIgnoreAsciiCaseAscii(""));
+ CPPUNIT_ASSERT(!rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("abc")).
+ equalsIgnoreAsciiCaseAsciiL(RTL_CONSTASCII_STRINGPARAM("")));
+
+ CPPUNIT_ASSERT(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("abc")).
+ equalsIgnoreAsciiCaseAscii("abc"));
+ CPPUNIT_ASSERT(!rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("abcd")).
+ equalsIgnoreAsciiCaseAscii("abc"));
+ CPPUNIT_ASSERT(!rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("abc")).
+ equalsIgnoreAsciiCaseAscii("abcd"));
+}
diff --git a/sal/qa/rtl/strings/test_oustring_convert.cxx b/sal/qa/rtl/strings/test_oustring_convert.cxx
new file mode 100644
index 000000000000..379aa47e33c5
--- /dev/null
+++ b/sal/qa/rtl/strings/test_oustring_convert.cxx
@@ -0,0 +1,184 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "testshl/simpleheader.hxx"
+#include "rtl/strbuf.hxx"
+#include "rtl/string.hxx"
+#include "rtl/ustring.hxx"
+
+namespace test { namespace oustring {
+
+class Convert: public CppUnit::TestFixture
+{
+private:
+ void convertToString();
+
+ CPPUNIT_TEST_SUITE(Convert);
+ CPPUNIT_TEST(convertToString);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+} }
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test::oustring::Convert, "alltest");
+
+namespace {
+
+struct TestConvertToString
+{
+ sal_Unicode aSource[100];
+ sal_Int32 nLength;
+ rtl_TextEncoding nEncoding;
+ sal_uInt32 nFlags;
+ char const * pStrict;
+ char const * pRelaxed;
+};
+
+void testConvertToString(TestConvertToString const & rTest)
+{
+ const rtl::OUString aSource(rTest.aSource, rTest.nLength);
+ rtl::OString aStrict(RTL_CONSTASCII_STRINGPARAM("12345"));
+ bool bSuccess = aSource.convertToString(&aStrict, rTest.nEncoding,
+ rTest.nFlags);
+ rtl::OString aRelaxed(rtl::OUStringToOString(aSource, rTest.nEncoding,
+ rTest.nFlags));
+
+ rtl::OStringBuffer aPrefix;
+ aPrefix.append(RTL_CONSTASCII_STRINGPARAM("{"));
+ for (sal_Int32 i = 0; i < rTest.nLength; ++i)
+ {
+ aPrefix.append(RTL_CONSTASCII_STRINGPARAM("U+"));
+ aPrefix.append(static_cast< sal_Int32 >(rTest.aSource[i]), 16);
+ if (i + 1 < rTest.nLength)
+ aPrefix.append(RTL_CONSTASCII_STRINGPARAM(","));
+ }
+ aPrefix.append(RTL_CONSTASCII_STRINGPARAM("}, "));
+ aPrefix.append(static_cast< sal_Int32 >(rTest.nEncoding));
+ aPrefix.append(RTL_CONSTASCII_STRINGPARAM(", 0x"));
+ aPrefix.append(static_cast< sal_Int32 >(rTest.nFlags), 16);
+ aPrefix.append(RTL_CONSTASCII_STRINGPARAM(" -> "));
+
+ if (bSuccess)
+ {
+ if (rTest.pStrict == 0 || !aStrict.equals(rTest.pStrict))
+ {
+ rtl::OStringBuffer aMessage(aPrefix);
+ aMessage.append(RTL_CONSTASCII_STRINGPARAM("strict = \""));
+ aMessage.append(aStrict);
+ aMessage.append(RTL_CONSTASCII_STRINGPARAM("\""));
+ CPPUNIT_ASSERT_MESSAGE(aMessage.getStr(), false);
+ }
+ }
+ else
+ {
+ if (!aStrict.equals(rtl::OString(RTL_CONSTASCII_STRINGPARAM("12345"))))
+ {
+ rtl::OStringBuffer aMessage(aPrefix);
+ aMessage.append(RTL_CONSTASCII_STRINGPARAM("modified output"));
+ CPPUNIT_ASSERT_MESSAGE(aMessage.getStr(), false);
+ }
+ if (rTest.pStrict != 0)
+ {
+ rtl::OStringBuffer aMessage(aPrefix);
+ aMessage.append(RTL_CONSTASCII_STRINGPARAM("failed"));
+ CPPUNIT_ASSERT_MESSAGE(aMessage.getStr(), false);
+ }
+ }
+ if (!aRelaxed.equals(rTest.pRelaxed))
+ {
+ rtl::OStringBuffer aMessage(aPrefix);
+ aMessage.append(RTL_CONSTASCII_STRINGPARAM("relaxed = \""));
+ aMessage.append(aRelaxed);
+ aMessage.append(RTL_CONSTASCII_STRINGPARAM("\""));
+ CPPUNIT_ASSERT_MESSAGE(aMessage.getStr(), false);
+ }
+}
+
+}
+
+void test::oustring::Convert::convertToString()
+{
+ TestConvertToString const aTests[]
+ = { { { 0 },
+ 0,
+ RTL_TEXTENCODING_ASCII_US,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR,
+ "",
+ "" },
+ { { 0 },
+ 0,
+ RTL_TEXTENCODING_ASCII_US,
+ OUSTRING_TO_OSTRING_CVTFLAGS,
+ "",
+ "" },
+ { { 0x0041,0x0042,0x0043 },
+ 3,
+ RTL_TEXTENCODING_ASCII_US,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR,
+ "ABC",
+ "ABC" },
+ { { 0x0041,0x0042,0x0043 },
+ 3,
+ RTL_TEXTENCODING_ASCII_US,
+ OUSTRING_TO_OSTRING_CVTFLAGS,
+ "ABC",
+ "ABC" },
+ { { 0xB800 },
+ 1,
+ RTL_TEXTENCODING_ISO_2022_JP,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR,
+ 0,
+ "" },
+ // the next also tests that a short source produces a long target:
+ { { 0xB800 },
+ 1,
+ RTL_TEXTENCODING_ISO_2022_JP,
+ OUSTRING_TO_OSTRING_CVTFLAGS,
+ "\x1B(B?",
+ "\x1B(B?" },
+ { { 0x0041,0x0100,0x0042 },
+ 3,
+ RTL_TEXTENCODING_ISO_8859_1,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR,
+ 0,
+ "A" },
+ { { 0x0041,0x0100,0x0042 },
+ 3,
+ RTL_TEXTENCODING_ISO_8859_1,
+ OUSTRING_TO_OSTRING_CVTFLAGS,
+ "A?B",
+ "A?B" } };
+ for (unsigned int i = 0; i < sizeof aTests / sizeof aTests[0]; ++i)
+ testConvertToString(aTests[i]);
+}
diff --git a/sal/qa/rtl/strings/test_oustring_endswith.cxx b/sal/qa/rtl/strings/test_oustring_endswith.cxx
new file mode 100644
index 000000000000..9011df782f3a
--- /dev/null
+++ b/sal/qa/rtl/strings/test_oustring_endswith.cxx
@@ -0,0 +1,121 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "testshl/simpleheader.hxx"
+#include "rtl/strbuf.hxx"
+#include "rtl/string.h"
+#include "rtl/string.hxx"
+#include "rtl/textenc.h"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+
+namespace test { namespace oustring {
+
+class EndsWith: public CppUnit::TestFixture
+{
+private:
+ void endsWith();
+
+ CPPUNIT_TEST_SUITE(EndsWith);
+ CPPUNIT_TEST(endsWith);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+} }
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test::oustring::EndsWith, "alltest");
+
+namespace {
+
+void appendString(rtl::OStringBuffer & buffer, rtl::OString const & string)
+{
+ buffer.append('"');
+ for (int i = 0; i < string.getLength(); ++i) {
+ char c = string[i];
+ if (c < ' ' || c == '"' || c == '\\' || c > '~') {
+ buffer.append('\\');
+ sal_Int32 n = static_cast< sal_Int32 >(
+ static_cast< unsigned char >(c));
+ if (n < 16) {
+ buffer.append('0');
+ }
+ buffer.append(n, 16);
+ } else {
+ buffer.append(c);
+ }
+ }
+ buffer.append('"');
+}
+
+}
+
+void test::oustring::EndsWith::endsWith()
+{
+ struct Data {
+ char const * str1;
+ sal_Int32 str1Len;
+ char const * str2;
+ sal_Int32 str2Len;
+ bool endsWith;
+ };
+ Data const data[] = {
+ { RTL_CONSTASCII_STRINGPARAM(""), RTL_CONSTASCII_STRINGPARAM(""),
+ true },
+ { RTL_CONSTASCII_STRINGPARAM("abc"), RTL_CONSTASCII_STRINGPARAM(""),
+ true },
+ { RTL_CONSTASCII_STRINGPARAM(""), RTL_CONSTASCII_STRINGPARAM("abc"),
+ false },
+ { RTL_CONSTASCII_STRINGPARAM("ABC"), RTL_CONSTASCII_STRINGPARAM("abc"),
+ true },
+ { RTL_CONSTASCII_STRINGPARAM("abcd"), RTL_CONSTASCII_STRINGPARAM("bcd"),
+ true },
+ { RTL_CONSTASCII_STRINGPARAM("bcd"), RTL_CONSTASCII_STRINGPARAM("abcd"),
+ false },
+ { RTL_CONSTASCII_STRINGPARAM("a\0b\0c"),
+ RTL_CONSTASCII_STRINGPARAM("b\0c"), true },
+ { RTL_CONSTASCII_STRINGPARAM("a\0b\0c"),
+ RTL_CONSTASCII_STRINGPARAM("b"), false } };
+ for (int i = 0; i < sizeof data / sizeof data[0]; ++i) {
+ rtl::OStringBuffer msg;
+ appendString(msg, rtl::OString(data[i].str1, data[i].str1Len));
+ msg.append(
+ RTL_CONSTASCII_STRINGPARAM(".endsWithIgnoreAsciiCaseAsciiL("));
+ appendString(msg, rtl::OString(data[i].str2, data[i].str2Len));
+ msg.append(RTL_CONSTASCII_STRINGPARAM(") == "));
+ msg.append(static_cast< sal_Bool >(data[i].endsWith));
+ CPPUNIT_ASSERT_MESSAGE(
+ msg.getStr(),
+ rtl::OUString(
+ data[i].str1, data[i].str1Len,
+ RTL_TEXTENCODING_ASCII_US).endsWithIgnoreAsciiCaseAsciiL(
+ data[i].str2, data[i].str2Len)
+ == data[i].endsWith);
+ }
+}
diff --git a/sal/qa/rtl/strings/test_oustring_noadditional.cxx b/sal/qa/rtl/strings/test_oustring_noadditional.cxx
new file mode 100644
index 000000000000..7208e8da36ae
--- /dev/null
+++ b/sal/qa/rtl/strings/test_oustring_noadditional.cxx
@@ -0,0 +1,33 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "testshl/simpleheader.hxx"
+
+NOADDITIONAL;
diff --git a/sal/qa/rtl/strings/test_oustringbuffer_utf32.cxx b/sal/qa/rtl/strings/test_oustringbuffer_utf32.cxx
new file mode 100644
index 000000000000..4ec593f54edd
--- /dev/null
+++ b/sal/qa/rtl/strings/test_oustringbuffer_utf32.cxx
@@ -0,0 +1,130 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "testshl/simpleheader.hxx"
+#include "rtl/ustrbuf.hxx"
+#include "rtl/ustring.h"
+#include "rtl/ustring.hxx"
+
+namespace test { namespace oustringbuffer {
+
+class Utf32: public CppUnit::TestFixture {
+private:
+ void appendUtf32();
+
+ void insertUtf32();
+
+ CPPUNIT_TEST_SUITE(Utf32);
+ CPPUNIT_TEST(appendUtf32);
+ CPPUNIT_TEST(insertUtf32);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+} }
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test::oustringbuffer::Utf32, "alltest");
+
+namespace {
+
+void appendString(rtl::OUStringBuffer & buffer, rtl::OUString const & string) {
+ buffer.append(static_cast< sal_Unicode >('"'));
+ for (int i = 0; i < string.getLength(); ++i) {
+ buffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("\\u"));
+ sal_Unicode c = string[i];
+ if (c < 0x1000) {
+ buffer.append(static_cast< sal_Unicode >('0'));
+ if (c < 0x100) {
+ buffer.append(static_cast< sal_Unicode >('0'));
+ if (c < 0x10) {
+ buffer.append(static_cast< sal_Unicode >('0'));
+ }
+ }
+ }
+ buffer.append(
+ static_cast< sal_Int32 >(c), static_cast< sal_Int16 >(16));
+ }
+ buffer.append(static_cast< sal_Unicode >('"'));
+}
+
+void createMessage(
+ rtl::OUStringBuffer & message, rtl::OUString const & string1,
+ rtl::OUString const & string2)
+{
+ message.setLength(0);
+ appendString(message, string1);
+ message.appendAscii(RTL_CONSTASCII_STRINGPARAM(" vs. "));
+ appendString(message, string2);
+}
+
+}
+
+void test::oustringbuffer::Utf32::appendUtf32() {
+ int const str1Len = 3;
+ sal_Unicode const str1[str1Len] = { 'a', 'b', 'c' };
+ int const str2Len = 4;
+ sal_Unicode const str2[str2Len] = { 'a', 'b', 'c', 'd' };
+ int const str3Len = 6;
+ sal_Unicode const str3[str3Len] = { 'a', 'b', 'c', 'd', 0xD800, 0xDC00 };
+ rtl::OUStringBuffer message;
+ rtl::OUStringBuffer buf1(rtl::OUString(str1, str1Len));
+ buf1.appendUtf32('d');
+ rtl::OUString res1(buf1.makeStringAndClear());
+ createMessage(message, res1, rtl::OUString(str2, str2Len));
+ CPPUNIT_ASSERT_MESSAGE(
+ message.getStr(), res1 == rtl::OUString(str2, str2Len));
+ rtl::OUStringBuffer buf2(rtl::OUString(str2, str2Len));
+ buf2.appendUtf32(0x10000);
+ rtl::OUString res2(buf2.makeStringAndClear());
+ createMessage(message, res2, rtl::OUString(str3, str3Len));
+ CPPUNIT_ASSERT_MESSAGE(
+ message.getStr(), res2 == rtl::OUString(str3, str3Len));
+}
+
+void test::oustringbuffer::Utf32::insertUtf32() {
+ int const str1Len = 3;
+ sal_Unicode const str1[str1Len] = { 'a', 'b', 'c' };
+ int const str2Len = 4;
+ sal_Unicode const str2[str2Len] = { 'a', 'b', 'd', 'c' };
+ int const str3Len = 6;
+ sal_Unicode const str3[str3Len] = { 'a', 'b', 0xDBFF, 0xDFFF, 'd', 'c' };
+ rtl::OUStringBuffer message;
+ rtl::OUStringBuffer buf1(rtl::OUString(str1, str1Len));
+ buf1.insertUtf32(2, 'd');
+ rtl::OUString res1(buf1.makeStringAndClear());
+ createMessage(message, res1, rtl::OUString(str2, str2Len));
+ CPPUNIT_ASSERT_MESSAGE(
+ message.getStr(), res1 == rtl::OUString(str2, str2Len));
+ rtl::OUStringBuffer buf2(rtl::OUString(str2, str2Len));
+ buf2.insertUtf32(2, 0x10FFFF);
+ rtl::OUString res2(buf2.makeStringAndClear());
+ createMessage(message, res2, rtl::OUString(str3, str3Len));
+ CPPUNIT_ASSERT_MESSAGE(
+ message.getStr(), res2 == rtl::OUString(str3, str3Len));
+}
diff --git a/sal/qa/rtl/textenc/makefile.mk b/sal/qa/rtl/textenc/makefile.mk
new file mode 100644
index 000000000000..597309d9bfe6
--- /dev/null
+++ b/sal/qa/rtl/textenc/makefile.mk
@@ -0,0 +1,75 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_textenc
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# --- BEGIN --------------------------------------------------------
+SHL1OBJS= \
+ $(SLO)$/rtl_textcvt.obj
+SHL1TARGET= rtl_textcvt
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END --------------------------------------------------------------
+
+# --- BEGIN --------------------------------------------------------
+SHL2OBJS= \
+ $(SLO)$/rtl_tencinfo.obj
+SHL2TARGET= rtl_tencinfo
+SHL2STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL2IMPLIB= i$(SHL2TARGET)
+DEF2NAME =$(SHL2TARGET)
+SHL2VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END --------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/rtl/textenc/rtl_tencinfo.cxx b/sal/qa/rtl/textenc/rtl_tencinfo.cxx
new file mode 100644
index 000000000000..d3577faedc4d
--- /dev/null
+++ b/sal/qa/rtl/textenc/rtl_tencinfo.cxx
@@ -0,0 +1,1901 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <string.h>
+
+#include <osl/thread.h>
+#include <rtl/tencinfo.h>
+
+#include <testshl/simpleheader.hxx>
+
+// -----------------------------------------------------------------------------
+
+namespace rtl_tencinfo
+{
+ class getBestMime : public CppUnit::TestFixture
+ {
+ public:
+ void setUp()
+ {
+ }
+
+ void check( const sal_Char* _pRTL_TEXTENCODING, rtl_TextEncoding _aCurrentEncode )
+ {
+ const sal_Char *pCharSet = rtl_getBestMimeCharsetFromTextEncoding( _aCurrentEncode );
+ if (pCharSet == 0)
+ {
+ t_print("rtl_getBestMimeCharsetFromTextEncoding(%s) (%d) doesn't seem to exist.\n\n", _pRTL_TEXTENCODING, _aCurrentEncode);
+ }
+ else
+ {
+ t_print(T_VERBOSE, "'%s' is charset: '%s'\n", _pRTL_TEXTENCODING, pCharSet);
+
+ rtl_TextEncoding eTextEnc = rtl_getTextEncodingFromMimeCharset( pCharSet );
+ if (_aCurrentEncode != eTextEnc &&
+ eTextEnc != RTL_TEXTENCODING_DONTKNOW)
+ {
+ t_print("rtl_getBestMimeCharsetFromTextEncoding(%s) is charset: %s\n", _pRTL_TEXTENCODING, pCharSet);
+ t_print("rtl_getTextEncodingFromMimeCharset() differ: %s %d -> %d\n\n", _pRTL_TEXTENCODING, _aCurrentEncode, eTextEnc );
+ }
+ // rtl::OString sError = "getTextEncodingFromMimeCharset(";
+ // sError += pCharSet;
+ // sError += ") returns null";
+ // CPPUNIT_ASSERT_MESSAGE(sError.getStr(), eTextEnc != RTL_TEXTENCODING_DONTKNOW);
+ // CPPUNIT_ASSERT_MESSAGE("Does not realize itself", _aCurrentEncode == eTextEnc );
+ }
+ }
+
+// the defines for the follows test could be found in file inc/rtl/textenc.h
+
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1252()
+ {
+ check( "RTL_TEXTENCODING_MS_1252", RTL_TEXTENCODING_MS_1252 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_ROMAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ROMAN", RTL_TEXTENCODING_APPLE_ROMAN );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_437()
+ {
+ check( "RTL_TEXTENCODING_IBM_437", RTL_TEXTENCODING_IBM_437 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_850()
+ {
+ check( "RTL_TEXTENCODING_IBM_850", RTL_TEXTENCODING_IBM_850 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_860()
+ {
+ check( "RTL_TEXTENCODING_IBM_860", RTL_TEXTENCODING_IBM_860 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_861()
+ {
+ check( "RTL_TEXTENCODING_IBM_861", RTL_TEXTENCODING_IBM_861 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_863()
+ {
+ check( "RTL_TEXTENCODING_IBM_863", RTL_TEXTENCODING_IBM_863 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_865()
+ {
+ check( "RTL_TEXTENCODING_IBM_865", RTL_TEXTENCODING_IBM_865 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_SYMBOL()
+ {
+ check( "RTL_TEXTENCODING_SYMBOL", RTL_TEXTENCODING_SYMBOL );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ASCII_US()
+ {
+ check( "RTL_TEXTENCODING_ASCII_US", RTL_TEXTENCODING_ASCII_US );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_1()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_1", RTL_TEXTENCODING_ISO_8859_1 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_2()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_2", RTL_TEXTENCODING_ISO_8859_2 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_3()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_3", RTL_TEXTENCODING_ISO_8859_3 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_4()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_4", RTL_TEXTENCODING_ISO_8859_4 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_5()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_5", RTL_TEXTENCODING_ISO_8859_5 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_6()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_6", RTL_TEXTENCODING_ISO_8859_6 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_7()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_7", RTL_TEXTENCODING_ISO_8859_7 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_8()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_8", RTL_TEXTENCODING_ISO_8859_8 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_9()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_9", RTL_TEXTENCODING_ISO_8859_9 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_14()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_14", RTL_TEXTENCODING_ISO_8859_14 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_15()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_15", RTL_TEXTENCODING_ISO_8859_15 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_737()
+ {
+ check( "RTL_TEXTENCODING_IBM_737", RTL_TEXTENCODING_IBM_737 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_775()
+ {
+ check( "RTL_TEXTENCODING_IBM_775", RTL_TEXTENCODING_IBM_775 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_852()
+ {
+ check( "RTL_TEXTENCODING_IBM_852", RTL_TEXTENCODING_IBM_852 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_855()
+ {
+ check( "RTL_TEXTENCODING_IBM_855", RTL_TEXTENCODING_IBM_855 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_857()
+ {
+ check( "RTL_TEXTENCODING_IBM_857", RTL_TEXTENCODING_IBM_857 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_862()
+ {
+ check( "RTL_TEXTENCODING_IBM_862", RTL_TEXTENCODING_IBM_862 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_864()
+ {
+ check( "RTL_TEXTENCODING_IBM_864", RTL_TEXTENCODING_IBM_864 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_866()
+ {
+ check( "RTL_TEXTENCODING_IBM_866", RTL_TEXTENCODING_IBM_866 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_IBM_869()
+ {
+ check( "RTL_TEXTENCODING_IBM_869", RTL_TEXTENCODING_IBM_869 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_874()
+ {
+ check( "RTL_TEXTENCODING_MS_874", RTL_TEXTENCODING_MS_874 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1250()
+ {
+ check( "RTL_TEXTENCODING_MS_1250", RTL_TEXTENCODING_MS_1250 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1251()
+ {
+ check( "RTL_TEXTENCODING_MS_1251", RTL_TEXTENCODING_MS_1251 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1253()
+ {
+ check( "RTL_TEXTENCODING_MS_1253", RTL_TEXTENCODING_MS_1253 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1254()
+ {
+ check( "RTL_TEXTENCODING_MS_1254", RTL_TEXTENCODING_MS_1254 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1255()
+ {
+ check( "RTL_TEXTENCODING_MS_1255", RTL_TEXTENCODING_MS_1255 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1256()
+ {
+ check( "RTL_TEXTENCODING_MS_1256", RTL_TEXTENCODING_MS_1256 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1257()
+ {
+ check( "RTL_TEXTENCODING_MS_1257", RTL_TEXTENCODING_MS_1257 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1258()
+ {
+ check( "RTL_TEXTENCODING_MS_1258", RTL_TEXTENCODING_MS_1258 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_ARABIC()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ARABIC", RTL_TEXTENCODING_APPLE_ARABIC );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_CENTEURO()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CENTEURO", RTL_TEXTENCODING_APPLE_CENTEURO );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_CROATIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CROATIAN", RTL_TEXTENCODING_APPLE_CROATIAN );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_CYRILLIC()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CYRILLIC", RTL_TEXTENCODING_APPLE_CYRILLIC );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_DEVANAGARI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_DEVANAGARI", RTL_TEXTENCODING_APPLE_DEVANAGARI );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_FARSI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_FARSI", RTL_TEXTENCODING_APPLE_FARSI );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_GREEK()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GREEK", RTL_TEXTENCODING_APPLE_GREEK );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_GUJARATI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GUJARATI", RTL_TEXTENCODING_APPLE_GUJARATI );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_GURMUKHI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GURMUKHI", RTL_TEXTENCODING_APPLE_GURMUKHI );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_HEBREW()
+ {
+ check( "RTL_TEXTENCODING_APPLE_HEBREW", RTL_TEXTENCODING_APPLE_HEBREW );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_ICELAND()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ICELAND", RTL_TEXTENCODING_APPLE_ICELAND );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_ROMANIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ROMANIAN", RTL_TEXTENCODING_APPLE_ROMANIAN );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_THAI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_THAI", RTL_TEXTENCODING_APPLE_THAI );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_TURKISH()
+ {
+ check( "RTL_TEXTENCODING_APPLE_TURKISH", RTL_TEXTENCODING_APPLE_TURKISH );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_UKRAINIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_UKRAINIAN", RTL_TEXTENCODING_APPLE_UKRAINIAN );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_CHINSIMP()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CHINSIMP", RTL_TEXTENCODING_APPLE_CHINSIMP );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_CHINTRAD()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CHINTRAD", RTL_TEXTENCODING_APPLE_CHINTRAD );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_JAPANESE()
+ {
+ check( "RTL_TEXTENCODING_APPLE_JAPANESE", RTL_TEXTENCODING_APPLE_JAPANESE );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_APPLE_KOREAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_KOREAN", RTL_TEXTENCODING_APPLE_KOREAN );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_932()
+ {
+ check( "RTL_TEXTENCODING_MS_932", RTL_TEXTENCODING_MS_932 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_936()
+ {
+ check( "RTL_TEXTENCODING_MS_936", RTL_TEXTENCODING_MS_936 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_949()
+ {
+ check( "RTL_TEXTENCODING_MS_949", RTL_TEXTENCODING_MS_949 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_950()
+ {
+ check( "RTL_TEXTENCODING_MS_950", RTL_TEXTENCODING_MS_950 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_SHIFT_JIS()
+ {
+ check( "RTL_TEXTENCODING_SHIFT_JIS", RTL_TEXTENCODING_SHIFT_JIS );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_GB_2312()
+ {
+ check( "RTL_TEXTENCODING_GB_2312", RTL_TEXTENCODING_GB_2312 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_GBT_12345()
+ {
+ check( "RTL_TEXTENCODING_GBT_12345", RTL_TEXTENCODING_GBT_12345 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_GBK()
+ {
+ check( "RTL_TEXTENCODING_GBK", RTL_TEXTENCODING_GBK );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_BIG5()
+ {
+ check( "RTL_TEXTENCODING_BIG5", RTL_TEXTENCODING_BIG5 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_EUC_JP()
+ {
+ check( "RTL_TEXTENCODING_EUC_JP", RTL_TEXTENCODING_EUC_JP );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_EUC_CN()
+ {
+ check( "RTL_TEXTENCODING_EUC_CN", RTL_TEXTENCODING_EUC_CN );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_EUC_TW()
+ {
+ check( "RTL_TEXTENCODING_EUC_TW", RTL_TEXTENCODING_EUC_TW );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_2022_JP()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_JP", RTL_TEXTENCODING_ISO_2022_JP );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_2022_CN()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_CN", RTL_TEXTENCODING_ISO_2022_CN );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_KOI8_R()
+ {
+ check( "RTL_TEXTENCODING_KOI8_R", RTL_TEXTENCODING_KOI8_R );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_UTF7()
+ {
+ check( "RTL_TEXTENCODING_UTF7", RTL_TEXTENCODING_UTF7 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_UTF8()
+ {
+ check( "RTL_TEXTENCODING_UTF8", RTL_TEXTENCODING_UTF8 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_10()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_10", RTL_TEXTENCODING_ISO_8859_10 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_8859_13()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_13", RTL_TEXTENCODING_ISO_8859_13 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_EUC_KR()
+ {
+ check( "RTL_TEXTENCODING_EUC_KR", RTL_TEXTENCODING_EUC_KR );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISO_2022_KR()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_KR", RTL_TEXTENCODING_ISO_2022_KR );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_JIS_X_0201()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0201", RTL_TEXTENCODING_JIS_X_0201 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_JIS_X_0208()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0208", RTL_TEXTENCODING_JIS_X_0208 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_JIS_X_0212()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0212", RTL_TEXTENCODING_JIS_X_0212 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_MS_1361()
+ {
+ check( "RTL_TEXTENCODING_MS_1361", RTL_TEXTENCODING_MS_1361 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_GB_18030()
+ {
+ check( "RTL_TEXTENCODING_GB_18030", RTL_TEXTENCODING_GB_18030 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_BIG5_HKSCS()
+ {
+ check( "RTL_TEXTENCODING_BIG5_HKSCS", RTL_TEXTENCODING_BIG5_HKSCS );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_TIS_620()
+ {
+ check( "RTL_TEXTENCODING_TIS_620", RTL_TEXTENCODING_TIS_620 );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_KOI8_U()
+ {
+ check( "RTL_TEXTENCODING_KOI8_U", RTL_TEXTENCODING_KOI8_U );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_ISCII_DEVANAGARI()
+ {
+ check( "RTL_TEXTENCODING_ISCII_DEVANAGARI", RTL_TEXTENCODING_ISCII_DEVANAGARI );
+ }
+ // ----------------------------------------
+ void MimeCharsetFromTextEncoding_JAVA_UTF8()
+ {
+ check( "RTL_TEXTENCODING_JAVA_UTF8", RTL_TEXTENCODING_JAVA_UTF8 );
+ }
+
+/* ATTENTION! Whenever some encoding is added here, make sure to update
+ * rtl_isOctetEncoding in tencinfo.c.
+ */
+
+// RTL_TEXTENCODING_USER_START
+// RTL_TEXTENCODING_USER_END
+
+// check( "RTL_TEXTENCODING_UCS4", RTL_TEXTENCODING_UCS4 );
+// check( "RTL_TEXTENCODING_UCS2", RTL_TEXTENCODING_UCS2 );
+// check( "RTL_TEXTENCODING_UNICODE", RTL_TEXTENCODING_UNICODE /* RTL_TEXTENCODING_UCS2 */ );
+
+ CPPUNIT_TEST_SUITE( getBestMime );
+
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1252 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_ROMAN );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_437 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_850 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_860 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_861 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_863 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_865 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_SYMBOL );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ASCII_US );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_1 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_2 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_3 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_4 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_5 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_6 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_7 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_8 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_9 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_14 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_15 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_737 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_775 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_852 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_855 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_857 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_862 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_864 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_866 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_IBM_869 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_874 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1250 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1251 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1253 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1254 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1255 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1256 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1257 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1258 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_ARABIC );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_CENTEURO );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_CROATIAN );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_CYRILLIC );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_DEVANAGARI );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_FARSI );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_GREEK );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_GUJARATI );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_GURMUKHI );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_HEBREW );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_ICELAND );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_ROMANIAN );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_THAI );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_TURKISH );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_UKRAINIAN );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_CHINSIMP );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_CHINTRAD );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_JAPANESE );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_APPLE_KOREAN );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_932 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_936 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_949 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_950 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_SHIFT_JIS );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_GB_2312 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_GBT_12345 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_GBK );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_BIG5 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_EUC_JP );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_EUC_CN );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_EUC_TW );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_2022_JP );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_2022_CN );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_KOI8_R );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_UTF7 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_UTF8 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_10 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_8859_13 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_EUC_KR );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISO_2022_KR );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_JIS_X_0201 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_JIS_X_0208 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_JIS_X_0212 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_MS_1361 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_GB_18030 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_BIG5_HKSCS );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_TIS_620 );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_KOI8_U );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_ISCII_DEVANAGARI );
+ CPPUNIT_TEST( MimeCharsetFromTextEncoding_JAVA_UTF8 );
+
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+ // -----------------------------------------------------------------------------
+
+ class getBestUnix : public CppUnit::TestFixture
+ {
+ public:
+ void setUp()
+ {
+ }
+
+ void check( const sal_Char* _pRTL_TEXTENCODING, rtl_TextEncoding _aCurrentEncode )
+ {
+ const sal_Char *pCharSet = rtl_getBestUnixCharsetFromTextEncoding( _aCurrentEncode );
+ if (pCharSet == 0)
+ {
+ t_print("rtl_getBestUnixCharsetFromTextEncoding(%s) (%d) doesn't seem to exist.\n\n", _pRTL_TEXTENCODING, _aCurrentEncode);
+ }
+ else
+ {
+ t_print(T_VERBOSE, "'%s' is charset: '%s'\n", _pRTL_TEXTENCODING, pCharSet);
+
+ rtl_TextEncoding eTextEnc = rtl_getTextEncodingFromUnixCharset( pCharSet );
+ if (_aCurrentEncode != eTextEnc &&
+ eTextEnc != RTL_TEXTENCODING_DONTKNOW)
+ {
+ t_print("rtl_getBestUnixCharsetFromTextEncoding(%s) is charset: %s\n", _pRTL_TEXTENCODING, pCharSet);
+ t_print("rtl_getTextEncodingFromUnixCharset() differ: %s %d -> %d\n\n", _pRTL_TEXTENCODING, _aCurrentEncode, eTextEnc );
+ }
+ // rtl::OString sError = "getTextEncodingFromUnixCharset(";
+ // sError += pCharSet;
+ // sError += ") returns null";
+ // CPPUNIT_ASSERT_MESSAGE(sError.getStr(), eTextEnc != RTL_TEXTENCODING_DONTKNOW);
+ // CPPUNIT_ASSERT_MESSAGE("Does not realize itself", _aCurrentEncode == eTextEnc );
+ }
+ }
+
+
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1252()
+ {
+ check( "RTL_TEXTENCODING_MS_1252", RTL_TEXTENCODING_MS_1252 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_ROMAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ROMAN", RTL_TEXTENCODING_APPLE_ROMAN );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_437()
+ {
+ check( "RTL_TEXTENCODING_IBM_437", RTL_TEXTENCODING_IBM_437 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_850()
+ {
+ check( "RTL_TEXTENCODING_IBM_850", RTL_TEXTENCODING_IBM_850 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_860()
+ {
+ check( "RTL_TEXTENCODING_IBM_860", RTL_TEXTENCODING_IBM_860 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_861()
+ {
+ check( "RTL_TEXTENCODING_IBM_861", RTL_TEXTENCODING_IBM_861 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_863()
+ {
+ check( "RTL_TEXTENCODING_IBM_863", RTL_TEXTENCODING_IBM_863 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_865()
+ {
+ check( "RTL_TEXTENCODING_IBM_865", RTL_TEXTENCODING_IBM_865 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_SYMBOL()
+ {
+ check( "RTL_TEXTENCODING_SYMBOL", RTL_TEXTENCODING_SYMBOL );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ASCII_US()
+ {
+ check( "RTL_TEXTENCODING_ASCII_US", RTL_TEXTENCODING_ASCII_US );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_1()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_1", RTL_TEXTENCODING_ISO_8859_1 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_2()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_2", RTL_TEXTENCODING_ISO_8859_2 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_3()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_3", RTL_TEXTENCODING_ISO_8859_3 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_4()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_4", RTL_TEXTENCODING_ISO_8859_4 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_5()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_5", RTL_TEXTENCODING_ISO_8859_5 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_6()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_6", RTL_TEXTENCODING_ISO_8859_6 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_7()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_7", RTL_TEXTENCODING_ISO_8859_7 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_8()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_8", RTL_TEXTENCODING_ISO_8859_8 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_9()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_9", RTL_TEXTENCODING_ISO_8859_9 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_14()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_14", RTL_TEXTENCODING_ISO_8859_14 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_15()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_15", RTL_TEXTENCODING_ISO_8859_15 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_737()
+ {
+ check( "RTL_TEXTENCODING_IBM_737", RTL_TEXTENCODING_IBM_737 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_775()
+ {
+ check( "RTL_TEXTENCODING_IBM_775", RTL_TEXTENCODING_IBM_775 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_852()
+ {
+ check( "RTL_TEXTENCODING_IBM_852", RTL_TEXTENCODING_IBM_852 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_855()
+ {
+ check( "RTL_TEXTENCODING_IBM_855", RTL_TEXTENCODING_IBM_855 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_857()
+ {
+ check( "RTL_TEXTENCODING_IBM_857", RTL_TEXTENCODING_IBM_857 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_862()
+ {
+ check( "RTL_TEXTENCODING_IBM_862", RTL_TEXTENCODING_IBM_862 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_864()
+ {
+ check( "RTL_TEXTENCODING_IBM_864", RTL_TEXTENCODING_IBM_864 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_866()
+ {
+ check( "RTL_TEXTENCODING_IBM_866", RTL_TEXTENCODING_IBM_866 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_IBM_869()
+ {
+ check( "RTL_TEXTENCODING_IBM_869", RTL_TEXTENCODING_IBM_869 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_874()
+ {
+ check( "RTL_TEXTENCODING_MS_874", RTL_TEXTENCODING_MS_874 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1250()
+ {
+ check( "RTL_TEXTENCODING_MS_1250", RTL_TEXTENCODING_MS_1250 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1251()
+ {
+ check( "RTL_TEXTENCODING_MS_1251", RTL_TEXTENCODING_MS_1251 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1253()
+ {
+ check( "RTL_TEXTENCODING_MS_1253", RTL_TEXTENCODING_MS_1253 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1254()
+ {
+ check( "RTL_TEXTENCODING_MS_1254", RTL_TEXTENCODING_MS_1254 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1255()
+ {
+ check( "RTL_TEXTENCODING_MS_1255", RTL_TEXTENCODING_MS_1255 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1256()
+ {
+ check( "RTL_TEXTENCODING_MS_1256", RTL_TEXTENCODING_MS_1256 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1257()
+ {
+ check( "RTL_TEXTENCODING_MS_1257", RTL_TEXTENCODING_MS_1257 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1258()
+ {
+ check( "RTL_TEXTENCODING_MS_1258", RTL_TEXTENCODING_MS_1258 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_ARABIC()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ARABIC", RTL_TEXTENCODING_APPLE_ARABIC );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_CENTEURO()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CENTEURO", RTL_TEXTENCODING_APPLE_CENTEURO );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_CROATIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CROATIAN", RTL_TEXTENCODING_APPLE_CROATIAN );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_CYRILLIC()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CYRILLIC", RTL_TEXTENCODING_APPLE_CYRILLIC );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_DEVANAGARI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_DEVANAGARI", RTL_TEXTENCODING_APPLE_DEVANAGARI );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_FARSI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_FARSI", RTL_TEXTENCODING_APPLE_FARSI );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_GREEK()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GREEK", RTL_TEXTENCODING_APPLE_GREEK );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_GUJARATI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GUJARATI", RTL_TEXTENCODING_APPLE_GUJARATI );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_GURMUKHI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GURMUKHI", RTL_TEXTENCODING_APPLE_GURMUKHI );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_HEBREW()
+ {
+ check( "RTL_TEXTENCODING_APPLE_HEBREW", RTL_TEXTENCODING_APPLE_HEBREW );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_ICELAND()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ICELAND", RTL_TEXTENCODING_APPLE_ICELAND );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_ROMANIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ROMANIAN", RTL_TEXTENCODING_APPLE_ROMANIAN );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_THAI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_THAI", RTL_TEXTENCODING_APPLE_THAI );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_TURKISH()
+ {
+ check( "RTL_TEXTENCODING_APPLE_TURKISH", RTL_TEXTENCODING_APPLE_TURKISH );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_UKRAINIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_UKRAINIAN", RTL_TEXTENCODING_APPLE_UKRAINIAN );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_CHINSIMP()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CHINSIMP", RTL_TEXTENCODING_APPLE_CHINSIMP );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_CHINTRAD()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CHINTRAD", RTL_TEXTENCODING_APPLE_CHINTRAD );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_JAPANESE()
+ {
+ check( "RTL_TEXTENCODING_APPLE_JAPANESE", RTL_TEXTENCODING_APPLE_JAPANESE );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_APPLE_KOREAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_KOREAN", RTL_TEXTENCODING_APPLE_KOREAN );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_932()
+ {
+ check( "RTL_TEXTENCODING_MS_932", RTL_TEXTENCODING_MS_932 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_936()
+ {
+ check( "RTL_TEXTENCODING_MS_936", RTL_TEXTENCODING_MS_936 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_949()
+ {
+ check( "RTL_TEXTENCODING_MS_949", RTL_TEXTENCODING_MS_949 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_950()
+ {
+ check( "RTL_TEXTENCODING_MS_950", RTL_TEXTENCODING_MS_950 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_SHIFT_JIS()
+ {
+ check( "RTL_TEXTENCODING_SHIFT_JIS", RTL_TEXTENCODING_SHIFT_JIS );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_GB_2312()
+ {
+ check( "RTL_TEXTENCODING_GB_2312", RTL_TEXTENCODING_GB_2312 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_GBT_12345()
+ {
+ check( "RTL_TEXTENCODING_GBT_12345", RTL_TEXTENCODING_GBT_12345 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_GBK()
+ {
+ check( "RTL_TEXTENCODING_GBK", RTL_TEXTENCODING_GBK );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_BIG5()
+ {
+ check( "RTL_TEXTENCODING_BIG5", RTL_TEXTENCODING_BIG5 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_EUC_JP()
+ {
+ check( "RTL_TEXTENCODING_EUC_JP", RTL_TEXTENCODING_EUC_JP );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_EUC_CN()
+ {
+ check( "RTL_TEXTENCODING_EUC_CN", RTL_TEXTENCODING_EUC_CN );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_EUC_TW()
+ {
+ check( "RTL_TEXTENCODING_EUC_TW", RTL_TEXTENCODING_EUC_TW );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_2022_JP()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_JP", RTL_TEXTENCODING_ISO_2022_JP );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_2022_CN()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_CN", RTL_TEXTENCODING_ISO_2022_CN );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_KOI8_R()
+ {
+ check( "RTL_TEXTENCODING_KOI8_R", RTL_TEXTENCODING_KOI8_R );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_UTF7()
+ {
+ check( "RTL_TEXTENCODING_UTF7", RTL_TEXTENCODING_UTF7 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_UTF8()
+ {
+ check( "RTL_TEXTENCODING_UTF8", RTL_TEXTENCODING_UTF8 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_10()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_10", RTL_TEXTENCODING_ISO_8859_10 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_8859_13()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_13", RTL_TEXTENCODING_ISO_8859_13 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_EUC_KR()
+ {
+ check( "RTL_TEXTENCODING_EUC_KR", RTL_TEXTENCODING_EUC_KR );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISO_2022_KR()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_KR", RTL_TEXTENCODING_ISO_2022_KR );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_JIS_X_0201()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0201", RTL_TEXTENCODING_JIS_X_0201 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_JIS_X_0208()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0208", RTL_TEXTENCODING_JIS_X_0208 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_JIS_X_0212()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0212", RTL_TEXTENCODING_JIS_X_0212 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_MS_1361()
+ {
+ check( "RTL_TEXTENCODING_MS_1361", RTL_TEXTENCODING_MS_1361 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_GB_18030()
+ {
+ check( "RTL_TEXTENCODING_GB_18030", RTL_TEXTENCODING_GB_18030 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_BIG5_HKSCS()
+ {
+ check( "RTL_TEXTENCODING_BIG5_HKSCS", RTL_TEXTENCODING_BIG5_HKSCS );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_TIS_620()
+ {
+ check( "RTL_TEXTENCODING_TIS_620", RTL_TEXTENCODING_TIS_620 );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_KOI8_U()
+ {
+ check( "RTL_TEXTENCODING_KOI8_U", RTL_TEXTENCODING_KOI8_U );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_ISCII_DEVANAGARI()
+ {
+ check( "RTL_TEXTENCODING_ISCII_DEVANAGARI", RTL_TEXTENCODING_ISCII_DEVANAGARI );
+ }
+ // ----------------------------------------
+ void UnixCharsetFromTextEncoding_JAVA_UTF8()
+ {
+ check( "RTL_TEXTENCODING_JAVA_UTF8", RTL_TEXTENCODING_JAVA_UTF8 );
+ }
+ // ----------------------------------------
+
+ CPPUNIT_TEST_SUITE( getBestUnix );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1252 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_ROMAN );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_437 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_850 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_860 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_861 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_863 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_865 );
+
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_SYMBOL );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ASCII_US );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_1 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_2 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_3 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_4 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_5 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_6 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_7 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_8 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_9 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_14 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_15 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_737 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_775 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_852 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_855 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_857 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_862 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_864 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_866 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_IBM_869 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_874 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1250 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1251 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1253 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1254 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1255 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1256 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1257 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1258 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_ARABIC );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_CENTEURO );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_CROATIAN );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_CYRILLIC );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_DEVANAGARI );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_FARSI );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_GREEK );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_GUJARATI );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_GURMUKHI );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_HEBREW );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_ICELAND );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_ROMANIAN );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_THAI );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_TURKISH );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_UKRAINIAN );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_CHINSIMP );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_CHINTRAD );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_JAPANESE );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_APPLE_KOREAN );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_932 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_936 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_949 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_950 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_SHIFT_JIS );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_GB_2312 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_GBT_12345 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_GBK );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_BIG5 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_EUC_JP );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_EUC_CN );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_EUC_TW );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_2022_JP );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_2022_CN );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_KOI8_R );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_UTF7 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_UTF8 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_10 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_8859_13 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_EUC_KR );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISO_2022_KR );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_JIS_X_0201 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_JIS_X_0208 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_JIS_X_0212 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_MS_1361 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_GB_18030 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_BIG5_HKSCS );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_TIS_620 );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_KOI8_U );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_ISCII_DEVANAGARI );
+ CPPUNIT_TEST( UnixCharsetFromTextEncoding_JAVA_UTF8 );
+
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+ // -----------------------------------------------------------------------------
+
+
+ class getBestWindows : public CppUnit::TestFixture
+ {
+ public:
+ void setUp()
+ {
+ }
+
+ void check( const sal_Char* _pRTL_TEXTENCODING, rtl_TextEncoding _aCurrentEncode )
+ {
+ const sal_uInt8 nCharSet = rtl_getBestWindowsCharsetFromTextEncoding( _aCurrentEncode );
+ if (nCharSet == 1)
+ {
+ t_print("rtl_getBestWindowsCharsetFromTextEncoding(%s) (%d) doesn't seem to exist.\n\n", _pRTL_TEXTENCODING, _aCurrentEncode);
+ }
+ else
+ {
+ t_print(T_VERBOSE, "'%s' is charset: '%d'\n", _pRTL_TEXTENCODING, nCharSet);
+
+ rtl_TextEncoding eTextEnc = rtl_getTextEncodingFromWindowsCharset( nCharSet );
+ if (_aCurrentEncode != eTextEnc &&
+ eTextEnc != RTL_TEXTENCODING_DONTKNOW)
+ {
+ t_print("rtl_getBestUnixCharsetFromTextEncoding(%s) is charset: %d\n", _pRTL_TEXTENCODING, nCharSet);
+ t_print("rtl_getTextEncodingFromWindowsCharset() differ: %s %d -> %d\n\n", _pRTL_TEXTENCODING, _aCurrentEncode, eTextEnc );
+ }
+ // rtl::OString sError = "getTextEncodingFromWindowsCharset(";
+ // sError += rtl::OString::valueOf(nCharSet);
+ // sError += ") returns nul.";
+
+ // CPPUNIT_ASSERT_MESSAGE(sError.getStr(), eTextEnc != RTL_TEXTENCODING_DONTKNOW);
+ // CPPUNIT_ASSERT_MESSAGE("Does not realize itself", _aCurrentEncode == eTextEnc );
+ }
+ }
+
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1252()
+ {
+ check( "RTL_TEXTENCODING_MS_1252", RTL_TEXTENCODING_MS_1252 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_ROMAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ROMAN", RTL_TEXTENCODING_APPLE_ROMAN );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_437()
+ {
+ check( "RTL_TEXTENCODING_IBM_437", RTL_TEXTENCODING_IBM_437 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_850()
+ {
+ check( "RTL_TEXTENCODING_IBM_850", RTL_TEXTENCODING_IBM_850 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_860()
+ {
+ check( "RTL_TEXTENCODING_IBM_860", RTL_TEXTENCODING_IBM_860 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_861()
+ {
+ check( "RTL_TEXTENCODING_IBM_861", RTL_TEXTENCODING_IBM_861 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_863()
+ {
+ check( "RTL_TEXTENCODING_IBM_863", RTL_TEXTENCODING_IBM_863 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_865()
+ {
+ check( "RTL_TEXTENCODING_IBM_865", RTL_TEXTENCODING_IBM_865 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_SYMBOL()
+ {
+ check( "RTL_TEXTENCODING_SYMBOL", RTL_TEXTENCODING_SYMBOL );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ASCII_US()
+ {
+ check( "RTL_TEXTENCODING_ASCII_US", RTL_TEXTENCODING_ASCII_US );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_1()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_1", RTL_TEXTENCODING_ISO_8859_1 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_2()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_2", RTL_TEXTENCODING_ISO_8859_2 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_3()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_3", RTL_TEXTENCODING_ISO_8859_3 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_4()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_4", RTL_TEXTENCODING_ISO_8859_4 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_5()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_5", RTL_TEXTENCODING_ISO_8859_5 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_6()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_6", RTL_TEXTENCODING_ISO_8859_6 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_7()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_7", RTL_TEXTENCODING_ISO_8859_7 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_8()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_8", RTL_TEXTENCODING_ISO_8859_8 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_9()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_9", RTL_TEXTENCODING_ISO_8859_9 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_14()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_14", RTL_TEXTENCODING_ISO_8859_14 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_15()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_15", RTL_TEXTENCODING_ISO_8859_15 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_737()
+ {
+ check( "RTL_TEXTENCODING_IBM_737", RTL_TEXTENCODING_IBM_737 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_775()
+ {
+ check( "RTL_TEXTENCODING_IBM_775", RTL_TEXTENCODING_IBM_775 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_852()
+ {
+ check( "RTL_TEXTENCODING_IBM_852", RTL_TEXTENCODING_IBM_852 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_855()
+ {
+ check( "RTL_TEXTENCODING_IBM_855", RTL_TEXTENCODING_IBM_855 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_857()
+ {
+ check( "RTL_TEXTENCODING_IBM_857", RTL_TEXTENCODING_IBM_857 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_862()
+ {
+ check( "RTL_TEXTENCODING_IBM_862", RTL_TEXTENCODING_IBM_862 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_864()
+ {
+ check( "RTL_TEXTENCODING_IBM_864", RTL_TEXTENCODING_IBM_864 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_866()
+ {
+ check( "RTL_TEXTENCODING_IBM_866", RTL_TEXTENCODING_IBM_866 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_IBM_869()
+ {
+ check( "RTL_TEXTENCODING_IBM_869", RTL_TEXTENCODING_IBM_869 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_874()
+ {
+ check( "RTL_TEXTENCODING_MS_874", RTL_TEXTENCODING_MS_874 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1250()
+ {
+ check( "RTL_TEXTENCODING_MS_1250", RTL_TEXTENCODING_MS_1250 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1251()
+ {
+ check( "RTL_TEXTENCODING_MS_1251", RTL_TEXTENCODING_MS_1251 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1253()
+ {
+ check( "RTL_TEXTENCODING_MS_1253", RTL_TEXTENCODING_MS_1253 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1254()
+ {
+ check( "RTL_TEXTENCODING_MS_1254", RTL_TEXTENCODING_MS_1254 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1255()
+ {
+ check( "RTL_TEXTENCODING_MS_1255", RTL_TEXTENCODING_MS_1255 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1256()
+ {
+ check( "RTL_TEXTENCODING_MS_1256", RTL_TEXTENCODING_MS_1256 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1257()
+ {
+ check( "RTL_TEXTENCODING_MS_1257", RTL_TEXTENCODING_MS_1257 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1258()
+ {
+ check( "RTL_TEXTENCODING_MS_1258", RTL_TEXTENCODING_MS_1258 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_ARABIC()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ARABIC", RTL_TEXTENCODING_APPLE_ARABIC );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_CENTEURO()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CENTEURO", RTL_TEXTENCODING_APPLE_CENTEURO );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_CROATIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CROATIAN", RTL_TEXTENCODING_APPLE_CROATIAN );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_CYRILLIC()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CYRILLIC", RTL_TEXTENCODING_APPLE_CYRILLIC );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_DEVANAGARI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_DEVANAGARI", RTL_TEXTENCODING_APPLE_DEVANAGARI );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_FARSI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_FARSI", RTL_TEXTENCODING_APPLE_FARSI );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_GREEK()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GREEK", RTL_TEXTENCODING_APPLE_GREEK );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_GUJARATI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GUJARATI", RTL_TEXTENCODING_APPLE_GUJARATI );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_GURMUKHI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_GURMUKHI", RTL_TEXTENCODING_APPLE_GURMUKHI );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_HEBREW()
+ {
+ check( "RTL_TEXTENCODING_APPLE_HEBREW", RTL_TEXTENCODING_APPLE_HEBREW );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_ICELAND()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ICELAND", RTL_TEXTENCODING_APPLE_ICELAND );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_ROMANIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_ROMANIAN", RTL_TEXTENCODING_APPLE_ROMANIAN );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_THAI()
+ {
+ check( "RTL_TEXTENCODING_APPLE_THAI", RTL_TEXTENCODING_APPLE_THAI );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_TURKISH()
+ {
+ check( "RTL_TEXTENCODING_APPLE_TURKISH", RTL_TEXTENCODING_APPLE_TURKISH );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_UKRAINIAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_UKRAINIAN", RTL_TEXTENCODING_APPLE_UKRAINIAN );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_CHINSIMP()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CHINSIMP", RTL_TEXTENCODING_APPLE_CHINSIMP );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_CHINTRAD()
+ {
+ check( "RTL_TEXTENCODING_APPLE_CHINTRAD", RTL_TEXTENCODING_APPLE_CHINTRAD );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_JAPANESE()
+ {
+ check( "RTL_TEXTENCODING_APPLE_JAPANESE", RTL_TEXTENCODING_APPLE_JAPANESE );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_APPLE_KOREAN()
+ {
+ check( "RTL_TEXTENCODING_APPLE_KOREAN", RTL_TEXTENCODING_APPLE_KOREAN );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_932()
+ {
+ check( "RTL_TEXTENCODING_MS_932", RTL_TEXTENCODING_MS_932 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_936()
+ {
+ check( "RTL_TEXTENCODING_MS_936", RTL_TEXTENCODING_MS_936 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_949()
+ {
+ check( "RTL_TEXTENCODING_MS_949", RTL_TEXTENCODING_MS_949 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_950()
+ {
+ check( "RTL_TEXTENCODING_MS_950", RTL_TEXTENCODING_MS_950 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_SHIFT_JIS()
+ {
+ check( "RTL_TEXTENCODING_SHIFT_JIS", RTL_TEXTENCODING_SHIFT_JIS );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_GB_2312()
+ {
+ check( "RTL_TEXTENCODING_GB_2312", RTL_TEXTENCODING_GB_2312 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_GBT_12345()
+ {
+ check( "RTL_TEXTENCODING_GBT_12345", RTL_TEXTENCODING_GBT_12345 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_GBK()
+ {
+ check( "RTL_TEXTENCODING_GBK", RTL_TEXTENCODING_GBK );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_BIG5()
+ {
+ check( "RTL_TEXTENCODING_BIG5", RTL_TEXTENCODING_BIG5 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_EUC_JP()
+ {
+ check( "RTL_TEXTENCODING_EUC_JP", RTL_TEXTENCODING_EUC_JP );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_EUC_CN()
+ {
+ check( "RTL_TEXTENCODING_EUC_CN", RTL_TEXTENCODING_EUC_CN );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_EUC_TW()
+ {
+ check( "RTL_TEXTENCODING_EUC_TW", RTL_TEXTENCODING_EUC_TW );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_2022_JP()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_JP", RTL_TEXTENCODING_ISO_2022_JP );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_2022_CN()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_CN", RTL_TEXTENCODING_ISO_2022_CN );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_KOI8_R()
+ {
+ check( "RTL_TEXTENCODING_KOI8_R", RTL_TEXTENCODING_KOI8_R );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_UTF7()
+ {
+ check( "RTL_TEXTENCODING_UTF7", RTL_TEXTENCODING_UTF7 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_UTF8()
+ {
+ check( "RTL_TEXTENCODING_UTF8", RTL_TEXTENCODING_UTF8 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_10()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_10", RTL_TEXTENCODING_ISO_8859_10 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_8859_13()
+ {
+ check( "RTL_TEXTENCODING_ISO_8859_13", RTL_TEXTENCODING_ISO_8859_13 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_EUC_KR()
+ {
+ check( "RTL_TEXTENCODING_EUC_KR", RTL_TEXTENCODING_EUC_KR );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISO_2022_KR()
+ {
+ check( "RTL_TEXTENCODING_ISO_2022_KR", RTL_TEXTENCODING_ISO_2022_KR );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_JIS_X_0201()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0201", RTL_TEXTENCODING_JIS_X_0201 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_JIS_X_0208()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0208", RTL_TEXTENCODING_JIS_X_0208 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_JIS_X_0212()
+ {
+ check( "RTL_TEXTENCODING_JIS_X_0212", RTL_TEXTENCODING_JIS_X_0212 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_MS_1361()
+ {
+ check( "RTL_TEXTENCODING_MS_1361", RTL_TEXTENCODING_MS_1361 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_GB_18030()
+ {
+ check( "RTL_TEXTENCODING_GB_18030", RTL_TEXTENCODING_GB_18030 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_BIG5_HKSCS()
+ {
+ check( "RTL_TEXTENCODING_BIG5_HKSCS", RTL_TEXTENCODING_BIG5_HKSCS );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_TIS_620()
+ {
+ check( "RTL_TEXTENCODING_TIS_620", RTL_TEXTENCODING_TIS_620 );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_KOI8_U()
+ {
+ check( "RTL_TEXTENCODING_KOI8_U", RTL_TEXTENCODING_KOI8_U );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_ISCII_DEVANAGARI()
+ {
+ check( "RTL_TEXTENCODING_ISCII_DEVANAGARI", RTL_TEXTENCODING_ISCII_DEVANAGARI );
+ }
+ // ----------------------------------------
+ void WindowsCharsetFromTextEncoding_JAVA_UTF8()
+ {
+ check( "RTL_TEXTENCODING_JAVA_UTF8", RTL_TEXTENCODING_JAVA_UTF8 );
+ }
+ // ----------------------------------------
+
+ CPPUNIT_TEST_SUITE( getBestWindows );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1252 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_ROMAN );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_437 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_850 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_860 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_861 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_863 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_865 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_SYMBOL );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ASCII_US );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_1 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_2 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_3 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_4 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_5 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_6 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_7 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_8 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_9 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_14 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_15 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_737 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_775 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_852 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_855 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_857 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_862 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_864 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_866 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_IBM_869 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_874 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1250 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1251 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1253 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1254 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1255 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1256 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1257 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1258 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_ARABIC );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_CENTEURO );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_CROATIAN );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_CYRILLIC );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_DEVANAGARI );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_FARSI );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_GREEK );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_GUJARATI );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_GURMUKHI );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_HEBREW );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_ICELAND );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_ROMANIAN );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_THAI );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_TURKISH );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_UKRAINIAN );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_CHINSIMP );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_CHINTRAD );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_JAPANESE );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_APPLE_KOREAN );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_932 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_936 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_949 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_950 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_SHIFT_JIS );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_GB_2312 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_GBT_12345 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_GBK );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_BIG5 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_EUC_JP );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_EUC_CN );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_EUC_TW );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_2022_JP );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_2022_CN );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_KOI8_R );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_UTF7 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_UTF8 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_10 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_8859_13 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_EUC_KR );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISO_2022_KR );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_JIS_X_0201 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_JIS_X_0208 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_JIS_X_0212 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_MS_1361 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_GB_18030 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_BIG5_HKSCS );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_TIS_620 );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_KOI8_U );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_ISCII_DEVANAGARI );
+ CPPUNIT_TEST( WindowsCharsetFromTextEncoding_JAVA_UTF8 );
+
+ CPPUNIT_TEST_SUITE_END( );
+ };
+ class getTextEncodingInfo: public CppUnit::TestFixture
+ {
+ public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ // not implemented encoding test
+ void getTextEncodingInfo_001()
+ {
+ rtl_TextEncodingInfo aInfo1, aInfo2, aInfo3, aInfo4, aInfo5;
+ aInfo1.StructSize = 4;
+ // not implemented
+ sal_Bool bRes1 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_ARABIC, &aInfo1 );
+ // implemented
+ sal_Bool bRes11 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_CYRILLIC, &aInfo1 );
+ CPPUNIT_ASSERT_MESSAGE("should return sal_False.", bRes1 == sal_False && bRes11 == sal_False );
+
+ aInfo2.StructSize = 5;
+ sal_Bool bRes2 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_ARABIC, &aInfo2 );
+ sal_Bool bRes21 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_CYRILLIC, &aInfo2 );
+ CPPUNIT_ASSERT_MESSAGE("StructSize<6 should return sal_True", bRes2 == sal_True && bRes21 == sal_True && aInfo2.MinimumCharSize >=1 );
+
+ aInfo3.StructSize = 6;
+ sal_Bool bRes3 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_ARABIC, &aInfo3 );
+ sal_Bool bRes31 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_CYRILLIC, &aInfo3 );
+ CPPUNIT_ASSERT_MESSAGE("StructSize<6 should return sal_True", bRes3 == sal_True && bRes31 == sal_True );
+//&& aInfo2.MinimumCharSize >=1 );
+
+ aInfo4.StructSize = 8;
+ sal_Bool bRes4 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_ARABIC, &aInfo4 );
+ sal_Bool bRes41 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_CYRILLIC, &aInfo4);
+ CPPUNIT_ASSERT_MESSAGE("StructSize<6 should return sal_True", bRes4 == sal_True && bRes41 == sal_True);
+// && aInfo2.MinimumCharSize >=1 );
+
+ aInfo5.StructSize = sizeof aInfo5;
+ sal_Bool bRes5 = rtl_getTextEncodingInfo( RTL_TEXTENCODING_APPLE_ARABIC, &aInfo5 );
+ CPPUNIT_ASSERT_MESSAGE("StructSize<6 should return sal_True", bRes5 == sal_False && aInfo5.Flags == 0);
+
+ }
+ CPPUNIT_TEST_SUITE(getTextEncodingInfo);
+ CPPUNIT_TEST(getTextEncodingInfo_001);
+ //CPPUNIT_TEST(getTextEncodingInfo_002);
+ CPPUNIT_TEST_SUITE_END();
+ };
+}
+
+namespace {
+
+class TestEncodingFromUnix: public CppUnit::TestFixture {
+public:
+ void testIso8859() {
+ check(RTL_TEXTENCODING_DONTKNOW, "ISO8859");
+ check(RTL_TEXTENCODING_DONTKNOW, "ISO8859-0");
+ check(RTL_TEXTENCODING_DONTKNOW, "ISO8859-01");
+ check(RTL_TEXTENCODING_DONTKNOW, "ISO8859_1");
+ check(RTL_TEXTENCODING_DONTKNOW, "ISO88591");
+ check(RTL_TEXTENCODING_ISO_8859_1, "ISO8859-1");
+ check(RTL_TEXTENCODING_ISO_8859_2, "ISO8859-2");
+ check(RTL_TEXTENCODING_ISO_8859_3, "ISO8859-3");
+ check(RTL_TEXTENCODING_ISO_8859_4, "ISO8859-4");
+ check(RTL_TEXTENCODING_ISO_8859_5, "ISO8859-5");
+ check(RTL_TEXTENCODING_ISO_8859_6, "ISO8859-6");
+ check(RTL_TEXTENCODING_ISO_8859_7, "ISO8859-7");
+ check(RTL_TEXTENCODING_ISO_8859_8, "ISO8859-8");
+ check(RTL_TEXTENCODING_ISO_8859_9, "ISO8859-9");
+ check(RTL_TEXTENCODING_ISO_8859_10, "ISO8859-10");
+ check(RTL_TEXTENCODING_TIS_620, "ISO8859-11");
+ check(RTL_TEXTENCODING_ISO_8859_13, "ISO8859-13");
+ check(RTL_TEXTENCODING_ISO_8859_14, "ISO8859-14");
+ check(RTL_TEXTENCODING_ISO_8859_15, "ISO8859-15");
+ }
+
+ void testTis620() {
+ check(RTL_TEXTENCODING_DONTKNOW, "TIS620");
+ check(RTL_TEXTENCODING_TIS_620, "TIS620-0");
+ check(RTL_TEXTENCODING_DONTKNOW, "TIS620-1");
+ check(RTL_TEXTENCODING_TIS_620, "TIS620-2529");
+ check(RTL_TEXTENCODING_TIS_620, "TIS620-2533");
+ check(RTL_TEXTENCODING_DONTKNOW, "TIS620.2529-0");
+ check(RTL_TEXTENCODING_TIS_620, "TIS620.2529-1");
+ check(RTL_TEXTENCODING_DONTKNOW, "TIS620.2529-2");
+ check(RTL_TEXTENCODING_TIS_620, "TIS620.2533-0");
+ check(RTL_TEXTENCODING_TIS_620, "TIS620.2533-1");
+ check(RTL_TEXTENCODING_DONTKNOW, "TIS620.2533-2");
+ }
+
+ CPPUNIT_TEST_SUITE(TestEncodingFromUnix);
+ CPPUNIT_TEST(testIso8859);
+ CPPUNIT_TEST(testTis620);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ void check(rtl_TextEncoding expected, char const * input) {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ input, expected, rtl_getTextEncodingFromUnixCharset(input));
+ }
+};
+
+}
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_tencinfo::getBestMime, "rtl_tencinfo" );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_tencinfo::getBestUnix, "rtl_tencinfo" );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_tencinfo::getBestWindows, "rtl_tencinfo" );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_tencinfo::getTextEncodingInfo, "rtl_tencinfo" );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(
+ TestEncodingFromUnix, "TestEncodingFromUnix");
+
+// -----------------------------------------------------------------------------
+
+NOADDITIONAL;
diff --git a/sal/qa/rtl/textenc/rtl_textcvt.cxx b/sal/qa/rtl/textenc/rtl_textcvt.cxx
new file mode 100644
index 000000000000..03eacc76d8f9
--- /dev/null
+++ b/sal/qa/rtl/textenc/rtl_textcvt.cxx
@@ -0,0 +1,2901 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "sal/config.h"
+
+#include <cstddef>
+#include <cstring>
+
+#include "testshl/simpleheader.hxx"
+#include "rtl/string.hxx"
+#include "rtl/tencinfo.h"
+#include "rtl/textcvt.h"
+#include "rtl/textenc.h"
+#include "sal/types.h"
+
+namespace {
+
+struct SingleByteCharSet {
+ rtl_TextEncoding m_nEncoding;
+ sal_Unicode m_aMap[256];
+};
+
+void testSingleByteCharSet(SingleByteCharSet const & rSet) {
+ sal_Char aText[256];
+ sal_Unicode aUnicode[256];
+ sal_Size nNumber = 0;
+ for (int i = 0; i < 256; ++i) {
+ if (rSet.m_aMap[i] != 0xFFFF) {
+ aText[nNumber++] = static_cast< sal_Char >(i);
+ }
+ }
+ {
+ rtl_TextToUnicodeConverter aConverter
+ = rtl_createTextToUnicodeConverter(rSet.m_nEncoding);
+ rtl_TextToUnicodeContext aContext
+ = rtl_createTextToUnicodeContext(aConverter);
+ CPPUNIT_ASSERT_MESSAGE("failure #1", aConverter && aContext);
+ sal_Size nSize;
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ nSize = rtl_convertTextToUnicode(
+ aConverter, aContext, aText, nNumber, aUnicode, nNumber,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR),
+ &nInfo, &nConverted);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure #2",
+ nSize == nNumber && nInfo == 0 && nConverted == nNumber);
+ rtl_destroyTextToUnicodeContext(aConverter, aContext);
+ rtl_destroyTextToUnicodeConverter(aConverter);
+ }
+ {
+ bool bSuccess = true;
+ int j = 0;
+ for (int i = 0; i < 256; ++i) {
+ if (rSet.m_aMap[i] != 0xFFFF && aUnicode[j++] != rSet.m_aMap[i]) {
+ bSuccess = false;
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("failure #3", bSuccess);
+ }
+ if (rSet.m_nEncoding == RTL_TEXTENCODING_ASCII_US) {
+ nNumber = 128;
+ }
+ {
+ rtl_UnicodeToTextConverter aConverter
+ = rtl_createUnicodeToTextConverter(rSet.m_nEncoding);
+ rtl_UnicodeToTextContext aContext
+ = rtl_createUnicodeToTextContext(aConverter);
+ CPPUNIT_ASSERT_MESSAGE("failure #4", aConverter && aContext);
+ sal_Size nSize;
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ nSize = rtl_convertUnicodeToText(
+ aConverter, aContext, aUnicode, nNumber, aText, nNumber,
+ (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR),
+ &nInfo, &nConverted);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure #5",
+ nSize == nNumber && nInfo == 0 && nConverted == nNumber);
+ rtl_destroyUnicodeToTextContext(aConverter, aContext);
+ rtl_destroyUnicodeToTextConverter(aConverter);
+ }
+ {
+ bool bSuccess = true;
+ int j = 0;
+ for (int i = 0; i < 256; ++i) {
+ if (rSet.m_aMap[i] != 0xFFFF
+ && aText[j++] != static_cast< sal_Char >(i))
+ {
+ bSuccess = false;
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("failure #6", bSuccess);
+ }
+ for (int i = 0; i < 256; ++i) {
+ if (rSet.m_aMap[i] == 0xFFFF) {
+ aText[0] = static_cast< sal_Char >(i);
+ rtl_TextToUnicodeConverter aConverter
+ = rtl_createTextToUnicodeConverter(rSet.m_nEncoding);
+ rtl_TextToUnicodeContext aContext
+ = rtl_createTextToUnicodeContext(aConverter);
+ CPPUNIT_ASSERT_MESSAGE("failure #7", aConverter && aContext);
+ sal_Size nSize;
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ nSize = rtl_convertTextToUnicode(
+ aConverter, aContext, aText, 1, aUnicode, 1,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR),
+ &nInfo, &nConverted);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure #9",
+ (nSize == 0
+ && (nInfo
+ == (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_UNDEFINED))
+ && nConverted == 0));
+ rtl_destroyTextToUnicodeContext(aConverter, aContext);
+ rtl_destroyTextToUnicodeConverter(aConverter);
+ }
+ }
+}
+
+int const TEST_STRING_SIZE = 1000;
+
+struct ComplexCharSetTest {
+ rtl_TextEncoding m_nEncoding;
+ char const * m_pText;
+ sal_Size m_nTextSize;
+ sal_Unicode m_aUnicode[TEST_STRING_SIZE];
+ sal_Size m_nUnicodeSize;
+ bool m_bNoContext;
+ bool m_bForward;
+ bool m_bReverse;
+ bool m_bGlobalSignature;
+ sal_uInt32 m_nReverseUndefined;
+};
+
+void doComplexCharSetTest(ComplexCharSetTest const & rTest) {
+ if (rTest.m_bForward) {
+ sal_Unicode aUnicode[TEST_STRING_SIZE];
+ rtl_TextToUnicodeConverter aConverter
+ = rtl_createTextToUnicodeConverter(rTest.m_nEncoding);
+ rtl_TextToUnicodeContext aContext
+ = rtl_createTextToUnicodeContext(aConverter);
+ CPPUNIT_ASSERT_MESSAGE("failure #10", aConverter && aContext);
+ sal_Size nSize;
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ nSize = rtl_convertTextToUnicode(
+ aConverter, aContext,
+ reinterpret_cast< sal_Char const * >(rTest.m_pText),
+ rTest.m_nTextSize, aUnicode, TEST_STRING_SIZE,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_FLUSH
+ | (rTest.m_bGlobalSignature ?
+ RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE : 0)),
+ &nInfo, &nConverted);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure #11",
+ (nSize == rTest.m_nUnicodeSize && nInfo == 0
+ && nConverted == rTest.m_nTextSize));
+ rtl_destroyTextToUnicodeContext(aConverter, aContext);
+ rtl_destroyTextToUnicodeConverter(aConverter);
+ bool bSuccess = true;
+ for (sal_Size i = 0; i < rTest.m_nUnicodeSize; ++i) {
+ if (aUnicode[i] != rTest.m_aUnicode[i]) {
+ bSuccess = false;
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("failure #12", bSuccess);
+ }
+ if (rTest.m_bForward) {
+ sal_Unicode aUnicode[TEST_STRING_SIZE];
+ rtl_TextToUnicodeConverter aConverter
+ = rtl_createTextToUnicodeConverter(rTest.m_nEncoding);
+ rtl_TextToUnicodeContext aContext
+ = rtl_createTextToUnicodeContext(aConverter);
+ CPPUNIT_ASSERT_MESSAGE("failure #13", aConverter && aContext);
+ if (aContext != (rtl_TextToUnicodeContext) 1) {
+ sal_Size nInput = 0;
+ sal_Size nOutput = 0;
+ for (bool bFlush = true; nInput < rTest.m_nTextSize || bFlush;) {
+ sal_Size nSrcBytes = 1;
+ sal_uInt32 nFlags
+ = (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR
+ | (rTest.m_bGlobalSignature ?
+ RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE : 0));
+ if (nInput >= rTest.m_nTextSize) {
+ nSrcBytes = 0;
+ nFlags |= RTL_TEXTTOUNICODE_FLAGS_FLUSH;
+ bFlush = false;
+ }
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ sal_Size nSize = rtl_convertTextToUnicode(
+ aConverter, aContext,
+ reinterpret_cast< sal_Char const * >(rTest.m_pText + nInput),
+ nSrcBytes, aUnicode + nOutput, TEST_STRING_SIZE - nOutput,
+ nFlags, &nInfo, &nConverted);
+ nOutput += nSize;
+ nInput += nConverted;
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure #14",
+ (nInfo & ~RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL) == 0);
+ }
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure #15",
+ nOutput == rTest.m_nUnicodeSize && nInput == rTest.m_nTextSize);
+ bool bSuccess = true;
+ for (sal_Size i = 0; i < rTest.m_nUnicodeSize; ++i) {
+ if (aUnicode[i] != rTest.m_aUnicode[i]) {
+ bSuccess = false;
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("failure #16", bSuccess);
+ }
+ rtl_destroyTextToUnicodeContext(aConverter, aContext);
+ rtl_destroyTextToUnicodeConverter(aConverter);
+ }
+ if (rTest.m_bNoContext && rTest.m_bForward) {
+ sal_Unicode aUnicode[TEST_STRING_SIZE];
+ int nSize = 0;
+ rtl_TextToUnicodeConverter aConverter
+ = rtl_createTextToUnicodeConverter(rTest.m_nEncoding);
+ CPPUNIT_ASSERT_MESSAGE("failure #17", aConverter);
+ for (sal_Size i = 0;;) {
+ if (i == rTest.m_nTextSize) {
+ goto done;
+ }
+ sal_Char c1 = rTest.m_pText[i++];
+ sal_Unicode aUC[2];
+ sal_uInt32 nInfo = 0;
+ sal_Size nCvtBytes;
+ sal_Size nChars = rtl_convertTextToUnicode(
+ aConverter, 0, &c1, 1, aUC, 2,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR
+ | (rTest.m_bGlobalSignature ?
+ RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE : 0)),
+ &nInfo, &nCvtBytes);
+ if ((nInfo & RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL) != 0) {
+ sal_Char sBuffer[10];
+ sBuffer[0] = c1;
+ sal_uInt16 nLen = 1;
+ while ((nInfo & RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL) != 0
+ && nLen < 10)
+ {
+ if (i == rTest.m_nTextSize) {
+ goto done;
+ }
+ c1 = rTest.m_pText[i++];
+ sBuffer[nLen++] = c1;
+ nChars = rtl_convertTextToUnicode(
+ aConverter, 0, sBuffer, nLen, aUC, 2,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR
+ | (rTest.m_bGlobalSignature ?
+ RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE : 0)),
+ &nInfo, &nCvtBytes);
+ }
+ if (nChars == 1 && nInfo == 0) {
+ OSL_ASSERT(nCvtBytes == nLen);
+ aUnicode[nSize++] = aUC[0];
+ } else if (nChars == 2 && nInfo == 0) {
+ OSL_ASSERT(nCvtBytes == nLen);
+ aUnicode[nSize++] = aUC[0];
+ aUnicode[nSize++] = aUC[1];
+ } else {
+ OSL_ASSERT(
+ (nInfo & RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL) == 0
+ && nChars == 0 && nInfo != 0);
+ aUnicode[nSize++] = sBuffer[0];
+ i -= nLen - 1;
+ }
+ } else if (nChars == 1 && nInfo == 0) {
+ OSL_ASSERT(nCvtBytes == 1);
+ aUnicode[nSize++] = aUC[0];
+ } else if (nChars == 2 && nInfo == 0) {
+ OSL_ASSERT(nCvtBytes == 1);
+ aUnicode[nSize++] = aUC[0];
+ aUnicode[nSize++] = aUC[1];
+ } else {
+ OSL_ASSERT(nChars == 0 && nInfo != 0);
+ aUnicode[nSize++] = c1;
+ }
+ }
+ done:
+ rtl_destroyTextToUnicodeConverter(aConverter);
+ bool bSuccess = true;
+ for (sal_Size i = 0; i < rTest.m_nUnicodeSize; ++i) {
+ if (aUnicode[i] != rTest.m_aUnicode[i]) {
+ bSuccess = false;
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("failure #18", bSuccess);
+ }
+ if (rTest.m_bReverse) {
+ sal_Char aText[TEST_STRING_SIZE];
+ rtl_UnicodeToTextConverter aConverter
+ = rtl_createUnicodeToTextConverter(rTest.m_nEncoding);
+ rtl_UnicodeToTextContext aContext
+ = rtl_createUnicodeToTextContext(aConverter);
+ CPPUNIT_ASSERT_MESSAGE("failure #19", aConverter && aContext);
+ sal_Size nSize;
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ nSize = rtl_convertUnicodeToText(
+ aConverter, aContext, rTest.m_aUnicode, rTest.m_nUnicodeSize, aText,
+ TEST_STRING_SIZE,
+ (rTest.m_nReverseUndefined | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_FLUSH
+ | (rTest.m_bGlobalSignature ?
+ RTL_UNICODETOTEXT_FLAGS_GLOBAL_SIGNATURE : 0)),
+ &nInfo, &nConverted);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure #20",
+ (nSize == rTest.m_nTextSize
+ && (nInfo == 0
+ || (nInfo == RTL_UNICODETOTEXT_INFO_UNDEFINED
+ && (rTest.m_nReverseUndefined
+ != RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR)))
+ && nConverted == rTest.m_nUnicodeSize));
+ rtl_destroyUnicodeToTextContext(aConverter, aContext);
+ rtl_destroyUnicodeToTextConverter(aConverter);
+ bool bSuccess = true;
+ for (sal_Size i = 0; i < rTest.m_nTextSize; ++i) {
+ if (aText[i] != rTest.m_pText[i]) {
+ bSuccess = false;
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("failure #21", bSuccess);
+ }
+}
+
+void doComplexCharSetCutTest(ComplexCharSetTest const & rTest) {
+ if (rTest.m_bNoContext) {
+ sal_Unicode aUnicode[TEST_STRING_SIZE];
+ rtl_TextToUnicodeConverter aConverter
+ = rtl_createTextToUnicodeConverter(rTest.m_nEncoding);
+ CPPUNIT_ASSERT_MESSAGE("failure #22", aConverter);
+ sal_Size nSize;
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ nSize = rtl_convertTextToUnicode(
+ aConverter, 0, reinterpret_cast< sal_Char const * >(rTest.m_pText),
+ rTest.m_nTextSize, aUnicode, TEST_STRING_SIZE,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR),
+ &nInfo, &nConverted);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure #23",
+ (nSize <= rTest.m_nUnicodeSize
+ && (nInfo == RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL
+ || (nInfo
+ == (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL)))
+ && nConverted < rTest.m_nTextSize));
+ rtl_destroyTextToUnicodeConverter(aConverter);
+ bool bSuccess = true;
+ for (sal_Size i = 0; i < nSize; ++i) {
+ if (aUnicode[i] != rTest.m_aUnicode[i]) {
+ bSuccess = false;
+ break;
+ }
+ }
+ CPPUNIT_ASSERT_MESSAGE("failure #24", bSuccess);
+ }
+}
+
+class Test: public CppUnit::TestFixture {
+public:
+ void testSingleByte();
+
+ void testComplex();
+
+ void testComplexCut();
+
+ void testSRCBUFFERTOSMALL();
+
+ void testMime();
+
+ void testWindows();
+
+ void testInfo();
+
+ CPPUNIT_TEST_SUITE(Test);
+ CPPUNIT_TEST(testSingleByte);
+ CPPUNIT_TEST(testComplex);
+ CPPUNIT_TEST(testComplexCut);
+ CPPUNIT_TEST(testSRCBUFFERTOSMALL);
+ CPPUNIT_TEST(testMime);
+ CPPUNIT_TEST(testWindows);
+ CPPUNIT_TEST(testInfo);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void Test::testSingleByte() {
+ static SingleByteCharSet const data[]
+ = { { RTL_TEXTENCODING_MS_1250,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0x201A,0xFFFF,0x201E,0x2026,0x2020,0x2021,
+ 0xFFFF,0x2030,0x0160,0x2039,0x015A,0x0164,0x017D,0x0179,
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0xFFFF,0x2122,0x0161,0x203A,0x015B,0x0165,0x017E,0x017A,
+ 0x00A0,0x02C7,0x02D8,0x0141,0x00A4,0x0104,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0x015E,0x00AB,0x00AC,0x00AD,0x00AE,0x017B,
+ 0x00B0,0x00B1,0x02DB,0x0142,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x0105,0x015F,0x00BB,0x013D,0x02DD,0x013E,0x017C,
+ 0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7,
+ 0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E,
+ 0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7,
+ 0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF,
+ 0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7,
+ 0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F,
+ 0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7,
+ 0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9 } },
+ { RTL_TEXTENCODING_MS_1251,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x0402,0x0403,0x201A,0x0453,0x201E,0x2026,0x2020,0x2021,
+ 0x20AC,0x2030,0x0409,0x2039,0x040A,0x040C,0x040B,0x040F,
+ 0x0452,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0xFFFF,0x2122,0x0459,0x203A,0x045A,0x045C,0x045B,0x045F,
+ 0x00A0,0x040E,0x045E,0x0408,0x00A4,0x0490,0x00A6,0x00A7,
+ 0x0401,0x00A9,0x0404,0x00AB,0x00AC,0x00AD,0x00AE,0x0407,
+ 0x00B0,0x00B1,0x0406,0x0456,0x0491,0x00B5,0x00B6,0x00B7,
+ 0x0451,0x2116,0x0454,0x00BB,0x0458,0x0405,0x0455,0x0457,
+ 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,
+ 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
+ 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,
+ 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
+ 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,
+ 0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
+ 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,
+ 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F } },
+ { RTL_TEXTENCODING_MS_1252,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,
+ 0x02C6,0x2030,0x0160,0x2039,0x0152,0xFFFF,0x017D,0xFFFF,
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0x02DC,0x2122,0x0161,0x203A,0x0153,0xFFFF,0x017E,0x0178,
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
+ 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,
+ 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
+ 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,
+ 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF,
+ 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,
+ 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
+ 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7,
+ 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF } },
+ { RTL_TEXTENCODING_MS_1253,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,
+ 0xFFFF,0x2030,0xFFFF,0x2039,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0xFFFF,0x2122,0xFFFF,0x203A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x00A0,0x0385,0x0386,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0xFFFF,0x00AB,0x00AC,0x00AD,0x00AE,0x2015,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x0384,0x00B5,0x00B6,0x00B7,
+ 0x0388,0x0389,0x038A,0x00BB,0x038C,0x00BD,0x038E,0x038F,
+ 0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,
+ 0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,
+ 0x03A0,0x03A1,0xFFFF,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,
+ 0x03A8,0x03A9,0x03AA,0x03AB,0x03AC,0x03AD,0x03AE,0x03AF,
+ 0x03B0,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,
+ 0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,
+ 0x03C0,0x03C1,0x03C2,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,
+ 0x03C8,0x03C9,0x03CA,0x03CB,0x03CC,0x03CD,0x03CE,0xFFFF } },
+ { RTL_TEXTENCODING_MS_1254,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,
+ 0x02C6,0x2030,0x0160,0x2039,0x0152,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0x02DC,0x2122,0x0161,0x203A,0x0153,0xFFFF,0xFFFF,0x0178,
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
+ 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,
+ 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
+ 0x011E,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,
+ 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x0130,0x015E,0x00DF,
+ 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,
+ 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
+ 0x011F,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7,
+ 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x0131,0x015F,0x00FF } },
+ { RTL_TEXTENCODING_APPLE_ROMAN,
+ { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0x7F,
+ 0x00C4,0x00C5,0x00C7,0x00C9,0x00D1,0x00D6,0x00DC,0x00E1,
+ 0x00E0,0x00E2,0x00E4,0x00E3,0x00E5,0x00E7,0x00E9,0x00E8,
+ 0x00EA,0x00EB,0x00ED,0x00EC,0x00EE,0x00EF,0x00F1,0x00F3,
+ 0x00F2,0x00F4,0x00F6,0x00F5,0x00FA,0x00F9,0x00FB,0x00FC,
+ 0x2020,0x00B0,0x00A2,0x00A3,0x00A7,0x2022,0x00B6,0x00DF,
+ 0x00AE,0x00A9,0x2122,0x00B4,0x00A8,0x2260,0x00C6,0x00D8,
+ 0x221E,0x00B1,0x2264,0x2265,0x00A5,0x00B5,0x2202,0x2211,
+ 0x220F,0x03C0,0x222B,0x00AA,0x00BA,0x03A9,0x00E6,0x00F8,
+ 0x00BF,0x00A1,0x00AC,0x221A,0x0192,0x2248,0x2206,0x00AB,
+ 0x00BB,0x2026,0x00A0,0x00C0,0x00C3,0x00D5,0x0152,0x0153,
+ 0x2013,0x2014,0x201C,0x201D,0x2018,0x2019,0x00F7,0x25CA,
+ 0x00FF,0x0178,0x2044,0x20AC,0x2039,0x203A,0xFB01,0xFB02,
+ 0x2021,0x00B7,0x201A,0x201E,0x2030,0x00C2,0x00CA,0x00C1,
+ 0x00CB,0x00C8,0x00CD,0x00CE,0x00CF,0x00CC,0x00D3,0x00D4,
+ 0xF8FF,0x00D2,0x00DA,0x00DB,0x00D9,0x0131,0x02C6,0x02DC,
+ 0x00AF,0x02D8,0x02D9,0x02DA,0x00B8,0x02DD,0x02DB,0x02C7 } },
+ { RTL_TEXTENCODING_IBM_437,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7,
+ 0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5,
+ 0x00c9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9,
+ 0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192,
+ 0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba,
+ 0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb,
+ 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556,
+ 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510,
+ 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f,
+ 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567,
+ 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b,
+ 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580,
+ 0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4,
+ 0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229,
+ 0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248,
+ 0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00a0 } },
+ // ...
+ { RTL_TEXTENCODING_ASCII_US,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, // !
+ 0x02C6,0x2030,0x0160,0x2039,0x0152,0xFFFF,0x017D,0xFFFF, // !
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, // !
+ 0x02DC,0x2122,0x0161,0x203A,0x0153,0xFFFF,0x017E,0x0178, // !
+ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF } },
+ { RTL_TEXTENCODING_ISO_8859_1,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
+ 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
+ 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
+ 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,
+ 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
+ 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,
+ 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF,
+ 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,
+ 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
+ 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7,
+ 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF } },
+ { RTL_TEXTENCODING_ISO_8859_2,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
+ 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
+ 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
+ 0x00A0,0x0104,0x02D8,0x0141,0x00A4,0x013D,0x015A,0x00A7,
+ 0x00A8,0x0160,0x015E,0x0164,0x0179,0x00AD,0x017D,0x017B,
+ 0x00B0,0x0105,0x02DB,0x0142,0x00B4,0x013E,0x015B,0x02C7,
+ 0x00B8,0x0161,0x015F,0x0165,0x017A,0x02DD,0x017E,0x017C,
+ 0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7,
+ 0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E,
+ 0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7,
+ 0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF,
+ 0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7,
+ 0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F,
+ 0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7,
+ 0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9 } },
+ { RTL_TEXTENCODING_ISO_8859_3,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
+ 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
+ 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
+ 0x00A0,0x0126,0x02D8,0x00A3,0x00A4,0xFFFF,0x0124,0x00A7,
+ 0x00A8,0x0130,0x015E,0x011E,0x0134,0x00AD,0xFFFF,0x017B,
+ 0x00B0,0x0127,0x00B2,0x00B3,0x00B4,0x00B5,0x0125,0x00B7,
+ 0x00B8,0x0131,0x015F,0x011F,0x0135,0x00BD,0xFFFF,0x017C,
+ 0x00C0,0x00C1,0x00C2,0xFFFF,0x00C4,0x010A,0x0108,0x00C7,
+ 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
+ 0xFFFF,0x00D1,0x00D2,0x00D3,0x00D4,0x0120,0x00D6,0x00D7,
+ 0x011C,0x00D9,0x00DA,0x00DB,0x00DC,0x016C,0x015C,0x00DF,
+ 0x00E0,0x00E1,0x00E2,0xFFFF,0x00E4,0x010B,0x0109,0x00E7,
+ 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
+ 0xFFFF,0x00F1,0x00F2,0x00F3,0x00F4,0x0121,0x00F6,0x00F7,
+ 0x011D,0x00F9,0x00FA,0x00FB,0x00FC,0x016D,0x015D,0x02D9 } },
+ // ...
+ { RTL_TEXTENCODING_ISO_8859_6,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
+ 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
+ 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
+ 0x00A0,0xFFFF,0xFFFF,0xFFFF,0x00A4,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x060C,0x00AD,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0x061B,0xFFFF,0xFFFF,0xFFFF,0x061F,
+ 0xFFFF,0x0621,0x0622,0x0623,0x0624,0x0625,0x0626,0x0627,
+ 0x0628,0x0629,0x062A,0x062B,0x062C,0x062D,0x062E,0x062F,
+ 0x0630,0x0631,0x0632,0x0633,0x0634,0x0635,0x0636,0x0637,
+ 0x0638,0x0639,0x063A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x0640,0x0641,0x0642,0x0643,0x0644,0x0645,0x0646,0x0647,
+ 0x0648,0x0649,0x064A,0x064B,0x064C,0x064D,0x064E,0x064F,
+ 0x0650,0x0651,0x0652,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF } },
+ // ...
+ { RTL_TEXTENCODING_ISO_8859_8,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
+ 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
+ 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
+ 0x00A0,0xFFFF,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0x00D7,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x00B9,0x00F7,0x00BB,0x00BC,0x00BD,0x00BE,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x2017,
+ 0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7,
+ 0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF,
+ 0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7,
+ 0x05E8,0x05E9,0x05EA,0xFFFF,0xFFFF,0x200E,0x200F,0xFFFF } },
+ // ...
+ { RTL_TEXTENCODING_TIS_620,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
+ 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
+ 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
+ 0x00A0,0x0E01,0x0E02,0x0E03,0x0E04,0x0E05,0x0E06,0x0E07, // !
+ 0x0E08,0x0E09,0x0E0A,0x0E0B,0x0E0C,0x0E0D,0x0E0E,0x0E0F,
+ 0x0E10,0x0E11,0x0E12,0x0E13,0x0E14,0x0E15,0x0E16,0x0E17,
+ 0x0E18,0x0E19,0x0E1A,0x0E1B,0x0E1C,0x0E1D,0x0E1E,0x0E1F,
+ 0x0E20,0x0E21,0x0E22,0x0E23,0x0E24,0x0E25,0x0E26,0x0E27,
+ 0x0E28,0x0E29,0x0E2A,0x0E2B,0x0E2C,0x0E2D,0x0E2E,0x0E2F,
+ 0x0E30,0x0E31,0x0E32,0x0E33,0x0E34,0x0E35,0x0E36,0x0E37,
+ 0x0E38,0x0E39,0x0E3A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x0E3F,
+ 0x0E40,0x0E41,0x0E42,0x0E43,0x0E44,0x0E45,0x0E46,0x0E47,
+ 0x0E48,0x0E49,0x0E4A,0x0E4B,0x0E4C,0x0E4D,0x0E4E,0x0E4F,
+ 0x0E50,0x0E51,0x0E52,0x0E53,0x0E54,0x0E55,0x0E56,0x0E57,
+ 0x0E58,0x0E59,0x0E5A,0x0E5B,0xFFFF,0xFFFF,0xFFFF,0xFFFF } },
+ { RTL_TEXTENCODING_MS_874,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x2026,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x00A0,0x0E01,0x0E02,0x0E03,0x0E04,0x0E05,0x0E06,0x0E07,
+ 0x0E08,0x0E09,0x0E0A,0x0E0B,0x0E0C,0x0E0D,0x0E0E,0x0E0F,
+ 0x0E10,0x0E11,0x0E12,0x0E13,0x0E14,0x0E15,0x0E16,0x0E17,
+ 0x0E18,0x0E19,0x0E1A,0x0E1B,0x0E1C,0x0E1D,0x0E1E,0x0E1F,
+ 0x0E20,0x0E21,0x0E22,0x0E23,0x0E24,0x0E25,0x0E26,0x0E27,
+ 0x0E28,0x0E29,0x0E2A,0x0E2B,0x0E2C,0x0E2D,0x0E2E,0x0E2F,
+ 0x0E30,0x0E31,0x0E32,0x0E33,0x0E34,0x0E35,0x0E36,0x0E37,
+ 0x0E38,0x0E39,0x0E3A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x0E3F,
+ 0x0E40,0x0E41,0x0E42,0x0E43,0x0E44,0x0E45,0x0E46,0x0E47,
+ 0x0E48,0x0E49,0x0E4A,0x0E4B,0x0E4C,0x0E4D,0x0E4E,0x0E4F,
+ 0x0E50,0x0E51,0x0E52,0x0E53,0x0E54,0x0E55,0x0E56,0x0E57,
+ 0x0E58,0x0E59,0x0E5A,0x0E5B,0xFFFF,0xFFFF,0xFFFF,0xFFFF } },
+ { RTL_TEXTENCODING_MS_1255,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,
+ 0x02C6,0x2030,0xFFFF,0x2039,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0x02DC,0x2122,0xFFFF,0x203A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x20AA,0x00A5,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0x00D7,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x00B9,0x00F7,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
+ 0x05B0,0x05B1,0x05B2,0x05B3,0x05B4,0x05B5,0x05B6,0x05B7,
+ 0x05B8,0x05B9,0xFFFF,0x05BB,0x05BC,0x05BD,0x05BE,0x05BF,
+ 0x05C0,0x05C1,0x05C2,0x05C3,0x05F0,0x05F1,0x05F2,0x05F3,
+ 0x05F4,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7,
+ 0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF,
+ 0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7,
+ 0x05E8,0x05E9,0x05EA,0xFFFF,0xFFFF,0x200E,0x200F,0xFFFF } },
+ { RTL_TEXTENCODING_MS_1256,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0x067E,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,
+ 0x02C6,0x2030,0x0679,0x2039,0x0152,0x0686,0x0698,0x0688,
+ 0x06AF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0x06A9,0x2122,0x0691,0x203A,0x0153,0x200C,0x200D,0x06BA,
+ 0x00A0,0x060C,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0x06BE,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x00B9,0x061B,0x00BB,0x00BC,0x00BD,0x00BE,0x061F,
+ 0x06C1,0x0621,0x0622,0x0623,0x0624,0x0625,0x0626,0x0627,
+ 0x0628,0x0629,0x062A,0x062B,0x062C,0x062D,0x062E,0x062F,
+ 0x0630,0x0631,0x0632,0x0633,0x0634,0x0635,0x0636,0x00D7,
+ 0x0637,0x0638,0x0639,0x063A,0x0640,0x0641,0x0642,0x0643,
+ 0x00E0,0x0644,0x00E2,0x0645,0x0646,0x0647,0x0648,0x00E7,
+ 0x00E8,0x00E9,0x00EA,0x00EB,0x0649,0x064A,0x00EE,0x00EF,
+ 0x064B,0x064C,0x064D,0x064E,0x00F4,0x064F,0x0650,0x00F7,
+ 0x0651,0x00F9,0x0652,0x00FB,0x00FC,0x200E,0x200F,0x06D2 } },
+ { RTL_TEXTENCODING_MS_1257,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0x201A,0xFFFF,0x201E,0x2026,0x2020,0x2021,
+ 0xFFFF,0x2030,0xFFFF,0x2039,0xFFFF,0x00A8,0x02C7,0x00B8,
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0xFFFF,0x2122,0xFFFF,0x203A,0xFFFF,0x00AF,0x02DB,0xFFFF,
+ 0x00A0,0xFFFF,0x00A2,0x00A3,0x00A4,0xFFFF,0x00A6,0x00A7,
+ 0x00D8,0x00A9,0x0156,0x00AB,0x00AC,0x00AD,0x00AE,0x00C6,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00F8,0x00B9,0x0157,0x00BB,0x00BC,0x00BD,0x00BE,0x00E6,
+ 0x0104,0x012E,0x0100,0x0106,0x00C4,0x00C5,0x0118,0x0112,
+ 0x010C,0x00C9,0x0179,0x0116,0x0122,0x0136,0x012A,0x013B,
+ 0x0160,0x0143,0x0145,0x00D3,0x014C,0x00D5,0x00D6,0x00D7,
+ 0x0172,0x0141,0x015A,0x016A,0x00DC,0x017B,0x017D,0x00DF,
+ 0x0105,0x012F,0x0101,0x0107,0x00E4,0x00E5,0x0119,0x0113,
+ 0x010D,0x00E9,0x017A,0x0117,0x0123,0x0137,0x012B,0x013C,
+ 0x0161,0x0144,0x0146,0x00F3,0x014D,0x00F5,0x00F6,0x00F7,
+ 0x0173,0x0142,0x015B,0x016B,0x00FC,0x017C,0x017E,0x02D9 } },
+ { RTL_TEXTENCODING_MS_1258,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x20AC,0xFFFF,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,
+ 0x02C6,0x2030,0xFFFF,0x2039,0x0152,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0x02DC,0x2122,0xFFFF,0x203A,0x0153,0xFFFF,0xFFFF,0x0178,
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
+ 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
+ 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
+ 0x00C0,0x00C1,0x00C2,0x0102,0x00C4,0x00C5,0x00C6,0x00C7,
+ 0x00C8,0x00C9,0x00CA,0x00CB,0x0300,0x00CD,0x00CE,0x00CF,
+ 0x0110,0x00D1,0x0309,0x00D3,0x00D4,0x01A0,0x00D6,0x00D7,
+ 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x01AF,0x0303,0x00DF,
+ 0x00E0,0x00E1,0x00E2,0x0103,0x00E4,0x00E5,0x00E6,0x00E7,
+ 0x00E8,0x00E9,0x00EA,0x00EB,0x0301,0x00ED,0x00EE,0x00EF,
+ 0x0111,0x00F1,0x0323,0x00F3,0x00F4,0x01A1,0x00F6,0x00F7,
+ 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x01B0,0x20AB,0x00FF } },
+ { RTL_TEXTENCODING_KOI8_U, // RFC 2319
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524,
+ 0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590,
+ 0x2591,0x2592,0x2593,0x2320,0x25A0,0x2219,0x221A,0x2248,
+ 0x2264,0x2265,0x00A0,0x2321,0x00B0,0x00B2,0x00B7,0x00F7,
+ 0x2550,0x2551,0x2552,0x0451,0x0454,0x2554,0x0456,0x0457,
+ 0x2557,0x2558,0x2559,0x255A,0x255B,0x0491,0x255D,0x255E,
+ 0x255F,0x2560,0x2561,0x0401,0x0404,0x2563,0x0406,0x0407,
+ 0x2566,0x2567,0x2568,0x2569,0x256A,0x0490,0x256C,0x00A9,
+ 0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433,
+ 0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,
+ 0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432,
+ 0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A,
+ 0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413,
+ 0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,
+ 0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412,
+ 0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A } },
+ { RTL_TEXTENCODING_ISCII_DEVANAGARI,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x0901,0x0902,0x0903,0x0905,0x0906,0x0907,0x0908,
+ 0x0909,0x090A,0x090B,0x090E,0x090F,0x0910,0x090D,0x0912,
+ 0x0913,0x0914,0x0911,0x0915,0x0916,0x0917,0x0918,0x0919,
+ 0x091A,0x091B,0x091C,0x091D,0x091E,0x091F,0x0920,0x0921,
+ 0x0922,0x0923,0x0924,0x0925,0x0926,0x0927,0x0928,0x0929,
+ 0x092A,0x092B,0x092C,0x092D,0x092E,0x092F,0x095F,0x0930,
+ 0x0931,0x0932,0x0933,0x0934,0x0935,0x0936,0x0937,0x0938,
+ 0x0939,0xFFFF,0x093E,0x093F,0x0940,0x0941,0x0942,0x0943,
+ 0x0946,0x0947,0x0948,0x0945,0x094A,0x094B,0x094C,0x0949,
+ 0x094D,0x093C,0x0964,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x0966,0x0967,0x0968,0x0969,0x096A,0x096B,0x096C,
+ 0x096D,0x096E,0x096F,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF } },
+ { RTL_TEXTENCODING_ADOBE_STANDARD,
+ { 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x2019,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x2018,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x00A1,0x00A2,0x00A3,0x2215,0x00A5,0x0192,0x00A7,
+ 0x00A4,0x0027,0x201C,0x00AB,0x2039,0x203A,0xFB01,0xFB02,
+ 0xFFFF,0x2013,0x2020,0x2021,0x00B7,0xFFFF,0x00B6,0x2022,
+ 0x201A,0x201E,0x201D,0x00BB,0x2026,0x2030,0xFFFF,0x00BF,
+ 0xFFFF,0x0060,0x00B4,0x02C6,0x02DC,0x00AF,0x02D8,0x02D9,
+ 0x00A8,0xFFFF,0x02DA,0x00B8,0xFFFF,0x02DD,0x02DB,0x02C7,
+ 0x2014,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x00C6,0xFFFF,0x00AA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x0141,0x00D8,0x0152,0x00BA,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0x00E6,0xFFFF,0xFFFF,0xFFFF,0x0131,0xFFFF,0xFFFF,
+ 0x0142,0x00F8,0x0153,0x00DF,0xFFFF,0xFFFF,0xFFFF,0xFFFF } },
+ { RTL_TEXTENCODING_ADOBE_SYMBOL,
+ { 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x0020,0x0021,0x2200,0x0023,0x2203,0x0025,0x0026,0x220B,
+ 0x0028,0x0029,0x2217,0x002B,0x002C,0x2212,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x2245,0x0391,0x0392,0x03A7,0x0394,0x0395,0x03A6,0x0393,
+ 0x0397,0x0399,0x03D1,0x039A,0x039B,0x039C,0x039D,0x039F,
+ 0x03A0,0x0398,0x03A1,0x03A3,0x03A4,0x03A5,0x03C2,0x03A9,
+ 0x039E,0x03A8,0x0396,0x005B,0x2234,0x005D,0x22A5,0x005F,
+ 0xF8E5,0x03B1,0x03B2,0x03C7,0x03B4,0x03B5,0x03C6,0x03B3,
+ 0x03B7,0x03B9,0x03D5,0x03BA,0x03BB,0x03BC,0x03BD,0x03BF,
+ 0x03C0,0x03B8,0x03C1,0x03C3,0x03C4,0x03C5,0x03D6,0x03C9,
+ 0x03BE,0x03C8,0x03B6,0x007B,0x007C,0x007D,0x223C,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0x20AC,0x03D2,0x2032,0x2264,0x2215,0x221E,0x0192,0x2663,
+ 0x2666,0x2665,0x2660,0x2194,0x2190,0x2191,0x2192,0x2193,
+ 0x00B0,0x00B1,0x2033,0x2265,0x00D7,0x221D,0x2202,0x2022,
+ 0x00F7,0x2260,0x2261,0x2248,0x2026,0x23AF,0x23D0,0x21B5,
+ 0x2135,0x2111,0x211C,0x2118,0x2297,0x2295,0x2205,0x2229,
+ 0x222A,0x2283,0x2287,0x2284,0x2282,0x2286,0x2208,0x2209,
+ 0x2220,0x2207,0xF6DA,0xF6D9,0xF6DB,0x220F,0x221A,0x22C5,
+ 0x00AC,0x2227,0x2228,0x21D4,0x21D0,0x21D1,0x21D2,0x21D3,
+ 0x25CA,0x2329,0xF8E8,0xF8E9,0xF8EA,0x2211,0x239B,0x239C,
+ 0x239D,0x23A1,0x23A2,0x23A3,0x23A7,0x23A8,0x23A9,0x23AA,
+ 0xFFFF,0x232A,0x222B,0x2320,0x23AE,0x2321,0x239E,0x239F,
+ 0x23A0,0x23A4,0x23A5,0x23A6,0x23AB,0x23AC,0x23AD,0xFFFF } },
+ { RTL_TEXTENCODING_ADOBE_DINGBATS,
+ { 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+// 20
+ 0x0020,0x2701,0x2702,0x2703,0x2704,0x260E,0x2706,0x2707,
+ 0x2708,0x2709,0x261B,0x261E,0x270C,0x270D,0x270E,0x270F,
+ 0x2710,0x2711,0x2712,0x2713,0x2714,0x2715,0x2716,0x2717,
+ 0x2718,0x2719,0x271A,0x271B,0x271C,0x271D,0x271E,0x271F,
+// 40
+ 0x2720,0x2721,0x2722,0x2723,0x2724,0x2725,0x2726,0x2727,
+ 0x2605,0x2729,0x272A,0x272B,0x272C,0x272D,0x272E,0x272F,
+ 0x2730,0x2731,0x2732,0x2733,0x2734,0x2735,0x2736,0x2737,
+ 0x2738,0x2739,0x273A,0x273B,0x273C,0x273D,0x273E,0x273F,
+// 60
+ 0x2740,0x2741,0x2742,0x2743,0x2744,0x2745,0x2746,0x2747,
+ 0x2748,0x2749,0x274A,0x274B,0x27CF,0x274D,0x25A0,0x274F,
+ 0x2750,0x2751,0x2752,0x25B2,0x25BC,0x25C6,0x2756,0x25D7,
+ 0x2758,0x2759,0x275A,0x275B,0x275C,0x275D,0x275E,0xFFFF,
+// 80
+ 0xF8D7,0xF8D8,0xF8D9,0xF8DA,0xF8DB,0xF8DC,0xF8DD,0xF8DE,
+ 0xF8DF,0xF8E0,0xF8E1,0xF8E2,0xF8E3,0xF8E4,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+ 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
+// A0
+ 0xFFFF,0x2761,0x2762,0x2763,0x2764,0x2765,0x2766,0x2767,
+ 0x2663,0x2666,0x2665,0x2660,0x2460,0x2461,0x2462,0x2463,
+ 0x2464,0x2465,0x2466,0x2467,0x2468,0x2469,0x2776,0x2777,
+ 0x2778,0x2779,0x277A,0x277B,0x277C,0x277D,0x277E,0x277F,
+// C0
+ 0x2780,0x2781,0x2782,0x2783,0x2784,0x2785,0x2786,0x2787,
+ 0x2788,0x2789,0x278A,0x278B,0x278C,0x278D,0x278E,0x278F,
+ 0x2790,0x2791,0x2792,0x2793,0x2794,0x2795,0x2796,0x2797,
+ 0x2798,0x2799,0x279A,0x279B,0x279C,0x279D,0x279E,0x279F,
+// E0
+ 0x27A0,0x27A1,0x27A2,0x27A3,0x27A4,0x27A5,0x27A6,0x27A7,
+ 0x27A8,0x27A9,0x27AA,0x27AB,0x27AC,0x27AD,0x27AE,0x27AF,
+ 0xFFFF,0x27B1,0x27B2,0x27B3,0x27B4,0x27B5,0x27B6,0x27B7,
+ 0x27B8,0x27B9,0x27BA,0x27BB,0x27BC,0x27BD,0x27BE,0xFFFF } },
+ { RTL_TEXTENCODING_PT154,
+ { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
+ 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
+ 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
+ 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
+ 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
+ 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
+ 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
+ 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
+ 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
+ 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
+ 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
+ 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
+ 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
+ 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
+ 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
+ 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
+ 0x0496,0x0492,0x04EE,0x0493,0x201E,0x2026,0x04B6,0x04AE,
+ 0x04B2,0x04AF,0x04A0,0x04E2,0x04A2,0x049A,0x04BA,0x04B8,
+ 0x0497,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
+ 0x04B3,0x04B7,0x04A1,0x04E3,0x04A3,0x049B,0x04BB,0x04B9,
+ 0x00A0,0x040E,0x045E,0x0408,0x04E8,0x0498,0x04B0,0x00A7,
+ 0x0401,0x00A9,0x04D8,0x00AB,0x00AC,0x04EF,0x00AE,0x049C,
+ 0x00B0,0x04B1,0x0406,0x0456,0x0499,0x04E9,0x00B6,0x00B7,
+ 0x0451,0x2116,0x04D9,0x00BB,0x0458,0x04AA,0x04AB,0x049D,
+ 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,
+ 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
+ 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,
+ 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
+ 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,
+ 0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
+ 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,
+ 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F } } };
+ for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) {
+ testSingleByteCharSet(data[i]);
+ }
+}
+
+void Test::testComplex() {
+ static ComplexCharSetTest const data[]
+ = { { RTL_TEXTENCODING_ASCII_US,
+ RTL_CONSTASCII_STRINGPARAM("\x01\"3De$~"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x007E },
+ 7,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_CN,
+ RTL_CONSTASCII_STRINGPARAM("\x01\"3De$~\xA1\xB9\xF0\xC5"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x007E,
+ 0x300D,0x9E4B },
+ 9,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_TW,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x01\"3De$~\xC5\xF0\x8E\xA4\xDC\xD9"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x007E,
+ 0x4ED9,0xD87E,0xDD68 },
+ 10,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_GB_18030,
+ RTL_CONSTASCII_STRINGPARAM("\x01\"3De$~"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x007E },
+ 7,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_GB_18030,
+ RTL_CONSTASCII_STRINGPARAM("\x81\x40\xFE\xFE"),
+ { 0x4E02,0xE4C5 },
+ 2,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_GB_18030,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x81\x30\xB1\x33\x81\x30\xD3\x30\x81\x36\xA5\x31"),
+ { 0x028A,0x0452,0x200F },
+ 3,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_GB_18030,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xFE\x50\xFE\x51\xFE\x52\xFE\x53\xFE\x54\xFE\x55\xFE\x56"
+ "\xFE\x57\xFE\x58\xFE\x59\xFE\x5A\xFE\x5B\xFE\x5C\xFE\x5D"
+ "\xFE\x5E\xFE\x5F\xFE\x60\xFE\x61\xFE\x62\xFE\x63\xFE\x64"
+ "\xFE\x65\xFE\x66\xFE\x67\xFE\x68\xFE\x69\xFE\x6A\xFE\x6B"
+ "\xFE\x6C\xFE\x6D\xFE\x6E\xFE\x6F\xFE\x70\xFE\x71\xFE\x72"
+ "\xFE\x73\xFE\x74\xFE\x75\xFE\x76\xFE\x77\xFE\x78\xFE\x79"
+ "\xFE\x7A\xFE\x7B\xFE\x7C\xFE\x7D\xFE\x7E\xFE\x80\xFE\x81"
+ "\xFE\x82\xFE\x83\xFE\x84\xFE\x85\xFE\x86\xFE\x87\xFE\x88"
+ "\xFE\x89\xFE\x8A\xFE\x8B\xFE\x8C\xFE\x8D\xFE\x8E\xFE\x8F"
+ "\xFE\x90\xFE\x91\xFE\x92\xFE\x93\xFE\x94\xFE\x95\xFE\x96"
+ "\xFE\x97\xFE\x98\xFE\x99\xFE\x9A\xFE\x9B\xFE\x9C\xFE\x9D"
+ "\xFE\x9E\xFE\x9F\xFE\xA0"),
+ { 0x2E81,0xE816,0xE817,0xE818,0x2E84,0x3473,0x3447,0x2E88,
+ 0x2E8B,0xE81E,0x359E,0x361A,0x360E,0x2E8C,0x2E97,0x396E,
+ 0x3918,0xE826,0x39CF,0x39DF,0x3A73,0x39D0,0xE82B,0xE82C,
+ 0x3B4E,0x3C6E,0x3CE0,0x2EA7,0xE831,0xE832,0x2EAA,0x4056,
+ 0x415F,0x2EAE,0x4337,0x2EB3,0x2EB6,0x2EB7,0xE83B,0x43B1,
+ 0x43AC,0x2EBB,0x43DD,0x44D6,0x4661,0x464C,0xE843,0x4723,
+ 0x4729,0x477C,0x478D,0x2ECA,0x4947,0x497A,0x497D,0x4982,
+ 0x4983,0x4985,0x4986,0x499F,0x499B,0x49B7,0x49B6,0xE854,
+ 0xE855,0x4CA3,0x4C9F,0x4CA0,0x4CA1,0x4C77,0x4CA2,0x4D13,
+ 0x4D14,0x4D15,0x4D16,0x4D17,0x4D18,0x4D19,0x4DAE,0xE864 },
+ 80,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_JP,
+ RTL_CONSTASCII_STRINGPARAM("\x01\"3De$\\~"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x005C,0x007E },
+ 8,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_JP,
+ RTL_CONSTASCII_STRINGPARAM("\x1B(B\x01\"3De$\\~"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x005C,0x007E },
+ 8,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_JP,
+ RTL_CONSTASCII_STRINGPARAM("\x1B(J\x01\"3De$\\~"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x00A5,0x00AF },
+ 8,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_JP,
+ RTL_CONSTASCII_STRINGPARAM("\x1B$B\x26\x21\x27\x71\x1B(B"),
+ { 0x0391,0x044F },
+ 2,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_KR,
+ RTL_CONSTASCII_STRINGPARAM("\x1B$)C\x01\"3De$\\~"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x005C,0x007E },
+ 8,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_KR,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x1B$)C\x0E\x25\x21\x0F\x0D\x0Ax\x0E\x48\x7E\x0F"),
+ { 0x2170,0x000D,0x000A,0x0078,0xD79D },
+ 5,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_CN,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x01\"3De$\\~\x1B$)G\x0E\x45\x70\x1B$*H\x1BN\x22\x22"
+ "\x45\x70\x0F\x1B$)A\x0E\x26\x21\x0F"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x005C,0x007E,
+ 0x4ED9,0x531F,0x4ED9,0x0391 },
+ 12,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_CN,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x01\"3De$\\~\x1B$)A\x0E\x26\x21\x1B$*H\x1BN\x22\x22"
+ "\x26\x21\x0F\x0D\x0A\x1B$)A\x0E\x26\x21\x0F"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x005C,0x007E,
+ 0x0391,0x531F,0x0391,0x000D,0x000A,0x0391 },
+ 14,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ // The following does not work as long as Big5-HKSCS maps to
+ // Unicode PUA instead of Plane 2. Use the next two tests
+ // instead:
+// { RTL_TEXTENCODING_BIG5_HKSCS,
+// RTL_CONSTASCII_STRINGPARAM(
+// "\x01\"3De$~\x88\x56\xF9\xFE\xFA\x5E\xA1\x40\xF9\xD5"),
+// { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x007E,0x0100,
+// 0xFFED,0xD849,0xDD13,0x3000,0x9F98 },
+// 13,
+// true,
+// true,
+// true,
+// false,
+// RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x01\"3De$~\x88\x56\xF9\xFE\xFA\x5E\xA1\x40\xF9\xD5"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x007E,0x0100,
+ 0xFFED,0xE01E,0x3000,0x9F98 },
+ 12,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x01\"3De$~\x88\x56\xF9\xFE\xFA\x5E\xA1\x40\xF9\xD5"),
+ { 0x0001,0x0022,0x0033,0x0044,0x0065,0x0024,0x007E,0x0100,
+ 0xFFED,0xD849,0xDD13,0x3000,0x9F98 },
+ 13,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC6\xA1\xC6\xCF\xC6\xD3\xC6\xD5\xC6\xD7\xC6\xDE\xC6\xDF"
+ "\xC6\xFE\xC7\x40\xC7\x7E\xC7\xA1\xC7\xFE"),
+ { 0x2460,0xF6E0,0xF6E4,0xF6E6,0xF6E8,0xF6EF,0xF6F0,0x3058,
+ 0x3059,0x30A4,0x30A5,0x041A },
+ 12,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM("\x81\x40\x84\xFE"),
+ { 0xEEB8,0xF12B },
+ 2,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x81\x40\x8D\xFE\x8E\x40\xA0\xFE\xC6\xA1\xC8\xFE\xFA\x40"
+ "\xFE\xFE"),
+ { 0xEEB8,0xF6B0,0xE311,0xEEB7,0xF6B1,0xF848,0xE000,0xE310 },
+ 8,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM("\xAD\xC5\x94\x55"),
+ { 0x5029,0x7250 },
+ 2,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM("\xFA\x5F\xA0\xE4"),
+ { 0x5029,0x7250 },
+ 2,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM("\xA0\x40\xA0\x7E\xA0\xA1\xA0\xFE"),
+ { 0xEE1B,0xEE59,0xEE5A,0xEEB7 },
+ 4,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5,
+ RTL_CONSTASCII_STRINGPARAM("\xA1\x45"),
+ { 0x2027 },
+ 1,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC6\xCF\xC6\xD3\xC6\xD5\xC6\xD7\xC6\xDE\xC6\xDF"),
+ { 0x306B,0x306F,0x3071,0x3073,0x307A,0x307B },
+ 6,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC7\xFD\xC7\xFE\xC8\x40\xC8\x7E\xC8\xA1\xC8\xFE"),
+ { 0xF7AA,0xF7AB,0xF7AC,0xF7EA,0xF7EB,0xF848 },
+ 6,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5,
+ RTL_CONSTASCII_STRINGPARAM("\xA0\x40\xA0\x7E\xA0\xA1\xA0\xFE"),
+ { 0xEE1B,0xEE59,0xEE5A,0xEEB7 },
+ 4,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_MS_950,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC6\xA1\xC6\xFE\xC7\x40\xC7\x7E\xC7\xA1\xC7\xFE\xC8\x40"
+ "\xC8\x7E\xC8\xA1\xC8\xFE"),
+ { 0xF6B1,0xF70E,0xF70F,0xF74D,0xF74E,0xF7AB,0xF7AC,0xF7EA,
+ 0xF7EB,0xF848 },
+ 10,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_MS_950,
+ RTL_CONSTASCII_STRINGPARAM("\xA0\x40\xA0\x7E\xA0\xA1\xA0\xFE"),
+ { 0xEE1B,0xEE59,0xEE5A,0xEEB7 },
+ 4,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ // Test Unicode beyond BMP:
+
+ // FIXME The second m_bForward test (requiring a context) does not
+ // work for UTF7:
+// { RTL_TEXTENCODING_UTF7,
+// RTL_CONSTASCII_STRINGPARAM("+2EndEw-"),
+// { 0xD849,0xDD13 },
+// 2,
+// true,
+// true,
+// true,
+// false,
+// RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\xF0\xA2\x94\x93"),
+ { 0xD849,0xDD13 },
+ 2,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_GB_18030,
+ RTL_CONSTASCII_STRINGPARAM("\x95\x39\xC5\x37"),
+ { 0xD849,0xDD13 },
+ 2,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_BIG5_HKSCS,
+ RTL_CONSTASCII_STRINGPARAM("\xFA\x5E"),
+ { 0xD849,0xDD13 },
+ 2,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ // Test GBK (aka CP936):
+
+ { RTL_TEXTENCODING_GBK,
+ RTL_CONSTASCII_STRINGPARAM("\xFD\x7C\xC1\xFA\xFD\x9B"),
+ { 0x9F76,0x9F99,0x9FA5 },
+ 3,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_MS_936,
+ RTL_CONSTASCII_STRINGPARAM("\xFD\x7C\xC1\xFA\xFD\x9B"),
+ { 0x9F76,0x9F99,0x9FA5 },
+ 3,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_GBK,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xFE\x50\xFE\x54\xFE\x55\xFE\x56"
+ "\xFE\x57\xFE\x58\xFE\x5A\xFE\x5B\xFE\x5C\xFE\x5D"
+ "\xFE\x5E\xFE\x5F\xFE\x60\xFE\x62\xFE\x63\xFE\x64"
+ "\xFE\x65\xFE\x68\xFE\x69\xFE\x6A\xFE\x6B"
+ "\xFE\x6E\xFE\x6F\xFE\x70\xFE\x71\xFE\x72"
+ "\xFE\x73\xFE\x74\xFE\x75\xFE\x77\xFE\x78\xFE\x79"
+ "\xFE\x7A\xFE\x7B\xFE\x7C\xFE\x7D\xFE\x80\xFE\x81"
+ "\xFE\x82\xFE\x83\xFE\x84\xFE\x85\xFE\x86\xFE\x87\xFE\x88"
+ "\xFE\x89\xFE\x8A\xFE\x8B\xFE\x8C\xFE\x8D\xFE\x8E\xFE\x8F"
+ "\xFE\x92\xFE\x93\xFE\x94\xFE\x95\xFE\x96"
+ "\xFE\x97\xFE\x98\xFE\x99\xFE\x9A\xFE\x9B\xFE\x9C\xFE\x9D"
+ "\xFE\x9E\xFE\x9F"),
+ { 0x2E81,0x2E84,0x3473,0x3447,0x2E88,0x2E8B,0x359E,0x361A,
+ 0x360E,0x2E8C,0x2E97,0x396E,0x3918,0x39CF,0x39DF,0x3A73,
+ 0x39D0,0x3B4E,0x3C6E,0x3CE0,0x2EA7,0x2EAA,0x4056,0x415F,
+ 0x2EAE,0x4337,0x2EB3,0x2EB6,0x2EB7,0x43B1,0x43AC,0x2EBB,
+ 0x43DD,0x44D6,0x4661,0x464C,0x4723,0x4729,0x477C,0x478D,
+ 0x2ECA,0x4947,0x497A,0x497D,0x4982,0x4983,0x4985,0x4986,
+ 0x499F,0x499B,0x49B7,0x49B6,0x4CA3,0x4C9F,0x4CA0,0x4CA1,
+ 0x4C77,0x4CA2,0x4D13,0x4D14,0x4D15,0x4D16,0x4D17,0x4D18,
+ 0x4D19,0x4DAE },
+ 66,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_JP,
+ RTL_CONSTASCII_STRINGPARAM("?"),
+ { 0xFF0D },
+ 1,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK },
+
+ // Test of "JIS X 0208 row 13" (taken from CP932; added to
+ // ISO-2022-JP and EUC-JP; 74 of the 83 characters introduce
+ // mappings to new Unicode characters):
+ { RTL_TEXTENCODING_MS_932,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x87\x40\x87\x41\x87\x42\x87\x43\x87\x44\x87\x45\x87\x46"
+ "\x87\x47\x87\x48\x87\x49\x87\x4A\x87\x4B\x87\x4C\x87\x4D"
+ "\x87\x4E\x87\x4F\x87\x50\x87\x51\x87\x52\x87\x53\x87\x54"
+ "\x87\x55\x87\x56\x87\x57\x87\x58\x87\x59\x87\x5A\x87\x5B"
+ "\x87\x5C\x87\x5D\x87\x5F\x87\x60\x87\x61\x87\x62\x87\x63"
+ "\x87\x64\x87\x65\x87\x66\x87\x67\x87\x68\x87\x69\x87\x6A"
+ "\x87\x6B\x87\x6C\x87\x6D\x87\x6E\x87\x6F\x87\x70\x87\x71"
+ "\x87\x72\x87\x73\x87\x74\x87\x75\x87\x7E\x87\x80\x87\x81"
+ "\x87\x82\x87\x83\x87\x84\x87\x85\x87\x86\x87\x87\x87\x88"
+ "\x87\x89\x87\x8A\x87\x8B\x87\x8C\x87\x8D\x87\x8E\x87\x8F"
+ "\x87\x90\x87\x91\x87\x92\x87\x93\x87\x94\x87\x95\x87\x96"
+ "\x87\x97\x87\x98\x87\x99\x87\x9A\x87\x9B\x87\x9C"),
+ { 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,
+ 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,
+ 0x2472,0x2473,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,
+ 0x2167,0x2168,0x2169,0x3349,0x3314,0x3322,0x334D,0x3318,0x3327,
+ 0x3303,0x3336,0x3351,0x3357,0x330D,0x3326,0x3323,0x332B,0x334A,
+ 0x333B,0x339C,0x339D,0x339E,0x338E,0x338F,0x33C4,0x33A1,0x337B,
+ 0x301D,0x301F,0x2116,0x33CD,0x2121,0x32A4,0x32A5,0x32A6,0x32A7,
+ 0x32A8,0x3231,0x3232,0x3239,0x337E,0x337D,0x337C,0x2252,0x2261,
+ 0x222B,0x222E,0x2211,0x221A,0x22A5,0x2220,0x221F,0x22BF,0x2235,
+ 0x2229,0x222A },
+ 83,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_SHIFT_JIS,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x87\x40\x87\x41\x87\x42\x87\x43\x87\x44\x87\x45\x87\x46"
+ "\x87\x47\x87\x48\x87\x49\x87\x4A\x87\x4B\x87\x4C\x87\x4D"
+ "\x87\x4E\x87\x4F\x87\x50\x87\x51\x87\x52\x87\x53\x87\x54"
+ "\x87\x55\x87\x56\x87\x57\x87\x58\x87\x59\x87\x5A\x87\x5B"
+ "\x87\x5C\x87\x5D\x87\x5F\x87\x60\x87\x61\x87\x62\x87\x63"
+ "\x87\x64\x87\x65\x87\x66\x87\x67\x87\x68\x87\x69\x87\x6A"
+ "\x87\x6B\x87\x6C\x87\x6D\x87\x6E\x87\x6F\x87\x70\x87\x71"
+ "\x87\x72\x87\x73\x87\x74\x87\x75\x87\x7E\x87\x80\x87\x81"
+ "\x87\x82\x87\x83\x87\x84\x87\x85\x87\x86\x87\x87\x87\x88"
+ "\x87\x89\x87\x8A\x87\x8B\x87\x8C\x87\x8D\x87\x8E\x87\x8F"
+ "\x87\x90\x87\x91\x87\x92\x87\x93\x87\x94\x87\x95\x87\x96"
+ "\x87\x97\x87\x98\x87\x99\x87\x9A\x87\x9B\x87\x9C"),
+ { 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,
+ 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,
+ 0x2472,0x2473,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,
+ 0x2167,0x2168,0x2169,0x3349,0x3314,0x3322,0x334D,0x3318,0x3327,
+ 0x3303,0x3336,0x3351,0x3357,0x330D,0x3326,0x3323,0x332B,0x334A,
+ 0x333B,0x339C,0x339D,0x339E,0x338E,0x338F,0x33C4,0x33A1,0x337B,
+ 0x301D,0x301F,0x2116,0x33CD,0x2121,0x32A4,0x32A5,0x32A6,0x32A7,
+ 0x32A8,0x3231,0x3232,0x3239,0x337E,0x337D,0x337C,0x2252,0x2261,
+ 0x222B,0x222E,0x2211,0x221A,0x22A5,0x2220,0x221F,0x22BF,0x2235,
+ 0x2229,0x222A },
+ 83,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_JP,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x1B$B\x2D\x21\x2D\x22\x2D\x23\x2D\x24\x2D\x25\x2D\x26"
+ "\x2D\x27\x2D\x28\x2D\x29\x2D\x2A\x2D\x2B\x2D\x2C\x2D\x2D"
+ "\x2D\x2E\x2D\x2F\x2D\x30\x2D\x31\x2D\x32\x2D\x33\x2D\x34"
+ "\x2D\x35\x2D\x36\x2D\x37\x2D\x38\x2D\x39\x2D\x3A\x2D\x3B"
+ "\x2D\x3C\x2D\x3D\x2D\x3E\x2D\x40\x2D\x41\x2D\x42\x2D\x43"
+ "\x2D\x44\x2D\x45\x2D\x46\x2D\x47\x2D\x48\x2D\x49\x2D\x4A"
+ "\x2D\x4B\x2D\x4C\x2D\x4D\x2D\x4E\x2D\x4F\x2D\x50\x2D\x51"
+ "\x2D\x52\x2D\x53\x2D\x54\x2D\x55\x2D\x56\x2D\x5F\x2D\x60"
+ "\x2D\x61\x2D\x62\x2D\x63\x2D\x64\x2D\x65\x2D\x66\x2D\x67"
+ "\x2D\x68\x2D\x69\x2D\x6A\x2D\x6B\x2D\x6C\x2D\x6D\x2D\x6E"
+ "\x2D\x6F\x2D\x70\x2D\x71\x2D\x72\x2D\x73\x2D\x74\x2D\x75"
+ "\x2D\x76\x2D\x77\x2D\x78\x2D\x79\x2D\x7A\x2D\x7B\x2D\x7C"
+ "\x1B(B"),
+ { 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,
+ 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,
+ 0x2472,0x2473,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,
+ 0x2167,0x2168,0x2169,0x3349,0x3314,0x3322,0x334D,0x3318,0x3327,
+ 0x3303,0x3336,0x3351,0x3357,0x330D,0x3326,0x3323,0x332B,0x334A,
+ 0x333B,0x339C,0x339D,0x339E,0x338E,0x338F,0x33C4,0x33A1,0x337B,
+ 0x301D,0x301F,0x2116,0x33CD,0x2121,0x32A4,0x32A5,0x32A6,0x32A7,
+ 0x32A8,0x3231,0x3232,0x3239,0x337E,0x337D,0x337C,0x2252,0x2261,
+ 0x222B,0x222E,0x2211,0x221A,0x22A5,0x2220,0x221F,0x22BF,0x2235,
+ 0x2229,0x222A },
+ 83,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_2022_JP,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x1B$B\x2D\x21\x2D\x22\x2D\x23\x2D\x24\x2D\x25\x2D\x26"
+ "\x2D\x27\x2D\x28\x2D\x29\x2D\x2A\x2D\x2B\x2D\x2C\x2D\x2D"
+ "\x2D\x2E\x2D\x2F\x2D\x30\x2D\x31\x2D\x32\x2D\x33\x2D\x34"
+ "\x2D\x35\x2D\x36\x2D\x37\x2D\x38\x2D\x39\x2D\x3A\x2D\x3B"
+ "\x2D\x3C\x2D\x3D\x2D\x3E\x2D\x40\x2D\x41\x2D\x42\x2D\x43"
+ "\x2D\x44\x2D\x45\x2D\x46\x2D\x47\x2D\x48\x2D\x49\x2D\x4A"
+ "\x2D\x4B\x2D\x4C\x2D\x4D\x2D\x4E\x2D\x4F\x2D\x50\x2D\x51"
+ "\x2D\x52\x2D\x53\x2D\x54\x2D\x55\x2D\x56\x2D\x5F\x2D\x60"
+ "\x2D\x61\x2D\x62\x2D\x63\x2D\x64\x2D\x65\x2D\x66\x2D\x67"
+ "\x2D\x68\x2D\x69\x2D\x6A\x2D\x6B\x2D\x6C\x2D\x6D\x2D\x6E"
+ "\x2D\x6F\x2D\x73\x2D\x74\x2D\x78\x2D\x79\x1B(B"),
+ { 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,
+ 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,
+ 0x2472,0x2473,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,
+ 0x2167,0x2168,0x2169,0x3349,0x3314,0x3322,0x334D,0x3318,0x3327,
+ 0x3303,0x3336,0x3351,0x3357,0x330D,0x3326,0x3323,0x332B,0x334A,
+ 0x333B,0x339C,0x339D,0x339E,0x338E,0x338F,0x33C4,0x33A1,0x337B,
+ 0x301D,0x301F,0x2116,0x33CD,0x2121,0x32A4,0x32A5,0x32A6,0x32A7,
+ 0x32A8,0x3231,0x3232,0x3239,0x337E,0x337D,0x337C,0x222E,0x2211,
+ 0x221F,0x22BF },
+ 74,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_JP,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xAD\xA1\xAD\xA2\xAD\xA3\xAD\xA4\xAD\xA5\xAD\xA6\xAD\xA7"
+ "\xAD\xA8\xAD\xA9\xAD\xAA\xAD\xAB\xAD\xAC\xAD\xAD\xAD\xAE"
+ "\xAD\xAF\xAD\xB0\xAD\xB1\xAD\xB2\xAD\xB3\xAD\xB4\xAD\xB5"
+ "\xAD\xB6\xAD\xB7\xAD\xB8\xAD\xB9\xAD\xBA\xAD\xBB\xAD\xBC"
+ "\xAD\xBD\xAD\xBE\xAD\xC0\xAD\xC1\xAD\xC2\xAD\xC3\xAD\xC4"
+ "\xAD\xC5\xAD\xC6\xAD\xC7\xAD\xC8\xAD\xC9\xAD\xCA\xAD\xCB"
+ "\xAD\xCC\xAD\xCD\xAD\xCE\xAD\xCF\xAD\xD0\xAD\xD1\xAD\xD2"
+ "\xAD\xD3\xAD\xD4\xAD\xD5\xAD\xD6\xAD\xDF\xAD\xE0\xAD\xE1"
+ "\xAD\xE2\xAD\xE3\xAD\xE4\xAD\xE5\xAD\xE6\xAD\xE7\xAD\xE8"
+ "\xAD\xE9\xAD\xEA\xAD\xEB\xAD\xEC\xAD\xED\xAD\xEE\xAD\xEF"
+ "\xAD\xF0\xAD\xF1\xAD\xF2\xAD\xF3\xAD\xF4\xAD\xF5\xAD\xF6"
+ "\xAD\xF7\xAD\xF8\xAD\xF9\xAD\xFA\xAD\xFB\xAD\xFC"),
+ { 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,
+ 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,
+ 0x2472,0x2473,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,
+ 0x2167,0x2168,0x2169,0x3349,0x3314,0x3322,0x334D,0x3318,0x3327,
+ 0x3303,0x3336,0x3351,0x3357,0x330D,0x3326,0x3323,0x332B,0x334A,
+ 0x333B,0x339C,0x339D,0x339E,0x338E,0x338F,0x33C4,0x33A1,0x337B,
+ 0x301D,0x301F,0x2116,0x33CD,0x2121,0x32A4,0x32A5,0x32A6,0x32A7,
+ 0x32A8,0x3231,0x3232,0x3239,0x337E,0x337D,0x337C,0x2252,0x2261,
+ 0x222B,0x222E,0x2211,0x221A,0x22A5,0x2220,0x221F,0x22BF,0x2235,
+ 0x2229,0x222A },
+ 83,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_JP,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xAD\xA1\xAD\xA2\xAD\xA3\xAD\xA4\xAD\xA5\xAD\xA6\xAD\xA7"
+ "\xAD\xA8\xAD\xA9\xAD\xAA\xAD\xAB\xAD\xAC\xAD\xAD\xAD\xAE"
+ "\xAD\xAF\xAD\xB0\xAD\xB1\xAD\xB2\xAD\xB3\xAD\xB4\xAD\xB5"
+ "\xAD\xB6\xAD\xB7\xAD\xB8\xAD\xB9\xAD\xBA\xAD\xBB\xAD\xBC"
+ "\xAD\xBD\xAD\xBE\xAD\xC0\xAD\xC1\xAD\xC2\xAD\xC3\xAD\xC4"
+ "\xAD\xC5\xAD\xC6\xAD\xC7\xAD\xC8\xAD\xC9\xAD\xCA\xAD\xCB"
+ "\xAD\xCC\xAD\xCD\xAD\xCE\xAD\xCF\xAD\xD0\xAD\xD1\xAD\xD2"
+ "\xAD\xD3\xAD\xD4\xAD\xD5\xAD\xD6\xAD\xDF\xAD\xE0\xAD\xE1"
+ "\xAD\xE2\xAD\xE3\xAD\xE4\xAD\xE5\xAD\xE6\xAD\xE7\xAD\xE8"
+ "\xAD\xE9\xAD\xEA\xAD\xEB\xAD\xEC\xAD\xED\xAD\xEE\xAD\xEF"
+ "\xAD\xF3\xAD\xF4\xAD\xF8\xAD\xF9"),
+ { 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,
+ 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,
+ 0x2472,0x2473,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,
+ 0x2167,0x2168,0x2169,0x3349,0x3314,0x3322,0x334D,0x3318,0x3327,
+ 0x3303,0x3336,0x3351,0x3357,0x330D,0x3326,0x3323,0x332B,0x334A,
+ 0x333B,0x339C,0x339D,0x339E,0x338E,0x338F,0x33C4,0x33A1,0x337B,
+ 0x301D,0x301F,0x2116,0x33CD,0x2121,0x32A4,0x32A5,0x32A6,0x32A7,
+ 0x32A8,0x3231,0x3232,0x3239,0x337E,0x337D,0x337C,0x222E,0x2211,
+ 0x221F,0x22BF },
+ 74,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ { RTL_TEXTENCODING_EUC_JP,
+ RTL_CONSTASCII_STRINGPARAM("\xB9\xF5"),
+ { 0x9ED2 },
+ 1,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ // Test ISO-8859-x/MS-125x range 0x80--9F:
+
+ { RTL_TEXTENCODING_ISO_8859_1,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_2,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_3,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_4,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_5,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_6,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_7,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_8,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_9,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_14,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ISO_8859_15,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E"
+ "\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D"
+ "\x9E\x9F"),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_MS_874,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1250,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1251,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1252,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1253,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1254,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1255,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1256,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1257,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_1258,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,
+ 0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,
+ 0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,
+ 0x009B,0x009C,0x009D,0x009E,0x009F },
+ 32,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_949,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xB0\xA1\xB0\xA2\x81\x41\x81\x42\xB0\xA3\x81\x43\x81\x44"
+ "\xB0\xA4\xB0\xA5\xB0\xA6\xB0\xA7\x81\x45\x81\x46\x81\x47"
+ "\x81\x48\x81\x49\xB0\xA8\xB0\xA9\xB0\xAA\xB0\xAB\xB0\xAC"
+ "\xB0\xAD\xB0\xAE\xB0\xAF\x81\x4A\xB0\xB0\xB0\xB1\xB0\xB2"),
+ { 0xAC00,0xAC01,0xAC02,0xAC03,0xAC04,0xAC05,0xAC06,0xAC07,0xAC08,
+ 0xAC09,0xAC0A,0xAC0B,0xAC0C,0xAC0D,0xAC0E,0xAC0F,0xAC10,0xAC11,
+ 0xAC12,0xAC13,0xAC14,0xAC15,0xAC16,0xAC17,0xAC18,0xAC19,0xAC1A,
+ 0xAC1B },
+ 28,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_MS_949,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC9\xA1\xC9\xA2\xC9\xA3\xC9\xFC\xC9\xFD\xC9\xFE"
+ "\xFE\xA1\xFE\xA2\xFE\xA3\xFE\xFC\xFE\xFD\xFE\xFE"),
+ { 0xE000,0xE001,0xE002,0xE05B,0xE05C,0xE05D,
+ 0xE05E,0xE05F,0xE060,0xE0B9,0xE0BA,0xE0BB },
+ 12,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_KR,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xB0\xA1\xB0\xA2" "\xB0\xA3"
+ "\xB0\xA4\xB0\xA5\xB0\xA6\xB0\xA7"
+ "\xB0\xA8\xB0\xA9\xB0\xAA\xB0\xAB\xB0\xAC"
+ "\xB0\xAD\xB0\xAE\xB0\xAF" "\xB0\xB0\xB0\xB1\xB0\xB2"),
+ { 0xAC00,0xAC01, 0xAC04, 0xAC07,0xAC08,
+ 0xAC09,0xAC0A, 0xAC10,0xAC11,
+ 0xAC12,0xAC13,0xAC14,0xAC15,0xAC16,0xAC17, 0xAC19,0xAC1A,
+ 0xAC1B },
+ 18,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_KR,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xB0\xA1\xB0\xA2" "\xB0\xA3"
+ "\xB0\xA4\xB0\xA5\xB0\xA6\xB0\xA7"
+ "\xB0\xA8\xB0\xA9\xB0\xAA\xB0\xAB\xB0\xAC"
+ "\xB0\xAD\xB0\xAE\xB0\xAF" "\xB0\xB0\xB0\xB1\xB0\xB2"),
+ { 0xAC00,0xAC01,0xAC02,0xAC03,0xAC04,0xAC05,0xAC06,0xAC07,0xAC08,
+ 0xAC09,0xAC0A,0xAC0B,0xAC0C,0xAC0D,0xAC0E,0xAC0F,0xAC10,0xAC11,
+ 0xAC12,0xAC13,0xAC14,0xAC15,0xAC16,0xAC17,0xAC18,0xAC19,0xAC1A,
+ 0xAC1B },
+ 28,
+ true,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_EUC_KR,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC9\xA1\xC9\xA2\xC9\xA3\xC9\xFC\xC9\xFD\xC9\xFE"
+ "\xFE\xA1\xFE\xA2\xFE\xA3\xFE\xFC\xFE\xFD\xFE\xFE"),
+ { 0xE000,0xE001,0xE002,0xE05B,0xE05C,0xE05D,
+ 0xE05E,0xE05F,0xE060,0xE0B9,0xE0BA,0xE0BB },
+ 12,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ // Test UTF-8:
+
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\x00"),
+ { 0x0000 },
+ 1,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\xEF\xBB\xBF"),
+ { 0xFEFF },
+ 1,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\xEF\xBB\xBF\xEF\xBB\xBF"),
+ { 0xFEFF,0xFEFF },
+ 2,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\xEF\xBB\xBF"),
+ { 0 },
+ 0,
+ false,
+ true,
+ true,
+ true,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\xEF\xBB\xBF\xEF\xBB\xBF"),
+ { 0xFEFF },
+ 1,
+ false,
+ true,
+ true,
+ true,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\x01\x02\x7E\x7F"),
+ { 0x0001,0x0002,0x007E,0x007F },
+ 4,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC0\x80\xE0\x80\x81\xF0\x80\x80\x82\xF8\x80\x80\x80\x83"
+ "\xFC\x80\x80\x80\x80\x84"),
+ { 0x0000,0x0001,0x0002,0x0003,0x0004 },
+ 5,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\xED\xA1\x89\xED\xB4\x93"),
+ { 0xD849,0xDD13 },
+ 2,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_UTF8,
+ RTL_CONSTASCII_STRINGPARAM("\xED\xA1\x89\x41"),
+ { 0xD849,0x0041 },
+ 2,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ // Test Java UTF-8:
+
+ { RTL_TEXTENCODING_JAVA_UTF8,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xEF\xBB\xBF\xC0\x80\x01\x20\x41\x7F\xED\xA0\x80"
+ "\xED\xB0\x80"),
+ { 0xFEFF,0x0000,0x0001,0x0020,0x0041,0x007F,0xD800,0xDC00 },
+ 8,
+ false,
+ true,
+ true,
+ true,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ // Bug #112949#:
+
+ { RTL_TEXTENCODING_SHIFT_JIS,
+ RTL_CONSTASCII_STRINGPARAM("\x81\x63"),
+ { 0x2026 },
+ 1,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_SHIFT_JIS,
+ RTL_CONSTASCII_STRINGPARAM("\xA0\xFD\xFE\xFF"),
+ { 0x00A0, 0x00A9, 0x2122, 0x2026 },
+ 4,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_SHIFT_JIS,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x00A0, 0x00A9, 0x2122 },
+ 3,
+ false,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_MS_932,
+ RTL_CONSTASCII_STRINGPARAM("\x81\x63"),
+ { 0x2026 },
+ 1,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_MS_932,
+ RTL_CONSTASCII_STRINGPARAM("\xA0\xFD\xFE\xFF"),
+ { 0x00A0, 0x00A9, 0x2122, 0x2026 },
+ 4,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_MS_932,
+ RTL_CONSTASCII_STRINGPARAM(""),
+ { 0x00A0, 0x00A9, 0x2122 },
+ 3,
+ false,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE },
+ { RTL_TEXTENCODING_APPLE_JAPANESE,
+ RTL_CONSTASCII_STRINGPARAM("\xA0\xFD\xFE\x81\x63"),
+ { 0x00A0, 0x00A9, 0x2122, 0x2026 },
+ 4,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_APPLE_JAPANESE,
+ RTL_CONSTASCII_STRINGPARAM("\xFF"),
+ { 0x2026 },
+ 1,
+ false,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ { RTL_TEXTENCODING_ADOBE_STANDARD,
+ RTL_CONSTASCII_STRINGPARAM("\x20\x2D\xA4\xB4\xC5"),
+ { 0x0020, 0x002D, 0x2215, 0x00B7, 0x00AF },
+ 5,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ADOBE_STANDARD,
+ RTL_CONSTASCII_STRINGPARAM("\x20\x2D\xA4\xB4\xC5"),
+ { 0x00A0, 0x00AD, 0x2044, 0x2219, 0x02C9 },
+ 5,
+ false,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ { RTL_TEXTENCODING_ADOBE_SYMBOL,
+ RTL_CONSTASCII_STRINGPARAM("\x20\x44\x57\x6D\xA4"),
+ { 0x0020, 0x0394, 0x03A9, 0x03BC, 0x2215 },
+ 5,
+ false,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_ADOBE_SYMBOL,
+ RTL_CONSTASCII_STRINGPARAM("\x20\x44\x57\x6D\xA4"),
+ { 0x00A0, 0x2206, 0x2126, 0x00B5, 0x2044 },
+ 5,
+ false,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ // Bug #i62310#:
+ { RTL_TEXTENCODING_SHIFT_JIS,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xF0\x40\xF0\x7E\xF0\x80\xF0\xFC\xF1\x40\xF9\xFC"),
+ { 0xE000, 0xE03E, 0xE03F, 0xE0BB, 0xE0BC, 0xE757 },
+ 6,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+
+ // Bug #i73103#:
+ { RTL_TEXTENCODING_MS_1258,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC0\x41\xDE\xE3\xD2\xD4\xEC\xFD\xF2"),
+ { 0x00C0, 0x0041, 0x0303, 0x0103, 0x0309, 0x00D4, 0x0301, 0x01B0,
+ 0x0323 },
+ 9,
+ true,
+ true,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_MS_1258,
+ RTL_CONSTASCII_STRINGPARAM(
+ "\xC0\x41\xDE\xE3\xD2\xD4\xEC\xFD\xF2"),
+ { 0x00C0, 0x00C3, 0x1EB3, 0x1ED0, 0x1EF1 },
+ 5,
+ false,
+ false,
+ true,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR }
+ };
+ for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) {
+ doComplexCharSetTest(data[i]);
+ }
+}
+
+void Test::testComplexCut() {
+ static ComplexCharSetTest const data[]
+ = { { RTL_TEXTENCODING_EUC_JP,
+ RTL_CONSTASCII_STRINGPARAM("\xA1"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_JP,
+ RTL_CONSTASCII_STRINGPARAM("\x8E"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_JP,
+ RTL_CONSTASCII_STRINGPARAM("\x8F"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_JP,
+ RTL_CONSTASCII_STRINGPARAM("\x8F\xA1"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_CN,
+ RTL_CONSTASCII_STRINGPARAM("\xA1"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR } /* ,
+ { RTL_TEXTENCODING_EUC_TW,
+ RTL_CONSTASCII_STRINGPARAM("\xA1"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_TW,
+ RTL_CONSTASCII_STRINGPARAM("\x8E"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_TW,
+ RTL_CONSTASCII_STRINGPARAM("\x8E\xA1"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR },
+ { RTL_TEXTENCODING_EUC_TW,
+ RTL_CONSTASCII_STRINGPARAM("\x8E\xA1\xA1"),
+ { 0 },
+ 0,
+ true,
+ true,
+ false,
+ false,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR } */ };
+ for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) {
+ doComplexCharSetCutTest(data[i]);
+ }
+}
+
+void Test::testSRCBUFFERTOSMALL() {
+ rtl_TextToUnicodeConverter cv = rtl_createTextToUnicodeConverter(
+ RTL_TEXTENCODING_EUC_JP);
+ OSL_ASSERT(cv != NULL);
+ rtl_TextToUnicodeContext cx = rtl_createTextToUnicodeContext(cv);
+ OSL_ASSERT(cx != NULL);
+ char src = '\xA1';
+ sal_Unicode dst[10];
+ sal_uInt32 info;
+ sal_Size cvt;
+ CPPUNIT_ASSERT_EQUAL(
+ sal_Size(0),
+ rtl_convertTextToUnicode(
+ cv, cx, &src, 1, dst, sizeof dst / sizeof (sal_Unicode),
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR),
+ &info, &cvt));
+ CPPUNIT_ASSERT_EQUAL(RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL, info);
+ CPPUNIT_ASSERT(cvt <= 1);
+ rtl_destroyTextToUnicodeContext(cv, cx);
+ rtl_destroyTextToUnicodeConverter(cv);
+}
+
+void Test::testMime() {
+ struct Data {
+ char const * mime;
+ rtl_TextEncoding encoding;
+ bool reverse;
+ };
+ static Data const data[] = {
+ { "GBK", RTL_TEXTENCODING_GBK, false },
+ { "CP936", RTL_TEXTENCODING_GBK, false },
+ { "MS936", RTL_TEXTENCODING_GBK, false },
+ { "windows-936", RTL_TEXTENCODING_GBK, false },
+
+ { "GB18030", RTL_TEXTENCODING_GB_18030, false },
+
+ { "TIS-620", RTL_TEXTENCODING_TIS_620, true },
+ { "ISO-8859-11", RTL_TEXTENCODING_TIS_620, false }, // not registered
+
+ { "CP874", RTL_TEXTENCODING_MS_874, false }, // not registered
+ { "MS874", RTL_TEXTENCODING_MS_874, false }, // not registered
+ { "windows-874", RTL_TEXTENCODING_MS_874, true }, // not registered
+
+ { "ISO_8859-8:1988", RTL_TEXTENCODING_ISO_8859_8, false },
+ { "iso-ir-138", RTL_TEXTENCODING_ISO_8859_8, false },
+ { "ISO_8859-8", RTL_TEXTENCODING_ISO_8859_8, false },
+ { "ISO-8859-8", RTL_TEXTENCODING_ISO_8859_8, true },
+ { "hebrew", RTL_TEXTENCODING_ISO_8859_8, false },
+ { "csISOLatinHebrew", RTL_TEXTENCODING_ISO_8859_8, false },
+
+ { "windows-1255", RTL_TEXTENCODING_MS_1255, true },
+
+ { "IBM862", RTL_TEXTENCODING_IBM_862, true },
+ { "cp862", RTL_TEXTENCODING_IBM_862, false },
+ { "862", RTL_TEXTENCODING_IBM_862, false },
+ { "csPC862LatinHebrew", RTL_TEXTENCODING_IBM_862, false },
+
+ { "ISO_8859-6:1987", RTL_TEXTENCODING_ISO_8859_6, false },
+ { "iso-ir-127", RTL_TEXTENCODING_ISO_8859_6, false },
+ { "ISO_8859-6", RTL_TEXTENCODING_ISO_8859_6, false },
+ { "ISO-8859-6", RTL_TEXTENCODING_ISO_8859_6, true },
+ { "ECMA-114", RTL_TEXTENCODING_ISO_8859_6, false },
+ { "ASMO-708", RTL_TEXTENCODING_ISO_8859_6, false },
+ { "arabic", RTL_TEXTENCODING_ISO_8859_6, false },
+ { "csISOLatinArabic", RTL_TEXTENCODING_ISO_8859_6, false },
+
+ { "windows-1256", RTL_TEXTENCODING_MS_1256, true },
+
+ { "IBM864", RTL_TEXTENCODING_IBM_864, true },
+ { "cp864", RTL_TEXTENCODING_IBM_864, false },
+ { "csIBM864", RTL_TEXTENCODING_IBM_864, false },
+
+ { "KOI8-R", RTL_TEXTENCODING_KOI8_R, false },
+ { "csKOI8R", RTL_TEXTENCODING_KOI8_R, false },
+ { "koi8-r", RTL_TEXTENCODING_KOI8_R, true },
+
+ { "KOI8-U", RTL_TEXTENCODING_KOI8_U, true },
+
+ { "IBM860", RTL_TEXTENCODING_IBM_860, true },
+ { "cp860", RTL_TEXTENCODING_IBM_860, false },
+ { "860", RTL_TEXTENCODING_IBM_860, false },
+ { "csIBM860", RTL_TEXTENCODING_IBM_860, false },
+
+ { "IBM861", RTL_TEXTENCODING_IBM_861, true },
+ { "cp861", RTL_TEXTENCODING_IBM_861, false },
+ { "861", RTL_TEXTENCODING_IBM_861, false },
+ { "cp-is", RTL_TEXTENCODING_IBM_861, false },
+ { "csIBM861", RTL_TEXTENCODING_IBM_861, false },
+
+ { "IBM863", RTL_TEXTENCODING_IBM_863, true },
+ { "cp863", RTL_TEXTENCODING_IBM_863, false },
+ { "863", RTL_TEXTENCODING_IBM_863, false },
+ { "csIBM863", RTL_TEXTENCODING_IBM_863, false },
+
+ { "IBM865", RTL_TEXTENCODING_IBM_865, true },
+ { "cp865", RTL_TEXTENCODING_IBM_865, false },
+ { "865", RTL_TEXTENCODING_IBM_865, false },
+ { "csIBM865", RTL_TEXTENCODING_IBM_865, false },
+
+ { "Latin-9", RTL_TEXTENCODING_ISO_8859_15, false },
+
+ { "KS_C_5601-1987", RTL_TEXTENCODING_MS_949, false },
+ { "iso-ir-149", RTL_TEXTENCODING_MS_949, false },
+ { "KS_C_5601-1989", RTL_TEXTENCODING_MS_949, false },
+ { "KSC_5601", RTL_TEXTENCODING_MS_949, false },
+ { "korean", RTL_TEXTENCODING_MS_949, false },
+ { "csKSC56011987", RTL_TEXTENCODING_MS_949, false },
+ { 0, RTL_TEXTENCODING_MS_949, true },
+
+ { "Adobe-Standard-Encoding", RTL_TEXTENCODING_ADOBE_STANDARD, false },
+ { "csAdobeStandardEncoding", RTL_TEXTENCODING_ADOBE_STANDARD, false },
+ { "Adobe-Symbol-Encoding", RTL_TEXTENCODING_ADOBE_SYMBOL, false },
+ { "csHPPSMath", RTL_TEXTENCODING_ADOBE_SYMBOL, false },
+
+ { "PTCP154", RTL_TEXTENCODING_PT154, true },
+ { "csPTCP154", RTL_TEXTENCODING_PT154, false },
+ { "PT154", RTL_TEXTENCODING_PT154, false },
+ { "CP154", RTL_TEXTENCODING_PT154, false },
+ { "Cyrillic-Asian", RTL_TEXTENCODING_PT154, false }
+ };
+ for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) {
+ if (data[i].mime == 0) {
+ OSL_ASSERT(data[i].reverse);
+ CPPUNIT_ASSERT_EQUAL(
+ static_cast< char const * >(0),
+ rtl_getMimeCharsetFromTextEncoding(data[i].encoding));
+ } else {
+ CPPUNIT_ASSERT_EQUAL(
+ data[i].encoding,
+ rtl_getTextEncodingFromMimeCharset(data[i].mime));
+ if (data[i].reverse) {
+ CPPUNIT_ASSERT_EQUAL(
+ rtl::OString(data[i].mime),
+ rtl::OString(
+ rtl_getMimeCharsetFromTextEncoding(data[i].encoding)));
+ }
+ }
+ }
+}
+
+void Test::testWindows() {
+ struct Data {
+ sal_uInt32 codePage;
+ rtl_TextEncoding encoding;
+ bool reverse;
+ };
+ static Data const data[] = {
+ { 437, RTL_TEXTENCODING_IBM_437, true },
+ { 708, RTL_TEXTENCODING_ISO_8859_6, false },
+ { 737, RTL_TEXTENCODING_IBM_737, true },
+ { 775, RTL_TEXTENCODING_IBM_775, true },
+ { 850, RTL_TEXTENCODING_IBM_850, true },
+ { 852, RTL_TEXTENCODING_IBM_852, true },
+ { 855, RTL_TEXTENCODING_IBM_855, true },
+ { 857, RTL_TEXTENCODING_IBM_857, true },
+ { 860, RTL_TEXTENCODING_IBM_860, true },
+ { 861, RTL_TEXTENCODING_IBM_861, true },
+ { 862, RTL_TEXTENCODING_IBM_862, true },
+ { 863, RTL_TEXTENCODING_IBM_863, true },
+ { 864, RTL_TEXTENCODING_IBM_864, true },
+ { 865, RTL_TEXTENCODING_IBM_865, true },
+ { 866, RTL_TEXTENCODING_IBM_866, true },
+ { 869, RTL_TEXTENCODING_IBM_869, true },
+ { 874, RTL_TEXTENCODING_MS_874, true },
+ { 932, RTL_TEXTENCODING_MS_932, true },
+ { 936, RTL_TEXTENCODING_MS_936, true },
+ { 949, RTL_TEXTENCODING_MS_949, true },
+ { 950, RTL_TEXTENCODING_MS_950, true },
+ { 1250, RTL_TEXTENCODING_MS_1250, true },
+ { 1251, RTL_TEXTENCODING_MS_1251, true },
+ { 1252, RTL_TEXTENCODING_MS_1252, true },
+ { 1253, RTL_TEXTENCODING_MS_1253, true },
+ { 1254, RTL_TEXTENCODING_MS_1254, true },
+ { 1255, RTL_TEXTENCODING_MS_1255, true },
+ { 1256, RTL_TEXTENCODING_MS_1256, true },
+ { 1257, RTL_TEXTENCODING_MS_1257, true },
+ { 1258, RTL_TEXTENCODING_MS_1258, true },
+ { 1361, RTL_TEXTENCODING_MS_1361, true },
+ { 10000, RTL_TEXTENCODING_APPLE_ROMAN, true },
+ { 10001, RTL_TEXTENCODING_APPLE_JAPANESE, true },
+ { 10002, RTL_TEXTENCODING_APPLE_CHINTRAD, true },
+ { 10003, RTL_TEXTENCODING_APPLE_KOREAN, true },
+ { 10004, RTL_TEXTENCODING_APPLE_ARABIC, true },
+ { 10005, RTL_TEXTENCODING_APPLE_HEBREW, true },
+ { 10006, RTL_TEXTENCODING_APPLE_GREEK, true },
+ { 10007, RTL_TEXTENCODING_APPLE_CYRILLIC, true },
+ { 10008, RTL_TEXTENCODING_APPLE_CHINSIMP, true },
+ { 10010, RTL_TEXTENCODING_APPLE_ROMANIAN, true },
+ { 10017, RTL_TEXTENCODING_APPLE_UKRAINIAN, true },
+ { 10029, RTL_TEXTENCODING_APPLE_CENTEURO, true },
+ { 10079, RTL_TEXTENCODING_APPLE_ICELAND, true },
+ { 10081, RTL_TEXTENCODING_APPLE_TURKISH, true },
+ { 10082, RTL_TEXTENCODING_APPLE_CROATIAN, true },
+ { 20127, RTL_TEXTENCODING_ASCII_US, true },
+ { 20866, RTL_TEXTENCODING_KOI8_R, true },
+ { 21866, RTL_TEXTENCODING_KOI8_U, true },
+ { 28591, RTL_TEXTENCODING_ISO_8859_1, true },
+ { 28592, RTL_TEXTENCODING_ISO_8859_2, true },
+ { 28593, RTL_TEXTENCODING_ISO_8859_3, true },
+ { 28594, RTL_TEXTENCODING_ISO_8859_4, true },
+ { 28595, RTL_TEXTENCODING_ISO_8859_5, true },
+ { 28596, RTL_TEXTENCODING_ISO_8859_6, true },
+ { 28597, RTL_TEXTENCODING_ISO_8859_7, true },
+ { 28598, RTL_TEXTENCODING_ISO_8859_8, true },
+ { 28599, RTL_TEXTENCODING_ISO_8859_9, true },
+ { 28605, RTL_TEXTENCODING_ISO_8859_15, true },
+ { 50220, RTL_TEXTENCODING_ISO_2022_JP, true },
+ { 50225, RTL_TEXTENCODING_ISO_2022_KR, true },
+ { 51932, RTL_TEXTENCODING_EUC_JP, true },
+ { 51936, RTL_TEXTENCODING_EUC_CN, true },
+ { 51949, RTL_TEXTENCODING_EUC_KR, true },
+ { 65000, RTL_TEXTENCODING_UTF7, true },
+ { 65001, RTL_TEXTENCODING_UTF8, true },
+ { 1200, RTL_TEXTENCODING_DONTKNOW, false }, // UTF_16LE
+ { 1201, RTL_TEXTENCODING_DONTKNOW, false }, // UTF_16LE
+ { 0, RTL_TEXTENCODING_DONTKNOW, true },
+ { 0, RTL_TEXTENCODING_UCS4, true },
+ { 0, RTL_TEXTENCODING_UCS2, true },
+ { 0, RTL_TEXTENCODING_ISCII_DEVANAGARI, true }
+ };
+ for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) {
+ OSL_ASSERT(data[i].codePage != 0 || data[i].reverse);
+ if (data[i].codePage != 0) {
+ CPPUNIT_ASSERT_EQUAL(
+ data[i].encoding,
+ rtl_getTextEncodingFromWindowsCodePage(data[i].codePage));
+ }
+ if (data[i].reverse) {
+ CPPUNIT_ASSERT_EQUAL(
+ data[i].codePage,
+ rtl_getWindowsCodePageFromTextEncoding(data[i].encoding));
+ }
+ }
+}
+
+void Test::testInfo() {
+ struct Data {
+ rtl_TextEncoding encoding;
+ sal_uInt32 flag;
+ bool value;
+ };
+ static Data const data[] = {
+ { RTL_TEXTENCODING_APPLE_CHINTRAD, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_APPLE_JAPANESE, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_APPLE_KOREAN, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_BIG5, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_BIG5_HKSCS, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_EUC_CN, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_EUC_JP, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_EUC_KR, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_EUC_TW, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_GBK, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_GB_18030, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_GB_18030, RTL_TEXTENCODING_INFO_UNICODE, true },
+ { RTL_TEXTENCODING_ISO_2022_CN, RTL_TEXTENCODING_INFO_CONTEXT, true },
+ { RTL_TEXTENCODING_ISO_2022_CN, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_ISO_2022_JP, RTL_TEXTENCODING_INFO_CONTEXT, true },
+ { RTL_TEXTENCODING_ISO_2022_JP, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_ISO_2022_KR, RTL_TEXTENCODING_INFO_CONTEXT, true },
+ { RTL_TEXTENCODING_ISO_2022_KR, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_MS_1361, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_MS_874, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_MS_932, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_MS_936, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_MS_949, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_MS_950, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_SHIFT_JIS, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_KOI8_R, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_KOI8_R, RTL_TEXTENCODING_INFO_MIME, true },
+ { RTL_TEXTENCODING_KOI8_U, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_KOI8_U, RTL_TEXTENCODING_INFO_MIME, true },
+ { RTL_TEXTENCODING_IBM_860, RTL_TEXTENCODING_INFO_MIME, true },
+ { RTL_TEXTENCODING_IBM_861, RTL_TEXTENCODING_INFO_MIME, true },
+ { RTL_TEXTENCODING_IBM_863, RTL_TEXTENCODING_INFO_MIME, true },
+ { RTL_TEXTENCODING_IBM_865, RTL_TEXTENCODING_INFO_MIME, true },
+ { RTL_TEXTENCODING_ISCII_DEVANAGARI, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_ISCII_DEVANAGARI, RTL_TEXTENCODING_INFO_MIME, false },
+ { RTL_TEXTENCODING_ADOBE_STANDARD, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_ADOBE_STANDARD, RTL_TEXTENCODING_INFO_MIME, true },
+ { RTL_TEXTENCODING_ADOBE_STANDARD, RTL_TEXTENCODING_INFO_SYMBOL, false },
+ { RTL_TEXTENCODING_ADOBE_SYMBOL, RTL_TEXTENCODING_INFO_ASCII, false },
+ { RTL_TEXTENCODING_ADOBE_SYMBOL, RTL_TEXTENCODING_INFO_MIME, true },
+ { RTL_TEXTENCODING_ADOBE_SYMBOL, RTL_TEXTENCODING_INFO_SYMBOL, true },
+ { RTL_TEXTENCODING_PT154, RTL_TEXTENCODING_INFO_ASCII, true },
+ { RTL_TEXTENCODING_PT154, RTL_TEXTENCODING_INFO_MIME, true }
+ };
+ for (std::size_t i = 0; i < sizeof data / sizeof data[0]; ++i) {
+ rtl_TextEncodingInfo info;
+ info.StructSize = sizeof info;
+ CPPUNIT_ASSERT(rtl_getTextEncodingInfo(data[i].encoding, &info));
+ CPPUNIT_ASSERT_EQUAL(data[i].value, ((info.Flags & data[i].flag) != 0));
+ }
+}
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(Test, "rtl_textcvt");
+
+}
+
+NOADDITIONAL;
diff --git a/sal/qa/rtl/uri/makefile.mk b/sal/qa/rtl/uri/makefile.mk
new file mode 100644
index 000000000000..d4a8814cc649
--- /dev/null
+++ b/sal/qa/rtl/uri/makefile.mk
@@ -0,0 +1,75 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_uritest
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# --- BEGIN --------------------------------------------------------
+SHL1OBJS= \
+ $(SLO)$/rtl_Uri.obj
+SHL1TARGET= rtl_uri_simple
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END --------------------------------------------------------------
+
+# --- BEGIN --------------------------------------------------------
+SHL2OBJS= \
+ $(SLO)$/rtl_testuri.obj
+SHL2TARGET= rtl_Uri
+SHL2STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL2IMPLIB= i$(SHL2TARGET)
+DEF2NAME =$(SHL2TARGET)
+SHL2VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END --------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/rtl/uri/rtl_Uri.cxx b/sal/qa/rtl/uri/rtl_Uri.cxx
new file mode 100644
index 000000000000..0a78f944a02f
--- /dev/null
+++ b/sal/qa/rtl/uri/rtl_Uri.cxx
@@ -0,0 +1,297 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <stdlib.h>
+#include <rtl/ustring.hxx>
+#include <rtl/strbuf.hxx>
+#include <rtl/uri.hxx>
+#include <osl/thread.h>
+#include <osl/file.hxx>
+
+#include <testshl/simpleheader.hxx>
+
+// -----------------------------------------------------------------------------
+
+namespace Stringtest
+{
+ rtl::OString toHex(unsigned char _c)
+ {
+ rtl::OStringBuffer sStrBuf;
+ static char cHex[] = "0123456789ABCDEF";
+
+ int nhigh = int(_c) >> 4 & 0xf;
+ int nlow = int(_c) & 0xf;
+ sStrBuf.append( cHex[nhigh] );
+ sStrBuf.append( cHex[nlow] );
+ return sStrBuf.makeStringAndClear();
+ }
+
+ rtl::OString escapeString(rtl::OString const& _sStr)
+ {
+ rtl::OStringBuffer sStrBuf;
+ sal_Int32 nLength = _sStr.getLength();
+ for(int i=0;i<nLength;++i)
+ {
+ unsigned char c = (unsigned char)_sStr[i];
+ if (c > 127)
+ {
+ sStrBuf.append("%");
+ sStrBuf.append(toHex(c));
+ }
+ else
+ {
+ sStrBuf.append((char)c);
+ }
+ }
+ return sStrBuf.makeStringAndClear();
+ }
+
+ // -----------------------------------------------------------------------------
+
+ class Convert : public CppUnit::TestFixture
+ {
+ rtl::OUString m_aStr;
+ public:
+ /*
+ rtl::OString toUTF8(rtl::OUString const& _suStr)
+ {
+ rtl::OString sStrAsUTF8 = rtl::OUStringToOString(_suStr, RTL_TEXTENCODING_UTF8);
+ t_print("%s\n", escapeString(sStrAsUTF8).getStr());
+ return sStrAsUTF8;
+ }
+ */
+ rtl::OUString fromUTF8(rtl::OString const& _suStr)
+ {
+ rtl::OUString suStr = rtl::OStringToOUString(_suStr, RTL_TEXTENCODING_UTF8);
+ return suStr;
+ }
+
+ rtl::OString convertToOString(rtl::OUString const& _suStr)
+ {
+ return rtl::OUStringToOString(_suStr, osl_getThreadTextEncoding()/*RTL_TEXTENCODING_ASCII_US*/);
+ }
+
+ void showContent(rtl::OUString const& _suStr)
+ {
+ rtl::OString sStr = convertToOString(_suStr);
+ t_print("%s\n", sStr.getStr());
+ }
+
+ void toUTF8_mech(rtl::OUString const& _suStr, rtl_UriEncodeMechanism _eMechanism)
+ {
+ rtl::OUString suStr;
+ suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassNone, _eMechanism, RTL_TEXTENCODING_UTF8);
+ showContent(suStr);
+ suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUric, _eMechanism, RTL_TEXTENCODING_UTF8);
+ showContent(suStr);
+ suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUricNoSlash, _eMechanism, RTL_TEXTENCODING_UTF8);
+ showContent(suStr);
+ suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassRelSegment, _eMechanism, RTL_TEXTENCODING_UTF8);
+ showContent(suStr);
+ suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassRegName, _eMechanism, RTL_TEXTENCODING_UTF8);
+ showContent(suStr);
+ suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUserinfo, _eMechanism, RTL_TEXTENCODING_UTF8);
+ showContent(suStr);
+ suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassPchar, _eMechanism, RTL_TEXTENCODING_UTF8);
+ showContent(suStr);
+ suStr = rtl::Uri::encode(_suStr, rtl_UriCharClassUnoParamValue, _eMechanism, RTL_TEXTENCODING_UTF8);
+ showContent(suStr);
+ }
+
+ void toUTF8(rtl::OUString const& _suStr)
+ {
+ t_print("rtl_UriEncodeIgnoreEscapes \n");
+ toUTF8_mech(_suStr, rtl_UriEncodeIgnoreEscapes);
+ t_print("\n");
+ t_print("# rtl_UriEncodeKeepEscapes\n");
+ toUTF8_mech(_suStr, rtl_UriEncodeKeepEscapes);
+ t_print("\n");
+ t_print("# rtl_UriEncodeCheckEscapes\n");
+ toUTF8_mech(_suStr, rtl_UriEncodeCheckEscapes);
+ t_print("\n");
+ }
+
+ void test_FromUTF8_001()
+ {
+ // string --> ustring
+ rtl::OString sStrUTF8("h%C3%A4llo");
+ rtl::OUString suStrUTF8 = rtl::OStringToOUString(sStrUTF8, RTL_TEXTENCODING_ASCII_US);
+
+ // UTF8 --> real ustring
+ rtl::OUString suStr_UriDecodeToIuri = rtl::Uri::decode(suStrUTF8, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8);
+ showContent(suStr_UriDecodeToIuri);
+
+ // string --> ustring
+ rtl::OString sStr("h\xE4llo");
+ rtl::OUString suString = rtl::OStringToOUString(sStr, RTL_TEXTENCODING_ISO_8859_15);
+
+ CPPUNIT_ASSERT_MESSAGE("Strings must be equal", suString.equals(suStr_UriDecodeToIuri) == sal_True);
+
+ // ustring --> ustring (UTF8)
+ rtl::OUString suStr2 = rtl::Uri::encode(suStr_UriDecodeToIuri, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8);
+ showContent(suStr2);
+
+ CPPUNIT_ASSERT_MESSAGE("Strings must be equal", suStr2.equals(suStrUTF8) == sal_True);
+ // suStr should be equal to suStr2
+ }
+
+ // "%C3%84qypten";
+ // testshl2 ../../../unxlngi4.pro/lib/libConvert.so "-onlyerrors"
+ // # Type: 'Directory' file name '%E6%89%8B%E6%9C%BA%E5%8F%B7%E7%A0%81'
+ // # Type: 'Directory' file name '%E6%9C%AA%E5%91%BD%E5%90%8Dzhgb18030'
+ // # Type: 'Regular file' file name '%E5%B7%A5%E4%BD%9C'
+ // # Type: 'Regular file' file name '%E4%BA%8C%E6%89%8B%E6%88%BF%E4%B9%B0%E5%8D%96%E5%90%88%E5%90%8C%E8%8D%89%E7%A8%BF.doc'
+ // ls
+ rtl::OString getFileTypeName(osl::FileStatus const& _aStatus)
+ {
+ rtl::OString sType;
+ if (_aStatus.isValid(osl_FileStatus_Mask_Type))
+ {
+ osl::FileStatus::Type aType = _aStatus.getFileType();
+ if (aType == osl::FileStatus::Directory)
+ {
+ sType = "Directory";
+ }
+ else if (aType == osl::FileStatus::Regular)
+ {
+ sType = "Regular file";
+ }
+ else if (aType == osl::FileStatus::Volume)
+ {
+ sType = "Volume";
+ }
+ else if (aType == osl::FileStatus::Fifo)
+ {
+ sType = "Fifo";
+ }
+ else if (aType == osl::FileStatus::Socket)
+ {
+ sType = "Socket";
+ }
+ else if (aType == osl::FileStatus::Link)
+ {
+ sType = "Link";
+ }
+ else if (aType == osl::FileStatus::Special)
+ {
+ sType = "Special";
+ }
+ else if (aType == osl::FileStatus::Unknown)
+ {
+ sType = "Unknown";
+ }
+ else
+ {
+ sType = "Not handled yet";
+ }
+ }
+ else
+ {
+ sType = "ERROR: osl_FileStatus_Mask_Type not set for FileStatus!";
+ }
+ return sType;
+ }
+
+
+ void test_UTF8_files()
+ {
+#ifdef UNX
+ rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///tmp/atestdir"));
+#else /* Windows */
+ rtl::OUString suDirURL(rtl::OUString::createFromAscii("file:///c:/temp/atestdir"));
+#endif
+ osl::Directory aDir(suDirURL);
+ aDir.open();
+ if (aDir.isOpen())
+ {
+ osl::DirectoryItem aItem;
+ osl::FileStatus aStatus(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes | osl_FileStatus_Mask_Type);
+ while (aDir.getNextItem(aItem) == ::osl::FileBase::E_None)
+ {
+ if (osl::FileBase::E_None == aItem.getFileStatus(aStatus) &&
+ aStatus.isValid(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes))
+ {
+ rtl::OString sType = getFileTypeName(aStatus);
+
+ rtl::OUString suFilename = aStatus.getFileName();
+ // rtl::OUString suFullFileURL;
+
+ rtl::OUString suStrUTF8 = rtl::Uri::encode(suFilename, rtl_UriCharClassUnoParamValue, rtl_UriEncodeKeepEscapes, RTL_TEXTENCODING_UTF8);
+ rtl::OString sStrUTF8 = convertToOString(suStrUTF8);
+ t_print("Type: '%s' file name '%s'\n", sType.getStr(), sStrUTF8.getStr());
+ }
+ }
+ aDir.close();
+ }
+ else
+ {
+ rtl::OString sStr;
+ sStr = rtl::OUStringToOString(suDirURL, osl_getThreadTextEncoding());
+ t_print("can't open dir:'%s'\n", sStr.getStr());
+ }
+ }
+
+ void test_FromUTF8()
+ {
+ rtl::OString sStr("h%C3%A4llo");
+ rtl::OUString suStr = rtl::OStringToOUString(sStr, osl_getThreadTextEncoding());
+
+// rtl_UriEncodeIgnoreEscapes,
+// rtl_UriEncodeKeepEscapes,
+// rtl_UriEncodeCheckEscapes,
+// rtl::OUString suStr2 = rtl::Uri::encode(suStr, rtl_UriCharClassRegName, rtl_UriEncodeCheckEscapes, RTL_TEXTENCODING_UTF8);
+ rtl::OUString suStr_UriDecodeNone = rtl::Uri::decode(suStr, rtl_UriDecodeNone, RTL_TEXTENCODING_UTF8);
+ showContent(suStr_UriDecodeNone);
+ toUTF8(suStr_UriDecodeNone);
+
+ rtl::OUString suStr_UriDecodeToIuri = rtl::Uri::decode(suStr, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8);
+ showContent(suStr_UriDecodeToIuri);
+ toUTF8(suStr_UriDecodeToIuri);
+
+ rtl::OUString suStr_UriDecodeWithCharset = rtl::Uri::decode(suStr, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8);
+ showContent(suStr_UriDecodeWithCharset);
+ toUTF8(suStr_UriDecodeWithCharset);
+ }
+
+ CPPUNIT_TEST_SUITE( Convert );
+ CPPUNIT_TEST( test_FromUTF8_001 );
+// CPPUNIT_TEST( test_UTF8_files );
+// CPPUNIT_TEST( test_FromUTF8 );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+}
+
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( Stringtest::Convert, "Stringtest" );
+
+// LLA: doku anpassen!!!
+
+NOADDITIONAL;
diff --git a/sal/qa/rtl/uri/rtl_testuri.cxx b/sal/qa/rtl/uri/rtl_testuri.cxx
new file mode 100644
index 000000000000..88929a9fbebc
--- /dev/null
+++ b/sal/qa/rtl/uri/rtl_testuri.cxx
@@ -0,0 +1,545 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "rtl/strbuf.hxx"
+#include "rtl/textenc.h"
+#include "rtl/uri.h"
+#include "rtl/uri.hxx"
+#include "rtl/ustrbuf.hxx"
+#include "rtl/ustring.h"
+#include "rtl/ustring.hxx"
+
+#include "testshl/simpleheader.hxx"
+
+#include <cstddef>
+#include <stdio.h>
+
+namespace {
+
+struct Test: public CppUnit::TestFixture {
+ void test_Uri();
+
+ CPPUNIT_TEST_SUITE(Test);
+ CPPUNIT_TEST(test_Uri);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void Test::test_Uri() {
+ rtl_UriCharClass const eFirstCharClass = rtl_UriCharClassNone;
+ rtl_UriCharClass const eLastCharClass = rtl_UriCharClassUnoParamValue;
+
+ rtl::OUStringBuffer aBuffer;
+ rtl::OUString aText1;
+ rtl::OUString aText2;
+
+ // Check that all characters map back to themselves when encoded/decoded:
+
+ aText1 = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "\0x00\0x01\0x02\0x03\0x04\0x05\0x06\0x07"
+ "\0x08\0x09\0x0A\0x0B\0x0C\0x0D\0x0E\0x0F"
+ "\0x10\0x11\0x12\0x13\0x14\0x15\0x16\0x17"
+ "\0x18\0x19\0x1A\0x1B\0x1C\0x1D\0x1E\0x1F"
+ "\0x20\0x21\0x22\0x23\0x24\0x25\0x26\0x27"
+ "\0x28\0x29\0x2A\0x2B\0x2C\0x2D\0x2E\0x2F"
+ "\0x30\0x31\0x32\0x33\0x34\0x35\0x36\0x37"
+ "\0x38\0x39\0x3A\0x3B\0x3C\0x3D\0x3E\0x3F"
+ "\0x40\0x41\0x42\0x43\0x44\0x45\0x46\0x47"
+ "\0x48\0x49\0x4A\0x4B\0x4C\0x4D\0x4E\0x4F"
+ "\0x50\0x51\0x52\0x53\0x54\0x55\0x56\0x57"
+ "\0x58\0x59\0x5A\0x5B\0x5C\0x5D\0x5E\0x5F"
+ "\0x60\0x61\0x62\0x63\0x64\0x65\0x66\0x67"
+ "\0x68\0x69\0x6A\0x6B\0x6C\0x6D\0x6E\0x6F"
+ "\0x70\0x71\0x72\0x73\0x74\0x75\0x76\0x77"
+ "\0x78\0x79\0x7A\0x7B\0x7C\0x7D\0x7E\0x7F"));
+ aText2 = aText1;
+ {for (rtl_UriCharClass eCharClass = eFirstCharClass;
+ eCharClass <= eLastCharClass;
+ eCharClass = static_cast< rtl_UriCharClass >(eCharClass + 1))
+ {
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 1",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeKeepEscapes,
+ RTL_TEXTENCODING_ISO_8859_1),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ASCII_US)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 2",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_ISO_8859_1),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ASCII_US)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 3",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeKeepEscapes,
+ RTL_TEXTENCODING_ISO_8859_1),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_1)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 4",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_ISO_8859_1),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_1)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 5",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeKeepEscapes,
+ RTL_TEXTENCODING_ISO_8859_1),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 6",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_ISO_8859_1),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
+ == aText2));
+ }}
+
+ aText1 = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "\0x00\0x01\0x02\0x03\0x04\0x05\0x06\0x07"
+ "\0x08\0x09\0x0A\0x0B\0x0C\0x0D\0x0E\0x0F"
+ "\0x10\0x11\0x12\0x13\0x14\0x15\0x16\0x17"
+ "\0x18\0x19\0x1A\0x1B\0x1C\0x1D\0x1E\0x1F"
+ "\0x20\0x21\0x22\0x23\0x24\0x25\0x26\0x27"
+ "\0x28\0x29\0x2A\0x2B\0x2C\0x2D\0x2E\0x2F"
+ "\0x30\0x31\0x32\0x33\0x34\0x35\0x36\0x37"
+ "\0x38\0x39\0x3A\0x3B\0x3C\0x3D\0x3E\0x3F"
+ "\0x40\0x41\0x42\0x43\0x44\0x45\0x46\0x47"
+ "\0x48\0x49\0x4A\0x4B\0x4C\0x4D\0x4E\0x4F"
+ "\0x50\0x51\0x52\0x53\0x54\0x55\0x56\0x57"
+ "\0x58\0x59\0x5A\0x5B\0x5C\0x5D\0x5E\0x5F"
+ "\0x60\0x61\0x62\0x63\0x64\0x65\0x66\0x67"
+ "\0x68\0x69\0x6A\0x6B\0x6C\0x6D\0x6E\0x6F"
+ "\0x70\0x71\0x72\0x73\0x74\0x75\0x76\0x77"
+ "\0x78\0x79\0x7A\0x7B\0x7C\0x7D\0x7E\0x7F"
+ "\0x80\0x81\0x82\0x83\0x84\0x85\0x86\0x87"
+ "\0x88\0x89\0x8A\0x8B\0x8C\0x8D\0x8E\0x8F"
+ "\0x90\0x91\0x92\0x93\0x94\0x95\0x96\0x97"
+ "\0x98\0x99\0x9A\0x9B\0x9C\0x9D\0x9E\0x9F"
+ "\0xA0\0xA1\0xA2\0xA3\0xA4\0xA5\0xA6\0xA7"
+ "\0xA8\0xA9\0xAA\0xAB\0xAC\0xAD\0xAE\0xAF"
+ "\0xB0\0xB1\0xB2\0xB3\0xB4\0xB5\0xB6\0xB7"
+ "\0xB8\0xB9\0xBA\0xBB\0xBC\0xBD\0xBE\0xBF"
+ "\0xC0\0xC1\0xC2\0xC3\0xC4\0xC5\0xC6\0xC7"
+ "\0xC8\0xC9\0xCA\0xCB\0xCC\0xCD\0xCE\0xCF"
+ "\0xD0\0xD1\0xD2\0xD3\0xD4\0xD5\0xD6\0xD7"
+ "\0xD8\0xD9\0xDA\0xDB\0xDC\0xDD\0xDE\0xDF"
+ "\0xE0\0xE1\0xE2\0xE3\0xE4\0xE5\0xE6\0xE7"
+ "\0xE8\0xE9\0xEA\0xEB\0xEC\0xED\0xEE\0xEF"
+ "\0xF0\0xF1\0xF2\0xF3\0xF4\0xF5\0xF6\0xF7"
+ "\0xF8\0xF9\0xFA\0xFB\0xFC\0xFD\0xFE\0xFF"));
+ aText2 = aText1;
+ {for (rtl_UriCharClass eCharClass = eFirstCharClass;
+ eCharClass <= eLastCharClass;
+ eCharClass = static_cast< rtl_UriCharClass >(eCharClass + 1))
+ {
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 7",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeKeepEscapes,
+ RTL_TEXTENCODING_ISO_8859_1),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_1)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 8",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_ISO_8859_1),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_1)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 9",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeKeepEscapes,
+ RTL_TEXTENCODING_UTF8),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 10",
+ (rtl::Uri::decode(
+ rtl::Uri::encode(
+ aText1, eCharClass, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_UTF8),
+ rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
+ == aText2));
+ }}
+
+ // Check surrogate handling:
+
+ aBuffer.append(static_cast< sal_Unicode >(0xD800)); // %ED%A0%80
+ aBuffer.append(static_cast< sal_Unicode >(0xD800)); // %F0%90%8F%BF
+ aBuffer.append(static_cast< sal_Unicode >(0xDFFF));
+ aBuffer.append(static_cast< sal_Unicode >(0xDFFF)); // %ED%BF%BF
+ aBuffer.append(static_cast< sal_Unicode >('A')); // A
+ aText1 = aBuffer.makeStringAndClear();
+ aText2 = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "%ED%A0%80" "%F0%90%8F%BF" "%ED%BF%BF" "A"));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 11",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeIgnoreEscapes,
+ RTL_TEXTENCODING_UTF8)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 12",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeKeepEscapes,
+ RTL_TEXTENCODING_UTF8)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 13",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_UTF8)
+ == aText2));
+
+ aText1 = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "%ed%a0%80" "%f0%90%8f%bf" "%ed%bf%bf" "A"));
+ aBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("%ED%A0%80"));
+ aBuffer.append(static_cast< sal_Unicode >(0xD800));
+ aBuffer.append(static_cast< sal_Unicode >(0xDFFF));
+ aBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("%ED%BF%BF"));
+ aBuffer.append(static_cast< sal_Unicode >('A'));
+ aText2 = aBuffer.makeStringAndClear();
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 14",
+ (rtl::Uri::decode(aText1, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 15",
+ (rtl::Uri::decode(
+ aText1, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8)
+ == aText2));
+
+ // Check UTF-8 handling:
+
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%E0%83%BF"));
+ // \U+00FF encoded with three instead of two bytes
+ aText2 = aText1;
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 16",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_UTF8)
+ == aText2));
+
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%EF%BF%BF"));
+ // \U+FFFF is no legal character
+ aText2 = aText1;
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 17",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_UTF8)
+ == aText2));
+
+ // Check IURI handling:
+
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%30%C3%BF"));
+ aBuffer.appendAscii(RTL_CONSTASCII_STRINGPARAM("%30"));
+ aBuffer.append(static_cast< sal_Unicode >(0x00FF));
+ aText2 = aBuffer.makeStringAndClear();
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 18",
+ (rtl::Uri::decode(aText1, rtl_UriDecodeToIuri, RTL_TEXTENCODING_UTF8)
+ == aText2));
+
+ // Check modified rtl_UriCharClassUnoParamValue (removed '[' and ']'):
+
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("[]%5B%5D"));
+ aText2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%5B%5D%5B%5D"));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 19",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUnoParamValue, rtl_UriEncodeCheckEscapes,
+ RTL_TEXTENCODING_ASCII_US)
+ == aText2));
+
+ // Check Uri::convertRelToAbs:
+
+ struct RelToAbsTest
+ {
+ char const * pBase;
+ char const * pRel;
+ char const * pAbs;
+ };
+ static RelToAbsTest const aRelToAbsTest[]
+ = { // The following tests are taken from RFC 2396:
+ { "http://a/b/c/d;p?q", "g:h", "g:h" },
+ { "http://a/b/c/d;p?q", "g", "http://a/b/c/g" },
+ { "http://a/b/c/d;p?q", "./g", "http://a/b/c/g" },
+ { "http://a/b/c/d;p?q", "g/", "http://a/b/c/g/" },
+ { "http://a/b/c/d;p?q", "/g", "http://a/g" },
+ { "http://a/b/c/d;p?q", "//g", "http://g" },
+ { "http://a/b/c/d;p?q", "?y", "http://a/b/c/?y" },
+ { "http://a/b/c/d;p?q", "g?y", "http://a/b/c/g?y" },
+ { "http://a/b/c/d;p?q", "#s", "http://a/b/c/d;p?q#s" },
+ { "http://a/b/c/d;p?q", "g#s", "http://a/b/c/g#s" },
+ { "http://a/b/c/d;p?q", "g?y#s", "http://a/b/c/g?y#s" },
+ { "http://a/b/c/d;p?q", ";x", "http://a/b/c/;x" },
+ { "http://a/b/c/d;p?q", "g;x", "http://a/b/c/g;x" },
+ { "http://a/b/c/d;p?q", "g;x?y#s", "http://a/b/c/g;x?y#s" },
+ { "http://a/b/c/d;p?q", ".", "http://a/b/c/" },
+ { "http://a/b/c/d;p?q", "./", "http://a/b/c/" },
+ { "http://a/b/c/d;p?q", "..", "http://a/b/" },
+ { "http://a/b/c/d;p?q", "../", "http://a/b/" },
+ { "http://a/b/c/d;p?q", "../g", "http://a/b/g" },
+ { "http://a/b/c/d;p?q", "../..", "http://a/" },
+ { "http://a/b/c/d;p?q", "../../", "http://a/" },
+ { "http://a/b/c/d;p?q", "../../g", "http://a/g" },
+ { "http://a/b/c/d;p?q", "", "http://a/b/c/d;p?q" },
+ { "http://a/b/c/d;p?q", "../../../g", "http://a/../g" },
+ { "http://a/b/c/d;p?q", "../../../../g", "http://a/../../g" },
+ { "http://a/b/c/d;p?q", "/./g", "http://a/./g" },
+ { "http://a/b/c/d;p?q", "/../g", "http://a/../g" },
+ { "http://a/b/c/d;p?q", "g.", "http://a/b/c/g." },
+ { "http://a/b/c/d;p?q", ".g", "http://a/b/c/.g" },
+ { "http://a/b/c/d;p?q", "g..", "http://a/b/c/g.." },
+ { "http://a/b/c/d;p?q", "..g", "http://a/b/c/..g" },
+ { "http://a/b/c/d;p?q", "./../g", "http://a/b/g" },
+ { "http://a/b/c/d;p?q", "./g/.", "http://a/b/c/g/" },
+ { "http://a/b/c/d;p?q", "g/./h", "http://a/b/c/g/h" },
+ { "http://a/b/c/d;p?q", "g/../h", "http://a/b/c/h" },
+ { "http://a/b/c/d;p?q", "g;x=1/./y", "http://a/b/c/g;x=1/y" },
+ { "http://a/b/c/d;p?q", "g;x=1/../y", "http://a/b/c/y" },
+ { "http://a/b/c/d;p?q", "g?y/./x", "http://a/b/c/g?y/./x" },
+ { "http://a/b/c/d;p?q", "g?y/../x", "http://a/b/c/g?y/../x" },
+ { "http://a/b/c/d;p?q", "g#s/./x", "http://a/b/c/g#s/./x" },
+ { "http://a/b/c/d;p?q", "g#s/../x", "http://a/b/c/g#s/../x" },
+ { "http://a/b/c/d;p?q", "http:g", "http:g" },
+ { "http!://a/b/c/d;p?q", "g:h", "g:h" },
+ { "http!://a/b/c/d;p?q", "g", 0 },
+ { "http:b/c/d;p?q", "g:h", "g:h" },
+ { "http:b/c/d;p?q", "g", 0 },
+ { "http://a/b/../", "../c", "http://a/b/../../c" },
+ { "http://a/b/..", "../c", "http://a/c" },
+ { "http://a/./b/", ".././.././../c", "http://a/./../../c" } };
+ for (std::size_t i = 0; i < sizeof aRelToAbsTest / sizeof (RelToAbsTest); ++i)
+ {
+ rtl::OUString aAbs;
+ bool bMalformed = false;
+ try {
+ aAbs = rtl::Uri::convertRelToAbs(
+ rtl::OUString::createFromAscii(aRelToAbsTest[i].pBase),
+ rtl::OUString::createFromAscii(aRelToAbsTest[i].pRel));
+ } catch (rtl::MalformedUriException &) {
+ bMalformed = true;
+ }
+ if (bMalformed
+ ? aRelToAbsTest[i].pAbs != 0
+ : (aRelToAbsTest[i].pAbs == 0
+ || !aAbs.equalsAscii(aRelToAbsTest[i].pAbs)))
+ {
+ printf(
+ "FAILED convertRelToAbs(%s, %s) -> %s != %s\n",
+ aRelToAbsTest[i].pBase, aRelToAbsTest[i].pRel,
+ (bMalformed
+ ? "<MALFORMED>"
+ : rtl::OUStringToOString(
+ aAbs, RTL_TEXTENCODING_UTF8).getStr()),
+ (aRelToAbsTest[i].pAbs == 0
+ ? "<MALFORMED>" : aRelToAbsTest[i].pAbs));
+ CPPUNIT_ASSERT(false);
+ }
+ }
+
+ // Check encode with unusual text encodings:
+
+ {
+ sal_Unicode const aText1U[] = { ' ', '!', 0x0401, 0x045F, 0 };
+ aText1 = rtl::OUString(aText1U);
+ aText2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%20!%A1%FF"));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 20",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeIgnoreEscapes,
+ RTL_TEXTENCODING_ISO_8859_5)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 20a",
+ (rtl::Uri::decode(
+ aText2, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_5)
+ == aText1));
+ }
+ {
+ sal_Unicode const aText1U[] = { ' ', '!', 0x0401, 0x0700, 0x045F, 0 };
+ aText1 = rtl::OUString(aText1U);
+ sal_Unicode const aText2U[] = {
+ '%', '2', '0', '!', '%', 'A', '1', 0x0700, '%', 'F', 'F', 0 };
+ aText2 = rtl::OUString(aText2U);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 21",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeIgnoreEscapes,
+ RTL_TEXTENCODING_ISO_8859_5)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 21a",
+ (rtl::Uri::decode(
+ aText2, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_ISO_8859_5)
+ == aText1));
+ }
+ {
+ sal_Unicode const aText1U[] = { ' ', '!', 0x028A, 0xD849, 0xDD13, 0 };
+ aText1 = rtl::OUString(aText1U);
+ aText2 = rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("%20!%81%30%B1%33%95%39%C5%37"));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 22",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeIgnoreEscapes,
+ RTL_TEXTENCODING_GB_18030)
+ == aText2));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 22a",
+ (rtl::Uri::decode(
+ aText2, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_GB_18030)
+ == aText1));
+ }
+
+ // Check strict mode:
+
+ {
+ sal_Unicode const aText1U[] = { ' ', '!', 0x0401, 0x0700, 0x045F, 0 };
+ aText1 = rtl::OUString(aText1U);
+ aText2 = rtl::OUString();
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 23",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeStrict,
+ RTL_TEXTENCODING_ISO_8859_5)
+ == aText2));
+ }
+ {
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%20%C4%80%FF"));
+ aText2 = rtl::OUString();
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 24",
+ (rtl::Uri::decode(
+ aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_UTF8)
+ == aText2));
+ }
+ {
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%81 "));
+ aText2 = rtl::OUString();
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 25",
+ (rtl::Uri::decode(
+ aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_GB_18030)
+ == aText2));
+ }
+ {
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%81%20"));
+ aText2 = rtl::OUString();
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 26",
+ (rtl::Uri::decode(
+ aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_GB_18030)
+ == aText2));
+ }
+ {
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%81%30%B1%33"));
+ sal_Unicode const aText2U[] = { 0x028A, 0 };
+ aText2 = rtl::OUString(aText2U);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 27",
+ (rtl::Uri::decode(
+ aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_GB_18030)
+ == aText2));
+ }
+ {
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%810%B13"));
+ sal_Unicode const aText2U[] = { 0x028A, 0 };
+ aText2 = rtl::OUString(aText2U);
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 28",
+ (rtl::Uri::decode(
+ aText1, rtl_UriDecodeStrict, RTL_TEXTENCODING_GB_18030)
+ == aText2));
+ }
+
+ // Check rtl_UriEncodeStrictKeepEscapes mode:
+
+ {
+ aText1 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%%ea%c3%aa"));
+ aText2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%25%EA%C3%AA"));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 29",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeStrictKeepEscapes,
+ RTL_TEXTENCODING_UTF8)
+ == aText2));
+ }
+ {
+ sal_Unicode const aText1U[] = { 0x00EA, 0 };
+ aText1 = rtl::OUString(aText1U);
+ aText2 = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%C3%AA"));
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 30",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeStrictKeepEscapes,
+ RTL_TEXTENCODING_UTF8)
+ == aText2));
+ }
+ {
+ sal_Unicode const aText1U[] = { ' ', '!', 0x0401, 0x0700, 0x045F, 0 };
+ aText1 = rtl::OUString(aText1U);
+ aText2 = rtl::OUString();
+ CPPUNIT_ASSERT_MESSAGE(
+ "failure 23",
+ (rtl::Uri::encode(
+ aText1, rtl_UriCharClassUric, rtl_UriEncodeStrictKeepEscapes,
+ RTL_TEXTENCODING_ISO_8859_5)
+ == aText2));
+ }
+}
+
+}
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(Test, "rtl_testuri");
+NOADDITIONAL;
diff --git a/sal/qa/rtl/uuid/makefile.mk b/sal/qa/rtl/uuid/makefile.mk
new file mode 100644
index 000000000000..40e583f8b019
--- /dev/null
+++ b/sal/qa/rtl/uuid/makefile.mk
@@ -0,0 +1,68 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=rtl_uuid
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGSCXX += $(CPPUNIT_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:joblist by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_Uuid.obj
+
+SHL1TARGET= rtl_Uuid
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# END ------------------------------------------------------------------
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/rtl/uuid/rtl_Uuid.cxx b/sal/qa/rtl/uuid/rtl_Uuid.cxx
new file mode 100644
index 000000000000..0c4bcefe66ac
--- /dev/null
+++ b/sal/qa/rtl/uuid/rtl_Uuid.cxx
@@ -0,0 +1,228 @@
+ /*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <math.h>
+#include <stdio.h>
+
+#include <testshl/simpleheader.hxx>
+#include <rtl/uuid.h>
+#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
+
+#ifdef UNX
+#include <unistd.h>
+#include <time.h>
+#endif
+
+using namespace rtl;
+
+/** print a UNI_CODE String. And also print some comments of the string.
+*/
+inline void printUString( const ::rtl::OUString & str, const sal_Char * msg = "" )
+{
+ t_print("#%s #printUString_u# ", msg );
+ rtl::OString aString;
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ t_print("%s\n", (char *)aString.getStr( ) );
+}
+
+/************************************************************************
+ * For diagnostics( from sal/test/testuuid.cxx )
+ ************************************************************************/
+
+void printUuid( sal_uInt8 *pNode )
+{
+ for( sal_Int32 i1 = 0 ; i1 < 4 ; i1++ )
+ {
+ for( sal_Int32 i2 = 0 ; i2 < 4 ; i2++ )
+ {
+ printf( "%02x" , pNode[i1*4 +i2] );
+ }
+ if( i1 == 3 )
+ break;
+ printf( "-" );
+ }
+
+ printf( "\n# " );
+}
+
+namespace rtl_Uuid
+{
+class createUuid : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+#define TEST_UUID 20
+ void createUuid_001()
+ {
+ sal_uInt8 aNode[TEST_UUID][16];
+ sal_Int32 i,i2;
+ for( i = 0 ; i < TEST_UUID ; i ++ )
+ {
+ rtl_createUuid( aNode[i], 0, sal_False );
+ }
+ sal_Bool bRes = sal_True;
+ for( i = 0 ; i < TEST_UUID ; i ++ )
+ {
+ for( i2 = i+1 ; i2 < TEST_UUID ; i2 ++ )
+ {
+ if ( rtl_compareUuid( aNode[i] , aNode[i2] ) == 0 )
+ {
+ bRes = sal_False;
+ break;
+ }
+ }
+ if ( bRes == sal_False )
+ break;
+ }
+ CPPUNIT_ASSERT_MESSAGE("createUuid: every uuid must be different.", bRes == sal_True );
+ }
+ /*
+ void createUuid_002()
+ {
+ sal_uInt8 pNode[16];
+ sal_uInt8 aNode[TEST_UUID][16];
+ sal_Int32 i,i2;
+ for( i = 0 ; i < TEST_UUID ; i ++ )
+ {
+ rtl_createUuid( aNode[i], pNode, sal_True );
+ }
+ sal_Bool bRes = sal_True;
+ for( i = 0 ; i < TEST_UUID ; i ++ )
+ {
+ //printUuid( aNode[i] );
+ for( i2 = i+1 ; i2 < TEST_UUID ; i2 ++ )
+ {
+ if ( rtl_compareUuid( aNode[i] , aNode[i2] ) == 0 )
+ {
+ bRes = sal_False;
+ break;
+ }
+ }
+ if ( bRes == sal_False )
+ break;
+ }
+ CPPUNIT_ASSERT_MESSAGE("createUuid: every uuid must be different.", bRes == sal_True );
+ }*/
+
+ CPPUNIT_TEST_SUITE(createUuid);
+ CPPUNIT_TEST(createUuid_001);
+ //CPPUNIT_TEST(createUuid_002);
+ CPPUNIT_TEST_SUITE_END();
+}; // class createUuid
+
+namespace ThreadHelper
+{
+ void thread_sleep(sal_Int32 _nSec)
+ {
+#ifdef WNT //Windows
+ Sleep(_nSec * 10 );
+#endif
+#if ( defined UNX ) || ( defined OS2 ) //Unix
+ sleep( _nSec );
+#endif
+ }
+}
+
+class createNamedUuid : public CppUnit::TestFixture
+{
+public:
+ // initialise your test code values here.
+ void setUp()
+ {
+ }
+
+ void tearDown()
+ {
+ }
+
+ void createNamedUuid_001()
+ {
+ sal_uInt8 NameSpace_DNS[16] = RTL_UUID_NAMESPACE_DNS;
+ sal_uInt8 NameSpace_URL[16] = RTL_UUID_NAMESPACE_URL;
+ sal_uInt8 pPriorCalculatedUUID[16] = {
+ 0x52,0xc9,0x30,0xa5,
+ 0xd1,0x61,0x3b,0x16,
+ 0x98,0xc5,0xf8,0xd1,
+ 0x10,0x10,0x6d,0x4d };
+
+ sal_uInt8 pNamedUUID[16], pNamedUUID2[16];
+
+ // Same name does generate the same uuid
+ rtl_String *pName = 0;
+ rtl_string_newFromStr( &pName , "this is a bla.blubs.DNS-Name" );
+ rtl_createNamedUuid( pNamedUUID , NameSpace_DNS , pName );
+ rtl_createNamedUuid( pNamedUUID2 , NameSpace_DNS , pName );
+ CPPUNIT_ASSERT_MESSAGE( "Same name should generate the same uuid", ! memcmp( pNamedUUID , pNamedUUID2 , 16 ) && rtl_compareUuid( pNamedUUID , pNamedUUID2 ) == 0 );
+ CPPUNIT_ASSERT_MESSAGE( "Same name should generate the same uuid", ! memcmp( pNamedUUID , pPriorCalculatedUUID , 16 ) );
+
+ // Different names does not generate the same uuid
+ rtl_string_newFromStr( &pName , "this is a bla.blubs.DNS-Namf" );
+ rtl_createNamedUuid( pNamedUUID2 , NameSpace_DNS , pName );
+ CPPUNIT_ASSERT_MESSAGE("Different names does not generate the same uuid.", memcmp( pNamedUUID , pNamedUUID2 , 16 ) );
+
+ // the same name with different namespace uuid produces different uuids
+ rtl_createNamedUuid( pNamedUUID , NameSpace_URL , pName );
+ CPPUNIT_ASSERT_MESSAGE( " same name with different namespace uuid produces different uuids", memcmp( pNamedUUID , pNamedUUID2 , 16 ) && rtl_compareUuid( pNamedUUID , pNamedUUID2 ) != 0);
+
+ //test compareUuid
+ if ( rtl_compareUuid( pNamedUUID , pNamedUUID2 ) > 0 )
+ { CPPUNIT_ASSERT_MESSAGE( " compare uuids", rtl_compareUuid( pNamedUUID2 , pNamedUUID ) < 0);
+ }
+ else
+ CPPUNIT_ASSERT_MESSAGE( " compare uuids", rtl_compareUuid( pNamedUUID2 , pNamedUUID ) > 0);
+
+ rtl_string_release( pName );
+ }
+
+ CPPUNIT_TEST_SUITE(createNamedUuid);
+ CPPUNIT_TEST(createNamedUuid_001);
+ CPPUNIT_TEST_SUITE_END();
+}; // class createNamedUuid
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Uuid::createUuid, "rtl_Uuid");
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(rtl_Uuid::createNamedUuid, "rtl_Uuid");
+} // namespace rtl_Uuid
+
+// -----------------------------------------------------------------------------
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
+
diff --git a/sal/qa/rtl_strings/export.exp b/sal/qa/rtl_strings/export.exp
new file mode 100644
index 000000000000..a13529da5876
--- /dev/null
+++ b/sal/qa/rtl_strings/export.exp
@@ -0,0 +1 @@
+registerAllTestFunction
diff --git a/sal/qa/rtl_strings/makefile.mk b/sal/qa/rtl_strings/makefile.mk
new file mode 100644
index 000000000000..708a41a87887
--- /dev/null
+++ b/sal/qa/rtl_strings/makefile.mk
@@ -0,0 +1,152 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..
+
+PRJNAME=sal
+TARGET=qa_rtl_strings
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:FileBase by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/rtl_String_Utils.obj \
+ $(SLO)$/rtl_OString.obj
+
+SHL1TARGET= rtl_OString
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# auto generated Target:FileBase
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:FileBase by codegen.pl
+SHL2OBJS= \
+ $(SLO)$/rtl_String_Utils.obj \
+ $(SLO)$/rtl_OUString.obj
+
+SHL2TARGET= rtl_OUString
+SHL2STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL2IMPLIB= i$(SHL2TARGET)
+# SHL2DEF= $(MISC)$/$(SHL2TARGET).def
+
+DEF2NAME =$(SHL2TARGET)
+# DEF2EXPORTFILE= export.exp
+SHL2VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# auto generated Target:FileBase
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:FileBase by codegen.pl
+SHL3OBJS= \
+ $(SLO)$/rtl_String_Utils.obj \
+ $(SLO)$/rtl_OUStringBuffer.obj
+
+SHL3TARGET= rtl_OUStringBuffer
+SHL3STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL3IMPLIB= i$(SHL3TARGET)
+# SHL3DEF= $(MISC)$/$(SHL3TARGET).def
+
+DEF3NAME =$(SHL3TARGET)
+# DEF3EXPORTFILE= export.exp
+SHL3VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# auto generated Target:FileBase
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+SHL4OBJS= \
+ $(SLO)$/rtl_old_teststrbuf.obj
+
+SHL4TARGET= rtl_old_teststrbuf
+SHL4STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL4IMPLIB= i$(SHL4TARGET)
+DEF4NAME =$(SHL4TARGET)
+SHL4VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+SHL5OBJS= \
+ $(SLO)$/rtl_old_testowstring.obj
+
+SHL5TARGET= rtl_old_testowstring
+SHL5STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL5IMPLIB= i$(SHL5TARGET)
+DEF5NAME =$(SHL5TARGET)
+SHL5VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END ------------------------------------------------------------------
+
+# BEGIN ----------------------------------------------------------------
+SHL6OBJS= \
+ $(SLO)$/rtl_old_testostring.obj
+
+SHL6TARGET= rtl_old_testostring
+SHL6STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL6IMPLIB= i$(SHL6TARGET)
+DEF6NAME =$(SHL6TARGET)
+SHL6VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+SLOFILES=\
+ $(SHL1OBJS) \
+ $(SHL2OBJS) \
+ $(SHL3OBJS) \
+ $(SHL4OBJS) \
+ $(SHL5OBJS) \
+ $(SHL6OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
+
diff --git a/sal/qa/rtl_strings/readme.txt b/sal/qa/rtl_strings/readme.txt
new file mode 100644
index 000000000000..388c98751e8d
--- /dev/null
+++ b/sal/qa/rtl_strings/readme.txt
@@ -0,0 +1,20 @@
+This is the old test implemantation of rtl::XString.
+If you want to write new or better tests:
+Identify the test function in the source and remark it.
+
+The best way to remark old tests, go to the end of the source code and remark
+only the test_rtl_<X>String_<function>(hRtlTestResult); so the test will not
+executed any longer.
+
+There are already some new tests for rtl::XString, take a look into the
+directory sal/qa/rtl/ostring or sal/qa/rtl/oustring, where are some
+replacements added.
+
+
+Any other Questions?
+
+Do not hesitate to contact me at 'lla<at>openoffice.org'.
+
+best regards,
+Lars
+
diff --git a/sal/qa/rtl_strings/rtl_OString.cxx b/sal/qa/rtl_strings/rtl_OString.cxx
new file mode 100644
index 000000000000..fc777f11b723
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_OString.cxx
@@ -0,0 +1,3605 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <string.h>
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+// #ifndef _RTL_TRES_H_
+// #include <rtl/tres.h>
+// #endif
+
+#include <testshl/tresstatewrapper.hxx>
+
+#ifndef _RTL_STRING_HXX_
+ #include <rtl/string.hxx>
+#endif
+
+#ifndef _RTL_STRING_CONST_H_
+ #include <rtl_String_Const.h>
+#endif
+
+#ifndef _RTL_STRING_UTILS_HXX_
+ #include <rtl_String_Utils.hxx>
+#endif
+#include <rtl/ustring.h>
+
+using namespace rtl;
+
+//------------------------------------------------------------------------
+// test classes
+//------------------------------------------------------------------------
+const int MAXBUFLENGTH = 255;
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+static void unused()
+{
+ test_ini_uString();
+ (void)inputChar;
+ (void)input1StrDefault;
+ (void)input1StrNormal;
+ (void)input1StrLastDefault;
+ (void)input1StrLastNormal;
+ unused();
+}
+
+//------------------------------------------------------------------------
+// testing constructors
+//------------------------------------------------------------------------
+static sal_Bool test_rtl_OString_ctor_001( hTestResult hRtlTestResult )
+{
+ ::rtl::OString aStr;
+ rtl_String* pData = aStr.pData;
+
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ pData->length == 0 &&
+ ! *pData->buffer,
+ "New OString containing no characters",
+ "ctor_001"
+ )
+ );
+}
+
+//------------------------------------------------------------------------
+
+static sal_Bool SAL_CALL test_rtl_OString_ctor_002(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OString aStr(kTestStr1);
+ rtl_String* pData = aStr.pData;
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ pData->refCount == 1 &&
+ pData->length == kTestStr1Len &&
+ cmpstr( (const sal_Char*)pData->buffer, kTestStr1, kTestStr1Len ),
+ "New OString from a character buffer array",
+ "ctor_002"
+ )
+ );
+}
+//------------------------------------------------------------------------
+
+static sal_Bool SAL_CALL test_rtl_OString_ctor_003(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OString aStr(kTestStr2, kTestStr1Len);
+ rtl_String* pData = aStr.pData;
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ pData->refCount == 1 &&
+ pData->length == kTestStr1Len &&
+ cmpstr( (const sal_Char*)pData->buffer, kTestStr2, kTestStr1Len ),
+ "New OString from the first n chars of ascii string",
+ "ctor_003"
+ )
+ );
+}
+
+//------------------------------------------------------------------------
+
+static sal_Bool SAL_CALL test_rtl_OString_ctor_004(
+ hTestResult hRtlTestResult)
+{
+ ::rtl::OString aStr1(kTestStr1);
+ ::rtl::OString aStr2(aStr1);
+ rtl_String* pData1 = aStr1.pData;
+ rtl_String* pData2 = aStr2.pData;
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ pData1->refCount == pData2->refCount &&
+ pData1->length == kTestStr1Len &&
+ pData1->buffer == pData2->buffer,
+ "New OString from an OString",
+ "ctor_004"
+ )
+ );
+}
+//------------------------------------------------------------------------
+
+static sal_Bool test_rtl_OString_ctor_005( hTestResult hRtlTestResult )
+{
+ rtl_String *aStr1 = NULL;
+
+ rtl_string_newFromStr( &aStr1, kTestStr1 );
+
+ if ( aStr1 != NULL )
+ {
+ ::rtl::OString aStr2(aStr1);
+ rtl_String* pData2 = aStr2.pData;
+
+ sal_Bool bOK = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr1->refCount == pData2->refCount &&
+ pData2->length == kTestStr1Len &&
+ aStr1->buffer == pData2->buffer,
+ "new OString from a RTL String",
+ "ctor_005"
+ );
+
+ rtl_string_release( aStr1 );
+ aStr1 = NULL;
+ return ( bOK );
+ }
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ sal_False,
+ "copying an ascii string to a RTL String!",
+ "ctor_005"
+ )
+ );
+}
+
+//------------------------------------------------------------------------
+
+static sal_Bool test_rtl_OString_ctor_006( hTestResult hRtlTestResult )
+{
+
+ sal_Unicode aStr1[kTestStr1Len+1];
+
+ if ( AStringToUStringNCopy( aStr1, kTestStr1, kTestStr1Len ) )
+ {
+ if ( AStringToUStringNCompare( aStr1, kTestStr1, kTestStr1Len ) == 0 )
+ {
+ // const sal_Char *kTCMessage[2] = { "", "array." };
+
+ ::rtl::OString aStr2
+ (
+ aStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOUStringToOString
+ );
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr2 == kTestStr1,
+ "new OString from a unicode character buffer",
+ "ctor_006"
+ )
+ );
+ } /// end if AStringToUStringNCompare
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ sal_False,
+ "compare ascii string with unicode string!",
+ "ctor_006"
+ )
+ );
+ } /// end if AStringToUStringNCopy
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ sal_False,
+ "copy ascii string to unicode string!",
+ "ctor_006"
+ )
+ );
+}
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_ctors(
+ hTestResult hRtlTestResult )
+{
+
+ c_rtl_tres_state_start(hRtlTestResult, "ctor");
+ sal_Bool bTSState = test_rtl_OString_ctor_001( hRtlTestResult );
+
+ bTSState &= test_rtl_OString_ctor_002( hRtlTestResult);
+ bTSState &= test_rtl_OString_ctor_003( hRtlTestResult);
+ bTSState &= test_rtl_OString_ctor_004( hRtlTestResult);
+ bTSState &= test_rtl_OString_ctor_005( hRtlTestResult);
+ bTSState &= test_rtl_OString_ctor_006( hRtlTestResult);
+
+ c_rtl_tres_state_end(hRtlTestResult, "ctor");
+
+// return( bTSState );
+}
+
+
+
+//------------------------------------------------------------------------
+// testing the method getLength
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_getLength(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "getLength");
+
+typedef struct TestCase
+{
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OString* input;
+ ~TestCase() { delete input;}
+} TestCase;
+
+TestCase arrTestCase[]={
+
+ {"length of ascii string", kTestStr1Len, new OString(kTestStr1)},
+ {"length of ascci string of size 1", 1, new OString("1")},
+ {"length of empty string (default constructor)", 0, new OString()},
+ {"length of empty string (empty ascii string arg)",0,new OString("")},
+ {"length of empty string (string arg = '\\0')",0,new OString("\0")}
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 length = arrTestCase[i].input->getLength();
+ sal_Bool lastRes = (length == arrTestCase[i].expVal);
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "getLength", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "getLength");
+// return ( res );
+}
+
+
+
+//------------------------------------------------------------------------
+// testing the method equals( const OString & aStr )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_equals(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "equals");
+
+ typedef struct TestCase
+{
+ sal_Char* comments;
+ sal_Bool expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+} TestCase;
+
+TestCase arrTestCase[]={
+
+ {"same size", sal_True, new OString(kTestStr1),new OString(kTestStr1)},
+ {"different size", sal_False, new OString(kTestStr1),
+ new OString(kTestStr2)},
+ {"same size, no case match", sal_False, new OString(kTestStr1),
+ new OString(kTestStr3)},
+ {"two empty strings(def. constructor)", sal_True, new OString(),
+ new OString()},
+ {"empty(def.constructor) and non empty", sal_False, new OString(),
+ new OString(kTestStr2)},
+ {"non empty and empty(def. constructor)", sal_False,
+ new OString(kTestStr1),new OString()},
+ {"two empty strings(string arg = '\\0')", sal_True,
+ new OString(""),new OString("")},
+ {"empty(string arg = '\\0') and non empty", sal_False,
+ new OString(""),new OString(kTestStr2)},
+ {"non empty and empty(string arg = '\\0')", sal_False,
+ new OString(kTestStr1),new OString("")}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->equals(*(arrTestCase[i].input2)) ==
+ arrTestCase[i].expVal );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "equals", i )
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "equals");
+// return (res);
+}
+
+//------------------------------------------------------------------------
+// testing the method equalsIgnoreAsciiCase( const OString & aStr )
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_equalsIgnoreAsciiCase(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "equalsIgnoreAsciiCase");
+ typedef struct TestCase
+{
+ sal_Char* comments;
+ sal_Bool expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+} TestCase;
+
+TestCase arrTestCase[]={
+ {"same strings but different cases",sal_True,new OString(kTestStr4),
+ new OString(kTestStr5)},
+ {"same strings",sal_True,new OString(kTestStr4),
+ new OString(kTestStr4)},
+ {"with equal beginning",sal_False,new OString(kTestStr2),
+ new OString(kTestStr4)},
+ {"empty(def.constructor) and non empty",sal_False,new OString(),
+ new OString(kTestStr5)},
+ {"non empty and empty(def.constructor)",sal_False,
+ new OString(kTestStr4), new OString()},
+ {"two empty strings(def.constructor)",sal_True,new OString(),
+ new OString()},
+ {"different strings with equal length",sal_False,
+ new OString(kTestStr10), new OString(kTestStr11)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes =
+ (arrTestCase[i].input1->equalsIgnoreAsciiCase(*arrTestCase[i].input2)
+ == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "equalsIgnoreAsciiCase", i )
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "equalsIgnoreAsciiCase");
+
+// return (res);
+}
+
+static sal_Bool SAL_CALL test_rtl_OString_compareTo_001(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+{
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+} TestCase;
+
+TestCase arrTestCase[]={
+
+ {"simple compare, str1 to str5",-1,new OString(kTestStr1),
+ new OString(kTestStr5)},
+ {"simple compare, str2 to str5",-1,new OString(kTestStr2),
+ new OString(kTestStr5)},
+ {"simple compare, str1 to str9",-1,new OString(kTestStr1),
+ new OString(kTestStr9)},
+ {"simple compare, str1 to str2",-1,new OString(kTestStr1),
+ new OString(kTestStr2)},
+ {"simple compare, str4 to str5",-1,new OString(kTestStr4),
+ new OString(kTestStr5)},
+ {"simple compare, str1 to str3",-1,new OString(kTestStr1),
+ new OString(kTestStr3)},
+ {"simple compare, str5 to str1",+1,new OString(kTestStr5),
+ new OString(kTestStr1)},
+ {"simple compare, str2 to str1",+1,new OString(kTestStr2),
+ new OString(kTestStr1)},
+ {"simple compare, str9 to str5",+1,new OString(kTestStr9),
+ new OString(kTestStr5)},
+ {"simple compare, str5 to str4",+1,new OString(kTestStr5),
+ new OString(kTestStr4)},
+ {"simple compare, str1 to str1",0,new OString(kTestStr1),
+ new OString(kTestStr1)},
+ {"simple compare, nullString to nullString",0,new OString(),
+ new OString()},
+ {"simple compare, nullString to str2",-1,new OString(),
+ new OString(kTestStr2)},
+ {"simple compare, str1 to nullString",+1,new OString(kTestStr1),
+ new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 cmpRes =
+ arrTestCase[i].input1->compareTo(*arrTestCase[i].input2);
+ cmpRes = ( cmpRes == 0 ) ? 0 : ( cmpRes > 0 ) ? +1 : -1 ;
+ sal_Bool lastRes = ( cmpRes == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "compareTo(const OString&)", i )
+ );
+
+ res &= lastRes;
+ }
+
+ return (res);
+}
+
+
+//------------------------------------------------------------------------
+// testing the method compareTo( const OString & rObj, sal_Int32 length )
+//------------------------------------------------------------------------
+static sal_Bool SAL_CALL test_rtl_OString_compareTo_002(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ sal_Int32 maxLength;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"compare with maxlength, str1 to str9, 16",-1,16,
+ new OString(kTestStr1), new OString(kTestStr9)},
+ {"compare with maxlength, str2 to str9, 32",-1,32,
+ new OString(kTestStr2), new OString(kTestStr9)},
+ {"compare with maxlength, str9 to str4, 16",+1,16,
+ new OString(kTestStr9), new OString(kTestStr4)},
+ {"compare with maxlength, str9 to str22, 32",+1,32,
+ new OString(kTestStr9), new OString(kTestStr22)},
+ {"compare with maxlength, str9 to str5, 16",0,16,
+ new OString(kTestStr9), new OString(kTestStr5)},
+ {"compare with maxlength, str9 to str9, 32",0,32,
+ new OString(kTestStr9), new OString(kTestStr9)},
+ {"compare with maxlength, str1 to str2, 32",-1,32,
+ new OString(kTestStr1), new OString(kTestStr2)},
+ {"compare with maxlength, str1 to str2, 32",-1,32,
+ new OString(kTestStr1), new OString(kTestStr2)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 cmpRes =
+ arrTestCase[i].input1->compareTo(*arrTestCase[i].input2,
+ arrTestCase[i].maxLength);
+ cmpRes = (cmpRes == 0) ? 0 : (cmpRes > 0) ? +1 : -1 ;
+ sal_Bool lastRes = (cmpRes == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "compareTo(const OString&, sal_Int32)", i )
+ );
+
+ res &= lastRes;
+ }
+
+ return (res);
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_compareTo(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start(hRtlTestResult, "compareTo");
+ sal_Bool res = test_rtl_OString_compareTo_001(hRtlTestResult);
+ res &= test_rtl_OString_compareTo_002(hRtlTestResult);
+ c_rtl_tres_state_end(hRtlTestResult, "compareTo");
+// return (res);
+}
+
+//------------------------------------------------------------------------
+// testing the operator == ( const OString& rStr1, const OString& rStr2 )
+// testing the operator == ( const OString& rStr1, const sal_Char *rStr2 )
+// testing the operator == ( const sal_Char *rStr1, const OString& rStr2 )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_cmp(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start(hRtlTestResult, "op_cmp");
+ const sal_Int16 NCASES = 7;
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+ const sal_Char *arrOStr[NCASES][2] =
+ {
+ {kTestStr1, kTestStr1},
+ {kTestStr1, kTestStr3},
+ {kTestStr1, kTestStr2},
+ {0, 0},
+ {0, kTestStr2},
+ {kTestStr1, 0},
+ {"", ""}
+ };
+
+ sal_Bool arrExpVal[NCASES] =
+ {
+ sal_True,
+ sal_False,
+ sal_False,
+ sal_True,
+ sal_False,
+ sal_False,
+ sal_True
+ };
+
+ sal_Char *arrComments[NCASES] =
+ {
+ "'Sun Microsystems'=='Sun Microsystems'",
+ "!('Sun Microsystems'=='Sun microsystems')",
+ "!('Sun Microsystems'=='Sun Microsystems Java Technology')",
+ "two empty strings(def.constructor)",
+ "!(empty string=='Sun Microsystems Java Technology')",
+ "!('Sun Microsystems Java Technology'==empty string)",
+ "''==''"
+ };
+
+ sal_Bool res = sal_True;
+ sal_Int32 i;
+
+ for(i = 0; i < NCASES; i++)
+ {
+ OString *str1, *str2;
+ str1 = (arrOStr[i][0]) ? new OString(arrOStr[i][0]) : new OString() ;
+ str2 = (arrOStr[i][1]) ? new OString(arrOStr[i][1]) : new OString() ;
+
+ sal_Bool cmpRes = (*str1 == *str2);
+ sal_Bool lastRes = (cmpRes == arrExpVal[i]);
+ res &= lastRes;
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrComments[i],
+ createName( pMeth, "operator ==(OString&, OString&)", i )
+ );
+
+ cmpRes = (*str1 == arrOStr[i][1]);
+ lastRes = (cmpRes == arrExpVal[i]);
+ res &= lastRes;
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrComments[i],
+ createName( pMeth, "operator ==(OString&, sal_Char *)", i )
+ );
+
+ cmpRes = (arrOStr[i][0] == *str2);
+ lastRes = (cmpRes == arrExpVal[i]);
+ res &= lastRes;
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrComments[i],
+ createName( pMeth, "operator ==(sal_Char *, OString&)", i )
+ );
+
+ delete str2;
+ delete str1;
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "op_cmp");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator != (const OString& rStr1, const OString& rStr2)
+// testing the operator != (const OString& rStr1, const sal_Char *rStr2)
+// testing the operator != (const sal_Char *rStr1, const OString& rStr2)
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_neq(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start(hRtlTestResult, "op_neq");
+ const sal_Int16 NCASES = 6;
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ const sal_Char *arrOStr[NCASES][2] =
+ {
+ {kTestStr1, kTestStr3},
+ {kTestStr1, kTestStr2},
+ {kTestStr1, kTestStr1},
+ {0, kTestStr2},
+ {kTestStr1, 0},
+ {0, 0}
+ };
+
+ sal_Bool arrExpVal[NCASES] =
+ {
+ sal_True,
+ sal_True,
+ sal_False,
+ sal_True,
+ sal_True,
+ sal_False
+ };
+
+ sal_Char *arrComments[NCASES] =
+ {
+ "'Sun Microsystems'!='Sun microsystems'",
+ "'Sun Microsystems'!='Sun Microsystems Java Technology'",
+ "!('Sun Microsystems'!='Sun Microsystems')",
+ "empty string!='Sun Microsystems Java Technology'",
+ "'Sun Microsystems Java Technology'!=empty string", "!(''!='')"
+ };
+
+ sal_Bool res = sal_True;
+ sal_Int32 i;
+
+ for(i = 0; i < NCASES; i++)
+ {
+ OString *str1, *str2;
+ str1 = (arrOStr[i][0]) ? new OString(arrOStr[i][0]) : new OString() ;
+ str2 = (arrOStr[i][1]) ? new OString(arrOStr[i][1]) : new OString() ;
+
+ sal_Bool cmpRes = (*str1 != *str2);
+ sal_Bool lastRes = (cmpRes == arrExpVal[i]);
+ res &= lastRes;
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrComments[i],
+ createName( pMeth, "operator !=(OString&, OString&)", i )
+ );
+
+ cmpRes = (*str1 != arrOStr[i][1]);
+ lastRes = (cmpRes == arrExpVal[i]);
+ res &= lastRes;
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrComments[i],
+ createName( pMeth, "operator !=(OString&, sal_Char *)", i )
+ );
+
+ cmpRes = (arrOStr[i][0] != *str2);
+ lastRes = (cmpRes == arrExpVal[i]);
+ res &= lastRes;
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrComments[i],
+ createName( pMeth, "operator !=(sal_Char *, OString&)", i )
+ );
+
+ delete str2;
+ delete str1;
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "op_neq");
+// return ( res );
+}
+
+
+//------------------------------------------------------------------------
+// testing the operator > (const OString& rStr1, const OString& rStr2)
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_g(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "op_g");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ { "'Sun microsystems'>'Sun Microsystems'",sal_True,
+ new OString(kTestStr3), new OString(kTestStr1)},
+ {"!('Sun Microsystems'>'Sun microsystems')",sal_False,
+ new OString(kTestStr1), new OString(kTestStr3)},
+ {"'Sun Microsystems Java Technology'>'Sun Microsystems'",sal_True,
+ new OString(kTestStr2), new OString(kTestStr1)},
+ {"!('Sun Microsystems'>'Sun Microsystems Java Technology')",sal_False,
+ new OString(kTestStr1), new OString(kTestStr2)},
+ {"!('Sun Microsystems'>'Sun Microsystems'",sal_False,
+ new OString(kTestStr1), new OString(kTestStr1)},
+ {"'Sun Microsystems'>''",sal_True,new OString(kTestStr1),
+ new OString()},
+ {"!(''>'Sun Microsystems')",sal_False,new OString(),
+ new OString(kTestStr1)},
+ {"!(''>'')",sal_False,new OString(), new OString()}
+};
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool cmpRes = (*arrTestCase[i].input1 > *arrTestCase[i].input2);
+ sal_Bool lastRes = (cmpRes == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "operator >", i )
+ );
+
+ res &= lastRes;
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "op_g");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator < (const OString& rStr1, const OString& rStr2)
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_l(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "op_l");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"!('Sun microsystems'<'Sun Microsystems')",sal_False,
+ new OString(kTestStr3), new OString(kTestStr1)},
+ {"'Sun Microsystems'<'Sun microsystems'",sal_True,
+ new OString(kTestStr1), new OString(kTestStr3)},
+ {"'Sun Microsystems'<'Sun Microsystems Java Technology'",sal_True,
+ new OString(kTestStr1), new OString(kTestStr2)},
+ {"!('Sun Microsystems Java Technology'<'Sun Microsystems')",sal_False,
+ new OString(kTestStr2), new OString(kTestStr1)},
+ {"!('Sun Microsystems'<'Sun Microsystems'", sal_False,
+ new OString(kTestStr1), new OString(kTestStr1)},
+ {"'Sun Microsystems'<''",sal_False,new OString(kTestStr1),
+ new OString()},
+ {"''<'Sun Microsystems Java Technology'",sal_True,new OString(),
+ new OString(kTestStr2)},
+ {"!(''<'')",sal_False,new OString(), new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool cmpRes = (*arrTestCase[i].input1 < *arrTestCase[i].input2);
+ sal_Bool lastRes = (cmpRes == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "operator <", i )
+ );
+
+ res &= lastRes;
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "op_l");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator >= (const OString& rStr1, const OString& rStr2)
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_ge(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "op_ge");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"'Sun microsystems'>='Sun Microsystems'",sal_True,
+ new OString(kTestStr3), new OString(kTestStr1)},
+ {"!('Sun Microsystems'>='Sun microsystems')",sal_False,
+ new OString(kTestStr1), new OString(kTestStr3)},
+ {"!('Sun Microsystems'>='Sun Microsystems Java Technology')",sal_False,
+ new OString(kTestStr1), new OString(kTestStr2)},
+ {"'Sun Microsystems Java Technology'>='Sun Microsystems'",sal_True,
+ new OString(kTestStr2), new OString(kTestStr1)},
+ {"'Sun Microsystems'>='Sun Microsystems'", sal_True,
+ new OString(kTestStr1), new OString(kTestStr1)},
+ {"'Sun Microsystems'>=''",sal_True,new OString(kTestStr1),
+ new OString()},
+ { "''>='Sun microsystems'",sal_False,new OString(),
+ new OString(kTestStr3)},
+ {"''>=''",sal_True,new OString(), new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool cmpRes = (*arrTestCase[i].input1 >= *arrTestCase[i].input2);
+ sal_Bool lastRes = (cmpRes == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "operator >=", i )
+ );
+
+ res &= lastRes;
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "op_ge");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator <= (const OString& rStr1, const OString& rStr2)
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_le(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "op_le");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"!('Sun microsystems'<='Sun Microsystems')",sal_False,
+ new OString(kTestStr3), new OString(kTestStr1)},
+ {"'Sun Microsystems'<='Sun microsystems'",sal_True,
+ new OString(kTestStr1), new OString(kTestStr3)},
+ {"'Sun Microsystems'<='Sun Microsystems Java Technology'",sal_True,
+ new OString(kTestStr1),
+ new OString(kTestStr2)},
+ {"!('Sun Microsystems Java Technology'<='Sun Microsystems')",sal_False,
+ new OString(kTestStr2),
+ new OString(kTestStr1)},
+ {"!('Sun Microsystems'<='Sun Microsystems'", sal_True,
+ new OString(kTestStr1), new OString(kTestStr1)},
+ {"'Sun Microsystems'<=''",sal_False,new OString(kTestStr1),
+ new OString()},
+ {"''<='Sun Microsystems Java Technology'",sal_True,new OString(),
+ new OString(kTestStr2)},
+ {"!(''<='')",sal_True,new OString(), new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool cmpRes = (*arrTestCase[i].input1 <= *arrTestCase[i].input2);
+ sal_Bool lastRes = (cmpRes == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "operator <=", i )
+ );
+
+ res &= lastRes;
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "op_le");
+// return ( res );
+}
+
+
+//------------------------------------------------------------------------
+// testing the operator =
+//------------------------------------------------------------------------
+static sal_Bool test_rtl_OString_op_eq_001( hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"'' = str1, str1 == str2",sal_True,new OString(kTestStr1),
+ new OString()},
+ {"str1 = str2, str1 == str2",sal_True,new OString(kTestStr1),
+ new OString(kTestStr6)},
+ {"str2 = '', str1 == str2",sal_True,new OString(),
+ new OString(kTestStr2)},
+ {"'' = '', str1 == str2",sal_True,new OString(),
+ new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ *(arrTestCase[i].input1) = *(arrTestCase[i].input2);
+
+ sal_Bool cmpRes =
+ (*(arrTestCase[i].input1) == *(arrTestCase[i].input2));
+ sal_Bool lastRes = (cmpRes == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "operator =", i )
+ );
+
+ res &= lastRes;
+ }
+
+ return ( res );
+}
+
+static sal_Bool test_rtl_OString_op_eq_002(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OString aStr;
+ aStr = OString(kTestStr1);
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr == kTestStr1,
+ "str = OString(\"%s\"), str == \"%s\"",
+ "operator ="
+ )
+ );
+}
+
+static sal_Bool test_rtl_OString_op_eq_003(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bTCState = false;
+
+ ::rtl::OString aStr1(kTestStr1);
+ ::rtl::OString aStr2;
+ ::rtl::OString aStr3;
+
+ aStr3 = aStr2 = aStr1;
+
+ bTCState = ( aStr1 == aStr2 )
+ && ( aStr1 == aStr3 )
+ && ( aStr2 == aStr3 );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ bTCState,
+ "str3=str2=str1,(str1 == str2)&&(str1 == str3)&&(str2 == str3)",
+ "operator ="
+ );
+
+ return bTCState;
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_eq(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start(hRtlTestResult, "op_eq");
+ sal_Bool res = test_rtl_OString_op_eq_001( hRtlTestResult );
+ res &= test_rtl_OString_op_eq_002( hRtlTestResult );
+ res &= test_rtl_OString_op_eq_003( hRtlTestResult );
+ c_rtl_tres_state_end(hRtlTestResult, "op_eq");
+
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator +
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_plus(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "op_plus");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OString* expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"str1 = str7 + str8",new OString(kTestStr1),
+ new OString(kTestStr7), new OString(kTestStr8)},
+ {"str1 = str1 + '' ",new OString(kTestStr1),
+ new OString(kTestStr1), new OString("")},
+ {"str1 = '' + str1", new OString(kTestStr1),
+ new OString(""), new OString(kTestStr1)},
+ {" '' = '' + '' ", new OString(""),new OString(""),
+ new OString("")},
+ {"str1 = str1 + def.constr", new OString(kTestStr1),
+ new OString(kTestStr1), new OString()},
+ {" str1 = def.constr + str1 ",new OString(kTestStr1),
+ new OString(), new OString(kTestStr1)},
+ {" def.constr= def.constr + def.constr", new OString(),
+ new OString(), new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OString str = (*arrTestCase[i].input1) + (*arrTestCase[i].input2);
+ sal_Bool lastRes = (str == *arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "operator +", i )
+ );
+
+ res &= lastRes;
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "op_plus");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator +=
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_peq(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "op_peq");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OString* expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"str1 == (str7 += str8)",new OString(kTestStr1),
+ new OString(kTestStr7), new OString(kTestStr8)},
+ {"str1 == (str1 += '')",new OString(kTestStr1),
+ new OString(kTestStr1), new OString("")},
+ {"str1 == ('' += str1)", new OString(kTestStr1),
+ new OString(""), new OString(kTestStr1)},
+ {" '' == ('' += '')", new OString(""),
+ new OString(""), new OString("")},
+ {"str1 == (str1 += def.constr)", new OString(kTestStr1),
+ new OString(kTestStr1), new OString()},
+ {" str1 == (def.constr += str1)",new OString(kTestStr1),
+ new OString(), new OString(kTestStr1)},
+ {" def.constr== (def.constr += def.constr)",
+ new OString(),new OString(), new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ { OString str;
+ str += (*arrTestCase[i].input1); str += (*arrTestCase[i].input2);
+ sal_Bool lastRes = (str == *arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "operator +", i )
+ );
+
+ res &= lastRes;
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "op_peq");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator const sal_Char * (cscs for short)
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_op_cscs(
+ hTestResult hRtlTestResult )
+{
+sal_Char methName[MAXBUFLENGTH];
+sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "op_cscs");
+typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Char* expVal;
+ sal_Int32 cmpLen;
+ OString* input1;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"test normal string",kTestStr1,kTestStr1Len,new OString(kTestStr1)},
+ {"test empty string","",1,new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ const sal_Char* pstr = (*arrTestCase[i].input1);
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ cmpstr((sal_Char*)pstr,(sal_Char*)arrTestCase[i].expVal,
+ arrTestCase[i].cmpLen),
+ arrTestCase[i].comments,
+ createName( pMeth, "const sal_Char*", i )
+ );
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "op_cscs");
+// return ( res );
+}
+
+
+//------------------------------------------------------------------------
+// testing the method getStr()
+//------------------------------------------------------------------------
+
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_getStr(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "getStr");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Char* expVal;
+ sal_Int32 cmpLen;
+ OString* input1;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"test normal string",kTestStr1,kTestStr1Len,new OString(kTestStr1)},
+ {"test empty string","",0,new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ const sal_Char* pstr = arrTestCase[i].input1->getStr();
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ cmpstr(pstr, arrTestCase[i].expVal,
+ arrTestCase[i].cmpLen),
+ arrTestCase[i].comments,
+ createName( pMeth, "getStr", i )
+ );
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "getStr");
+// return ( res );
+}
+
+
+
+//------------------------------------------------------------------------
+// testing the method copy( sal_Int32 beginIndex )
+//------------------------------------------------------------------------
+static sal_Bool SAL_CALL test_rtl_OString_copy_001(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Char* srcStr;
+ const sal_Char* arrExpStr;
+ // string for comparing with result
+ sal_Int32 beginIndex;
+ // beginIndex for the method copy
+ sal_Int32 lengthForCmp;
+ // number of symbols for comparing
+ // (if value is equal to 0 then pointers to buffers must be equal)
+ sal_Int32 expLength;
+ //expected length of the result string
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"beginIndex == 0 ( whole string )", kTestStr2,kTestStr2,
+ 0, kTestStr2Len, kTestStr2Len},
+ {"beginIndex == strlen-2 ( last two char )", kTestStr2,"gy",
+ kTestStr2Len-2, 2, 2},
+ {"beginIndex == strlen-1( last char )", kTestStr2, "y",
+ kTestStr2Len-1, 1, 1}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i <(sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OString src(arrTestCase[i].srcStr);
+ OString dst;
+ // rtl_String* pDataSrc = src.pData;
+
+ dst = src.copy(arrTestCase[i].beginIndex);
+
+ // rtl_String* pDataDst = dst.pData;
+
+ sal_Bool lastRes;
+
+ lastRes= (dst== arrTestCase[i].arrExpStr);
+
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth,
+ "copy_001(beginIndex)(check buffer and length)", i )
+ );
+
+ res &= lastRes;
+
+ }
+
+ return (res);
+}
+
+
+//------------------------------------------------------------------------
+// testing the method copy( sal_Int32 beginIndex, sal_Int32 count )
+//------------------------------------------------------------------------
+static sal_Bool SAL_CALL test_rtl_OString_copy_002(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Char* arrExpStr;
+ sal_Int32 beginIndex;
+ sal_Int32 count;
+ sal_Int32 expLen;
+
+ } TestCase;
+
+ TestCase arrTestCase[] ={
+
+ {"copy substring", kTestStr6, kTestStr11Len, kTestStr2Len - kTestStr11Len,kTestStr6Len},
+ /* LLA: it is a bug, beginIndex + count > kTestStr2.getLength() */
+ /* {"copy normal substring with incorrect count",kTestStr6, kTestStr11Len, 31, 15}, */
+ {"copy whole string", kTestStr2, 0, kTestStr2Len, kTestStr2Len},
+ /* {"copy whole string with incorrect count larger than len and index 0", kTestStr2, 0, 40, 32}, */
+ /* LLA: bug beginIndex + count > kTestStr2 {"copy last character", "y",kTestStr2Len - 1, 31,1}, */
+ {"copy last character", "y",kTestStr2Len - 1, 1,1},
+ /* LLA: bug, beginIndex > kTestStr2 {"beginindex larger than len","",60, 0,0}, */
+ {"beginindex exact as large as it's length","",kTestStr2Len, 0,0}
+ /* LLA: bug, negative count is not allowed. {"count is nagative int","",3, -1,0} */
+ };
+ sal_Bool res = sal_True;
+
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++) {
+ OString src(kTestStr2);
+ OString dst;
+ dst = src.copy(arrTestCase[i].beginIndex, arrTestCase[i].count);
+ // rtl_String* pDataSrc = src.pData;
+ // rtl_String* pDataDst = dst.pData;
+
+ sal_Bool lastRes=sal_True;
+ // checks buffer and length
+ //t_print("this is copy__002 #%d\n", i);
+ //t_print("dst buffer =%s\n", pDataDst->buffer);
+ //t_print("expStr =%s\n", arrTestCase[i].arrExpStr);
+ //t_print("dst length =%d\n", pDataDst->length);
+ //t_print("count =%d\n", arrTestCase[i].count);
+ //t_print("expLen =%d\n", arrTestCase[i].expLen);
+
+ lastRes = (dst.equals(arrTestCase[i].arrExpStr)) ? sal_True : sal_False;
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth,
+ "copy_002(beginIndex,count)(check buffer and length)", i)
+ );
+ res &= lastRes;
+
+
+ }
+
+ return (res);
+}
+
+
+static sal_Bool SAL_CALL test_rtl_OString_copy_003(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool res = sal_True;
+ char comment[] = "copy whole short string to long string";
+
+ OString src(kTestStr1);
+ // rtl_String* pDataSrc = src.pData;
+ OString dst(kTestStr2);
+
+ dst = src.copy(0);
+ // rtl_String* pDataDst = dst.pData;
+ //check buffer and length
+ sal_Bool lastRes =(dst==src);
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ comment,
+ "copy_003(beginIndex)(check buffer and length)"
+ );
+ res &= lastRes;
+
+ return (res);
+}
+
+
+static sal_Bool SAL_CALL test_rtl_OString_copy_004(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool res = sal_True;
+ sal_Char comment[] = "copy whole long string to short string";
+
+ OString src(kTestStr2);
+ // rtl_String* pDataSrc = src.pData;
+ OString dst(kTestStr1);
+
+ dst = src.copy(0);
+ // rtl_String* pDataDst = dst.pData;
+ //check buffer and length
+ sal_Bool lastRes =(dst==src);
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ comment,
+ "copy_004(beginIndex)(check buffer and length)"
+ );
+
+ res &= lastRes;
+ return (res);
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_copy(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start(hRtlTestResult, "copy");
+ sal_Bool res = test_rtl_OString_copy_001(hRtlTestResult);
+ res &= test_rtl_OString_copy_002(hRtlTestResult);
+ res &= test_rtl_OString_copy_003(hRtlTestResult);
+ res &= test_rtl_OString_copy_004(hRtlTestResult);
+ c_rtl_tres_state_end(hRtlTestResult, "copy");
+
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method concat( const OString & aStr )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_concat(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "concat");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OString* expVal;
+ OString* input1;
+ OString* input2;
+ ~TestCase() { delete input1;delete input2; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"concatenates two strings",new OString(kTestStr1),
+ new OString(kTestStr7),
+ new OString(kTestStr8)},
+ {"concatenates empty string",new OString(kTestStr1),
+ new OString(kTestStr1),
+ new OString("")},
+ {"concatenates to empty string",new OString(kTestStr1),
+ new OString(""),
+ new OString(kTestStr1)},
+ {"concatenates two empty strings",new OString(""),new OString(""),
+ new OString("")},
+ {"concatenates string constructed by default constructor",
+ new OString(kTestStr1),
+ new OString(kTestStr1), new OString()},
+ {"concatenates to string constructed by default constructor",
+ new OString(kTestStr1),
+ new OString(), new OString(kTestStr1)},
+ {"concatenates two strings constructed by default constructor",
+ new OString(),
+ new OString(), new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OString str =
+ arrTestCase[i].input1->concat(*arrTestCase[i].input2);
+ sal_Bool lastRes = (str == *arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "concat", i)
+ );
+
+ res &= lastRes;
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "concat");
+// return ( res );
+}
+
+
+//------------------------------------------------------------------------
+// testing the method toAsciiLowerCase()
+//-----------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_toAsciiLowerCase(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "toAsciiLowerCase");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OString* expVal;
+ OString* input1;
+ ~TestCase() { delete input1; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+
+ {"only uppercase",new OString(kTestStr5),new OString(kTestStr4)},
+ {"different cases",new OString(kTestStr5),new OString(kTestStr1)},
+ {"different cases",new OString(kTestStr5),new OString(kTestStr3)},
+ {"only lowercase",new OString(kTestStr5),new OString(kTestStr5)},
+ {"empty string",new OString(""),new OString("")},
+ {"string constructed by default constructor",
+ new OString(),new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OString str = arrTestCase[i].input1->toAsciiLowerCase();
+ sal_Bool lastRes = (str ==* arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "toAsciiLowerCase", i)
+ );
+
+ res &= lastRes;
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "toAsciiLowerCase");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method toAsciiUpperCase()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_toAsciiUpperCase(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "toAsciiUpperCase");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OString* expVal;
+ OString* input1;
+ ~TestCase() { delete input1; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"only lowercase",new OString(kTestStr4),new OString(kTestStr5)},
+ {"mixed cases",new OString(kTestStr4),new OString(kTestStr3)},
+ {"miced cases",new OString(kTestStr4),new OString(kTestStr1)},
+ {"only uppercase",new OString(kTestStr4),new OString(kTestStr4)},
+ {"empty string",new OString(""),new OString("")},
+ {"string constructed by default constructor",
+ new OString(),new OString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OString str = arrTestCase[i].input1->toAsciiUpperCase();
+ sal_Bool lastRes = (str == *arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "toAsciiLowerCase", i)
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "toAsciiUpperCase");
+
+// return ( res );
+}
+
+
+//------------------------------------------------------------------------
+// testing the method trim()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_trim(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "trim");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OString* expVal;
+ OString* input1;
+ ~TestCase() { delete input1; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"removes space from the front",new OString(kTestStr1),
+ new OString(kTestStr10)},
+ {"removes space from the end",new OString(kTestStr1),
+ new OString(kTestStr11)},
+ {"removes space from the front and end",new OString(kTestStr1),
+ new OString(kTestStr12)},
+ {"removes several spaces from the end",new OString(kTestStr1),
+ new OString(kTestStr13)},
+ {"removes several spaces from the front",new OString(kTestStr1),
+ new OString(kTestStr14)},
+ {"removes several spaces from the front and one from the end",
+ new OString(kTestStr1),
+ new OString(kTestStr15)},
+ {"removes one space from the front and several from the end",
+ new OString(kTestStr1),
+ new OString(kTestStr16)},
+ {"removes several spaces from the front and end",
+ new OString(kTestStr1),
+ new OString(kTestStr17)},
+ {"removes characters that have codes <= 32",new OString(kTestStr20),
+ new OString("\1\3\5\7\11\13\15\17sun\21\23\25\27\31\33\40")},
+ {"no spaces",new OString(kTestStr8),new OString(kTestStr8)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OString strRes = arrTestCase[i].input1->trim();
+ sal_Bool lastRes = (strRes == *arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "trim", i)
+ );
+
+ res &= lastRes;
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "trim");
+// return ( res );
+}
+
+
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Bool b )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_sal_Bool(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool input1;
+ OString* expVal;
+ ~TestCase() {delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"true",sal_True,new OString("true")},
+ {"false",sal_False, new OString("false")}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ ::rtl::OString aStr1;
+ aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+ sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "valueof_bool", i)
+ );
+
+ res &= lastRes;
+
+ }
+
+ return ( res );
+}
+
+sal_Bool SAL_CALL test_rtl_OString_valueOf_sal_Char(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Char input1;
+ OString* expVal;
+ ~TestCase() {delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"A",'A',new OString("A")},
+ {"a",'a', new OString("a")},
+ {"0",'0', new OString("0")},
+ {"-",'-', new OString("-")},
+ {"_",'_', new OString("_")},
+ {"|",'|', new OString("|")},
+ {"?",'?', new OString("?")},
+ {"?",'?', new OString("?")},
+ {"\n",'\n', new OString("\n")},
+ {"\'",'\'', new OString("\'")},
+ {"\"",'\"', new OString("\"")}
+
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ ::rtl::OString aStr1;
+ aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+ sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "valueof_char", i)
+ );
+
+ res &= lastRes;
+
+ }
+
+ return ( res );
+}
+
+/**
+ * Calls the method valueOf(T, radix) and compares
+ * returned strings with strings that passed in the array resArray.
+ *
+ * @param T, type of argument, passed to valueOf
+ * @param resArray, array of result strings to compare to
+ * @param n the number of elements in the array resArray (testcases)
+ * @param pTestResult the instance of the class TestResult
+ * @param inArray [optional], array of value that is passed as first argument
+ * to valueOf
+ *
+ * @return true, if all returned strings are equal to corresponding string in
+ * resArray else, false.
+ */
+template <class T>
+sal_Bool test_valueOf( const char** resArray, int n, sal_Int16 radix,
+ hTestResult hRtlTestResult, const T *inArray )
+{
+ sal_Bool bRes = sal_True;
+
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+ sal_Int32 i;
+
+ for (i = 0; i < n; i++)
+ {
+ ::rtl::OString aStr1;
+ ::rtl::OString aStr2( resArray[i] );
+
+ if (inArray == 0)
+ aStr1 = ::rtl::OString::valueOf((T)i, radix);
+ else
+ {
+ if ( inArray[i] < 0 )
+ {
+ aStr2 = "-";
+ aStr2 += resArray[i];
+ }
+ aStr1 = ::rtl::OString::valueOf((T)inArray[i], radix);
+ }
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr2.compareTo(aStr1) == 0,
+ (sal_Char*)resArray[i],
+ createName( pMeth, "valueOf", i )
+ );
+ }
+
+ return (bRes);
+}
+
+
+#define test_valueOf_Int32 test_valueOf<sal_Int32>
+#define test_valueOf_Int64 test_valueOf<sal_Int64>
+// LLA: #define test_valueOf_float test_valueOf<float>
+// LLA: #define test_valueOf_double test_valueOf<double>
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=2 )
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=8 )
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=10 )
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=16 )
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=36 )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int32(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kBinaryNumsStr,
+ kBinaryNumsCount, kRadixBinary, hRtlTestResult, 0 ),
+ "kRadixBinary",
+ "valueOf(sal_Int32, radix 2)"
+ );
+
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kOctolNumsStr,
+ kOctolNumsCount, kRadixOctol, hRtlTestResult, 0),
+ "kRadixOctol",
+ "valueOf(sal_Int32, radix 8)"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kDecimalNumsStr,
+ kDecimalNumsCount, kRadixDecimal, hRtlTestResult, 0),
+ "kRadixDecimal",
+ "valueOf(sal_Int32, radix 10)"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kHexDecimalNumsStr,
+ kHexDecimalNumsCount, kRadixHexdecimal, hRtlTestResult, 0),
+ "kRadixHexdecimal",
+ "valueOf(sal_Int32, radix 16)"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kBase36NumsStr,
+ kBase36NumsCount, kRadixBase36, hRtlTestResult, 0),
+ "kRadixBase36",
+ "valueOf(sal_Int32, radix 36)"
+ );
+
+
+ return ( bRes );
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=2 )
+// where l = large constants
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=8 )
+// where l = large constants
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=10 )
+// where l = large constants
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=16 )
+// where l = large constants
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=36 )
+// where l = large constants
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int32_Bounderies(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kBinaryMaxNumsStr,
+ kInt32MaxNumsCount, kRadixBinary, hRtlTestResult,
+ kInt32MaxNums),
+ "kRadixBinary",
+ "valueOf(salInt32, radix 2) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kOctolMaxNumsStr,
+ kInt32MaxNumsCount, kRadixOctol, hRtlTestResult,
+ kInt32MaxNums),
+ "kRadixOctol",
+ "valueOf(salInt32, radix 8) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kDecimalMaxNumsStr,
+ kInt32MaxNumsCount, kRadixDecimal,
+ hRtlTestResult, kInt32MaxNums),
+ "kRadixDecimal",
+ "valueOf(salInt32, radix 10) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kHexDecimalMaxNumsStr,
+ kInt32MaxNumsCount, kRadixHexdecimal,
+ hRtlTestResult, kInt32MaxNums),
+ "kRadixHexdecimal",
+ "valueOf(salInt32, radix 16) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kBase36MaxNumsStr,
+ kInt32MaxNumsCount, kRadixBase36,
+ hRtlTestResult, kInt32MaxNums),
+ "kRadixBase36",
+ "valueOf(salInt32, radix 36) Bounderies"
+ );
+
+ return ( bRes );
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=2 )
+// for negative value
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=8 )
+// for negative value
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=10 )
+// for negative value
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=16 )
+// for negative value
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=36 )
+// for negative value
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int32_Negative(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+ sal_Int32 inArr[kBase36NumsCount];
+ sal_Int32 i;
+
+ for (i = 0; i < kBase36NumsCount; i++ )
+ inArr[i] = -i;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kBinaryNumsStr, kBinaryNumsCount,
+ kRadixBinary, hRtlTestResult, inArr ),
+ "negative Int32, kRadixBinary",
+ "valueOf( negative Int32, radix 2 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kOctolNumsStr, kOctolNumsCount,
+ kRadixOctol, hRtlTestResult, inArr ),
+ "negative Int32, kRadixOctol",
+ "valueOf( negative Int32, radix 8 )"
+ );
+
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kDecimalNumsStr, kDecimalNumsCount,
+ kRadixDecimal, hRtlTestResult, inArr ),
+ "negative Int32, kRadixDecimal",
+ "valueOf( negative Int32, radix 10 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kHexDecimalNumsStr, kHexDecimalNumsCount,
+ kRadixHexdecimal, hRtlTestResult, inArr ),
+ "negative Int32, kRadixHexdecimal",
+ "valueOf( negative Int32, radix 16 )"
+ );
+
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kBase36NumsStr, kBase36NumsCount,
+ kRadixBase36, hRtlTestResult, inArr ),
+ "negative Int32, kRadixBase36",
+ "valueOf( negative Int32, radix 36 )"
+ );
+
+ return ( bRes );
+}
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix ) where radix = -5
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int32_WrongRadix(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ sal_Int32 intVal = 11;
+
+ ::rtl::OString aStr1;
+ ::rtl::OString aStr2("11");
+
+ aStr1 = aStr1.valueOf( intVal, -5 );
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr2.compareTo( aStr1 ) == 0,
+ "if radix not valid then radix must be 10",
+ "valueOf(sal_Int32, sal_Int32 radix): radix = -5"
+ );
+
+ return (bRes);
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix )
+// where l = -2147483648 (smallest negative value)
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int32_SmallestNegativeValue(
+ hTestResult hRtlTestResult)
+{
+ // Standard-conforming way to assign -2147483648 to n:
+ sal_Int32 n = -1;
+ for (int i = 1; i < 32; ++i)
+ n *= 2;
+ return c_rtl_tres_state
+ (
+ hRtlTestResult,
+ ::rtl::OString::valueOf(n) == "-2147483648",
+ "-2147483648",
+ "valueOf(sal_Int32 -2147483648)"
+ );
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=2 )
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=8 )
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=10 )
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=16 )
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=36 )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int64(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kBinaryNumsStr,
+ kBinaryNumsCount, kRadixBinary, hRtlTestResult, 0),
+ "kRadixBinary",
+ "valueOf(sal_Int64, radix 2)_"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kOctolNumsStr,
+ kOctolNumsCount, kRadixOctol, hRtlTestResult, 0),
+ "kRadixOctol",
+ "valueOf(sal_Int64, radix 8)_"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kDecimalNumsStr,
+ kDecimalNumsCount, kRadixDecimal, hRtlTestResult, 0),
+ "kRadixDecimal",
+ "valueOf(sal_Int64, radix 10)_"
+ );
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kHexDecimalNumsStr,
+ kHexDecimalNumsCount, kRadixHexdecimal, hRtlTestResult, 0),
+ "kRadixHexdecimal",
+ "valueOf(sal_Int64, radix 16)_"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kBase36NumsStr,
+ kBase36NumsCount, kRadixBase36, hRtlTestResult, 0),
+ "kRadixBase36",
+ "valueOf(sal_Int64, radix 36)_"
+ );
+
+ return (bRes);
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=2 )
+// where l = large constants
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=8 )
+// where l = large constants
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=10 )
+// where l = large constants
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=16 )
+// where l = large constants
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=36 )
+// where l = large constants
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int64_Bounderies(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kBinaryMaxNumsStr,
+ kInt64MaxNumsCount, kRadixBinary,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixBinary",
+ "valueOf(salInt64, radix 2) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kOctolMaxNumsStr,
+ kInt64MaxNumsCount, kRadixOctol,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixOctol",
+ "valueOf(salInt64, radix 8) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kDecimalMaxNumsStr,
+ kInt64MaxNumsCount, kRadixDecimal,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixDecimal",
+ "valueOf(salInt64, radix 10) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kHexDecimalMaxNumsStr,
+ kInt64MaxNumsCount, kRadixHexdecimal,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixHexdecimal",
+ "valueOf(salInt64, radix 16) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kBase36MaxNumsStr,
+ kInt64MaxNumsCount, kRadixBase36,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixBase36",
+ "valueOf(salInt64, radix 36) Bounderies"
+ );
+
+ return ( bRes );
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=2 )
+// for negative value
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=8 )
+// for negative value
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=10 )
+// for negative value
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=16 )
+// for negative value
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=36 )
+// for negative value
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int64_Negative(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ sal_Int64 inArr[36];
+ sal_Int32 i;
+
+ for (i = 0; i < 36; i++) {
+ inArr[i] = -i;
+ }
+
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kBinaryNumsStr, kBinaryNumsCount,
+ kRadixBinary, hRtlTestResult, inArr ),
+ "negative Int64, kRadixBinary",
+ "valueOf( negative Int64, radix 2 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kOctolNumsStr, kOctolNumsCount,
+ kRadixOctol, hRtlTestResult, inArr ),
+ "negative Int64, kRadixOctol",
+ "valueOf( negative Int64, radix 8 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kDecimalNumsStr, kDecimalNumsCount,
+ kRadixDecimal, hRtlTestResult, inArr ),
+ "negative Int64, kRadixDecimal",
+ "valueOf( negative Int64, radix 10 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kHexDecimalNumsStr, kHexDecimalNumsCount,
+ kRadixHexdecimal, hRtlTestResult, inArr ),
+ "negative Int64, kRadixHexDecimal",
+ "valueOf( negative Int64, radix 16 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kBase36NumsStr, kBase36NumsCount,
+ kRadixBase36, hRtlTestResult, inArr),
+ "negative Int64, kRadixBase36",
+ "valueOf( negative Int64, radix 36 )"
+ );
+
+ return (bRes);
+}
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix )
+// where radix = -5
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int64_WrongRadix(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ sal_Int64 intVal = 11;
+
+ ::rtl::OString aStr1;
+ ::rtl::OString aStr2("11");
+
+ aStr1 = aStr1.valueOf( intVal, -5 );
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr2.compareTo(aStr1) == 0,
+ "if radix not valid then radix must be 10",
+ "valueOf(sal_Int64, sal_Int32 radix): radix = -5"
+ );
+
+ return (bRes);
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix )
+// where l = -9223372036854775808 (smallest negative value)
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OString_valueOf_Int64_SmallestNegativeValue(
+ hTestResult hRtlTestResult)
+{
+ // Standard-conforming way to assign -9223372036854775808 to n:
+ sal_Int64 n = -1;
+ for (int i = 1; i < 64; ++i)
+ n *= 2;
+ return c_rtl_tres_state
+ (
+ hRtlTestResult,
+ ::rtl::OString::valueOf(n) == "-9223372036854775808",
+ "-9223372036854775808",
+ "valueOf(sal_Int64 -9223372036854775808)"
+ );
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( float f )
+//------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OString_valueOf_float(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth =methName;
+// LLA:
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: sal_Char* comments;
+// LLA: float input1;
+// LLA: OString* expVal;
+// LLA:
+// LLA: ~TestCase() {delete expVal;}
+// LLA: } TestCase;
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: { "3.0", 3.0, new OString("3.0") },
+// LLA: { "3.5", 3.5f, new OString("3.5")},
+// LLA: { "3.0625", 3.0625f, new OString("3.0625")},
+// LLA: { "3.502525", 3.502525f, new OString("3.502525") },
+// LLA: { "3.141592", 3.141592f, new OString("3.141592") },
+// LLA: { "3.5025255", 3.5025255f, new OString("3.5025255") },
+// LLA: { "3.0039062", 3.00390625f, new OString("3.0039062") }
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+// LLA: {
+// LLA: ::rtl::OString aStr1;
+// LLA: aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+// LLA: sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: arrTestCase[i].comments,
+// LLA: createName( pMeth, "valueof_float", i)
+// LLA: );
+// LLA:
+// LLA: res &= lastRes;
+// LLA:
+// LLA: }
+// LLA:
+// LLA: return ( res );
+// LLA: }
+
+
+
+
+//------------------------------------------------------------------------
+// testing the method valueOf( float f ) for negative value
+//------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OString_valueOf_Float_Negative(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth =methName;
+// LLA:
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: sal_Char* comments;
+// LLA: float input1;
+// LLA: OString* expVal;
+// LLA:
+// LLA: ~TestCase() {delete expVal;}
+// LLA: } TestCase;
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: { "-3.0", -3.0, new OString("-3.0") },
+// LLA: { "-3.5", -3.5f, new OString("-3.5")},
+// LLA: { "-3.0625", -3.0625f, new OString("-3.0625")},
+// LLA: { "-3.502525", -3.502525f, new OString("-3.502525") },
+// LLA: { "-3.141592", -3.141592f, new OString("-3.141592") },
+// LLA: { "-3.5025255", -3.5025255f, new OString("-3.5025255") },
+// LLA: { "-3.0039062", -3.00390625f, new OString("-3.0039062") }
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+// LLA: {
+// LLA: ::rtl::OString aStr1;
+// LLA: aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+// LLA: sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: arrTestCase[i].comments,
+// LLA: createName( pMeth, "valueof_negative float", i)
+// LLA: );
+// LLA:
+// LLA: res &= lastRes;
+// LLA:
+// LLA: }
+// LLA:
+// LLA: return ( res );
+// LLA: }
+
+//------------------------------------------------------------------------
+// testing the method valueOf( double f )
+//------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OString_valueOf_double(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth =methName;
+// LLA:
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: sal_Char* comments;
+// LLA: double input1;
+// LLA: OString* expVal;
+// LLA:
+// LLA: ~TestCase() {delete expVal;}
+// LLA: } TestCase;
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: {"3.0", 3.0, new OString("3.0")},
+// LLA: {"3.5", 3.5, new OString("3.5")},
+// LLA: {"3.0625", 3.0625, new OString("3.0625")},
+// LLA: {"3.1415926535", 3.1415926535, new OString("3.1415926535")},
+// LLA: {"3.1415926535897931", 3.141592653589793,
+// LLA: new OString("3.1415926535897931")},
+// LLA: {"3.1415926535897931", 3.1415926535897932,
+// LLA: new OString("3.1415926535897931")},
+// LLA: {"3.1415926535897931", 3.14159265358979323,
+// LLA: new OString("3.1415926535897931")},
+// LLA: {"3.1415926535897931", 3.141592653589793238462643,
+// LLA: new OString("3.1415926535897931")}
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+// LLA: {
+// LLA: ::rtl::OString aStr1;
+// LLA: aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+// LLA: sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: arrTestCase[i].comments,
+// LLA: createName( pMeth, "valueof_double", i)
+// LLA: );
+// LLA:
+// LLA: res &= lastRes;
+// LLA:
+// LLA: }
+// LLA:
+// LLA: return ( res );
+// LLA: }
+
+
+//------------------------------------------------------------------------
+// testing the method valueOf( double f ) for negative value
+//------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OString_valueOf_Double_Negative(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth =methName;
+// LLA:
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: sal_Char* comments;
+// LLA: double input1;
+// LLA: OString* expVal;
+// LLA:
+// LLA: ~TestCase() {delete expVal;}
+// LLA: } TestCase;
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: {"-3.0", -3.0, new OString("-3.0")},
+// LLA: {"-3.5", -3.5, new OString("-3.5")},
+// LLA: {"-3.0625", -3.0625, new OString("-3.0625")},
+// LLA: {"-3.1415926535", -3.1415926535, new OString("-3.1415926535")},
+// LLA: {"-3.1415926535897931", -3.141592653589793,
+// LLA: new OString("-3.1415926535897931")},
+// LLA: {"-3.1415926535897931", -3.1415926535897932,
+// LLA: new OString("-3.1415926535897931")},
+// LLA: {"-3.1415926535897931", -3.14159265358979323,
+// LLA: new OString("-3.1415926535897931")},
+// LLA: {"-3.1415926535897931", -3.141592653589793238462643,
+// LLA: new OString("-3.1415926535897931")}
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+// LLA: {
+// LLA: ::rtl::OString aStr1;
+// LLA: aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+// LLA: sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: arrTestCase[i].comments,
+// LLA: createName( pMeth, "valueof_nagative double", i)
+// LLA: );
+// LLA:
+// LLA: res &= lastRes;
+// LLA:
+// LLA: }
+// LLA:
+// LLA: return ( res );
+// LLA: }
+
+//------------------------------------------------------------------------
+// testing the method valueOf()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_valueOf(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start(hRtlTestResult, "valueOf");
+ sal_Bool bTState = test_rtl_OString_valueOf_sal_Bool( hRtlTestResult );
+
+ bTState &= test_rtl_OString_valueOf_sal_Char( hRtlTestResult );
+
+ bTState &= test_rtl_OString_valueOf_Int32( hRtlTestResult );
+ bTState &= test_rtl_OString_valueOf_Int32_Bounderies( hRtlTestResult );
+ bTState &= test_rtl_OString_valueOf_Int32_Negative( hRtlTestResult );
+ bTState &= test_rtl_OString_valueOf_Int32_WrongRadix( hRtlTestResult );
+ bTState &= test_rtl_OString_valueOf_Int32_SmallestNegativeValue(
+ hRtlTestResult );
+
+ bTState &= test_rtl_OString_valueOf_Int64( hRtlTestResult );
+ bTState &= test_rtl_OString_valueOf_Int64_Bounderies( hRtlTestResult );
+ bTState &= test_rtl_OString_valueOf_Int64_Negative( hRtlTestResult );
+ bTState &= test_rtl_OString_valueOf_Int64_WrongRadix( hRtlTestResult );
+ bTState &= test_rtl_OString_valueOf_Int64_SmallestNegativeValue(
+ hRtlTestResult );
+
+ // LLA: the tests for valueOf(float) and valueOf(double) are moved to file
+ // sal/qa/rtl/ostring/rtl_OString2.cxx
+
+ // LLA: bTState &= test_rtl_OString_valueOf_float( hRtlTestResult );
+ // LLA: bTState &= test_rtl_OString_valueOf_Float_Negative( hRtlTestResult );
+
+ // LLA: bTState &= test_rtl_OString_valueOf_double( hRtlTestResult );
+ // LLA: bTState &= test_rtl_OString_valueOf_Double_Negative( hRtlTestResult );
+
+ c_rtl_tres_state_end(hRtlTestResult, "valueOf");
+// return ( bTState );
+}
+
+
+//------------------------------------------------------------------------
+// testing the method toChar()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_toChar(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "toChar");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Char expVal;
+ OString* input1;
+ ~TestCase() {delete input1;}
+ } TestCase;
+
+
+ TestCase arrTestCase[] =
+ {
+ {"A", 'A', new OString("A")},
+ {"a", 'a', new OString("a")},
+ {"0", '0',new OString("0")},
+ {"-", '-',new OString("-")},
+ {"_", '_',new OString("_")},
+
+// TODO: may be UTF-8 values
+// {"0„6", '0„6',new OString("0„6")},
+// { "0„7", '0„7',new OString("0„7")},
+// {"0‹0", '0‹0',new OString("0‹0")},
+// {"06", '06',new OString("06")},
+ {"\n", '\n',new OString("\n")},
+ {"\'", '\'',new OString("\'")},
+ {"\"", '\"',new OString("\"")},
+ {"\0", '\0',new OString("\0")},
+ {"", '\0',new OString("")},
+ {"Sun Microsystems", 'S', new OString(kTestStr1)}
+ };
+
+
+ // sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++ )
+ {
+ sal_Char strRes = arrTestCase[i].input1->toChar();
+ sal_Bool lastRes = ( strRes == arrTestCase[i].expVal );
+
+ char com[MAXBUFLENGTH];
+ com[0] = '\'';
+ cpynstr(com + 1, (*arrTestCase[i].input1), MAXBUFLENGTH);
+ int length = AStringLen( (*arrTestCase[i].input1) );
+ com[length + 1] = '\'';
+ com[length + 2] = 0;
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ com,
+ createName( pMeth, "toChar", i )
+ );
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "toChar");
+// return (res);
+}
+
+
+//------------------------------------------------------------------------
+// testing the method toFloat()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_toFloat(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "toFloat");
+ typedef struct TestCase
+ {
+ float expVal;
+ OString* input1;
+ float m_nPrecision;
+ ~TestCase() {delete input1;}
+ } TestCase;
+
+
+ TestCase arrTestCase[] =
+ {
+ {3.0f, new OString("3"), 3e-7f},
+ {3.1f, new OString("3.1"), 3e-7f},
+ {3.1415f, new OString("3.1415"), 3e-7f},
+ {3.14159f, new OString("3.14159"), 3e-7f},
+ {3.141592f, new OString("3.141592"), 3e-7f},
+ {3.1415926f, new OString("3.1415926"), 3e-7f},
+ {3.14159265f, new OString("3.14159265"), 3e-7f},
+ {3.141592653589793238462643f,
+ new OString("3.141592653589793238462643"), 3e-7f},
+ {6.5822e-16f, new OString("6.5822e-16"), 6e-16f * 1e-7f},
+ {9.1096e-31f, new OString("9.1096e-31"), 9e-31f * 1e-7f},
+ {2.997925e8f, new OString("2.997925e8"), 3e8f * 1e-7f},
+ {6.241e18f, new OString("6.241e18"), 6e18f * 1e-7f},
+ {3.1f, new OString("03.1"), 3e-7f},
+ {3.1f, new OString(" 3.1"), 3e-7f},
+ {-3.1f, new OString("-3.1"), 3e-7f},
+ {3.1f, new OString("+3.1"), 3e-7f},
+ {0.0f, new OString("-0.0"), 1e-7f}
+ };
+
+
+ // sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ t_print("sizeof(float)=%d, sizeof(double)=%d\n", sizeof(float), sizeof(double));
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++ )
+ {
+ float fA = arrTestCase[i].input1->toFloat();
+ float fB = arrTestCase[i].expVal;
+ float fPrec = arrTestCase[i].m_nPrecision;
+ float fResult = (float) fabs(fA - fB);
+ // t_print("float result: A:(%.9f) B:(%.9f) fabs(A-B):%E\n", fA, fB, fResult);
+ t_print("float result: A:(%E) B:(%E) fabs(A-B):%E\n", fA, fB, (float) fResult);
+ sal_Bool lastRes = ( fResult <= fPrec );
+
+ char com[MAXBUFLENGTH];
+ com[0] = '\'';
+ cpynstr(com + 1, (*arrTestCase[i].input1), MAXBUFLENGTH);
+ int length = AStringLen( (*arrTestCase[i].input1) );
+ com[length + 1] = '\'';
+ com[length + 2] = 0;
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ com,
+ createName( pMeth, "toFloat", i )
+ );
+
+ }
+
+ c_rtl_tres_state_end(hRtlTestResult, "toFloat");
+// return (res);
+}
+
+
+//------------------------------------------------------------------------
+// testing the method toDouble()
+//------------------------------------------------------------------------
+// LLA: extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_toDouble(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth = methName;
+// LLA:
+// LLA: c_rtl_tres_state_start(hRtlTestResult, "toDouble");
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: double expVal;
+// LLA: double expDiff;
+// LLA: OString* input1;
+// LLA: ~TestCase() {delete input1;}
+// LLA: } TestCase;
+// LLA:
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: {3.0, 1e-35, new OString("3")},
+// LLA: {3.1, 1e-2, new OString("3.1")},
+// LLA: {3.1415, 1e-5, new OString("3.1415")},
+// LLA: {3.1415926535, 1e-11, new OString("3.1415926535")},
+// LLA: {3.141592653589793, 1e-15,
+// LLA: new OString("3.141592653589793")},
+// LLA: {3.1415926535897932, 1e-16,
+// LLA: new OString("3.1415926535897932")},
+// LLA: {3.14159265358979323, 1e-15,
+// LLA: new OString("3.14159265358979323")},
+// LLA: {3.141592653589793238462643, 1e-15,
+// LLA: new OString("3.141592653589793238462643")},
+// LLA: {6.5822e-16, 1e-20, new OString("6.5822e-16")},
+// LLA: {9.1096e-31, 1e-35, new OString("9.1096e-31")},
+// LLA: {2.997925e8, 10, new OString("2.997925e8")},
+// LLA: {6.241e18, 100, new OString("6.241e18")},
+// LLA: {1.7e-308, 1e-35, new OString("1.7e-308")},
+// LLA: {1.7e+308, 100, new OString("1.7e+308")},
+// LLA: {3.1, 1e-2, new OString("03.1")},
+// LLA: {3.1, 1e-2, new OString(" 3.1")},
+// LLA: {-3.1, 1e-2, new OString("-3.1")},
+// LLA: {3.1, 1e-2, new OString("+3.1")},
+// LLA: {0.0, 1e-2, new OString("-0.0")}
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++ )
+// LLA: {
+// LLA: double dRes = arrTestCase[i].input1->toDouble();
+// LLA: double dErg = dRes - arrTestCase[i].expVal ;
+// LLA: double dComp = fabs( dErg );
+// LLA: sal_Bool lastRes = ( dComp <= arrTestCase[i].expDiff );
+// LLA:
+// LLA: char com[MAXBUFLENGTH];
+// LLA: com[0] = '\'';
+// LLA: cpynstr(com + 1, (*arrTestCase[i].input1), MAXBUFLENGTH);
+// LLA: int length = AStringLen( (*arrTestCase[i].input1) );
+// LLA: com[length + 1] = '\'';
+// LLA: com[length + 2] = 0;
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: com,
+// LLA: createName( pMeth, "toDouble", i )
+// LLA: );
+// LLA:
+// LLA: }
+// LLA:
+// LLA: c_rtl_tres_state_end(hRtlTestResult, "toDouble");
+// LLA: // return (res);
+// LLA: }
+
+//------------------------------------------------------------------------
+// testing the method toBoolean()
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_toBoolean(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "toBoolean");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OString* input;
+
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"expected true", sal_True, new OString("True")},
+ {"expected false", sal_False, new OString("False")},
+ {"expected true", sal_True, new OString("1")}
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool bRes = arrTestCase[i].input->toBoolean();
+ sal_Bool lastRes = (bRes == arrTestCase[i].expVal);
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "toBoolean", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "toBoolean");
+// return ( res );
+}
+
+
+
+//------------------------------------------------------------------------
+// testing the method toInt32( sal_Int16 radix = 2,8,10,16,36 )
+//------------------------------------------------------------------------
+sal_Bool test_toInt32( int num, const sal_Char** in,
+const sal_Int32 *expVal,sal_Int16 radix, hTestResult hRtlTestResult )
+{
+ sal_Bool res = sal_True;
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+ sal_Int32 i;
+
+ for( i = 0; i < num; i++ )
+ {
+ OString str(in[i]);
+ sal_Int32 intRes = str.toInt32(radix);
+ sal_Bool lastRes = (intRes == expVal[i]);
+
+ char buf[MAXBUFLENGTH];
+ buf[0] = '\'';
+ cpynstr( buf + 1, in[i], MAXBUFLENGTH );
+ int length = AStringLen( in[i] );
+ buf[length + 1] = '\'';
+ buf[length + 2] = 0;
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ buf,
+ createName( pMeth,"toInt32", i )
+ );
+
+ res &= lastRes;
+ }
+
+ return( res );
+}
+
+sal_Bool SAL_CALL test_rtl_OString_toInt32_wrongRadix(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OString str("0");
+
+ sal_Int32 iRes = str.toInt32(-1);
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ iRes == 0,
+ "wrong radix -1",
+ "toInt32( 0, wrong radix -1 )"
+ )
+ );
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_toInt32(
+ hTestResult hRtlTestResult )
+{
+ sal_Int32 expValues[kBase36NumsCount];
+ sal_Int32 i;
+
+ c_rtl_tres_state_start(hRtlTestResult, "toInt32");
+ for ( i = 0; i < kBase36NumsCount; i++ )
+ expValues[i] = i;
+
+ sal_Bool res = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kBinaryNumsCount, kBinaryNumsStr,
+ expValues, kRadixBinary, hRtlTestResult ),
+ "kBinaryNumsStr",
+ "toInt32( radix 2 )"
+ );
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kInt32MaxNumsCount, kBinaryMaxNumsStr,
+ kInt32MaxNums, kRadixBinary, hRtlTestResult ),
+ "kBinaryMaxNumsStr",
+ "toInt32_Boundaries( radix 2 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kOctolNumsCount, kOctolNumsStr,
+ expValues, kRadixOctol, hRtlTestResult ),
+ "kOctolNumsStr",
+ "toInt32( radix 8 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kInt32MaxNumsCount, kOctolMaxNumsStr,
+ (sal_Int32*)kInt32MaxNums, kRadixOctol, hRtlTestResult ),
+ "kOctolMaxNumsStr",
+ "toInt32_Boundaries( radix 8 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kDecimalNumsCount, kDecimalNumsStr, expValues,
+ kRadixDecimal, hRtlTestResult ),
+ "kDecimalNumsStr",
+ "toInt32( radix 10 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kInt32MaxNumsCount, kDecimalMaxNumsStr,
+ (sal_Int32*)kInt32MaxNums, kRadixDecimal, hRtlTestResult ),
+ "kDecimalMaxNumsStr",
+ "toInt32_Boundaries( radix 10 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kHexDecimalNumsCount, kHexDecimalNumsStr, expValues,
+ kRadixHexdecimal, hRtlTestResult ),
+ "kHexDecimalNumsStr",
+ "toInt32( radix 16 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kInt32MaxNumsCount, kHexDecimalMaxNumsStr,
+ (sal_Int32*)kInt32MaxNums, kRadixHexdecimal, hRtlTestResult ),
+ "kHexDecimalMaxNumsStr",
+ "toInt32_Boundaries( radix 16 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kBase36NumsCount, kBase36NumsStr, expValues,
+ kRadixBase36, hRtlTestResult ),
+ "kBase36NumsStr",
+ "toInt32( radix 36 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( kInt32MaxNumsCount, kBase36MaxNumsStr,
+ (sal_Int32*)kInt32MaxNums, kRadixBase36, hRtlTestResult ),
+ "kBase36MaxNumsStr",
+ "toInt32_Boundaries( radix 36 )"
+ );
+
+ const sal_Int16 nSpecCases = 5;
+ static const sal_Char *spString[nSpecCases] =
+ {
+ "-1",
+ "+1",
+ " 1",
+ " -1",
+ "001"
+ };
+
+ sal_Int32 expSpecVal[nSpecCases] =
+ {
+ -1,
+ 1,
+ 1,
+ -1,
+ 1
+ };
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt32( nSpecCases, spString, expSpecVal,
+ kRadixDecimal, hRtlTestResult ),
+ "special cases",
+ "toInt32( specialcases )"
+ );
+
+ res &= test_rtl_OString_toInt32_wrongRadix( hRtlTestResult );
+
+ c_rtl_tres_state_end(hRtlTestResult, "toInt32");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method toInt64( sal_Int16 radix = 2,8,10,16,36 )
+//------------------------------------------------------------------------
+sal_Bool test_toInt64( int num, const sal_Char** in,
+const sal_Int64 *expVal,sal_Int16 radix, hTestResult hRtlTestResult )
+{
+ sal_Bool res = sal_True;
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+ sal_Int32 i;
+
+ for( i = 0; i < num; i++ )
+ {
+ OString str( in[i] );
+ sal_Int64 intRes = str.toInt64( radix );
+ sal_Bool lastRes = ( intRes == expVal[i] );
+
+ char buf[MAXBUFLENGTH];
+ buf[0] = '\'';
+ cpynstr( buf + 1, in[i], MAXBUFLENGTH );
+ int length = AStringLen(in[i]);
+ buf[length + 1] = '\'';
+ buf[length + 2] = 0;
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ buf,
+ createName( pMeth, "toInt64", i )
+ );
+
+ res &= lastRes;
+ }
+ return (res);
+}
+
+sal_Bool SAL_CALL test_rtl_OString_toInt64_wrongRadix(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OString str("0");
+
+ sal_Int64 iRes = str.toInt64(-1);
+
+ return (
+
+ c_rtl_tres_state
+ ( hRtlTestResult,
+ iRes == 0,
+ "wrong radix -1",
+ "toInt64( wrong radix -1)"
+ )
+ );
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_toInt64(
+ hTestResult hRtlTestResult )
+{
+ sal_Int64 expValues[kBase36NumsCount];
+ sal_Int32 i;
+
+ c_rtl_tres_state_start(hRtlTestResult, "toInt64");
+ for (i = 0; i < kBase36NumsCount; expValues[i] = i, i++);
+
+ sal_Bool res = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kBinaryNumsCount, kBinaryNumsStr, expValues,
+ kRadixBinary, hRtlTestResult ),
+ "kBinaryNumsStr",
+ "toInt64( radix 2 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kInt32MaxNumsCount, kBinaryMaxNumsStr,
+ (sal_Int64*)kInt64MaxNums, kRadixBinary, hRtlTestResult ),
+ "kBinaryMaxNumsStr",
+ "toInt64_Boundaries( radix 2 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kOctolNumsCount, kOctolNumsStr, expValues,
+ kRadixOctol, hRtlTestResult ),
+ "kOctolNumsStr",
+ "toInt64( radix 8 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kInt32MaxNumsCount, kOctolMaxNumsStr,
+ (sal_Int64*)kInt64MaxNums, kRadixOctol, hRtlTestResult ),
+ "kOctolMaxNumsStr",
+ "toInt64_Boundaries( radix 8 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kDecimalNumsCount, kDecimalNumsStr, expValues,
+ kRadixDecimal, hRtlTestResult ),
+ "kDecimalNumsStr",
+ "toInt64( radix 10 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kInt32MaxNumsCount, kDecimalMaxNumsStr,
+ (sal_Int64*)kInt64MaxNums, kRadixDecimal, hRtlTestResult ),
+ "kDecimalMaxNumsStr",
+ "toInt64_Boundaries( radix 10 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kHexDecimalNumsCount, kHexDecimalNumsStr, expValues,
+ kRadixHexdecimal, hRtlTestResult ),
+ "kHexDecimalNumsStr",
+ "toInt64( radix 16 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kInt32MaxNumsCount, kHexDecimalMaxNumsStr,
+ (sal_Int64*)kInt64MaxNums, kRadixHexdecimal, hRtlTestResult ),
+ "kHexDecimalMaxNumsStr",
+ "toInt64_Boundaries( radix 16 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kBase36NumsCount, kBase36NumsStr, expValues,
+ kRadixBase36, hRtlTestResult ),
+ "kBase36NumsStr",
+ "toInt64( radix 36 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( kInt32MaxNumsCount, kBase36MaxNumsStr,
+ (sal_Int64*)kInt64MaxNums, kRadixBase36, hRtlTestResult ),
+ "kBase36MaxNumsStr",
+ "toInt64_Boundaries( radix 36 )"
+ );
+
+
+
+ const sal_Int16 nSpecCases = 5;
+ static const sal_Char *spString[nSpecCases] =
+ {
+ "-1",
+ "+1",
+ " 1",
+ " -1",
+ "001"
+ };
+
+ sal_Int64 expSpecVal[nSpecCases] =
+ {
+ -1,
+ 1,
+ 1,
+ -1,
+ 1
+ };
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toInt64( nSpecCases, spString, expSpecVal,
+ kRadixDecimal, hRtlTestResult ),
+ "special cases",
+ "toInt64( specialcases )"
+ );
+
+ res &= test_rtl_OString_toInt64_wrongRadix( hRtlTestResult );
+
+ c_rtl_tres_state_end(hRtlTestResult, "toInt64");
+// return (res);
+}
+
+//------------------------------------------------------------------------
+// testing the method replace( sal_Char oldChar, sal_Char newChar )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_replace(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "replace");
+typedef struct TestCase
+{
+ sal_Char* comments;
+ OString* expVal;
+ OString* input;
+ sal_Char oldChar;
+ sal_Char newChar;
+
+ ~TestCase() { delete input; delete expVal;}
+} TestCase;
+
+TestCase arrTestCase[]={
+
+ {"string differs", new OString(kTestStr18),
+ new OString(kTestStr4),'S','s'},
+ {"string differs", new OString(kTestStr19),
+ new OString(kTestStr17),(sal_Char)' ',(sal_Char)'-'},
+ {"same string, no replace ", new OString(kTestStr22),
+ new OString(kTestStr22),'*','8'}
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ ::rtl::OString aStr1;
+ aStr1= arrTestCase[i].input->replace(arrTestCase[i].oldChar,
+ arrTestCase[i].newChar);
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ (arrTestCase[i].expVal->compareTo(aStr1) == 0),
+ arrTestCase[i].comments,
+ createName( pMeth, "replace", i )
+
+ );
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "replace");
+// return ( res );
+}
+
+
+
+//------------------------------------------------------------------------
+// testing the method replaceAt( sal_Int32 index, sal_Int32 count,
+// const OString& newStr )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString_replaceAt(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ c_rtl_tres_state_start(hRtlTestResult, "replaceAt");
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OString* expVal;
+ OString* input;
+ OString* newStr;
+ sal_Int32 index;
+ sal_Int32 count;
+
+ ~TestCase() { delete input; delete expVal; delete newStr;}
+ } TestCase;
+
+ TestCase arrTestCase[]=
+ {
+
+ { "string differs", new OString(kTestStr2), new OString(kTestStr22),
+ new OString(kTestStr2), 0, kTestStr22Len },
+
+ { "larger index", new OString(kTestStr1), new OString(kTestStr7),
+ new OString(kTestStr8), 64, kTestStr8Len },
+
+ { "larger count", new OString(kTestStr2), new OString(kTestStr22),
+ new OString(kTestStr2),0, 64 },
+
+ { "navigate index", new OString(kTestStr2), new OString(kTestStr22),
+ new OString(kTestStr2), -64, 64 },
+
+ { "null string", new OString(""),
+ new OString(kTestStr14),new OString(""), 0, kTestStr14Len }
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ ::rtl::OString aStr1;
+ aStr1= arrTestCase[i].input->replaceAt( arrTestCase[i].index,
+ arrTestCase[i].count, *arrTestCase[i].newStr );
+
+ sal_Bool lastRes = ( arrTestCase[i].expVal->compareTo(aStr1) == 0 );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "replaceAt", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end(hRtlTestResult, "replaceAt");
+// return ( res );
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OString( hTestResult hRtlTestResult )
+{
+
+ c_rtl_tres_state_start(hRtlTestResult, "rtl_OString" );
+
+ test_rtl_OString_ctors( hRtlTestResult );
+ test_rtl_OString_getLength( hRtlTestResult );
+ test_rtl_OString_equals( hRtlTestResult );
+ test_rtl_OString_equalsIgnoreAsciiCase( hRtlTestResult );
+ test_rtl_OString_compareTo( hRtlTestResult );
+ test_rtl_OString_op_cmp( hRtlTestResult );
+ test_rtl_OString_op_neq( hRtlTestResult );
+ test_rtl_OString_op_g( hRtlTestResult );
+ test_rtl_OString_op_l( hRtlTestResult );
+ test_rtl_OString_op_ge( hRtlTestResult );
+ test_rtl_OString_op_le( hRtlTestResult );
+ test_rtl_OString_op_eq( hRtlTestResult );
+ test_rtl_OString_op_plus( hRtlTestResult );
+ test_rtl_OString_op_peq( hRtlTestResult );
+ test_rtl_OString_op_cscs( hRtlTestResult );
+ test_rtl_OString_getStr( hRtlTestResult );
+ test_rtl_OString_copy( hRtlTestResult );
+ test_rtl_OString_concat( hRtlTestResult );
+ test_rtl_OString_toAsciiLowerCase( hRtlTestResult );
+ test_rtl_OString_toAsciiUpperCase( hRtlTestResult );
+ test_rtl_OString_trim( hRtlTestResult );
+ test_rtl_OString_valueOf( hRtlTestResult );
+ test_rtl_OString_toChar( hRtlTestResult );
+ test_rtl_OString_toFloat( hRtlTestResult );
+ // LLA: test_rtl_OString_toDouble( hRtlTestResult );
+ test_rtl_OString_toBoolean( hRtlTestResult );
+ test_rtl_OString_toInt32( hRtlTestResult );
+ test_rtl_OString_toInt64( hRtlTestResult );
+ test_rtl_OString_replace( hRtlTestResult );
+ test_rtl_OString_replaceAt( hRtlTestResult );
+
+ c_rtl_tres_state_end(hRtlTestResult, "rtl_OString");
+}
+
+
+// -----------------------------------------------------------------------------
+void RegisterAdditionalFunctions(FktRegFuncPtr _pFunc)
+{
+ if (_pFunc)
+ {
+ (_pFunc)(&test_rtl_OString, "");
+
+ //# (_pFunc)(&test_rtl_OString_ctors, "");
+ //# (_pFunc)(&test_rtl_OString_getLength, "");
+ //# (_pFunc)(&test_rtl_OString_equals, "");
+ //# (_pFunc)(&test_rtl_OString_equalsIgnoreAsciiCase, "");
+ //# (_pFunc)(&test_rtl_OString_compareTo, "");
+ //# (_pFunc)(&test_rtl_OString_op_cmp, "");
+ //# (_pFunc)(&test_rtl_OString_op_neq, "");
+ //# (_pFunc)(&test_rtl_OString_op_g, "");
+ //# (_pFunc)(&test_rtl_OString_op_l, "");
+ //# (_pFunc)(&test_rtl_OString_op_ge, "");
+ //# (_pFunc)(&test_rtl_OString_op_le, "");
+ //# (_pFunc)(&test_rtl_OString_op_eq, "");
+ //# (_pFunc)(&test_rtl_OString_op_plus, "");
+ //# (_pFunc)(&test_rtl_OString_op_peq, "");
+ //# (_pFunc)(&test_rtl_OString_op_cscs, "");
+ //# (_pFunc)(&test_rtl_OString_getStr, "");
+ //# (_pFunc)(&test_rtl_OString_copy, "");
+ //# (_pFunc)(&test_rtl_OString_concat, "");
+ //# (_pFunc)(&test_rtl_OString_toAsciiLowerCase, "");
+ //# (_pFunc)(&test_rtl_OString_toAsciiUpperCase, "");
+ //# (_pFunc)(&test_rtl_OString_trim, "");
+ //# (_pFunc)(&test_rtl_OString_valueOf, "");
+ //# (_pFunc)(&test_rtl_OString_toChar, "");
+ //# (_pFunc)(&test_rtl_OString_toFloat, "");
+ //# (_pFunc)(&test_rtl_OString_toDouble, "");
+ //# (_pFunc)(&test_rtl_OString_toBoolean, "");
+ //# (_pFunc)(&test_rtl_OString_toInt32, "");
+ //# (_pFunc)(&test_rtl_OString_toInt64, "");
+ //# (_pFunc)(&test_rtl_OString_replace, "");
+ //# (_pFunc)(&test_rtl_OString_replaceAt, "");
+ }
+}
+
+/*
+D:\local\644\SRX644\sal\qa\rtl_OString.cxx(3559) : error C2664:
+'unsigned char (void (__cdecl *)(void *),const char *)'
+ : cannot convert parameter 1 from
+'unsigned char (__cdecl *)(void *)' to 'void (__cdecl *)(void *)'
+
+ This conversion requires a reinterpret_cast, a C-style cast or function-
+style cast
+*/
diff --git a/sal/qa/rtl_strings/rtl_OUString.cxx b/sal/qa/rtl_strings/rtl_OUString.cxx
new file mode 100644
index 000000000000..41538065d4fc
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_OUString.cxx
@@ -0,0 +1,3858 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <sal/types.h>
+
+//# #ifndef _RTL_TRES_H_
+//# #include <rtl/tres.h>
+//# #endif
+#include <testshl/tresstatewrapper.hxx>
+#include "stringhelper.hxx"
+#include <rtl/string.hxx>
+#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+#include <osl/thread.h>
+#include <rtl_String_Const.h>
+#include <rtl_String_Utils.hxx>
+
+
+
+ using namespace rtl;
+
+//------------------------------------------------------------------------
+// test classes
+//------------------------------------------------------------------------
+const int MAXBUFLENGTH = 255;
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+static void unused()
+{
+ // NEVER CALL SUCH FUNCTION!!!
+ (void)input1StrLastDefault;
+ (void)input1StrLastNormal;
+ unused();
+}
+
+//------------------------------------------------------------------------
+// testing constructors
+//------------------------------------------------------------------------
+static sal_Bool test_rtl_OUString_ctor_001( hTestResult hRtlTestResult )
+{
+
+ ::rtl::OUString aUStr;
+ rtl_uString * pData = aUStr.pData;
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ pData->length == 0 &&
+ ! *pData->buffer,
+ "New OUString containing no characters",
+ "ctor_001"
+ )
+ );
+}
+
+//------------------------------------------------------------------------
+
+static sal_Bool SAL_CALL test_rtl_OUString_ctor_002(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OUString aUStr( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ );
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aUStr == aUStr1,
+ "OUString from an ascii string",
+ "ctor_002"
+ )
+ );
+}
+//------------------------------------------------------------------------
+
+static sal_Bool SAL_CALL test_rtl_OUString_ctor_003(
+ hTestResult hRtlTestResult )
+{
+ rtl_uString *rtlUStr =NULL ;
+ rtl_uString_newFromAscii( &rtlUStr, kTestStr1 );
+ ::rtl::OUString aUStr( rtlUStr );
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aUStr == aUStr1,
+ "New OUString from a rtl_uString",
+ "ctor_003"
+ )
+ );
+}
+
+//------------------------------------------------------------------------
+
+static sal_Bool SAL_CALL test_rtl_OUString_ctor_004(
+ hTestResult hRtlTestResult)
+{
+ ::rtl::OUString aUStr( aUStr1 );
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aUStr == aUStr1,
+ "New OUString from unicode string",
+ "ctor_004"
+ )
+ );
+}
+//------------------------------------------------------------------------
+
+static sal_Bool test_rtl_OUString_ctor_005( hTestResult hRtlTestResult )
+{
+ ::rtl::OUString aUStr( aUStr2, kTestStr1Len );
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aUStr == aUStr1,
+ "New OUString from the first n characters of unicode string",
+ "ctor_004"
+ )
+ );
+
+}
+
+
+//------------------------------------------------------------------------
+
+static sal_Bool test_rtl_OUString_ctor_006( hTestResult hRtlTestResult )
+{
+ ::rtl::OUString aUStrtmp( aUStr1 );
+ ::rtl::OUString aUStr( aUStrtmp );
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aUStr==aUStrtmp,
+ "New OUString from another OUString",
+ "ctor_006"
+ )
+ );
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_ctors(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "ctors");
+ sal_Bool DCState = test_ini_uString();
+ (void)DCState;
+ sal_Bool bTSState = test_rtl_OUString_ctor_001( hRtlTestResult );
+ bTSState &= test_rtl_OUString_ctor_002( hRtlTestResult);
+ bTSState &= test_rtl_OUString_ctor_003( hRtlTestResult);
+ bTSState &= test_rtl_OUString_ctor_004( hRtlTestResult);
+ bTSState &= test_rtl_OUString_ctor_005( hRtlTestResult);
+ bTSState &= test_rtl_OUString_ctor_006( hRtlTestResult);
+ c_rtl_tres_state_end( hRtlTestResult, "ctors");
+// return( bTSState );
+}
+
+
+
+//------------------------------------------------------------------------
+// testing the method getLength
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_getLength(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "getLength");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OUString* input;
+ ~TestCase() { delete input;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"length of ascii string", kTestStr1Len,
+ new OUString( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"length of ascci string of size 1", 1,
+ new OUString( "1",
+ 1,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"length of empty string (default constructor)", 0, new OUString()},
+ {"length of empty string (empty ascii string arg)",0,
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"length of empty string (string arg = '\\0')", 0,
+ new OUString( "\0",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)}
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 length = arrTestCase[i].input->getLength();
+ sal_Bool lastRes = (length == arrTestCase[i].expVal);
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "getLength", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "getLength");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method equals( const OString & aStr )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_equals(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "equals");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"same size", sal_True, new OUString(aUStr1), new OUString(aUStr1)},
+ {"different size", sal_False, new OUString(aUStr1),
+ new OUString(aUStr2)
+ },
+ {"same size, no case match", sal_False, new OUString(aUStr1),
+ new OUString(aUStr3)
+ },
+ {"two empty strings(def. constructor)", sal_True, new OUString(),
+ new OUString()
+ },
+ {"empty(def.constructor) and non empty", sal_False, new OUString(),
+ new OUString(aUStr2)
+ },
+ {"non empty and empty(def. constructor)", sal_False,
+ new OUString(aUStr1),
+ new OUString()
+ },
+ {"two empty strings(string arg = '\\0')", sal_True,
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"empty(string arg = '\\0') and non empty", sal_False,
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ new OUString(aUStr2)
+ },
+ {"non empty and empty(string arg = '\\0')", sal_False,
+ new OUString(aUStr1),
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ }
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->equals(*(arrTestCase[i].input2)) ==
+ arrTestCase[i].expVal );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "equals", i )
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "equals");
+// return (res);
+}
+
+//------------------------------------------------------------------------
+// testing the method equalsIgnoreAsciiCase( const OString & aStr )
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_equalsIgnoreAsciiCase(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "equalsIgnoreAsciiCase");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+ {"same strings but different cases",sal_True,new OUString(aUStr4),
+ new OUString(aUStr5)
+ },
+ {"same strings",sal_True,new OUString(aUStr4),
+ new OUString(aUStr4)},
+ {"with equal beginning",sal_False,new OUString(aUStr2),
+ new OUString(aUStr4)
+ },
+ {"empty(def.constructor) and non empty",sal_False,new OUString(),
+ new OUString(aUStr5)
+ },
+ {"non empty and empty(def.constructor)",sal_False,
+ new OUString(aUStr4),
+ new OUString()
+ },
+ {"two empty strings(def.constructor)",sal_True,new OUString(),
+ new OUString()
+ },
+ {"different strings with equal length",sal_False,
+ new OUString(aUStr10),
+ new OUString(aUStr11)
+ }
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes =
+ (arrTestCase[i].input1->equalsIgnoreAsciiCase(*arrTestCase[i].input2) ==
+ arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "equalsIgnoreAsciiCase", i )
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "equalsIgnoreAsciiCase");
+// return (res);
+}
+
+
+static sal_Bool SAL_CALL test_rtl_OUString_compareTo_001(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"simple compare, str1 to str5",-1,new OUString(aUStr1),
+ new OUString(aUStr5)
+ },
+ {"simple compare, str2 to str5",-1,new OUString(aUStr2),
+ new OUString(aUStr5)
+ },
+ {"simple compare, str1 to str9",-1,new OUString(aUStr1),
+ new OUString(aUStr9)
+ },
+ {"simple compare, str1 to str2",-1,new OUString(aUStr1),
+ new OUString(aUStr2)
+ },
+ {"simple compare, str4 to str5",-1,new OUString(aUStr4),
+ new OUString(aUStr5)
+ },
+ {"simple compare, str1 to str3",-1,new OUString(aUStr1),
+ new OUString(aUStr3)
+ },
+ {"simple compare, str5 to str1",+1,new OUString(aUStr5),
+ new OUString(aUStr1)
+ },
+ {"simple compare, str2 to str1",+1,new OUString(aUStr2),
+ new OUString(aUStr1)
+ },
+ {"simple compare, str9 to str5",+1,new OUString(aUStr9),
+ new OUString(aUStr5)
+ },
+ {"simple compare, str5 to str4",+1,new OUString(aUStr5),
+ new OUString(aUStr4)
+ },
+ {"simple compare, str1 to str1",0,new OUString(aUStr1),
+ new OUString(aUStr1)
+ },
+ {"simple compare, nullString to nullString",0,new OUString(),
+ new OUString()
+ },
+ {"simple compare, nullString to str2",-1,new OUString(),
+ new OUString(aUStr2)
+ },
+ {"simple compare, str1 to nullString",+1,new OUString(aUStr1),
+ new OUString()
+ }
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 cmpRes = arrTestCase[i].input1->compareTo
+ (*arrTestCase[i].input2);
+ cmpRes = ( cmpRes == 0 ) ? 0 : ( cmpRes > 0 ) ? +1 : -1 ;
+ sal_Bool lastRes = ( cmpRes == arrTestCase[i].expVal);
+
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "compareTo_001(const OString&)", i )
+ );
+
+ res &= lastRes;
+ }
+
+ return (res);
+}
+
+
+//------------------------------------------------------------------------
+// testing the method compareTo( const OString & rObj, sal_Int32 length )
+//------------------------------------------------------------------------
+static sal_Bool SAL_CALL test_rtl_OUString_compareTo_002(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ sal_Int32 maxLength;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"compare with maxlength, str1 to str9, 16",-1,16,
+ new OUString(aUStr1), new OUString(aUStr9)},
+ {"compare with maxlength, str2 to str9, 32",-1,32,
+ new OUString(aUStr2), new OUString(aUStr9)},
+ {"compare with maxlength, str9 to str4, 16",+1,16,
+ new OUString(aUStr9), new OUString(aUStr4)},
+ {"compare with maxlength, str9 to str22, 32",+1,32,
+ new OUString(aUStr9), new OUString(aUStr22)},
+ {"compare with maxlength, str9 to str5, 16",0,16,
+ new OUString(aUStr9), new OUString(aUStr5)},
+ {"compare with maxlength, str9 to str9, 32",0,32,
+ new OUString(aUStr9), new OUString(aUStr9)},
+ {"compare with maxlength, str1 to str2, 32",-1,32,
+ new OUString(aUStr1), new OUString(aUStr2)},
+ {"compare with maxlength, str1 to str2, 32",-1,32,
+ new OUString(aUStr1), new OUString(aUStr2)},
+ {"compare with maxlength, str1 to str2", 0,-1,
+ new OUString(aUStr1), new OUString(aUStr2)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 cmpRes = arrTestCase[i].input1->compareTo
+ (*arrTestCase[i].input2, arrTestCase[i].maxLength);
+ cmpRes = (cmpRes == 0) ? 0 : (cmpRes > 0) ? +1 : -1 ;
+ sal_Bool lastRes = (cmpRes == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "compareTo_002(const OString&, sal_Int32)", i )
+ );
+
+ res &= lastRes;
+ }
+
+ return (res);
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_compareTo(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "compareTo");
+ sal_Bool res = test_rtl_OUString_compareTo_001(hRtlTestResult);
+ res &= test_rtl_OUString_compareTo_002(hRtlTestResult);
+ c_rtl_tres_state_end( hRtlTestResult, "compareTo");
+// return (res);
+}
+
+//------------------------------------------------------------------------
+// testing the method match( const OUString & str, sal_Int32 fromIndex = 0 )
+//------------------------------------------------------------------------
+static sal_Bool SAL_CALL test_rtl_OUString_match_001(
+ hTestResult hRtlTestResult)
+
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"aUStr2 and aUStr1", sal_True, new OUString(aUStr2),
+ new OUString(aUStr1)},
+ {"aUStr1 and aUStr2", sal_False, new OUString(aUStr1),
+ new OUString(aUStr2)},
+ {"aUStr5 and aUStr6", sal_False, new OUString(aUStr5),
+ new OUString(aUStr6)},
+ {"null and aUStr1", sal_False, new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ new OUString(aUStr1)}
+
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes = ( arrTestCase[i].input1->match(
+ *(arrTestCase[i].input2)) == arrTestCase[i].expVal );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "match(const OUString & str)", i )
+ );
+
+ res &= lastRes;
+ }
+ return (res);
+}
+
+static sal_Bool SAL_CALL test_rtl_OUString_match_002(
+ hTestResult hRtlTestResult )
+
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ sal_Int32 fromIndex;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"aUStr2 from 17 and aUStr6", sal_True, 17,
+ new OUString(aUStr2),new OUString(aUStr6)},
+ {"aUStr2 from 5 and aUStr6", sal_False, 5,
+ new OUString(aUStr2),new OUString(aUStr6)},
+ {"aUStr2 from 0 and aUStr1", sal_True, 0,
+ new OUString(aUStr2),new OUString(aUStr1)},
+ {"aUStr1 from 16 and null", sal_True, 16,
+ new OUString(aUStr1),
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ )
+ },
+ {"aUStr1 from 5 and null", sal_True, 5,
+ new OUString(aUStr1),
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ )
+ },
+ {"aUStr2 from -1 and aUStr1", sal_False, -1,
+ new OUString(aUStr2),new OUString(aUStr1)},
+ {"aUStr5 from 2 and aUStr4", sal_False, 2,
+ new OUString(aUStr5),new OUString(aUStr4)},
+ {"aUStr2 from 18 and aUStr1", sal_False, 18,
+ new OUString(aUStr2),new OUString(aUStr1)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes = ( arrTestCase[i].input1->match
+ (*(arrTestCase[i].input2),arrTestCase[i].fromIndex) ==
+ arrTestCase[i].expVal );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth,
+ "match(const OUString & str,sal_Int32 fromIndex = 0)", i )
+
+ );
+
+ res &= lastRes;
+ }
+ return (res);
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_match(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "match");
+ sal_Bool res = test_rtl_OUString_match_001(hRtlTestResult);
+ res &= test_rtl_OUString_match_002(hRtlTestResult);
+ c_rtl_tres_state_end( hRtlTestResult, "match");
+// return (res);
+}
+
+//------------------------------------------------------------------------
+// testing the operator +=
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_op_eq(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "eq");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1; delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+ {"null and Ustr1", new OUString, new OUString(aUStr1)},
+ {"Ustr2 and Ustr1", new OUString(aUStr2),
+ new OUString(aUStr1)},
+ {""" and Ustr1 from bit charactor buffer",
+ new OUString(aUStr1),
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ )},
+ {"Ustr1 and Ustr2 from value and length",
+ new OUString( aUStr2, kTestStr2Len ),
+ new OUString(aUStr1)}
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ *(arrTestCase[i].input1) = *(arrTestCase[i].input2);
+ sal_Bool lastRes = (*(arrTestCase[i].input1) ==
+ *(arrTestCase[i].input2));
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "op_eq", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "eq");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator +=
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_op_peq(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "peq");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1; delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+ {" ' '= ''+='' ", new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ),
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ),
+ new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ )},
+ {"Ustr1= null += Ustr1", new OUString(aUStr1),
+ new OUString(), new OUString(aUStr1)},
+ {"Ustr1= '' += Ustr1", new OUString(aUStr1),
+ /*new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ )*/
+ new OUString(),
+ new OUString(aUStr1)},
+ {"Ustr1PlusUStr6 = Ustr1 += Ustr6",
+ new OUString(aUStr1PlusUStr6), new OUString(aUStr1),
+ new OUString(aUStr6)},
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ *(arrTestCase[i].input1) += *(arrTestCase[i].input2);
+ sal_Bool lastRes = (*(arrTestCase[i].expVal) ==
+ *(arrTestCase[i].input1));
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "op_peq", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "peq");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the operator const sal_Unicode * (csuc for short)
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_csuc(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "csuc");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ const sal_Unicode tmpUC=0x0;
+ rtl_uString* tmpUstring = NULL;
+ const sal_Char *tmpStr=kTestStr1;
+ sal_Int32 tmpLen=(sal_Int32) kTestStr1Len;
+ // sal_Int32 cmpLen = 0;
+
+ rtl_string2UString( &tmpUstring, tmpStr, tmpLen,
+ osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(tmpUstring != NULL);
+
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Unicode* expVal;
+ sal_Int32 cmpLen;
+ OUString* input1;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"test normal ustring",(*tmpUstring).buffer,kTestStr1Len,
+ new OUString(aUStr1)},
+ {"test empty ustring",&tmpUC, 1, new OUString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ const sal_Unicode* pstr = *arrTestCase[i].input1;
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ cmpstr((sal_Char*)pstr,
+ (sal_Char*)arrTestCase[i].expVal,
+ arrTestCase[i].cmpLen),
+ arrTestCase[i].comments,
+ createName( pMeth, "const sal_Unicode*", i )
+ );
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "csuc");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method const sal_Unicode * getStr()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_getStr(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "getStr");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ const sal_Unicode tmpUC=0x0;
+ rtl_uString* tmpUstring = NULL;
+ const sal_Char *tmpStr=kTestStr1;
+ sal_Int32 tmpLen=(sal_Int32) kTestStr1Len;
+ // sal_Int32 cmpLen = 0;
+
+ rtl_string2UString( &tmpUstring, tmpStr, tmpLen,
+ osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(tmpUstring != NULL);
+
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Unicode* expVal;
+ sal_Int32 cmpLen;
+ OUString* input1;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"test normal ustring",(*tmpUstring).buffer,kTestStr1Len,
+ new OUString(aUStr1)},
+ {"test empty ustring",&tmpUC, 1, new OUString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ const sal_Unicode* pstr = arrTestCase[i].input1->getStr();
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ cmpstr((sal_Char*)pstr,
+ (sal_Char*)arrTestCase[i].expVal,
+ arrTestCase[i].cmpLen),
+ arrTestCase[i].comments,
+ createName( pMeth, "getStr", i )
+ );
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "getStr");
+// return ( res );
+}
+
+
+//------------------------------------------------------------------------
+// testing the method sal_Int32 reverseCompareTo( const OUString & str )
+//-------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_reverseCompareTo(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "reverseCompareTo");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1;delete input2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"simple compare, str1 to str5",-1,new OUString(aUStr1),
+ new OUString(aUStr5)
+ },
+ {"simple compare, str2 to str5",1,new OUString(aUStr2),
+ new OUString(aUStr5)
+ },
+ {"simple compare, str1 to str9",-1,new OUString(aUStr1),
+ new OUString(aUStr9)
+ },
+ {"simple compare, str4 to str5",-1,new OUString(aUStr4),
+ new OUString(aUStr5)
+ },
+ {"simple compare, str5 to str1",+1,new OUString(aUStr5),
+ new OUString(aUStr1)
+ },
+ {"simple compare, str2 to str1",+1,new OUString(aUStr2),
+ new OUString(aUStr1)
+ },
+ {"simple compare, str1 to str1",0,new OUString(aUStr1),
+ new OUString(aUStr1)
+ },
+ {"simple compare, nullString to nullString",0,new OUString(),
+ new OUString()
+ },
+ {"simple compare, nullString to str2",-1,new OUString(),
+ new OUString(aUStr2)
+ },
+ {"simple compare, str1 to nullString",+1,new OUString(aUStr1),
+ new OUString()
+ }
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 cmpRes = arrTestCase[i].input1->reverseCompareTo
+ (*arrTestCase[i].input2);
+ cmpRes = ( cmpRes == 0 ) ? 0 : ( cmpRes > 0 ) ? +1 : -1 ;
+ sal_Bool lastRes = ( cmpRes == arrTestCase[i].expVal);
+
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "compareTo(const OString&)", i )
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "reverseCompareTo");
+// return (res);
+}
+
+//------------------------------------------------------------------------
+// testing the method sal_Bool equalsAscii( const sal_Char* asciiStr )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_equalsAscii(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "equalsAscii");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ const sal_Char *tmpAstr1="Sun Microsystems\0";
+ const sal_Char *tmpAstr2="\0";
+
+
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OUString* input1;
+ const sal_Char* input2;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+ {"str1 with str1 ", sal_True, new OUString( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ), tmpAstr1},
+ {"str2 with str1 ", sal_False,new OUString( kTestStr2,
+ kTestStr2Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ), tmpAstr1},
+ {"null with str1 ", sal_False, new OUString(), tmpAstr1},
+ {"null with '' ", sal_True, new OUString(), tmpAstr2},
+ {"'' with ''", sal_True, new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ),
+ tmpAstr2}
+
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+
+ sal_Bool lastRes = (arrTestCase[i].expVal ==
+ arrTestCase[i].input1->equalsAscii(arrTestCase[i].input2));
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "equalsAscii", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "equalsAscii");
+// return ( res );
+}
+
+
+
+//------------------------------------------------------------------------
+// testing the method sal_Bool equalsAsciiL(
+// const sal_Char* asciiStr, sal_Int32 asciiStrLength )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_equalsAsciiL(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "equalsAsciiL");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ const sal_Char *tmpAstr1="Sun Microsystems\0";
+ const sal_Char *tmpAstr2="\0";
+ const sal_Char *tmpAstr3="Sun Microsystems Java Technology\0";
+
+
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OUString* input1;
+ const sal_Char* input2;
+ sal_Int32 cmpLen;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+ {"str1 with str1,str1Len ", sal_True, new OUString( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ), tmpAstr1, kTestStr1Len},
+ {"str2 with str1,str1Len", sal_False,new OUString( kTestStr2,
+ kTestStr2Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ), tmpAstr1, kTestStr1Len},
+ {"str1 with str2,str1Len", sal_True,new OUString( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ), tmpAstr3, kTestStr1Len},
+ {"null with str1,1 ", sal_False, new OUString(), tmpAstr1, 1},
+ {"null with '',1 ", sal_False, new OUString(), tmpAstr2, 1},
+ {"'' with '', 1", sal_False, new OUString( "",
+ 0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ),
+ tmpAstr2, 1}
+
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+
+ sal_Bool lastRes = (arrTestCase[i].expVal ==
+ arrTestCase[i].input1->equalsAsciiL(arrTestCase[i].input2,
+ arrTestCase[i].cmpLen)
+ );
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "equalsAsciiL", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "equalsAsciiL");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method sal_Int32 compareToAscii( const sal_Char* asciiStr )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_compareToAscii(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "compareToAscii");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ const sal_Char *tmpAstr1="Sun Microsystems\0";
+ const sal_Char *tmpAstr2="\0";
+ const sal_Char *tmpAstr3="sun microsystems java technology\0";
+ const sal_Char *tmpAstr4="Sun Microsystems Java Technology\0";
+
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OUString* input1;
+ const sal_Char* input2;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+ {"str1 with str1 ", 0, new OUString( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ), tmpAstr1},
+ {"str1 with '' ", 83, new OUString( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ), tmpAstr2},
+ {"null with str1 ", -83 , new OUString(), tmpAstr1},
+ {"null with '' ", 0, new OUString(), tmpAstr2},
+ {"str1 with str9", -32, new OUString( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ),
+ tmpAstr3},
+ {"str1 with str2", -32, new OUString( kTestStr1,
+ kTestStr1Len,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString
+ ),
+ tmpAstr4}
+
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes = (arrTestCase[i].expVal ==
+ arrTestCase[i].input1->compareToAscii(arrTestCase[i].input2));
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "equalsAscii", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "compareToAscii");
+// return ( res );
+}
+
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Bool b )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_valueOf_sal_Bool(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "Bool");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ sal_Bool input1;
+
+ ~TestCase() {delete expVal;}
+ }TestCase;
+
+ TestCase arrTestCase[]=
+ {
+ {"input Bool 'true' and return OUString 'true'",
+ new OUString("true",4,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ sal_True
+ },
+ {"input Bool 'false' and return OUString 'false'",
+ new OUString("false",5,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ sal_False
+ }
+ };
+
+ sal_Bool res;
+ sal_uInt32 i;
+
+ for(i=0;i<(sizeof(arrTestCase))/(sizeof(TestCase));i++)
+ {
+ sal_Bool lastRes=(*arrTestCase[i].expVal==
+ OUString::valueOf(arrTestCase[i].input1)
+
+ );
+
+ c_rtl_tres_state(hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "valueOf( sal_Bool b )", i )
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "Bool");
+// return(res);
+}
+
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_valueOf_sal_Unicode(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "Unicode");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ sal_Unicode tmpchar1=97;
+ sal_Unicode tmpchar2=53;
+ sal_Unicode tmpchar3=0;
+ sal_Unicode tmpchar4=32;
+ sal_Unicode tmpchar5=47;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ sal_Unicode input1;
+
+ ~TestCase() {delete expVal;}
+ }TestCase;
+
+ TestCase arrTestCase[]=
+ {
+ {"input Unicode 'a' and return OUString 'a'",
+ new OUString(&tmpchar1,1),tmpchar1
+ },
+ {"input Unicode '5' and return OUString '5'",
+ new OUString(&tmpchar2,1), tmpchar2
+ },
+ {"input Unicode 0 and return OUString 0",
+ new OUString(&tmpchar3,1),tmpchar3
+ },
+ {"input Unicode ' ' and return OUString ' '",
+ new OUString(&tmpchar4,1),tmpchar4
+ },
+ {"input Unicode '/' and return OUString ' '",
+ new OUString(&tmpchar5,1),tmpchar5
+ }
+ };
+
+ sal_Bool res=sal_True;
+ sal_uInt32 i;
+
+ for(i=0;i<(sizeof(arrTestCase))/(sizeof(TestCase));i++)
+ {
+ sal_Bool lastRes=(*(arrTestCase[i].expVal)==
+ OUString::valueOf(arrTestCase[i].input1));
+
+ c_rtl_tres_state(hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "valueOf( sal_Unicode c )", i )
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "Unicode");
+// return(res);
+}
+
+
+/**
+ * Calls the method valueOf(T, radix) and compares
+ * returned ustrings with ustrings that passed in the array resArray.
+ *
+ * @param T, type of argument, passed to valueOf
+ * @param resArray, array of result ustrings to compare to
+ * @param n the number of elements in the array resArray (testcases)
+ * @param pTestResult the instance of the class TestResult
+ * @param inArray [optional], array of value that is passed as first argument
+ * to valueOf
+ *
+ * @return true, if all returned ustrings are equal to corresponding ustring in
+ * resArray else, false.
+ */
+template <class T>
+sal_Bool test_valueOf( const char** resArray, int n, sal_Int16 radix,
+ hTestResult hRtlTestResult, const T *inArray )
+{
+ sal_Bool bRes = sal_True;
+
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+ sal_Int32 i;
+// static sal_Unicode aUchar[50]={0x12};
+
+ for (i = 0; i < n; i++)
+ {
+ ::rtl::OUString aStr1;
+
+ OSL_ENSURE( i < 50, "ERROR: leave aUchar bound");
+
+// AStringToUStringCopy(aUchar,resArray[i]);
+// ::rtl::OUString aStr2(aUchar);
+ rtl::OUString aStr2;
+ aStr2 = OUString::createFromAscii(resArray[i]);
+
+ ::rtl::OUString aStr3( "-",1,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString);
+
+ if (inArray == 0)
+ {
+ aStr1 = ::rtl::OUString::valueOf((T)i, radix);
+ }
+ else
+ {
+ if ( inArray[i] < 0 )
+ {
+ sal_Unicode aStr4[100];
+ OSL_ASSERT(strlen(resArray[i]) < 100);
+
+ if(AStringToUStringCopy(aStr4,resArray[i]))
+ {
+ aStr2 = aStr3;
+ aStr2 += aStr4;
+ }
+
+ }
+ aStr1 = ::rtl::OUString::valueOf((T)inArray[i], radix);
+ }
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr2.compareTo(aStr1) == 0,
+ (sal_Char*)resArray[i],
+ createName( pMeth, "valueOf", i )
+ );
+ }
+
+ return (bRes);
+}
+
+
+#define test_valueOf_Int32 test_valueOf<sal_Int32>
+#define test_valueOf_Int64 test_valueOf<sal_Int64>
+// LLA: #define test_valueOf_float test_valueOf<float>
+// LLA: #define test_valueOf_double test_valueOf<double>
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=2 )
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=8 )
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=10 )
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=16 )
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=36 )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int32(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kBinaryNumsStr,
+ kBinaryNumsCount, kRadixBinary, hRtlTestResult, 0 ),
+ "kRadixBinary",
+ "valueOf(sal_Int32, radix 2)"
+ );
+
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kOctolNumsStr,
+ kOctolNumsCount, kRadixOctol, hRtlTestResult, 0),
+ "kRadixOctol",
+ "valueOf(sal_Int32, radix 8)"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kDecimalNumsStr,
+ kDecimalNumsCount, kRadixDecimal, hRtlTestResult, 0),
+ "kRadixDecimal",
+ "valueOf(sal_Int32, radix 10)"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kHexDecimalNumsStr,
+ kHexDecimalNumsCount, kRadixHexdecimal, hRtlTestResult, 0),
+ "kRadixHexdecimal",
+ "valueOf(sal_Int32, radix 16)"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kBase36NumsStr,
+ kBase36NumsCount, kRadixBase36, hRtlTestResult, 0),
+ "kRadixBase36",
+ "valueOf(sal_Int32, radix 36)"
+ );
+
+
+ return ( bRes );
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=2 )
+// where l = large constants
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=8 )
+// where l = large constants
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=10 )
+// where l = large constants
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=16 )
+// where l = large constants
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix=36 )
+// where l = large constants
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int32_Bounderies(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kBinaryMaxNumsStr,
+ kInt32MaxNumsCount, kRadixBinary,
+ hRtlTestResult, kInt32MaxNums),
+ "kRadixBinary",
+ "valueOf(salInt32, radix 2) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kOctolMaxNumsStr,
+ kInt32MaxNumsCount, kRadixOctol,
+ hRtlTestResult, kInt32MaxNums),
+ "kRadixOctol",
+ "valueOf(salInt32, radix 8) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kDecimalMaxNumsStr,
+ kInt32MaxNumsCount, kRadixDecimal,
+ hRtlTestResult, kInt32MaxNums),
+ "kRadixDecimal",
+ "valueOf(salInt32, radix 10) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kHexDecimalMaxNumsStr,
+ kInt32MaxNumsCount, kRadixHexdecimal,
+ hRtlTestResult, kInt32MaxNums),
+ "kRadixHexdecimal",
+ "valueOf(salInt32, radix 16) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32((const char**)kBase36MaxNumsStr,
+ kInt32MaxNumsCount, kRadixBase36,
+ hRtlTestResult, kInt32MaxNums),
+ "kRadixBase36",
+ "valueOf(salInt32, radix 36) Bounderies"
+ );
+
+ return ( bRes );
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=2 )
+// for negative value
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=8 )
+// for negative value
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=10 )
+// for negative value
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=16 )
+// for negative value
+// testing the method valueOf( sal_Int32 i, sal_Int16 radix=36 )
+// for negative value
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int32_Negative(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+ sal_Int32 inArr[kBase36NumsCount];
+ sal_Int32 i;
+
+ for (i = 0; i < kBase36NumsCount; i++ )
+ inArr[i] = -i;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kBinaryNumsStr, kBinaryNumsCount,
+ kRadixBinary, hRtlTestResult, inArr ),
+ "negative Int32, kRadixBinary",
+ "valueOf( negative Int32, radix 2 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kOctolNumsStr, kOctolNumsCount,
+ kRadixOctol, hRtlTestResult, inArr ),
+ "negative Int32, kRadixOctol",
+ "valueOf( negative Int32, radix 8 )"
+ );
+
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kDecimalNumsStr, kDecimalNumsCount,
+ kRadixDecimal, hRtlTestResult, inArr ),
+ "negative Int32, kRadixDecimal",
+ "valueOf( negative Int32, radix 10 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kHexDecimalNumsStr, kHexDecimalNumsCount,
+ kRadixHexdecimal, hRtlTestResult, inArr ),
+ "negative Int32, kRadixHexdecimal",
+ "valueOf( negative Int32, radix 16 )"
+ );
+
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int32( kBase36NumsStr, kBase36NumsCount,
+ kRadixBase36, hRtlTestResult, inArr ),
+ "negative Int32, kRadixBase36",
+ "valueOf( negative Int32, radix 36 )"
+ );
+
+ return ( bRes );
+}
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int32 l, sal_Int32 radix ) where radix = -5
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int32_WrongRadix(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ sal_Int32 intVal = 11;
+
+ ::rtl::OUString aStr1;
+ ::rtl::OUString aStr2("11",2,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString);
+
+ aStr1 = aStr1.valueOf( intVal, -5 );
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr2.compareTo( aStr1 ) == 0,
+ "if radix not valid then radix must be 10",
+ "valueOf(sal_Int32, sal_Int32 radix): radix = -5"
+ );
+
+ return (bRes);
+}
+
+
+//------------------------------------------------------------------------
+static sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int32_defaultParam(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ sal_Char* newUChar1="15";
+ sal_Char* newUChar2="0";
+ sal_Char* newUChar3="-15";
+ sal_Char* newUChar4="2147483647";
+ sal_Char* newUChar5="-2147483648";
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 input1;
+ OUString* expVal;
+ ~TestCase() {delete expVal;}
+ }TestCase;
+
+ TestCase arrTestCase[]=
+ {
+ {"input Int32 15 and return OUString 15",15,
+ new OUString(newUChar1,2,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"input Int32 0 and return OUString 0",0,
+ new OUString(newUChar2,1,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"input Int32 -15 and return OUString -15",-15,
+ new OUString(newUChar3,3,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"input Int32 2147483647 and return OUString 2147483647", SAL_MAX_INT32 /* 2147483647 */,
+ new OUString(newUChar4,10,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"input Int32 -2147483648 and return OUString -2147483648",
+ SAL_MIN_INT32 /* 2-2147483648 */,
+ new OUString(newUChar5,11,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ }
+ };
+
+ sal_Bool res=sal_True;
+ sal_uInt32 i;
+
+ for(i=0;i<(sizeof(arrTestCase))/(sizeof(TestCase));i++)
+ {
+ sal_Bool lastRes=(*(arrTestCase[i].expVal)==
+ OUString::valueOf(arrTestCase[i].input1));
+
+ c_rtl_tres_state(hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth,
+ "valueOf( sal_Int32 i, sal_Int16 radix = 10 )", i )
+ );
+
+ res &= lastRes;
+ }
+
+ return(res);
+
+}
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=2 )
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=8 )
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=10 )
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=16 )
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=36 )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int64(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kBinaryNumsStr,
+ kBinaryNumsCount, kRadixBinary, hRtlTestResult, 0),
+ "kRadixBinary",
+ "valueOf(sal_Int64, radix 2)_"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kOctolNumsStr,
+ kOctolNumsCount, kRadixOctol, hRtlTestResult, 0),
+ "kRadixOctol",
+ "valueOf(sal_Int64, radix 8)_"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kDecimalNumsStr,
+ kDecimalNumsCount, kRadixDecimal, hRtlTestResult, 0),
+ "kRadixDecimal",
+ "valueOf(sal_Int64, radix 10)_"
+ );
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kHexDecimalNumsStr,
+ kHexDecimalNumsCount, kRadixHexdecimal, hRtlTestResult, 0),
+ "kRadixHexdecimal",
+ "valueOf(sal_Int64, radix 16)_"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kBase36NumsStr,
+ kBase36NumsCount, kRadixBase36, hRtlTestResult, 0),
+ "kRadixBase36",
+ "valueOf(sal_Int64, radix 36)_"
+ );
+
+ return (bRes);
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=2 )
+// where l = large constants
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=8 )
+// where l = large constants
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=10 )
+// where l = large constants
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=16 )
+// where l = large constants
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix=36 )
+// where l = large constants
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int64_Bounderies(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kBinaryMaxNumsStr,
+ kInt64MaxNumsCount, kRadixBinary,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixBinary",
+ "valueOf(salInt64, radix 2) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kOctolMaxNumsStr,
+ kInt64MaxNumsCount, kRadixOctol,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixOctol",
+ "valueOf(salInt64, radix 8) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kDecimalMaxNumsStr,
+ kInt64MaxNumsCount, kRadixDecimal,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixDecimal",
+ "valueOf(salInt64, radix 10) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kHexDecimalMaxNumsStr,
+ kInt64MaxNumsCount, kRadixHexdecimal,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixHexdecimal",
+ "valueOf(salInt64, radix 16) Bounderies"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64((const char**)kBase36MaxNumsStr,
+ kInt64MaxNumsCount, kRadixBase36,
+ hRtlTestResult, kInt64MaxNums),
+ "kRadixBase36",
+ "valueOf(salInt64, radix 36) Bounderies"
+ );
+
+ return ( bRes );
+}
+
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=2 )
+// for negative value
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=8 )
+// for negative value
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=10 )
+// for negative value
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=16 )
+// for negative value
+// testing the method valueOf( sal_Int64 l, sal_Int16 radix=36 )
+// for negative value
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int64_Negative(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ sal_Int64 inArr[36];
+ sal_Int32 i;
+
+ for (i = 0; i < 36; i++) {
+ inArr[i] = -i;
+ }
+
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kBinaryNumsStr, kBinaryNumsCount,
+ kRadixBinary, hRtlTestResult, inArr ),
+ "negative Int64, kRadixBinary",
+ "valueOf( negative Int64, radix 2 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kOctolNumsStr, kOctolNumsCount,
+ kRadixOctol, hRtlTestResult, inArr ),
+ "negative Int64, kRadixOctol",
+ "valueOf( negative Int64, radix 8 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kDecimalNumsStr, kDecimalNumsCount,
+ kRadixDecimal, hRtlTestResult, inArr ),
+ "negative Int64, kRadixDecimal",
+ "valueOf( negative Int64, radix 10 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kHexDecimalNumsStr, kHexDecimalNumsCount,
+ kRadixHexdecimal, hRtlTestResult, inArr ),
+ "negative Int64, kRadixHexDecimal",
+ "valueOf( negative Int64, radix 16 )"
+ );
+
+ bRes &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_valueOf_Int64( kBase36NumsStr, kBase36NumsCount,
+ kRadixBase36, hRtlTestResult, inArr),
+ "negative Int64, kRadixBase36",
+ "valueOf( negative Int64, radix 36 )"
+ );
+
+ return (bRes);
+}
+//------------------------------------------------------------------------
+// testing the method valueOf( sal_Int64 l, sal_Int32 radix )
+// where radix = -5
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int64_WrongRadix(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes = sal_False;
+
+ sal_Int64 intVal = 11;
+
+ ::rtl::OUString aStr1;
+ ::rtl::OUString aStr2("11",2,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString);
+
+ aStr1 = aStr1.valueOf( intVal, -5 );
+
+ bRes = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aStr2.compareTo(aStr1) == 0,
+ "if radix not valid then radix must be 10",
+ "valueOf(sal_Int64, sal_Int32 radix): radix = -5"
+ );
+
+ return (bRes);
+}
+
+//------------------------------------------------------------------------
+static sal_Bool SAL_CALL test_rtl_OUString_valueOf_Int64_defaultParam(
+ hTestResult hRtlTestResult )
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ sal_Char* newUChar1="15";
+ sal_Char* newUChar2="0";
+ sal_Char* newUChar3="-15";
+ sal_Char* newUChar4= "9223372036854775807";
+ sal_Char* newUChar5="-9223372036854775808";
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int64 input1;
+ OUString* expVal;
+ ~TestCase() {delete expVal;}
+ }TestCase;
+
+ TestCase arrTestCase[]=
+ {
+ {"input Int64 15 and return OUString 15",15,
+ new OUString(newUChar1,2,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"input Int64 0 and return OUString 0",0,
+ new OUString(newUChar2,1,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"input Int64 -15 and return OUString -15",-15,
+ new OUString(newUChar3,3,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"input Int64 9223372036854775807 and return 9223372036854775807",
+ SAL_MAX_INT64 /* 9223372036854775807*/,
+ new OUString(newUChar4,19,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {"input Int64 -9223372036854775808 and return -9223372036854775808",
+ SAL_MIN_INT64 /* 9223372036854775808*/,
+ new OUString(newUChar5,20,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ }
+ };
+
+ sal_Bool res=sal_True;
+ sal_uInt32 i;
+
+ for(i=0;i<(sizeof(arrTestCase))/(sizeof(TestCase));i++)
+ {
+ sal_Bool lastRes=(*(arrTestCase[i].expVal)==
+ OUString::valueOf(arrTestCase[i].input1));
+
+ c_rtl_tres_state(hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth,
+ "valueOf( sal_Int64 i, sal_Int16 radix = 10 )", i )
+ );
+
+ res &= lastRes;
+ }
+
+ return(res);
+
+}
+//------------------------------------------------------------------------
+// testing the method valueOf( float f )
+//------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OUString_valueOf_float(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth =methName;
+// LLA:
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: sal_Char* comments;
+// LLA: float input1;
+// LLA: OUString* expVal;
+// LLA:
+// LLA: ~TestCase() {delete expVal;}
+// LLA: } TestCase;
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: { "3.0", 3.0, new OUString("3.0",3,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString) },
+// LLA: { "3.5", 3.5f, new OUString("3.5",3,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: { "3.0625", 3.0625f, new OUString("3.0625",6,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: { "3.502525", 3.502525f, new OUString("3.502525",8,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString) },
+// LLA: { "3.141592", 3.141592f, new OUString("3.141592",8,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString) },
+// LLA: { "3.5025255", 3.5025255f, new OUString("3.5025255",9,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString) },
+// LLA: { "3.0039062", 3.00390625f, new OUString("3.0039062",9,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString) }
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+// LLA: {
+// LLA: ::rtl::OUString aStr1;
+// LLA: aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+// LLA: sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: arrTestCase[i].comments,
+// LLA: createName( pMeth, "valueof_float", i)
+// LLA: );
+// LLA:
+// LLA: res &= lastRes;
+// LLA:
+// LLA: }
+// LLA:
+// LLA: return ( res );
+// LLA: }
+
+//------------------------------------------------------------------------
+// testing the method valueOf( float f ) for negative value
+//------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OUString_valueOf_Float_Negative(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth =methName;
+// LLA:
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: sal_Char* comments;
+// LLA: float input1;
+// LLA: OUString* expVal;
+// LLA:
+// LLA: ~TestCase() {delete expVal;}
+// LLA: } TestCase;
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: { "-3.0", -3.0, new OUString("-3.0",4,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString) },
+// LLA: { "-3.5", -3.5f, new OUString("-3.5",4,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: { "-3.0625", -3.0625f, new OUString("-3.0625",7,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString)},
+// LLA: { "-3.502525", -3.502525f, new OUString("-3.502525",9,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString) },
+// LLA: { "-3.141592", -3.141592f, new OUString("-3.141592",9,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString) },
+// LLA: { "-3.5025255", -3.5025255f, new OUString("-3.5025255",10,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString) },
+// LLA: { "-3.0039062", -3.00390625f, new OUString("-3.0039062",10,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString) }
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+// LLA: {
+// LLA: ::rtl::OUString aStr1;
+// LLA: aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+// LLA: sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: arrTestCase[i].comments,
+// LLA: createName( pMeth, "valueof_negative float", i)
+// LLA: );
+// LLA:
+// LLA: res &= lastRes;
+// LLA:
+// LLA: }
+// LLA:
+// LLA: return ( res );
+// LLA: }
+
+//------------------------------------------------------------------------
+// testing the method valueOf( double f )
+//------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OUString_valueOf_double(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth =methName;
+// LLA:
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: sal_Char* comments;
+// LLA: double input1;
+// LLA: OUString* expVal;
+// LLA:
+// LLA: ~TestCase() {delete expVal;}
+// LLA: } TestCase;
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: {"3.0", 3.0, new OUString("3.0",3,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"3.5", 3.5, new OUString("3.5",3,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"3.0625", 3.0625, new OUString("3.0625",6,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"3.1415926535", 3.1415926535, new OUString("3.1415926535",12,
+// LLA: kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString)},
+// LLA: {"3.1415926535897931", 3.141592653589793,
+// LLA: new OUString("3.1415926535897931",18,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"3.1415926535897931", 3.1415926535897932,
+// LLA: new OUString("3.1415926535897931",18,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"3.1415926535897931", 3.14159265358979323,
+// LLA: new OUString("3.1415926535897931",18,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"3.1415926535897931", 3.141592653589793238462643,
+// LLA: new OUString("3.1415926535897931",18,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)}
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+// LLA: {
+// LLA: ::rtl::OUString aStr1;
+// LLA: aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+// LLA: sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: arrTestCase[i].comments,
+// LLA: createName( pMeth, "valueof_double", i)
+// LLA: );
+// LLA:
+// LLA: res &= lastRes;
+// LLA:
+// LLA: }
+// LLA:
+// LLA: return ( res );
+// LLA: }
+
+
+//------------------------------------------------------------------------
+// testing the method valueOf( double f ) for negative value
+//------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OUString_valueOf_Double_Negative(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Char methName[MAXBUFLENGTH];
+// LLA: sal_Char* pMeth =methName;
+// LLA:
+// LLA: typedef struct TestCase
+// LLA: {
+// LLA: sal_Char* comments;
+// LLA: double input1;
+// LLA: OUString* expVal;
+// LLA:
+// LLA: ~TestCase() {delete expVal;}
+// LLA: } TestCase;
+// LLA:
+// LLA: TestCase arrTestCase[] =
+// LLA: {
+// LLA: {"-3.0", -3.0, new OUString("-3.0",4,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"-3.5", -3.5, new OUString("-3.5",4,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"-3.0625", -3.0625, new OUString("-3.0625",7,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"-3.1415926535", -3.1415926535,
+// LLA: new OUString("-3.1415926535",13,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"-3.1415926535897931", -3.141592653589793,
+// LLA: new OUString("-3.1415926535897931",19,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"-3.1415926535897931", -3.1415926535897932,
+// LLA: new OUString("-3.1415926535897931",19,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"-3.1415926535897931", -3.14159265358979323,
+// LLA: new OUString("-3.1415926535897931",19,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)},
+// LLA: {"-3.1415926535897931", -3.141592653589793238462643,
+// LLA: new OUString("-3.1415926535897931",19,kEncodingRTLTextUSASCII,
+// LLA: kConvertFlagsOStringToOUString)}
+// LLA: };
+// LLA:
+// LLA: sal_Bool res = sal_True;
+// LLA: sal_Int32 i;
+// LLA:
+// LLA: for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+// LLA: {
+// LLA: ::rtl::OUString aStr1;
+// LLA: aStr1 = aStr1.valueOf( arrTestCase[i].input1 );
+// LLA: sal_Bool lastRes = (arrTestCase[i].expVal->compareTo(aStr1) == 0);
+// LLA:
+// LLA: c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: lastRes,
+// LLA: arrTestCase[i].comments,
+// LLA: createName( pMeth, "valueof_nagative double", i)
+// LLA: );
+// LLA:
+// LLA: res &= lastRes;
+// LLA:
+// LLA: }
+// LLA:
+// LLA: return ( res );
+// LLA: }
+
+//------------------------------------------------------------------------
+// testing the method valueOf()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_valueOf(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "valueOf");
+ sal_Bool bTState = test_rtl_OUString_valueOf_Int32( hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int32_Bounderies( hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int32_Negative( hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int32_WrongRadix( hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int32_defaultParam(
+ hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int64( hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int64_Bounderies( hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int64_Negative( hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int64_WrongRadix( hRtlTestResult );
+ bTState &= test_rtl_OUString_valueOf_Int64_defaultParam(
+ hRtlTestResult );
+ // LLA: bTState &= test_rtl_OUString_valueOf_float( hRtlTestResult );
+ // LLA: bTState &= test_rtl_OUString_valueOf_Float_Negative( hRtlTestResult );
+
+ // LLA: bTState &= test_rtl_OUString_valueOf_double( hRtlTestResult );
+ // LLA: bTState &= test_rtl_OUString_valueOf_Double_Negative( hRtlTestResult );
+ c_rtl_tres_state_end( hRtlTestResult, "valueOf");
+// return ( bTState );
+}
+//------------------------------------------------------------------------
+// this is my testing code
+// testing the method createFromAscii( const sal_Char * value )
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_createFromAscii(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "createFromAscii");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Char* input1;
+ OUString* expVal;
+ ~TestCase() {delete expVal;}
+
+ }TestCase;
+
+ TestCase arrTestCase[]=
+ {
+
+ { "create OUString from sal_Char" ,kTestStr1,
+ new OUString(kTestStr1,kTestStr1Len,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ },
+ {
+ "create OUString from empty", "",
+ new OUString()
+ },
+ {
+ "create OUString from empty(string arg = '\\0')","",
+ new OUString("",0,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ }
+
+ };
+
+ sal_Bool res;
+ sal_uInt32 i;
+
+ for(i=0;i<(sizeof(arrTestCase))/(sizeof(TestCase));i++)
+ {
+ sal_Bool lastRes=(*(arrTestCase[i].expVal)==
+ OUString::createFromAscii(arrTestCase[i].input1));
+
+
+ {
+ c_rtl_tres_state(hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "createFromAscii", i )
+ );
+ }
+
+ res&=lastRes;
+
+ }
+
+ c_rtl_tres_state_end( hRtlTestResult, "createFromAscii");
+// return(res);
+}
+//------------------------------------------------------------------------
+// testing the method index( )
+//------------------------------------------------------------------------
+template <class T>
+sal_Bool test_index( const T* input1, int num,const sal_Int32* input2,
+ const sal_Int32* expVal,int base,rtlTestResult hRtlTestResult)
+{
+ sal_Bool res=sal_True;
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char *meth = '\0';
+ sal_Char* pMeth=methName;
+ sal_Int32 i;
+ sal_Bool lastRes=sal_False;
+
+ for(i=0;i<num;i++)
+ {
+ OUString str(aUStr2);
+
+ if(base==0)
+ {
+ lastRes=(str.indexOf(input1[i])==expVal[i]);
+ meth="indexOf_001";
+ }
+ if(base==1)
+ {
+ lastRes=(str.indexOf(input1[i],input2[i])==expVal[i]);
+ meth="indexOf_002";
+ }
+// LLA: if(base==2)
+// LLA: {
+// LLA: lastRes=(str.lastIndexOf(input1[i])==expVal[i]);
+// LLA: meth="lastIndexOf_001(sal_Unicode)";
+// LLA: }
+// LLA: if(base==3)
+// LLA: {
+// LLA: /*
+// LLA: OUString s4(&input1[i]);
+// LLA: rtl::OString sStr;
+// LLA: sStr <<= str;
+// LLA: t_print("str = %s\n", sStr.getStr());
+// LLA: rtl::OString sInput1;
+// LLA: sInput1 <<= s4; // rtl::OUString((sal_Unicode*)input1[i]);
+// LLA: t_print("%d = lastIndexOf(\"%s\", %d) =? %d\n", str.lastIndexOf(input1[i], input2[i]), sInput1.getStr(), input2[i], expVal[i]);
+// LLA: */
+// LLA: lastRes=(str.lastIndexOf(input1[i],input2[i])==expVal[i]);
+// LLA: meth="lastIndexOf_002(sal_Unicode , sal_Int32 )";
+// LLA: }
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ "index",
+ createName( pMeth,meth, i )
+ );
+
+ res &= lastRes;
+ }
+
+ return( res );
+}
+template <class T>
+sal_Bool test_indexStr( const T** input1, int num,const sal_Int32* input2,
+ const sal_Int32* expVal,int base,rtlTestResult hRtlTestResult)
+{
+ sal_Bool res=sal_True;
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char *meth = '\0';
+ sal_Char* pMeth=methName;
+ sal_Int32 i;
+ sal_Bool lastRes=sal_False;
+
+ for(i=0;i<num;i++)
+ {
+ OUString str(aUStr2);
+
+
+ if(base==0)
+ {
+ OUString s1(input1[i]);
+ lastRes=(str.indexOf(s1)==expVal[i]);
+ meth="indexOf_003";
+ }
+ if(base==1)
+ {
+ OUString s2(input1[i]);
+ lastRes=(str.indexOf(s2,input2[i])==expVal[i]);
+ meth="indexOf_004";
+ }
+// LLA: if(base==2)
+// LLA: {
+// LLA: OUString s3(input1[i]);
+// LLA: lastRes=(str.lastIndexOf(s3)==expVal[i]);
+// LLA: meth="lastIndexOf_003(const OUString)";
+// LLA: }
+// LLA: if(base==3)
+// LLA: {
+// LLA: OUString s4(input1[i]);
+// LLA:
+// LLA: rtl::OString sStr;
+// LLA: sStr <<= str;
+// LLA: t_print("str = \"%s\"\n", sStr.getStr());
+// LLA: rtl::OString sInput1;
+// LLA: sInput1 <<= s4; // rtl::OUString((sal_Unicode*)input1[i]);
+// LLA: t_print("%d = lastIndexOf(\"%s\", %d) =? %d\n", str.lastIndexOf(input1[i], input2[i]), sInput1.getStr(), input2[i], expVal[i]);
+// LLA:
+// LLA: lastRes=(str.lastIndexOf(s4,input2[i])==expVal[i]);
+// LLA: meth="lastIndexOf_004(const OUString,sal_Int32)";
+// LLA: }
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ "index",
+ createName( pMeth,meth, i )
+ );
+
+ res &= lastRes;
+ }
+
+ return( res );
+}
+//------------------------------------------------------------------------
+// testing the method indexOf( )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_indexOf_001(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes=sal_False;
+
+ bRes=c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_index<sal_Unicode>((const sal_Unicode*)input1Default,
+ nDefaultCount,input2Default,
+ expValDefault,0,hRtlTestResult),
+ "index",
+ "indexDefault(sal_Unicode ch, sal_Int32 fromIndex = 0)"
+ );
+
+ return ( bRes );
+}
+//------------------------------------------------------------------------
+// testing the method indexOf( )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_indexOf_002(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes=sal_False;
+
+ bRes=c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_index<sal_Unicode>((const sal_Unicode*)input1Normal,
+ nNormalCount,input2Normal,
+ expValNormal,1,hRtlTestResult),
+ "index",
+ "indexNormal(sal_Unicode ch, sal_Int32 fromIndex)"
+ );
+
+ return ( bRes );
+}
+//------------------------------------------------------------------------
+// testing the method indexOf( OUString ch, sal_Int32 fromIndex = 0 )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_indexOf_003(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes=sal_False;
+
+ bRes=c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_indexStr<sal_Unicode>((const sal_Unicode**)input1StrDefault,
+ nStrDefaultCount,input2StrDefault,
+ expValStrDefault,0,hRtlTestResult),
+ "index",
+ "indexDefault(OUString ch, sal_Int32 fromIndex = 0)"
+ );
+
+ return ( bRes );
+}
+//------------------------------------------------------------------------
+// testing the method indexOf( OUString ch, sal_Int32 fromIndex )
+//------------------------------------------------------------------------
+sal_Bool SAL_CALL test_rtl_OUString_indexOf_004(
+ hTestResult hRtlTestResult )
+{
+ sal_Bool bRes=sal_False;
+
+ bRes=c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_indexStr<sal_Unicode>((const sal_Unicode**)input1StrNormal,
+ nStrNormalCount,input2StrNormal,
+ expValStrNormal,1,hRtlTestResult),
+ "indexOf",
+ "indexOf(OUString ch, sal_Int32 fromIndex)"
+ );
+
+ return ( bRes );
+}
+// LLA: //------------------------------------------------------------------------
+// LLA: // testing the method lastIndexOf( sal_Unicode ch )
+// LLA: //------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OUString_lastIndexOf_001(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Bool bRes=sal_False;
+// LLA:
+// LLA: bRes=c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: test_index<sal_Unicode>((const sal_Unicode*)input1lastDefault,
+// LLA: nlastDefaultCount,input2lastDefault,
+// LLA: expVallastDefault,2,hRtlTestResult),
+// LLA: "lastIndex",
+// LLA: "lastIndexDefault(sal_Unicode ch)"
+// LLA: );
+// LLA:
+// LLA: return ( bRes );
+// LLA: }
+// LLA: //------------------------------------------------------------------------
+// LLA: // testing the method lastIndexOf( sal_Unicode ch, sal_Int32 fromIndex )
+// LLA: //------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OUString_lastIndexOf_002(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Bool bRes=sal_False;
+// LLA:
+// LLA: bRes=c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: test_index<sal_Unicode>((const sal_Unicode*)input1lastNormal,
+// LLA: nlastNormalCount,input2lastNormal,
+// LLA: expVallastNormal,3,hRtlTestResult),
+// LLA: "lastIndex",
+// LLA: "lastIndexNormal(sal_Unicode ch, sal_Int32 fromIndex)"
+// LLA: );
+// LLA:
+// LLA: return ( bRes );
+// LLA: }
+// LLA: //------------------------------------------------------------------------
+// LLA: // testing the method lastIndexOf( OUString ch )
+// LLA: //------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OUString_lastIndexOf_003(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Bool bRes=sal_False;
+// LLA:
+// LLA: bRes=c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: test_indexStr<sal_Unicode>((const sal_Unicode**)input1StrLastDefault,
+// LLA: nStrLastDefaultCount,input2StrLastDefault,
+// LLA: expValStrLastDefault,2,hRtlTestResult),
+// LLA: "lastIndexOf",
+// LLA: "lastIndexOf(OUString ch)"
+// LLA: );
+// LLA:
+// LLA: return ( bRes );
+// LLA: }
+// LLA: //------------------------------------------------------------------------
+// LLA: // testing the method lastIndexOf( OUString ch, sal_Int32 fromIndex )
+// LLA: //------------------------------------------------------------------------
+// LLA: sal_Bool SAL_CALL test_rtl_OUString_lastIndexOf_004(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: sal_Bool bRes=sal_False;
+// LLA:
+// LLA: for (int i=0;i<nStrLastNormalCount;i++)
+// LLA: {
+// LLA: rtl::OUString aStr = rtl::OUString(input1StrLastNormal[i]);
+// LLA: volatile int dummy = 0;
+// LLA: }
+// LLA:
+// LLA: bRes=c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: test_indexStr<sal_Unicode>((const sal_Unicode**)input1StrLastNormal,
+// LLA: nStrLastNormalCount,input2StrLastNormal,
+// LLA: expValStrLastNormal,3,hRtlTestResult),
+// LLA: "lastIndexOf",
+// LLA: "lastIndexOf(OUString ch, sal_Int32 fromIndex)"
+// LLA: );
+// LLA:
+// LLA: return ( bRes );
+// LLA: }
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_indexOf(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "indexOf");
+ sal_Bool res = test_rtl_OUString_indexOf_001(hRtlTestResult);
+ res &= test_rtl_OUString_indexOf_002(hRtlTestResult);
+ res &= test_rtl_OUString_indexOf_003(hRtlTestResult);
+ res &= test_rtl_OUString_indexOf_004(hRtlTestResult);
+ c_rtl_tres_state_end( hRtlTestResult, "indexOf");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// LLA: extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_lastIndexOf(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: c_rtl_tres_state_start( hRtlTestResult, "lastIndexOf");
+// LLA: sal_Bool res = test_rtl_OUString_lastIndexOf_001(hRtlTestResult);
+// LLA: res &= test_rtl_OUString_lastIndexOf_002(hRtlTestResult);
+// LLA: res &= test_rtl_OUString_lastIndexOf_003(hRtlTestResult);
+// LLA: res &= test_rtl_OUString_lastIndexOf_004(hRtlTestResult);
+// LLA: c_rtl_tres_state_end( hRtlTestResult, "lastIndexOf");
+// LLA: // return ( res );
+// LLA: }
+//------------------------------------------------------------------------
+// testing the method concat( const OString & aStr )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_concat(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "concat");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUString* input1;
+ OUString* input2;
+ ~TestCase() { delete input1;delete input2; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"concatenates two ustrings",new OUString(aUStr1),
+ new OUString(aUStr7), new OUString(aUStr8)},
+ {"concatenates empty ustring",new OUString(aUStr1),
+ new OUString(aUStr1), new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString)},
+ {"concatenates to empty ustring",new OUString(aUStr1),new OUString("",
+ 0,kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString(aUStr1)},
+ {"concatenates two empty ustrings",new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString)},
+ {"concatenates ustring constructed by default constructor",
+ new OUString(aUStr1),new OUString(aUStr1), new OUString()},
+ {"concatenates to ustring constructed by default constructor",
+ new OUString(aUStr1),new OUString(), new OUString(aUStr1)},
+ {"concatenates two ustrings constructed by default constructor",
+ new OUString(),new OUString(), new OUString()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OUString str = arrTestCase[i].input1->concat(*arrTestCase[i].input2);
+ sal_Bool lastRes = (str == *arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "concat", i)
+ );
+
+ res &= lastRes;
+
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "concat");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method replaceAt( sal_Int32 index, sal_Int32 count,
+// const OUString& newStr )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_replaceAt(
+ rtlTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "replaceAt");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUString* input;
+ OUString* newStr;
+ sal_Int32 index;
+ sal_Int32 count;
+
+ ~TestCase() { delete input; delete expVal; delete newStr;}
+ } TestCase;
+
+ TestCase arrTestCase[]=
+ {
+
+ { "string differs", new OUString(aUStr2), new OUString(aUStr22),
+ new OUString(aUStr2), 0, kTestStr22Len },
+
+ { "larger index", new OUString(aUStr1), new OUString(aUStr7),
+ new OUString(aUStr8), 64, kTestStr8Len },
+
+ { "larger count", new OUString(aUStr2), new OUString(aUStr22),
+ new OUString(aUStr2),0, 64 },
+
+ { "navigate index", new OUString(aUStr2), new OUString(aUStr22),
+ new OUString(aUStr2), -64, 64 },
+
+ { "null ustring",
+ new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString(aUStr14),
+ new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ 0, kTestStr14Len }
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ ::rtl::OUString aStr1;
+ aStr1 = arrTestCase[i].input->replaceAt( arrTestCase[i].index,
+ arrTestCase[i].count, *arrTestCase[i].newStr );
+
+ sal_Bool lastRes = ( arrTestCase[i].expVal->compareTo(aStr1) == 0 );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "replaceAt", i )
+
+ );
+ res &= lastRes;
+ }
+
+ c_rtl_tres_state_end( hRtlTestResult, "replaceAt");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// this is my testing code
+// testing the method replace( sal_Unicode oldChar, sal_Unicode newChar )
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_replace(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "replace");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUString* input;
+ sal_Unicode oldChar;
+ sal_Unicode newChar;
+
+ ~TestCase() { delete input; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[]=
+ {
+ {"ustring differs", new OUString(aUStr18), new OUString(aUStr4),83,115},
+ {"ustring differs", new OUString(aUStr19), new OUString(aUStr17),32,45},
+ {"ustring must be empty", new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),83,23},
+ {"ustring must be empty", new OUString(),
+ new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),83,23},
+ {"same ustring, no replace ", new OUString(aUStr22),
+ new OUString(aUStr22),42,56}
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ ::rtl::OUString aStr1;
+ aStr1= arrTestCase[i].input->replace(arrTestCase[i].oldChar,arrTestCase[i].newChar);
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ (arrTestCase[i].expVal->compareTo(aStr1) == 0),
+ arrTestCase[i].comments,
+ createName( pMeth, "replace", i )
+
+ );
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "replace");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method toAsciiLowerCase()
+//-----------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_toAsciiLowerCase(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "toAsciiLowerCase");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUString* input1;
+ ~TestCase() { delete input1; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+
+ {"only uppercase",new OUString(aUStr5),new OUString(aUStr4)},
+ {"different cases",new OUString(aUStr5),new OUString(aUStr1)},
+ {"different cases",new OUString(aUStr5),new OUString(aUStr3)},
+ {"only lowercase",new OUString(aUStr5),new OUString(aUStr5)},
+ {"empty ustring",new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString)},
+ {"ustring constructed by default constructor",new OUString(),
+ new OUString()},
+ {"have special Unicode",new OUString("\23\12\34sun\13\45",6,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString("\23\12\34sun\13\45",6,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ sal_Bool lastRes=sal_False;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OUString str = arrTestCase[i].input1->toAsciiLowerCase();
+ if(i<=5)
+ {
+ lastRes = (str ==* arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "toAsciiLowerCase", i)
+ );
+ }
+ else
+ {
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ sal_True,
+ arrTestCase[i].comments,
+ createName( pMeth, "toAsciiLowerCase", i)
+ );
+ }
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "toAsciiLowerCase");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method toAsciiUpperCase()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_toAsciiUpperCase(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "toAsciiUpperCase");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUString* input1;
+ ~TestCase() { delete input1; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"only lowercase",new OUString(aUStr4),new OUString(aUStr5)},
+ {"mixed cases",new OUString(aUStr4),new OUString(aUStr3)},
+ {"mixed cases",new OUString(aUStr4),new OUString(aUStr1)},
+ {"only uppercase",new OUString(aUStr4),new OUString(aUStr4)},
+ {"empty ustring",new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString("",0,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString)},
+ {"ustring constructed by default constructor",new OUString(),
+ new OUString()},
+ {"have special Unicode",new OUString("\23\12\34SUN\13\45",6,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString),
+ new OUString("\23\12\34sun\13\45",6,
+ kEncodingRTLTextUSASCII,kConvertFlagsOStringToOUString)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ sal_Bool lastRes=sal_False;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OUString str = arrTestCase[i].input1->toAsciiUpperCase();
+ if(i<=5)
+ {
+ lastRes = (str == *arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "toAsciiUpperCase", i)
+ );
+ }
+ else
+ {
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ sal_True,
+ arrTestCase[i].comments,
+ createName( pMeth, "toAsciiUpperCase", i)
+ );
+ }
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "toAsciiUpperCase");
+// return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method trim()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_trim(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "trim");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth =methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUString* input1;
+ ~TestCase() { delete input1; delete expVal;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"removes space from the front",new OUString(aUStr1),
+ new OUString(aUStr10)},
+ {"removes space from the end",new OUString(aUStr1),
+ new OUString(aUStr11)},
+ {"removes space from the front and end",new OUString(aUStr1),
+ new OUString(aUStr12)},
+ {"removes several spaces from the end",new OUString(aUStr1),
+ new OUString(aUStr13)},
+ {"removes several spaces from the front",new OUString(aUStr1),
+ new OUString(aUStr14)},
+ {"removes several spaces from the front and one from the end",
+ new OUString(aUStr1),
+ new OUString(aUStr15)},
+ {"removes one space from the front and several from the end",
+ new OUString(aUStr1),
+ new OUString(aUStr16)},
+ {"removes several spaces from the front and end",
+ new OUString(aUStr1),
+ new OUString(aUStr17)},
+ {"removes characters that have codes <= 32",new OUString(aUStr30),
+ new OUString("\1\3\5\7\11\13\15\17sun\21\23\25\27\31\33\50",
+ 18,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"removes characters that have codes <= 32",new OUString(aUStr28),
+ new OUString("\50\3\5\7\11\13\15\17sun\21\23\25\27\31\33\1",
+ 18,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"removes characters that have codes <= 32",new OUString(aUStr29),
+ new OUString("\50\3\5\7\11\13\15\17sun\21\23\25\27\31\33\50",
+ 18,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"removes characters that have codes <= 32",new OUString(aUStr20),
+ new OUString("\1\3\5\7\11\13\15\17sun\21\23\25\27\31\23\20",
+ 18,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"no spaces",new OUString(aUStr8),
+ new OUString(aUStr8)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ OUString strRes = arrTestCase[i].input1->trim();
+ sal_Bool lastRes = (strRes == *arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "trim", i)
+ );
+
+ res &= lastRes;
+
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "trim");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method toData()
+//------------------------------------------------------------------------
+
+template <class T>
+sal_Bool test_toData( const char** input, int num, sal_Int16 radix,
+ const T* expVal,int base,
+ const T* _fPrecision,
+ rtlTestResult hRtlTestResult)
+{
+ (void)_fPrecision;
+ sal_Bool res=sal_True;
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char *meth = '\0';
+ sal_Char* pMeth=methName;
+ sal_Int32 i;
+// static sal_Unicode aUchar[60]={0x00};
+ T intRes;
+ sal_Bool lastRes=sal_False;
+
+ for(i=0;i<num;i++)
+ {
+ OSL_ENSURE( i < 60, "ERROR: leave aUchar bound");
+
+// LLA: stored for the posterity
+// AStringToUStringCopy(aUchar,input[i]);
+// OUString str(aUchar);
+
+ OUString str;
+ str = OUString::createFromAscii(input[i]);
+
+
+ if(base==0)
+ {
+ intRes=static_cast<T>(str.toInt32());
+ lastRes=(intRes==expVal[i]);
+ meth="toInt32default";
+ }
+ if(base==1)
+ {
+ intRes=static_cast<T>(str.toInt32(radix));
+ lastRes=(intRes==expVal[i]);
+ meth="toInt32normal";
+ }
+ if(base==2)
+ {
+ intRes=static_cast<T>(str.toInt64());
+ lastRes=(intRes==expVal[i]);
+ meth="toInt64default";
+ }
+ if(base==3)
+ {
+ intRes=static_cast<T>(str.toInt64(radix));
+ lastRes=(intRes==expVal[i]);
+ meth="toInt64normal";
+ }
+// LLA: does no longer exist, moved to rtl/oustring
+// LLA: if(base==4)
+// LLA: {
+// LLA: intRes=str.toDouble();
+// LLA: lastRes=(fabs(intRes-expVal[i])<=1e-35);
+// LLA: meth="toDouble";
+// LLA: }
+
+// LLA: dt:20040802 create compile problems within wntmsci10
+// if(base==5)
+// {
+// intRes=str.toFloat();
+// T nPrec = _fPrecision[i];
+// lastRes=(fabs((T)(intRes-expVal[i])) <= nPrec /* 1e-35 */ );
+// meth="toFloat";
+// }
+ if(base==6)
+ {
+ intRes=str.toChar();
+ lastRes=(intRes==expVal[i]);
+ meth="toChar";
+ }
+
+ char buf[MAXBUFLENGTH];
+ buf[0] = '\'';
+ cpynstr( buf + 1, input[i], MAXBUFLENGTH );
+ int length = AStringLen( input[i] );
+ buf[length + 1] = '\'';
+ buf[length + 2] = 0;
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ buf,
+ createName( pMeth,meth, i )
+ );
+
+ res &= lastRes;
+ }
+
+ return( res );
+}
+//------------------------------------------------------------------------
+// testing the method toDouble()
+//------------------------------------------------------------------------
+
+// LLA: extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_toDouble(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: c_rtl_tres_state_start( hRtlTestResult, "toDouble");
+// LLA: sal_Bool bRes=sal_False;
+// LLA:
+// LLA: bRes=c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: test_toData<double>((const char**)inputDouble,nDoubleCount,10,
+// LLA: expValDouble,4,hRtlTestResult),
+// LLA: "toDouble",
+// LLA: "toDouble()"
+// LLA: );
+// LLA: c_rtl_tres_state_end( hRtlTestResult, "toDouble");
+// LLA: // return ( bRes );
+// LLA: }
+
+//------------------------------------------------------------------------
+// testing the method toFloat()
+//------------------------------------------------------------------------
+// LLA: dt:20040802 the test_toData() has compile problems.
+// LLA: extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_toFloat(
+// LLA: hTestResult hRtlTestResult )
+// LLA: {
+// LLA: c_rtl_tres_state_start( hRtlTestResult, "toFloat");
+// LLA: sal_Bool bRes=sal_False;
+// LLA:
+// LLA: bRes=c_rtl_tres_state
+// LLA: (
+// LLA: hRtlTestResult,
+// LLA: test_toData<float>((const char**)inputFloat,
+// LLA: nFloatCount,
+// LLA: 10, /* radix */
+// LLA: expValFloat,
+// LLA: 5, /* float */
+// LLA: fPrecision,
+// LLA: hRtlTestResult),
+// LLA: "toFloat",
+// LLA: "toFloat()"
+// LLA: );
+// LLA:
+// LLA: c_rtl_tres_state_end( hRtlTestResult, "toFloat");
+// LLA: // return ( bRes );
+// LLA:
+// LLA: }
+//------------------------------------------------------------------------
+// testing the method toChar()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_toChar(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "toChar");
+ sal_Bool bRes=sal_False;
+
+ bRes=c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Unicode>((const char**)inputChar,nCharCount,
+ 10,expValChar,6,NULL,hRtlTestResult),
+ "toChar",
+ "toChar()"
+ );
+
+ c_rtl_tres_state_end( hRtlTestResult, "toChar");
+// return ( bRes );
+
+}
+//------------------------------------------------------------------------
+// testing the method toBoolean()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_toBoolean(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "toBoolean");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Bool expVal;
+ OUString* input;
+
+ ~TestCase() {delete input;}
+ }TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"expected true", sal_True, new OUString("True",4,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"expected false", sal_False, new OUString("False",5,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)},
+ {"expected true", sal_True, new OUString("1",1,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool bRes = arrTestCase[i].input->toBoolean();
+ sal_Bool lastRes = (bRes == arrTestCase[i].expVal);
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "toBoolean", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "toBoolean");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method toInt32()
+//------------------------------------------------------------------------
+
+sal_Bool SAL_CALL test_rtl_OUString_toInt32_normal(
+ hTestResult hRtlTestResult )
+{
+ sal_Int32 expValues[kBase36NumsCount];
+ sal_Int32 i;
+
+ for ( i = 0; i < kBase36NumsCount; i++ )
+ expValues[i] = i;
+
+ sal_Bool res = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kBinaryNumsStr,kBinaryNumsCount,
+ kRadixBinary,expValues,1,NULL,hRtlTestResult ),
+ "kBinaryNumsStr",
+ "toInt32( radix 2 )"
+ );
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kBinaryMaxNumsStr,kInt32MaxNumsCount,
+ kRadixBinary,kInt32MaxNums,1,NULL,hRtlTestResult ),
+ "kBinaryMaxNumsStr",
+ "toInt32_Boundaries( radix 2 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kOctolNumsStr,kOctolNumsCount,
+ kRadixOctol,expValues,1,NULL,hRtlTestResult ),
+ "kOctolNumsStr",
+ "toInt32( radix 8 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kOctolMaxNumsStr,kInt32MaxNumsCount,
+ kRadixOctol,(sal_Int32*)kInt32MaxNums,1,NULL,hRtlTestResult ),
+ "kOctolMaxNumsStr",
+ "toInt32_Boundaries( radix 8 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kDecimalNumsStr,kDecimalNumsCount,
+ kRadixDecimal,expValues,1,NULL,hRtlTestResult ),
+ "kDecimalNumsStr",
+ "toInt32( radix 10 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kDecimalMaxNumsStr,kInt32MaxNumsCount,
+ kRadixDecimal,(sal_Int32*)kInt32MaxNums,1,NULL,hRtlTestResult ),
+ "kDecimalMaxNumsStr",
+ "toInt32_Boundaries( radix 10 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kHexDecimalNumsStr,kHexDecimalNumsCount,
+ kRadixHexdecimal,expValues,1,NULL,hRtlTestResult ),
+ "kHexDecimalNumsStr",
+ "toInt32( radix 16 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kHexDecimalMaxNumsStr,kInt32MaxNumsCount,
+ kRadixHexdecimal,(sal_Int32*)kInt32MaxNums,1,NULL,hRtlTestResult ),
+ "kHexDecimalMaxNumsStr",
+ "toInt32_Boundaries( radix 16 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kBase36NumsStr,kBase36NumsCount,
+ kRadixBase36, expValues,1,NULL,hRtlTestResult ),
+ "kBase36NumsStr",
+ "toInt32( radix 36 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kBase36MaxNumsStr,kInt32MaxNumsCount,
+ kRadixBase36,(sal_Int32*)kInt32MaxNums,1,NULL,hRtlTestResult ),
+ "kBase36MaxNumsStr",
+ "toInt32_Boundaries( radix 36 )"
+ );
+
+ const sal_Int16 nSpecCases = 5;
+ static const sal_Char *spString[nSpecCases] =
+ {
+ "-1",
+ "+1",
+ " 1",
+ " -1",
+ "001"
+ };
+
+ sal_Int32 expSpecVal[nSpecCases] =
+ {
+ -1,
+ 1,
+ 1,
+ -1,
+ 1
+ };
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( spString,nSpecCases,
+ kRadixDecimal,expSpecVal,1,NULL,hRtlTestResult ),
+ "special cases",
+ "toInt32( specialcases )"
+ );
+
+ return ( res );
+}
+sal_Bool SAL_CALL test_rtl_OUString_toInt32_wrongRadix(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OUString str("0",1,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString);
+
+ sal_Int32 iRes =str.toInt32(-1);
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ iRes == 0,
+ "wrong radix -1",
+ "toInt32( 0, wrong radix -1 )"
+ )
+ );
+}
+sal_Bool SAL_CALL test_rtl_OUString_toInt32_defaultParam(
+ hTestResult hRtlTestResult )
+{
+ sal_Int32 expValues[kBase36NumsCount];
+ sal_Int32 i;
+
+ for ( i = 0; i < kBase36NumsCount; i++ )
+ expValues[i] = i;
+
+ sal_Bool res = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kDecimalNumsStr,kDecimalNumsCount,
+ kRadixDecimal,expValues,0,NULL,hRtlTestResult ),
+ "kBinaryNumsStr",
+ "toInt32( radix 2 )"
+ );
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( kDecimalMaxNumsStr,kInt32MaxNumsCount,
+ kRadixDecimal,(sal_Int32*)kInt32MaxNums,0,NULL,hRtlTestResult ),
+ "kDecimalMaxNumsStr",
+ "toInt32_Boundaries( radix 10 )"
+ );
+ const sal_Int16 nSpecCases = 5;
+ static const sal_Char *spString[nSpecCases] =
+ {
+ "-1",
+ "+1",
+ " 1",
+ " -1",
+ "001"
+ };
+
+ sal_Int32 expSpecVal[nSpecCases] =
+ {
+ -1,
+ 1,
+ 1,
+ -1,
+ 1
+ };
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int32>( spString,nSpecCases,
+ kRadixDecimal,expSpecVal,0,NULL,hRtlTestResult ),
+ "special cases",
+ "toInt32( specialcases )"
+ );
+
+ return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method toInt32()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_toInt32(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "toInt32");
+ sal_Bool bTState = test_rtl_OUString_toInt32_normal( hRtlTestResult );
+ bTState &= test_rtl_OUString_toInt32_defaultParam( hRtlTestResult );
+ bTState &= test_rtl_OUString_toInt32_wrongRadix( hRtlTestResult );
+ c_rtl_tres_state_end( hRtlTestResult, "toInt32");
+// return ( bTState );
+}
+//------------------------------------------------------------------------
+// testing the method toInt64( sal_Int16 radix = 2,8,10,16,36 )
+//------------------------------------------------------------------------
+
+sal_Bool SAL_CALL test_rtl_OUString_toInt64_normal(
+ hTestResult hRtlTestResult )
+{
+ sal_Int64 expValues[kBase36NumsCount];
+ sal_Int32 i;
+
+ for (i = 0; i < kBase36NumsCount; expValues[i] = i, i++);
+
+ sal_Bool res = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kBinaryNumsStr,kBinaryNumsCount,
+ kRadixBinary,expValues,3,NULL,hRtlTestResult ),
+ "kBinaryNumsStr",
+ "toInt64( radix 2 )"
+ );
+
+/* LLA: does not work within wntmsci8.pro
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kBinaryMaxNumsStr,kInt64MaxNumsCount,
+ kRadixBinary,kInt64MaxNums,3,hRtlTestResult ),
+ "kBinaryMaxNumsStr",
+ "toInt64_Boundaries( radix 2 )"
+ );
+*/
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kOctolNumsStr,kOctolNumsCount,
+ kRadixOctol,expValues,3,NULL,hRtlTestResult ),
+ "kOctolNumsStr",
+ "toInt64( radix 8 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kOctolMaxNumsStr,kInt64MaxNumsCount,
+ kRadixOctol,(sal_Int64*)kInt64MaxNums,3,NULL,hRtlTestResult ),
+ "kOctolMaxNumsStr",
+ "toInt64_Boundaries( radix 8 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kDecimalNumsStr,kDecimalNumsCount,
+ kRadixDecimal,expValues,3,NULL,hRtlTestResult ),
+ "kDecimalNumsStr",
+ "toInt64( radix 10 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kDecimalMaxNumsStr,kInt64MaxNumsCount,
+ kRadixDecimal,(sal_Int64*)kInt64MaxNums,3,NULL,hRtlTestResult ),
+ "kDecimalMaxNumsStr",
+ "toInt64_Boundaries( radix 10 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kHexDecimalNumsStr,kHexDecimalNumsCount,
+ kRadixHexdecimal,expValues,3,NULL,hRtlTestResult ),
+ "kHexDecimalNumsStr",
+ "toInt64( radix 16 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kHexDecimalMaxNumsStr,kInt64MaxNumsCount,
+ kRadixHexdecimal,(sal_Int64*)kInt64MaxNums,3,NULL,hRtlTestResult ),
+ "kHexDecimalMaxNumsStr",
+ "toInt64_Boundaries( radix 16 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kBase36NumsStr,kBase36NumsCount,
+ kRadixBase36, expValues,3,NULL,hRtlTestResult ),
+ "kBase36NumsStr",
+ "toInt64( radix 36 )"
+ );
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kBase36MaxNumsStr,kInt64MaxNumsCount,
+ kRadixBase36,(sal_Int64*)kInt64MaxNums,3,NULL,hRtlTestResult ),
+ "kBase36MaxNumsStr",
+ "toInt64_Boundaries( radix 36 )"
+ );
+
+
+
+ const sal_Int16 nSpecCases = 5;
+ static const sal_Char *spString[nSpecCases] =
+ {
+ "-1",
+ "+1",
+ " 1",
+ " -1",
+ "001"
+ };
+
+ sal_Int64 expSpecVal[nSpecCases] =
+ {
+ -1,
+ 1,
+ 1,
+ -1,
+ 1
+ };
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( spString,nSpecCases,
+ kRadixDecimal,expSpecVal,3,NULL,hRtlTestResult ),
+ "special cases",
+ "toInt64( specialcases )"
+ );
+
+ return (res);
+}
+
+sal_Bool SAL_CALL test_rtl_OUString_toInt64_wrongRadix(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OUString str("0",1,kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString);
+
+ sal_Int64 iRes = str.toInt64(-1);
+
+ return (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ iRes == 0,
+ "wrong radix -1",
+ "toInt64( wrong radix -1)"
+ )
+ );
+}
+sal_Bool SAL_CALL test_rtl_OUString_toInt64_defaultParam(
+ hTestResult hRtlTestResult )
+{
+ sal_Int64 expValues[kBase36NumsCount];
+ sal_Int32 i;
+
+ for ( i = 0; i < kBase36NumsCount; i++ )
+ expValues[i] = i;
+
+ sal_Bool res = c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kDecimalNumsStr,kDecimalNumsCount,
+ kRadixDecimal,expValues,2,NULL,hRtlTestResult ),
+ "kBinaryNumsStr",
+ "toInt64( radix 10 )"
+ );
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( kDecimalMaxNumsStr,kInt64MaxNumsCount,
+ kRadixDecimal,(sal_Int64*)kInt64MaxNums,2,NULL,hRtlTestResult ),
+ "kDecimalMaxNumsStr",
+ "toInt64_Boundaries( radix 10 )"
+ );
+ const sal_Int16 nSpecCases = 5;
+ static const sal_Char *spString[nSpecCases] =
+ {
+ "-1",
+ "+1",
+ " 1",
+ " -1",
+ "001"
+ };
+
+ sal_Int64 expSpecVal[nSpecCases] =
+ {
+ -1,
+ 1,
+ 1,
+ -1,
+ 1
+ };
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ test_toData<sal_Int64>( spString,nSpecCases,
+ kRadixDecimal,expSpecVal,2,NULL,hRtlTestResult ),
+ "special cases",
+ "toInt64( specialcases )"
+ );
+
+ return ( res );
+}
+
+//------------------------------------------------------------------------
+// testing the method toInt64()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString_toInt64(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "toInt64");
+ sal_Bool bTState = test_rtl_OUString_toInt64_normal( hRtlTestResult );
+ bTState &= test_rtl_OUString_toInt64_defaultParam (hRtlTestResult );
+ bTState &= test_rtl_OUString_toInt64_wrongRadix( hRtlTestResult );
+ c_rtl_tres_state_end( hRtlTestResult, "toInt64");
+// return ( bTState );
+}
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUString( hTestResult hRtlTestResult )
+{
+
+ c_rtl_tres_state_start(hRtlTestResult, "rtl_OUString" );
+
+ test_rtl_OUString_ctors( hRtlTestResult );
+ test_rtl_OUString_getLength( hRtlTestResult );
+ test_rtl_OUString_equals( hRtlTestResult );
+ test_rtl_OUString_equalsIgnoreAsciiCase( hRtlTestResult );
+ test_rtl_OUString_compareTo( hRtlTestResult );
+ test_rtl_OUString_match( hRtlTestResult );
+ test_rtl_OUString_op_eq( hRtlTestResult );
+ test_rtl_OUString_op_peq( hRtlTestResult );
+ test_rtl_OUString_csuc( hRtlTestResult );
+ test_rtl_OUString_getStr( hRtlTestResult );
+ test_rtl_OUString_reverseCompareTo( hRtlTestResult );
+ test_rtl_OUString_equalsAscii( hRtlTestResult );
+ test_rtl_OUString_equalsAsciiL( hRtlTestResult );
+ test_rtl_OUString_compareToAscii( hRtlTestResult );
+ test_rtl_OUString_valueOf_sal_Bool( hRtlTestResult );
+ test_rtl_OUString_valueOf_sal_Unicode( hRtlTestResult );
+ test_rtl_OUString_valueOf( hRtlTestResult );
+ test_rtl_OUString_createFromAscii( hRtlTestResult );
+ test_rtl_OUString_indexOf( hRtlTestResult );
+// LLA: removed, it is in a new test in rtl/oustring. test_rtl_OUString_lastIndexOf( hRtlTestResult );
+ test_rtl_OUString_concat( hRtlTestResult );
+ test_rtl_OUString_replaceAt( hRtlTestResult );
+ test_rtl_OUString_replace( hRtlTestResult );
+ test_rtl_OUString_toAsciiLowerCase( hRtlTestResult );
+ test_rtl_OUString_toAsciiUpperCase( hRtlTestResult );
+ test_rtl_OUString_trim( hRtlTestResult );
+// LLA: removed, it is in a new test in rtl/oustring. test_rtl_OUString_toDouble( hRtlTestResult );
+// LLA: removed, has compile problems. test_rtl_OUString_toFloat( hRtlTestResult );
+ test_rtl_OUString_toChar( hRtlTestResult );
+ test_rtl_OUString_toBoolean( hRtlTestResult );
+ test_rtl_OUString_toInt32( hRtlTestResult );
+ test_rtl_OUString_toInt64( hRtlTestResult );
+
+ c_rtl_tres_state_end(hRtlTestResult, "rtl_OUString");
+}
+// -----------------------------------------------------------------------------
+void RegisterAdditionalFunctions(FktRegFuncPtr _pFunc)
+{
+ if (_pFunc)
+ {
+ (_pFunc)(&test_rtl_OUString, "");
+ }
+}
diff --git a/sal/qa/rtl_strings/rtl_OUStringBuffer.cxx b/sal/qa/rtl_strings/rtl_OUStringBuffer.cxx
new file mode 100644
index 000000000000..950231d1651c
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_OUStringBuffer.cxx
@@ -0,0 +1,1823 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+// #ifndef _RTL_TRES_H_
+// #include <rtl/tres.h>
+// #endif
+#include <testshl/tresstatewrapper.hxx>
+
+#ifndef _RTL_STRING_HXX_
+ #include <rtl/string.hxx>
+#endif
+
+#ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+#endif
+
+#ifndef _RTL_USTRING_HXX_
+ #include <rtl/ustring.hxx>
+#endif
+
+#ifndef _RTL_USTRBUF_H_
+ #include <rtl/ustrbuf.h>
+#endif
+
+#ifndef _RTL_USTRBUF_HXX
+ #include <rtl/ustrbuf.hxx>
+#endif
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+#ifndef _OSL_THREAD_H_
+ #include <osl/thread.h>
+#endif
+
+#ifndef _RTL_STRING_CONST_H_
+ #include <rtl_String_Const.h>
+#endif
+
+#ifndef _RTL_STRING_UTILS_HXX_
+ #include <rtl_String_Utils.hxx>
+#endif
+
+#include "stdio.h"
+using namespace rtl;
+
+//------------------------------------------------------------------------
+// test classes
+//------------------------------------------------------------------------
+const int MAXBUFLENGTH = 255;
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+static void unused()
+{
+ (void)kBinaryNumsStr;
+ (void)kOctolNumsStr;
+ (void)kDecimalNumsStr;
+ (void)kHexDecimalNumsStr;
+ (void)kBase36NumsStr;
+ (void)inputChar;
+ (void)input1StrDefault;
+ (void)input1StrNormal;
+ (void)input1StrLastDefault;
+ (void)input1StrLastNormal;
+ unused();
+}
+
+//------------------------------------------------------------------------
+// testing constructors
+//------------------------------------------------------------------------
+static sal_Bool test_rtl_OUStringBuffer_ctor_001( hTestResult hRtlTestResult )
+{
+
+ ::rtl::OUStringBuffer aUStrBuf;
+
+ bool b1 =
+ aUStrBuf.getLength() == 0 &&
+ ! *(aUStrBuf.getStr()) && aUStrBuf.getCapacity() == 16;
+
+ ::rtl::OUStringBuffer aUStrBuf2(0);
+
+ bool b2 =
+ aUStrBuf2.getLength() == 0 &&
+ ! *(aUStrBuf2.getStr()) && aUStrBuf2.getCapacity() == /* LLA: !!! */ 0;
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ b1 && b2,
+ "New OUStringBuffer containing no characters",
+ "ctor_001"
+ )
+ );
+}
+
+//------------------------------------------------------------------------
+
+static sal_Bool SAL_CALL test_rtl_OUStringBuffer_ctor_002(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OUStringBuffer aUStrBuftmp( aUStr1 );
+ ::rtl::OUStringBuffer aUStrBuf( aUStrBuftmp );
+ sal_Bool res = cmpustr(aUStrBuftmp.getStr(),aUStrBuf.getStr());
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aUStrBuf.getLength()==aUStrBuftmp.getLength() &&
+ aUStrBuf.getCapacity() == aUStrBuftmp.getCapacity() && res ,
+ "New OUStringBuffer from another OUStringBuffer",
+ "ctor_002"
+ )
+ );
+}
+//------------------------------------------------------------------------
+
+/* static */
+sal_Bool SAL_CALL test_rtl_OUStringBuffer_ctor_003(
+ hTestResult hRtlTestResult )
+{
+ ::rtl::OUStringBuffer aUStrBuf1(kTestStr2Len);
+#ifdef WITH_CORE
+ ::rtl::OUStringBuffer aUStrBuf2(kSInt32Max); //will core dump
+#else
+ ::rtl::OUStringBuffer aUStrBuf2(0);
+#endif
+ ::rtl::OUStringBuffer aUStrBuf3(kNonSInt32Max);
+
+
+ bool b1 =
+ aUStrBuf1.getLength() == 0 &&
+ ! *(aUStrBuf1.getStr()) && aUStrBuf1.getCapacity() == kTestStr2Len ;
+
+ bool b2 =
+#ifdef WITH_CORE
+ aUStrBuf2.getLength() == 0 &&
+ ! *(aUStrBuf2.getStr()) && aUStrBuf2.getCapacity() == kSInt32Max ;
+#else
+ aUStrBuf2.getLength() == 0 &&
+ ! *(aUStrBuf2.getStr()) && aUStrBuf2.getCapacity() == /* LLA: ??? 16 */ 0;
+#endif
+ bool b3 =
+ aUStrBuf3.getLength() == 0 &&
+ ! *(aUStrBuf3.getStr()) && aUStrBuf3.getCapacity() == kNonSInt32Max;
+
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ b1 && b2 && b3,
+ "New OUStringBuffer containing no characters and contain assigned capacity",
+ "ctor_003( will core dump,because the kSInt32Max )"
+ )
+ );
+
+}
+
+//------------------------------------------------------------------------
+
+static sal_Bool SAL_CALL test_rtl_OUStringBuffer_ctor_004(
+ hTestResult hRtlTestResult)
+{
+ ::rtl::OUString aUStrtmp( aUStr1 );
+ ::rtl::OUStringBuffer aUStrBuf( aUStrtmp );
+ sal_Int32 leg = aUStrBuf.getLength();
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aUStrBuf.getStr() == aUStrtmp &&
+ leg == aUStrtmp.pData->length &&
+ aUStrBuf.getCapacity() == leg+16 ,
+ "New OUStringBuffer from OUstring",
+ "ctor_004"
+ )
+ );
+}
+
+static sal_Bool SAL_CALL test_rtl_OUStringBuffer_ctor_005(
+ hTestResult hRtlTestResult)
+{
+ ::rtl::OUStringBuffer aUStrBuftmp( aUStr1 );
+ ::rtl::OUString aUStrtmp = aUStrBuftmp.makeStringAndClear();
+ ::rtl::OUStringBuffer aUStrBuf( aUStrBuftmp );
+ sal_Bool res = cmpustr(aUStrBuftmp.getStr(),aUStrBuf.getStr());
+ sal_Int32 leg = aUStrBuf.getLength();
+ return
+ (
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ aUStrBuf.getLength()==aUStrBuftmp.getLength() &&
+ aUStrBuf.getCapacity() == aUStrBuftmp.getCapacity() &&
+ res && leg == 0,
+ "New OUStringBuffer from another OUStringBuffer after makeClearFromString",
+ "ctor_005"
+ )
+ );
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_ctors(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "ctors");
+ sal_Bool DCState = test_ini_uString();
+ (void)DCState;
+ sal_Bool bTSState = test_rtl_OUStringBuffer_ctor_001( hRtlTestResult );
+ bTSState &= test_rtl_OUStringBuffer_ctor_002( hRtlTestResult);
+ bTSState &= test_rtl_OUStringBuffer_ctor_003( hRtlTestResult);
+ bTSState &= test_rtl_OUStringBuffer_ctor_004( hRtlTestResult);
+ bTSState &= test_rtl_OUStringBuffer_ctor_005( hRtlTestResult);
+
+ c_rtl_tres_state_end( hRtlTestResult, "ctors");
+// return( bTSState );
+}
+
+//------------------------------------------------------------------------
+// testing the method makeStringAndClear()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_makeStringAndClear(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "makeStringAndClear");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUStringBuffer* input1;
+
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ OUString arrOUS[6]={
+ OUString( aUStr1 ),
+ OUString( aUStr14 ),
+ OUString( aUStr25 ),
+ OUString( aUStr27 ),
+ OUString( aUStr29 ),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString)
+ };
+
+ TestCase arrTestCase[]={
+
+ {"two empty strings(def. constructor)", new OUString(),
+ new OUStringBuffer()},
+ {"two empty strings(with a argu)", new OUString(),
+ new OUStringBuffer(26)},
+ {"normal string", new OUString(arrOUS[0]),
+ new OUStringBuffer(arrOUS[0])},
+ {"string with space ", new OUString(arrOUS[1]),
+ new OUStringBuffer(arrOUS[1])},
+ {"empty string", new OUString(arrOUS[2]),
+ new OUStringBuffer(arrOUS[2])},
+ {"string with a character", new OUString(arrOUS[3]),
+ new OUStringBuffer(arrOUS[3])},
+ {"string with special characters", new OUString(arrOUS[4]),
+ new OUStringBuffer(arrOUS[4])},
+ {"string only with (\0)", new OUString(arrOUS[5]),
+ new OUStringBuffer(arrOUS[5])}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->makeStringAndClear() ==
+ *( arrTestCase[i].expVal ));
+ lastRes = lastRes && ( arrTestCase[i].input1->getCapacity() == 0 );
+ lastRes = lastRes && ( *(arrTestCase[i].input1->getStr()) == '\0' );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "makeStringAndClear", i )
+ );
+
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "makeStringAndClear");
+// return (res);
+}
+//------------------------------------------------------------------------
+// testing the method getLength
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_getLength(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "getLength");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[6]={OUString( aUStr1 ),
+ OUString( "1",1,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString(),
+ OUString( "",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr2 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OUStringBuffer* input;
+ ~TestCase() { delete input;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"length of ascii string", kTestStr1Len,
+ new OUStringBuffer(arrOUS[0]) },
+ {"length of ascci string of size 1", 1,
+ new OUStringBuffer(arrOUS[1])},
+ {"length of empty string", 0,
+ new OUStringBuffer(arrOUS[2])},
+ {"length of empty string (empty ascii string arg)",0,
+ new OUStringBuffer(arrOUS[3])},
+ {"length of empty string (string arg = '\\0')", 0,
+ new OUStringBuffer(arrOUS[4])},
+ {"length(>16) of ascii string", kTestStr2Len,
+ new OUStringBuffer(arrOUS[5]) },
+ {"length of empty string (default constructor)", 0,
+ new OUStringBuffer()},
+ {"length of empty string (with capacity)", 0,
+ new OUStringBuffer(26)}
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 length = arrTestCase[i].input->getLength();
+ sal_Bool lastRes = (length == arrTestCase[i].expVal);
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "getLength", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "getLength");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method getCapacity()
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_getCapacity(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "getCapacity");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[6]={OUString( aUStr1 ),
+ OUString( "1",1,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString(),
+ OUString( "",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr2 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OUStringBuffer* input;
+ ~TestCase() { delete input;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"capacity of ascii string", kTestStr1Len+16,
+ new OUStringBuffer(arrOUS[0]) },
+ {"capacity of ascci string of size 1", 1+16,
+ new OUStringBuffer(arrOUS[1]) },
+ {"capacity of empty string", 0+16,
+ new OUStringBuffer(arrOUS[2]) },
+ {"capacity of empty string (empty ascii string arg)",0+16,
+ new OUStringBuffer(arrOUS[3]) },
+ {"capacity of empty string (string arg = '\\0')", 0+16,
+ new OUStringBuffer(arrOUS[4]) },
+ {"capacity(>16) of ascii string", kTestStr2Len+16,
+ new OUStringBuffer(arrOUS[5]) },
+ {"capacity of empty string (default constructor)", 16,
+ new OUStringBuffer() },
+#ifdef WITH_CORE
+ {"capacity of empty string (with capacity 2147483647)(code will core dump)", kSInt32Max,
+ new OUStringBuffer(kSInt32Max) },// will core dump
+#endif
+ {"capacity of empty string (with capacity -2147483648)", kNonSInt32Max,
+ new OUStringBuffer(kNonSInt32Max) },
+ {"capacity of empty string (with capacity 16)", 16,
+ new OUStringBuffer(16) },
+ {"capacity of empty string (with capacity 6)", 6,
+ new OUStringBuffer(6) },
+ {"capacity of empty string (with capacity 0)", 0,
+ new OUStringBuffer(0) },
+ {"capacity of empty string (with capacity -2)", -2,
+ new OUStringBuffer(-2) }
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Int32 length = arrTestCase[i].input->getCapacity();
+ sal_Bool lastRes = (length == arrTestCase[i].expVal);
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "getCapacity", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "getCapacity");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method ensureCapacity(sal_Int32 minimumCapacity)
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_ensureCapacity(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "ensureCapacity");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal;
+ OUStringBuffer* input1;
+ sal_Int32 input2;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"capacity equal to 16, minimum is 5 ", 16,
+ new OUStringBuffer(), 5 },
+ {"capacity equal to 16, minimum is -5", 16,
+ new OUStringBuffer(), -5},
+ {"capacity equal to 16, minimum is 0", 16,
+ new OUStringBuffer(), 0},
+ {"capacity equal to 16, minimum is 20", 20, //the testcase is based on comments
+ new OUStringBuffer(), 20},
+ {"capacity equal to 16, minimum is 50", 50,
+ new OUStringBuffer(), 50},
+ {"capacity equal to 6, minimum is 20", 20,
+ new OUStringBuffer(6), 20 },
+ {"capacity equal to 6, minimum is 2", 6,
+ new OUStringBuffer(6), 2},
+ {"capacity equal to 6, minimum is -6", 6,
+ new OUStringBuffer(6), -6},
+ {"capacity equal to 6, minimum is -6", 10, //the testcase is based on comments
+ new OUStringBuffer(6), 10},
+ {"capacity equal to 0, minimum is 6", 6,
+ new OUStringBuffer(0), 6},
+ {"capacity equal to 0, minimum is 1", 2, //the testcase is based on comments
+ new OUStringBuffer(0), 1},
+ /*
+ {"capacity equal to 0, minimum is -1", 0,
+ new OUStringBuffer(0), -1},
+ */
+#ifdef WITH_CORE
+ {"capacity equal to 2147483647, minimum is 65535", kSInt32Max,//will core dump
+ new OUStringBuffer(kSInt32Max), 65535},
+ {"capacity equal to 2147483647, minimum is 2147483647", kSInt32Max,//will core dump
+ new OUStringBuffer(kSInt32Max), kSInt32Max},
+ {"capacity equal to 2147483647, minimum is -1", kSInt32Max,//will core dump
+ new OUStringBuffer(kSInt32Max), -1},
+ {"capacity equal to 2147483647, minimum is 0", kSInt32Max,//will core dump
+ new OUStringBuffer(kSInt32Max), 0},
+ {"capacity equal to 2147483647, minimum is -2147483648", kSInt32Max,//will core dump
+ new OUStringBuffer(kSInt32Max), kNonSInt32Max},
+#endif
+ {"capacity equal to -2147483648, minimum is 65535", 65535,
+ new OUStringBuffer(kNonSInt32Max), 65535},
+#ifdef WITH_CORE
+ {"capacity equal to -2147483648, minimum is 2147483647", 2147483647,//will core dump
+ new OUStringBuffer(kNonSInt32Max), 2147483647},
+#endif
+ {"capacity equal to -2147483648, minimum is -1", 2,
+ new OUStringBuffer(kNonSInt32Max), -1},
+ {"capacity equal to -2147483648, minimum is 0", 2,
+ new OUStringBuffer(kNonSInt32Max), 0},
+ {"capacity equal to -2147483648, minimum is -2147483648", kNonSInt32Max,
+ new OUStringBuffer(kNonSInt32Max), kNonSInt32Max}
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ arrTestCase[i].input1->ensureCapacity(arrTestCase[i].input2);
+ sal_Int32 length = arrTestCase[i].input1->getCapacity();
+ sal_Bool lastRes = (length == arrTestCase[i].expVal);
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "ensureCapacity", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "ensureCapacity");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method setLength(sal_Int32 newLength)
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_setLength(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "setLength");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[6]={OUString( aUStr1 ),
+ OUString( aUStr27),
+ OUString(),
+ OUString( "",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr2 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Int32 expVal1;
+ OUString* expVal2;
+ sal_Int32 expVal3;
+ OUStringBuffer* input1;
+ sal_Int32 input2;
+ ~TestCase() { delete input1; delete expVal2;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"newLength more than the capacity of OUStringBuffer(aUStr1)",
+ 50, new OUString(aUStr1), 50,
+ new OUStringBuffer(arrOUS[0]), 50 },
+ {"newLength more than the length of OUStringBuffer(aUStr1)",
+ kTestStr13Len, new OUString(aUStr1), 32,
+ new OUStringBuffer(arrOUS[0]), kTestStr13Len },
+ {"newLength equal to the length of OUStringBuffer(aUStr1)",
+ kTestStr1Len, new OUString(aUStr1), 32,
+ new OUStringBuffer(arrOUS[0]), kTestStr1Len },
+ {"newLength less than the length of OUStringBuffer(aUStr1)",
+ kTestStr7Len, new OUString(aUStr7), 32,
+ new OUStringBuffer(arrOUS[0]), kTestStr7Len},
+ {"newLength equal to 0",
+ 0, new OUString(), 32,
+ new OUStringBuffer(arrOUS[0]), 0},
+ {"newLength more than the capacity of OUStringBuffer(1)",
+ 25, new OUString(arrOUS[1]), 25,
+ new OUStringBuffer(arrOUS[1]), 25},
+ {"newLength more than the length of OUStringBuffer(1)",
+ 5, new OUString(arrOUS[1]), 17,
+ new OUStringBuffer(arrOUS[1]), 5},
+ {"newLength equal to the length of OUStringBuffer(1)",
+ kTestStr27Len, new OUString(arrOUS[1]), 17,
+ new OUStringBuffer(arrOUS[1]), kTestStr27Len},
+ {"newLength less than the length of OUStringBuffer(1)",
+ 0, new OUString(), 17,
+ new OUStringBuffer(arrOUS[1]), 0},
+ {"newLength more than the capacity of OUStringBuffer()",
+ 20, new OUString(), 20,
+ new OUStringBuffer(arrOUS[2]), 20},
+ {"newLength more than the length of OUStringBuffer()",
+ 3, new OUString(), 16,
+ new OUStringBuffer(arrOUS[2]), 3},
+ {"newLength less than the length of OUStringBuffer()",
+ 0, new OUString(), 16,
+ new OUStringBuffer(arrOUS[2]), 0},
+ {"newLength more than the capacity of OUStringBuffer("")",
+ 20, new OUString(), 20,
+ new OUStringBuffer(arrOUS[3]), 20},
+ {"newLength more than the length of OUStringBuffer("")",
+ 5, new OUString(), 16,
+ new OUStringBuffer(arrOUS[3]), 5},
+ {"newLength less than the length of OUStringBuffer("")",
+ 0, new OUString(), 16,
+ new OUStringBuffer(arrOUS[3]), 0},
+ {"newLength more than the length of OUStringBuffer(\0)",
+ 20, new OUString(), 20,
+ new OUStringBuffer(arrOUS[4]), 20},
+ {"newLength more than the length of OUStringBuffer(\0)",
+ 5, new OUString(), 16,
+ new OUStringBuffer(arrOUS[4]), 5},
+ {"newLength less than the length of OUStringBuffer(\0)",
+ 0, new OUString(), 16,
+ new OUStringBuffer(arrOUS[4]), 0},
+ {"newLength more than the capacity of OUStringBuffer(aUStr2)",
+ 50, new OUString(aUStr2), 66,
+ new OUStringBuffer(arrOUS[5]), 50,},
+ {"newLength more than the length of OUStringBuffer(aUStr2)",
+ 40, new OUString(aUStr2), 48,
+ new OUStringBuffer(arrOUS[5]), 40,},
+ {"newLength equal to the length of OUStringBuffer(aUStr2)",
+ kTestStr2Len, new OUString(aUStr2), 48,
+ new OUStringBuffer(arrOUS[5]), kTestStr2Len,},
+ {"newLength less than the length of OUStringBuffer(aUStr2)",
+ kTestStr7Len, new OUString(aUStr7), 48,
+ new OUStringBuffer(arrOUS[5]), kTestStr7Len},
+ {"newLength equal to 0",
+ 0, new OUString(), 48,
+ new OUStringBuffer(arrOUS[5]), 0}
+
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ arrTestCase[i].input1->setLength(arrTestCase[i].input2);
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->getStr() == *(arrTestCase[i].expVal2) &&
+ arrTestCase[i].input1->getLength() == arrTestCase[i].expVal1 &&
+ arrTestCase[i].input1->getCapacity() == arrTestCase[i].expVal3 );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "setLength", i )
+
+ );
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "setLength");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method charAt( sal_Int32 index )
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_charAt(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "charAt");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[4]={OUString( aUStr1 ), // "Sun Microsystems";
+ OUString( aUStr27), // "s";
+ OUString( aUStr28), // "\50\3\5\7\11\13\15\17sun";
+ OUString( )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ sal_Unicode expVal;
+ OUStringBuffer* input1;
+ sal_Int32 input2;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"return the first character of OUStringBuffer(aUStr1)",
+ 83, new OUStringBuffer(arrOUS[0]), 0 },
+ {"return the middle character of OUStringBuffer(aUStr1)",
+ 32, new OUStringBuffer(arrOUS[0]), 3 },
+ {"return the last character of OUStringBuffer(aUStr1)",
+ 115, new OUStringBuffer(arrOUS[0]), 15 },
+ {"return the only character of OUStringBuffer(aUStr27)",
+ 115, new OUStringBuffer(arrOUS[1]), 0},
+ {"return the first of OUStringBuffer(aUStr28) with special character",
+ 40, new OUStringBuffer(arrOUS[2]), 0},
+ /*
+{"return the mid of OUStringBuffer(aUStr28) with special character",
+ 11, new OUStringBuffer(arrOUS[2]), 5},
+*/
+/*
+ {"invalid character of OUStringBuffer()",
+ 0, new OUStringBuffer(arrOUS[3]), 0},
+*/
+/*
+ {"invalid character of OUStringBuffer()",
+ 0, new OUStringBuffer(arrOUS[3]), -2}
+*/
+
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->charAt(arrTestCase[i].input2) ==
+ arrTestCase[i].expVal );
+ // LLA: last case removed, due to the fact of complexity of the test code :-(
+ // LLA: if(i<=7)
+ // LLA: {
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "charAt", i )
+
+ );
+ // LLA: }
+ // LLA: else
+ // LLA: {
+ // LLA: c_rtl_tres_state
+ // LLA: (
+ // LLA: hRtlTestResult,
+ // LLA: sal_True,
+ // LLA: arrTestCase[i].comments,
+ // LLA: createName( pMeth, "charAt", i )
+ // LLA:
+ // LLA: );
+ // LLA: }
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "charAt");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the operator const sal_Unicode * (csuc for short)
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_csuc(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "csuc");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ const sal_Unicode tmpUC=0x0;
+ rtl_uString* tmpUstring = NULL;
+ const sal_Char *tmpStr=kTestStr1;
+ sal_Int32 tmpLen=(sal_Int32) kTestStr1Len;
+ //sal_Int32 cmpLen = 0;
+ OUString tempString(aUStr1);
+
+ rtl_string2UString( &tmpUstring, tmpStr, tmpLen,
+ osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(tmpUstring != NULL);
+
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Unicode* expVal;
+ sal_Int32 cmpLen;
+ OUStringBuffer* input1;
+ ~TestCase() { delete input1; }
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"test normal ustring",(*tmpUstring).buffer,kTestStr1Len,
+ new OUStringBuffer(tempString)},
+ {"test empty ustring",&tmpUC, 1, new OUStringBuffer()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ const sal_Unicode* pstr = *arrTestCase[i].input1;
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ cmpustr( pstr, arrTestCase[i].expVal, arrTestCase[i].cmpLen ),
+ arrTestCase[i].comments,
+ createName( pMeth, "const sal_Unicode*", i )
+ );
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "csuc");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method const sal_Unicode * getStr()
+//------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_getStr(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "getStr");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ const sal_Unicode tmpUC=0x0;
+ rtl_uString* tmpUstring = NULL;
+ const sal_Char *tmpStr=kTestStr1;
+ sal_Int32 tmpLen=(sal_Int32) kTestStr1Len;
+ //sal_Int32 cmpLen = 0;
+ OUString tempString(aUStr1);
+
+ rtl_string2UString( &tmpUstring, tmpStr, tmpLen,
+ osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS );
+ OSL_ASSERT(tmpUstring != NULL);
+
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ const sal_Unicode* expVal;
+ sal_Int32 cmpLen;
+ OUStringBuffer* input1;
+ ~TestCase() { delete input1;}
+ } TestCase;
+
+ TestCase arrTestCase[] =
+ {
+ {"test normal ustring",(*tmpUstring).buffer,kTestStr1Len,
+ new OUStringBuffer(tempString)},
+ {"test empty ustring",&tmpUC, 1, new OUStringBuffer()}
+ };
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+ for(i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ const sal_Unicode* pstr = arrTestCase[i].input1->getStr();
+
+ res &= c_rtl_tres_state
+ (
+ hRtlTestResult,
+ cmpustr( pstr, arrTestCase[i].expVal, arrTestCase[i].cmpLen ),
+ arrTestCase[i].comments,
+ createName( pMeth, "getStr", i )
+ );
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "getStr");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method setCharAt(sal_Int32 index, sal_Unicode ch)
+//------------------------------------------------------------------------
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_setCharAt(
+ hTestResult hRtlTestResult)
+{
+ c_rtl_tres_state_start( hRtlTestResult, "setCharAt");
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[4]={OUString( aUStr1 ),
+ OUString( aUStr27),
+ OUString( aUStr28),
+ OUString( )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUStringBuffer* input1;
+ sal_Int32 input2;
+ sal_Unicode input3;
+ ~TestCase() { delete input1; delete expVal; }
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"set the first character of OUStringBuffer(aUStr1) with s",
+ new OUString(aUStr31),
+ new OUStringBuffer(arrOUS[0]), 0, 115 },
+ {"set the middle character of OUStringBuffer(aUStr1) with m",
+ new OUString(aUStr3),
+ new OUStringBuffer(arrOUS[0]), 4, 109 },
+ {"set the last character of OUStringBuffer(aUStr1) with ' '",
+ new OUString(aUStr32),
+ new OUStringBuffer(arrOUS[0]), 15, 32 },
+ {"set the only character of OUStringBuffer(aUStr27) with ' '",
+ new OUString(aUStr33),
+ new OUStringBuffer(arrOUS[1]), 0, 32},
+ {"set the only of OUStringBuffer(aUStr28) with special character",
+ new OUString(aUStr34),
+ new OUStringBuffer(arrOUS[2]), 1, 5},
+/*
+ {"set the only of OUStringBuffer(aUStr28) with special character",
+ new OUString(aUStr35),
+ new OUStringBuffer(arrOUS[2]), 1, -5}
+*/
+#ifdef WITH_CORE
+ ,{"invalid character of OUStringBuffer()",
+ 0,
+ new OUStringBuffer(arrOUS[3]), 0, 5},
+ {"invalid character of OUStringBuffer()",
+ 0,
+ new OUStringBuffer(arrOUS[3]), -2, 5},
+ {"invalid character of OUStringBuffer()",
+ 0,
+ new OUStringBuffer(arrOUS[3]), 3, 5}
+#endif
+
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ sal_Bool lastRes =
+ ( (arrTestCase[i].input1->setCharAt(arrTestCase[i].input2,
+ arrTestCase[i].input3)).getStr() == *(arrTestCase[i].expVal) );
+ if(i<=4)
+ {
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "setCharAt", i )
+
+ );
+ }
+ else
+ {
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ sal_True,
+ arrTestCase[i].comments,
+ createName( pMeth, "setCharAt", i )
+
+ );
+ }
+ res &= lastRes;
+ }
+ c_rtl_tres_state_end( hRtlTestResult, "setCharAt");
+// return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method append(const OUString &str)
+//------------------------------------------------------------------------
+
+sal_Bool SAL_CALL test_rtl_OUStringBuffer_append_001(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[5]={OUString( aUStr7 ),
+ OUString(),
+ OUString( aUStr25 ),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr28 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUStringBuffer* input1;
+ OUString* input2;
+
+ ~TestCase() { delete input1; delete input2; delete expVal; }
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"Appends the string(length less than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[0]), new OUString(aUStr8) },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[0]), new OUString(aUStr36) },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr37),
+ new OUStringBuffer(arrOUS[0]), new OUString(aUStr23) },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[0]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[0]), new OUString()},
+ {"Appends the string(length less than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[1]), new OUString(aUStr7)},
+ {"Appends the string(length more than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[1]), new OUString(aUStr2)},
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[1]), new OUString(aUStr1) },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[1]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[1]), new OUString()},
+ {"Appends the string(length less than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[2]), new OUString(aUStr7)},
+ {"Appends the string(length more than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[2]), new OUString(aUStr2)},
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[2]), new OUString(aUStr1) },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[2]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[2]), new OUString()},
+ {"Appends the string(length less than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[3]), new OUString(aUStr7)},
+ {"Appends the string(length more than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[3]), new OUString(aUStr2)},
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[3]), new OUString(aUStr1) },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[3]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[3]), new OUString()},
+ {"Appends the string(length less than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr29),
+ new OUStringBuffer(arrOUS[4]), new OUString(aUStr38)},
+ {"Appends the string(length more than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr39),
+ new OUStringBuffer(arrOUS[4]), new OUString(aUStr17)},
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr40),
+ new OUStringBuffer(arrOUS[4]), new OUString(aUStr31) },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ new OUString(aUStr28),
+ new OUStringBuffer(arrOUS[4]), new OUString()}
+#ifdef WITH_CORE
+ ,{"Appends the string(length equal to 0) to the string buffer(with INT_MAX) ",
+ new OUString(),
+ new OUStringBuffer(kSInt32Max), new OUString()}
+#endif
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ arrTestCase[i].input1->append( *(arrTestCase[i].input2) );
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->getStr()== *(arrTestCase[i].expVal) &&
+ arrTestCase[i].input1->getLength() == arrTestCase[i].expVal->getLength() );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "append(const OUString &str)_001", i )
+
+ );
+
+ res &= lastRes;
+ }
+
+ return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method append( const sal_Unicode * str )
+//------------------------------------------------------------------------
+
+sal_Bool SAL_CALL test_rtl_OUStringBuffer_append_002(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[5]={OUString( aUStr7 ),
+ OUString(),
+ OUString( aUStr25 ),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr28 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUStringBuffer* input1;
+ sal_Unicode* input2;
+
+ ~TestCase() { delete input1; delete expVal; }
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"Appends the string(length less than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[0]), aUStr8 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[0]), aUStr36 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr37),
+ new OUStringBuffer(arrOUS[0]), aUStr23 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[0]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[0]), aUStr25 },
+ {"Appends the string(length less than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[1]), aUStr7 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[1]), aUStr2 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[1]), aUStr1 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[1]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[1]), aUStr25 },
+ {"Appends the string(length less than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[2]), aUStr7 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[2]), aUStr2 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[2]), aUStr1 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[2]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[2]), aUStr25 },
+ {"Appends the string(length less than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[3]), aUStr7 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[3]), aUStr2 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[3]), aUStr1 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[3]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[3]), aUStr25 },
+ {"Appends the string(length less than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr29),
+ new OUStringBuffer(arrOUS[4]), aUStr38 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr39),
+ new OUStringBuffer(arrOUS[4]), aUStr17 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr40),
+ new OUStringBuffer(arrOUS[4]), aUStr31 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ new OUString(aUStr28),
+ new OUStringBuffer(arrOUS[4]), aUStr25 }
+#ifdef WITH_CORE
+ ,{"Appends the string(length equal to 0) to the string buffer(with INT_MAX) ",
+ new OUString(),
+ new OUStringBuffer(kSInt32Max), aUStr25 }
+#endif
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ arrTestCase[i].input1->append( arrTestCase[i].input2 );
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->getStr()== *(arrTestCase[i].expVal) &&
+ arrTestCase[i].input1->getLength() == arrTestCase[i].expVal->getLength() );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "append( const sal_Unicode * str )_002", i )
+
+ );
+
+ res &= lastRes;
+ }
+
+ return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method append( const sal_Unicode * str, sal_Int32 len)
+//------------------------------------------------------------------------
+
+sal_Bool SAL_CALL test_rtl_OUStringBuffer_append_003(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[5]={OUString( aUStr7 ),
+ OUString(),
+ OUString( aUStr25 ),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr28 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUStringBuffer* input1;
+ sal_Unicode* input2;
+ sal_Int32 input3;
+
+ ~TestCase() { delete input1; delete expVal; }
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"Appends the string(length less than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[0]), aUStr36, 12 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[0]), aUStr36, 28 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr37),
+ new OUStringBuffer(arrOUS[0]), aUStr23, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[0]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[0]), aUStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[0]",
+ new OUString(aUStr41),
+ new OUStringBuffer(arrOUS[0]), aUStr2, -1 },
+ */
+ {"Appends the string(length less than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[1]), aUStr2, 4 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[1]), aUStr2, 32 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[1]), aUStr2, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[1]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[1]), aUStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[1]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[1]), aUStr2, -1 },
+ */
+ {"Appends the string(length less than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[2]), aUStr2, 4 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[2]), aUStr2, 32 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[2]), aUStr2, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[2]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[2]), aUStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[2]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[2]), aUStr2, -1 },
+ */
+ {"Appends the string(length less than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[3]), aUStr2, 4 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[3]), aUStr2, 32 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[3]), aUStr2, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[3]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[3]), aUStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[3]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[3]), aUStr2, -1 },
+ */
+ {"Appends the string(length less than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr29),
+ new OUStringBuffer(arrOUS[4]), aUStr38, 7 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr39),
+ new OUStringBuffer(arrOUS[4]), aUStr17, 22 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr40),
+ new OUStringBuffer(arrOUS[4]), aUStr31, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ new OUString(aUStr28),
+ new OUStringBuffer(arrOUS[4]), aUStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[4]",
+ new OUString(aUStr42),
+ new OUStringBuffer(arrOUS[4]), aUStr2, -1 }
+ */
+#ifdef WITH_CORE
+ ,{"Appends the string(length equal to 0) to the string buffer(with INT_MAX) ",
+ new OUString(),
+ new OUStringBuffer(kSInt32Max), aUStr25 }
+#endif
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ arrTestCase[i].input1->append(
+ arrTestCase[i].input2, arrTestCase[i].input3);
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->getStr()== *(arrTestCase[i].expVal) &&
+ arrTestCase[i].input1->getLength() == arrTestCase[i].expVal->getLength() );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "append( const sal_Unicode * str, sal_Int32 len)_003", i )
+
+ );
+
+ res &= lastRes;
+ }
+
+ return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method append(sal_Bool b)
+//------------------------------------------------------------------------
+
+sal_Bool SAL_CALL test_rtl_OUStringBuffer_append_004(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[5]={OUString( aUStr7 ),
+ OUString(),
+ OUString( aUStr25 ),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr28 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUStringBuffer* input1;
+ sal_Bool input2;
+
+ ~TestCase() { delete input1; delete expVal; }
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"Appends the sal_Bool(sal_True) to the string buffer arrOUS[0]",
+ new OUString(aUStr45),
+ new OUStringBuffer(arrOUS[0]), sal_True },
+ {"Appends the sal_Bool(sal_False) to the string buffer arrOUS[0]",
+ new OUString(aUStr46),
+ new OUStringBuffer(arrOUS[0]), sal_False },
+ {"Appends the sal_Bool(sal_True) to the string buffer arrOUS[1]",
+ new OUString(aUStr47),
+ new OUStringBuffer(arrOUS[1]), sal_True },
+ {"Appends the sal_Bool(sal_False) to the string buffer arrOUS[1]",
+ new OUString(aUStr48),
+ new OUStringBuffer(arrOUS[1]), sal_False },
+ {"Appends the sal_Bool(sal_True) to the string buffer arrOUS[2]",
+ new OUString(aUStr47),
+ new OUStringBuffer(arrOUS[2]), sal_True },
+ {"Appends the sal_Bool(sal_False) to the string buffer arrOUS[2]",
+ new OUString(aUStr48),
+ new OUStringBuffer(arrOUS[2]), sal_False },
+ {"Appends the sal_Bool(sal_True) to the string buffer arrOUS[3]",
+ new OUString(aUStr47),
+ new OUStringBuffer(arrOUS[3]), sal_True },
+ {"Appends the sal_Bool(sal_False) to the string buffer arrOUS[3]",
+ new OUString(aUStr48),
+ new OUStringBuffer(arrOUS[3]), sal_False },
+ {"Appends the sal_Bool(sal_True) to the string buffer arrOUS[4]",
+ new OUString(aUStr49),
+ new OUStringBuffer(arrOUS[4]), sal_True },
+ {"Appends the sal_Bool(sal_False) to the string buffer arrOUS[4]",
+ new OUString(aUStr50),
+ new OUStringBuffer(arrOUS[4]), sal_False }
+#ifdef WITH_CORE
+ ,{"Appends the sal_Bool(sal_True) to the string buffer(with INT_MAX) ",
+ new OUString(aUStr47),
+ new OUStringBuffer(kSInt32Max), sal_True },
+ {"Appends the sal_Bool(sal_False) to the string buffer(with INT_MAX) ",
+ new OUString(aUStr48),
+ new OUStringBuffer(kSInt32Max), sal_False }
+#endif
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ arrTestCase[i].input1->append(
+ arrTestCase[i].input2 );
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->getStr()== *(arrTestCase[i].expVal) &&
+ arrTestCase[i].input1->getLength() == arrTestCase[i].expVal->getLength() );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "append( sal_Bool b)_004", i )
+
+ );
+
+ res &= lastRes;
+ }
+
+ return ( res );
+}
+
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_appends(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "appends");
+ sal_Bool bTSState = test_rtl_OUStringBuffer_append_001( hRtlTestResult );
+ bTSState &= test_rtl_OUStringBuffer_append_002( hRtlTestResult);
+ bTSState &= test_rtl_OUStringBuffer_append_003( hRtlTestResult);
+ bTSState &= test_rtl_OUStringBuffer_append_004( hRtlTestResult);
+
+ c_rtl_tres_state_end( hRtlTestResult, "appends");
+// return( bTSState );
+}
+//------------------------------------------------------------------------
+// testing the method appendAscii( const sal_Char * str )
+//------------------------------------------------------------------------
+
+sal_Bool SAL_CALL test_rtl_OUStringBuffer_appendAscii_001(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[5]={OUString( aUStr7 ),
+ OUString(),
+ OUString( aUStr25 ),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr28 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUStringBuffer* input1;
+ const sal_Char* input2;
+
+ ~TestCase() { delete input1; delete expVal; }
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"Appends the string(length less than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[0]), kTestStr8 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[0]), kTestStr36 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr37),
+ new OUStringBuffer(arrOUS[0]), kTestStr23 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[0]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[0]), kTestStr25 },
+ {"Appends the string(length less than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[1]), kTestStr7 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[1]), kTestStr2 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[1]), kTestStr1 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[1]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[1]), kTestStr25 },
+ {"Appends the string(length less than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[2]), kTestStr7 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[2]), kTestStr2 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[2]), kTestStr1 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[2]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[2]), kTestStr25 },
+ {"Appends the string(length less than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[3]), kTestStr7 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[3]), kTestStr2 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[3]), kTestStr1 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[3]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[3]), kTestStr25 },
+ {"Appends the string(length less than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr29),
+ new OUStringBuffer(arrOUS[4]), kTestStr38 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr39),
+ new OUStringBuffer(arrOUS[4]), kTestStr17 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr40),
+ new OUStringBuffer(arrOUS[4]), kTestStr31 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ new OUString(aUStr28),
+ new OUStringBuffer(arrOUS[4]), kTestStr25 }
+ /*{"Appends the string(with special characters) to the string buffer arrOUS[4]",
+ new OUString(aUStr43),
+ new OUStringBuffer(arrOUS[4]), kTestStr44 }*/
+#ifdef WITH_CORE
+ ,{"Appends the string(length equal to 0) to the string buffer(with INT_MAX) ",
+ new OUString(),
+ new OUStringBuffer(kSInt32Max), kTestStr25 }
+#endif
+
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ arrTestCase[i].input1->appendAscii( arrTestCase[i].input2 );
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->getStr()== *(arrTestCase[i].expVal) &&
+ arrTestCase[i].input1->getLength() == arrTestCase[i].expVal->getLength() );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "appendAscii_001", i )
+ );
+
+ res &= lastRes;
+ }
+ return ( res );
+}
+//------------------------------------------------------------------------
+// testing the method appendAscii( const sal_Char * str, sal_Int32 len)
+//------------------------------------------------------------------------
+
+sal_Bool SAL_CALL test_rtl_OUStringBuffer_appendAscii_002(
+ hTestResult hRtlTestResult)
+{
+ sal_Char methName[MAXBUFLENGTH];
+ sal_Char* pMeth = methName;
+
+ OUString arrOUS[5]={OUString( aUStr7 ),
+ OUString(),
+ OUString( aUStr25 ),
+ OUString( "\0",0,
+ kEncodingRTLTextUSASCII,
+ kConvertFlagsOStringToOUString),
+ OUString( aUStr28 )};
+
+ typedef struct TestCase
+ {
+ sal_Char* comments;
+ OUString* expVal;
+ OUStringBuffer* input1;
+ const sal_Char* input2;
+ sal_Int32 input3;
+
+ ~TestCase() { delete input1; delete expVal; }
+ } TestCase;
+
+ TestCase arrTestCase[]={
+
+ {"Appends the string(length less than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[0]), kTestStr36, 12 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[0]), kTestStr36, 28 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[0]",
+ new OUString(aUStr37),
+ new OUStringBuffer(arrOUS[0]), kTestStr23, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[0]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[0]), kTestStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[0]",
+ new OUString(aUStr41),
+ new OUStringBuffer(arrOUS[0]), kTestStr2, -1 },
+ */
+ {"Appends the string(length less than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[1]), kTestStr2, 4 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[1]), kTestStr2, 32 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[1]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[1]), kTestStr2, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[1]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[1]), kTestStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[1]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[1]), kTestStr2, -1 },
+ */
+ {"Appends the string(length less than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[2]), kTestStr2, 4 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[2]), kTestStr2, 32 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[2]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[2]), kTestStr2, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[2]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[2]), kTestStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[2]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[2]), kTestStr2, -1 },
+ */
+ {"Appends the string(length less than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr7),
+ new OUStringBuffer(arrOUS[3]), kTestStr2, 4 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr2),
+ new OUStringBuffer(arrOUS[3]), kTestStr2, 32 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[3]",
+ new OUString(aUStr1),
+ new OUStringBuffer(arrOUS[3]), kTestStr2, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[3]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[3]), kTestStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[3]",
+ new OUString(),
+ new OUStringBuffer(arrOUS[3]), kTestStr2, -1 },
+ */
+ {"Appends the string(length less than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr29),
+ new OUStringBuffer(arrOUS[4]), kTestStr38, 7 },
+ {"Appends the string(length more than 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr39),
+ new OUStringBuffer(arrOUS[4]), kTestStr17, 22 },
+ {"Appends the string(length equal to 16) to the string buffer arrOUS[4]",
+ new OUString(aUStr40),
+ new OUStringBuffer(arrOUS[4]), kTestStr31, 16 },
+ {"Appends the string(length equal to 0) to the string buffer arrOUS[4]",
+ new OUString(aUStr28),
+ new OUStringBuffer(arrOUS[4]), kTestStr2, 0 },
+ /* LLA: input3 must null < 0
+ {"Appends the string(length less than 0) to the string buffer arrOUS[4]",
+ new OUString(aUStr42),
+ new OUStringBuffer(arrOUS[4]), kTestStr2, -1 }
+ */
+#ifdef WITH_CORE
+ ,{"Appends the string(length equal to 0) to the string buffer(with INT_MAX) ",
+ new OUString(),
+ new OUStringBuffer(kSInt32Max), kTestStr25 }
+#endif
+ };
+
+
+ sal_Bool res = sal_True;
+ sal_uInt32 i;
+
+ for (i = 0; i < (sizeof (arrTestCase))/(sizeof (TestCase)); i++)
+ {
+ arrTestCase[i].input1->appendAscii(
+ arrTestCase[i].input2, arrTestCase[i].input3);
+ sal_Bool lastRes =
+ ( arrTestCase[i].input1->getStr()== *(arrTestCase[i].expVal) &&
+ arrTestCase[i].input1->getLength() == arrTestCase[i].expVal->getLength() );
+
+ c_rtl_tres_state
+ (
+ hRtlTestResult,
+ lastRes,
+ arrTestCase[i].comments,
+ createName( pMeth, "appendAscii_002", i )
+
+ );
+
+ res &= lastRes;
+ }
+ return ( res );
+}
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer_appendAsciis(
+ hTestResult hRtlTestResult )
+{
+ c_rtl_tres_state_start( hRtlTestResult, "appendAsciis");
+ sal_Bool bTSState = test_rtl_OUStringBuffer_appendAscii_001( hRtlTestResult );
+ bTSState &= test_rtl_OUStringBuffer_appendAscii_002( hRtlTestResult);
+
+ c_rtl_tres_state_end( hRtlTestResult, "appendAsciis");
+// return( bTSState );
+}
+// -----------------------------------------------------------------------------
+extern "C" void /* sal_Bool */ SAL_CALL test_rtl_OUStringBuffer( hTestResult hRtlTestResult )
+{
+
+ c_rtl_tres_state_start(hRtlTestResult, "rtl_OUStringBuffer" );
+
+ test_rtl_OUStringBuffer_ctors( hRtlTestResult );
+ test_rtl_OUStringBuffer_makeStringAndClear( hRtlTestResult );
+ test_rtl_OUStringBuffer_getLength( hRtlTestResult );
+ test_rtl_OUStringBuffer_getCapacity( hRtlTestResult );
+ test_rtl_OUStringBuffer_ensureCapacity( hRtlTestResult );
+ test_rtl_OUStringBuffer_setLength( hRtlTestResult );
+ test_rtl_OUStringBuffer_charAt( hRtlTestResult );
+ test_rtl_OUStringBuffer_csuc( hRtlTestResult );
+ test_rtl_OUStringBuffer_getStr( hRtlTestResult );
+ test_rtl_OUStringBuffer_setCharAt( hRtlTestResult );
+ test_rtl_OUStringBuffer_appends( hRtlTestResult );
+ test_rtl_OUStringBuffer_appendAsciis( hRtlTestResult );
+
+ c_rtl_tres_state_end(hRtlTestResult, "rtl_OUStringBuffer");
+}
+
+// -----------------------------------------------------------------------------
+void RegisterAdditionalFunctions(FktRegFuncPtr _pFunc)
+{
+ if (_pFunc)
+ {
+ (_pFunc)(&test_rtl_OUStringBuffer, "");
+ }
+}
diff --git a/sal/qa/rtl_strings/rtl_String_Const.h b/sal/qa/rtl_strings/rtl_String_Const.h
new file mode 100644
index 000000000000..b950a7120436
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_String_Const.h
@@ -0,0 +1,885 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _RTL_STRING_CONST_H_
+#define _RTL_STRING_CONST_H_
+
+#ifndef _RTL_STRING_UTILS_HXX_
+ #include <rtl_String_Utils.hxx>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#include <limits.h>
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+#ifndef _RTL_TEXTENC_H
+ #include <rtl/textenc.h>
+#endif
+
+#ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const rtl_TextEncoding kEncodingRTLTextUSASCII = RTL_TEXTENCODING_ASCII_US;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_uInt32 kConvertFlagsOUStringToOString = OUSTRING_TO_OSTRING_CVTFLAGS;
+static const sal_uInt32 kConvertFlagsOStringToOUString = OSTRING_TO_OUSTRING_CVTFLAGS;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Char *kTestStr1 = "Sun Microsystems";
+static const sal_Char *kTestStr2 = "Sun Microsystems Java Technology";
+static const sal_Char *kTestStr3 = "Sun microsystems";
+static const sal_Char *kTestStr4 = "SUN MICROSYSTEMS";
+static const sal_Char *kTestStr5 = "sun microsystems";
+static const sal_Char *kTestStr6 = "Java Technology";
+static const sal_Char *kTestStr7 = "Sun ";
+static const sal_Char *kTestStr8 = "Microsystems";
+static const sal_Char *kTestStr9 = "sun microsystems java technology";
+static const sal_Char *kTestStr10 = " Sun Microsystems";
+static const sal_Char *kTestStr11 = "Sun Microsystems ";
+static const sal_Char *kTestStr12 = " Sun Microsystems ";
+static const sal_Char *kTestStr13 = "Sun Microsystems ";
+static const sal_Char *kTestStr14 = " Sun Microsystems";
+static const sal_Char *kTestStr15 = " Sun Microsystems ";
+static const sal_Char *kTestStr16 = " Sun Microsystems ";
+static const sal_Char *kTestStr17 = " Sun Microsystems ";
+static const sal_Char *kTestStr18 = "sUN MICROsYsTEMs";
+static const sal_Char *kTestStr19 = "---Sun-Microsystems---";
+static const sal_Char *kTestStr20 = "sun";
+static const sal_Char *kTestStr21 = "SUN";
+static const sal_Char *kTestStr22 = "SUN MICROSYSTEMS JAVA TECHNOLOGY";
+static const sal_Char *kTestStr23 = " Java Technology";
+static const sal_Char *kTestStr24 = "Sun Microsystems Java Technolog";
+static const sal_Char *kTestStr25 = "";
+static const sal_Char *kTestStr26 = " Mic";
+static const sal_Char *kTestStr27 = "s";
+static const sal_Char *kTestStr28 = "\50\3\5\7\11\13\15\17sun";
+static const sal_Char *kTestStr29 = "\50\3\5\7\11\13\15\17sun\21\23\25\27\31\33\50";
+static const sal_Char *kTestStr30 = "sun\21\23\25\27\31\33\50";
+static const sal_Char *kTestStr31 = "sun Microsystems";
+static const sal_Char *kTestStr32 = "Sun Microsystem ";
+static const sal_Char *kTestStr33 = " ";
+static const sal_Char *kTestStr34 = "\50\5\5\7\11\13\15\17sun";
+static const sal_Char *kTestStr35 = "\50\373\5\7\11\13\15\17sun";
+static const sal_Char *kTestStr36 = "Microsystems Java Technology";
+static const sal_Char *kTestStr37 = "Sun Java Technology";
+static const sal_Char *kTestStr38 = "\21\23\25\27\31\33\50";
+static const sal_Char *kTestStr39 = "\50\3\5\7\11\13\15\17sun Sun Microsystems ";
+static const sal_Char *kTestStr40 = "\50\3\5\7\11\13\15\17sunsun Microsystems";
+static const sal_Char *kTestStr41 = "Sun";
+static const sal_Char *kTestStr42 = "\50\3\5\7\11\13\15\17su";
+static const sal_Char *kTestStr43 = "\50\3\5\7\11\13\15\17sun\256\345";
+static const sal_Char *kTestStr44 = "\256\345";
+static const sal_Char *kTestStr45 = "Sun true";
+static const sal_Char *kTestStr46 = "Sun false";
+static const sal_Char *kTestStr47 = "true";
+static const sal_Char *kTestStr48 = "false";
+static const sal_Char *kTestStr49 = "\50\3\5\7\11\13\15\17suntrue";
+static const sal_Char *kTestStr50 = "\50\3\5\7\11\13\15\17sunfalse";
+static const sal_Char *kTestStr51 = "Sun M";
+//static const sal_Char *kTestStr52 = "Sun \077777";
+//static const sal_Char *kTestStr53 = "Sun \100000";
+//static const sal_Char *kTestStr54 = "\77777";
+//static const sal_Char *kTestStr55 = "\100000";
+static const sal_Char *kTestStr56 = "\50\3\5\7\11\13\15\17suns";
+//static const sal_Char *kTestStr57 = "\50\3\5\7\11\13\15\17sun\77777";
+//static const sal_Char *kTestStr58 = "\50\3\5\7\11\13\15\17sun\10000";
+static const sal_Char *kTestStr1PlusStr6 = "Sun Microsystems" "Java Technology";
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int32 kTestStr1Len = 16;
+static const sal_Int32 kTestStr2Len = 32;
+static const sal_Int32 kTestStr3Len = 16;
+static const sal_Int32 kTestStr4Len = 16;
+static const sal_Int32 kTestStr5Len = 16;
+static const sal_Int32 kTestStr6Len = 15;
+static const sal_Int32 kTestStr7Len = 4;
+static const sal_Int32 kTestStr8Len = 12;
+static const sal_Int32 kTestStr9Len = 32;
+static const sal_Int32 kTestStr10Len = 17;
+static const sal_Int32 kTestStr11Len = 17;
+static const sal_Int32 kTestStr12Len = 18;
+static const sal_Int32 kTestStr13Len = 19;
+static const sal_Int32 kTestStr14Len = 19;
+static const sal_Int32 kTestStr15Len = 20;
+static const sal_Int32 kTestStr16Len = 20;
+static const sal_Int32 kTestStr17Len = 22;
+static const sal_Int32 kTestStr18Len = 16;
+static const sal_Int32 kTestStr19Len = 22;
+static const sal_Int32 kTestStr20Len = 3;
+static const sal_Int32 kTestStr21Len = 3;
+static const sal_Int32 kTestStr22Len = 32;
+static const sal_Int32 kTestStr23Len = 16;
+static const sal_Int32 kTestStr24Len = 31;
+static const sal_Int32 kTestStr25Len = 0;
+static const sal_Int32 kTestStr26Len = 4;
+static const sal_Int32 kTestStr27Len = 1;
+static const sal_Int32 kTestStr28Len = 11;
+static const sal_Int32 kTestStr29Len = 18;
+static const sal_Int32 kTestStr30Len = 10;
+static const sal_Int32 kTestStr31Len = 16;
+static const sal_Int32 kTestStr32Len = 16;
+static const sal_Int32 kTestStr33Len = 1;
+static const sal_Int32 kTestStr34Len = 11;
+static const sal_Int32 kTestStr35Len = 11;
+static const sal_Int32 kTestStr36Len = 28;
+static const sal_Int32 kTestStr37Len = 20;
+static const sal_Int32 kTestStr38Len = 7;
+static const sal_Int32 kTestStr39Len = 33;
+static const sal_Int32 kTestStr40Len = 27;
+static const sal_Int32 kTestStr41Len = 3;
+static const sal_Int32 kTestStr42Len = 10;
+static const sal_Int32 kTestStr43Len = 13;
+static const sal_Int32 kTestStr44Len = 2;
+static const sal_Int32 kTestStr45Len = 8;
+static const sal_Int32 kTestStr46Len = 9;
+static const sal_Int32 kTestStr47Len = 4;
+static const sal_Int32 kTestStr48Len = 5;
+static const sal_Int32 kTestStr49Len = 15;
+static const sal_Int32 kTestStr50Len = 16;
+static const sal_Int32 kTestStr51Len = 5;
+static const sal_Int32 kTestStr52Len = 5;
+static const sal_Int32 kTestStr53Len = 5;
+static const sal_Int32 kTestStr54Len = 1;
+static const sal_Int32 kTestStr55Len = 1;
+static const sal_Int32 kTestStr56Len = 12;
+static const sal_Int32 kTestStr57Len = 12;
+static const sal_Int32 kTestStr58Len = 12;
+static const sal_Int32 kTestStr1PlusStr6Len = kTestStr1Len + kTestStr6Len;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+ static sal_Unicode aUStr1[kTestStr1Len+1];
+ static sal_Unicode aUStr2[kTestStr2Len+1];
+ static sal_Unicode aUStr3[kTestStr3Len+1];
+ static sal_Unicode aUStr4[kTestStr4Len+1];
+ static sal_Unicode aUStr5[kTestStr5Len+1];
+ static sal_Unicode aUStr6[kTestStr6Len+1];
+ static sal_Unicode aUStr7[kTestStr7Len+1];
+ static sal_Unicode aUStr8[kTestStr8Len+1];
+ static sal_Unicode aUStr9[kTestStr9Len+1];
+ static sal_Unicode aUStr10[kTestStr10Len+1];
+ static sal_Unicode aUStr11[kTestStr11Len+1];
+ static sal_Unicode aUStr12[kTestStr12Len+1];
+ static sal_Unicode aUStr13[kTestStr13Len+1];
+ static sal_Unicode aUStr14[kTestStr14Len+1];
+ static sal_Unicode aUStr15[kTestStr15Len+1];
+ static sal_Unicode aUStr16[kTestStr16Len+1];
+ static sal_Unicode aUStr17[kTestStr17Len+1];
+ static sal_Unicode aUStr18[kTestStr18Len+1];
+ static sal_Unicode aUStr19[kTestStr19Len+1];
+ static sal_Unicode aUStr20[kTestStr20Len+1];
+ static sal_Unicode aUStr21[kTestStr21Len+1];
+ static sal_Unicode aUStr22[kTestStr22Len+1];
+ static sal_Unicode aUStr23[kTestStr23Len+1];
+ static sal_Unicode aUStr24[kTestStr24Len+1];
+ static sal_Unicode aUStr25[kTestStr25Len+1];
+ static sal_Unicode aUStr26[kTestStr26Len+1];
+ static sal_Unicode aUStr27[kTestStr27Len+1];
+ static sal_Unicode aUStr28[kTestStr28Len+1];
+ static sal_Unicode aUStr29[kTestStr29Len+1];
+ static sal_Unicode aUStr30[kTestStr30Len+1];
+ static sal_Unicode aUStr31[kTestStr31Len+1];
+ static sal_Unicode aUStr32[kTestStr32Len+1];
+ static sal_Unicode aUStr33[kTestStr33Len+1];
+ static sal_Unicode aUStr34[kTestStr34Len+1];
+ static sal_Unicode aUStr35[kTestStr35Len+1];
+ static sal_Unicode aUStr36[kTestStr36Len+1];
+ static sal_Unicode aUStr37[kTestStr37Len+1];
+ static sal_Unicode aUStr38[kTestStr38Len+1];
+ static sal_Unicode aUStr39[kTestStr39Len+1];
+ static sal_Unicode aUStr40[kTestStr40Len+1];
+ static sal_Unicode aUStr41[kTestStr41Len+1];
+ static sal_Unicode aUStr42[kTestStr42Len+1];
+ static sal_Unicode aUStr43[kTestStr43Len+1];
+ static sal_Unicode aUStr44[kTestStr44Len+1];
+ static sal_Unicode aUStr45[kTestStr45Len+1];
+ static sal_Unicode aUStr46[kTestStr46Len+1];
+ static sal_Unicode aUStr47[kTestStr47Len+1];
+ static sal_Unicode aUStr48[kTestStr48Len+1];
+ static sal_Unicode aUStr49[kTestStr49Len+1];
+ static sal_Unicode aUStr50[kTestStr50Len+1];
+ static sal_Unicode aUStr51[kTestStr51Len+1];
+// static sal_Unicode aUStr52[kTestStr52Len+1]={83,117,110,32,32767};
+// static sal_Unicode aUStr53[kTestStr53Len+1]={83,117,110,32,SAL_MIN_INT16 /*-32768*/};
+// static sal_Unicode aUStr54[kTestStr54Len+1]={32767};
+// static sal_Unicode aUStr55[kTestStr55Len+1]={SAL_MIN_INT16 /*-32768*/};
+ static sal_Unicode aUStr56[kTestStr56Len+1];
+// static sal_Unicode aUStr57[kTestStr57Len+1]={40,3,5,7,9,11,13,15,115,117,110,32767};
+// static sal_Unicode aUStr58[kTestStr58Len+1]={40,3,5,7,9,11,13,15,115,117,110,SAL_MIN_INT16 /*-32768*/};
+ static sal_Unicode aUStr1PlusUStr6[kTestStr1Len + kTestStr6Len + 1];
+
+// we are already in "C"
+
+static sal_Bool SAL_CALL test_ini_uString()
+{
+
+ sal_Bool iniResult= sal_True;
+
+ iniResult &=AStringToUStringNCopy( aUStr1, kTestStr1, kTestStr1Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr2, kTestStr2, kTestStr2Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr3, kTestStr3, kTestStr3Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr4, kTestStr4, kTestStr4Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr5, kTestStr5, kTestStr5Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr6, kTestStr6, kTestStr6Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr7, kTestStr7, kTestStr7Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr8, kTestStr8, kTestStr8Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr9, kTestStr9, kTestStr9Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr10, kTestStr10, kTestStr10Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr11, kTestStr11, kTestStr11Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr12, kTestStr12, kTestStr12Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr13, kTestStr13, kTestStr13Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr14, kTestStr14, kTestStr14Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr15, kTestStr15, kTestStr15Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr16, kTestStr16, kTestStr16Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr17, kTestStr17, kTestStr17Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr18, kTestStr18, kTestStr18Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr19, kTestStr19, kTestStr19Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr20, kTestStr20, kTestStr20Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr21, kTestStr21, kTestStr21Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr22, kTestStr22, kTestStr22Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr23, kTestStr23, kTestStr23Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr1PlusUStr6, kTestStr1PlusStr6, kTestStr1PlusStr6Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr24, kTestStr24, kTestStr24Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr25, kTestStr25, kTestStr25Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr26, kTestStr26, kTestStr26Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr27, kTestStr27, kTestStr27Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr28, kTestStr28, kTestStr28Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr29, kTestStr29, kTestStr29Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr30, kTestStr30, kTestStr30Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr31, kTestStr31, kTestStr31Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr32, kTestStr32, kTestStr32Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr33, kTestStr33, kTestStr33Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr34, kTestStr34, kTestStr34Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr35, kTestStr35, kTestStr35Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr36, kTestStr36, kTestStr36Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr37, kTestStr37, kTestStr37Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr38, kTestStr38, kTestStr38Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr39, kTestStr39, kTestStr39Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr40, kTestStr40, kTestStr40Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr41, kTestStr41, kTestStr41Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr42, kTestStr42, kTestStr42Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr43, kTestStr43, kTestStr43Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr44, kTestStr44, kTestStr44Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr45, kTestStr45, kTestStr45Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr46, kTestStr46, kTestStr46Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr47, kTestStr47, kTestStr47Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr48, kTestStr48, kTestStr48Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr49, kTestStr49, kTestStr49Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr50, kTestStr50, kTestStr50Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr51, kTestStr51, kTestStr51Len );
+
+ //iniResult &=AStringToUStringNCopy( aUStr52, kTestStr52, kTestStr52Len );
+
+ // iniResult &=AStringToUStringNCopy( aUStr53, kTestStr53, kTestStr53Len );
+
+ //iniResult &=AStringToUStringNCopy( aUStr54, kTestStr54, kTestStr54Len );
+
+ //iniResult &=AStringToUStringNCopy( aUStr55, kTestStr55, kTestStr55Len );
+
+ iniResult &=AStringToUStringNCopy( aUStr56, kTestStr56, kTestStr56Len );
+
+ // iniResult &=AStringToUStringNCopy( aUStr57, kTestStr57, kTestStr57Len );
+
+ //iniResult &=AStringToUStringNCopy( aUStr58, kTestStr58, kTestStr58Len );
+ return iniResult;
+
+}
+
+
+
+
+static const sal_Int32 uTestStr1Len = 16;
+static const sal_Int32 uTestStr2Len = 32;
+static const sal_Int32 uTestStr3Len = 16;
+static const sal_Int32 uTestStr4Len = 16;
+static const sal_Int32 uTestStr5Len = 16;
+static const sal_Int32 uTestStr9Len = 32;
+static const sal_Int32 uTestStr22Len = 32;
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+const sal_Unicode uTestStr31[]= {0x400,0x410,0x4DF};
+const sal_Unicode uTestStr32[]= {0x9F9F,0xA000,0x8F80,0x9AD9};
+
+
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int32 uTestStr31Len = 3;
+static const sal_Int32 uTestStr32Len = 4;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int16 kRadixBinary = 2;
+static const sal_Int16 kRadixOctol = 8;
+static const sal_Int16 kRadixDecimal = 10;
+static const sal_Int16 kRadixHexdecimal = 16;
+static const sal_Int16 kRadixBase36 = 36;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int8 kSInt8Max = SCHAR_MAX;
+static const sal_Int16 kUInt8Max = UCHAR_MAX;
+static const sal_Int16 kSInt16Max = SHRT_MAX;
+static const sal_Int32 kUInt16Max = USHRT_MAX;
+static const sal_Int32 kSInt32Max = INT_MAX;
+static const sal_Int64 kUInt32Max = UINT_MAX;
+#if (defined UNX) || (defined OS2)
+static const sal_Int64 kSInt64Max = 9223372036854775807LL;
+#else
+static const sal_Int64 kSInt64Max = 9223372036854775807;
+#endif
+//------------------------------------------------------------------------
+
+static const sal_Int32 kInt32MaxNumsCount = 5;
+
+static const sal_Int32 kInt32MaxNums[kInt32MaxNumsCount] =
+ {
+ kSInt8Max, kUInt8Max,
+ kSInt16Max, kUInt16Max,
+ kSInt32Max
+ };
+
+static const sal_Int32 kInt64MaxNumsCount = 7;
+
+static const sal_Int64 kInt64MaxNums[kInt64MaxNumsCount] =
+ {
+ kSInt8Max, kUInt8Max,
+ kSInt16Max, kUInt16Max,
+ kSInt32Max, kUInt32Max,
+ kSInt64Max
+ };
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Char *kSInt8MaxBinaryStr = "1111111";
+static const sal_Char *kUInt8MaxBinaryStr = "11111111";
+static const sal_Char *kSInt16MaxBinaryStr = "111111111111111";
+static const sal_Char *kUInt16MaxBinaryStr = "1111111111111111";
+static const sal_Char *kSInt32MaxBinaryStr =
+ "1111111111111111111111111111111";
+static const sal_Char *kUInt32MaxBinaryStr =
+ "11111111111111111111111111111111";
+static const sal_Char *kSInt64MaxBinaryStr =
+ "111111111111111111111111111111111111111111111111111111111111111";
+
+//------------------------------------------------------------------------
+
+static const sal_Char *kSInt8MaxOctolStr = "177";
+static const sal_Char *kUInt8MaxOctolStr = "377";
+static const sal_Char *kSInt16MaxOctolStr = "77777";
+static const sal_Char *kUInt16MaxOctolStr = "177777";
+static const sal_Char *kSInt32MaxOctolStr = "17777777777";
+static const sal_Char *kUInt32MaxOctolStr = "37777777777";
+static const sal_Char *kSInt64MaxOctolStr = "777777777777777777777";
+
+//------------------------------------------------------------------------
+
+static const sal_Char *kSInt8MaxDecimalStr = "127";
+static const sal_Char *kUInt8MaxDecimalStr = "255";
+static const sal_Char *kSInt16MaxDecimalStr = "32767";
+static const sal_Char *kUInt16MaxDecimalStr = "65535";
+static const sal_Char *kSInt32MaxDecimalStr = "2147483647";
+static const sal_Char *kUInt32MaxDecimalStr = "4294967295";
+static const sal_Char *kSInt64MaxDecimalStr = "9223372036854775807";
+
+//------------------------------------------------------------------------
+
+static const sal_Char *kSInt8MaxHexDecimalStr = "7f";
+static const sal_Char *kUInt8MaxHexDecimalStr = "ff";
+static const sal_Char *kSInt16MaxHexDecimalStr = "7fff";
+static const sal_Char *kUInt16MaxHexDecimalStr = "ffff";
+static const sal_Char *kSInt32MaxHexDecimalStr = "7fffffff";
+static const sal_Char *kUInt32MaxHexDecimalStr = "ffffffff";
+static const sal_Char *kSInt64MaxHexDecimalStr = "7fffffffffffffff";
+
+//------------------------------------------------------------------------
+
+static const sal_Char *kSInt8MaxBase36Str = "3j";
+static const sal_Char *kUInt8MaxBase36Str = "73";
+static const sal_Char *kSInt16MaxBase36Str = "pa7";
+static const sal_Char *kUInt16MaxBase36Str = "1ekf";
+static const sal_Char *kSInt32MaxBase36Str = "zik0zj";
+static const sal_Char *kUInt32MaxBase36Str = "1z141z3";
+static const sal_Char *kSInt64MaxBase36Str = "1y2p0ij32e8e7";
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int32 kBinaryNumsCount = 16;
+
+static const sal_Char *kBinaryNumsStr[kBinaryNumsCount] =
+ {
+ "0", "1", "10", "11",
+ "100", "101", "110", "111",
+ "1000", "1001", "1010", "1011",
+ "1100", "1101", "1110", "1111"
+ };
+
+static const sal_Int32 kBinaryMaxNumsCount = 7;
+
+static const sal_Char *kBinaryMaxNumsStr[kBinaryMaxNumsCount] =
+ {
+ kSInt8MaxBinaryStr,
+ kUInt8MaxBinaryStr,
+ kSInt16MaxBinaryStr,
+ kUInt16MaxBinaryStr,
+ kSInt32MaxBinaryStr,
+ kUInt32MaxBinaryStr,
+ kSInt64MaxBinaryStr
+ };
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kOctolNumsCount = 16;
+
+static const sal_Char *kOctolNumsStr[kOctolNumsCount] =
+ {
+ "0", "1", "2", "3",
+ "4", "5", "6", "7",
+ "10", "11", "12", "13",
+ "14", "15", "16", "17"
+ };
+
+static const sal_Int32 kOctolMaxNumsCount = 7;
+
+static const sal_Char *kOctolMaxNumsStr[kOctolMaxNumsCount] =
+ {
+ kSInt8MaxOctolStr,
+ kUInt8MaxOctolStr,
+ kSInt16MaxOctolStr,
+ kUInt16MaxOctolStr,
+ kSInt32MaxOctolStr,
+ kUInt32MaxOctolStr,
+ kSInt64MaxOctolStr
+ };
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kDecimalNumsCount = 16;
+
+static const sal_Char *kDecimalNumsStr[kDecimalNumsCount] =
+ {
+ "0", "1", "2", "3",
+ "4", "5", "6", "7",
+ "8", "9", "10", "11",
+ "12", "13", "14", "15"
+ };
+
+static const sal_Int32 kDecimalMaxNumsCount = 7;
+
+static const sal_Char *kDecimalMaxNumsStr[kDecimalMaxNumsCount] =
+ {
+ kSInt8MaxDecimalStr,
+ kUInt8MaxDecimalStr,
+ kSInt16MaxDecimalStr,
+ kUInt16MaxDecimalStr,
+ kSInt32MaxDecimalStr,
+ kUInt32MaxDecimalStr,
+ kSInt64MaxDecimalStr
+ };
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kHexDecimalNumsCount = 16;
+
+static const sal_Char *kHexDecimalNumsStr[kHexDecimalNumsCount] =
+ {
+ "0", "1", "2", "3",
+ "4", "5", "6", "7",
+ "8", "9", "a", "b",
+ "c", "d", "e", "f"
+ };
+
+static const sal_Int32 kHexDecimalMaxNumsCount = 7;
+
+static const sal_Char *kHexDecimalMaxNumsStr[kHexDecimalMaxNumsCount] =
+ {
+ kSInt8MaxHexDecimalStr,
+ kUInt8MaxHexDecimalStr,
+ kSInt16MaxHexDecimalStr,
+ kUInt16MaxHexDecimalStr,
+ kSInt32MaxHexDecimalStr,
+ kUInt32MaxHexDecimalStr,
+ kSInt64MaxHexDecimalStr
+ };
+
+//------------------------------------------------------------------------
+
+static const sal_Int32 kBase36NumsCount = 36;
+
+static const sal_Char *kBase36NumsStr[kBase36NumsCount] =
+ {
+ "0", "1", "2", "3",
+ "4", "5", "6", "7",
+ "8", "9", "a", "b",
+ "c", "d", "e", "f",
+ "g", "h", "i", "j",
+ "k", "l", "m", "n",
+ "o", "p", "q", "r",
+ "s", "t", "u", "v",
+ "w", "x", "y", "z"
+ };
+
+static const sal_Int32 kBase36MaxNumsCount = 7;
+
+static const sal_Char *kBase36MaxNumsStr[kBase36MaxNumsCount] =
+ {
+ kSInt8MaxBase36Str,
+ kUInt8MaxBase36Str,
+ kSInt16MaxBase36Str,
+ kUInt16MaxBase36Str,
+ kSInt32MaxBase36Str,
+ kUInt32MaxBase36Str,
+ kSInt64MaxBase36Str
+ };
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+static const sal_Int32 nDoubleCount=24;
+// static const sal_Char *inputDouble[nDoubleCount] =
+// {
+// "3","3.1","3.1415","3.1415926535","3.141592653589793",
+// "3.1415926535897932","3.14159265358979323","+3.1",
+// "3.141592653589793238462643","9.1096e-31","2.997925e8","6.241e18","5.381e+18",
+// "1.7e-309","6.5822e-16","1.7e+307","2.2e30","03.1"," 3.1","-3.1",
+// "-0.0","0.0","","1.00e308"
+// };
+static const double expValDouble[nDoubleCount]=
+ {
+ 3.0,3.1,3.1415,3.1415926535,3.141592653589793,
+ 3.1415926535897932,3.14159265358979323,3.1,
+ 3.141592653589793238462643,9.1096e-31,2.997925e8,6.241e18,5.381e18,
+ 1.7e-309,6.5822e-16,1.7e+307,2.2e30,3.1,3.1,-3.1,
+ 0.0,0.0,0.0,1.00e+308
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nFloatCount=22;
+// static const sal_Char *inputFloat[nFloatCount] =
+// {
+// "3",
+// "3.1",
+// "3.1415",
+// "3.14159",
+// "3.141592",
+// "3.1415926",
+// "3.14159265",
+// "3.141592653589793238462643",
+// "6.5822e-16",
+// "9.1096e-31",
+// "2.997925e8",
+// "6.241e18",
+// "1.00e38",
+// "6.241e-37",
+// "6.241e37",
+// "03.1",
+// " 3.1",
+// "-3.1",
+// "+3.1",
+// "-0.0",
+// "0.0",
+// ""
+// };
+static const float expValFloat[nFloatCount] =
+ {
+ 3.0f,
+ 3.1f,
+ 3.1415f,
+ 3.14159f,
+ 3.141592f,
+ 3.1415926f,
+ 3.14159265f,
+ 3.141592653589793238462643f,
+ 6.5822e-16f,
+ 9.1096e-31f,
+ 2.997925e8f,
+ 6.241e18f,
+ 1.00e38f,
+ 6.241e-37f,
+ 6.241e37f,
+ 3.1f,
+ 3.1f,
+ -3.1f,
+ 3.1f,
+ 0.0f,
+ 0.0f,
+ 0.0f
+ };
+static const float fPrecision[nFloatCount] =
+ {
+ 3e-7f,
+ 3e-7f,
+ 3e-7f,
+ 3e-7f,
+ 3e-7f,
+ 3e-7f,
+ 3e-7f,
+ 3e-7f,
+ 6e-16f * 1e-7f,
+ 9e-31f * 1e-7f,
+ 3e8f * 1e-7f,
+ 6e18f * 1e-7f,
+ 1e38f * 1e-7f,
+ 6e-37f * 1e-7f,
+ 6e37f * 1e-7f,
+ 3e-7f,
+ 3e-7f,
+ 3e-7f,
+ 3e-7f,
+ 1e-7f,
+ 1e-7f,
+ 1e-7f
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nCharCount=15;
+static const sal_Char *inputChar[nCharCount] =
+ {
+ "A","a","0","-","_",
+ "\25","\33","\35",
+ "@","\n","\'","\"",
+ "\0","","Sun Microsystems"
+ };
+static const sal_Unicode expValChar[nCharCount] =
+ {
+ 65,97,48,45,95,
+ 21,27,29,
+ 64,10,39,34,
+ 0,0,83
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nDefaultCount=6;
+static const sal_Unicode input1Default[nDefaultCount] =
+ {
+ 77,115,85,119,32,0
+ };
+static const sal_Int32 input2Default[nDefaultCount] =
+ {
+ 0,0,0,0,0,0
+ };
+static const sal_Int32 expValDefault[nDefaultCount] =
+ {
+ 4,9,-1,-1,3,-1
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nNormalCount=10;
+static const sal_Unicode input1Normal[nNormalCount] =
+ {
+ 77,77,77,115,115,115,119,119,0,0
+ };
+static const sal_Int32 input2Normal[nNormalCount] =
+ {
+ 0,32,80,0,13,20,0,80,0,32
+ };
+static const sal_Int32 expValNormal[nNormalCount] =
+ {
+ 4,-1,-1,9,15,-1,-1,-1,-1,-1
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nlastDefaultCount=5;
+static const sal_Unicode input1lastDefault[nlastDefaultCount] =
+ {
+ 77,115,119,32,0
+ };
+static const sal_Int32 input2lastDefault[nlastDefaultCount] =
+ {
+ 31,31,31,31,31
+ };
+static const sal_Int32 expVallastDefault[nlastDefaultCount] =
+ {
+ 4,15,-1,21,-1
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nlastNormalCount=8;
+static const sal_Unicode input1lastNormal[nlastNormalCount] =
+ {
+ 77,77,77,115,115,119,119,0
+ };
+static const sal_Int32 input2lastNormal[nlastNormalCount] =
+ {
+ 29,0,80,31,3,31,80,31
+ };
+static const sal_Int32 expVallastNormal[nlastNormalCount] =
+ {
+ 4,-1,4,15,-1,-1,-1,-1
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nStrDefaultCount=6;
+static const sal_Unicode *input1StrDefault[nStrDefaultCount] =
+ {
+ aUStr7,aUStr8,aUStr21,
+ aUStr30,aUStr25,aUStr26
+ };
+static const sal_Int32 input2StrDefault[nStrDefaultCount] =
+ {
+ 0,0,0,0,0,0
+ };
+static const sal_Int32 expValStrDefault[nStrDefaultCount] =
+ {
+ 0,4,-1,-1,-1,3
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nStrNormalCount=9;
+static const sal_Unicode *input1StrNormal[nStrNormalCount] =
+ {
+ aUStr7,aUStr7,aUStr8,aUStr8,aUStr21,aUStr30,aUStr25,aUStr25,aUStr26
+ };
+static const sal_Int32 input2StrNormal[nStrNormalCount] =
+ {
+ 0,32,0,30,0,0,0,32,0
+ };
+static const sal_Int32 expValStrNormal[nStrNormalCount] =
+ {
+ 0,-1,4,-1,-1,-1,-1,-1,3
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nStrLastDefaultCount=6;
+static const sal_Unicode *input1StrLastDefault[nStrLastDefaultCount] =
+ {
+ aUStr7,aUStr8,aUStr21,aUStr30,aUStr25,aUStr26
+ };
+static const sal_Int32 input2StrLastDefault[nStrLastDefaultCount] =
+ {
+ 31,31,31,31,31,31
+ };
+static const sal_Int32 expValStrLastDefault[nStrLastDefaultCount] =
+ {
+ 0,4,-1,-1,-1,3
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 nStrLastNormalCount=12;
+static const sal_Unicode *input1StrLastNormal[nStrLastNormalCount] =
+ {
+ aUStr7,aUStr7,aUStr7,aUStr8,aUStr8,aUStr21,aUStr30,
+ aUStr25,aUStr25,aUStr26,aUStr27,aUStr27
+ };
+static const sal_Int32 input2StrLastNormal[nStrLastNormalCount] =
+ {
+ 31,0,80,31,2,31,31,31,0,31,31,14
+ };
+static const sal_Int32 expValStrLastNormal[nStrLastNormalCount] =
+ {
+ 0,-1,0,4,-1,-1,-1,-1,-1,3,15,11
+ };
+//------------------------------------------------------------------------
+static const sal_Int32 kNonSInt32Max = INT_MIN;
+static const sal_Int32 kNonSInt16Max = SHRT_MIN;
+//------------------------------------------------------------------------
+#ifdef __cplusplus
+}
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#endif /* _RTL_STRING_CONST_H_ */
+
diff --git a/sal/qa/rtl_strings/rtl_String_Utils.cxx b/sal/qa/rtl_strings/rtl_String_Utils.cxx
new file mode 100644
index 000000000000..0fccc111a184
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_String_Utils.cxx
@@ -0,0 +1,593 @@
+/*************************************************************************
+#
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+#*************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#include <math.h>
+#include <stdlib.h>
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+#ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+#endif
+
+#ifndef _RTL_STRING_HXX_
+ #include <rtl/string.hxx>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _RTL_STRING_UTILS_CONST_H_
+ #include <rtl_String_Utils_Const.h>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+using namespace rtl;
+
+sal_uInt32 AStringLen( const sal_Char *pAStr )
+{
+ sal_uInt32 nStrLen = 0;
+
+ if ( pAStr != NULL )
+ {
+ const sal_Char *pTempStr = pAStr;
+
+ while( *pTempStr )
+ {
+ pTempStr++;
+ } // while
+
+ nStrLen = (sal_uInt32)( pTempStr - pAStr );
+ } // if
+
+ return nStrLen;
+} // AStringLen
+sal_Char* cpystr( sal_Char* dst, const sal_Char* src )
+{
+ const sal_Char* psrc = src;
+ sal_Char* pdst = dst;
+
+ while( *pdst++ = *psrc++ );
+ return ( dst );
+}
+
+sal_Char* cpynstr( sal_Char* dst, const sal_Char* src, sal_uInt32 cnt )
+{
+
+ const sal_Char* psrc = src;
+ sal_Char* pdst = dst;
+ sal_uInt32 len = cnt;
+ sal_uInt32 i;
+
+ if ( len >= AStringLen(src) )
+ {
+ return( cpystr( dst, src ) );
+ }
+
+ // copy string by char
+ for( i = 0; i < len; i++ )
+ *pdst++ = *psrc++;
+ *pdst = '\0';
+
+ return ( dst );
+}
+
+//------------------------------------------------------------------------
+sal_Bool cmpstr( const sal_Char* str1, const sal_Char* str2, sal_uInt32 len )
+{
+ const sal_Char* pBuf1 = str1;
+ const sal_Char* pBuf2 = str2;
+ sal_uInt32 i = 0;
+
+ while ( (*pBuf1 == *pBuf2) && i < len )
+ {
+ (pBuf1)++;
+ (pBuf2)++;
+ i++;
+ }
+ return( i == len );
+}
+//------------------------------------------------------------------------
+sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2, sal_uInt32 len )
+{
+ const sal_Unicode* pBuf1 = str1;
+ const sal_Unicode* pBuf2 = str2;
+ sal_uInt32 i = 0;
+
+ while ( (*pBuf1 == *pBuf2) && i < len )
+ {
+ (pBuf1)++;
+ (pBuf2)++;
+ i++;
+ }
+ return( i == len );
+}
+
+//-----------------------------------------------------------------------
+sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2 )
+{
+ const sal_Unicode* pBuf1 = str1;
+ const sal_Unicode* pBuf2 = str2;
+ sal_Bool res = sal_True;
+
+ while ( (*pBuf1 == *pBuf2) && *pBuf1 !='\0' && *pBuf2 != '\0')
+ {
+ (pBuf1)++;
+ (pBuf2)++;
+ }
+ if (*pBuf1 == '\0' && *pBuf2 == '\0')
+ res = sal_True;
+ else
+ res = sal_False;
+ return (res);
+}
+
+sal_Char* createName( sal_Char* dst, const sal_Char* meth, sal_uInt32 cnt )
+{
+ sal_Char* pdst = dst;
+ sal_Char nstr[16];
+ sal_Char* pstr = nstr;
+ rtl_str_valueOfInt32( pstr, cnt, 10 );
+
+ cpystr( pdst, meth );
+ cpystr( pdst+ AStringLen(meth), "_" );
+
+ if ( cnt < 100 )
+ {
+ cpystr(pdst + AStringLen(pdst), "0" );
+ }
+ if ( cnt < 10 )
+ {
+ cpystr(pdst + AStringLen(pdst), "0" );
+ }
+
+ cpystr( pdst + AStringLen(pdst), nstr );
+ return( pdst );
+}
+
+//------------------------------------------------------------------------
+// testing the method compareTo( const OString & aStr )
+//------------------------------------------------------------------------
+void makeComment( char *com, const char *str1, const char *str2,
+ sal_Int32 sgn )
+{
+ cpystr(com, str1);
+ int str1Length = AStringLen( str1 );
+ const char *sign = (sgn == 0) ? " == " : (sgn > 0) ? " > " : " < " ;
+ cpystr(com + str1Length, sign);
+ int signLength = AStringLen(sign);
+ cpystr(com + str1Length + signLength, str2);
+ com[str1Length + signLength + AStringLen(str2)] = 0;
+}
+
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToFloatCompare ( const sal_Char *pStr,
+ const float nX,
+ const float nEPS
+ )
+{
+ sal_Bool cmp = sal_False;
+
+ if ( pStr != NULL )
+ {
+ ::rtl::OString aStr(pStr);
+
+ float actNum = 0;
+ float expNum = nX;
+ float eps = nEPS;
+
+ actNum = aStr.toFloat();
+
+ if ( abs( (int)(actNum - expNum) ) <= eps )
+ {
+ cmp = sal_True;
+ } // if
+ } // if
+
+ return cmp;
+} // AStringToFloatCompare
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToDoubleCompare ( const sal_Char *pStr,
+ const double nX,
+ const double nEPS
+ )
+{
+ sal_Bool cmp = sal_False;
+
+ if ( pStr != NULL )
+ {
+ ::rtl::OString aStr(pStr);
+
+ double actNum = 0;
+ double expNum = nX;
+ double eps = nEPS;
+
+ actNum = aStr.toDouble();
+
+ if ( abs( (int)(actNum - expNum) ) <= eps )
+ {
+ cmp = sal_True;
+ } // if
+ } // if
+
+ return cmp;
+} // AStringToDoubleCompare
+
+//------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------
+
+sal_uInt32 UStringLen( const sal_Unicode *pUStr )
+{
+ sal_uInt32 nUStrLen = 0;
+
+ if ( pUStr != NULL )
+ {
+ const sal_Unicode *pTempUStr = pUStr;
+
+ while( *pTempUStr )
+ {
+ pTempUStr++;
+ } // while
+
+ nUStrLen = (sal_uInt32)( pTempUStr - pUStr );
+ } // if
+
+ return nUStrLen;
+} // UStringLen
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringIsValid( const sal_Char *pAStr )
+{
+ if ( pAStr != NULL )
+ {
+ sal_uInt32 nLen = AStringLen( pAStr );
+ sal_uChar uChar = 0;
+
+ while ( ( nLen >= 0 ) && ( *pAStr ) )
+ {
+ uChar = (unsigned char)*pAStr;
+
+ if ( uChar > 127 )
+ {
+ return sal_False;
+ } // if
+
+ pAStr++;
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nLen > 0 )
+ {
+ nLen--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+ } // if
+
+ return sal_True;
+} // AStringIsValid
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringNIsValid( const sal_Char *pAStr,
+ const sal_uInt32 nStrLen
+ )
+{
+ sal_uInt32 nLen = nStrLen;
+ sal_uChar uChar = 0;
+
+ while ( ( nLen >= 0 ) && ( *pAStr ) )
+ {
+ uChar = (unsigned char)*pAStr;
+
+ if ( uChar > 127 )
+ {
+ return sal_False;
+ } // if
+
+ pAStr++;
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nLen > 0 )
+ {
+ nLen--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+
+ return sal_True;
+} // AStringNIsValid
+
+//------------------------------------------------------------------------
+
+static inline sal_Int32 ACharToUCharCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr
+ )
+{
+ sal_Int32 nCmp = 0;
+ sal_Int32 nUChar = (sal_Int32)*pUStr;
+ sal_Int32 nChar = (sal_Int32)((unsigned char)*pAStr);
+
+ nCmp = nUChar - nChar;
+
+ return nCmp;
+} // ACharToUCharCompare
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToUStringCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr
+ )
+{
+ sal_Int32 nCmp = kErrCompareAStringToUString;
+
+ if ( ( pUStr != NULL ) && ( pAStr != NULL ) )
+ {
+ nCmp = ACharToUCharCompare( pUStr, pAStr );
+
+ while ( ( nCmp == 0 ) && ( *pAStr ) )
+ {
+ pUStr++;
+ pAStr++;
+
+ nCmp = ACharToUCharCompare( pUStr, pAStr );
+ } // while
+ } // if
+
+ return nCmp;
+} // AStringToUStringCompare
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToUStringNCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr,
+ const sal_uInt32 nAStrCount
+ )
+{
+ sal_Int32 nCmp = kErrCompareNAStringToUString;
+
+ if ( ( pUStr != NULL ) && ( pAStr != NULL ) )
+ {
+ sal_uInt32 nCount = nAStrCount;
+
+ nCmp = ACharToUCharCompare( pUStr, pAStr );
+
+ while ( ( nCmp == 0 ) && ( *pAStr ) && ( nCount ) )
+ {
+ pUStr++;
+ pAStr++;
+
+ nCmp = ACharToUCharCompare( pUStr, pAStr );
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nCount > 0 )
+ {
+ nCount--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+ } // if
+
+ return nCmp;
+} // AStringToUStringNCompare
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToRTLUStringCompare( const rtl_uString *pRTLUStr,
+ const sal_Char *pAStr
+ )
+{
+ sal_Int32 nCmp = kErrCompareAStringToRTLUString;
+
+ if ( ( pRTLUStr != NULL ) && ( pAStr != NULL ) )
+ {
+ rtl_uString *pRTLUStrCopy = NULL;
+
+ rtl_uString_newFromString( &pRTLUStrCopy, pRTLUStr );
+
+ if ( pRTLUStrCopy != NULL )
+ {
+ const sal_Unicode *pUStr = rtl_uString_getStr( pRTLUStrCopy );
+
+ if ( pUStr != NULL )
+ {
+ nCmp = AStringToUStringCompare( pUStr, pAStr );
+ } // if
+
+ rtl_uString_release( pRTLUStrCopy );
+
+ pRTLUStrCopy = NULL;
+ } // if
+ } // if
+
+ return nCmp;
+} // AStringToRTLUStringCompare
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToRTLUStringNCompare( const rtl_uString *pRTLUStr,
+ const sal_Char *pAStr,
+ const sal_uInt32 nAStrCount
+ )
+{
+ sal_Int32 nCmp = kErrCompareNAStringToRTLUString;
+
+ if ( ( pRTLUStr != NULL ) && ( pAStr != NULL ) )
+ {
+ rtl_uString *pRTLUStrCopy = NULL;
+
+ rtl_uString_newFromString( &pRTLUStrCopy, pRTLUStr );
+
+ if ( pRTLUStrCopy != NULL )
+ {
+ const sal_Unicode *pUStr = rtl_uString_getStr( pRTLUStrCopy );
+
+ if ( pUStr != NULL )
+ {
+ nCmp = AStringToUStringNCompare( pUStr, pAStr, nAStrCount );
+ } // if
+
+ rtl_uString_release( pRTLUStrCopy );
+
+ pRTLUStrCopy = NULL;
+ } // if
+ } // if
+
+ return nCmp;
+} // AStringToRTLUStringNCompare
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToUStringCopy( sal_Unicode *pDest,
+ const sal_Char *pSrc
+ )
+{
+ sal_Bool bCopied = sal_False;
+ sal_uInt32 nCount = AStringLen( pSrc );
+ sal_uInt32 nLen = nCount;
+
+ if ( ( pDest != NULL )
+ && ( pSrc != NULL )
+ && ( AStringNIsValid( pSrc, nLen ) )
+ )
+ {
+ while ( nCount >= 0 )
+ {
+ *pDest = (unsigned char)*pSrc;
+
+ pDest++;
+ pSrc++;
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nCount > 0 )
+ {
+ nCount--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+
+ if ( nCount == 0 )
+ {
+ bCopied = sal_True;
+ } // if
+ } // if
+
+ return bCopied;
+} // AStringToUStringCopy
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToUStringNCopy( sal_Unicode *pDest,
+ const sal_Char *pSrc,
+ const sal_uInt32 nSrcLen
+ )
+{
+ sal_Bool bCopied = sal_False;
+ sal_uInt32 nCount = nSrcLen;
+ sal_uInt32 nLen = nSrcLen;
+
+ if ( ( pDest != NULL )
+ && ( pSrc != NULL )
+ && ( AStringNIsValid( pSrc, nLen ) )
+ )
+ {
+ while ( nCount >= 0 )
+ {
+ *pDest = (unsigned char)*pSrc;
+
+ pDest++;
+ pSrc++;
+
+ // Since we are dealing with unsigned integers
+ // we want to make sure that the last number is
+ // indeed zero.
+
+ if ( nCount > 0 )
+ {
+ nCount--;
+ } // if
+ else
+ {
+ break;
+ } // else
+ } // while
+
+ if ( nCount == 0 )
+ {
+ bCopied = sal_True;
+ } // if
+ } // if
+
+ return bCopied;
+} // AStringToUStringNCopy
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
diff --git a/sal/qa/rtl_strings/rtl_String_Utils.hxx b/sal/qa/rtl_strings/rtl_String_Utils.hxx
new file mode 100644
index 000000000000..ceecfde3395d
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_String_Utils.hxx
@@ -0,0 +1,137 @@
+/*************************************************************************
+#
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+#*************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _RTL_STRING_UTILS_HXX_
+#define _RTL_STRING_UTILS_HXX_
+
+#ifdef __cplusplus
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#include <math.h>
+#include <stdlib.h>
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+#ifndef _RTL_USTRING_H_
+ #include <rtl/ustring.h>
+#endif
+
+#ifndef _RTL_STRING_HXX_
+ #include <rtl/string.hxx>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+sal_Char* cpystr( sal_Char* dst, const sal_Char* src );
+sal_Char* cpynstr( sal_Char* dst, const sal_Char* src, sal_uInt32 cnt );
+
+sal_Bool cmpstr( const sal_Char* str1, const sal_Char* str2, sal_uInt32 len );
+sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2, sal_uInt32 len );
+sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2 );
+
+sal_Char* createName( sal_Char* dst, const sal_Char* src, sal_uInt32 cnt );
+void makeComment(char *com, const char *str1, const char *str2, sal_Int32 sgn);
+
+
+sal_uInt32 AStringLen( const sal_Char *pAStr );
+
+sal_uInt32 UStringLen( const sal_Unicode *pUStr );
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToFloatCompare ( const sal_Char *pStr,
+ const float nX,
+ const float nEPS
+ );
+
+sal_Bool AStringToDoubleCompare ( const sal_Char *pStr,
+ const double nX,
+ const double nEPS
+ );
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringIsValid( const sal_Char *pAStr );
+
+sal_Bool AStringNIsValid( const sal_Char *pAStr,
+ const sal_uInt32 nStrLen
+ );
+
+//------------------------------------------------------------------------
+
+sal_Int32 AStringToUStringCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr
+ );
+
+sal_Int32 AStringToUStringNCompare( const sal_Unicode *pUStr,
+ const sal_Char *pAStr,
+ const sal_uInt32 nAStrCount
+ );
+
+sal_Int32 AStringToRTLUStringCompare( const rtl_uString *pRTLUStr,
+ const sal_Char *pAStr
+ );
+
+sal_Int32 AStringToRTLUStringNCompare( const rtl_uString *pRTLUStr,
+ const sal_Char *pAStr,
+ const sal_uInt32 nAStrCount
+ );
+
+//------------------------------------------------------------------------
+
+sal_Bool AStringToUStringCopy( sal_Unicode *pDest,
+ const sal_Char *pSrc
+ );
+
+sal_Bool AStringToUStringNCopy( sal_Unicode *pDest,
+ const sal_Char *pSrc,
+ const sal_uInt32 nSrcLen
+ );
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#endif /* __cplusplus */
+
+#endif /* _RTL_STRING_UTILS_HXX */
+
+
+
+
+
+
+
diff --git a/sal/qa/rtl_strings/rtl_String_Utils_Const.h b/sal/qa/rtl_strings/rtl_String_Utils_Const.h
new file mode 100644
index 000000000000..29d6eb69c1fc
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_String_Utils_Const.h
@@ -0,0 +1,74 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _RTL_STRING_UTILS_CONST_H_
+#define _RTL_STRING_UTILS_CONST_H_
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifndef _SAL_TYPES_H_
+ #include <sal/types.h>
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+static const sal_Int32 kErrCompareAStringToUString = -2;
+static const sal_Int32 kErrCompareNAStringToUString = -3;
+static const sal_Int32 kErrCompareAStringToRTLUString = -4;
+static const sal_Int32 kErrCompareNAStringToRTLUString = -5;
+static const sal_Int32 kErrAStringToByteStringCompare = -6;
+static const sal_Int32 kErrAStringToByteStringNCompare = -7;
+static const sal_Int32 kErrCompareAStringToString = -8;
+static const sal_Int32 kErrCompareNAStringToString = -9;
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#ifdef __cplusplus
+}
+#endif
+
+//------------------------------------------------------------------------
+//------------------------------------------------------------------------
+
+#endif /* _RTL_STRING_UTILS_CONST_H_ */
+
+
+
diff --git a/sal/qa/rtl_strings/rtl_old_testostring.cxx b/sal/qa/rtl_strings/rtl_old_testostring.cxx
new file mode 100644
index 000000000000..1f2958fb706f
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_old_testostring.cxx
@@ -0,0 +1,266 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+// LLA:
+// this file is converted to use with testshl2
+// original was placed in sal/test/textenc.cxx
+
+
+// -----------------------------------------------------------------------------
+#include <string.h>
+#include <stdio.h>
+
+// #ifndef _OSL_DIAGNOSE_H_
+// #include <osl/diagnose.h>
+// #endif
+
+#ifndef _RTL_STRING_HXX
+#include <rtl/string.hxx>
+#endif
+
+#include <testshl/simpleheader.hxx>
+
+#define TEST_ENSURE(c, m) CPPUNIT_ASSERT_MESSAGE((m), (c))
+
+// #if OSL_DEBUG_LEVEL > 0
+// #define TEST_ENSHURE(c, m) OSL_ENSURE(c, m)
+// #else
+// #define TEST_ENSHURE(c, m) OSL_VERIFY(c)
+// #endif
+
+using namespace rtl;
+
+// -----------------------------------------------------------------------------
+namespace rtl_OString
+{
+ class oldtests : public CppUnit::TestFixture
+ {
+ public:
+ void test_OString();
+
+ CPPUNIT_TEST_SUITE( oldtests );
+ CPPUNIT_TEST( test_OString );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+
+#ifdef WNT
+#pragma warning( disable : 4723 )
+#endif
+
+void oldtests::test_OString()
+{
+ TEST_ENSURE( sal_True, "_USENAMEPSACE defined");
+
+ // "Mein erster RTL OString\n"
+ // | | | | |
+ // Index 0 5 10 15 20
+ OString s1("Mein erster RTL OString\n");
+ TEST_ENSURE( s1 == "Mein erster RTL OString\n", "test_OString error 1");
+ TEST_ENSURE( s1.getLength() == 24, "test_OString error 2");
+
+ OString s2 = s1;
+ TEST_ENSURE( s2[16] == 'O', "test_OString error 3");
+ TEST_ENSURE( s2.equals(s1), "test_OString error 4");
+ TEST_ENSURE( s2.indexOf('O') == 16, "test_OString error 5");
+ TEST_ENSURE( s2.indexOf('O', 5) == 16, "test_OString error 5a");
+ TEST_ENSURE( s2.lastIndexOf('r') == 19, "test_OString error 6");
+ TEST_ENSURE( s2[19] == 'r', "test_OString error 7");
+ TEST_ENSURE( s2[23] == '\n', "test_OString error 8");
+ TEST_ENSURE( s2.lastIndexOf('\n') == 23, "test_OString error 9");
+ TEST_ENSURE( s2.lastIndexOf('M') == 0, "test_OString error 10");
+ TEST_ENSURE( s2.lastIndexOf('t', s2.getLength() - 8) == 8, "test_OString error 9");
+
+
+ // "Mein erster RTL OString ist ein String aus der RTL Library\n"
+ // | | | | | | | | | | | |
+ // Index 0 5 10 15 20 25 30 35 40 45 50 55
+ OString s3 = s2.copy(0, s2.getLength() - 1);
+ OString s4 = s3.concat(" ist ein String aus der RTL Library\n");
+ TEST_ENSURE( s4.getLength() == 59, "test_OString error 11");
+
+ s1 = s4.copy(0, 38);
+ OString s5;
+ s5 = s1 + " aus der RTL Library\n";
+ TEST_ENSURE( s5.compareTo(s4) == 0 , "test_OString error 12");
+ TEST_ENSURE( s5.indexOf("RTL") == 12, "test_OString error 13");
+ TEST_ENSURE( s5.lastIndexOf("RTL") == 47, "test_OString error 13");
+
+ sal_Bool b = sal_False;
+ OString s6 = s5.valueOf(b);
+ TEST_ENSURE( s6.compareTo("false") == 0, "test_OString error 14");
+ s6 = s5.valueOf('H');
+ TEST_ENSURE( s6.compareTo("H") == 0, "test_OString error 15");
+ sal_Int32 n = 123456789L;
+ s6 = s5.valueOf(n);
+ TEST_ENSURE( s6.compareTo("123456789") == 0, "test_OString error 16");
+
+#ifndef SAL_OS2
+#ifdef SAL_UNX
+ sal_Int64 m = -3223372036854775807LL;
+#elif defined(SAL_OS2)
+ sal_Int64 m;
+ sal_setInt64(&m, 3965190145L, -750499787L);
+#else
+ sal_Int64 m = -3223372036854775807;
+#endif
+ s6 = s5.valueOf(m);
+ TEST_ENSURE( s6.compareTo("-3223372036854775807") == 0, "test_OString error 17");
+#endif
+
+ OString s7("HaLLo");
+ s7 = s7.toAsciiLowerCase();
+ TEST_ENSURE( s7 == "hallo", "test_OString error 19");
+ s7 = s7.toAsciiUpperCase();
+ TEST_ENSURE( s7 == "HALLO", "test_OString error 20");
+
+ OString s8("HaLLo ICH BIn eIn StRiNg");
+ s7 = s8.toAsciiLowerCase();
+
+ TEST_ENSURE( s8.equalsIgnoreAsciiCase(s7), "test_OString error 21");
+
+ s8 = s7.toAsciiUpperCase();
+ TEST_ENSURE( s8 == "HALLO ICH BIN EIN STRING", "test_OString error 22");
+
+ s7 = " ";
+ s8 = s7 + s8 + " ";
+ TEST_ENSURE( s8 == " HALLO ICH BIN EIN STRING ",
+ "test_OString error 23");
+
+ s7 = s8.trim();
+ TEST_ENSURE( s7 == "HALLO ICH BIN EIN STRING", "test_OString error 24");
+ TEST_ENSURE( strcmp(s7.getStr(), "HALLO ICH BIN EIN STRING") == 0,
+ "test_OString error 25");
+
+ s7 = "Hallo";
+ s8 = "aber Hallo";
+
+ TEST_ENSURE( s7 < s8, "test_OString error 26");
+ TEST_ENSURE( s8 > s7, "test_OString error 27");
+ TEST_ENSURE( s7 != s8, "test_OString error 28");
+ TEST_ENSURE( s7 != "blabla", "test_OString error 29");
+ TEST_ENSURE( "blabla" != s7, "test_OString error 30");
+
+ s8 = "Hallo";
+ TEST_ENSURE( s7 <= s8, "test_OString error 31");
+ TEST_ENSURE( s7 >= s8, "test_OString error 32");
+
+ s8 = s8.replace('l', 'r');
+ TEST_ENSURE( s8 == "Harro", "test_OString error 33");
+
+ sal_Int32 nIndex = 0;
+ s8 = "|hallo1|hallo2|hallo3|hallo4|hallo5|hallo6|hallo7|hallo8|";
+ TEST_ENSURE( s8.getToken(3,'|', nIndex) == "hallo3", "test_OString error 40");
+
+ char* Tokens[10] = { "", "hallo1", "hallo2", "hallo3", "hallo4",
+ "hallo5", "hallo6", "hallo7", "hallo8", "" };
+
+ nIndex = 0;
+ sal_Int32 i = 0;
+ do
+ {
+ TEST_ENSURE( s8.getToken(0,'|',nIndex) == Tokens[i], "test_OString error 40e");
+ i++;
+ }
+ while ( nIndex >= 0 );
+
+ s7 = "";
+ s7 += s8;
+ TEST_ENSURE( s7 == s8, "test_OString error 41");
+
+ s7 = s8.replaceAt(8, 6, "mmmmmmmmmm");
+ TEST_ENSURE( s7.getLength() == 61, "test_OString error 42");
+
+ s8 = s7.replaceAt(8, 11, "");
+ TEST_ENSURE( s8.getLength() == 50, "test_OString error 43");
+
+ s7 = s8.replaceAt(8, 0, "hallo2|");
+ TEST_ENSURE( s7.getLength() == 57, "test_OString error 44");
+
+ sal_Int32 pos = 0;
+ while ((pos = s7.indexOf("|")) >= 0)
+ {
+ s8 = s7.replaceAt(pos, 1, "**");
+ s7 = s8;
+ }
+ TEST_ENSURE( s7.getLength() == 66, "test_OString error 45");
+
+ TEST_ENSURE( OString( "aaa" ).compareTo( OString( "bbb" ) ) < 0, "test_OString error 46" );
+ TEST_ENSURE( OString( "aaa" ).compareTo( OString( "aaa" ) ) == 0, "test_OString error 47" );
+ TEST_ENSURE( OString( "bbb" ).compareTo( OString( "aaa" ) ) > 0, "test_OString error 48" );
+ TEST_ENSURE( OString( "aaaa" ).compareTo( OString( "bbb" ) ) < 0, "test_OString error 49" );
+ TEST_ENSURE( OString( "aaa" ).compareTo( OString( "bbbb" ) ) < 0, "test_OString error 50" );
+ TEST_ENSURE( OString( "aaa" ).compareTo( OString( "aaaa" ) ) < 0, "test_OString error 51" );
+ TEST_ENSURE( OString( "aaaa" ).compareTo( OString( "aaa" ) ) > 0, "test_OString error 52" );
+ TEST_ENSURE( OString( "bbbb" ).compareTo( OString( "bbb" ) ) > 0, "test_OString error 53" );
+ TEST_ENSURE( OString( "bbb" ) == OString( "bbb" ), "test_OString error 54" );
+ TEST_ENSURE( OString( "bbb" ) == "bbb", "test_OString error 55" );
+
+/*
+ * As clarified in #104229#, calling copy with invalid arguments causes
+ * undefined behaviour, so the following test does no longer work:
+
+ s7 = "Hallo jetzt komm ich";
+ s8 = s7.copy(0, s7.indexOf(':'));
+ TEST_ENSURE( s8.getLength() == 0, "test_OString error 56");
+ TEST_ENSURE( s8.compareTo("") == 0, "test_OString error 57");
+*/
+
+ double f = OString("1.7e-10").toDouble();
+ TEST_ENSURE(f > 1E-10 && f < 2E-10, "1.7e-10 problem");
+ f = OString("1.7e+10").toDouble();
+ TEST_ENSURE(f > 1E10 && f < 2E10, "1.7e+10 problem");
+ f = OString("1.7e10").toDouble();
+ TEST_ENSURE(f > 1E10 && f < 2E10, "1.7e308 problem");
+
+ {
+ float f0 = 0;
+ float f1 = 1;
+ float fInf = f1 / f0;
+ OString aStr1(OString::valueOf(fInf));
+ OString aStr2("1.#INF");
+ bool bSuccess = aStr1 == aStr2;
+ if (!bSuccess)
+ printf("ERROR: OString::valueOf(1f/0f): %s\n", aStr1.getStr());
+ TEST_ENSURE(bSuccess, "OString::valueOf(1f/0f)");
+ }
+
+ printf("test_OString OK !!!\n");
+ return;
+}
+
+} // namespace rtl_OString
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_OString::oldtests, "rtl_OString" );
+
+// -----------------------------------------------------------------------------
+NOADDITIONAL;
+
diff --git a/sal/qa/rtl_strings/rtl_old_testowstring.cxx b/sal/qa/rtl_strings/rtl_old_testowstring.cxx
new file mode 100644
index 000000000000..6ab1aa0f87c5
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_old_testowstring.cxx
@@ -0,0 +1,421 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+// LLA:
+// this file is converted to use with testshl2
+// original was placed in sal/test/textenc.cxx
+
+
+// -----------------------------------------------------------------------------
+#include <string.h>
+#include <stdio.h>
+
+#ifdef UNX
+#include <wchar.h>
+#endif
+#ifdef OS2__00
+#include <wcstr.h>
+#endif
+
+// #ifndef _OSL_DIAGNOSE_H_
+// #include <osl/diagnose.h>
+// #endif
+
+#ifndef _RTL_USTRING_HXX
+#include <rtl/ustring.hxx>
+#endif
+
+#ifndef _RTL_STRING_HXX
+#include <rtl/string.hxx>
+#endif
+
+#include <rtl/locale.hxx>
+
+#include <testshl/simpleheader.hxx>
+
+#define TEST_ENSURE(c, m) CPPUNIT_ASSERT_MESSAGE((m), (c))
+// #if OSL_DEBUG_LEVEL > 0
+// #define TEST_ENSHURE(c, m) OSL_ENSURE(c, m)
+// #else
+// #define TEST_ENSHURE(c, m) OSL_VERIFY(c)
+// #endif
+
+using namespace rtl;
+
+// -----------------------------------------------------------------------------
+namespace rtl_OUString
+{
+ class oldtests : public CppUnit::TestFixture
+ {
+ public:
+ void test_OUString();
+ void test_OString2OUStringAndViceVersa();
+
+ CPPUNIT_TEST_SUITE( oldtests );
+ CPPUNIT_TEST( test_OUString );
+ CPPUNIT_TEST( test_OString2OUStringAndViceVersa );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+
+void oldtests::test_OUString()
+{
+ // "Mein erster RTL OUString\n"
+ // | | | | |
+ // Index 0 5 10 15 20
+ OUString s1(OUString::createFromAscii("Mein erster RTL OUString\n"));
+ TEST_ENSURE( s1 == OUString::createFromAscii("Mein erster RTL OUString\n"), "test_OWString error 1");
+ TEST_ENSURE( s1.getLength() == 25, "test_OWString error 2");
+
+ OUString s2 = s1;
+ TEST_ENSURE( s2[16] == (sal_Unicode)'O', "test_OWString error 3");
+ TEST_ENSURE( s2.equals(s1), "test_OWString error 4");
+ TEST_ENSURE( OUString( OUString::createFromAscii("hallo")) == OUString::createFromAscii( "hallo"), "test_OWString error 4");
+ TEST_ENSURE( s2.indexOf((sal_Unicode)'O') == 16, "test_OWString error 5");
+ TEST_ENSURE( s2.indexOf((sal_Unicode)'O', 5) == 16, "test_OWString error 5a");
+ TEST_ENSURE( s2.lastIndexOf((sal_Unicode)'r') == 20, "test_OWString error 6");
+ TEST_ENSURE( s2[20] == (sal_Unicode)'r', "test_OWString error 7");
+ TEST_ENSURE( s2[24] == (sal_Unicode)'\n', "test_OWString error 8");
+ TEST_ENSURE( s2.lastIndexOf((sal_Unicode)'\n') == 24, "test_OWString error 9");
+ TEST_ENSURE( s2.lastIndexOf((sal_Unicode)'M') == 0, "test_OWString error 10");
+ TEST_ENSURE( s2.lastIndexOf((sal_Unicode)'t', s2.getLength() - 8) == 8, "test_OWString error 9");
+
+
+ // "Mein erster RTL OUString ist ein String aus der RTL Library\n"
+ // | | | | | | | | | | | |
+ // Index 0 5 10 15 20 25 30 35 40 45 50 55
+ OUString s3 = s2.copy(0, s2.getLength() - 1);
+ OUString s4 = s3.concat( OUString::createFromAscii(" ist ein String aus der RTL Library\n") );
+ TEST_ENSURE( s4.getLength() == 60, "test_OWString error 11");
+
+ s1 = s4.copy(0, 39);
+ OUString s5;
+ s5 = s1 + OUString::createFromAscii( " aus der RTL Library\n" );
+ TEST_ENSURE( s5.compareTo(s4) == 0 , "test_OWString error 12");
+ TEST_ENSURE( s5.indexOf(OUString::createFromAscii("RTL")) == 12, "test_OWString error 13");
+ TEST_ENSURE( s5.lastIndexOf(OUString::createFromAscii("RTL")) == 48, "test_OWString error 13");
+
+ sal_Bool b = sal_False;
+ OUString s6 = s5.valueOf(b);
+// TEST_ENSURE( s6.compareTo(OUString::createFromAscii("False")) == 0, "test_OWString error 14");
+ s6 = s5.valueOf((sal_Unicode)'H');
+ TEST_ENSURE( s6.compareTo(OUString::createFromAscii("H")) == 0, "test_OWString error 15");
+ sal_Int32 n = 123456789L;
+ s6 = s5.valueOf(n);
+ TEST_ENSURE( s6.compareTo(OUString::createFromAscii("123456789")) == 0, "test_OWString error 16");
+
+#ifndef SAL_OS2
+#ifdef SAL_UNX
+ sal_Int64 m = -3223372036854775807LL;
+#elif defined(SAL_OS2)
+ sal_Int64 m;
+ sal_setInt64(&m, 3965190145L, -750499787L);
+#else
+ sal_Int64 m = -3223372036854775807;
+#endif
+ s6 = s5.valueOf(m);
+ TEST_ENSURE( s6.compareTo( OUString::createFromAscii( "-3223372036854775807" ) ) == 0, "test_OWString error 17");
+#endif
+
+// LLA: locale tests removed ::rtl::OLocale locale = ::rtl::OLocale::getDefault();
+// LLA: locale tests removed
+// LLA: locale tests removed OUString s61(OUString::createFromAscii("HaLLo"));
+// LLA: locale tests removed s61 = s61.toLowerCase(locale);
+// LLA: locale tests removed TEST_ENSURE( s61 == OUString::createFromAscii("hallo"), "test_OWString error 17a");
+// LLA: locale tests removed s61 = s61.toUpperCase();
+// LLA: locale tests removed TEST_ENSURE( s61 == OUString::createFromAscii("HALLO"), "test_OWString error 17b");
+// LLA: locale tests removed s61 = s61.toLowerCase();
+// LLA: locale tests removed TEST_ENSURE( s61 == OUString::createFromAscii("hallo"), "test_OWString error 17c");
+// LLA: locale tests removed
+// LLA: locale tests removed ::rtl::OLocale::setDefault( OUString::createFromAscii( "de" ), OUString::createFromAscii( "DE" ), OUString() );
+// LLA: locale tests removed locale = OLocale::getDefault();
+// LLA: locale tests removed
+// LLA: locale tests removed // AB, 24.3.2000, removed NAMESPACE_RTL(OLocale)::getENGLISH() and error 18
+// LLA: locale tests removed
+// LLA: locale tests removed OUString s7(OUString::createFromAscii("HaLLo"));
+// LLA: locale tests removed s7 = s7.toLowerCase(locale);
+// LLA: locale tests removed TEST_ENSURE( s7 == OUString::createFromAscii("hallo"), "test_OWString error 19");
+// LLA: locale tests removed s7 = s7.toUpperCase(locale);
+// LLA: locale tests removed TEST_ENSURE( s7 == OUString::createFromAscii("HALLO"), "test_OWString error 20");
+// LLA: locale tests removed
+// LLA: locale tests removed OUString s8(OUString::createFromAscii("HaLLo ICH BIn eIn "));
+// LLA: locale tests removed s8 += OUString::valueOf( (sal_Unicode)0xDF );
+// LLA: locale tests removed locale = OLocale::registerLocale( OUString::createFromAscii("tr"), OUString::createFromAscii("TR"), OUString());
+// LLA: locale tests removed s8 = s8.toLowerCase(locale);
+// LLA: locale tests removed s8 = s8.toUpperCase(locale);
+// LLA: locale tests removed TEST_ENSURE( s8 == OUString::createFromAscii("HALLO ICH BIN EIN SS"), "test_OWString error 21");
+// LLA: locale tests removed
+// LLA: locale tests removed s7 = OUString::createFromAscii("Hallo ich bIn ein I");
+// LLA: locale tests removed s7 = s8.toUpperCase(locale);
+// LLA: locale tests removed TEST_ENSURE( s7 != OUString::createFromAscii("HALLO ICH BIN EIN I"), "test_OWString error 21.b");
+
+ OUString s7;
+ OUString s8(OUString::createFromAscii("HALLO ICH BIN EIN SS"));
+ s7 = OUString::createFromAscii(" ");
+ s8 = s7 + s8 + OUString::createFromAscii(" " );
+ TEST_ENSURE( s8 == OUString::createFromAscii(" HALLO ICH BIN EIN SS "),
+ "test_OWString error 22");
+
+ s7 = s8.trim();
+ TEST_ENSURE( s7 == OUString::createFromAscii("HALLO ICH BIN EIN SS"), "test_OWString error 23");
+// TEST_ENSURE( wcscmp(s7.getStr(), L"HALLO ICH BIN EIN SS") == 0, "test_OWString error 24");
+
+ s7 = OUString::createFromAscii("Hallo");
+ s8 = OUString::createFromAscii("aber Hallo");
+
+ TEST_ENSURE( s7 < s8, "test_OWString error 25");
+ TEST_ENSURE( s8 > s7, "test_OWString error 26");
+ TEST_ENSURE( s7 != s8, "test_OWString error 27");
+ TEST_ENSURE( s7 != OUString::createFromAscii("blabla"), "test_OWString error 28");
+ TEST_ENSURE( OUString::createFromAscii("blabla") != s7, "test_OWString error 29");
+
+ s8 = OUString::createFromAscii("Hallo");
+ TEST_ENSURE( s7 <= s8, "test_OWString error 30");
+ TEST_ENSURE( s7 >= s8, "test_OwString error 31");
+
+ s8 = s8.replace((sal_Unicode)'l', (sal_Unicode)'r');
+ TEST_ENSURE( s8 == OUString::createFromAscii("Harro"), "test_OWString error 32");
+// LLA: len() unknown TEST_ENSURE( s8.len() == 5, "test_OWString error 33");
+
+ // "Ich bin ein String mit einem A und C und vielen m, m, m, m"
+ // | | | | | | | | | | | |
+ //index 0 5 10 15 20 25 30 35 40 45 50 55
+ s8 = OUString::createFromAscii("Ich bin ein String mit einem A und C und vielen m, m, m, m");
+// LLA: no matching TEST_ENSURE( s8.search((sal_Unicode)'I') == 0, "test_OWString error 34");
+// LLA: no matching TEST_ENSURE( s8.search((sal_Unicode)'A') == 29, "test_OWString error 35");
+// LLA: no matching s7 = OUString::createFromAscii("A und C");
+// LLA: no matching TEST_ENSURE( s8.search(s7) == 29, "test_OWString error 36");
+// LLA: no matching TEST_ENSURE( s8.search(OUString::createFromAscii("mit einem A")) == 19, "test_OWString error 37");
+// LLA: no matching
+// LLA: no matching s8 = OUString::createFromAscii("||token1|token2|token3||token4|token5||" );
+// LLA: no matching TEST_ENSURE( s8.getTokenCount('|') == 10, "test_OWString error 38a");
+// LLA: no matching TEST_ENSURE( s8.getToken(10,'|') == OUString(), "test_OWString error 39a");
+// LLA: no matching
+// LLA: no matching s8 = OUString::createFromAscii("token1");
+// LLA: no matching TEST_ENSURE( s8.getTokenCount('|') == 1, "test_OWString error 38b");
+// LLA: no matching TEST_ENSURE( s8.getToken(0,'|') == OUString::createFromAscii("token1"), "test_OWString error 39b");
+// LLA: no matching TEST_ENSURE( s8.getToken(-1,'|') == OUString(), "test_OWString error 39c");
+// LLA: no matching TEST_ENSURE( s8.getToken(1,'|') == OUString(), "test_OWString error 39d");
+// LLA: no matching
+// LLA: no matching s8 = OUString::createFromAscii("|hallo1|hallo2|hallo3|hallo4|hallo5|hallo6|hallo7|hallo8|");
+// LLA: no matching TEST_ENSURE( s8.getTokenCount((sal_Unicode)'|') == 10, "test_OWString error 38");
+// LLA: no matching TEST_ENSURE( s8.getToken(3, (sal_Unicode)'|') == OUString::createFromAscii("hallo3"), "test_OWString error 39");
+
+// LLA: removed due to the fact, this is not a clean test!
+
+// LLA: s7 = OUString();
+// LLA: s7 += s8;
+// LLA: TEST_ENSURE( s7 == s8, "test_OWString error 40");
+// LLA:
+// LLA: s7 = s8.replaceAt(8, 6, OUString::createFromAscii("mmmmmmmmmm"));
+// LLA: TEST_ENSURE( s7.getLength() == 61, "test_OWString error 41");
+// LLA:
+// LLA: s8 = s7.replaceAt(8, 11, OUString());
+// LLA: TEST_ENSURE( s8.getLength() == 50, "test_OWString error 42");
+// LLA:
+// LLA: s7 = s8.replaceAt(8, 0, OUString::createFromAscii("hallo2|"));
+// LLA: TEST_ENSURE( s7.getLength() == 57, "test_OWString error 43");
+// LLA:
+// LLA: sal_Int32 pos = 0;
+// LLA: while ((pos = s7.indexOf(OUString::createFromAscii("|"))) >= 0)
+// LLA: {
+// LLA: s8 = s7.replaceAt(pos, 1, OUString::createFromAscii("**"));
+// LLA: s7 = s8;
+// LLA: }
+// LLA: TEST_ENSURE( s7.getLength() == 66, "test_OWString error 44");
+
+ TEST_ENSURE( OUString::createFromAscii("aaa" ).compareTo( OUString::createFromAscii("bbb" ) ) < 0, "test_OWString error 46" );
+ TEST_ENSURE( OUString::createFromAscii("aaa" ).compareTo( OUString::createFromAscii("aaa" ) ) == 0, "test_OWString error 46" );
+ TEST_ENSURE( OUString::createFromAscii("bbb" ).compareTo( OUString::createFromAscii("aaa" ) ) > 0, "test_OWString error 47" );
+ TEST_ENSURE( OUString::createFromAscii("aaaa" ).compareTo( OUString::createFromAscii("bbb" ) ) < 0, "test_OWString error 48" );
+ TEST_ENSURE( OUString::createFromAscii("aaa" ).compareTo( OUString::createFromAscii("bbbb" ) ) < 0, "test_OWString error 49" );
+ TEST_ENSURE( OUString::createFromAscii("aaa" ).compareTo( OUString::createFromAscii("aaaa" ) ) < 0, "test_OWString error 50" );
+ TEST_ENSURE( OUString::createFromAscii("aaaa" ).compareTo( OUString::createFromAscii("aaa" ) ) > 0, "test_OWString error 51" );
+ TEST_ENSURE( OUString::createFromAscii("bbbb" ).compareTo( OUString::createFromAscii("bbb" ) ) > 0, "test_OWString error 52" );
+ TEST_ENSURE( OUString::createFromAscii("bbb" ) == OUString::createFromAscii("bbb" ), "test_OWString error 53" );
+ TEST_ENSURE( OUString::createFromAscii("bbb" ) == OUString::createFromAscii("bbb" ), "test_OWString error 54" );
+
+ {
+ OUString uStr = OUString::createFromAscii( "Hallo" );
+ TEST_ENSURE( uStr.compareTo( OUString::createFromAscii("Hallo"), 5 ) == 0, "test_OWString error 54.2.1" );
+ TEST_ENSURE( uStr.compareTo( OUString::createFromAscii("Halloa"), 6 ) < 0 , "test_OWString error 54.2.2" );
+ TEST_ENSURE( uStr.compareTo( OUString::createFromAscii("1Hallo"), 6 ) > 0, "test_OWString error 54.2.3" );
+ TEST_ENSURE( uStr.compareTo( OUString::createFromAscii("Aallo"), 5 ) > 0, "test_OWString error 54.2.4" );
+ TEST_ENSURE( uStr.compareTo( OUString::createFromAscii("Halla"), 5 ) > 0, "test_OWString error 54.2.5" );
+ TEST_ENSURE( uStr.compareTo( OUString::createFromAscii("Mallo"), 5 ) < 0, "test_OWString error 54.2.6" );
+ TEST_ENSURE( uStr.compareTo( OUString::createFromAscii("Hallp"), 5 ) < 0, "test_OWString error 54.2.7" );
+ }
+
+#if OSL_DEBUG_LEVEL == 0
+//YD will fail copy assert on indexes, because ':' returns -1
+ s7 = OUString::createFromAscii("Hallo jetzt komm ich");
+ s8 = s7.copy(0, s7.indexOf((sal_Unicode)':'));
+ TEST_ENSURE( s8.getLength() == 0, "test_OWString error 55");
+ TEST_ENSURE( s8.compareTo(OUString()) == 0, "test_OWString error 56");
+#endif
+
+ // ASCII-Schnittstellen, AB 15.10.1999
+
+ // "Ich bin ein reiner ASCII-String mit ein paar Zahlen 0123456789 und Zeichen"
+ // | | | | | | | | | | | | | | |
+ //index 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70
+ //
+ // "Ich bin ein weiterer ASCII-String"
+ // | | | | | | |
+ //index 0 5 10 15 20 25 30
+ sal_Char ascii_str1[] = "Ich bin ein reiner ASCII-String mit ein paar Zahlen 0123456789 und Zeichen";
+ sal_Char ascii_str2[] = "Ich bin ein weiterer ASCII-String";
+ OUString OWAsciiStr1 = OUString::createFromAscii( ascii_str1 );
+ sal_Int32 nLen1 = OWAsciiStr1.getLength();
+ TEST_ENSURE( nLen1 == 74, "test_OWString error 57" );
+ OUString OWAsciiStr2 = OUString::createFromAscii( ascii_str2 );
+ sal_Int32 nLen2 = OWAsciiStr2.getLength();
+ TEST_ENSURE( nLen2 == 33, "test_OWString error 58" );
+
+ sal_Int32 nCompareResult11 = OWAsciiStr1.compareToAscii( ascii_str1 );
+ TEST_ENSURE( nCompareResult11 == 0, "test_OWString error 59" );
+ sal_Int32 nCompareResult12 = OWAsciiStr1.compareToAscii( ascii_str2 );
+ TEST_ENSURE( nCompareResult12 < 0, "test_OWString error 60" );
+
+ sal_Int32 nCompareResult21 = OWAsciiStr2.compareToAscii( ascii_str1 );
+ TEST_ENSURE( nCompareResult21 > 0, "test_OWString error 61" );
+ sal_Int32 nCompareResult22 = OWAsciiStr2.compareToAscii( ascii_str2 );
+ TEST_ENSURE( nCompareResult22 == 0, "test_OWString error 62" );
+
+ sal_Int32 nCompareResult12_Len12 = OWAsciiStr1.compareToAscii( ascii_str2, 12 );
+ TEST_ENSURE( nCompareResult12_Len12 == 0, "test_OWString error 63" );
+ sal_Int32 nCompareResult12_Len13 = OWAsciiStr1.compareToAscii( ascii_str2, 13 );
+ TEST_ENSURE( nCompareResult12_Len13 < 0, "test_OWString error 64" );
+
+ sal_Int32 nCompareResult21_Len12 = OWAsciiStr2.compareToAscii( ascii_str1, 12 );
+ TEST_ENSURE( nCompareResult21_Len12 == 0, "test_OWString error 65" );
+ sal_Int32 nCompareResult21_Len13 = OWAsciiStr2.compareToAscii( ascii_str1, 13 );
+ TEST_ENSURE( nCompareResult21_Len13 > 0, "test_OWString error 66" );
+
+ {
+ OUString uStr = OUString::createFromAscii( "Hallo" );
+ TEST_ENSURE( uStr.equalsAsciiL( "Hallo", 5 ), "test_OWString error 66.1.1" );
+ TEST_ENSURE( !uStr.equalsAsciiL( "Hallo1", 6 ), "test_OWString error 66.1.2" );
+ TEST_ENSURE( !uStr.equalsAsciiL( "1Hallo", 6 ), "test_OWString error 66.1.3" );
+ TEST_ENSURE( !uStr.equalsAsciiL( "aallo", 5 ), "test_OWString error 66.1.2" );
+ TEST_ENSURE( !uStr.equalsAsciiL( "Halla", 5 ), "test_OWString error 66.1.3" );
+
+ TEST_ENSURE( uStr.reverseCompareToAsciiL( "Hallo", 5 ) == 0, "test_OWString error 66.2.1" );
+ TEST_ENSURE( uStr.reverseCompareToAsciiL( "Halloa", 6 ) > 0 , "test_OWString error 66.2.2" );
+ TEST_ENSURE( uStr.reverseCompareToAsciiL( "1Hallo", 6 ) < 0, "test_OWString error 66.2.3" );
+ TEST_ENSURE( uStr.reverseCompareToAsciiL( "Aallo", 5 ) > 0, "test_OWString error 66.2.4" );
+ TEST_ENSURE( uStr.reverseCompareToAsciiL( "Halla", 5 ) > 0, "test_OWString error 66.2.5" );
+ TEST_ENSURE( uStr.reverseCompareToAsciiL( "Mallo", 5 ) < 0, "test_OWString error 66.2.6" );
+ TEST_ENSURE( uStr.reverseCompareToAsciiL( "Hallp", 5 ) < 0, "test_OWString error 66.2.7" );
+ }
+
+ // toInt64
+ OUString s9( OUString::createFromAscii(" -3223372036854775807") );
+ sal_Int64 ln1 = s9.toInt64();
+#if (defined UNX) || (defined OS2)
+ TEST_ENSURE( ln1 == -3223372036854775807LL, "test_OWString error 67" );
+#else
+ TEST_ENSURE( ln1 == -3223372036854775807, "test_OWString error 67" );
+#endif
+ OUString s10( OUString::createFromAscii("13243A65f1H45") );
+ sal_Int64 ln2 = s10.toInt64();
+ TEST_ENSURE( ln2 == 13243, "test_OWString error 68" );
+
+ sal_Int64 ln3 = s10.toInt64( 16 );
+#if (defined UNX) || (defined OS2)
+ TEST_ENSURE( ln3 == 0x13243A65F1LL, "test_OWString error 69" );
+#else
+ TEST_ENSURE( ln3 == 0x13243A65F1, "test_OWString error 69" );
+#endif
+ // Exotic base
+ OUString s11( OUString::createFromAscii("H4A") );
+ sal_Int64 ln4 = s11.toInt64( 23 );
+ TEST_ENSURE( ln4 == 23*23*17 + 4 * 23 + 10, "test_OWString error 70" );
+
+ // toInt32
+ OUString s12( OUString::createFromAscii(" -220368507") );
+ sal_Int32 n1 = s12.toInt32();
+ TEST_ENSURE( n1 == -220368507, "test_OWString error 71" );
+
+ OUString s13( OUString::createFromAscii("4423A61H45") );
+ sal_Int64 n2 = s13.toInt32();
+ TEST_ENSURE( n2 == 4423, "test_OWString error 72" );
+
+ sal_Int64 n3 = s13.toInt64( 16 );
+ TEST_ENSURE( n3 == 0x4423A61, "test_OWString error 73" );
+
+// LLA: Value tests fails most the time, this is not a good test
+// LLA: double d = 1.23456781;
+// LLA: OUString sDouble = OUString::valueOf( d );
+// LLA: char str[] = "1.2345678099999999";
+// LLA: sal_Int32 nLength = sDouble.getLength();
+// LLA: TEST_ENSURE( nLength == strlen( str ), "test_OWString error 74" );
+// LLA: sal_Int32 nCompare = sDouble.compareToAscii( str );
+// LLA: TEST_ENSURE( nCompare == 0, "test_OWString error 75" );
+
+ printf("test_OWString OK !!!\n");
+ return;
+}
+
+// -----------------------------------------------------------------------------
+
+void oldtests::test_OString2OUStringAndViceVersa()
+{
+ OString s1("Hallo jetzt komm ich");
+ OUString u1 = OStringToOUString(s1, RTL_TEXTENCODING_MS_1252);
+ TEST_ENSURE( u1.equals(OUString::createFromAscii("Hallo jetzt komm ich")), "test_OString2OWStringAndViceVersa error 1" );
+ u1 = OStringToOUString(s1, RTL_TEXTENCODING_IBM_850);
+ TEST_ENSURE( u1.equals(OUString::createFromAscii("Hallo jetzt komm ich")), "test_OString2OWStringAndViceVersa error 2" );
+ u1 = OStringToOUString(s1, RTL_TEXTENCODING_ISO_8859_15);
+ TEST_ENSURE( u1.equals(OUString::createFromAscii("Hallo jetzt komm ich")), "test_OString2OWStringAndViceVersa error 3" );
+ u1 = OStringToOUString(s1, RTL_TEXTENCODING_ASCII_US);
+ TEST_ENSURE( u1.equals(OUString::createFromAscii("Hallo jetzt komm ich")), "test_OString2OWStringAndViceVersa error 4" );
+
+ OString s2 = OUStringToOString(u1, RTL_TEXTENCODING_MS_1252);
+ TEST_ENSURE( s2.equals("Hallo jetzt komm ich"), "test_OString2OWStringAndViceVersa error 5" );
+ s2 = OUStringToOString(u1, RTL_TEXTENCODING_IBM_850);
+ TEST_ENSURE( s2.equals("Hallo jetzt komm ich"), "test_OString2OWStringAndViceVersa error 6" );
+ s2 = OUStringToOString(u1, RTL_TEXTENCODING_ISO_8859_15);
+ TEST_ENSURE( s2.equals("Hallo jetzt komm ich"), "test_OString2OWStringAndViceVersa error 7" );
+ s2 = OUStringToOString(u1, RTL_TEXTENCODING_ASCII_US);
+ TEST_ENSURE( s2.equals("Hallo jetzt komm ich"), "test_OString2OWStringAndViceVersa error 8" );
+
+ printf("test_OString2OWStringAndViceVersa OK !!!\n");
+}
+
+} // namespace rtl_OUString
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_OUString::oldtests, "rtl_OUString" );
+
+// -----------------------------------------------------------------------------
+NOADDITIONAL;
+
+
diff --git a/sal/qa/rtl_strings/rtl_old_teststrbuf.cxx b/sal/qa/rtl_strings/rtl_old_teststrbuf.cxx
new file mode 100644
index 000000000000..ef04f3f60c38
--- /dev/null
+++ b/sal/qa/rtl_strings/rtl_old_teststrbuf.cxx
@@ -0,0 +1,269 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+// LLA:
+// this file is converted to use with testshl2
+// original was placed in sal/test/textenc.cxx
+
+
+// -----------------------------------------------------------------------------
+
+#include <string.h>
+#include <stdio.h>
+
+// #ifndef _OSL_DIAGNOSE_H_
+// #include <osl/diagnose.h>
+// #endif
+
+#ifndef _RTL_STRBUF_HXX
+#include <rtl/strbuf.hxx>
+#endif
+
+#ifndef _RTL_WSTRBUF_HXX
+#include <rtl/ustrbuf.hxx>
+#endif
+
+#include <testshl/simpleheader.hxx>
+
+using namespace rtl;
+
+#define TEST_ENSURE(c, m) CPPUNIT_ASSERT_MESSAGE((m), (c))
+
+// #if OSL_DEBUG_LEVEL > 0
+// #define TEST_ENSHURE(c, m) OSL_ENSURE(c, m)
+// #else
+// #define TEST_ENSHURE(c, m) OSL_VERIFY(c)
+// #endif
+
+// -----------------------------------------------------------------------------
+namespace rtl_OStringBuffer
+{
+ class oldtests : public CppUnit::TestFixture
+ {
+ public:
+ void test_OStringBuffer();
+
+ CPPUNIT_TEST_SUITE( oldtests );
+ CPPUNIT_TEST( test_OStringBuffer );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+
+void oldtests::test_OStringBuffer()
+{
+ // "Mein erster RTL OString\n"
+ // | | | | |
+ // Index 0 5 10 15 20
+ OString s1("Mein erster RTL OString\n");
+
+ OStringBuffer b1(s1);
+
+ TEST_ENSURE( b1.getCapacity() == 16 + s1.getLength(), "test_OStringBuffer error 1");
+
+ b1.insert(b1.getLength() - 1, "Buffer");
+ s1 = "Mein erster RTL OStringBuffer\n";
+ TEST_ENSURE( s1 == b1.getStr(), "test_OStringBuffer error 2");
+
+ b1.insert(b1.getLength() - 1, " ist viel zu gross fuer den alten Buffer");
+ TEST_ENSURE( b1.getCapacity() == b1.getLength(), "test_OStringBuffer error 3");
+
+ OStringBuffer b2(30);
+
+ s1 = "false";
+ sal_Bool b = sal_False;
+ b2.append(b);
+ TEST_ENSURE( s1 == b2.getStr(), "test_OStringBuffer error 4");
+
+ sal_Int32 n = 123456789L;
+ s1 += " 123456789";
+ b2.append(" ");
+ b2.append(n);
+ TEST_ENSURE( s1 == b2.getStr(), "test_OStringBuffer error 5");
+
+#ifndef SAL_OS2
+#ifdef SAL_UNX
+ sal_Int64 m = -3223372036854775807LL;
+#elif defined(SAL_OS2)
+ sal_Int64 m;
+ sal_setInt64(&m, 3965190145L, -750499787L);
+#else
+ sal_Int64 m = -3223372036854775807;
+#endif
+ s1 += " -3223372036854775807";
+ b2.append(" ");
+ b2.append(m);
+ TEST_ENSURE( s1 == b2.getStr(), "test_OStringBuffer error 6");
+#endif
+
+ OString s2(b2.makeStringAndClear());
+ TEST_ENSURE( s1 == s2, "test_OStringBuffer error 7");
+
+ b2.ensureCapacity(50);
+ TEST_ENSURE( b2.getCapacity() == 50, "test_OStringBuffer error 8");
+
+ b2.append("Hier fuege ich jetzt ein > <\n");
+ b2.insert(26, " Hallo");
+ s2 = "Hier fuege ich jetzt ein > Hallo <\n";
+ TEST_ENSURE( s2 == b2.getStr(), "test_OStringBuffer error 9");
+
+ b2.insert(26, b);
+ b2.insert(26, " ");
+ s2 = "Hier fuege ich jetzt ein > false Hallo <\n";
+ TEST_ENSURE( s2 == b2.getStr(), "test_OStringBuffer error 10");
+
+ b2.insert(26, n);
+ b2.insert(26, " ");
+ s2 = "Hier fuege ich jetzt ein > 123456789 false Hallo <\n";
+ TEST_ENSURE( s2 == b2.getStr(), "test_OStringBuffer error 11");
+
+#ifndef SAL_OS2
+ b2.insert(26, m);
+ b2.insert(26, " ");
+ s2 = "Hier fuege ich jetzt ein > -3223372036854775807 123456789 false Hallo <\n";
+ TEST_ENSURE( s2 == b2.getStr(), "test_OStringBuffer error 12");
+#endif
+
+ printf("test_OStringBuffer OK !!!\n");
+ return;
+}
+} // namespace rtl_OStringBuffer
+
+// -----------------------------------------------------------------------------
+
+namespace rtl_OUStringBuffer
+{
+ class oldtests : public CppUnit::TestFixture
+ {
+ public:
+ void test_OUStringBuffer();
+
+ CPPUNIT_TEST_SUITE( oldtests );
+ CPPUNIT_TEST( test_OUStringBuffer );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+
+void oldtests::test_OUStringBuffer()
+{
+ // "Mein erster RTL OUString\n"
+ // | | | | |
+ // Index 0 5 10 15 20
+ OUString s1(OUString::createFromAscii("Mein erster RTL OUString\n"));
+
+ OUStringBuffer b1(s1);
+
+ TEST_ENSURE( b1.getCapacity() == 16 + s1.getLength(), "test_OWStringBuffer error 1");
+
+ b1.insert(b1.getLength() - 1, OUString::createFromAscii("Buffer"));
+ s1 = OUString::createFromAscii("Mein erster RTL OUStringBuffer\n");
+ TEST_ENSURE( s1 == b1.getStr(), "test_OWStringBuffer error 2");
+
+ b1.insert(b1.getLength() - 1, OUString::createFromAscii(" ist viel zu gross fuer den alten Buffer"));
+ //TEST_ENSURE( b1.getCapacity() == b1.getLength(), "test_OWStringBuffer error 3");
+
+ OUStringBuffer b2(30);
+
+ s1 = OUString::createFromAscii("false");
+ sal_Bool b = sal_False;
+ b2.append(b);
+ TEST_ENSURE( s1 == b2.getStr(), "test_OWStringBuffer error 4");
+
+ sal_Int32 n = 123456789L;
+ s1 += OUString::createFromAscii(" 123456789");
+ b2.append(OUString::createFromAscii(" "));
+ b2.append(n);
+ TEST_ENSURE( s1 == b2.getStr(), "test_OWStringBuffer error 5");
+
+#ifndef SAL_OS2
+#ifdef SAL_UNX
+ sal_Int64 m = -3223372036854775807LL;
+#elif defined(SAL_OS2)
+ sal_Int64 m;
+ sal_setInt64(&m, 3965190145L, -750499787L);
+#else
+ sal_Int64 m = -3223372036854775807;
+#endif
+ s1 += OUString::createFromAscii(" -3223372036854775807");
+ b2.append(OUString::createFromAscii(" "));
+ b2.append(m);
+ TEST_ENSURE( s1 == b2.getStr(), "test_OWStringBuffer error 6");
+#endif
+
+ OUString s2(b2.makeStringAndClear());
+ TEST_ENSURE( s1 == s2, "test_OWStringBuffer error 7");
+
+ b2.ensureCapacity(50);
+ TEST_ENSURE( b2.getCapacity() == 50, "test_OWStringBuffer error 8");
+
+ b2.append(OUString::createFromAscii("Hier fuege ich jetzt ein > <\n"));
+ b2.insert(26, OUString::createFromAscii(" Hallo"));
+ s2 = OUString::createFromAscii("Hier fuege ich jetzt ein > Hallo <\n");
+ TEST_ENSURE( s2 == b2.getStr(), "test_OWStringBuffer error 9");
+
+ b2.insert(26, b);
+ b2.insert(26, OUString::createFromAscii(" "));
+ s2 = OUString::createFromAscii("Hier fuege ich jetzt ein > false Hallo <\n");
+ TEST_ENSURE( s2 == b2.getStr(), "test_OWStringBuffer error 10");
+
+ b2.insert(26, n);
+ b2.insert(26, OUString::createFromAscii(" "));
+ s2 = OUString::createFromAscii("Hier fuege ich jetzt ein > 123456789 false Hallo <\n");
+ TEST_ENSURE( s2 == b2.getStr(), "test_OWStringBuffer error 11");
+
+#ifndef SAL_OS2
+ b2.insert(26, m);
+ b2.insert(26, OUString::createFromAscii(" "));
+ s2 = OUString::createFromAscii("Hier fuege ich jetzt ein > -3223372036854775807 123456789 false Hallo <\n");
+ TEST_ENSURE( s2 == b2.getStr(), "test_OWStringBuffer error 12");
+#endif
+
+ // ASCII-Schnittstelle, AB 15.10.1999
+ OUString s3(OUString::createFromAscii("Noch'n RTL OUString"));
+ OUStringBuffer b3(s3);
+ sal_Char aAsciiStr[] = " mit appendetem ASCII\n";
+ b3.appendAscii( aAsciiStr );
+ s3 = OUString::createFromAscii("Noch'n RTL OUString mit appendetem ASCII\n");
+ TEST_ENSURE( b3.getStr() == s3 , "test_OWStringBuffer error 13");
+
+
+
+ printf("test_OWStringBuffer OK !!!\n");
+ return;
+}
+
+} // namespace rtl_OUStringBuffer
+
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_OUStringBuffer::oldtests, "rtl_OUStringBuffer" );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( rtl_OStringBuffer::oldtests, "rtl_OStringBuffer" );
+
+// -----------------------------------------------------------------------------
+NOADDITIONAL;
diff --git a/sal/qa/sal/makefile.mk b/sal/qa/sal/makefile.mk
new file mode 100644
index 000000000000..594eaa7d5ded
--- /dev/null
+++ b/sal/qa/sal/makefile.mk
@@ -0,0 +1,50 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ := ..$/..
+PRJNAME := sal
+TARGET := qa_sal
+
+ENABLE_EXCEPTIONS := TRUE
+
+.INCLUDE: settings.mk
+
+SHL1TARGET = $(TARGET)_types
+SHL1OBJS = $(SLO)$/test_types.obj
+SHL1STDLIBS = $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+SHL1VERSIONMAP = version.map
+SHL1IMPLIB = i$(SHL1TARGET)
+DEF1NAME = $(SHL1TARGET)
+
+SLOFILES = $(SHL1OBJS)
+
+.INCLUDE: target.mk
+
+ALLTAR: test
+
+test .PHONY: $(SHL1TARGETN)
+ testshl2 $(SHL1TARGETN)
diff --git a/sal/qa/sal/test_types.cxx b/sal/qa/sal/test_types.cxx
new file mode 100644
index 000000000000..e451fdaf9b26
--- /dev/null
+++ b/sal/qa/sal/test_types.cxx
@@ -0,0 +1,81 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "precompiled_sal.hxx"
+#include "sal/config.h"
+
+#include <cstddef>
+#include <stdio.h> // C99 snprintf not necessarily in <cstdio>
+#include <string.h> // wntmsci10 does not know <cstring> std::strcmp
+
+#include "testshl/simpleheader.hxx"
+#include "sal/types.h"
+
+namespace {
+
+template< typename T > void testPrintf(
+ char const * result, char const * format, T argument)
+{
+ std::size_t const bufsize = 1000;
+ char buf[bufsize];
+ int n = snprintf(buf, bufsize, format, argument);
+ CPPUNIT_ASSERT(n >= 0 && sal::static_int_cast< unsigned int >(n) < bufsize);
+ CPPUNIT_ASSERT(strcmp(buf, result) == 0);
+}
+
+class Test: public CppUnit::TestFixture {
+public:
+ void test();
+
+ CPPUNIT_TEST_SUITE(Test);
+ CPPUNIT_TEST(test);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void Test::test() {
+ testPrintf("-2147483648", "%" SAL_PRIdINT32, SAL_MIN_INT32);
+ testPrintf("4294967295", "%" SAL_PRIuUINT32, SAL_MAX_UINT32);
+ testPrintf("ffffffff", "%" SAL_PRIxUINT32, SAL_MAX_UINT32);
+ testPrintf("FFFFFFFF", "%" SAL_PRIXUINT32, SAL_MAX_UINT32);
+ testPrintf("-9223372036854775808", "%" SAL_PRIdINT64, SAL_MIN_INT64);
+ testPrintf("18446744073709551615", "%" SAL_PRIuUINT64, SAL_MAX_UINT64);
+ testPrintf("ffffffffffffffff", "%" SAL_PRIxUINT64, SAL_MAX_UINT64);
+ testPrintf("FFFFFFFFFFFFFFFF", "%" SAL_PRIXUINT64, SAL_MAX_UINT64);
+ testPrintf("123", "%" SAL_PRI_SIZET "u", static_cast< std::size_t >(123));
+ testPrintf(
+ "-123", "%" SAL_PRI_PTRDIFFT "d", static_cast< std::ptrdiff_t >(-123));
+ testPrintf("-123", "%" SAL_PRIdINTPTR, static_cast< sal_IntPtr >(-123));
+ testPrintf("123", "%" SAL_PRIuUINTPTR, static_cast< sal_uIntPtr >(123));
+ testPrintf("abc", "%" SAL_PRIxUINTPTR, static_cast< sal_uIntPtr >(0xabc));
+ testPrintf("ABC", "%" SAL_PRIXUINTPTR, static_cast< sal_uIntPtr >(0xabc));
+}
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(Test, "alltests");
+
+}
+
+NOADDITIONAL;
diff --git a/sal/qa/sal/version.map b/sal/qa/sal/version.map
new file mode 100644
index 000000000000..7321bbca16ad
--- /dev/null
+++ b/sal/qa/sal/version.map
@@ -0,0 +1,34 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+UDK_3_0_0 {
+ global:
+ registerAllTestFunction;
+
+ local:
+ *;
+};
diff --git a/sal/qa/systools/makefile.mk b/sal/qa/systools/makefile.mk
new file mode 100644
index 000000000000..af45f4fa50f0
--- /dev/null
+++ b/sal/qa/systools/makefile.mk
@@ -0,0 +1,70 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+INCPRE+= $(PRJ)$/qa$/inc
+
+PRJNAME=sal
+TARGET=test_comtools
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+CFLAGS+=/Ob0
+
+# BEGIN ----------------------------------------------------------------
+# auto generated Target:joblist by codegen.pl
+SHL1OBJS= \
+ $(SLO)$/test_comtools.obj
+
+SHL1TARGET= test_comtools
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB) uuid.lib
+
+SHL1IMPLIB= i$(SHL1TARGET)
+# SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME =$(SHL1TARGET)
+# DEF1EXPORTFILE= export.exp
+SHL1VERSIONMAP= $(PRJ)$/qa$/export.map
+# auto generated Target:joblist
+# END ------------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
+
diff --git a/sal/qa/systools/test_comtools.cxx b/sal/qa/systools/test_comtools.cxx
new file mode 100644
index 000000000000..e72d11ecfb7c
--- /dev/null
+++ b/sal/qa/systools/test_comtools.cxx
@@ -0,0 +1,250 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// autogenerated file with codegen.pl
+
+#include <testshl/simpleheader.hxx>
+#include <systools/win32/comtools.hxx>
+
+class COMObject : public IUnknown
+{
+public:
+ COMObject() : ref_count_(0)
+ {
+ }
+
+ ~COMObject()
+ {
+ }
+
+ ULONG __stdcall AddRef()
+ {
+ ref_count_++;
+ return ref_count_;
+ }
+
+ ULONG __stdcall Release()
+ {
+ ULONG cnt = --ref_count_;
+ if (cnt == 0)
+ delete this;
+ return cnt;
+ }
+
+ HRESULT __stdcall QueryInterface(REFIID riid, LPVOID* ppv)
+ {
+ if (riid == IID_IUnknown)
+ {
+ AddRef();
+ *ppv = this;
+ return S_OK;
+ }
+ return E_NOINTERFACE;
+ }
+
+ ULONG GetRefCount() const
+ {
+ return ref_count_;
+ }
+
+private:
+ ULONG ref_count_;
+};
+
+sal::systools::COMReference<IUnknown> comObjectSource()
+{
+ return sal::systools::COMReference<IUnknown>(new COMObject);
+}
+
+bool comObjectSink(sal::systools::COMReference<IUnknown> r, ULONG expectedRefCountOnReturn)
+{
+ r = sal::systools::COMReference<IUnknown>();
+ COMObject* p = reinterpret_cast<COMObject*>(r.get());
+ if (p)
+ return (p->GetRefCount() == expectedRefCountOnReturn);
+ else
+ return (0 == expectedRefCountOnReturn);
+}
+
+void comObjectSource2(LPVOID* ppv)
+{
+ COMObject* p = new COMObject;
+ p->AddRef();
+ *ppv = p;
+}
+
+namespace test_comtools
+{
+
+ class test_COMReference : public CppUnit::TestFixture
+ {
+
+ public:
+ /// test of COMReference<IUnknown> r;
+ void default_ctor()
+ {
+ sal::systools::COMReference<IUnknown> r;
+ CPPUNIT_ASSERT_MESSAGE("COMReference should be empty", r.get() == NULL);
+ }
+
+ void test_ctor_manual_AddRef()
+ {
+ COMObject* p = new COMObject;
+ p->AddRef();
+ sal::systools::COMReference<IUnknown> r(p, false);
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 1 is expected", reinterpret_cast<COMObject*>(r.get())->GetRefCount() == 1);
+ }
+
+ void test_copy_ctor()
+ {
+ sal::systools::COMReference<IUnknown> r(comObjectSource());
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 1 is expected", reinterpret_cast<COMObject*>(r.get())->GetRefCount() == 1);
+ }
+
+ void test_copy_assignment()
+ {
+ sal::systools::COMReference<IUnknown> r;
+ CPPUNIT_ASSERT_MESSAGE("COMReference should be empty", r.get() == NULL);
+
+ r = comObjectSource();
+ CPPUNIT_ASSERT_MESSAGE("COMReference should be empty", r.get() != NULL);
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 1 is expected", reinterpret_cast<COMObject*>(r.get())->GetRefCount() == 1);
+ }
+
+ void test_ref_to_ref_assignment()
+ {
+ sal::systools::COMReference<IUnknown> r1 = comObjectSource();
+ sal::systools::COMReference<IUnknown> r2 = r1;
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 2 is expected", reinterpret_cast<COMObject*>(r2.get())->GetRefCount() == 2);
+ }
+
+ void test_pointer_to_ref_assignment()
+ {
+ sal::systools::COMReference<IUnknown> r;
+ r = new COMObject;
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 1 is expected", reinterpret_cast<COMObject*>(r.get())->GetRefCount() == 1);
+ }
+
+ void test_pointer_to_ref_assignment2()
+ {
+ sal::systools::COMReference<IUnknown> r = comObjectSource();
+ r = new COMObject;
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 1 is expected", reinterpret_cast<COMObject*>(r.get())->GetRefCount() == 1);
+ }
+
+ void test_source_sink()
+ {
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count, 0 is expected", comObjectSink(comObjectSource(), 0));
+ }
+
+ void test_address_operator()
+ {
+ sal::systools::COMReference<IUnknown> r;
+ comObjectSource2(reinterpret_cast<LPVOID*>(&r));
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count, 1 is expected", reinterpret_cast<COMObject*>(r.get())->GetRefCount() == 1);
+ }
+
+ void test_address_operator2()
+ {
+ sal::systools::COMReference<IUnknown> r1 = comObjectSource();
+ sal::systools::COMReference<IUnknown> r2 = r1;
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 2 is expected", reinterpret_cast<COMObject*>(r2.get())->GetRefCount() == 2);
+ comObjectSource2(reinterpret_cast<LPVOID*>(&r1));
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 1 is expected", reinterpret_cast<COMObject*>(r1.get())->GetRefCount() == 1);
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 1 is expected", reinterpret_cast<COMObject*>(r2.get())->GetRefCount() == 1);
+ }
+
+ void test_clear()
+ {
+ sal::systools::COMReference<IUnknown> r = comObjectSource();
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count 1 is expected", reinterpret_cast<COMObject*>(r.get())->GetRefCount() == 1);
+ r.clear();
+ CPPUNIT_ASSERT_MESSAGE("Expect reference to be empty", !r.is());
+ }
+
+ void test_query_interface()
+ {
+ try
+ {
+ sal::systools::COMReference<IUnknown> r1 = comObjectSource();
+ sal::systools::COMReference<IUnknown> r2 = r1.QueryInterface<IUnknown>(IID_IUnknown);
+ CPPUNIT_ASSERT_MESSAGE("Wrong reference count, 2 is expected", reinterpret_cast<COMObject*>(r2.get())->GetRefCount() == 2);
+ }
+ catch(sal::systools::ComError& ex)
+ {
+ CPPUNIT_ASSERT_MESSAGE("Exception should not have been thrown", false);
+ }
+ }
+
+ void test_query_interface_throw()
+ {
+ try
+ {
+ sal::systools::COMReference<IUnknown> r1 = comObjectSource();
+ sal::systools::COMReference<IPersistFile> r2 = r1.QueryInterface<IPersistFile>(IID_IPersistFile);
+ }
+ catch(sal::systools::ComError& ex)
+ {
+ return;
+ }
+ CPPUNIT_ASSERT_MESSAGE("Exception should have been thrown", false);
+ }
+
+ // Change the following lines only, if you add, remove or rename
+ // member functions of the current class,
+ // because these macros are need by auto register mechanism.
+
+ CPPUNIT_TEST_SUITE(test_COMReference);
+ CPPUNIT_TEST(default_ctor);
+ CPPUNIT_TEST(test_ctor_manual_AddRef);
+ CPPUNIT_TEST(test_copy_ctor);
+ CPPUNIT_TEST(test_copy_assignment);
+ CPPUNIT_TEST(test_ref_to_ref_assignment);
+ CPPUNIT_TEST(test_pointer_to_ref_assignment);
+ CPPUNIT_TEST(test_pointer_to_ref_assignment2);
+ CPPUNIT_TEST(test_source_sink);
+ CPPUNIT_TEST(test_address_operator);
+ CPPUNIT_TEST(test_address_operator2);
+ CPPUNIT_TEST(test_clear);
+ CPPUNIT_TEST(test_query_interface);
+ CPPUNIT_TEST(test_query_interface_throw);
+ CPPUNIT_TEST_SUITE_END();
+ };
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(test_comtools::test_COMReference, "test_comtools");
+
+} // namespace rtl_OUString
+
+
+// this macro creates an empty function, which will called by the RegisterAllFunctions()
+// to let the user the possibility to also register some functions by hand.
+NOADDITIONAL;
+
diff --git a/sal/qa/testHelperFunctions/makefile.mk b/sal/qa/testHelperFunctions/makefile.mk
new file mode 100644
index 000000000000..4bdc0bda3a11
--- /dev/null
+++ b/sal/qa/testHelperFunctions/makefile.mk
@@ -0,0 +1,63 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=sal
+TARGET=qa_testHelperFunctions
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- BEGIN --------------------------------------------------------
+SHL1OBJS= \
+ $(SLO)$/testHelperFunctions.obj \
+ $(SLO)$/testHelperFunctions2.obj
+
+SHL1TARGET= testHelperFunctions
+SHL1STDLIBS= $(SALLIB) $(CPPUNITLIB) $(TESTSHL2LIB)
+
+SHL1IMPLIB= i$(SHL1TARGET)
+DEF1NAME =$(SHL1TARGET)
+SHL1VERSIONMAP = $(PRJ)$/qa$/export.map
+
+# END --------------------------------------------------------------
+
+#------------------------------- All object files -------------------------------
+# do this here, so we get right dependencies
+# SLOFILES=$(SHL1OBJS)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+.INCLUDE : _cppunit.mk
diff --git a/sal/qa/testHelperFunctions/testHelperFunctions.cxx b/sal/qa/testHelperFunctions/testHelperFunctions.cxx
new file mode 100644
index 000000000000..dd99c1396132
--- /dev/null
+++ b/sal/qa/testHelperFunctions/testHelperFunctions.cxx
@@ -0,0 +1,454 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// This is a test of helperfunctions
+
+#include <osl/time.h>
+#include <osl/thread.hxx>
+
+#include "stringhelper.hxx"
+
+#include <testshl/simpleheader.hxx>
+
+// void isJaBloed()
+// {
+// t_print("Ist ja echt bloed.\n");
+// }
+
+inline sal_Int64 t_abs64(sal_Int64 _nValue)
+{
+ // std::abs() seems to have some ambiguity problems (so-texas)
+ // return abs(_nValue);
+ t_print("t_abs64(%ld)\n", _nValue);
+ // CPPUNIT_ASSERT(_nValue < 2147483647);
+
+ if (_nValue < 0)
+ {
+ _nValue = -_nValue;
+ }
+ return _nValue;
+}
+
+void t_print64(sal_Int64 n)
+{
+ if (n < 0)
+ {
+ // negativ
+ printf("-");
+ n = -n;
+ }
+ if (n > 2147483647)
+ {
+ sal_Int64 n64 = n >> 32;
+ sal_uInt32 n32 = n64 & 0xffffffff;
+ printf("0x%.8x ", n32);
+ n32 = n & 0xffffffff;
+ printf("%.8x (64bit)", n32);
+ }
+ else
+ {
+ sal_uInt32 n32 = n & 0xffffffff;
+ printf("0x%.8x (32bit) ", n32);
+ }
+ printf("\n");
+}
+
+// -----------------------------------------------------------------------------
+namespace testOfHelperFunctions
+{
+ class test_t_abs64 : public CppUnit::TestFixture
+ {
+ public:
+ void test0();
+ void test1_0();
+ void test1();
+ void test1_1();
+ void test2();
+ void test3();
+ void test4();
+
+ CPPUNIT_TEST_SUITE( test_t_abs64 );
+ CPPUNIT_TEST( test0 );
+ CPPUNIT_TEST( test1_0 );
+ CPPUNIT_TEST( test1 );
+ CPPUNIT_TEST( test1_1 );
+ CPPUNIT_TEST( test2 );
+ CPPUNIT_TEST( test3 );
+ CPPUNIT_TEST( test4 );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+ void test_t_abs64::test0()
+ {
+ // this values has an overrun!
+ sal_Int32 n32 = 2147483648;
+ t_print("n32 should be -2^31 is: %d\n", n32);
+ CPPUNIT_ASSERT_MESSAGE("n32!=2147483648", n32 == -2147483648 );
+ }
+
+
+ void test_t_abs64::test1_0()
+ {
+ sal_Int64 n;
+ n = 1073741824;
+ n <<= 9;
+ t_print("Value of n is ");
+ t_print64(n);
+ CPPUNIT_ASSERT_MESSAGE("n=2^30 << 9", t_abs64(n) > 0 );
+ }
+
+ void test_t_abs64::test1()
+ {
+ sal_Int64 n;
+ n = 2147483648 << 8;
+ t_print("Value of n is ");
+ t_print64(n);
+ CPPUNIT_ASSERT_MESSAGE("n=2^31 << 8", t_abs64(n) > 0 );
+ }
+ void test_t_abs64::test1_1()
+ {
+ sal_Int64 n;
+ n = sal_Int64(2147483648) << 8;
+ t_print("Value of n is ");
+ t_print64(n);
+ CPPUNIT_ASSERT_MESSAGE("n=2^31 << 8", t_abs64(n) > 0 );
+ }
+
+ void test_t_abs64::test2()
+ {
+ sal_Int64 n;
+ n = 2147483648 << 1;
+ t_print("Value of n is ");
+ t_print64(n);
+
+ CPPUNIT_ASSERT_MESSAGE("(2147483648 << 1) is != 0", n != 0 );
+
+ sal_Int64 n2 = 2147483648 * 2;
+ CPPUNIT_ASSERT_MESSAGE("2147483648 * 2 is != 0", n2 != 0 );
+
+ sal_Int64 n3 = 4294967296LL;
+ CPPUNIT_ASSERT_MESSAGE("4294967296 is != 0", n3 != 0 );
+
+ CPPUNIT_ASSERT_MESSAGE("n=2^31 << 1, n2 = 2^31 * 2, n3 = 2^32, all should equal!", n == n2 && n == n3 );
+ }
+
+
+ void test_t_abs64::test3()
+ {
+ sal_Int64 n = 0;
+ CPPUNIT_ASSERT_MESSAGE("n=0", t_abs64(n) == 0 );
+
+ n = 1;
+ CPPUNIT_ASSERT_MESSAGE("n=1", t_abs64(n) > 0 );
+
+ n = 2147483647;
+ CPPUNIT_ASSERT_MESSAGE("n=2^31 - 1", t_abs64(n) > 0 );
+
+ n = 2147483648;
+ CPPUNIT_ASSERT_MESSAGE("n=2^31", t_abs64(n) > 0 );
+ }
+
+ void test_t_abs64::test4()
+ {
+ sal_Int64 n = 0;
+ n = -1;
+ t_print("Value of n is -1 : ");
+ t_print64(n);
+ CPPUNIT_ASSERT_MESSAGE("n=-1", t_abs64(n) > 0 );
+
+ n = -2147483648;
+ t_print("Value of n is -2^31 : ");
+ t_print64(n);
+ CPPUNIT_ASSERT_MESSAGE("n=-2^31", t_abs64(n) > 0 );
+
+ n = -8589934592LL;
+ t_print("Value of n is -2^33 : ");
+ t_print64(n);
+ CPPUNIT_ASSERT_MESSAGE("n=-2^33", t_abs64(n) > 0 );
+ }
+
+
+// -----------------------------------------------------------------------------
+ class test_t_print : public CppUnit::TestFixture
+ {
+ public:
+ void t_print_001();
+
+ CPPUNIT_TEST_SUITE( test_t_print );
+ CPPUNIT_TEST( t_print_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+ void test_t_print::t_print_001( )
+ {
+ t_print("This is only a test of some helper functions\n");
+ sal_Int32 nValue = 12345;
+ t_print("a value %d (should be 12345)\n", nValue);
+
+ rtl::OString sValue("foo bar");
+ t_print("a String '%s' (should be 'foo bar')\n", sValue.getStr());
+
+ rtl::OUString suValue(rtl::OUString::createFromAscii("a unicode string"));
+ sValue <<= suValue;
+ t_print("a String '%s'\n", sValue.getStr());
+ }
+
+
+ class StopWatch
+ {
+ TimeValue m_aStartTime;
+ TimeValue m_aEndTime;
+ bool m_bStarted;
+ public:
+ StopWatch()
+ :m_bStarted(false)
+ {
+ }
+
+ void start()
+ {
+ m_bStarted = true;
+ osl_getSystemTime(&m_aStartTime);
+ }
+ void stop()
+ {
+ osl_getSystemTime(&m_aEndTime);
+ OSL_ENSURE(m_bStarted, "Not Started.");
+ m_bStarted = false;
+ }
+ rtl::OString makeTwoDigits(rtl::OString const& _sStr)
+ {
+ rtl::OString sBack;
+ if (_sStr.getLength() == 0)
+ {
+ sBack = "00";
+ }
+ else
+ {
+ if (_sStr.getLength() == 1)
+ {
+ sBack = "0" + _sStr;
+ }
+ else
+ {
+ sBack = _sStr;
+ }
+ }
+ return sBack;
+ }
+ rtl::OString makeThreeDigits(rtl::OString const& _sStr)
+ {
+ rtl::OString sBack;
+ if (_sStr.getLength() == 0)
+ {
+ sBack = "000";
+ }
+ else
+ {
+ if (_sStr.getLength() == 1)
+ {
+ sBack = "00" + _sStr;
+ }
+ else
+ {
+ if (_sStr.getLength() == 2)
+ {
+ sBack = "0" + _sStr;
+ }
+ else
+ {
+ sBack = _sStr;
+ }
+ }
+ }
+ return sBack;
+ }
+
+ void showTime(const rtl::OString & aWhatStr)
+ {
+ OSL_ENSURE(!m_bStarted, "Not Stopped.");
+
+ sal_Int32 nSeconds = m_aEndTime.Seconds - m_aStartTime.Seconds;
+ sal_Int32 nNanoSec = sal_Int32(m_aEndTime.Nanosec) - sal_Int32(m_aStartTime.Nanosec);
+ // printf("Seconds: %d Nanosec: %d ", nSeconds, nNanoSec);
+ if (nNanoSec < 0)
+ {
+ nNanoSec = 1000000000 + nNanoSec;
+ nSeconds--;
+ // printf(" NEW Seconds: %d Nanosec: %d\n", nSeconds, nNanoSec);
+ }
+
+ rtl::OString aStr = "Time for ";
+ aStr += aWhatStr;
+ aStr += " ";
+ aStr += makeTwoDigits(rtl::OString::valueOf(nSeconds / 3600));
+ aStr += ":";
+ aStr += makeTwoDigits(rtl::OString::valueOf((nSeconds % 3600) / 60));
+ aStr += ":";
+ aStr += makeTwoDigits(rtl::OString::valueOf((nSeconds % 60)));
+ aStr += ":";
+ aStr += makeThreeDigits(rtl::OString::valueOf((nNanoSec % 1000000000) / 1000000));
+ aStr += ":";
+ aStr += makeThreeDigits(rtl::OString::valueOf((nNanoSec % 1000000) / 1000));
+ aStr += ":";
+ aStr += makeThreeDigits(rtl::OString::valueOf((nNanoSec % 1000)));
+
+ printf("%s\n", aStr.getStr());
+ // cout << aStr.getStr() << endl;
+ }
+
+ };
+
+static sal_Bool isEqualTimeValue ( const TimeValue* time1, const TimeValue* time2)
+{
+ if( time1->Seconds == time2->Seconds &&
+ time1->Nanosec == time2->Nanosec)
+ return sal_True;
+ else
+ return sal_False;
+}
+
+static sal_Bool isGreaterTimeValue( const TimeValue* time1, const TimeValue* time2)
+{
+ sal_Bool retval= sal_False;
+ if ( time1->Seconds > time2->Seconds)
+ retval= sal_True;
+ else if ( time1->Seconds == time2->Seconds)
+ {
+ if( time1->Nanosec > time2->Nanosec)
+ retval= sal_True;
+ }
+ return retval;
+}
+
+static sal_Bool isGreaterEqualTimeValue( const TimeValue* time1, const TimeValue* time2)
+{
+ if( isEqualTimeValue( time1, time2) )
+ return sal_True;
+ else if( isGreaterTimeValue( time1, time2))
+ return sal_True;
+ else
+ return sal_False;
+}
+
+bool isBTimeGreaterATime(TimeValue const& A, TimeValue const& B)
+{
+ if (B.Seconds > A.Seconds) return true;
+ if (B.Nanosec > A.Nanosec) return true;
+
+ // lower or equal
+ return false;
+}
+ // -----------------------------------------------------------------------------
+
+
+ class test_TimeValues : public CppUnit::TestFixture
+ {
+ public:
+
+ void t_time1();
+ void t_time2();
+ void t_time3();
+
+ CPPUNIT_TEST_SUITE( test_TimeValues );
+ CPPUNIT_TEST( t_time1 );
+ CPPUNIT_TEST( t_time2 );
+ CPPUNIT_TEST( t_time3 );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+void test_TimeValues::t_time1()
+{
+ StopWatch aWatch;
+ aWatch.start();
+ TimeValue aTimeValue={3,0};
+ osl::Thread::wait(aTimeValue);
+ aWatch.stop();
+ aWatch.showTime("Wait for 3 seconds");
+}
+
+void test_TimeValues::t_time2()
+{
+ t_print("Wait repeats 20 times.\n");
+ int i=0;
+ while(i++<20)
+ {
+ StopWatch aWatch;
+ aWatch.start();
+ TimeValue aTimeValue={0,1000 * 1000 * 500};
+ osl::Thread::wait(aTimeValue);
+ aWatch.stop();
+ aWatch.showTime("wait for 500msec");
+ }
+}
+
+void test_TimeValues::t_time3()
+{
+ t_print("Wait repeats 100 times.\n");
+ int i=0;
+ while(i++<20)
+ {
+ StopWatch aWatch;
+ aWatch.start();
+ TimeValue aTimeValue={0,1000*1000*100};
+ osl::Thread::wait(aTimeValue);
+ aWatch.stop();
+ aWatch.showTime("wait for 100msec");
+ }
+}
+
+ // void demoTimeValue()
+ // {
+ // TimeValue aStartTime, aEndTime;
+ // osl_getSystemTime(&aStartTime);
+ // // testSession(xORB, false);
+ // osl_getSystemTime(&aEndTime);
+ //
+ // sal_Int32 nSeconds = aEndTime.Seconds - aStartTime.Seconds;
+ // sal_Int32 nNanoSec = aEndTime.Nanosec - aStartTime.Nanosec;
+ // if (nNanoSec < 0)
+ // {
+ // nNanoSec = 1000000000 - nNanoSec;
+ // nSeconds++;
+ // }
+ //
+ // // cout << "Time: " << nSeconds << ". " << nNanoSec << endl;
+ // }
+
+
+} // namespace testOfHelperFunctions
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( testOfHelperFunctions::test_t_print, "helperFunctions" );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( testOfHelperFunctions::test_t_abs64, "helperFunctions" );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( testOfHelperFunctions::test_TimeValues, "helperFunctions" );
+
+// -----------------------------------------------------------------------------
+NOADDITIONAL;
diff --git a/sal/qa/testHelperFunctions/testHelperFunctions2.cxx b/sal/qa/testHelperFunctions/testHelperFunctions2.cxx
new file mode 100644
index 000000000000..e95a6aee892b
--- /dev/null
+++ b/sal/qa/testHelperFunctions/testHelperFunctions2.cxx
@@ -0,0 +1,61 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <testshl/simpleheader.hxx>
+#include "stringhelper.hxx"
+
+namespace testOfHelperFunctions
+{
+ class test_valueequal : public CppUnit::TestFixture
+ {
+ public:
+ void valueequal_001();
+
+ CPPUNIT_TEST_SUITE( test_valueequal );
+ CPPUNIT_TEST( valueequal_001 );
+ CPPUNIT_TEST_SUITE_END( );
+ };
+
+ void test_valueequal::valueequal_001( )
+ {
+ rtl::OString sValue;
+ rtl::OUString suValue(rtl::OUString::createFromAscii("This is only a test of some helper functions"));
+ sValue <<= suValue;
+ t_print("'%s'\n", sValue.getStr());
+ }
+
+} // namespace testOfHelperFunctions
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( testOfHelperFunctions::test_valueequal, "helperFunctions" );
+
+// -----------------------------------------------------------------------------
+// This is only allowed to be in one file!
+// NOADDITIONAL;
diff --git a/sal/rtl/source/alloc.c b/sal/rtl/source/alloc.c
new file mode 100644
index 000000000000..44b37c255004
--- /dev/null
+++ b/sal/rtl/source/alloc.c
@@ -0,0 +1,1541 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifdef PROFILE
+#undef OSL_DEBUG_LEVEL
+#define OSL_DEBUG_LEVEL 0
+#endif /* PROFILE */
+
+#include <sal/types.h>
+#include <osl/diagnose.h>
+#include <rtl/alloc.h>
+
+#ifndef INCLUDED_STDDEF_H
+#include <stddef.h>
+#define INCLUDED_STDDEF_H
+#endif
+
+#ifndef INCLUDED_STDLIB_H
+#include <stdlib.h>
+#define INCLUDED_STDLIB_H
+#endif
+
+#ifndef INCLUDED_STRING_H
+#include <string.h>
+#define INCLUDED_STRING_H
+#endif
+
+#ifndef FORCE_SYSALLOC
+
+/*===========================================================================
+ *
+ * rtl_memory (UNX) internals.
+ *
+ *=========================================================================*/
+#ifdef SAL_UNX
+
+#include <unistd.h>
+#include <pthread.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+
+typedef pthread_mutex_t mutex_type;
+
+#define RTL_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+#define RTL_MUTEX_ACQUIRE(a) pthread_mutex_lock((a))
+#define RTL_MUTEX_RELEASE(a) pthread_mutex_unlock((a))
+
+#if defined(FREEBSD) || defined(NETBSD) || defined(MACOSX)
+static sal_Size __rtl_memory_vmpagesize (void)
+{
+ /* xBSD */
+ return (sal_Size)(getpagesize());
+}
+#elif defined(LINUX) || defined(SOLARIS)
+static sal_Size __rtl_memory_vmpagesize (void)
+{
+ /* POSIX */
+ return (sal_Size)(sysconf(_SC_PAGESIZE));
+}
+#else
+static sal_Size __rtl_memory_vmpagesize (void)
+{
+ /* other */
+ return (sal_Size)(0x2000);
+}
+#endif /* FREEBSD || NETBSD || MACOSX || LINUX || SOLARIS */
+
+#ifndef PROT_HEAP
+#define PROT_HEAP (PROT_READ | PROT_WRITE | PROT_EXEC)
+#endif
+
+/* #95880# building on Solaris 8 provides MAP_ANON, but it
+ is not available on Solaris 7 */
+#if defined (SOLARIS)
+#ifdef MAP_ANON
+#undef MAP_ANON
+#endif
+#endif
+
+#ifndef MAP_ANON
+static void* __rtl_memory_vmalloc (sal_Size n)
+{
+ /* SYSV */
+ int fd = open("/dev/zero", O_RDWR);
+ if (!(fd < 0))
+ {
+ void * p = mmap(NULL, n, PROT_HEAP, MAP_PRIVATE, fd, 0);
+ close(fd);
+ return ((p == MAP_FAILED) ? NULL : p);
+ }
+ return (NULL);
+}
+#else /* MAP_ANON */
+static void* __rtl_memory_vmalloc (sal_Size n)
+{
+ /* xBSD */
+ void * p = mmap(NULL, n, PROT_HEAP, MAP_PRIVATE | MAP_ANON, -1, 0);
+ return ((p == MAP_FAILED) ? NULL : p);
+}
+#endif /* MAP_ANON */
+
+#define RTL_MEMORY_ALLOC(n) __rtl_memory_vmalloc((sal_Size)(n))
+#define RTL_MEMORY_FREE(p, n) munmap((void*)(p), (sal_Size)(n))
+
+#endif /* SAL_UNX */
+
+/*===========================================================================
+ *
+ * rtl_memory (W32) internals.
+ *
+ *=========================================================================*/
+#ifdef SAL_W32
+
+#define WIN32_LEAN_AND_MEAN
+#ifdef _MSC_VER
+#pragma warning(push,1) /* disable warnings within system headers */
+#endif
+#include <windows.h>
+#include <wchar.h>
+
+typedef CRITICAL_SECTION mutex_type;
+
+/* Static initializer (struct declared in WINNT.H). */
+#define RTL_MUTEX_INITIALIZER { NULL, -1, 0, NULL, NULL, 0 }
+
+/*
+ * __rtl_mutex_init (dynamic initialization).
+ *
+ * Static initialization (with DebugInfo == NULL)
+ * leads to Access Violation upon first contention.
+ */
+static void __rtl_mutex_init (LPCRITICAL_SECTION lpCriticalSection)
+{
+ static LONG g_spinlock = 0;
+
+ while (InterlockedExchange (&g_spinlock, 1) == 1)
+ {
+ /* Already locked, spin */
+ Sleep (0);
+ }
+ if (!(lpCriticalSection->DebugInfo))
+ {
+ /* Dynamic initialization */
+ InitializeCriticalSection (lpCriticalSection);
+ }
+ InterlockedExchange (&g_spinlock, 0);
+}
+
+#define RTL_MUTEX_INIT(a) __rtl_mutex_init((LPCRITICAL_SECTION)(a))
+#define RTL_MUTEX_ACQUIRE(a) EnterCriticalSection((a))
+#define RTL_MUTEX_RELEASE(a) LeaveCriticalSection((a))
+
+static sal_Size __rtl_memory_vmpagesize (void)
+{
+ SYSTEM_INFO info;
+ GetSystemInfo (&info);
+ return ((sal_Size)(info.dwPageSize));
+}
+
+#define RTL_MEMORY_ALLOC(n) \
+(void*)(VirtualAlloc (NULL, (SIZE_T)(n), MEM_COMMIT, PAGE_READWRITE))
+
+#define RTL_MEMORY_FREE(p, n) \
+(void)(VirtualFree ((LPVOID)(p), (SIZE_T)(0), MEM_RELEASE))
+
+#endif /* SAL_W32 */
+
+/*===========================================================================
+ *
+ * rtl_memory (OS2) internals.
+ *
+ *=========================================================================*/
+#ifdef SAL_OS2
+
+#define INCL_DOS
+#include <os2.h>
+
+typedef HMTX mutex_type;
+
+/* Static initializer */
+#define RTL_MUTEX_INITIALIZER -1
+
+/*
+ * __rtl_mutex_init (dynamic initialization).
+ *
+ * Static initialization (with DebugInfo == NULL)
+ * leads to Access Violation upon first contention.
+ */
+static void __rtl_mutex_init (mutex_type* mutex)
+{
+ APIRET rc = 0;
+
+ rc = DosCreateMutexSem(NULL,mutex,0,0);
+
+}
+
+static int __rtl_mutex_destroy (mutex_type* mutex)
+{
+ APIRET rc = 0;
+
+
+ do {
+ rc = DosCloseMutexSem(*mutex);
+ if (rc == 301) DosReleaseMutexSem(*mutex);
+ } while (rc == 301);
+
+ *mutex = 0;
+
+ /* Return the completion status: */
+ return (0);
+}
+
+
+static int __rtl_mutex_acquire(mutex_type* mutex)
+{
+ int ret = 0;
+ int status = 0;
+ APIRET rc = 0;
+
+ // initialize static semaphores created with PTHREAD_MUTEX_INITIALIZER state.
+ if (*mutex == -1)
+ __rtl_mutex_init( mutex);
+
+ rc = DosRequestMutexSem(*mutex,SEM_INDEFINITE_WAIT);
+ if (rc)
+ return(1);
+
+ /* Return the completion status: */
+ return (0);
+}
+
+static int __rtl_mutex_release(mutex_type* mutex)
+{
+ int ret = 0;
+ APIRET rc = 0;
+ int status;
+
+
+ // initialize static semaphores created with PTHREAD_MUTEX_INITIALIZER state.
+ if (*mutex == -1)
+ __rtl_mutex_init( mutex);
+
+ rc = DosReleaseMutexSem(*mutex);
+
+ /* Return the completion status: */
+ return (0);
+}
+
+#define RTL_MUTEX_INIT(a) __rtl_mutex_init((mutex_type*)(a))
+#define RTL_MUTEX_ACQUIRE(a) __rtl_mutex_acquire((mutex_type*)(a))
+#define RTL_MUTEX_RELEASE(a) __rtl_mutex_release((mutex_type*)(a))
+
+static sal_Size __rtl_memory_vmpagesize (void)
+{
+ return (sal_Size)(getpagesize());
+}
+
+#define RTL_MEMORY_ALLOC(n) (void*)(malloc(n))
+
+#define RTL_MEMORY_FREE(p, n) (void)(free(p))
+
+#endif /* SAL_OS2 */
+
+/*===========================================================================
+ *
+ * rtl_memory (global) internals.
+ *
+ *=========================================================================*/
+#define __L__ 32
+#define __P__ 24
+#define __N__ ((__L__) + (__P__))
+#define __M__ 0x10000
+
+static const sal_Size __T__ = (__M__) * 2 / 3;
+
+typedef struct __rtl_memory_desc_st memory_type;
+struct __rtl_memory_desc_st
+{
+ sal_Size m_length;
+ sal_Size m_offset;
+ memory_type *m_flink;
+ memory_type *m_blink;
+};
+
+static const int __C__ = 2 * sizeof(sal_Size);
+static const int __Q__ = 2 * sizeof(memory_type*);
+
+typedef struct __rtl_memory_stat_st memory_stat;
+struct __rtl_memory_stat_st
+{
+ sal_uInt64 m_dequeue;
+ sal_uInt64 m_enqueue;
+ sal_Int32 m_delta_q;
+
+ sal_uInt64 m_deqsize;
+ sal_uInt64 m_enqsize;
+ sal_Int32 m_delta_n;
+};
+
+#define RTL_MEMORY_ALIGN(n, m) (((n) + ((m) - 1)) & ~((m) - 1))
+#define RTL_MEMORY_SIZEOF(a) RTL_MEMORY_ALIGN(sizeof(a), sizeof(memory_type))
+
+struct __rtl_memory_global_st
+{
+ sal_Size m_magic;
+ sal_Size m_align;
+
+ union {
+ mutex_type m_lock;
+ char m_data[RTL_MEMORY_SIZEOF(mutex_type)];
+ } m_mutex;
+
+ memory_type m_alloc_head;
+ memory_type m_spare_head;
+ memory_type m_queue_head[__N__];
+
+#if OSL_DEBUG_LEVEL > 0
+ memory_stat m_queue_stat[__N__];
+#endif /* OSL_DEBUG_LEVEL */
+};
+
+static struct __rtl_memory_global_st g_memory =
+{
+ 0, 0, { RTL_MUTEX_INITIALIZER },
+ { 0, 0, NULL, NULL }, { 0, 0, NULL, NULL }, { { 0, 0, NULL, NULL } },
+#if OSL_DEBUG_LEVEL > 0
+ { { 0, 0, 0, 0, 0, 0 } }
+#endif /* OSL_DEBUG_LEVEL */
+};
+
+void SAL_CALL ___rtl_memory_init (void);
+void SAL_CALL ___rtl_memory_fini (void);
+
+#define RTL_MEMORY_ENTER() \
+{ \
+ if (!(g_memory.m_align)) ___rtl_memory_init(); \
+ RTL_MUTEX_ACQUIRE(&(g_memory.m_mutex.m_lock)); \
+}
+
+#define RTL_MEMORY_LEAVE() \
+{ \
+ RTL_MUTEX_RELEASE(&(g_memory.m_mutex.m_lock)); \
+}
+
+/*===========================================================================
+ *
+ * rtl_memory (queue) internals.
+ *
+ *=========================================================================*/
+#if defined(PROFILE) || (OSL_DEBUG_LEVEL > 0)
+static sal_Size queue (sal_Size n)
+{
+ /* k = n div __C__ */
+ register sal_Size k = n / __C__, m = __L__;
+
+ OSL_PRECOND((__L__ == 32),
+ "__rtl_memory_queue(): internal logic error");
+ if (k > m)
+ {
+ /* k = k div __L__ = k div 32 */
+ k >>= 5;
+ while ((k >>= 1) > 0) m++;
+ k = m;
+ }
+
+ OSL_POSTCOND((0 < k) && (k < __N__),
+ "__rtl_memory_queue(): "
+ "internal error: index out of bounds");
+ return (k);
+}
+#else /* PRODUCT */
+#define queue(k, n) \
+{ \
+ (k) = ((n) / __C__); \
+ if ((k) > __L__) \
+ { \
+ register sal_Size m = __L__; \
+ (k) >>= 5; \
+ while (((k) >>= 1) > 0) m++; \
+ (k) = m; \
+ } \
+}
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+#define queue_start(entry) \
+{ \
+ (entry)->m_flink = (entry); \
+ (entry)->m_blink = (entry); \
+}
+
+#define queue_remove(entry) \
+{ \
+ (entry)->m_blink->m_flink = (entry)->m_flink; \
+ (entry)->m_flink->m_blink = (entry)->m_blink; \
+ queue_start(entry); \
+}
+
+#define queue_insert_head(head, entry) \
+{ \
+ (entry)->m_blink = (head); \
+ (entry)->m_flink = (head)->m_flink; \
+ (head)->m_flink = (entry); \
+ (entry)->m_flink->m_blink = (entry); \
+}
+
+#define queue_insert_tail(head, entry) \
+{ \
+ (entry)->m_flink = (head); \
+ (entry)->m_blink = (head)->m_blink; \
+ (head)->m_blink = (entry); \
+ (entry)->m_blink->m_flink = (entry); \
+}
+
+/*===========================================================================
+ *
+ * rtl_memory (debug) internals.
+ *
+ *=========================================================================*/
+#if OSL_DEBUG_LEVEL > 0
+
+#define __dbg_memory_succ(entry, length) \
+(memory_type*)((char*)((entry)) + ((length) & ~0x1))
+
+#define __dbg_memory_pred(entry, offset) \
+(memory_type*)((char*)((entry)) - ((offset) & ~0x1))
+
+#define __dbg_memory_ensure(entry) (!((sal_Size)(entry) & 0x7))
+
+/*
+ * __dbg_memory_dequeue.
+ */
+static void __dbg_memory_dequeue (sal_Size n)
+{
+ register sal_Size k = queue(n);
+
+ g_memory.m_queue_stat[k].m_dequeue += 1;
+ g_memory.m_queue_stat[k].m_delta_q += 1;
+
+ g_memory.m_queue_stat[k].m_deqsize += n;
+ g_memory.m_queue_stat[k].m_delta_n += n;
+}
+
+/*
+ * __dbg_memory_enqueue.
+ */
+static void __dbg_memory_enqueue (sal_Size n)
+{
+ register sal_Size k = queue(n);
+
+ g_memory.m_queue_stat[k].m_enqueue += 1;
+ g_memory.m_queue_stat[k].m_delta_q -= 1;
+
+ g_memory.m_queue_stat[k].m_enqsize += n;
+ g_memory.m_queue_stat[k].m_delta_n -= n;
+}
+
+/*
+ * __dbg_memory_insert.
+ */
+static void __dbg_memory_insert (memory_type **ppMemory)
+{
+ register memory_type * succ;
+ succ = __dbg_memory_succ (*ppMemory, sizeof(memory_type));
+
+ succ->m_length = (*ppMemory)->m_length - sizeof(memory_type);
+ succ->m_offset = (*ppMemory)->m_offset;
+
+ queue_insert_tail (&(g_memory.m_alloc_head), (*ppMemory));
+ (*ppMemory) = succ;
+}
+
+/*
+ * __dbg_memory_remove.
+ */
+static void __dbg_memory_remove (memory_type **ppMemory)
+{
+ (*ppMemory) = __dbg_memory_pred (*ppMemory, sizeof(memory_type));
+ queue_remove (*ppMemory);
+}
+
+/*
+ * __dbg_memory_verify_chain.
+ */
+static int __dbg_memory_verify_chain (memory_type * x)
+{
+ if (!__dbg_memory_ensure(x))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): invalid pointer alignment.");
+ return (0);
+ }
+ if (!__dbg_memory_ensure(x->m_length & ~0x1))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): dynamic memory corruption");
+ return (0);
+ }
+ if (!__dbg_memory_ensure(x->m_offset & ~0x1))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): dynamic memory corruption");
+ return (0);
+ }
+ if (!(x->m_length & ~0x1))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): dynamic memory corruption");
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * __dbg_memory_verify_queue.
+ */
+static int __dbg_memory_verify_queue (memory_type * x)
+{
+ if (!__dbg_memory_ensure(x))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): invalid pointer alignment.");
+ return (0);
+ }
+ if (!__dbg_memory_ensure(x->m_flink))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): free memory corruption");
+ return (0);
+ }
+ if (!__dbg_memory_ensure(x->m_blink))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): free memory corruption");
+ return (0);
+ }
+ if ((x == x->m_flink) || (x == x->m_blink))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): internal logic error");
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * __dbg_memory_verify_alloc.
+ */
+static int __dbg_memory_verify_alloc (memory_type * x)
+{
+ register memory_type *head, *entry;
+ head = entry = &(g_memory.m_alloc_head);
+
+ if (!__dbg_memory_ensure(x))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): invalid pointer alignment.");
+ return (0);
+ }
+ while (!((entry = entry->m_flink) == head))
+ {
+ if ((entry < x) && (x < __dbg_memory_succ(entry, entry->m_length)))
+ {
+ head = entry = __dbg_memory_succ(entry, sizeof(memory_type));
+ while (!((x == entry) || (entry->m_offset & 0x1)))
+ {
+ /* no match, not last */
+ if (!__dbg_memory_verify_chain (entry))
+ return (0);
+ entry = __dbg_memory_succ(entry, entry->m_length);
+ }
+
+ /* match, or last */
+ if (!__dbg_memory_verify_chain (entry))
+ return (0);
+ break;
+ }
+ }
+ if (!(x == entry))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): memory not allocated.");
+ return (0);
+ }
+ return (1);
+}
+
+/*
+ * __dbg_memory_verify.
+ */
+static int __dbg_memory_verify (memory_type * x, int debug)
+{
+ /* dispatch upon 'debug' level */
+ if (debug)
+ {
+ /* verify allocation */
+ if (!__dbg_memory_verify_alloc (x))
+ return (0);
+ }
+ else
+ {
+ /* verify 'chain' fields */
+ if (!__dbg_memory_verify_chain (x))
+ return (0);
+ }
+
+ /* verify 'used' bit */
+ if (!(x->m_length & 0x1))
+ {
+ OSL_ENSURE(0, "__rtl_memory_verify(): memory not used.");
+ return (0);
+ }
+ return (1);
+}
+
+#if OSL_DEBUG_LEVEL > 1
+/*
+ * __dbg_memory_usage_update.
+ */
+static sal_Size __dbg_memory_usage_update (memory_stat * stat, sal_Size length)
+{
+ register sal_Size n = (length & ~0x1), k = queue(n);
+
+ stat[k].m_dequeue += 1;
+ stat[k].m_deqsize += n;
+
+ if (!(length & 0x1))
+ {
+ /* not used */
+ stat[k].m_enqueue += 1;
+ stat[k].m_enqsize += n;
+ return (n);
+ }
+ else
+ {
+ /* used */
+ stat[k].m_delta_q += 1;
+ stat[k].m_delta_n += n;
+ return (0);
+ }
+}
+
+/*
+ * __dbg_memory_usage.
+ */
+static void __dbg_memory_usage (memory_stat * total)
+{
+ register memory_type *head, *entry, *memory;
+ memory_stat stat[__N__];
+
+ memset (stat, 0, __N__ * sizeof(memory_stat));
+
+ head = entry = &(g_memory.m_alloc_head);
+ while (!((entry = entry->m_flink) == head))
+ {
+ register sal_Size k = 0, n = entry->m_length - sizeof(memory_type);
+
+ memory = __dbg_memory_succ(entry, sizeof(memory_type));
+ while (!(memory->m_offset & 0x1))
+ {
+ /* not last */
+ k += __dbg_memory_usage_update (stat, memory->m_length);
+ memory = __dbg_memory_succ(memory, memory->m_length);
+ }
+
+ k += __dbg_memory_usage_update (stat, memory->m_length);
+ OSL_TRACE("%x %10d %10d", (sal_Size)(entry), n, k);
+ }
+
+ if (total)
+ {
+ sal_Size i;
+
+ memset (total, 0, sizeof(memory_stat));
+ for (i = 0; i < __N__; i++)
+ {
+ total->m_dequeue += stat[i].m_dequeue;
+ total->m_enqueue += stat[i].m_enqueue;
+ total->m_delta_q += stat[i].m_delta_q;
+
+ total->m_deqsize += stat[i].m_deqsize;
+ total->m_enqsize += stat[i].m_enqsize;
+ total->m_delta_n += stat[i].m_delta_n;
+ }
+ }
+}
+#endif /* OSL_DEBUG_LEVEL */
+
+#endif /* OSL_DEBUG_LEVEL */
+#if OSL_DEBUG_LEVEL > 0
+
+#define DBG_MEMORY_DEQUEUE(n) __dbg_memory_dequeue((sal_Size)(n) & ~0x1)
+#define DBG_MEMORY_ENQUEUE(n) __dbg_memory_enqueue((sal_Size)(n) & ~0x1)
+
+#define DBG_MEMORY_DEQFILL(entry, offset, length) \
+ memset(((char*)(entry) + (offset)), 0x77777777, (length))
+#define DBG_MEMORY_ENQFILL(entry, offset, length) \
+ memset(((char*)(entry) + (offset)), 0x33333333, (length))
+
+#define DBG_MEMORY_INSERT(entry) __dbg_memory_insert((entry))
+#define DBG_MEMORY_REMOVE(entry) __dbg_memory_remove((entry))
+
+#if OSL_DEBUG_LEVEL > 1
+#define DBG_MEMORY_VERIFY(entry) __dbg_memory_verify((entry), 1)
+#else /* OSL_DEBUG_LEVEL > 0 */
+#define DBG_MEMORY_VERIFY(entry) __dbg_memory_verify((entry), 0)
+#endif /* OSL_DEBUG_LEVEL */
+
+#define DBG_MEMORY_VERIFY_CHAIN(entry) __dbg_memory_verify_chain((entry))
+#define DBG_MEMORY_VERIFY_QUEUE(entry) __dbg_memory_verify_queue((entry))
+
+#else /* PRODUCT */
+
+#define DBG_MEMORY_DEQUEUE(n)
+#define DBG_MEMORY_ENQUEUE(n)
+
+#define DBG_MEMORY_DEQFILL(entry, offset, length)
+#define DBG_MEMORY_ENQFILL(entry, offset, length)
+
+#define DBG_MEMORY_INSERT(entry)
+#define DBG_MEMORY_REMOVE(entry)
+
+#define DBG_MEMORY_VERIFY(entry)
+#define DBG_MEMORY_VERIFY_CHAIN(entry)
+#define DBG_MEMORY_VERIFY_QUEUE(entry)
+
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+/*===========================================================================
+ *
+ * rtl_memory (manager) internals.
+ *
+ *=========================================================================*/
+#define queue_cast(entry, offset) \
+((memory_type*)((char*)(entry) + (ptrdiff_t)(offset)))
+
+#define __rtl_memory_used(entry) ((entry)->m_length & 0x1)
+#define __rtl_memory_last(entry) ((entry)->m_offset & 0x1)
+#define __rtl_memory_offset(entry) \
+ ((ptrdiff_t)((entry)->m_offset & ~0x1))
+
+/*
+ * ___rtl_memory_init.
+ */
+void SAL_CALL ___rtl_memory_init (void)
+{
+#if defined(RTL_MUTEX_INIT)
+ RTL_MUTEX_INIT (&(g_memory.m_mutex.m_lock));
+#endif /* RTL_MUTEX_INIT */
+
+ RTL_MUTEX_ACQUIRE(&(g_memory.m_mutex.m_lock));
+ if (!(g_memory.m_align))
+ {
+ sal_Size pagesize;
+ int i;
+
+ queue_start (&(g_memory.m_alloc_head));
+ queue_start (&(g_memory.m_spare_head));
+
+ for (i = 0; i < __N__; i++)
+ queue_start (&(g_memory.m_queue_head[i]));
+ for (i = 1; i <= __L__; i++)
+ g_memory.m_queue_head[i].m_length = i * __C__;
+ for (i = __L__ + 1; i < __N__; i++)
+ g_memory.m_queue_head[i].m_length =
+ 2 * g_memory.m_queue_head[i - 1].m_length;
+
+ pagesize = __rtl_memory_vmpagesize();
+ g_memory.m_align = RTL_MEMORY_ALIGN(__M__, pagesize);
+ }
+ RTL_MUTEX_RELEASE(&(g_memory.m_mutex.m_lock));
+}
+
+/*
+ * ___rtl_memory_fini.
+ */
+void SAL_CALL ___rtl_memory_fini (void)
+{
+#if OSL_DEBUG_LEVEL > 1
+
+ memory_stat total;
+
+ __dbg_memory_usage (&total);
+ if (total.m_delta_n > 0)
+ {
+ OSL_TRACE("___rtl_memory_fini(): "
+ "Leak: %10d (Alloc: %10d, Free: %10d)",
+ total.m_delta_n,
+ (sal_uInt32)(total.m_deqsize & 0xffffffff),
+ (sal_uInt32)(total.m_enqsize & 0xffffffff));
+ }
+
+#endif /* OSL_DEBUG_LEVEL */
+}
+
+/*
+ * __rtl_memory_merge.
+ */
+#if defined(PROFILE) || (OSL_DEBUG_LEVEL > 0)
+static void __rtl_memory_merge (memory_type * prev, memory_type * next)
+{
+ /* adjust length */
+ prev->m_length += next->m_length;
+ if (!__rtl_memory_last(next))
+ {
+ /* not last, adjust offset */
+ register memory_type * succ = queue_cast(prev, prev->m_length);
+ DBG_MEMORY_VERIFY_CHAIN (succ);
+ succ->m_offset = prev->m_length | __rtl_memory_last(succ);
+ }
+
+ /* propagate 'last' bit */
+ prev->m_offset |= __rtl_memory_last(next);
+}
+#else /* PRODUCT */
+#define __rtl_memory_merge(prev, next) \
+{ \
+ (prev)->m_length += (next)->m_length; \
+ if (!__rtl_memory_last((next))) \
+ { \
+ register memory_type * succ = queue_cast((prev), (prev)->m_length); \
+ succ->m_offset = (prev)->m_length | __rtl_memory_last(succ); \
+ } \
+ (prev)->m_offset |= __rtl_memory_last((next)); \
+}
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+/*
+ * __rtl_memory_split.
+ */
+#if defined(PROFILE) || (OSL_DEBUG_LEVEL > 0)
+static void __rtl_memory_split (memory_type * prev, memory_type * next)
+{
+ /* adjust length */
+ prev->m_length -= next->m_length;
+ if (!__rtl_memory_last(prev))
+ {
+ /* not last, adjust offset */
+ register memory_type * succ = queue_cast(next, next->m_length);
+ DBG_MEMORY_VERIFY_CHAIN (succ);
+ succ->m_offset = next->m_length | __rtl_memory_last(succ);
+ }
+
+ /* propagate 'last' bit */
+ next->m_offset |= __rtl_memory_last(prev);
+ prev->m_offset &= ~0x1;
+}
+#else /* PRODUCT */
+#define __rtl_memory_split(prev, next) \
+{ \
+ (prev)->m_length -= (next)->m_length; \
+ if (!__rtl_memory_last((prev))) \
+ { \
+ register memory_type * succ = queue_cast((next), (next)->m_length); \
+ succ->m_offset = (next)->m_length | __rtl_memory_last(succ); \
+ } \
+\
+ (next)->m_offset |= __rtl_memory_last((prev)); \
+ (prev)->m_offset &= ~0x1; \
+}
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+/*
+ * __rtl_memory_insert.
+ */
+#if defined(PROFILE) || (OSL_DEBUG_LEVEL > 0)
+static void __rtl_memory_insert (memory_type * memory, sal_Size n)
+{
+ /* obtain queue head */
+ register memory_type *head;
+
+ head = &(g_memory.m_queue_head[queue(n)]);
+ DBG_MEMORY_VERIFY_CHAIN (head);
+
+ /* insert at queue tail (first-in first-out) */
+ queue_insert_tail (head, memory);
+}
+#else /* PRODUCT */
+#define __rtl_memory_insert(memory, n) \
+{ \
+ register sal_Size h; \
+\
+ queue(h, (n)); \
+ queue_insert_tail (&(g_memory.m_queue_head[h]), (memory)); \
+}
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+/*
+ * __rtl_memory_resize.
+ */
+#if defined(PROFILE) || (OSL_DEBUG_LEVEL > 0)
+static void __rtl_memory_resize (memory_type * memory, sal_Size n)
+{
+ register sal_Size k = (memory->m_length - n);
+
+ OSL_ENSURE(!(memory->m_length & 0x1),
+ "__rtl_memory_resize(): "
+ "internal logic error.");
+
+ if ((k >= sizeof(memory_type)) && (n <= __T__))
+ {
+ /* split */
+ register memory_type * remain = queue_cast(memory, n);
+
+ remain->m_length = k; remain->m_offset = n;
+ __rtl_memory_split (memory, remain);
+
+ /* check postcond */
+ if (!__rtl_memory_last(remain))
+ {
+ /* not last, verify used next entry */
+ register memory_type *next;
+
+ next = queue_cast(remain, remain->m_length);
+ DBG_MEMORY_VERIFY_CHAIN (next);
+
+ OSL_POSTCOND(__rtl_memory_used(next),
+ "__rtl_memory_resize(): "
+ "internal logic error.");
+ }
+
+ /* enqueue */
+ __rtl_memory_insert (remain, k);
+ DBG_MEMORY_VERIFY_QUEUE (remain);
+ }
+
+ DBG_MEMORY_DEQUEUE(memory->m_length);
+}
+#else /* PRODUCT */
+#define __rtl_memory_resize(memory, n) \
+{ \
+ register sal_Size kn = ((memory)->m_length - (n)); \
+ if ((kn >= sizeof(memory_type)) && (n <= __T__)) \
+ { \
+ register memory_type * remain = queue_cast((memory), (n)); \
+\
+ remain->m_length = kn; remain->m_offset = (n); \
+ __rtl_memory_split ((memory), remain); \
+\
+ __rtl_memory_insert (remain, kn); \
+ } \
+}
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+/*
+ * __rtl_memory_dequeue.
+ */
+#if defined(PROFILE) || (OSL_DEBUG_LEVEL > 0)
+static void __rtl_memory_dequeue (memory_type **ppMemory, sal_Size n)
+{
+ register memory_type *head, *entry;
+ register sal_Size k, m = n;
+
+ OSL_PRECOND(!*ppMemory, "__rtl_memory_dequeue(): internal logic error.");
+ for (k = queue(m); k < __N__; k++)
+ {
+ /* first fit (equals best fit w/ ascending insert) */
+ head = &(g_memory.m_queue_head[k]);
+ for (entry = head->m_flink; entry != head; entry = entry->m_flink)
+ {
+ /* queue not empty */
+ DBG_MEMORY_VERIFY_CHAIN (entry);
+ if (entry->m_length >= m)
+ {
+ /* remove entry */
+ DBG_MEMORY_VERIFY_QUEUE (entry);
+ queue_remove (entry);
+
+ /* assign result */
+ *ppMemory = entry;
+ goto dequeue_leave;
+ }
+ }
+ }
+
+ head = &(g_memory.m_spare_head);
+ for (entry = head->m_flink; entry != head; entry = entry->m_flink)
+ {
+ /* queue not empty */
+ DBG_MEMORY_VERIFY_CHAIN (entry);
+ if (entry->m_length >= m)
+ {
+ /* remove entry */
+ DBG_MEMORY_VERIFY_QUEUE (entry);
+ queue_remove (entry);
+
+ /* assign result */
+ *ppMemory = entry;
+ goto dequeue_leave;
+ }
+ }
+
+#if OSL_DEBUG_LEVEL > 0
+ /* adjust for DBG_MEMORY_INSERT() overhead */
+ m += sizeof(memory_type);
+#endif /* OSL_DEBUG_LEVEL */
+
+ k = RTL_MEMORY_ALIGN((m > __M__) ? m : __M__, g_memory.m_align);
+ if (!((entry = RTL_MEMORY_ALLOC(k)) == 0))
+ {
+ entry->m_length = k;
+ entry->m_offset = 0x1; /* set 'last' bit */
+
+ *ppMemory = entry;
+ DBG_MEMORY_INSERT(ppMemory);
+ }
+
+dequeue_leave:
+ OSL_POSTCOND(*ppMemory, "__rtl_memory_dequeue(): out of memory.");
+ if ((entry = *ppMemory) != 0)
+ {
+ /* adjust length */
+ __rtl_memory_resize (entry, n);
+
+ /* fill w/ 'uninitialized' pattern */
+ DBG_MEMORY_DEQFILL (entry, __C__, entry->m_length - __C__);
+ }
+#if OSL_DEBUG_LEVEL > 1
+ if (!entry)
+ {
+ memory_stat total;
+ __dbg_memory_usage (&total);
+ }
+#endif /* OSL_DEBUG_LEVEL */
+}
+#else /* PRODUCT */
+#define __rtl_memory_dequeue(ppMemory, n, label) \
+{ \
+ register memory_type *head, *entry; \
+ register sal_Size h, m = (n); \
+\
+ queue (h, m); \
+ for (; h < __N__; h++) \
+ { \
+ head = &(g_memory.m_queue_head[h]); \
+ for (entry = head->m_flink; entry != head; entry = entry->m_flink) \
+ { \
+ if (entry->m_length >= m) \
+ { \
+ queue_remove (entry); \
+ goto label; \
+ } \
+ } \
+ } \
+\
+ head = &(g_memory.m_spare_head); \
+ for (entry = head->m_flink; entry != head; entry = entry->m_flink) \
+ { \
+ if (entry->m_length >= m) \
+ { \
+ queue_remove (entry); \
+ goto label; \
+ } \
+ } \
+\
+ h = RTL_MEMORY_ALIGN((m > __M__) ? m : __M__, g_memory.m_align); \
+ if (!((entry = RTL_MEMORY_ALLOC(h)) == 0)) \
+ { \
+ entry->m_length = h; \
+ entry->m_offset = 0x1; \
+ } \
+\
+label: \
+ if (entry) \
+ { \
+ __rtl_memory_resize (entry, (n)); \
+ *(ppMemory) = entry; \
+ } \
+}
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+#if defined(PROFILE) || (OSL_DEBUG_LEVEL > 0)
+#define RTL_MEMORY_DEQUEUE(m, n, l) __rtl_memory_dequeue((m), (n))
+#else /* PRODUCT */
+#define RTL_MEMORY_DEQUEUE(m, n, l) __rtl_memory_dequeue(m, n, l)
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+/*
+ * __rtl_memory_enqueue.
+ */
+#if defined(PROFILE) || (OSL_DEBUG_LEVEL > 0)
+static void __rtl_memory_enqueue (memory_type **ppMemory)
+{
+ register memory_type *head = *ppMemory;
+
+ OSL_ENSURE(!__rtl_memory_used(head),
+ "__rtl_memory_enqueue(): "
+ "internal logic error.");
+ DBG_MEMORY_ENQUEUE (head->m_length);
+
+ /* fill w/ 'deinitialized' pattern */
+ DBG_MEMORY_ENQFILL (head, __C__, head->m_length - __C__);
+
+ /* try merge w/ next entry */
+ if (!__rtl_memory_last(head))
+ {
+ /* not last, check next in chain */
+ register memory_type * next;
+
+ next = queue_cast(head, head->m_length);
+ DBG_MEMORY_VERIFY_CHAIN (next);
+
+ if (!__rtl_memory_used(next))
+ {
+ /* next not used */
+ DBG_MEMORY_VERIFY_QUEUE (next);
+ queue_remove (next);
+
+ /* merge w/ next */
+ __rtl_memory_merge (head, next);
+ DBG_MEMORY_ENQFILL (next, 0, sizeof(memory_type));
+ }
+ }
+
+ /* try merge w/ prev entry */
+ if (__rtl_memory_offset(head) > 0)
+ {
+ /* not first, check prev in chain */
+ register memory_type * prev;
+
+ prev = queue_cast(head, -(__rtl_memory_offset(head)));
+ DBG_MEMORY_VERIFY_CHAIN (prev);
+
+ if (!__rtl_memory_used(prev))
+ {
+ /* prev not used */
+ DBG_MEMORY_VERIFY_QUEUE (prev);
+ queue_remove (prev);
+
+ /* merge w/ prev */
+ __rtl_memory_merge (prev, head);
+ DBG_MEMORY_ENQFILL (head, 0, sizeof(memory_type));
+ head = prev;
+ }
+ }
+
+ if (!(head->m_offset == 0x1))
+ {
+ /* page still used, enqueue */
+ __rtl_memory_insert (head, head->m_length);
+ head = 0;
+ }
+ else if (head->m_length <= g_memory.m_align)
+ {
+ /* small page unused, check spare page */
+ register memory_type * spare;
+
+ spare = &(g_memory.m_spare_head);
+ if (spare->m_flink == spare)
+ {
+ /* keep as spare page */
+ queue_insert_tail (spare, head);
+ head = 0;
+ }
+ }
+ if ((*ppMemory = head) != 0)
+ {
+ /* page unused, remove */
+ DBG_MEMORY_REMOVE(ppMemory);
+ }
+}
+#else /* PRODUCT */
+#define __rtl_memory_enqueue(ppMemory) \
+{ \
+ register memory_type *head = *(ppMemory); \
+\
+ if (!__rtl_memory_last(head)) \
+ { \
+ register memory_type * next; \
+ next = queue_cast(head, head->m_length); \
+ if (!__rtl_memory_used(next)) \
+ { \
+ queue_remove (next); \
+ __rtl_memory_merge (head, next); \
+ } \
+ } \
+\
+ if (__rtl_memory_offset(head) > 0) \
+ { \
+ register memory_type * prev; \
+ prev = queue_cast(head, -(__rtl_memory_offset(head))); \
+ if (!__rtl_memory_used(prev)) \
+ { \
+ queue_remove (prev); \
+ __rtl_memory_merge (prev, head); \
+ head = prev; \
+ } \
+ } \
+\
+ if (!(head->m_offset == 0x1)) \
+ { \
+ register memory_type * used = head; \
+ __rtl_memory_insert (used, used->m_length); \
+ head = 0; \
+ } \
+ else if (head->m_length <= g_memory.m_align) \
+ { \
+ register memory_type * spare; \
+ spare = &(g_memory.m_spare_head); \
+ if (spare->m_flink == spare) \
+ { \
+ queue_insert_tail (spare, head); \
+ head = 0; \
+ } \
+ } \
+\
+ *(ppMemory) = head; \
+}
+#endif /* OSL_DEBUG_LEVEL || PRODUCT */
+
+#define RTL_MEMORY_ENQUEUE(m) __rtl_memory_enqueue((m))
+
+#endif /* FORCE_SYSALLOC */
+
+/*===========================================================================
+ *
+ * rtl_memory (manager) implementation.
+ *
+ *=========================================================================*/
+/*
+ * rtl_reallocateMemory.
+ */
+#ifndef FORCE_SYSALLOC
+void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+{
+ memory_type * memory;
+ if (!(!p || !n))
+ {
+ /* reallocate */
+ register sal_Size datlen;
+
+ memory = queue_cast(p, -(__C__)); p = 0;
+ n = RTL_MEMORY_ALIGN(n, __Q__) + __C__;
+
+ RTL_MEMORY_ENTER();
+ DBG_MEMORY_VERIFY(memory);
+
+ /* clear 'used' bit */
+ DBG_MEMORY_ENQUEUE (memory->m_length);
+ memory->m_length &= ~0x1;
+
+ /* amount of data to be moved or copied */
+ datlen = ((memory->m_length < n) ? memory->m_length : n);
+
+ /* try merge w/ next entry */
+ if (!__rtl_memory_last(memory))
+ {
+ /* not last, check next in chain */
+ register memory_type * next;
+
+ next = queue_cast(memory, memory->m_length);
+ DBG_MEMORY_VERIFY_CHAIN(next);
+
+ if (!__rtl_memory_used(next))
+ {
+ /* next not used */
+ DBG_MEMORY_VERIFY_QUEUE(next);
+ queue_remove (next);
+
+ /* merge w/ next */
+ __rtl_memory_merge (memory, next);
+ }
+ }
+
+ /* try merge w/ prev entry */
+ if (__rtl_memory_offset(memory) > 0)
+ {
+ /* not first, check prev in chain */
+ register memory_type * prev;
+
+ prev = queue_cast(memory, -(__rtl_memory_offset(memory)));
+ DBG_MEMORY_VERIFY_CHAIN (prev);
+
+ if (!__rtl_memory_used(prev))
+ {
+ /* prev not used, try merge, move */
+ if ((memory->m_length + prev->m_length) >= n)
+ {
+ /* prev does fit */
+ DBG_MEMORY_VERIFY_QUEUE (prev);
+ queue_remove (prev);
+
+ /* merge w/ prev */
+ __rtl_memory_merge (prev, memory);
+
+ /* move to prev */
+ memmove (
+ queue_cast(prev, __C__),
+ queue_cast(memory, __C__),
+ datlen - __C__);
+ memory = prev;
+ }
+ }
+ }
+
+ if (memory->m_length >= n)
+ {
+ /* adjust, set 'used' bit */
+ __rtl_memory_resize (memory, n);
+ memory->m_length |= 0x1;
+
+ /* assign result */
+ p = queue_cast(memory, __C__);
+ }
+ else
+ {
+ /* allocate */
+ memory_type * result = 0;
+
+ /* restore 'used' bit */
+ DBG_MEMORY_DEQUEUE (memory->m_length);
+ memory->m_length |= 0x80000000;
+
+ RTL_MEMORY_DEQUEUE (&result, n, realloc_label_1);
+ if (result)
+ {
+ /* set 'used' bit */
+ result->m_length |= 0x1;
+
+ /* copy */
+ memcpy (
+ queue_cast(result, __C__),
+ queue_cast(memory, __C__),
+ datlen - __C__);
+
+ /* clear 'used' bit, enqueue */
+ memory->m_length &= 0x7fffffff;
+ RTL_MEMORY_ENQUEUE (&memory);
+ if (memory)
+ {
+ /* free memory page */
+ RTL_MEMORY_FREE(memory, memory->m_length);
+ }
+
+ /* assign result */
+ p = queue_cast(result, __C__);
+ }
+ }
+ RTL_MEMORY_LEAVE();
+ }
+ else if (!p)
+ {
+ /* allocate */
+ memory = 0;
+ n = RTL_MEMORY_ALIGN(n, __Q__) + __C__;
+
+ RTL_MEMORY_ENTER();
+ RTL_MEMORY_DEQUEUE (&memory, n, realloc_label_2);
+ if (memory)
+ {
+ /* set 'used' bit */
+ memory->m_length |= 0x1;
+
+ /* assign result */
+ p = queue_cast(memory, __C__);
+ }
+ RTL_MEMORY_LEAVE();
+ }
+ else if (!n)
+ {
+ /* free */
+ memory = queue_cast(p, -(__C__)); p = 0;
+
+ RTL_MEMORY_ENTER();
+ DBG_MEMORY_VERIFY(memory);
+
+ /* clear 'used' bit, enqueue */
+ memory->m_length &= ~0x1;
+
+ RTL_MEMORY_ENQUEUE (&memory);
+ if (memory)
+ {
+ /* free memory page */
+ RTL_MEMORY_FREE(memory, memory->m_length);
+ }
+ RTL_MEMORY_LEAVE();
+ }
+ return (p);
+}
+#else /* FORCE_SYSALLOC */
+void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+{
+ return realloc(p, (sal_Size)(n));
+}
+#endif /* FORCE_SYSALLOC */
+
+/*
+ * rtl_allocateMemory.
+ */
+#ifndef FORCE_SYSALLOC
+void* SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
+{
+ void * p = 0;
+ if (n > 0)
+ {
+ memory_type * memory = 0;
+ n = RTL_MEMORY_ALIGN(n, __Q__) + __C__;
+
+ RTL_MEMORY_ENTER();
+ RTL_MEMORY_DEQUEUE (&memory, n, alloc_label);
+ if (memory)
+ {
+ /* set 'used' bit */
+ memory->m_length |= 0x1;
+
+ /* assign result */
+ p = queue_cast(memory, __C__);
+ }
+ RTL_MEMORY_LEAVE();
+ }
+ return (p);
+}
+#else /* FORCE_SYSALLOC */
+void* SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
+{
+ return malloc((sal_Size)(n));
+}
+#endif /* FORCE_SYSALLOC */
+
+/*
+ * rtl_freeMemory.
+ */
+#ifndef FORCE_SYSALLOC
+void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C()
+{
+ if (p)
+ {
+ memory_type * memory = queue_cast(p, -(__C__));
+
+ RTL_MEMORY_ENTER();
+ DBG_MEMORY_VERIFY(memory);
+
+ /* clear 'used' bit, enqueue */
+ memory->m_length &= ~0x1;
+
+ RTL_MEMORY_ENQUEUE (&memory);
+ if (memory)
+ {
+ /* free memory page */
+ RTL_MEMORY_FREE(memory, memory->m_length);
+ }
+ RTL_MEMORY_LEAVE();
+ }
+}
+#else /* FORCE_SYSALLOC */
+void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C()
+{
+ free(p);
+}
+#endif /* FORCE_SYSALLOC */
+
+/*
+ * rtl_allocateZeroMemory.
+ */
+#ifndef FORCE_SYSALLOC
+void* SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C()
+{
+ void * p = 0;
+ if (n > 0)
+ {
+ memory_type * memory = 0;
+ n = RTL_MEMORY_ALIGN(n, __Q__) + __C__;
+
+ RTL_MEMORY_ENTER();
+ RTL_MEMORY_DEQUEUE (&memory, n, alloc_label); /* NYI: demand zero */
+ if (memory)
+ {
+ /* zero, set 'used' bit */
+ memset ((char*)memory + __C__, 0, memory->m_length - __C__);
+ memory->m_length |= 0x1;
+
+ /* assign result */
+ p = queue_cast(memory, __C__);
+ }
+ RTL_MEMORY_LEAVE();
+ }
+ return (p);
+}
+#else /* FORCE_SYSALLOC */
+void* SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C()
+{
+ return calloc((sal_Size)(n), 1);
+}
+#endif /* FORCE_SYSALLOC */
+
+/*
+ * rtl_freeZeroMemory.
+ */
+#ifndef FORCE_SYSALLOC
+void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+{
+ (void) n; /* unused */
+ if (p)
+ {
+ memory_type * memory = queue_cast(p, -(__C__));
+
+ RTL_MEMORY_ENTER();
+ DBG_MEMORY_VERIFY(memory);
+
+ /* clear 'used' bit, zero, enqueue */
+ memory->m_length &= ~0x1;
+ memset ((char*)memory + __C__, 0, memory->m_length - __C__);
+
+ RTL_MEMORY_ENQUEUE (&memory); /* NYI: demand zero */
+ if (memory)
+ {
+ /* free memory page */
+ RTL_MEMORY_FREE(memory, memory->m_length);
+ }
+ RTL_MEMORY_LEAVE();
+ }
+}
+#else /* FORCE_SYSALLOC */
+void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+{
+ if (p)
+ {
+ memset(p, 0, n);
+ free(p);
+ }
+}
+#endif /* FORCE_SYSALLOC */
+
+/*===========================================================================
+ *
+ * The End.
+ *
+ *=========================================================================*/
diff --git a/sal/rtl/source/alloc_arena.c b/sal/rtl/source/alloc_arena.c
new file mode 100644
index 000000000000..1a74c7e36cae
--- /dev/null
+++ b/sal/rtl/source/alloc_arena.c
@@ -0,0 +1,1396 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define _BSD_SOURCE /* sys/mman.h: MAP_ANON */
+#include "alloc_arena.h"
+
+#ifndef INCLUDED_RTL_ARENA_IMPL_H
+#include "alloc_impl.h"
+#endif
+#include "internal/once.h"
+#include "sal/macros.h"
+#include "osl/diagnose.h"
+
+#ifndef INCLUDED_STRING_H
+#include <string.h>
+#endif
+
+#ifndef INCLUDED_STDIO_H
+#include <stdio.h>
+#endif
+
+#include "sal/types.h"
+
+#ifdef OS2
+#undef OSL_TRACE
+#define OSL_TRACE 1 ? ((void)0) : _OSL_GLOBAL osl_trace
+#define INCL_DOS
+#include <os2.h>
+#endif
+
+/* ================================================================= *
+ *
+ * arena internals.
+ *
+ * ================================================================= */
+
+/** g_arena_list
+ * @internal
+ */
+struct rtl_arena_list_st
+{
+ rtl_memory_lock_type m_lock;
+ rtl_arena_type m_arena_head;
+};
+
+static struct rtl_arena_list_st g_arena_list;
+
+
+/** gp_arena_arena
+ * provided for arena_type allocations, and hash_table resizing.
+ *
+ * @internal
+ */
+static rtl_arena_type * gp_arena_arena = 0;
+
+
+/** gp_machdep_arena
+ *
+ * Low level virtual memory (pseudo) arena
+ * (platform dependent implementation)
+ *
+ * @internal
+ */
+static rtl_arena_type * gp_machdep_arena = 0;
+
+
+static void *
+SAL_CALL rtl_machdep_alloc (
+ rtl_arena_type * pArena,
+ sal_Size * pSize
+);
+
+static void
+SAL_CALL rtl_machdep_free (
+ rtl_arena_type * pArena,
+ void * pAddr,
+ sal_Size nSize
+);
+
+static sal_Size
+rtl_machdep_pagesize (void);
+
+
+/** gp_default_arena
+ */
+rtl_arena_type * gp_default_arena = 0;
+
+
+/** rtl_arena_init()
+ * @internal
+ */
+static int
+rtl_arena_init (void);
+
+
+/* ================================================================= */
+
+/** rtl_arena_segment_constructor()
+ */
+static int
+rtl_arena_segment_constructor (void * obj)
+{
+ rtl_arena_segment_type * segment = (rtl_arena_segment_type*)(obj);
+
+ QUEUE_START_NAMED(segment, s);
+ QUEUE_START_NAMED(segment, f);
+
+ return (1);
+}
+
+
+/** rtl_arena_segment_destructor()
+ */
+static void
+rtl_arena_segment_destructor (void * obj)
+{
+#if OSL_DEBUG_LEVEL == 0
+ (void) obj; /* unused */
+#else /* OSL_DEBUG_LEVEL */
+ rtl_arena_segment_type * segment = (rtl_arena_segment_type*)(obj);
+
+ OSL_ASSERT(QUEUE_STARTED_NAMED(segment, s));
+ OSL_ASSERT(QUEUE_STARTED_NAMED(segment, f));
+#endif /* OSL_DEBUG_LEVEL */
+}
+
+/* ================================================================= */
+
+/** rtl_arena_segment_populate()
+ *
+ * @precond arena->m_lock acquired.
+ */
+static int
+rtl_arena_segment_populate (
+ rtl_arena_type * arena
+)
+{
+ rtl_arena_segment_type *span;
+ sal_Size size = rtl_machdep_pagesize();
+
+ span = rtl_machdep_alloc(gp_machdep_arena, &size);
+ if (span != 0)
+ {
+ rtl_arena_segment_type *first, *last, *head;
+ sal_Size count = size / sizeof(rtl_arena_segment_type);
+
+ /* insert onto reserve span list */
+ QUEUE_INSERT_TAIL_NAMED(&(arena->m_segment_reserve_span_head), span, s);
+ QUEUE_START_NAMED(span, f);
+ span->m_addr = (sal_uIntPtr)(span);
+ span->m_size = size;
+ span->m_type = RTL_ARENA_SEGMENT_TYPE_SPAN;
+
+ /* insert onto reserve list */
+ head = &(arena->m_segment_reserve_head);
+ for (first = span + 1, last = span + count; first < last; ++first)
+ {
+ QUEUE_INSERT_TAIL_NAMED(head, first, s);
+ QUEUE_START_NAMED(first, f);
+ first->m_addr = 0;
+ first->m_size = 0;
+ first->m_type = 0;
+ }
+ }
+ return (span != 0);
+}
+
+
+/** rtl_arena_segment_get()
+ *
+ * @precond arena->m_lock acquired.
+ * @precond (*ppSegment == 0)
+ */
+static RTL_MEMORY_INLINE void
+rtl_arena_segment_get (
+ rtl_arena_type * arena,
+ rtl_arena_segment_type ** ppSegment
+)
+{
+ rtl_arena_segment_type * head;
+
+ OSL_ASSERT(*ppSegment == 0);
+
+ head = &(arena->m_segment_reserve_head);
+ if ((head->m_snext != head) || rtl_arena_segment_populate (arena))
+ {
+ (*ppSegment) = head->m_snext;
+ QUEUE_REMOVE_NAMED((*ppSegment), s);
+ }
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_arena_segment_get)
+#endif
+
+
+/** rtl_arena_segment_put()
+ *
+ * @precond arena->m_lock acquired.
+ * @postcond (*ppSegment == 0)
+ */
+static RTL_MEMORY_INLINE void
+rtl_arena_segment_put (
+ rtl_arena_type * arena,
+ rtl_arena_segment_type ** ppSegment
+)
+{
+ rtl_arena_segment_type * head;
+
+ OSL_ASSERT(QUEUE_STARTED_NAMED((*ppSegment), s));
+ OSL_ASSERT(QUEUE_STARTED_NAMED((*ppSegment), f));
+
+ (*ppSegment)->m_addr = 0;
+ (*ppSegment)->m_size = 0;
+
+ OSL_ASSERT((*ppSegment)->m_type != RTL_ARENA_SEGMENT_TYPE_HEAD);
+ (*ppSegment)->m_type = 0;
+
+ /* keep as reserve */
+ head = &(arena->m_segment_reserve_head);
+ QUEUE_INSERT_HEAD_NAMED(head, (*ppSegment), s);
+
+ /* clear */
+ (*ppSegment) = 0;
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_arena_segment_put)
+#endif
+
+/* ================================================================= */
+
+/** rtl_arena_freelist_insert()
+ *
+ * @precond arena->m_lock acquired.
+ */
+static RTL_MEMORY_INLINE void
+rtl_arena_freelist_insert (
+ rtl_arena_type * arena,
+ rtl_arena_segment_type * segment
+)
+{
+ rtl_arena_segment_type * head;
+
+ head = &(arena->m_freelist_head[highbit(segment->m_size) - 1]);
+ QUEUE_INSERT_TAIL_NAMED(head, segment, f);
+
+ arena->m_freelist_bitmap |= head->m_size;
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_arena_freelist_insert)
+#endif /* __SUNPRO_C */
+
+
+/** rtl_arena_freelist_remove()
+ *
+ * @precond arena->m_lock acquired.
+ */
+static RTL_MEMORY_INLINE void
+rtl_arena_freelist_remove (
+ rtl_arena_type * arena,
+ rtl_arena_segment_type * segment
+)
+{
+ if ((segment->m_fnext->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD) &&
+ (segment->m_fprev->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD) )
+ {
+ rtl_arena_segment_type * head;
+
+ head = segment->m_fprev;
+ OSL_ASSERT(arena->m_freelist_bitmap & head->m_size);
+ arena->m_freelist_bitmap ^= head->m_size;
+ }
+ QUEUE_REMOVE_NAMED(segment, f);
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_arena_freelist_remove)
+#endif /* __SUNPRO_C */
+
+
+/* ================================================================= */
+
+/** RTL_ARENA_HASH_INDEX()
+ */
+#define RTL_ARENA_HASH_INDEX_IMPL(a, s, q, m) \
+ ((((a) + ((a) >> (s)) + ((a) >> ((s) << 1))) >> (q)) & (m))
+
+#define RTL_ARENA_HASH_INDEX(arena, addr) \
+ RTL_ARENA_HASH_INDEX_IMPL((addr), (arena)->m_hash_shift, (arena)->m_quantum_shift, ((arena)->m_hash_size - 1))
+
+/** rtl_arena_hash_rescale()
+ *
+ * @precond arena->m_lock released.
+ */
+static void
+rtl_arena_hash_rescale (
+ rtl_arena_type * arena,
+ sal_Size new_size
+)
+{
+ rtl_arena_segment_type ** new_table;
+ sal_Size new_bytes;
+
+ new_bytes = new_size * sizeof(rtl_arena_segment_type*);
+ new_table = (rtl_arena_segment_type **)rtl_arena_alloc (gp_arena_arena, &new_bytes);
+
+ if (new_table != 0)
+ {
+ rtl_arena_segment_type ** old_table;
+ sal_Size old_size, i;
+
+ memset (new_table, 0, new_bytes);
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock));
+
+ old_table = arena->m_hash_table;
+ old_size = arena->m_hash_size;
+
+ OSL_TRACE(
+ "rtl_arena_hash_rescale(\"%s\"): "
+ "nseg: %"PRIu64" (ave: %"PRIu64"), frees: %"PRIu64" "
+ "[old_size: %lu, new_size: %lu]",
+ arena->m_name,
+ arena->m_stats.m_alloc - arena->m_stats.m_free,
+ (arena->m_stats.m_alloc - arena->m_stats.m_free) >> arena->m_hash_shift,
+ arena->m_stats.m_free,
+ old_size, new_size
+ );
+
+#if 0 /* DBG */
+ int i;
+ for (i = 0; i < arena->m_hash_size; i++)
+ {
+ sal_Size k = 0; rtl_arena_segment_type ** segpp = &(arena->m_hash_table[i]);
+ while (*segpp)
+ {
+ k += 1;
+ segpp = &((*segpp)->m_fnext);
+ }
+ fprintf(stdout, "%d, ", k);
+ }
+ fprintf(stdout, "\n");
+#endif /* DBG */
+
+ arena->m_hash_table = new_table;
+ arena->m_hash_size = new_size;
+ arena->m_hash_shift = highbit(arena->m_hash_size) - 1;
+
+ for (i = 0; i < old_size; i++)
+ {
+ rtl_arena_segment_type * curr = old_table[i];
+ while (curr != 0)
+ {
+ rtl_arena_segment_type * next = curr->m_fnext;
+ rtl_arena_segment_type ** head;
+
+ head = &(arena->m_hash_table[RTL_ARENA_HASH_INDEX(arena, curr->m_addr)]);
+ curr->m_fnext = (*head);
+ (*head) = curr;
+
+ curr = next;
+ }
+ old_table[i] = 0;
+ }
+
+ RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock));
+
+ if (old_table != arena->m_hash_table_0)
+ {
+ sal_Size old_bytes = old_size * sizeof(rtl_arena_segment_type*);
+ rtl_arena_free (gp_arena_arena, old_table, old_bytes);
+ }
+ }
+}
+
+
+/** rtl_arena_hash_insert()
+ * ...and update stats.
+ */
+static RTL_MEMORY_INLINE void
+rtl_arena_hash_insert (
+ rtl_arena_type * arena,
+ rtl_arena_segment_type * segment
+)
+{
+ rtl_arena_segment_type ** ppSegment;
+
+ ppSegment = &(arena->m_hash_table[RTL_ARENA_HASH_INDEX(arena, segment->m_addr)]);
+
+ segment->m_fnext = (*ppSegment);
+ (*ppSegment) = segment;
+
+ arena->m_stats.m_alloc += 1;
+ arena->m_stats.m_mem_alloc += segment->m_size;
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_arena_hash_insert)
+#endif /* __SUNPRO_C */
+
+
+/** rtl_arena_hash_remove()
+ * ...and update stats.
+ */
+static rtl_arena_segment_type *
+rtl_arena_hash_remove (
+ rtl_arena_type * arena,
+ sal_uIntPtr addr,
+ sal_Size size
+)
+{
+ rtl_arena_segment_type *segment, **segpp;
+ sal_Size lookups = 0;
+
+#if OSL_DEBUG_LEVEL == 0
+ (void) size; /* unused */
+#endif /* OSL_DEBUG_LEVEL */
+
+ segpp = &(arena->m_hash_table[RTL_ARENA_HASH_INDEX(arena, addr)]);
+ while ((segment = *segpp) != 0)
+ {
+ if (segment->m_addr == addr)
+ {
+ *segpp = segment->m_fnext, segment->m_fnext = segment->m_fprev = segment;
+ break;
+ }
+
+ /* update lookup miss stats */
+ lookups += 1;
+ segpp = &(segment->m_fnext);
+ }
+
+ OSL_POSTCOND(segment != 0, "rtl_arena_hash_remove(): bad free.");
+ if (segment != 0)
+ {
+ OSL_POSTCOND(segment->m_size == size, "rtl_arena_hash_remove(): wrong size.");
+
+ arena->m_stats.m_free += 1;
+ arena->m_stats.m_mem_alloc -= segment->m_size;
+
+ if (lookups > 1)
+ {
+ sal_Size nseg = (sal_Size)(arena->m_stats.m_alloc - arena->m_stats.m_free);
+ if (nseg > 4 * arena->m_hash_size)
+ {
+ if (!(arena->m_flags & RTL_ARENA_FLAG_RESCALE))
+ {
+ sal_Size ave = nseg >> arena->m_hash_shift;
+ sal_Size new_size = arena->m_hash_size << (highbit(ave) - 1);
+
+ arena->m_flags |= RTL_ARENA_FLAG_RESCALE;
+ RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock));
+ rtl_arena_hash_rescale (arena, new_size);
+ RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock));
+ arena->m_flags &= ~RTL_ARENA_FLAG_RESCALE;
+ }
+ }
+ }
+ }
+
+ return (segment);
+}
+
+/* ================================================================= */
+
+/** rtl_arena_segment_alloc()
+ * allocate (and remove) segment from freelist
+ *
+ * @precond arena->m_lock acquired
+ * @precond (*ppSegment == 0)
+ */
+static int
+rtl_arena_segment_alloc (
+ rtl_arena_type * arena,
+ sal_Size size,
+ rtl_arena_segment_type ** ppSegment
+)
+{
+ int index = 0;
+
+ OSL_ASSERT(*ppSegment == 0);
+ if (!RTL_MEMORY_ISP2(size))
+ {
+ int msb = highbit(size);
+ if (RTL_ARENA_FREELIST_SIZE == SAL_INT_CAST(size_t, msb))
+ {
+ /* highest possible freelist: fall back to first fit */
+ rtl_arena_segment_type *head, *segment;
+
+ head = &(arena->m_freelist_head[msb - 1]);
+ for (segment = head->m_fnext; segment != head; segment = segment->m_fnext)
+ {
+ if (segment->m_size >= size)
+ {
+ /* allocate first fit segment */
+ (*ppSegment) = segment;
+ break;
+ }
+ }
+ goto dequeue_and_leave;
+ }
+
+ /* roundup to next power of 2 */
+ size = (1UL << msb);
+ }
+
+ index = lowbit(RTL_MEMORY_P2ALIGN(arena->m_freelist_bitmap, size));
+ if (index > 0)
+ {
+ /* instant fit: allocate first free segment */
+ rtl_arena_segment_type *head;
+
+ head = &(arena->m_freelist_head[index - 1]);
+ (*ppSegment) = head->m_fnext;
+ OSL_ASSERT((*ppSegment) != head);
+ }
+
+dequeue_and_leave:
+ if (*ppSegment != 0)
+ {
+ /* remove from freelist */
+ rtl_arena_freelist_remove (arena, (*ppSegment));
+ }
+ return (*ppSegment != 0);
+}
+
+
+/** rtl_arena_segment_create()
+ * import new (span) segment from source arena
+ *
+ * @precond arena->m_lock acquired
+ * @precond (*ppSegment == 0)
+ */
+static int
+rtl_arena_segment_create (
+ rtl_arena_type * arena,
+ sal_Size size,
+ rtl_arena_segment_type ** ppSegment
+)
+{
+ OSL_ASSERT((*ppSegment) == 0);
+ if (arena->m_source_alloc != 0)
+ {
+ rtl_arena_segment_get (arena, ppSegment);
+ if (*ppSegment != 0)
+ {
+ rtl_arena_segment_type * span = 0;
+ rtl_arena_segment_get (arena, &span);
+ if (span != 0)
+ {
+ /* import new span from source arena */
+ RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock));
+
+ span->m_size = size;
+ span->m_addr = (sal_uIntPtr)(arena->m_source_alloc)(
+ arena->m_source_arena, &(span->m_size));
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock));
+ if (span->m_addr != 0)
+ {
+ /* insert onto segment list, update stats */
+ span->m_type = RTL_ARENA_SEGMENT_TYPE_SPAN;
+ QUEUE_INSERT_HEAD_NAMED(&(arena->m_segment_head), span, s);
+ arena->m_stats.m_mem_total += span->m_size;
+
+ (*ppSegment)->m_addr = span->m_addr;
+ (*ppSegment)->m_size = span->m_size;
+ (*ppSegment)->m_type = RTL_ARENA_SEGMENT_TYPE_FREE;
+ QUEUE_INSERT_HEAD_NAMED(span, (*ppSegment), s);
+
+ /* report success */
+ return (1);
+ }
+ rtl_arena_segment_put (arena, &span);
+ }
+ rtl_arena_segment_put (arena, ppSegment);
+ }
+ }
+ return (0);
+}
+
+
+/** rtl_arena_segment_coalesce()
+ * mark as free and join with adjacent free segment(s)
+ *
+ * @precond arena->m_lock acquired
+ * @precond segment marked 'used'
+ */
+static void
+rtl_arena_segment_coalesce (
+ rtl_arena_type * arena,
+ rtl_arena_segment_type * segment
+)
+{
+ rtl_arena_segment_type *next, *prev;
+
+ /* mark segment free */
+ OSL_ASSERT(segment->m_type == RTL_ARENA_SEGMENT_TYPE_USED);
+ segment->m_type = RTL_ARENA_SEGMENT_TYPE_FREE;
+
+ /* try to merge w/ next segment */
+ next = segment->m_snext;
+ if (next->m_type == RTL_ARENA_SEGMENT_TYPE_FREE)
+ {
+ OSL_ASSERT(segment->m_addr + segment->m_size == next->m_addr);
+ segment->m_size += next->m_size;
+
+ /* remove from freelist */
+ rtl_arena_freelist_remove (arena, next);
+
+ /* remove from segment list */
+ QUEUE_REMOVE_NAMED(next, s);
+
+ /* release segment descriptor */
+ rtl_arena_segment_put (arena, &next);
+ }
+
+ /* try to merge w/ prev segment */
+ prev = segment->m_sprev;
+ if (prev->m_type == RTL_ARENA_SEGMENT_TYPE_FREE)
+ {
+ OSL_ASSERT(prev->m_addr + prev->m_size == segment->m_addr);
+ segment->m_addr = prev->m_addr;
+ segment->m_size += prev->m_size;
+
+ /* remove from freelist */
+ rtl_arena_freelist_remove (arena, prev);
+
+ /* remove from segment list */
+ QUEUE_REMOVE_NAMED(prev, s);
+
+ /* release segment descriptor */
+ rtl_arena_segment_put (arena, &prev);
+ }
+}
+
+/* ================================================================= */
+
+/** rtl_arena_constructor()
+ */
+static void
+rtl_arena_constructor (void * obj)
+{
+ rtl_arena_type * arena = (rtl_arena_type*)(obj);
+ rtl_arena_segment_type * head;
+ size_t i;
+
+ memset (arena, 0, sizeof(rtl_arena_type));
+
+ QUEUE_START_NAMED(arena, arena_);
+
+ (void) RTL_MEMORY_LOCK_INIT(&(arena->m_lock));
+
+ head = &(arena->m_segment_reserve_span_head);
+ rtl_arena_segment_constructor (head);
+ head->m_type = RTL_ARENA_SEGMENT_TYPE_HEAD;
+
+ head = &(arena->m_segment_reserve_head);
+ rtl_arena_segment_constructor (head);
+ head->m_type = RTL_ARENA_SEGMENT_TYPE_HEAD;
+
+ head = &(arena->m_segment_head);
+ rtl_arena_segment_constructor (head);
+ head->m_type = RTL_ARENA_SEGMENT_TYPE_HEAD;
+
+ for (i = 0; i < RTL_ARENA_FREELIST_SIZE; i++)
+ {
+ head = &(arena->m_freelist_head[i]);
+ rtl_arena_segment_constructor (head);
+
+ head->m_size = (1UL << i);
+ head->m_type = RTL_ARENA_SEGMENT_TYPE_HEAD;
+ }
+
+ arena->m_hash_table = arena->m_hash_table_0;
+ arena->m_hash_size = RTL_ARENA_HASH_SIZE;
+ arena->m_hash_shift = highbit(arena->m_hash_size) - 1;
+}
+
+
+/** rtl_arena_destructor()
+ */
+static void
+rtl_arena_destructor (void * obj)
+{
+ rtl_arena_type * arena = (rtl_arena_type*)(obj);
+ rtl_arena_segment_type * head;
+ size_t i;
+
+ OSL_ASSERT(QUEUE_STARTED_NAMED(arena, arena_));
+
+ RTL_MEMORY_LOCK_DESTROY(&(arena->m_lock));
+
+ head = &(arena->m_segment_reserve_span_head);
+ OSL_ASSERT(head->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD);
+ rtl_arena_segment_destructor (head);
+
+ head = &(arena->m_segment_reserve_head);
+ OSL_ASSERT(head->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD);
+ rtl_arena_segment_destructor (head);
+
+ head = &(arena->m_segment_head);
+ OSL_ASSERT(head->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD);
+ rtl_arena_segment_destructor (head);
+
+ for (i = 0; i < RTL_ARENA_FREELIST_SIZE; i++)
+ {
+ head = &(arena->m_freelist_head[i]);
+
+ OSL_ASSERT(head->m_size == (1UL << i));
+ OSL_ASSERT(head->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD);
+
+ rtl_arena_segment_destructor (head);
+ }
+
+ OSL_ASSERT(arena->m_hash_table == arena->m_hash_table_0);
+ OSL_ASSERT(arena->m_hash_size == RTL_ARENA_HASH_SIZE);
+ OSL_ASSERT(
+ arena->m_hash_shift ==
+ SAL_INT_CAST(unsigned, highbit(arena->m_hash_size) - 1));
+}
+
+/* ================================================================= */
+
+/** rtl_arena_activate()
+ */
+static rtl_arena_type *
+rtl_arena_activate (
+ rtl_arena_type * arena,
+ const char * name,
+ sal_Size quantum,
+ sal_Size quantum_cache_max,
+ rtl_arena_type * source_arena,
+ void * (SAL_CALL * source_alloc)(rtl_arena_type *, sal_Size *),
+ void (SAL_CALL * source_free) (rtl_arena_type *, void *, sal_Size)
+)
+{
+ OSL_ASSERT(arena != 0);
+ if (arena != 0)
+ {
+ (void) snprintf (arena->m_name, sizeof(arena->m_name), "%s", name);
+
+ if (!RTL_MEMORY_ISP2(quantum))
+ {
+ /* roundup to next power of 2 */
+ quantum = (1UL << highbit(quantum));
+ }
+ quantum_cache_max = RTL_MEMORY_P2ROUNDUP(quantum_cache_max, quantum);
+
+ arena->m_quantum = quantum;
+ arena->m_quantum_shift = highbit(arena->m_quantum) - 1;
+ arena->m_qcache_max = quantum_cache_max;
+
+ arena->m_source_arena = source_arena;
+ arena->m_source_alloc = source_alloc;
+ arena->m_source_free = source_free;
+
+ if (arena->m_qcache_max > 0)
+ {
+ char name[RTL_ARENA_NAME_LENGTH + 1];
+ int i, n = (arena->m_qcache_max >> arena->m_quantum_shift);
+
+ sal_Size size = n * sizeof(rtl_cache_type*);
+ arena->m_qcache_ptr = (rtl_cache_type**)rtl_arena_alloc (gp_arena_arena, &size);
+ if (!(arena->m_qcache_ptr))
+ {
+ /* out of memory */
+ return (0);
+ }
+ for (i = 1; i <= n; i++)
+ {
+ size = i * arena->m_quantum;
+ (void) snprintf (name, sizeof(name), "%s_%lu", arena->m_name, size);
+ arena->m_qcache_ptr[i - 1] = rtl_cache_create(name, size, 0, NULL, NULL, NULL, NULL, arena, RTL_CACHE_FLAG_QUANTUMCACHE);
+ }
+ }
+
+ /* insert into arena list */
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_arena_list.m_lock));
+ QUEUE_INSERT_TAIL_NAMED(&(g_arena_list.m_arena_head), arena, arena_);
+ RTL_MEMORY_LOCK_RELEASE(&(g_arena_list.m_lock));
+ }
+ return (arena);
+}
+
+/** rtl_arena_deactivate()
+ */
+static void
+rtl_arena_deactivate (
+ rtl_arena_type * arena
+)
+{
+ rtl_arena_segment_type * head, * segment;
+
+ /* remove from arena list */
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_arena_list.m_lock));
+ QUEUE_REMOVE_NAMED(arena, arena_);
+ RTL_MEMORY_LOCK_RELEASE(&(g_arena_list.m_lock));
+
+ /* cleanup quantum cache(s) */
+ if ((arena->m_qcache_max > 0) && (arena->m_qcache_ptr != 0))
+ {
+ int i, n = (arena->m_qcache_max >> arena->m_quantum_shift);
+ for (i = 1; i <= n; i++)
+ {
+ if (arena->m_qcache_ptr[i - 1] != 0)
+ {
+ rtl_cache_destroy (arena->m_qcache_ptr[i - 1]);
+ arena->m_qcache_ptr[i - 1] = 0;
+ }
+ }
+ rtl_arena_free (
+ gp_arena_arena,
+ arena->m_qcache_ptr,
+ n * sizeof(rtl_cache_type*));
+
+ arena->m_qcache_ptr = 0;
+ }
+
+ /* check for leaked segments */
+ OSL_TRACE(
+ "rtl_arena_deactivate(\"%s\"): "
+ "allocs: %"PRIu64", frees: %"PRIu64"; total: %lu, used: %lu",
+ arena->m_name,
+ arena->m_stats.m_alloc, arena->m_stats.m_free,
+ arena->m_stats.m_mem_total, arena->m_stats.m_mem_alloc
+ );
+ if (arena->m_stats.m_alloc > arena->m_stats.m_free)
+ {
+ sal_Size i, n;
+
+ OSL_TRACE(
+ "rtl_arena_deactivate(\"%s\"): "
+ "cleaning up %"PRIu64" leaked segment(s) [%lu bytes]",
+ arena->m_name,
+ arena->m_stats.m_alloc - arena->m_stats.m_free,
+ arena->m_stats.m_mem_alloc
+ );
+
+ /* cleanup still used segment(s) */
+ for (i = 0, n = arena->m_hash_size; i < n; i++)
+ {
+ while ((segment = arena->m_hash_table[i]) != 0)
+ {
+ /* pop from hash table */
+ arena->m_hash_table[i] = segment->m_fnext, segment->m_fnext = segment->m_fprev = segment;
+
+ /* coalesce w/ adjacent free segment(s) */
+ rtl_arena_segment_coalesce (arena, segment);
+
+ /* insert onto freelist */
+ rtl_arena_freelist_insert (arena, segment);
+ }
+ }
+ }
+
+ /* cleanup hash table */
+ if (arena->m_hash_table != arena->m_hash_table_0)
+ {
+ rtl_arena_free (
+ gp_arena_arena,
+ arena->m_hash_table,
+ arena->m_hash_size * sizeof(rtl_arena_segment_type*));
+
+ arena->m_hash_table = arena->m_hash_table_0;
+ arena->m_hash_size = RTL_ARENA_HASH_SIZE;
+ arena->m_hash_shift = highbit(arena->m_hash_size) - 1;
+ }
+
+ /* cleanup segment list */
+ head = &(arena->m_segment_head);
+ for (segment = head->m_snext; segment != head; segment = head->m_snext)
+ {
+ if (segment->m_type == RTL_ARENA_SEGMENT_TYPE_FREE)
+ {
+ /* remove from freelist */
+ rtl_arena_freelist_remove (arena, segment);
+ }
+ else
+ {
+ /* can have only free and span segments here */
+ OSL_ASSERT(segment->m_type == RTL_ARENA_SEGMENT_TYPE_SPAN);
+ }
+
+ /* remove from segment list */
+ QUEUE_REMOVE_NAMED(segment, s);
+
+ /* release segment descriptor */
+ rtl_arena_segment_put (arena, &segment);
+ }
+
+ /* cleanup segment reserve list */
+ head = &(arena->m_segment_reserve_head);
+ for (segment = head->m_snext; segment != head; segment = head->m_snext)
+ {
+ /* remove from segment list */
+ QUEUE_REMOVE_NAMED(segment, s);
+ }
+
+ /* cleanup segment reserve span(s) */
+ head = &(arena->m_segment_reserve_span_head);
+ for (segment = head->m_snext; segment != head; segment = head->m_snext)
+ {
+ /* can have only span segments here */
+ OSL_ASSERT(segment->m_type == RTL_ARENA_SEGMENT_TYPE_SPAN);
+
+ /* remove from segment list */
+ QUEUE_REMOVE_NAMED(segment, s);
+
+ /* return span to g_machdep_arena */
+ rtl_machdep_free (gp_machdep_arena, (void*)(segment->m_addr), segment->m_size);
+ }
+}
+
+/* ================================================================= *
+ *
+ * arena implementation.
+ *
+ * ================================================================= */
+
+/** rtl_arena_create()
+ */
+rtl_arena_type *
+SAL_CALL rtl_arena_create (
+ const char * name,
+ sal_Size quantum,
+ sal_Size quantum_cache_max,
+ rtl_arena_type * source_arena,
+ void * (SAL_CALL * source_alloc)(rtl_arena_type *, sal_Size *),
+ void (SAL_CALL * source_free) (rtl_arena_type *, void *, sal_Size),
+ int flags
+) SAL_THROW_EXTERN_C()
+{
+ rtl_arena_type * result = 0;
+ sal_Size size = sizeof(rtl_arena_type);
+
+ (void) flags; /* unused */
+
+try_alloc:
+ result = (rtl_arena_type*)rtl_arena_alloc (gp_arena_arena, &size);
+ if (result != 0)
+ {
+ rtl_arena_type * arena = result;
+ rtl_arena_constructor (arena);
+
+ if (!source_arena)
+ {
+ OSL_ASSERT(gp_default_arena != 0);
+ source_arena = gp_default_arena;
+ }
+
+ result = rtl_arena_activate (
+ arena,
+ name,
+ quantum,
+ quantum_cache_max,
+ source_arena,
+ source_alloc,
+ source_free
+ );
+
+ if (result == 0)
+ {
+ rtl_arena_deactivate (arena);
+ rtl_arena_destructor (arena);
+ rtl_arena_free (gp_arena_arena, arena, size);
+ }
+ }
+ else if (gp_arena_arena == 0)
+ {
+ if (rtl_arena_init())
+ {
+ /* try again */
+ goto try_alloc;
+ }
+ }
+ return (result);
+}
+
+/** rtl_arena_destroy()
+ */
+void
+SAL_CALL rtl_arena_destroy (
+ rtl_arena_type * arena
+)
+{
+ if (arena != 0)
+ {
+ rtl_arena_deactivate (arena);
+ rtl_arena_destructor (arena);
+ rtl_arena_free (gp_arena_arena, arena, sizeof(rtl_arena_type));
+ }
+}
+
+/** rtl_arena_alloc()
+ */
+void *
+SAL_CALL rtl_arena_alloc (
+ rtl_arena_type * arena,
+ sal_Size * pSize
+) SAL_THROW_EXTERN_C()
+{
+ void * addr = 0;
+
+ if ((arena != 0) && (pSize != 0))
+ {
+ sal_Size size = RTL_MEMORY_ALIGN((*pSize), arena->m_quantum);
+ if (size > arena->m_qcache_max)
+ {
+ /* allocate from segment list */
+ rtl_arena_segment_type *segment = 0;
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock));
+ if (rtl_arena_segment_alloc (arena, size, &segment) ||
+ rtl_arena_segment_create(arena, size, &segment) )
+ {
+ /* shrink to fit */
+ sal_Size oversize;
+
+ /* mark segment used */
+ OSL_ASSERT(segment->m_type == RTL_ARENA_SEGMENT_TYPE_FREE);
+ segment->m_type = RTL_ARENA_SEGMENT_TYPE_USED;
+
+ /* resize */
+ OSL_ASSERT(segment->m_size >= size);
+ oversize = segment->m_size - size;
+ if (oversize >= SAL_MAX(arena->m_quantum, arena->m_qcache_max))
+ {
+ rtl_arena_segment_type * remainder = 0;
+ rtl_arena_segment_get (arena, &remainder);
+ if (remainder != 0)
+ {
+ segment->m_size = size;
+
+ remainder->m_addr = segment->m_addr + segment->m_size;
+ remainder->m_size = oversize;
+ remainder->m_type = RTL_ARENA_SEGMENT_TYPE_FREE;
+ QUEUE_INSERT_HEAD_NAMED(segment, remainder, s);
+
+ rtl_arena_freelist_insert (arena, remainder);
+ }
+ }
+
+ rtl_arena_hash_insert (arena, segment);
+
+ (*pSize) = segment->m_size;
+ addr = (void*)(segment->m_addr);
+ }
+ RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock));
+ }
+ else if (size > 0)
+ {
+ /* allocate from quantum cache(s) */
+ int index = (size >> arena->m_quantum_shift) - 1;
+ OSL_ASSERT (arena->m_qcache_ptr[index] != 0);
+
+ addr = rtl_cache_alloc (arena->m_qcache_ptr[index]);
+ if (addr != 0)
+ (*pSize) = size;
+ }
+ }
+ return (addr);
+}
+
+/** rtl_arena_free()
+ */
+void
+SAL_CALL rtl_arena_free (
+ rtl_arena_type * arena,
+ void * addr,
+ sal_Size size
+) SAL_THROW_EXTERN_C()
+{
+ if (arena != 0)
+ {
+ size = RTL_MEMORY_ALIGN(size, arena->m_quantum);
+ if (size > arena->m_qcache_max)
+ {
+ /* free to segment list */
+ rtl_arena_segment_type * segment;
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(arena->m_lock));
+
+ segment = rtl_arena_hash_remove (arena, (sal_uIntPtr)(addr), size);
+ if (segment != 0)
+ {
+ rtl_arena_segment_type *next, *prev;
+
+ /* coalesce w/ adjacent free segment(s) */
+ rtl_arena_segment_coalesce (arena, segment);
+
+ /* determine (new) next and prev segment */
+ next = segment->m_snext, prev = segment->m_sprev;
+
+ /* entire span free when prev is a span, and next is either a span or a list head */
+ if (((prev->m_type == RTL_ARENA_SEGMENT_TYPE_SPAN)) &&
+ ((next->m_type == RTL_ARENA_SEGMENT_TYPE_SPAN) ||
+ (next->m_type == RTL_ARENA_SEGMENT_TYPE_HEAD)) )
+ {
+ OSL_ASSERT((prev->m_addr == segment->m_addr) &&
+ (prev->m_size == segment->m_size) );
+
+ if (arena->m_source_free)
+ {
+ addr = (void*)(prev->m_addr);
+ size = prev->m_size;
+
+ /* remove from segment list */
+ QUEUE_REMOVE_NAMED(segment, s);
+
+ /* release segment descriptor */
+ rtl_arena_segment_put (arena, &segment);
+
+ /* remove from segment list */
+ QUEUE_REMOVE_NAMED(prev, s);
+
+ /* release (span) segment descriptor */
+ rtl_arena_segment_put (arena, &prev);
+
+ /* update stats, return span to source arena */
+ arena->m_stats.m_mem_total -= size;
+ RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock));
+
+ (arena->m_source_free)(arena->m_source_arena, addr, size);
+ return;
+ }
+ }
+
+ /* insert onto freelist */
+ rtl_arena_freelist_insert (arena, segment);
+ }
+
+ RTL_MEMORY_LOCK_RELEASE(&(arena->m_lock));
+ }
+ else if (size > 0)
+ {
+ /* free to quantum cache(s) */
+ int index = (size >> arena->m_quantum_shift) - 1;
+ OSL_ASSERT (arena->m_qcache_ptr[index] != 0);
+
+ rtl_cache_free (arena->m_qcache_ptr[index], addr);
+ }
+ }
+}
+
+/* ================================================================= *
+ *
+ * machdep internals.
+ *
+ * ================================================================= */
+
+#if defined(SAL_UNX)
+#include <sys/mman.h>
+#elif defined(SAL_W32) || defined(SAL_OS2)
+#define MAP_FAILED 0
+#endif /* SAL_UNX || SAL_W32 */
+
+/** rtl_machdep_alloc()
+ */
+static void *
+SAL_CALL rtl_machdep_alloc (
+ rtl_arena_type * pArena,
+ sal_Size * pSize
+)
+{
+ void * addr;
+ sal_Size size = (*pSize);
+
+ OSL_PRECOND(pArena == gp_machdep_arena, "rtl_machdep_alloc(): invalid argument");
+
+#if defined(SOLARIS) && defined(SPARC)
+ /* see @ mmap(2) man pages */
+ size += (pArena->m_quantum + pArena->m_quantum); /* "red-zone" pages */
+ if (size > (4 << 20))
+ size = RTL_MEMORY_P2ROUNDUP(size, (4 << 20));
+ else if (size > (512 << 10))
+ size = RTL_MEMORY_P2ROUNDUP(size, (512 << 10));
+ else
+ size = RTL_MEMORY_P2ROUNDUP(size, (64 << 10));
+ size -= (pArena->m_quantum + pArena->m_quantum); /* "red-zone" pages */
+#else
+ /* default allocation granularity */
+ size = RTL_MEMORY_P2ROUNDUP(size, SAL_MAX(pArena->m_quantum, 64 << 10));
+#endif
+
+#if defined(SAL_UNX)
+ addr = mmap (NULL, (size_t)(size), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+#elif defined(SAL_W32)
+ addr = VirtualAlloc (NULL, (SIZE_T)(size), MEM_COMMIT, PAGE_READWRITE);
+#elif defined(SAL_OS2)
+ {
+ APIRET rc;
+ addr = 0;
+ // Use DosAlloc* to get a 4KB page aligned address.
+ rc = DosAllocMem( &addr, size, PAG_COMMIT | PAG_READ | PAG_WRITE | OBJ_ANY);
+ if (rc) {
+ fprintf( stderr, "sal3::DosAllocMem failed rc=%d\n", rc);
+ addr = 0;
+ }
+ }
+#endif /* (SAL_UNX || SAL_W32 || SAL_OS2) */
+
+ if (addr != MAP_FAILED)
+ {
+ pArena->m_stats.m_alloc += 1;
+ pArena->m_stats.m_mem_total += size;
+ pArena->m_stats.m_mem_alloc += size;
+
+ (*pSize) = size;
+ return (addr);
+ }
+ return (NULL);
+}
+
+/** rtl_machdep_free()
+ */
+static void
+SAL_CALL rtl_machdep_free (
+ rtl_arena_type * pArena,
+ void * pAddr,
+ sal_Size nSize
+)
+{
+ OSL_PRECOND(pArena == gp_machdep_arena, "rtl_machdep_free(): invalid argument");
+
+ pArena->m_stats.m_free += 1;
+ pArena->m_stats.m_mem_total -= nSize;
+ pArena->m_stats.m_mem_alloc -= nSize;
+
+#if defined(SAL_UNX)
+ (void) munmap(pAddr, nSize);
+#elif defined(SAL_W32)
+ (void) VirtualFree ((LPVOID)(pAddr), (SIZE_T)(0), MEM_RELEASE);
+#elif defined(SAL_OS2)
+ (void) DosFreeMem( pAddr);
+#endif /* (SAL_UNX || SAL_W32) */
+}
+
+/** rtl_machdep_pagesize()
+ */
+static sal_Size
+rtl_machdep_pagesize (void)
+{
+#if defined(SAL_UNX)
+#if defined(FREEBSD) || defined(NETBSD)
+ return ((sal_Size)getpagesize());
+#else /* POSIX */
+ return ((sal_Size)sysconf(_SC_PAGESIZE));
+#endif /* xBSD || POSIX */
+#elif defined(SAL_W32)
+ SYSTEM_INFO info;
+ GetSystemInfo (&info);
+ return ((sal_Size)(info.dwPageSize));
+#elif defined(SAL_OS2)
+ ULONG ulPageSize;
+ DosQuerySysInfo(QSV_PAGE_SIZE, QSV_PAGE_SIZE, &ulPageSize, sizeof(ULONG));
+ return ((sal_Size)ulPageSize);
+#endif /* (SAL_UNX || SAL_W32) */
+}
+
+/* ================================================================= *
+ *
+ * arena initialization.
+ *
+ * ================================================================= */
+
+static void
+rtl_arena_once_init (void)
+{
+ {
+ /* list of arenas */
+ RTL_MEMORY_LOCK_INIT(&(g_arena_list.m_lock));
+ rtl_arena_constructor (&(g_arena_list.m_arena_head));
+ }
+ {
+ /* machdep (pseudo) arena */
+ static rtl_arena_type g_machdep_arena;
+
+ OSL_ASSERT(gp_machdep_arena == 0);
+ rtl_arena_constructor (&g_machdep_arena);
+
+ gp_machdep_arena = rtl_arena_activate (
+ &g_machdep_arena,
+ "rtl_machdep_arena",
+ rtl_machdep_pagesize(),
+ 0, /* no quantum caching */
+ 0, 0, 0 /* no source */
+ );
+ OSL_ASSERT(gp_machdep_arena != 0);
+ }
+ {
+ /* default arena */
+ static rtl_arena_type g_default_arena;
+
+ OSL_ASSERT(gp_default_arena == 0);
+ rtl_arena_constructor (&g_default_arena);
+
+ gp_default_arena = rtl_arena_activate (
+ &g_default_arena,
+ "rtl_default_arena",
+ rtl_machdep_pagesize(),
+ 0, /* no quantum caching */
+ gp_machdep_arena, /* source */
+ rtl_machdep_alloc,
+ rtl_machdep_free
+ );
+ OSL_ASSERT(gp_default_arena != 0);
+ }
+ {
+ /* arena internal arena */
+ static rtl_arena_type g_arena_arena;
+
+ OSL_ASSERT(gp_arena_arena == 0);
+ rtl_arena_constructor (&g_arena_arena);
+
+ gp_arena_arena = rtl_arena_activate (
+ &g_arena_arena,
+ "rtl_arena_internal_arena",
+ 64, /* quantum */
+ 0, /* no quantum caching */
+ gp_default_arena, /* source */
+ rtl_arena_alloc,
+ rtl_arena_free
+ );
+ OSL_ASSERT(gp_arena_arena != 0);
+ }
+}
+
+static int
+rtl_arena_init (void)
+{
+ static sal_once_type g_once = SAL_ONCE_INIT;
+ SAL_ONCE(&g_once, rtl_arena_once_init);
+ return (gp_arena_arena != 0);
+}
+
+/* ================================================================= */
+
+#if defined(__GNUC__)
+static void rtl_arena_fini (void) __attribute__((destructor));
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma fini(rtl_arena_fini)
+static void rtl_arena_fini (void);
+#endif /* __GNUC__ || __SUNPRO_C */
+
+void
+rtl_arena_fini (void)
+{
+ if (gp_arena_arena != 0)
+ {
+ rtl_arena_type * arena, * head;
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_arena_list.m_lock));
+ head = &(g_arena_list.m_arena_head);
+
+ for (arena = head->m_arena_next; arena != head; arena = arena->m_arena_next)
+ {
+ OSL_TRACE(
+ "rtl_arena_fini(\"%s\"): "
+ "allocs: %"PRIu64", frees: %"PRIu64"; total: %lu, used: %lu",
+ arena->m_name,
+ arena->m_stats.m_alloc, arena->m_stats.m_free,
+ arena->m_stats.m_mem_total, arena->m_stats.m_mem_alloc
+ );
+ }
+ RTL_MEMORY_LOCK_RELEASE(&(g_arena_list.m_lock));
+ }
+}
+
+/* ================================================================= */
diff --git a/sal/rtl/source/alloc_arena.h b/sal/rtl/source/alloc_arena.h
new file mode 100644
index 000000000000..45907802dba9
--- /dev/null
+++ b/sal/rtl/source/alloc_arena.h
@@ -0,0 +1,137 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_ALLOC_ARENA_H
+#define INCLUDED_RTL_ALLOC_ARENA_H
+
+#include "sal/types.h"
+#include "rtl/alloc.h"
+#include "alloc_impl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** rtl_arena_stat_type
+ * @internal
+ */
+typedef struct rtl_arena_stat_st rtl_arena_stat_type;
+struct rtl_arena_stat_st
+{
+ sal_uInt64 m_alloc;
+ sal_uInt64 m_free;
+
+ sal_Size m_mem_total;
+ sal_Size m_mem_alloc;
+};
+
+
+/** rtl_arena_segment_type
+ * @internal
+ */
+#define RTL_ARENA_SEGMENT_TYPE_HEAD ((sal_Size)(0x01))
+#define RTL_ARENA_SEGMENT_TYPE_SPAN ((sal_Size)(0x02))
+#define RTL_ARENA_SEGMENT_TYPE_FREE ((sal_Size)(0x04))
+#define RTL_ARENA_SEGMENT_TYPE_USED ((sal_Size)(0x08))
+
+typedef struct rtl_arena_segment_st rtl_arena_segment_type;
+struct rtl_arena_segment_st
+{
+ /* segment list linkage */
+ rtl_arena_segment_type * m_snext;
+ rtl_arena_segment_type * m_sprev;
+
+ /* free/used list linkage */
+ rtl_arena_segment_type * m_fnext;
+ rtl_arena_segment_type * m_fprev;
+
+ /* segment description */
+ sal_uIntPtr m_addr;
+ sal_Size m_size;
+ sal_Size m_type;
+};
+
+
+/** rtl_arena_type
+ * @internal
+ */
+#define RTL_ARENA_FREELIST_SIZE (sizeof(void*) * 8)
+#define RTL_ARENA_HASH_SIZE 64
+
+#define RTL_ARENA_FLAG_RESCALE 1 /* within hash rescale operation */
+
+struct rtl_arena_st
+{
+ /* linkage */
+ rtl_arena_type * m_arena_next;
+ rtl_arena_type * m_arena_prev;
+
+ /* properties */
+ char m_name[RTL_ARENA_NAME_LENGTH + 1];
+ long m_flags;
+
+ rtl_memory_lock_type m_lock;
+ rtl_arena_stat_type m_stats;
+
+ rtl_arena_type * m_source_arena;
+ void * (SAL_CALL * m_source_alloc)(rtl_arena_type *, sal_Size *);
+ void (SAL_CALL * m_source_free) (rtl_arena_type *, void *, sal_Size);
+
+ sal_Size m_quantum;
+ sal_Size m_quantum_shift; /* log2(m_quantum) */
+
+ rtl_arena_segment_type m_segment_reserve_span_head;
+ rtl_arena_segment_type m_segment_reserve_head;
+
+ rtl_arena_segment_type m_segment_head;
+
+ rtl_arena_segment_type m_freelist_head[RTL_ARENA_FREELIST_SIZE];
+ sal_Size m_freelist_bitmap;
+
+ rtl_arena_segment_type ** m_hash_table;
+ rtl_arena_segment_type * m_hash_table_0[RTL_ARENA_HASH_SIZE];
+ sal_Size m_hash_size; /* m_hash_mask + 1 */
+ sal_Size m_hash_shift; /* log2(m_hash_size) */
+
+ sal_Size m_qcache_max;
+ rtl_cache_type ** m_qcache_ptr;
+};
+
+
+/** gp_default_arena
+ * default arena with pagesize quantum
+ *
+ * @internal
+ */
+extern rtl_arena_type * gp_default_arena;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INCLUDED_RTL_ALLOC_ARENA_H */
diff --git a/sal/rtl/source/alloc_cache.c b/sal/rtl/source/alloc_cache.c
new file mode 100644
index 000000000000..4e2c030fb3a6
--- /dev/null
+++ b/sal/rtl/source/alloc_cache.c
@@ -0,0 +1,1721 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "alloc_cache.h"
+#include "alloc_impl.h"
+#include "alloc_arena.h"
+#include "internal/once.h"
+#include "sal/macros.h"
+#include "osl/diagnose.h"
+
+#ifndef INCLUDED_STRING_H
+#include <string.h>
+#endif
+
+#ifndef INCLUDED_STDIO_H
+#include <stdio.h>
+#endif
+
+#ifdef OS2
+#undef OSL_TRACE
+#define OSL_TRACE 1 ? ((void)0) : _OSL_GLOBAL osl_trace
+#endif
+
+/* ================================================================= *
+ *
+ * cache internals.
+ *
+ * ================================================================= */
+
+/** g_cache_list
+ * @internal
+ */
+struct rtl_cache_list_st
+{
+ rtl_memory_lock_type m_lock;
+ rtl_cache_type m_cache_head;
+
+#if defined(SAL_UNX) || defined(SAL_OS2)
+ pthread_t m_update_thread;
+ pthread_cond_t m_update_cond;
+#elif defined(SAL_W32)
+ HANDLE m_update_thread;
+ HANDLE m_update_cond;
+#endif /* SAL_UNX || SAL_W32 */
+ int m_update_done;
+};
+
+static struct rtl_cache_list_st g_cache_list;
+
+
+/** gp_cache_arena
+ * provided for cache_type allocations, and hash_table resizing.
+ *
+ * @internal
+ */
+static rtl_arena_type * gp_cache_arena = 0;
+
+
+/** gp_cache_magazine_cache
+ * @internal
+ */
+static rtl_cache_type * gp_cache_magazine_cache = 0;
+
+
+/** gp_cache_slab_cache
+ * @internal
+ */
+static rtl_cache_type * gp_cache_slab_cache = 0;
+
+
+/** gp_cache_bufctl_cache
+ * @internal
+ */
+static rtl_cache_type * gp_cache_bufctl_cache = 0;
+
+
+/** rtl_cache_init()
+ * @internal
+ */
+static int
+rtl_cache_init (void);
+
+
+/* ================================================================= */
+
+/** RTL_CACHE_HASH_INDEX()
+ */
+#define RTL_CACHE_HASH_INDEX_IMPL(a, s, q, m) \
+ ((((a) + ((a) >> (s)) + ((a) >> ((s) << 1))) >> (q)) & (m))
+
+#define RTL_CACHE_HASH_INDEX(cache, addr) \
+ RTL_CACHE_HASH_INDEX_IMPL((addr), (cache)->m_hash_shift, (cache)->m_type_shift, ((cache)->m_hash_size - 1))
+
+
+/** rtl_cache_hash_rescale()
+ */
+static void
+rtl_cache_hash_rescale (
+ rtl_cache_type * cache,
+ sal_Size new_size
+)
+{
+ rtl_cache_bufctl_type ** new_table;
+ sal_Size new_bytes;
+
+ new_bytes = new_size * sizeof(rtl_cache_bufctl_type*);
+ new_table = (rtl_cache_bufctl_type**)rtl_arena_alloc(gp_cache_arena, &new_bytes);
+
+ if (new_table != 0)
+ {
+ rtl_cache_bufctl_type ** old_table;
+ sal_Size old_size, i;
+
+ memset (new_table, 0, new_bytes);
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock));
+
+ old_table = cache->m_hash_table;
+ old_size = cache->m_hash_size;
+
+ OSL_TRACE(
+ "rtl_cache_hash_rescale(\"%s\"): "
+ "nbuf: % " PRIu64 " (ave: %" PRIu64 "), frees: %" PRIu64 " "
+ "[old_size: %lu, new_size: %lu]",
+ cache->m_name,
+ cache->m_slab_stats.m_alloc - cache->m_slab_stats.m_free,
+ (cache->m_slab_stats.m_alloc - cache->m_slab_stats.m_free) >> cache->m_hash_shift,
+ cache->m_slab_stats.m_free,
+ old_size, new_size);
+
+ cache->m_hash_table = new_table;
+ cache->m_hash_size = new_size;
+ cache->m_hash_shift = highbit(cache->m_hash_size) - 1;
+
+ for (i = 0; i < old_size; i++)
+ {
+ rtl_cache_bufctl_type * curr = old_table[i];
+ while (curr != 0)
+ {
+ rtl_cache_bufctl_type * next = curr->m_next;
+ rtl_cache_bufctl_type ** head;
+
+ head = &(cache->m_hash_table[RTL_CACHE_HASH_INDEX(cache, curr->m_addr)]);
+ curr->m_next = (*head);
+ (*head) = curr;
+
+ curr = next;
+ }
+ old_table[i] = 0;
+ }
+
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock));
+
+ if (old_table != cache->m_hash_table_0)
+ {
+ sal_Size old_bytes = old_size * sizeof(rtl_cache_bufctl_type*);
+ rtl_arena_free (gp_cache_arena, old_table, old_bytes);
+ }
+ }
+}
+
+/** rtl_cache_hash_insert()
+ */
+static RTL_MEMORY_INLINE sal_uIntPtr
+rtl_cache_hash_insert (
+ rtl_cache_type * cache,
+ rtl_cache_bufctl_type * bufctl
+)
+{
+ rtl_cache_bufctl_type ** ppHead;
+
+ ppHead = &(cache->m_hash_table[RTL_CACHE_HASH_INDEX(cache, bufctl->m_addr)]);
+
+ bufctl->m_next = (*ppHead);
+ (*ppHead) = bufctl;
+
+ return (bufctl->m_addr);
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_cache_hash_insert)
+#endif /* __SUNPRO_C */
+
+
+/** rtl_cache_hash_remove()
+ */
+static rtl_cache_bufctl_type *
+rtl_cache_hash_remove (
+ rtl_cache_type * cache,
+ sal_uIntPtr addr
+)
+{
+ rtl_cache_bufctl_type ** ppHead;
+ rtl_cache_bufctl_type * bufctl;
+ sal_Size lookups = 0;
+
+ ppHead = &(cache->m_hash_table[RTL_CACHE_HASH_INDEX(cache, addr)]);
+ while ((bufctl = *ppHead) != 0)
+ {
+ if (bufctl->m_addr == addr)
+ {
+ *ppHead = bufctl->m_next, bufctl->m_next = 0;
+ break;
+ }
+
+ lookups += 1;
+ ppHead = &(bufctl->m_next);
+ }
+
+ OSL_ASSERT (bufctl != 0); /* bad free */
+
+ if (lookups > 1)
+ {
+ sal_Size nbuf = (sal_Size)(cache->m_slab_stats.m_alloc - cache->m_slab_stats.m_free);
+ if (nbuf > 4 * cache->m_hash_size)
+ {
+ if (!(cache->m_features & RTL_CACHE_FEATURE_RESCALE))
+ {
+ sal_Size ave = nbuf >> cache->m_hash_shift;
+ sal_Size new_size = cache->m_hash_size << (highbit(ave) - 1);
+
+ cache->m_features |= RTL_CACHE_FEATURE_RESCALE;
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock));
+ rtl_cache_hash_rescale (cache, new_size);
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock));
+ cache->m_features &= ~RTL_CACHE_FEATURE_RESCALE;
+ }
+ }
+ }
+
+ return (bufctl);
+}
+
+/* ================================================================= */
+
+/** RTL_CACHE_SLAB()
+ */
+#define RTL_CACHE_SLAB(addr, size) \
+ (((rtl_cache_slab_type*)(RTL_MEMORY_P2END((sal_uIntPtr)(addr), (size)))) - 1)
+
+
+/** rtl_cache_slab_constructor()
+ */
+static int
+rtl_cache_slab_constructor (void * obj, void * arg)
+{
+ rtl_cache_slab_type * slab = (rtl_cache_slab_type*)(obj);
+
+ (void) arg; /* unused */
+
+ QUEUE_START_NAMED(slab, slab_);
+ slab->m_ntypes = 0;
+
+ return (1);
+}
+
+
+/** rtl_cache_slab_destructor()
+ */
+static void
+rtl_cache_slab_destructor (void * obj, void * arg)
+{
+#if OSL_DEBUG_LEVEL == 0
+ (void) obj; /* unused */
+#else /* OSL_DEBUG_LEVEL */
+ rtl_cache_slab_type * slab = (rtl_cache_slab_type*)(obj);
+
+ /* assure removed from queue(s) */
+ OSL_ASSERT(QUEUE_STARTED_NAMED(slab, slab_));
+
+ /* assure no longer referenced */
+ OSL_ASSERT(slab->m_ntypes == 0);
+#endif /* OSL_DEBUG_LEVEL */
+
+ (void) arg; /* unused */
+}
+
+
+/** rtl_cache_slab_create()
+ *
+ * @precond cache->m_slab_lock released.
+ */
+static rtl_cache_slab_type *
+rtl_cache_slab_create (
+ rtl_cache_type * cache
+)
+{
+ rtl_cache_slab_type * slab = 0;
+ void * addr;
+ sal_Size size;
+
+ size = cache->m_slab_size;
+ addr = rtl_arena_alloc (cache->m_source, &size);
+ if (addr != 0)
+ {
+ OSL_ASSERT(size >= cache->m_slab_size);
+
+ if (cache->m_features & RTL_CACHE_FEATURE_HASH)
+ {
+ /* allocate slab struct from slab cache */
+ OSL_ASSERT (cache != gp_cache_slab_cache);
+ slab = (rtl_cache_slab_type*)rtl_cache_alloc (gp_cache_slab_cache);
+ }
+ else
+ {
+ /* construct embedded slab struct */
+ slab = RTL_CACHE_SLAB(addr, cache->m_slab_size);
+ (void) rtl_cache_slab_constructor (slab, 0);
+ }
+ if (slab != 0)
+ {
+ slab->m_data = (sal_uIntPtr)(addr);
+
+ /* dynamic freelist initialization */
+ slab->m_bp = slab->m_data;
+ slab->m_sp = 0;
+ }
+ else
+ {
+ rtl_arena_free (cache->m_source, addr, size);
+ }
+ }
+ return (slab);
+}
+
+
+/** rtl_cache_slab_destroy()
+ *
+ * @precond cache->m_slab_lock released.
+ */
+static void
+rtl_cache_slab_destroy (
+ rtl_cache_type * cache,
+ rtl_cache_slab_type * slab
+)
+{
+ void * addr = (void*)(slab->m_data);
+ sal_Size refcnt = slab->m_ntypes; slab->m_ntypes = 0;
+
+ if (cache->m_features & RTL_CACHE_FEATURE_HASH)
+ {
+ /* cleanup bufctl(s) for free buffer(s) */
+ sal_Size ntypes = (slab->m_bp - slab->m_data) / cache->m_type_size;
+ for (ntypes -= refcnt; slab->m_sp != 0; ntypes--)
+ {
+ rtl_cache_bufctl_type * bufctl = slab->m_sp;
+
+ /* pop from freelist */
+ slab->m_sp = bufctl->m_next, bufctl->m_next = 0;
+
+ /* return bufctl struct to bufctl cache */
+ rtl_cache_free (gp_cache_bufctl_cache, bufctl);
+ }
+ OSL_ASSERT(ntypes == 0);
+
+ /* return slab struct to slab cache */
+ rtl_cache_free (gp_cache_slab_cache, slab);
+ }
+ else
+ {
+ /* destruct embedded slab struct */
+ rtl_cache_slab_destructor (slab, 0);
+ }
+
+ if ((refcnt == 0) || (cache->m_features & RTL_CACHE_FEATURE_BULKDESTROY))
+ {
+ /* free memory */
+ rtl_arena_free (cache->m_source, addr, cache->m_slab_size);
+ }
+}
+
+
+/** rtl_cache_slab_populate()
+ *
+ * @precond cache->m_slab_lock acquired.
+ */
+static int
+rtl_cache_slab_populate (
+ rtl_cache_type * cache
+)
+{
+ rtl_cache_slab_type * slab;
+
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock));
+ slab = rtl_cache_slab_create (cache);
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock));
+ if (slab != 0)
+ {
+ /* update buffer start addr w/ current color */
+ slab->m_bp += cache->m_ncolor;
+
+ /* update color for next slab */
+ cache->m_ncolor += cache->m_type_align;
+ if (cache->m_ncolor > cache->m_ncolor_max)
+ cache->m_ncolor = 0;
+
+ /* update stats */
+ cache->m_slab_stats.m_mem_total += cache->m_slab_size;
+
+ /* insert onto 'free' queue */
+ QUEUE_INSERT_HEAD_NAMED(&(cache->m_free_head), slab, slab_);
+ }
+ return (slab != 0);
+}
+
+/* ================================================================= */
+
+/** rtl_cache_slab_alloc()
+ *
+ * Allocate a buffer from slab layer; used by magazine layer.
+ */
+static void *
+rtl_cache_slab_alloc (
+ rtl_cache_type * cache
+)
+{
+ void * addr = 0;
+ rtl_cache_slab_type * head;
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock));
+
+ head = &(cache->m_free_head);
+ if ((head->m_slab_next != head) || rtl_cache_slab_populate (cache))
+ {
+ rtl_cache_slab_type * slab;
+ rtl_cache_bufctl_type * bufctl;
+
+ slab = head->m_slab_next;
+ OSL_ASSERT(slab->m_ntypes < cache->m_ntypes);
+
+ if (slab->m_sp == 0)
+ {
+ /* initialize bufctl w/ current 'slab->m_bp' */
+ OSL_ASSERT (slab->m_bp < slab->m_data + cache->m_ntypes * cache->m_type_size + cache->m_ncolor_max);
+ if (cache->m_features & RTL_CACHE_FEATURE_HASH)
+ {
+ /* allocate bufctl */
+ OSL_ASSERT (cache != gp_cache_bufctl_cache);
+ bufctl = (rtl_cache_bufctl_type*)rtl_cache_alloc (gp_cache_bufctl_cache);
+ if (bufctl == 0)
+ {
+ /* out of memory */
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock));
+ return (0);
+ }
+
+ bufctl->m_addr = slab->m_bp;
+ bufctl->m_slab = (sal_uIntPtr)(slab);
+ }
+ else
+ {
+ /* embedded bufctl */
+ bufctl = (rtl_cache_bufctl_type*)(slab->m_bp);
+ }
+ bufctl->m_next = 0;
+
+ /* update 'slab->m_bp' to next free buffer */
+ slab->m_bp += cache->m_type_size;
+
+ /* assign bufctl to freelist */
+ slab->m_sp = bufctl;
+ }
+
+ /* pop front */
+ bufctl = slab->m_sp;
+ slab->m_sp = bufctl->m_next;
+
+ /* increment usage, check for full slab */
+ if ((slab->m_ntypes += 1) == cache->m_ntypes)
+ {
+ /* remove from 'free' queue */
+ QUEUE_REMOVE_NAMED(slab, slab_);
+
+ /* insert onto 'used' queue (tail) */
+ QUEUE_INSERT_TAIL_NAMED(&(cache->m_used_head), slab, slab_);
+ }
+
+ /* update stats */
+ cache->m_slab_stats.m_alloc += 1;
+ cache->m_slab_stats.m_mem_alloc += cache->m_type_size;
+
+ if (cache->m_features & RTL_CACHE_FEATURE_HASH)
+ addr = (void*)rtl_cache_hash_insert (cache, bufctl);
+ else
+ addr = bufctl;
+ }
+
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock));
+ return (addr);
+}
+
+
+/** rtl_cache_slab_free()
+ *
+ * Return a buffer to slab layer; used by magazine layer.
+ */
+static void
+rtl_cache_slab_free (
+ rtl_cache_type * cache,
+ void * addr
+)
+{
+ rtl_cache_bufctl_type * bufctl;
+ rtl_cache_slab_type * slab;
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_slab_lock));
+
+ /* determine slab from addr */
+ if (cache->m_features & RTL_CACHE_FEATURE_HASH)
+ {
+ bufctl = rtl_cache_hash_remove (cache, (sal_uIntPtr)(addr));
+ slab = (bufctl != 0) ? (rtl_cache_slab_type*)(bufctl->m_slab) : 0;
+ }
+ else
+ {
+ /* embedded slab struct */
+ bufctl = (rtl_cache_bufctl_type*)(addr);
+ slab = RTL_CACHE_SLAB(addr, cache->m_slab_size);
+ }
+
+ if (slab != 0)
+ {
+ /* check for full slab */
+ if (slab->m_ntypes == cache->m_ntypes)
+ {
+ /* remove from 'used' queue */
+ QUEUE_REMOVE_NAMED(slab, slab_);
+
+ /* insert onto 'free' queue (head) */
+ QUEUE_INSERT_HEAD_NAMED(&(cache->m_free_head), slab, slab_);
+ }
+
+ /* push front */
+ bufctl->m_next = slab->m_sp;
+ slab->m_sp = bufctl;
+
+ /* update stats */
+ cache->m_slab_stats.m_free += 1;
+ cache->m_slab_stats.m_mem_alloc -= cache->m_type_size;
+
+ /* decrement usage, check for empty slab */
+ if ((slab->m_ntypes -= 1) == 0)
+ {
+ /* remove from 'free' queue */
+ QUEUE_REMOVE_NAMED(slab, slab_);
+
+ /* update stats */
+ cache->m_slab_stats.m_mem_total -= cache->m_slab_size;
+
+ /* free 'empty' slab */
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock));
+ rtl_cache_slab_destroy (cache, slab);
+ return;
+ }
+ }
+
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_slab_lock));
+}
+
+/* ================================================================= */
+
+/** rtl_cache_magazine_constructor()
+ */
+static int
+rtl_cache_magazine_constructor (void * obj, void * arg)
+{
+ rtl_cache_magazine_type * mag = (rtl_cache_magazine_type*)(obj);
+ /* @@@ sal_Size size = (sal_Size)(arg); @@@ */
+
+ (void) arg; /* unused */
+
+ mag->m_mag_next = 0;
+ mag->m_mag_size = RTL_CACHE_MAGAZINE_SIZE;
+ mag->m_mag_used = 0;
+
+ return (1);
+}
+
+
+/** rtl_cache_magazine_destructor()
+ */
+static void
+rtl_cache_magazine_destructor (void * obj, void * arg)
+{
+#if OSL_DEBUG_LEVEL == 0
+ (void) obj; /* unused */
+#else /* OSL_DEBUG_LEVEL */
+ rtl_cache_magazine_type * mag = (rtl_cache_magazine_type*)(obj);
+
+ /* assure removed from queue(s) */
+ OSL_ASSERT(mag->m_mag_next == 0);
+
+ /* assure no longer referenced */
+ OSL_ASSERT(mag->m_mag_used == 0);
+#endif /* OSL_DEBUG_LEVEL */
+
+ (void) arg; /* unused */
+}
+
+
+/** rtl_cache_magazine_clear()
+ */
+static void
+rtl_cache_magazine_clear (
+ rtl_cache_type * cache,
+ rtl_cache_magazine_type * mag
+)
+{
+ for (; mag->m_mag_used > 0; --mag->m_mag_used)
+ {
+ void * obj = mag->m_objects[mag->m_mag_used - 1];
+ mag->m_objects[mag->m_mag_used - 1] = 0;
+
+ if (cache->m_destructor != 0)
+ {
+ /* destruct object */
+ (cache->m_destructor)(obj, cache->m_userarg);
+ }
+
+ /* return buffer to slab layer */
+ rtl_cache_slab_free (cache, obj);
+ }
+}
+
+/* ================================================================= */
+
+/** rtl_cache_depot_enqueue()
+ *
+ * @precond cache->m_depot_lock acquired.
+ */
+static RTL_MEMORY_INLINE void
+rtl_cache_depot_enqueue (
+ rtl_cache_depot_type * depot,
+ rtl_cache_magazine_type * mag
+)
+{
+ /* enqueue empty magazine */
+ mag->m_mag_next = depot->m_mag_next;
+ depot->m_mag_next = mag;
+
+ /* update depot stats */
+ depot->m_mag_count++;
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_cache_depot_enqueue)
+#endif /* __SUNPRO_C */
+
+
+/** rtl_cache_depot_dequeue()
+ *
+ * @precond cache->m_depot_lock acquired.
+ */
+static RTL_MEMORY_INLINE rtl_cache_magazine_type *
+rtl_cache_depot_dequeue (
+ rtl_cache_depot_type * depot
+)
+{
+ rtl_cache_magazine_type * mag = 0;
+ if (depot->m_mag_count > 0)
+ {
+ /* dequeue magazine */
+ OSL_ASSERT(depot->m_mag_next != 0);
+
+ mag = depot->m_mag_next;
+ depot->m_mag_next = mag->m_mag_next;
+ mag->m_mag_next = 0;
+
+ /* update depot stats */
+ depot->m_mag_count--;
+ depot->m_curr_min = SAL_MIN(depot->m_curr_min, depot->m_mag_count);
+ }
+ return (mag);
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_cache_depot_dequeue)
+#endif /* __SUNPRO_C */
+
+
+/** rtl_cache_depot_exchange_alloc()
+ *
+ * @precond cache->m_depot_lock acquired.
+ */
+static RTL_MEMORY_INLINE rtl_cache_magazine_type *
+rtl_cache_depot_exchange_alloc (
+ rtl_cache_type * cache,
+ rtl_cache_magazine_type * empty
+)
+{
+ rtl_cache_magazine_type * full;
+
+ OSL_ASSERT((empty == 0) || (empty->m_mag_used == 0));
+
+ /* dequeue full magazine */
+ full = rtl_cache_depot_dequeue (&(cache->m_depot_full));
+ if ((full != 0) && (empty != 0))
+ {
+ /* enqueue empty magazine */
+ rtl_cache_depot_enqueue (&(cache->m_depot_empty), empty);
+ }
+
+ OSL_ASSERT((full == 0) || (full->m_mag_used > 0));
+
+ return (full);
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_cache_depot_exchange_alloc)
+#endif /* __SUNPRO_C */
+
+
+/** rtl_cache_depot_exchange_free()
+ *
+ * @precond cache->m_depot_lock acquired.
+ */
+static RTL_MEMORY_INLINE rtl_cache_magazine_type *
+rtl_cache_depot_exchange_free (
+ rtl_cache_type * cache,
+ rtl_cache_magazine_type * full
+)
+{
+ rtl_cache_magazine_type * empty;
+
+ OSL_ASSERT((full == 0) || (full->m_mag_used > 0));
+
+ /* dequeue empty magazine */
+ empty = rtl_cache_depot_dequeue (&(cache->m_depot_empty));
+ if ((empty != 0) && (full != 0))
+ {
+ /* enqueue full magazine */
+ rtl_cache_depot_enqueue (&(cache->m_depot_full), full);
+ }
+
+ OSL_ASSERT((empty == 0) || (empty->m_mag_used == 0));
+
+ return (empty);
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(rtl_cache_depot_exchange_free)
+#endif /* __SUNPRO_C */
+
+
+/** rtl_cache_depot_populate()
+ *
+ * @precond cache->m_depot_lock acquired.
+ */
+static int
+rtl_cache_depot_populate (
+ rtl_cache_type * cache
+)
+{
+ rtl_cache_magazine_type * empty = 0;
+
+ if (cache->m_magazine_cache != 0)
+ {
+ /* allocate new empty magazine */
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock));
+ empty = (rtl_cache_magazine_type*)rtl_cache_alloc (cache->m_magazine_cache);
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock));
+ if (empty != 0)
+ {
+ /* enqueue (new) empty magazine */
+ rtl_cache_depot_enqueue (&(cache->m_depot_empty), empty);
+ }
+ }
+ return (empty != 0);
+}
+
+/* ================================================================= */
+
+/** rtl_cache_constructor()
+ */
+static int
+rtl_cache_constructor (void * obj)
+{
+ rtl_cache_type * cache = (rtl_cache_type*)(obj);
+
+ memset (cache, 0, sizeof(rtl_cache_type));
+
+ /* linkage */
+ QUEUE_START_NAMED(cache, cache_);
+
+ /* slab layer */
+ (void)RTL_MEMORY_LOCK_INIT(&(cache->m_slab_lock));
+
+ QUEUE_START_NAMED(&(cache->m_free_head), slab_);
+ QUEUE_START_NAMED(&(cache->m_used_head), slab_);
+
+ cache->m_hash_table = cache->m_hash_table_0;
+ cache->m_hash_size = RTL_CACHE_HASH_SIZE;
+ cache->m_hash_shift = highbit(cache->m_hash_size) - 1;
+
+ /* depot layer */
+ (void)RTL_MEMORY_LOCK_INIT(&(cache->m_depot_lock));
+
+ return (1);
+}
+
+/** rtl_cache_destructor()
+ */
+static void
+rtl_cache_destructor (void * obj)
+{
+ rtl_cache_type * cache = (rtl_cache_type*)(obj);
+
+ /* linkage */
+ OSL_ASSERT(QUEUE_STARTED_NAMED(cache, cache_));
+
+ /* slab layer */
+ (void)RTL_MEMORY_LOCK_DESTROY(&(cache->m_slab_lock));
+
+ OSL_ASSERT(QUEUE_STARTED_NAMED(&(cache->m_free_head), slab_));
+ OSL_ASSERT(QUEUE_STARTED_NAMED(&(cache->m_used_head), slab_));
+
+ OSL_ASSERT(cache->m_hash_table == cache->m_hash_table_0);
+ OSL_ASSERT(cache->m_hash_size == RTL_CACHE_HASH_SIZE);
+ OSL_ASSERT(cache->m_hash_shift == (sal_Size)(highbit(cache->m_hash_size) - 1));
+
+ /* depot layer */
+ (void)RTL_MEMORY_LOCK_DESTROY(&(cache->m_depot_lock));
+}
+
+/* ================================================================= */
+
+/** rtl_cache_activate()
+ */
+static rtl_cache_type *
+rtl_cache_activate (
+ rtl_cache_type * cache,
+ const char * name,
+ size_t objsize,
+ size_t objalign,
+ int (SAL_CALL * constructor)(void * obj, void * userarg),
+ void (SAL_CALL * destructor) (void * obj, void * userarg),
+ void (SAL_CALL * reclaim) (void * userarg),
+ void * userarg,
+ rtl_arena_type * source,
+ int flags
+)
+{
+ OSL_ASSERT(cache != 0);
+ if (cache != 0)
+ {
+ sal_Size slabsize;
+
+ snprintf (cache->m_name, sizeof(cache->m_name), "%s", name);
+
+ /* ensure minimum size (embedded bufctl linkage) */
+ objsize = SAL_MAX(objsize, sizeof(rtl_cache_bufctl_type*));
+
+ if (objalign == 0)
+ {
+ /* determine default alignment */
+ if (objsize >= RTL_MEMORY_ALIGNMENT_8)
+ objalign = RTL_MEMORY_ALIGNMENT_8;
+ else
+ objalign = RTL_MEMORY_ALIGNMENT_4;
+ }
+ else
+ {
+ /* ensure minimum alignment */
+ objalign = SAL_MAX(objalign, RTL_MEMORY_ALIGNMENT_4);
+ }
+ OSL_ASSERT(RTL_MEMORY_ISP2(objalign));
+
+ cache->m_type_size = objsize = RTL_MEMORY_P2ROUNDUP(objsize, objalign);
+ cache->m_type_align = objalign;
+ cache->m_type_shift = highbit(cache->m_type_size) - 1;
+
+ cache->m_constructor = constructor;
+ cache->m_destructor = destructor;
+ cache->m_reclaim = reclaim;
+ cache->m_userarg = userarg;
+
+ /* slab layer */
+ cache->m_source = source;
+
+ slabsize = source->m_quantum; /* minimum slab size */
+ if (flags & RTL_CACHE_FLAG_QUANTUMCACHE)
+ {
+ /* next power of 2 above 3 * qcache_max */
+ slabsize = SAL_MAX(slabsize, (1UL << highbit(3 * source->m_qcache_max)));
+ }
+ else
+ {
+ /* waste at most 1/8 of slab */
+ slabsize = SAL_MAX(slabsize, cache->m_type_size * 8);
+ }
+
+ slabsize = RTL_MEMORY_P2ROUNDUP(slabsize, source->m_quantum);
+ if (!RTL_MEMORY_ISP2(slabsize))
+ slabsize = 1UL << highbit(slabsize);
+ cache->m_slab_size = slabsize;
+
+ if (cache->m_slab_size > source->m_quantum)
+ {
+ OSL_ASSERT(gp_cache_slab_cache != 0);
+ OSL_ASSERT(gp_cache_bufctl_cache != 0);
+
+ cache->m_features |= RTL_CACHE_FEATURE_HASH;
+ cache->m_ntypes = cache->m_slab_size / cache->m_type_size;
+ cache->m_ncolor_max = cache->m_slab_size % cache->m_type_size;
+ }
+ else
+ {
+ /* embedded slab struct */
+ cache->m_ntypes = (cache->m_slab_size - sizeof(rtl_cache_slab_type)) / cache->m_type_size;
+ cache->m_ncolor_max = (cache->m_slab_size - sizeof(rtl_cache_slab_type)) % cache->m_type_size;
+ }
+
+ OSL_ASSERT(cache->m_ntypes > 0);
+ cache->m_ncolor = 0;
+
+ if (flags & RTL_CACHE_FLAG_BULKDESTROY)
+ {
+ /* allow bulk slab delete upon cache deactivation */
+ cache->m_features |= RTL_CACHE_FEATURE_BULKDESTROY;
+ }
+
+ /* magazine layer */
+ if (!(flags & RTL_CACHE_FLAG_NOMAGAZINE))
+ {
+ OSL_ASSERT(gp_cache_magazine_cache != 0);
+ cache->m_magazine_cache = gp_cache_magazine_cache;
+ }
+
+ /* insert into cache list */
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ QUEUE_INSERT_TAIL_NAMED(&(g_cache_list.m_cache_head), cache, cache_);
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+ }
+ return (cache);
+}
+
+/** rtl_cache_deactivate()
+ */
+static void
+rtl_cache_deactivate (
+ rtl_cache_type * cache
+)
+{
+ /* remove from cache list */
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ QUEUE_REMOVE_NAMED(cache, cache_);
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+
+ /* cleanup magazine layer */
+ if (cache->m_magazine_cache != 0)
+ {
+ rtl_cache_type * mag_cache;
+ rtl_cache_magazine_type * mag;
+
+ /* prevent recursion */
+ mag_cache = cache->m_magazine_cache, cache->m_magazine_cache = 0;
+
+ /* cleanup cpu layer */
+ if ((mag = cache->m_cpu_curr) != 0)
+ {
+ cache->m_cpu_curr = 0;
+ rtl_cache_magazine_clear (cache, mag);
+ rtl_cache_free (mag_cache, mag);
+ }
+ if ((mag = cache->m_cpu_prev) != 0)
+ {
+ cache->m_cpu_prev = 0;
+ rtl_cache_magazine_clear (cache, mag);
+ rtl_cache_free (mag_cache, mag);
+ }
+
+ /* cleanup depot layer */
+ while ((mag = rtl_cache_depot_dequeue(&(cache->m_depot_full))) != 0)
+ {
+ rtl_cache_magazine_clear (cache, mag);
+ rtl_cache_free (mag_cache, mag);
+ }
+ while ((mag = rtl_cache_depot_dequeue(&(cache->m_depot_empty))) != 0)
+ {
+ rtl_cache_magazine_clear (cache, mag);
+ rtl_cache_free (mag_cache, mag);
+ }
+ }
+
+ OSL_TRACE(
+ "rtl_cache_deactivate(\"%s\"): "
+ "[slab]: allocs: %"PRIu64", frees: %"PRIu64"; total: %lu, used: %lu; "
+ "[cpu]: allocs: %"PRIu64", frees: %"PRIu64"; "
+ "[total]: allocs: %"PRIu64", frees: %"PRIu64"",
+ cache->m_name,
+ cache->m_slab_stats.m_alloc, cache->m_slab_stats.m_free,
+ cache->m_slab_stats.m_mem_total, cache->m_slab_stats.m_mem_alloc,
+ cache->m_cpu_stats.m_alloc, cache->m_cpu_stats.m_free,
+ cache->m_slab_stats.m_alloc + cache->m_cpu_stats.m_alloc,
+ cache->m_slab_stats.m_free + cache->m_cpu_stats.m_free
+ );
+
+ /* cleanup slab layer */
+ if (cache->m_slab_stats.m_alloc > cache->m_slab_stats.m_free)
+ {
+ OSL_TRACE(
+ "rtl_cache_deactivate(\"%s\"): "
+ "cleaning up %"PRIu64" leaked buffer(s) [%lu bytes] [%lu total]",
+ cache->m_name,
+ cache->m_slab_stats.m_alloc - cache->m_slab_stats.m_free,
+ cache->m_slab_stats.m_mem_alloc, cache->m_slab_stats.m_mem_total
+ );
+
+ if (cache->m_features & RTL_CACHE_FEATURE_HASH)
+ {
+ /* cleanup bufctl(s) for leaking buffer(s) */
+ sal_Size i, n = cache->m_hash_size;
+ for (i = 0; i < n; i++)
+ {
+ rtl_cache_bufctl_type * bufctl;
+ while ((bufctl = cache->m_hash_table[i]) != 0)
+ {
+ /* pop from hash table */
+ cache->m_hash_table[i] = bufctl->m_next, bufctl->m_next = 0;
+
+ /* return to bufctl cache */
+ rtl_cache_free (gp_cache_bufctl_cache, bufctl);
+ }
+ }
+ }
+ {
+ /* force cleanup of remaining slabs */
+ rtl_cache_slab_type *head, *slab;
+
+ head = &(cache->m_used_head);
+ for (slab = head->m_slab_next; slab != head; slab = head->m_slab_next)
+ {
+ /* remove from 'used' queue */
+ QUEUE_REMOVE_NAMED(slab, slab_);
+
+ /* update stats */
+ cache->m_slab_stats.m_mem_total -= cache->m_slab_size;
+
+ /* free slab */
+ rtl_cache_slab_destroy (cache, slab);
+ }
+
+ head = &(cache->m_free_head);
+ for (slab = head->m_slab_next; slab != head; slab = head->m_slab_next)
+ {
+ /* remove from 'free' queue */
+ QUEUE_REMOVE_NAMED(slab, slab_);
+
+ /* update stats */
+ cache->m_slab_stats.m_mem_total -= cache->m_slab_size;
+
+ /* free slab */
+ rtl_cache_slab_destroy (cache, slab);
+ }
+ }
+ }
+
+ if (cache->m_hash_table != cache->m_hash_table_0)
+ {
+ rtl_arena_free (
+ gp_cache_arena,
+ cache->m_hash_table,
+ cache->m_hash_size * sizeof(rtl_cache_bufctl_type*));
+
+ cache->m_hash_table = cache->m_hash_table_0;
+ cache->m_hash_size = RTL_CACHE_HASH_SIZE;
+ cache->m_hash_shift = highbit(cache->m_hash_size) - 1;
+ }
+}
+
+/* ================================================================= *
+ *
+ * cache implementation.
+ *
+ * ================================================================= */
+
+/** rtl_cache_create()
+ */
+rtl_cache_type *
+SAL_CALL rtl_cache_create (
+ const char * name,
+ sal_Size objsize,
+ sal_Size objalign,
+ int (SAL_CALL * constructor)(void * obj, void * userarg),
+ void (SAL_CALL * destructor) (void * obj, void * userarg),
+ void (SAL_CALL * reclaim) (void * userarg),
+ void * userarg,
+ rtl_arena_type * source,
+ int flags
+) SAL_THROW_EXTERN_C()
+{
+ rtl_cache_type * result = 0;
+ sal_Size size = sizeof(rtl_cache_type);
+
+try_alloc:
+ result = (rtl_cache_type*)rtl_arena_alloc (gp_cache_arena, &size);
+ if (result != 0)
+ {
+ rtl_cache_type * cache = result;
+ (void) rtl_cache_constructor (cache);
+
+ if (!source)
+ {
+ /* use default arena */
+ OSL_ASSERT(gp_default_arena != 0);
+ source = gp_default_arena;
+ }
+
+ result = rtl_cache_activate (
+ cache,
+ name,
+ objsize,
+ objalign,
+ constructor,
+ destructor,
+ reclaim,
+ userarg,
+ source,
+ flags
+ );
+
+ if (result == 0)
+ {
+ /* activation failed */
+ rtl_cache_deactivate (cache);
+ rtl_cache_destructor (cache);
+ rtl_arena_free (gp_cache_arena, cache, size);
+ }
+ }
+ else if (gp_cache_arena == 0)
+ {
+ if (rtl_cache_init())
+ {
+ /* try again */
+ goto try_alloc;
+ }
+ }
+ return (result);
+}
+
+/** rtl_cache_destroy()
+ */
+void SAL_CALL rtl_cache_destroy (
+ rtl_cache_type * cache
+) SAL_THROW_EXTERN_C()
+{
+ if (cache != 0)
+ {
+ rtl_cache_deactivate (cache);
+ rtl_cache_destructor (cache);
+ rtl_arena_free (gp_cache_arena, cache, sizeof(rtl_cache_type));
+ }
+}
+
+/** rtl_cache_alloc()
+ */
+void *
+SAL_CALL rtl_cache_alloc (
+ rtl_cache_type * cache
+) SAL_THROW_EXTERN_C()
+{
+ void * obj = 0;
+
+ if (cache == 0)
+ return (0);
+
+ if (cache->m_cpu_curr != 0)
+ {
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock));
+
+ for (;;)
+ {
+ /* take object from magazine layer */
+ rtl_cache_magazine_type *curr, *prev, *temp;
+
+ curr = cache->m_cpu_curr;
+ if ((curr != 0) && (curr->m_mag_used > 0))
+ {
+ obj = curr->m_objects[--curr->m_mag_used];
+ cache->m_cpu_stats.m_alloc += 1;
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock));
+
+ return (obj);
+ }
+
+ prev = cache->m_cpu_prev;
+ if ((prev != 0) && (prev->m_mag_used > 0))
+ {
+ temp = cache->m_cpu_curr;
+ cache->m_cpu_curr = cache->m_cpu_prev;
+ cache->m_cpu_prev = temp;
+
+ continue;
+ }
+
+ temp = rtl_cache_depot_exchange_alloc (cache, prev);
+ if (temp != 0)
+ {
+ cache->m_cpu_prev = cache->m_cpu_curr;
+ cache->m_cpu_curr = temp;
+
+ continue;
+ }
+
+ /* no full magazine: fall through to slab layer */
+ break;
+ }
+
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock));
+ }
+
+ /* alloc buffer from slab layer */
+ obj = rtl_cache_slab_alloc (cache);
+ if ((obj != 0) && (cache->m_constructor != 0))
+ {
+ /* construct object */
+ if (!((cache->m_constructor)(obj, cache->m_userarg)))
+ {
+ /* construction failure */
+ rtl_cache_slab_free (cache, obj), obj = 0;
+ }
+ }
+
+ return (obj);
+}
+
+/** rtl_cache_free()
+ */
+void
+SAL_CALL rtl_cache_free (
+ rtl_cache_type * cache,
+ void * obj
+) SAL_THROW_EXTERN_C()
+{
+ if ((obj != 0) && (cache != 0))
+ {
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock));
+
+ for (;;)
+ {
+ /* return object to magazine layer */
+ rtl_cache_magazine_type *curr, *prev, *temp;
+
+ curr = cache->m_cpu_curr;
+ if ((curr != 0) && (curr->m_mag_used < curr->m_mag_size))
+ {
+ curr->m_objects[curr->m_mag_used++] = obj;
+ cache->m_cpu_stats.m_free += 1;
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock));
+
+ return;
+ }
+
+ prev = cache->m_cpu_prev;
+ if ((prev != 0) && (prev->m_mag_used == 0))
+ {
+ temp = cache->m_cpu_curr;
+ cache->m_cpu_curr = cache->m_cpu_prev;
+ cache->m_cpu_prev = temp;
+
+ continue;
+ }
+
+ temp = rtl_cache_depot_exchange_free (cache, prev);
+ if (temp != 0)
+ {
+ cache->m_cpu_prev = cache->m_cpu_curr;
+ cache->m_cpu_curr = temp;
+
+ continue;
+ }
+
+ if (rtl_cache_depot_populate(cache) != 0)
+ {
+ continue;
+ }
+
+ /* no empty magazine: fall through to slab layer */
+ break;
+ }
+
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock));
+
+ /* no space for constructed object in magazine layer */
+ if (cache->m_destructor != 0)
+ {
+ /* destruct object */
+ (cache->m_destructor)(obj, cache->m_userarg);
+ }
+
+ /* return buffer to slab layer */
+ rtl_cache_slab_free (cache, obj);
+ }
+}
+
+/* ================================================================= *
+ *
+ * cache wsupdate (machdep) internals.
+ *
+ * ================================================================= */
+
+/** rtl_cache_wsupdate_init()
+ *
+ * @precond g_cache_list.m_lock initialized
+ */
+static void
+rtl_cache_wsupdate_init (void);
+
+
+/** rtl_cache_wsupdate_wait()
+ *
+ * @precond g_cache_list.m_lock acquired
+ */
+static void
+rtl_cache_wsupdate_wait (
+ unsigned int seconds
+);
+
+/** rtl_cache_wsupdate_fini()
+ *
+ */
+static void
+rtl_cache_wsupdate_fini (void);
+
+/* ================================================================= */
+
+#if defined(SAL_UNX) || defined(SAL_OS2)
+
+#include <sys/time.h>
+
+static void *
+rtl_cache_wsupdate_all (void * arg);
+
+static void
+rtl_cache_wsupdate_init (void)
+{
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ g_cache_list.m_update_done = 0;
+ (void) pthread_cond_init (&(g_cache_list.m_update_cond), NULL);
+ if (pthread_create (
+ &(g_cache_list.m_update_thread), NULL, rtl_cache_wsupdate_all, (void*)(10)) != 0)
+ {
+ /* failure */
+ g_cache_list.m_update_thread = (pthread_t)(0);
+ }
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+}
+
+static void
+rtl_cache_wsupdate_wait (unsigned int seconds)
+{
+ if (seconds > 0)
+ {
+ struct timeval now;
+ struct timespec wakeup;
+
+ gettimeofday(&now, 0);
+ wakeup.tv_sec = now.tv_sec + (seconds);
+ wakeup.tv_nsec = now.tv_usec * 1000;
+
+ (void) pthread_cond_timedwait (
+ &(g_cache_list.m_update_cond),
+ &(g_cache_list.m_lock),
+ &wakeup);
+ }
+}
+
+static void
+rtl_cache_wsupdate_fini (void)
+{
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ g_cache_list.m_update_done = 1;
+ pthread_cond_signal (&(g_cache_list.m_update_cond));
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+
+ if (g_cache_list.m_update_thread != (pthread_t)(0))
+ pthread_join (g_cache_list.m_update_thread, NULL);
+}
+
+/* ================================================================= */
+
+#elif defined(SAL_W32)
+
+static DWORD WINAPI
+rtl_cache_wsupdate_all (void * arg);
+
+static void
+rtl_cache_wsupdate_init (void)
+{
+ DWORD dwThreadId;
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ g_cache_list.m_update_done = 0;
+ g_cache_list.m_update_cond = CreateEvent (0, TRUE, FALSE, 0);
+
+ g_cache_list.m_update_thread =
+ CreateThread (NULL, 0, rtl_cache_wsupdate_all, (LPVOID)(10), 0, &dwThreadId);
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+}
+
+static void
+rtl_cache_wsupdate_wait (unsigned int seconds)
+{
+ if (seconds > 0)
+ {
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+ WaitForSingleObject (g_cache_list.m_update_cond, (DWORD)(seconds * 1000));
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ }
+}
+
+static void
+rtl_cache_wsupdate_fini (void)
+{
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ g_cache_list.m_update_done = 1;
+ SetEvent (g_cache_list.m_update_cond);
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+
+ WaitForSingleObject (g_cache_list.m_update_thread, INFINITE);
+}
+
+#endif /* SAL_UNX || SAL_W32 */
+
+/* ================================================================= */
+
+/** rtl_cache_depot_wsupdate()
+ * update depot stats and purge excess magazines.
+ *
+ * @precond cache->m_depot_lock acquired
+ */
+static void
+rtl_cache_depot_wsupdate (
+ rtl_cache_type * cache,
+ rtl_cache_depot_type * depot
+)
+{
+ sal_Size npurge;
+
+ depot->m_prev_min = depot->m_curr_min;
+ depot->m_curr_min = depot->m_mag_count;
+
+ npurge = SAL_MIN(depot->m_curr_min, depot->m_prev_min);
+ for (; npurge > 0; npurge--)
+ {
+ rtl_cache_magazine_type * mag = rtl_cache_depot_dequeue (depot);
+ if (mag != 0)
+ {
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock));
+ rtl_cache_magazine_clear (cache, mag);
+ rtl_cache_free (cache->m_magazine_cache, mag);
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock));
+ }
+ }
+}
+
+/** rtl_cache_wsupdate()
+ *
+ * @precond cache->m_depot_lock released
+ */
+static void
+rtl_cache_wsupdate (
+ rtl_cache_type * cache
+)
+{
+ if (cache->m_magazine_cache != 0)
+ {
+ RTL_MEMORY_LOCK_ACQUIRE(&(cache->m_depot_lock));
+
+ OSL_TRACE(
+ "rtl_cache_wsupdate(\"%s\") "
+ "[depot: count, curr_min, prev_min] "
+ "full: %lu, %lu, %lu; empty: %lu, %lu, %lu",
+ cache->m_name,
+ cache->m_depot_full.m_mag_count,
+ cache->m_depot_full.m_curr_min,
+ cache->m_depot_full.m_prev_min,
+ cache->m_depot_empty.m_mag_count,
+ cache->m_depot_empty.m_curr_min,
+ cache->m_depot_empty.m_prev_min
+ );
+
+ rtl_cache_depot_wsupdate (cache, &(cache->m_depot_full));
+ rtl_cache_depot_wsupdate (cache, &(cache->m_depot_empty));
+
+ RTL_MEMORY_LOCK_RELEASE(&(cache->m_depot_lock));
+ }
+}
+
+/** rtl_cache_wsupdate_all()
+ *
+ */
+#if defined(SAL_UNX) || defined(SAL_OS2)
+static void *
+#elif defined(SAL_W32)
+static DWORD WINAPI
+#endif /* SAL_UNX || SAL_W32 */
+rtl_cache_wsupdate_all (void * arg)
+{
+ unsigned int seconds = (unsigned int)SAL_INT_CAST(sal_uIntPtr, arg);
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ while (!g_cache_list.m_update_done)
+ {
+ rtl_cache_wsupdate_wait (seconds);
+ if (!g_cache_list.m_update_done)
+ {
+ rtl_cache_type * head, * cache;
+
+ head = &(g_cache_list.m_cache_head);
+ for (cache = head->m_cache_next;
+ cache != head;
+ cache = cache->m_cache_next)
+ {
+ rtl_cache_wsupdate (cache);
+ }
+ }
+ }
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+
+ return (0);
+}
+
+/* ================================================================= *
+ *
+ * cache initialization.
+ *
+ * ================================================================= */
+
+static void
+rtl_cache_once_init (void)
+{
+ {
+ /* list of caches */
+ RTL_MEMORY_LOCK_INIT(&(g_cache_list.m_lock));
+ (void) rtl_cache_constructor (&(g_cache_list.m_cache_head));
+ }
+ {
+ /* cache: internal arena */
+ OSL_ASSERT(gp_cache_arena == 0);
+
+ gp_cache_arena = rtl_arena_create (
+ "rtl_cache_internal_arena",
+ 64, /* quantum */
+ 0, /* no quantum caching */
+ NULL, /* default source */
+ rtl_arena_alloc,
+ rtl_arena_free,
+ 0 /* flags */
+ );
+ OSL_ASSERT(gp_cache_arena != 0);
+
+ /* check 'gp_default_arena' initialization */
+ OSL_ASSERT(gp_default_arena != 0);
+ }
+ {
+ /* cache: magazine cache */
+ static rtl_cache_type g_cache_magazine_cache;
+
+ OSL_ASSERT(gp_cache_magazine_cache == 0);
+ (void) rtl_cache_constructor (&g_cache_magazine_cache);
+
+ gp_cache_magazine_cache = rtl_cache_activate (
+ &g_cache_magazine_cache,
+ "rtl_cache_magazine_cache",
+ sizeof(rtl_cache_magazine_type), /* objsize */
+ 0, /* objalign */
+ rtl_cache_magazine_constructor,
+ rtl_cache_magazine_destructor,
+ 0, /* reclaim */
+ 0, /* userarg: NYI */
+ gp_default_arena, /* source */
+ RTL_CACHE_FLAG_NOMAGAZINE /* during bootstrap; activated below */
+ );
+ OSL_ASSERT(gp_cache_magazine_cache != 0);
+
+ /* activate magazine layer */
+ g_cache_magazine_cache.m_magazine_cache = gp_cache_magazine_cache;
+ }
+ {
+ /* cache: slab (struct) cache */
+ static rtl_cache_type g_cache_slab_cache;
+
+ OSL_ASSERT(gp_cache_slab_cache == 0);
+ (void) rtl_cache_constructor (&g_cache_slab_cache);
+
+ gp_cache_slab_cache = rtl_cache_activate (
+ &g_cache_slab_cache,
+ "rtl_cache_slab_cache",
+ sizeof(rtl_cache_slab_type), /* objsize */
+ 0, /* objalign */
+ rtl_cache_slab_constructor,
+ rtl_cache_slab_destructor,
+ 0, /* reclaim */
+ 0, /* userarg: none */
+ gp_default_arena, /* source */
+ 0 /* flags: none */
+ );
+ OSL_ASSERT(gp_cache_slab_cache != 0);
+ }
+ {
+ /* cache: bufctl cache */
+ static rtl_cache_type g_cache_bufctl_cache;
+
+ OSL_ASSERT(gp_cache_bufctl_cache == 0);
+ (void) rtl_cache_constructor (&g_cache_bufctl_cache);
+
+ gp_cache_bufctl_cache = rtl_cache_activate (
+ &g_cache_bufctl_cache,
+ "rtl_cache_bufctl_cache",
+ sizeof(rtl_cache_bufctl_type), /* objsize */
+ 0, /* objalign */
+ 0, /* constructor */
+ 0, /* destructor */
+ 0, /* reclaim */
+ 0, /* userarg */
+ gp_default_arena, /* source */
+ 0 /* flags: none */
+ );
+ OSL_ASSERT(gp_cache_bufctl_cache != 0);
+ }
+
+ rtl_cache_wsupdate_init();
+}
+
+static int
+rtl_cache_init (void)
+{
+ static sal_once_type g_once = SAL_ONCE_INIT;
+ SAL_ONCE(&g_once, rtl_cache_once_init);
+ return (gp_cache_arena != 0);
+}
+
+/* ================================================================= */
+
+#if defined(__GNUC__)
+static void rtl_cache_fini (void) __attribute__((destructor));
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma fini(rtl_cache_fini)
+static void rtl_cache_fini (void);
+#endif /* __GNUC__ || __SUNPRO_C */
+
+void
+rtl_cache_fini (void)
+{
+ if (gp_cache_arena != 0)
+ {
+ rtl_cache_type * cache, * head;
+
+ rtl_cache_wsupdate_fini();
+
+ if (gp_cache_bufctl_cache != 0)
+ {
+ cache = gp_cache_bufctl_cache, gp_cache_bufctl_cache = 0;
+ rtl_cache_deactivate (cache);
+ rtl_cache_destructor (cache);
+ }
+ if (gp_cache_slab_cache != 0)
+ {
+ cache = gp_cache_slab_cache, gp_cache_slab_cache = 0;
+ rtl_cache_deactivate (cache);
+ rtl_cache_destructor (cache);
+ }
+ if (gp_cache_magazine_cache != 0)
+ {
+ cache = gp_cache_magazine_cache, gp_cache_magazine_cache = 0;
+ rtl_cache_deactivate (cache);
+ rtl_cache_destructor (cache);
+ }
+ if (gp_cache_arena != 0)
+ {
+ rtl_arena_destroy (gp_cache_arena);
+ gp_cache_arena = 0;
+ }
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ head = &(g_cache_list.m_cache_head);
+ for (cache = head->m_cache_next; cache != head; cache = cache->m_cache_next)
+ {
+ OSL_TRACE(
+ "rtl_cache_fini(\"%s\") "
+ "[slab]: allocs: %"PRIu64", frees: %"PRIu64"; total: %lu, used: %lu; "
+ "[cpu]: allocs: %"PRIu64", frees: %"PRIu64"; "
+ "[total]: allocs: %"PRIu64", frees: %"PRIu64"",
+ cache->m_name,
+ cache->m_slab_stats.m_alloc, cache->m_slab_stats.m_free,
+ cache->m_slab_stats.m_mem_total, cache->m_slab_stats.m_mem_alloc,
+ cache->m_cpu_stats.m_alloc, cache->m_cpu_stats.m_free,
+ cache->m_slab_stats.m_alloc + cache->m_cpu_stats.m_alloc,
+ cache->m_slab_stats.m_free + cache->m_cpu_stats.m_free
+ );
+ }
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+ }
+}
+
+/* ================================================================= */
diff --git a/sal/rtl/source/alloc_cache.h b/sal/rtl/source/alloc_cache.h
new file mode 100644
index 000000000000..9fed61806fde
--- /dev/null
+++ b/sal/rtl/source/alloc_cache.h
@@ -0,0 +1,182 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_ALLOC_CACHE_H
+#define INCLUDED_RTL_ALLOC_CACHE_H
+
+#include "sal/types.h"
+#include "rtl/alloc.h"
+#include "alloc_impl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** rtl_cache_stat_type
+ * @internal
+ */
+typedef struct rtl_cache_stat_st rtl_cache_stat_type;
+struct rtl_cache_stat_st
+{
+ sal_uInt64 m_alloc;
+ sal_uInt64 m_free;
+
+ sal_Size m_mem_total;
+ sal_Size m_mem_alloc;
+};
+
+
+/** rtl_cache_bufctl_type
+ * @internal
+ */
+typedef struct rtl_cache_bufctl_st rtl_cache_bufctl_type;
+struct rtl_cache_bufctl_st
+{
+ rtl_cache_bufctl_type * m_next; /* linkage */
+
+ sal_uIntPtr m_addr; /* buffer address */
+ sal_uIntPtr m_slab; /* parent slab address */
+};
+
+
+/** rtl_cache_slab_type
+ * @internal
+ */
+typedef struct rtl_cache_slab_st rtl_cache_slab_type;
+struct rtl_cache_slab_st
+{
+ rtl_cache_slab_type * m_slab_next; /* slab linkage */
+ rtl_cache_slab_type * m_slab_prev; /* slab linkage */
+
+ sal_Size m_ntypes; /* number of buffers used */
+ sal_uIntPtr m_data; /* buffer start addr */
+
+ sal_uIntPtr m_bp; /* free buffer linkage 'base pointer' */
+ rtl_cache_bufctl_type * m_sp; /* free buffer linkage 'stack pointer' */
+};
+
+
+/** rtl_cache_magazine_type
+ * @internal
+ */
+#define RTL_CACHE_MAGAZINE_SIZE 61
+
+typedef struct rtl_cache_magazine_st rtl_cache_magazine_type;
+struct rtl_cache_magazine_st
+{
+ rtl_cache_magazine_type * m_mag_next; /* depot linkage */
+
+ sal_Size m_mag_size;
+ sal_Size m_mag_used;
+
+ void * m_objects[RTL_CACHE_MAGAZINE_SIZE];
+};
+
+
+/** rtl_cache_depot_type
+ * @internal
+ */
+typedef struct rtl_cache_depot_st rtl_cache_depot_type;
+struct rtl_cache_depot_st
+{
+ /* magazine list */
+ rtl_cache_magazine_type * m_mag_next; /* linkage */
+ sal_Size m_mag_count; /* count */
+
+ /* working set parameters */
+ sal_Size m_curr_min;
+ sal_Size m_prev_min;
+};
+
+
+/** rtl_cache_type
+ * @internal
+ */
+#define RTL_CACHE_HASH_SIZE 8
+
+#define RTL_CACHE_FEATURE_HASH 1
+#define RTL_CACHE_FEATURE_BULKDESTROY 2
+#define RTL_CACHE_FEATURE_RESCALE 4 /* within hash rescale operation */
+
+struct rtl_cache_st
+{
+ /* linkage */
+ rtl_cache_type * m_cache_next;
+ rtl_cache_type * m_cache_prev;
+
+ /* properties */
+ char m_name[RTL_CACHE_NAME_LENGTH + 1];
+ long m_features;
+
+ sal_Size m_type_size; /* const */
+ sal_Size m_type_align; /* const */
+ sal_Size m_type_shift; /* log2(m_type_size); const */
+
+ int (SAL_CALL * m_constructor)(void * obj, void * userarg); /* const */
+ void (SAL_CALL * m_destructor) (void * obj, void * userarg); /* const */
+ void (SAL_CALL * m_reclaim) (void * userarg); /* const */
+ void * m_userarg;
+
+ /* slab layer */
+ rtl_memory_lock_type m_slab_lock;
+ rtl_cache_stat_type m_slab_stats;
+
+ rtl_arena_type * m_source; /* slab supplier; const */
+ sal_Size m_slab_size; /* const */
+ sal_Size m_ntypes; /* number of buffers per slab; const */
+ sal_Size m_ncolor; /* next slab color */
+ sal_Size m_ncolor_max; /* max. slab color */
+
+ rtl_cache_slab_type m_free_head;
+ rtl_cache_slab_type m_used_head;
+
+ rtl_cache_bufctl_type ** m_hash_table;
+ rtl_cache_bufctl_type * m_hash_table_0[RTL_CACHE_HASH_SIZE];
+ sal_Size m_hash_size; /* m_hash_mask + 1 */
+ sal_Size m_hash_shift; /* log2(m_hash_size) */
+
+ /* depot layer */
+ rtl_memory_lock_type m_depot_lock;
+
+ rtl_cache_depot_type m_depot_empty;
+ rtl_cache_depot_type m_depot_full;
+
+ rtl_cache_type * m_magazine_cache; /* magazine supplier; const */
+
+ /* cpu layer */
+ rtl_cache_magazine_type * m_cpu_curr;
+ rtl_cache_magazine_type * m_cpu_prev;
+
+ rtl_cache_stat_type m_cpu_stats;
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INCLUDED_RTL_ALLOC_CACHE_H */
diff --git a/sal/rtl/source/alloc_global.c b/sal/rtl/source/alloc_global.c
new file mode 100644
index 000000000000..5137f868127d
--- /dev/null
+++ b/sal/rtl/source/alloc_global.c
@@ -0,0 +1,357 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "rtl/alloc.h"
+
+#ifndef INCLUDED_STRING_H
+#include <string.h>
+#define INCLUDED_STRING_H
+#endif
+
+#if !defined(FORCE_SYSALLOC)
+
+/* ================================================================= *
+ *
+ * custom allocator includes.
+ *
+ * ================================================================= */
+
+#ifndef INCLUDED_STDIO_H
+#include <stdio.h>
+#define INCLUDED_STDIO_H
+#endif
+#include "alloc_impl.h"
+#include "internal/once.h"
+#include "sal/macros.h"
+#include "osl/diagnose.h"
+
+/* ================================================================= *
+ *
+ * custom allocator internals.
+ *
+ * ================================================================= */
+
+static const sal_Size g_alloc_sizes[] =
+{
+ /* powers of 2**(1/4) */
+ 4 * 4, 6 * 4,
+ 4 * 8, 5 * 8, 6 * 8, 7 * 8,
+ 4 * 16, 5 * 16, 6 * 16, 7 * 16,
+ 4 * 32, 5 * 32, 6 * 32, 7 * 32,
+ 4 * 64, 5 * 64, 6 * 64, 7 * 64,
+ 4 * 128, 5 * 128, 6 * 128, 7 * 128,
+ 4 * 256, 5 * 256, 6 * 256, 7 * 256,
+ 4 * 512, 5 * 512, 6 * 512, 7 * 512,
+ 4 * 1024, 5 * 1024, 6 * 1024, 7 * 1024,
+ 4 * 2048, 5 * 2048, 6 * 2048, 7 * 2048,
+ 4 * 4096
+};
+
+#define RTL_MEMORY_CACHED_LIMIT 4 * 4096
+#define RTL_MEMORY_CACHED_SIZES (sizeof(g_alloc_sizes) / sizeof(g_alloc_sizes[0]))
+
+static rtl_cache_type * g_alloc_caches[RTL_MEMORY_CACHED_SIZES] =
+{
+ 0,
+};
+
+#define RTL_MEMALIGN 8
+#define RTL_MEMALIGN_SHIFT 3
+
+static rtl_cache_type * g_alloc_table[RTL_MEMORY_CACHED_LIMIT >> RTL_MEMALIGN_SHIFT] =
+{
+ 0,
+};
+
+static rtl_arena_type * gp_alloc_arena = 0;
+
+/* ================================================================= *
+ *
+ * custom allocator initialization / finalization.
+ *
+ * ================================================================= */
+
+static void
+rtl_memory_once_init (void)
+{
+ {
+ /* global memory arena */
+ OSL_ASSERT(gp_alloc_arena == 0);
+
+ gp_alloc_arena = rtl_arena_create (
+ "rtl_alloc_arena",
+ 2048, /* quantum */
+ 0, /* w/o quantum caching */
+ 0, /* default source */
+ rtl_arena_alloc,
+ rtl_arena_free,
+ 0 /* flags */
+ );
+ OSL_ASSERT(gp_alloc_arena != 0);
+ }
+ {
+ sal_Size size;
+ int i, n = RTL_MEMORY_CACHED_SIZES;
+
+ for (i = 0; i < n; i++)
+ {
+ char name[RTL_CACHE_NAME_LENGTH + 1];
+ (void) snprintf (name, sizeof(name), "rtl_alloc_%lu", g_alloc_sizes[i]);
+ g_alloc_caches[i] = rtl_cache_create (name, g_alloc_sizes[i], 0, NULL, NULL, NULL, NULL, NULL, 0);
+ }
+
+ size = RTL_MEMALIGN;
+ for (i = 0; i < n; i++)
+ {
+ while (size <= g_alloc_sizes[i])
+ {
+ g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT] = g_alloc_caches[i];
+ size += RTL_MEMALIGN;
+ }
+ }
+ }
+}
+
+static int
+rtl_memory_init (void)
+{
+ static sal_once_type g_once = SAL_ONCE_INIT;
+ SAL_ONCE(&g_once, rtl_memory_once_init);
+ return (gp_alloc_arena != 0);
+}
+
+/* ================================================================= */
+
+/*
+ Issue http://udk.openoffice.org/issues/show_bug.cgi?id=92388
+
+ Mac OS X does not seem to support "__cxa__atexit", thus leading
+ to the situation that "__attribute__((destructor))__" functions
+ (in particular "rtl_memory_fini") become called _before_ global
+ C++ object d'tors.
+
+ Delegated the call to "rtl_memory_fini" into a dummy C++ object,
+ see memory_fini.cxx .
+*/
+#if defined(__GNUC__) && !defined(MACOSX)
+static void rtl_memory_fini (void) __attribute__((destructor));
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma fini(rtl_memory_fini)
+static void rtl_memory_fini (void);
+#endif /* __GNUC__ || __SUNPRO_C */
+
+void
+rtl_memory_fini (void)
+{
+ int i, n;
+
+ /* clear g_alloc_table */
+ memset (g_alloc_table, 0, sizeof(g_alloc_table));
+
+ /* cleanup g_alloc_caches */
+ for (i = 0, n = RTL_MEMORY_CACHED_SIZES; i < n; i++)
+ {
+ if (g_alloc_caches[i] != 0)
+ {
+ rtl_cache_destroy (g_alloc_caches[i]);
+ g_alloc_caches[i] = 0;
+ }
+ }
+
+ /* cleanup gp_alloc_arena */
+ if (gp_alloc_arena != 0)
+ {
+ rtl_arena_destroy (gp_alloc_arena);
+ gp_alloc_arena = 0;
+ }
+}
+
+/* ================================================================= *
+ *
+ * custom allocator implemenation.
+ *
+ * ================================================================= */
+
+void *
+SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
+{
+ void * p = 0;
+ if (n > 0)
+ {
+ char * addr;
+ sal_Size size = RTL_MEMORY_ALIGN(n + RTL_MEMALIGN, RTL_MEMALIGN);
+
+ OSL_ASSERT(RTL_MEMALIGN >= sizeof(sal_Size));
+ if (n >= SAL_MAX_SIZE - (RTL_MEMALIGN + RTL_MEMALIGN - 1))
+ {
+ /* requested size too large for roundup alignment */
+ return 0;
+ }
+
+try_alloc:
+ if (size <= RTL_MEMORY_CACHED_LIMIT)
+ addr = (char*)rtl_cache_alloc(g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT]);
+ else
+ addr = (char*)rtl_arena_alloc (gp_alloc_arena, &size);
+
+ if (addr != 0)
+ {
+ ((sal_Size*)(addr))[0] = size;
+ p = addr + RTL_MEMALIGN;
+ }
+ else if (gp_alloc_arena == 0)
+ {
+ if (rtl_memory_init())
+ {
+ /* try again */
+ goto try_alloc;
+ }
+ }
+ }
+ return (p);
+}
+
+/* ================================================================= */
+
+void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C()
+{
+ if (p != 0)
+ {
+ char * addr = (char*)(p) - RTL_MEMALIGN;
+ sal_Size size = ((sal_Size*)(addr))[0];
+
+ if (size <= RTL_MEMORY_CACHED_LIMIT)
+ rtl_cache_free(g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT], addr);
+ else
+ rtl_arena_free (gp_alloc_arena, addr, size);
+ }
+}
+
+/* ================================================================= */
+
+void * SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+{
+ if (n > 0)
+ {
+ if (p != 0)
+ {
+ void * p_old = p;
+ sal_Size n_old = ((sal_Size*)( (char*)(p) - RTL_MEMALIGN ))[0] - RTL_MEMALIGN;
+
+ p = rtl_allocateMemory (n);
+ if (p != 0)
+ {
+ memcpy (p, p_old, SAL_MIN(n, n_old));
+ rtl_freeMemory (p_old);
+ }
+ }
+ else
+ {
+ p = rtl_allocateMemory (n);
+ }
+ }
+ else if (p != 0)
+ {
+ rtl_freeMemory (p), p = 0;
+ }
+ return (p);
+}
+
+#else /* FORCE_SYSALLOC */
+
+/* ================================================================= *
+ *
+ * system allocator includes.
+ *
+ * ================================================================= */
+
+#ifndef INCLUDED_STDLIB_H
+#include <stdlib.h>
+#define INCLUDED_STDLIB_H
+#endif
+
+/* ================================================================= *
+ *
+ * system allocator implemenation.
+ *
+ * ================================================================= */
+
+void * SAL_CALL rtl_allocateMemory (sal_Size n)
+{
+ return malloc (n);
+}
+
+/* ================================================================= */
+
+void SAL_CALL rtl_freeMemory (void * p)
+{
+ free (p);
+}
+
+/* ================================================================= */
+
+void * SAL_CALL rtl_reallocateMemory (void * p, sal_Size n)
+{
+ return realloc (p, n);
+}
+
+/* ================================================================= */
+
+void
+rtl_memory_fini (void)
+{
+ /* nothing to do */
+}
+
+#endif /* FORCE_SYSALLOC */
+
+/* ================================================================= *
+ *
+ * rtl_(allocate|free)ZeroMemory() implemenation.
+ *
+ * ================================================================= */
+
+void * SAL_CALL rtl_allocateZeroMemory (sal_Size n) SAL_THROW_EXTERN_C()
+{
+ void * p = rtl_allocateMemory (n);
+ if (p != 0)
+ memset (p, 0, n);
+ return (p);
+}
+
+/* ================================================================= */
+
+void SAL_CALL rtl_freeZeroMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C()
+{
+ if (p != 0)
+ {
+ memset (p, 0, n);
+ rtl_freeMemory (p);
+ }
+}
+
+/* ================================================================= */
diff --git a/sal/rtl/source/alloc_impl.h b/sal/rtl/source/alloc_impl.h
new file mode 100644
index 000000000000..d3d1924ddf91
--- /dev/null
+++ b/sal/rtl/source/alloc_impl.h
@@ -0,0 +1,247 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_ALLOC_IMPL_H
+#define INCLUDED_RTL_ALLOC_IMPL_H
+
+#include "sal/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/** Alignment macros
+ */
+#if SAL_TYPES_ALIGNMENT4 > 1
+#define RTL_MEMORY_ALIGNMENT_4 SAL_TYPES_ALIGNMENT4
+#else
+#define RTL_MEMORY_ALIGNMENT_4 sizeof(int)
+#endif /* SAL_TYPES_ALIGNMENT4 */
+
+#if SAL_TYPES_ALIGNMENT8 > 1
+#define RTL_MEMORY_ALIGNMENT_8 SAL_TYPES_ALIGNMENT8
+#else
+#define RTL_MEMORY_ALIGNMENT_8 sizeof(void*)
+#endif /* SAL_TYPES_ALIGNMENT8 */
+
+#if 0 /* @@@ */
+#define RTL_MEMORY_ALIGNMENT_1 8
+#define RTL_MEMORY_ALIGNMENT_2 (sizeof(void*) * 2)
+#endif /* @@@ */
+
+#define RTL_MEMORY_ALIGN(value, align) (((value) + ((align) - 1)) & ~((align) - 1))
+
+#define RTL_MEMORY_ISP2(value) (((value) & ((value) - 1)) == 0)
+#define RTL_MEMORY_P2ALIGN(value, align) ((value) & -(sal_IntPtr)(align))
+
+#define RTL_MEMORY_P2ROUNDUP(value, align) \
+ (-(-(sal_IntPtr)(value) & -(sal_IntPtr)(align)))
+#define RTL_MEMORY_P2END(value, align) \
+ (-(~(sal_IntPtr)(value) & -(sal_IntPtr)(align)))
+
+
+/** Function inlining macros
+ * (compiler dependent)
+ */
+#ifndef RTL_MEMORY_INLINE
+#if defined(__GNUC__)
+#define RTL_MEMORY_INLINE __inline__
+#elif defined(_MSC_VER)
+#define RTL_MEMORY_INLINE __inline
+#else
+#define RTL_MEMORY_INLINE
+#endif /* __GNUC__ || _MSC_VER */
+#endif /* RTL_MEMORY_INLINE */
+
+
+/** printf() format specifier(s)
+ * (from C90 <sys/int_fmtio.h>)
+ */
+#ifndef PRIu64
+#if defined(_MSC_VER)
+#define PRIu64 "I64u"
+#else /* !_MSC_VER */
+#define PRIu64 "llu"
+#endif /* !_MSC_VER */
+#endif /* PRIu64 */
+
+
+/** highbit(): log2() + 1
+ * (complexity O(1))
+ */
+static RTL_MEMORY_INLINE int
+highbit(sal_Size n)
+{
+ register int k = 1;
+
+ if (n == 0)
+ return (0);
+#if SAL_TYPES_SIZEOFLONG == 8
+ if (n & 0xffffffff00000000ul)
+ k |= 32, n >>= 32;
+#endif
+ if (n & 0xffff0000)
+ k |= 16, n >>= 16;
+ if (n & 0xff00)
+ k |= 8, n >>= 8;
+ if (n & 0xf0)
+ k |= 4, n >>= 4;
+ if (n & 0x0c)
+ k |= 2, n >>= 2;
+ if (n & 0x02)
+ k++;
+
+ return (k);
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(highbit)
+#endif /* __SUNPRO_C */
+
+
+/** lowbit(): find first bit set
+ * (complexity O(1))
+ */
+static RTL_MEMORY_INLINE int
+lowbit(sal_Size n)
+{
+ register int k = 1;
+
+ if (n == 0)
+ return (0);
+#if SAL_TYPES_SIZEOFLONG == 8
+ if (!(n & 0xffffffff))
+ k |= 32, n >>= 32;
+#endif
+ if (!(n & 0xffff))
+ k |= 16, n >>= 16;
+ if (!(n & 0xff))
+ k |= 8, n >>= 8;
+ if (!(n & 0xf))
+ k |= 4, n >>= 4;
+ if (!(n & 0x3))
+ k |= 2, n >>= 2;
+ if (!(n & 0x1))
+ k++;
+ return (k);
+}
+
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma inline(lowbit)
+#endif /* __SUNPRO_C */
+
+
+/** Queue manipulation macros
+ * (doubly linked circular list)
+ * (complexity O(1))
+ */
+#define QUEUE_STARTED_NAMED(entry, name) \
+ (((entry)->m_##name##next == (entry)) && ((entry)->m_##name##prev == (entry)))
+
+#define QUEUE_START_NAMED(entry, name) \
+{ \
+ (entry)->m_##name##next = (entry); \
+ (entry)->m_##name##prev = (entry); \
+}
+
+#define QUEUE_REMOVE_NAMED(entry, name) \
+{ \
+ (entry)->m_##name##prev->m_##name##next = (entry)->m_##name##next; \
+ (entry)->m_##name##next->m_##name##prev = (entry)->m_##name##prev; \
+ QUEUE_START_NAMED(entry, name); \
+}
+
+#define QUEUE_INSERT_HEAD_NAMED(head, entry, name) \
+{ \
+ (entry)->m_##name##prev = (head); \
+ (entry)->m_##name##next = (head)->m_##name##next; \
+ (head)->m_##name##next = (entry); \
+ (entry)->m_##name##next->m_##name##prev = (entry); \
+}
+
+#define QUEUE_INSERT_TAIL_NAMED(head, entry, name) \
+{ \
+ (entry)->m_##name##next = (head); \
+ (entry)->m_##name##prev = (head)->m_##name##prev; \
+ (head)->m_##name##prev = (entry); \
+ (entry)->m_##name##prev->m_##name##next = (entry); \
+}
+
+
+/** rtl_memory_lock_type
+ * (platform dependent)
+ */
+#if defined(SAL_UNX) || defined(SAL_OS2)
+
+#include <unistd.h>
+#include <pthread.h>
+
+typedef pthread_mutex_t rtl_memory_lock_type;
+
+#define RTL_MEMORY_LOCK_INIT(lock) pthread_mutex_init((lock), NULL)
+#define RTL_MEMORY_LOCK_DESTROY(lock) pthread_mutex_destroy((lock))
+
+#define RTL_MEMORY_LOCK_ACQUIRE(lock) pthread_mutex_lock((lock))
+#define RTL_MEMORY_LOCK_RELEASE(lock) pthread_mutex_unlock((lock))
+
+#elif defined(SAL_W32)
+
+#define WIN32_LEAN_AND_MEAN
+#ifdef _MSC_VER
+#pragma warning(push,1) /* disable warnings within system headers */
+#endif
+#include <windows.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+typedef CRITICAL_SECTION rtl_memory_lock_type;
+
+#define RTL_MEMORY_LOCK_INIT(lock) InitializeCriticalSection((lock))
+#define RTL_MEMORY_LOCK_DESTROY(lock) DeleteCriticalSection((lock))
+
+#define RTL_MEMORY_LOCK_ACQUIRE(lock) EnterCriticalSection((lock))
+#define RTL_MEMORY_LOCK_RELEASE(lock) LeaveCriticalSection((lock))
+
+#else
+#error Unknown platform
+#endif /* SAL_UNX | SAL_W32 */
+
+
+/** Cache creation flags.
+ * @internal
+ */
+#define RTL_CACHE_FLAG_NOMAGAZINE (1 << 13) /* w/o magazine layer */
+#define RTL_CACHE_FLAG_QUANTUMCACHE (2 << 13) /* used as arena quantum cache */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* INCLUDED_RTL_ALLOC_IMPL_H */
diff --git a/sal/rtl/source/bootstrap.cxx b/sal/rtl/source/bootstrap.cxx
new file mode 100644
index 000000000000..cc7d3336c2d2
--- /dev/null
+++ b/sal/rtl/source/bootstrap.cxx
@@ -0,0 +1,1059 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "rtl/bootstrap.h"
+#include "rtl/bootstrap.hxx"
+#include <osl/diagnose.h>
+#include <osl/module.h>
+#include <osl/process.h>
+#include <osl/file.hxx>
+#include <osl/mutex.hxx>
+#include <osl/profile.hxx>
+#include <osl/security.hxx>
+#include <rtl/alloc.h>
+#include <rtl/string.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <rtl/ustring.hxx>
+#include <rtl/byteseq.hxx>
+#include <rtl/instance.hxx>
+#include <rtl/malformeduriexception.hxx>
+#include <rtl/uri.hxx>
+#include "rtl/allocator.hxx"
+
+#include "macro.hxx"
+
+#include <hash_map>
+#include <list>
+
+#define MY_STRING_(x) # x
+#define MY_STRING(x) MY_STRING_(x)
+
+//----------------------------------------------------------------------------
+
+using osl::DirectoryItem;
+using osl::FileStatus;
+
+using rtl::OString;
+using rtl::OUString;
+using rtl::OUStringToOString;
+
+struct Bootstrap_Impl;
+
+namespace {
+
+static char const VND_SUN_STAR_PATHNAME[] = "vnd.sun.star.pathname:";
+
+bool isPathnameUrl(rtl::OUString const & url) {
+ return url.matchIgnoreAsciiCaseAsciiL(
+ RTL_CONSTASCII_STRINGPARAM(VND_SUN_STAR_PATHNAME));
+}
+
+bool resolvePathnameUrl(rtl::OUString * url) {
+ OSL_ASSERT(url != NULL);
+ if (!isPathnameUrl(*url) ||
+ (osl::FileBase::getFileURLFromSystemPath(
+ url->copy(RTL_CONSTASCII_LENGTH(VND_SUN_STAR_PATHNAME)), *url) ==
+ osl::FileBase::E_None))
+ {
+ return true;
+ } else {
+ *url = rtl::OUString();
+ return false;
+ }
+}
+
+enum LookupMode {
+ LOOKUP_MODE_NORMAL, LOOKUP_MODE_URE_BOOTSTRAP,
+ LOOKUP_MODE_URE_BOOTSTRAP_EXPANSION };
+
+struct ExpandRequestLink {
+ ExpandRequestLink const * next;
+ Bootstrap_Impl const * file;
+ rtl::OUString key;
+};
+
+rtl::OUString expandMacros(
+ Bootstrap_Impl const * file, rtl::OUString const & text, LookupMode mode,
+ ExpandRequestLink const * requestStack);
+
+rtl::OUString recursivelyExpandMacros(
+ Bootstrap_Impl const * file, rtl::OUString const & text, LookupMode mode,
+ Bootstrap_Impl const * requestFile, rtl::OUString const & requestKey,
+ ExpandRequestLink const * requestStack)
+{
+ for (; requestStack != NULL; requestStack = requestStack->next) {
+ if (requestStack->file == requestFile &&
+ requestStack->key == requestKey)
+ {
+ return rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("***RECURSION DETECTED***"));
+ }
+ }
+ ExpandRequestLink link = { requestStack, requestFile, requestKey };
+ return expandMacros(file, text, mode, &link);
+}
+
+}
+
+//----------------------------------------------------------------------------
+
+struct rtl_bootstrap_NameValue
+{
+ OUString sName;
+ OUString sValue;
+
+ inline rtl_bootstrap_NameValue() SAL_THROW( () )
+ {}
+ inline rtl_bootstrap_NameValue(
+ OUString const & name, OUString const & value ) SAL_THROW( () )
+ : sName( name ),
+ sValue( value )
+ {}
+};
+
+typedef std::list<
+ rtl_bootstrap_NameValue,
+ rtl::Allocator< rtl_bootstrap_NameValue >
+> NameValueList;
+
+bool find(
+ NameValueList const & list, rtl::OUString const & key,
+ rtl::OUString * value)
+{
+ OSL_ASSERT(value != NULL);
+ for (NameValueList::const_iterator i(list.begin()); i != list.end(); ++i) {
+ if (i->sName == key) {
+ *value = i->sValue;
+ return true;
+ }
+ }
+ return false;
+}
+
+namespace {
+ struct rtl_bootstrap_set_list :
+ public rtl::Static< NameValueList, rtl_bootstrap_set_list > {};
+}
+
+//----------------------------------------------------------------------------
+
+static sal_Bool getFromCommandLineArgs(
+ rtl::OUString const & key, rtl::OUString * value )
+{
+ OSL_ASSERT(value != NULL);
+ static NameValueList *pNameValueList = 0;
+ if( ! pNameValueList )
+ {
+ static NameValueList nameValueList;
+
+ sal_Int32 nArgCount = osl_getCommandArgCount();
+ for(sal_Int32 i = 0; i < nArgCount; ++ i)
+ {
+ rtl_uString *pArg = 0;
+ osl_getCommandArg( i, &pArg );
+ if( ('-' == pArg->buffer[0] || '/' == pArg->buffer[0] ) &&
+ 'e' == pArg->buffer[1] &&
+ 'n' == pArg->buffer[2] &&
+ 'v' == pArg->buffer[3] &&
+ ':' == pArg->buffer[4] )
+ {
+ sal_Int32 nIndex = rtl_ustr_indexOfChar( pArg->buffer, '=' );
+ if( nIndex >= 0 )
+ {
+
+ rtl_bootstrap_NameValue nameValue;
+ nameValue.sName = OUString( &(pArg->buffer[5]), nIndex - 5 );
+ nameValue.sValue = OUString( &(pArg->buffer[nIndex+1]) );
+ if( i == nArgCount-1 &&
+ nameValue.sValue.getLength() &&
+ nameValue.sValue[nameValue.sValue.getLength()-1] == 13 )
+ {
+ // avoid the 13 linefeed for the last argument,
+ // when the executable is started from a script,
+ // that was edited on windows
+ nameValue.sValue = nameValue.sValue.copy(0,nameValue.sValue.getLength()-1);
+ }
+ nameValueList.push_back( nameValue );
+ }
+ }
+ rtl_uString_release( pArg );
+ }
+ pNameValueList = &nameValueList;
+ }
+
+ sal_Bool found = sal_False;
+
+ for( NameValueList::iterator ii = pNameValueList->begin() ;
+ ii != pNameValueList->end() ;
+ ++ii )
+ {
+ if( (*ii).sName.equals(key) )
+ {
+ *value = (*ii).sValue;
+ found = sal_True;
+ break;
+ }
+ }
+
+ return found;
+}
+
+//----------------------------------------------------------------------------
+
+extern "C" oslProcessError SAL_CALL osl_bootstrap_getExecutableFile_Impl (
+ rtl_uString ** ppFileURL) SAL_THROW_EXTERN_C();
+
+inline void getExecutableFile_Impl (rtl_uString ** ppFileURL)
+{
+ osl_bootstrap_getExecutableFile_Impl (ppFileURL);
+}
+
+//----------------------------------------------------------------------------
+
+static void getExecutableDirectory_Impl (rtl_uString ** ppDirURL)
+{
+ OUString fileName;
+ getExecutableFile_Impl (&(fileName.pData));
+
+ sal_Int32 nDirEnd = fileName.lastIndexOf('/');
+ OSL_ENSURE(nDirEnd >= 0, "Cannot locate executable directory");
+
+ rtl_uString_newFromStr_WithLength(ppDirURL,fileName.getStr(),nDirEnd);
+}
+
+//----------------------------------------------------------------------------
+
+static OUString & getIniFileName_Impl()
+{
+ static OUString *pStaticName = 0;
+ if( ! pStaticName )
+ {
+ OUString fileName;
+
+ if(getFromCommandLineArgs(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("INIFILENAME")), &fileName))
+ {
+ resolvePathnameUrl(&fileName);
+ }
+ else
+ {
+ getExecutableFile_Impl (&(fileName.pData));
+
+ // get rid of a potential executable extension
+ OUString progExt (RTL_CONSTASCII_USTRINGPARAM(".bin"));
+ if(fileName.getLength() > progExt.getLength()
+ && fileName.copy(fileName.getLength() - progExt.getLength()).equalsIgnoreAsciiCase(progExt))
+ fileName = fileName.copy(0, fileName.getLength() - progExt.getLength());
+
+ progExt = OUString::createFromAscii(".exe");
+ if(fileName.getLength() > progExt.getLength()
+ && fileName.copy(fileName.getLength() - progExt.getLength()).equalsIgnoreAsciiCase(progExt))
+ fileName = fileName.copy(0, fileName.getLength() - progExt.getLength());
+
+ // append config file suffix
+ fileName += OUString(RTL_CONSTASCII_USTRINGPARAM(SAL_CONFIGFILE("")));
+ }
+
+ static OUString theFileName;
+ if(fileName.getLength())
+ theFileName = fileName;
+
+ pStaticName = &theFileName;
+ }
+
+ return *pStaticName;
+}
+
+//----------------------------------------------------------------------------
+
+static inline bool path_exists( OUString const & path )
+{
+ DirectoryItem dirItem;
+ return (DirectoryItem::E_None == DirectoryItem::get( path, dirItem ));
+}
+
+//----------------------------------------------------------------------------
+// #111772#
+// ensure the given file url has no final slash
+
+inline void EnsureNoFinalSlash (rtl::OUString & url)
+{
+ sal_Int32 i = url.getLength();
+ if (i > 0 && url[i - 1] == '/') {
+ url = url.copy(0, i - 1);
+ }
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+struct Bootstrap_Impl
+{
+ sal_Int32 _nRefCount;
+ Bootstrap_Impl * _base_ini;
+
+ NameValueList _nameValueList;
+ OUString _iniName;
+
+ explicit Bootstrap_Impl (OUString const & rIniName);
+ ~Bootstrap_Impl();
+
+ static void * operator new (std::size_t n) SAL_THROW(())
+ { return rtl_allocateMemory (sal_uInt32(n)); }
+ static void operator delete (void * p , std::size_t) SAL_THROW(())
+ { rtl_freeMemory (p); }
+
+ bool getValue(
+ rtl::OUString const & key, rtl_uString ** value,
+ rtl_uString * defaultValue, LookupMode mode, bool override,
+ ExpandRequestLink const * requestStack) const;
+ bool getDirectValue(
+ rtl::OUString const & key, rtl_uString ** value, LookupMode mode,
+ ExpandRequestLink const * requestStack) const;
+ bool getAmbienceValue(
+ rtl::OUString const & key, rtl_uString ** value, LookupMode mode,
+ ExpandRequestLink const * requestStack) const;
+ void expandValue(
+ rtl_uString ** value, rtl::OUString const & text, LookupMode mode,
+ Bootstrap_Impl const * requestFile, rtl::OUString const & requestKey,
+ ExpandRequestLink const * requestStack) const;
+};
+
+//----------------------------------------------------------------------------
+
+Bootstrap_Impl::Bootstrap_Impl( OUString const & rIniName )
+ : _nRefCount( 0 ),
+ _base_ini( 0 ),
+ _iniName (rIniName)
+{
+ OUString base_ini( getIniFileName_Impl() );
+ // normalize path
+ FileStatus status( FileStatusMask_FileURL );
+ DirectoryItem dirItem;
+ if (DirectoryItem::E_None == DirectoryItem::get( base_ini, dirItem ) &&
+ DirectoryItem::E_None == dirItem.getFileStatus( status ))
+ {
+ base_ini = status.getFileURL();
+ if (! rIniName.equals( base_ini ))
+ {
+ _base_ini = static_cast< Bootstrap_Impl * >(
+ rtl_bootstrap_args_open( base_ini.pData ) );
+ }
+ }
+
+#if OSL_DEBUG_LEVEL > 1
+ OString sFile = OUStringToOString(_iniName, RTL_TEXTENCODING_ASCII_US);
+ OSL_TRACE(__FILE__" -- Bootstrap_Impl() - %s\n", sFile.getStr());
+#endif /* OSL_DEBUG_LEVEL > 1 */
+
+ oslFileHandle handle;
+ if (_iniName.getLength() &&
+ osl_File_E_None == osl_openFile(_iniName.pData, &handle, osl_File_OpenFlag_Read))
+ {
+ rtl::ByteSequence seq;
+
+ while (osl_File_E_None == osl_readLine(handle , (sal_Sequence **)&seq))
+ {
+ OString line( (const sal_Char *) seq.getConstArray(), seq.getLength() );
+ sal_Int32 nIndex = line.indexOf('=');
+ if (nIndex >= 1)
+ {
+ struct rtl_bootstrap_NameValue nameValue;
+ nameValue.sName = OStringToOUString(
+ line.copy(0,nIndex).trim(), RTL_TEXTENCODING_ASCII_US );
+ nameValue.sValue = OStringToOUString(
+ line.copy(nIndex+1).trim(), RTL_TEXTENCODING_UTF8 );
+
+#if OSL_DEBUG_LEVEL > 1
+ OString name_tmp = OUStringToOString(nameValue.sName, RTL_TEXTENCODING_ASCII_US);
+ OString value_tmp = OUStringToOString(nameValue.sValue, RTL_TEXTENCODING_UTF8);
+ OSL_TRACE(
+ __FILE__" -- pushing: name=%s value=%s\n",
+ name_tmp.getStr(), value_tmp.getStr() );
+#endif /* OSL_DEBUG_LEVEL > 1 */
+
+ _nameValueList.push_back(nameValue);
+ }
+ }
+ osl_closeFile(handle);
+ }
+#if OSL_DEBUG_LEVEL > 1
+ else
+ {
+ OString file_tmp = OUStringToOString(_iniName, RTL_TEXTENCODING_ASCII_US);
+ OSL_TRACE( __FILE__" -- couldn't open file: %s", file_tmp.getStr() );
+ }
+#endif /* OSL_DEBUG_LEVEL > 1 */
+}
+
+//----------------------------------------------------------------------------
+
+Bootstrap_Impl::~Bootstrap_Impl()
+{
+ if (_base_ini != 0)
+ rtl_bootstrap_args_close( _base_ini );
+}
+
+//----------------------------------------------------------------------------
+
+namespace {
+
+Bootstrap_Impl * get_static_bootstrap_handle() SAL_THROW(())
+{
+ osl::MutexGuard guard( osl::Mutex::getGlobalMutex() );
+ static Bootstrap_Impl * s_handle = 0;
+ if (s_handle == 0)
+ {
+ OUString iniName (getIniFileName_Impl());
+ s_handle = static_cast< Bootstrap_Impl * >(
+ rtl_bootstrap_args_open( iniName.pData ) );
+ if (s_handle == 0)
+ {
+ Bootstrap_Impl * that = new Bootstrap_Impl( iniName );
+ ++that->_nRefCount;
+ s_handle = that;
+ }
+ }
+ return s_handle;
+}
+
+struct FundamentalIniData {
+ rtlBootstrapHandle ini;
+
+ FundamentalIniData() {
+ OUString uri;
+ ini =
+ ((static_cast< Bootstrap_Impl * >(get_static_bootstrap_handle())->
+ getValue(
+ rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM("URE_BOOTSTRAP")),
+ &uri.pData, 0, LOOKUP_MODE_NORMAL, false, 0)) &&
+ resolvePathnameUrl(&uri))
+ ? rtl_bootstrap_args_open(uri.pData) : NULL;
+ }
+
+ ~FundamentalIniData() { rtl_bootstrap_args_close(ini); }
+
+private:
+ FundamentalIniData(FundamentalIniData &); // not defined
+ void operator =(FundamentalIniData &); // not defined
+};
+
+struct FundamentalIni: public rtl::Static< FundamentalIniData, FundamentalIni >
+{};
+
+}
+
+bool Bootstrap_Impl::getValue(
+ rtl::OUString const & key, rtl_uString ** value, rtl_uString * defaultValue,
+ LookupMode mode, bool override, ExpandRequestLink const * requestStack)
+ const
+{
+ if (mode == LOOKUP_MODE_NORMAL &&
+ key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("URE_BOOTSTRAP")))
+ {
+ mode = LOOKUP_MODE_URE_BOOTSTRAP;
+ }
+ if (override && getDirectValue(key, value, mode, requestStack)) {
+ return true;
+ }
+ if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("_OS"))) {
+ rtl_uString_assign(
+ value, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(THIS_OS)).pData);
+ return true;
+ }
+ if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("_ARCH"))) {
+ rtl_uString_assign(
+ value, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(THIS_ARCH)).pData);
+ return true;
+ }
+ if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("_CPPU_ENV"))) {
+ rtl_uString_assign(
+ value,
+ (rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(MY_STRING(CPPU_ENV))).
+ pData));
+ return true;
+ }
+ if (key.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("ORIGIN"))) {
+ rtl_uString_assign(
+ value,
+ _iniName.copy(
+ 0, std::max<sal_Int32>(0, _iniName.lastIndexOf('/'))).pData);
+ return true;
+ }
+ if (getAmbienceValue(key, value, mode, requestStack)) {
+ return true;
+ }
+ if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("SYSUSERCONFIG"))) {
+ rtl::OUString v;
+ bool b = osl::Security().getConfigDir(v);
+ EnsureNoFinalSlash(v);
+ rtl_uString_assign(value, v.pData);
+ return b;
+ }
+ if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("SYSUSERHOME"))) {
+ rtl::OUString v;
+ bool b = osl::Security().getHomeDir(v);
+ EnsureNoFinalSlash(v);
+ rtl_uString_assign(value, v.pData);
+ return b;
+ }
+ if (key.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("SYSBINDIR"))) {
+ getExecutableDirectory_Impl(value);
+ return true;
+ }
+ if (_base_ini != NULL &&
+ _base_ini->getDirectValue(key, value, mode, requestStack))
+ {
+ return true;
+ }
+ if (!override && getDirectValue(key, value, mode, requestStack)) {
+ return true;
+ }
+ if (mode == LOOKUP_MODE_NORMAL) {
+ FundamentalIniData const & d = FundamentalIni::get();
+ Bootstrap_Impl const * b = static_cast<Bootstrap_Impl const *>(d.ini);
+ if (b != NULL && b != this &&
+ b->getDirectValue(key, value, mode, requestStack))
+ {
+ return true;
+ }
+ }
+ if (defaultValue != NULL) {
+ rtl_uString_assign(value, defaultValue);
+ return true;
+ }
+ rtl_uString_new(value);
+ return false;
+}
+
+bool Bootstrap_Impl::getDirectValue(
+ rtl::OUString const & key, rtl_uString ** value, LookupMode mode,
+ ExpandRequestLink const * requestStack) const
+{
+ rtl::OUString v;
+ if (find(_nameValueList, key, &v)) {
+ expandValue(value, v, mode, this, key, requestStack);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+bool Bootstrap_Impl::getAmbienceValue(
+ rtl::OUString const & key, rtl_uString ** value, LookupMode mode,
+ ExpandRequestLink const * requestStack) const
+{
+ rtl::OUString v;
+ bool f;
+ {
+ osl::MutexGuard g(osl::Mutex::getGlobalMutex());
+ f = find(rtl_bootstrap_set_list::get(), key, &v);
+ }
+ if (f || getFromCommandLineArgs(key, &v) ||
+ osl_getEnvironment(key.pData, &v.pData) == osl_Process_E_None)
+ {
+ expandValue(value, v, mode, NULL, key, requestStack);
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void Bootstrap_Impl::expandValue(
+ rtl_uString ** value, rtl::OUString const & text, LookupMode mode,
+ Bootstrap_Impl const * requestFile, rtl::OUString const & requestKey,
+ ExpandRequestLink const * requestStack) const
+{
+ rtl_uString_assign(
+ value,
+ (mode == LOOKUP_MODE_URE_BOOTSTRAP && isPathnameUrl(text) ?
+ text :
+ recursivelyExpandMacros(
+ this, text,
+ (mode == LOOKUP_MODE_URE_BOOTSTRAP ?
+ LOOKUP_MODE_URE_BOOTSTRAP_EXPANSION : mode),
+ requestFile, requestKey, requestStack)).pData);
+}
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+namespace {
+
+struct bootstrap_map {
+ // map<> may be preferred here, but hash_map<> is implemented fully inline,
+ // thus there is no need to link against the stlport:
+ typedef std::hash_map<
+ rtl::OUString, Bootstrap_Impl *,
+ rtl::OUStringHash, std::equal_to< rtl::OUString >,
+ rtl::Allocator< OUString > > t;
+
+ // get and release must only be called properly synchronized via some mutex
+ // (e.g., osl::Mutex::getGlobalMutex()):
+
+ static t * get() {
+ if (m_map == NULL) {
+ m_map = new t;
+ }
+ return m_map;
+ }
+
+ static void release() {
+ if (m_map != NULL && m_map->empty()) {
+ delete m_map;
+ m_map = NULL;
+ }
+ }
+
+private:
+ bootstrap_map(); // not defined
+
+ static t * m_map;
+};
+
+bootstrap_map::t * bootstrap_map::m_map = NULL;
+
+}
+
+//----------------------------------------------------------------------------
+
+rtlBootstrapHandle SAL_CALL rtl_bootstrap_args_open (
+ rtl_uString * pIniName
+) SAL_THROW_EXTERN_C()
+{
+ OUString iniName( pIniName );
+
+ // normalize path
+ FileStatus status( FileStatusMask_FileURL );
+ DirectoryItem dirItem;
+ if (DirectoryItem::E_None != DirectoryItem::get( iniName, dirItem ) ||
+ DirectoryItem::E_None != dirItem.getFileStatus( status ))
+ {
+ return 0;
+ }
+ iniName = status.getFileURL();
+
+ Bootstrap_Impl * that;
+ osl::ResettableMutexGuard guard( osl::Mutex::getGlobalMutex() );
+ bootstrap_map::t* p_bootstrap_map = bootstrap_map::get();
+ bootstrap_map::t::const_iterator iFind( p_bootstrap_map->find( iniName ) );
+ if (iFind == p_bootstrap_map->end())
+ {
+ bootstrap_map::release();
+ guard.clear();
+ that = new Bootstrap_Impl( iniName );
+ guard.reset();
+ p_bootstrap_map = bootstrap_map::get();
+ iFind = p_bootstrap_map->find( iniName );
+ if (iFind == p_bootstrap_map->end())
+ {
+ ++that->_nRefCount;
+ ::std::pair< bootstrap_map::t::iterator, bool > insertion(
+ p_bootstrap_map->insert(
+ bootstrap_map::t::value_type( iniName, that ) ) );
+ OSL_ASSERT( insertion.second );
+ }
+ else
+ {
+ Bootstrap_Impl * obsolete = that;
+ that = iFind->second;
+ ++that->_nRefCount;
+ guard.clear();
+ delete obsolete;
+ }
+ }
+ else
+ {
+ that = iFind->second;
+ ++that->_nRefCount;
+ }
+ return static_cast< rtlBootstrapHandle >( that );
+}
+
+//----------------------------------------------------------------------------
+
+void SAL_CALL rtl_bootstrap_args_close (
+ rtlBootstrapHandle handle
+) SAL_THROW_EXTERN_C()
+{
+ if (handle == 0)
+ return;
+ Bootstrap_Impl * that = static_cast< Bootstrap_Impl * >( handle );
+
+ osl::MutexGuard guard( osl::Mutex::getGlobalMutex() );
+ bootstrap_map::t* p_bootstrap_map = bootstrap_map::get();
+ OSL_ASSERT(
+ p_bootstrap_map->find( that->_iniName )->second == that );
+ --that->_nRefCount;
+ if (that->_nRefCount == 0)
+ {
+ ::std::size_t nLeaking = 8; // only hold up to 8 files statically
+
+#if OSL_DEBUG_LEVEL == 1 // nonpro
+ nLeaking = 0;
+#elif OSL_DEBUG_LEVEL > 1 // debug
+ nLeaking = 1;
+#endif /* OSL_DEBUG_LEVEL */
+
+ if (p_bootstrap_map->size() > nLeaking)
+ {
+ ::std::size_t erased = p_bootstrap_map->erase( that->_iniName );
+ if (erased != 1) {
+ OSL_ASSERT( false );
+ }
+ delete that;
+ }
+ bootstrap_map::release();
+ }
+}
+
+//----------------------------------------------------------------------------
+
+sal_Bool SAL_CALL rtl_bootstrap_get_from_handle(
+ rtlBootstrapHandle handle,
+ rtl_uString * pName,
+ rtl_uString ** ppValue,
+ rtl_uString * pDefault
+) SAL_THROW_EXTERN_C()
+{
+ osl::MutexGuard guard( osl::Mutex::getGlobalMutex() );
+
+ sal_Bool found = sal_False;
+ if(ppValue && pName)
+ {
+ if (handle == 0)
+ handle = get_static_bootstrap_handle();
+ found = static_cast< Bootstrap_Impl * >( handle )->getValue(
+ pName, ppValue, pDefault, LOOKUP_MODE_NORMAL, false, NULL );
+ }
+
+ return found;
+}
+
+//----------------------------------------------------------------------------
+
+void SAL_CALL rtl_bootstrap_get_iniName_from_handle (
+ rtlBootstrapHandle handle,
+ rtl_uString ** ppIniName
+) SAL_THROW_EXTERN_C()
+{
+ if(ppIniName)
+ {
+ if(handle)
+ {
+ Bootstrap_Impl * pImpl = static_cast<Bootstrap_Impl*>(handle);
+ rtl_uString_assign(ppIniName, pImpl->_iniName.pData);
+ }
+ else
+ {
+ const OUString & iniName = getIniFileName_Impl();
+ rtl_uString_assign(ppIniName, iniName.pData);
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+
+void SAL_CALL rtl_bootstrap_setIniFileName (
+ rtl_uString * pName
+) SAL_THROW_EXTERN_C()
+{
+ osl::MutexGuard guard( osl::Mutex::getGlobalMutex() );
+ OUString & file = getIniFileName_Impl();
+ file = pName;
+}
+
+//----------------------------------------------------------------------------
+
+sal_Bool SAL_CALL rtl_bootstrap_get (
+ rtl_uString * pName,
+ rtl_uString ** ppValue,
+ rtl_uString * pDefault
+) SAL_THROW_EXTERN_C()
+{
+ return rtl_bootstrap_get_from_handle(0, pName, ppValue, pDefault);
+}
+
+//----------------------------------------------------------------------------
+
+void SAL_CALL rtl_bootstrap_set (
+ rtl_uString * pName,
+ rtl_uString * pValue
+) SAL_THROW_EXTERN_C()
+{
+ const OUString name( pName );
+ const OUString value( pValue );
+
+ osl::MutexGuard guard( osl::Mutex::getGlobalMutex() );
+
+ NameValueList& r_rtl_bootstrap_set_list = rtl_bootstrap_set_list::get();
+ NameValueList::iterator iPos( r_rtl_bootstrap_set_list.begin() );
+ NameValueList::iterator iEnd( r_rtl_bootstrap_set_list.end() );
+ for ( ; iPos != iEnd; ++iPos )
+ {
+ if (iPos->sName.equals( name ))
+ {
+ iPos->sValue = value;
+ return;
+ }
+ }
+
+#if OSL_DEBUG_LEVEL > 1
+ OString cstr_name( OUStringToOString( name, RTL_TEXTENCODING_ASCII_US ) );
+ OString cstr_value( OUStringToOString( value, RTL_TEXTENCODING_ASCII_US ) );
+ OSL_TRACE(
+ "bootstrap.cxx: explicitly setting: name=%s value=%s\n",
+ cstr_name.getStr(), cstr_value.getStr() );
+#endif /* OSL_DEBUG_LEVEL > 1 */
+
+ r_rtl_bootstrap_set_list.push_back( rtl_bootstrap_NameValue( name, value ) );
+}
+
+//----------------------------------------------------------------------------
+
+void SAL_CALL rtl_bootstrap_expandMacros_from_handle (
+ rtlBootstrapHandle handle,
+ rtl_uString ** macro
+) SAL_THROW_EXTERN_C()
+{
+ if (handle == NULL) {
+ handle = get_static_bootstrap_handle();
+ }
+ OUString expanded( expandMacros( static_cast< Bootstrap_Impl * >( handle ),
+ * reinterpret_cast< OUString const * >( macro ),
+ LOOKUP_MODE_NORMAL, NULL ) );
+ rtl_uString_assign( macro, expanded.pData );
+}
+
+//----------------------------------------------------------------------------
+
+void SAL_CALL rtl_bootstrap_expandMacros(
+ rtl_uString ** macro )
+ SAL_THROW_EXTERN_C()
+{
+ rtl_bootstrap_expandMacros_from_handle(NULL, macro);
+}
+
+void rtl_bootstrap_encode( rtl_uString const * value, rtl_uString ** encoded )
+ SAL_THROW_EXTERN_C()
+{
+ OSL_ASSERT(value != NULL);
+ rtl::OUStringBuffer b;
+ for (sal_Int32 i = 0; i < value->length; ++i) {
+ sal_Unicode c = value->buffer[i];
+ if (c == '$' || c == '\\') {
+ b.append(sal_Unicode('\\'));
+ }
+ b.append(c);
+ }
+ rtl_uString_assign(encoded, b.makeStringAndClear().pData);
+}
+
+namespace {
+
+int hex(sal_Unicode c) {
+ return
+ c >= '0' && c <= '9' ? c - '0' :
+ c >= 'A' && c <= 'F' ? c - 'A' + 10 :
+ c >= 'a' && c <= 'f' ? c - 'a' + 10 : -1;
+}
+
+sal_Unicode read(rtl::OUString const & text, sal_Int32 * pos, bool * escaped) {
+ OSL_ASSERT(
+ pos != NULL && *pos >= 0 && *pos < text.getLength() && escaped != NULL);
+ sal_Unicode c = text[(*pos)++];
+ if (c == '\\') {
+ int n1, n2, n3, n4;
+ if (*pos < text.getLength() - 4 && text[*pos] == 'u' &&
+ ((n1 = hex(text[*pos + 1])) >= 0) &&
+ ((n2 = hex(text[*pos + 2])) >= 0) &&
+ ((n3 = hex(text[*pos + 3])) >= 0) &&
+ ((n4 = hex(text[*pos + 4])) >= 0))
+ {
+ *pos += 5;
+ *escaped = true;
+ return static_cast< sal_Unicode >(
+ (n1 << 12) | (n2 << 8) | (n3 << 4) | n4);
+ } else if (*pos < text.getLength()) {
+ *escaped = true;
+ return text[(*pos)++];
+ }
+ }
+ *escaped = false;
+ return c;
+}
+
+rtl::OUString lookup(
+ Bootstrap_Impl const * file, LookupMode mode, bool override,
+ rtl::OUString const & key, ExpandRequestLink const * requestStack)
+{
+ rtl::OUString v;
+ (file == NULL ? get_static_bootstrap_handle() : file)->getValue(
+ key, &v.pData, NULL, mode, override, requestStack);
+ return v;
+}
+
+rtl::OUString expandMacros(
+ Bootstrap_Impl const * file, rtl::OUString const & text, LookupMode mode,
+ ExpandRequestLink const * requestStack)
+{
+ rtl::OUStringBuffer buf;
+ for (sal_Int32 i = 0; i < text.getLength();) {
+ bool escaped;
+ sal_Unicode c = read(text, &i, &escaped);
+ if (escaped || c != '$') {
+ buf.append(c);
+ } else {
+ if (i < text.getLength() && text[i] == '{') {
+ ++i;
+ sal_Int32 p = i;
+ sal_Int32 nesting = 0;
+ rtl::OUString seg[3];
+ int n = 0;
+ while (i < text.getLength()) {
+ sal_Int32 j = i;
+ c = read(text, &i, &escaped);
+ if (!escaped) {
+ switch (c) {
+ case '{':
+ ++nesting;
+ break;
+ case '}':
+ if (nesting == 0) {
+ seg[n++] = text.copy(p, j - p);
+ goto done;
+ } else {
+ --nesting;
+ }
+ break;
+ case ':':
+ if (nesting == 0 && n < 2) {
+ seg[n++] = text.copy(p, j - p);
+ p = i;
+ }
+ break;
+ }
+ }
+ }
+ done:
+ for (int j = 0; j < n; ++j) {
+ seg[j] = expandMacros(file, seg[j], mode, requestStack);
+ }
+ if (n == 3 && seg[1].getLength() == 0) {
+ // For backward compatibility, treat ${file::key} the same
+ // as just ${file:key}:
+ seg[1] = seg[2];
+ n = 2;
+ }
+ if (n == 1) {
+ buf.append(lookup(file, mode, false, seg[0], requestStack));
+ } else if (n == 2) {
+ if (seg[0].equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM(".link")))
+ {
+ osl::File f(seg[1]);
+ rtl::ByteSequence seq;
+ rtl::OUString line;
+ rtl::OUString url;
+ // Silently ignore any errors (is that good?):
+ if (f.open(OpenFlag_Read) == osl::FileBase::E_None &&
+ f.readLine(seq) == osl::FileBase::E_None &&
+ rtl_convertStringToUString(
+ &line.pData,
+ reinterpret_cast< char const * >(
+ seq.getConstArray()),
+ seq.getLength(), RTL_TEXTENCODING_UTF8,
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR |
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)) &&
+ (osl::File::getFileURLFromSystemPath(line, url) ==
+ osl::FileBase::E_None))
+ {
+ try {
+ buf.append(
+ rtl::Uri::convertRelToAbs(seg[1], url));
+ } catch (rtl::MalformedUriException &) {}
+ }
+ } else {
+ buf.append(
+ lookup(
+ static_cast< Bootstrap_Impl * >(
+ rtl::Bootstrap(seg[0]).getHandle()),
+ mode, false, seg[1], requestStack));
+ }
+ } else if (seg[0].equalsAsciiL(
+ RTL_CONSTASCII_STRINGPARAM(".override")))
+ {
+ rtl::Bootstrap b(seg[1]);
+ Bootstrap_Impl * f = static_cast< Bootstrap_Impl * >(
+ b.getHandle());
+ buf.append(
+ lookup(f, mode, f != NULL, seg[2], requestStack));
+ } else {
+ // Going through osl::Profile, this code erroneously does
+ // not recursively expand macros in the resulting
+ // replacement text (and if it did, it would fail to detect
+ // cycles that pass through here):
+ buf.append(
+ rtl::OStringToOUString(
+ osl::Profile(seg[0]).readString(
+ rtl::OUStringToOString(
+ seg[1], RTL_TEXTENCODING_UTF8),
+ rtl::OUStringToOString(
+ seg[2], RTL_TEXTENCODING_UTF8),
+ rtl::OString()),
+ RTL_TEXTENCODING_UTF8));
+ }
+ } else {
+ rtl::OUStringBuffer kbuf;
+ for (; i < text.getLength();) {
+ sal_Int32 j = i;
+ c = read(text, &j, &escaped);
+ if (!escaped &&
+ (c == ' ' || c == '$' || c == '-' || c == '/' ||
+ c == ';' || c == '\\'))
+ {
+ break;
+ }
+ kbuf.append(c);
+ i = j;
+ }
+ buf.append(
+ lookup(
+ file, mode, false, kbuf.makeStringAndClear(),
+ requestStack));
+ }
+ }
+ }
+ return buf.makeStringAndClear();
+}
+
+}
diff --git a/sal/rtl/source/byteseq.c b/sal/rtl/source/byteseq.c
new file mode 100644
index 000000000000..42b905a8d78f
--- /dev/null
+++ b/sal/rtl/source/byteseq.c
@@ -0,0 +1,254 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <osl/diagnose.h>
+#include <osl/interlck.h>
+
+#include <rtl/byteseq.h>
+#include <rtl/alloc.h>
+#include <rtl/memory.h>
+
+/* static data to be referenced by all empty strings
+ * the refCount is predefined to 1 and must never become 0 !
+ */
+static sal_Sequence aEmpty_rtl_ByteSeq =
+{
+ 1, /* sal_Int32 refCount; */
+ 0, /* sal_Int32 length; */
+ { 0 } /* sal_Unicode buffer[1]; */
+};
+
+//==================================================================================================
+void SAL_CALL rtl_byte_sequence_reference2One(
+ sal_Sequence ** ppSequence )
+{
+ sal_Sequence * pSequence, * pNew;
+ sal_Int32 nElements;
+
+ OSL_ENSURE( ppSequence, "### null ptr!" );
+ pSequence = *ppSequence;
+
+ if (pSequence->nRefCount > 1)
+ {
+ nElements = pSequence->nElements;
+ if (nElements)
+ {
+ pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nElements );
+
+ if ( pNew != 0 )
+ rtl_copyMemory( pNew->elements, pSequence->elements, nElements );
+
+ if (! osl_decrementInterlockedCount( &pSequence->nRefCount ))
+ rtl_freeMemory( pSequence );
+ }
+ else
+ {
+ pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE );
+ }
+
+ if ( pNew != 0 )
+ {
+ pNew->nRefCount = 1;
+ pNew->nElements = nElements;
+ }
+
+ *ppSequence = pNew;
+ }
+}
+
+//==================================================================================================
+void SAL_CALL rtl_byte_sequence_realloc(
+ sal_Sequence ** ppSequence, sal_Int32 nSize )
+{
+ sal_Sequence * pSequence, * pNew;
+ sal_Int32 nElements;
+
+ OSL_ENSURE( ppSequence, "### null ptr!" );
+ pSequence = *ppSequence;
+ nElements = pSequence->nElements;
+
+ if (nElements == nSize)
+ return;
+
+ if (pSequence->nRefCount > 1) // split
+ {
+ pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nSize );
+
+ if ( pNew != 0 )
+ {
+ if (nSize > nElements)
+ {
+ rtl_copyMemory( pNew->elements, pSequence->elements, nElements );
+ rtl_zeroMemory( pNew->elements + nElements, nSize - nElements );
+ }
+ else
+ {
+ rtl_copyMemory( pNew->elements, pSequence->elements, nSize );
+ }
+ }
+
+ if (! osl_decrementInterlockedCount( &pSequence->nRefCount ))
+ rtl_freeMemory( pSequence );
+ pSequence = pNew;
+ }
+ else
+ {
+ pSequence = (sal_Sequence *)rtl_reallocateMemory(
+ pSequence, SAL_SEQUENCE_HEADER_SIZE + nSize );
+ }
+
+ if ( pSequence != 0 )
+ {
+ pSequence->nRefCount = 1;
+ pSequence->nElements = nSize;
+ }
+
+ *ppSequence = pSequence;
+}
+
+//==================================================================================================
+void SAL_CALL rtl_byte_sequence_acquire( sal_Sequence *pSequence )
+{
+ OSL_ASSERT( pSequence );
+ osl_incrementInterlockedCount( &(pSequence->nRefCount) );
+}
+
+//==================================================================================================
+void SAL_CALL rtl_byte_sequence_release( sal_Sequence *pSequence )
+{
+ if ( pSequence != 0 )
+ {
+ if (! osl_decrementInterlockedCount( &(pSequence->nRefCount )) )
+ {
+ rtl_freeMemory( pSequence );
+ }
+ }
+}
+
+//==================================================================================================
+void SAL_CALL rtl_byte_sequence_construct( sal_Sequence **ppSequence , sal_Int32 nLength )
+{
+ OSL_ASSERT( ppSequence );
+ if( *ppSequence )
+ {
+ rtl_byte_sequence_release( *ppSequence );
+ *ppSequence = 0;
+ }
+
+ if( nLength )
+ {
+ *ppSequence = (sal_Sequence *) rtl_allocateZeroMemory( SAL_SEQUENCE_HEADER_SIZE + nLength );
+
+ if ( *ppSequence != 0 )
+ {
+ (*ppSequence)->nRefCount = 1;
+ (*ppSequence)->nElements = nLength;
+ }
+ }
+ else
+ {
+ *ppSequence = &aEmpty_rtl_ByteSeq;
+ rtl_byte_sequence_acquire( *ppSequence );
+ }
+}
+
+//==================================================================================================
+void SAL_CALL rtl_byte_sequence_constructNoDefault( sal_Sequence **ppSequence , sal_Int32 nLength )
+{
+ OSL_ASSERT( ppSequence );
+ if( *ppSequence )
+ {
+ rtl_byte_sequence_release( *ppSequence );
+ *ppSequence = 0;
+ }
+
+ *ppSequence = (sal_Sequence *) rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nLength );
+
+ if ( *ppSequence != 0 )
+ {
+ (*ppSequence)->nRefCount = 1;
+ (*ppSequence)->nElements = nLength;
+ }
+}
+
+//==================================================================================================
+void SAL_CALL rtl_byte_sequence_constructFromArray(
+ sal_Sequence **ppSequence, const sal_Int8 *pData , sal_Int32 nLength )
+{
+ rtl_byte_sequence_constructNoDefault( ppSequence , nLength );
+ if ( *ppSequence != 0 )
+ rtl_copyMemory( (*ppSequence)->elements, pData, nLength );
+}
+
+//==================================================================================================
+void SAL_CALL rtl_byte_sequence_assign( sal_Sequence **ppSequence , sal_Sequence *pSequence )
+{
+ if ( *ppSequence != pSequence)
+ {
+ if( *ppSequence )
+ {
+ rtl_byte_sequence_release( *ppSequence );
+ }
+ *ppSequence = pSequence;
+ rtl_byte_sequence_acquire( *ppSequence );
+ }
+// else
+// nothing to do
+
+}
+
+//==================================================================================================
+sal_Bool SAL_CALL rtl_byte_sequence_equals( sal_Sequence *pSequence1 , sal_Sequence *pSequence2 )
+{
+ OSL_ASSERT( pSequence1 );
+ OSL_ASSERT( pSequence2 );
+ if (pSequence1 == pSequence2)
+ {
+ return sal_True;
+ }
+ if (pSequence1->nElements != pSequence2->nElements)
+ {
+ return sal_False;
+ }
+ return (sal_Bool)
+ (rtl_compareMemory(
+ pSequence1->elements, pSequence2->elements, pSequence1->nElements )
+ == 0);
+}
+
+
+//==================================================================================================
+const sal_Int8 *SAL_CALL rtl_byte_sequence_getConstArray( sal_Sequence *pSequence )
+{
+ return ((const sal_Int8*)(pSequence->elements));
+}
+
+//==================================================================================================
+sal_Int32 SAL_CALL rtl_byte_sequence_getLength( sal_Sequence *pSequence )
+{
+ return pSequence->nElements;
+}
diff --git a/sal/rtl/source/cipher.c b/sal/rtl/source/cipher.c
new file mode 100644
index 000000000000..cb11f93cb8e4
--- /dev/null
+++ b/sal/rtl/source/cipher.c
@@ -0,0 +1,1363 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define _RTL_CIPHER_C_ "$Revision: 1.5 $"
+
+#include <sal/types.h>
+#include <rtl/alloc.h>
+#include <rtl/memory.h>
+#include <rtl/cipher.h>
+
+/*========================================================================
+ *
+ * rtlCipher internals.
+ *
+ *======================================================================*/
+#define RTL_CIPHER_NTOHL(c, l) \
+ ((l) = ((sal_uInt32)(*((c)++))) << 24L, \
+ (l) |= ((sal_uInt32)(*((c)++))) << 16L, \
+ (l) |= ((sal_uInt32)(*((c)++))) << 8L, \
+ (l) |= ((sal_uInt32)(*((c)++))))
+
+#define RTL_CIPHER_HTONL(l, c) \
+ (*((c)++) = (sal_uInt8)(((l) >> 24L) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) >> 16L) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) >> 8L) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) ) & 0xff))
+
+#define RTL_CIPHER_NTOHL64(c, xl, xr, n) \
+{ \
+ (xl) = (xr) = 0; \
+ (c) += (n); \
+ switch ((n)) \
+ { \
+ case 8: (xr) = ((sal_uInt32)(*(--(c)))); \
+ case 7: (xr) |= ((sal_uInt32)(*(--(c)))) << 8L; \
+ case 6: (xr) |= ((sal_uInt32)(*(--(c)))) << 16L; \
+ case 5: (xr) |= ((sal_uInt32)(*(--(c)))) << 24L; \
+ case 4: (xl) = ((sal_uInt32)(*(--(c)))); \
+ case 3: (xl) |= ((sal_uInt32)(*(--(c)))) << 8L; \
+ case 2: (xl) |= ((sal_uInt32)(*(--(c)))) << 16L; \
+ case 1: (xl) |= ((sal_uInt32)(*(--(c)))) << 24L; \
+ } \
+}
+
+#define RTL_CIPHER_HTONL64(xl, xr, c, n) \
+{ \
+ (c) += (n); \
+ switch ((n)) \
+ { \
+ case 8: *(--(c)) = (sal_uInt8)(((xr) ) & 0xff); \
+ case 7: *(--(c)) = (sal_uInt8)(((xr) >> 8L) & 0xff); \
+ case 6: *(--(c)) = (sal_uInt8)(((xr) >> 16L) & 0xff); \
+ case 5: *(--(c)) = (sal_uInt8)(((xr) >> 24L) & 0xff); \
+ case 4: *(--(c)) = (sal_uInt8)(((xl) ) & 0xff); \
+ case 3: *(--(c)) = (sal_uInt8)(((xl) >> 8L) & 0xff); \
+ case 2: *(--(c)) = (sal_uInt8)(((xl) >> 16L) & 0xff); \
+ case 1: *(--(c)) = (sal_uInt8)(((xl) >> 24L) & 0xff); \
+ } \
+}
+
+typedef rtlCipherError (SAL_CALL cipher_init_t) (
+ rtlCipher Cipher,
+ rtlCipherDirection Direction,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen);
+
+typedef rtlCipherError (SAL_CALL cipher_update_t) (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen);
+
+typedef void (SAL_CALL cipher_delete_t) (rtlCipher Cipher);
+
+/** Cipher_Impl.
+ */
+typedef struct cipher_impl_st
+{
+ rtlCipherAlgorithm m_algorithm;
+ rtlCipherDirection m_direction;
+ rtlCipherMode m_mode;
+
+ cipher_init_t *m_init;
+ cipher_update_t *m_encode;
+ cipher_update_t *m_decode;
+ cipher_delete_t *m_delete;
+} Cipher_Impl;
+
+/*========================================================================
+ *
+ * rtlCipher implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_cipher_create.
+ */
+rtlCipher SAL_CALL rtl_cipher_create (
+ rtlCipherAlgorithm Algorithm,
+ rtlCipherMode Mode)
+{
+ rtlCipher Cipher = (rtlCipher)NULL;
+ switch (Algorithm)
+ {
+ case rtl_Cipher_AlgorithmBF:
+ Cipher = rtl_cipher_createBF (Mode);
+ break;
+
+ case rtl_Cipher_AlgorithmARCFOUR:
+ Cipher = rtl_cipher_createARCFOUR (Mode);
+ break;
+
+ default: /* rtl_Cipher_AlgorithmInvalid */
+ break;
+ }
+ return Cipher;
+}
+
+/*
+ * rtl_cipher_init.
+ */
+rtlCipherError SAL_CALL rtl_cipher_init (
+ rtlCipher Cipher,
+ rtlCipherDirection Direction,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen)
+{
+ Cipher_Impl *pImpl = (Cipher_Impl*)Cipher;
+ if (pImpl == NULL)
+ return rtl_Cipher_E_Argument;
+ if (pImpl->m_init == NULL)
+ return rtl_Cipher_E_Unknown;
+
+ return (pImpl->m_init)(
+ Cipher, Direction, pKeyData, nKeyLen, pArgData, nArgLen);
+}
+
+/*
+ * rtl_cipher_encode.
+ */
+rtlCipherError SAL_CALL rtl_cipher_encode (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ Cipher_Impl *pImpl = (Cipher_Impl*)Cipher;
+ if (pImpl == NULL)
+ return rtl_Cipher_E_Argument;
+ if (pImpl->m_encode == NULL)
+ return rtl_Cipher_E_Unknown;
+
+ return (pImpl->m_encode)(Cipher, pData, nDatLen, pBuffer, nBufLen);
+}
+
+/*
+ * rtl_cipher_decode.
+ */
+rtlCipherError SAL_CALL rtl_cipher_decode (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ Cipher_Impl *pImpl = (Cipher_Impl*)Cipher;
+ if (pImpl == NULL)
+ return rtl_Cipher_E_Argument;
+ if (pImpl->m_decode == NULL)
+ return rtl_Cipher_E_Unknown;
+
+ return (pImpl->m_decode)(Cipher, pData, nDatLen, pBuffer, nBufLen);
+}
+
+/*
+ * rtl_cipher_destroy.
+ */
+void SAL_CALL rtl_cipher_destroy (rtlCipher Cipher)
+{
+ Cipher_Impl *pImpl = (Cipher_Impl*)Cipher;
+ if (pImpl && pImpl->m_delete)
+ pImpl->m_delete (Cipher);
+}
+
+/*========================================================================
+ *
+ * rtl_cipherBF (Blowfish) internals.
+ *
+ *======================================================================*/
+#define CIPHER_ROUNDS_BF 16
+
+typedef struct cipherBF_key_st
+{
+ sal_uInt32 m_S[4][256];
+ sal_uInt32 m_P[CIPHER_ROUNDS_BF + 2];
+} CipherKeyBF;
+
+typedef struct cipherBF_context_st
+{
+ CipherKeyBF m_key;
+ union
+ {
+ sal_uInt32 m_long[2];
+ sal_uInt8 m_byte[8];
+ } m_iv;
+ sal_uInt32 m_offset;
+} CipherContextBF;
+
+typedef struct cipherBF_impl_st
+{
+ Cipher_Impl m_cipher;
+ CipherContextBF m_context;
+} CipherBF_Impl;
+
+/** __rtl_cipherBF_init.
+ */
+static rtlCipherError __rtl_cipherBF_init (
+ CipherContextBF *ctx,
+ rtlCipherMode eMode,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen);
+
+/** __rtl_cipherBF_update.
+ */
+static rtlCipherError __rtl_cipherBF_update (
+ CipherContextBF *ctx,
+ rtlCipherMode eMode,
+ rtlCipherDirection eDirection,
+ const sal_uInt8 *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen);
+
+/** __rtl_cipherBF_updateECB.
+ */
+static void __rtl_cipherBF_updateECB (
+ CipherContextBF *ctx,
+ rtlCipherDirection direction,
+ const sal_uInt8 *pData,
+ sal_uInt8 *pBuffer,
+ sal_Size nLength);
+
+/** __rtl_cipherBF_updateCBC.
+ */
+static void __rtl_cipherBF_updateCBC (
+ CipherContextBF *ctx,
+ rtlCipherDirection direction,
+ const sal_uInt8 *pData,
+ sal_uInt8 *pBuffer,
+ sal_Size nLength);
+
+/** __rtl_cipherBF_updateCFB.
+ */
+static void __rtl_cipherBF_updateCFB (
+ CipherContextBF *ctx,
+ rtlCipherDirection direction,
+ const sal_uInt8 *pData,
+ sal_uInt8 *pBuffer);
+
+/** __rtl_cipher_encode.
+ */
+static void __rtl_cipherBF_encode (
+ CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr);
+
+/** __rtl_cipherBF_decode.
+ */
+static void __rtl_cipherBF_decode (
+ CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr);
+
+/** __rtl_cipherBF.
+ */
+static sal_uInt32 __rtl_cipherBF (
+ CipherKeyBF *key, sal_uInt32 x);
+
+/** __rtl_cipherBF_key.
+ */
+static const CipherKeyBF __rtl_cipherBF_key =
+{
+ /* S */
+ {
+ /* S[0] */
+ {
+ /* 0 */
+ 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
+ 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
+ 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
+ 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
+
+ /* 1 */
+ 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
+ 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
+ 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
+ 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
+
+ /* 2 */
+ 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
+ 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
+ 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
+ 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
+
+ /* 3 */
+ 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
+ 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
+ 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
+ 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
+
+ /* 4 */
+ 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
+ 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
+ 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
+ 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
+
+ /* 5 */
+ 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
+ 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
+ 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
+ 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
+
+ /* 6 */
+ 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
+ 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
+ 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
+ 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
+
+ /* 7 */
+ 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
+ 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
+ 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
+ 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
+
+ /* 8 */
+ 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
+ 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
+ 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
+ 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
+
+ /* 9 */
+ 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
+ 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
+ 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
+ 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
+
+ /* A */
+ 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
+ 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
+ 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
+ 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
+
+ /* B */
+ 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
+ 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
+ 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
+ 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
+
+ /* C */
+ 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
+ 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
+ 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
+ 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
+
+ /* D */
+ 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
+ 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
+ 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
+ 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
+
+ /* E */
+ 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
+ 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
+ 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
+ 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
+
+ /* F */
+ 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
+ 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
+ 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
+ 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL
+ },
+
+ /* S[1] */
+ {
+ 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
+ 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
+ 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
+ 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
+
+ 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
+ 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
+ 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
+ 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
+
+ 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
+ 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
+ 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
+ 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
+
+ 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
+ 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
+ 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
+ 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
+
+ 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
+ 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
+ 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
+ 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
+
+ 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
+ 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
+ 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
+ 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
+
+ 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
+ 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
+ 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
+ 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
+
+ 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
+ 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
+ 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
+ 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
+
+ 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
+ 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
+ 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
+ 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
+
+ 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
+ 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
+ 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
+ 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
+
+ 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
+ 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
+ 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
+ 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
+
+ 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
+ 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
+ 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
+ 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
+
+ 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
+ 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
+ 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
+ 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
+
+ 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
+ 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
+ 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
+ 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
+
+ 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
+ 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
+ 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
+ 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
+
+ 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
+ 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
+ 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
+ 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L
+ },
+
+ /* S[2] */
+ {
+ 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
+ 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
+ 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
+ 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
+
+ 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
+ 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
+ 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
+ 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
+
+ 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
+ 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
+ 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
+ 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
+
+ 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
+ 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
+ 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
+ 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
+
+ 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
+ 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
+ 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
+ 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
+
+ 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
+ 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
+ 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
+ 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
+
+ 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
+ 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
+ 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
+ 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
+
+ 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
+ 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
+ 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
+ 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
+
+ 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
+ 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
+ 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
+ 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
+
+ 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
+ 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
+ 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
+ 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
+
+ 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
+ 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
+ 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
+ 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
+
+ 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
+ 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
+ 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
+ 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
+
+ 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
+ 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
+ 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
+ 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
+
+ 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
+ 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
+ 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
+ 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
+
+ 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
+ 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
+ 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
+ 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
+
+ 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
+ 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
+ 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
+ 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L
+ },
+
+ /* S[3] */
+ {
+ 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
+ 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
+ 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
+ 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
+
+ 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
+ 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
+ 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
+ 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
+
+ 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
+ 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
+ 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
+ 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
+
+ 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
+ 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
+ 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
+ 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
+
+ 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
+ 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
+ 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
+ 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
+
+ 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
+ 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
+ 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
+ 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
+
+ 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
+ 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
+ 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
+ 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
+
+ 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
+ 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
+ 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
+ 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
+
+ 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
+ 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
+ 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
+ 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
+
+ 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
+ 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
+ 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
+ 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
+
+ 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
+ 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
+ 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
+ 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
+
+ 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
+ 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
+ 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
+ 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
+
+ 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
+ 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
+ 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
+ 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
+
+ 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
+ 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
+ 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
+ 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
+
+ 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
+ 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
+ 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
+ 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
+
+ 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
+ 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
+ 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
+ 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L
+ }
+ },
+
+ /* P */
+ {
+ 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
+ 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
+ 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
+ 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
+ 0x9216D5D9L, 0x8979FB1BL
+ }
+};
+
+/*
+ * __rtl_cipherBF_init.
+ */
+static rtlCipherError __rtl_cipherBF_init (
+ CipherContextBF *ctx,
+ rtlCipherMode eMode,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen)
+{
+ CipherKeyBF *key;
+ sal_uInt32 D, DL, DR;
+ sal_uInt16 i, j, k;
+
+ key = &(ctx->m_key);
+
+ rtl_copyMemory (key, &__rtl_cipherBF_key, sizeof (CipherKeyBF));
+ rtl_zeroMemory (&(ctx->m_iv), sizeof(ctx->m_iv));
+ ctx->m_offset = 0;
+
+ for (i = 0, k = 0; i < CIPHER_ROUNDS_BF + 2; ++i)
+ {
+ D = 0;
+ for (j = 0; j < 4; ++j)
+ {
+ D = ((D << 8) | pKeyData[k]);
+ k++;
+ if (k >= nKeyLen)
+ k = 0;
+ }
+ key->m_P[i] ^= D;
+ }
+
+ DL = 0;
+ DR = 0;
+
+ for (i = 0; i < CIPHER_ROUNDS_BF + 2; i += 2)
+ {
+ __rtl_cipherBF_encode (key, &DL, &DR);
+ key->m_P[i ] = DL;
+ key->m_P[i + 1] = DR;
+ }
+
+ for (i = 0; i < 4; ++i)
+ {
+ for (k = 0; k < 256; k += 2)
+ {
+ __rtl_cipherBF_encode (key, &DL, &DR);
+ key->m_S[i][k ] = DL;
+ key->m_S[i][k + 1] = DR;
+ }
+ }
+
+ if (pArgData && nArgLen)
+ {
+ nArgLen = ((nArgLen < 8) ? nArgLen : 8);
+ if (eMode == rtl_Cipher_ModeStream)
+ {
+ rtl_copyMemory (ctx->m_iv.m_byte, pArgData, nArgLen);
+ }
+ else
+ {
+ RTL_CIPHER_NTOHL64 (pArgData, DL, DR, nArgLen);
+ ctx->m_iv.m_long[0] = DL;
+ ctx->m_iv.m_long[1] = DR;
+ }
+ }
+
+ D = DL = DR = 0;
+ return rtl_Cipher_E_None;
+}
+
+/*
+ * __rtl_cipherBF_update.
+ */
+static rtlCipherError __rtl_cipherBF_update (
+ CipherContextBF *ctx,
+ rtlCipherMode eMode,
+ rtlCipherDirection eDirection,
+ const sal_uInt8 *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ /* Check arguments. */
+ if ((pData == NULL) || (pBuffer == NULL))
+ return rtl_Cipher_E_Argument;
+
+ if (!((0 < nDatLen) && (nDatLen <= nBufLen)))
+ return rtl_Cipher_E_BufferSize;
+
+ /* Update. */
+ if (eMode == rtl_Cipher_ModeECB)
+ {
+ /* Block mode. */
+ while (nDatLen > 8)
+ {
+ __rtl_cipherBF_updateECB (ctx, eDirection, pData, pBuffer, 8);
+ nDatLen -= 8;
+ pData += 8;
+ pBuffer += 8;
+ }
+ __rtl_cipherBF_updateECB (ctx, eDirection, pData, pBuffer, nDatLen);
+ }
+ else if (eMode == rtl_Cipher_ModeCBC)
+ {
+ /* Block mode. */
+ while (nDatLen > 8)
+ {
+ __rtl_cipherBF_updateCBC (ctx, eDirection, pData, pBuffer, 8);
+ nDatLen -= 8;
+ pData += 8;
+ pBuffer += 8;
+ }
+ __rtl_cipherBF_updateCBC (ctx, eDirection, pData, pBuffer, nDatLen);
+ }
+ else
+ {
+ /* Stream mode. */
+ while (nDatLen > 0)
+ {
+ __rtl_cipherBF_updateCFB (ctx, eDirection, pData, pBuffer);
+ nDatLen -= 1;
+ pData += 1;
+ pBuffer += 1;
+ }
+ }
+ return rtl_Cipher_E_None;
+}
+
+/*
+ * __rtl_cipherBF_updateECB.
+ */
+static void __rtl_cipherBF_updateECB (
+ CipherContextBF *ctx,
+ rtlCipherDirection direction,
+ const sal_uInt8 *pData,
+ sal_uInt8 *pBuffer,
+ sal_Size nLength)
+{
+ CipherKeyBF *key;
+ sal_uInt32 DL, DR;
+
+ key = &(ctx->m_key);
+ if (direction == rtl_Cipher_DirectionEncode)
+ {
+ RTL_CIPHER_NTOHL64(pData, DL, DR, nLength);
+
+ __rtl_cipherBF_encode (key, &DL, &DR);
+
+ RTL_CIPHER_HTONL(DL, pBuffer);
+ RTL_CIPHER_HTONL(DR, pBuffer);
+ }
+ else
+ {
+ RTL_CIPHER_NTOHL(pData, DL);
+ RTL_CIPHER_NTOHL(pData, DR);
+
+ __rtl_cipherBF_decode (key, &DL, &DR);
+
+ RTL_CIPHER_HTONL64(DL, DR, pBuffer, nLength);
+ }
+ DL = DR = 0;
+}
+
+/*
+ * __rtl_cipherBF_updateCBC.
+ */
+static void __rtl_cipherBF_updateCBC (
+ CipherContextBF *ctx,
+ rtlCipherDirection direction,
+ const sal_uInt8 *pData,
+ sal_uInt8 *pBuffer,
+ sal_Size nLength)
+{
+ CipherKeyBF *key;
+ sal_uInt32 DL, DR;
+
+ key = &(ctx->m_key);
+ if (direction == rtl_Cipher_DirectionEncode)
+ {
+ RTL_CIPHER_NTOHL64(pData, DL, DR, nLength);
+
+ DL ^= ctx->m_iv.m_long[0];
+ DR ^= ctx->m_iv.m_long[1];
+
+ __rtl_cipherBF_encode (key, &DL, &DR);
+
+ ctx->m_iv.m_long[0] = DL;
+ ctx->m_iv.m_long[1] = DR;
+
+ RTL_CIPHER_HTONL(DL, pBuffer);
+ RTL_CIPHER_HTONL(DR, pBuffer);
+ }
+ else
+ {
+ sal_uInt32 IVL, IVR;
+
+ RTL_CIPHER_NTOHL(pData, DL);
+ RTL_CIPHER_NTOHL(pData, DR);
+
+ IVL = DL;
+ IVR = DR;
+
+ __rtl_cipherBF_decode (key, &DL, &DR);
+
+ DL ^= ctx->m_iv.m_long[0];
+ DR ^= ctx->m_iv.m_long[1];
+
+ ctx->m_iv.m_long[0] = IVL;
+ ctx->m_iv.m_long[1] = IVR;
+
+ RTL_CIPHER_HTONL64(DL, DR, pBuffer, nLength);
+ IVL = IVR = 0;
+ }
+ DL = DR = 0;
+}
+
+/*
+ * __rtl_cipherBF_updateCFB.
+ */
+static void __rtl_cipherBF_updateCFB (
+ CipherContextBF *ctx,
+ rtlCipherDirection direction,
+ const sal_uInt8 *pData,
+ sal_uInt8 *pBuffer)
+{
+ sal_uInt8 *iv;
+ sal_uInt32 k;
+
+ iv = ctx->m_iv.m_byte;
+ k = ctx->m_offset;
+
+ if (k == 0)
+ {
+ sal_uInt32 IVL, IVR;
+
+ RTL_CIPHER_NTOHL64(iv, IVL, IVR, 8);
+ __rtl_cipherBF_encode (&(ctx->m_key), &IVL, &IVR);
+ RTL_CIPHER_HTONL64(IVL, IVR, iv, 8);
+
+ IVL = IVR = 0;
+ }
+
+ if (direction == rtl_Cipher_DirectionEncode)
+ {
+ iv[k] ^= *pData;
+ *pBuffer = iv[k];
+ }
+ else
+ {
+ sal_uInt8 c = iv[k];
+ iv[k] = *pData;
+ *pBuffer = *pData ^ c;
+ c = 0;
+ }
+
+ ctx->m_offset = ((k + 1) & 0x07);
+ iv = NULL;
+}
+
+/*
+ * __rtl_cipherBF_encode.
+ */
+static void __rtl_cipherBF_encode (
+ CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr)
+{
+ sal_uInt32 t, XL, XR;
+ sal_uInt16 i;
+
+ XL = *xl;
+ XR = *xr;
+
+ for (i = 0; i < CIPHER_ROUNDS_BF; ++i)
+ {
+ XL ^= key->m_P[i];
+ XR ^= __rtl_cipherBF (key, XL);
+
+ t = XL;
+ XL = XR;
+ XR = t;
+ }
+
+ t = XL;
+ XL = XR;
+ XR = t;
+
+ XR ^= key->m_P[CIPHER_ROUNDS_BF ];
+ XL ^= key->m_P[CIPHER_ROUNDS_BF + 1];
+
+ *xl = XL;
+ *xr = XR;
+
+ t = XL = XR = 0;
+}
+
+/*
+ * __rtl_cipherBF_decode.
+ */
+static void __rtl_cipherBF_decode (
+ CipherKeyBF *key, sal_uInt32 *xl, sal_uInt32 *xr)
+{
+ sal_uInt32 t, XL, XR;
+ sal_uInt16 i;
+
+ XL = *xl;
+ XR = *xr;
+
+ for (i = CIPHER_ROUNDS_BF + 1; i > 1; --i)
+ {
+ XL ^= key->m_P[i];
+ XR ^= __rtl_cipherBF (key, XL);
+
+ t = XL;
+ XL = XR;
+ XR = t;
+ }
+
+ t = XL;
+ XL = XR;
+ XR = t;
+
+ XR ^= key->m_P[1];
+ XL ^= key->m_P[0];
+
+ *xl = XL;
+ *xr = XR;
+
+ t = XL = XR = 0;
+}
+
+/*
+ * __rtl_cipherBF.
+ */
+static sal_uInt32 __rtl_cipherBF (CipherKeyBF *key, sal_uInt32 x)
+{
+ sal_uInt16 a, b, c, d;
+ sal_uInt32 y;
+
+ d = (sal_uInt16)(x & 0x00ff);
+ x >>= 8;
+ c = (sal_uInt16)(x & 0x00ff);
+ x >>= 8;
+ b = (sal_uInt16)(x & 0x00ff);
+ x >>= 8;
+ a = (sal_uInt16)(x & 0x00ff);
+
+ y = key->m_S[0][a];
+ y += key->m_S[1][b];
+ y ^= key->m_S[2][c];
+ y += key->m_S[3][d];
+
+ return y;
+}
+
+/*========================================================================
+ *
+ * rtl_cipherBF (Blowfish) implementation.
+ *
+ * Reference:
+ * Bruce Schneier: Applied Cryptography, 2nd edition, ch. 14.3
+ *
+ *======================================================================*/
+/*
+ * rtl_cipher_createBF.
+ */
+rtlCipher SAL_CALL rtl_cipher_createBF (rtlCipherMode Mode)
+{
+ CipherBF_Impl *pImpl = (CipherBF_Impl*)NULL;
+
+ if (Mode == rtl_Cipher_ModeInvalid)
+ return ((rtlCipher)NULL);
+
+ pImpl = ((CipherBF_Impl*)rtl_allocateZeroMemory (sizeof (CipherBF_Impl)));
+ if (pImpl)
+ {
+ pImpl->m_cipher.m_algorithm = rtl_Cipher_AlgorithmBF;
+ pImpl->m_cipher.m_direction = rtl_Cipher_DirectionInvalid;
+ pImpl->m_cipher.m_mode = Mode;
+
+ pImpl->m_cipher.m_init = rtl_cipher_initBF;
+ pImpl->m_cipher.m_encode = rtl_cipher_encodeBF;
+ pImpl->m_cipher.m_decode = rtl_cipher_decodeBF;
+ pImpl->m_cipher.m_delete = rtl_cipher_destroyBF;
+ }
+ return ((rtlCipher)pImpl);
+}
+
+/*
+ * rtl_cipher_initBF.
+ */
+rtlCipherError SAL_CALL rtl_cipher_initBF (
+ rtlCipher Cipher,
+ rtlCipherDirection Direction,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen)
+{
+ CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher;
+
+ if ((pImpl == NULL) || (pKeyData == NULL))
+ return rtl_Cipher_E_Argument;
+
+ if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF))
+ return rtl_Cipher_E_Algorithm;
+
+ if (!(Direction == rtl_Cipher_DirectionInvalid))
+ pImpl->m_cipher.m_direction = Direction;
+ else
+ return rtl_Cipher_E_Direction;
+
+ return __rtl_cipherBF_init (
+ &(pImpl->m_context), pImpl->m_cipher.m_mode,
+ pKeyData, nKeyLen, pArgData, nArgLen);
+}
+
+/*
+ * rtl_cipher_encodeBF.
+ */
+rtlCipherError SAL_CALL rtl_cipher_encodeBF (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher;
+ if (pImpl == NULL)
+ return rtl_Cipher_E_Argument;
+
+ if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF))
+ return rtl_Cipher_E_Algorithm;
+
+ if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid)
+ return rtl_Cipher_E_Direction;
+ if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionDecode)
+ return rtl_Cipher_E_Direction;
+
+ return __rtl_cipherBF_update (
+ &(pImpl->m_context), pImpl->m_cipher.m_mode,
+ rtl_Cipher_DirectionEncode,
+ (const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen);
+}
+
+/*
+ * rtl_cipher_decodeBF.
+ */
+rtlCipherError SAL_CALL rtl_cipher_decodeBF (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher;
+ if (pImpl == NULL)
+ return rtl_Cipher_E_Argument;
+
+ if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF))
+ return rtl_Cipher_E_Algorithm;
+
+ if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid)
+ return rtl_Cipher_E_Direction;
+ if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionEncode)
+ return rtl_Cipher_E_Direction;
+
+ return __rtl_cipherBF_update (
+ &(pImpl->m_context), pImpl->m_cipher.m_mode,
+ rtl_Cipher_DirectionDecode,
+ (const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen);
+}
+
+/*
+ * rtl_cipher_destroyBF.
+ */
+void SAL_CALL rtl_cipher_destroyBF (rtlCipher Cipher)
+{
+ CipherBF_Impl *pImpl = (CipherBF_Impl*)Cipher;
+ if (pImpl)
+ {
+ if (pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmBF)
+ rtl_freeZeroMemory (pImpl, sizeof (CipherBF_Impl));
+ else
+ rtl_freeMemory (pImpl);
+ }
+}
+
+/*========================================================================
+ *
+ * rtl_cipher_ARCFOUR (RC4) internals.
+ *
+ *======================================================================*/
+#define CIPHER_CBLOCK_ARCFOUR 256
+
+typedef struct cipherARCFOUR_context_st
+{
+ unsigned int m_S[CIPHER_CBLOCK_ARCFOUR];
+ unsigned int m_X, m_Y;
+} ContextARCFOUR_Impl;
+
+typedef struct cipherARCFOUR_impl_st
+{
+ Cipher_Impl m_cipher;
+ ContextARCFOUR_Impl m_context;
+} CipherARCFOUR_Impl;
+
+/** rtl_cipherARCFOUR_update_Impl.
+ */
+static rtlCipherError rtl_cipherARCFOUR_update_Impl (
+ ContextARCFOUR_Impl *ctx,
+ const sal_uInt8 *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen);
+
+/*
+ * rtl_cipherARCFOUR_init_Impl.
+ */
+static rtlCipherError rtl_cipherARCFOUR_init_Impl (
+ ContextARCFOUR_Impl *ctx,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen)
+{
+ unsigned int K[CIPHER_CBLOCK_ARCFOUR];
+ unsigned int *L, *S;
+ unsigned int x, y, t;
+ sal_Size n, k;
+
+ S = &(ctx->m_S[0]);
+
+ /* Initialize S linearly. */
+ for (x = 0; x < CIPHER_CBLOCK_ARCFOUR; x++)
+ S[x] = x;
+
+ /* Initialize K with key, repeat key as necessary. */
+ for (L = K, n = CIPHER_CBLOCK_ARCFOUR; n > nKeyLen; n -= nKeyLen)
+ {
+ for (k = 0; k < nKeyLen; k++) L[k] = pKeyData[k];
+ L += nKeyLen;
+ }
+ for (k = 0; k < n; k++) L[k] = pKeyData[k];
+
+ /* Initialize S with K. */
+ for (x = 0, y = 0; x < CIPHER_CBLOCK_ARCFOUR; x++)
+ {
+ y = (y + S[x] + K[x]) % CIPHER_CBLOCK_ARCFOUR;
+ t = S[x], S[x] = S[y], S[y] = t; /* swap S[x] and S[y] */
+ }
+
+ /* Initialize counters X and Y. */
+ ctx->m_X = 0;
+ ctx->m_Y = 0;
+
+ return rtl_Cipher_E_None;
+}
+
+/*
+ * rtl_cipherARCFOUR_update_Impl.
+ */
+static rtlCipherError rtl_cipherARCFOUR_update_Impl (
+ ContextARCFOUR_Impl *ctx,
+ const sal_uInt8 *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ register unsigned int *S;
+ register unsigned int x, y, t;
+ sal_Size k;
+
+ /* Check arguments. */
+ if ((pData == NULL) || (pBuffer == NULL))
+ return rtl_Cipher_E_Argument;
+
+ if (!((0 < nDatLen) && (nDatLen <= nBufLen)))
+ return rtl_Cipher_E_BufferSize;
+
+ /* Update. */
+ S = &(ctx->m_S[0]);
+ for (k = 0; k < nDatLen; k++)
+ {
+ /* Update counters X and Y. */
+ x = ctx->m_X;
+ y = ctx->m_Y;
+ x = (x + 1 ) % CIPHER_CBLOCK_ARCFOUR;
+ y = (y + S[x]) % CIPHER_CBLOCK_ARCFOUR;
+ ctx->m_X = x;
+ ctx->m_Y = y;
+
+ /* Swap S[x] and S[y]. */
+ t = S[x], S[x] = S[y], S[y] = t;
+
+ /* Evaluate next key byte S[t]. */
+ t = (S[x] + S[y]) % CIPHER_CBLOCK_ARCFOUR;
+ pBuffer[k] = pData[k] ^ ((sal_uInt8)(S[t] & 0xff));
+ }
+
+ return rtl_Cipher_E_None;
+}
+
+/*========================================================================
+ *
+ * rtl_cipher_ARCFOUR (RC4) implementation.
+ *
+ * Reference:
+ * Bruce Schneier: Applied Cryptography, 2nd edition, ch. 17.1
+ *
+ *======================================================================*/
+/*
+ * rtl_cipher_createARCFOUR.
+ */
+rtlCipher SAL_CALL rtl_cipher_createARCFOUR (rtlCipherMode Mode)
+{
+ CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)NULL;
+
+ if (!(Mode == rtl_Cipher_ModeStream))
+ return ((rtlCipher)NULL);
+
+ pImpl = ((CipherARCFOUR_Impl*)rtl_allocateZeroMemory (sizeof (CipherARCFOUR_Impl)));
+ if (pImpl)
+ {
+ pImpl->m_cipher.m_algorithm = rtl_Cipher_AlgorithmARCFOUR;
+ pImpl->m_cipher.m_direction = rtl_Cipher_DirectionInvalid;
+ pImpl->m_cipher.m_mode = rtl_Cipher_ModeStream;
+
+ pImpl->m_cipher.m_init = rtl_cipher_initARCFOUR;
+ pImpl->m_cipher.m_encode = rtl_cipher_encodeARCFOUR;
+ pImpl->m_cipher.m_decode = rtl_cipher_decodeARCFOUR;
+ pImpl->m_cipher.m_delete = rtl_cipher_destroyARCFOUR;
+ }
+ return ((rtlCipher)pImpl);
+}
+
+/*
+ * rtl_cipher_initARCFOUR.
+ */
+rtlCipherError SAL_CALL rtl_cipher_initARCFOUR (
+ rtlCipher Cipher,
+ rtlCipherDirection Direction,
+ const sal_uInt8 *pKeyData, sal_Size nKeyLen,
+ const sal_uInt8 *pArgData, sal_Size nArgLen)
+{
+ CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher;
+ (void) pArgData; // avoid warning
+ (void) nArgLen; // avoid warning
+
+ if ((pImpl == NULL) || (pKeyData == NULL))
+ return rtl_Cipher_E_Argument;
+
+ if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR))
+ return rtl_Cipher_E_Algorithm;
+
+ if (!(Direction == rtl_Cipher_DirectionInvalid))
+ pImpl->m_cipher.m_direction = Direction;
+ else
+ return rtl_Cipher_E_Direction;
+
+ return rtl_cipherARCFOUR_init_Impl (&(pImpl->m_context), pKeyData, nKeyLen);
+}
+
+/*
+ * rtl_cipher_encodeARCFOUR.
+ */
+rtlCipherError SAL_CALL rtl_cipher_encodeARCFOUR (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher;
+ if (pImpl == NULL)
+ return rtl_Cipher_E_Argument;
+
+ if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR))
+ return rtl_Cipher_E_Algorithm;
+
+ if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid)
+ return rtl_Cipher_E_Direction;
+
+ return rtl_cipherARCFOUR_update_Impl (
+ &(pImpl->m_context),
+ (const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen);
+}
+
+/*
+ * rtl_cipher_decodeARCFOUR.
+ */
+rtlCipherError SAL_CALL rtl_cipher_decodeARCFOUR (
+ rtlCipher Cipher,
+ const void *pData, sal_Size nDatLen,
+ sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher;
+ if (pImpl == NULL)
+ return rtl_Cipher_E_Argument;
+
+ if (!(pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR))
+ return rtl_Cipher_E_Algorithm;
+
+ if (pImpl->m_cipher.m_direction == rtl_Cipher_DirectionInvalid)
+ return rtl_Cipher_E_Direction;
+
+ return rtl_cipherARCFOUR_update_Impl (
+ &(pImpl->m_context),
+ (const sal_uInt8*)pData, nDatLen, pBuffer, nBufLen);
+}
+
+/*
+ * rtl_cipher_destroyARCFOUR.
+ */
+void SAL_CALL rtl_cipher_destroyARCFOUR (rtlCipher Cipher)
+{
+ CipherARCFOUR_Impl *pImpl = (CipherARCFOUR_Impl*)Cipher;
+ if (pImpl)
+ {
+ if (pImpl->m_cipher.m_algorithm == rtl_Cipher_AlgorithmARCFOUR)
+ rtl_freeZeroMemory (pImpl, sizeof (CipherARCFOUR_Impl));
+ else
+ rtl_freeMemory (pImpl);
+ }
+}
diff --git a/sal/rtl/source/cmdargs.cxx b/sal/rtl/source/cmdargs.cxx
new file mode 100644
index 000000000000..dc14cf59d031
--- /dev/null
+++ b/sal/rtl/source/cmdargs.cxx
@@ -0,0 +1,109 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <osl/mutex.hxx>
+#include <rtl/process.h>
+#include <rtl/ustring.hxx>
+
+namespace {
+
+rtl_uString ** g_ppCommandArgs = 0;
+sal_uInt32 g_nCommandArgCount = 0;
+
+struct ArgHolder
+{
+ ~ArgHolder();
+};
+
+ArgHolder::~ArgHolder()
+{
+ while (g_nCommandArgCount > 0)
+ rtl_uString_release (g_ppCommandArgs[--g_nCommandArgCount]);
+
+ rtl_freeMemory (g_ppCommandArgs);
+ g_ppCommandArgs = 0;
+}
+
+// The destructor of this static ArgHolder is "activated" by the assignments to
+// g_ppCommandArgs and g_nCommandArgCount in init():
+ArgHolder argHolder;
+
+void init()
+{
+ osl::MutexGuard guard( osl::Mutex::getGlobalMutex() );
+ if (!g_ppCommandArgs)
+ {
+ sal_Int32 i, n = osl_getCommandArgCount();
+
+ g_ppCommandArgs =
+ (rtl_uString**)rtl_allocateZeroMemory (n * sizeof(rtl_uString*));
+ for (i = 0; i < n; i++)
+ {
+ rtl_uString * pArg = 0;
+ osl_getCommandArg (i, &pArg);
+ if (('-' == pArg->buffer[0] || '/' == pArg->buffer[0]) &&
+ 'e' == pArg->buffer[1] &&
+ 'n' == pArg->buffer[2] &&
+ 'v' == pArg->buffer[3] &&
+ ':' == pArg->buffer[4] &&
+ rtl_ustr_indexOfChar (&(pArg->buffer[5]), '=') >= 0 )
+ {
+ // ignore.
+ rtl_uString_release (pArg);
+ }
+ else
+ {
+ // assign.
+ g_ppCommandArgs[g_nCommandArgCount++] = pArg;
+ }
+ }
+ }
+}
+
+}
+
+oslProcessError SAL_CALL rtl_getAppCommandArg (
+ sal_uInt32 nArg, rtl_uString **ppCommandArg)
+{
+ init();
+ oslProcessError result = osl_Process_E_NotFound;
+ if( nArg < g_nCommandArgCount )
+ {
+ rtl_uString_assign( ppCommandArg, g_ppCommandArgs[nArg] );
+ result = osl_Process_E_None;
+ }
+ return (result);
+}
+
+sal_uInt32 SAL_CALL rtl_getAppCommandArgCount (void)
+{
+ init();
+ return g_nCommandArgCount;
+}
diff --git a/sal/rtl/source/crc.c b/sal/rtl/source/crc.c
new file mode 100644
index 000000000000..d8fd53c3b330
--- /dev/null
+++ b/sal/rtl/source/crc.c
@@ -0,0 +1,164 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define _RTL_CRC_C_ "$Revision: 1.3 $"
+
+#include <sal/types.h>
+#include <rtl/crc.h>
+
+/*========================================================================
+ *
+ * rtl_crc32Table (CRC polynomial 0xEDB88320).
+ *
+ *======================================================================*/
+static const sal_uInt32 rtl_crc32Table[256] =
+{
+ /* 0 */
+ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
+ 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
+ 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
+ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
+
+ /* 1 */
+ 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
+ 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
+ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
+ 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
+
+ /* 2 */
+ 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
+ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
+ 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
+ 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
+
+ /* 3 */
+ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
+ 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
+ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
+ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
+
+ /* 4 */
+ 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
+ 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
+ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
+ 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
+
+ /* 5 */
+ 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
+ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
+ 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
+ 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
+
+ /* 6 */
+ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
+ 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
+ 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
+ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
+
+ /* 7 */
+ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
+ 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
+ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
+ 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
+
+ /* 8 */
+ 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
+ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
+ 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
+ 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
+
+ /* 9 */
+ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
+ 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
+ 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
+ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
+
+ /* A */
+ 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
+ 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
+ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
+ 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
+
+ /* B */
+ 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
+ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
+ 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
+ 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
+
+ /* C */
+ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
+ 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
+ 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
+ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
+
+ /* D */
+ 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
+ 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
+ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
+ 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
+
+ /* E */
+ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
+ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
+ 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
+ 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
+
+ /* F */
+ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
+ 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
+ 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
+ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
+};
+
+/*========================================================================
+ *
+ * rtl_crc32 implementation.
+ *
+ *======================================================================*/
+#define UPDCRC32(crc, octet) \
+ (rtl_crc32Table[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
+
+/*
+ * rtl_crc32.
+ */
+sal_uInt32 SAL_CALL rtl_crc32 (
+ sal_uInt32 Crc,
+ const void *Data, sal_uInt32 DatLen)
+{
+ if (Data)
+ {
+ register const sal_uInt8 *p = (const sal_uInt8 *)Data;
+ register const sal_uInt8 *q = p + DatLen;
+
+ Crc = ~Crc;
+ while (p < q)
+ Crc = UPDCRC32(Crc, *(p++));
+ Crc = ~Crc;
+ }
+ return Crc;
+}
+
diff --git a/sal/rtl/source/debugprint.cxx b/sal/rtl/source/debugprint.cxx
new file mode 100644
index 000000000000..9b86ca077446
--- /dev/null
+++ b/sal/rtl/source/debugprint.cxx
@@ -0,0 +1,58 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <rtl/strbuf.hxx>
+#include <rtl/ustring.hxx>
+
+const sal_Char *dbg_dump(const rtl::OString &rStr)
+{
+ static rtl::OStringBuffer aStr;
+
+ aStr = rtl::OStringBuffer(rStr);
+ aStr.append(static_cast<char>(0));
+ return aStr.getStr();
+}
+
+const sal_Char *dbg_dump(const rtl::OUString &rStr)
+{
+ return dbg_dump(rtl::OUStringToOString(rStr, RTL_TEXTENCODING_UTF8));
+}
+
+const sal_Char *dbg_dump(rtl_String *pStr)
+{
+ return dbg_dump(rtl::OString(pStr));
+}
+
+const sal_Char *dbg_dump(rtl_uString *pStr)
+{
+ return dbg_dump(rtl::OUString(pStr));
+}
+
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/sal/rtl/source/digest.c b/sal/rtl/source/digest.c
new file mode 100644
index 000000000000..1d07fdbdc167
--- /dev/null
+++ b/sal/rtl/source/digest.c
@@ -0,0 +1,2118 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define _RTL_DIGEST_C_ "$Revision: 1.9 $"
+
+#include <sal/types.h>
+#include <sal/macros.h>
+#include <osl/endian.h>
+#include <rtl/alloc.h>
+#include <rtl/memory.h>
+#include <rtl/digest.h>
+
+/*========================================================================
+ *
+ * rtlDigest internals.
+ *
+ *======================================================================*/
+#define RTL_DIGEST_CREATE(T) ((T*)(rtl_allocateZeroMemory(sizeof(T))))
+
+#define RTL_DIGEST_ROTL(a,n) (((a) << (n)) | ((a) >> (32 - (n))))
+
+#define RTL_DIGEST_HTONL(l,c) \
+ (*((c)++) = (sal_uInt8)(((l) >> 24L) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) >> 16L) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) >> 8L) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) ) & 0xff))
+
+#define RTL_DIGEST_LTOC(l,c) \
+ (*((c)++) = (sal_uInt8)(((l) ) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) >> 8L) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) >> 16L) & 0xff), \
+ *((c)++) = (sal_uInt8)(((l) >> 24L) & 0xff))
+
+typedef rtlDigestError (SAL_CALL Digest_init_t) (
+ void *ctx, const sal_uInt8 *Data, sal_uInt32 DatLen);
+
+typedef void (SAL_CALL Digest_delete_t) (void *ctx);
+
+typedef rtlDigestError (SAL_CALL Digest_update_t) (
+ void *ctx, const void *Data, sal_uInt32 DatLen);
+
+typedef rtlDigestError (SAL_CALL Digest_get_t) (
+ void *ctx, sal_uInt8 *Buffer, sal_uInt32 BufLen);
+
+typedef struct digest_impl_st
+{
+ rtlDigestAlgorithm m_algorithm;
+ sal_uInt32 m_length;
+
+ Digest_init_t *m_init;
+ Digest_delete_t *m_delete;
+ Digest_update_t *m_update;
+ Digest_get_t *m_get;
+} Digest_Impl;
+
+/*
+ * __rtl_digest_swapLong.
+ */
+static void __rtl_digest_swapLong (sal_uInt32 *pData, sal_uInt32 nDatLen)
+{
+ register sal_uInt32 *X;
+ register int i, n;
+
+ X = pData;
+ n = nDatLen;
+
+ for (i = 0; i < n; i++)
+ X[i] = OSL_SWAPDWORD(X[i]);
+}
+
+/*========================================================================
+ *
+ * rtlDigest implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_digest_create.
+ */
+rtlDigest SAL_CALL rtl_digest_create (rtlDigestAlgorithm Algorithm)
+{
+ rtlDigest Digest = (rtlDigest)NULL;
+ switch (Algorithm)
+ {
+ case rtl_Digest_AlgorithmMD2:
+ Digest = rtl_digest_createMD2();
+ break;
+
+ case rtl_Digest_AlgorithmMD5:
+ Digest = rtl_digest_createMD5();
+ break;
+
+ case rtl_Digest_AlgorithmSHA:
+ Digest = rtl_digest_createSHA();
+ break;
+
+ case rtl_Digest_AlgorithmSHA1:
+ Digest = rtl_digest_createSHA1();
+ break;
+
+ case rtl_Digest_AlgorithmHMAC_MD5:
+ Digest = rtl_digest_createHMAC_MD5();
+ break;
+
+ case rtl_Digest_AlgorithmHMAC_SHA1:
+ Digest = rtl_digest_createHMAC_SHA1();
+ break;
+
+ default: /* rtl_Digest_AlgorithmInvalid */
+ break;
+ }
+ return Digest;
+}
+
+/*
+ * rtl_digest_queryAlgorithm.
+ */
+rtlDigestAlgorithm SAL_CALL rtl_digest_queryAlgorithm (rtlDigest Digest)
+{
+ Digest_Impl *pImpl = (Digest_Impl *)Digest;
+ if (pImpl)
+ return pImpl->m_algorithm;
+ else
+ return rtl_Digest_AlgorithmInvalid;
+}
+
+/*
+ * rtl_digest_queryLength.
+ */
+sal_uInt32 SAL_CALL rtl_digest_queryLength (rtlDigest Digest)
+{
+ Digest_Impl *pImpl = (Digest_Impl *)Digest;
+ if (pImpl)
+ return pImpl->m_length;
+ else
+ return 0;
+}
+
+/*
+ * rtl_digest_init.
+ */
+rtlDigestError SAL_CALL rtl_digest_init (
+ rtlDigest Digest, const sal_uInt8 *pData, sal_uInt32 nDatLen)
+{
+ Digest_Impl *pImpl = (Digest_Impl *)Digest;
+ if (pImpl)
+ {
+ if (pImpl->m_init)
+ return pImpl->m_init (Digest, pData, nDatLen);
+ else
+ return rtl_Digest_E_None;
+ }
+ return rtl_Digest_E_Argument;
+}
+
+/*
+ * rtl_digest_update.
+ */
+rtlDigestError SAL_CALL rtl_digest_update (
+ rtlDigest Digest, const void *pData, sal_uInt32 nDatLen)
+{
+ Digest_Impl *pImpl = (Digest_Impl *)Digest;
+ if (pImpl && pImpl->m_update)
+ return pImpl->m_update (Digest, pData, nDatLen);
+ else
+ return rtl_Digest_E_Argument;
+}
+
+/*
+ * rtl_digest_get.
+ */
+rtlDigestError SAL_CALL rtl_digest_get (
+ rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ Digest_Impl *pImpl = (Digest_Impl *)Digest;
+ if (pImpl && pImpl->m_get)
+ return pImpl->m_get (Digest, pBuffer, nBufLen);
+ else
+ return rtl_Digest_E_Argument;
+}
+
+/*
+ * rtl_digest_destroy.
+ */
+void SAL_CALL rtl_digest_destroy (rtlDigest Digest)
+{
+ Digest_Impl *pImpl = (Digest_Impl *)Digest;
+ if (pImpl && pImpl->m_delete)
+ pImpl->m_delete (Digest);
+}
+
+/*========================================================================
+ *
+ * rtl_digest_MD2 internals.
+ *
+ *======================================================================*/
+#define DIGEST_CBLOCK_MD2 16
+#define DIGEST_LBLOCK_MD2 16
+
+typedef struct digestMD2_context_st
+{
+ sal_uInt32 m_nDatLen;
+ sal_uInt8 m_pData[DIGEST_CBLOCK_MD2];
+ sal_uInt32 m_state[DIGEST_LBLOCK_MD2];
+ sal_uInt32 m_chksum[DIGEST_LBLOCK_MD2];
+} DigestContextMD2;
+
+typedef struct digestMD2_impl_st
+{
+ Digest_Impl m_digest;
+ DigestContextMD2 m_context;
+} DigestMD2_Impl;
+
+static void __rtl_digest_initMD2 (DigestContextMD2 *ctx);
+static void __rtl_digest_updateMD2 (DigestContextMD2 *ctx);
+static void __rtl_digest_endMD2 (DigestContextMD2 *ctx);
+
+static const sal_uInt32 S[256] =
+{
+ 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01,
+ 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13,
+ 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C,
+ 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA,
+ 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
+ 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
+ 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49,
+ 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A,
+ 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F,
+ 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
+ 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27,
+ 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
+ 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1,
+ 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6,
+ 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
+ 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1,
+ 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20,
+ 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
+ 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6,
+ 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
+ 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A,
+ 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26,
+ 0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09,
+ 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
+ 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
+ 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A,
+ 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D,
+ 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39,
+ 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4,
+ 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
+ 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A,
+ 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14,
+};
+
+/*
+ * __rtl_digest_MD2.
+ */
+static const Digest_Impl __rtl_digest_MD2 =
+{
+ rtl_Digest_AlgorithmMD2,
+ RTL_DIGEST_LENGTH_MD2,
+
+ NULL,
+ rtl_digest_destroyMD2,
+ rtl_digest_updateMD2,
+ rtl_digest_getMD2
+};
+
+/*
+ * __rtl_digest_initMD2.
+ */
+static void __rtl_digest_initMD2 (DigestContextMD2 *ctx)
+{
+ rtl_zeroMemory (ctx, sizeof (DigestContextMD2));
+}
+
+/*
+ * __rtl_digest_updateMD2.
+ */
+static void __rtl_digest_updateMD2 (DigestContextMD2 *ctx)
+{
+ register sal_uInt8 *X;
+ register sal_uInt32 *sp1, *sp2;
+ register sal_uInt32 i, k, t;
+
+ sal_uInt32 state[48];
+
+ X = ctx->m_pData;
+ sp1 = ctx->m_state;
+ sp2 = ctx->m_chksum;
+
+ k = sp2[DIGEST_LBLOCK_MD2 - 1];
+ for (i = 0; i < 16; i++)
+ {
+ state[i + 0] = sp1[i];
+ state[i + 16] = t = X[i];
+ state[i + 32] = t ^ sp1[i];
+ k = sp2[i] ^= S[t^k];
+ }
+
+ t = 0;
+ for (i = 0; i < 18; i++)
+ {
+ for (k = 0; k < 48; k += 8)
+ {
+ t = state[k + 0] ^= S[t];
+ t = state[k + 1] ^= S[t];
+ t = state[k + 2] ^= S[t];
+ t = state[k + 3] ^= S[t];
+ t = state[k + 4] ^= S[t];
+ t = state[k + 5] ^= S[t];
+ t = state[k + 6] ^= S[t];
+ t = state[k + 7] ^= S[t];
+ }
+ t = ((t + i) & 0xff);
+ }
+
+ rtl_copyMemory (sp1, state, 16 * sizeof(sal_uInt32));
+ rtl_zeroMemory (state, 48 * sizeof(sal_uInt32));
+}
+
+/*
+ * __rtl_digest_endMD2.
+ */
+static void __rtl_digest_endMD2 (DigestContextMD2 *ctx)
+{
+ register sal_uInt8 *X;
+ register sal_uInt32 *C;
+ sal_uInt32 i, n;
+
+ X = ctx->m_pData;
+ C = ctx->m_chksum;
+ n = DIGEST_CBLOCK_MD2 - ctx->m_nDatLen;
+
+ for (i = ctx->m_nDatLen; i < DIGEST_CBLOCK_MD2; i++)
+ X[i] = (sal_uInt8)(n & 0xff);
+ __rtl_digest_updateMD2 (ctx);
+
+ for (i = 0; i < DIGEST_CBLOCK_MD2; i++)
+ X[i] = (sal_uInt8)(C[i] & 0xff);
+ __rtl_digest_updateMD2 (ctx);
+}
+
+/*========================================================================
+ *
+ * rtl_digest_MD2 implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_digest_MD2.
+ */
+rtlDigestError SAL_CALL rtl_digest_MD2 (
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestMD2_Impl digest;
+ rtlDigestError result;
+
+ digest.m_digest = __rtl_digest_MD2;
+ __rtl_digest_initMD2 (&(digest.m_context));
+
+ result = rtl_digest_updateMD2 (&digest, pData, nDatLen);
+ if (result == rtl_Digest_E_None)
+ result = rtl_digest_getMD2 (&digest, pBuffer, nBufLen);
+
+ rtl_zeroMemory (&digest, sizeof (digest));
+ return (result);
+}
+
+/*
+ * rtl_digest_createMD2.
+ */
+rtlDigest SAL_CALL rtl_digest_createMD2 (void)
+{
+ DigestMD2_Impl *pImpl = (DigestMD2_Impl*)NULL;
+ pImpl = RTL_DIGEST_CREATE(DigestMD2_Impl);
+ if (pImpl)
+ {
+ pImpl->m_digest = __rtl_digest_MD2;
+ __rtl_digest_initMD2 (&(pImpl->m_context));
+ }
+ return ((rtlDigest)pImpl);
+}
+
+/*
+ * rtl_digest_updateMD2.
+ */
+rtlDigestError SAL_CALL rtl_digest_updateMD2 (
+ rtlDigest Digest, const void *pData, sal_uInt32 nDatLen)
+{
+ DigestMD2_Impl *pImpl = (DigestMD2_Impl *)Digest;
+ const sal_uInt8 *d = (const sal_uInt8 *)pData;
+
+ DigestContextMD2 *ctx;
+
+ if ((pImpl == NULL) || (pData == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD2))
+ return rtl_Digest_E_Algorithm;
+
+ if (nDatLen == 0)
+ return rtl_Digest_E_None;
+
+ ctx = &(pImpl->m_context);
+
+ if (ctx->m_nDatLen)
+ {
+ sal_uInt8 *p = ctx->m_pData + ctx->m_nDatLen;
+ sal_uInt32 n = DIGEST_CBLOCK_MD2 - ctx->m_nDatLen;
+
+ if (nDatLen < n)
+ {
+ rtl_copyMemory (p, d, nDatLen);
+ ctx->m_nDatLen += nDatLen;
+
+ return rtl_Digest_E_None;
+ }
+
+ rtl_copyMemory (p, d, n);
+ d += n;
+ nDatLen -= n;
+
+ __rtl_digest_updateMD2 (ctx);
+ ctx->m_nDatLen = 0;
+ }
+
+ while (nDatLen >= DIGEST_CBLOCK_MD2)
+ {
+ rtl_copyMemory (ctx->m_pData, d, DIGEST_CBLOCK_MD2);
+ d += DIGEST_CBLOCK_MD2;
+ nDatLen -= DIGEST_CBLOCK_MD2;
+
+ __rtl_digest_updateMD2 (ctx);
+ }
+
+ rtl_copyMemory (ctx->m_pData, d, nDatLen);
+ ctx->m_nDatLen = nDatLen;
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_getMD2.
+ */
+rtlDigestError SAL_CALL rtl_digest_getMD2 (
+ rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestMD2_Impl *pImpl = (DigestMD2_Impl *)Digest;
+ sal_uInt32 i;
+
+ DigestContextMD2 *ctx;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD2))
+ return rtl_Digest_E_Algorithm;
+
+ if (!(pImpl->m_digest.m_length <= nBufLen))
+ return rtl_Digest_E_BufferSize;
+
+ ctx = &(pImpl->m_context);
+
+ __rtl_digest_endMD2 (ctx);
+ for (i = 0; i < DIGEST_CBLOCK_MD2; i++)
+ pBuffer[i] = (sal_uInt8)(ctx->m_state[i] & 0xff);
+ __rtl_digest_initMD2 (ctx);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_destroyMD2.
+ */
+void SAL_CALL rtl_digest_destroyMD2 (rtlDigest Digest)
+{
+ DigestMD2_Impl *pImpl = (DigestMD2_Impl *)Digest;
+ if (pImpl)
+ {
+ if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD2)
+ rtl_freeZeroMemory (pImpl, sizeof (DigestMD2_Impl));
+ else
+ rtl_freeMemory (pImpl);
+ }
+}
+
+/*========================================================================
+ *
+ * rtl_digest_MD5 internals.
+ *
+ *======================================================================*/
+#define DIGEST_CBLOCK_MD5 64
+#define DIGEST_LBLOCK_MD5 16
+
+typedef struct digestMD5_context_st
+{
+ sal_uInt32 m_nDatLen;
+ sal_uInt32 m_pData[DIGEST_LBLOCK_MD5];
+ sal_uInt32 m_nA, m_nB, m_nC, m_nD;
+ sal_uInt32 m_nL, m_nH;
+} DigestContextMD5;
+
+typedef struct digestMD5_impl_st
+{
+ Digest_Impl m_digest;
+ DigestContextMD5 m_context;
+} DigestMD5_Impl;
+
+static void __rtl_digest_initMD5 (DigestContextMD5 *ctx);
+static void __rtl_digest_updateMD5 (DigestContextMD5 *ctx);
+static void __rtl_digest_endMD5 (DigestContextMD5 *ctx);
+
+#define F(x,y,z) ((((y) ^ (z)) & (x)) ^ (z))
+#define G(x,y,z) ((((x) ^ (y)) & (z)) ^ (y))
+#define H(x,y,z) ((x) ^ (y) ^ (z))
+#define I(x,y,z) (((x) | (~(z))) ^ (y))
+
+#define R0(a,b,c,d,k,s,t) { \
+ a += ((k) + (t) + F((b), (c), (d))); \
+ a = RTL_DIGEST_ROTL(a, s); \
+ a += b; }
+
+#define R1(a,b,c,d,k,s,t) { \
+ a += ((k) + (t) + G((b), (c), (d))); \
+ a = RTL_DIGEST_ROTL(a, s); \
+ a += b; }
+
+#define R2(a,b,c,d,k,s,t) { \
+ a += ((k) + (t) + H((b), (c), (d))); \
+ a = RTL_DIGEST_ROTL(a, s); \
+ a += b; }
+
+#define R3(a,b,c,d,k,s,t) { \
+ a += ((k) + (t) + I((b), (c), (d))); \
+ a = RTL_DIGEST_ROTL(a, s); \
+ a += b; }
+
+/*
+ * __rtl_digest_MD5.
+ */
+static const Digest_Impl __rtl_digest_MD5 =
+{
+ rtl_Digest_AlgorithmMD5,
+ RTL_DIGEST_LENGTH_MD5,
+
+ NULL,
+ rtl_digest_destroyMD5,
+ rtl_digest_updateMD5,
+ rtl_digest_getMD5
+};
+
+/*
+ * __rtl_digest_initMD5.
+ */
+static void __rtl_digest_initMD5 (DigestContextMD5 *ctx)
+{
+ rtl_zeroMemory (ctx, sizeof (DigestContextMD5));
+
+ ctx->m_nA = (sal_uInt32)0x67452301L;
+ ctx->m_nB = (sal_uInt32)0xefcdab89L;
+ ctx->m_nC = (sal_uInt32)0x98badcfeL;
+ ctx->m_nD = (sal_uInt32)0x10325476L;
+}
+
+/*
+ * __rtl_digest_updateMD5.
+ */
+static void __rtl_digest_updateMD5 (DigestContextMD5 *ctx)
+{
+ register sal_uInt32 A, B, C, D;
+ register sal_uInt32 *X;
+
+ A = ctx->m_nA;
+ B = ctx->m_nB;
+ C = ctx->m_nC;
+ D = ctx->m_nD;
+ X = ctx->m_pData;
+
+ R0 (A, B, C, D, X[ 0], 7, 0xd76aa478L);
+ R0 (D, A, B, C, X[ 1], 12, 0xe8c7b756L);
+ R0 (C, D, A, B, X[ 2], 17, 0x242070dbL);
+ R0 (B, C, D, A, X[ 3], 22, 0xc1bdceeeL);
+ R0 (A, B, C, D, X[ 4], 7, 0xf57c0fafL);
+ R0 (D, A, B, C, X[ 5], 12, 0x4787c62aL);
+ R0 (C, D, A, B, X[ 6], 17, 0xa8304613L);
+ R0 (B, C, D, A, X[ 7], 22, 0xfd469501L);
+ R0 (A, B, C, D, X[ 8], 7, 0x698098d8L);
+ R0 (D, A, B, C, X[ 9], 12, 0x8b44f7afL);
+ R0 (C, D, A, B, X[10], 17, 0xffff5bb1L);
+ R0 (B, C, D, A, X[11], 22, 0x895cd7beL);
+ R0 (A, B, C, D, X[12], 7, 0x6b901122L);
+ R0 (D, A, B, C, X[13], 12, 0xfd987193L);
+ R0 (C, D, A, B, X[14], 17, 0xa679438eL);
+ R0 (B, C, D, A, X[15], 22, 0x49b40821L);
+
+ R1 (A, B, C, D, X[ 1], 5, 0xf61e2562L);
+ R1 (D, A, B, C, X[ 6], 9, 0xc040b340L);
+ R1 (C, D, A, B, X[11], 14, 0x265e5a51L);
+ R1 (B, C, D, A, X[ 0], 20, 0xe9b6c7aaL);
+ R1 (A, B, C, D, X[ 5], 5, 0xd62f105dL);
+ R1 (D, A, B, C, X[10], 9, 0x02441453L);
+ R1 (C, D, A, B, X[15], 14, 0xd8a1e681L);
+ R1 (B, C, D, A, X[ 4], 20, 0xe7d3fbc8L);
+ R1 (A, B, C, D, X[ 9], 5, 0x21e1cde6L);
+ R1 (D, A, B, C, X[14], 9, 0xc33707d6L);
+ R1 (C, D, A, B, X[ 3], 14, 0xf4d50d87L);
+ R1 (B, C, D, A, X[ 8], 20, 0x455a14edL);
+ R1 (A, B, C, D, X[13], 5, 0xa9e3e905L);
+ R1 (D, A, B, C, X[ 2], 9, 0xfcefa3f8L);
+ R1 (C, D, A, B, X[ 7], 14, 0x676f02d9L);
+ R1 (B, C, D, A, X[12], 20, 0x8d2a4c8aL);
+
+ R2 (A, B, C, D, X[ 5], 4, 0xfffa3942L);
+ R2 (D, A, B, C, X[ 8], 11, 0x8771f681L);
+ R2 (C, D, A, B, X[11], 16, 0x6d9d6122L);
+ R2 (B, C, D, A, X[14], 23, 0xfde5380cL);
+ R2 (A, B, C, D, X[ 1], 4, 0xa4beea44L);
+ R2 (D, A, B, C, X[ 4], 11, 0x4bdecfa9L);
+ R2 (C, D, A, B, X[ 7], 16, 0xf6bb4b60L);
+ R2 (B, C, D, A, X[10], 23, 0xbebfbc70L);
+ R2 (A, B, C, D, X[13], 4, 0x289b7ec6L);
+ R2 (D, A, B, C, X[ 0], 11, 0xeaa127faL);
+ R2 (C, D, A, B, X[ 3], 16, 0xd4ef3085L);
+ R2 (B, C, D, A, X[ 6], 23, 0x04881d05L);
+ R2 (A, B, C, D, X[ 9], 4, 0xd9d4d039L);
+ R2 (D, A, B, C, X[12], 11, 0xe6db99e5L);
+ R2 (C, D, A, B, X[15], 16, 0x1fa27cf8L);
+ R2 (B, C, D, A, X[ 2], 23, 0xc4ac5665L);
+
+ R3 (A, B, C, D, X[ 0], 6, 0xf4292244L);
+ R3 (D, A, B, C, X[ 7], 10, 0x432aff97L);
+ R3 (C, D, A, B, X[14], 15, 0xab9423a7L);
+ R3 (B, C, D, A, X[ 5], 21, 0xfc93a039L);
+ R3 (A, B, C, D, X[12], 6, 0x655b59c3L);
+ R3 (D, A, B, C, X[ 3], 10, 0x8f0ccc92L);
+ R3 (C, D, A, B, X[10], 15, 0xffeff47dL);
+ R3 (B, C, D, A, X[ 1], 21, 0x85845dd1L);
+ R3 (A, B, C, D, X[ 8], 6, 0x6fa87e4fL);
+ R3 (D, A, B, C, X[15], 10, 0xfe2ce6e0L);
+ R3 (C, D, A, B, X[ 6], 15, 0xa3014314L);
+ R3 (B, C, D, A, X[13], 21, 0x4e0811a1L);
+ R3 (A, B, C, D, X[ 4], 6, 0xf7537e82L);
+ R3 (D, A, B, C, X[11], 10, 0xbd3af235L);
+ R3 (C, D, A, B, X[ 2], 15, 0x2ad7d2bbL);
+ R3 (B, C, D, A, X[ 9], 21, 0xeb86d391L);
+
+ ctx->m_nA += A;
+ ctx->m_nB += B;
+ ctx->m_nC += C;
+ ctx->m_nD += D;
+}
+
+/*
+ * __rtl_digest_endMD5.
+ */
+static void __rtl_digest_endMD5 (DigestContextMD5 *ctx)
+{
+ static const sal_uInt8 end[4] =
+ {
+ 0x80, 0x00, 0x00, 0x00
+ };
+ register const sal_uInt8 *p = end;
+
+ register sal_uInt32 *X;
+ register int i;
+
+ X = ctx->m_pData;
+ i = (ctx->m_nDatLen >> 2);
+
+#ifdef OSL_BIGENDIAN
+ __rtl_digest_swapLong (X, i + 1);
+#endif /* OSL_BIGENDIAN */
+
+ switch (ctx->m_nDatLen & 0x03)
+ {
+ case 1: X[i] &= 0x000000ff; break;
+ case 2: X[i] &= 0x0000ffff; break;
+ case 3: X[i] &= 0x00ffffff; break;
+ }
+
+ switch (ctx->m_nDatLen & 0x03)
+ {
+ case 0: X[i] = ((sal_uInt32)(*(p++))) << 0L;
+ case 1: X[i] |= ((sal_uInt32)(*(p++))) << 8L;
+ case 2: X[i] |= ((sal_uInt32)(*(p++))) << 16L;
+ case 3: X[i] |= ((sal_uInt32)(*(p++))) << 24L;
+ }
+
+ i += 1;
+
+ if (i >= (DIGEST_LBLOCK_MD5 - 2))
+ {
+ for (; i < DIGEST_LBLOCK_MD5; i++)
+ X[i] = 0;
+ __rtl_digest_updateMD5 (ctx);
+ i = 0;
+ }
+
+ for (; i < (DIGEST_LBLOCK_MD5 - 2); i++)
+ X[i] = 0;
+
+ X[DIGEST_LBLOCK_MD5 - 2] = ctx->m_nL;
+ X[DIGEST_LBLOCK_MD5 - 1] = ctx->m_nH;
+
+ __rtl_digest_updateMD5 (ctx);
+}
+
+/*========================================================================
+ *
+ * rtl_digest_MD5 implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_digest_MD5.
+ */
+rtlDigestError SAL_CALL rtl_digest_MD5 (
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestMD5_Impl digest;
+ rtlDigestError result;
+
+ digest.m_digest = __rtl_digest_MD5;
+ __rtl_digest_initMD5 (&(digest.m_context));
+
+ result = rtl_digest_update (&digest, pData, nDatLen);
+ if (result == rtl_Digest_E_None)
+ result = rtl_digest_getMD5 (&digest, pBuffer, nBufLen);
+
+ rtl_zeroMemory (&digest, sizeof (digest));
+ return (result);
+}
+
+/*
+ * rtl_digest_createMD5.
+ */
+rtlDigest SAL_CALL rtl_digest_createMD5 (void)
+{
+ DigestMD5_Impl *pImpl = (DigestMD5_Impl*)NULL;
+ pImpl = RTL_DIGEST_CREATE(DigestMD5_Impl);
+ if (pImpl)
+ {
+ pImpl->m_digest = __rtl_digest_MD5;
+ __rtl_digest_initMD5 (&(pImpl->m_context));
+ }
+ return ((rtlDigest)pImpl);
+}
+
+/*
+ * rtl_digest_updateMD5.
+ */
+rtlDigestError SAL_CALL rtl_digest_updateMD5 (
+ rtlDigest Digest, const void *pData, sal_uInt32 nDatLen)
+{
+ DigestMD5_Impl *pImpl = (DigestMD5_Impl *)Digest;
+ const sal_uInt8 *d = (const sal_uInt8 *)pData;
+
+ DigestContextMD5 *ctx;
+ sal_uInt32 len;
+
+ if ((pImpl == NULL) || (pData == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD5))
+ return rtl_Digest_E_Algorithm;
+
+ if (nDatLen == 0)
+ return rtl_Digest_E_None;
+
+ ctx = &(pImpl->m_context);
+
+ len = ctx->m_nL + (nDatLen << 3);
+ if (len < ctx->m_nL) ctx->m_nH += 1;
+ ctx->m_nH += (nDatLen >> 29);
+ ctx->m_nL = len;
+
+ if (ctx->m_nDatLen)
+ {
+ sal_uInt8 *p = (sal_uInt8 *)(ctx->m_pData) + ctx->m_nDatLen;
+ sal_uInt32 n = DIGEST_CBLOCK_MD5 - ctx->m_nDatLen;
+
+ if (nDatLen < n)
+ {
+ rtl_copyMemory (p, d, nDatLen);
+ ctx->m_nDatLen += nDatLen;
+
+ return rtl_Digest_E_None;
+ }
+
+ rtl_copyMemory (p, d, n);
+ d += n;
+ nDatLen -= n;
+
+#ifdef OSL_BIGENDIAN
+ __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_MD5);
+#endif /* OSL_BIGENDIAN */
+
+ __rtl_digest_updateMD5 (ctx);
+ ctx->m_nDatLen = 0;
+ }
+
+ while (nDatLen >= DIGEST_CBLOCK_MD5)
+ {
+ rtl_copyMemory (ctx->m_pData, d, DIGEST_CBLOCK_MD5);
+ d += DIGEST_CBLOCK_MD5;
+ nDatLen -= DIGEST_CBLOCK_MD5;
+
+#ifdef OSL_BIGENDIAN
+ __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_MD5);
+#endif /* OSL_BIGENDIAN */
+
+ __rtl_digest_updateMD5 (ctx);
+ }
+
+ rtl_copyMemory (ctx->m_pData, d, nDatLen);
+ ctx->m_nDatLen = nDatLen;
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_getMD5.
+ */
+rtlDigestError SAL_CALL rtl_digest_getMD5 (
+ rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestMD5_Impl *pImpl = (DigestMD5_Impl *)Digest;
+ sal_uInt8 *p = pBuffer;
+
+ DigestContextMD5 *ctx;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD5))
+ return rtl_Digest_E_Algorithm;
+
+ if (!(pImpl->m_digest.m_length <= nBufLen))
+ return rtl_Digest_E_BufferSize;
+
+ ctx = &(pImpl->m_context);
+
+ __rtl_digest_endMD5 (ctx);
+ RTL_DIGEST_LTOC (ctx->m_nA, p);
+ RTL_DIGEST_LTOC (ctx->m_nB, p);
+ RTL_DIGEST_LTOC (ctx->m_nC, p);
+ RTL_DIGEST_LTOC (ctx->m_nD, p);
+ __rtl_digest_initMD5 (ctx);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_rawMD5.
+ */
+rtlDigestError SAL_CALL rtl_digest_rawMD5 (
+ rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestMD5_Impl *pImpl = (DigestMD5_Impl *)Digest;
+ sal_uInt8 *p = pBuffer;
+
+ DigestContextMD5 *ctx;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD5))
+ return rtl_Digest_E_Algorithm;
+
+ if (!(pImpl->m_digest.m_length <= nBufLen))
+ return rtl_Digest_E_BufferSize;
+
+ ctx = &(pImpl->m_context);
+
+ /* __rtl_digest_endMD5 (ctx); *//* not finalized */
+ RTL_DIGEST_LTOC (ctx->m_nA, p);
+ RTL_DIGEST_LTOC (ctx->m_nB, p);
+ RTL_DIGEST_LTOC (ctx->m_nC, p);
+ RTL_DIGEST_LTOC (ctx->m_nD, p);
+ __rtl_digest_initMD5 (ctx);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_destroyMD5.
+ */
+void SAL_CALL rtl_digest_destroyMD5 (rtlDigest Digest)
+{
+ DigestMD5_Impl *pImpl = (DigestMD5_Impl *)Digest;
+ if (pImpl)
+ {
+ if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmMD5)
+ rtl_freeZeroMemory (pImpl, sizeof (DigestMD5_Impl));
+ else
+ rtl_freeMemory (pImpl);
+ }
+}
+
+/*========================================================================
+ *
+ * rtl_digest_(SHA|SHA1) common internals.
+ *
+ *======================================================================*/
+#define DIGEST_CBLOCK_SHA 64
+#define DIGEST_LBLOCK_SHA 16
+
+typedef sal_uInt32 DigestSHA_update_t (sal_uInt32 x);
+
+static sal_uInt32 __rtl_digest_updateSHA_0 (sal_uInt32 x);
+static sal_uInt32 __rtl_digest_updateSHA_1 (sal_uInt32 x);
+
+typedef struct digestSHA_context_st
+{
+ DigestSHA_update_t *m_update;
+ sal_uInt32 m_nDatLen;
+ sal_uInt32 m_pData[DIGEST_LBLOCK_SHA];
+ sal_uInt32 m_nA, m_nB, m_nC, m_nD, m_nE;
+ sal_uInt32 m_nL, m_nH;
+} DigestContextSHA;
+
+typedef struct digestSHA_impl_st
+{
+ Digest_Impl m_digest;
+ DigestContextSHA m_context;
+} DigestSHA_Impl;
+
+static void __rtl_digest_initSHA (
+ DigestContextSHA *ctx, DigestSHA_update_t *fct);
+
+static void __rtl_digest_updateSHA (DigestContextSHA *ctx);
+static void __rtl_digest_endSHA (DigestContextSHA *ctx);
+
+#define K_00_19 (sal_uInt32)0x5a827999L
+#define K_20_39 (sal_uInt32)0x6ed9eba1L
+#define K_40_59 (sal_uInt32)0x8f1bbcdcL
+#define K_60_79 (sal_uInt32)0xca62c1d6L
+
+#define F_00_19(b,c,d) ((((c) ^ (d)) & (b)) ^ (d))
+#define F_20_39(b,c,d) ((b) ^ (c) ^ (d))
+#define F_40_59(b,c,d) (((b) & (c)) | ((b) & (d)) | ((c) & (d)))
+#define F_60_79(b,c,d) F_20_39(b,c,d)
+
+#define BODY_X(i) \
+ (X[(i)&0x0f] ^ X[((i)+2)&0x0f] ^ X[((i)+8)&0x0f] ^ X[((i)+13)&0x0f])
+
+#define BODY_00_15(u,i,a,b,c,d,e,f) \
+ (f) = X[i]; \
+ (f) += (e) + K_00_19 + RTL_DIGEST_ROTL((a), 5) + F_00_19((b), (c), (d)); \
+ (b) = RTL_DIGEST_ROTL((b), 30);
+
+#define BODY_16_19(u,i,a,b,c,d,e,f) \
+ (f) = BODY_X((i)); \
+ (f) = X[(i)&0x0f] = (u)((f)); \
+ (f) += (e) + K_00_19 + RTL_DIGEST_ROTL((a), 5) + F_00_19((b), (c), (d)); \
+ (b) = RTL_DIGEST_ROTL((b), 30);
+
+#define BODY_20_39(u,i,a,b,c,d,e,f) \
+ (f) = BODY_X((i)); \
+ (f) = X[(i)&0x0f] = (u)((f)); \
+ (f) += (e) + K_20_39 + RTL_DIGEST_ROTL((a), 5) + F_20_39((b), (c), (d)); \
+ (b) = RTL_DIGEST_ROTL((b), 30);
+
+#define BODY_40_59(u,i,a,b,c,d,e,f) \
+ (f) = BODY_X((i)); \
+ (f) = X[(i)&0x0f] = (u)((f)); \
+ (f) += (e) + K_40_59 + RTL_DIGEST_ROTL((a), 5) + F_40_59((b), (c), (d)); \
+ (b) = RTL_DIGEST_ROTL((b), 30);
+
+#define BODY_60_79(u,i,a,b,c,d,e,f) \
+ (f) = BODY_X((i)); \
+ (f) = X[(i)&0x0f] = (u)((f)); \
+ (f) += (e) + K_60_79 + RTL_DIGEST_ROTL((a), 5) + F_60_79((b), (c), (d)); \
+ (b) = RTL_DIGEST_ROTL((b), 30);
+
+/*
+ * __rtl_digest_initSHA.
+ */
+static void __rtl_digest_initSHA (
+ DigestContextSHA *ctx, DigestSHA_update_t *fct)
+{
+ rtl_zeroMemory (ctx, sizeof (DigestContextSHA));
+ ctx->m_update = fct;
+
+ ctx->m_nA = (sal_uInt32)0x67452301L;
+ ctx->m_nB = (sal_uInt32)0xefcdab89L;
+ ctx->m_nC = (sal_uInt32)0x98badcfeL;
+ ctx->m_nD = (sal_uInt32)0x10325476L;
+ ctx->m_nE = (sal_uInt32)0xc3d2e1f0L;
+}
+
+/*
+ * __rtl_digest_updateSHA.
+ */
+static void __rtl_digest_updateSHA (DigestContextSHA *ctx)
+{
+ register sal_uInt32 A, B, C, D, E, T;
+ register sal_uInt32 *X;
+
+ register DigestSHA_update_t *U;
+ U = ctx->m_update;
+
+ A = ctx->m_nA;
+ B = ctx->m_nB;
+ C = ctx->m_nC;
+ D = ctx->m_nD;
+ E = ctx->m_nE;
+ X = ctx->m_pData;
+
+ BODY_00_15 (U, 0, A, B, C, D, E, T);
+ BODY_00_15 (U, 1, T, A, B, C, D, E);
+ BODY_00_15 (U, 2, E, T, A, B, C, D);
+ BODY_00_15 (U, 3, D, E, T, A, B, C);
+ BODY_00_15 (U, 4, C, D, E, T, A, B);
+ BODY_00_15 (U, 5, B, C, D, E, T, A);
+ BODY_00_15 (U, 6, A, B, C, D, E, T);
+ BODY_00_15 (U, 7, T, A, B, C, D, E);
+ BODY_00_15 (U, 8, E, T, A, B, C, D);
+ BODY_00_15 (U, 9, D, E, T, A, B, C);
+ BODY_00_15 (U, 10, C, D, E, T, A, B);
+ BODY_00_15 (U, 11, B, C, D, E, T, A);
+ BODY_00_15 (U, 12, A, B, C, D, E, T);
+ BODY_00_15 (U, 13, T, A, B, C, D, E);
+ BODY_00_15 (U, 14, E, T, A, B, C, D);
+ BODY_00_15 (U, 15, D, E, T, A, B, C);
+ BODY_16_19 (U, 16, C, D, E, T, A, B);
+ BODY_16_19 (U, 17, B, C, D, E, T, A);
+ BODY_16_19 (U, 18, A, B, C, D, E, T);
+ BODY_16_19 (U, 19, T, A, B, C, D, E);
+
+ BODY_20_39 (U, 20, E, T, A, B, C, D);
+ BODY_20_39 (U, 21, D, E, T, A, B, C);
+ BODY_20_39 (U, 22, C, D, E, T, A, B);
+ BODY_20_39 (U, 23, B, C, D, E, T, A);
+ BODY_20_39 (U, 24, A, B, C, D, E, T);
+ BODY_20_39 (U, 25, T, A, B, C, D, E);
+ BODY_20_39 (U, 26, E, T, A, B, C, D);
+ BODY_20_39 (U, 27, D, E, T, A, B, C);
+ BODY_20_39 (U, 28, C, D, E, T, A, B);
+ BODY_20_39 (U, 29, B, C, D, E, T, A);
+ BODY_20_39 (U, 30, A, B, C, D, E, T);
+ BODY_20_39 (U, 31, T, A, B, C, D, E);
+ BODY_20_39 (U, 32, E, T, A, B, C, D);
+ BODY_20_39 (U, 33, D, E, T, A, B, C);
+ BODY_20_39 (U, 34, C, D, E, T, A, B);
+ BODY_20_39 (U, 35, B, C, D, E, T, A);
+ BODY_20_39 (U, 36, A, B, C, D, E, T);
+ BODY_20_39 (U, 37, T, A, B, C, D, E);
+ BODY_20_39 (U, 38, E, T, A, B, C, D);
+ BODY_20_39 (U, 39, D, E, T, A, B, C);
+
+ BODY_40_59 (U, 40, C, D, E, T, A, B);
+ BODY_40_59 (U, 41, B, C, D, E, T, A);
+ BODY_40_59 (U, 42, A, B, C, D, E, T);
+ BODY_40_59 (U, 43, T, A, B, C, D, E);
+ BODY_40_59 (U, 44, E, T, A, B, C, D);
+ BODY_40_59 (U, 45, D, E, T, A, B, C);
+ BODY_40_59 (U, 46, C, D, E, T, A, B);
+ BODY_40_59 (U, 47, B, C, D, E, T, A);
+ BODY_40_59 (U, 48, A, B, C, D, E, T);
+ BODY_40_59 (U, 49, T, A, B, C, D, E);
+ BODY_40_59 (U, 50, E, T, A, B, C, D);
+ BODY_40_59 (U, 51, D, E, T, A, B, C);
+ BODY_40_59 (U, 52, C, D, E, T, A, B);
+ BODY_40_59 (U, 53, B, C, D, E, T, A);
+ BODY_40_59 (U, 54, A, B, C, D, E, T);
+ BODY_40_59 (U, 55, T, A, B, C, D, E);
+ BODY_40_59 (U, 56, E, T, A, B, C, D);
+ BODY_40_59 (U, 57, D, E, T, A, B, C);
+ BODY_40_59 (U, 58, C, D, E, T, A, B);
+ BODY_40_59 (U, 59, B, C, D, E, T, A);
+
+ BODY_60_79 (U, 60, A, B, C, D, E, T);
+ BODY_60_79 (U, 61, T, A, B, C, D, E);
+ BODY_60_79 (U, 62, E, T, A, B, C, D);
+ BODY_60_79 (U, 63, D, E, T, A, B, C);
+ BODY_60_79 (U, 64, C, D, E, T, A, B);
+ BODY_60_79 (U, 65, B, C, D, E, T, A);
+ BODY_60_79 (U, 66, A, B, C, D, E, T);
+ BODY_60_79 (U, 67, T, A, B, C, D, E);
+ BODY_60_79 (U, 68, E, T, A, B, C, D);
+ BODY_60_79 (U, 69, D, E, T, A, B, C);
+ BODY_60_79 (U, 70, C, D, E, T, A, B);
+ BODY_60_79 (U, 71, B, C, D, E, T, A);
+ BODY_60_79 (U, 72, A, B, C, D, E, T);
+ BODY_60_79 (U, 73, T, A, B, C, D, E);
+ BODY_60_79 (U, 74, E, T, A, B, C, D);
+ BODY_60_79 (U, 75, D, E, T, A, B, C);
+ BODY_60_79 (U, 76, C, D, E, T, A, B);
+ BODY_60_79 (U, 77, B, C, D, E, T, A);
+ BODY_60_79 (U, 78, A, B, C, D, E, T);
+ BODY_60_79 (U, 79, T, A, B, C, D, E);
+
+ ctx->m_nA += E;
+ ctx->m_nB += T;
+ ctx->m_nC += A;
+ ctx->m_nD += B;
+ ctx->m_nE += C;
+}
+
+/*
+ * __rtl_digest_endSHA.
+ */
+static void __rtl_digest_endSHA (DigestContextSHA *ctx)
+{
+ static const sal_uInt8 end[4] =
+ {
+ 0x80, 0x00, 0x00, 0x00
+ };
+ register const sal_uInt8 *p = end;
+
+ register sal_uInt32 *X;
+ register int i;
+
+ X = ctx->m_pData;
+ i = (ctx->m_nDatLen >> 2);
+
+#ifdef OSL_BIGENDIAN
+ __rtl_digest_swapLong (X, i + 1);
+#endif /* OSL_BIGENDIAN */
+
+ switch (ctx->m_nDatLen & 0x03)
+ {
+ case 1: X[i] &= 0x000000ff; break;
+ case 2: X[i] &= 0x0000ffff; break;
+ case 3: X[i] &= 0x00ffffff; break;
+ }
+
+ switch (ctx->m_nDatLen & 0x03)
+ {
+ case 0: X[i] = ((sal_uInt32)(*(p++))) << 0L;
+ case 1: X[i] |= ((sal_uInt32)(*(p++))) << 8L;
+ case 2: X[i] |= ((sal_uInt32)(*(p++))) << 16L;
+ case 3: X[i] |= ((sal_uInt32)(*(p++))) << 24L;
+ }
+
+ __rtl_digest_swapLong (X, i + 1);
+
+ i += 1;
+
+ if (i >= (DIGEST_LBLOCK_SHA - 2))
+ {
+ for (; i < DIGEST_LBLOCK_SHA; i++)
+ X[i] = 0;
+ __rtl_digest_updateSHA (ctx);
+ i = 0;
+ }
+
+ for (; i < (DIGEST_LBLOCK_SHA - 2); i++)
+ X[i] = 0;
+
+ X[DIGEST_LBLOCK_SHA - 2] = ctx->m_nH;
+ X[DIGEST_LBLOCK_SHA - 1] = ctx->m_nL;
+
+ __rtl_digest_updateSHA (ctx);
+}
+
+/*========================================================================
+ *
+ * rtl_digest_SHA internals.
+ *
+ *======================================================================*/
+/*
+ * __rtl_digest_SHA_0.
+ */
+static const Digest_Impl __rtl_digest_SHA_0 =
+{
+ rtl_Digest_AlgorithmSHA,
+ RTL_DIGEST_LENGTH_SHA,
+
+ NULL,
+ rtl_digest_destroySHA,
+ rtl_digest_updateSHA,
+ rtl_digest_getSHA
+};
+
+/*
+ * __rtl_digest_updateSHA_0.
+ */
+static sal_uInt32 __rtl_digest_updateSHA_0 (sal_uInt32 x)
+{
+ return x;
+}
+
+/*========================================================================
+ *
+ * rtl_digest_SHA implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_digest_SHA.
+ */
+rtlDigestError SAL_CALL rtl_digest_SHA (
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestSHA_Impl digest;
+ rtlDigestError result;
+
+ digest.m_digest = __rtl_digest_SHA_0;
+ __rtl_digest_initSHA (&(digest.m_context), __rtl_digest_updateSHA_0);
+
+ result = rtl_digest_updateSHA (&digest, pData, nDatLen);
+ if (result == rtl_Digest_E_None)
+ result = rtl_digest_getSHA (&digest, pBuffer, nBufLen);
+
+ rtl_zeroMemory (&digest, sizeof (digest));
+ return (result);
+}
+
+/*
+ * rtl_digest_createSHA.
+ */
+rtlDigest SAL_CALL rtl_digest_createSHA (void)
+{
+ DigestSHA_Impl *pImpl = (DigestSHA_Impl*)NULL;
+ pImpl = RTL_DIGEST_CREATE(DigestSHA_Impl);
+ if (pImpl)
+ {
+ pImpl->m_digest = __rtl_digest_SHA_0;
+ __rtl_digest_initSHA (&(pImpl->m_context), __rtl_digest_updateSHA_0);
+ }
+ return ((rtlDigest)pImpl);
+}
+
+/*
+ * rtl_digest_updateSHA.
+ */
+rtlDigestError SAL_CALL rtl_digest_updateSHA (
+ rtlDigest Digest, const void *pData, sal_uInt32 nDatLen)
+{
+ DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest;
+ const sal_uInt8 *d = (const sal_uInt8 *)pData;
+
+ DigestContextSHA *ctx;
+ sal_uInt32 len;
+
+ if ((pImpl == NULL) || (pData == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA))
+ return rtl_Digest_E_Algorithm;
+
+ if (nDatLen == 0)
+ return rtl_Digest_E_None;
+
+ ctx = &(pImpl->m_context);
+
+ len = ctx->m_nL + (nDatLen << 3);
+ if (len < ctx->m_nL) ctx->m_nH += 1;
+ ctx->m_nH += (nDatLen >> 29);
+ ctx->m_nL = len;
+
+ if (ctx->m_nDatLen)
+ {
+ sal_uInt8 *p = (sal_uInt8 *)(ctx->m_pData) + ctx->m_nDatLen;
+ sal_uInt32 n = DIGEST_CBLOCK_SHA - ctx->m_nDatLen;
+
+ if (nDatLen < n)
+ {
+ rtl_copyMemory (p, d, nDatLen);
+ ctx->m_nDatLen += nDatLen;
+
+ return rtl_Digest_E_None;
+ }
+
+ rtl_copyMemory (p, d, n);
+ d += n;
+ nDatLen -= n;
+
+#ifndef OSL_BIGENDIAN
+ __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA);
+#endif /* OSL_BIGENDIAN */
+
+ __rtl_digest_updateSHA (ctx);
+ ctx->m_nDatLen = 0;
+ }
+
+ while (nDatLen >= DIGEST_CBLOCK_SHA)
+ {
+ rtl_copyMemory (ctx->m_pData, d, DIGEST_CBLOCK_SHA);
+ d += DIGEST_CBLOCK_SHA;
+ nDatLen -= DIGEST_CBLOCK_SHA;
+
+#ifndef OSL_BIGENDIAN
+ __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA);
+#endif /* OSL_BIGENDIAN */
+
+ __rtl_digest_updateSHA (ctx);
+ }
+
+ rtl_copyMemory (ctx->m_pData, d, nDatLen);
+ ctx->m_nDatLen = nDatLen;
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_getSHA.
+ */
+rtlDigestError SAL_CALL rtl_digest_getSHA (
+ rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest;
+ sal_uInt8 *p = pBuffer;
+
+ DigestContextSHA *ctx;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA))
+ return rtl_Digest_E_Algorithm;
+
+ if (!(pImpl->m_digest.m_length <= nBufLen))
+ return rtl_Digest_E_BufferSize;
+
+ ctx = &(pImpl->m_context);
+
+ __rtl_digest_endSHA (ctx);
+ RTL_DIGEST_HTONL (ctx->m_nA, p);
+ RTL_DIGEST_HTONL (ctx->m_nB, p);
+ RTL_DIGEST_HTONL (ctx->m_nC, p);
+ RTL_DIGEST_HTONL (ctx->m_nD, p);
+ RTL_DIGEST_HTONL (ctx->m_nE, p);
+ __rtl_digest_initSHA (ctx, __rtl_digest_updateSHA_0);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_destroySHA.
+ */
+void SAL_CALL rtl_digest_destroySHA (rtlDigest Digest)
+{
+ DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest;
+ if (pImpl)
+ {
+ if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA)
+ rtl_freeZeroMemory (pImpl, sizeof (DigestSHA_Impl));
+ else
+ rtl_freeMemory (pImpl);
+ }
+}
+
+/*========================================================================
+ *
+ * rtl_digest_SHA1 internals.
+ *
+ *======================================================================*/
+/*
+ * __rtl_digest_SHA_1.
+ */
+static const Digest_Impl __rtl_digest_SHA_1 =
+{
+ rtl_Digest_AlgorithmSHA1,
+ RTL_DIGEST_LENGTH_SHA1,
+
+ NULL,
+ rtl_digest_destroySHA1,
+ rtl_digest_updateSHA1,
+ rtl_digest_getSHA1
+};
+
+/*
+ * __rtl_digest_updateSHA_1.
+ */
+static sal_uInt32 __rtl_digest_updateSHA_1 (sal_uInt32 x)
+{
+ return RTL_DIGEST_ROTL (x, 1);
+}
+
+/*========================================================================
+ *
+ * rtl_digest_SHA1 implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_digest_SHA1.
+ */
+rtlDigestError SAL_CALL rtl_digest_SHA1 (
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestSHA_Impl digest;
+ rtlDigestError result;
+
+ digest.m_digest = __rtl_digest_SHA_1;
+ __rtl_digest_initSHA (&(digest.m_context), __rtl_digest_updateSHA_1);
+
+ result = rtl_digest_updateSHA1 (&digest, pData, nDatLen);
+ if (result == rtl_Digest_E_None)
+ result = rtl_digest_getSHA1 (&digest, pBuffer, nBufLen);
+
+ rtl_zeroMemory (&digest, sizeof (digest));
+ return (result);
+}
+
+/*
+ * rtl_digest_createSHA1.
+ */
+rtlDigest SAL_CALL rtl_digest_createSHA1 (void)
+{
+ DigestSHA_Impl *pImpl = (DigestSHA_Impl*)NULL;
+ pImpl = RTL_DIGEST_CREATE(DigestSHA_Impl);
+ if (pImpl)
+ {
+ pImpl->m_digest = __rtl_digest_SHA_1;
+ __rtl_digest_initSHA (&(pImpl->m_context), __rtl_digest_updateSHA_1);
+ }
+ return ((rtlDigest)pImpl);
+}
+
+/*
+ * rtl_digest_updateSHA1.
+ */
+rtlDigestError SAL_CALL rtl_digest_updateSHA1 (
+ rtlDigest Digest, const void *pData, sal_uInt32 nDatLen)
+{
+ DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest;
+ const sal_uInt8 *d = (const sal_uInt8 *)pData;
+
+ DigestContextSHA *ctx;
+ sal_uInt32 len;
+
+ if ((pImpl == NULL) || (pData == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA1))
+ return rtl_Digest_E_Algorithm;
+
+ if (nDatLen == 0)
+ return rtl_Digest_E_None;
+
+ ctx = &(pImpl->m_context);
+
+ len = ctx->m_nL + (nDatLen << 3);
+ if (len < ctx->m_nL) ctx->m_nH += 1;
+ ctx->m_nH += (nDatLen >> 29);
+ ctx->m_nL = len;
+
+ if (ctx->m_nDatLen)
+ {
+ sal_uInt8 *p = (sal_uInt8 *)(ctx->m_pData) + ctx->m_nDatLen;
+ sal_uInt32 n = DIGEST_CBLOCK_SHA - ctx->m_nDatLen;
+
+ if (nDatLen < n)
+ {
+ rtl_copyMemory (p, d, nDatLen);
+ ctx->m_nDatLen += nDatLen;
+
+ return rtl_Digest_E_None;
+ }
+
+ rtl_copyMemory (p, d, n);
+ d += n;
+ nDatLen -= n;
+
+#ifndef OSL_BIGENDIAN
+ __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA);
+#endif /* OSL_BIGENDIAN */
+
+ __rtl_digest_updateSHA (ctx);
+ ctx->m_nDatLen = 0;
+ }
+
+ while (nDatLen >= DIGEST_CBLOCK_SHA)
+ {
+ rtl_copyMemory (ctx->m_pData, d, DIGEST_CBLOCK_SHA);
+ d += DIGEST_CBLOCK_SHA;
+ nDatLen -= DIGEST_CBLOCK_SHA;
+
+#ifndef OSL_BIGENDIAN
+ __rtl_digest_swapLong (ctx->m_pData, DIGEST_LBLOCK_SHA);
+#endif /* OSL_BIGENDIAN */
+
+ __rtl_digest_updateSHA (ctx);
+ }
+
+ rtl_copyMemory (ctx->m_pData, d, nDatLen);
+ ctx->m_nDatLen = nDatLen;
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_getSHA1.
+ */
+rtlDigestError SAL_CALL rtl_digest_getSHA1 (
+ rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest;
+ sal_uInt8 *p = pBuffer;
+
+ DigestContextSHA *ctx;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA1))
+ return rtl_Digest_E_Algorithm;
+
+ if (!(pImpl->m_digest.m_length <= nBufLen))
+ return rtl_Digest_E_BufferSize;
+
+ ctx = &(pImpl->m_context);
+
+ __rtl_digest_endSHA (ctx);
+ RTL_DIGEST_HTONL (ctx->m_nA, p);
+ RTL_DIGEST_HTONL (ctx->m_nB, p);
+ RTL_DIGEST_HTONL (ctx->m_nC, p);
+ RTL_DIGEST_HTONL (ctx->m_nD, p);
+ RTL_DIGEST_HTONL (ctx->m_nE, p);
+ __rtl_digest_initSHA (ctx, __rtl_digest_updateSHA_1);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_destroySHA1.
+ */
+void SAL_CALL rtl_digest_destroySHA1 (rtlDigest Digest)
+{
+ DigestSHA_Impl *pImpl = (DigestSHA_Impl *)Digest;
+ if (pImpl)
+ {
+ if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmSHA1)
+ rtl_freeZeroMemory (pImpl, sizeof (DigestSHA_Impl));
+ else
+ rtl_freeMemory (pImpl);
+ }
+}
+
+/*========================================================================
+ *
+ * rtl_digest_HMAC_MD5 internals.
+ *
+ *======================================================================*/
+#define DIGEST_CBLOCK_HMAC_MD5 64
+
+typedef struct _contextHMAC_MD5_st
+{
+ DigestMD5_Impl m_hash;
+ sal_uInt8 m_opad[DIGEST_CBLOCK_HMAC_MD5];
+} ContextHMAC_MD5;
+
+typedef struct _digestHMAC_MD5_impl_st
+{
+ Digest_Impl m_digest;
+ ContextHMAC_MD5 m_context;
+} DigestHMAC_MD5_Impl;
+
+static void __rtl_digest_initHMAC_MD5 (ContextHMAC_MD5 * ctx);
+static void __rtl_digest_ipadHMAC_MD5 (ContextHMAC_MD5 * ctx);
+static void __rtl_digest_opadHMAC_MD5 (ContextHMAC_MD5 * ctx);
+
+/*
+ * __rtl_digest_HMAC_MD5.
+ */
+static const Digest_Impl __rtl_digest_HMAC_MD5 =
+{
+ rtl_Digest_AlgorithmHMAC_MD5,
+ RTL_DIGEST_LENGTH_MD5,
+
+ rtl_digest_initHMAC_MD5,
+ rtl_digest_destroyHMAC_MD5,
+ rtl_digest_updateHMAC_MD5,
+ rtl_digest_getHMAC_MD5
+};
+
+/*
+ * __rtl_digest_initHMAC_MD5.
+ */
+static void __rtl_digest_initHMAC_MD5 (ContextHMAC_MD5 * ctx)
+{
+ DigestMD5_Impl *pImpl = &(ctx->m_hash);
+
+ pImpl->m_digest = __rtl_digest_MD5;
+ __rtl_digest_initMD5 (&(pImpl->m_context));
+
+ rtl_zeroMemory (ctx->m_opad, DIGEST_CBLOCK_HMAC_MD5);
+}
+
+/*
+ * __rtl_digest_ipadHMAC_MD5.
+ */
+static void __rtl_digest_ipadHMAC_MD5 (ContextHMAC_MD5 * ctx)
+{
+ register sal_uInt32 i;
+
+ for (i = 0; i < DIGEST_CBLOCK_HMAC_MD5; i++)
+ ctx->m_opad[i] ^= 0x36;
+ rtl_digest_updateMD5 (
+ &(ctx->m_hash), ctx->m_opad, DIGEST_CBLOCK_HMAC_MD5);
+ for (i = 0; i < DIGEST_CBLOCK_HMAC_MD5; i++)
+ ctx->m_opad[i] ^= 0x36;
+}
+
+/*
+ * __rtl_digest_opadHMAC_MD5.
+ */
+static void __rtl_digest_opadHMAC_MD5 (ContextHMAC_MD5 * ctx)
+{
+ register sal_uInt32 i;
+
+ for (i = 0; i < DIGEST_CBLOCK_HMAC_MD5; i++)
+ ctx->m_opad[i] ^= 0x5c;
+}
+
+/*========================================================================
+ *
+ * rtl_digest_HMAC_MD5 implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_digest_HMAC_MD5.
+ */
+rtlDigestError SAL_CALL rtl_digest_HMAC_MD5 (
+ const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen,
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestHMAC_MD5_Impl digest;
+ rtlDigestError result;
+
+ digest.m_digest = __rtl_digest_HMAC_MD5;
+
+ result = rtl_digest_initHMAC_MD5 (&digest, pKeyData, nKeyLen);
+ if (result == rtl_Digest_E_None)
+ {
+ result = rtl_digest_updateHMAC_MD5 (&digest, pData, nDatLen);
+ if (result == rtl_Digest_E_None)
+ result = rtl_digest_getHMAC_MD5 (&digest, pBuffer, nBufLen);
+ }
+
+ rtl_zeroMemory (&digest, sizeof (digest));
+ return (result);
+}
+
+/*
+ * rtl_digest_createHMAC_MD5.
+ */
+rtlDigest SAL_CALL rtl_digest_createHMAC_MD5 (void)
+{
+ DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)NULL;
+ pImpl = RTL_DIGEST_CREATE(DigestHMAC_MD5_Impl);
+ if (pImpl)
+ {
+ pImpl->m_digest = __rtl_digest_HMAC_MD5;
+ __rtl_digest_initHMAC_MD5 (&(pImpl->m_context));
+ }
+ return ((rtlDigest)pImpl);
+}
+
+/*
+ * rtl_digest_initHMAC_MD5.
+ */
+rtlDigestError SAL_CALL rtl_digest_initHMAC_MD5 (
+ rtlDigest Digest, const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen)
+{
+ DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)Digest;
+ ContextHMAC_MD5 *ctx;
+
+ if ((pImpl == NULL) || (pKeyData == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_MD5))
+ return rtl_Digest_E_Algorithm;
+
+ ctx = &(pImpl->m_context);
+ __rtl_digest_initHMAC_MD5 (ctx);
+
+ if (nKeyLen > DIGEST_CBLOCK_HMAC_MD5)
+ {
+ /* Initialize 'opad' with hashed 'KeyData' */
+ rtl_digest_updateMD5 (
+ &(ctx->m_hash), pKeyData, nKeyLen);
+ rtl_digest_getMD5 (
+ &(ctx->m_hash), ctx->m_opad, RTL_DIGEST_LENGTH_MD5);
+ }
+ else
+ {
+ /* Initialize 'opad' with plain 'KeyData' */
+ rtl_copyMemory (ctx->m_opad, pKeyData, nKeyLen);
+ }
+
+ __rtl_digest_ipadHMAC_MD5 (ctx);
+ __rtl_digest_opadHMAC_MD5 (ctx);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_updateHMAC_MD5.
+ */
+rtlDigestError SAL_CALL rtl_digest_updateHMAC_MD5 (
+ rtlDigest Digest, const void *pData, sal_uInt32 nDatLen)
+{
+ DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)Digest;
+ ContextHMAC_MD5 *ctx;
+
+ if ((pImpl == NULL) || (pData == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_MD5))
+ return rtl_Digest_E_Algorithm;
+
+ ctx = &(pImpl->m_context);
+ rtl_digest_updateMD5 (&(ctx->m_hash), pData, nDatLen);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_getHMAC_MD5.
+ */
+rtlDigestError SAL_CALL rtl_digest_getHMAC_MD5 (
+ rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)Digest;
+ ContextHMAC_MD5 *ctx;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_MD5))
+ return rtl_Digest_E_Algorithm;
+
+ if (!(pImpl->m_digest.m_length <= nBufLen))
+ return rtl_Digest_E_BufferSize;
+
+ nBufLen = pImpl->m_digest.m_length;
+
+ ctx = &(pImpl->m_context);
+ rtl_digest_getMD5 (&(ctx->m_hash), pBuffer, nBufLen);
+
+ rtl_digest_updateMD5 (&(ctx->m_hash), ctx->m_opad, 64);
+ rtl_digest_updateMD5 (&(ctx->m_hash), pBuffer, nBufLen);
+ rtl_digest_getMD5 (&(ctx->m_hash), pBuffer, nBufLen);
+
+ __rtl_digest_opadHMAC_MD5 (ctx);
+ __rtl_digest_ipadHMAC_MD5 (ctx);
+ __rtl_digest_opadHMAC_MD5 (ctx);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_destroyHMAC_MD5.
+ */
+void SAL_CALL rtl_digest_destroyHMAC_MD5 (rtlDigest Digest)
+{
+ DigestHMAC_MD5_Impl *pImpl = (DigestHMAC_MD5_Impl*)Digest;
+ if (pImpl)
+ {
+ if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_MD5)
+ rtl_freeZeroMemory (pImpl, sizeof (DigestHMAC_MD5_Impl));
+ else
+ rtl_freeMemory (pImpl);
+ }
+}
+
+/*========================================================================
+ *
+ * rtl_digest_HMAC_SHA1 internals.
+ *
+ *======================================================================*/
+#define DIGEST_CBLOCK_HMAC_SHA1 64
+
+typedef struct _contextHMAC_SHA1_st
+{
+ DigestSHA_Impl m_hash;
+ sal_uInt8 m_opad[DIGEST_CBLOCK_HMAC_SHA1];
+} ContextHMAC_SHA1;
+
+typedef struct _digestHMAC_SHA1_impl_st
+{
+ Digest_Impl m_digest;
+ ContextHMAC_SHA1 m_context;
+} DigestHMAC_SHA1_Impl;
+
+static void __rtl_digest_initHMAC_SHA1 (ContextHMAC_SHA1 * ctx);
+static void __rtl_digest_ipadHMAC_SHA1 (ContextHMAC_SHA1 * ctx);
+static void __rtl_digest_opadHMAC_SHA1 (ContextHMAC_SHA1 * ctx);
+
+/*
+ * __rtl_digest_HMAC_SHA1.
+ */
+static const Digest_Impl __rtl_digest_HMAC_SHA1 =
+{
+ rtl_Digest_AlgorithmHMAC_SHA1,
+ RTL_DIGEST_LENGTH_SHA1,
+
+ rtl_digest_initHMAC_SHA1,
+ rtl_digest_destroyHMAC_SHA1,
+ rtl_digest_updateHMAC_SHA1,
+ rtl_digest_getHMAC_SHA1
+};
+
+/*
+ * __rtl_digest_initHMAC_SHA1.
+ */
+static void __rtl_digest_initHMAC_SHA1 (ContextHMAC_SHA1 * ctx)
+{
+ DigestSHA_Impl *pImpl = &(ctx->m_hash);
+
+ pImpl->m_digest = __rtl_digest_SHA_1;
+ __rtl_digest_initSHA (&(pImpl->m_context), __rtl_digest_updateSHA_1);
+
+ rtl_zeroMemory (ctx->m_opad, DIGEST_CBLOCK_HMAC_SHA1);
+}
+
+/*
+ * __rtl_digest_ipadHMAC_SHA1.
+ */
+static void __rtl_digest_ipadHMAC_SHA1 (ContextHMAC_SHA1 * ctx)
+{
+ register sal_uInt32 i;
+
+ for (i = 0; i < DIGEST_CBLOCK_HMAC_SHA1; i++)
+ ctx->m_opad[i] ^= 0x36;
+ rtl_digest_updateSHA1 (
+ &(ctx->m_hash), ctx->m_opad, DIGEST_CBLOCK_HMAC_SHA1);
+ for (i = 0; i < DIGEST_CBLOCK_HMAC_SHA1; i++)
+ ctx->m_opad[i] ^= 0x36;
+}
+
+/*
+ * __rtl_digest_opadHMAC_SHA1.
+ */
+static void __rtl_digest_opadHMAC_SHA1 (ContextHMAC_SHA1 * ctx)
+{
+ register sal_uInt32 i;
+
+ for (i = 0; i < DIGEST_CBLOCK_HMAC_SHA1; i++)
+ ctx->m_opad[i] ^= 0x5c;
+}
+
+/*========================================================================
+ *
+ * rtl_digest_HMAC_SHA1 implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_digest_HMAC_SHA1.
+ */
+rtlDigestError SAL_CALL rtl_digest_HMAC_SHA1 (
+ const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen,
+ const void *pData, sal_uInt32 nDatLen,
+ sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestHMAC_SHA1_Impl digest;
+ rtlDigestError result;
+
+ digest.m_digest = __rtl_digest_HMAC_SHA1;
+
+ result = rtl_digest_initHMAC_SHA1 (&digest, pKeyData, nKeyLen);
+ if (result == rtl_Digest_E_None)
+ {
+ result = rtl_digest_updateHMAC_SHA1 (&digest, pData, nDatLen);
+ if (result == rtl_Digest_E_None)
+ result = rtl_digest_getHMAC_SHA1 (&digest, pBuffer, nBufLen);
+ }
+
+ rtl_zeroMemory (&digest, sizeof (digest));
+ return (result);
+}
+
+/*
+ * rtl_digest_createHMAC_SHA1.
+ */
+rtlDigest SAL_CALL rtl_digest_createHMAC_SHA1 (void)
+{
+ DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)NULL;
+ pImpl = RTL_DIGEST_CREATE(DigestHMAC_SHA1_Impl);
+ if (pImpl)
+ {
+ pImpl->m_digest = __rtl_digest_HMAC_SHA1;
+ __rtl_digest_initHMAC_SHA1 (&(pImpl->m_context));
+ }
+ return ((rtlDigest)pImpl);
+}
+
+/*
+ * rtl_digest_initHMAC_SHA1.
+ */
+rtlDigestError SAL_CALL rtl_digest_initHMAC_SHA1 (
+ rtlDigest Digest, const sal_uInt8 *pKeyData, sal_uInt32 nKeyLen)
+{
+ DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)Digest;
+ ContextHMAC_SHA1 *ctx;
+
+ if ((pImpl == NULL) || (pKeyData == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_SHA1))
+ return rtl_Digest_E_Algorithm;
+
+ ctx = &(pImpl->m_context);
+ __rtl_digest_initHMAC_SHA1 (ctx);
+
+ if (nKeyLen > DIGEST_CBLOCK_HMAC_SHA1)
+ {
+ /* Initialize 'opad' with hashed 'KeyData' */
+ rtl_digest_updateSHA1 (
+ &(ctx->m_hash), pKeyData, nKeyLen);
+ rtl_digest_getSHA1 (
+ &(ctx->m_hash), ctx->m_opad, RTL_DIGEST_LENGTH_SHA1);
+ }
+ else
+ {
+ /* Initialize 'opad' with plain 'KeyData' */
+ rtl_copyMemory (ctx->m_opad, pKeyData, nKeyLen);
+ }
+
+ __rtl_digest_ipadHMAC_SHA1 (ctx);
+ __rtl_digest_opadHMAC_SHA1 (ctx);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_updateHMAC_SHA1.
+ */
+rtlDigestError SAL_CALL rtl_digest_updateHMAC_SHA1 (
+ rtlDigest Digest, const void *pData, sal_uInt32 nDatLen)
+{
+ DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)Digest;
+ ContextHMAC_SHA1 *ctx;
+
+ if ((pImpl == NULL) || (pData == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_SHA1))
+ return rtl_Digest_E_Algorithm;
+
+ ctx = &(pImpl->m_context);
+ rtl_digest_updateSHA1 (&(ctx->m_hash), pData, nDatLen);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_getHMAC_SHA1.
+ */
+rtlDigestError SAL_CALL rtl_digest_getHMAC_SHA1 (
+ rtlDigest Digest, sal_uInt8 *pBuffer, sal_uInt32 nBufLen)
+{
+ DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)Digest;
+ ContextHMAC_SHA1 *ctx;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Digest_E_Argument;
+
+ if (!(pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_SHA1))
+ return rtl_Digest_E_Algorithm;
+
+ if (!(pImpl->m_digest.m_length <= nBufLen))
+ return rtl_Digest_E_BufferSize;
+
+ nBufLen = pImpl->m_digest.m_length;
+
+ ctx = &(pImpl->m_context);
+ rtl_digest_getSHA1 (&(ctx->m_hash), pBuffer, nBufLen);
+
+ rtl_digest_updateSHA1 (&(ctx->m_hash), ctx->m_opad, sizeof(ctx->m_opad));
+ rtl_digest_updateSHA1 (&(ctx->m_hash), pBuffer, nBufLen);
+ rtl_digest_getSHA1 (&(ctx->m_hash), pBuffer, nBufLen);
+
+ __rtl_digest_opadHMAC_SHA1 (ctx);
+ __rtl_digest_ipadHMAC_SHA1 (ctx);
+ __rtl_digest_opadHMAC_SHA1 (ctx);
+
+ return rtl_Digest_E_None;
+}
+
+/*
+ * rtl_digest_destroyHMAC_SHA1.
+ */
+void SAL_CALL rtl_digest_destroyHMAC_SHA1 (rtlDigest Digest)
+{
+ DigestHMAC_SHA1_Impl *pImpl = (DigestHMAC_SHA1_Impl*)Digest;
+ if (pImpl)
+ {
+ if (pImpl->m_digest.m_algorithm == rtl_Digest_AlgorithmHMAC_SHA1)
+ rtl_freeZeroMemory (pImpl, sizeof (DigestHMAC_SHA1_Impl));
+ else
+ rtl_freeMemory (pImpl);
+ }
+}
+
+/*========================================================================
+ *
+ * rtl_digest_PBKDF2 internals.
+ *
+ *======================================================================*/
+#define DIGEST_CBLOCK_PBKDF2 RTL_DIGEST_LENGTH_HMAC_SHA1
+
+/*
+ * __rtl_digest_updatePBKDF2.
+ */
+static void __rtl_digest_updatePBKDF2 (
+ rtlDigest hDigest,
+ sal_uInt8 T[DIGEST_CBLOCK_PBKDF2],
+ const sal_uInt8 *pSaltData, sal_uInt32 nSaltLen,
+ sal_uInt32 nCount, sal_uInt32 nIndex)
+{
+ /* T_i = F (P, S, c, i) */
+ sal_uInt8 U[DIGEST_CBLOCK_PBKDF2];
+ register sal_uInt32 i, k;
+
+ /* U_(1) = PRF (P, S || INDEX) */
+ rtl_digest_updateHMAC_SHA1 (hDigest, pSaltData, nSaltLen);
+ rtl_digest_updateHMAC_SHA1 (hDigest, &nIndex, sizeof(nIndex));
+ rtl_digest_getHMAC_SHA1 (hDigest, U, DIGEST_CBLOCK_PBKDF2);
+
+ /* T = U_(1) */
+ for (k = 0; k < DIGEST_CBLOCK_PBKDF2; k++) T[k] = U[k];
+
+ /* T ^= U_(2) ^ ... ^ U_(c) */
+ for (i = 1; i < nCount; i++)
+ {
+ /* U_(i) = PRF (P, U_(i-1)) */
+ rtl_digest_updateHMAC_SHA1 (hDigest, U, DIGEST_CBLOCK_PBKDF2);
+ rtl_digest_getHMAC_SHA1 (hDigest, U, DIGEST_CBLOCK_PBKDF2);
+
+ /* T ^= U_(i) */
+ for (k = 0; k < DIGEST_CBLOCK_PBKDF2; k++) T[k] ^= U[k];
+ }
+
+ rtl_zeroMemory (U, DIGEST_CBLOCK_PBKDF2);
+}
+
+/*========================================================================
+ *
+ * rtl_digest_PBKDF2 implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_digest_PBKDF2.
+ */
+rtlDigestError SAL_CALL rtl_digest_PBKDF2 (
+ sal_uInt8 *pKeyData , sal_uInt32 nKeyLen,
+ const sal_uInt8 *pPassData, sal_uInt32 nPassLen,
+ const sal_uInt8 *pSaltData, sal_uInt32 nSaltLen,
+ sal_uInt32 nCount)
+{
+ DigestHMAC_SHA1_Impl digest;
+ sal_uInt32 i = 1;
+
+ if ((pKeyData == NULL) || (pPassData == NULL) || (pSaltData == NULL))
+ return rtl_Digest_E_Argument;
+
+ digest.m_digest = __rtl_digest_HMAC_SHA1;
+ rtl_digest_initHMAC_SHA1 (&digest, pPassData, nPassLen);
+
+ /* DK = T_(1) || T_(2) || ... || T_(l) */
+ while (nKeyLen >= DIGEST_CBLOCK_PBKDF2)
+ {
+ /* T_(i) = F (P, S, c, i); DK ||= T_(i) */
+ __rtl_digest_updatePBKDF2 (
+ &digest, pKeyData,
+ pSaltData, nSaltLen,
+ nCount, OSL_NETDWORD(i));
+
+ /* Next 'KeyData' block */
+ pKeyData += DIGEST_CBLOCK_PBKDF2;
+ nKeyLen -= DIGEST_CBLOCK_PBKDF2;
+ i += 1;
+ }
+ if (nKeyLen > 0)
+ {
+ /* Last 'KeyData' block */
+ sal_uInt8 T[DIGEST_CBLOCK_PBKDF2];
+
+ /* T_i = F (P, S, c, i) */
+ __rtl_digest_updatePBKDF2 (
+ &digest, T,
+ pSaltData, nSaltLen,
+ nCount, OSL_NETDWORD(i));
+
+ /* DK ||= T_(i) */
+ rtl_copyMemory (pKeyData, T, nKeyLen);
+ rtl_zeroMemory (T, DIGEST_CBLOCK_PBKDF2);
+ }
+
+ rtl_zeroMemory (&digest, sizeof (digest));
+ return rtl_Digest_E_None;
+}
+
+/*========================================================================
+ *
+ * The End.
+ *
+ *======================================================================*/
diff --git a/sal/rtl/source/gen_makefile.cxx b/sal/rtl/source/gen_makefile.cxx
new file mode 100644
index 000000000000..0b11c11d06c9
--- /dev/null
+++ b/sal/rtl/source/gen_makefile.cxx
@@ -0,0 +1,41 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "macro.hxx"
+#include <stdio.h>
+
+int main()
+{
+ printf( "RTL_OS:=%s\n", THIS_OS );
+ printf( "RTL_ARCH:=%s\n", THIS_ARCH );
+ return 0;
+}
+
+
diff --git a/sal/rtl/source/hash.cxx b/sal/rtl/source/hash.cxx
new file mode 100644
index 000000000000..7caa2341ca11
--- /dev/null
+++ b/sal/rtl/source/hash.cxx
@@ -0,0 +1,113 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include "rtl/allocator.hxx"
+
+#include "hash.h"
+#include "strimp.h"
+
+
+#include <hash_set>
+
+namespace {
+
+struct UStringHash
+{
+ size_t operator()(rtl_uString * const &rString) const
+ { return (size_t)rtl_ustr_hashCode_WithLength( rString->buffer, rString->length ); }
+};
+
+struct UStringEqual
+{
+ sal_Bool operator() ( rtl_uString * const &pStringA,
+ rtl_uString * const &pStringB) const
+ {
+ if (pStringA == pStringB)
+ return true;
+ if (pStringA->length != pStringB->length)
+ return false;
+ return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length,
+ pStringB->buffer, pStringB->length);
+ }
+};
+
+typedef std::hash_set< rtl_uString *, UStringHash, UStringEqual,
+ rtl::Allocator<rtl_uString *> > StringHashTable;
+
+StringHashTable *
+getHashTable ()
+{
+ static StringHashTable *pInternPool = NULL;
+ if (pInternPool == NULL) {
+ static StringHashTable aImpl(1024);
+ pInternPool = &aImpl;
+ }
+ return pInternPool;
+}
+
+}
+
+extern "C" {
+
+rtl_uString *
+rtl_str_hash_intern (rtl_uString *pString,
+ int can_return)
+{
+ StringHashTable *pHash = getHashTable();
+ StringHashTable::iterator aIter;
+ aIter = pHash->find(pString);
+ if (aIter != pHash->end())
+ {
+ rtl_uString *pHashStr = *aIter;
+ rtl_uString_acquire (pHashStr);
+ return pHashStr;
+ }
+ if (!can_return)
+ {
+ rtl_uString *pCopy = NULL;
+ rtl_uString_newFromString( &pCopy, pString );
+ pString = pCopy;
+ if (!pString)
+ return NULL;
+ }
+
+ if (!SAL_STRING_IS_STATIC (pString))
+ pString->refCount |= SAL_STRING_INTERN_FLAG;
+ pHash->insert(pString);
+
+ return pString;
+}
+
+void
+rtl_str_hash_remove (rtl_uString *pString)
+{
+ getHashTable()->erase(pString);
+}
+
+}
diff --git a/sal/rtl/source/hash.h b/sal/rtl/source/hash.h
new file mode 100644
index 000000000000..2aadfb33efcd
--- /dev/null
+++ b/sal/rtl/source/hash.h
@@ -0,0 +1,21 @@
+#ifndef INCLUDED_RTL_SOURCE_HASH_H
+#define INCLUDED_RTL_SOURCE_HASH_H
+
+#include <sal/types.h>
+#include <rtl/ustring.h>
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* These functions are not multi-thread safe: */
+
+rtl_uString *rtl_str_hash_intern (rtl_uString *pString,
+ int can_return);
+void rtl_str_hash_remove (rtl_uString *pString);
+
+#if defined __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* INCLUDED_RTL_SOURCE_HASH_H */
diff --git a/sal/rtl/source/locale.c b/sal/rtl/source/locale.c
new file mode 100644
index 000000000000..89a8568f8478
--- /dev/null
+++ b/sal/rtl/source/locale.c
@@ -0,0 +1,362 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "rtl/locale.h"
+
+#include "osl/diagnose.h"
+#include "rtl/alloc.h"
+
+#include "internal/once.h"
+
+static sal_Int32 RTL_HASHTABLE_SIZE[] =
+{
+ 7, 31, 127, 251, 509, 1021, 2039, 4093
+};
+
+typedef struct rtl_hashentry RTL_HASHENTRY;
+
+struct rtl_hashentry
+{
+ rtl_Locale* Entry;
+ RTL_HASHENTRY* Next;
+};
+
+typedef struct rtl_hashtable
+{
+ sal_Int8 iSize;
+ sal_Int32 Size;
+ sal_Int32 Elements;
+ RTL_HASHENTRY** Table;
+} RTL_HASHTABLE;
+
+static RTL_HASHTABLE* g_pLocaleTable = NULL;
+
+static rtl_Locale* g_pDefaultLocale = NULL;
+
+static int rtl_locale_init (void);
+
+/*************************************************************************
+ */
+void rtl_hashentry_destroy(RTL_HASHENTRY* entry)
+{
+ rtl_uString_release(entry->Entry->Language);
+ rtl_uString_release(entry->Entry->Country);
+ rtl_uString_release(entry->Entry->Variant);
+ if (entry->Next)
+ rtl_hashentry_destroy(entry->Next);
+
+ rtl_freeMemory(entry->Entry);
+ rtl_freeMemory(entry);
+}
+
+void rtl_hashtable_destroy(RTL_HASHTABLE* table)
+{
+ sal_Int32 size = 0;
+
+ if (!table)
+ return;
+
+ size = table->Size;
+
+ while (size)
+ {
+ if (table->Table[size - 1])
+ rtl_hashentry_destroy(table->Table[size - 1]);
+ size--;
+ }
+
+ rtl_freeMemory(table->Table);
+ rtl_freeMemory(table);
+}
+
+void rtl_hashtable_init(RTL_HASHTABLE** table, sal_Int8 sizeIndex)
+{
+ sal_Int32 nSize = RTL_HASHTABLE_SIZE[sizeIndex];
+
+ if (*table)
+ rtl_hashtable_destroy(*table);
+
+ *table = (RTL_HASHTABLE*)rtl_allocateMemory( sizeof(RTL_HASHTABLE) );
+
+ (*table)->iSize = sizeIndex;
+ (*table)->Size = nSize;
+ (*table)->Elements = 0;
+ (*table)->Table = (RTL_HASHENTRY**)rtl_allocateMemory( (*table)->Size * sizeof(RTL_HASHENTRY*) );
+
+ while (nSize)
+ {
+ (*table)->Table[nSize - 1] = NULL;
+ nSize--;
+ }
+}
+
+sal_Int32 rtl_hashfunc(RTL_HASHTABLE* table, sal_Int32 key)
+{
+ return ( (sal_uInt32) key % table->Size);
+}
+
+sal_Bool rtl_hashtable_grow(RTL_HASHTABLE** table);
+
+rtl_Locale* rtl_hashtable_add(RTL_HASHTABLE** table, rtl_Locale* value)
+{
+ sal_Int32 key = 0;
+
+ if (!(*table))
+ return NULL;
+
+ if ((*table)->Elements > ((*table)->Size / 2))
+ rtl_hashtable_grow(table);
+
+ key = rtl_hashfunc(*table, value->HashCode);
+
+ if (!(*table)->Table[key])
+ {
+ RTL_HASHENTRY *newEntry = (RTL_HASHENTRY*)rtl_allocateMemory( sizeof(RTL_HASHENTRY) );
+ newEntry->Entry = value;
+ newEntry->Next = NULL;
+ (*table)->Table[key] = newEntry;
+ (*table)->Elements++;
+ return NULL;
+ } else
+ {
+ RTL_HASHENTRY *pEntry = (*table)->Table[key];
+ RTL_HASHENTRY *newEntry = NULL;
+
+ while (pEntry)
+ {
+ if (value->HashCode == pEntry->Entry->HashCode)
+ return pEntry->Entry;
+
+ if (!pEntry->Next)
+ break;
+
+ pEntry = pEntry->Next;
+ }
+
+ newEntry = (RTL_HASHENTRY*)rtl_allocateMemory( sizeof(RTL_HASHENTRY) );
+ newEntry->Entry = value;
+ newEntry->Next = NULL;
+ pEntry->Next = newEntry;
+ (*table)->Elements++;
+ return NULL;
+ }
+}
+
+sal_Bool rtl_hashtable_grow(RTL_HASHTABLE** table)
+{
+ RTL_HASHTABLE* pNewTable = NULL;
+ sal_Int32 i = 0;
+
+ rtl_hashtable_init(&pNewTable, (sal_Int8)((*table)->iSize + 1));
+
+ while (i < (*table)->Size)
+ {
+ if ((*table)->Table[i])
+ {
+ RTL_HASHENTRY *pNext;
+ RTL_HASHENTRY *pEntry = (*table)->Table[i];
+
+ rtl_hashtable_add(&pNewTable, pEntry->Entry);
+
+ while (pEntry->Next)
+ {
+ rtl_hashtable_add(&pNewTable, pEntry->Next->Entry);
+ pNext = pEntry->Next;
+ rtl_freeMemory(pEntry);
+ pEntry = pNext;
+ }
+
+ rtl_freeMemory(pEntry);
+ }
+ i++;
+ }
+
+ rtl_freeMemory((*table)->Table);
+ rtl_freeMemory((*table));
+ (*table) = pNewTable;
+
+ return sal_True;
+}
+
+sal_Bool rtl_hashtable_find(RTL_HASHTABLE * table, sal_Int32 key, sal_Int32 hashCode, rtl_Locale** pValue)
+{
+ if (!table)
+ return sal_False;
+
+ if (table->Table[key])
+ {
+ RTL_HASHENTRY *pEntry = table->Table[key];
+
+ while (pEntry && hashCode != pEntry->Entry->HashCode)
+ pEntry = pEntry->Next;
+
+ if (pEntry)
+ *pValue = pEntry->Entry;
+ else
+ return sal_False;
+ } else
+ return sal_False;
+
+ return sal_True;
+}
+
+/*************************************************************************
+ * rtl_locale_init
+ */
+static void rtl_locale_once_init (void)
+{
+ OSL_ASSERT(g_pLocaleTable == 0);
+ rtl_hashtable_init(&g_pLocaleTable, 1);
+}
+
+static int rtl_locale_init (void)
+{
+ static sal_once_type g_once = SAL_ONCE_INIT;
+ SAL_ONCE(&g_once, rtl_locale_once_init);
+ return (g_pLocaleTable != 0);
+}
+
+/*************************************************************************
+ * rtl_locale_fini
+ */
+#if defined(__GNUC__)
+static void rtl_locale_fini (void) __attribute__((destructor));
+#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+#pragma fini(rtl_locale_fini)
+static void rtl_locale_fini (void);
+#endif /* __GNUC__ || __SUNPRO_C */
+
+void rtl_locale_fini (void)
+{
+ if (g_pLocaleTable != 0)
+ {
+ rtl_hashtable_destroy (g_pLocaleTable);
+ g_pLocaleTable = 0;
+ }
+}
+
+/*************************************************************************
+ * rtl_locale_register
+ */
+rtl_Locale * SAL_CALL rtl_locale_register( const sal_Unicode * language, const sal_Unicode * country, const sal_Unicode * variant )
+{
+ sal_Unicode c = 0;
+ rtl_uString* sLanguage = NULL;
+ rtl_uString* sCountry = NULL;
+ rtl_uString* sVariant = NULL;
+ rtl_Locale *newLocale = NULL;
+ sal_Int32 hashCode = -1;
+ sal_Int32 key = 0;
+
+ if ( !country )
+ country = &c;
+ if ( !variant )
+ variant = &c;
+
+ if (!rtl_locale_init())
+ return NULL;
+
+ hashCode = rtl_ustr_hashCode(language) ^ rtl_ustr_hashCode(country) ^ rtl_ustr_hashCode(variant);
+ key = rtl_hashfunc(g_pLocaleTable, hashCode);
+
+ if (rtl_hashtable_find(g_pLocaleTable, key, hashCode, &newLocale))
+ return newLocale;
+
+ rtl_uString_newFromStr(&sLanguage, language);
+ rtl_uString_newFromStr(&sCountry, country);
+ rtl_uString_newFromStr(&sVariant, variant);
+
+ newLocale = (rtl_Locale*)rtl_allocateMemory( sizeof(rtl_Locale) );
+
+ newLocale->Language = sLanguage;
+ newLocale->Country = sCountry;
+ newLocale->Variant = sVariant;
+ newLocale->HashCode = hashCode;
+
+ rtl_hashtable_add(&g_pLocaleTable, newLocale);
+
+ return newLocale;
+}
+
+/*************************************************************************
+ * rtl_locale_getDefault
+ */
+rtl_Locale * SAL_CALL rtl_locale_getDefault()
+{
+ return g_pDefaultLocale;
+}
+
+/*************************************************************************
+ * rtl_locale_setDefault
+ */
+void SAL_CALL rtl_locale_setDefault( const sal_Unicode * language, const sal_Unicode * country, const sal_Unicode * variant )
+{
+ g_pDefaultLocale = rtl_locale_register(language, country, variant);
+}
+
+/*************************************************************************
+ * rtl_locale_getLanguage
+ */
+rtl_uString * SAL_CALL rtl_locale_getLanguage( rtl_Locale * This )
+{
+ rtl_uString_acquire(This->Language);
+ return This->Language;
+}
+
+/*************************************************************************
+ * rtl_locale_getCountry
+ */
+rtl_uString * SAL_CALL rtl_locale_getCountry( rtl_Locale * This )
+{
+ rtl_uString_acquire(This->Country);
+ return This->Country;
+}
+
+/*************************************************************************
+ * rtl_locale_getVariant
+ */
+rtl_uString * SAL_CALL rtl_locale_getVariant( rtl_Locale * This )
+{
+ rtl_uString_acquire(This->Variant);
+ return This->Variant;
+}
+
+/*************************************************************************
+ * rtl_locale_hashCode
+ */
+sal_Int32 SAL_CALL rtl_locale_hashCode( rtl_Locale * This )
+{
+ return This->HashCode;
+}
+
+/*************************************************************************
+ * rtl_locale_equals
+ */
+sal_Int32 SAL_CALL rtl_locale_equals( rtl_Locale * This, rtl_Locale * obj )
+{
+ return This == obj;
+}
diff --git a/sal/rtl/source/logfile.cxx b/sal/rtl/source/logfile.cxx
new file mode 100644
index 000000000000..56d5e5d5d68e
--- /dev/null
+++ b/sal/rtl/source/logfile.cxx
@@ -0,0 +1,254 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <cstdarg>
+#include <cstdio>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include <rtl/logfile.h>
+#include <osl/process.h>
+#ifndef _OSL_FILE_H_
+#include <osl/time.h>
+#endif
+#include <osl/time.h>
+#include <osl/mutex.hxx>
+#include <rtl/bootstrap.h>
+#include <rtl/ustring.hxx>
+#ifndef _RTL_STRBUF_HXX_
+#include <rtl/ustrbuf.hxx>
+#endif
+#include <rtl/alloc.h>
+#include "osl/thread.h"
+
+#include <algorithm>
+
+#ifdef _MSC_VER
+#define vsnprintf _vsnprintf
+#endif
+
+using namespace rtl;
+using namespace osl;
+using namespace std;
+
+namespace {
+
+static oslFileHandle g_aFile = 0;
+static sal_Bool g_bHasBeenCalled = sal_False;
+static const sal_Int32 g_BUFFERSIZE = 4096;
+static sal_Char *g_buffer = 0;
+
+class LoggerGuard
+{
+public:
+ ~LoggerGuard();
+};
+
+LoggerGuard::~LoggerGuard()
+{
+ if( g_buffer )
+ {
+ sal_Int64 nWritten, nConverted =
+ sprintf( g_buffer, "closing log file at %06" SAL_PRIuUINT32, osl_getGlobalTimer() );
+ if( nConverted > 0 )
+ osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64 *)&nWritten );
+ osl_closeFile( g_aFile );
+ g_aFile = 0;
+
+ rtl_freeMemory( g_buffer );
+ g_buffer = 0;
+ g_bHasBeenCalled = sal_False;
+ }
+}
+
+// The destructor of this static LoggerGuard is "activated" by the assignment to
+// g_buffer in init():
+LoggerGuard loggerGuard;
+
+Mutex & getLogMutex()
+{
+ static Mutex *pMutex = 0;
+ if( !pMutex )
+ {
+ MutexGuard guard( Mutex::getGlobalMutex() );
+ if( ! pMutex )
+ {
+ static Mutex mutex;
+ pMutex = &mutex;
+ }
+ }
+ return *pMutex;
+}
+
+OUString getFileUrl( const OUString &name )
+{
+ OUString aRet;
+ if ( osl_getFileURLFromSystemPath( name.pData, &aRet.pData )
+ != osl_File_E_None )
+ {
+ OSL_ASSERT( false );
+ }
+
+ OUString aWorkingDirectory;
+ osl_getProcessWorkingDir( &(aWorkingDirectory.pData) );
+ osl_getAbsoluteFileURL( aWorkingDirectory.pData, aRet.pData, &(aRet.pData) );
+
+ return aRet;
+}
+
+void init() {
+ if( !g_bHasBeenCalled )
+ {
+ MutexGuard guard( getLogMutex() );
+ if( ! g_bHasBeenCalled )
+ {
+ OUString name( RTL_CONSTASCII_USTRINGPARAM( "RTL_LOGFILE" ) );
+ OUString value;
+ if( rtl_bootstrap_get( name.pData, &value.pData, 0 ) )
+ {
+ // Obtain process id.
+ oslProcessIdentifier aProcessId = 0;
+ oslProcessInfo info;
+ info.Size = sizeof (oslProcessInfo);
+ if (osl_getProcessInfo (0, osl_Process_IDENTIFIER, &info) == osl_Process_E_None)
+ aProcessId = info.Ident;
+
+ // Construct name of log file and open the file.
+ OUStringBuffer buf( 128 );
+ buf.append( value );
+
+ // if the filename ends with .nopid, the incoming filename is not modified
+ if( value.getLength() < 6 /* ".nopid" */ ||
+ rtl_ustr_ascii_compare_WithLength(
+ value.getStr() + (value.getLength()-6) , 6 , ".nopid" ) )
+ {
+ buf.appendAscii( "_" );
+ buf.append( (sal_Int32) aProcessId );
+ buf.appendAscii( ".log" );
+ }
+
+ OUString o = getFileUrl( buf.makeStringAndClear() );
+ oslFileError e = osl_openFile(
+ o.pData, &g_aFile, osl_File_OpenFlag_Write|osl_File_OpenFlag_Create);
+
+ if( osl_File_E_None == e )
+ {
+ TimeValue aCurrentTime;
+ g_buffer = ( sal_Char * ) rtl_allocateMemory( g_BUFFERSIZE );
+ sal_Int64 nConverted = 0;
+ if (osl_getSystemTime (&aCurrentTime))
+ {
+ nConverted = (sal_Int64 ) sprintf (
+ g_buffer,
+ "opening log file %f seconds past January 1st 1970\n"
+ "corresponding to %" SAL_PRIuUINT32 " ms after timer start\n",
+ aCurrentTime.Seconds + 1e-9 * aCurrentTime.Nanosec,
+ osl_getGlobalTimer());
+
+ if( nConverted > 0 )
+ {
+ sal_Int64 nWritten;
+ osl_writeFile( g_aFile, g_buffer, nConverted , (sal_uInt64 *)&nWritten );
+ }
+ }
+
+ nConverted = sprintf (g_buffer, "Process id is %" SAL_PRIuUINT32 "\n", aProcessId);
+ if( nConverted )
+ {
+ sal_Int64 nWritten;
+ osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64 *)&nWritten );
+ }
+ }
+ else
+ {
+ OSL_TRACE( "Couldn't open logfile %s(%d)" , o.getStr(), e );
+ }
+ }
+ g_bHasBeenCalled = sal_True;
+ }
+ }
+}
+
+}
+
+extern "C" void SAL_CALL rtl_logfile_trace ( const char *pszFormat, ... )
+{
+ init();
+ if( g_buffer )
+ {
+ va_list args;
+ va_start(args, pszFormat);
+ {
+ sal_Int64 nConverted, nWritten;
+ MutexGuard guard( getLogMutex() );
+ nConverted = vsnprintf( g_buffer , g_BUFFERSIZE, pszFormat, args );
+ nConverted = (nConverted > g_BUFFERSIZE ? g_BUFFERSIZE : nConverted );
+ if( nConverted > 0 )
+ osl_writeFile( g_aFile, g_buffer, nConverted, (sal_uInt64*)&nWritten );
+ }
+ va_end(args);
+ }
+}
+
+extern "C" void SAL_CALL rtl_logfile_longTrace(char const * format, ...) {
+ init();
+ if (g_buffer != 0) {
+ sal_uInt32 time = osl_getGlobalTimer();
+ oslThreadIdentifier threadId = osl_getThreadIdentifier(0);
+ va_list args;
+ va_start(args, format);
+ {
+ MutexGuard g(getLogMutex());
+ int n1 = snprintf(
+ g_buffer, g_BUFFERSIZE, "%06" SAL_PRIuUINT32 " %" SAL_PRIuUINT32 " ", time, threadId);
+ if (n1 >= 0) {
+ sal_uInt64 n2;
+ osl_writeFile(
+ g_aFile, g_buffer,
+ static_cast< sal_uInt64 >(
+ std::min(n1, static_cast< int >(g_BUFFERSIZE))),
+ &n2);
+ n1 = vsnprintf(g_buffer, g_BUFFERSIZE, format, args);
+ if (n1 > 0) {
+ osl_writeFile(
+ g_aFile, g_buffer,
+ static_cast< sal_uInt64 >(
+ std::min(n1, static_cast< int >(g_BUFFERSIZE))),
+ &n2);
+ }
+ }
+ }
+ va_end(args);
+ }
+}
+
+extern "C" sal_Bool SAL_CALL rtl_logfile_hasLogFile( void ) {
+ init();
+ return g_buffer != 0;
+}
diff --git a/sal/rtl/source/macro.hxx b/sal/rtl/source/macro.hxx
new file mode 100644
index 000000000000..3fa0fbe58f42
--- /dev/null
+++ b/sal/rtl/source/macro.hxx
@@ -0,0 +1,110 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTL_MACRO_HXX
+#define _RTL_MACRO_HXX
+
+#include <rtl/bootstrap.h>
+#include <rtl/ustring.hxx>
+#include <osl/endian.h>
+
+#if defined WIN32
+#define THIS_OS "Windows"
+#elif defined OS2
+#define THIS_OS "OS2"
+#elif defined SOLARIS
+#define THIS_OS "Solaris"
+#elif defined LINUX
+#ifdef __FreeBSD_kernel__
+#define THIS_OS "kFreeBSD"
+#else
+#define THIS_OS "Linux"
+#endif
+#elif defined MACOSX
+#define THIS_OS "MacOSX"
+#elif defined NETBSD
+#define THIS_OS "NetBSD"
+#elif defined FREEBSD
+#define THIS_OS "FreeBSD"
+#endif
+
+#if ! defined THIS_OS
+#error "unknown OS -- insert your OS identifier above"
+this is inserted for the case that the preprocessor ignores error
+#endif
+
+#if defined X86_64
+# define THIS_ARCH "X86_64"
+#elif defined INTEL
+# define THIS_ARCH "x86"
+#elif defined POWERPC64
+# define THIS_ARCH "PowerPC_64"
+#elif defined POWERPC
+# define THIS_ARCH "PowerPC"
+#elif defined S390X
+# define THIS_ARCH "S390x"
+#elif defined S390
+# define THIS_ARCH "S390"
+#elif defined SPARC
+#if defined IS_LP64
+# define THIS_ARCH "SPARC64"
+#else
+# define THIS_ARCH "SPARC"
+#endif
+#elif defined MIPS
+# ifdef OSL_BIGENDIAN
+# define THIS_ARCH "MIPS_EB"
+# else
+# define THIS_ARCH "MIPS_EL"
+# endif
+#elif defined ARM
+# ifdef __ARM_EABI__
+# define THIS_ARCH "ARM_EABI"
+# else
+# define THIS_ARCH "ARM_OABI"
+# endif
+#elif defined IA64
+# define THIS_ARCH "IA64"
+#elif defined M68K
+# define THIS_ARCH "M68K"
+#elif defined HPPA
+# define THIS_ARCH "HPPA"
+#elif defined AXP
+# define THIS_ARCH "ALPHA"
+#endif
+
+#if ! defined THIS_ARCH
+#error "unknown ARCH -- insert your ARCH identifier above"
+this is inserted for the case that the preprocessor ignores error
+#endif
+
+#endif
+
+
+
+
+
diff --git a/sal/rtl/source/makefile.mk b/sal/rtl/source/makefile.mk
new file mode 100644
index 000000000000..9968d8992be4
--- /dev/null
+++ b/sal/rtl/source/makefile.mk
@@ -0,0 +1,198 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..
+
+PRJNAME=sal
+TARGET=cpprtl
+ENABLE_EXCEPTIONS=TRUE
+USE_LDUMP2=TRUE
+
+PROJECTPCH4DLL=TRUE
+PROJECTPCH=cont_pch
+PROJECTPCHSOURCE=cont_pch
+
+.IF "$(GUI)" == "OS2"
+STL_OS2_BUILDING=1
+.ENDIF
+
+TARGETTYPE=CUI
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+.IF "$(ALLOC)" == "SYS_ALLOC" || "$(ALLOC)" == "TCMALLOC" || "$(ALLOC)" == "JEMALLOC"
+CDEFS+= -DFORCE_SYSALLOC
+.ENDIF
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+# safe that way: gen_makefile doesn't want it,
+# no other link target here
+UWINAPILIB:=
+
+.IF "$(header)" == ""
+
+ALWAYSDBGFILES=$(SLO)$/debugprint.obj
+
+.IF "$(ALWAYSDBGFILES)" != ""
+ALWAYSDBGTARGET=do_it_alwaysdebug
+.ENDIF
+
+SLOFILES= \
+ $(SLO)$/memory.obj \
+ $(SLO)$/cipher.obj \
+ $(SLO)$/crc.obj \
+ $(SLO)$/digest.obj \
+ $(SLO)$/random.obj \
+ $(SLO)$/locale.obj \
+ $(SLO)$/strimp.obj \
+ $(SLO)$/hash.obj \
+ $(SLO)$/string.obj \
+ $(SLO)$/ustring.obj \
+ $(SLO)$/strbuf.obj \
+ $(SLO)$/ustrbuf.obj \
+ $(SLO)$/uuid.obj \
+ $(SLO)$/rtl_process.obj \
+ $(SLO)$/byteseq.obj \
+ $(SLO)$/uri.obj \
+ $(SLO)$/bootstrap.obj \
+ $(SLO)$/cmdargs.obj \
+ $(SLO)$/unload.obj \
+ $(SLO)$/logfile.obj \
+ $(SLO)$/tres.obj \
+ $(SLO)$/debugprint.obj \
+ $(SLO)$/math.obj \
+ $(SLO)$/alloc_global.obj\
+ $(SLO)$/alloc_cache.obj \
+ $(SLO)$/alloc_arena.obj
+
+.IF "$(OS)"=="MACOSX"
+SLOFILES+=$(SLO)$/memory_fini.obj
+.ENDIF
+
+
+#.IF "$(UPDATER)"=="YES"
+OBJFILES= \
+ $(OBJ)$/memory.obj \
+ $(OBJ)$/cipher.obj \
+ $(OBJ)$/crc.obj \
+ $(OBJ)$/digest.obj \
+ $(OBJ)$/random.obj \
+ $(OBJ)$/locale.obj \
+ $(OBJ)$/strimp.obj \
+ $(OBJ)$/hash.obj \
+ $(OBJ)$/string.obj \
+ $(OBJ)$/ustring.obj \
+ $(OBJ)$/strbuf.obj \
+ $(OBJ)$/ustrbuf.obj \
+ $(OBJ)$/uuid.obj \
+ $(OBJ)$/rtl_process.obj \
+ $(OBJ)$/byteseq.obj \
+ $(OBJ)$/uri.obj \
+ $(OBJ)$/bootstrap.obj \
+ $(OBJ)$/cmdargs.obj \
+ $(OBJ)$/unload.obj \
+ $(OBJ)$/logfile.obj \
+ $(OBJ)$/tres.obj \
+ $(OBJ)$/math.obj \
+ $(OBJ)$/alloc_global.obj\
+ $(OBJ)$/alloc_cache.obj \
+ $(OBJ)$/alloc_arena.obj
+
+.IF "$(OS)"=="MACOSX"
+OBJFILES+=$(OBJ)$/memory_fini.obj
+.ENDIF
+
+
+APP1TARGET=gen_makefile
+APP1OBJS=$(SLO)$/gen_makefile.obj
+APP1LIBSALCPPRT=
+APP1RPATH=NONE
+
+# --- Extra objs ----------------------------------------------------
+
+.IF "$(OS)"=="LINUX" || "$(OS)"=="OS2"
+
+#
+# This part builds a second version of alloc.c, with
+# FORCE_SYSALLOC defined. Is later used in util/makefile.mk
+# to build a tiny replacement lib to LD_PRELOAD into the
+# office, enabling e.g. proper valgrinding.
+#
+
+SECOND_BUILD=SYSALLOC
+SYSALLOC_SLOFILES= $(SLO)$/alloc_global.obj
+SYSALLOCCDEFS+=-DFORCE_SYSALLOC
+
+.ENDIF # .IF "$(OS)"=="LINUX"
+
+#.ENDIF
+
+.ENDIF
+
+# --- Makefile snippet --------------------------------------------
+
+# used by e.g. update info file
+BOOTSTRAPMK = $(OUT)$/inc$/rtlbootstrap.mk
+
+# --- Targets ------------------------------------------------------
+
+.IF "$(ALWAYSDBG_FLAG)"==""
+TARGETDEPS+=$(ALWAYSDBGTARGET)
+.ENDIF
+
+.INCLUDE : target.mk
+
+.IF "$(ALWAYSDBGTARGET)" != ""
+.IF "$(ALWAYSDBG_FLAG)" == ""
+# --------------------------------------------------
+# - ALWAYSDBG - files always compiled with debugging
+# --------------------------------------------------
+$(ALWAYSDBGTARGET):
+ @echo --- ALWAYSDBGFILES ---
+ @dmake $(MFLAGS) $(MAKEFILE) debug=true $(ALWAYSDBGFILES) ALWAYSDBG_FLAG=TRUE $(CALLMACROS)
+ @echo --- ALWAYSDBGFILES OVER ---
+
+$(ALWAYSDBGFILES):
+ @echo --- ALWAYSDBG ---
+ @dmake $(MFLAGS) $(MAKEFILE) debug=true ALWAYSDBG_FLAG=TRUE $(CALLMACROS) $@
+ @echo --- ALWAYSDBG OVER ---
+
+.ENDIF
+.ENDIF
+
+
+ALLTAR : $(BOOTSTRAPMK)
+
+$(BOOTSTRAPMK) : $(APP1TARGETN)
+ $(AUGMENT_LIBRARY_PATH) $< > $@
+
diff --git a/sal/rtl/source/math.cxx b/sal/rtl/source/math.cxx
new file mode 100644
index 000000000000..34b940a301c9
--- /dev/null
+++ b/sal/rtl/source/math.cxx
@@ -0,0 +1,1265 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "rtl/math.h"
+
+#include "osl/diagnose.h"
+#include "rtl/alloc.h"
+#include "rtl/math.hxx"
+#include "rtl/strbuf.h"
+#include "rtl/string.h"
+#include "rtl/ustrbuf.h"
+#include "rtl/ustring.h"
+#include "sal/mathconf.h"
+#include "sal/types.h"
+
+#include <algorithm>
+#include <float.h>
+#include <limits.h>
+#include <math.h>
+#include <stdlib.h>
+
+
+static int const n10Count = 16;
+static double const n10s[2][n10Count] = {
+ { 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8,
+ 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16 },
+ { 1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7, 1e-8,
+ 1e-9, 1e-10, 1e-11, 1e-12, 1e-13, 1e-14, 1e-15, 1e-16 }
+};
+
+// return pow(10.0,nExp) optimized for exponents in the interval [-16,16]
+static double getN10Exp( int nExp )
+{
+ if ( nExp < 0 )
+ {
+ if ( -nExp <= n10Count )
+ return n10s[1][-nExp-1];
+ else
+ return pow( 10.0, static_cast<double>( nExp ) );
+ }
+ else if ( nExp > 0 )
+ {
+ if ( nExp <= n10Count )
+ return n10s[0][nExp-1];
+ else
+ return pow( 10.0, static_cast<double>( nExp ) );
+ }
+ else // ( nExp == 0 )
+ return 1.0;
+}
+
+/** Approximation algorithm for erf for 0 < x < 0.65. */
+void lcl_Erf0065( double x, double& fVal )
+{
+ static const double pn[] = {
+ 1.12837916709551256,
+ 1.35894887627277916E-1,
+ 4.03259488531795274E-2,
+ 1.20339380863079457E-3,
+ 6.49254556481904354E-5
+ };
+ static const double qn[] = {
+ 1.00000000000000000,
+ 4.53767041780002545E-1,
+ 8.69936222615385890E-2,
+ 8.49717371168693357E-3,
+ 3.64915280629351082E-4
+ };
+ double fPSum = 0.0;
+ double fQSum = 0.0;
+ double fXPow = 1.0;
+ for ( unsigned int i = 0; i <= 4; ++i )
+ {
+ fPSum += pn[i]*fXPow;
+ fQSum += qn[i]*fXPow;
+ fXPow *= x*x;
+ }
+ fVal = x * fPSum / fQSum;
+}
+
+/** Approximation algorithm for erfc for 0.65 < x < 6.0. */
+void lcl_Erfc0600( double x, double& fVal )
+{
+ double fPSum = 0.0;
+ double fQSum = 0.0;
+ double fXPow = 1.0;
+ const double *pn;
+ const double *qn;
+
+ if ( x < 2.2 )
+ {
+ static const double pn22[] = {
+ 9.99999992049799098E-1,
+ 1.33154163936765307,
+ 8.78115804155881782E-1,
+ 3.31899559578213215E-1,
+ 7.14193832506776067E-2,
+ 7.06940843763253131E-3
+ };
+ static const double qn22[] = {
+ 1.00000000000000000,
+ 2.45992070144245533,
+ 2.65383972869775752,
+ 1.61876655543871376,
+ 5.94651311286481502E-1,
+ 1.26579413030177940E-1,
+ 1.25304936549413393E-2
+ };
+ pn = pn22;
+ qn = qn22;
+ }
+ else /* if ( x < 6.0 ) this is true, but the compiler does not know */
+ {
+ static const double pn60[] = {
+ 9.99921140009714409E-1,
+ 1.62356584489366647,
+ 1.26739901455873222,
+ 5.81528574177741135E-1,
+ 1.57289620742838702E-1,
+ 2.25716982919217555E-2
+ };
+ static const double qn60[] = {
+ 1.00000000000000000,
+ 2.75143870676376208,
+ 3.37367334657284535,
+ 2.38574194785344389,
+ 1.05074004614827206,
+ 2.78788439273628983E-1,
+ 4.00072964526861362E-2
+ };
+ pn = pn60;
+ qn = qn60;
+ }
+
+ for ( unsigned int i = 0; i < 6; ++i )
+ {
+ fPSum += pn[i]*fXPow;
+ fQSum += qn[i]*fXPow;
+ fXPow *= x;
+ }
+ fQSum += qn[6]*fXPow;
+ fVal = exp( -1.0*x*x )* fPSum / fQSum;
+}
+
+/** Approximation algorithm for erfc for 6.0 < x < 26.54 (but used for all
+ x > 6.0). */
+void lcl_Erfc2654( double x, double& fVal )
+{
+ static const double pn[] = {
+ 5.64189583547756078E-1,
+ 8.80253746105525775,
+ 3.84683103716117320E1,
+ 4.77209965874436377E1,
+ 8.08040729052301677
+ };
+ static const double qn[] = {
+ 1.00000000000000000,
+ 1.61020914205869003E1,
+ 7.54843505665954743E1,
+ 1.12123870801026015E2,
+ 3.73997570145040850E1
+ };
+
+ double fPSum = 0.0;
+ double fQSum = 0.0;
+ double fXPow = 1.0;
+
+ for ( unsigned int i = 0; i <= 4; ++i )
+ {
+ fPSum += pn[i]*fXPow;
+ fQSum += qn[i]*fXPow;
+ fXPow /= x*x;
+ }
+ fVal = exp(-1.0*x*x)*fPSum / (x*fQSum);
+}
+
+namespace {
+
+double const nKorrVal[] = {
+ 0, 9e-1, 9e-2, 9e-3, 9e-4, 9e-5, 9e-6, 9e-7, 9e-8,
+ 9e-9, 9e-10, 9e-11, 9e-12, 9e-13, 9e-14, 9e-15
+};
+
+struct StringTraits
+{
+ typedef sal_Char Char;
+
+ typedef rtl_String String;
+
+ static inline void createString(rtl_String ** pString,
+ sal_Char const * pChars, sal_Int32 nLen)
+ {
+ rtl_string_newFromStr_WithLength(pString, pChars, nLen);
+ }
+
+ static inline void createBuffer(rtl_String ** pBuffer,
+ sal_Int32 * pCapacity)
+ {
+ rtl_string_new_WithLength(pBuffer, *pCapacity);
+ }
+
+ static inline void appendChar(rtl_String ** pBuffer, sal_Int32 * pCapacity,
+ sal_Int32 * pOffset, sal_Char cChar)
+ {
+ rtl_stringbuffer_insert(pBuffer, pCapacity, *pOffset, &cChar, 1);
+ ++*pOffset;
+ }
+
+ static inline void appendChars(rtl_String ** pBuffer, sal_Int32 * pCapacity,
+ sal_Int32 * pOffset, sal_Char const * pChars,
+ sal_Int32 nLen)
+ {
+ rtl_stringbuffer_insert(pBuffer, pCapacity, *pOffset, pChars, nLen);
+ *pOffset += nLen;
+ }
+
+ static inline void appendAscii(rtl_String ** pBuffer, sal_Int32 * pCapacity,
+ sal_Int32 * pOffset, sal_Char const * pStr,
+ sal_Int32 nLen)
+ {
+ rtl_stringbuffer_insert(pBuffer, pCapacity, *pOffset, pStr, nLen);
+ *pOffset += nLen;
+ }
+};
+
+struct UStringTraits
+{
+ typedef sal_Unicode Char;
+
+ typedef rtl_uString String;
+
+ static inline void createString(rtl_uString ** pString,
+ sal_Unicode const * pChars, sal_Int32 nLen)
+ {
+ rtl_uString_newFromStr_WithLength(pString, pChars, nLen);
+ }
+
+ static inline void createBuffer(rtl_uString ** pBuffer,
+ sal_Int32 * pCapacity)
+ {
+ rtl_uString_new_WithLength(pBuffer, *pCapacity);
+ }
+
+ static inline void appendChar(rtl_uString ** pBuffer, sal_Int32 * pCapacity,
+ sal_Int32 * pOffset, sal_Unicode cChar)
+ {
+ rtl_uStringbuffer_insert(pBuffer, pCapacity, *pOffset, &cChar, 1);
+ ++*pOffset;
+ }
+
+ static inline void appendChars(rtl_uString ** pBuffer,
+ sal_Int32 * pCapacity, sal_Int32 * pOffset,
+ sal_Unicode const * pChars, sal_Int32 nLen)
+ {
+ rtl_uStringbuffer_insert(pBuffer, pCapacity, *pOffset, pChars, nLen);
+ *pOffset += nLen;
+ }
+
+ static inline void appendAscii(rtl_uString ** pBuffer,
+ sal_Int32 * pCapacity, sal_Int32 * pOffset,
+ sal_Char const * pStr, sal_Int32 nLen)
+ {
+ rtl_uStringbuffer_insert_ascii(pBuffer, pCapacity, *pOffset, pStr,
+ nLen);
+ *pOffset += nLen;
+ }
+};
+
+
+// Solaris C++ 5.2 compiler has problems when "StringT ** pResult" is
+// "typename T::String ** pResult" instead:
+template< typename T, typename StringT >
+inline void doubleToString(StringT ** pResult,
+ sal_Int32 * pResultCapacity, sal_Int32 nResultOffset,
+ double fValue, rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces, typename T::Char cDecSeparator,
+ sal_Int32 const * pGroups,
+ typename T::Char cGroupSeparator,
+ bool bEraseTrailingDecZeros)
+{
+ static double const nRoundVal[] = {
+ 5.0e+0, 0.5e+0, 0.5e-1, 0.5e-2, 0.5e-3, 0.5e-4, 0.5e-5, 0.5e-6,
+ 0.5e-7, 0.5e-8, 0.5e-9, 0.5e-10,0.5e-11,0.5e-12,0.5e-13,0.5e-14
+ };
+
+ // sign adjustment, instead of testing for fValue<0.0 this will also fetch
+ // -0.0
+ bool bSign = rtl::math::isSignBitSet( fValue );
+ if( bSign )
+ fValue = -fValue;
+
+ if ( rtl::math::isNan( fValue ) )
+ {
+ // #i112652# XMLSchema-2
+ sal_Int32 nCapacity = RTL_CONSTASCII_LENGTH("NaN");
+ if (pResultCapacity == 0)
+ {
+ pResultCapacity = &nCapacity;
+ T::createBuffer(pResult, pResultCapacity);
+ nResultOffset = 0;
+ }
+ T::appendAscii(pResult, pResultCapacity, &nResultOffset,
+ RTL_CONSTASCII_STRINGPARAM("NaN"));
+
+ return;
+ }
+
+ bool bHuge = fValue == HUGE_VAL; // g++ 3.0.1 requires it this way...
+ if ( bHuge || rtl::math::isInf( fValue ) )
+ {
+ // #i112652# XMLSchema-2
+ sal_Int32 nCapacity = RTL_CONSTASCII_LENGTH("-INF");
+ if (pResultCapacity == 0)
+ {
+ pResultCapacity = &nCapacity;
+ T::createBuffer(pResult, pResultCapacity);
+ nResultOffset = 0;
+ }
+ if ( bSign )
+ T::appendAscii(pResult, pResultCapacity, &nResultOffset,
+ RTL_CONSTASCII_STRINGPARAM("-"));
+ T::appendAscii(pResult, pResultCapacity, &nResultOffset,
+ RTL_CONSTASCII_STRINGPARAM("INF"));
+
+ return;
+ }
+
+ // find the exponent
+ int nExp = 0;
+ if ( fValue > 0.0 )
+ {
+ nExp = static_cast< int >( floor( log10( fValue ) ) );
+ fValue /= getN10Exp( nExp );
+ }
+
+ switch ( eFormat )
+ {
+ case rtl_math_StringFormat_Automatic :
+ { // E or F depending on exponent magnitude
+ int nPrec;
+ if ( nExp <= -15 || nExp >= 15 ) // #58531# was <-16, >16
+ {
+ nPrec = 14;
+ eFormat = rtl_math_StringFormat_E;
+ }
+ else
+ {
+ if ( nExp < 14 )
+ {
+ nPrec = 15 - nExp - 1;
+ eFormat = rtl_math_StringFormat_F;
+ }
+ else
+ {
+ nPrec = 15;
+ eFormat = rtl_math_StringFormat_F;
+ }
+ }
+ if ( nDecPlaces == rtl_math_DecimalPlaces_Max )
+ nDecPlaces = nPrec;
+ }
+ break;
+ case rtl_math_StringFormat_G :
+ { // G-Point, similar to sprintf %G
+ if ( nDecPlaces == rtl_math_DecimalPlaces_DefaultSignificance )
+ nDecPlaces = 6;
+ if ( nExp < -4 || nExp >= nDecPlaces )
+ {
+ nDecPlaces = std::max< sal_Int32 >( 1, nDecPlaces - 1 );
+ eFormat = rtl_math_StringFormat_E;
+ }
+ else
+ {
+ nDecPlaces = std::max< sal_Int32 >( 0, nDecPlaces - nExp - 1 );
+ eFormat = rtl_math_StringFormat_F;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ sal_Int32 nDigits = nDecPlaces + 1;
+
+ if( eFormat == rtl_math_StringFormat_F )
+ nDigits += nExp;
+
+ // Round the number
+ if( nDigits >= 0 )
+ {
+ if( ( fValue += nRoundVal[ nDigits > 15 ? 15 : nDigits ] ) >= 10 )
+ {
+ fValue = 1.0;
+ nExp++;
+ if( eFormat == rtl_math_StringFormat_F )
+ nDigits++;
+ }
+ }
+
+ static sal_Int32 const nBufMax = 256;
+ typename T::Char aBuf[nBufMax];
+ typename T::Char * pBuf;
+ sal_Int32 nBuf = static_cast< sal_Int32 >
+ ( nDigits <= 0 ? std::max< sal_Int32 >( nDecPlaces, abs(nExp) )
+ : nDigits + nDecPlaces ) + 10 + (pGroups ? abs(nDigits) * 2 : 0);
+ if ( nBuf > nBufMax )
+ {
+ pBuf = reinterpret_cast< typename T::Char * >(
+ rtl_allocateMemory(nBuf * sizeof (typename T::Char)));
+ OSL_ENSURE(pBuf != 0, "Out of memory");
+ }
+ else
+ pBuf = aBuf;
+ typename T::Char * p = pBuf;
+ if ( bSign )
+ *p++ = static_cast< typename T::Char >('-');
+
+ bool bHasDec = false;
+
+ int nDecPos;
+ // Check for F format and number < 1
+ if( eFormat == rtl_math_StringFormat_F )
+ {
+ if( nExp < 0 )
+ {
+ *p++ = static_cast< typename T::Char >('0');
+ if ( nDecPlaces > 0 )
+ {
+ *p++ = cDecSeparator;
+ bHasDec = true;
+ }
+ sal_Int32 i = ( nDigits <= 0 ? nDecPlaces : -nExp - 1 );
+ while( (i--) > 0 )
+ *p++ = static_cast< typename T::Char >('0');
+ nDecPos = 0;
+ }
+ else
+ nDecPos = nExp + 1;
+ }
+ else
+ nDecPos = 1;
+
+ int nGrouping = 0, nGroupSelector = 0, nGroupExceed = 0;
+ if ( nDecPos > 1 && pGroups && pGroups[0] && cGroupSeparator )
+ {
+ while ( nGrouping + pGroups[nGroupSelector] < nDecPos )
+ {
+ nGrouping += pGroups[ nGroupSelector ];
+ if ( pGroups[nGroupSelector+1] )
+ {
+ if ( nGrouping + pGroups[nGroupSelector+1] >= nDecPos )
+ break; // while
+ ++nGroupSelector;
+ }
+ else if ( !nGroupExceed )
+ nGroupExceed = nGrouping;
+ }
+ }
+
+ // print the number
+ if( nDigits > 0 )
+ {
+ for ( int i = 0; ; i++ )
+ {
+ if( i < 15 )
+ {
+ int nDigit;
+ if (nDigits-1 == 0 && i > 0 && i < 14)
+ nDigit = static_cast< int >( floor( fValue
+ + nKorrVal[15-i] ) );
+ else
+ nDigit = static_cast< int >( fValue + 1E-15 );
+ if (nDigit >= 10)
+ { // after-treatment of up-rounding to the next decade
+ sal_Int32 sLen = static_cast< long >(p-pBuf)-1;
+ if (sLen == -1)
+ {
+ p = pBuf;
+ if ( eFormat == rtl_math_StringFormat_F )
+ {
+ *p++ = static_cast< typename T::Char >('1');
+ *p++ = static_cast< typename T::Char >('0');
+ }
+ else
+ {
+ *p++ = static_cast< typename T::Char >('1');
+ *p++ = cDecSeparator;
+ *p++ = static_cast< typename T::Char >('0');
+ nExp++;
+ bHasDec = true;
+ }
+ }
+ else
+ {
+ for (sal_Int32 j = sLen; j >= 0; j--)
+ {
+ typename T::Char cS = pBuf[j];
+ if (cS != cDecSeparator)
+ {
+ if ( cS != static_cast< typename T::Char >('9'))
+ {
+ pBuf[j] = ++cS;
+ j = -1; // break loop
+ }
+ else
+ {
+ pBuf[j]
+ = static_cast< typename T::Char >('0');
+ if (j == 0)
+ {
+ if ( eFormat == rtl_math_StringFormat_F)
+ { // insert '1'
+ typename T::Char * px = p++;
+ while ( pBuf < px )
+ {
+ *px = *(px-1);
+ px--;
+ }
+ pBuf[0] = static_cast<
+ typename T::Char >('1');
+ }
+ else
+ {
+ pBuf[j] = static_cast<
+ typename T::Char >('1');
+ nExp++;
+ }
+ }
+ }
+ }
+ }
+ *p++ = static_cast< typename T::Char >('0');
+ }
+ fValue = 0.0;
+ }
+ else
+ {
+ *p++ = static_cast< typename T::Char >(
+ nDigit + static_cast< typename T::Char >('0') );
+ fValue = ( fValue - nDigit ) * 10.0;
+ }
+ }
+ else
+ *p++ = static_cast< typename T::Char >('0');
+ if( !--nDigits )
+ break; // for
+ if( nDecPos )
+ {
+ if( !--nDecPos )
+ {
+ *p++ = cDecSeparator;
+ bHasDec = true;
+ }
+ else if ( nDecPos == nGrouping )
+ {
+ *p++ = cGroupSeparator;
+ nGrouping -= pGroups[ nGroupSelector ];
+ if ( nGroupSelector && nGrouping < nGroupExceed )
+ --nGroupSelector;
+ }
+ }
+ }
+ }
+
+ if ( !bHasDec && eFormat == rtl_math_StringFormat_F )
+ { // nDecPlaces < 0 did round the value
+ while ( --nDecPos > 0 )
+ { // fill before decimal point
+ if ( nDecPos == nGrouping )
+ {
+ *p++ = cGroupSeparator;
+ nGrouping -= pGroups[ nGroupSelector ];
+ if ( nGroupSelector && nGrouping < nGroupExceed )
+ --nGroupSelector;
+ }
+ *p++ = static_cast< typename T::Char >('0');
+ }
+ }
+
+ if ( bEraseTrailingDecZeros && bHasDec && p > pBuf )
+ {
+ while ( *(p-1) == static_cast< typename T::Char >('0') )
+ p--;
+ if ( *(p-1) == cDecSeparator )
+ p--;
+ }
+
+ // Print the exponent ('E', followed by '+' or '-', followed by exactly
+ // three digits). The code in rtl_[u]str_valueOf{Float|Double} relies on
+ // this format.
+ if( eFormat == rtl_math_StringFormat_E )
+ {
+ if ( p == pBuf )
+ *p++ = static_cast< typename T::Char >('1');
+ // maybe no nDigits if nDecPlaces < 0
+ *p++ = static_cast< typename T::Char >('E');
+ if( nExp < 0 )
+ {
+ nExp = -nExp;
+ *p++ = static_cast< typename T::Char >('-');
+ }
+ else
+ *p++ = static_cast< typename T::Char >('+');
+// if (nExp >= 100 )
+ *p++ = static_cast< typename T::Char >(
+ nExp / 100 + static_cast< typename T::Char >('0') );
+ nExp %= 100;
+ *p++ = static_cast< typename T::Char >(
+ nExp / 10 + static_cast< typename T::Char >('0') );
+ *p++ = static_cast< typename T::Char >(
+ nExp % 10 + static_cast< typename T::Char >('0') );
+ }
+
+ if (pResultCapacity == 0)
+ T::createString(pResult, pBuf, p - pBuf);
+ else
+ T::appendChars(pResult, pResultCapacity, &nResultOffset, pBuf,
+ p - pBuf);
+
+ if ( pBuf != &aBuf[0] )
+ rtl_freeMemory(pBuf);
+}
+
+}
+
+void SAL_CALL rtl_math_doubleToString(rtl_String ** pResult,
+ sal_Int32 * pResultCapacity,
+ sal_Int32 nResultOffset, double fValue,
+ rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Char cDecSeparator,
+ sal_Int32 const * pGroups,
+ sal_Char cGroupSeparator,
+ sal_Bool bEraseTrailingDecZeros)
+ SAL_THROW_EXTERN_C()
+{
+ doubleToString< StringTraits, StringTraits::String >(
+ pResult, pResultCapacity, nResultOffset, fValue, eFormat, nDecPlaces,
+ cDecSeparator, pGroups, cGroupSeparator, bEraseTrailingDecZeros);
+}
+
+void SAL_CALL rtl_math_doubleToUString(rtl_uString ** pResult,
+ sal_Int32 * pResultCapacity,
+ sal_Int32 nResultOffset, double fValue,
+ rtl_math_StringFormat eFormat,
+ sal_Int32 nDecPlaces,
+ sal_Unicode cDecSeparator,
+ sal_Int32 const * pGroups,
+ sal_Unicode cGroupSeparator,
+ sal_Bool bEraseTrailingDecZeros)
+ SAL_THROW_EXTERN_C()
+{
+ doubleToString< UStringTraits, UStringTraits::String >(
+ pResult, pResultCapacity, nResultOffset, fValue, eFormat, nDecPlaces,
+ cDecSeparator, pGroups, cGroupSeparator, bEraseTrailingDecZeros);
+}
+
+
+namespace {
+
+// if nExp * 10 + nAdd would result in overflow
+inline bool long10Overflow( long& nExp, int nAdd )
+{
+ if ( nExp > (LONG_MAX/10)
+ || (nExp == (LONG_MAX/10) && nAdd > (LONG_MAX%10)) )
+ {
+ nExp = LONG_MAX;
+ return true;
+ }
+ return false;
+}
+
+// We are only concerned about ASCII arabic numerical digits here
+template< typename CharT >
+inline bool isDigit( CharT c )
+{
+ return 0x30 <= c && c <= 0x39;
+}
+
+template< typename CharT >
+inline double stringToDouble(CharT const * pBegin, CharT const * pEnd,
+ CharT cDecSeparator, CharT cGroupSeparator,
+ rtl_math_ConversionStatus * pStatus,
+ CharT const ** pParsedEnd)
+{
+ double fVal = 0.0;
+ rtl_math_ConversionStatus eStatus = rtl_math_ConversionStatus_Ok;
+
+ CharT const * p0 = pBegin;
+ while (p0 != pEnd && (*p0 == CharT(' ') || *p0 == CharT('\t')))
+ ++p0;
+ bool bSign;
+ if (p0 != pEnd && *p0 == CharT('-'))
+ {
+ bSign = true;
+ ++p0;
+ }
+ else
+ {
+ bSign = false;
+ if (p0 != pEnd && *p0 == CharT('+'))
+ ++p0;
+ }
+ CharT const * p = p0;
+ bool bDone = false;
+
+ // #i112652# XMLSchema-2
+ if (3 >= (pEnd - p))
+ {
+ if ((CharT('N') == p[0]) && (CharT('a') == p[1])
+ && (CharT('N') == p[2]))
+ {
+ p += 3;
+ rtl::math::setNan( &fVal );
+ bDone = true;
+ }
+ else if ((CharT('I') == p[0]) && (CharT('N') == p[1])
+ && (CharT('F') == p[2]))
+ {
+ p += 3;
+ fVal = HUGE_VAL;
+ eStatus = rtl_math_ConversionStatus_OutOfRange;
+ bDone = true;
+ }
+ }
+
+ if (!bDone) // do not recognize e.g. NaN1.23
+ {
+ // leading zeros and group separators may be safely ignored
+ while (p != pEnd && (*p == CharT('0') || *p == cGroupSeparator))
+ ++p;
+
+ long nValExp = 0; // carry along exponent of mantissa
+
+ // integer part of mantissa
+ for (; p != pEnd; ++p)
+ {
+ CharT c = *p;
+ if (isDigit(c))
+ {
+ fVal = fVal * 10.0 + static_cast< double >( c - CharT('0') );
+ ++nValExp;
+ }
+ else if (c != cGroupSeparator)
+ break;
+ }
+
+ // fraction part of mantissa
+ if (p != pEnd && *p == cDecSeparator)
+ {
+ ++p;
+ double fFrac = 0.0;
+ long nFracExp = 0;
+ while (p != pEnd && *p == CharT('0'))
+ {
+ --nFracExp;
+ ++p;
+ }
+ if ( nValExp == 0 )
+ nValExp = nFracExp - 1; // no integer part => fraction exponent
+ // one decimal digit needs ld(10) ~= 3.32 bits
+ static const int nSigs = (DBL_MANT_DIG / 3) + 1;
+ int nDigs = 0;
+ for (; p != pEnd; ++p)
+ {
+ CharT c = *p;
+ if (!isDigit(c))
+ break;
+ if ( nDigs < nSigs )
+ { // further digits (more than nSigs) don't have any
+ // significance
+ fFrac = fFrac * 10.0 + static_cast<double>(c - CharT('0'));
+ --nFracExp;
+ ++nDigs;
+ }
+ }
+ if ( fFrac != 0.0 )
+ fVal += rtl::math::pow10Exp( fFrac, nFracExp );
+ else if ( nValExp < 0 )
+ nValExp = 0; // no digit other than 0 after decimal point
+ }
+
+ if ( nValExp > 0 )
+ --nValExp; // started with offset +1 at the first mantissa digit
+
+ // Exponent
+ if (p != p0 && p != pEnd && (*p == CharT('E') || *p == CharT('e')))
+ {
+ ++p;
+ bool bExpSign;
+ if (p != pEnd && *p == CharT('-'))
+ {
+ bExpSign = true;
+ ++p;
+ }
+ else
+ {
+ bExpSign = false;
+ if (p != pEnd && *p == CharT('+'))
+ ++p;
+ }
+ if ( fVal == 0.0 )
+ { // no matter what follows, zero stays zero, but carry on the
+ // offset
+ while (p != pEnd && isDigit(*p))
+ ++p;
+ }
+ else
+ {
+ bool bOverFlow = false;
+ long nExp = 0;
+ for (; p != pEnd; ++p)
+ {
+ CharT c = *p;
+ if (!isDigit(c))
+ break;
+ int i = c - CharT('0');
+ if ( long10Overflow( nExp, i ) )
+ bOverFlow = true;
+ else
+ nExp = nExp * 10 + i;
+ }
+ if ( nExp )
+ {
+ if ( bExpSign )
+ nExp = -nExp;
+ long nAllExp = ( bOverFlow ? 0 : nExp + nValExp );
+ if ( nAllExp > DBL_MAX_10_EXP || (bOverFlow && !bExpSign) )
+ { // overflow
+ fVal = HUGE_VAL;
+ eStatus = rtl_math_ConversionStatus_OutOfRange;
+ }
+ else if ((nAllExp < DBL_MIN_10_EXP) ||
+ (bOverFlow && bExpSign) )
+ { // underflow
+ fVal = 0.0;
+ eStatus = rtl_math_ConversionStatus_OutOfRange;
+ }
+ else if ( nExp > DBL_MAX_10_EXP || nExp < DBL_MIN_10_EXP )
+ { // compensate exponents
+ fVal = rtl::math::pow10Exp( fVal, -nValExp );
+ fVal = rtl::math::pow10Exp( fVal, nAllExp );
+ }
+ else
+ fVal = rtl::math::pow10Exp( fVal, nExp ); // normal
+ }
+ }
+ }
+ else if (p - p0 == 2 && p != pEnd && p[0] == CharT('#')
+ && p[-1] == cDecSeparator && p[-2] == CharT('1'))
+ {
+ if (pEnd - p >= 4 && p[1] == CharT('I') && p[2] == CharT('N')
+ && p[3] == CharT('F'))
+ {
+ // "1.#INF", "+1.#INF", "-1.#INF"
+ p += 4;
+ fVal = HUGE_VAL;
+ eStatus = rtl_math_ConversionStatus_OutOfRange;
+ // Eat any further digits:
+ while (p != pEnd && isDigit(*p))
+ ++p;
+ }
+ else if (pEnd - p >= 4 && p[1] == CharT('N') && p[2] == CharT('A')
+ && p[3] == CharT('N'))
+ {
+ // "1.#NAN", "+1.#NAN", "-1.#NAN"
+ p += 4;
+ rtl::math::setNan( &fVal );
+ if (bSign)
+ {
+ union {
+ double sd;
+ sal_math_Double md;
+ } m;
+ m.sd = fVal;
+ m.md.w32_parts.msw |= 0x80000000; // create negative NaN
+ fVal = m.sd;
+ bSign = false; // don't negate again
+ }
+ // Eat any further digits:
+ while (p != pEnd && isDigit(*p))
+ ++p;
+ }
+ }
+ }
+
+ // overflow also if more than DBL_MAX_10_EXP digits without decimal
+ // separator, or 0. and more than DBL_MIN_10_EXP digits, ...
+ bool bHuge = fVal == HUGE_VAL; // g++ 3.0.1 requires it this way...
+ if ( bHuge )
+ eStatus = rtl_math_ConversionStatus_OutOfRange;
+
+ if ( bSign )
+ fVal = -fVal;
+
+ if (pStatus != 0)
+ *pStatus = eStatus;
+ if (pParsedEnd != 0)
+ *pParsedEnd = p == p0 ? pBegin : p;
+
+ return fVal;
+}
+
+}
+
+double SAL_CALL rtl_math_stringToDouble(sal_Char const * pBegin,
+ sal_Char const * pEnd,
+ sal_Char cDecSeparator,
+ sal_Char cGroupSeparator,
+ rtl_math_ConversionStatus * pStatus,
+ sal_Char const ** pParsedEnd)
+ SAL_THROW_EXTERN_C()
+{
+ return stringToDouble(pBegin, pEnd, cDecSeparator, cGroupSeparator, pStatus,
+ pParsedEnd);
+}
+
+double SAL_CALL rtl_math_uStringToDouble(sal_Unicode const * pBegin,
+ sal_Unicode const * pEnd,
+ sal_Unicode cDecSeparator,
+ sal_Unicode cGroupSeparator,
+ rtl_math_ConversionStatus * pStatus,
+ sal_Unicode const ** pParsedEnd)
+ SAL_THROW_EXTERN_C()
+{
+ return stringToDouble(pBegin, pEnd, cDecSeparator, cGroupSeparator, pStatus,
+ pParsedEnd);
+}
+
+double SAL_CALL rtl_math_round(double fValue, int nDecPlaces,
+ enum rtl_math_RoundingMode eMode)
+ SAL_THROW_EXTERN_C()
+{
+ OSL_ASSERT(nDecPlaces >= -20 && nDecPlaces <= 20);
+
+ if ( fValue == 0.0 )
+ return fValue;
+
+ // sign adjustment
+ bool bSign = rtl::math::isSignBitSet( fValue );
+ if ( bSign )
+ fValue = -fValue;
+
+ double fFac = 0;
+ if ( nDecPlaces != 0 )
+ {
+ // max 20 decimals, we don't have unlimited precision
+ // #38810# and no overflow on fValue*=fFac
+ if ( nDecPlaces < -20 || 20 < nDecPlaces || fValue > (DBL_MAX / 1e20) )
+ return bSign ? -fValue : fValue;
+
+ fFac = getN10Exp( nDecPlaces );
+ fValue *= fFac;
+ }
+ //else //! uninitialized fFac, not needed
+
+ switch ( eMode )
+ {
+ case rtl_math_RoundingMode_Corrected :
+ {
+ int nExp; // exponent for correction
+ if ( fValue > 0.0 )
+ nExp = static_cast<int>( floor( log10( fValue ) ) );
+ else
+ nExp = 0;
+ int nIndex = 15 - nExp;
+ if ( nIndex > 15 )
+ nIndex = 15;
+ else if ( nIndex <= 1 )
+ nIndex = 0;
+ fValue = floor( fValue + 0.5 + nKorrVal[nIndex] );
+ }
+ break;
+ case rtl_math_RoundingMode_Down :
+ fValue = rtl::math::approxFloor( fValue );
+ break;
+ case rtl_math_RoundingMode_Up :
+ fValue = rtl::math::approxCeil( fValue );
+ break;
+ case rtl_math_RoundingMode_Floor :
+ fValue = bSign ? rtl::math::approxCeil( fValue )
+ : rtl::math::approxFloor( fValue );
+ break;
+ case rtl_math_RoundingMode_Ceiling :
+ fValue = bSign ? rtl::math::approxFloor( fValue )
+ : rtl::math::approxCeil( fValue );
+ break;
+ case rtl_math_RoundingMode_HalfDown :
+ {
+ double f = floor( fValue );
+ fValue = ((fValue - f) <= 0.5) ? f : ceil( fValue );
+ }
+ break;
+ case rtl_math_RoundingMode_HalfUp :
+ {
+ double f = floor( fValue );
+ fValue = ((fValue - f) < 0.5) ? f : ceil( fValue );
+ }
+ break;
+ case rtl_math_RoundingMode_HalfEven :
+#if defined FLT_ROUNDS
+/*
+ Use fast version. FLT_ROUNDS may be defined to a function by some compilers!
+
+ DBL_EPSILON is the smallest fractional number which can be represented,
+ its reciprocal is therefore the smallest number that cannot have a
+ fractional part. Once you add this reciprocal to `x', its fractional part
+ is stripped off. Simply subtracting the reciprocal back out returns `x'
+ without its fractional component.
+ Simple, clever, and elegant - thanks to Ross Cottrell, the original author,
+ who placed it into public domain.
+
+ volatile: prevent compiler from being too smart
+*/
+ if ( FLT_ROUNDS == 1 )
+ {
+ volatile double x = fValue + 1.0 / DBL_EPSILON;
+ fValue = x - 1.0 / DBL_EPSILON;
+ }
+ else
+#endif // FLT_ROUNDS
+ {
+ double f = floor( fValue );
+ if ( (fValue - f) != 0.5 )
+ fValue = floor( fValue + 0.5 );
+ else
+ {
+ double g = f / 2.0;
+ fValue = (g == floor( g )) ? f : (f + 1.0);
+ }
+ }
+ break;
+ default:
+ OSL_ASSERT(false);
+ break;
+ }
+
+ if ( nDecPlaces != 0 )
+ fValue /= fFac;
+
+ return bSign ? -fValue : fValue;
+}
+
+
+double SAL_CALL rtl_math_pow10Exp(double fValue, int nExp) SAL_THROW_EXTERN_C()
+{
+ return fValue * getN10Exp( nExp );
+}
+
+
+double SAL_CALL rtl_math_approxValue( double fValue ) SAL_THROW_EXTERN_C()
+{
+ if (fValue == 0.0 || fValue == HUGE_VAL || !::rtl::math::isFinite( fValue))
+ // We don't handle these conditions. Bail out.
+ return fValue;
+
+ double fOrigValue = fValue;
+
+ bool bSign = ::rtl::math::isSignBitSet( fValue);
+ if (bSign)
+ fValue = -fValue;
+
+ int nExp = static_cast<int>( floor( log10( fValue)));
+ nExp = 14 - nExp;
+ double fExpValue = getN10Exp( nExp);
+
+ fValue *= fExpValue;
+ // If the original value was near DBL_MIN we got an overflow. Restore and
+ // bail out.
+ if (!rtl::math::isFinite( fValue))
+ return fOrigValue;
+ fValue = rtl_math_round( fValue, 0, rtl_math_RoundingMode_Corrected);
+ fValue /= fExpValue;
+ // If the original value was near DBL_MAX we got an overflow. Restore and
+ // bail out.
+ if (!rtl::math::isFinite( fValue))
+ return fOrigValue;
+
+ return bSign ? -fValue : fValue;
+}
+
+
+double SAL_CALL rtl_math_expm1( double fValue ) SAL_THROW_EXTERN_C()
+{
+ double fe = exp( fValue );
+ if (fe == 1.0)
+ return fValue;
+ if (fe-1.0 == -1.0)
+ return -1.0;
+ return (fe-1.0) * fValue / log(fe);
+}
+
+
+double SAL_CALL rtl_math_log1p( double fValue ) SAL_THROW_EXTERN_C()
+{
+ // Use volatile because a compiler may be too smart "optimizing" the
+ // condition such that in certain cases the else path was called even if
+ // (fp==1.0) was true, where the term (fp-1.0) then resulted in 0.0 and
+ // hence the entire expression resulted in NaN.
+ // Happened with g++ 3.4.1 and an input value of 9.87E-18
+ volatile double fp = 1.0 + fValue;
+ if (fp == 1.0)
+ return fValue;
+ else
+ return log(fp) * fValue / (fp-1.0);
+}
+
+
+double SAL_CALL rtl_math_atanh( double fValue ) SAL_THROW_EXTERN_C()
+{
+ return 0.5 * rtl_math_log1p( 2.0 * fValue / (1.0-fValue) );
+}
+
+
+/** Parent error function (erf) that calls different algorithms based on the
+ value of x. It takes care of cases where x is negative as erf is an odd
+ function i.e. erf(-x) = -erf(x).
+
+ Kramer, W., and Blomquist, F., 2000, Algorithms with Guaranteed Error Bounds
+ for the Error Function and the Complementary Error Function
+
+ http://www.math.uni-wuppertal.de/wrswt/literatur_en.html
+
+ @author Kohei Yoshida <kohei@openoffice.org>
+
+ @see #i55735#
+ */
+double SAL_CALL rtl_math_erf( double x ) SAL_THROW_EXTERN_C()
+{
+ if( x == 0.0 )
+ return 0.0;
+
+ bool bNegative = false;
+ if ( x < 0.0 )
+ {
+ x = fabs( x );
+ bNegative = true;
+ }
+
+ double fErf = 1.0;
+ if ( x < 1.0e-10 )
+ fErf = (double) (x*1.1283791670955125738961589031215452L);
+ else if ( x < 0.65 )
+ lcl_Erf0065( x, fErf );
+ else
+ fErf = 1.0 - rtl_math_erfc( x );
+
+ if ( bNegative )
+ fErf *= -1.0;
+
+ return fErf;
+}
+
+
+/** Parent complementary error function (erfc) that calls different algorithms
+ based on the value of x. It takes care of cases where x is negative as erfc
+ satisfies relationship erfc(-x) = 2 - erfc(x). See the comment for Erf(x)
+ for the source publication.
+
+ @author Kohei Yoshida <kohei@openoffice.org>
+
+ @see #i55735#, moved from module scaddins (#i97091#)
+
+ */
+double SAL_CALL rtl_math_erfc( double x ) SAL_THROW_EXTERN_C()
+{
+ if ( x == 0.0 )
+ return 1.0;
+
+ bool bNegative = false;
+ if ( x < 0.0 )
+ {
+ x = fabs( x );
+ bNegative = true;
+ }
+
+ double fErfc = 0.0;
+ if ( x >= 0.65 )
+ {
+ if ( x < 6.0 )
+ lcl_Erfc0600( x, fErfc );
+ else
+ lcl_Erfc2654( x, fErfc );
+ }
+ else
+ fErfc = 1.0 - rtl_math_erf( x );
+
+ if ( bNegative )
+ fErfc = 2.0 - fErfc;
+
+ return fErfc;
+}
+
+/** improved accuracy of asinh for |x| large and for x near zero
+ @see #i97605#
+ */
+double SAL_CALL rtl_math_asinh( double fX ) SAL_THROW_EXTERN_C()
+{
+ double fSign = 1.0;
+ if ( fX == 0.0 )
+ return 0.0;
+ else
+ {
+ if ( fX < 0.0 )
+ {
+ fX = - fX;
+ fSign = -1.0;
+ }
+ if ( fX < 0.125 )
+ return fSign * rtl_math_log1p( fX + fX*fX / (1.0 + sqrt( 1.0 + fX*fX)));
+ else if ( fX < 1.25e7 )
+ return fSign * log( fX + sqrt( 1.0 + fX*fX));
+ else
+ return fSign * log( 2.0*fX);
+ }
+}
+
+/** improved accuracy of acosh for x large and for x near 1
+ @see #i97605#
+ */
+double SAL_CALL rtl_math_acosh( double fX ) SAL_THROW_EXTERN_C()
+{
+ volatile double fZ = fX - 1.0;
+ if ( fX < 1.0 )
+ {
+ double fResult;
+ ::rtl::math::setNan( &fResult );
+ return fResult;
+ }
+ else if ( fX == 1.0 )
+ return 0.0;
+ else if ( fX < 1.1 )
+ return rtl_math_log1p( fZ + sqrt( fZ*fZ + 2.0*fZ));
+ else if ( fX < 1.25e7 )
+ return log( fX + sqrt( fX*fX - 1.0));
+ else
+ return log( 2.0*fX);
+}
diff --git a/sal/rtl/source/memory.c b/sal/rtl/source/memory.c
new file mode 100644
index 000000000000..a92d4201bd32
--- /dev/null
+++ b/sal/rtl/source/memory.c
@@ -0,0 +1,62 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include <string.h>
+#include <rtl/memory.h>
+
+void SAL_CALL rtl_zeroMemory(void *Ptr, sal_Size Bytes)
+{
+ memset(Ptr, 0, Bytes);
+}
+
+void SAL_CALL rtl_fillMemory(void *Ptr, sal_Size Bytes, sal_uInt8 Fill)
+{
+ memset(Ptr, Fill, Bytes);
+}
+
+void SAL_CALL rtl_copyMemory(void *Dst, const void *Src, sal_Size Bytes)
+{
+ memcpy(Dst, Src, Bytes);
+}
+
+void SAL_CALL rtl_moveMemory(void *Dst, const void *Src, sal_Size Bytes)
+{
+ memmove(Dst, Src, Bytes);
+}
+
+sal_Int32 SAL_CALL rtl_compareMemory(const void *MemA, const void *MemB, sal_Size Bytes)
+{
+ return memcmp(MemA, MemB, Bytes);
+}
+
+void* SAL_CALL rtl_findInMemory(const void *MemA, sal_uInt8 ch, sal_Size Bytes)
+{
+ return memchr(MemA, ch, Bytes);
+}
+
+
diff --git a/sal/rtl/source/memory_fini.cxx b/sal/rtl/source/memory_fini.cxx
new file mode 100755
index 000000000000..f88f09887595
--- /dev/null
+++ b/sal/rtl/source/memory_fini.cxx
@@ -0,0 +1,54 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+/*
+ Issue http://udk.openoffice.org/issues/show_bug.cgi?id=92388
+
+ Mac OS X does not seem to support "__cxa__atexit", thus leading
+ to the situation that "__attribute__((destructor))__" functions
+ (in particular "rtl_memory_fini") become called _before_ global
+ C++ object d'tors.
+
+ Using a C++ dummy object instead.
+*/
+
+#include <stdio.h>
+
+extern "C" void rtl_memory_fini (void);
+
+
+struct RTL_Memory_Fini {
+ ~RTL_Memory_Fini() ;
+};
+
+RTL_Memory_Fini::~RTL_Memory_Fini() {
+ rtl_memory_fini();
+}
+
+
+static RTL_Memory_Fini rtl_Memory_Fini;
diff --git a/sal/rtl/source/random.c b/sal/rtl/source/random.c
new file mode 100644
index 000000000000..3ee911942684
--- /dev/null
+++ b/sal/rtl/source/random.c
@@ -0,0 +1,338 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define _RTL_RANDOM_C_ "$Revision: 1.6 $"
+
+#include <sal/types.h>
+#include <osl/thread.h>
+#include <osl/time.h>
+#include <rtl/alloc.h>
+#include <rtl/digest.h>
+#include <rtl/random.h>
+#include <osl/time.h>
+
+/*========================================================================
+ *
+ * rtlRandom internals.
+ *
+ *======================================================================*/
+#define RTL_RANDOM_RNG_1(a) ((a) * 16807L)
+#define RTL_RANDOM_RNG_2(a) ((a) * 65539L)
+
+#define RTL_RANDOM_RNG(x, y, z) \
+{ \
+ (x) = 170 * ((x) % 178) - 63 * ((x) / 178); \
+ if ((x) < 0) (x) += 30328L; \
+ \
+ (y) = 171 * ((y) % 177) - 2 * ((y) / 177); \
+ if ((y) < 0) (y) += 30269L; \
+ \
+ (z) = 172 * ((z) % 176) - 35 * ((z) / 176); \
+ if ((z) < 0) (z) += 30307L; \
+}
+
+/** RandomData_Impl.
+ */
+typedef struct random_data_impl_st
+{
+ sal_Int16 m_nX;
+ sal_Int16 m_nY;
+ sal_Int16 m_nZ;
+} RandomData_Impl;
+
+/** __rtl_random_data.
+ */
+static double __rtl_random_data (RandomData_Impl *pImpl);
+
+/** RandomPool_Impl.
+ */
+#define RTL_RANDOM_DIGEST rtl_Digest_AlgorithmMD5
+#define RTL_RANDOM_SIZE_DIGEST RTL_DIGEST_LENGTH_MD5
+#define RTL_RANDOM_SIZE_POOL 1023
+
+typedef struct random_pool_impl_st
+{
+ rtlDigest m_hDigest;
+ sal_uInt8 m_pDigest[RTL_RANDOM_SIZE_DIGEST];
+ sal_uInt8 m_pData[RTL_RANDOM_SIZE_POOL + 1];
+ sal_uInt32 m_nData;
+ sal_uInt32 m_nIndex;
+ sal_uInt32 m_nCount;
+} RandomPool_Impl;
+
+/** __rtl_random_initPool.
+ */
+static sal_Bool __rtl_random_initPool (
+ RandomPool_Impl *pImpl);
+
+/** __rtl_random_seedPool.
+ */
+static void __rtl_random_seedPool (
+ RandomPool_Impl *pImpl, const sal_uInt8 *pBuffer, sal_Size nBufLen);
+
+/** __rtl_random_readPool.
+ */
+static void __rtl_random_readPool (
+ RandomPool_Impl *pImpl, sal_uInt8 *pBuffer, sal_Size nBufLen);
+
+/*
+ * __rtl_random_data.
+ */
+static double __rtl_random_data (RandomData_Impl *pImpl)
+{
+ register double random;
+
+ RTL_RANDOM_RNG (pImpl->m_nX, pImpl->m_nY, pImpl->m_nZ);
+ random = (((double)(pImpl->m_nX) / 30328.0) +
+ ((double)(pImpl->m_nY) / 30269.0) +
+ ((double)(pImpl->m_nZ) / 30307.0) );
+
+ random -= ((double)((sal_uInt32)(random)));
+ return (random);
+}
+
+/*
+ * __rtl_random_initPool.
+ */
+static sal_Bool __rtl_random_initPool (RandomPool_Impl *pImpl)
+{
+ pImpl->m_hDigest = rtl_digest_create (RTL_RANDOM_DIGEST);
+ if (pImpl->m_hDigest)
+ {
+ oslThreadIdentifier id;
+ TimeValue tv;
+ RandomData_Impl rd;
+ double seed;
+
+ /* The use of uninitialized stack variables as a way to
+ * enhance the entropy of the random pool triggers
+ * memory checkers like purify and valgrind.
+ */
+
+ /*
+ __rtl_random_seedPool (pImpl, (sal_uInt8*)&id, sizeof(id));
+ __rtl_random_seedPool (pImpl, (sal_uInt8*)&tv, sizeof(tv));
+ __rtl_random_seedPool (pImpl, (sal_uInt8*)&rd, sizeof(rd));
+ */
+
+ id = osl_getThreadIdentifier (NULL);
+ id = RTL_RANDOM_RNG_2(RTL_RANDOM_RNG_1(id));
+ __rtl_random_seedPool (pImpl, (sal_uInt8*)&id, sizeof(id));
+
+ osl_getSystemTime (&tv);
+ tv.Seconds = RTL_RANDOM_RNG_2(tv.Seconds);
+ tv.Nanosec = RTL_RANDOM_RNG_2(tv.Nanosec);
+ __rtl_random_seedPool (pImpl, (sal_uInt8*)&tv, sizeof(tv));
+
+ rd.m_nX = (sal_Int16)(((id >> 1) << 1) + 1);
+ rd.m_nY = (sal_Int16)(((tv.Seconds >> 1) << 1) + 1);
+ rd.m_nZ = (sal_Int16)(((tv.Nanosec >> 1) << 1) + 1);
+ __rtl_random_seedPool (pImpl, (sal_uInt8*)&rd, sizeof(rd));
+
+ while (pImpl->m_nData < RTL_RANDOM_SIZE_POOL)
+ {
+ seed = __rtl_random_data (&rd);
+ __rtl_random_seedPool (pImpl, (sal_uInt8*)&seed, sizeof(seed));
+ }
+ return sal_True;
+ }
+ return sal_False;
+}
+
+/*
+ * __rtl_random_seedPool.
+ */
+static void __rtl_random_seedPool (
+ RandomPool_Impl *pImpl, const sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ sal_Size i;
+ sal_sSize j, k;
+
+ for (i = 0; i < nBufLen; i += RTL_RANDOM_SIZE_DIGEST)
+ {
+ j = nBufLen - i;
+ if (j > RTL_RANDOM_SIZE_DIGEST)
+ j = RTL_RANDOM_SIZE_DIGEST;
+
+ rtl_digest_update (
+ pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST);
+
+ k = (pImpl->m_nIndex + j) - RTL_RANDOM_SIZE_POOL;
+ if (k > 0)
+ {
+ rtl_digest_update (
+ pImpl->m_hDigest, &(pImpl->m_pData[pImpl->m_nIndex]), j - k);
+ rtl_digest_update (
+ pImpl->m_hDigest, &(pImpl->m_pData[0]), k);
+ }
+ else
+ {
+ rtl_digest_update (
+ pImpl->m_hDigest, &(pImpl->m_pData[pImpl->m_nIndex]), j);
+ }
+
+ rtl_digest_update (pImpl->m_hDigest, pBuffer, j);
+ pBuffer += j;
+
+ rtl_digest_get (
+ pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST);
+ for (k = 0; k < j; k++)
+ {
+ pImpl->m_pData[pImpl->m_nIndex++] ^= pImpl->m_pDigest[k];
+ if (pImpl->m_nIndex >= RTL_RANDOM_SIZE_POOL)
+ {
+ pImpl->m_nData = RTL_RANDOM_SIZE_POOL;
+ pImpl->m_nIndex = 0;
+ }
+ }
+ }
+
+ if (pImpl->m_nIndex > pImpl->m_nData)
+ pImpl->m_nData = pImpl->m_nIndex;
+}
+
+/*
+ * __rtl_random_readPool.
+ */
+static void __rtl_random_readPool (
+ RandomPool_Impl *pImpl, sal_uInt8 *pBuffer, sal_Size nBufLen)
+{
+ sal_Int32 j, k;
+
+ while (nBufLen > 0)
+ {
+ j = nBufLen;
+ if (j > RTL_RANDOM_SIZE_DIGEST/2)
+ j = RTL_RANDOM_SIZE_DIGEST/2;
+ nBufLen -= j;
+
+ rtl_digest_update (
+ pImpl->m_hDigest,
+ &(pImpl->m_pDigest[RTL_RANDOM_SIZE_DIGEST/2]),
+ RTL_RANDOM_SIZE_DIGEST/2);
+
+ k = (pImpl->m_nIndex + j) - pImpl->m_nData;
+ if (k > 0)
+ {
+ rtl_digest_update (
+ pImpl->m_hDigest, &(pImpl->m_pData[pImpl->m_nIndex]), j - k);
+ rtl_digest_update (
+ pImpl->m_hDigest, &(pImpl->m_pData[0]), k);
+ }
+ else
+ {
+ rtl_digest_update (
+ pImpl->m_hDigest, &(pImpl->m_pData[pImpl->m_nIndex]), j);
+ }
+
+ rtl_digest_get (
+ pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST);
+ for (k = 0; k < j; k++)
+ {
+ if (pImpl->m_nIndex >= pImpl->m_nData) pImpl->m_nIndex = 0;
+ pImpl->m_pData[pImpl->m_nIndex++] ^= pImpl->m_pDigest[k];
+ *pBuffer++ = pImpl->m_pDigest[k + RTL_RANDOM_SIZE_DIGEST/2];
+ }
+ }
+
+ pImpl->m_nCount++;
+ rtl_digest_update (
+ pImpl->m_hDigest, &(pImpl->m_nCount), sizeof(pImpl->m_nCount));
+ rtl_digest_update (
+ pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST);
+ rtl_digest_get (
+ pImpl->m_hDigest, pImpl->m_pDigest, RTL_RANDOM_SIZE_DIGEST);
+}
+
+/*========================================================================
+ *
+ * rtlRandom implementation.
+ *
+ *======================================================================*/
+/*
+ * rtl_random_createPool.
+ */
+rtlRandomPool SAL_CALL rtl_random_createPool (void)
+{
+ RandomPool_Impl *pImpl = (RandomPool_Impl*)NULL;
+ pImpl = (RandomPool_Impl*)rtl_allocateZeroMemory (sizeof(RandomPool_Impl));
+ if (pImpl)
+ {
+ if (!__rtl_random_initPool (pImpl))
+ {
+ rtl_freeZeroMemory (pImpl, sizeof(RandomPool_Impl));
+ pImpl = (RandomPool_Impl*)NULL;
+ }
+ }
+ return ((rtlRandomPool)pImpl);
+}
+
+/*
+ * rtl_random_destroyPool.
+ */
+void SAL_CALL rtl_random_destroyPool (rtlRandomPool Pool)
+{
+ RandomPool_Impl *pImpl = (RandomPool_Impl *)Pool;
+ if (pImpl)
+ {
+ rtl_digest_destroy (pImpl->m_hDigest);
+ rtl_freeZeroMemory (pImpl, sizeof (RandomPool_Impl));
+ }
+}
+
+/*
+ * rtl_random_addBytes.
+ */
+rtlRandomError SAL_CALL rtl_random_addBytes (
+ rtlRandomPool Pool, const void *Buffer, sal_Size Bytes)
+{
+ RandomPool_Impl *pImpl = (RandomPool_Impl *)Pool;
+ const sal_uInt8 *pBuffer = (const sal_uInt8 *)Buffer;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Random_E_Argument;
+
+ __rtl_random_seedPool (pImpl, pBuffer, Bytes);
+ return rtl_Random_E_None;
+}
+
+/*
+ * rtl_random_getBytes.
+ */
+rtlRandomError SAL_CALL rtl_random_getBytes (
+ rtlRandomPool Pool, void *Buffer, sal_Size Bytes)
+{
+ RandomPool_Impl *pImpl = (RandomPool_Impl *)Pool;
+ sal_uInt8 *pBuffer = (sal_uInt8 *)Buffer;
+
+ if ((pImpl == NULL) || (pBuffer == NULL))
+ return rtl_Random_E_Argument;
+
+ __rtl_random_readPool (pImpl, pBuffer, Bytes);
+ return rtl_Random_E_None;
+}
+
diff --git a/sal/rtl/source/rtl_process.c b/sal/rtl/source/rtl_process.c
new file mode 100644
index 000000000000..d70c92c17cee
--- /dev/null
+++ b/sal/rtl/source/rtl_process.c
@@ -0,0 +1,49 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include <string.h>
+#include <osl/mutex.h>
+#include <rtl/uuid.h>
+
+/* rtl_getCommandArg, rtl_getCommandArgCount see cmdargs.cxx */
+
+void SAL_CALL rtl_getGlobalProcessId( sal_uInt8 *pTargetUUID )
+{
+ static sal_uInt8 *pUuid = 0;
+ if( ! pUuid )
+ {
+ osl_acquireMutex( * osl_getGlobalMutex() );
+ if( ! pUuid )
+ {
+ static sal_uInt8 aUuid[16];
+ rtl_createUuid( aUuid , 0 , sal_False );
+ pUuid = aUuid;
+ }
+ osl_releaseMutex( * osl_getGlobalMutex() );
+ }
+ memcpy( pTargetUUID , pUuid , 16 );
+}
+
diff --git a/sal/rtl/source/strbuf.c b/sal/rtl/source/strbuf.c
new file mode 100644
index 000000000000..09dd83f8b32f
--- /dev/null
+++ b/sal/rtl/source/strbuf.c
@@ -0,0 +1,147 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <osl/interlck.h>
+
+#ifndef _RTL_STRING_HXX_
+#include <rtl/strbuf.hxx>
+#endif
+#include <rtl/memory.h>
+
+/*
+#include <rtl/alloc.h>
+*/
+
+
+
+/*************************************************************************
+ * rtl_stringbuffer_newFromStr_WithLength
+ */
+void SAL_CALL rtl_stringbuffer_newFromStr_WithLength( rtl_String ** newStr,
+ const sal_Char * value,
+ sal_Int32 count )
+{
+ if (!value)
+ {
+ rtl_string_new_WithLength( newStr, 16 );
+ return;
+ }
+
+ rtl_string_new_WithLength( newStr, count + 16 );
+ (*newStr)->length = count;
+ rtl_copyMemory( (*newStr)->buffer, value, count );
+ return;
+}
+
+/*************************************************************************
+ * rtl_stringbuffer_newFromStringBuffer
+ */
+sal_Int32 SAL_CALL rtl_stringbuffer_newFromStringBuffer( rtl_String ** newStr,
+ sal_Int32 capacity,
+ rtl_String * oldStr )
+{
+ sal_Int32 newCapacity = capacity;
+
+ if (newCapacity < oldStr->length)
+ newCapacity = oldStr->length;
+
+ rtl_string_new_WithLength( newStr, newCapacity );
+ if (oldStr->length > 0) {
+ (*newStr)->length = oldStr->length;
+ rtl_copyMemory( (*newStr)->buffer, oldStr->buffer, oldStr->length );
+ }
+ return newCapacity;
+}
+
+/*************************************************************************
+ * rtl_stringbuffer_ensureCapacity
+ */
+void SAL_CALL rtl_stringbuffer_ensureCapacity
+ (rtl_String ** This, sal_Int32* capacity, sal_Int32 minimumCapacity)
+{
+ if (minimumCapacity > *capacity)
+ {
+ rtl_String * pTmp = *This;
+ rtl_String * pNew = NULL;
+ *capacity = ((*This)->length + 1) * 2;
+ if (minimumCapacity > *capacity)
+ /* still lower, set to the minimum capacity */
+ *capacity = minimumCapacity;
+
+ rtl_string_new_WithLength(&pNew, *capacity);
+ pNew->length = (*This)->length;
+ *This = pNew;
+
+ rtl_copyMemory( (*This)->buffer, pTmp->buffer, pTmp->length );
+ rtl_string_release( pTmp );
+ }
+}
+
+/*************************************************************************
+ * rtl_stringbuffer_insert
+ */
+void SAL_CALL rtl_stringbuffer_insert( rtl_String ** This,
+ sal_Int32 * capacity,
+ sal_Int32 offset,
+ const sal_Char * str,
+ sal_Int32 len )
+{
+ sal_Int32 nOldLen;
+ sal_Char * pBuf;
+ sal_Int32 n;
+ if( len != 0 )
+ {
+ if (*capacity < (*This)->length + len)
+ rtl_stringbuffer_ensureCapacity( This, capacity, (*This)->length + len );
+
+ /*
+ if( len == 1 )
+ This->buffer
+ */
+ nOldLen = (*This)->length;
+ pBuf = (*This)->buffer;
+
+ /* copy the tail */
+ n = (nOldLen - offset);
+ if( n == 1 )
+ /* optimized for 1 character */
+ pBuf[offset + len] = pBuf[offset];
+ else if( n > 1 )
+ rtl_moveMemory( pBuf + offset + len, pBuf + offset, n * sizeof(sal_Char) );
+
+ /* insert the new characters */
+ n = len;
+ if( len == 1 )
+ /* optimized for 1 character */
+ pBuf[offset] = *str;
+ else if( n > 1 )
+ rtl_copyMemory( pBuf + offset, str, len * sizeof(sal_Char) );
+ (*This)->length = nOldLen + len;
+ pBuf[ nOldLen + len ] = 0;
+ }
+}
+
diff --git a/sal/rtl/source/strimp.c b/sal/rtl/source/strimp.c
new file mode 100644
index 000000000000..993969700a88
--- /dev/null
+++ b/sal/rtl/source/strimp.c
@@ -0,0 +1,58 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "strimp.h"
+
+sal_Int16 rtl_ImplGetDigit( sal_Unicode ch, sal_Int16 nRadix )
+{
+ sal_Int16 n = -1;
+ if ( (ch >= '0') && (ch <= '9') )
+ n = ch-'0';
+ else if ( (ch >= 'a') && (ch <= 'z') )
+ n = ch-'a'+10;
+ else if ( (ch >= 'A') && (ch <= 'Z') )
+ n = ch-'A'+10;
+ return (n < nRadix) ? n : -1;
+}
+
+sal_Bool rtl_ImplIsWhitespace( sal_Unicode c )
+{
+ /* Space or Control character? */
+ if ( (c <= 32) && c )
+ return sal_True;
+
+ /* Only in the General Punctuation area Space or Control characters are included? */
+ if ( (c < 0x2000) || (c > 0x206F) )
+ return sal_False;
+
+ if ( ((c >= 0x2000) && (c <= 0x200B)) || /* All Spaces */
+ (c == 0x2028) || /* LINE SEPARATOR */
+ (c == 0x2029) ) /* PARAGRAPH SEPARATOR */
+ return sal_True;
+
+ return sal_False;
+}
diff --git a/sal/rtl/source/strimp.h b/sal/rtl/source/strimp.h
new file mode 100644
index 000000000000..533b7087a652
--- /dev/null
+++ b/sal/rtl/source/strimp.h
@@ -0,0 +1,64 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_SOURCE_STRIMP_H
+#define INCLUDED_RTL_SOURCE_STRIMP_H
+
+#include <osl/interlck.h>
+
+#include "sal/types.h"
+
+/* ======================================================================= */
+/* Help functions for String and UString */
+/* ======================================================================= */
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * refCount is opaqueincludes 2 bit-fields;
+ * MSB: 'interned' - is stored in the intern hash
+ * MSB-1: 'static' - is a const / static string,
+ * do no ref counting
+ */
+#define SAL_STRING_INTERN_FLAG 0x80000000
+#define SAL_STRING_STATIC_FLAG 0x40000000
+#define SAL_STRING_REFCOUNT(a) ((a) & 0x3fffffff)
+
+#define SAL_STRING_IS_INTERN(a) ((a)->refCount & SAL_STRING_INTERN_FLAG)
+#define SAL_STRING_IS_STATIC(a) ((a)->refCount & SAL_STRING_STATIC_FLAG)
+
+sal_Int16 rtl_ImplGetDigit( sal_Unicode ch, sal_Int16 nRadix );
+
+sal_Bool rtl_ImplIsWhitespace( sal_Unicode c );
+
+#if defined __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* INCLUDED_RTL_SOURCE_STRIMP_H */
diff --git a/sal/rtl/source/string.c b/sal/rtl/source/string.c
new file mode 100644
index 000000000000..c0f9a33c218b
--- /dev/null
+++ b/sal/rtl/source/string.c
@@ -0,0 +1,320 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4738) // storing 32-bit float result in memory, possible loss of performance
+#endif
+
+#include <rtl/memory.h>
+#include <osl/interlck.h>
+#include <rtl/alloc.h>
+#include <osl/diagnose.h>
+#include <rtl/tencinfo.h>
+
+#include "strimp.h"
+#include "surrogates.h"
+#include <rtl/string.h>
+
+#include "rtl/math.h"
+#include "rtl/tencinfo.h"
+
+/* ======================================================================= */
+
+/* static data to be referenced by all empty strings
+ * the refCount is predefined to 1 and must never become 0 !
+ */
+static rtl_String const aImplEmpty_rtl_String =
+{
+ SAL_STRING_STATIC_FLAG|1,
+ /* sal_Int32 refCount; */
+ 0, /* sal_Int32 length; */
+ { 0 } /* sal_Char buffer[1]; */
+};
+
+/* ======================================================================= */
+
+#define IMPL_RTL_STRCODE sal_Char
+#define IMPL_RTL_USTRCODE( c ) ((unsigned char)c)
+#define IMPL_RTL_STRNAME( n ) rtl_str_ ## n
+
+#define IMPL_RTL_STRINGNAME( n ) rtl_string_ ## n
+#define IMPL_RTL_STRINGDATA rtl_String
+#define IMPL_RTL_EMPTYSTRING aImplEmpty_rtl_String
+
+/* ======================================================================= */
+
+/* Include String/UString template code */
+
+#include "strtmpl.c"
+
+sal_Int32 SAL_CALL rtl_str_valueOfFloat(sal_Char * pStr, float f)
+{
+ rtl_String * pResult = NULL;
+ sal_Int32 nLen;
+ rtl_math_doubleToString(
+ &pResult, 0, 0, f, rtl_math_StringFormat_G,
+ RTL_STR_MAX_VALUEOFFLOAT - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0, 0,
+ sal_True);
+ nLen = pResult->length;
+ OSL_ASSERT(nLen < RTL_STR_MAX_VALUEOFFLOAT);
+ rtl_copyMemory(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Char));
+ rtl_string_release(pResult);
+ return nLen;
+}
+
+sal_Int32 SAL_CALL rtl_str_valueOfDouble(sal_Char * pStr, double d)
+{
+ rtl_String * pResult = NULL;
+ sal_Int32 nLen;
+ rtl_math_doubleToString(
+ &pResult, 0, 0, d, rtl_math_StringFormat_G,
+ RTL_STR_MAX_VALUEOFDOUBLE - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0,
+ 0, sal_True);
+ nLen = pResult->length;
+ OSL_ASSERT(nLen < RTL_STR_MAX_VALUEOFDOUBLE);
+ rtl_copyMemory(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Char));
+ rtl_string_release(pResult);
+ return nLen;
+}
+
+float SAL_CALL rtl_str_toFloat(sal_Char const * pStr)
+{
+ return (float) rtl_math_stringToDouble(pStr, pStr + rtl_str_getLength(pStr),
+ '.', 0, 0, 0);
+}
+
+double SAL_CALL rtl_str_toDouble(sal_Char const * pStr)
+{
+ return rtl_math_stringToDouble(pStr, pStr + rtl_str_getLength(pStr), '.', 0,
+ 0, 0);
+}
+
+/* ======================================================================= */
+
+static int rtl_ImplGetFastUTF8ByteLen( const sal_Unicode* pStr, sal_Int32 nLen )
+{
+ int n;
+ sal_Unicode c;
+ sal_uInt32 nUCS4Char;
+ const sal_Unicode* pEndStr;
+
+ n = 0;
+ pEndStr = pStr+nLen;
+ while ( pStr < pEndStr )
+ {
+ c = *pStr;
+
+ if ( c < 0x80 )
+ n++;
+ else if ( c < 0x800 )
+ n += 2;
+ else
+ {
+ if ( !SAL_RTL_IS_HIGH_SURROGATE(c) )
+ n += 3;
+ else
+ {
+ nUCS4Char = c;
+
+ if ( pStr+1 < pEndStr )
+ {
+ c = *(pStr+1);
+ if ( SAL_RTL_IS_LOW_SURROGATE(c) )
+ {
+ nUCS4Char = SAL_RTL_COMBINE_SURROGATES(nUCS4Char, c);
+ pStr++;
+ }
+ }
+
+ if ( nUCS4Char < 0x10000 )
+ n += 3;
+ else if ( nUCS4Char < 0x200000 )
+ n += 4;
+ else if ( nUCS4Char < 0x4000000 )
+ n += 5;
+ else
+ n += 6;
+ }
+ }
+
+ pStr++;
+ }
+
+ return n;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Bool SAL_CALL rtl_impl_convertUStringToString(rtl_String ** pTarget,
+ sal_Unicode const * pSource,
+ sal_Int32 nLength,
+ rtl_TextEncoding nEncoding,
+ sal_uInt32 nFlags,
+ sal_Bool bCheckErrors)
+{
+ OSL_ASSERT(pTarget != NULL
+ && (pSource != NULL || nLength == 0)
+ && nLength >= 0
+ && rtl_isOctetTextEncoding(nEncoding));
+
+ if ( !nLength )
+ rtl_string_new( pTarget );
+ else
+ {
+ rtl_String* pTemp;
+ rtl_UnicodeToTextConverter hConverter;
+ sal_uInt32 nInfo;
+ sal_Size nSrcChars;
+ sal_Size nDestBytes;
+ sal_Size nNewLen;
+ sal_Size nNotConvertedChars;
+ sal_Size nMaxCharLen;
+
+ /* Optimization for UTF-8 - we try to calculate the exact length */
+ /* For all other encoding we try an good estimation */
+ if ( nEncoding == RTL_TEXTENCODING_UTF8 )
+ {
+ nNewLen = rtl_ImplGetFastUTF8ByteLen( pSource, nLength );
+ /* Includes the string only ASCII, then we could copy
+ the buffer faster */
+ if ( nNewLen == (sal_Size)nLength )
+ {
+ IMPL_RTL_STRCODE* pBuffer;
+ if ( *pTarget )
+ IMPL_RTL_STRINGNAME( release )( *pTarget );
+ *pTarget = IMPL_RTL_STRINGNAME( ImplAlloc )( nLength );
+ OSL_ASSERT(*pTarget != NULL);
+ pBuffer = (*pTarget)->buffer;
+ do
+ {
+ /* Check ASCII range */
+ OSL_ENSURE( *pSource <= 127,
+ "rtl_uString2String() - UTF8 test is encoding is wrong" );
+
+ *pBuffer = (IMPL_RTL_STRCODE)(unsigned char)*pSource;
+ pBuffer++;
+ pSource++;
+ nLength--;
+ }
+ while ( nLength );
+ return sal_True;
+ }
+
+ nMaxCharLen = 4;
+ }
+ else
+ {
+ rtl_TextEncodingInfo aTextEncInfo;
+ aTextEncInfo.StructSize = sizeof( aTextEncInfo );
+ if ( !rtl_getTextEncodingInfo( nEncoding, &aTextEncInfo ) )
+ {
+ aTextEncInfo.AverageCharSize = 1;
+ aTextEncInfo.MaximumCharSize = 8;
+ }
+
+ nNewLen = nLength*aTextEncInfo.AverageCharSize;
+ nMaxCharLen = aTextEncInfo.MaximumCharSize;
+ }
+
+ nFlags |= RTL_UNICODETOTEXT_FLAGS_FLUSH;
+ hConverter = rtl_createUnicodeToTextConverter( nEncoding );
+
+ for (;;)
+ {
+ pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
+ OSL_ASSERT(pTemp != NULL);
+ nDestBytes = rtl_convertUnicodeToText( hConverter, 0,
+ pSource, nLength,
+ pTemp->buffer, nNewLen,
+ nFlags,
+ &nInfo, &nSrcChars );
+ if (bCheckErrors && (nInfo & RTL_UNICODETOTEXT_INFO_ERROR) != 0)
+ {
+ rtl_freeMemory(pTemp);
+ rtl_destroyUnicodeToTextConverter(hConverter);
+ return sal_False;
+ }
+
+ if ((nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL) == 0)
+ break;
+
+ /* Buffer not big enough, try again with enough space */
+ rtl_freeMemory( pTemp );
+
+ /* Try with the max. count of characters with
+ additional overhead for replacing functionality */
+ nNotConvertedChars = nLength-nSrcChars;
+ nNewLen = nDestBytes+(nNotConvertedChars*nMaxCharLen)+nNotConvertedChars+4;
+ }
+
+ /* Set the buffer to the correct size or is there to
+ much overhead, reallocate to the correct size */
+ if ( nNewLen > nDestBytes+8 )
+ {
+ rtl_String* pTemp2 = IMPL_RTL_STRINGNAME( ImplAlloc )( nDestBytes );
+ OSL_ASSERT(pTemp2 != NULL);
+ rtl_str_ImplCopy( pTemp2->buffer, pTemp->buffer, nDestBytes );
+ rtl_freeMemory( pTemp );
+ pTemp = pTemp2;
+ }
+ else
+ {
+ pTemp->length = nDestBytes;
+ pTemp->buffer[nDestBytes] = 0;
+ }
+
+ rtl_destroyUnicodeToTextConverter( hConverter );
+ if ( *pTarget )
+ IMPL_RTL_STRINGNAME( release )( *pTarget );
+ *pTarget = pTemp;
+
+ /* Results the conversion in an empty buffer -
+ create an empty string */
+ if ( pTemp && !nDestBytes )
+ rtl_string_new( pTarget );
+ }
+ return sal_True;
+}
+
+void SAL_CALL rtl_uString2String( rtl_String** ppThis,
+ const sal_Unicode* pUStr,
+ sal_Int32 nULen,
+ rtl_TextEncoding eTextEncoding,
+ sal_uInt32 nCvtFlags )
+{
+ rtl_impl_convertUStringToString(ppThis, pUStr, nULen, eTextEncoding,
+ nCvtFlags, sal_False);
+}
+
+sal_Bool SAL_CALL rtl_convertUStringToString(rtl_String ** pTarget,
+ sal_Unicode const * pSource,
+ sal_Int32 nLength,
+ rtl_TextEncoding nEncoding,
+ sal_uInt32 nFlags)
+{
+ return rtl_impl_convertUStringToString(pTarget, pSource, nLength, nEncoding,
+ nFlags, sal_True);
+}
diff --git a/sal/rtl/source/strtmpl.c b/sal/rtl/source/strtmpl.c
new file mode 100644
index 000000000000..8c60583b14cc
--- /dev/null
+++ b/sal/rtl/source/strtmpl.c
@@ -0,0 +1,1567 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+/* Internal C-String help functions which could be used without the */
+/* String-Class */
+/* ======================================================================= */
+
+/*
+inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* pDest,
+ const IMPL_RTL_STRCODE* pSrc,
+ sal_Int32 nCount )
+{
+ while ( nCount > 0 )
+ {
+ *pDest = *pSrc;
+ pDest++;
+ pSrc++;
+ nCount--;
+ }
+}
+*/
+
+#define rtl_str_ImplCopy( _pDest, _pSrc, _nCount ) \
+{ \
+ IMPL_RTL_STRCODE* __mm_pDest = _pDest; \
+ const IMPL_RTL_STRCODE* __mm_pSrc = _pSrc; \
+ sal_Int32 __mm_nCount = _nCount; \
+ while ( __mm_nCount > 0 ) \
+ { \
+ *__mm_pDest = *__mm_pSrc; \
+ __mm_pDest++; \
+ __mm_pSrc++; \
+ __mm_nCount--; \
+ } \
+}
+
+/* ======================================================================= */
+/* C-String functions which could be used without the String-Class */
+/* ======================================================================= */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( getLength )( const IMPL_RTL_STRCODE* pStr )
+{
+ const IMPL_RTL_STRCODE* pTempStr = pStr;
+ while( *pTempStr )
+ pTempStr++;
+ return pTempStr-pStr;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare )( const IMPL_RTL_STRCODE* pStr1,
+ const IMPL_RTL_STRCODE* pStr2 )
+{
+ sal_Int32 nRet;
+ while ( ((nRet = ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr1)))-
+ ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr2)))) == 0) &&
+ *pStr2 )
+ {
+ pStr1++;
+ pStr2++;
+ }
+
+ return nRet;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
+ sal_Int32 nStr1Len,
+ const IMPL_RTL_STRCODE* pStr2,
+ sal_Int32 nStr2Len )
+{
+ sal_Int32 nRet = nStr1Len - nStr2Len;
+ int nCount = (nRet <= 0) ? nStr1Len : nStr2Len;
+
+ --pStr1;
+ --pStr2;
+ while( (--nCount >= 0) && (*++pStr1 == *++pStr2) );
+
+ if( nCount >= 0 )
+ nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))
+ - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
+
+ return nRet;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
+ sal_Int32 nStr1Len,
+ const IMPL_RTL_STRCODE* pStr2,
+ sal_Int32 nStr2Len,
+ sal_Int32 nShortenedLength )
+{
+ const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
+ const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
+ sal_Int32 nRet;
+ while ( (nShortenedLength > 0) &&
+ (pStr1 < pStr1End) && (pStr2 < pStr2End) )
+ {
+ nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))-
+ ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
+ if ( nRet )
+ return nRet;
+
+ nShortenedLength--;
+ pStr1++;
+ pStr2++;
+ }
+
+ if ( nShortenedLength <= 0 )
+ return 0;
+ return nStr1Len - nStr2Len;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( reverseCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
+ sal_Int32 nStr1Len,
+ const IMPL_RTL_STRCODE* pStr2,
+ sal_Int32 nStr2Len )
+{
+ const IMPL_RTL_STRCODE* pStr1Run = pStr1+nStr1Len;
+ const IMPL_RTL_STRCODE* pStr2Run = pStr2+nStr2Len;
+ sal_Int32 nRet;
+ while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) )
+ {
+ pStr1Run--;
+ pStr2Run--;
+ nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1Run )))-
+ ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2Run )));
+ if ( nRet )
+ return nRet;
+ }
+
+ return nStr1Len - nStr2Len;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase )( const IMPL_RTL_STRCODE* pStr1,
+ const IMPL_RTL_STRCODE* pStr2 )
+{
+ sal_Int32 nRet;
+ sal_Int32 c1;
+ sal_Int32 c2;
+ do
+ {
+ /* If character between 'A' and 'Z', than convert it to lowercase */
+ c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
+ c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
+ if ( (c1 >= 65) && (c1 <= 90) )
+ c1 += 32;
+ if ( (c2 >= 65) && (c2 <= 90) )
+ c2 += 32;
+ nRet = c1-c2;
+ if ( nRet != 0 )
+ return nRet;
+
+ pStr1++;
+ pStr2++;
+ }
+ while ( c2 );
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
+ sal_Int32 nStr1Len,
+ const IMPL_RTL_STRCODE* pStr2,
+ sal_Int32 nStr2Len )
+{
+ const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
+ const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
+ sal_Int32 nRet;
+ sal_Int32 c1;
+ sal_Int32 c2;
+ while ( (pStr1 < pStr1End) && (pStr2 < pStr2End) )
+ {
+ /* If character between 'A' and 'Z', than convert it to lowercase */
+ c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
+ c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
+ if ( (c1 >= 65) && (c1 <= 90) )
+ c1 += 32;
+ if ( (c2 >= 65) && (c2 <= 90) )
+ c2 += 32;
+ nRet = c1-c2;
+ if ( nRet != 0 )
+ return nRet;
+
+ pStr1++;
+ pStr2++;
+ }
+
+ return nStr1Len - nStr2Len;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
+ sal_Int32 nStr1Len,
+ const IMPL_RTL_STRCODE* pStr2,
+ sal_Int32 nStr2Len,
+ sal_Int32 nShortenedLength )
+{
+ const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
+ const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
+ sal_Int32 nRet;
+ sal_Int32 c1;
+ sal_Int32 c2;
+ while ( (nShortenedLength > 0) &&
+ (pStr1 < pStr1End) && (pStr2 < pStr2End) )
+ {
+ /* If character between 'A' and 'Z', than convert it to lowercase */
+ c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
+ c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
+ if ( (c1 >= 65) && (c1 <= 90) )
+ c1 += 32;
+ if ( (c2 >= 65) && (c2 <= 90) )
+ c2 += 32;
+ nRet = c1-c2;
+ if ( nRet != 0 )
+ return nRet;
+
+ nShortenedLength--;
+ pStr1++;
+ pStr2++;
+ }
+
+ if ( nShortenedLength <= 0 )
+ return 0;
+ return nStr1Len - nStr2Len;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode )( const IMPL_RTL_STRCODE* pStr )
+{
+ return IMPL_RTL_STRNAME( hashCode_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int32 nLen )
+{
+ sal_Int32 h = nLen;
+
+ if ( nLen < 256 )
+ {
+ while ( nLen > 0 )
+ {
+ h = (h*37) + IMPL_RTL_USTRCODE( *pStr );
+ pStr++;
+ nLen--;
+ }
+ }
+ else
+ {
+ sal_Int32 nSkip;
+ const IMPL_RTL_STRCODE* pEndStr = pStr+nLen-5;
+
+ /* only sample some characters */
+ /* the first 3, some characters between, and the last 5 */
+ h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
+ pStr++;
+ h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
+ pStr++;
+ h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
+ pStr++;
+
+ if ( nLen < 32 )
+ nSkip = nLen / 4;
+ else
+ nSkip = nLen / 8;
+ nLen -= 8;
+ while ( nLen > 0 )
+ {
+ h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
+ pStr += nSkip;
+ nLen -= nSkip;
+ }
+
+ h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+ pEndStr++;
+ h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+ pEndStr++;
+ h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+ pEndStr++;
+ h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+ pEndStr++;
+ h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+ }
+
+ return h;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar )( const IMPL_RTL_STRCODE* pStr,
+ IMPL_RTL_STRCODE c )
+{
+ const IMPL_RTL_STRCODE* pTempStr = pStr;
+ while ( *pTempStr )
+ {
+ if ( *pTempStr == c )
+ return pTempStr-pStr;
+
+ pTempStr++;
+ }
+
+ return -1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int32 nLen,
+ IMPL_RTL_STRCODE c )
+{
+ const IMPL_RTL_STRCODE* pTempStr = pStr;
+ while ( nLen > 0 )
+ {
+ if ( *pTempStr == c )
+ return pTempStr-pStr;
+
+ pTempStr++;
+ nLen--;
+ }
+
+ return -1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar )( const IMPL_RTL_STRCODE* pStr,
+ IMPL_RTL_STRCODE c )
+{
+ return IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), c );
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int32 nLen,
+ IMPL_RTL_STRCODE c )
+{
+ pStr += nLen;
+ while ( nLen > 0 )
+ {
+ nLen--;
+ pStr--;
+
+ if ( *pStr == c )
+ return nLen;
+ }
+
+ return -1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr )( const IMPL_RTL_STRCODE* pStr,
+ const IMPL_RTL_STRCODE* pSubStr )
+{
+ return IMPL_RTL_STRNAME( indexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
+ pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int32 nStrLen,
+ const IMPL_RTL_STRCODE* pSubStr,
+ sal_Int32 nSubLen )
+{
+ /* faster search for a single character */
+ if ( nSubLen < 2 )
+ {
+ /* an empty SubString is always not foundable */
+ if ( nSubLen == 1 )
+ {
+ IMPL_RTL_STRCODE c = *pSubStr;
+ const IMPL_RTL_STRCODE* pTempStr = pStr;
+ while ( nStrLen > 0 )
+ {
+ if ( *pTempStr == c )
+ return pTempStr-pStr;
+
+ pTempStr++;
+ nStrLen--;
+ }
+ }
+ }
+ else
+ {
+ const IMPL_RTL_STRCODE* pTempStr = pStr;
+ while ( nStrLen > 0 )
+ {
+ if ( *pTempStr == *pSubStr )
+ {
+ /* Compare SubString */
+ if ( nSubLen <= nStrLen )
+ {
+ const IMPL_RTL_STRCODE* pTempStr1 = pTempStr;
+ const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
+ sal_Int32 nTempLen = nSubLen;
+ while ( nTempLen )
+ {
+ if ( *pTempStr1 != *pTempStr2 )
+ break;
+
+ pTempStr1++;
+ pTempStr2++;
+ nTempLen--;
+ }
+
+ if ( !nTempLen )
+ return pTempStr-pStr;
+ }
+ else
+ break;
+ }
+
+ nStrLen--;
+ pTempStr++;
+ }
+ }
+
+ return -1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr )( const IMPL_RTL_STRCODE* pStr,
+ const IMPL_RTL_STRCODE* pSubStr )
+{
+ return IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
+ pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int32 nStrLen,
+ const IMPL_RTL_STRCODE* pSubStr,
+ sal_Int32 nSubLen )
+{
+ /* faster search for a single character */
+ if ( nSubLen < 2 )
+ {
+ /* an empty SubString is always not foundable */
+ if ( nSubLen == 1 )
+ {
+ IMPL_RTL_STRCODE c = *pSubStr;
+ pStr += nStrLen;
+ while ( nStrLen > 0 )
+ {
+ nStrLen--;
+ pStr--;
+
+ if ( *pStr == c )
+ return nStrLen;
+ }
+ }
+ }
+ else
+ {
+ pStr += nStrLen;
+ nStrLen -= nSubLen;
+ pStr -= nSubLen;
+ while ( nStrLen >= 0 )
+ {
+ const IMPL_RTL_STRCODE* pTempStr1 = pStr;
+ const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
+ sal_Int32 nTempLen = nSubLen;
+ while ( nTempLen )
+ {
+ if ( *pTempStr1 != *pTempStr2 )
+ break;
+
+ pTempStr1++;
+ pTempStr2++;
+ nTempLen--;
+ }
+
+ if ( !nTempLen )
+ return nStrLen;
+
+ nStrLen--;
+ pStr--;
+ }
+ }
+
+ return -1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRNAME( replaceChar )( IMPL_RTL_STRCODE* pStr,
+ IMPL_RTL_STRCODE cOld,
+ IMPL_RTL_STRCODE cNew )
+{
+ while ( *pStr )
+ {
+ if ( *pStr == cOld )
+ *pStr = cNew;
+
+ pStr++;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRNAME( replaceChar_WithLength )( IMPL_RTL_STRCODE* pStr,
+ sal_Int32 nLen,
+ IMPL_RTL_STRCODE cOld,
+ IMPL_RTL_STRCODE cNew )
+{
+ while ( nLen > 0 )
+ {
+ if ( *pStr == cOld )
+ *pStr = cNew;
+
+ pStr++;
+ nLen--;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase )( IMPL_RTL_STRCODE* pStr )
+{
+ while ( *pStr )
+ {
+ /* Between A-Z (65-90), than to lowercase (+32) */
+ if ( (*pStr >= 65) && (*pStr <= 90) )
+ *pStr += 32;
+
+ pStr++;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase_WithLength )( IMPL_RTL_STRCODE* pStr,
+ sal_Int32 nLen )
+{
+ while ( nLen > 0 )
+ {
+ /* Between A-Z (65-90), than to lowercase (+32) */
+ if ( (*pStr >= 65) && (*pStr <= 90) )
+ *pStr += 32;
+
+ pStr++;
+ nLen--;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase )( IMPL_RTL_STRCODE* pStr )
+{
+ while ( *pStr )
+ {
+ /* Between a-z (97-122), than to uppercase (-32) */
+ if ( (*pStr >= 97) && (*pStr <= 122) )
+ *pStr -= 32;
+
+ pStr++;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase_WithLength )( IMPL_RTL_STRCODE* pStr,
+ sal_Int32 nLen )
+{
+ while ( nLen > 0 )
+ {
+ /* Between a-z (97-122), than to uppercase (-32) */
+ if ( (*pStr >= 97) && (*pStr <= 122) )
+ *pStr -= 32;
+
+ pStr++;
+ nLen--;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim )( IMPL_RTL_STRCODE* pStr )
+{
+ return IMPL_RTL_STRNAME( trim_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim_WithLength )( IMPL_RTL_STRCODE* pStr, sal_Int32 nLen )
+{
+ sal_Int32 nPreSpaces = 0;
+ sal_Int32 nPostSpaces = 0;
+ sal_Int32 nIndex = nLen-1;
+
+ while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nPreSpaces)) ) )
+ nPreSpaces++;
+
+ while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nIndex)) ) )
+ {
+ nPostSpaces++;
+ nIndex--;
+ }
+
+ if ( nPostSpaces )
+ {
+ nLen -= nPostSpaces;
+ *(pStr+nLen) = 0;
+ }
+
+ if ( nPreSpaces )
+ {
+ IMPL_RTL_STRCODE* pNewStr = pStr+nPreSpaces;
+
+ nLen -= nPreSpaces;
+ nIndex = nLen;
+
+ while ( nIndex )
+ {
+ *pStr = *pNewStr;
+ pStr++;
+ pNewStr++;
+ nIndex--;
+ }
+ *pStr = 0;
+ }
+
+ return nLen;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfBoolean )( IMPL_RTL_STRCODE* pStr, sal_Bool b )
+{
+ if ( b )
+ {
+ *pStr = 't';
+ pStr++;
+ *pStr = 'r';
+ pStr++;
+ *pStr = 'u';
+ pStr++;
+ *pStr = 'e';
+ pStr++;
+ *pStr = 0;
+ return 4;
+ }
+ else
+ {
+ *pStr = 'f';
+ pStr++;
+ *pStr = 'a';
+ pStr++;
+ *pStr = 'l';
+ pStr++;
+ *pStr = 's';
+ pStr++;
+ *pStr = 'e';
+ pStr++;
+ *pStr = 0;
+ return 5;
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfChar )( IMPL_RTL_STRCODE* pStr,
+ IMPL_RTL_STRCODE c )
+{
+ *pStr++ = c;
+ *pStr = 0;
+ return 1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt32 )( IMPL_RTL_STRCODE* pStr,
+ sal_Int32 n,
+ sal_Int16 nRadix )
+{
+ sal_Char aBuf[RTL_STR_MAX_VALUEOFINT32];
+ sal_Char* pBuf = aBuf;
+ sal_Int32 nLen = 0;
+ sal_uInt32 nValue;
+
+ /* Radix must be valid */
+ if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
+ nRadix = 10;
+
+ /* is value negativ */
+ if ( n < 0 )
+ {
+ *pStr = '-';
+ pStr++;
+ nLen++;
+ nValue = -n; /* FIXME this code is not portable for n == -2147483648
+ (smallest negative value for sal_Int32) */
+ }
+ else
+ nValue = n;
+
+ /* create a recursive buffer with all values, except the last one */
+ do
+ {
+ sal_Char nDigit = (sal_Char)(nValue % nRadix);
+ nValue /= nRadix;
+ if ( nDigit > 9 )
+ *pBuf = (nDigit-10) + 'a';
+ else
+ *pBuf = (nDigit + '0' );
+ pBuf++;
+ }
+ while ( nValue > 0 );
+
+ /* copy the values in the right direction into the destination buffer */
+ do
+ {
+ pBuf--;
+ *pStr = *pBuf;
+ pStr++;
+ nLen++;
+ }
+ while ( pBuf != aBuf );
+ *pStr = 0;
+
+ return nLen;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt64 )( IMPL_RTL_STRCODE* pStr,
+ sal_Int64 n,
+ sal_Int16 nRadix )
+{
+ sal_Char aBuf[RTL_STR_MAX_VALUEOFINT64];
+ sal_Char* pBuf = aBuf;
+ sal_Int32 nLen = 0;
+ sal_uInt64 nValue;
+
+ /* Radix must be valid */
+ if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
+ nRadix = 10;
+
+ /* is value negativ */
+ if ( n < 0 )
+ {
+ *pStr = '-';
+ pStr++;
+ nLen++;
+ nValue = -n; /* FIXME this code is not portable for
+ n == -9223372036854775808 (smallest negative value for
+ sal_Int64) */
+ }
+ else
+ nValue = n;
+
+ /* create a recursive buffer with all values, except the last one */
+ do
+ {
+ sal_Char nDigit = (sal_Char)(nValue % nRadix);
+ nValue /= nRadix;
+ if ( nDigit > 9 )
+ *pBuf = (nDigit-10) + 'a';
+ else
+ *pBuf = (nDigit + '0' );
+ pBuf++;
+ }
+ while ( nValue > 0 );
+
+ /* copy the values in the right direction into the destination buffer */
+ do
+ {
+ pBuf--;
+ *pStr = *pBuf;
+ pStr++;
+ nLen++;
+ }
+ while ( pBuf != aBuf );
+ *pStr = 0;
+
+ return nLen;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr )
+{
+ if ( *pStr == '1' )
+ return sal_True;
+
+ if ( (*pStr == 'T') || (*pStr == 't') )
+ {
+ pStr++;
+ if ( (*pStr == 'R') || (*pStr == 'r') )
+ {
+ pStr++;
+ if ( (*pStr == 'U') || (*pStr == 'u') )
+ {
+ pStr++;
+ if ( (*pStr == 'E') || (*pStr == 'e') )
+ return sal_True;
+ }
+ }
+ }
+
+ return sal_False;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int16 nRadix )
+{
+ sal_Bool bNeg;
+ sal_Int16 nDigit;
+ sal_Int32 n = 0;
+
+ if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
+ nRadix = 10;
+
+ /* Skip whitespaces */
+ while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
+ pStr++;
+
+ if ( *pStr == '-' )
+ {
+ bNeg = sal_True;
+ pStr++;
+ }
+ else
+ {
+ if ( *pStr == '+' )
+ pStr++;
+ bNeg = sal_False;
+ }
+
+ while ( *pStr )
+ {
+ nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
+ if ( nDigit < 0 )
+ break;
+
+ n *= nRadix;
+ n += nDigit;
+
+ pStr++;
+ }
+
+ if ( bNeg )
+ return -n;
+ else
+ return n;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr,
+ sal_Int16 nRadix )
+{
+ sal_Bool bNeg;
+ sal_Int16 nDigit;
+ sal_Int64 n = 0;
+
+ if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
+ nRadix = 10;
+
+ /* Skip whitespaces */
+ while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
+ pStr++;
+
+ if ( *pStr == '-' )
+ {
+ bNeg = sal_True;
+ pStr++;
+ }
+ else
+ {
+ if ( *pStr == '+' )
+ pStr++;
+ bNeg = sal_False;
+ }
+
+ while ( *pStr )
+ {
+ nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
+ if ( nDigit < 0 )
+ break;
+
+ n *= nRadix;
+ n += nDigit;
+
+ pStr++;
+ }
+
+ if ( bNeg )
+ return -n;
+ else
+ return n;
+}
+
+/* ======================================================================= */
+/* Internal String-Class help functions */
+/* ======================================================================= */
+
+static IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen )
+{
+ IMPL_RTL_STRINGDATA * pData
+ = (SAL_INT_CAST(sal_uInt32, nLen)
+ <= ((SAL_MAX_UINT32 - sizeof (IMPL_RTL_STRINGDATA))
+ / sizeof (IMPL_RTL_STRCODE)))
+ ? (IMPL_RTL_STRINGDATA *) rtl_allocateMemory(
+ sizeof (IMPL_RTL_STRINGDATA) + nLen * sizeof (IMPL_RTL_STRCODE))
+ : NULL;
+ if (pData != NULL) {
+ pData->refCount = 1;
+ pData->length = nLen;
+ pData->buffer[nLen] = 0;
+ }
+ return pData;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static IMPL_RTL_STRCODE* IMPL_RTL_STRINGNAME( ImplNewCopy )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pStr,
+ sal_Int32 nCount )
+{
+ IMPL_RTL_STRCODE* pDest;
+ const IMPL_RTL_STRCODE* pSrc;
+ IMPL_RTL_STRINGDATA* pData = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
+ OSL_ASSERT(pData != NULL);
+
+ pDest = pData->buffer;
+ pSrc = pStr->buffer;
+ while ( nCount > 0 )
+ {
+ *pDest = *pSrc;
+ pDest++;
+ pSrc++;
+ nCount--;
+ }
+
+ *ppThis = pData;
+ return pDest;
+}
+
+/* ======================================================================= */
+/* String-Class functions */
+/* ======================================================================= */
+
+#define IMPL_RTL_AQUIRE( pThis ) \
+{ \
+ if (!SAL_STRING_IS_STATIC (pThis)) \
+ osl_incrementInterlockedCount( &((pThis)->refCount) ); \
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( acquire )( IMPL_RTL_STRINGDATA* pThis )
+{
+ IMPL_RTL_AQUIRE( pThis );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( release )( IMPL_RTL_STRINGDATA* pThis )
+{
+ if (SAL_STRING_IS_STATIC (pThis))
+ return;
+
+/* OString doesn't have an 'intern' */
+#ifdef IMPL_RTL_INTERN
+ if (SAL_STRING_IS_INTERN (pThis))
+ {
+ internRelease (pThis);
+ return;
+ }
+#endif
+
+ if ( pThis->refCount == 1 ||
+ !osl_decrementInterlockedCount( &(pThis->refCount) ) )
+ {
+ rtl_freeMemory( pThis );
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( new )( IMPL_RTL_STRINGDATA** ppThis )
+{
+ if ( *ppThis)
+ IMPL_RTL_STRINGNAME( release )( *ppThis );
+
+ *ppThis = (IMPL_RTL_STRINGDATA*) (&IMPL_RTL_EMPTYSTRING);
+ IMPL_RTL_AQUIRE( *ppThis );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( new_WithLength )( IMPL_RTL_STRINGDATA** ppThis, sal_Int32 nLen )
+{
+ if ( nLen <= 0 )
+ IMPL_RTL_STRINGNAME( new )( ppThis );
+ else
+ {
+ if ( *ppThis)
+ IMPL_RTL_STRINGNAME( release )( *ppThis );
+
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
+ OSL_ASSERT(*ppThis != NULL);
+ (*ppThis)->length = 0;
+
+ {
+ IMPL_RTL_STRCODE* pTempStr = (*ppThis)->buffer;
+ while ( nLen >= 0 )
+ {
+ *pTempStr = 0;
+ pTempStr++;
+ nLen--;
+ }
+ }
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newFromString )( IMPL_RTL_STRINGDATA** ppThis,
+ const IMPL_RTL_STRINGDATA* pStr )
+{
+ IMPL_RTL_STRINGDATA* pOrg;
+
+ if ( !pStr->length )
+ {
+ IMPL_RTL_STRINGNAME( new )( ppThis );
+ return;
+ }
+
+ pOrg = *ppThis;
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
+ OSL_ASSERT(*ppThis != NULL);
+ rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer, pStr->length );
+
+ /* must be done at least, if pStr == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr )( IMPL_RTL_STRINGDATA** ppThis,
+ const IMPL_RTL_STRCODE* pCharStr )
+{
+ IMPL_RTL_STRCODE* pBuffer;
+ IMPL_RTL_STRINGDATA* pOrg;
+ sal_Int32 nLen;
+
+ if ( pCharStr )
+ {
+ const IMPL_RTL_STRCODE* pTempStr = pCharStr;
+ while( *pTempStr )
+ pTempStr++;
+ nLen = pTempStr-pCharStr;
+ }
+ else
+ nLen = 0;
+
+ if ( !nLen )
+ {
+ IMPL_RTL_STRINGNAME( new )( ppThis );
+ return;
+ }
+
+ pOrg = *ppThis;
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
+ OSL_ASSERT(*ppThis != NULL);
+ pBuffer = (*ppThis)->buffer;
+ do
+ {
+ *pBuffer = *pCharStr;
+ pBuffer++;
+ pCharStr++;
+ }
+ while ( *pCharStr );
+
+ /* must be done at least, if pCharStr == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr_WithLength )( IMPL_RTL_STRINGDATA** ppThis,
+ const IMPL_RTL_STRCODE* pCharStr,
+ sal_Int32 nLen )
+{
+ IMPL_RTL_STRINGDATA* pOrg;
+
+ if ( !pCharStr || (nLen <= 0) )
+ {
+ IMPL_RTL_STRINGNAME( new )( ppThis );
+ return;
+ }
+
+ pOrg = *ppThis;
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
+ OSL_ASSERT(*ppThis != NULL);
+ rtl_str_ImplCopy( (*ppThis)->buffer, pCharStr, nLen );
+
+ /* must be done at least, if pCharStr == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( assign )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pStr )
+{
+ /* must be done at first, if pStr == *ppThis */
+ IMPL_RTL_AQUIRE( pStr );
+
+ if ( *ppThis )
+ IMPL_RTL_STRINGNAME( release )( *ppThis );
+
+ *ppThis = pStr;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getLength )( const IMPL_RTL_STRINGDATA* pThis )
+{
+ return pThis->length;
+}
+
+/* ----------------------------------------------------------------------- */
+
+IMPL_RTL_STRCODE* SAL_CALL IMPL_RTL_STRINGNAME( getStr )( IMPL_RTL_STRINGDATA * pThis )
+{
+ return pThis->buffer;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newConcat )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pLeft,
+ IMPL_RTL_STRINGDATA* pRight )
+{
+ IMPL_RTL_STRINGDATA* pOrg = *ppThis;
+
+ /* Test for 0-Pointer - if not, change newReplaceStrAt! */
+ if ( !pRight || !pRight->length )
+ {
+ *ppThis = pLeft;
+ IMPL_RTL_AQUIRE( pLeft );
+ }
+ else if ( !pLeft || !pLeft->length )
+ {
+ *ppThis = pRight;
+ IMPL_RTL_AQUIRE( pRight );
+ }
+ else
+ {
+ IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( pLeft->length + pRight->length );
+ OSL_ASSERT(pTempStr != NULL);
+ rtl_str_ImplCopy( pTempStr->buffer, pLeft->buffer, pLeft->length );
+ rtl_str_ImplCopy( pTempStr->buffer+pLeft->length, pRight->buffer, pRight->length );
+ *ppThis = pTempStr;
+ }
+
+ /* must be done at least, if left or right == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newReplaceStrAt )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pStr,
+ sal_Int32 nIndex,
+ sal_Int32 nCount,
+ IMPL_RTL_STRINGDATA* pNewSubStr )
+{
+ /* Append? */
+ if ( nIndex >= pStr->length )
+ {
+ /* newConcat test, if pNewSubStr is 0 */
+ IMPL_RTL_STRINGNAME( newConcat )( ppThis, pStr, pNewSubStr );
+ return;
+ }
+
+ /* negativ index? */
+ if ( nIndex < 0 )
+ {
+ nCount -= nIndex;
+ nIndex = 0;
+ }
+
+ /* not more than the String length could be deleted */
+ if ( nCount >= pStr->length-nIndex )
+ {
+ nCount = pStr->length-nIndex;
+
+ /* Assign of NewSubStr? */
+ if ( !nIndex && (nCount >= pStr->length) )
+ {
+ if ( !pNewSubStr )
+ IMPL_RTL_STRINGNAME( new )( ppThis );
+ else
+ IMPL_RTL_STRINGNAME( assign )( ppThis, pNewSubStr );
+ return;
+ }
+ }
+
+ /* Assign of Str? */
+ if ( !nCount && (!pNewSubStr || !pNewSubStr->length) )
+ {
+ IMPL_RTL_STRINGNAME( assign )( ppThis, pStr );
+ return;
+ }
+
+ {
+ IMPL_RTL_STRINGDATA* pOrg = *ppThis;
+ IMPL_RTL_STRCODE* pBuffer;
+ sal_Int32 nNewLen;
+
+ /* Calculate length of the new string */
+ nNewLen = pStr->length-nCount;
+ if ( pNewSubStr )
+ nNewLen += pNewSubStr->length;
+
+ /* Alloc New Buffer */
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
+ OSL_ASSERT(*ppThis != NULL);
+ pBuffer = (*ppThis)->buffer;
+ if ( nIndex )
+ {
+ rtl_str_ImplCopy( pBuffer, pStr->buffer, nIndex );
+ pBuffer += nIndex;
+ }
+ if ( pNewSubStr && pNewSubStr->length )
+ {
+ rtl_str_ImplCopy( pBuffer, pNewSubStr->buffer, pNewSubStr->length );
+ pBuffer += pNewSubStr->length;
+ }
+ rtl_str_ImplCopy( pBuffer, pStr->buffer+nIndex+nCount, pStr->length-nIndex-nCount );
+
+ /* must be done at least, if pStr or pNewSubStr == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newReplace )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pStr,
+ IMPL_RTL_STRCODE cOld,
+ IMPL_RTL_STRCODE cNew )
+{
+ IMPL_RTL_STRINGDATA* pOrg = *ppThis;
+ int bChanged = 0;
+ sal_Int32 nLen = pStr->length;
+ const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
+
+ while ( nLen > 0 )
+ {
+ if ( *pCharStr == cOld )
+ {
+ /* Copy String */
+ IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
+
+ /* replace/copy rest of the string */
+ if ( pNewCharStr )
+ {
+ *pNewCharStr = cNew;
+ pNewCharStr++;
+ pCharStr++;
+ nLen--;
+
+ while ( nLen > 0 )
+ {
+ if ( *pCharStr == cOld )
+ *pNewCharStr = cNew;
+ else
+ *pNewCharStr = *pCharStr;
+
+ pNewCharStr++;
+ pCharStr++;
+ nLen--;
+ }
+ }
+
+ bChanged = 1;
+ break;
+ }
+
+ pCharStr++;
+ nLen--;
+ }
+
+ if ( !bChanged )
+ {
+ *ppThis = pStr;
+ IMPL_RTL_AQUIRE( pStr );
+ }
+
+ /* must be done at least, if pStr == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiLowerCase )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pStr )
+{
+ IMPL_RTL_STRINGDATA* pOrg = *ppThis;
+ int bChanged = 0;
+ sal_Int32 nLen = pStr->length;
+ const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
+
+ while ( nLen > 0 )
+ {
+ /* Between A-Z (65-90), than to lowercase (+32) */
+ if ( (*pCharStr >= 65) && (*pCharStr <= 90) )
+ {
+ /* Copy String */
+ IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
+
+ /* replace/copy rest of the string */
+ if ( pNewCharStr )
+ {
+ /* to lowercase (+32) */
+ *pNewCharStr = *pCharStr+32;
+ pNewCharStr++;
+ pCharStr++;
+ nLen--;
+
+ while ( nLen > 0 )
+ {
+ /* Between A-Z (65-90), than to lowercase (+32) */
+ if ( (*pCharStr >= 65) && (*pCharStr <= 90) )
+ *pNewCharStr = *pCharStr+32;
+ else
+ *pNewCharStr = *pCharStr;
+
+ pNewCharStr++;
+ pCharStr++;
+ nLen--;
+ }
+ }
+
+ bChanged = 1;
+ break;
+ }
+
+ pCharStr++;
+ nLen--;
+ }
+
+ if ( !bChanged )
+ {
+ *ppThis = pStr;
+ IMPL_RTL_AQUIRE( pStr );
+ }
+
+ /* must be done at least, if pStr == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiUpperCase )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pStr )
+{
+ IMPL_RTL_STRINGDATA* pOrg = *ppThis;
+ int bChanged = 0;
+ sal_Int32 nLen = pStr->length;
+ const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
+
+ while ( nLen > 0 )
+ {
+ /* Between a-z (97-122), than to uppercase (-32) */
+ if ( (*pCharStr >= 97) && (*pCharStr <= 122) )
+ {
+ /* Copy String */
+ IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
+
+ /* replace/copy rest of the string */
+ if ( pNewCharStr )
+ {
+ /* to uppercase (-32) */
+ *pNewCharStr = *pCharStr-32;
+ pNewCharStr++;
+ pCharStr++;
+ nLen--;
+
+ while ( nLen > 0 )
+ {
+ /* Between a-z (97-122), than to uppercase (-32) */
+ if ( (*pCharStr >= 97) && (*pCharStr <= 122) )
+ *pNewCharStr = *pCharStr-32;
+ else
+ *pNewCharStr = *pCharStr;
+
+ pNewCharStr++;
+ pCharStr++;
+ nLen--;
+ }
+ }
+
+ bChanged = 1;
+ break;
+ }
+
+ pCharStr++;
+ nLen--;
+ }
+
+ if ( !bChanged )
+ {
+ *ppThis = pStr;
+ IMPL_RTL_AQUIRE( pStr );
+ }
+
+ /* must be done at least, if pStr == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL IMPL_RTL_STRINGNAME( newTrim )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pStr )
+{
+ IMPL_RTL_STRINGDATA* pOrg = *ppThis;
+ const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
+ sal_Int32 nPreSpaces = 0;
+ sal_Int32 nPostSpaces = 0;
+ sal_Int32 nLen = pStr->length;
+ sal_Int32 nIndex = nLen-1;
+
+ while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nPreSpaces)) ) )
+ nPreSpaces++;
+
+ while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nIndex)) ) )
+ {
+ nPostSpaces++;
+ nIndex--;
+ }
+
+ if ( !nPreSpaces && !nPostSpaces )
+ {
+ *ppThis = pStr;
+ IMPL_RTL_AQUIRE( pStr );
+ }
+ else
+ {
+ nLen -= nPostSpaces+nPreSpaces;
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
+ OSL_ASSERT(*ppThis != NULL);
+ if ( *ppThis )
+ rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer+nPreSpaces, nLen );
+ }
+
+ /* must be done at least, if pStr == *ppThis */
+ if ( pOrg )
+ IMPL_RTL_STRINGNAME( release )( pOrg );
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getToken )( IMPL_RTL_STRINGDATA** ppThis,
+ IMPL_RTL_STRINGDATA* pStr,
+ sal_Int32 nToken,
+ IMPL_RTL_STRCODE cTok,
+ sal_Int32 nIndex )
+{
+ const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
+ const IMPL_RTL_STRCODE* pCharStrStart;
+ const IMPL_RTL_STRCODE* pOrgCharStr;
+ sal_Int32 nLen = pStr->length-nIndex;
+ sal_Int32 nTokCount = 0;
+
+ // Set ppThis to an empty string and return -1 if either nToken or nIndex is
+ // negative:
+ if (nIndex < 0) {
+ nToken = -1;
+ }
+
+ pCharStr += nIndex;
+ pOrgCharStr = pCharStr;
+ pCharStrStart = pCharStr;
+ while ( nLen > 0 )
+ {
+ if ( *pCharStr == cTok )
+ {
+ nTokCount++;
+
+ if ( nTokCount == nToken )
+ pCharStrStart = pCharStr+1;
+ else
+ {
+ if ( nTokCount > nToken )
+ break;
+ }
+ }
+
+ pCharStr++;
+ nLen--;
+ }
+
+ if ( (nToken < 0) || (nTokCount < nToken) || (pCharStr == pCharStrStart) )
+ {
+ IMPL_RTL_STRINGNAME( new )( ppThis );
+ if( (nToken < 0) || (nTokCount < nToken ) )
+ return -1;
+ else if( nLen > 0 )
+ return nIndex+(pCharStr-pOrgCharStr)+1;
+ else return -1;
+ }
+ else
+ {
+ IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pCharStrStart, pCharStr-pCharStrStart );
+ if ( nLen )
+ return nIndex+(pCharStr-pOrgCharStr)+1;
+ else
+ return -1;
+ }
+}
diff --git a/sal/rtl/source/surrogates.h b/sal/rtl/source/surrogates.h
new file mode 100644
index 000000000000..48fe4182ad46
--- /dev/null
+++ b/sal/rtl/source/surrogates.h
@@ -0,0 +1,50 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_SAL_RTL_SOURCE_SURROGATES_H
+#define INCLUDED_SAL_RTL_SOURCE_SURROGATES_H
+
+#include "sal/config.h"
+
+#define SAL_RTL_FIRST_HIGH_SURROGATE 0xD800
+#define SAL_RTL_LAST_HIGH_SURROGATE 0xDBFF
+#define SAL_RTL_FIRST_LOW_SURROGATE 0xDC00
+#define SAL_RTL_LAST_LOW_SURROGATE 0xDFFF
+
+#define SAL_RTL_IS_HIGH_SURROGATE(utf16) \
+ ((utf16) >= SAL_RTL_FIRST_HIGH_SURROGATE && \
+ (utf16) <= SAL_RTL_LAST_HIGH_SURROGATE)
+
+#define SAL_RTL_IS_LOW_SURROGATE(utf16) \
+ ((utf16) >= SAL_RTL_FIRST_LOW_SURROGATE && \
+ (utf16) <= SAL_RTL_LAST_LOW_SURROGATE)
+
+#define SAL_RTL_COMBINE_SURROGATES(high, low) \
+ ((((high) - SAL_RTL_FIRST_HIGH_SURROGATE) << 10) + \
+ ((low) - SAL_RTL_FIRST_LOW_SURROGATE) + 0x10000)
+
+#endif
diff --git a/sal/rtl/source/tres.c b/sal/rtl/source/tres.c
new file mode 100644
index 000000000000..85e5c4367066
--- /dev/null
+++ b/sal/rtl/source/tres.c
@@ -0,0 +1,686 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <stdio.h>
+#include <rtl/tres.h>
+#include <osl/diagnose.h>
+#include <osl/time.h>
+
+ /* force an assertion on false state */
+#define TST_BOOM(c, m) OSL_ENSURE(c, m)
+
+
+typedef struct _rtl_CmpState
+{
+ struct _rtl_CmpState* m_next;
+ struct _rtl_CmpState* m_prev;
+
+ sal_Bool m_stat;
+ rtl_String* m_msg;
+
+} rtl_CmpState;
+
+typedef struct _rtl_FuncState
+{
+ struct _rtl_FuncState* m_next;
+ struct _rtl_FuncState* m_prev;
+ rtl_String* m_name;
+ sal_uInt32 m_flags;
+ sal_uInt32 m_start;
+ sal_uInt32 m_stop;
+ struct _rtl_CmpState* m_cmp;
+
+} rtl_FuncState;
+
+
+
+typedef struct _rtl_TestResult_Data
+{
+ rtl_TestResult_vtable* m_funcs;
+ void* m_externaldata;
+
+ rtl_FuncState* m_state;
+
+} rtl_TestResult_Data;
+
+
+ /**
+ * internal helper functions
+ */
+
+ /* ...to create, link, unlink and destroy allocated memory */
+rtl_FuncState* SAL_CALL rtl_tres_create_funcstate( const sal_Char* meth );
+rtl_FuncState* SAL_CALL rtl_tres_link_funcstate( rtl_FuncState* ptr,
+ rtl_FuncState* plink );
+rtl_FuncState* SAL_CALL rtl_tres_unlink_funcstate( rtl_FuncState* plink );
+rtl_CmpState* SAL_CALL rtl_tres_create_cmpstate(
+ sal_Bool state,
+ const sal_Char* msg
+ );
+rtl_CmpState* SAL_CALL rtl_tres_link_cmpstate( rtl_CmpState* ptr,
+ rtl_CmpState* plink );
+rtl_CmpState* SAL_CALL rtl_tres_unlink_cmpstate( rtl_CmpState* plink );
+sal_uInt32 SAL_CALL rtl_tres_timer();
+void SAL_CALL rtl_tres_destroy_funcstate( rtl_FuncState* pState_ );
+void SAL_CALL rtl_tres_destroy_funcstates( rtl_FuncState* pState_ );
+void SAL_CALL rtl_tres_destroy_cmpstates( rtl_CmpState* pState_ );
+void SAL_CALL rtl_tres_destroy_cmpstate( rtl_CmpState* pState_ );
+
+
+ /* set and clear single bits */
+static void SAL_CALL rtl_tres_setbit( rtl_FuncState* pState_,
+ sal_uInt32 flag );
+static void SAL_CALL rtl_tres_clearbit( rtl_FuncState* pState_,
+ sal_uInt32 flag );
+
+ /**
+ * forward declarations of concrete function implementations overloadable
+ * and accessible via vtable
+ */
+static sal_Bool SAL_CALL rtl_tres_state(
+ rtl_TestResult* pThis_,
+ sal_Bool state,
+ const sal_Char* msg,
+ const sal_Char* sub,
+ sal_Bool v
+ );
+
+static void SAL_CALL rtl_tres_end( rtl_TestResult* pThis_,
+ const sal_Char* msg );
+
+static rtl_funcstate SAL_CALL rtl_tres_funcstate( rtl_TestResult* pThis_ );
+
+static sal_Bool SAL_CALL rtl_tres_ispassed( rtl_TestResult* pThis_ );
+static sal_Bool SAL_CALL rtl_tres_isok( rtl_TestResult* pThis_ );
+
+static sal_Bool SAL_CALL rtl_tres_isbit( rtl_TestResult* pThis_,
+ sal_uInt32 flag );
+
+static rtl_funcstate SAL_CALL rtl_tres_getnextfuncstate( rtl_funcstate );
+static rtl_funcstate SAL_CALL rtl_tres_getprevfuncstate( rtl_funcstate );
+static sal_uInt32 SAL_CALL rtl_tres_getflags( rtl_funcstate );
+sal_uInt32 SAL_CALL rtl_tres_getstarttime( rtl_funcstate );
+sal_uInt32 SAL_CALL rtl_tres_getstoptime( rtl_funcstate );
+static rtl_cmpstate SAL_CALL rtl_tres_getcmpstate( rtl_funcstate );
+
+static sal_Bool SAL_CALL rtl_tres_getstat( rtl_cmpstate );
+rtl_String* SAL_CALL rtl_tres_getname( rtl_funcstate );
+rtl_String* SAL_CALL rtl_tres_getmsg( rtl_cmpstate );
+static rtl_cmpstate SAL_CALL rtl_tres_getnextcmpstate( rtl_cmpstate );
+
+
+ /**
+ * initialize vtable with function pointers
+ */
+static rtl_TestResult_vtable trVTable =
+{
+ sizeof(rtl_TestResult_vtable),
+ rtl_tres_state,
+ rtl_tres_end,
+ rtl_tres_ispassed,
+ rtl_tres_isok,
+ rtl_tres_funcstate,
+ rtl_tres_isbit,
+ rtl_tres_getnextfuncstate,
+ rtl_tres_getprevfuncstate,
+ rtl_tres_getflags,
+ rtl_tres_getname,
+ rtl_tres_getstarttime,
+ rtl_tres_getstoptime,
+ rtl_tres_getcmpstate,
+ rtl_tres_getstat,
+ rtl_tres_getmsg,
+ rtl_tres_getnextcmpstate
+};
+
+ /**
+ * rtl_tres_create
+ * create and initialize data struct for TestResult
+ *
+ * @param const sal_Char* meth = name of the method (entryname)
+ * @param sal_uInt32 flags = bitmap of comandline and status flags
+ *
+ * @return rtl_TestResult* = pointer to a new allocated testresult struct
+ */
+rtl_TestResult* rtl_tres_create( const sal_Char* meth, sal_uInt32 flags )
+{
+ /* allocate memory for testresult data structure */
+ rtl_TestResult_Data* pData = (rtl_TestResult_Data*) malloc( sizeof(
+ rtl_TestResult_Data ) );
+ /* initialize members... */
+ pData->m_funcs = &trVTable; /* ...vtableptr to vtbladr */
+ pData->m_externaldata = 0; /* ...external data pointer */
+
+ /* allocate memory for state structure and initialize members */
+ pData->m_state = rtl_tres_create_funcstate( meth );
+ pData->m_state->m_flags = flags; /* ...option Bitmap */
+
+ /* set OK flag initial */
+ rtl_tres_setbit( pData->m_state, rtl_tres_Flag_OK );
+
+ return (rtl_TestResult*)pData ;
+}
+
+/**
+ * rtl_tres_create_funcstate
+ * allocates and initializes a structure to represent the status of a test
+ * entry or its substates
+ *
+ * @param const sal_Char* meth = the name of the method (entry or sub entry)
+ *
+ * @return rtl_FuncState* = pointer to a new allocated funcstate struct
+ */
+rtl_FuncState* SAL_CALL rtl_tres_create_funcstate( const sal_Char* meth )
+{
+ rtl_FuncState* pStat = 0; /* status structure */
+
+ /* allocate memory for status structure */
+ pStat = (rtl_FuncState*) malloc( sizeof( struct _rtl_FuncState ) );
+
+ if ( pStat )
+ {
+ pStat->m_next = pStat; /* init ptr to next struct */
+ pStat->m_prev = pStat; /* init ptr to prev struct */
+
+ pStat->m_name = 0; /* init name */
+ pStat->m_flags = 0; /* init flags */
+ pStat->m_start = rtl_tres_timer(); /* init start milliseconds */
+ pStat->m_stop = 0; /* init stop milliseconds */
+ pStat->m_cmp = 0; /* init ptr to msg struct */
+ rtl_string_newFromStr( &pStat->m_name, meth );/* copy meth to name */
+
+ /* set ok flag initially */
+ rtl_tres_setbit(pStat, rtl_tres_Flag_OK);
+ }
+
+ return ( pStat );
+}
+ /**
+ * rtl_tres_link_funcstate
+ * link initialized funcstate structure to a circular double linked list
+ *
+ * @param rtl_FuncState* ptr = pointer to a funcstate where to link in new
+ * @param rtl_FuncState* plink = pointer to a funcstate to link in list
+ *
+ * @return rtl_FuncState* = pointer to structure linked in new
+ */
+rtl_FuncState* SAL_CALL rtl_tres_link_funcstate( rtl_FuncState* ptr,
+ rtl_FuncState* plink )
+{
+ ptr->m_next->m_prev = plink;
+ ptr->m_next->m_prev->m_next = ptr->m_next;
+ ptr->m_next->m_prev->m_prev = ptr;
+ ptr->m_next = plink;
+ return ( plink );
+}
+
+ /**
+ * rtl_tres_unlink_funcstate
+ * unlink funcstate structure from a circular double linked list
+ *
+ * @param rtl_FuncState* plink = pointer to a funcstate to unlink from list
+ *
+ * @return rtl_FuncState* = pointer to funcstate struct unlinked from
+ * list
+ */
+rtl_FuncState* SAL_CALL rtl_tres_unlink_funcstate( rtl_FuncState* plink )
+{
+ plink->m_next->m_prev = plink->m_prev;
+ plink->m_prev->m_next = plink->m_next;
+ plink->m_next = plink;
+ plink->m_prev = plink;
+ return ( plink );
+}
+
+ /**
+ * rtl_tres_link_cmpstate
+ * link initialized cmpstate structure to a circular double linked list
+ *
+ * @param rtl_CmpState* ptr = pointer to a cmpstate where to link in new
+ * @param rtl_CmpState* plink = pointer to a cmpstate to link in list
+ *
+ * @return rtl_CmpState* = pointer to cmpstate struct linked in new
+ */
+rtl_CmpState* SAL_CALL rtl_tres_link_cmpstate( rtl_CmpState* ptr,
+ rtl_CmpState* plink )
+{
+ ptr->m_next->m_prev = plink;
+ ptr->m_next->m_prev->m_next = ptr->m_next;
+ ptr->m_next->m_prev->m_prev = ptr;
+ ptr->m_next = plink;
+ return ( plink );
+}
+ /**
+ * rtl_tres_unlink_cmpstate
+ * unlink cmpstate structure from a circular double linked list
+ *
+ * @param rtl_CmpState* plink = pointer to a cmpstate to unlink from list
+ *
+ * @return rtl_CmpState* = pointer to cmpstate struct unlinked from list
+ */
+rtl_CmpState* SAL_CALL rtl_tres_unlink_cmpstate( rtl_CmpState* plink )
+{
+ plink->m_next->m_prev = plink->m_prev;
+ plink->m_prev->m_next = plink->m_next;
+ plink->m_next = plink;
+ plink->m_prev = plink;
+ return ( plink );
+}
+
+ /**
+ * rtl_tres_create_cmpstate
+ * allocates and initializes a structure to represent the status of a test
+ * comparison
+ *
+ * @param sal_Bool state = compare state
+ * @param sal_Char* msg = message for logging and debug purposes
+ *
+ * @return rtl_CmpState* = pointer to the new allocated struct
+ */
+rtl_CmpState* SAL_CALL rtl_tres_create_cmpstate(
+ sal_Bool state,
+ const sal_Char* msg
+ )
+{
+ /* allocate memory for cmpstate struct */
+ rtl_CmpState* pStat = (rtl_CmpState*) malloc( sizeof( rtl_CmpState ) );
+
+ /* initialize if memory could be allocated */
+ if ( pStat )
+ {
+ pStat->m_next = pStat; /* init next with this */
+ pStat->m_prev = pStat; /* init prev with this */
+ pStat->m_msg = 0;
+ pStat->m_stat = state; /* boolean state */
+ rtl_string_newFromStr( &pStat->m_msg, msg ); /* copy message */
+ }
+ return ( pStat );
+}
+
+ /**
+ * rtl_tres_destroy
+ * free allocated memory of testresult data struct
+ *
+ * @param rtl_TestResult* pThis_ = ponter to a valid testresult struct
+ */
+void SAL_CALL rtl_tres_destroy( rtl_TestResult* pThis_ )
+{
+ /* cast to implementation representation structure */
+ rtl_TestResult_Data* pData = (rtl_TestResult_Data*) pThis_;
+
+ /* destroy all funcstates */
+ if ( pData->m_state )
+ rtl_tres_destroy_funcstates( pData->m_state );
+
+ /* free allocted memory and reinitialize to zero */
+ /* to be able to prevent dangling pointer access*/
+ free( pData ); pData = 0;
+}
+
+ /**
+ * rtl_tres_destroy_funcstates
+ * free allocated memory occupied by the list of funcstate data structs
+ * (iterates through next pointers)
+ *
+ * @param rtl_FuncState* pState_ = pointer to a valid funcstate struct
+ */
+void SAL_CALL rtl_tres_destroy_funcstates( rtl_FuncState* pState_ )
+{
+ rtl_FuncState* plink = pState_->m_next;
+ while ( plink != plink->m_next )
+ {
+ rtl_tres_destroy_funcstate( rtl_tres_unlink_funcstate( plink ) );
+ plink = pState_->m_next;
+ }
+ rtl_tres_destroy_funcstate( plink );
+}
+
+ /**
+ * rtl_tres_destroy_cmpstates
+ * free allocated memory occupied by the list of cmpstate data structs
+ * (iterates through next pointers)
+ *
+ * @param rtl_CmpState* pState_ = pointer to a valid cmpstate struct
+ */
+void SAL_CALL rtl_tres_destroy_cmpstates( rtl_CmpState* pState_ )
+{
+ rtl_CmpState* plink = pState_->m_next;
+ while ( plink != plink->m_next )
+ {
+ rtl_tres_destroy_cmpstate( rtl_tres_unlink_cmpstate( plink ) );
+ plink = pState_->m_next;
+ }
+ rtl_tres_destroy_cmpstate( plink );
+}
+
+
+ /**
+ * rtl_tres_destroy_funcstate
+ * free allocated memory occupied by one funcstate and it's list
+ * of cmpstate data structs
+ *
+ * @param rtl_FuncState* pState_ = pointer to a valid funcstate struct
+ */
+void SAL_CALL rtl_tres_destroy_funcstate( rtl_FuncState* pState_ )
+{
+ rtl_FuncState* plink = pState_;
+
+ if ( plink->m_cmp )
+ rtl_tres_destroy_cmpstates( plink->m_cmp );
+
+ if ( plink->m_name )
+ {
+ rtl_string_release( plink->m_name );
+ plink->m_name = 0;
+ }
+ plink->m_flags = 0;
+ free( plink );
+ plink = 0;
+}
+
+ /**
+ * rtl_tres_destroy_cmpstate
+ * free allocated memory of a cmpstate data struct
+ *
+ * @param rtl_CmpState* pState_ = pointer to cmpstate struct to destroy
+ */
+void SAL_CALL rtl_tres_destroy_cmpstate( rtl_CmpState* pState_ )
+{
+
+ rtl_CmpState* plink = pState_;
+
+ if ( plink->m_msg )
+ {
+ rtl_string_release( plink->m_msg );
+ plink->m_msg = 0;
+ }
+ free( plink );
+ plink = 0;
+}
+ /**
+ * central function to call in tests
+ *
+ * @param rtl_TestResult* pThis_ = self pointer to TestResult structure
+ * @param sal_Bool state = boolean result of statement comparison
+ * @param const sal_Char* msg = message for actual statementcomparison
+ * @param const sal_Char* sub = name of sub testfunction
+ * @param sal_Bool v = boolean verbose parameter
+ *
+ * @return sal_Bool = determines if statement comparison
+ * was positive or not
+ */
+static sal_Bool SAL_CALL rtl_tres_state(
+ rtl_TestResult* pThis_,
+ sal_Bool state,
+ const sal_Char* msg,
+ const sal_Char* sub,
+ sal_Bool v
+ )
+{
+
+ /* cast pointer to testresult data implementation struct*/
+ rtl_TestResult_Data* pData = (rtl_TestResult_Data*)pThis_;
+
+ /* initialize funcstate pointer with masterstate */
+ rtl_FuncState* pFunc = pData->m_state;
+
+ /* if substate required */
+ if ( sub )
+ {
+ /* link new created function state to last item */
+ pFunc = rtl_tres_link_funcstate( pFunc->m_prev,
+ rtl_tres_create_funcstate( sub ) );
+
+ /* indicate this state as substate */
+ rtl_tres_setbit( pFunc, rtl_tres_Flag_SUB );
+
+ /* indicate prvious state as passed if no masterstate */
+ if ( pFunc->m_prev != pData->m_state )
+ rtl_tres_setbit( pFunc->m_prev, rtl_tres_Flag_PASSED );
+ }
+
+
+ /* test failed */
+ if( ! state )
+ {
+ /* determine if assertion should be thrown */
+ if ( rtl_tres_isbit( pThis_, rtl_tres_Flag_BOOM ) )
+ {
+ /* if message available */
+ if ( msg )
+ TST_BOOM( state, msg );
+ else
+ TST_BOOM( state, "no msg available" );
+ }
+
+ /* clear this state ok flag and masterstate ok flag */
+ rtl_tres_clearbit( pFunc, rtl_tres_Flag_OK );
+ rtl_tres_clearbit( pData->m_state, rtl_tres_Flag_OK );
+ }
+ /* message available */
+ if( msg )
+ {
+ /* append a new comparison state */
+ if (! pFunc->m_cmp )
+ pFunc->m_cmp = rtl_tres_create_cmpstate( state, msg );
+ else
+ rtl_tres_link_cmpstate( pFunc->m_cmp,
+ rtl_tres_create_cmpstate(state, msg ) );
+
+ /* message to stderr required ? */
+ if ( v || ( pFunc->m_next->m_flags & rtl_tres_Flag_VERBOSE ) )
+ fprintf( stderr, "%s\n", msg );
+ }
+
+ pFunc->m_stop = rtl_tres_timer();
+ return ( state );
+}
+
+ /**
+ * rtl_tres_timer
+ * function to get actual timevalue
+ * this has to be replaced by a high resolution timer
+ */
+sal_uInt32 SAL_CALL rtl_tres_timer()
+{
+ sal_uInt32 val = 0;
+ TimeValue* tmv = (TimeValue*)malloc( sizeof( TimeValue ) );
+ osl_getSystemTime( tmv );
+ val = tmv->Nanosec/1000L;
+ free( tmv );
+ return ( val );
+}
+
+
+static void SAL_CALL rtl_tres_end( rtl_TestResult* pThis_,
+ const sal_Char* msg )
+{
+ rtl_TestResult_Data* pData = (rtl_TestResult_Data*) pThis_;
+
+ if( msg )
+ {
+ if (! pData->m_state->m_cmp )
+ pData->m_state->m_cmp = rtl_tres_create_cmpstate( sal_True, msg );
+ else
+ rtl_tres_link_cmpstate( pData->m_state->m_cmp,
+ rtl_tres_create_cmpstate( sal_True, msg ) );
+ }
+ pData->m_state->m_prev->m_flags |= rtl_tres_Flag_PASSED;
+ pData->m_state->m_flags |= rtl_tres_Flag_PASSED;
+ pData->m_state->m_stop = rtl_tres_timer();
+}
+
+
+static sal_Bool SAL_CALL rtl_tres_ispassed( rtl_TestResult* pThis_ )
+{
+ return rtl_tres_isbit( pThis_, rtl_tres_Flag_PASSED );
+}
+
+static sal_Bool SAL_CALL rtl_tres_isok( rtl_TestResult* pThis_ )
+{
+ return rtl_tres_isbit( pThis_, rtl_tres_Flag_OK );
+}
+ /**
+ * return pointer to funcstate structure
+ */
+static rtl_funcstate SAL_CALL rtl_tres_funcstate( rtl_TestResult* pThis_ )
+{
+
+ rtl_TestResult_Data* pThis = (rtl_TestResult_Data*) pThis_;
+ return (rtl_funcstate)pThis->m_state;
+}
+
+ /**
+ * determine if a flag is set or not
+ */
+static sal_Bool SAL_CALL rtl_tres_isbit( rtl_TestResult* pThis_,
+ sal_uInt32 flag )
+{
+ return (sal_Bool)
+ ((((rtl_TestResult_Data *) pThis_)->m_state->m_flags & flag) == flag);
+}
+ /**
+ * set one single bit
+ */
+static void SAL_CALL rtl_tres_setbit( rtl_FuncState* pState_,
+ sal_uInt32 flag )
+{
+ pState_->m_flags |= flag;
+}
+ /**
+ * clear one single bit
+ */
+static void SAL_CALL rtl_tres_clearbit( rtl_FuncState* pState_,
+ sal_uInt32 flag )
+{
+ pState_->m_flags = pState_->m_flags & ( ~flag );
+}
+
+ /**
+ * returns next pointer of passed funcstate structure
+ */
+rtl_funcstate SAL_CALL rtl_tres_getnextfuncstate( rtl_funcstate fstate )
+{
+ rtl_FuncState* fs = (rtl_FuncState*)fstate;
+ return( (rtl_funcstate)fs->m_next );
+
+}
+ /**
+ * returns previous pointer of passed funcstate structure
+ */
+rtl_funcstate SAL_CALL rtl_tres_getprevfuncstate( rtl_funcstate fstate )
+{
+ rtl_FuncState* fs = (rtl_FuncState*)fstate;
+ return( (rtl_funcstate)fs->m_prev );
+
+}
+ /**
+ * returns flag value of passed funcstate structure
+ */
+sal_uInt32 SAL_CALL rtl_tres_getflags( rtl_funcstate fstate )
+{
+ rtl_FuncState* fs = (rtl_FuncState*)fstate;
+ return( fs->m_flags );
+}
+ /**
+ * returns name of passed funcstate structure
+ */
+rtl_String* SAL_CALL rtl_tres_getname( rtl_funcstate fstate )
+{
+ rtl_FuncState* fs = (rtl_FuncState*)fstate;
+ return( fs->m_name );
+}
+ /**
+ * returns starttime of passed funcstate structure
+ */
+sal_uInt32 SAL_CALL rtl_tres_getstarttime( rtl_funcstate fstate )
+{
+ rtl_FuncState* fs = (rtl_FuncState*)fstate;
+ return( fs->m_start );
+}
+
+ /**
+ * returns stoptime of passed funcstate structure
+ */
+sal_uInt32 SAL_CALL rtl_tres_getstoptime( rtl_funcstate fstate )
+{
+ rtl_FuncState* fs = (rtl_FuncState*)fstate;
+ return( fs->m_stop );
+}
+
+ /**
+ * returns pointer to cmpstate of passed funcstate structure
+ */
+rtl_cmpstate SAL_CALL rtl_tres_getcmpstate( rtl_funcstate fstate)
+{
+ rtl_FuncState* fs = (rtl_FuncState*)fstate;
+ return( (rtl_cmpstate)fs->m_cmp );
+
+}
+ /**
+ * returns boolean state of passed cmpstate structure
+ */
+sal_Bool SAL_CALL rtl_tres_getstat( rtl_cmpstate cstate)
+{
+ rtl_CmpState* cs = (rtl_CmpState*)cstate;
+ return( cs->m_stat );
+}
+ /**
+ * returns message of passed cmpstate structure
+ */
+rtl_String* SAL_CALL rtl_tres_getmsg( rtl_cmpstate cstate)
+{
+ rtl_CmpState* cs = (rtl_CmpState*)cstate;
+ return( cs->m_msg );
+}
+ /**
+ * returns next pointer of passed cmpstate structure
+ */
+rtl_cmpstate SAL_CALL rtl_tres_getnextcmpstate( rtl_cmpstate cstate)
+{
+ rtl_CmpState* cs = (rtl_CmpState*)cstate;
+ return( (rtl_cmpstate)cs->m_next );
+}
+
+/*
+// <method_logPrintf>
+//inline void logPrintf ( const sal_Bool bTestCaseState,
+// const char *pFormatStr, ...
+// )
+//{
+// if( m_pFunctions && m_pFunctions->pLogPrintf )
+// {
+// va_list vArgumentList;
+// va_start ( vArgumentList, pFormatStr );
+
+// m_pFunctions->pLogPrintf( this, bTestCaseState, pFormatStr, vArgumentList );
+
+// va_end ( vArgumentList );
+// }
+//} // </method_logPrintf>
+ */
+
diff --git a/sal/rtl/source/unload.cxx b/sal/rtl/source/unload.cxx
new file mode 100644
index 000000000000..ba31bd9c86f9
--- /dev/null
+++ b/sal/rtl/source/unload.cxx
@@ -0,0 +1,417 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <rtl/unload.h>
+#include <rtl/alloc.h>
+#include <rtl/ustring.hxx>
+#include <osl/mutex.hxx>
+#include <hash_map>
+#include "rtl/allocator.hxx"
+
+#include <functional>
+#include <list>
+#include <deque>
+
+using osl::MutexGuard;
+
+//----------------------------------------------------------------------------
+
+static void rtl_notifyUnloadingListeners();
+
+static sal_Bool isEqualTimeValue ( const TimeValue* time1, const TimeValue* time2)
+{
+ if( time1->Seconds == time2->Seconds &&
+ time1->Nanosec == time2->Nanosec)
+ return sal_True;
+ else
+ return sal_False;
+}
+
+static sal_Bool isGreaterTimeValue( const TimeValue* time1, const TimeValue* time2)
+{
+ sal_Bool retval= sal_False;
+ if ( time1->Seconds > time2->Seconds)
+ retval= sal_True;
+ else if ( time1->Seconds == time2->Seconds)
+ {
+ if( time1->Nanosec > time2->Nanosec)
+ retval= sal_True;
+ }
+ return retval;
+}
+
+static sal_Bool isGreaterEqualTimeValue( const TimeValue* time1, const TimeValue* time2)
+{
+ if( isEqualTimeValue( time1, time2) )
+ return sal_True;
+ else if( isGreaterTimeValue( time1, time2))
+ return sal_True;
+ else
+ return sal_False;
+}
+
+static void addTimeValue( const TimeValue* value1, const TimeValue* value2, TimeValue* result)
+{
+ sal_uInt64 sum;
+ result->Nanosec=0;
+ result->Seconds=0;
+
+ sum= value1->Nanosec + value2->Nanosec;
+ if( sum >= 1000000000 )
+ {
+ result->Seconds=1;
+ sum -= 1000000000;
+ }
+ result->Nanosec= (sal_uInt32)sum;
+ result->Seconds += value1->Seconds + value2->Seconds;
+}
+
+
+static sal_Bool hasEnoughTimePassed( const TimeValue* unusedSince, const TimeValue* timespan)
+{
+ sal_Bool retval= sal_False;
+ TimeValue currentTime;
+ if( osl_getSystemTime( &currentTime))
+ {
+ TimeValue addedTime;
+ addTimeValue( unusedSince, timespan, &addedTime);
+ if( isGreaterEqualTimeValue( &currentTime, &addedTime))
+ retval= sal_True;
+ }
+
+ return retval;
+}
+
+static osl::Mutex* getUnloadingMutex()
+{
+ static osl::Mutex * g_pMutex= NULL;
+ if (!g_pMutex)
+ {
+ MutexGuard guard( osl::Mutex::getGlobalMutex() );
+ if (!g_pMutex)
+ {
+ static osl::Mutex g_aMutex;
+ g_pMutex= &g_aMutex;
+ }
+ }
+ return g_pMutex;
+}
+
+extern "C" void rtl_moduleCount_acquire(rtl_ModuleCount * that )
+{
+ rtl_StandardModuleCount* pMod= (rtl_StandardModuleCount*)that;
+ osl_incrementInterlockedCount( &pMod->counter);
+}
+
+extern "C" void rtl_moduleCount_release( rtl_ModuleCount * that )
+{
+ rtl_StandardModuleCount* pMod= (rtl_StandardModuleCount*)that;
+ OSL_ENSURE( pMod->counter >0 , "library counter incorrect" );
+ osl_decrementInterlockedCount( &pMod->counter);
+ if( pMod->counter == 0)
+ {
+ MutexGuard guard( getUnloadingMutex());
+
+ if( sal_False == osl_getSystemTime( &pMod->unusedSince) )
+ {
+ // set the time to 0 if we could not get the time
+ pMod->unusedSince.Seconds= 0;
+ pMod->unusedSince.Nanosec= 0;
+ }
+ }
+}
+
+
+struct hashModule
+{
+ size_t operator()( const oslModule& rkey) const
+ {
+ return (size_t)rkey;
+ }
+};
+
+typedef std::hash_map<
+ oslModule,
+ std::pair<sal_uInt32, component_canUnloadFunc>,
+ hashModule,
+ std::equal_to<oslModule>,
+ rtl::Allocator<oslModule>
+> ModuleMap;
+
+typedef ModuleMap::iterator Mod_IT;
+
+static ModuleMap& getModuleMap()
+{
+ static ModuleMap * g_pMap= NULL;
+ if (!g_pMap)
+ {
+ MutexGuard guard( getUnloadingMutex() );
+ if (!g_pMap)
+ {
+ static ModuleMap g_aModuleMap;
+ g_pMap= &g_aModuleMap;
+ }
+ }
+ return *g_pMap;
+}
+
+extern "C" sal_Bool rtl_moduleCount_canUnload( rtl_StandardModuleCount * that, TimeValue * libUnused)
+{
+ if (that->counter == 0)
+ {
+ MutexGuard guard( getUnloadingMutex());
+ if (libUnused && (that->counter == 0))
+ {
+ rtl_copyMemory(libUnused, &that->unusedSince, sizeof(TimeValue));
+ }
+ }
+ return (that->counter == 0);
+}
+
+
+extern "C" sal_Bool SAL_CALL rtl_registerModuleForUnloading( oslModule module)
+{
+ MutexGuard guard( getUnloadingMutex());
+ ModuleMap& moduleMap= getModuleMap();
+ sal_Bool ret= sal_True;
+
+ // If the module has been registered before, then find it and increment
+ // its reference cout
+ Mod_IT it= moduleMap.find( module);
+ if( it != moduleMap.end())
+ {
+ //module already registered, increment ref count
+ it->second.first++;
+ }
+ else
+ {
+ // Test if the module supports unloading (exports component_canUnload)
+ rtl::OUString name(RTL_CONSTASCII_USTRINGPARAM( COMPONENT_CANUNLOAD));
+ component_canUnloadFunc pFunc=
+ (component_canUnloadFunc)osl_getFunctionSymbol( module, name.pData);
+ if (pFunc)
+ {
+ //register module for the first time, set ref count to 1
+ moduleMap[module]= std::make_pair((sal_uInt32)1, pFunc);
+ }
+ else
+ ret= sal_False;
+ }
+ return ret;
+}
+
+extern "C" void SAL_CALL rtl_unregisterModuleForUnloading( oslModule module)
+{
+ MutexGuard guard( getUnloadingMutex());
+
+ ModuleMap& moduleMap= getModuleMap();
+ Mod_IT it= moduleMap.find( module);
+ if( it != moduleMap.end() )
+ {
+ // The module is registered, decrement ref count.
+ it->second.first --;
+
+ // If the refcount == 0 then remove the module from the map
+ if( it->second.first == 0)
+ moduleMap.erase( it);
+ }
+}
+
+extern "C" void SAL_CALL rtl_unloadUnusedModules( TimeValue* libUnused)
+{
+ MutexGuard guard( getUnloadingMutex());
+
+ typedef std::list< oslModule, rtl::Allocator<oslModule> > list_type;
+ list_type unloadedModulesList;
+
+ ModuleMap& moduleMap= getModuleMap();
+ Mod_IT it_e= moduleMap.end();
+
+ // notify all listeners
+ rtl_notifyUnloadingListeners();
+
+ // prepare default TimeValue if argumetn is NULL
+ TimeValue nullTime={0,0};
+ TimeValue* pLibUnused= libUnused? libUnused : &nullTime;
+
+ Mod_IT it= moduleMap.begin();
+ for (; it != it_e; ++it)
+ {
+ //can the module be unloaded?
+ component_canUnloadFunc func= it->second.second;
+ TimeValue unusedSince= {0, 0};
+
+ if( func( &unusedSince) )
+ {
+ // module can be unloaded if it has not been used at least for the time
+ // specified by the argument libUnused
+ if( hasEnoughTimePassed( &unusedSince, pLibUnused))
+ {
+ // get the reference count and unload the module as many times
+ sal_uInt32 refCount= it->second.first;
+
+ for ( sal_uInt32 i=0; i < refCount; i++)
+ osl_unloadModule( it->first);
+
+ // mark the module for later removal
+ unloadedModulesList.push_front( it->first);
+ }
+ }
+ }
+
+ // remove all entries containing invalid (unloaded) modules
+ list_type::const_iterator un_it= unloadedModulesList.begin();
+ for (; un_it != unloadedModulesList.end(); ++un_it)
+ {
+ moduleMap.erase( *un_it);
+ }
+}
+
+
+// ==============================================================================
+// Unloading Listener Administration
+//===============================================================================
+struct hashListener
+{
+ size_t operator()( const sal_Int32& rkey) const
+ {
+ return (size_t)rkey;
+ }
+};
+
+typedef std::hash_map<
+ sal_Int32,
+ std::pair<rtl_unloadingListenerFunc, void*>,
+ hashListener,
+ std::equal_to<sal_Int32>,
+ rtl::Allocator<sal_Int32>
+> ListenerMap;
+
+typedef ListenerMap::iterator Lis_IT;
+
+static ListenerMap& getListenerMap()
+{
+ static ListenerMap * g_pListeners= NULL;
+ if (!g_pListeners)
+ {
+ MutexGuard guard( getUnloadingMutex() );
+ if (!g_pListeners)
+ {
+ static ListenerMap g_aListenerMap;
+ g_pListeners= &g_aListenerMap;
+ }
+ }
+ return *g_pListeners;
+}
+
+
+// This queue contains cookies which have been passed out by rtl_addUnloadingListener and
+// which have been regainded by rtl_removeUnloadingListener. When rtl_addUnloadingListener
+// is called then a cookie has to be returned. First we look into the set if there is one
+// availabe. Otherwise a new cookie will be provided.
+// not a new value is returned.
+
+typedef std::deque<
+ sal_Int32,
+ rtl::Allocator<sal_Int32>
+> queue_type;
+
+static queue_type& getCookieQueue()
+{
+ static queue_type * g_pCookies= NULL;
+ if (!g_pCookies)
+ {
+ MutexGuard guard( getUnloadingMutex() );
+ if (!g_pCookies)
+ {
+ static queue_type g_aCookieQueue;
+ g_pCookies= &g_aCookieQueue;
+ }
+ }
+ return *g_pCookies;
+}
+
+static sal_Int32 getCookie()
+{
+ static sal_Int32 cookieValue= 1;
+
+ sal_Int32 retval;
+ queue_type& regainedCookies= getCookieQueue();
+ if( regainedCookies.empty() )
+ retval= cookieValue++;
+ else
+ {
+ retval= regainedCookies.front();
+ regainedCookies.pop_front();
+ }
+ return retval;
+}
+
+static inline void recycleCookie( sal_Int32 i)
+{
+ getCookieQueue().push_back(i);
+}
+
+
+// calling the function twice with the same arguments will return tow different cookies.
+// The listener will then notified twice.
+
+extern "C"
+sal_Int32 SAL_CALL rtl_addUnloadingListener( rtl_unloadingListenerFunc callback, void* _this)
+{
+ MutexGuard guard( getUnloadingMutex());
+
+ sal_Int32 cookie= getCookie();
+ ListenerMap& listenerMap= getListenerMap();
+ listenerMap[ cookie]= std::make_pair( callback, _this);
+ return cookie;
+}
+
+
+extern "C"
+void SAL_CALL rtl_removeUnloadingListener( sal_Int32 cookie )
+{
+ MutexGuard guard( getUnloadingMutex());
+
+ ListenerMap& listenerMap= getListenerMap();
+ size_t removedElements= listenerMap.erase( cookie);
+ if( removedElements )
+ recycleCookie( cookie);
+}
+
+
+static void rtl_notifyUnloadingListeners()
+{
+ ListenerMap& listenerMap= getListenerMap();
+ for( Lis_IT it= listenerMap.begin(); it != listenerMap.end(); ++it)
+ {
+ rtl_unloadingListenerFunc callbackFunc= it->second.first;
+ callbackFunc( it->second.second);
+ }
+}
diff --git a/sal/rtl/source/uri.cxx b/sal/rtl/source/uri.cxx
new file mode 100644
index 000000000000..551c4f199251
--- /dev/null
+++ b/sal/rtl/source/uri.cxx
@@ -0,0 +1,799 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "rtl/uri.h"
+
+#include "surrogates.h"
+
+#include "osl/diagnose.h"
+#include "rtl/strbuf.hxx"
+#include "rtl/textenc.h"
+#include "rtl/textcvt.h"
+#include "rtl/uri.h"
+#include "rtl/ustrbuf.h"
+#include "rtl/ustrbuf.hxx"
+#include "rtl/ustring.h"
+#include "rtl/ustring.hxx"
+#include "sal/types.h"
+
+#include <cstddef>
+
+namespace {
+
+std::size_t const nCharClassSize = 128;
+
+sal_Unicode const cEscapePrefix = 0x25; // '%'
+
+inline bool isDigit(sal_uInt32 nUtf32)
+{
+ return nUtf32 >= 0x30 && nUtf32 <= 0x39; // '0'--'9'
+}
+
+inline bool isAlpha(sal_uInt32 nUtf32)
+{
+ // 'A'--'Z', 'a'--'z'
+ return (
+ (nUtf32 >= 0x41 && nUtf32 <= 0x5A) ||
+ (nUtf32 >= 0x61 && nUtf32 <= 0x7A)
+ );
+}
+
+inline bool isHighSurrogate(sal_uInt32 nUtf16)
+{
+ return SAL_RTL_IS_HIGH_SURROGATE(nUtf16);
+}
+
+inline bool isLowSurrogate(sal_uInt32 nUtf16)
+{
+ return SAL_RTL_IS_LOW_SURROGATE(nUtf16);
+}
+
+inline sal_uInt32 combineSurrogates(sal_uInt32 high, sal_uInt32 low)
+{
+ return SAL_RTL_COMBINE_SURROGATES(high, low);
+}
+
+inline int getHexWeight(sal_uInt32 nUtf32)
+{
+ return nUtf32 >= 0x30 && nUtf32 <= 0x39 ? // '0'--'9'
+ static_cast< int >(nUtf32 - 0x30) :
+ nUtf32 >= 0x41 && nUtf32 <= 0x46 ? // 'A'--'F'
+ static_cast< int >(nUtf32 - 0x41 + 10) :
+ nUtf32 >= 0x61 && nUtf32 <= 0x66 ? // 'a'--'f'
+ static_cast< int >(nUtf32 - 0x61 + 10) :
+ -1; // not a hex digit
+}
+
+inline bool isValid(sal_Bool const * pCharClass, sal_uInt32 nUtf32)
+{
+ return nUtf32 < nCharClassSize && pCharClass[nUtf32];
+}
+
+inline void writeUnicode(rtl_uString ** pBuffer, sal_Int32 * pCapacity,
+ sal_Unicode cChar)
+{
+ rtl_uStringbuffer_insert(pBuffer, pCapacity, (*pBuffer)->length, &cChar, 1);
+}
+
+enum EscapeType
+{
+ EscapeNo,
+ EscapeChar,
+ EscapeOctet
+};
+
+/* Read any of the following:
+
+ - sequence of escape sequences representing character from eCharset,
+ translated to single UCS4 character; or
+
+ - pair of UTF-16 surrogates, translated to single UCS4 character; or
+
+ _ single UTF-16 character, extended to UCS4 character.
+ */
+sal_uInt32 readUcs4(sal_Unicode const ** pBegin, sal_Unicode const * pEnd,
+ bool bEncoded, rtl_TextEncoding eCharset,
+ EscapeType * pType)
+{
+ sal_uInt32 nChar = *(*pBegin)++;
+ int nWeight1;
+ int nWeight2;
+ if (nChar == cEscapePrefix && bEncoded && pEnd - *pBegin >= 2
+ && (nWeight1 = getHexWeight((*pBegin)[0])) >= 0
+ && (nWeight2 = getHexWeight((*pBegin)[1])) >= 0)
+ {
+ *pBegin += 2;
+ nChar = static_cast< sal_uInt32 >(nWeight1 << 4 | nWeight2);
+ if (nChar <= 0x7F)
+ *pType = EscapeChar;
+ else if (eCharset == RTL_TEXTENCODING_UTF8)
+ {
+ if (nChar >= 0xC0 && nChar <= 0xF4)
+ {
+ sal_uInt32 nEncoded;
+ int nShift;
+ sal_uInt32 nMin;
+ if (nChar <= 0xDF)
+ {
+ nEncoded = (nChar & 0x1F) << 6;
+ nShift = 0;
+ nMin = 0x80;
+ }
+ else if (nChar <= 0xEF)
+ {
+ nEncoded = (nChar & 0x0F) << 12;
+ nShift = 6;
+ nMin = 0x800;
+ }
+ else
+ {
+ nEncoded = (nChar & 0x07) << 18;
+ nShift = 12;
+ nMin = 0x10000;
+ }
+ sal_Unicode const * p = *pBegin;
+ bool bUTF8 = true;
+ for (; nShift >= 0; nShift -= 6)
+ {
+ if (pEnd - p < 3 || p[0] != cEscapePrefix
+ || (nWeight1 = getHexWeight(p[1])) < 8
+ || nWeight1 > 11
+ || (nWeight2 = getHexWeight(p[2])) < 0)
+ {
+ bUTF8 = sal_False;
+ break;
+ }
+ p += 3;
+ nEncoded |= ((nWeight1 & 3) << 4 | nWeight2) << nShift;
+ }
+ if (bUTF8 && nEncoded >= nMin && !isHighSurrogate(nEncoded)
+ && !isLowSurrogate(nEncoded) && nEncoded <= 0x10FFFF)
+ {
+ *pBegin = p;
+ *pType = EscapeChar;
+ return nEncoded;
+ }
+ }
+ *pType = EscapeOctet;
+ }
+ else
+ {
+ rtl::OStringBuffer aBuf;
+ aBuf.append(static_cast< char >(nChar));
+ rtl_TextToUnicodeConverter aConverter
+ = rtl_createTextToUnicodeConverter(eCharset);
+ sal_Unicode const * p = *pBegin;
+ for (;;)
+ {
+ sal_Unicode aDst[2];
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ sal_Size nDstSize = rtl_convertTextToUnicode(
+ aConverter, 0, aBuf.getStr(), aBuf.getLength(), aDst,
+ sizeof aDst / sizeof aDst[0],
+ (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
+ | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR),
+ &nInfo, &nConverted);
+ if (nInfo == 0)
+ {
+ OSL_ASSERT(
+ nConverted
+ == sal::static_int_cast< sal_uInt32 >(
+ aBuf.getLength()));
+ rtl_destroyTextToUnicodeConverter(aConverter);
+ *pBegin = p;
+ *pType = EscapeChar;
+ OSL_ASSERT(
+ nDstSize == 1
+ || (nDstSize == 2 && isHighSurrogate(aDst[0])
+ && isLowSurrogate(aDst[1])));
+ return nDstSize == 1
+ ? aDst[0] : combineSurrogates(aDst[0], aDst[1]);
+ }
+ else if (nInfo == RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL
+ && pEnd - p >= 3 && p[0] == cEscapePrefix
+ && (nWeight1 = getHexWeight(p[1])) >= 0
+ && (nWeight2 = getHexWeight(p[2])) >= 0)
+ {
+ p += 3;
+ aBuf.append(static_cast< char >(nWeight1 << 4 | nWeight2));
+ }
+ else if (nInfo == RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL
+ && p != pEnd && *p <= 0x7F)
+ {
+ aBuf.append(static_cast< char >(*p++));
+ }
+ else
+ {
+ OSL_ASSERT(
+ (nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL)
+ == 0);
+ break;
+ }
+ }
+ rtl_destroyTextToUnicodeConverter(aConverter);
+ *pType = EscapeOctet;
+ }
+ return nChar;
+ }
+ else
+ {
+ *pType = EscapeNo;
+ return isHighSurrogate(nChar) && *pBegin < pEnd
+ && isLowSurrogate(**pBegin) ?
+ combineSurrogates(nChar, *(*pBegin)++) : nChar;
+ }
+}
+
+void writeUcs4(rtl_uString ** pBuffer, sal_Int32 * pCapacity, sal_uInt32 nUtf32)
+{
+ OSL_ENSURE(nUtf32 <= 0x10FFFF, "bad UTF-32 char");
+ if (nUtf32 <= 0xFFFF) {
+ writeUnicode(
+ pBuffer, pCapacity, static_cast< sal_Unicode >(nUtf32));
+ } else {
+ nUtf32 -= 0x10000;
+ writeUnicode(
+ pBuffer, pCapacity,
+ static_cast< sal_Unicode >(nUtf32 >> 10 | 0xD800));
+ writeUnicode(
+ pBuffer, pCapacity,
+ static_cast< sal_Unicode >((nUtf32 & 0x3FF) | 0xDC00));
+ }
+}
+
+void writeEscapeOctet(rtl_uString ** pBuffer, sal_Int32 * pCapacity,
+ sal_uInt32 nOctet)
+{
+ OSL_ENSURE(nOctet <= 0xFF, "bad octet");
+
+ static sal_Unicode const aHex[16]
+ = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }; /* '0'--'9', 'A'--'F' */
+
+ writeUnicode(pBuffer, pCapacity, cEscapePrefix);
+ writeUnicode(pBuffer, pCapacity, aHex[nOctet >> 4]);
+ writeUnicode(pBuffer, pCapacity, aHex[nOctet & 15]);
+}
+
+bool writeEscapeChar(rtl_uString ** pBuffer, sal_Int32 * pCapacity,
+ sal_uInt32 nUtf32, rtl_TextEncoding eCharset, bool bStrict)
+{
+ OSL_ENSURE(nUtf32 <= 0x10FFFF, "bad UTF-32 char");
+ if (eCharset == RTL_TEXTENCODING_UTF8) {
+ if (nUtf32 < 0x80)
+ writeEscapeOctet(pBuffer, pCapacity, nUtf32);
+ else if (nUtf32 < 0x800)
+ {
+ writeEscapeOctet(pBuffer, pCapacity, nUtf32 >> 6 | 0xC0);
+ writeEscapeOctet(pBuffer, pCapacity, (nUtf32 & 0x3F) | 0x80);
+ }
+ else if (nUtf32 < 0x10000)
+ {
+ writeEscapeOctet(pBuffer, pCapacity, nUtf32 >> 12 | 0xE0);
+ writeEscapeOctet(pBuffer, pCapacity, (nUtf32 >> 6 & 0x3F) | 0x80);
+ writeEscapeOctet(pBuffer, pCapacity, (nUtf32 & 0x3F) | 0x80);
+ }
+ else
+ {
+ writeEscapeOctet(pBuffer, pCapacity, nUtf32 >> 18 | 0xF0);
+ writeEscapeOctet(pBuffer, pCapacity, (nUtf32 >> 12 & 0x3F) | 0x80);
+ writeEscapeOctet(pBuffer, pCapacity, (nUtf32 >> 6 & 0x3F) | 0x80);
+ writeEscapeOctet(pBuffer, pCapacity, (nUtf32 & 0x3F) | 0x80);
+ }
+ } else {
+ rtl_UnicodeToTextConverter aConverter
+ = rtl_createUnicodeToTextConverter(eCharset);
+ sal_Unicode aSrc[2];
+ sal_Size nSrcSize;
+ if (nUtf32 <= 0xFFFF)
+ {
+ aSrc[0] = static_cast< sal_Unicode >(nUtf32);
+ nSrcSize = 1;
+ }
+ else
+ {
+ aSrc[0] = static_cast< sal_Unicode >(
+ ((nUtf32 - 0x10000) >> 10) | 0xD800);
+ aSrc[1] = static_cast< sal_Unicode >(
+ ((nUtf32 - 0x10000) & 0x3FF) | 0xDC00);
+ nSrcSize = 2;
+ }
+ sal_Char aDst[32]; // FIXME random value
+ sal_uInt32 nInfo;
+ sal_Size nConverted;
+ sal_Size nDstSize = rtl_convertUnicodeToText(
+ aConverter, 0, aSrc, nSrcSize, aDst, sizeof aDst,
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR
+ | RTL_UNICODETOTEXT_FLAGS_FLUSH,
+ &nInfo, &nConverted);
+ OSL_ASSERT((nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL) == 0);
+ rtl_destroyUnicodeToTextConverter(aConverter);
+ if (nInfo == 0) {
+ OSL_ENSURE(nConverted == nSrcSize, "bad rtl_convertUnicodeToText");
+ for (sal_Size i = 0; i < nDstSize; ++i)
+ writeEscapeOctet(pBuffer, pCapacity,
+ static_cast< unsigned char >(aDst[i]));
+ // FIXME all octets are escaped, even if there is no need
+ } else {
+ if (bStrict) {
+ return false;
+ } else {
+ writeUcs4(pBuffer, pCapacity, nUtf32);
+ }
+ }
+ }
+ return true;
+}
+
+struct Component
+{
+ sal_Unicode const * pBegin;
+ sal_Unicode const * pEnd;
+
+ inline Component(): pBegin(0) {}
+
+ inline bool isPresent() const { return pBegin != 0; }
+
+ inline sal_Int32 getLength() const;
+};
+
+inline sal_Int32 Component::getLength() const
+{
+ OSL_ENSURE(isPresent(), "taking length of non-present component");
+ return static_cast< sal_Int32 >(pEnd - pBegin);
+}
+
+struct Components
+{
+ Component aScheme;
+ Component aAuthority;
+ Component aPath;
+ Component aQuery;
+ Component aFragment;
+};
+
+void parseUriRef(rtl_uString const * pUriRef, Components * pComponents)
+{
+ // This algorithm is liberal and accepts various forms of illegal input.
+
+ sal_Unicode const * pBegin = pUriRef->buffer;
+ sal_Unicode const * pEnd = pBegin + pUriRef->length;
+ sal_Unicode const * pPos = pBegin;
+
+ if (pPos != pEnd && isAlpha(*pPos))
+ for (sal_Unicode const * p = pPos + 1; p != pEnd; ++p)
+ if (*p == ':')
+ {
+ pComponents->aScheme.pBegin = pBegin;
+ pComponents->aScheme.pEnd = ++p;
+ pPos = p;
+ break;
+ }
+ else if (!isAlpha(*p) && !isDigit(*p) && *p != '+' && *p != '-'
+ && *p != '.')
+ break;
+
+ if (pEnd - pPos >= 2 && pPos[0] == '/' && pPos[1] == '/')
+ {
+ pComponents->aAuthority.pBegin = pPos;
+ pPos += 2;
+ while (pPos != pEnd && *pPos != '/' && *pPos != '?' && *pPos != '#')
+ ++pPos;
+ pComponents->aAuthority.pEnd = pPos;
+ }
+
+ pComponents->aPath.pBegin = pPos;
+ while (pPos != pEnd && *pPos != '?' && * pPos != '#')
+ ++pPos;
+ pComponents->aPath.pEnd = pPos;
+
+ if (pPos != pEnd && *pPos == '?')
+ {
+ pComponents->aQuery.pBegin = pPos++;
+ while (pPos != pEnd && * pPos != '#')
+ ++pPos;
+ pComponents->aQuery.pEnd = pPos;
+ }
+
+ if (pPos != pEnd)
+ {
+ OSL_ASSERT(*pPos == '#');
+ pComponents->aFragment.pBegin = pPos;
+ pComponents->aFragment.pEnd = pEnd;
+ }
+}
+
+rtl::OUString joinPaths(Component const & rBasePath, Component const & rRelPath)
+{
+ OSL_ASSERT(rBasePath.isPresent() && *rBasePath.pBegin == '/');
+ OSL_ASSERT(rRelPath.isPresent());
+
+ // The invariant of aBuffer is that it always starts and ends with a slash
+ // (until probably right at the end of the algorithm, when the last segment
+ // of rRelPath is added, which does not necessarily end in a slash):
+ rtl::OUStringBuffer aBuffer(rBasePath.getLength() + rRelPath.getLength());
+ // XXX numeric overflow
+
+ // Segments "." and ".." within rBasePath are not conisdered special (but
+ // are also not removed by ".." segments within rRelPath), RFC 2396 seems a
+ // bit unclear about this point:
+ sal_Int32 nFixed = 1;
+ sal_Unicode const * p = rBasePath.pBegin + 1;
+ for (sal_Unicode const * q = p; q != rBasePath.pEnd; ++q)
+ if (*q == '/')
+ {
+ if (
+ (q - p == 1 && p[0] == '.') ||
+ (q - p == 2 && p[0] == '.' && p[1] == '.')
+ )
+ {
+ nFixed = q + 1 - rBasePath.pBegin;
+ }
+ p = q + 1;
+ }
+ aBuffer.append(rBasePath.pBegin, p - rBasePath.pBegin);
+
+ p = rRelPath.pBegin;
+ if (p != rRelPath.pEnd)
+ for (;;)
+ {
+ sal_Unicode const * q = p;
+ sal_Unicode const * r;
+ for (;;)
+ {
+ if (q == rRelPath.pEnd)
+ {
+ r = q;
+ break;
+ }
+ if (*q == '/')
+ {
+ r = q + 1;
+ break;
+ }
+ ++q;
+ }
+ if (q - p == 2 && p[0] == '.' && p[1] == '.')
+ {
+ // Erroneous excess segments ".." within rRelPath are left
+ // intact, as the examples in RFC 2396, section C.2, suggest:
+ sal_Int32 i = aBuffer.getLength() - 1;
+ if (i < nFixed)
+ {
+ aBuffer.append(p, r - p);
+ nFixed += 3;
+ }
+ else
+ {
+ while (aBuffer.charAt(i - 1) != '/')
+ --i;
+ aBuffer.setLength(i);
+ }
+ }
+ else if (q - p != 1 || *p != '.')
+ aBuffer.append(p, r - p);
+ if (q == rRelPath.pEnd)
+ break;
+ p = q + 1;
+ }
+
+ return aBuffer.makeStringAndClear();
+}
+
+}
+
+sal_Bool const * SAL_CALL rtl_getUriCharClass(rtl_UriCharClass eCharClass)
+ SAL_THROW_EXTERN_C()
+{
+ static sal_Bool const aCharClass[][nCharClassSize]
+ = {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* None */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* !"#$%&'()*+,-./*/
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*0123456789:;<=>?*/
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*@ABCDEFGHIJKLMNO*/
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*PQRSTUVWXYZ[\]^_*/
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*`abcdefghijklmno*/
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /*pqrstuvwxyz{|}~ */
+ },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Uric */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* !"#$%&'()*+,-./*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, /*0123456789:;<=>?*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, /*PQRSTUVWXYZ[\]^_*/
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */
+ },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* UricNoSlash */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, /*0123456789:;<=>?*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */
+ },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* RelSegment */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, /*0123456789:;<=>?*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */
+ },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* RegName */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, /*0123456789:;<=>?*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */
+ },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Userinfo */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, /*0123456789:;<=>?*/
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */
+ },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Pchar */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* !"#$%&'()*+,-./*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, /*0123456789:;<=>?*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */
+ },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* UnoParamValue */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, /* !"#$%&'()*+,-./*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*0123456789:;<=>?*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*@ABCDEFGHIJKLMNO*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /*PQRSTUVWXYZ[\]^_*/
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*`abcdefghijklmno*/
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0 /*pqrstuvwxyz{|}~ */
+ }};
+ OSL_ENSURE(
+ (eCharClass >= 0
+ && (sal::static_int_cast< std::size_t >(eCharClass)
+ < sizeof aCharClass / sizeof aCharClass[0])),
+ "bad eCharClass");
+ return aCharClass[eCharClass];
+}
+
+void SAL_CALL rtl_uriEncode(rtl_uString * pText, sal_Bool const * pCharClass,
+ rtl_UriEncodeMechanism eMechanism,
+ rtl_TextEncoding eCharset, rtl_uString ** pResult)
+ SAL_THROW_EXTERN_C()
+{
+ OSL_ENSURE(!pCharClass[0x25], "bad pCharClass");
+ // make sure the percent sign is encoded...
+
+ sal_Unicode const * p = pText->buffer;
+ sal_Unicode const * pEnd = p + pText->length;
+ sal_Int32 nCapacity = 0;
+ rtl_uString_new(pResult);
+ while (p < pEnd)
+ {
+ EscapeType eType;
+ sal_uInt32 nUtf32 = readUcs4(
+ &p, pEnd,
+ (eMechanism == rtl_UriEncodeKeepEscapes
+ || eMechanism == rtl_UriEncodeCheckEscapes
+ || eMechanism == rtl_UriEncodeStrictKeepEscapes),
+ eCharset, &eType);
+ switch (eType)
+ {
+ case EscapeNo:
+ if (isValid(pCharClass, nUtf32)) // implies nUtf32 <= 0x7F
+ writeUnicode(pResult, &nCapacity,
+ static_cast< sal_Unicode >(nUtf32));
+ else if (!writeEscapeChar(
+ pResult, &nCapacity, nUtf32, eCharset,
+ (eMechanism == rtl_UriEncodeStrict
+ || eMechanism == rtl_UriEncodeStrictKeepEscapes)))
+ {
+ rtl_uString_new(pResult);
+ return;
+ }
+ break;
+
+ case EscapeChar:
+ if (eMechanism == rtl_UriEncodeCheckEscapes
+ && isValid(pCharClass, nUtf32)) // implies nUtf32 <= 0x7F
+ writeUnicode(pResult, &nCapacity,
+ static_cast< sal_Unicode >(nUtf32));
+ else if (!writeEscapeChar(
+ pResult, &nCapacity, nUtf32, eCharset,
+ (eMechanism == rtl_UriEncodeStrict
+ || eMechanism == rtl_UriEncodeStrictKeepEscapes)))
+ {
+ rtl_uString_new(pResult);
+ return;
+ }
+ break;
+
+ case EscapeOctet:
+ writeEscapeOctet(pResult, &nCapacity, nUtf32);
+ break;
+ }
+ }
+}
+
+void SAL_CALL rtl_uriDecode(rtl_uString * pText,
+ rtl_UriDecodeMechanism eMechanism,
+ rtl_TextEncoding eCharset, rtl_uString ** pResult)
+ SAL_THROW_EXTERN_C()
+{
+ switch (eMechanism)
+ {
+ case rtl_UriDecodeNone:
+ rtl_uString_assign(pResult, pText);
+ break;
+
+ case rtl_UriDecodeToIuri:
+ eCharset = RTL_TEXTENCODING_UTF8;
+ default: // rtl_UriDecodeWithCharset, rtl_UriDecodeStrict
+ {
+ sal_Unicode const * p = pText->buffer;
+ sal_Unicode const * pEnd = p + pText->length;
+ sal_Int32 nCapacity = 0;
+ rtl_uString_new(pResult);
+ while (p < pEnd)
+ {
+ EscapeType eType;
+ sal_uInt32 nUtf32 = readUcs4(&p, pEnd, true, eCharset, &eType);
+ switch (eType)
+ {
+ case EscapeChar:
+ if (nUtf32 <= 0x7F && eMechanism == rtl_UriDecodeToIuri)
+ {
+ writeEscapeOctet(pResult, &nCapacity, nUtf32);
+ break;
+ }
+ case EscapeNo:
+ writeUcs4(pResult, &nCapacity, nUtf32);
+ break;
+
+ case EscapeOctet:
+ if (eMechanism == rtl_UriDecodeStrict) {
+ rtl_uString_new(pResult);
+ return;
+ }
+ writeEscapeOctet(pResult, &nCapacity, nUtf32);
+ break;
+ }
+ }
+ }
+ break;
+ }
+}
+
+sal_Bool SAL_CALL rtl_uriConvertRelToAbs(rtl_uString * pBaseUriRef,
+ rtl_uString * pRelUriRef,
+ rtl_uString ** pResult,
+ rtl_uString ** pException)
+ SAL_THROW_EXTERN_C()
+{
+ // If pRelUriRef starts with a scheme component it is an absolute URI
+ // reference, and we are done (i.e., this algorithm does not support
+ // backwards-compatible relative URIs starting with a scheme component, see
+ // RFC 2396, section 5.2, step 3):
+ Components aRelComponents;
+ parseUriRef(pRelUriRef, &aRelComponents);
+ if (aRelComponents.aScheme.isPresent())
+ {
+ rtl_uString_assign(pResult, pRelUriRef);
+ return true;
+ }
+
+ // Parse pBaseUriRef; if the scheme component is not present or not valid,
+ // or the path component is not empty and starts with anything but a slash,
+ // an exception is raised:
+ Components aBaseComponents;
+ parseUriRef(pBaseUriRef, &aBaseComponents);
+ if (!aBaseComponents.aScheme.isPresent())
+ {
+ rtl::OUString aMessage(pBaseUriRef);
+ aMessage += rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ " does not start with a scheme component"));
+ rtl_uString_assign(pException,
+ const_cast< rtl::OUString & >(aMessage).pData);
+ return false;
+ }
+ if (aBaseComponents.aPath.pBegin != aBaseComponents.aPath.pEnd
+ && *aBaseComponents.aPath.pBegin != '/')
+ {
+ rtl::OUString aMessage(pBaseUriRef);
+ aMessage += rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "path component does not start with slash"));
+ rtl_uString_assign(pException, aMessage.pData);
+ return false;
+ }
+
+ // Use the algorithm from RFC 2396, section 5.2, to turn the relative URI
+ // into an absolute one (if the relative URI is a reference to the "current
+ // document," the "current document" is here taken to be the base URI):
+ rtl::OUStringBuffer aBuffer;
+ aBuffer.append(aBaseComponents.aScheme.pBegin,
+ aBaseComponents.aScheme.getLength());
+ if (aRelComponents.aAuthority.isPresent())
+ {
+ aBuffer.append(aRelComponents.aAuthority.pBegin,
+ aRelComponents.aAuthority.getLength());
+ aBuffer.append(aRelComponents.aPath.pBegin,
+ aRelComponents.aPath.getLength());
+ if (aRelComponents.aQuery.isPresent())
+ aBuffer.append(aRelComponents.aQuery.pBegin,
+ aRelComponents.aQuery.getLength());
+ }
+ else
+ {
+ if (aBaseComponents.aAuthority.isPresent())
+ aBuffer.append(aBaseComponents.aAuthority.pBegin,
+ aBaseComponents.aAuthority.getLength());
+ if (aRelComponents.aPath.pBegin == aRelComponents.aPath.pEnd
+ && !aRelComponents.aQuery.isPresent())
+ {
+ aBuffer.append(aBaseComponents.aPath.pBegin,
+ aBaseComponents.aPath.getLength());
+ if (aBaseComponents.aQuery.isPresent())
+ aBuffer.append(aBaseComponents.aQuery.pBegin,
+ aBaseComponents.aQuery.getLength());
+ }
+ else
+ {
+ if (*aRelComponents.aPath.pBegin == '/')
+ aBuffer.append(aRelComponents.aPath.pBegin,
+ aRelComponents.aPath.getLength());
+ else
+ aBuffer.append(joinPaths(aBaseComponents.aPath,
+ aRelComponents.aPath));
+ if (aRelComponents.aQuery.isPresent())
+ aBuffer.append(aRelComponents.aQuery.pBegin,
+ aRelComponents.aQuery.getLength());
+ }
+ }
+ if (aRelComponents.aFragment.isPresent())
+ aBuffer.append(aRelComponents.aFragment.pBegin,
+ aRelComponents.aFragment.getLength());
+ rtl_uString_assign(pResult, aBuffer.makeStringAndClear().pData);
+ return true;
+}
diff --git a/sal/rtl/source/ustrbuf.c b/sal/rtl/source/ustrbuf.c
new file mode 100644
index 000000000000..d9fdb9983fb1
--- /dev/null
+++ b/sal/rtl/source/ustrbuf.c
@@ -0,0 +1,208 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <osl/interlck.h>
+
+#ifndef _RTL_STRING_HXX_
+#include <rtl/ustrbuf.hxx>
+#endif
+#include <rtl/memory.h>
+
+/*
+#include <rtl/alloc.h>
+*/
+
+
+
+/*************************************************************************
+ * rtl_uStringbuffer_newFromStr_WithLength
+ */
+void SAL_CALL rtl_uStringbuffer_newFromStr_WithLength( rtl_uString ** newStr,
+ const sal_Unicode * value,
+ sal_Int32 count)
+{
+ if (!value)
+ {
+ rtl_uString_new_WithLength( newStr, 16 );
+ return;
+ }
+
+ rtl_uString_new_WithLength( newStr, count + 16 );
+ (*newStr)->length = count;
+ rtl_copyMemory( (*newStr)->buffer, value, count * sizeof(sal_Unicode));
+ return;
+}
+
+/*************************************************************************
+ * rtl_uStringbuffer_newFromStringBuffer
+ */
+sal_Int32 SAL_CALL rtl_uStringbuffer_newFromStringBuffer( rtl_uString ** newStr,
+ sal_Int32 capacity,
+ rtl_uString * oldStr )
+{
+ sal_Int32 newCapacity = capacity;
+
+ if (newCapacity < oldStr->length)
+ newCapacity = oldStr->length;
+
+ rtl_uString_new_WithLength( newStr, newCapacity );
+
+ if (oldStr->length > 0) {
+ (*newStr)->length = oldStr->length;
+ rtl_copyMemory( (*newStr)->buffer, oldStr->buffer, oldStr->length * sizeof(sal_Unicode));
+ }
+ return newCapacity;
+}
+
+/*************************************************************************
+ * rtl_uStringbuffer_ensureCapacity
+ */
+void SAL_CALL rtl_uStringbuffer_ensureCapacity
+ (rtl_uString ** This, sal_Int32* capacity, sal_Int32 minimumCapacity)
+{
+ if (minimumCapacity > *capacity)
+ {
+ rtl_uString * pTmp = *This;
+ rtl_uString * pNew = NULL;
+ *capacity = ((*This)->length + 1) * 2;
+ if (minimumCapacity > *capacity)
+ /* still lower, set to the minimum capacity */
+ *capacity = minimumCapacity;
+
+ rtl_uString_new_WithLength(&pNew, *capacity);
+ pNew->length = (*This)->length;
+ *This = pNew;
+
+ rtl_copyMemory( (*This)->buffer, pTmp->buffer, pTmp->length * sizeof(sal_Unicode) );
+ rtl_uString_release( pTmp );
+ }
+}
+
+/*************************************************************************
+ * rtl_uStringbuffer_insert
+ */
+void SAL_CALL rtl_uStringbuffer_insert( rtl_uString ** This,
+ sal_Int32 * capacity,
+ sal_Int32 offset,
+ const sal_Unicode * str,
+ sal_Int32 len)
+{
+ sal_Int32 nOldLen;
+ sal_Unicode * pBuf;
+ sal_Int32 n;
+ if( len != 0 )
+ {
+ if (*capacity < (*This)->length + len)
+ rtl_uStringbuffer_ensureCapacity( This, capacity, (*This)->length + len );
+
+ /*
+ if( len == 1 )
+ This->buffer
+ */
+ nOldLen = (*This)->length;
+ pBuf = (*This)->buffer;
+
+ /* copy the tail */
+ n = (nOldLen - offset);
+ if( n == 1 )
+ /* optimized for 1 character */
+ pBuf[offset + len] = pBuf[offset];
+ else if( n > 1 )
+ rtl_moveMemory( pBuf + offset + len, pBuf + offset, n * sizeof(sal_Unicode) );
+
+ /* insert the new characters */
+ if( len == 1 )
+ /* optimized for 1 character */
+ pBuf[offset] = *str;
+ else if( len > 1 )
+ rtl_copyMemory( pBuf + offset, str, len * sizeof(sal_Unicode) );
+ (*This)->length = nOldLen + len;
+ pBuf[ nOldLen + len ] = 0;
+ }
+}
+
+void rtl_uStringbuffer_insertUtf32(
+ rtl_uString ** pThis, sal_Int32 * capacity, sal_Int32 offset, sal_uInt32 c)
+{
+ sal_Unicode buf[2];
+ sal_Int32 len;
+ OSL_ASSERT(c <= 0x10FFFF && !(c >= 0xD800 && c <= 0xDFFF));
+ if (c <= 0xFFFF) {
+ buf[0] = (sal_Unicode) c;
+ len = 1;
+ } else {
+ c -= 0x10000;
+ buf[0] = (sal_Unicode) ((c >> 10) | 0xD800);
+ buf[1] = (sal_Unicode) ((c & 0x3FF) | 0xDC00);
+ len = 2;
+ }
+ rtl_uStringbuffer_insert(pThis, capacity, offset, buf, len);
+}
+
+/*************************************************************************
+ * rtl_uStringbuffer_insert_ascii
+ */
+void SAL_CALL rtl_uStringbuffer_insert_ascii( /*inout*/rtl_uString ** This,
+ /*inout*/sal_Int32 * capacity,
+ sal_Int32 offset,
+ const sal_Char * str,
+ sal_Int32 len)
+{
+ sal_Int32 nOldLen;
+ sal_Unicode * pBuf;
+ sal_Int32 n;
+ if( len != 0 )
+ {
+ if (*capacity < (*This)->length + len)
+ rtl_uStringbuffer_ensureCapacity( This, capacity, (*This)->length + len );
+
+ nOldLen = (*This)->length;
+ pBuf = (*This)->buffer;
+
+ /* copy the tail */
+ n = (nOldLen - offset);
+ if( n == 1 )
+ /* optimized for 1 character */
+ pBuf[offset + len] = pBuf[offset];
+ else if( n > 1 )
+ rtl_moveMemory( pBuf + offset + len, pBuf + offset, n * sizeof(sal_Unicode) );
+
+ /* insert the new characters */
+ for( n = 0; n < len; n++ )
+ {
+ /* Check ASCII range */
+ OSL_ENSURE( (*str & 0x80) == 0, "Found ASCII char > 127");
+
+ pBuf[offset + n] = (sal_Unicode)*(str++);
+ }
+
+ (*This)->length = nOldLen + len;
+ pBuf[ nOldLen + len ] = 0;
+ }
+}
+
+
diff --git a/sal/rtl/source/ustring.c b/sal/rtl/source/ustring.c
new file mode 100644
index 000000000000..b0bdd2d98e73
--- /dev/null
+++ b/sal/rtl/source/ustring.c
@@ -0,0 +1,934 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4738) // storing 32-bit float result in memory, possible loss of performance
+#endif
+
+#include <rtl/memory.h>
+#include <osl/diagnose.h>
+#include <osl/interlck.h>
+#include <rtl/alloc.h>
+#include <osl/mutex.h>
+#include <osl/doublecheckedlocking.h>
+#include <rtl/tencinfo.h>
+
+#include <string.h>
+#include <sal/alloca.h>
+
+#include "hash.h"
+#include "strimp.h"
+#include "surrogates.h"
+#include <rtl/ustring.h>
+
+#include "rtl/math.h"
+#include "rtl/tencinfo.h"
+
+/* ======================================================================= */
+
+/* static data to be referenced by all empty strings
+ * the refCount is predefined to 1 and must never become 0 !
+ */
+static rtl_uString const aImplEmpty_rtl_uString =
+{
+ (sal_Int32) (SAL_STRING_INTERN_FLAG|SAL_STRING_STATIC_FLAG|1), /*sal_Int32 refCount; */
+ 0, /*sal_Int32 length; */
+ { 0 } /*sal_Unicode buffer[1];*/
+};
+
+/* ======================================================================= */
+
+#define IMPL_RTL_STRCODE sal_Unicode
+#define IMPL_RTL_USTRCODE( c ) (c)
+#define IMPL_RTL_STRNAME( n ) rtl_ustr_ ## n
+
+#define IMPL_RTL_STRINGNAME( n ) rtl_uString_ ## n
+#define IMPL_RTL_STRINGDATA rtl_uString
+#define IMPL_RTL_EMPTYSTRING aImplEmpty_rtl_uString
+#define IMPL_RTL_INTERN
+static void internRelease (rtl_uString *pThis);
+
+/* ======================================================================= */
+
+/* Include String/UString template code */
+
+#include "strtmpl.c"
+
+sal_Int32 rtl_ustr_indexOfAscii_WithLength(
+ sal_Unicode const * str, sal_Int32 len,
+ char const * subStr, sal_Int32 subLen)
+{
+ if (subLen > 0 && subLen <= len) {
+ sal_Int32 i;
+ for (i = 0; i <= len - subLen; ++i) {
+ if (rtl_ustr_asciil_reverseEquals_WithLength(
+ str + i, subStr, subLen))
+ {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+sal_Int32 rtl_ustr_lastIndexOfAscii_WithLength(
+ sal_Unicode const * str, sal_Int32 len,
+ char const * subStr, sal_Int32 subLen)
+{
+ if (subLen > 0 && subLen <= len) {
+ sal_Int32 i;
+ for (i = len - subLen; i >= 0; --i) {
+ if (rtl_ustr_asciil_reverseEquals_WithLength(
+ str + i, subStr, subLen))
+ {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
+sal_Int32 SAL_CALL rtl_ustr_valueOfFloat(sal_Unicode * pStr, float f)
+{
+ rtl_uString * pResult = NULL;
+ sal_Int32 nLen;
+ rtl_math_doubleToUString(
+ &pResult, 0, 0, f, rtl_math_StringFormat_G,
+ RTL_USTR_MAX_VALUEOFFLOAT - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0,
+ 0, sal_True);
+ nLen = pResult->length;
+ OSL_ASSERT(nLen < RTL_USTR_MAX_VALUEOFFLOAT);
+ rtl_copyMemory(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Unicode));
+ rtl_uString_release(pResult);
+ return nLen;
+}
+
+sal_Int32 SAL_CALL rtl_ustr_valueOfDouble(sal_Unicode * pStr, double d)
+{
+ rtl_uString * pResult = NULL;
+ sal_Int32 nLen;
+ rtl_math_doubleToUString(
+ &pResult, 0, 0, d, rtl_math_StringFormat_G,
+ RTL_USTR_MAX_VALUEOFDOUBLE - RTL_CONSTASCII_LENGTH("-x.E-xxx"), '.', 0,
+ 0, sal_True);
+ nLen = pResult->length;
+ OSL_ASSERT(nLen < RTL_USTR_MAX_VALUEOFDOUBLE);
+ rtl_copyMemory(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Unicode));
+ rtl_uString_release(pResult);
+ return nLen;
+}
+
+float SAL_CALL rtl_ustr_toFloat(sal_Unicode const * pStr)
+{
+ return (float) rtl_math_uStringToDouble(pStr,
+ pStr + rtl_ustr_getLength(pStr),
+ '.', 0, 0, 0);
+}
+
+double SAL_CALL rtl_ustr_toDouble(sal_Unicode const * pStr)
+{
+ return rtl_math_uStringToDouble(pStr, pStr + rtl_ustr_getLength(pStr), '.',
+ 0, 0, 0);
+}
+
+/* ======================================================================= */
+
+sal_Int32 SAL_CALL rtl_ustr_ascii_compare( const sal_Unicode* pStr1,
+ const sal_Char* pStr2 )
+{
+ sal_Int32 nRet;
+ while ( ((nRet = ((sal_Int32)(*pStr1))-
+ ((sal_Int32)((unsigned char)(*pStr2)))) == 0) &&
+ *pStr2 )
+ {
+ pStr1++;
+ pStr2++;
+ }
+
+ return nRet;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL rtl_ustr_ascii_compare_WithLength( const sal_Unicode* pStr1,
+ sal_Int32 nStr1Len,
+ const sal_Char* pStr2 )
+{
+ sal_Int32 nRet = 0;
+ while( ((nRet = (nStr1Len ? (sal_Int32)(*pStr1) : 0)-
+ ((sal_Int32)((unsigned char)(*pStr2)))) == 0) &&
+ nStr1Len && *pStr2 )
+ {
+ pStr1++;
+ pStr2++;
+ nStr1Len--;
+ }
+
+ return nRet;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompare_WithLength( const sal_Unicode* pStr1,
+ sal_Int32 nStr1Len,
+ const sal_Char* pStr2,
+ sal_Int32 nShortenedLength )
+{
+ const sal_Unicode* pStr1End = pStr1 + nStr1Len;
+ sal_Int32 nRet;
+ while ( (nShortenedLength > 0) &&
+ (pStr1 < pStr1End) && *pStr2 )
+ {
+ /* Check ASCII range */
+ OSL_ENSURE( (*pStr2 & 0x80) == 0, "Found ASCII char > 127");
+
+ nRet = ((sal_Int32)*pStr1)-
+ ((sal_Int32)(unsigned char)*pStr2);
+ if ( nRet != 0 )
+ return nRet;
+
+ nShortenedLength--;
+ pStr1++;
+ pStr2++;
+ }
+
+ if ( nShortenedLength <= 0 )
+ return 0;
+
+ if ( *pStr2 )
+ {
+ OSL_ENSURE( pStr1 == pStr1End, "pStr1 == pStr1End failed" );
+ // first is a substring of the second string => less (negative value)
+ nRet = -1;
+ }
+ else
+ {
+ // greater or equal
+ nRet = pStr1End - pStr1;
+ }
+
+ return nRet;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL rtl_ustr_asciil_reverseCompare_WithLength( const sal_Unicode* pStr1,
+ sal_Int32 nStr1Len,
+ const sal_Char* pStr2,
+ sal_Int32 nStr2Len )
+{
+ const sal_Unicode* pStr1Run = pStr1+nStr1Len;
+ const sal_Char* pStr2Run = pStr2+nStr2Len;
+ sal_Int32 nRet;
+ while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) )
+ {
+ pStr1Run--;
+ pStr2Run--;
+ nRet = ((sal_Int32)*pStr1Run)-((sal_Int32)*pStr2Run);
+ if ( nRet )
+ return nRet;
+ }
+
+ return nStr1Len - nStr2Len;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Bool SAL_CALL rtl_ustr_asciil_reverseEquals_WithLength( const sal_Unicode* pStr1,
+ const sal_Char* pStr2,
+ sal_Int32 nStrLen )
+{
+ const sal_Unicode* pStr1Run = pStr1+nStrLen;
+ const sal_Char* pStr2Run = pStr2+nStrLen;
+ while ( pStr1 < pStr1Run )
+ {
+ pStr1Run--;
+ pStr2Run--;
+ if( *pStr1Run != (sal_Unicode)*pStr2Run )
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase( const sal_Unicode* pStr1,
+ const sal_Char* pStr2 )
+{
+ sal_Int32 nRet;
+ sal_Int32 c1;
+ sal_Int32 c2;
+ do
+ {
+ /* If character between 'A' and 'Z', than convert it to lowercase */
+ c1 = (sal_Int32)*pStr1;
+ c2 = (sal_Int32)((unsigned char)*pStr2);
+ if ( (c1 >= 65) && (c1 <= 90) )
+ c1 += 32;
+ if ( (c2 >= 65) && (c2 <= 90) )
+ c2 += 32;
+ nRet = c1-c2;
+ if ( nRet != 0 )
+ return nRet;
+
+ pStr1++;
+ pStr2++;
+ }
+ while ( c2 );
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( const sal_Unicode* pStr1,
+ sal_Int32 nStr1Len,
+ const sal_Char* pStr2 )
+{
+ sal_Int32 nRet;
+ sal_Int32 c1;
+ sal_Int32 c2;
+ do
+ {
+ if ( !nStr1Len )
+ return *pStr2 == '\0' ? 0 : -1;
+
+ /* If character between 'A' and 'Z', than convert it to lowercase */
+ c1 = (sal_Int32)*pStr1;
+ c2 = (sal_Int32)((unsigned char)*pStr2);
+ if ( (c1 >= 65) && (c1 <= 90) )
+ c1 += 32;
+ if ( (c2 >= 65) && (c2 <= 90) )
+ c2 += 32;
+ nRet = c1-c2;
+ if ( nRet != 0 )
+ return nRet;
+
+ pStr1++;
+ pStr2++;
+ nStr1Len--;
+ }
+ while( c2 );
+
+ return 0;
+}
+
+sal_Int32 rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
+ sal_Unicode const * first, sal_Int32 firstLen,
+ char const * second, sal_Int32 secondLen)
+{
+ sal_Int32 i;
+ sal_Int32 len = firstLen < secondLen ? firstLen : secondLen;
+ for (i = 0; i < len; ++i) {
+ sal_Int32 c1 = *first++;
+ sal_Int32 c2 = (unsigned char) *second++;
+ sal_Int32 d;
+ if (c1 >= 65 && c1 <= 90) {
+ c1 += 32;
+ }
+ if (c2 >= 65 && c2 <= 90) {
+ c2 += 32;
+ }
+ d = c1 - c2;
+ if (d != 0) {
+ return d;
+ }
+ }
+ return firstLen - secondLen;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( const sal_Unicode* pStr1,
+ sal_Int32 nStr1Len,
+ const sal_Char* pStr2,
+ sal_Int32 nShortenedLength )
+{
+ const sal_Unicode* pStr1End = pStr1 + nStr1Len;
+ sal_Int32 nRet;
+ sal_Int32 c1;
+ sal_Int32 c2;
+ while ( (nShortenedLength > 0) &&
+ (pStr1 < pStr1End) && *pStr2 )
+ {
+ /* Check ASCII range */
+ OSL_ENSURE( (*pStr2 & 0x80) == 0, "Found ASCII char > 127");
+
+ /* If character between 'A' and 'Z', than convert it to lowercase */
+ c1 = (sal_Int32)*pStr1;
+ c2 = (sal_Int32)((unsigned char)*pStr2);
+ if ( (c1 >= 65) && (c1 <= 90) )
+ c1 += 32;
+ if ( (c2 >= 65) && (c2 <= 90) )
+ c2 += 32;
+ nRet = c1-c2;
+ if ( nRet != 0 )
+ return nRet;
+
+ nShortenedLength--;
+ pStr1++;
+ pStr2++;
+ }
+
+ if ( nShortenedLength <= 0 )
+ return 0;
+
+ if ( *pStr2 )
+ {
+ OSL_ENSURE( pStr1 == pStr1End, "pStr1 == pStr1End failed" );
+ // first is a substring of the second string => less (negative value)
+ nRet = -1;
+ }
+ else
+ {
+ // greater or equal
+ nRet = pStr1End - pStr1;
+ }
+
+ return nRet;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL rtl_uString_newFromAscii( rtl_uString** ppThis,
+ const sal_Char* pCharStr )
+{
+ sal_Int32 nLen;
+
+ if ( pCharStr )
+ {
+ const sal_Char* pTempStr = pCharStr;
+ while( *pTempStr )
+ pTempStr++;
+ nLen = pTempStr-pCharStr;
+ }
+ else
+ nLen = 0;
+
+ if ( !nLen )
+ {
+ IMPL_RTL_STRINGNAME( new )( ppThis );
+ return;
+ }
+
+ if ( *ppThis )
+ IMPL_RTL_STRINGNAME( release )( *ppThis );
+
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
+ OSL_ASSERT(*ppThis != NULL);
+ if ( (*ppThis) )
+ {
+ IMPL_RTL_STRCODE* pBuffer = (*ppThis)->buffer;
+ do
+ {
+ /* Check ASCII range */
+ OSL_ENSURE( ((unsigned char)*pCharStr) <= 127,
+ "rtl_uString_newFromAscii() - Found ASCII char > 127" );
+
+ *pBuffer = *pCharStr;
+ pBuffer++;
+ pCharStr++;
+ }
+ while ( *pCharStr );
+ }
+}
+
+void SAL_CALL rtl_uString_newFromCodePoints(
+ rtl_uString ** newString, sal_uInt32 const * codePoints,
+ sal_Int32 codePointCount)
+{
+ sal_Int32 n;
+ sal_Int32 i;
+ sal_Unicode * p;
+ OSL_ASSERT(
+ newString != NULL &&
+ (codePoints != NULL || codePointCount == 0) &&
+ codePointCount >= 0);
+ if (codePointCount == 0) {
+ rtl_uString_new(newString);
+ return;
+ }
+ if (*newString != NULL) {
+ rtl_uString_release(*newString);
+ }
+ n = codePointCount;
+ for (i = 0; i < codePointCount; ++i) {
+ OSL_ASSERT(codePoints[i] <= 0x10FFFF);
+ if (codePoints[i] >= 0x10000) {
+ ++n;
+ }
+ }
+ /* Builds on the assumption that sal_Int32 uses 32 bit two's complement
+ representation with wrap around (the necessary number of UTF-16 code
+ units will be no larger than 2 * SAL_MAX_INT32, represented as
+ sal_Int32 -2): */
+ if (n < 0) {
+ *newString = NULL;
+ return;
+ }
+ *newString = rtl_uString_ImplAlloc(n);
+ if (*newString == NULL) {
+ return;
+ }
+ p = (*newString)->buffer;
+ for (i = 0; i < codePointCount; ++i) {
+ sal_uInt32 c = codePoints[i];
+ if (c < 0x10000) {
+ *p++ = (sal_Unicode) c;
+ } else {
+ c -= 0x10000;
+ *p++ = (sal_Unicode) ((c >> 10) | SAL_RTL_FIRST_HIGH_SURROGATE);
+ *p++ = (sal_Unicode) ((c & 0x3FF) | SAL_RTL_FIRST_LOW_SURROGATE);
+ }
+ }
+}
+
+/* ======================================================================= */
+
+static int rtl_ImplGetFastUTF8UnicodeLen( const sal_Char* pStr, sal_Int32 nLen )
+{
+ int n;
+ sal_uChar c;
+ const sal_Char* pEndStr;
+
+ n = 0;
+ pEndStr = pStr+nLen;
+ while ( pStr < pEndStr )
+ {
+ c = (sal_uChar)*pStr;
+
+ if ( !(c & 0x80) )
+ pStr++;
+ else if ( (c & 0xE0) == 0xC0 )
+ pStr += 2;
+ else if ( (c & 0xF0) == 0xE0 )
+ pStr += 3;
+ else if ( (c & 0xF8) == 0xF0 )
+ pStr += 4;
+ else if ( (c & 0xFC) == 0xF8 )
+ pStr += 5;
+ else if ( (c & 0xFE) == 0xFC )
+ pStr += 6;
+ else
+ pStr++;
+
+ n++;
+ }
+
+ return n;
+}
+
+/* ----------------------------------------------------------------------- */
+
+static void rtl_string2UString_status( rtl_uString** ppThis,
+ const sal_Char* pStr,
+ sal_Int32 nLen,
+ rtl_TextEncoding eTextEncoding,
+ sal_uInt32 nCvtFlags,
+ sal_uInt32 *pInfo )
+{
+ OSL_ENSURE(rtl_isOctetTextEncoding(eTextEncoding),
+ "rtl_string2UString_status() - Wrong TextEncoding" );
+
+ if ( !nLen )
+ {
+ rtl_uString_new( ppThis );
+ if (pInfo != NULL) {
+ *pInfo = 0;
+ }
+ }
+ else
+ {
+ if ( *ppThis )
+ IMPL_RTL_STRINGNAME( release )( *ppThis );
+
+ /* Optimization for US-ASCII */
+ if ( eTextEncoding == RTL_TEXTENCODING_ASCII_US )
+ {
+ IMPL_RTL_STRCODE* pBuffer;
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
+ if (*ppThis == NULL) {
+ if (pInfo != NULL) {
+ *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR |
+ RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ }
+ return;
+ }
+ pBuffer = (*ppThis)->buffer;
+ do
+ {
+ /* Check ASCII range */
+ OSL_ENSURE( ((unsigned char)*pStr) <= 127,
+ "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" );
+
+ *pBuffer = *pStr;
+ pBuffer++;
+ pStr++;
+ nLen--;
+ }
+ while ( nLen );
+ if (pInfo != NULL) {
+ *pInfo = 0;
+ }
+ }
+ else
+ {
+ rtl_uString* pTemp;
+ rtl_uString* pTemp2 = NULL;
+ rtl_TextToUnicodeConverter hConverter;
+ sal_uInt32 nInfo;
+ sal_Size nSrcBytes;
+ sal_Size nDestChars;
+ sal_Size nNewLen;
+
+ /* Optimization for UTF-8 - we try to calculate the exact length */
+ /* For all other encoding we try the maximum - and reallocate
+ the buffer if needed */
+ if ( eTextEncoding == RTL_TEXTENCODING_UTF8 )
+ {
+ nNewLen = rtl_ImplGetFastUTF8UnicodeLen( pStr, nLen );
+ /* Includes the string only ASCII, then we could copy
+ the buffer faster */
+ if ( nNewLen == (sal_Size)nLen )
+ {
+ IMPL_RTL_STRCODE* pBuffer;
+ *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
+ if (*ppThis == NULL)
+ {
+ if (pInfo != NULL) {
+ *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR |
+ RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ }
+ return;
+ }
+ pBuffer = (*ppThis)->buffer;
+ do
+ {
+ /* Check ASCII range */
+ OSL_ENSURE( ((unsigned char)*pStr) <= 127,
+ "rtl_string2UString_status() - UTF8 test encoding is wrong" );
+
+ *pBuffer = *pStr;
+ pBuffer++;
+ pStr++;
+ nLen--;
+ }
+ while ( nLen );
+ if (pInfo != NULL) {
+ *pInfo = 0;
+ }
+ return;
+ }
+ }
+ else
+ nNewLen = nLen;
+
+ nCvtFlags |= RTL_TEXTTOUNICODE_FLAGS_FLUSH;
+ hConverter = rtl_createTextToUnicodeConverter( eTextEncoding );
+
+ pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
+ if (pTemp == NULL) {
+ if (pInfo != NULL) {
+ *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR |
+ RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ }
+ return;
+ }
+ nDestChars = rtl_convertTextToUnicode( hConverter, 0,
+ pStr, nLen,
+ pTemp->buffer, nNewLen,
+ nCvtFlags,
+ &nInfo, &nSrcBytes );
+
+ /* Buffer not big enough, try again with enough space */
+ /* Shouldn't be the case, but if we get textencoding which
+ could results in more unicode characters we have this
+ code here. Could be the case for apple encodings */
+ while ( nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL )
+ {
+ rtl_freeMemory( pTemp );
+ nNewLen += 8;
+ pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
+ if (pTemp == NULL) {
+ if (pInfo != NULL) {
+ *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR |
+ RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ }
+ return;
+ }
+ nDestChars = rtl_convertTextToUnicode( hConverter, 0,
+ pStr, nLen,
+ pTemp->buffer, nNewLen,
+ nCvtFlags,
+ &nInfo, &nSrcBytes );
+ }
+
+ if (pInfo)
+ *pInfo = nInfo;
+
+ /* Set the buffer to the correct size or if there is too
+ much overhead, reallocate to the correct size */
+ if ( nNewLen > nDestChars+8 )
+ {
+ pTemp2 = IMPL_RTL_STRINGNAME( ImplAlloc )( nDestChars );
+ }
+ if (pTemp2 != NULL)
+ {
+ rtl_str_ImplCopy(pTemp2->buffer, pTemp->buffer, nDestChars);
+ rtl_freeMemory(pTemp);
+ pTemp = pTemp2;
+ }
+ else
+ {
+ pTemp->length = nDestChars;
+ pTemp->buffer[nDestChars] = 0;
+ }
+
+ rtl_destroyTextToUnicodeConverter( hConverter );
+ *ppThis = pTemp;
+
+ /* Results the conversion in an empty buffer -
+ create an empty string */
+ if ( pTemp && !nDestChars )
+ rtl_uString_new( ppThis );
+ }
+ }
+}
+
+void SAL_CALL rtl_string2UString( rtl_uString** ppThis,
+ const sal_Char* pStr,
+ sal_Int32 nLen,
+ rtl_TextEncoding eTextEncoding,
+ sal_uInt32 nCvtFlags )
+{
+ rtl_string2UString_status( ppThis, pStr, nLen, eTextEncoding,
+ nCvtFlags, NULL );
+}
+
+/* ----------------------------------------------------------------------- */
+
+typedef enum {
+ CANNOT_RETURN,
+ CAN_RETURN = 1
+} StrLifecycle;
+
+static oslMutex
+getInternMutex()
+{
+ static oslMutex pPoolGuard = NULL;
+ if( !pPoolGuard )
+ {
+ oslMutex pGlobalGuard;
+ pGlobalGuard = *osl_getGlobalMutex();
+ osl_acquireMutex( pGlobalGuard );
+ if( !pPoolGuard )
+ {
+ oslMutex p = osl_createMutex();
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ pPoolGuard = p;
+ }
+ osl_releaseMutex( pGlobalGuard );
+ }
+ else
+ {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+
+ return pPoolGuard;
+}
+
+/* returns true if we found a dup in the pool */
+static void rtl_ustring_intern_internal( rtl_uString ** newStr,
+ rtl_uString * str,
+ StrLifecycle can_return )
+{
+ oslMutex pPoolMutex;
+
+ pPoolMutex = getInternMutex();
+
+ osl_acquireMutex( pPoolMutex );
+
+ *newStr = rtl_str_hash_intern (str, can_return);
+
+ osl_releaseMutex( pPoolMutex );
+
+ if( can_return && *newStr != str )
+ { /* we dupped, then found a match */
+ rtl_freeMemory( str );
+ }
+}
+
+void SAL_CALL rtl_uString_intern( rtl_uString ** newStr,
+ rtl_uString * str)
+{
+ if (SAL_STRING_IS_INTERN(str))
+ {
+ IMPL_RTL_AQUIRE( str );
+ *newStr = str;
+ }
+ else
+ {
+ rtl_uString *pOrg = *newStr;
+ *newStr = NULL;
+ rtl_ustring_intern_internal( newStr, str, CANNOT_RETURN );
+ if (pOrg)
+ rtl_uString_release (pOrg);
+ }
+}
+
+void SAL_CALL rtl_uString_internConvert( rtl_uString ** newStr,
+ const sal_Char * str,
+ sal_Int32 len,
+ rtl_TextEncoding eTextEncoding,
+ sal_uInt32 convertFlags,
+ sal_uInt32 * pInfo )
+{
+ rtl_uString *scratch;
+
+ if (*newStr)
+ {
+ rtl_uString_release (*newStr);
+ *newStr = NULL;
+ }
+
+ if ( len < 256 )
+ { // try various optimisations
+ if ( len < 0 )
+ len = strlen( str );
+ if ( eTextEncoding == RTL_TEXTENCODING_ASCII_US )
+ {
+ int i;
+ rtl_uString *pScratch;
+ pScratch = alloca( sizeof( rtl_uString )
+ + len * sizeof (IMPL_RTL_STRCODE ) );
+ for (i = 0; i < len; i++)
+ {
+ /* Check ASCII range */
+ OSL_ENSURE( ((unsigned char)str[i]) <= 127,
+ "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" );
+ pScratch->buffer[i] = str[i];
+ }
+ pScratch->length = len;
+ rtl_ustring_intern_internal( newStr, pScratch, CANNOT_RETURN );
+ return;
+ }
+ /* FIXME: we want a nice UTF-8 / alloca shortcut here */
+ }
+
+ scratch = NULL;
+ rtl_string2UString_status( &scratch, str, len, eTextEncoding, convertFlags,
+ pInfo );
+ if (!scratch) {
+ return;
+ }
+ rtl_ustring_intern_internal( newStr, scratch, CAN_RETURN );
+}
+
+static void
+internRelease (rtl_uString *pThis)
+{
+ oslMutex pPoolMutex;
+
+ rtl_uString *pFree = NULL;
+ if ( SAL_STRING_REFCOUNT(
+ osl_decrementInterlockedCount( &(pThis->refCount) ) ) == 0)
+ {
+ pPoolMutex = getInternMutex();
+ osl_acquireMutex( pPoolMutex );
+
+ rtl_str_hash_remove (pThis);
+
+ /* May have been separately acquired */
+ if ( SAL_STRING_REFCOUNT(
+ osl_incrementInterlockedCount( &(pThis->refCount) ) ) == 1 )
+ {
+ /* we got the last ref */
+ pFree = pThis;
+ }
+ else /* very unusual */
+ {
+ internRelease (pThis);
+ }
+
+ osl_releaseMutex( pPoolMutex );
+ }
+ if (pFree)
+ rtl_freeMemory (pFree);
+}
+
+sal_uInt32 SAL_CALL rtl_uString_iterateCodePoints(
+ rtl_uString const * string, sal_Int32 * indexUtf16,
+ sal_Int32 incrementCodePoints)
+{
+ sal_Int32 n;
+ sal_Unicode cu;
+ sal_uInt32 cp;
+ OSL_ASSERT(string != NULL && indexUtf16 != NULL);
+ n = *indexUtf16;
+ OSL_ASSERT(n >= 0 && n <= string->length);
+ while (incrementCodePoints < 0) {
+ OSL_ASSERT(n > 0);
+ cu = string->buffer[--n];
+ if (SAL_RTL_IS_LOW_SURROGATE(cu) && n != 0 &&
+ SAL_RTL_IS_HIGH_SURROGATE(string->buffer[n - 1]))
+ {
+ --n;
+ }
+ ++incrementCodePoints;
+ }
+ OSL_ASSERT(n >= 0 && n < string->length);
+ cu = string->buffer[n];
+ if (SAL_RTL_IS_HIGH_SURROGATE(cu) && string->length - n >= 2 &&
+ SAL_RTL_IS_LOW_SURROGATE(string->buffer[n + 1]))
+ {
+ cp = SAL_RTL_COMBINE_SURROGATES(cu, string->buffer[n + 1]);
+ } else {
+ cp = cu;
+ }
+ while (incrementCodePoints > 0) {
+ OSL_ASSERT(n < string->length);
+ cu = string->buffer[n++];
+ if (SAL_RTL_IS_HIGH_SURROGATE(cu) && n != string->length &&
+ SAL_RTL_IS_LOW_SURROGATE(string->buffer[n]))
+ {
+ ++n;
+ }
+ --incrementCodePoints;
+ }
+ OSL_ASSERT(n >= 0 && n <= string->length);
+ *indexUtf16 = n;
+ return cp;
+}
+
+sal_Bool rtl_convertStringToUString(
+ rtl_uString ** target, char const * source, sal_Int32 length,
+ rtl_TextEncoding encoding, sal_uInt32 flags) SAL_THROW_EXTERN_C()
+{
+ sal_uInt32 info;
+ rtl_string2UString_status(target, source, length, encoding, flags, &info);
+ return (sal_Bool) ((info & RTL_TEXTTOUNICODE_INFO_ERROR) == 0);
+}
diff --git a/sal/rtl/source/uuid.cxx b/sal/rtl/source/uuid.cxx
new file mode 100644
index 000000000000..79790c99887e
--- /dev/null
+++ b/sal/rtl/source/uuid.cxx
@@ -0,0 +1,180 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <osl/mutex.hxx>
+#include <rtl/random.h>
+#include <rtl/uuid.h>
+#include <rtl/digest.h>
+
+#define SWAP_INT32_TO_NETWORK(x)\
+ { sal_uInt32 y = x;\
+ sal_uInt8 *p = (sal_uInt8 * )&(x); \
+ p[0] = (sal_uInt8) ( ( y >> 24 ) & 0xff );\
+ p[1] = (sal_uInt8) ( ( y >> 16 ) & 0xff );\
+ p[2] = (sal_uInt8) ( ( y >> 8 ) & 0xff );\
+ p[3] = (sal_uInt8) ( ( y ) & 0xff);\
+ }
+#define SWAP_INT16_TO_NETWORK(x)\
+ { sal_uInt16 y = x;\
+ sal_uInt8 *p = (sal_uInt8 * )&(x); \
+ p[0] = (sal_uInt8) ( ( y >> 8 ) & 0xff );\
+ p[1] = (sal_uInt8) ( ( y ) & 0xff);\
+ }
+
+#define SWAP_NETWORK_TO_INT16(x)\
+ { sal_uInt16 y = x;\
+ sal_uInt8 *p = (sal_uInt8 * )&(y);\
+ x = ( ( ((sal_uInt16)p[0]) & 0xff) << 8 ) |\
+ ( ( (sal_uInt16)p[1]) & 0xff);\
+ }
+#define SWAP_NETWORK_TO_INT32(x)\
+ { sal_uInt32 y = x;\
+ sal_uInt8 *p = (sal_uInt8 * )&(y); \
+ x = ( ( ((sal_uInt32)p[0]) & 0xff) << 24 ) |\
+ ( ( ((sal_uInt32)p[1]) & 0xff) << 16 ) |\
+ ( ( ((sal_uInt32)p[2]) & 0xff) << 8 ) |\
+ ( ( (sal_uInt32)p[3]) & 0xff);\
+ }
+
+typedef struct _UUID
+{
+ sal_uInt32 time_low;
+ sal_uInt16 time_mid;
+ sal_uInt16 time_hi_and_version;
+ sal_uInt8 clock_seq_hi_and_reserved;
+ sal_uInt8 clock_seq_low;
+ sal_uInt8 node[6];
+} UUID;
+
+static void write_v3( sal_uInt8 *pUuid )
+{
+ UUID uuid;
+ // copy to avoid alignment problems
+ memcpy( &uuid , pUuid , 16 );
+
+ SWAP_NETWORK_TO_INT32( uuid.time_low );
+ SWAP_NETWORK_TO_INT16( uuid.time_mid );
+ SWAP_NETWORK_TO_INT16( uuid.time_hi_and_version );
+
+ /* put in the variant and version bits */
+ uuid.time_hi_and_version &= 0x0FFF;
+ uuid.time_hi_and_version |= (3 << 12);
+ uuid.clock_seq_hi_and_reserved &= 0x3F;
+ uuid.clock_seq_hi_and_reserved |= 0x80;
+
+ SWAP_INT32_TO_NETWORK( uuid.time_low );
+ SWAP_INT16_TO_NETWORK( uuid.time_mid );
+ SWAP_INT16_TO_NETWORK( uuid.time_hi_and_version );
+
+ memcpy( pUuid , &uuid , 16 );
+}
+
+
+extern "C" void SAL_CALL rtl_createUuid( sal_uInt8 *pTargetUUID ,
+ const sal_uInt8 *, sal_Bool )
+{
+ {
+ osl::MutexGuard g(osl::Mutex::getGlobalMutex());
+ static rtlRandomPool pool = NULL;
+ if (pool == NULL) {
+ pool = rtl_random_createPool();
+ if (pool == NULL) {
+ abort();
+ // only possible way to signal failure here (rtl_createUuid
+ // being part of a fixed C API)
+ }
+ }
+ if (rtl_random_getBytes(pool, pTargetUUID, 16) != rtl_Random_E_None) {
+ abort();
+ // only possible way to signal failure here (rtl_createUuid
+ // being part of a fixed C API)
+ }
+ }
+ // See ITU-T Recommendation X.667:
+ pTargetUUID[6] &= 0x0F;
+ pTargetUUID[6] |= 0x40;
+ pTargetUUID[8] &= 0x3F;
+ pTargetUUID[8] |= 0x80;
+}
+
+
+extern "C" void SAL_CALL rtl_createNamedUuid( sal_uInt8 *pTargetUUID,
+ const sal_uInt8 *pNameSpaceUUID,
+ const rtl_String *pName )
+{
+ rtlDigest digest = rtl_digest_createMD5 ();
+
+ rtl_digest_updateMD5( digest, pNameSpaceUUID , 16 );
+ rtl_digest_updateMD5( digest, pName->buffer , pName->length );
+
+ rtl_digest_getMD5( digest, pTargetUUID , 16 );
+ rtl_digest_destroyMD5 (digest);
+
+ write_v3(pTargetUUID);
+}
+
+
+
+extern "C" sal_Int32 SAL_CALL rtl_compareUuid( const sal_uInt8 *pUUID1 , const sal_uInt8 *pUUID2 )
+{
+ int i;
+ UUID u1;
+ UUID u2;
+ memcpy( &u1 , pUUID1 , 16 );
+ memcpy( &u2 , pUUID2 , 16 );
+
+ SWAP_NETWORK_TO_INT32( u1.time_low );
+ SWAP_NETWORK_TO_INT16( u1.time_mid );
+ SWAP_NETWORK_TO_INT16( u1.time_hi_and_version );
+
+ SWAP_NETWORK_TO_INT32( u2.time_low );
+ SWAP_NETWORK_TO_INT16( u2.time_mid );
+ SWAP_NETWORK_TO_INT16( u2.time_hi_and_version );
+
+#define CHECK(f1, f2) if (f1 != f2) return f1 < f2 ? -1 : 1;
+ CHECK(u1.time_low, u2.time_low);
+ CHECK(u1.time_mid, u2.time_mid);
+ CHECK(u1.time_hi_and_version, u2.time_hi_and_version);
+ CHECK(u1.clock_seq_hi_and_reserved, u2.clock_seq_hi_and_reserved);
+ CHECK(u1.clock_seq_low, u2.clock_seq_low);
+ for (i = 0; i < 6; i++)
+ {
+ if (u1.node[i] < u2.node[i])
+ return -1;
+ if (u1.node[i] > u2.node[i])
+ return 1;
+ }
+ return 0;
+
+}
+
diff --git a/sal/systools/win32/kill/kill.cxx b/sal/systools/win32/kill/kill.cxx
new file mode 100644
index 000000000000..ec1379ccfa6b
--- /dev/null
+++ b/sal/systools/win32/kill/kill.cxx
@@ -0,0 +1,443 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <tchar.h>
+
+#ifdef _MSC_VER
+#pragma warning(push,1) // disable warnings within system headers
+#endif
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <tlhelp32.h>
+#include <psapi.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#include <signal.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifndef SIGNULL
+#define SIGNULL 0
+#endif
+
+#ifndef SIGKILL
+#define SIGKILL 9
+#endif
+
+#include <signal.h>
+
+#define MAX_MODULES 1024
+
+/////////////////////////////////////////////////////////////////////////////
+// Determines if a returned handle value is valid
+/////////////////////////////////////////////////////////////////////////////
+
+static inline bool IsValidHandle( HANDLE handle )
+{
+ return INVALID_HANDLE_VALUE != handle && NULL != handle;
+}
+
+
+#define elementsof( a ) (sizeof(a) / sizeof( (a)[0] ))
+
+/////////////////////////////////////////////////////////////////////////////
+// Retrieves function adress in another process
+/////////////////////////////////////////////////////////////////////////////
+
+#if 1
+#define GetProcAddressEx( hProcess, hModule, lpProcName ) GetProcAddress( hModule, lpProcName )
+#else
+FARPROC WINAPI GetProcAddressEx( HANDLE hProcess, HMODULE hModule, LPCSTR lpProcName )
+{
+ FARPROC lpfnProcAddress = GetProcAddress( hModule, lpProcName );
+
+ if ( lpfnProcAddress )
+ {
+ DWORD dwProcessId = GetProcessId( hProcess );
+
+ if ( GetCurrentProcessId() != dwProcessId )
+ {
+ FARPROC lpfnRemoteProcAddress = NULL;
+ TCHAR szBaseName[MAX_PATH];
+
+ if ( GetModuleBaseName( GetCurrentProcess(), hModule, szBaseName, elementsof(szBaseName) ) )
+ {
+ HMODULE ahModules[MAX_MODULES];
+ DWORD cbNeeded = 0;
+
+ if ( EnumProcessModules( hProcess, ahModules, sizeof(ahModules), &cbNeeded ) )
+ {
+ ULONG nModules = cbNeeded / sizeof(ahModules[0]);
+
+ for ( ULONG n = 0; n < nModules; n++ )
+ {
+ TCHAR szRemoteBaseName[MAX_PATH];
+
+ if ( GetModuleBaseName(
+ hProcess, ahModules[n], szRemoteBaseName, elementsof(szRemoteBaseName) ) &&
+ 0 == lstrcmpi( szRemoteBaseName, szBaseName )
+ )
+ {
+ lpfnRemoteProcAddress = lpfnProcAddress;
+
+ if ( ahModules[n] != hModule )
+ *(LPBYTE*)&lpfnRemoteProcAddress += (LPBYTE)ahModules[n] - (LPBYTE)hModule;
+ break;
+ }
+ }
+ }
+ }
+
+ lpfnProcAddress = lpfnRemoteProcAddress;
+ }
+ }
+
+ return lpfnProcAddress;
+}
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// Raises a signal in an other process
+/////////////////////////////////////////////////////////////////////////////
+
+static DWORD SignalToExceptionCode( int signal )
+{
+ switch ( signal )
+ {
+ case SIGSEGV:
+ return EXCEPTION_ACCESS_VIOLATION;
+ case SIGFPE:
+ return EXCEPTION_FLT_INVALID_OPERATION;
+ case SIGILL:
+ return EXCEPTION_ILLEGAL_INSTRUCTION;
+ case SIGINT:
+ return CONTROL_C_EXIT;
+ case SIGBREAK:
+ return CONTROL_C_EXIT;
+ default:
+ return 0;
+ }
+}
+
+static BOOL RaiseSignalEx( HANDLE hProcess, int sig )
+{
+ DWORD dwProcessId = GetProcessId( hProcess );
+
+ HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
+ HANDLE hThread = 0;
+ BOOL fSuccess = FALSE;
+
+ if ( IsValidHandle(hSnapshot) )
+ {
+ THREADENTRY32 te;
+
+ te.dwSize = sizeof(te);
+ fSuccess = Thread32First( hSnapshot, &te );
+ while ( fSuccess )
+ {
+ if ( te.th32OwnerProcessID == dwProcessId )
+ {
+ hThread = OpenThread(
+ THREAD_SUSPEND_RESUME | THREAD_QUERY_INFORMATION |
+ THREAD_GET_CONTEXT | THREAD_SET_CONTEXT,
+ FALSE, te.th32ThreadID );
+ if ( IsValidHandle(hThread) )
+ break;
+ }
+
+ fSuccess = Thread32Next( hSnapshot, &te );
+ }
+
+ CloseHandle( hSnapshot );
+ }
+
+ if ( fSuccess )
+ {
+ CONTEXT aContext;
+
+ if ( SuspendThread( hThread ) != (DWORD)-1 )
+ {
+ ZeroMemory( &aContext, sizeof(aContext) );
+ aContext.ContextFlags = CONTEXT_FULL;
+
+ fSuccess = GetThreadContext( hThread, &aContext );
+
+ if ( fSuccess )
+ {
+ if ( sig )
+ {
+ DWORD dwStackBuffer[] =
+ {
+ aContext.Eip,
+ SignalToExceptionCode( sig ),
+ EXCEPTION_NONCONTINUABLE,
+ 0,
+ 0
+ };
+
+ aContext.Esp -= sizeof(dwStackBuffer);
+ WriteProcessMemory( hProcess, (LPVOID)aContext.Esp, dwStackBuffer, sizeof(dwStackBuffer), NULL );
+ aContext.Eip = (DWORD)GetProcAddressEx( hProcess, GetModuleHandleA("KERNEL32"), "RaiseException" );
+ }
+ else
+ {
+ aContext.Ecx = aContext.Eax = aContext.Ebx = aContext.Edx = aContext.Esi = aContext.Edi = 0;
+ }
+
+ fSuccess = SetThreadContext( hThread, &aContext );
+ }
+
+ fSuccess = ResumeThread( hThread ) && fSuccess;
+
+ DWORD dwLastError = GetLastError();
+ CloseHandle( hThread );
+ SetLastError( dwLastError );
+
+ return fSuccess;
+ }
+ }
+
+ return FALSE;
+}
+/////////////////////////////////////////////////////////////////////////////
+// Command line parameter parsing
+/////////////////////////////////////////////////////////////////////////////
+
+static void ParseCommandArgs( LPDWORD lpProcesses, LPDWORD lpdwNumProcesses, int *pSig )
+{
+ typedef struct _SignalEntry
+ {
+ LPCTSTR lpSignalName;
+ int iSignalValue;
+ } SignalEntry;
+
+ #define SIG_ENTRY( signal ) { TEXT(#signal), SIG##signal }
+
+ static SignalEntry SupportedSignals[] =
+ {
+ SIG_ENTRY( NULL ),
+ SIG_ENTRY( SEGV ),
+ SIG_ENTRY( ILL ),
+ SIG_ENTRY( FPE ),
+ SIG_ENTRY( INT ),
+ SIG_ENTRY( BREAK ),
+ SIG_ENTRY( TERM ),
+ SIG_ENTRY( ABRT ),
+ SIG_ENTRY( KILL )
+ };
+
+ const int NumSupportedSignals = elementsof(SupportedSignals);
+
+ DWORD dwMaxProcesses = *lpdwNumProcesses;
+ int argc = __argc;
+ TCHAR **argv = __targv;
+
+ *lpdwNumProcesses = 0;
+
+ for ( int argn = 1; argn < argc; argn++ )
+ {
+ if ( 0 == lstrcmpi( argv[argn], TEXT("-l") ) ||
+ 0 == lstrcmpi( argv[argn], TEXT("/l") ) )
+
+ {
+ for ( int n = 0; n < NumSupportedSignals; n++ )
+ {
+ _tprintf( _T("%s "), SupportedSignals[n].lpSignalName );
+ }
+ _tprintf( _T("\n") );
+ ExitProcess( 0 );
+ }
+ else if ( 0 == lstrcmpi( argv[argn], TEXT("-?") ) ||
+ 0 == lstrcmpi( argv[argn], TEXT("/?") ) ||
+ 0 == lstrcmpi( argv[argn], TEXT("-h") ) ||
+ 0 == lstrcmpi( argv[argn], TEXT("/h") ) ||
+ 0 == lstrcmpi( argv[argn], TEXT("--help") ) )
+ {
+ _tprintf(
+ _T("Terminates a process by sending a signal.\n\n")
+ _T("Usage: kill [ -l ] [ -signal ] pid ...\n\n")
+ _T("-l Lists supported signals\n")
+ _T("-signal Sends the specified signal to the given processes.\n")
+ _T(" signal can be a numeric value specifying the signal number\n")
+ _T(" or a string listed by the -l parameter. If no signal is\n")
+ _T(" given SIGTERM (-TERM) is used.\n")
+ _T("pid Process id(s) or executables names(s) of processes to \n")
+ _T(" signal or terminate.\n\n")
+ );
+ ExitProcess( 0 );
+ }
+ else if ( argv[argn] && ( *argv[argn] == '-' || *argv[argn] == '/' ) )
+ {
+ LPCTSTR argsig = CharNext( argv[argn] );
+
+ int n;
+ for ( n = 0; n < NumSupportedSignals; n++ )
+ {
+ _TCHAR *endptr = NULL;
+
+ if ( 0 == lstrcmpi( SupportedSignals[n].lpSignalName, argsig ) ||
+ _tcstoul( argsig, &endptr, 0 ) == static_cast< unsigned >(SupportedSignals[n].iSignalValue) && (!endptr || !*endptr) )
+ {
+ *pSig = SupportedSignals[n].iSignalValue;
+ break;
+ }
+ }
+
+ if ( n >= NumSupportedSignals )
+ {
+ _ftprintf( stderr,
+ _T("kill: Illegal argument %s\n")
+ _T("Type 'kill --help' to show allowed syntax.\n")
+ _T("Type 'kill -l' to show supported signals.\n"),
+ argv[argn] );
+ ExitProcess( 0 );
+ }
+ }
+ else
+ {
+ unsigned long value = 0;
+ _TCHAR *endptr = NULL;
+
+ value = _tcstoul( argv[argn], &endptr, 0 );
+
+ if ( !endptr || !*endptr )
+ {
+ if ( *lpdwNumProcesses < dwMaxProcesses )
+ {
+ *(lpProcesses++) = value;
+ (*lpdwNumProcesses)++;
+ }
+ }
+ else
+ {
+ HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
+
+ if ( IsValidHandle( hSnapshot ) )
+ {
+ PROCESSENTRY32 pe;
+
+ pe.dwSize = sizeof(pe);
+ BOOL fSuccess = Process32First( hSnapshot, &pe );
+
+ while ( fSuccess )
+ {
+ if ( 0 == lstrcmpi( argv[argn], pe.szExeFile ) )
+ {
+ if ( *lpdwNumProcesses < dwMaxProcesses )
+ {
+ *(lpProcesses++) = pe.th32ProcessID;
+ (*lpdwNumProcesses)++;
+ }
+ }
+ fSuccess = Process32Next( hSnapshot, &pe );
+ }
+
+ CloseHandle( hSnapshot );
+ }
+ }
+ }
+ }
+
+ if ( !*lpdwNumProcesses )
+ {
+ _ftprintf( stderr,
+ _T("kill: No process specified.\n")
+ _T("Use kill --help to show allowed syntax.\n")
+ );
+ ExitProcess( 0 );
+ }
+
+}
+
+void OutputSystemMessage( DWORD dwErrorCode )
+{
+ LPVOID lpMsgBuf;
+ FormatMessageA(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ dwErrorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPSTR)&lpMsgBuf,
+ 0,
+ NULL
+ );
+
+ printf( (LPSTR)lpMsgBuf );
+ LocalFree( lpMsgBuf );
+}
+
+int _tmain()
+{
+ DWORD dwProcessIds[1024];
+ DWORD nProcesses = elementsof(dwProcessIds);
+ int sig = SIGTERM;
+
+
+ ParseCommandArgs( dwProcessIds, &nProcesses, &sig );
+
+ for ( ULONG n = 0; n < nProcesses; n++ )
+ {
+ HANDLE hProcess;
+
+ _tprintf( _T("Sending signal to process id %d..."), dwProcessIds[n] );
+ hProcess = OpenProcess( PROCESS_TERMINATE | PROCESS_CREATE_THREAD | SYNCHRONIZE |
+ PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,
+ FALSE, dwProcessIds[n] );
+
+ if ( IsValidHandle( hProcess ) )
+ {
+ if ( SIGKILL == sig )
+ TerminateProcess( hProcess, 255 );
+ else
+ {
+ if ( RaiseSignalEx( hProcess, sig ) )
+ _tprintf( _T("OK\n") );
+ else
+ {
+ OutputSystemMessage( GetLastError() );
+ }
+ }
+
+ CloseHandle( hProcess );
+ }
+ else
+ {
+ OutputSystemMessage( GetLastError() );
+ }
+ }
+
+ return 0;
+}
+
diff --git a/sal/systools/win32/kill/makefile.mk b/sal/systools/win32/kill/makefile.mk
new file mode 100644
index 000000000000..3bb961bd1123
--- /dev/null
+++ b/sal/systools/win32/kill/makefile.mk
@@ -0,0 +1,64 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=kill
+LIBTARGET=NO
+DYNAMIC_CRT=
+ENABLE_EXCEPTIONS=TRUE
+TARGETTYPE=CUI
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+.IF "$(COM)"=="GCC"
+CDEFS=-D_WIN32_WINNT=0x0501
+.ENDIF
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+UWINAPILIB=
+
+OBJFILES=\
+ $(OBJ)$/kill.obj
+
+APP1NOSAL=TRUE
+APP1OBJS=$(OBJFILES)
+APP1TARGET=$(TARGET)
+
+STDLIB1=
+
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/sal/systools/win32/onlineupdate/makefile.mk b/sal/systools/win32/onlineupdate/makefile.mk
new file mode 100644
index 000000000000..f09b01bb3145
--- /dev/null
+++ b/sal/systools/win32/onlineupdate/makefile.mk
@@ -0,0 +1,82 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+PRJNAME=sal
+TARGET=onlinecheck
+
+USE_DEFFILE=TRUE
+LIBTARGET=NO
+
+# --- Settings ----------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Targets ----------------------------------
+
+.IF "$(GUI)"=="WNT"
+
+.IF "$(COMEX)"=="9"
+.IF "$(PSDK_HOME)"!=""
+# Since the 02/2003 PSDK the "new" linker is needed here.
+LINK=$(WRAPCMD) "$(PSDK_HOME)$/Bin$/Win64$/LINK.EXE"
+.ENDIF
+.ENDIF
+
+SLOFILES=\
+ $(SLO)$/onlinecheck.obj
+
+
+SHL1TARGET=$(TARGET)
+SHL1IMPLIB=$(SHL1TARGET)
+SHL1DEF=$(MISC)/$(SHL1TARGET).def
+DEF1NAME=$(SHL1TARGET)
+DEF1EXPORTFILE=$(SHL1TARGET).dxp
+
+DEF1DEPN=\
+ $(DEF1EXPORTFILE)\
+ makefile.mk
+
+SHL1OBJS=$(SLOFILES)
+
+#No default libraries
+#STDSHL=
+
+SHL1STDLIBS=\
+ $(UNICOWSLIB)\
+ $(KERNEL32LIB)\
+ $(LIBCMT)\
+ $(WININETLIB)
+
+
+.ENDIF
+
+.INCLUDE : target.mk
+
diff --git a/sal/systools/win32/onlineupdate/onlinecheck.cxx b/sal/systools/win32/onlineupdate/onlinecheck.cxx
new file mode 100644
index 000000000000..f0d85d915b6c
--- /dev/null
+++ b/sal/systools/win32/onlineupdate/onlinecheck.cxx
@@ -0,0 +1,82 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#ifdef _MSC_VER
+#pragma warning( disable: 4668 )
+#endif
+
+#include <sal/types.h>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <wininet.h>
+
+#ifdef UNICODE
+#define _UNICODE
+#endif
+#include <tchar.h>
+#ifdef __MINGW32__
+#include <excpt.h>
+#endif
+
+#define elementsof(a) (sizeof(a)/sizeof((a)[0]))
+
+// #i71984
+extern "C" sal_Bool SAL_CALL hasInternetConnection()
+{
+ DWORD dwFlags;
+ TCHAR szConnectionName[1024];
+
+#ifdef __MINGW32__
+ jmp_buf jmpbuf;
+ __SEHandler han;
+ if (__builtin_setjmp(jmpbuf) == 0)
+ {
+ han.Set(jmpbuf, NULL, (__SEHandler::PF)EXCEPTION_EXECUTE_HANDLER);
+#else
+ __try {
+#endif
+ BOOL fIsConnected = InternetGetConnectedStateEx(
+ &dwFlags,
+ szConnectionName,
+ elementsof(szConnectionName),
+ 0 );
+
+ return fIsConnected ? sal_True : sal_False;
+
+#ifdef __MINGW32__
+ }
+ else return sal_False;
+ han.Reset();
+#else
+ } __except( EXCEPTION_EXECUTE_HANDLER ) {
+ return sal_False;
+ }
+#endif
+}
diff --git a/sal/systools/win32/onlineupdate/onlinecheck.dxp b/sal/systools/win32/onlineupdate/onlinecheck.dxp
new file mode 100644
index 000000000000..7d3a3cac01fd
--- /dev/null
+++ b/sal/systools/win32/onlineupdate/onlinecheck.dxp
@@ -0,0 +1,28 @@
+;*************************************************************************
+;
+; DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+;
+; Copyright 2000, 2010 Oracle and/or its affiliates.
+;
+; OpenOffice.org - a multi-platform office productivity suite
+;
+; This file is part of OpenOffice.org.
+;
+; OpenOffice.org is free software: you can redistribute it and/or modify
+; it under the terms of the GNU Lesser General Public License version 3
+; only, as published by the Free Software Foundation.
+;
+; OpenOffice.org is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU Lesser General Public License version 3 for more details
+; (a copy is included in the LICENSE file that accompanied this code).
+;
+; You should have received a copy of the GNU Lesser General Public License
+; version 3 along with OpenOffice.org. If not, see
+; <http://www.openoffice.org/license.html>
+; for a copy of the LGPLv3 License.
+;
+;*************************************************************************
+
+hasInternetConnection
diff --git a/sal/systools/win32/uwinapi/CheckTokenMembership.cpp b/sal/systools/win32/uwinapi/CheckTokenMembership.cpp
new file mode 100644
index 000000000000..b3a30c4b3f31
--- /dev/null
+++ b/sal/systools/win32/uwinapi/CheckTokenMembership.cpp
@@ -0,0 +1,34 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#if defined(_MSC_VER) && (_MSC_VER>=1400)
+#pragma warning(disable : 4273)
+#endif
+#include "macros.h"
+
+
+DEFINE_DEFAULT_THUNK( advapi32, TRYLOAD, BOOL, WINAPI, CheckTokenMembership, (HANDLE TokenHandle, PSID SidToCheck, PBOOL IsMember) )
diff --git a/sal/systools/win32/uwinapi/CommandLineToArgvW.cpp b/sal/systools/win32/uwinapi/CommandLineToArgvW.cpp
new file mode 100644
index 000000000000..282e1aa6b283
--- /dev/null
+++ b/sal/systools/win32/uwinapi/CommandLineToArgvW.cpp
@@ -0,0 +1,172 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4740)
+#endif
+
+#include "macros.h"
+
+#ifdef __cplusplus
+#define local inline
+#else
+#define local static
+#endif
+
+local LPCWSTR SkipBlanks( LPCWSTR lpScan )
+{
+ while ( ' ' == *lpScan || '\t' == *lpScan )
+ lpScan++;
+
+ return lpScan;
+}
+
+
+local LPCWSTR SkipArgument( LPCWSTR lpScan )
+{
+ BOOL fQuoted = FALSE;
+ LPCWSTR lpArgEnd = NULL;
+
+ do
+ {
+ switch ( *lpScan )
+ {
+ case ' ':
+ case '\t':
+ if ( fQuoted )
+ lpScan++;
+ else
+ lpArgEnd = lpScan;
+ break;
+ case '\"':
+ lpScan++;
+ fQuoted = !fQuoted;
+ break;
+ case '\0':
+ lpArgEnd = lpScan;
+ break;
+ default:
+ lpScan++;
+ break;
+ }
+ } while( *lpScan && !lpArgEnd );
+
+ return lpScan;
+}
+
+
+IMPLEMENT_THUNK( shell32, WINDOWS, LPWSTR *, WINAPI, CommandLineToArgvW, ( LPCWSTR lpCmdLineW, int *pNumArgs ) )
+{
+ LPWSTR *lpArgvW = NULL;
+
+ if ( !lpCmdLineW || !*lpCmdLineW )
+ {
+ CHAR szFileName[MAX_PATH];
+
+ DWORD dwResult = GetModuleFileNameA( NULL, szFileName, MAX_PATH );
+
+ if ( dwResult && dwResult < MAX_PATH )
+ {
+ int cchNeeded = MultiByteToWideChar( CP_ACP, 0, szFileName, -1, NULL, 0 );
+
+ lpArgvW = (LPWSTR *)GlobalAlloc( 0, cchNeeded * sizeof(WCHAR) + sizeof(LPWSTR) );
+
+ if ( lpArgvW )
+ {
+ lpArgvW[0] = (LPWSTR)(lpArgvW + 1);
+
+ MultiByteToWideChar( CP_ACP, 0, szFileName, -1, lpArgvW[0], cchNeeded );
+ *pNumArgs = 1;
+ }
+ else
+ SetLastError( ERROR_OUTOFMEMORY );
+ }
+ }
+ else
+ {
+ LPCWSTR lpScan = lpCmdLineW;
+ int nTokens = 0;
+ int cchNeeded = 0;
+
+ // Count arguments and required size
+
+ while ( *lpScan )
+ {
+ lpScan = SkipBlanks( lpScan );
+ if ( *lpScan )
+ {
+ LPCWSTR lpArgEnd = SkipArgument( lpScan );
+
+ nTokens++;
+ cchNeeded += lpArgEnd - lpScan + 1;
+ lpScan = lpArgEnd;
+ }
+ }
+
+ // Allocate space for one additional NULL pointer to terminate list
+
+ lpArgvW = (LPWSTR *)GlobalAlloc( 0, sizeof(LPWSTR) * (nTokens + 1) + sizeof(WCHAR) * cchNeeded );
+
+ if ( lpArgvW )
+ {
+ // Collect arguments
+
+ LPWSTR lpDestination = (LPWSTR)&lpArgvW[nTokens + 1];
+
+ lpScan = lpCmdLineW;
+ nTokens = 0;
+
+ while ( *lpScan )
+ {
+ lpScan = SkipBlanks( lpScan );
+ if ( *lpScan )
+ {
+ LPCWSTR lpArgEnd = SkipArgument( lpScan );
+
+ lpArgvW[nTokens++] = lpDestination;
+
+ while ( lpScan < lpArgEnd )
+ {
+ if ( '\"' != *lpScan )
+ *lpDestination++ = *lpScan;
+
+ lpScan++;
+ }
+ *lpDestination++ = 0;
+ }
+ }
+
+ lpArgvW[nTokens] = NULL;
+
+ *pNumArgs = nTokens;
+ }
+ else
+ SetLastError( ERROR_OUTOFMEMORY );
+
+ }
+
+ return lpArgvW;
+} \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/CopyFileExA.cpp b/sal/systools/win32/uwinapi/CopyFileExA.cpp
new file mode 100644
index 000000000000..9369a6deee60
--- /dev/null
+++ b/sal/systools/win32/uwinapi/CopyFileExA.cpp
@@ -0,0 +1,167 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4740)
+#endif
+
+#define _WIN32_WINNT 0x0400
+#include "macros.h"
+
+#define BUFSIZE 16384
+
+static DWORD CALLBACK DefCopyProgressRoutine(
+ LARGE_INTEGER TotalFileSize, // total file size, in bytes
+ LARGE_INTEGER TotalBytesTransferred,
+ // total number of bytes transferred
+ LARGE_INTEGER StreamSize, // total number of bytes for this stream
+ LARGE_INTEGER StreamBytesTransferred,
+ // total number of bytes transferred for
+ // this stream
+ DWORD dwStreamNumber, // the current stream
+ DWORD dwCallbackReason, // reason for callback
+ HANDLE hSourceFile, // handle to the source file
+ HANDLE hDestinationFile, // handle to the destination file
+ LPVOID lpData // passed by CopyFileEx
+)
+{
+ return PROGRESS_CONTINUE;
+}
+
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, BOOL, WINAPI, CopyFileExA, ( LPCSTR lpExistingFileNameA, LPCSTR lpNewFileNameA, LPPROGRESS_ROUTINE lpProgressRoutine, LPVOID lpData, LPBOOL pbCancel, DWORD dwCopyFlags ) )
+{
+ BOOL fSuccess = FALSE; // Assume failure
+
+ HANDLE hSourceFile = CreateFileA(
+ lpExistingFileNameA,
+ GENERIC_READ,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL,
+ OPEN_EXISTING,
+ 0,
+ NULL
+ );
+
+ if ( IsValidHandle(hSourceFile) )
+ {
+ LARGE_INTEGER FileSize, BytesTransferred;
+ HANDLE hTargetFile = NULL;
+
+ SetLastError( ERROR_SUCCESS );
+ FileSize.LowPart = GetFileSize( hSourceFile, (LPDWORD)&FileSize.HighPart );
+ BytesTransferred.QuadPart = 0;
+
+ if ( (DWORD)-1 != FileSize.LowPart || ERROR_SUCCESS == GetLastError() )
+ hTargetFile = CreateFileA(
+ lpNewFileNameA,
+ GENERIC_WRITE,
+ 0,
+ NULL,
+ (DWORD) ((dwCopyFlags & COPY_FILE_FAIL_IF_EXISTS) ? CREATE_NEW : CREATE_ALWAYS),
+ 0,
+ NULL
+ );
+
+ if ( IsValidHandle(hTargetFile) )
+ {
+ DWORD dwProgressResult = PROGRESS_CONTINUE;
+
+ fSuccess = SetEndOfFile( hTargetFile );
+
+ if ( fSuccess )
+ {
+ if ( !lpProgressRoutine )
+ lpProgressRoutine = DefCopyProgressRoutine;
+
+ dwProgressResult = lpProgressRoutine(
+ FileSize,
+ BytesTransferred,
+ FileSize,
+ BytesTransferred,
+ 1,
+ CALLBACK_STREAM_SWITCH,
+ hSourceFile,
+ hTargetFile,
+ lpData
+ );
+
+ // Suppress further notifications
+
+ if ( PROGRESS_QUIET == dwProgressResult )
+ {
+ lpProgressRoutine = DefCopyProgressRoutine;
+ dwProgressResult = PROGRESS_CONTINUE;
+ }
+ }
+
+ while ( fSuccess && PROGRESS_CONTINUE == dwProgressResult )
+ {
+ BYTE buffer[BUFSIZE];
+ DWORD dwBytesRead, dwBytesWritten = 0;
+
+ fSuccess = ReadFile( hSourceFile, buffer, BUFSIZE, &dwBytesRead, NULL );
+
+ if ( !dwBytesRead ) break;
+
+ if ( fSuccess )
+ fSuccess = WriteFile( hTargetFile, buffer, dwBytesRead, &dwBytesWritten, NULL );
+
+ if ( fSuccess )
+ {
+ BytesTransferred.QuadPart += (LONGLONG)dwBytesWritten;
+
+ if ( pbCancel && *pbCancel )
+ dwProgressResult = PROGRESS_CANCEL;
+ else
+ dwProgressResult = lpProgressRoutine(
+ FileSize,
+ BytesTransferred,
+ FileSize,
+ BytesTransferred,
+ 1,
+ CALLBACK_CHUNK_FINISHED,
+ hSourceFile,
+ hTargetFile,
+ lpData
+ );
+
+ }
+
+ }
+
+ CloseHandle( hTargetFile );
+
+ if ( PROGRESS_CANCEL == dwProgressResult )
+ DeleteFileA( lpNewFileNameA );
+ }
+
+
+ CloseHandle( hSourceFile );
+ }
+
+ return fSuccess;
+} \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/CopyFileExW.cpp b/sal/systools/win32/uwinapi/CopyFileExW.cpp
new file mode 100644
index 000000000000..73870beb1754
--- /dev/null
+++ b/sal/systools/win32/uwinapi/CopyFileExW.cpp
@@ -0,0 +1,40 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4740)
+#endif
+
+#define _WIN32_WINNT 0x0400
+#include "macros.h"
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, BOOL, WINAPI, CopyFileExW, ( LPCWSTR lpExistingFileNameW, LPCWSTR lpNewFileNameW, LPPROGRESS_ROUTINE lpProgressRoutine, LPVOID lpData, LPBOOL pbCancel, DWORD dwCopyFlags ) )
+{
+ AUTO_WSTR2STR( lpExistingFileName );
+ AUTO_WSTR2STR( lpNewFileName );
+
+ return CopyFileExA( lpExistingFileNameA, lpNewFileNameA, lpProgressRoutine, lpData, pbCancel, dwCopyFlags );
+} \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/DeleteVolumeMountPointA.cpp b/sal/systools/win32/uwinapi/DeleteVolumeMountPointA.cpp
new file mode 100644
index 000000000000..c2d23c3d0064
--- /dev/null
+++ b/sal/systools/win32/uwinapi/DeleteVolumeMountPointA.cpp
@@ -0,0 +1,33 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4740)
+#endif
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, DeleteVolumeMountPointA, (LPCSTR lpszVolumeMountPoint) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/DeleteVolumeMountPointW.cpp b/sal/systools/win32/uwinapi/DeleteVolumeMountPointW.cpp
new file mode 100644
index 000000000000..1b98ab0b56db
--- /dev/null
+++ b/sal/systools/win32/uwinapi/DeleteVolumeMountPointW.cpp
@@ -0,0 +1,33 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4740)
+#endif
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, DeleteVolumeMountPointW, (LPCWSTR lpszVolumeMountPoint) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/DllGetVersion.cpp b/sal/systools/win32/uwinapi/DllGetVersion.cpp
new file mode 100644
index 000000000000..cb21d82f3885
--- /dev/null
+++ b/sal/systools/win32/uwinapi/DllGetVersion.cpp
@@ -0,0 +1,73 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define WIN32_LEAN_AND_MEAN
+#ifdef _MSC_VER
+#pragma warning(push,1)
+#endif
+#include <windows.h>
+#include <shlwapi.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#include <malloc.h>
+
+extern HMODULE UWINAPI_BaseAddress;
+
+// This function should be exported by every DLL that wants to provide it's version number.
+// This code automaticly generates the information from the version resource
+
+extern "C" HRESULT CALLBACK DllGetVersion( DLLVERSIONINFO *pdvi )
+{
+ TCHAR szModulePath[MAX_PATH];
+ BOOL fSuccess = FALSE;
+
+ if ( UWINAPI_BaseAddress && GetModuleFileName( UWINAPI_BaseAddress, szModulePath, MAX_PATH ) )
+ {
+ DWORD dwHandle = 0;
+ DWORD dwSize = GetFileVersionInfoSize( szModulePath, &dwHandle );
+ LPVOID lpData = _alloca( dwSize );
+
+ if ( GetFileVersionInfo( szModulePath, dwHandle, dwSize, lpData ) )
+ {
+ VS_FIXEDFILEINFO *lpBuffer = NULL;
+ UINT uLen = 0;
+
+ if ( VerQueryValue( lpData, TEXT("\\"), (LPVOID *)&lpBuffer, &uLen ) )
+ {
+ pdvi->dwMajorVersion = HIWORD( lpBuffer->dwFileVersionMS );
+ pdvi->dwMinorVersion = LOWORD( lpBuffer->dwFileVersionMS );
+ pdvi->dwBuildNumber = HIWORD( lpBuffer->dwFileVersionLS );
+ pdvi->dwPlatformID = (DWORD) ((lpBuffer->dwFileOS & VOS_NT) ? DLLVER_PLATFORM_NT : DLLVER_PLATFORM_WINDOWS);
+
+ fSuccess = TRUE;
+ }
+ }
+ }
+
+ return fSuccess ? HRESULT_FROM_WIN32( GetLastError() ) : HRESULT_FROM_WIN32( NO_ERROR );
+}
diff --git a/sal/systools/win32/uwinapi/DllMain.cpp b/sal/systools/win32/uwinapi/DllMain.cpp
new file mode 100644
index 000000000000..94f6c34fec24
--- /dev/null
+++ b/sal/systools/win32/uwinapi/DllMain.cpp
@@ -0,0 +1,235 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define WIN32_LEAN_AND_MEAN
+#ifdef _MSC_VER
+#pragma warning(push,1) // disable warnings within system headers
+#endif
+#include <windows.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#include <malloc.h>
+#define _MBCS
+#include <tchar.h>
+
+
+HMODULE UWINAPI_BaseAddress = NULL;
+const CHAR szUnicowsModuleName[] = "UNICOWS.DLL";
+
+static HMODULE WINAPI _LoadUnicowsLibrary(VOID)
+{
+ CHAR szModulePath[MAX_PATH];
+ HMODULE hModuleUnicows = NULL;
+
+ // First search in the same directory as UWINAPI.DLL was loaded from. This is because
+ // UWINAPI.DLL not always resides in the same directory as the actual application.
+
+ if ( UWINAPI_BaseAddress && GetModuleFileNameA( UWINAPI_BaseAddress, szModulePath, MAX_PATH ) )
+ {
+ char *lpLastBkSlash = _tcsrchr( szModulePath, '\\' );
+
+ if ( lpLastBkSlash )
+ {
+ size_t nParentDirSize = (size_t) (_tcsinc( lpLastBkSlash ) - szModulePath);
+ LPSTR lpUnicowsModulePath = (LPTSTR)_alloca( nParentDirSize + sizeof(szUnicowsModuleName) );
+
+ if ( lpUnicowsModulePath )
+ {
+ _tcsncpy( lpUnicowsModulePath, szModulePath, nParentDirSize );
+ _tcscpy( lpUnicowsModulePath + nParentDirSize, szUnicowsModuleName );
+
+ hModuleUnicows = LoadLibraryA( lpUnicowsModulePath );
+ }
+ }
+ }
+
+ // Search at the common places
+
+ if ( !hModuleUnicows )
+ hModuleUnicows = LoadLibraryA(szUnicowsModuleName);
+
+ return hModuleUnicows;
+}
+
+static HMODULE WINAPI LoadUnicowsLibrary(VOID)
+{
+ HMODULE hModuleUnicows;
+ int idMsg = IDOK;
+
+ do
+ {
+ hModuleUnicows = _LoadUnicowsLibrary();
+
+ if ( !hModuleUnicows )
+ {
+ LPVOID lpMsgBuf;
+
+ FormatMessageA(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ ERROR_DLL_NOT_FOUND /* GetLastError() */,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPSTR)&lpMsgBuf,
+ 0,
+ NULL
+ );
+ // Process any inserts in lpMsgBuf.
+ CHAR szModuleFileName[MAX_PATH];
+
+ GetModuleFileNameA( NULL, szModuleFileName, sizeof(szModuleFileName) );
+ LPSTR lpMessage = (LPSTR)_alloca( strlen( (LPCSTR)lpMsgBuf ) + sizeof(szUnicowsModuleName) + 1 );
+ strcpy( lpMessage, (LPCSTR)lpMsgBuf );
+ strcat( lpMessage, "\n" );
+ strcat( lpMessage, szUnicowsModuleName );
+ // Free the buffer.
+ LocalFree( lpMsgBuf );
+ // Display the string.
+ idMsg = MessageBoxA( NULL, lpMessage,
+ szModuleFileName, MB_ABORTRETRYIGNORE | MB_ICONERROR | MB_TASKMODAL );
+
+ if ( IDABORT == idMsg )
+ TerminateProcess( GetCurrentProcess(), 255 );
+ }
+ } while ( !hModuleUnicows && IDRETRY == idMsg );
+
+ return hModuleUnicows;
+}
+
+extern "C" {
+FARPROC _PfnLoadUnicows = (FARPROC)LoadUnicowsLibrary;
+}
+
+#ifdef __MINGW32__
+
+extern "C" {
+
+typedef void (*func_ptr) (void);
+extern func_ptr __CTOR_LIST__[];
+extern func_ptr __DTOR_LIST__[];
+
+static void do_startup(void);
+static void do_cleanup(void);
+
+HMODULE hModuleUnicowsDLL;
+
+void
+__do_global_dtors (void)
+{
+ static func_ptr *p = __DTOR_LIST__ + 1;
+
+ /*
+ * Call each destructor in the destructor list until a null pointer
+ * is encountered.
+ */
+ while (*p)
+ {
+ (*(p)) ();
+ p++;
+ }
+}
+
+void
+__do_global_ctors (void)
+{
+ unsigned long nptrs = (unsigned long) __CTOR_LIST__[0];
+ unsigned i;
+
+ /*
+ * If the first entry in the constructor list is -1 then the list
+ * is terminated with a null entry. Otherwise the first entry was
+ * the number of pointers in the list.
+ */
+ if (nptrs == static_cast<unsigned long>(-1))
+ {
+ for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++)
+ ;
+ }
+
+ /*
+ * Go through the list backwards calling constructors.
+ */
+ for (i = nptrs; i >= 1; i--)
+ {
+ __CTOR_LIST__[i] ();
+ }
+
+ /*
+ * Register the destructors for processing on exit.
+ */
+ atexit (__do_global_dtors);
+}
+
+static int initialized = 0;
+
+void
+__main (void)
+{
+ if (!initialized)
+ {
+ initialized = 1;
+ do_startup();
+ __do_global_ctors ();
+ }
+}
+
+static void do_startup( void )
+{
+ if (((LONG)GetVersion()&0x800000ff) == 0x80000004)
+ {
+ hModuleUnicowsDLL = LoadUnicowsLibrary();
+ if (hModuleUnicowsDLL)
+ atexit(do_cleanup);
+ }
+}
+
+void do_cleanup( void )
+{
+ FreeLibrary(hModuleUnicowsDLL);
+}
+}
+
+#endif
+
+extern "C" BOOL WINAPI DllMain( HMODULE hModule, DWORD dwReason, LPVOID )
+{
+ switch ( dwReason )
+ {
+ case DLL_PROCESS_ATTACH:
+ UWINAPI_BaseAddress = hModule;
+#ifdef __MINGW32__
+ return TRUE;
+#else
+ return DisableThreadLibraryCalls( hModule );
+#endif
+ default:
+ return TRUE;
+ }
+
+}
diff --git a/sal/systools/win32/uwinapi/DrawStateW.cpp b/sal/systools/win32/uwinapi/DrawStateW.cpp
new file mode 100644
index 000000000000..9143131b3bab
--- /dev/null
+++ b/sal/systools/win32/uwinapi/DrawStateW.cpp
@@ -0,0 +1,74 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+IMPLEMENT_THUNK( user32, WINDOWS, BOOL, WINAPI, DrawStateW,
+(
+ HDC hdc, // handle to device context
+ HBRUSH hbr, // handle to brush
+ DRAWSTATEPROC lpOutputFunc, // pointer to callback function
+ LPARAM lData, // image information
+ WPARAM wData, // more image information
+ int x, // horizontal location of image
+ int y, // vertical location of image
+ int cx, // width of image
+ int cy, // height of image
+ UINT fuFlags // image type and state
+
+))
+{
+ switch ( fuFlags & 0x000F )
+ {
+ case DST_TEXT:
+ case DST_PREFIXTEXT:
+ {
+ LPSTR lpTextA = NULL;
+
+ if ( lData )
+ {
+ int cchWideChar = (int) (wData ? wData : -1);
+ int cchNeeded = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lData, cchWideChar, NULL, 0, NULL, NULL );
+
+ lpTextA = (LPSTR)_alloca( cchNeeded * sizeof(CHAR) );
+
+ if ( !lpTextA )
+ {
+ SetLastError( ERROR_OUTOFMEMORY );
+ return FALSE;
+ }
+
+ WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lData, cchWideChar, lpTextA, cchNeeded, NULL, NULL );
+
+ }
+
+ return DrawStateA( hdc, hbr, lpOutputFunc, (LPARAM)lpTextA, wData, x, y, cx, cy, fuFlags );
+ }
+ default:
+ return DrawStateA( hdc, hbr, lpOutputFunc, lData, wData, x, y, cx, cy, fuFlags );
+ }
+}
diff --git a/sal/systools/win32/uwinapi/EnumProcesses.cpp b/sal/systools/win32/uwinapi/EnumProcesses.cpp
new file mode 100644
index 000000000000..b98541ff1f40
--- /dev/null
+++ b/sal/systools/win32/uwinapi/EnumProcesses.cpp
@@ -0,0 +1,41 @@
+#include "macros.h"
+#include <tlhelp32.h>
+
+IMPLEMENT_THUNK( psapi, WINDOWS, BOOL, WINAPI, EnumProcesses, ( LPDWORD lpProcesses, DWORD cbSize, LPDWORD lpcbCopied ) )
+{
+ BOOL fSuccess = FALSE;
+ HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
+
+ if ( IsValidHandle( hSnapshot ) )
+ {
+ PROCESSENTRY32 pe;
+
+ if ( lpcbCopied )
+ *lpcbCopied = 0;
+
+ pe.dwSize = sizeof(pe);
+ if ( Process32First( hSnapshot, &pe ) )
+ {
+ fSuccess = TRUE;
+
+ while ( cbSize >= sizeof(*lpProcesses) )
+ {
+ *(lpProcesses++) = pe.th32ProcessID;
+ if ( lpcbCopied )
+ *lpcbCopied += sizeof(*lpProcesses);
+ cbSize -= sizeof(*lpProcesses);
+
+ if ( !Process32Next( hSnapshot, &pe ) )
+ break;
+ }
+ }
+
+ CloseHandle( hSnapshot );
+ }
+ else
+ SetLastError( ERROR_INVALID_HANDLE );
+
+ return fSuccess;
+}
+
+
diff --git a/sal/systools/win32/uwinapi/FindFirstVolumeA.cpp b/sal/systools/win32/uwinapi/FindFirstVolumeA.cpp
new file mode 100644
index 000000000000..b174623b3d4f
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindFirstVolumeA.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, HANDLE, WINAPI, FindFirstVolumeA, (LPSTR lpszVolumeName, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/FindFirstVolumeMountPointA.cpp b/sal/systools/win32/uwinapi/FindFirstVolumeMountPointA.cpp
new file mode 100644
index 000000000000..436eb9c84428
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindFirstVolumeMountPointA.cpp
@@ -0,0 +1,51 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include "macros.h"
+#ifdef __MINGW32__
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, HANDLE, WINAPI, FindFirstVolumeMountPointA, (LPSTR lpszRootPathName, LPSTR lpszVolumeMountPoint, DWORD cchBufferLength) )
+#else
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, HANDLE, WINAPI, FindFirstVolumeMountPointA, (LPCSTR lpszRootPathName, LPSTR lpszVolumeMountPoint, DWORD cchBufferLength) )
+#endif
+/*
+extern "C" _declspec( dllexport ) FARPROC kernel32_FindFirstVolumeMountPointA_Ptr;
+static HANDLE __stdcall FindFirstVolumeMountPointA_Failure (LPSTR lpszRootPathName, LPSTR lpszVolumeMountPoint, DWORD cchBufferLength);
+static _declspec ( naked ) void FindFirstVolumeMountPointA_Thunk()
+{
+ ResolveThunk_TRYLOAD( &kernel32_FindFirstVolumeMountPointA_Ptr, "kernel32" ".dll", "FindFirstVolumeMountPointA", 0, (FARPROC)FindFirstVolumeMountPointA_Failure );
+ _asm jmp [kernel32_FindFirstVolumeMountPointA_Ptr] }
+
+//extern "C" _declspec( naked ) HANDLE __stdcall
+//extern "C" HANDLE WINAPI
+extern "C" _declspec( naked ) HANDLE __stdcall FindFirstVolumeMountPointA (LPCSTR lpszRootPathName, LPSTR lpszVolumeMountPoint, DWORD cchBufferLength)
+{
+ _asm jmp [kernel32_FindFirstVolumeMountPointA_Ptr]
+}
+
+extern "C" _declspec( dllexport ) FARPROC kernel32_FindFirstVolumeMountPointA_Ptr = (FARPROC)FindFirstVolumeMountPointA_Thunk;
+static HANDLE __stdcall FindFirstVolumeMountPointA_Failure (LPSTR lpszRootPathName, LPSTR lpszVolumeMountPoint, DWORD cchBufferLength)
+{ SetLastError( 120L ); return (HANDLE)0; }
+*/
diff --git a/sal/systools/win32/uwinapi/FindFirstVolumeMountPointW.cpp b/sal/systools/win32/uwinapi/FindFirstVolumeMountPointW.cpp
new file mode 100644
index 000000000000..54f4d7307970
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindFirstVolumeMountPointW.cpp
@@ -0,0 +1,32 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include "macros.h"
+#ifdef __MINGW32__
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, HANDLE, WINAPI, FindFirstVolumeMountPointW, (LPWSTR lpszRootPathName, LPWSTR lpszVolumeMountPoint, DWORD cchBufferLength) )
+#else
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, HANDLE, WINAPI, FindFirstVolumeMountPointW, (LPCWSTR lpszRootPathName, LPWSTR lpszVolumeMountPoint, DWORD cchBufferLength) )
+#endif
diff --git a/sal/systools/win32/uwinapi/FindFirstVolumeW.cpp b/sal/systools/win32/uwinapi/FindFirstVolumeW.cpp
new file mode 100644
index 000000000000..f6444c8e97df
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindFirstVolumeW.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, HANDLE, WINAPI, FindFirstVolumeW, (LPWSTR lpszVolumeName, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/FindNextVolumeA.cpp b/sal/systools/win32/uwinapi/FindNextVolumeA.cpp
new file mode 100644
index 000000000000..6ec46a67e28a
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindNextVolumeA.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, FindNextVolumeA, (HANDLE hFindVolume, LPSTR lpszVolumeName, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/FindNextVolumeMountPointA.cpp b/sal/systools/win32/uwinapi/FindNextVolumeMountPointA.cpp
new file mode 100644
index 000000000000..b2ad8810b1d9
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindNextVolumeMountPointA.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, FindNextVolumeMountPointA, (HANDLE hFindVolumeMountPoint, LPSTR lpszVolumeMountPoint, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/FindNextVolumeMountPointW.cpp b/sal/systools/win32/uwinapi/FindNextVolumeMountPointW.cpp
new file mode 100644
index 000000000000..2ff5017c2abe
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindNextVolumeMountPointW.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, FindNextVolumeMountPointW, (HANDLE hFindVolumeMountPoint, LPWSTR lpszVolumeMountPoint, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/FindNextVolumeW.cpp b/sal/systools/win32/uwinapi/FindNextVolumeW.cpp
new file mode 100644
index 000000000000..eb06a2755c18
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindNextVolumeW.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, FindNextVolumeW, (HANDLE hFindVolume, LPWSTR lpszVolumeName, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/FindVolumeClose.cpp b/sal/systools/win32/uwinapi/FindVolumeClose.cpp
new file mode 100644
index 000000000000..fdee78575095
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindVolumeClose.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, FindVolumeClose, (HANDLE hFindVolume) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/FindVolumeMountPointClose.cpp b/sal/systools/win32/uwinapi/FindVolumeMountPointClose.cpp
new file mode 100644
index 000000000000..f821e9c018ab
--- /dev/null
+++ b/sal/systools/win32/uwinapi/FindVolumeMountPointClose.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, FindVolumeMountPointClose, (HANDLE hFindVolumeMountPoint ) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/GetDiskFreeSpaceExA.cpp b/sal/systools/win32/uwinapi/GetDiskFreeSpaceExA.cpp
new file mode 100644
index 000000000000..a217b961de03
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetDiskFreeSpaceExA.cpp
@@ -0,0 +1,59 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+// GetDiskSpaceExA wrapper for Win 95A
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, GetDiskFreeSpaceExA,(
+ LPCSTR lpRootPathName, // directory name
+ PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller
+ PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk
+ PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
+))
+{
+ DWORD dwSectorsPerCluster, dwBytesPerSector, dwNumberOfFreeClusters, dwTotalNumberOfClusters;
+
+ BOOL fSuccess = GetDiskFreeSpaceA( lpRootPathName, &dwSectorsPerCluster, &dwBytesPerSector, &dwNumberOfFreeClusters, &dwTotalNumberOfClusters );
+
+ if ( fSuccess )
+ {
+ ULONGLONG ulBytesPerCluster = (ULONGLONG)dwSectorsPerCluster * (ULONGLONG)dwBytesPerSector;
+
+ if ( lpFreeBytesAvailable )
+ lpFreeBytesAvailable->QuadPart = ulBytesPerCluster * (ULONGLONG)dwNumberOfFreeClusters;
+
+ if ( lpTotalNumberOfBytes )
+ lpTotalNumberOfBytes->QuadPart = ulBytesPerCluster * (ULONGLONG)dwTotalNumberOfClusters;
+
+ if ( lpTotalNumberOfFreeBytes )
+ lpTotalNumberOfFreeBytes->QuadPart = ulBytesPerCluster * (ULONGLONG)dwNumberOfFreeClusters;
+ }
+
+ return fSuccess;
+}
+
diff --git a/sal/systools/win32/uwinapi/GetDiskFreeSpaceExW.cpp b/sal/systools/win32/uwinapi/GetDiskFreeSpaceExW.cpp
new file mode 100644
index 000000000000..6e6f4cbe32c5
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetDiskFreeSpaceExW.cpp
@@ -0,0 +1,41 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, BOOL, WINAPI, GetDiskFreeSpaceExW,(
+ LPCWSTR lpRootPathNameW, // directory name
+ PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller
+ PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk
+ PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
+))
+{
+ AUTO_WSTR2STR( lpRootPathName );
+
+ return GetDiskFreeSpaceExA( lpRootPathNameA, lpFreeBytesAvailable, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes );
+}
+
diff --git a/sal/systools/win32/uwinapi/GetLogicalDriveStringsW.cpp b/sal/systools/win32/uwinapi/GetLogicalDriveStringsW.cpp
new file mode 100644
index 000000000000..9f49c72d3431
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetLogicalDriveStringsW.cpp
@@ -0,0 +1,41 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, DWORD, WINAPI, GetLogicalDriveStringsW, ( DWORD cchBuffer, LPWSTR lpBufferW ) )
+{
+ AUTO_STR( lpBuffer, cchBuffer );
+
+ DWORD dwResult = GetLogicalDriveStringsA( cchBuffer, lpBufferA );
+
+
+ if ( dwResult && dwResult < cchBuffer )
+ STRBUF2WSTR( lpBuffer, (int) (dwResult + 1), (int) cchBuffer );
+
+ return dwResult;
+} \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/GetLongPathName.cpp b/sal/systools/win32/uwinapi/GetLongPathName.cpp
new file mode 100644
index 000000000000..fc10d64ee5b0
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetLongPathName.cpp
@@ -0,0 +1,113 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+{
+ DWORD dwResult = 0; // Assume failure
+
+ if ( IsBadStringPtr( lpShortPath, MAX_PATH ) )
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return dwResult;
+ }
+
+ // Assume a not existing buffer means a bufsize of zero
+ if ( !lpLongPath )
+ cchBuffer = 0;
+
+ if ( _tcslen( lpShortPath ) == 2 && lpShortPath[1] == ':' )
+ {
+ _tcscpy( lpLongPath, lpShortPath );
+ dwResult = _tcslen( lpLongPath );
+ }
+ else
+ {
+ HANDLE hFind;
+ WIN32_FIND_DATA aFindFileData;
+
+ if ( lpShortPath[_tcslen(lpShortPath)-1] == '\\' )
+ {
+ TCHAR szFilePath[MAX_PATH];
+
+ _tcscpy( szFilePath, lpShortPath );
+ _tcscat( szFilePath, TEXT("*.*") );
+ hFind = FindFirstFile( szFilePath, &aFindFileData );;
+ aFindFileData.cFileName[0] = 0;
+ }
+ else
+ {
+ hFind = FindFirstFile( lpShortPath, &aFindFileData );
+ if ( !IsValidHandle( hFind ) )
+ {
+ TCHAR szFilePath[MAX_PATH];
+
+ _tcscpy( szFilePath, lpShortPath );
+ _tcscat( szFilePath, TEXT("\\*.*") );
+ hFind = FindFirstFile( szFilePath, &aFindFileData );;
+ aFindFileData.cFileName[0] = 0;
+ }
+ }
+
+ if ( IsValidHandle( hFind ) )
+ {
+ FindClose( hFind );
+
+ LPCTSTR lpLastSlash = _tcsrchr( lpShortPath, '\\' );
+
+ if ( lpLastSlash )
+ {
+ int nParentLen = lpLastSlash - lpShortPath;
+ LPTSTR lpParentPath = (LPTSTR)_alloca( (nParentLen + 1) * sizeof(TCHAR) );
+
+ CopyMemory( lpParentPath, lpShortPath, nParentLen * sizeof(TCHAR) );
+ lpParentPath[nParentLen] = 0;
+
+ dwResult = GetLongPathName( lpParentPath, lpLongPath, cchBuffer );
+
+ if ( !dwResult )
+ _tcscpy( lpLongPath, lpParentPath );
+ }
+ else
+ {
+ _tcscpy( lpLongPath, lpShortPath );
+ dwResult = _tcslen( lpLongPath );
+ }
+
+ if ( dwResult < cchBuffer )
+ {
+ _tcscat( lpLongPath, TEXT("\\") );
+ _tcscat( lpLongPath, aFindFileData.cFileName );
+ dwResult = _tcslen( lpLongPath );
+ }
+ else
+ dwResult += _tcslen( aFindFileData.cFileName ) + 1;
+ }
+ }
+
+ return dwResult;
+}
+
diff --git a/sal/systools/win32/uwinapi/GetLongPathNameA.cpp b/sal/systools/win32/uwinapi/GetLongPathNameA.cpp
new file mode 100644
index 000000000000..d3d458ad9ae1
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetLongPathNameA.cpp
@@ -0,0 +1,31 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, DWORD, WINAPI, GetLongPathNameA, ( LPCTSTR lpShortPath, LPTSTR lpLongPath, DWORD cchBuffer ) )
+#include "GetLongPathName.cpp" \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/GetLongPathNameW.cpp b/sal/systools/win32/uwinapi/GetLongPathNameW.cpp
new file mode 100644
index 000000000000..42fded1195a0
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetLongPathNameW.cpp
@@ -0,0 +1,63 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define UNICODE
+#include "macros.h"
+
+EXTERN_C DWORD WINAPI GetLongPathNameW_NT( LPCWSTR lpShortPath, LPWSTR lpLongPath, DWORD cchBuffer )
+#include "GetLongPathName.cpp"
+
+EXTERN_C DWORD WINAPI GetLongPathNameW_WINDOWS( LPCWSTR lpShortPathW, LPWSTR lpLongPathW, DWORD cchBuffer )
+{
+ AUTO_WSTR2STR( lpShortPath );
+ AUTO_STR( lpLongPath, cchBuffer );
+
+ DWORD dwResult = GetLongPathNameA( lpShortPathA, lpLongPathA, cchBuffer );
+
+ if ( dwResult && dwResult < cchBuffer )
+ STR2WSTR( lpLongPath, cchBuffer );
+
+ return dwResult;
+}
+
+
+EXTERN_C void WINAPI ResolveThunk_GetLongPathNameW( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName )
+{
+ if ( (LONG)GetVersion() < 0 )
+ *lppfn = (FARPROC)GetLongPathNameW_WINDOWS;
+ else
+ {
+ FARPROC lpfnResult = GetProcAddress( LoadLibraryA( lpLibFileName ), lpFuncName );
+ if ( !lpfnResult )
+ lpfnResult = (FARPROC)GetLongPathNameW_NT;
+
+ *lppfn = lpfnResult;
+ }
+}
+
+
+DEFINE_CUSTOM_THUNK( kernel32, GetLongPathNameW, DWORD, WINAPI, GetLongPathNameW, ( LPCWSTR lpShortPathW, LPWSTR lpLongPathW, DWORD cchBuffer ) );
diff --git a/sal/systools/win32/uwinapi/GetModuleFileNameExA.cpp b/sal/systools/win32/uwinapi/GetModuleFileNameExA.cpp
new file mode 100644
index 000000000000..b66ebf6dab70
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetModuleFileNameExA.cpp
@@ -0,0 +1,53 @@
+#include "macros.h"
+#ifdef _MSC_VER
+#pragma warning(push,1) // disable warnings within system headers
+#endif
+#include <psapi.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+#include <tlhelp32.h>
+
+IMPLEMENT_THUNK( psapi, WINDOWS, DWORD, WINAPI, GetModuleFileNameExA, (HANDLE hProcess, HMODULE hModule, LPSTR lpFileName, DWORD nSize ) )
+{
+ DWORD dwProcessId = 0;
+ DWORD dwResult = 0;
+
+ if ( !hProcess || hProcess == GetCurrentProcess() || GetCurrentProcessId() == (dwProcessId = GetProcessId( hProcess )) )
+ return GetModuleFileNameA( hModule, lpFileName, nSize );
+
+ HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
+
+ if ( IsValidHandle( hSnapshot ) )
+ {
+ MODULEENTRY32 me;
+
+ me.dwSize = sizeof(me);
+ if ( Module32First( hSnapshot, &me ) )
+ {
+ BOOL fFound = FALSE;
+
+ if ( NULL == hModule )
+ fFound = TRUE;
+ else do
+ {
+ fFound = (me.hModule == hModule);
+ } while ( !fFound && Module32Next( hSnapshot, &me ) );
+
+ if ( fFound )
+ {
+ dwResult = _tcslen( me.szExePath );
+
+ if ( dwResult > nSize && nSize > 0 )
+ lpFileName[nSize -1] = 0;
+
+ _tcsncpy( lpFileName, me.szExePath, nSize );
+ }
+ }
+
+ CloseHandle( hSnapshot );
+ }
+
+ return dwResult;
+}
+
diff --git a/sal/systools/win32/uwinapi/GetModuleFileNameExW.cpp b/sal/systools/win32/uwinapi/GetModuleFileNameExW.cpp
new file mode 100644
index 000000000000..1f952792241f
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetModuleFileNameExW.cpp
@@ -0,0 +1,18 @@
+#include "macros.h"
+#ifdef _MSC_VER
+#pragma warning(push,1) // disable warnings within system headers
+#endif
+#include <psapi.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+IMPLEMENT_THUNK( psapi, WINDOWS, DWORD, WINAPI, GetModuleFileNameExW, (HANDLE hProcess, HMODULE hModule, LPWSTR lpFileNameW, DWORD nSize ) )
+{
+ AUTO_STR( lpFileName, 2 * nSize );
+
+ if ( GetModuleFileNameExA( hProcess, hModule, lpFileNameA, 2 * nSize ) )
+ return (DWORD) STR2WSTR( lpFileName, nSize );
+ else
+ return 0;
+} \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/GetProcessId.cpp b/sal/systools/win32/uwinapi/GetProcessId.cpp
new file mode 100644
index 000000000000..10251e498ba2
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetProcessId.cpp
@@ -0,0 +1,164 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+#include "win95sys.h"
+#include <tlhelp32.h>
+static FARPROC WINAPI GetRealProcAddress( HMODULE hModule, LPCSTR lpProcName )
+{
+ FARPROC lpfn = GetProcAddress( hModule, lpProcName );
+
+ if ( lpfn )
+ {
+ if ( 0x68 == *(LPBYTE)lpfn )
+ {
+ /*
+ 82C9F460 68 36 49 F8 BF push 0BFF84936h
+ 82C9F465 E9 41 62 2F 3D jmp BFF956AB
+ */
+
+ lpfn = (FARPROC)*(LPDWORD)((LPBYTE)lpfn + 1);
+
+ /*
+ BFF956AB 9C pushfd
+ BFF956AC FC cld
+ BFF956AD 50 push eax
+ BFF956AE 53 push ebx
+ BFF956AF 52 push edx
+ BFF956B0 64 8B 15 20 00 00 00 mov edx,dword ptr fs:[20h]
+ BFF956B7 0B D2 or edx,edx
+ BFF956B9 74 09 je BFF956C4
+ BFF956BB 8B 42 04 mov eax,dword ptr [edx+4]
+ BFF956BE 0B C0 or eax,eax
+ BFF956C0 74 07 je BFF956C9
+ BFF956C2 EB 42 jmp BFF95706
+ BFF956C4 5A pop edx
+ BFF956C5 5B pop ebx
+ BFF956C6 58 pop eax
+ BFF956C7 9D popfd
+ BFF956C8 C3 ret
+ */
+ }
+ }
+
+ return lpfn;
+}
+
+
+typedef DWORD (WINAPI OBFUSCATE)( DWORD dwPTID );
+typedef OBFUSCATE *LPOBFUSCATE;
+
+static DWORD WINAPI Obfuscate( DWORD dwPTID )
+{
+ static LPOBFUSCATE lpfnObfuscate = NULL;
+
+ if ( !lpfnObfuscate )
+ {
+ LPBYTE lpCode = (LPBYTE)GetRealProcAddress( GetModuleHandleA("KERNEL32"), "GetCurrentThreadId" );
+
+ if ( lpCode )
+ {
+ /*
+ GetCurrentThreadId:
+ lpCode + 00 BFF84936 A1 DC 9C FC BF mov eax,[BFFC9CDC] ; This is the real thread id
+ lpcode + 05 BFF8493B FF 30 push dword ptr [eax]
+ lpCode + 07 BFF8493D E8 17 C5 FF FF call BFF80E59 ; call Obfuscate function
+ lpcode + 0C BFF84942 C3 ret
+ */
+
+ DWORD dwOffset = *(LPDWORD)(lpCode + 0x08);
+
+ lpfnObfuscate = (LPOBFUSCATE)(lpCode + 0x0C + dwOffset);
+ /*
+ Obfuscate:
+ BFF80E59 A1 CC 98 FC BF mov eax,[BFFC98CC]
+ BFF80E5E 85 C0 test eax,eax
+ BFF80E60 75 04 jne BFF80E66
+ BFF80E62 33 C0 xor eax,eax
+ BFF80E64 EB 04 jmp BFF80E6A
+ BFF80E66 33 44 24 04 xor eax,dword ptr [esp+4]
+ BFF80E6A C2 04 00 ret 4
+ */
+ }
+
+ }
+
+ return lpfnObfuscate ? lpfnObfuscate( dwPTID ) : 0;
+}
+
+
+EXTERN_C DWORD WINAPI GetProcessId_WINDOWS( HANDLE hProcess )
+{
+ if ( GetCurrentProcess() == hProcess )
+ return GetCurrentProcessId();
+
+ DWORD dwProcessId = 0;
+ PPROCESS_DATABASE pPDB = (PPROCESS_DATABASE)Obfuscate( GetCurrentProcessId() );
+
+ if ( pPDB && K32OBJ_PROCESS == pPDB->Type )
+ {
+ DWORD dwHandleNumber = (DWORD)hProcess >> 2;
+
+ if ( 0 == ((DWORD)hProcess & 0x03) && dwHandleNumber < pPDB->pHandleTable->cEntries )
+ {
+ if (
+ pPDB->pHandleTable->array[dwHandleNumber].pObject &&
+ K32OBJ_PROCESS == pPDB->pHandleTable->array[dwHandleNumber].pObject->Type
+ )
+ dwProcessId = Obfuscate( (DWORD)pPDB->pHandleTable->array[dwHandleNumber].pObject );
+ }
+
+ SetLastError( ERROR_INVALID_HANDLE );
+ }
+
+ return dwProcessId;
+}
+
+
+EXTERN_C DWORD WINAPI GetProcessId_NT( HANDLE hProcess )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return 0;
+}
+
+
+EXTERN_C void WINAPI ResolveThunk_GetProcessId( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName )
+{
+ if ( (LONG)GetVersion() < 0 )
+ *lppfn = (FARPROC)GetProcessId_WINDOWS;
+ else
+ {
+ FARPROC lpfnResult = GetProcAddress( LoadLibraryA( lpLibFileName ), lpFuncName );
+ if ( !lpfnResult )
+ lpfnResult = (FARPROC)GetProcessId_NT;
+
+ *lppfn = lpfnResult;
+ }
+}
+
+
+DEFINE_CUSTOM_THUNK( kernel32, GetProcessId, DWORD, WINAPI, GetProcessId, ( HANDLE hProcess ) );
diff --git a/sal/systools/win32/uwinapi/GetUserDefaultUILanguage.cpp b/sal/systools/win32/uwinapi/GetUserDefaultUILanguage.cpp
new file mode 100644
index 000000000000..843f3049a166
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetUserDefaultUILanguage.cpp
@@ -0,0 +1,34 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, LANGID, WINAPI, GetUserDefaultUILanguage,())
+{
+ return LANGIDFROMLCID(GetUserDefaultLCID());
+}
+
diff --git a/sal/systools/win32/uwinapi/GetUserDomainA.cpp b/sal/systools/win32/uwinapi/GetUserDomainA.cpp
new file mode 100644
index 000000000000..880e53648d91
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetUserDomainA.cpp
@@ -0,0 +1,46 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "macros.h"
+
+EXTERN_C DWORD WINAPI GetUserDomainA_NT( LPSTR lpBuffer, DWORD nSize )
+#include "GetUserDomain_NT.cpp"
+
+EXTERN_C DWORD WINAPI GetUserDomainA_WINDOWS( LPSTR lpBuffer, DWORD nSize )
+#include "GetUserDomain_WINDOWS.cpp"
+
+EXTERN_C void WINAPI ResolveThunk_GetUserDomainA( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName )
+{
+ if ( (LONG)GetVersion() < 0 )
+ *lppfn = (FARPROC)GetUserDomainA_WINDOWS;
+ else
+ *lppfn = (FARPROC)GetUserDomainA_NT;
+}
+
+DEFINE_CUSTOM_THUNK( kernel32, GetUserDomainA, DWORD, WINAPI, GetUserDomainA, ( LPSTR lpBuffer, DWORD nSize ) );
+
diff --git a/sal/systools/win32/uwinapi/GetUserDomainW.cpp b/sal/systools/win32/uwinapi/GetUserDomainW.cpp
new file mode 100644
index 000000000000..c49aa79da905
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetUserDomainW.cpp
@@ -0,0 +1,47 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define UNICODE
+#include "macros.h"
+
+EXTERN_C DWORD WINAPI GetUserDomainW_NT( LPWSTR lpBuffer, DWORD nSize )
+#include "GetUserDomain_NT.cpp"
+
+
+EXTERN_C DWORD WINAPI GetUserDomainW_WINDOWS( LPWSTR lpBuffer, DWORD nSize )
+#include "GetUserDomain_WINDOWS.cpp"
+
+EXTERN_C void WINAPI ResolveThunk_GetUserDomainW( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName )
+{
+ if ( (LONG)GetVersion() < 0 )
+ *lppfn = (FARPROC)GetUserDomainW_WINDOWS;
+ else
+ *lppfn = (FARPROC)GetUserDomainW_NT;
+}
+
+DEFINE_CUSTOM_THUNK( kernel32, GetUserDomainW, DWORD, WINAPI, GetUserDomainW, ( LPWSTR lpBuffer, DWORD cchBuffer ) );
+
diff --git a/sal/systools/win32/uwinapi/GetUserDomain_NT.cpp b/sal/systools/win32/uwinapi/GetUserDomain_NT.cpp
new file mode 100644
index 000000000000..289cf80f74d5
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetUserDomain_NT.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+{
+ return GetEnvironmentVariable( TEXT("USERDOMAIN"), lpBuffer, nSize );
+}
diff --git a/sal/systools/win32/uwinapi/GetUserDomain_WINDOWS.cpp b/sal/systools/win32/uwinapi/GetUserDomain_WINDOWS.cpp
new file mode 100644
index 000000000000..20f86ab3c78d
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetUserDomain_WINDOWS.cpp
@@ -0,0 +1,79 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+{
+ HKEY hkeyLogon;
+ HKEY hkeyWorkgroup;
+ DWORD dwResult = 0;
+
+
+ if ( ERROR_SUCCESS == RegOpenKeyEx(
+ HKEY_LOCAL_MACHINE,
+ TEXT("Network\\Logon"),
+ 0, KEY_READ, &hkeyLogon ) )
+ {
+ DWORD dwLogon = 0;
+ DWORD dwLogonSize = sizeof(dwLogon);
+ RegQueryValueEx( hkeyLogon, TEXT("LMLogon"), 0, NULL, (LPBYTE)&dwLogon, &dwLogonSize );
+ RegCloseKey( hkeyLogon );
+
+ if ( dwLogon )
+ {
+ HKEY hkeyNetworkProvider;
+
+ if ( ERROR_SUCCESS == RegOpenKeyEx(
+ HKEY_LOCAL_MACHINE,
+ TEXT("SYSTEM\\CurrentControlSet\\Services\\MSNP32\\NetworkProvider"),
+ 0, KEY_READ, &hkeyNetworkProvider ) )
+ {
+ DWORD dwBufferSize = nSize;
+ LONG lResult = RegQueryValueEx( hkeyNetworkProvider, TEXT("AuthenticatingAgent"), 0, NULL, (LPBYTE)lpBuffer, &dwBufferSize );
+
+ if ( ERROR_SUCCESS == lResult || ERROR_MORE_DATA == lResult )
+ dwResult = dwBufferSize / sizeof(TCHAR);
+
+ RegCloseKey( hkeyNetworkProvider );
+ }
+ }
+ }
+ else if ( ERROR_SUCCESS == RegOpenKeyEx(
+ HKEY_LOCAL_MACHINE,
+ TEXT("SYSTEM\\CurrentControlSet\\Services\\VxD\\VNETSUP"),
+ 0, KEY_READ, &hkeyWorkgroup ) )
+ {
+ DWORD dwBufferSize = nSize;
+ LONG lResult = RegQueryValueEx( hkeyWorkgroup, TEXT("Workgroup"), 0, NULL, (LPBYTE)lpBuffer, &dwBufferSize );
+
+ if ( ERROR_SUCCESS == lResult || ERROR_MORE_DATA == lResult )
+ dwResult = dwBufferSize / sizeof(TCHAR);
+
+ RegCloseKey( hkeyWorkgroup );
+ }
+
+
+ return dwResult;
+}
diff --git a/sal/systools/win32/uwinapi/GetVolumeNameForVolumeMountPointA.cpp b/sal/systools/win32/uwinapi/GetVolumeNameForVolumeMountPointA.cpp
new file mode 100644
index 000000000000..9b02baa76b26
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetVolumeNameForVolumeMountPointA.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, GetVolumeNameForVolumeMountPointA, (LPCSTR lpszVolumeMountPoint, LPSTR lpszVolumeName, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/GetVolumeNameForVolumeMountPointW.cpp b/sal/systools/win32/uwinapi/GetVolumeNameForVolumeMountPointW.cpp
new file mode 100644
index 000000000000..c3b72ba3cf02
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetVolumeNameForVolumeMountPointW.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, GetVolumeNameForVolumeMountPointW, (LPCWSTR lpszVolumeMountPoint, LPWSTR lpszVolumeName, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/GetVolumePathNameA.cpp b/sal/systools/win32/uwinapi/GetVolumePathNameA.cpp
new file mode 100644
index 000000000000..9df190b2f69c
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetVolumePathNameA.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, GetVolumePathNameA, (LPCSTR lpszFileName, LPSTR lpszVolumePathName, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/GetVolumePathNameW.cpp b/sal/systools/win32/uwinapi/GetVolumePathNameW.cpp
new file mode 100644
index 000000000000..8989ea4ff032
--- /dev/null
+++ b/sal/systools/win32/uwinapi/GetVolumePathNameW.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, GetVolumePathNameW, (LPCWSTR lpszFileName, LPWSTR lpszVolumePathName, DWORD cchBufferLength) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/MCIWndCreateW.cpp b/sal/systools/win32/uwinapi/MCIWndCreateW.cpp
new file mode 100644
index 000000000000..13f334745d7b
--- /dev/null
+++ b/sal/systools/win32/uwinapi/MCIWndCreateW.cpp
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+#include <vfw.h>
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, HWND, VFWAPIV, MCIWndCreateW,
+(
+ HWND hwndParent,
+ HINSTANCE hInstance,
+ DWORD dwStyle,
+ LPCWSTR lpFileW
+))
+{
+ AUTO_WSTR2STR( lpFile );
+
+ return MCIWndCreateA( hwndParent, hInstance, dwStyle, lpFileA );
+} \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/MoveFileExA.cpp b/sal/systools/win32/uwinapi/MoveFileExA.cpp
new file mode 100644
index 000000000000..e3525bbcc312
--- /dev/null
+++ b/sal/systools/win32/uwinapi/MoveFileExA.cpp
@@ -0,0 +1,97 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define WININIT_FILENAME "wininit.ini"
+#define RENAME_SECTION "rename"
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, BOOL, WINAPI, MoveFileExA, ( LPCSTR lpExistingFileNameA, LPCSTR lpNewFileNameA, DWORD dwFlags ) )
+{
+ BOOL fSuccess = FALSE; // assume failure
+
+ // Windows 9x has a special mechanism to move files after reboot
+
+ if ( dwFlags & MOVEFILE_DELAY_UNTIL_REBOOT )
+ {
+ CHAR szExistingFileNameA[MAX_PATH];
+ CHAR szNewFileNameA[MAX_PATH] = "NUL";
+
+ // Path names in WININIT.INI must be in short path name form
+
+ if (
+ GetShortPathNameA( lpExistingFileNameA, szExistingFileNameA, MAX_PATH ) &&
+ (!lpNewFileNameA || GetShortPathNameA( lpNewFileNameA, szNewFileNameA, MAX_PATH ))
+ )
+ {
+ CHAR szBuffer[32767]; // The buffer size must not exceed 32K
+ DWORD dwBufLen = GetPrivateProfileSectionA( RENAME_SECTION, szBuffer, elementsof(szBuffer), WININIT_FILENAME );
+
+ CHAR szRename[MAX_PATH]; // This is enough for at most to times 67 chracters
+ strcpy( szRename, szNewFileNameA );
+ strcat( szRename, "=" );
+ strcat( szRename, szExistingFileNameA );
+ size_t lnRename = strlen(szRename);
+
+ if ( dwBufLen + lnRename + 2 <= elementsof(szBuffer) )
+ {
+ CopyMemory( &szBuffer[dwBufLen], szRename, lnRename );
+ szBuffer[dwBufLen + lnRename ] = 0;
+ szBuffer[dwBufLen + lnRename + 1 ] = 0;
+
+ fSuccess = WritePrivateProfileSectionA( RENAME_SECTION, szBuffer, WININIT_FILENAME );
+ }
+ else
+ SetLastError( ERROR_BUFFER_OVERFLOW );
+ }
+ }
+ else
+ {
+
+ fSuccess = MoveFileA( lpExistingFileNameA, lpNewFileNameA );
+
+ if ( !fSuccess && 0 != (dwFlags & (MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING)) )
+ {
+ BOOL bFailIfExist = 0 == (dwFlags & MOVEFILE_REPLACE_EXISTING);
+
+ fSuccess = CopyFileA( lpExistingFileNameA, lpNewFileNameA, bFailIfExist );
+
+ // In case of successfull copy do not return FALSE if delete fails.
+ // Error detection is done by GetLastError()
+
+ if ( fSuccess )
+ {
+ SetLastError( NO_ERROR );
+ DeleteFileA( lpExistingFileNameA );
+ }
+ }
+
+ }
+
+ return fSuccess;
+}
+
diff --git a/sal/systools/win32/uwinapi/MoveFileExW.cpp b/sal/systools/win32/uwinapi/MoveFileExW.cpp
new file mode 100644
index 000000000000..134a1f4571c3
--- /dev/null
+++ b/sal/systools/win32/uwinapi/MoveFileExW.cpp
@@ -0,0 +1,38 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+IMPLEMENT_THUNK( kernel32, WINDOWS, BOOL, WINAPI, MoveFileExW, ( LPCWSTR lpExistingFileNameW, LPCWSTR lpNewFileNameW, DWORD dwFlags ) )
+{
+ AUTO_WSTR2STR( lpExistingFileName );
+ AUTO_WSTR2STR( lpNewFileName );
+
+ return MoveFileExA( lpExistingFileNameA, lpNewFileNameA, dwFlags );
+}
+
+
diff --git a/sal/systools/win32/uwinapi/PathAddBackslashW.cpp b/sal/systools/win32/uwinapi/PathAddBackslashW.cpp
new file mode 100644
index 000000000000..a6acecf6982e
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathAddBackslashW.cpp
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, LPWSTR, WINAPI, PathAddBackslashW,
+(
+ LPWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ PathAddBackslashA(lpPathA);
+ STR2WSTR(lpPath, MAX_PATH);
+ return lpPathW + wcslen(lpPathW);
+}
diff --git a/sal/systools/win32/uwinapi/PathCompactPathExW.cpp b/sal/systools/win32/uwinapi/PathCompactPathExW.cpp
new file mode 100644
index 000000000000..8c3ad013b744
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathCompactPathExW.cpp
@@ -0,0 +1,46 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, BOOL, WINAPI, PathCompactPathExW,
+(
+ LPWSTR pszOut,
+ LPCWSTR lpPathW,
+ UINT cchMax,
+ DWORD dwFlags
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ char* pOutA = (LPSTR)_alloca( cchMax * sizeof(CHAR) );
+ BOOL bret = PathCompactPathExA(pOutA, lpPathA, cchMax, dwFlags);
+ MultiByteToWideChar(CP_ACP, 0, pOutA, -1, pszOut, (int) cchMax);
+ return bret;
+} \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/PathFileExistsW.cpp b/sal/systools/win32/uwinapi/PathFileExistsW.cpp
new file mode 100644
index 000000000000..9cf9c513cc0a
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathFileExistsW.cpp
@@ -0,0 +1,40 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, BOOL, WINAPI, PathFileExistsW,
+(
+ LPCWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ return PathFileExistsA(lpPathA);
+}
diff --git a/sal/systools/win32/uwinapi/PathFindExtensionW.cpp b/sal/systools/win32/uwinapi/PathFindExtensionW.cpp
new file mode 100644
index 000000000000..1617f3b86b5e
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathFindExtensionW.cpp
@@ -0,0 +1,52 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+#include <tchar.h>
+#include <mbstring.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, LPWSTR, WINAPI, PathFindExtensionW,
+(
+ LPCWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ char* pExt = PathFindExtensionA(lpPathA);
+
+ if (*pExt)
+ {
+ *pExt = '\0';
+ LPWSTR pOutW = const_cast<LPWSTR>(lpPathW);
+ return (pOutW + _mbslen(reinterpret_cast<unsigned char*>(lpPathA)));
+ }
+ else
+ return const_cast<LPWSTR>(lpPathW) + wcslen(lpPathW);
+}
diff --git a/sal/systools/win32/uwinapi/PathFindFileNameW.cpp b/sal/systools/win32/uwinapi/PathFindFileNameW.cpp
new file mode 100644
index 000000000000..6d9854e6102a
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathFindFileNameW.cpp
@@ -0,0 +1,51 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+#include <mbstring.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, LPWSTR, WINAPI, PathFindFileNameW,
+(
+ LPCWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ char* pFname = PathFindFileNameA(lpPathA);
+
+ if (pFname > lpPathA)
+ {
+ *pFname = '\0';
+ LPWSTR pOutW = const_cast<LPWSTR>(lpPathW);
+ return (pOutW + _mbslen(reinterpret_cast<unsigned char*>(lpPathA)));
+ }
+ else
+ return const_cast<LPWSTR>(lpPathW);
+}
diff --git a/sal/systools/win32/uwinapi/PathIsFileSpecW.cpp b/sal/systools/win32/uwinapi/PathIsFileSpecW.cpp
new file mode 100644
index 000000000000..eaf037c1dea1
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathIsFileSpecW.cpp
@@ -0,0 +1,40 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, BOOL, WINAPI, PathIsFileSpecW,
+(
+ LPCWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ return PathIsFileSpecA(lpPathA);
+}
diff --git a/sal/systools/win32/uwinapi/PathIsUNCW.cpp b/sal/systools/win32/uwinapi/PathIsUNCW.cpp
new file mode 100644
index 000000000000..a86c66236749
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathIsUNCW.cpp
@@ -0,0 +1,40 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, BOOL, WINAPI, PathIsUNCW,
+(
+ LPCWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ return PathIsUNCA(lpPathA);
+}
diff --git a/sal/systools/win32/uwinapi/PathRemoveExtensionW.cpp b/sal/systools/win32/uwinapi/PathRemoveExtensionW.cpp
new file mode 100644
index 000000000000..04a466c149bd
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathRemoveExtensionW.cpp
@@ -0,0 +1,41 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, void, WINAPI, PathRemoveExtensionW,
+(
+ LPWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ PathRemoveExtensionA(lpPathA);
+ STR2WSTR(lpPath, wcslen(lpPathW) + 1);
+}
diff --git a/sal/systools/win32/uwinapi/PathRemoveFileSpecW.cpp b/sal/systools/win32/uwinapi/PathRemoveFileSpecW.cpp
new file mode 100644
index 000000000000..100eeedf2b6c
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathRemoveFileSpecW.cpp
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, BOOL, WINAPI, PathRemoveFileSpecW,
+(
+ LPWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ BOOL bret = PathRemoveFileSpecA(lpPathA);
+ STR2WSTR(lpPath, wcslen(lpPathW) + 1);
+ return bret;
+}
diff --git a/sal/systools/win32/uwinapi/PathSetDlgItemPathW.cpp b/sal/systools/win32/uwinapi/PathSetDlgItemPathW.cpp
new file mode 100644
index 000000000000..e855e674e47f
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathSetDlgItemPathW.cpp
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, void, WINAPI, PathSetDlgItemPathW,
+(
+ HWND hDlg,
+ int id,
+ LPCWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ PathSetDlgItemPathA(hDlg, id, lpPathA);
+}
diff --git a/sal/systools/win32/uwinapi/PathStripToRootW.cpp b/sal/systools/win32/uwinapi/PathStripToRootW.cpp
new file mode 100644
index 000000000000..bd912527a2bc
--- /dev/null
+++ b/sal/systools/win32/uwinapi/PathStripToRootW.cpp
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+#define _SHLWAPI_
+#include <shlwapi.h>
+
+IMPLEMENT_THUNK( shlwapi, WINDOWS, BOOL, WINAPI, PathStripToRootW,
+(
+ LPWSTR lpPathW
+))
+{
+ AUTO_WSTR2STR(lpPath);
+ BOOL bret = PathStripToRootA(lpPathA);
+ STR2WSTR(lpPath, wcslen(lpPathW) + 1);
+ return bret;
+}
diff --git a/sal/systools/win32/uwinapi/ResolveThunk.cpp b/sal/systools/win32/uwinapi/ResolveThunk.cpp
new file mode 100644
index 000000000000..d635b8c43b64
--- /dev/null
+++ b/sal/systools/win32/uwinapi/ResolveThunk.cpp
@@ -0,0 +1,64 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+
+EXTERN_C void WINAPI ResolveThunk_WINDOWS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure )
+{
+ FARPROC lpfnResult = (LONG)GetVersion() < 0 ? lpfnEmulate : GetProcAddress( LoadLibraryA( lpLibFileName ), lpFuncName );
+
+ if ( !lpfnResult )
+ lpfnResult = lpfnEmulate;
+
+ if ( !lpfnResult )
+ lpfnResult = lpfnFailure;
+
+ *lppfn = lpfnResult;
+}
+
+
+EXTERN_C void WINAPI ResolveThunk_TRYLOAD( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure )
+{
+ FARPROC lpfnResult = GetProcAddress( LoadLibraryA( lpLibFileName ), lpFuncName );
+
+ if ( !lpfnResult )
+ lpfnResult = lpfnEmulate;
+
+ if ( !lpfnResult )
+ lpfnResult = lpfnFailure;
+
+ *lppfn = lpfnResult;
+}
+
+
+EXTERN_C void WINAPI ResolveThunk_ALLWAYS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure )
+{
+ *lppfn = lpfnEmulate ? lpfnEmulate : lpfnFailure;
+}
+
+
diff --git a/sal/systools/win32/uwinapi/ResolveUnicows.cpp b/sal/systools/win32/uwinapi/ResolveUnicows.cpp
new file mode 100644
index 000000000000..cd5943004f17
--- /dev/null
+++ b/sal/systools/win32/uwinapi/ResolveUnicows.cpp
@@ -0,0 +1,510 @@
+#ifdef __MINGW32__
+#define _GDI32_
+#include "macros.h"
+#include <multimon.h>
+extern "C" {
+extern HMODULE hModuleUnicowsDLL;
+}
+
+EXTERN_C void WINAPI ResolveThunk_UNICOWS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnFailure )
+{
+ FARPROC lpfnResult = (((LONG)GetVersion()&0x800000ff) == 0x80000004) ? GetProcAddress( hModuleUnicowsDLL, lpFuncName ) : GetProcAddress( LoadLibraryA( lpLibFileName ), lpFuncName );
+
+ if ( !lpfnResult )
+ lpfnResult = lpfnFailure;
+
+ *lppfn = lpfnResult;
+}
+
+static void GetProcAddress_Thunk();
+EXTERN_C { _declspec( dllexport ) FARPROC kernel32_GetProcAddress_Ptr = (FARPROC)GetProcAddress_Thunk; }
+static FARPROC WINAPI GetProcAddress_Failure (HINSTANCE,LPCSTR);
+static void GetProcAddress_Thunk()
+{
+ ResolveThunk_UNICOWS( &kernel32_GetProcAddress_Ptr, "kernel32.dll", "GetProcAddress", (FARPROC)GetProcAddress_Failure );
+ asm(" movl %ebp, %esp");
+ asm(" popl %ebp");
+ asm(" jmp *(%0)"::"m"(kernel32_GetProcAddress_Ptr));
+}
+EXTERN_C FARPROC WINAPI Internal_GetProcAddress (HINSTANCE,LPCSTR)
+{
+ asm(" popl %ebp");
+ asm(" jmp *(%0)"::"m"(kernel32_GetProcAddress_Ptr));
+}
+static FARPROC WINAPI GetProcAddress_Failure (HINSTANCE,LPCSTR)
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return (FARPROC)0;
+}
+
+#define DEFINE_UNICOWS_THUNK( module, rettype, calltype, func, params ) \
+static void func##_Thunk(); \
+EXTERN_C { _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; } \
+static rettype calltype func##_##Failure params; \
+static void func##_Thunk() \
+{ \
+ ResolveThunk_UNICOWS( &module##_##func##_Ptr, #module ".dll", #func, (FARPROC)func##_##Failure ); \
+ asm(" movl %ebp, %esp"); \
+ asm(" popl %ebp"); \
+ asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \
+} \
+EXTERN_C rettype calltype func params \
+{ \
+ asm(" popl %ebp"); \
+ asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \
+} \
+static rettype calltype func##_##Failure params \
+{ \
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \
+ return (rettype)0; \
+}
+
+DEFINE_UNICOWS_THUNK( kernel32, ATOM, WINAPI, AddAtomW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( gdi32, int, WINAPI, AddFontResourceW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, AddJobW, (HANDLE,DWORD,PBYTE,DWORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, AddPortW, (LPWSTR,HWND,LPWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, AddPrintProcessorW, (LPWSTR,LPWSTR,LPWSTR,LPWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, AddPrintProvidorW, (LPWSTR,DWORD,PBYTE) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, AddPrinterDriverW, (LPWSTR,DWORD,PBYTE) )
+DEFINE_UNICOWS_THUNK( winspool, HANDLE, WINAPI, AddPrinterW, (LPWSTR,DWORD,PBYTE) )
+DEFINE_UNICOWS_THUNK( winspool, LONG, WINAPI, AdvancedDocumentPropertiesW, (HWND,HANDLE,LPWSTR,PDEVMODE,PDEVMODEW) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, AppendMenuW, (HMENU,UINT,UINT_PTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, BeginUpdateResourceW, (LPCWSTR,BOOL) )
+DEFINE_UNICOWS_THUNK( user32, long, WINAPI, BroadcastSystemMessageW, (DWORD,LPDWORD,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, BuildCommDCBAndTimeoutsW, (LPCWSTR,LPDCB,LPCOMMTIMEOUTS) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, BuildCommDCBW, (LPCWSTR,LPDCB) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, CallMsgFilterW, (LPMSG,int) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, CallNamedPipeW, (LPCWSTR,PVOID,DWORD,PVOID,DWORD,PDWORD,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, LRESULT, WINAPI, CallWindowProcA, (WNDPROC,HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, LRESULT, WINAPI, CallWindowProcW, (WNDPROC,HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, ChangeDisplaySettingsExW, (LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, ChangeDisplaySettingsW, (PDEVMODEW,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, ChangeMenuW, (HMENU,UINT,LPCWSTR,UINT,UINT) )
+DEFINE_UNICOWS_THUNK( user32, DWORD, WINAPI, CharLowerBuffW, (LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, LPWSTR, WINAPI, CharLowerW, (LPWSTR) )
+DEFINE_UNICOWS_THUNK( user32, LPWSTR, WINAPI, CharNextW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, LPWSTR, WINAPI, CharPrevW, (LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, CharToOemBuffW, (LPCWSTR,LPSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, CharToOemW, (LPCWSTR,LPSTR) )
+DEFINE_UNICOWS_THUNK( user32, DWORD, WINAPI, CharUpperBuffW, (LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, LPWSTR, WINAPI, CharUpperW, (LPWSTR) )
+DEFINE_UNICOWS_THUNK( comdlg32, BOOL, WINAPI, ChooseColorW, (LPCHOOSECOLORW) )
+DEFINE_UNICOWS_THUNK( comdlg32, BOOL, WINAPI, ChooseFontW, (LPCHOOSEFONTW) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, CommConfigDialogW, (LPCWSTR,HWND,LPCOMMCONFIG) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, CompareStringW, (LCID,DWORD,LPCWSTR,int,LPCWSTR,int) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, ConfigurePortW, (LPWSTR,HWND,LPWSTR) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, CopyAcceleratorTableW, (HACCEL,LPACCEL,int) )
+DEFINE_UNICOWS_THUNK( gdi32, HENHMETAFILE, WINAPI, CopyEnhMetaFileW, (HENHMETAFILE,LPCWSTR) )
+//DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, CopyFileExW, (LPCWSTR,LPCWSTR,LPPROGRESS_ROUTINE,LPVOID,LPBOOL,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, CopyFileW, (LPCWSTR,LPCWSTR,BOOL) )
+DEFINE_UNICOWS_THUNK( gdi32, HMETAFILE, WINAPI, CopyMetaFileW, (HMETAFILE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HACCEL, WINAPI, CreateAcceleratorTableW, (LPACCEL,int) )
+DEFINE_UNICOWS_THUNK( gdi32, HCOLORSPACE, WINAPI, CreateColorSpaceW, (LPLOGCOLORSPACEW) )
+DEFINE_UNICOWS_THUNK( gdi32, HDC, WINAPI, CreateDCW, (LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*) )
+DEFINE_UNICOWS_THUNK( user32, HWND, WINAPI, CreateDialogIndirectParamW, (HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, HWND, WINAPI, CreateDialogParamW, (HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, CreateDirectoryExW, (LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, CreateDirectoryW, (LPCWSTR,LPSECURITY_ATTRIBUTES) )
+DEFINE_UNICOWS_THUNK( gdi32, HDC, WINAPI, CreateEnhMetaFileW, (HDC,LPCWSTR,LPCRECT,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, CreateEventW, (LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, CreateFileMappingW, (HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, CreateFileW, (LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE) )
+DEFINE_UNICOWS_THUNK( gdi32, HFONT, WINAPI, CreateFontIndirectW, (const LOGFONTW*) )
+DEFINE_UNICOWS_THUNK( gdi32, HFONT, WINAPI, CreateFontW, (int,int,int,int,int,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( gdi32, HDC, WINAPI, CreateICW, (LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*) )
+DEFINE_UNICOWS_THUNK( user32, HWND, WINAPI, CreateMDIWindowW, (LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HINSTANCE,LPARAM) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, CreateMailslotW, (LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES) )
+DEFINE_UNICOWS_THUNK( gdi32, HDC, WINAPI, CreateMetaFileW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, CreateMutexW, (LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, CreateProcessW, (LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, CreateScalableFontResourceW, (DWORD,LPCWSTR,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, CreateSemaphoreW, (LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( oeacc, HRESULT, STDAPICALLTYPE, CreateStdAccessibleProxyW, (HWND, LPCWSTR, LONG, REFIID, void**) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, CreateWaitableTimerW, (LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HWND, WINAPI, CreateWindowExW, (DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID) )
+DEFINE_UNICOWS_THUNK( user32, HCONV, WINAPI, DdeConnect, (DWORD,HSZ,HSZ,PCONVCONTEXT) )
+DEFINE_UNICOWS_THUNK( user32, HCONVLIST, WINAPI, DdeConnectList, (DWORD,HSZ,HSZ,HCONVLIST,PCONVCONTEXT) )
+DEFINE_UNICOWS_THUNK( user32, HSZ, WINAPI, DdeCreateStringHandleW, (DWORD,LPCWSTR,int) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, DdeInitializeW, (PDWORD,PFNCALLBACK,DWORD,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, DdeQueryConvInfo, (HCONV,DWORD,PCONVINFO) )
+DEFINE_UNICOWS_THUNK( user32, DWORD, WINAPI, DdeQueryStringW, (DWORD,HSZ,LPWSTR,DWORD,int) )
+DEFINE_UNICOWS_THUNK( user32, LRESULT, WINAPI, DefDlgProcW, (HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, LRESULT, WINAPI, DefFrameProcW, (HWND,HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, LRESULT, WINAPI, DefMDIChildProcW, (HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, LRESULT, WINAPI, DefWindowProcW, (HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, DeleteFileW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, DeleteMonitorW, (LPWSTR,LPWSTR,LPWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, DeletePortW, (LPWSTR,HWND,LPWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, DeletePrintProcessorW, (LPWSTR,LPWSTR,LPWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, DeletePrintProvidorW, (LPWSTR,LPWSTR,LPWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, DeletePrinterDriverW, (LPWSTR,LPWSTR,LPWSTR) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, DialogBoxIndirectParamW, (HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, DialogBoxParamW, (HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, DispatchMessageW, (const MSG*) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, DlgDirListComboBoxW, (HWND,LPWSTR,int,int,UINT) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, DlgDirListW, (HWND,LPWSTR,int,int,UINT) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, DlgDirSelectComboBoxExW, (HWND,LPWSTR,int,int) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, DlgDirSelectExW, (HWND,LPWSTR,int,int) )
+DEFINE_UNICOWS_THUNK( shell32, UINT, WINAPI, DragQueryFileW, (HDROP,UINT,LPWSTR,UINT) )
+//DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, DrawStateW, (HDC,HBRUSH,DRAWSTATEPROC,LPARAM,WPARAM,int,int,int,int,UINT) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, DrawTextExW, (HDC,LPWSTR,int,LPRECT,UINT,LPDRAWTEXTPARAMS) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, DrawTextW, (HDC,LPCWSTR,int,LPRECT,UINT) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, EnableWindow, (HWND,BOOL) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, EndUpdateResourceW, (HANDLE,BOOL) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, EnumCalendarInfoExW, (CALINFO_ENUMPROCEXW,LCID,CALID,CALTYPE) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, EnumCalendarInfoW, (CALINFO_ENUMPROCW,LCID,CALID,CALTYPE) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, EnumClipboardFormats, (UINT) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, EnumDateFormatsExW, (DATEFMT_ENUMPROCEXW,LCID,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, EnumDateFormatsW, (DATEFMT_ENUMPROCW,LCID,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, EnumDisplayDevicesW, (LPCWSTR,DWORD,PDISPLAY_DEVICEW,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, EnumDisplaySettingsExW, (LPCWSTR,DWORD,LPDEVMODEW,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, EnumDisplaySettingsW, (LPCWSTR,DWORD,PDEVMODEW) )
+DEFINE_UNICOWS_THUNK( gdi32, int, WINAPI, EnumFontFamiliesExW, (HDC,PLOGFONTW,FONTENUMPROCW,LPARAM,DWORD) )
+DEFINE_UNICOWS_THUNK( gdi32, int, WINAPI, EnumFontFamiliesW, (HDC,LPCWSTR,FONTENUMPROCW,LPARAM) )
+DEFINE_UNICOWS_THUNK( gdi32, int, WINAPI, EnumFontsW, (HDC,LPCWSTR,FONTENUMPROCW,LPARAM) )
+DEFINE_UNICOWS_THUNK( gdi32, int, WINAPI, EnumICMProfilesW, (HDC,ICMENUMPROCW,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, EnumPropsA, (HWND,PROPENUMPROCA) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, EnumPropsExA, (HWND,PROPENUMPROCEXA,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, EnumPropsExW, (HWND,PROPENUMPROCEXW,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, EnumPropsW, (HWND,PROPENUMPROCW) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, EnumSystemCodePagesW, (CODEPAGE_ENUMPROCW,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, EnumSystemLocalesW, (LOCALE_ENUMPROCW,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, EnumTimeFormatsW, (TIMEFMT_ENUMPROCW,LCID,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, ExpandEnvironmentStringsW, (LPCWSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, ExtTextOutW, (HDC,int,int,UINT,LPCRECT,LPCWSTR,UINT,const INT*) )
+DEFINE_UNICOWS_THUNK( shell32, UINT, WINAPI, ExtractIconExW, (LPCWSTR,int,HICON*,HICON*,UINT) )
+DEFINE_UNICOWS_THUNK( shell32, HICON, WINAPI, ExtractIconW, (HINSTANCE,LPCWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( kernel32, void, WINAPI, FatalAppExitW, (UINT,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, FillConsoleOutputCharacterW, (HANDLE,WCHAR,DWORD,COORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, ATOM, WINAPI, FindAtomW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, FindFirstChangeNotificationW, (LPCWSTR,BOOL,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, FindFirstFileW, (LPCWSTR,LPWIN32_FIND_DATAW) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, FindNextFileW, (HANDLE,LPWIN32_FIND_DATAW) )
+DEFINE_UNICOWS_THUNK( kernel32, HRSRC, WINAPI, FindResourceExW, (HINSTANCE,LPCWSTR,LPCWSTR,WORD) )
+DEFINE_UNICOWS_THUNK( kernel32, HRSRC, WINAPI, FindResourceW, (HINSTANCE,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( comdlg32, HWND, WINAPI, FindTextW, (LPFINDREPLACEW) )
+DEFINE_UNICOWS_THUNK( user32, HWND, WINAPI, FindWindowExW, (HWND,HWND,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HWND, WINAPI, FindWindowW, (LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, FormatMessageW, (DWORD,PCVOID,DWORD,DWORD,LPWSTR,DWORD,va_list*) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, FreeEnvironmentStringsW, (LPWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, FtpCreateDirectoryW, (HANDLE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, FtpDeleteFileW, (HANDLE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, FtpFindFirstFileW, (HANDLE,LPCWSTR,LPWIN32_FIND_DATA,DWORD,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, FtpGetCurrentDirectoryW, (HANDLE,LPWSTR,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, FtpRemoveDirectoryW, (HANDLE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, FtpSetCurrentDirectoryW, (HANDLE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, GetAltTabInfoW, (HWND,int,PALTTABINFO,LPWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GetAtomNameW, (ATOM,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetCPInfo, (UINT,LPCPINFO) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetCPInfoExA, (UINT,DWORD,LPCPINFOEXA) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetCPInfoExW, (UINT,DWORD,LPCPINFOEXW) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, GetCalendarInfoW, (LCID,CALID,CALTYPE,LPWSTR,int,LPDWORD) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetCharABCWidthsW, (HDC,UINT,UINT,LPABC) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetCharWidthFloatW, (HDC,UINT,UINT,PFLOAT) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetCharWidthW, (HDC,UINT,UINT,LPINT) )
+DEFINE_UNICOWS_THUNK( gdi32, DWORD, WINAPI, GetCharacterPlacementW, (HDC,LPCWSTR,int,int,LPGCP_RESULTSW,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, GetClassInfoExW, (HINSTANCE,LPCWSTR,LPWNDCLASSEXW) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, GetClassInfoW, (HINSTANCE,LPCWSTR,LPWNDCLASSW) )
+DEFINE_UNICOWS_THUNK( user32, DWORD, WINAPI, GetClassLongW, (HWND,int) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, GetClassNameW, (HWND,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( user32, HANDLE, WINAPI, GetClipboardData, (UINT) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, GetClipboardFormatNameW, (UINT,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetComputerNameW, (LPWSTR,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetConsoleTitleW, (LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, GetCurrencyFormatW, (LCID,DWORD,LPCWSTR,const CURRENCYFMTW*,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetCurrentDirectoryW, (DWORD,LPWSTR) )
+DEFINE_UNICOWS_THUNK( advapi32, BOOL, WINAPI, GetCurrentHwProfileW, (LPHW_PROFILE_INFOW) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, GetDateFormatW, (LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetDefaultCommConfigW, (LPCWSTR,LPCOMMCONFIG,PDWORD) )
+//DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetDiskFreeSpaceExW, (LPCWSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetDiskFreeSpaceW, (LPCWSTR,PDWORD,PDWORD,PDWORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, GetDlgItemTextW, (HWND,int,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GetDriveTypeW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( gdi32, UINT, WINAPI, GetEnhMetaFileDescriptionW, (HENHMETAFILE,UINT,LPWSTR) )
+DEFINE_UNICOWS_THUNK( gdi32, HENHMETAFILE, WINAPI, GetEnhMetaFileW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, LPWSTR, WINAPI, GetEnvironmentStringsW, (void) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetEnvironmentVariableW, (LPCWSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetFileAttributesExW, (LPCWSTR,GET_FILEEX_INFO_LEVELS,PVOID) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetFileAttributesW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( comdlg32, short, WINAPI, GetFileTitleW, (LPCWSTR,LPWSTR,WORD) )
+DEFINE_UNICOWS_THUNK( version, DWORD, WINAPI, GetFileVersionInfoSizeW, (LPWSTR,PDWORD) )
+DEFINE_UNICOWS_THUNK( version, BOOL, WINAPI, GetFileVersionInfoW, (LPWSTR,DWORD,DWORD,PVOID) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetFullPathNameW, (LPCWSTR,DWORD,LPWSTR,LPWSTR*) )
+DEFINE_UNICOWS_THUNK( gdi32, DWORD, WINAPI, GetGlyphOutlineW, (HDC,UINT,UINT,LPGLYPHMETRICS,DWORD,PVOID,const MAT2*) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetICMProfileW, (HDC,LPDWORD,LPWSTR) )
+DEFINE_UNICOWS_THUNK( gdi32, DWORD, WINAPI, GetKerningPairsW, (HDC,DWORD,LPKERNINGPAIR) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, GetKeyNameTextW, (LONG,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, GetKeyboardLayoutNameW, (LPWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, GetLocaleInfoW, (LCID,LCTYPE,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetLogColorSpaceW, (HCOLORSPACE,LPLOGCOLORSPACEW,DWORD) )
+//DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetLogicalDriveStringsW, (DWORD,LPWSTR) )
+//DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetLongPathNameW, (LPCWSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, GetMenuItemInfoW, (HMENU,UINT,BOOL,LPMENUITEMINFOW) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, GetMenuStringW, (HMENU,UINT,LPWSTR,int,UINT) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, GetMessageW, (LPMSG,HWND,UINT,UINT) )
+DEFINE_UNICOWS_THUNK( gdi32, HMETAFILE, WINAPI, GetMetaFileW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetModuleFileNameW, (HINSTANCE,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, HMODULE, WINAPI, GetModuleHandleW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, GetMonitorInfoW, (HMONITOR,LPMONITORINFO) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetNamedPipeHandleStateW, (HANDLE,PDWORD,PDWORD,PDWORD,PDWORD,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, GetNumberFormatW, (LCID,DWORD,LPCWSTR,const NUMBERFMTW*,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( gdi32, int, WINAPI, GetObjectW, (HGDIOBJ,int,PVOID) )
+DEFINE_UNICOWS_THUNK( msvfw32, BOOL, WINAPI, GetOpenFileNamePreviewW, (LPOPENFILENAMEW) )
+DEFINE_UNICOWS_THUNK( comdlg32, BOOL, WINAPI, GetOpenFileNameW, (LPOPENFILENAMEW) )
+DEFINE_UNICOWS_THUNK( gdi32, UINT, WINAPI, GetOutlineTextMetricsW, (HDC,UINT,LPOUTLINETEXTMETRICW) )
+DEFINE_UNICOWS_THUNK( winspool, DWORD, WINAPI, GetPrintProcessorDirectoryW, (LPWSTR,LPWSTR,DWORD,PBYTE,DWORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GetPrivateProfileIntW, (LPCWSTR,LPCWSTR,INT,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetPrivateProfileSectionNamesW, (LPWSTR,DWORD,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetPrivateProfileSectionW, (LPCWSTR,LPWSTR,DWORD,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetPrivateProfileStringW, (LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetPrivateProfileStructW, (LPCWSTR,LPCWSTR,LPVOID,UINT,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GetProfileIntW, (LPCWSTR,LPCWSTR,INT) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetProfileSectionW, (LPCWSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetProfileStringW, (LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, HANDLE, WINAPI, GetPropA, (HWND,LPCSTR) )
+DEFINE_UNICOWS_THUNK( user32, HANDLE, WINAPI, GetPropW, (HWND,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( oleacc, UINT, WINAPI, GetRoleTextW, (DWORD,LPWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( msvfw32, BOOL, WINAPI, GetSaveFileNamePreviewW, (LPOPENFILENAMEW) )
+DEFINE_UNICOWS_THUNK( comdlg32, BOOL, WINAPI, GetSaveFileNameW, (LPOPENFILENAMEW) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetShortPathNameW, (LPCWSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, VOID, WINAPI, GetStartupInfoW, (LPSTARTUPINFOW) )
+DEFINE_UNICOWS_THUNK( oleacc, UINT, WINAPI, GetStateTextW, (DWORD,LPWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetStringTypeExW, (LCID,DWORD,LPCWSTR,int,LPWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetStringTypeW, (DWORD,LPCWSTR,int,LPWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GetSystemDirectoryW, (LPWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GetSystemWindowsDirectoryW, (LPWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( user32, DWORD, WINAPI, GetTabbedTextExtentW, (HDC,LPCWSTR,int,int,CONST INT*) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GetTempFileNameW, (LPCWSTR,LPCWSTR,UINT,LPWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, GetTempPathW, (DWORD,LPWSTR) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetTextExtentExPointW, ( HDC,LPCWSTR,int,int,LPINT,LPINT,LPSIZE ) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetTextExtentPoint32W, ( HDC,LPCWSTR,int,LPSIZE) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetTextExtentPointW, (HDC,LPCWSTR,int,LPSIZE) )
+DEFINE_UNICOWS_THUNK( gdi32, int, WINAPI, GetTextFaceW, (HDC,int,LPWSTR) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, GetTextMetricsW, (HDC,LPTEXTMETRICW) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, GetTimeFormatW, (LCID,DWORD,const SYSTEMTIME*,LPCWSTR,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( advapi32, BOOL, WINAPI, GetUserNameW, (LPWSTR,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetVersionExW, (LPOSVERSIONINFOW) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, GetVolumeInformationW, (LPCWSTR,LPWSTR,DWORD,PDWORD,PDWORD,PDWORD,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, GetWindowLongA, (HWND,int) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, GetWindowLongW, (HWND,int) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, GetWindowModuleFileNameW, (HWND,LPWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, GetWindowTextLengthW, (HWND) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, GetWindowTextW, (HWND,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GetWindowsDirectoryW, (LPWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( kernel32, ATOM, WINAPI, GlobalAddAtomW, ( LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, ATOM, WINAPI, GlobalFindAtomW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, UINT, WINAPI, GlobalGetAtomNameW, (ATOM,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, GopherFindFirstFileW, (HANDLE,LPCWSTR,LPCWSTR,LPVOID,DWORD,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, GrayStringW, (HDC,HBRUSH,GRAYSTRINGPROC,LPARAM,int,int,int,int,int) )
+DEFINE_UNICOWS_THUNK( user32, HANDLE, WINAPI, ImageList_LoadImageW, (HINSTANCE,LPCWSTR,int,int,COLORREF,UINT,UINT) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, InsertMenuItemW, (HMENU,UINT,BOOL,LPCMENUITEMINFOW) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, InsertMenuW, (HMENU,UINT,UINT,UINT,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, InternetFindNextFileW, (HANDLE,PVOID) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, IsBadStringPtrW, (LPCWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, IsCharAlphaNumericW, (WCHAR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, IsCharAlphaW, (WCHAR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, IsCharLowerW, (WCHAR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, IsCharUpperW, (WCHAR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, IsClipboardFormatAvailable, (UINT) )
+DEFINE_UNICOWS_THUNK( sensapi, BOOL, APIENTRY, IsDestinationReachableW, (LPCWSTR,LPVOID) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, IsDialogMessageW, (HWND,LPMSG) )
+DEFINE_UNICOWS_THUNK( advapi32, BOOL, WINAPI, IsTextUnicode, (PCVOID,int,LPINT) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, IsValidCodePage, (UINT) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, IsWindowUnicode, (HWND) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, LCMapStringW, (LCID,DWORD,LPCWSTR,int,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( user32, HACCEL, WINAPI, LoadAcceleratorsW, (HINSTANCE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HBITMAP, WINAPI, LoadBitmapW, (HINSTANCE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HCURSOR, WINAPI, LoadCursorFromFileW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HCURSOR, WINAPI, LoadCursorW, (HINSTANCE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HICON, WINAPI, LoadIconW, (HINSTANCE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HANDLE, WINAPI, LoadImageW, (HINSTANCE,LPCWSTR,UINT,int,int,UINT) )
+DEFINE_UNICOWS_THUNK( user32, HKL, WINAPI, LoadKeyboardLayoutW, (LPCWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( kernel32, HINSTANCE, WINAPI, LoadLibraryExW, (LPCWSTR,HANDLE,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, HINSTANCE, WINAPI, LoadLibraryW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HMENU, WINAPI, LoadMenuIndirectW, (const MENUTEMPLATE*) )
+DEFINE_UNICOWS_THUNK( user32, HMENU, WINAPI, LoadMenuW, (HINSTANCE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, LoadStringW, (HINSTANCE,UINT,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( user32, HINSTANCE, WINAPI, MLLoadLibraryW, (LPCWSTR,HANDLE,DWORD,LPCWSTR,BOOL) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, MapVirtualKeyExW, (UINT,UINT,HKL) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, MapVirtualKeyW, (UINT,UINT) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, MessageBoxExW, (HWND,LPCWSTR,LPCWSTR,UINT,WORD) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, MessageBoxIndirectW, (CONST MSGBOXPARAMSW*) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, MessageBoxW, (HWND,LPCWSTR,LPCWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, ModifyMenuW, (HMENU,UINT,UINT,UINT,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, MoveFileW, (LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, MultiByteToWideChar, (UINT,DWORD,LPCSTR,int,LPWSTR,int) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, MultinetGetConnectionPerformanceW, (LPNETRESOURCEW,LPNETCONNECTINFOSTRUCT) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, OemToCharBuffW, (LPCSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, OemToCharW, (LPCSTR,LPWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, OpenEventW, (DWORD,BOOL,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, OpenFileMappingW, (DWORD,BOOL,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, OpenMutexW, (DWORD,BOOL,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, OpenPrinterW, (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, OpenSemaphoreW, (DWORD,BOOL,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, HANDLE, WINAPI, OpenWaitableTimerW, (DWORD,BOOL,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, void, WINAPI, OutputDebugStringW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( comdlg32, BOOL, WINAPI, PageSetupDlgW, (LPPAGESETUPDLGW) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, PeekConsoleInputW, (HANDLE,PINPUT_RECORD,DWORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, PeekMessageW, (LPMSG,HWND,UINT,UINT,UINT) )
+DEFINE_UNICOWS_THUNK( winmm, BOOL, WINAPI, PlaySoundW, (LPCWSTR,HMODULE,DWORD) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, PolyTextOutW, (HDC,const POLYTEXTW*,int) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, PostMessageW, (HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, PostThreadMessageW, (DWORD,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( comdlg32, BOOL, WINAPI, PrintDlgW, (LPPRINTDLGW) )
+DEFINE_UNICOWS_THUNK( comdlg32, DWORD, WINAPI, PrinterMessageBoxW, (HANDLE,DWORD,HWND,LPWSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, QueryDosDeviceW, (LPCWSTR,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasConnectionNotificationW, (HANDLE, HANDLE, DWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasCreatePhonebookEntryW, (HWND, LPCWSTR) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasDeleteEntryW, (LPCWSTR, LPCWSTR) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasDeleteSubEntryW, (LPCWSTR, LPCWSTR, DWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasEditPhonebookEntryW, (HWND, LPCWSTR, LPCWSTR) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasEnumConnectionsW, (LPVOID, LPDWORD, LPDWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasEnumDevicesW, (LPVOID, LPDWORD, LPDWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasEnumEntriesW, (LPCWSTR, LPCWSTR, LPVOID, LPDWORD, LPDWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasGetConnectStatusW, (HANDLE, LPVOID) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasGetEntryDialParamsW, (LPCWSTR, LPVOID, LPBOOL) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasGetEntryPropertiesW, (LPCWSTR, LPCWSTR, LPVOID, LPDWORD, LPBYTE, LPDWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasGetErrorStringW, (UINT, LPWSTR, DWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasHangUpW, (HANDLE) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasRenameEntryW, (LPCWSTR, LPCWSTR, LPCWSTR) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasSetEntryDialParamsW, (LPCWSTR, LPVOID, BOOL) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasSetEntryPropertiesW, (LPCWSTR, LPCWSTR, LPVOID, DWORD, LPBYTE, DWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasSetSubEntryPropertiesW, (LPCWSTR, LPCWSTR, DWORD, LPVOID, DWORD, LPBYTE, DWORD) )
+DEFINE_UNICOWS_THUNK( rasapi32, DWORD, APIENTRY, RasValidateEntryNameW, (LPCWSTR, LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, ReadConsoleInputW, (HANDLE,PINPUT_RECORD,DWORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, ReadConsoleOutputCharacterW, (HANDLE,LPWSTR,DWORD,COORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, ReadConsoleOutputW, (HANDLE,PCHAR_INFO,COORD,COORD,PSMALL_RECT) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, ReadConsoleW, (HANDLE,PVOID,DWORD,PDWORD,PVOID) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegConnectRegistryW, (LPCWSTR,HKEY,PHKEY) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegCreateKeyExW, (HKEY,LPCWSTR,DWORD,LPWSTR,DWORD,REGSAM,LPSECURITY_ATTRIBUTES,PHKEY,PDWORD) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegCreateKeyW, (HKEY,LPCWSTR,PHKEY) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegDeleteKeyW, (HKEY,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegDeleteValueW, (HKEY,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegEnumKeyExW, (HKEY,DWORD,LPWSTR,PDWORD,PDWORD,LPWSTR,PDWORD,PFILETIME) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegEnumKeyW, (HKEY,DWORD,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegEnumValueW, (HKEY,DWORD,LPWSTR,PDWORD,PDWORD,PDWORD,LPBYTE,PDWORD) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegLoadKeyW, (HKEY,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegOpenKeyExW, (HKEY,LPCWSTR,DWORD,REGSAM,PHKEY) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegOpenKeyW, (HKEY,LPCWSTR,PHKEY) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegQueryInfoKeyW, (HKEY,LPWSTR,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PDWORD,PFILETIME) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegQueryMultipleValuesW, (HKEY,PVALENTW,DWORD,LPWSTR,LPDWORD) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegQueryValueExW, (HKEY,LPCWSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegQueryValueW, (HKEY,LPCWSTR,LPWSTR,PLONG) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegReplaceKeyW, (HKEY,LPCWSTR,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegSaveKeyW, (HKEY,LPCWSTR,LPSECURITY_ATTRIBUTES) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegSetValueExW, (HKEY,LPCWSTR,DWORD,DWORD,const BYTE*,DWORD) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegSetValueW, (HKEY,LPCWSTR,DWORD,LPCWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( advapi32, LONG, WINAPI, RegUnLoadKeyW, (HKEY,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, ATOM, WINAPI, RegisterClassExW, (CONST WNDCLASSEXW*) )
+DEFINE_UNICOWS_THUNK( user32, ATOM, WINAPI, RegisterClassW, (CONST WNDCLASSW*) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, RegisterClipboardFormatW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HDEVNOTIFY, WINAPI, RegisterDeviceNotificationW, (HANDLE,LPVOID,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, UINT, WINAPI, RegisterWindowMessageW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, RemoveDirectoryW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, RemoveFontResourceW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HANDLE, WINAPI, RemovePropA, (HWND,LPCSTR) )
+DEFINE_UNICOWS_THUNK( user32, HANDLE, WINAPI, RemovePropW, (HWND,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( comdlg32, HWND, WINAPI, ReplaceTextW, (LPFINDREPLACEW) )
+DEFINE_UNICOWS_THUNK( gdi32, HDC, WINAPI, ResetDCW, (HDC,const DEVMODEW*) )
+DEFINE_UNICOWS_THUNK( shell32, LPVOID, WINAPI, SHBrowseForFolderW, (LPVOID) )
+DEFINE_UNICOWS_THUNK( shell32, void, WINAPI, SHChangeNotify, (LONG,UINT,PCVOID,PCVOID) )
+DEFINE_UNICOWS_THUNK( shell32, INT, WINAPI, SHCreateDirectoryExW, (HWND,LPCWSTR,LPSECURITY_ATTRIBUTES) )
+DEFINE_UNICOWS_THUNK( shell32, int, WINAPI, SHFileOperationW, (LPSHFILEOPSTRUCTW) )
+DEFINE_UNICOWS_THUNK( shell32, DWORD, WINAPI, SHGetFileInfoW, (LPCWSTR,DWORD,SHFILEINFOW*,UINT,UINT) )
+DEFINE_UNICOWS_THUNK( shell32, BOOL, WINAPI, SHGetNewLinkInfoW, (LPCWSTR,DWORD,SHFILEINFOW*,UINT,UINT) )
+DEFINE_UNICOWS_THUNK( shell32, BOOL, WINAPI, SHGetPathFromIDListW, (LPVOID,LPWSTR) )
+DEFINE_UNICOWS_THUNK( shell32, int, __stdcall, SQLGetPrivateProfileStringW, (LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,int,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( shell32, BOOL, __stdcall, SQLWritePrivateProfileStringW, (LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, ScrollConsoleScreenBufferW, (HANDLE,const SMALL_RECT*,const SMALL_RECT*,COORD,const CHAR_INFO*) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, SearchPathW, (LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, SendDlgItemMessageW, (HWND,int,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, SendMessageCallbackW, (HWND,UINT,WPARAM,LPARAM,SENDASYNCPROC,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, LRESULT, WINAPI, SendMessageTimeoutW, (HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD) )
+DEFINE_UNICOWS_THUNK( user32, LRESULT, WINAPI, SendMessageW, (HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, SendNotifyMessageW, (HWND,UINT,WPARAM,LPARAM) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, SetCalendarInfoW, (LCID,CALID,CALTYPE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, DWORD, WINAPI, SetClassLongW, (HWND,int,LONG) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, SetComputerNameW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, SetConsoleTitleW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, SetCurrentDirectoryW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, SetDefaultCommConfigW, (LPCWSTR,LPCOMMCONFIG,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, SetDlgItemTextW, (HWND,int,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, SetEnvironmentVariableW, (LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, SetFileAttributesW, (LPCWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, SetICMProfileW, (HDC,LPWSTR) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, SetJobW, (HANDLE,DWORD,DWORD,PBYTE,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, SetLocaleInfoW, (LCID,LCTYPE,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, SetMenuItemInfoW, ( HMENU,UINT,BOOL,LPCMENUITEMINFOW) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, SetPrinterDataW, (HANDLE,LPWSTR,DWORD,PBYTE,DWORD) )
+DEFINE_UNICOWS_THUNK( winspool, BOOL, WINAPI, SetPrinterW, (HANDLE,DWORD,PBYTE,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, SetPropA, (HWND,LPCSTR,HANDLE) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, SetPropW, (HWND,LPCWSTR,HANDLE) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, SetVolumeLabelW, (LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, SetWindowLongA, (HWND,int,LONG) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, SetWindowLongW, (HWND,int,LONG) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, SetWindowTextW, (HWND,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( user32, HHOOK, WINAPI, SetWindowsHookExW, (int,HOOKPROC,HINSTANCE,DWORD) )
+DEFINE_UNICOWS_THUNK( user32, HHOOK, WINAPI, SetWindowsHookW, (int,HOOKPROC) )
+DEFINE_UNICOWS_THUNK( shell32, int, WINAPI, ShellAboutW, (HWND,LPCWSTR,LPCWSTR,HICON) )
+DEFINE_UNICOWS_THUNK( shell32, BOOL, WINAPI, ShellExecuteExW, (LPSHELLEXECUTEINFOW) )
+DEFINE_UNICOWS_THUNK( shell32, HINSTANCE, WINAPI, ShellExecuteW, (HWND,LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR,INT) )
+DEFINE_UNICOWS_THUNK( shell32, BOOL, WINAPI, Shell_NotifyIconW, (DWORD,PNOTIFYICONDATAW) )
+DEFINE_UNICOWS_THUNK( winspool, DWORD, WINAPI, StartDocPrinterW, (HANDLE,DWORD,PBYTE) )
+DEFINE_UNICOWS_THUNK( gdi32, int, WINAPI, StartDocW, (HDC,const DOCINFOW*) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, SystemParametersInfoW, (UINT,UINT,PVOID,UINT) )
+DEFINE_UNICOWS_THUNK( user32, LONG, WINAPI, TabbedTextOutW, (HDC,int,int,LPCWSTR,int,int,CONST INT*,int) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, TextOutW, (HDC,int,int,LPCWSTR,int) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, TranslateAcceleratorW, (HWND,HACCEL,LPMSG) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, UnregisterClassW, (LPCWSTR,HINSTANCE) )
+DEFINE_UNICOWS_THUNK( gdi32, BOOL, WINAPI, UpdateICMRegKeyW, (DWORD,LPWSTR,LPWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, UpdateResourceW, (HANDLE,LPCWSTR,LPCWSTR,WORD,PVOID,DWORD) )
+DEFINE_UNICOWS_THUNK( version, DWORD, WINAPI, VerFindFileW, (DWORD,LPWSTR,LPWSTR,LPWSTR,LPWSTR,PUINT,LPWSTR,PUINT) )
+DEFINE_UNICOWS_THUNK( version, DWORD, WINAPI, VerInstallFileW, (DWORD,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,LPWSTR,PUINT) )
+DEFINE_UNICOWS_THUNK( kernel32, DWORD, WINAPI, VerLanguageNameW, (DWORD,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( version, BOOL, WINAPI, VerQueryValueW, (const LPVOID,LPWSTR,LPVOID*,PUINT) )
+DEFINE_UNICOWS_THUNK( user32, SHORT, WINAPI, VkKeyScanExW, (WCHAR,HKL) )
+DEFINE_UNICOWS_THUNK( user32, SHORT, WINAPI, VkKeyScanW, (WCHAR) )
+DEFINE_UNICOWS_THUNK( user32, DWORD, WINAPI, SetupDecompressOrCopyFileW, (PCWSTR,PCWSTR,PUINT) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetAddConnection2W, (LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetAddConnection3W, (HWND,LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetAddConnectionW, (LPCWSTR,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetCancelConnection2W, (LPCWSTR,DWORD,BOOL) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetCancelConnectionW, (LPCWSTR,BOOL) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetConnectionDialog1W, (LPCONNECTDLGSTRUCTW) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetDisconnectDialog1W, (LPDISCDLGSTRUCTW) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetEnumResourceW, (HANDLE,PDWORD,PVOID,PDWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetGetConnectionW, (LPCWSTR,LPWSTR,PDWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetGetLastErrorW, (PDWORD,LPWSTR,DWORD,LPWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetGetNetworkInformationW, (LPCWSTR,LPNETINFOSTRUCT) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetGetProviderNameW, (DWORD,LPWSTR,PDWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetGetResourceInformationW, (LPNETRESOURCEW,LPVOID,LPDWORD,LPWSTR*) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetGetResourceParentW, (LPNETRESOURCEW,LPVOID,LPDWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetGetUniversalNameW, (LPCWSTR,DWORD,PVOID,PDWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetGetUserW, (LPCWSTR,LPWSTR,PDWORD) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetOpenEnumW, (DWORD,DWORD,DWORD,LPNETRESOURCEW,LPHANDLE) )
+DEFINE_UNICOWS_THUNK( mpr, DWORD, APIENTRY, WNetUseConnectionW, (HWND,LPNETRESOURCEW,LPCWSTR,LPCWSTR,DWORD,LPWSTR,PDWORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WaitNamedPipeW, (LPCWSTR,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, WideCharToMultiByte, (UINT,DWORD,LPCWSTR,int,LPSTR,int,LPCSTR,LPBOOL) )
+DEFINE_UNICOWS_THUNK( user32, BOOL, WINAPI, WinHelpW, (HWND,LPCWSTR,UINT,DWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WriteConsoleInputW, (HANDLE,const INPUT_RECORD*,DWORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WriteConsoleOutputCharacterW, (HANDLE,LPCWSTR,DWORD,COORD,PDWORD) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WriteConsoleOutputW, (HANDLE,const CHAR_INFO*,COORD,COORD,PSMALL_RECT) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WriteConsoleW, (HANDLE,PCVOID,DWORD,PDWORD,PVOID) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WritePrivateProfileSectionW, (LPCWSTR,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WritePrivateProfileStringW, (LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WritePrivateProfileStructW, (LPCWSTR,LPCWSTR,LPVOID,UINT,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WriteProfileSectionW, (LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, BOOL, WINAPI, WriteProfileStringW, (LPCWSTR,LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( avicap32, HWND, WINAPI, capCreateCaptureWindowW, (LPCWSTR, DWORD, int, int, int, int, HWND, int) )
+DEFINE_UNICOWS_THUNK( avicap32, BOOL, WINAPI, capGetDriverDescriptionW, (UINT, LPWSTR, int, LPWSTR, int) )
+DEFINE_UNICOWS_THUNK( kernel32, LPWSTR, WINAPI, lstrcatW, (LPWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, lstrcmpW, (LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, lstrcmpiW, ( LPCWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, LPWSTR, WINAPI, lstrcpyW, (LPWSTR,LPCWSTR) )
+DEFINE_UNICOWS_THUNK( kernel32, LPWSTR, WINAPI, lstrcpynW, (LPWSTR,LPCWSTR,int) )
+DEFINE_UNICOWS_THUNK( kernel32, int, WINAPI, lstrlenW, (LPCWSTR) )
+DEFINE_UNICOWS_THUNK( winmm, BOOL, WINAPI, sndPlaySoundW, (LPCWSTR,UINT) )
+DEFINE_UNICOWS_THUNK( winmm, PROC, WINAPI, wglGetProcAddress, (LPCSTR) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPIV, wsprintfW, (LPWSTR,LPCWSTR,...) )
+DEFINE_UNICOWS_THUNK( user32, int, WINAPI, wvsprintfW, (LPWSTR,LPCWSTR,va_list arglist) )
+#endif
diff --git a/sal/systools/win32/uwinapi/SHCreateItemFromParsingName.cpp b/sal/systools/win32/uwinapi/SHCreateItemFromParsingName.cpp
new file mode 100644
index 000000000000..e3be7348eb73
--- /dev/null
+++ b/sal/systools/win32/uwinapi/SHCreateItemFromParsingName.cpp
@@ -0,0 +1,33 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4740)
+#endif
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( shell32, TRYLOAD, HRESULT, WINAPI, SHCreateItemFromParsingName, (PCWSTR pszPath, IBindCtx *pbc, REFIID riid, void **ppv) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/SHILCreateFromPathW.cpp b/sal/systools/win32/uwinapi/SHILCreateFromPathW.cpp
new file mode 100644
index 000000000000..f00eae8025b6
--- /dev/null
+++ b/sal/systools/win32/uwinapi/SHILCreateFromPathW.cpp
@@ -0,0 +1,32 @@
+#include "uwinapi.h"
+
+EXTERN_C LPITEMIDLIST WINAPI SHSimpleIDListFromPathW_Failure( LPCWSTR lpPathW )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return NULL;
+}
+
+EXTERN_C LPITEMIDLIST WINAPI SHSimpleIDListFromPathW_WINDOWS( LPCWSTR lpPathW )
+{
+ AUTO_WSTR2STR( lpPath );
+
+ return SHSimpleIDListFromPathA( lpPathA );
+}
+
+
+EXTERN_C void WINAPI ResolveThunk_SHSimpleIDListFromPathW( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName )
+{
+ if ( (LONG)GetVersion < 0 )
+ *lppfn = (FARPROC)SHSimpleIDListFromPathW_WINDOWS;
+ else
+ {
+ FARPROC lpfnResult = GetProcAddress( LoadLibraryA( lpLibFileName ), MAKEINTRESOURCE(162) );
+ if ( !lpfnResult )
+ lpfnResult = (FARPROC)SHSimpleIDListFromPathW_Failure;
+
+ *lppfn = lpfnResult;
+ }
+}
+
+
+DEFINE_CUSTOM_THUNK( kernel32, GetLongPathNameW, DWORD, WINAPI, GetLongPathNameW, ( LPCWSTR lpShortPathW, LPWSTR lpLongPathW, DWORD cchBuffer ) );
diff --git a/sal/systools/win32/uwinapi/SetVolumeMountPointA.cpp b/sal/systools/win32/uwinapi/SetVolumeMountPointA.cpp
new file mode 100644
index 000000000000..597bdd6ca3bd
--- /dev/null
+++ b/sal/systools/win32/uwinapi/SetVolumeMountPointA.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, SetVolumeMountPointA, (LPCSTR lpszVolumeMountPoint, LPCSTR lpszVolumeName) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/SetVolumeMountPointW.cpp b/sal/systools/win32/uwinapi/SetVolumeMountPointW.cpp
new file mode 100644
index 000000000000..e438b742ee91
--- /dev/null
+++ b/sal/systools/win32/uwinapi/SetVolumeMountPointW.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "macros.h"
+
+DEFINE_DEFAULT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, SetVolumeMountPointW, (LPCWSTR lpszVolumeMountPoint, LPCWSTR lpszVolumeName) ) \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/Uwinapi.def b/sal/systools/win32/uwinapi/Uwinapi.def
new file mode 100644
index 000000000000..58893d5a54ad
--- /dev/null
+++ b/sal/systools/win32/uwinapi/Uwinapi.def
@@ -0,0 +1,22 @@
+EXPORTS
+ CommandLineToArgvW
+ CopyFileW
+ CopyFileExW
+ CopyFileExA
+ DeleteFileW
+ DrawStateW
+ GetLogicalDriveStringsW
+ GetLongPathNameA
+ GetLongPathNameW
+ LoadLibraryExW
+ LoadLibraryW
+ MoveFileExA
+ MoveFileExW
+ MoveFileW
+ GetVersion
+ DllGetVersion
+ lstrrchrA
+ lstrrchrW
+ lstrchrA
+ lstrchrW
+
diff --git a/sal/systools/win32/uwinapi/Uwinapi.h b/sal/systools/win32/uwinapi/Uwinapi.h
new file mode 100644
index 000000000000..45a8645f43e4
--- /dev/null
+++ b/sal/systools/win32/uwinapi/Uwinapi.h
@@ -0,0 +1,137 @@
+#pragma once
+
+#ifdef _UWINAPI_
+#define _KERNEL32_
+#define _USER32_
+#define _SHELL32_
+#endif
+
+#include <windows.h>
+#include <malloc.h>
+
+#ifndef _UWINAPI_
+EXTERN_C WINBASEAPI DWORD UWINAPI_dwFakedVersion;
+#endif
+
+EXTERN_C WINBASEAPI DWORD SetVersion( DWORD dwVersion );
+
+/* Version macros */
+
+#define MAKE_VER_WIN32( major, minor, build, isWindows ) \
+((DWORD)MAKELONG( MAKEWORD( major, minor ), (build) | ( isWindows ? 0x8000 : 0 ) ))
+
+#define MAKE_VER_WIN32_NT( major, minor, build ) \
+ MAKE_VER_WIN32( major, minor, build, FALSE )
+
+#define MAKE_VER_WIN32_WINDOWS( major, minor, build ) \
+ MAKE_VER_WIN32( major, minor, build, TRUE )
+
+#define VER_WIN32_WINDOWS_95 MAKE_VER_WIN32_WINDOWS( 4, 0, 0 )
+#define VER_WIN32_WINDOWS_98 MAKE_VER_WIN32_WINDOWS( 4, 10, 0 )
+#define VER_WIN32_WINDOWS_ME MAKE_VER_WIN32_WINDOWS( 4, 90, 0 )
+#define VER_WIN32_NT_NT4 MAKE_VER_WIN32_NT( 4, 0, 0 )
+#define VER_WIN32_NT_2000 MAKE_VER_WIN32_NT( 5, 0, 0 )
+#define VER_WIN32_NT_XP MAKE_VER_WIN32_NT( 5, 1, 0 )
+
+
+EXTERN_C WINBASEAPI LPSTR WINAPI lstrchrA( LPCSTR lpString, CHAR c );
+EXTERN_C WINBASEAPI LPWSTR WINAPI lstrchrW( LPCWSTR lpString, WCHAR c );
+EXTERN_C WINBASEAPI LPSTR WINAPI lstrrchrA( LPCSTR lpString, CHAR c );
+EXTERN_C WINBASEAPI LPWSTR WINAPI lstrrchrW( LPCWSTR lpString, WCHAR c );
+
+#ifdef UNICODE
+#define lstrrchr lstrrchrW
+#define lstrchr lstrchrW
+#else
+#define lstrrchr lstrrchrA
+#define lstrchr lstrchrA
+#endif
+
+// macro that calculates the count of elements of a static array
+
+#define bufsizeof(buf) (sizeof(buf) / sizeof((buf)[0]))
+
+
+#define IsValidHandle(Handle) ((DWORD)(Handle) + 1 > 1)
+
+#ifdef __cplusplus
+
+#define _AUTO_WSTR2STR( lpStrA, lpStrW ) \
+LPSTR lpStrA; \
+if ( lpStrW ) \
+{ \
+ int cNeeded = WideCharToMultiByte( CP_ACP, 0, lpStrW, -1, NULL, 0, NULL, NULL ); \
+ lpStrA = (LPSTR)_alloca( cNeeded * sizeof(CHAR) ); \
+ WideCharToMultiByte( CP_ACP, 0, lpStrW, -1, lpStrA, cNeeded, NULL, NULL ); \
+} \
+else \
+ lpStrA = NULL;
+
+
+#define AUTO_WSTR2STR( lpStr ) \
+ _AUTO_WSTR2STR( lpStr##A, lpStr##W )
+
+#define AUTO_STR( lpStr, cchBuffer ) \
+LPSTR lpStr##A = lpStr##W ? (LPSTR)_alloca( (cchBuffer) * sizeof(CHAR) ) : NULL;
+
+#endif // __cplusplus
+
+#define STRBUF2WSTR( lpStr, cchSrcBuffer, cchDestBuffer ) \
+ MultiByteToWideChar( CP_ACP, 0, lpStr##A, cchSrcBuffer, lpStr##W, cchDestBuffer )
+
+#define STR2WSTR( lpStr, cchBuffer ) \
+ STRBUF2WSTR( lpStr, -1, cchBuffer )
+
+#define WSTR2STR( lpStr, cchBuffer ) \
+ WideCharToMultiByte( CP_ACP, 0, lpStr##W, -1, lpStr##A, cchBuffer, NULL, NULL )
+
+EXTERN_C void WINAPI ResolveThunk_WINDOWS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
+EXTERN_C void WINAPI ResolveThunk_TRYLOAD( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
+EXTERN_C void WINAPI ResolveThunk_ALLWAYS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
+
+
+
+
+#define IMPLEMENT_THUNK( module, resolve, rettype, calltype, func, params ) \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \
+EXTERN_C rettype calltype func##_##resolve params; \
+static rettype calltype func##_##Failure params; \
+static _declspec ( naked ) func##_Thunk() \
+{ \
+ ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, (FARPROC)func##_##resolve, (FARPROC)func##_##Failure ); \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( naked ) rettype calltype func params \
+{ \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \
+static rettype calltype func##_##Failure params \
+{ \
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \
+ return (rettype)0; \
+} \
+EXTERN_C rettype calltype func##_##resolve params
+
+
+
+
+
+
+
+
+
+
+
+#define DEFINE_CUSTOM_THUNK( module, resolve, rettype, calltype, func, params ) \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \
+static _declspec ( naked ) func##_Thunk() \
+{ \
+ ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func ); \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( naked ) rettype calltype func params \
+{ \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/macros.h b/sal/systools/win32/uwinapi/macros.h
new file mode 100644
index 000000000000..b75926be9d0f
--- /dev/null
+++ b/sal/systools/win32/uwinapi/macros.h
@@ -0,0 +1,232 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#define _UWINAPI_
+#include <systools/win32/uwinapi.h>
+
+#ifndef _INC_MALLOC
+# include <malloc.h>
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4740)
+#endif
+
+#ifndef _INC_TCHAR
+# ifdef UNICODE
+# define _UNICODE
+# endif
+# include <TCHAR.H>
+#endif
+
+// Globally disable "warning C4100: unreferenced formal parameter" caused by
+// IMPLEMENT_THUNK:
+#ifdef _MSC_VER
+#pragma warning(disable:4100)
+#endif
+
+/* Version macros */
+
+#define MAKE_VER_WIN32( major, minor, build, isWindows ) \
+((DWORD)MAKELONG( MAKEWORD( major, minor ), (build) | ( isWindows ? 0x8000 : 0 ) ))
+
+#define MAKE_VER_WIN32_NT( major, minor, build ) \
+ MAKE_VER_WIN32( major, minor, build, FALSE )
+
+#define MAKE_VER_WIN32_WINDOWS( major, minor, build ) \
+ MAKE_VER_WIN32( major, minor, build, TRUE )
+
+#define VER_WIN32_WINDOWS_95 MAKE_VER_WIN32_WINDOWS( 4, 0, 0 )
+#define VER_WIN32_WINDOWS_98 MAKE_VER_WIN32_WINDOWS( 4, 10, 0 )
+#define VER_WIN32_WINDOWS_ME MAKE_VER_WIN32_WINDOWS( 4, 90, 0 )
+#define VER_WIN32_NT_NT4 MAKE_VER_WIN32_NT( 4, 0, 0 )
+#define VER_WIN32_NT_2000 MAKE_VER_WIN32_NT( 5, 0, 0 )
+#define VER_WIN32_NT_XP MAKE_VER_WIN32_NT( 5, 1, 0 )
+
+
+#ifdef __cplusplus
+
+#define _AUTO_WSTR2STR( lpStrA, lpStrW ) \
+LPSTR lpStrA; \
+if ( lpStrW ) \
+{ \
+ int cNeeded = WideCharToMultiByte( CP_ACP, 0, lpStrW, -1, NULL, 0, NULL, NULL ); \
+ lpStrA = (LPSTR)_alloca( cNeeded * sizeof(CHAR) ); \
+ WideCharToMultiByte( CP_ACP, 0, lpStrW, -1, lpStrA, cNeeded, NULL, NULL ); \
+} \
+else \
+ lpStrA = NULL;
+
+
+#define AUTO_WSTR2STR( lpStr ) \
+ _AUTO_WSTR2STR( lpStr##A, lpStr##W )
+
+#define AUTO_STR( lpStr, cchBuffer ) \
+LPSTR lpStr##A = lpStr##W ? (LPSTR)_alloca( (cchBuffer) * sizeof(CHAR) ) : NULL;
+
+#endif /* __cplusplus */
+
+
+#define STRBUF2WSTR( lpStr, cchSrcBuffer, cchDestBuffer ) \
+ MultiByteToWideChar( CP_ACP, 0, lpStr##A, cchSrcBuffer, lpStr##W, (int) cchDestBuffer )
+
+#define STR2WSTR( lpStr, cchBuffer ) \
+ STRBUF2WSTR( lpStr, -1, cchBuffer )
+
+#define WSTR2STR( lpStr, cchBuffer ) \
+ WideCharToMultiByte( CP_ACP, 0, lpStr##W, -1, lpStr##A, cchBuffer, NULL, NULL )
+
+EXTERN_C void WINAPI ResolveThunk_WINDOWS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
+EXTERN_C void WINAPI ResolveThunk_TRYLOAD( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
+EXTERN_C void WINAPI ResolveThunk_ALLWAYS( FARPROC *lppfn, LPCSTR lpLibFileName, LPCSTR lpFuncName, FARPROC lpfnEmulate, FARPROC lpfnFailure );
+
+
+
+
+#ifdef __MINGW32__
+#define IMPLEMENT_THUNK( module, resolve, rettype, calltype, func, params ) \
+static void func##_Thunk(); \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \
+EXTERN_C rettype calltype func params \
+{ \
+ asm(" popl %ebp"); \
+ asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \
+} \
+EXTERN_C rettype calltype func##_##resolve params; \
+static rettype calltype func##_##Failure params; \
+static void func##_Thunk() \
+{ \
+ ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, (FARPROC)func##_##resolve, (FARPROC)func##_##Failure ); \
+ asm(" movl %ebp, %esp"); \
+ asm(" popl %ebp"); \
+ asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \
+} \
+static rettype calltype func##_##Failure params \
+{ \
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \
+ return (rettype)0; \
+} \
+EXTERN_C rettype calltype func##_##resolve params
+#else
+#define IMPLEMENT_THUNK( module, resolve, rettype, calltype, func, params ) \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \
+EXTERN_C rettype calltype func##_##resolve params; \
+static rettype calltype func##_##Failure params; \
+static _declspec ( naked ) void func##_Thunk() \
+{ \
+ ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, (FARPROC)func##_##resolve, (FARPROC)func##_##Failure ); \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( naked ) rettype calltype func params \
+{ \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \
+static rettype calltype func##_##Failure params \
+{ \
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \
+ return (rettype)0; \
+} \
+EXTERN_C rettype calltype func##_##resolve params
+#endif
+
+
+
+#ifdef __MINGW32__
+#define DEFINE_CUSTOM_THUNK( module, resolve, rettype, calltype, func, params ) \
+static void func##_Thunk(); \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \
+static void func##_Thunk() \
+{ \
+ ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func ); \
+ asm(" movl %ebp, %esp"); \
+ asm(" popl %ebp"); \
+ asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \
+} \
+EXTERN_C rettype calltype func params \
+{ \
+ asm(" popl %ebp"); \
+ asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \
+}
+#else
+#define DEFINE_CUSTOM_THUNK( module, resolve, rettype, calltype, func, params ) \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \
+static _declspec ( naked ) void func##_Thunk() \
+{ \
+ ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func ); \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( naked ) rettype calltype func params \
+{ \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk;
+#endif
+
+
+#ifdef __MINGW32__
+#define DEFINE_DEFAULT_THUNK( module, resolve, rettype, calltype, func, params ) \
+static void func##_Thunk(); \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \
+static rettype calltype func##_##Failure params; \
+static _declspec ( naked ) void func##_Thunk() \
+{ \
+ ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, NULL, (FARPROC)func##_##Failure ); \
+ asm(" movl %ebp, %esp"); \
+ asm(" popl %ebp"); \
+ asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \
+} \
+EXTERN_C _declspec( naked ) rettype calltype func params \
+{ \
+ asm(" popl %ebp"); \
+ asm(" jmp *(%0)"::"m"(module##_##func##_Ptr)); \
+} \
+static rettype calltype func##_##Failure params \
+{ \
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \
+ return (rettype)0; \
+}
+#else
+#define DEFINE_DEFAULT_THUNK( module, resolve, rettype, calltype, func, params ) \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr; \
+static rettype calltype func##_##Failure params; \
+static _declspec ( naked ) void func##_Thunk() \
+{ \
+ ResolveThunk_##resolve( &module##_##func##_Ptr, #module ".dll", #func, NULL, (FARPROC)func##_##Failure ); \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( naked ) rettype calltype func params \
+{ \
+ _asm jmp [module##_##func##_Ptr] \
+} \
+EXTERN_C _declspec( dllexport ) FARPROC module##_##func##_Ptr = (FARPROC)func##_Thunk; \
+static rettype calltype func##_##Failure params \
+{ \
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); \
+ return (rettype)0; \
+}
+#endif
diff --git a/sal/systools/win32/uwinapi/makefile.mk b/sal/systools/win32/uwinapi/makefile.mk
new file mode 100644
index 000000000000..4893bfefae07
--- /dev/null
+++ b/sal/systools/win32/uwinapi/makefile.mk
@@ -0,0 +1,167 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+PRJNAME=sal
+TARGET=uwinapi
+
+USE_DEFFILE=TRUE
+LIBTARGET=NO
+
+# --- Settings ----------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Targets ----------------------------------
+
+
+.IF "$(GUI)"=="WNT"
+.IF "$(COM)"=="GCC"
+CFLAGSCXX+=-Wno-unused-parameter -Wno-return-type
+.ENDIF
+
+.IF "$(COMEX)"=="9"
+.IF "$(PSDK_HOME)"!=""
+# Since the 02/2003 PSDK the "new" linker is needed here.
+LINK=$(WRAPCMD) "$(PSDK_HOME)$/Bin$/Win64$/LINK.EXE"
+.ENDIF
+.ENDIF
+
+SLOFILES=\
+ $(SLO)$/CheckTokenMembership.obj\
+ $(SLO)$/CommandLineToArgvW.obj\
+ $(SLO)$/CopyFileExA.obj\
+ $(SLO)$/CopyFileExW.obj\
+ $(SLO)$/DrawStateW.obj\
+ $(SLO)$/EnumProcesses.obj\
+ $(SLO)$/GetLogicalDriveStringsW.obj\
+ $(SLO)$/GetLongPathNameA.obj\
+ $(SLO)$/GetLongPathNameW.obj\
+ $(SLO)$/GetModuleFileNameExA.obj\
+ $(SLO)$/GetModuleFileNameExW.obj\
+ $(SLO)$/GetProcessId.obj\
+ $(SLO)$/GetUserDefaultUILanguage.obj\
+ $(SLO)$/GetUserDomainA.obj\
+ $(SLO)$/GetUserDomainW.obj\
+ $(SLO)$/GetDiskFreeSpaceExA.obj\
+ $(SLO)$/GetDiskFreeSpaceExW.obj\
+ $(SLO)$/MoveFileExA.obj\
+ $(SLO)$/MoveFileExW.obj\
+ $(SLO)$/toolhelp.obj\
+ $(SLO)$/DllGetVersion.obj\
+ $(SLO)$/DllMain.obj\
+ $(SLO)$/ResolveThunk.obj\
+ $(SLO)$/ResolveUnicows.obj\
+ $(SLO)$/snprintf.obj\
+ $(SLO)$/snwprintf.obj\
+ $(SLO)$/FindFirstVolumeA.obj\
+ $(SLO)$/FindFirstVolumeW.obj\
+ $(SLO)$/FindNextVolumeA.obj\
+ $(SLO)$/FindNextVolumeW.obj\
+ $(SLO)$/FindVolumeClose.obj\
+ $(SLO)$/FindFirstVolumeMountPointA.obj\
+ $(SLO)$/FindFirstVolumeMountPointW.obj\
+ $(SLO)$/FindNextVolumeMountPointA.obj\
+ $(SLO)$/FindNextVolumeMountPointW.obj\
+ $(SLO)$/FindVolumeMountPointClose.obj\
+ $(SLO)$/GetVolumeNameForVolumeMountPointA.obj\
+ $(SLO)$/GetVolumeNameForVolumeMountPointW.obj\
+ $(SLO)$/DeleteVolumeMountPointA.obj\
+ $(SLO)$/DeleteVolumeMountPointW.obj\
+ $(SLO)$/GetVolumePathNameA.obj\
+ $(SLO)$/GetVolumePathNameW.obj\
+ $(SLO)$/SetVolumeMountPointA.obj\
+ $(SLO)$/SetVolumeMountPointW.obj\
+ $(SLO)$/PathAddBackslashW.obj\
+ $(SLO)$/PathCompactPathExW.obj\
+ $(SLO)$/PathFileExistsW.obj\
+ $(SLO)$/PathFindExtensionW.obj\
+ $(SLO)$/PathFindFileNameW.obj\
+ $(SLO)$/PathIsFileSpecW.obj\
+ $(SLO)$/PathIsUNCW.obj\
+ $(SLO)$/PathRemoveExtensionW.obj\
+ $(SLO)$/PathRemoveFileSpecW.obj\
+ $(SLO)$/PathSetDlgItemPathW.obj\
+ $(SLO)$/PathStripToRootW.obj\
+ $(SLO)$/SHCreateItemFromParsingName.obj
+
+SHL1TARGET=$(TARGET)
+SHL1IMPLIB=$(SHL1TARGET)
+SHL1DEF=$(MISC)/$(SHL1TARGET).def
+DEF1NAME=$(SHL1TARGET)
+.IF "$(COM)"=="GCC"
+DEF1EXPORTFILE=\
+ $(SHL1TARGET)_mingw.dxp\
+ unicows_mingw.dxp
+.ELSE
+DEF1EXPORTFILE=\
+ $(SHL1TARGET).dxp\
+ unicows.dxp
+.ENDIF
+DEF1DEPN=\
+ $(DEF1EXPORTFILE)\
+ makefile.mk
+
+#SHL1VERINFO=$(SHL1TARGET).rc
+SHL1OBJS=$(SLOFILES)
+
+#No default libraries
+STDSHL=
+
+.IF "$(COM)"=="GCC"
+SHL1STDLIBS=\
+ -lmingw32 \
+ $(MINGW_LIBGCC)
+MINGWSSTDOBJ=
+MINGWSSTDENDOBJ=
+.ELSE
+SHL1STDLIBS=\
+ unicows.lib
+.ENDIF
+
+SHL1STDLIBS+=\
+ $(KERNEL32LIB)\
+ $(USER32LIB)\
+ $(ADVAPI32LIB)\
+ $(VERSIONLIB)\
+ $(LIBCMT)\
+ $(SHLWAPILIB)
+
+
+.ENDIF
+
+.IF "$(COM)"=="GCC"
+ALL: ALLTAR $(LB)$/libuwinapi.a
+
+$(LB)$/libuwinapi.a: $(MISC)$/uwinapi.def
+ dlltool --dllname uwinapi.dll --input-def=$(MISC)$/uwinapi.def --kill-at --output-lib=$(LB)$/libuwinapi.a
+.ENDIF
+
+.INCLUDE : target.mk
diff --git a/sal/systools/win32/uwinapi/snprintf.c b/sal/systools/win32/uwinapi/snprintf.c
new file mode 100644
index 000000000000..694eef21fbf9
--- /dev/null
+++ b/sal/systools/win32/uwinapi/snprintf.c
@@ -0,0 +1,10 @@
+/* Not unicode */
+#undef _UNICODE
+
+/* Support MBCS and SBCS */
+
+#ifndef _MBCS
+#define _MBCS
+#endif
+
+#include "sntprintf.c"
diff --git a/sal/systools/win32/uwinapi/sntprintf.c b/sal/systools/win32/uwinapi/sntprintf.c
new file mode 100644
index 000000000000..69d47821311c
--- /dev/null
+++ b/sal/systools/win32/uwinapi/sntprintf.c
@@ -0,0 +1,118 @@
+#define _SNPRINTF_DLLIMPORT __declspec( dllexport )
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include <tchar.h>
+#include <systools/win32/snprintf.h>
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+#pragma warning(disable:4273) // inconsistent dll linkage
+#endif
+
+#if (defined(_MSC_VER) && (_MSC_VER < 1300)) || (defined(__MINGW32_VERSION) && ((__MINGW32_MAJOR_VERSION < 3)||((__MINGW32_MAJOR_VERSION == 3)&&(__MINGW32_MINOR_VERSION < 18))))
+
+/* The non-debug versions of _vscprintf/_scprintf are just calls
+ to _vsprintf/_sprintf with string buffer pointer set to NULL,
+ requires MSVCRT version 7.0 */
+#ifdef __MINGW32__
+static int __cdecl _vsctprintf( const TCHAR *format, va_list ap )
+#else
+static int __cdecl _vsctprintf( const _TXCHAR *format, va_list ap )
+#endif
+{
+ FILE *fp = _tfopen( _T("NUL"), _T("wb") );
+
+ if ( fp )
+ {
+ int retval = _vftprintf( fp, format, ap );
+ fclose( fp );
+
+ return retval;
+ }
+
+ return -1;
+}
+#endif
+
+/* This function retrieves the pointer to the last character of a buffer.
+ That is the pointer to the last character of the buffer that fits
+ completly into that buffer or the position of the terminating zero.
+
+ buffer Pointer to a _TXCHAR buffer to be examined
+ count size of the buffer to be examined
+
+ return The pointer to the last character that fits into the buffer or
+ NULL if count is zero or count is one and the first byte was a
+ leading DBCS character
+*/
+
+static _TCHAR *GetLastBufferChar( _TCHAR *buffer, size_t count )
+{
+ _TCHAR *last = NULL;
+ _TCHAR *cur = buffer;
+
+ while ( (size_t)(cur - buffer) < count )
+ {
+ last = cur;
+
+ if ( !*last )
+ break;
+
+ cur = _tcsinc(last);
+ }
+
+ return last;
+}
+
+/* Implementation of snprintf following the ISO/IEC 9899:1999 (ISO C99) standard */
+
+_SNPRINTF_DLLIMPORT int __cdecl vsntprintf( _TCHAR *buffer, size_t count, const _TCHAR *format, va_list list )
+{
+ int retval;
+
+ /* First of all call the existing non POSIX standard function assuming
+ the buffer size will be large enough */
+
+ retval = _vsntprintf( buffer, count, format, list );
+
+ if ( retval < 0 )
+ {
+ /* If the buffer wasn't large enough ensure that the buffer will be
+ zero terminated */
+
+ _TCHAR *last = GetLastBufferChar( buffer, count );
+ if (last )
+ *last = 0;
+
+ /* Retrieve the count of characters that would have been written
+ if the buffer were large enough */
+
+ retval = _vsctprintf( format, list );
+ }
+ else if ( (size_t)retval == count && count )
+ {
+ /* If the buffer was large enough but not large enough for the trailing
+ zero make the buffer zero terminated */
+
+ _TCHAR *last = GetLastBufferChar( buffer, count );
+ if (last )
+ *last = 0;
+ }
+
+ return retval;
+}
+
+/* Implementation of snprintf following the ISO/IEC 9899:1999 (ISO C99) standard */
+
+_SNPRINTF_DLLIMPORT int __cdecl sntprintf( _TCHAR *buffer, size_t count, const _TCHAR *format, ... )
+{
+ va_list list;
+ int retval;
+
+ va_start( list, format );
+ retval = vsntprintf( buffer, count, format, list );
+ va_end( list );
+
+ return retval;
+}
diff --git a/sal/systools/win32/uwinapi/snwprintf.c b/sal/systools/win32/uwinapi/snwprintf.c
new file mode 100644
index 000000000000..80a5760c86f1
--- /dev/null
+++ b/sal/systools/win32/uwinapi/snwprintf.c
@@ -0,0 +1,5 @@
+#ifndef _UNICODE
+#define _UNICODE
+#endif
+
+#include "sntprintf.c"
diff --git a/sal/systools/win32/uwinapi/toolhelp.cpp b/sal/systools/win32/uwinapi/toolhelp.cpp
new file mode 100644
index 000000000000..7b651581bae7
--- /dev/null
+++ b/sal/systools/win32/uwinapi/toolhelp.cpp
@@ -0,0 +1,57 @@
+#include "macros.h"
+#include <tlhelp32.h>
+
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, Module32First, (HANDLE hSnapshot, LPMODULEENTRY32 lpme ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+}
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, Module32FirstW, (HANDLE hSnapshot, LPMODULEENTRY32W lpme ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+}
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, Module32Next, (HANDLE hSnapshot, LPMODULEENTRY32 lpme ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+}
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, Module32NextW, (HANDLE hSnapshot, LPMODULEENTRY32W lpme ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+}
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, Process32First, (HANDLE hSnapshot, LPPROCESSENTRY32 lppe ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+}
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, Process32FirstW, (HANDLE hSnapshot, LPPROCESSENTRY32W lppe ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+}
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, Process32Next, (HANDLE hSnapshot, LPPROCESSENTRY32 lppe ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+}
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, BOOL, WINAPI, Process32NextW, (HANDLE hSnapshot, LPPROCESSENTRY32W lppe ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return FALSE;
+}
+
+IMPLEMENT_THUNK( kernel32, TRYLOAD, HANDLE, WINAPI, CreateToolhelp32Snapshot, (DWORD dwFlags, DWORD th32ProcessID ) )
+{
+ SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+ return NULL;
+}
diff --git a/sal/systools/win32/uwinapi/unicows.dxp b/sal/systools/win32/uwinapi/unicows.dxp
new file mode 100644
index 000000000000..771782a76b7b
--- /dev/null
+++ b/sal/systools/win32/uwinapi/unicows.dxp
@@ -0,0 +1,546 @@
+;*************************************************************************
+;
+; DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+;
+; Copyright 2000, 2010 Oracle and/or its affiliates.
+;
+; OpenOffice.org - a multi-platform office productivity suite
+;
+; This file is part of OpenOffice.org.
+;
+; OpenOffice.org is free software: you can redistribute it and/or modify
+; it under the terms of the GNU Lesser General Public License version 3
+; only, as published by the Free Software Foundation.
+;
+; OpenOffice.org is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU Lesser General Public License version 3 for more details
+; (a copy is included in the LICENSE file that accompanied this code).
+;
+; You should have received a copy of the GNU Lesser General Public License
+; version 3 along with OpenOffice.org. If not, see
+; <http://www.openoffice.org/license.html>
+; for a copy of the LGPLv3 License.
+;
+;*************************************************************************
+;
+; Functions that are exported but not implemented by unicows.dll
+; are only inserted as comment.
+;
+; In addition to MSDN Platform SDK documentation the following functions
+; are not implemented too:
+; AddMonitorW, FreeContextBufferW, GetPrinterDriverDirectoryW,
+; MCIWndCreateW
+;
+; The following functions of unicows.dll are buggy:
+; DrawStateW, GetLogicalDriveStringsW (both implemented in uwinapi.dll)
+;
+; The following functions of unicows.dll are wrapped but the ANSI versions
+; do not exist on Win9x so the wrapper is useless:
+; MoveFileExW, CopyFileExW (both implemented in uwinapi.dll along with the
+; ANSI versions )
+;
+; These functions do not exist on Win 95 and NT neither as Unicode
+; nor as ANSI version, so the wrapper will fail on NT4 and Win 95
+; GetLongPathNameW ( implemented in uwinapi.dll along with the
+; ANSI version )
+;
+; These essential functions aren't implemented by unicows.dll because
+; there's no ANSI version:
+; CommandLineToArgvW (implemented by uwinapi.dll)
+;
+;*************************************************************************
+
+;AcquireCredentialsHandleW
+AddAtomW
+AddFontResourceW
+AddJobW
+;AddMonitorW
+AddPortW
+AddPrintProcessorW
+AddPrintProvidorW
+AddPrinterDriverW
+AddPrinterW
+AdvancedDocumentPropertiesW
+AppendMenuW
+BeginUpdateResourceW
+BroadcastSystemMessageW
+BuildCommDCBAndTimeoutsW
+BuildCommDCBW
+CallMsgFilterW
+CallNamedPipeW
+CallWindowProcA
+CallWindowProcW
+ChangeDisplaySettingsExW
+ChangeDisplaySettingsW
+ChangeMenuW
+CharLowerBuffW
+CharLowerW
+CharNextW
+CharPrevW
+CharToOemBuffW
+CharToOemW
+CharUpperBuffW
+CharUpperW
+ChooseColorW
+ChooseFontW
+CommConfigDialogW
+CompareStringW
+ConfigurePortW
+CopyAcceleratorTableW
+CopyEnhMetaFileW
+CopyFileExW
+CopyFileW
+CopyMetaFileW
+CreateAcceleratorTableW
+CreateColorSpaceW
+CreateDCW
+CreateDialogIndirectParamW
+CreateDialogParamW
+CreateDirectoryExW
+CreateDirectoryW
+CreateEnhMetaFileW
+CreateEventW
+CreateFileMappingW
+CreateFileW
+CreateFontIndirectW
+CreateFontW
+CreateICW
+CreateMDIWindowW
+CreateMailslotW
+CreateMetaFileW
+CreateMutexW
+;CreateNamedPipeW
+CreateProcessW
+CreateScalableFontResourceW
+CreateSemaphoreW
+CreateStdAccessibleProxyW
+CreateWaitableTimerW
+CreateWindowExW
+DdeConnect
+DdeConnectList
+DdeCreateStringHandleW
+DdeInitializeW
+DdeQueryConvInfo
+DdeQueryStringW
+DefDlgProcW
+DefFrameProcW
+DefMDIChildProcW
+DefWindowProcW
+DeleteFileW
+DeleteMonitorW
+DeletePortW
+DeletePrintProcessorW
+DeletePrintProvidorW
+DeletePrinterDriverW
+;DeviceCapabilitiesW
+DialogBoxIndirectParamW
+DialogBoxParamW
+DispatchMessageW
+DlgDirListComboBoxW
+DlgDirListW
+DlgDirSelectComboBoxExW
+DlgDirSelectExW
+;DocumentPropertiesW
+DragQueryFileW
+DrawStateW
+DrawTextExW
+DrawTextW
+EnableWindow
+EndUpdateResourceW
+EnumCalendarInfoExW
+EnumCalendarInfoW
+EnumClipboardFormats
+EnumDateFormatsExW
+EnumDateFormatsW
+EnumDisplayDevicesW
+EnumDisplaySettingsExW
+EnumDisplaySettingsW
+EnumFontFamiliesExW
+EnumFontFamiliesW
+EnumFontsW
+EnumICMProfilesW
+;EnumMonitorsW
+;EnumPortsW
+;EnumPrintProcessorDatatypesW
+;EnumPrintProcessorsW
+;EnumPrinterDriversW
+;EnumPrintersW
+EnumPropsA
+EnumPropsExA
+EnumPropsExW
+EnumPropsW
+EnumSystemCodePagesW
+EnumSystemLocalesW
+EnumTimeFormatsW
+;EnumerateSecurityPackagesW
+ExpandEnvironmentStringsW
+ExtTextOutW
+ExtractIconExW
+ExtractIconW
+FatalAppExitW
+FillConsoleOutputCharacterW
+FindAtomW
+;FindExecutableW
+FindFirstChangeNotificationW
+FindFirstFileW
+FindNextFileW
+FindResourceExW
+FindResourceW
+FindTextW
+FindWindowExW
+FindWindowW
+FormatMessageW
+;FreeContextBufferW
+FreeEnvironmentStringsW
+GetAltTabInfoW
+GetAtomNameW
+GetCPInfo
+GetCPInfoExW
+GetCalendarInfoW
+;GetCharABCWidthsFloatW
+GetCharABCWidthsW
+GetCharWidthFloatW
+GetCharWidthW
+GetCharacterPlacementW
+GetClassInfoExW
+GetClassInfoW
+GetClassLongW
+GetClassNameW
+GetClipboardData
+GetClipboardFormatNameW
+GetComputerNameW
+GetConsoleTitleW
+GetCurrencyFormatW
+GetCurrentDirectoryW
+GetCurrentHwProfileW
+GetDateFormatW
+GetDefaultCommConfigW
+GetDiskFreeSpaceExW
+GetDiskFreeSpaceW
+GetDlgItemTextW
+GetDriveTypeW
+GetEnhMetaFileDescriptionW
+GetEnhMetaFileW
+GetEnvironmentStringsW
+GetEnvironmentVariableW
+GetFileAttributesExW
+GetFileAttributesW
+GetFileTitleW
+GetFileVersionInfoSizeW
+GetFileVersionInfoW
+GetFullPathNameW
+GetGlyphOutlineW
+GetICMProfileW
+;GetJobW
+GetKerningPairsW
+GetKeyNameTextW
+GetKeyboardLayoutNameW
+GetLocaleInfoW
+GetLogColorSpaceW
+GetLogicalDriveStringsW
+GetLongPathNameW
+GetMenuItemInfoW
+GetMenuStringW
+GetMessageW
+GetMetaFileW
+GetModuleFileNameW
+GetModuleHandleW
+GetMonitorInfoW
+GetNamedPipeHandleStateW
+GetNumberFormatW
+GetObjectW
+GetOpenFileNamePreviewW
+GetOpenFileNameW
+GetOutlineTextMetricsW
+GetPrintProcessorDirectoryW
+;GetPrinterDataW
+;GetPrinterDriverDirectoryW
+;GetPrinterDriverW
+;GetPrinterW
+GetPrivateProfileIntW
+GetPrivateProfileSectionNamesW
+GetPrivateProfileSectionW
+GetPrivateProfileStringW
+GetPrivateProfileStructW
+;GetProcAddress
+GetProfileIntW
+GetProfileSectionW
+GetProfileStringW
+GetPropA
+GetPropW
+GetRoleTextW
+GetSaveFileNamePreviewW
+GetSaveFileNameW
+GetShortPathNameW
+GetStartupInfoW
+GetStateTextW
+GetStringTypeExW
+GetStringTypeW
+GetSystemDirectoryW
+GetSystemWindowsDirectoryW
+GetTabbedTextExtentW
+GetTempFileNameW
+GetTempPathW
+GetTextExtentExPointW
+GetTextExtentPoint32W
+GetTextExtentPointW
+GetTextFaceW
+GetTextMetricsW
+GetTimeFormatW
+GetUserNameW
+GetVersionExW
+GetVolumeInformationW
+GetWindowLongA
+GetWindowLongW
+GetWindowModuleFileNameW
+GetWindowTextLengthW
+GetWindowTextW
+GetWindowsDirectoryW
+GlobalAddAtomW
+GlobalFindAtomW
+GlobalGetAtomNameW
+GrayStringW
+;InitSecurityInterfaceW
+;InitializeSecurityContextW
+InsertMenuItemW
+InsertMenuW
+IsBadStringPtrW
+IsCharAlphaNumericW
+IsCharAlphaW
+IsCharLowerW
+IsCharUpperW
+IsClipboardFormatAvailable
+IsDestinationReachableW
+IsDialogMessageW
+IsTextUnicode
+IsValidCodePage
+IsWindowUnicode
+LCMapStringW
+LoadAcceleratorsW
+LoadBitmapW
+LoadCursorFromFileW
+LoadCursorW
+LoadIconW
+LoadImageW
+LoadKeyboardLayoutW
+LoadLibraryExW
+LoadLibraryW
+LoadMenuIndirectW
+LoadMenuW
+LoadStringW
+;MCIWndCreateW
+MapVirtualKeyExW
+MapVirtualKeyW
+MessageBoxExW
+MessageBoxIndirectW
+MessageBoxW
+ModifyMenuW
+MoveFileW
+MultiByteToWideChar
+MultinetGetConnectionPerformanceW
+OemToCharBuffW
+OemToCharW
+;OleUIAddVerbMenuW
+;OleUIBusyW
+;OleUIChangeIconW
+;OleUIChangeSourceW
+;OleUIConvertW
+;OleUIEditLinksW
+;OleUIInsertObjectW
+;OleUIObjectPropertiesW
+;OleUIPasteSpecialW
+;OleUIPromptUserW
+;OleUIUpdateLinksW
+OpenEventW
+OpenFileMappingW
+OpenMutexW
+OpenPrinterW
+OpenSemaphoreW
+OpenWaitableTimerW
+OutputDebugStringW
+PageSetupDlgW
+PeekConsoleInputW
+PeekMessageW
+PlaySoundW
+;PolyTextOutW
+PostMessageW
+PostThreadMessageW
+PrintDlgW
+;QueryContextAttributesW
+;QueryCredentialsAttributesW
+QueryDosDeviceW
+;QuerySecurityPackageInfoW
+RasConnectionNotificationW
+RasCreatePhonebookEntryW
+RasDeleteEntryW
+RasDeleteSubEntryW
+;RasDialW
+RasEditPhonebookEntryW
+RasEnumConnectionsW
+RasEnumDevicesW
+RasEnumEntriesW
+RasGetConnectStatusW
+RasGetEntryDialParamsW
+RasGetEntryPropertiesW
+RasGetErrorStringW
+RasHangUpW
+RasRenameEntryW
+RasSetEntryDialParamsW
+RasSetEntryPropertiesW
+RasSetSubEntryPropertiesW
+RasValidateEntryNameW
+ReadConsoleInputW
+ReadConsoleOutputCharacterW
+ReadConsoleOutputW
+ReadConsoleW
+RegConnectRegistryW
+RegCreateKeyExW
+RegCreateKeyW
+RegDeleteKeyW
+RegDeleteValueW
+RegEnumKeyExW
+RegEnumKeyW
+RegEnumValueW
+RegLoadKeyW
+RegOpenKeyExW
+RegOpenKeyW
+RegQueryInfoKeyW
+RegQueryMultipleValuesW
+RegQueryValueExW
+RegQueryValueW
+RegReplaceKeyW
+RegSaveKeyW
+RegSetValueExW
+RegSetValueW
+RegUnLoadKeyW
+RegisterClassExW
+RegisterClassW
+RegisterClipboardFormatW
+RegisterDeviceNotificationW
+RegisterWindowMessageW
+RemoveDirectoryW
+RemoveFontResourceW
+RemovePropA
+RemovePropW
+ReplaceTextW
+ResetDCW
+;ResetPrinterW
+SHBrowseForFolderW
+SHChangeNotify
+SHFileOperationW
+SHGetFileInfoW
+SHGetNewLinkInfoW
+SHGetPathFromIDListW
+ScrollConsoleScreenBufferW
+SearchPathW
+SendDlgItemMessageW
+SendMessageCallbackW
+SendMessageTimeoutW
+SendMessageW
+SendNotifyMessageW
+SetCalendarInfoW
+SetClassLongW
+SetComputerNameW
+SetConsoleTitleW
+SetCurrentDirectoryW
+SetDefaultCommConfigW
+SetDlgItemTextW
+SetEnvironmentVariableW
+SetFileAttributesW
+SetICMProfileW
+SetJobW
+SetLocaleInfoW
+SetMenuItemInfoW
+SetPrinterDataW
+SetPrinterW
+SetPropA
+SetPropW
+SetVolumeLabelW
+SetWindowLongA
+SetWindowLongW
+SetWindowTextW
+SetWindowsHookExW
+SetWindowsHookW
+ShellAboutW
+ShellExecuteExW
+ShellExecuteW
+Shell_NotifyIconW
+StartDocPrinterW
+StartDocW
+SystemParametersInfoW
+TabbedTextOutW
+TextOutW
+TranslateAcceleratorW
+UnregisterClassW
+UpdateResourceW
+VerFindFileW
+VerInstallFileW
+VerLanguageNameW
+VerQueryValueW
+VkKeyScanExW
+VkKeyScanW
+WNetAddConnection2W
+WNetAddConnection3W
+WNetAddConnectionW
+WNetCancelConnection2W
+WNetCancelConnectionW
+WNetConnectionDialog1W
+WNetDisconnectDialog1W
+WNetEnumResourceW
+WNetGetConnectionW
+WNetGetLastErrorW
+WNetGetNetworkInformationW
+WNetGetProviderNameW
+WNetGetResourceInformationW
+WNetGetResourceParentW
+WNetGetUniversalNameW
+WNetGetUserW
+WNetOpenEnumW
+WNetUseConnectionW
+WaitNamedPipeW
+WideCharToMultiByte
+WinHelpW
+WriteConsoleInputW
+WriteConsoleOutputCharacterW
+WriteConsoleOutputW
+WriteConsoleW
+WritePrivateProfileSectionW
+WritePrivateProfileStringW
+WritePrivateProfileStructW
+WriteProfileSectionW
+WriteProfileStringW
+;auxGetDevCapsW
+capCreateCaptureWindowW
+capGetDriverDescriptionW
+;joyGetDevCapsW
+lstrcatW
+lstrcmpW
+lstrcmpiW
+lstrcpyW
+lstrcpynW
+lstrlenW
+;mciGetDeviceIDW
+;mciGetErrorStringW
+;mciSendCommandW
+;mciSendStringW
+;midiInGetDevCapsW
+;midiInGetErrorTextW
+;midiOutGetDevCapsW
+;midiOutGetErrorTextW
+;mixerGetControlDetailsW
+;mixerGetDevCapsW
+;mixerGetLineControlsW
+;mixerGetLineInfoW
+;mmioInstallIOProcW
+;mmioOpenW
+;mmioRenameW
+;mmioStringToFOURCCW
+sndPlaySoundW
+;waveInGetDevCapsW
+;waveInGetErrorTextW
+;waveOutGetDevCapsW
+;waveOutGetErrorTextW
+wsprintfW
+wvsprintfW \ No newline at end of file
diff --git a/sal/systools/win32/uwinapi/unicows_mingw.dxp b/sal/systools/win32/uwinapi/unicows_mingw.dxp
new file mode 100644
index 000000000000..f898d4b2a27d
--- /dev/null
+++ b/sal/systools/win32/uwinapi/unicows_mingw.dxp
@@ -0,0 +1,544 @@
+;*************************************************************************
+;
+; DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+;
+; Copyright 2000, 2010 Oracle and/or its affiliates.
+;
+; OpenOffice.org - a multi-platform office productivity suite
+;
+; This file is part of OpenOffice.org.
+;
+; OpenOffice.org is free software: you can redistribute it and/or modify
+; it under the terms of the GNU Lesser General Public License version 3
+; only, as published by the Free Software Foundation.
+;
+; OpenOffice.org is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU Lesser General Public License version 3 for more details
+; (a copy is included in the LICENSE file that accompanied this code).
+;
+; You should have received a copy of the GNU Lesser General Public License
+; version 3 along with OpenOffice.org. If not, see
+; <http://www.openoffice.org/license.html>
+; for a copy of the LGPLv3 License.
+;
+;*************************************************************************
+;
+; Functions that are exported but not implemented by unicows.dll
+; are only inserted as comment.
+;
+; In addition to MSDN Platform SDK documentation the following functions
+; are not implemented too:
+; AddMonitorW, FreeContextBufferW, GetPrinterDriverDirectoryW,
+; MCIWndCreateW
+;
+; The following functions of unicows.dll are buggy:
+; DrawStateW, GetLogicalDriveStringsW (both implemented in uwinapi.dll)
+;
+; The following functions of unicows.dll are wrapped but the ANSI versions
+; do not exist on Win9x so the wrapper is useless:
+; MoveFileExW, CopyFileExW (both implemented in uwinapi.dll along with the
+; ANSI versions )
+;
+; These functions do not exist on Win 95 and NT neither as Unicode
+; nor as ANSI version, so the wrapper will fail on NT4 and Win 95
+; GetLongPathNameW ( implemented in uwinapi.dll along with the
+; ANSI version )
+;
+; These essential functions aren't implemented by unicows.dll because
+; there's no ANSI version:
+; CommandLineToArgvW (implemented by uwinapi.dll)
+;
+;*************************************************************************
+
+;AcquireCredentialsHandleW@36
+AddAtomW@4
+AddFontResourceW@4
+AddJobW@20
+AddPortW@12
+AddPrintProcessorW@16
+AddPrintProvidorW@12
+AddPrinterDriverW@12
+AddPrinterW@12
+AdvancedDocumentPropertiesW@20
+AppendMenuW@16
+BeginUpdateResourceW@8
+BroadcastSystemMessageW@20
+BuildCommDCBAndTimeoutsW@12
+BuildCommDCBW@8
+CallMsgFilterW@8
+CallNamedPipeW@28
+CallWindowProcA@20
+CallWindowProcW@20
+ChangeDisplaySettingsExW@20
+ChangeDisplaySettingsW@8
+ChangeMenuW@20
+CharLowerBuffW@8
+CharLowerW@4
+CharNextW@4
+CharPrevW@8
+CharToOemBuffW@12
+CharToOemW@8
+CharUpperBuffW@8
+CharUpperW@4
+ChooseColorW@4
+ChooseFontW@4
+CommConfigDialogW@12
+CompareStringW@24
+ConfigurePortW@12
+CopyAcceleratorTableW@12
+CopyEnhMetaFileW@8
+CopyFileExW@24
+CopyFileW@12
+CopyMetaFileW@8
+CreateAcceleratorTableW@8
+CreateColorSpaceW@4
+CreateDCW@16
+CreateDialogIndirectParamW@20
+CreateDialogParamW@20
+CreateDirectoryExW@12
+CreateDirectoryW@8
+CreateEnhMetaFileW@16
+CreateEventW@16
+CreateFileMappingW@24
+CreateFileW@28
+CreateFontIndirectW@4
+CreateFontW@56
+CreateICW@16
+CreateMDIWindowW@40
+CreateMailslotW@16
+CreateMetaFileW@4
+CreateMutexW@12
+;CreateNamedPipeW@32
+CreateProcessW@40
+CreateScalableFontResourceW@16
+CreateSemaphoreW@16
+CreateStdAccessibleProxyW@20
+CreateWaitableTimerW@12
+CreateWindowExW@48
+DdeConnect@16
+DdeConnectList@20
+DdeCreateStringHandleW@12
+DdeInitializeW@16
+DdeQueryConvInfo@12
+DdeQueryStringW@20
+DefDlgProcW@16
+DefFrameProcW@20
+DefMDIChildProcW@16
+DefWindowProcW@16
+DeleteFileW@4
+DeleteMonitorW@12
+DeletePortW@12
+DeletePrintProcessorW@12
+DeletePrintProvidorW@12
+DeletePrinterDriverW@12
+;DeviceCapabilitiesW@20
+DialogBoxIndirectParamW@20
+DialogBoxParamW@20
+DispatchMessageW@4
+DlgDirListComboBoxW@20
+DlgDirListW@20
+DlgDirSelectComboBoxExW@16
+DlgDirSelectExW@16
+;DocumentPropertiesW@24
+DragQueryFileW@16
+DrawStateW@40
+DrawTextExW@24
+DrawTextW@20
+EnableWindow@8
+EndUpdateResourceW@8
+EnumCalendarInfoExW@16
+EnumCalendarInfoW@16
+EnumClipboardFormats@4
+EnumDateFormatsExW@12
+EnumDateFormatsW@12
+EnumDisplayDevicesW@16
+EnumDisplaySettingsExW@16
+EnumDisplaySettingsW@12
+EnumFontFamiliesExW@20
+EnumFontFamiliesW@16
+EnumFontsW@16
+EnumICMProfilesW@12
+;EnumMonitorsW@24
+;EnumPortsW@24
+;EnumPrintProcessorDatatypesW@28
+;EnumPrintProcessorsW@28
+;EnumPrinterDriversW@28
+;EnumPrintersW@28
+EnumPropsA@8
+EnumPropsExA@12
+EnumPropsExW@12
+EnumPropsW@8
+EnumSystemCodePagesW@8
+EnumSystemLocalesW@8
+EnumTimeFormatsW@12
+;EnumerateSecurityPackagesW@8
+ExpandEnvironmentStringsW@12
+ExtTextOutW@32
+ExtractIconExW@20
+ExtractIconW@12
+FatalAppExitW@8
+FillConsoleOutputCharacterW@20
+FindAtomW@4
+;FindExecutableW@12
+FindFirstChangeNotificationW@12
+FindFirstFileW@8
+FindNextFileW@8
+FindResourceExW@16
+FindResourceW@12
+FindTextW@4
+FindWindowExW@16
+FindWindowW@8
+FormatMessageW@28
+;FreeContextBuffer@4
+FreeEnvironmentStringsW@4
+GetAltTabInfoW@20
+GetAtomNameW@12
+GetCPInfo@8
+GetCPInfoExW@12
+GetCalendarInfoW@24
+;GetCharABCWidthsFloatW@16
+GetCharABCWidthsW@16
+GetCharWidthFloatW@16
+GetCharWidthW@16
+GetCharacterPlacementW@24
+GetClassInfoExW@12
+GetClassInfoW@12
+GetClassLongW@8
+GetClassNameW@12
+GetClipboardData@4
+GetClipboardFormatNameW@12
+GetComputerNameW@8
+GetConsoleTitleW@8
+GetCurrencyFormatW@24
+GetCurrentDirectoryW@8
+GetCurrentHwProfileW@4
+GetDateFormatW@24
+GetDefaultCommConfigW@12
+GetDiskFreeSpaceExW@16
+GetDiskFreeSpaceW@20
+GetDlgItemTextW@16
+GetDriveTypeW@4
+GetEnhMetaFileDescriptionW@12
+GetEnhMetaFileW@4
+GetEnvironmentStringsW@0
+GetEnvironmentVariableW@12
+GetFileAttributesExW@12
+GetFileAttributesW@4
+GetFileTitleW@12
+GetFileVersionInfoSizeW@8
+GetFileVersionInfoW@16
+GetFullPathNameW@16
+GetGlyphOutlineW@28
+GetICMProfileW@12
+;GetJobW@24
+GetKerningPairsW@12
+GetKeyNameTextW@12
+GetKeyboardLayoutNameW@4
+GetLocaleInfoW@16
+GetLogColorSpaceW@12
+GetLogicalDriveStringsW@8
+GetLongPathNameW@12
+GetMenuItemInfoW@16
+GetMenuStringW@20
+GetMessageW@16
+GetMetaFileW@4
+GetModuleFileNameW@12
+GetModuleHandleW@4
+GetMonitorInfoW@8
+GetNamedPipeHandleStateW@28
+GetNumberFormatW@24
+GetObjectW@12
+GetOpenFileNamePreviewW@4
+GetOpenFileNameW@4
+GetOutlineTextMetricsW@12
+GetPrintProcessorDirectoryW@24
+;GetPrinterDataW@24
+;GetPrinterDriverDirectoryW24
+;GetPrinterDriverW@24
+;GetPrinterW@20
+GetPrivateProfileIntW@16
+GetPrivateProfileSectionNamesW@12
+GetPrivateProfileSectionW@16
+GetPrivateProfileStringW@24
+GetPrivateProfileStructW@20
+GetProcAddress@8=Internal_GetProcAddress@8
+GetProfileIntW@12
+GetProfileSectionW@12
+GetProfileStringW@20
+GetPropA@8
+GetPropW@8
+GetRoleTextW@12
+GetSaveFileNamePreviewW@4
+GetSaveFileNameW@4
+GetShortPathNameW@12
+GetStartupInfoW@4
+GetStateTextW@12
+GetStringTypeExW@20
+GetStringTypeW@16
+GetSystemDirectoryW@8
+GetSystemWindowsDirectoryW@8
+GetTabbedTextExtentW@20
+GetTempFileNameW@16
+GetTempPathW@8
+GetTextExtentExPointW@28
+GetTextExtentPoint32W@16
+GetTextExtentPointW@16
+GetTextFaceW@12
+GetTextMetricsW@8
+GetTimeFormatW@24
+GetUserNameW@8
+GetVersionExW@4
+GetVolumeInformationW@32
+GetWindowLongA@8
+GetWindowLongW@8
+GetWindowModuleFileNameW@12
+GetWindowTextLengthW@4
+GetWindowTextW@12
+GetWindowsDirectoryW@8
+GlobalAddAtomW@4
+GlobalFindAtomW@4
+GlobalGetAtomNameW@12
+GrayStringW@36
+;InitSecurityInterfaceW@0
+;InitializeSecurityContextW@48
+InsertMenuItemW@16
+InsertMenuW@20
+IsBadStringPtrW@8
+IsCharAlphaNumericW@4
+IsCharAlphaW@4
+IsCharLowerW@4
+IsCharUpperW@4
+IsClipboardFormatAvailable@4
+IsDestinationReachableW@8
+IsDialogMessageW@8
+IsTextUnicode@12
+IsValidCodePage@4
+IsWindowUnicode@4
+LCMapStringW@24
+LoadAcceleratorsW@8
+LoadBitmapW@8
+LoadCursorFromFileW@4
+LoadCursorW@8
+LoadIconW@8
+LoadImageW@24
+LoadKeyboardLayoutW@8
+LoadLibraryExW@12
+LoadLibraryW@4
+LoadMenuIndirectW@4
+LoadMenuW@8
+LoadStringW@16
+;MCIWndCreateW@4
+MapVirtualKeyExW@12
+MapVirtualKeyW@8
+MessageBoxExW@20
+MessageBoxIndirectW@4
+MessageBoxW@16
+ModifyMenuW@20
+MoveFileW@8
+MultiByteToWideChar@24
+MultinetGetConnectionPerformanceW@8
+OemToCharBuffW@12
+OemToCharW@8
+;OleUIAddVerbMenuW@36
+;OleUIBusyW@4
+;OleUIChangeIconW@4
+;OleUIChangeSourceW@4
+;OleUIConvertW@4
+;OleUIEditLinksW@4
+;OleUIInsertObjectW@4
+;OleUIObjectPropertiesW@4
+;OleUIPasteSpecialW@4
+;OleUIPromptUserW@8
+;OleUIUpdateLinksW@16
+OpenEventW@12
+OpenFileMappingW@12
+OpenMutexW@12
+OpenPrinterW@12
+OpenSemaphoreW@12
+OpenWaitableTimerW@12
+OutputDebugStringW@4
+PageSetupDlgW@4
+PeekConsoleInputW@16
+PeekMessageW@20
+PlaySoundW@12
+;PolyTextOutW@12
+PostMessageW@16
+PostThreadMessageW@16
+PrintDlgW@4
+;QueryContextAttributesW@12
+;QueryCredentialsAttributesW@12
+QueryDosDeviceW@12
+;QuerySecurityPackageInfoW@8
+RasConnectionNotificationW@12
+RasCreatePhonebookEntryW@8
+RasDeleteEntryW@8
+RasDeleteSubEntryW@12
+;RasDialW@24
+RasEditPhonebookEntryW@12
+RasEnumConnectionsW@12
+RasEnumDevicesW@12
+RasEnumEntriesW@20
+RasGetConnectStatusW@8
+RasGetEntryDialParamsW@12
+RasGetEntryPropertiesW@24
+RasGetErrorStringW@12
+RasHangUpW@4
+RasRenameEntryW@12
+RasSetEntryDialParamsW@12
+RasSetEntryPropertiesW@24
+RasSetSubEntryPropertiesW@28
+RasValidateEntryNameW@8
+ReadConsoleInputW@16
+ReadConsoleOutputCharacterW@20
+ReadConsoleOutputW@20
+ReadConsoleW@20
+RegConnectRegistryW@12
+RegCreateKeyExW@36
+RegCreateKeyW@12
+RegDeleteKeyW@8
+RegDeleteValueW@8
+RegEnumKeyExW@32
+RegEnumKeyW@16
+RegEnumValueW@32
+RegLoadKeyW@12
+RegOpenKeyExW@20
+RegOpenKeyW@12
+RegQueryInfoKeyW@48
+RegQueryMultipleValuesW@20
+RegQueryValueExW@24
+RegQueryValueW@16
+RegReplaceKeyW@16
+RegSaveKeyW@12
+RegSetValueExW@24
+RegSetValueW@20
+RegUnLoadKeyW@8
+RegisterClassExW@4
+RegisterClassW@4
+RegisterClipboardFormatW@4
+RegisterDeviceNotificationW@12
+RegisterWindowMessageW@4
+RemoveDirectoryW@4
+RemoveFontResourceW@4
+RemovePropA@8
+RemovePropW@8
+ReplaceTextW@4
+ResetDCW@8
+;ResetPrinterW@8
+SHBrowseForFolderW@4
+SHChangeNotify@16
+SHFileOperationW@4
+SHGetFileInfoW@20
+SHGetNewLinkInfoW@20
+SHGetPathFromIDListW@8
+ScrollConsoleScreenBufferW@20
+SearchPathW@24
+SendDlgItemMessageW@20
+SendMessageCallbackW@24
+SendMessageTimeoutW@28
+SendMessageW@16
+SendNotifyMessageW@16
+SetCalendarInfoW@16
+SetClassLongW@12
+SetComputerNameW@4
+SetConsoleTitleW@4
+SetCurrentDirectoryW@4
+SetDefaultCommConfigW@12
+SetDlgItemTextW@12
+SetEnvironmentVariableW@8
+SetFileAttributesW@8
+SetICMProfileW@8
+SetJobW@20
+SetLocaleInfoW@12
+SetMenuItemInfoW@16
+SetPrinterDataW@20
+SetPrinterW@16
+SetPropA@12
+SetPropW@12
+SetVolumeLabelW@8
+SetWindowLongA@12
+SetWindowLongW@12
+SetWindowTextW@8
+SetWindowsHookExW@16
+SetWindowsHookW@8
+ShellAboutW@16
+ShellExecuteExW@4
+ShellExecuteW@24
+Shell_NotifyIconW@8
+StartDocPrinterW@12
+StartDocW@8
+SystemParametersInfoW@16
+TabbedTextOutW@32
+TextOutW@20
+TranslateAcceleratorW@12
+UnregisterClassW@8
+UpdateICMRegKeyW@16
+UpdateResourceW@24
+VerFindFileW@32
+VerInstallFileW@32
+VerLanguageNameW@12
+VerQueryValueW@16
+VkKeyScanExW@8
+VkKeyScanW@4
+WNetAddConnection2W@16
+WNetAddConnection3W@20
+WNetAddConnectionW@12
+WNetCancelConnection2W@12
+WNetCancelConnectionW@8
+WNetConnectionDialog1W@4
+WNetDisconnectDialog1W@4
+WNetEnumResourceW@16
+WNetGetConnectionW@12
+WNetGetLastErrorW@20
+WNetGetNetworkInformationW@8
+WNetGetProviderNameW@12
+WNetGetResourceInformationW@16
+WNetGetResourceParentW@12
+WNetGetUniversalNameW@16
+WNetGetUserW@12
+WNetOpenEnumW@20
+WNetUseConnectionW@32
+WaitNamedPipeW@8
+WideCharToMultiByte@32
+WinHelpW@16
+WriteConsoleInputW@16
+WriteConsoleOutputCharacterW@20
+WriteConsoleOutputW@20
+WriteConsoleW@20
+WritePrivateProfileSectionW@12
+WritePrivateProfileStringW@16
+WritePrivateProfileStructW@20
+WriteProfileSectionW@8
+WriteProfileStringW@12
+;auxGetDevCapsW@12
+capCreateCaptureWindowW@32
+capGetDriverDescriptionW@20
+;joyGetDevCapsW@12
+lstrcatW@8
+lstrcmpW@8
+lstrcmpiW@8
+lstrcpyW@8
+lstrcpynW@12
+lstrlenW@4
+;mciGetDeviceIDW@4
+;mciGetErrorStringW@12
+;mciSendCommandW@16
+;mciSendStringW@16
+;midiInGetDevCapsW@12
+;midiInGetErrorTextW@12
+;midiOutGetDevCapsW@12
+;mixerGetControlDetailsW@12
+;mixerGetDevCapsW@12
+;mixerGetLineControlsW@12
+;mixerGetLineInfoW@12
+;mmioInstallIOProcW@12
+;mmioOpenW@@12
+;mmioRenameW@16
+;sndPlaySoundW@8
+;waveInGetDevCapsW@12
+;waveInGetErrorTextW@12
+;waveOutGetDevCapsW@12
+;waveOutGetErrorTextW@12
+wsprintfW
+wvsprintfW@12
diff --git a/sal/systools/win32/uwinapi/uwinapi.dxp b/sal/systools/win32/uwinapi/uwinapi.dxp
new file mode 100644
index 000000000000..551671853ae0
--- /dev/null
+++ b/sal/systools/win32/uwinapi/uwinapi.dxp
@@ -0,0 +1,86 @@
+;*************************************************************************
+;
+; DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+;
+; Copyright 2000, 2010 Oracle and/or its affiliates.
+;
+; OpenOffice.org - a multi-platform office productivity suite
+;
+; This file is part of OpenOffice.org.
+;
+; OpenOffice.org is free software: you can redistribute it and/or modify
+; it under the terms of the GNU Lesser General Public License version 3
+; only, as published by the Free Software Foundation.
+;
+; OpenOffice.org is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU Lesser General Public License version 3 for more details
+; (a copy is included in the LICENSE file that accompanied this code).
+;
+; You should have received a copy of the GNU Lesser General Public License
+; version 3 along with OpenOffice.org. If not, see
+; <http://www.openoffice.org/license.html>
+; for a copy of the LGPLv3 License.
+;
+;*************************************************************************
+
+DllGetVersion
+;CheckTokenMembership
+CommandLineToArgvW
+CopyFileExA
+CopyFileExW
+CreateToolhelp32Snapshot
+DrawStateW
+EnumProcesses
+GetDiskFreeSpaceExA
+GetDiskFreeSpaceExW
+GetLogicalDriveStringsW
+GetLongPathNameA
+GetLongPathNameW
+GetModuleFileNameExA
+GetModuleFileNameExW
+GetProcessId
+GetUserDefaultUILanguage
+GetUserDomainA
+GetUserDomainW
+Module32First
+Module32FirstW
+Module32Next
+Module32NextW
+MoveFileExA
+MoveFileExW
+Process32First
+Process32FirstW
+Process32Next
+Process32NextW
+FindFirstVolumeA
+FindFirstVolumeW
+FindNextVolumeA
+FindNextVolumeW
+FindVolumeClose
+FindFirstVolumeMountPointA
+FindFirstVolumeMountPointW
+FindNextVolumeMountPointA
+FindNextVolumeMountPointW
+FindVolumeMountPointClose
+GetVolumeNameForVolumeMountPointA
+GetVolumeNameForVolumeMountPointW
+DeleteVolumeMountPointA
+DeleteVolumeMountPointW
+GetVolumePathNameA
+GetVolumePathNameW
+SetVolumeMountPointA
+SetVolumeMountPointW
+PathAddBackslashW
+PathCompactPathExW
+PathFileExistsW
+PathFindExtensionW
+PathFindFileNameW
+PathIsFileSpecW
+PathIsUNCW
+PathRemoveExtensionW
+PathRemoveFileSpecW
+PathSetDlgItemPathW
+PathStripToRootW
+SHCreateItemFromParsingName
diff --git a/sal/systools/win32/uwinapi/uwinapi_mingw.dxp b/sal/systools/win32/uwinapi/uwinapi_mingw.dxp
new file mode 100644
index 000000000000..81cc6faa0ea0
--- /dev/null
+++ b/sal/systools/win32/uwinapi/uwinapi_mingw.dxp
@@ -0,0 +1,90 @@
+;*************************************************************************
+;
+; DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+;
+; Copyright 2000, 2010 Oracle and/or its affiliates.
+;
+; OpenOffice.org - a multi-platform office productivity suite
+;
+; This file is part of OpenOffice.org.
+;
+; OpenOffice.org is free software: you can redistribute it and/or modify
+; it under the terms of the GNU Lesser General Public License version 3
+; only, as published by the Free Software Foundation.
+;
+; OpenOffice.org is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU Lesser General Public License version 3 for more details
+; (a copy is included in the LICENSE file that accompanied this code).
+;
+; You should have received a copy of the GNU Lesser General Public License
+; version 3 along with OpenOffice.org. If not, see
+; <http://www.openoffice.org/license.html>
+; for a copy of the LGPLv3 License.
+;
+;*************************************************************************
+
+DllGetVersion@4
+CommandLineToArgvW@8
+CopyFileExA@24
+CopyFileExW@24
+CreateToolhelp32Snapshot@8
+DrawStateW@40
+EnumProcesses@12
+GetDiskFreeSpaceExA@16
+GetDiskFreeSpaceExW@16
+GetLogicalDriveStringsW@8
+GetLongPathNameA@12
+GetLongPathNameW@12
+GetModuleFileNameExA@16
+GetModuleFileNameExW@16
+GetProcessId@4
+GetUserDefaultUILanguage@0
+GetUserDomainA@8
+GetUserDomainW@8
+Module32First@8
+Module32FirstW@8
+Module32Next@8
+Module32NextW@8
+MoveFileExA@12
+MoveFileExW@12
+Process32First@8
+Process32FirstW@8
+Process32Next@8
+Process32NextW@8
+FindFirstVolumeA@8
+FindFirstVolumeW@8
+FindNextVolumeA@12
+FindNextVolumeW@12
+FindVolumeClose@4
+FindFirstVolumeMountPointA@12
+FindFirstVolumeMountPointW@12
+FindNextVolumeMountPointA@12
+FindNextVolumeMountPointW@12
+FindVolumeMountPointClose@4
+GetVolumeNameForVolumeMountPointA@12
+GetVolumeNameForVolumeMountPointW@12
+DeleteVolumeMountPointA@4
+DeleteVolumeMountPointW@4
+GetVolumePathNameA@12
+GetVolumePathNameW@12
+SetVolumeMountPointA@8
+SetVolumeMountPointW@8
+PathAddBackslashW@4
+PathCompactPathExW@16
+PathFileExistsW@4
+PathFindExtensionW@4
+PathFindFileNameW@4
+PathIsFileSpecW@4
+PathIsUNCW@4
+PathRemoveExtensionW@4
+PathRemoveFileSpecW@4
+PathSetDlgItemPathW@12
+PathStripToRootW@4
+SHCreateItemFromParsingName@16
+snprintf
+snwprintf
+vsnprintf
+vsnwprintf
+
diff --git a/sal/systools/win32/uwinapi/win95sys.h b/sal/systools/win32/uwinapi/win95sys.h
new file mode 100644
index 000000000000..4ca0c8e8fcff
--- /dev/null
+++ b/sal/systools/win32/uwinapi/win95sys.h
@@ -0,0 +1,348 @@
+#pragma once
+
+//Kernel32 objects
+
+#define K32OBJ_SEMAPHORE 0x1
+#define K32OBJ_EVENT 0x2
+#define K32OBJ_MUTEX 0x3
+#define K32OBJ_CRITICAL_SECTION 0x4
+#define K32OBJ_PROCESS 0x5
+#define K32OBJ_THREAD 0x6
+#define K32OBJ_FILE 0x7
+#define K32OBJ_CHANGE 0x8
+#define K32OBJ_CONSOLE 0x9
+#define K32OBJ_SCREEN_BUFFER 0xA
+#define K32OBJ_MEM_MAPPED_FILE 0xB
+#define K32OBJ_SERIAL 0xC
+#define K32OBJ_DEVICE_IOCTL 0xD
+#define K32OBJ_PIPE 0xE
+#define K32OBJ_MAILSLOT 0xF
+#define K32OBJ_TOOLHELP_SNAPSHOT 0x10
+#define K32OBJ_SOCKET 0x11
+
+
+//Process Database flags
+
+#define fDebugSingle 0x00000001
+#define fCreateProcessEvent 0x00000002
+#define fExitProcessEvent 0x00000004
+#define fWin16Process 0x00000008
+#define fDosProcess 0x00000010
+#define fConsoleProcess 0x00000020
+#define fFileApisAreOem 0x00000040
+#define fNukeProcess 0x00000080
+#define fServiceProcess 0x00000100
+#define fLoginScriptHack 0x00000800
+
+
+//Thread Database flags
+
+#define fCreateThreadEvent 0x00000001
+#define fCancelExceptionAbort 0x00000002
+#define fOnTempStack 0x00000004
+#define fGrowableStack 0x00000008
+#define fDelaySingleStep 0x00000010
+#define fOpenExeAsImmovableFile 0x00000020
+#define fCreateSuspended 0x00000040
+#define fStackOverflow 0x00000080
+#define fNestedCleanAPCs 0x00000100
+#define fWasOemNowAnsi 0x00000200
+#define fOKToSetThreadOem 0x00000400
+
+#ifdef _MSC_VER
+#pragma warning(disable:4103)
+#endif
+#pragma pack(1)
+
+
+//MODREF and IMTE structures
+
+typedef struct _MODREF {
+ struct _MODREF *pNextModRef; // 00h
+ DWORD un1; // 04h
+ DWORD un2; // 08h
+ DWORD un3; // 0Ch
+ WORD mteIndex; // 10h
+ WORD un4; // 12h
+ DWORD un5; // 14h
+ PVOID ppdb; // 18h Pointer to process database
+ DWORD un6; // 1Ch
+ DWORD un7; // 20h
+ DWORD un8; // 24h
+} MODREF, *PMODREF;
+
+typedef struct _IMTE {
+ DWORD un1; // 00h
+ PIMAGE_NT_HEADERS pNTHdr; // 04h
+ DWORD un2; // 08h
+ PSTR pszFileName; // 0Ch
+ PSTR pszModName; // 10h
+ WORD cbFileName; // 14h
+ WORD cbModName; // 16h
+ DWORD un3; // 18h
+ DWORD cSections; // 1Ch
+ DWORD un5; // 20h
+ DWORD baseAddress; // 24h
+ WORD hModule16; // 28h
+ WORD cUsage; // 2Ah
+ DWORD un7; // 2Ch
+ PSTR pszFileName2; // 30h
+ WORD cbFileName2; // 34h
+ DWORD pszModName2; // 36h
+ WORD cbModName2; // 3Ah
+} IMTE, *PIMTE;
+
+
+//Process Database structure
+
+typedef struct _ENVIRONMENT_DATABASE {
+PSTR pszEnvironment; // 00h Pointer to Environment
+DWORD un1; // 04h
+PSTR pszCmdLine; // 08h Pointer to command line
+PSTR pszCurrDirectory; // 0Ch Pointer to current directory
+LPSTARTUPINFOA pStartupInfo;// 10h Pointer to STARTUPINFOA struct
+HANDLE hStdIn; // 14h Standard Input
+HANDLE hStdOut; // 18h Standard Output
+HANDLE hStdErr; // 1Ch Standard Error
+DWORD un2; // 20h
+DWORD InheritConsole; // 24h
+DWORD BreakType; // 28h
+DWORD BreakSem; // 2Ch
+DWORD BreakEvent; // 30h
+DWORD BreakThreadID; // 34h
+DWORD BreakHandlers; // 38h
+} ENVIRONMENT_DATABASE, *PENVIRONMENT_DATABASE;
+
+typedef struct _KERNEL_OBJECT {
+DWORD Type; // 00h KERNEL32 object type (5)
+DWORD cReference; // 04h Number of references to process
+} KERNEL_OBJECT, *PKERNEL_OBJECT;
+
+typedef struct _HANDLE_TABLE_ENTRY {
+ DWORD flags; // Valid flags depend on what type of object this is
+ PKERNEL_OBJECT pObject; // Pointer to the object that the handle refers to
+} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;
+
+typedef struct _HANDLE_TABLE {
+ DWORD cEntries; // Max number of handles in table
+ HANDLE_TABLE_ENTRY array[1]; // An array (number is given by cEntries)
+} HANDLE_TABLE, *PHANDLE_TABLE;
+
+
+typedef struct _PROCESS_DATABASE {
+DWORD Type; // 00h KERNEL32 object type (5)
+DWORD cReference; // 04h Number of references to process
+DWORD un1; // 08h
+DWORD someEvent; // 0Ch An event object (What's it used for???)
+DWORD TerminationStatus; // 10h Returned by GetExitCodeProcess
+DWORD un2; // 14h
+DWORD DefaultHeap; // 18h Address of the process heap
+DWORD MemoryContext; // 1Ch pointer to the process's context
+DWORD flags; // 20h
+ // 0x00000001 - fDebugSingle
+ // 0x00000002 - fCreateProcessEvent
+ // 0x00000004 - fExitProcessEvent
+ // 0x00000008 - fWin16Process
+ // 0x00000010 - fDosProcess
+ // 0x00000020 - fConsoleProcess
+ // 0x00000040 - fFileApisAreOem
+ // 0x00000080 - fNukeProcess
+ // 0x00000100 - fServiceProcess
+ // 0x00000800 - fLoginScriptHack
+DWORD pPSP; // 24h Linear address of PSP?
+WORD PSPSelector; // 28h
+WORD MTEIndex; // 2Ah
+WORD cThreads; // 2Ch
+WORD cNotTermThreads; // 2Eh
+WORD un3; // 30h
+WORD cRing0Threads; // 32h number of ring 0 threads
+HANDLE HeapHandle; // 34h Heap to allocate handle tables out of
+ // This seems to always be the KERNEL32 heap
+HTASK W16TDB; // 38h Win16 Task Database selector
+DWORD MemMapFiles; // 3Ch memory mapped file list (?)
+PENVIRONMENT_DATABASE pEDB; // 40h Pointer to Environment Database
+PHANDLE_TABLE pHandleTable; // 44h Pointer to process handle table
+struct _PROCESS_DATABASE *ParentPDB; // 48h Parent process database
+PMODREF MODREFlist; // 4Ch Module reference list
+DWORD ThreadList; // 50h Threads in this process
+DWORD DebuggeeCB; // 54h Debuggee Context block?
+DWORD LocalHeapFreeHead; // 58h Head of free list in process heap
+DWORD InitialRing0ID; // 5Ch
+CRITICAL_SECTION crst; // 60h
+DWORD un4[3]; // 78h
+DWORD pConsole; // 84h Pointer to console for process
+DWORD tlsInUseBits1; // 88h // Represents TLS indices 0 - 31
+DWORD tlsInUseBits2; // 8Ch // Represents TLS indices 32 - 63
+DWORD ProcessDWORD; // 90h
+struct _PROCESS_DATABASE *ProcessGroup; // 94h
+DWORD pExeMODREF; // 98h pointer to EXE's MODREF
+DWORD TopExcFilter; // 9Ch Top Exception Filter?
+DWORD BasePriority; // A0h Base scheduling priority for process
+DWORD HeapOwnList; // A4h Head of the list of process heaps
+DWORD HeapHandleBlockList;// A8h Pointer to head of heap handle block list
+DWORD pSomeHeapPtr; // ACh normally zero, but can a pointer to a
+ // moveable handle block in the heap
+DWORD pConsoleProvider; // B0h Process that owns the console we're using?
+WORD EnvironSelector; // B4h Selector containing process environment
+WORD ErrorMode; // B6H SetErrorMode value (also thunks to Win16)
+DWORD pevtLoadFinished; // B8h Pointer to event LoadFinished?
+WORD UTState; // BCh
+} PROCESS_DATABASE, *PPROCESS_DATABASE;
+
+
+//TIB (Thread Information Block) structure
+
+typedef struct _SEH_record {
+ struct _SEH_record *pNext;
+ FARPROC pfnHandler;
+} SEH_record, *PSEH_record;
+
+// This is semi-documented in the NTDDK.H file from the NT DDK
+typedef struct _TIB {
+PSEH_record pvExcept; // 00h Head of exception record list
+PVOID pvStackUserTop; // 04h Top of user stack
+PVOID pvStackUserBase; // 08h Base of user stack
+WORD pvTDB; // 0Ch TDB
+WORD pvThunksSS; // 0Eh SS selector used for thunking to 16 bits
+DWORD SelmanList; // 10h
+PVOID pvArbitrary; // 14h Available for application use
+struct _tib *ptibSelf; // 18h Linear address of TIB structure
+WORD TIBFlags; // 1Ch
+WORD Win16MutexCount; // 1Eh
+DWORD DebugContext; // 20h
+DWORD pCurrentPriority; // 24h
+DWORD pvQueue; // 28h Message Queue selector
+PVOID *pvTLSArray; // 2Ch Thread Local Storage array
+} TIB, *PTIB;
+
+
+//TDBX structure
+
+typedef struct _TDBX {
+ DWORD ptdb; // 00h // PTHREAD_DATABASE
+ DWORD ppdb; // 04h // PPROCESDS_DATABASE
+ DWORD ContextHandle; // 08h
+ DWORD un1; // 0Ch
+ DWORD TimeOutHandle; // 10h
+ DWORD WakeParam; // 14h
+ DWORD BlockHandle; // 18h
+ DWORD BlockState; // 1Ch
+ DWORD SuspendCount; // 20h
+ DWORD SuspendHandle; // 24h
+ DWORD MustCompleteCount; // 28h
+ DWORD WaitExFlags; // 2Ch
+ // 0x00000001 - WAITEXBIT
+ // 0x00000002 - WAITACKBIT
+ // 0x00000004 - SUSPEND_APC_PENDING
+ // 0x00000008 - SUSPEND_TERMINATED
+ // 0x00000010 - BLOCKED_FOR_TERMINATION
+ // 0x00000020 - EMULATE_NPX
+ // 0x00000040 - WIN32_NPX
+ // 0x00000080 - EXTENDED_HANDLES
+ // 0x00000100 - FROZEN
+ // 0x00000200 - DONT_FREEZE
+ // 0x00000400 - DONT_UNFREEZE
+ // 0x00000800 - DONT_TRACE
+ // 0x00001000 - STOP_TRACING
+ // 0x00002000 - WAITING_FOR_CRST_SAFE
+ // 0x00004000 - CRST_SAFE
+ // 0x00040000 - BLOCK_TERMINATE_APC
+ DWORD SyncWaitCount; // 30h
+ DWORD QueuedSyncFuncs; // 34h
+ DWORD UserAPCList; // 38h
+ DWORD KernAPCList; // 3Ch
+ DWORD pPMPSPSelector; // 40h
+ DWORD BlockedOnID; // 44h
+ DWORD un2[7]; // 48h
+ DWORD TraceRefData; // 64h
+ DWORD TraceCallBack; // 68h
+ DWORD TraceEventHandle; // 6Ch
+ WORD TraceOutLastCS; // 70h
+ WORD K16TDB; // 72h
+ WORD K16PDB; // 74h
+ WORD DosPDBSeg; // 76h
+ WORD ExceptionCount; // 78h
+} TDBX, *PTDBX;
+
+
+//Thread Database structure
+
+typedef struct _THREAD_DATABASE {
+DWORD Type; // 00h
+DWORD cReference; // 04h
+PPROCESS_DATABASE pProcess; // 08h
+DWORD someEvent; // 0Ch An event object (What's it used for???)
+DWORD pvExcept; // 10h This field through field 3CH is a TIB
+ // structure (see TIB.H)
+DWORD TopOfStack; // 14h
+DWORD StackLow; // 18h
+WORD W16TDB; // 1Ch
+WORD StackSelector16; // 1Eh Used when thunking down to 16 bits
+DWORD SelmanList; // 20h
+DWORD UserPointer; // 24h
+PTIB pTIB; // 28h
+WORD TIBFlags; // 2Ch TIBF_WIN32 = 1, TIBF_TRAP = 2
+WORD Win16MutexCount; // 2Eh
+DWORD DebugContext; // 30h
+PDWORD pCurrentPriority; // 34h
+DWORD MessageQueue; // 38h
+DWORD pTLSArray; // 3Ch
+PPROCESS_DATABASE pProcess2;// 40h Another copy of the thread's process???
+DWORD Flags; // 44h
+ // 0x00000001 - fCreateThreadEvent
+ // 0x00000002 - fCancelExceptionAbort
+ // 0x00000004 - fOnTempStack
+ // 0x00000008 - fGrowableStack
+ // 0x00000010 - fDelaySingleStep
+ // 0x00000020 - fOpenExeAsImmovableFile
+ // 0x00000040 - fCreateSuspended
+ // 0x00000080 - fStackOverflow
+ // 0x00000100 - fNestedCleanAPCs
+ // 0x00000200 - fWasOemNowAnsi
+ // 0x00000400 - fOKToSetThreadOem
+DWORD TerminationStatus; // 48h Returned by GetExitCodeThread
+WORD TIBSelector; // 4Ch
+WORD EmulatorSelector; // 4Eh
+DWORD cHandles; // 50h
+DWORD WaitNodeList; // 54h
+DWORD un4; // 58h
+DWORD Ring0Thread; // 5Ch
+PTDBX pTDBX; // 60
+DWORD StackBase; // 64h
+DWORD TerminationStack; // 68h
+DWORD EmulatorData; // 6Ch
+DWORD GetLastErrorCode; // 70h
+DWORD DebuggerCB; // 74h
+DWORD DebuggerThread; // 78h
+PCONTEXT ThreadContext; // 7Ch // register context defined in WINNT.H
+DWORD Except16List; // 80h
+DWORD ThunkConnect; // 84h
+DWORD NegStackBase; // 88h
+DWORD CurrentSS; // 8Ch
+DWORD SSTable; // 90h
+DWORD ThunkSS16; // 94h
+DWORD TLSArray[64]; // 98h
+DWORD DeltaPriority; // 198h
+
+// The retail version breaks off somewhere around here.
+// All the remaining fields are most likely only in the debug version
+
+DWORD un5[7]; // 19Ch
+DWORD pCreateData16; // 1B8h
+DWORD APISuspendCount; // 1BCh # of times SuspendThread has been called
+DWORD un6; // 1C0h
+DWORD WOWChain; // 1C4h
+WORD wSSBig; // 1C8h
+WORD un7; // 1CAh
+DWORD lp16SwitchRec; // 1CCh
+DWORD un8[6]; // 1D0h
+DWORD pSomeCritSect1; // 1E8h
+DWORD pWin16Mutex; // 1ECh
+DWORD pWin32Mutex; // 1F0h
+DWORD pSomeCritSect2; // 1F4h
+DWORD un9; // 1F8h
+DWORD ripString; // 1FCh
+DWORD LastTlsSetValueEIP[64]; // 200h (parallel to TlsArray, contains EIP
+ // where TLS value was last set from)
+} THREAD_DATABASE, *PTHREAD_DATABASE;
+
diff --git a/sal/test/bootstrap b/sal/test/bootstrap
new file mode 100644
index 000000000000..6e307417e230
--- /dev/null
+++ b/sal/test/bootstrap
@@ -0,0 +1,65 @@
+#/bin/tcsh
+
+setenv MYBOOTSTRAPTESTVALUE 0
+echo 1
+./testbootstrap 1 -env:MYBOOTSTRAPTESTVALUE=1
+
+echo 2
+./testbootstrap.bin file
+
+echo 3
+./testbootstrap.Bin file
+
+echo 4
+./testbootstrap.exe file
+
+echo 5
+./testbootstrap.Exe file
+
+echo 6
+./testbootstrap 0 -env:INIFILENAME=
+
+unsetenv MYBOOTSTRAPTESTVALUE
+echo 7
+./testbootstrap default -env:INIFILENAME=
+
+echo 8
+./testbootstrap default -env:MYBOOTSTRAPTESTVALUE2=1 -env:INIFILENAME=
+
+echo
+echo "macro tests"
+echo
+
+# simple macro expansion
+echo 9
+./testbootstrap _first_second_third_ -env:FIRST=first -env:SECOND=second -env:THIRD=third -env:MYBOOTSTRAPTESTVALUE='_${FIRST}_${SECOND}_${THIRD}_'
+
+# simple quoting
+echo 10
+./testbootstrap '_${FIRST}_${SECOND}_${THIRD}_' -env:FIRST=first -env:SECOND=second -env:THIRD=third -env:MYBOOTSTRAPTESTVALUE='_\$\{FIRST\}_\$\{SECOND\}_\$\{THIRD\}_'
+
+# simple ini access
+echo 11
+./testbootstrap TheKeysValue -env:'MYBOOTSTRAPTESTVALUE=${./bootstraptest.ini:TheSection:TheKey}'
+
+# ini access with simple macro expansion
+echo 12
+./testbootstrap TheKeysValue -env:ININAME=./bootstraptest.ini -env:SECTIONNAME=TheSection -env:KEYNAME=TheKey \
+ -env:'MYBOOTSTRAPTESTVALUE=${$ININAME:$SECTIONNAME:$KEYNAME}'
+
+# ini access with complex macro expansion
+echo 13
+./testbootstrap TheKeysValue -env:ININAME=./bootstraptest.ini \
+ -env:'MYBOOTSTRAPTESTVALUE=${$ININAME:${$ININAME:SecondSection:IndirectSection}:${$ININAME:SecondSection:IndirectKey}}'
+
+# test no infinit recursion
+echo 14
+./testbootstrap "***RECURSION DETECTED***" -env:'MYBOOTSTRAPTESTVALUE=$MYBOOTSTRAPTESTVALUE'
+
+# test unicode
+echo 15
+./testbootstrap AAABBBCCC000 -env:'MYBOOTSTRAPTESTVALUE=\u0041\u0041\u0041\u0042\u0042\u0042\u0043\u0043\u0043\u0030\u0030\u0030'
+
+echo
+echo "bootstrap test finished"
+echo
diff --git a/sal/test/bootstrap.bat b/sal/test/bootstrap.bat
new file mode 100755
index 000000000000..2d3e9df3ccdf
--- /dev/null
+++ b/sal/test/bootstrap.bat
@@ -0,0 +1,62 @@
+@echo off
+set MYBOOTSTRAPTESTVALUE=0
+echo 1
+.\testbootstrap 1 -env:MYBOOTSTRAPTESTVALUE=1
+
+echo 2
+.\testbootstrap.exe file
+
+echo 3
+.\testbootstrap.Exe file
+
+echo 4
+.\testbootstrap.bin file
+
+echo 5
+.\testbootstrap.Bin file
+
+echo 6
+.\testbootstrap 0 -env:INIFILENAME=
+
+echo 7
+set MYBOOTSTRAPTESTVALUE=
+rem simply ignore the file ....
+.\testbootstrap default -env:INIFILENAME=
+
+echo 8
+.\testbootstrap default -env:MYBOOTSTRAPTESTVALUE2=1 -env:INIFILENAME=
+
+echo
+echo "macro tests"
+echo
+
+rem simple macro expansion
+echo 9
+.\testbootstrap _first_second_third_ -env:FIRST=first -env:SECOND=second -env:THIRD=third -env:MYBOOTSTRAPTESTVALUE=_${FIRST}_${SECOND}_${THIRD}_
+
+rem simple quoting
+echo 10
+.\testbootstrap _${FIRST}_${SECOND}_${THIRD}_ -env:FIRST=first -env:SECOND=second -env:THIRD=third -env:MYBOOTSTRAPTESTVALUE=_\$\{FIRST\}_\$\{SECOND\}_\$\{THIRD\}_
+
+rem simple ini access
+echo 11
+.\testbootstrap TheKeysValue -env:MYBOOTSTRAPTESTVALUE=${./bootstraptest.ini:TheSection:TheKey}
+
+rem ini access with simple macro expansion
+echo 12
+.\testbootstrap TheKeysValue -env:ININAME=./bootstraptest.ini -env:SECTIONNAME=TheSection -env:KEYNAME=TheKey -env:MYBOOTSTRAPTESTVALUE=${$ININAME:$SECTIONNAME:$KEYNAME}
+
+rem ini access with complex macro expansion
+echo 13
+.\testbootstrap TheKeysValue -env:ININAME=./bootstraptest.ini -env:MYBOOTSTRAPTESTVALUE=${$ININAME:${$ININAME:SecondSection:IndirectSection}:${$ININAME:SecondSection:IndirectKey}}
+
+rem test no infinit recursion
+echo 14
+.\testbootstrap "***RECURSION DETECTED***" -env:MYBOOTSTRAPTESTVALUE=$MYBOOTSTRAPTESTVALUE
+
+rem test unicode
+echo 15
+.\testbootstrap AAABBBCCC000 -env:MYBOOTSTRAPTESTVALUE=\u0041\u0041\u0041\u0042\u0042\u0042\u0043\u0043\u0043\u0030\u0030\u0030
+
+
+@echo bootstrap test finished \ No newline at end of file
diff --git a/sal/test/bootstrap.pl b/sal/test/bootstrap.pl
new file mode 100755
index 000000000000..5f697e8b02cf
--- /dev/null
+++ b/sal/test/bootstrap.pl
@@ -0,0 +1,260 @@
+:
+eval 'exec perl -wS $0 ${1+"$@"}'
+ if 0;
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+
+my $rc;
+my $state = 1;
+my $comment = "";
+
+$ENV{MYBOOTSTRAPTESTVALUE}=0;
+
+$rc = system "./testbootstrap", 1, "-env:MYBOOTSTRAPTESTVALUE=1";
+if (!$rc) {
+ $comment = $comment . "commandline over environment test not passed\n";
+ $state = 0;
+}
+
+$rc = system "./testbootstrap", "0", "-env:INIFILENAME=";
+if (!$rc) {
+ $comment = $comment . "exe custom ini test not passed\n";
+ $state = 0;
+}
+
+delete $ENV{MYBOOTSTRAPTESTVALUE};
+
+$rc = system "./testbootstrap.bin", "file";
+if (!$rc) {
+ $comment = $comment . "extensions cut test not passed with .bin\n";
+ $state = 0;
+}
+
+$rc = system "./testbootstrap.Bin", "file";
+if (!$rc) {
+ $comment = $comment . "extensions cut test not passed with .Bin\n";
+ $state = 0;
+}
+
+$rc = system "./testbootstrap.exe", "file";
+if (!$rc) {
+ $comment = $comment . "extensions cut test not passed with .exe\n";
+ $state = 0;
+}
+
+$rc = system "./testbootstrap.Exe", "file";
+if (!$rc) {
+ $comment = $comment . "extensions cut test not passed with .Exe\n";
+ $state = 0;
+}
+
+if ($ENV{GUI} eq "WNT") {
+ $rc = system "./testbootstrap", "auxaux", "-env:iniName=ini.ini", '-env:MYBOOTSTRAPTESTVALUE=$CUSTOMINIVALUE';
+}
+else {
+ $rc = system "./testbootstrap", "auxaux", "-env:iniName=inirc", '-env:MYBOOTSTRAPTESTVALUE=$CUSTOMINIVALUE';
+}
+if (!$rc) {
+ $comment = $comment . "custom ini test not passed\n";
+ $state = 0;
+}
+
+if ($ENV{GUI} eq "WNT") {
+ $comment = $comment . '$SYSUSERHOME not testable under windows' . "\n";
+}
+else {
+ $rc = system "./testbootstrap", "file://$ENV{HOME}", '-env:MYBOOTSTRAPTESTVALUE=$SYSUSERHOME';
+ if (!$rc) {
+ $comment = $comment . '$SYSUSERHOME test not passed' . "\n";
+ $state = 0;
+ }
+}
+
+if ($ENV{GUI} eq "WNT") {
+ $comment = $comment . '$SYSUSERCONFIG' . " not testable under windows\n";
+}
+else {
+ $rc = system "./testbootstrap", "file://$ENV{HOME}", '-env:MYBOOTSTRAPTESTVALUE=$SYSUSERCONFIG';
+ if (!$rc) {
+ $comment = $comment . '$SYSUSERCONFIG test not passed' . "\n";
+ $state = 0;
+ }
+}
+
+if ($ENV{GUI} eq "WNT") {
+ $comment = $comment . '$SYSBINDIR' . " not testable under windows\n";
+}
+else {
+ $rc = system "./testbootstrap", "file://$ENV{PWD}", '-env:MYBOOTSTRAPTESTVALUE=$SYSBINDIR';
+ if (!$rc) {
+ $comment = $comment . '$SYSBINDIR test not passed' . "\n";
+ $state = 0;
+ }
+}
+
+if ($ENV{GUI} eq "WNT") {
+ $rc = system "./testbootstrap", "inherited_value", '-env:MYBOOTSTRAPTESTVALUE=$INHERITED_VALUE', "-env:iniName=ini.ini";
+}
+else {
+ $rc = system "./testbootstrap", "inherited_value", '-env:MYBOOTSTRAPTESTVALUE=$INHERITED_VALUE', "-env:iniName=inirc";
+}
+if (!$rc) {
+ $comment = $comment . "inherited value not passed\n";
+ $state = 0;
+}
+
+if ($ENV{GUI} eq "WNT") {
+ $rc = system "./testbootstrap", "not_overwritten", '-env:MYBOOTSTRAPTESTVALUE=$INHERITED_OVERWRITTEN_VALUE', "-env:iniName=ini.ini";
+}
+else {
+ $rc = system "./testbootstrap", "not_overwritten", '-env:MYBOOTSTRAPTESTVALUE=$INHERITED_OVERWRITTEN_VALUE', "-env:iniName=inirc";
+}
+if (!$rc) {
+ $comment = $comment . "inherited overwritten value not passed\n";
+ $state = 0;
+}
+
+
+$rc = system "./testbootstrap", "defaultvalue", "-env:INIFILENAME=", "-env:Default=defaultvalue", "-env:USEDEFAULT=1";
+if (!$rc) {
+ $comment = $comment . "default test from parameter not passed\n";
+ $state = 0;
+}
+
+if ($ENV{GUI} eq "WNT") {
+ $rc = system "./testbootstrap", "defaultValue", "-env:iniName=default.ini", "-env:INIFILENAME=", "-env:USEDEFAULT=1";
+}
+else {
+ $rc = system "./testbootstrap", "defaultValue", "-env:iniName=defaultrc", "-env:INIFILENAME=", "-env:USEDEFAULT=1";
+}
+if (!$rc) {
+ $comment = $comment . "default test from custom ini not passed\n";
+ $state = 0;
+}
+
+# simple macro expansion
+$rc = system "./testbootstrap",
+ "_first_second_third_",
+ "-env:FIRST=first",
+ "-env:SECOND=second",
+ "-env:THIRD=third",
+ '-env:MYBOOTSTRAPTESTVALUE=_${FIRST}_${SECOND}_${THIRD}_';
+if (!$rc) {
+ $comment = $comment . "simple macro expansion test not passed\n";
+ $state = 0;
+}
+
+# simple quoting
+$rc = system "./testbootstrap",
+ '_${FIRST}_${SECOND}_${THIRD}_',
+ "-env:FIRST=first",
+ "-env:SECOND=second",
+ "-env:THIRD=third",
+ '-env:MYBOOTSTRAPTESTVALUE=_\$\{FIRST\}_\$\{SECOND\}_\$\{THIRD\}_';
+if (!$rc) {
+ $comment = $comment . "simple macro quoting test not passed\n";
+ $state = 0;
+}
+
+# simple ini access
+$rc = system "./testbootstrap",
+ "TheIniKeysValue",
+ '-env:MYBOOTSTRAPTESTVALUE=${./bootstraptest.ini:TheIniKey}';
+if (!$rc) {
+ $comment = $comment . "simple macro ini access test not passed\n";
+ $state = 0;
+}
+
+# simple profile access
+$rc = system "./testbootstrap",
+ "TheKeysValue",
+ '-env:MYBOOTSTRAPTESTVALUE=${./bootstraptest.ini:TheSection:TheKey}';
+if (!$rc) {
+ $comment = $comment . "simple macro profile access test not passed\n";
+ $state = 0;
+}
+
+# profile access with simple macro expansion
+$rc = system "./testbootstrap",
+ "TheKeysValue",
+ "-env:ININAME=./bootstraptest.ini",
+ "-env:SECTIONNAME=TheSection",
+ "-env:KEYNAME=TheKey",
+ '-env:MYBOOTSTRAPTESTVALUE=${$ININAME:$SECTIONNAME:$KEYNAME}';
+if (!$rc) {
+ $comment = $comment . "profile access with simple macro expansion test not passed\n";
+ $state = 0;
+}
+
+# profile access with complex macro expansion
+$rc = system "./testbootstrap",
+ "TheKeysValue",
+ "-env:ININAME=./bootstraptest.ini",
+ '-env:MYBOOTSTRAPTESTVALUE=${$ININAME:${$ININAME:SecondSection:IndirectSection}:${$ININAME:SecondSection:IndirectKey}}';
+if (!$rc) {
+ $comment = $comment . "profile access with complex macro expansion test not passed\n";
+ $state = 0;
+}
+
+# test no infinit recursion
+if ($ENV{GUI} eq "WNT") {
+ $rc = system "./testbootstrap",
+ '"***RECURSION DETECTED***"',
+ '-env:MYBOOTSTRAPTESTVALUE=$MYBOOTSTRAPTESTVALUE';
+}
+else {
+ $rc = system "./testbootstrap",
+ '***RECURSION DETECTED***',
+ '-env:MYBOOTSTRAPTESTVALUE=$MYBOOTSTRAPTESTVALUE';
+}
+if (!$rc) {
+ $comment = $comment . "no infinit recursion test not passed\n";
+ $state = 0;
+}
+
+# test unicode
+$rc = system "./testbootstrap",
+ "AAABBBCCC000",
+ '-env:MYBOOTSTRAPTESTVALUE=\u0041\u0041\u0041\u0042\u0042\u0042\u0043\u0043\u0043\u0030\u0030\u0030';
+if (!$rc) {
+ $comment = $comment . "uncode not passed\n";
+ $state = 0;
+}
+
+print "**************************\n";
+if($state) {
+ print "****** tests passed ******\n";
+}
+else {
+ print "**** tests NOT passed ****\n";
+ print "Commnent:\n", $comment, "\n";
+}
+print "**************************\n";
+
+
+
diff --git a/sal/test/bootstraptest.ini b/sal/test/bootstraptest.ini
new file mode 100644
index 000000000000..c6569f367fe9
--- /dev/null
+++ b/sal/test/bootstraptest.ini
@@ -0,0 +1,11 @@
+TheIniKey=TheIniKeysValue
+
+
+[TheSection]
+TheKey=TheKeysValue
+
+[SecondSection]
+IndirectSection=TheSection
+IndirectKey=TheKey
+
+
diff --git a/sal/test/makefile.mk b/sal/test/makefile.mk
new file mode 100644
index 000000000000..6edba90ce6b9
--- /dev/null
+++ b/sal/test/makefile.mk
@@ -0,0 +1,152 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..
+
+PRJNAME=sal
+TARGET=saltest
+TARGETTYPE=CUI
+LIBTARGET=NO
+USE_LDUMP2=TRUE
+ENABLE_EXCEPTIONS=TRUE
+#LDUMP2=LDUMP3
+
+
+# --- Settings -----------------------------------------------------
+.INCLUDE : settings.mk
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+# ------------------------------------------------------------------
+
+.IF "$(GUI)"=="WNT"
+BOOTSTRAPSCRIPT=bootstrap.bat
+BOOTSTRAPINI=testbootstrap.ini
+MY_SCRIPTCAT=cat
+.ELSE
+BOOTSTRAPSCRIPT=bootstrap
+BOOTSTRAPINI=testbootstraprc
+MY_SCRIPTCAT=tr -d "\015" <
+.ENDIF
+
+APP2OBJS = $(OBJ)$/testbootstrap.obj
+
+OBJFILES= \
+ $(APP2OBJS)
+
+APP2TARGET = testbootstrap
+APP2STDLIBS = $(SALLIB)
+
+APP3OBJS = $(OBJ)$/test_salmain.obj
+APP3TARGET = test_salmain
+APP3STDLIBS = $(SALLIB)
+
+APP4OBJS = $(OBJ)$/test_salmainwithargs.obj
+APP4TARGET = test_salmainwithargs
+APP4STDLIBS = $(SALLIB)
+
+
+# --- Targets ------------------------------------------------------
+.IF "$(depend)" == ""
+ALL : ALLTAR \
+ $(BIN)$/$(BOOTSTRAPSCRIPT) \
+ $(BIN)$/$(BOOTSTRAPINI) \
+ $(BIN)$/bootstraptest.ini \
+ $(BIN)$/$(APP2TARGET).bin \
+ $(BIN)$/$(APP2TARGET).Bin \
+ $(BIN)$/$(APP2TARGET).Exe \
+ $(BIN)$/bootstrap.pl
+
+
+.IF "$(GUI)"=="UNX"
+ALL: $(BIN)$/$(APP2TARGET).exe \
+ $(BIN)$/inirc \
+ $(BIN)$/defaultrc
+
+$(BIN)$/$(APP2TARGET).exe : $(APP2TARGETN)
+ cp $(APP2TARGETN) $@
+
+$(BIN)$/inirc:
+ echo "CUSTOMINIVALUE=auxaux" > $@
+ echo "INHERITED_OVERWRITTEN_VALUE=inherited_overwritten_value" >> $@
+
+$(BIN)$/defaultrc:
+ echo "Default=defaultValue" > $@
+
+.ELSE
+
+ALL: $(BIN)$/ini.ini \
+ $(BIN)$/default.ini
+
+$(BIN)$/ini.ini:
+ echo CUSTOMINIVALUE=auxaux > $@
+ echo INHERITED_OVERWRITTEN_VALUE=inherited_overwritten_value >> $@
+
+
+$(BIN)$/default.ini:
+ echo Default=defaultValue > $@
+
+.ENDIF
+
+$(BIN)$/bootstrap.pl:
+ cp bootstrap.pl $@
+
+$(BIN)$/$(APP2TARGET).bin : $(APP2TARGETN)
+ cp $(APP2TARGETN) $@
+
+$(BIN)$/$(APP2TARGET).Bin : $(APP2TARGETN)
+ cp $(APP2TARGETN) $@
+
+$(BIN)$/$(APP2TARGET).Exe : $(APP2TARGETN)
+ cp $(APP2TARGETN) $@
+
+.ELSE
+ALL: ALLDEP
+.ENDIF
+
+.INCLUDE : target.mk
+
+
+$(BIN)$/$(BOOTSTRAPSCRIPT) : $(BOOTSTRAPSCRIPT)
+ $(MY_SCRIPTCAT) $(BOOTSTRAPSCRIPT) > $@
+.IF "$(GUI)"!="WNT"
+ chmod ug+x $@
+.ENDIF
+
+$(BIN)$/$(BOOTSTRAPINI) : $(APP2TARGET).ini
+ $(MY_SCRIPTCAT) $(APP2TARGET).ini > $@
+
+$(BIN)$/bootstraptest.ini : bootstraptest.ini
+ $(MY_SCRIPTCAT) bootstraptest.ini > $@
+
+
+# --- SO2-Filter-Datei ---
+$(MISC)$/tsl$(DLLPOSTFIX).flt:
+ @echo ------------------------------
+ @echo Making: $@
+ @echo WEP>$@
+ @echo LIBMAIN>>$@
+ @echo LibMain>>$@
diff --git a/sal/test/test_salmain.cxx b/sal/test/test_salmain.cxx
new file mode 100644
index 000000000000..24cfb1cf56b9
--- /dev/null
+++ b/sal/test/test_salmain.cxx
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "sal/main.h"
+
+#include <stdio.h>
+
+
+SAL_IMPLEMENT_MAIN()
+{
+ fprintf(stderr, "success!\n");
+
+ return 0;
+}
diff --git a/sal/test/test_salmainwithargs.cxx b/sal/test/test_salmainwithargs.cxx
new file mode 100644
index 000000000000..420a235313e8
--- /dev/null
+++ b/sal/test/test_salmainwithargs.cxx
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "sal/main.h"
+
+#include <stdio.h>
+
+
+SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv)
+{
+ fprintf(stderr, "argc: %i argv: %p - success!\n", argc, argv);
+
+ return 0;
+}
diff --git a/sal/test/testbootstrap.cxx b/sal/test/testbootstrap.cxx
new file mode 100644
index 000000000000..757b877d4db5
--- /dev/null
+++ b/sal/test/testbootstrap.cxx
@@ -0,0 +1,134 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+#include <stdio.h>
+
+#include <rtl/process.h>
+#include <rtl/bootstrap.hxx>
+#include <rtl/string.hxx>
+#include <rtl/byteseq.hxx>
+
+#include <osl/process.h>
+
+using namespace ::rtl;
+
+
+int main( int argc, char *argv[] )
+{
+ osl_setCommandArgs (argc, argv);
+
+ sal_Int32 nCount = rtl_getAppCommandArgCount();
+
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stdout, "rtl-commandargs (%d) real args:%i ", nCount, argc);
+ for( sal_Int32 i = 0 ; i < nCount ; i ++ )
+ {
+ OUString data;
+ rtl_getAppCommandArg( i , &(data.pData) );
+ OString o = OUStringToOString( data, RTL_TEXTENCODING_ASCII_US );
+ fprintf( stdout, " %s", o.getStr() );
+ }
+ fprintf( stdout, "\n" );
+#endif
+
+ if( nCount == 0 )
+ {
+ printf( "usage : testbootstrap <checkedValueOfMyBootstrapValue>\n" );
+ exit( 1 );
+ }
+
+
+ OUString iniName;
+ Bootstrap::get(OUString(RTL_CONSTASCII_USTRINGPARAM("iniName")), iniName, OUString());
+
+#if OSL_DEBUG_LEVEL > 1
+ if(iniName.getLength())
+ {
+ OString tmp_iniName = OUStringToOString(iniName, RTL_TEXTENCODING_ASCII_US);
+ fprintf(stderr, "using ini: %s\n", tmp_iniName.getStr());
+ }
+#endif
+
+ Bootstrap bootstrap(iniName);
+
+
+ OUString name( RTL_CONSTASCII_USTRINGPARAM( "MYBOOTSTRAPTESTVALUE" ));
+ OUString myDefault( RTL_CONSTASCII_USTRINGPARAM("$Default"));
+
+ OUString value;
+ sal_Bool useDefault;
+
+ OUString aDummy;
+ useDefault = bootstrap.getFrom(OUString(RTL_CONSTASCII_USTRINGPARAM("USEDEFAULT")), aDummy);
+
+ sal_Bool result = sal_False;
+ sal_Bool found = sal_True;
+
+ if(useDefault)
+ bootstrap.getFrom(name, value, myDefault);
+
+ else
+ found = bootstrap.getFrom(name, value);
+
+ if(found)
+ {
+ OUString para(OUString::createFromAscii( argv[1] ));
+
+ result = para == value;
+
+ if(!result)
+ {
+ OString para_tmp = OUStringToOString(para, RTL_TEXTENCODING_ASCII_US);
+ OString value_tmp = OUStringToOString(value, RTL_TEXTENCODING_ASCII_US);
+
+ fprintf(stderr, "para(%s) != value(%s)\n", para_tmp.getStr(), value_tmp.getStr());
+ }
+ }
+ else
+ fprintf(stderr, "bootstrap parameter couldn't be found\n");
+
+ // test the default case
+ name = OUString( RTL_CONSTASCII_USTRINGPARAM( "no_one_has_set_this_name" ) );
+ OSL_ASSERT( ! bootstrap.getFrom( name, value ) );
+ result = result && !bootstrap.getFrom( name, value );
+
+ myDefault = OUString( RTL_CONSTASCII_USTRINGPARAM( "1" ) );
+ OUString myDefault2 = OUString( RTL_CONSTASCII_USTRINGPARAM( "2" ) );
+
+ bootstrap.getFrom( name, value, myDefault );
+ OSL_ASSERT( value == myDefault );
+ result = result && (value == myDefault);
+
+ bootstrap.getFrom( name, value, myDefault2 );
+ OSL_ASSERT( value == myDefault2 );
+ result = result && (value == myDefault2);
+
+ return result;
+}
diff --git a/sal/test/testbootstrap.ini b/sal/test/testbootstrap.ini
new file mode 100644
index 000000000000..2cf7b667cd91
--- /dev/null
+++ b/sal/test/testbootstrap.ini
@@ -0,0 +1,4 @@
+MYBOOTSTRAPTESTVALUE=file
+INHERITED_VALUE=inherited_value
+INHERITED_OVERWRITTEN_VALUE=not_overwritten
+
diff --git a/sal/test/unloading/exports.dxp b/sal/test/unloading/exports.dxp
new file mode 100644
index 000000000000..82adf8e8be12
--- /dev/null
+++ b/sal/test/unloading/exports.dxp
@@ -0,0 +1,4 @@
+component_getImplementationEnvironment
+component_writeInfo
+component_getFactory
+component_canUnload
diff --git a/sal/test/unloading/makefile.mk b/sal/test/unloading/makefile.mk
new file mode 100644
index 000000000000..6c6f6f74f058
--- /dev/null
+++ b/sal/test/unloading/makefile.mk
@@ -0,0 +1,126 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..
+
+PRJNAME= sal
+TARGET= unloading
+TARGET1=samplelib1
+TARGET2=samplelib2
+#LIBTARGET=NO
+TARGETTYPE=CUI
+COMP1TYPELIST=$(TARGET1)
+
+NO_BSYMBOLIC= TRUE
+ENABLE_EXCEPTIONS=TRUE
+
+USE_DEFFILE= TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+UNOUCRDEP=$(SOLARBINDIR)$/udkapi.rdb
+UNOUCRRDB=$(SOLARBINDIR)$/udkapi.rdb
+
+CPPUMAKERFLAGS =
+
+.IF "$(BOOTSTRAP_SERVICE)" == "TRUE"
+UNOUCROUT= $(OUT)$/inc$/bootstrap
+INCPRE+= $(OUT)$/inc$/bootstrap
+.ELSE
+.IF "$(COM)" == "MSC"
+CPPUMAKERFLAGS = -L
+.ENDIF
+UNOUCROUT= $(OUT)$/inc$/light
+INCPRE+= $(OUT)$/inc$/light
+.ENDIF
+
+
+#SLOFILES= \
+# $(SLO)$/samplelib1.obj \
+# $(SLO)$/samplelib2.obj
+
+LIB1TARGET=$(SLB)$/$(TARGET1).lib
+LIB1OBJFILES= \
+ $(SLO)$/samplelib1.obj
+
+SHL1TARGET= $(TARGET1)
+
+SHL1STDLIBS= \
+ $(CPPULIB) \
+ $(CPPUHELPERLIB) \
+ $(SALLIB)
+
+
+
+SHL1DEPN=
+#SHL1IMPLIB= i$(TARGET1)
+SHL1LIBS= $(SLB)$/$(TARGET1).lib
+SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+DEF1EXPORTFILE= exports.dxp
+DEF1NAME= $(SHL1TARGET)
+#-------------------------------------------------------
+
+LIB2TARGET=$(SLB)$/$(TARGET2).lib
+LIB2OBJFILES= \
+ $(SLO)$/samplelib2.obj
+
+SHL2TARGET= $(TARGET2)
+
+SHL2STDLIBS= \
+ $(CPPULIB) \
+ $(CPPUHELPERLIB) \
+ $(SALLIB)
+
+SHL2DEPN=
+SHL2LIBS= $(SLB)$/$(TARGET2).lib
+SHL2DEF= $(MISC)$/$(SHL2TARGET).def
+DEF2EXPORTFILE= exports.dxp
+DEF2NAME= $(SHL2TARGET)
+
+# ------------------------------------------------------------------
+
+APP1NOSAL=TRUE
+
+APP1TARGET= $(TARGET)
+
+APP1OBJS= $(OBJ)$/unloadTest.obj
+
+APP1STDLIBS= \
+ $(SALLIB) \
+ $(CPPUHELPERLIB) \
+ $(CPPULIB)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
diff --git a/sal/test/unloading/readme.txt b/sal/test/unloading/readme.txt
new file mode 100644
index 000000000000..7fae8850c1be
--- /dev/null
+++ b/sal/test/unloading/readme.txt
@@ -0,0 +1,14 @@
+The test program test the unloading API, and the default factories from cppuhelper
+for their new XUnloadingPreference interface.
+
+The makefile produces the executable unloading.exe as wells as two
+libraries, samplelib1 and samplelib2, which contain services.
+
+
+Usage:
+ Copy unloading, samplelib1, samplelib2 into the program directory
+of an office.
+
+Register samplelib1 and samplelib2 with regcomp
+
+Run unloading. \ No newline at end of file
diff --git a/sal/test/unloading/samplelib1.cxx b/sal/test/unloading/samplelib1.cxx
new file mode 100644
index 000000000000..d4632f3beb80
--- /dev/null
+++ b/sal/test/unloading/samplelib1.cxx
@@ -0,0 +1,269 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <sal/types.h>
+#include <osl/time.h>
+#include <rtl/ustring.hxx>
+#include <uno/environment.h>
+#include <cppu/macros.hxx>
+#include <cppuhelper/factory.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <cppuhelper/implbase1.hxx>
+#include <rtl/unload.h>
+#include <rtl/string.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/registry/XRegistryKey.hpp>
+
+using namespace ::com::sun::star::registry;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::rtl;
+using namespace ::cppu;
+
+#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest1"
+#define SERVICENAME1 "com.sun.star.UnloadingTest1"
+#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest2"
+#define SERVICENAME2 "com.sun.star.UnloadingTest2"
+#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest3"
+#define SERVICENAME3 "com.sun.star.UnloadingTest3"
+#define IMPLNAME4 "com.sun.star.comp.sal.OneInstanceTest"
+#define SERVICENAME4 "com.sun.star.OneInstanceTest"
+
+
+// Unloading Support ----------------------------------------------
+rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT;
+//rtl_StandardModuleCount globalModuleCount= { {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload,0,{0,0}}; //, 0, {0, 0}};
+// Services -------------------------------------------------------
+class TestService: public WeakImplHelper1<XServiceInfo>
+{
+OUString m_implName;
+OUString m_serviceName;
+public:
+ TestService( OUString implName, OUString serviceName);
+ ~TestService();
+ virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException);
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException);
+ virtual Sequence<OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException);
+};
+
+TestService::TestService( OUString implName, OUString serviceName):
+ m_implName(implName),m_serviceName(serviceName)
+{ // Library unloading support
+ globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt);
+}
+
+TestService::~TestService()
+{ // Library unloading support
+ globalModuleCount.modCnt.release( &globalModuleCount.modCnt);
+}
+
+OUString SAL_CALL TestService::getImplementationName( ) throw (RuntimeException)
+{
+ return m_implName;
+}
+sal_Bool SAL_CALL TestService::supportsService( const OUString& ServiceName ) throw (RuntimeException)
+{
+ return ServiceName.equals( m_serviceName);
+}
+Sequence<OUString > SAL_CALL TestService::getSupportedServiceNames( ) throw (RuntimeException)
+{
+ return Sequence<OUString>( &m_serviceName, 1);
+}
+
+
+// Creator functions for Services -------------------------------------------------
+static Reference<XInterface> SAL_CALL test1_createInstance(const Reference<XMultiServiceFactory> & rSMgr)
+ throw (RuntimeException)
+{
+ return Reference<XInterface>( static_cast<XWeak*>( new TestService(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1)),
+ OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1)) )), UNO_QUERY);
+}
+static Reference<XInterface> SAL_CALL test2_createInstance(const Reference<XMultiServiceFactory> & rSMgr)
+ throw (RuntimeException)
+{
+ return Reference<XInterface>( static_cast<XWeak*>( new TestService(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2)),
+ OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2)) )), UNO_QUERY);
+}
+static Reference<XInterface> SAL_CALL test3_createInstance(const Reference<XMultiServiceFactory> & rSMgr)
+ throw (RuntimeException)
+{
+ return Reference<XInterface>( static_cast<XWeak*>( new TestService(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3)),
+ OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3)) )), UNO_QUERY);
+}
+static Reference<XInterface> SAL_CALL test4_createInstance(const Reference<XMultiServiceFactory> & rSMgr)
+ throw (RuntimeException)
+{
+ return Reference<XInterface>( static_cast<XWeak*>( new TestService(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME4)),
+ OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4)) )), UNO_QUERY);
+}
+
+
+// Standard UNO library interface -------------------------------------------------
+extern "C" {
+ void SAL_CALL component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv){
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+ }
+
+ sal_Bool SAL_CALL component_writeInfo(void * pServiceManager, void * pRegistryKey) throw()
+ {
+ if (pRegistryKey)
+ {
+ try
+ {
+ Reference< XRegistryKey > xNewKey(
+ reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+ OUString::createFromAscii( "/" IMPLNAME1 "/UNO/SERVICES" ) ) );
+
+ xNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1)));
+
+ xNewKey=
+ reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+ OUString::createFromAscii( "/" IMPLNAME2 "/UNO/SERVICES" ) );
+
+ xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2)));
+ xNewKey=
+ reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+ OUString::createFromAscii( "/" IMPLNAME3 "/UNO/SERVICES" ) );
+
+ xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3)));
+
+ xNewKey=
+ reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+ OUString::createFromAscii( "/" IMPLNAME4 "/UNO/SERVICES" ) );
+
+ xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4)));
+ return sal_True;
+ }
+ catch (InvalidRegistryException &)
+ {
+ OSL_ENSURE( sal_False, "### InvalidRegistryException!" );
+ }
+ }
+ return sal_False;
+ }
+
+ void * SAL_CALL component_getFactory(const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey) throw()
+ {
+ void * pRet = 0;
+
+
+ OUString implname1( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1) );
+ OUString serviceName1( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1) );
+ OUString implname2( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2) );
+ OUString serviceName2( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2) );
+ OUString implname3( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3) );
+ OUString serviceName3( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3) );
+ OUString implname4( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME4) );
+ OUString serviceName4( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4) );
+
+ if (implname1.equals( OUString::createFromAscii(pImplName)))
+ {
+ Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager);
+ Reference<XSingleServiceFactory> xFactory( createSingleFactory(
+ reinterpret_cast<XMultiServiceFactory *>(pServiceManager),
+ implname1,
+ test1_createInstance,
+ Sequence<OUString>( &serviceName1, 1),
+ &globalModuleCount.modCnt
+ ));
+
+ if (xFactory.is())
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ }
+ else if( implname2.equals( OUString::createFromAscii(pImplName)))
+ {
+ Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager);
+ Reference<XSingleServiceFactory> xFactory( createSingleFactory(
+ reinterpret_cast<XMultiServiceFactory *>(pServiceManager),
+ implname2,
+ test2_createInstance,
+ Sequence<OUString>( &serviceName2, 1),
+ &globalModuleCount.modCnt
+ ));
+
+ if (xFactory.is())
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ }
+ else if( implname3.equals( OUString::createFromAscii(pImplName)))
+ {
+ Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager);
+ Reference<XSingleServiceFactory> xFactory( createSingleFactory(
+ reinterpret_cast<XMultiServiceFactory *>(pServiceManager),
+ implname3,
+ test3_createInstance,
+ Sequence<OUString>( &serviceName3, 1),
+ &globalModuleCount.modCnt
+ ));
+
+ if (xFactory.is())
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ }
+ else if( implname4.equals( OUString::createFromAscii(pImplName)))
+ {
+ Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager);
+ Reference<XSingleServiceFactory> xFactory( createOneInstanceFactory(
+ reinterpret_cast<XMultiServiceFactory *>(pServiceManager),
+ implname3,
+ test4_createInstance,
+ Sequence<OUString>( &serviceName3, 1),
+ &globalModuleCount.modCnt
+ ));
+
+ if (xFactory.is())
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ }
+ return pRet;
+ }
+
+ sal_Bool component_canUnload( TimeValue* libUnused)
+ {
+ return globalModuleCount.canUnload( &globalModuleCount, libUnused);
+ }
+}
diff --git a/sal/test/unloading/samplelib1.xml b/sal/test/unloading/samplelib1.xml
new file mode 100644
index 000000000000..da1d0640a4bb
--- /dev/null
+++ b/sal/test/unloading/samplelib1.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module-description PUBLIC "-//StarOffice//DTD ComponentDescription 1.0//EN" "module-description.dtd">
+<module-description xmlns:xlink="http://www.w3.org/1999/xlink">
+ <module-name> samplelib1 </module-name>
+ <component-description>
+ <author> Joachim Lingner </author>
+ <name> com.sun.star.comp.stoc.JavaVirtualMachine </name>
+ <description>
+ </description>
+ <loader-name> com.sun.star.loader.SharedLibrary </loader-name>
+ <language> c++ </language>
+ <status value="final"/>
+ <supported-service> com.sun.star.Unloading1 </supported-service>
+ <service-dependency> ... </service-dependency>
+ <type> com.sun.star.lang.XSingleComponentFactory </type>
+ <type> com.sun.star.lang.XComponent </type>
+ <type> com.sun.star.container.XNameAccess </type>
+ <type> com.sun.star.container.XContentEnumerationAccess </type>
+ <type> com.sun.star.container.XEnumeration </type>
+ <type> com.sun.star.lang.XTypeProvider </type>
+ <type> com.sun.star.lang.XServiceInfo </type>
+ <type> com.sun.star.lang.XSingleServiceFactory </type>
+ <type> com.sun.star.lang.XMultiServiceFactory </type>
+ <type> com.sun.star.registry.XSimpleRegistry </type>
+ <type> com.sun.star.lang.XSingleComponentFactory </type>
+ <type> com.sun.star.uno.XComponentContext </type>
+ <type> com.sun.star.uno.XUnloadingPreference </type>
+ <type> com.sun.star.uno.XAggregation </type>
+ <type> com.sun.star.uno.XWeak </type>
+ <type> com.sun.star.uno.TypeClass </type>
+ <type> com.sun.star.beans.XPropertySet </type>
+ </component-description>
+ <project-build-dependency> cppuhelper </project-build-dependency>
+ <project-build-dependency> cppu </project-build-dependency>
+ <project-build-dependency> tools </project-build-dependency>
+ <project-build-dependency> sal </project-build-dependency>
+ <runtime-module-dependency> cppuhelper3$(COM) </runtime-module-dependency>
+ <runtime-module-dependency> cppu3 </runtime-module-dependency>
+ <runtime-module-dependency> tl(COM) </runtime-module-dependency>
+ <runtime-module-dependency> sal3 </runtime-module-dependency>
+</module-description>
diff --git a/sal/test/unloading/samplelib2.cxx b/sal/test/unloading/samplelib2.cxx
new file mode 100644
index 000000000000..0ac6e0b5209a
--- /dev/null
+++ b/sal/test/unloading/samplelib2.cxx
@@ -0,0 +1,236 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <sal/types.h>
+#include <osl/time.h>
+#include <rtl/ustring.hxx>
+#include <uno/environment.h>
+#include <cppu/macros.hxx>
+#include <cppuhelper/factory.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <cppuhelper/implbase1.hxx>
+#include <rtl/unload.h>
+#include <rtl/string.hxx>
+#include <rtl/ustrbuf.hxx>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/registry/XRegistryKey.hpp>
+
+using namespace ::com::sun::star::registry;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::rtl;
+using namespace ::cppu;
+
+#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest21"
+#define SERVICENAME1 "com.sun.star.UnloadingTest21"
+#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest22"
+#define SERVICENAME2 "com.sun.star.UnloadingTest22"
+#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest23"
+#define SERVICENAME3 "com.sun.star.UnloadingTest23"
+
+// Unloading Support ----------------------------------------------
+rtl_StandardModuleCount globalModuleCount= MODULE_COUNT_INIT;
+//rtl_StandardModuleCount globalModuleCount= { {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload,0,{0,0}}; //, 0, {0, 0}};
+// Services -------------------------------------------------------
+class TestService: public WeakImplHelper1<XServiceInfo>
+{
+OUString m_implName;
+OUString m_serviceName;
+public:
+ TestService( OUString implName, OUString serviceName);
+ ~TestService();
+ virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException);
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException);
+ virtual Sequence<OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException);
+};
+
+TestService::TestService( OUString implName, OUString serviceName):
+ m_implName(implName),m_serviceName(serviceName)
+{ // Library unloading support
+ globalModuleCount.modCnt.acquire( &globalModuleCount.modCnt);
+}
+
+TestService::~TestService()
+{ // Library unloading support
+ globalModuleCount.modCnt.release( &globalModuleCount.modCnt);
+}
+
+OUString SAL_CALL TestService::getImplementationName( ) throw (RuntimeException)
+{
+ return m_implName;
+}
+sal_Bool SAL_CALL TestService::supportsService( const OUString& ServiceName ) throw (RuntimeException)
+{
+ return ServiceName.equals( m_serviceName);
+}
+Sequence<OUString > SAL_CALL TestService::getSupportedServiceNames( ) throw (RuntimeException)
+{
+ return Sequence<OUString>( &m_serviceName, 1);
+}
+
+
+// Creator functions for Services -------------------------------------------------
+static Reference<XInterface> SAL_CALL test21_createInstance(const Reference<XMultiServiceFactory> & rSMgr)
+ throw (RuntimeException)
+{
+ return Reference<XInterface>( static_cast<XWeak*>( new TestService(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1)),
+ OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1)) )), UNO_QUERY);
+}
+static Reference<XInterface> SAL_CALL test22_createInstance(const Reference<XMultiServiceFactory> & rSMgr)
+ throw (RuntimeException)
+{
+ return Reference<XInterface>( static_cast<XWeak*>( new TestService(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2)),
+ OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2)) )), UNO_QUERY);
+}
+static Reference<XInterface> SAL_CALL test23_createInstance(const Reference<XMultiServiceFactory> & rSMgr)
+ throw (RuntimeException)
+{
+ return Reference<XInterface>( static_cast<XWeak*>( new TestService(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3)),
+ OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3)) )), UNO_QUERY);
+}
+
+
+// Standard UNO library interface -------------------------------------------------
+extern "C" {
+ void SAL_CALL component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName, uno_Environment ** ppEnv){
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+ }
+
+ sal_Bool SAL_CALL component_writeInfo(void * pServiceManager, void * pRegistryKey) throw()
+ {
+ if (pRegistryKey)
+ {
+ try
+ {
+ Reference< XRegistryKey > xNewKey(
+ reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+ OUString::createFromAscii( "/" IMPLNAME1 "/UNO/SERVICES" ) ) );
+
+ xNewKey->createKey( OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1)));
+
+ xNewKey=
+ reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+ OUString::createFromAscii( "/" IMPLNAME2 "/UNO/SERVICES" ) );
+
+ xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2)));
+ xNewKey=
+ reinterpret_cast< XRegistryKey * >( pRegistryKey )->createKey(
+ OUString::createFromAscii( "/" IMPLNAME3 "/UNO/SERVICES" ) );
+
+ xNewKey->createKey(OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3)));
+
+ return sal_True;
+ }
+ catch (InvalidRegistryException &)
+ {
+ OSL_ENSURE( sal_False, "### InvalidRegistryException!" );
+ }
+ }
+ return sal_False;
+ }
+
+ void * SAL_CALL component_getFactory(const sal_Char * pImplName, void * pServiceManager, void * pRegistryKey) throw()
+ {
+ void * pRet = 0;
+
+
+ OUString implname1( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME1) );
+ OUString serviceName1( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME1) );
+ OUString implname2( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME2) );
+ OUString serviceName2( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME2) );
+ OUString implname3( RTL_CONSTASCII_USTRINGPARAM( IMPLNAME3) );
+ OUString serviceName3( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME3) );
+
+ if (implname1.equals( OUString::createFromAscii(pImplName)))
+ {
+ Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager);
+ Reference<XSingleServiceFactory> xFactory( createSingleFactory(
+ reinterpret_cast<XMultiServiceFactory *>(pServiceManager),
+ implname1,
+ test21_createInstance,
+ Sequence<OUString>( &serviceName1, 1),
+ &globalModuleCount.modCnt
+ ));
+
+ if (xFactory.is())
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ }
+ else if( implname2.equals( OUString::createFromAscii(pImplName)))
+ {
+ Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager);
+ Reference<XSingleServiceFactory> xFactory( createSingleFactory(
+ reinterpret_cast<XMultiServiceFactory *>(pServiceManager),
+ implname2,
+ test22_createInstance,
+ Sequence<OUString>( &serviceName2, 1),
+ &globalModuleCount.modCnt
+ ));
+
+ if (xFactory.is())
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ }
+ else if( implname3.equals( OUString::createFromAscii(pImplName)))
+ {
+ Reference<XMultiServiceFactory> mgr= reinterpret_cast<XMultiServiceFactory *>(pServiceManager);
+ Reference<XSingleServiceFactory> xFactory( createSingleFactory(
+ reinterpret_cast<XMultiServiceFactory *>(pServiceManager),
+ implname3,
+ test23_createInstance,
+ Sequence<OUString>( &serviceName3, 1),
+ &globalModuleCount.modCnt
+ ));
+
+ if (xFactory.is())
+ {
+ xFactory->acquire();
+ pRet = xFactory.get();
+ }
+ }
+
+ return pRet;
+ }
+
+ sal_Bool component_canUnload( TimeValue* libUnused)
+ {
+ return globalModuleCount.canUnload( &globalModuleCount, libUnused);
+ }
+}
diff --git a/sal/test/unloading/unloadTest.cxx b/sal/test/unloading/unloadTest.cxx
new file mode 100644
index 000000000000..d8589ab76717
--- /dev/null
+++ b/sal/test/unloading/unloadTest.cxx
@@ -0,0 +1,656 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include<osl/module.hxx>
+#include <osl/time.h>
+#include <rtl/ustring.hxx>
+#include <stdio.h>
+#include <cppuhelper/factory.hxx>
+#include <cppuhelper/servicefactory.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/uno/XComponentContext.hpp>
+#include <com/sun/star/uno/XUnloadingPreference.hpp>
+#include <com/sun/star/lang/XTypeProvider.hpp>
+#include <com/sun/star/container/XContentEnumerationAccess.hpp>
+
+#include <stdio.h>
+using namespace ::rtl;
+using namespace ::osl;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::cppu;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::container;
+
+#define IMPLNAME1 "com.sun.star.comp.sal.UnloadingTest1"
+#define SERVICENAME1 "com.sun.star.UnloadingTest1"
+#define IMPLNAME2 "com.sun.star.comp.sal.UnloadingTest2"
+#define SERVICENAME2 "com.sun.star.UnloadingTest2"
+#define IMPLNAME3 "com.sun.star.comp.sal.UnloadingTest3"
+#define SERVICENAME3 "com.sun.star.UnloadingTest3"
+#define IMPLNAME4 "com.sun.star.comp.sal.OneInstanceTest"
+#define SERVICENAME4 "com.sun.star.OneInstanceTest"
+
+#define IMPLNAME21 "com.sun.star.comp.sal.UnloadingTest21"
+#define SERVICENAME21 "com.sun.star.UnloadingTest21"
+#define IMPLNAME22 "com.sun.star.comp.sal.UnloadingTest22"
+#define SERVICENAME22 "com.sun.star.UnloadingTest22"
+#define IMPLNAME23 "com.sun.star.comp.sal.UnloadingTest23"
+#define SERVICENAME23 "com.sun.star.UnloadingTest23"
+
+#ifdef UNX
+#define LIBRARY1 "libsamplelib1.so"
+#define LIBRARY2 "libsamplelib2.so"
+#elif defined WNT
+#define LIBRARY1 "samplelib1"
+#define LIBRARY2 "samplelib2"
+#endif
+/*
+Tested: rtl_registerModuleForUnloading, rtl_unregisterModuleForUnloading, rtl_unloadUnusedLibraries
+ 1 component.
+
+next: Test with multiple components
+ Listener mechanism.
+*/
+
+sal_Bool test1();
+sal_Bool test2();
+sal_Bool test3();
+sal_Bool test4();
+sal_Bool test5();
+sal_Bool test6();
+sal_Bool test7();
+sal_Bool test8();
+sal_Bool test9();
+void SAL_CALL listenerCallback( void* id);
+
+int main(int argc, char* argv[])
+{
+ // Test if the servicemanager can be created and if the sample libs
+ // can be loaded
+// Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+// OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+// if( !serviceManager.is())
+// {
+// printf("\n ####################################################\n"
+// "Error: could not create service manager. \n"
+// "Is the executable in the office program directory?\n");
+// return -1;
+// }
+
+// Reference<XInterface> xint1= serviceManager->createInstance( OUString(
+// RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
+
+// if( !xint1.is())
+// {
+// printf("\n ###################################################\n"
+// "Error: could not create service from samplelib1\n"
+// "Is samplelib1 in the office program directory and is it "
+// "registered?\n");
+// return -1;
+// }
+// Reference<XInterface> xint2= serviceManager->createInstance( OUString(
+// RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
+// if( !xint2.is())
+// {
+// printf("\n ###################################################"
+// "Error: could not create service from samplelib2\n"
+// "Is samplelib2 in the office program directory and is it "
+// "registered?\n");
+// return -1;
+// }
+// //destroy servicemanager
+// Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
+// Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
+// Reference<XComponentContext> xContext;
+// any_prop >>= xContext;
+// Reference<XComponent> xComponent( xContext, UNO_QUERY);
+// xComponent->dispose();
+
+// //unload samplelib1 and samplelib2. We need the handles, therefore load
+// // the libs
+// OUString libname1( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+// OUString libname2( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
+// oslModule m1= osl_loadModule(libname1.pData, 0);
+// oslModule m2= osl_loadModule(libname2.pData, 0);
+// osl_unloadModule( m1);
+// osl_unloadModule( m1);
+// osl_unloadModule( m2);
+// osl_unloadModule( m2);
+
+
+ sal_Bool ret1= test1();
+ if( ret1) printf( "\n Test 1 successful \n");
+ else printf("\n !!!!!! Test 1 failed\n");
+ sal_Bool ret2= test2();
+ if( ret2) printf( "\n Test 2 successful \n");
+ else printf("\n !!!!!! Test 2 failed\n");
+ sal_Bool ret3= test3();
+ if( ret3) printf( "\n Test 3 successful \n");
+ else printf("\n !!!!!! Test 3 failed\n");
+ sal_Bool ret4= test4();
+ if( ret4) printf( "\n Test 4 successful \n");
+ else printf("\n !!!!!! Test 4 failed\n");
+ sal_Bool ret5= test5();
+ if( ret5) printf( "\n Test 5 successful \n");
+ else printf("\n !!!!!! Test 5 failed\n");
+ // takes some time (10s)
+ sal_Bool ret6= test6();
+ sal_Bool ret7= test7(); // prints message itself
+ sal_Bool ret8= test8();
+ if( ret8) printf( "\n Test 8 successful \n");
+ else printf("\n !!!!!! Test 8 failed\n");
+ sal_Bool ret9= test9();
+ if( ret9) printf( "\n Test 9 successful: service manager is unloading listener\n");
+ else printf("\n !!!!! Test 9 failed\n");
+
+ return 0;
+}
+
+/* Create an instance of SERVICENAME1, call a function and unload module.
+ This tests the loader and basic functionality.
+ The library will be loaded once manually and the handle will be stored.
+ Then the library will be unloaded. After rtl_unloadUnusedLibraries we try to
+ get a symbol of the unloaded lib. If this fails then the test is successful.
+*/
+sal_Bool test1()
+{
+ printf("Test 1 ####################################################\n");
+ oslModule handleMod=0;
+ OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+ {
+ Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+ Reference<XInterface> xint= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
+
+ // get the handle
+ handleMod= osl_loadModule( lib1Name.pData, 0);
+ osl_unloadModule( handleMod);
+ xint=0;
+
+ Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
+ Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
+ Reference<XComponentContext> xContext;
+ any_prop >>= xContext;
+ Reference<XComponent> xComponent( xContext, UNO_QUERY);
+ xComponent->dispose();
+ }
+ rtl_unloadUnusedModules( NULL);
+
+ // Try to get a symbol, must fail
+ OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
+ void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
+
+ if( !pSymbol)
+ return sal_True;
+ return sal_False;
+}
+
+/* Multipe loadModule + rtl_registerModuleForUnloading.
+The module will be registered as often as it has been loaded.
+*/
+sal_Bool test2()
+{
+ printf("Test 2 ####################################################\n");
+ oslModule handleMod=0;
+ OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+ {
+ Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+
+ Reference<XInterface> xint= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
+
+ handleMod= osl_loadModule( lib1Name.pData, 0);
+ osl_unloadModule( handleMod);
+ //-----------------------------------------------------------
+ oslModule mod1= osl_loadModule( lib1Name.pData, 0);
+ oslModule mod2= osl_loadModule( lib1Name.pData, 0);
+ oslModule mod3= osl_loadModule( lib1Name.pData, 0);
+
+ rtl_registerModuleForUnloading(mod1);
+ rtl_registerModuleForUnloading(mod2);
+ rtl_registerModuleForUnloading(mod3);
+ // ----------------------------------------------------------
+ Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
+ Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
+ Reference<XComponentContext> xContext;
+ any_prop >>= xContext;
+ Reference<XComponent> xComponent( xContext, UNO_QUERY);
+ xComponent->dispose();
+ }
+ rtl_unloadUnusedModules( NULL);
+
+ // Try to get a symbol, must fail
+ OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
+ void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
+
+ if( !pSymbol)
+ return sal_True;
+ return sal_False;
+}
+
+/* Multipe loadModule + rtl_registerModuleForUnloading.
+The module will be registered one time less as it has been loaded.
+*/
+sal_Bool test3()
+{
+ printf("Test 3 ####################################################\n");
+ oslModule handleMod=0;
+ sal_Bool retval=sal_False;
+ OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+ {
+ Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+
+ Reference<XInterface> xint= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
+
+ handleMod= osl_loadModule( lib1Name.pData, 0);
+ osl_unloadModule( handleMod);
+ //-----------------------------------------------------------
+ oslModule mod1= osl_loadModule( lib1Name.pData, 0);
+ oslModule mod2= osl_loadModule( lib1Name.pData, 0);
+ oslModule mod3= osl_loadModule( lib1Name.pData, 0);
+
+ rtl_registerModuleForUnloading(mod1);
+ rtl_registerModuleForUnloading(mod2);
+ // ----------------------------------------------------------
+ Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
+ Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
+ Reference<XComponentContext> xContext;
+ any_prop >>= xContext;
+ Reference<XComponent> xComponent( xContext, UNO_QUERY);
+ xComponent->dispose();
+ }
+ rtl_unloadUnusedModules( NULL);
+
+ // Try to get a symbol, must succeed
+ OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
+ void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
+
+ if( pSymbol)
+ {
+ retval= sal_True;
+ osl_unloadModule( handleMod);
+ pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
+ }
+ return retval;
+}
+/* 2 Modules
+
+*/
+sal_Bool test4()
+{
+ printf("Test 4 ####################################################\n");
+ oslModule handleMod1=0;
+ oslModule handleMod2=0;
+ OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+ OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
+ {
+ Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+
+ Reference<XInterface> xint= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
+
+ handleMod1= osl_loadModule( lib1Name.pData, 0);
+ osl_unloadModule( handleMod1);
+ Reference<XInterface> xint2= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
+
+ handleMod2= osl_loadModule( lib2Name.pData, 0);
+ osl_unloadModule( handleMod2);
+
+ //-----------------------------------------------------------
+ // ----------------------------------------------------------
+ Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
+ Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
+ Reference<XComponentContext> xContext;
+ any_prop >>= xContext;
+ Reference<XComponent> xComponent( xContext, UNO_QUERY);
+ xComponent->dispose();
+ }
+ rtl_unloadUnusedModules( NULL);
+
+ // Try to get a symbol, must fail
+ OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
+ void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
+
+ void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData);
+ if( ! pSymbol && !pSymbol2)
+ return sal_True;
+ return sal_False;
+}
+
+/* 2 Modules and 6 services
+
+*/
+sal_Bool test5()
+{
+ printf("test5 ####################################################\n");
+ oslModule handleMod1=0;
+ oslModule handleMod2=0;
+ sal_Bool btest1= sal_False;
+ OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+ OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
+ OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
+ {
+ Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+
+ //-----------------------------------------------------------
+ Reference<XInterface> xint= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
+ Reference<XInterface> xint2= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME2)));
+ Reference<XInterface> xint3= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME3)));
+ Reference<XInterface> xint4= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME21)));
+ Reference<XInterface> xint5= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME22)));
+ Reference<XInterface> xint6= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME23)));
+
+ // ----------------------------------------------------------
+ handleMod1= osl_loadModule( lib1Name.pData, 0);
+ osl_unloadModule( handleMod1);
+ handleMod2= osl_loadModule( lib2Name.pData, 0);
+ osl_unloadModule( handleMod2);
+
+ // get rid of the service manager
+ Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
+ Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
+ Reference<XComponentContext> xContext;
+ any_prop >>= xContext;
+ Reference<XComponent> xComponent( xContext, UNO_QUERY);
+ xComponent->dispose();
+
+ // try unloading, must fail
+ rtl_unloadUnusedModules( NULL);
+ void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
+
+ void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData);
+ if( pSymbol && pSymbol2)
+ btest1= sal_True;
+
+ }
+
+ // Try to get a symbol, must succeed
+ rtl_unloadUnusedModules( NULL);
+
+ void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
+ void* pSymbol2= osl_getSymbol( handleMod2, sSymbol.pData);
+ if( ! pSymbol && !pSymbol2 && btest1)
+ return sal_True;
+ return sal_False;
+}
+
+/*
+TimeValue Test
+rtl_unloadUnusedModules takes a TimeValue which determines a timespan
+a module must have been constantly unused in order to be unloaded.
+This is only a rough test. To make accurate tests, one should directly
+write code in the unload.cxx file.
+The function will not return (loop) when the test fails or the result value
+is far off the 10 seconds value.
+*/
+sal_Bool test6()
+{
+ printf("test6 ####################################################\n");
+ oslModule handleMod1=0;
+ oslModule handleMod2=0;
+ OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+ OUString lib2Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY2));
+ OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
+ {
+ Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+ Reference<XInterface> xint= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
+
+ // ----------------------------------------------------------
+ handleMod1= osl_loadModule( lib1Name.pData, 0);
+ osl_unloadModule( handleMod1);
+
+ // get rid of the service manager
+ Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
+ Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
+ Reference<XComponentContext> xContext;
+ any_prop >>= xContext;
+ Reference<XComponent> xComponent( xContext, UNO_QUERY);
+ xComponent->dispose();
+ }
+
+ // Enter a loop and try unloading. At least after 10 seconds
+ // this should be successful.
+ TimeValue time={10,0};
+
+ TimeValue beforeTime={0,0};
+ printf("\n unloading should take about 10 seconds\n");
+ osl_getSystemTime( &beforeTime);
+ for(;;)
+ {
+
+ rtl_unloadUnusedModules( &time);
+ void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
+ if( ! pSymbol)
+ break;
+ }
+ TimeValue afterTime={0,0};
+ osl_getSystemTime( &afterTime);
+
+ printf("\n it took about %i seconds \n Check the value!!!", afterTime.Seconds - beforeTime.Seconds);
+ printf(" hit return to continue\n");
+ getchar();
+
+ return sal_True;
+}
+
+/*
+*/
+sal_Bool test7()
+{
+ printf("Test 7 ####################################################"
+ "\nThe callback function should be called 3 times\n");
+ sal_Int32 id1=1;
+ sal_Int32 id2=2;
+ sal_Int32 id3=3;
+ sal_Int32 cookie1= rtl_addUnloadingListener( listenerCallback, &id1);
+ sal_Int32 cookie2= rtl_addUnloadingListener( listenerCallback, &id2);
+ sal_Int32 cookie3= rtl_addUnloadingListener( listenerCallback, &id3);
+
+ printf("\nTest 7 \nThe listener should be called 3 times\n");
+ rtl_unloadUnusedModules( NULL);
+
+ rtl_removeUnloadingListener( cookie1);
+ rtl_removeUnloadingListener( cookie2);
+ rtl_removeUnloadingListener( cookie3);
+
+ sal_Int32 cookie4= rtl_addUnloadingListener( listenerCallback, &id1);
+ sal_Int32 cookie5= rtl_addUnloadingListener( listenerCallback, &id2);
+ sal_Int32 cookie6= rtl_addUnloadingListener( listenerCallback, &id3);
+
+ if( cookie1 == cookie4 &&
+ cookie2 == cookie5 )
+ {
+ printf("\n###cookie recycling works\n");
+ printf("hit return to continue\n");
+ getchar();
+ }
+ else
+ {
+ printf("\n###cookie recycling failed!!!\n");
+ printf("hit return to continue\n");
+ getchar();
+ }
+
+ rtl_removeUnloadingListener( cookie1);
+ rtl_removeUnloadingListener( cookie2);
+ rtl_removeUnloadingListener( cookie3);
+ return sal_True;
+}
+
+/* Test one-instance-service default factory (XUnloadingPreference)
+ cppuhelper/source/factory.cxx
+*/
+sal_Bool test8()
+{
+ printf("Test 8 ####################################################\n");
+ oslModule handleMod1=0;
+ OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+ OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
+
+ sal_Bool b_ifaceSupported=sal_False;
+ sal_Bool b_instances_identical= sal_False;
+ sal_Bool b_releaseBeforeLoading= sal_False;
+ sal_Bool b_releaseAfterLoading= sal_False;
+ sal_Bool b_unloaded= sal_False;
+
+ {
+ Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+ Reference<XContentEnumerationAccess> xContent( serviceManager, UNO_QUERY);
+ Reference<XEnumeration> xenum= xContent->createContentEnumeration(
+ OUString( RTL_CONSTASCII_USTRINGPARAM( SERVICENAME4)));
+
+ Any any_elem;
+ if( xenum->hasMoreElements())
+ any_elem= xenum->nextElement();
+ Reference<XInterface> xinterfaceFact;
+ any_elem>>=xinterfaceFact;
+ Reference<XTypeProvider> xprov( xinterfaceFact, UNO_QUERY);
+
+ Sequence<Type> seqTypes= xprov->getTypes();
+
+ // XTypeProvider test
+ for( sal_Int32 i=0; i<seqTypes.getLength(); i++)
+ {
+ OUString name= seqTypes[i].getTypeName();
+ if( name == OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.uno.XUnloadingPreference")))
+ b_ifaceSupported= sal_True;
+ }
+
+ // XUnloadingPreference::releaseOnNotification should return true now because we haven't
+ // created an instance yet
+ Reference<XUnloadingPreference> xreject( xinterfaceFact, UNO_QUERY);
+ b_releaseBeforeLoading= xreject->releaseOnNotification();
+
+ // Create instance. Afterwards releaseOnNotification should return false.
+ Reference<XInterface> xint= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4)));
+ b_releaseAfterLoading= xreject->releaseOnNotification();
+ b_releaseAfterLoading= b_releaseAfterLoading? sal_False : sal_True;
+
+ // safe the handle of the module
+ handleMod1= osl_loadModule( lib1Name.pData, 0);
+ osl_unloadModule( handleMod1);
+
+ // ----------------------------------------------------------
+ // for debugging
+ Reference<XServiceInfo> info( xint, UNO_QUERY);
+ OUString s= info->getImplementationName();
+
+ // get another instance which must be the same
+ Reference<XInterface> xint2= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME4)));
+
+ b_instances_identical= xint == xint2;
+
+ // get rid of the service manager
+ Reference<XPropertySet> xSet( serviceManager, UNO_QUERY);
+ Any any_prop= xSet->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")));
+ Reference<XComponentContext> xContext;
+ any_prop >>= xContext;
+ Reference<XComponent> xComponent( xContext, UNO_QUERY);
+ xComponent->dispose();
+ }
+
+ rtl_unloadUnusedModules( NULL);
+
+ // The library must be unloaded now
+ void* pSymbol= osl_getSymbol( handleMod1, sSymbol.pData);
+ if( ! pSymbol )
+ b_unloaded= sal_True;
+
+ if( b_ifaceSupported && b_instances_identical && b_releaseBeforeLoading &&
+ b_releaseAfterLoading && b_unloaded)
+ return sal_True;
+ return sal_False;
+}
+
+void SAL_CALL listenerCallback( void* id)
+{
+ printf(" listener called with id= %i\n", *(sal_Int32*)id);
+}
+
+/*
+
+ */
+sal_Bool test9()
+{
+ printf("Test 9 ####################################################\n");
+ oslModule handleMod=0;
+ sal_Bool retval=sal_False;
+ OUString lib1Name( RTL_CONSTASCII_USTRINGPARAM(LIBRARY1));
+
+ Reference<XMultiServiceFactory> serviceManager= createRegistryServiceFactory(
+ OUString( RTL_CONSTASCII_USTRINGPARAM("applicat.rdb")));
+
+ Reference<XInterface> xint= serviceManager->createInstance( OUString(
+ RTL_CONSTASCII_USTRINGPARAM(SERVICENAME1)));
+ // Release the service. The library refcount should be 1
+ xint=0;
+
+ handleMod= osl_loadModule( lib1Name.pData, 0);
+ osl_unloadModule( handleMod);
+ //-----------------------------------------------------------
+
+ // the service manager is still alive
+ rtl_unloadUnusedModules( NULL);
+ // Try to get a symbol, must fail
+ OUString sSymbol( RTL_CONSTASCII_USTRINGPARAM("component_getFactory"));
+ void* pSymbol= osl_getSymbol( handleMod, sSymbol.pData);
+
+ if( pSymbol)
+ {
+ retval= sal_False;
+ }
+ else
+ retval= sal_True;
+ return retval;
+}
diff --git a/sal/textenc/context.c b/sal/textenc/context.c
new file mode 100644
index 000000000000..4b120d5d4843
--- /dev/null
+++ b/sal/textenc/context.c
@@ -0,0 +1,47 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "context.h"
+#include "rtl/alloc.h"
+
+void * ImplCreateUnicodeToTextContext(void)
+{
+ void * pContext = rtl_allocateMemory(sizeof (ImplUnicodeToTextContext));
+ ((ImplUnicodeToTextContext *) pContext)->m_nHighSurrogate = 0;
+ return pContext;
+}
+
+void ImplResetUnicodeToTextContext(void * pContext)
+{
+ if (pContext)
+ ((ImplUnicodeToTextContext *) pContext)->m_nHighSurrogate = 0;
+}
+
+void ImplDestroyContext(void * pContext)
+{
+ rtl_freeMemory(pContext);
+}
diff --git a/sal/textenc/context.h b/sal/textenc/context.h
new file mode 100644
index 000000000000..769625ae8df8
--- /dev/null
+++ b/sal/textenc/context.h
@@ -0,0 +1,52 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
+#define INCLUDED_RTL_TEXTENC_CONTEXT_H
+
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+typedef struct
+{
+ sal_Unicode m_nHighSurrogate;
+} ImplUnicodeToTextContext;
+
+void * ImplCreateUnicodeToTextContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetUnicodeToTextContext(void * pContext) SAL_THROW_EXTERN_C();
+
+void ImplDestroyContext(void * pContext) SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_CONTEXT_H */
diff --git a/sal/textenc/convertadobe.tab b/sal/textenc/convertadobe.tab
new file mode 100644
index 000000000000..31ec3305933b
--- /dev/null
+++ b/sal/textenc/convertadobe.tab
@@ -0,0 +1,328 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "context.h"
+#include "convertsinglebytetobmpunicode.hxx"
+#include "tenchelp.h"
+
+#include "rtl/tencinfo.h"
+
+namespace {
+
+// RTL_TEXTENCODING_ADOBE_STANDARD is based on
+// <http://www.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/stdenc.txt> revision
+// "v0.2, 30 March 1999".
+
+rtl::textenc::BmpUnicodeToSingleByteRange const unicodeToAdobeStandardEncoding[]
+= { { 0x0020, 0x0026 - 0x0020, 0x20 }, { 0x0027, 0x0027 - 0x0027, 0xA9 },
+ { 0x0028, 0x005F - 0x0028, 0x28 }, { 0x0060, 0x0060 - 0x0060, 0xC1 },
+ { 0x0061, 0x007E - 0x0061, 0x61 }, { 0x00A0, 0x00A0 - 0x00A0, 0x20 },
+ { 0x00A1, 0x00A3 - 0x00A1, 0xA1 }, { 0x00A4, 0x00A4 - 0x00A4, 0xA8 },
+ { 0x00A5, 0x00A5 - 0x00A5, 0xA5 }, { 0x00A7, 0x00A7 - 0x00A7, 0xA7 },
+ { 0x00A8, 0x00A8 - 0x00A8, 0xC8 }, { 0x00AA, 0x00AA - 0x00AA, 0xE3 },
+ { 0x00AB, 0x00AB - 0x00AB, 0xAB }, { 0x00AD, 0x00AD - 0x00AD, 0x2D },
+ { 0x00AF, 0x00AF - 0x00AF, 0xC5 }, { 0x00B4, 0x00B4 - 0x00B4, 0xC2 },
+ { 0x00B6, 0x00B6 - 0x00B6, 0xB6 }, { 0x00B7, 0x00B7 - 0x00B7, 0xB4 },
+ { 0x00B8, 0x00B8 - 0x00B8, 0xCB }, { 0x00BA, 0x00BA - 0x00BA, 0xEB },
+ { 0x00BB, 0x00BB - 0x00BB, 0xBB }, { 0x00BF, 0x00BF - 0x00BF, 0xBF },
+ { 0x00C6, 0x00C6 - 0x00C6, 0xE1 }, { 0x00D8, 0x00D8 - 0x00D8, 0xE9 },
+ { 0x00DF, 0x00DF - 0x00DF, 0xFB }, { 0x00E6, 0x00E6 - 0x00E6, 0xF1 },
+ { 0x00F8, 0x00F8 - 0x00F8, 0xF9 }, { 0x0131, 0x0131 - 0x0131, 0xF5 },
+ { 0x0141, 0x0141 - 0x0141, 0xE8 }, { 0x0142, 0x0142 - 0x0142, 0xF8 },
+ { 0x0152, 0x0152 - 0x0152, 0xEA }, { 0x0153, 0x0153 - 0x0153, 0xFA },
+ { 0x0192, 0x0192 - 0x0192, 0xA6 }, { 0x02C6, 0x02C6 - 0x02C6, 0xC3 },
+ { 0x02C7, 0x02C7 - 0x02C7, 0xCF }, { 0x02C9, 0x02C9 - 0x02C9, 0xC5 },
+ { 0x02D8, 0x02D9 - 0x02D8, 0xC6 }, { 0x02DA, 0x02DA - 0x02DA, 0xCA },
+ { 0x02DB, 0x02DB - 0x02DB, 0xCE }, { 0x02DC, 0x02DC - 0x02DC, 0xC4 },
+ { 0x02DD, 0x02DD - 0x02DD, 0xCD }, { 0x2013, 0x2013 - 0x2013, 0xB1 },
+ { 0x2014, 0x2014 - 0x2014, 0xD0 }, { 0x2018, 0x2018 - 0x2018, 0x60 },
+ { 0x2019, 0x2019 - 0x2019, 0x27 }, { 0x201A, 0x201A - 0x201A, 0xB8 },
+ { 0x201C, 0x201C - 0x201C, 0xAA }, { 0x201D, 0x201D - 0x201D, 0xBA },
+ { 0x201E, 0x201E - 0x201E, 0xB9 }, { 0x2020, 0x2020 - 0x2020, 0xB2 },
+ { 0x2021, 0x2021 - 0x2021, 0xB3 }, { 0x2022, 0x2022 - 0x2022, 0xB7 },
+ { 0x2026, 0x2026 - 0x2026, 0xBC }, { 0x2030, 0x2030 - 0x2030, 0xBD },
+ { 0x2039, 0x2039 - 0x2039, 0xAC }, { 0x203A, 0x203A - 0x203A, 0xAD },
+ { 0x2044, 0x2044 - 0x2044, 0xA4 }, { 0x2215, 0x2215 - 0x2215, 0xA4 },
+ { 0x2219, 0x2219 - 0x2219, 0xB4 }, { 0xFB01, 0xFB02 - 0xFB01, 0xAE } };
+
+rtl::textenc::BmpUnicodeToSingleByteConverterData const
+adobeStandardEncodingConverterData = {
+ { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0x00
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0x10
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019, // 0x20
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, // 0x30
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, // 0x40
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, // 0x50
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x2018, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, // 0x60
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, // x070
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0x80
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0x90
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x00A1, 0x00A2, 0x00A3, 0x2215, 0x00A5, 0x0192, 0x00A7, // 0xA0
+ 0x00A4, 0x0027, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02,
+ 0xffff, 0x2013, 0x2020, 0x2021, 0x00B7, 0xffff, 0x00B6, 0x2022, // 0xB0
+ 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0xffff, 0x00BF,
+ 0xffff, 0x0060, 0x00B4, 0x02C6, 0x02DC, 0x00AF, 0x02D8, 0x02D9, // 0xC0
+ 0x00A8, 0xffff, 0x02DA, 0x00B8, 0xffff, 0x02DD, 0x02DB, 0x02C7,
+ 0x2014, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0xD0
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x00C6, 0xffff, 0x00AA, 0xffff, 0xffff, 0xffff, 0xffff, // 0xE0
+ 0x0141, 0x00D8, 0x0152, 0x00BA, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0x00E6, 0xffff, 0xffff, 0xffff, 0x0131, 0xffff, 0xffff, // 0xF0
+ 0x0142, 0x00F8, 0x0153, 0x00DF, 0xffff, 0xffff, 0xffff, 0xffff },
+ (sizeof unicodeToAdobeStandardEncoding
+ / sizeof unicodeToAdobeStandardEncoding[0]),
+ unicodeToAdobeStandardEncoding };
+
+// RTL_TEXTENCODING_ADOBE_SYMBOL is based on
+// <http://www.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/symbol.txt> revision
+// "v0.2, 30 March 1999," with the modification that some mappings go to code
+// points newly assigned in Unicode 3.2/4.0, instead of to PUA:
+// 0xBD -> U+23AF (was U+F8E6)
+// 0xBE -> U+23D0 (was U+F8E7)
+// 0xE6--E8 -> U+239B--239D (was U+F8EB--F8ED)
+// 0xE9--EB -> U+23A1--23A3 (was U+F8EE--F8F0)
+// 0xEC--EF -> U+23A7--23AA (was U+F8F1--F8F4)
+// 0xF4 -> U+23AE (was U+F8F5)
+// 0xF6--F8 -> U+239E--23A0 (was U+F8F6--F8F8)
+// 0xF9--FB -> U+23A4--23A6 (was U+F8F9--F8FB)
+// 0xFC--FE -> U+23AB--23AD (was U+F8FC--F8FE)
+
+//TODO: Contains Unicode PUA mappings
+rtl::textenc::BmpUnicodeToSingleByteRange const unicodeToAdobeSymbolEncoding[]
+= { { 0x0020, 0x0021 - 0x0020, 0x20 }, { 0x0023, 0x0023 - 0x0023, 0x23 },
+ { 0x0025, 0x0026 - 0x0025, 0x25 }, { 0x0028, 0x0029 - 0x0028, 0x28 },
+ { 0x002B, 0x002C - 0x002B, 0x2B }, { 0x002E, 0x003F - 0x002E, 0x2E },
+ { 0x005B, 0x005B - 0x005B, 0x5B }, { 0x005D, 0x005D - 0x005D, 0x5D },
+ { 0x005F, 0x005F - 0x005F, 0x5F }, { 0x007B, 0x007D - 0x007B, 0x7B },
+ { 0x00A0, 0x00A0 - 0x00A0, 0x20 }, { 0x00AC, 0x00AC - 0x00AC, 0xD8 },
+ { 0x00B0, 0x00B1 - 0x00B0, 0xB0 }, { 0x00B5, 0x00B5 - 0x00B5, 0x6D },
+ { 0x00D7, 0x00D7 - 0x00D7, 0xB4 }, { 0x00F7, 0x00F7 - 0x00F7, 0xB8 },
+ { 0x0192, 0x0192 - 0x0192, 0xA6 }, { 0x0391, 0x0392 - 0x0391, 0x41 },
+ { 0x0393, 0x0393 - 0x0393, 0x47 }, { 0x0394, 0x0395 - 0x0394, 0x44 },
+ { 0x0396, 0x0396 - 0x0396, 0x5A }, { 0x0397, 0x0397 - 0x0397, 0x48 },
+ { 0x0398, 0x0398 - 0x0398, 0x51 }, { 0x0399, 0x0399 - 0x0399, 0x49 },
+ { 0x039A, 0x039D - 0x039A, 0x4B }, { 0x039E, 0x039E - 0x039E, 0x58 },
+ { 0x039F, 0x03A0 - 0x039F, 0x4F }, { 0x03A1, 0x03A1 - 0x03A1, 0x52 },
+ { 0x03A3, 0x03A5 - 0x03A3, 0x53 }, { 0x03A6, 0x03A6 - 0x03A6, 0x46 },
+ { 0x03A7, 0x03A7 - 0x03A7, 0x43 }, { 0x03A8, 0x03A8 - 0x03A8, 0x59 },
+ { 0x03A9, 0x03A9 - 0x03A9, 0x57 }, { 0x03B1, 0x03B2 - 0x03B1, 0x61 },
+ { 0x03B3, 0x03B3 - 0x03B3, 0x67 }, { 0x03B4, 0x03B5 - 0x03B4, 0x64 },
+ { 0x03B6, 0x03B6 - 0x03B6, 0x7A }, { 0x03B7, 0x03B7 - 0x03B7, 0x68 },
+ { 0x03B8, 0x03B8 - 0x03B8, 0x71 }, { 0x03B9, 0x03B9 - 0x03B9, 0x69 },
+ { 0x03BA, 0x03BD - 0x03BA, 0x6B }, { 0x03BE, 0x03BE - 0x03BE, 0x78 },
+ { 0x03BF, 0x03C0 - 0x03BF, 0x6F }, { 0x03C1, 0x03C1 - 0x03C1, 0x72 },
+ { 0x03C2, 0x03C2 - 0x03C2, 0x56 }, { 0x03C3, 0x03C5 - 0x03C3, 0x73 },
+ { 0x03C6, 0x03C6 - 0x03C6, 0x66 }, { 0x03C7, 0x03C7 - 0x03C7, 0x63 },
+ { 0x03C8, 0x03C8 - 0x03C8, 0x79 }, { 0x03C9, 0x03C9 - 0x03C9, 0x77 },
+ { 0x03D1, 0x03D1 - 0x03D1, 0x4A }, { 0x03D2, 0x03D2 - 0x03D2, 0xA1 },
+ { 0x03D5, 0x03D5 - 0x03D5, 0x6A }, { 0x03D6, 0x03D6 - 0x03D6, 0x76 },
+ { 0x2022, 0x2022 - 0x2022, 0xB7 }, { 0x2026, 0x2026 - 0x2026, 0xBC },
+ { 0x2032, 0x2032 - 0x2032, 0xA2 }, { 0x2033, 0x2033 - 0x2033, 0xB2 },
+ { 0x2044, 0x2044 - 0x2044, 0xA4 }, { 0x20AC, 0x20AC - 0x20AC, 0xA0 },
+ { 0x2111, 0x2111 - 0x2111, 0xC1 }, { 0x2118, 0x2118 - 0x2118, 0xC3 },
+ { 0x211C, 0x211C - 0x211C, 0xC2 }, { 0x2126, 0x2126 - 0x2126, 0x57 },
+ { 0x2135, 0x2135 - 0x2135, 0xC0 }, { 0x2190, 0x2193 - 0x2190, 0xAC },
+ { 0x2194, 0x2194 - 0x2194, 0xAB }, { 0x21B5, 0x21B5 - 0x21B5, 0xBF },
+ { 0x21D0, 0x21D3 - 0x21D0, 0xDC }, { 0x21D4, 0x21D4 - 0x21D4, 0xDB },
+ { 0x2200, 0x2200 - 0x2200, 0x22 }, { 0x2202, 0x2202 - 0x2202, 0xB6 },
+ { 0x2203, 0x2203 - 0x2203, 0x24 }, { 0x2205, 0x2205 - 0x2205, 0xC6 },
+ { 0x2206, 0x2206 - 0x2206, 0x44 }, { 0x2207, 0x2207 - 0x2207, 0xD1 },
+ { 0x2208, 0x2209 - 0x2208, 0xCE }, { 0x220B, 0x220B - 0x220B, 0x27 },
+ { 0x220F, 0x220F - 0x220F, 0xD5 }, { 0x2211, 0x2211 - 0x2211, 0xE5 },
+ { 0x2212, 0x2212 - 0x2212, 0x2D }, { 0x2215, 0x2215 - 0x2215, 0xA4 },
+ { 0x2217, 0x2217 - 0x2217, 0x2A }, { 0x221A, 0x221A - 0x221A, 0xD6 },
+ { 0x221D, 0x221D - 0x221D, 0xB5 }, { 0x221E, 0x221E - 0x221E, 0xA5 },
+ { 0x2220, 0x2220 - 0x2220, 0xD0 }, { 0x2227, 0x2228 - 0x2227, 0xD9 },
+ { 0x2229, 0x222A - 0x2229, 0xC7 }, { 0x222B, 0x222B - 0x222B, 0xF2 },
+ { 0x2234, 0x2234 - 0x2234, 0x5C }, { 0x223C, 0x223C - 0x223C, 0x7E },
+ { 0x2245, 0x2245 - 0x2245, 0x40 }, { 0x2248, 0x2248 - 0x2248, 0xBB },
+ { 0x2260, 0x2261 - 0x2260, 0xB9 }, { 0x2264, 0x2264 - 0x2264, 0xA3 },
+ { 0x2265, 0x2265 - 0x2265, 0xB3 }, { 0x2282, 0x2282 - 0x2282, 0xCC },
+ { 0x2283, 0x2283 - 0x2283, 0xC9 }, { 0x2284, 0x2284 - 0x2284, 0xCB },
+ { 0x2286, 0x2286 - 0x2286, 0xCD }, { 0x2287, 0x2287 - 0x2287, 0xCA },
+ { 0x2295, 0x2295 - 0x2295, 0xC5 }, { 0x2297, 0x2297 - 0x2297, 0xC4 },
+ { 0x22A5, 0x22A5 - 0x22A5, 0x5E }, { 0x22C5, 0x22C5 - 0x22C5, 0xD7 },
+ { 0x2320, 0x2320 - 0x2320, 0xF3 }, { 0x2321, 0x2321 - 0x2321, 0xF5 },
+ { 0x2329, 0x2329 - 0x2329, 0xE1 }, { 0x232A, 0x232A - 0x232A, 0xF1 },
+ { 0x239B, 0x239D - 0x239B, 0xE6 }, { 0x239E, 0x23A0 - 0x239E, 0xF6 },
+ { 0x23A1, 0x23A3 - 0x23A1, 0xE9 }, { 0x23A4, 0x23A6 - 0x23A4, 0xF9 },
+ { 0x23A7, 0x23AA - 0x23A7, 0xEC }, { 0x23AB, 0x23AD - 0x23AB, 0xFC },
+ { 0x23AE, 0x23AE - 0x23AE, 0xF4 }, { 0x23AF, 0x23AF - 0x23AF, 0xBD },
+ { 0x23D0, 0x23D0 - 0x23D0, 0xBE }, { 0x25CA, 0x25CA - 0x25CA, 0xE0 },
+ { 0x2660, 0x2660 - 0x2660, 0xAA }, { 0x2663, 0x2663 - 0x2663, 0xA7 },
+ { 0x2665, 0x2665 - 0x2665, 0xA9 }, { 0x2666, 0x2666 - 0x2666, 0xA8 },
+ { 0xF000, 0xF0FF - 0xF000, 0x00 }, // symbol aliasing U+F0XX->S+00XX
+ { 0xF6D9, 0xF6D9 - 0xF6D9, 0xD3 }, { 0xF6DA, 0xF6DA - 0xF6DA, 0xD2 },
+ { 0xF6DB, 0xF6DB - 0xF6DB, 0xD4 }, { 0xF8E5, 0xF8E5 - 0xF8E5, 0x60 },
+ { 0xF8E8, 0xF8EA - 0xF8E8, 0xE2 } };
+
+//TODO: Contains Unicode PUA mappings
+rtl::textenc::BmpUnicodeToSingleByteConverterData const
+adobeSymbolEncodingConverterData = {
+ { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0x00
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0x10
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220B, // 0x20
+ 0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, // 0x30
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393, // 0x40
+ 0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F,
+ 0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9, // 0x50
+ 0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F,
+ 0xF8E5, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3, // 0x60
+ 0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF,
+ 0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9, // 0x70
+ 0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0x80
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, // 0x90
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0x20AC, 0x03D2, 0x2032, 0x2264, 0x2215, 0x221E, 0x0192, 0x2663, // 0xA0
+ 0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,
+ 0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022, // 0xB0
+ 0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0x23AF, 0x23D0, 0x21B5,
+ 0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229, // 0xC0
+ 0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,
+ 0x2220, 0x2207, 0xF6DA, 0xF6D9, 0xF6DB, 0x220F, 0x221A, 0x22C5, // 0xD0
+ 0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3,
+ 0x25CA, 0x2329, 0xF8E8, 0xF8E9, 0xF8EA, 0x2211, 0x239B, 0x239C, // 0xE0
+ 0x239D, 0x23A1, 0x23A2, 0x23A3, 0x23A7, 0x23A8, 0x23A9, 0x23AA,
+ 0xffff, 0x232A, 0x222B, 0x2320, 0x23AE, 0x2321, 0x239E, 0x239F, // 0xF0
+ 0x23A0, 0x23A4, 0x23A5, 0x23A6, 0x23AB, 0x23AC, 0x23AD, 0xffff },
+ (sizeof unicodeToAdobeSymbolEncoding
+ / sizeof unicodeToAdobeSymbolEncoding[0]),
+ unicodeToAdobeSymbolEncoding };
+
+// RTL_TEXTENCODING_ADOBE_DINGBATS is based on
+// <http://www.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/zdingbat.txt> revision
+// "v0.2, 30 March 1999"
+
+//TODO: Contains Unicode PUA mappings
+rtl::textenc::BmpUnicodeToSingleByteRange const unicodeToAdobeDingbatsEncoding[]
+= { { 0x0020, 0x0020 - 0x0020, 0x20 }, { 0x00A0, 0x00A0 - 0x00A0, 0x20 },
+ { 0x2192, 0x2192 - 0x2192, 0xD5 }, { 0x2194, 0x2195 - 0x2194, 0xD6 },
+ { 0x2460, 0x2469 - 0x2460, 0xAB },
+ { 0x25A0, 0x25A0 - 0x25A0, 0x6E },
+ { 0x25B2, 0x25B2 - 0x25B2, 0x73 }, { 0x25BC, 0x25BC - 0x25BC, 0x74 },
+ { 0x25C6, 0x25C6 - 0x25C6, 0x75 }, { 0x25CF, 0x25CF - 0x25CF, 0x6C },
+ { 0x25D7, 0x25D7 - 0x25D7, 0x77 },
+ { 0x2605, 0x2605 - 0x2605, 0x48 }, { 0x260E, 0x260E - 0x260E, 0x25 },
+ { 0x261B, 0x261B - 0x261B, 0x2A }, { 0x261E, 0x261E - 0x261E, 0x2B },
+ { 0x2660, 0x2660 - 0x2660, 0xAB }, { 0x2663, 0x2663 - 0x2663, 0xA8 },
+ { 0x2665, 0x2665 - 0x2665, 0xAA }, { 0x2666, 0x2666 - 0x2666, 0xA9 },
+ { 0x2701, 0x2704 - 0x2701, 0x21 }, { 0x2706, 0x2709 - 0x2706, 0x26 },
+ { 0x270C, 0x2727 - 0x270C, 0x2C }, { 0x2729, 0x274B - 0x2729, 0x49 },
+ { 0x274D, 0x274D - 0x274D, 0x6D }, { 0x274F, 0x2752 - 0x274F, 0x6F },
+ { 0x2756, 0x2756 - 0x2756, 0x76 }, { 0x2758, 0x275E - 0x2758, 0x78 },
+ { 0x2761, 0x2767 - 0x2761, 0xA1 }, { 0x2776, 0x2794 - 0x2776, 0xB6 },
+ { 0x2798, 0x27AF - 0x2798, 0xD8 }, { 0x27B1, 0x27BE - 0x27B1, 0xF1 },
+ { 0xF000, 0xF0FF - 0xF000, 0x00 }, // symbol aliasing U+F0XX->S+00XX
+ { 0xF8D7, 0xF8E4 - 0xF8D7, 0x80 }};
+
+rtl::textenc::BmpUnicodeToSingleByteConverterData const
+adobeDingbatsEncodingConverterData = {
+ { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00
+ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x10
+ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+ 0x0020, 0x2701, 0x2702, 0x2703, 0x2704, 0x260E, 0x2706, 0x2707, // 0x20
+ 0x2708, 0x2709, 0x261B, 0x261E, 0x270C, 0x270D, 0x270E, 0x270F,
+ 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717, // 0x30
+ 0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, 0x271F,
+ 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727, // 0x40
+ 0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F,
+ 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, // 0x50
+ 0x2738, 0x2739, 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F,
+ 0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, // 0x60
+ 0x2748, 0x2749, 0x274A, 0x274B, 0x27CF, 0x274D, 0x25A0, 0x274F,
+ 0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, 0x25C6, 0x2756, 0x25D7, // 0x70
+ 0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0xFFFF,
+ 0xF8D7, 0xF8D8, 0xF8D9, 0xF8DA, 0xF8DB, 0xF8DC, 0xF8DD, 0xF8DE, // 0x80
+ 0xF8DF, 0xF8E0, 0xF8E1, 0xF8E2, 0xF8E3, 0xF8E4, 0xFFFF, 0xFFFF,
+ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x090
+ 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
+ 0xFFFF, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, // 0xA0
+ 0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463,
+ 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2776, 0x2777, // 0xB0
+ 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F,
+ 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787, // 0xC0
+ 0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, 0x278F,
+ 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2795, 0x2796, 0x2797, // 0xD0
+ 0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F,
+ 0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7, // 0xE0
+ 0x27A8, 0x27A9, 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF,
+ 0xFFFF, 0x27B1, 0x27B2, 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7, // 0xF0
+ 0x27B8, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27BD, 0x27BE, 0xFFFF },
+ (sizeof(unicodeToAdobeDingbatsEncoding) / sizeof(*unicodeToAdobeDingbatsEncoding)),
+ unicodeToAdobeDingbatsEncoding };
+
+ImplTextEncodingData const adobeStandardEncodingData
+= { { &adobeStandardEncodingConverterData,
+ &rtl_textenc_convertSingleByteToBmpUnicode,
+ &rtl_textenc_convertBmpUnicodeToSingleByte,
+ 0, 0, 0,
+ ImplCreateUnicodeToTextContext, ImplDestroyContext,
+ ImplResetUnicodeToTextContext },
+ 1, 1, 1,
+ 0, 0, "Adobe-Standard-Encoding",
+ RTL_TEXTENCODING_INFO_MIME };
+
+ImplTextEncodingData const adobeSymbolEncodingData
+= { { &adobeSymbolEncodingConverterData,
+ &rtl_textenc_convertSingleByteToBmpUnicode,
+ &rtl_textenc_convertBmpUnicodeToSingleByte,
+ 0, 0, 0,
+ ImplCreateUnicodeToTextContext, ImplDestroyContext,
+ ImplResetUnicodeToTextContext },
+ 1, 1, 1,
+ 0, 0, "Adobe-Symbol-Encoding",
+ RTL_TEXTENCODING_INFO_SYMBOL | RTL_TEXTENCODING_INFO_MIME };
+
+ImplTextEncodingData const adobeDingbatsEncodingData
+= { { &adobeDingbatsEncodingConverterData,
+ &rtl_textenc_convertSingleByteToBmpUnicode,
+ &rtl_textenc_convertBmpUnicodeToSingleByte,
+ 0, 0, 0,
+ ImplCreateUnicodeToTextContext, ImplDestroyContext,
+ ImplResetUnicodeToTextContext },
+ 1, 1, 1,
+ 0, 0, "Adobe-ZapfDingbats-Encoding",
+ 0 }; // TODO: RTL_TEXTENCODING_INFO_DINGBATS
+
+}
diff --git a/sal/textenc/convertbig5hkscs.c b/sal/textenc/convertbig5hkscs.c
new file mode 100644
index 000000000000..06fabe33a9b9
--- /dev/null
+++ b/sal/textenc/convertbig5hkscs.c
@@ -0,0 +1,493 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "convertbig5hkscs.h"
+#include "context.h"
+#include "converter.h"
+#include "tenchelp.h"
+#include "unichars.h"
+#include "osl/diagnose.h"
+#include "rtl/alloc.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+typedef struct
+{
+ sal_Int32 m_nRow; /* 0--255; 0 means none */
+} ImplBig5HkscsToUnicodeContext;
+
+void * ImplCreateBig5HkscsToUnicodeContext(void)
+{
+ void * pContext
+ = rtl_allocateMemory(sizeof (ImplBig5HkscsToUnicodeContext));
+ ((ImplBig5HkscsToUnicodeContext *) pContext)->m_nRow = 0;
+ return pContext;
+}
+
+void ImplResetBig5HkscsToUnicodeContext(void * pContext)
+{
+ if (pContext)
+ ((ImplBig5HkscsToUnicodeContext *) pContext)->m_nRow = 0;
+}
+
+sal_Size ImplConvertBig5HkscsToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+{
+ sal_uInt16 const * pBig5Hkscs2001Data
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pBig5Hkscs2001ToUnicodeData;
+ sal_Int32 const * pBig5Hkscs2001RowOffsets
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pBig5Hkscs2001ToUnicodeRowOffsets;
+ ImplDBCSToUniLeadTab const * pBig5Data
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pBig5ToUnicodeData;
+ sal_Int32 nRow = 0;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Unicode * pDestBufPtr = pDestBuf;
+ sal_Unicode * pDestBufEnd = pDestBuf + nDestChars;
+
+ if (pContext)
+ nRow = ((ImplBig5HkscsToUnicodeContext *) pContext)->m_nRow;
+
+ for (; nConverted < nSrcBytes; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *(sal_uChar const *) pSrcBuf++;
+ if (nRow == 0)
+ if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nChar;
+ else
+ goto no_output;
+ else if (nChar >= 0x81 && nChar <= 0xFE)
+ nRow = nChar;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ else
+ if ((nChar >= 0x40 && nChar <= 0x7E)
+ || (nChar >= 0xA1 && nChar <= 0xFE))
+ {
+ sal_uInt32 nUnicode = 0xFFFF;
+ sal_Int32 nOffset = pBig5Hkscs2001RowOffsets[nRow];
+ sal_uInt32 nFirst=0;
+ sal_uInt32 nLast=0;
+ if (nOffset != -1)
+ {
+ sal_uInt32 nFirstLast = pBig5Hkscs2001Data[nOffset++];
+ nFirst = nFirstLast & 0xFF;
+ nLast = nFirstLast >> 8;
+ if (nChar >= nFirst && nChar <= nLast)
+ nUnicode
+ = pBig5Hkscs2001Data[nOffset + (nChar - nFirst)];
+ }
+ if (nUnicode == 0xFFFF)
+ {
+ sal_uInt32 nFirst = pBig5Data[nRow].mnTrailStart;
+ if (nChar >= nFirst
+ && nChar <= pBig5Data[nRow].mnTrailEnd)
+ {
+ nUnicode
+ = pBig5Data[nRow].mpToUniTrailTab[nChar - nFirst];
+ if (nUnicode == 0)
+ nUnicode = 0xFFFF;
+ OSL_VERIFY(!ImplIsHighSurrogate(nUnicode));
+ }
+ }
+ if (nUnicode == 0xFFFF)
+ {
+ ImplDBCSEUDCData const * p
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pEudcData;
+ sal_uInt32 nCount
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_nEudcCount;
+ sal_uInt32 i;
+ for (i = 0; i < nCount; ++i)
+ {
+ if (nRow >= p->mnLeadStart && nRow <= p->mnLeadEnd)
+ {
+ if (nChar < p->mnTrail1Start)
+ break;
+ if (nChar <= p->mnTrail1End)
+ {
+ nUnicode
+ = p->mnUniStart
+ + (nRow - p->mnLeadStart)
+ * p->mnTrailRangeCount
+ + (nChar - p->mnTrail1Start);
+ break;
+ }
+ if (p->mnTrailCount < 2
+ || nChar < p->mnTrail2Start)
+ break;
+ if (nChar <= p->mnTrail2End)
+ {
+ nUnicode
+ = p->mnUniStart
+ + (nRow - p->mnLeadStart)
+ * p->mnTrailRangeCount
+ + (nChar - p->mnTrail2Start)
+ + (p->mnTrail1End - p->mnTrail1Start
+ + 1);
+ break;
+ }
+ if (p->mnTrailCount < 3
+ || nChar < p->mnTrail3Start)
+ break;
+ if (nChar <= p->mnTrail3End)
+ {
+ nUnicode
+ = p->mnUniStart
+ + (nRow - p->mnLeadStart)
+ * p->mnTrailRangeCount
+ + (nChar - p->mnTrail3Start)
+ + (p->mnTrail1End - p->mnTrail1Start
+ + 1)
+ + (p->mnTrail2End - p->mnTrail2Start
+ + 1);
+ break;
+ }
+ break;
+ }
+ ++p;
+ }
+ OSL_VERIFY(!ImplIsHighSurrogate(nUnicode));
+ }
+ if (nUnicode == 0xFFFF)
+ goto bad_input;
+ if (ImplIsHighSurrogate(nUnicode))
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ nOffset += nLast - nFirst + 1;
+ nFirst = pBig5Hkscs2001Data[nOffset++];
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ *pDestBufPtr++
+ = (sal_Unicode) pBig5Hkscs2001Data[
+ nOffset + (nChar - nFirst)];
+ }
+ else
+ goto no_output;
+ else
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ else
+ goto no_output;
+ nRow = 0;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ bUndefined, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nRow = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ nRow = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (nRow != 0
+ && (nInfo & (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0)
+ nInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ sal_False, sal_True, 0, nFlags, &pDestBufPtr,
+ pDestBufEnd, &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ nRow = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ ((ImplBig5HkscsToUnicodeContext *) pContext)->m_nRow = nRow;
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtBytes)
+ *pSrcCvtBytes = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
+
+sal_Size ImplConvertUnicodeToBig5Hkscs(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+{
+ sal_uInt16 const * pBig5Hkscs2001Data
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pUnicodeToBig5Hkscs2001Data;
+ sal_Int32 const * pBig5Hkscs2001PageOffsets
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pUnicodeToBig5Hkscs2001PageOffsets;
+ sal_Int32 const * pBig5Hkscs2001PlaneOffsets
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pUnicodeToBig5Hkscs2001PlaneOffsets;
+ ImplUniToDBCSHighTab const * pBig5Data
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pUnicodeToBig5Data;
+ sal_Unicode nHighSurrogate = 0;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Char * pDestBufPtr = pDestBuf;
+ sal_Char * pDestBufEnd = pDestBuf + nDestBytes;
+
+ if (pContext)
+ nHighSurrogate
+ = ((ImplUnicodeToTextContext *) pContext)->m_nHighSurrogate;
+
+ for (; nConverted < nSrcChars; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *pSrcBuf++;
+ if (nHighSurrogate == 0)
+ {
+ if (ImplIsHighSurrogate(nChar))
+ {
+ nHighSurrogate = (sal_Unicode) nChar;
+ continue;
+ }
+ }
+ else if (ImplIsLowSurrogate(nChar))
+ nChar = ImplCombineSurrogates(nHighSurrogate, nChar);
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (ImplIsLowSurrogate(nChar) || ImplIsNoncharacter(nChar))
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ else
+ {
+ sal_uInt32 nBytes = 0;
+ sal_Int32 nOffset = pBig5Hkscs2001PlaneOffsets[nChar >> 16];
+ if (nOffset != -1)
+ {
+ nOffset
+ = pBig5Hkscs2001PageOffsets[nOffset + ((nChar & 0xFF00)
+ >> 8)];
+ if (nOffset != -1)
+ {
+ sal_uInt32 nFirstLast = pBig5Hkscs2001Data[nOffset++];
+ sal_uInt32 nFirst = nFirstLast & 0xFF;
+ sal_uInt32 nLast = nFirstLast >> 8;
+ sal_uInt32 nIndex = nChar & 0xFF;
+ if (nIndex >= nFirst && nIndex <= nLast)
+ {
+ nBytes
+ = pBig5Hkscs2001Data[nOffset + (nIndex - nFirst)];
+ }
+ }
+ }
+ if (nBytes == 0)
+ {
+ sal_uInt32 nIndex1 = nChar >> 8;
+ if (nIndex1 < 0x100)
+ {
+ sal_uInt32 nIndex2 = nChar & 0xFF;
+ sal_uInt32 nFirst = pBig5Data[nIndex1].mnLowStart;
+ if (nIndex2 >= nFirst
+ && nIndex2 <= pBig5Data[nIndex1].mnLowEnd)
+ nBytes = pBig5Data[nIndex1].
+ mpToUniTrailTab[nIndex2 - nFirst];
+ }
+ }
+ if (nBytes == 0)
+ {
+ ImplDBCSEUDCData const * p
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_pEudcData;
+ sal_uInt32 nCount
+ = ((ImplBig5HkscsConverterData const *) pData)->
+ m_nEudcCount;
+ sal_uInt32 i;
+ for (i = 0; i < nCount; ++i) {
+ if (nChar >= p->mnUniStart && nChar <= p->mnUniEnd)
+ {
+ sal_uInt32 nIndex = nChar - p->mnUniStart;
+ sal_uInt32 nLeadOff = nIndex / p->mnTrailRangeCount;
+ sal_uInt32 nTrailOff = nIndex % p->mnTrailRangeCount;
+ sal_uInt32 nSize;
+ nBytes = (p->mnLeadStart + nLeadOff) << 8;
+ nSize = p->mnTrail1End - p->mnTrail1Start + 1;
+ if (nTrailOff < nSize)
+ {
+ nBytes |= p->mnTrail1Start + nTrailOff;
+ break;
+ }
+ nTrailOff -= nSize;
+ nSize = p->mnTrail2End - p->mnTrail2Start + 1;
+ if (nTrailOff < nSize)
+ {
+ nBytes |= p->mnTrail2Start + nTrailOff;
+ break;
+ }
+ nTrailOff -= nSize;
+ nBytes |= p->mnTrail3Start + nTrailOff;
+ break;
+ }
+ ++p;
+ }
+ }
+ if (nBytes == 0)
+ goto bad_input;
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ *pDestBufPtr++ = (sal_Char) (nBytes >> 8);
+ *pDestBufPtr++ = (sal_Char) (nBytes & 0xFF);
+ }
+ else
+ goto no_output;
+ }
+ nHighSurrogate = 0;
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputUnicodeToTextConversion(bUndefined,
+ nChar,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ NULL,
+ 0,
+ NULL))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ nHighSurrogate = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (nHighSurrogate != 0
+ && (nInfo & (RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ nInfo |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputUnicodeToTextConversion(sal_False,
+ 0,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ NULL,
+ 0,
+ NULL))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ ((ImplUnicodeToTextContext *) pContext)->m_nHighSurrogate
+ = nHighSurrogate;
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtChars)
+ *pSrcCvtChars = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
diff --git a/sal/textenc/convertbig5hkscs.h b/sal/textenc/convertbig5hkscs.h
new file mode 100644
index 000000000000..629dd327ccfe
--- /dev/null
+++ b/sal/textenc/convertbig5hkscs.h
@@ -0,0 +1,81 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTBIG5HKSCS_H
+#define INCLUDED_RTL_TEXTENC_CONVERTBIG5HKSCS_H
+
+#include "tenchelp.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+typedef struct
+{
+ sal_uInt16 const * m_pBig5Hkscs2001ToUnicodeData;
+ sal_Int32 const * m_pBig5Hkscs2001ToUnicodeRowOffsets;
+ ImplDBCSToUniLeadTab const * m_pBig5ToUnicodeData;
+ sal_uInt16 const * m_pUnicodeToBig5Hkscs2001Data;
+ sal_Int32 const * m_pUnicodeToBig5Hkscs2001PageOffsets;
+ sal_Int32 const * m_pUnicodeToBig5Hkscs2001PlaneOffsets;
+ ImplUniToDBCSHighTab const * m_pUnicodeToBig5Data;
+ ImplDBCSEUDCData const * m_pEudcData;
+ int m_nEudcCount;
+} ImplBig5HkscsConverterData;
+
+void * ImplCreateBig5HkscsToUnicodeContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetBig5HkscsToUnicodeContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertBig5HkscsToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+ SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertUnicodeToBig5Hkscs(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_CONVERTBIG5HKSCS_H */
diff --git a/sal/textenc/convertbig5hkscs.tab b/sal/textenc/convertbig5hkscs.tab
new file mode 100644
index 000000000000..9fe2a47b5156
--- /dev/null
+++ b/sal/textenc/convertbig5hkscs.tab
@@ -0,0 +1,72 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
+#include "context.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTBIG5HKSCS_H
+#include "convertbig5hkscs.h"
+#endif
+
+#ifndef _RTL_TENCINFO_H
+#include "rtl/tencinfo.h"
+#endif
+#ifndef _RTL_TEXTENC_H
+#include "rtl/textenc.h"
+#endif
+
+#include "generate/big5hkscs2001.tab"
+
+static ImplBig5HkscsConverterData const aImplBig5HkscsConvertData
+ = { aImplBig5Hkscs2001ToUnicodeData,
+ aImplBig5Hkscs2001ToUnicodeRowOffsets,
+ aBIG5UniLeadTab, /* from tcvttcn6.tab */
+ aImplUnicodeToBig5Hkscs2001Data,
+ aImplUnicodeToBig5Hkscs2001PageOffsets,
+ aImplUnicodeToBig5Hkscs2001PlaneOffsets,
+ aBIG5DBCSHighTab, /* from tcvttcn6.tab */
+ aImplMS950DBCSEUDCTab, /* from tcvttcn6.tab */
+ DBCS_EUDC_MS950_COUNT }; /* from tcvttcn6.tab */
+
+static ImplTextEncodingData const aImplBig5HkscsTextEncodingData
+ = { { &aImplBig5HkscsConvertData,
+ &ImplConvertBig5HkscsToUnicode,
+ &ImplConvertUnicodeToBig5Hkscs,
+ &ImplCreateBig5HkscsToUnicodeContext,
+ &ImplDestroyContext,
+ &ImplResetBig5HkscsToUnicodeContext,
+ &ImplCreateUnicodeToTextContext,
+ &ImplDestroyContext,
+ &ImplResetUnicodeToTextContext },
+ 1,
+ 2,
+ 2,
+ 136,
+ "euc-tw",
+ "Big5-HKSCS",
+ RTL_TEXTENCODING_INFO_MULTIBYTE | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CHINESE_TRADITIONAL */
diff --git a/sal/textenc/converter.c b/sal/textenc/converter.c
new file mode 100644
index 000000000000..8911b9dc28e3
--- /dev/null
+++ b/sal/textenc/converter.c
@@ -0,0 +1,164 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "converter.h"
+#include "tenchelp.h"
+#include "unichars.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+ImplBadInputConversionAction ImplHandleBadInputTextToUnicodeConversion(
+ sal_Bool bUndefined, sal_Bool bMultiByte, sal_Char cByte, sal_uInt32 nFlags,
+ sal_Unicode ** pDestBufPtr, sal_Unicode * pDestBufEnd, sal_uInt32 * pInfo)
+{
+ *pInfo |= bUndefined
+ ? (bMultiByte
+ ? RTL_TEXTTOUNICODE_INFO_MBUNDEFINED
+ : RTL_TEXTTOUNICODE_INFO_UNDEFINED)
+ : RTL_TEXTTOUNICODE_INFO_INVALID;
+ switch (nFlags
+ & (bUndefined
+ ? (bMultiByte
+ ? RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK
+ : RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK)
+ : RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK))
+ {
+ case RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR:
+ case RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR:
+ case RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR:
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ return IMPL_BAD_INPUT_STOP;
+
+ case RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_IGNORE:
+ case RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_IGNORE:
+ case RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE:
+ return IMPL_BAD_INPUT_CONTINUE;
+
+ case RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE:
+ if (*pDestBufPtr != pDestBufEnd)
+ {
+ *(*pDestBufPtr)++ = RTL_TEXTCVT_BYTE_PRIVATE_START
+ | ((sal_uChar) cByte);
+ return IMPL_BAD_INPUT_CONTINUE;
+ }
+ else
+ return IMPL_BAD_INPUT_NO_OUTPUT;
+
+ default: /* RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_DEFAULT,
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT,
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT */
+ if (*pDestBufPtr != pDestBufEnd)
+ {
+ *(*pDestBufPtr)++ = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+ return IMPL_BAD_INPUT_CONTINUE;
+ }
+ else
+ return IMPL_BAD_INPUT_NO_OUTPUT;
+ }
+}
+
+ImplBadInputConversionAction
+ImplHandleBadInputUnicodeToTextConversion(sal_Bool bUndefined,
+ sal_uInt32 nUtf32,
+ sal_uInt32 nFlags,
+ sal_Char ** pDestBufPtr,
+ sal_Char * pDestBufEnd,
+ sal_uInt32 * pInfo,
+ sal_Char const * pPrefix,
+ sal_Size nPrefixLen,
+ sal_Bool * pPrefixWritten)
+{
+ /* TODO! RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR */
+
+ sal_Char cReplace;
+
+ if (bUndefined)
+ {
+ if (ImplIsControlOrFormat(nUtf32))
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE) != 0)
+ nFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE;
+ }
+ else if (ImplIsPrivateUse(nUtf32))
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_IGNORE) != 0)
+ nFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE;
+ else if ((nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0) != 0)
+ nFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0;
+ }
+ else if (ImplIsZeroWidth(nUtf32))
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE) != 0)
+ nFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE;
+ }
+ }
+ *pInfo |= bUndefined ? RTL_UNICODETOTEXT_INFO_UNDEFINED :
+ RTL_UNICODETOTEXT_INFO_INVALID;
+ switch (nFlags & (bUndefined ? RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK :
+ RTL_UNICODETOTEXT_FLAGS_INVALID_MASK))
+ {
+ case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR:
+ case RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR:
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR;
+ return IMPL_BAD_INPUT_STOP;
+
+ case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE:
+ case RTL_UNICODETOTEXT_FLAGS_INVALID_IGNORE:
+ if (pPrefixWritten)
+ *pPrefixWritten = sal_False;
+ return IMPL_BAD_INPUT_CONTINUE;
+
+ case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0:
+ case RTL_UNICODETOTEXT_FLAGS_INVALID_0:
+ cReplace = 0;
+ break;
+
+ case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK:
+ case RTL_UNICODETOTEXT_FLAGS_INVALID_QUESTIONMARK:
+ default: /* RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT,
+ RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT */
+ cReplace = '?';
+ break;
+
+ case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_UNDERLINE:
+ case RTL_UNICODETOTEXT_FLAGS_INVALID_UNDERLINE:
+ cReplace = '_';
+ break;
+ }
+ if ((sal_Size) (pDestBufEnd - *pDestBufPtr) > nPrefixLen)
+ {
+ while (nPrefixLen-- > 0)
+ *(*pDestBufPtr)++ = *pPrefix++;
+ *(*pDestBufPtr)++ = cReplace;
+ if (pPrefixWritten)
+ *pPrefixWritten = sal_True;
+ return IMPL_BAD_INPUT_CONTINUE;
+ }
+ else
+ return IMPL_BAD_INPUT_NO_OUTPUT;
+}
diff --git a/sal/textenc/converter.h b/sal/textenc/converter.h
new file mode 100644
index 000000000000..703aa4173acc
--- /dev/null
+++ b/sal/textenc/converter.h
@@ -0,0 +1,66 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTER_H
+#define INCLUDED_RTL_TEXTENC_CONVERTER_H
+
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+typedef enum
+{
+ IMPL_BAD_INPUT_STOP,
+ IMPL_BAD_INPUT_CONTINUE,
+ IMPL_BAD_INPUT_NO_OUTPUT
+} ImplBadInputConversionAction;
+
+ImplBadInputConversionAction
+ImplHandleBadInputTextToUnicodeConversion(
+ sal_Bool bUndefined, sal_Bool bMultiByte, sal_Char cByte, sal_uInt32 nFlags,
+ sal_Unicode ** pDestBufPtr, sal_Unicode * pDestBufEnd, sal_uInt32 * pInfo)
+ SAL_THROW_EXTERN_C();
+
+ImplBadInputConversionAction
+ImplHandleBadInputUnicodeToTextConversion(sal_Bool bUndefined,
+ sal_uInt32 nUtf32,
+ sal_uInt32 nFlags,
+ sal_Char ** pDestBufPtr,
+ sal_Char * pDestBufEnd,
+ sal_uInt32 * pInfo,
+ sal_Char const * pPrefix,
+ sal_Size nPrefixLen,
+ sal_Bool * pPrefixWritten)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_CONVERTER_H */
diff --git a/sal/textenc/converteuctw.c b/sal/textenc/converteuctw.c
new file mode 100644
index 000000000000..f55d87b73d17
--- /dev/null
+++ b/sal/textenc/converteuctw.c
@@ -0,0 +1,452 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "converteuctw.h"
+#include "context.h"
+#include "converter.h"
+#include "tenchelp.h"
+#include "unichars.h"
+#include "rtl/alloc.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+typedef enum
+{
+ IMPL_EUC_TW_TO_UNICODE_STATE_0,
+ IMPL_EUC_TW_TO_UNICODE_STATE_1,
+ IMPL_EUC_TW_TO_UNICODE_STATE_2_1,
+ IMPL_EUC_TW_TO_UNICODE_STATE_2_2,
+ IMPL_EUC_TW_TO_UNICODE_STATE_2_3
+} ImplEucTwToUnicodeState;
+
+typedef struct
+{
+ ImplEucTwToUnicodeState m_eState;
+ sal_Int32 m_nPlane; /* 0--15 */
+ sal_Int32 m_nRow; /* 0--93 */
+} ImplEucTwToUnicodeContext;
+
+void * ImplCreateEucTwToUnicodeContext(void)
+{
+ void * pContext = rtl_allocateMemory(sizeof (ImplEucTwToUnicodeContext));
+ ((ImplEucTwToUnicodeContext *) pContext)->m_eState
+ = IMPL_EUC_TW_TO_UNICODE_STATE_0;
+ return pContext;
+}
+
+void ImplResetEucTwToUnicodeContext(void * pContext)
+{
+ if (pContext)
+ ((ImplEucTwToUnicodeContext *) pContext)->m_eState
+ = IMPL_EUC_TW_TO_UNICODE_STATE_0;
+}
+
+sal_Size ImplConvertEucTwToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+{
+ sal_uInt16 const * pCns116431992Data
+ = ((ImplEucTwConverterData const *) pData)->
+ m_pCns116431992ToUnicodeData;
+ sal_Int32 const * pCns116431992RowOffsets
+ = ((ImplEucTwConverterData const *) pData)->
+ m_pCns116431992ToUnicodeRowOffsets;
+ sal_Int32 const * pCns116431992PlaneOffsets
+ = ((ImplEucTwConverterData const *) pData)->
+ m_pCns116431992ToUnicodePlaneOffsets;
+ ImplEucTwToUnicodeState eState = IMPL_EUC_TW_TO_UNICODE_STATE_0;
+ sal_Int32 nPlane = 0;
+ sal_Int32 nRow = 0;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Unicode * pDestBufPtr = pDestBuf;
+ sal_Unicode * pDestBufEnd = pDestBuf + nDestChars;
+
+ if (pContext)
+ {
+ eState = ((ImplEucTwToUnicodeContext *) pContext)->m_eState;
+ nPlane = ((ImplEucTwToUnicodeContext *) pContext)->m_nPlane;
+ nRow = ((ImplEucTwToUnicodeContext *) pContext)->m_nRow;
+ }
+
+ for (; nConverted < nSrcBytes; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *(sal_uChar const *) pSrcBuf++;
+ switch (eState)
+ {
+ case IMPL_EUC_TW_TO_UNICODE_STATE_0:
+ if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nChar;
+ else
+ goto no_output;
+ else if (nChar >= 0xA1 && nChar <= 0xFE)
+ {
+ nRow = nChar - 0xA1;
+ eState = IMPL_EUC_TW_TO_UNICODE_STATE_1;
+ }
+ else if (nChar == 0x8E)
+ eState = IMPL_EUC_TW_TO_UNICODE_STATE_2_1;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_EUC_TW_TO_UNICODE_STATE_1:
+ if (nChar >= 0xA1 && nChar <= 0xFE)
+ {
+ nPlane = 0;
+ goto transform;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_EUC_TW_TO_UNICODE_STATE_2_1:
+ if (nChar >= 0xA1 && nChar <= 0xB0)
+ {
+ nPlane = nChar - 0xA1;
+ ++eState;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_EUC_TW_TO_UNICODE_STATE_2_2:
+ if (nChar >= 0xA1 && nChar <= 0xFE)
+ {
+ nRow = nChar - 0xA1;
+ ++eState;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_EUC_TW_TO_UNICODE_STATE_2_3:
+ if (nChar >= 0xA1 && nChar <= 0xFE)
+ goto transform;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+ }
+ continue;
+
+ transform:
+ {
+ sal_Int32 nPlaneOffset = pCns116431992PlaneOffsets[nPlane];
+ if (nPlaneOffset == -1)
+ goto bad_input;
+ else
+ {
+ sal_Int32 nOffset
+ = pCns116431992RowOffsets[nPlaneOffset + nRow];
+ if (nOffset == -1)
+ goto bad_input;
+ else
+ {
+ sal_uInt32 nFirstLast = pCns116431992Data[nOffset++];
+ sal_uInt32 nFirst = nFirstLast & 0xFF;
+ sal_uInt32 nLast = nFirstLast >> 8;
+ nChar -= 0xA0;
+ if (nChar >= nFirst && nChar <= nLast)
+ {
+ sal_uInt32 nUnicode
+ = pCns116431992Data[nOffset + (nChar - nFirst)];
+ if (nUnicode == 0xFFFF)
+ goto bad_input;
+ else if (ImplIsHighSurrogate(nUnicode))
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ nOffset += nLast - nFirst + 1;
+ nFirst = pCns116431992Data[nOffset++];
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ *pDestBufPtr++
+ = (sal_Unicode)
+ pCns116431992Data[
+ nOffset + (nChar - nFirst)];
+ }
+ else
+ goto no_output;
+ else
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ else
+ goto no_output;
+ }
+ else
+ goto bad_input;
+ eState = IMPL_EUC_TW_TO_UNICODE_STATE_0;
+ }
+ }
+ continue;
+ }
+
+ bad_input:
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ bUndefined, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ eState = IMPL_EUC_TW_TO_UNICODE_STATE_0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_EUC_TW_TO_UNICODE_STATE_0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (eState != IMPL_EUC_TW_TO_UNICODE_STATE_0
+ && (nInfo & (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0)
+ nInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ sal_False, sal_True, 0, nFlags, &pDestBufPtr,
+ pDestBufEnd, &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_EUC_TW_TO_UNICODE_STATE_0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ {
+ ((ImplEucTwToUnicodeContext *) pContext)->m_eState = eState;
+ ((ImplEucTwToUnicodeContext *) pContext)->m_nPlane = nPlane;
+ ((ImplEucTwToUnicodeContext *) pContext)->m_nRow = nRow;
+ }
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtBytes)
+ *pSrcCvtBytes = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
+
+sal_Size ImplConvertUnicodeToEucTw(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+{
+ sal_uInt8 const * pCns116431992Data
+ = ((ImplEucTwConverterData const *) pData)->
+ m_pUnicodeToCns116431992Data;
+ sal_Int32 const * pCns116431992PageOffsets
+ = ((ImplEucTwConverterData const *) pData)->
+ m_pUnicodeToCns116431992PageOffsets;
+ sal_Int32 const * pCns116431992PlaneOffsets
+ = ((ImplEucTwConverterData const *) pData)->
+ m_pUnicodeToCns116431992PlaneOffsets;
+ sal_Unicode nHighSurrogate = 0;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Char * pDestBufPtr = pDestBuf;
+ sal_Char * pDestBufEnd = pDestBuf + nDestBytes;
+
+ if (pContext)
+ nHighSurrogate
+ = ((ImplUnicodeToTextContext *) pContext)->m_nHighSurrogate;
+
+ for (; nConverted < nSrcChars; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *pSrcBuf++;
+ if (nHighSurrogate == 0)
+ {
+ if (ImplIsHighSurrogate(nChar))
+ {
+ nHighSurrogate = (sal_Unicode) nChar;
+ continue;
+ }
+ }
+ else if (ImplIsLowSurrogate(nChar))
+ nChar = ImplCombineSurrogates(nHighSurrogate, nChar);
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (ImplIsLowSurrogate(nChar) || ImplIsNoncharacter(nChar))
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ else
+ {
+ sal_Int32 nOffset = pCns116431992PlaneOffsets[nChar >> 16];
+ sal_uInt32 nFirst;
+ sal_uInt32 nLast;
+ sal_uInt32 nPlane;
+ if (nOffset == -1)
+ goto bad_input;
+ nOffset
+ = pCns116431992PageOffsets[nOffset + ((nChar & 0xFF00) >> 8)];
+ if (nOffset == -1)
+ goto bad_input;
+ nFirst = pCns116431992Data[nOffset++];
+ nLast = pCns116431992Data[nOffset++];
+ nChar &= 0xFF;
+ if (nChar < nFirst || nChar > nLast)
+ goto bad_input;
+ nOffset += 3 * (nChar - nFirst);
+ nPlane = pCns116431992Data[nOffset++];
+ if (nPlane == 0)
+ goto bad_input;
+ if (pDestBufEnd - pDestBufPtr < (nPlane == 1 ? 2 : 4))
+ goto no_output;
+ if (nPlane != 1)
+ {
+ *pDestBufPtr++ = (sal_Char) (unsigned char) 0x8E;
+ *pDestBufPtr++ = (sal_Char) (0xA0 + nPlane);
+ }
+ *pDestBufPtr++ = (sal_Char) (0xA0 + pCns116431992Data[nOffset++]);
+ *pDestBufPtr++ = (sal_Char) (0xA0 + pCns116431992Data[nOffset]);
+ }
+ nHighSurrogate = 0;
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputUnicodeToTextConversion(bUndefined,
+ nChar,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ NULL,
+ 0,
+ NULL))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ nHighSurrogate = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (nHighSurrogate != 0
+ && (nInfo & (RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ nInfo |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputUnicodeToTextConversion(sal_False,
+ 0,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ NULL,
+ 0,
+ NULL))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ ((ImplUnicodeToTextContext *) pContext)->m_nHighSurrogate
+ = nHighSurrogate;
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtChars)
+ *pSrcCvtChars = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
diff --git a/sal/textenc/converteuctw.h b/sal/textenc/converteuctw.h
new file mode 100644
index 000000000000..f883546a2924
--- /dev/null
+++ b/sal/textenc/converteuctw.h
@@ -0,0 +1,78 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTEUCTW_H
+#define INCLUDED_RTL_TEXTENC_CONVERTEUCTW_H
+
+#include "tenchelp.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+typedef struct
+{
+ sal_uInt16 const * m_pCns116431992ToUnicodeData;
+ sal_Int32 const * m_pCns116431992ToUnicodeRowOffsets;
+ sal_Int32 const * m_pCns116431992ToUnicodePlaneOffsets;
+ sal_uInt8 const * m_pUnicodeToCns116431992Data;
+ sal_Int32 const * m_pUnicodeToCns116431992PageOffsets;
+ sal_Int32 const * m_pUnicodeToCns116431992PlaneOffsets;
+} ImplEucTwConverterData;
+
+void * ImplCreateEucTwToUnicodeContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetEucTwToUnicodeContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertEucTwToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+ SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertUnicodeToEucTw(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_CONVERTEUCTW_H */
diff --git a/sal/textenc/converteuctw.tab b/sal/textenc/converteuctw.tab
new file mode 100644
index 000000000000..c9bfeea697a9
--- /dev/null
+++ b/sal/textenc/converteuctw.tab
@@ -0,0 +1,69 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
+#include "context.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTEUCTW_H
+#include "converteuctw.h"
+#endif
+
+#ifndef _RTL_TENCINFO_H
+#include "rtl/tencinfo.h"
+#endif
+#ifndef _RTL_TEXTENC_H
+#include "rtl/textenc.h"
+#endif
+
+#include "generate/cns116431992.tab"
+
+static ImplEucTwConverterData const aImplEucTwConvertData
+ = { aImplCns116431992ToUnicodeData,
+ aImplCns116431992ToUnicodeRowOffsets,
+ aImplCns116431992ToUnicodePlaneOffsets,
+ aImplUnicodeToCns116431992Data,
+ aImplUnicodeToCns116431992PageOffsets,
+ aImplUnicodeToCns116431992PlaneOffsets };
+
+static ImplTextEncodingData const aImplEucTwTextEncodingData
+ = { { &aImplEucTwConvertData,
+ &ImplConvertEucTwToUnicode,
+ &ImplConvertUnicodeToEucTw,
+ &ImplCreateEucTwToUnicodeContext,
+ &ImplDestroyContext,
+ &ImplResetEucTwToUnicodeContext,
+ &ImplCreateUnicodeToTextContext,
+ &ImplDestroyContext,
+ &ImplResetUnicodeToTextContext },
+ 1,
+ 4,
+ 2,
+ 136,
+ "cns11643-1",
+ "Big5",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* SCRIPT_CHINESE_TRADITIONAL */
diff --git a/sal/textenc/convertgb18030.c b/sal/textenc/convertgb18030.c
new file mode 100644
index 000000000000..bb8fa521d88e
--- /dev/null
+++ b/sal/textenc/convertgb18030.c
@@ -0,0 +1,468 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "convertgb18030.h"
+#include "context.h"
+#include "converter.h"
+#include "tenchelp.h"
+#include "unichars.h"
+#include "rtl/alloc.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+typedef enum
+{
+ IMPL_GB_18030_TO_UNICODE_STATE_0,
+ IMPL_GB_18030_TO_UNICODE_STATE_1,
+ IMPL_GB_18030_TO_UNICODE_STATE_2,
+ IMPL_GB_18030_TO_UNICODE_STATE_3
+} ImplGb18030ToUnicodeState;
+
+typedef struct
+{
+ ImplGb18030ToUnicodeState m_eState;
+ sal_uInt32 m_nCode;
+} ImplGb18030ToUnicodeContext;
+
+void * ImplCreateGb18030ToUnicodeContext(void)
+{
+ void * pContext
+ = rtl_allocateMemory(sizeof (ImplGb18030ToUnicodeContext));
+ ((ImplGb18030ToUnicodeContext *) pContext)->m_eState
+ = IMPL_GB_18030_TO_UNICODE_STATE_0;
+ return pContext;
+}
+
+void ImplResetGb18030ToUnicodeContext(void * pContext)
+{
+ if (pContext)
+ ((ImplGb18030ToUnicodeContext *) pContext)->m_eState
+ = IMPL_GB_18030_TO_UNICODE_STATE_0;
+}
+
+sal_Size ImplConvertGb18030ToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+{
+ sal_Unicode const * pGb18030Data
+ = ((ImplGb18030ConverterData const *) pData)->m_pGb18030ToUnicodeData;
+ ImplGb180302000ToUnicodeRange const * pGb18030Ranges
+ = ((ImplGb18030ConverterData const *) pData)->
+ m_pGb18030ToUnicodeRanges;
+ ImplGb18030ToUnicodeState eState = IMPL_GB_18030_TO_UNICODE_STATE_0;
+ sal_uInt32 nCode = 0;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Unicode * pDestBufPtr = pDestBuf;
+ sal_Unicode * pDestBufEnd = pDestBuf + nDestChars;
+
+ if (pContext)
+ {
+ eState = ((ImplGb18030ToUnicodeContext *) pContext)->m_eState;
+ nCode = ((ImplGb18030ToUnicodeContext *) pContext)->m_nCode;
+ }
+
+ for (; nConverted < nSrcBytes; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *(sal_uChar const *) pSrcBuf++;
+ switch (eState)
+ {
+ case IMPL_GB_18030_TO_UNICODE_STATE_0:
+ if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nChar;
+ else
+ goto no_output;
+ else if (nChar == 0x80)
+ goto bad_input;
+ else if (nChar <= 0xFE)
+ {
+ nCode = nChar - 0x81;
+ eState = IMPL_GB_18030_TO_UNICODE_STATE_1;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_GB_18030_TO_UNICODE_STATE_1:
+ if (nChar >= 0x30 && nChar <= 0x39)
+ {
+ nCode = nCode * 10 + (nChar - 0x30);
+ eState = IMPL_GB_18030_TO_UNICODE_STATE_2;
+ }
+ else if ((nChar >= 0x40 && nChar <= 0x7E)
+ || (nChar >= 0x80 && nChar <= 0xFE))
+ {
+ nCode = nCode * 190 + (nChar <= 0x7E ? nChar - 0x40 :
+ nChar - 0x80 + 63);
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = pGb18030Data[nCode];
+ else
+ goto no_output;
+ eState = IMPL_GB_18030_TO_UNICODE_STATE_0;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_GB_18030_TO_UNICODE_STATE_2:
+ if (nChar >= 0x81 && nChar <= 0xFE)
+ {
+ nCode = nCode * 126 + (nChar - 0x81);
+ eState = IMPL_GB_18030_TO_UNICODE_STATE_3;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_GB_18030_TO_UNICODE_STATE_3:
+ if (nChar >= 0x30 && nChar <= 0x39)
+ {
+ nCode = nCode * 10 + (nChar - 0x30);
+
+ /* 90 30 81 30 to E3 32 9A 35 maps to U+10000 to U+10FFFF: */
+ if (nCode >= 189000 && nCode <= 1237575)
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ nCode -= 189000 - 0x10000;
+ *pDestBufPtr++
+ = (sal_Unicode) ImplGetHighSurrogate(nCode);
+ *pDestBufPtr++
+ = (sal_Unicode) ImplGetLowSurrogate(nCode);
+ }
+ else
+ goto no_output;
+ else
+ {
+ ImplGb180302000ToUnicodeRange const * pRange
+ = pGb18030Ranges;
+ sal_uInt32 nFirstNonRange = 0;
+ for (;;)
+ {
+ if (pRange->m_nNonRangeDataIndex == -1)
+ goto bad_input;
+ else if (nCode < pRange->m_nFirstLinear)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++
+ = pGb18030Data[
+ pRange->m_nNonRangeDataIndex
+ + (nCode - nFirstNonRange)];
+ else
+ goto no_output;
+ break;
+ }
+ else if (nCode < pRange->m_nPastLinear)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++
+ = (sal_Unicode)
+ (pRange->m_nFirstUnicode
+ + (nCode
+ - pRange->
+ m_nFirstLinear));
+ else
+ goto no_output;
+ break;
+ }
+ nFirstNonRange = (pRange++)->m_nPastLinear;
+ }
+ }
+ eState = IMPL_GB_18030_TO_UNICODE_STATE_0;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+ }
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ bUndefined, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ eState = IMPL_GB_18030_TO_UNICODE_STATE_0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_GB_18030_TO_UNICODE_STATE_0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (eState != IMPL_GB_18030_TO_UNICODE_STATE_0
+ && (nInfo & (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0)
+ nInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ sal_False, sal_True, 0, nFlags, &pDestBufPtr,
+ pDestBufEnd, &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_GB_18030_TO_UNICODE_STATE_0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ {
+ ((ImplGb18030ToUnicodeContext *) pContext)->m_eState = eState;
+ ((ImplGb18030ToUnicodeContext *) pContext)->m_nCode = nCode;
+ }
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtBytes)
+ *pSrcCvtBytes = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
+
+sal_Size ImplConvertUnicodeToGb18030(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+{
+ sal_uInt32 const * pGb18030Data
+ = ((ImplGb18030ConverterData const *) pData)->
+ m_pUnicodeToGb18030Data;
+ ImplUnicodeToGb180302000Range const * pGb18030Ranges
+ = ((ImplGb18030ConverterData const *) pData)->
+ m_pUnicodeToGb18030Ranges;
+ sal_Unicode nHighSurrogate = 0;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Char * pDestBufPtr = pDestBuf;
+ sal_Char * pDestBufEnd = pDestBuf + nDestBytes;
+
+ if (pContext)
+ nHighSurrogate
+ = ((ImplUnicodeToTextContext *) pContext)->m_nHighSurrogate;
+
+ for (; nConverted < nSrcChars; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *pSrcBuf++;
+ if (nHighSurrogate == 0)
+ {
+ if (ImplIsHighSurrogate(nChar))
+ {
+ nHighSurrogate = (sal_Unicode) nChar;
+ continue;
+ }
+ }
+ else if (ImplIsLowSurrogate(nChar))
+ nChar = ImplCombineSurrogates(nHighSurrogate, nChar);
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (ImplIsLowSurrogate(nChar) || ImplIsNoncharacter(nChar))
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ else if (nChar < 0x10000)
+ {
+ ImplUnicodeToGb180302000Range const * pRange = pGb18030Ranges;
+ sal_Unicode nFirstNonRange = 0x80;
+ for (;;)
+ {
+ if (nChar < pRange->m_nFirstUnicode)
+ {
+ sal_uInt32 nCode
+ = pGb18030Data[pRange->m_nNonRangeDataIndex
+ + (nChar - nFirstNonRange)];
+ if (pDestBufEnd - pDestBufPtr
+ >= (nCode <= 0xFFFF ? 2 : 4))
+ {
+ if (nCode > 0xFFFF)
+ {
+ *pDestBufPtr++ = (sal_Char) (nCode >> 24);
+ *pDestBufPtr++ = (sal_Char) (nCode >> 16 & 0xFF);
+ }
+ *pDestBufPtr++ = (sal_Char) (nCode >> 8 & 0xFF);
+ *pDestBufPtr++ = (sal_Char) (nCode & 0xFF);
+ }
+ else
+ goto no_output;
+ break;
+ }
+ else if (nChar <= pRange->m_nLastUnicode)
+ {
+ if (pDestBufEnd - pDestBufPtr >= 4)
+ {
+ sal_uInt32 nCode
+ = pRange->m_nFirstLinear
+ + (nChar - pRange->m_nFirstUnicode);
+ *pDestBufPtr++ = (sal_Char) (nCode / 12600 + 0x81);
+ *pDestBufPtr++
+ = (sal_Char) (nCode / 1260 % 10 + 0x30);
+ *pDestBufPtr++ = (sal_Char) (nCode / 10 % 126 + 0x81);
+ *pDestBufPtr++ = (sal_Char) (nCode % 10 + 0x30);
+ }
+ else
+ goto no_output;
+ break;
+ }
+ nFirstNonRange
+ = (sal_Unicode) ((pRange++)->m_nLastUnicode + 1);
+ }
+ }
+ else
+ if (pDestBufEnd - pDestBufPtr >= 4)
+ {
+ sal_uInt32 nCode = nChar - 0x10000;
+ *pDestBufPtr++ = (sal_Char) (nCode / 12600 + 0x90);
+ *pDestBufPtr++ = (sal_Char) (nCode / 1260 % 10 + 0x30);
+ *pDestBufPtr++ = (sal_Char) (nCode / 10 % 126 + 0x81);
+ *pDestBufPtr++ = (sal_Char) (nCode % 10 + 0x30);
+ }
+ else
+ goto no_output;
+ nHighSurrogate = 0;
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputUnicodeToTextConversion(bUndefined,
+ nChar,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ NULL,
+ 0,
+ NULL))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ nHighSurrogate = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (nHighSurrogate != 0
+ && (nInfo & (RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ nInfo |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputUnicodeToTextConversion(sal_False,
+ 0,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ NULL,
+ 0,
+ NULL))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ ((ImplUnicodeToTextContext *) pContext)->m_nHighSurrogate
+ = nHighSurrogate;
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtChars)
+ *pSrcCvtChars = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
diff --git a/sal/textenc/convertgb18030.h b/sal/textenc/convertgb18030.h
new file mode 100644
index 000000000000..0cbbd9e5c2cd
--- /dev/null
+++ b/sal/textenc/convertgb18030.h
@@ -0,0 +1,92 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTGB18030_H
+#define INCLUDED_RTL_TEXTENC_CONVERTGB18030_H
+
+#include "tenchelp.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+typedef struct
+{
+ sal_Int32 m_nNonRangeDataIndex;
+ sal_uInt32 m_nFirstLinear;
+ sal_uInt32 m_nPastLinear;
+ sal_Unicode m_nFirstUnicode;
+} ImplGb180302000ToUnicodeRange;
+
+typedef struct
+{
+ sal_Int32 m_nNonRangeDataIndex;
+ sal_Unicode m_nFirstUnicode;
+ sal_Unicode m_nLastUnicode;
+ sal_uInt32 m_nFirstLinear;
+} ImplUnicodeToGb180302000Range;
+
+typedef struct
+{
+ sal_Unicode const * m_pGb18030ToUnicodeData;
+ ImplGb180302000ToUnicodeRange const * m_pGb18030ToUnicodeRanges;
+ sal_uInt32 const * m_pUnicodeToGb18030Data;
+ ImplUnicodeToGb180302000Range const * m_pUnicodeToGb18030Ranges;
+} ImplGb18030ConverterData;
+
+void * ImplCreateGb18030ToUnicodeContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetGb18030ToUnicodeContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertGb18030ToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+ SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertUnicodeToGb18030(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_CONVERTGB18030_H */
diff --git a/sal/textenc/convertgb18030.tab b/sal/textenc/convertgb18030.tab
new file mode 100644
index 000000000000..d904d4298389
--- /dev/null
+++ b/sal/textenc/convertgb18030.tab
@@ -0,0 +1,69 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
+#include "context.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTGB18030_H
+#include "convertgb18030.h"
+#endif
+
+#ifndef _RTL_TENCINFO_H
+#include "rtl/tencinfo.h"
+#endif
+#ifndef _RTL_TEXTENC_H
+#include "rtl/textenc.h"
+#endif
+
+#include "generate/gb180302000.tab"
+
+static ImplGb18030ConverterData const aImplGb18030ConvertData
+ = { aImplGb180302000ToUnicodeData,
+ aImplGb180302000ToUnicodeRanges,
+ aImplUnicodeToGb180302000Data,
+ aImplUnicodeToGb180302000Ranges };
+
+static ImplTextEncodingData const aImplGb18030TextEncodingData
+ = { { &aImplGb18030ConvertData,
+ &ImplConvertGb18030ToUnicode,
+ &ImplConvertUnicodeToGb18030,
+ &ImplCreateGb18030ToUnicodeContext,
+ &ImplDestroyContext,
+ &ImplResetGb18030ToUnicodeContext,
+ &ImplCreateUnicodeToTextContext,
+ &ImplDestroyContext,
+ &ImplResetUnicodeToTextContext },
+ 1,
+ 4,
+ 2,
+ 134,
+ "gbk-0",
+ "GB18030",
+ RTL_TEXTENCODING_INFO_UNICODE
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CHINESE_SIMPLIFIED */
diff --git a/sal/textenc/convertiscii.tab b/sal/textenc/convertiscii.tab
new file mode 100644
index 000000000000..96f5dc8582c5
--- /dev/null
+++ b/sal/textenc/convertiscii.tab
@@ -0,0 +1,112 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "tenchelp.h"
+
+#include "rtl/tencinfo.h"
+#include "sal/types.h"
+
+#include <stddef.h>
+
+/* Conversion tables for the Devanagari version of ISCII (IS 13194:1991).
+ *
+ * They do not map the ISCII characters INV (0xD9), ATR (0xEF), and EXT (0xF0).
+ * They do not map U+0958--095E to sequences of two ISCII characters, of which
+ * the second would be the combining nukta (0xE9).
+ */
+
+/* The following table is based on LGPL code by Sandeep Patnaik
+ * (patnaik@students.iiit.net) and Sunil Mohan Adapa
+ * (sunilmohanadapa@postmark.net).
+ */
+#define RTL_TEXTENC_ISCII_DEVANAGARI_START 0xA1
+#define RTL_TEXTENC_ISCII_DEVANAGARI_END 0xFA
+static sal_uInt16 const
+aImplIsciiDevanagariToUniTab[RTL_TEXTENC_ISCII_DEVANAGARI_END
+ - RTL_TEXTENC_ISCII_DEVANAGARI_START + 1]
+= { 0x0901, 0x0902, 0x0903, 0x0905, 0x0906, 0x0907, 0x0908, /* A0 */
+ 0x0909, 0x090A, 0x090B, 0x090E, 0x090F, 0x0910, 0x090D, 0x0912,
+ 0x0913, 0x0914, 0x0911, 0x0915, 0x0916, 0x0917, 0x0918, 0x0919, /* B0 */
+ 0x091A, 0x091B, 0x091C, 0x091D, 0x091E, 0x091F, 0x0920, 0x0921,
+ 0x0922, 0x0923, 0x0924, 0x0925, 0x0926, 0x0927, 0x0928, 0x0929, /* C0 */
+ 0x092A, 0x092B, 0x092C, 0x092D, 0x092E, 0x092F, 0x095F, 0x0930,
+ 0x0931, 0x0932, 0x0933, 0x0934, 0x0935, 0x0936, 0x0937, 0x0938, /* D0 */
+ 0x0939, 0, 0x093E, 0x093F, 0x0940, 0x0941, 0x0942, 0x0943,
+ 0x0946, 0x0947, 0x0948, 0x0945, 0x094A, 0x094B, 0x094C, 0x0949, /* E0 */
+ 0x094D, 0x093C, 0x0964, 0, 0, 0, 0, 0,
+ 0, 0x0966, 0x0967, 0x0968, 0x0969, 0x096A, 0x096B, 0x096C, /* F0 */
+ 0x096D, 0x096E, 0x096F };
+
+#define RTL_TEXTENC_UNICODE_DEVANAGARI_START 0x0901
+#define RTL_TEXTENC_UNICODE_DEVANAGARI_END 0x096F
+static sal_uChar const
+aImplUniToIsciiDevanagariTab[RTL_TEXTENC_UNICODE_DEVANAGARI_END
+ - RTL_TEXTENC_UNICODE_DEVANAGARI_START + 1]
+= { 0xA1, 0xA2, 0xA3, 0, 0xA4, 0xA5, 0xA6, /* U+0900 */
+ 0xA7, 0xA8, 0xA9, 0xAA, 0, 0xAE, 0xAB, 0xAC,
+ 0xAD, 0xB2, 0xAF, 0xB0, 0xB1, 0xB3, 0xB4, 0xB5, /* U+0910 */
+ 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD,
+ 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, /* U+0920 */
+ 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD,
+ 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, /* U+0930 */
+ 0xD7, 0xD8, 0, 0, 0xE9, 0, 0xDA, 0xDB,
+ 0xDC, 0xDD, 0xDE, 0xDF, 0, 0xE3, 0xE0, 0xE1, /* U+0940 */
+ 0xE2, 0xE7, 0xE4, 0xE5, 0xE6, 0xE8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, /* U+0950 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCE,
+ 0, 0, 0, 0, 0xEA, 0, 0xF1, 0xF2, /* U+0960 */
+ 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA };
+
+static ImplByteConvertData const aImplIsciiDevanagariConvertData
+= { aImplIsciiDevanagariToUniTab,
+ NULL,
+ RTL_TEXTENC_ISCII_DEVANAGARI_START, RTL_TEXTENC_ISCII_DEVANAGARI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplUniToIsciiDevanagariTab,
+ NULL,
+ NULL,
+ RTL_TEXTENC_UNICODE_DEVANAGARI_START, RTL_TEXTENC_UNICODE_DEVANAGARI_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ 0 };
+
+static ImplTextEncodingData const aImplIsciiDevanagariTextEncodingData
+ = { { &aImplIsciiDevanagariConvertData,
+ &ImplCharToUnicode,
+ &ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 1,
+ NULL,
+ "x-iscii-de",
+ RTL_TEXTENCODING_INFO_ASCII };
diff --git a/sal/textenc/convertiso2022cn.c b/sal/textenc/convertiso2022cn.c
new file mode 100644
index 000000000000..6ae445d99e73
--- /dev/null
+++ b/sal/textenc/convertiso2022cn.c
@@ -0,0 +1,862 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "convertiso2022cn.h"
+#include "context.h"
+#include "converter.h"
+#include "tenchelp.h"
+#include "unichars.h"
+#include "rtl/alloc.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+typedef enum /* order is important: */
+{
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII,
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO,
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO_2,
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_116432,
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_116432_2,
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC,
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR,
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR_RPAREN,
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR_ASTERISK
+} ImplIso2022CnToUnicodeState;
+
+typedef struct
+{
+ ImplIso2022CnToUnicodeState m_eState;
+ sal_uInt32 m_nRow;
+ sal_Bool m_bSo;
+ sal_Bool m_b116431;
+} ImplIso2022CnToUnicodeContext;
+
+typedef enum
+{
+ IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE,
+ IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_2312,
+ IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_116431
+} ImplUnicodeToIso2022CnDesignator;
+
+typedef struct
+{
+ sal_Unicode m_nHighSurrogate;
+ ImplUnicodeToIso2022CnDesignator m_eSoDesignator;
+ sal_Bool m_b116432Designator;
+ sal_Bool m_bSo;
+} ImplUnicodeToIso2022CnContext;
+
+void * ImplCreateIso2022CnToUnicodeContext(void)
+{
+ void * pContext
+ = rtl_allocateMemory(sizeof (ImplIso2022CnToUnicodeContext));
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_eState
+ = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_bSo = sal_False;
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_b116431 = sal_False;
+ return pContext;
+}
+
+void ImplResetIso2022CnToUnicodeContext(void * pContext)
+{
+ if (pContext)
+ {
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_eState
+ = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_bSo = sal_False;
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_b116431 = sal_False;
+ }
+}
+
+sal_Size ImplConvertIso2022CnToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+{
+ ImplDBCSToUniLeadTab const * pGb2312Data
+ = ((ImplIso2022CnConverterData const *) pData)->
+ m_pGb2312ToUnicodeData;
+ sal_uInt16 const * pCns116431992Data
+ = ((ImplIso2022CnConverterData const *) pData)->
+ m_pCns116431992ToUnicodeData;
+ sal_Int32 const * pCns116431992RowOffsets
+ = ((ImplIso2022CnConverterData const *) pData)->
+ m_pCns116431992ToUnicodeRowOffsets;
+ sal_Int32 const * pCns116431992PlaneOffsets
+ = ((ImplIso2022CnConverterData const *) pData)->
+ m_pCns116431992ToUnicodePlaneOffsets;
+ ImplIso2022CnToUnicodeState eState
+ = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ sal_uInt32 nRow = 0;
+ sal_Bool bSo = sal_False;
+ sal_Bool b116431 = sal_False;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Unicode * pDestBufPtr = pDestBuf;
+ sal_Unicode * pDestBufEnd = pDestBuf + nDestChars;
+
+ if (pContext)
+ {
+ eState = ((ImplIso2022CnToUnicodeContext *) pContext)->m_eState;
+ nRow = ((ImplIso2022CnToUnicodeContext *) pContext)->m_nRow;
+ bSo = ((ImplIso2022CnToUnicodeContext *) pContext)->m_bSo;
+ b116431 = ((ImplIso2022CnToUnicodeContext *) pContext)->m_b116431;
+ }
+
+ for (; nConverted < nSrcBytes; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *(sal_uChar const *) pSrcBuf++;
+ sal_uInt32 nPlane;
+ switch (eState)
+ {
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII:
+ if (nChar == 0x0E) /* SO */
+ {
+ bSo = sal_True;
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO;
+ }
+ else if (nChar == 0x1B) /* ESC */
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC;
+ else if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nChar;
+ else
+ goto no_output;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO:
+ if (nChar == 0x0F) /* SI */
+ {
+ bSo = sal_False;
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ }
+ else if (nChar == 0x1B) /* ESC */
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC;
+ else if (nChar >= 0x21 && nChar <= 0x7E)
+ {
+ nRow = nChar;
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO_2;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO_2:
+ if (nChar >= 0x21 && nChar <= 0x7E)
+ if (b116431)
+ {
+ nPlane = 0;
+ goto transform;
+ }
+ else
+ {
+ sal_uInt16 nUnicode = 0;
+ sal_uInt32 nFirst;
+ nRow += 0x80;
+ nChar += 0x80;
+ nFirst = pGb2312Data[nRow].mnTrailStart;
+ if (nChar >= nFirst
+ && nChar <= pGb2312Data[nRow].mnTrailEnd)
+ nUnicode = pGb2312Data[nRow].
+ mpToUniTrailTab[nChar - nFirst];
+ if (nUnicode != 0)
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO;
+ }
+ else
+ goto no_output;
+ else
+ goto bad_input;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_116432:
+ if (nChar >= 0x21 && nChar <= 0x7E)
+ {
+ nRow = nChar;
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_116432_2;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_116432_2:
+ if (nChar >= 0x21 && nChar <= 0x7E)
+ {
+ nPlane = 1;
+ goto transform;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC:
+ if (nChar == 0x24) /* $ */
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR;
+ else if (nChar == 0x4E) /* N */
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_116432;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR:
+ if (nChar == 0x29) /* ) */
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR_RPAREN;
+ else if (nChar == 0x2A) /* * */
+ eState
+ = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR_ASTERISK;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR_RPAREN:
+ if (nChar == 0x41) /* A */
+ {
+ b116431 = sal_False;
+ eState = bSo ? IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO :
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ }
+ else if (nChar == 0x47) /* G */
+ {
+ b116431 = sal_True;
+ eState = bSo ? IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO :
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_CN_TO_UNICODE_STATE_ESC_DOLLAR_ASTERISK:
+ if (nChar == 0x48) /* H */
+ eState = bSo ? IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO :
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+ }
+ continue;
+
+ transform:
+ {
+ sal_Int32 nPlaneOffset = pCns116431992PlaneOffsets[nPlane];
+ if (nPlaneOffset == -1)
+ goto bad_input;
+ else
+ {
+ sal_Int32 nOffset
+ = pCns116431992RowOffsets[nPlaneOffset + (nRow - 0x21)];
+ if (nOffset == -1)
+ goto bad_input;
+ else
+ {
+ sal_uInt32 nFirstLast = pCns116431992Data[nOffset++];
+ sal_uInt32 nFirst = nFirstLast & 0xFF;
+ sal_uInt32 nLast = nFirstLast >> 8;
+ nChar -= 0x20;
+ if (nChar >= nFirst && nChar <= nLast)
+ {
+ sal_uInt32 nUnicode
+ = pCns116431992Data[nOffset + (nChar - nFirst)];
+ if (nUnicode == 0xFFFF)
+ goto bad_input;
+ else if (ImplIsHighSurrogate(nUnicode))
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ nOffset += nLast - nFirst + 1;
+ nFirst = pCns116431992Data[nOffset++];
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ *pDestBufPtr++
+ = (sal_Unicode)
+ pCns116431992Data[
+ nOffset + (nChar - nFirst)];
+ }
+ else
+ goto no_output;
+ else
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ else
+ goto no_output;
+ }
+ else
+ goto bad_input;
+ eState = bSo ? IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO :
+ IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ }
+ }
+ continue;
+ }
+
+ bad_input:
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ bUndefined, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ b116431 = sal_False;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ b116431 = sal_False;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (eState > IMPL_ISO_2022_CN_TO_UNICODE_STATE_SO
+ && (nInfo & (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0)
+ nInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ sal_False, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_ISO_2022_CN_TO_UNICODE_STATE_ASCII;
+ b116431 = sal_False;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ {
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_eState = eState;
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_nRow = nRow;
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_bSo = bSo;
+ ((ImplIso2022CnToUnicodeContext *) pContext)->m_b116431 = b116431;
+ }
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtBytes)
+ *pSrcCvtBytes = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
+
+void * ImplCreateUnicodeToIso2022CnContext(void)
+{
+ void * pContext
+ = rtl_allocateMemory(sizeof (ImplUnicodeToIso2022CnContext));
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_nHighSurrogate = 0;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_eSoDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_b116432Designator
+ = sal_False;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_bSo = sal_False;
+ return pContext;
+}
+
+void ImplResetUnicodeToIso2022CnContext(void * pContext)
+{
+ if (pContext)
+ {
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_nHighSurrogate = 0;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_eSoDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_b116432Designator
+ = sal_False;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_bSo = sal_False;
+ }
+}
+
+static sal_uInt32 ImplIso2022CnTranslateTo2312(ImplUniToDBCSHighTab const *
+ pGb2312Data,
+ sal_uInt32 nChar)
+{
+ sal_uInt32 nIndex1 = nChar >> 8;
+ if (nIndex1 < 0x100)
+ {
+ sal_uInt32 nIndex2 = nChar & 0xFF;
+ sal_uInt32 nFirst = pGb2312Data[nIndex1].mnLowStart;
+ if (nIndex2 >= nFirst && nIndex2 <= pGb2312Data[nIndex1].mnLowEnd)
+ return pGb2312Data[nIndex1].mpToUniTrailTab[nIndex2 - nFirst]
+ & 0x7F7F;
+ }
+ return 0;
+}
+
+static sal_uInt32
+ImplIso2022CnTranslateTo116431(sal_uInt8 const * pCns116431992Data,
+ sal_Int32 const * pCns116431992PageOffsets,
+ sal_Int32 const * pCns116431992PlaneOffsets,
+ sal_uInt32 nChar)
+{
+ sal_Int32 nOffset = pCns116431992PlaneOffsets[nChar >> 16];
+ sal_uInt32 nFirst;
+ sal_uInt32 nLast;
+ sal_uInt32 nPlane;
+ if (nOffset == -1)
+ return 0;
+ nOffset = pCns116431992PageOffsets[nOffset + ((nChar & 0xFF00) >> 8)];
+ if (nOffset == -1)
+ return 0;
+ nFirst = pCns116431992Data[nOffset++];
+ nLast = pCns116431992Data[nOffset++];
+ nChar &= 0xFF;
+ if (nChar < nFirst || nChar > nLast)
+ return 0;
+ nOffset += 3 * (nChar - nFirst);
+ nPlane = pCns116431992Data[nOffset++];
+ if (nPlane != 1)
+ return 0;
+ return (0x20 + pCns116431992Data[nOffset]) << 8
+ | (0x20 + pCns116431992Data[nOffset + 1]);
+}
+
+sal_Size ImplConvertUnicodeToIso2022Cn(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+{
+ ImplUniToDBCSHighTab const * pGb2312Data
+ = ((ImplIso2022CnConverterData const *) pData)->
+ m_pUnicodeToGb2312Data;
+ sal_uInt8 const * pCns116431992Data
+ = ((ImplIso2022CnConverterData const *) pData)->
+ m_pUnicodeToCns116431992Data;
+ sal_Int32 const * pCns116431992PageOffsets
+ = ((ImplIso2022CnConverterData const *) pData)->
+ m_pUnicodeToCns116431992PageOffsets;
+ sal_Int32 const * pCns116431992PlaneOffsets
+ = ((ImplIso2022CnConverterData const *) pData)->
+ m_pUnicodeToCns116431992PlaneOffsets;
+ sal_Unicode nHighSurrogate = 0;
+ ImplUnicodeToIso2022CnDesignator eSoDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE;
+ sal_Bool b116432Designator = sal_False;
+ sal_Bool bSo = sal_False;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Char * pDestBufPtr = pDestBuf;
+ sal_Char * pDestBufEnd = pDestBuf + nDestBytes;
+ sal_Bool bWritten;
+
+ if (pContext)
+ {
+ nHighSurrogate
+ = ((ImplUnicodeToIso2022CnContext *) pContext)->m_nHighSurrogate;
+ eSoDesignator
+ = ((ImplUnicodeToIso2022CnContext *) pContext)->m_eSoDesignator;
+ b116432Designator = ((ImplUnicodeToIso2022CnContext *) pContext)->
+ m_b116432Designator;
+ bSo = ((ImplUnicodeToIso2022CnContext *) pContext)->m_bSo;
+ }
+
+ for (; nConverted < nSrcChars; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *pSrcBuf++;
+ if (nHighSurrogate == 0)
+ {
+ if (ImplIsHighSurrogate(nChar))
+ {
+ nHighSurrogate = (sal_Unicode) nChar;
+ continue;
+ }
+ }
+ else if (ImplIsLowSurrogate(nChar))
+ nChar = ImplCombineSurrogates(nHighSurrogate, nChar);
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (ImplIsLowSurrogate(nChar) || ImplIsNoncharacter(nChar))
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (nChar == 0x0A || nChar == 0x0D) /* LF, CR */
+ {
+ if (bSo)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0F; /* SI */
+ bSo = sal_False;
+ eSoDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE;
+ b116432Designator = sal_False;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ }
+ else if (nChar == 0x0E || nChar == 0x0F || nChar == 0x1B)
+ goto bad_input;
+ else if (nChar < 0x80)
+ {
+ if (bSo)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0F; /* SI */
+ bSo = sal_False;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ }
+ else
+ {
+ sal_uInt32 nBytes = 0;
+ ImplUnicodeToIso2022CnDesignator eNewDesignator =
+ IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE;
+ switch (eSoDesignator)
+ {
+ case IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE:
+ nBytes = ImplIso2022CnTranslateTo2312(pGb2312Data, nChar);
+ if (nBytes != 0)
+ {
+ eNewDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_2312;
+ break;
+ }
+ nBytes = ImplIso2022CnTranslateTo116431(
+ pCns116431992Data,
+ pCns116431992PageOffsets,
+ pCns116431992PlaneOffsets,
+ nChar);
+ if (nBytes != 0)
+ {
+ eNewDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_116431;
+ break;
+ }
+ break;
+
+ case IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_2312:
+ nBytes = ImplIso2022CnTranslateTo2312(pGb2312Data, nChar);
+ if (nBytes != 0)
+ {
+ eNewDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE;
+ break;
+ }
+ nBytes = ImplIso2022CnTranslateTo116431(
+ pCns116431992Data,
+ pCns116431992PageOffsets,
+ pCns116431992PlaneOffsets,
+ nChar);
+ if (nBytes != 0)
+ {
+ eNewDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_116431;
+ break;
+ }
+ break;
+
+ case IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_116431:
+ nBytes = ImplIso2022CnTranslateTo116431(
+ pCns116431992Data,
+ pCns116431992PageOffsets,
+ pCns116431992PlaneOffsets,
+ nChar);
+ if (nBytes != 0)
+ {
+ eNewDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE;
+ break;
+ }
+ nBytes = ImplIso2022CnTranslateTo2312(pGb2312Data, nChar);
+ if (nBytes != 0)
+ {
+ eNewDesignator
+ = IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_2312;
+ break;
+ }
+ break;
+ }
+ if (nBytes != 0)
+ {
+ if (eNewDesignator
+ != IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_NONE)
+ {
+ if (bSo)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0F; /* SI */
+ bSo = sal_False;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufEnd - pDestBufPtr >= 4)
+ {
+ *pDestBufPtr++ = 0x1B; /* ESC */
+ *pDestBufPtr++ = 0x24; /* $ */
+ *pDestBufPtr++ = 0x29; /* ) */
+ *pDestBufPtr++
+ = eNewDesignator
+ == IMPL_UNICODE_TO_ISO_2022_CN_DESIGNATOR_2312 ?
+ 0x41 : 0x47; /* A, G */
+ eSoDesignator = eNewDesignator;
+ }
+ else
+ goto no_output;
+ }
+ if (!bSo)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0E; /* SO */
+ bSo = sal_True;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufEnd - pDestBufPtr >= 4)
+ {
+ *pDestBufPtr++ = (sal_Char) (nBytes >> 8);
+ *pDestBufPtr++ = (sal_Char) (nBytes & 0xFF);
+ }
+ else
+ goto no_output;
+ }
+ else
+ {
+ sal_Int32 nOffset = pCns116431992PlaneOffsets[nChar >> 16];
+ sal_uInt32 nFirst;
+ sal_uInt32 nLast;
+ sal_uInt32 nPlane;
+ if (nOffset == -1)
+ goto bad_input;
+ nOffset
+ = pCns116431992PageOffsets[nOffset
+ + ((nChar & 0xFF00) >> 8)];
+ if (nOffset == -1)
+ goto bad_input;
+ nFirst = pCns116431992Data[nOffset++];
+ nLast = pCns116431992Data[nOffset++];
+ nChar &= 0xFF;
+ if (nChar < nFirst || nChar > nLast)
+ goto bad_input;
+ nOffset += 3 * (nChar - nFirst);
+ nPlane = pCns116431992Data[nOffset++];
+ if (nPlane != 2)
+ goto bad_input;
+ if (!b116432Designator)
+ {
+ if (pDestBufEnd - pDestBufPtr >= 4)
+ {
+ *pDestBufPtr++ = 0x1B; /* ESC */
+ *pDestBufPtr++ = 0x24; /* $ */
+ *pDestBufPtr++ = 0x2A; /* * */
+ *pDestBufPtr++ = 0x48; /* H */
+ b116432Designator = sal_True;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufEnd - pDestBufPtr >= 4)
+ {
+ *pDestBufPtr++ = 0x1B; /* ESC */
+ *pDestBufPtr++ = 0x4E; /* N */
+ *pDestBufPtr++
+ = (sal_Char) (0x20 + pCns116431992Data[nOffset++]);
+ *pDestBufPtr++
+ = (sal_Char) (0x20 + pCns116431992Data[nOffset]);
+ }
+ else
+ goto no_output;
+ }
+ }
+ nHighSurrogate = 0;
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputUnicodeToTextConversion(bUndefined,
+ nChar,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ "\x0F", /* SI */
+ bSo ? 1 : 0,
+ &bWritten))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ if (bWritten)
+ bSo = sal_False;
+ nHighSurrogate = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if ((nInfo & (RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ sal_Bool bFlush = sal_True;
+ if (nHighSurrogate != 0)
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ nInfo |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputUnicodeToTextConversion(
+ sal_False,
+ 0,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ "\x0F", /* SI */
+ bSo ? 1 : 0,
+ &bWritten))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ bFlush = sal_False;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ if (bWritten)
+ bSo = sal_False;
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+ if (bFlush && bSo && (nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0F; /* SI */
+ bSo = sal_False;
+ }
+ else
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ }
+ }
+
+ if (pContext)
+ {
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_nHighSurrogate
+ = nHighSurrogate;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_eSoDesignator
+ = eSoDesignator;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_b116432Designator
+ = b116432Designator;
+ ((ImplUnicodeToIso2022CnContext *) pContext)->m_bSo = bSo;
+ }
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtChars)
+ *pSrcCvtChars = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
diff --git a/sal/textenc/convertiso2022cn.h b/sal/textenc/convertiso2022cn.h
new file mode 100644
index 000000000000..4315e63b4faf
--- /dev/null
+++ b/sal/textenc/convertiso2022cn.h
@@ -0,0 +1,84 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTISO2022CN_H
+#define INCLUDED_RTL_TEXTENC_CONVERTISO2022CN_H
+
+#include "tenchelp.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+typedef struct
+{
+ ImplDBCSToUniLeadTab const * m_pGb2312ToUnicodeData;
+ sal_uInt16 const * m_pCns116431992ToUnicodeData;
+ sal_Int32 const * m_pCns116431992ToUnicodeRowOffsets;
+ sal_Int32 const * m_pCns116431992ToUnicodePlaneOffsets;
+ ImplUniToDBCSHighTab const * m_pUnicodeToGb2312Data;
+ sal_uInt8 const * m_pUnicodeToCns116431992Data;
+ sal_Int32 const * m_pUnicodeToCns116431992PageOffsets;
+ sal_Int32 const * m_pUnicodeToCns116431992PlaneOffsets;
+} ImplIso2022CnConverterData;
+
+void * ImplCreateIso2022CnToUnicodeContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetIso2022CnToUnicodeContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertIso2022CnToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+ SAL_THROW_EXTERN_C();
+
+void * ImplCreateUnicodeToIso2022CnContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetUnicodeToIso2022CnContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertUnicodeToIso2022Cn(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_CONVERTISO2022CN_H */
diff --git a/sal/textenc/convertiso2022cn.tab b/sal/textenc/convertiso2022cn.tab
new file mode 100644
index 000000000000..937437693209
--- /dev/null
+++ b/sal/textenc/convertiso2022cn.tab
@@ -0,0 +1,77 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
+#include "context.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTISO2022CN_H
+#include "convertiso2022cn.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_TENCHELP_H
+#include "tenchelp.h"
+#endif
+
+#ifndef _RTL_TENCINFO_H
+#include "rtl/tencinfo.h"
+#endif
+#ifndef _RTL_TEXTENC_H
+#include "rtl/textenc.h"
+#endif
+
+static ImplIso2022CnConverterData const aImplIso2022CnConvertData
+ = { aGB2312UniLeadTab, /* from tcvtscn6.tab */
+ aImplCns116431992ToUnicodeData, /* from generate/cns116431992.tab */
+ aImplCns116431992ToUnicodeRowOffsets,
+ /* from generate/cns116431992.tab */
+ aImplCns116431992ToUnicodePlaneOffsets,
+ /* from generate/cns116431992.tab */
+ aGB2312DBCSHighTab, /* from tcvtscn6.tab */
+ aImplUnicodeToCns116431992Data, /* from generate/cns116431992.tab */
+ aImplUnicodeToCns116431992PageOffsets,
+ /* from generate/cns116431992.tab */
+ aImplUnicodeToCns116431992PlaneOffsets };
+ /* from generate/cns116431992.tab */
+
+static ImplTextEncodingData const aImplIso2022CnTextEncodingData
+ = { { &aImplIso2022CnConvertData,
+ &ImplConvertIso2022CnToUnicode,
+ &ImplConvertUnicodeToIso2022Cn,
+ &ImplCreateIso2022CnToUnicodeContext,
+ &ImplDestroyContext,
+ &ImplResetIso2022CnToUnicodeContext,
+ &ImplCreateUnicodeToIso2022CnContext,
+ &ImplDestroyContext,
+ &ImplResetUnicodeToIso2022CnContext },
+ 1,
+ 8,
+ 2,
+ 134,
+ "euc-cn",
+ "ISO-2022-CN",
+ RTL_TEXTENCODING_INFO_CONTEXT
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
diff --git a/sal/textenc/convertiso2022jp.c b/sal/textenc/convertiso2022jp.c
new file mode 100644
index 000000000000..82edc8dbfb68
--- /dev/null
+++ b/sal/textenc/convertiso2022jp.c
@@ -0,0 +1,569 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "convertiso2022jp.h"
+#include "context.h"
+#include "converter.h"
+#include "tenchelp.h"
+#include "unichars.h"
+#include "rtl/alloc.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+typedef enum /* order is important: */
+{
+ IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII,
+ IMPL_ISO_2022_JP_TO_UNICODE_STATE_JIS_ROMAN,
+ IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208,
+ IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208_2,
+ IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC,
+ IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_LPAREN,
+ IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_DOLLAR
+} ImplIso2022JpToUnicodeState;
+
+typedef struct
+{
+ ImplIso2022JpToUnicodeState m_eState;
+ sal_uInt32 m_nRow;
+} ImplIso2022JpToUnicodeContext;
+
+typedef struct
+{
+ sal_Unicode m_nHighSurrogate;
+ sal_Bool m_b0208;
+} ImplUnicodeToIso2022JpContext;
+
+void * ImplCreateIso2022JpToUnicodeContext(void)
+{
+ void * pContext
+ = rtl_allocateMemory(sizeof (ImplIso2022JpToUnicodeContext));
+ ((ImplIso2022JpToUnicodeContext *) pContext)->m_eState
+ = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
+ return pContext;
+}
+
+void ImplResetIso2022JpToUnicodeContext(void * pContext)
+{
+ if (pContext)
+ ((ImplIso2022JpToUnicodeContext *) pContext)->m_eState
+ = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
+}
+
+sal_Size ImplConvertIso2022JpToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+{
+ ImplDBCSToUniLeadTab const * pJisX0208Data
+ = ((ImplIso2022JpConverterData const *) pData)->
+ m_pJisX0208ToUnicodeData;
+ ImplIso2022JpToUnicodeState eState
+ = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
+ sal_uInt32 nRow = 0;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Unicode * pDestBufPtr = pDestBuf;
+ sal_Unicode * pDestBufEnd = pDestBuf + nDestChars;
+
+ if (pContext)
+ {
+ eState = ((ImplIso2022JpToUnicodeContext *) pContext)->m_eState;
+ nRow = ((ImplIso2022JpToUnicodeContext *) pContext)->m_nRow;
+ }
+
+ for (; nConverted < nSrcBytes; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *(sal_uChar const *) pSrcBuf++;
+ switch (eState)
+ {
+ case IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII:
+ if (nChar == 0x1B) /* ESC */
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC;
+ else if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nChar;
+ else
+ goto no_output;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_JP_TO_UNICODE_STATE_JIS_ROMAN:
+ if (nChar == 0x1B) /* ESC */
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC;
+ else if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ switch (nChar)
+ {
+ case 0x5C: /* \ */
+ nChar = 0xA5; /* YEN SIGN */
+ break;
+
+ case 0x7E: /* ~ */
+ nChar = 0xAF; /* MACRON */
+ break;
+ }
+ *pDestBufPtr++ = (sal_Unicode) nChar;
+ }
+ else
+ goto no_output;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208:
+ if (nChar == 0x1B) /* ESC */
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC;
+ else if (nChar >= 0x21 && nChar <= 0x7E)
+ {
+ nRow = nChar;
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208_2;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208_2:
+ if (nChar >= 0x21 && nChar <= 0x7E)
+ {
+ sal_uInt16 nUnicode = 0;
+ sal_uInt32 nFirst = pJisX0208Data[nRow].mnTrailStart;
+ if (nChar >= nFirst
+ && nChar <= pJisX0208Data[nRow].mnTrailEnd)
+ nUnicode = pJisX0208Data[nRow].
+ mpToUniTrailTab[nChar - nFirst];
+ if (nUnicode != 0)
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208;
+ }
+ else
+ goto no_output;
+ else
+ goto bad_input;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC:
+ switch (nChar)
+ {
+ case 0x24: /* $ */
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_DOLLAR;
+ break;
+
+ case 0x28: /* ( */
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_LPAREN;
+ break;
+
+ default:
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_LPAREN:
+ switch (nChar)
+ {
+ case 0x42: /* A */
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
+ break;
+
+ case 0x4A: /* J */
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_JIS_ROMAN;
+ break;
+
+ default:
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_JP_TO_UNICODE_STATE_ESC_DOLLAR:
+ switch (nChar)
+ {
+ case 0x40: /* @ */
+ case 0x42: /* B */
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208;
+ break;
+
+ default:
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+ }
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ bUndefined, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (eState > IMPL_ISO_2022_JP_TO_UNICODE_STATE_0208
+ && (nInfo & (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0)
+ nInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ sal_False, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_ISO_2022_JP_TO_UNICODE_STATE_ASCII;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ {
+ ((ImplIso2022JpToUnicodeContext *) pContext)->m_eState = eState;
+ ((ImplIso2022JpToUnicodeContext *) pContext)->m_nRow = nRow;
+ }
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtBytes)
+ *pSrcCvtBytes = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
+
+void * ImplCreateUnicodeToIso2022JpContext(void)
+{
+ void * pContext
+ = rtl_allocateMemory(sizeof (ImplUnicodeToIso2022JpContext));
+ ((ImplUnicodeToIso2022JpContext *) pContext)->m_nHighSurrogate = 0;
+ ((ImplUnicodeToIso2022JpContext *) pContext)->m_b0208 = sal_False;
+ return pContext;
+}
+
+void ImplResetUnicodeToIso2022JpContext(void * pContext)
+{
+ if (pContext)
+ {
+ ((ImplUnicodeToIso2022JpContext *) pContext)->m_nHighSurrogate = 0;
+ ((ImplUnicodeToIso2022JpContext *) pContext)->m_b0208 = sal_False;
+ }
+}
+
+sal_Size ImplConvertUnicodeToIso2022Jp(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+{
+ ImplUniToDBCSHighTab const * pJisX0208Data
+ = ((ImplIso2022JpConverterData const *) pData)->
+ m_pUnicodeToJisX0208Data;
+ sal_Unicode nHighSurrogate = 0;
+ sal_Bool b0208 = sal_False;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Char * pDestBufPtr = pDestBuf;
+ sal_Char * pDestBufEnd = pDestBuf + nDestBytes;
+ sal_Bool bWritten;
+
+ if (pContext)
+ {
+ nHighSurrogate
+ = ((ImplUnicodeToIso2022JpContext *) pContext)->m_nHighSurrogate;
+ b0208 = ((ImplUnicodeToIso2022JpContext *) pContext)->m_b0208;
+ }
+
+ for (; nConverted < nSrcChars; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *pSrcBuf++;
+ if (nHighSurrogate == 0)
+ {
+ if (ImplIsHighSurrogate(nChar))
+ {
+ nHighSurrogate = (sal_Unicode) nChar;
+ continue;
+ }
+ }
+ else if (ImplIsLowSurrogate(nChar))
+ nChar = ImplCombineSurrogates(nHighSurrogate, nChar);
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (ImplIsLowSurrogate(nChar) || ImplIsNoncharacter(nChar))
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (nChar == 0x0A || nChar == 0x0D) /* LF, CR */
+ {
+ if (b0208)
+ {
+ if (pDestBufEnd - pDestBufPtr >= 3)
+ {
+ *pDestBufPtr++ = 0x1B; /* ESC */
+ *pDestBufPtr++ = 0x28; /* ( */
+ *pDestBufPtr++ = 0x42; /* B */
+ b0208 = sal_False;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ }
+ else if (nChar == 0x1B)
+ goto bad_input;
+ else if (nChar < 0x80)
+ {
+ if (b0208)
+ {
+ if (pDestBufEnd - pDestBufPtr >= 3)
+ {
+ *pDestBufPtr++ = 0x1B; /* ESC */
+ *pDestBufPtr++ = 0x28; /* ( */
+ *pDestBufPtr++ = 0x42; /* B */
+ b0208 = sal_False;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ }
+ else
+ {
+ sal_uInt16 nBytes = 0;
+ sal_uInt32 nIndex1 = nChar >> 8;
+ if (nIndex1 < 0x100)
+ {
+ sal_uInt32 nIndex2 = nChar & 0xFF;
+ sal_uInt32 nFirst = pJisX0208Data[nIndex1].mnLowStart;
+ if (nIndex2 >= nFirst
+ && nIndex2 <= pJisX0208Data[nIndex1].mnLowEnd)
+ {
+ nBytes = pJisX0208Data[nIndex1].
+ mpToUniTrailTab[nIndex2 - nFirst];
+ if (nBytes == 0)
+ /* For some reason, the tables in tcvtjp4.tab do not
+ include these two conversions: */
+ switch (nChar)
+ {
+ case 0xA5: /* YEN SIGN */
+ nBytes = 0x216F;
+ break;
+
+ case 0xAF: /* MACRON */
+ nBytes = 0x2131;
+ break;
+ }
+ }
+ }
+ if (nBytes != 0)
+ {
+ if (!b0208)
+ {
+ if (pDestBufEnd - pDestBufPtr >= 3)
+ {
+ *pDestBufPtr++ = 0x1B; /* ESC */
+ *pDestBufPtr++ = 0x24; /* $ */
+ *pDestBufPtr++ = 0x42; /* B */
+ b0208 = sal_True;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ *pDestBufPtr++ = (sal_Char) (nBytes >> 8);
+ *pDestBufPtr++ = (sal_Char) (nBytes & 0xFF);
+ }
+ else
+ goto no_output;
+ }
+ else
+ goto bad_input;
+ }
+ nHighSurrogate = 0;
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputUnicodeToTextConversion(
+ bUndefined,
+ nChar,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ "\x1B(B",
+ b0208 ? 3 : 0,
+ &bWritten))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ if (bWritten)
+ b0208 = sal_False;
+ nHighSurrogate = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if ((nInfo & (RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ sal_Bool bFlush = sal_True;
+ if (nHighSurrogate != 0)
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ nInfo |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputUnicodeToTextConversion(
+ sal_False,
+ 0,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ "\x1B(B",
+ b0208 ? 3 : 0,
+ &bWritten))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ bFlush = sal_False;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ if (bWritten)
+ b0208 = sal_False;
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+ if (bFlush
+ && b0208
+ && (nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ {
+ if (pDestBufEnd - pDestBufPtr >= 3)
+ {
+ *pDestBufPtr++ = 0x1B; /* ESC */
+ *pDestBufPtr++ = 0x28; /* ( */
+ *pDestBufPtr++ = 0x42; /* B */
+ b0208 = sal_False;
+ }
+ else
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ }
+ }
+
+ if (pContext)
+ {
+ ((ImplUnicodeToIso2022JpContext *) pContext)->m_nHighSurrogate
+ = nHighSurrogate;
+ ((ImplUnicodeToIso2022JpContext *) pContext)->m_b0208 = b0208;
+ }
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtChars)
+ *pSrcCvtChars = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
diff --git a/sal/textenc/convertiso2022jp.h b/sal/textenc/convertiso2022jp.h
new file mode 100644
index 000000000000..275d51c7caba
--- /dev/null
+++ b/sal/textenc/convertiso2022jp.h
@@ -0,0 +1,78 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTISO2022JP_H
+#define INCLUDED_RTL_TEXTENC_CONVERTISO2022JP_H
+
+#include "tenchelp.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+typedef struct
+{
+ ImplDBCSToUniLeadTab const * m_pJisX0208ToUnicodeData;
+ ImplUniToDBCSHighTab const * m_pUnicodeToJisX0208Data;
+} ImplIso2022JpConverterData;
+
+void * ImplCreateIso2022JpToUnicodeContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetIso2022JpToUnicodeContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertIso2022JpToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+ SAL_THROW_EXTERN_C();
+
+void * ImplCreateUnicodeToIso2022JpContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetUnicodeToIso2022JpContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertUnicodeToIso2022Jp(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_CONVERTISO2022JP_H */
diff --git a/sal/textenc/convertiso2022jp.tab b/sal/textenc/convertiso2022jp.tab
new file mode 100644
index 000000000000..5775491c87f5
--- /dev/null
+++ b/sal/textenc/convertiso2022jp.tab
@@ -0,0 +1,68 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
+#include "context.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTISO2022JP_H
+#include "convertiso2022jp.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_TENCHELP_H
+#include "tenchelp.h"
+#endif
+
+#ifndef _RTL_TENCINFO_H
+#include "rtl/tencinfo.h"
+#endif
+#ifndef _RTL_TEXTENC_H
+#include "rtl/textenc.h"
+#endif
+
+static ImplIso2022JpConverterData const aImplIso2022JpConvertData
+ = { aJIS0208UniLeadTab, /* from tcvtjp6.tab */
+ aJIS0208DBCSHighTab }; /* from tcvtjp6.tab */
+
+static ImplTextEncodingData const aImplIso2022JpTextEncodingData
+ = { { &aImplIso2022JpConvertData,
+ &ImplConvertIso2022JpToUnicode,
+ &ImplConvertUnicodeToIso2022Jp,
+ &ImplCreateIso2022JpToUnicodeContext,
+ &ImplDestroyContext,
+ &ImplResetIso2022JpToUnicodeContext,
+ &ImplCreateUnicodeToIso2022JpContext,
+ &ImplDestroyContext,
+ &ImplResetUnicodeToIso2022JpContext },
+ 1,
+ 8,
+ 2,
+ 128,
+ "euc-jp",
+ "ISO-2022-JP",
+ RTL_TEXTENCODING_INFO_CONTEXT
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_JAPANESE */
diff --git a/sal/textenc/convertiso2022kr.c b/sal/textenc/convertiso2022kr.c
new file mode 100644
index 000000000000..c2bbee3196a8
--- /dev/null
+++ b/sal/textenc/convertiso2022kr.c
@@ -0,0 +1,527 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "convertiso2022kr.h"
+#include "context.h"
+#include "converter.h"
+#include "tenchelp.h"
+#include "unichars.h"
+#include "rtl/alloc.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+typedef enum /* order is important: */
+{
+ IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII,
+ IMPL_ISO_2022_KR_TO_UNICODE_STATE_1001,
+ IMPL_ISO_2022_KR_TO_UNICODE_STATE_1001_2,
+ IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC,
+ IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC_DOLLAR,
+ IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC_DOLLAR_RPAREN
+} ImplIso2022KrToUnicodeState;
+
+typedef struct
+{
+ ImplIso2022KrToUnicodeState m_eState;
+ sal_uInt32 m_nRow;
+} ImplIso2022KrToUnicodeContext;
+
+typedef enum
+{
+ IMPL_UNICODE_TO_ISO_2022_KR_SET_NONE,
+ IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII,
+ IMPL_UNICODE_TO_ISO_2022_KR_SET_1001
+} ImplUnicodeToIso2022KrSet;
+
+typedef struct
+{
+ sal_Unicode m_nHighSurrogate;
+ ImplUnicodeToIso2022KrSet m_eSet;
+} ImplUnicodeToIso2022KrContext;
+
+void * ImplCreateIso2022KrToUnicodeContext(void)
+{
+ void * pContext
+ = rtl_allocateMemory(sizeof (ImplIso2022KrToUnicodeContext));
+ ((ImplIso2022KrToUnicodeContext *) pContext)->m_eState
+ = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII;
+ return pContext;
+}
+
+void ImplResetIso2022KrToUnicodeContext(void * pContext)
+{
+ if (pContext)
+ ((ImplIso2022KrToUnicodeContext *) pContext)->m_eState
+ = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII;
+}
+
+sal_Size ImplConvertIso2022KrToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+{
+ ImplDBCSToUniLeadTab const * pKsX1001Data
+ = ((ImplIso2022KrConverterData const *) pData)->
+ m_pKsX1001ToUnicodeData;
+ ImplIso2022KrToUnicodeState eState
+ = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII;
+ sal_uInt32 nRow = 0;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Unicode * pDestBufPtr = pDestBuf;
+ sal_Unicode * pDestBufEnd = pDestBuf + nDestChars;
+
+ if (pContext)
+ {
+ eState = ((ImplIso2022KrToUnicodeContext *) pContext)->m_eState;
+ nRow = ((ImplIso2022KrToUnicodeContext *) pContext)->m_nRow;
+ }
+
+ for (; nConverted < nSrcBytes; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *(sal_uChar const *) pSrcBuf++;
+ switch (eState)
+ {
+ case IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII:
+ if (nChar == 0x0E) /* SO */
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_1001;
+ else if (nChar == 0x1B) /* ESC */
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC;
+ else if (nChar < 0x80)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nChar;
+ else
+ goto no_output;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_KR_TO_UNICODE_STATE_1001:
+ if (nChar == 0x0F) /* SI */
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII;
+ else if (nChar >= 0x21 && nChar <= 0x7E)
+ {
+ nRow = nChar + 0x80;
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_1001_2;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_KR_TO_UNICODE_STATE_1001_2:
+ if (nChar >= 0x21 && nChar <= 0x7E)
+ {
+ sal_uInt16 nUnicode = 0;
+ sal_uInt32 nFirst = pKsX1001Data[nRow].mnTrailStart;
+ nChar += 0x80;
+ if (nChar >= nFirst && nChar <= pKsX1001Data[nRow].mnTrailEnd)
+ nUnicode = pKsX1001Data[nRow].
+ mpToUniTrailTab[nChar - nFirst];
+ if (nUnicode != 0)
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = (sal_Unicode) nUnicode;
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_1001;
+ }
+ else
+ goto no_output;
+ else
+ goto bad_input;
+ }
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC:
+ if (nChar == 0x24) /* $ */
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC_DOLLAR;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC_DOLLAR:
+ if (nChar == 0x29) /* ) */
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC_DOLLAR_RPAREN;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+
+ case IMPL_ISO_2022_KR_TO_UNICODE_STATE_ESC_DOLLAR_RPAREN:
+ if (nChar == 0x43) /* C */
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII;
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+ break;
+ }
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ bUndefined, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (eState > IMPL_ISO_2022_KR_TO_UNICODE_STATE_1001
+ && (nInfo & (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0)
+ nInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ sal_False, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ eState = IMPL_ISO_2022_KR_TO_UNICODE_STATE_ASCII;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext)
+ {
+ ((ImplIso2022KrToUnicodeContext *) pContext)->m_eState = eState;
+ ((ImplIso2022KrToUnicodeContext *) pContext)->m_nRow = nRow;
+ }
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtBytes)
+ *pSrcCvtBytes = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
+
+void * ImplCreateUnicodeToIso2022KrContext(void)
+{
+ void * pContext
+ = rtl_allocateMemory(sizeof (ImplUnicodeToIso2022KrContext));
+ ((ImplUnicodeToIso2022KrContext *) pContext)->m_nHighSurrogate = 0;
+ ((ImplUnicodeToIso2022KrContext *) pContext)->m_eSet
+ = IMPL_UNICODE_TO_ISO_2022_KR_SET_NONE;
+ return pContext;
+}
+
+void ImplResetUnicodeToIso2022KrContext(void * pContext)
+{
+ if (pContext)
+ {
+ ((ImplUnicodeToIso2022KrContext *) pContext)->m_nHighSurrogate = 0;
+ ((ImplUnicodeToIso2022KrContext *) pContext)->m_eSet
+ = IMPL_UNICODE_TO_ISO_2022_KR_SET_NONE;
+ }
+}
+
+sal_Size ImplConvertUnicodeToIso2022Kr(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+{
+ ImplUniToDBCSHighTab const * pKsX1001Data
+ = ((ImplIso2022KrConverterData const *) pData)->
+ m_pUnicodeToKsX1001Data;
+ sal_Unicode nHighSurrogate = 0;
+ ImplUnicodeToIso2022KrSet eSet = IMPL_UNICODE_TO_ISO_2022_KR_SET_NONE;
+ sal_uInt32 nInfo = 0;
+ sal_Size nConverted = 0;
+ sal_Char * pDestBufPtr = pDestBuf;
+ sal_Char * pDestBufEnd = pDestBuf + nDestBytes;
+ sal_Bool bWritten;
+
+ if (pContext)
+ {
+ nHighSurrogate
+ = ((ImplUnicodeToIso2022KrContext *) pContext)->m_nHighSurrogate;
+ eSet = ((ImplUnicodeToIso2022KrContext *) pContext)->m_eSet;
+ }
+
+ if (eSet == IMPL_UNICODE_TO_ISO_2022_KR_SET_NONE)
+ {
+ if (pDestBufEnd - pDestBufPtr >= 4)
+ {
+ *pDestBufPtr++ = 0x1B; /* ESC */
+ *pDestBufPtr++ = 0x24; /* $ */
+ *pDestBufPtr++ = 0x29; /* ) */
+ *pDestBufPtr++ = 0x43; /* C */
+ eSet = IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII;
+ }
+ else
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ }
+
+ if ((nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL) == 0)
+ for (; nConverted < nSrcChars; ++nConverted)
+ {
+ sal_Bool bUndefined = sal_True;
+ sal_uInt32 nChar = *pSrcBuf++;
+ if (nHighSurrogate == 0)
+ {
+ if (ImplIsHighSurrogate(nChar))
+ {
+ nHighSurrogate = (sal_Unicode) nChar;
+ continue;
+ }
+ }
+ else if (ImplIsLowSurrogate(nChar))
+ nChar = ImplCombineSurrogates(nHighSurrogate, nChar);
+ else
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (ImplIsLowSurrogate(nChar) || ImplIsNoncharacter(nChar))
+ {
+ bUndefined = sal_False;
+ goto bad_input;
+ }
+
+ if (nChar == 0x0A || nChar == 0x0D) /* LF, CR */
+ {
+ if (eSet == IMPL_UNICODE_TO_ISO_2022_KR_SET_1001)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0F; /* SI */
+ eSet = IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ }
+ else if (nChar == 0x0E || nChar == 0x0F || nChar == 0x1B)
+ goto bad_input;
+ else if (nChar < 0x80)
+ {
+ if (eSet == IMPL_UNICODE_TO_ISO_2022_KR_SET_1001)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0F; /* SI */
+ eSet = IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ }
+ else
+ {
+ sal_uInt16 nBytes = 0;
+ sal_uInt32 nIndex1 = nChar >> 8;
+ if (nIndex1 < 0x100)
+ {
+ sal_uInt32 nIndex2 = nChar & 0xFF;
+ sal_uInt32 nFirst = pKsX1001Data[nIndex1].mnLowStart;
+ if (nIndex2 >= nFirst
+ && nIndex2 <= pKsX1001Data[nIndex1].mnLowEnd)
+ nBytes = pKsX1001Data[nIndex1].
+ mpToUniTrailTab[nIndex2 - nFirst];
+ }
+ if (nBytes != 0)
+ {
+ if (eSet == IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0E; /* SO */
+ eSet = IMPL_UNICODE_TO_ISO_2022_KR_SET_1001;
+ }
+ else
+ goto no_output;
+ }
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ *pDestBufPtr++ = (sal_Char) ((nBytes >> 8) & 0x7F);
+ *pDestBufPtr++ = (sal_Char) (nBytes & 0x7F);
+ }
+ else
+ goto no_output;
+ }
+ else
+ goto bad_input;
+ }
+ nHighSurrogate = 0;
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputUnicodeToTextConversion(
+ bUndefined,
+ nChar,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ "\x0F", /* SI */
+ eSet == IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII ? 0 : 1,
+ &bWritten))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ if (bWritten)
+ eSet = IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII;
+ nHighSurrogate = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBuf;
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if ((nInfo & (RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ sal_Bool bFlush = sal_True;
+ if (nHighSurrogate != 0)
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ nInfo |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputUnicodeToTextConversion(
+ sal_False,
+ 0,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo,
+ "\x0F", /* SI */
+ eSet == IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII ?
+ 0 : 1,
+ &bWritten))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ bFlush = sal_False;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ if (bWritten)
+ eSet = IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII;
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+ if (bFlush
+ && eSet == IMPL_UNICODE_TO_ISO_2022_KR_SET_1001
+ && (nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ {
+ if (pDestBufPtr != pDestBufEnd)
+ {
+ *pDestBufPtr++ = 0x0F; /* SI */
+ eSet = IMPL_UNICODE_TO_ISO_2022_KR_SET_ASCII;
+ }
+ else
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ }
+ }
+
+ if (pContext)
+ {
+ ((ImplUnicodeToIso2022KrContext *) pContext)->m_nHighSurrogate
+ = nHighSurrogate;
+ ((ImplUnicodeToIso2022KrContext *) pContext)->m_eSet = eSet;
+ }
+ if (pInfo)
+ *pInfo = nInfo;
+ if (pSrcCvtChars)
+ *pSrcCvtChars = nConverted;
+
+ return pDestBufPtr - pDestBuf;
+}
diff --git a/sal/textenc/convertiso2022kr.h b/sal/textenc/convertiso2022kr.h
new file mode 100644
index 000000000000..82255d74f7a8
--- /dev/null
+++ b/sal/textenc/convertiso2022kr.h
@@ -0,0 +1,78 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTISO2022KR_H
+#define INCLUDED_RTL_TEXTENC_CONVERTISO2022KR_H
+
+#include "tenchelp.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+typedef struct
+{
+ ImplDBCSToUniLeadTab const * m_pKsX1001ToUnicodeData;
+ ImplUniToDBCSHighTab const * m_pUnicodeToKsX1001Data;
+} ImplIso2022KrConverterData;
+
+void * ImplCreateIso2022KrToUnicodeContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetIso2022KrToUnicodeContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertIso2022KrToUnicode(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes)
+ SAL_THROW_EXTERN_C();
+
+void * ImplCreateUnicodeToIso2022KrContext(void) SAL_THROW_EXTERN_C();
+
+void ImplResetUnicodeToIso2022KrContext(void * pContext) SAL_THROW_EXTERN_C();
+
+sal_Size ImplConvertUnicodeToIso2022Kr(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_CONVERTISO2022KR_H */
diff --git a/sal/textenc/convertiso2022kr.tab b/sal/textenc/convertiso2022kr.tab
new file mode 100644
index 000000000000..87010f55590f
--- /dev/null
+++ b/sal/textenc/convertiso2022kr.tab
@@ -0,0 +1,68 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
+#include "context.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTISO2022KR_H
+#include "convertiso2022kr.h"
+#endif
+#ifndef INCLUDED_RTL_TEXTENC_TENCHELP_H
+#include "tenchelp.h"
+#endif
+
+#ifndef _RTL_TENCINFO_H
+#include "rtl/tencinfo.h"
+#endif
+#ifndef _RTL_TEXTENC_H
+#include "rtl/textenc.h"
+#endif
+
+static ImplIso2022KrConverterData const aImplIso2022KrConvertData
+ = { aKSC5601UniLeadTab, /* from tcvtkr6.tab */
+ aKSC5601DBCSHighTab }; /* from tcvtkr6.tab */
+
+static ImplTextEncodingData const aImplIso2022KrTextEncodingData
+ = { { &aImplIso2022KrConvertData,
+ &ImplConvertIso2022KrToUnicode,
+ &ImplConvertUnicodeToIso2022Kr,
+ &ImplCreateIso2022KrToUnicodeContext,
+ &ImplDestroyContext,
+ &ImplResetIso2022KrToUnicodeContext,
+ &ImplCreateUnicodeToIso2022KrContext,
+ &ImplDestroyContext,
+ &ImplResetUnicodeToIso2022KrContext },
+ 1,
+ 8,
+ 2,
+ 130,
+ "euc-kr",
+ "ISO-2022-KR",
+ RTL_TEXTENCODING_INFO_CONTEXT
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_KOREAN */
diff --git a/sal/textenc/convertsinglebytetobmpunicode.cxx b/sal/textenc/convertsinglebytetobmpunicode.cxx
new file mode 100644
index 000000000000..1e482249907c
--- /dev/null
+++ b/sal/textenc/convertsinglebytetobmpunicode.cxx
@@ -0,0 +1,211 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include "context.h"
+#include "converter.h"
+#include "convertsinglebytetobmpunicode.hxx"
+#include "unichars.h"
+
+#include "osl/diagnose.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+#include <cstddef>
+
+sal_Size rtl_textenc_convertSingleByteToBmpUnicode(
+ ImplTextConverterData const * data, void *, sal_Char const * srcBuf,
+ sal_Size srcBytes, sal_Unicode * destBuf, sal_Size destChars,
+ sal_uInt32 flags, sal_uInt32 * info, sal_Size * srcCvtBytes)
+{
+ sal_Unicode const * map = static_cast<
+ rtl::textenc::BmpUnicodeToSingleByteConverterData const * >(
+ data)->byteToUnicode;
+ sal_uInt32 infoFlags = 0;
+ sal_Size converted = 0;
+ sal_Unicode * destBufPtr = destBuf;
+ sal_Unicode * destBufEnd = destBuf + destChars;
+ for (; converted < srcBytes; ++converted) {
+ bool undefined = true;
+ sal_Char b = *srcBuf++;
+ sal_Unicode c = map[static_cast< sal_uInt8 >(b)];
+ if (c == 0xFFFF) {
+ goto bad_input;
+ }
+ if (destBufEnd - destBufPtr < 1) {
+ goto no_output;
+ }
+ *destBufPtr++ = c;
+ continue;
+ bad_input:
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ undefined, false, b, flags, &destBufPtr, destBufEnd,
+ &infoFlags))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+ no_output:
+ --srcBuf;
+ infoFlags |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ if (info != 0) {
+ *info = infoFlags;
+ }
+ if (srcCvtBytes != 0) {
+ *srcCvtBytes = converted;
+ }
+ return destBufPtr - destBuf;
+}
+
+sal_Size rtl_textenc_convertBmpUnicodeToSingleByte(
+ ImplTextConverterData const * data, void * context,
+ sal_Unicode const * srcBuf, sal_Size srcChars, sal_Char * destBuf,
+ sal_Size destBytes, sal_uInt32 flags, sal_uInt32 * info,
+ sal_Size * srcCvtChars)
+{
+ std::size_t entries = static_cast<
+ rtl::textenc::BmpUnicodeToSingleByteConverterData const * >(
+ data)->unicodeToByteEntries;
+ rtl::textenc::BmpUnicodeToSingleByteRange const * ranges = static_cast<
+ rtl::textenc::BmpUnicodeToSingleByteConverterData const * >(
+ data)->unicodeToByte;
+ sal_Unicode highSurrogate = 0;
+ sal_uInt32 infoFlags = 0;
+ sal_Size converted = 0;
+ sal_Char * destBufPtr = destBuf;
+ sal_Char * destBufEnd = destBuf + destBytes;
+ if (context != 0) {
+ highSurrogate = static_cast< ImplUnicodeToTextContext * >(context)->
+ m_nHighSurrogate;
+ }
+ for (; converted < srcChars; ++converted) {
+ bool undefined = true;
+ sal_uInt32 c = *srcBuf++;
+ if (highSurrogate == 0) {
+ if (ImplIsHighSurrogate(c)) {
+ highSurrogate = static_cast< sal_Unicode >(c);
+ continue;
+ }
+ } else if (ImplIsLowSurrogate(c)) {
+ c = ImplCombineSurrogates(highSurrogate, c);
+ } else {
+ undefined = false;
+ goto bad_input;
+ }
+ if (ImplIsLowSurrogate(c) || ImplIsNoncharacter(c)) {
+ undefined = false;
+ goto bad_input;
+ }
+ // Linearly searching through the ranges if probably fastest, assuming
+ // that most converted characters belong to the ASCII subset:
+ for (std::size_t i = 0; i < entries; ++i) {
+ if (c < ranges[i].unicode) {
+ break;
+ } else if (c <= sal::static_int_cast< sal_uInt32 >(
+ ranges[i].unicode + ranges[i].range))
+ {
+ if (destBufEnd - destBufPtr < 1) {
+ goto no_output;
+ }
+ *destBufPtr++ = static_cast< sal_Char >(
+ ranges[i].byte + (c - ranges[i].unicode));
+ goto done;
+ }
+ }
+ goto bad_input;
+ done:
+ highSurrogate = 0;
+ continue;
+ bad_input:
+ switch (ImplHandleBadInputUnicodeToTextConversion(
+ undefined, c, flags, &destBufPtr, destBufEnd, &infoFlags, 0,
+ 0, 0))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ highSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ highSurrogate = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+ no_output:
+ --srcBuf;
+ infoFlags |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ if (highSurrogate != 0
+ && ((infoFlags
+ & (RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
+ == 0))
+ {
+ if ((flags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0) {
+ infoFlags |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ } else {
+ switch (ImplHandleBadInputUnicodeToTextConversion(
+ false, 0, flags, &destBufPtr, destBufEnd, &infoFlags, 0,
+ 0, 0))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ highSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ infoFlags |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+ }
+ if (context != 0) {
+ static_cast< ImplUnicodeToTextContext * >(context)->m_nHighSurrogate
+ = highSurrogate;
+ }
+ if (info != 0) {
+ *info = infoFlags;
+ }
+ if (srcCvtChars != 0) {
+ *srcCvtChars = converted;
+ }
+ return destBufPtr - destBuf;
+}
diff --git a/sal/textenc/convertsinglebytetobmpunicode.hxx b/sal/textenc/convertsinglebytetobmpunicode.hxx
new file mode 100644
index 000000000000..badc01673fbc
--- /dev/null
+++ b/sal/textenc/convertsinglebytetobmpunicode.hxx
@@ -0,0 +1,126 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_sal_textenc_convertsinglebytetobmpunicode_hxx
+#define INCLUDED_sal_textenc_convertsinglebytetobmpunicode_hxx
+
+#include "tenchelp.h"
+
+#include "sal/types.h"
+
+#include <cstddef>
+
+/// @HTML
+
+namespace rtl { namespace textenc {
+
+/**
+ Maps a range of BMP Unicode code points to individual bytes.
+
+ @see rtl::textenc::BmpUnicodeToSingleByteConverterData
+ */
+struct BmpUnicodeToSingleByteRange {
+ /**
+ The start of the range of BMP Unicode code points.
+ */
+ sal_Unicode unicode;
+
+ /**
+ The extend of the range of BMP Unicode code points.
+
+ <p>The range covers <code>unicode</code> to <code>unicode + range</code>,
+ inclusive. It is an error if <code>unicode + range</code> is greater
+ than <code>0xFFFF</code>.</p>
+ */
+ sal_uInt8 range;
+
+ /**
+ The start of the corresponding range of individual bytes.
+
+ <p>It is an error if <code>byte + range</code> is greater than
+ <code>0xFF</code>.</p>
+ */
+ sal_uInt8 byte;
+};
+
+/**
+ Data to convert between BMP Unicode and a single-byte character set.
+
+ <p>Only supports conversions where each legal unit from the single-byte
+ character set has one or more mappings to individual BMP Unicode code points
+ that are neither noncharacters nor surrogates.</p>
+
+ @see rtl_textenc_convertSingleByteToBmpUnicode
+ @see rtl_textenc_convertBmpUnicodeToSingleByte
+ */
+struct BmpUnicodeToSingleByteConverterData {
+ /**
+ Mapping from the single-byte character set to BMP Unicode code points.
+
+ <p>Illegal units from the single-byte character set are mapped to
+ <code>0xFFFF</code>.</p>
+ */
+ sal_Unicode byteToUnicode[256];
+
+ /**
+ The number of Unicode-to-byte conversion ranges.
+ */
+ std::size_t unicodeToByteEntries;
+
+ /**
+ The array of Unicode-to-byte conversion ranges, sorted by increasing
+ <code>unicode</code> values.
+
+ <p>The ranges may not overlap.</p>
+ */
+ BmpUnicodeToSingleByteRange const * unicodeToByte;
+};
+
+} }
+
+/**
+ Function to convert from a single-byte character set to BMP Unicode.
+
+ @see ImplConvertToUnicodeProc
+ */
+extern "C" sal_Size rtl_textenc_convertSingleByteToBmpUnicode(
+ ImplTextConverterData const * data, void * context, sal_Char const * srcBuf,
+ sal_Size srcBytes, sal_Unicode * destBuf, sal_Size destChars,
+ sal_uInt32 flags, sal_uInt32 * info, sal_Size * srcCvtBytes);
+
+/**
+ Function to convert from BMP Unicode to a single-byte character set.
+
+ @see ImplConvertToTextProc
+ */
+extern "C" sal_Size rtl_textenc_convertBmpUnicodeToSingleByte(
+ ImplTextConverterData const * data, void * context,
+ sal_Unicode const * srcBuf, sal_Size srcChars, sal_Char * destBuf,
+ sal_Size destBytes, sal_uInt32 flags, sal_uInt32 * info,
+ sal_Size * srcCvtChars);
+
+#endif
diff --git a/sal/textenc/generate/big5hkscs2001.pl b/sal/textenc/generate/big5hkscs2001.pl
new file mode 100644
index 000000000000..a363e99f7e87
--- /dev/null
+++ b/sal/textenc/generate/big5hkscs2001.pl
@@ -0,0 +1,806 @@
+#!/usr/bin/perl
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+# The following files must be available in a ./input subdir:
+
+# <http://www.info.gov.hk/digital21/eng/hkscs/download/big5-iso.txt>
+
+# <http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT>:
+# "Unicode version: 1.1 Table version: 0.0d3 Date: 11 February 1994"
+# Only used to track Unicode characters that are mapped from both Big5 and
+# HKSCS.
+
+# <http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT>:
+# "Unicode version: 2.0 Table version: 2.01 Date: 1/7/2000"
+# Only used to track Unicode characters that are mapped from both CP950 and
+# HKSCS.
+
+$surrogates = 0; # set to 1 to allow mappings to Unicode beyond Plane 0
+
+$id = "Big5Hkscs2001";
+
+sub isValidUtf32
+{
+ my $utf32 = $_[0];
+ return $utf32 >= 0 && $utf32 <= 0x10FFFF
+ && !($utf32 >= 0xD800 && $utf32 <= 0xDFFF)
+ && !($utf32 >= 0xFDD0 && $utf32 <= 0xFDEF)
+ && ($utf32 & 0xFFFF) < 0xFFFE;
+}
+
+sub printUtf32
+{
+ my $utf32 = $_[0];
+ return sprintf("U+%04X", $utf32);
+}
+
+sub isValidBig5
+{
+ my $big5 = $_[0];
+ my $big5_row = $big5 >> 8;
+ my $big5_column = $big5 & 0xFF;
+ return $big5_row >= 0x81 && $big5_row <= 0xFE
+ && ($big5_column >= 0x40 && $big5_column <= 0x7E
+ || $big5_column >= 0xA1 && $big5_column <= 0xFE);
+}
+
+sub printBig5
+{
+ my $big5 = $_[0];
+ return sprintf("%04X", $big5);
+}
+
+sub printStats
+{
+ my $used = $_[0];
+ my $space = $_[1];
+ return sprintf("%d/%d bytes (%.1f%%)",
+ $used,
+ $space,
+ $used * 100 / $space);
+}
+
+sub printSpaces
+{
+ my $column_width = $_[0];
+ my $columns_per_line = $_[1];
+ my $end = $_[2];
+ $output = "";
+ for ($i = int($end / $columns_per_line) * $columns_per_line;
+ $i < $end;
+ ++$i)
+ {
+ for ($j = 0; $j < $column_width; ++$j)
+ {
+ $output = $output . " ";
+ }
+ }
+ return $output;
+}
+
+sub addMapping
+{
+ my $utf32 = $_[0];
+ my $big5 = $_[1];
+ my $comp = $_[2];
+
+ $uni_plane = $utf32 >> 16;
+ $uni_page = ($utf32 >> 8) & 0xFF;
+ $uni_index = $utf32 & 0xFF;
+
+ if (!defined($uni_plane_used[$uni_plane])
+ || !defined($uni_page_used[$uni_plane][$uni_page])
+ || !defined($uni_map[$uni_plane][$uni_page][$uni_index]))
+ {
+ $uni_map[$uni_plane][$uni_page][$uni_index] = $big5;
+ $uni_plane_used[$uni_plane] = 1;
+ $uni_page_used[$uni_plane][$uni_page] = 1;
+ if ($comp != -1)
+ {
+ ++$compat[$comp];
+ }
+ }
+ else
+ {
+ $big5_1 = $uni_map[$uni_plane][$uni_page][$uni_index];
+ print "WARNING! Mapping ", printUtf32($utf32), " to ",
+ printBig5($big5_1), ", NOT ", ($comp ? "compat " : ""),
+ printBig5($big5), "\n";
+ }
+}
+
+# Build mappings to track Unicode characters that are mapped from both Big5/
+# CP950 and HKSCS:
+{
+ $filename = "BIG5.TXT";
+ open IN, ("input/" . $filename) or die "Cannot read " . $filename;
+ while (<IN>)
+ {
+ if (/(0x[0-9A-F][0-9A-F][0-9A-F][0-9A-F])[ \t]+(0x[0-9A-F]+)[ \t]+\#.*$/)
+ {
+ $big5 = oct($1);
+ $utf32 = oct($2);
+ isValidBig5($big5)
+ or die "Bad Big5 char " . printBig5($big5);
+ isValidUtf32($utf32)
+ or die "Bad UTF32 char " . printUtf32($utf32);
+ if ($utf32 != 0xFFFD)
+ {
+ if (defined($underlying_big5[$utf32]))
+ {
+ print "WARNING! In ", $filename, ", both ",
+ printBig5($underlying_big5[$utf32]), " and ",
+ printBig5($big5), " map to ", printUtf32($utf32),
+ "\n";
+ }
+ else
+ {
+ $underlying_big5[$utf32] = $big5;
+ }
+ }
+ }
+ }
+ close IN;
+
+ $filename = "CP950.TXT";
+ open IN, ("input/" . $filename) or die "Cannot read " . $filename;
+ while (<IN>)
+ {
+ if (/(0x[0-9A-F][0-9A-F][0-9A-F][0-9A-F])[ \t]+(0x[0-9A-F]+)[ \t]+\#.*$/)
+ {
+ $big5 = oct($1);
+ $utf32 = oct($2);
+ isValidBig5($big5)
+ or die "Bad Big5 char " . printBig5($big5);
+ isValidUtf32($utf32)
+ or die "Bad UTF32 char " . printUtf32($utf32);
+ if (defined($underlying_cp950[$utf32]))
+ {
+ print "WARNING! In ", $filename, ", both ",
+ printBig5($underlying_cp950[$utf32]), " and ",
+ printBig5($big5), " map to ", printUtf32($utf32), "\n";
+ }
+ else
+ {
+ $underlying_cp950[$utf32] = $big5;
+ }
+ }
+ }
+ close IN;
+}
+
+# The following are mapped by the underlying RTL_TEXTENCODING_BIG5 to some
+# nonstandard Unicode points, so they are explicitly mentioned here to map
+# to the standard Unicode PUA points. (In the other direction, the unofficial
+# mappings from Unicode to RTL_TEXTENCODING_BIG5 C6A1--C7FE are harmless,
+# since all Unicode characters involved are already covered by the official
+# Big5-HKSCS mappings.)
+$big5_map[0xC6][0xCF] = 0xF6E0; addMapping(0xF6E0, 0xC6CF, -1);
+$big5_map[0xC6][0xD3] = 0xF6E4; addMapping(0xF6E4, 0xC6D3, -1);
+$big5_map[0xC6][0xD5] = 0xF6E6; addMapping(0xF6E6, 0xC6D5, -1);
+$big5_map[0xC6][0xD7] = 0xF6E8; addMapping(0xF6E8, 0xC6D7, -1);
+$big5_map[0xC6][0xDE] = 0xF6EF; addMapping(0xF6EF, 0xC6DE, -1);
+$big5_map[0xC6][0xDF] = 0xF6F0; addMapping(0xF6F0, 0xC6DF, -1);
+
+# The following implements the mapping of Big5-HKSCS compatibility points
+# (GCCS characters unified with other HKSCS characters) to Unicode. In the
+# other direction, characters from Unicode's PUA will map to these Big5-HKSCS
+# compatibility points. (See the first list in <http://www.info.gov.hk/
+# digital21/eng/hkscs/download/big5cmp.txt>.)
+$big5_map[0x8E][0x69] = 0x7BB8;
+$big5_map[0x8E][0x6F] = 0x7C06;
+$big5_map[0x8E][0x7E] = 0x7CCE;
+$big5_map[0x8E][0xAB] = 0x7DD2;
+$big5_map[0x8E][0xB4] = 0x7E1D;
+$big5_map[0x8E][0xCD] = 0x8005;
+$big5_map[0x8E][0xD0] = 0x8028;
+$big5_map[0x8F][0x57] = 0x83C1;
+$big5_map[0x8F][0x69] = 0x84A8;
+$big5_map[0x8F][0x6E] = 0x840F;
+$big5_map[0x8F][0xCB] = 0x89A6;
+$big5_map[0x8F][0xCC] = 0x89A9;
+$big5_map[0x8F][0xFE] = 0x8D77;
+$big5_map[0x90][0x6D] = 0x90FD;
+$big5_map[0x90][0x7A] = 0x92B9;
+$big5_map[0x90][0xDC] = 0x975C;
+$big5_map[0x90][0xF1] = 0x97FF;
+$big5_map[0x91][0xBF] = 0x9F16;
+$big5_map[0x92][0x44] = 0x8503;
+$big5_map[0x92][0xAF] = 0x5159;
+$big5_map[0x92][0xB0] = 0x515B;
+$big5_map[0x92][0xB1] = 0x515D;
+$big5_map[0x92][0xB2] = 0x515E;
+$big5_map[0x92][0xC8] = 0x936E;
+$big5_map[0x92][0xD1] = 0x7479;
+$big5_map[0x94][0x47] = 0x6D67;
+$big5_map[0x94][0xCA] = 0x799B;
+$big5_map[0x95][0xD9] = 0x9097;
+$big5_map[0x96][0x44] = 0x975D;
+$big5_map[0x96][0xED] = 0x701E;
+$big5_map[0x96][0xFC] = 0x5B28;
+$big5_map[0x9B][0x76] = 0x7201;
+$big5_map[0x9B][0x78] = 0x77D7;
+$big5_map[0x9B][0x7B] = 0x7E87;
+$big5_map[0x9B][0xC6] = 0x99D6;
+$big5_map[0x9B][0xDE] = 0x91D4;
+$big5_map[0x9B][0xEC] = 0x60DE;
+$big5_map[0x9B][0xF6] = 0x6FB6;
+$big5_map[0x9C][0x42] = 0x8F36;
+$big5_map[0x9C][0x53] = 0x4FBB;
+$big5_map[0x9C][0x62] = 0x71DF;
+$big5_map[0x9C][0x68] = 0x9104;
+$big5_map[0x9C][0x6B] = 0x9DF0;
+$big5_map[0x9C][0x77] = 0x83CF;
+$big5_map[0x9C][0xBC] = 0x5C10;
+$big5_map[0x9C][0xBD] = 0x79E3;
+$big5_map[0x9C][0xD0] = 0x5A67;
+$big5_map[0x9D][0x57] = 0x8F0B;
+$big5_map[0x9D][0x5A] = 0x7B51;
+$big5_map[0x9D][0xC4] = 0x62D0;
+$big5_map[0x9E][0xA9] = 0x6062;
+$big5_map[0x9E][0xEF] = 0x75F9;
+$big5_map[0x9E][0xFD] = 0x6C4A;
+$big5_map[0x9F][0x60] = 0x9B2E;
+$big5_map[0x9F][0x66] = 0x9F17;
+$big5_map[0x9F][0xCB] = 0x50ED;
+$big5_map[0x9F][0xD8] = 0x5F0C;
+$big5_map[0xA0][0x63] = 0x880F;
+$big5_map[0xA0][0x77] = 0x62CE;
+$big5_map[0xA0][0xD5] = 0x7468;
+$big5_map[0xA0][0xDF] = 0x7162;
+$big5_map[0xA0][0xE4] = 0x7250;
+$big5_map[0xFA][0x5F] = 0x5029;
+$big5_map[0xFA][0x66] = 0x507D;
+$big5_map[0xFA][0xBD] = 0x5305;
+$big5_map[0xFA][0xC5] = 0x5344;
+$big5_map[0xFA][0xD5] = 0x537F;
+$big5_map[0xFB][0x48] = 0x5605;
+$big5_map[0xFB][0xB8] = 0x5A77;
+$big5_map[0xFB][0xF3] = 0x5E75;
+$big5_map[0xFB][0xF9] = 0x5ED0;
+$big5_map[0xFC][0x4F] = 0x5F58;
+$big5_map[0xFC][0x6C] = 0x60A4;
+$big5_map[0xFC][0xB9] = 0x6490;
+$big5_map[0xFC][0xE2] = 0x6674;
+$big5_map[0xFC][0xF1] = 0x675E;
+$big5_map[0xFD][0xB7] = 0x6C9C;
+$big5_map[0xFD][0xB8] = 0x6E1D;
+$big5_map[0xFD][0xBB] = 0x6E2F;
+$big5_map[0xFD][0xF1] = 0x716E;
+$big5_map[0xFE][0x52] = 0x732A;
+$big5_map[0xFE][0x6F] = 0x745C;
+$big5_map[0xFE][0xAA] = 0x74E9;
+$big5_map[0xFE][0xDD] = 0x7809;
+
+$pua = 0;
+$compat[0] = 0; # 1993
+$compat[1] = 0; # 2000
+$compat[2] = 0; # 2001
+
+$filename = "big5-iso.txt";
+open IN, ("input/" . $filename) or die "Cannot read " . $filename;
+while (<IN>)
+{
+ if (/^([0-9A-F]+) +([0-9A-F]+) +([0-9A-F]+) +([0-9A-F]+)$/)
+ {
+ $big5 = oct("0x" . $1);
+ $utf32_1993 = oct("0x" . $2);
+ $utf32_2000 = oct("0x" . $3);
+ $utf32_2001 = oct("0x" . $4);
+ isValidBig5($big5)
+ or die "Bad Big5 char " . printBig5($big5);
+ isValidUtf32($utf32_1993)
+ or die "Bad UTF32 char " . printUtf32($utf32_1993);
+ isValidUtf32($utf32_2000)
+ or die "Bad UTF32 char " . printUtf32($utf32_2000);
+ isValidUtf32($utf32_2001)
+ or die "Bad UTF32 char " . printUtf32($utf32_2001);
+
+ $utf32 = $surrogates ? $utf32_2001 : $utf32_2000;
+
+ if (defined($underlying_big5[$utf32])
+ || defined($underlying_cp950[$utf32]))
+ {
+ if (defined($underlying_big5[$utf32])
+ && defined($underlying_cp950[$utf32])
+ && $underlying_big5[$utf32] == $underlying_cp950[$utf32]
+ && $underlying_big5[$utf32] == $big5
+ ||
+ defined($underlying_big5[$utf32])
+ && !defined($underlying_cp950[$utf32])
+ && $underlying_big5[$utf32] == $big5
+ ||
+ !defined($underlying_big5[$utf32])
+ && defined($underlying_cp950[$utf32])
+ && $underlying_cp950[$utf32] == $big5)
+ {
+ # ignore
+
+ # Depending on real underlying mapping (cf.
+ # ../convertbig5hkscs.tab), it would be possible to save some
+ # table space by dropping those HKSCS code points that are
+ # already covered by the underlying mapping.
+ }
+ else
+ {
+ print "XXX mapping underlying";
+ if (defined($underlying_big5[$utf32])
+ && defined($underlying_cp950[$utf32])
+ && $underlying_big5[$utf32] == $underlying_cp950[$utf32])
+ {
+ print " Big5/CP950 ", printBig5($underlying_big5[$utf32]);
+ }
+ else
+ {
+ if (defined($underlying_big5[$utf32]))
+ {
+ print " Big5 ", printBig5($underlying_big5[$utf32]);
+ }
+ if (defined($underlying_cp950[$utf32]))
+ {
+ print " CP950 ", printBig5($underlying_cp950[$utf32]);
+ }
+ }
+ print " and HKSCS ", printBig5($big5), " to ",
+ printUtf32($utf32), "\n";
+ }
+ }
+
+ if ($utf32 >= 0xE000 && $utf32 <= 0xF8FF)
+ {
+ ++$pua;
+ }
+
+ $big5_row = $big5 >> 8;
+ $big5_column = $big5 & 0xFF;
+ if (defined($big5_map[$big5_row][$big5_column]))
+ {
+ die "Bad Big5 mapping " . printBig5($big5);
+ }
+ $big5_map[$big5_row][$big5_column] = $utf32;
+
+ addMapping($utf32, $big5, -1);
+
+ if ($utf32_2001 != $utf32)
+ {
+ addMapping($utf32_2001, $big5, 2);
+ }
+ if ($utf32_2000 != $utf32 && $utf32_2000 != $utf32_2001)
+ {
+ addMapping($utf32_2000, $big5, 1);
+ }
+ if ($utf32_1993 != $utf32 && $utf32_1993 != $utf32_2000
+ && $utf32_1993 != $utf32_2001)
+ {
+ addMapping($utf32_1993, $big5, 0);
+ }
+ }
+}
+close IN;
+
+print $pua, " mappings to PUA\n";
+print $compat[0], " 1993 compatibility mappings\n" if ($compat[0] != 0);
+print $compat[1], " 2000 compatibility mappings\n" if ($compat[1] != 0);
+print $compat[2], " 2001 compatibility mappings\n" if ($compat[2] != 0);
+
+if (defined($uni_plane_used[0]) && defined($uni_page_used[0][0]))
+{
+ for ($utf32 = 0; $utf32 <= 0x7F; ++$utf32)
+ {
+ if (defined($uni_map[0][0][$uni_index]))
+ {
+ $big5 = $uni_map[0][0][$utf32];
+ die "Mapping " . printUtf32($utf32) . " to " . printBig5($big5);
+ }
+ }
+}
+
+$filename = lc($id) . ".tab";
+open OUT, ("> " . $filename) or die "Cannot write " . $filename;
+
+{
+ $filename = lc($id). ".pl";
+ open IN, $filename or die "Cannot read ". $filename;
+ $first = 1;
+ while (<IN>)
+ {
+ if (/^\#!.*$/)
+ {
+ }
+ elsif (/^\#(\*.*)$/)
+ {
+ if ($first == 1)
+ {
+ print OUT "/", $1, "\n";
+ $first = 0;
+ }
+ else
+ {
+ print OUT " ", substr($1, 0, length($1) - 1), "/\n";
+ }
+ }
+ elsif (/^\# (.*)$/)
+ {
+ print OUT " *", $1, "\n";
+ }
+ elsif (/^\#(.*)$/)
+ {
+ print OUT " *", $1, "\n";
+ }
+ else
+ {
+ goto done;
+ }
+ }
+ done:
+}
+
+print OUT "\n",
+ "#ifndef _SAL_TYPES_H_\n",
+ "#include \"sal/types.h\"\n",
+ "#endif\n",
+ "\n";
+
+print OUT "static sal_uInt16 const aImpl", $id, "ToUnicodeData[] = {\n";
+$big5_data_index = 0;
+$big5_rows = 0;
+$big5_chars = 0;
+for ($big5_row = 0; $big5_row <= 255; ++$big5_row)
+{
+ $big5_row_first = -1;
+ for ($big5_column = 0; $big5_column <= 255; ++$big5_column)
+ {
+ if (defined($big5_map[$big5_row][$big5_column]))
+ {
+ if ($big5_row_first == -1)
+ {
+ $big5_row_first = $big5_column;
+ }
+ $big5_row_last = $big5_column;
+ }
+ }
+ if ($big5_row_first != -1)
+ {
+ $big5_data_offsets[$big5_row] = $big5_data_index;
+ ++$big5_rows;
+ print OUT " /* row ", $big5_row, " */\n";
+
+ $big5_row_surrogates_first = -1;
+ $big5_row_chars = 0;
+ $big5_row_surrogates = 0;
+
+ print OUT " ", $big5_row_first, " | (", $big5_row_last,
+ " << 8), /* first, last */\n";
+ ++$big5_data_index;
+
+ print OUT " ", printSpaces(7, 10, $big5_row_first);
+ $bol = 0;
+ for ($big5_column = $big5_row_first;
+ $big5_column <= $big5_row_last;
+ ++$big5_column)
+ {
+ if ($bol == 1)
+ {
+ print OUT " ";
+ $bol = 0;
+ }
+ if (defined($big5_map[$big5_row][$big5_column]))
+ {
+ $utf32 = $big5_map[$big5_row][$big5_column];
+ ++$big5_row_chars;
+ if ($utf32 <= 0xFFFF)
+ {
+ printf OUT "0x%04X,", $utf32;
+ }
+ else
+ {
+ ++$big5_row_surrogates;
+ printf OUT "0x%04X,",
+ (0xD800 | (($utf32 - 0x10000) >> 10));
+ if ($big5_row_surrogates_first == -1)
+ {
+ $big5_row_surrogates_first = $big5_column;
+ }
+ $big5_row_surrogates_last = $big5_column;
+ }
+ }
+ else
+ {
+ printf OUT "0xffff,";
+ }
+ ++$big5_data_index;
+ if ($big5_column % 10 == 9)
+ {
+ print OUT "\n";
+ $bol = 1;
+ }
+ }
+ if ($bol == 0)
+ {
+ print OUT "\n";
+ }
+
+ if ($big5_row_surrogates_first != -1)
+ {
+ print OUT " ", $big5_row_surrogates_first,
+ ", /* first low-surrogate */\n";
+ ++$big5_data_index;
+
+ print OUT " ", printSpaces(7, 10, $big5_row_surrogates_first);
+ $bol = 0;
+ for ($big5_column = $big5_row_surrogates_first;
+ $big5_column <= $big5_row_surrogates_last;
+ ++$big5_column)
+ {
+ if ($bol == 1)
+ {
+ print OUT " ";
+ $bol = 0;
+ }
+ $utf32 = 0;
+ if (defined($big5_map[$big5_row][$big5_column]))
+ {
+ $utf32 = $big5_map[$big5_row][$big5_column];
+ }
+ if ($utf32 <= 0xFFFF)
+ {
+ printf OUT " 0,";
+ }
+ else
+ {
+ printf OUT "0x%04X,",
+ (0xDC00 | (($utf32 - 0x10000) & 0x3FF));
+ }
+ ++$big5_data_index;
+ if ($big5_column % 10 == 9)
+ {
+ print OUT "\n";
+ $bol = 1;
+ }
+ }
+ if ($bol == 0)
+ {
+ print OUT "\n";
+ }
+ }
+
+ $big5_chars += $big5_row_chars;
+ $big5_data_space[$big5_row]
+ = ($big5_data_index - $big5_data_offsets[$big5_row]) * 2;
+ $big5_data_used[$big5_row]
+ = (1 + $big5_row_chars + ($big5_row_surrogates == 0 ?
+ 0 : 1 + $big5_row_surrogates))
+ * 2;
+ }
+ else
+ {
+ print OUT " /* row ", $big5_row, ": --- */\n";
+ $big5_data_offsets[$big5_row] = -1;
+ }
+}
+print OUT "};\n\n";
+print "big5 rows = ", $big5_rows, ", chars = ", $big5_chars, "\n";
+
+print OUT "static sal_Int32 const aImpl", $id, "ToUnicodeRowOffsets[] = {\n";
+$big5_rowoffsets_used = 0;
+for ($big5_row = 0; $big5_row <= 255; ++$big5_row)
+{
+ if ($big5_data_offsets[$big5_row] == -1)
+ {
+ print OUT " -1, /* row ", $big5_row, " */\n";
+ }
+ else
+ {
+ print OUT " ",
+ $big5_data_offsets[$big5_row],
+ ", /* row ",
+ $big5_row,
+ "; ",
+ printStats($big5_data_used[$big5_row],
+ $big5_data_space[$big5_row]),
+ " */\n";
+ $big5_rowoffsets_used += 4;
+ }
+}
+print OUT "};\n\n";
+
+print OUT "static sal_uInt16 const aImplUnicodeTo", $id, "Data[] = {\n";
+$uni_data_index = 0;
+for ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane)
+{
+ if (defined($uni_plane_used[$uni_plane]))
+ {
+ for ($uni_page = 0; $uni_page <= 255; ++$uni_page)
+ {
+ if (defined($uni_page_used[$uni_plane][$uni_page]))
+ {
+ $uni_data_offsets[$uni_plane][$uni_page] = $uni_data_index;
+ print OUT " /* plane ", $uni_plane, ", page ", $uni_page,
+ " */\n";
+
+ $uni_page_first = -1;
+ for ($uni_index = 0; $uni_index <= 255; ++$uni_index)
+ {
+ if (defined($uni_map[$uni_plane][$uni_page][$uni_index]))
+ {
+ if ($uni_page_first == -1)
+ {
+ $uni_page_first = $uni_index;
+ }
+ $uni_page_last = $uni_index;
+ }
+ }
+
+ $uni_data_used[$uni_plane][$uni_page] = 0;
+
+ print OUT " ", $uni_page_first, " | (", $uni_page_last,
+ " << 8), /* first, last */\n";
+ ++$uni_data_index;
+ $uni_data_used[$uni_plane][$uni_page] += 2;
+
+ print OUT " ", printSpaces(7, 10, $uni_page_first);
+ $bol = 0;
+ for ($uni_index = $uni_page_first;
+ $uni_index <= $uni_page_last;
+ ++$uni_index)
+ {
+ if ($bol == 1)
+ {
+ print OUT " ";
+ $bol = 0;
+ }
+ if (defined($uni_map[$uni_plane][$uni_page][$uni_index]))
+ {
+ $big5 = $uni_map[$uni_plane][$uni_page][$uni_index];
+ printf OUT "0x%04X,", $big5;
+ $uni_data_used[$uni_plane][$uni_page] += 2;
+ }
+ else
+ {
+ print OUT " 0,";
+ }
+ ++$uni_data_index;
+ if ($uni_index % 10 == 9)
+ {
+ print OUT "\n";
+ $bol = 1;
+ }
+ }
+ if ($bol == 0)
+ {
+ print OUT "\n";
+ }
+
+ $uni_data_space[$uni_plane][$uni_page]
+ = ($uni_data_index
+ - $uni_data_offsets[$uni_plane][$uni_page]) * 2;
+ }
+ else
+ {
+ $uni_data_offsets[$uni_plane][$uni_page] = -1;
+ print OUT " /* plane ", $uni_plane, ", page ", $uni_page,
+ ": --- */\n";
+ }
+ }
+ }
+ else
+ {
+ print OUT " /* plane ", $uni_plane, ": --- */\n";
+ }
+}
+print OUT "};\n\n";
+
+print OUT "static sal_Int32 const aImplUnicodeTo", $id, "PageOffsets[] = {\n";
+for ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane)
+{
+ if (defined($uni_plane_used[$uni_plane]))
+ {
+ $uni_pageoffsets_used[$uni_plane] = 0;
+ $uni_data_used_sum[$uni_plane] = 0;
+ $uni_data_space_sum[$uni_plane] = 0;
+ for ($uni_page = 0; $uni_page <= 255; ++$uni_page)
+ {
+ $offset = $uni_data_offsets[$uni_plane][$uni_page];
+ if ($offset == -1)
+ {
+ print OUT " -1, /* plane ",
+ $uni_plane,
+ ", page ",
+ $uni_page,
+ " */\n";
+ }
+ else
+ {
+ print OUT " ",
+ $offset,
+ ", /* plane ",
+ $uni_plane,
+ ", page ",
+ $uni_page,
+ "; ",
+ printStats($uni_data_used[$uni_plane][$uni_page],
+ $uni_data_space[$uni_plane][$uni_page]),
+ " */\n";
+ $uni_pageoffsets_used[$uni_plane] += 4;
+ $uni_data_used_sum[$uni_plane]
+ += $uni_data_used[$uni_plane][$uni_page];
+ $uni_data_space_sum[$uni_plane]
+ += $uni_data_space[$uni_plane][$uni_page];
+ }
+ }
+ }
+ else
+ {
+ print OUT " /* plane ", $uni_plane, ": --- */\n";
+ }
+}
+print OUT "};\n\n";
+
+print OUT "static sal_Int32 const aImplUnicodeTo",
+ $id,
+ "PlaneOffsets[] = {\n";
+$uni_page_offset = 0;
+$uni_planeoffsets_used = 0;
+$uni_pageoffsets_used_sum = 0;
+$uni_pageoffsets_space_sum = 0;
+$uni_data_used_sum2 = 0;
+$uni_data_space_sum2 = 0;
+for ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane)
+{
+ if (defined ($uni_plane_used[$uni_plane]))
+ {
+ print OUT " ",
+ $uni_page_offset++,
+ " * 256, /* plane ",
+ $uni_plane,
+ "; ",
+ printStats($uni_pageoffsets_used[$uni_plane], 256 * 4),
+ ", ",
+ printStats($uni_data_used_sum[$uni_plane],
+ $uni_data_space_sum[$uni_plane]),
+ " */\n";
+ $uni_planeoffsets_used += 4;
+ $uni_pageoffsets_used_sum += $uni_pageoffsets_used[$uni_plane];
+ $uni_pageoffsets_space_sum += 256 * 4;
+ $uni_data_used_sum2 += $uni_data_used_sum[$uni_plane];
+ $uni_data_space_sum2 += $uni_data_space_sum[$uni_plane];
+ }
+ else
+ {
+ print OUT " -1, /* plane ", $uni_plane, " */\n";
+ }
+}
+print OUT " /* ",
+ printStats($uni_planeoffsets_used, 17 * 4),
+ ", ",
+ printStats($uni_pageoffsets_used_sum, $uni_pageoffsets_space_sum),
+ ", ",
+ printStats($uni_data_used_sum2, $uni_data_space_sum2),
+ " */\n};\n";
+
+close OUT;
diff --git a/sal/textenc/generate/big5hkscs2001.tab b/sal/textenc/generate/big5hkscs2001.tab
new file mode 100644
index 000000000000..5a3fb18f8471
--- /dev/null
+++ b/sal/textenc/generate/big5hkscs2001.tab
@@ -0,0 +1,8824 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _SAL_TYPES_H_
+#include "sal/types.h"
+#endif
+
+static sal_uInt16 const aImplBig5Hkscs2001ToUnicodeData[] = {
+ /* row 0: --- */
+ /* row 1: --- */
+ /* row 2: --- */
+ /* row 3: --- */
+ /* row 4: --- */
+ /* row 5: --- */
+ /* row 6: --- */
+ /* row 7: --- */
+ /* row 8: --- */
+ /* row 9: --- */
+ /* row 10: --- */
+ /* row 11: --- */
+ /* row 12: --- */
+ /* row 13: --- */
+ /* row 14: --- */
+ /* row 15: --- */
+ /* row 16: --- */
+ /* row 17: --- */
+ /* row 18: --- */
+ /* row 19: --- */
+ /* row 20: --- */
+ /* row 21: --- */
+ /* row 22: --- */
+ /* row 23: --- */
+ /* row 24: --- */
+ /* row 25: --- */
+ /* row 26: --- */
+ /* row 27: --- */
+ /* row 28: --- */
+ /* row 29: --- */
+ /* row 30: --- */
+ /* row 31: --- */
+ /* row 32: --- */
+ /* row 33: --- */
+ /* row 34: --- */
+ /* row 35: --- */
+ /* row 36: --- */
+ /* row 37: --- */
+ /* row 38: --- */
+ /* row 39: --- */
+ /* row 40: --- */
+ /* row 41: --- */
+ /* row 42: --- */
+ /* row 43: --- */
+ /* row 44: --- */
+ /* row 45: --- */
+ /* row 46: --- */
+ /* row 47: --- */
+ /* row 48: --- */
+ /* row 49: --- */
+ /* row 50: --- */
+ /* row 51: --- */
+ /* row 52: --- */
+ /* row 53: --- */
+ /* row 54: --- */
+ /* row 55: --- */
+ /* row 56: --- */
+ /* row 57: --- */
+ /* row 58: --- */
+ /* row 59: --- */
+ /* row 60: --- */
+ /* row 61: --- */
+ /* row 62: --- */
+ /* row 63: --- */
+ /* row 64: --- */
+ /* row 65: --- */
+ /* row 66: --- */
+ /* row 67: --- */
+ /* row 68: --- */
+ /* row 69: --- */
+ /* row 70: --- */
+ /* row 71: --- */
+ /* row 72: --- */
+ /* row 73: --- */
+ /* row 74: --- */
+ /* row 75: --- */
+ /* row 76: --- */
+ /* row 77: --- */
+ /* row 78: --- */
+ /* row 79: --- */
+ /* row 80: --- */
+ /* row 81: --- */
+ /* row 82: --- */
+ /* row 83: --- */
+ /* row 84: --- */
+ /* row 85: --- */
+ /* row 86: --- */
+ /* row 87: --- */
+ /* row 88: --- */
+ /* row 89: --- */
+ /* row 90: --- */
+ /* row 91: --- */
+ /* row 92: --- */
+ /* row 93: --- */
+ /* row 94: --- */
+ /* row 95: --- */
+ /* row 96: --- */
+ /* row 97: --- */
+ /* row 98: --- */
+ /* row 99: --- */
+ /* row 100: --- */
+ /* row 101: --- */
+ /* row 102: --- */
+ /* row 103: --- */
+ /* row 104: --- */
+ /* row 105: --- */
+ /* row 106: --- */
+ /* row 107: --- */
+ /* row 108: --- */
+ /* row 109: --- */
+ /* row 110: --- */
+ /* row 111: --- */
+ /* row 112: --- */
+ /* row 113: --- */
+ /* row 114: --- */
+ /* row 115: --- */
+ /* row 116: --- */
+ /* row 117: --- */
+ /* row 118: --- */
+ /* row 119: --- */
+ /* row 120: --- */
+ /* row 121: --- */
+ /* row 122: --- */
+ /* row 123: --- */
+ /* row 124: --- */
+ /* row 125: --- */
+ /* row 126: --- */
+ /* row 127: --- */
+ /* row 128: --- */
+ /* row 129: --- */
+ /* row 130: --- */
+ /* row 131: --- */
+ /* row 132: --- */
+ /* row 133: --- */
+ /* row 134: --- */
+ /* row 135: --- */
+ /* row 136 */
+ 64 | (170 << 8), /* first, last */
+ 0xF303,0xF304,0xF305,0xF306,0xF307,0xF308,
+ 0xF309,0xF30A,0xF30B,0xF30C,0xF30D,0xF30E,0xF30F,0xF310,0xF311,0xF312,
+ 0xF313,0xF314,0xF315,0xF316,0xF317,0xF318,0x0100,0x00C1,0x01CD,0x00C0,
+ 0x0112,0x00C9,0x011A,0x00C8,0x014C,0x00D3,0x01D1,0x00D2,0xF325,0x1EBE,
+ 0xF327,0x1EC0,0x00CA,0x0101,0x00E1,0x01CE,0x00E0,0x0251,0x0113,0x00E9,
+ 0x011B,0x00E8,0x012B,0x00ED,0x01D0,0x00EC,0x014D,0x00F3,0x01D2,0x00F2,
+ 0x016B,0x00FA,0x01D4,0x00F9,0x01D6,0x01D8,0x01DA,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x01DC,0x00FC,0xF344,0x1EBF,0xF346,0x1EC1,0x00EA,0x0261,0xF34A,
+ 0xF34B,
+ /* row 137 */
+ 64 | (254 << 8), /* first, last */
+ 0xF3A0,0xF3A1,0xffff,0x650A,0xffff,0xffff,
+ 0x4E3D,0x6EDD,0x9D4E,0x91DF,0xffff,0xffff,0xF3AC,0x6491,0x4F1A,0x4F28,
+ 0x4FA8,0x5156,0x5174,0x519C,0x51E4,0x52A1,0x52A8,0x533B,0x534E,0x53D1,
+ 0x53D8,0x56E2,0x58F0,0x5904,0x5907,0x5932,0x5934,0x5B66,0x5B9E,0x5B9F,
+ 0x5C9A,0x5E86,0x603B,0x6589,0x67FE,0x6804,0x6865,0x6D4E,0x70BC,0x7535,
+ 0x7EA4,0x7EAC,0x7EBA,0x7EC7,0x7ECF,0x7EDF,0x7F06,0x7F37,0x827A,0x82CF,
+ 0x836F,0x89C6,0x8BBE,0x8BE2,0x8F66,0x8F67,0x8F6E,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x7411,0x7CFC,0x7DCD,0x6946,0x7AC9,0x5227,0xffff,0xffff,0xffff,
+ 0xffff,0x918C,0x78B8,0x915E,0x80BC,0xffff,0x8D0B,0x80F6,0xF3F0,0xffff,
+ 0xffff,0x809F,0x9EC7,0x4CCD,0x9DC9,0x9E0C,0x4C3E,0xF3F9,0xF3FA,0x9E0A,
+ 0xF3FC,0x35C1,0xffff,0x6E9A,0x823E,0x7519,0xffff,0x4911,0x9A6C,0x9A8F,
+ 0x9F99,0x7987,0xF408,0xF409,0xF40A,0xF40B,0x4E24,0x4E81,0x4E80,0x4E87,
+ 0x4EBF,0x4EEB,0x4F37,0x344C,0x4FBD,0x3E48,0x5003,0x5088,0x347D,0x3493,
+ 0x34A5,0x5186,0x5905,0x51DB,0x51FC,0x5205,0x4E89,0x5279,0x5290,0x5327,
+ 0x35C7,0x53A9,0x3551,0x53B0,0x3553,0x53C2,0x5423,0x356D,0x3572,0x3681,
+ 0x5493,0x54A3,0x54B4,0x54B9,0x54D0,0x54EF,0x5518,0x5523,0x5528,0x3598,
+ 0x553F,0x35A5,0x35BF,0x55D7,0x35C5,
+ /* row 138 */
+ 64 | (254 << 8), /* first, last */
+ 0xF43D,0x5525,0xffff,0xF440,0xF441,0xF442,
+ 0x5590,0xF444,0x39EC,0xF446,0x8E46,0xF448,0xF449,0x4053,0xF44B,0x777A,
+ 0xF44D,0x3A34,0x47D5,0xF450,0xF451,0xF452,0x64DD,0xF454,0xF455,0xF456,
+ 0xF457,0x648D,0x8E7E,0xF45A,0xF45B,0xF45C,0xF45D,0xF45E,0xF45F,0xffff,
+ 0xF461,0xF462,0xF463,0x47F4,0xF465,0xF466,0x9AB2,0x3A67,0xF469,0x3FED,
+ 0x3506,0xF46C,0xF46D,0xF46E,0xF46F,0x9D6E,0x9815,0xffff,0x43D9,0xF474,
+ 0x64B4,0x54E3,0xF477,0xF478,0xF479,0x39FB,0xF47B,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xF47C,0xF47D,0xF47E,0x64EA,0xF480,0xF481,0x8E68,0xF483,0xF484,
+ 0xF485,0xffff,0x480B,0xF488,0x3FFA,0x5873,0xF48B,0xffff,0xF48D,0xF48E,
+ 0xF48F,0xF490,0xF491,0x5579,0x40BB,0x43BA,0xffff,0x4AB4,0xF497,0xF498,
+ 0x81AA,0x98F5,0xF49B,0x6379,0x39FE,0xF49E,0x8DC0,0x56A1,0x647C,0x3E43,
+ 0xffff,0xF4A4,0xF4A5,0xF4A6,0xF4A7,0xffff,0xF4A9,0xF4AA,0x3992,0x3A06,
+ 0xF4AD,0x3578,0xF4AF,0xF4B0,0x5652,0xF4B2,0xF4B3,0xF4B4,0x34BC,0x6C3D,
+ 0xF4B7,0xffff,0xffff,0xF4BA,0xF4BB,0xF4BC,0xF4BD,0xF4BE,0xF4BF,0xF4C0,
+ 0xF4C1,0x7F93,0xF4C3,0xF4C4,0xF4C5,0x35FB,0xF4C7,0xF4C8,0xF4C9,0xF4CA,
+ 0x3F93,0xF4CC,0xF4CD,0xF4CE,0xF4CF,0xffff,0xF4D1,0xF4D2,0xF4D3,0xF4D4,
+ 0xF4D5,0x3FF9,0xF4D7,0x6432,0xF4D9,
+ /* row 139 */
+ 64 | (253 << 8), /* first, last */
+ 0xF4DA,0xF4DB,0xF4DC,0xF4DD,0xF4DE,0xF4DF,
+ 0xF4E0,0x3A18,0xF4E2,0xF4E3,0xF4E4,0xF4E5,0xF4E6,0xF4E7,0xF4E8,0xF4E9,
+ 0x95AA,0x54CC,0x82C4,0x55B9,0xffff,0xF4EF,0x9C26,0x9AB6,0xF4F2,0xF4F3,
+ 0x7140,0x816D,0x80EC,0x5C1C,0xF4F8,0x8134,0x3797,0x535F,0xF4FC,0x91B6,
+ 0xF4FE,0xF4FF,0xF500,0xF501,0x35DD,0xF503,0x3609,0xF505,0x56AF,0xF507,
+ 0xF508,0xF509,0xF50A,0xF50B,0xF50C,0xF50D,0xF50E,0xF50F,0xF510,0xF511,
+ 0x5A54,0xF513,0xF514,0xF515,0xF516,0x579C,0xF518,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xF519,0xF51A,0xF51B,0xF51C,0xF51D,0x3703,0xF51F,0xF520,0xF521,
+ 0xF522,0xF523,0xF524,0xF525,0xF526,0x5899,0x5268,0x361A,0xF52A,0x7BB2,
+ 0x5B68,0x4800,0x4B2C,0x9F27,0x49E7,0x9C1F,0x9B8D,0xF533,0xF534,0x55FB,
+ 0x35F2,0x5689,0x4E28,0x5902,0xF53A,0xF53B,0x9751,0xF53D,0x4E5B,0x4EBB,
+ 0x353E,0x5C23,0x5F51,0x5FC4,0x38FA,0x624C,0x6535,0x6B7A,0x6C35,0x6C3A,
+ 0x706C,0x722B,0x4E2C,0x72AD,0xF54E,0x7F52,0x793B,0x7CF9,0x7F53,0xF553,
+ 0x34C1,0xffff,0xF556,0x8002,0x8080,0xF559,0xF55A,0x535D,0x8864,0x89C1,
+ 0xF55E,0x8BA0,0x8D1D,0x9485,0x9578,0x957F,0x95E8,0xF565,0x97E6,0x9875,
+ 0x98CE,0x98DE,0x9963,0xF56B,0x9C7C,0x9E1F,0x9EC4,0x6B6F,0xF907,0x4E37,
+ 0xF572,0x961D,0x6237,0x94A2,
+ /* row 140 */
+ 64 | (220 << 8), /* first, last */
+ 0x503B,0x6DFE,0xF579,0xF57A,0x3DC9,0x888F,
+ 0xF57D,0x7077,0x5CF5,0x4B20,0xF581,0x3559,0xF583,0x6122,0xF585,0x8FA7,
+ 0x91F6,0x7191,0x6719,0x73BA,0xF58B,0xF58C,0x3C8B,0xF58E,0x4B10,0x78E4,
+ 0x7402,0x51AE,0xF593,0x4009,0x6A63,0xF596,0x4223,0x860F,0xffff,0x7A2A,
+ 0xF59B,0xF59C,0x9755,0x704D,0x5324,0xF5A0,0x93F4,0x76D9,0xF5A3,0xF5A4,
+ 0x77DD,0x4EA3,0x4FF0,0x50BC,0x4E2F,0x4F17,0xF5AB,0x5434,0x7D8B,0x5892,
+ 0x58D0,0xF5B0,0x5E92,0x5E99,0x5FC2,0xF5B4,0x658B,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xF5B6,0x6919,0x6A43,0xF5B9,0x6CFF,0xffff,0x7200,0xF5BD,0x738C,
+ 0x3EDB,0xF5C0,0x5B15,0x74B9,0x8B83,0xF5C4,0xF5C5,0x7A93,0x7BEC,0x7CC3,
+ 0x7E6C,0x82F8,0x8597,0xF5CC,0x8890,0xF5CE,0x8EB9,0xF5D0,0x8FCF,0x855F,
+ 0x99E0,0x9221,0xF5D5,0xF5D6,0xF5D7,0x4071,0x42A2,0x5A1A,0xffff,0xffff,
+ 0xffff,0x9868,0x676B,0x4276,0x573D,0xffff,0x85D6,0xF5E4,0x82BF,0xF5E6,
+ 0x4C81,0xF5E8,0x5D7B,0xF5EA,0xF5EB,0xF5EC,0xF5ED,0x5B96,0xF5EF,0xffff,
+ 0x7E5B,
+ /* row 141 */
+ 96 | (254 << 8), /* first, last */
+ 0x5D3E,0x5D48,0x5D56,0x3DFC,
+ 0x380F,0x5DA4,0x5DB9,0x3820,0x3838,0x5E42,0x5EBD,0x5F25,0x5F83,0x3908,
+ 0x3914,0x393F,0x394D,0x60D7,0x613D,0x5CE5,0x3989,0x61B7,0x61B9,0x61CF,
+ 0x39B8,0x622C,0x6290,0x62E5,0x6318,0x39F8,0x56B1,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x3A03,0x63E2,0x63FB,0x6407,0x645A,0x3A4B,0x64C0,0x5D15,0x5621,
+ 0x9F9F,0x3A97,0x6586,0x3ABD,0x65FF,0x6653,0x3AF2,0x6692,0x3B22,0x6716,
+ 0x3B42,0x67A4,0x6800,0x3B58,0x684A,0x6884,0x3B72,0x3B71,0x3B7B,0x6909,
+ 0x6943,0x725C,0x6964,0x699F,0x6985,0x3BBC,0x69D6,0x3BDD,0x6A65,0x6A74,
+ 0x6A71,0x6A82,0x3BEC,0x6A99,0x3BF2,0x6AAB,0x6AB5,0x6AD4,0x6AF6,0x6B81,
+ 0x6BC1,0x6BEA,0x6C75,0x6CAA,0x3CCB,0x6D02,0x6D06,0x6D26,0x6D81,0x3CEF,
+ 0x6DA4,0x6DB1,0x6E15,0x6E18,0x6E29,0x6E86,0xF694,0x6EBB,0x6EE2,0x6EDA,
+ 0x9F7F,0x6EE8,0x6EE9,0x6F24,0x6F34,0x3D46,0xF69E,0x6F81,0x6FBE,0x3D6A,
+ 0x3D75,0x71B7,0x5C99,0x3D8A,0x702C,0x3D91,0x7050,0x7054,0x706F,0x707F,
+ 0x7089,0xF6AD,0x43C1,0x35F1,0xF6B0,
+ /* row 142 */
+ 64 | (254 << 8), /* first, last */
+ 0xE311,0x57BE,0xE313,0x713E,0xE315,0x364E,
+ 0x69A2,0xE318,0x5B74,0x7A49,0xE31B,0xE31C,0x7A65,0x7A7D,0xE31F,0x7ABB,
+ 0x7AB0,0x7AC2,0x7AC3,0x71D1,0xE325,0x41CA,0x7ADA,0x7ADD,0x7AEA,0x41EF,
+ 0x54B2,0xE32C,0x7B0B,0x7B55,0x7B29,0xE330,0xE331,0x7BA2,0x7B6F,0x839C,
+ 0xE335,0xE336,0x7BD0,0x8421,0x7B92,0x7BB8,0xE33B,0x3DAD,0xE33D,0x8492,
+ 0x7BFA,0x7C06,0x7C35,0xE342,0x7C44,0x7C83,0xE345,0x7CA6,0x667D,0xE348,
+ 0x7CC9,0x7CC7,0x7CE6,0x7C74,0x7CF3,0x7CF5,0x7CCE,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x7E67,0x451D,0xE352,0x7D5D,0xE354,0x748D,0x7D89,0x7DAB,0x7135,
+ 0x7DB3,0x7DD2,0xE35B,0xE35C,0x7DE4,0x3D13,0x7DF5,0xE360,0x7DE5,0xE362,
+ 0x7E1D,0xE364,0xE365,0x7E6E,0x7E92,0x432B,0x946C,0x7E27,0x7F40,0x7F41,
+ 0x7F47,0x7936,0xE36F,0x99E1,0x7F97,0xE372,0x7FA3,0xE374,0xE375,0x455C,
+ 0xE377,0x4503,0xE379,0x7FFA,0xE37B,0x8005,0x8008,0x801D,0x8028,0x802F,
+ 0xE381,0xE382,0x803B,0x803C,0x8061,0xE386,0x4989,0xE388,0xE389,0xE38A,
+ 0x6725,0x80A7,0xE38D,0x8107,0x811A,0x58B0,0xE391,0x6C7F,0xE393,0xE394,
+ 0x64E7,0xE396,0x8218,0xE398,0x6A53,0xE39A,0xE39B,0x447A,0x8229,0xE39E,
+ 0xE39F,0xE3A0,0x4FF9,0xE3A2,0x84E2,0x8362,0xE3A5,0xE3A6,0xE3A7,0xE3A8,
+ 0xE3A9,0x82AA,0x691B,0xE3AC,0x41DB,
+ /* row 143 */
+ 64 | (254 << 8), /* first, last */
+ 0x854B,0x82D0,0x831A,0xE3B1,0xE3B2,0x36C1,
+ 0xE3B4,0xE3B5,0x827B,0x82E2,0x8318,0xE3B9,0xE3BA,0xE3BB,0xE3BC,0xE3BD,
+ 0x3DBF,0x831D,0x55EC,0x8385,0x450B,0xE3C3,0x83AC,0x83C1,0x83D3,0x347E,
+ 0xE3C8,0x6A57,0x855A,0x3496,0xE3CC,0xE3CD,0x8458,0xE3CF,0x8471,0x3DD3,
+ 0x44E4,0x6AA7,0x844A,0xE3D5,0x7958,0x84A8,0xE3D8,0xE3D9,0xE3DA,0x84DE,
+ 0x840F,0x8391,0x44A0,0x8493,0x84E4,0xE3E1,0x4240,0xE3E3,0x4543,0x8534,
+ 0x5AF2,0xE3E7,0x4527,0x8573,0x4516,0x67BF,0x8616,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xE3ED,0xE3EE,0x85C1,0xE3F0,0x8602,0xE3F2,0xE3F3,0xE3F4,0x456A,
+ 0x8628,0x3648,0xE3F8,0x53F7,0xE3FA,0x867E,0x8771,0xE3FD,0x87EE,0xE3FF,
+ 0x87B1,0x87DA,0x880F,0x5661,0x866C,0x6856,0x460F,0x8845,0x8846,0xE409,
+ 0xE40A,0xE40B,0x885E,0x889C,0x465B,0x88B4,0x88B5,0x63C1,0x88C5,0x7777,
+ 0xE414,0x8987,0x898A,0x89A6,0x89A9,0x89A7,0x89BC,0xE41B,0x89E7,0xE41D,
+ 0xE41E,0x8A9C,0x7793,0x91FE,0x8A90,0xE423,0x7AE9,0xE425,0xE426,0x4713,
+ 0xE428,0x717C,0x8B0C,0x8B1F,0xE42C,0xE42D,0x8B3F,0x8B4C,0x8B4D,0x8AA9,
+ 0xE432,0x8B90,0x8B9B,0x8AAF,0xE436,0x4615,0x884F,0x8C9B,0xE43A,0xE43B,
+ 0xE43C,0x3725,0xE43E,0x8CD6,0xE440,0xE441,0x8D12,0x8D03,0xE444,0x8CDB,
+ 0x705C,0x8D11,0xE448,0x3ED0,0x8D77,
+ /* row 144 */
+ 64 | (254 << 8), /* first, last */
+ 0x8DA9,0xE44C,0xE44D,0xE44E,0x3B7C,0xE450,
+ 0xE451,0x7AE7,0x8EAD,0x8EB6,0x8EC3,0x92D4,0x8F19,0x8F2D,0xE459,0xE45A,
+ 0x8FA5,0x9303,0xE45D,0xE45E,0x8FB3,0x492A,0xE461,0xE462,0xE463,0x5EF8,
+ 0xE465,0x8FF9,0xE467,0xE468,0xE469,0xE46A,0x3980,0xE46C,0x9037,0xE46E,
+ 0xE46F,0x9061,0xE471,0xE472,0x90A8,0xE474,0x90C4,0xE476,0x90AE,0x90FD,
+ 0x9167,0x3AF0,0x91A9,0x91C4,0x7CAC,0xE47E,0xE47F,0x920E,0x6C9F,0x9241,
+ 0x9262,0xE484,0x92B9,0xE486,0xE487,0xE488,0xE489,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xE48A,0x932C,0x936B,0xE48D,0xE48E,0x708F,0x5AC3,0xE491,0xE492,
+ 0x4965,0x9244,0xE495,0xE496,0xE497,0x9373,0x945B,0x8EBC,0x9585,0x95A6,
+ 0x9426,0x95A0,0x6FF6,0x42B9,0xE4A1,0xE4A2,0xE4A3,0xE4A4,0x49DF,0x6C1C,
+ 0x967B,0x9696,0x416C,0x96A3,0xE4AB,0x61DA,0x96B6,0x78F5,0xE4AF,0x96BD,
+ 0x53CC,0x49A1,0xE4B3,0xE4B4,0xE4B5,0xE4B6,0xE4B7,0xE4B8,0xE4B9,0xE4BA,
+ 0x9731,0x8642,0x9736,0x4A0F,0x453D,0x4585,0xE4C1,0x7075,0x5B41,0x971B,
+ 0x975C,0xE4C6,0x9757,0x5B4A,0xE4C9,0x975F,0x9425,0x50D0,0xE4CD,0xE4CE,
+ 0x9789,0x979F,0x97B1,0x97BE,0x97C0,0x97D2,0x97E0,0xE4D6,0x97EE,0x741C,
+ 0xE4D9,0x97FF,0x97F5,0xE4DC,0xE4DD,0x4AD1,0x9834,0x9833,0x984B,0x9866,
+ 0x3B0E,0xE4E4,0x3D51,0xE4E6,0xE4E7,
+ /* row 145 */
+ 64 | (254 << 8), /* first, last */
+ 0xE4E8,0x98CA,0x98B7,0x98C8,0x98C7,0x4AFF,
+ 0xE4EE,0xE4EF,0x55B0,0x98E1,0x98E6,0x98EC,0x9378,0x9939,0xE4F6,0x4B72,
+ 0xE4F8,0xE4F9,0x99F5,0x9A0C,0x9A3B,0x9A10,0x9A58,0xE4FF,0x36C4,0xE501,
+ 0xE502,0x9AE0,0x9AE2,0xE505,0x9AF4,0x4C0E,0x9B14,0x9B2D,0xE50A,0x5034,
+ 0x9B34,0xE50D,0x38C3,0xE50F,0x9B50,0x9B40,0xE512,0x5A45,0xE514,0x9B8E,
+ 0xE516,0x9C02,0x9BFF,0x9C0C,0xE51A,0x9DD4,0xE51C,0xE51D,0xE51E,0xE51F,
+ 0xE520,0xE521,0x9D7E,0x9D83,0xE524,0x9E0E,0x6888,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x9DC4,0xE528,0xE529,0xE52A,0xE52B,0xE52C,0x9D39,0xE52E,0xE52F,
+ 0x9E90,0x9E95,0x9E9E,0x9EA2,0x4D34,0x9EAA,0x9EAF,0xE537,0x9EC1,0x3B60,
+ 0x39E5,0x3D1D,0x4F32,0x37BE,0xE53E,0x9F02,0x9F08,0x4B96,0x9424,0xE543,
+ 0x9F17,0x9F16,0x9F39,0x569F,0x568A,0x9F45,0x99B8,0xE54B,0x97F2,0x847F,
+ 0x9F62,0x9F69,0x7ADC,0x9F8E,0x7216,0x4BBE,0xE554,0xE555,0x7177,0xE557,
+ 0xE558,0xE559,0x739E,0xE55B,0xE55C,0x799F,0xE55E,0xE55F,0x9369,0x93F3,
+ 0xE562,0x92EC,0x9381,0x93CB,0xE566,0xE567,0x7217,0x3EEB,0x7772,0x7A43,
+ 0x70D0,0xE56D,0xE56E,0x717E,0xE570,0x70A3,0xE572,0xE573,0x3EC7,0xE575,
+ 0xE576,0xE577,0x3722,0xE579,0xE57A,0x36E1,0xE57C,0xE57D,0xE57E,0x3723,
+ 0xE580,0x575B,0xE582,0xE583,0xE584,
+ /* row 146 */
+ 64 | (254 << 8), /* first, last */
+ 0xE585,0xE586,0x8503,0xE588,0x8503,0x8455,
+ 0xE58B,0xE58C,0xE58D,0xE58E,0xE58F,0xE590,0x44F4,0xE592,0xE593,0xE594,
+ 0x67F9,0x3733,0x3C15,0x3DE7,0x586C,0xE59A,0x6810,0x4057,0xE59D,0xE59E,
+ 0xE59F,0xE5A0,0xE5A1,0x54CB,0x569E,0xE5A4,0x5692,0xE5A6,0xE5A7,0xE5A8,
+ 0x93C6,0xE5AA,0x939C,0x4EF8,0x512B,0x3819,0xE5AF,0x4EBC,0xE5B1,0xE5B2,
+ 0x4F4B,0x4F8A,0xE5B5,0x5A68,0xE5B7,0xE5B8,0x3999,0xE5BA,0xE5BB,0x3435,
+ 0x4F29,0xE5BE,0xE5BF,0xE5C0,0x8ADA,0xE5C2,0x4E98,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x50CD,0x510D,0x4FA2,0x4F03,0xE5C8,0xE5C9,0x4F42,0x502E,0x506C,
+ 0x5081,0x4FCC,0x4FE5,0x5058,0x50FC,0x5159,0x515B,0x515D,0x515E,0x6E76,
+ 0xE5D7,0xE5D8,0xE5D9,0x6D72,0xE5DB,0xE5DC,0x51A8,0x51C3,0xE5DF,0x44DD,
+ 0xE5E1,0xE5E2,0xE5E3,0x8D7A,0xE5E5,0xE5E6,0x5259,0x52A4,0xE5E9,0x52E1,
+ 0x936E,0x467A,0x718C,0xE5EE,0xE5EF,0xE5F0,0xE5F1,0x69D1,0xE5F3,0x7479,
+ 0x3EDE,0x7499,0x7414,0x7456,0x7398,0x4B8E,0xE5FB,0xE5FC,0x53D0,0x3584,
+ 0x720F,0xE600,0x55B4,0xE602,0x54CD,0xE604,0x571D,0x925D,0x96F4,0x9366,
+ 0x57DD,0x578D,0x577F,0x363E,0x58CB,0x5A99,0xE60F,0xE610,0xE611,0xE612,
+ 0x5A2C,0x59B8,0x928F,0x5A7E,0x5ACF,0x5A12,0xE619,0xE61A,0xE61B,0xE61C,
+ 0x36F5,0x6D05,0x7443,0x5A21,0xE621,
+ /* row 147 */
+ 64 | (254 << 8), /* first, last */
+ 0x5A81,0xE623,0xE624,0x93E0,0x748C,0xE627,
+ 0x7105,0x4972,0x9408,0xE62B,0x93BD,0x37A0,0x5C1E,0x5C9E,0x5E5E,0x5E48,
+ 0xE632,0xE633,0xE634,0x5ECD,0x5B4F,0xE637,0xE638,0x3701,0xE63A,0x36DD,
+ 0xE63C,0x36D3,0x812A,0xE63F,0xE640,0xE641,0xE642,0x5F0C,0x5F0E,0xE645,
+ 0xE646,0x5A6B,0xE648,0x5B44,0x8614,0xE64B,0x8860,0x607E,0xE64E,0xE64F,
+ 0x5FDB,0x3EB8,0xE652,0xE653,0xE654,0xE655,0x61C0,0xE657,0xE658,0xE659,
+ 0x6199,0x6198,0x6075,0xE65D,0xE65E,0xE65F,0xE660,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x6471,0xE662,0xE663,0x3A29,0xE665,0xE666,0xE667,0xE668,0x6337,
+ 0xE66A,0x64B6,0x6331,0x63D1,0xE66E,0xE66F,0x62A4,0xE671,0x643B,0x656B,
+ 0x6972,0x3BF4,0xE676,0xE677,0xE678,0xE679,0x550D,0xE67B,0xE67C,0xE67D,
+ 0x66CE,0xE67F,0xE680,0x3AE0,0x4190,0xE683,0xE684,0xE685,0xE686,0xE687,
+ 0xE688,0x78EE,0xE68A,0xE68B,0xE68C,0x3464,0xE68E,0xE68F,0xE690,0x668E,
+ 0xE692,0x666B,0x4B93,0x6630,0xE696,0xE697,0x6663,0xE699,0xE69A,0x661E,
+ 0xE69C,0x38D1,0xE69E,0xE69F,0x3B99,0xE6A1,0xE6A2,0x74D0,0x3B96,0x678F,
+ 0xE6A6,0x68B6,0x681E,0x3BC4,0x6ABE,0x3863,0xE6AC,0xE6AD,0x6A33,0x6A52,
+ 0x6AC9,0x6B05,0xE6B2,0x6511,0x6898,0x6A4C,0x3BD7,0x6A7A,0x6B57,0xE6B9,
+ 0xE6BA,0x93A0,0x92F2,0xE6BD,0xE6BE,
+ /* row 148 */
+ 64 | (254 << 8), /* first, last */
+ 0x9289,0xE6C0,0xE6C1,0x9467,0x6DA5,0x6F0B,
+ 0xE6C5,0x6D67,0xE6C7,0x3D8F,0x6E04,0xE6CA,0x5A3D,0x6E0A,0x5847,0x6D24,
+ 0x7842,0x713B,0xE6D1,0xE6D2,0x70F1,0x7250,0x7287,0x7294,0xE6D7,0xE6D8,
+ 0x5179,0xE6DA,0xE6DB,0x747A,0xE6DD,0xE6DE,0xE6DF,0xE6E0,0xE6E1,0x3F06,
+ 0x3EB1,0xE6E4,0xE6E5,0xE6E6,0x60A7,0x3EF3,0x74CC,0x743C,0x9387,0x7437,
+ 0x449F,0xE6EE,0x4551,0x7583,0x3F63,0xE6F2,0xE6F3,0x3F58,0x7555,0x7673,
+ 0xE6F7,0x3B19,0x7468,0xE6FA,0xE6FB,0xE6FC,0x3AFB,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x3DCD,0xE6FF,0x3EFF,0xE701,0xE702,0x91FA,0x5732,0x9342,0xE706,
+ 0xE707,0x50DF,0xE709,0xE70A,0x7778,0xE70C,0x770E,0x770F,0x777B,0xE710,
+ 0xE711,0x3A5E,0xE713,0x7438,0x749B,0x3EBF,0xE717,0xE718,0x40C8,0xE71A,
+ 0xE71B,0x9307,0xE71D,0x781E,0x788D,0x7888,0x78D2,0x73D0,0x7959,0xE724,
+ 0xE725,0x410E,0x799B,0x8496,0x79A5,0x6A2D,0xE72B,0x7A3A,0x79F4,0x416E,
+ 0xE72F,0x4132,0x9235,0x79F1,0xE733,0xE734,0xE735,0xE736,0xE737,0x3597,
+ 0x556B,0x3570,0x36AA,0xE73C,0xE73D,0x7AE2,0x5A59,0xE740,0xE741,0xE742,
+ 0x5A0D,0xE744,0x78F0,0x5A2A,0xE747,0x7AFE,0x41F9,0x7C5D,0x7C6D,0x4211,
+ 0xE74D,0xE74E,0xE74F,0x7CCD,0xE751,0xE752,0x7C8E,0x7C7C,0x7CAE,0x6AB2,
+ 0x7DDC,0x7E07,0x7DD3,0x7F4E,0xE75B,
+ /* row 149 */
+ 64 | (254 << 8), /* first, last */
+ 0xE75C,0xE75D,0x7D97,0xE75F,0x426A,0xE761,
+ 0xE762,0x67D6,0xE764,0xE765,0x57C4,0xE767,0xE768,0xE769,0x7FDD,0x7B27,
+ 0xE76C,0xE76D,0xE76E,0x7B0C,0xE770,0x99E6,0x8645,0x9A63,0x6A1C,0xE775,
+ 0x39E2,0xE777,0xE778,0x9A1F,0xE77A,0x8480,0xE77C,0xE77D,0x44EA,0x8137,
+ 0x4402,0x80C6,0x8109,0x8142,0xE784,0x98C3,0xE786,0x8262,0x8265,0xE789,
+ 0x8453,0xE78B,0x8610,0xE78D,0x5A86,0x417F,0xE790,0x5B2B,0xE792,0x5AE4,
+ 0xE794,0x86A0,0xE796,0xE797,0x882D,0xE799,0x5A02,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x886E,0x4F45,0x8887,0x88BF,0x88E6,0x8965,0x894D,0xE7A2,0x8954,
+ 0xE7A4,0xE7A5,0xE7A6,0xE7A7,0xE7A8,0xE7A9,0x3EAD,0x84A3,0x46F5,0x46CF,
+ 0x37F2,0x8A3D,0x8A1C,0xE7B1,0x5F4D,0x922B,0xE7B4,0x65D4,0x7129,0x70C4,
+ 0xE7B8,0x9D6D,0x8C9F,0x8CE9,0xE7BC,0x599A,0x77C3,0x59F0,0x436E,0x36D4,
+ 0x8E2A,0x8EA7,0xE7C4,0x8F30,0x8F4A,0x42F4,0x6C58,0x6FBB,0xE7CA,0x489B,
+ 0x6F79,0x6E8B,0xE7CE,0x9BE9,0x36B5,0xE7D1,0x90BB,0x9097,0x5571,0x4906,
+ 0x91BB,0x9404,0xE7D8,0x4062,0xE7DA,0x9427,0xE7DC,0xE7DD,0x84E5,0x8A2B,
+ 0x9599,0x95A7,0x9597,0x9596,0xE7E4,0x7445,0x3EC2,0xE7E7,0xE7E8,0xE7E9,
+ 0x3EE7,0xE7EB,0x968F,0xE7ED,0xE7EE,0xE7EF,0x3ECC,0xE7F1,0xE7F2,0xE7F3,
+ 0x7412,0x746B,0x3EFC,0x9741,0xE7F8,
+ /* row 150 */
+ 64 | (254 << 8), /* first, last */
+ 0x6847,0x4A1D,0xE7FB,0xE7FC,0x975D,0x9368,
+ 0xE7FF,0xE800,0xE801,0xE802,0x92BA,0x5B11,0x8B69,0x493C,0x73F9,0xE808,
+ 0x979B,0x9771,0x9938,0xE80C,0x5DC1,0xE80E,0xE80F,0x981F,0xE811,0x92F6,
+ 0xE813,0x91E5,0x44C0,0xE816,0xE817,0xE818,0x98DC,0xE81A,0x3F00,0x922A,
+ 0x4925,0x8414,0x993B,0x994D,0xE821,0x3DFD,0x999B,0x4B6F,0x99AA,0x9A5C,
+ 0xE827,0xE828,0x6A8F,0x9A21,0x5AFE,0x9A2F,0xE82D,0x4B90,0xE82F,0x99BC,
+ 0x4BBD,0x4B97,0x937D,0x5872,0xE835,0x5822,0xE837,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xE838,0x7844,0xE83A,0xE83B,0x68C5,0x3D7D,0x9458,0x3927,0x6150,
+ 0xE841,0xE842,0x6107,0x9C4F,0x9C53,0x9C7B,0x9C35,0x9C10,0x9B7F,0x9BCF,
+ 0xE84B,0x9B9F,0xE84D,0xE84E,0x9D21,0x4CAE,0xE851,0x9E18,0x4CB0,0x9D0C,
+ 0xE855,0xE856,0xE857,0xE858,0x9DA5,0x84BD,0xE85B,0xE85C,0xE85D,0x85FC,
+ 0x4533,0xE860,0xE861,0xE862,0x8420,0x85EE,0xE865,0xE866,0xE867,0x79E2,
+ 0xE869,0xE86A,0x492D,0xE86C,0x3D62,0x93DB,0x92BE,0x9348,0xE871,0x78B9,
+ 0x9277,0x944D,0x4FE4,0x3440,0x9064,0xE878,0x783D,0x7854,0x78B6,0x784B,
+ 0xE87D,0xE87E,0xE87F,0x369A,0x4F72,0x6FDA,0x6FD9,0x701E,0x701E,0x5414,
+ 0xE887,0x57BB,0x58F3,0x578A,0x9D16,0x57D7,0x7134,0x34AF,0xE88F,0x71EB,
+ 0xE891,0xE892,0x5B28,0xE894,0xE895,
+ /* row 151 */
+ 64 | (254 << 8), /* first, last */
+ 0x610C,0x5ACE,0x5A0B,0x42BC,0xE89A,0x372C,
+ 0x4B7B,0xE89D,0x93BB,0x93B8,0xE8A0,0xE8A1,0x8472,0xE8A3,0xE8A4,0xE8A5,
+ 0xE8A6,0xE8A7,0x5994,0xE8A9,0xE8AA,0x7DA8,0xE8AC,0xE8AD,0xE8AE,0xE8AF,
+ 0xE8B0,0x92E5,0x73E2,0x3EE9,0x74B4,0xE8B5,0xE8B6,0x3EE1,0xE8B8,0x6AD8,
+ 0x73F3,0x73FB,0x3ED6,0xE8BD,0xE8BE,0xE8BF,0xE8C0,0xE8C1,0xE8C2,0xE8C3,
+ 0x7448,0xE8C5,0x70A5,0xE8C7,0x9284,0x73E6,0x935F,0xE8CB,0x9331,0xE8CD,
+ 0xE8CE,0x9386,0xE8D0,0xE8D1,0x4935,0xE8D3,0x716B,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xE8D5,0xE8D6,0x56A4,0xE8D8,0xE8D9,0xE8DA,0x5502,0x79C4,0xE8DD,
+ 0x7DFE,0xE8DF,0xE8E0,0xE8E1,0x452E,0x9401,0x370A,0xE8E5,0xE8E6,0x59B0,
+ 0xE8E8,0xE8E9,0xE8EA,0x5AA1,0x36E2,0xE8ED,0x36B0,0x925F,0x5A79,0xE8F1,
+ 0xE8F2,0x9374,0x3CCD,0xE8F5,0x4A96,0x398A,0x50F4,0x3D69,0x3D4C,0xE8FB,
+ 0x7175,0x42FB,0xE8FE,0x6E0F,0xE900,0x44EB,0x6D57,0xE903,0x7067,0x6CAF,
+ 0x3CD6,0xE907,0xE908,0x6E02,0x6F0C,0x3D6F,0xE90C,0x7551,0x36BC,0x34C8,
+ 0x4680,0x3EDA,0x4871,0x59C4,0x926E,0x493E,0x8F41,0xE917,0xE918,0x5812,
+ 0x57C8,0x36D6,0xE91C,0x70FE,0xE91E,0xE91F,0xE920,0xE921,0xE922,0x68B9,
+ 0x6967,0xE925,0xE926,0xE927,0xE928,0xE929,0xE92A,0xE92B,0xE92C,0x6A1A,
+ 0xE92E,0xE92F,0x843E,0x44DF,0x44CE,
+ /* row 152 */
+ 64 | (254 << 8), /* first, last */
+ 0xE933,0xE934,0xE935,0xE936,0x6F17,0xE938,
+ 0x833D,0xE93A,0x83ED,0xE93C,0xE93D,0xE93E,0x5989,0x5A82,0xE941,0x5A61,
+ 0x5A71,0xE944,0xE945,0x372D,0x59EF,0xE948,0x36C7,0x718E,0x9390,0x669A,
+ 0xE94D,0x5A6E,0x5A2B,0xE950,0x6A2B,0xE952,0xE953,0xE954,0xE955,0x711D,
+ 0xE957,0xE958,0x4FB0,0xE95A,0x5CC2,0xE95C,0xE95D,0xE95E,0x6A0C,0xE960,
+ 0xE961,0x70A6,0x7133,0xE964,0x3DA5,0x6CDF,0xE967,0xE968,0x7E65,0x59EB,
+ 0x5D2F,0x3DF3,0x5F5C,0xE96E,0xE96F,0x7DA4,0x8426,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x5485,0xE973,0xE974,0xE975,0x577E,0xE977,0xE978,0x3FE5,0xE97A,
+ 0xE97B,0x7003,0xE97D,0x5D70,0x738F,0x7CD3,0xE981,0xE982,0x4FC8,0x7FE7,
+ 0x72CD,0x7310,0xE987,0x7338,0x7339,0xE98A,0x7341,0x7348,0x3EA9,0xE98E,
+ 0x906C,0x71F5,0xE991,0x73E1,0x81F6,0x3ECA,0x770C,0x3ED1,0x6CA2,0x56FD,
+ 0x7419,0x741E,0x741F,0x3EE2,0x3EF0,0x3EF4,0x3EFA,0x74D3,0x3F0E,0x3F53,
+ 0x7542,0x756D,0x7572,0x758D,0x3F7C,0x75C8,0x75DC,0x3FC0,0x764D,0x3FD7,
+ 0x7674,0x3FDC,0x767A,0xE9B0,0x7188,0x5623,0x8980,0x5869,0x401D,0x7743,
+ 0x4039,0x6761,0x4045,0x35DB,0x7798,0x406A,0x406F,0x5C5E,0x77BE,0x77CB,
+ 0x58F2,0x7818,0x70B9,0x781C,0x40A8,0x7839,0x7847,0x7851,0x7866,0x8448,
+ 0xE9CB,0x7933,0x6803,0x7932,0x4103,
+ /* row 153 */
+ 64 | (254 << 8), /* first, last */
+ 0x4109,0x7991,0x7999,0x8FBB,0x7A06,0x8FBC,
+ 0x4167,0x7A91,0x41B2,0x7ABC,0x8279,0x41C4,0x7ACF,0x7ADB,0x41CF,0x4E21,
+ 0x7B62,0x7B6C,0x7B7B,0x7C12,0x7C1B,0x4260,0x427A,0x7C7B,0x7C9C,0x428C,
+ 0x7CB8,0x4294,0x7CED,0x8F93,0x70C0,0xE9EF,0x7DCF,0x7DD4,0x7DD0,0x7DFD,
+ 0x7FAE,0x7FB4,0x729F,0x4397,0x8020,0x8025,0x7B39,0x802E,0x8031,0x8054,
+ 0x3DCC,0x57B4,0x70A0,0x80B7,0x80E9,0x43ED,0x810C,0x732A,0x810E,0x8112,
+ 0x7560,0x8114,0x4401,0x3B39,0x8156,0x8159,0x815A,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x4413,0x583A,0x817C,0x8184,0x4425,0x8193,0x442D,0x81A5,0x57EF,
+ 0x81C1,0x81E4,0x8254,0x448F,0x82A6,0x8276,0x82CA,0x82D8,0x82FF,0x44B0,
+ 0x8357,0x9669,0x698A,0x8405,0x70F5,0x8464,0x60E3,0x8488,0x4504,0x84BE,
+ 0x84E1,0x84F8,0x8510,0x8538,0x8552,0x453B,0x856F,0x8570,0x85E0,0x4577,
+ 0x8672,0x8692,0x86B2,0x86EF,0x9645,0x878B,0x4606,0x4617,0x88AE,0x88FF,
+ 0x8924,0x8947,0x8991,0xEA43,0x8A29,0x8A38,0x8A94,0x8AB4,0x8C51,0x8CD4,
+ 0x8CF2,0x8D1C,0x4798,0x585F,0x8DC3,0x47ED,0x4EEE,0x8E3A,0x55D8,0x5754,
+ 0x8E71,0x55F5,0x8EB0,0x4837,0x8ECE,0x8EE2,0x8EE4,0x8EED,0x8EF2,0x8FB7,
+ 0x8FC1,0x8FCA,0x8FCC,0x9033,0x99C4,0x48AD,0x98E0,0x9213,0x491E,0x9228,
+ 0x9258,0x926B,0x92B1,0x92AE,0x92BF,
+ /* row 154 */
+ 64 | (254 << 8), /* first, last */
+ 0x92E3,0x92EB,0x92F3,0x92F4,0x92FD,0x9343,
+ 0x9384,0x93AD,0x4945,0x4951,0x9EBF,0x9417,0x5301,0x941D,0x942D,0x943E,
+ 0x496A,0x9454,0x9479,0x952D,0x95A2,0x49A7,0x95F4,0x9633,0x49E5,0x67A0,
+ 0x4A24,0x9740,0x4A35,0x97B2,0x97C2,0x5654,0x4AE4,0x60E8,0x98B9,0x4B19,
+ 0x98F1,0x5844,0x990E,0x9919,0x51B4,0x991C,0x9937,0x9942,0x995D,0x9962,
+ 0x4B70,0x99C5,0x4B9D,0x9A3C,0x9B0F,0x7A83,0x9B69,0x9B81,0x9BDD,0x9BF1,
+ 0x9BF4,0x4C6D,0x9C20,0x376F,0xEAA9,0x9D49,0x9C3A,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x9EFE,0x5650,0x9D93,0x9DBD,0x9DC0,0x9DFC,0x94F6,0x8FB6,0x9E7B,
+ 0x9EAC,0x9EB1,0x9EBD,0x9EC6,0x94DC,0x9EE2,0x9EF1,0x9EF8,0x7AC8,0x9F44,
+ 0xEABF,0xEAC0,0xEAC1,0x691A,0x94C3,0x59AC,0xEAC5,0x5840,0x94C1,0x37B9,
+ 0xEAC9,0xEACA,0xEACB,0xEACC,0x5757,0x7173,0xEACF,0xEAD0,0xEAD1,0x546A,
+ 0xEAD3,0xEAD4,0x549E,0xEAD6,0xEAD7,0xEAD8,0xEAD9,0xEADA,0x60E7,0xEADC,
+ 0x567A,0xEADE,0xEADF,0xEAE0,0xEAE1,0xEAE2,0xEAE3,0x6955,0x9C2F,0x87A5,
+ 0xEAE7,0xEAE8,0xEAE9,0xEAEA,0xEAEB,0xEAEC,0x5C20,0xEAEE,0x5E0B,0xEAF0,
+ 0xEAF1,0xEAF2,0x671E,0xEAF4,0xEAF5,0xEAF6,0x3647,0xEAF8,0xEAF9,0xEAFA,
+ 0xEAFB,0x5364,0x84AD,0xEAFE,0xEAFF,0xEB00,0x8B81,0xEB02,0xEB03,0xEB04,
+ 0xEB05,0x4E78,0x70BB,0xEB08,0xEB09,
+ /* row 155 */
+ 64 | (254 << 8), /* first, last */
+ 0xEB0A,0xEB0B,0xEB0C,0xEB0D,0xEB0E,0xEB0F,
+ 0x62C3,0xEB11,0xEB12,0x7198,0x6855,0xEB15,0x69E9,0x36C8,0xEB18,0xEB19,
+ 0xEB1A,0xEB1B,0xEB1C,0xEB1D,0x82FD,0xEB1F,0xEB20,0xEB21,0x89A5,0xEB23,
+ 0x8FA0,0xEB25,0x97B8,0xEB27,0x9847,0x9ABD,0xEB2A,0xffff,0xEB2C,0xEB2D,
+ 0xEB2E,0xEB2F,0xEB30,0xEB31,0xEB32,0xEB33,0xEB34,0xEB35,0xEB36,0xEB37,
+ 0xEB38,0xEB39,0x5FB1,0x6648,0x66BF,0xEB3D,0xEB3E,0xEB3F,0x7201,0xEB41,
+ 0x77D7,0xEB43,0xEB44,0x7E87,0xEB46,0x58B5,0x670E,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x6918,0xEB4A,0xEB4B,0xEB4C,0xEB4D,0xEB4E,0xEB4F,0xEB50,0x48D0,
+ 0x4AB8,0xEB53,0xEB54,0xEB55,0xEB56,0xEB57,0xEB58,0xEB59,0xEB5A,0xEB5B,
+ 0x51D2,0xEB5D,0x599F,0xEB5F,0x3BBE,0xEB61,0xEB62,0xEB63,0x5788,0xEB65,
+ 0x399B,0xEB67,0xEB68,0xEB69,0x3762,0xEB6B,0x8B5E,0xEB6D,0x99D6,0xEB6F,
+ 0xEB70,0xEB71,0x7209,0xEB73,0xEB74,0x5965,0xEB76,0xEB77,0xEB78,0x8EDA,
+ 0xEB7A,0x528F,0x573F,0x7171,0xEB7E,0xEB7F,0xEB80,0xEB81,0x55BC,0xEB83,
+ 0xEB84,0xEB85,0x91D4,0x3473,0xEB88,0xEB89,0xEB8A,0x4718,0xEB8C,0xEB8D,
+ 0xEB8E,0xEB8F,0xEB90,0x5066,0x34FB,0xEB93,0x60DE,0xEB95,0x477C,0xEB97,
+ 0xEB98,0xEB99,0xEB9A,0xEB9B,0x57A1,0x7151,0x6FB6,0xEB9F,0xEBA0,0x9056,
+ 0xEBA2,0xEBA3,0x8B62,0xEBA5,0xEBA6,
+ /* row 156 */
+ 64 | (254 << 8), /* first, last */
+ 0x5D5B,0xEBA8,0x8F36,0xEBAA,0xEBAB,0x8AEA,
+ 0xEBAD,0xEBAE,0xEBAF,0xEBB0,0x4BC0,0xEBB2,0xEBB3,0xEBB4,0x9465,0xEBB6,
+ 0x6195,0x5A27,0xEBB9,0x4FBB,0x56B9,0xEBBC,0xEBBD,0x4E6A,0xEBBF,0x9656,
+ 0x6D8F,0xEBC2,0x3618,0x8977,0xEBC5,0xEBC6,0xEBC7,0xEBC8,0x71DF,0xEBCA,
+ 0x7B42,0xEBCC,0xEBCD,0xEBCE,0x9104,0xEBD0,0x7A45,0x9DF0,0xEBD3,0x9A26,
+ 0xEBD5,0x365F,0xEBD7,0xEBD8,0x7983,0xEBDA,0xEBDB,0x5D2C,0xEBDD,0x83CF,
+ 0xEBDF,0x46D0,0xEBE1,0x753B,0x8865,0xEBE4,0x58B6,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x371C,0xEBE7,0xEBE8,0xEBE9,0x3C54,0xEBEB,0xEBEC,0x9281,0xEBEE,
+ 0xEBEF,0x9330,0xEBF1,0xEBF2,0x6C39,0x949F,0xEBF5,0xEBF6,0x8827,0x88F5,
+ 0xEBF9,0xEBFA,0xEBFB,0x6EB8,0xEBFD,0xEBFE,0x39A4,0x36B9,0x5C10,0x79E3,
+ 0x453F,0x66B6,0xEC05,0xEC06,0x8943,0xEC08,0xEC09,0x56D6,0x40DF,0xEC0C,
+ 0x39A1,0xEC0E,0xEC0F,0xEC10,0x71AD,0x8366,0xEC13,0xEC14,0x5A67,0x4CB7,
+ 0xEC17,0xEC18,0xEC19,0xEC1A,0xEC1B,0xEC1C,0xEC1D,0x7B43,0x797E,0xEC20,
+ 0x6FB5,0xEC22,0x6A03,0xEC24,0x53A2,0xEC26,0x93BF,0x6836,0x975D,0xEC2A,
+ 0xEC2B,0xEC2C,0xEC2D,0xEC2E,0xEC2F,0x5D85,0xEC31,0xEC32,0x5715,0x9823,
+ 0xEC35,0x5DAB,0xEC37,0x65BE,0x69D5,0x53D2,0xEC3B,0xEC3C,0x3C11,0x6736,
+ 0xEC3F,0xEC40,0xEC41,0xEC42,0xEC43,
+ /* row 157 */
+ 64 | (254 << 8), /* first, last */
+ 0xEC44,0xEC45,0xEC46,0xEC47,0xEC48,0xEC49,
+ 0x35CA,0xEC4B,0xEC4C,0x48FA,0x63E6,0xEC4F,0x7808,0x9255,0xEC52,0x43F2,
+ 0xEC54,0x43DF,0xEC56,0xEC57,0xEC58,0x59F8,0xEC5A,0x8F0B,0xEC5C,0xEC5D,
+ 0x7B51,0xEC5F,0xEC60,0x3DF7,0xEC62,0xEC63,0x8FD0,0x728F,0x568B,0xEC67,
+ 0xEC68,0xEC69,0xEC6A,0xEC6B,0xEC6C,0xEC6D,0xEC6E,0xEC6F,0xEC70,0xEC71,
+ 0xEC72,0xEC73,0x7E9F,0xEC75,0xEC76,0x4CA4,0x9547,0xEC79,0x71A2,0xEC7B,
+ 0x4D91,0x9012,0xEC7E,0x4D9C,0xEC80,0x8FBE,0x55C1,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x8FBA,0xEC84,0x8FB9,0xEC86,0x4509,0x7E7F,0x6F56,0x6AB1,0x4EEA,
+ 0x34E4,0xEC8D,0xEC8E,0x373A,0x8E80,0xEC91,0xEC92,0xEC93,0xEC94,0xEC95,
+ 0xEC96,0x3DEB,0xEC98,0xEC99,0xEC9A,0xEC9B,0x4E9A,0xEC9D,0xEC9E,0x56BF,
+ 0xECA0,0x8E0E,0x5B6D,0xECA3,0xECA4,0x63DE,0x62D0,0xECA7,0xECA8,0x6530,
+ 0x562D,0xECAB,0x541A,0xECAD,0x3DC6,0xECAF,0x4C7D,0x5622,0x561E,0x7F49,
+ 0xECB4,0x5975,0xECB6,0x8770,0x4E1C,0xECB9,0xECBA,0xECBB,0x8117,0x9D5E,
+ 0x8D18,0x763B,0x9C45,0x764E,0x77B9,0x9345,0x5432,0x8148,0x82F7,0x5625,
+ 0x8132,0x8418,0x80BD,0x55EA,0x7962,0x5643,0x5416,0xECCF,0x35CE,0x5605,
+ 0x55F1,0x66F1,0xECD4,0x362D,0x7534,0x55F0,0x55BA,0x5497,0x5572,0xECDB,
+ 0xECDC,0x5ED0,0xECDE,0xECDF,0xECE0,
+ /* row 158 */
+ 64 | (254 << 8), /* first, last */
+ 0xECE1,0x9EAB,0x7D5A,0x55DE,0xECE5,0x629D,
+ 0x976D,0x5494,0x8CCD,0x71F6,0x9176,0x63FC,0x63B9,0x63FE,0x5569,0xECF0,
+ 0x9C72,0xECF2,0x519A,0x34DF,0xECF5,0x51A7,0x544D,0x551E,0x5513,0x7666,
+ 0x8E2D,0xECFC,0x75B1,0x80B6,0x8804,0x8786,0x88C7,0x81B6,0x841C,0xED04,
+ 0x44EC,0x7304,0xED07,0x5B90,0x830B,0xED0A,0x567B,0xED0C,0xED0D,0xED0E,
+ 0xED0F,0xED10,0xED11,0x9170,0xED13,0x9208,0xED15,0xED16,0xED17,0xED18,
+ 0x7266,0xED1A,0x474E,0xED1C,0xED1D,0xED1E,0x40FA,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x9C5D,0x651F,0xED22,0x48F3,0xED24,0xED25,0xED26,0xED27,0x6062,
+ 0xED29,0xED2A,0xffff,0xED2C,0xED2D,0x71A3,0x7E8E,0x9D50,0x4E1A,0x4E04,
+ 0x3577,0x5B0D,0x6CB2,0x5367,0x36AC,0x39DC,0x537D,0x36A5,0xED3B,0x589A,
+ 0xED3D,0x822D,0x544B,0x57AA,0xED41,0xED42,0xffff,0x3A52,0xED45,0x7374,
+ 0xED47,0x4D09,0x9BED,0xED4A,0xED4B,0x4C5B,0xED4D,0xED4E,0xED4F,0x845C,
+ 0xED51,0xED52,0xED53,0xED54,0x632E,0x7D25,0xED57,0xED58,0x3A2A,0x9008,
+ 0x52CC,0x3E74,0x367A,0x45E9,0xED5F,0x7640,0x5AF0,0xED62,0x787A,0x47B6,
+ 0x58A7,0x40BF,0x567C,0x9B8B,0x5D74,0x7654,0xED6B,0x9E85,0x4CE1,0x75F9,
+ 0x37FB,0x6119,0xED71,0xED72,0xffff,0x565D,0xED75,0x57A7,0xED77,0xED78,
+ 0x5234,0xED7A,0x35AD,0x6C4A,0x9D7C,
+ /* row 159 */
+ 64 | (254 << 8), /* first, last */
+ 0x7C56,0x9B39,0x57DE,0xED81,0x5C53,0x64D3,
+ 0xED84,0xED85,0xED86,0x86AD,0xED88,0xED89,0xED8A,0xED8B,0xffff,0x51FE,
+ 0xED8E,0x5D8E,0x9703,0xED91,0x9E81,0x904C,0x7B1F,0x9B02,0x5CD1,0x7BA3,
+ 0x6268,0x6335,0x9AFF,0x7BCF,0x9B2A,0x7C7E,0x9B2E,0x7C42,0x7C86,0x9C15,
+ 0x7BFC,0x9B09,0x9F17,0x9C1B,0xEDA6,0x9F5A,0x5573,0x5BC3,0x4FFD,0x9E98,
+ 0x4FF2,0x5260,0x3E06,0x52D1,0x5767,0x5056,0x59B7,0x5E12,0x97C8,0x9DAB,
+ 0x8F5C,0x5469,0x97B4,0x9940,0x97BA,0x532C,0x6130,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x692C,0x53DA,0x9C0A,0x9D02,0x4C3B,0x9641,0x6980,0x50A6,0x7546,
+ 0xEDC6,0x99DA,0x5273,0xffff,0x9159,0x9681,0x915C,0xffff,0x9151,0xEDCF,
+ 0x637F,0xEDD1,0x6ACA,0x5611,0x918E,0x757A,0x6285,0xEDD7,0x734F,0x7C70,
+ 0xEDDA,0xEDDB,0xffff,0xEDDD,0x76D6,0x9B9D,0x4E2A,0xEDE1,0x83BE,0x8842,
+ 0xffff,0x5C4A,0x69C0,0x50ED,0x577A,0x521F,0x5DF5,0x4ECE,0x6C31,0xEDED,
+ 0x4F39,0x549C,0x54DA,0x529A,0x8D82,0x35FE,0x5F0C,0x35F3,0xffff,0x6B52,
+ 0x917C,0x9FA5,0x9B97,0x982E,0x98B4,0x9ABA,0x9EA8,0x9E84,0x717A,0x7B14,
+ 0xffff,0x6BFA,0x8818,0x7F78,0xffff,0x5620,0xEE08,0x8E77,0x9F53,0xffff,
+ 0x8DD4,0x8E4F,0x9E1C,0x8E01,0x6282,0xEE11,0x8E28,0x8E75,0x7AD3,0xEE15,
+ 0x7A3E,0x78D8,0x6CEA,0x8A67,0x7607,
+ /* row 160 */
+ 64 | (254 << 8), /* first, last */
+ 0xEE1B,0x9F26,0x6CCE,0x87D6,0x75C3,0xEE20,
+ 0x7853,0xEE22,0x8D0C,0x72E2,0x7371,0x8B2D,0x7302,0x74F1,0x8CEB,0xEE2A,
+ 0x862F,0x5FBA,0x88A0,0x44B7,0xffff,0xEE30,0xEE31,0xffff,0x8A7E,0xEE34,
+ 0xffff,0x60FD,0x7667,0x9AD7,0x9D44,0x936E,0x9B8F,0x87F5,0xffff,0x880F,
+ 0x8CF7,0x732C,0x9721,0x9BB0,0x35D6,0x72B2,0x4C07,0x7C51,0x994A,0xEE48,
+ 0x6159,0x4C04,0x9E96,0x617D,0xffff,0x575F,0x616F,0x62A6,0x6239,0x62CE,
+ 0x3A5C,0x61E2,0x53AA,0xEE56,0x6364,0x6802,0x35D2,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x5D57,0xEE5B,0x8FDA,0xEE5D,0xffff,0x50D9,0xEE60,0x7906,0x5332,
+ 0x9638,0xEE64,0x4065,0xffff,0x77FE,0xffff,0x7CC2,0xEE6A,0x7CDA,0x7A2D,
+ 0x8066,0x8063,0x7D4D,0x7505,0x74F2,0x8994,0x821A,0x670C,0x8062,0xEE76,
+ 0x805B,0x74F0,0x8103,0x7724,0x8989,0xEE7C,0x7553,0xEE7E,0x87A9,0x87CE,
+ 0x81C8,0x878C,0x8A49,0x8CAD,0x8B43,0x772B,0x74F8,0x84DA,0x3635,0x69B2,
+ 0x8DA6,0xffff,0x89A9,0x7468,0x6DB9,0x87C1,0xEE91,0x74E7,0x3DDB,0x7176,
+ 0x60A4,0x619C,0x3CD1,0x7162,0x6077,0xffff,0x7F71,0xEE9C,0x7250,0x60E9,
+ 0x4B7E,0x5220,0x3C18,0xEEA2,0xEEA3,0xEEA4,0xEEA5,0xEEA6,0xEEA7,0xEEA8,
+ 0xEEA9,0xEEAA,0x5CC1,0xEEAC,0xEEAD,0xEEAE,0xEEAF,0xEEB0,0xEEB1,0x4562,
+ 0x5B1F,0xEEB4,0x9F50,0x9EA6,0xEEB7,
+ /* row 161: --- */
+ /* row 162: --- */
+ /* row 163: --- */
+ /* row 164: --- */
+ /* row 165: --- */
+ /* row 166: --- */
+ /* row 167: --- */
+ /* row 168: --- */
+ /* row 169: --- */
+ /* row 170: --- */
+ /* row 171: --- */
+ /* row 172: --- */
+ /* row 173: --- */
+ /* row 174: --- */
+ /* row 175: --- */
+ /* row 176: --- */
+ /* row 177: --- */
+ /* row 178: --- */
+ /* row 179: --- */
+ /* row 180: --- */
+ /* row 181: --- */
+ /* row 182: --- */
+ /* row 183: --- */
+ /* row 184: --- */
+ /* row 185: --- */
+ /* row 186: --- */
+ /* row 187: --- */
+ /* row 188: --- */
+ /* row 189: --- */
+ /* row 190: --- */
+ /* row 191: --- */
+ /* row 192: --- */
+ /* row 193: --- */
+ /* row 194: --- */
+ /* row 195: --- */
+ /* row 196: --- */
+ /* row 197: --- */
+ /* row 198 */
+ 161 | (254 << 8), /* first, last */
+ 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,
+ 0x2469,0x2474,0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,
+ 0x247D,0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,
+ 0x2179,0x4E36,0x4E3F,0x4E85,0x4EA0,0x5182,0x5196,0x51AB,0x52F9,0x5338,
+ 0x5369,0x53B6,0x590A,0x5B80,0x5DDB,0x2F33,0x5E7F,0xF6E0,0x5F50,0x5F61,
+ 0x6534,0xF6E4,0x7592,0xF6E6,0x8FB5,0xF6E8,0x00A8,0x02C6,0x30FD,0x30FE,
+ 0x309D,0x309E,0xF6EF,0xF6F0,0x3005,0x3006,0x3007,0x30FC,0xFF3B,0xFF3D,
+ 0x273D,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048,0x3049,
+ 0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050,0x3051,0x3052,0x3053,
+ 0x3054,0x3055,0x3056,0x3057,0x3058,
+ /* row 199 */
+ 64 | (254 << 8), /* first, last */
+ 0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,
+ 0x305F,0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068,
+ 0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070,0x3071,0x3072,
+ 0x3073,0x3074,0x3075,0x3076,0x3077,0x3078,0x3079,0x307A,0x307B,0x307C,
+ 0x307D,0x307E,0x307F,0x3080,0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,
+ 0x3087,0x3088,0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F,0x3090,
+ 0x3091,0x3092,0x3093,0x30A1,0x30A2,0x30A3,0x30A4,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x30A5,0x30A6,0x30A7,0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,
+ 0x30AE,0x30AF,0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,
+ 0x30B8,0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0,0x30C1,
+ 0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8,0x30C9,0x30CA,0x30CB,
+ 0x30CC,0x30CD,0x30CE,0x30CF,0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,
+ 0x30D6,0x30D7,0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,
+ 0x30E0,0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8,0x30E9,
+ 0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0,0x30F1,0x30F2,0x30F3,
+ 0x30F4,0x30F5,0x30F6,0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,
+ 0x0416,0x0417,0x0418,0x0419,0x041A,
+ /* row 200 */
+ 64 | (254 << 8), /* first, last */
+ 0x041B,0x041C,0x041D,0x041E,0x041F,0x0420,
+ 0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042A,
+ 0x042B,0x042C,0x042D,0x042E,0x042F,0x0430,0x0431,0x0432,0x0433,0x0434,
+ 0x0435,0x0451,0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,
+ 0x043E,0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,
+ 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F,0x21E7,0x21B8,
+ 0x21B9,0xF7E5,0xF7E6,0x4E5A,0xF7E8,0x5202,0xF7EA,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xF7EB,0x5188,0xF7ED,0xF7EE,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xFFE2,0xFFE4,0xFF07,0xFF02,0x3231,
+ 0x2116,0x2121,0x309B,0x309C,0x2E80,0x2E84,0x2E86,0x2E87,0x2E88,0x2E8A,
+ 0x2E8C,0x2E8D,0x2E95,0x2E9C,0x2E9D,0x2EA5,0x2EA7,0x2EAA,0x2EAC,0x2EAE,
+ 0x2EB6,0x2EBC,0x2EBE,0x2EC6,0x2ECA,0x2ECC,0x2ECD,0x2ECF,0x2ED6,0x2ED7,
+ 0x2EDE,0x2EE3,0xffff,0xffff,0xffff,0x0283,0x0250,0x025B,0x0254,0x0275,
+ 0x0153,0x00F8,0x014B,0x028A,0x026A,
+ /* row 201: --- */
+ /* row 202: --- */
+ /* row 203: --- */
+ /* row 204: --- */
+ /* row 205: --- */
+ /* row 206: --- */
+ /* row 207: --- */
+ /* row 208: --- */
+ /* row 209: --- */
+ /* row 210: --- */
+ /* row 211: --- */
+ /* row 212: --- */
+ /* row 213: --- */
+ /* row 214: --- */
+ /* row 215: --- */
+ /* row 216: --- */
+ /* row 217: --- */
+ /* row 218: --- */
+ /* row 219: --- */
+ /* row 220: --- */
+ /* row 221: --- */
+ /* row 222: --- */
+ /* row 223: --- */
+ /* row 224: --- */
+ /* row 225: --- */
+ /* row 226: --- */
+ /* row 227: --- */
+ /* row 228: --- */
+ /* row 229: --- */
+ /* row 230: --- */
+ /* row 231: --- */
+ /* row 232: --- */
+ /* row 233: --- */
+ /* row 234: --- */
+ /* row 235: --- */
+ /* row 236: --- */
+ /* row 237: --- */
+ /* row 238: --- */
+ /* row 239: --- */
+ /* row 240: --- */
+ /* row 241: --- */
+ /* row 242: --- */
+ /* row 243: --- */
+ /* row 244: --- */
+ /* row 245: --- */
+ /* row 246: --- */
+ /* row 247: --- */
+ /* row 248: --- */
+ /* row 249 */
+ 214 | (254 << 8), /* first, last */
+ 0x7881,0x92B9,0x88CF,0x58BB,0x6052,0x7CA7,
+ 0x5AFA,0x2554,0x2566,0x2557,0x2560,0x256C,0x2563,0x255A,0x2569,0x255D,
+ 0x2552,0x2564,0x2555,0x255E,0x256A,0x2561,0x2558,0x2567,0x255B,0x2553,
+ 0x2565,0x2556,0x255F,0x256B,0x2562,0x2559,0x2568,0x255C,0x2551,0x2550,
+ 0x256D,0x256E,0x2570,0x256F,0xFFED,
+ /* row 250 */
+ 64 | (254 << 8), /* first, last */
+ 0xE000,0x92DB,0xE002,0xE003,0x854C,0x42B5,
+ 0x73EF,0x51B5,0x3649,0xE009,0xE00A,0x9344,0xE00C,0x82EE,0xE00E,0x783C,
+ 0x6744,0x62DF,0xE012,0xE013,0xE014,0xE015,0xE016,0x4FAB,0xE018,0x5008,
+ 0xE01A,0xE01B,0xE01C,0xE01D,0xE01E,0x5029,0xE020,0x5FA4,0xE022,0xE023,
+ 0x6EDB,0xE025,0x507D,0x5101,0x347A,0x510E,0x986C,0x3743,0x8416,0xE02D,
+ 0xE02E,0x5160,0xE030,0x516A,0xE032,0xE033,0xE034,0xE035,0xE036,0xE037,
+ 0xE038,0x5B82,0x877D,0xE03B,0xE03C,0x51B2,0x51B8,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x9D34,0x51C9,0x51CF,0x51D1,0x3CDC,0x51D3,0xE045,0x51B3,0x51E2,
+ 0x5342,0x51ED,0x83CD,0x693E,0xE04C,0x5F7B,0x520B,0x5226,0x523C,0x52B5,
+ 0x5257,0x5294,0x52B9,0x52C5,0x7C15,0x8542,0x52E0,0x860D,0xE05A,0x5305,
+ 0xE05C,0x5549,0x6ED9,0xE05F,0xE060,0xE061,0x5333,0x5344,0xE064,0x6CCB,
+ 0xE066,0x681B,0x73D5,0x604A,0x3EAA,0x38CC,0xE06C,0x71DD,0x44A2,0x536D,
+ 0x5374,0xE071,0x537E,0x537F,0xE074,0xE075,0x77E6,0x5393,0xE078,0x53A0,
+ 0x53AB,0x53AE,0x73A7,0xE07D,0x3F59,0x739C,0x53C1,0x53C5,0x6C49,0x4E49,
+ 0x57FE,0x53D9,0x3AAB,0xE087,0x53E0,0xE089,0xE08A,0x53F6,0xE08C,0x5413,
+ 0x7079,0x552B,0x6657,0x6D5B,0x546D,0xE093,0xE094,0x555D,0x548F,0x54A4,
+ 0x47A6,0xE099,0xE09A,0x3DB4,0xE09C,
+ /* row 251 */
+ 64 | (254 << 8), /* first, last */
+ 0xE09D,0xE09E,0x5547,0x4CED,0x542F,0x7417,
+ 0x5586,0x55A9,0x5605,0xE0A6,0xE0A7,0x4552,0xE0A9,0x66B3,0xE0AB,0x5637,
+ 0x66CD,0xE0AE,0x66A4,0x66AD,0x564D,0x564F,0x78F1,0x56F1,0x9787,0x53FE,
+ 0x5700,0x56EF,0x56ED,0xE0BA,0x3623,0xE0BC,0x5746,0xE0BE,0x6C6E,0x708B,
+ 0x5742,0x36B1,0xE0C3,0x57E6,0xE0C5,0x5803,0xE0C7,0xE0C8,0x5826,0xE0CA,
+ 0x585C,0x58AA,0x3561,0x58E0,0x58DC,0xE0D0,0x58FB,0x5BFF,0x5743,0xE0D4,
+ 0xE0D5,0x93D3,0x35A1,0x591F,0x68A6,0x36C3,0x6E59,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xE0DC,0x5A24,0x5553,0xE0DF,0x8505,0x59C9,0xE0E2,0xE0E3,0xE0E4,
+ 0xE0E5,0x59D9,0xE0E7,0xE0E8,0xE0E9,0x6D71,0xE0EB,0xE0EC,0x59F9,0xE0EE,
+ 0x5AAB,0x5A63,0x36E6,0xE0F2,0x5A77,0x3708,0x5A96,0x7465,0x5AD3,0xE0F8,
+ 0xE0F9,0x3D85,0xE0FB,0x3732,0xE0FD,0x5E83,0x52D0,0x5B76,0x6588,0x5B7C,
+ 0xE103,0x4004,0x485D,0xE106,0x5BD5,0x6160,0xE109,0xE10A,0xE10B,0x5BF3,
+ 0x5B9D,0x4D10,0x5C05,0xE110,0x5C13,0x73CE,0x5C14,0xE114,0xE115,0x5C49,
+ 0x48DD,0x5C85,0x5CE9,0x5CEF,0x5D8B,0xE11C,0xE11D,0x5D10,0x5D18,0x5D46,
+ 0xE121,0x5CBA,0x5DD7,0x82FC,0x382D,0xE126,0xE127,0xE128,0x8287,0x3836,
+ 0x3BC2,0x5E2E,0x6A8A,0x5E75,0x5E7A,0xE130,0xE131,0x53A6,0x4EB7,0x5ED0,
+ 0x53A8,0xE136,0x5E09,0x5EF4,0xE139,
+ /* row 252 */
+ 64 | (254 << 8), /* first, last */
+ 0x5EF9,0x5EFB,0x38A0,0x5EFC,0x683E,0x941B,
+ 0x5F0D,0xE141,0xE142,0x3ADE,0x48AE,0xE145,0x5F3A,0xE147,0xE148,0x5F58,
+ 0xE14A,0x5F63,0x97BD,0xE14D,0x5F72,0x9340,0xE150,0x5FA7,0x5DB6,0x3D5F,
+ 0xE154,0xE155,0xE156,0xE157,0x91D6,0xE159,0xE15A,0x6031,0x6685,0xE15D,
+ 0x3963,0x3DC7,0x3639,0x5790,0xE162,0x7971,0x3E40,0x609E,0x60A4,0x60B3,
+ 0xE168,0xE169,0xE16A,0x74A4,0x50E1,0x5AA0,0x6164,0x8424,0x6142,0xE171,
+ 0xE172,0x6181,0x51F4,0xE175,0x6187,0x5BAA,0xE178,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xE179,0x61D3,0xE17B,0xE17C,0x61D0,0x3932,0xE17F,0xE180,0x6023,
+ 0x615C,0x651E,0x638B,0xE185,0x62C5,0xE187,0x62D5,0xE189,0x636C,0xE18B,
+ 0x3A17,0x6438,0x63F8,0xE18F,0xE190,0x6490,0x6F8A,0xE193,0x9814,0xE195,
+ 0xE196,0x64E1,0x64E5,0x947B,0x3A66,0x643A,0x3A57,0x654D,0x6F16,0xE19F,
+ 0xE1A0,0x6585,0x656D,0x655F,0xE1A4,0x65B5,0xE1A6,0x4B37,0x65D1,0x40D8,
+ 0xE1AA,0x65E0,0x65E3,0x5FDF,0xE1AE,0x6618,0xE1B0,0xE1B1,0x6644,0xE1B3,
+ 0xE1B4,0x664B,0xE1B6,0x6667,0xE1B8,0x6673,0x6674,0xE1BB,0xE1BC,0xE1BD,
+ 0xE1BE,0xE1BF,0x77C5,0xE1C1,0x99A4,0x6702,0xE1C4,0xE1C5,0x3B2B,0x69FA,
+ 0xE1C8,0x675E,0x6767,0x6762,0xE1CC,0xE1CD,0x67D7,0x44E9,0x6822,0x6E50,
+ 0x923C,0x6801,0xE1D4,0xE1D5,0x685D,
+ /* row 253 */
+ 64 | (254 << 8), /* first, last */
+ 0xE1D7,0x69E1,0x6A0B,0xE1DA,0x6973,0x68C3,
+ 0xE1DD,0x6901,0x6900,0x3D32,0x3A01,0xE1E2,0x3B80,0x67AC,0x6961,0xE1E6,
+ 0x42FC,0x6936,0x6998,0x3BA1,0xE1EB,0x8363,0x5090,0x69F9,0xE1EF,0xE1F0,
+ 0x6A45,0xE1F2,0x6A9D,0x3BF3,0x67B1,0x6AC8,0xE1F7,0x3C0D,0x6B1D,0xE1FA,
+ 0x60DE,0x6B35,0x6B74,0xE1FE,0x6EB5,0xE200,0xE201,0xE202,0x3740,0x5421,
+ 0xE205,0x6BE1,0xE207,0x6BDC,0x6C37,0xE20A,0xE20B,0xE20C,0x6C5A,0x8226,
+ 0x6C79,0xE210,0x44C5,0xE212,0xE213,0xE214,0xE215,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xE216,0x36E5,0x3CEB,0xE219,0x9B83,0xE21B,0xE21C,0x7F8F,0x6837,
+ 0xE21F,0xE220,0xE221,0x6D96,0x6D5C,0x6E7C,0x6F04,0xE226,0xE227,0xE228,
+ 0x8533,0xE22A,0x51C7,0x6C9C,0x6E1D,0x842E,0xE22F,0x6E2F,0xE231,0x7453,
+ 0xE233,0x79CC,0x6E4F,0x5A91,0xE237,0x6FF8,0x370D,0x6F9D,0xE23B,0x6EFA,
+ 0xE23D,0xE23E,0x4555,0x93F0,0x6F44,0x6F5C,0x3D4E,0x6F74,0xE245,0x3D3B,
+ 0x6F9F,0xE248,0x6FD3,0xE24A,0xE24B,0xE24C,0xE24D,0xE24E,0xE24F,0x51DF,
+ 0xE251,0xE252,0xE253,0xE254,0x704B,0x707E,0x70A7,0x7081,0x70CC,0x70D5,
+ 0x70D6,0x70DF,0x4104,0x3DE8,0x71B4,0x7196,0xE261,0x712B,0x7145,0x5A88,
+ 0x714A,0x716E,0x5C9C,0xE268,0x714F,0x9362,0xE26B,0x712C,0xE26D,0xE26E,
+ 0xE26F,0x71BA,0xE271,0x70BD,0x720E,
+ /* row 254 */
+ 64 | (254 << 8), /* first, last */
+ 0x9442,0x7215,0x5911,0x9443,0x7224,0x9341,
+ 0xE27A,0x722E,0x7240,0xE27D,0x68BD,0x7255,0x7257,0x3E55,0xE282,0x680D,
+ 0x6F3D,0x7282,0x732A,0x732B,0xE288,0xE289,0x48ED,0xE28B,0x7328,0x732E,
+ 0x73CF,0x73AA,0xE290,0xE291,0x73C9,0x7449,0xE294,0xE295,0xE296,0x6623,
+ 0x36C5,0xE299,0xE29A,0xE29B,0x73F7,0x7415,0x6903,0xE29F,0x7439,0xE2A1,
+ 0x3ED7,0x745C,0xE2A4,0x7460,0xE2A6,0x7447,0x73E4,0x7476,0x83B9,0x746C,
+ 0x3730,0x7474,0x93F1,0x6A2C,0x7482,0x4953,0xE2B2,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xE2B3,0xE2B4,0xE2B5,0x5B46,0xE2B7,0xE2B8,0x74C8,0xE2BA,0x750E,
+ 0x74E9,0x751E,0xE2BE,0xE2BF,0x5BD7,0xE2C1,0x9385,0x754D,0x754A,0x7567,
+ 0x756E,0xE2C7,0x3F04,0xE2C9,0x758E,0x745D,0x759E,0x75B4,0x7602,0x762C,
+ 0x7651,0x764F,0x766F,0x7676,0xE2D4,0x7690,0x81EF,0x37F8,0xE2D8,0xE2D9,
+ 0x76A1,0x76A5,0x76B7,0x76CC,0xE2DE,0x8462,0xE2E0,0xE2E1,0xE2E2,0x771E,
+ 0x7726,0x7740,0x64AF,0xE2E7,0x7758,0xE2E9,0x77AF,0xE2EB,0xE2EC,0xE2ED,
+ 0x77F4,0x7809,0xE2F0,0xE2F1,0x68CA,0x78AF,0x78C7,0x78D3,0x96A5,0x792E,
+ 0xE2F8,0x78D7,0x7934,0x78B1,0xE2FC,0x8FB8,0x8884,0xE2FF,0xE300,0xE301,
+ 0x7986,0x8900,0x6902,0x7980,0xE306,0x799D,0xE308,0x793C,0x79A9,0x6E2A,
+ 0xE30C,0x3EA8,0x79C6,0xE30F,0x79D4,
+ /* row 255: --- */
+};
+
+static sal_Int32 const aImplBig5Hkscs2001ToUnicodeRowOffsets[] = {
+ -1, /* row 0 */
+ -1, /* row 1 */
+ -1, /* row 2 */
+ -1, /* row 3 */
+ -1, /* row 4 */
+ -1, /* row 5 */
+ -1, /* row 6 */
+ -1, /* row 7 */
+ -1, /* row 8 */
+ -1, /* row 9 */
+ -1, /* row 10 */
+ -1, /* row 11 */
+ -1, /* row 12 */
+ -1, /* row 13 */
+ -1, /* row 14 */
+ -1, /* row 15 */
+ -1, /* row 16 */
+ -1, /* row 17 */
+ -1, /* row 18 */
+ -1, /* row 19 */
+ -1, /* row 20 */
+ -1, /* row 21 */
+ -1, /* row 22 */
+ -1, /* row 23 */
+ -1, /* row 24 */
+ -1, /* row 25 */
+ -1, /* row 26 */
+ -1, /* row 27 */
+ -1, /* row 28 */
+ -1, /* row 29 */
+ -1, /* row 30 */
+ -1, /* row 31 */
+ -1, /* row 32 */
+ -1, /* row 33 */
+ -1, /* row 34 */
+ -1, /* row 35 */
+ -1, /* row 36 */
+ -1, /* row 37 */
+ -1, /* row 38 */
+ -1, /* row 39 */
+ -1, /* row 40 */
+ -1, /* row 41 */
+ -1, /* row 42 */
+ -1, /* row 43 */
+ -1, /* row 44 */
+ -1, /* row 45 */
+ -1, /* row 46 */
+ -1, /* row 47 */
+ -1, /* row 48 */
+ -1, /* row 49 */
+ -1, /* row 50 */
+ -1, /* row 51 */
+ -1, /* row 52 */
+ -1, /* row 53 */
+ -1, /* row 54 */
+ -1, /* row 55 */
+ -1, /* row 56 */
+ -1, /* row 57 */
+ -1, /* row 58 */
+ -1, /* row 59 */
+ -1, /* row 60 */
+ -1, /* row 61 */
+ -1, /* row 62 */
+ -1, /* row 63 */
+ -1, /* row 64 */
+ -1, /* row 65 */
+ -1, /* row 66 */
+ -1, /* row 67 */
+ -1, /* row 68 */
+ -1, /* row 69 */
+ -1, /* row 70 */
+ -1, /* row 71 */
+ -1, /* row 72 */
+ -1, /* row 73 */
+ -1, /* row 74 */
+ -1, /* row 75 */
+ -1, /* row 76 */
+ -1, /* row 77 */
+ -1, /* row 78 */
+ -1, /* row 79 */
+ -1, /* row 80 */
+ -1, /* row 81 */
+ -1, /* row 82 */
+ -1, /* row 83 */
+ -1, /* row 84 */
+ -1, /* row 85 */
+ -1, /* row 86 */
+ -1, /* row 87 */
+ -1, /* row 88 */
+ -1, /* row 89 */
+ -1, /* row 90 */
+ -1, /* row 91 */
+ -1, /* row 92 */
+ -1, /* row 93 */
+ -1, /* row 94 */
+ -1, /* row 95 */
+ -1, /* row 96 */
+ -1, /* row 97 */
+ -1, /* row 98 */
+ -1, /* row 99 */
+ -1, /* row 100 */
+ -1, /* row 101 */
+ -1, /* row 102 */
+ -1, /* row 103 */
+ -1, /* row 104 */
+ -1, /* row 105 */
+ -1, /* row 106 */
+ -1, /* row 107 */
+ -1, /* row 108 */
+ -1, /* row 109 */
+ -1, /* row 110 */
+ -1, /* row 111 */
+ -1, /* row 112 */
+ -1, /* row 113 */
+ -1, /* row 114 */
+ -1, /* row 115 */
+ -1, /* row 116 */
+ -1, /* row 117 */
+ -1, /* row 118 */
+ -1, /* row 119 */
+ -1, /* row 120 */
+ -1, /* row 121 */
+ -1, /* row 122 */
+ -1, /* row 123 */
+ -1, /* row 124 */
+ -1, /* row 125 */
+ -1, /* row 126 */
+ -1, /* row 127 */
+ -1, /* row 128 */
+ -1, /* row 129 */
+ -1, /* row 130 */
+ -1, /* row 131 */
+ -1, /* row 132 */
+ -1, /* row 133 */
+ -1, /* row 134 */
+ -1, /* row 135 */
+ 0, /* row 136; 148/216 bytes (68.5%) */
+ 108, /* row 137; 288/384 bytes (75.0%) */
+ 300, /* row 138; 294/384 bytes (76.6%) */
+ 492, /* row 139; 310/382 bytes (81.2%) */
+ 683, /* row 140; 234/316 bytes (74.1%) */
+ 841, /* row 141; 252/320 bytes (78.8%) */
+ 1001, /* row 142; 316/384 bytes (82.3%) */
+ 1193, /* row 143; 316/384 bytes (82.3%) */
+ 1385, /* row 144; 316/384 bytes (82.3%) */
+ 1577, /* row 145; 316/384 bytes (82.3%) */
+ 1769, /* row 146; 316/384 bytes (82.3%) */
+ 1961, /* row 147; 316/384 bytes (82.3%) */
+ 2153, /* row 148; 316/384 bytes (82.3%) */
+ 2345, /* row 149; 316/384 bytes (82.3%) */
+ 2537, /* row 150; 316/384 bytes (82.3%) */
+ 2729, /* row 151; 316/384 bytes (82.3%) */
+ 2921, /* row 152; 316/384 bytes (82.3%) */
+ 3113, /* row 153; 316/384 bytes (82.3%) */
+ 3305, /* row 154; 316/384 bytes (82.3%) */
+ 3497, /* row 155; 314/384 bytes (81.8%) */
+ 3689, /* row 156; 316/384 bytes (82.3%) */
+ 3881, /* row 157; 316/384 bytes (82.3%) */
+ 4073, /* row 158; 310/384 bytes (80.7%) */
+ 4265, /* row 159; 298/384 bytes (77.6%) */
+ 4457, /* row 160; 296/384 bytes (77.1%) */
+ -1, /* row 161 */
+ -1, /* row 162 */
+ -1, /* row 163 */
+ -1, /* row 164 */
+ -1, /* row 165 */
+ -1, /* row 166 */
+ -1, /* row 167 */
+ -1, /* row 168 */
+ -1, /* row 169 */
+ -1, /* row 170 */
+ -1, /* row 171 */
+ -1, /* row 172 */
+ -1, /* row 173 */
+ -1, /* row 174 */
+ -1, /* row 175 */
+ -1, /* row 176 */
+ -1, /* row 177 */
+ -1, /* row 178 */
+ -1, /* row 179 */
+ -1, /* row 180 */
+ -1, /* row 181 */
+ -1, /* row 182 */
+ -1, /* row 183 */
+ -1, /* row 184 */
+ -1, /* row 185 */
+ -1, /* row 186 */
+ -1, /* row 187 */
+ -1, /* row 188 */
+ -1, /* row 189 */
+ -1, /* row 190 */
+ -1, /* row 191 */
+ -1, /* row 192 */
+ -1, /* row 193 */
+ -1, /* row 194 */
+ -1, /* row 195 */
+ -1, /* row 196 */
+ -1, /* row 197 */
+ 4649, /* row 198; 190/190 bytes (100.0%) */
+ 4744, /* row 199; 316/384 bytes (82.3%) */
+ 4936, /* row 200; 230/384 bytes (59.9%) */
+ -1, /* row 201 */
+ -1, /* row 202 */
+ -1, /* row 203 */
+ -1, /* row 204 */
+ -1, /* row 205 */
+ -1, /* row 206 */
+ -1, /* row 207 */
+ -1, /* row 208 */
+ -1, /* row 209 */
+ -1, /* row 210 */
+ -1, /* row 211 */
+ -1, /* row 212 */
+ -1, /* row 213 */
+ -1, /* row 214 */
+ -1, /* row 215 */
+ -1, /* row 216 */
+ -1, /* row 217 */
+ -1, /* row 218 */
+ -1, /* row 219 */
+ -1, /* row 220 */
+ -1, /* row 221 */
+ -1, /* row 222 */
+ -1, /* row 223 */
+ -1, /* row 224 */
+ -1, /* row 225 */
+ -1, /* row 226 */
+ -1, /* row 227 */
+ -1, /* row 228 */
+ -1, /* row 229 */
+ -1, /* row 230 */
+ -1, /* row 231 */
+ -1, /* row 232 */
+ -1, /* row 233 */
+ -1, /* row 234 */
+ -1, /* row 235 */
+ -1, /* row 236 */
+ -1, /* row 237 */
+ -1, /* row 238 */
+ -1, /* row 239 */
+ -1, /* row 240 */
+ -1, /* row 241 */
+ -1, /* row 242 */
+ -1, /* row 243 */
+ -1, /* row 244 */
+ -1, /* row 245 */
+ -1, /* row 246 */
+ -1, /* row 247 */
+ -1, /* row 248 */
+ 5128, /* row 249; 84/84 bytes (100.0%) */
+ 5170, /* row 250; 316/384 bytes (82.3%) */
+ 5362, /* row 251; 316/384 bytes (82.3%) */
+ 5554, /* row 252; 316/384 bytes (82.3%) */
+ 5746, /* row 253; 316/384 bytes (82.3%) */
+ 5938, /* row 254; 316/384 bytes (82.3%) */
+ -1, /* row 255 */
+};
+
+static sal_uInt16 const aImplUnicodeToBig5Hkscs2001Data[] = {
+ /* plane 0, page 0 */
+ 168 | (252 << 8), /* first, last */
+ 0xC6D8, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8859,0x8857, 0, 0, 0, 0, 0, 0,
+ 0x885D,0x885B,0x8866, 0, 0, 0, 0, 0, 0, 0,
+ 0x8861,0x885F, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x886A,0x8868, 0, 0, 0, 0,
+ 0, 0,0x886F,0x886D,0x88A7, 0,0x8873,0x8871, 0, 0,
+ 0, 0,0x8877,0x8875, 0, 0, 0, 0,0xC8FB,0x887B,
+ 0x8879, 0,0x88A2,
+ /* plane 0, page 1 */
+ 0 | (220 << 8), /* first, last */
+ 0x8856,0x8867, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x885A,0x886C,
+ 0, 0, 0, 0, 0, 0,0x885C,0x886E, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8870, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xC8FC,0x885E,0x8874, 0, 0,
+ 0, 0, 0,0xC8FA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8878, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8858,0x8869, 0,0x8872,0x8860,
+ 0x8876, 0,0x887A, 0,0x887C, 0,0x887D, 0,0x887E, 0,
+ 0x88A1,
+ /* plane 0, page 2 */
+ 80 | (198 << 8), /* first, last */
+ 0xC8F6,0x886B, 0, 0,0xC8F8, 0, 0, 0, 0, 0,
+ 0,0xC8F7, 0, 0, 0, 0, 0,0x88A8, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xC8FE, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xC8F9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xC8F5, 0, 0, 0, 0, 0, 0,0xC8FD, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xC6D9,
+ /* plane 0, page 3: --- */
+ /* plane 0, page 4 */
+ 1 | (81 << 8), /* first, last */
+ 0xC7F9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xC7F3,0xC7F4,0xC7F5,0xC7F6,
+ 0xC7F7,0xC7F8,0xC7FA,0xC7FB,0xC7FC,0xC7FD,0xC7FE,0xC840,0xC841,0xC842,
+ 0xC843,0xC844,0xC845,0xC846,0xC847,0xC848,0xC849,0xC84A,0xC84B,0xC84C,
+ 0xC84D,0xC84E,0xC84F,0xC850,0xC851,0xC852,0xC853,0xC854,0xC855,0xC856,
+ 0xC857,0xC858,0xC859,0xC85A,0xC85C,0xC85D,0xC85E,0xC85F,0xC860,0xC861,
+ 0xC862,0xC863,0xC864,0xC865,0xC866,0xC867,0xC868,0xC869,0xC86A,0xC86B,
+ 0xC86C,0xC86D,0xC86E,0xC86F,0xC870,0xC871,0xC872,0xC873,0xC874,0xC875,
+ 0,0xC85B,
+ /* plane 0, page 5: --- */
+ /* plane 0, page 6: --- */
+ /* plane 0, page 7: --- */
+ /* plane 0, page 8: --- */
+ /* plane 0, page 9: --- */
+ /* plane 0, page 10: --- */
+ /* plane 0, page 11: --- */
+ /* plane 0, page 12: --- */
+ /* plane 0, page 13: --- */
+ /* plane 0, page 14: --- */
+ /* plane 0, page 15: --- */
+ /* plane 0, page 16: --- */
+ /* plane 0, page 17: --- */
+ /* plane 0, page 18: --- */
+ /* plane 0, page 19: --- */
+ /* plane 0, page 20: --- */
+ /* plane 0, page 21: --- */
+ /* plane 0, page 22: --- */
+ /* plane 0, page 23: --- */
+ /* plane 0, page 24: --- */
+ /* plane 0, page 25: --- */
+ /* plane 0, page 26: --- */
+ /* plane 0, page 27: --- */
+ /* plane 0, page 28: --- */
+ /* plane 0, page 29: --- */
+ /* plane 0, page 30 */
+ 190 | (193 << 8), /* first, last */
+ 0x8863,0x88A4,0x8865,0x88A6,
+ /* plane 0, page 31: --- */
+ /* plane 0, page 32: --- */
+ /* plane 0, page 33 */
+ 22 | (231 << 8), /* first, last */
+ 0xC8D2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xC8D3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xC6B5,0xC6B6,0xC6B7,0xC6B8,0xC6B9,0xC6BA,0xC6BB,0xC6BC,
+ 0xC6BD,0xC6BE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xC877,0xC878, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xC876,
+ /* plane 0, page 34: --- */
+ /* plane 0, page 35: --- */
+ /* plane 0, page 36 */
+ 96 | (125 << 8), /* first, last */
+ 0xC6A1,0xC6A2,0xC6A3,0xC6A4,
+ 0xC6A5,0xC6A6,0xC6A7,0xC6A8,0xC6A9,0xC6AA, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xC6AB,0xC6AC,0xC6AD,0xC6AE,
+ 0xC6AF,0xC6B0,0xC6B1,0xC6B2,0xC6B3,0xC6B4,
+ /* plane 0, page 37 */
+ 80 | (112 << 8), /* first, last */
+ 0xF9F9,0xF9F8,0xF9E6,0xF9EF,0xF9DD,0xF9E8,0xF9F1,0xF9DF,0xF9EC,0xF9F5,
+ 0xF9E3,0xF9EE,0xF9F7,0xF9E5,0xF9E9,0xF9F2,0xF9E0,0xF9EB,0xF9F4,0xF9E2,
+ 0xF9E7,0xF9F0,0xF9DE,0xF9ED,0xF9F6,0xF9E4,0xF9EA,0xF9F3,0xF9E1,0xF9FA,
+ 0xF9FB,0xF9FD,0xF9FC,
+ /* plane 0, page 38: --- */
+ /* plane 0, page 39 */
+ 61 | (61 << 8), /* first, last */
+ 0xC6E6,
+ /* plane 0, page 40: --- */
+ /* plane 0, page 41: --- */
+ /* plane 0, page 42: --- */
+ /* plane 0, page 43: --- */
+ /* plane 0, page 44: --- */
+ /* plane 0, page 45: --- */
+ /* plane 0, page 46 */
+ 128 | (227 << 8), /* first, last */
+ 0xC8D6, 0,
+ 0, 0,0xC8D7, 0,0xC8D8,0xC8D9,0xC8DA, 0,0xC8DB, 0,
+ 0xC8DC,0xC8DD, 0, 0, 0, 0, 0, 0, 0,0xC8DE,
+ 0, 0, 0, 0, 0, 0,0xC8DF,0xC8E0, 0, 0,
+ 0, 0, 0, 0, 0,0xC8E1, 0,0xC8E2, 0, 0,
+ 0xC8E3, 0,0xC8E4, 0,0xC8E5, 0, 0, 0, 0, 0,
+ 0, 0,0xC8E6, 0, 0, 0, 0, 0,0xC8E7, 0,
+ 0xC8E8, 0, 0, 0, 0, 0, 0, 0,0xC8E9, 0,
+ 0, 0,0xC8EA, 0,0xC8EB,0xC8EC, 0,0xC8ED, 0, 0,
+ 0, 0, 0, 0,0xC8EE,0xC8EF, 0, 0, 0, 0,
+ 0, 0,0xC8F0, 0, 0, 0, 0,0xC8F1,
+ /* plane 0, page 47 */
+ 51 | (51 << 8), /* first, last */
+ 0xC6CD,
+ /* plane 0, page 48 */
+ 5 | (254 << 8), /* first, last */
+ 0xC6E0,0xC6E1,0xC6E2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xC6E7,0xC6E8,0xC6E9,0xC6EA,0xC6EB,
+ 0xC6EC,0xC6ED,0xC6EE,0xC6EF,0xC6F0,0xC6F1,0xC6F2,0xC6F3,0xC6F4,0xC6F5,
+ 0xC6F6,0xC6F7,0xC6F8,0xC6F9,0xC6FA,0xC6FB,0xC6FC,0xC6FD,0xC6FE,0xC740,
+ 0xC741,0xC742,0xC743,0xC744,0xC745,0xC746,0xC747,0xC748,0xC749,0xC74A,
+ 0xC74B,0xC74C,0xC74D,0xC74E,0xC74F,0xC750,0xC751,0xC752,0xC753,0xC754,
+ 0xC755,0xC756,0xC757,0xC758,0xC759,0xC75A,0xC75B,0xC75C,0xC75D,0xC75E,
+ 0xC75F,0xC760,0xC761,0xC762,0xC763,0xC764,0xC765,0xC766,0xC767,0xC768,
+ 0xC769,0xC76A,0xC76B,0xC76C,0xC76D,0xC76E,0xC76F,0xC770,0xC771,0xC772,
+ 0xC773,0xC774,0xC775,0xC776,0xC777,0xC778,0xC779,0xC77A, 0, 0,
+ 0, 0, 0, 0, 0,0xC8D4,0xC8D5,0xC6DC,0xC6DD, 0,
+ 0,0xC77B,0xC77C,0xC77D,0xC77E,0xC7A1,0xC7A2,0xC7A3,0xC7A4,0xC7A5,
+ 0xC7A6,0xC7A7,0xC7A8,0xC7A9,0xC7AA,0xC7AB,0xC7AC,0xC7AD,0xC7AE,0xC7AF,
+ 0xC7B0,0xC7B1,0xC7B2,0xC7B3,0xC7B4,0xC7B5,0xC7B6,0xC7B7,0xC7B8,0xC7B9,
+ 0xC7BA,0xC7BB,0xC7BC,0xC7BD,0xC7BE,0xC7BF,0xC7C0,0xC7C1,0xC7C2,0xC7C3,
+ 0xC7C4,0xC7C5,0xC7C6,0xC7C7,0xC7C8,0xC7C9,0xC7CA,0xC7CB,0xC7CC,0xC7CD,
+ 0xC7CE,0xC7CF,0xC7D0,0xC7D1,0xC7D2,0xC7D3,0xC7D4,0xC7D5,0xC7D6,0xC7D7,
+ 0xC7D8,0xC7D9,0xC7DA,0xC7DB,0xC7DC,0xC7DD,0xC7DE,0xC7DF,0xC7E0,0xC7E1,
+ 0xC7E2,0xC7E3,0xC7E4,0xC7E5,0xC7E6,0xC7E7,0xC7E8,0xC7E9,0xC7EA,0xC7EB,
+ 0xC7EC,0xC7ED,0xC7EE,0xC7EF,0xC7F0,0xC7F1,0xC7F2, 0, 0, 0,
+ 0, 0,0xC6E3,0xC6DA,0xC6DB,
+ /* plane 0, page 49: --- */
+ /* plane 0, page 50 */
+ 49 | (49 << 8), /* first, last */
+ 0xC8D1,
+ /* plane 0, page 51: --- */
+ /* plane 0, page 52 */
+ 53 | (251 << 8), /* first, last */
+ 0x9277, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x96DF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x89D5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x93CD, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9BDF, 0, 0, 0, 0,
+ 0, 0,0xFA68, 0, 0,0x89DA,0x8F59, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x89DB, 0, 0,
+ 0x8F5D, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x89DC, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x96F7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8ADA, 0,
+ 0, 0, 0,0x8BDC, 0, 0, 0, 0, 0, 0,
+ 0x97DB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9E53, 0, 0, 0, 0,0x9DAA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9BEA,
+ /* plane 0, page 53 */
+ 6 | (254 << 8), /* first, last */
+ 0x8A6E, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8BC8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x89E8, 0,0x89EA, 0, 0, 0, 0, 0,0x8C4B,
+ 0, 0, 0, 0, 0, 0, 0,0xFB70, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x89ED,
+ 0, 0,0x94DD, 0,0x89EE, 0, 0, 0, 0,0x9EB4,
+ 0x8AD3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x92DB, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x94DB,0x89F9, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFB7A, 0, 0, 0,0x89FB, 0, 0, 0, 0,
+ 0, 0, 0,0x9EFC, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x89FC, 0,0x89BF, 0, 0, 0,0x89FE, 0,0x89E6,
+ 0, 0,0x9D46, 0, 0, 0,0x9DEE, 0, 0, 0,
+ 0xA07E, 0, 0, 0,0xA068, 0, 0, 0, 0,0x98E9,
+ 0,0x8B68, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8DFD,0x8BBE,0x9FD9, 0, 0, 0, 0, 0, 0,
+ 0,0x8AEB, 0, 0,0x9FD7,
+ /* plane 0, page 54 */
+ 9 | (245 << 8), /* first, last */
+ 0x8B6A,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9C5C, 0,0x8BB1, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFB5E, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9DF3, 0, 0, 0, 0,
+ 0, 0, 0,0xA0D0, 0, 0, 0,0xFC66, 0, 0,
+ 0, 0,0x92E9, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9AEC,0x8FAB,0xFA48, 0, 0, 0, 0,0x8E45, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9C6F, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9EDE, 0, 0, 0, 0, 0, 0,0x89EF,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x96E9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9EBB, 0, 0, 0, 0,
+ 0x94DE, 0,0x9EB8, 0, 0, 0,0x97BA,0xFB65, 0, 0,
+ 0,0x95D6, 0, 0, 0,0x9CBB, 0, 0,0x97DA, 0,
+ 0, 0, 0,0x8F45, 0,0xFB7D,0x9158,0xFE64, 0,0x9856,
+ 0x9B4D, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x935B,0x95C7, 0,0x97E7, 0, 0, 0, 0, 0,
+ 0,0x9359, 0, 0, 0,0x91F5,0x97B8, 0, 0,0xFDA2,
+ 0xFBB6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x92FA,
+ /* plane 0, page 55 */
+ 1 | (251 << 8), /* first, last */
+ 0x9357, 0,0x8BA6, 0, 0, 0, 0,0xFBB9, 0,
+ 0x97B0, 0, 0,0xFDC4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9CA1, 0,
+ 0, 0, 0, 0,0x91F2,0x91F9, 0,0x8FF1, 0, 0,
+ 0, 0, 0, 0,0x9745,0x9853, 0, 0,0xFE78, 0,
+ 0xFBC1,0x9251, 0, 0, 0, 0, 0, 0,0x9DAD, 0,
+ 0, 0, 0, 0,0xFD6C, 0, 0,0xFA6B, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9BC2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9A7B, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8B60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x934B, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9ABD, 0, 0, 0, 0,
+ 0x91B7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x95B4, 0, 0, 0, 0, 0,0xFEC5, 0,
+ 0,0x9EF0,
+ /* plane 0, page 56 */
+ 15 | (250 << 8), /* first, last */
+ 0x8D64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9269, 0, 0, 0, 0,
+ 0, 0,0x8D67, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFBEA, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFBEF, 0,0x8D68, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x93EB,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFC42, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9166, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFACD, 0, 0, 0, 0,0x93DD,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8BCC,
+ /* plane 0, page 57 */
+ 8 | (254 << 8), /* first, last */
+ 0x8D6D, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8D6E, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x96A8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFCA6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8D6F, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8D70, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFC64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9060, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8D74,0x97C3, 0,
+ 0, 0, 0, 0, 0, 0,0x8AD0, 0, 0, 0,
+ 0, 0, 0,0x9274, 0,0x9BBE, 0, 0, 0, 0,
+ 0,0x9CC8, 0, 0,0x9CBA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8D78, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9EB9, 0, 0, 0, 0, 0,0x955A, 0, 0,0x91B4,
+ 0, 0, 0, 0, 0, 0,0x8A48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8D7D, 0,
+ 0,0x8A7D, 0, 0,0x8AC2,
+ /* plane 0, page 58 */
+ 1 | (251 << 8), /* first, last */
+ 0xFD4A, 0,0x8DA1, 0, 0,0x8AD1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFCB4,0x8B47, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x93A4,0x9EDA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8A51, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8DA6, 0, 0, 0, 0,
+ 0, 0,0x9EC5, 0, 0, 0, 0,0xFCC4, 0, 0,
+ 0, 0,0xA078, 0,0x94B5, 0, 0, 0, 0, 0,
+ 0, 0,0xFCC2,0x8A6B, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8DAB, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFAE8, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8DAD,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFC49, 0,0x93C1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x906F, 0,0x8DB0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x947E,
+ /* plane 0, page 59 */
+ 14 | (244 << 8), /* first, last */
+ 0x90FA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9479, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8DB2, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFCEE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x997B, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8DB4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8DB7, 0,
+ 0, 0, 0, 0, 0, 0,0x91B3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8DBB,0x8DBA, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8DBC,0x9044, 0, 0, 0,0xFD4C, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x93E4, 0, 0,0x93E0, 0, 0, 0, 0, 0, 0,
+ 0,0xFD53, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8DC3, 0,
+ 0x9BB8, 0, 0, 0,0xFBF0, 0,0x93E9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x93F6, 0, 0, 0, 0,
+ 0,0x8DC5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8DCA, 0, 0, 0,
+ 0, 0,0x8DCC,0xFD5D,0x93B5,
+ /* plane 0, page 60 */
+ 13 | (239 << 8), /* first, last */
+ 0xFD61, 0, 0, 0,0x9CF8, 0, 0,
+ 0,0x9252, 0, 0,0xA0E8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CA5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8C56,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8DD6, 0,0x97C0, 0, 0, 0,0xA0DE,
+ 0, 0, 0, 0,0x97D2, 0, 0, 0, 0, 0,
+ 0xFAA5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFDA3, 0, 0, 0,0x8DDB,
+ /* plane 0, page 61 */
+ 19 | (253 << 8), /* first, last */
+ 0x8EAF,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x91B5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFD49, 0, 0, 0, 0, 0, 0, 0, 0,0xFDD1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8DEB, 0, 0, 0, 0, 0,0x97C6, 0,0xFDCE, 0,
+ 0,0x90FC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFC59, 0, 0,0x96D6, 0,
+ 0, 0, 0, 0, 0,0x97C5,0x8DEF, 0, 0, 0,
+ 0,0x97D7, 0, 0, 0, 0, 0,0x8DF0, 0, 0,
+ 0, 0, 0, 0, 0,0x96A6, 0, 0, 0, 0,
+ 0, 0, 0,0xFBBF, 0, 0, 0, 0,0x8DF3, 0,
+ 0, 0, 0,0x9449, 0,0x8DF5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9872, 0, 0, 0, 0,
+ 0, 0, 0,0x8E6B, 0, 0, 0, 0, 0, 0,
+ 0xFAFD, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8F50, 0, 0, 0, 0, 0, 0,0x9DCC,0xFC65,
+ 0,0x8C44, 0, 0,0x996E,0x94A1, 0, 0, 0, 0,
+ 0,0x8F63, 0, 0, 0, 0, 0, 0, 0,0xA0DA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9253,0xFDE9, 0, 0,0x9DB5, 0, 0, 0, 0,
+ 0, 0, 0,0x9879, 0, 0, 0,0x9D5D, 0, 0,
+ 0, 0,0x8D63,0x9669,
+ /* plane 0, page 62 */
+ 6 | (255 << 8), /* first, last */
+ 0x9F70, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFC6A, 0, 0,0x8AC7, 0, 0,
+ 0, 0,0x89D7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFE4D, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9EDD, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFEFB,0x98BC,
+ 0xFACC, 0, 0,0x95B0, 0, 0, 0,0x9464, 0, 0,
+ 0, 0, 0, 0,0x936F, 0, 0, 0, 0, 0,
+ 0,0x94B9, 0, 0,0x95EC, 0, 0, 0, 0,0x91EE,
+ 0, 0,0x98C3, 0,0x95F6, 0, 0, 0,0x8FFD,0x98C5,
+ 0, 0, 0, 0,0x9766,0xFE6E, 0, 0,0x97DD,0x8CAA,
+ 0, 0,0x92D2, 0, 0,0x9761,0x98CB, 0, 0, 0,
+ 0,0x95F0, 0,0x975D, 0,0x91E3, 0, 0, 0, 0,
+ 0x98CC, 0, 0,0x9469,0x98CD, 0, 0, 0, 0, 0,
+ 0x98CE, 0,0x95FC, 0, 0,0x94A3,
+ /* plane 0, page 63 */
+ 0 | (250 << 8), /* first, last */
+ 0x9662, 0, 0, 0,0xFEB6, 0,0x9463, 0, 0, 0,
+ 0, 0, 0, 0,0x98D0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x98D1, 0, 0, 0, 0,0x9475,0xFAE0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9472,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x98D6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8AF0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x98D9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x98DB, 0, 0, 0, 0,
+ 0x98DD, 0, 0, 0, 0, 0, 0, 0, 0,0x98A8,
+ 0, 0, 0, 0, 0, 0, 0,0x8A6D, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8AFB,
+ 0x8AAE,
+ /* plane 0, page 64 */
+ 4 | (250 << 8), /* first, last */
+ 0xFBC9, 0, 0, 0, 0,0x8C5D,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x98E4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x98E6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x98E8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8A4D, 0, 0, 0,0x9257, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x95DF, 0,
+ 0,0xA0AC, 0, 0, 0, 0,0x98EB, 0, 0, 0,
+ 0,0x98EC, 0,0x8CC3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x98F4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8AB8, 0, 0,
+ 0,0x9EE7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x94BC, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFCD1, 0, 0, 0,
+ 0, 0, 0,0x9CC6, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9E7E,
+ /* plane 0, page 65 */
+ 3 | (249 << 8), /* first, last */
+ 0x98FE,0xFDE8, 0, 0, 0, 0,0x9940,
+ 0, 0, 0, 0,0x94C9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x94D3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9946, 0, 0, 0, 0,0x90C0, 0,
+ 0x94D1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9573, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x93C2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9948, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x994B, 0, 0, 0,
+ 0, 0,0x8E55, 0, 0, 0, 0,0x994E, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8EFE,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8E59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x94EC,
+ /* plane 0, page 66 */
+ 17 | (252 << 8), /* first, last */
+ 0x94EF, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8C60, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8F74, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9955, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9544, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8CCB, 0,
+ 0, 0,0x9956, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9959, 0, 0, 0, 0, 0, 0, 0,0x995B, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8CC4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFA45, 0, 0, 0,0x90B7, 0, 0,0x9743, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x95CD, 0, 0, 0, 0, 0,
+ 0,0x97C9,0xFD50,
+ /* plane 0, page 67 */
+ 43 | (242 << 8), /* first, last */
+ 0x8EB9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x95C6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9967, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8AB9, 0, 0, 0,
+ 0, 0, 0,0x8DFC, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8A76, 0, 0,
+ 0, 0, 0,0x9D51, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9973, 0, 0,
+ 0, 0,0x9D4F,
+ /* plane 0, page 68 */
+ 1 | (244 << 8), /* first, last */
+ 0x997A,0x9564, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x99A1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x99A5, 0, 0,
+ 0, 0, 0, 0, 0,0x99A7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8EED, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x99AD, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x946E,
+ 0x8F70, 0,0xFAD0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x99B3, 0, 0, 0,
+ 0, 0, 0,0xA053, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x965C, 0, 0, 0, 0,0xFD7A, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x97FE, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x92BD, 0,0x97FD, 0, 0, 0, 0,0x8F64, 0,
+ 0, 0, 0,0xFCF7,0x9562,0x97CD,0x9E64, 0, 0, 0,
+ 0, 0, 0, 0,0x924C,
+ /* plane 0, page 69 */
+ 3 | (233 << 8), /* first, last */
+ 0x8EC9,0x99BC, 0, 0, 0, 0,0x9DA5,
+ 0,0x8F54, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8F7C, 0, 0, 0, 0, 0, 0,0x8EA2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8F7A,
+ 0, 0, 0, 0, 0, 0,0x97AE, 0, 0, 0,
+ 0,0x96C8, 0, 0, 0, 0, 0, 0, 0,0x99C3,
+ 0,0x90D6, 0,0x9CBE, 0, 0, 0,0x8F76, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9470,0xFB4B, 0, 0,0xFDCA, 0, 0, 0, 0,
+ 0, 0,0x8EC7, 0, 0, 0, 0, 0,0xA0F9, 0,
+ 0, 0, 0, 0, 0, 0,0x8FA9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x99C7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x90D7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9EDF,
+ /* plane 0, page 70 */
+ 6 | (245 << 8), /* first, last */
+ 0x99CE, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8FBA, 0, 0, 0, 0,
+ 0,0x8FEB, 0,0x99CF, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8FC2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x92C9, 0, 0, 0, 0, 0,0x97DC, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x95B3,0x9C79, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x95B2,
+ /* plane 0, page 71 */
+ 19 | (244 << 8), /* first, last */
+ 0x8FDB,
+ 0, 0, 0, 0,0x9BE3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9E7A, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BEE, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x99DE, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFAFA, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9EE5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8A52, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x99E1, 0, 0,
+ 0, 0, 0, 0,0x8A67,
+ /* plane 0, page 72 */
+ 0 | (250 << 8), /* first, last */
+ 0x8BB5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8AAC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x99E9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFBCA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x97DE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x95D1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x99F5,0xFC4A, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9BA9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFBDC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFE56, 0, 0,
+ 0, 0, 0,0x9EA4, 0, 0, 0, 0, 0, 0,
+ 0x9D49,
+ /* plane 0, page 73 */
+ 6 | (231 << 8), /* first, last */
+ 0x95DB, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x89C5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x99F8, 0, 0, 0, 0, 0, 0,0x9664, 0, 0,
+ 0, 0,0x9055, 0, 0,0x96D4, 0, 0, 0, 0,
+ 0, 0, 0,0x977C, 0, 0, 0, 0, 0, 0,
+ 0x964D, 0,0x97E1, 0, 0, 0, 0, 0, 0,0x9A48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9A49, 0,0xFE7D, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x90AA, 0, 0, 0, 0,0x9A50, 0, 0, 0,
+ 0, 0, 0, 0,0x9347, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8ED8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x90C9, 0, 0, 0, 0, 0,0x9A55, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x90BC, 0, 0, 0, 0, 0,0x9A58,
+ 0,0x8BB8,
+ /* plane 0, page 74 */
+ 15 | (255 << 8), /* first, last */
+ 0x90D5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9641,
+ 0, 0, 0, 0, 0, 0,0x9A5A, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9A5C, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x97C2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8ABB, 0, 0, 0,0x9BAA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x90F5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9A60, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9145,
+ /* plane 0, page 75 */
+ 16 | (192 << 8), /* first, last */
+ 0x8C58, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9A63, 0, 0, 0, 0,
+ 0, 0,0x8C49, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8BB6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFCCF, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x966B,0x9A6E, 0,0x914F, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9746, 0, 0,0xA0E6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x92D7, 0,0x9675, 0, 0,0x93D4, 0, 0,
+ 0x91BB,0x9679, 0, 0, 0, 0, 0,0x9A70, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9678,
+ 0x91CD, 0,0x9C4A,
+ /* plane 0, page 76 */
+ 4 | (237 << 8), /* first, last */
+ 0xA06F, 0, 0,0xA06A, 0, 0,
+ 0, 0, 0, 0,0x915F, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9FA5,
+ 0, 0,0x89BA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9ECD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9A79,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9DCE, 0, 0, 0,0x8CD2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9D73, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x96B9, 0,0x96BC, 0, 0, 0,
+ 0, 0, 0,0x9CD1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x89B7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9EEE, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFB43,
+ /* plane 0, page 77 */
+ 9 | (156 << 8), /* first, last */
+ 0x9EC9,
+ 0, 0, 0, 0, 0, 0,0xFBD3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x91AE, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9D78, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9D7B,
+ /* plane 0, page 78 */
+ 4 | (248 << 8), /* first, last */
+ 0x9EB3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9EB2, 0,0x9DD6, 0,
+ 0, 0, 0,0x994F, 0, 0,0x89CE, 0, 0, 0,
+ 0x8BC0, 0,0x9FC4, 0,0x8BD4, 0, 0,0x8C72, 0, 0,
+ 0, 0, 0, 0,0xC6BF,0x8BF9, 0, 0, 0, 0,
+ 0,0x8946, 0,0xC6C0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFAE5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xC87B,0x8BC6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9C57, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9AFB, 0, 0, 0, 0, 0, 0, 0,0x89D0,0x89CF,
+ 0, 0, 0,0xC6C1, 0,0x89D1, 0,0x89E2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x927E, 0,0x9DBA, 0, 0, 0, 0, 0,
+ 0xC6C2, 0, 0,0x8C6F, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFBF8, 0, 0, 0,0x8BC7,0x926B, 0,
+ 0,0x89D2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9FCF, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9DA9,0x89D3, 0, 0,0x99E2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9267,
+ /* plane 0, page 79 */
+ 3 | (253 << 8), /* first, last */
+ 0x92A4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8C73, 0, 0,0x894E, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x894F,0x9278, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x91B6, 0, 0, 0, 0,0x89D4, 0,0x9FD2, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x92A7, 0, 0,0x95A2,
+ 0, 0, 0, 0, 0,0x926E, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x96EA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x926F, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x92A3, 0, 0, 0, 0, 0,0x8950, 0,
+ 0,0xFA57, 0, 0, 0, 0,0x9866, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x89D6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x98B2, 0, 0, 0,0x92AB, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x96DE,0x92AC,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8C70, 0,0x9F6E, 0, 0, 0, 0, 0, 0,0x8EF2,
+ 0, 0, 0,0x9F6C,
+ /* plane 0, page 80 */
+ 3 | (252 << 8), /* first, last */
+ 0x89D8, 0, 0, 0, 0,0xFA59, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x92A8, 0, 0, 0,
+ 0, 0,0x9163, 0, 0, 0, 0, 0, 0,0x8C40,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9F73, 0,0x92AD, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9BE9, 0, 0, 0, 0, 0,0x92A9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x92AA,
+ 0, 0, 0, 0, 0, 0,0x89D9, 0, 0, 0,
+ 0, 0, 0, 0,0xFD56, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9FA8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8C71, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x92A1, 0, 0,0x90E3, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xA0A6, 0, 0,
+ 0, 0, 0,0x94AB, 0,0xFC72, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x97C4, 0, 0, 0, 0, 0,
+ 0, 0,0x92AE,
+ /* plane 0, page 81 */
+ 1 | (254 << 8), /* first, last */
+ 0xFA67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x92A2,0xFA69, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9268, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8951, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFA6F, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFA71, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8952, 0, 0, 0,
+ 0,0x945A, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xC6C3, 0, 0, 0,0x89DD, 0,0xC8A2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xC6C4, 0, 0, 0,0x9E52, 0,0x8953, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9E55,0x92BA, 0,
+ 0,0xC6C5, 0, 0,0x8C5B, 0, 0, 0,0xFA7D,0xFAA8,
+ 0x9A68,0xFA47, 0, 0,0xFA7E, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x92BB, 0, 0, 0,0xFDB6,
+ 0,0xFAA2, 0, 0, 0, 0, 0,0xFAA3, 0,0xFAA4,
+ 0x9BB4,0xFAA6, 0, 0, 0, 0, 0, 0, 0,0x89DF,
+ 0, 0, 0,0xFDDB, 0, 0,0xFAA9, 0,0x8954, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFAAB, 0, 0,
+ 0, 0, 0, 0,0xFC7A, 0, 0, 0, 0, 0,
+ 0, 0,0x89E0, 0,0x9F4F,
+ /* plane 0, page 82 */
+ 2 | (249 << 8), /* first, last */
+ 0xC87D, 0, 0,0x89E1, 0, 0, 0, 0,
+ 0,0xFAB0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9FCD,0xA0E7, 0, 0, 0, 0, 0,0xFAB1,0x89A6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9EFA, 0, 0, 0, 0, 0, 0, 0,
+ 0xFAB2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFAB4, 0,0x92C4,
+ 0, 0, 0, 0, 0, 0,0x9F6F, 0, 0, 0,
+ 0, 0, 0, 0,0x8BB0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9FAC, 0, 0, 0, 0,
+ 0,0x89E3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9BD3,0x89E4, 0, 0, 0,0xFAB5, 0,
+ 0, 0, 0, 0,0x9FD5, 0, 0, 0, 0, 0,
+ 0,0x8955, 0, 0,0x92C5, 0, 0, 0,0x8956, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFAB3, 0, 0, 0,0xFAB6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFAB7, 0, 0,
+ 0, 0, 0, 0,0x9EDC, 0, 0, 0,0xFBC4,0x9F71,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFABA,0x92C7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xC6C6,
+ /* plane 0, page 83 */
+ 1 | (254 << 8), /* first, last */
+ 0x9A4C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8C68, 0, 0,0x89E5,
+ 0, 0, 0, 0,0x9F7D, 0, 0, 0, 0, 0,
+ 0xA0A9,0xFAC4, 0, 0, 0, 0,0xC6C7, 0, 0,0x8957,
+ 0, 0, 0, 0, 0, 0,0xFAAA, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8958, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8BE3, 0,0x8B61, 0, 0, 0, 0,
+ 0x9AF1, 0, 0,0x9EB7, 0,0xC6C8, 0, 0, 0,0xFAD1,
+ 0, 0, 0, 0, 0, 0,0xFAD2, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9EBA,0xFAD4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFAD9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFADB, 0,0x9CE0, 0, 0, 0,0xFBF7, 0,0xFBFA,0x89E7,
+ 0xA07A,0xFADC, 0, 0,0xFADD, 0,0x89E9, 0, 0, 0,
+ 0, 0,0xC6C9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFAE2,0x89EB, 0, 0,0xFAE3, 0, 0,
+ 0, 0, 0, 0,0x90C8, 0, 0, 0,0x92DA,0x8959,
+ 0x9CF5, 0, 0, 0, 0, 0,0x895A,0xFAE7,0x9FA2, 0,
+ 0, 0, 0, 0,0xFAEA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFAED,0x8FAD, 0, 0,
+ 0, 0, 0, 0,0xFB59,
+ /* plane 0, page 84 */
+ 19 | (239 << 8), /* first, last */
+ 0xFAEF,
+ 0x96EF, 0,0x9DEC, 0, 0, 0,0x9DCA, 0, 0, 0,
+ 0, 0, 0,0xFD6D, 0,0x89EC, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFB44, 0, 0,
+ 0x9DE2, 0,0x8C75, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9EC0, 0,0x9E56, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9F79,0x9AC7, 0, 0,0xFAF4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x98A1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFAF8, 0, 0, 0,0x89F0,0x9E47, 0,
+ 0,0x9DF7, 0, 0, 0, 0,0x9FD3, 0,0x9ACA, 0,
+ 0, 0, 0,0x89F1,0xFAF9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8E5A, 0,
+ 0x89F2, 0, 0, 0, 0,0x89F3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x925D,0x8B51,0x92E0, 0, 0,0x89F4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9FD4, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8A79, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x89F5,
+ /* plane 0, page 85 */
+ 2 | (251 << 8), /* first, last */
+ 0x97A7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x93BA, 0, 0, 0, 0, 0,0x9E58,
+ 0, 0, 0, 0,0x89F6, 0, 0, 0, 0, 0,
+ 0x9E57, 0, 0, 0, 0,0x89F7, 0,0x8A41, 0, 0,
+ 0x89F8, 0, 0,0xFAF1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x89FA, 0, 0, 0, 0, 0, 0,
+ 0,0xFB42, 0,0xFABF, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFBA3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFAF7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9E4E, 0,0x94DC, 0, 0,
+ 0, 0, 0,0x95DA,0x9DF8,0x9F6A, 0, 0, 0, 0,
+ 0,0x8AB7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFB46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8A46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFB47,
+ 0, 0, 0, 0, 0, 0,0x9148, 0, 0, 0,
+ 0x92DE, 0, 0, 0, 0,0x8B53,0x9DF6, 0,0x9BDA, 0,
+ 0, 0, 0,0x9D7E, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x89FD,0x99E4, 0, 0, 0,
+ 0, 0,0x9E43, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9DE9, 0,0x8F52, 0, 0, 0,
+ 0x9DF5,0x9DF0, 0, 0, 0,0x99E7, 0, 0, 0, 0,
+ 0,0x8BBD,
+ /* plane 0, page 86 */
+ 5 | (253 << 8), /* first, last */
+ 0x9DEF, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9FB7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9DD0, 0,0x9FEB,0x8DA9,0x9DCF,0x98E1, 0,0x9DE5, 0, 0,
+ 0, 0, 0, 0, 0,0x9DC8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFB4F, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9DEB, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFB54, 0,0xFB55,
+ 0x9AA2, 0,0x8AD6, 0,0x9A5F, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9EF5, 0, 0, 0,0x8FB7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9AD2,0x9E6A,0x9EE8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8BBF,0x91C2,0x9D62,
+ 0, 0, 0, 0, 0, 0,0x9260, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x925E,0x91C1,
+ 0,0x8AC5, 0, 0,0x97A3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8B6C, 0,0x8D7E, 0, 0,
+ 0, 0, 0, 0, 0,0x9C54, 0, 0, 0, 0,
+ 0,0x9DBD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CC5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x895B, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFB5C, 0,0xFB5B,
+ 0,0xFB57, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x98C7,
+ /* plane 0, page 87 */
+ 0 | (254 << 8), /* first, last */
+ 0xFB5A, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9CEE, 0, 0, 0, 0, 0, 0, 0,0x92E2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x94A7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8CCC, 0,0x9BD4, 0, 0,0xFB64,0xFB76, 0, 0,
+ 0xFB60, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x99E5, 0, 0,0x9AC2, 0, 0,
+ 0,0x91FB, 0, 0, 0,0xA073, 0, 0, 0, 0,
+ 0, 0, 0,0x9F72, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9FCC, 0, 0, 0,0x98A5,0x92E8, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9BBC, 0,0x96F3, 0,
+ 0,0x92E7, 0, 0,0xFC67, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8B7D, 0, 0, 0,
+ 0,0x9BF4, 0, 0, 0, 0, 0,0x9EF7, 0, 0,
+ 0x9EC1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x996F, 0, 0, 0, 0, 0, 0,0x96F1, 0, 0,
+ 0x8E41, 0, 0, 0, 0, 0,0x954A, 0, 0, 0,
+ 0x97E6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x96F5, 0, 0, 0, 0,
+ 0,0x92E6,0x9F42, 0, 0, 0, 0, 0, 0, 0,
+ 0xFB67, 0, 0, 0, 0, 0, 0, 0, 0,0x99A9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFAE6,
+ /* plane 0, page 88 */
+ 3 | (251 << 8), /* first, last */
+ 0xFB69, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x97E5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x967D, 0, 0, 0,0xFB6C, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x99A2, 0,
+ 0, 0, 0, 0,0x9ABB, 0, 0, 0,0x9A65, 0,
+ 0,0x944E, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFB6E, 0, 0,0x99DF, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x98E3, 0, 0,0x9254, 0,
+ 0, 0, 0, 0,0x967B,0x8AAF, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8C77, 0, 0, 0,
+ 0, 0, 0,0x8BAF,0x9EBD, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9EE6, 0, 0,
+ 0xFB6F, 0, 0, 0, 0, 0,0x8EE1, 0, 0, 0,
+ 0,0x9B7D,0x9C7E, 0, 0, 0, 0,0xF9D9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x92EA, 0, 0, 0, 0,0x8C78, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFB72, 0, 0, 0,0xFB71, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x895C, 0,0x98F0,0x96F2, 0, 0, 0, 0, 0, 0,
+ 0,0xFB74,
+ /* plane 0, page 89 */
+ 2 | (249 << 8), /* first, last */
+ 0x8BC1, 0,0x895D,0x89DE, 0,0x895E, 0, 0,
+ 0xC6CA, 0, 0, 0, 0, 0, 0,0xFE42, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFB7B, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x895F, 0,0x8960, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9BCD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9DD3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x984C, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9752, 0,
+ 0, 0, 0, 0,0x95C3, 0, 0, 0, 0,0x9BB6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9AB9, 0, 0, 0,0x97B3, 0, 0, 0,
+ 0, 0, 0,0x9F74,0x92F1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x97DF, 0, 0, 0,
+ 0,0xFBA6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFBAB, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9877, 0, 0, 0,0x9854,
+ 0x95C5, 0, 0, 0, 0, 0, 0, 0,0x9D55,0xFBB2,
+ /* plane 0, page 90 */
+ 2 | (254 << 8), /* first, last */
+ 0x957E, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9742, 0,0x94E6, 0, 0, 0, 0,0x92F5, 0,
+ 0, 0, 0, 0, 0, 0,0x8CC5, 0, 0, 0,
+ 0, 0, 0,0x92FD, 0, 0,0xFBA2, 0, 0,0x9C51,
+ 0, 0,0x94E9,0x985C,0x92F0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x944C, 0, 0, 0, 0, 0, 0, 0,0x916B,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8B78, 0, 0, 0, 0,0x94E2,
+ 0, 0, 0, 0, 0, 0, 0,0x984F, 0,0xFBB5,
+ 0, 0, 0, 0,0x9271, 0, 0,0x9365, 0, 0,
+ 0x985B, 0, 0,0x9850, 0, 0, 0, 0, 0, 0,
+ 0,0x97BC, 0, 0, 0, 0,0x92F3, 0, 0,0x9340,
+ 0x984D, 0, 0, 0,0x9572, 0,0xFDEF, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFDC1, 0, 0, 0, 0,
+ 0xFBBA, 0, 0,0x92EB, 0, 0, 0, 0, 0, 0,
+ 0xFC73,0x97B7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFBB4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x90A7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9741,0x92F4, 0, 0,
+ 0,0xFBBC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9577, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9EE2, 0,0x8F78, 0, 0, 0, 0, 0, 0, 0,
+ 0xF9DC, 0, 0, 0,0x9672,
+ /* plane 0, page 91 */
+ 13 | (255 << 8), /* first, last */
+ 0x9EB5, 0, 0, 0,0x964B, 0, 0,
+ 0,0x8CAC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xA0FA, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9575, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x90DA, 0, 0,0x9367, 0,
+ 0xFEA4, 0, 0, 0,0x90DF, 0, 0, 0, 0,0x9354,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8961, 0,0x8BB4, 0, 0, 0, 0,0x9DC0,
+ 0, 0, 0, 0, 0, 0,0x8E48, 0,0xFBC5, 0,
+ 0, 0, 0, 0,0xFBC7, 0, 0, 0,0xC6CB, 0,
+ 0xFA79, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9E67, 0, 0, 0, 0, 0,
+ 0x8CD9, 0, 0, 0, 0, 0, 0,0xFBD2,0x8962,0x8963,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFC7D, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9F6B, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFBCC, 0,0xFEAE, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFBD1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFB75,
+ /* plane 0, page 92 */
+ 5 | (245 << 8), /* first, last */
+ 0xFBD4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFBD6,
+ 0xFBD8, 0, 0, 0, 0, 0, 0, 0,0x8B5D, 0,
+ 0x934C, 0,0x9AE2, 0, 0,0x8BC9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFBDB,0x9FC9, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9F44, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x98ED, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFBDD, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8DF2,0x8964, 0,0xFDF2, 0,0x934D, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFBE7, 0, 0, 0,
+ 0, 0, 0,0xA0F2,0x9868, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9F58,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8D73,
+ 0, 0, 0,0xFBDE, 0, 0, 0, 0, 0,0xFBDF,
+ 0, 0, 0, 0, 0,0x8C48,
+ /* plane 0, page 93 */
+ 16 | (245 << 8), /* first, last */
+ 0xFBE3, 0, 0, 0,
+ 0,0x8DA8, 0, 0,0xFBE4, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9C75, 0, 0,0x9878, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8D60, 0, 0, 0, 0, 0, 0, 0,
+ 0xFBE5, 0,0x8D61, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8D62,0xA0A1, 0, 0,
+ 0,0x9C40, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x98AD, 0, 0, 0,0x9EEA, 0, 0, 0,
+ 0, 0, 0,0x8CD4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9CEB, 0, 0, 0, 0, 0,0xFBE0,
+ 0, 0,0x9F51, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8D65, 0, 0, 0, 0, 0,
+ 0,0x9CF1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFC58, 0, 0,0x8D66, 0, 0, 0, 0,
+ 0, 0, 0,0x9654, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFBE8, 0, 0, 0,0xC6CC,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9FCE,
+ /* plane 0, page 94 */
+ 9 | (252 << 8), /* first, last */
+ 0xFBFC,
+ 0,0x9AE4, 0, 0, 0, 0, 0, 0,0x9F75, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFBF1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8D69, 0, 0, 0,
+ 0, 0,0x934F, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x934E, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFBF4, 0, 0, 0, 0,0xC6CE, 0, 0,
+ 0,0xFBC3, 0, 0,0x8965, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8C7A, 0, 0, 0,
+ 0, 0, 0,0x8C7B, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8D6A,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9353, 0, 0,0x9DFB, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFBFD, 0, 0, 0,0x9059,0xFC40,
+ 0,0xFC41,0xFC43,
+ /* plane 0, page 95 */
+ 12 | (223 << 8), /* first, last */
+ 0x9361,0xFC46,0x9362, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8D6B, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFC4C, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x95B8, 0, 0,
+ 0xC6D0,0x8BCA, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x987A, 0, 0, 0, 0,0xC6D1, 0,0xFC51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFC54, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFAAF, 0, 0, 0, 0, 0, 0,
+ 0,0x8D6C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFA61, 0, 0,0xFC57, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9B70, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xA051, 0, 0, 0,
+ 0, 0, 0, 0,0x8C7C, 0,0x8BCB, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x936E,
+ 0, 0, 0,0xFCD5,
+ /* plane 0, page 96 */
+ 35 | (253 << 8), /* first, last */
+ 0xFCA9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFC61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8966,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFACB, 0, 0, 0, 0, 0,
+ 0, 0,0xF9DA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x937A, 0,0xA0E0,
+ 0, 0, 0, 0, 0, 0,0x936B, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFC6B, 0,
+ 0, 0, 0, 0,0xA0DC, 0, 0,0x9468, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFC6D,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8D71, 0, 0, 0, 0,
+ 0, 0,0xFD64, 0, 0, 0, 0,0x99BA, 0, 0,
+ 0,0x9AD0,0x9A61,0xA0E5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA05B,
+ /* plane 0, page 97 */
+ 7 | (226 << 8), /* first, last */
+ 0x96AC, 0, 0,
+ 0, 0,0x9740, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9EF1, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8C4D, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9F7E, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8D72, 0, 0, 0, 0,0xFC76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x96A9, 0, 0, 0, 0, 0, 0, 0, 0,0xA06E,
+ 0, 0,0xFCAA, 0, 0, 0,0xFBCD, 0, 0, 0,
+ 0xFC74, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xA074, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xA071, 0, 0, 0,0xFC79,
+ 0, 0, 0, 0, 0,0xFC7C, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9C50,
+ 0, 0,0x9379,0x9378, 0, 0,0xA0DD, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8D75, 0,0x8D76, 0, 0, 0, 0,
+ 0, 0,0x9374, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8D77,0xFCA5, 0,
+ 0,0xFCA2, 0, 0, 0, 0, 0, 0,0x90C3, 0,
+ 0, 0, 0, 0, 0, 0,0xA079,
+ /* plane 0, page 98 */
+ 44 | (229 << 8), /* first, last */
+ 0x8D79, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8BFC, 0,0xA076, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8BCD, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9F5A, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9FF4, 0, 0,0x9FBA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8D7A, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9E45, 0, 0,
+ 0, 0, 0, 0,0x93B0, 0,0xA075, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9B46, 0,0xFCAE, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFCB0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFA51, 0, 0, 0, 0, 0,0x8D7B,
+ /* plane 0, page 99 */
+ 24 | (254 << 8), /* first, last */
+ 0x8D7C, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9ED6, 0, 0,0x93AC,
+ 0, 0, 0,0x9F5B, 0,0x93A9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xA07C, 0, 0, 0, 0, 0, 0, 0,0xFCB2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8AC1, 0, 0, 0, 0, 0,0x9FB4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFCAC,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9E4C, 0, 0, 0, 0,
+ 0, 0, 0,0x8FC5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x93AD,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9DC3, 0, 0, 0,0x8DA2, 0, 0, 0,
+ 0x9D4A, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFCB6, 0,
+ 0,0x8DA3,0x9E4B, 0,0x9E4D,
+ /* plane 0, page 100 */
+ 7 | (234 << 8), /* first, last */
+ 0x8DA4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8AFD, 0, 0, 0, 0, 0,0xFCB5, 0,0xFCC3,0x93B2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8DA5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x93A1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8AC6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8A5B, 0, 0, 0,0x894D, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFED4, 0, 0, 0, 0,
+ 0x8A78, 0,0x93AB, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8DA7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9F45, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8A56, 0, 0, 0,0xFCBF, 0, 0, 0,0xFCC0,
+ 0,0x8EE6, 0, 0,0x8AA4,
+ /* plane 0, page 101 */
+ 10 | (255 << 8), /* first, last */
+ 0x8943, 0, 0, 0, 0, 0, 0,0x93F3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFCAB,0x9EA2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9DC7, 0,
+ 0, 0,0xC6D2,0x8BCE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFCC5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFCCB, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x93B3, 0,0xFCCA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFCC9,0x8DAC, 0,0xFBC6,0x8967, 0,0x8C7E,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFCCD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9CF3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFCD0,
+ 0, 0,0x95BB, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFCD3, 0, 0,0xFCD4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8DAE,
+ /* plane 0, page 102 */
+ 24 | (241 << 8), /* first, last */
+ 0xFCD7, 0, 0, 0, 0, 0,
+ 0x93DB, 0, 0, 0, 0,0xFE63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x93D5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFCDA, 0,
+ 0, 0,0x9B71, 0, 0,0xFCDD, 0, 0, 0, 0,
+ 0, 0, 0,0x8DAF, 0, 0, 0,0xFAF2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x93D8,
+ 0, 0, 0,0xFCDF, 0, 0, 0,0x93D3, 0, 0,
+ 0, 0, 0, 0, 0,0xFCE1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8E76, 0, 0, 0, 0,
+ 0, 0, 0,0xFC62, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x93D1, 0, 0, 0,0x8DB1, 0, 0, 0,
+ 0, 0, 0, 0,0x9859, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFB52, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFB53, 0, 0, 0, 0, 0,0xFB4D,
+ 0, 0,0x9CBF, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9B72, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFB50,0x93BE, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9DF1,
+ /* plane 0, page 103 */
+ 2 | (254 << 8), /* first, last */
+ 0xFCEB, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xA0BB, 0,0x9B7E, 0, 0, 0, 0, 0,
+ 0, 0,0x8DB3, 0, 0,0x8C52, 0, 0, 0, 0,
+ 0x9AE8, 0, 0, 0, 0, 0, 0,0x8EDC, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CF9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFA50, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x98E7,0xFCF3, 0,
+ 0, 0, 0,0xFCF2, 0, 0, 0,0x8CCA, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x93E5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9A59, 0, 0, 0,0x8DB5, 0, 0, 0, 0, 0,
+ 0, 0,0xFD4D, 0, 0, 0, 0,0xFD5E, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8F7D, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9547,0xFCF6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9250,
+ 0, 0, 0, 0,0x8968,
+ /* plane 0, page 104 */
+ 0 | (202 << 8), /* first, last */
+ 0x8DB6,0xFCFB,0xA07D,0x98FC,0x8969, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFE4F, 0, 0,0x9256, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFAC9, 0, 0,
+ 0x93E8, 0, 0, 0,0xFCF8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CE3,0xFDA9, 0, 0, 0, 0,
+ 0, 0,0xFC44, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9640, 0, 0,0x8DB8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9B4A,0x8FB9, 0, 0, 0,
+ 0, 0, 0,0xFCFE, 0, 0, 0, 0, 0, 0,
+ 0,0x896A, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8DB9, 0, 0, 0,0x917E, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x93F4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFB7C, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x93E7, 0, 0,0x97EF, 0, 0, 0,0xFE4A,
+ 0, 0, 0, 0, 0,0xFD45, 0,0x96A5, 0, 0,
+ 0, 0,0xFEE0,
+ /* plane 0, page 105 */
+ 0 | (250 << 8), /* first, last */
+ 0xFD48,0xFD47,0xFEF2,0xFE6A, 0, 0, 0, 0, 0,0x8DBD,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BA1,0x8CA2,0x9AB7,0x8EFC, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9FA1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFD51, 0, 0, 0, 0, 0,
+ 0, 0,0xFAAD, 0, 0, 0, 0,0x8DBE, 0, 0,
+ 0x89A4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9AD9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFD4E, 0, 0,
+ 0x8DC0, 0, 0,0x97F0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x93B4,0xFD44, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9FA7, 0,
+ 0, 0, 0,0x8DC2, 0, 0, 0, 0,0x99B6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFD52, 0, 0, 0, 0, 0, 0,0x8DC1,
+ 0, 0,0x8E46, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA0D1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9FCA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x92CF,
+ 0, 0, 0,0x9CF4,0x8DC4, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFD41, 0, 0, 0, 0,
+ 0, 0, 0,0x9B4C, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFD57,
+ 0xFCEF,
+ /* plane 0, page 106 */
+ 3 | (246 << 8), /* first, last */
+ 0x9CDE, 0, 0, 0, 0, 0, 0,
+ 0,0xFD42,0x986C, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x97F9, 0,0x9558, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x985E,0xFE7B,0x94CD, 0, 0, 0, 0,
+ 0,0x93EE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8CA3, 0,0xFD5A,
+ 0, 0, 0, 0, 0, 0,0x93F5, 0, 0, 0,
+ 0, 0,0x93EF,0x8EEA, 0, 0, 0,0x8F5B, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8C5E,
+ 0,0x8DC6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8DC8, 0, 0,0x8DC7, 0, 0, 0,
+ 0, 0,0x93F7, 0, 0, 0, 0, 0, 0, 0,
+ 0x8DC9, 0, 0, 0, 0, 0, 0, 0,0xFBF2, 0,
+ 0, 0, 0,0x9670, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8DCB, 0, 0, 0,0xFD5C, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8F65, 0, 0,
+ 0,0x8DCD, 0, 0, 0, 0, 0,0x9DA8,0x94F9, 0,
+ 0,0x8DCE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x93EA, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFD5F,0x93F0,0x9FB6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8DCF, 0, 0, 0,0x9763, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8DD0,
+ /* plane 0, page 107 */
+ 5 | (250 << 8), /* first, last */
+ 0x93F1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFD62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFD65, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9FDB, 0, 0, 0, 0,0x93F8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8BF7, 0, 0, 0, 0,0xFD66, 0, 0, 0,
+ 0, 0,0x8BCF, 0, 0, 0, 0, 0, 0,0x8DD1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8DD2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFD71, 0, 0, 0, 0,0xFD6F, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8DD3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9FE7,
+ /* plane 0, page 108 */
+ 28 | (255 << 8), /* first, last */
+ 0x90BD, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9FD0,
+ 0, 0, 0,0x8BD0, 0,0xFD72, 0,0x9CAE,0x8BD1, 0,
+ 0,0x8ADB, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFAE4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x95CE, 0,
+ 0xFD76, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFB62, 0, 0, 0, 0, 0, 0,0x8DD4, 0, 0,
+ 0,0xFD78, 0, 0, 0, 0, 0,0x8EE3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9076,
+ 0, 0,0x98C6, 0, 0, 0, 0, 0, 0, 0,
+ 0x8DD5, 0, 0, 0, 0,0x97D1, 0, 0,0x9EB6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFAC7, 0, 0,0xA042, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9873, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9FFC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8CA5,
+ /* plane 0, page 109 */
+ 2 | (254 << 8), /* first, last */
+ 0x8DD7, 0, 0,0x92FB,0x8DD8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x944F, 0,0x8DD9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x896B, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x97CE, 0, 0,
+ 0,0xFAF3,0xFDAE, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFBAF,0x92B7, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8DDA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9C5A, 0, 0, 0, 0, 0, 0,
+ 0xFDAD, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8DDC,0x9444, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8DDD, 0, 0,
+ 0, 0, 0, 0, 0,0xA0D6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8C41,
+ /* plane 0, page 110 */
+ 2 | (250 << 8), /* first, last */
+ 0x97D5, 0,0x944A, 0, 0, 0, 0, 0,
+ 0x944D, 0, 0, 0, 0,0x97CB, 0, 0, 0, 0,
+ 0,0x8DDE, 0, 0,0x8DDF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8DE0,0xFEF9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFDC0,
+ 0xFCF9, 0, 0, 0, 0, 0, 0, 0, 0,0xFB7E,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x92B3, 0,
+ 0, 0, 0, 0,0xFDAF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8DE1, 0, 0, 0, 0,0x95D3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x89C1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFD68, 0, 0,0x9CB7, 0, 0,0x8DE3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFAC0,0x8DE5,0xFA64,
+ 0,0x8947, 0, 0, 0, 0,0x8DE4, 0, 0, 0,
+ 0, 0,0x8DE7,0x8DE8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFDC7,
+ /* plane 0, page 111 */
+ 4 | (248 << 8), /* first, last */
+ 0xFDB0, 0, 0, 0, 0, 0,
+ 0,0x9445,0x97D6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFCC6,0x9844, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8DE9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8DEA, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFE50, 0, 0, 0, 0, 0, 0,0xFDCC, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9DA7, 0, 0, 0,
+ 0, 0,0xFDCD, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFDCF, 0, 0, 0,
+ 0,0x95D2, 0, 0, 0, 0, 0, 0, 0,0x8DED,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFCBA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFDC5, 0,0xFDD2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9CDC, 0, 0, 0, 0, 0,0x95CF, 0, 0,
+ 0x8DEE, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFDD4, 0, 0, 0, 0, 0,0x96EC,0x96EB, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x90B6, 0,0xFDC3,
+ /* plane 0, page 112 */
+ 3 | (254 << 8), /* first, last */
+ 0x98AB, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x96EE, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8DF4, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFDE0, 0,0x8C67, 0, 0,
+ 0x8DF6, 0, 0, 0,0x8DF7, 0, 0, 0, 0, 0,
+ 0, 0,0x8FFA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x97D0, 0, 0, 0, 0,0x8BD2, 0,
+ 0,0x8DF8, 0, 0, 0, 0, 0,0x90D9, 0,0x8C47,
+ 0,0xFAF0, 0, 0, 0, 0,0xFDE1,0x8DF9, 0,0xFDE3,
+ 0, 0, 0, 0, 0, 0, 0,0x8DFA, 0,0xFB63,
+ 0, 0, 0,0x90A6, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9970, 0, 0,0x91EB, 0,0x9770,0x986F,0xFDE2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x98F2, 0,0x9AFC,0x896C,0xFDFD,
+ 0, 0,0x995E, 0, 0, 0,0x95BD, 0, 0, 0,
+ 0, 0, 0, 0,0xFDE4, 0, 0, 0,0x91E6, 0,
+ 0, 0, 0,0xFDE5,0xFDE6, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFDE7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9454, 0, 0, 0,0x99B8, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x97E9,
+ /* plane 0, page 113 */
+ 5 | (246 << 8), /* first, last */
+ 0x9346, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9863,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x95BC, 0,0xFDED,0xFDF7, 0, 0, 0, 0, 0,
+ 0,0x9870,0x96F6,0x8EA9, 0, 0, 0, 0, 0,0x9451,
+ 0, 0,0x8E43, 0,0x8B5A, 0, 0, 0, 0,0xFDEE,
+ 0, 0, 0, 0,0xFDF0, 0, 0, 0, 0,0xFDF4,
+ 0,0x9BF5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x977E, 0, 0,
+ 0, 0, 0,0x9BD5, 0,0x9AC3, 0,0x97C8,0xA0DB,0x91D0,
+ 0, 0,0x9FE4, 0,0x8FDD, 0,0x91E9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x98E0, 0, 0, 0,
+ 0x92CA, 0,0x9857, 0, 0,0x8C51, 0, 0, 0, 0,
+ 0xFDEB, 0,0x9B49, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9D76,0x9EAF, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9CCC, 0, 0, 0, 0, 0, 0,
+ 0xFDEA, 0, 0,0x8DF1, 0, 0,0xFDFB, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8E53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFACF, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x96F9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x98BF,0x9E49,
+ /* plane 0, page 114 */
+ 0 | (226 << 8), /* first, last */
+ 0x8CA7, 0, 0, 0, 0, 0, 0, 0, 0,0x9BCA,
+ 0, 0, 0, 0,0xFDFE,0x92DC, 0, 0, 0, 0,
+ 0,0xFE41,0x91CC,0x91E2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFE44, 0, 0, 0,
+ 0, 0, 0,0x8BD3, 0, 0,0xFE47, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFE48, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9455, 0, 0, 0, 0,0xFE4B, 0,0xFE4C, 0, 0,
+ 0, 0,0x8DBF, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9E78, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFE51, 0, 0, 0, 0,0x9456, 0, 0, 0, 0,
+ 0, 0, 0,0x9D61, 0, 0, 0, 0,0x9457, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9966,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8BD5, 0, 0, 0, 0,0xA069, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x98B4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xA049,
+ /* plane 0, page 115 */
+ 2 | (251 << 8), /* first, last */
+ 0xA04C, 0,0x9E65, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x98B5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFE58, 0,0x9975,0xFE53,0xA065, 0,0xFE59, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x98B7,0x98B8, 0, 0,
+ 0, 0, 0, 0, 0,0x98BA, 0, 0, 0, 0,
+ 0, 0,0x98BB, 0, 0, 0, 0, 0, 0,0x9FBC,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA04A, 0, 0,0x9EC7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8CA9, 0, 0,0x98AE, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x92D6, 0, 0, 0,0xFAE1, 0,0x91D4, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFADE, 0, 0,
+ 0xFE5B, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8C53, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFE5E, 0, 0, 0, 0,0xFBD7,0xFE5A,0x94C5, 0,
+ 0, 0, 0,0xFACA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x98C1,0x975C, 0,0xFE74, 0,
+ 0x9773, 0, 0, 0, 0, 0, 0, 0, 0,0xFA46,
+ 0, 0, 0,0x9764, 0, 0, 0,0xFE68, 0,0x964E,
+ 0,0x9765,
+ /* plane 0, page 116 */
+ 2 | (248 << 8), /* first, last */
+ 0x8C5A, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x89A1,0x95FA, 0,
+ 0x92D4,0xFE69, 0,0xFB45, 0,0x98C8, 0, 0,0x90EF, 0,
+ 0x98C9,0x98CA, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x946D,0x94B7,0xFE6C, 0, 0,
+ 0x946B, 0, 0, 0, 0, 0, 0,0x92FC, 0,0x95EB,
+ 0,0xFE73,0x976E,0xFE5F, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFDBD, 0, 0,0x92D5, 0, 0, 0,
+ 0, 0, 0,0xFEB9, 0, 0,0xFE71, 0, 0, 0,
+ 0,0xFBBB, 0, 0,0x947A, 0, 0,0x95FB,0xFE77, 0,
+ 0, 0, 0, 0, 0, 0,0xFE79, 0,0xFE75, 0,
+ 0, 0,0x945D, 0, 0, 0, 0, 0, 0, 0,
+ 0xFE7C, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9344,0x8EA6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x92D3, 0,0x94B8, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFC71, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x975E, 0, 0, 0, 0,0x8CAD, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFEA7, 0, 0, 0,0x946A, 0, 0, 0,0x93E3, 0,
+ 0,0x98CF, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xA0D9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xA0BF,0xA04D,0xA0B8, 0, 0, 0, 0, 0,0xA0CE,
+ /* plane 0, page 117 */
+ 5 | (220 << 8), /* first, last */
+ 0xA0B7, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFEA9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x89C3, 0, 0, 0, 0,
+ 0xFEAB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9DF4,0x896D, 0, 0, 0, 0, 0,0x9C7B,
+ 0, 0, 0, 0, 0, 0,0x98D2, 0, 0, 0,
+ 0x9FA9, 0, 0, 0,0xFEB2, 0, 0,0xFEB1, 0, 0,
+ 0,0x97D9, 0,0xA0C4, 0,0x9476, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9978, 0, 0, 0,
+ 0, 0, 0,0xFEB3, 0, 0, 0, 0, 0,0x98D3,
+ 0xFEB4, 0, 0, 0,0x98D4, 0, 0, 0, 0, 0,
+ 0, 0,0x9FB9, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9471, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x98D5,0xFEB8, 0, 0, 0,0xC6D4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFEBA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9E5C, 0, 0,
+ 0xFEBB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xA044, 0, 0, 0, 0,
+ 0x98D7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x98D8,
+ /* plane 0, page 118 */
+ 2 | (217 << 8), /* first, last */
+ 0xFEBC, 0, 0, 0, 0,0x9FFE, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFEBD, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9DDD,
+ 0, 0, 0, 0,0x9EE1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x98DA,0x9DDF,0xFEBF,
+ 0,0xFEBE, 0, 0,0x9EEB, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9E59,0xA05C, 0, 0, 0, 0, 0, 0,
+ 0,0xFEC0, 0, 0, 0,0x9477,0x98DC, 0,0xFEC1, 0,
+ 0, 0,0x98DE, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFEC3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFEC8, 0, 0, 0,0xFEC9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFECA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFECB, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9FC2, 0, 0,0x8C6B,
+ /* plane 0, page 119 */
+ 12 | (254 << 8), /* first, last */
+ 0x98C4, 0,0x94B0,0x94B1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFED1, 0, 0, 0, 0, 0,0xA0C1, 0,0xFED2, 0,
+ 0, 0, 0,0xA0CD, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFED3, 0, 0,0x98E5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFED6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x91E4, 0, 0, 0, 0,0x8FC7,
+ 0x94AE, 0,0x8A4F,0x94B2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8FD4, 0, 0,
+ 0, 0,0x98EA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFED8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9DE0, 0, 0, 0, 0,
+ 0x98EE, 0, 0, 0, 0,0x95C4, 0,0xFCE8, 0, 0,
+ 0, 0, 0,0x98EF, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8C6E, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFAD8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFEDC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xA0AE,
+ /* plane 0, page 120 */
+ 8 | (245 << 8), /* first, last */
+ 0x9D4C, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x98F1, 0, 0, 0,0x98F3, 0,
+ 0x94C1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x98F5, 0, 0,
+ 0xFA4F,0x96E2, 0, 0, 0, 0,0x9450, 0,0x96A2, 0,
+ 0,0x98F6, 0, 0, 0,0x96E5, 0, 0, 0, 0,
+ 0,0x98F7, 0,0xA046,0x96E3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x98F8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9EE4, 0, 0, 0, 0, 0, 0,0xF9D6,
+ 0, 0, 0, 0, 0, 0,0x94C3, 0, 0, 0,
+ 0,0x94C2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFEE1, 0,0xFEE9, 0, 0,
+ 0, 0,0x96E4, 0,0x89AC,0x96DB, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFEE2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x94C4,0xFEE3, 0, 0, 0,0xFEE7,0x9FFB, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8C59, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x93C9, 0,
+ 0x94E8,0xFB56, 0, 0, 0,0x90C5,
+ /* plane 0, page 121 */
+ 6 | (244 << 8), /* first, last */
+ 0xA0A8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFEE5, 0, 0, 0,
+ 0x98FD,0x98FB,0xFEE8, 0,0x8EBF, 0, 0, 0, 0,0x8BD8,
+ 0xFEF7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8F68,0x94C6,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9DEA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFC69, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9CDA, 0,0xFEF3, 0,
+ 0,0x9C72, 0, 0,0xFEF0,0x89C9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9941, 0, 0, 0, 0,
+ 0, 0, 0,0x9942, 0, 0, 0,0xFEF5, 0,0x91D7,
+ 0, 0, 0, 0, 0,0x94CC, 0, 0, 0,0xFEF8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x97A8, 0,0xFEFC, 0,
+ 0, 0, 0, 0,0xFDBF, 0, 0, 0, 0, 0,
+ 0, 0,0xFEFE, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x96D1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x94D5, 0, 0,0x94D0,
+ /* plane 0, page 122 */
+ 6 | (254 << 8), /* first, last */
+ 0x9944, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8C63, 0, 0,0xA0B3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x94CF, 0,
+ 0, 0,0x9FFA, 0, 0, 0, 0,0x91E5, 0,0x9C6A,
+ 0, 0, 0,0x8E49, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8E4C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8E4D, 0, 0, 0, 0,
+ 0,0x9A73, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9947, 0,0x8CB1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8E50, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8E4F,0x9949, 0,
+ 0, 0, 0, 0,0x8E51,0x8E52, 0, 0, 0, 0,
+ 0x9AB2,0x89A5, 0, 0, 0, 0, 0,0x994C, 0, 0,
+ 0,0x9FF8, 0, 0, 0, 0, 0, 0,0x8E56,0x994D,
+ 0x91CA,0x8E57, 0, 0, 0, 0,0x94E1, 0, 0, 0,
+ 0,0x9047, 0,0x8FD8,0x8E58, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x94EB,
+ /* plane 0, page 123 */
+ 11 | (252 << 8), /* first, last */
+ 0x8E5C,0x9553, 0, 0, 0, 0, 0, 0, 0,
+ 0x9FE5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9F56, 0, 0, 0, 0, 0, 0, 0,0x954F,
+ 0,0x8E5E, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x996A, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9C64,0x9CD9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8E5D, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9950, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9951, 0,
+ 0,0x8E62, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9952, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8E68, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8E61,0x9F59, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8BB3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9F5D,0x8E66, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8CB2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8E6E, 0,0x9F64,
+ /* plane 0, page 124 */
+ 18 | (252 << 8), /* first, last */
+ 0x9953, 0,
+ 0,0xFAB8, 0, 0, 0, 0, 0,0x9954, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8E70, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9F61, 0,0x8E72, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xA06B, 0, 0, 0, 0,0x9F40, 0, 0, 0,
+ 0, 0, 0,0x94ED, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x94EE,
+ 0, 0,0x9FBD, 0, 0, 0,0x8E7B, 0, 0, 0,
+ 0, 0, 0,0x9957,0x94F7, 0,0x9F5F, 0, 0, 0,
+ 0,0x8E73, 0, 0,0x9F62, 0, 0, 0, 0, 0,
+ 0, 0,0x94F6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9958, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8E75,0xF9DB, 0, 0,
+ 0, 0,0x9072, 0,0x94F8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x995A, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xA0B0,0x8CB3, 0, 0, 0,0x8E79,
+ 0,0x8E78, 0, 0, 0,0x94F3, 0, 0, 0, 0,
+ 0,0x98AF, 0, 0, 0, 0, 0, 0,0xA0B2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8E7A, 0, 0, 0, 0, 0, 0,0x995C, 0, 0,
+ 0, 0, 0,0x8E7C, 0,0x8E7D, 0, 0, 0,0x8BD9,
+ 0, 0,0x89A2,
+ /* plane 0, page 125 */
+ 37 | (254 << 8), /* first, last */
+ 0x9ED7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xA0B6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9E42, 0, 0,0x8EA4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8EA7, 0,0x8C76,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9542, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x987D, 0, 0, 0,0x9755, 0,
+ 0,0x8EA8, 0, 0, 0, 0, 0, 0, 0,0x8EAA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x89A3, 0,0x9960,0x9962, 0,
+ 0,0x94FC,0x9961, 0, 0, 0, 0, 0, 0, 0,
+ 0x94FA, 0, 0, 0, 0, 0, 0, 0,0x8EAE,0x8EB2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8EB0, 0, 0, 0, 0,
+ 0, 0, 0,0x9963,0x97AA,
+ /* plane 0, page 126 */
+ 7 | (223 << 8), /* first, last */
+ 0x94FB, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8EBB,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8CDC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9876, 0,0x8EA1, 0, 0, 0, 0,0x8CB4, 0,
+ 0x8EB7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9DA6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9EB0, 0, 0, 0,0x8EB8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9D70,
+ 0, 0, 0, 0,0x896E, 0, 0, 0, 0, 0,
+ 0, 0,0x896F, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8970, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8971,
+ 0, 0, 0, 0, 0, 0, 0,0x8972, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8973,
+ /* plane 0, page 127 */
+ 6 | (250 << 8), /* first, last */
+ 0x8974, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8975, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8EBC,0x8EBD, 0, 0, 0, 0,
+ 0,0x8EBE, 0,0x9DD1, 0, 0, 0, 0,0x94FD, 0,
+ 0, 0,0x8BD7,0x8BDA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA0E2, 0, 0, 0, 0, 0, 0,
+ 0x9FE9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFDA8, 0, 0, 0,0x8AE7, 0, 0,
+ 0,0x8EC2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8EC4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9964, 0, 0, 0, 0, 0,
+ 0x9965, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x954E, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x98B3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8ECB,
+ /* plane 0, page 128 */
+ 2 | (246 << 8), /* first, last */
+ 0x8BDF, 0, 0, 0, 0, 0,0x8ECE, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8ECF,
+ 0, 0,0x9968, 0, 0, 0, 0,0x9969, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x996B,0x8ED1, 0,0x996C,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8ED4,
+ 0x8ED5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x996D, 0, 0, 0, 0, 0,
+ 0,0xA0BE, 0, 0, 0, 0, 0,0x8ED6,0xA0BC,0xA0B5,
+ 0, 0,0xA0B4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8BE0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x89B5,
+ 0, 0, 0, 0, 0, 0, 0,0x8EDD, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9E5D,0x9971, 0, 0, 0, 0,0x89AE,0x9DE8,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9565, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9972, 0, 0,0x8B5C, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x89B1,
+ /* plane 0, page 129 */
+ 3 | (246 << 8), /* first, last */
+ 0xA0C0, 0, 0, 0,0x8EDF, 0,0x9566,
+ 0, 0,0x9974, 0,0x9976, 0, 0, 0,0x9977, 0,
+ 0x9979, 0, 0,0x9DDA, 0, 0,0x8EE0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x935C, 0, 0, 0, 0, 0, 0, 0,
+ 0x9DE6, 0,0x8B5F, 0, 0,0x9563, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9567, 0, 0, 0,
+ 0, 0,0x9DE3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x997C, 0, 0,0x997D,
+ 0x997E, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8B5B,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x99A3, 0, 0, 0, 0, 0,
+ 0, 0,0x99A4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x99A6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x99A8, 0, 0, 0, 0,
+ 0x8ABE, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9E61, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x99AA, 0, 0, 0, 0, 0, 0,
+ 0xA0C8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x99AB, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFEC4,
+ 0, 0, 0, 0, 0, 0,0x98C2,
+ /* plane 0, page 130 */
+ 24 | (255 << 8), /* first, last */
+ 0x8EE8, 0,0xA0BA, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFD77, 0,
+ 0,0x8EEE, 0, 0, 0,0x9EBF, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x89C2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x99AC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x956B, 0,
+ 0,0x956C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x99AF, 0,
+ 0,0x994A,0x8976,0x8F48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFBEE, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x99AE, 0, 0, 0,
+ 0x8EFB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8CD0, 0, 0, 0, 0,0x8B52, 0, 0, 0,
+ 0, 0,0x99B0, 0, 0, 0, 0,0x8977,0x8F41, 0,
+ 0, 0, 0, 0, 0, 0,0x99B1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8F49, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFA4D, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9DE4,0x8CB5, 0,
+ 0, 0,0xFBE9,0x9B54, 0,0x99B2,
+ /* plane 0, page 131 */
+ 11 | (237 << 8), /* first, last */
+ 0x9E68, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8F4A, 0,0x8F42, 0, 0,0x8F51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9846, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x99B4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8EF5,0xFD55,
+ 0, 0,0x9CCD, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8978, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8F53, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8F6F, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8E63, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8F56, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFE76, 0, 0, 0, 0,
+ 0x9FC6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFAAC, 0, 0, 0, 0,
+ 0,0x8F58, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9848,
+ /* plane 0, page 132 */
+ 5 | (248 << 8), /* first, last */
+ 0x99B7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9665, 0,0xFA6C, 0,0x9DE7, 0, 0, 0,0x9E62, 0,
+ 0, 0,0x96CC,0x8E67, 0, 0,0xFC75, 0,0x987E, 0,
+ 0, 0, 0, 0, 0, 0,0xFDB9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x97FC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x98F9, 0,0x8F66, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x956E, 0,0x9245, 0, 0,0x8F60, 0,
+ 0, 0,0x9ED1, 0, 0, 0, 0, 0,0xFECD, 0,
+ 0x99B9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8F62,0x974C, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x91C7,0x955F, 0,
+ 0, 0, 0, 0, 0, 0,0x99BB, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8E6D,0x8F71, 0, 0,
+ 0x94CB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x95B1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9AF2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x96C3,
+ 0x99BD, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA0CF, 0,
+ 0, 0,0x8F6D, 0, 0,0x99BE,0x8EF4, 0,0x8F72,0x95E4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x99BF,
+ /* plane 0, page 133 */
+ 3 | (252 << 8), /* first, last */
+ 0x9242, 0,0xFBA5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x99C0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFDB4,0x8F77, 0, 0, 0,0x99C1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFAB9, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8F40,0xFA44, 0, 0, 0,
+ 0, 0,0x99C2, 0, 0, 0, 0, 0, 0, 0,
+ 0x8F5C, 0, 0, 0, 0,0x8CBD, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x99C4,0x99C5, 0, 0,0x8F7B, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8CB6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8FA3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8CCE, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x99C6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x96CD, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x96C7,
+ /* plane 0, page 134 */
+ 2 | (239 << 8), /* first, last */
+ 0x8FA5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFABB, 0,0x8C61,0x9570, 0, 0, 0,
+ 0x9368, 0,0x8F7E, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8FAA, 0, 0, 0, 0, 0, 0,0xA050, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x90D3, 0, 0,0x9556,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8FB8, 0,
+ 0, 0, 0, 0,0x99C8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8FAF, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x99C9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9579, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9F49, 0, 0, 0, 0,0x99CA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x99CB,
+ /* plane 0, page 135 */
+ 112 | (245 << 8), /* first, last */
+ 0x9DD5,0x8FB0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFA7A, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9E5F, 0, 0, 0, 0,0x99CD,
+ 0xA0C9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9ADB, 0, 0, 0,0xA0C6,
+ 0, 0, 0, 0, 0, 0, 0,0x8FB4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA0D7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xA0C7, 0, 0, 0,
+ 0, 0, 0, 0,0xA043, 0, 0, 0,0x8FB5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8FB2, 0,
+ 0, 0, 0, 0, 0,0xA061,
+ /* plane 0, page 136 */
+ 4 | (255 << 8), /* first, last */
+ 0x9E5E, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8FB6, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9FE8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9CB2,
+ 0, 0, 0, 0, 0,0x957C, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9FC7, 0, 0,0x8FBB,
+ 0x8FBC, 0, 0, 0, 0, 0, 0, 0, 0,0x8FEC,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8FC0, 0,0x936A, 0, 0, 0,
+ 0x8BE4,0x9C7C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x95A1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFEEC, 0, 0,0x95A3, 0, 0, 0, 0,
+ 0, 0, 0,0x8C45,0x8CB8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8FC1, 0, 0, 0,
+ 0xA052, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x99D0, 0, 0, 0, 0, 0,
+ 0x8FC3,0x8FC4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x95A4, 0, 0, 0, 0, 0,0x8FC6, 0,0x9E60,
+ 0, 0, 0, 0, 0, 0, 0,0xF9D8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x95A5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9CB3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x99D1,
+ /* plane 0, page 137 */
+ 0 | (231 << 8), /* first, last */
+ 0xFEF1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x99D2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9CC2, 0, 0,
+ 0,0x99D3, 0, 0, 0, 0, 0,0x95A7, 0, 0,
+ 0, 0, 0, 0,0x95A9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x95A6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9C5D,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x98E2, 0,
+ 0, 0, 0, 0, 0,0x8FC9, 0,0xA0C2,0x8FCA, 0,
+ 0, 0, 0, 0, 0,0x99D4, 0, 0,0xA0B9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9B58, 0,0x8FCD, 0,0xA0D4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8FCE, 0,
+ 0, 0, 0,0x8BE5, 0, 0, 0, 0,0x8979, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8FD0,
+ /* plane 0, page 138 */
+ 28 | (234 << 8), /* first, last */
+ 0x95B6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x99D6, 0,0x95E5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x99D7, 0, 0, 0,
+ 0,0x95B5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA0CA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9FFD, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xA058, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8FD6, 0, 0, 0,0x99D8, 0,
+ 0, 0, 0, 0, 0, 0,0x8FD3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8FE5,
+ 0, 0, 0, 0, 0,0x8FE9, 0, 0, 0, 0,
+ 0x99D9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x927C, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9C45,
+ /* plane 0, page 139 */
+ 12 | (226 << 8), /* first, last */
+ 0x8FDE, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8FDF, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xA04B, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8FE2, 0, 0, 0,0xA0CC, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8FE3,0x8FE4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BC4, 0, 0, 0,0x9BFC, 0,
+ 0, 0, 0, 0, 0,0x964C, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9AF6,
+ 0,0x8CAE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8FE7, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8FE8, 0, 0, 0, 0,
+ 0x8BE7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x897A, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x897B,
+ /* plane 0, page 140 */
+ 81 | (247 << 8), /* first, last */
+ 0x99DA, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8FED, 0, 0, 0,0x95C0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA0CB, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9E48, 0, 0, 0, 0,
+ 0, 0,0x99DB, 0,0x8FF3, 0, 0, 0, 0,0x8FF9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x95C1, 0,0xA04E, 0, 0, 0, 0,
+ 0, 0,0x99DC, 0, 0, 0, 0,0xA064,
+ /* plane 0, page 141 */
+ 3 | (212 << 8), /* first, last */
+ 0x8FF7, 0, 0, 0, 0, 0, 0,
+ 0,0x89B0,0xA048, 0, 0, 0, 0,0x8FFB,0x8FF6, 0,
+ 0, 0, 0, 0,0x9DDC, 0, 0, 0,0x99DD,0x8BE8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x92C1, 0, 0, 0, 0, 0, 0, 0,
+ 0x9FD6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xA0D2, 0, 0,0x9040,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8AC4, 0, 0,0x99E0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9FF0,
+ /* plane 0, page 142 */
+ 1 | (242 << 8), /* first, last */
+ 0x9FF3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9DBF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9FF6, 0,0x95C8, 0, 0,0x9E5A, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x99E3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8A4A, 0, 0, 0, 0, 0, 0, 0, 0,0x9FF1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8AA7, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x99E6, 0, 0, 0,0x9FF7, 0,0x9FED,
+ 0, 0, 0, 0, 0, 0,0x8A5C, 0,0x9DAE, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x95C9, 0, 0,
+ 0, 0, 0,0x9048, 0, 0,0x99E8, 0, 0, 0,
+ 0, 0,0x9049, 0, 0,0x8CBA, 0, 0,0x90B1, 0,
+ 0, 0, 0, 0, 0,0x904A, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x99EA, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9BD1, 0,
+ 0, 0, 0, 0, 0, 0,0x99EB, 0,0x99EC, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x99ED, 0, 0,
+ 0, 0,0x99EE,
+ /* plane 0, page 143 */
+ 25 | (249 << 8), /* first, last */
+ 0x904C, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x904D, 0, 0,0x95CB, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x97E2, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x95CC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9F78, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x897C,0x897D, 0, 0, 0, 0, 0, 0,
+ 0x897E, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x995D, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9B5A, 0, 0, 0, 0,0x9050, 0,0x8C4F, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9054,
+ 0,0xC6D6,0x9AA8,0x99EF,0xFEEB,0x9DA3,0x9DA1,0x9943,0x9945, 0,
+ 0x9D7D, 0, 0,0x99F0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x99F1, 0,0x99F2, 0, 0,0x8CBC,0x9D60, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA0A3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x905B,
+ /* plane 0, page 144 */
+ 8 | (196 << 8), /* first, last */
+ 0x9EDB, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9D79, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x99F3, 0, 0, 0,0x9062, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9F55, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9BF9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9065, 0, 0,
+ 0x96E0, 0, 0, 0, 0, 0, 0, 0,0x98BE, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9068, 0,
+ 0, 0, 0, 0,0x906C, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x95D8, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x906A,
+ /* plane 0, page 145 */
+ 81 | (254 << 8), /* first, last */
+ 0x9FB2, 0, 0, 0, 0, 0, 0, 0,0x9FAE,
+ 0, 0,0x9FB0, 0,0x89AD, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x906E, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9E71, 0, 0, 0, 0, 0,0x9E4A, 0,
+ 0, 0, 0, 0,0x9FDC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x89AB, 0,0x9FB8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9070,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8B63, 0, 0, 0, 0,0x95DC, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9071, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFC5E, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8949, 0, 0, 0, 0, 0,0x965B,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8C50, 0, 0, 0,
+ 0x94A6, 0, 0, 0,0x8FD5,
+ /* plane 0, page 146 */
+ 8 | (253 << 8), /* first, last */
+ 0x9E73, 0,
+ 0, 0, 0, 0,0x9075, 0, 0, 0, 0,0x99F7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8CBF, 0, 0, 0, 0, 0, 0,
+ 0x99F9, 0,0x9663,0x95B9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x94D4, 0, 0, 0, 0, 0, 0,
+ 0xFCFA, 0, 0, 0, 0,0x9077, 0, 0,0x90AB, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9D4D, 0, 0,0x99FA, 0,
+ 0, 0, 0,0x92E3, 0,0x97BB, 0, 0,0x9078, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x99FB, 0, 0,
+ 0x97E0, 0, 0, 0, 0, 0, 0, 0, 0,0x96DC,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9CA8,
+ 0, 0,0x9772, 0, 0, 0, 0,0x9440, 0, 0,
+ 0, 0, 0,0x92F2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x99FD, 0, 0,0x99FC, 0, 0,
+ 0, 0, 0, 0, 0,0xF9D7,0x964A, 0, 0, 0,
+ 0x96D8,0x99FE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x904B, 0, 0, 0, 0, 0, 0,0xFA41,
+ 0, 0, 0, 0, 0, 0, 0,0x9A40, 0,0x975B,
+ 0, 0, 0, 0, 0,0x9A41,0x91DD, 0, 0, 0,
+ 0, 0,0x93FC,0x9A42,0x9A43, 0,0x9659, 0, 0, 0,
+ 0, 0, 0,0x9A44,
+ /* plane 0, page 147 */
+ 3 | (244 << 8), /* first, last */
+ 0x9051, 0, 0, 0,0x94BF, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x90A2, 0, 0, 0,0x9CAB,0x9776,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFC55,0xFE45,0x94A8,0x9A45,0xFA4B,0x9DE1,
+ 0, 0,0x96D9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9774, 0, 0,0xFDF5, 0,
+ 0, 0,0x92E5, 0,0x9645,0x91DA, 0,0x90A3, 0, 0,
+ 0xA05F, 0, 0, 0, 0,0x90AF,0x97BF, 0, 0, 0,
+ 0x914C, 0, 0, 0, 0,0x967A, 0, 0, 0,0x91DE,
+ 0, 0,0x9A46,0xFEB0,0x9779,0x946C, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9858, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9266, 0, 0, 0,
+ 0x93FB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9A47, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9749, 0, 0,0x9748, 0,0x934A,
+ 0,0x9CE2, 0, 0, 0, 0, 0, 0,0x9264, 0,
+ 0, 0, 0,0x91DF, 0, 0, 0, 0, 0, 0,
+ 0,0xFB79, 0, 0, 0, 0, 0, 0, 0,0x96D7,
+ 0, 0, 0, 0,0x9343, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFDCB,0xFE7A, 0,0x91DB,0x8C6A,
+ /* plane 0, page 148 */
+ 1 | (246 << 8), /* first, last */
+ 0x97AF, 0, 0,0x95DD, 0, 0, 0,0x9348, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9A4B, 0, 0, 0,0xFC45, 0,0x9A4D,
+ 0, 0, 0, 0, 0, 0,0x91BC,0x90E2,0x90B4,0x95E1,
+ 0, 0, 0, 0, 0,0x9A4E, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9A4F, 0, 0, 0,0xFE40,0xFE43, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x96DD, 0, 0,
+ 0, 0, 0, 0,0x9A51, 0, 0, 0,0x96A7, 0,
+ 0,0x90B0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9C4E, 0,0x9443, 0, 0, 0, 0,0x8EBA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9A52, 0,0xFCC1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8BE9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9CAF,
+ 0, 0,0x8BFD, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9ABC, 0,0x9AB8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9AAE, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9AA7,
+ /* plane 0, page 149 */
+ 45 | (244 << 8), /* first, last */
+ 0x9A53, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9D74, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8BEA, 0, 0, 0, 0, 0, 0,0x8BEB, 0, 0,
+ 0, 0, 0,0x90B2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x95E9,0x95E8, 0,0x95E6, 0, 0, 0, 0, 0, 0,
+ 0x90B5, 0,0x9A54, 0, 0, 0,0x90B3,0x95E7, 0, 0,
+ 0x8B50, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8BEC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9A56,
+ /* plane 0, page 150 */
+ 29 | (244 << 8), /* first, last */
+ 0x8BFB,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9A57, 0, 0, 0, 0,0xA0AA, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9FA6, 0, 0, 0,0x99CC,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9C59, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x99B5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x90BE, 0, 0, 0, 0, 0,0x9FAF,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x95F2, 0, 0, 0, 0, 0, 0,
+ 0x90BF, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x90C1, 0,0xFEE4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x90C4, 0, 0, 0, 0, 0, 0,0x90C7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x92E4,
+ /* plane 0, page 151 */
+ 3 | (245 << 8), /* first, last */
+ 0x9F52, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x90DB, 0, 0,
+ 0, 0, 0,0xA066, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x90D2,
+ 0, 0, 0, 0,0x90D4, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9A5B,0x95FD, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8BC4, 0, 0, 0,0x8C66, 0,0x90DE, 0, 0,
+ 0, 0, 0,0x9CE4, 0,0x90E1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9E46,
+ 0, 0, 0,0x9651, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFB58, 0,0x90E6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9650, 0, 0, 0,0x90E7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x90E8,0x9A5D, 0,
+ 0x9F7A, 0, 0, 0,0x9B5C, 0,0x9F7C, 0, 0,0xFC52,
+ 0x90E9, 0,0x90EA, 0,0x9A5E, 0, 0, 0, 0, 0,
+ 0x9F76, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x90EB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x90EC, 0, 0, 0, 0, 0,
+ 0x8BEE, 0, 0, 0, 0, 0, 0, 0,0x90EE, 0,
+ 0, 0,0x91C6, 0, 0,0x90F2,
+ /* plane 0, page 152 */
+ 20 | (245 << 8), /* first, last */
+ 0xFCBC,0x8A74, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9657, 0, 0, 0,0x9CEF, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9FDF, 0, 0, 0,
+ 0,0x90F7,0x90F6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9B5E, 0, 0, 0,0x90F8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x90F9, 0,0x8CC9, 0, 0, 0,0xFA6A, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8BEF, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9FE0, 0, 0,0x9142, 0,0x9A62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9569, 0, 0, 0,0x9144,
+ 0x9143, 0,0x9141, 0, 0, 0,0x8BF0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9660, 0,0x8BF1, 0,0x99F6,0x9149, 0, 0, 0, 0,
+ 0x914A, 0, 0, 0, 0, 0,0x914B, 0, 0, 0,
+ 0,0x9A64, 0, 0, 0,0x8ABF,
+ /* plane 0, page 153 */
+ 14 | (245 << 8), /* first, last */
+ 0x9A66, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9A67, 0, 0,0x9A69, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9A6A,0x9652,0x914D, 0,0x9666,
+ 0, 0, 0, 0,0x9F7B, 0,0x9A6B, 0, 0, 0,
+ 0, 0, 0, 0,0xA06C, 0, 0,0x9667, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9A6C, 0, 0, 0, 0,0x9A6D,0x8BF2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x966A, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFCEA, 0, 0, 0, 0, 0,
+ 0x966C, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x91C4, 0, 0, 0,0x9677, 0,
+ 0, 0, 0, 0, 0, 0,0x99F4,0x9A6F, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9FAB, 0,
+ 0, 0, 0, 0,0x8CBE,0x8EC1, 0, 0, 0, 0,
+ 0x9555, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9152,
+ /* plane 0, page 154 */
+ 12 | (255 << 8), /* first, last */
+ 0x9153, 0, 0, 0,0x9155, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x955D, 0,0x9671, 0, 0, 0, 0,0x9C6D, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9673, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9154,
+ 0x9A71, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9156, 0,
+ 0, 0,0x966D, 0, 0, 0, 0, 0, 0,0x9557,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x89C6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x89C7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8A6A, 0,
+ 0, 0,0x8B57, 0, 0, 0,0x9FE1, 0, 0,0x9B5F,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xA05D, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x915B, 0,0x915C, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x915E, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9F5C,
+ /* plane 0, page 155 */
+ 2 | (255 << 8), /* first, last */
+ 0x9F57, 0, 0, 0, 0, 0, 0,0x9F65,
+ 0, 0, 0, 0, 0,0x9A72, 0, 0, 0, 0,
+ 0x9160, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9F5E, 0, 0,0x9161, 0, 0, 0, 0,
+ 0, 0,0x9164, 0, 0, 0, 0,0x9F41, 0, 0,
+ 0, 0, 0, 0,0x9169, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9168, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9A74, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x96B2, 0,0x9A75,
+ 0,0xFDA5, 0, 0, 0, 0, 0, 0, 0,0x9EE9,
+ 0,0x8BBA,0x916D,0xA060, 0, 0, 0, 0, 0, 0,
+ 0,0x9FDE, 0, 0, 0, 0, 0,0x9FC3, 0,0x96B5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xA067, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x96B3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9A76, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x95D5, 0, 0, 0,0x9ECA, 0, 0,
+ 0,0x9A77, 0, 0,0x9A78, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9170,
+ /* plane 0, page 156 */
+ 2 | (124 << 8), /* first, last */
+ 0x916F, 0, 0, 0, 0, 0, 0, 0,
+ 0x9FA3, 0,0x9171, 0, 0, 0,0x96B1, 0, 0, 0,
+ 0,0x9F63, 0, 0, 0, 0, 0,0x9F67, 0, 0,
+ 0,0x8BB9,0x9A7A, 0, 0, 0, 0, 0,0x8B56, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9ADA, 0, 0,
+ 0, 0, 0,0x96B0, 0, 0, 0, 0,0x9A7E, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9DDE,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x96AD,
+ 0, 0, 0,0x96AE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9EA1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9E50, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x96AF,0x8BF4,
+ /* plane 0, page 157 */
+ 2 | (252 << 8), /* first, last */
+ 0x9FA4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x96BD, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x96F4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x96B8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFAA1, 0, 0, 0, 0,0x91A7, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA05E, 0,
+ 0, 0, 0,0x9A7D, 0, 0, 0, 0,0x8948, 0,
+ 0x9EB1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9DDB, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x95BF,
+ 0x8A73, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9EFE, 0,0x917A, 0, 0, 0,
+ 0,0x917B, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9AA3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x96C2, 0, 0, 0, 0,
+ 0,0x9F77, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9AA4,
+ 0, 0,0x9AA5, 0, 0, 0,0x91A1, 0, 0, 0,
+ 0,0x89B8, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9173, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9AA6,
+ /* plane 0, page 158 */
+ 10 | (254 << 8), /* first, last */
+ 0x89BD, 0,0x89B9, 0,0x917D, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x96BB, 0, 0, 0,0x9FF2, 0,
+ 0,0x8BF5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9AA9, 0, 0, 0, 0, 0,0x9F54,
+ 0, 0,0x9FE3,0x9EED, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x91AA, 0, 0, 0, 0,0x91AB,
+ 0xA070, 0,0x9F6D, 0, 0, 0, 0, 0,0x91AC, 0,
+ 0, 0,0x91AD, 0, 0, 0,0xA0FD, 0,0x9FE2, 0,
+ 0x91AF,0x9E41,0x9AAA, 0, 0,0x91B0, 0,0x9AAB, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9AAC,
+ 0,0x9A4A, 0,0x91B2, 0, 0,0x8BF6, 0,0x9AAD,0x89B6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9AAF, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9AB0, 0, 0, 0, 0, 0, 0,0x9AB1, 0,
+ 0, 0, 0, 0,0x9AA1,
+ /* plane 0, page 159 */
+ 2 | (165 << 8), /* first, last */
+ 0x91B9, 0, 0, 0, 0, 0,0x91BA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x91BE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA041,0x8BB7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x91C0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9AB3,0x91C3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xA0FC, 0, 0,0x9FEE, 0, 0, 0, 0, 0, 0,
+ 0x9F69, 0, 0, 0, 0, 0, 0, 0,0x91C8, 0,
+ 0, 0, 0, 0, 0,0x91C9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8DE6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x91CB, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x89C8, 0, 0, 0, 0, 0,0x8DAA,
+ 0, 0, 0, 0, 0,0x9FDD,
+ /* plane 0, page 160: --- */
+ /* plane 0, page 161: --- */
+ /* plane 0, page 162: --- */
+ /* plane 0, page 163: --- */
+ /* plane 0, page 164: --- */
+ /* plane 0, page 165: --- */
+ /* plane 0, page 166: --- */
+ /* plane 0, page 167: --- */
+ /* plane 0, page 168: --- */
+ /* plane 0, page 169: --- */
+ /* plane 0, page 170: --- */
+ /* plane 0, page 171: --- */
+ /* plane 0, page 172: --- */
+ /* plane 0, page 173: --- */
+ /* plane 0, page 174: --- */
+ /* plane 0, page 175: --- */
+ /* plane 0, page 176: --- */
+ /* plane 0, page 177: --- */
+ /* plane 0, page 178: --- */
+ /* plane 0, page 179: --- */
+ /* plane 0, page 180: --- */
+ /* plane 0, page 181: --- */
+ /* plane 0, page 182: --- */
+ /* plane 0, page 183: --- */
+ /* plane 0, page 184: --- */
+ /* plane 0, page 185: --- */
+ /* plane 0, page 186: --- */
+ /* plane 0, page 187: --- */
+ /* plane 0, page 188: --- */
+ /* plane 0, page 189: --- */
+ /* plane 0, page 190: --- */
+ /* plane 0, page 191: --- */
+ /* plane 0, page 192: --- */
+ /* plane 0, page 193: --- */
+ /* plane 0, page 194: --- */
+ /* plane 0, page 195: --- */
+ /* plane 0, page 196: --- */
+ /* plane 0, page 197: --- */
+ /* plane 0, page 198: --- */
+ /* plane 0, page 199: --- */
+ /* plane 0, page 200: --- */
+ /* plane 0, page 201: --- */
+ /* plane 0, page 202: --- */
+ /* plane 0, page 203: --- */
+ /* plane 0, page 204: --- */
+ /* plane 0, page 205: --- */
+ /* plane 0, page 206: --- */
+ /* plane 0, page 207: --- */
+ /* plane 0, page 208: --- */
+ /* plane 0, page 209: --- */
+ /* plane 0, page 210: --- */
+ /* plane 0, page 211: --- */
+ /* plane 0, page 212: --- */
+ /* plane 0, page 213: --- */
+ /* plane 0, page 214: --- */
+ /* plane 0, page 215: --- */
+ /* plane 0, page 216: --- */
+ /* plane 0, page 217: --- */
+ /* plane 0, page 218: --- */
+ /* plane 0, page 219: --- */
+ /* plane 0, page 220: --- */
+ /* plane 0, page 221: --- */
+ /* plane 0, page 222: --- */
+ /* plane 0, page 223: --- */
+ /* plane 0, page 224 */
+ 0 | (253 << 8), /* first, last */
+ 0xFA40, 0,0xFA42,0xFA43, 0,0xFA45, 0, 0,0xFA48,0xFA49,
+ 0xFA4A, 0,0xFA4C, 0,0xFA4E, 0, 0, 0,0xFA52,0xFA53,
+ 0xFA54,0xFA55,0xFA56, 0,0xFA58, 0,0xFA5A,0xFA5B,0xFA5C,0xFA5D,
+ 0xFA5E, 0,0xFA60, 0,0xFA62,0xFA63, 0,0xFA65, 0, 0,
+ 0xFA68, 0, 0,0xFA6B, 0,0xFA6D,0xFA6E, 0,0xFA70, 0,
+ 0xFA72,0xFA73,0xFA74,0xFA75,0xFA76,0xFA77,0xFA78, 0, 0,0xFA7B,
+ 0xFA7C, 0, 0, 0, 0, 0, 0,0xFAA5, 0,0xFAA7,
+ 0, 0, 0, 0, 0, 0,0xFAAE, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFABC, 0,0xFABE, 0, 0,0xFAC1,0xFAC2,0xFAC3, 0, 0,
+ 0xFAC6, 0,0xFAC8, 0, 0, 0,0xFACC,0xFACD,0xFACE, 0,
+ 0xFAD0, 0, 0,0xFAD3, 0, 0,0xFAD6,0xFAD7, 0, 0,
+ 0xFADA, 0, 0, 0, 0,0xFADF,0xFAE0, 0, 0, 0,
+ 0, 0, 0, 0,0xFAE8,0xFAE9, 0,0xFAEB,0xFAEC, 0,
+ 0xFAEE, 0, 0, 0, 0, 0, 0,0xFAF5,0xFAF6, 0,
+ 0, 0,0xFAFA,0xFAFB,0xFAFC,0xFAFD,0xFAFE,0xFB40,0xFB41, 0,
+ 0xFB43, 0, 0, 0, 0, 0,0xFB49,0xFB4A,0xFB4B,0xFB4C,
+ 0,0xFB4E, 0, 0,0xFB51, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFB5D,0xFB5E,0xFB5F, 0,
+ 0xFB61, 0, 0, 0,0xFB65,0xFB66, 0,0xFB68, 0,0xFB6A,
+ 0xFB6B, 0,0xFB6D, 0, 0,0xFB70, 0, 0,0xFB73, 0,
+ 0, 0,0xFB77,0xFB78, 0,0xFB7A, 0, 0,0xFB7D, 0,
+ 0xFBA1, 0, 0,0xFBA4, 0, 0,0xFBA7,0xFBA8,0xFBA9,0xFBAA,
+ 0,0xFBAC,0xFBAD,0xFBAE, 0,0xFBB0,0xFBB1, 0,0xFBB3, 0,
+ 0,0xFBB6,0xFBB7, 0,0xFBB9, 0, 0, 0,0xFBBD,0xFBBE,
+ 0xFBBF,0xFBC0,0xFBC1,0xFBC2,
+ /* plane 0, page 225 */
+ 3 | (254 << 8), /* first, last */
+ 0xFBC8,0xFBC9,0xFBCA,0xFBCB, 0, 0,0xFBCE,
+ 0xFBCF,0xFBD0, 0, 0,0xFBD3, 0,0xFBD5, 0, 0, 0,
+ 0xFBD9,0xFBDA, 0,0xFBDC, 0, 0, 0, 0,0xFBE1,0xFBE2,
+ 0, 0, 0,0xFBE6, 0, 0, 0,0xFBEA,0xFBEB,0xFBEC,
+ 0xFBED, 0,0xFBEF,0xFBF0, 0, 0, 0, 0,0xFBF5,0xFBF6,
+ 0, 0, 0, 0,0xFBFB, 0, 0,0xFBFE, 0, 0,
+ 0xFC42, 0, 0, 0, 0,0xFC47,0xFC48,0xFC49,0xFC4A,0xFC4B,
+ 0,0xFC4D,0xFC4E, 0,0xFC50, 0, 0,0xFC53, 0, 0,
+ 0xFC56, 0, 0,0xFC59,0xFC5A,0xFC5B,0xFC5C,0xFC5D, 0,0xFC5F,
+ 0xFC60, 0, 0,0xFC63,0xFC64,0xFC65,0xFC66, 0,0xFC68, 0,
+ 0xFC6A, 0, 0, 0,0xFC6E,0xFC6F,0xFC70, 0, 0, 0,
+ 0, 0, 0,0xFC77,0xFC78, 0, 0,0xFC7B, 0, 0,
+ 0xFC7E,0xFCA1, 0,0xFCA3,0xFCA4, 0,0xFCA6,0xFCA7,0xFCA8, 0,
+ 0, 0, 0,0xFCAD, 0,0xFCAF, 0,0xFCB1, 0,0xFCB3,
+ 0xFCB4, 0, 0,0xFCB7,0xFCB8, 0, 0,0xFCBB, 0,0xFCBD,
+ 0xFCBE, 0, 0, 0,0xFCC2, 0,0xFCC4, 0, 0,0xFCC7,
+ 0xFCC8, 0, 0, 0,0xFCCC, 0,0xFCCE,0xFCCF, 0,0xFCD1,
+ 0xFCD2, 0, 0, 0,0xFCD6, 0,0xFCD8,0xFCD9, 0,0xFCDB,
+ 0xFCDC, 0,0xFCDE, 0,0xFCE0, 0, 0,0xFCE3,0xFCE4,0xFCE5,
+ 0xFCE6,0xFCE7, 0,0xFCE9, 0, 0,0xFCEC,0xFCED,0xFCEE, 0,
+ 0xFCF0, 0, 0, 0,0xFCF4,0xFCF5, 0,0xFCF7, 0, 0,
+ 0, 0,0xFCFC,0xFCFD, 0,0xFD40, 0, 0,0xFD43, 0,
+ 0,0xFD46, 0, 0,0xFD49,0xFD4A,0xFD4B,0xFD4C, 0, 0,
+ 0xFD4F,0xFD50, 0, 0,0xFD53,0xFD54, 0, 0, 0,0xFD58,
+ 0xFD59, 0,0xFD5B, 0,0xFD5D, 0, 0,0xFD60,0xFD61, 0,
+ 0xFD63, 0, 0, 0,0xFD67,
+ /* plane 0, page 226 */
+ 0 | (255 << 8), /* first, last */
+ 0xFD69,0xFD6A,0xFD6B,0xFD6C, 0,0xFD6E, 0,0xFD70, 0, 0,
+ 0xFD73,0xFD74,0xFD75, 0, 0, 0,0xFD79,0xFD7A,0xFD7B,0xFD7C,
+ 0xFD7D,0xFD7E,0xFDA1,0xFDA2,0xFDA3,0xFDA4, 0,0xFDA6,0xFDA7, 0,
+ 0,0xFDAA,0xFDAB,0xFDAC, 0, 0, 0, 0,0xFDB1,0xFDB2,
+ 0xFDB3, 0,0xFDB5, 0, 0, 0, 0,0xFDBA, 0,0xFDBC,
+ 0,0xFDBE, 0, 0, 0,0xFDC2, 0,0xFDC4, 0,0xFDC6,
+ 0,0xFDC8,0xFDC9,0xFDCA, 0, 0, 0,0xFDCE, 0,0xFDD0,
+ 0xFDD1, 0,0xFDD3, 0,0xFDD5,0xFDD6,0xFDD7,0xFDD8,0xFDD9,0xFDDA,
+ 0,0xFDDC,0xFDDD,0xFDDE,0xFDDF, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFDE8,0xFDE9, 0, 0,0xFDEC, 0, 0,
+ 0, 0, 0, 0,0xFDF3, 0, 0,0xFDF6, 0,0xFDF8,
+ 0xFDF9,0xFDFA, 0,0xFDFC, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFE46, 0, 0,0xFE49, 0, 0, 0,0xFE4D,
+ 0xFE4E, 0, 0, 0, 0, 0,0xFE54,0xFE55,0xFE56,0xFE57,
+ 0, 0, 0, 0,0xFE5C,0xFE5D, 0, 0,0xFE60,0xFE61,
+ 0xFE62, 0,0xFE64,0xFE65,0xFE66,0xFE67, 0, 0, 0,0xFE6B,
+ 0,0xFE6D,0xFE6E, 0,0xFE70, 0,0xFE72, 0, 0, 0,
+ 0, 0,0xFE78, 0, 0, 0, 0,0xFE7D,0xFE7E,0xFEA1,
+ 0xFEA2,0xFEA3, 0,0xFEA5,0xFEA6, 0,0xFEA8, 0, 0, 0,
+ 0xFEAC,0xFEAD, 0,0xFEAF, 0, 0, 0, 0, 0,0xFEB5,
+ 0xFEB6,0xFEB7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFEC2, 0, 0,0xFEC5,0xFEC6,0xFEC7, 0, 0,
+ 0, 0,0xFECC, 0,0xFECE,0xFECF,0xFED0, 0, 0, 0,
+ 0,0xFED5, 0,0xFED7, 0,0xFED9,0xFEDA,0xFEDB, 0, 0,
+ 0xFEDE,0xFEDF, 0, 0, 0, 0, 0, 0,0xFEE6, 0,
+ 0, 0,0xFEEA, 0, 0,0xFEED,
+ /* plane 0, page 227 */
+ 0 | (255 << 8), /* first, last */
+ 0xFEEE,0xFEEF, 0, 0, 0, 0,0xFEF4, 0,0xFEF6, 0,
+ 0, 0,0xFEFA,0xFEFB, 0,0xFEFD, 0,0x8E40, 0,0x8E42,
+ 0,0x8E44,0x8E45, 0,0x8E47, 0, 0,0x8E4A,0x8E4B, 0,
+ 0,0x8E4E, 0, 0, 0, 0, 0,0x8E54,0x8E55, 0,
+ 0, 0,0x8E59, 0,0x8E5B, 0, 0, 0,0x8E5F,0x8E60,
+ 0, 0, 0,0x8E64,0x8E65, 0, 0, 0, 0,0x8E6A,
+ 0x8E6B,0x8E6C, 0, 0, 0, 0,0x8E71, 0, 0,0x8E74,
+ 0, 0,0x8E77, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8EA2,0x8EA3, 0,0x8EA5, 0, 0, 0, 0, 0,
+ 0,0x8EAC,0x8EAD, 0,0x8EAF, 0,0x8EB1, 0,0x8EB3, 0,
+ 0x8EB5,0x8EB6, 0, 0,0x8EB9, 0, 0, 0, 0, 0,
+ 0,0x8EC0, 0, 0,0x8EC3, 0,0x8EC5,0x8EC6,0x8EC7,0x8EC8,
+ 0x8EC9,0x8ECA, 0,0x8ECC, 0, 0, 0, 0, 0,0x8ED2,
+ 0x8ED3, 0, 0, 0,0x8ED7,0x8ED8,0x8ED9,0x8EDA,0x8EDB, 0,
+ 0,0x8EDE, 0, 0, 0,0x8EE2, 0,0x8EE4,0x8EE5, 0,
+ 0x8EE7, 0,0x8EE9, 0,0x8EEB,0x8EEC,0x8EED, 0,0x8EEF,0x8EF0,
+ 0x8EF1, 0,0x8EF3, 0, 0,0x8EF6,0x8EF7,0x8EF8,0x8EF9,0x8EFA,
+ 0, 0,0x8EFD,0x8EFE, 0, 0, 0,0x8F43,0x8F44,0x8F45,
+ 0x8F46,0x8F47, 0, 0, 0,0x8F4B,0x8F4C,0x8F4D,0x8F4E,0x8F4F,
+ 0x8F50, 0, 0, 0,0x8F54,0x8F55, 0, 0, 0,0x8F59,
+ 0x8F5A, 0, 0,0x8F5D,0x8F5E,0x8F5F, 0,0x8F61, 0,0x8F63,
+ 0x8F64, 0, 0,0x8F67, 0, 0,0x8F6A,0x8F6B,0x8F6C, 0,
+ 0, 0,0x8F70, 0, 0,0x8F73,0x8F74,0x8F75,0x8F76, 0,
+ 0,0x8F79,0x8F7A, 0,0x8F7C, 0, 0,0x8FA1,0x8FA2, 0,
+ 0x8FA4, 0,0x8FA6,0x8FA7,0x8FA8,0x8FA9, 0,0x8FAB,0x8FAC, 0,
+ 0x8FAE, 0, 0,0x8FB1, 0,0x8FB3,
+ /* plane 0, page 228 */
+ 6 | (255 << 8), /* first, last */
+ 0x8FBA, 0, 0,0x8FBD,
+ 0x8FBE,0x8FBF, 0, 0,0x8FC2, 0, 0, 0, 0, 0,
+ 0x8FC8, 0, 0, 0, 0, 0, 0,0x8FCF, 0,0x8FD1,
+ 0x8FD2, 0, 0, 0, 0,0x8FD7, 0,0x8FD9,0x8FDA,0x8FDB,
+ 0x8FDC, 0, 0, 0,0x8FE0,0x8FE1, 0, 0, 0, 0,
+ 0x8FE6, 0, 0, 0,0x8FEA,0x8FEB, 0, 0,0x8FEE,0x8FEF,
+ 0x8FF0,0x8FF1,0x8FF2, 0,0x8FF4,0x8FF5, 0, 0,0x8FF8, 0,
+ 0, 0,0x8FFC,0x8FFD, 0, 0,0x9041,0x9042,0x9043,0x9044,
+ 0x9045,0x9046, 0, 0, 0, 0, 0, 0, 0,0x904E,
+ 0x904F, 0, 0,0x9052,0x9053, 0,0x9055,0x9056,0x9057,0x9058,
+ 0,0x905A, 0,0x905C,0x905D,0x905E,0x905F,0x9060,0x9061, 0,
+ 0x9063,0x9064, 0,0x9066,0x9067, 0,0x9069, 0,0x906B, 0,
+ 0, 0,0x906F, 0, 0, 0,0x9073,0x9074, 0, 0,
+ 0, 0,0x9079, 0,0x907B,0x907C,0x907D,0x907E,0x90A1, 0,
+ 0,0x90A4,0x90A5, 0, 0,0x90A8,0x90A9,0x90AA, 0,0x90AC,
+ 0x90AD,0x90AE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x90B7,0x90B8,0x90B9,0x90BA,0x90BB,0x90BC, 0, 0, 0,0x90C0,
+ 0,0x90C2, 0, 0, 0,0x90C6, 0, 0,0x90C9,0x90CA,
+ 0x90CB,0x90CC,0x90CD,0x90CE,0x90CF,0x90D0,0x90D1, 0, 0, 0,
+ 0x90D5,0x90D6,0x90D7,0x90D8, 0, 0, 0, 0,0x90DD, 0,
+ 0,0x90E0, 0, 0, 0,0x90E4,0x90E5, 0, 0, 0,
+ 0, 0, 0, 0,0x90ED, 0, 0,0x90F0, 0, 0,
+ 0x90F3,0x90F4,0x90F5, 0, 0, 0, 0,0x90FA,0x90FB,0x90FC,
+ 0x90FD,0x90FE,0x9140, 0, 0, 0, 0,0x9145,0x9146,0x9147,
+ 0, 0, 0, 0, 0, 0,0x914E,0x914F,0x9150,0x9151,
+ 0, 0, 0, 0, 0,0x9157,
+ /* plane 0, page 229 */
+ 0 | (254 << 8), /* first, last */
+ 0x9158,0x9159,0x915A, 0, 0,0x915D, 0,0x915F, 0, 0,
+ 0x9162, 0, 0,0x9165,0x9166,0x9167, 0, 0,0x916A, 0,
+ 0x916C, 0,0x916E, 0, 0, 0,0x9172, 0,0x9174,0x9175,
+ 0x9176,0x9177,0x9178,0x9179, 0, 0,0x917C, 0, 0, 0,
+ 0x91A2,0x91A3,0x91A4,0x91A5,0x91A6, 0,0x91A8,0x91A9, 0, 0,
+ 0, 0,0x91AE, 0, 0,0x91B1, 0,0x91B3,0x91B4,0x91B5,
+ 0,0x91B7,0x91B8, 0, 0,0x91BB, 0,0x91BD, 0, 0,
+ 0, 0, 0, 0, 0,0x91C5, 0, 0, 0, 0,
+ 0, 0, 0,0x91CD,0x91CE,0x91CF, 0,0x91D1,0x91D2,0x91D3,
+ 0,0x91D5,0x91D6, 0,0x91D8,0x91D9, 0, 0,0x91DC, 0,
+ 0, 0,0x91E0,0x91E1, 0,0x91E3, 0, 0, 0,0x91E7,
+ 0x91E8, 0,0x91EA, 0,0x91EC,0x91ED,0x91EE,0x91EF,0x91F0,0x91F1,
+ 0x91F2,0x91F3,0x91F4,0x91F5,0x91F6,0x91F7,0x91F8,0x91F9,0x91FA, 0,
+ 0x91FC,0x91FD,0x91FE,0x9240,0x9241, 0,0x9243, 0, 0,0x9246,
+ 0x9247,0x9248,0x9249,0x924A,0x924B,0x924C,0x924D,0x924E,0x924F, 0,
+ 0x9251,0x9252,0x9253, 0,0x9255, 0,0x9257,0x9258,0x9259,0x925A,
+ 0x925B,0x925C, 0, 0,0x925F, 0,0x9261,0x9262,0x9263, 0,
+ 0x9265, 0, 0, 0,0x9269,0x926A, 0,0x926C,0x926D, 0,
+ 0,0x9270, 0,0x9272,0x9273,0x9274,0x9275,0x9276,0x9277, 0,
+ 0x9279,0x927A,0x927B, 0,0x927D, 0, 0, 0, 0, 0,
+ 0x92A5,0x92A6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x92B4,0x92B5,0x92B6, 0,0x92B8,
+ 0x92B9, 0, 0,0x92BC,0x92BD,0x92BE,0x92BF,0x92C0, 0,0x92C2,
+ 0x92C3, 0, 0,0x92C6, 0, 0,0x92C9, 0,0x92CB,0x92CC,
+ 0x92CD,0x92CE, 0,0x92D0, 0,0x92D2, 0, 0, 0, 0,
+ 0x92D7,0x92D8,0x92D9, 0,0x92DB,
+ /* plane 0, page 230 */
+ 0 | (255 << 8), /* first, last */
+ 0x92DD, 0,0x92DF, 0,0x92E1, 0, 0, 0, 0, 0,
+ 0, 0,0x92E9, 0, 0,0x92EC,0x92ED,0x92EE,0x92EF, 0,
+ 0, 0, 0, 0, 0,0x92F6,0x92F7,0x92F8,0x92F9,0x92FA,
+ 0, 0, 0,0x92FE, 0,0x9341,0x9342, 0, 0,0x9345,
+ 0,0x9347, 0,0x9349, 0,0x934B, 0, 0, 0, 0,
+ 0x9350,0x9351,0x9352, 0, 0,0x9355,0x9356,0x9357,0x9358,0x9359,
+ 0x935A,0x935B, 0,0x935D,0x935E,0x935F,0x9360, 0, 0,0x9363,
+ 0x9364, 0,0x9366, 0, 0,0x9369, 0, 0,0x936C,0x936D,
+ 0,0x936F,0x9370,0x9371,0x9372,0x9373, 0,0x9375,0x9376,0x9377,
+ 0, 0, 0,0x937B,0x937C,0x937D,0x937E, 0,0x93A2,0x93A3,
+ 0x93A4,0x93A5,0x93A6,0x93A7,0x93A8, 0,0x93AA, 0, 0, 0,
+ 0x93AE,0x93AF, 0,0x93B1, 0, 0, 0,0x93B5,0x93B6,0x93B7,
+ 0x93B8,0x93B9, 0,0x93BB,0x93BC,0x93BD, 0,0x93BF,0x93C0,0x93C1,
+ 0x93C2,0x93C3,0x93C4,0x93C5,0x93C6,0x93C7,0x93C8, 0,0x93CA,0x93CB,
+ 0x93CC,0x93CD,0x93CE,0x93CF,0x93D0, 0,0x93D2, 0,0x93D4, 0,
+ 0x93D6,0x93D7, 0,0x93D9,0x93DA, 0,0x93DC,0x93DD,0x93DE,0x93DF,
+ 0x93E0,0x93E1,0x93E2, 0,0x93E4, 0,0x93E6, 0, 0,0x93E9,
+ 0,0x93EB,0x93EC,0x93ED, 0, 0, 0, 0,0x93F2, 0,
+ 0, 0,0x93F6, 0, 0,0x93F9,0x93FA, 0, 0,0x93FD,
+ 0x93FE, 0,0x9441,0x9442, 0, 0, 0,0x9446, 0,0x9448,
+ 0x9449, 0,0x944B, 0, 0, 0, 0, 0, 0,0x9452,
+ 0x9453, 0, 0, 0, 0,0x9458,0x9459, 0,0x945B,0x945C,
+ 0,0x945E,0x945F,0x9460,0x9461,0x9462,0x9463,0x9464,0x9465,0x9466,
+ 0x9467, 0,0x9469, 0, 0, 0, 0,0x946E,0x946F,0x9470,
+ 0,0x9472,0x9473,0x9474,0x9475, 0, 0,0x9478,0x9479, 0,
+ 0x947B,0x947C,0x947D,0x947E,0x94A1,0x94A2,
+ /* plane 0, page 231 */
+ 0 | (255 << 8), /* first, last */
+ 0x94A3,0x94A4,0x94A5, 0, 0, 0,0x94A9,0x94AA, 0,0x94AC,
+ 0x94AD, 0,0x94AF, 0, 0, 0,0x94B3,0x94B4,0x94B5,0x94B6,
+ 0, 0,0x94B9,0x94BA,0x94BB,0x94BC,0x94BD,0x94BE, 0,0x94C0,
+ 0, 0, 0, 0, 0, 0,0x94C7,0x94C8,0x94C9, 0,
+ 0, 0, 0,0x94CE, 0, 0,0x94D1,0x94D2,0x94D3, 0,
+ 0,0x94D6,0x94D7,0x94D8,0x94D9,0x94DA,0x94DB, 0,0x94DD,0x94DE,
+ 0x94DF,0x94E0, 0, 0,0x94E3,0x94E4,0x94E5, 0,0x94E7, 0,
+ 0,0x94EA, 0,0x94EC, 0, 0,0x94EF,0x94F0,0x94F1,0x94F2,
+ 0,0x94F4,0x94F5, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x94FE,0x9540,0x9541, 0,0x9543,0x9544,0x9545,0x9546, 0,
+ 0x9548,0x9549, 0,0x954B,0x954C,0x954D, 0, 0,0x9550,0x9551,
+ 0x9552, 0,0x9554, 0, 0, 0, 0,0x9559,0x955A,0x955B,
+ 0x955C, 0,0x955E, 0,0x9560,0x9561,0x9562, 0,0x9564, 0,
+ 0, 0,0x9568, 0,0x956A, 0, 0,0x956D, 0,0x956F,
+ 0,0x9571, 0,0x9573,0x9574, 0,0x9576, 0,0x9578, 0,
+ 0x957A,0x957B, 0,0x957D, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x95A8, 0,0x95AA,0x95AB,0x95AC,0x95AD,0x95AE,0x95AF,
+ 0x95B0, 0,0x95B2,0x95B3,0x95B4, 0, 0,0x95B7, 0, 0,
+ 0x95BA, 0, 0, 0,0x95BE, 0, 0, 0,0x95C2, 0,
+ 0, 0,0x95C6,0x95C7, 0, 0,0x95CA, 0, 0,0x95CD,
+ 0, 0,0x95D0,0x95D1, 0, 0,0x95D4, 0,0x95D6,0x95D7,
+ 0, 0, 0,0x95DB, 0, 0,0x95DE,0x95DF,0x95E0, 0,
+ 0x95E2,0x95E3, 0, 0, 0, 0, 0, 0,0x95EA, 0,
+ 0x95EC,0x95ED,0x95EE,0x95EF,0x95F0,0x95F1, 0,0x95F3,0x95F4,0x95F5,
+ 0x95F6,0x95F7,0x95F8,0x95F9, 0, 0,0x95FC, 0,0x95FE, 0,
+ 0x9641,0x9642,0x9643, 0, 0,0x9646,
+ /* plane 0, page 232 */
+ 0 | (254 << 8), /* first, last */
+ 0x9647,0x9648,0x9649, 0, 0, 0,0x964D, 0,0x964F, 0,
+ 0, 0,0x9653, 0,0x9655,0x9656, 0,0x9658, 0,0x965A,
+ 0,0x965C,0x965D,0x965E,0x965F, 0,0x9661,0x9662, 0,0x9664,
+ 0, 0, 0,0x9668,0x9669, 0,0x966B, 0, 0,0x966E,
+ 0x966F, 0, 0, 0, 0,0x9674,0x9675,0x9676, 0,0x9678,
+ 0x9679, 0, 0,0x967C, 0,0x967E,0x96A1, 0,0x96A3,0x96A4,
+ 0,0x96A6, 0,0x96A8, 0,0x96AA,0x96AB, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x96B4, 0,0x96B6,0x96B7, 0,
+ 0x96B9,0x96BA, 0,0x96BC, 0,0x96BE,0x96BF,0x96C0,0x96C1, 0,
+ 0,0x96C4,0x96C5,0x96C6, 0,0x96C8,0x96C9,0x96CA,0x96CB, 0,
+ 0,0x96CE,0x96CF,0x96D0, 0,0x96D2,0x96D3,0x96D4,0x96D5,0x96D6,
+ 0, 0, 0,0x96DA, 0, 0, 0, 0,0x96DF, 0,
+ 0x96E1, 0, 0, 0, 0,0x96E6,0x96E7,0x96E8,0x96E9, 0,
+ 0, 0, 0, 0, 0,0x96F0, 0, 0, 0, 0,
+ 0, 0,0x96F7,0x96F8, 0,0x96FA,0x96FB, 0,0x96FD,0x96FE,
+ 0, 0, 0,0x9743,0x9744,0x9745,0x9746,0x9747, 0, 0,
+ 0x974A,0x974B, 0,0x974D,0x974E,0x974F,0x9750,0x9751, 0,0x9753,
+ 0x9754, 0,0x9756,0x9757,0x9758,0x9759,0x975A, 0, 0,0x975D,
+ 0,0x975F,0x9760,0x9761,0x9762, 0, 0, 0,0x9766,0x9767,
+ 0x9768,0x9769,0x976A,0x976B,0x976C,0x976D, 0,0x976F, 0,0x9771,
+ 0, 0, 0,0x9775, 0,0x9777,0x9778, 0,0x977A,0x977B,
+ 0x977C,0x977D, 0,0x97A1,0x97A2, 0,0x97A4,0x97A5,0x97A6, 0,
+ 0,0x97A9, 0,0x97AB,0x97AC,0x97AD,0x97AE, 0,0x97B0,0x97B1,
+ 0x97B2, 0,0x97B4,0x97B5,0x97B6, 0,0x97B8,0x97B9,0x97BA, 0,
+ 0,0x97BD,0x97BE, 0,0x97C0,0x97C1,0x97C2,0x97C3, 0,0x97C5,
+ 0x97C6,0x97C7, 0,0x97C9,0x97CA,
+ /* plane 0, page 233 */
+ 0 | (254 << 8), /* first, last */
+ 0x97CC,0x97CD, 0,0x97CF, 0, 0,0x97D2,0x97D3,0x97D4, 0,
+ 0,0x97D7,0x97D8, 0,0x97DA,0x97DB,0x97DC,0x97DD,0x97DE, 0,
+ 0,0x97E1, 0,0x97E3,0x97E4, 0, 0,0x97E7,0x97E8, 0,
+ 0x97EA,0x97EB,0x97EC,0x97ED,0x97EE, 0, 0,0x97F1,0x97F2,0x97F3,
+ 0x97F4,0x97F5,0x97F6,0x97F7,0x97F8, 0,0x97FA,0x97FB, 0,0x97FD,
+ 0x97FE,0x9840,0x9841,0x9842,0x9843, 0,0x9845, 0,0x9847, 0,
+ 0x9849,0x984A,0x984B, 0, 0,0x984E, 0, 0,0x9851,0x9852,
+ 0x9853, 0,0x9855,0x9856, 0, 0, 0,0x985A, 0, 0,
+ 0x985D, 0,0x985F,0x9860,0x9861,0x9862, 0,0x9864,0x9865, 0,
+ 0x9867, 0,0x9869,0x986A,0x986B, 0,0x986D,0x986E, 0, 0,
+ 0x9871,0x9872, 0,0x9874,0x9875, 0, 0, 0,0x9879, 0,
+ 0x987B,0x987C, 0, 0, 0,0x98A2,0x98A3,0x98A4, 0,0x98A6,
+ 0x98A7,0x98A8,0x98A9,0x98AA, 0,0x98AC, 0, 0, 0,0x98B0,
+ 0x98B1, 0, 0, 0, 0,0x98B6, 0, 0,0x98B9, 0,
+ 0,0x98BC,0x98BD, 0, 0,0x98C0, 0, 0,0x98C3, 0,
+ 0x98C5, 0, 0, 0, 0, 0,0x98CB,0x98CC,0x98CD,0x98CE,
+ 0,0x98D0,0x98D1, 0, 0, 0, 0,0x98D6, 0, 0,
+ 0x98D9, 0,0x98DB, 0,0x98DD, 0,0x98DF, 0, 0, 0,
+ 0,0x98E4, 0,0x98E6, 0,0x98E8,0x98E9, 0,0x98EB,0x98EC,
+ 0, 0, 0, 0, 0, 0, 0,0x98F4, 0, 0,
+ 0, 0, 0,0x98FA, 0, 0, 0,0x98FE,0x9940, 0,
+ 0, 0, 0, 0,0x9946, 0,0x9948, 0, 0,0x994B,
+ 0, 0,0x994E, 0, 0, 0, 0, 0, 0,0x9955,
+ 0x9956, 0, 0,0x9959, 0,0x995B, 0, 0, 0,0x995F,
+ 0, 0, 0, 0, 0, 0, 0,0x9967, 0, 0,
+ 0, 0, 0, 0,0x996E,
+ /* plane 0, page 234 */
+ 3 | (255 << 8), /* first, last */
+ 0x9973, 0, 0, 0, 0, 0, 0,
+ 0x997A,0x997B, 0, 0, 0,0x99A1, 0, 0, 0,0x99A5,
+ 0,0x99A7, 0, 0, 0, 0, 0,0x99AD, 0, 0,
+ 0, 0, 0,0x99B3, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x99BC, 0, 0, 0, 0, 0, 0,0x99C3,
+ 0, 0, 0,0x99C7, 0, 0, 0, 0, 0, 0,
+ 0x99CE,0x99CF, 0, 0, 0, 0, 0,0x99D5, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x99DE, 0, 0,0x99E1,
+ 0, 0, 0, 0, 0, 0, 0,0x99E9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x99F5,
+ 0, 0,0x99F8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9A48,0x9A49, 0,
+ 0, 0, 0, 0, 0,0x9A50, 0, 0, 0, 0,
+ 0x9A55, 0, 0,0x9A58, 0,0x9A5A, 0,0x9A5C, 0, 0,
+ 0,0x9A60, 0, 0,0x9A63, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9A6E, 0,0x9A70, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9A79, 0,0x9A7B,0x9A7C,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9AB4,0x9AB5,0x9AB6, 0, 0, 0,0x9ABA, 0, 0,
+ 0x9ABD,0x9ABE,0x9ABF,0x9AC0,0x9AC1, 0, 0,0x9AC4,0x9AC5,0x9AC6,
+ 0,0x9AC8,0x9AC9, 0,0x9ACB,0x9ACC,0x9ACD,0x9ACE,0x9ACF, 0,
+ 0x9AD1, 0,0x9AD3,0x9AD4,0x9AD5,0x9AD6,0x9AD7,0x9AD8, 0, 0,
+ 0,0x9ADC,0x9ADD,0x9ADE,0x9ADF,0x9AE0,0x9AE1, 0,0x9AE3, 0,
+ 0x9AE5,0x9AE6,0x9AE7, 0,0x9AE9,0x9AEA,0x9AEB,0x9AEC,0x9AED,0x9AEE,
+ 0x9AEF,0x9AF0, 0, 0,0x9AF3,0x9AF4,
+ /* plane 0, page 235 */
+ 0 | (255 << 8), /* first, last */
+ 0x9AF5, 0,0x9AF7,0x9AF8,0x9AF9,0x9AFA, 0, 0,0x9AFD,0x9AFE,
+ 0x9B40,0x9B41,0x9B42,0x9B43,0x9B44,0x9B45, 0,0x9B47,0x9B48, 0,
+ 0,0x9B4B, 0,0x9B4D,0x9B4E,0x9B4F,0x9B50,0x9B51,0x9B52,0x9B53,
+ 0,0x9B55,0x9B56,0x9B57, 0,0x9B59, 0,0x9B5B, 0,0x9B5D,
+ 0, 0,0x9B60, 0,0x9B62,0x9B63,0x9B64,0x9B65,0x9B66,0x9B67,
+ 0x9B68,0x9B69,0x9B6A,0x9B6B,0x9B6C,0x9B6D,0x9B6E,0x9B6F, 0, 0,
+ 0,0x9B73,0x9B74,0x9B75, 0,0x9B77, 0,0x9B79,0x9B7A, 0,
+ 0x9B7C, 0, 0, 0,0x9BA2,0x9BA3,0x9BA4,0x9BA5,0x9BA6,0x9BA7,
+ 0x9BA8,0x9BA9,0x9BAA,0x9BAB,0x9BAC,0x9BAD,0x9BAE,0x9BAF,0x9BB0,0x9BB1,
+ 0x9BB2,0x9BB3, 0,0x9BB5, 0,0x9BB7,0x9BB8,0x9BB9,0x9BBA,0x9BBB,
+ 0,0x9BBD,0x9BBE,0x9BBF,0x9BC0,0x9BC1,0x9BC2,0x9BC3, 0,0x9BC5,
+ 0,0x9BC7,0x9BC8,0x9BC9, 0,0x9BCB,0x9BCC, 0,0x9BCE,0x9BCF,
+ 0x9BD0, 0,0x9BD2, 0, 0, 0,0x9BD6,0x9BD7,0x9BD8,0x9BD9,
+ 0,0x9BDB,0x9BDC,0x9BDD, 0,0x9BDF,0x9BE0,0x9BE1,0x9BE2,0x9BE3,
+ 0x9BE4,0x9BE5,0x9BE6,0x9BE7,0x9BE8, 0,0x9BEA,0x9BEB, 0,0x9BED,
+ 0x9BEE,0x9BEF,0x9BF0,0x9BF1,0x9BF2,0x9BF3, 0, 0, 0,0x9BF7,
+ 0x9BF8, 0,0x9BFA,0x9BFB, 0,0x9BFD,0x9BFE, 0,0x9C41, 0,
+ 0x9C43,0x9C44, 0,0x9C46,0x9C47,0x9C48,0x9C49,0x9C4A,0x9C4B,0x9C4C,
+ 0x9C4D, 0,0x9C4F, 0, 0,0x9C52, 0, 0,0x9C55,0x9C56,
+ 0,0x9C58, 0, 0,0x9C5B,0x9C5C, 0,0x9C5E,0x9C5F,0x9C60,
+ 0x9C61, 0,0x9C63, 0,0x9C65,0x9C66,0x9C67, 0,0x9C69, 0,
+ 0,0x9C6C, 0,0x9C6E,0x9C6F,0x9C70,0x9C71, 0,0x9C73,0x9C74,
+ 0,0x9C76, 0,0x9C78,0x9C79,0x9C7A, 0, 0,0x9C7D, 0,
+ 0x9CA1,0x9CA2,0x9CA3,0x9CA4,0x9CA5,0x9CA6,0x9CA7, 0,0x9CA9,0x9CAA,
+ 0,0x9CAC,0x9CAD, 0, 0,0x9CB0,0x9CB1, 0, 0,0x9CB4,
+ 0x9CB5,0x9CB6, 0,0x9CB8,0x9CB9,0x9CBA,
+ /* plane 0, page 236 */
+ 0 | (252 << 8), /* first, last */
+ 0x9CBB, 0, 0,0x9CBE, 0,0x9CC0,0x9CC1, 0,0x9CC3,0x9CC4,
+ 0,0x9CC6,0x9CC7,0x9CC8,0x9CC9,0x9CCA,0x9CCB, 0, 0,0x9CCE,
+ 0x9CCF, 0,0x9CD1,0x9CD2,0x9CD3,0x9CD4,0x9CD5,0x9CD6,0x9CD7,0x9CD8,
+ 0, 0,0x9CDB, 0,0x9CDD, 0,0x9CDF, 0,0x9CE1, 0,
+ 0, 0,0x9CE5,0x9CE6,0x9CE7,0x9CE8,0x9CE9,0x9CEA, 0,0x9CEC,
+ 0x9CED, 0, 0,0x9CF0, 0,0x9CF2, 0, 0, 0,0x9CF6,
+ 0x9CF7,0x9CF8, 0,0x9CFA,0x9CFB,0x9CFC,0x9CFD,0x9CFE,0x9D40,0x9D41,
+ 0x9D42,0x9D43,0x9D44,0x9D45,0x9D46,0x9D47,0x9D48,0x9D49, 0,0x9D4B,
+ 0, 0,0x9D4E,0x9D4F,0x9D50,0x9D51,0x9D52,0x9D53,0x9D54, 0,
+ 0x9D56, 0,0x9D58,0x9D59, 0,0x9D5B,0x9D5C,0x9D5D,0x9D5E,0x9D5F,
+ 0, 0, 0,0x9D63,0x9D64,0x9D65,0x9D66,0x9D67,0x9D68,0x9D69,
+ 0x9D6A,0x9D6B,0x9D6C,0x9D6D,0x9D6E,0x9D6F, 0,0x9D71,0x9D72,0x9D73,
+ 0,0x9D75, 0,0x9D77,0x9D78, 0,0x9D7A,0x9D7B,0x9D7C, 0,
+ 0, 0,0x9DA2, 0,0x9DA4,0x9DA5, 0, 0, 0, 0,
+ 0x9DAA,0x9DAB,0x9DAC,0x9DAD, 0,0x9DAF,0x9DB0,0x9DB1,0x9DB2,0x9DB3,
+ 0x9DB4,0x9DB5,0x9DB6,0x9DB7,0x9DB8,0x9DB9, 0,0x9DBB,0x9DBC, 0,
+ 0x9DBE, 0, 0,0x9DC1,0x9DC2, 0, 0,0x9DC5,0x9DC6, 0,
+ 0,0x9DC9, 0,0x9DCB,0x9DCC,0x9DCD,0x9DCE, 0, 0, 0,
+ 0x9DD2, 0,0x9DD4, 0, 0,0x9DD7,0x9DD8,0x9DD9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9DED,0x9DEE, 0,
+ 0, 0,0x9DF2,0x9DF3, 0, 0, 0, 0, 0,0x9DF9,
+ 0x9DFA, 0,0x9DFC,0x9DFD,0x9DFE,0x9E40, 0, 0, 0,0x9E44,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9E4F, 0,0x9E51, 0,0x9E53,0x9E54, 0, 0, 0, 0,
+ 0, 0,0x9E5B,
+ /* plane 0, page 237 */
+ 4 | (245 << 8), /* first, last */
+ 0x9E63,0x9E64, 0,0x9E66, 0, 0,
+ 0x9E69, 0,0x9E6B,0x9E6C,0x9E6D,0x9E6E,0x9E6F,0x9E70, 0,0x9E72,
+ 0,0x9E74,0x9E75,0x9E76,0x9E77, 0,0x9E79,0x9E7A,0x9E7B,0x9E7C,
+ 0x9E7D,0x9E7E, 0, 0,0x9EA3,0x9EA4,0x9EA5,0x9EA6,0x9EA7,0x9EA8,
+ 0,0x9EAA,0x9EAB, 0,0x9EAD,0x9EAE, 0, 0, 0, 0,
+ 0,0x9EB4, 0, 0, 0,0x9EB8,0x9EB9, 0,0x9EBB,0x9EBC,
+ 0,0x9EBE, 0, 0, 0,0x9EC2,0x9EC3, 0,0x9EC5,0x9EC6,
+ 0,0x9EC8,0x9EC9, 0,0x9ECB,0x9ECC,0x9ECD,0x9ECE,0x9ECF,0x9ED0,
+ 0,0x9ED2,0x9ED3,0x9ED4,0x9ED5, 0, 0,0x9ED8,0x9ED9,0x9EDA,
+ 0, 0,0x9EDD,0x9EDE,0x9EDF,0x9EE0, 0, 0,0x9EE3, 0,
+ 0x9EE5, 0,0x9EE7, 0, 0, 0, 0,0x9EEC, 0,0x9EEE,
+ 0,0x9EF0, 0,0x9EF2,0x9EF3, 0, 0,0x9EF6, 0,0x9EF8,
+ 0x9EF9, 0,0x9EFB,0x9EFC, 0, 0, 0, 0, 0,0x9F43,
+ 0, 0,0x9F46,0x9F47,0x9F48, 0,0x9F4A,0x9F4B,0x9F4C,0x9F4D,
+ 0, 0,0x9F50, 0, 0,0x9F53, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9F68, 0, 0, 0,
+ 0, 0, 0, 0,0x9F70, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9FA5, 0, 0, 0, 0,0x9FAA, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9FB3, 0,0x9FB5,
+ 0, 0, 0, 0, 0,0x9FBB, 0, 0,0x9FBE,0x9FBF,
+ 0,0x9FC1, 0, 0, 0,0x9FC5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9FD1, 0, 0,
+ 0, 0, 0,0x9FD7, 0,0x9FD9,
+ /* plane 0, page 238 */
+ 8 | (183 << 8), /* first, last */
+ 0x9FEC, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9FF5, 0, 0,
+ 0,0x9FF9, 0, 0, 0, 0, 0,0xA040, 0, 0,
+ 0, 0,0xA045, 0,0xA047, 0, 0, 0, 0, 0,
+ 0, 0,0xA04F, 0, 0, 0,0xA053, 0,0xA055,0xA056,
+ 0, 0,0xA059, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xA068, 0,0xA06A,
+ 0, 0,0xA06D, 0,0xA06F, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA078, 0, 0,0xA07B, 0, 0,0xA07E,
+ 0,0xA0A2, 0,0xA0A4, 0, 0,0xA0A7, 0, 0, 0,
+ 0xA0AB,0xA0AC, 0, 0, 0, 0,0xA0B1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA0BD, 0,
+ 0, 0, 0, 0,0xA0C3, 0,0xA0C5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xA0D0, 0, 0,
+ 0, 0, 0, 0, 0,0xA0D8, 0,0xA0DA, 0, 0,
+ 0,0xA0DE, 0, 0, 0, 0,0xA0E3, 0, 0,0xA0E6,
+ 0,0xA0E8,0xA0E9,0xA0EA,0xA0EB,0xA0EC,0xA0ED,0xA0EE,0xA0EF,0xA0F0,
+ 0xA0F1, 0,0xA0F3,0xA0F4,0xA0F5,0xA0F6,0xA0F7,0xA0F8,0xA0F9, 0,
+ 0xA0FB, 0, 0,0xA0FE,
+ /* plane 0, page 239: --- */
+ /* plane 0, page 240: --- */
+ /* plane 0, page 241: --- */
+ /* plane 0, page 242: --- */
+ /* plane 0, page 243 */
+ 3 | (253 << 8), /* first, last */
+ 0x8840,0x8841,0x8842,0x8843,0x8844,0x8845,0x8846,
+ 0x8847,0x8848,0x8849,0x884A,0x884B,0x884C,0x884D,0x884E,0x884F,0x8850,
+ 0x8851,0x8852,0x8853,0x8854,0x8855, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8862, 0,0x8864,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x88A3, 0,
+ 0x88A5, 0, 0, 0,0x88A9,0x88AA, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8940,0x8941, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x894C, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x89B2, 0, 0, 0, 0,0x89B7, 0, 0,0x89BA,0x89BB,
+ 0x89BC, 0,0x89BE,0x89BF,
+ /* plane 0, page 244 */
+ 3 | (255 << 8), /* first, last */
+ 0x89C5, 0, 0, 0, 0,0x89CA,0x89CB,
+ 0x89CC,0x89CD, 0, 0, 0, 0, 0, 0, 0,0x89D5,
+ 0,0x89D7, 0, 0,0x89DA,0x89DB,0x89DC, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x89E6, 0,0x89E8, 0,
+ 0x89EA, 0, 0,0x89ED,0x89EE,0x89EF, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x89F9, 0,0x89FB,0x89FC, 0,
+ 0x89FE,0x8A40, 0, 0,0x8A43,0x8A44,0x8A45, 0,0x8A47,0x8A48,
+ 0x8A49, 0,0x8A4B,0x8A4C,0x8A4D,0x8A4E, 0,0x8A50,0x8A51,0x8A52,
+ 0x8A53,0x8A54,0x8A55, 0,0x8A57,0x8A58,0x8A59,0x8A5A, 0, 0,
+ 0x8A5D,0x8A5E,0x8A5F,0x8A60,0x8A61,0x8A62, 0,0x8A64,0x8A65,0x8A66,
+ 0x8A67,0x8A68,0x8A69, 0,0x8A6B,0x8A6C,0x8A6D,0x8A6E,0x8A6F,0x8A70,
+ 0x8A71,0x8A72, 0, 0, 0,0x8A76,0x8A77, 0, 0,0x8A7A,
+ 0x8A7B,0x8A7C,0x8A7D,0x8A7E,0x8AA1,0x8AA2,0x8AA3, 0,0x8AA5,0x8AA6,
+ 0,0x8AA8,0x8AA9,0x8AAA, 0,0x8AAC,0x8AAD,0x8AAE, 0,0x8AB0,
+ 0,0x8AB2,0x8AB3,0x8AB4,0x8AB5,0x8AB6, 0,0x8AB8,0x8AB9, 0,
+ 0x8ABB,0x8ABC,0x8ABD, 0, 0,0x8AC0, 0,0x8AC2,0x8AC3, 0,
+ 0, 0,0x8AC7, 0,0x8AC9,0x8ACA,0x8ACB,0x8ACC, 0,0x8ACE,
+ 0x8ACF,0x8AD0,0x8AD1,0x8AD2,0x8AD3,0x8AD4,0x8AD5, 0,0x8AD7,0x8AD8,
+ 0x8AD9,0x8ADA, 0,0x8ADC, 0, 0,0x8ADF,0x8AE0,0x8AE1,0x8AE2,
+ 0x8AE3,0x8AE4,0x8AE5,0x8AE6, 0,0x8AE8,0x8AE9,0x8AEA,0x8AEB,0x8AEC,
+ 0x8AED,0x8AEE,0x8AEF,0x8AF0,0x8AF1,0x8AF2,0x8AF3,0x8AF4, 0,0x8AF6,
+ 0x8AF7,0x8AF8,0x8AF9,0x8AFA,0x8AFB,0x8AFC, 0,0x8AFE,0x8B40,0x8B41,
+ 0x8B42,0x8B43,0x8B44,0x8B45,0x8B46,0x8B47,0x8B48,0x8B49,0x8B4A,0x8B4B,
+ 0x8B4C,0x8B4D,0x8B4E,0x8B4F, 0, 0, 0, 0, 0,0x8B55,
+ 0, 0,0x8B58,0x8B59, 0, 0, 0, 0,0x8B5E, 0,
+ 0x8B60, 0,0x8B62, 0,0x8B64,0x8B65,
+ /* plane 0, page 245 */
+ 0 | (239 << 8), /* first, last */
+ 0x8B66,0x8B67,0x8B68,0x8B69,0x8B6A,0x8B6B, 0,0x8B6D,0x8B6E,0x8B6F,
+ 0x8B70,0x8B71,0x8B72,0x8B73,0x8B74,0x8B75,0x8B76,0x8B77, 0,0x8B79,
+ 0x8B7A,0x8B7B,0x8B7C, 0,0x8B7E,0x8BA1,0x8BA2,0x8BA3,0x8BA4,0x8BA5,
+ 0x8BA6,0x8BA7,0x8BA8,0x8BA9,0x8BAA,0x8BAB,0x8BAC,0x8BAD,0x8BAE, 0,
+ 0,0x8BB1,0x8BB2, 0, 0,0x8BB5,0x8BB6, 0,0x8BB8, 0,
+ 0,0x8BBB,0x8BBC, 0,0x8BBE, 0, 0, 0,0x8BC2,0x8BC3,
+ 0,0x8BC5, 0, 0,0x8BC8, 0, 0, 0,0x8BCC, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8BD6, 0,
+ 0, 0, 0,0x8BDB,0x8BDC, 0,0x8BDE, 0, 0,0x8BE1,
+ 0x8BE2, 0, 0, 0,0x8BE6, 0, 0, 0, 0, 0,
+ 0,0x8BED, 0, 0, 0, 0, 0,0x8BF3, 0, 0,
+ 0, 0, 0, 0,0x8BFA, 0, 0, 0, 0, 0,
+ 0,0x8C42,0x8C43,0x8C44, 0,0x8C46, 0, 0,0x8C49,0x8C4A,
+ 0x8C4B,0x8C4C, 0,0x8C4E, 0, 0, 0, 0, 0,0x8C54,
+ 0x8C55,0x8C56,0x8C57,0x8C58, 0, 0, 0,0x8C5C,0x8C5D, 0,
+ 0x8C5F,0x8C60, 0, 0, 0,0x8C64,0x8C65, 0, 0, 0,
+ 0x8C69, 0, 0,0x8C6C,0x8C6D, 0, 0, 0, 0, 0,
+ 0,0x8C74, 0, 0, 0, 0,0x8C79, 0, 0, 0,
+ 0x8C7D, 0,0x8CA1, 0, 0,0x8CA4, 0, 0, 0,0x8CA8,
+ 0,0x8CAA,0x8CAB, 0, 0, 0,0x8CAF,0x8CB0, 0, 0,
+ 0, 0, 0, 0,0x8CB7, 0,0x8CB9, 0,0x8CBB, 0,
+ 0, 0, 0,0x8CC0,0x8CC1,0x8CC2,0x8CC3,0x8CC4, 0, 0,
+ 0, 0, 0, 0,0x8CCB, 0, 0, 0,0x8CCF, 0,
+ 0x8CD1,0x8CD2,0x8CD3, 0,0x8CD5,0x8CD6,0x8CD7,0x8CD8, 0,0x8CDA,
+ /* plane 0, page 246 */
+ 55 | (240 << 8), /* first, last */
+ 0x8D63,0x8D64, 0, 0,0x8D67,
+ 0x8D68, 0, 0, 0, 0,0x8D6D,0x8D6E,0x8D6F,0x8D70, 0,
+ 0, 0,0x8D74, 0, 0, 0,0x8D78, 0, 0, 0,
+ 0,0x8D7D, 0,0x8DA1, 0, 0, 0, 0,0x8DA6, 0,
+ 0, 0, 0,0x8DAB, 0,0x8DAD, 0, 0,0x8DB0, 0,
+ 0x8DB2, 0,0x8DB4, 0, 0,0x8DB7, 0, 0,0x8DBA,0x8DBB,
+ 0x8DBC, 0, 0, 0, 0, 0, 0,0x8DC3, 0,0x8DC5,
+ 0, 0, 0, 0,0x8DCA, 0,0x8DCC, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8DD6, 0, 0, 0,
+ 0,0x8DDB, 0, 0, 0, 0, 0, 0,0x8DE2, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8DEB,0x8DEC, 0,
+ 0,0x8DEF,0x8DF0, 0, 0,0x8DF3, 0,0x8DF5, 0, 0,
+ 0, 0, 0,0x8DFB,0x8DFC,0x8DFD,0x8DFE, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xC6CD, 0, 0,0xC6CF, 0, 0, 0,0xC6D3, 0,
+ 0xC6D5, 0,0xC6D7, 0, 0, 0, 0, 0, 0,0xC6DE,
+ 0xC6DF,
+ /* plane 0, page 247 */
+ 229 | (238 << 8), /* first, last */
+ 0xC879,
+ 0xC87A, 0,0xC87C, 0,0xC87E,0xC8A1, 0,0xC8A3,0xC8A4,
+ /* plane 0, page 248 */
+ 32 | (59 << 8), /* first, last */
+ 0xC8D6,0xC8D7,0xC8D8,0xC8D9,0xC8DA,0xC8DB,0xC8DC,0xC8DD,
+ 0xC8DE,0xC8DF,0xC8E0,0xC8E1,0xC8E2,0xC8E3,0xC8E4,0xC8E5,0xC8E6,0xC8E7,
+ 0xC8E8,0xC8E9,0xC8EA,0xC8EB,0xC8EC,0xC8ED,0xC8EE,0xC8EF,0xC8F0,0xC8F1,
+ /* plane 0, page 249 */
+ 7 | (7 << 8), /* first, last */
+ 0x8BF8,
+ /* plane 0, page 250: --- */
+ /* plane 0, page 251: --- */
+ /* plane 0, page 252: --- */
+ /* plane 0, page 253: --- */
+ /* plane 0, page 254: --- */
+ /* plane 0, page 255 */
+ 2 | (237 << 8), /* first, last */
+ 0xC8D0, 0, 0, 0, 0,0xC8CF, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xC6E4,
+ 0,0xC6E5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xC8CD, 0,0xC8CE, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xF9FE,
+ /* plane 1: --- */
+ /* plane 2, page 0 */
+ 33 | (238 << 8), /* first, last */
+ 0x9C71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9375, 0, 0, 0, 0, 0, 0, 0,
+ 0x9376, 0, 0, 0, 0, 0, 0, 0,0x9548, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8EC6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8BC5,0x8BFA, 0, 0,0xC87C, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9AB4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x884E,0x884B,0xC87A,0x8848, 0, 0, 0,0x8847,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA0F6,
+ /* plane 2, page 1 */
+ 12 | (242 << 8), /* first, last */
+ 0x8845, 0,0x8853, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFCAD, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8AAD,
+ 0,0x9272, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFC47, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x94DF, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9FD1,
+ /* plane 2, page 2 */
+ 4 | (229 << 8), /* first, last */
+ 0xFBCB, 0, 0, 0, 0, 0,
+ 0, 0,0x927D, 0, 0, 0, 0, 0, 0, 0,
+ 0x98A4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x94E7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x90CB,0x927B, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x94D8, 0, 0, 0, 0,0xFC5F, 0,
+ 0xFA54, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9AB5, 0, 0, 0, 0, 0, 0,
+ 0,0x96DA,0x9279, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFA74,
+ /* plane 2, page 3 */
+ 10 | (252 << 8), /* first, last */
+ 0x9275, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8DFB, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8A49, 0, 0, 0,0x92DF,
+ 0x9B7C,0xFA63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFA60,0x926D,0xFA62, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9AB6, 0, 0, 0, 0, 0, 0,0x976B, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFD6A, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFD54, 0,0x9273, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x97D8, 0, 0, 0, 0,
+ 0, 0,0x9FBB,
+ /* plane 2, page 4 */
+ 19 | (254 << 8), /* first, last */
+ 0x9342,
+ 0x9276, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFA65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x926C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFA6E, 0, 0, 0, 0,
+ 0, 0,0x9EE0, 0, 0,0x92C0,0x92BF, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x92BE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9ABA, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8AB3, 0,0x9775,
+ /* plane 2, page 5 */
+ 71 | (235 << 8), /* first, last */
+ 0xFA40, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFA76, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFBD0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFA7B,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFE6D, 0, 0, 0, 0,
+ 0, 0,0x9BB3, 0, 0, 0, 0, 0,0x89CC, 0,
+ 0, 0, 0,0x9ABE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFA42,0x92BC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x945C,
+ /* plane 2, page 6 */
+ 17 | (118 << 8), /* first, last */
+ 0x9BB5, 0, 0,
+ 0,0x9ABF, 0, 0, 0,0x98A7,0x97A4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x90FD, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFC7B, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9AC0,
+ /* plane 2, page 7 */
+ 14 | (121 << 8), /* first, last */
+ 0x92C3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8AAA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9BD0,
+ /* plane 2, page 8 */
+ 44 | (213 << 8), /* first, last */
+ 0x9550, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x92C6, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x98A6,
+ /* plane 2, page 9 */
+ 22 | (231 << 8), /* first, last */
+ 0x9546, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFD63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFAC2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9EC3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x89B2,
+ /* plane 2, page 10 */
+ 17 | (205 << 8), /* first, last */
+ 0x9C66, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9053, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x97C1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9AC4, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9AC5,
+ /* plane 2, page 11 */
+ 13 | (255 << 8), /* first, last */
+ 0x8EEF, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFAE9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9262,0x8AF7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9AC6, 0, 0, 0, 0, 0, 0,0x92E1, 0,
+ 0, 0, 0,0x9AC9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFAC6, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x97A5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9ACB, 0, 0, 0,0xFA72,
+ /* plane 2, page 12 */
+ 11 | (255 << 8), /* first, last */
+ 0x8A5E, 0,0x94E0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x92CC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8AE5, 0, 0, 0, 0, 0,0xFE5C,0x9ACC,
+ 0, 0, 0, 0, 0,0x9DF9,0x8A43,0x8AA6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9ACD, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9ACE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFAEE,
+ 0x9BCC, 0, 0, 0,0x9ACF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9AD1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9DFA, 0, 0, 0, 0, 0,0x9D7C, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9AD3, 0, 0,0x97A6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x995F, 0, 0,
+ 0,0xFBF6,0x9FC5,0x8A59,0x8B6B, 0, 0, 0, 0, 0,
+ 0,0x9AD4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9AD5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x97A2,
+ /* plane 2, page 13 */
+ 21 | (200 << 8), /* first, last */
+ 0x8A44, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9F4A, 0, 0, 0, 0, 0, 0, 0, 0,0x90A1,
+ 0xFDA4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8A64,0x8AF2,0x8AF8,0x9DD8, 0, 0,0x94D6,0xFAFE,0xFBA7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9AD6, 0,0x9F4D, 0, 0,0xFAF6, 0, 0, 0,
+ 0, 0, 0, 0,0x8A57, 0,0x8B43,0x8B44, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8AB6, 0, 0, 0, 0, 0,0x8AC0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9E54, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9AD7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9AD8,
+ /* plane 2, page 14 */
+ 4 | (251 << 8), /* first, last */
+ 0x9ADC, 0, 0, 0, 0,0x8ACA,
+ 0x9EA8, 0, 0,0x9263,0x9ADD,0x8B65,0x8B6F,0x8B7E, 0, 0,
+ 0, 0,0x8F43, 0, 0, 0, 0, 0, 0,0x92D0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8AF4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9DBE,
+ 0, 0, 0, 0, 0,0x9AE1, 0,0xFCDE,0x9DFD,0x8B66,
+ 0x8B70,0x8B75,0x8AE4,0x8BA4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8AED, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8A5D, 0,0x8B48, 0, 0, 0, 0,0x9DED, 0, 0,
+ 0, 0,0x9E40, 0, 0, 0, 0, 0, 0, 0,
+ 0x8AEF,0x8AF6,0x9E76, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9EE3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9ADE,0x8DFE, 0, 0, 0,
+ 0,0xFAFC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9CB1,0x9E77,
+ 0x8B64,0x8B67,
+ /* plane 2, page 15 */
+ 29 | (237 << 8), /* first, last */
+ 0x974B,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9653, 0,
+ 0, 0, 0, 0, 0,0x9AE0,0x8B4A, 0,0x8AF1,0x8AD7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xA0AB,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8AB5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8A5F, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8AEE, 0, 0,0x9ADF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8AFE, 0, 0, 0, 0, 0, 0,
+ 0x8A58,0x8BA3,0x8BA7, 0, 0, 0, 0, 0,0x9AE3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9261, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9DD7,0x9E7D,0x9EA7,0x9EAB,
+ /* plane 2, page 16 */
+ 20 | (246 << 8), /* first, last */
+ 0x9042, 0, 0, 0, 0, 0, 0, 0, 0,0x8B79,
+ 0x8B7A, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9AE6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9AE5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8A7E, 0, 0, 0, 0, 0,0x9E44,0x9AE7,0x8A7C,
+ 0x8B71, 0, 0,0x9AE9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9AEA, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9AEB, 0, 0, 0, 0, 0, 0,0x8ABD, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFB4E, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9AED,0x8AF9,0x9E63, 0, 0, 0, 0, 0,0x8B49,
+ 0x8ACE,0x8B6E, 0, 0, 0, 0, 0,0x8AE8, 0, 0,
+ 0,0x9AEE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x92CE, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8A5A,0x8B7B,0x8B7C,
+ /* plane 2, page 17 */
+ 47 | (217 << 8), /* first, last */
+ 0x9AEF, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9AF0,
+ 0,0x8AFA, 0, 0, 0, 0, 0, 0, 0,0x8941,
+ 0, 0,0x8B72, 0, 0, 0, 0, 0, 0,0x8AF3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8BA8, 0,
+ 0, 0, 0, 0, 0,0x9EAE, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9E72,
+ /* plane 2, page 18 */
+ 60 | (254 << 8), /* first, last */
+ 0xFB73, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFB5F,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x90BA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x91FE,0x9EF6,
+ 0, 0, 0, 0, 0, 0,0x97ED, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9AF3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xA0EE,
+ /* plane 2, page 19 */
+ 2 | (254 << 8), /* first, last */
+ 0x967C,0x9345,0x986E,0xFA56, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9AF5, 0, 0, 0,0xFC4B, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9AF4,0xFEDE, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFCB7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x97F1, 0, 0, 0,0x97C7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9CCB,0x9240, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9CE8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x91FD,
+ /* plane 2, page 20 */
+ 19 | (253 << 8), /* first, last */
+ 0x974E,
+ 0, 0,0xFB68, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x976C, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8CC2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x97E8, 0,0xFB6A,0x8B74, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8EE7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFDC8, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9241, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x96A1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8EF3,
+ /* plane 2, page 21 */
+ 119 | (150 << 8), /* first, last */
+ 0x9AF7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8FA6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFAD6,
+ /* plane 2, page 22 */
+ 10 | (254 << 8), /* first, last */
+ 0x9CC7, 0, 0, 0, 0, 0, 0, 0, 0,0xFAD7,
+ 0, 0, 0, 0, 0,0x9AF8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFBA1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8EC5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFBA4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFBC2, 0,0x9AC1, 0, 0, 0,
+ 0, 0,0x91FA,0xFEDB,0x97AB, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9147, 0,0xFBB1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8FEA, 0, 0, 0, 0, 0, 0,
+ 0x94D2,0xFE61,0xFACE, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x92ED,0x91F3,0x93C6, 0,0x935A,
+ /* plane 2, page 23 */
+ 13 | (252 << 8), /* first, last */
+ 0xFAFB, 0, 0,0x92EF, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFAC8, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9847,0x9366,
+ 0x9855, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x96E6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9F43,0x9FAA,
+ 0x94DA,0x92EE,0xFCAF,0xFBFB, 0,0x8EF9,0x91F6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9364, 0, 0, 0, 0,0x94F5,0x9CB6,0xFBAD,0x984E,
+ 0x8F44,0x96FD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9AF9, 0, 0, 0,0x9AFA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9769,0x95D4,0x984B,
+ 0xFBAA, 0, 0,0x987C, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x91EA,
+ 0, 0, 0, 0, 0,0x9DAF,0x9DC5, 0,0x91F1,0x8EB1,
+ 0x97A9,0xFBAC,0xFCB8,
+ /* plane 2, page 24 */
+ 32 | (250 << 8), /* first, last */
+ 0x9CB9, 0, 0, 0, 0, 0, 0, 0,
+ 0xFBB0,0xFCD2,0x93CB, 0, 0,0x9AFD, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x91F4,0x8BAC,0xA055,
+ 0, 0, 0, 0,0x9574, 0, 0, 0, 0,0x95BE,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x97AD, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8EE9, 0, 0,0x92F8,0x97BE,0x916C,
+ 0x94AA, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFC63,
+ 0, 0, 0,0x9DC6, 0, 0, 0, 0, 0, 0,
+ 0,0x97B5,0x92B8,0x91EF, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFEA6,0x9760,
+ 0x9358,0x9576,0x8FAC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x91EC,0x97B4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x91F7,
+ 0, 0, 0, 0,0x974A,0xFB49,0x9578,0x93BC, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x91D6,
+ /* plane 2, page 25 */
+ 3 | (243 << 8), /* first, last */
+ 0x9355,0x9356,0x9851, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8FF8,0xFBC0,0x93F2, 0,
+ 0,0x90D0, 0, 0, 0, 0, 0, 0,0x9C44, 0,
+ 0, 0, 0, 0,0x9255, 0, 0, 0, 0,0x9363,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x91A5,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA0ED, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFD6B, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9AFE, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9351, 0, 0, 0,0x8C57, 0,
+ 0,0xFA78, 0, 0, 0, 0,0xFEA8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9350, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFA4C,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x92F7,
+ /* plane 2, page 26 */
+ 45 | (75 << 8), /* first, last */
+ 0x9B40, 0, 0, 0, 0,
+ 0, 0,0xFBCE, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9B41,
+ 0, 0, 0, 0, 0,0xFEAD,
+ /* plane 2, page 27 */
+ 68 | (194 << 8), /* first, last */
+ 0xFBD5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8BC2,0x9A7C,
+ /* plane 2, page 28 */
+ 42 | (172 << 8), /* first, last */
+ 0x9B42, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9B43, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9E79, 0, 0,0xFBD9, 0, 0, 0, 0,
+ 0, 0,0x9B44,
+ /* plane 2, page 29 */
+ 70 | (249 << 8), /* first, last */
+ 0xA0A7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BF3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8C79, 0, 0, 0,0x935E, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x89CB, 0, 0, 0, 0, 0, 0,0x9F53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x93D7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFBE1,
+ /* plane 2, page 30 */
+ 28 | (213 << 8), /* first, last */
+ 0xFED0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFBE2, 0, 0, 0, 0,
+ 0,0xFCE3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9074, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFBE6, 0, 0, 0,0x9BB7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9B45, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9B47,
+ /* plane 2, page 31 */
+ 15 | (232 << 8), /* first, last */
+ 0x9F50, 0, 0, 0, 0,
+ 0,0x9B48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFC5B, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x98A9, 0,
+ 0,0x9CFD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x884C,
+ /* plane 2, page 32 */
+ 69 | (252 << 8), /* first, last */
+ 0x9B4B,
+ 0, 0, 0,0xFBEC, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8C69, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BA8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8AD5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFA73,
+ /* plane 2, page 33 */
+ 42 | (195 << 8), /* first, last */
+ 0xFD59, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x91A2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFBED, 0, 0, 0, 0,
+ 0, 0,0x9CA9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8AA8, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9BC3,
+ /* plane 2, page 34 */
+ 8 | (124 << 8), /* first, last */
+ 0x8AE1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9B4E,
+ /* plane 2, page 35 */
+ 33 | (250 << 8), /* first, last */
+ 0x95D0, 0, 0, 0,0x905F, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x97EE,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFC4E, 0,
+ 0, 0, 0, 0, 0,0x9B4F, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9B50,
+ /* plane 2, page 36 */
+ 101 | (237 << 8), /* first, last */
+ 0x9EC6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFC50, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFD73,
+ 0, 0, 0, 0, 0,0xFDA7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9DA2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFA58,
+ /* plane 2, page 37 */
+ 19 | (190 << 8), /* first, last */
+ 0xFA5E,
+ 0, 0, 0, 0, 0, 0, 0,0xA059, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFA75, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFBBE, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9CA2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9370, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9371,
+ /* plane 2, page 38 */
+ 27 | (246 << 8), /* first, last */
+ 0x9377,0xFEEF, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x936D, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFC5D, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x90B8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8AFC, 0,0xFB41, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9E6B,0x94E3,0x8EE2,
+ /* plane 2, page 39 */
+ 18 | (205 << 8), /* first, last */
+ 0x8C7D, 0,
+ 0x8ED7, 0, 0, 0, 0, 0, 0,0x9C4D, 0, 0,
+ 0,0x96A3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9B51, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8AC3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x96AA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFC68,0x8B6D, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFD67,
+ /* plane 2, page 40 */
+ 3 | (247 << 8), /* first, last */
+ 0x8AE9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFCA1,0x936C, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9B52, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFE70, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFCA8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFCE9,
+ /* plane 2, page 41 */
+ 38 | (147 << 8), /* first, last */
+ 0x9CB4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8AEA, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9B53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9B55, 0, 0, 0,0x96AB, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFCA7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9B56,
+ /* plane 2, page 42 */
+ 102 | (232 << 8), /* first, last */
+ 0x8ABC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8ACB, 0, 0,
+ 0, 0, 0,0x9B57, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x89CD, 0,0x9B59,
+ /* plane 2, page 43 */
+ 14 | (206 << 8), /* first, last */
+ 0x9B5B, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x93A5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9B5D, 0, 0, 0,0x9E4F, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x93A3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8A7B, 0, 0, 0,0x8B42,
+ /* plane 2, page 44 */
+ 38 | (201 << 8), /* first, last */
+ 0x9750,0x8FB3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8A50, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9B60, 0, 0, 0,
+ 0,0x8B45, 0, 0, 0,0x8B46, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9DFE, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9B62, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x937B, 0, 0, 0, 0,
+ 0,0x93B1, 0, 0, 0, 0, 0, 0, 0,0x8A60,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8AD8, 0,
+ 0, 0, 0,0x9B63, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8A69, 0, 0, 0,0x8A47, 0,
+ 0,0x8ACC,
+ /* plane 2, page 45 */
+ 7 | (238 << 8), /* first, last */
+ 0x937C,0x9B65, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9B66, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8A72, 0,
+ 0, 0, 0, 0, 0, 0,0x8A7A, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x93AF, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8AB0, 0, 0, 0, 0, 0, 0, 0,0x9B68,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9EA3, 0, 0,0xFAEC,0x8B77, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9B67, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8B59,
+ /* plane 2, page 46 */
+ 13 | (239 << 8), /* first, last */
+ 0xFCB1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFCBB, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9B69, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x93A8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8AE0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9E51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8F5F,
+ /* plane 2, page 47 */
+ 116 | (227 << 8), /* first, last */
+ 0x9B6A, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9B6B, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x97EC,
+ /* plane 2, page 48 */
+ 51 | (218 << 8), /* first, last */
+ 0x9B6C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFE4E, 0,
+ 0, 0, 0, 0, 0,0xFDC2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9B6D, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9167,0xFCCC, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x93B6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x90E4, 0, 0, 0, 0,0x90E5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9EF2,
+ /* plane 2, page 49 */
+ 3 | (249 << 8), /* first, last */
+ 0x93CA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8BBC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8F46, 0, 0, 0, 0,
+ 0x93CF, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFCDB,0xFCDC, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x93C0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFCE6,0x96E7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFCD8,0xFCD9,0xFDA6,
+ /* plane 2, page 50 */
+ 15 | (225 << 8), /* first, last */
+ 0x93CE, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x95F1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9CE9, 0,0xFCE4,
+ 0x94AF,0xFA77,0x93CC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x905A, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8C54,
+ 0, 0, 0, 0, 0, 0, 0,0x93BF,0xFB51, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x93B9,0xFED7,0x93B7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x93D9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x93BB,0x93DA,
+ /* plane 2, page 51 */
+ 0 | (254 << 8), /* first, last */
+ 0x98A3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x90D1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9B6E, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFA70, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BEB, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9B6F, 0, 0, 0, 0, 0, 0, 0,
+ 0xFCFC, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8B40,0xA07B, 0, 0, 0,0x8CA1,
+ 0x97F7, 0, 0, 0,0x93E2,
+ /* plane 2, page 52 */
+ 0 | (229 << 8), /* first, last */
+ 0xFCD6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9559, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x93A6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFD40, 0, 0,0x935F, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x97F2,
+ /* plane 2, page 53 */
+ 25 | (243 << 8), /* first, last */
+ 0x9C76, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8EF8, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8F47, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9B74, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x92B4,
+ 0, 0, 0,0x91ED, 0, 0,0x96D2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFD46,0x8F4F,0x9549, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9B75,
+ /* plane 2, page 54 */
+ 0 | (238 << 8), /* first, last */
+ 0xFA5C, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9B79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFD4B, 0, 0, 0,0x96D3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFD58,
+ 0, 0, 0, 0, 0,0x945F, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xA0F5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9243, 0, 0, 0,
+ 0, 0, 0,0x97FA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9DD9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x97F4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x924D,
+ /* plane 2, page 55 */
+ 3 | (215 << 8), /* first, last */
+ 0xFD5B, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9B7A, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9ED5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFAAE, 0,0x9CC9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9258, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8EC8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x94B4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x93E1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x93DF, 0,
+ 0, 0, 0, 0,0xFCF0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x93EC,0x97F6,0x96CF,
+ /* plane 2, page 56 */
+ 58 | (58 << 8), /* first, last */
+ 0x93DE,
+ /* plane 2, page 57 */
+ 194 | (194 << 8), /* first, last */
+ 0x8ACF,
+ /* plane 2, page 58 */
+ 167 | (250 << 8), /* first, last */
+ 0x9BA2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFD69,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9352, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x98A2,
+ /* plane 2, page 59 */
+ 90 | (90 << 8), /* first, last */
+ 0xFD6E,
+ /* plane 2, page 60 */
+ 99 | (255 << 8), /* first, last */
+ 0x8CA4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFA7C,0x93FA,0x907C, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8F67, 0,0x9DB7, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xA0E9,
+ 0xFA4E,0xFDA1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9E74,0x9FBF,0x9ECB,0x9BB9,
+ /* plane 2, page 61 */
+ 64 | (248 << 8), /* first, last */
+ 0x9DD4, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x97B9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8EF1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x957B, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9ED2,0x9753,0x96A4,0x8FBE,0x94D9,0x9058,0xFD79,0xFD7B,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8EDA, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8EFA,
+ /* plane 2, page 62 */
+ 17 | (252 << 8), /* first, last */
+ 0x9BA5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9ED9,0x97D4,0x90BB,0xFDBC,0xFDC6,0x9248,
+ 0, 0, 0, 0, 0, 0, 0,0x92B5, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9DC1,0x92B9,0x92A6,0x8F4B,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9BA6, 0, 0, 0, 0,
+ 0,0x92B6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8E40, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9ED8,0x945E,0x985F,
+ 0x94CE,0x924A,0xFD70,
+ /* plane 2, page 63 */
+ 53 | (240 << 8), /* first, last */
+ 0x9467, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8DEC, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BD8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9448,0xFAC1,0x9CF7,
+ 0xFDBE, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8FDA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFDD9, 0, 0,0xFC7E, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x93F9, 0, 0, 0, 0,0xFA43, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFAEB,0xFAC3,0x97D3,0x95F9,0x9C48,
+ 0xFDD8,
+ /* plane 2, page 64 */
+ 17 | (225 << 8), /* first, last */
+ 0xA0D8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFDD7,0xFB4A,0x9BAF,
+ 0x944B,0xFDC9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8EAC, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFDB2, 0, 0, 0, 0, 0,0x925A,
+ 0xFCBD,0x92D9, 0, 0, 0,0xFDD5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x92DD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9259,
+ /* plane 2, page 65 */
+ 4 | (252 << 8), /* first, last */
+ 0x96BA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x925B, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9BAB, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFDDA,0xFDDE, 0, 0, 0,0xFDD3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8C46, 0,
+ 0, 0, 0, 0, 0,0xFDD6,0xFDDC,0xFDDD, 0, 0,
+ 0, 0,0x90FE, 0, 0,0xFEA1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8BAD,
+ 0, 0,0x9CD8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9E6D,0xFD7C,0xFB61, 0, 0, 0, 0,
+ 0, 0,0x96F8, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x96F0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFCF4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFE60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9852,
+ /* plane 2, page 66 */
+ 27 | (250 << 8), /* first, last */
+ 0x964F, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x916E, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x986D, 0, 0,0x9864,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9453,0xFDEC,
+ 0xFB78, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x95BA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x985D, 0,0x92F9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x985A, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFDF6, 0, 0, 0, 0, 0, 0,
+ 0,0x93D0,0x9862, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9BAD, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x974F,
+ /* plane 2, page 67 */
+ 13 | (248 << 8), /* first, last */
+ 0x9BAE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9452, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9BB0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x91D2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x97EA,0xFB6B,
+ 0x91B1,0xFDF3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x92CB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9BB1, 0, 0, 0, 0, 0,0xFCEC, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x986B,
+ 0, 0, 0,0x9751, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9871,0x95EF, 0, 0, 0, 0, 0,
+ 0, 0,0x9EF3, 0, 0, 0, 0, 0,0x91E8,
+ /* plane 2, page 68 */
+ 4 | (214 << 8), /* first, last */
+ 0x9BBA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFB4C,0x926A, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFDF8,0x9861, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x91E7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x93ED,0x9744, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x91E1, 0, 0,0xFBF5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9869, 0, 0, 0,
+ 0,0x8A62, 0, 0,0x9BBB,
+ /* plane 2, page 69 */
+ 5 | (200 << 8), /* first, last */
+ 0x8CA8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9C55, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8E77, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8AB2,
+ /* plane 2, page 70 */
+ 24 | (212 << 8), /* first, last */
+ 0x9EBC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x93E6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x93A2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9BBD, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x94B3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x937D,
+ /* plane 2, page 71 */
+ 6 | (224 << 8), /* first, last */
+ 0x9E66, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9459, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9BBF, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9458, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9EA5,
+ /* plane 2, page 72 */
+ 18 | (255 << 8), /* first, last */
+ 0x9BC7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFE54, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8E74, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8BD6, 0, 0, 0, 0, 0, 0,
+ 0x94B6,0xFD74,0x98C0,0x94A5, 0, 0, 0, 0, 0, 0,
+ 0,0x9BC8, 0, 0, 0,0x95ED,
+ /* plane 2, page 73 */
+ 0 | (251 << 8), /* first, last */
+ 0xFD7E,0xFBEB, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFD7D, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x976F,0x9461, 0,0x9FC1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x95D7, 0, 0,
+ 0,0xFA52,0x9C58, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9F68,0x9BE7,0xFCCE,0x96E8,0xFA49,0x97A1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x954D,0x9EF8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFE49,0x91CE,0x9771, 0,
+ 0, 0, 0,0x8CCF, 0, 0, 0,0xFDB1, 0, 0,
+ 0xFC6E, 0, 0, 0, 0, 0,0x9CF2,0x93B8,0x9043,0x9759,
+ 0x94D7,0xFE66,0x947D,0xFC6F, 0, 0, 0, 0,0x9246, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFA6D, 0, 0,0x8EF7, 0,0xFBB7,
+ 0,0x947C,0x92CD,0x97B2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFE65,0x967E,0x9758,0x9B77,0x91CF, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x94A4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9CAD, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8BAB, 0,
+ 0, 0,0x96D5,0xFCB3, 0, 0, 0,0x93AE, 0,0x976D,
+ 0, 0, 0, 0, 0, 0,0x9446,0x95F7, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9C46,0x955B,0x91D1,0x94F4,
+ 0,0xFE67,
+ /* plane 2, page 74 */
+ 14 | (233 << 8), /* first, last */
+ 0x92A5, 0, 0, 0,0xFEDF,0x8CAB,
+ 0,0x9BC9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFCED,0xFDFA,0xFCC8,0xFE62,0x91FC,0xFE6B,0xFDF9,
+ 0xFCC7,0x914E,0x9CB8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9767, 0, 0, 0,0x95EE, 0, 0,0x9BB2,
+ 0, 0, 0, 0,0x9460, 0, 0, 0,0x94A2,0x9875,
+ 0x97AC,0x91D3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x987B, 0, 0, 0, 0, 0, 0,
+ 0,0x8EEB,0x976A,0x965E, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x97EB, 0, 0, 0, 0, 0,0x9FF9,
+ 0x95F8,0xFEA2,0x8FE6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFE7E, 0, 0, 0, 0, 0, 0,0x9DA4,0x9768,0x8EEC,
+ 0x94BD, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x945B,0x9CF6,0xFAA7,0x9BD9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFA5D,0x9656,0x9762,
+ 0, 0, 0, 0, 0, 0,0x94BA,0xA04F,0x92D8, 0,
+ 0, 0,0x9BCB, 0, 0, 0, 0, 0, 0,0x94BB,
+ 0, 0,0x9D5F, 0, 0, 0, 0, 0, 0,0x90CF,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9465, 0, 0,0x9F4C, 0, 0, 0,
+ 0, 0, 0,0x90D8,
+ /* plane 2, page 75 */
+ 110 | (245 << 8), /* first, last */
+ 0x9EBE, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFB6D,
+ /* plane 2, page 76 */
+ 9 | (217 << 8), /* first, last */
+ 0x95CA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9DC2,0x97F8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8FFC, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9473,
+ /* plane 2, page 77 */
+ 6 | (235 << 8), /* first, last */
+ 0x9474, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFEB7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8A4B, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8A55,0x8B69,
+ /* plane 2, page 78 */
+ 59 | (167 << 8), /* first, last */
+ 0x8ADC,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8B76, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9BCE, 0,0x8A68,
+ /* plane 2, page 79 */
+ 14 | (194 << 8), /* first, last */
+ 0xA0F8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x98DF, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFEB5, 0, 0, 0,0x9BCF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x96FB, 0, 0,0x9BFB, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9ECE,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8EE5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9E7B,
+ /* plane 2, page 80 */
+ 44 | (157 << 8), /* first, last */
+ 0x9BD2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8AA5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFECE,
+ /* plane 2, page 81 */
+ 43 | (231 << 8), /* first, last */
+ 0x8A45, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9DFC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFECF,0x8BA5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8C4A, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8AEC, 0, 0,
+ 0xFCE0,0x94AD,
+ /* plane 2, page 82 */
+ 32 | (216 << 8), /* first, last */
+ 0xFED5,0x94AC, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFC5A, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9BD6, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8A6F,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8BA9,
+ /* plane 2, page 83 */
+ 14 | (19 << 8), /* first, last */
+ 0x8E5F, 0, 0,0x9DCB, 0,0xFCE7,
+ /* plane 2, page 84 */
+ 25 | (110 << 8), /* first, last */
+ 0x9BD7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x93C8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x91F0,0x8FE0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9BDB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x90ED, 0,
+ 0x9BDC,
+ /* plane 2, page 85 */
+ 49 | (224 << 8), /* first, last */
+ 0xA0EC,
+ 0, 0, 0,0x98FA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9BE0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x93C7,0x9249,0x96E1,0x9BE2, 0, 0, 0,0x9BE4, 0,
+ 0,0x8FE1,0x9BE5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x94C0,
+ 0, 0,0x93C3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x93C5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9079, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x977B, 0, 0, 0, 0, 0,0x907E,
+ 0, 0, 0, 0,0xFEE6,
+ /* plane 2, page 86 */
+ 5 | (246 << 8), /* first, last */
+ 0xFE46, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9DB8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9270, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x95A8, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8CB0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x94C8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x98B9,
+ /* plane 2, page 87 */
+ 6 | (225 << 8), /* first, last */
+ 0x9140, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFCBE,
+ 0, 0, 0, 0, 0, 0, 0,0x9157, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8BB2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFADF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9BE6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9643,0x8E44,0x9C4F,
+ /* plane 2, page 88 */
+ 87 | (225 << 8), /* first, last */
+ 0xFEF4, 0, 0,
+ 0, 0, 0,0x9BE8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x93DC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x966F, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8E4A,
+ /* plane 2, page 89 */
+ 3 | (204 << 8), /* first, last */
+ 0x9BED, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x92F6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9DB9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8E4E, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFBCF,
+ /* plane 2, page 90 */
+ 149 | (233 << 8), /* first, last */
+ 0x9EC2,
+ 0, 0, 0, 0, 0, 0,0x94E5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BF0,0x94E4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9551,
+ /* plane 2, page 91 */
+ 116 | (232 << 8), /* first, last */
+ 0x8BBB, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9BF1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x94F0,
+ 0x8E64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x94EA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8F61, 0,
+ 0, 0,0x9B64,
+ /* plane 2, page 92 */
+ 1 | (254 << 8), /* first, last */
+ 0x8E5B, 0, 0, 0, 0,0x9BF2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9FBE, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9DC9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8E6C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8F73, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8CAF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8F75,0x8E71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8E60,
+ /* plane 2, page 93 */
+ 32 | (67 << 8), /* first, last */
+ 0x8E6A, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8C4C, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9552,
+ /* plane 2, page 94 */
+ 14 | (216 << 8), /* first, last */
+ 0x9554, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8AD4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9DBB,
+ 0x9543,0x92FE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x94F2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x94F1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xA0EA,0x9DD2,
+ /* plane 2, page 95 */
+ 26 | (226 << 8), /* first, last */
+ 0xA0B1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x91F8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9462,0x9BA4,
+ /* plane 2, page 96 */
+ 41 | (165 << 8), /* first, last */
+ 0x8EAD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9EAD, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x96D0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFEEE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8AB4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9757,0x8A77,
+ /* plane 2, page 97 */
+ 2 | (221 << 8), /* first, last */
+ 0x9BF7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8EB5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xA06D,
+ 0x8EB6,0x9756,0x9540, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA0F3,0x94BE, 0, 0, 0,0x9BFA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xFDDF,
+ /* plane 2, page 98 */
+ 88 | (208 << 8), /* first, last */
+ 0x9DBC, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x94FE, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8BDB,0xA0FE, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8EC0,
+ /* plane 2, page 99 */
+ 53 | (248 << 8), /* first, last */
+ 0x9F47, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8BDE,0xA0FB, 0, 0, 0,
+ 0,0x8EC3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9649, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xFEC2, 0, 0,0x954C,
+ /* plane 2, page 100 */
+ 2 | (152 << 8), /* first, last */
+ 0x9BFD, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x90CC,0x9C60,0x954B, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BFE, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9C70, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9C43, 0, 0, 0,0x9C47,0x8ECC, 0, 0,
+ 0,0x8E54, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8EE4,
+ /* plane 2, page 101 */
+ 18 | (191 << 8), /* first, last */
+ 0x9C49, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8B5E, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x955E, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x955C, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9C4B,
+ /* plane 2, page 102 */
+ 18 | (252 << 8), /* first, last */
+ 0x8BE1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8ED9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9DB4, 0,0x925F, 0, 0,
+ 0,0x9C4C, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8AA1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8EDB, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9C56,
+ /* plane 2, page 103 */
+ 22 | (204 << 8), /* first, last */
+ 0x8AA2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9754, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9C5E, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9ED4,
+ 0x9568, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xA0C3,
+ /* plane 2, page 104 */
+ 28 | (199 << 8), /* first, last */
+ 0x8AE6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xA0F7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9C61, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9C5F, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFC4D, 0,0x9E5B, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9E69, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9C63,
+ /* plane 2, page 105 */
+ 14 | (250 << 8), /* first, last */
+ 0xFEC7, 0, 0,0xFEC6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9C67, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9C69, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8BE2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9165, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9CE7, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8A54, 0, 0, 0, 0, 0, 0, 0,
+ 0x9C6C,
+ /* plane 2, page 106 */
+ 45 | (82 << 8), /* first, last */
+ 0x9C6E,0xFE5D, 0, 0, 0,
+ 0, 0,0x9C73, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x956A, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x956D,0x8EF0,
+ /* plane 2, page 107 */
+ 5 | (247 << 8), /* first, last */
+ 0x8F4D, 0, 0, 0, 0,
+ 0x8EF6, 0, 0, 0, 0, 0, 0, 0, 0,0xFABC,
+ 0,0x8CD5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFBDA, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8B4C,0xFD75,0x9BDD,0xFAF5, 0, 0, 0, 0, 0, 0,
+ 0,0x9C74, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9545, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x96C6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8F6A,0x8F4E, 0, 0, 0, 0, 0,0x9C78, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFA55,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x97E4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9C41,
+ /* plane 2, page 108 */
+ 33 | (209 << 8), /* first, last */
+ 0x925C, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x96FA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFB66,0x8E65,0x9849,0xFBA8,
+ 0x9842, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9C7A, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x97FB,0x90CA, 0, 0, 0, 0,0x9C5B,
+ 0, 0,0x974D, 0, 0,0x8ED3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9561,
+ /* plane 2, page 109 */
+ 34 | (240 << 8), /* first, last */
+ 0x9F4B,0x9FB5,0x93D2,0xFDAA,0x9840,0x9146,
+ 0x9867,0xFA5A,0xFBA9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9841, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8CD3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFCFD,0xFDAB,0x91BD,0x8F4C,0x96C9,0x8F55,0xFBAE,0x956F, 0, 0,
+ 0, 0, 0, 0,0x9C7D, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xA0F0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x946F,0xFDAC, 0, 0, 0, 0,
+ 0x96CB,
+ /* plane 2, page 110 */
+ 0 | (215 << 8), /* first, last */
+ 0x96CE, 0, 0, 0, 0,0xA056, 0,0x9CE1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x96C4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8F5E,0x8F6C,0x8EA3,0xFBB3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFC53, 0, 0, 0,0xFDB3, 0, 0, 0, 0,0x8F6B,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x96CA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8F79, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9E6F,0xA0C5,
+ 0xFC78,0x8E42,0x8F5A,0x90C2,0x8EA5,0x9061,
+ /* plane 2, page 111 */
+ 38 | (223 << 8), /* first, last */
+ 0x924F, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9373,0xFDB5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xFECC,
+ 0,0xFBBD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8CD6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9843,0x96C5,
+ /* plane 2, page 112 */
+ 14 | (248 << 8), /* first, last */
+ 0x89BC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9CA3, 0, 0, 0, 0,
+ 0, 0,0x924B,0x984A, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8FA4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xA0F1,0x9EFB,0x9CD2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8FA7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFC5C,
+ /* plane 2, page 113 */
+ 9 | (205 << 8), /* first, last */
+ 0x9845,
+ 0, 0,0x9046,0x8CD1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFEFA,0x9560,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9F48,0x9247, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x90FB, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9CA4,
+ /* plane 2, page 114 */
+ 27 | (230 << 8), /* first, last */
+ 0x9571, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9CA6, 0,
+ 0, 0, 0,0x9CA7, 0, 0, 0, 0, 0,0x9CAA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9ED3, 0,
+ 0, 0,0x9E70, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9CAC,
+ /* plane 2, page 115 */
+ 154 | (154 << 8), /* first, last */
+ 0x8FAE,
+ /* plane 2, page 116 */
+ 34 | (134 << 8), /* first, last */
+ 0x957D, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9CB0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x97B6, 0,0xA0BD,
+ /* plane 2, page 117 */
+ 116 | (254 << 8), /* first, last */
+ 0x8ADF, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9EAA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8FBD, 0, 0, 0,0x8FBF, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9369,0x9BA7,
+ /* plane 2, page 118 */
+ 7 | (148 << 8), /* first, last */
+ 0xC8A4, 0, 0,
+ 0, 0,0xFEEA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9BE1, 0, 0, 0, 0, 0, 0,0x8B41, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9DB6,0xA0EB,0x9BA3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8BA1,
+ /* plane 2, page 119 */
+ 15 | (204 << 8), /* first, last */
+ 0x8FC8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x894C,0x9860, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x94C7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8B58, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x95AB,0x95AA, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CC3,
+ /* plane 2, page 120 */
+ 88 | (200 << 8), /* first, last */
+ 0x9CC4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x93D6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9DAC, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8BE6, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8A71,
+ /* plane 2, page 121 */
+ 36 | (253 << 8), /* first, last */
+ 0x8FD1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x99D5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x90F4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8AA3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9CCE, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9CD4,
+ /* plane 2, page 122 */
+ 10 | (244 << 8), /* first, last */
+ 0x9CD5, 0, 0, 0,0xFBC8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9DB3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFC70, 0, 0, 0, 0, 0,0x8FD7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9B73, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFA5B, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8FD2,
+ 0x9064, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x98B6,
+ /* plane 2, page 123 */
+ 6 | (244 << 8), /* first, last */
+ 0x9668, 0, 0, 0,
+ 0,0x9CD6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x98BD, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8FDC,0xFEF6,0x8FD9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9541, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x97F3,
+ /* plane 2, page 124 */
+ 18 | (18 << 8), /* first, last */
+ 0x9BF8,
+ /* plane 2, page 125 */
+ 47 | (220 << 8), /* first, last */
+ 0x9E6C, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8FF2,0x8FEE, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9CD7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9E6E, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8A40, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8FEF, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8FF4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8FF5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x95C2,
+ /* plane 2, page 126 */
+ 77 | (79 << 8), /* first, last */
+ 0x986A, 0,0x97CF,
+ /* plane 2, page 127 */
+ 249 | (249 << 8), /* first, last */
+ 0x9E7C,
+ /* plane 2, page 128 */
+ 2 | (244 << 8), /* first, last */
+ 0x9041, 0, 0, 0, 0, 0, 0,0x9CDB,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9441, 0, 0, 0, 0,0x9CE6,0x9DB0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9CEA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9CED, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CFA, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8B62,
+ 0x8A4E, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9CCA,0x8A66, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CFB,
+ /* plane 2, page 129 */
+ 46 | (188 << 8), /* first, last */
+ 0x9CFC, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9CFE,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8A53, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9CE5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9D40, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9D41, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9045,
+ /* plane 2, page 130 */
+ 7 | (226 << 8), /* first, last */
+ 0x8B73, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x97CA, 0,0x9D42, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x8A61, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8BAE, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8AD2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8BA2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9DF2,
+ /* plane 2, page 131 */
+ 6 | (138 << 8), /* first, last */
+ 0x9D43, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CDF, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9D44, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8ECA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x904E, 0, 0, 0, 0, 0, 0, 0,0x8EB3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9FF5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9D45,
+ /* plane 2, page 132 */
+ 18 | (130 << 8), /* first, last */
+ 0x904F, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9D47, 0, 0, 0,0x89CA, 0,
+ 0, 0, 0, 0, 0,0x9CB5, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFBFE,
+ /* plane 2, page 133 */
+ 1 | (244 << 8), /* first, last */
+ 0x905E, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9063,0x9057, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9066, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9BC0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xFCE5,
+ /* plane 2, page 134 */
+ 0 | (230 << 8), /* first, last */
+ 0x9162, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9067, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8FA1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8FA2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9D48,0xFAD3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x905D, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x90B9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x906B,
+ /* plane 2, page 135 */
+ 15 | (19 << 8), /* first, last */
+ 0x8C5C, 0, 0, 0,0x9069,
+ /* plane 2, page 136 */
+ 4 | (43 << 8), /* first, last */
+ 0xFE57, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFE55,
+ /* plane 2, page 137 */
+ 51 | (252 << 8), /* first, last */
+ 0x9073, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9BEF,0x9CF0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9D4B, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFED9, 0, 0, 0,0xFEDA, 0, 0, 0,0x91E0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x91D8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9646, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9360, 0,
+ 0xFA53,0x9CD3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9D4E, 0, 0, 0,0xFB40, 0,
+ 0, 0,0x8DE2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9442, 0,0x9056, 0, 0,0x9865, 0,0x8C6C,0xFA4A, 0,
+ 0,0x9D50,0x9D52, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x95AF,
+ 0x975A,0x9349,0x9747,
+ /* plane 2, page 138 */
+ 15 | (252 << 8), /* first, last */
+ 0xA0F4, 0, 0, 0, 0,
+ 0, 0,0x9778, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8FCF, 0, 0,
+ 0,0xFC60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8C4E, 0, 0, 0,0xFC56, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x91DC,0x9661,
+ 0x92EC,0x935D,0x8EDE,0x96FE,0xFD4F,0x95DE, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x98B0,
+ 0xA040, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x97BD,
+ 0x977D,0x97F5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9BAC,0xFADA,0x92C2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x97B1, 0, 0, 0, 0, 0,0x907B, 0,
+ 0, 0, 0,0x93FE,0x947B, 0,0x9777, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFABE,0xFD43,0x90C6,0x90A4,0x90A8,0x94A9, 0,0x90A9,
+ 0, 0, 0, 0,0x8C65, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x95E0,
+ /* plane 2, page 139 */
+ 12 | (255 << 8), /* first, last */
+ 0x907D, 0, 0, 0, 0, 0, 0,0x9265,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFDBA,0x93C4, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFEED,0x9DAB,0xA0E3, 0,0x9648, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9D53, 0, 0, 0, 0, 0,0x8AA9, 0,0x9BC5, 0,
+ 0x965D, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x975F,
+ 0x965F,0x966E,0xFB5D, 0, 0, 0, 0, 0,0x9DB1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFEA3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9DB2, 0, 0,0x95AE,0xFCA3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xA0A2, 0, 0,0x9655, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9D54, 0, 0,0x9341, 0,0x95AD,0x91D5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x977A,0xFDFC,0x8E47,0x93FD,0x90A5,0x90AC, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x95AC, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x90AE,
+ /* plane 2, page 140 */
+ 3 | (210 << 8), /* first, last */
+ 0xFEA5, 0, 0, 0, 0, 0,0x9D56,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x97E3,0x95E2,
+ 0, 0, 0, 0, 0,0x9466, 0, 0,0x9647, 0,
+ 0, 0, 0,0x91B8, 0, 0, 0, 0,0x9CEC, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x90AD, 0,0x95E3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8B4F, 0, 0,0x8AE3, 0, 0, 0, 0,
+ 0x8B4D,
+ /* plane 2, page 141 */
+ 52 | (185 << 8), /* first, last */
+ 0x95EA, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x8B4E, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8CC1,
+ /* plane 2, page 142 */
+ 15 | (231 << 8), /* first, last */
+ 0x8BED, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x91D9, 0, 0,0xA0A4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x95F5,0x95F4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9FB3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFEAF, 0, 0, 0, 0, 0,0xFE72,0x927A,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xFEAC, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x95F3,
+ /* plane 2, page 143 */
+ 197 | (197 << 8), /* first, last */
+ 0x9D58,
+ /* plane 2, page 144 */
+ 136 | (237 << 8), /* first, last */
+ 0x9372, 0, 0,0x91C5,
+ 0, 0, 0, 0, 0, 0, 0,0x9642, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x90CD,0x95FE,0x9159, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9C65, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x97CC,0x90CE,
+ 0, 0, 0, 0, 0, 0,0x9D59,0xFCF5,
+ /* plane 2, page 145 */
+ 13 | (235 << 8), /* first, last */
+ 0xFEFD, 0, 0,0x9D5B, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9D5C, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x937E, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x98AC, 0, 0,0x9D5E, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xFDD0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFD60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9CCF, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x90DD, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x90E0,
+ /* plane 2, page 146: --- */
+ /* plane 2, page 147: --- */
+ /* plane 2, page 148 */
+ 29 | (231 << 8), /* first, last */
+ 0x90F3,
+ 0, 0,0x98B1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x90F0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x93BD, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x95B7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9F46, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8E4B,0x9658, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x8A4C,
+ 0,0x9D63,
+ /* plane 2, page 149 */
+ 158 | (244 << 8), /* first, last */
+ 0x9ECF, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9D65, 0, 0, 0,
+ 0, 0, 0, 0,0x9D66, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x965A, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9D64, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x8A6C,
+ /* plane 2, page 150: --- */
+ /* plane 2, page 151 */
+ 32 | (212 << 8), /* first, last */
+ 0x8AD9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9D67, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8A70,
+ /* plane 2, page 152 */
+ 16 | (241 << 8), /* first, last */
+ 0x8BF3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9150, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9CC1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9D68,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x93A7, 0, 0, 0, 0, 0,
+ 0,0x9674,
+ /* plane 2, page 153 */
+ 3 | (201 << 8), /* first, last */
+ 0xA0EF, 0,0x9151, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x96C1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8C64,0x9676,0x9D69, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xFCA4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9D6A, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x924E, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9D6B, 0, 0, 0, 0,
+ 0,0x9BC1,
+ /* plane 2, page 154 */
+ 40 | (77 << 8), /* first, last */
+ 0x9D6C, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x8A65,
+ /* plane 2, page 155 */
+ 5 | (213 << 8), /* first, last */
+ 0x915D, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9D6D, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x915A,
+ /* plane 2, page 156 */
+ 115 | (173 << 8), /* first, last */
+ 0x8C42, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9CC0,
+ /* plane 2, page 157 */
+ 62 | (246 << 8), /* first, last */
+ 0x916A, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x9D6E, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9EA6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9DCD, 0, 0,0x9D6F, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x89BB,
+ /* plane 2, page 158 */
+ 6 | (248 << 8), /* first, last */
+ 0x9EF9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x96B4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9172, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9EC8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8B55, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9D71,
+ /* plane 2, page 159 */
+ 35 | (222 << 8), /* first, last */
+ 0x9D72, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x9ECC, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9174, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x9ED0,
+ /* plane 2, page 160 */
+ 20 | (254 << 8), /* first, last */
+ 0x905C, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x8ED2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x91A8, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9177, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x96BF, 0, 0,
+ 0, 0, 0,0x96C0, 0, 0, 0, 0,0x8FB1, 0,
+ 0, 0, 0, 0,0x96B7,
+ /* plane 2, page 161 */
+ 7 | (245 << 8), /* first, last */
+ 0x8C55, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9178, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x89BE,0x917C, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xFB77, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0x9175,0x91A3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x9176, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x96BE, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9179, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x96B6,
+ /* plane 2, page 162 */
+ 32 | (255 << 8), /* first, last */
+ 0x91A4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x91A6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0x9D75, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9052,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xA045, 0,
+ 0x91A9, 0,0x98AA, 0, 0, 0,0x8C5F, 0, 0,0x8BAA,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0x9CDD, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9D77,
+ /* plane 2, page 163 */
+ 169 | (169 << 8), /* first, last */
+ 0x8940,
+ /* plane 2, page 164 */
+ 52 | (91 << 8), /* first, last */
+ 0x9EEC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x93AA,
+ /* plane 2, page 165 */
+ 198 | (203 << 8), /* first, last */
+ 0x9478, 0,
+ 0, 0, 0,0x9D7A,
+ /* plane 2, page 166 */
+ 1 | (169 << 8), /* first, last */
+ 0x8AC9, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8B4B, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0x9FEC, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0x8AE2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9E75,
+ /* plane 2, page 167: --- */
+ /* plane 2, page 168: --- */
+ /* plane 2, page 169: --- */
+ /* plane 2, page 170: --- */
+ /* plane 2, page 171: --- */
+ /* plane 2, page 172: --- */
+ /* plane 2, page 173: --- */
+ /* plane 2, page 174: --- */
+ /* plane 2, page 175: --- */
+ /* plane 2, page 176: --- */
+ /* plane 2, page 177: --- */
+ /* plane 2, page 178: --- */
+ /* plane 2, page 179: --- */
+ /* plane 2, page 180: --- */
+ /* plane 2, page 181: --- */
+ /* plane 2, page 182: --- */
+ /* plane 2, page 183: --- */
+ /* plane 2, page 184: --- */
+ /* plane 2, page 185: --- */
+ /* plane 2, page 186: --- */
+ /* plane 2, page 187: --- */
+ /* plane 2, page 188: --- */
+ /* plane 2, page 189: --- */
+ /* plane 2, page 190: --- */
+ /* plane 2, page 191: --- */
+ /* plane 2, page 192: --- */
+ /* plane 2, page 193: --- */
+ /* plane 2, page 194: --- */
+ /* plane 2, page 195: --- */
+ /* plane 2, page 196: --- */
+ /* plane 2, page 197: --- */
+ /* plane 2, page 198: --- */
+ /* plane 2, page 199: --- */
+ /* plane 2, page 200: --- */
+ /* plane 2, page 201: --- */
+ /* plane 2, page 202: --- */
+ /* plane 2, page 203: --- */
+ /* plane 2, page 204: --- */
+ /* plane 2, page 205: --- */
+ /* plane 2, page 206: --- */
+ /* plane 2, page 207: --- */
+ /* plane 2, page 208: --- */
+ /* plane 2, page 209: --- */
+ /* plane 2, page 210: --- */
+ /* plane 2, page 211: --- */
+ /* plane 2, page 212: --- */
+ /* plane 2, page 213: --- */
+ /* plane 2, page 214: --- */
+ /* plane 2, page 215: --- */
+ /* plane 2, page 216: --- */
+ /* plane 2, page 217: --- */
+ /* plane 2, page 218: --- */
+ /* plane 2, page 219: --- */
+ /* plane 2, page 220: --- */
+ /* plane 2, page 221: --- */
+ /* plane 2, page 222: --- */
+ /* plane 2, page 223: --- */
+ /* plane 2, page 224: --- */
+ /* plane 2, page 225: --- */
+ /* plane 2, page 226: --- */
+ /* plane 2, page 227: --- */
+ /* plane 2, page 228: --- */
+ /* plane 2, page 229: --- */
+ /* plane 2, page 230: --- */
+ /* plane 2, page 231: --- */
+ /* plane 2, page 232: --- */
+ /* plane 2, page 233: --- */
+ /* plane 2, page 234: --- */
+ /* plane 2, page 235: --- */
+ /* plane 2, page 236: --- */
+ /* plane 2, page 237: --- */
+ /* plane 2, page 238: --- */
+ /* plane 2, page 239: --- */
+ /* plane 2, page 240: --- */
+ /* plane 2, page 241: --- */
+ /* plane 2, page 242: --- */
+ /* plane 2, page 243: --- */
+ /* plane 2, page 244: --- */
+ /* plane 2, page 245: --- */
+ /* plane 2, page 246: --- */
+ /* plane 2, page 247: --- */
+ /* plane 2, page 248 */
+ 37 | (205 << 8), /* first, last */
+ 0x9874, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0x9AC8,
+ 0, 0, 0, 0,0xA047, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x8BC3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xFC48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xFC77, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0x9C52,
+ /* plane 2, page 249 */
+ 148 | (212 << 8), /* first, last */
+ 0x8EFD, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x8FA8, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0x957A, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0x8FF0,
+ /* plane 2, page 250: --- */
+ /* plane 2, page 251: --- */
+ /* plane 2, page 252: --- */
+ /* plane 2, page 253: --- */
+ /* plane 2, page 254: --- */
+ /* plane 2, page 255: --- */
+ /* plane 3: --- */
+ /* plane 4: --- */
+ /* plane 5: --- */
+ /* plane 6: --- */
+ /* plane 7: --- */
+ /* plane 8: --- */
+ /* plane 9: --- */
+ /* plane 10: --- */
+ /* plane 11: --- */
+ /* plane 12: --- */
+ /* plane 13: --- */
+ /* plane 14: --- */
+ /* plane 15: --- */
+ /* plane 16: --- */
+};
+
+static sal_Int32 const aImplUnicodeToBig5Hkscs2001PageOffsets[] = {
+ 0, /* plane 0, page 0; 44/172 bytes (25.6%) */
+ 86, /* plane 0, page 1; 46/444 bytes (10.4%) */
+ 308, /* plane 0, page 2; 22/240 bytes (9.2%) */
+ -1, /* plane 0, page 3 */
+ 428, /* plane 0, page 4; 134/164 bytes (81.7%) */
+ -1, /* plane 0, page 5 */
+ -1, /* plane 0, page 6 */
+ -1, /* plane 0, page 7 */
+ -1, /* plane 0, page 8 */
+ -1, /* plane 0, page 9 */
+ -1, /* plane 0, page 10 */
+ -1, /* plane 0, page 11 */
+ -1, /* plane 0, page 12 */
+ -1, /* plane 0, page 13 */
+ -1, /* plane 0, page 14 */
+ -1, /* plane 0, page 15 */
+ -1, /* plane 0, page 16 */
+ -1, /* plane 0, page 17 */
+ -1, /* plane 0, page 18 */
+ -1, /* plane 0, page 19 */
+ -1, /* plane 0, page 20 */
+ -1, /* plane 0, page 21 */
+ -1, /* plane 0, page 22 */
+ -1, /* plane 0, page 23 */
+ -1, /* plane 0, page 24 */
+ -1, /* plane 0, page 25 */
+ -1, /* plane 0, page 26 */
+ -1, /* plane 0, page 27 */
+ -1, /* plane 0, page 28 */
+ -1, /* plane 0, page 29 */
+ 510, /* plane 0, page 30; 10/10 bytes (100.0%) */
+ -1, /* plane 0, page 31 */
+ -1, /* plane 0, page 32 */
+ 515, /* plane 0, page 33; 32/422 bytes (7.6%) */
+ -1, /* plane 0, page 34 */
+ -1, /* plane 0, page 35 */
+ 726, /* plane 0, page 36; 42/62 bytes (67.7%) */
+ 757, /* plane 0, page 37; 68/68 bytes (100.0%) */
+ -1, /* plane 0, page 38 */
+ 791, /* plane 0, page 39; 4/4 bytes (100.0%) */
+ -1, /* plane 0, page 40 */
+ -1, /* plane 0, page 41 */
+ -1, /* plane 0, page 42 */
+ -1, /* plane 0, page 43 */
+ -1, /* plane 0, page 44 */
+ -1, /* plane 0, page 45 */
+ 793, /* plane 0, page 46; 58/202 bytes (28.7%) */
+ 894, /* plane 0, page 47; 4/4 bytes (100.0%) */
+ 896, /* plane 0, page 48; 360/502 bytes (71.7%) */
+ -1, /* plane 0, page 49 */
+ 1147, /* plane 0, page 50; 4/4 bytes (100.0%) */
+ -1, /* plane 0, page 51 */
+ 1149, /* plane 0, page 52; 38/400 bytes (9.5%) */
+ 1349, /* plane 0, page 53; 66/500 bytes (13.2%) */
+ 1599, /* plane 0, page 54; 80/476 bytes (16.8%) */
+ 1837, /* plane 0, page 55; 54/504 bytes (10.7%) */
+ 2089, /* plane 0, page 56; 26/474 bytes (5.5%) */
+ 2326, /* plane 0, page 57; 48/496 bytes (9.7%) */
+ 2574, /* plane 0, page 58; 48/504 bytes (9.5%) */
+ 2826, /* plane 0, page 59; 54/464 bytes (11.6%) */
+ 3058, /* plane 0, page 60; 28/456 bytes (6.1%) */
+ 3286, /* plane 0, page 61; 76/472 bytes (16.1%) */
+ 3522, /* plane 0, page 62; 72/502 bytes (14.3%) */
+ 3773, /* plane 0, page 63; 36/504 bytes (7.1%) */
+ 4025, /* plane 0, page 64; 40/496 bytes (8.1%) */
+ 4273, /* plane 0, page 65; 36/496 bytes (7.3%) */
+ 4521, /* plane 0, page 66; 34/474 bytes (7.2%) */
+ 4758, /* plane 0, page 67; 20/402 bytes (5.0%) */
+ 4959, /* plane 0, page 68; 48/490 bytes (9.8%) */
+ 5204, /* plane 0, page 69; 46/464 bytes (9.9%) */
+ 5436, /* plane 0, page 70; 22/482 bytes (4.6%) */
+ 5677, /* plane 0, page 71; 22/454 bytes (4.8%) */
+ 5904, /* plane 0, page 72; 28/504 bytes (5.6%) */
+ 6156, /* plane 0, page 73; 44/454 bytes (9.7%) */
+ 6383, /* plane 0, page 74; 22/484 bytes (4.5%) */
+ 6625, /* plane 0, page 75; 40/356 bytes (11.2%) */
+ 6803, /* plane 0, page 76; 34/470 bytes (7.2%) */
+ 7038, /* plane 0, page 77; 12/298 bytes (4.0%) */
+ 7187, /* plane 0, page 78; 74/492 bytes (15.0%) */
+ 7433, /* plane 0, page 79; 54/504 bytes (10.7%) */
+ 7685, /* plane 0, page 80; 44/502 bytes (8.8%) */
+ 7936, /* plane 0, page 81; 80/510 bytes (15.7%) */
+ 8191, /* plane 0, page 82; 64/498 bytes (12.9%) */
+ 8440, /* plane 0, page 83; 90/510 bytes (17.6%) */
+ 8695, /* plane 0, page 84; 68/444 bytes (15.3%) */
+ 8917, /* plane 0, page 85; 78/502 bytes (15.5%) */
+ 9168, /* plane 0, page 86; 80/500 bytes (16.0%) */
+ 9418, /* plane 0, page 87; 74/512 bytes (14.5%) */
+ 9674, /* plane 0, page 88; 64/500 bytes (12.8%) */
+ 9924, /* plane 0, page 89; 56/498 bytes (11.2%) */
+ 10173, /* plane 0, page 90; 86/508 bytes (16.9%) */
+ 10427, /* plane 0, page 91; 60/488 bytes (12.3%) */
+ 10671, /* plane 0, page 92; 50/484 bytes (10.3%) */
+ 10913, /* plane 0, page 93; 52/462 bytes (11.3%) */
+ 11144, /* plane 0, page 94; 44/490 bytes (9.0%) */
+ 11389, /* plane 0, page 95; 46/426 bytes (10.8%) */
+ 11602, /* plane 0, page 96; 40/440 bytes (9.1%) */
+ 11822, /* plane 0, page 97; 58/442 bytes (13.1%) */
+ 12043, /* plane 0, page 98; 34/374 bytes (9.1%) */
+ 12230, /* plane 0, page 99; 42/464 bytes (9.1%) */
+ 12462, /* plane 0, page 100; 42/458 bytes (9.2%) */
+ 12691, /* plane 0, page 101; 48/494 bytes (9.7%) */
+ 12938, /* plane 0, page 102; 54/438 bytes (12.3%) */
+ 13157, /* plane 0, page 103; 48/508 bytes (9.4%) */
+ 13411, /* plane 0, page 104; 60/408 bytes (14.7%) */
+ 13615, /* plane 0, page 105; 72/504 bytes (14.3%) */
+ 13867, /* plane 0, page 106; 76/490 bytes (15.5%) */
+ 14112, /* plane 0, page 107; 30/494 bytes (6.1%) */
+ 14359, /* plane 0, page 108; 50/458 bytes (10.9%) */
+ 14588, /* plane 0, page 109; 40/508 bytes (7.9%) */
+ 14842, /* plane 0, page 110; 56/500 bytes (11.2%) */
+ 15092, /* plane 0, page 111; 52/492 bytes (10.6%) */
+ 15338, /* plane 0, page 112; 80/506 bytes (15.8%) */
+ 15591, /* plane 0, page 113; 84/486 bytes (17.3%) */
+ 15834, /* plane 0, page 114; 52/456 bytes (11.4%) */
+ 16062, /* plane 0, page 115; 76/502 bytes (15.1%) */
+ 16313, /* plane 0, page 116; 96/496 bytes (19.4%) */
+ 16561, /* plane 0, page 117; 62/434 bytes (14.3%) */
+ 16778, /* plane 0, page 118; 50/434 bytes (11.5%) */
+ 16995, /* plane 0, page 119; 56/488 bytes (11.5%) */
+ 17239, /* plane 0, page 120; 70/478 bytes (14.6%) */
+ 17478, /* plane 0, page 121; 62/480 bytes (12.9%) */
+ 17718, /* plane 0, page 122; 64/500 bytes (12.8%) */
+ 17968, /* plane 0, page 123; 48/486 bytes (9.9%) */
+ 18211, /* plane 0, page 124; 76/472 bytes (16.1%) */
+ 18447, /* plane 0, page 125; 46/438 bytes (10.5%) */
+ 18666, /* plane 0, page 126; 36/436 bytes (8.3%) */
+ 18884, /* plane 0, page 127; 42/492 bytes (8.5%) */
+ 19130, /* plane 0, page 128; 56/492 bytes (11.4%) */
+ 19376, /* plane 0, page 129; 62/490 bytes (12.7%) */
+ 19621, /* plane 0, page 130; 60/466 bytes (12.9%) */
+ 19854, /* plane 0, page 131; 40/456 bytes (8.8%) */
+ 20082, /* plane 0, page 132; 78/490 bytes (15.9%) */
+ 20327, /* plane 0, page 133; 44/502 bytes (8.8%) */
+ 20578, /* plane 0, page 134; 38/478 bytes (7.9%) */
+ 20817, /* plane 0, page 135; 32/270 bytes (11.9%) */
+ 20952, /* plane 0, page 136; 62/506 bytes (12.3%) */
+ 21205, /* plane 0, page 137; 44/466 bytes (9.4%) */
+ 21438, /* plane 0, page 138; 34/416 bytes (8.2%) */
+ 21646, /* plane 0, page 139; 36/432 bytes (8.3%) */
+ 21862, /* plane 0, page 140; 26/336 bytes (7.7%) */
+ 22030, /* plane 0, page 141; 32/422 bytes (7.6%) */
+ 22241, /* plane 0, page 142; 56/486 bytes (11.5%) */
+ 22484, /* plane 0, page 143; 62/452 bytes (13.7%) */
+ 22710, /* plane 0, page 144; 28/380 bytes (7.4%) */
+ 22900, /* plane 0, page 145; 42/350 bytes (12.0%) */
+ 23075, /* plane 0, page 146; 82/494 bytes (16.6%) */
+ 23322, /* plane 0, page 147; 92/486 bytes (18.9%) */
+ 23565, /* plane 0, page 148; 62/494 bytes (12.6%) */
+ 23812, /* plane 0, page 149; 32/402 bytes (8.0%) */
+ 24013, /* plane 0, page 150; 34/434 bytes (7.8%) */
+ 24230, /* plane 0, page 151; 70/488 bytes (14.3%) */
+ 24474, /* plane 0, page 152; 60/454 bytes (13.2%) */
+ 24701, /* plane 0, page 153; 54/466 bytes (11.6%) */
+ 24934, /* plane 0, page 154; 46/490 bytes (9.4%) */
+ 25179, /* plane 0, page 155; 60/510 bytes (11.8%) */
+ 25434, /* plane 0, page 156; 40/248 bytes (16.1%) */
+ 25558, /* plane 0, page 157; 52/504 bytes (10.3%) */
+ 25810, /* plane 0, page 158; 68/492 bytes (13.8%) */
+ 26056, /* plane 0, page 159; 38/330 bytes (11.5%) */
+ -1, /* plane 0, page 160 */
+ -1, /* plane 0, page 161 */
+ -1, /* plane 0, page 162 */
+ -1, /* plane 0, page 163 */
+ -1, /* plane 0, page 164 */
+ -1, /* plane 0, page 165 */
+ -1, /* plane 0, page 166 */
+ -1, /* plane 0, page 167 */
+ -1, /* plane 0, page 168 */
+ -1, /* plane 0, page 169 */
+ -1, /* plane 0, page 170 */
+ -1, /* plane 0, page 171 */
+ -1, /* plane 0, page 172 */
+ -1, /* plane 0, page 173 */
+ -1, /* plane 0, page 174 */
+ -1, /* plane 0, page 175 */
+ -1, /* plane 0, page 176 */
+ -1, /* plane 0, page 177 */
+ -1, /* plane 0, page 178 */
+ -1, /* plane 0, page 179 */
+ -1, /* plane 0, page 180 */
+ -1, /* plane 0, page 181 */
+ -1, /* plane 0, page 182 */
+ -1, /* plane 0, page 183 */
+ -1, /* plane 0, page 184 */
+ -1, /* plane 0, page 185 */
+ -1, /* plane 0, page 186 */
+ -1, /* plane 0, page 187 */
+ -1, /* plane 0, page 188 */
+ -1, /* plane 0, page 189 */
+ -1, /* plane 0, page 190 */
+ -1, /* plane 0, page 191 */
+ -1, /* plane 0, page 192 */
+ -1, /* plane 0, page 193 */
+ -1, /* plane 0, page 194 */
+ -1, /* plane 0, page 195 */
+ -1, /* plane 0, page 196 */
+ -1, /* plane 0, page 197 */
+ -1, /* plane 0, page 198 */
+ -1, /* plane 0, page 199 */
+ -1, /* plane 0, page 200 */
+ -1, /* plane 0, page 201 */
+ -1, /* plane 0, page 202 */
+ -1, /* plane 0, page 203 */
+ -1, /* plane 0, page 204 */
+ -1, /* plane 0, page 205 */
+ -1, /* plane 0, page 206 */
+ -1, /* plane 0, page 207 */
+ -1, /* plane 0, page 208 */
+ -1, /* plane 0, page 209 */
+ -1, /* plane 0, page 210 */
+ -1, /* plane 0, page 211 */
+ -1, /* plane 0, page 212 */
+ -1, /* plane 0, page 213 */
+ -1, /* plane 0, page 214 */
+ -1, /* plane 0, page 215 */
+ -1, /* plane 0, page 216 */
+ -1, /* plane 0, page 217 */
+ -1, /* plane 0, page 218 */
+ -1, /* plane 0, page 219 */
+ -1, /* plane 0, page 220 */
+ -1, /* plane 0, page 221 */
+ -1, /* plane 0, page 222 */
+ -1, /* plane 0, page 223 */
+ 26221, /* plane 0, page 224; 234/510 bytes (45.9%) */
+ 26476, /* plane 0, page 225; 246/506 bytes (48.6%) */
+ 26729, /* plane 0, page 226; 232/514 bytes (45.1%) */
+ 26986, /* plane 0, page 227; 244/514 bytes (47.5%) */
+ 27243, /* plane 0, page 228; 238/502 bytes (47.4%) */
+ 27494, /* plane 0, page 229; 284/512 bytes (55.5%) */
+ 27750, /* plane 0, page 230; 304/514 bytes (59.1%) */
+ 28007, /* plane 0, page 231; 272/514 bytes (52.9%) */
+ 28264, /* plane 0, page 232; 294/512 bytes (57.4%) */
+ 28520, /* plane 0, page 233; 244/512 bytes (47.7%) */
+ 28776, /* plane 0, page 234; 160/508 bytes (31.5%) */
+ 29030, /* plane 0, page 235; 366/514 bytes (71.2%) */
+ 29287, /* plane 0, page 236; 288/508 bytes (56.7%) */
+ 29541, /* plane 0, page 237; 196/486 bytes (40.3%) */
+ 29784, /* plane 0, page 238; 106/354 bytes (29.9%) */
+ -1, /* plane 0, page 239 */
+ -1, /* plane 0, page 240 */
+ -1, /* plane 0, page 241 */
+ -1, /* plane 0, page 242 */
+ 29961, /* plane 0, page 243; 78/504 bytes (15.5%) */
+ 30213, /* plane 0, page 244; 330/508 bytes (65.0%) */
+ 30467, /* plane 0, page 245; 222/482 bytes (46.1%) */
+ 30708, /* plane 0, page 246; 94/374 bytes (25.1%) */
+ 30895, /* plane 0, page 247; 16/22 bytes (72.7%) */
+ 30906, /* plane 0, page 248; 58/58 bytes (100.0%) */
+ 30935, /* plane 0, page 249; 4/4 bytes (100.0%) */
+ -1, /* plane 0, page 250 */
+ -1, /* plane 0, page 251 */
+ -1, /* plane 0, page 252 */
+ -1, /* plane 0, page 253 */
+ -1, /* plane 0, page 254 */
+ 30937, /* plane 0, page 255; 16/474 bytes (3.4%) */
+ /* plane 1: --- */
+ 31174, /* plane 2, page 0; 32/414 bytes (7.7%) */
+ 31381, /* plane 2, page 1; 18/464 bytes (3.9%) */
+ 31613, /* plane 2, page 2; 28/454 bytes (6.2%) */
+ 31840, /* plane 2, page 3; 34/488 bytes (7.0%) */
+ 32084, /* plane 2, page 4; 26/474 bytes (5.5%) */
+ 32321, /* plane 2, page 5; 24/332 bytes (7.2%) */
+ 32487, /* plane 2, page 6; 16/206 bytes (7.8%) */
+ 32590, /* plane 2, page 7; 8/218 bytes (3.7%) */
+ 32699, /* plane 2, page 8; 8/342 bytes (2.3%) */
+ 32870, /* plane 2, page 9; 12/422 bytes (2.8%) */
+ 33081, /* plane 2, page 10; 12/380 bytes (3.2%) */
+ 33271, /* plane 2, page 11; 24/488 bytes (4.9%) */
+ 33515, /* plane 2, page 12; 56/492 bytes (11.4%) */
+ 33761, /* plane 2, page 13; 46/362 bytes (12.7%) */
+ 33942, /* plane 2, page 14; 74/498 bytes (14.9%) */
+ 34191, /* plane 2, page 15; 44/420 bytes (10.5%) */
+ 34401, /* plane 2, page 16; 56/456 bytes (12.3%) */
+ 34629, /* plane 2, page 17; 20/344 bytes (5.8%) */
+ 34801, /* plane 2, page 18; 18/392 bytes (4.6%) */
+ 34997, /* plane 2, page 19; 32/508 bytes (6.3%) */
+ 35251, /* plane 2, page 20; 26/472 bytes (5.5%) */
+ 35487, /* plane 2, page 21; 8/66 bytes (12.1%) */
+ 35520, /* plane 2, page 22; 44/492 bytes (8.9%) */
+ 35766, /* plane 2, page 23; 76/482 bytes (15.8%) */
+ 36007, /* plane 2, page 24; 70/440 bytes (15.9%) */
+ 36227, /* plane 2, page 25; 44/484 bytes (9.1%) */
+ 36469, /* plane 2, page 26; 10/64 bytes (15.6%) */
+ 36501, /* plane 2, page 27; 8/256 bytes (3.1%) */
+ 36629, /* plane 2, page 28; 12/264 bytes (4.5%) */
+ 36761, /* plane 2, page 29; 18/362 bytes (5.0%) */
+ 36942, /* plane 2, page 30; 18/374 bytes (4.8%) */
+ 37129, /* plane 2, page 31; 14/438 bytes (3.2%) */
+ 37348, /* plane 2, page 32; 14/370 bytes (3.8%) */
+ 37533, /* plane 2, page 33; 14/310 bytes (4.5%) */
+ 37688, /* plane 2, page 34; 6/236 bytes (2.5%) */
+ 37806, /* plane 2, page 35; 14/438 bytes (3.2%) */
+ 38025, /* plane 2, page 36; 14/276 bytes (5.1%) */
+ 38163, /* plane 2, page 37; 16/346 bytes (4.6%) */
+ 38336, /* plane 2, page 38; 22/442 bytes (5.0%) */
+ 38557, /* plane 2, page 39; 22/378 bytes (5.8%) */
+ 38746, /* plane 2, page 40; 16/492 bytes (3.3%) */
+ 38992, /* plane 2, page 41; 16/222 bytes (7.2%) */
+ 39103, /* plane 2, page 42; 12/264 bytes (4.5%) */
+ 39235, /* plane 2, page 43; 16/388 bytes (4.1%) */
+ 39429, /* plane 2, page 44; 34/330 bytes (10.3%) */
+ 39594, /* plane 2, page 45; 28/466 bytes (6.0%) */
+ 39827, /* plane 2, page 46; 16/456 bytes (3.5%) */
+ 40055, /* plane 2, page 47; 8/226 bytes (3.5%) */
+ 40168, /* plane 2, page 48; 22/338 bytes (6.5%) */
+ 40337, /* plane 2, page 49; 26/496 bytes (5.2%) */
+ 40585, /* plane 2, page 50; 36/424 bytes (8.5%) */
+ 40797, /* plane 2, page 51; 26/512 bytes (5.1%) */
+ 41053, /* plane 2, page 52; 14/462 bytes (3.0%) */
+ 41284, /* plane 2, page 53; 24/440 bytes (5.5%) */
+ 41504, /* plane 2, page 54; 26/480 bytes (5.4%) */
+ 41744, /* plane 2, page 55; 30/428 bytes (7.0%) */
+ 41958, /* plane 2, page 56; 4/4 bytes (100.0%) */
+ 41960, /* plane 2, page 57; 4/4 bytes (100.0%) */
+ 41962, /* plane 2, page 58; 10/170 bytes (5.9%) */
+ 42047, /* plane 2, page 59; 4/4 bytes (100.0%) */
+ 42049, /* plane 2, page 60; 28/316 bytes (8.9%) */
+ 42207, /* plane 2, page 61; 30/372 bytes (8.1%) */
+ 42393, /* plane 2, page 62; 44/474 bytes (9.3%) */
+ 42630, /* plane 2, page 63; 38/378 bytes (10.1%) */
+ 42819, /* plane 2, page 64; 30/420 bytes (7.1%) */
+ 43029, /* plane 2, page 65; 46/500 bytes (9.2%) */
+ 43279, /* plane 2, page 66; 34/450 bytes (7.6%) */
+ 43504, /* plane 2, page 67; 36/474 bytes (7.6%) */
+ 43741, /* plane 2, page 68; 28/424 bytes (6.6%) */
+ 43953, /* plane 2, page 69; 10/394 bytes (2.5%) */
+ 44150, /* plane 2, page 70; 14/380 bytes (3.7%) */
+ 44340, /* plane 2, page 71; 12/440 bytes (2.7%) */
+ 44560, /* plane 2, page 72; 22/478 bytes (4.6%) */
+ 44799, /* plane 2, page 73; 116/506 bytes (22.9%) */
+ 45052, /* plane 2, page 74; 108/442 bytes (24.4%) */
+ 45273, /* plane 2, page 75; 6/274 bytes (2.2%) */
+ 45410, /* plane 2, page 76; 12/420 bytes (2.9%) */
+ 45620, /* plane 2, page 77; 12/462 bytes (2.6%) */
+ 45851, /* plane 2, page 78; 10/220 bytes (4.5%) */
+ 45961, /* plane 2, page 79; 20/364 bytes (5.5%) */
+ 46143, /* plane 2, page 80; 8/230 bytes (3.5%) */
+ 46258, /* plane 2, page 81; 18/380 bytes (4.7%) */
+ 46448, /* plane 2, page 82; 14/372 bytes (3.8%) */
+ 46634, /* plane 2, page 83; 8/14 bytes (57.1%) */
+ 46641, /* plane 2, page 84; 16/174 bytes (9.2%) */
+ 46728, /* plane 2, page 85; 36/354 bytes (10.2%) */
+ 46905, /* plane 2, page 86; 16/486 bytes (3.3%) */
+ 47148, /* plane 2, page 87; 20/442 bytes (4.5%) */
+ 47369, /* plane 2, page 88; 12/280 bytes (4.3%) */
+ 47509, /* plane 2, page 89; 12/406 bytes (3.0%) */
+ 47712, /* plane 2, page 90; 12/172 bytes (7.0%) */
+ 47798, /* plane 2, page 91; 16/236 bytes (6.8%) */
+ 47916, /* plane 2, page 92; 22/510 bytes (4.3%) */
+ 48171, /* plane 2, page 93; 8/74 bytes (10.8%) */
+ 48208, /* plane 2, page 94; 20/408 bytes (4.9%) */
+ 48412, /* plane 2, page 95; 10/404 bytes (2.5%) */
+ 48614, /* plane 2, page 96; 16/252 bytes (6.3%) */
+ 48740, /* plane 2, page 97; 22/442 bytes (5.0%) */
+ 48961, /* plane 2, page 98; 12/244 bytes (4.9%) */
+ 49083, /* plane 2, page 99; 16/394 bytes (4.1%) */
+ 49280, /* plane 2, page 100; 24/304 bytes (7.9%) */
+ 49432, /* plane 2, page 101; 12/350 bytes (3.4%) */
+ 49607, /* plane 2, page 102; 18/472 bytes (3.8%) */
+ 49843, /* plane 2, page 103; 14/368 bytes (3.8%) */
+ 50027, /* plane 2, page 104; 18/346 bytes (5.2%) */
+ 50200, /* plane 2, page 105; 20/476 bytes (4.2%) */
+ 50438, /* plane 2, page 106; 14/78 bytes (17.9%) */
+ 50477, /* plane 2, page 107; 38/488 bytes (7.8%) */
+ 50721, /* plane 2, page 108; 30/356 bytes (8.4%) */
+ 50899, /* plane 2, page 109; 50/416 bytes (12.0%) */
+ 51107, /* plane 2, page 110; 44/434 bytes (10.1%) */
+ 51324, /* plane 2, page 111; 18/374 bytes (4.8%) */
+ 51511, /* plane 2, page 112; 22/472 bytes (4.7%) */
+ 51747, /* plane 2, page 113; 20/396 bytes (5.1%) */
+ 51945, /* plane 2, page 114; 16/410 bytes (3.9%) */
+ 52150, /* plane 2, page 115; 4/4 bytes (100.0%) */
+ 52152, /* plane 2, page 116; 10/204 bytes (4.9%) */
+ 52254, /* plane 2, page 117; 14/280 bytes (5.0%) */
+ 52394, /* plane 2, page 118; 18/286 bytes (6.3%) */
+ 52537, /* plane 2, page 119; 18/382 bytes (4.7%) */
+ 52728, /* plane 2, page 120; 12/228 bytes (5.3%) */
+ 52842, /* plane 2, page 121; 14/438 bytes (3.2%) */
+ 53061, /* plane 2, page 122; 22/472 bytes (4.7%) */
+ 53297, /* plane 2, page 123; 18/480 bytes (3.8%) */
+ 53537, /* plane 2, page 124; 4/4 bytes (100.0%) */
+ 53539, /* plane 2, page 125; 22/350 bytes (6.3%) */
+ 53714, /* plane 2, page 126; 6/8 bytes (75.0%) */
+ 53718, /* plane 2, page 127; 4/4 bytes (100.0%) */
+ 53720, /* plane 2, page 128; 28/488 bytes (5.7%) */
+ 53964, /* plane 2, page 129; 16/288 bytes (5.6%) */
+ 54108, /* plane 2, page 130; 18/442 bytes (4.1%) */
+ 54329, /* plane 2, page 131; 18/268 bytes (6.7%) */
+ 54463, /* plane 2, page 132; 12/228 bytes (5.3%) */
+ 54577, /* plane 2, page 133; 14/490 bytes (2.9%) */
+ 54822, /* plane 2, page 134; 20/464 bytes (4.3%) */
+ 55054, /* plane 2, page 135; 6/12 bytes (50.0%) */
+ 55060, /* plane 2, page 136; 6/82 bytes (7.3%) */
+ 55101, /* plane 2, page 137; 54/406 bytes (13.3%) */
+ 55304, /* plane 2, page 138; 74/478 bytes (15.5%) */
+ 55543, /* plane 2, page 139; 72/490 bytes (14.7%) */
+ 55788, /* plane 2, page 140; 28/418 bytes (6.7%) */
+ 55997, /* plane 2, page 141; 8/270 bytes (3.0%) */
+ 56132, /* plane 2, page 142; 24/436 bytes (5.5%) */
+ 56350, /* plane 2, page 143; 4/4 bytes (100.0%) */
+ 56352, /* plane 2, page 144; 24/206 bytes (11.7%) */
+ 56455, /* plane 2, page 145; 24/448 bytes (5.4%) */
+ -1, /* plane 2, page 146 */
+ -1, /* plane 2, page 147 */
+ 56679, /* plane 2, page 148; 22/408 bytes (5.4%) */
+ 56883, /* plane 2, page 149; 14/176 bytes (8.0%) */
+ -1, /* plane 2, page 150 */
+ 56971, /* plane 2, page 151; 8/364 bytes (2.2%) */
+ 57153, /* plane 2, page 152; 14/454 bytes (3.1%) */
+ 57380, /* plane 2, page 153; 24/400 bytes (6.0%) */
+ 57580, /* plane 2, page 154; 6/78 bytes (7.7%) */
+ 57619, /* plane 2, page 155; 8/420 bytes (1.9%) */
+ 57829, /* plane 2, page 156; 6/120 bytes (5.0%) */
+ 57889, /* plane 2, page 157; 14/372 bytes (3.8%) */
+ 58075, /* plane 2, page 158; 14/488 bytes (2.9%) */
+ 58319, /* plane 2, page 159; 10/378 bytes (2.6%) */
+ 58508, /* plane 2, page 160; 18/472 bytes (3.8%) */
+ 58744, /* plane 2, page 161; 24/480 bytes (5.0%) */
+ 58984, /* plane 2, page 162; 24/450 bytes (5.3%) */
+ 59209, /* plane 2, page 163; 4/4 bytes (100.0%) */
+ 59211, /* plane 2, page 164; 6/82 bytes (7.3%) */
+ 59252, /* plane 2, page 165; 6/14 bytes (42.9%) */
+ 59259, /* plane 2, page 166; 12/340 bytes (3.5%) */
+ -1, /* plane 2, page 167 */
+ -1, /* plane 2, page 168 */
+ -1, /* plane 2, page 169 */
+ -1, /* plane 2, page 170 */
+ -1, /* plane 2, page 171 */
+ -1, /* plane 2, page 172 */
+ -1, /* plane 2, page 173 */
+ -1, /* plane 2, page 174 */
+ -1, /* plane 2, page 175 */
+ -1, /* plane 2, page 176 */
+ -1, /* plane 2, page 177 */
+ -1, /* plane 2, page 178 */
+ -1, /* plane 2, page 179 */
+ -1, /* plane 2, page 180 */
+ -1, /* plane 2, page 181 */
+ -1, /* plane 2, page 182 */
+ -1, /* plane 2, page 183 */
+ -1, /* plane 2, page 184 */
+ -1, /* plane 2, page 185 */
+ -1, /* plane 2, page 186 */
+ -1, /* plane 2, page 187 */
+ -1, /* plane 2, page 188 */
+ -1, /* plane 2, page 189 */
+ -1, /* plane 2, page 190 */
+ -1, /* plane 2, page 191 */
+ -1, /* plane 2, page 192 */
+ -1, /* plane 2, page 193 */
+ -1, /* plane 2, page 194 */
+ -1, /* plane 2, page 195 */
+ -1, /* plane 2, page 196 */
+ -1, /* plane 2, page 197 */
+ -1, /* plane 2, page 198 */
+ -1, /* plane 2, page 199 */
+ -1, /* plane 2, page 200 */
+ -1, /* plane 2, page 201 */
+ -1, /* plane 2, page 202 */
+ -1, /* plane 2, page 203 */
+ -1, /* plane 2, page 204 */
+ -1, /* plane 2, page 205 */
+ -1, /* plane 2, page 206 */
+ -1, /* plane 2, page 207 */
+ -1, /* plane 2, page 208 */
+ -1, /* plane 2, page 209 */
+ -1, /* plane 2, page 210 */
+ -1, /* plane 2, page 211 */
+ -1, /* plane 2, page 212 */
+ -1, /* plane 2, page 213 */
+ -1, /* plane 2, page 214 */
+ -1, /* plane 2, page 215 */
+ -1, /* plane 2, page 216 */
+ -1, /* plane 2, page 217 */
+ -1, /* plane 2, page 218 */
+ -1, /* plane 2, page 219 */
+ -1, /* plane 2, page 220 */
+ -1, /* plane 2, page 221 */
+ -1, /* plane 2, page 222 */
+ -1, /* plane 2, page 223 */
+ -1, /* plane 2, page 224 */
+ -1, /* plane 2, page 225 */
+ -1, /* plane 2, page 226 */
+ -1, /* plane 2, page 227 */
+ -1, /* plane 2, page 228 */
+ -1, /* plane 2, page 229 */
+ -1, /* plane 2, page 230 */
+ -1, /* plane 2, page 231 */
+ -1, /* plane 2, page 232 */
+ -1, /* plane 2, page 233 */
+ -1, /* plane 2, page 234 */
+ -1, /* plane 2, page 235 */
+ -1, /* plane 2, page 236 */
+ -1, /* plane 2, page 237 */
+ -1, /* plane 2, page 238 */
+ -1, /* plane 2, page 239 */
+ -1, /* plane 2, page 240 */
+ -1, /* plane 2, page 241 */
+ -1, /* plane 2, page 242 */
+ -1, /* plane 2, page 243 */
+ -1, /* plane 2, page 244 */
+ -1, /* plane 2, page 245 */
+ -1, /* plane 2, page 246 */
+ -1, /* plane 2, page 247 */
+ 59429, /* plane 2, page 248; 16/340 bytes (4.7%) */
+ 59599, /* plane 2, page 249; 10/132 bytes (7.6%) */
+ -1, /* plane 2, page 250 */
+ -1, /* plane 2, page 251 */
+ -1, /* plane 2, page 252 */
+ -1, /* plane 2, page 253 */
+ -1, /* plane 2, page 254 */
+ -1, /* plane 2, page 255 */
+ /* plane 3: --- */
+ /* plane 4: --- */
+ /* plane 5: --- */
+ /* plane 6: --- */
+ /* plane 7: --- */
+ /* plane 8: --- */
+ /* plane 9: --- */
+ /* plane 10: --- */
+ /* plane 11: --- */
+ /* plane 12: --- */
+ /* plane 13: --- */
+ /* plane 14: --- */
+ /* plane 15: --- */
+ /* plane 16: --- */
+};
+
+static sal_Int32 const aImplUnicodeToBig5Hkscs2001PlaneOffsets[] = {
+ 0 * 256, /* plane 0; 576/1024 bytes (56.3%), 11016/62348 bytes (17.7%) */
+ -1, /* plane 1 */
+ 1 * 256, /* plane 2; 664/1024 bytes (64.8%), 3634/56982 bytes (6.4%) */
+ -1, /* plane 3 */
+ -1, /* plane 4 */
+ -1, /* plane 5 */
+ -1, /* plane 6 */
+ -1, /* plane 7 */
+ -1, /* plane 8 */
+ -1, /* plane 9 */
+ -1, /* plane 10 */
+ -1, /* plane 11 */
+ -1, /* plane 12 */
+ -1, /* plane 13 */
+ -1, /* plane 14 */
+ -1, /* plane 15 */
+ -1, /* plane 16 */
+ /* 8/68 bytes (11.8%), 1240/2048 bytes (60.5%), 14650/119330 bytes (12.3%) */
+};
diff --git a/sal/textenc/generate/cns116431992.pl b/sal/textenc/generate/cns116431992.pl
new file mode 100644
index 000000000000..0cfd2f03a209
--- /dev/null
+++ b/sal/textenc/generate/cns116431992.pl
@@ -0,0 +1,856 @@
+#!/usr/bin/perl
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+# The following files must be available in a ./input subdir:
+
+# <http://www.unicode.org/Public/UNIDATA/Unihan.txt>:
+# "Unicode version: 3.1.1 Table version: 1.1 Date: 28 June 2001"
+# contains descriptions for:
+# U+3400..4DFF CJK Unified Ideographs Extension A
+# U+4E00..9FFF CJK Unified Ideographs
+# U+F900..FAFF CJK Compatibility Ideographs
+# U+20000..2F7FF CJK Unified Ideographs Extension B
+# U+2F800..2FFFF CJK Compatibility Ideographs Supplement
+
+# <http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/CNS11643.TXT>:
+# "Unicode version: 1.1 Table version: 0.0d1 Date: 21 October 1994"
+# contains mappings for CNS 11643-1986
+
+# <http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/ftp/CJKtable/Uni2CNS.Z>:
+# "Unicode version: 1.1 Table version: 0.49 Date: 26 March 1998"
+# contains mappings for CNS 11643-1992 that are incompatible with
+# CNS11643.TXT
+
+$id = "Cns116431992";
+
+sub isValidUtf32
+{
+ my $utf32 = $_[0];
+ return $utf32 >= 0 && $utf32 <= 0x10FFFF
+ && !($utf32 >= 0xD800 && $utf32 <= 0xDFFF)
+ && !($utf32 >= 0xFDD0 && $utf32 <= 0xFDEF)
+ && ($utf32 & 0xFFFF) < 0xFFFE;
+}
+
+sub printUtf32
+{
+ my $utf32 = $_[0];
+ return sprintf("U+%04X", $utf32);
+}
+
+sub isValidCns116431992
+{
+ my $plane = $_[0];
+ my $row = $_[1];
+ my $column = $_[2];
+ return $plane >= 1 && $plane <= 16
+ && $row >= 1 && $row <= 94
+ && $column >= 1 && $column <= 94;
+}
+
+sub printCns116431992
+{
+ my $plane = $_[0];
+ my $row = $_[1];
+ my $column = $_[2];
+ return sprintf("%d-%02d/%02d", $plane, $row, $column);
+}
+
+sub printStats
+{
+ my $used = $_[0];
+ my $space = $_[1];
+ return sprintf("%d/%d bytes (%.1f%%)",
+ $used,
+ $space,
+ $used * 100 / $space);
+}
+
+sub printSpaces
+{
+ my $column_width = $_[0];
+ my $columns_per_line = $_[1];
+ my $end = $_[2];
+ $output = "";
+ for ($i = int($end / $columns_per_line) * $columns_per_line;
+ $i < $end;
+ ++$i)
+ {
+ for ($j = 0; $j < $column_width; ++$j)
+ {
+ $output = $output . " ";
+ }
+ }
+ return $output;
+}
+
+$count_Unihan_txt = 0;
+$count_CNS11643_TXT = 0;
+$count_Uni2CNS = 0;
+
+if (1)
+{
+ $filename = "Unihan.txt";
+ open IN, ("input/" . $filename) or die "Cannot read " . $filename;
+ while (<IN>)
+ {
+ if (/^U\+([0-9A-F]+)\tkCNS1992\t([0-9A-F])-([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])$/)
+ {
+ $utf32 = oct("0x" . $1);
+ $cns_plane = oct("0x" . $2);
+ $cns_row = oct("0x" . $3) - 0x20;
+ $cns_column = oct("0x" . $4) - 0x20;
+ isValidUtf32($utf32)
+ or die "Bad UTF32 char U+" . printUtf32($utf32);
+ isValidCns116431992($cns_plane, $cns_row, $cns_column)
+ or die "Bad CNS11643-1992 char "
+ . printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column);
+ if (!defined($cns_map[$cns_plane][$cns_row][$cns_column]))
+ {
+ $cns_map[$cns_plane][$cns_row][$cns_column] = $utf32;
+ $cns_plane_used[$cns_plane] = 1;
+ ++$count_Unihan_txt;
+ }
+ else
+ {
+ ($cns_map[$cns_plane][$cns_row][$cns_column] == $utf32)
+ or die "Mapping "
+ . printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column)
+ . " to "
+ . printUtf32($cns_map[$cns_plane]
+ [$cns_row]
+ [$cns_column])
+ . ", NOT "
+ . printUtf32($utf32);
+ }
+ }
+ elsif (/^U\+([0-9A-F]+)\tkIRG_TSource\t([0-9A-F])-([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])$/)
+ {
+ $utf32 = oct("0x" . $1);
+ $cns_plane = oct("0x" . $2);
+ $cns_row = oct("0x" . $3) - 0x20;
+ $cns_column = oct("0x" . $4) - 0x20;
+ isValidUtf32($utf32)
+ or die "Bad UTF32 char U+" . printUtf32($utf32);
+ isValidCns116431992($cns_plane, $cns_row, $cns_column)
+ or die "Bad CNS11643-1992 char "
+ . printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column);
+ if (!defined($cns_map[$cns_plane][$cns_row][$cns_column]))
+ {
+ $cns_map[$cns_plane][$cns_row][$cns_column] = $utf32;
+ $cns_plane_used[$cns_plane] = 1;
+ ++$count_Unihan_txt;
+ }
+ else
+ {
+ ($cns_map[$cns_plane][$cns_row][$cns_column] == $utf32)
+ or print "WARNING! Mapping ",
+ printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column),
+ " to ",
+ printUtf32($cns_map[$cns_plane]
+ [$cns_row]
+ [$cns_column]),
+ ", NOT ",
+ printUtf32($utf32),
+ "\n";
+ }
+ }
+ elsif (/^U\+([0-9A-F]+)\tkCNS1992\t.*$/)
+ {
+ die "Bad format";
+ }
+ }
+ close IN;
+}
+
+if (1)
+{
+ $filename = "CNS11643.TXT";
+ open IN, ("input/" . $filename) or die "Cannot read " . $filename;
+ while (<IN>)
+ {
+ if (/0x([0-9A-F])([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])\t0x([0-9A-F]+)\t\#.*$/)
+ {
+ $utf32 = oct("0x" . $4);
+ $cns_plane = oct("0x" . $1);
+ $cns_row = oct("0x" . $2) - 0x20;
+ $cns_column = oct("0x" . $3) - 0x20;
+ isValidUtf32($utf32)
+ or die "Bad UTF32 char U+" . printUtf32($utf32);
+ isValidCns116431992($cns_plane, $cns_row, $cns_column)
+ or die "Bad CNS11643-1992 char "
+ . printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column);
+ if ($cns_plane <= 2)
+ {
+ if (!defined($cns_map[$cns_plane][$cns_row][$cns_column]))
+ {
+ $cns_map[$cns_plane][$cns_row][$cns_column] = $utf32;
+ $cns_plane_used[$cns_plane] = 1;
+ ++$count_CNS11643_TXT;
+ }
+ else
+ {
+ ($cns_map[$cns_plane][$cns_row][$cns_column] == $utf32)
+ or die "Mapping "
+ . printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column)
+ . " to "
+ . printUtf32($cns_map[$cns_plane]
+ [$cns_row]
+ [$cns_column])
+ . ", NOT "
+ . printUtf32($utf32);
+ }
+ }
+ }
+ }
+ close IN;
+}
+
+if (0)
+{
+ $filename = "Uni2CNS";
+ open IN, ("input/" . $filename) or die "Cannot read " . $filename;
+ while (<IN>)
+ {
+ if (/([0-9A-F]+)\t([0-9A-F])-([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])\t.*$/)
+ {
+ $utf32 = oct("0x" . $1);
+ $cns_plane = oct("0x" . $2);
+ $cns_row = oct("0x" . $3) - 0x20;
+ $cns_column = oct("0x" . $4) - 0x20;
+ isValidUtf32($utf32)
+ or die "Bad UTF32 char U+" . printUtf32($utf32);
+ isValidCns116431992($cns_plane, $cns_row, $cns_column)
+ or die "Bad CNS11643-1992 char "
+ . printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column);
+ if (!defined($cns_map[$cns_plane][$cns_row][$cns_column]))
+ {
+ $cns_map[$cns_plane][$cns_row][$cns_column] = $utf32;
+ $cns_plane_used[$cns_plane] = 1;
+ ++$count_Uni2CNS;
+ }
+ else
+ {
+# ($cns_map[$cns_plane][$cns_row][$cns_column] == $utf32)
+# or die "Mapping "
+# . printCns116431992($cns_plane,
+# $cns_row,
+# $cns_column)
+# . " to "
+# . printUtf32($cns_map[$cns_plane]
+# [$cns_row]
+# [$cns_column])
+# . ", NOT "
+# . printUtf32($utf32);
+ }
+ if ($cns_plane == 1)
+ {
+ print printCns116431992($cns_plane, $cns_row, $cns_column),
+ "\n";
+ }
+ }
+ }
+ close IN;
+}
+
+for ($cns_plane = 1; $cns_plane <= 16; ++$cns_plane)
+{
+ if (defined($cns_plane_used[$cns_plane]))
+ {
+ for ($cns_row = 1; $cns_row <= 94; ++$cns_row)
+ {
+ for ($cns_column = 1; $cns_column <= 94; ++$cns_column)
+ {
+ if (defined($cns_map[$cns_plane][$cns_row][$cns_column]))
+ {
+ $utf32 = $cns_map[$cns_plane][$cns_row][$cns_column];
+ $uni_plane = $utf32 >> 16;
+ $uni_page = ($utf32 >> 8) & 0xFF;
+ $uni_index = $utf32 & 0xFF;
+ if (!defined($uni_plane_used[$uni_plane])
+ || !defined($uni_page_used[$uni_plane][$uni_page])
+ || !defined($uni_map[$uni_plane]
+ [$uni_page]
+ [$uni_index]))
+ {
+ $uni_map[$uni_plane][$uni_page][$uni_index]
+ = ($cns_plane << 16)
+ | ($cns_row << 8)
+ | $cns_column;
+ $uni_plane_used[$uni_plane] = 1;
+ $uni_page_used[$uni_plane][$uni_page] = 1;
+ }
+ else
+ {
+ $cns1 = $uni_map[$uni_plane][$uni_page][$uni_index];
+ $cns1_plane = $cns1 >> 16;
+ $cns1_row = ($cns1 >> 8) & 0xFF;
+ $cns1_column = $cns1 & 0xFF;
+
+ # Do not map from Unicode to Fictious Character Set
+ # Extensions (Lunde, p. 131), if possible:
+ if ($cns_plane == 3
+ && ($cns_row == 66 && $cns_column > 38
+ || $cns_row > 66))
+ {
+ print " (",
+ printUtf32($utf32),
+ " to fictious ",
+ printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column),
+ " ignored, favouring ",
+ printCns116431992($cns1_plane,
+ $cns1_row,
+ $cns1_column),
+ ")\n";
+ }
+ elsif ($cns1_plane == 3
+ && ($cns1_row == 66 && $cns1_column > 38
+ || $cns1_row > 66))
+ {
+ $uni_map[$uni_plane][$uni_page][$uni_index]
+ = ($cns_plane << 16)
+ | ($cns_row << 8)
+ | $cns_column;
+ print " (",
+ printUtf32($utf32),
+ " to fictious ",
+ printCns116431992($cns1_plane,
+ $cns1_row,
+ $cns1_column),
+ " ignored, favouring ",
+ printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column),
+ ")\n";
+ }
+ else
+ {
+ print "WARNING! Mapping ",
+ printUtf32($utf32),
+ " to ",
+ printCns116431992($cns1_plane,
+ $cns1_row,
+ $cns1_column),
+ ", NOT ",
+ printCns116431992($cns_plane,
+ $cns_row,
+ $cns_column),
+ "\n";
+ }
+ }
+ }
+ }
+ }
+ }
+}
+if (defined($uni_plane_used[0]) && defined($uni_page_used[0][0]))
+{
+ for ($utf32 = 0; $utf32 <= 0x7F; ++$utf32)
+ {
+ if (defined($uni_map[0][0][$uni_index]))
+ {
+ $cns = $uni_map[0][0][$utf32];
+ die "Mapping "
+ . printUtf32($utf32)
+ . " to "
+ . printCns116431992($cns >> 16,
+ ($cns >> 8) & 0xFF,
+ $cns & 0xFF);
+ }
+ }
+}
+
+$filename = lc($id) . ".tab";
+open OUT, ("> " . $filename) or die "Cannot write " . $filename;
+
+{
+ $filename = lc($id). ".pl";
+ open IN, $filename or die "Cannot read ". $filename;
+ $first = 1;
+ while (<IN>)
+ {
+ if (/^\#!.*$/)
+ {
+ }
+ elsif (/^\#(\*.*)$/)
+ {
+ if ($first == 1)
+ {
+ print OUT "/", $1, "\n";
+ $first = 0;
+ }
+ else
+ {
+ print OUT " ", substr($1, 0, length($1) - 1), "/\n";
+ }
+ }
+ elsif (/^\# (.*)$/)
+ {
+ print OUT " *", $1, "\n";
+ }
+ elsif (/^\#(.*)$/)
+ {
+ print OUT " *", $1, "\n";
+ }
+ else
+ {
+ goto done;
+ }
+ }
+ done:
+}
+
+print OUT "\n",
+ "#ifndef _SAL_TYPES_H_\n",
+ "#include \"sal/types.h\"\n",
+ "#endif\n",
+ "\n";
+
+print OUT "static sal_uInt16 const aImpl", $id, "ToUnicodeData[] = {\n";
+$cns_data_index = 0;
+for ($cns_plane = 1; $cns_plane <= 16; ++$cns_plane)
+{
+ if (defined($cns_plane_used[$cns_plane]))
+ {
+ $cns_rows = 0;
+ $cns_chars = 0;
+ for ($cns_row = 1; $cns_row <= 94; ++$cns_row)
+ {
+ $cns_row_first = -1;
+ for ($cns_column = 1; $cns_column <= 94; ++$cns_column)
+ {
+ if (defined($cns_map[$cns_plane][$cns_row][$cns_column]))
+ {
+ if ($cns_row_first == -1)
+ {
+ $cns_row_first = $cns_column;
+ }
+ $cns_row_last = $cns_column;
+ }
+ }
+ if ($cns_row_first != -1)
+ {
+ $cns_data_offsets[$cns_plane][$cns_row] = $cns_data_index;
+ ++$cns_rows;
+ print OUT " /* plane ", $cns_plane, ", row ", $cns_row,
+ " */\n";
+
+ $cns_row_surrogates_first = -1;
+ $cns_row_chars = 0;
+ $cns_row_surrogates = 0;
+
+ print OUT " ", $cns_row_first, " | (", $cns_row_last,
+ " << 8), /* first, last */\n";
+ ++$cns_data_index;
+
+ print OUT " ", printSpaces(7, 10, $cns_row_first);
+ $bol = 0;
+ for ($cns_column = $cns_row_first;
+ $cns_column <= $cns_row_last;
+ ++$cns_column)
+ {
+ if ($bol == 1)
+ {
+ print OUT " ";
+ $bol = 0;
+ }
+ if (defined($cns_map[$cns_plane][$cns_row][$cns_column]))
+ {
+ $utf32 = $cns_map[$cns_plane][$cns_row][$cns_column];
+ ++$cns_row_chars;
+ if ($utf32 <= 0xFFFF)
+ {
+ printf OUT "0x%04X,", $utf32;
+ }
+ else
+ {
+ ++$cns_row_surrogates;
+ printf OUT "0x%04X,",
+ (0xD800 | (($utf32 - 0x10000) >> 10));
+ if ($cns_row_surrogates_first == -1)
+ {
+ $cns_row_surrogates_first = $cns_column;
+ }
+ $cns_row_surrogates_last = $cns_column;
+ }
+ }
+ else
+ {
+ printf OUT "0xffff,";
+ }
+ ++$cns_data_index;
+ if ($cns_column % 10 == 9)
+ {
+ print OUT "\n";
+ $bol = 1;
+ }
+ }
+ if ($bol == 0)
+ {
+ print OUT "\n";
+ }
+
+ if ($cns_row_surrogates_first != -1)
+ {
+ print OUT " ", $cns_row_surrogates_first,
+ ", /* first low-surrogate */\n";
+ ++$cns_data_index;
+
+ print OUT " ",
+ printSpaces(7, 10, $cns_row_surrogates_first);
+ $bol = 0;
+ for ($cns_column = $cns_row_surrogates_first;
+ $cns_column <= $cns_row_surrogates_last;
+ ++$cns_column)
+ {
+ if ($bol == 1)
+ {
+ print OUT " ";
+ $bol = 0;
+ }
+ $utf32 = 0;
+ if (defined($cns_map[$cns_plane]
+ [$cns_row]
+ [$cns_column]))
+ {
+ $utf32
+ = $cns_map[$cns_plane][$cns_row][$cns_column];
+ }
+ if ($utf32 <= 0xFFFF)
+ {
+ printf OUT " 0,";
+ }
+ else
+ {
+ printf OUT "0x%04X,",
+ (0xDC00
+ | (($utf32 - 0x10000) & 0x3FF));
+ }
+ ++$cns_data_index;
+ if ($cns_column % 10 == 9)
+ {
+ print OUT "\n";
+ $bol = 1;
+ }
+ }
+ if ($bol == 0)
+ {
+ print OUT "\n";
+ }
+ }
+
+ $cns_chars += $cns_row_chars;
+ $cns_data_space[$cns_plane][$cns_row]
+ = ($cns_data_index
+ - $cns_data_offsets[$cns_plane][$cns_row]) * 2;
+ $cns_data_used[$cns_plane][$cns_row]
+ = (1 + $cns_row_chars
+ + ($cns_row_surrogates == 0 ?
+ 0 : 1 + $cns_row_surrogates)) * 2;
+ }
+ else
+ {
+ print OUT " /* plane ", $cns_plane, ", row ", $cns_row,
+ ": --- */\n";
+ $cns_data_offsets[$cns_plane][$cns_row] = -1;
+ }
+ }
+ print "cns plane ",
+ $cns_plane,
+ ": rows = ",
+ $cns_rows,
+ ", chars = ",
+ $cns_chars,
+ "\n";
+ }
+}
+print OUT "};\n\n";
+
+print OUT "static sal_Int32 const aImpl", $id, "ToUnicodeRowOffsets[] = {\n";
+for ($cns_plane = 1; $cns_plane <= 16; ++$cns_plane)
+{
+ if (defined ($cns_plane_used[$cns_plane]))
+ {
+ $cns_rowoffsets_used[$cns_plane] = 0;
+ for ($cns_row = 1; $cns_row <= 94; ++$cns_row)
+ {
+ if ($cns_data_offsets[$cns_plane][$cns_row] == -1)
+ {
+ print OUT " -1, /* plane ",
+ $cns_plane,
+ ", row ",
+ $cns_row,
+ " */\n";
+ }
+ else
+ {
+ print OUT " ",
+ $cns_data_offsets[$cns_plane][$cns_row],
+ ", /* plane ",
+ $cns_plane,
+ ", row ",
+ $cns_row,
+ "; ",
+ printStats($cns_data_used[$cns_plane][$cns_row],
+ $cns_data_space[$cns_plane][$cns_row]),
+ " */\n";
+ $cns_rowoffsets_used[$cns_plane] += 4;
+ }
+ }
+ }
+ else
+ {
+ print OUT " /* plane ", $cns_plane, ": --- */\n";
+ }
+}
+print OUT "};\n\n";
+
+print OUT "static sal_Int32 const aImpl",
+ $id,
+ "ToUnicodePlaneOffsets[] = {\n";
+$cns_row_offset = 0;
+for ($cns_plane = 1; $cns_plane <= 16; ++$cns_plane)
+{
+ if (defined ($cns_plane_used[$cns_plane]))
+ {
+ print OUT " ",
+ $cns_row_offset++,
+ " * 94, /* plane ",
+ $cns_plane,
+ "; ",
+ printStats($cns_rowoffsets_used[$cns_plane], 94 * 4),
+ " */\n";
+ }
+ else
+ {
+ print OUT " -1, /* plane ", $cns_plane, " */\n";
+ }
+}
+print OUT "};\n\n";
+
+print OUT "static sal_uInt8 const aImplUnicodeTo", $id, "Data[] = {\n";
+$uni_data_index = 0;
+for ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane)
+{
+ if (defined($uni_plane_used[$uni_plane]))
+ {
+ for ($uni_page = 0; $uni_page <= 255; ++$uni_page)
+ {
+ if (defined($uni_page_used[$uni_plane][$uni_page]))
+ {
+ $uni_data_offsets[$uni_plane][$uni_page] = $uni_data_index;
+ print OUT " /* plane ", $uni_plane, ", page ", $uni_page,
+ " */\n";
+
+ $uni_page_first = -1;
+ for ($uni_index = 0; $uni_index <= 255; ++$uni_index)
+ {
+ if (defined($uni_map[$uni_plane][$uni_page][$uni_index]))
+ {
+ if ($uni_page_first == -1)
+ {
+ $uni_page_first = $uni_index;
+ }
+ $uni_page_last = $uni_index;
+ }
+ }
+
+ $uni_data_used[$uni_plane][$uni_page] = 0;
+
+ print OUT " ", $uni_page_first, ", ", $uni_page_last,
+ ", /* first, last */\n";
+ $uni_data_index += 2;
+ $uni_data_used[$uni_plane][$uni_page] += 2;
+
+ print OUT " ", printSpaces(9, 8, $uni_page_first);
+ $bol = 0;
+ for ($uni_index = $uni_page_first;
+ $uni_index <= $uni_page_last;
+ ++$uni_index)
+ {
+ if ($bol == 1)
+ {
+ print OUT " ";
+ $bol = 0;
+ }
+ if (defined($uni_map[$uni_plane][$uni_page][$uni_index]))
+ {
+ $cns = $uni_map[$uni_plane][$uni_page][$uni_index];
+ printf OUT "%2d,%2d,%2d,",
+ $cns >> 16,
+ $cns >> 8 & 0xFF,
+ $cns & 0xFF;
+ $uni_data_used[$uni_plane][$uni_page] += 3;
+ }
+ else
+ {
+ print OUT " 0, 0, 0,";
+ }
+ $uni_data_index += 3;
+ if ($uni_index % 8 == 7)
+ {
+ print OUT "\n";
+ $bol = 1;
+ }
+ }
+ if ($bol == 0)
+ {
+ print OUT "\n";
+ }
+
+ $uni_data_space[$uni_plane][$uni_page]
+ = $uni_data_index
+ - $uni_data_offsets[$uni_plane][$uni_page];
+ }
+ else
+ {
+ $uni_data_offsets[$uni_plane][$uni_page] = -1;
+ print OUT " /* plane ", $uni_plane, ", page ", $uni_page,
+ ": --- */\n";
+ }
+ }
+ }
+ else
+ {
+ print OUT " /* plane ", $uni_plane, ": --- */\n";
+ }
+}
+print OUT "};\n\n";
+
+print OUT "static sal_Int32 const aImplUnicodeTo", $id, "PageOffsets[] = {\n";
+for ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane)
+{
+ if (defined($uni_plane_used[$uni_plane]))
+ {
+ $uni_pageoffsets_used[$uni_plane] = 0;
+ $uni_data_used_sum[$uni_plane] = 0;
+ $uni_data_space_sum[$uni_plane] = 0;
+ for ($uni_page = 0; $uni_page <= 255; ++$uni_page)
+ {
+ $offset = $uni_data_offsets[$uni_plane][$uni_page];
+ if ($offset == -1)
+ {
+ print OUT " -1, /* plane ",
+ $uni_plane,
+ ", page ",
+ $uni_page,
+ " */\n";
+ }
+ else
+ {
+ print OUT " ",
+ $offset,
+ ", /* plane ",
+ $uni_plane,
+ ", page ",
+ $uni_page,
+ "; ",
+ printStats($uni_data_used[$uni_plane][$uni_page],
+ $uni_data_space[$uni_plane][$uni_page]),
+ " */\n";
+ $uni_pageoffsets_used[$uni_plane] += 4;
+ $uni_data_used_sum[$uni_plane]
+ += $uni_data_used[$uni_plane][$uni_page];
+ $uni_data_space_sum[$uni_plane]
+ += $uni_data_space[$uni_plane][$uni_page];
+ }
+ }
+ }
+ else
+ {
+ print OUT " /* plane ", $uni_plane, ": --- */\n";
+ }
+}
+print OUT "};\n\n";
+
+print OUT "static sal_Int32 const aImplUnicodeTo",
+ $id,
+ "PlaneOffsets[] = {\n";
+$uni_page_offset = 0;
+$uni_planeoffsets_used = 0;
+$uni_pageoffsets_used_sum = 0;
+$uni_pageoffsets_space_sum = 0;
+$uni_data_used_sum2 = 0;
+$uni_data_space_sum2 = 0;
+for ($uni_plane = 0; $uni_plane <= 16; ++$uni_plane)
+{
+ if (defined ($uni_plane_used[$uni_plane]))
+ {
+ print OUT " ",
+ $uni_page_offset++,
+ " * 256, /* plane ",
+ $uni_plane,
+ "; ",
+ printStats($uni_pageoffsets_used[$uni_plane], 256 * 4),
+ ", ",
+ printStats($uni_data_used_sum[$uni_plane],
+ $uni_data_space_sum[$uni_plane]),
+ " */\n";
+ $uni_planeoffsets_used += 4;
+ $uni_pageoffsets_used_sum += $uni_pageoffsets_used[$uni_plane];
+ $uni_pageoffsets_space_sum += 256 * 4;
+ $uni_data_used_sum2 += $uni_data_used_sum[$uni_plane];
+ $uni_data_space_sum2 += $uni_data_space_sum[$uni_plane];
+ }
+ else
+ {
+ print OUT " -1, /* plane ", $uni_plane, " */\n";
+ }
+}
+print OUT " /* ",
+ printStats($uni_planeoffsets_used, 17 * 4),
+ ", ",
+ printStats($uni_pageoffsets_used_sum, $uni_pageoffsets_space_sum),
+ ", ",
+ printStats($uni_data_used_sum2, $uni_data_space_sum2),
+ " */\n};\n";
+
+close OUT;
+
+print "Unihan.txt = ", $count_Unihan_txt,
+ ", CNS11643.TXT = ", $count_CNS11643_TXT,
+ ", Uni2CNS = ", $count_Uni2CNS,
+ ", total = ",
+ ($count_Unihan_txt + $count_CNS11643_TXT + $count_Uni2CNS),
+ "\n";
diff --git a/sal/textenc/generate/cns116431992.tab b/sal/textenc/generate/cns116431992.tab
new file mode 100644
index 000000000000..47c1c71a477f
--- /dev/null
+++ b/sal/textenc/generate/cns116431992.tab
@@ -0,0 +1,22869 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _SAL_TYPES_H_
+#include "sal/types.h"
+#endif
+
+static sal_uInt16 const aImplCns116431992ToUnicodeData[] = {
+ /* plane 1, row 1 */
+ 1 | (94 << 8), /* first, last */
+ 0x3000,0xFF0C,0x3001,0x3002,0xFF0E,0x30FB,0xFF1B,0xFF1A,0xFF1F,
+ 0xFF01,0xFE30,0x2026,0x2025,0xFE50,0xFE51,0xFE52,0x00B7,0xFE54,0xFE55,
+ 0xFE56,0xFE57,0xFE31,0x2014,0xFE32,0x2013,0xffff,0xffff,0xffff,0xffff,
+ 0xFF08,0xFF09,0xFE35,0xFE36,0xFF5B,0xFF5D,0xFE37,0xFE38,0x3014,0x3015,
+ 0xFE39,0xFE3A,0x3010,0x3011,0xFE3B,0xFE3C,0x300A,0x300B,0xFE3D,0xFE3E,
+ 0x3008,0x3009,0xFE3F,0xFE40,0x300C,0x300D,0xFE41,0xFE42,0x300E,0x300F,
+ 0xFE43,0xFE44,0xFE59,0xFE5A,0xFE5B,0xFE5C,0xFE5D,0xFE5E,0x2018,0x2019,
+ 0x201C,0x201D,0x301D,0x301E,0x2032,0x2035,0xFF03,0xFF06,0xFF0A,0x203B,
+ 0x00A7,0x3003,0x25CB,0x25CF,0x25B3,0x25B2,0x25CE,0x2606,0x2605,0x25C7,
+ 0x25C6,0x25A1,0x25A0,0x25BD,0x25BC,
+ /* plane 1, row 2 */
+ 1 | (94 << 8), /* first, last */
+ 0x32A3,0x2105,0x203E,0xffff,0xFF3F,0xffff,0xFE49,0xFE4A,0xFE4D,
+ 0xFE4E,0xFE4B,0xFE4C,0xFE5F,0xFE60,0xFE61,0xFF0B,0xFF0D,0x00D7,0x00F7,
+ 0x00B1,0x221A,0xFF1C,0xFF1E,0xFF1D,0x2266,0x2267,0x2260,0x221E,0x2252,
+ 0x2261,0xFE62,0xFE63,0xFE64,0xFE66,0xFE65,0x223C,0x2229,0x222A,0x22A5,
+ 0x2220,0x221F,0x22BF,0x33D2,0x33D1,0x222B,0x222E,0x2235,0x2234,0x2640,
+ 0x2642,0x2641,0x2609,0x2191,0x2193,0x2192,0x2190,0x2196,0x2197,0x2199,
+ 0x2198,0x2016,0xFF5C,0xFF0F,0xFF3C,0x2215,0xFE68,0xFF04,0xFFE5,0x3012,
+ 0xFFE0,0xFFE1,0xFF05,0xFF20,0x2103,0x2109,0xFE69,0xFE6A,0xFE6B,0x33D5,
+ 0x339C,0x339D,0x339E,0x33CE,0x33A1,0x338E,0x338F,0x33C4,0x00B0,0x5159,
+ 0x515B,0x515E,0x515D,0x5161,0x5163,
+ /* plane 1, row 3 */
+ 1 | (46 << 8), /* first, last */
+ 0x55E7,0x74E9,0x7CCE,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,
+ 0x2587,0x2588,0x258F,0x258E,0x258D,0x258C,0x258B,0x258A,0x2589,0x253C,
+ 0x2534,0x252C,0x2524,0x251C,0x2594,0x2500,0x2502,0x2595,0x250C,0x2510,
+ 0x2514,0x2518,0x256D,0x256E,0x2570,0x256F,0x2550,0x255E,0x256A,0x2561,
+ 0x25E2,0x25E3,0x25E5,0x25E4,0x2571,0x2572,0x2573,
+ /* plane 1, row 4 */
+ 1 | (94 << 8), /* first, last */
+ 0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18,
+ 0xFF19,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,
+ 0x2169,0x3021,0x3022,0x3023,0x3024,0x3025,0x3026,0x3027,0x3028,0x3029,
+ 0xffff,0x5344,0xffff,0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,
+ 0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,
+ 0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A,0xFF41,
+ 0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,
+ 0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,
+ 0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A,0x0391,0x0392,0x0393,0x0394,0x0395,
+ 0x0396,0x0397,0x0398,0x0399,0x039A,
+ /* plane 1, row 5 */
+ 1 | (80 << 8), /* first, last */
+ 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,
+ 0x03A5,0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,
+ 0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,
+ 0x03C0,0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x3105,
+ 0x3106,0x3107,0x3108,0x3109,0x310A,0x310B,0x310C,0x310D,0x310E,0x310F,
+ 0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116,0x3117,0x3118,0x3119,
+ 0x311A,0x311B,0x311C,0x311D,0x311E,0x311F,0x3120,0x3121,0x3122,0x3123,
+ 0x3124,0x3125,0x3126,0x3127,0x3128,0x3129,0x02D9,0x02C9,0x02CA,0x02C7,
+ 0x02CB,
+ /* plane 1, row 6 */
+ 1 | (30 << 8), /* first, last */
+ 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,
+ 0x2469,0x2474,0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,
+ 0x247D,0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,
+ 0x2179,
+ /* plane 1, row 7 */
+ 8 | (20 << 8), /* first, last */
+ 0x4EA0,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0x51AB,0xffff,0xffff,0xffff,0xffff,
+ 0x52F9,
+ /* plane 1, row 8: --- */
+ /* plane 1, row 9: --- */
+ /* plane 1, row 10: --- */
+ /* plane 1, row 11: --- */
+ /* plane 1, row 12: --- */
+ /* plane 1, row 13: --- */
+ /* plane 1, row 14: --- */
+ /* plane 1, row 15: --- */
+ /* plane 1, row 16: --- */
+ /* plane 1, row 17: --- */
+ /* plane 1, row 18: --- */
+ /* plane 1, row 19: --- */
+ /* plane 1, row 20: --- */
+ /* plane 1, row 21: --- */
+ /* plane 1, row 22: --- */
+ /* plane 1, row 23: --- */
+ /* plane 1, row 24: --- */
+ /* plane 1, row 25: --- */
+ /* plane 1, row 26: --- */
+ /* plane 1, row 27: --- */
+ /* plane 1, row 28: --- */
+ /* plane 1, row 29: --- */
+ /* plane 1, row 30: --- */
+ /* plane 1, row 31: --- */
+ /* plane 1, row 32: --- */
+ /* plane 1, row 33: --- */
+ /* plane 1, row 34 */
+ 1 | (33 << 8), /* first, last */
+ 0x2400,0x2401,0x2402,0x2403,0x2404,0x2405,0x2406,0x2407,0x2408,
+ 0x2409,0x240A,0x240B,0x240C,0x240D,0x240E,0x240F,0x2410,0x2411,0x2412,
+ 0x2413,0x2414,0x2415,0x2416,0x2417,0x2418,0x2419,0x241A,0x241B,0x241C,
+ 0x241D,0x241E,0x241F,0x2421,
+ /* plane 1, row 35: --- */
+ /* plane 1, row 36 */
+ 1 | (94 << 8), /* first, last */
+ 0x4E00,0x4E59,0x4E01,0x4E03,0x4E43,0x4E5D,0x4E86,0x4E8C,0x4EBA,
+ 0x513F,0x5165,0x516B,0x51E0,0x5200,0x5201,0x529B,0x5315,0x5341,0x535C,
+ 0x53C8,0x4E09,0x4E0B,0x4E08,0x4E0A,0x4E2B,0x4E38,0x51E1,0x4E45,0x4E48,
+ 0x4E5F,0x4E5E,0x4E8E,0x4EA1,0x5140,0x5203,0x52FA,0x5343,0x53C9,0x53E3,
+ 0x571F,0x58EB,0x5915,0x5927,0x5973,0x5B50,0x5B51,0x5B53,0x5BF8,0x5C0F,
+ 0x5C22,0x5C38,0x5C71,0x5DDD,0x5DE5,0x5DF1,0x5DF2,0x5DF3,0x5DFE,0x5E72,
+ 0x5EFE,0x5F0B,0x5F13,0x624D,0x4E11,0x4E10,0x4E0D,0x4E2D,0x4E30,0x4E39,
+ 0x4E4B,0x5C39,0x4E88,0x4E91,0x4E95,0x4E92,0x4E94,0x4EA2,0x4EC1,0x4EC0,
+ 0x4EC3,0x4EC6,0x4EC7,0x4ECD,0x4ECA,0x4ECB,0x4EC4,0x5143,0x5141,0x5167,
+ 0x516D,0x516E,0x516C,0x5197,0x51F6,
+ /* plane 1, row 37 */
+ 1 | (94 << 8), /* first, last */
+ 0x5206,0x5207,0x5208,0x52FB,0x52FE,0x52FF,0x5316,0x5339,0x5348,
+ 0x5347,0x5345,0x535E,0x5384,0x53CB,0x53CA,0x53CD,0x58EC,0x5929,0x592B,
+ 0x592A,0x592D,0x5B54,0x5C11,0x5C24,0x5C3A,0x5C6F,0x5DF4,0x5E7B,0x5EFF,
+ 0x5F14,0x5F15,0x5FC3,0x6208,0x6236,0x624B,0x624E,0x652F,0x6587,0x6597,
+ 0x65A4,0x65B9,0x65E5,0x66F0,0x6708,0x6728,0x6B20,0x6B62,0x6B79,0x6BCB,
+ 0x6BD4,0x6BDB,0x6C0F,0x6C34,0x706B,0x722A,0x7236,0x723B,0x7247,0x7259,
+ 0x725B,0x72AC,0x738B,0x4E19,0x4E16,0x4E15,0x4E14,0x4E18,0x4E3B,0x4E4D,
+ 0x4E4F,0x4E4E,0x4EE5,0x4ED8,0x4ED4,0x4ED5,0x4ED6,0x4ED7,0x4EE3,0x4EE4,
+ 0x4ED9,0x4EDE,0x5145,0x5144,0x5189,0x518A,0x51AC,0x51F9,0x51FA,0x51F8,
+ 0x520A,0x52A0,0x529F,0x5305,0x5306,
+ /* plane 1, row 38 */
+ 1 | (94 << 8), /* first, last */
+ 0x5317,0x531D,0x4EDF,0x534A,0x5349,0x5361,0x5360,0x536F,0x536E,
+ 0x53BB,0x53EF,0x53E4,0x53F3,0x53EC,0x53EE,0x53E9,0x53E8,0x53FC,0x53F8,
+ 0x53F5,0x53EB,0x53E6,0x53EA,0x53F2,0x53F1,0x53F0,0x53E5,0x53ED,0x53FB,
+ 0x56DB,0x56DA,0x5916,0x592E,0x5931,0x5974,0x5976,0x5B55,0x5B83,0x5C3C,
+ 0x5DE8,0x5DE7,0x5DE6,0x5E02,0x5E03,0x5E73,0x5E7C,0x5F01,0x5F18,0x5F17,
+ 0x5FC5,0x620A,0x6253,0x6254,0x6252,0x6251,0x65A5,0x65E6,0x672E,0x672C,
+ 0x672A,0x672B,0x672D,0x6B63,0x6BCD,0x6C11,0x6C10,0x6C38,0x6C41,0x6C40,
+ 0x6C3E,0x72AF,0x7384,0x7389,0x74DC,0x74E6,0x7518,0x751F,0x7528,0x7529,
+ 0x7530,0x7531,0x7532,0x7533,0x758B,0x767D,0x76AE,0x76BF,0x76EE,0x77DB,
+ 0x77E2,0x77F3,0x793A,0x79BE,0x7A74,
+ /* plane 1, row 39 */
+ 1 | (94 << 8), /* first, last */
+ 0x7ACB,0x4E1E,0x4E1F,0x4E52,0x4E53,0x4E69,0x4E99,0x4EA4,0x4EA6,
+ 0x4EA5,0x4EFF,0x4F09,0x4F19,0x4F0A,0x4F15,0x4F0D,0x4F10,0x4F11,0x4F0F,
+ 0x4EF2,0x4EF6,0x4EFB,0x4EF0,0x4EF3,0x4EFD,0x4F01,0x4F0B,0x5149,0x5147,
+ 0x5146,0x5148,0x5168,0x5171,0x518D,0x51B0,0x5217,0x5211,0x5212,0x520E,
+ 0x5216,0x52A3,0x5308,0x5321,0x5320,0x5370,0x5371,0x5409,0x540F,0x540C,
+ 0x540A,0x5410,0x5401,0x540B,0x5404,0x5411,0x540D,0x5408,0x5403,0x540E,
+ 0x5406,0x5412,0x56E0,0x56DE,0x56DD,0x5733,0x5730,0x5728,0x572D,0x572C,
+ 0x572F,0x5729,0x5919,0x591A,0x5937,0x5938,0x5984,0x5978,0x5983,0x597D,
+ 0x5979,0x5982,0x5981,0x5B57,0x5B58,0x5B87,0x5B88,0x5B85,0x5B89,0x5BFA,
+ 0x5C16,0x5C79,0x5DDE,0x5E06,0x5E76,
+ /* plane 1, row 40 */
+ 1 | (94 << 8), /* first, last */
+ 0x5E74,0x5F0F,0x5F1B,0x5FD9,0x5FD6,0x620E,0x620C,0x620D,0x6210,
+ 0x6263,0x625B,0x6258,0x6536,0x65E9,0x65E8,0x65EC,0x65ED,0x66F2,0x66F3,
+ 0x6709,0x673D,0x6734,0x6731,0x6735,0x6B21,0x6B64,0x6B7B,0x6C16,0x6C5D,
+ 0x6C57,0x6C59,0x6C5F,0x6C60,0x6C50,0x6C55,0x6C61,0x6C5B,0x6C4D,0x6C4E,
+ 0x7070,0x725F,0x725D,0x767E,0x7AF9,0x7C73,0x7CF8,0x7F36,0x7F8A,0x7FBD,
+ 0x8001,0x8003,0x800C,0x8012,0x8033,0x807F,0x8089,0x808B,0x808C,0x81E3,
+ 0x81EA,0x81F3,0x81FC,0x820C,0x821B,0x821F,0x826E,0x8272,0x827E,0x866B,
+ 0x8840,0x884C,0x8863,0x897F,0x9621,0x4E32,0x4EA8,0x4F4D,0x4F4F,0x4F47,
+ 0x4F57,0x4F5E,0x4F34,0x4F5B,0x4F55,0x4F30,0x4F50,0x4F51,0x4F3D,0x4F3A,
+ 0x4F38,0x4F43,0x4F54,0x4F3C,0x4F46,
+ /* plane 1, row 41 */
+ 1 | (94 << 8), /* first, last */
+ 0x4F63,0x4F5C,0x4F60,0x4F2F,0x4F4E,0x4F36,0x4F59,0x4F5D,0x4F48,
+ 0x4F5A,0x514C,0x514B,0x514D,0x5175,0x51B6,0x51B7,0x5225,0x5224,0x5229,
+ 0x522A,0x5228,0x52AB,0x52A9,0x52AA,0x52AC,0x5323,0x5373,0x5375,0x541D,
+ 0x542D,0x541E,0x543E,0x5426,0x544E,0x5427,0x5446,0x5443,0x5433,0x5448,
+ 0x5442,0x541B,0x5429,0x544A,0x5439,0x543B,0x5438,0x542E,0x5435,0x5436,
+ 0x5420,0x543C,0x5440,0x5431,0x542B,0x541F,0x542C,0x56EA,0x56F0,0x56E4,
+ 0x56EB,0x574A,0x5751,0x5740,0x574D,0x5747,0x574E,0x573E,0x5750,0x574F,
+ 0x573B,0x58EF,0x593E,0x599D,0x5992,0x59A8,0x599E,0x59A3,0x5999,0x5996,
+ 0x598D,0x59A4,0x5993,0x598A,0x59A5,0x5B5D,0x5B5C,0x5B5A,0x5B5B,0x5B8C,
+ 0x5B8B,0x5B8F,0x5C2C,0x5C40,0x5C41,
+ /* plane 1, row 42 */
+ 1 | (94 << 8), /* first, last */
+ 0x5C3F,0x5C3E,0x5C90,0x5C91,0x5C94,0x5C8C,0x5DEB,0x5E0C,0x5E8F,
+ 0x5E87,0x5E8A,0x5EF7,0x5F04,0x5F1F,0x5F64,0x5F62,0x5F77,0x5F79,0x5FD8,
+ 0x5FCC,0x5FD7,0x5FCD,0x5FF1,0x5FEB,0x5FF8,0x5FEA,0x6212,0x6211,0x6284,
+ 0x6297,0x6296,0x6280,0x6276,0x6289,0x626D,0x628A,0x627C,0x627E,0x6279,
+ 0x6273,0x6292,0x626F,0x6298,0x626E,0x6295,0x6293,0x6291,0x6286,0x6539,
+ 0x653B,0x6538,0x65F1,0x66F4,0x675F,0x674E,0x674F,0x6750,0x6751,0x675C,
+ 0x6756,0x675E,0x6749,0x6746,0x6760,0x6753,0x6757,0x6B65,0x6BCF,0x6C42,
+ 0x6C5E,0x6C99,0x6C81,0x6C88,0x6C89,0x6C85,0x6C9B,0x6C6A,0x6C7A,0x6C90,
+ 0x6C70,0x6C8C,0x6C68,0x6C96,0x6C92,0x6C7D,0x6C83,0x6C72,0x6C7E,0x6C74,
+ 0x6C86,0x6C76,0x6C8D,0x6C94,0x6C98,
+ /* plane 1, row 43 */
+ 1 | (94 << 8), /* first, last */
+ 0x6C82,0x7076,0x707C,0x707D,0x7078,0x7262,0x7261,0x7260,0x72C4,
+ 0x72C2,0x7396,0x752C,0x752B,0x7537,0x7538,0x7682,0x76EF,0x77E3,0x79C1,
+ 0x79C0,0x79BF,0x7A76,0x7CFB,0x7F55,0x8096,0x8093,0x809D,0x8098,0x809B,
+ 0x809A,0x80B2,0x826F,0x8292,0x828B,0x828D,0x898B,0x89D2,0x8A00,0x8C37,
+ 0x8C46,0x8C55,0x8C9D,0x8D64,0x8D70,0x8DB3,0x8EAB,0x8ECA,0x8F9B,0x8FB0,
+ 0x8FC2,0x8FC6,0x8FC5,0x8FC4,0x5DE1,0x9091,0x90A2,0x90AA,0x90A6,0x90A3,
+ 0x9149,0x91C6,0x91CC,0x9632,0x962E,0x9631,0x962A,0x962C,0x4E26,0x4E56,
+ 0x4E73,0x4E8B,0x4E9B,0x4E9E,0x4EAB,0x4EAC,0x4F6F,0x4F9D,0x4F8D,0x4F73,
+ 0x4F7F,0x4F6C,0x4F9B,0x4F8B,0x4F86,0x4F83,0x4F70,0x4F75,0x4F88,0x4F69,
+ 0x4F7B,0x4F96,0x4F7E,0x4F8F,0x4F91,
+ /* plane 1, row 44 */
+ 1 | (94 << 8), /* first, last */
+ 0x4F7A,0x5154,0x5152,0x5155,0x5169,0x5177,0x5176,0x5178,0x51BD,
+ 0x51FD,0x523B,0x5238,0x5237,0x523A,0x5230,0x522E,0x5236,0x5241,0x52BE,
+ 0x52BB,0x5352,0x5354,0x5353,0x5351,0x5366,0x5377,0x5378,0x5379,0x53D6,
+ 0x53D4,0x53D7,0x5473,0x5475,0x5496,0x5478,0x5495,0x5480,0x547B,0x5477,
+ 0x5484,0x5492,0x5486,0x547C,0x5490,0x5471,0x5476,0x548C,0x549A,0x5462,
+ 0x5468,0x548B,0x547D,0x548E,0x56FA,0x5783,0x5777,0x576A,0x5769,0x5761,
+ 0x5766,0x5764,0x577C,0x591C,0x5949,0x5947,0x5948,0x5944,0x5954,0x59BE,
+ 0x59BB,0x59D4,0x59B9,0x59AE,0x59D1,0x59C6,0x59D0,0x59CD,0x59CB,0x59D3,
+ 0x59CA,0x59AF,0x59B3,0x59D2,0x59C5,0x5B5F,0x5B64,0x5B63,0x5B97,0x5B9A,
+ 0x5B98,0x5B9C,0x5B99,0x5B9B,0x5C1A,
+ /* plane 1, row 45 */
+ 1 | (94 << 8), /* first, last */
+ 0x5C48,0x5C45,0x5C46,0x5CB7,0x5CA1,0x5CB8,0x5CA9,0x5CAB,0x5CB1,
+ 0x5CB3,0x5E18,0x5E1A,0x5E16,0x5E15,0x5E1B,0x5E11,0x5E78,0x5E9A,0x5E97,
+ 0x5E9C,0x5E95,0x5E96,0x5EF6,0x5F26,0x5F27,0x5F29,0x5F80,0x5F81,0x5F7F,
+ 0x5F7C,0x5FDD,0x5FE0,0x5FFD,0x5FF5,0x5FFF,0x600F,0x6014,0x602F,0x6035,
+ 0x6016,0x602A,0x6015,0x6021,0x6027,0x6029,0x602B,0x601B,0x6216,0x6215,
+ 0x623F,0x623E,0x6240,0x627F,0x62C9,0x62CC,0x62C4,0x62BF,0x62C2,0x62B9,
+ 0x62D2,0x62DB,0x62AB,0x62D3,0x62D4,0x62CB,0x62C8,0x62A8,0x62BD,0x62BC,
+ 0x62D0,0x62D9,0x62C7,0x62CD,0x62B5,0x62DA,0x62B1,0x62D8,0x62D6,0x62D7,
+ 0x62C6,0x62AC,0x62CE,0x653E,0x65A7,0x65BC,0x65FA,0x6614,0x6613,0x660C,
+ 0x6606,0x6602,0x660E,0x6600,0x660F,
+ /* plane 1, row 46 */
+ 1 | (94 << 8), /* first, last */
+ 0x6615,0x660A,0x6607,0x670D,0x670B,0x676D,0x678B,0x6795,0x6771,
+ 0x679C,0x6773,0x6777,0x6787,0x679D,0x6797,0x676F,0x6770,0x677F,0x6789,
+ 0x677E,0x6790,0x6775,0x679A,0x6793,0x677C,0x676A,0x6772,0x6B23,0x6B66,
+ 0x6B67,0x6B7F,0x6C13,0x6C1B,0x6CE3,0x6CE8,0x6CF3,0x6CB1,0x6CCC,0x6CE5,
+ 0x6CB3,0x6CBD,0x6CBE,0x6CBC,0x6CE2,0x6CAB,0x6CD5,0x6CD3,0x6CB8,0x6CC4,
+ 0x6CB9,0x6CC1,0x6CAE,0x6CD7,0x6CC5,0x6CF1,0x6CBF,0x6CBB,0x6CE1,0x6CDB,
+ 0x6CCA,0x6CAC,0x6CEF,0x6CDC,0x6CD6,0x6CE0,0x7095,0x708E,0x7092,0x708A,
+ 0x7099,0x722C,0x722D,0x7238,0x7248,0x7267,0x7269,0x72C0,0x72CE,0x72D9,
+ 0x72D7,0x72D0,0x73A9,0x73A8,0x739F,0x73AB,0x73A5,0x753D,0x759D,0x7599,
+ 0x759A,0x7684,0x76C2,0x76F2,0x76F4,
+ /* plane 1, row 47 */
+ 1 | (94 << 8), /* first, last */
+ 0x77E5,0x77FD,0x793E,0x7940,0x7941,0x79C9,0x79C8,0x7A7A,0x7A79,
+ 0x7AFA,0x7CFE,0x7F54,0x7F8C,0x7F8B,0x8005,0x80BA,0x80A5,0x80A2,0x80B1,
+ 0x80A1,0x80AB,0x80A9,0x80B4,0x80AA,0x80AF,0x81E5,0x81FE,0x820D,0x82B3,
+ 0x829D,0x8299,0x82AD,0x82BD,0x829F,0x82B9,0x82B1,0x82AC,0x82A5,0x82AF,
+ 0x82B8,0x82A3,0x82B0,0x82BE,0x82B7,0x864E,0x8671,0x521D,0x8868,0x8ECB,
+ 0x8FCE,0x8FD4,0x8FD1,0x90B5,0x90B8,0x90B1,0x90B6,0x91C7,0x91D1,0x9577,
+ 0x9580,0x961C,0x9640,0x963F,0x963B,0x9644,0x9642,0x96B9,0x96E8,0x9752,
+ 0x975E,0x4E9F,0x4EAD,0x4EAE,0x4FE1,0x4FB5,0x4FAF,0x4FBF,0x4FE0,0x4FD1,
+ 0x4FCF,0x4FDD,0x4FC3,0x4FB6,0x4FD8,0x4FDF,0x4FCA,0x4FD7,0x4FAE,0x4FD0,
+ 0x4FC4,0x4FC2,0x4FDA,0x4FCE,0x4FDE,
+ /* plane 1, row 48 */
+ 1 | (94 << 8), /* first, last */
+ 0x4FB7,0x5157,0x5192,0x5191,0x51A0,0x524E,0x5243,0x524A,0x524D,
+ 0x524C,0x524B,0x5247,0x52C7,0x52C9,0x52C3,0x52C1,0x530D,0x5357,0x537B,
+ 0x539A,0x53DB,0x54AC,0x54C0,0x54A8,0x54CE,0x54C9,0x54B8,0x54A6,0x54B3,
+ 0x54C7,0x54C2,0x54BD,0x54AA,0x54C1,0x54C4,0x54C8,0x54AF,0x54AB,0x54B1,
+ 0x54BB,0x54A9,0x54A7,0x54BF,0x56FF,0x5782,0x578B,0x57A0,0x57A3,0x57A2,
+ 0x57CE,0x57AE,0x5793,0x5955,0x5951,0x594F,0x594E,0x5950,0x59DC,0x59D8,
+ 0x59FF,0x59E3,0x59E8,0x5A03,0x59E5,0x59EA,0x59DA,0x59E6,0x5A01,0x59FB,
+ 0x5B69,0x5BA3,0x5BA6,0x5BA4,0x5BA2,0x5BA5,0x5C01,0x5C4E,0x5C4F,0x5C4D,
+ 0x5C4B,0x5CD9,0x5CD2,0x5DF7,0x5E1D,0x5E25,0x5E1F,0x5E7D,0x5EA0,0x5EA6,
+ 0x5EFA,0x5F08,0x5F2D,0x5F65,0x5F88,
+ /* plane 1, row 49 */
+ 1 | (94 << 8), /* first, last */
+ 0x5F85,0x5F8A,0x5F8B,0x5F87,0x5F8C,0x5F89,0x6012,0x601D,0x6020,
+ 0x6025,0x600E,0x6028,0x604D,0x6070,0x6068,0x6062,0x6046,0x6043,0x606C,
+ 0x606B,0x606A,0x6064,0x6241,0x62DC,0x6316,0x6309,0x62FC,0x62ED,0x6301,
+ 0x62EE,0x62FD,0x6307,0x62F1,0x62F7,0x62EF,0x62EC,0x62FE,0x62F4,0x6311,
+ 0x6302,0x653F,0x6545,0x65AB,0x65BD,0x65E2,0x6625,0x662D,0x6620,0x6627,
+ 0x662F,0x661F,0x6628,0x6631,0x6624,0x66F7,0x67FF,0x67D3,0x67F1,0x67D4,
+ 0x67D0,0x67EC,0x67B6,0x67AF,0x67F5,0x67E9,0x67EF,0x67C4,0x67D1,0x67B4,
+ 0x67DA,0x67E5,0x67B8,0x67CF,0x67DE,0x67F3,0x67B0,0x67D9,0x67E2,0x67DD,
+ 0x67D2,0x6B6A,0x6B83,0x6B86,0x6BB5,0x6BD2,0x6BD7,0x6C1F,0x6CC9,0x6D0B,
+ 0x6D32,0x6D2A,0x6D41,0x6D25,0x6D0C,
+ /* plane 1, row 50 */
+ 1 | (94 << 8), /* first, last */
+ 0x6D31,0x6D1E,0x6D17,0x6D3B,0x6D3D,0x6D3E,0x6D36,0x6D1B,0x6CF5,
+ 0x6D39,0x6D27,0x6D38,0x6D29,0x6D2E,0x6D35,0x6D0E,0x6D2B,0x70AB,0x70BA,
+ 0x70B3,0x70AC,0x70AF,0x70AD,0x70B8,0x70AE,0x70A4,0x7230,0x7272,0x726F,
+ 0x7274,0x72E9,0x72E0,0x72E1,0x73B7,0x73CA,0x73BB,0x73B2,0x73CD,0x73C0,
+ 0x73B3,0x751A,0x752D,0x754F,0x754C,0x754E,0x754B,0x75AB,0x75A4,0x75A5,
+ 0x75A2,0x75A3,0x7678,0x7686,0x7687,0x7688,0x76C8,0x76C6,0x76C3,0x76C5,
+ 0x7701,0x76F9,0x76F8,0x7709,0x770B,0x76FE,0x76FC,0x7707,0x77DC,0x7802,
+ 0x7814,0x780C,0x780D,0x7946,0x7949,0x7948,0x7947,0x79B9,0x79BA,0x79D1,
+ 0x79D2,0x79CB,0x7A7F,0x7A81,0x7AFF,0x7AFD,0x7C7D,0x7D02,0x7D05,0x7D00,
+ 0x7D09,0x7D07,0x7D04,0x7D06,0x7F38,
+ /* plane 1, row 51 */
+ 1 | (94 << 8), /* first, last */
+ 0x7F8E,0x7FBF,0x8010,0x800D,0x8011,0x8036,0x80D6,0x80E5,0x80DA,
+ 0x80C3,0x80C4,0x80CC,0x80E1,0x80DB,0x80CE,0x80DE,0x80E4,0x80DD,0x81F4,
+ 0x8222,0x82E7,0x8303,0x8305,0x82E3,0x82DB,0x82E6,0x8304,0x82E5,0x8302,
+ 0x8309,0x82D2,0x82D7,0x82F1,0x8301,0x82DC,0x82D4,0x82D1,0x82DE,0x82D3,
+ 0x82DF,0x82EF,0x8306,0x8650,0x8679,0x867B,0x867A,0x884D,0x886B,0x8981,
+ 0x89D4,0x8A08,0x8A02,0x8A03,0x8C9E,0x8CA0,0x8D74,0x8D73,0x8DB4,0x8ECD,
+ 0x8ECC,0x8FF0,0x8FE6,0x8FE2,0x8FEA,0x8FE5,0x8FED,0x8FEB,0x8FE4,0x8FE8,
+ 0x90CA,0x90CE,0x90C1,0x90C3,0x914B,0x914A,0x91CD,0x9582,0x9650,0x964B,
+ 0x964C,0x964D,0x9762,0x9769,0x97CB,0x97ED,0x97F3,0x9801,0x98A8,0x98DB,
+ 0x98DF,0x9996,0x9999,0x4E58,0x4EB3,
+ /* plane 1, row 52 */
+ 1 | (94 << 8), /* first, last */
+ 0x500C,0x500D,0x5023,0x4FEF,0x5026,0x5025,0x4FF8,0x5029,0x5016,
+ 0x5006,0x503C,0x501F,0x501A,0x5012,0x5011,0x4FFA,0x5000,0x5014,0x5028,
+ 0x4FF1,0x5021,0x500B,0x5019,0x5018,0x4FF3,0x4FEE,0x502D,0x502A,0x4FFE,
+ 0x502B,0x5009,0x517C,0x51A4,0x51A5,0x51A2,0x51CD,0x51CC,0x51C6,0x51CB,
+ 0x5256,0x525C,0x5254,0x525B,0x525D,0x532A,0x537F,0x539F,0x539D,0x53DF,
+ 0x54E8,0x5510,0x5501,0x5537,0x54FC,0x54E5,0x54F2,0x5506,0x54FA,0x5514,
+ 0x54E9,0x54ED,0x54E1,0x5509,0x54EE,0x54EA,0x54E6,0x5527,0x5507,0x54FD,
+ 0x550F,0x5703,0x5704,0x57C2,0x57D4,0x57CB,0x57C3,0x5809,0x590F,0x5957,
+ 0x5958,0x595A,0x5A11,0x5A18,0x5A1C,0x5A1F,0x5A1B,0x5A13,0x59EC,0x5A20,
+ 0x5A23,0x5A29,0x5A25,0x5A0C,0x5A09,
+ /* plane 1, row 53 */
+ 1 | (94 << 8), /* first, last */
+ 0x5B6B,0x5C58,0x5BB0,0x5BB3,0x5BB6,0x5BB4,0x5BAE,0x5BB5,0x5BB9,
+ 0x5BB8,0x5C04,0x5C51,0x5C55,0x5C50,0x5CED,0x5CFD,0x5CFB,0x5CEA,0x5CE8,
+ 0x5CF0,0x5CF6,0x5D01,0x5CF4,0x5DEE,0x5E2D,0x5E2B,0x5EAB,0x5EAD,0x5EA7,
+ 0x5F31,0x5F92,0x5F91,0x5F90,0x6059,0x6063,0x6065,0x6050,0x6055,0x606D,
+ 0x6069,0x606F,0x6084,0x609F,0x609A,0x608D,0x6094,0x608C,0x6085,0x6096,
+ 0x6247,0x62F3,0x6308,0x62FF,0x634E,0x633E,0x632F,0x6355,0x6342,0x6346,
+ 0x634F,0x6349,0x633A,0x6350,0x633D,0x632A,0x632B,0x6328,0x634D,0x634C,
+ 0x6548,0x6549,0x6599,0x65C1,0x65C5,0x6642,0x6649,0x664F,0x6643,0x6652,
+ 0x664C,0x6645,0x6641,0x66F8,0x6714,0x6715,0x6717,0x6821,0x6838,0x6848,
+ 0x6846,0x6853,0x6839,0x6842,0x6854,
+ /* plane 1, row 54 */
+ 1 | (94 << 8), /* first, last */
+ 0x6829,0x68B3,0x6817,0x684C,0x6851,0x683D,0x67F4,0x6850,0x6840,
+ 0x683C,0x6843,0x682A,0x6845,0x6813,0x6818,0x6841,0x6B8A,0x6B89,0x6BB7,
+ 0x6C23,0x6C27,0x6C28,0x6C26,0x6C24,0x6CF0,0x6D6A,0x6D95,0x6D88,0x6D87,
+ 0x6D66,0x6D78,0x6D77,0x6D59,0x6D93,0x6D6C,0x6D89,0x6D6E,0x6D5A,0x6D74,
+ 0x6D69,0x6D8C,0x6D8A,0x6D79,0x6D85,0x6D65,0x6D94,0x70CA,0x70D8,0x70E4,
+ 0x70D9,0x70C8,0x70CF,0x7239,0x7279,0x72FC,0x72F9,0x72FD,0x72F8,0x72F7,
+ 0x7386,0x73ED,0x7409,0x73EE,0x73E0,0x73EA,0x73DE,0x7554,0x755D,0x755C,
+ 0x755A,0x7559,0x75BE,0x75C5,0x75C7,0x75B2,0x75B3,0x75BD,0x75BC,0x75B9,
+ 0x75C2,0x75B8,0x768B,0x76B0,0x76CA,0x76CD,0x76CE,0x7729,0x771F,0x7720,
+ 0x7728,0x77E9,0x7830,0x7827,0x7838,
+ /* plane 1, row 55 */
+ 1 | (94 << 8), /* first, last */
+ 0x781D,0x7834,0x7837,0x7825,0x782D,0x7820,0x781F,0x7832,0x7955,
+ 0x7950,0x7960,0x795F,0x7956,0x795E,0x795D,0x7957,0x795A,0x79E4,0x79E3,
+ 0x79E7,0x79DF,0x79E6,0x79E9,0x79D8,0x7A84,0x7A88,0x7AD9,0x7B06,0x7B11,
+ 0x7C89,0x7D21,0x7D17,0x7D0B,0x7D0A,0x7D20,0x7D22,0x7D14,0x7D10,0x7D15,
+ 0x7D1A,0x7D1C,0x7D0D,0x7D19,0x7D1B,0x7F3A,0x7F5F,0x7F94,0x7FC5,0x7FC1,
+ 0x8006,0x8004,0x8018,0x8015,0x8019,0x8017,0x803D,0x803F,0x80F1,0x8102,
+ 0x80F0,0x8105,0x80ED,0x80F4,0x8106,0x80F8,0x80F3,0x8108,0x80FD,0x810A,
+ 0x80FC,0x80EF,0x81ED,0x81EC,0x8200,0x8210,0x822A,0x822B,0x8228,0x822C,
+ 0x82BB,0x832B,0x8352,0x8354,0x834A,0x8338,0x8350,0x8349,0x8335,0x8334,
+ 0x834F,0x8332,0x8339,0x8336,0x8317,
+ /* plane 1, row 56 */
+ 1 | (94 << 8), /* first, last */
+ 0x8340,0x8331,0x8328,0x8343,0x8654,0x868A,0x86AA,0x8693,0x86A4,
+ 0x86A9,0x868C,0x86A3,0x869C,0x8870,0x8877,0x8881,0x8882,0x887D,0x8879,
+ 0x8A18,0x8A10,0x8A0E,0x8A0C,0x8A15,0x8A0A,0x8A17,0x8A13,0x8A16,0x8A0F,
+ 0x8A11,0x8C48,0x8C7A,0x8C79,0x8CA1,0x8CA2,0x8D77,0x8EAC,0x8ED2,0x8ED4,
+ 0x8ECF,0x8FB1,0x9001,0x9006,0x8FF7,0x9000,0x8FFA,0x8FF4,0x9003,0x8FFD,
+ 0x9005,0x8FF8,0x9095,0x90E1,0x90DD,0x90E2,0x9152,0x914D,0x914C,0x91D8,
+ 0x91DD,0x91D7,0x91DC,0x91D9,0x9583,0x9662,0x9663,0x9661,0x965B,0x965D,
+ 0x9664,0x9658,0x965E,0x96BB,0x98E2,0x99AC,0x9AA8,0x9AD8,0x9B25,0x9B32,
+ 0x9B3C,0x4E7E,0x507A,0x507D,0x505C,0x5047,0x5043,0x504C,0x505A,0x5049,
+ 0x5065,0x5076,0x504E,0x5055,0x5075,
+ /* plane 1, row 57 */
+ 1 | (94 << 8), /* first, last */
+ 0x5074,0x5077,0x504F,0x500F,0x506F,0x506D,0x515C,0x5195,0x51F0,
+ 0x526A,0x526F,0x52D2,0x52D9,0x52D8,0x52D5,0x5310,0x530F,0x5319,0x533F,
+ 0x5340,0x533E,0x53C3,0x66FC,0x5546,0x556A,0x5566,0x5544,0x555E,0x5561,
+ 0x5543,0x554A,0x5531,0x5556,0x554F,0x5555,0x552F,0x5564,0x5538,0x552E,
+ 0x555C,0x552C,0x5563,0x5533,0x5541,0x5557,0x5708,0x570B,0x5709,0x57DF,
+ 0x5805,0x580A,0x5806,0x57E0,0x57E4,0x57FA,0x5802,0x5835,0x57F7,0x57F9,
+ 0x5920,0x5962,0x5A36,0x5A41,0x5A49,0x5A66,0x5A6A,0x5A40,0x5A3C,0x5A62,
+ 0x5A5A,0x5A46,0x5A4A,0x5B70,0x5BC7,0x5BC5,0x5BC4,0x5BC2,0x5BBF,0x5BC6,
+ 0x5C09,0x5C08,0x5C07,0x5C60,0x5C5C,0x5C5D,0x5D07,0x5D06,0x5D0E,0x5D1B,
+ 0x5D16,0x5D22,0x5D11,0x5D29,0x5D14,
+ /* plane 1, row 58 */
+ 1 | (94 << 8), /* first, last */
+ 0x5D19,0x5D24,0x5D27,0x5D17,0x5DE2,0x5E38,0x5E36,0x5E33,0x5E37,
+ 0x5EB7,0x5EB8,0x5EB6,0x5EB5,0x5EBE,0x5F35,0x5F37,0x5F57,0x5F6C,0x5F69,
+ 0x5F6B,0x5F97,0x5F99,0x5F9E,0x5F98,0x5FA1,0x5FA0,0x5F9C,0x607F,0x60A3,
+ 0x6089,0x60A0,0x60A8,0x60CB,0x60B4,0x60E6,0x60BD,0x60C5,0x60BB,0x60B5,
+ 0x60DC,0x60BC,0x60D8,0x60D5,0x60C6,0x60DF,0x60B8,0x60DA,0x60C7,0x621A,
+ 0x621B,0x6248,0x63A0,0x63A7,0x6372,0x6396,0x63A2,0x63A5,0x6377,0x6367,
+ 0x6398,0x63AA,0x6371,0x63A9,0x6389,0x6383,0x639B,0x636B,0x63A8,0x6384,
+ 0x6388,0x6399,0x63A1,0x63AC,0x6392,0x638F,0x6380,0x637B,0x6369,0x6368,
+ 0x637A,0x655D,0x6556,0x6551,0x6559,0x6557,0x555F,0x654F,0x6558,0x6555,
+ 0x6554,0x659C,0x659B,0x65AC,0x65CF,
+ /* plane 1, row 59 */
+ 1 | (94 << 8), /* first, last */
+ 0x65CB,0x65CC,0x65CE,0x665D,0x665A,0x6664,0x6668,0x6666,0x665E,
+ 0x66F9,0x52D7,0x671B,0x6881,0x68AF,0x68A2,0x6893,0x68B5,0x687F,0x6876,
+ 0x68B1,0x68A7,0x6897,0x68B0,0x6883,0x68C4,0x68AD,0x6886,0x6885,0x6894,
+ 0x689D,0x68A8,0x689F,0x68A1,0x6882,0x6B32,0x6BBA,0x6BEB,0x6BEC,0x6C2B,
+ 0x6D8E,0x6DBC,0x6DF3,0x6DD9,0x6DB2,0x6DE1,0x6DCC,0x6DE4,0x6DFB,0x6DFA,
+ 0x6E05,0x6DC7,0x6DCB,0x6DAF,0x6DD1,0x6DAE,0x6DDE,0x6DF9,0x6DB8,0x6DF7,
+ 0x6DF5,0x6DC5,0x6DD2,0x6E1A,0x6DB5,0x6DDA,0x6DEB,0x6DD8,0x6DEA,0x6DF1,
+ 0x6DEE,0x6DE8,0x6DC6,0x6DC4,0x6DAA,0x6DEC,0x6DBF,0x6DE6,0x70F9,0x7109,
+ 0x710A,0x70FD,0x70EF,0x723D,0x727D,0x7281,0x731C,0x731B,0x7316,0x7313,
+ 0x7319,0x7387,0x7405,0x740A,0x7403,
+ /* plane 1, row 60 */
+ 1 | (94 << 8), /* first, last */
+ 0x7406,0x73FE,0x740D,0x74E0,0x74F6,0x74F7,0x751C,0x7522,0x7565,
+ 0x7566,0x7562,0x7570,0x758F,0x75D4,0x75D5,0x75B5,0x75CA,0x75CD,0x768E,
+ 0x76D4,0x76D2,0x76DB,0x7737,0x773E,0x773C,0x7736,0x7738,0x773A,0x786B,
+ 0x7843,0x784E,0x7965,0x7968,0x796D,0x79FB,0x7A92,0x7A95,0x7B20,0x7B28,
+ 0x7B1B,0x7B2C,0x7B26,0x7B19,0x7B1E,0x7B2E,0x7C92,0x7C97,0x7C95,0x7D46,
+ 0x7D43,0x7D71,0x7D2E,0x7D39,0x7D3C,0x7D40,0x7D30,0x7D33,0x7D44,0x7D2F,
+ 0x7D42,0x7D32,0x7D31,0x7F3D,0x7F9E,0x7F9A,0x7FCC,0x7FCE,0x7FD2,0x801C,
+ 0x804A,0x8046,0x812F,0x8116,0x8123,0x812B,0x8129,0x8130,0x8124,0x8202,
+ 0x8235,0x8237,0x8236,0x8239,0x838E,0x839E,0x8398,0x8378,0x83A2,0x8396,
+ 0x83BD,0x83AB,0x8392,0x838A,0x8393,
+ /* plane 1, row 61 */
+ 1 | (94 << 8), /* first, last */
+ 0x8389,0x83A0,0x8377,0x837B,0x837C,0x8386,0x83A7,0x8655,0x5F6A,
+ 0x86C7,0x86C0,0x86B6,0x86C4,0x86B5,0x86C6,0x86CB,0x86B1,0x86AF,0x86C9,
+ 0x8853,0x889E,0x8888,0x88AB,0x8892,0x8896,0x888D,0x888B,0x8993,0x898F,
+ 0x8A2A,0x8A1D,0x8A23,0x8A25,0x8A31,0x8A2D,0x8A1F,0x8A1B,0x8A22,0x8C49,
+ 0x8C5A,0x8CA9,0x8CAC,0x8CAB,0x8CA8,0x8CAA,0x8CA7,0x8D67,0x8D66,0x8DBE,
+ 0x8DBA,0x8EDB,0x8EDF,0x9019,0x900D,0x901A,0x9017,0x9023,0x901F,0x901D,
+ 0x9010,0x9015,0x901E,0x9020,0x900F,0x9022,0x9016,0x901B,0x9014,0x90E8,
+ 0x90ED,0x90FD,0x9157,0x91CE,0x91F5,0x91E6,0x91E3,0x91E7,0x91ED,0x91E9,
+ 0x9589,0x966A,0x9675,0x9673,0x9678,0x9670,0x9674,0x9676,0x9677,0x966C,
+ 0x96C0,0x96EA,0x96E9,0x7AE0,0x7ADF,
+ /* plane 1, row 62 */
+ 1 | (94 << 8), /* first, last */
+ 0x9802,0x9803,0x9B5A,0x9CE5,0x9E75,0x9E7F,0x9EA5,0x9EBB,0x50A2,
+ 0x508D,0x5085,0x5099,0x5091,0x5080,0x5096,0x5098,0x509A,0x6700,0x51F1,
+ 0x5272,0x5274,0x5275,0x5269,0x52DE,0x52DD,0x52DB,0x535A,0x53A5,0x557B,
+ 0x5580,0x55A7,0x557C,0x558A,0x559D,0x5598,0x5582,0x559C,0x55AA,0x5594,
+ 0x5587,0x558B,0x5583,0x55B3,0x55AE,0x559F,0x553E,0x55B2,0x559A,0x55BB,
+ 0x55AC,0x55B1,0x557E,0x5589,0x55AB,0x5599,0x570D,0x582F,0x582A,0x5834,
+ 0x5824,0x5830,0x5831,0x5821,0x581D,0x5820,0x58F9,0x58FA,0x5960,0x5A77,
+ 0x5A9A,0x5A7F,0x5A92,0x5A9B,0x5AA7,0x5B73,0x5B71,0x5BD2,0x5BCC,0x5BD3,
+ 0x5BD0,0x5C0A,0x5C0B,0x5C31,0x5D4C,0x5D50,0x5D34,0x5D47,0x5DFD,0x5E45,
+ 0x5E3D,0x5E40,0x5E43,0x5E7E,0x5ECA,
+ /* plane 1, row 63 */
+ 1 | (94 << 8), /* first, last */
+ 0x5EC1,0x5EC2,0x5EC4,0x5F3C,0x5F6D,0x5FA9,0x5FAA,0x5FA8,0x60D1,
+ 0x60E1,0x60B2,0x60B6,0x60E0,0x611C,0x6123,0x60FA,0x6115,0x60F0,0x60FB,
+ 0x60F4,0x6168,0x60F1,0x610E,0x60F6,0x6109,0x6100,0x6112,0x621F,0x6249,
+ 0x63A3,0x638C,0x63CF,0x63C0,0x63E9,0x63C9,0x63C6,0x63CD,0x63D2,0x63E3,
+ 0x63D0,0x63E1,0x63D6,0x63ED,0x63EE,0x6376,0x63F4,0x63EA,0x63DB,0x6452,
+ 0x63DA,0x63F9,0x655E,0x6566,0x6562,0x6563,0x6591,0x6590,0x65AF,0x666E,
+ 0x6670,0x6674,0x6676,0x666F,0x6691,0x667A,0x667E,0x6677,0x66FE,0x66FF,
+ 0x671F,0x671D,0x68FA,0x68D5,0x68E0,0x68D8,0x68D7,0x6905,0x68DF,0x68F5,
+ 0x68EE,0x68E7,0x68F9,0x68D2,0x68F2,0x68E3,0x68CB,0x68CD,0x690D,0x6912,
+ 0x690E,0x68C9,0x68DA,0x696E,0x68FB,
+ /* plane 1, row 64 */
+ 1 | (94 << 8), /* first, last */
+ 0x6B3E,0x6B3A,0x6B3D,0x6B98,0x6B96,0x6BBC,0x6BEF,0x6C2E,0x6C2F,
+ 0x6C2C,0x6E2F,0x6E38,0x6E54,0x6E21,0x6E32,0x6E67,0x6E4A,0x6E20,0x6E25,
+ 0x6E23,0x6E1B,0x6E5B,0x6E58,0x6E24,0x6E56,0x6E6E,0x6E2D,0x6E26,0x6E6F,
+ 0x6E34,0x6E4D,0x6E3A,0x6E2C,0x6E43,0x6E1D,0x6E3E,0x6ECB,0x6E89,0x6E19,
+ 0x6E4E,0x6E63,0x6E44,0x6E72,0x6E69,0x6E5F,0x7119,0x711A,0x7126,0x7130,
+ 0x7121,0x7136,0x716E,0x711C,0x724C,0x7284,0x7280,0x7336,0x7325,0x7334,
+ 0x7329,0x743A,0x742A,0x7433,0x7422,0x7425,0x7435,0x7436,0x7434,0x742F,
+ 0x741B,0x7426,0x7428,0x7525,0x7526,0x756B,0x756A,0x75E2,0x75DB,0x75E3,
+ 0x75D9,0x75D8,0x75DE,0x75E0,0x767B,0x767C,0x7696,0x7693,0x76B4,0x76DC,
+ 0x774F,0x77ED,0x785D,0x786C,0x786F,
+ /* plane 1, row 65 */
+ 1 | (94 << 8), /* first, last */
+ 0x7A0D,0x7A08,0x7A0B,0x7A05,0x7A00,0x7A98,0x7A97,0x7A96,0x7AE5,
+ 0x7AE3,0x7B49,0x7B56,0x7B46,0x7B50,0x7B52,0x7B54,0x7B4D,0x7B4B,0x7B4F,
+ 0x7B51,0x7C9F,0x7CA5,0x7D5E,0x7D50,0x7D68,0x7D55,0x7D2B,0x7D6E,0x7D72,
+ 0x7D61,0x7D66,0x7D62,0x7D70,0x7D73,0x5584,0x7FD4,0x7FD5,0x800B,0x8052,
+ 0x8085,0x8155,0x8154,0x814B,0x8151,0x814E,0x8139,0x8146,0x813E,0x814C,
+ 0x8153,0x8174,0x8212,0x821C,0x83E9,0x8403,0x83F8,0x840D,0x83E0,0x83C5,
+ 0x840B,0x83C1,0x83EF,0x83F1,0x83F4,0x8457,0x840A,0x83F0,0x840C,0x83CC,
+ 0x83FD,0x83F2,0x83CA,0x8438,0x840E,0x8404,0x83DC,0x8407,0x83D4,0x83DF,
+ 0x865B,0x86DF,0x86D9,0x86ED,0x86D4,0x86DB,0x86E4,0x86D0,0x86DE,0x8857,
+ 0x88C1,0x88C2,0x88B1,0x8983,0x8996,
+ /* plane 1, row 66 */
+ 1 | (94 << 8), /* first, last */
+ 0x8A3B,0x8A60,0x8A55,0x8A5E,0x8A3C,0x8A41,0x8A54,0x8A5B,0x8A50,
+ 0x8A46,0x8A34,0x8A3A,0x8A36,0x8A56,0x8C61,0x8C82,0x8CAF,0x8CBC,0x8CB3,
+ 0x8CBD,0x8CC1,0x8CBB,0x8CC0,0x8CB4,0x8CB7,0x8CB6,0x8CBF,0x8CB8,0x8D8A,
+ 0x8D85,0x8D81,0x8DCE,0x8DDD,0x8DCB,0x8DDA,0x8DD1,0x8DCC,0x8DDB,0x8DC6,
+ 0x8EFB,0x8EF8,0x8EFC,0x8F9C,0x902E,0x9035,0x9031,0x9038,0x9032,0x9036,
+ 0x9102,0x90F5,0x9109,0x90FE,0x9163,0x9165,0x91CF,0x9214,0x9215,0x9223,
+ 0x9209,0x921E,0x920D,0x9210,0x9207,0x9211,0x9594,0x958F,0x958B,0x9591,
+ 0x9593,0x9592,0x958E,0x968A,0x968E,0x968B,0x967D,0x9685,0x9686,0x968D,
+ 0x9672,0x9684,0x96C1,0x96C5,0x96C4,0x96C6,0x96C7,0x96EF,0x96F2,0x97CC,
+ 0x9805,0x9806,0x9808,0x98E7,0x98EA,
+ /* plane 1, row 67 */
+ 1 | (94 << 8), /* first, last */
+ 0x98EF,0x98E9,0x98F2,0x98ED,0x99AE,0x99AD,0x9EC3,0x9ECD,0x9ED1,
+ 0x4E82,0x50AD,0x50B5,0x50B2,0x50B3,0x50C5,0x50BE,0x50AC,0x50B7,0x50BB,
+ 0x50AF,0x50C7,0x527F,0x5277,0x527D,0x52DF,0x52E6,0x52E4,0x52E2,0x52E3,
+ 0x532F,0x55DF,0x55E8,0x55D3,0x55E6,0x55CE,0x55DC,0x55C7,0x55D1,0x55E3,
+ 0x55E4,0x55EF,0x55DA,0x55E1,0x55C5,0x55C6,0x55E5,0x55C9,0x5712,0x5713,
+ 0x585E,0x5851,0x5858,0x5857,0x585A,0x5854,0x586B,0x584C,0x586D,0x584A,
+ 0x5862,0x5852,0x584B,0x5967,0x5AC1,0x5AC9,0x5ACC,0x5ABE,0x5ABD,0x5ABC,
+ 0x5AB3,0x5AC2,0x5AB2,0x5D69,0x5D6F,0x5E4C,0x5E79,0x5EC9,0x5EC8,0x5F12,
+ 0x5F59,0x5FAC,0x5FAE,0x611A,0x610F,0x6148,0x611F,0x60F3,0x611B,0x60F9,
+ 0x6101,0x6108,0x614E,0x614C,0x6144,
+ /* plane 1, row 68 */
+ 1 | (94 << 8), /* first, last */
+ 0x614D,0x613E,0x6134,0x6127,0x610D,0x6106,0x6137,0x6221,0x6222,
+ 0x6413,0x643E,0x641E,0x642A,0x642D,0x643D,0x642C,0x640F,0x641C,0x6414,
+ 0x640D,0x6436,0x6416,0x6417,0x6406,0x656C,0x659F,0x65B0,0x6697,0x6689,
+ 0x6687,0x6688,0x6696,0x6684,0x6698,0x668D,0x6703,0x6994,0x696D,0x695A,
+ 0x6977,0x6960,0x6954,0x6975,0x6930,0x6982,0x694A,0x6968,0x696B,0x695E,
+ 0x6953,0x6979,0x6986,0x695D,0x6963,0x695B,0x6B47,0x6B72,0x6BC0,0x6BBF,
+ 0x6BD3,0x6BFD,0x6EA2,0x6EAF,0x6ED3,0x6EB6,0x6EC2,0x6E90,0x6E9D,0x6EC7,
+ 0x6EC5,0x6EA5,0x6E98,0x6EBC,0x6EBA,0x6EAB,0x6ED1,0x6E96,0x6E9C,0x6EC4,
+ 0x6ED4,0x6EAA,0x6EA7,0x6EB4,0x714E,0x7159,0x7169,0x7164,0x7149,0x7167,
+ 0x715C,0x716C,0x7166,0x714C,0x7165,
+ /* plane 1, row 69 */
+ 1 | (94 << 8), /* first, last */
+ 0x715E,0x7146,0x7168,0x7156,0x723A,0x7252,0x7337,0x7345,0x733F,
+ 0x733E,0x746F,0x745A,0x7455,0x745F,0x745E,0x7441,0x743F,0x7459,0x745B,
+ 0x745C,0x7576,0x7578,0x7600,0x75F0,0x7601,0x75F2,0x75F1,0x75FA,0x75FF,
+ 0x75F4,0x75F3,0x76DE,0x76DF,0x775B,0x776B,0x7766,0x775E,0x7763,0x7779,
+ 0x776A,0x776C,0x775C,0x7765,0x7768,0x7762,0x77EE,0x788E,0x78B0,0x7897,
+ 0x7898,0x788C,0x7889,0x787C,0x7891,0x7893,0x787F,0x797A,0x797F,0x7981,
+ 0x842C,0x79BD,0x7A1C,0x7A1A,0x7A20,0x7A14,0x7A1F,0x7A1E,0x7A9F,0x7AA0,
+ 0x7B77,0x7BC0,0x7B60,0x7B6E,0x7B67,0x7CB1,0x7CB3,0x7CB5,0x7D93,0x7D79,
+ 0x7D91,0x7D81,0x7D8F,0x7D5B,0x7F6E,0x7F69,0x7F6A,0x7F72,0x7FA9,0x7FA8,
+ 0x7FA4,0x8056,0x8058,0x8086,0x8084,
+ /* plane 1, row 70 */
+ 1 | (94 << 8), /* first, last */
+ 0x8171,0x8170,0x8178,0x8165,0x816E,0x8173,0x816B,0x8179,0x817A,
+ 0x8166,0x8205,0x8247,0x8482,0x8477,0x843D,0x8431,0x8475,0x8466,0x846B,
+ 0x8449,0x846C,0x845B,0x843C,0x8435,0x8461,0x8463,0x8469,0x846D,0x8446,
+ 0x865E,0x865C,0x865F,0x86F9,0x8713,0x8708,0x8707,0x8700,0x86FE,0x86FB,
+ 0x8702,0x8703,0x8706,0x870A,0x8859,0x88DF,0x88D4,0x88D9,0x88DC,0x88D8,
+ 0x88DD,0x88E1,0x88CA,0x88D5,0x88D2,0x899C,0x89E3,0x8A6B,0x8A72,0x8A73,
+ 0x8A66,0x8A69,0x8A70,0x8A87,0x8A7C,0x8A63,0x8AA0,0x8A71,0x8A85,0x8A6D,
+ 0x8A62,0x8A6E,0x8A6C,0x8A79,0x8A7B,0x8A3E,0x8A68,0x8C62,0x8C8A,0x8C89,
+ 0x8CCA,0x8CC7,0x8CC8,0x8CC4,0x8CB2,0x8CC3,0x8CC2,0x8CC5,0x8DE1,0x8DDF,
+ 0x8DE8,0x8DEF,0x8DF3,0x8DFA,0x8DEA,
+ /* plane 1, row 71 */
+ 1 | (94 << 8), /* first, last */
+ 0x8DE4,0x8DE6,0x8EB2,0x8F03,0x8F09,0x8EFE,0x8F0A,0x8F9F,0x8FB2,
+ 0x904B,0x904A,0x9053,0x9042,0x9054,0x903C,0x9055,0x9050,0x9047,0x904F,
+ 0x904E,0x904D,0x9051,0x903E,0x9041,0x9112,0x9117,0x916C,0x916A,0x9169,
+ 0x91C9,0x9237,0x9257,0x9238,0x923D,0x9240,0x923E,0x925B,0x924B,0x9264,
+ 0x9251,0x9234,0x9249,0x924D,0x9245,0x9239,0x923F,0x925A,0x9598,0x9698,
+ 0x9694,0x9695,0x96CD,0x96CB,0x96C9,0x96CA,0x96F7,0x96FB,0x96F9,0x96F6,
+ 0x9756,0x9774,0x9776,0x9810,0x9811,0x9813,0x980A,0x9812,0x980C,0x98FC,
+ 0x98F4,0x98FD,0x98FE,0x99B3,0x99B1,0x99B4,0x9AE1,0x9CE9,0x9E82,0x9F0E,
+ 0x9F13,0x9F20,0x50E7,0x50EE,0x50E5,0x50D6,0x50ED,0x50DA,0x50D5,0x50CF,
+ 0x50D1,0x50F1,0x50CE,0x50E9,0x5162,
+ /* plane 1, row 72 */
+ 1 | (94 << 8), /* first, last */
+ 0x51F3,0x5283,0x5282,0x5331,0x53AD,0x55FE,0x5600,0x561B,0x5617,
+ 0x55FD,0x5614,0x5606,0x5609,0x560D,0x560E,0x55F7,0x5616,0x561F,0x5608,
+ 0x5610,0x55F6,0x5718,0x5716,0x5875,0x587E,0x5883,0x5893,0x588A,0x5879,
+ 0x5885,0x587D,0x58FD,0x5925,0x5922,0x5924,0x596A,0x5969,0x5AE1,0x5AE6,
+ 0x5AE9,0x5AD7,0x5AD6,0x5AD8,0x5AE3,0x5B75,0x5BDE,0x5BE7,0x5BE1,0x5BE5,
+ 0x5BE6,0x5BE8,0x5BE2,0x5BE4,0x5BDF,0x5C0D,0x5C62,0x5D84,0x5D87,0x5E5B,
+ 0x5E63,0x5E55,0x5E57,0x5E54,0x5ED3,0x5ED6,0x5F0A,0x5F46,0x5F70,0x5FB9,
+ 0x6147,0x613F,0x614B,0x6177,0x6162,0x6163,0x615F,0x615A,0x6158,0x6175,
+ 0x622A,0x6487,0x6458,0x6454,0x64A4,0x6478,0x645F,0x647A,0x6451,0x6467,
+ 0x6434,0x646D,0x647B,0x6572,0x65A1,
+ /* plane 1, row 73 */
+ 1 | (94 << 8), /* first, last */
+ 0x65D7,0x65D6,0x66A2,0x66A8,0x669D,0x699C,0x69A8,0x6995,0x69C1,
+ 0x69AE,0x69D3,0x69CB,0x699B,0x69B7,0x69BB,0x69AB,0x69B4,0x69D0,0x69CD,
+ 0x69AD,0x69CC,0x69A6,0x69C3,0x69A3,0x6B49,0x6B4C,0x6C33,0x6F33,0x6F14,
+ 0x6EFE,0x6F13,0x6EF4,0x6F29,0x6F3E,0x6F20,0x6F2C,0x6F0F,0x6F02,0x6F22,
+ 0x6EFF,0x6EEF,0x6F06,0x6F31,0x6F38,0x6F32,0x6F23,0x6F15,0x6F2B,0x6F2F,
+ 0x6F88,0x6F2A,0x6EEC,0x6F01,0x6EF2,0x6ECC,0x6EF7,0x7194,0x7199,0x717D,
+ 0x718A,0x7184,0x7192,0x723E,0x7292,0x7296,0x7344,0x7350,0x7464,0x7463,
+ 0x746A,0x7470,0x746D,0x7504,0x7591,0x7627,0x760D,0x760B,0x7609,0x7613,
+ 0x76E1,0x76E3,0x7784,0x777D,0x777F,0x7761,0x78C1,0x789F,0x78A7,0x78B3,
+ 0x78A9,0x78A3,0x798E,0x798F,0x798D,
+ /* plane 1, row 74 */
+ 1 | (94 << 8), /* first, last */
+ 0x7A2E,0x7A31,0x7AAA,0x7AA9,0x7AED,0x7AEF,0x7BA1,0x7B95,0x7B8B,
+ 0x7B75,0x7B97,0x7B9D,0x7B94,0x7B8F,0x7BB8,0x7B87,0x7B84,0x7CB9,0x7CBD,
+ 0x7CBE,0x7DBB,0x7DB0,0x7D9C,0x7DBD,0x7DBE,0x7DA0,0x7DCA,0x7DB4,0x7DB2,
+ 0x7DB1,0x7DBA,0x7DA2,0x7DBF,0x7DB5,0x7DB8,0x7DAD,0x7DD2,0x7DC7,0x7DAC,
+ 0x7F70,0x7FE0,0x7FE1,0x7FDF,0x805E,0x805A,0x8087,0x8150,0x8180,0x818F,
+ 0x8188,0x818A,0x817F,0x8182,0x81E7,0x81FA,0x8207,0x8214,0x821E,0x824B,
+ 0x84C9,0x84BF,0x84C6,0x84C4,0x8499,0x849E,0x84B2,0x849C,0x84CB,0x84B8,
+ 0x84C0,0x84D3,0x8490,0x84BC,0x84D1,0x84CA,0x873F,0x871C,0x873B,0x8722,
+ 0x8725,0x8734,0x8718,0x8755,0x8737,0x8729,0x88F3,0x8902,0x88F4,0x88F9,
+ 0x88F8,0x88FD,0x88E8,0x891A,0x88EF,
+ /* plane 1, row 75 */
+ 1 | (94 << 8), /* first, last */
+ 0x8AA6,0x8A8C,0x8A9E,0x8AA3,0x8A8D,0x8AA1,0x8A93,0x8AA4,0x8AAA,
+ 0x8AA5,0x8AA8,0x8A98,0x8A91,0x8A9A,0x8AA7,0x8C6A,0x8C8D,0x8C8C,0x8CD3,
+ 0x8CD1,0x8CD2,0x8D6B,0x8D99,0x8D95,0x8DFC,0x8F14,0x8F12,0x8F15,0x8F13,
+ 0x8FA3,0x9060,0x9058,0x905C,0x9063,0x9059,0x905E,0x9062,0x905D,0x905B,
+ 0x9119,0x9118,0x911E,0x9175,0x9178,0x9177,0x9174,0x9278,0x92AC,0x9280,
+ 0x9285,0x9298,0x9296,0x927B,0x9293,0x929C,0x92A8,0x927C,0x9291,0x95A1,
+ 0x95A8,0x95A9,0x95A3,0x95A5,0x95A4,0x9699,0x969C,0x969B,0x96CC,0x96D2,
+ 0x9700,0x977C,0x9785,0x97F6,0x9817,0x9818,0x98AF,0x98B1,0x9903,0x9905,
+ 0x990C,0x9909,0x99C1,0x9AAF,0x9AB0,0x9AE6,0x9B41,0x9B42,0x9CF4,0x9CF6,
+ 0x9CF3,0x9EBC,0x9F3B,0x9F4A,0x5104,
+ /* plane 1, row 76 */
+ 1 | (94 << 8), /* first, last */
+ 0x5100,0x50FB,0x50F5,0x50F9,0x5102,0x5108,0x5109,0x5105,0x51DC,
+ 0x5287,0x5288,0x5289,0x528D,0x528A,0x52F0,0x53B2,0x562E,0x563B,0x5639,
+ 0x5632,0x563F,0x5634,0x5629,0x5653,0x564E,0x5657,0x5674,0x5636,0x562F,
+ 0x5630,0x5880,0x589F,0x589E,0x58B3,0x589C,0x58AE,0x58A9,0x58A6,0x596D,
+ 0x5B09,0x5AFB,0x5B0B,0x5AF5,0x5B0C,0x5B08,0x5BEE,0x5BEC,0x5BE9,0x5BEB,
+ 0x5C64,0x5C65,0x5D9D,0x5D94,0x5E62,0x5E5F,0x5E61,0x5EE2,0x5EDA,0x5EDF,
+ 0x5EDD,0x5EE3,0x5EE0,0x5F48,0x5F71,0x5FB7,0x5FB5,0x6176,0x6167,0x616E,
+ 0x615D,0x6155,0x6182,0x617C,0x6170,0x616B,0x617E,0x61A7,0x6190,0x61AB,
+ 0x618E,0x61AC,0x619A,0x61A4,0x6194,0x61AE,0x622E,0x6469,0x646F,0x6479,
+ 0x649E,0x64B2,0x6488,0x6490,0x64B0,
+ /* plane 1, row 77 */
+ 1 | (94 << 8), /* first, last */
+ 0x64A5,0x6493,0x6495,0x64A9,0x6492,0x64AE,0x64AD,0x64AB,0x649A,
+ 0x64AC,0x6499,0x64A2,0x64B3,0x6575,0x6577,0x6578,0x66AE,0x66AB,0x66B4,
+ 0x66B1,0x6A23,0x6A1F,0x69E8,0x6A01,0x6A1E,0x6A19,0x69FD,0x6A21,0x6A13,
+ 0x6A0A,0x69F3,0x6A02,0x6A05,0x69ED,0x6A11,0x6B50,0x6B4E,0x6BA4,0x6BC5,
+ 0x6BC6,0x6F3F,0x6F7C,0x6F84,0x6F51,0x6F66,0x6F54,0x6F86,0x6F6D,0x6F5B,
+ 0x6F78,0x6F6E,0x6F8E,0x6F7A,0x6F70,0x6F64,0x6F97,0x6F58,0x6ED5,0x6F6F,
+ 0x6F60,0x6F5F,0x719F,0x71AC,0x71B1,0x71A8,0x7256,0x729B,0x734E,0x7357,
+ 0x7469,0x748B,0x7483,0x747E,0x7480,0x757F,0x7620,0x7629,0x761F,0x7624,
+ 0x7626,0x7621,0x7622,0x769A,0x76BA,0x76E4,0x778E,0x7787,0x778C,0x7791,
+ 0x778B,0x78CB,0x78C5,0x78BA,0x78CA,
+ /* plane 1, row 78 */
+ 1 | (94 << 8), /* first, last */
+ 0x78BE,0x78D5,0x78BC,0x78D0,0x7A3F,0x7A3C,0x7A40,0x7A3D,0x7A37,
+ 0x7A3B,0x7AAF,0x7AAE,0x7BAD,0x7BB1,0x7BC4,0x7BB4,0x7BC6,0x7BC7,0x7BC1,
+ 0x7BA0,0x7BCC,0x7CCA,0x7DE0,0x7DF4,0x7DEF,0x7DFB,0x7DD8,0x7DEC,0x7DDD,
+ 0x7DE8,0x7DE3,0x7DDA,0x7DDE,0x7DE9,0x7D9E,0x7DD9,0x7DF2,0x7DF9,0x7F75,
+ 0x7F77,0x7FAF,0x7FE9,0x8026,0x819B,0x819C,0x819D,0x81A0,0x819A,0x8198,
+ 0x8517,0x853D,0x851A,0x84EE,0x852C,0x852D,0x8513,0x8511,0x8523,0x8521,
+ 0x8514,0x84EC,0x8525,0x84FF,0x8506,0x8782,0x8774,0x8776,0x8760,0x8766,
+ 0x8778,0x8768,0x8759,0x8757,0x874C,0x8753,0x885B,0x885D,0x8910,0x8907,
+ 0x8912,0x8913,0x8915,0x890A,0x8ABC,0x8AD2,0x8AC7,0x8AC4,0x8A95,0x8ACB,
+ 0x8AF8,0x8AB2,0x8AC9,0x8AC2,0x8ABF,
+ /* plane 1, row 79 */
+ 1 | (94 << 8), /* first, last */
+ 0x8AB0,0x8AD6,0x8ACD,0x8AB6,0x8AB9,0x8ADB,0x8C4C,0x8C4E,0x8C6C,
+ 0x8CE0,0x8CDE,0x8CE6,0x8CE4,0x8CEC,0x8CED,0x8CE2,0x8CE3,0x8CDC,0x8CEA,
+ 0x8CE1,0x8D6D,0x8D9F,0x8DA3,0x8E2B,0x8E10,0x8E1D,0x8E22,0x8E0F,0x8E29,
+ 0x8E1F,0x8E21,0x8E1E,0x8EBA,0x8F1D,0x8F1B,0x8F1F,0x8F29,0x8F26,0x8F2A,
+ 0x8F1C,0x8F1E,0x8F25,0x9069,0x906E,0x9068,0x906D,0x9077,0x9130,0x912D,
+ 0x9127,0x9131,0x9187,0x9189,0x918B,0x9183,0x92C5,0x92BB,0x92B7,0x92EA,
+ 0x92E4,0x92C1,0x92B3,0x92BC,0x92D2,0x92C7,0x92F0,0x92B2,0x95AD,0x95B1,
+ 0x9704,0x9706,0x9707,0x9709,0x9760,0x978D,0x978B,0x978F,0x9821,0x982B,
+ 0x981C,0x98B3,0x990A,0x9913,0x9912,0x9918,0x99DD,0x99D0,0x99DF,0x99DB,
+ 0x99D1,0x99D5,0x99D2,0x99D9,0x9AB7,
+ /* plane 1, row 80 */
+ 1 | (94 << 8), /* first, last */
+ 0x9AEE,0x9AEF,0x9B27,0x9B45,0x9B44,0x9B77,0x9B6F,0x9D06,0x9D09,
+ 0x9D03,0x9EA9,0x9EBE,0x9ECE,0x58A8,0x9F52,0x5112,0x5118,0x5114,0x5110,
+ 0x5115,0x5180,0x51AA,0x51DD,0x5291,0x5293,0x52F3,0x5659,0x566B,0x5679,
+ 0x5669,0x5664,0x5678,0x566A,0x5668,0x5665,0x5671,0x566F,0x566C,0x5662,
+ 0x5676,0x58C1,0x58BE,0x58C7,0x58C5,0x596E,0x5B1D,0x5B34,0x5B78,0x5BF0,
+ 0x5C0E,0x5F4A,0x61B2,0x6191,0x61A9,0x618A,0x61CD,0x61B6,0x61BE,0x61CA,
+ 0x61C8,0x6230,0x64C5,0x64C1,0x64CB,0x64BB,0x64BC,0x64DA,0x64C4,0x64C7,
+ 0x64C2,0x64CD,0x64BF,0x64D2,0x64D4,0x64BE,0x6574,0x66C6,0x66C9,0x66B9,
+ 0x66C4,0x66C7,0x66B8,0x6A3D,0x6A38,0x6A3A,0x6A59,0x6A6B,0x6A58,0x6A39,
+ 0x6A44,0x6A62,0x6A61,0x6A4B,0x6A47,
+ /* plane 1, row 81 */
+ 1 | (94 << 8), /* first, last */
+ 0x6A35,0x6A5F,0x6A48,0x6B59,0x6B77,0x6C05,0x6FC2,0x6FB1,0x6FA1,
+ 0x6FC3,0x6FA4,0x6FC1,0x6FA7,0x6FB3,0x6FC0,0x6FB9,0x6FB6,0x6FA6,0x6FA0,
+ 0x6FB4,0x71BE,0x71C9,0x71D0,0x71D2,0x71C8,0x71D5,0x71B9,0x71CE,0x71D9,
+ 0x71DC,0x71C3,0x71C4,0x7368,0x749C,0x74A3,0x7498,0x749F,0x749E,0x74E2,
+ 0x750C,0x750D,0x7634,0x7638,0x763A,0x76E7,0x76E5,0x77A0,0x779E,0x779F,
+ 0x77A5,0x78E8,0x78DA,0x78EC,0x78E7,0x79A6,0x7A4D,0x7A4E,0x7A46,0x7A4C,
+ 0x7A4B,0x7ABA,0x7BD9,0x7C11,0x7BC9,0x7BE4,0x7BDB,0x7BE1,0x7BE9,0x7BE6,
+ 0x7CD5,0x7CD6,0x7E0A,0x7E11,0x7E08,0x7E1B,0x7E23,0x7E1E,0x7E1D,0x7E09,
+ 0x7E10,0x7F79,0x7FB2,0x7FF0,0x7FF1,0x7FEE,0x8028,0x81B3,0x81A9,0x81A8,
+ 0x81FB,0x8208,0x8258,0x8259,0x854A,
+ /* plane 1, row 82 */
+ 1 | (94 << 8), /* first, last */
+ 0x8559,0x8548,0x8568,0x8569,0x8543,0x8549,0x856D,0x856A,0x855E,
+ 0x8783,0x879F,0x879E,0x87A2,0x878D,0x8861,0x892A,0x8932,0x8925,0x892B,
+ 0x8921,0x89AA,0x89A6,0x8AE6,0x8AFA,0x8AEB,0x8AF1,0x8B00,0x8ADC,0x8AE7,
+ 0x8AEE,0x8AFE,0x8B01,0x8B02,0x8AF7,0x8AED,0x8AF3,0x8AF6,0x8AFC,0x8C6B,
+ 0x8C6D,0x8C93,0x8CF4,0x8E44,0x8E31,0x8E34,0x8E42,0x8E39,0x8E35,0x8F3B,
+ 0x8F2F,0x8F38,0x8F33,0x8FA8,0x8FA6,0x9075,0x9074,0x9078,0x9072,0x907C,
+ 0x907A,0x9134,0x9192,0x9320,0x9336,0x92F8,0x9333,0x932F,0x9322,0x92FC,
+ 0x932B,0x9304,0x931A,0x9310,0x9326,0x9321,0x9315,0x932E,0x9319,0x95BB,
+ 0x96A7,0x96A8,0x96AA,0x96D5,0x970E,0x9711,0x9716,0x970D,0x9713,0x970F,
+ 0x975B,0x975C,0x9766,0x9798,0x9830,
+ /* plane 1, row 83 */
+ 1 | (94 << 8), /* first, last */
+ 0x9838,0x983B,0x9837,0x982D,0x9839,0x9824,0x9910,0x9928,0x991E,
+ 0x991B,0x9921,0x991A,0x99ED,0x99E2,0x99F1,0x9AB8,0x9ABC,0x9AFB,0x9AED,
+ 0x9B28,0x9B91,0x9D15,0x9D23,0x9D26,0x9D28,0x9D12,0x9D1B,0x9ED8,0x9ED4,
+ 0x9F8D,0x9F9C,0x512A,0x511F,0x5121,0x5132,0x52F5,0x568E,0x5680,0x5690,
+ 0x5685,0x5687,0x568F,0x58D5,0x58D3,0x58D1,0x58CE,0x5B30,0x5B2A,0x5B24,
+ 0x5B7A,0x5C37,0x5C68,0x5DBC,0x5DBA,0x5DBD,0x5DB8,0x5E6B,0x5F4C,0x5FBD,
+ 0x61C9,0x61C2,0x61C7,0x61E6,0x61CB,0x6232,0x6234,0x64CE,0x64CA,0x64D8,
+ 0x64E0,0x64F0,0x64E6,0x64EC,0x64F1,0x64E2,0x64ED,0x6582,0x6583,0x66D9,
+ 0x66D6,0x6A80,0x6A94,0x6A84,0x6AA2,0x6A9C,0x6ADB,0x6AA3,0x6A7E,0x6A97,
+ 0x6A90,0x6AA0,0x6B5C,0x6BAE,0x6BDA,
+ /* plane 1, row 84 */
+ 1 | (94 << 8), /* first, last */
+ 0x6C08,0x6FD8,0x6FF1,0x6FDF,0x6FE0,0x6FDB,0x6FE4,0x6FEB,0x6FEF,
+ 0x6F80,0x6FEC,0x6FE1,0x6FE9,0x6FD5,0x6FEE,0x6FF0,0x71E7,0x71DF,0x71EE,
+ 0x71E6,0x71E5,0x71ED,0x71EC,0x71F4,0x71E0,0x7235,0x7246,0x7370,0x7372,
+ 0x74A9,0x74B0,0x74A6,0x74A8,0x7646,0x7642,0x764C,0x76EA,0x77B3,0x77AA,
+ 0x77B0,0x77AC,0x77A7,0x77AD,0x77EF,0x78F7,0x78FA,0x78F4,0x78EF,0x7901,
+ 0x79A7,0x79AA,0x7A57,0x7ABF,0x7C07,0x7C0D,0x7BFE,0x7BF7,0x7C0C,0x7BE0,
+ 0x7CE0,0x7CDC,0x7CDE,0x7CE2,0x7CDF,0x7CD9,0x7CDD,0x7E2E,0x7E3E,0x7E46,
+ 0x7E37,0x7E32,0x7E43,0x7E2B,0x7E3D,0x7E31,0x7E45,0x7E41,0x7E34,0x7E39,
+ 0x7E48,0x7E35,0x7E3F,0x7E2F,0x7F44,0x7FF3,0x7FFC,0x8071,0x8072,0x8070,
+ 0x806F,0x8073,0x81C6,0x81C3,0x81BA,
+ /* plane 1, row 85 */
+ 1 | (94 << 8), /* first, last */
+ 0x81C2,0x81C0,0x81BF,0x81BD,0x81C9,0x81BE,0x81E8,0x8209,0x8271,
+ 0x85AA,0x8584,0x857E,0x859C,0x8591,0x8594,0x85AF,0x859B,0x8587,0x85A8,
+ 0x858A,0x85A6,0x8667,0x87C0,0x87D1,0x87B3,0x87D2,0x87C6,0x87AB,0x87BB,
+ 0x87BA,0x87C8,0x87CB,0x893B,0x8936,0x8944,0x8938,0x893D,0x89AC,0x8B0E,
+ 0x8B17,0x8B19,0x8B1B,0x8B0A,0x8B20,0x8B1D,0x8B04,0x8B10,0x8C41,0x8C3F,
+ 0x8C73,0x8CFA,0x8CFD,0x8CFC,0x8CF8,0x8CFB,0x8DA8,0x8E49,0x8E4B,0x8E48,
+ 0x8E4A,0x8F44,0x8F3E,0x8F42,0x8F45,0x8F3F,0x907F,0x907D,0x9084,0x9081,
+ 0x9082,0x9080,0x9139,0x91A3,0x919E,0x919C,0x934D,0x9382,0x9328,0x9375,
+ 0x934A,0x9365,0x934B,0x9318,0x937E,0x936C,0x935B,0x9370,0x935A,0x9354,
+ 0x95CA,0x95CB,0x95CC,0x95C8,0x95C6,
+ /* plane 1, row 86 */
+ 1 | (94 << 8), /* first, last */
+ 0x96B1,0x96B8,0x96D6,0x971C,0x971E,0x97A0,0x97D3,0x9846,0x98B6,
+ 0x9935,0x9A01,0x99FF,0x9BAE,0x9BAB,0x9BAA,0x9BAD,0x9D3B,0x9D3F,0x9E8B,
+ 0x9ECF,0x9EDE,0x9EDC,0x9EDD,0x9EDB,0x9F3E,0x9F4B,0x53E2,0x5695,0x56AE,
+ 0x58D9,0x58D8,0x5B38,0x5F5E,0x61E3,0x6233,0x64F4,0x64F2,0x64FE,0x6506,
+ 0x64FA,0x64FB,0x64F7,0x65B7,0x66DC,0x6726,0x6AB3,0x6AAC,0x6AC3,0x6ABB,
+ 0x6AB8,0x6AC2,0x6AAE,0x6AAF,0x6B5F,0x6B78,0x6BAF,0x7009,0x700B,0x6FFE,
+ 0x7006,0x6FFA,0x7011,0x700F,0x71FB,0x71FC,0x71FE,0x71F8,0x7377,0x7375,
+ 0x74A7,0x74BF,0x7515,0x7656,0x7658,0x7652,0x77BD,0x77BF,0x77BB,0x77BC,
+ 0x790E,0x79AE,0x7A61,0x7A62,0x7A60,0x7AC4,0x7AC5,0x7C2B,0x7C27,0x7C2A,
+ 0x7C1E,0x7C23,0x7C21,0x7CE7,0x7E54,
+ /* plane 1, row 87 */
+ 1 | (94 << 8), /* first, last */
+ 0x7E55,0x7E5E,0x7E5A,0x7E61,0x7E52,0x7E59,0x7F48,0x7FF9,0x7FFB,
+ 0x8077,0x8076,0x81CD,0x81CF,0x820A,0x85CF,0x85A9,0x85CD,0x85D0,0x85C9,
+ 0x85B0,0x85BA,0x85B9,0x87EF,0x87EC,0x87F2,0x87E0,0x8986,0x89B2,0x89F4,
+ 0x8B28,0x8B39,0x8B2C,0x8B2B,0x8C50,0x8D05,0x8E59,0x8E63,0x8E66,0x8E64,
+ 0x8E5F,0x8E55,0x8EC0,0x8F49,0x8F4D,0x9087,0x9083,0x9088,0x91AB,0x91AC,
+ 0x91D0,0x9394,0x938A,0x9396,0x93A2,0x93B3,0x93AE,0x93AC,0x93B0,0x9398,
+ 0x939A,0x9397,0x95D4,0x95D6,0x95D0,0x95D5,0x96E2,0x96DC,0x96D9,0x96DB,
+ 0x96DE,0x9724,0x97A3,0x97A6,0x97AD,0x97F9,0x984D,0x984F,0x984C,0x984E,
+ 0x9853,0x98BA,0x993E,0x993F,0x993D,0x992E,0x99A5,0x9A0E,0x9AC1,0x9B03,
+ 0x9B06,0x9B4F,0x9B4E,0x9B4D,0x9BCA,
+ /* plane 1, row 88 */
+ 1 | (94 << 8), /* first, last */
+ 0x9BC9,0x9BFD,0x9BC8,0x9BC0,0x9D51,0x9D5D,0x9D60,0x9EE0,0x9F15,
+ 0x9F2C,0x5133,0x56A5,0x56A8,0x58DE,0x58DF,0x58E2,0x5BF5,0x9F90,0x5EEC,
+ 0x61F2,0x61F7,0x61F6,0x61F5,0x6500,0x650F,0x66E0,0x66DD,0x6AE5,0x6ADD,
+ 0x6ADA,0x6AD3,0x701B,0x701F,0x7028,0x701A,0x701D,0x7015,0x7018,0x7206,
+ 0x720D,0x7258,0x72A2,0x7378,0x737A,0x74BD,0x74CA,0x74E3,0x7587,0x7586,
+ 0x765F,0x7661,0x77C7,0x7919,0x79B1,0x7A6B,0x7A69,0x7C3E,0x7C3F,0x7C38,
+ 0x7C3D,0x7C37,0x7C40,0x7E6B,0x7E6D,0x7E79,0x7E69,0x7E6A,0x7E73,0x7F85,
+ 0x7FB6,0x7FB9,0x7FB8,0x81D8,0x85E9,0x85DD,0x85EA,0x85D5,0x85E4,0x85E5,
+ 0x85F7,0x87FB,0x8805,0x880D,0x87F9,0x87FE,0x8960,0x895F,0x8956,0x895E,
+ 0x8B41,0x8B5C,0x8B58,0x8B49,0x8B5A,
+ /* plane 1, row 89 */
+ 1 | (94 << 8), /* first, last */
+ 0x8B4E,0x8B4F,0x8B46,0x8B59,0x8D08,0x8D0A,0x8E7C,0x8E72,0x8E87,
+ 0x8E76,0x8E6C,0x8E7A,0x8E74,0x8F54,0x8F4E,0x8FAD,0x908A,0x908B,0x91B1,
+ 0x91AE,0x93E1,0x93D1,0x93DF,0x93C3,0x93C8,0x93DC,0x93DD,0x93D6,0x93E2,
+ 0x93CD,0x93D8,0x93E4,0x93D7,0x93E8,0x95DC,0x96B4,0x96E3,0x972A,0x9727,
+ 0x9761,0x97DC,0x97FB,0x985E,0x9858,0x985B,0x98BC,0x9945,0x9949,0x9A16,
+ 0x9A19,0x9B0D,0x9BE8,0x9BE7,0x9BD6,0x9BDB,0x9D89,0x9D61,0x9D72,0x9D6A,
+ 0x9D6C,0x9E92,0x9E97,0x9E93,0x9EB4,0x52F8,0x56B7,0x56B6,0x56B4,0x56BC,
+ 0x58E4,0x5B40,0x5B43,0x5B7D,0x5BF6,0x5DC9,0x61F8,0x61FA,0x6518,0x6514,
+ 0x6519,0x66E6,0x6727,0x6AEC,0x703E,0x7030,0x7032,0x7210,0x737B,0x74CF,
+ 0x7662,0x7665,0x7926,0x792A,0x792C,
+ /* plane 1, row 90 */
+ 1 | (94 << 8), /* first, last */
+ 0x792B,0x7AC7,0x7AF6,0x7C4C,0x7C43,0x7C4D,0x7CEF,0x7CF0,0x8FAE,
+ 0x7E7D,0x7E7C,0x7E82,0x7F4C,0x8000,0x81DA,0x8266,0x85FB,0x85F9,0x8611,
+ 0x85FA,0x8606,0x860B,0x8607,0x860A,0x8814,0x8815,0x8964,0x89BA,0x89F8,
+ 0x8B70,0x8B6C,0x8B66,0x8B6F,0x8B5F,0x8B6B,0x8D0F,0x8D0D,0x8E89,0x8E81,
+ 0x8E85,0x8E82,0x91B4,0x91CB,0x9418,0x9403,0x93FD,0x95E1,0x9730,0x98C4,
+ 0x9952,0x9951,0x99A8,0x9A2B,0x9A30,0x9A37,0x9A35,0x9C13,0x9C0D,0x9E79,
+ 0x9EB5,0x9EE8,0x9F2F,0x9F5F,0x9F63,0x9F61,0x5137,0x5138,0x56C1,0x56C0,
+ 0x56C2,0x5914,0x5C6C,0x5DCD,0x61FC,0x61FE,0x651D,0x651C,0x6595,0x66E9,
+ 0x6AFB,0x6B04,0x6AFA,0x6BB2,0x704C,0x721B,0x72A7,0x74D6,0x74D4,0x7669,
+ 0x77D3,0x7C50,0x7E8F,0x7E8C,0x7FBC,
+ /* plane 1, row 91 */
+ 1 | (94 << 8), /* first, last */
+ 0x8617,0x862D,0x861A,0x8823,0x8822,0x8821,0x881F,0x896A,0x896C,
+ 0x89BD,0x8B74,0x8B77,0x8B7D,0x8D13,0x8E8A,0x8E8D,0x8E8B,0x8F5F,0x8FAF,
+ 0x91BA,0x942E,0x9433,0x9435,0x943A,0x9438,0x9432,0x942B,0x95E2,0x9738,
+ 0x9739,0x9732,0x97FF,0x9867,0x9865,0x9957,0x9A45,0x9A43,0x9A40,0x9A3E,
+ 0x9ACF,0x9B54,0x9B51,0x9C2D,0x9C25,0x9DAF,0x9DB4,0x9DC2,0x9DB8,0x9E9D,
+ 0x9EEF,0x9F19,0x9F5C,0x9F66,0x9F67,0x513C,0x513B,0x56C8,0x56CA,0x56C9,
+ 0x5B7F,0x5DD4,0x5DD2,0x5F4E,0x61FF,0x6524,0x6B0A,0x6B61,0x7051,0x7058,
+ 0x7380,0x74E4,0x758A,0x766E,0x766C,0x79B3,0x7C60,0x7C5F,0x807E,0x807D,
+ 0x81DF,0x8972,0x896F,0x89FC,0x8B80,0x8D16,0x8D17,0x8E91,0x8E93,0x8F61,
+ 0x9148,0x9444,0x9451,0x9452,0x973D,
+ /* plane 1, row 92 */
+ 1 | (94 << 8), /* first, last */
+ 0x973E,0x97C3,0x97C1,0x986B,0x9955,0x9A55,0x9A4D,0x9AD2,0x9B1A,
+ 0x9C49,0x9C31,0x9C3E,0x9C3B,0x9DD3,0x9DD7,0x9F34,0x9F6C,0x9F6A,0x9F94,
+ 0x56CC,0x5DD6,0x6200,0x6523,0x652B,0x652A,0x66EC,0x6B10,0x74DA,0x7ACA,
+ 0x7C64,0x7C63,0x7C65,0x7E93,0x7E96,0x7E94,0x81E2,0x8638,0x863F,0x8831,
+ 0x8B8A,0x9090,0x908F,0x9463,0x9460,0x9464,0x9768,0x986F,0x995C,0x9A5A,
+ 0x9A5B,0x9A57,0x9AD3,0x9AD4,0x9AD1,0x9C54,0x9C57,0x9C56,0x9DE5,0x9E9F,
+ 0x9EF4,0x56D1,0x58E9,0x652C,0x705E,0x7671,0x7672,0x77D7,0x7F50,0x7F88,
+ 0x8836,0x8839,0x8862,0x8B93,0x8B92,0x8B96,0x8277,0x8D1B,0x91C0,0x946A,
+ 0x9742,0x9748,0x9744,0x97C6,0x9870,0x9A5F,0x9B22,0x9B58,0x9C5F,0x9DF9,
+ 0x9DFA,0x9E7C,0x9E7D,0x9F07,0x9F77,
+ /* plane 1, row 93 */
+ 1 | (43 << 8), /* first, last */
+ 0x9F72,0x5EF3,0x6B16,0x7063,0x7C6C,0x7C6E,0x883B,0x89C0,0x8EA1,
+ 0x91C1,0x9472,0x9470,0x9871,0x995E,0x9AD6,0x9B23,0x9ECC,0x7064,0x77DA,
+ 0x8B9A,0x9477,0x97C9,0x9A62,0x9A65,0x7E9C,0x8B9C,0x8EAA,0x91C5,0x947D,
+ 0x947E,0x947C,0x9C77,0x9C78,0x9EF7,0x8C54,0x947F,0x9E1A,0x7228,0x9A6A,
+ 0x9B31,0x9E1B,0x9E1E,0x7C72,
+ /* plane 1, row 94: --- */
+ /* plane 2, row 1 */
+ 1 | (94 << 8), /* first, last */
+ 0x4E42,0x4E5C,0x51F5,0x531A,0x5382,0x4E07,0x4E0C,0x4E47,0x4E8D,
+ 0x56D7,0x5C6E,0x5F73,0x4E0F,0x5187,0x4E0E,0x4E2E,0x4E93,0x4EC2,0x4EC9,
+ 0x4EC8,0x5198,0x52FC,0x536C,0x53B9,0x5720,0x5903,0x592C,0x5C10,0x5DFF,
+ 0x65E1,0x6BB3,0x6BCC,0x6C14,0x723F,0x4E31,0x4E3C,0x4EE8,0x4EDC,0x4EE9,
+ 0x4EE1,0x4EDD,0x4EDA,0x520C,0x5209,0x531C,0x534C,0x5722,0x5723,0x5917,
+ 0x592F,0x5B81,0x5B84,0x5C12,0x5C3B,0x5C74,0x5C73,0x5E04,0x5E80,0x5E82,
+ 0x5FC9,0x6209,0x6250,0x6C15,0x6C36,0x6C43,0x6C3F,0x6C3B,0x72AE,0x72B0,
+ 0x738A,0x79B8,0x808A,0x961E,0x4F0E,0x4F18,0x4F2C,0x4EF5,0x4F14,0x4EF1,
+ 0x4F00,0x4EF7,0x4F08,0x4F1D,0x4F02,0x4F05,0x4F22,0x4F13,0x4F04,0x4EF4,
+ 0x4F12,0x51B1,0x5213,0x5210,0x52A6,
+ /* plane 2, row 2 */
+ 1 | (94 << 8), /* first, last */
+ 0x5322,0x531F,0x534D,0x538A,0x5407,0x56E1,0x56DF,0x572E,0x572A,
+ 0x5734,0x593C,0x5980,0x597C,0x5985,0x597B,0x597E,0x5977,0x597F,0x5B56,
+ 0x5C15,0x5C25,0x5C7C,0x5C7A,0x5C7B,0x5C7E,0x5DDF,0x5E75,0x5E84,0x5F02,
+ 0x5F1A,0x5F74,0x5FD5,0x5FD4,0x5FCF,0x625C,0x625E,0x6264,0x6261,0x6266,
+ 0x6262,0x6259,0x6260,0x625A,0x6265,0x6537,0x65EF,0x65EE,0x673E,0x6739,
+ 0x6738,0x673B,0x673A,0x673F,0x673C,0x6733,0x6C18,0x6C46,0x6C52,0x6C5C,
+ 0x6C4F,0x6C4A,0x6C54,0x6C4B,0x6C4C,0x7071,0x725E,0x72B4,0x72B5,0x738E,
+ 0x752A,0x767F,0x7A75,0x7F51,0x8278,0x827C,0x8280,0x827D,0x827F,0x864D,
+ 0x897E,0x9099,0x9097,0x9098,0x909B,0x9094,0x9622,0x9624,0x9620,0x9623,
+ 0x4F56,0x4F3B,0x4F62,0x4F49,0x4F53,
+ /* plane 2, row 3 */
+ 1 | (94 << 8), /* first, last */
+ 0x4F64,0x4F3E,0x4F67,0x4F52,0x4F5F,0x4F41,0x4F58,0x4F2D,0x4F33,
+ 0x4F3F,0x4F61,0x518F,0x51B9,0x521C,0x521E,0x5221,0x52AD,0x52AE,0x5309,
+ 0x5363,0x5372,0x538E,0x538F,0x5430,0x5437,0x542A,0x5454,0x5445,0x5419,
+ 0x541C,0x5425,0x5418,0x543D,0x544F,0x5441,0x5428,0x5424,0x5447,0x56EE,
+ 0x56E7,0x56E5,0x5741,0x5745,0x574C,0x5749,0x574B,0x5752,0x5906,0x5940,
+ 0x59A6,0x5998,0x59A0,0x5997,0x598E,0x59A2,0x5990,0x598F,0x59A7,0x59A1,
+ 0x5B8E,0x5B92,0x5C28,0x5C2A,0x5C8D,0x5C8F,0x5C88,0x5C8B,0x5C89,0x5C92,
+ 0x5C8A,0x5C86,0x5C93,0x5C95,0x5DE0,0x5E0A,0x5E0E,0x5E8B,0x5E89,0x5E8C,
+ 0x5E88,0x5E8D,0x5F05,0x5F1D,0x5F78,0x5F76,0x5FD2,0x5FD1,0x5FD0,0x5FED,
+ 0x5FE8,0x5FEE,0x5FF3,0x5FE1,0x5FE4,
+ /* plane 2, row 4 */
+ 1 | (94 << 8), /* first, last */
+ 0x5FE3,0x5FFA,0x5FEF,0x5FF7,0x5FFB,0x6000,0x5FF4,0x623A,0x6283,
+ 0x628C,0x628E,0x628F,0x6294,0x6287,0x6271,0x627B,0x627A,0x6270,0x6281,
+ 0x6288,0x6277,0x627D,0x6272,0x6274,0x65F0,0x65F4,0x65F3,0x65F2,0x65F5,
+ 0x6745,0x6747,0x6759,0x6755,0x674C,0x6748,0x675D,0x674D,0x675A,0x674B,
+ 0x6BD0,0x6C19,0x6C1A,0x6C78,0x6C67,0x6C6B,0x6C84,0x6C8B,0x6C8F,0x6C71,
+ 0x6C6F,0x6C69,0x6C9A,0x6C6D,0x6C87,0x6C95,0x6C9C,0x6C66,0x6C73,0x6C65,
+ 0x6C7B,0x6C8E,0x7074,0x707A,0x7263,0x72BF,0x72BD,0x72C3,0x72C6,0x72C1,
+ 0x72BA,0x72C5,0x7395,0x7397,0x7393,0x7394,0x7392,0x753A,0x7539,0x7594,
+ 0x7595,0x7681,0x793D,0x8034,0x8095,0x8099,0x8090,0x8092,0x809C,0x8290,
+ 0x828F,0x8285,0x828E,0x8291,0x8293,
+ /* plane 2, row 5 */
+ 1 | (94 << 8), /* first, last */
+ 0x828A,0x8283,0x8284,0x8C78,0x8FC9,0x8FBF,0x909F,0x90A1,0x90A5,
+ 0x909E,0x90A7,0x90A0,0x9630,0x9628,0x962F,0x962D,0x4E33,0x4F98,0x4F7C,
+ 0x4F85,0x4F7D,0x4F80,0x4F87,0x4F76,0x4F74,0x4F89,0x4F84,0x4F77,0x4F4C,
+ 0x4F97,0x4F6A,0x4F9A,0x4F79,0x4F81,0x4F78,0x4F90,0x4F9C,0x4F94,0x4F9E,
+ 0x4F92,0x4F82,0x4F95,0x4F6B,0x4F6E,0x519E,0x51BC,0x51BE,0x5235,0x5232,
+ 0x5233,0x5246,0x5231,0x52BC,0x530A,0x530B,0x533C,0x5392,0x5394,0x5487,
+ 0x547F,0x5481,0x5491,0x5482,0x5488,0x546B,0x547A,0x547E,0x5465,0x546C,
+ 0x5474,0x5466,0x548D,0x546F,0x5461,0x5460,0x5498,0x5463,0x5467,0x5464,
+ 0x56F7,0x56F9,0x576F,0x5772,0x576D,0x576B,0x5771,0x5770,0x5776,0x5780,
+ 0x5775,0x577B,0x5773,0x5774,0x5762,
+ /* plane 2, row 6 */
+ 1 | (94 << 8), /* first, last */
+ 0x5768,0x577D,0x590C,0x5945,0x59B5,0x59BA,0x59CF,0x59CE,0x59B2,
+ 0x59CC,0x59C1,0x59B6,0x59BC,0x59C3,0x59D6,0x59B1,0x59BD,0x59C0,0x59C8,
+ 0x59B4,0x59C7,0x5B62,0x5B65,0x5B93,0x5B95,0x5C44,0x5C47,0x5CAE,0x5CA4,
+ 0x5CA0,0x5CB5,0x5CAF,0x5CA8,0x5CAC,0x5C9F,0x5CA3,0x5CAD,0x5CA2,0x5CAA,
+ 0x5CA7,0x5C9D,0x5CA5,0x5CB6,0x5CB0,0x5CA6,0x5E17,0x5E14,0x5E19,0x5F28,
+ 0x5F22,0x5F23,0x5F24,0x5F54,0x5F82,0x5F7E,0x5F7D,0x5FDE,0x5FE5,0x602D,
+ 0x6026,0x6019,0x6032,0x600B,0x6034,0x600A,0x6017,0x6033,0x601A,0x601E,
+ 0x602C,0x6022,0x600D,0x6010,0x602E,0x6013,0x6011,0x600C,0x6009,0x601C,
+ 0x6214,0x623D,0x62AD,0x62B4,0x62D1,0x62BE,0x62AA,0x62B6,0x62CA,0x62AE,
+ 0x62B3,0x62AF,0x62BB,0x62A9,0x62B0,
+ /* plane 2, row 7 */
+ 1 | (94 << 8), /* first, last */
+ 0x62B8,0x653D,0x65A8,0x65BB,0x6609,0x65FC,0x6604,0x6612,0x6608,
+ 0x65FB,0x6603,0x660B,0x660D,0x6605,0x65FD,0x6611,0x6610,0x66F6,0x670A,
+ 0x6785,0x676C,0x678E,0x6792,0x6776,0x677B,0x6798,0x6786,0x6784,0x6774,
+ 0x678D,0x678C,0x677A,0x679F,0x6791,0x6799,0x6783,0x677D,0x6781,0x6778,
+ 0x6779,0x6794,0x6B25,0x6B80,0x6B7E,0x6BDE,0x6C1D,0x6C93,0x6CEC,0x6CEB,
+ 0x6CEE,0x6CD9,0x6CB6,0x6CD4,0x6CAD,0x6CE7,0x6CB7,0x6CD0,0x6CC2,0x6CBA,
+ 0x6CC3,0x6CC6,0x6CED,0x6CF2,0x6CD2,0x6CDD,0x6CB4,0x6C8A,0x6C9D,0x6C80,
+ 0x6CDE,0x6CC0,0x6D30,0x6CCD,0x6CC7,0x6CB0,0x6CF9,0x6CCF,0x6CE9,0x6CD1,
+ 0x7094,0x7098,0x7085,0x7093,0x7086,0x7084,0x7091,0x7096,0x7082,0x709A,
+ 0x7083,0x726A,0x72D6,0x72CB,0x72D8,
+ /* plane 2, row 8 */
+ 1 | (94 << 8), /* first, last */
+ 0x72C9,0x72DC,0x72D2,0x72D4,0x72DA,0x72CC,0x72D1,0x73A4,0x73A1,
+ 0x73AD,0x73A6,0x73A2,0x73A0,0x73AC,0x739D,0x74DD,0x74E8,0x753F,0x7540,
+ 0x753E,0x758C,0x7598,0x76AF,0x76F3,0x76F1,0x76F0,0x76F5,0x77F8,0x77FC,
+ 0x77F9,0x77FB,0x77FA,0x77F7,0x7942,0x793F,0x79C5,0x7A78,0x7A7B,0x7AFB,
+ 0x7C75,0x7CFD,0x8035,0x808F,0x80AE,0x80A3,0x80B8,0x80B5,0x80AD,0x8220,
+ 0x82A0,0x82C0,0x82AB,0x829A,0x8298,0x829B,0x82B5,0x82A7,0x82AE,0x82BC,
+ 0x829E,0x82BA,0x82B4,0x82A8,0x82A1,0x82A9,0x82C2,0x82A4,0x82C3,0x82B6,
+ 0x82A2,0x8670,0x866F,0x866D,0x866E,0x8C56,0x8FD2,0x8FCB,0x8FD3,0x8FCD,
+ 0x8FD6,0x8FD5,0x8FD7,0x90B2,0x90B4,0x90AF,0x90B3,0x90B0,0x9639,0x963D,
+ 0x963C,0x963A,0x9643,0x4FCD,0x4FC5,
+ /* plane 2, row 9 */
+ 1 | (94 << 8), /* first, last */
+ 0x4FD3,0x4FB2,0x4FC9,0x4FCB,0x4FC1,0x4FD4,0x4FDC,0x4FD9,0x4FBB,
+ 0x4FB3,0x4FDB,0x4FC7,0x4FD6,0x4FBA,0x4FC0,0x4FB9,0x4FEC,0x5244,0x5249,
+ 0x52C0,0x52C2,0x533D,0x537C,0x5397,0x5396,0x5399,0x5398,0x54BA,0x54A1,
+ 0x54AD,0x54A5,0x54CF,0x54C3,0x830D,0x54B7,0x54AE,0x54D6,0x54B6,0x54C5,
+ 0x54C6,0x54A0,0x5470,0x54BC,0x54A2,0x54BE,0x5472,0x54DE,0x54B0,0x57B5,
+ 0x579E,0x579F,0x57A4,0x578C,0x5797,0x579D,0x579B,0x5794,0x5798,0x578F,
+ 0x5799,0x57A5,0x579A,0x5795,0x58F4,0x590D,0x5953,0x59E1,0x59DE,0x59EE,
+ 0x5A00,0x59F1,0x59DD,0x59FA,0x59FD,0x59FC,0x59F6,0x59E4,0x59F2,0x59F7,
+ 0x59DB,0x59E9,0x59F3,0x59F5,0x59E0,0x59FE,0x59F4,0x59ED,0x5BA8,0x5C4C,
+ 0x5CD0,0x5CD8,0x5CCC,0x5CD7,0x5CCB,
+ /* plane 2, row 10 */
+ 1 | (94 << 8), /* first, last */
+ 0x5CDB,0x5CDE,0x5CDA,0x5CC9,0x5CC7,0x5CCA,0x5CD6,0x5CD3,0x5CD4,
+ 0x5CCF,0x5CC8,0x5CC6,0x5CCE,0x5CDF,0x5CF8,0x5DF9,0x5E21,0x5E22,0x5E23,
+ 0x5E20,0x5E24,0x5EB0,0x5EA4,0x5EA2,0x5E9B,0x5EA3,0x5EA5,0x5F07,0x5F2E,
+ 0x5F56,0x5F86,0x6037,0x6039,0x6054,0x6072,0x605E,0x6045,0x6053,0x6047,
+ 0x6049,0x605B,0x604C,0x6040,0x6042,0x605F,0x6024,0x6044,0x6058,0x6066,
+ 0x606E,0x6242,0x6243,0x62CF,0x630D,0x630B,0x62F5,0x630E,0x6303,0x62EB,
+ 0x62F9,0x630F,0x630C,0x62F8,0x62F6,0x6300,0x6313,0x6314,0x62FA,0x6315,
+ 0x62FB,0x62F0,0x6541,0x6543,0x65AA,0x65BF,0x6636,0x6621,0x6632,0x6635,
+ 0x661C,0x6626,0x6622,0x6633,0x662B,0x663A,0x661D,0x6634,0x6639,0x662E,
+ 0x670F,0x6710,0x67C1,0x67F2,0x67C8,
+ /* plane 2, row 11 */
+ 1 | (94 << 8), /* first, last */
+ 0x67BA,0x67DC,0x67BB,0x67F8,0x67D8,0x67C0,0x67B7,0x67C5,0x67EB,
+ 0x67E4,0x67DF,0x67B5,0x67CD,0x67B3,0x67F7,0x67F6,0x67EE,0x67E3,0x67C2,
+ 0x67B9,0x67CE,0x67E7,0x67F0,0x67B2,0x67FC,0x67C6,0x67ED,0x67CC,0x67AE,
+ 0x67E6,0x67DB,0x67FA,0x67C9,0x67CA,0x67C3,0x67EA,0x67CB,0x6B28,0x6B82,
+ 0x6B84,0x6BB6,0x6BD6,0x6BD8,0x6BE0,0x6C20,0x6C21,0x6D28,0x6D34,0x6D2D,
+ 0x6D1F,0x6D3C,0x6D3F,0x6D12,0x6D0A,0x6CDA,0x6D33,0x6D04,0x6D19,0x6D3A,
+ 0x6D1A,0x6D11,0x6D00,0x6D1D,0x6D42,0x6D01,0x6D18,0x6D37,0x6D03,0x6D0F,
+ 0x6D40,0x6D07,0x6D20,0x6D2C,0x6D08,0x6D22,0x6D09,0x6D10,0x70B7,0x709F,
+ 0x70BE,0x70B1,0x70B0,0x70A1,0x70B4,0x70B5,0x70A9,0x7241,0x7249,0x724A,
+ 0x726C,0x7270,0x7273,0x726E,0x72CA,
+ /* plane 2, row 12 */
+ 1 | (94 << 8), /* first, last */
+ 0x72E4,0x72E8,0x72EB,0x72DF,0x72EA,0x72E6,0x72E3,0x7385,0x73CC,
+ 0x73C2,0x73C8,0x73C5,0x73B9,0x73B6,0x73B5,0x73B4,0x73EB,0x73BF,0x73C7,
+ 0x73BE,0x73C3,0x73C6,0x73B8,0x73CB,0x74EC,0x74EE,0x752E,0x7547,0x7548,
+ 0x75A7,0x75AA,0x7679,0x76C4,0x7708,0x7703,0x7704,0x7705,0x770A,0x76F7,
+ 0x76FB,0x76FA,0x77E7,0x77E8,0x7806,0x7811,0x7812,0x7805,0x7810,0x780F,
+ 0x780E,0x7809,0x7803,0x7813,0x794A,0x794C,0x794B,0x7945,0x7944,0x79D5,
+ 0x79CD,0x79CF,0x79D6,0x79CE,0x7A80,0x7A7E,0x7AD1,0x7B00,0x7B01,0x7C7A,
+ 0x7C78,0x7C79,0x7C7F,0x7C80,0x7C81,0x7D03,0x7D08,0x7D01,0x7F58,0x7F91,
+ 0x7F8D,0x7FBE,0x8007,0x800E,0x800F,0x8014,0x8037,0x80D8,0x80C7,0x80E0,
+ 0x80D1,0x80C8,0x80C2,0x80D0,0x80C5,
+ /* plane 2, row 13 */
+ 1 | (94 << 8), /* first, last */
+ 0x80E3,0x80D9,0x80DC,0x80CA,0x80D5,0x80C9,0x80CF,0x80D7,0x80E6,
+ 0x80CD,0x81FF,0x8221,0x8294,0x82D9,0x82FE,0x82F9,0x8307,0x82E8,0x8300,
+ 0x82D5,0x833A,0x82EB,0x82D6,0x82F4,0x82EC,0x82E1,0x82F2,0x82F5,0x830C,
+ 0x82FB,0x82F6,0x82F0,0x82EA,0x82E4,0x82E0,0x82FA,0x82F3,0x82ED,0x8677,
+ 0x8674,0x867C,0x8673,0x8841,0x884E,0x8867,0x886A,0x8869,0x89D3,0x8A04,
+ 0x8A07,0x8D72,0x8FE3,0x8FE1,0x8FEE,0x8FE0,0x90F1,0x90BD,0x90BF,0x90D5,
+ 0x90C5,0x90BE,0x90C7,0x90CB,0x90C8,0x91D4,0x91D3,0x9654,0x964F,0x9651,
+ 0x9653,0x964A,0x964E,0x501E,0x5005,0x5007,0x5013,0x5022,0x5030,0x501B,
+ 0x4FF5,0x4FF4,0x5033,0x5037,0x502C,0x4FF6,0x4FF7,0x5017,0x501C,0x5020,
+ 0x5027,0x5035,0x502F,0x5031,0x500E,
+ /* plane 2, row 14 */
+ 1 | (94 << 8), /* first, last */
+ 0x515A,0x5194,0x5193,0x51CA,0x51C4,0x51C5,0x51C8,0x51CE,0x5261,
+ 0x525A,0x5252,0x525E,0x525F,0x5255,0x5262,0x52CD,0x530E,0x539E,0x5526,
+ 0x54E2,0x5517,0x5512,0x54E7,0x54F3,0x54E4,0x551A,0x54FF,0x5504,0x5508,
+ 0x54EB,0x5511,0x5505,0x54F1,0x550A,0x54FB,0x54F7,0x54F8,0x54E0,0x550E,
+ 0x5503,0x550B,0x5701,0x5702,0x57CC,0x5832,0x57D5,0x57D2,0x57BA,0x57C6,
+ 0x57BD,0x57BC,0x57B8,0x57B6,0x57BF,0x57C7,0x57D0,0x57B9,0x57C1,0x590E,
+ 0x594A,0x5A19,0x5A16,0x5A2D,0x5A2E,0x5A15,0x5A0F,0x5A17,0x5A0A,0x5A1E,
+ 0x5A33,0x5B6C,0x5BA7,0x5BAD,0x5BAC,0x5C03,0x5C56,0x5C54,0x5CEC,0x5CFF,
+ 0x5CEE,0x5CF1,0x5CF7,0x5D00,0x5CF9,0x5E29,0x5E28,0x5EA8,0x5EAE,0x5EAA,
+ 0x5EAC,0x5F33,0x5F30,0x5F67,0x605D,
+ /* plane 2, row 15 */
+ 1 | (94 << 8), /* first, last */
+ 0x605A,0x6067,0x6041,0x60A2,0x6088,0x6080,0x6092,0x6081,0x609D,
+ 0x6083,0x6095,0x609B,0x6097,0x6087,0x609C,0x608E,0x6219,0x6246,0x62F2,
+ 0x6310,0x6356,0x632C,0x6344,0x6345,0x6336,0x6343,0x63E4,0x6339,0x634B,
+ 0x634A,0x633C,0x6329,0x6341,0x6334,0x6358,0x6354,0x6359,0x632D,0x6347,
+ 0x6333,0x635A,0x6351,0x6338,0x6357,0x6340,0x6348,0x654A,0x6546,0x65C6,
+ 0x65C3,0x65C4,0x65C2,0x664A,0x665F,0x6647,0x6651,0x6712,0x6713,0x681F,
+ 0x681A,0x6849,0x6832,0x6833,0x683B,0x684B,0x684F,0x6816,0x6831,0x681C,
+ 0x6835,0x682B,0x682D,0x682F,0x684E,0x6844,0x6834,0x681D,0x6812,0x6814,
+ 0x6826,0x6828,0x682E,0x684D,0x683A,0x6825,0x6820,0x6B2C,0x6B2F,0x6B2D,
+ 0x6B31,0x6B34,0x6B6D,0x8082,0x6B88,
+ /* plane 2, row 16 */
+ 1 | (94 << 8), /* first, last */
+ 0x6BE6,0x6BE4,0x6BE8,0x6BE3,0x6BE2,0x6BE7,0x6C25,0x6D7A,0x6D63,
+ 0x6D64,0x6D76,0x6D0D,0x6D61,0x6D92,0x6D58,0x6D62,0x6D6D,0x6D6F,0x6D91,
+ 0x6D8D,0x6DEF,0x6D7F,0x6D86,0x6D5E,0x6D67,0x6D60,0x6D97,0x6D70,0x6D7C,
+ 0x6D5F,0x6D82,0x6D98,0x6D2F,0x6D68,0x6D8B,0x6D7E,0x6D80,0x6D84,0x6D16,
+ 0x6D83,0x6D7B,0x6D7D,0x6D75,0x6D90,0x70DC,0x70D3,0x70D1,0x70DD,0x70CB,
+ 0x7F39,0x70E2,0x70D7,0x70D2,0x70DE,0x70E0,0x70D4,0x70CD,0x70C5,0x70C6,
+ 0x70C7,0x70DA,0x70CE,0x70E1,0x7242,0x7278,0x7277,0x7276,0x7300,0x72FA,
+ 0x72F4,0x72FE,0x72F6,0x72F3,0x72FB,0x7301,0x73D3,0x73D9,0x73E5,0x73D6,
+ 0x73BC,0x73E7,0x73E3,0x73E9,0x73DC,0x73D2,0x73DB,0x73D4,0x73DD,0x73DA,
+ 0x73D7,0x73D8,0x73E8,0x74DE,0x74DF,
+ /* plane 2, row 17 */
+ 1 | (94 << 8), /* first, last */
+ 0x74F4,0x74F5,0x7521,0x755B,0x755F,0x75B0,0x75C1,0x75BB,0x75C4,
+ 0x75C0,0x75BF,0x75B6,0x75BA,0x768A,0x76C9,0x771D,0x771B,0x7710,0x7713,
+ 0x7712,0x7723,0x7711,0x7715,0x7719,0x771A,0x7722,0x7727,0x7823,0x782C,
+ 0x7822,0x7835,0x782F,0x7828,0x782E,0x782B,0x7821,0x7829,0x7833,0x782A,
+ 0x7831,0x7954,0x795B,0x794F,0x795C,0x7953,0x7952,0x7951,0x79EB,0x79EC,
+ 0x79E0,0x79EE,0x79ED,0x79EA,0x79DC,0x79DE,0x79DD,0x7A86,0x7A89,0x7A85,
+ 0x7A8B,0x7A8C,0x7A8A,0x7A87,0x7AD8,0x7B10,0x7B04,0x7B13,0x7B05,0x7B0F,
+ 0x7B08,0x7B0A,0x7B0E,0x7B09,0x7B12,0x7C84,0x7C91,0x7C8A,0x7C8C,0x7C88,
+ 0x7C8D,0x7C85,0x7D1E,0x7D1D,0x7D11,0x7D0E,0x7D18,0x7D16,0x7D13,0x7D1F,
+ 0x7D12,0x7D0F,0x7D0C,0x7F5C,0x7F61,
+ /* plane 2, row 18 */
+ 1 | (94 << 8), /* first, last */
+ 0x7F5E,0x7F60,0x7F5D,0x7F5B,0x7F96,0x7F92,0x7FC3,0x7FC2,0x7FC0,
+ 0x8016,0x803E,0x8039,0x80FA,0x80F2,0x80F9,0x80F5,0x8101,0x80FB,0x8100,
+ 0x8201,0x822F,0x8225,0x8333,0x832D,0x8344,0x8319,0x8351,0x8325,0x8356,
+ 0x833F,0x8341,0x8326,0x831C,0x8322,0x8342,0x834E,0x831B,0x832A,0x8308,
+ 0x833C,0x834D,0x8316,0x8324,0x8320,0x8337,0x832F,0x8329,0x8347,0x8345,
+ 0x834C,0x8353,0x831E,0x832C,0x834B,0x8327,0x8348,0x8653,0x8652,0x86A2,
+ 0x86A8,0x8696,0x868D,0x8691,0x869E,0x8687,0x8697,0x8686,0x868B,0x869A,
+ 0x8685,0x86A5,0x8699,0x86A1,0x86A7,0x8695,0x8698,0x868E,0x869D,0x8690,
+ 0x8694,0x8843,0x8844,0x886D,0x8875,0x8876,0x8872,0x8880,0x8871,0x887F,
+ 0x886F,0x8883,0x887E,0x8874,0x887C,
+ /* plane 2, row 19 */
+ 1 | (94 << 8), /* first, last */
+ 0x8A12,0x8C47,0x8C57,0x8C7B,0x8CA4,0x8CA3,0x8D76,0x8D78,0x8DB5,
+ 0x8DB7,0x8DB6,0x8ED1,0x8ED3,0x8FFE,0x8FF5,0x9002,0x8FFF,0x8FFB,0x9004,
+ 0x8FFC,0x8FF6,0x90D6,0x90E0,0x90D9,0x90DA,0x90E3,0x90DF,0x90E5,0x90D8,
+ 0x90DB,0x90D7,0x90DC,0x90E4,0x9150,0x914E,0x914F,0x91D5,0x91E2,0x91DA,
+ 0x965C,0x965F,0x96BC,0x98E3,0x9ADF,0x9B2F,0x4E7F,0x5070,0x506A,0x5061,
+ 0x505E,0x5060,0x5053,0x504B,0x505D,0x5072,0x5048,0x504D,0x5041,0x505B,
+ 0x504A,0x5062,0x5015,0x5045,0x505F,0x5069,0x506B,0x5063,0x5064,0x5046,
+ 0x5040,0x506E,0x5073,0x5057,0x5051,0x51D0,0x526B,0x526D,0x526C,0x526E,
+ 0x52D6,0x52D3,0x532D,0x539C,0x5575,0x5576,0x553C,0x554D,0x5550,0x5534,
+ 0x552A,0x5551,0x5562,0x5536,0x5535,
+ /* plane 2, row 20 */
+ 1 | (94 << 8), /* first, last */
+ 0x5530,0x5552,0x5545,0x550C,0x5532,0x5565,0x554E,0x5539,0x5548,
+ 0x552D,0x553B,0x5540,0x554B,0x570A,0x5707,0x57FB,0x5814,0x57E2,0x57F6,
+ 0x57DC,0x57F4,0x5800,0x57ED,0x57FD,0x5808,0x57F8,0x580B,0x57F3,0x57CF,
+ 0x5807,0x57EE,0x57E3,0x57F2,0x57E5,0x57EC,0x57E1,0x580E,0x57FC,0x5810,
+ 0x57E7,0x5801,0x580C,0x57F1,0x57E9,0x57F0,0x580D,0x5804,0x595C,0x5A60,
+ 0x5A58,0x5A55,0x5A67,0x5A5E,0x5A38,0x5A35,0x5A6D,0x5A50,0x5A5F,0x5A65,
+ 0x5A6C,0x5A53,0x5A64,0x5A57,0x5A43,0x5A5D,0x5A52,0x5A44,0x5A5B,0x5A48,
+ 0x5A8E,0x5A3E,0x5A4D,0x5A39,0x5A4C,0x5A70,0x5A69,0x5A47,0x5A51,0x5A56,
+ 0x5A42,0x5A5C,0x5B72,0x5B6E,0x5BC1,0x5BC0,0x5C59,0x5D1E,0x5D0B,0x5D1D,
+ 0x5D1A,0x5D20,0x5D0C,0x5D28,0x5D0D,
+ /* plane 2, row 21 */
+ 1 | (94 << 8), /* first, last */
+ 0x5D26,0x5D25,0x5D0F,0x5D30,0x5D12,0x5D23,0x5D1F,0x5D2E,0x5E3E,
+ 0x5E34,0x5EB1,0x5EB4,0x5EB9,0x5EB2,0x5EB3,0x5F36,0x5F38,0x5F9B,0x5F96,
+ 0x5F9F,0x608A,0x6090,0x6086,0x60BE,0x60B0,0x60BA,0x60D3,0x60D4,0x60CF,
+ 0x60E4,0x60D9,0x60DD,0x60C8,0x60B1,0x60DB,0x60B7,0x60CA,0x60BF,0x60C3,
+ 0x60CD,0x60C0,0x6332,0x6365,0x638A,0x6382,0x637D,0x63BD,0x639E,0x63AD,
+ 0x639D,0x6397,0x63AB,0x638E,0x636F,0x6387,0x6390,0x636E,0x63AF,0x6375,
+ 0x639C,0x636D,0x63AE,0x637C,0x63A4,0x633B,0x639F,0x6378,0x6385,0x6381,
+ 0x6391,0x638D,0x6370,0x6553,0x65CD,0x6665,0x6661,0x665B,0x6659,0x665C,
+ 0x6662,0x6718,0x6879,0x6887,0x6890,0x689C,0x686D,0x686E,0x68AE,0x68AB,
+ 0x6956,0x686F,0x68A3,0x68AC,0x68A9,
+ /* plane 2, row 22 */
+ 1 | (94 << 8), /* first, last */
+ 0x6875,0x6874,0x68B2,0x688F,0x6877,0x6892,0x687C,0x686B,0x6872,
+ 0x68AA,0x6880,0x6871,0x687E,0x689B,0x6896,0x688B,0x68A0,0x6889,0x68A4,
+ 0x6878,0x687B,0x6891,0x688C,0x688A,0x687D,0x6B36,0x6B33,0x6B37,0x6B38,
+ 0x6B91,0x6B8F,0x6B8D,0x6B8E,0x6B8C,0x6C2A,0x6DC0,0x6DAB,0x6DB4,0x6DB3,
+ 0x6E74,0x6DAC,0x6DE9,0x6DE2,0x6DB7,0x6DF6,0x6DD4,0x6E00,0x6DC8,0x6DE0,
+ 0x6DDF,0x6DD6,0x6DBE,0x6DE5,0x6DDC,0x6DDD,0x6DDB,0x6DF4,0x6DCA,0x6DBD,
+ 0x6DED,0x6DF0,0x6DBA,0x6DD5,0x6DC2,0x6DCF,0x6DC9,0x6DD0,0x6DF2,0x6DD3,
+ 0x6DFD,0x6DD7,0x6DCD,0x6DE3,0x6DBB,0x70FA,0x710D,0x70F7,0x7117,0x70F4,
+ 0x710C,0x70F0,0x7104,0x70F3,0x7110,0x70FC,0x70FF,0x7106,0x7113,0x7100,
+ 0x70F8,0x70F6,0x710B,0x7102,0x710E,
+ /* plane 2, row 23 */
+ 1 | (94 << 8), /* first, last */
+ 0x727E,0x727B,0x727C,0x727F,0x731D,0x7317,0x7307,0x7311,0x7318,
+ 0x730A,0x7308,0x72FF,0x730F,0x731E,0x7388,0x73F6,0x73F8,0x73F5,0x7404,
+ 0x7401,0x73FD,0x7407,0x7400,0x73FA,0x73FC,0x73FF,0x740C,0x740B,0x73F4,
+ 0x7408,0x7564,0x7563,0x75CE,0x75D2,0x75CF,0x75CB,0x75CC,0x75D1,0x75D0,
+ 0x768F,0x7689,0x76D3,0x7739,0x772F,0x772D,0x7731,0x7732,0x7734,0x7733,
+ 0x773D,0x7725,0x773B,0x7735,0x7848,0x7852,0x7849,0x784D,0x784A,0x784C,
+ 0x7826,0x7845,0x7850,0x7964,0x7967,0x7969,0x796A,0x7963,0x796B,0x7961,
+ 0x79BB,0x79FA,0x79F8,0x79F6,0x79F7,0x7A8F,0x7A94,0x7A90,0x7B35,0x7B3B,
+ 0x7B34,0x7B25,0x7B30,0x7B22,0x7B24,0x7B33,0x7B18,0x7B2A,0x7B1D,0x7B31,
+ 0x7B2B,0x7B2D,0x7B2F,0x7B32,0x7B38,
+ /* plane 2, row 24 */
+ 1 | (94 << 8), /* first, last */
+ 0x7B1A,0x7B23,0x7C94,0x7C98,0x7C96,0x7CA3,0x7D35,0x7D3D,0x7D38,
+ 0x7D36,0x7D3A,0x7D45,0x7D2C,0x7D29,0x7D41,0x7D47,0x7D3E,0x7D3F,0x7D4A,
+ 0x7D3B,0x7D28,0x7F63,0x7F95,0x7F9C,0x7F9D,0x7F9B,0x7FCA,0x7FCB,0x7FCD,
+ 0x7FD0,0x7FD1,0x7FC7,0x7FCF,0x7FC9,0x801F,0x801E,0x801B,0x8047,0x8043,
+ 0x8048,0x8118,0x8125,0x8119,0x811B,0x812D,0x811F,0x812C,0x811E,0x8121,
+ 0x8115,0x8127,0x811D,0x8122,0x8211,0x8238,0x8233,0x823A,0x8234,0x8232,
+ 0x8274,0x8390,0x83A3,0x83A8,0x838D,0x837A,0x8373,0x83A4,0x8374,0x838F,
+ 0x8381,0x8395,0x8399,0x8375,0x8394,0x83A9,0x837D,0x8383,0x838C,0x839D,
+ 0x839B,0x83AA,0x838B,0x837E,0x83A5,0x83AF,0x8388,0x8397,0x83B0,0x837F,
+ 0x83A6,0x8387,0x83AE,0x8376,0x8659,
+ /* plane 2, row 25 */
+ 1 | (94 << 8), /* first, last */
+ 0x8656,0x86BF,0x86B7,0x86C2,0x86C1,0x86C5,0x86BA,0x86B0,0x86C8,
+ 0x86B9,0x86B3,0x86B8,0x86CC,0x86B4,0x86BB,0x86BC,0x86C3,0x86BD,0x86BE,
+ 0x8852,0x8889,0x8895,0x88A8,0x88A2,0x88AA,0x889A,0x8891,0x88A1,0x889F,
+ 0x8898,0x88A7,0x8899,0x889B,0x8897,0x88A4,0x88AC,0x888C,0x8893,0x888E,
+ 0x8982,0x89D6,0x89D9,0x89D5,0x8A30,0x8A27,0x8A2C,0x8A1E,0x8C39,0x8C3B,
+ 0x8C5C,0x8C5D,0x8C7D,0x8CA5,0x8D7D,0x8D7B,0x8D79,0x8DBC,0x8DC2,0x8DB9,
+ 0x8DBF,0x8DC1,0x8ED8,0x8EDE,0x8EDD,0x8EDC,0x8ED7,0x8EE0,0x8EE1,0x9024,
+ 0x900B,0x9011,0x901C,0x900C,0x9021,0x90EF,0x90EA,0x90F0,0x90F4,0x90F2,
+ 0x90F3,0x90D4,0x90EB,0x90EC,0x90E9,0x9156,0x9158,0x915A,0x9153,0x9155,
+ 0x91EC,0x91F4,0x91F1,0x91F3,0x91F8,
+ /* plane 2, row 26 */
+ 1 | (94 << 8), /* first, last */
+ 0x91E4,0x91F9,0x91EA,0x91EB,0x91F7,0x91E8,0x91EE,0x957A,0x9586,
+ 0x9588,0x967C,0x966D,0x966B,0x9671,0x966F,0x96BF,0x976A,0x9804,0x98E5,
+ 0x9997,0x509B,0x5095,0x5094,0x509E,0x508B,0x50A3,0x5083,0x508C,0x508E,
+ 0x509D,0x5068,0x509C,0x5092,0x5082,0x5087,0x515F,0x51D4,0x5312,0x5311,
+ 0x53A4,0x53A7,0x5591,0x55A8,0x55A5,0x55AD,0x5577,0x5645,0x55A2,0x5593,
+ 0x5588,0x558F,0x55B5,0x5581,0x55A3,0x5592,0x55A4,0x557D,0x558C,0x55A6,
+ 0x557F,0x5595,0x55A1,0x558E,0x570C,0x5829,0x5837,0x5819,0x581E,0x5827,
+ 0x5823,0x5828,0x57F5,0x5848,0x5825,0x581C,0x581B,0x5833,0x583F,0x5836,
+ 0x582E,0x5839,0x5838,0x582D,0x582C,0x583B,0x5961,0x5AAF,0x5A94,0x5A9F,
+ 0x5A7A,0x5AA2,0x5A9E,0x5A78,0x5AA6,
+ /* plane 2, row 27 */
+ 1 | (94 << 8), /* first, last */
+ 0x5A7C,0x5AA5,0x5AAC,0x5A95,0x5AAE,0x5A37,0x5A84,0x5A8A,0x5A97,
+ 0x5A83,0x5A8B,0x5AA9,0x5A7B,0x5A7D,0x5A8C,0x5A9C,0x5A8F,0x5A93,0x5A9D,
+ 0x5BEA,0x5BCD,0x5BCB,0x5BD4,0x5BD1,0x5BCA,0x5BCE,0x5C0C,0x5C30,0x5D37,
+ 0x5D43,0x5D6B,0x5D41,0x5D4B,0x5D3F,0x5D35,0x5D51,0x5D4E,0x5D55,0x5D33,
+ 0x5D3A,0x5D52,0x5D3D,0x5D31,0x5D59,0x5D42,0x5D39,0x5D49,0x5D38,0x5D3C,
+ 0x5D32,0x5D36,0x5D40,0x5D45,0x5E44,0x5E41,0x5F58,0x5FA6,0x5FA5,0x5FAB,
+ 0x60C9,0x60B9,0x60CC,0x60E2,0x60CE,0x60C4,0x6114,0x60F2,0x610A,0x6116,
+ 0x6105,0x60F5,0x6113,0x60F8,0x60FC,0x60FE,0x60C1,0x6103,0x6118,0x611D,
+ 0x6110,0x60FF,0x6104,0x610B,0x624A,0x6394,0x63B1,0x63B0,0x63CE,0x63E5,
+ 0x63E8,0x63EF,0x63C3,0x649D,0x63F3,
+ /* plane 2, row 28 */
+ 1 | (94 << 8), /* first, last */
+ 0x63CA,0x63E0,0x63F6,0x63D5,0x63F2,0x63F5,0x6461,0x63DF,0x63BE,
+ 0x63DD,0x63DC,0x63C4,0x63D8,0x63D3,0x63C2,0x63C7,0x63CC,0x63CB,0x63C8,
+ 0x63F0,0x63D7,0x63D9,0x6532,0x6567,0x656A,0x6564,0x655C,0x6568,0x6565,
+ 0x658C,0x659D,0x659E,0x65AE,0x65D0,0x65D2,0x667C,0x666C,0x667B,0x6680,
+ 0x6671,0x6679,0x666A,0x6672,0x6701,0x690C,0x68D3,0x6904,0x68DC,0x692A,
+ 0x68EC,0x68EA,0x68F1,0x690F,0x68D6,0x68F7,0x68EB,0x68E4,0x68F6,0x6913,
+ 0x6910,0x68F3,0x68E1,0x6907,0x68CC,0x6908,0x6970,0x68B4,0x6911,0x68EF,
+ 0x68C6,0x6914,0x68F8,0x68D0,0x68FD,0x68FC,0x68E8,0x690B,0x690A,0x6917,
+ 0x68CE,0x68C8,0x68DD,0x68DE,0x68E6,0x68F4,0x68D1,0x6906,0x68D4,0x68E9,
+ 0x6915,0x6925,0x68C7,0x6B39,0x6B3B,
+ /* plane 2, row 29 */
+ 1 | (94 << 8), /* first, last */
+ 0x6B3F,0x6B3C,0x6B94,0x6B97,0x6B99,0x6B95,0x6BBD,0x6BF0,0x6BF2,
+ 0x6BF3,0x6C30,0x6DFC,0x6E46,0x6E47,0x6E1F,0x6E49,0x6E88,0x6E3C,0x6E3D,
+ 0x6E45,0x6E62,0x6E2B,0x6E3F,0x6E41,0x6E5D,0x6E73,0x6E1C,0x6E33,0x6E4B,
+ 0x6E40,0x6E51,0x6E3B,0x6E03,0x6E2E,0x6E5E,0x6E68,0x6E5C,0x6E61,0x6E31,
+ 0x6E28,0x6E60,0x6E71,0x6E6B,0x6E39,0x6E22,0x6E30,0x6E53,0x6E65,0x6E27,
+ 0x6E78,0x6E64,0x6E77,0x6E55,0x6E79,0x6E52,0x6E66,0x6E35,0x6E36,0x6E5A,
+ 0x7120,0x711E,0x712F,0x70FB,0x712E,0x7131,0x7123,0x7125,0x7122,0x7132,
+ 0x711F,0x7128,0x713A,0x711B,0x724B,0x725A,0x7288,0x7289,0x7286,0x7285,
+ 0x728B,0x7312,0x730B,0x7330,0x7322,0x7331,0x7333,0x7327,0x7332,0x732D,
+ 0x7326,0x7323,0x7335,0x730C,0x742E,
+ /* plane 2, row 30 */
+ 1 | (94 << 8), /* first, last */
+ 0x742C,0x7430,0x742B,0x7416,0x741A,0x7421,0x742D,0x7431,0x7424,
+ 0x7423,0x741D,0x7429,0x7420,0x7432,0x74FB,0x752F,0x756F,0x756C,0x75E7,
+ 0x75DA,0x75E1,0x75E6,0x75DD,0x75DF,0x75E4,0x75D7,0x7695,0x7692,0x76DA,
+ 0x7746,0x7747,0x7744,0x774D,0x7745,0x774A,0x774E,0x774B,0x774C,0x77DE,
+ 0x77EC,0x7860,0x7864,0x7865,0x785C,0x786D,0x7871,0x786A,0x786E,0x7870,
+ 0x7869,0x7868,0x785E,0x7862,0x7974,0x7973,0x7972,0x7970,0x7A02,0x7A0A,
+ 0x7A03,0x7A0C,0x7A04,0x7A99,0x7AE6,0x7AE4,0x7B4A,0x7B47,0x7B44,0x7B48,
+ 0x7B4C,0x7B4E,0x7B40,0x7B58,0x7B45,0x7CA2,0x7C9E,0x7CA8,0x7CA1,0x7D58,
+ 0x7D6F,0x7D63,0x7D53,0x7D56,0x7D67,0x7D6A,0x7D4F,0x7D6D,0x7D5C,0x7D6B,
+ 0x7D52,0x7D54,0x7D69,0x7D51,0x7D5F,
+ /* plane 2, row 31 */
+ 1 | (94 << 8), /* first, last */
+ 0x7D4E,0x7F3E,0x7F3F,0x7F65,0x7F66,0x7FA2,0x7FA0,0x7FA1,0x7FD7,
+ 0x8051,0x804F,0x8050,0x80FE,0x80D4,0x8143,0x814A,0x8152,0x814F,0x8147,
+ 0x813D,0x814D,0x813A,0x81E6,0x81EE,0x81F7,0x81F8,0x81F9,0x8204,0x823C,
+ 0x823D,0x823F,0x8275,0x833B,0x83CF,0x83F9,0x8423,0x83C0,0x83E8,0x8412,
+ 0x83E7,0x83E4,0x83FC,0x83F6,0x8410,0x83C6,0x83C8,0x83EB,0x83E3,0x83BF,
+ 0x8401,0x83DD,0x83E5,0x83D8,0x83FF,0x83E1,0x83CB,0x83CE,0x83D6,0x83F5,
+ 0x83C9,0x8409,0x840F,0x83DE,0x8411,0x8406,0x83C2,0x83F3,0x83D5,0x83FA,
+ 0x83C7,0x83D1,0x83EA,0x8413,0x839A,0x83C3,0x83EC,0x83EE,0x83C4,0x83FB,
+ 0x83D7,0x83E2,0x841B,0x83DB,0x83FE,0x86D8,0x86E2,0x86E6,0x86D3,0x86E3,
+ 0x86DA,0x86EA,0x86DD,0x86EB,0x86DC,
+ /* plane 2, row 32 */
+ 1 | (94 << 8), /* first, last */
+ 0x86EC,0x86E9,0x86D7,0x86E8,0x86D1,0x8848,0x8856,0x8855,0x88BA,
+ 0x88D7,0x88B9,0x88B8,0x88C0,0x88BE,0x88B6,0x88BC,0x88B7,0x88BD,0x88B2,
+ 0x8901,0x88C9,0x8995,0x8998,0x8997,0x89DD,0x89DA,0x89DB,0x8A4E,0x8A4D,
+ 0x8A39,0x8A59,0x8A40,0x8A57,0x8A58,0x8A44,0x8A45,0x8A52,0x8A48,0x8A51,
+ 0x8A4A,0x8A4C,0x8A4F,0x8C5F,0x8C81,0x8C80,0x8CBA,0x8CBE,0x8CB0,0x8CB9,
+ 0x8CB5,0x8D84,0x8D80,0x8D89,0x8DD8,0x8DD3,0x8DCD,0x8DC7,0x8DD6,0x8DDC,
+ 0x8DCF,0x8DD5,0x8DD9,0x8DC8,0x8DD7,0x8DC5,0x8EEF,0x8EF7,0x8EFA,0x8EF9,
+ 0x8EE6,0x8EEE,0x8EE5,0x8EF5,0x8EE7,0x8EE8,0x8EF6,0x8EEB,0x8EF1,0x8EEC,
+ 0x8EF4,0x8EE9,0x902D,0x9034,0x902F,0x9106,0x912C,0x9104,0x90FF,0x90FC,
+ 0x9108,0x90F9,0x90FB,0x9101,0x9100,
+ /* plane 2, row 33 */
+ 1 | (94 << 8), /* first, last */
+ 0x9107,0x9105,0x9103,0x9161,0x9164,0x915F,0x9162,0x9160,0x9201,
+ 0x920A,0x9225,0x9203,0x921A,0x9226,0x920F,0x920C,0x9200,0x9212,0x91FF,
+ 0x91FD,0x9206,0x9204,0x9227,0x9202,0x921C,0x9224,0x9219,0x9217,0x9205,
+ 0x9216,0x957B,0x958D,0x958C,0x9590,0x9687,0x967E,0x9688,0x9689,0x9683,
+ 0x9680,0x96C2,0x96C8,0x96C3,0x96F1,0x96F0,0x976C,0x9770,0x976E,0x9807,
+ 0x98A9,0x98EB,0x9CE6,0x9EF9,0x4E83,0x4E84,0x4EB6,0x50BD,0x50BF,0x50C6,
+ 0x50AE,0x50C4,0x50CA,0x50B4,0x50C8,0x50C2,0x50B0,0x50C1,0x50BA,0x50B1,
+ 0x50CB,0x50C9,0x50B6,0x50B8,0x51D7,0x527A,0x5278,0x527B,0x527C,0x55C3,
+ 0x55DB,0x55CC,0x55D0,0x55CB,0x55CA,0x55DD,0x55C0,0x55D4,0x55C4,0x55E9,
+ 0x55BF,0x55D2,0x558D,0x55CF,0x55D5,
+ /* plane 2, row 34 */
+ 1 | (94 << 8), /* first, last */
+ 0x55E2,0x55D6,0x55C8,0x55F2,0x55CD,0x55D9,0x55C2,0x5714,0x5853,
+ 0x5868,0x5864,0x584F,0x584D,0x5849,0x586F,0x5855,0x584E,0x585D,0x5859,
+ 0x5865,0x585B,0x583D,0x5863,0x5871,0x58FC,0x5AC7,0x5AC4,0x5ACB,0x5ABA,
+ 0x5AB8,0x5AB1,0x5AB5,0x5AB0,0x5ABF,0x5AC8,0x5ABB,0x5AC6,0x5AB7,0x5AC0,
+ 0x5ACA,0x5AB4,0x5AB6,0x5ACD,0x5AB9,0x5A90,0x5BD6,0x5BD8,0x5BD9,0x5C1F,
+ 0x5C33,0x5D71,0x5D63,0x5D4A,0x5D65,0x5D72,0x5D6C,0x5D5E,0x5D68,0x5D67,
+ 0x5D62,0x5DF0,0x5E4F,0x5E4E,0x5E4A,0x5E4D,0x5E4B,0x5EC5,0x5ECC,0x5EC6,
+ 0x5ECB,0x5EC7,0x5F40,0x5FAF,0x5FAD,0x60F7,0x6149,0x614A,0x612B,0x6145,
+ 0x6136,0x6132,0x612E,0x6146,0x612F,0x614F,0x6129,0x6140,0x6220,0x9168,
+ 0x6223,0x6225,0x6224,0x63C5,0x63F1,
+ /* plane 2, row 35 */
+ 1 | (94 << 8), /* first, last */
+ 0x63EB,0x6410,0x6412,0x6409,0x6420,0x6424,0x6433,0x6443,0x641F,
+ 0x6415,0x6418,0x6439,0x6437,0x6422,0x6423,0x640C,0x6426,0x6430,0x6428,
+ 0x6441,0x6435,0x642F,0x640A,0x641A,0x6440,0x6425,0x6427,0x640B,0x63E7,
+ 0x641B,0x642E,0x6421,0x640E,0x656F,0x6592,0x65D3,0x6686,0x668C,0x6695,
+ 0x6690,0x668B,0x668A,0x6699,0x6694,0x6678,0x6720,0x6966,0x695F,0x6938,
+ 0x694E,0x6962,0x6971,0x693F,0x6945,0x696A,0x6939,0x6942,0x6957,0x6959,
+ 0x697A,0x6948,0x6949,0x6935,0x696C,0x6933,0x693D,0x6965,0x68F0,0x6978,
+ 0x6934,0x6969,0x6940,0x696F,0x6944,0x6976,0x6958,0x6941,0x6974,0x694C,
+ 0x693B,0x694B,0x6937,0x695C,0x694F,0x6951,0x6932,0x6952,0x692F,0x697B,
+ 0x693C,0x6B46,0x6B45,0x6B43,0x6B42,
+ /* plane 2, row 36 */
+ 1 | (94 << 8), /* first, last */
+ 0x6B48,0x6B41,0x6B9B,0x6BFB,0x6BFC,0x6BF9,0x6BF7,0x6BF8,0x6E9B,
+ 0x6ED6,0x6EC8,0x6E8F,0x6EC0,0x6E9F,0x6E93,0x6E94,0x6EA0,0x6EB1,0x6EB9,
+ 0x6EC6,0x6ED2,0x6EBD,0x6EC1,0x6E9E,0x6EC9,0x6EB7,0x6EB0,0x6ECD,0x6EA6,
+ 0x6ECF,0x6EB2,0x6EBE,0x6EC3,0x6EDC,0x6ED8,0x6E99,0x6E92,0x6E8E,0x6E8D,
+ 0x6EA4,0x6EA1,0x6EBF,0x6EB3,0x6ED0,0x6ECA,0x6E97,0x6EAE,0x6EA3,0x7147,
+ 0x7154,0x7152,0x7163,0x7160,0x7141,0x715D,0x7162,0x7172,0x7178,0x716A,
+ 0x7161,0x7142,0x7158,0x7143,0x714B,0x7170,0x715F,0x7150,0x7153,0x7144,
+ 0x714D,0x715A,0x724F,0x728D,0x728C,0x7291,0x7290,0x728E,0x733C,0x7342,
+ 0x733B,0x733A,0x7340,0x734A,0x7349,0x7444,0x744A,0x744B,0x7452,0x7451,
+ 0x7457,0x7440,0x744F,0x7450,0x744E,
+ /* plane 2, row 37 */
+ 1 | (94 << 8), /* first, last */
+ 0x7442,0x7446,0x744D,0x7454,0x74E1,0x74FF,0x74FE,0x74FD,0x751D,
+ 0x7579,0x7577,0x6983,0x75EF,0x760F,0x7603,0x75F7,0x75FE,0x75FC,0x75F9,
+ 0x75F8,0x7610,0x75FB,0x75F6,0x75ED,0x75F5,0x75FD,0x7699,0x76B5,0x76DD,
+ 0x7755,0x775F,0x7760,0x7752,0x7756,0x775A,0x7769,0x7767,0x7754,0x7759,
+ 0x776D,0x77E0,0x7887,0x789A,0x7894,0x788F,0x7884,0x7895,0x7885,0x7886,
+ 0x78A1,0x7883,0x7879,0x7899,0x7880,0x7896,0x787B,0x797C,0x7982,0x797D,
+ 0x7979,0x7A11,0x7A18,0x7A19,0x7A12,0x7A17,0x7A15,0x7A22,0x7A13,0x7A1B,
+ 0x7A10,0x7AA3,0x7AA2,0x7A9E,0x7AEB,0x7B66,0x7B64,0x7B6D,0x7B74,0x7B69,
+ 0x7B72,0x7B65,0x7B73,0x7B71,0x7B70,0x7B61,0x7B78,0x7B76,0x7B63,0x7CB2,
+ 0x7CB4,0x7CAF,0x7D88,0x7D86,0x7D80,
+ /* plane 2, row 38 */
+ 1 | (94 << 8), /* first, last */
+ 0x7D8D,0x7D7F,0x7D85,0x7D7A,0x7D8E,0x7D7B,0x7D83,0x7D7C,0x7D8C,
+ 0x7D94,0x7D84,0x7D7D,0x7D92,0x7F6D,0x7F6B,0x7F67,0x7F68,0x7F6C,0x7FA6,
+ 0x7FA5,0x7FA7,0x7FDB,0x7FDC,0x8021,0x8164,0x8160,0x8177,0x815C,0x8169,
+ 0x815B,0x8162,0x8172,0x6721,0x815E,0x8176,0x8167,0x816F,0x8144,0x8161,
+ 0x821D,0x8249,0x8244,0x8240,0x8242,0x8245,0x84F1,0x843F,0x8456,0x8476,
+ 0x8479,0x848F,0x848D,0x8465,0x8451,0x8440,0x8486,0x8467,0x8430,0x844D,
+ 0x847D,0x845A,0x8459,0x8474,0x8473,0x845D,0x8507,0x845E,0x8437,0x843A,
+ 0x8434,0x847A,0x8443,0x8478,0x8432,0x8445,0x8429,0x83D9,0x844B,0x842F,
+ 0x8442,0x842D,0x845F,0x8470,0x8439,0x844E,0x844C,0x8452,0x846F,0x84C5,
+ 0x848E,0x843B,0x8447,0x8436,0x8433,
+ /* plane 2, row 39 */
+ 1 | (94 << 8), /* first, last */
+ 0x8468,0x847E,0x8444,0x842B,0x8460,0x8454,0x846E,0x8450,0x870B,
+ 0x8704,0x86F7,0x870C,0x86FA,0x86D6,0x86F5,0x874D,0x86F8,0x870E,0x8709,
+ 0x8701,0x86F6,0x870D,0x8705,0x88D6,0x88CB,0x88CD,0x88CE,0x88DE,0x88DB,
+ 0x88DA,0x88CC,0x88D0,0x8985,0x899B,0x89DF,0x89E5,0x89E4,0x89E1,0x89E0,
+ 0x89E2,0x89DC,0x89E6,0x8A76,0x8A86,0x8A7F,0x8A61,0x8A3F,0x8A77,0x8A82,
+ 0x8A84,0x8A75,0x8A83,0x8A81,0x8A74,0x8A7A,0x8C3C,0x8C4B,0x8C4A,0x8C65,
+ 0x8C64,0x8C66,0x8C86,0x8C84,0x8C85,0x8CCC,0x8D68,0x8D69,0x8D91,0x8D8C,
+ 0x8D8E,0x8D8F,0x8D8D,0x8D93,0x8D94,0x8D90,0x8D92,0x8DF0,0x8DE0,0x8DEC,
+ 0x8DF1,0x8DEE,0x8DD0,0x8DE9,0x8DE3,0x8DE2,0x8DE7,0x8DF2,0x8DEB,0x8DF4,
+ 0x8F06,0x8EFF,0x8F01,0x8F00,0x8F05,
+ /* plane 2, row 40 */
+ 1 | (94 << 8), /* first, last */
+ 0x8F07,0x8F08,0x8F02,0x8F0B,0x9052,0x903F,0x9044,0x9049,0x903D,
+ 0x9110,0x910D,0x910F,0x9111,0x9116,0x9114,0x910B,0x910E,0x916E,0x916F,
+ 0x9248,0x9252,0x9230,0x923A,0x9266,0x9233,0x9265,0x925E,0x9283,0x922E,
+ 0x924A,0x9246,0x926D,0x926C,0x924F,0x9260,0x9267,0x926F,0x9236,0x9261,
+ 0x9270,0x9231,0x9254,0x9263,0x9250,0x9272,0x924E,0x9253,0x924C,0x9256,
+ 0x9232,0x959F,0x959C,0x959E,0x959B,0x9692,0x9693,0x9691,0x9697,0x96CE,
+ 0x96FA,0x96FD,0x96F8,0x96F5,0x9773,0x9777,0x9778,0x9772,0x980F,0x980D,
+ 0x980E,0x98AC,0x98F6,0x98F9,0x99AF,0x99B2,0x99B0,0x99B5,0x9AAD,0x9AAB,
+ 0x9B5B,0x9CEA,0x9CED,0x9CE7,0x9E80,0x9EFD,0x50E6,0x50D4,0x50D7,0x50E8,
+ 0x50F3,0x50DB,0x50EA,0x50DD,0x50E4,
+ /* plane 2, row 41 */
+ 1 | (94 << 8), /* first, last */
+ 0x50D3,0x50EC,0x50F0,0x50EF,0x50E3,0x50E0,0x51D8,0x5280,0x5281,
+ 0x52E9,0x52EB,0x5330,0x53AC,0x5627,0x5615,0x560C,0x5612,0x55FC,0x560F,
+ 0x561C,0x5601,0x5613,0x5602,0x55FA,0x561D,0x5604,0x55FF,0x55F9,0x5889,
+ 0x587C,0x5890,0x5898,0x5886,0x5881,0x587F,0x5874,0x588B,0x587A,0x5887,
+ 0x5891,0x588E,0x5876,0x5882,0x5888,0x587B,0x5894,0x588F,0x58FE,0x596B,
+ 0x5ADC,0x5AEE,0x5AE5,0x5AD5,0x5AEA,0x5ADA,0x5AED,0x5AEB,0x5AF3,0x5AE2,
+ 0x5AE0,0x5ADB,0x5AEC,0x5ADE,0x5ADD,0x5AD9,0x5AE8,0x5ADF,0x5B77,0x5BE0,
+ 0x5BE3,0x5C63,0x5D82,0x5D80,0x5D7D,0x5D86,0x5D7A,0x5D81,0x5D77,0x5D8A,
+ 0x5D89,0x5D88,0x5D7E,0x5D7C,0x5D8D,0x5D79,0x5D7F,0x5E58,0x5E59,0x5E53,
+ 0x5ED8,0x5ED1,0x5ED7,0x5ECE,0x5EDC,
+ /* plane 2, row 42 */
+ 1 | (94 << 8), /* first, last */
+ 0x5ED5,0x5ED9,0x5ED2,0x5ED4,0x5F44,0x5F43,0x5F6F,0x5FB6,0x612C,
+ 0x6128,0x6141,0x615E,0x6171,0x6173,0x6152,0x6153,0x6172,0x616C,0x6180,
+ 0x6174,0x6154,0x617A,0x615B,0x6165,0x613B,0x616A,0x6161,0x6156,0x6229,
+ 0x6227,0x622B,0x642B,0x644D,0x645B,0x645D,0x6474,0x6476,0x6472,0x6473,
+ 0x647D,0x6475,0x6466,0x64A6,0x644E,0x6482,0x645E,0x645C,0x644B,0x6453,
+ 0x6460,0x6450,0x647F,0x643F,0x646C,0x646B,0x6459,0x6465,0x6477,0x6573,
+ 0x65A0,0x66A1,0x66A0,0x669F,0x6705,0x6704,0x6722,0x69B1,0x69B6,0x69C9,
+ 0x69A0,0x69CE,0x6996,0x69B0,0x69AC,0x69BC,0x6991,0x6999,0x698E,0x69A7,
+ 0x698D,0x69A9,0x69BE,0x69AF,0x69BF,0x69C4,0x69BD,0x69A4,0x69D4,0x69B9,
+ 0x69CA,0x699A,0x69CF,0x69B3,0x6993,
+ /* plane 2, row 43 */
+ 1 | (94 << 8), /* first, last */
+ 0x69AA,0x69A1,0x699E,0x69D9,0x6997,0x6990,0x69C2,0x69B5,0x69A5,
+ 0x69C6,0x6B4A,0x6B4D,0x6B4B,0x6B9E,0x6B9F,0x6BA0,0x6BC3,0x6BC4,0x6BFE,
+ 0x6ECE,0x6EF5,0x6EF1,0x6F03,0x6F25,0x6EF8,0x6F37,0x6EFB,0x6F2E,0x6F09,
+ 0x6F4E,0x6F19,0x6F1A,0x6F27,0x6F18,0x6F3B,0x6F12,0x6EED,0x6F0A,0x6F36,
+ 0x6F73,0x6EF9,0x6EEE,0x6F2D,0x6F40,0x6F30,0x6F3C,0x6F35,0x6EEB,0x6F07,
+ 0x6F0E,0x6F43,0x6F05,0x6EFD,0x6EF6,0x6F39,0x6F1C,0x6EFC,0x6F3A,0x6F1F,
+ 0x6F0D,0x6F1E,0x6F08,0x6F21,0x7187,0x7190,0x7189,0x7180,0x7185,0x7182,
+ 0x718F,0x717B,0x7186,0x7181,0x7197,0x7244,0x7253,0x7297,0x7295,0x7293,
+ 0x7343,0x734D,0x7351,0x734C,0x7462,0x7473,0x7471,0x7475,0x7472,0x7467,
+ 0x746E,0x7500,0x7502,0x7503,0x757D,
+ /* plane 2, row 44 */
+ 1 | (94 << 8), /* first, last */
+ 0x7590,0x7616,0x7608,0x760C,0x7615,0x7611,0x760A,0x7614,0x76B8,
+ 0x7781,0x777C,0x7785,0x7782,0x776E,0x7780,0x776F,0x777E,0x7783,0x78B2,
+ 0x78AA,0x78B4,0x78AD,0x78A8,0x787E,0x78AB,0x789E,0x78A5,0x78A0,0x78AC,
+ 0x78A2,0x78A4,0x7998,0x798A,0x798B,0x7996,0x7995,0x7994,0x7993,0x7997,
+ 0x7988,0x7992,0x7990,0x7A2B,0x7A4A,0x7A30,0x7A2F,0x7A28,0x7A26,0x7AA8,
+ 0x7AAB,0x7AAC,0x7AEE,0x7B88,0x7B9C,0x7B8A,0x7B91,0x7B90,0x7B96,0x7B8D,
+ 0x7B8C,0x7B9B,0x7B8E,0x7B85,0x7B98,0x5284,0x7B99,0x7BA4,0x7B82,0x7CBB,
+ 0x7CBF,0x7CBC,0x7CBA,0x7DA7,0x7DB7,0x7DC2,0x7DA3,0x7DAA,0x7DC1,0x7DC0,
+ 0x7DC5,0x7D9D,0x7DCE,0x7DC4,0x7DC6,0x7DCB,0x7DCC,0x7DAF,0x7DB9,0x7D96,
+ 0x7DBC,0x7D9F,0x7DA6,0x7DAE,0x7DA9,
+ /* plane 2, row 45 */
+ 1 | (94 << 8), /* first, last */
+ 0x7DA1,0x7DC9,0x7F73,0x7FE2,0x7FE3,0x7FE5,0x7FDE,0x8024,0x805D,
+ 0x805C,0x8189,0x8186,0x8183,0x8187,0x818D,0x818C,0x818B,0x8215,0x8497,
+ 0x84A4,0x84A1,0x849F,0x84BA,0x84CE,0x84C2,0x84AC,0x84AE,0x84AB,0x84B9,
+ 0x84B4,0x84C1,0x84CD,0x84AA,0x849A,0x84B1,0x84D0,0x849D,0x84A7,0x84BB,
+ 0x84A2,0x8494,0x84C7,0x84CC,0x849B,0x84A9,0x84AF,0x84A8,0x84D6,0x8498,
+ 0x84B6,0x84CF,0x84A0,0x84D7,0x84D4,0x84D2,0x84DB,0x84B0,0x8491,0x8661,
+ 0x8733,0x8723,0x8728,0x876B,0x8740,0x872E,0x871E,0x8721,0x8719,0x871B,
+ 0x8743,0x872C,0x8741,0x873E,0x8746,0x8720,0x8732,0x872A,0x872D,0x873C,
+ 0x8712,0x873A,0x8731,0x8735,0x8742,0x8726,0x8727,0x8738,0x8724,0x871A,
+ 0x8730,0x8711,0x88F7,0x88E7,0x88F1,
+ /* plane 2, row 46 */
+ 1 | (94 << 8), /* first, last */
+ 0x88F2,0x88FA,0x88FE,0x88EE,0x88FC,0x88F6,0x88FB,0x88F0,0x88EC,
+ 0x88EB,0x899D,0x89A1,0x899F,0x899E,0x89E9,0x89EB,0x89E8,0x8AAB,0x8A99,
+ 0x8A8B,0x8A92,0x8A8F,0x8A96,0x8C3D,0x8C68,0x8C69,0x8CD5,0x8CCF,0x8CD7,
+ 0x8D96,0x8E09,0x8E02,0x8DFF,0x8E0D,0x8DFD,0x8E0A,0x8E03,0x8E07,0x8E06,
+ 0x8E05,0x8DFE,0x8E00,0x8E04,0x8F10,0x8F11,0x8F0E,0x8F0D,0x9123,0x911C,
+ 0x9120,0x9122,0x911F,0x911D,0x911A,0x9124,0x9121,0x911B,0x917A,0x9172,
+ 0x9179,0x9173,0x92A5,0x92A4,0x9276,0x929B,0x927A,0x92A0,0x9294,0x92AA,
+ 0x928D,0x92A6,0x929A,0x92AB,0x9279,0x9297,0x927F,0x92A3,0x92EE,0x928E,
+ 0x9282,0x9295,0x92A2,0x927D,0x9288,0x92A1,0x928A,0x9286,0x928C,0x9299,
+ 0x92A7,0x927E,0x9287,0x92A9,0x929D,
+ /* plane 2, row 47 */
+ 1 | (94 << 8), /* first, last */
+ 0x928B,0x922D,0x969E,0x96A1,0x96FF,0x9758,0x977D,0x977A,0x977E,
+ 0x9783,0x9780,0x9782,0x977B,0x9784,0x9781,0x977F,0x97CE,0x97CD,0x9816,
+ 0x98AD,0x98AE,0x9902,0x9900,0x9907,0x999D,0x999C,0x99C3,0x99B9,0x99BB,
+ 0x99BA,0x99C2,0x99BD,0x99C7,0x9AB1,0x9AE3,0x9AE7,0x9B3E,0x9B3F,0x9B60,
+ 0x9B61,0x9B5F,0x9CF1,0x9CF2,0x9CF5,0x9EA7,0x50FF,0x5103,0x5130,0x50F8,
+ 0x5106,0x5107,0x50F6,0x50FE,0x510B,0x510C,0x50FD,0x510A,0x528B,0x528C,
+ 0x52F1,0x52EF,0x5648,0x5642,0x564C,0x5635,0x5641,0x564A,0x5649,0x5646,
+ 0x5658,0x565A,0x5640,0x5633,0x563D,0x562C,0x563E,0x5638,0x562A,0x563A,
+ 0x571A,0x58AB,0x589D,0x58B1,0x58A0,0x58A3,0x58AF,0x58AC,0x58A5,0x58A1,
+ 0x58FF,0x5AFF,0x5AF4,0x5AFD,0x5AF7,
+ /* plane 2, row 48 */
+ 1 | (94 << 8), /* first, last */
+ 0x5AF6,0x5B03,0x5AF8,0x5B02,0x5AF9,0x5B01,0x5B07,0x5B05,0x5B0F,
+ 0x5C67,0x5D99,0x5D97,0x5D9F,0x5D92,0x5DA2,0x5D93,0x5D95,0x5DA0,0x5D9C,
+ 0x5DA1,0x5D9A,0x5D9E,0x5E69,0x5E5D,0x5E60,0x5E5C,0x7DF3,0x5EDB,0x5EDE,
+ 0x5EE1,0x5F49,0x5FB2,0x618B,0x6183,0x6179,0x61B1,0x61B0,0x61A2,0x6189,
+ 0x619B,0x6193,0x61AF,0x61AD,0x619F,0x6192,0x61AA,0x61A1,0x618D,0x6166,
+ 0x61B3,0x622D,0x646E,0x6470,0x6496,0x64A0,0x6485,0x6497,0x649C,0x648F,
+ 0x648B,0x648A,0x648C,0x64A3,0x649F,0x6468,0x64B1,0x6498,0x6576,0x657A,
+ 0x6579,0x657B,0x65B2,0x65B3,0x66B5,0x66B0,0x66A9,0x66B2,0x66B7,0x66AA,
+ 0x66AF,0x6A00,0x6A06,0x6A17,0x69E5,0x69F8,0x6A15,0x69F1,0x69E4,0x6A20,
+ 0x69FF,0x69EC,0x69E2,0x6A1B,0x6A1D,
+ /* plane 2, row 49 */
+ 1 | (94 << 8), /* first, last */
+ 0x69FE,0x6A27,0x69F2,0x69EE,0x6A14,0x69F7,0x69E7,0x6A40,0x6A08,
+ 0x69E6,0x69FB,0x6A0D,0x69FC,0x69EB,0x6A09,0x6A04,0x6A18,0x6A25,0x6A0F,
+ 0x69F6,0x6A26,0x6A07,0x69F4,0x6A16,0x6B51,0x6BA5,0x6BA3,0x6BA2,0x6BA6,
+ 0x6C01,0x6C00,0x6BFF,0x6C02,0x6F41,0x6F26,0x6F7E,0x6F87,0x6FC6,0x6F92,
+ 0x6F8D,0x6F89,0x6F8C,0x6F62,0x6F4F,0x6F85,0x6F5A,0x6F96,0x6F76,0x6F6C,
+ 0x6F82,0x6F55,0x6F72,0x6F52,0x6F50,0x6F57,0x6F94,0x6F93,0x6F5D,0x6F00,
+ 0x6F61,0x6F6B,0x6F7D,0x6F67,0x6F90,0x6F53,0x6F8B,0x6F69,0x6F7F,0x6F95,
+ 0x6F63,0x6F77,0x6F6A,0x6F7B,0x71B2,0x71AF,0x719B,0x71B0,0x71A0,0x719A,
+ 0x71A9,0x71B5,0x719D,0x71A5,0x719E,0x71A4,0x71A1,0x71AA,0x719C,0x71A7,
+ 0x71B3,0x7298,0x729A,0x7358,0x7352,
+ /* plane 2, row 50 */
+ 1 | (94 << 8), /* first, last */
+ 0x735E,0x735F,0x7360,0x735D,0x735B,0x7361,0x735A,0x7359,0x7362,
+ 0x7487,0x7489,0x748A,0x7486,0x7481,0x747D,0x7485,0x7488,0x747C,0x7479,
+ 0x7508,0x7507,0x757E,0x7625,0x761E,0x7619,0x761D,0x761C,0x7623,0x761A,
+ 0x7628,0x761B,0x769C,0x769D,0x769E,0x769B,0x778D,0x778F,0x7789,0x7788,
+ 0x78CD,0x78BB,0x78CF,0x78CC,0x78D1,0x78CE,0x78D4,0x78C8,0x78C3,0x78C4,
+ 0x78C9,0x799A,0x79A1,0x79A0,0x799C,0x79A2,0x799B,0x6B76,0x7A39,0x7AB2,
+ 0x7AB4,0x7AB3,0x7BB7,0x7BCB,0x7BBE,0x7BAC,0x7BCE,0x7BAF,0x7BB9,0x7BCA,
+ 0x7BB5,0x7CC5,0x7CC8,0x7CCC,0x7CCB,0x7DF7,0x7DDB,0x7DEA,0x7DE7,0x7DD7,
+ 0x7DE1,0x7E03,0x7DFA,0x7DE6,0x7DF6,0x7DF1,0x7DF0,0x7DEE,0x7DDF,0x7F76,
+ 0x7FAC,0x7FB0,0x7FAD,0x7FED,0x7FEB,
+ /* plane 2, row 51 */
+ 1 | (94 << 8), /* first, last */
+ 0x7FEA,0x7FEC,0x7FE6,0x7FE8,0x8064,0x8067,0x81A3,0x819F,0x819E,
+ 0x8195,0x81A2,0x8199,0x8197,0x8216,0x824F,0x8253,0x8252,0x8250,0x824E,
+ 0x8251,0x8524,0x853B,0x850F,0x8500,0x8529,0x850E,0x8509,0x850D,0x851F,
+ 0x850A,0x8527,0x851C,0x84FB,0x852B,0x84FA,0x8508,0x850C,0x84F4,0x852A,
+ 0x84F2,0x8515,0x84F7,0x84EB,0x84F3,0x84FC,0x8512,0x84EA,0x84E9,0x8516,
+ 0x84FE,0x8528,0x851D,0x852E,0x8502,0x84FD,0x851E,0x84F6,0x8531,0x8526,
+ 0x84E7,0x84E8,0x84F0,0x84EF,0x84F9,0x8518,0x8520,0x8530,0x850B,0x8519,
+ 0x852F,0x8662,0x8756,0x8763,0x8764,0x8777,0x87E1,0x8773,0x8758,0x8754,
+ 0x875B,0x8752,0x8761,0x875A,0x8751,0x875E,0x876D,0x876A,0x8750,0x874E,
+ 0x875F,0x875D,0x876F,0x876C,0x877A,
+ /* plane 2, row 52 */
+ 1 | (94 << 8), /* first, last */
+ 0x876E,0x875C,0x8765,0x874F,0x877B,0x8775,0x8762,0x8767,0x8769,
+ 0x885A,0x8905,0x890C,0x8914,0x890B,0x8917,0x8918,0x8919,0x8906,0x8916,
+ 0x8911,0x890E,0x8909,0x89A2,0x89A4,0x89A3,0x89ED,0x89F0,0x89EC,0x8ACF,
+ 0x8AC6,0x8AB8,0x8AD3,0x8AD1,0x8AD4,0x8AD5,0x8ABB,0x8AD7,0x8ABE,0x8AC0,
+ 0x8AC5,0x8AD8,0x8AC3,0x8ABA,0x8ABD,0x8AD9,0x8C3E,0x8C4D,0x8C8F,0x8CE5,
+ 0x8CDF,0x8CD9,0x8CE8,0x8CDA,0x8CDD,0x8CE7,0x8DA0,0x8D9C,0x8DA1,0x8D9B,
+ 0x8E20,0x8E23,0x8E25,0x8E24,0x8E2E,0x8E15,0x8E1B,0x8E16,0x8E11,0x8E19,
+ 0x8E26,0x8E27,0x8E14,0x8E12,0x8E18,0x8E13,0x8E1C,0x8E17,0x8E1A,0x8F2C,
+ 0x8F24,0x8F18,0x8F1A,0x8F20,0x8F23,0x8F16,0x8F17,0x9073,0x9070,0x906F,
+ 0x9067,0x906B,0x912F,0x912B,0x9129,
+ /* plane 2, row 53 */
+ 1 | (94 << 8), /* first, last */
+ 0x912A,0x9132,0x9126,0x912E,0x9185,0x9186,0x918A,0x9181,0x9182,
+ 0x9184,0x9180,0x92D0,0x92C3,0x92C4,0x92C0,0x92D9,0x92B6,0x92CF,0x92F1,
+ 0x92DF,0x92D8,0x92E9,0x92D7,0x92DD,0x92CC,0x92EF,0x92C2,0x92E8,0x92CA,
+ 0x92C8,0x92CE,0x92E6,0x92CD,0x92D5,0x92C9,0x92E0,0x92DE,0x92E7,0x92D1,
+ 0x92D3,0x92B5,0x92E1,0x9325,0x92C6,0x92B4,0x957C,0x95AC,0x95AB,0x95AE,
+ 0x95B0,0x96A4,0x96A2,0x96D3,0x9705,0x9708,0x9702,0x975A,0x978A,0x978E,
+ 0x9788,0x97D0,0x97CF,0x981E,0x981D,0x9826,0x9829,0x9828,0x9820,0x981B,
+ 0x9827,0x98B2,0x9908,0x98FA,0x9911,0x9914,0x9916,0x9917,0x9915,0x99DC,
+ 0x99CD,0x99CF,0x99D3,0x99D4,0x99CE,0x99C9,0x99D6,0x99D8,0x99CB,0x99D7,
+ 0x99CC,0x9AB3,0x9AEC,0x9AEB,0x9AF3,
+ /* plane 2, row 54 */
+ 1 | (94 << 8), /* first, last */
+ 0x9AF2,0x9AF1,0x9B46,0x9B43,0x9B67,0x9B74,0x9B71,0x9B66,0x9B76,
+ 0x9B75,0x9B70,0x9B68,0x9B64,0x9B6C,0x9CFC,0x9CFA,0x9CFD,0x9CFF,0x9CF7,
+ 0x9D07,0x9D00,0x9CF9,0x9CFB,0x9D08,0x9D05,0x9D04,0x9E83,0x9ED3,0x9F0F,
+ 0x9F10,0x511C,0x5113,0x5117,0x511A,0x5111,0x51DE,0x5334,0x53E1,0x5670,
+ 0x5660,0x566E,0x5673,0x5666,0x5663,0x566D,0x5672,0x565E,0x5677,0x571C,
+ 0x571B,0x58C8,0x58BD,0x58C9,0x58BF,0x58BA,0x58C2,0x58BC,0x58C6,0x5B17,
+ 0x5B19,0x5B1B,0x5B21,0x5B14,0x5B13,0x5B10,0x5B16,0x5B28,0x5B1A,0x5B20,
+ 0x5B1E,0x5BEF,0x5DAC,0x5DB1,0x5DA9,0x5DA7,0x5DB5,0x5DB0,0x5DAE,0x5DAA,
+ 0x5DA8,0x5DB2,0x5DAD,0x5DAF,0x5DB4,0x5E67,0x5E68,0x5E66,0x5E6F,0x5EE9,
+ 0x5EE7,0x5EE6,0x5EE8,0x5EE5,0x5F4B,
+ /* plane 2, row 55 */
+ 1 | (94 << 8), /* first, last */
+ 0x5FBC,0x5FBB,0x619D,0x61A8,0x6196,0x61C5,0x61B4,0x61C6,0x61C1,
+ 0x61CC,0x61BA,0x61BF,0x61B8,0x618C,0x64D7,0x64D6,0x64D0,0x64CF,0x64C9,
+ 0x64BD,0x6489,0x64C3,0x64DB,0x64F3,0x64D9,0x6533,0x657F,0x657C,0x65A2,
+ 0x66C8,0x66BE,0x66C0,0x66CA,0x66CB,0x66CF,0x66BD,0x66BB,0x66BA,0x66CC,
+ 0x6723,0x6A34,0x6A66,0x6A49,0x6A67,0x6A32,0x6A68,0x6A3E,0x6A5D,0x6A6D,
+ 0x6A76,0x6A5B,0x6A51,0x6A28,0x6A5A,0x6A3B,0x6A3F,0x6A41,0x6A6A,0x6A64,
+ 0x6A50,0x6A4F,0x6A54,0x6A6F,0x6A69,0x6A60,0x6A3C,0x6A5E,0x6A56,0x6A55,
+ 0x6A4D,0x6A4E,0x6A46,0x6B55,0x6B54,0x6B56,0x6BA7,0x6BAA,0x6BAB,0x6BC8,
+ 0x6BC7,0x6C04,0x6C03,0x6C06,0x6FAD,0x6FCB,0x6FA3,0x6FC7,0x6FBC,0x6FCE,
+ 0x6FC8,0x6F5E,0x6FC4,0x6FBD,0x6F9E,
+ /* plane 2, row 56 */
+ 1 | (94 << 8), /* first, last */
+ 0x6FCA,0x6FA8,0x7004,0x6FA5,0x6FAE,0x6FBA,0x6FAC,0x6FAA,0x6FCF,
+ 0x6FBF,0x6FB8,0x6FA2,0x6FC9,0x6FAB,0x6FCD,0x6FAF,0x6FB2,0x6FB0,0x71C5,
+ 0x71C2,0x71BF,0x71B8,0x71D6,0x71C0,0x71C1,0x71CB,0x71D4,0x71CA,0x71C7,
+ 0x71CF,0x71BD,0x71D8,0x71BC,0x71C6,0x71DA,0x71DB,0x729D,0x729E,0x7369,
+ 0x7366,0x7367,0x736C,0x7365,0x736B,0x736A,0x747F,0x749A,0x74A0,0x7494,
+ 0x7492,0x7495,0x74A1,0x750B,0x7580,0x762F,0x762D,0x7631,0x763D,0x7633,
+ 0x763C,0x7635,0x7632,0x7630,0x76BB,0x76E6,0x779A,0x779D,0x77A1,0x779C,
+ 0x779B,0x77A2,0x77A3,0x7795,0x7799,0x7797,0x78DD,0x78E9,0x78E5,0x78EA,
+ 0x78DE,0x78E3,0x78DB,0x78E1,0x78E2,0x78ED,0x78DF,0x78E0,0x79A4,0x7A44,
+ 0x7A48,0x7A47,0x7AB6,0x7AB8,0x7AB5,
+ /* plane 2, row 57 */
+ 1 | (94 << 8), /* first, last */
+ 0x7AB1,0x7AB7,0x7BDE,0x7BE3,0x7BE7,0x7BDD,0x7BD5,0x7BE5,0x7BDA,
+ 0x7BE8,0x7BF9,0x7BD4,0x7BEA,0x7BE2,0x7BDC,0x7BEB,0x7BD8,0x7BDF,0x7CD2,
+ 0x7CD4,0x7CD7,0x7CD0,0x7CD1,0x7E12,0x7E21,0x7E17,0x7E0C,0x7E1F,0x7E20,
+ 0x7E13,0x7E0E,0x7E1C,0x7E15,0x7E1A,0x7E22,0x7E0B,0x7E0F,0x7E16,0x7E0D,
+ 0x7E14,0x7E25,0x7E24,0x7F43,0x7F7B,0x7F7C,0x7F7A,0x7FB1,0x7FEF,0x802A,
+ 0x8029,0x806C,0x81B1,0x81A6,0x81AE,0x81B9,0x81B5,0x81AB,0x81B0,0x81AC,
+ 0x81B4,0x81B2,0x81B7,0x81A7,0x81F2,0x8255,0x8256,0x8257,0x8556,0x8545,
+ 0x856B,0x854D,0x8553,0x8561,0x8558,0x8540,0x8546,0x8564,0x8541,0x8562,
+ 0x8544,0x8551,0x8547,0x8563,0x853E,0x855B,0x8571,0x854E,0x856E,0x8575,
+ 0x8555,0x8567,0x8560,0x858C,0x8566,
+ /* plane 2, row 58 */
+ 1 | (94 << 8), /* first, last */
+ 0x855D,0x8554,0x8565,0x856C,0x8663,0x8665,0x8664,0x87A4,0x879B,
+ 0x878F,0x8797,0x8793,0x8792,0x8788,0x8781,0x8796,0x8798,0x8779,0x8787,
+ 0x87A3,0x8785,0x8790,0x8791,0x879D,0x8784,0x8794,0x879C,0x879A,0x8789,
+ 0x891E,0x8926,0x8930,0x892D,0x892E,0x8927,0x8931,0x8922,0x8929,0x8923,
+ 0x892F,0x892C,0x891F,0x89F1,0x8AE0,0x8AE2,0x8AF2,0x8AF4,0x8AF5,0x8ADD,
+ 0x8B14,0x8AE4,0x8ADF,0x8AF0,0x8AC8,0x8ADE,0x8AE1,0x8AE8,0x8AFF,0x8AEF,
+ 0x8AFB,0x8C91,0x8C92,0x8C90,0x8CF5,0x8CEE,0x8CF1,0x8CF0,0x8CF3,0x8D6C,
+ 0x8D6E,0x8DA5,0x8DA7,0x8E33,0x8E3E,0x8E38,0x8E40,0x8E45,0x8E36,0x8E3C,
+ 0x8E3D,0x8E41,0x8E30,0x8E3F,0x8EBD,0x8F36,0x8F2E,0x8F35,0x8F32,0x8F39,
+ 0x8F37,0x8F34,0x9076,0x9079,0x907B,
+ /* plane 2, row 59 */
+ 1 | (94 << 8), /* first, last */
+ 0x9086,0x90FA,0x9133,0x9135,0x9136,0x9193,0x9190,0x9191,0x918D,
+ 0x918F,0x9327,0x931E,0x9308,0x931F,0x9306,0x930F,0x937A,0x9338,0x933C,
+ 0x931B,0x9323,0x9312,0x9301,0x9346,0x932D,0x930E,0x930D,0x92CB,0x931D,
+ 0x92FA,0x9313,0x92F9,0x92F7,0x9334,0x9302,0x9324,0x92FF,0x9329,0x9339,
+ 0x9335,0x932A,0x9314,0x930C,0x930B,0x92FE,0x9309,0x9300,0x92FB,0x9316,
+ 0x95BC,0x95CD,0x95BE,0x95B9,0x95BA,0x95B6,0x95BF,0x95B5,0x95BD,0x96A9,
+ 0x96D4,0x970B,0x9712,0x9710,0x9799,0x9797,0x9794,0x97F0,0x97F8,0x9835,
+ 0x982F,0x9832,0x9924,0x991F,0x9927,0x9929,0x999E,0x99EE,0x99EC,0x99E5,
+ 0x99E4,0x99F0,0x99E3,0x99EA,0x99E9,0x99E7,0x9AB9,0x9ABF,0x9AB4,0x9ABB,
+ 0x9AF6,0x9AFA,0x9AF9,0x9AF7,0x9B33,
+ /* plane 2, row 60 */
+ 1 | (94 << 8), /* first, last */
+ 0x9B80,0x9B85,0x9B87,0x9B7C,0x9B7E,0x9B7B,0x9B82,0x9B93,0x9B92,
+ 0x9B90,0x9B7A,0x9B95,0x9B7D,0x9B88,0x9D25,0x9D17,0x9D20,0x9D1E,0x9D14,
+ 0x9D29,0x9D1D,0x9D18,0x9D22,0x9D10,0x9D19,0x9D1F,0x9E88,0x9E86,0x9E87,
+ 0x9EAE,0x9EAD,0x9ED5,0x9ED6,0x9EFA,0x9F12,0x9F3D,0x5126,0x5125,0x5122,
+ 0x5124,0x5120,0x5129,0x52F4,0x5693,0x568C,0x568D,0x5686,0x5684,0x5683,
+ 0x567E,0x5682,0x567F,0x5681,0x58D6,0x58D4,0x58CF,0x58D2,0x5B2D,0x5B25,
+ 0x5B32,0x5B23,0x5B2C,0x5B27,0x5B26,0x5B2F,0x5B2E,0x5B7B,0x5BF1,0x5BF2,
+ 0x5DB7,0x5E6C,0x5E6A,0x5FBE,0x61C3,0x61B5,0x61BC,0x61E7,0x61E0,0x61E5,
+ 0x61E4,0x61E8,0x61DE,0x64EF,0x64E9,0x64E3,0x64EB,0x64E4,0x64E8,0x6581,
+ 0x6580,0x65B6,0x65DA,0x66D2,0x6A8D,
+ /* plane 2, row 61 */
+ 1 | (94 << 8), /* first, last */
+ 0x6A96,0x6A81,0x6AA5,0x6A89,0x6A9F,0x6A9B,0x6AA1,0x6A9E,0x6A87,
+ 0x6A93,0x6A8E,0x6A95,0x6A83,0x6AA8,0x6AA4,0x6A91,0x6A7F,0x6AA6,0x6A9A,
+ 0x6A85,0x6A8C,0x6A92,0x6B5B,0x6BAD,0x6C09,0x6FCC,0x6FA9,0x6FF4,0x6FD4,
+ 0x6FE3,0x6FDC,0x6FED,0x6FE7,0x6FE6,0x6FDE,0x6FF2,0x6FDD,0x6FE2,0x6FE8,
+ 0x71E1,0x71F1,0x71E8,0x71F2,0x71E4,0x71F0,0x71E2,0x7373,0x736E,0x736F,
+ 0x7497,0x74B2,0x74AB,0x7490,0x74AA,0x74AD,0x74B1,0x74A5,0x74AF,0x7510,
+ 0x7511,0x7512,0x750F,0x7584,0x7643,0x7648,0x7649,0x7647,0x76A4,0x76E9,
+ 0x77B5,0x77AB,0x77B2,0x77B7,0x77B6,0x77B4,0x77B1,0x77A8,0x77F0,0x78F3,
+ 0x78FD,0x7902,0x78FB,0x78FC,0x78FF,0x78F2,0x7905,0x78F9,0x78FE,0x7904,
+ 0x79AB,0x79A8,0x7A5C,0x7A5B,0x7A56,
+ /* plane 2, row 62 */
+ 1 | (94 << 8), /* first, last */
+ 0x7A58,0x7A54,0x7A5A,0x7ABE,0x7AC0,0x7AC1,0x7C05,0x7C0F,0x7BF2,
+ 0x7C00,0x7BFF,0x7BFB,0x7C0E,0x7BF4,0x7C0B,0x7BF3,0x7C02,0x7C09,0x7C03,
+ 0x7C01,0x7BF8,0x7BFD,0x7C06,0x7BF0,0x7BF1,0x7C10,0x7C0A,0x7CE8,0x7E2D,
+ 0x7E3C,0x7E42,0x7E33,0x9848,0x7E38,0x7E2A,0x7E49,0x7E40,0x7E47,0x7E29,
+ 0x7E4C,0x7E30,0x7E3B,0x7E36,0x7E44,0x7E3A,0x7F45,0x7F7F,0x7F7E,0x7F7D,
+ 0x7FF4,0x7FF2,0x802C,0x81BB,0x81C4,0x81CC,0x81CA,0x81C5,0x81C7,0x81BC,
+ 0x81E9,0x825B,0x825A,0x825C,0x8583,0x8580,0x858F,0x85A7,0x8595,0x85A0,
+ 0x858B,0x85A3,0x857B,0x85A4,0x859A,0x859E,0x8577,0x857C,0x8589,0x85A1,
+ 0x857A,0x8578,0x8557,0x858E,0x8596,0x8586,0x858D,0x8599,0x859D,0x8581,
+ 0x85A2,0x8582,0x8588,0x8585,0x8579,
+ /* plane 2, row 63 */
+ 1 | (94 << 8), /* first, last */
+ 0x8576,0x8598,0x8590,0x859F,0x8668,0x87BE,0x87AA,0x87AD,0x87C5,
+ 0x87B0,0x87AC,0x87B9,0x87B5,0x87BC,0x87AE,0x87C9,0x87C3,0x87C2,0x87CC,
+ 0x87B7,0x87AF,0x87C4,0x87CA,0x87B4,0x87B6,0x87BF,0x87B8,0x87BD,0x87DE,
+ 0x87B2,0x8935,0x8933,0x893C,0x893E,0x8941,0x8952,0x8937,0x8942,0x89AD,
+ 0x89AF,0x89AE,0x89F2,0x89F3,0x8B1E,0x8B18,0x8B16,0x8B11,0x8B05,0x8B0B,
+ 0x8B22,0x8B0F,0x8B12,0x8B15,0x8B07,0x8B0D,0x8B08,0x8B06,0x8B1C,0x8B13,
+ 0x8B1A,0x8C4F,0x8C70,0x8C72,0x8C71,0x8C6F,0x8C95,0x8C94,0x8CF9,0x8D6F,
+ 0x8E4E,0x8E4D,0x8E53,0x8E50,0x8E4C,0x8E47,0x8F43,0x8F40,0x9085,0x907E,
+ 0x9138,0x919A,0x91A2,0x919B,0x9199,0x919F,0x91A1,0x919D,0x91A0,0x93A1,
+ 0x9383,0x93AF,0x9364,0x9356,0x9347,
+ /* plane 2, row 64 */
+ 1 | (94 << 8), /* first, last */
+ 0x937C,0x9358,0x935C,0x9376,0x9349,0x9350,0x9351,0x9360,0x936D,
+ 0x938F,0x934C,0x936A,0x9379,0x9357,0x9355,0x9352,0x934F,0x9371,0x9377,
+ 0x937B,0x9361,0x935E,0x9363,0x9367,0x934E,0x9359,0x95C7,0x95C0,0x95C9,
+ 0x95C3,0x95C5,0x95B7,0x96AE,0x96B0,0x96AC,0x9720,0x971F,0x9718,0x971D,
+ 0x9719,0x979A,0x97A1,0x979C,0x979E,0x979D,0x97D5,0x97D4,0x97F1,0x9841,
+ 0x9844,0x984A,0x9849,0x9845,0x9843,0x9925,0x992B,0x992C,0x992A,0x9933,
+ 0x9932,0x992F,0x992D,0x9931,0x9930,0x9998,0x99A3,0x99A1,0x9A02,0x99FA,
+ 0x99F4,0x99F7,0x99F9,0x99F8,0x99F6,0x99FB,0x99FD,0x99FE,0x99FC,0x9A03,
+ 0x9ABE,0x9AFE,0x9AFD,0x9B01,0x9AFC,0x9B48,0x9B9A,0x9BA8,0x9B9E,0x9B9B,
+ 0x9BA6,0x9BA1,0x9BA5,0x9BA4,0x9B86,
+ /* plane 2, row 65 */
+ 1 | (94 << 8), /* first, last */
+ 0x9BA2,0x9BA0,0x9BAF,0x9D33,0x9D41,0x9D67,0x9D36,0x9D2E,0x9D2F,
+ 0x9D31,0x9D38,0x9D30,0x9D45,0x9D42,0x9D43,0x9D3E,0x9D37,0x9D40,0x9D3D,
+ 0x7FF5,0x9D2D,0x9E8A,0x9E89,0x9E8D,0x9EB0,0x9EC8,0x9EDA,0x9EFB,0x9EFF,
+ 0x9F24,0x9F23,0x9F22,0x9F54,0x9FA0,0x5131,0x512D,0x512E,0x5698,0x569C,
+ 0x5697,0x569A,0x569D,0x5699,0x5970,0x5B3C,0x5C69,0x5C6A,0x5DC0,0x5E6D,
+ 0x5E6E,0x61D8,0x61DF,0x61ED,0x61EE,0x61F1,0x61EA,0x61F0,0x61EB,0x61D6,
+ 0x61E9,0x64FF,0x6504,0x64FD,0x64F8,0x6501,0x6503,0x64FC,0x6594,0x65DB,
+ 0x66DA,0x66DB,0x66D8,0x6AC5,0x6AB9,0x6ABD,0x6AE1,0x6AC6,0x6ABA,0x6AB6,
+ 0x6AB7,0x6AC7,0x6AB4,0x6AAD,0x6B5E,0x6BC9,0x6C0B,0x7007,0x700C,0x700D,
+ 0x7001,0x7005,0x7014,0x700E,0x6FFF,
+ /* plane 2, row 66 */
+ 1 | (94 << 8), /* first, last */
+ 0x7000,0x6FFB,0x7026,0x6FFC,0x6FF7,0x700A,0x7201,0x71FF,0x71F9,
+ 0x7203,0x71FD,0x7376,0x74B8,0x74C0,0x74B5,0x74C1,0x74BE,0x74B6,0x74BB,
+ 0x74C2,0x7514,0x7513,0x765C,0x7664,0x7659,0x7650,0x7653,0x7657,0x765A,
+ 0x76A6,0x76BD,0x76EC,0x77C2,0x77BA,0x790C,0x7913,0x7914,0x7909,0x7910,
+ 0x7912,0x7911,0x79AD,0x79AC,0x7A5F,0x7C1C,0x7C29,0x7C19,0x7C20,0x7C1F,
+ 0x7C2D,0x7C1D,0x7C26,0x7C28,0x7C22,0x7C25,0x7C30,0x7E5C,0x7E50,0x7E56,
+ 0x7E63,0x7E58,0x7E62,0x7E5F,0x7E51,0x7E60,0x7E57,0x7E53,0x7FB5,0x7FB3,
+ 0x7FF7,0x7FF8,0x8075,0x81D1,0x81D2,0x81D0,0x825F,0x825E,0x85B4,0x85C6,
+ 0x85C0,0x85C3,0x85C2,0x85B3,0x85B5,0x85BD,0x85C7,0x85C4,0x85BF,0x85CB,
+ 0x85CE,0x85C8,0x85C5,0x85B1,0x85B6,
+ /* plane 2, row 67 */
+ 1 | (94 << 8), /* first, last */
+ 0x85D2,0x8624,0x85B8,0x85B7,0x85BE,0x8669,0x87E7,0x87E6,0x87E2,
+ 0x87DB,0x87EB,0x87EA,0x87E5,0x87DF,0x87F3,0x87E4,0x87D4,0x87DC,0x87D3,
+ 0x87ED,0x87D8,0x87E3,0x87D7,0x87D9,0x8801,0x87F4,0x87E8,0x87DD,0x8953,
+ 0x894B,0x894F,0x894C,0x8946,0x8950,0x8951,0x8949,0x8B2A,0x8B27,0x8B23,
+ 0x8B33,0x8B30,0x8B35,0x8B47,0x8B2F,0x8B3C,0x8B3E,0x8B31,0x8B25,0x8B37,
+ 0x8B26,0x8B36,0x8B2E,0x8B24,0x8B3B,0x8B3D,0x8B3A,0x8C42,0x8C75,0x8C99,
+ 0x8C98,0x8C97,0x8CFE,0x8D04,0x8D02,0x8D00,0x8E5C,0x8E62,0x8E60,0x8E57,
+ 0x8E56,0x8E5E,0x8E65,0x8E67,0x8E5B,0x8E5A,0x8E61,0x8E5D,0x8E69,0x8E54,
+ 0x8F46,0x8F47,0x8F48,0x8F4B,0x9128,0x913A,0x913B,0x913E,0x91A8,0x91A5,
+ 0x91A7,0x91AF,0x91AA,0x93B5,0x938C,
+ /* plane 2, row 68 */
+ 1 | (94 << 8), /* first, last */
+ 0x9392,0x93B7,0x939B,0x939D,0x9389,0x93A7,0x938E,0x93AA,0x939E,
+ 0x93A6,0x9395,0x9388,0x9399,0x939F,0x9380,0x938D,0x93B1,0x9391,0x93B2,
+ 0x93A4,0x93A8,0x93B4,0x93A3,0x95D2,0x95D3,0x95D1,0x96B3,0x96D7,0x96DA,
+ 0x5DC2,0x96DF,0x96D8,0x96DD,0x9723,0x9722,0x9725,0x97AC,0x97AE,0x97A8,
+ 0x97AB,0x97A4,0x97AA,0x97A2,0x97A5,0x97D7,0x97D9,0x97D6,0x97D8,0x97FA,
+ 0x9850,0x9851,0x9852,0x98B8,0x9941,0x993C,0x993A,0x9A0F,0x9A0B,0x9A09,
+ 0x9A0D,0x9A04,0x9A11,0x9A0A,0x9A05,0x9A07,0x9A06,0x9AC0,0x9ADC,0x9B08,
+ 0x9B04,0x9B05,0x9B29,0x9B35,0x9B4A,0x9B4C,0x9B4B,0x9BC7,0x9BC6,0x9BC3,
+ 0x9BBF,0x9BC1,0x9BB5,0x9BB8,0x9BD3,0x9BB6,0x9BC4,0x9BB9,0x9BBD,0x9D5C,
+ 0x9D53,0x9D4F,0x9D4A,0x9D5B,0x9D4B,
+ /* plane 2, row 69 */
+ 1 | (94 << 8), /* first, last */
+ 0x9D59,0x9D56,0x9D4C,0x9D57,0x9D52,0x9D54,0x9D5F,0x9D58,0x9D5A,
+ 0x9E8E,0x9E8C,0x9EDF,0x9F01,0x9F00,0x9F16,0x9F25,0x9F2B,0x9F2A,0x9F29,
+ 0x9F28,0x9F4C,0x9F55,0x5134,0x5135,0x5296,0x52F7,0x53B4,0x56AB,0x56AD,
+ 0x56A6,0x56A7,0x56AA,0x56AC,0x58DA,0x58DD,0x58DB,0x5912,0x5B3D,0x5B3E,
+ 0x5B3F,0x5DC3,0x5E70,0x5FBF,0x61FB,0x6507,0x6510,0x650D,0x6509,0x650C,
+ 0x650E,0x6584,0x65DE,0x65DD,0x66DE,0x6AE7,0x6AE0,0x6ACC,0x6AD1,0x6AD9,
+ 0x6ACB,0x6ADF,0x6ADC,0x6AD0,0x6AEB,0x6ACF,0x6ACD,0x6ADE,0x6B60,0x6BB0,
+ 0x6C0C,0x7019,0x7027,0x7020,0x7016,0x702B,0x7021,0x7022,0x7023,0x7029,
+ 0x7017,0x7024,0x701C,0x720C,0x720A,0x7207,0x7202,0x7205,0x72A5,0x72A6,
+ 0x72A4,0x72A3,0x72A1,0x74CB,0x74C5,
+ /* plane 2, row 70 */
+ 1 | (94 << 8), /* first, last */
+ 0x74B7,0x74C3,0x7516,0x7660,0x77C9,0x77CA,0x77C4,0x77F1,0x791D,
+ 0x791B,0x7921,0x791C,0x7917,0x791E,0x79B0,0x7A67,0x7A68,0x7C33,0x7C3C,
+ 0x7C39,0x7C2C,0x7C3B,0x7CEC,0x7CEA,0x7E76,0x7E75,0x7E78,0x7E70,0x7E77,
+ 0x7E6F,0x7E7A,0x7E72,0x7E74,0x7E68,0x7F4B,0x7F4A,0x7F83,0x7F86,0x7FB7,
+ 0x7FFD,0x7FFE,0x8078,0x81D7,0x81D5,0x820B,0x8264,0x8261,0x8263,0x85EB,
+ 0x85F1,0x85ED,0x85D9,0x85E1,0x85E8,0x85DA,0x85D7,0x85EC,0x85F2,0x85F8,
+ 0x85D8,0x85DF,0x85E3,0x85DC,0x85D1,0x85F0,0x85E6,0x85EF,0x85DE,0x85E2,
+ 0x8800,0x87FA,0x8803,0x87F6,0x87F7,0x8809,0x880C,0x880B,0x8806,0x87FC,
+ 0x8808,0x87FF,0x880A,0x8802,0x8962,0x895A,0x895B,0x8957,0x8961,0x895C,
+ 0x8958,0x895D,0x8959,0x8988,0x89B7,
+ /* plane 2, row 71 */
+ 1 | (94 << 8), /* first, last */
+ 0x89B6,0x89F6,0x8B50,0x8B48,0x8B4A,0x8B40,0x8B53,0x8B56,0x8B54,
+ 0x8B4B,0x8B55,0x8B51,0x8B42,0x8B52,0x8B57,0x8C43,0x8C77,0x8C76,0x8C9A,
+ 0x8D06,0x8D07,0x8D09,0x8DAC,0x8DAA,0x8DAD,0x8DAB,0x8E6D,0x8E78,0x8E73,
+ 0x8E6A,0x8E6F,0x8E7B,0x8EC2,0x8F52,0x8F51,0x8F4F,0x8F50,0x8F53,0x8FB4,
+ 0x9140,0x913F,0x91B0,0x91AD,0x93DE,0x93C7,0x93CF,0x93C2,0x93DA,0x93D0,
+ 0x93F9,0x93EC,0x93CC,0x93D9,0x93A9,0x93E6,0x93CA,0x93D4,0x93EE,0x93E3,
+ 0x93D5,0x93C4,0x93CE,0x93C0,0x93D2,0x93A5,0x93E7,0x957D,0x95DA,0x95DB,
+ 0x96E1,0x9729,0x972B,0x972C,0x9728,0x9726,0x97B3,0x97B7,0x97B6,0x97DD,
+ 0x97DE,0x97DF,0x985C,0x9859,0x985D,0x9857,0x98BF,0x98BD,0x98BB,0x98BE,
+ 0x9948,0x9947,0x9943,0x99A6,0x99A7,
+ /* plane 2, row 72 */
+ 1 | (94 << 8), /* first, last */
+ 0x9A1A,0x9A15,0x9A25,0x9A1D,0x9A24,0x9A1B,0x9A22,0x9A20,0x9A27,
+ 0x9A23,0x9A1E,0x9A1C,0x9A14,0x9AC2,0x9B0B,0x9B0A,0x9B0E,0x9B0C,0x9B37,
+ 0x9BEA,0x9BEB,0x9BE0,0x9BDE,0x9BE4,0x9BE6,0x9BE2,0x9BF0,0x9BD4,0x9BD7,
+ 0x9BEC,0x9BDC,0x9BD9,0x9BE5,0x9BD5,0x9BE1,0x9BDA,0x9D77,0x9D81,0x9D8A,
+ 0x9D84,0x9D88,0x9D71,0x9D80,0x9D78,0x9D86,0x9D8B,0x9D8C,0x9D7D,0x9D6B,
+ 0x9D74,0x9D75,0x9D70,0x9D69,0x9D85,0x9D73,0x9D7B,0x9D82,0x9D6F,0x9D79,
+ 0x9D7F,0x9D87,0x9D68,0x9E94,0x9E91,0x9EC0,0x9EFC,0x9F2D,0x9F40,0x9F41,
+ 0x9F4D,0x9F56,0x9F57,0x9F58,0x5337,0x56B2,0x56B5,0x56B3,0x58E3,0x5B45,
+ 0x5DC6,0x5DC7,0x5EEE,0x5EEF,0x5FC0,0x5FC1,0x61F9,0x6517,0x6516,0x6515,
+ 0x6513,0x65DF,0x66E8,0x66E3,0x66E4,
+ /* plane 2, row 73 */
+ 1 | (94 << 8), /* first, last */
+ 0x6AF3,0x6AF0,0x6AEA,0x6AE8,0x6AF9,0x6AF1,0x6AEE,0x6AEF,0x703C,
+ 0x7035,0x702F,0x7037,0x7034,0x7031,0x7042,0x7038,0x703F,0x703A,0x7039,
+ 0x702A,0x7040,0x703B,0x7033,0x7041,0x7213,0x7214,0x72A8,0x737D,0x737C,
+ 0x74BA,0x76AB,0x76AA,0x76BE,0x76ED,0x77CC,0x77CE,0x77CF,0x77CD,0x77F2,
+ 0x7925,0x7923,0x7927,0x7928,0x7924,0x7929,0x79B2,0x7A6E,0x7A6C,0x7A6D,
+ 0x7AF7,0x7C49,0x7C48,0x7C4A,0x7C47,0x7C45,0x7CEE,0x7E7B,0x7E7E,0x7E81,
+ 0x7E80,0x7FBA,0x7FFF,0x8079,0x81DB,0x81D9,0x8268,0x8269,0x8622,0x85FF,
+ 0x8601,0x85FE,0x861B,0x8600,0x85F6,0x8604,0x8609,0x8605,0x860C,0x85FD,
+ 0x8819,0x8810,0x8811,0x8817,0x8813,0x8816,0x8963,0x8966,0x89B9,0x89F7,
+ 0x8B60,0x8B6A,0x8B5D,0x8B68,0x8B63,
+ /* plane 2, row 74 */
+ 1 | (94 << 8), /* first, last */
+ 0x8B65,0x8B67,0x8B6D,0x8DAE,0x8E86,0x8E88,0x8E84,0x8F59,0x8F56,
+ 0x8F57,0x8F55,0x8F58,0x8F5A,0x908D,0x9143,0x9141,0x91B7,0x91B5,0x91B2,
+ 0x91B3,0x940B,0x9413,0x93FB,0x9420,0x940F,0x9414,0x93FE,0x9415,0x9410,
+ 0x9428,0x9419,0x940D,0x93F5,0x9400,0x93F7,0x9407,0x940E,0x9416,0x9412,
+ 0x93FA,0x9409,0x93F8,0x943C,0x940A,0x93FF,0x93FC,0x940C,0x93F6,0x9411,
+ 0x9406,0x95DE,0x95E0,0x95DF,0x972E,0x972F,0x97B9,0x97BB,0x97FD,0x97FE,
+ 0x9860,0x9862,0x9863,0x985F,0x98C1,0x98C2,0x9950,0x994E,0x9959,0x994C,
+ 0x994B,0x9953,0x9A32,0x9A34,0x9A31,0x9A2C,0x9A2A,0x9A36,0x9A29,0x9A2E,
+ 0x9A38,0x9A2D,0x9AC7,0x9ACA,0x9AC6,0x9B10,0x9B12,0x9B11,0x9C0B,0x9C08,
+ 0x9BF7,0x9C05,0x9C12,0x9BF8,0x9C40,
+ /* plane 2, row 75 */
+ 1 | (94 << 8), /* first, last */
+ 0x9C07,0x9C0E,0x9C06,0x9C17,0x9C14,0x9C09,0x9D9F,0x9D99,0x9DA4,
+ 0x9D9D,0x9D92,0x9D98,0x9D90,0x9D9B,0x9DA0,0x9D94,0x9D9C,0x9DAA,0x9D97,
+ 0x9DA1,0x9D9A,0x9DA2,0x9DA8,0x9D9E,0x9DA3,0x9DBF,0x9DA9,0x9D96,0x9DA6,
+ 0x9DA7,0x9E99,0x9E9B,0x9E9A,0x9EE5,0x9EE4,0x9EE7,0x9EE6,0x9F30,0x9F2E,
+ 0x9F5B,0x9F60,0x9F5E,0x9F5D,0x9F59,0x9F91,0x513A,0x5139,0x5298,0x5297,
+ 0x56C3,0x56BD,0x56BE,0x5B48,0x5B47,0x5DCB,0x5DCF,0x5EF1,0x61FD,0x651B,
+ 0x6B02,0x6AFC,0x6B03,0x6AF8,0x6B00,0x7043,0x7044,0x704A,0x7048,0x7049,
+ 0x7045,0x7046,0x721D,0x721A,0x7219,0x737E,0x7517,0x766A,0x77D0,0x792D,
+ 0x7931,0x792F,0x7C54,0x7C53,0x7CF2,0x7E8A,0x7E87,0x7E88,0x7E8B,0x7E86,
+ 0x7E8D,0x7F4D,0x7FBB,0x8030,0x81DD,
+ /* plane 2, row 76 */
+ 1 | (94 << 8), /* first, last */
+ 0x8618,0x862A,0x8626,0x861F,0x8623,0x861C,0x8619,0x8627,0x862E,
+ 0x8621,0x8620,0x8629,0x861E,0x8625,0x8829,0x881D,0x881B,0x8820,0x8824,
+ 0x881C,0x882B,0x884A,0x896D,0x8969,0x896E,0x896B,0x89FA,0x8B79,0x8B78,
+ 0x8B45,0x8B7A,0x8B7B,0x8D10,0x8D14,0x8DAF,0x8E8E,0x8E8C,0x8F5E,0x8F5B,
+ 0x8F5D,0x9146,0x9144,0x9145,0x91B9,0x943F,0x943B,0x9436,0x9429,0x943D,
+ 0x9430,0x9439,0x942A,0x9437,0x942C,0x9440,0x9431,0x95E5,0x95E4,0x95E3,
+ 0x9735,0x973A,0x97BF,0x97E1,0x9864,0x98C9,0x98C6,0x98C0,0x9958,0x9956,
+ 0x9A39,0x9A3D,0x9A46,0x9A44,0x9A42,0x9A41,0x9A3A,0x9A3F,0x9ACD,0x9B15,
+ 0x9B17,0x9B18,0x9B16,0x9B3A,0x9B52,0x9C2B,0x9C1D,0x9C1C,0x9C2C,0x9C23,
+ 0x9C28,0x9C29,0x9C24,0x9C21,0x9DB7,
+ /* plane 2, row 77 */
+ 1 | (94 << 8), /* first, last */
+ 0x9DB6,0x9DBC,0x9DC1,0x9DC7,0x9DCA,0x9DCF,0x9DBE,0x9DC5,0x9DC3,
+ 0x9DBB,0x9DB5,0x9DCE,0x9DB9,0x9DBA,0x9DAC,0x9DC8,0x9DB1,0x9DAD,0x9DCC,
+ 0x9DB3,0x9DCD,0x9DB2,0x9E7A,0x9E9C,0x9EEB,0x9EEE,0x9EED,0x9F1B,0x9F18,
+ 0x9F1A,0x9F31,0x9F4E,0x9F65,0x9F64,0x9F92,0x4EB9,0x56C6,0x56C5,0x56CB,
+ 0x5971,0x5B4B,0x5B4C,0x5DD5,0x5DD1,0x5EF2,0x6521,0x6520,0x6526,0x6522,
+ 0x6B0B,0x6B08,0x6B09,0x6C0D,0x7055,0x7056,0x7057,0x7052,0x721E,0x721F,
+ 0x72A9,0x737F,0x74D8,0x74D5,0x74D9,0x74D7,0x766D,0x76AD,0x7935,0x79B4,
+ 0x7A70,0x7A71,0x7C57,0x7C5C,0x7C59,0x7C5B,0x7C5A,0x7CF4,0x7CF1,0x7E91,
+ 0x7F4F,0x7F87,0x81DE,0x826B,0x8634,0x8635,0x8633,0x862C,0x8632,0x8636,
+ 0x882C,0x8828,0x8826,0x882A,0x8825,
+ /* plane 2, row 78 */
+ 1 | (94 << 8), /* first, last */
+ 0x8971,0x89BF,0x89BE,0x89FB,0x8B7E,0x8B84,0x8B82,0x8B86,0x8B85,
+ 0x8B7F,0x8D15,0x8E95,0x8E94,0x8E9A,0x8E92,0x8E90,0x8E96,0x8E97,0x8F60,
+ 0x8F62,0x9147,0x944C,0x9450,0x944A,0x944B,0x944F,0x9447,0x9445,0x9448,
+ 0x9449,0x9446,0x973F,0x97E3,0x986A,0x9869,0x98CB,0x9954,0x995B,0x9A4E,
+ 0x9A53,0x9A54,0x9A4C,0x9A4F,0x9A48,0x9A4A,0x9A49,0x9A52,0x9A50,0x9AD0,
+ 0x9B19,0x9B2B,0x9B3B,0x9B56,0x9B55,0x9C46,0x9C48,0x9C3F,0x9C44,0x9C39,
+ 0x9C33,0x9C41,0x9C3C,0x9C37,0x9C34,0x9C32,0x9C3D,0x9C36,0x9DDB,0x9DD2,
+ 0x9DDE,0x9DDA,0x9DCB,0x9DD0,0x9DDC,0x9DD1,0x9DDF,0x9DE9,0x9DD9,0x9DD8,
+ 0x9DD6,0x9DF5,0x9DD5,0x9DDD,0x9EB6,0x9EF0,0x9F35,0x9F33,0x9F32,0x9F42,
+ 0x9F6B,0x9F95,0x9FA2,0x513D,0x5299,
+ /* plane 2, row 79 */
+ 1 | (94 << 8), /* first, last */
+ 0x58E8,0x58E7,0x5972,0x5B4D,0x5DD8,0x882F,0x5F4F,0x6201,0x6203,
+ 0x6204,0x6529,0x6525,0x6596,0x66EB,0x6B11,0x6B12,0x6B0F,0x6BCA,0x705B,
+ 0x705A,0x7222,0x7382,0x7381,0x7383,0x7670,0x77D4,0x7C67,0x7C66,0x7E95,
+ 0x826C,0x863A,0x8640,0x8639,0x863C,0x8631,0x863B,0x863E,0x8830,0x8832,
+ 0x882E,0x8833,0x8976,0x8974,0x8973,0x89FE,0x8B8C,0x8B8E,0x8B8B,0x8B88,
+ 0x8C45,0x8D19,0x8E98,0x8F64,0x8F63,0x91BC,0x9462,0x9455,0x945D,0x9457,
+ 0x945E,0x97C4,0x97C5,0x9800,0x9A56,0x9A59,0x9B1E,0x9B1F,0x9B20,0x9C52,
+ 0x9C58,0x9C50,0x9C4A,0x9C4D,0x9C4B,0x9C55,0x9C59,0x9C4C,0x9C4E,0x9DFB,
+ 0x9DF7,0x9DEF,0x9DE3,0x9DEB,0x9DF8,0x9DE4,0x9DF6,0x9DE1,0x9DEE,0x9DE6,
+ 0x9DF2,0x9DF0,0x9DE2,0x9DEC,0x9DF4,
+ /* plane 2, row 80 */
+ 1 | (94 << 8), /* first, last */
+ 0x9DF3,0x9DE8,0x9DED,0x9EC2,0x9ED0,0x9EF2,0x9EF3,0x9F06,0x9F1C,
+ 0x9F38,0x9F37,0x9F36,0x9F43,0x9F4F,0x9F71,0x9F70,0x9F6E,0x9F6F,0x56D3,
+ 0x56CD,0x5B4E,0x5C6D,0x652D,0x66ED,0x66EE,0x6B13,0x705F,0x7061,0x705D,
+ 0x7060,0x7223,0x74DB,0x74E5,0x77D5,0x7938,0x79B7,0x79B6,0x7C6A,0x7E97,
+ 0x7F89,0x826D,0x8643,0x8838,0x8837,0x8835,0x884B,0x8B94,0x8B95,0x8E9E,
+ 0x8E9F,0x8EA0,0x8E9D,0x91BE,0x91BD,0x91C2,0x946B,0x9468,0x9469,0x96E5,
+ 0x9746,0x9743,0x9747,0x97C7,0x97E5,0x9A5E,0x9AD5,0x9B59,0x9C63,0x9C67,
+ 0x9C66,0x9C62,0x9C5E,0x9C60,0x9E02,0x9DFE,0x9E07,0x9E03,0x9E06,0x9E05,
+ 0x9E00,0x9E01,0x9E09,0x9DFF,0x9DFD,0x9E04,0x9EA0,0x9F1E,0x9F46,0x9F74,
+ 0x9F75,0x9F76,0x56D4,0x652E,0x65B8,
+ /* plane 2, row 81 */
+ 1 | (94 << 8), /* first, last */
+ 0x6B18,0x6B19,0x6B17,0x6B1A,0x7062,0x7226,0x72AA,0x77D8,0x77D9,
+ 0x7939,0x7C69,0x7C6B,0x7CF6,0x7E9A,0x7E98,0x7E9B,0x7E99,0x81E0,0x81E1,
+ 0x8646,0x8647,0x8648,0x8979,0x897A,0x897C,0x897B,0x89FF,0x8B98,0x8B99,
+ 0x8EA5,0x8EA4,0x8EA3,0x946E,0x946D,0x946F,0x9471,0x9473,0x9749,0x9872,
+ 0x995F,0x9C68,0x9C6E,0x9C6D,0x9E0B,0x9E0D,0x9E10,0x9E0F,0x9E12,0x9E11,
+ 0x9EA1,0x9EF5,0x9F09,0x9F47,0x9F78,0x9F7B,0x9F7A,0x9F79,0x571E,0x7066,
+ 0x7C6F,0x883C,0x8DB2,0x8EA6,0x91C3,0x9474,0x9478,0x9476,0x9475,0x9A60,
+ 0x9B2E,0x9C74,0x9C73,0x9C71,0x9C75,0x9E14,0x9E13,0x9EF6,0x9F0A,0x9FA4,
+ 0x7068,0x7065,0x7CF7,0x866A,0x883E,0x883D,0x883F,0x8B9E,0x8C9C,0x8EA9,
+ 0x8EC9,0x974B,0x9873,0x9874,0x98CC,
+ /* plane 2, row 82 */
+ 1 | (36 << 8), /* first, last */
+ 0x9961,0x99AB,0x9A64,0x9A66,0x9A67,0x9B24,0x9E15,0x9E17,0x9F48,
+ 0x6207,0x6B1E,0x7227,0x864C,0x8EA8,0x9482,0x9480,0x9481,0x9A69,0x9A68,
+ 0x9E19,0x864B,0x8B9F,0x9483,0x9C79,0x9EB7,0x7675,0x9A6B,0x9C7A,0x9E1D,
+ 0x7069,0x706A,0x7229,0x9EA4,0x9F7E,0x9F49,0x9F98,
+ /* plane 2, row 83: --- */
+ /* plane 2, row 84: --- */
+ /* plane 2, row 85: --- */
+ /* plane 2, row 86: --- */
+ /* plane 2, row 87: --- */
+ /* plane 2, row 88: --- */
+ /* plane 2, row 89: --- */
+ /* plane 2, row 90: --- */
+ /* plane 2, row 91: --- */
+ /* plane 2, row 92: --- */
+ /* plane 2, row 93: --- */
+ /* plane 2, row 94: --- */
+ /* plane 3, row 1 */
+ 1 | (94 << 8), /* first, last */
+ 0x4E28,0x4E36,0x4E3F,0x4E85,0x4E05,0x4E04,0x5182,0x5196,0x5338,
+ 0x5369,0x53B6,0x4E2A,0x4E87,0x4E49,0x51E2,0x4E46,0x4E8F,0x4EBC,0x4EBE,
+ 0x5166,0x51E3,0x5204,0x529C,0x5344,0x5902,0x590A,0x5B80,0x5DDB,0x5E7A,
+ 0x5E7F,0x5EF4,0x5F50,0x5F51,0x5F61,0x961D,0xD840,0x4E63,0x4E62,0x4EA3,
+ 0x5185,0x4EC5,0x4ECF,0x4ECE,0x4ECC,0x5184,0x5186,0xD87E,0x34C5,0x51E4,
+ 0x5205,0x529E,0x529D,0x52FD,0x5300,0x533A,0x3539,0x5346,0x535D,0x5386,
+ 0x53B7,0x3555,0x53CC,0x355B,0x53CE,0x5721,0x37A2,0x5E00,0x5F0C,0x6237,
+ 0x6238,0x6534,0x6535,0x65E0,0x3E26,0x738D,0x4E97,0x4EE0,0x3432,0xD840,
+ 0x4EE7,0x3433,0x4EE6,0x3434,0x36A2,0x3431,0x34B0,0x56D8,0x518B,0x518C,
+ 0x5199,0x51E5,0xD87E,0x520B,0x34DC,
+ 36, /* first low-surrogate */
+ 0xDC0B, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDC17, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xDDA9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xDC50,
+ /* plane 3, row 2 */
+ 1 | (94 << 8), /* first, last */
+ 0x361E,0x5304,0x5303,0x5307,0xD87E,0x531E,0x535F,0x536D,0x5389,
+ 0x53BA,0x53D0,0x3565,0x53F6,0x53F7,0x53F9,0x3564,0x53F4,0x361D,0x3626,
+ 0x5724,0x5904,0x5918,0x5932,0x5930,0x5934,0x368E,0x5975,0x374A,0x5B82,
+ 0x5BF9,0x5C14,0x378B,0x37A6,0x37A4,0x37A5,0x37A7,0x382F,0x3832,0x5E81,
+ 0x5E83,0x5F0D,0x5F52,0x38D4,0x5FCA,0x5FC7,0x6239,0x39C5,0x624F,0x65E7,
+ 0x672F,0x6B7A,0x6C39,0x3CBA,0x3CB9,0x6C37,0x6C44,0x6C45,0x738C,0x7592,
+ 0x7676,0x9093,0x9092,0x48B3,0x49BA,0x4E21,0x4E20,0x4E22,0x4E68,0x4E89,
+ 0x4E98,0x4EF9,0x4EEF,0x343B,0x343C,0x4EF8,0x4F06,0x4F03,0x4EFC,0x4EEE,
+ 0x4F16,0x3439,0x4F28,0x4F1C,0x4F07,0x4F1A,0x4EFA,0x4F17,0x514A,0x34B2,
+ 0x5172,0xD87E,0x51B4,0x51B3,0x51B2,
+ 5, /* first low-surrogate */
+ 0xDC2A, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xDC15,
+ /* plane 3, row 3 */
+ 1 | (94 << 8), /* first, last */
+ 0x34C7,0x51E8,0x342B,0x5214,0x520F,0x5215,0x5218,0x52A8,0xD87E,
+ 0x534B,0x534F,0x353B,0x5350,0x3544,0x538B,0x3542,0x53BE,0x355C,0x53D2,
+ 0x5416,0x53FF,0x3567,0x5400,0x3566,0x5405,0x5413,0x5415,0xD87E,0x361F,
+ 0x56E3,0x5735,0x5736,0x5731,0x5732,0x58EE,0x5905,0x4E54,0x368F,0x5936,
+ 0x3690,0x36A8,0x36A4,0x597A,0x36A3,0x5986,0x373D,0x374C,0x5B86,0x5F53,
+ 0x5C18,0x378C,0x5C3D,0x5C78,0x37A8,0x37AD,0x37AF,0xD847,0x5C80,0x3829,
+ 0x5E08,0x3836,0x3871,0x3870,0x386F,0x5EF5,0x5F0E,0x38A9,0x38AA,0x38FB,
+ 0x5FD3,0x5FDA,0x38FC,0x5FDB,0x39AE,0x620F,0x625D,0x625F,0x6267,0x6257,
+ 0x9F50,0x3AC3,0x65EB,0x65EA,0x3B30,0x6737,0x3B41,0x6732,0x6736,0x6B22,
+ 0x6BCE,0x3C8C,0x6C58,0x6C51,0x6C77,
+ 9, /* first low-surrogate */
+ 0xDC2C,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xDC3B, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDD46,
+ /* plane 3, row 4 */
+ 1 | (94 << 8), /* first, last */
+ 0x6C3C,0x3CBB,0x6C5A,0xD84F,0x6C53,0x706F,0x7072,0x706E,0xD87E,
+ 0x3DA1,0x7073,0x72B1,0x72B2,0x3EA8,0x738F,0x3EAA,0x3EAB,0x4096,0x793C,
+ 0x41C2,0x808D,0x808E,0x4493,0x827B,0x4494,0x8D71,0x8FB9,0x9096,0x909A,
+ 0x49BB,0x4E24,0x4E71,0xD87E,0x4E9C,0x4F45,0x4F4A,0x4F39,0x4F37,0x3443,
+ 0x4F32,0x4F42,0x3442,0x4F44,0x4F4B,0x3444,0x4F40,0x4F35,0x4F31,0x5151,
+ 0xD87E,0x5150,0x514E,0x34B3,0x34B7,0x519D,0x34C8,0x51B5,0x51B8,0x51EC,
+ 0x5223,0x5227,0x5226,0x521F,0x522B,0x5220,0x52B4,0x52B3,0x3518,0x5325,
+ 0x533B,0x5374,0x3547,0x3546,0x3545,0x356B,0x3569,0x544D,0x3572,0x3571,
+ 0x543A,0x356C,0x356F,0x5444,0x544C,0x5423,0x541A,0x5432,0x544B,0x5421,
+ 0x3573,0x5434,0x5449,0x5450,0x5422,
+ 4, /* first low-surrogate */
+ 0xDC86, 0, 0, 0, 0,0xDC35,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xDC1B, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xDC0E,
+ /* plane 3, row 5 */
+ 1 | (94 << 8), /* first, last */
+ 0x543F,0x5451,0x545A,0x542F,0x3576,0x56E9,0x56F2,0x56F3,0x56EF,
+ 0x56ED,0x56EC,0x56E6,0x5748,0x3627,0x5744,0x573F,0x573C,0x5753,0x5756,
+ 0x3630,0x575F,0x5743,0x5758,0x5757,0x3629,0x362A,0x362F,0x5746,0x362C,
+ 0x573D,0x362D,0x5742,0x5754,0x5755,0x58F1,0x58F2,0x58F0,0x590B,0x9EA6,
+ 0x56F1,0x593D,0x3693,0x5994,0x598C,0x36AD,0x599C,0x36AC,0x36AB,0x599F,
+ 0x36A9,0x599B,0x36AE,0x5989,0x599A,0x36AA,0x6588,0x374E,0x5B8D,0x3750,
+ 0x5BFE,0x5BFF,0x5BFD,0x5C2B,0x37B2,0x5C84,0x5C8E,0x5C9C,0x37B5,0x37B6,
+ 0x5C85,0x5DF5,0x5E09,0x3839,0x383B,0x5E0B,0x3872,0x5E92,0x5E90,0x5F03,
+ 0x38AC,0x5F1E,0x5F63,0x3908,0x5FE7,0x5FFE,0x5FE6,0x5FDC,0x5FCE,0x3903,
+ 0x5FFC,0x5FDF,0x5FEC,0x5FF6,0xD849,
+ 94, /* first low-surrogate */
+ 0xDDD7,
+ /* plane 3, row 6 */
+ 1 | (94 << 8), /* first, last */
+ 0x5FF2,0x5FF0,0x5FF9,0x390B,0x6213,0x39AF,0xD87E,0x623B,0x623C,
+ 0x6282,0x39CE,0x39CB,0x39CC,0x6278,0x628B,0x39CD,0x629E,0x62A5,0x629B,
+ 0x629C,0x6299,0x628D,0x6285,0x629D,0x6275,0x3A80,0x3AAF,0x3AD3,0x65F6,
+ 0x3AD5,0x3AD4,0x3AD7,0x66F5,0x675B,0x3B42,0x6754,0x6752,0x3B44,0x6758,
+ 0x6744,0x674A,0x6761,0x3CC6,0x6C7F,0x6C91,0x6C9E,0x3CC0,0x6C6E,0x6C7C,
+ 0x6C9F,0x6C75,0x3CBE,0x6C56,0x6CA2,0x6C79,0x3CCA,0x6CA1,0x3CC4,0x6CAA,
+ 0x6CA0,0x3CC2,0x7079,0x7077,0x707E,0x3DA4,0x7075,0x707B,0x7264,0x3E29,
+ 0x72BB,0x72BC,0x72C7,0x72B9,0x72BE,0x72B6,0x3E60,0x3E5E,0x7398,0x3EAD,
+ 0x3EAE,0x3EAC,0x3F57,0x7593,0x7680,0x3FDD,0x7683,0x76C0,0x76C1,0x400E,
+ 0x4097,0x77F4,0x77F5,0x4127,0x7ACC,
+ 7, /* first low-surrogate */
+ 0xDCB2,
+ /* plane 3, row 7 */
+ 1 | (94 << 8), /* first, last */
+ 0x7ACD,0x7CFA,0x809F,0x8091,0x8097,0x8094,0x4495,0x8286,0x828C,
+ 0xD87E,0x8295,0x4498,0x866C,0x459D,0x8FB5,0x8FBE,0x8FC7,0x488A,0x8FC1,
+ 0x90A9,0x90A4,0x48B5,0x48B6,0x48B7,0x90A8,0x9627,0x9626,0x962B,0x9633,
+ 0x9634,0x9629,0x4E3D,0x3428,0x4E9D,0x4F93,0x4F8A,0x344D,0x3449,0x4F6D,
+ 0x4F8E,0x4FA0,0x4FA2,0x4FA1,0x4F9F,0x4FA3,0xD840,0x4F72,0x3451,0x4F8C,
+ 0x5156,0xD87E,0xD87E,0x5190,0x34CB,0x34CA,0x34CC,0x51ED,0x51FE,0x522F,
+ 0xD841,0x523C,0x5234,0x5239,0x52B9,0x52B5,0x52BF,0x5355,0x353D,0x5376,
+ 0x537A,0x5393,0x3548,0x53C1,0x53C2,0x53D5,0x5485,0x3578,0x545F,0x5493,
+ 0x5489,0x5479,0x9EFE,0x548F,0x5469,0x546D,0x357A,0x5494,0x546A,0x548A,
+ 0x3577,0x56FD,0x56FB,0x56F8,0x3621,
+ 10, /* first low-surrogate */
+ 0xDD8F, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xDE09, 0, 0, 0,
+ 0,0xDC0F,0xDC11, 0, 0, 0, 0, 0, 0, 0,
+ 0xDEEC,
+ /* plane 3, row 8 */
+ 1 | (94 << 8), /* first, last */
+ 0x56FC,0x56F6,0x5765,0x5781,0x5763,0x5767,0x3631,0x576E,0x5778,
+ 0x577F,0x3633,0x3634,0x58F3,0x594B,0x594C,0x36C1,0x36B0,0x36B4,0x59AD,
+ 0x36B8,0x59C4,0x36BC,0x59C2,0x59B0,0x36BF,0x36B5,0x36B1,0x36BD,0x59BF,
+ 0x36BB,0x59C9,0x59B8,0x59AC,0x36B3,0x36B6,0x36BA,0x59B7,0x59D7,0x36B7,
+ 0x5B60,0x3740,0x5B96,0x5B9E,0x5B94,0x5B9F,0x5B9D,0x3752,0x5C00,0x5C19,
+ 0x3790,0x3791,0x5C49,0x5C4A,0x37BE,0x5CBB,0x5CC1,0x37C0,0x37C1,0x37B9,
+ 0x5CB9,0x5C9E,0x5CB4,0x5CBA,0x5DF6,0x5E13,0x5E12,0x5E77,0x3879,0x5E98,
+ 0x387B,0x5E99,0x5E9D,0x5EF8,0x38A0,0x5EF9,0x3429,0x5F06,0x5F21,0x38AE,
+ 0x5F25,0x5F55,0x38CD,0x38CB,0x38D9,0x5F84,0x5F83,0x6030,0x6007,0x390C,
+ 0x6036,0x3901,0x3905,0x3902,0x5FE9,
+ /* plane 3, row 9 */
+ 1 | (94 << 8), /* first, last */
+ 0x603D,0x6008,0x3913,0x3911,0x62BA,0x62B2,0x39E4,0x62B7,0x62E4,
+ 0x62A7,0x39DA,0x39D5,0x39D3,0x62D5,0x62E1,0x62DD,0x62A6,0x62C1,0x62C5,
+ 0x62C0,0x62DF,0x62E0,0x62DE,0x39D6,0x6589,0x3AB4,0x65A6,0x65BA,0x3AD9,
+ 0x65FF,0x3AD8,0x6617,0x6618,0x6601,0x65FE,0x3B33,0x670C,0x3B48,0x676B,
+ 0x6796,0x6782,0x678A,0x3B47,0x67A3,0x3B4B,0x67A2,0x678F,0x3B4A,0x67F9,
+ 0x6780,0x6B26,0x6B27,0x6B68,0x6B69,0x3C5A,0x6B81,0x6BB4,0x6BD1,0x3C8E,
+ 0x3CB4,0x6C1C,0x3CCD,0x3CCC,0x3CCF,0x3CCB,0x3CCE,0x6C97,0x6C6C,0x6CDF,
+ 0x3CD2,0x6CEA,0x3CD1,0x6CE4,0x6CD8,0x6CB2,0x6CCE,0x6CC8,0x3DA6,0x708B,
+ 0x7088,0x7090,0x708F,0x3DAA,0x7087,0x7089,0x708D,0x7081,0x3DA8,0x708C,
+ 0x3E13,0x3E1A,0x7240,0x3E1D,0x3E1E,
+ /* plane 3, row 10 */
+ 1 | (94 << 8), /* first, last */
+ 0x7265,0x7266,0x7268,0x3E65,0x3E66,0x72CD,0x72D3,0x72DB,0x3E64,
+ 0x72CF,0x73A7,0x73A3,0x739E,0x3EB0,0x73AF,0x3EB3,0x3EB5,0x73AA,0x739C,
+ 0x3F19,0x7542,0x7544,0x753B,0x7541,0xD848,0x759B,0x759E,0x3F75,0x79C4,
+ 0x79C3,0x79C6,0x412B,0x412C,0x79C7,0x412D,0x79CA,0xD856,0x41C3,0x7ACF,
+ 0x7C76,0x7C74,0x7CFF,0x7CFC,0x34BA,0x4350,0x7F59,0x80A8,0x43D3,0x43D0,
+ 0x80B0,0x43DC,0x80B3,0x43D2,0x80A4,0x80B6,0x80A7,0x80AC,0x43DB,0x80A6,
+ 0x5367,0x820E,0x82C4,0x833E,0x829C,0x44A5,0x449F,0x449A,0x449C,0x44A2,
+ 0x82AA,0x449B,0x82C9,0x44A3,0x449D,0x82A6,0x82B2,0x4588,0x461A,0x488D,
+ 0x8FCC,0x8FD9,0x8FCA,0x8FD8,0x8FCF,0x90B7,0x48B8,0x90AD,0x90B9,0x9637,
+ 0x49C3,0x9641,0x963E,0x96B6,0x9751,
+ 25, /* first low-surrogate */
+ 0xDF3F, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDD2E,
+ /* plane 3, row 11 */
+ 1 | (94 << 8), /* first, last */
+ 0x9763,0x4E57,0x4E79,0x4EB2,0x4EB0,0x4EAF,0x4EB1,0x4FD2,0x4FD5,
+ 0x345D,0x4FBE,0x4FB8,0x4FB0,0x4FB1,0x4FC8,0x345A,0x3457,0x4FC6,0x4FCC,
+ 0x4FE5,0x4FE3,0x4FB4,0x516A,0x34B8,0x519F,0x34C2,0x51C1,0x34CF,0x51C2,
+ 0x51C3,0x5245,0x5248,0x34E7,0x34E9,0x524F,0x4452,0x34E8,0x52C5,0x52CA,
+ 0x52C4,0x5327,0x5358,0x537D,0x354A,0x53DD,0x53DC,0x53DA,0x53D9,0x54B9,
+ 0x3580,0x54D0,0x54B4,0x54CA,0x3587,0x54A3,0x54DA,0x54A4,0x3584,0x54B2,
+ 0x549E,0x549F,0x54B5,0x3582,0x3581,0x54CD,0x3583,0x54CC,0x3622,0x5700,
+ 0x57AC,0x5791,0x578E,0x578D,0x5792,0x57A1,0x5790,0x57A6,0x57A8,0x363B,
+ 0x579C,0x5796,0x57A7,0x363A,0x3638,0x3639,0x3636,0x58F5,0x3685,0x5909,
+ 0x5908,0x3C54,0x5952,0x369A,0x36C4,
+ /* plane 3, row 12 */
+ 1 | (94 << 8), /* first, last */
+ 0x59DF,0x36C5,0x59EB,0x59EF,0x59F0,0x59D5,0x5A0D,0x5A04,0x59F9,
+ 0x5A02,0x59F8,0x59E2,0x59D9,0x59E7,0x5B6A,0x3754,0x3755,0x5BAB,0x3756,
+ 0x5C1B,0x5C2F,0x3796,0x663C,0x3795,0x3794,0x37C4,0x5CD1,0x5CDC,0x5CE6,
+ 0x5CE1,0x5CCD,0xD87E,0x5CE2,0x5CDD,0x5CE5,0x5DFB,0x5DFA,0x5E1E,0x3844,
+ 0x5EA1,0x387D,0x387E,0x5EFC,0x5EFB,0x5F2F,0x38B2,0x38B6,0x5F66,0xD87E,
+ 0x38DC,0x38DF,0x605C,0x3928,0x604E,0x6051,0x3919,0x3910,0x6023,0x6031,
+ 0x607C,0x6052,0x392C,0x6060,0x604A,0x6061,0x391B,0x6218,0x39C2,0x39EF,
+ 0x39E3,0x39E5,0x39EA,0x39E6,0x39EE,0x631F,0x6317,0x62EA,0x6321,0x6304,
+ 0x6305,0x39E8,0x6531,0x6544,0x6540,0x3A85,0x6542,0x65BE,0x3AE0,0x6629,
+ 0x661B,0x3ADD,0x6623,0x662C,0x661A,
+ 32, /* first low-surrogate */
+ 0xDC7A, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xDC99,
+ /* plane 3, row 13 */
+ 1 | (94 << 8), /* first, last */
+ 0x6630,0x663B,0x661E,0x6637,0x6638,0x3AE1,0x670E,0x3B51,0x3B55,
+ 0x67E8,0x67D6,0x3B52,0x67C7,0x67BC,0x6852,0x67BF,0x67D5,0x67FE,0x8363,
+ 0x67FB,0xD87E,0x67B1,0x6801,0x6805,0x6800,0x67D7,0x409E,0x6B2A,0x6B6B,
+ 0x3C52,0x3C5E,0x3C60,0x3C5F,0x6BE1,0x3C92,0x3CD6,0x6D23,0x6CFF,0x6D14,
+ 0x6D05,0x6D13,0x6D06,0x6D21,0x3CDE,0x6D15,0x6CAF,0x6CF4,0x6D02,0x6D45,
+ 0xD87E,0x6D26,0x3CD9,0x6D44,0x3CDD,0x6D24,0x70A5,0x3DAC,0x70A3,0x3DB0,
+ 0x70A2,0x70BB,0x70A0,0x70AA,0x3DAF,0x3DAE,0x70A8,0x70B6,0x70B2,0x70A7,
+ 0x3DAD,0x3DAB,0x70B9,0x722E,0x3E16,0x723C,0x3E30,0x726D,0x3E33,0x3E31,
+ 0x72E7,0x72ED,0x3E6E,0x72EC,0x72E5,0x72E2,0x3EB1,0x73C4,0x73BD,0x73CF,
+ 0x73C9,0x73C1,0x73D0,0x3EB7,0x73CE,
+ 21, /* first low-surrogate */
+ 0xDCDF, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xDCFE,
+ /* plane 3, row 14 */
+ 1 | (94 << 8), /* first, last */
+ 0x74ED,0x74EB,0x3F1A,0x74EF,0x7549,0x7550,0x7546,0x754A,0x3F59,
+ 0x754D,0x75A6,0x3F7A,0x3F78,0x3F7B,0x75A8,0x3FDE,0x3FEC,0x76C7,0x76FF,
+ 0x401E,0x76FD,0x77E6,0x780A,0x409B,0x7804,0x780B,0x7807,0x409D,0x7815,
+ 0x7808,0x40FD,0x79D3,0x79D4,0x79D0,0x79D7,0x7A7C,0x4194,0x4193,0x7A7D,
+ 0x7A83,0x7A82,0x41C6,0x7AD4,0x7AD5,0x7AD3,0x7AD0,0x7AD2,0x7AFE,0x7AFC,
+ 0x7C77,0x7C7C,0x7C7B,0x42B8,0xD87E,0x42B7,0x42B9,0x4353,0xD854,0x4352,
+ 0x4351,0x7F8F,0x80D3,0x43E3,0x80CB,0x80D2,0x43E2,0x8109,0x80E2,0x80DF,
+ 0x80C6,0x4463,0x8224,0x82F7,0x82D8,0x82DD,0x44AA,0x44A6,0x82F8,0x82FC,
+ 0x44A8,0x44A9,0x82E9,0x44AB,0x82EE,0x44AC,0x82D0,0x830E,0x82E2,0x830B,
+ 0x82FD,0x5179,0x8676,0x459E,0x8678,
+ 54, /* first low-surrogate */
+ 0xDD6A, 0, 0, 0,0xDD33,
+ /* plane 3, row 15 */
+ 1 | (94 << 8), /* first, last */
+ 0x459F,0x45A0,0x8675,0x867D,0x460F,0x8842,0x8866,0x461C,0x898C,
+ 0x8A05,0x46AE,0x8A06,0x46B0,0x8C9F,0x47D4,0x8FF1,0x8FE7,0x8FE9,0x8FEF,
+ 0x90C2,0x90BC,0x48BB,0x90C6,0x90C0,0x48C1,0x48C2,0x90CD,0x90C9,0x48BE,
+ 0x90C4,0x48E5,0x9581,0x49C6,0x9CEC,0x5032,0x4FF9,0x501D,0x4FFF,0x5004,
+ 0x4FF0,0x5003,0x462E,0x5002,0x4FFC,0x4FF2,0x5024,0x5008,0x5036,0x502E,
+ 0x3465,0x5010,0x5038,0x5039,0x4FFD,0x5056,0x4FFB,0x51A3,0x51A6,0x51A1,
+ 0x34D1,0x34D0,0x51C7,0x51C9,0x5260,0x5264,0x5259,0x5265,0x5267,0x5257,
+ 0x5263,0x34EE,0x5253,0x34EF,0x52CF,0x351E,0x52CE,0x52D0,0x52D1,0x52CC,
+ 0x354B,0x354D,0x3556,0x550D,0x54F4,0x3592,0x5513,0x54EF,0x54F5,0x54F9,
+ 0x5502,0x5500,0x3593,0x3590,0x5518,
+ /* plane 3, row 16 */
+ 1 | (94 << 8), /* first, last */
+ 0x54F0,0x54F6,0xD87E,0x3597,0x5519,0x3623,0x5705,0x57C9,0x363F,
+ 0x57B7,0x57CD,0x3643,0x3642,0x3644,0x57BE,0x57BB,0x3645,0x57DB,0x57C8,
+ 0x57C4,0x57C5,0x57D1,0x57CA,0x57C0,0x36D9,0x36DE,0x5A21,0x5A2A,0x36CF,
+ 0x5A1D,0x36CD,0x5A0B,0x36DD,0x36CE,0x36D3,0x36D6,0x5A22,0x36DC,0x36D1,
+ 0x5A24,0x36D0,0x5A14,0x5A31,0x36D5,0x5A2F,0x5A1A,0x5A12,0x36D4,0x36DB,
+ 0x5A26,0xD845,0x3743,0x5BBC,0x5BBB,0x5BB7,0x5C05,0x5C06,0x5C52,0x5C53,
+ 0x37CD,0x37D1,0x5CFA,0x5CEB,0x37CA,0x5CF3,0x5CF5,0x5CE9,0x5CEF,0x37D4,
+ 0x5E2A,0x5E30,0x5E2E,0x5E2C,0x5E2F,0x5EAF,0x5EA9,0x3886,0x5EFD,0x5F32,
+ 0x5F8E,0x5F93,0x5F8F,0x604F,0x6099,0x3933,0x607E,0x3937,0x6074,0x604B,
+ 0x6073,0x6075,0x392A,0x391F,0x6056,
+ 3, /* first low-surrogate */
+ 0xDC41, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xDF2E,
+ /* plane 3, row 17 */
+ 1 | (94 << 8), /* first, last */
+ 0x60A9,0x608B,0x60A6,0x3939,0x6093,0x60AE,0x609E,0x60A7,0x6245,
+ 0x39F2,0x39F8,0x632E,0x39F7,0x6352,0x6330,0x635B,0x39F4,0x6319,0x631B,
+ 0x39F1,0x6331,0x635D,0x6337,0x6335,0x6353,0x39F5,0x635C,0x633F,0x654B,
+ 0x3A87,0x4369,0x658B,0x3AB6,0x659A,0x6650,0x6646,0x664E,0x6640,0x3AE9,
+ 0x664B,0x6648,0x3AEB,0x6660,0x6644,0x664D,0x3B34,0x6837,0x6824,0x3B62,
+ 0x3B5C,0x681B,0x6836,0x3B60,0x682C,0x6819,0x6856,0x6847,0x683E,0x681E,
+ 0xD87E,0x6815,0x6822,0x6827,0x6859,0x6858,0x6855,0x6830,0x6823,0x6B2E,
+ 0x6B2B,0x6B30,0x6B6C,0x3C61,0x6B8B,0x3C7F,0x6BE9,0x6BEA,0x6BE5,0x6D6B,
+ 0x3CE5,0x3CE6,0x6D73,0x6D57,0x3CE9,0x3CF3,0x6D5D,0x6D56,0x6D8F,0x6D5B,
+ 0x6D1C,0x6D9A,0x6D9B,0x6D99,0x3CEE,
+ 60, /* first low-surrogate */
+ 0xDCE1,
+ /* plane 3, row 18 */
+ 1 | (94 << 8), /* first, last */
+ 0x6D81,0x6D71,0x3CED,0x3CEC,0x6D72,0x6D5C,0x6D96,0x70C4,0x70DB,
+ 0x70CC,0x70D0,0x70E3,0x70DF,0x3DB3,0x70D6,0x70EE,0x70D5,0x3DB5,0x3E27,
+ 0x3E35,0x3E36,0x727A,0x3E71,0x72F5,0x7302,0x3EB8,0x3EC2,0x73E2,0x73EC,
+ 0x73D5,0x73F9,0x73DF,0x73E6,0x3EC8,0x3EC0,0x3EC1,0x3EC4,0x73E4,0x73E1,
+ 0x74F3,0x3F1F,0x3F1C,0x3F1D,0x3F4D,0x7556,0x7555,0x7558,0x7557,0x755E,
+ 0x75C3,0x3F87,0x3F82,0x75B4,0x3F7D,0x75B1,0x3FDF,0x4000,0x76CB,0x76CC,
+ 0x772A,0x4020,0x7716,0x770F,0x4022,0x4024,0x773F,0x772B,0x770E,0x7724,
+ 0x4021,0x7721,0x7718,0x77DD,0x40A4,0x40A5,0x7824,0x7836,0x4101,0x7958,
+ 0x7959,0x4103,0x7962,0x79DA,0x79D9,0x4137,0x79E1,0x79E5,0x79E8,0x79DB,
+ 0x4138,0x79E2,0x79F0,0x4199,0x4198,
+ /* plane 3, row 19 */
+ 1 | (94 << 8), /* first, last */
+ 0x4197,0x41C9,0x7ADA,0x7ADD,0x41C7,0x7ADB,0x7ADC,0x41D9,0x41DB,
+ 0x7B0D,0x7B0B,0x7B14,0x7C8E,0x7C86,0x427B,0x7C87,0x7C83,0x7C8B,0x427C,
+ 0x42BD,0x42BC,0x42C3,0x7D24,0x42C1,0x42BF,0x42C4,0x7D25,0x7F62,0x7F93,
+ 0x7F99,0x7F97,0x437E,0x437F,0x7FC4,0x7FC6,0x800A,0x43B4,0x43B3,0x8040,
+ 0x803C,0x803B,0x80F6,0x80FF,0x80EE,0x8104,0x8103,0x8107,0xD87E,0x43E6,
+ 0x80F7,0x4459,0x445A,0x822D,0x4464,0x8227,0x8229,0x831F,0x8357,0x44B4,
+ 0x44B9,0x44B7,0x44B5,0x8321,0x44C1,0x44B1,0x8318,0x8358,0x44B3,0x44BA,
+ 0x458C,0x458B,0x458D,0x8684,0x869F,0x869B,0x8689,0x86A6,0x8692,0x868F,
+ 0x86A0,0x884F,0x8878,0x887A,0x886E,0x887B,0x8884,0x8873,0x4678,0x4677,
+ 0x8A0D,0x8A0B,0x8A19,0x46B2,0x47D6,
+ 48, /* first low-surrogate */
+ 0xDD83,
+ /* plane 3, row 20 */
+ 1 | (94 << 8), /* first, last */
+ 0x8ED0,0x4845,0x4892,0x4895,0x8FF9,0x9009,0x9008,0x48C6,0x90DE,
+ 0x9151,0x48E7,0x48E8,0x91DB,0x91DF,0x91DE,0x91D6,0x91E0,0x9585,0x9660,
+ 0x9659,0x49CB,0x9656,0x49CD,0x49F1,0x96BD,0x4B22,0x3421,0x5042,0x5059,
+ 0x346F,0x5044,0x5066,0x5052,0x5054,0x5071,0x5050,0x507B,0x507C,0x5058,
+ 0x3470,0x3464,0x5079,0x506C,0x5078,0x51A8,0x51D1,0x51CF,0x5268,0x5276,
+ 0x52D4,0x352D,0x53A0,0x53C4,0x3558,0x5558,0x554C,0x5568,0x35A6,0x5549,
+ 0x35A4,0x359F,0x555D,0x5529,0xD843,0x5554,0x5553,0x35A3,0x555A,0x35A0,
+ 0x553A,0x553F,0x552B,0x57EA,0x364A,0x57EF,0x3647,0x3648,0x57DD,0x57FE,
+ 0xD87E,0x57DE,0x57E6,0x3649,0x57E8,0x57FF,0x5803,0x58F7,0x68A6,0x591F,
+ 0x369E,0x595B,0x595D,0x595E,0xD845,
+ 64, /* first low-surrogate */
+ 0xDDAE, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xDC55, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xDE37,
+ /* plane 3, row 21 */
+ 1 | (94 << 8), /* first, last */
+ 0x36E8,0x5A2B,0x36EC,0x5A3B,0x36ED,0x36E6,0x5A61,0x5A3A,0x5A6E,
+ 0x5A4B,0x5A6B,0x36EB,0x36E7,0x5A45,0x5A4E,0x5A68,0x5A3D,0x5A71,0x5A3F,
+ 0x5A6F,0x5A75,0x36E9,0x5A73,0x5A2C,0x5A59,0x5A54,0x5A4F,0x5A63,0x375C,
+ 0x375D,0x5BC8,0x3760,0x5BC3,0x375B,0x5C5B,0x5C61,0x3799,0x5D21,0x5D0A,
+ 0x5D09,0x37D8,0x5D2C,0x5D08,0x37DA,0x37DD,0x5D2A,0x5D15,0x37E0,0x5D10,
+ 0x5D13,0x37E5,0x5D2F,0x5D18,0x37D7,0x5DE3,0x5E39,0x5E35,0x5E3A,0x5E32,
+ 0x384E,0x388C,0x3888,0xD87E,0x5EBB,0x5EBA,0x5F34,0x5F39,0x38CE,0xD87E,
+ 0x38E5,0x38E6,0x6098,0x3932,0x60D0,0x3940,0x3947,0x394C,0x60D7,0x60AA,
+ 0x3935,0x60A1,0x60A4,0x3930,0x60EE,0x3943,0x60E7,0x394D,0x60E8,0x60DE,
+ 0x39B7,0x39F3,0x637E,0x638B,0x3A02,
+ 63, /* first low-surrogate */
+ 0xDC8D, 0, 0, 0, 0, 0,0xDC9C,
+ /* plane 3, row 22 */
+ 1 | (94 << 8), /* first, last */
+ 0x3A0B,0x6379,0x6386,0x6393,0x3A04,0x6373,0x636A,0xD87E,0x636C,
+ 0x3A08,0x637F,0x39FC,0x63B2,0x63BA,0x39FF,0x3A00,0x6366,0x6374,0x3A8B,
+ 0x655A,0x3A8D,0x654E,0x654D,0x658D,0x658E,0x65AD,0x3ACA,0x65C7,0x65CA,
+ 0x3ACB,0x65C9,0xD87E,0x65E3,0x6657,0x3AF3,0x6663,0x6667,0x671A,0x6719,
+ 0x6716,0x3B36,0x3B6A,0x689E,0x68B6,0x6898,0x6873,0x3B6B,0x689A,0x688E,
+ 0x68B7,0x68DB,0x68A5,0x686C,0x68C1,0x6884,0x3B71,0x3B68,0x6895,0x687A,
+ 0x6899,0x3B72,0x68B8,0x68B9,0x6870,0x3C2E,0x6B35,0x3C62,0x6B90,0x6BBB,
+ 0x6BED,0x3C98,0x3CB5,0x3CEB,0x6DC1,0x6DC3,0x6DCE,0x3CFB,0x3CF8,0x6DAD,
+ 0x6E04,0x3CF5,0x6DB9,0x3D08,0x6DE7,0xD87E,0x6E08,0x6E06,0x3D0A,0x6E0A,
+ 0x6DB0,0x3D06,0x6DF8,0x6E0C,0x3CFD,
+ 8, /* first low-surrogate */
+ 0xDCBA, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xDCCB, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xDD07,
+ /* plane 3, row 23 */
+ 1 | (94 << 8), /* first, last */
+ 0x6DB1,0x3CFA,0x6E02,0x6E07,0x6E09,0x6E01,0x6E17,0x6DFF,0x6E12,
+ 0x3DBA,0x3DB9,0x7103,0x7107,0x7101,0x70F5,0x70F1,0x7108,0x70F2,0x710F,
+ 0x3DBB,0x70FE,0x3E18,0x3E40,0x3E3D,0x731A,0x7310,0x730E,0x7402,0x73F3,
+ 0x3ECD,0x3EC9,0x73FB,0x3ECB,0x3ECA,0x3ECE,0x751B,0x7523,0x7561,0x7568,
+ 0x3F5E,0x7567,0x75D3,0x3F91,0x3F8C,0x7690,0x3FE1,0x4002,0x76D5,0x76D7,
+ 0x76D6,0x7730,0x402B,0x7726,0x402A,0x7740,0x3E14,0x771E,0x40AD,0x40A3,
+ 0x40AB,0x7847,0x40AF,0x784B,0x7851,0x784F,0x7842,0x7846,0x4104,0x796E,
+ 0x796C,0x79F2,0x4144,0x79F1,0x79F5,0x79F3,0x79F9,0x413D,0x4147,0x419C,
+ 0x7A9A,0x7A93,0x7A91,0x7AE1,0x41E0,0x41E4,0x7B21,0x7B1C,0x7B16,0x7B17,
+ 0x7B36,0x7B1F,0x4280,0x7C93,0x7C99,
+ /* plane 3, row 24 */
+ 1 | (94 << 8), /* first, last */
+ 0x7C9A,0x7C9C,0x42CA,0x7D49,0x42D4,0x7D34,0x7D37,0x42D2,0x7D2D,
+ 0x42CB,0x7D4C,0x42CE,0x42D3,0x7D48,0x4344,0x4348,0x7F3B,0x4345,0x4381,
+ 0x4386,0x4385,0x8008,0x801A,0x43A3,0x801D,0x43B5,0x8049,0x8045,0x8044,
+ 0x7C9B,0x43FA,0x43F9,0x812A,0x812E,0x43FB,0x43F2,0x8131,0x43EF,0x811A,
+ 0x8134,0x8117,0x445B,0x4466,0x44CE,0x831D,0x8371,0x8384,0x8380,0x8372,
+ 0x83A1,0x35B4,0x8379,0x8391,0x44C8,0x839F,0x83AD,0x44D1,0x44C5,0x8323,
+ 0x44D2,0x8385,0x839C,0x83B7,0x8658,0x865A,0x458F,0x8657,0x86B2,0x45A7,
+ 0x86AE,0x45A5,0x45A4,0x4611,0x8845,0x889C,0x8894,0x88A3,0x888F,0x88A5,
+ 0x88A9,0x88A6,0x888A,0x88A0,0x8890,0x8992,0x8991,0x8994,0x46B5,0x8A26,
+ 0x8A32,0x8A28,0x46B4,0x46BD,0x8A1C,
+ /* plane 3, row 25 */
+ 1 | (94 << 8), /* first, last */
+ 0x46BB,0x8A2B,0x8A20,0x46B9,0x8A29,0x46C2,0x46BE,0x46BA,0x8A21,
+ 0x8C3A,0x3AB7,0x8C5B,0x8C58,0x8C7C,0x4758,0x8CA6,0x8CAE,0x8CAD,0x8D65,
+ 0x479B,0x8D7E,0x479C,0x8D7C,0x8D7F,0x8D7A,0x8DBD,0x47DA,0x47DE,0x8DC0,
+ 0x8DBB,0x8EAD,0x8EAF,0x8ED6,0x484D,0x4846,0x4847,0x484B,0x484C,0x8ED9,
+ 0x4848,0x4899,0x9012,0x900E,0x9025,0x489B,0x9013,0x90EE,0x48CE,0x90AB,
+ 0x90F7,0x48EB,0x9159,0x9154,0x91F2,0x91F0,0x91E5,0x91F6,0x491C,0x498C,
+ 0x9587,0x49D1,0x965A,0x49D6,0x49D3,0x966E,0x49D4,0x49D0,0x49D5,0x9679,
+ 0x4A0B,0x98E1,0x98E6,0x4BC6,0x9EC4,0x9ED2,0x4E80,0x3424,0x4E81,0x508F,
+ 0x5097,0x5088,0x5089,0x3474,0x347A,0x5081,0x5160,0xD841,0x34C3,0x5E42,
+ 0x51D3,0x34D4,0x34D5,0x51D2,0x51D6,
+ 87, /* first low-surrogate */
+ 0xDD64,
+ /* plane 3, row 26 */
+ 1 | (94 << 8), /* first, last */
+ 0x5273,0x34FB,0x5270,0x34F7,0x3532,0xD87E,0x53A8,0x53A6,0x53C5,
+ 0x5597,0x55DE,0x35BA,0x35BF,0x5596,0x55B4,0x35C7,0x5585,0x35B7,0x559B,
+ 0x55A0,0x35B9,0x5559,0x35C3,0x5586,0x35BD,0x35D0,0x55AF,0x557A,0x35C1,
+ 0x35BE,0x35CD,0x559E,0x35CB,0x55A9,0x570F,0x570E,0x581A,0x364F,0x581F,
+ 0x3653,0x583C,0x5818,0x583E,0x5826,0x3655,0x583A,0xD844,0x5822,0x3651,
+ 0x58FB,0x5963,0x5964,0x369F,0x5AA8,0x5AA3,0x5A82,0x5A88,0x5AA1,0x5A85,
+ 0x5A98,0x36FE,0x5A99,0x36FB,0x5A89,0x5A81,0x5A96,0x5A80,0x36F1,0x36F5,
+ 0x5A91,0x36EF,0x3704,0x3703,0x36F4,0x5ACF,0x36F3,0x3702,0x36F7,0x36FA,
+ 0x36FD,0x36EE,0x5A87,0x5AA0,0x36F0,0x5A79,0x36F2,0x5A86,0x5AAB,0x5AAA,
+ 0x5AA4,0x5A8D,0x5A7E,0x3744,0x5BD5,
+ 6, /* first low-surrogate */
+ 0xDC33, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDF64,
+ /* plane 3, row 27 */
+ 1 | (94 << 8), /* first, last */
+ 0x3762,0x3777,0x3DC9,0x5C1E,0x5C5F,0x5C5E,0x5D44,0x5D3E,0x37E8,
+ 0x5D48,0x5D1C,0x37EF,0x5D5B,0x5D4D,0x37E6,0x37ED,0x5D57,0x37E7,0x5D53,
+ 0x5D4F,0x37EB,0x5D3B,0x5D46,0x382D,0x3855,0x5E46,0x5E47,0x3853,0x5E48,
+ 0x5EC0,0x5EBD,0x5EBF,0x3890,0x5F11,0x38BE,0x5F3E,0x5F3B,0x38BD,0x5F3A,
+ 0x38CF,0x38D0,0x38EC,0x5FA7,0x394B,0x60EA,0x3948,0x6107,0x6122,0x610C,
+ 0x3955,0x3951,0x60B3,0x60D6,0x60D2,0x394E,0x60E3,0x60E5,0x60E9,0x396B,
+ 0x395E,0x6111,0x60FD,0x3960,0x3967,0x611E,0x6120,0x6121,0x621E,0x39B8,
+ 0x63E2,0x63DE,0x63E6,0x3A14,0x3A0F,0x3A07,0x3A13,0x63F8,0x3A17,0x63FE,
+ 0x63C1,0x63BF,0x63F7,0x63D1,0x655F,0x6560,0x6561,0x3A9A,0x3AB8,0x65D1,
+ 0x3AF7,0x3AF8,0x667D,0x666B,0x667F,
+ /* plane 3, row 28 */
+ 1 | (94 << 8), /* first, last */
+ 0x3AFD,0x3AF5,0x6673,0x6681,0x666D,0x6669,0x3AFA,0x3B38,0x671E,
+ 0x68ED,0x3B87,0x3B80,0x3B88,0x3B79,0x6903,0x3B7C,0x68FE,0x68E5,0x691E,
+ 0x6902,0x3B83,0x3B85,0x6909,0x68CA,0x6900,0xD87E,0x6901,0x6918,0x68E2,
+ 0x68CF,0x3B7B,0x692E,0x68C5,0x68FF,0x3B86,0x691C,0x68C3,0x3C34,0x6B6F,
+ 0x3C55,0x6B6E,0x3C68,0x6BBE,0x3C9C,0x6BF4,0x6C2D,0x3CFC,0x6DB6,0x6E75,
+ 0x6E1E,0x3D1A,0x6E18,0x3D17,0x6E48,0x3D1B,0x6E4F,0x3D13,0x6E42,0x6E6A,
+ 0x6E70,0x6DFE,0x3D05,0x3D07,0x6E6D,0x3D1C,0x6E7B,0x6E7E,0x6E59,0x3D11,
+ 0x6E57,0x3D16,0x6E80,0x6E50,0x3D15,0x6E29,0x6E76,0x6E2A,0x6E4C,0x712A,
+ 0x3DCB,0x7135,0x712C,0x7137,0x711D,0x3DC5,0x3DC2,0x7138,0x3DCD,0x7134,
+ 0x712B,0x7133,0x7127,0x7124,0x3DCA,
+ 26, /* first low-surrogate */
+ 0xDCE5,
+ /* plane 3, row 29 */
+ 1 | (94 << 8), /* first, last */
+ 0x712D,0x7232,0x7283,0x7282,0x7287,0x7306,0x7324,0x7338,0x732A,
+ 0x732C,0x732B,0x3E83,0x732F,0x7328,0x7417,0x3ED6,0x3ED5,0x7419,0x7438,
+ 0x3ED1,0x741F,0x7414,0x743C,0x73F7,0x741C,0x7415,0x7418,0x7439,0x74F9,
+ 0x7524,0xD87E,0x3F52,0x3F5F,0x756E,0x756D,0x7571,0x758E,0x3F95,0x75E5,
+ 0x3F9D,0x3F98,0x3F9E,0x3F96,0x7694,0x76B3,0x4003,0x76D9,0x402F,0x7748,
+ 0x7749,0x7743,0x4031,0x4033,0x7742,0x77DF,0x40B4,0x7863,0x7876,0x40B0,
+ 0x785F,0x7866,0x7966,0x7971,0x4108,0x4107,0x7976,0x7984,0x7975,0x79FF,
+ 0x7A07,0x414E,0x7A0E,0x7A09,0x4150,0x4152,0x41A1,0x41A3,0x41A5,0x41CC,
+ 0x7AE7,0x7AE2,0x7B55,0x41EF,0x41EA,0x7B43,0x7B57,0x7B6C,0x7B42,0x7B53,
+ 0x41ED,0x7B41,0x4285,0x4284,0x7CA7,
+ 31, /* first low-surrogate */
+ 0xDD34,
+ /* plane 3, row 30 */
+ 1 | (94 << 8), /* first, last */
+ 0x7CA0,0x7CA6,0x7CA4,0x7D74,0x42DB,0x7D59,0x42D9,0x7D60,0x7D57,
+ 0x7D6C,0x7D7E,0x7D64,0x42D7,0x7D5A,0x7D5D,0x42DA,0x42DE,0x42D8,0x7D76,
+ 0x7D4D,0x7D75,0x42D5,0x7FD3,0x7FD6,0x439C,0x439D,0x8060,0x804E,0x8145,
+ 0x813B,0x43FE,0x8148,0x8142,0x8149,0x8140,0x8114,0x8141,0x4407,0x81EF,
+ 0x81F6,0x8203,0x446A,0x83ED,0x44E7,0x83DA,0x8418,0x83D2,0x8408,0x44E2,
+ 0x8400,0x44DF,0x44E1,0x44E5,0x8417,0x8346,0x8414,0x83D3,0x8405,0x841F,
+ 0x8402,0x8416,0x83CD,0x83E6,0x4591,0x865D,0x86D5,0x86E1,0x45B4,0x45B0,
+ 0x45B5,0x45AE,0x86EE,0x8847,0x8846,0x462D,0x462C,0x88BB,0x462B,0x88BF,
+ 0x88B4,0x4629,0x88B5,0x467F,0x899A,0x8A43,0x46C9,0x46CB,0x8A5A,0x46C5,
+ 0x46C6,0x46CA,0x8A35,0x8A38,0x8A42,
+ /* plane 3, row 31 */
+ 1 | (94 << 8), /* first, last */
+ 0x8A49,0x8A5D,0x8A4B,0x8A3D,0x46D2,0x46D0,0x472D,0x4735,0x8C60,
+ 0x8C5E,0x8C7F,0x8C7E,0x8C83,0x476C,0x8CB1,0x8D87,0x479D,0x47A0,0x8D88,
+ 0x8D83,0x47A2,0x479F,0x8D86,0x8D8B,0x8D82,0x8DCA,0x8DD2,0x47EB,0x47E2,
+ 0x8DD4,0x8DC9,0x8EB0,0x4836,0x4832,0x4850,0x8EF2,0x8EE4,0x8EF3,0x8EEA,
+ 0x484F,0x8EFD,0x4852,0x8F9D,0x902B,0x902A,0x489E,0x9028,0x9029,0x902C,
+ 0x48A0,0x489C,0x903A,0x9030,0x9037,0x903B,0x48D1,0x910A,0x48EF,0x48F0,
+ 0x48F1,0x91FE,0x9220,0x491D,0x920B,0x491F,0x9218,0x9222,0x491E,0x921B,
+ 0x9208,0x4920,0x920E,0x9213,0x498E,0x4991,0x9595,0xD863,0x4990,0x49D7,
+ 0x968C,0x967B,0x967F,0x9681,0x49D9,0x9682,0x49F4,0x49F6,0x3560,0x49F5,
+ 0x49F3,0x96EE,0x96ED,0x4A0C,0x96EC,
+ 77, /* first low-surrogate */
+ 0xDCDD,
+ /* plane 3, row 32 */
+ 1 | (94 << 8), /* first, last */
+ 0x975F,0x976F,0x4A51,0x976D,0x4AA6,0x4AA7,0x4AA8,0x4B27,0x4B24,
+ 0x4B25,0x98F0,0x4B2A,0x4B74,0x4BC7,0x9AA9,0x4BE7,0x4BED,0x9AE0,0x4EB7,
+ 0x342E,0x347B,0x50CC,0x50BC,0x347C,0x50AA,0x50B9,0x347D,0x50AB,0x50C3,
+ 0x50CD,0x517E,0x527E,0x5279,0x34FD,0xD87E,0x52E1,0x52E0,0x52E7,0x5380,
+ 0x53AB,0x53AA,0x53A9,0x53E0,0x55EA,0x35DA,0x55D7,0x35D6,0x35DB,0x55C1,
+ 0x5715,0x365B,0x586C,0x365C,0x585C,0x5850,0x5861,0x586A,0x5869,0x5856,
+ 0x5860,0x5866,0x585F,0x5923,0x5966,0x5968,0x3706,0x370B,0x5ACE,0x370D,
+ 0x5AC5,0x5AC3,0x370A,0x3713,0x5AD0,0x3710,0x3712,0x3709,0x3708,0x3711,
+ 0x370F,0x5B74,0x5B76,0x5BDC,0x5BD7,0x5BDA,0x5BDB,0x3767,0x5C20,0x5D6D,
+ 0x5D66,0x37F6,0x5D64,0x5D6E,0xD87E,
+ 35, /* first low-surrogate */
+ 0xDC23, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xDC7E,
+ /* plane 3, row 33 */
+ 1 | (94 << 8), /* first, last */
+ 0x5D60,0x5F42,0x5F5A,0x5F6E,0x3964,0x396C,0x6130,0x613A,0x612A,
+ 0x6143,0x6119,0x6131,0x396D,0x613D,0x397A,0x3975,0x3A0D,0x6408,0x6432,
+ 0x6438,0x3A1E,0x6431,0x3A1B,0x6419,0x3A2A,0x6411,0x3A1F,0x3A22,0x6429,
+ 0x641D,0x3A25,0x3A27,0x3A29,0x643C,0x3A24,0x6446,0x6447,0x3A28,0x3A26,
+ 0x643A,0x6407,0x3A23,0x656B,0x3A9F,0x6570,0x656D,0x3AB1,0x65E4,0x6693,
+ 0x3B03,0x3B07,0x3B0C,0x3B06,0x668F,0x3B04,0x3B09,0x6692,0x3B05,0x668E,
+ 0x3B08,0x6946,0x3B96,0x3B9C,0x3B9F,0x3B9B,0x3B98,0x3B99,0x3B94,0x6931,
+ 0x3B8D,0x3BA3,0x693E,0x3B93,0x697C,0x6943,0x3B92,0x6973,0xD87E,0x6955,
+ 0x3B8E,0x3B8C,0x6985,0x694D,0x6950,0x6947,0x6967,0x6936,0x6964,0x6961,
+ 0x3B9A,0x697D,0x6B44,0x6B40,0x6B71,
+ 78, /* first low-surrogate */
+ 0xDCE8,
+ /* plane 3, row 34 */
+ 1 | (94 << 8), /* first, last */
+ 0x6B73,0x6B9C,0x3C6A,0x3C6D,0x3C84,0x6BC1,0x3CA0,0x6BFA,0x6C31,
+ 0x6C32,0x3D1D,0x3D26,0x6EB8,0x6EA8,0x3D33,0x6E91,0x6EBB,0x3D38,0x6E9A,
+ 0x3D30,0x3D28,0x6EA9,0x3D27,0x3D2A,0x6EB5,0x6E6C,0x6EE8,0x3D31,0x6EDD,
+ 0x6EDA,0x6EE6,0x6EAC,0x3D34,0x3D2E,0x3D3B,0x6ED9,0x6EE3,0x6EE9,0x6EDB,
+ 0x3D29,0x716F,0x3DD2,0x3DD8,0x7148,0x3DCF,0x714A,0x716B,0x3DD9,0x714F,
+ 0x7157,0x7174,0x3DCE,0x3DD3,0x3DD0,0x7145,0x7151,0x716D,0x3BA1,0x7251,
+ 0x7250,0x724E,0x3E47,0x7341,0x3E8B,0x732E,0x7346,0x3ED4,0x7427,0x3EDE,
+ 0x7448,0x7453,0x743D,0x3EDF,0x745D,0x7456,0x3ED7,0x741E,0x7447,0x7443,
+ 0x7458,0x7449,0x3EE1,0x744C,0x7445,0x743E,0x3F2F,0x7501,0x751E,0x3F62,
+ 0x3F63,0x757A,0x75EE,0x7602,0x7697,
+ /* plane 3, row 35 */
+ 1 | (94 << 8), /* first, last */
+ 0x7698,0x3FE2,0x4004,0x4043,0x775D,0x7764,0x7753,0x7758,0x7882,
+ 0x7890,0x788A,0x40BE,0x787A,0x787D,0x40BA,0x788B,0x7878,0x40BC,0xD87E,
+ 0x788D,0x7888,0x7892,0x7881,0x797E,0x7983,0x410D,0x410E,0x4111,0x7980,
+ 0x410F,0x4112,0x4155,0x7A0F,0x4159,0x415B,0x7A1D,0x4157,0x7AA1,0x7AA4,
+ 0x41CE,0x7AE9,0x7AEA,0x41FE,0x7B62,0x7B6B,0x41FC,0x7B5E,0x41F5,0x7B79,
+ 0x41F9,0x41FA,0x7B6F,0x7B68,0x4288,0x4289,0x7CAE,0x428A,0x4287,0x428B,
+ 0x7CB0,0x42E6,0x7D90,0x42ED,0x7D8A,0x42E5,0x7D8B,0x7D99,0x7D95,0x42E0,
+ 0x7D87,0x7D78,0x7D97,0x7D89,0x7D98,0x42E1,0x435B,0x435C,0x7FA3,0x438F,
+ 0x438B,0x438D,0x7FDD,0x8057,0x43B9,0x8163,0x816A,0x816C,0x440F,0x4419,
+ 0x4413,0x815D,0x8175,0x4418,0x815F,
+ 19, /* first low-surrogate */
+ 0xDD4E,
+ /* plane 3, row 36 */
+ 1 | (94 << 8), /* first, last */
+ 0x4416,0x817D,0x816D,0x4453,0xD87E,0x8241,0x844F,0x8484,0x44F6,
+ 0x847F,0x44F5,0x8448,0x842A,0x847B,0x8472,0x8464,0x842E,0x845C,0x8453,
+ 0x44F7,0x8441,0x84C8,0x44F0,0x8462,0x8480,0x843E,0x8483,0x8471,0x44F9,
+ 0x844A,0x8455,0x8458,0x4592,0x4595,0x4596,0x86FC,0x86FD,0x8715,0x45B9,
+ 0x8716,0x86FF,0x45BD,0x45B8,0x4612,0x8858,0x88CF,0x88E0,0x4680,0x4681,
+ 0x469A,0x4698,0x89E7,0x8A6A,0x8A80,0x46D4,0x8A6F,0x8A65,0x46DA,0x8A78,
+ 0x8A7D,0x8A88,0x46D6,0x46DB,0x8A64,0x8A7E,0x46DC,0x8A67,0x8C63,0x8C88,
+ 0x4771,0x8CCD,0x4772,0x8CC9,0x47A8,0x8DED,0x47F0,0xD87E,0x47F1,0x47FD,
+ 0x4838,0x4837,0x4839,0x8EB1,0x4855,0x4853,0x8F04,0x8F9E,0x8FA0,0x9043,
+ 0x9046,0x9048,0x9045,0x9040,0x904C,
+ 5, /* first low-surrogate */
+ 0xDD8D, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDDDB,
+ /* plane 3, row 37 */
+ 1 | (94 << 8), /* first, last */
+ 0x48D5,0x48BD,0x910C,0x9113,0x9115,0x48F5,0x916B,0x9167,0x925D,
+ 0x9255,0x9235,0x4921,0x9259,0x922F,0x923C,0x928F,0x925C,0x926A,0x9262,
+ 0x925F,0x926B,0x926E,0x923B,0x9244,0x9241,0x959A,0x4992,0x9599,0x49DE,
+ 0x49DB,0x49DA,0x968F,0x49DF,0x9696,0x49F9,0x49F8,0x49FA,0x96F4,0x96FC,
+ 0x4A0E,0x9755,0x4A43,0x9779,0x4A56,0x4A53,0x4A9E,0x97EE,0x97F5,0x4AA9,
+ 0x980B,0x4AFA,0x98F3,0x4B31,0x4B30,0x98F7,0x98FF,0x98F5,0x4B32,0x98EC,
+ 0x98F1,0x4B29,0x4B2E,0x999A,0x4B76,0x9AE2,0x9B3D,0x9B5D,0x9CE8,0x4CA5,
+ 0x9CEB,0x9CEF,0x9CEE,0x9E81,0x9F14,0x50D0,0x50D9,0x50DC,0x50D8,0x348C,
+ 0x50E1,0x50EB,0x348B,0x3489,0x50F4,0x50E2,0x50DE,0x348D,0x3486,0x34D7,
+ 0x51F4,0x3504,0x3507,0x3503,0x52ED,
+ /* plane 3, row 38 */
+ 1 | (94 << 8), /* first, last */
+ 0x52EA,0x3522,0x5332,0x3551,0x53AE,0x53B0,0x3561,0x55FB,0x5603,
+ 0x560B,0x35E9,0x5607,0x35E5,0x55F8,0x35E4,0x5628,0x561E,0x35E3,0x5618,
+ 0x5611,0x5651,0x5605,0x5717,0x5892,0x3665,0x588C,0x3663,0x5878,0x5884,
+ 0x5873,0x58AD,0x5897,0x5895,0x5877,0x5872,0x5896,0x588D,0x5910,0x368C,
+ 0x596C,0x371A,0x5AE7,0x3715,0x5AE4,0x3720,0x3721,0x5AEF,0x5626,0x371C,
+ 0x371B,0x5AF0,0x5D7B,0x37FE,0x5D83,0x3804,0x3801,0x5D8B,0x5D8C,0x3800,
+ 0x5D78,0x5E52,0x386D,0x3893,0x5ED0,0x5ECF,0x38A1,0x5FB3,0x5FB4,0x3976,
+ 0x3979,0x3972,0x617B,0x3983,0x616F,0x6181,0x613C,0x6142,0x6138,0x6133,
+ 0xD87E,0x6160,0x6169,0x617D,0x6186,0x622C,0x6228,0x3A38,0x644C,0x3A30,
+ 0x6457,0x647C,0x3A34,0x3A3A,0x6455,
+ 80, /* first low-surrogate */
+ 0xDCA6,
+ /* plane 3, row 39 */
+ 1 | (94 << 8), /* first, last */
+ 0x6462,0x6471,0x646A,0x6456,0x643B,0x6481,0x3A35,0x644F,0x647E,
+ 0x6464,0x3A3F,0x3A40,0x3A32,0x3A31,0x3A36,0x6571,0xD84C,0x3B0F,0x66A5,
+ 0x669A,0x669C,0x3B10,0x66A6,0x3B0D,0x66A4,0x698F,0x69C5,0x69C8,0x6992,
+ 0x69B2,0x3BA9,0x3BB4,0x3BAC,0x69E3,0x69C0,0x69D6,0x69D1,0x699F,0x69A2,
+ 0x69D2,0x3BB8,0x3BAE,0xD84D,0x69E1,0x69D5,0x699D,0x3BB3,0x3BBA,0x6998,
+ 0x3C3F,0x6B74,0x6BA1,0x3D3C,0x6EF0,0x6EF3,0x3D42,0x3D40,0x6F1B,0x6F0C,
+ 0x6F1D,0x6F34,0x6F28,0x6F17,0x3D3E,0x6F44,0x6F42,0x6F04,0x6F11,0x6EFA,
+ 0x6F4A,0x7191,0x718E,0x3DE1,0x718B,0x718D,0x717F,0x718C,0x717E,0x717C,
+ 0x7183,0x3DE6,0x7188,0x3DE0,0x3E15,0x7294,0x3E93,0x7355,0x7353,0x734F,
+ 0x7354,0x746C,0x7465,0x7466,0x7461,
+ 17, /* first low-surrogate */
+ 0xDCBA, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xDDF3,
+ /* plane 3, row 40 */
+ 1 | (94 << 8), /* first, last */
+ 0x746B,0x7468,0x7476,0x3EE7,0x7460,0xD852,0x7474,0x7506,0x760E,
+ 0x3FAD,0x7607,0x3FAE,0x3FE3,0x76B9,0x3FF5,0x76B7,0x76E2,0x4006,0x7774,
+ 0x7777,0x7776,0x7775,0x404F,0x7778,0x7771,0x4054,0x777A,0x715B,0x777B,
+ 0x78A6,0x78AE,0x78B8,0x40CB,0x40E3,0x40C9,0x78B1,0x78AF,0x4113,0x7989,
+ 0x7987,0x4115,0x4161,0x7A29,0x4166,0x7A2A,0x4164,0x7A2D,0x7A2C,0x4160,
+ 0x7A32,0x4163,0x7AEC,0x7AF0,0x7B81,0x7B9E,0x7B83,0x420A,0x7B92,0x4204,
+ 0x7BA3,0x7B9F,0x7B93,0x4207,0x7B86,0x7CB8,0x7CB7,0x428D,0x428F,0x4290,
+ 0x4292,0x42EC,0x7DC8,0x7DB6,0xD87E,0x7DD1,0x42E7,0x7DA8,0x7DAB,0x42F2,
+ 0x7DB3,0x7DCD,0x42EE,0x7DCF,0x7DA4,0x42EF,0x434C,0x7F41,0x7F6F,0x7F71,
+ 0x435E,0x435F,0x4376,0x4374,0x4372,
+ 6, /* first low-surrogate */
+ 0xDE0F, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xDD6C,
+ /* plane 3, row 41 */
+ 1 | (94 << 8), /* first, last */
+ 0x4390,0x8023,0x805B,0x43BE,0x8061,0x805F,0x8181,0x4426,0x4425,
+ 0x8184,0x8213,0x4474,0x824A,0x824C,0x44FD,0x4505,0x4501,0x84BD,0x8495,
+ 0x4509,0x8492,0x84C3,0x450C,0x8496,0x84A5,0x84B5,0x84B3,0x84A3,0x84E4,
+ 0x84D8,0x84D5,0x450D,0x84B7,0x84AD,0x84DA,0x8493,0x8736,0x45C0,0x45C5,
+ 0x45C9,0x873D,0x872B,0x8747,0x8739,0x45D5,0x8745,0x871D,0x4641,0x88FF,
+ 0x88EA,0x4633,0x88F5,0x463A,0x8900,0x88ED,0x8903,0x88E9,0x4640,0x4642,
+ 0x89EA,0x46E8,0x8A9B,0x8A8E,0x8AA2,0x46E4,0x8A9C,0x8A94,0x8A90,0x8AA9,
+ 0x8AAC,0x46E7,0x8A9F,0x46E6,0x46E1,0x8A9D,0x4739,0x8C67,0x475C,0x4775,
+ 0x8CD0,0x8CD6,0x8CD4,0x8D98,0x8D9A,0x8D97,0x47AE,0x47B0,0x47FA,0x8E0B,
+ 0x8E08,0x8E01,0x8EB4,0x8EB3,0x485B,
+ /* plane 3, row 42 */
+ 1 | (94 << 8), /* first, last */
+ 0x8FA1,0x8FA2,0x48A5,0x905A,0x48A2,0x9061,0x905F,0x48DB,0x48DA,
+ 0x9125,0x917B,0x9176,0x917C,0x4924,0x9289,0x92F6,0x92B1,0x92AD,0x9292,
+ 0x9281,0x9284,0x4926,0x92AE,0x9290,0x929E,0x4998,0x4996,0x499A,0x95A2,
+ 0x95A7,0x4997,0x49E1,0x49E0,0x49E3,0x49E2,0x96A0,0x969D,0x969F,0x96D0,
+ 0x49FB,0x96D1,0x4A12,0x4A14,0x9759,0x4A45,0x9764,0x4A5C,0x4A5D,0x4AB8,
+ 0x9819,0x4ABA,0x9814,0x9815,0x981A,0x4B03,0x4B35,0x4B36,0x4B39,0x9906,
+ 0x4B2D,0x98F8,0x9901,0x4B7A,0x99BE,0x99BC,0x99B7,0x99B6,0x99C0,0x4B78,
+ 0x99B8,0x4B7B,0x4B7C,0x4B7E,0x99C4,0x4B7D,0x99BF,0x4BC9,0x9ADA,0x9AE4,
+ 0x9AE9,0x9AE8,0x9AEA,0x9AE5,0x4BF3,0x9B26,0x4C1A,0x4C19,0x9B40,0x4C1F,
+ 0x4CA6,0x4CA7,0x4CA8,0x4CAB,0x4CA9,
+ /* plane 3, row 43 */
+ 1 | (94 << 8), /* first, last */
+ 0x4D2E,0x9EBD,0x4D5E,0x3495,0x3493,0x3492,0x510E,0x3496,0x50F7,
+ 0x3497,0x50FC,0x510D,0x5101,0x51DA,0x51D9,0x51DB,0x5286,0x528E,0x52EE,
+ 0x5333,0x53B1,0x35F5,0x5647,0x562D,0x5654,0x35EA,0x564B,0x5652,0x5631,
+ 0x5644,0x5656,0x5650,0x562B,0x35F3,0x564D,0x5637,0x564F,0x58A2,0x58B7,
+ 0x3669,0x58B2,0x366B,0x58AA,0x58B5,0x58B0,0x366C,0x58B4,0x58A4,0x58A7,
+ 0x3668,0x5926,0x5AFE,0x3728,0x5B04,0x3726,0x5AFC,0x3725,0x5B06,0x5B0A,
+ 0x5AFA,0x5B0D,0x5B00,0x5B0E,0x376B,0x380F,0x3808,0x5D91,0x380C,0x5D8F,
+ 0x5D90,0x5D98,0x5DA4,0x5D9B,0x5DA3,0x5D96,0x5DE4,0x5E5A,0x3860,0x3862,
+ 0x5E5E,0x3898,0x5FB8,0x6157,0x615C,0x61A6,0x6195,0x6188,0x398A,0x61A3,
+ 0x618F,0x3984,0x6164,0x397F,0x6159,
+ /* plane 3, row 44 */
+ 1 | (94 << 8), /* first, last */
+ 0x6178,0x3982,0x6185,0x6187,0x619E,0x3996,0x3989,0x6198,0x619C,
+ 0x398D,0x39BC,0x622F,0x6480,0x649B,0x648E,0x648D,0x6494,0x64C6,0x3A44,
+ 0x64A8,0x6483,0x3A3C,0x64B9,0x6486,0x64B4,0x64AF,0x6491,0x3A4E,0x64AA,
+ 0x64A1,0x64A7,0x66B6,0x66B3,0x3B14,0x66BC,0x66AC,0x3B15,0x66AD,0x6A0E,
+ 0x3BCE,0x6A1C,0x6A1A,0x3BE0,0x3BC2,0x6A0B,0x3BBF,0x69EF,0x6A0C,0x69F0,
+ 0x6A22,0x3BC4,0x69D8,0x3BCF,0x6A12,0x69FA,0x3BC8,0x6A2A,0x3BCC,0x6A10,
+ 0x3BCD,0x3BC7,0x6A29,0x69F9,0x69EA,0x6A2C,0x6A24,0x4CB7,0x69E9,0x6B52,
+ 0x6B4F,0x6B53,0x3C43,0x3CB6,0x6F10,0x6F65,0x6F75,0x3D51,0x3D4A,0x3D4D,
+ 0x3D56,0x6FD0,0x3D53,0x6F5C,0x6F3D,0x6F71,0x3D59,0x6F91,0x6F0B,0x6F79,
+ 0x6F81,0x6F8F,0x3D4E,0x6F59,0x6F74,
+ /* plane 3, row 45 */
+ 1 | (94 << 8), /* first, last */
+ 0x3DEE,0x71AE,0x3DEC,0x71A3,0x71AD,0x3DEB,0x3DEF,0x71AB,0x71A6,
+ 0x71A2,0x3DED,0x52F2,0x7257,0x7255,0x7299,0x734B,0x747A,0x3EF2,0x3EEF,
+ 0x3EF1,0x748C,0x7484,0x3EED,0x3EF0,0x7482,0x7493,0x747B,0x3EEE,0x7509,
+ 0x4C1B,0x3F50,0x3F66,0x3684,0x3FB8,0x3FF6,0x778A,0x4057,0x7790,0x405E,
+ 0x78C6,0x78D3,0x78C0,0x78D2,0x78C7,0x78C2,0x4119,0x799F,0x799D,0x799E,
+ 0x4170,0x7A41,0x416E,0x7A38,0x7A3A,0x7A42,0x4172,0x4176,0x7A3E,0x7AB0,
+ 0x7BAE,0x7BB3,0x4212,0x421F,0x7BBF,0x4211,0x4216,0x7BCD,0x4219,0x7BB2,
+ 0x4224,0x4214,0x4225,0x4295,0x4296,0x4293,0x4294,0x7CC4,0x7CCD,0x7CC2,
+ 0x7CC6,0x7CC3,0x7CC9,0x7CC7,0x42A0,0x7DF8,0x42FB,0x7DED,0x7DE2,0x42FC,
+ 0x4300,0x42F8,0x7DDC,0x7E02,0x7E01,
+ /* plane 3, row 46 */
+ 1 | (94 << 8), /* first, last */
+ 0x42F9,0x7DD6,0x4304,0x7DE4,0x7DFE,0x4303,0x7E00,0x7DFC,0x7DFD,
+ 0x42F3,0x7DF5,0x7DFF,0x42FA,0x7DEB,0x7DE5,0x7F78,0x7FAE,0x7FE7,0x43BF,
+ 0x8065,0x806A,0x8066,0x8068,0x806B,0x8194,0x81A1,0x8192,0x8196,0x8193,
+ 0x4479,0x4510,0x8501,0x4514,0x84F8,0x450E,0x84F5,0x451A,0x8504,0x4519,
+ 0x4521,0x4523,0x451F,0x851B,0x8503,0x8533,0x8534,0x84ED,0x4525,0x452B,
+ 0x8535,0x4516,0x8505,0x4522,0x451B,0x45CE,0x45CF,0x877D,0x45CB,0x45D1,
+ 0x45CC,0x8771,0x4617,0x885C,0x88E6,0x890F,0x891B,0x4651,0x89A9,0x89A5,
+ 0x89EE,0x8AB1,0x46ED,0x8ACC,0x8ACE,0x46F4,0x8AB7,0x46F1,0x8AB5,0x8AE9,
+ 0x8AB4,0x46F8,0x8AB3,0x8AC1,0x8AAF,0x8ACA,0x8AD0,0x472F,0x475E,0x475D,
+ 0x8C8E,0x4776,0x4777,0x8CE9,0x8CDB,
+ /* plane 3, row 47 */
+ 1 | (94 << 8), /* first, last */
+ 0x477E,0x8CEB,0x8DA4,0x47B6,0x8DA2,0x8D9D,0x47B3,0x47FC,0x4803,
+ 0x4800,0x8E2A,0x8E28,0x480A,0x4802,0x8EB8,0x8EB6,0x8EB9,0x8EB7,0x8F22,
+ 0x8F2B,0x8F27,0x8F19,0x8FA4,0x4887,0x8FB3,0x48A6,0x9071,0x906A,0x48A9,
+ 0x48DE,0x9188,0x918C,0x92BF,0x92B8,0x92BE,0x92DC,0x92E5,0x492E,0x492D,
+ 0x92D4,0x92D6,0x4930,0x92DA,0x92ED,0x92F3,0x92DB,0x492B,0x92B9,0x92E2,
+ 0x92EB,0x95AF,0x499E,0x95B2,0x95B3,0x499F,0x49E5,0x49E4,0x96A3,0x96A5,
+ 0x49FD,0x49FC,0x4A17,0x4A19,0x970A,0x4A18,0x9787,0x9789,0x978C,0x97EF,
+ 0x982A,0x9822,0x4ABF,0x981F,0x4B3C,0x9919,0x4B6B,0x99CA,0x99DA,0x4B83,
+ 0x4B81,0x4B80,0x99DE,0x99C8,0x99E0,0x4BCA,0x9AB6,0x9AB5,0x4BCE,0x9AF4,
+ 0x4BF6,0x9B6B,0x9B69,0x9B72,0x9B63,
+ /* plane 3, row 48 */
+ 1 | (94 << 8), /* first, last */
+ 0x4C39,0x9D0D,0x4CAE,0x9D01,0x9D0C,0x4CB5,0x9CF8,0x4CB3,0x4CB4,
+ 0x9CFE,0x9D02,0x9E84,0x4D22,0x9EAB,0x9EAA,0x511D,0x5116,0x3499,0x512B,
+ 0x511E,0x511B,0x5290,0x5294,0x5314,0xD842,0x3602,0x5667,0x3601,0x567B,
+ 0x36A1,0x565F,0x5661,0x35FD,0x3673,0x3674,0x3670,0x3676,0x3675,0x3672,
+ 0x58C3,0x58CA,0x58BB,0x58C0,0x58C4,0x5901,0x5B1F,0x5B18,0x5B11,0x5B15,
+ 0x3729,0x5B12,0x5B1C,0x372A,0x5B22,0x5B79,0x5DA6,0x3816,0x5DB3,0x5DAB,
+ 0x5EEA,0x3899,0x5F5B,0x38D3,0x38F5,0x61B7,0x61CE,0x61B9,0x61BD,0x61CF,
+ 0x61C0,0x6199,0x6197,0x3994,0x61BB,0x61D0,0x61C4,0x6231,0x3A56,0x64D3,
+ 0x64C0,0x3A59,0x3A58,0x3A55,0x3A52,0x64DC,0x64D1,0x64C8,0x3A57,0x64D5,
+ 0x66C3,0x3B1B,0x3B1C,0x66BF,0x66C5,
+ 25, /* first low-surrogate */
+ 0xDF89,
+ /* plane 3, row 49 */
+ 1 | (94 << 8), /* first, last */
+ 0x3B19,0x66CD,0x66C1,0x6706,0x3B3F,0x6724,0x6A63,0x6A42,0x6A52,
+ 0x3BDB,0x6A43,0x6A33,0x3BE2,0x6A6C,0x6A57,0x3BD7,0x6A4C,0x6A6E,0x3BDE,
+ 0x3BE5,0x3BE4,0x3BE6,0x3BD6,0x6A37,0x3BDF,0x6A71,0x6A4A,0x6A36,0x3BDC,
+ 0x6A53,0x3BDA,0x6A45,0x6A70,0x3BD3,0x3BD0,0x6A5C,0x6B58,0x6B57,0x3C86,
+ 0x3C87,0x3CAD,0x3CB7,0x3D58,0x3D6A,0x6FBB,0x3D62,0x3D61,0x6FBE,0x3D69,
+ 0x3D6C,0x3D65,0x6FB5,0x6FD3,0x6F9F,0x3D66,0x6FB7,0x6FF5,0x71B7,0x3DF5,
+ 0x71BB,0x3DF4,0x71D1,0x3DF7,0x71BA,0x3DF8,0x71B6,0x71CC,0x3DFB,0x3DFC,
+ 0x71D3,0x749B,0x3EF5,0x3EF8,0x7496,0x74A2,0x749D,0x750A,0x750E,0x3F3C,
+ 0x7581,0x762C,0x7637,0x7636,0x763B,0x3FC5,0x76A1,0x4062,0x4063,0x7798,
+ 0x4067,0x7796,0x4066,0x40D9,0x40DB,
+ /* plane 3, row 50 */
+ 1 | (94 << 8), /* first, last */
+ 0x78D6,0x78EB,0x40D8,0x78DC,0x411B,0x79A5,0x79A9,0x9834,0x7A53,
+ 0x7A45,0x4179,0x7A4F,0x417D,0x7ABD,0x7ABB,0x7AF1,0x422C,0x4237,0x7BEC,
+ 0x7BED,0x4230,0x429A,0x7CD3,0x4A00,0x7CE1,0x4305,0x7E19,0x4307,0x4309,
+ 0x430A,0x7E27,0x7E26,0x4379,0x43C2,0x806E,0x81AF,0x4438,0x4437,0x81AD,
+ 0x4421,0x81AA,0x8218,0x445E,0x453D,0x4537,0x4540,0x856F,0x854C,0x451D,
+ 0x8542,0x4533,0x855C,0x8570,0x855F,0x4535,0x855A,0x854B,0x853F,0x878A,
+ 0x45D8,0x878B,0x87A1,0x878E,0x45DC,0x45DE,0x8799,0x885E,0x885F,0x8924,
+ 0x89A7,0x8AEA,0x8AFD,0x8AF9,0x8AE3,0x8AE5,0x46FA,0x46FB,0x8AEC,0x473D,
+ 0x473B,0x473F,0x475F,0x8CF2,0x477F,0x8CEF,0x4784,0x8DA6,0x47BC,0x4814,
+ 0x480F,0x8E3B,0x8E43,0x480E,0x8E32,
+ /* plane 3, row 51 */
+ 1 | (94 << 8), /* first, last */
+ 0x8F31,0x8F30,0x4860,0x8F2D,0x8F3C,0x8FA7,0x8FA5,0x48AB,0x48AC,
+ 0x48AA,0x9137,0x9195,0x918E,0x4904,0x9196,0x4908,0x9345,0x930A,0x4933,
+ 0x4934,0x92FD,0x9317,0x931C,0x9307,0x9331,0x9332,0x932C,0x9330,0x9303,
+ 0x9305,0x49A2,0x95C2,0x49A4,0x95B8,0x49A5,0x95C1,0x49A7,0x49A6,0x49E7,
+ 0x96AB,0x96B7,0x49FF,0x49FE,0x9715,0x9714,0x4A1D,0x4A1C,0x970C,0x9717,
+ 0x4A67,0x9793,0x4A94,0x97D2,0x4AC5,0x4AC8,0x9836,0x9831,0x9833,0x983C,
+ 0x982E,0x983A,0x4AC9,0x983D,0x4AC7,0x98B5,0x9922,0x9923,0x9920,0x991C,
+ 0x991D,0x4B6C,0x99A0,0x4B8A,0x99EF,0x99E8,0x99EB,0x4B88,0x4B87,0x4B86,
+ 0x99E1,0x99E6,0x4BCF,0x4BD0,0x9AF8,0x9AF5,0x4C1C,0x4C23,0x9B83,0x9B94,
+ 0x9B84,0x4C49,0x9B8B,0x9B8F,0x4C43,
+ /* plane 3, row 52 */
+ 1 | (94 << 8), /* first, last */
+ 0x9B8C,0x4C48,0x9B89,0x4C47,0x9B8E,0x4C46,0x4C3F,0x4C44,0x9D24,
+ 0x9D0F,0x4CBE,0x9D13,0x9D0A,0x4CC2,0x4CBA,0x4CBC,0x4CC6,0x9D2A,0x9D1A,
+ 0x4CC8,0x9D27,0x9D16,0x9D21,0x4D23,0x9E85,0x9EAC,0x9EC6,0x9EC5,0x9ED7,
+ 0x9F53,0x349D,0x5128,0x5127,0x51DF,0x3524,0x5335,0x53B3,0x3607,0x568A,
+ 0x567D,0x5689,0x3679,0x58CD,0x58D0,0x3678,0x5B2B,0x5B33,0x5B29,0x5B35,
+ 0x5B31,0x5B37,0x5C36,0x5DBE,0x3819,0x5DB9,0x381C,0x5DBB,0x3818,0x61E2,
+ 0x61DB,0x61DD,0x61DC,0x61DA,0xD87E,0x61D9,0x39BD,0x3A5D,0x64DF,0x3A5A,
+ 0x3A5E,0x64E1,0x3A5C,0x64EE,0x3A5B,0x65B5,0x66D4,0x66D5,0x3B21,0x66D0,
+ 0x66D1,0x66CE,0x66D7,0x3B20,0x3B32,0x6A7D,0x6A8A,0x3BF2,0x6AA7,0x3BF5,
+ 0x6A99,0x6A82,0x6A88,0x3BEE,0x3BEC,
+ 64, /* first low-surrogate */
+ 0xDCAF,
+ /* plane 3, row 53 */
+ 1 | (94 << 8), /* first, last */
+ 0x6A86,0x3BEA,0x6A98,0x6A9D,0x3BED,0x3BF3,0x6A8F,0x3BF6,0x6AAA,
+ 0x3C48,0x6B5D,0x3C49,0x6C0A,0x3D75,0x6FD7,0x6FD6,0x6FE5,0x3D6F,0x3D7B,
+ 0x3D73,0x6FD9,0x6FDA,0x6FEA,0x3D70,0x6FF6,0xD850,0x3D78,0x71E3,0x3DFE,
+ 0x71E9,0x3E00,0x71EB,0x71EF,0x71F3,0x71EA,0x3E01,0xD87E,0x3E55,0x3E56,
+ 0x3E9D,0x7371,0x3EF9,0x74AE,0x3EFF,0x74B3,0x3EFD,0x74AC,0x3F43,0x3F41,
+ 0x7583,0x7645,0x764E,0x7644,0x76A3,0x76A5,0x77A6,0x77A4,0x406F,0x77A9,
+ 0x77AF,0x408A,0x40E5,0x40E6,0x78F0,0x78F8,0x78F1,0x417F,0x7A49,0x41B5,
+ 0x41B6,0x41BB,0x7AC2,0x7AF2,0x7AF3,0x7BFA,0x4240,0x7BF6,0x7BFC,0x7C18,
+ 0x7C08,0x7C12,0x429D,0x429C,0x7CDB,0x7CDA,0x430F,0x4311,0x430D,0x7E2C,
+ 0x7E4D,0x4314,0x4313,0x7F46,0x7FF6,
+ 26, /* first low-surrogate */
+ 0xDC39, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDD21,
+ /* plane 3, row 54 */
+ 1 | (94 << 8), /* first, last */
+ 0x802B,0x8074,0x81B8,0x81C8,0x4482,0x4483,0x454D,0x8592,0x8593,
+ 0x454F,0x857F,0x85AB,0x8597,0x454C,0x4551,0x85AC,0x45EE,0x45E8,0x4CCB,
+ 0x87CE,0x45EB,0x87CD,0x45E2,0x45E6,0x87C1,0x87B1,0x87C7,0x45EC,0x8940,
+ 0x4659,0x893F,0x8939,0x465D,0x8943,0x4657,0x465B,0x4656,0x89AB,0x46FE,
+ 0x8B1F,0x8B09,0x8B0C,0x4700,0x4701,0x8C40,0x4742,0x8C96,0x4760,0x8CF6,
+ 0x8CF7,0x481D,0x8E46,0x8E4F,0x483E,0x4869,0x4865,0x8F3D,0x8F41,0x9366,
+ 0x9378,0x935D,0x9369,0x9374,0x937D,0x936E,0x9372,0x9373,0x9362,0x9348,
+ 0x9353,0x935F,0x9368,0x4938,0x937F,0x936B,0x49AE,0x95C4,0x49AD,0x96AF,
+ 0x96AD,0x96B2,0x4A02,0x4A1F,0x971A,0x971B,0x4A22,0x4A20,0xD87E,0x4A6C,
+ 0x979B,0x979F,0x4A68,0x4A6D,0x4A6E,
+ 88, /* first low-surrogate */
+ 0xDDF5,
+ /* plane 3, row 55 */
+ 1 | (94 << 8), /* first, last */
+ 0x4AA0,0x4ACE,0x4AD0,0x4AD1,0x4ACB,0x9840,0x4AD2,0x9847,0x4AD3,
+ 0x98B7,0x4B20,0x4B4E,0x4B4B,0x4B72,0x4B70,0x99A2,0x4B92,0x4B8F,0x9A00,
+ 0x99F3,0x4B90,0xD866,0x99F5,0x4BD9,0x4BD5,0x9ABD,0x9B00,0x9B02,0x4BFA,
+ 0x9B34,0x9B49,0x9B9F,0x4C4B,0x9BA3,0x9BCD,0x9B99,0x9B9D,0x4CD0,0x4CCE,
+ 0x9D39,0x4CCF,0x9D44,0x4CC4,0x4CCC,0x9D35,0x4CD2,0x4D35,0x9EAF,0x3E03,
+ 0x512F,0x349E,0x34AF,0x9F8E,0x360C,0x569F,0x569B,0x569E,0x5696,0x5694,
+ 0x56A0,0x367C,0x5B3B,0x3730,0x3731,0x5B3A,0x5DC1,0x5F4D,0x5F5D,0x61F3,
+ 0x39A1,0x399E,0x3A68,0x3A61,0x64F6,0x64E5,0x64EA,0x64E7,0x6505,0x3A65,
+ 0x64F9,0x3A66,0x3A6A,0x3AAB,0x6AAB,0x6AED,0x6AB2,0x6AB0,0x6AB5,0x6ABE,
+ 0x6AC1,0x6AC8,0x3BF9,0x6AC0,0x6ABC,
+ 22, /* first low-surrogate */
+ 0xDD37,
+ /* plane 3, row 56 */
+ 1 | (94 << 8), /* first, last */
+ 0x6AB1,0x6AC4,0x6ABF,0x3C58,0x3C8A,0x7008,0x7003,0x6FFD,0x7010,
+ 0x7002,0x7013,0x3E04,0x71FA,0x7200,0x74B9,0x74BC,0x3F02,0x765B,0x7651,
+ 0x764F,0x76EB,0x77B8,0x4079,0x77B9,0x77C1,0x77C0,0x77BE,0x790B,0x40EB,
+ 0x7907,0x790A,0x7908,0x40E9,0x790D,0x7906,0x7915,0x79AF,0x4120,0x4121,
+ 0x4181,0x7AF5,0x424D,0x4259,0x7C2E,0x4258,0x7C1B,0xD857,0x7C1A,0x7C24,
+ 0x42A5,0x42A9,0x7CE6,0x7CE3,0x431A,0x4319,0x7E5D,0x7E4F,0x7E66,0x7E5B,
+ 0x7F47,0x7FB4,0x4396,0x4398,0x4397,0x7FFA,0x802E,0xD859,0x43C8,0x81CE,
+ 0x4443,0x4445,0x8219,0x4552,0x4557,0x85CC,0x85B2,0x4555,0x85BB,0x85C1,
+ 0x4556,0x4558,0x45F2,0x87E9,0x87EE,0x87F0,0x87D6,0x880E,0x87DA,0x8948,
+ 0x894A,0x894E,0x894D,0x89B1,0x89B0,
+ 47, /* first low-surrogate */
+ 0xDCD1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDDDF,
+ /* plane 3, row 57 */
+ 1 | (94 << 8), /* first, last */
+ 0x89B3,0x4707,0x8B38,0x8B32,0x4708,0x8B2D,0x470A,0x8B34,0x431B,
+ 0x8B29,0x8C74,0x4761,0x4762,0x8D03,0x47C2,0x47C6,0x8DA9,0x8E58,0x481E,
+ 0x4825,0x8EBF,0x8EC1,0x8F4A,0x8FAC,0x48B0,0x9089,0x913D,0x913C,0x91A9,
+ 0x93A0,0x493D,0x9390,0x493E,0x9393,0x938B,0x93AD,0x93BB,0x93B8,0x4946,
+ 0x4945,0x939C,0x95D8,0x95D7,0x4A03,0x4A26,0x4A27,0x975D,0x97A9,0x97DA,
+ 0x4A98,0x4AAD,0x4AD5,0x4ADA,0x9854,0x4AD9,0x9855,0x984B,0x4ADD,0x983F,
+ 0x98B9,0x4B15,0x4B16,0x4B17,0x4B21,0x9938,0x9936,0x9940,0x4B4C,0x993B,
+ 0x9939,0x99A4,0x4B96,0x4B98,0x9A08,0x9A0C,0x4B9B,0x9A10,0x4BFF,0x9B07,
+ 0x4C25,0x9BD2,0x4C4F,0x9BC2,0x9BBB,0x9BCC,0x9BCB,0x4C56,0x4C54,0x9D4D,
+ 0x9D63,0x9D4E,0x4CD8,0x9D50,0x9D55,
+ /* plane 3, row 58 */
+ 1 | (94 << 8), /* first, last */
+ 0x4CD7,0x9D5E,0x4D26,0x9E90,0x9EB2,0x9EB1,0x4D38,0x9ECA,0x9F02,
+ 0x9F27,0x9F26,0x4D8A,0x56AF,0x58E0,0x58DC,0x3734,0x5B39,0x3735,0xD87E,
+ 0x5B7C,0x5BF3,0xD87E,0x37A1,0x5C6B,0x5DC4,0x650B,0x6508,0x650A,0x3A6C,
+ 0x3A6D,0x65DC,0x3B29,0x3B2A,0x66E1,0x66DF,0x6ACE,0x6AD4,0x6AE3,0x6AD7,
+ 0x6AE2,0x3C00,0x3C08,0x3C06,0x3C05,0x6AD8,0x6AD5,0x6AD2,0x3CB1,0x3D88,
+ 0x701E,0x702C,0x7025,0x6FF3,0x7204,0x7208,0x7215,0x3E09,0x74C4,0x74C9,
+ 0x74C7,0x74C8,0x76A9,0x77C6,0x77C5,0x7918,0x791A,0x7920,0x4122,0x7A66,
+ 0x7A64,0x7A6A,0x41D5,0x4261,0x425D,0x4262,0x424F,0x4260,0x7C35,0x7C34,
+ 0x42AA,0x4322,0x7E6C,0x4321,0x7E6E,0x7E71,0x4446,0x81D4,0x81D6,0x821A,
+ 0x8262,0x8265,0x8276,0x85DB,0x85D6,
+ 19, /* first low-surrogate */
+ 0xDC6A,
+ 0, 0,0xDC70,
+ /* plane 3, row 59 */
+ 1 | (94 << 8), /* first, last */
+ 0x4562,0x85E7,0x4560,0x4564,0x85F4,0xD87E,0x87FD,0x87D5,0x8807,
+ 0x45F6,0x880F,0x87F8,0xD87E,0x4619,0x8987,0x4691,0x89B5,0x89F5,0x470D,
+ 0x8B3F,0x8B43,0x8B4C,0x4765,0x8D0B,0x8E6B,0x8E68,0x8E70,0x8E75,0x8E77,
+ 0x483F,0x8EC3,0x494B,0x93E9,0x93EA,0x93CB,0x93C5,0x93C6,0x4948,0x93ED,
+ 0x93D3,0x4952,0x93E5,0x494A,0x4951,0x93DB,0x93EB,0x93E0,0x93C1,0x4950,
+ 0x494C,0x95DD,0x49EE,0x4A04,0x4A06,0x4A2D,0x4A2E,0x4A2F,0x4A7B,0x4A78,
+ 0x4A77,0x97B2,0x97B4,0x97B1,0x97B5,0x97F2,0x4AA2,0x4AA1,0x4AE3,0x9856,
+ 0x4B1A,0x4B19,0x4B57,0x9944,0x4B9E,0x9A26,0x9A1F,0x9A18,0x9A21,0x9A17,
+ 0x4BDD,0x9B09,0x4C05,0x4C28,0x9BC5,0x9BDF,0x4C60,0x9BE3,0x4C66,0x9BE9,
+ 0x9BEE,0x4C67,0x4C68,0x9D66,0x9D7A,
+ 6, /* first low-surrogate */
+ 0xDDB6, 0, 0, 0,
+ 0, 0, 0,0xDDC1,
+ /* plane 3, row 60 */
+ 1 | (94 << 8), /* first, last */
+ 0x4CDE,0x9D6E,0x9D91,0x9D83,0x9D76,0x9D7E,0x9D6D,0x4CE1,0x9E95,
+ 0x9EE3,0x4D69,0x4D77,0x9F03,0x9F04,0xD87E,0x9F17,0x34A6,0x5136,0x34A5,
+ 0x5336,0x3614,0x5B42,0x3736,0x3738,0x5B44,0x5B46,0x5B7E,0x5DCA,0x5DC8,
+ 0x5DCC,0x5EF0,0x3A70,0x6585,0x66E5,0x66E7,0x3B2B,0x3C11,0x3C0A,0x6AF4,
+ 0x3C0D,0x6AE9,0x3C16,0x3C10,0x3C09,0x3C0E,0x3C7A,0x703D,0x3D8C,0x7036,
+ 0x3D91,0x7216,0x3E0A,0x7212,0x720F,0x7217,0x7211,0x720B,0x3E08,0x3E0B,
+ 0x74CD,0x74D0,0x74CC,0x74CE,0x74D1,0x3F07,0x7589,0x40F2,0x7A6F,0x7C4B,
+ 0x7C44,0x7C55,0x42AE,0x4324,0x4326,0x4327,0x7E7F,0x8B71,0x4399,0x802F,
+ 0x807A,0x807B,0x807C,0x455F,0x456A,0x4571,0x85FC,0x8610,0x8602,0x456C,
+ 0x456F,0x85EE,0x8603,0x4568,0x860D,
+ 15, /* first low-surrogate */
+ 0xDE19,
+ /* plane 3, row 61 */
+ 1 | (94 << 8), /* first, last */
+ 0x8613,0x8608,0x860F,0x8818,0x8812,0x4601,0x4668,0x8967,0x8965,
+ 0x89BB,0x8B69,0x8B62,0x4713,0x8B6E,0x4716,0x8B61,0x4718,0x8B64,0x8B4D,
+ 0x8C51,0x4789,0x47C8,0x8E83,0x8EC6,0x4884,0x941F,0x4954,0x9404,0x9417,
+ 0x9408,0x9405,0x4956,0x93F3,0x941E,0x9402,0x941A,0x941B,0x9427,0x941C,
+ 0x495A,0x96B5,0x4A05,0x4A07,0x9733,0x4A31,0x9734,0x9731,0x97B8,0x97BA,
+ 0x4AA3,0x97FC,0x4AEB,0x4B1C,0x98C3,0x4B5A,0x994D,0x4B5B,0x9A2F,0x4BA6,
+ 0x4BAA,0x4BA5,0x9AC9,0x4BE1,0x9AC8,0x9AC4,0x9B2A,0x9B38,0x9B50,0x4C2A,
+ 0x9C0A,0x9BFB,0x9C04,0x9BFC,0x9BFE,0x4C72,0x4C6F,0x4C73,0x9C02,0x9BF6,
+ 0x9C1B,0x9BF9,0x9C15,0x9C10,0x9BFF,0x9C00,0x9C0C,0x4C6B,0x4CE6,0x9D95,
+ 0x9DA5,0x4CE9,0x4CEC,0x4CE8,0x4CF0,
+ /* plane 3, row 62 */
+ 1 | (94 << 8), /* first, last */
+ 0x9E98,0x9EC1,0x4D8C,0x9F5A,0x5164,0x56BB,0x3615,0x58E6,0x5B49,
+ 0x5BF7,0x3771,0x3826,0x5DD0,0x38C6,0x5FC2,0x39A8,0x6511,0x3A73,0x6AFF,
+ 0x6AFE,0x6AFD,0x3C15,0x6B01,0x3D98,0x3D97,0x704B,0x704D,0x7047,0x74D3,
+ 0x7668,0x7667,0x3FD7,0x4080,0x77D1,0x7930,0x7932,0x792E,0x4188,0x9F9D,
+ 0x7AC9,0x7AC8,0x4269,0x7C56,0x7C51,0x426B,0x4329,0x4328,0x7E85,0x7E89,
+ 0x7E8E,0x7E84,0x445F,0x826A,0x862B,0x862F,0x8628,0x4574,0x8616,0x8615,
+ 0x861D,0x881A,0x4602,0x466A,0x4694,0x89BC,0x8B75,0x8B7C,0x478A,0x8D11,
+ 0x8D12,0x8F5C,0x91BB,0x4964,0x93F4,0x495E,0x4961,0x942D,0x4965,0x4966,
+ 0x96E4,0x9737,0x9736,0x9767,0x97BE,0x97BD,0x97E2,0x9868,0x9866,0x98C8,
+ 0x98CA,0x98C7,0x98DC,0x4B5F,0x994F,
+ /* plane 3, row 63 */
+ 1 | (94 << 8), /* first, last */
+ 0x99A9,0x9A3C,0x4BAF,0x9A3B,0x9ACE,0x4C0D,0x9B14,0x9B53,0x4C7C,
+ 0x9C2E,0x4C7A,0x9C1F,0x4C76,0x4C79,0x4C7D,0x4C77,0x9DB0,0x9DBD,0x4CF6,
+ 0x4CF1,0x9DAE,0x9DC4,0x9E7B,0x400B,0x4D29,0x9E9E,0x4D6F,0x9F05,0x4D9A,
+ 0x9F69,0x9FA1,0x56C7,0x571D,0x5B4A,0x5DD3,0x3869,0x5F72,0x6202,0x39AB,
+ 0x6235,0x6527,0x651E,0x651F,0x3B2C,0x3B2D,0x6B07,0x6B06,0x3C17,0x3D9A,
+ 0x7054,0x721C,0x7220,0x7AF8,0x426E,0x7C5D,0x7C58,0x432C,0x7E92,0x7F4E,
+ 0x43CA,0x4578,0x4606,0x8827,0x4607,0x8B81,0x8B83,0x4720,0x8C44,0x4753,
+ 0x47CE,0x487A,0x4879,0x9442,0x944D,0x9454,0x944E,0x496B,0x9443,0x4967,
+ 0x496D,0x973C,0x9740,0x97C0,0x4A85,0x4AB0,0x4AF3,0x4B63,0x995A,0x9A51,
+ 0x4BB6,0x9ADD,0x4C82,0x4C7F,0x9C38,
+ /* plane 3, row 64 */
+ 1 | (94 << 8), /* first, last */
+ 0x4C86,0x9C45,0x9C3A,0x4C84,0x9C35,0x4CFC,0x4CFD,0x4CFA,0x9EF1,
+ 0x4D87,0x9F93,0x529A,0x361A,0x3619,0x8641,0x5DD7,0x3A75,0x6528,0x3C1A,
+ 0x3C1B,0x3C19,0x7053,0x7059,0x3D9C,0x7221,0x3E10,0x766F,0x7937,0x79B5,
+ 0x7C62,0x7C5E,0x7CF5,0x457B,0x457C,0x863D,0x4608,0x882D,0x8989,0x8B8D,
+ 0x8B87,0x8B90,0x8D1A,0x8E99,0x4841,0x48E3,0x4972,0x945F,0x4973,0x4968,
+ 0x9456,0x9461,0x945B,0x945A,0x945C,0x9465,0x4A35,0x9741,0x4A88,0x4A9D,
+ 0x986E,0x986C,0x986D,0x4275,0x99AA,0x9A5C,0x9A58,0x9ADE,0x4C8F,0x9C4F,
+ 0x9C51,0x4C8E,0x9C53,0x4D05,0x4D04,0x4CFF,0x9DFC,0x9F39,0x4D9E,0x513E,
+ 0x3554,0x56D2,0x3681,0x5B4F,0x6B14,0x40FA,0x7A72,0x7A73,0x4332,0x4670,
+ 0x466E,0x8B91,0xD87E,0x487C,0x91BF,
+ 92, /* first low-surrogate */
+ 0xDDD6,
+ /* plane 3, row 65 */
+ 1 | (94 << 8), /* first, last */
+ 0x4975,0x946C,0x4974,0x4977,0x96E6,0x9745,0x4A37,0x97C8,0x97E4,
+ 0x995D,0x4BBA,0x9B21,0x4C11,0x9B2C,0x9B57,0x4C92,0x4C99,0x9C5D,0x9C61,
+ 0x9C65,0x9E08,0x4D0A,0x4D2A,0x4D2B,0x4D44,0x4D79,0x9F45,0x34AA,0x3748,
+ 0x6205,0x66EF,0x6B1B,0x6B1D,0x7225,0x7224,0x7C6D,0x42B4,0x8642,0x8649,
+ 0x460D,0x8978,0x898A,0x8B97,0x4754,0x8C9B,0x8D1C,0x4830,0x8EA2,0x4A09,
+ 0x4A38,0x4A36,0x4A8B,0x4AF7,0x4B66,0x4BBD,0x4C1E,0x9C6C,0x4C96,0x9C6F,
+ 0x4D0D,0x9E0E,0x4D73,0x9F08,0x9F1D,0x9FA3,0x373B,0x373C,0x5F60,0x6B1C,
+ 0x3DA0,0x40FB,0xffff,0x7CF3,0x4581,0x8B9B,0x8EA7,0x91C4,0x4978,0x947A,
+ 0x4A8D,0x4B73,0x9A61,0x9A63,0x9AD7,0x9C76,0x4DA6,0x9FA5,0x39AD,0x7067,
+ 0x3E11,0x72AB,0x864A,0x897D,0x8B9D,
+ /* plane 3, row 66 */
+ 1 | (89 << 8), /* first, last */
+ 0x8C53,0x8F65,0x947B,0x4A39,0x98CD,0x98DD,0x4BBF,0x9B30,0x9E16,
+ 0x4D0F,0x4DA7,0x4DB5,0x3FDC,0x4831,0x96E7,0x9E18,0x9EA2,0x4DA8,0x9F7C,
+ 0x4125,0x7E9E,0x9484,0x4BC1,0x9E1C,0x4190,0x7C71,0x97CA,0x4696,0x487F,
+ 0x4D10,0x9EA3,0x4A0A,0x9C7B,0x9F97,0x4D12,0x4A3A,0x9750,0x4A3B,0xffff,
+ 0xffff,0x5727,0x5C13,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x5FC8,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0x6765,0xffff,0xffff,0x52BD,0xffff,
+ 0x5B66,0xffff,0x65F9,0x6788,0x6CE6,0x6CCB,0xffff,0x4FBD,0x5F8D,0xffff,
+ 0x6018,0x6048,0xffff,0x6B29,0x70A6,0xffff,0x7706,0xffff,0xffff,0xffff,
+ 0x5A10,0x5CFC,0x5CFE,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x70C9,
+ /* plane 3, row 67 */
+ 3 | (91 << 8), /* first, last */
+ 0x9579,0xffff,0x96BA,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0x7B29,0x8128,0xffff,0x8A2E,0xffff,0xffff,0xffff,
+ 0x9AD9,0xffff,0x582B,0x5845,0xffff,0x63FA,0xffff,0xffff,0xffff,0x6E86,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0x5867,0xffff,0x5BDD,0x656E,0xffff,
+ 0xffff,0xffff,0x8C87,0xffff,0x50D2,0x50DF,0xffff,0xffff,0xffff,0xffff,
+ 0x69BA,0xffff,0x6B9D,0xffff,0x8059,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0x6F8A,0xffff,0xffff,
+ 0x7BC3,0x7BC2,0xffff,0xffff,0xffff,0xffff,0x90F6,0xffff,0x9823,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0x71CD,0x7499,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0x9842,
+ /* plane 3, row 68 */
+ 2 | (94 << 8), /* first, last */
+ 0x7F84,0xffff,0xffff,0xffff,0xffff,0xffff,0x8D0E,0xffff,
+ 0x9861,0xffff,0xffff,0x8B73,0xffff,0x9C27,0xffff,0x9458,0x77D6,0x9B2D,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
+ 0x4F66,0x4F68,0x4FE7,0x503F,0xffff,0x50A6,0x510F,0x523E,0x5324,0x5365,
+ 0x539B,0x517F,0x54CB,0x5573,0x5571,0x556B,0x55F4,0x5622,0x5620,0x5692,
+ 0x56BA,0x5691,0x56B0,0x5759,0x578A,0x580F,0x5812,0x5813,0x5847,0x589B,
+ 0x5900,0x594D,0x5AD1,0x5AD3,0x5B67,0x5C57,0x5C77,0x5CD5,0x5D75,0x5D8E,
+ 0x5DA5,0x5DB6,0x5DBF,0x5E65,0x5ECD,0x5EED,0x5F94,0x5F9A,0x5FBA,0x6125,
+ 0x6150,0x62A3,0x6360,0x6364,0x63B6,
+ /* plane 3, row 69 */
+ 1 | (94 << 8), /* first, last */
+ 0x6403,0x64B6,0x651A,0x7A25,0x5C21,0x66E2,0x6702,0x67A4,0x67AC,
+ 0x6810,0x6806,0x685E,0x685A,0x692C,0x6929,0x6A2D,0x6A77,0x6A7A,0x6ACA,
+ 0x6AE6,0x6AF5,0x6B0D,0x6B0E,0x6BDC,0x6BDD,0x6BF6,0x6C1E,0x6C63,0x6DA5,
+ 0x6E0F,0x6E8A,0x6E84,0x6E8B,0x6E7C,0x6F4C,0x6F48,0x6F49,0x6F9D,0x6F99,
+ 0x6FF8,0x702E,0x702D,0x705C,0x79CC,0x70BF,0x70EA,0x70E5,0x7111,0x7112,
+ 0x713F,0x7139,0x713B,0x713D,0x7177,0x7175,0x7176,0x7171,0x7196,0x7193,
+ 0x71B4,0x71DD,0x71DE,0x720E,0x5911,0x7218,0x7347,0x7348,0x73EF,0x7412,
+ 0x743B,0x74A4,0x748D,0x74B4,0x7673,0x7677,0x76BC,0x7819,0x781B,0x783D,
+ 0x7853,0x7854,0x7858,0x78B7,0x78D8,0x78EE,0x7922,0x794D,0x7986,0x7999,
+ 0x79A3,0x79BC,0x7AA7,0x7B37,0x7B59,
+ /* plane 3, row 70 */
+ 1 | (92 << 8), /* first, last */
+ 0x7BD0,0x7C2F,0x7C32,0x7C42,0x7C4E,0x7C68,0x7CA9,0x7CED,0x7DD0,
+ 0x7E07,0x7DD3,0x7E64,0x7F40,0xffff,0x8041,0x8063,0x80BB,0x6711,0x6725,
+ 0x8248,0x8310,0x8362,0x8312,0x8421,0x841E,0x84E2,0x84DE,0x84E1,0x8573,
+ 0x85D4,0x85F5,0x8637,0x8645,0x8672,0x874A,0x87A9,0x87A5,0x87F5,0x8834,
+ 0x8850,0x8887,0x8954,0x8984,0x8B03,0x8C52,0x8CD8,0x8D0C,0x8D18,0x8DB0,
+ 0x8EBC,0x8ED5,0x8FAA,0x909C,0xffff,0x915C,0x922B,0x9221,0x9273,0x92F4,
+ 0x92F5,0x933F,0x9342,0x9386,0x93BE,0x93BC,0x93BD,0x93F1,0x93F2,0x93EF,
+ 0x9422,0x9423,0x9424,0x9467,0x9466,0x9597,0x95CE,0x95E7,0x973B,0x974D,
+ 0x98E4,0x9942,0x9B1D,0x9B98,0xffff,0x9D49,0x6449,0x5E71,0x5E85,0x61D3,
+ 0x990E,0x8002,0x781E,
+ /* plane 3, row 71 */
+ 1 | (10 << 8), /* first, last */
+ 0x5528,0x5572,0x55BA,0x55F0,0x55EE,0x56B8,0x56B9,0x56C4,0x8053,
+ 0x92B0,
+ /* plane 3, row 72: --- */
+ /* plane 3, row 73: --- */
+ /* plane 3, row 74: --- */
+ /* plane 3, row 75: --- */
+ /* plane 3, row 76: --- */
+ /* plane 3, row 77: --- */
+ /* plane 3, row 78: --- */
+ /* plane 3, row 79: --- */
+ /* plane 3, row 80: --- */
+ /* plane 3, row 81: --- */
+ /* plane 3, row 82: --- */
+ /* plane 3, row 83: --- */
+ /* plane 3, row 84: --- */
+ /* plane 3, row 85: --- */
+ /* plane 3, row 86: --- */
+ /* plane 3, row 87: --- */
+ /* plane 3, row 88: --- */
+ /* plane 3, row 89: --- */
+ /* plane 3, row 90: --- */
+ /* plane 3, row 91: --- */
+ /* plane 3, row 92: --- */
+ /* plane 3, row 93: --- */
+ /* plane 3, row 94: --- */
+ /* plane 4, row 1 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0x4E40,0x4E41,0x4E5A,0xD847,0x4E02,0x4E29,0xD840,0xD841,
+ 0x5202,0x353E,0x5DDC,0xD841,0xD841,0xD87E,0x5342,0x536A,0x5B52,0xD846,
+ 0xD87E,0xD87E,0x5FC4,0x624C,0x72AD,0x4E12,0x4E2F,0x4E96,0x4ED0,0x5142,
+ 0x5183,0xD87E,0xD841,0xD841,0xD842,0xD842,0x5383,0x53B8,0xD842,0xD842,
+ 0xD844,0x5928,0xD846,0x5C23,0x5E01,0x5F00,0xD84C,0x3CB8,0x706C,0x722B,
+ 0x5188,0x8279,0x8FB6,0x4E17,0xD840,0x340C,0xD840,0x3430,0x4EE2,0x4EDB,
+ 0xD841,0xD841,0x51AD,0xD841,0x51F7,0x34DA,0xD841,0xD842,0x3513,0x531B,
+ 0x5388,0x5387,0xD842,0x53CF,0x53FD,0x3563,0x53E7,0x56DC,0xD844,0x56D9,
+ 0x5725,0x5727,0x5933,0x5C13,0xD847,0xD847,0x5C75,0xD848,0xD848,0xD849,
+ 0x39C4,0x39C3,0x66F1,0xD84C,0xD855,
+ 1, /* first low-surrogate */
+ 0xDC86, 0, 0, 0,0xDFE8, 0, 0,0xDD0E,0xDE27,
+ 0, 0, 0,0xDD3C,0xDE75,0xDC28, 0, 0, 0,0xDD3C,
+ 0xDC75,0xDC78, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xDC19,0xDEA5,0xDEAA,0xDD0F,0xDE0E, 0, 0,0xDF9C,0xDF9B,
+ 0xDE3C, 0,0xDFC2, 0, 0, 0,0xDFB4, 0, 0, 0,
+ 0, 0, 0, 0,0xDC65, 0,0xDDB2, 0, 0, 0,
+ 0xDC77,0xDD42, 0,0xDE33, 0, 0,0xDEAF,0xDC36, 0, 0,
+ 0, 0,0xDF22, 0, 0, 0, 0, 0,0xDDA3, 0,
+ 0, 0, 0, 0,0xDC25,0xDC24, 0,0xDC52,0xDD89,0xDCBF,
+ 0, 0, 0,0xDFB5,0xDF4C,
+ /* plane 4, row 2 */
+ 1 | (94 << 8), /* first, last */
+ 0x7F52,0xD863,0xD863,0x3401,0xD840,0xD840,0x4E51,0x4E6A,0xD840,
+ 0x4F0C,0xD840,0xD840,0x4EFE,0x4F1B,0xD840,0xD840,0x343A,0xD841,0x34AB,
+ 0x5173,0xD841,0x518E,0xD841,0xD841,0xD841,0xD841,0xD841,0x34DD,0xD841,
+ 0xD841,0x52A5,0x3515,0x52A7,0x52A4,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0x53BD,0xD842,0xD842,0xD842,0x5402,0xD842,0xD842,0xD842,0xD842,0x572B,
+ 0x591B,0x5935,0xD845,0x36A7,0x36A5,0xD845,0xD845,0x36A6,0xD846,0xffff,
+ 0x5C17,0x377C,0xD847,0x5C70,0x5C7D,0x37A9,0xD847,0x5DE9,0xD848,0x3834,
+ 0x3835,0xD848,0xD848,0xD848,0x38A8,0x5F19,0x5F1C,0x5F75,0xD849,0xD849,
+ 0x38FF,0x5FC8,0xD84A,0x39C7,0x39C6,0x39C8,0xD84A,0xD84B,0x3AD0,0x3AD1,
+ 0xD84C,0xD84C,0x3C59,0xD84E,0xD84E,
+ 2, /* first low-surrogate */
+ 0xDE14,0xDE12, 0,0xDCA3,0xDCA2, 0, 0,0xDDB6,
+ 0,0xDDB5,0xDDB4, 0, 0,0xDDC2,0xDDB8, 0,0xDC79, 0,
+ 0,0xDD08, 0,0xDD7A,0xDDB6,0xDEBD,0xDEB7,0xDEBC, 0,0xDEC4,
+ 0xDEC9, 0, 0, 0, 0,0xDD30,0xDD83,0xDD85,0xDE12,0xDE34,
+ 0,0xDEE4,0xDEDE,0xDF2A, 0,0xDFAF,0xDFB4,0xDFB3,0xDFB1, 0,
+ 0, 0,0xDDDE, 0, 0,0xDEB8,0xDEB0, 0,0xDDC2, 0,
+ 0, 0,0xDC2A, 0, 0, 0,0xDFE9, 0,0xDC57, 0,
+ 0,0xDDB6,0xDDD7,0xDDDE, 0, 0, 0, 0,0xDCC2,0xDDAB,
+ 0, 0,0xDD8F, 0, 0, 0,0xDE6D,0xDEB5, 0, 0,
+ 0xDFC0,0xDFBF, 0,0xDDB9,0xDF1C,
+ /* plane 4, row 3 */
+ 1 | (94 << 8), /* first, last */
+ 0x6C12,0x3CBD,0xD84F,0xD850,0xD850,0x3E28,0x72B3,0xD851,0x3EA9,
+ 0x7390,0x7536,0xD858,0x43CC,0xD85A,0x8281,0x8FB8,0xD861,0x48B4,0xD861,
+ 0xD863,0x4E23,0x3416,0x342C,0xD840,0x4F2E,0xD840,0x514F,0xD841,0x51BA,
+ 0x34DF,0x34E0,0x5222,0xD841,0xD841,0xD841,0x3517,0xD842,0x52AF,0x52B0,
+ 0x52B1,0xD842,0xD842,0x352F,0xD842,0x5364,0xD842,0x53D3,0xD842,0x356A,
+ 0xD842,0x3570,0x356D,0xD842,0xD842,0xD842,0xD842,0x356E,0xD842,0xD87E,
+ 0xD87E,0xD842,0x362B,0x3628,0xD844,0xffff,0x593F,0xD845,0xD845,0x3692,
+ 0xD845,0x598B,0xD845,0x5991,0x5995,0xD845,0xD846,0x373F,0xD846,0x5B8A,
+ 0x374F,0x3774,0xD846,0xD846,0x377D,0xD847,0x37B7,0x37A3,0x37B0,0x37B1,
+ 0x5C87,0x37AB,0xD847,0xD847,0xD847,
+ 3, /* first low-surrogate */
+ 0xDC80,0xDD84,0xDD85, 0, 0,0xDF24, 0,
+ 0, 0,0xDF4C, 0,0xDEF6, 0, 0,0xDE70, 0,0xDE75,
+ 0xDE17, 0, 0, 0,0xDDF1, 0,0xDDDA, 0,0xDDB9, 0,
+ 0, 0, 0,0xDECE,0xDED2,0xDED0, 0,0xDC43, 0, 0,
+ 0,0xDC4D,0xDD34, 0,0xDDD9, 0,0xDE18, 0,0xDF38, 0,
+ 0xDFD7, 0, 0,0xDFDC,0xDFCB,0xDFD6,0xDFD8, 0,0xDFD1,0xDC3E,
+ 0xDC3C,0xDFD2, 0, 0,0xDE59, 0, 0,0xDDE5,0xDDE6, 0,
+ 0xDDE8, 0,0xDEBD, 0, 0,0xDEBE,0xDD49, 0,0xDDCD, 0,
+ 0, 0,0xDF5E,0xDFD0, 0,0xDD06, 0, 0, 0, 0,
+ 0, 0,0xDD7C,0xDD71,0xDFEF,
+ /* plane 4, row 4 */
+ 1 | (94 << 8), /* first, last */
+ 0x383A,0x3837,0x5E0D,0x3838,0x3840,0xD848,0xD848,0x5E8E,0x389F,
+ 0xD848,0xD848,0x5F7A,0xD849,0x3904,0x3909,0x3906,0x38FD,0x390A,0x3907,
+ 0xD84A,0xD84A,0x39CA,0xD84A,0xD84A,0x6290,0x39C9,0xD84A,0x629A,0xD84B,
+ 0x653C,0x653A,0x3A7F,0x6598,0xD84C,0x3AD2,0xD84C,0xD84C,0x6765,0xD87E,
+ 0x3B43,0xD84C,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x3CC1,0xD84F,0x3CC5,
+ 0x3DA3,0xD850,0xD850,0x3E2A,0x3E5F,0xD851,0xD851,0x3E5D,0xD851,0xD851,
+ 0xD852,0xD852,0x3F17,0xD853,0xD853,0x3F71,0x3F72,0xD853,0xD854,0x400F,
+ 0xD854,0xD855,0x79C2,0x4191,0xD858,0xD858,0xD858,0x43B2,0x43CF,0x43CE,
+ 0x809E,0xD85A,0xD85A,0x81EB,0xD85A,0x8289,0x4496,0xD85A,0xD85A,0x8296,
+ 0xD85A,0x8287,0xD85A,0x4497,0xD861,
+ 6, /* first low-surrogate */
+ 0xDD8D,0xDDB7, 0, 0,
+ 0xDF33,0xDF7F, 0,0xDDF2, 0, 0, 0, 0, 0, 0,
+ 0xDE2A,0xDE8B, 0,0xDE83,0xDE8A, 0, 0,0xDE8E, 0,0xDEB6,
+ 0, 0, 0, 0,0xDCD8, 0,0xDD56,0xDFD2, 0,0xDCDB,
+ 0,0xDFC2,0xDC87,0xDC81,0xDDC2,0xDDBC,0xDF23, 0,0xDC93, 0,
+ 0,0xDD8D,0xDD8E, 0, 0,0xDF3B,0xDF4D, 0,0xDF34,0xDF31,
+ 0xDCF2,0xDCF0, 0,0xDC15,0xDD28, 0, 0,0xDF25,0xDCE7, 0,
+ 0xDCE9,0xDC17, 0, 0,0xDE6C,0xDE80,0xDF4B, 0, 0, 0,
+ 0,0xDCDE,0xDCFB, 0,0xDD51, 0, 0,0xDF01,0xDF02, 0,
+ 0xDF05, 0,0xDF03, 0,0xDC51,
+ /* plane 4, row 5 */
+ 1 | (94 << 8), /* first, last */
+ 0x8FC0,0x488B,0x8FC3,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0x9578,0xD863,0xD863,0x9625,0xD84F,0x4E75,0x4E74,0xD840,0xD840,
+ 0x342D,0xD840,0x4F99,0xD840,0x3450,0x344B,0xD840,0x344F,0x344C,0xD87E,
+ 0x4F71,0x5153,0x51BF,0xD841,0xD841,0x51C0,0xD841,0x51EE,0xD841,0x34E4,
+ 0x34E3,0xD841,0x34E1,0xD841,0x34E2,0xD841,0x523D,0x3519,0x52BD,0x530C,
+ 0xD842,0xD853,0xD842,0xD842,0x3541,0x7F37,0xD842,0x53C0,0x355E,0xD843,
+ 0xD843,0x3579,0xD843,0x546E,0x5483,0xD843,0xD843,0x545E,0x545D,0x577E,
+ 0x5779,0xD844,0x577A,0x576C,0xD844,0xD844,0xD844,0x3632,0x5787,0xD845,
+ 0x591D,0x3694,0x5946,0x3697,0xD845,0x5943,0xD845,0x3696,0x3698,0xD845,
+ 0xD845,0x36B2,0xD845,0xD845,0xD845,
+ 4, /* first low-surrogate */
+ 0xDC53,0xDE7A,0xDE78,0xDE76,0xDE79,0xDE8F,
+ 0xDE7C, 0,0xDE1B,0xDE1C, 0,0xDD92, 0, 0,0xDD2E,0xDD2C,
+ 0,0xDE0C, 0,0xDE0B, 0, 0,0xDE05, 0, 0,0xDC05,
+ 0, 0, 0,0xDDC2,0xDDC3, 0,0xDE48, 0,0xDE46, 0,
+ 0,0xDEEA, 0,0xDEEB, 0,0xDEEE, 0, 0, 0, 0,
+ 0xDCD8,0xDC1E,0xDDDF,0xDDDE, 0, 0,0xDE4F, 0, 0,0xDC0D,
+ 0xDC08, 0,0xDC09, 0, 0,0xDC12,0xDC65, 0, 0, 0,
+ 0,0xDE89, 0, 0,0xDE84,0xDE9E,0xDE8B, 0, 0,0xDD62,
+ 0, 0, 0, 0,0xDDF9, 0,0xDDF7, 0, 0,0xDE06,
+ 0xDEDD, 0,0xDED9,0xDEDF,0xDEE2,
+ /* plane 4, row 6 */
+ 1 | (94 << 8), /* first, last */
+ 0x36B9,0x5B61,0x5B66,0xD840,0x5B90,0x3775,0x377F,0x377E,0x5C29,
+ 0x378F,0xD847,0xD847,0xD847,0x37BD,0x5CB2,0xD847,0x37BB,0x37BC,0xD847,
+ 0x5CC0,0xD848,0x383D,0x383E,0x3874,0xD848,0x387A,0x3876,0x3878,0x3875,
+ 0xD848,0xD848,0x38AF,0x38B0,0x38C7,0x38CC,0xD849,0xD849,0x3916,0xD849,
+ 0x3912,0x391D,0xD849,0xD849,0x3915,0x390F,0x3914,0x601F,0x5FE2,0xD849,
+ 0xD84A,0xD84A,0x39B0,0x39BF,0x39C0,0xD84A,0x39D2,0x39D9,0xD84B,0x3A7A,
+ 0xD84B,0xD84B,0x3A81,0x3A82,0xD84B,0x6616,0x65F9,0x3ADA,0xD859,0x6788,
+ 0xD84C,0x679B,0xD87E,0x676E,0x679E,0xD84C,0x3C22,0x3C1F,0xD84E,0xD84E,
+ 0x3C21,0x6B24,0xD84E,0xD84E,0xD84E,0x3C5C,0x6B7D,0xD84E,0x3C7D,0x3C8D,
+ 0x3C8F,0x6CE6,0xD84F,0x6CCB,0x3CD0,
+ 4, /* first low-surrogate */
+ 0xDCF1, 0, 0, 0, 0, 0,
+ 0,0xDC3F,0xDC3E,0xDD0B, 0, 0,0xDD83, 0, 0,0xDD86,
+ 0,0xDC7C, 0, 0, 0,0xDDF7, 0, 0, 0, 0,
+ 0xDDFB,0xDF3B, 0, 0, 0, 0,0xDDF9,0xDDCA, 0,0xDDFF,
+ 0, 0,0xDE09,0xDE03, 0, 0, 0, 0, 0,0xDE10,
+ 0xDD9A,0xDD9F, 0, 0, 0,0xDE87, 0, 0,0xDEB7, 0,
+ 0xDF08,0xDEF9, 0, 0,0xDEF4, 0, 0, 0,0xDE57, 0,
+ 0xDFD6, 0,0xDCDE, 0, 0,0xDFD4, 0, 0,0xDC90,0xDC8D,
+ 0, 0,0xDD60,0xDDCE,0xDDCF, 0, 0,0xDDD1, 0, 0,
+ 0, 0,0xDCCA,
+ /* plane 4, row 7 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84F,0x3CD8,0xD84F,0xD84F,0xD84F,0x6CB5,0x3DA7,0xD850,0x7097,
+ 0xD850,0x709B,0x3E12,0xD851,0xD851,0x3E2F,0xD851,0x726B,0x3E2E,0x3E2C,
+ 0x3E5C,0xD851,0x72D5,0xD851,0xD851,0x3E62,0x3E67,0x3EB4,0xD852,0xD852,
+ 0xD852,0xD853,0x7543,0xD848,0xD853,0x759C,0xD853,0xD853,0x3FEA,0xD854,
+ 0x3FFB,0xD854,0x4014,0xD854,0x4013,0x4012,0x4010,0x4011,0xD854,0x4086,
+ 0x77E4,0x4098,0xD855,0xD855,0x412A,0xD855,0xD856,0xD856,0xD856,0x7ACE,
+ 0x42B5,0xD858,0xD858,0xD859,0xD859,0x8013,0x43D6,0x43D8,0x80B7,0x43D9,
+ 0x43D4,0x43D7,0xD87E,0x80B9,0xffff,0xD859,0x81E4,0x81FD,0x820F,0x4460,
+ 0xD85A,0xD85A,0x449E,0x44A1,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0x82BF,0x82CA,0xD85A,0xD85A,0x82C1,
+ 1, /* first low-surrogate */
+ 0xDCB7, 0,0xDCB2,0xDCBB,0xDCB9, 0, 0,0xDD9E, 0,
+ 0xDDB2, 0, 0,0xDD6F,0xDDAC, 0,0xDE23, 0, 0, 0,
+ 0,0xDF6C, 0,0xDF32,0xDF5E, 0, 0, 0,0xDCFB,0xDF29,
+ 0xDFBD,0xDC1F, 0,0xDF41,0xDC1D, 0,0xDD31,0xDD2F, 0,0xDC43,
+ 0,0xDC41, 0,0xDCF5, 0, 0, 0, 0,0xDCF2, 0,
+ 0, 0,0xDC1E,0xDF54, 0,0xDF56,0xDD29,0xDD27,0xDD28, 0,
+ 0,0xDE79,0xDE7E,0xDCB6,0xDCB7, 0, 0, 0, 0, 0,
+ 0, 0,0xDD81, 0, 0,0xDE4D, 0, 0, 0, 0,
+ 0xDE09,0xDE08, 0, 0,0xDF1E,0xDF1A,0xDF23,0xDF15,0xDF19,0xDF16,
+ 0, 0,0xDF14,0xDF18,
+ /* plane 4, row 8 */
+ 1 | (94 << 8), /* first, last */
+ 0x44A0,0xD85C,0xD85D,0xD85D,0xD861,0x8FD0,0xffff,0xD861,0x48B9,
+ 0xD861,0x90AE,0xD861,0xD861,0xD861,0xD861,0xD863,0x49C1,0x49C2,0x9638,
+ 0xD87E,0x341C,0xD840,0x345E,0x4FBC,0x3459,0x345C,0xD840,0x345F,0x4FE9,
+ 0x4FBD,0x4FE2,0x5158,0xD841,0xD841,0x34CE,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0x52C6,0xD842,0x52C8,0xD842,0xD842,0x5328,0xD842,0x5329,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0x355F,0xD843,0x3585,0xD843,0xD843,
+ 0x3586,0xD843,0x57B4,0xD844,0x57A9,0x3687,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0x36CA,0xD845,0x36C3,0xD845,0xD845,0xD845,0x36C2,0x5B68,0xD846,
+ 0x3741,0xD846,0xD846,0xD846,0x3780,0x3781,0xD847,0xD847,0x3793,0x3792,
+ 0xD847,0x37C5,0xD847,0xffff,0xD847,
+ 2, /* first low-surrogate */
+ 0xDE1F,0xDDDD,0xDDDF,0xDC69, 0, 0,0xDC6C, 0,
+ 0xDE93, 0,0xDE95,0xDE94,0xDE91,0xDE97,0xDE30, 0, 0, 0,
+ 0xDE18, 0,0xDE31, 0, 0, 0, 0,0xDE36, 0, 0,
+ 0, 0, 0,0xDDC9,0xDDCA, 0,0xDF18,0xDF12,0xDF19,0xDF10,
+ 0xDF16, 0,0xDC5F, 0,0xDCDF,0xDD17, 0,0xDD3C, 0,0xDDEA,
+ 0xDDE9,0xDE1C,0xDE58,0xDE64,0xDEF3, 0,0xDC97, 0,0xDC5A,0xDC59,
+ 0,0xDC8E, 0,0xDEBC, 0, 0,0xDE0D,0xDDFC,0xDE0C,0xDF07,
+ 0xDF0A, 0,0xDF02, 0,0xDF26,0xDF08,0xDF1D, 0, 0,0xDD4E,
+ 0,0xDDED,0xDDEE,0xDDEF, 0, 0,0xDC50,0xDC4C, 0, 0,
+ 0xDC4F, 0,0xDDD4, 0,0xDDB0,
+ /* plane 4, row 9 */
+ 1 | (94 << 8), /* first, last */
+ 0x3846,0x3841,0x3845,0x3842,0x383F,0xD848,0xD848,0x3882,0x3881,
+ 0x387F,0x38A5,0x5F2B,0x38B3,0x38B5,0xD848,0xD848,0x5F8D,0x38DA,0xD849,
+ 0x38DB,0x390D,0x6018,0x390E,0xD849,0x391E,0x3925,0x3926,0x391C,0x3921,
+ 0x6057,0x6048,0x3927,0x391A,0xD849,0xD849,0xD849,0x6038,0xD849,0xD849,
+ 0x3924,0xD849,0xD87E,0x6071,0xD84A,0x39C1,0x39E1,0xD84A,0xD84A,0x6312,
+ 0x39EB,0xD84A,0x39E2,0x39D7,0x39E9,0xD84A,0xD84A,0x630A,0xD84A,0x6323,
+ 0xD84A,0x3A84,0xD84B,0xD84B,0xD84B,0x3AB5,0x3ABC,0x3ADC,0x3ADE,0x3ADF,
+ 0xD84C,0x662A,0xD84C,0xD84C,0xD84C,0xD84D,0x3B54,0x67E0,0x67BE,0x3B53,
+ 0x3C24,0x3C25,0x6B29,0x3C28,0x3C27,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0x3C8B,0xD84F,0xD84F,0x3CDC,
+ 6, /* first low-surrogate */
+ 0xDCA5,0xDE09, 0, 0,
+ 0, 0, 0, 0, 0,0xDFF3,0xDFD7, 0, 0,0xDCDC,
+ 0, 0, 0, 0,0xDE0B, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xDE3A,0xDE0D,0xDE11, 0,0xDE20,0xDE01,
+ 0,0xDE37,0xDCA3, 0,0xDDAA, 0, 0,0xDEE7,0xDEE8, 0,
+ 0,0xDEF5, 0, 0, 0,0xDF35,0xDEE6, 0,0xDEF8, 0,
+ 0xDEF1, 0,0xDF14,0xDF15,0xDF09, 0, 0, 0, 0, 0,
+ 0xDD7B, 0,0xDD7E,0xDF66,0xDF67,0xDC0A, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xDC9C,0xDD62,0xDDE1,0xDDDE,0xDDDF,
+ 0xDDE9, 0,0xDCE4,0xDCF7,
+ /* plane 4, row 10 */
+ 1 | (94 << 8), /* first, last */
+ 0x6D43,0xD84F,0xD84F,0xD84F,0xD87E,0x70A6,0x3DB2,0x70C0,0xD850,
+ 0x722F,0xD851,0x3E1B,0xD851,0x3E32,0x7271,0xD851,0xD851,0x3E6B,0xD851,
+ 0x3E6C,0x3E6D,0xD852,0x3EB9,0x3EBA,0x3F09,0x3F0A,0xD852,0x74EA,0x3F1B,
+ 0xD852,0xD852,0x7520,0x3F58,0xD853,0x3F5A,0xD87E,0xD853,0x3F77,0xD853,
+ 0xD853,0x3F79,0x75A9,0xD853,0x7685,0xD853,0x3FEB,0xD853,0x3FFD,0x3FFC,
+ 0x7706,0x4015,0x4018,0x76F6,0x4016,0x4017,0x4019,0x7700,0x401B,0xD854,
+ 0xD854,0x7702,0xD854,0x4087,0xD854,0xD854,0x409C,0xD855,0x409A,0xD855,
+ 0x40FF,0x40FE,0xD855,0x4131,0x412E,0x4130,0x4132,0xD855,0xffff,0x412F,
+ 0xD855,0x4195,0x4196,0xD856,0xD856,0xD856,0x41C5,0x427A,0xD858,0x4342,
+ 0xD858,0x4354,0xD858,0xD858,0xD858,
+ 2, /* first low-surrogate */
+ 0xDCEA,0xDCF6,0xDD12,0xDD01, 0, 0, 0,0xDDD9,
+ 0,0xDD5F, 0,0xDD73, 0, 0,0xDE3F,0xDF78, 0,0xDF7D,
+ 0, 0,0xDD12, 0, 0, 0, 0,0xDF2F, 0, 0,
+ 0xDF30,0xDFDB, 0, 0,0xDC29, 0,0xDD36,0xDD40, 0,0xDD3D,
+ 0xDD3E, 0, 0,0xDD38, 0,0xDF48, 0,0xDFD0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xDD0E,
+ 0xDD09, 0,0xDD07, 0,0xDF5F,0xDF60, 0,0xDC2A, 0,0xDC29,
+ 0, 0,0xDE4D, 0, 0, 0, 0,0xDF6C, 0, 0,
+ 0xDF67, 0, 0,0xDD39,0xDD34,0xDE59, 0, 0,0xDE23, 0,
+ 0xDE82, 0,0xDE83,0xDEA8,0xDF55,
+ /* plane 4, row 11 */
+ 1 | (94 << 8), /* first, last */
+ 0xD858,0xD858,0xD858,0xD858,0x8009,0xD87E,0x439F,0x43A0,0x43A2,
+ 0x43E0,0xD859,0x43E1,0xD859,0xD859,0x43DF,0xD859,0xD85A,0x4462,0x4461,
+ 0xD85A,0xD85A,0x44A7,0xD85A,0xD85A,0xD85A,0x82DA,0xD85A,0xD85A,0x830A,
+ 0x4589,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0x461D,0xD85D,
+ 0xD85D,0x472A,0xD85F,0xD85F,0x47D3,0x4842,0x4843,0xD861,0x4891,0xD861,
+ 0xD861,0x4890,0x48BF,0xD861,0x48BC,0xD861,0x48C0,0x49C7,0x49C5,0x9655,
+ 0xD863,0x9652,0x4E35,0xD840,0xD840,0x5034,0x5001,0xD840,0x500A,0x3466,
+ 0xD840,0xD840,0xD840,0x34AD,0xD841,0xD841,0xD841,0xD841,0x5258,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD842,0x351D,0xD842,0x3531,0x532B,0xD842,
+ 0x354C,0xD842,0xD842,0x3595,0x3591,
+ 1, /* first low-surrogate */
+ 0xDFF9,0xDFF8,0xDFFC,0xDFFA, 0,0xDD7A, 0, 0, 0,
+ 0,0xDE74, 0,0xDE6B,0xDE71, 0,0xDE76,0xDE0E, 0, 0,
+ 0xDE10,0xDE0F, 0,0xDF38,0xDF39,0xDF3A, 0,0xDF37,0xDF3E, 0,
+ 0,0xDD9C,0xDE2A,0xDE3A,0xDE2B,0xDE28,0xDDAA,0xDE0F, 0,0xDE10,
+ 0xDFE6, 0,0xDD25,0xDE8E, 0, 0, 0,0xDC8B, 0,0xDC8C,
+ 0xDC9A, 0, 0,0xDEB3, 0,0xDEB2, 0, 0, 0, 0,
+ 0xDE44, 0, 0,0xDD58,0xDEA7, 0, 0,0xDE63, 0, 0,
+ 0xDE6A,0xDE65,0xDE6B, 0,0xDCED,0xDDD9,0xDF3B,0xDF32, 0,0xDF35,
+ 0xDF31,0xDF3E,0xDF43,0xDF36,0xDC6D, 0,0xDCE4, 0, 0,0xDDF4,
+ 0,0xDE69,0xDE6B,
+ /* plane 4, row 12 */
+ 1 | (94 << 8), /* first, last */
+ 0x3594,0xD843,0xD843,0xD843,0x358F,0x54EC,0xD843,0x5515,0x54FE,
+ 0xD843,0xD843,0xD843,0x54E3,0x5516,0x3640,0xD844,0x3641,0xD844,0x57D3,
+ 0xD844,0xD845,0xD845,0xD845,0x5959,0x5A27,0x36D8,0x36D2,0x36DA,0x5A28,
+ 0x5A10,0x36D7,0x5A0E,0x3742,0x3757,0xD846,0xD846,0xD846,0x5BAF,0xD846,
+ 0x5BBA,0x5BB1,0xD846,0xD846,0x3778,0x3782,0x3797,0xD847,0xD847,0x37C9,
+ 0xD847,0x37C8,0x37D6,0x37CC,0xD847,0x37D0,0xD847,0xD847,0x37CE,0x37C7,
+ 0x5CFC,0xD847,0x37CF,0x37CB,0x5CF2,0x5CFE,0xD847,0xD847,0x5DF8,0xD848,
+ 0x3847,0xD848,0x3848,0xD848,0xD848,0x3883,0x3885,0x3884,0xD848,0xD848,
+ 0x5F2C,0x38B8,0x38BC,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,
+ 2, /* first low-surrogate */
+ 0xDCBF,0xDCC3,0xDCAE, 0, 0,0xDCB1, 0, 0,
+ 0xDCBB,0xDCAF,0xDCB0, 0, 0, 0,0xDEEF, 0,0xDEED, 0,
+ 0xDEF0,0xDD93,0xDE34,0xDE2B, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xDE04,0xDE03,0xDE02, 0,0xDE05,
+ 0, 0,0xDE00,0xDF74, 0, 0, 0,0xDC65,0xDC63, 0,
+ 0xDDD7, 0, 0, 0,0xDDE8, 0,0xDDDB,0xDDD8, 0, 0,
+ 0,0xDE09, 0, 0, 0, 0,0xDDE5,0xDDE7, 0,0xDC3F,
+ 0,0xDCC0, 0,0xDCB9,0xDCBA, 0, 0, 0,0xDE20,0xDF4F,
+ 0, 0, 0,0xDC91,0xDC90,0xDCEE,0xDCF3,0xDCEC,0xDCF1,0xDCEB,
+ 0xDCF2,0xDCF4,0xDCED,0xDE41,0xDE48,
+ /* plane 4, row 13 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0x3931,0x3934,0x3936,0x6082,0xD849,0xD849,0x3923,0xD849,
+ 0xD849,0x393A,0x6091,0x608F,0xD849,0x39B4,0x39B5,0x39ED,0x39EC,0x39D8,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0x39F6,0x39E7,0xD84A,
+ 0xD84B,0x3A7C,0x3A7B,0xD84B,0x3A88,0x6547,0x654C,0xD84B,0xD87E,0x658A,
+ 0xD84C,0x3ABE,0xD84C,0x3AE7,0x3AE5,0x3AEE,0x67E1,0x684A,0xD84D,0x3B59,
+ 0x3B5E,0xD84D,0x3B5A,0x683F,0x3B61,0x3B58,0x3B5B,0x67BD,0xD84D,0x3B5F,
+ 0xD87E,0x3C2A,0x3C2D,0xD84E,0x3C23,0x3C2B,0x3C2C,0xD84E,0x3C7E,0xD87E,
+ 0x3C93,0x3C99,0xD84E,0xD84E,0x3CB3,0x3CE7,0x3CEA,0xD84F,0xD84F,0xD84F,
+ 0xD87E,0xD84F,0xD84F,0x3DB4,0xD850,0x70C9,0x3E17,0xD851,0xD851,0xD851,
+ 0x3E21,0xD851,0x3E38,0x3E37,0x3E74,
+ 1, /* first low-surrogate */
+ 0xDE45, 0, 0, 0, 0,0xDE7F,0xDE8B, 0,0xDE3B,
+ 0xDE4E, 0, 0, 0,0xDE7C, 0, 0, 0, 0, 0,
+ 0xDEF0,0xDF36,0xDF3F,0xDF43,0xDF31,0xDF34,0xDF46, 0, 0,0xDF2F,
+ 0xDEC3, 0, 0,0xDF36, 0, 0, 0,0xDF21,0xDCC8, 0,
+ 0xDC73, 0,0xDCE6, 0, 0, 0, 0, 0,0xDC3F, 0,
+ 0,0xDC6B, 0, 0, 0, 0, 0, 0,0xDC71, 0,
+ 0xDCE2, 0, 0,0xDCB0, 0, 0, 0,0xDDF3, 0,0xDCF5,
+ 0, 0,0xDF61,0xDF5F, 0, 0, 0,0xDD28,0xDD1E,0xDD29,
+ 0xDD02,0xDCEB,0xDD66, 0,0xDDF6, 0, 0,0xDD60,0xDD77,0xDDBB,
+ 0,0xDDBC,
+ /* plane 4, row 14 */
+ 1 | (94 << 8), /* first, last */
+ 0x3E73,0x3E75,0xD851,0xD851,0xD851,0x3E76,0x3E78,0xD852,0xD852,
+ 0x73BA,0x3F0C,0x3F20,0x3F1E,0xD853,0x3F5B,0xD853,0x3F5C,0xD853,0x3F83,
+ 0x75C6,0x3F80,0x3F81,0x3F7E,0x3F88,0x3F85,0x3F89,0x3F7F,0x3F8E,0xD853,
+ 0xD853,0x3F84,0x75B7,0x768C,0xD853,0x768D,0xD853,0x3FEE,0x3FED,0x3FFE,
+ 0xD854,0x3FFF,0xD854,0xD854,0xD854,0x4023,0xD854,0x7717,0xD854,0x771C,
+ 0x401F,0xD854,0xD854,0x7714,0xD854,0x408F,0x4090,0xD855,0xD855,0xD855,
+ 0x40A0,0xD855,0x40A6,0x409F,0xD855,0x40A7,0x40A1,0xD855,0x4102,0x4136,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x41C8,0xD856,0xD856,
+ 0x41D8,0x7B0C,0x41DD,0x41DC,0xD856,0x41D7,0xD856,0x41DA,0x42BA,0xD857,
+ 0xD857,0xD857,0x42BE,0x42C2,0x42BB,
+ 3, /* first low-surrogate */
+ 0xDFA2,0xDFB2,0xDF9E, 0, 0,0xDD3A,0xDD38,
+ 0, 0, 0, 0,0xDC4D, 0,0xDC5E, 0,0xDD17, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,0xDD64,
+ 0xDD67, 0, 0, 0,0xDF59, 0,0xDFDA, 0, 0, 0,
+ 0xDC51, 0,0xDC55,0xDD3B,0xDD34, 0,0xDD37, 0,0xDD31, 0,
+ 0,0xDD3F,0xDD59, 0,0xDF61, 0, 0,0xDC58,0xDC62,0xDC50,
+ 0,0xDC51, 0, 0,0xDC46, 0, 0,0xDE2D, 0, 0,
+ 0xDD48,0xDD51,0xDD4A,0xDD4F,0xDD50,0xDD49,0xDE63, 0,0xDE66,0xDE60,
+ 0, 0, 0, 0,0xDEF1, 0,0xDF07, 0, 0,0xDF9B,
+ 0xDFA3,0xDF9D,
+ /* plane 4, row 15 */
+ 1 | (94 << 8), /* first, last */
+ 0x42C0,0xD857,0xD857,0xD857,0x7D23,0xD857,0xD848,0xD858,0x4343,
+ 0x4355,0xD858,0xD858,0x4357,0x4368,0x7F98,0x7F90,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0x43A1,0xD859,0x803A,0xD859,0xD859,0xD859,
+ 0xD859,0x43EA,0xD859,0x43E7,0xD859,0xD859,0xD859,0xD859,0x43E8,0x43E9,
+ 0xD859,0xD85A,0x4454,0xD85A,0xD85A,0xD85A,0xD85A,0x8226,0x4465,0xD85A,
+ 0xD85A,0x448A,0xD85A,0x44B0,0xD85A,0xD85A,0xD85A,0x44BC,0x832E,0xD85A,
+ 0x8355,0x831A,0x44B8,0x833D,0xD85A,0x44B2,0xD85A,0x8330,0x44BD,0xD85A,
+ 0xD85A,0x458A,0x8651,0x45A1,0xD85C,0x45A2,0xD85C,0x8688,0xD85C,0x4615,
+ 0xD85D,0xD85D,0x4620,0x4673,0xD85D,0x898E,0x898D,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0x8A09,0x8A14,0x46B1,
+ 2, /* first low-surrogate */
+ 0xDFA9,0xDFA7,0xDFA4, 0,0xDFBA,0xDDC1,0xDE26, 0,
+ 0,0xDE94,0xDE93, 0, 0, 0, 0,0xDC07,0xDC0D,0xDC02,
+ 0xDC0C,0xDC09,0xDC08,0xDC13, 0,0xDCD2, 0,0xDD3E,0xDD3C,0xDE67,
+ 0xDE9E, 0,0xDEAD, 0,0xDED9,0xDE42,0xDEA3,0xDEA0, 0, 0,
+ 0xDE7C,0xDD04, 0,0xDD58,0xDD60,0xDDC9,0xDDC8, 0, 0,0xDE1C,
+ 0xDE1A, 0,0xDF74, 0,0xDF6E,0xDF6F,0xDF79, 0, 0,0xDF77,
+ 0, 0, 0, 0,0xDF7C, 0,0xDF70, 0, 0,0xDF7A,
+ 0xDF82, 0, 0, 0,0xDE44, 0,0xDE43, 0,0xDE45, 0,
+ 0xDE25,0xDE1F, 0, 0,0xDFE8, 0, 0,0xDC09,0xDCB7,0xDCB9,
+ 0xDD64,0xDD63,
+ /* plane 4, row 16 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85E,0xD85E,0x472B,0xD85E,0x4745,0xD85F,0x4797,0x4798,0xD85F,
+ 0x47D5,0xD85F,0xD87E,0x4893,0x4896,0x9007,0x4894,0xD861,0xD861,0x48C7,
+ 0x48C5,0xD861,0xD861,0xD861,0x48C4,0xD861,0x9579,0x9584,0x49CE,0x49CA,
+ 0x49CC,0x9657,0x49C9,0x96BA,0xffff,0xD867,0xD840,0x346E,0xD840,0x5067,
+ 0xD840,0xD840,0x3471,0xD840,0x34BB,0x34D3,0xD841,0xD841,0xD841,0xD841,
+ 0x34F3,0x34ED,0x34F5,0xD841,0xD841,0x34F1,0x34F2,0x34F6,0x3520,0xD842,
+ 0x3528,0xD842,0x5318,0x532C,0x5359,0xD842,0xD842,0xD842,0x5368,0x537E,
+ 0xD842,0xD842,0x53A1,0xD843,0x35A1,0x555B,0x35AA,0x35A9,0xD843,0x35B5,
+ 0x35A5,0x35A8,0x5542,0x35A7,0x5547,0xD843,0xD87E,0x553D,0xD843,0xD843,
+ 0x5560,0x57EB,0xD844,0xD844,0xD844,
+ 1, /* first low-surrogate */
+ 0xDD62,0xDD65, 0,0xDFAC, 0,0xDD2A, 0, 0,0xDE96,
+ 0,0xDFC2,0xDDDE, 0, 0, 0, 0,0xDCAA,0xDCB0, 0,
+ 0,0xDED4,0xDECD,0xDED6, 0,0xDFF0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xDD4B,0xDD62, 0,0xDEB7, 0,
+ 0xDEAC,0xDEAB, 0,0xDEC1, 0, 0,0xDDE8,0xDF69,0xDF5D,0xDF5F,
+ 0, 0, 0,0xDF64,0xDF62, 0, 0, 0, 0,0xDCF9,
+ 0,0xDCEE, 0, 0, 0,0xDDAB,0xDDAC,0xDDAA, 0, 0,
+ 0xDE86,0xDE7A, 0,0xDD28, 0, 0, 0, 0,0xDD31, 0,
+ 0, 0, 0, 0, 0,0xDD2D,0xDC43, 0,0xDD2B,0xDD32,
+ 0, 0,0xDF29,0xDF26,0xDF53,
+ /* plane 4, row 17 */
+ 1 | (94 << 8), /* first, last */
+ 0x364D,0xD844,0xD844,0xD845,0x369C,0x595F,0xD845,0x36EA,0x36E5,
+ 0xD845,0xD845,0x5B6F,0xD846,0x375E,0xD846,0xD87E,0xD846,0x3786,0x3784,
+ 0xD846,0x5C5A,0xD847,0x37D9,0xD847,0x37DE,0xD847,0xD847,0xD847,0x37DB,
+ 0xD847,0xD847,0xD847,0xD847,0x3831,0xD848,0xD848,0x384B,0xD848,0x3849,
+ 0x384A,0x384C,0xD848,0xD848,0x388A,0xD848,0x3889,0x388B,0xD848,0x38BB,
+ 0x5FA2,0x5F9D,0x38E4,0xD849,0xD849,0x5FA3,0xD849,0xD849,0x393B,0x392E,
+ 0x393E,0x3946,0x3953,0xD849,0x3944,0xD849,0x393F,0x3942,0x394F,0xD849,
+ 0x3952,0x394A,0x60C2,0xD849,0x395A,0x60A5,0x3949,0xD849,0x621C,0xD84A,
+ 0x621D,0x3A03,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0x6395,0x639A,0x3A01,
+ 0x3A06,0x39FB,0x39F9,0xD84A,0x3A05,
+ 2, /* first low-surrogate */
+ 0xDF33,0xDF34,0xDD9D, 0, 0,0xDE41, 0, 0,
+ 0xDF91,0xDF69, 0,0xDE22, 0,0xDE34,0xDC6D,0xDF2E, 0, 0,
+ 0xDFF4, 0,0xDE28, 0,0xDE1C, 0,0xDE11,0xDE24,0xDE15, 0,
+ 0xDE16,0xDE54,0xDE23,0xDFFF, 0,0xDCCF,0xDCD0, 0,0xDCCE, 0,
+ 0, 0,0xDDC7,0xDE5C, 0,0xDE36, 0, 0,0xDE43, 0,
+ 0, 0, 0,0xDD2A,0xDD01, 0,0xDD0B,0xDD0F, 0, 0,
+ 0, 0, 0,0xDEDF, 0,0xDED2, 0, 0, 0,0xDECD,
+ 0, 0, 0,0xDEDB, 0, 0, 0,0xDECF, 0,0xDDC0,
+ 0, 0,0xDF81,0xDF82,0xDF8A,0xDFA8,0xDF8C, 0, 0, 0,
+ 0, 0, 0,0xDF8E,
+ /* plane 4, row 18 */
+ 1 | (94 << 8), /* first, last */
+ 0x39FA,0xD84A,0x63A6,0xD84A,0x39FE,0xD84A,0x3A7D,0x3A8C,0xD84B,
+ 0xD84B,0x6550,0x3A8E,0xD84B,0xD84B,0x6552,0xD84B,0xD84B,0xD84C,0xD84C,
+ 0x65C8,0xD84C,0x3AF0,0x3AF2,0xD84C,0x6658,0x3AF1,0x3AE6,0xD84C,0xD84C,
+ 0xD87E,0x6888,0xD84D,0x3B6F,0x3B6D,0x3B69,0xD84D,0xD84D,0x3B6E,0xD84D,
+ 0x3C2F,0x3C30,0x3C63,0xD84E,0xD84E,0xD84E,0x6BB8,0x3C80,0x6BB9,0x3C9A,
+ 0x3C94,0x3C96,0x3C95,0x3C97,0xD84E,0x3CF4,0x3CFE,0xD84F,0x3D01,0xD84F,
+ 0x3D02,0xD84F,0x3CF9,0xD84F,0xD84F,0xD84F,0xD84F,0x3CF6,0x3CF7,0xD84F,
+ 0xD84F,0xD84F,0x3CFF,0xD84F,0xD84F,0xD84F,0xD84F,0x6E0B,0xD84F,0xD850,
+ 0x3DBF,0x3DBC,0x7105,0xD850,0xD850,0xD850,0x3DBE,0x3DC0,0xD851,0x3E3B,
+ 0x3E39,0xD851,0xD851,0xD851,0x3E3C,
+ 2, /* first low-surrogate */
+ 0xDF8B, 0,0xDF96, 0,0xDFCC, 0, 0,0xDF4F,
+ 0xDF4A, 0, 0,0xDF4B,0xDF3D, 0,0xDF44,0xDF49,0xDC9E,0xDCF3,
+ 0,0xDCF5, 0, 0,0xDDB3, 0, 0, 0,0xDDE5,0xDDB6,
+ 0xDCD8, 0,0xDC86, 0, 0, 0,0xDCB6,0xDC85, 0,0xDCAB,
+ 0, 0, 0,0xDE0D,0xDE8B,0xDE8C, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xDF72, 0, 0,0xDD8F, 0,0xDD79,
+ 0,0xDD77, 0,0xDD90,0xDD88,0xDD80,0xDD9E, 0, 0,0xDD82,
+ 0xDD34,0xDD89, 0,0xDD85,0xDD7E,0xDD7A,0xDDA6, 0,0xDDB5,0xDDF4,
+ 0, 0, 0,0xDE29,0xDE26,0xDE2A, 0, 0,0xDD7E, 0,
+ 0,0xDE5B,0xDE61,0xDE60,
+ /* plane 4, row 19 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0x7314,0x7304,0xD851,0x3E7D,0xD851,0x3E7F,0x3E7A,0x3E7C,
+ 0x7305,0x3E7E,0x7315,0x730D,0x3E80,0x3EBF,0x3EC3,0xD852,0xD852,0x3ECC,
+ 0x3F0E,0x3F0D,0xD852,0x3F26,0x3F24,0x3F25,0x3F23,0x3F21,0x3F29,0xD853,
+ 0xD853,0x3F8F,0x3F8D,0xD853,0x3F8B,0x3F92,0xD853,0x3F90,0xD853,0x3FEF,
+ 0x3FF0,0xD853,0xD854,0x4001,0xD854,0x402E,0x402D,0x772E,0x4028,0x4029,
+ 0x402C,0xD854,0xD854,0xD854,0x7741,0x4088,0xD854,0x4092,0x4091,0x77EA,
+ 0xD854,0x7844,0x40A9,0x40AC,0x40AE,0x40AA,0x4106,0x4105,0x414A,0x413E,
+ 0x413C,0x413B,0xD855,0x4142,0x4141,0x4143,0xD855,0x4145,0xD856,0x419A,
+ 0x419B,0x419F,0x419E,0xD856,0xD856,0xD856,0x41DE,0x41E2,0x41E6,0xD856,
+ 0x7B29,0x41E3,0x7B27,0x41DF,0xD857,
+ 1, /* first low-surrogate */
+ 0xDF9B, 0, 0,0xDFC3, 0,0xDFCD, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDD54,0xDD59, 0,
+ 0, 0,0xDEF5, 0, 0, 0, 0, 0, 0,0xDC69,
+ 0xDC65, 0, 0,0xDD7C, 0, 0,0xDD80, 0,0xDF65, 0,
+ 0,0xDFDF,0xDC60, 0,0xDC5E, 0, 0, 0, 0, 0,
+ 0,0xDD8F,0xDD61,0xDD5A, 0, 0,0xDF67, 0, 0, 0,
+ 0xDFBB, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xDF9B, 0, 0, 0,0xDFA9, 0,0xDD66, 0,
+ 0, 0, 0,0xDE72,0xDE76,0xDF14, 0, 0, 0,0xDF0F,
+ 0, 0, 0, 0,0xDE41,
+ /* plane 4, row 20 */
+ 1 | (94 << 8), /* first, last */
+ 0xD857,0x7C9D,0xD857,0xD857,0x427E,0x42C9,0x42CC,0xD857,0x42D1,
+ 0xD857,0x42D0,0xD857,0x42CF,0x42C8,0xD857,0x42CD,0xD857,0xD857,0x4349,
+ 0x4347,0x4358,0x436B,0x436C,0x436A,0xD858,0x4380,0x4382,0x4384,0x7FC8,
+ 0x4383,0xD859,0xD859,0x43B6,0xD859,0xD859,0xD859,0xD859,0xD859,0x8126,
+ 0x43F1,0xD859,0x43F6,0x43F3,0x43F0,0x811C,0xD859,0xD859,0x8128,0x43F5,
+ 0x43F4,0x43F7,0xD859,0xD859,0xD85A,0xD87E,0x4455,0xD85A,0xD85A,0xD85A,
+ 0x448B,0x44CB,0x44C2,0xD85A,0xD85A,0xD85A,0x44CA,0x44CC,0xD85A,0x44C7,
+ 0x44C9,0x8370,0xD85A,0x44C6,0xD85B,0xD85A,0x44C3,0x8382,0xD85A,0x83AC,
+ 0xD85A,0x44C4,0xD85A,0xD87E,0xD87E,0xD85A,0xD85C,0xD85C,0xD85C,0x45A9,
+ 0x86AD,0x45A8,0x45A6,0xD85C,0xD85C,
+ 1, /* first low-surrogate */
+ 0xDE46, 0,0xDE4B,0xDE43, 0, 0, 0,0xDFC6, 0,
+ 0xDFC7, 0,0xDFCE, 0, 0,0xDFC9, 0,0xDFCB,0xDFC5, 0,
+ 0, 0, 0, 0, 0,0xDF69, 0, 0, 0, 0,
+ 0,0xDC1E,0xDCBA, 0,0xDD52,0xDD51,0xDD53,0xDE9F,0xDEDB, 0,
+ 0,0xDEE3, 0, 0, 0, 0,0xDED7,0xDEE9, 0, 0,
+ 0, 0,0xDEDE,0xDEDC,0xDD3C,0xDD8B, 0,0xDE22,0xDE32,0xDE23,
+ 0, 0, 0,0xDFD4,0xDFC8,0xDFBC, 0, 0,0xDFCD, 0,
+ 0, 0,0xDFBE, 0,0xDC40,0xDFD6, 0, 0,0xDFBD, 0,
+ 0xDFBA, 0,0xDFC0,0xDD9B,0xDD9D,0xDFC1,0xDDA6,0xDDA5,0xDDA8, 0,
+ 0, 0, 0,0xDE5F,0xDE70,
+ /* plane 4, row 21 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0x86CA,0x8851,0xD85D,0xD85D,
+ 0x4622,0xD85D,0x4626,0x4624,0x4625,0x889D,0x462A,0x4674,0xD85E,0x4679,
+ 0x8990,0x467A,0xD85E,0xD85E,0x89D8,0x89D7,0x4697,0xD85E,0xD85E,0x8A2E,
+ 0xD85E,0x46BC,0xD85E,0x46B3,0xD85E,0x46BF,0x46B7,0xD87E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0x4734,0x4746,0x4748,0x8C59,0xD85F,0xD85F,0x4756,0x4767,
+ 0xD85F,0xD85F,0x4768,0x4799,0x479A,0xD85F,0xD85F,0x47D8,0xD85F,0x47DB,
+ 0x47DC,0x47DD,0x47D7,0xD85F,0xD860,0x4849,0x484A,0x8EDA,0xD860,0xD860,
+ 0x9033,0xD861,0x9018,0x489A,0xD861,0x48CD,0x48CA,0xD861,0x48CB,0xD861,
+ 0x48CF,0xD861,0xD87E,0x48CC,0x48EA,0x48ED,0xD861,0xD861,0x48E9,0xD862,
+ 0x491A,0x91EF,0x498D,0x49D2,0xD863,
+ 1, /* first low-surrogate */
+ 0xDE6A,0xDE65,0xDE67,0xDE6F,0xDE87, 0, 0,0xDE3D,0xDE43,
+ 0,0xDE40, 0, 0, 0, 0, 0, 0,0xDC18, 0,
+ 0, 0,0xDC19,0xDCC1, 0, 0, 0,0xDCBC,0xDCC8, 0,
+ 0xDD71, 0,0xDD6E, 0,0xDD78, 0, 0,0xDDCD,0xDD7A,0xDFB1,
+ 0xDFAF,0xDFB0, 0, 0, 0, 0,0xDCA8,0xDCA6, 0, 0,
+ 0xDD48,0xDD45, 0, 0, 0,0xDEA0,0xDEA4, 0,0xDFD4, 0,
+ 0, 0, 0,0xDFD2,0xDE22, 0, 0, 0,0xDEB7,0xDECC,
+ 0,0xDCE6, 0, 0,0xDCC8, 0, 0,0xDEF4, 0,0xDEED,
+ 0,0xDE7E,0xDDE3, 0, 0, 0,0xDFF9,0xDFFD, 0,0xDC07,
+ 0, 0, 0, 0,0xDE78,
+ /* plane 4, row 22 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0x49F2,0xD864,0xD864,0xD864,0x4A3D,0xD864,
+ 0x4A3E,0x4AF8,0x4B23,0x9AD9,0x4EB4,0xD840,0x50A0,0x5090,0x3475,0x5086,
+ 0x5084,0xD840,0x508A,0x3476,0x3473,0x509F,0x50A1,0xD840,0x5093,0x34BD,
+ 0xD841,0x51D5,0xD841,0xD841,0x34F9,0xD841,0xD841,0x34FA,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0x3521,0xD87E,0x3529,0xD842,0xD842,0x3538,0x354E,
+ 0xD842,0xD842,0xD842,0xD843,0xD843,0xD843,0x35C8,0x35BC,0xD843,0xD843,
+ 0x5590,0xD843,0x35BB,0x35C2,0x35C0,0xD843,0xD843,0x35CA,0xD843,0x35C9,
+ 0xD843,0x35B8,0x5710,0x5817,0xD844,0x364E,0xD844,0x5844,0x3650,0x582B,
+ 0xD844,0x5845,0xD844,0xD844,0xD844,0xD844,0xD87E,0x368A,0xD845,0x5965,
+ 0xD845,0xD845,0xD845,0x36FC,0x36F9,
+ 1, /* first low-surrogate */
+ 0xDE7A,0xDE79,0xDF8A, 0,0xDC7B,0xDDD5,0xDDE9, 0,0xDDEB,
+ 0, 0, 0, 0, 0,0xDD6C, 0, 0, 0, 0,
+ 0,0xDEFA, 0, 0, 0, 0, 0,0xDF18, 0, 0,
+ 0xDDF6, 0,0xDF8A,0xDF89, 0,0xDF7F,0xDF88, 0,0xDF83,0xDF84,
+ 0xDF98,0xDF63,0xDF87, 0,0xDC27, 0,0xDCF5,0xDD50, 0, 0,
+ 0xDE87,0xDE8A,0xDF65,0xDDB7,0xDDC1,0xDDC7, 0, 0,0xDDC5,0xDDCB,
+ 0,0xDDD1, 0, 0, 0,0xDDB8,0xDDCA, 0,0xDDDE, 0,
+ 0xDDCE, 0, 0, 0,0xDF68, 0,0xDF6B, 0, 0, 0,
+ 0xDF6A, 0,0xDF66,0xDF77,0xDF96,0xDF6E,0xDC56, 0,0xDE57, 0,
+ 0xDE56,0xDF9C,0xDF9E,
+ /* plane 4, row 23 */
+ 1 | (94 << 8), /* first, last */
+ 0xD845,0x3763,0xD846,0x5BCF,0xD846,0xD846,0xD846,0x3787,0x3788,
+ 0xD846,0x379A,0xD847,0xD847,0xD847,0x5D56,0xD847,0xD847,0x37E9,0xD847,
+ 0x37EA,0x5D54,0x3850,0xD848,0xD848,0x3856,0x3852,0x384F,0x3854,0x3851,
+ 0xD848,0xD848,0x388E,0x388F,0xD848,0xD848,0xD848,0x5F3D,0xD849,0xD849,
+ 0x38ED,0x38EB,0x5FA4,0xD849,0xD849,0xD849,0x3962,0xD849,0x395D,0xD849,
+ 0xD849,0xD849,0x3961,0x3965,0x395C,0xD849,0xD849,0x395F,0xD849,0xD849,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0x63EC,0x3A16,0x3A0A,0xD84A,0x3A0E,0x3A12,
+ 0xD84A,0xD84A,0x3A11,0xD84A,0xD84A,0x3A10,0xD84B,0xD84A,0x3A09,0x63FA,
+ 0x3A15,0x63D4,0xD84B,0xD84B,0xD84B,0x3A91,0x3A95,0x3A93,0x3A92,0x3A8F,
+ 0xD84B,0xD84B,0xD84C,0xD84C,0x3AF6,
+ 1, /* first low-surrogate */
+ 0xDFA1, 0,0xDE42, 0,0xDE46,0xDE3E,0xDF33, 0, 0,
+ 0xDFFA, 0,0xDC97,0xDC9B,0xDCAA, 0,0xDE73,0xDE7C, 0,0xDE86,
+ 0, 0, 0,0xDCF3,0xDCF0, 0, 0, 0, 0, 0,
+ 0xDCEC,0xDEAF, 0, 0,0xDE64,0xDE68,0xDF5A, 0,0xDD1F,0xDD25,
+ 0, 0, 0,0xDEC6,0xDED6,0xDEC3, 0,0xDF2C, 0,0xDF2E,
+ 0xDF5E,0xDF33, 0, 0, 0,0xDF2D,0xDF46, 0,0xDEC1,0xDF3A,
+ 0xDDCC,0xDF9D,0xDF83,0xDFF6, 0, 0, 0,0xDFF8, 0, 0,
+ 0xDFFE,0xDFF3, 0,0xDFEB,0xDFFA, 0,0xDC07,0xDFFC, 0, 0,
+ 0, 0,0xDF72,0xDF73,0xDF74, 0, 0, 0, 0, 0,
+ 0xDF5F,0xDF60,0xDCAA,0xDD34,
+ /* plane 4, row 24 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84C,0x3AFB,0xD84C,0x6675,0x3AF9,0xD84C,0xD84C,0xD84C,0x671C,
+ 0x3B7D,0xD84D,0x3B7A,0x3B7F,0xD84D,0x3B78,0xD84D,0xD84D,0x68D9,0xD84D,
+ 0x3B70,0x3B82,0xD84D,0x3B84,0xD84D,0x3C33,0xD84E,0x3C32,0x3C36,0xD84E,
+ 0xD84E,0x3C56,0xD84E,0xD84E,0x3C67,0xD84E,0x3C65,0x3C64,0x3C66,0xD84E,
+ 0xD84E,0x3C81,0x3C82,0x3C83,0x3C9E,0xD84E,0x6BF1,0x3C9D,0xD84E,0x3D0F,
+ 0x3D12,0xD84F,0xD84F,0xD84F,0x3D10,0x3D18,0xD84F,0x3D14,0x3D19,0x6E37,
+ 0xffff,0xD84F,0x6E7D,0x6E86,0x3DC8,0x3DC4,0x3DC6,0xD850,0x3DC7,0x3DC3,
+ 0xD850,0xD850,0xD87E,0xD850,0xD851,0x3E19,0x3E1C,0xD851,0xD851,0xD851,
+ 0x3E41,0xD851,0x3E42,0x3E43,0xD851,0xD851,0xD851,0x3E82,0xD851,0x3E81,
+ 0x3E94,0x3E84,0xD852,0x3ED2,0x3F0F,
+ 1, /* first low-surrogate */
+ 0xDDB4, 0,0xDDF0, 0, 0,0xDE0D,0xDDF3,0xDE0F, 0,
+ 0,0xDCC9, 0, 0,0xDCC5, 0,0xDCD7,0xDCCC, 0,0xDCE7,
+ 0, 0,0xDCC1, 0,0xDCE8, 0,0xDCCB, 0, 0,0xDCC8,
+ 0xDD7A, 0,0xDD79,0xDD7E, 0,0xDE1B, 0, 0, 0,0xDE1F,
+ 0xDE19, 0, 0, 0, 0,0xDF89, 0, 0,0xDF8B, 0,
+ 0,0xDE09,0xDDFE,0xDE00, 0, 0,0xDE0B, 0, 0, 0,
+ 0,0xDE4A, 0, 0, 0, 0, 0,0xDE79, 0, 0,
+ 0xDE6C,0xDE99,0xDD1B,0xDE62,0xDD14, 0, 0,0xDDC8,0xDDD7,0xDE0C,
+ 0,0xDE70, 0, 0,0xDE71,0xDFDF,0xDFE4, 0,0xDFE7, 0,
+ 0, 0,0xDD90,
+ /* plane 4, row 25 */
+ 1 | (94 << 8), /* first, last */
+ 0x3F22,0xD852,0x3F27,0x3F2A,0x74FA,0x3F28,0xD852,0x3F60,0xD853,
+ 0xD853,0xD853,0x7572,0xD853,0xD853,0x3F9B,0x3F9C,0xD853,0x3F93,0x3F94,
+ 0x75DC,0x3FA0,0x3F99,0xD853,0x3FA1,0xD853,0x3FF1,0xD853,0xD853,0xD854,
+ 0xD854,0x4036,0xD854,0x4037,0x403F,0x403C,0xD854,0x4034,0x4039,0x403B,
+ 0x4035,0x4030,0x4032,0x4038,0x403E,0x403A,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0x40B6,0x7867,0xD855,0xD855,0xD855,0x40B3,0x4109,0x7977,0xD855,
+ 0xD855,0xD855,0x414C,0xD855,0xD855,0x4153,0x414D,0x4151,0x414F,0x7A9B,
+ 0xD856,0x41A2,0xD856,0xD856,0x41CD,0xD856,0xD856,0x41E7,0xD856,0x41F0,
+ 0xD856,0x41E9,0x41EC,0xD856,0x41E8,0x41EE,0x4202,0xD856,0xD856,0xD856,
+ 0xD857,0x4282,0x4283,0x4286,0xD857,
+ 2, /* first low-surrogate */
+ 0xDF4C, 0, 0, 0, 0,0xDF4F, 0,0xDC7D,
+ 0xDC7E,0xDC7C, 0,0xDC8D,0xDD19, 0, 0,0xDDC0, 0, 0,
+ 0, 0, 0,0xDDB6, 0,0xDDA8, 0,0xDFEB,0xDFE7,0xDC6F,
+ 0xDDC7, 0,0xDD9F, 0, 0, 0,0xDDC4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xDD9B,0xDD97,0xDDC5,0xDF6B,
+ 0xDFCE, 0, 0,0xDCB1,0xDCAE,0xDCB0, 0, 0, 0,0xDF3E,
+ 0xDFB5,0xDFBA, 0,0xDFB2,0xDFB4, 0, 0, 0, 0, 0,
+ 0xDD77, 0,0xDD86,0xDD7B, 0,0xDE7E,0xDF2E, 0,0xDF2F, 0,
+ 0xDF37, 0, 0,0xDF32, 0, 0, 0,0xDF36,0xDF39,0xDF35,
+ 0xDE5C, 0, 0, 0,0xDE7B,
+ /* plane 4, row 26 */
+ 1 | (94 << 8), /* first, last */
+ 0xD857,0xD857,0xD857,0xD857,0xD858,0x7D2A,0x7D65,0x434A,0xD858,
+ 0x435A,0x7F64,0xD858,0x436E,0xD858,0xD858,0x4370,0x436F,0xD859,0x438A,
+ 0x4387,0x4388,0xD859,0xD859,0x8020,0x43B7,0x43FD,0x8120,0xD859,0x4405,
+ 0x813C,0x4408,0x4403,0x4402,0x4404,0x3B39,0x4409,0x43FF,0xD859,0x813F,
+ 0xD859,0x43FC,0x4401,0x440A,0x81F0,0x81F5,0x446B,0x446C,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85B,0xD85B,0x44DE,0xD85B,0xD85B,0x44DB,0xD85B,0x44DD,
+ 0x44E3,0xD85B,0x44E0,0x44D9,0x44D8,0x44E4,0xD85B,0xD85B,0x44DA,0x44EF,
+ 0xD87E,0x8415,0x83BE,0xD85B,0xD85B,0xD85B,0x44D7,0x45B3,0x45BB,0x86E5,
+ 0x45B2,0x86D2,0x45AD,0xD85C,0x45AF,0xD87E,0x86E0,0xD85C,0x4616,0x4628,
+ 0x4623,0x88B3,0xD85D,0xD85D,0xD85D,
+ 1, /* first low-surrogate */
+ 0xDE61,0xDFEE,0xDFEB,0xDFEF,0xDC20, 0, 0, 0,0xDE30,
+ 0, 0,0xDEBE, 0,0xDF67,0xDF7C, 0, 0,0xDC24, 0,
+ 0, 0,0xDC29,0xDCEF, 0, 0, 0, 0,0xDF0D, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xDF64, 0,
+ 0xDF15, 0, 0, 0, 0, 0, 0, 0,0xDE35,0xDE36,
+ 0xDE34,0xDE37,0xDC47,0xDC2B, 0,0xDC41,0xDC43, 0,0xDC42, 0,
+ 0,0xDC32, 0, 0, 0, 0,0xDC44,0xDC4A, 0, 0,
+ 0xDDA0, 0, 0,0xDC54,0xDC6E,0xDC52, 0, 0, 0, 0,
+ 0, 0, 0,0xDE92, 0,0xDDB8, 0,0xDEBF, 0, 0,
+ 0, 0,0xDE41,0xDE69,0xDE65,
+ /* plane 4, row 27 */
+ 1 | (94 << 8), /* first, last */
+ 0x4675,0x467E,0x467C,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x46CE,
+ 0x46CD,0x46CF,0x8A53,0xD85E,0xD85E,0x8A37,0x8A47,0x8A5C,0xD85E,0x46C4,
+ 0x46CC,0x46C8,0x46C7,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,
+ 0x475A,0x476A,0xD85F,0x476B,0x476D,0x476F,0xD85F,0x479E,0xD85F,0x47A4,
+ 0x47A3,0x47E4,0x47E8,0x47E9,0x47E0,0x47E3,0xD85F,0x47EA,0x47E1,0x47ED,
+ 0x4834,0x4835,0x4851,0x8EF0,0xD861,0x489D,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0x48D0,0xD861,0x48EE,0xD862,0xD862,0xD862,0x48F2,0xD862,
+ 0x921D,0x4988,0xD863,0xD863,0xD863,0x498F,0xD863,0x49D8,0xD863,0xD863,
+ 0xD863,0xD863,0xD864,0xD864,0x4A3F,0xD864,0x4A52,0x976B,0xD864,0x4A50,
+ 0xD865,0x4AB1,0xD865,0xD865,0x4AF9,
+ 4, /* first low-surrogate */
+ 0xDC22,0xDC1D,0xDCD2,0xDCDA,0xDCDB, 0,
+ 0, 0, 0,0xDDA4,0xDD9E, 0, 0, 0,0xDD9D, 0,
+ 0, 0, 0,0xDDAD,0xDDA6,0xDDA7,0xDFB3,0xDFE0,0xDC35,0xDC37,
+ 0, 0,0xDD4A, 0, 0, 0,0xDE5E, 0,0xDEC0, 0,
+ 0, 0, 0, 0, 0, 0,0xDFF9, 0, 0, 0,
+ 0, 0, 0, 0,0xDCF0, 0,0xDCF3,0xDD1B,0xDCF2,0xDCFB,
+ 0xDF1C,0xDF13, 0,0xDF0F, 0,0xDC16,0xDC11,0xDC12, 0,0xDC0E,
+ 0, 0,0xDC67,0xDCF2,0xDCDA, 0,0xDCDC, 0,0xDF94,0xDF9B,
+ 0xDF92,0xDF9A,0xDC88,0xDC86, 0,0xDDEF, 0, 0,0xDE5E, 0,
+ 0xDC58, 0,0xDC56,0xDC54,
+ /* plane 4, row 28 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD865,0xD865,0x4B26,0x4B28,0xD865,0xD866,0x3480,0x50C0,
+ 0x3481,0xD840,0x347E,0x347F,0xD840,0xD840,0xD87E,0xD841,0x34BE,0xD841,
+ 0x34D6,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0x52E5,0xD842,
+ 0x3534,0xD842,0x53AF,0xD842,0xD842,0xD842,0xD843,0xD843,0x35D5,0x35D8,
+ 0xD843,0xD843,0x35D4,0x55D8,0x35D9,0xD843,0xD843,0xD843,0xD87E,0xD843,
+ 0x5711,0x5867,0xD844,0xD844,0x365D,0x5843,0x365E,0x3659,0xD844,0x365A,
+ 0x36A0,0xD845,0xD845,0x3705,0xD845,0x3707,0xD845,0x370E,0x370C,0xD845,
+ 0xD846,0x3745,0xD846,0xD846,0x3764,0xD846,0x3765,0xD846,0x5BDD,0x3766,
+ 0xD846,0x3789,0x37EC,0x37F1,0x5D70,0x5D6A,0x37F0,0x37F8,0x5D74,0x5D5F,
+ 0xD847,0x5D61,0x5D73,0xD847,0x37F2,
+ 1, /* first low-surrogate */
+ 0xDD9B,0xDE96,0xDEA4, 0, 0,0xDE9A,0xDE12, 0, 0,
+ 0,0xDF6B, 0, 0,0xDF37,0xDF3C,0xDC0A,0xDCF7, 0,0xDD66,
+ 0,0xDFA9,0xDFAE,0xDFAD,0xDFC8,0xDFA5,0xDFB0,0xDC95, 0,0xDD25,
+ 0,0xDE99, 0,0xDF74,0xDF70,0xDF6F,0xDE41,0xDE54, 0, 0,
+ 0xDE40,0xDE38, 0, 0, 0,0xDE52,0xDE3A,0xDE57,0xDC4A,0xDE59,
+ 0, 0,0xDFB4,0xDFC0, 0, 0, 0, 0,0xDF75, 0,
+ 0,0xDE60,0xDE47, 0,0xDFF0, 0,0xDFEF, 0, 0,0xDFEC,
+ 0xDD83, 0,0xDD84,0xDD8F, 0,0xDE61, 0,0xDE69, 0, 0,
+ 0xDE62, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xDEAE, 0, 0,0xDEB2,
+ /* plane 4, row 29 */
+ 1 | (94 << 8), /* first, last */
+ 0x37F4,0xD848,0x3858,0xD848,0xD848,0x385A,0x3859,0x3857,0x385B,
+ 0x5E50,0xD848,0xD848,0x38A6,0x38C2,0x38C1,0x5F3F,0xD849,0xD849,0x38EF,
+ 0x5FB0,0xD849,0xD849,0x3968,0x6135,0x612D,0x3973,0x396E,0x3974,0x6102,
+ 0x3966,0xD849,0xD849,0xD84A,0x39B9,0x6226,0xD84A,0x3A0C,0xD84B,0xD84B,
+ 0x3A20,0xD84B,0x3A1D,0xD84B,0x3A1C,0xD84B,0x3A21,0x3A1A,0x3A19,0xD84A,
+ 0xD84B,0xD84B,0x3A7E,0xD84B,0xD84B,0xD84B,0xD84B,0x3A9D,0xD84B,0x3A9E,
+ 0x3A9C,0x656E,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0x65B1,0x65D4,0x3ACD,
+ 0xD84C,0x3B0B,0x3B0A,0x6685,0xD84D,0x3B8F,0x6972,0x3B95,0x3B90,0x3B91,
+ 0xD84D,0x693A,0x3BB9,0xD84D,0xD84D,0x3B97,0x3B9E,0xD84D,0x3B8B,0xD84D,
+ 0xD84D,0x3C3B,0x3C3A,0x3C3C,0x3C3D,
+ 2, /* first low-surrogate */
+ 0xDD0B, 0,0xDD10,0xDD0D, 0, 0, 0, 0,
+ 0,0xDE7F,0xDE81, 0, 0, 0, 0,0xDC0B,0xDD4E, 0,
+ 0,0xDFEA,0xDF45, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xDF28,0xDF5D,0xDDDC, 0, 0,0xDDD4, 0,0xDC64,0xDC68,
+ 0,0xDC62, 0,0xDC61, 0,0xDC66, 0, 0, 0,0xDFF2,
+ 0xDC69,0xDC67, 0,0xDF9A,0xDF9B,0xDF85,0xDF9C, 0,0xDFA4, 0,
+ 0, 0,0xDF99,0xDF86,0xDF90,0xDC81,0xDCAE, 0, 0, 0,
+ 0xDD38, 0, 0, 0,0xDD3B, 0, 0, 0, 0, 0,
+ 0xDD4C, 0, 0,0xDD47,0xDD35, 0, 0,0xDD33, 0,0xDD82,
+ 0xDD40,
+ /* plane 4, row 30 */
+ 1 | (94 << 8), /* first, last */
+ 0x3C39,0x3C3E,0x3C6B,0x3C6C,0xD84E,0xD84E,0x3CA2,0x3CA1,0x3C9F,
+ 0xD84E,0xD84E,0xD84F,0x3D2D,0xD84F,0x3D36,0x3D2B,0xD84F,0x3D37,0xD87E,
+ 0xD84F,0xD84F,0x6EAD,0x3D25,0x3D2F,0x3D2C,0xD84F,0xD84F,0x3D32,0xD84F,
+ 0xD84F,0x6E95,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,0x3DD5,0xD850,
+ 0x3DD4,0x3DD6,0xD850,0x3DD1,0x7243,0xD851,0x3E46,0x728F,0xD851,0xD851,
+ 0x3E8C,0x3E8A,0x3E88,0xD852,0xD852,0xD851,0xD852,0x3EDD,0xD852,0xD852,
+ 0xD852,0x3F2D,0xD852,0xD852,0x3F2E,0x3F2C,0x3F2B,0x3F30,0xD852,0x3F4E,
+ 0xD853,0xD853,0x3F64,0x3F61,0xD853,0x7575,0xD87E,0x3F70,0x3FA6,0x3FA4,
+ 0xD853,0xD853,0xD853,0x3FA8,0x3FA2,0xD853,0x3FA7,0x75EC,0x3FA5,0xD853,
+ 0x3FA9,0xD853,0xD853,0xD853,0xD853,
+ 5, /* first low-surrogate */
+ 0xDE36,0xDF0E, 0, 0, 0,
+ 0xDFAD,0xDFAA,0xDE17, 0,0xDE67, 0, 0,0xDE72, 0,0xDD0A,
+ 0xDE61,0xDEB0, 0, 0, 0, 0,0xDE6E,0xDE64, 0,0xDE8C,
+ 0xDE66, 0,0xDE6B,0xDE5F,0xDE74,0xDE65,0xDEBB,0xDEBE, 0,0xDEB9,
+ 0, 0,0xDEEF, 0, 0,0xDDDA, 0, 0,0xDE90,0xDFE9,
+ 0, 0, 0,0xDC11,0xDC0D,0xDFED,0xDC21, 0,0xDD81,0xDDB1,
+ 0xDF01, 0,0xDF5E,0xDF62, 0, 0, 0, 0,0xDF5B, 0,
+ 0xDC96,0xDC93, 0, 0,0xDC92, 0,0xDD39, 0, 0, 0,
+ 0xDDC4,0xDDC7,0xDDC3, 0, 0,0xDDC8, 0, 0, 0,0xDDCA,
+ 0,0xDDC5,0xDDCF,0xDDDC,0xDF7C,
+ /* plane 4, row 31 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0x403D,0xD854,0xD854,0x4044,0x4045,0x4046,0xD854,0x7757,
+ 0xD854,0x4047,0x4048,0x4042,0xD854,0xD854,0x4041,0xD854,0xD854,0x4094,
+ 0xD854,0xD854,0xD854,0xD855,0x40C0,0x40B8,0x40C1,0x40C2,0x40BB,0x40BD,
+ 0x40BF,0x40B9,0x40B7,0xD855,0x40C7,0xD855,0x410C,0x410B,0x797B,0x4110,
+ 0xD855,0x415D,0x7A21,0x415A,0x4158,0x4156,0xD855,0x4154,0x7A16,0xD855,
+ 0x41A8,0x41A7,0x41CF,0x41D0,0xD856,0x7AE8,0xD856,0xD856,0x41D1,0x41EB,
+ 0xD856,0x41FB,0x7B6A,0xD856,0x41FD,0x41F8,0x41F7,0x4200,0xD856,0xD856,
+ 0x41F6,0x7B5F,0xD857,0xD858,0x42DF,0xD858,0xD858,0xD858,0x42E2,0x42E4,
+ 0xD858,0x7D82,0xD858,0x42E3,0xD858,0x4359,0x4371,0x438E,0x438C,0xD859,
+ 0x43A4,0xD859,0x8055,0x4414,0xD859,
+ 1, /* first low-surrogate */
+ 0xDC01, 0,0xDDD3,0xDDDC, 0, 0, 0,0xDDD4, 0,
+ 0xDDCC, 0, 0, 0,0xDDD6,0xDDDB, 0,0xDDD5,0xDFD9, 0,
+ 0xDFDD,0xDFDC,0xDFE0,0xDCCC, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xDCD2, 0,0xDCD3, 0, 0, 0, 0,
+ 0xDE8D, 0, 0, 0, 0, 0,0xDFD8, 0, 0,0xDFBC,
+ 0, 0, 0, 0,0xDE8A, 0,0xDE8B,0xDE8D, 0, 0,
+ 0xDF53, 0, 0,0xDF59, 0, 0, 0, 0,0xDF56,0xDF57,
+ 0, 0,0xDE73,0xDC1B, 0,0xDC21,0xDC16,0xDC18, 0, 0,
+ 0xDC44, 0,0xDC26, 0,0xDE36, 0, 0, 0, 0,0xDC3A,
+ 0,0xDCF4, 0, 0,0xDF62,
+ /* plane 4, row 32 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0x4411,0xD859,0x441B,0x4412,0x440E,0x4415,0x8168,
+ 0x4410,0xD859,0x4417,0x8246,0x8243,0x4470,0x44ED,0xD85B,0x44EE,0xD85B,
+ 0xD85B,0xD85B,0x8481,0xD85B,0xD85B,0xD85B,0x44F4,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0x847C,0xD85B,0xD85B,0x846A,0xD85B,0x8488,0x44F2,
+ 0x44F8,0x44F3,0xD85B,0xD85B,0x44FA,0xD85B,0xD85B,0xD87E,0xD85C,0xD85C,
+ 0x8710,0xD85C,0xD85C,0x871F,0x45B6,0x45B7,0xD85C,0x870F,0xD85C,0x45BA,
+ 0xD85C,0x45BC,0xD85C,0xD85D,0x463B,0x88D3,0x462F,0xD85D,0xD85D,0xD85D,
+ 0x4637,0x4699,0xD85E,0xD85E,0xD85E,0xD85E,0x46D9,0x46D8,0x46D7,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0x4736,0xD85E,0xD85F,0xD85F,0x8C87,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0x8CC6,
+ 1, /* first low-surrogate */
+ 0xDF5B,0xDF6A, 0,0xDF68, 0, 0, 0, 0, 0,
+ 0,0xDF81, 0, 0, 0, 0, 0,0xDCE7, 0,0xDCE6,
+ 0xDCD1,0xDD11, 0,0xDCD0,0xDCD9,0xDD0A, 0,0xDCDA,0xDCDD,0xDCC8,
+ 0xDCE2,0xDCE9,0xDCCB, 0,0xDCCC,0xDCC1, 0,0xDCDE, 0, 0,
+ 0, 0,0xDD51,0xDD12, 0,0xDCE0,0xDD2B,0xDDB4,0xDED8,0xDED1,
+ 0,0xDED2,0xDECD, 0, 0, 0,0xDF3D, 0,0xDECA, 0,
+ 0xDECB, 0,0xDED7,0xDDF4, 0, 0, 0,0xDE87,0xDE8B,0xDE83,
+ 0, 0,0xDDC5,0xDDD2,0xDDC6,0xDDD3, 0, 0, 0,0xDDF0,
+ 0xDDCD,0xDDCC,0xDDDC,0xDDD6, 0,0xDFE6,0xDC41,0xDC3F, 0,0xDCC5,
+ 0xDCC0,0xDCC6,0xDCBE,0xDCBF,
+ /* plane 4, row 33 */
+ 1 | (94 << 8), /* first, last */
+ 0x4770,0xD85F,0xD85F,0xD85F,0xD85F,0x47A5,0x47A6,0x47A9,0x47EE,
+ 0x4854,0xD860,0x4857,0xD860,0xD861,0x48A1,0xD861,0xD861,0xD861,0xD861,
+ 0x48D3,0xD861,0x48D4,0xD861,0x48D7,0x90CC,0x916D,0x9170,0x48F7,0x48F6,
+ 0x48F9,0x48F8,0x9258,0x9242,0x9268,0x9269,0xD862,0xD862,0x9243,0xD862,
+ 0x9247,0x498A,0xD863,0xD863,0xD863,0xD863,0x4994,0xD863,0x4993,0xD863,
+ 0xD863,0x959D,0x49DD,0x49DC,0x49F7,0x96CF,0xD864,0xD864,0x4A42,0xD864,
+ 0xD864,0x4A54,0xD864,0x4A55,0xD864,0x4A8F,0xD864,0x97F4,0x4AB4,0x4AB3,
+ 0xD865,0xD865,0x9809,0xD865,0xD865,0xD865,0xD865,0x4AFB,0x4AFD,0xD865,
+ 0xD865,0x98AB,0x4AFC,0xD865,0x4B2C,0x4B2F,0xD865,0x4B2B,0xD865,0x4B33,
+ 0x4B34,0x98FB,0xD866,0x9AAC,0x9AAE,
+ 2, /* first low-surrogate */
+ 0xDD63,0xDED3,0xDEDA,0xDED5, 0, 0, 0, 0,
+ 0,0xDEEE, 0,0xDEFC,0xDC14, 0,0xDD23,0xDD22,0xDD30,0xDEB5,
+ 0,0xDF38, 0,0xDF3F, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xDD68,0xDD67, 0,0xDD65,
+ 0, 0,0xDC75,0xDCF7,0xDCF3,0xDCF6, 0,0xDD00, 0,0xDCFF,
+ 0xDCF5, 0, 0, 0, 0, 0,0xDC92,0xDE06, 0,0xDE07,
+ 0xDE6B, 0,0xDE6C, 0,0xDF93, 0,0xDF94, 0, 0, 0,
+ 0xDC62,0xDC63, 0,0xDC5F,0xDC64,0xDC5B,0xDC59, 0, 0,0xDDA4,
+ 0xDDAC, 0, 0,0xDEB5, 0, 0,0xDEAE, 0,0xDEC5, 0,
+ 0, 0,0xDC3B,
+ /* plane 4, row 34 */
+ 1 | (94 << 8), /* first, last */
+ 0x9AAA,0x4BE8,0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,0x9B5C,
+ 0xD867,0xD867,0x4D5D,0x50D2,0x3485,0x3488,0xD840,0xD840,0x348E,0x3484,
+ 0xD840,0x50DF,0xD840,0x3483,0xD840,0xD840,0xD841,0xD841,0x3502,0xD841,
+ 0x3506,0x3505,0xD841,0x34FE,0x3501,0x3500,0xD841,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0x35E7,0x5619,0xD843,0xD843,0xD843,0x35E6,0xD843,0x35ED,
+ 0x35E2,0x35EB,0xD843,0x35E8,0x35EC,0x560A,0x3624,0x589A,0xD845,0x3662,
+ 0xD844,0x3661,0x3660,0x3664,0x368B,0xD845,0xD845,0xD845,0xD845,0xD846,
+ 0x3719,0x3716,0x3718,0x3722,0xD846,0x371D,0x3717,0x371E,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0x3769,0x376A,0xD846,0x376C,0x377A,0x378A,
+ 0xD847,0xD847,0xD847,0x379C,0xD847,
+ 3, /* first low-surrogate */
+ 0xDEBF,0xDC2B,0xDC84,0xDC80,0xDD4D,0xDD4F, 0,
+ 0xDD4C,0xDF92, 0, 0, 0, 0,0xDFAE,0xDF79, 0, 0,
+ 0xDF71, 0,0xDFB3, 0,0xDF2C,0xDF77,0xDD2F,0xDFC3, 0,0xDFCD,
+ 0, 0,0xDFC9, 0, 0, 0,0xDFCE,0xDCA5,0xDCA0,0xDCFE,
+ 0xDD59,0xDE9A, 0, 0,0xDEE4,0xDED7,0xDEDC, 0,0xDEE7, 0,
+ 0, 0,0xDEE5, 0, 0, 0, 0, 0,0xDC14, 0,
+ 0xDFF1, 0, 0, 0, 0,0xDDB6,0xDE6E,0xDE6C,0xDE81,0xDC42,
+ 0, 0, 0, 0,0xDC1A, 0, 0, 0,0xDC27,0xDC25,
+ 0xDC17,0xDC1C,0xDC3D,0xDC20, 0, 0,0xDE81, 0, 0, 0,
+ 0xDC09,0xDCC6,0xDCC4, 0,0xDCC5,
+ /* plane 4, row 35 */
+ 1 | (94 << 8), /* first, last */
+ 0x37FD,0x37F9,0xD847,0x37FF,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0x37FC,0xD847,0x5D85,0x37FB,0x3802,0x385F,0x5E56,0x385E,0x385D,0x385C,
+ 0xD848,0x5E51,0x3892,0xD848,0xD848,0x3894,0x3895,0x38D1,0xD849,0x38F1,
+ 0xD849,0x5FB1,0xD849,0xD849,0x3977,0x396F,0xD849,0xD849,0x3987,0x397D,
+ 0x397C,0x397E,0x3985,0x398B,0x3986,0x3980,0xffff,0xD849,0x3978,0xD87E,
+ 0xD84A,0xD84A,0x39BA,0xD84A,0x3A33,0xD84B,0x3A2D,0xD84B,0xD84B,0xD84B,
+ 0x3A37,0x645A,0x6463,0xD84B,0xD84B,0x3A2E,0xD84B,0xD84B,0x3A3D,0xD84B,
+ 0x3AA0,0xD84B,0xD84B,0x3AA3,0xD84C,0x669B,0xD84C,0x66A3,0x3B0E,0x669E,
+ 0xD84C,0x3BB6,0xD84D,0x3BAB,0x3BAD,0x3BA6,0xD84D,0x69B8,0x3BAA,0x69BA,
+ 0x3BB1,0xD84D,0x3BA8,0x3BAF,0x3BB0,
+ 3, /* first low-surrogate */
+ 0xDEEF, 0,0xDEDF,0xDEDE,0xDEEE,0xDEF5,0xDEEC,
+ 0,0xDEDD, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xDD22, 0, 0,0xDE97,0xDE95, 0, 0, 0,0xDCA9, 0,
+ 0xDD53, 0,0xDD56,0xDD55, 0, 0,0xDFE3,0xDFE2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDFA9, 0,0xDCAB,
+ 0xDC33,0xDC0A, 0,0xDE59, 0,0xDCBC, 0,0xDCC4,0xDCC7,0xDCC6,
+ 0, 0, 0,0xDCB8,0xDCDA, 0,0xDCB7,0xDCC0, 0,0xDCCD,
+ 0,0xDFBC,0xDFAB, 0,0xDC86, 0,0xDE5A, 0, 0, 0,
+ 0xDF43, 0,0xDDAC, 0, 0, 0,0xDDBE, 0, 0, 0,
+ 0,0xDDAB,
+ /* plane 4, row 36 */
+ 1 | (94 << 8), /* first, last */
+ 0x3BA7,0x3BB2,0x3B9D,0x3BA5,0x3BB5,0xD846,0x69C7,0x69D7,0xD84E,
+ 0x3C41,0xD84E,0xD84E,0x6B70,0xD84E,0xD84E,0x3C72,0x6B9D,0x3C6F,0x3C71,
+ 0xD84E,0x3C85,0xD84E,0xD84E,0x3CA4,0x3CA5,0x3CA6,0xD84E,0x3CA8,0xD84E,
+ 0xD84E,0x3CA3,0xD84F,0xD84F,0xD84F,0x6F16,0x6F24,0xD84F,0x3D43,0xD84F,
+ 0xD84F,0x3D3D,0x3D45,0xD84F,0xD84F,0x3D44,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0x6F45,0xD84F,0xD84F,0xD850,0x3DE3,0x7179,0xffff,0x3DDF,0x3DE4,0x717A,
+ 0x3DE5,0xD850,0x7254,0x3E22,0x3E4A,0xD851,0x3E49,0x3E44,0x3E4B,0x3E87,
+ 0x3E89,0x3E92,0x3E91,0x3E90,0x3E8E,0xD852,0xD852,0xD852,0xD87E,0x3F12,
+ 0x3F10,0x3F11,0xD852,0x3F32,0x3F34,0x3F37,0x3F33,0x3F36,0x3F35,0x3F65,
+ 0xD853,0x757C,0x757B,0xD853,0x7612,
+ 6, /* first low-surrogate */
+ 0xDF3E, 0, 0,0xDCF9,
+ 0,0xDCF3,0xDCF7, 0,0xDE45,0xDE48, 0, 0, 0, 0,
+ 0xDE44, 0,0xDEAF,0xDEB1, 0, 0, 0,0xDFCF, 0,0xDFCB,
+ 0xDFCD, 0,0xDC50,0xDEEC,0xDF1A, 0, 0,0xDED8, 0,0xDED0,
+ 0xDED1, 0, 0,0xDE7B,0xDED2, 0,0xDED4,0xDEE7,0xDEDF,0xDEDE,
+ 0,0xDED9,0xDECF,0xDF0D, 0, 0, 0, 0, 0, 0,
+ 0,0xDF38, 0, 0, 0,0xDEA9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xDC3E,0xDC46,0xDDED,0xDD30, 0,
+ 0, 0,0xDF6C, 0, 0, 0, 0, 0, 0, 0,
+ 0xDCAC, 0, 0,0xDDC9,
+ /* plane 4, row 37 */
+ 1 | (94 << 8), /* first, last */
+ 0x3FB0,0xD853,0x3FAF,0x3FAA,0xD853,0xD853,0xD853,0x3FAB,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0x3FF3,0xD854,0x3FF4,0xD854,
+ 0x76B6,0x76E0,0x4008,0x404E,0x4055,0x404B,0xD854,0xD854,0x404D,0x7773,
+ 0xD854,0x4052,0x7772,0x404C,0x7770,0x4050,0x4053,0xD854,0x4051,0xD854,
+ 0xD854,0xD854,0x4089,0xD854,0x4095,0x40CC,0x40C8,0x40CE,0xD855,0x40CA,
+ 0xD855,0x789D,0xD855,0x40CD,0xD855,0x415C,0x4167,0x4169,0x4165,0x4162,
+ 0xD856,0x7A27,0x7A35,0xD87E,0x41AA,0xD856,0xD856,0x41D2,0x7BA2,0x4203,
+ 0x420C,0xD856,0x4209,0x4206,0x4205,0x7B89,0xD856,0x420B,0x4208,0xD856,
+ 0x7BA5,0xD856,0x428E,0xD857,0x7CB6,0x42E8,0xD858,0xD858,0xD858,0x42EA,
+ 0xD858,0x7DA5,0x7DC3,0xD858,0x42E9,
+ 2, /* first low-surrogate */
+ 0xDE12, 0, 0,0xDDFD,0xDE01,0xDE11, 0,0xDE89,
+ 0xDE05,0xDDFE,0xDE0B,0xDE20,0xDE04,0xDF88, 0,0xDC02, 0,0xDC03,
+ 0, 0, 0, 0, 0, 0,0xDE29,0xDE3B, 0, 0,
+ 0xDE06, 0, 0, 0, 0, 0, 0,0xDE03, 0,0xDF78,
+ 0xDF79,0xDF7D, 0,0xDF7F, 0, 0, 0, 0,0xDD32, 0,
+ 0xDD00, 0,0xDD22, 0,0xDEA9, 0, 0, 0, 0, 0,
+ 0xDC04, 0, 0,0xDD59, 0,0xDDB8,0xDE9B, 0, 0, 0,
+ 0,0xDF92, 0, 0, 0, 0,0xDF8F, 0, 0,0xDF98,
+ 0,0xDFAE, 0,0xDE9D, 0, 0,0xDC49,0xDC50,0xDC46, 0,
+ 0xDC4E, 0, 0,0xDC55,
+ /* plane 4, row 38 */
+ 1 | (94 << 8), /* first, last */
+ 0x42EB,0xD858,0x42F0,0xD858,0x434B,0x7FAB,0x4373,0x4375,0x4392,
+ 0x4391,0x4393,0x8025,0x43A7,0x43A6,0x43A8,0x43AA,0xD859,0x43A9,0x8059,
+ 0x43BB,0x43BC,0x43BA,0x43BD,0x4427,0x8185,0xD859,0x4424,0x441E,0x441F,
+ 0x441D,0x4420,0x4423,0x4429,0x4422,0xD859,0xD859,0x441C,0x818E,0x4428,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0x4471,0x4473,0x4472,
+ 0xD85A,0x4502,0xD85B,0xD85B,0xD85B,0x44FE,0x84BE,0xD85B,0xD85B,0xD85B,
+ 0x4508,0xD85B,0xD85B,0xD85B,0x4507,0x4504,0xD85B,0xD85B,0x4500,0x44FC,
+ 0xD85B,0x4544,0xD85B,0x44F1,0xD85B,0xD85B,0x84A6,0x4506,0xD85C,0xD85C,
+ 0x45C6,0x45C3,0x45C1,0x45C2,0xD85C,0x45C4,0x45C7,0xD85C,0x45BF,0x45D2,
+ 0xD85C,0x45CA,0xD87E,0xD85C,0x872F,
+ 2, /* first low-surrogate */
+ 0xDC64, 0,0xDE38, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,0xDCFE, 0, 0,
+ 0, 0, 0, 0, 0, 0,0xDFA6, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xDF9C,0xDF99, 0, 0, 0,
+ 0xDFB5,0xDFA3,0xDFA0,0xDFA7,0xDF9B,0xDDDF,0xDDE1, 0, 0, 0,
+ 0xDE4D, 0,0xDDF3,0xDD6F,0xDD69, 0, 0,0xDD6B,0xDD78,0xDD87,
+ 0,0xDD85,0xDD82,0xDD90, 0, 0,0xDD80,0xDD67, 0, 0,
+ 0xDD61, 0,0xDD93, 0,0xDDF2,0xDD86, 0, 0,0xDDCD,0xDDC4,
+ 0, 0, 0, 0,0xDF0F, 0, 0,0xDF0D, 0, 0,
+ 0xDF73, 0,0xDDBA,0xDF0A,
+ /* plane 4, row 39 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0x4613,0xD85D,0x4630,0x463E,0x4639,0xD85D,0xD85D,
+ 0x463C,0x463F,0xD85D,0x4634,0x463D,0xD85D,0xD85D,0x4638,0xD85D,0xD85D,
+ 0xD85D,0x89A0,0x4682,0xD85E,0x4683,0xD85E,0x469B,0xD85E,0x46E0,0x46DD,
+ 0xD85E,0xD85E,0x46DE,0xD85E,0x46E3,0x46E5,0xD85E,0x8A97,0x46E2,0xD85E,
+ 0xD85E,0xD85E,0x46DF,0xD85E,0x472E,0xD85E,0x4737,0x4738,0xD85E,0xD85E,
+ 0xD85F,0xD85F,0x8C8B,0xD85F,0x3562,0xD85F,0x4794,0x4793,0x47AB,0x47AD,
+ 0xD85F,0xD85F,0x47F5,0x47F7,0xD860,0x47F6,0x47F8,0xD860,0x47FB,0x47F9,
+ 0x4858,0x485A,0xD860,0x4859,0x8F0F,0x4885,0x48A4,0x48D8,0x48D9,0xD861,
+ 0x48DD,0x48C8,0xD861,0x48FA,0x48FB,0x9275,0x4927,0x929F,0x492A,0x4925,
+ 0xD862,0x4928,0xD863,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDF08,0xDF13, 0,0xDDF8, 0, 0, 0,0xDEAB,0xDEA8,
+ 0, 0,0xDEA5, 0, 0,0xDEC3,0xDEA4, 0,0xDED4,0xDEBA,
+ 0xDFF1, 0, 0,0xDC3F, 0,0xDCEA, 0,0xDDF7, 0, 0,
+ 0xDDFA,0xDDF5, 0,0xDDFE, 0, 0,0xDE00, 0, 0,0xDE02,
+ 0xDDFB,0xDE07, 0,0xDE1A, 0,0xDFB8, 0, 0,0xDFE9,0xDFEB,
+ 0xDC50,0xDC4F, 0,0xDD86, 0,0xDD8E, 0, 0, 0, 0,
+ 0xDEF0,0xDEFB, 0, 0,0xDC42, 0, 0,0xDC85, 0, 0,
+ 0, 0,0xDF05, 0, 0, 0, 0, 0, 0,0xDF4B,
+ 0, 0,0xDF63, 0, 0, 0, 0, 0, 0, 0,
+ 0xDD99, 0,0xDC81,0xDD17,0xDD10,
+ /* plane 4, row 40 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0x95A6,0x4995,0x969A,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD864,0x4A0F,0x4A11,0xD864,0xD864,0x4A10,0xD864,0x4A15,
+ 0x4A13,0x9757,0xD864,0x4A47,0x4A46,0xD864,0x4A59,0x4A5B,0xD864,0x4A5E,
+ 0xD864,0xD864,0x4A5A,0x4A91,0x4A92,0x4A90,0x4A93,0xD865,0x97F7,0x4ABE,
+ 0xD865,0xD865,0xD865,0x4ABC,0x4ABB,0x4AB7,0x4AB9,0xD865,0x4B01,0x4AFE,
+ 0xD865,0xD865,0x4B02,0xD865,0x4AFF,0x98B0,0xD865,0x4B00,0xD865,0x4B37,
+ 0x4B3A,0x4B6F,0x4B77,0x4B79,0x99C6,0xD866,0x4BC8,0xD866,0xD866,0xD866,
+ 0xD866,0x4BF2,0xD866,0x4BF1,0x4BF0,0x9B62,0xD867,0x4C34,0xD867,0xD867,
+ 0xD867,0xD868,0xD868,0x4D2C,0x4D2D,0xD868,0xD868,0xD87E,0xD869,0x50FA,
+ 0xD840,0x3491,0xD840,0x3494,0xD840,
+ 1, /* first low-surrogate */
+ 0xDD12, 0, 0, 0,0xDEFA,0xDEF3,0xDEF2,0xDEF5,0xDEF6,
+ 0xDFBB,0xDFC2,0xDCA7, 0, 0,0xDCA8,0xDCA3, 0,0xDCAA, 0,
+ 0, 0,0xDDDC, 0, 0,0xDE0F, 0, 0,0xDE79, 0,
+ 0xDE7F,0xDE85, 0, 0, 0, 0, 0,0xDC1B, 0, 0,
+ 0xDC77,0xDC76,0xDC98, 0, 0, 0, 0,0xDC7A, 0, 0,
+ 0xDDBC,0xDDBA, 0,0xDDB6, 0, 0,0xDDB4, 0,0xDECF, 0,
+ 0, 0, 0, 0, 0,0xDC7B, 0,0xDE1C,0xDE21,0xDE1D,
+ 0xDEC0, 0,0xDEFF, 0, 0, 0,0xDD56, 0,0xDFA1,0xDFA2,
+ 0xDFA6,0xDE56,0xDE57, 0, 0,0xDF01,0xDFED,0xDE1C,0xDDF2, 0,
+ 0xDFB8, 0,0xDFC0, 0,0xDFB7,
+ /* plane 4, row 41 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0x34C4,0x350A,0xD841,0x5285,0xD842,0x3552,0xD842,0x3559,
+ 0x366F,0xD843,0x35F2,0x35F4,0x5643,0xD843,0x35F1,0x563C,0xD843,0x366A,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0x3724,0xD846,0x3723,0xD846,
+ 0xD846,0xD846,0x3727,0xD846,0xD846,0x376D,0x5BED,0x376E,0x376F,0xD846,
+ 0xD846,0x5C35,0x379F,0x380A,0x3806,0x380E,0xD847,0x380D,0x3805,0xD847,
+ 0xD847,0x380B,0x3810,0x382E,0xD848,0xD848,0xD848,0xD848,0xD848,0x3896,
+ 0x3897,0x38C4,0x5F47,0x38C5,0xD849,0x38D2,0xD849,0xD849,0xD849,0x3981,
+ 0xD84A,0x398E,0x3990,0x398F,0xD84A,0x3991,0x3995,0x3993,0xD849,0x616D,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0x3A3B,0x3A48,0xD84B,0xD84B,0x3A46,
+ 0x3A47,0xD84B,0xD84B,0xD84B,0x3A4C,
+ 1, /* first low-surrogate */
+ 0xDFE1, 0, 0,0xDFE8, 0,0xDCB2, 0,0xDEAE, 0,
+ 0,0xDF7E, 0, 0, 0,0xDF76, 0, 0,0xDF96, 0,
+ 0xDC20,0xDC21,0xDC23,0xDC29,0xDE77,0xDC51, 0,0xDC56, 0,0xDC88,
+ 0xDC59,0xDC55, 0,0xDD97,0xDD98, 0, 0, 0, 0,0xDEA1,
+ 0xDEA3, 0, 0, 0, 0, 0,0xDF0A, 0, 0,0xDF3D,
+ 0xDF0C, 0, 0, 0,0xDD3D,0xDD39,0xDEB0,0xDEB2,0xDEAE, 0,
+ 0, 0, 0, 0,0xDC20, 0,0xDD6E,0xDD6D,0xDD6A, 0,
+ 0xDC32, 0, 0, 0,0xDC39, 0, 0, 0,0xDFA3, 0,
+ 0xDC7F,0xDC35,0xDC3D,0xDDF4,0xDDF5, 0, 0,0xDD48,0xDD28, 0,
+ 0,0xDD27,0xDD32,0xDD2C,
+ /* plane 4, row 42 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84B,0x3A4A,0x3A50,0x3A43,0xD84B,0xD84B,0xD87E,0x3A49,0x3AA6,
+ 0x3AA5,0x3AA4,0xD84B,0xD84C,0x3AB9,0xD84C,0x3ACE,0x3ACF,0x3B13,0xD84C,
+ 0xD84C,0xD84D,0x3BC6,0x3BC5,0x3BCA,0x3BD9,0x3BC1,0xD84D,0xD84D,0x69F5,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0x3BCB,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0x6A03,0xD84D,0xD84D,0x6A65,0x3C42,0xD84E,0x6B75,0x3C74,0x3C73,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x6F8A,0x6F56,0x3D52,0xD84F,0xD84F,
+ 0xD84F,0x3D50,0xD84F,0x3D4B,0xD84F,0x3D4C,0x3D6D,0xD84F,0x6F98,0xD84F,
+ 0xD84F,0xD84F,0x3D4F,0x6F68,0x3DF0,0xD850,0x7234,0x7245,0x3E4D,0x3E4C,
+ 0xD851,0x3E4F,0x3E4E,0x3E50,0xD851,0x735C,0x3E96,0x7356,0xD852,0xD852,
+ 0x3E97,0x3E95,0x3E98,0xD852,0xD852,
+ 1, /* first low-surrogate */
+ 0xDD2E, 0, 0, 0,0xDD23,0xDD31,0xDCC5, 0, 0,
+ 0, 0,0xDFC9,0xDC89, 0,0xDCBB, 0, 0, 0,0xDF97,
+ 0xDF93,0xDE28, 0, 0, 0, 0, 0,0xDE18,0xDE3B, 0,
+ 0xDE27,0xDE24,0xDE1B,0xDE31, 0,0xDE26,0xDEA3,0xDE3F,0xDE22,0xDE19,
+ 0,0xDE41,0xDE2B, 0, 0,0xDD0C, 0, 0, 0,0xDE4E,
+ 0xDEB9,0xDEFA,0xDFE9,0xDFE8,0xDFE4, 0, 0, 0,0xDF5F,0xDF5D,
+ 0xDF52, 0,0xDF74, 0,0xDF46, 0, 0,0xDFAA, 0,0xDF4A,
+ 0xDF59,0xDF4B, 0, 0, 0,0xDF50, 0, 0, 0, 0,
+ 0xDED0, 0, 0, 0,0xDECC, 0, 0, 0,0xDC64,0xDC65,
+ 0, 0, 0,0xDC5C,0xDE15,
+ /* plane 4, row 43 */
+ 1 | (94 << 8), /* first, last */
+ 0x3EEC,0x3EEB,0x3F13,0x3F14,0x3F38,0x3F3A,0x3F39,0xD852,0x3F68,
+ 0x3F67,0xD853,0xD853,0xD853,0x3FBE,0x3FBC,0xD853,0xD853,0xD853,0x3FBB,
+ 0xD853,0x3FBA,0xD853,0x3FB9,0x3FB7,0xD853,0xD853,0x3FC1,0xD853,0x3FF7,
+ 0xD854,0x4060,0xD854,0xD854,0x4059,0x405C,0x405A,0x4058,0xD854,0x405B,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0x405D,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0x40D4,0x40D3,0x78BF,0x40D2,0x78BD,0xD855,0x40D7,
+ 0x40D1,0x78E4,0x40D5,0xD855,0xD87E,0x416D,0x416F,0x7A34,0x4175,0x416C,
+ 0x4174,0xD856,0x4173,0xD856,0xD856,0x7A36,0x41AC,0xD856,0xD856,0xD856,
+ 0x4210,0xD856,0xD856,0x7BBA,0x7BBC,0x420F,0x7BC8,0x4223,0x7BC3,0x421D,
+ 0x7BB6,0x420E,0xD856,0xD856,0x4215,
+ 8, /* first low-surrogate */
+ 0xDF79, 0,
+ 0,0xDCC5,0xDCB8,0xDE2C, 0, 0,0xDE37,0xDE35,0xDE31, 0,
+ 0xDE2F, 0,0xDE2B, 0, 0,0xDE2D,0xDE2A, 0,0xDF95, 0,
+ 0xDE3E, 0,0xDE47,0xDE45, 0, 0, 0, 0,0xDE52, 0,
+ 0xDE70,0xDE50,0xDE58,0xDE51,0xDE3D, 0,0xDE41,0xDE0C,0xDE3C,0xDF86,
+ 0xDF83,0xDF89,0xDFF3, 0, 0, 0, 0, 0,0xDD2D, 0,
+ 0, 0, 0,0xDEC5,0xDD55, 0, 0, 0, 0, 0,
+ 0,0xDC43, 0,0xDC37,0xDC45, 0, 0,0xDDE5,0xDEA6,0xDFDB,
+ 0,0xDFDA,0xDFE6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,0xDFF8,0xDFE9,
+ /* plane 4, row 44 */
+ 1 | (94 << 8), /* first, last */
+ 0x7BC2,0x4213,0xD856,0xD856,0x421B,0x7BC5,0x4222,0x4226,0xD856,
+ 0x7BBD,0x7BB0,0x4221,0x421C,0x4217,0xD856,0x421A,0x7BBB,0xD857,0xD857,
+ 0xD857,0x4299,0xD857,0x4297,0xD858,0xD858,0x42FD,0xD858,0x42F6,0x42FE,
+ 0x42F5,0x42FF,0x42F7,0xD858,0xD858,0xD858,0x4301,0x7E04,0xD858,0xD858,
+ 0xD858,0x4377,0xD858,0xD858,0xD859,0xD859,0xD859,0x43AB,0xD859,0xD859,
+ 0x43C0,0xD859,0x4431,0x442E,0xD87E,0xD859,0x442C,0xD859,0xD859,0x4432,
+ 0x442F,0x442B,0x442D,0x4433,0xD85A,0xD85A,0x81F1,0x4457,0x445C,0x447B,
+ 0xD85A,0xD85A,0x447A,0xD85B,0x8522,0x4513,0x451E,0x4517,0x4520,0x452A,
+ 0x4511,0x4515,0x450F,0x4518,0x8538,0xD85B,0xD85B,0x452C,0x8532,0xD87E,
+ 0x8510,0xD85B,0xD85B,0x451C,0xD85B,
+ 3, /* first low-surrogate */
+ 0xDFE8,0xDFF6, 0, 0, 0, 0,0xDFE7,
+ 0, 0, 0, 0, 0,0xDFD5, 0, 0,0xDED3,0xDEC7,
+ 0xDED1, 0,0xDEC3, 0,0xDC80,0xDC98, 0,0xDC84, 0, 0,
+ 0, 0, 0,0xDC97,0xDC83,0xDC81, 0, 0,0xDC8C,0xDE42,
+ 0xDFAB, 0,0xDFA3,0xDFA6,0xDC5C,0xDC69,0xDC67, 0,0xDD8B,0xDDA8,
+ 0,0xDFD8, 0, 0,0xDD89,0xDFDC, 0,0xDFE0,0xDFE5, 0,
+ 0, 0, 0, 0,0xDD18,0xDD19, 0, 0, 0, 0,
+ 0xDE5F,0xDE5E, 0,0xDE02, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,0xDE12,0xDE36, 0, 0,0xDDA8,
+ 0,0xDE23,0xDE03, 0,0xDE00,
+ /* plane 4, row 45 */
+ 1 | (94 << 8), /* first, last */
+ 0x4529,0xD85B,0xD85B,0x4512,0x854F,0x4597,0xD85C,0x8772,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0x45D4,0x45D0,0x877C,0xD85C,0xD87E,
+ 0xD85C,0xD85C,0x45D3,0x4614,0xD85D,0x4646,0x4645,0xD85D,0x4643,0xD85D,
+ 0x890D,0x4644,0x4648,0xD85D,0x4647,0xD85D,0xD85D,0xD85D,0x8908,0x4649,
+ 0x4685,0xD85E,0x4684,0xD85E,0x469D,0xD85E,0x469E,0x46A0,0xD85E,0x469C,
+ 0xD85E,0x469F,0xD85E,0x46F7,0x46EA,0xD85E,0x46EF,0x46E9,0x46F3,0x46F0,
+ 0x46EB,0xD85E,0x46EC,0x46F2,0x46F5,0x46EE,0xD85E,0xD85E,0x473A,0x474B,
+ 0xD85F,0x474A,0x474C,0xD85F,0xD85F,0xD85F,0x4779,0x477B,0x4778,0xD85F,
+ 0xD85F,0x47B5,0xD85F,0x47B4,0x47B7,0x8D9E,0x4809,0x47FE,0x4808,0x4807,
+ 0xD860,0xD860,0xD860,0x4806,0x4804,
+ 2, /* first low-surrogate */
+ 0xDE46,0xDE61, 0, 0, 0,0xDF84, 0,0xDF6B,
+ 0xDF62,0xDF56,0xDF6A,0xDF52,0xDF55, 0, 0, 0,0xDF61,0xDDBB,
+ 0xDF58,0xDF77, 0, 0,0xDED7, 0, 0,0xDEDE, 0,0xDEDF,
+ 0, 0, 0,0xDED1, 0,0xDEE2,0xDEE1,0xDEDD, 0, 0,
+ 0,0xDC4B, 0,0xDC4E, 0,0xDCFC, 0, 0,0xDCFA, 0,
+ 0xDCFB, 0,0xDCFE, 0, 0,0xDE31, 0, 0, 0, 0,
+ 0,0xDE38, 0, 0, 0, 0,0xDE3A,0xDFBB, 0, 0,
+ 0xDC59, 0, 0,0xDCDB,0xDCDF,0xDCE2, 0, 0, 0,0xDD9E,
+ 0xDDA1, 0,0xDF10, 0, 0, 0, 0, 0, 0, 0,
+ 0xDC76,0xDC7F,0xDC7D,
+ /* plane 4, row 46 */
+ 1 | (94 << 8), /* first, last */
+ 0x4805,0x47FF,0x480B,0xD860,0xD860,0x483B,0x485D,0x485C,0x485F,
+ 0x485E,0x8F28,0xD860,0x8F21,0x4883,0xD861,0xD861,0x48A7,0x9066,0x906C,
+ 0xD861,0x48A8,0xD861,0xD861,0xD861,0xD861,0xD861,0x90F6,0x48E0,0x48DF,
+ 0x48FE,0x48FC,0x48FF,0x48FD,0xD862,0x492C,0x92EC,0x92BA,0x92E3,0x92BD,
+ 0x499D,0xD863,0x95B4,0xD863,0x4A40,0xD864,0xD864,0x4A5F,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0x97D1,0xD865,0x4AC0,0x9823,0xD865,
+ 0x4AC1,0x4AC6,0xD865,0xD865,0x4B04,0x4B05,0xD865,0x990B,0x4B3E,0x4B3D,
+ 0x4B40,0x4B3F,0xD865,0x4B42,0xD865,0xD865,0xD865,0x4B84,0x4B82,0x4B7F,
+ 0x4B85,0xD866,0xD866,0x4BCC,0x9AB2,0x4BCB,0x4BCD,0xD866,0xD866,0x9ADB,
+ 0xD866,0x4BF5,0xD866,0xD866,0xD866,
+ 4, /* first low-surrogate */
+ 0xDC82,0xDE57, 0, 0, 0, 0,
+ 0, 0,0xDF2E, 0, 0,0xDD8B,0xDD8D, 0, 0, 0,
+ 0xDD90, 0,0xDEEC,0xDF6F,0xDF6B,0xDF71,0xDF78, 0, 0, 0,
+ 0, 0, 0, 0,0xDDAD, 0, 0, 0, 0, 0,
+ 0,0xDD2F, 0,0xDF78, 0,0xDDF8,0xDE19, 0,0xDE9B,0xDE94,
+ 0xDE97,0xDE99,0xDFA6,0xDFA4,0xDFA7, 0,0xDC95, 0, 0,0xDC90,
+ 0, 0,0xDC9B,0xDDC4, 0, 0,0xDDC6, 0, 0, 0,
+ 0, 0,0xDEE3, 0,0xDEDF,0xDEDD,0xDEE7, 0, 0, 0,
+ 0,0xDE2D,0xDE2C, 0, 0, 0, 0,0xDE34,0xDE38, 0,
+ 0xDF1D, 0,0xDF1A,0xDF1B,0xDF14,
+ /* plane 4, row 47 */
+ 1 | (94 << 8), /* first, last */
+ 0x9AF0,0xD866,0xD867,0x4C20,0x4C21,0xD867,0xD867,0x4C37,0x4C3E,
+ 0x9B73,0x4C3D,0x9B6E,0xD867,0xD867,0xD867,0x9B65,0xD867,0x4C3C,0xD867,
+ 0x4C38,0x9B6A,0xD867,0x9B6D,0xD867,0x4C3B,0xD867,0x4CB0,0xD867,0xD867,
+ 0xD867,0x4CAD,0x4CB2,0x4CB8,0x9D0B,0xD867,0x4CAF,0xD867,0xD867,0x4D1A,
+ 0x9E76,0x4D20,0x4D21,0x4D30,0x9EA8,0x4D2F,0xD868,0xD868,0xD868,0xD868,
+ 0x4D5F,0x4D60,0xD869,0xD869,0x9F11,0xD869,0xD840,0x348A,0x5119,0x349C,
+ 0xD840,0x349A,0xD840,0xD840,0xD841,0x350C,0x350B,0x350D,0x5292,0xD842,
+ 0xD843,0x35FE,0xD843,0xD843,0x35FF,0x35FB,0x35FC,0x3609,0xD843,0x3600,
+ 0xD843,0x5675,0xD843,0xD843,0xD843,0xD844,0xD845,0xD845,0x3671,0xD845,
+ 0xD845,0x596F,0xD840,0xD846,0xD846,
+ 2, /* first low-surrogate */
+ 0xDF17,0xDC21, 0, 0,0xDCAA,0xDCA1, 0, 0,
+ 0, 0, 0,0xDD63,0xDD79,0xDD60, 0,0xDD62, 0,0xDD61,
+ 0, 0,0xDD70, 0,0xDD6A, 0,0xDFC8, 0,0xDFC5,0xDFBE,
+ 0xDFC2, 0, 0, 0, 0,0xDFC7, 0,0xDFB0,0xDFCA, 0,
+ 0, 0, 0, 0, 0, 0,0xDF0D,0xDF07,0xDF96,0xDFEF,
+ 0, 0,0xDC1E,0xDC1D, 0,0xDD90,0xDFEB, 0, 0, 0,
+ 0xDFEE, 0,0xDFEF,0xDFEC,0xDFFA, 0, 0, 0, 0,0xDD04,
+ 0xDFD3, 0,0xDFD1,0xDFFA, 0, 0, 0, 0,0xDFC8, 0,
+ 0xDFD5, 0,0xDFCD,0xDFD2,0xDFFB,0xDE2A,0xDC88,0xDC61, 0,0xDC63,
+ 0xDC62, 0,0xDC57,0xDCC8,0xDC98,
+ /* plane 4, row 48 */
+ 1 | (94 << 8), /* first, last */
+ 0x372B,0xD846,0xD847,0xD847,0x3814,0x3811,0x3812,0xD848,0x3863,
+ 0xD848,0x386E,0x389A,0xD848,0x389B,0xD848,0xD849,0x38C8,0xD849,0xD849,
+ 0x38F6,0xD84A,0xD84A,0x61A5,0x398C,0x3997,0x39A2,0x61A0,0xD84A,0xD84A,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0x3A54,0xD84B,0xD84B,
+ 0xD84B,0x3AA8,0xD84B,0xD84B,0x3AA9,0xD84C,0x65B4,0x65D8,0x66C2,0x3B18,
+ 0x3B17,0x3B1D,0xD84C,0xD84C,0x3B31,0xD84D,0xD84D,0x3BD8,0x3BD5,0xD84D,
+ 0xD84D,0xD84D,0x3BE1,0xD84D,0x3BD4,0xD84D,0xD84D,0xD84D,0x3BE3,0xD84D,
+ 0x3C44,0x3C45,0xD84E,0xD84E,0x3C76,0x3C75,0xD84E,0x6BA8,0x3C88,0x3CAA,
+ 0xD84E,0x3CAB,0x3CAC,0xD84E,0x3D57,0x6F83,0x3D60,0x3D5D,0x3D6B,0xD84F,
+ 0x3D63,0x3D67,0xD84F,0x3D5E,0xD84F,
+ 2, /* first low-surrogate */
+ 0xDEC1,0xDF3F,0xDF41, 0, 0, 0,0xDD52, 0,
+ 0xDD5E, 0, 0,0xDEC7, 0,0xDF70,0xDC27, 0,0xDC71,0xDCB0,
+ 0,0xDC42,0xDC43, 0, 0, 0, 0, 0,0xDC57,0xDC9D,
+ 0xDD89,0xDD8D,0xDD8B,0xDD80,0xDD92,0xDD8A,0xDDC8, 0,0xDD8F,0xDD93,
+ 0xDD91, 0,0xDFF2,0xDFDE, 0,0xDCC8, 0, 0, 0, 0,
+ 0, 0,0xDEA7,0xDEA1, 0,0xDE8C,0xDE7F, 0, 0,0xDE7B,
+ 0xDE95,0xDE99, 0,0xDE8E, 0,0xDEDA,0xDE8A,0xDE9C, 0,0xDE7E,
+ 0, 0,0xDD1A,0xDE55, 0, 0,0xDE60, 0, 0, 0,
+ 0xDFFB, 0, 0,0xDFFD, 0, 0, 0, 0, 0,0xDFD0,
+ 0, 0,0xDFC5, 0,0xDFD2,
+ /* plane 4, row 49 */
+ 1 | (94 << 8), /* first, last */
+ 0xD850,0x6FC5,0x71CD,0x3DF9,0x3DF3,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0x3DF6,0xD851,0x729C,0x3E51,0x3E53,0x3E52,0xD852,0x3E9B,0xD852,
+ 0x3E9C,0xD852,0xD852,0x3EF7,0x7499,0x748F,0x7491,0xD852,0xD852,0xD852,
+ 0xD852,0x3F3B,0xD852,0x3F3E,0x3F3D,0xD853,0x3F69,0xD853,0xD853,0xD853,
+ 0x3FC3,0x3FC4,0x3FC7,0xD853,0xD853,0x7639,0x3FC6,0x762E,0x3FC8,0xD853,
+ 0xD853,0xD853,0x769F,0x76A0,0x3FE6,0x3FF8,0xD854,0xD854,0x4007,0xD854,
+ 0x4064,0x4068,0xD854,0x7794,0x4065,0x77AE,0xD854,0xD854,0x4069,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0x40DA,0x40E0,0x78E6,0xD855,
+ 0x40DE,0xD855,0xD855,0xD855,0x411C,0x411D,0x411A,0xD855,0x417B,0x417A,
+ 0x417C,0xD856,0x4178,0x4177,0xD856,
+ 1, /* first low-surrogate */
+ 0xDC11, 0, 0, 0, 0,0xDFAD,0xDFA4,0xDFA9,0xDFB0,
+ 0xDF9D, 0,0xDD98, 0, 0, 0, 0,0xDC92, 0,0xDC8A,
+ 0,0xDC8D,0xDC96, 0, 0, 0, 0,0xDE45,0xDE4B,0xDF0F,
+ 0xDF16, 0,0xDF8A, 0, 0,0xDCC9, 0,0xDCC8,0xDCCA,0xDE64,
+ 0, 0, 0,0xDE5D,0xDE63, 0, 0, 0, 0,0xDE88,
+ 0xDF3A,0xDF39, 0, 0, 0, 0,0xDC17,0xDC93, 0,0xDC95,
+ 0, 0,0xDE76, 0, 0, 0,0xDE80,0xDE7B, 0,0xDE48,
+ 0xDEA8,0xDE88,0xDF8B,0xDF8A,0xDF8C,0xDFFC, 0, 0, 0,0xDD58,
+ 0,0xDD51,0xDD55,0xDD53, 0, 0, 0,0xDEDC, 0, 0,
+ 0,0xDC5C, 0, 0,0xDC65,
+ /* plane 4, row 50 */
+ 1 | (94 << 8), /* first, last */
+ 0xD87E,0x41B1,0xD856,0x41B2,0x41B0,0xD856,0x7ABC,0xD856,0x4236,
+ 0xD857,0x422E,0xD857,0x7BD6,0xD857,0x4234,0xD857,0xD857,0xD857,0xD857,
+ 0x422A,0xD857,0x4233,0x422D,0x422F,0x4231,0x422B,0x4232,0xD857,0x4235,
+ 0xD857,0xD857,0xD856,0xD857,0xD857,0xD857,0x7CCF,0xD858,0xD858,0x4308,
+ 0xD858,0x4306,0xD858,0xD858,0x7E18,0xD858,0x434D,0x4361,0xD858,0xD858,
+ 0xD858,0x4378,0xD858,0x4394,0x4395,0xD859,0xD859,0xD859,0x43C1,0x43C3,
+ 0x806D,0xD85A,0x4439,0xD85A,0xD85A,0x443A,0x443B,0x4435,0x4436,0xD85A,
+ 0x443C,0x8190,0xD85A,0xD85A,0xD85A,0x4458,0x447C,0x447D,0x448D,0x448C,
+ 0xD85B,0xD85B,0x453B,0x453F,0xD85B,0xD85B,0x4532,0x452D,0xD85B,0x452F,
+ 0x4539,0x452E,0x453A,0xD85B,0x4536,
+ 1, /* first low-surrogate */
+ 0xDD5A, 0,0xDDEE, 0, 0,0xDDF0, 0,0xDDF2, 0,
+ 0xDC35, 0,0xDC22, 0,0xDC20, 0,0xDC2D,0xDC28,0xDC26,0xDC3C,
+ 0,0xDC38, 0, 0, 0, 0, 0, 0,0xDC2A, 0,
+ 0xDC1A,0xDC30,0xDFE3,0xDC19,0xDEE9,0xDEE7, 0,0xDCD6,0xDCC4, 0,
+ 0xDC87, 0,0xDCC7,0xDCD9, 0,0xDCDF, 0, 0,0xDF0A,0xDF01,
+ 0xDFB1, 0,0xDFC1, 0, 0,0xDC76,0xDD0D,0xDD0E, 0, 0,
+ 0,0xDC07, 0,0xDC09,0xDC16, 0, 0, 0, 0,0xDC0E,
+ 0, 0,0xDC06,0xDD1E,0xDD4A, 0, 0, 0, 0, 0,
+ 0xDEA6,0xDE91, 0, 0,0xDEB8,0xDE96, 0, 0,0xDEC5, 0,
+ 0, 0, 0,0xDF0A,
+ /* plane 4, row 51 */
+ 1 | (94 << 8), /* first, last */
+ 0x4531,0x453E,0x4538,0x8552,0x4534,0xD85B,0x4541,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0x4530,0xD85B,0xD85B,0xD85B,0xD85B,0x4543,0xD85B,0x8550,
+ 0xD85B,0xD85C,0x4598,0xD85C,0xD85C,0x87A0,0xD85C,0xD85C,0x8786,0x45DA,
+ 0x45D7,0xD85C,0xD85C,0x8795,0xD85C,0xD85C,0x878C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0x4618,0x8860,0xD87E,0xD85D,0xD85D,0x4652,0x8928,0xD85D,
+ 0x464E,0x8920,0xD85D,0x464F,0x4650,0xD85E,0xD85E,0x89A8,0x4686,0x4687,
+ 0x4689,0xD85E,0xD85E,0xD85E,0xD85E,0x46A2,0x46A3,0xD85E,0x46A1,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0x46F9,0x46FD,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0x473E,0x473C,0xD85E,0x474D,0xD85F,0x474E,0xD85F,0x4781,
+ 0x4783,0x4782,0xD85F,0x4780,0x4788,
+ 6, /* first low-surrogate */
+ 0xDEB2, 0,0xDEB7,0xDEB4,
+ 0xDE89,0xDE8D, 0,0xDE87,0xDEC2,0xDE9C,0xDE92, 0,0xDECA, 0,
+ 0xDE8A,0xDDE0, 0,0xDDE6,0xDDE5, 0,0xDFA5,0xDFB3, 0, 0,
+ 0,0xDFB5,0xDFAF, 0,0xDFB0,0xDFCC, 0,0xDFA2,0xDFBE,0xDFC6,
+ 0xDFAC,0xDFAE, 0, 0,0xDDC3,0xDF08,0xDF05, 0, 0,0xDEFE,
+ 0, 0,0xDF00, 0, 0,0xDC64,0xDC68, 0, 0, 0,
+ 0,0xDC6A,0xDC69,0xDD0D,0xDD12, 0, 0,0xDD0F, 0,0xDE67,
+ 0xDE79,0xDE72,0xDE66,0xDE7C, 0, 0,0xDE68,0xDE85,0xDE76,0xDE74,
+ 0xDE71,0xDE64, 0, 0,0xDFF8, 0,0xDC6C, 0,0xDCEB, 0,
+ 0, 0,0xDDB8,
+ /* plane 4, row 52 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x47B9,0xD85F,0xD85F,0x8E3A,
+ 0xD860,0xD860,0xD860,0x4811,0x480D,0x4810,0x4813,0xD860,0x483C,0x4862,
+ 0x4863,0xD860,0xD861,0xD87E,0xD861,0xD861,0x4903,0x4906,0x4902,0x4901,
+ 0xD862,0xD862,0x4905,0xD862,0x9194,0x9311,0xD862,0x9337,0x4936,0xD862,
+ 0x4935,0x9343,0xD87E,0x49A1,0x49A3,0xD863,0xD863,0x49A0,0xD863,0x49EA,
+ 0x96A6,0x49E8,0xD863,0xD863,0xD863,0xD864,0x4A21,0x4A1B,0xD864,0xD864,
+ 0x4A49,0x4A48,0xD864,0x9795,0x4A62,0x4A61,0x4A64,0x4A60,0x4A63,0xD864,
+ 0xD864,0x9796,0x4A66,0x4AAC,0x4AAB,0xD865,0xD865,0x4AC3,0xD865,0x4AC4,
+ 0x9825,0xD865,0xD865,0x4B08,0x4B09,0x4B0A,0x4B06,0x4B07,0x4B41,0xD865,
+ 0x4B45,0xD865,0x4B43,0x4B44,0x9926,
+ 1, /* first low-surrogate */
+ 0xDF2D,0xDF2E,0xDF28,0xDF29,0xDF31, 0,0xDF2F,0xDF2A, 0,
+ 0xDCA4,0xDCB7,0xDCBF, 0, 0, 0, 0,0xDE63, 0, 0,
+ 0,0xDF67,0xDDBE,0xDDE0,0xDF95,0xDF9C, 0, 0, 0, 0,
+ 0xDC71,0xDC72, 0,0xDC6F, 0, 0,0xDDF1, 0, 0,0xDDE8,
+ 0, 0,0xDDEA, 0, 0,0xDD49,0xDD64, 0,0xDD48, 0,
+ 0, 0,0xDF2C,0xDFE1,0xDFEF,0xDCC0, 0, 0,0xDCD7,0xDCD4,
+ 0, 0,0xDEAD, 0, 0, 0, 0, 0, 0,0xDEAE,
+ 0xDEAC, 0, 0, 0, 0,0xDC27,0xDCAE, 0,0xDCB0, 0,
+ 0,0xDCC0,0xDCC4, 0, 0, 0, 0, 0, 0,0xDF07,
+ 0,0xDEFD,
+ /* plane 4, row 53 */
+ 1 | (94 << 8), /* first, last */
+ 0x9934,0x4B47,0xD87E,0xD866,0xD866,0x4B71,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0x4B8B,0x4BD4,0x4BD3,0x4BD1,0x9ABA,0x4BD2,0xD866,
+ 0xD866,0x4BF7,0x4BF8,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,
+ 0xD867,0x4C22,0xD867,0x4C45,0x4C41,0x9B81,0x4C40,0x9B8A,0xD867,0x9B7F,
+ 0x4C42,0xD867,0x4CC1,0x4CC5,0xD867,0x4CBB,0x4CB9,0x4CBD,0x4CC9,0xD868,
+ 0x9D11,0xD868,0x4CBF,0x4CC7,0xD867,0x4CC3,0x4D24,0x4D31,0x4D33,0xD868,
+ 0x4D32,0x4D34,0x4D52,0x4D61,0x9ED9,0x4D7A,0x4D82,0x9F3C,0xD869,0x5123,
+ 0xD841,0xD841,0xD841,0x512C,0xD841,0xD842,0x350F,0x5295,0xD842,0x3523,
+ 0x3525,0xD844,0x3606,0x3608,0x5688,0xD844,0xD844,0xD844,0x568B,0xD844,
+ 0xD844,0x367A,0x3677,0xD845,0xD845,
+ 3, /* first low-surrogate */
+ 0xDE04,0xDC1B,0xDC1C, 0,0xDCB2,0xDCB4,0xDCB7,
+ 0xDCB1,0xDCB3,0xDCAE, 0, 0, 0, 0, 0, 0,0xDE3F,
+ 0xDF36, 0, 0,0xDF31,0xDF3B,0xDF35,0xDF3A,0xDF37,0xDC22,0xDC36,
+ 0xDC32, 0,0xDCC0, 0, 0, 0, 0, 0,0xDD85, 0,
+ 0,0xDD89, 0, 0,0xDFE1, 0, 0, 0, 0,0xDC0A,
+ 0,0xDC09, 0, 0,0xDFE8, 0, 0, 0, 0,0xDF18,
+ 0, 0, 0, 0, 0, 0, 0, 0,0xDDC5, 0,
+ 0xDC0D,0xDC0C,0xDC21, 0,0xDE16,0xDC0E, 0, 0,0xDC17, 0,
+ 0,0xDC48, 0, 0, 0,0xDC55,0xDC49,0xDC4C, 0,0xDC4F,
+ 0xDC3D, 0, 0,0xDC8A,0xDCA8,
+ /* plane 4, row 54 */
+ 1 | (94 << 8), /* first, last */
+ 0xD845,0x372E,0xD846,0x372F,0xD846,0xD848,0x381B,0x3813,0xD847,
+ 0xD847,0x3866,0xD848,0x3865,0xD845,0x38F7,0xD849,0xD84A,0x61E1,0x61D7,
+ 0xD84A,0xD84A,0x399C,0xD84B,0xD84B,0x3A53,0xD84B,0xD84B,0xD84C,0xD84C,
+ 0x3ABA,0x65A3,0x3B22,0x66D3,0xD84D,0xD84D,0xD84D,0x6A8B,0xD84D,0xD84D,
+ 0x3BEB,0x3BDD,0xD84D,0x3BEF,0xD84D,0xD84D,0x3C47,0x3C46,0xD84E,0x3C78,
+ 0x6BAC,0x3C89,0xD84F,0xD84F,0x3D68,0x3D76,0x3D74,0x3D79,0xD850,0x3D7A,
+ 0x3D77,0xD87E,0x3D71,0xD850,0x3D72,0xD850,0x3DFF,0xD850,0x3E05,0xD851,
+ 0xD851,0x3E54,0xD851,0xD851,0x3E9E,0x3E9F,0x7374,0xD852,0xD852,0x3EFA,
+ 0xD852,0x3F44,0x3F3F,0x3F40,0xD852,0x3F42,0xD852,0xD852,0x3F51,0xD852,
+ 0xD852,0xD853,0xD853,0xD853,0xD853,
+ 1, /* first low-surrogate */
+ 0xDE8A, 0,0xDCCB, 0,0xDCD5,0xDDD4, 0, 0,0xDF5C,
+ 0xDF75, 0,0xDD61, 0,0xDE96, 0,0xDD8A,0xDCD0, 0, 0,
+ 0xDC49,0xDCCF, 0,0xDDD6,0xDD7F, 0,0xDDD2,0xDDCF,0xDC06,0xDC09,
+ 0, 0, 0, 0,0xDF06,0xDEF1,0xDF04, 0,0xDEFA,0xDEF4,
+ 0, 0,0xDEF9, 0,0xDE8B,0xDF03, 0, 0,0xDDA2, 0,
+ 0, 0,0xDC0C,0xDC0B, 0, 0, 0, 0,0xDC24, 0,
+ 0,0xDD14, 0,0xDC25, 0,0xDFF6, 0,0xDFFB, 0,0xDD32,
+ 0xDDFB, 0,0xDEF2,0xDEF3, 0, 0, 0,0xDC9C,0xDE72, 0,
+ 0xDE74, 0, 0, 0,0xDF86, 0,0xDF8E,0xDF90, 0,0xDFCD,
+ 0xDFF7,0xDCD6,0xDE84,0xDE95,0xDE8A,
+ /* plane 4, row 55 */
+ 1 | (94 << 8), /* first, last */
+ 0x7640,0x3FCA,0xD853,0x7641,0x3FCE,0x3FC9,0xD853,0xD853,0xD854,
+ 0xD854,0xD854,0x4009,0x76E8,0x406C,0x406E,0x4070,0x406D,0x406B,0x4071,
+ 0x4072,0xD854,0xD854,0xD854,0x408C,0x40E4,0xD855,0x40E1,0xD855,0xD855,
+ 0x78F6,0x40E7,0x7900,0x40E2,0x411F,0xD855,0xD855,0x417E,0xD856,0x4180,
+ 0x7A59,0x7A55,0xD856,0x41B9,0x41B7,0x41B8,0xD856,0x41BA,0x7AF4,0xD856,
+ 0x41D3,0x423F,0x7C04,0x4245,0x4241,0x7C15,0x4242,0x4243,0x423B,0x4238,
+ 0xD857,0xD857,0x423A,0x7BF5,0xD857,0xD857,0x423C,0xD857,0xD857,0x423E,
+ 0xD857,0xD857,0xD857,0x429E,0x429F,0x42A1,0xD857,0x429B,0x4312,0xD858,
+ 0xD858,0xD858,0x4318,0x430C,0xD858,0x4362,0xD858,0x437A,0xD858,0xD859,
+ 0x43AE,0x43AF,0xD859,0x43AD,0xD859,
+ 3, /* first low-surrogate */
+ 0xDE97, 0, 0, 0,0xDFA0,0xDFA1,0xDC22,
+ 0xDCA6,0xDCA4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xDEAF,0xDEB0,0xDEBD, 0, 0,0xDD76, 0,0xDD7B,0xDD79,
+ 0, 0, 0, 0, 0,0xDEEE,0xDEF1, 0,0xDC94, 0,
+ 0, 0,0xDC91, 0, 0, 0,0xDE10, 0, 0,0xDEAF,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0xDC7B,0xDC77, 0, 0,0xDC80,0xDCC6, 0,0xDC7C,0xDC90, 0,
+ 0xDCA3,0xDC7D,0xDCBD, 0, 0, 0,0xDF13, 0, 0,0xDD11,
+ 0xDD44,0xDD0D, 0, 0,0xDF14, 0,0xDFB8, 0,0xDFB7,0xDC83,
+ 0, 0,0xDD14, 0,0xDD1C,
+ /* plane 4, row 56 */
+ 1 | (94 << 8), /* first, last */
+ 0x43C4,0x43C7,0x43C6,0x43C5,0xD859,0xD859,0x81C1,0x4440,0xD85A,
+ 0xD85A,0x443F,0x4441,0xD87E,0xD85A,0xD85A,0x447F,0xD85A,0x4486,0x4481,
+ 0x4480,0x448E,0x454A,0xD85B,0x4547,0xD85B,0xD85B,0x454B,0x4546,0x454E,
+ 0x857D,0xD85B,0x85A5,0xD85B,0x4548,0xD85B,0x4545,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,0x45DB,0x45E7,0x45E4,0xD85D,0xD85D,
+ 0x45E1,0xD85D,0x45E9,0xD85C,0x45E5,0x45E0,0x45E3,0xD85C,0xD85D,0xD85D,
+ 0xD85C,0xD85D,0xD85D,0x45EA,0xD85C,0xD85D,0x893A,0x4654,0x4658,0x465C,
+ 0xD85D,0x4655,0x468B,0x468C,0x46A6,0x46A5,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0x46FF,0xD85E,0xD85E,0xD85E,0xD85E,0x4730,0x4740,0x4741,0xD85F,0xD85F,
+ 0x4786,0xD85F,0x47BF,0x47BD,0xD85F,
+ 5, /* first low-surrogate */
+ 0xDDD4,0xDDD5, 0, 0,0xDC43,
+ 0xDC42, 0, 0,0xDD8A,0xDC41,0xDD4E, 0,0xDE87, 0, 0,
+ 0, 0, 0,0xDF39, 0,0xDF8F,0xDF2A, 0, 0, 0,
+ 0,0xDF2B, 0,0xDF50, 0,0xDF6E, 0,0xDF3B,0xDF53,0xDF5F,
+ 0xDF2F,0xDF30,0xDF38,0xDF4C,0xDDF1, 0, 0, 0,0xDC07,0xDC16,
+ 0,0xDC14, 0,0xDFFB, 0, 0, 0,0xDFF8,0xDC10,0xDC1D,
+ 0xDFFF,0xDC0B,0xDC04, 0,0xDFFE,0xDDFF, 0, 0, 0, 0,
+ 0xDF23, 0, 0, 0, 0, 0,0xDD2A,0xDEA0,0xDE98,0xDE9C,
+ 0,0xDE9E,0xDEA6,0xDEB5,0xDEB0, 0, 0, 0,0xDCF9,0xDCF5,
+ 0,0xDDD2, 0, 0,0xDF50,
+ /* plane 4, row 57 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85F,0xD85F,0xD85F,0xD85F,0x47BE,0x4819,0xD860,0x481C,0xD860,
+ 0x481B,0x4817,0x4818,0x8E51,0xD860,0xD860,0x483D,0x486A,0x4866,0xD860,
+ 0xD860,0x4867,0xD860,0x4868,0x48AD,0x48AE,0xD861,0xD861,0x48D6,0x4909,
+ 0xD862,0x9198,0xD862,0x490C,0x490A,0xD862,0x493B,0x493A,0x9384,0x9381,
+ 0xD862,0x936F,0xD863,0xD863,0xD863,0x49AF,0x49AA,0x49AB,0xD863,0xD863,
+ 0x49B1,0xD863,0x49AC,0x49EC,0xD863,0xD863,0x4A01,0xD863,0xD864,0xD864,
+ 0xD864,0x4A23,0xD864,0x4A24,0x4A1E,0xD864,0x4A4A,0x4A65,0x4A6A,0xD864,
+ 0xD864,0xD864,0x4A69,0xD864,0xD864,0x4A95,0xD864,0xD865,0xD865,0xD865,
+ 0x9842,0xD865,0xD865,0x4ACC,0xD865,0xD865,0xD87E,0x4ACF,0xD865,0xD865,
+ 0x4B0F,0xD865,0x4B0E,0x4B0B,0x4B10,
+ 1, /* first low-surrogate */
+ 0xDF4E,0xDF4B,0xDF52,0xDF4D, 0, 0,0xDCE4, 0,0xDCDA,
+ 0, 0, 0, 0,0xDCDF,0xDCE8, 0, 0, 0,0xDF70,
+ 0xDF72, 0,0xDF77, 0, 0, 0,0xDDE6,0xDFAA, 0, 0,
+ 0xDC8C, 0,0xDC89, 0, 0,0xDE32, 0, 0, 0, 0,
+ 0xDE7A, 0,0xDC9E,0xDCA0,0xDD70, 0, 0, 0,0xDD6E,0xDD66,
+ 0,0xDD65, 0, 0,0xDF7F,0xDFE0, 0,0xDFFF,0xDCF6,0xDCF7,
+ 0xDCF5, 0,0xDCFC, 0, 0,0xDCF9, 0, 0, 0,0xDECA,
+ 0xDEC3,0xDEC6, 0,0xDFB8,0xDFBD, 0,0xDFBC,0xDC05,0xDCE0,0xDCE9,
+ 0,0xDCDF,0xDCEC, 0,0xDCE5,0xDCDE,0xDE00, 0,0xDCF0,0xDCE3,
+ 0,0xDDEC,
+ /* plane 4, row 58 */
+ 1 | (94 << 8), /* first, last */
+ 0x4B0D,0x4B0C,0xD865,0xD865,0xD865,0xD865,0x4B46,0x4B48,0x9937,
+ 0x4B49,0xD865,0xD866,0x4B91,0x4B8E,0xD866,0x4BD8,0x4BD6,0xD866,0x4BDA,
+ 0xD866,0x4BD7,0xD866,0x9AFF,0x4BF9,0xD866,0xD866,0x4BFC,0xD866,0xD867,
+ 0xD867,0x9BA9,0x4C4A,0x9BA7,0x4C4E,0x9BB3,0x9BAC,0x9BB0,0xD867,0xD867,
+ 0xD867,0x9B9C,0xD867,0xD867,0xD868,0x9D3C,0x9D1C,0x9D3A,0x4CD3,0x4CCD,
+ 0x4CD1,0xD868,0xD868,0x9D32,0x9D34,0xD868,0xD868,0xD87E,0xD868,0xD868,
+ 0xD868,0x9EC7,0xD868,0x4D62,0xD869,0xD869,0xD869,0x4D83,0x9F3F,0xD869,
+ 0x4D92,0x349F,0x34A0,0xD841,0xD841,0xD841,0xD841,0xD841,0x3527,0xD842,
+ 0x360B,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0x368D,0xD845,0xD846,0x3770,0xD847,
+ 3, /* first low-surrogate */
+ 0xDDF2,0xDDEF,0xDDE9,0xDEFB, 0, 0, 0,
+ 0,0xDF37,0xDCDE, 0, 0,0xDCDA, 0, 0,0xDE4B, 0,
+ 0xDE49, 0,0xDED5, 0, 0,0xDF52,0xDF47, 0,0xDF48,0xDCCC,
+ 0xDCD0, 0, 0, 0, 0, 0, 0, 0,0xDD86,0xDDA7,
+ 0xDDA3, 0,0xDDB6,0xDDAD,0xDC13, 0, 0, 0, 0, 0,
+ 0,0xDC17,0xDC22, 0, 0,0xDC49,0xDC26,0xDE0C,0xDC3C,0xDC28,
+ 0xDEA8, 0,0xDFFB, 0,0xDC32,0xDCD6,0xDD48, 0, 0,0xDDC6,
+ 0, 0, 0,0xDC25,0xDC26,0xDC24,0xDC33,0xDD70, 0,0xDF90,
+ 0,0xDC95,0xDCA1,0xDC92,0xDC8F,0xDC9F,0xDC96,0xDC98,0xDC9D,0xDCA0,
+ 0,0xDE97,0xDCEB, 0,0xDF87,
+ /* plane 4, row 59 */
+ 1 | (94 << 8), /* first, last */
+ 0x5EEB,0xD849,0x399A,0x399F,0x399D,0xD84A,0xD84A,0xD84A,0x399B,
+ 0xD84A,0x61D5,0xD87E,0x3A60,0x3A64,0x3A69,0x3A63,0x3A67,0x3A62,0xD84B,
+ 0xD84B,0xD84B,0x6502,0xD84B,0xD84B,0xD84C,0x3AAC,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0x3B26,0x3B23,0x3B25,0xD84D,0xD84D,0x3BF8,0xD84D,0xD84D,0xD84D,
+ 0x3BF7,0x3BFB,0x3BFA,0xD84D,0xD84D,0xD84E,0xD84E,0x3CB0,0x3CAF,0xD84F,
+ 0xD850,0xD850,0x3D7E,0xD850,0x3D7D,0x3D80,0xD850,0xD850,0x3D7F,0x3D86,
+ 0xD850,0xD850,0x7012,0xD850,0x3D81,0xD851,0xD851,0xD851,0x3E24,0x3E58,
+ 0x3E57,0x3EA0,0xD852,0x3EFE,0xD852,0xD852,0x3F15,0xD852,0x3F47,0x3F46,
+ 0xD852,0xD853,0x3F6B,0x3F6C,0x7585,0x7654,0xD853,0x3FCC,0xD853,0x7655,
+ 0xD853,0x3FCB,0x76A7,0x76A8,0x3FF9,
+ 2, /* first low-surrogate */
+ 0xDC32, 0, 0, 0,0xDCD8,0xDCFB,0xDD06, 0,
+ 0xDCD1, 0,0xDCB0, 0, 0, 0, 0, 0, 0,0xDDF6,
+ 0xDE04,0xDDFE, 0,0xDDFF,0xDDF7,0xDC18, 0,0xDC14,0xDCCD,0xDD20,
+ 0xDEDE, 0, 0, 0,0xDF45,0xDF53, 0,0xDF4B,0xDF55,0xDF41,
+ 0, 0, 0,0xDF5C,0xDF54,0xDE71,0xDED0, 0, 0,0xDC53,
+ 0xDC29,0xDC7E, 0,0xDC79, 0, 0,0xDC70,0xDC6A, 0, 0,
+ 0xDC85,0xDC64, 0,0xDC78, 0,0xDC32,0xDC27,0xDC2F, 0, 0,
+ 0, 0,0xDCBA, 0,0xDE71,0xDE8C, 0,0xDF1A, 0, 0,
+ 0xDF98,0xDCE4, 0, 0, 0, 0,0xDEC2, 0,0xDEBA, 0,
+ 0xDEC8,
+ /* plane 4, row 60 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0xD854,0xD854,0xD854,0x4078,0x407A,0x4075,0xD854,0x4076,
+ 0x4077,0xD854,0xD854,0x40EA,0x40EE,0x40ED,0xD855,0x40EC,0x790F,0xD855,
+ 0xD855,0x4184,0x4185,0x4183,0xD856,0x41BC,0x41BD,0x41D4,0xD857,0xD857,
+ 0xD857,0xD857,0x4255,0xD857,0x4250,0x424C,0x4248,0xD857,0x4253,0xD857,
+ 0x4257,0x4254,0x424E,0x424A,0x4251,0xD857,0xD857,0x4249,0x424B,0x4263,
+ 0xD857,0xD857,0x42A7,0x42A6,0x42A4,0xD857,0xD857,0xD87E,0x7CE4,0x7CE5,
+ 0xD858,0xD858,0x7E65,0x7E4E,0x4317,0xD858,0x4316,0xD858,0xD858,0x4363,
+ 0xD858,0xD858,0x7F82,0xD858,0x437B,0x437C,0xD858,0xD858,0xD859,0xD859,
+ 0x43B0,0x802D,0xD859,0xD85A,0x4442,0xD85A,0x4444,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0x4488,0x448F,0x4553,
+ 1, /* first low-surrogate */
+ 0xDCB9,0xDCB8,0xDCA5,0xDEE2, 0, 0, 0,0xDED9, 0,
+ 0,0xDEAC,0xDEDD, 0, 0, 0,0xDD9D, 0, 0,0xDF11,
+ 0xDF03, 0, 0, 0,0xDCEE, 0, 0, 0,0xDCA4,0xDCD8,
+ 0xDCDD,0xDCDE, 0,0xDCE7, 0, 0, 0,0xDCD4, 0,0xDCCE,
+ 0, 0, 0, 0, 0,0xDCF1,0xDCD3, 0, 0, 0,
+ 0xDCCA,0xDCE9, 0, 0, 0,0xDF1A,0xDF41,0xDD68, 0, 0,
+ 0xDD3D,0xDD40, 0, 0, 0,0xDD43, 0,0xDD3F,0xDD3C, 0,
+ 0xDF21,0xDF20, 0,0xDFC6, 0, 0,0xDFD1,0xDFCA,0xDC8E,0xDC91,
+ 0, 0,0xDDE3,0xDC88, 0,0xDC70, 0,0xDD9D,0xDE9D,0xDE91,
+ 0xDE98,0xDE99,
+ /* plane 4, row 61 */
+ 1 | (94 << 8), /* first, last */
+ 0x455B,0xD85B,0x4559,0xD85B,0xD85B,0xD85B,0xD85C,0x85CA,0xD85C,
+ 0xD85B,0x4554,0x85BC,0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,0x4599,0xD85C,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x45F1,0xD85D,0x45EF,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x4662,0xD85D,0x4663,0xD85D,
+ 0x4660,0x4661,0x465F,0xD85D,0xD85D,0xD85D,0x468D,0xD85E,0x468E,0xD85E,
+ 0xD85E,0xD85E,0x4709,0xD85E,0xD85E,0x4705,0xD85E,0xD85E,0x4703,0x4706,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x4731,0xD85F,0xD85F,0x474F,0xD85F,
+ 0xD85F,0xD85F,0x4766,0x8CFF,0x47C4,0xD85F,0x47C3,0x47C1,0x47C5,0xD860,
+ 0xD860,0xD860,0x4821,0xD860,0x481F,0x4822,0xD860,0x4827,0x4820,0xD860,
+ 0x486D,0x486C,0x486B,0x486F,0x4870,
+ 2, /* first low-surrogate */
+ 0xDFBF, 0,0xDFAE,0xDFB1,0xDFCC,0xDC04, 0,0xDC16,
+ 0xDFCD, 0, 0,0xDFE0,0xDFCB,0xDFD4,0xDFC9,0xDDFF, 0,0xDDFD,
+ 0xDC57,0xDC52,0xDC50,0xDC45,0xDC4D, 0,0xDC53, 0,0xDC82,0xDC44,
+ 0xDDCE,0xDDCF,0xDDD2,0xDE02,0xDF4F,0xDF58, 0,0xDF43, 0,0xDF52,
+ 0, 0, 0,0xDF49,0xDF53,0xDF4D, 0,0xDC84, 0,0xDC83,
+ 0xDD32,0xDEE2, 0,0xDEE4,0xDED3, 0,0xDED5,0xDEDD, 0, 0,
+ 0xDEEC,0xDEE6,0xDED2,0xDEFA,0xDEDA, 0,0xDC06,0xDC04, 0,0xDC7B,
+ 0xDD04,0xDD02, 0, 0, 0,0xDF60, 0, 0, 0,0xDD07,
+ 0xDD05,0xDD0C, 0,0xDD5A, 0, 0,0xDD1A, 0, 0,0xDF8A,
+ /* plane 4, row 62 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD861,0xD862,0x91A6,0xD862,0xD862,0x4942,0xD862,0x93B6,
+ 0xD862,0x4944,0x4940,0xD862,0xD862,0x493F,0xD862,0x93AB,0x498B,0xD863,
+ 0xD863,0x4A25,0x4A28,0xD864,0x9721,0xD864,0xD864,0x4A75,0x4A72,0xD864,
+ 0x4A6F,0xD864,0xD864,0x4A76,0x4A71,0x97A7,0xD864,0x4A97,0xD864,0x4AD7,
+ 0xD865,0x4AD6,0xD865,0x4AD8,0x4ADC,0x4ADB,0x4AD4,0x983E,0x4B13,0x4B11,
+ 0x4B14,0xD865,0xD865,0xD865,0xD865,0x4B51,0x4B50,0x4B53,0x4B54,0x4B52,
+ 0xD865,0xD865,0xD865,0x4B6D,0xD87E,0xD866,0x4B95,0x4B99,0xD866,0x4B9A,
+ 0xD866,0x4B93,0x4B97,0xD866,0xD866,0xD866,0xD866,0xD866,0x4BDC,0xD866,
+ 0x4BFD,0xD866,0xD866,0x4BFE,0x4C00,0x4C02,0x4C01,0x4C03,0xD866,0xD867,
+ 0xD867,0xD867,0x4C27,0x4C26,0x4C24,
+ 1, /* first low-surrogate */
+ 0xDF8C,0xDE09,0xDCA6, 0,0xDCAC,0xDCA9, 0,0xDE8B, 0,
+ 0xDE8C, 0, 0,0xDE88,0xDE89, 0,0xDE93, 0, 0,0xDD83,
+ 0xDF4F, 0, 0,0xDD20, 0,0xDE36,0xDEE2, 0, 0,0xDEEE,
+ 0,0xDEE7,0xDEE9, 0, 0, 0,0xDEDF, 0,0xDFC7, 0,
+ 0xDD09, 0,0xDD01, 0, 0, 0, 0, 0, 0, 0,
+ 0,0xDE05,0xDE0C,0xDF78,0xDF5D, 0, 0, 0, 0, 0,
+ 0xDF5E,0xDF60,0xDF67, 0,0xDE05,0xDCF4, 0, 0,0xDCF1, 0,
+ 0xDCFA, 0, 0,0xDCF8,0xDCF9,0xDD09,0xDCFD,0xDCF7, 0,0xDE59,
+ 0,0xDF60,0xDF68, 0, 0, 0, 0, 0,0xDF6A,0xDC14,
+ 0xDC3E,0xDCE4,
+ /* plane 4, row 63 */
+ 1 | (94 << 8), /* first, last */
+ 0x4C4C,0x9BBC,0x4C50,0x4C55,0x4C53,0x9BB7,0x4C52,0xD867,0x4C57,
+ 0x9BBE,0x4C58,0x4CD6,0xD868,0xD868,0x4CD4,0xD868,0x4CDA,0x4CD9,0xD860,
+ 0x9D62,0x4CD5,0x4CE4,0xD87E,0x4CDC,0x4D1B,0x9E8F,0x4D37,0x4D36,0x4D4B,
+ 0x9ECB,0x4D66,0x4D76,0xD869,0x4D7E,0x4D7D,0x4D7F,0x4D84,0x4D8B,0xD869,
+ 0x4D94,0x34A1,0x3511,0xD842,0x3610,0x56A9,0xD844,0xD844,0xD844,0xD844,
+ 0x5913,0xD846,0x3732,0x5BF4,0xD846,0xD846,0xD847,0xD847,0x3820,0xD847,
+ 0xD848,0xD848,0x389D,0xD849,0x61EC,0x61EF,0xD84A,0xD84A,0x39A5,0xD84A,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0x3C02,0x3BFE,
+ 0x3C01,0x6AD6,0x3C03,0x3BFF,0xD84D,0x3C04,0xD87E,0x3C4A,0xD84E,0x3D87,
+ 0xD850,0x3D84,0xD850,0x3D85,0x7209,
+ 8, /* first low-surrogate */
+ 0xDDD2, 0,
+ 0, 0, 0,0xDC58,0xDC50, 0,0xDC5C, 0, 0,0xDD19,
+ 0, 0, 0,0xDE0E, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,0xDCDF, 0, 0, 0, 0, 0,0xDDD9,
+ 0, 0, 0,0xDD66, 0, 0,0xDCE1,0xDCEF,0xDCE8,0xDE33,
+ 0,0xDCFE, 0, 0,0xDEEF,0xDEEC,0xDCEC,0xDF9C, 0,0xDF99,
+ 0xDD70,0xDD6E, 0,0xDC41, 0, 0,0xDD02,0xDD01, 0,0xDE1B,
+ 0xDE23,0xDE25,0xDE24,0xDE26,0xDE33,0xDE2F,0xDC8F,0xDF56, 0, 0,
+ 0, 0, 0, 0,0xDF99, 0,0xDCED, 0,0xDED9, 0,
+ 0xDCB7, 0,0xDCB6,
+ /* plane 4, row 64 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0xD851,0xD851,0x3E59,0x7379,0xD852,0x74C6,0xD852,0xD852,
+ 0x3F04,0x3F49,0x3F48,0xD853,0x3F6D,0x3FD2,0x3FD3,0xD853,0x3FD1,0xD853,
+ 0xD853,0xD853,0xD853,0x3FE7,0x400A,0x77C3,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0x40F0,0xD855,0xD855,0x791F,0xD856,0xD856,0x7A65,0xD856,0xD856,
+ 0x41BE,0x41BF,0xD856,0x7AC6,0x7C3A,0xD857,0x7C36,0xD857,0xD857,0xD857,
+ 0xD857,0x425E,0xD857,0xD857,0x425B,0xD857,0xD857,0xD857,0x7CEB,0x42AB,
+ 0xD857,0x42AC,0xD857,0xD857,0xD858,0xD858,0x431F,0x431D,0xD858,0xD858,
+ 0x431C,0xD858,0x431E,0xD858,0xD858,0xD858,0xD858,0x4364,0xD858,0x7F84,
+ 0xD859,0xD85A,0xD85A,0x4448,0x4447,0xD85A,0xD85C,0x455E,0x4561,0xD85C,
+ 0x85E0,0x85F3,0xD85C,0xD85C,0xD85C,
+ 1, /* first low-surrogate */
+ 0xDC54,0xDC57,0xDC7A, 0, 0,0xDE8E, 0,0xDE90,0xDEB9,
+ 0, 0, 0,0xDCEF, 0, 0, 0,0xDEE2, 0,0xDED6,
+ 0xDED8,0xDEDA,0xDEDE, 0, 0, 0,0xDF08,0xDF04,0xDF0A,0xDF0B,
+ 0xDF02, 0,0xDDAA,0xDDC1, 0,0xDCD7,0xDCD9, 0,0xDCDE,0xDCDA,
+ 0, 0,0xDE2A, 0, 0,0xDD31, 0,0xDD2B,0xDD2C,0xDD29,
+ 0xDD2E, 0,0xDD27,0xDD28, 0,0xDD5F,0xDD30,0xDD24, 0, 0,
+ 0xDF3A, 0,0xDF39,0xDF40,0xDD80,0xDD84, 0, 0,0xDD75,0xDD76,
+ 0,0xDD7C, 0,0xDD78,0xDD9B,0xDD7E,0xDE5A, 0,0xDF2C, 0,
+ 0xDC9C,0xDC47,0xDC8A, 0, 0,0xDD27,0xDC4A, 0, 0,0xDC27,
+ 0, 0,0xDC2E,0xDC26,0xDE08,
+ /* plane 4, row 65 */
+ 1 | (94 << 8), /* first, last */
+ 0x45F7,0xD85D,0xD85D,0x45F4,0x45F8,0x881E,0xD85D,0xD85D,0xD85D,
+ 0x4664,0xD85D,0x4692,0x468F,0x4690,0x89B4,0x4693,0x46A8,0xD85E,0xD85E,
+ 0x46A9,0xD85E,0xD85E,0x89F9,0xD85E,0xD85E,0x8B44,0x470E,0xD85E,0x470F,
+ 0xD85E,0xD85E,0x470B,0xD85E,0xD85E,0xD85E,0xD85E,0x4710,0x4751,0xD85F,
+ 0x4750,0xD85F,0x4763,0xD85F,0xD85F,0x47C7,0xD85F,0x8E71,0x4824,0x4826,
+ 0x8E6E,0xD860,0x8E79,0xD860,0x8EC4,0x4874,0x4873,0x4872,0xD860,0xD860,
+ 0xD861,0xD861,0x48B1,0x908C,0xD861,0x490E,0x4911,0x4910,0x490F,0x4912,
+ 0x4949,0x93C9,0x494F,0x494D,0xD862,0xD862,0x4955,0xD863,0xD863,0xD864,
+ 0xD864,0xD864,0xD864,0x4A2C,0x4A2B,0xD864,0xD864,0x4A79,0xD864,0xD864,
+ 0xD864,0x4A7A,0x97B0,0x4A99,0x4A9A,
+ 2, /* first low-surrogate */
+ 0xDCBD,0xDC96, 0, 0, 0,0xDCBE,0xDC8E,0xDF74,
+ 0,0xDF80, 0, 0, 0, 0, 0, 0,0xDD3C,0xDD3D,
+ 0,0xDD3A,0xDD42, 0,0xDF24,0xDF06, 0, 0,0xDF15, 0,
+ 0xDF02,0xDF0C, 0,0xDF08,0xDF0A,0xDF05,0xDF1C, 0, 0,0xDC82,
+ 0,0xDC86, 0,0xDE03,0xDF7B, 0,0xDF7A, 0, 0, 0,
+ 0,0xDD80, 0,0xDD58, 0, 0, 0, 0,0xDFAA,0xDFAB,
+ 0xDC36,0xDC4A, 0, 0,0xDFD6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,0xDF03,0xDECF, 0,0xDD9F,0xDDA2,0xDC2A,
+ 0xDC2F,0xDD44,0xDD40, 0, 0,0xDF11,0xDF0F, 0,0xDF0D,0xDF07,
+ 0xDF03,
+ /* plane 4, row 66 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0x4AAE,0x4AAF,0xD865,0x4AE4,0x4AE1,0x4ADE,0x4AE6,0x4ADF,
+ 0xD865,0x4AE7,0x4AE2,0x4AE0,0xD865,0x4AE5,0x985A,0xD865,0x4B18,0xD865,
+ 0xD865,0xD865,0x4B56,0xD865,0x9946,0xD865,0xD865,0xD865,0x4B6E,0xD866,
+ 0xD866,0x4B9D,0x4BA0,0x4B9C,0xD866,0xD866,0x4BA1,0x4BA2,0x4B9F,0x4BDF,
+ 0x4BDE,0x9AC3,0x4BEA,0xD866,0x4C06,0xD866,0x4C04,0x9B0F,0xD866,0xD867,
+ 0xD867,0xD867,0x4C5F,0x9BF4,0x9BFA,0x4C5C,0xD867,0x4C5E,0xD867,0xD867,
+ 0x9BDD,0x4C59,0xD867,0xD867,0x4C64,0x4C5D,0x4C62,0xD867,0x4C65,0xD867,
+ 0x9BED,0x4C5B,0x9BEF,0xD868,0x4CDD,0xD868,0x4CDF,0xD868,0xD87E,0x4CE2,
+ 0xD868,0xD868,0x4D27,0xD868,0xD868,0x9E96,0x4D3A,0x4D3C,0xD868,0x4D39,
+ 0xD868,0xD868,0x4D3D,0x4D3B,0x9EB3,
+ 1, /* first low-surrogate */
+ 0xDC35, 0, 0,0xDD04, 0, 0, 0, 0, 0,
+ 0xDD26, 0, 0, 0,0xDD1E, 0, 0,0xDE0E, 0,0xDE1D,
+ 0xDE1E,0xDE1F, 0,0xDF88, 0,0xDF8D,0xDF91,0xDF80, 0,0xDC54,
+ 0xDC55, 0, 0, 0,0xDD25,0xDD1A, 0, 0, 0, 0,
+ 0, 0, 0,0xDF88, 0,0xDF7A, 0, 0,0xDF80,0xDD1E,
+ 0xDDFC,0xDE25, 0, 0, 0, 0,0xDE0B, 0,0xDE06,0xDE04,
+ 0, 0,0xDDF9,0xDE00, 0, 0, 0,0xDE02, 0,0xDE07,
+ 0, 0, 0,0xDCB5, 0,0xDC87, 0,0xDC93,0xDE0F, 0,
+ 0xDCBE,0xDE66, 0,0xDEC7,0xDECF, 0, 0, 0,0xDF3D, 0,
+ 0xDF3C,0xDF47,
+ /* plane 4, row 67 */
+ 1 | (94 << 8), /* first, last */
+ 0x4D4C,0xD868,0x4D68,0x9EE2,0xD869,0x4D80,0x4D85,0xD869,0x4D95,
+ 0xD869,0x4D96,0xD869,0x9F8F,0xD841,0x34A4,0x3512,0x56B1,0x3625,0xD845,
+ 0x5B41,0x3737,0xD846,0xD847,0xD847,0xffff,0x3868,0x3867,0x389E,0xD849,
+ 0xD849,0xD84A,0x39AA,0xD84A,0x39A9,0x39A4,0xD84A,0xD84A,0x3A71,0x3A6F,
+ 0xD84B,0xD84B,0xD84B,0xD84C,0x3AAD,0xD84C,0x6AF6,0x3C0C,0x6AF2,0x3C0B,
+ 0xD84D,0xD84D,0x3C0F,0x3C79,0xD850,0xD850,0xD850,0xD850,0x3D8D,0x3D8F,
+ 0xD850,0xD850,0x3D8E,0x3E0C,0xD851,0xD851,0xD851,0x3EA6,0xD852,0x3EA3,
+ 0x3EA4,0x3EA5,0x7588,0x3F6E,0xD853,0xD853,0x3FFA,0xD854,0x407C,0x407E,
+ 0x407B,0x407D,0xD854,0xD854,0x408D,0x40F4,0x40F3,0xD855,0xD856,0x4189,
+ 0xD856,0xD856,0x41C0,0xD857,0x4265,
+ 2, /* first low-surrogate */
+ 0xDFC3, 0, 0,0xDD1B, 0, 0,0xDDC9, 0,
+ 0xDDDD, 0,0xDE93, 0,0xDC3D, 0, 0, 0, 0,0xDCE6,
+ 0, 0,0xDEF7,0xDFB0,0xDFAE, 0, 0, 0, 0,0xDD9F,
+ 0xDD9E,0xDD30, 0,0xDD4F, 0, 0,0xDD27,0xDD51, 0, 0,
+ 0xDE51,0xDE54,0xDE56,0xDC27, 0,0xDC24, 0, 0, 0, 0,
+ 0xDFEC,0xDFC4, 0, 0,0xDCF8,0xDCF6,0xDCF7,0xDCED, 0, 0,
+ 0xDCF4,0xDCEF, 0, 0,0xDC7F,0xDCA2,0xDC7E, 0,0xDCC5, 0,
+ 0, 0, 0, 0,0xDEF1,0xDEF2, 0,0xDC2F, 0, 0,
+ 0, 0,0xDF23,0xDF29, 0, 0, 0,0xDF1B,0xDCEB, 0,
+ 0xDCEA,0xDE33, 0,0xDD63,
+ /* plane 4, row 68 */
+ 1 | (94 << 8), /* first, last */
+ 0xD857,0xD857,0x42AD,0x4325,0xD858,0xD87E,0xD858,0x43C9,0xD85A,
+ 0x444A,0xD85A,0x8267,0x4489,0xD85C,0x4566,0x4570,0xD85C,0x456D,0x4569,
+ 0x4567,0xD85C,0x4572,0x860E,0x456E,0xD85C,0x459C,0x45FC,0x45FD,0x4604,
+ 0x45FF,0xD87E,0x45FE,0x4600,0xD85D,0x4666,0x4669,0xD85D,0x46AA,0x46AB,
+ 0x4717,0xD85E,0xD85E,0xD85E,0x4715,0x8B5E,0x4712,0x8D0E,0xD85F,0xD85F,
+ 0xD85F,0x47CA,0xD85F,0x47C9,0x47CB,0xD85F,0xD85F,0xD860,0x4829,0x4828,
+ 0xD860,0xD860,0xD860,0x4840,0x4875,0x4876,0xD860,0x4888,0xD861,0x91B6,
+ 0x4957,0x9401,0xD862,0x495F,0xD862,0x941D,0x4958,0x495B,0xD862,0x942F,
+ 0xD863,0x49B3,0xD863,0x49EF,0xD864,0x4A30,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0x4A41,0x4A4B,0xD864,0x4A7D,
+ 1, /* first low-surrogate */
+ 0xDD92,0xDD65, 0, 0,0xDDA0,0xDD70,0xDE5E, 0,0xDCAA,
+ 0,0xDCA9, 0, 0,0xDC9C, 0, 0,0xDC92, 0, 0,
+ 0,0xDC86, 0, 0, 0,0xDC83, 0, 0, 0, 0,
+ 0,0xDDC2, 0, 0,0xDCCE, 0, 0,0xDF93, 0, 0,
+ 0,0xDF2E,0xDF27,0xDF28, 0, 0, 0, 0,0xDE18,0xDE16,
+ 0xDF8D, 0,0xDF8E, 0, 0,0xDF90,0xDF8F,0xDD81, 0, 0,
+ 0xDD8A,0xDD8C,0xDE8D, 0, 0, 0,0xDFB2, 0,0xDFD9, 0,
+ 0, 0,0xDF0D, 0,0xDF13, 0, 0, 0,0xDF1B, 0,
+ 0xDDAC, 0,0xDDB3, 0,0xDD5E, 0,0xDD60,0xDD68,0xDD63,0xDD69,
+ 0xDD67, 0, 0,0xDF28,
+ /* plane 4, row 69 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0x4A7C,0xD864,0xD864,0xD864,0x97E0,0xD864,0x97DB,
+ 0xD87E,0xD865,0x9861,0xD865,0xD865,0x4AE8,0x4AEA,0x4AE9,0xD865,0xD865,
+ 0xD865,0xD865,0x4B1B,0xD865,0xD865,0x4B55,0x994A,0x4B59,0x4B58,0xD865,
+ 0xD865,0xD865,0x4BA4,0x4BA3,0xD866,0xD866,0xD866,0xD866,0x9A33,0x4BA7,
+ 0xD866,0x4BE0,0xD866,0xD866,0xD866,0x4C08,0x4C0A,0x4C09,0xD866,0xD867,
+ 0xD867,0x4C71,0x9C0F,0x4C6C,0xD867,0x9C11,0xD867,0x9C03,0x9C01,0x4C6E,
+ 0xD867,0x9C16,0xD867,0xffff,0xD867,0x4CE0,0x4CEE,0xD868,0x4CEB,0xD868,
+ 0xD868,0xD868,0xD868,0x9D93,0x4CEA,0x4CEF,0x4CE7,0xD868,0xD868,0xD868,
+ 0xD868,0x4D48,0x4D49,0xD868,0xD868,0xD868,0x4D4D,0xD868,0xD869,0x4D55,
+ 0xD869,0xD869,0x4D6A,0x4D6C,0xD869,
+ 1, /* first low-surrogate */
+ 0xDF2E,0xDF30, 0,0xDF26,0xDF31,0xDF41, 0,0xDFDA, 0,
+ 0xDDFA,0xDC0B, 0,0xDD34,0xDD33, 0, 0, 0,0xDD39,0xDD3B,
+ 0xDD40,0xDE30, 0,0xDE32,0xDE37, 0, 0, 0, 0,0xDF81,
+ 0xDF9F,0xDFA7, 0, 0,0xDD44,0xDD47,0xDD48,0xDD3D, 0, 0,
+ 0xDD49, 0,0xDE80,0xDFA0,0xDF9D, 0, 0, 0,0xDF9C,0xDC47,
+ 0xDD07, 0, 0, 0,0xDE49, 0,0xDE44, 0, 0, 0,
+ 0xDEDF, 0,0xDE4C, 0,0xDE4F, 0, 0,0xDCC1, 0,0xDCB9,
+ 0xDCCB,0xDCCF,0xDCC4, 0, 0, 0, 0,0xDCCA,0xDCC3,0xDED0,
+ 0xDF51, 0, 0,0xDFA8,0xDFC7,0xDFC6, 0,0xDFCA,0xDC02, 0,
+ 0xDC5D,0xDC5A, 0, 0,0xDC59,
+ /* plane 4, row 70 */
+ 1 | (94 << 8), /* first, last */
+ 0x4D6B,0xD869,0xD869,0xD869,0x4D98,0x4D99,0x4D97,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD841,0xD841,0xD841,0x535B,0xD842,0x3616,0xD844,
+ 0x56BF,0xD844,0xD845,0x3739,0xD846,0xD847,0x3825,0x5DCE,0xD848,0xD849,
+ 0xD84A,0xD84B,0x3A74,0xD84B,0xD84B,0x3AAE,0xD84C,0xD84D,0xD84D,0xD84F,
+ 0xD850,0x3D92,0x3D94,0xD850,0x3D95,0xD850,0x3E0D,0xD851,0x3E25,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,0x3FD5,0x3FD6,0x76AC,0x3FE8,
+ 0xD854,0x407F,0x77D2,0x40F5,0x40F6,0x40F7,0xD855,0x4124,0x418D,0x418A,
+ 0xD856,0xD856,0x426C,0x4266,0x426A,0xD857,0x4267,0x426D,0x4268,0x7C52,
+ 0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0x4365,0xD859,0x439A,0xD859,
+ 2, /* first low-surrogate */
+ 0xDCCC,0xDD1C,0xDDCC, 0, 0, 0,0xDDE8,0xDDEC,
+ 0xDDEA,0xDEAD,0xDEB0,0xDC5F,0xDC58,0xDC57, 0,0xDF93, 0,0xDD3B,
+ 0,0xDD34,0xDCF2, 0,0xDEFD,0xDC1D, 0, 0,0xDF04,0xDC48,
+ 0xDD58,0xDE4F, 0,0xDE6E,0xDE72, 0,0xDC2E,0xDFFC,0xDFF4,0xDC36,
+ 0xDD0E, 0, 0,0xDD14, 0,0xDD19, 0,0xDCA6, 0,0xDEC9,
+ 0xDEC0,0xDECC,0xDF1B,0xDFAA,0xDFA8,0xDF03, 0, 0, 0, 0,
+ 0xDC35, 0, 0, 0, 0, 0,0xDDD9, 0, 0, 0,
+ 0xDE3F,0xDE3D, 0, 0, 0,0xDD8B, 0, 0, 0, 0,
+ 0xDD68,0xDD8A,0xDF58,0xDF57,0xDDCE,0xDDBC,0xDDC0,0xDDC1,0xDDBF,0xDDAB,
+ 0xDE5F, 0,0xDCA6, 0,0xDD29,
+ /* plane 4, row 71 */
+ 1 | (94 << 8), /* first, last */
+ 0x43B1,0x444B,0x444D,0x444C,0x444E,0xD85A,0x4573,0x4575,0xD85C,
+ 0xD85C,0xD87E,0xD85C,0xD85C,0xD85C,0xD85D,0x4603,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0x471E,0xD85E,0x8B73,0xD85E,0x4719,
+ 0x471C,0x471A,0x471D,0x8B76,0xD85E,0xD85E,0x4743,0x4752,0xD85F,0xD85F,
+ 0x4795,0xD85F,0x47CC,0xD860,0x482B,0xD860,0xD860,0xD860,0x482A,0x8EC7,
+ 0x4877,0xD860,0xD860,0xD861,0xD861,0xD862,0xD862,0xD862,0x4913,0x4914,
+ 0x9434,0xD862,0xD862,0x495D,0xD862,0x4960,0x943E,0x4962,0xD863,0xD863,
+ 0x49B2,0x49F0,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0x4A4C,0xD864,
+ 0x4A82,0x97BC,0x4A81,0x4A9B,0xD864,0x4AA4,0x4AEE,0x4AEC,0xD865,0x4AED,
+ 0xD865,0x4AF0,0x4AEF,0xD865,0x4B1D,
+ 6, /* first low-surrogate */
+ 0xDCB8, 0, 0,0xDCDD,
+ 0xDCD6,0xDDB1,0xDCD5,0xDCE7,0xDCD8,0xDCEC, 0,0xDD00,0xDD07,0xDCFD,
+ 0xDCF1,0xDCFF,0xDFAA,0xDFB0,0xDF48, 0,0xDF53, 0,0xDF4D, 0,
+ 0, 0, 0, 0,0xDF43,0xDF50, 0, 0,0xDC8C,0xDE27,
+ 0,0xDF99, 0,0xDDB1, 0,0xDDB0,0xDDAA,0xDDAC, 0, 0,
+ 0,0xDFC8,0xDFCA,0xDE42,0xDFE0,0xDCE7,0xDCE8,0xDCE6, 0, 0,
+ 0,0xDF5B,0xDF56, 0,0xDF5A, 0, 0, 0,0xDCB8,0xDDC5,
+ 0, 0,0xDC48,0xDD7D,0xDD7C,0xDD81,0xDD82,0xDD62, 0,0xDF45,
+ 0, 0, 0, 0,0xDFE3, 0, 0, 0,0xDD50, 0,
+ 0xDD4F, 0, 0,0xDE39,
+ /* plane 4, row 72 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0x4B60,0x4B5E,0x4B5D,0xD865,0xD866,0xD866,0x4BB1,0x4BAB,
+ 0x4BAC,0x4BAD,0xD866,0x4BAE,0xD866,0xD866,0x4BE2,0xD866,0xD866,0xD866,
+ 0xD866,0xD867,0x9B39,0xD867,0xD867,0x9C2A,0x4C7B,0x9C26,0x4C78,0x4C75,
+ 0x9C27,0xD867,0x4CF2,0x4CF4,0x4CF3,0x9DC0,0x9DC9,0xD868,0xD868,0xD868,
+ 0x4D3F,0x4D3E,0x4D40,0x4D4E,0x4D57,0x4D59,0x4D58,0xD87E,0xD869,0xD869,
+ 0x4D6E,0xD869,0xD869,0xD869,0x9EEC,0xD869,0xD869,0x4D81,0x4D86,0xD869,
+ 0x4D8F,0xD869,0xD869,0xD869,0x9F68,0x4D9B,0x4DB1,0x4DB3,0xD844,0x373A,
+ 0xD846,0xD847,0x3827,0xD847,0xD847,0x386A,0x39AC,0xD84C,0x3C18,0xD84E,
+ 0xD84E,0x3C4C,0xD850,0x3D96,0xD852,0x3F4A,0xD852,0xD853,0x4081,0xD854,
+ 0x4083,0x40F9,0x40F8,0xD855,0x418E,
+ 1, /* first low-surrogate */
+ 0xDE3A, 0, 0, 0,0xDFC1,0xDD4E,0xDD6E, 0, 0,
+ 0, 0,0xDD71, 0,0xDE8C,0xDE89, 0,0xDEE5,0xDFB3,0xDFB6,
+ 0xDFB4,0xDC4D, 0,0xDD13,0xDE78, 0, 0, 0, 0, 0,
+ 0,0xDE72, 0, 0, 0, 0, 0,0xDE75,0xDEDA,0xDED7,
+ 0, 0, 0, 0, 0, 0, 0,0xDE16,0xDC69,0xDC67,
+ 0,0xDC66,0xDC6F,0xDC71, 0,0xDCCF,0xDD23, 0, 0,0xDDA5,
+ 0,0xDDFE,0xDDFB,0xDDFD, 0, 0, 0, 0,0xDD6D, 0,
+ 0xDF05,0xDC20, 0,0xDFC8,0xDFC9, 0, 0,0xDD27, 0,0xDC1E,
+ 0xDD36, 0,0xDD3D, 0,0xDCD7, 0,0xDFAD,0xDD00, 0,0xDF3A,
+ 0, 0, 0,0xDF26,
+ /* plane 4, row 73 */
+ 1 | (94 << 8), /* first, last */
+ 0x418F,0x41C1,0xD857,0xD857,0xD857,0x4270,0xD857,0x4271,0xD858,
+ 0x432A,0x432D,0x437D,0x8032,0x8031,0xD85A,0x444F,0xD85A,0xD85A,0x4490,
+ 0xD85C,0xD85C,0xD85C,0x4579,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,
+ 0x4605,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0x89FD,0xD85E,0xD85E,
+ 0x4721,0xD85E,0xD85E,0xD858,0x4732,0xD85F,0x47CD,0x47CF,0xD860,0xD860,
+ 0x908E,0x4916,0x4915,0x49B5,0x4A08,0xD864,0x4A32,0xD864,0x4A33,0x4A34,
+ 0x4A3C,0xD864,0x97C2,0xD864,0x4A9C,0xD865,0x4AF4,0x4AF2,0xD865,0x4B62,
+ 0xD865,0x4B61,0x4B64,0x4BB5,0x9A4B,0x4BB4,0xD866,0xD866,0x4BE3,0xD866,
+ 0xD866,0x9B1C,0x4C0E,0xD866,0x9B1B,0xD867,0x4C2C,0x4C2B,0xD867,0xD867,
+ 0xD867,0x4C85,0x4C81,0x4C7E,0x4C83,
+ 3, /* first low-surrogate */
+ 0xDDB7,0xDDB6,0xDDC0, 0,0xDD9B, 0,0xDDD8,
+ 0, 0, 0, 0, 0,0xDCC0, 0,0xDCBF,0xDEBF, 0,
+ 0xDD20,0xDCD0,0xDD0E, 0,0xDD1D,0xDD1E,0xDD15,0xDD14,0xDD1E,0xDD2C,
+ 0,0xDFB9,0xDFB8,0xDFB6,0xDC9E,0xDC9C,0xDD4D, 0,0xDF6E,0xDF60,
+ 0,0xDF64,0xDF62,0xDDE5, 0,0xDFA3, 0, 0,0xDFD2,0xDFD5,
+ 0, 0, 0, 0, 0,0xDC55, 0,0xDD93, 0, 0,
+ 0,0xDF56, 0,0xDFE9, 0,0xDC45, 0, 0,0xDE7C, 0,
+ 0xDFD3, 0, 0, 0, 0, 0,0xDD8E,0xDE97, 0,0xDE9B,
+ 0xDE99, 0, 0,0xDFCF, 0,0xDC59, 0, 0,0xDD20,0xDD23,
+ 0xDD2A,
+ /* plane 4, row 74 */
+ 1 | (94 << 8), /* first, last */
+ 0x4C80,0xD867,0x9C42,0xD868,0x9DD4,0x4CFB,0x4CF7,0xD868,0xD868,
+ 0xD868,0xD868,0x4CF8,0xD868,0xD868,0xD868,0xD868,0x4D5A,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0x4D78,0xD869,0xD869,0xD869,0xD869,0x4D9D,0x4D9C,
+ 0xD869,0xD869,0xD841,0x34A9,0x34BF,0x56D0,0x56CF,0xD846,0x5DDA,0xD849,
+ 0x3A77,0x3A76,0xD84C,0x3ABB,0x66EA,0xD84E,0x3D9B,0xD851,0x3E0F,0x3E5B,
+ 0xD852,0x3F4C,0x3F6F,0x3FD9,0xD853,0x4082,0xD854,0xD854,0xD854,0xD855,
+ 0x4274,0x4272,0xD857,0xD857,0xD857,0x4273,0xD857,0xD857,0xD857,0x42B1,
+ 0x432E,0xD858,0xD858,0xD858,0xD858,0x434E,0xD859,0xD859,0xD85A,0xD85A,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0x460B,0xD85D,
+ 0xD85D,0x466C,0x8B89,0xD85E,0xD85E,
+ 2, /* first low-surrogate */
+ 0xDEB0, 0,0xDD2F, 0, 0, 0,0xDD32,0xDD43,
+ 0xDD3F,0xDD39, 0,0xDD30,0xDEDD,0xDFDA,0xDFDB, 0,0xDC84,0xDC7F,
+ 0xDC72,0xDC80,0xDCEE, 0,0xDD2A,0xDD22,0xDD71,0xDDCD, 0, 0,
+ 0xDE0F,0xDE18,0xDC6A, 0, 0, 0, 0,0xDF0C, 0,0xDDA6,
+ 0, 0,0xDC37, 0, 0,0xDEE2, 0,0xDCBC, 0, 0,
+ 0xDED5, 0, 0, 0,0xDF12, 0,0xDF4B,0xDF41,0xDFA1,0xDDEC,
+ 0, 0,0xDDD4,0xDDD8,0xDDD9, 0,0xDDDA,0xDF6C,0xDF6D, 0,
+ 0,0xDDE7,0xDDEB,0xDDEC,0xDE62, 0,0xDD2B,0xDE0D,0xDCCD,0xDEC3,
+ 0xDD3F,0xDD3C,0xDD3E,0xDD3D,0xDD3A,0xDD38,0xDD44,0xDD45, 0,0xDD48,
+ 0xDD50, 0, 0,0xDF78,0xDF79,
+ /* plane 4, row 75 */
+ 1 | (94 << 8), /* first, last */
+ 0x478B,0xD85F,0x47D0,0x482D,0xD861,0x48E4,0x4971,0xD862,0x9458,
+ 0x496F,0xD864,0x4A87,0x4AA5,0xD865,0xD865,0x4B1E,0x4B65,0x4BB9,0x4BB7,
+ 0x4BB8,0x4BE4,0xD866,0xD866,0xD866,0xD866,0xD867,0x4C8C,0x4C89,0x4C8A,
+ 0xD867,0xD867,0x4C8B,0xD868,0xD868,0xD868,0x4D01,0x4CFE,0x9DE7,0x4D03,
+ 0x4D06,0xD868,0x9DEA,0x9DF1,0xD868,0x4D1D,0x4D43,0xD868,0xD868,0xD868,
+ 0x4D4F,0xD869,0xD869,0x4D5B,0x4D70,0xD869,0x4D88,0xD869,0xD869,0x4D89,
+ 0x9F44,0xD869,0xD869,0xD869,0xD869,0x9F6D,0xD869,0xD869,0xD869,0xD842,
+ 0xD844,0xD846,0x5DD9,0xD847,0xD847,0xD84B,0xD84E,0x3D9E,0x3D9F,0x3EA7,
+ 0x3F4B,0x3FDB,0x3FDA,0xD853,0x77D6,0x408E,0x4276,0xD857,0x4330,0x432F,
+ 0xD858,0x4366,0xD858,0x457E,0xD85D,
+ 2, /* first low-surrogate */
+ 0xDE3E, 0, 0,0xDE54, 0, 0,0xDFB9, 0,
+ 0,0xDC5F, 0, 0,0xDD72,0xDD75, 0, 0, 0, 0,
+ 0, 0,0xDEA3,0xDEA5,0xDFDC,0xDFDD,0xDC5A, 0, 0, 0,
+ 0xDEDB,0xDEDC, 0,0xDDAB,0xDD84,0xDD76, 0, 0, 0, 0,
+ 0,0xDD83, 0, 0,0xDE7F, 0, 0,0xDF73,0xDFAD,0xDFB0,
+ 0,0xDC0F,0xDC0C, 0, 0,0xDD79, 0,0xDD77,0xDD7A, 0,
+ 0,0xDE32,0xDE27,0xDE2A,0xDE2C, 0,0xDE28,0xDE29,0xDE38,0xDC2F,
+ 0xDD7B,0xDF0D, 0,0xDFD6,0xDFD5,0xDEA1,0xDC4C, 0, 0, 0,
+ 0, 0, 0,0xDFC0, 0, 0, 0,0xDDF4, 0, 0,
+ 0xDDF0, 0,0xDF3F, 0,0xDD5D,
+ /* plane 4, row 76 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85D,0xD85D,0x883A,0xD85D,0x8975,0x466F,0xD85E,0x47D1,0x482F,
+ 0xD860,0xD860,0x48B2,0x4918,0x4917,0xD862,0x4976,0xD864,0xD864,0x4A4F,
+ 0x4A89,0xD864,0xD865,0xD865,0xD865,0x4AF5,0x4B1F,0xD865,0xD865,0x9A5D,
+ 0x4BE5,0xD866,0xD866,0x4C10,0xD866,0x4C0F,0xD866,0xD867,0xD867,0xD867,
+ 0x4C2F,0x4C30,0x9C64,0xD867,0xD867,0x4C93,0x4C94,0xD867,0x4D07,0x4D09,
+ 0x4D08,0xD868,0x4D0B,0xD868,0x9E0A,0xD868,0xD868,0xD868,0x4D50,0x4D71,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0x4D7B,0x4D7C,0xD869,0x9F73,0xD869,
+ 0x4DA1,0xD869,0xD869,0x4DA0,0x4DA2,0xD842,0x361B,0xD844,0x3682,0xD84C,
+ 0xD84E,0xD850,0xD850,0x3FE9,0xD854,0x4084,0x77E1,0xD856,0xD856,0xD857,
+ 0x42B3,0x4334,0x4333,0x4580,0xD85D,
+ 1, /* first low-surrogate */
+ 0xDD72,0xDD62, 0,0xDD66, 0, 0,0xDF88, 0, 0,
+ 0xDDE8,0xDDE4, 0, 0, 0,0xDCFF, 0,0xDDAF,0xDDAE, 0,
+ 0,0xDFF2,0xDC48,0xDD81,0xDD7E, 0, 0,0xDE52,0xDFEF, 0,
+ 0,0xDEAD,0xDFE6, 0,0xDFED, 0,0xDFE9,0xDC61,0xDC60,0xDD33,
+ 0, 0, 0,0xDF0B,0xDF08, 0, 0,0xDF07, 0, 0,
+ 0,0xDDCA, 0,0xDDC6, 0,0xDE84,0xDEEB,0xDF7D, 0, 0,
+ 0xDC9B,0xDCA2,0xDCA1,0xDCA0,0xDC9C, 0, 0,0xDD80, 0,0xDE40,
+ 0,0xDE39,0xDE3C, 0, 0,0xDCCA, 0,0xDD89, 0,0xDC3C,
+ 0xDD40,0xDD63,0xDD69, 0,0xDF53, 0, 0,0xDD17,0xDD1A,0xDE00,
+ 0, 0, 0, 0,0xDD6F,
+ /* plane 4, row 77 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85E,0x46AD,0xD85E,0x4744,0x4755,0xD85F,0x47D2,0xD860,0xD863,
+ 0xD863,0xD864,0xD864,0x4A8A,0xD865,0xD865,0x4B67,0xD866,0xD866,0x4BE6,
+ 0xD866,0x4C13,0xD866,0x9B2D,0xD867,0x4C97,0x9E0C,0xD868,0xD868,0x4D0C,
+ 0xD868,0xD868,0xD868,0x4D46,0x4D5C,0x4D74,0x4D72,0xD869,0xD869,0xD869,
+ 0x9F1F,0xD869,0xD869,0x4DA4,0x4DA3,0xD869,0xD869,0xD869,0xD869,0x4DB4,
+ 0xD841,0x3536,0xD846,0xD84E,0xD84E,0x3CB2,0xD850,0xD850,0x3F16,0x7C70,
+ 0x4277,0xD857,0x457F,0xD85C,0xD85E,0x487D,0x9479,0xD862,0x974A,0x4A8C,
+ 0xD865,0x4B68,0x4BBE,0x4C15,0xD868,0xD868,0xD868,0xD868,0xD869,0x4D75,
+ 0x4DA5,0xD846,0xD84A,0xD84B,0xD850,0xD855,0x4278,0x4335,0x7E9D,0x4582,
+ 0xD85C,0x4583,0xD85C,0x4671,0xD85E,
+ 1, /* first low-surrogate */
+ 0xDCAB, 0,0xDF91, 0, 0,0xDFB1, 0,0xDDEF,0xDDF1,
+ 0xDDF2,0xDDB7,0xDDB5, 0,0xDD86,0xDE5A, 0,0xDDC6,0xDDCB, 0,
+ 0xDEB2, 0,0xDFF3, 0,0xDF27, 0, 0,0xDDD5,0xDDD8, 0,
+ 0xDDEC,0xDE87,0xDEF2, 0, 0, 0, 0,0xDCAD,0xDCB0,0xDCFD,
+ 0,0xDD87,0xDE4A, 0, 0,0xDE4E,0xDE49,0xDE51,0xDE4D, 0,
+ 0xDC72, 0,0xDF16,0xDC6D,0xDD41, 0,0xDD71,0xDD74, 0, 0,
+ 0,0xDF7C, 0,0xDD8A,0xDD56, 0, 0,0xDFFA, 0, 0,
+ 0xDE5B, 0, 0, 0,0xDDF5,0xDDF0,0xDEF3,0xDF7F,0xDC13, 0,
+ 0,0xDF19,0xDD85,0xDEB0,0xDD77,0xDDFF, 0, 0, 0, 0,
+ 0xDD87, 0,0xDD8B, 0,0xDF9E,
+ /* plane 4, row 78 */
+ 1 | (60 << 8), /* first, last */
+ 0x487E,0x4A8E,0xD865,0x9960,0x4B69,0xD866,0xD866,0xD866,0xD867,
+ 0xD867,0xD867,0x4C9A,0x4C9B,0xD868,0xD869,0xD869,0x4D90,0xD869,0x9F9E,
+ 0xD852,0xD85C,0x4586,0x4585,0xD85C,0x460E,0xD85D,0xD85E,0xD85E,0x4919,
+ 0xD864,0x4BC0,0xD866,0xD867,0xD868,0x9EF8,0x9F3A,0x9F7D,0xD869,0xD869,
+ 0x400D,0x4C16,0xD869,0x4DA9,0x4DAA,0x4085,0xD857,0xD85A,0xD85D,0xD867,
+ 0xD868,0xD869,0xD867,0x9F96,0xD869,0x4BC2,0x4C31,0x4D11,0x4DAB,0x4C9C,
+ 0xD864,
+ 3, /* first low-surrogate */
+ 0xDD8F, 0, 0,0xDC39,0xDDD4,0xDEF1,0xDC02,
+ 0xDC6B,0xDD40, 0, 0,0xDE10,0xDCBE,0xDCB9, 0,0xDE64, 0,
+ 0xDEE9,0xDD90, 0, 0,0xDE1C, 0,0xDD92,0xDCAE,0xDFA3, 0,
+ 0xDDC9, 0,0xDDD8,0xDD44,0xDE24, 0, 0, 0,0xDE70,0xDED3,
+ 0, 0,0xDCC3, 0, 0, 0,0xDE21,0xDECA,0xDD9C,0xDC73,
+ 0xDF86,0xDDC1,0xDC09, 0,0xDED5, 0, 0, 0, 0, 0,
+ 0xDDD4,
+ /* plane 4, row 79: --- */
+ /* plane 4, row 80: --- */
+ /* plane 4, row 81: --- */
+ /* plane 4, row 82: --- */
+ /* plane 4, row 83: --- */
+ /* plane 4, row 84: --- */
+ /* plane 4, row 85: --- */
+ /* plane 4, row 86: --- */
+ /* plane 4, row 87: --- */
+ /* plane 4, row 88: --- */
+ /* plane 4, row 89: --- */
+ /* plane 4, row 90: --- */
+ /* plane 4, row 91: --- */
+ /* plane 4, row 92: --- */
+ /* plane 4, row 93: --- */
+ /* plane 4, row 94: --- */
+ /* plane 5, row 1 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD87E,
+ 0xD848,0xD840,0xD840,0xD840,0xD842,0xD845,0xD847,0xD849,0xD84E,0xD840,
+ 0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0x355A,0xD842,0xD842,0xD844,0xD847,0xD847,0xD848,
+ 0xD84C,0xD84E,0xD84E,0xD851,0xD852,0xD840,0xD840,0xD840,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD87E,0xD842,0xD845,0xD846,0xD846,0xD846,
+ 0xD847,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD84A,0xD84A,0xD84A,
+ 0xD84E,0xD84E,0xD84E,0xD84F,0x3CBC,0xD851,0xD845,0xD851,0xD851,0xD859,
+ 0xD859,0xD85A,0xD861,0x49B9,0xD863,
+ 1, /* first low-surrogate */
+ 0xDCD1,0xDCCB,0xDCC9,0xDD0C,0xDC00,0xDC87,0xDD0D,0xDD0F,0xDC1D,
+ 0xDF98,0xDCD2,0xDD11,0xDC7E,0xDED3,0xDD52,0xDCFE,0xDDA9,0xDD42,0xDC09,
+ 0xDCD6,0xDCDD,0xDCDC,0xDD02,0xDD73,0xDE76,0xDEA7,0xDEA8,0xDC33,0xDCCC,
+ 0xDE0D,0xDE2C,0xDF1B, 0,0xDF1D,0xDF99,0xDE3E,0xDD2D,0xDD2F,0xDF99,
+ 0xDFB3,0xDDB6,0xDF1B,0xDCEF,0xDCE9,0xDC14,0xDC94,0xDCE1,0xDD06,0xDD4A,
+ 0xDD44,0xDE31,0xDE7A,0xDEAD,0xDEAE,0xDEB1,0xDC38,0xDC37,0xDD7D,0xDD7E,
+ 0xDE2D,0xDE32,0xDF23,0xDF26,0xDC3A,0xDFA0,0xDEA8,0xDD3F,0xDDBC,0xDFC4,
+ 0xDD3B,0xDC19,0xDC18,0xDDB3,0xDFAA,0xDCBE,0xDDAC,0xDE25,0xDE66,0xDE6B,
+ 0xDD43,0xDDB5,0xDEEC,0xDC76, 0,0xDE14,0xDDDC,0xDF1C,0xDF1D,0xDCD0,
+ 0xDE12,0xDEF3,0xDE69, 0,0xDE11,
+ /* plane 5, row 2 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0x34DE,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0x3543,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD844,0xD844,0xD845,0xD845,0xD846,0xD846,0xD847,0xD847,0x37AC,0x37AA,
+ 0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0x5E07,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0x5FCB,0x38FE,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD87E,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84C,0xD84C,0xD84C,0xD84E,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD853,0xD854,0xD855,
+ 1, /* first low-surrogate */
+ 0xDE15,0xDE10,0xDE13,0xDCA4,0xDCA5,0xDDD0,0xDDBA,0xDDCB,0xDD7B,
+ 0xDE86,0xDEBB,0xDEBA,0xDEC3,0xDEB9,0xDEC0, 0,0xDC39,0xDC3B,0xDC41,
+ 0xDCD1,0xDCCF,0xDCD2,0xDD2E,0xDD6E,0xDD8C,0xDD88,0xDE35, 0,0xDE3A,
+ 0xDE3B,0xDE38,0xDE39,0xDF2E,0xDF2C,0xDFC8,0xDFB5,0xDFAD,0xDFB0,0xDFAB,
+ 0xDDB3,0xDDA9,0xDEBB,0xDEB9,0xDF5A,0xDFCD,0xDC2B,0xDD05, 0, 0,
+ 0xDD51,0xDD4B,0xDFEA,0xDFED,0xDC36,0xDC62,0xDC56,0xDC55,0xDC64,0xDC58,
+ 0,0xDDDA,0xDDD8,0xDFAD,0xDFAB,0xDCC0,0xDCC3,0xDDB3,0xDDB7,0xDDBA,
+ 0, 0,0xDDC7,0xDDB5,0xDD8E,0xDE73,0xDE6C,0xDE74,0xDCB4,0xDE72,
+ 0xDE71,0xDE82,0xDE70,0xDD3F,0xDFBA,0xDFB8,0xDDB7,0xDF23,0xDF21,0xDF2B,
+ 0xDF26,0xDF22,0xDD25,0xDCE4,0xDC15,
+ /* plane 5, row 3 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85E,0xD85E,0xD85F,
+ 0xD861,0xD861,0xD861,0xD861,0xD863,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0x3441,0xD841,0xD841,0x34B4,0xD841,0xD841,0xD841,0xD841,0xD842,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,
+ 0xD842,0xD842,0xD842,0xffff,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD843,0xD842,0xD842,0xD843,0xD842,
+ 0xD842,0xD844,0xD844,0xD844,0xD844,0xD844,0xD87E,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD851,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,
+ 0x37B3,0xD847,0xD847,0xD847,0x37B4,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD848,0xD848,0xD848,
+ 1, /* first low-surrogate */
+ 0xDCE4,0xDE33,0xDE2A,0xDE32,0xDE29,0xDEFB,0xDD5B,0xDD5C,0xDC28,
+ 0xDE6F,0xDE6D,0xDE6B,0xDE6E,0xDE16,0xDC22,0xDD16,0xDD48,0xDDD8,0xDE00,
+ 0,0xDC80,0xDCE4, 0,0xDCE7,0xDD0C,0xDD53,0xDDB7,0xDEE8,0xDED1,
+ 0xDEE5,0xDED8,0xDED6,0xDEDA,0xDED9,0xDED5,0xDEE6,0xDED4,0xDED3,0xDC44,
+ 0xDCD6,0xDCD7,0xDD13, 0,0xDD70,0xDD92,0xDDDB,0xDDDA,0xDE41,0xDE43,
+ 0xDF33,0xDFF6,0xDFD4,0xDFDD,0xDFD0,0xDC04,0xDFD9,0xDFDB,0xDC05,0xDFD3,
+ 0xDFE1,0xDE80,0xDE77,0xDE81,0xDE82,0xDE83,0xDC5C,0xDD61,0xDD60,0xDED8,
+ 0xDED6,0xDED7,0xDE05,0xDD4D,0xDD48,0xDFD6,0xDFCF,0xDFD9,0xDFD8,0xDC3D,
+ 0,0xDD54,0xDD5B,0xDD5C, 0,0xDD59,0xDD58,0xDD5A,0xDD55,0xDD56,
+ 0xDD82,0xDFF0,0xDC1C,0xDC6A,0xDC69,
+ /* plane 5, row 4 */
+ 1 | (94 << 8), /* first, last */
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD87E,0xD849,0xD849,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84E,
+ 0x3C1D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x3C7C,0xD84E,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,0x3F55,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD855,0xD855,0x4126,0xD856,
+ 0xD856,0xD857,0xD859,0xD859,0xD85A,0xD85C,0xD85D,0xD85E,0xD861,0xD861,
+ 0xD861,0x49BC,0xD863,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDC71,0xDC67,0xDC6C,0xDC6E,0xDC79,0xDD8B,0xDDB8,0xDDE7,0xDDE8,
+ 0xDDE4,0xDDE6,0xDDE5,0xDDF0,0xDF83,0xDFB7,0xDFBB,0xDFB9,0xDFC5,0xDC53,
+ 0xDCC4,0xDCC6,0xDCCB,0xDDC8,0xDC9F,0xDDC9,0xDDDB,0xDD94,0xDE95,0xDE88,
+ 0xDE8D,0xDEEC,0xDEEE,0xDEF1,0xDD2E,0xDD49,0xDF5F,0xDFD1,0xDFCB,0xDC85,
+ 0,0xDD4A,0xDD47,0xDD4B,0xDDBB,0xDDC4, 0,0xDF02,0xDC82,0xDC91,
+ 0xDC8F,0xDC92,0xDD8F,0xDD91,0xDDB4,0xDD92,0xDCF4,0xDDAA,0xDF35,0xDF37,
+ 0xDF3D,0xDF3C,0xDF2F,0xDF30,0xDCF8,0xDCEF,0xDF26, 0,0xDD26,0xDD27,
+ 0xDF41,0xDFC6,0xDFC7,0xDCEB,0xDCE8,0xDCEA,0xDC1A,0xDC19, 0,0xDD23,
+ 0xDD24,0xDE25,0xDE35,0xDE34,0xDE07,0xDE1D,0xDFE1,0xDFAB,0xDC60,0xDE77,
+ 0xDE7D, 0,0xDE1E,0xDE1A,0xDE1D,
+ /* plane 5, row 5 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD840,0xD840,0xD840,0x344A,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0x344E,0xD841,0xD841,0x34C9,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0x52B7,0x52B8,0xD842,0x52B6,0x52BA,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0x357B,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0x3620,0xD844,0xD844,0xD844,0xD844,0x3689,0x3695,0xD845,0xD845,
+ 0xD845,0x36BE,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0x37C3,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,
+ 1, /* first low-surrogate */
+ 0xDC6B,0xDD2D,0xDD4C,0xDE2A, 0,0xDE15,0xDE2C,0xDE06,0xDE08,
+ 0xDE0A, 0,0xDD56,0xDD84, 0,0xDDC6,0xDEF5,0xDF09,0xDEF8,0xDEE8,
+ 0xDEFB,0xDEE9,0xDEF6, 0, 0,0xDC52, 0, 0,0xDC54,0xDC51,
+ 0xDD39,0xDD3A,0xDD98,0xDE4E, 0,0xDC36,0xDC0C,0xDC10,0xDC32,0xDC11,
+ 0xDC18,0xDC1C,0xDC1A,0xDC19,0xDC0B,0xDC0F,0xDC1D,0xDC21,0xDC13,0xDC1B,
+ 0xDC15, 0,0xDDD1,0xDDC8,0xDE8D,0xDEB5, 0, 0,0xDDF8,0xDEE0,
+ 0xDEE1, 0,0xDEDE,0xDEFE,0xDEDC,0xDF01,0xDEFD,0xDF00,0xDDD7,0xDDD6,
+ 0xDDD9,0xDF65,0xDFD2,0xDFDC,0xDFE1,0xDFDE,0xDC42,0xDC4B, 0,0xDD8E,
+ 0xDD91,0xDD8B,0xDD90,0xDD88,0xDD89,0xDD84,0xDDAA,0xDC8D,0xDC8F,0xDC7D,
+ 0xDC7F,0xDC7B,0xDC80,0xDC7E,0xDC83,
+ /* plane 5, row 6 */
+ 1 | (94 << 8), /* first, last */
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0x3877,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0x39D4,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84E,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD87E,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0x3B4C,
+ 0xD84C,0xD84C,0xD84C,0xD84D,0x3C20,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x3C5B,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD851,0x3E2D,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,
+ 1, /* first low-surrogate */
+ 0xDC81,0xDC86,0xDC8A,0xDDBD,0xDDBE, 0,0xDDF4,0xDDF3,0xDE02,
+ 0xDDF6,0xDDF5,0xDDF2,0xDE04,0xDF3D,0xDFC6,0xDC89,0xDCD4,0xDCD6,0xDCD2,
+ 0xDDFA,0xDE06,0xDE0C,0xDE0A,0xDE0F,0xDE2F, 0,0xDEB7,0xDEBE,0xDEBC,
+ 0xDEE2,0xDF06,0xDEF7,0xDF07,0xDEF6,0xDF35,0xDD5F,0xDD65,0xDD64,0xDD61,
+ 0xDD5A,0xDD5D,0xDCD7,0xDFD7,0xDFD5,0xDFDE,0xDFE1,0xDFE0,0xDFD9, 0,
+ 0xDFDA,0xDFDF,0xDFF6,0xDC03, 0,0xDC93,0xDC8B,0xDC91,0xDC92,0xDC8A,
+ 0xDC89,0xDC8F,0xDD56,0xDD59,0xDDCA,0xDDCC, 0,0xDDD0,0xDDCD,0xDDD6,
+ 0xDDCB,0xDE83,0xDE82,0xDF06,0xDF2A,0xDF2C,0xDF2B,0xDF29,0xDCBD,0xDCB3,
+ 0xDCBE,0xDCC0,0xDCB5,0xDCB6,0xDD9D,0xDD9F,0xDE20, 0,0xDE1E,0xDE1C,
+ 0xDE32,0xDE1F,0xDE2B,0xDE21,0xDE26,
+ /* plane 5, row 7 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0x3E63,0xD851,0xD852,0xD852,0x3F18,0xD852,
+ 0xD852,0xD853,0xD853,0x3F74,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD855,0x4128,0xD855,
+ 0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,
+ 0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0x43DA,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,0x44A4,0xD85A,0xD85D,
+ 0xD85D,0xD85E,0xD861,0x488E,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,
+ 1, /* first low-surrogate */
+ 0xDE24,0xDE1D,0xDE27,0xDF5B,0xDF59,0xDF80,0xDF55,0xDF50,0xDF5A,
+ 0xDF56,0xDF63,0xDF52,0xDF58, 0,0xDF39,0xDCF9,0xDF28, 0,0xDFBC,
+ 0xDFD6,0xDC05,0xDC20, 0,0xDD33,0xDF46,0xDF42,0xDF43,0xDF47,0xDFCB,
+ 0xDC42,0xDC45,0xDCFD,0xDCF4,0xDCF9,0xDCFA,0xDF5E,0xDC1D, 0,0xDF58,
+ 0xDF55,0xDE57,0xDE58,0xDED9,0xDEDC,0xDEDB,0xDE27,0xDF85,0xDF87,0xDF8A,
+ 0xDE8B,0xDF4F,0xDD30,0xDD2F,0xDE68,0xDE49, 0,0xDE48,0xDE3F,0xDE4B,
+ 0xDE5C,0xDE46,0xDE40,0xDE0D,0xDF1B,0xDF1D,0xDF17, 0,0xDF22,0xDDA7,
+ 0xDE08,0xDC06,0xDC7D, 0,0xDC63,0xDC64,0xDC7F,0xDC6B,0xDC7C,0xDC68,
+ 0xDC65,0xDC6A,0xDE98,0xDE99,0xDEAE,0xDE2B,0xDE2D,0xDE31,0xDE2E,0xDE2F,
+ 0xDC6D,0xDD31,0xDE2D,0xDE39,0xDE38,
+ /* plane 5, row 8 */
+ 1 | (94 << 8), /* first, last */
+ 0x345B,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD84E,0xD842,0xD842,0xD842,0xD842,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,0x3753,0xD846,
+ 0xD846,0xD846,0xD846,0xD87E,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD848,0xD848,0xD848,
+ 2, /* first low-surrogate */
+ 0xDE3A,0xDE35,0xDE62,0xDCEA,0xDCEB,0xDD15,0xDDCC,0xDDC8,
+ 0xDDCD,0xDDDB,0xDDCB,0xDF11,0xDF26,0xDC62,0xDC5E,0xDC61,0xDD41,0xDD3F,
+ 0xDD75,0xDD65,0xDF49,0xDDEB,0xDE1A,0xDE57,0xDC6B,0xDCA9,0xDC54,0xDC62,
+ 0xDCAA,0xDC58,0xDC72,0xDC63,0xDC73,0xDC8B,0xDC8C,0xDC5C,0xDC51,0xDC16,
+ 0xDC60,0xDC61,0xDC5E,0xDC5D,0xDC64,0xDC53,0xDC5F,0xDC5B,0xDC6E,0xDC55,
+ 0xDC52,0xDC68,0xDDD2,0xDDD6,0xDDD3,0xDEB8,0xDEBB,0xDEEB,0xDEE8,0xDEB6,
+ 0xDEEA,0xDEE7,0xDEE9,0xDD91,0xDE10,0xDE0E,0xDE0F,0xDF0B,0xDF03,0xDF2B,
+ 0xDF09,0xDF28,0xDF2C,0xDF25,0xDF27,0xDF0F,0xDDE9,0xDDEC, 0,0xDF27,
+ 0xDF73,0xDFE2,0xDFE6,0xDC76,0xDC61,0xDC51,0xDD12,0xDD0E,0xDDAD,0xDDAF,
+ 0xDDB1,0xDDD3,0xDC94,0xDC92,0xDC90,
+ /* plane 5, row 9 */
+ 1 | (94 << 8), /* first, last */
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0x3880,0xD87E,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD849,0xD849,0x38DD,0xD849,0xD849,0xD849,0x38DE,
+ 0xD849,0x3922,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0x6306,0xD84A,0xD84A,
+ 0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0x3ADB,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0x6B85,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0x3CDA,0x3CDB,0xD84F,0xD84F,
+ 1, /* first low-surrogate */
+ 0xDC9D,0xDC93,0xDC95,0xDC98,0xDC97, 0,0xDC8A,0xDE07,0xDE0B,
+ 0xDE08,0xDFD9,0xDFD5,0xDCD7,0xDCDF, 0,0xDCDE,0xDCE3,0xDCE2, 0,
+ 0xDE47, 0,0xDE3D,0xDE38,0xDE44,0xDE3A,0xDEB8,0xDF2A,0xDF00,0xDEF3,
+ 0xDEF2,0xDEEB,0xDEFA,0xDEED,0xDEEC,0xDEFF,0xDEFB, 0,0xDF4E,0xDEEF,
+ 0xDEF7,0xDF10,0xDF11,0xDF0C,0xDF0B,0xDCDD,0xDD30, 0,0xDD7A,0xDD77,
+ 0xDF28,0xDF27,0xDF65,0xDC0E,0xDC0B,0xDC41,0xDC13,0xDC0F,0xDC12,0xDC30,
+ 0xDCA0,0xDCA3,0xDC9E,0xDC97,0xDCA1,0xDC9D,0xDC9B,0xDD63,0xDDE3,0xDDE4,
+ 0xDDE6,0xDDE7,0xDDDD, 0,0xDDEC,0xDDE5,0xDDF1,0xDF3B,0xDF39,0xDF3A,
+ 0xDF3C,0xDF3D,0xDF47,0xDF3F,0xDF44,0xDC48,0xDC49,0xDC60,0xDCE3,0xDCE9,
+ 0xDCF0, 0, 0,0xDCF2,0xDCED,
+ /* plane 5, row 10 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84F,0xD84F,0xD84F,0x3CD7,0xD850,0xD850,0xD850,0xD850,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0x401A,0xD854,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,
+ 1, /* first low-surrogate */
+ 0xDCEC,0xDCE6,0xDD16, 0,0xDDBC,0xDDBE,0xDDC0,0xDDE0,0xDD00,
+ 0xDD02,0xDCFE,0xDD5E,0xDDB3,0xDDB7,0xDE3A,0xDE39,0xDE3E,0xDE38,0xDE3D,
+ 0xDE4F,0xDF6E,0xDF5F,0xDF81,0xDF82,0xDF71,0xDF7B,0xDF79,0xDF77,0xDF73,
+ 0xDF6F,0xDF97,0xDF7E,0xDCFC,0xDD11,0xDD32,0xDD31,0xDD10,0xDEEC,0xDEEB,
+ 0xDF2C,0xDF2D,0xDFDA,0xDC2E,0xDC2C,0xDC2A,0xDC33,0xDC4B,0xDD18,0xDD42,
+ 0xDD3B,0xDD3F,0xDD41,0xDD43,0xDD3C,0xDF4C,0xDF4A,0xDF49,0xDF56,0xDFCF,
+ 0xDC47,0xDC48,0xDC46,0xDD1B,0xDD11,0xDD14,0xDD1D,0xDD17,0xDD1E,0xDD0B,
+ 0xDD1C,0xDD12,0xDD16,0xDD0D,0xDD15,0xDD13,0xDD18, 0,0xDFAC,0xDC44,
+ 0xDC2C,0xDC45,0xDF66,0xDF6E,0xDF65,0xDF68,0xDF84,0xDD38,0xDD3B,0xDD3A,
+ 0xDD3F,0xDEDF,0xDEDD,0xDEDE,0xDEE2,
+ /* plane 5, row 11 */
+ 1 | (94 << 8), /* first, last */
+ 0x41D6,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,
+ 0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0x43DE,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0x43E5,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x4672,
+ 0xD85E,0x46AF,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD863,0xD863,0xD863,0xD863,0x49C4,0xD863,
+ 0xD863,0xD840,0xD840,0xD840,0xD840,0xD840,0x3463,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0x34EC,0xD841,0xD841,
+ 2, /* first low-surrogate */
+ 0xDE2C,0xDE2F,0xDF8F,0xDF90,0xDF8C,0xDF93,0xDE25,0xDE88,
+ 0xDEA7,0xDFF7,0xDCBB,0xDD38,0xDD39,0xDD37,0xDE14,0xDE6E,0xDE7B, 0,
+ 0xDE6C,0xDE7F,0xDE78,0xDE7A,0xDE6F, 0,0xDCFE,0xDF48,0xDF4B,0xDF41,
+ 0xDF49,0xDF3B,0xDE2D,0xDDE3,0xDE1A,0xDE0D,0xDE13,0xDE11,0xDE1C, 0,
+ 0xDCB5, 0,0xDC29,0xDCA1,0xDD24,0xDFBB,0xDEA1,0xDC83,0xDC8D,0xDC87,
+ 0xDC85,0xDC8A,0xDCA3,0xDC89,0xDC84,0xDCA2,0xDEB1,0xDEB0,0xDEAF,0xDEB6,
+ 0xDEC9,0xDECA,0xDEC8,0xDEB4,0xDC59,0xDCC9,0xDE41,0xDE4C, 0,0xDE45,
+ 0xDE5A,0xDCB9,0xDE94,0xDE6E,0xDEA2,0xDE67, 0,0xDEA3,0xDE76,0xDE6C,
+ 0xDE64,0xDEA5,0xDE30,0xDEA6,0xDE69,0xDEA4,0xDC90,0xDD5F,0xDD60,0xDDDA,
+ 0xDDD8,0xDDDD, 0,0xDF59,0xDF5B,
+ /* plane 5, row 12 */
+ 1 | (94 << 8), /* first, last */
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0x3598,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,
+ 0xD840,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,
+ 0xD846,0xD848,0x3758,0xD846,0xD846,
+ 1, /* first low-surrogate */
+ 0xDF5A,0xDF39,0xDF34,0xDF44,0xDF33,0xDF3C,0xDF58,0xDF6A,0xDC6F,
+ 0xDC72,0xDC70,0xDC71,0xDC6E,0xDCF0,0xDCEB,0xDD49,0xDD4C,0xDDF5,0xDE20,
+ 0xDE6A,0xDE72,0xDF4B,0xDF5D,0xDC50,0xDCF9,0xDCFA,0xDCFB,0xDD23,0xDCB7,
+ 0xDD22,0xDCB5,0xDCC4,0xDCB4,0xDCEF, 0,0xDCCD,0xDCF0,0xDCB8,0xDCCB,
+ 0xDCF1,0xDCBA,0xDD03,0xDCF8,0xDCB6,0xDCBC,0xDCB3,0xDD21,0xDCF7,0xDCC2,
+ 0xDCBE,0xDCC9,0xDCBD,0xDCCE,0xDCB9,0xDCC7,0xDCCA,0xDCCC,0xDD26,0xDDE4,
+ 0xDDE0,0xDDF0,0xDEEC,0xDF24,0xDF18,0xDF2F,0xDF25,0xDD28,0xDD22,0xDD6A,
+ 0xDD57,0xDD94,0xDD92,0xDD9C,0xDE22,0xDE30,0xDE1D,0xDE23,0xDF35,0xDF33,
+ 0xDF2F,0xDF4D,0xDF31,0xDF5B,0xDF5A,0xDF32,0xDF5C,0xDF59,0xDF5D,0xDD69,
+ 0xDD6D,0xDE32, 0,0xDE0A,0xDE20,
+ /* plane 5, row 13 */
+ 1 | (94 << 8), /* first, last */
+ 0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0x37D3,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0x38E2,
+ 0xD87E,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0x3954,0xD849,0xD849,0x392F,0xD849,
+ 0xD849,0x39B6,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 1, /* first low-surrogate */
+ 0xDE1F,0xDE0D,0xDFE8,0xDFEC,0xDC77,0xDC70,0xDC71,0xDDF8,0xDDD6,
+ 0xDDD9,0xDDDE,0xDDD5,0xDDE1, 0,0xDDE2,0xDDDD,0xDDE0,0xDE0E,0xDE08,
+ 0xDDDC,0xDE0A,0xDE0C,0xDCB4,0xDCB1,0xDCB6,0xDCBC,0xDE1D,0xDE24,0xDE19,
+ 0xDE1B,0xDE22,0xDE1A,0xDE1C,0xDE21,0xDFE6,0xDFE4,0xDFE7,0xDFEA, 0,
+ 0xDC9B,0xDCF0,0xDCF5,0xDCEF,0xDE42,0xDE6E,0xDE3C,0xDE97,0xDE8C,0xDE81,
+ 0xDE71,0xDECE,0xDEBA,0xDE7A,0xDE7E, 0,0xDE72,0xDEBB, 0,0xDE73,
+ 0xDE82, 0,0xDDBA,0xDDB8,0xDE4B,0xDE48,0xDF2B,0xDEF4,0xDF2C,0xDF42,
+ 0xDF48,0xDF44,0xDF45,0xDF3C,0xDF37,0xDF33,0xDF41,0xDF32,0xDF87,0xDF27,
+ 0xDF23,0xDF2D,0xDF1F,0xDF2C,0xDF28,0xDC75,0xDC74,0xDCE7,0xDD32,0xDD31,
+ 0xDD99,0xDD96,0xDD98,0xDD9D,0xDD92,
+ /* plane 5, row 14 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84C,0xD84C,0xD84C,0xD859,0x3B35,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0x3B5D,0xD84D,0xD84E,0x3C29,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,
+ 0xD851,0x3E1F,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0x3E72,0xD851,0xD851,0xD851,0xD851,0xD852,0x3F0B,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD848,0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDD94,0xDD95,0xDD97,0xDEB9, 0,0xDC11,0xDC3B,0xDC79,0xDC42,
+ 0xDC43, 0,0xDC78,0xDCAC, 0,0xDCB1,0xDCB4,0xDCB3,0xDCAF,0xDCAA,
+ 0xDCB2,0xDD68,0xDDF2,0xDDFE,0xDDF8,0xDDF9,0xDDFF,0xDDF5,0xDDF7,0xDDFD,
+ 0xDE00,0xDE88,0xDF6E,0xDF5D,0xDF63,0xDF60,0xDC61,0xDD37,0xDD71,0xDD23,
+ 0xDD22,0xDD1F,0xDD25,0xDDFD,0xDE11,0xDE23,0xDDF0,0xDDEF,0xDD0E,0xDD0C,
+ 0xDDBA, 0,0xDE52,0xDE55,0xDE53,0xDE54,0xDE51,0xDE58,0xDFB0,0xDF9F,
+ 0,0xDFA1,0xDF9A,0xDFBE,0xDFA0,0xDD37, 0,0xDEF1,0xDEF2,0xDF34,
+ 0xDF37,0xDF35,0xDF8C,0xDFDF,0xDC4C,0xDC4E,0xDC64,0xDC63,0xDC36,0xDD58,
+ 0xDD68,0xDD5B,0xDD5F,0xDD59,0xDD65,0xDD60,0xDD5E,0xDFD5,0xDFD6,0xDC4E,
+ 0xDC52,0xDD35,0xDD39,0xDD58,0xDD41,
+ /* plane 5, row 15 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD87E,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0x40A2,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,
+ 0xD84B,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0x43EC,0xD859,0xD859,
+ 0xD859,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDD57,0xDD38,0xDD3D,0xDD32,0xDD44,0xDD44,0xDF63,0xDF62,0xDFB8,
+ 0xDFB0,0xDFB1,0xDC4D,0xDC63,0xDC70,0xDC4B,0xDC4F,0xDC4E,0xDC53,0xDC47,
+ 0,0xDC54,0xDC52,0xDC59,0xDC7E,0xDE2B,0xDE2E,0xDF7F,0xDF7E,0xDF81,
+ 0xDF83,0xDD47,0xDD54,0xDD4D,0xDD4C,0xDD4B,0xDD57,0xDE65,0xDE64,0xDE61,
+ 0xDE62,0xDEF0,0xDEF3,0xDEF9,0xDEF4,0xDEF5,0xDEEF,0xDEF8,0xDEFC,0xDEF7,
+ 0xDEFD,0xDF17,0xDE34,0xDE36,0xDE38,0xDFAF,0xDFAE,0xDFAC,0xDFA2,0xDE28,
+ 0xDEC2,0xDE9C,0xDEB3,0xDE90,0xDC06,0xDC04,0xDC0B,0xDC05,0xDD40,0xDD4F,
+ 0xDEAB,0xDE9D,0xDEB8,0xDEB2,0xDED2,0xDECF,0xDEA2, 0,0xDEA5,0xDEA9,
+ 0xDEA7,0xDED0,0xDD02,0xDDCF,0xDDD0,0xDE16,0xDE19,0xDF75,0xDF71,0xDF91,
+ 0xDF72,0xDF8E,0xDF6D,0xDF88,0xDF73,
+ /* plane 5, row 16 */
+ 1 | (94 << 8), /* first, last */
+ 0x44BB,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0x4621,0xD85D,0xD85D,0xD85D,0x461F,
+ 0xD87E,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0x8C38,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0x4791,0x4796,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,
+ 0xD860,0xD860,0xD860,0x8ECE,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD864,0xD865,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,
+ 2, /* first low-surrogate */
+ 0xDF81,0xDF76,0xDF7B,0xDF7F,0xDF90,0xDF78,0xDE4B,0xDE48,
+ 0xDE5B,0xDE51,0xDE3D,0xDE40,0xDE46,0xDE4D,0xDE3B,0xDE4A,0xDE41,0xDE3E,
+ 0xDE4E,0xDDAC,0xDDE6,0xDDE9,0xDE29, 0,0xDE33,0xDE2E,0xDE1E, 0,
+ 0xDDC5,0xDE22,0xDE27,0xDFE7,0xDC0B,0xDD66,0xDFAD,0xDFAE, 0,0xDC2B,
+ 0xDC2A,0xDD2C,0xDD2D, 0, 0,0xDE8F,0xDE93,0xDFC6,0xDFC5,0xDE15,
+ 0xDE13,0xDEB1,0xDEA9, 0,0xDCA8,0xDCAB,0xDCBE,0xDCAC,0xDCA9,0xDCA6,
+ 0xDCC1,0xDECC,0xDED1,0xDED3,0xDEE4,0xDECB,0xDEE1,0xDED2,0xDEE3,0xDECF,
+ 0xDED0,0xDEE5,0xDF0E,0xDCCC,0xDCCA,0xDCCB,0xDE5C,0xDE61,0xDE5D,0xDE59,
+ 0xDC77,0xDE84,0xDC41,0xDCFD,0xDD1A,0xDD63,0xDEB6,0xDEB2,0xDEE9,0xDEE7,
+ 0xDED6,0xDF30,0xDEEC,0xDEDD,0xDEE8,
+ /* plane 5, row 17 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD840,0xD840,0xD841,0xD841,0x34BC,0xD841,0xD841,0x34D8,
+ 0xD841,0xD841,0x34F4,0xD842,0xD842,0xD842,0xD842,0xD87E,0xD842,0xD842,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD851,0xD845,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0x3785,0xD846,0x3783,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,
+ 1, /* first low-surrogate */
+ 0xDEB0,0xDEB5,0xDEE1,0xDC98,0xDC99, 0,0xDD93,0xDDE5, 0,
+ 0xDF60,0xDF5E, 0,0xDC7B,0xDCF1,0xDCF3,0xDE7F,0xDC38,0xDF57,0xDF58,
+ 0xDD39,0xDDA7,0xDD35,0xDD60,0xDD51,0xDD62,0xDD42,0xDD3C,0xDD43,0xDDAB,
+ 0xDDA9,0xDDB4,0xDD79,0xDD6A,0xDD3B,0xDDAA,0xDD33,0xDD37,0xDD27,0xDDA8,
+ 0xDD70,0xDD2F,0xDD36,0xDDB5,0xDD30,0xDD3A,0xDD38,0xDDB1,0xDDAC,0xDD2E,
+ 0xDD75,0xDDB0,0xDDF7,0xDE00,0xDDF1,0xDDF3,0xDF60,0xDF61,0xDF32,0xDF2D,
+ 0xDF4A,0xDF2A,0xDD67,0xDDA2,0xDDA3,0xDD9E,0xDDA4,0xDE44,0xDE32,0xDF9B,
+ 0xDF98,0xDF99,0xDF9A,0xDF66,0xDF62,0xDF6B,0xDD62,0xDF67,0xDE3B,0xDE23,
+ 0xDE29,0xDF7E,0xDFF3, 0,0xDFF5, 0,0xDC80,0xDC7E,0xDC7C,0xDC7F,
+ 0xDC7D,0xDC81,0xDE25,0xDE29,0xDE17,
+ /* plane 5, row 18 */
+ 1 | (94 << 8), /* first, last */
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0x38BA,0xD848,
+ 0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0x3969,0xD849,0xD849,0x3945,
+ 0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0x3B6C,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD87E,
+ 1, /* first low-surrogate */
+ 0xDE63,0xDE67,0xDE65,0xDE2A,0xDE68,0xDE26,0xDE64,0xDE1B,0xDE62,
+ 0xDE69,0xDFFE,0xDC44,0xDC42,0xDCB7,0xDCD2,0xDCD4,0xDCD7,0xDCDC,0xDCD1,
+ 0xDCD5,0xDCCD,0xDCD8,0xDD9A,0xDE42,0xDE35,0xDE58,0xDE34,0xDE3C,0xDE3B,
+ 0xDE3E,0xDE3D,0xDE5A,0xDE41,0xDE38,0xDE45,0xDE33,0xDF26, 0,0xDFF7,
+ 0xDFEF,0xDFF0,0xDFEE,0xDC9D,0xDD06,0xDD11,0xDD08,0xDD02,0xDD0A,0xDD07,
+ 0xDE91,0xDE8E,0xDE85,0xDEE8,0xDF17,0xDED4, 0,0xDEC4,0xDED5, 0,
+ 0xDED8,0xDE80,0xDEDE,0xDF42,0xDDC7,0xDDBF,0xDF8D,0xDF89,0xDF90,0xDF9A,
+ 0xDFC8,0xDF92,0xDFA1,0xDF84,0xDF57,0xDF47,0xDF77,0xDF3A,0xDF50,0xDF42,
+ 0xDF43,0xDFA3,0xDC77,0xDDB2,0xDDE2,0xDDBD,0xDF74,0xDC82,0xDCB8, 0,
+ 0xDCBA,0xDCB9,0xDCBB,0xDC87,0xDCE4,
+ /* plane 5, row 19 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84D,0xD84D,0xD840,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x3D04,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0x3E3A,0xD851,0xD851,0xD851,0x3E79,
+ 0xD851,0xD851,0x7309,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0x3F5D,0xD87E,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0x3F8A,0xD853,0xD853,
+ 0xD853,0xD87E,0xD854,0xD854,0xD854,0xD854,0x4027,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDC83,0xDCB7,0xDC43,0xDCCE,0xDCBA,0xDD73,0xDE09,0xDE0A,0xDE0B,
+ 0xDE07,0xDE05,0xDE0E,0xDE97,0xDF77,0xDF7B,0xDF7A,0xDF74,0xDF79,0xDD86,
+ 0xDDF5,0xDDA5,0xDD9D,0xDDBE,0xDD96,0xDDE1,0xDDA4,0xDDA1,0xDDF6, 0,
+ 0xDD8D,0xDD8B,0xDD78,0xDD98,0xDE0A,0xDE5D,0xDE27,0xDE5F,0xDDC0,0xDDC1,
+ 0xDE6D,0xDE5E,0xDE8A,0xDE62,0xDE64, 0,0xDFC0,0xDFCA,0xDFD1, 0,
+ 0xDFC7,0xDFCE, 0,0xDFC5,0xDD36,0xDD57,0xDD77,0xDEF6,0xDEF7,0xDF55,
+ 0xDF44,0xDF3E,0xDF42,0xDF52,0xDFE1,0xDC08,0xDC68,0xDC67, 0,0xDD37,
+ 0xDD7E,0xDD93,0xDD79,0xDD81,0xDD7D,0xDD7B,0xDD94, 0,0xDF66,0xDFD9,
+ 0xDFE0,0xDD3E,0xDC5F,0xDD5F,0xDD5E,0xDD68, 0,0xDD88,0xDD6A,0xDD6C,
+ 0xDD66,0xDD67,0xDD89,0xDD60,0xDD85,
+ /* plane 5, row 20 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0x4146,0x4140,0xD855,0x413F,0xD855,0xD855,
+ 0xD855,0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,0x419D,0x41CB,0xD856,
+ 0x41E1,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x427F,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0x4346,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD859,0xD859,0xD859,0xD859,0x441A,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDF2A,0xDF68,0xDFB9,0xDFBA,0xDFBE,0xDC6F,0xDC80,0xDC74,0xDC81,
+ 0xDC7A,0xDC9C,0xDC73,0xDC82,0xDC7F,0xDCA7,0xDC79,0xDC78,0xDC7D,0xDCA8,
+ 0xDC7C,0xDE68,0xDE4E,0xDF9E, 0, 0,0xDF98, 0,0xDF85,0xDF9C,
+ 0xDFC5,0xDF9A,0xDD68,0xDD65,0xDD67,0xDD61,0xDD60, 0, 0,0xDE7B,
+ 0,0xDF19,0xDF0E,0xDF31,0xDF12,0xDF10,0xDF15,0xDF3F,0xDF1D,0xDF1E,
+ 0xDE4D,0xDE48,0xDE45,0xDE42,0xDE49,0xDE4A,0xDE47, 0,0xDE4C,0xDFCD,
+ 0xDFD5,0xDFC4,0xDFCA,0xDFC3, 0,0xDE29,0xDEB4,0xDF6D,0xDF66,0xDF6A,
+ 0xDC15,0xDCD3,0xDCEC,0xDD55, 0,0xDED6,0xDED8,0xDF51,0xDEE0,0xDF03,
+ 0xDF04,0xDEDA,0xDEEA,0xDF02,0xDED3,0xDEE4,0xDEE5,0xDD3B,0xDD66,0xDE2C,
+ 0xDE21,0xDE26,0xDED4,0xDED5,0xDED9,
+ /* plane 5, row 21 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD85A,0xD85A,0x44D3,0xD85B,0xD85A,0xD85A,0xD85B,0xD85A,
+ 0x44D0,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85C,0x458E,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0x46C3,0x46B6,0xD85E,0xD85E,0xD85E,0x8A2F,
+ 0xD85E,0x46C0,0x46B8,0xD848,0xD849,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0x47D9,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,
+ 1, /* first low-surrogate */
+ 0xDFD5,0xDFEB,0xDFC5, 0,0xDC27,0xDFF0,0xDFB9,0xDC18,0xDFEE,
+ 0,0xDFB7,0xDFBB,0xDFEF,0xDFB8,0xDFDF,0xDFDA,0xDFE3,0xDFC9,0xDFEC,
+ 0xDDA4, 0,0xDDA3,0xDE5E,0xDE61,0xDE62,0xDE63,0xDE8E,0xDE69,0xDE6B,
+ 0xDE85,0xDE8D,0xDE64,0xDE6D,0xDE4C,0xDE49,0xDE47,0xDE48,0xDE42,0xDE45,
+ 0xDE5B,0xDE5D,0xDE46,0xDC13,0xDC1A,0xDC0E,0xDC0F,0xDC1B,0xDC12,0xDCC3,
+ 0xDCBE,0xDCBD,0xDD79,0xDD7C, 0, 0,0xDD80,0xDD75,0xDD9B, 0,
+ 0xDD74, 0, 0,0xDC41,0xDC94,0xDC30,0xDCA7,0xDCA5,0xDCA4,0xDD3A,
+ 0xDE5B,0xDE9F,0xDEA8,0xDEB3,0xDEA1,0xDEA7,0xDEB2,0xDE9D,0xDEA3,0xDEA2,
+ 0xDFEF,0xDFD9, 0,0xDFD5,0xDFDD,0xDFDA,0xDFEE,0xDFD7,0xDE1A,0xDE19,
+ 0xDE18,0xDEB3,0xDEBF,0xDEBB,0xDEC0,
+ /* plane 5, row 22 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0x48EC,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD866,0xD866,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD840,0xD841,0xD841,
+ 0xD842,0xD842,0xD842,0xD842,0x52DC,0xD842,0xD842,0xD842,0x35CC,0xD843,
+ 0x35A2,0xD843,0xD843,0xD843,0xD843,0xD843,0x35B6,0xD843,0xD843,0x35C5,
+ 0x35C6,0xD843,0xD843,0xD843,0xD843,
+ 1, /* first low-surrogate */
+ 0xDEB9,0xDEB8,0xDED5,0xDC11,0xDC10,0xDCC3,0xDCC2,0xDCE9,0xDCCD,
+ 0xDCE5,0xDCCA,0xDCC7,0xDCE8,0xDEF1,0xDF0C,0xDEEF,0xDEEE,0xDEF3,0xDF0D,
+ 0xDEF6,0xDEF0, 0,0xDFF5,0xDFF4,0xDFF8,0xDFFE,0xDD11,0xDD22,0xDD42,
+ 0xDC5C,0xDC5A,0xDC5D,0xDCD1,0xDCD0,0xDE75,0xDE7B,0xDF89,0xDC4D,0xDE89,
+ 0xDE92,0xDE8C,0xDE88,0xDC67,0xDC68,0xDF21,0xDEF2,0xDF09,0xDEF8,0xDEF0,
+ 0xDEF3,0xDEF5,0xDEFB,0xDEF7,0xDEEF,0xDF0B,0xDCA2,0xDDF5,0xDDF3,0xDDF4,
+ 0xDDF2,0xDE98,0xDF68,0xDF80,0xDF85,0xDF8E,0xDF8F,0xDEF4,0xDF86,0xDFA4,
+ 0xDC86,0xDC89,0xDC87,0xDC85, 0,0xDC88,0xDEFF,0xDF66, 0,0xDDC3,
+ 0,0xDDC4,0xDE3B,0xDDE7,0xDDF8,0xDDFB, 0,0xDDBE,0xDDC6, 0,
+ 0,0xDDFC,0xDDC0,0xDE33,0xDDC9,
+ /* plane 5, row 23 */
+ 1 | (94 << 8), /* first, last */
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0x3683,0x5921,
+ 0xD845,0xD842,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0x36F8,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0x36F6,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,
+ 0x379B,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0x5E3F,0xD848,0xD848,
+ 1, /* first low-surrogate */
+ 0xDDFE,0xDDDA,0xDDCC,0xDDBB,0xDDFD,0xDDDF,0xDDCD,0xDDC2,0xDDC8,
+ 0xDE32,0xDE2D,0xDDD2,0xDE31,0xDDD3,0xDE2E,0xDDCF,0xDDFF,0xDE09,0xDDFC,
+ 0xDF72,0xDFAA,0xDFAB,0xDFA7,0xDF7B,0xDF76,0xDFA8,0xDFAC, 0, 0,
+ 0xDDAA,0xDE03,0xDDAC,0xDDAD,0xDDAB,0xDE50,0xDE58,0xDFDD, 0,0xDFAE,
+ 0xDFA2,0xDFAB,0xDFE3,0xDFAF,0xDFE0,0xDFE4, 0,0xDFA7,0xDFAA,0xDFE2,
+ 0xDFE1,0xDFDF,0xDFAD,0xDFE5,0xDFD1,0xDFAC,0xDFD5,0xDFA3,0xDF9F,0xDD79,
+ 0xDD76,0xDE43,0xDE3D,0xDE47,0xDE44,0xDE3F,0xDE5B,0xDF7F,0xDC9A,0xDC9C,
+ 0,0xDD1E,0xDE88,0xDE6A,0xDE76,0xDE72,0xDE70,0xDE7E,0xDE6C,0xDE6F,
+ 0xDE75,0xDE77,0xDE78,0xDE8A,0xDE79,0xDE94,0xDC01,0xDD05,0xDCF1,0xDCEE,
+ 0xDCEF,0xDD04, 0,0xDCFA,0xDD07,
+ /* plane 5, row 24 */
+ 1 | (94 << 8), /* first, last */
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0x388D,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0x3956,0xD849,0xD849,0xD84A,0xD849,0xD849,
+ 0x395B,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,
+ 0xD84A,0xD84B,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84A,0xD84B,0xD84A,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0x3A96,0xD84B,0xD84B,
+ 1, /* first low-surrogate */
+ 0xDCF4,0xDCF5,0xDD9C,0xDE6D,0xDE69,0xDE66,0xDE62,0xDE46, 0,
+ 0xDE65,0xDE5D,0xDE5E,0xDE5F,0xDF8E,0xDC02,0xDC06,0xDC04,0xDC03,0xDC62,
+ 0xDD27,0xDD21,0xDD20,0xDD24,0xDD29,0xDD31,0xDD23,0xDD22,0xDEDC,0xDF4D,
+ 0xDEE5,0xDED3,0xDEEE,0xDEE6, 0,0xDF36,0xDF40,0xDC3F,0xDF3D,0xDF44,
+ 0,0xDF5F,0xDF29,0xDF49,0xDF8A,0xDF2A,0xDF87,0xDF4C,0xDF31,0xDF48,
+ 0xDF2B,0xDF3B,0xDF41,0xDEC9,0xDF34,0xDF53,0xDF35,0xDF47,0xDF38,0xDDD1,
+ 0xDDD2,0xDE51,0xDE55,0xDE52,0xDE53,0xDF8F,0xDFF4,0xDC47,0xDC0D,0xDC1C,
+ 0xDFFB,0xDC19,0xDFF7,0xDFF9,0xDFF5,0xDFE9,0xDC0A,0xDFEE,0xDC0B,0xDFFD,
+ 0xDC06,0xDC02,0xDC16,0xDC18,0xDFF0,0xDED4,0xDF66,0xDF6A,0xDF75,0xDF76,
+ 0xDF80,0xDF6D, 0,0xDF69,0xDF67,
+ /* plane 5, row 25 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x3B7E,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x3B81,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x3C35,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x3C9B,
+ 0xD84E,0xD84F,0x3D00,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,
+ 1, /* first low-surrogate */
+ 0xDF68,0xDF5D,0xDCA4,0xDCFE,0xDCFD,0xDDEC,0xDDE9,0xDE21,0xDDEB,
+ 0xDDE7,0xDDF2,0xDE20,0xDF7A,0xDD2D,0xDD2E,0xDCCA,0xDD2F,0xDCC8, 0,
+ 0xDCCB,0xDCC3,0xDC84,0xDCD2,0xDCC6, 0,0xDCCF,0xDCD5,0xDCD4,0xDCDD,
+ 0xDD2B,0xDDA3,0xDCDB,0xDD2C,0xDD13, 0,0xDCD1,0xDCCC,0xDCD5,0xDCC9,
+ 0xDCCF,0xDCD2,0xDD7B,0xDD7C,0xDE23,0xDE1D,0xDE1C,0xDE1E,0xDE22,0xDE24,
+ 0xDE20,0xDE18,0xDE21,0xDF88,0xDF8A,0xDF94,0xDF8F,0xDF8E,0xDF90, 0,
+ 0xDFA7,0xDC64, 0,0xDE18,0xDE14,0xDE1D,0xDE05,0xDDFF,0xDE1B,0xDE1A,
+ 0xDE19,0xDE03,0xDE0E,0xDE47,0xDE04,0xDE5A,0xDE07,0xDE20,0xDE6A,0xDE66,
+ 0xDE7A,0xDE65,0xDEAF,0xDDCD,0xDDCF,0xDDD1,0xDDCE,0xDE5F,0xDE77,0xDE74,
+ 0xDE88,0xDE75,0xDE89,0xDE72,0xDFC6,
+ /* plane 5, row 26 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0xD851,0xD852,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,
+ 0xD852,0xD852,0xD852,0x3ED3,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0x3F9F,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0x40B1,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0x414B,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,
+ 1, /* first low-surrogate */
+ 0xDFEA,0xDFE0,0xDC07,0xDFE6,0xDFE5,0xDFDD,0xDFE3,0xDFDA,0xDDAE,
+ 0xDD7E,0xDD7D,0xDD7F, 0,0xDDD9,0xDEFA,0xDEFB,0xDF4D,0xDF54,0xDF51,
+ 0xDF50,0xDD98,0xDD95,0xDD9D,0xDDC1,0xDD9A,0xDD9B, 0,0xDD9C,0xDDD7,
+ 0xDDA4,0xDD96,0xDDA0,0xDF31,0xDFE9,0xDC6E,0xDD9A,0xDDA5,0xDD94,0xDDA6,
+ 0xDD99,0xDD8B,0xDD98,0xDD91,0xDD8C,0xDDA1,0xDDA3,0xDDC6,0xDF6F,0xDF6D,
+ 0xDF6A,0xDF6C,0xDF71,0xDF6E,0xDFDF,0xDCAC,0xDCAA, 0,0xDCB5,0xDCAD,
+ 0xDCB2,0xDCB3,0xDCAB,0xDCB6,0xDCC7,0xDCC6,0xDE6C,0xDE70,0xDFB3, 0,
+ 0xDD8C,0xDD81,0xDD83,0xDD7D,0xDD85,0xDD90,0xDDA2,0xDD8D,0xDD8F,0xDD7E,
+ 0xDD8A,0xDD7F,0xDD76,0xDD87,0xDD78,0xDE80,0xDE82,0xDE81,0xDE83,0xDF5A,
+ 0xDF34,0xDF2C,0xDF2A,0xDF40,0xDF2D,
+ /* plane 5, row 27 */
+ 1 | (94 << 8), /* first, last */
+ 0xD856,0xD856,0xD856,0x7B3F,0xD856,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0x42D6,0xD857,0xD857,0xD858,0xD857,0xD857,0xD857,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0x4389,0xD859,0xD859,0xD859,
+ 0xD859,0xD85A,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0x4400,0xD859,0xD859,0xD87E,0xD859,
+ 0xD85A,0xD85A,0xD85A,0xD85B,0x44DC,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x83D0,
+ 0x4590,0xD85C,0xD85C,0xD85C,0x45B1,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0x86E7,0xD85C,0xD85C,0xD85C,
+ 1, /* first low-surrogate */
+ 0xDF33,0xDF2B,0xDF4B, 0,0xDF3C,0xDE5A,0xDE77,0xDE60,0xDFFA,
+ 0xDFF9,0xDFFC, 0,0xDFF5,0xDFE8,0xDC09,0xDFE7,0xDFE6,0xDFE9,0xDE32,
+ 0xDE2C,0xDEBD,0xDEBC,0xDF7A,0xDF7E,0xDF79, 0,0xDC23,0xDC30,0xDC28,
+ 0xDCD4,0xDECE,0xDCF1,0xDCF0,0xDD60,0xDD65,0xDEA8,0xDF0A,0xDF1B,0xDF12,
+ 0xDF07,0xDF4F,0xDF0E,0xDF52,0xDF16, 0,0xDF53,0xDF54,0xDD84,0xDF56,
+ 0xDD6D,0xDD72,0xDE2F,0xDC2A, 0,0xDC63,0xDC84,0xDCAF,0xDC45,0xDC70,
+ 0xDC56,0xDC16,0xDC3D,0xDC38,0xDC6F,0xDC77,0xDC2E,0xDC31,0xDC4C,0xDC5F,
+ 0xDC75,0xDC39,0xDC3A,0xDC2C,0xDC2D,0xDC3F,0xDC2F,0xDC30,0xDC3E, 0,
+ 0,0xDDB2,0xDEB7,0xDE8F, 0,0xDE96,0xDE9E,0xDE97,0xDE95,0xDEA5,
+ 0xDE98, 0,0xDEA3,0xDE9A,0xDEAD,
+ /* plane 5, row 28 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0x45AA,0xD85C,0xD85C,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0x467D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0x4769,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0x47A1,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0x47E7,0xD85F,0xD860,0x47EC,0xD85F,0xD85F,0xD860,0x47DF,0xD860,0xD860,
+ 0xD860,0x4833,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,
+ 1, /* first low-surrogate */
+ 0xDEA6,0xDEB6,0xDE99,0xDEAF,0xDEAC, 0,0xDE9F,0xDE94,0xDDEB,
+ 0xDE6F,0xDE6D,0xDE7E,0xDE6C,0xDE61,0xDE63,0xDE6B,0xDE5E,0xDE3E,0xDE64,
+ 0xDEAD, 0,0xDC20,0xDCD1,0xDCD5,0xDDAE,0xDDAF,0xDD9F,0xDDA8,0xDDCA,
+ 0xDFE1,0xDC39,0xDC38,0xDC3B,0xDCAD,0xDCB5,0xDCAF,0xDCB1,0xDCAE,0xDCB4,
+ 0xDCB0,0xDD4B,0xDD51,0xDD4C, 0,0xDD60,0xDEBE,0xDEB9,0xDEB7,0xDEB6,
+ 0,0xDEBD,0xDEB8,0xDEC1,0xDFF7,0xDFF3,0xDFF4,0xDFFB,0xDFFD,0xDFF5,
+ 0,0xDFFA,0xDC14, 0,0xDFF2,0xDFFC,0xDC00, 0,0xDE2B,0xDE29,
+ 0xDE2E, 0,0xDED7,0xDEDB,0xDED9,0xDED8,0xDEE6,0xDED6,0xDED1,0xDEE7,
+ 0xDED0,0xDEDC,0xDCED,0xDD1A,0xDD19,0xDD16,0xDCEC,0xDCEF,0xDCEE,0xDCF4,
+ 0xDD2F,0xDF30,0xDF19,0xDF18,0xDF11,
+ /* plane 5, row 29 */
+ 1 | (94 << 8), /* first, last */
+ 0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD87E,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,
+ 0x4BEE,0xD867,0x4C32,0xD84C,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0x34FC,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0x352A,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,
+ 1, /* first low-surrogate */
+ 0xDF16,0xDF12,0xDF10,0xDF14,0xDC0C,0xDC0D,0xDD10,0xDD29,0xDD28,
+ 0xDC65,0xDC66,0xDCDE,0xDCDF,0xDCE0,0xDCD9,0xDCDB,0xDCD8,0xDCE3,0xDCD7,
+ 0xDEA6,0xDEA7,0xDEBF,0xDEA8,0xDE9F,0xDEA1,0xDEA2,0xDEAD,0xDEA3,0xDEA0,
+ 0xDC83,0xDC85,0xDC82,0xDC84,0xDDEE,0xDE5D,0xDF92,0xDC55,0xDC53,0xDDFC,
+ 0xDC51,0xDC52,0xDC50,0xDD9D,0xDE87,0xDE97,0xDE9B,0xDE9D,0xDC69,0xDE11,
+ 0,0xDC7A, 0,0xDE44,0xDCC6,0xDF40,0xDF2E,0xDF68,0xDF2D,0xDF34,
+ 0xDF32,0xDF69,0xDF31,0xDF6A,0xDF3E,0xDF6F,0xDF75,0xDCF6,0xDD20,0xDD28,
+ 0xDD67,0xDDFB,0xDDFE,0xDDFC,0xDDFD,0xDDFF,0xDDFA,0xDFAC,0xDFAF,0xDFB1,
+ 0,0xDFBF,0xDFBE,0xDFA7,0xDFAA,0xDC94,0xDC93,0xDC99, 0,0xDCFA,
+ 0xDD56,0xDE22,0xDE91,0xDE92,0xDF08,
+ /* plane 5, row 30 */
+ 1 | (94 << 8), /* first, last */
+ 0xD842,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0x35D3,0xD843,0xD843,0xD843,0x35D7,
+ 0xD843,0xD843,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD846,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0x37F3,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,
+ 1, /* first low-surrogate */
+ 0xDF06,0xDDD6,0xDE37,0xDE4B,0xDECE,0xDED0,0xDE39,0xDE64,0xDECF,
+ 0xDE46,0xDE66,0xDE56,0xDE43,0xDE4A,0xDE58,0xDE65,0xDE5A,0xDE5B,0xDE55,
+ 0xDE50,0xDE4C,0xDECD,0xDE51,0xDE47, 0,0xDE53,0xDE62,0xDECC, 0,
+ 0xDE7F,0xDE4D,0xDE0A,0xDE0C,0xDE0F,0xDFBB,0xDFB9,0xDFEB,0xDFAE,0xDFC1,
+ 0xDFEA,0xDFBE,0xDFBF,0xDFBA,0xDFB7,0xDFB3,0xDFE9,0xDD6E,0xDDAF,0xDDB3,
+ 0xDDB2,0xDE68,0xDE69,0xDE6A,0xDFDE,0xDFEB,0xDC11,0xDFED,0xDFE9,0xDFF7,
+ 0xDFF4,0xDFEA,0xDC12,0xDFE8,0xDC13,0xDD8E,0xDD86,0xDE63,0xDE65,0xDF99,
+ 0xDCC2,0xDCAE,0xDCB0,0xDCAD,0xDEB4,0xDED1,0xDEAD, 0,0xDEBD,0xDEB7,
+ 0xDEAB,0xDEAF,0xDEC1,0xDEB5,0xDD0F,0xDD0E,0xDD1C,0xDD13,0xDD0A,0xDD1E,
+ 0xDD14,0xDD1A,0xDDCB,0xDE87,0xDE93,
+ /* plane 5, row 31 */
+ 1 | (94 << 8), /* first, last */
+ 0x3891,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0x38C0,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0x6117,0xD849,0x3963,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0x3970,0xD849,0xD849,0xD849,0xD840,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0x3B02,0xD84C,0xD84C,0xD84C,
+ 0xD87E,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD87E,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 2, /* first low-surrogate */
+ 0xDE84,0xDE85,0xDE92,0xDE80,0xDF2B,0xDF63,0xDC0A, 0,
+ 0xDC66,0xDD34,0xDD33,0xDD4D,0xDF89,0xDF57, 0,0xDF4A, 0,0xDF39,
+ 0xDF3F,0xDF90,0xDF8F,0xDFB2,0xDF9F,0xDF95,0xDFA1,0xDF9C,0xDF8E,0xDFA0,
+ 0xDFAE,0xDF96,0xDFCA,0xDFAC, 0,0xDFA6,0xDF97,0xDF93,0xDFB6,0xDDD6,
+ 0xDDE0,0xDDD8,0xDE56,0xDC6E,0xDC7E,0xDC74,0xDC77,0xDC80,0xDC7A,0xDC6B,
+ 0xDC5F,0xDC76,0xDCB0,0xDC63,0xDF92,0xDF82,0xDF9D,0xDF94,0xDF83,0xDF8B,
+ 0xDF84,0xDC57,0xDC84,0xDCB5,0xDD09,0xDDE6, 0,0xDE25,0xDE51,0xDF3E,
+ 0xDCDA,0xDF85,0xDD3F,0xDD42,0xDD38,0xDD3A,0xDD4E,0xDD45,0xDD39,0xDD37,
+ 0xDD44,0xDCE7,0xDDA4,0xDD3D,0xDD41,0xDCDF,0xDCDE,0xDCCA,0xDCE9,0xDCE2,
+ 0xDCE0,0xDD89,0xDD87,0xDE32,0xDE33,
+ /* plane 5, row 32 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0x3D35,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD851,0xD851,0xD851,0xD865,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0x3EE0,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0x3F9A,0xD853,0xD853,0xD853,0x3FA3,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0x4005,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD84E,0xD854,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDEAC,0xDEF9,0xDF0D,0xDFB9,0xDE5E,0xDE6A, 0,0xDE81,0xDE69,
+ 0xDEAC,0xDE80,0xDE75,0xDE71,0xDE76,0xDE6F,0xDEB6,0xDF03,0xDEBF,0xDF01,
+ 0xDEB2,0xDEC4,0xDDDB,0xDDDC,0xDDD8,0xDE72,0xDEB5,0xDEA8,0xDE8F,0xDE9E,
+ 0xDE8E,0xDFDE,0xDFE2,0xDC20,0xDC1D,0xDC1A,0xDC19,0xDC2B,0xDC18,0xDC10,
+ 0xDC0E,0xDC24,0xDC1F,0xDC13,0xDC35,0xDD83, 0,0xDDD7,0xDF02,0xDF03,
+ 0xDF5C,0xDF5F,0xDFC7,0xDC9A,0xDC97,0xDCA3,0xDDF7,0xDDC6,0xDDCC,0xDDD6,
+ 0xDDCD,0xDDF9,0xDDD9,0xDDD8, 0,0xDDD1,0xDDCE,0xDDD5, 0,0xDDD4,
+ 0xDDF8,0xDF7A,0xDF79,0xDF7F,0xDFF3,0xDFF5,0xDFF6,0xDFF4,0xDFF7, 0,
+ 0xDC79,0xDD9C,0xDDDF,0xDDF5,0xDDFF,0xDDD1,0xDDDA,0xDDCF,0xDDCD,0xDDDE,
+ 0xDDD8,0xDEAD,0xDDE0,0xDDFE,0xDD9E,
+ /* plane 5, row 33 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0x415E,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0x41A6,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0x435D,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0x43B8,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,
+ 1, /* first low-surrogate */
+ 0xDF75,0xDF73,0xDF72,0xDFD8,0xDCD0,0xDCD6,0xDCD7,0xDCCA,0xDCCD,
+ 0xDE8A,0xDE89,0xDE8B,0xDFD3,0xDFDA,0xDFCE,0xDFD2, 0,0xDFD4,0xDFD7,
+ 0xDFD5,0xDFFB,0xDFCD,0xDFFA,0xDFD6, 0,0xDD9B,0xDD9E,0xDD9D,0xDDA4,
+ 0xDD9F,0xDDA5,0xDDA8,0xDE8F,0xDE8C,0xDE95,0xDF60,0xDF55,0xDF5C,0xDF6F,
+ 0xDF51,0xDF61,0xDFA7,0xDF5E,0xDF62,0xDF54,0xDF6E,0xDF52,0xDF58,0xDF6D,
+ 0xDF5F,0xDF6C,0xDF50,0xDF5D,0xDF8E,0xDE72,0xDE78,0xDE75,0xDE76,0xDE7C,
+ 0xDE7E,0xDE7D,0xDC15,0xDC14,0xDC1D,0xDC1C,0xDC23,0xDC57,0xDEC8, 0,
+ 0xDEC9,0xDEC5,0xDF87,0xDF8A,0xDF94,0xDC39,0xDC40,0xDC3E,0xDC38,0xDCD6,
+ 0,0xDD77,0xDD78,0xDD7D,0xDEDD,0xDF5E,0xDF77,0xDFD4,0xDF66,0xDF5F,
+ 0xDF73,0xDF72,0xDF97,0xDF5A,0xDF96,
+ /* plane 5, row 34 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0x4434,0xD859,
+ 0xD85A,0xD85A,0xD85A,0x446F,0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,
+ 0xD85C,0x4594,0x4593,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0x8714,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x88D1,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 1, /* first low-surrogate */
+ 0xDF5D,0xDF65,0xDF70,0xDF75,0xDF74,0xDF5C,0xDF60, 0,0xDF6D,
+ 0xDD41,0xDE3C,0xDE3E, 0,0xDE49,0xDFE4,0xDD0C,0xDD15,0xDD0E,0xDCD4,
+ 0xDCC7,0xDD14,0xDCDB,0xDD5F,0xDCED,0xDD09,0xDCCF,0xDCFF,0xDD1A,0xDCF5,
+ 0xDCEE,0xDCE5,0xDD0D,0xDCDF,0xDCEC,0xDCD7,0xDD2C,0xDCCD,0xDCE3,0xDD00,
+ 0xDCEB,0xDCFD,0xDD0F,0xDD2D,0xDD50,0xDCFE,0xDCC4,0xDCE1,0xDCF9,0xDDBB,
+ 0xDDBC, 0, 0,0xDDBA,0xDED0,0xDED6,0xDECE,0xDEE1,0xDED5,0xDECF,
+ 0xDED3, 0,0xDED4,0xDDB5,0xDE90,0xDEA1,0xDE81,0xDE85,0xDE6E,0xDE88,
+ 0xDE82,0xDE86,0xDE8F,0xDE89,0xDE80,0xDE84, 0,0xDC29,0xDC2B,0xDC2A,
+ 0xDC30,0xDCE2,0xDCE3,0xDCE1,0xDDD5,0xDDC4,0xDDC9,0xDDE0,0xDDDF,0xDDCB,
+ 0xDDDD,0xDDE8,0xDDD4,0xDE1C,0xDFB5,
+ /* plane 5, row 35 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0x8CCB,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0x4792,0xD85F,0xD85F,0xD85F,0x47AA,0xD85F,0xD85F,0xD85F,0x47A7,0xD85F,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0x47EF,0xD860,0xD860,0xD860,0xD860,0x8EED,0xD860,
+ 0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,0x4922,0xD862,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDFB6,0xDFE5,0xDC45,0xDC49,0xDC40,0xDC46,0xDC44,0xDC4A,0xDCC9,
+ 0xDCC4,0xDCC2,0xDD68, 0,0xDD82,0xDD6B,0xDD67,0xDD6C,0xDD6D,0xDD71,
+ 0,0xDED7,0xDED2,0xDED9, 0,0xDEBC,0xDEDD,0xDED6, 0,0xDED8,
+ 0xDC20,0xDC16,0xDC18,0xDC15,0xDC19,0xDC27,0xDC50,0xDC1D,0xDC2C,0xDC1C,
+ 0xDC29,0xDC2B,0xDC24, 0,0xDC28,0xDE39,0xDEF2,0xDEF0, 0,0xDEED,
+ 0xDEEF,0xDEEA,0xDF01,0xDCBC,0xDD5C,0xDD5B,0xDD5A,0xDD26,0xDF43,0xDF33,
+ 0xDF3A,0xDF37,0xDF36,0xDF3C,0xDF34,0xDF4A,0xDF3B,0xDF35,0xDF3D,0xDF40,
+ 0xDF3E,0xDF17,0xDC26,0xDC24,0xDC10,0xDC36,0xDC25, 0,0xDD66,0xDC7F,
+ 0xDC7A,0xDCFB,0xDCFD,0xDCFC,0xDCFA,0xDED6,0xDED2,0xDEC8,0xDEC2,0xDEC7,
+ 0xDECD,0xDEC1,0xDEC6,0xDECC,0xDFA1,
+ /* plane 5, row 36 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0x4AB5,0xD87E,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD866,0x4B75,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD868,0xD869,0xD840,0xD840,0x3482,0xD840,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0x52EC,0xD842,0xD842,
+ 0xD842,0x52E8,0xD842,0xD842,0xD842,0xD842,0x3535,0xD842,0xD842,0xD842,
+ 0xD842,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD840,
+ 1, /* first low-surrogate */
+ 0xDC95,0xDC94,0xDC97,0xDC96,0xDC93,0xDCA1,0xDE09,0xDE08,0xDE67,
+ 0xDE65,0xDE62,0xDE61,0xDF97,0xDC01,0xDC19,0xDC18,0xDC5C,0xDC67,0xDC6C,
+ 0,0xDDFD,0xDC66,0xDC61,0xDC6E,0xDC5D,0xDC5A,0xDDA2,0xDDA9,0xDDA5,
+ 0xDDA6,0xDDB2,0xDDA3,0xDEAC,0xDEAA,0xDEAF,0xDEAB,0xDEB1,0xDEC6,0xDEAD,
+ 0xDEB9,0xDC70, 0,0xDC0C,0xDC81,0xDC83,0xDC7E,0xDD51,0xDF99,0xDF94,
+ 0xDF95,0xDEFE,0xDC18,0xDD05,0xDF72, 0,0xDF99,0xDCAD,0xDE06,0xDFC2,
+ 0xDFCB,0xDFD5,0xDFD2,0xDFCC,0xDFD7,0xDFC5,0xDFCA, 0,0xDCA2,0xDCA3,
+ 0xDCA1, 0,0xDCA6,0xDCA4,0xDCFF,0xDD00, 0,0xDE06,0xDE25,0xDE9F,
+ 0xDF7F,0xDEEA,0xDEEB,0xDEDE,0xDF18,0xDEE0,0xDEE8,0xDEDF,0xDEF1,0xDEEC,
+ 0xDF1A,0xDEE6,0xDEE1,0xDF5D,0xDC77,
+ /* plane 5, row 37 */
+ 1 | (94 << 8), /* first, last */
+ 0xD843,0x35F0,0xD843,0xD844,0xD845,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD845,0xD845,0xD855,0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,
+ 0xD848,0xD85A,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0x38F0,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD849,0xD849,0xD849,0xD849,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 1, /* first low-surrogate */
+ 0xDF1E, 0,0xDF80,0xDE17,0xDC1D,0xDFF7,0xDFEF,0xDFEE,0xDFED,
+ 0xDFF5,0xDC1E,0xDDBD,0xDFFF,0xDDBE,0xDE6D,0xDE76,0xDC4C,0xDC19,0xDC48,
+ 0xDC1E,0xDC4A,0xDC49,0xDC26,0xDD95,0xDE85,0xDE7E,0xDE97,0xDE7D,0xDF42,
+ 0xDF9E,0xDC0C,0xDC0B,0xDC0E,0xDCCF,0xDED8,0xDEE0,0xDEE8,0xDEE9,0xDEE2,
+ 0xDEE1,0xDEDA,0xDEE3,0xDED9,0xDEF0,0xDEE7,0xDEE4,0xDD23,0xDD31,0xDD33,
+ 0xDD0C,0xDDE0,0xDD26,0xDD24,0xDD32,0xDD27,0xDD21,0xDD30,0xDDA2,0xDDCC,
+ 0xDE96,0xDC8F,0xDE98,0xDE9C,0xDE9B,0xDF6B,0xDC12,0xDC14,0xDD5A,0xDD54,
+ 0xDD51,0xDD5E,0xDD58, 0,0xDD59,0xDF9A,0xDFF2,0xDFAD,0xDC20,0xDFF1,
+ 0xDFF0,0xDFF3,0xDFF4,0xDFE9,0xDFFE,0xDC2E,0xDFE8,0xDFE7,0xDFFF,0xDFF5,
+ 0xDDE5,0xDDE7,0xDDE6,0xDDE9,0xDE58,
+ /* plane 5, row 38 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84B,0xD84B,0x3A3E,0xD84B,0x3A39,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD87E,0xD84B,0x3AA2,0xD84B,0x3AA1,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD87E,0xD84C,0xD84C,0xD84C,0x3B3B,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0x3BB7,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0x3C57,0x3C70,0xD84E,0xD84E,0xD84E,0xD866,0xD84E,
+ 0xD84E,0xD84E,0x3CA7,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x3D54,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,
+ 1, /* first low-surrogate */
+ 0xDC6C,0xDCD9, 0,0xDCCB, 0,0xDCBE,0xDCB5,0xDCD1,0xDCC2,
+ 0xDCB6,0xDCD3,0xDCC2,0xDEDA, 0,0xDFAE, 0,0xDFAC,0xDFA9,0xDFBA,
+ 0xDFA7,0xDFB3,0xDFBD,0xDFB1,0xDD0E,0xDD11,0xDD0F,0xDE52,0xDE6A,0xDE54,
+ 0xDE55,0xDE53,0xDE57,0xDCD0,0xDE5B,0xDE58,0xDE59, 0,0xDDB8,0xDDB5,
+ 0xDDBF,0xDDC1,0xDDBB, 0,0xDDC3,0xDDAD,0xDDA8,0xDDAE,0xDDAA,0xDDD0,
+ 0xDDB1,0xDDBC,0xDDB7,0xDDB0,0xDDFA,0xDDFB,0xDDB9,0xDD07,0xDCFC,0xDCFF,
+ 0xDCF2,0xDCF8,0xDCF4, 0, 0,0xDEAE,0xDF0F,0xDF10,0xDEC1,0xDFC7,
+ 0xDFC6,0xDFCE, 0,0xDFDC,0xDED5,0xDED3,0xDF20,0xDEE2,0xDEF1,0xDEDB,
+ 0xDEEA,0xDEEB,0xDEE1,0xDEFF,0xDED6,0xDEE0,0xDED7,0xDEE5, 0,0xDF1B,
+ 0xDF10,0xDF0F,0xDF0E,0xDF39,0xDF0A,
+ /* plane 5, row 39 */
+ 1 | (94 << 8), /* first, last */
+ 0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0x3F31,0x7527,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD866,0xD853,0xD853,0xD853,0xD853,0x3FBF,0xD853,0x3FE4,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0x404A,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0x40CF,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0x798C,
+ 1, /* first low-surrogate */
+ 0xDF14,0xDF0C,0xDD23,0xDD5A,0xDDE2,0xDE93,0xDEB0,0xDEAB,0xDEBD,
+ 0xDEB1,0xDE8D,0xDEAD,0xDEAA,0xDEAC,0xDEBC,0xDEC9,0xDC47,0xDC62,0xDC40,
+ 0xDC44,0xDC3F,0xDC43,0xDC3D,0xDC60,0xDC5F,0xDC3A,0xDC42,0xDC5E,0xDC5D,
+ 0xDDBC,0xDDE0,0xDDEE,0xDDEB,0xDE0D,0xDF09,0xDF0C,0xDF69,0xDF74,0xDF67,
+ 0, 0,0xDCAD,0xDDFF,0xDE16,0xDE08,0xDE09,0xDE00,0xDDFC,0xDE13,
+ 0xDE14,0xDE0A,0xDC3E,0xDE29,0xDE17,0xDE3B,0xDDFB, 0,0xDE0E, 0,
+ 0xDC08,0xDE1B,0xDE1A,0xDE19,0xDE02, 0,0xDE17,0xDE07,0xDE13,0xDE09,
+ 0xDE0A,0xDE12,0xDEAA,0xDE38,0xDF7B,0xDF7C,0xDF7A,0xDFEA,0xDFEB,0xDFEF,
+ 0xDFF0,0xDD09,0xDD02,0xDD01,0xDD2B,0xDD07, 0,0xDD28,0xDCFB,0xDD2A,
+ 0xDCFE,0xDD04,0xDD29,0xDD0A,
+ /* plane 5, row 40 */
+ 1 | (94 << 8), /* first, last */
+ 0xD855,0x7991,0xD855,0x4114,0xD84B,0xD847,0xD856,0xD855,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0x420D,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x4201,0xD856,
+ 0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0x42F1,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD87E,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,
+ 1, /* first low-surrogate */
+ 0xDEC2, 0,0xDEA6, 0,0xDFC6,0xDC07,0xDC0A,0xDFFD,0xDC06,
+ 0xDC0D,0xDC09,0xDC0B,0xDC00,0xDC05,0xDC3D,0xDDD5,0xDDBF,0xDDBA,0xDDC7,
+ 0xDE98,0xDE9A, 0,0xDFA4,0xDF9C,0xDF9D,0xDFA2,0xDF96,0xDF95,0xDFA5,
+ 0xDFAA,0xDFAD,0xDF9A,0xDFA3,0xDF97,0xDF90,0xDFAF,0xDF8D, 0,0xDFA8,
+ 0xDFEE,0xDEA3,0xDE99,0xDEA1,0xDE9C,0xDEA4,0xDECB,0xDC56,0xDC48,0xDC59,
+ 0xDC4A,0xDC5C, 0,0xDC4F,0xDC4D,0xDC5D,0xDE3A,0xDEE3,0xDEE1,0xDEDE,
+ 0xDF97,0xDF9A,0xDC48,0xDC4A,0xDC4C,0xDC4E,0xDC4F,0xDC4B,0xDC4D,0xDC47,
+ 0xDC51,0xDCDA,0xDCF9,0xDCFC,0xDCFB,0xDCFD,0xDCF8,0xDCFA,0xDD8A,0xDD8E,
+ 0xDD88,0xDD89,0xDD8D,0xDD90,0xDD7E,0xDF1C,0xDFAB,0xDFA4,0xDFA8,0xDFAD,
+ 0xDF9F,0xDF9A,0xDFB0,0xDFA5,0xDFD5,
+ /* plane 5, row 41 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0x4476,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x450A,0x4503,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x8660,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x4635,0x4636,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,
+ 1, /* first low-surrogate */
+ 0xDFA2,0xDFB2,0xDF9D,0xDFA1,0xDD15,0xDD42,0xDD73,0xDD84,0xDDDD,
+ 0xDE5C,0xDE4C, 0,0xDE4B,0xDC67,0xDDA8,0xDD7F,0xDD8D,0xDD8B,0xDDF7,
+ 0xDDA9,0xDDF4,0xDD9A,0xDD8C,0xDD95,0xDD7E,0xDD77, 0, 0,0xDD71,
+ 0xDDFD,0xDD88,0xDD99,0xDD6D,0xDDD4,0xDD91,0xDD7D,0xDD63,0xDD75,0xDDF9,
+ 0xDD8E,0xDD74,0xDDD9,0xDD66,0xDDFA,0xDDF5, 0,0xDDC1,0xDDC9,0xDF03,
+ 0xDF2C,0xDF34,0xDF17,0xDF09,0xDF04,0xDF06,0xDF1A,0xDF0E,0xDF27,0xDF05,
+ 0xDF07,0xDF19,0xDF14,0xDF0C,0xDF1D,0xDF22,0xDF23,0xDDBB,0xDDBC,0xDDBA,
+ 0xDEA9,0xDEB5,0xDEAC,0xDEAA,0xDEAF,0xDEB7, 0, 0,0xDC3D,0xDC45,
+ 0xDC48,0xDC3C,0xDC3E,0xDCEC,0xDCED,0xDCE9,0xDE0A,0xDE0B,0xDDF8,0xDE04,
+ 0xDDF6,0xDDF9,0xDC53,0xDC52,0xDC60,
+ /* plane 5, row 42 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x4773,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x47B1,0xD85F,
+ 0x47AF,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0x47F4,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0x48DC,0xD861,0xD861,0xD861,0xD861,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0x4999,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD864,
+ 1, /* first low-surrogate */
+ 0xDC63,0xDCCE,0xDCCD,0xDCD0,0xDCCC,0xDD87,0xDD8D,0xDD9D, 0,
+ 0xDE63,0xDEF4,0xDEF1,0xDEFF,0xDEF5,0xDEFC,0xDEF2,0xDEF6, 0,0xDEFA,
+ 0,0xDC2E,0xDC45,0xDC43,0xDC51,0xDC4C,0xDC73,0xDC47,0xDC4B,0xDC4F,
+ 0,0xDC44,0xDC4D,0xDC4E,0xDC4A,0xDC41,0xDC52,0xDC9F,0xDC54,0xDC59,
+ 0xDCA2,0xDE4B,0xDE48,0xDF0D,0xDF1F,0xDF08,0xDF0E,0xDF1D,0xDF04,0xDC18,
+ 0xDC1B,0xDD66,0xDD62,0xDD83,0xDD67,0xDF62,0xDF4F,0xDF4E,0xDF67,0xDF53,
+ 0xDF4D,0xDF4C,0xDF68,0xDF51, 0,0xDF58,0xDF5B,0xDF50,0xDF6A,0xDC39,
+ 0xDC38,0xDD82,0xDD84,0xDD86,0xDC80,0xDC86,0xDD25,0xDD11, 0,0xDD0E,
+ 0xDD15,0xDD0F,0xDD18,0xDD0D,0xDD13,0xDD16,0xDD19,0xDF08,0xDEF7,0xDEFB,
+ 0xDEFC,0xDFB4,0xDFBE,0xDFC1,0xDCA6,
+ /* plane 5, row 43 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0x4AB6,0x4ABD,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0x9904,0xD865,0x999B,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0x4BF4,0xD866,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0x4C35,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0x4CAA,0xD868,0x4D1F,0xD868,0xD868,
+ 0xD868,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD840,0xD840,0xD840,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,
+ 1, /* first low-surrogate */
+ 0xDCA5,0xDCA2,0xDCA4,0xDE12,0xDE0E,0xDE7A,0xDE78,0xDE7D,0xDE7E,
+ 0xDE81,0xDE83,0xDE80,0xDE82,0xDF9B,0xDF99,0xDF9C,0xDF9A,0xDFA1,0xDC1A,
+ 0xDC1C,0xDC8A,0xDC79,0xDC73,0xDC75,0xDC7C,0xDC78,0xDC60,0xDC83,0xDC70,
+ 0, 0,0xDC87,0xDC84,0xDC7B,0xDC7E,0xDC74,0xDDB9,0xDDB8,0xDDB7,
+ 0xDDB5,0xDECC,0xDECE,0xDED1, 0,0xDECB, 0,0xDC7E,0xDC7A,0xDC77,
+ 0xDC8C,0xDCE1,0xDE20,0xDE1E,0xDEC2,0xDF0F,0xDF00, 0,0xDF10,0xDC0D,
+ 0xDC0E,0xDC8E,0xDC8D,0xDC8A,0xDC8B,0xDC8C,0xDC8F,0xDD57, 0,0xDD55,
+ 0xDD5B,0xDFAC,0xDFA7,0xDFA0,0xDF9E, 0,0xDE8D, 0,0xDF93,0xDF94,
+ 0xDF92,0xDD81,0xDFD6,0xDFC3,0xDFE4,0xDFE2,0xDC09,0xDFBF,0xDFC8,0xDFC7,
+ 0xDCB5,0xDCB2,0xDE0C,0xDE0B,0xDE0A,
+ /* plane 5, row 44 */
+ 1 | (94 << 8), /* first, last */
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0x3550,0xD842,0xD842,
+ 0xD842,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD840,0xD843,0xD843,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0x377B,0xD847,0xD847,
+ 0xD847,0xD847,0x3809,0xD847,0xD847,0xD847,0x3807,0xD847,0xD847,0xD847,
+ 0xD847,0xD845,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,
+ 1, /* first low-surrogate */
+ 0xDE05,0xDFD3,0xDFE6,0xDFE9,0xDFF0,0xDFEA,0xDFE7,0xDCB1,0xDCB3,
+ 0xDCB4,0xDCB0,0xDD5C,0xDD5D,0xDD5E,0xDDC0,0xDEAF, 0,0xDF86,0xDF83,
+ 0xDF84,0xDF5C,0xDF70,0xDF8C,0xDF7B,0xDF66,0xDF79,0xDF63,0xDFC5,0xDF6B,
+ 0xDF6D,0xDF72,0xDF69,0xDF75,0xDF89,0xDFC6,0xDFA5,0xDFE7,0xDF6A,0xDF97,
+ 0xDC5A,0xDC5C,0xDC59,0xDC24,0xDC25,0xDC30,0xDC58,0xDC31,0xDD76,0xDDC1,
+ 0xDE85,0xDE7D,0xDC65,0xDC87,0xDC52,0xDC54,0xDC8A,0xDC50,0xDC86,0xDC4F,
+ 0xDC68,0xDD9D,0xDEA0,0xDEBA,0xDEBD,0xDEB8,0xDFA6, 0,0xDCDE,0xDCD8,
+ 0xDCD1,0xDF13, 0,0xDF0E,0xDF1B,0xDF3A, 0,0xDF1C,0xDF12,0xDF16,
+ 0xDF1A,0xDC48,0xDD4B,0xDD37,0xDD36,0xDD38,0xDD3A,0xDD49,0xDD3C,0xDD4A,
+ 0xDEB1,0xDEC2,0xDEB5,0xDEC4,0xDEB6,
+ /* plane 5, row 45 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD849,
+ 0x6184,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0x39BB,0xD84B,0xD84B,0x3A4B,0xD84B,0xD84B,0xD84B,
+ 0x3A4D,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84C,0xD84C,0xD84C,0x3AC2,0xD84C,0xD84C,0xD84C,0xD84C,0x3B1A,0xD84C,
+ 0xD84C,0x3B12,0xD84C,0xD84C,0xD84C,0xD84C,0x3B3C,0xD84C,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x3BC3,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x3BC0,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 1, /* first low-surrogate */
+ 0xDC1E,0xDC1F,0xDCAF,0xDD6B,0xDD6F,0xDF92,0xDFE4,0xDC2C,0xDFEF,
+ 0,0xDC4F,0xDC52,0xDC50,0xDC3A,0xDC37,0xDC47,0xDC64,0xDC40,0xDC3C,
+ 0xDC45,0xDC41,0xDDF3, 0,0xDCC1,0xDCB4, 0,0xDD2A,0xDD22,0xDD29,
+ 0,0xDD3E,0xDD3C,0xDD30,0xDFC7,0xDFD5,0xDFD6,0xDFD3,0xDFCE,0xDFC8,
+ 0xDC5C,0xDC5F,0xDC62, 0,0xDCBD,0xDCBF,0xDE5C,0xDEB6, 0,0xDE9D,
+ 0xDE7F, 0,0xDE94,0xDE81,0xDF47,0xDF46, 0,0xDF94,0xDE75,0xDE1A,
+ 0xDE2A,0xDE32,0xDE17,0xDE23,0xDE74, 0,0xDE76,0xDE2E,0xDE25,0xDE20,
+ 0xDE71,0xDE16,0xDE70,0xDE2C,0xDE2F,0xDE1F,0xDE64, 0,0xDD08,0xDD14,
+ 0xDD0A,0xDD0B,0xDE4F,0xDE59,0xDE54,0xDE51,0xDEB6,0xDFEC,0xDFED,0xDFEA,
+ 0xDEEE,0xDF5A,0xDF73,0xDF65,0xDF61,
+ /* plane 5, row 46 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0x729F,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0x3FE5,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0x405F,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0x4118,0xD841,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,
+ 1, /* first low-surrogate */
+ 0xDF55,0xDF6B,0xDF64,0xDF5B,0xDF4C,0xDF6F,0xDF84,0xDF70,0xDF5D,
+ 0xDF57,0xDF66,0xDF53,0xDF98,0xDF97,0xDD28,0xDDEB,0xDDEA,0xDDE8,0xDDEC,
+ 0xDDEF,0xDED1,0xDECA, 0,0xDECF,0xDECD,0xDECE,0xDC70,0xDC67,0xDC73,
+ 0xDC6D,0xDC76,0xDC79,0xDC6A,0xDC8B,0xDC72,0xDC71,0xDC6E,0xDC7A,0xDE16,
+ 0xDE39,0xDE3B,0xDF10,0xDF96,0xDF7B,0xDF7C,0xDF7D,0xDCBE,0xDE5C,0xDE38,
+ 0xDE39,0xDE2E,0xDE34,0xDE32,0xDE5B,0xDE33,0xDE3C, 0,0xDC0E,0xDC0F,
+ 0xDC10,0xDC87,0xDE5B,0xDE53, 0,0xDE5C,0xDE3F,0xDE59,0xDE4A,0xDE44,
+ 0xDE4C,0xDE40,0xDE5F,0xDE5E,0xDE4E,0xDE54,0xDE43,0xDE87,0xDF82,0xDF85,
+ 0xDD31,0xDD47,0xDD2E,0xDD2F,0xDD48,0xDD34, 0,0xDD9F,0xDC32,0xDC36,
+ 0xDC33,0xDC31,0xDC40,0xDC41,0xDDDD,
+ /* plane 5, row 47 */
+ 1 | (94 << 8), /* first, last */
+ 0xD856,0xD856,0x41AD,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,0xD856,0x421E,0xD856,
+ 0xD856,0xD856,0x4227,0xD856,0xD856,0xD856,0xD856,0x4218,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x4220,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,
+ 0xD858,0x42F4,0x4302,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,
+ 0xD859,0xD859,0xD859,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDDD2,0xDDD9, 0,0xDDDF,0xDDDB,0xDDD8,0xDDD3,0xDDDE,0xDDE0,
+ 0xDDD4,0xDDD7,0xDDDA,0xDEA7,0xDFFE,0xDFDD,0xDC40,0xDFE2, 0,0xDFD6,
+ 0xDFDE,0xDFEF, 0,0xDFEB,0xDFEA,0xDFE4,0xDFD1, 0,0xDFEC,0xDFFA,
+ 0xDFD9,0xDFF3,0xDFE1,0xDFDC,0xDFE5,0xDFDF,0xDFD4, 0,0xDC05,0xDED6,
+ 0xDED5,0xDED0,0xDEC8,0xDEC4,0xDEC9,0xDECD,0xDED2,0xDECC,0xDECA,0xDCA0,
+ 0xDC92, 0, 0,0xDC8B,0xDCA1,0xDC95,0xDC88,0xDC86,0xDC8D,0xDC85,
+ 0xDC91,0xDC89,0xDCA2,0xDEF0,0xDEF3,0xDEF4,0xDEEF,0xDF06,0xDFA2,0xDC5E,
+ 0xDC63,0xDC60,0xDC5B,0xDC7B,0xDC58,0xDC59,0xDC5D,0xDD05,0xDD06,0xDD02,
+ 0xDD03,0xDD04,0xDDA2,0xDDA7,0xDDA6,0xDDA4,0xDDAC,0xDDA9,0xDFE7,0xDC01,
+ 0xDFDF,0xDFD9,0xDFE3,0xDC0F,0xDD1A,
+ /* plane 5, row 48 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x4524,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0x8770,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 1, /* first low-surrogate */
+ 0xDD45,0xDD48,0xDD7B,0xDD85,0xDD86,0xDDFE,0xDDFF,0xDE64,0xDE71,
+ 0xDE72,0xDE61,0xDE62,0xDE6C,0xDE60,0xDE5D,0xDE63,0xDE67,0xDE01,0xDE2A,
+ 0xDE30,0xDE06,0xDE7D,0xDE22,0xDEB9,0xDE0A,0xDE10,0xDD8F,0xDE80,0xDE13,
+ 0xDE2E,0xDE18,0xDE17,0xDE1A,0xDE14,0xDE47,0xDE63,0xDE38, 0,0xDE7F,
+ 0xDE21,0xDE37,0xDE31,0xDE1B,0xDEA5,0xDF6C,0xDDD3,0xDF88,0xDF6E,0xDF5C,
+ 0xDF74,0xDF54,0xDF83, 0,0xDF65,0xDF60,0xDF70,0xDF6F,0xDF6D,0xDF72,
+ 0xDF6C,0xDF76,0xDF75,0xDF59,0xDFC7,0xDDC1,0xDDF9,0xDEE3,0xDEE7,0xDED6,
+ 0xDECF,0xDEDA,0xDEE9,0xDED2,0xDC55,0xDC4F,0xDC4D,0xDC51,0xDC56,0xDCF9,
+ 0xDCF8,0xDD06,0xDD03,0xDD09,0xDCF7,0xDCF5,0xDE47,0xDE45,0xDE3E,0xDE46,
+ 0xDE29,0xDE34,0xDE3F,0xDE44,0xDE35,
+ /* plane 5, row 49 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x477D,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,
+ 0x8E37,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0x4864,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,
+ 1, /* first low-surrogate */
+ 0xDE5A,0xDE2A,0xDE33,0xDE37,0xDE43,0xDE39,0xDE30,0xDE5D,0xDE32,
+ 0xDE27,0xDFBD,0xDFBA,0xDFBC,0xDFF1,0xDFF0,0xDC61,0xDC5C,0xDC58,0xDC5D,
+ 0xDCDA,0xDCD9,0xDCDD,0xDCDC,0xDCDE, 0,0xDDA0,0xDDA2,0xDF0F,0xDF13,
+ 0xDF12,0xDF11,0xDF14,0xDF19,0xDF0E,0xDF17,0xDF21,0xDF20,0xDF16,0xDC78,
+ 0,0xDC87,0xDC79,0xDC80,0xDC77,0xDC81,0xDC46,0xDC7A,0xDC9C,0xDC83,
+ 0xDC84,0xDCAD,0xDC9D,0xDC9E,0xDE55,0xDF36,0xDF2B,0xDF27,0xDF46,0xDF2C,
+ 0xDF45,0xDF33,0xDF2D,0xDF34,0xDF22, 0,0xDC1F,0xDDB3,0xDD8C,0xDD8F,
+ 0xDDAF,0xDDAD,0xDD8E,0xDDAC,0xDDB0,0xDDB1,0xDDAE,0xDD99,0xDEEB,0xDF74,
+ 0xDF75,0xDF8E,0xDF6D,0xDF70,0xDF8C,0xDC4F,0xDC51,0xDC58,0xDC4C,0xDC4E,
+ 0xDD15,0xDDBE,0xDDDB,0xDDB3,0xDDAE,
+ /* plane 5, row 50 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0x9703,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0x4AC2,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,
+ 1, /* first low-surrogate */
+ 0xDC87,0xDC8A,0xDC88,0xDC8B,0xDC8C,0xDD44,0xDD2D,0xDD2A,0xDD31,
+ 0xDD2C,0xDD45,0xDD30,0xDD29,0xDD46,0xDEF4,0xDF14,0xDF10,0xDF0F,0xDF12,
+ 0xDF0B,0xDF0C,0xDF0A,0xDF13,0xDF0E,0xDFD9,0xDFD0, 0,0xDCC1,0xDCBF,
+ 0xDCBD,0xDCBC,0xDCBA,0xDCBB,0xDCD1,0xDCBE,0xDCD0,0xDCB9,0xDE1A,0xDE1C,
+ 0xDE1B,0xDE91,0xDE96,0xDE9F,0xDE9C,0xDE9A,0xDE9D,0xDFAD,0xDFA5,0xDFAE,
+ 0xDC03,0xDC26,0xDC20,0xDC23,0xDC24,0xDC21,0xDC28,0xDC25,0xDC1E,0xDC94,
+ 0xDC93,0xDC8F,0xDC9A,0xDCAD, 0,0xDDCA,0xDDC5,0xDEBB,0xDEE1,0xDEEA,
+ 0xDEE4,0xDEED,0xDEE6,0xDEE0,0xDEE8,0xDEE5,0xDC1A,0xDC94,0xDC96,0xDC9E,
+ 0xDC95,0xDCA1,0xDC8E,0xDC9B,0xDC92,0xDC97,0xDC99,0xDC93,0xDE32,0xDE2F,
+ 0xDE2E,0xDE33,0xDF1C,0xDF1E,0xDF11,
+ /* plane 5, row 51 */
+ 1 | (94 << 8), /* first, last */
+ 0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0x4CAC,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,0xD87E,
+ 0xD846,0xD840,0xD840,0xD840,0xD840,0xD841,0xD840,0x349B,0xD840,0xD841,
+ 0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0x52F6,0x3526,0xD842,0xD842,
+ 0xD842,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD844,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD844,0xD843,0xD843,0xD845,
+ 0xD845,0xD845,0xD845,0xD846,0xD846,
+ 1, /* first low-surrogate */
+ 0xDF20,0xDF1F,0xDF19,0xDF16,0xDCAC,0xDCB9,0xDCB3,0xDCA6,0xDCA2,
+ 0xDCA9,0xDCA7,0xDD6C,0xDD6D,0xDD69,0xDD80,0xDD66,0xDD65,0xDD71,0xDD6B,
+ 0xDFBD,0xDFC1,0xDFD3,0xDFB6, 0,0xDFB9,0xDFD4,0xDFB7,0xDFDB,0xDFB8,
+ 0xDFC0,0xDFBC,0xDFD5,0xDFBF,0xDFC3,0xDFC9,0xDE58,0xDE90,0xDE95,0xDE97,
+ 0xDF09,0xDF08,0xDF06,0xDF05,0xDF10,0xDF97,0xDF95,0xDFEE,0xDC1F,0xDE1A,
+ 0xDF4B,0xDD8E,0xDFE8,0xDFF0,0xDFF4,0xDC06,0xDFED, 0,0xDFE9,0xDC00,
+ 0xDCB8,0xDD6D,0xDC04,0xDC01,0xDC03,0xDC02, 0, 0,0xDD62,0xDEBA,
+ 0xDF13,0xDFDE,0xDFD7,0xDFE4,0xDFCE,0xDFE3,0xDFDD,0xDC3A,0xDFDB,0xDFD6,
+ 0xDFE0,0xDFD4,0xDFCB,0xDFE1,0xDFC9,0xDFDF,0xDC3C,0xDFFC,0xDFCF,0xDC79,
+ 0xDC76,0xDC78,0xDE87,0xDC9C,0xDCB1,
+ /* plane 5, row 52 */
+ 1 | (94 << 8), /* first, last */
+ 0xD846,0xD846,0xD846,0x41AF,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD842,0xD846,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0x3815,0xD847,0xD847,0xD848,0xD850,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0x389C,0xD848,0xD848,0xD848,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0x64CC,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,
+ 1, /* first low-surrogate */
+ 0xDCC1,0xDC9A,0xDC92, 0,0xDCC2,0xDC96,0xDCC0,0xDC91,0xDC95,
+ 0xDDA2,0xDEC3,0xDEC0,0xDEC2,0xDF8A,0xDFB0,0xDC16,0xDF46,0xDF4A,0xDF3E,
+ 0xDF45,0xDF42, 0,0xDF5B,0xDF44,0xDC04,0xDC22,0xDD55,0xDD57,0xDD51,
+ 0xDD4E,0xDD5A,0xDEC6,0xDEC3, 0,0xDEC5,0xDECC,0xDF71,0xDC26,0xDCB2,
+ 0xDD7A,0xDD84,0xDD7B,0xDC74,0xDC8C,0xDC51,0xDC48,0xDC8D,0xDC92,0xDC98,
+ 0xDC93,0xDCB0,0xDC4E,0xDC96,0xDC97,0xDC9C,0xDCCA,0xDD33,0xDD83,0xDD84,
+ 0xDD9A,0xDD8C, 0,0xDD99,0xDEE0,0xDFE4,0xDFF8,0xDFED,0xDFF3,0xDFF4,
+ 0xDFF5,0xDFFD,0xDD19,0xDE9E,0xDEC4,0xDE9F,0xDF9B,0xDF9F,0xDF9A,0xDEAA,
+ 0xDE9D,0xDE92,0xDEA2,0xDEAF,0xDEEB,0xDEA0,0xDEA1,0xDE94,0xDE98,0xDE8F,
+ 0xDE87,0xDE84,0xDEA9,0xDE7C,0xDD18,
+ /* plane 5, row 53 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0x3D64,0x3D6E,0xD850,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0x3D5F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0x3EF6,0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0x764A,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDE5F,0xDE62,0xDE61,0xDEC0,0xDF15,0xDFFC,0xDFF9,0xDFC8,0xDFC9,
+ 0xDFDE,0xDFCA,0xDFE2, 0, 0,0xDC04,0xDFCC,0xDFDD,0xDFE4,0xDFD3,
+ 0xDFC7,0xDFC6, 0,0xDC37,0xDFD8,0xDFEE,0xDFB2,0xDFA3,0xDFB3,0xDFED,
+ 0xDFF8,0xDD31,0xDD5B,0xDD66,0xDD69,0xDD96,0xDD9B,0xDDF7,0xDDF3,0xDDF4,
+ 0xDDF5,0xDEE2,0xDEE7,0xDEE5,0xDEE9,0xDEE6,0xDEE3,0xDC74,0xDC7F,0xDC8F,
+ 0xDC90,0xDC97,0xDCA3,0xDC8E,0xDC98,0xDC8C,0xDE42,0xDE44,0xDE69,0xDE43,
+ 0xDE68, 0,0xDF8D,0xDF88,0xDF8B,0xDF89,0xDCCC,0xDD1F,0xDE80,0xDE5E,
+ 0xDE67,0xDE68,0xDE65, 0,0xDE74,0xDE69,0xDE61,0xDE62,0xDE6C,0xDE93,
+ 0xDE86,0xDF9D,0xDF9B,0xDC1B,0xDC16,0xDC19,0xDC14,0xDC18,0xDC15,0xDC99,
+ 0xDC98,0xDE5D,0xDE89,0xDE7A,0xDE7D,
+ /* plane 5, row 54 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0x4073,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0x40DD,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0x7AB9,0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0x7BD7,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,
+ 1, /* first low-surrogate */
+ 0xDE4B, 0,0xDE78,0xDE7F,0xDE77,0xDE7E,0xDE79,0xDEAB,0xDE7C,
+ 0xDE74,0xDE75,0xDEA7,0xDF8D,0xDD4E,0xDD66,0xDD61,0xDD4D,0xDD4F, 0,
+ 0xDD54,0xDD7C,0xDEDA,0xDEDE,0xDED8,0xDEDD,0xDEDF,0xDC66,0xDC62,0xDC5F,
+ 0xDC64,0xDC63,0xDC60,0xDC88,0xDC6A,0xDC67,0xDC87,0xDC3F,0xDC6C,0xDC6E,
+ 0xDCAD,0xDDF1,0xDDF4,0xDDF6,0xDDF5,0xDDF8,0xDDFB,0xDDEC,0xDDEF,0xDDED,
+ 0,0xDDF7,0xDDF9,0xDDFD,0xDEB1,0xDC36,0xDC1B,0xDC32,0xDC42,0xDC4D,
+ 0xDC1F,0xDC21,0xDC1C,0xDC31,0xDC2E,0xDC47,0xDC3B,0xDC41,0xDC18,0xDC39,
+ 0xDC1D,0xDC27,0xDC23, 0,0xDEEE,0xDEE8,0xDEE5,0xDEEF,0xDEE4,0xDEEC,
+ 0xDEF0,0xDCD7,0xDCD8,0xDCD4,0xDCCA,0xDCD2,0xDCCB,0xDCD3,0xDCE6,0xDCE2,
+ 0xDE49,0xDE48,0xDEFF,0xDF09,0xDFB0,
+ /* plane 5, row 55 */
+ 1 | (94 << 8), /* first, last */
+ 0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 1, /* first low-surrogate */
+ 0xDFAF,0xDC7C,0xDC78,0xDC7A,0xDC72,0xDC79,0xDC7E,0xDD0C,0xDD0B,
+ 0xDDCD,0xDDBE,0xDDBC,0xDDBF,0xDDC0,0xDDBD,0xDC38,0xDC08,0xDC05,0xDC3B,
+ 0xDC10,0xDC0C,0xDC0D,0xDC04,0xDC3A,0xDC13,0xDC37,0xDC39,0xDD1F,0xDD4B,
+ 0xDDEE,0xDE75,0xDE78,0xDE7C,0xDE74,0xDE76,0xDEEA,0xDEEB,0xDDFB,0xDE19,
+ 0xDEA7,0xDE8C,0xDEDC,0xDE98,0xDEBE,0xDE9E,0xDF0F,0xDE9F,0xDEDD,0xDE93,
+ 0xDEBB,0xDEB6,0xDE90,0xDEA1,0xDEBD,0xDEDE,0xDE3A,0xDF22,0xDE97,0xDE94,
+ 0xDEC3,0xDE8E,0xDEA8,0xDE99,0xDEAD,0xDE9B,0xDEA2,0xDF21,0xDEAC,0xDF0E,
+ 0xDF31,0xDDE1,0xDDDE,0xDDDF,0xDDDC,0xDDDD,0xDDEC,0xDDE7,0xDF69,0xDFB8,
+ 0xDFA1,0xDFA8,0xDFBA,0xDFC2,0xDFA6,0xDFA4,0xDFA3,0xDFAB,0xDFBC,0xDFB7,
+ 0xDFBF,0xDFAD,0xDFB1,0xDFCA,0xDFC4,
+ /* plane 5, row 56 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x4688,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD842,
+ 0xD85F,0xD85F,0xD85F,0x47BB,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0x47BA,0xD85F,0xD860,0xD860,0xD860,0xD860,0x4812,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0x4861,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0x48E1,
+ 1, /* first low-surrogate */
+ 0xDFB9,0xDDC8,0xDDC6,0xDDC7,0xDF0A,0xDF0D,0xDEFB,0xDF03,0xDF02,
+ 0xDEFC,0xDEF9,0xDEF8,0xDC6E,0xDC63,0xDC62,0xDC61,0xDC6B, 0,0xDC6F,
+ 0xDC66,0xDC6C,0xDD0E,0xDD15,0xDD16,0xDD10,0xDD17,0xDD11,0xDE6E,0xDE6C,
+ 0xDE87,0xDE83,0xDE63,0xDEDC,0xDFC0,0xDFF7,0xDFFA,0xDC70,0xDC6A,0xDC68,
+ 0xDC69,0xDC84,0xDCEC,0xDCE7,0xDCEE,0xDDBA,0xDDB2,0xDDB5,0xDDCB,0xDC0B,
+ 0xDDD0,0xDE6D,0xDE6C, 0,0xDF45,0xDF46,0xDF34,0xDF2C,0xDF35,0xDF44,
+ 0,0xDF76,0xDCB1,0xDCAA,0xDCA1,0xDCB2, 0,0xDCA6,0xDCB5,0xDCB4,
+ 0xDCB8,0xDCAF,0xDCB0,0xDCA3,0xDE62,0xDE64,0xDF56,0xDF51,0xDF4F,0xDF68,
+ 0xDF4C,0xDF50, 0,0xDF48,0xDF4A,0xDC21,0xDDE3,0xDDB9,0xDDDE,0xDDB7,
+ 0xDDE1,0xDDB6,0xDDB5,0xDDDF,
+ /* plane 5, row 57 */
+ 1 | (94 << 8), /* first, last */
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,
+ 1, /* first low-surrogate */
+ 0xDF97,0xDF9A,0xDF9B,0xDF98,0xDF92,0xDF93,0xDFD7,0xDF73,0xDC6B,
+ 0xDC74,0xDC78,0xDC6D,0xDD18,0xDDE9,0xDDF5,0xDDEA,0xDE2E,0xDDE7,0xDDFE,
+ 0xDDE5,0xDE36,0xDDF0,0xDDE6,0xDE2C,0xDC89,0xDC95,0xDC93,0xDD4D,0xDD4A,
+ 0xDD4F,0xDD50,0xDD4B,0xDF2A,0xDF2B,0xDF2F,0xDF2E,0xDF7C,0xDFED,0xDFE2,
+ 0xDCE0,0xDCDC,0xDCDA,0xDCD6,0xDCF4,0xDCD9,0xDCD5,0xDE22,0xDE21,0xDE24,
+ 0xDE25,0xDE26,0xDE23,0xDEAA,0xDEAF,0xDEB0,0xDEAB,0xDFAF,0xDFB7,0xDFB5,
+ 0xDFB2,0xDFB3,0xDC2B,0xDCD8,0xDCC2,0xDCAF,0xDCBC,0xDCB8,0xDCBE,0xDCB7,
+ 0xDCB4,0xDCBF,0xDCB3,0xDCB1,0xDCBB,0xDCBD,0xDCD6,0xDCDD,0xDDD8,0xDDD3,
+ 0xDDD5,0xDDE3,0xDDE2,0xDDD9,0xDDDE,0xDDDF,0xDDDA,0xDDD4,0xDEF3,0xDEE2,
+ 0xDF0D,0xDF01,0xDF05,0xDF1A,0xDF03,
+ /* plane 5, row 58 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0x999F,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0x4B89,0xD866,0x4B8C,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0x9B8D,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0x9E77,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD864,0xD854,0xD841,0xD841,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,
+ 1, /* first low-surrogate */
+ 0xDF1F,0xDF16,0xDEFA,0xDEFC,0xDF0A, 0,0xDCBC,0xDCCA,0xDCB6,
+ 0xDCC7,0xDCBF, 0,0xDCB9, 0,0xDCB0,0xDCB8,0xDCBD,0xDC91,0xDCBB,
+ 0xDCBE,0xDE3E,0xDE3D,0xDF38,0xDF3D,0xDF39,0xDF33,0xDC33,0xDCBB,0xDCC6,
+ 0xDCC5,0xDCC7,0xDCCB,0xDCA8,0xDCC8,0xDCBE,0xDCC1,0xDCBD,0xDD82,0xDD9E,
+ 0xDD81,0xDD84, 0,0xDD96,0xDD8E,0xDD88,0xDD87,0xDFE0,0xDC0D,0xDFDF,
+ 0xDFE4,0xDFE2,0xDFDD,0xDFEC,0xDFDE,0xDFE7,0xDFEA,0xDFE3,0xDE5C, 0,
+ 0xDE5D,0xDE9C,0xDF1D,0xDF9D,0xDF9E,0xDF9B,0xDFB5,0xDFB9,0xDFB6,0xDFF3,
+ 0xDFF2,0xDFF4,0xDC26,0xDC27,0xDC25,0xDD06,0xDD0B,0xDD3A,0xDD3C,0xDC0A,
+ 0xDC0B,0xDCBF,0xDCFD,0xDE18,0xDDDF,0xDF90,0xDE9E,0xDFFC,0xDC10,0xDC0F,
+ 0xDC0D,0xDCB9,0xDCB7,0xDCBA,0xDD0A,
+ /* plane 5, row 59 */
+ 1 | (94 << 8), /* first, last */
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD843,0xD844,0xD844,
+ 0xD844,0xD844,0xD845,0xD85F,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0x381A,0xD847,
+ 0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,
+ 0xD849,0xD84A,0xD84A,0xD84A,0x3998,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,
+ 0xD84D,0xD84D,0x3BF1,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84E,0x6BA9,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD850,0xD84F,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,
+ 1, /* first low-surrogate */
+ 0xDC41,0xDC8B,0xDC46,0xDC53,0xDCE2,0xDC3F,0xDF7C,0xDC4B,0xDC4E,
+ 0xDC8A,0xDC47,0xDC93,0xDDCE,0xDC8C,0xDCAF,0xDCC9,0xDDC6,0xDDC8,0xDE91,
+ 0xDCCF,0xDCD4,0xDCCE,0xDEDD,0xDED4,0xDF49,0xDF63,0xDF5D, 0,0xDF67,
+ 0xDFBB,0xDF60,0xDF80,0xDD5F,0xDD60,0xDEDA,0xDED2,0xDEDD,0xDD8E,0xDD88,
+ 0xDD6C,0xDC9E,0xDCC9,0xDCA4, 0,0xDCD9,0xDCD2,0xDCDA,0xDCDD,0xDCCE,
+ 0xDCFC,0xDE14,0xDE60,0xDDD7,0xDDCB,0xDDCD,0xDDD5,0xDEE7,0xDC00,0xDC0A,
+ 0xDC0F,0xDC02,0xDC01,0xDD1D,0xDECA,0xDECB,0xDECD,0xDF4F,0xDF9C,0xDE80,
+ 0xDF0D,0xDF02, 0,0xDF07,0xDEF7,0xDEF8,0xDEFD,0xDF24,0xDEFB,0xDF39,
+ 0xDF3A,0xDD22, 0,0xDE6A,0xDE6D,0xDE74,0xDC0E,0xDFDF,0xDC2B,0xDFE3,
+ 0xDC26,0xDC2A,0xDC23,0xDC35,0xDC4A,
+ /* plane 5, row 60 */
+ 1 | (94 << 8), /* first, last */
+ 0xD850,0xD851,0xD851,0xD850,0xD851,0xD851,0xD851,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0x3F6A,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0x764B,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0x76A2,0xD853,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0x4485,0xD854,0xD854,0xD854,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x4239,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0x423D,0x4244,
+ 1, /* first low-surrogate */
+ 0xDFFD,0xDC00,0xDC1E,0xDFFF,0xDD9E,0xDDFA,0xDEF1,0xDC95,0xDCA8,
+ 0xDCA6,0xDE6E,0xDE83,0xDE6D,0xDF8F, 0,0xDCDF,0xDCD5,0xDCE0,0xDCD3,
+ 0xDCD8,0xDE8C, 0,0xDE94,0xDE96,0xDE85,0xDE8F,0xDEA9,0xDE8E,0xDE90,
+ 0xDEB8,0xDEC3,0xDEBB,0xDFA5,0xDFA2, 0,0xDFA3,0xDCB5,0xDCAC,0xDCA8,
+ 0xDEAD,0xDEB8,0xDEB4,0xDEAE,0xDEB6, 0,0xDEC1,0xDEBF,0xDF92,0xDC00,
+ 0xDC01,0xDD75,0xDD72,0xDD78,0xDD70,0xDD7E,0xDD7D,0xDD7F,0xDEEF,0xDC6D,
+ 0xDC8E,0xDC8F,0xDC8A,0xDC8D,0xDC95,0xDC8B,0xDC8C,0xDCB0,0xDC93,0xDDFC,
+ 0xDE15,0xDE0E,0xDE18,0xDE11,0xDE0D,0xDEBB,0xDEB3, 0,0xDCA1,0xDC9A,
+ 0xDC84,0xDCA0,0xDC86,0xDC9D,0xDCAA,0xDC78,0xDC8D,0xDC8A,0xDCA6,0xDC7A,
+ 0xDC97,0xDC88,0xDC8E,
+ /* plane 5, row 61 */
+ 1 | (94 << 8), /* first, last */
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x4246,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD858,0x430E,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0x4310,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0x443E,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD856,0xD85A,0xD85A,
+ 0xD85A,0x4484,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x4549,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 1, /* first low-surrogate */
+ 0xDC76,0xDC81,0xDC85,0xDC75,0xDCA8,0xDC8F,0xDC91,0xDCA2,0xDC9C,
+ 0xDC89,0xDC7F,0xDC96,0xDC79,0xDC9F,0xDCA7, 0,0xDC87,0xDC9B,0xDCA5,
+ 0xDC8B,0xDCC9,0xDEFF,0xDF03,0xDF00,0xDF02,0xDF04,0xDF05,0xDEE6,0xDF1F,
+ 0xDD14, 0,0xDD0C,0xDD0F,0xDD19,0xDD0B,0xDD13,0xDCD5, 0,0xDD1C,
+ 0xDE50,0xDE4E,0xDF12,0xDFB9,0xDC85,0xDC88,0xDC90,0xDD13,0xDDD0,0xDDD1,
+ 0xDDD2,0xDDD7,0xDDD6,0xDDE5,0xDC46,0xDC6B,0xDC45,0xDC3F,0xDC3E, 0,
+ 0xDC6A,0xDC68,0xDC4C,0xDD23,0xDD22,0xDD97,0xDD91,0xDEB5,0xDD98,0xDD9C,
+ 0xDE89, 0,0xDE8B,0xDE8A,0xDE8D,0xDE8E,0xDE88,0xDF4E,0xDF44,0xDF37,
+ 0xDF75,0xDF54,0xDF76,0xDF34,0xDF6B,0xDF32,0xDF57,0xDF52,0xDF45, 0,
+ 0xDEB1,0xDF4B,0xDF47,0xDF33,0xDF40,
+ /* plane 5, row 62 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85D,0xD85C,
+ 0xD85D,0xD85D,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x45DF,0xD85D,
+ 0xD85D,0x45F0,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x468A,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0x4702,0xD85E,0xD85E,0xD85E,0xD85F,0xD85E,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x47C0,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0x4815,0xD860,0xD860,0xD860,
+ 1, /* first low-surrogate */
+ 0xDF3C,0xDF43,0xDF4F,0xDF55,0xDF41,0xDFB2,0xDFC0,0xDC34,0xDFF9,
+ 0xDC19,0xDC0D,0xDFFA,0xDC1E,0xDC1F,0xDC0E,0xDC40,0xDC08, 0,0xDC13,
+ 0xDC4C, 0,0xDDCC,0xDDCB,0xDF24,0xDF25,0xDF3D,0xDF20,0xDF27,0xDF26,
+ 0xDF1D,0xDF1E,0xDF32,0xDF6C,0xDF59, 0,0xDC7A,0xDC79,0xDD1B,0xDD2E,
+ 0xDD23,0xDD20,0xDD1F,0xDEB6,0xDEB9,0xDEA1,0xDEA3,0xDEA8,0xDEAF,0xDE9A,
+ 0xDE99,0xDEA2,0xDE9D, 0,0xDEAB,0xDFC9,0xDFFE,0xDC00,0xDFFC,0xDC07,
+ 0xDC75,0xDC72,0xDC73,0xDC74,0xDCFA,0xDCFC,0xDCF8,0xDCF6,0xDCFB,0xDDCD,
+ 0xDDD1,0xDDCF,0xDE74,0xDE72,0xDE73,0xDF54,0xDF51, 0,0xDF53,0xDF49,
+ 0xDF4C,0xDF4A,0xDF4F,0xDF56,0xDD00,0xDCD5,0xDCD7,0xDCFF,0xDCD9,0xDCE3,
+ 0xDCD3, 0,0xDCD8,0xDCD4,0xDCDE,
+ /* plane 5, row 63 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0x48E2,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD87E,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,
+ 1, /* first low-surrogate */
+ 0xDE71,0xDF74,0xDF88,0xDF7F,0xDF6B,0xDF87,0xDF79,0xDF78,0xDF89,
+ 0xDF80,0xDF76,0xDC29,0xDC28,0xDC2F,0xDDE5,0xDE04,0xDE03,0xDDF0,0xDDE8,
+ 0xDDEA,0xDDF1,0xDE01,0xDE02,0xDFA9,0xDFAB,0xDFB7,0xDFB6, 0,0xDCA0,
+ 0xDC8E,0xDC86,0xDC87,0xDC85,0xDC8B,0xDC88,0xDC90,0xDD1A,0xDD34,0xDE37,
+ 0xDE2F,0xDE30,0xDE39,0xDE34,0xDE33,0xDE85,0xDE84,0xDE3A,0xDC9F,0xDD69,
+ 0xDD6C,0xDD6A,0xDD67,0xDD6B,0xDF3F,0xDF40,0xDC0B,0xDCD2,0xDCF8,0xDD01,
+ 0xDCFA,0xDD16,0xDDF6,0xDE2C,0xDE2D,0xDE2F,0xDE2E,0xDEC1,0xDEF5,0xDEC4,
+ 0xDEDE,0xDECC,0xDED2,0xDEC2,0xDECD,0xDECF,0xDEDD,0xDEC8,0xDFBA,0xDFBE,
+ 0xDFBF,0xDC2E,0xDC30,0xDCE7,0xDCEE,0xDCE8,0xDCE6,0xDCE2,0xDCE4,0xDCFB,
+ 0xDCFC,0xDCEA,0xDDED,0xDDF6,0xDDF3,
+ /* plane 5, row 64 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0x4B4D,0xD865,0xD865,0xD865,0xD865,0x4B4A,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,
+ 1, /* first low-surrogate */
+ 0xDDF4,0xDDF1,0xDDF7,0xDDF5,0xDDEA,0xDDEB,0xDF00,0xDF2C,0xDF12,
+ 0xDF3D,0xDF33, 0,0xDF30,0xDF40,0xDF31,0xDF57, 0,0xDF35,0xDF32,
+ 0xDF2D,0xDF36,0xDF38,0xDF62,0xDF5F,0xDF8A,0xDCD6,0xDCD8,0xDCDD,0xDCE4,
+ 0xDCE3,0xDE4D,0xDED7,0xDF4A,0xDF4C,0xDF50,0xDF4B,0xDF4E,0xDF4F,0xDC39,
+ 0xDCD2,0xDCCD,0xDCD3,0xDCE1,0xDCCE,0xDCD5,0xDCDD,0xDCD4,0xDCCF,0xDDCB,
+ 0xDDA6,0xDDC2,0xDDA5,0xDDA9,0xDDA2,0xDDA4,0xDDB0,0xDDCC,0xDDAF,0xDDBF,
+ 0xDC24,0xDC1A,0xDC14,0xDC3A,0xDC20,0xDC1B,0xDC21,0xDC25,0xDC1E,0xDC3F,
+ 0xDC40,0xDC18,0xDC2C,0xDC15,0xDC2D,0xDC1F,0xDC29,0xDC4B,0xDEB3,0xDEA5,
+ 0xDEA7,0xDEAB,0xDEA6,0xDEAA,0xDF22,0xDF23,0xDFA1,0xDFA3,0xDFA0,0xDFBD,
+ 0xDFBA,0xDFFA,0xDFF8,0xDFFC,0xDFF6,
+ /* plane 5, row 65 */
+ 1 | (94 << 8), /* first, last */
+ 0xD869,0xD869,0x4D63,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0x4D93,0xD869,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0x350E,0xD842,0xD844,
+ 0xD844,0xD844,0x360A,0xD844,0xD844,0xD844,0xD844,0x360D,0xD844,0xD845,
+ 0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 1, /* first low-surrogate */
+ 0xDC34,0xDC43, 0,0xDCD4,0xDD0D,0xDD43,0xDD41,0xDD3D,0xDD40,
+ 0xDD3E,0xDD3F,0xDD46, 0,0xDDD4,0xDC35,0xDC36,0xDC32,0xDC3A,0xDCC8,
+ 0xDD36,0xDE1E,0xDE1D,0xDE1F,0xDC1C,0xDC1D,0xDC20, 0,0xDCC0,0xDC9A,
+ 0xDC93,0xDCDD, 0,0xDCA3,0xDCA9,0xDC9C,0xDC9B, 0,0xDC97,0xDCB1,
+ 0xDCCA,0xDCB3,0xDCCD,0xDCEA,0xDCEE,0xDCEF,0xDEDF,0xDF50,0xDFBB,0xDF88,
+ 0xDF89,0xDF8C,0xDF85,0xDF5E,0xDF94,0xDF95,0xDD6B,0xDD6A,0xDD69,0xDEE3,
+ 0xDEF1,0xDC37,0xDC33,0xDD91,0xDD8F,0xDD97,0xDCD4,0xDCDE,0xDCD3,0xDCE0,
+ 0xDD43,0xDD0B,0xDCFF,0xDD04,0xDD07,0xDDF9,0xDDFA,0xDDFB,0xDDF8,0xDC12,
+ 0xDC10,0xDD1F,0xDEDF,0xDEE3,0xDF52,0xDFA9,0xDF65,0xDF87,0xDF42,0xDF52,
+ 0xDF4C,0xDE9F,0xDF01,0xDF48,0xDF4F,
+ /* plane 5, row 66 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD854,0x4074,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD856,0xD856,0xD856,
+ 1, /* first low-surrogate */
+ 0xDF7E,0xDF4D,0xDF58,0xDF47,0xDF5E,0xDF49,0xDF4E,0xDF5D,0xDF5A,
+ 0xDF86,0xDF51,0xDD29,0xDDA6,0xDDA7,0xDE70,0xDE6F,0xDED3,0xDED2,0xDC28,
+ 0xDC1B,0xDC1A,0xDC1C,0xDC21,0xDC32,0xDC66,0xDC7D,0xDC73,0xDC7F,0xDC65,
+ 0xDC80,0xDC61,0xDC75,0xDC6E,0xDC67,0xDC71,0xDC6C,0xDC63,0xDC62,0xDC83,
+ 0xDCB2,0xDC81,0xDC6F,0xDC6B,0xDC82,0xDC8A,0xDC29,0xDC30,0xDC31,0xDD97,
+ 0xDE00,0xDDFF,0xDCB6,0xDCB5,0xDCC3,0xDE8D,0xDF18,0xDF9C,0xDF9A,0xDF99,
+ 0xDEB7,0xDEC4,0xDEC6,0xDEC7,0xDEBC,0xDEC0,0xDEC5,0xDECD,0xDEC1,0xDEBE,
+ 0xDFA7,0xDFB8,0xDC23, 0,0xDEE8,0xDEDE,0xDEE3,0xDEEF,0xDEDC,0xDEE4,
+ 0xDEE1,0xDEE5,0xDF95,0xDF94,0xDF93,0xDF8E,0xDD98,0xDD9C,0xDD99,0xDDA0,
+ 0xDD9E,0xDF04,0xDCD3,0xDCB4,0xDCBB,
+ /* plane 5, row 67 */
+ 1 | (94 << 8), /* first, last */
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0x4256,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0x425A,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x42A3,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0x42A8,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,
+ 1, /* first low-surrogate */
+ 0xDCB7,0xDCB8,0xDCBD,0xDCB6,0xDCB9,0xDCB5,0xDE22,0xDE21,0xDEC3,
+ 0xDEBC,0xDCFF,0xDCE5,0xDCF7,0xDCD2,0xDD00,0xDCDB,0xDCF0,0xDCE2,0xDCCD,
+ 0,0xDCE1,0xDCF2,0xDCDC,0xDCCC,0xDCD6,0xDCF3,0xDCFA,0xDCF6,0xDCEC,
+ 0xDCEA,0xDCE3,0xDCD0, 0,0xDC95,0xDCD5,0xDCF4,0xDCCB,0xDCDA,0xDCC8,
+ 0xDCDF,0xDCF5,0xDCCF,0xDCC7,0xDCD7,0xDF24, 0,0xDF1C,0xDF21,0xDF1E,
+ 0xDF18,0xDF1B, 0,0xDD46,0xDD4B,0xDD48,0xDD47,0xDD67,0xDD54,0xDF15,
+ 0xDF22,0xDFC5,0xDF29,0xDFC7,0xDC8D,0xDD1B,0xDD20,0xDDE2,0xDDE7,0xDDE8,
+ 0xDDE1,0xDC72,0xDC7B,0xDC74,0xDC71,0xDC79,0xDC75,0xDC90,0xDC77,0xDC7D,
+ 0xDD4F,0xDD50,0xDDA3,0xDDA2,0xDDF4,0xDE94,0xDE9A,0xDE9B,0xDEA7,0xDE97,
+ 0xDE95,0xDE92,0xDE9C,0xDE96,0xDFB6,
+ /* plane 5, row 68 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85B,0xD85B,0xD85C,0xD85B,0xD85B,0xD85B,0xD85C,0xD85C,0xD85B,
+ 0xD85C,0xD85B,0xD85B,0x453C,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85C,0xD85B,0xD85C,0xD85B,0xD85B,0x459B,0x459A,0xD85C,0xD85C,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0x87F1,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0x465E,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0x46A7,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 1, /* first low-surrogate */
+ 0xDFB8,0xDFB0,0xDC18,0xDFC5,0xDFB5,0xDFC2,0xDC06,0xDC19,0xDFB9,
+ 0xDC15,0xDFD6,0xDFAC, 0,0xDFC6,0xDFB3,0xDFC3,0xDFCA,0xDFCF,0xDFBD,
+ 0xDFCE,0xDC14,0xDFBA,0xDC1A,0xDFC1,0xDFBB, 0, 0,0xDE01,0xDDFC,
+ 0xDC5A,0xDC54,0xDC61,0xDC5C,0xDC55,0xDC4A,0xDC4B,0xDC51,0xDC69,0xDC6B,
+ 0,0xDC66,0xDC58,0xDC5D,0xDC67,0xDC56,0xDC88,0xDC64,0xDC4E,0xDF57,
+ 0xDF5A,0xDF51,0xDF4A,0xDF4B, 0,0xDF47,0xDF6F,0xDF6A,0xDF6B,0xDF46,
+ 0xDF6D,0xDF54,0xDF6E,0xDF4C,0xDC78,0xDC86,0xDC82, 0,0xDEE1,0xDEE5,
+ 0xDEDB,0xDEDE,0xDED7,0xDC03,0xDC7C,0xDC7E,0xDD05,0xDD07,0xDDE6,0xDDE1,
+ 0xDDFB,0xDDE5,0xDDE7,0xDDDF,0xDDFF,0xDE76,0xDF63,0xDF66,0xDF65,0xDF5E,
+ 0xDF64,0xDF6B,0xDF5F,0xDF67,0xDF68,
+ /* plane 5, row 69 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0x486E,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0x490D,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0x4943,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0x4A73,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0x4A74,0xD864,0xD864,0x4A70,
+ 1, /* first low-surrogate */
+ 0xDD08,0xDD09,0xDD17,0xDD15,0xDD1B,0xDD0B,0xDD28,0xDD0E,0xDD18,
+ 0xDD53,0xDD45,0xDD0D,0xDD0A,0xDD13,0xDD4A,0xDE79,0xDFA1,0xDF8D,0xDFA2,
+ 0xDF90, 0,0xDC31,0xDC30,0xDE1F,0xDE19,0xDE0C,0xDE1E,0xDE1D,0xDE07,
+ 0xDF66,0xDFC5,0xDFBA,0xDFBD,0xDFC2,0xDFC3,0xDFBF, 0,0xDCA1,0xDCA2,
+ 0xDCA8,0xDCA3,0xDCAA,0xDCAF,0xDCB9,0xDD37,0xDE8F, 0,0xDE8E,0xDE87,
+ 0xDE8A,0xDE92,0xDE97,0xDE9F,0xDF05,0xDCA9,0xDCA7,0xDD8A,0xDD82,0xDD85,
+ 0xDD8B,0xDD89,0xDD81,0xDD80,0xDD87,0xDD86,0xDF4D,0xDC1C,0xDC1F,0xDD21,
+ 0xDD1D,0xDD22,0xDCFE,0xDD1B,0xDD3A,0xDD37,0xDD17,0xDD38,0xDD26,0xDD18,
+ 0xDE34,0xDE35,0xDE32, 0,0xDEE1,0xDEFD,0xDEE3,0xDEE8,0xDEF9,0xDEFF,
+ 0xDEFE, 0,0xDEE0,0xDF00,
+ /* plane 5, row 70 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0x4BDB,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0x4C29,0xD867,0xD867,0xD867,0xD867,0xD867,0x4C51,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0x9BBA,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,
+ 1, /* first low-surrogate */
+ 0xDEEC,0xDEE4,0xDEEF,0xDEFA,0xDFCA,0xDC31,0xDC32,0xDC34,0xDC41,
+ 0xDD00,0xDD06,0xDD08,0xDD05,0xDD03,0xDD0B,0xDD02,0xDD0A,0xDDF0,0xDE13,
+ 0xDE0A,0xDE0F,0xDE11,0xDE08,0xDE0B,0xDE12,0xDE0D,0xDF5B,0xDF63,0xDF61,
+ 0xDF68,0xDF5A,0xDC4E,0xDC4D,0xDC50,0xDCFC,0xDD12,0xDCF5,0xDD1E,0xDCF0,
+ 0xDCF3,0xDCF2,0xDD01,0xDCEF,0xDCEE,0xDD16,0xDCF6,0xDCFB,0xDD1C, 0,
+ 0xDE5D,0xDE60,0xDE66,0xDE5F,0xDE61,0xDE5B,0xDE62,0xDE57,0xDF69,0xDF6B,
+ 0xDF61,0xDF77,0xDF5F,0xDF63,0xDF62,0xDF65,0xDCEF,0xDCE2,0xDD00,0xDCE8,
+ 0xDCF2,0xDCE7, 0,0xDCE5,0xDDD5,0xDDD0,0xDDDA,0xDDD3, 0,0xDDD9,
+ 0xDDCF,0xDDD6,0xDDD8,0xDDF5,0xDDCE,0xDDD7,0xDDF4,0xDDCD,0xDE01, 0,
+ 0xDC52,0xDC55,0xDC5A,0xDC4D,0xDC54,
+ /* plane 5, row 71 */
+ 1 | (94 << 8), /* first, last */
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0x4CDB,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,0xD868,0xD869,0x4D65,
+ 0xD869,0xD869,0x4D64,0x4D67,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD842,0xD842,0xD844,0xD844,0x3611,0xD844,0xD844,
+ 0xD844,0xD845,0x3733,0xD846,0xD846,0xD846,0xD847,0x3821,0x3822,0xD847,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0x39A6,0xD84A,0xD84A,0xD84A,0xD84A,0x39A3,0xD84B,
+ 0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,
+ 1, /* first low-surrogate */
+ 0xDC53,0xDC5E,0xDC67,0xDC65,0xDC4E, 0,0xDC4F,0xDC61,0xDC6E,
+ 0xDC51,0xDC5B,0xDE63,0xDEB7,0xDEB6,0xDEC3,0xDEBB,0xDEB5,0xDF2E,0xDF30,
+ 0xDF33,0xDF31,0xDFA4,0xDFC1,0xDFBB,0xDFBE,0xDC00,0xDFFF,0xDC40, 0,
+ 0xDC3F,0xDC44, 0, 0,0xDCDB,0xDD0F,0xDD11,0xDD4E,0xDD4D,0xDD4B,
+ 0xDD4C,0xDD95,0xDC3B,0xDC45,0xDC44,0xDC3E,0xDC3C,0xDC3F,0xDCCC,0xDCCE,
+ 0xDE22,0xDE23,0xDE9F,0xDCC5,0xDCC4,0xDCE9,0xDC99, 0,0xDCE6,0xDCE7,
+ 0xDCF7,0xDCD2, 0,0xDCFD,0xDD0C,0xDD0B,0xDCED, 0, 0,0xDF9B,
+ 0xDC0A,0xDD6F,0xDD75,0xDEF2,0xDEF8,0xDC3E,0xDD24,0xDD0E,0xDD16,0xDD18,
+ 0xDD10,0xDD31,0xDD44, 0,0xDD29,0xDD2F,0xDD4B,0xDD36, 0,0xDE34,
+ 0xDE00,0xDE2B,0xDC20,0xDC21,0xDC1E,
+ /* plane 5, row 72 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,
+ 0xD84F,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0x3EA1,0xD852,0xD852,
+ 0xD852,0xD852,0xD868,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0x425F,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x425C,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD859,0xD859,
+ 1, /* first low-surrogate */
+ 0xDC1D,0xDEF5,0xDEF2,0xDEF6,0xDF90,0xDF9D,0xDF9C,0xDF92,0xDF94,
+ 0xDFD1,0xDF93,0xDFB7,0xDF97,0xDFB0,0xDF9F,0xDFC9,0xDD2D,0xDD2C,0xDE77,
+ 0xDC2C,0xDCC0,0xDCB9,0xDC53,0xDD40,0xDF02,0xDEFB, 0,0xDE8B,0xDEAE,
+ 0xDEAB,0xDFA1,0xDECD,0xDCEA,0xDEDD,0xDEDC,0xDED9,0xDFAB,0xDFAC,0xDFAD,
+ 0xDFB2,0xDC2C,0xDC2B,0xDCC2,0xDF00,0xDF0D,0xDF06,0xDEFF,0xDF03,0xDF01,
+ 0xDF10,0xDF0F,0xDF05,0xDF98,0xDF97,0xDF96,0xDF99,0xDDAC,0xDDAB,0xDF12,
+ 0xDCD8,0xDCDF,0xDCD6,0xDE2D,0xDE32,0xDD3F,0xDD2F,0xDD26,0xDD3A,0xDD39,
+ 0,0xDD3B,0xDD35,0xDD2A,0xDD21,0xDD38,0xDD37,0xDD34, 0,0xDD22,
+ 0xDD36,0xDD44,0xDF45,0xDF3B,0xDF36,0xDF42,0xDD7A,0xDD86,0xDD8B,0xDD7F,
+ 0xDD81,0xDF2A,0xDFD5,0xDC9F,0xDC9D,
+ /* plane 5, row 73 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85D,0x45F5,0xD85D,0x8804,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x4711,
+ 0x470C,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD841,0xD861,0xD861,
+ 1, /* first low-surrogate */
+ 0xDD26,0xDDF4,0xDDF5,0xDC15,0xDC8E,0xDC8F,0xDD26,0xDDA7,0xDDAF,
+ 0xDEAD,0xDEAC,0xDEAB,0xDEAA,0xDC2F,0xDC21,0xDC23,0xDCA3,0xDC49,0xDC3A,
+ 0xDC48,0xDC2D,0xDC25,0xDC29,0xDC32,0xDC34,0xDC24,0xDC2C,0xDC4B,0xDC3B,
+ 0xDC20,0xDC28,0xDC98, 0,0xDC97, 0,0xDC9D,0xDCA8,0xDDD5,0xDF77,
+ 0xDF78,0xDF72,0xDF73,0xDC02,0xDD3B,0xDEFE,0xDF0B,0xDEFF,0xDF07, 0,
+ 0,0xDF30,0xDFCD,0xDFCF,0xDC10,0xDC0A,0xDC83,0xDD15,0xDD0E,0xDD0C,
+ 0xDE02,0xDDFE,0xDE05,0xDE15,0xDE08,0xDF7F,0xDF77,0xDF7C,0xDF82,0xDF7E,
+ 0xDF78,0xDF7D,0xDF79,0xDF81,0xDD4B,0xDD63,0xDD64,0xDD56,0xDD54,0xDD4E,
+ 0xDD10,0xDD4F,0xDD57,0xDD5E,0xDD51,0xDD6A,0xDD69,0xDFAD,0xDFA4,0xDFAC,
+ 0xDFA9,0xDFAE,0xDC4C,0xDE50,0xDE35,
+ /* plane 5, row 74 */
+ 1 | (94 << 8), /* first, last */
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0x494E,
+ 0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,0x4B94,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,
+ 1, /* first low-surrogate */
+ 0xDE32,0xDFD8,0xDFD1,0xDFCF,0xDFBE,0xDCD5,0xDCC1,0xDCC6,0xDCC3,
+ 0xDCC2,0xDCC0,0xDCC5,0xDCC7,0xDCBF,0xDCC4,0xDCD4,0xDE90,0xDED2, 0,
+ 0xDED4,0xDCAF,0xDCAE,0xDCB2,0xDCAD,0xDD9C,0xDDA0,0xDDB6,0xDF3D,0xDF56,
+ 0xDF82,0xDC28,0xDC2B,0xDD3C,0xDD3E,0xDD3F,0xDD42,0xDD3D,0xDD41,0xDD3B,
+ 0xDD49,0xDD43,0xDE39,0xDE38,0xDF22,0xDF08,0xDF0C,0xDF06,0xDF13,0xDF04,
+ 0xDF20,0xDF1D,0xDF05,0xDF0A,0xDFD6,0xDFD7,0xDC36,0xDC37,0xDD23,0xDD22,
+ 0xDD20,0xDD1A,0xDD1D,0xDE1C,0xDE20,0xDE77,0xDF7F,0xDF8B,0xDF7D,0xDF99,
+ 0xDF84,0xDF89,0xDF85,0xDF83,0xDF86,0xDF9E,0xDC53,0xDD17, 0,0xDD19,
+ 0xDD20,0xDD1F,0xDD23,0xDD18,0xDD21,0xDD29,0xDD24,0xDD26,0xDE5E,0xDE6F,
+ 0xDE6E,0xDE74,0xDE72,0xDE73,0xDF7D,
+ /* plane 5, row 75 */
+ 1 | (94 << 8), /* first, last */
+ 0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0x4C63,0xD867,0xD867,0xD867,0xD867,0xD867,0x4C61,0xD867,0x9BD8,
+ 0xD867,0x4C5A,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0x4CE3,0xD868,
+ 0xD868,0x9D7C,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0x4DAF,0xD869,0xD841,0xD841,0xD841,0xD84C,0xD844,
+ 0xD844,0xD844,0xD844,0x3613,0xD844,0xD844,0x3680,0xD845,0xD845,0xD846,
+ 0xD846,0xD846,0xD846,0xD847,0xD847,
+ 1, /* first low-surrogate */
+ 0xDF7E,0xDF85,0xDF7F,0xDF84,0xDC44,0xDCF5,0xDCF8,0xDD03,0xDCF6,
+ 0xDE28, 0,0xDE39,0xDDFB,0xDE0E,0xDDFD,0xDE1F, 0,0xDE03, 0,
+ 0xDE10, 0,0xDE0D,0xDE27,0xDE41,0xDC72,0xDC78,0xDC80, 0,0xDC85,
+ 0xDC7B, 0,0xDC7D,0xDC91,0xDC88,0xDCAA,0xDC8D,0xDC89,0xDC95,0xDC9B,
+ 0xDC8C,0xDC9E,0xDC7C,0xDC86,0xDC84,0xDE68,0xDEC5,0xDEC4,0xDEC9,0xDEC6,
+ 0xDF42,0xDF45,0xDF41,0xDF44,0xDFA6,0xDFC2,0xDC42,0xDC49,0xDC48,0xDC4A,
+ 0xDC4C,0xDC4B,0xDD17,0xDD18,0xDD15,0xDD52,0xDD54,0xDD53,0xDD9A,0xDD9B,
+ 0xDDDC,0xDDE4,0xDE91, 0,0xDEBA,0xDC51,0xDC5B,0xDCCF,0xDF05,0xDD13,
+ 0xDD15,0xDD14,0xDD23, 0,0xDD11,0xDD12, 0,0xDCF0,0xDE9B,0xDD12,
+ 0xDD16,0xDD17,0xDDB5,0xDCF4,0xDFB1,
+ /* plane 5, row 76 */
+ 1 | (94 << 8), /* first, last */
+ 0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0x4DB0,0xD850,0xD864,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD853,0xD853,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x7C46,
+ 0xD857,0xD857,0xD857,0xD87E,0xD857,
+ 1, /* first low-surrogate */
+ 0xDD79,0xDEFF,0xDEFC,0xDEFB,0xDC3F,0xDC44,0xDD9D,0xDD32,0xDD4C,
+ 0xDD2B,0xDD5A,0xDE1F,0xDE01,0xDE2D,0xDE27,0xDE59,0xDE5A,0xDE4D,0xDE58,
+ 0xDC23,0xDC25,0xDC2B,0xDEFF,0xDFAE,0xDFCB,0xDFCA,0xDFD0,0xDFCE,0xDFCC,
+ 0xDFD8,0xDFC6,0xDFD2,0xDFCF,0xDFC8,0xDF17, 0,0xDCC4,0xDE40,0xDCE9,
+ 0xDCF2,0xDCFC,0xDCEA,0xDCEB,0xDCFD,0xDC78,0xDC77,0xDC73,0xDC9E,0xDC79,
+ 0xDDA2,0xDE03,0xDF04,0xDF05,0xDCCE,0xDEBF,0xDEF6,0xDEF7,0xDC31,0xDC30,
+ 0xDCC9,0xDCC7,0xDF1C,0xDF28,0xDF1A,0xDF1E,0xDF1B,0xDF1F,0xDDBF,0xDDBB,
+ 0xDDBC,0xDDC0,0xDF1A,0xDCEF,0xDCEC,0xDCE9,0xDCF0,0xDCFE,0xDE34,0xDD6A,
+ 0xDD95,0xDD6C,0xDD72,0xDD67,0xDD60,0xDD6B,0xDD5E,0xDD6F,0xDD66, 0,
+ 0xDD62,0xDD5D,0xDD5C,0xDD65,0xDF50,
+ /* plane 5, row 77 */
+ 1 | (94 << 8), /* first, last */
+ 0xD858,0x4323,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD85A,0xD85A,0x4449,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD842,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0x45FA,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD869,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,
+ 1, /* first low-surrogate */
+ 0xDD9F, 0,0xDD9E,0xDDA6,0xDF35,0xDF38,0xDF36,0xDF3A,0xDFDC,
+ 0xDC7C,0xDCAB, 0,0xDCA8,0xDCA7,0xDD2B,0xDD2C,0xDD28,0xDD2B,0xDDA9,
+ 0xDDAA,0xDDAB,0xDDF8,0xDEB1,0xDEF0,0xDEEF,0xDCA8,0xDC8B,0xDC94,0xDC9E,
+ 0xDC8F,0xDC88,0xDC7E,0xDC81,0xDC30,0xDC9B,0xDC82,0xDC90,0xDC85,0xDC7F,
+ 0xDCA9,0xDCDE,0xDE0D, 0,0xDCCF,0xDCCB,0xDCD8,0xDCDD,0xDCD3,0xDCD0,
+ 0xDCD5,0xDCD6,0xDDD6,0xDF92,0xDF95,0xDDCB,0xDF8D,0xDF9B,0xDF9D,0xDF8F,
+ 0xDF9E,0xDFA6,0xDC96,0xDC92,0xDF16,0xDF2A,0xDF29,0xDF2C,0xDC15,0xDC12,
+ 0xDC11,0xDC13,0xDC88,0xDC8B,0xDC8A,0xDC87,0xDD17,0xDD16,0xDD1A,0xDE19,
+ 0xDE17,0xDF91,0xDF94,0xDD8B,0xDD90,0xDD8F,0xDD86,0xDD83,0xDD8E,0xDD87,
+ 0xDDA8,0xDD85,0xDDA6,0xDD82,0xDDA7,
+ /* plane 5, row 78 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0x4959,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0x4A7E,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0x4BA8,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0x4BA9,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,
+ 1, /* first low-surrogate */
+ 0xDFB9,0xDFB7,0xDFB4,0xDFB6,0xDFB3,0xDFC6,0xDE3C,0xDE40,0xDE38,
+ 0xDF91,0xDFA6,0xDFDA,0xDCDA,0xDCD8,0xDCD9,0xDCDB,0xDCD7,0xDF16,0xDF12,
+ 0xDF1F, 0,0xDF14,0xDF1A,0xDF10,0xDCB3,0xDDAE,0xDDC1,0xDDB0,0xDDAF,
+ 0xDDB1,0xDDAD,0xDDB2,0xDDC4,0xDC3C,0xDC3F,0xDD61,0xDD66,0xDE3C,0xDE3B,
+ 0xDF2C, 0,0xDF2A,0xDF3E,0xDF2F,0xDF32,0xDF27,0xDF29,0xDF40,0xDFDF,
+ 0xDFDE,0xDC3C,0xDC3B,0xDC3E,0xDD21,0xDD46,0xDD3C,0xDD36,0xDD38,0xDD35,
+ 0xDE31,0xDE36,0xDE2D,0xDE33,0xDE2F,0xDE2E,0xDE35,0xDFAC,0xDFA9,0xDFA6,
+ 0,0xDD4C,0xDD43,0xDD41,0xDD4F,0xDD42,0xDD51, 0,0xDD40,0xDD50,
+ 0xDD45,0xDD4A,0xDD4B,0xDE83,0xDE82,0xDE81,0xDEE0,0xDF98,0xDF9F,0xDF9B,
+ 0xDF9A,0xDF99,0xDF96,0xDFAE,0xDF9E,
+ /* plane 5, row 79 */
+ 1 | (94 << 8), /* first, last */
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,
+ 0x4D54,0xD869,0x4D56,0xD869,0xD869,0xD869,0x4D6D,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0x4D8E,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD841,0xD841,0xD842,0xD842,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD847,0xD847,
+ 0xD847,0xD848,0xD849,0xD849,0xD849,
+ 1, /* first low-surrogate */
+ 0xDD09,0xDD0D,0xDE4E,0xDE4A,0xDE4D,0xDE40,0xDE3E,0xDE48,0xDE42,
+ 0xDE62,0xDE45,0xDE51,0xDCC6,0xDCD0,0xDCC0,0xDCB7,0xDCC2,0xDCBC,0xDCC5,
+ 0xDCDC,0xDCDB,0xDCD2,0xDCC7,0xDCB6,0xDCC9,0xDCCC,0xDCD1,0xDCCD,0xDCDA,
+ 0xDCBA,0xDCD3,0xDCCE,0xDCF6,0xDCBD,0xDCDD,0xDCC8,0xDD0D,0xDD35,0xDE71,
+ 0xDE6E,0xDE6F,0xDED6,0xDF4C,0xDF4F,0xDF54,0xDF53,0xDFC9,0xDFC8,0xDC03,
+ 0,0xDC04, 0,0xDC57,0xDC52,0xDC53, 0,0xDC56,0xDC5C,0xDC55,
+ 0xDD64,0xDD5D,0xDD5E,0xDDA2,0xDDA3, 0,0xDDE7,0xDDE6,0xDE98,0xDEAC,
+ 0xDEAF,0xDEAE,0xDC59,0xDDA9,0xDC2A,0xDCC7,0xDD41,0xDD37,0xDD35,0xDD33,
+ 0xDD39,0xDD32,0xDCFF,0xDD01,0xDCF8,0xDD1B,0xDD19,0xDFBF,0xDFBC,0xDFBE,
+ 0xDFBD,0xDD7D,0xDC46,0xDC47,0xDDA4,
+ /* plane 5, row 80 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84A,0xD84A,0xD84B,0x3A72,0xD84C,0xD84C,0x3C14,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD850,0xD850,0xD850,0xD850,
+ 0x3D93,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD85C,0xD853,0xD853,0xD853,0xD853,
+ 0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD857,0xD857,0xD857,0xD857,0x426F,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0x42B0,0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD85A,0x352E,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,
+ 1, /* first low-surrogate */
+ 0xDE21,0xDE62,0xDE86, 0,0xDC2F,0xDC31, 0,0xDFF8,0xDFF5,
+ 0xDFF9,0xDFF2,0xDFFA,0xDFF3,0xDC14,0xDFFD,0xDC0F,0xDC0E,0xDC01,0xDD37,
+ 0xDD35,0xDD34,0xDD31,0xDE7A,0xDE7B,0xDC37,0xDD2B,0xDCFB,0xDD16,0xDD13,
+ 0,0xDD11,0xDD0F,0xDD1B,0xDD38,0xDCA4,0xDF09,0xDF07,0xDF0B,0xDCD3,
+ 0xDCD1,0xDCD8,0xDF1D,0xDFA9,0xDFD0,0xDE15,0xDF02,0xDF05,0xDF01,0xDF00,
+ 0xDF2E,0xDF30,0xDF2F,0xDF31,0xDDD2,0xDDD3,0xDD02,0xDE40,0xDE42,0xDE3B,
+ 0xDECE,0xDD98,0xDD8F,0xDD94,0xDD91, 0,0xDDBA,0xDD90,0xDD86,0xDD9A,
+ 0xDD8C,0xDD93,0xDD87,0xDD88,0xDD97,0xDD8D,0xDD9C,0xDDBD,0xDF3C,0xDF59,
+ 0,0xDDD1,0xDDBB,0xDDBE,0xDE5D,0xDFE2,0xDE05,0xDCBA, 0,0xDCF4,
+ 0xDDB2,0xDDF9,0xDEB7,0xDEB6,0xDC89,
+ /* plane 5, row 81 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,
+ 0xD861,0xD862,0xD862,0x4969,0x957E,0xD863,0xD863,0xD863,0xD863,0x49B4,
+ 0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,0x4A4D,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0x4A83,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,
+ 1, /* first low-surrogate */
+ 0xDCF9,0xDCD9,0xDCE8,0xDCD4,0xDCDB,0xDCE2,0xDCDF,0xDCD1,0xDCE9,
+ 0xDCEA,0xDE13,0xDE11,0xDCFA,0xDCF8,0xDCF4,0xDCFB,0xDD0E,0xDD02,0xDD0F,
+ 0xDF90,0xDFAD,0xDFA9,0xDD48,0xDF5A,0xDF4F,0xDF4E,0xDF55,0xDF54,0xDF4A,
+ 0xDFD5,0xDC18,0xDC8D,0xDD1D,0xDD19,0xDE26,0xDE28,0xDE2B,0xDE7D,0xDFA0,
+ 0xDF9A,0xDF9B,0xDDB5,0xDDAD,0xDDB2,0xDE94,0xDFC9,0xDE4E,0xDE4F,0xDE44,
+ 0xDE52,0xDCE9,0xDD39, 0, 0,0xDDC7,0xDDD3,0xDDC6,0xDDC3, 0,
+ 0xDDD2,0xDF66,0xDD7F,0xDD80,0xDD84,0xDD85,0xDDE3, 0,0xDE41,0xDE44,
+ 0xDE43,0xDF4E,0xDF4F, 0,0xDF49,0xDF4A,0xDF4B,0xDF43,0xDFE0,0xDFE5,
+ 0xDFE1,0xDFE6,0xDFE2,0xDC0C,0xDC40,0xDD49,0xDD4A,0xDD54,0xDD4C,0xDD55,
+ 0xDD56,0xDE3B,0xDE3D,0xDFA4,0xDFA8,
+ /* plane 5, row 82 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD866,0x4BB0,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0x4C0C,0xD867,0x4C18,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0x9C20,0xD867,0xD867,0x9C22,0xD867,0xD867,0x9C1E,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0x4CF5,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,
+ 1, /* first low-surrogate */
+ 0xDFC3,0xDFBF,0xDFC8,0xDFC2,0xDFCA,0xDFCC,0xDFC9,0xDFBE,0xDFCD,
+ 0xDFC7,0xDFC5,0xDC5D, 0,0xDD6C,0xDD6B,0xDD70,0xDD6D,0xDD6F,0xDD89,
+ 0xDD84,0xDE8D,0xDE8A,0xDE8E,0xDE91,0xDFB5,0xDFB1,0xDFAF,0xDFB9,0xDFB7,
+ 0xDFB0, 0,0xDC17, 0,0xDC4F,0xDD19,0xDD10,0xDD18,0xDD11,0xDD1C,
+ 0xDD12,0xDE76,0xDE71, 0,0xDE7A,0xDE7F, 0,0xDE73,0xDEAB, 0,
+ 0xDE77,0xDE74,0xDE7E,0xDE9B,0xDE84,0xDE7C,0xDD29,0xDD2B,0xDD0E,0xDD00,
+ 0xDD0B,0xDCFE,0xDCFA,0xDD17,0xDCFF,0xDD0C,0xDD0F, 0,0xDD02,0xDD01,
+ 0xDCFC,0xDD49,0xDD06,0xDD12,0xDD13,0xDE78,0xDF5B,0xDF62,0xDF5F,0xDF5D,
+ 0xDFAB,0xDFD5,0xDFD4,0xDFD3,0xDC07,0xDC6C,0xDC70,0xDC6E,0xDC68,0xDC6D,
+ 0xDC77,0xDC6A,0xDCCE,0xDCEC,0xDD69,
+ /* plane 5, row 83 */
+ 1 | (94 << 8), /* first, last */
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD841,0xD841,0xD844,
+ 0xD845,0xD845,0xD846,0xD846,0xD846,0xD84C,0xD847,0xD847,0xD847,0xD848,
+ 0xD848,0xD849,0xD87E,0xD849,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84C,0xD84C,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84F,0xD850,0xD850,0xD851,0x3E0E,0xD851,0xD851,0xD852,0xD853,
+ 0x3FD8,0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD859,
+ 1, /* first low-surrogate */
+ 0xDD68,0xDDA6,0xDDA9,0xDDAA,0xDE00,0xDE0D,0xDDF8,0xDDFC,0xDE0A,
+ 0xDDF7,0xDE01,0xDEB6,0xDEBB,0xDEB7,0xDEB9,0xDECA,0xDC69,0xDE25,0xDD59,
+ 0xDD07,0xDD09,0xDD22,0xDF07,0xDF04,0xDF0F,0xDCF8,0xDFC7,0xDFD1,0xDD7E,
+ 0xDF08,0xDC4A,0xDC98,0xDCB9,0xDE88,0xDE91,0xDE84,0xDE73,0xDE89,0xDE85,
+ 0xDC33,0xDF13,0xDC1D,0xDC1F,0xDC1C,0xDC20,0xDC1A,0xDC1B,0xDD39,0xDDAF,
+ 0xDEE5,0xDC3C,0xDD37,0xDD3A,0xDCBB, 0,0xDF10,0xDF0D,0xDFAF,0xDC11,
+ 0,0xDF0D,0xDF0C,0xDF0B,0xDCD4,0xDF3D,0xDF3E,0xDF3B,0xDF43,0xDF40,
+ 0xDF46,0xDC11,0xDDDD,0xDDDF,0xDDEA,0xDF4A,0xDD06,0xDDC1,0xDDB9,0xDDC6,
+ 0xDDB8,0xDDBB,0xDDC8,0xDDC5,0xDDBF,0xDDC7,0xDDC4,0xDF65,0xDF67,0xDDD7,
+ 0xDDDB,0xDDD4,0xDDD6,0xDFE8,0xDE0A,
+ /* plane 5, row 84 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0x8970,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD860,0x482C,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD861,0xD862,0xD862,0x496E,0xD862,0xD862,0xD863,0xD863,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0x4A86,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0x4BB3,0xD866,0xD866,0xD866,
+ 0x4BEB,0xD866,0xD866,0xD866,0xD866,
+ 1, /* first low-surrogate */
+ 0xDEBD,0xDEBE,0xDD1A,0xDD0D,0xDD0F,0xDD1B,0xDD10,0xDD11,0xDD13,
+ 0xDE18,0xDD20,0xDD1F,0xDD23,0xDD1D,0xDD37,0xDD25,0xDD24,0xDD2A,0xDD27,
+ 0xDD33,0xDD28,0xDD34,0xDFBA, 0,0xDC9D,0xDD4C,0xDF5C,0xDF6A,0xDF5D,
+ 0xDF65,0xDF63,0xDF5E,0xDC19,0xDC97,0xDE3F,0xDE33,0xDE32,0xDFA1,0xDFA5,
+ 0xDFA4,0xDFA2,0xDDC1, 0,0xDDC7,0xDDC4,0xDDC6,0xDDC5,0xDDD4,0xDDCA,
+ 0xDE53,0xDCF1,0xDD21, 0,0xDFB7,0xDF92,0xDDD4,0xDF44,0xDD98,0xDD9B,
+ 0xDD91,0xDD95,0xDD9A,0xDD92,0xDF53,0xDF57, 0,0xDF5C,0xDF5D,0xDF64,
+ 0xDFEA,0xDFED,0xDC42,0xDC43,0xDD64,0xDD61,0xDD60,0xDE7D,0xDFD4,0xDFD5,
+ 0xDFD9,0xDD87,0xDD99,0xDD8C,0xDD8A,0xDD8F, 0,0xDD8B,0xDD82,0xDD9B,
+ 0,0xDFC8,0xDFC4,0xDFCC,0xDFC7,
+ /* plane 5, row 85 */
+ 1 | (94 << 8), /* first, last */
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0x9C43,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD87E,0xD87E,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0x9DE0,0xD868,0xD868,
+ 0x4D42,0xD868,0xD868,0xD868,0xD868,0x4D41,0xD868,0xD868,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0x4DAC,0xD841,0xD841,0xD842,0xD842,
+ 0xD842,0xD844,0xD845,0xD846,0xD848,0xD84C,0xffff,0x3B2F,0x3B2E,0xD84C,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x3C4D,0x3C7B,0xD84E,
+ 0xD84E,0xD84E,0xD84F,0xD850,0xD850,
+ 1, /* first low-surrogate */
+ 0xDFC3,0xDFC6,0xDFCB,0xDFCA,0xDFC9,0xDFCD,0xDC53,0xDD21,0xDD29,
+ 0xDD1D,0xDD24,0xDD28, 0,0xDEB1,0xDEB2,0xDEB5,0xDED6,0xDEAF,0xDECA,
+ 0xDEB8,0xDE12,0xDE11,0xDD45,0xDD47,0xDD34,0xDD6E,0xDD42,0xDD31,0xDD2E,
+ 0xDD56,0xDD38,0xDD37,0xDD4B,0xDD2D,0xDD33,0xDD36, 0,0xDD48,0xDEDC,
+ 0,0xDF66,0xDF6D,0xDF63,0xDF64, 0,0xDF67,0xDFD9,0xDC0B,0xDC7E,
+ 0xDC8B,0xDD26,0xDD2C,0xDD29,0xDD6F,0xDD6B,0xDD6D,0xDD6E,0xDE1C,0xDE11,
+ 0xDE10,0xDE24,0xDE12,0xDE15,0xDE17, 0,0xDC6F,0xDDAB,0xDC2E,0xDCC9,
+ 0xDF96,0xDD85,0xDEA0,0xDD2B,0xDF0D,0xDC36, 0, 0, 0,0xDFB1,
+ 0xDC4A,0xDC37,0xDC3C,0xDC38,0xDC3A,0xDC3E,0xDC49, 0, 0,0xDE80,
+ 0xDE7F,0xDEE3,0xDC3F,0xDD52,0xDD4E,
+ /* plane 5, row 86 */
+ 1 | (94 << 8), /* first, last */
+ 0xD850,0xD850,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,
+ 0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0x42B2,0xD858,0xD858,0xD85A,0xD85A,
+ 0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85E,0x4722,0xD85E,0xD85E,0xD85F,0xD85F,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD862,0xD862,
+ 0xD862,0x9459,0xD862,0x4970,0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,
+ 1, /* first low-surrogate */
+ 0xDD4A,0xDD4B,0xDCD5,0xDED8,0xDF20,0xDFB3,0xDFB1,0xDFB0,0xDF17,
+ 0xDCD9,0xDF49,0xDC13,0xDDED,0xDDEB,0xDDEE,0xDD0A,0xDD0B,0xDE4A,0xDDD5,
+ 0xDDD7,0xDDDE,0xDDDC,0xDDEE,0xDF70, 0,0xDDD9,0xDFD7,0xDCCB,0xDCC7,
+ 0xDDFC,0xDD3B,0xDD39,0xDD4B,0xDD43,0xDD40,0xDD46,0xDD4D,0xDD43,0xDD47,
+ 0xDD4B,0xDD55,0xDD52,0xDF5F, 0,0xDF7C,0xDF7B,0xDFA8,0xDFA9,0xDDDE,
+ 0xDDD7,0xDDDD,0xDDD6,0xDDD8,0xDE9B,0xDFE0,0xDFE8,0xDFE6,0xDCF8,0xDCFB,
+ 0xDFBB, 0,0xDFB8, 0,0xDCC1,0xDCC0,0xDDA4,0xDDAB,0xDE4D,0xDF65,
+ 0xDF67,0xDF6A,0xDF66,0xDF69,0xDD73,0xDD80,0xDD6F,0xDD71,0xDFE4,0xDFE6,
+ 0xDFE7,0xDDA0,0xDDA4,0xDEA2,0xDEA7,0xDEA4,0xDFDE,0xDFDB,0xDC58,0xDC5C,
+ 0xDD2F,0xDD2E,0xDEDD,0xDEE4,0xDED8,
+ /* plane 5, row 87 */
+ 1 | (94 << 8), /* first, last */
+ 0xD867,0xD867,0xD867,0x4C95,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0x4D00,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0x4D02,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0x4D9F,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD841,0xD842,0xD844,0xD844,0xD845,0xD847,0xD848,0xD84A,0xD84A,
+ 0xD84B,0xD84B,0xD84C,0xD84C,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD850,0xD850,0xD851,0xD851,0xD852,0xD853,0xD854,0xD854,0xD855,0xD855,
+ 0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,
+ 0xD858,0xD858,0xD859,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDEE7,0xDEDA,0xDE75, 0,0xDD79,0xDD80,0xDD7F,0xDD7C,0xDD75,
+ 0xDD7B,0xDD82, 0,0xDD89,0xDD74,0xDD7D,0xDD7A,0xDD86,0xDDA8,0xDD72,
+ 0,0xDD8B,0xDD91,0xDDB3,0xDD81,0xDE82,0xDEE1,0xDEE3,0xDEE2,0xDF76,
+ 0xDF74,0xDF72,0xDF75,0xDC0E,0xDC0D,0xDC94,0xDC92,0xDC93,0xDC91,0xDC8F,
+ 0xDC95,0xDCD0,0xDCF7,0xDD76,0xDDAF, 0,0xDE26,0xDE25,0xDE2D,0xDEA0,
+ 0xDEC3,0xDCD7,0xDECC,0xDD79,0xDD7A,0xDD15,0xDFDB,0xDD85,0xDD70,0xDD7B,
+ 0xDEA5,0xDE9F,0xDF17,0xDFB2,0xDC39,0xDC40,0xDC4E,0xDD3E,0xDEE8,0xDEE7,
+ 0xDD66,0xDD61,0xDCDA,0xDF14,0xDCDF,0xDF18,0xDC39,0xDC3A,0xDF30,0xDF32,
+ 0xDD0E,0xDE4C,0xDDE8,0xDDF1,0xDDEB,0xDDEC,0xDF74,0xDF73,0xDDF1,0xDF42,
+ 0xDF3E,0xDF41,0xDD2C,0xDCD2,0xDDBB,
+ /* plane 5, row 88 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0xD85C,0xD85C,0x457D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,
+ 0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,
+ 0x4AF6,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0x4C12,0xD867,0xD867,0xD867,0x4C91,0xD867,0xD867,0xD867,0xD867,0x4C90,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,
+ 1, /* first low-surrogate */
+ 0xDD58,0xDD57,0xDD56,0xDD5A, 0,0xDD61,0xDD68,0xDD65,0xDD5F,
+ 0xDD64,0xDD5E,0xDD5B,0xDD67,0xDFC3,0xDCA2,0xDD53,0xDF7D,0xDC20,0xDFAE,
+ 0xDFAF,0xDFB0,0xDDE7,0xDDE6,0xDDE9,0xDFF1,0xDFEB,0xDFEA,0xDFE9,0xDE63,
+ 0xDD02,0xDCFE,0xDFDE,0xDCC2,0xDDE6,0xDF5D,0xDDAD,0xDF75,0xDF72,0xDF77,
+ 0,0xDE51,0xDFE8,0xDFED,0xDFEE,0xDDB9,0xDDA1,0xDDB6,0xDEAE,0xDFE8,
+ 0,0xDC1E,0xDD31,0xDD32, 0,0xDF0E,0xDF12,0xDF09,0xDF05, 0,
+ 0xDF03,0xDF1F,0xDF0D,0xDF0C,0xDF04,0xDF0A,0xDDC2,0xDDBF,0xDDC9,0xDDB2,
+ 0xDDC1,0xDDAF,0xDDB4,0xDDB0,0xDDB6,0xDDB7,0xDDBB,0xDDB1,0xDEF0,0xDF78,
+ 0xDF7A,0xDF79,0xDFE4,0xDFE6,0xDC9F,0xDC9D,0xDC98,0xDC99,0xDCF9,0xDD30,
+ 0xDD82,0xDD81,0xDDB3,0xDD7F,0xDE3A,
+ /* plane 5, row 89 */
+ 1 | (94 << 8), /* first, last */
+ 0xD869,0xD869,0xD844,0xD846,0xD846,0xD847,0xD847,0xD849,0xD84A,
+ 0x3A79,0xD84C,0xD84E,0xD84E,0xD84E,0x3C4E,0xD84E,0xD852,0xD855,0xD856,
+ 0xD856,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD859,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD860,
+ 0xD860,0xD860,0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,
+ 0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0x4D1E,0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,
+ 1, /* first low-surrogate */
+ 0xDE3E,0xDE48,0xDD86,0xDD36,0xDF13,0xDC22,0xDFDD,0xDDA7,0xDD7D,
+ 0,0xDF1C,0xDC65,0xDC60,0xDC67, 0,0xDF1A,0xDEE3,0xDF34,0xDD18,
+ 0xDE52,0xDDFC,0xDF79,0xDF78,0xDF76,0xDDFA,0xDDF8,0xDD2D,0xDCD6,0xDDBD,
+ 0xDDBF,0xDDBE,0xDD44,0xDD70,0xDD62,0xDD6E,0xDD6E,0xDD7C,0xDD74,0xDD78,
+ 0xDD70,0xDD79,0xDD71,0xDFCC,0xDCA7,0xDCA6,0xDF93,0xDC21,0xDC9C,0xDE9D,
+ 0xDFF4,0xDFF3,0xDDF0,0xDDB8,0xDDB6,0xDDBD,0xDF73,0xDF82,0xDD87,0xDE56,
+ 0xDE59,0xDFF6,0xDDC9,0xDDC5,0xDDC7,0xDDCA,0xDDC2,0xDDC4,0xDFF2,0xDFF0,
+ 0xDD3B,0xDD3A,0xDF26,0xDF28,0xDF34,0xDF2D,0xDDD7,0xDDD2,0xDDD6,0xDDDC,
+ 0xDDD3,0xDDD1,0xDE86, 0,0xDEEF,0xDEEE,0xDFE8,0xDCAC,0xDCA9,0xDCAA,
+ 0xDCAB,0xDCFB,0xDD33,0xDD88,0xDDB6,
+ /* plane 5, row 90 */
+ 1 | (94 << 8), /* first, last */
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD846,0xD847,0xD84E,
+ 0xD850,0xD850,0xD852,0xD855,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD858,0xD85C,0xD85C,0xD85D,0xD87E,0xD85E,0xD85F,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,
+ 0xD867,0x9C72,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD846,
+ 0xD847,0xD848,0xD848,0xD850,0xD850,0xD851,0xD852,0xD853,0xD855,0xD85A,
+ 0xD85A,0xD85A,0xD85C,0xD85D,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,
+ 0xD860,0xD862,0xD863,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDDB7,0xDDD0,0xDDCF,0xDE4F,0xDE59,0xDE4C,0xDF18,0xDFE0,0xDC69,
+ 0xDD73,0xDD72,0xDEE8,0xDDFB,0xDD1C,0xDE09,0xDE0A,0xDE08,0xDF7D,0xDF7F,
+ 0xDE67,0xDD7A,0xDD7B,0xDFD1,0xDDCB,0xDF9D,0xDC9D,0xDDFC,0xDDFB,0xDDFD,
+ 0xDFF5,0xDFF6,0xDC0F,0xDC1D,0xDDC7,0xDDC1,0xDDBF,0xDE54,0xDF7F,0xDFF5,
+ 0xDD8A,0xDD8C,0xDE5C,0xDC65,0xDDCF,0xDDD0,0xDEB8,0xDFFA,0xDC66,0xDF40,
+ 0xDF41, 0,0xDDF7,0xDDF3,0xDDEF,0xDDF4,0xDDED,0xDDF2,0xDDF1,0xDDF9,
+ 0xDCB4,0xDCFC,0xDDBC,0xDE5E,0xDE5B,0xDE5F,0xDE5D,0xDECF,0xDECE,0xDD3A,
+ 0xDFE1,0xDF15,0xDF14,0xDD78,0xDD79,0xDCE6,0xDFB8,0xDF22,0xDDFE,0xDCDB,
+ 0xDE06,0xDEC8,0xDD89,0xDD86,0xDCAD,0xDF99,0xDFD8,0xDC23,0xDD23,0xDFB5,
+ 0xDFF9,0xDD07,0xDC1E,0xDDFB,0xDF72,
+ /* plane 5, row 91 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD864,0xD865,0xD865,0xD865,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD847,0x3828,
+ 0xD84A,0xD84C,0xD84E,0xD850,0xD851,0xD854,0xD857,0xD85A,0xD85C,0xD85D,
+ 0xD85D,0xD85F,0xD860,0xD861,0xD864,0xD864,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD845,0xD84A,0xD856,0xD856,0xD856,0xD857,0xD858,
+ 0xD85C,0xD85D,0xD85D,0xD85E,0xD860,0xD861,0xD864,0xD864,0xD866,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,
+ 0x4D91,0xD87E,0xD857,0xD857,0xD85D,
+ 1, /* first low-surrogate */
+ 0xDF73,0xDF87,0xDC49,0xDE5D,0xDFF8,0xDC03,0xDF4E,0xDF4D,0xDF50,
+ 0xDF55,0xDE09,0xDE07,0xDE0C,0xDE03,0xDE06,0xDE0B,0xDE0A,0xDE89,0xDCBB,
+ 0xDCFF,0xDD36,0xDD8B,0xDE66,0xDE69,0xDE67,0xDEC2,0xDED2,0xDFE2, 0,
+ 0xDD88,0xDF5B,0xDC76,0xDD7D,0xDDA6,0xDF5A,0xDE17,0xDCDC,0xDD8F,0xDD94,
+ 0xDD95,0xDFB6,0xDE04,0xDFEE,0xDF8A,0xDFF9,0xDC07,0xDC1F,0xDC2A,0xDD45,
+ 0xDF5C,0xDF5B,0xDF61,0xDF5D,0xDE18,0xDE1F,0xDF83,0xDC16,0xDC14,0xDCBF,
+ 0xDCC0,0xDE73,0xDEC0,0xDD17,0xDD89,0xDD1E,0xDD1F,0xDE54,0xDE18,0xDE05,
+ 0xDD95,0xDD98,0xDD9B,0xDD59,0xDE08,0xDC01,0xDDCE,0xDFFA,0xDEBE,0xDD47,
+ 0xDF6A,0xDF69,0xDF68,0xDF67,0xDE25,0xDE28,0xDCC4,0xDD37,0xDD8D,0xDD8C,
+ 0,0xDD20,0xDE22,0xDF82,0xDFD9,
+ /* plane 5, row 92 */
+ 1 | (49 << 8), /* first, last */
+ 0xD863,0xD864,0xD866,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,
+ 0xD869,0xD857,0xD85A,0xD867,0xD867,0xD868,0xD868,0xD868,0xD869,0xD869,
+ 0xD847,0xD864,0xD867,0xD867,0xD868,0xD868,0xD869,0xD869,0xD850,0xD85C,
+ 0x4587,0xD865,0xD867,0xD868,0xD869,0xD855,0xD85E,0xD869,0xD868,0xD865,
+ 0xD868,0xD85C,0xD869,0xD85D,0xD864,0xD869,0xD869,0xD85C,0xD85A,0xD869,
+ 1, /* first low-surrogate */
+ 0xDC38,0xDFFB,0xDDE1,0xDC72,0xDD48,0xDF6C,0xDF70,0xDE31,0xDE30,
+ 0xDE79,0xDE23,0xDCF8,0xDC74,0xDF73,0xDE34,0xDF87,0xDFB2,0xDDC2,0xDE7D,
+ 0xDFE5,0xDF8C,0xDF77,0xDF75,0xDE38,0xDE3A,0xDE83,0xDE81,0xDD80,0xDD99,
+ 0,0xDC4A,0xDD4A,0xDE3C,0xDEC8,0xDE04,0xDCAF,0xDE89,0xDEFA,0xDE61,
+ 0xDE3F,0xDD93,0xDCC9,0xDFDE,0xDF91,0xDE8E,0xDE8D,0xDD98,0xDDC5,0xDEA5,
+ /* plane 5, row 93: --- */
+ /* plane 5, row 94: --- */
+ /* plane 6, row 1 */
+ 1 | (94 << 8), /* first, last */
+ 0xD87E,0xD840,0x3405,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD842,0xD842,0xD840,0xD840,0xD840,0xD840,0x3404,0xD87E,0xD840,0xD840,
+ 0xD840,0xD840,0xD841,0xD841,0xD87E,0xD841,0xD842,0x353F,0xD842,0xD842,
+ 0xD847,0xD848,0xD848,0xD841,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,0xD87E,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD841,0xD842,0xD842,
+ 0xD841,0xD842,0xD842,0xD842,0xD842,0xD87E,0xD842,0xD842,0xD842,0xD844,
+ 0xD844,0xD845,0xD845,0xD846,0xD846,0xD846,0xD847,0xD847,0x382A,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,0x38A7,
+ 0xD848,0xD848,0xD848,0xD849,0x38FA,
+ 1, /* first low-surrogate */
+ 0xDC02,0xDC62, 0,0xDC88,0xDCD0,0xDCCF,0xDD1E,0xDD1F,0xDD20,
+ 0xDD0E,0xDD2C,0xDC61,0xDC04,0xDC05,0xDC03, 0,0xDC01,0xDC7D,0xDC8D,
+ 0xDDA3,0xDDA4,0xDCDB,0xDD00,0xDC1E,0xDEA3,0xDC32, 0,0xDED4,0xDED5,
+ 0xDC23,0xDF2C,0xDF7A,0xDD03,0xDC07,0xDC08,0xDC8F,0xDC9C,0xDCD5,0xDD12,
+ 0xDD13,0xDD14,0xDD21,0xDDA8,0xDDA6,0xDC76,0xDD01,0xDD3D,0xDC14,0xDD3E,
+ 0xDE29,0xDE77,0xDE78,0xDEA6,0xDEA9,0xDEAC,0xDC34,0xDD04,0xDD7B,0xDE10,
+ 0xDE2F,0xDED7,0xDF1C,0xDF1F,0xDF1A,0xDC36,0xDF1E,0xDF9E,0xDF9A,0xDDA0,
+ 0xDDA1,0xDDD2,0xDDD3,0xDDB9,0xDF1D,0xDF55,0xDCFF,0xDFE7, 0,0xDC11,
+ 0xDC13,0xDC12,0xDDAF,0xDDB1,0xDC90,0xDF2D,0xDF7B,0xDF9D,0xDF9A, 0,
+ 0xDF9F,0xDFA0,0xDF9C,0xDCBD,
+ /* plane 6, row 2 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD84C,0xD84C,0xD84F,0xD851,0xD87E,0xD855,0xD858,0xD858,
+ 0xD840,0xD840,0x3400,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,0xD87E,0xD841,
+ 0xD841,0xD841,0xD841,0x34DB,0xD842,0xD841,0xD841,0xD841,0xD87E,0xD842,
+ 0xD842,0xD87E,0xD842,0xD842,0xD842,0xD842,0xD840,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD87E,
+ 0xD842,0xD842,0xD842,0xD840,0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD87E,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,
+ 1, /* first low-surrogate */
+ 0xDDAA,0xDC6C,0xDC91,0xDC74,0xDD6A,0xDD29,0xDE05,0xDE6B,0xDE6A,
+ 0xDCE0,0xDC12, 0,0xDC7F,0xDCA0,0xDC99,0xDC95,0xDC9E,0xDCDF,0xDCDE,
+ 0xDDAF,0xDDAD,0xDDB0,0xDCDF,0xDD43,0xDD41,0xDD48,0xDD75,0xDC1A,0xDE32,
+ 0xDE7B,0xDE79,0xDEB3, 0,0xDFA7,0xDEB2,0xDEB0,0xDEB4,0xDC29,0xDCCD,
+ 0xDCCE,0xDC2B,0xDD10,0xDD80,0xDDD3,0xDE30,0xDC98,0xDE2F,0xDE31,0xDEDA,
+ 0xDED9,0xDF27,0xDF28,0xDF21,0xDF25,0xDFA6,0xDFA2,0xDFA1,0xDFA4,0xDC39,
+ 0xDFAA,0xDFA5,0xDFA3,0xDC64,0xDE3F,0xDE44,0xDD1B,0xDD53,0xDD84,0xDD86,
+ 0xDDD5,0xDC60,0xDD3E,0xDD40,0xDFCA,0xDFC9,0xDC26,0xDD00,0xDD31,0xDD3C,
+ 0xDD30,0xDD33,0xDD32,0xDD38,0xDC34,0xDC53,0xDC54,0xDDB4,0xDDB2,0xDF2F,
+ 0xDFA5,0xDFA7,0xDFA4,0xDFA8,0xDFA9,
+ /* plane 6, row 3 */
+ 1 | (94 << 8), /* first, last */
+ 0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84C,0xD84C,0xD84C,0xD84E,0xD850,0xD851,0xD851,0xD851,0xD852,
+ 0xD852,0xD852,0xD853,0xD856,0xD85A,0xD860,0xD860,0xD841,0xD867,0xD867,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0x3438,0xD840,0xD840,0xD840,
+ 0xD87E,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD87E,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD85A,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0x6530,0xD842,0xD842,0xD842,
+ 0xD842,0x353A,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD847,
+ 1, /* first low-surrogate */
+ 0xDFA2,0xDFA3,0xDFA6,0xDC81,0xDC80,0xDDAD,0xDE24,0xDE65,0xDE68,
+ 0xDE69,0xDD3C,0xDD3B,0xDF5D,0xDD44,0xDD82,0xDCF1,0xDD6B,0xDF1B,0xDCEB,
+ 0xDFBA,0xDFD3,0xDD13,0xDD22,0xDEF4,0xDE0F,0xDE10,0xDD07,0xDC0B,0xDC0A,
+ 0xDC19,0xDC1A,0xDC18,0xDC66,0xDC82,0xDCA8,0xDCE5,0xDCE7,0xDCE4,0xDD15,
+ 0xDD23,0xDD24,0xDD43,0xDDC3,0xDDBC,0xDDBB, 0,0xDDB7,0xDDB9,0xDDCF,
+ 0xDC0D,0xDC7A,0xDC7B,0xDCE1,0xDCE0,0xDD09,0xDD4D,0xDC16,0xDD4B,0xDD79,
+ 0xDDB1,0xDE36,0xDE35,0xDE37,0xDE38,0xDE7F,0xDE80,0xDE81,0xDD53,0xDE7E,
+ 0xDECD,0xDEBF,0xDEBE,0xDEC2,0xDEB8,0xDEC1, 0,0xDD31,0xDD2F,0xDD6F,
+ 0xDD82, 0,0xDD87,0xDD86,0xDD8D,0xDD94,0xDDD7,0xDDD4,0xDDD8,0xDE16,
+ 0xDE14,0xDE2E,0xDE36,0xDE37,0xDFEE,
+ /* plane 6, row 4 */
+ 1 | (94 << 8), /* first, last */
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD844,0xD844,0xD844,0xD844,0xD87E,
+ 0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,0xD845,0xD87E,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,
+ 0xD87E,0xD846,0xD846,0xD87E,0xD846,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD840,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD840,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,
+ 0x38C9,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 1, /* first low-surrogate */
+ 0xDEE0,0xDEE5,0xDEDF,0xDF2B,0xDF29,0xDF2D,0xDF2F,0xDFB7,0xDFC9,
+ 0xDFC1,0xDFCA,0xDFB2,0xDFAC,0xDFAE,0xDDB2,0xDDA8,0xDDB0,0xDDA7,0xDC51,
+ 0xDE52,0xDE4A,0xDD56,0xDD55,0xDD5F,0xDD5E,0xDD88,0xDC5D,0xDDDD,0xDDE2,
+ 0xDDE1,0xDDDF,0xDDE0,0xDEAF,0xDEB1,0xDEBA,0xDD45,0xDD43,0xDDBD,0xDDC8,
+ 0xDC6C,0xDDBE,0xDDBF,0xDC74,0xDF59,0xDC29,0xDC2C,0xDC2F,0xDC2D,0xDC2E,
+ 0xDD04,0xDD02,0xDD01,0xDD40,0xDD4A,0xDD3F,0xDD4F,0xDD41,0xDD4E,0xDFEB,
+ 0xDFEC,0xDCAC,0xDC5B,0xDC63,0xDC5A,0xDC59,0xDDDC,0xDDDB,0xDDD9,0xDDE0,
+ 0xDDDD,0xDC20,0xDFB0,0xDFB1,0xDFB2,0xDFB6,0xDC51,0xDC52,0xDC50,0xDC84,
+ 0,0xDC83,0xDDC3,0xDDB8,0xDDB9,0xDDB2,0xDD90,0xDE26,0xDE29,0xDE6E,
+ 0xDD40,0xDD3E,0xDD41,0xDF5E,0xDFBB,
+ /* plane 6, row 5 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84C,0xD84C,0xD87E,0xD84E,0x3C4F,0xD84E,0xD84E,0xD84E,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,0xD84F,0xD84F,0xD84F,0xD850,0xD850,
+ 0xD850,0xD851,0xD851,0xD851,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,
+ 0xD855,0xD87E,0xD855,0xD855,0xD858,0xD858,0xD858,0xD858,0xD859,0xD841,
+ 0xD859,0x43CD,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0x4492,0xD85A,0xD85A,
+ 0xD87E,0xD87E,0xD85F,0xD860,0xD840,0xD861,0xD861,0xD861,0xD861,0xD87E,
+ 0xD861,0xD863,0xD842,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD87E,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0x3445,0xD87E,0xD840,0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0x34B5,0xD841,0x34B6,0xD841,
+ 1, /* first low-surrogate */
+ 0xDFBC,0xDFB9,0xDCEF,0xDC80, 0,0xDD45,0xDDBA,0xDDBD,0xDC56,
+ 0xDC55,0xDC75,0xDC77,0xDC81,0xDCFA,0xDC83,0xDC8B,0xDC84,0xDD86,0xDD83,
+ 0xDD8B,0xDD6D,0xDE16,0xDF28,0xDCEA,0xDFD4,0xDC03,0xDD15,0xDF3D,0xDF3E,
+ 0xDC16,0xDD4C,0xDE06,0xDF4D,0xDE22,0xDE73,0xDE6D,0xDE6E,0xDCB1,0xDD4E,
+ 0xDE2D, 0,0xDCF9,0xDD52,0xDF00,0xDEFC,0xDEFA, 0,0xDEF7,0xDEF8,
+ 0xDD90,0xDDC4,0xDC27,0xDE11,0xDCAE,0xDC50,0xDC4F,0xDC4D,0xDE71,0xDDE2,
+ 0xDE72,0xDE18,0xDE44,0xDC21,0xDC67,0xDCAF,0xDCB0,0xDC29,0xDD17,0xDD22,
+ 0xDC03,0xDC25,0xDD28,0xDDFF,0xDDD9,0xDDDB,0xDDDE,0xDDF2,0xDDFE,0xDDF4,
+ 0xDDDD, 0,0xDC04,0xDE01,0xDDDC,0xDC7D,0xDC81,0xDC7E,0xDC7F,0xDCE5,
+ 0xDD0F, 0,0xDD0A, 0,0xDD0B,
+ /* plane 6, row 6 */
+ 1 | (94 << 8), /* first, last */
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0x3537,0xD842,0x3530,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD854,0xD842,0xD844,0xD842,0xD87E,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD87E,0xD842,0xD842,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,0x373E,0x374D,
+ 0x3751,0xD846,0xD846,0xD846,0xD846,
+ 1, /* first low-surrogate */
+ 0xDD51,0xDD52,0xDD50,0xDDB8,0xDE3D,0xDE3E,0xDE3C,0xDE87,0xDED7,
+ 0xDEDB,0xDECF,0xDEE0,0xDC4C,0xDC42,0xDCD4,0xDD11,0xDD14,0xDD15,0xDD12,
+ 0xDD33,0xDD35, 0,0xDD71, 0,0xDD91,0xDD93,0xDD95,0xDDDC,0xDE42,
+ 0xDE40,0xDFA6,0xDEE6,0xDE8F,0xDF32,0xDC37,0xDF31,0xDFF5,0xDFCD,0xDFDE,
+ 0xDFD5,0xDFDA,0xDFEE,0xDFEC,0xDFCF,0xDFCE,0xDC3D,0xDFCC,0xDFF3,0xDDC1,
+ 0xDDC4,0xDDC6,0xDDB4,0xDDC3,0xDDB8,0xDDBB,0xDDB7,0xDDBC,0xDDBF,0xDDC7,
+ 0xDDBE,0xDE60,0xDE5D,0xDE76,0xDE6C,0xDE75,0xDE5B,0xDE71,0xDE73,0xDE61,
+ 0xDE5A,0xDE62,0xDE72,0xDE5F,0xDE58,0xDD1E,0xDD58,0xDD8B,0xDD8A,0xDDF4,
+ 0xDDF0,0xDED2,0xDECD,0xDECE,0xDEBC,0xDED0,0xDD46,0xDD47, 0, 0,
+ 0,0xDDCE,0xDDCF,0xDDCC,0xDDCB,
+ /* plane 6, row 7 */
+ 1 | (94 << 8), /* first, last */
+ 0xD87E,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD87E,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0x3873,
+ 0xD848,0xD848,0xD87E,0xD848,0xD85A,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD87E,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0x39BE,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,
+ 0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,
+ 1, /* first low-surrogate */
+ 0xDC72,0xDF60,0xDF5F,0xDF5D,0xDFD4,0xDC3A,0xDC38,0xDC3C,0xDC36,
+ 0xDD08,0xDD7E,0xDD5E,0xDD6E,0xDD53,0xDD70,0xDD57,0xDD5D,0xDD63,0xDD7A,
+ 0xDD79,0xDD93,0xDC81,0xDC1D,0xDC68,0xDC73,0xDC74,0xDC66,0xDC6F,0xDC75,
+ 0xDC7A,0xDC70,0xDC6D,0xDC65,0xDD8A,0xDDED,0xDDE9,0xDDE3,0xDDEF, 0,
+ 0xDDEA,0xDF31,0xDC91,0xDF38,0xDF20,0xDF35,0xDF3A,0xDF81,0xDF80,0xDFB8,
+ 0xDFC1,0xDFBA,0xDC88,0xDCCF,0xDCCA,0xDCC7,0xDCC5,0xDCC8,0xDCD0,0xDCC9,
+ 0xDDBB,0xDDB6,0xDDBD,0xDC9D,0xDDB4,0xDDC1,0xDDD1,0xDDD2,0xDDCC,0xDDD4,
+ 0xDDCB,0xDDCE,0xDDD5,0xDDD8,0xDD95,0xDD93,0xDD99,0xDD96, 0,0xDE89,
+ 0xDE94,0xDE91,0xDE8F,0xDE84,0xDE97,0xDE86,0xDE85,0xDE8C,0xDEF2,0xDEED,
+ 0xDEEF,0xDCD9,0xDD46,0xDD47,0xDD4B,
+ /* plane 6, row 8 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD87E,0xD84E,0x3C1E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0x3CC8,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0x3CC3,0x3CC7,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,0x3F56,0xD853,0x3540,0xD853,
+ 0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,
+ 0xD855,0xD856,0xD856,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD841,0xD87E,0xD85A,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDD50,0xDD4A,0xDD4E,0xDD4C,0xDD48,0xDF63,0xDF61,0xDF62,0xDF60,
+ 0xDFC3,0xDFC5,0xDFC1,0xDFD0,0xDCDC,0xDC82, 0,0xDC86,0xDC84,0xDD4C,
+ 0xDD48,0xDDB8,0xDDBF,0xDDC1,0xDDC6,0xDDC5,0xDDC7,0xDDC0,0xDDC3,0xDEED,
+ 0xDF03,0xDF22,0xDF21,0xDC9F,0xDC90,0xDC9E, 0,0xDCA0,0xDC94,0xDC95,
+ 0xDCA1, 0, 0,0xDD9A,0xDD90,0xDCF2,0xDCF3,0xDD6E,0xDDAB,0xDDA9,
+ 0xDE1A,0xDE18,0xDE1B,0xDF60,0xDF4C,0xDF42,0xDF33,0xDF3F,0xDF3E,0xDF38,
+ 0xDF43,0xDF46,0xDF36,0xDCEE,0xDCF5,0xDCF4, 0,0xDC1B, 0,0xDD2B,
+ 0xDD29,0xDD2A,0xDD2E,0xDC3F,0xDCE6,0xDFA7,0xDFA8,0xDC18,0xDE08,0xDF50,
+ 0xDF53,0xDE56,0xDE55,0xDE6F,0xDE7F,0xDCB3,0xDE3A,0xDE38,0xDE37,0xDE36,
+ 0xDD54,0xDD80,0xDCDD,0xDCFC,0xDCFA,
+ /* plane 6, row 9 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD87E,0xD87E,0xD85C,
+ 0xD87E,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD863,0x49BD,0xD87E,0xD840,0xD840,0xD845,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD848,0xD841,0xD841,0xD841,0xD841,0xD87E,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0x351A,
+ 0xD842,0xD842,0x352C,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,
+ 1, /* first low-surrogate */
+ 0xDD33,0xDF04,0xDF07,0xDF08,0xDF06,0xDF09,0xDD91,0xDD93,0xDE1E,
+ 0xDDD2,0xDC0B,0xDC43,0xDC52,0xDC58,0xDC5E,0xDE68,0xDE8D,0xDE82,0xDE7B,
+ 0xDC58, 0,0xDC00,0xDC2C,0xDC2E,0xDE0B,0xDC2D,0xDC69,0xDCB2,0xDCB6,
+ 0xDCA9,0xDCED,0xDD19,0xDD4F,0xDE16,0xDE03,0xDE0E,0xDE04,0xDE07,0xDE10,
+ 0xDE27,0xDE28,0xDE0D,0xDE29,0xDE0F,0xDE22,0xDE11,0xDC85,0xDC84,0xDC83,
+ 0xDC8A,0xDC86,0xDD10,0xDD58,0xDD5A,0xDF0C,0xDDC4,0xDDC5,0xDE47,0xDE49,
+ 0xDE4A,0xDE4B,0xDDBB,0xDE8D,0xDE8B,0xDF07,0xDF06,0xDC20,0xDEEF,0xDEF0,
+ 0xDEED,0xDEF9,0xDF02,0xDEE7,0xDEF4,0xDEF7,0xDEF1,0xDC53,0xDC55, 0,
+ 0xDCDA,0xDCD9, 0,0xDD38,0xDD99,0xDDA2,0xDD9C,0xDD9A,0xDD9B,0xDDE5,
+ 0xDDE3,0xDDE1,0xDDE0,0xDDE2,0xDDE4,
+ /* plane 6, row 10 */
+ 2 | (94 << 8), /* first, last */
+ 0xD842,0xD87E,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0x3549,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0x357C,0xD843,0xD843,0xD87E,0xD843,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0x37BF,0xD847,0xD847,0xD847,
+ 0xD847,0x37BA,0xD847,0xD847,0xD848,
+ 2, /* first low-surrogate */
+ 0xDDE8,0xDC2F,0xDE13,0xDE56,0xDE4B,0xDE4A,0xDE4D,0xDE4C,
+ 0,0xDEEA,0xDEE9,0xDEEB,0xDEEC,0xDF3A,0xDF3C,0xDF39,0xDF3B,0xDC14,
+ 0xDC0E,0xDC35,0xDC0A,0xDC3F,0xDC38, 0,0xDC4E,0xDC17,0xDC3F,0xDC1E,
+ 0xDDB6,0xDDCE,0xDDCA,0xDDCB,0xDDCC,0xDDC9,0xDEB4,0xDEAC,0xDE88,0xDE86,
+ 0xDE8C,0xDE93,0xDE8A,0xDEA4,0xDE87,0xDEA5,0xDEA6,0xDE85,0xDEA3,0xDE8E,
+ 0xDD1F,0xDD63,0xDD8D,0xDDFA,0xDDFB,0xDE09,0xDDFE,0xDDFF,0xDE02,0xDE04,
+ 0xDDFD,0xDE05,0xDEF9,0xDEF7,0xDEDB,0xDEDA,0xDD51,0xDD50,0xDD57,0xDDE2,
+ 0xDDD8,0xDDDA,0xDDDC,0xDF20,0xDF1F,0xDF69,0xDFDD,0xDC40,0xDC41,0xDC43,
+ 0xDD0D,0xDD0C,0xDD87,0xDDA9,0xDD92,0xDD85, 0,0xDD8C,0xDDA2,0xDD8F,
+ 0xDD8A, 0,0xDD8D,0xDFF1,0xDC37,
+ /* plane 6, row 11 */
+ 1 | (94 << 8), /* first, last */
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD849,0xD87E,0xD849,0xD849,0xD849,0xD849,
+ 0x38D8,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,
+ 0x39B2,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD87E,0xD84A,0xD84A,0xD87E,0xD84A,0xD84A,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD851,0xD84B,0xD84C,0xD84C,0xD84C,
+ 0x3AC4,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 1, /* first low-surrogate */
+ 0xDC8B,0xDC87,0xDC82,0xDD8E,0xDDBC,0xDDF8,0xDDFA,0xDDEB,0xDDF9,
+ 0xDDFC,0xDE05,0xDF1B,0xDF1D,0xDF1E,0xDC92,0xDF3C,0xDF3E,0xDF84,0xDFC8,
+ 0xDFC9,0xDFD3,0xDFC7,0xDFD2,0xDC55,0xDC96,0xDC8C,0xDC8A,0xDCD5,0xDCD3,
+ 0,0xDCD8,0xDDD0,0xDDEE,0xDDF1,0xDDFB,0xDDD3,0xDDEC,0xDDCD,0xDE15,
+ 0xDE26,0xDE0E,0xDE27,0xDE2A,0xDE00,0xDE04,0xDE28,0xDE08,0xDE14,0xDD9B,
+ 0,0xDDA1,0xDD9D,0xDDA0,0xDD9E,0xDDA2,0xDD9C,0xDE32,0xDE34,0xDE93,
+ 0xDE96,0xDE90,0xDEB4,0xDEB5,0xDCB6,0xDEB6,0xDEC2,0xDCB5,0xDEBA,0xDE92,
+ 0xDEFB,0xDF05,0xDEF3,0xDEFE,0xDEFD,0xDD5D,0xDEFA,0xDC43,0xDC95,0xDC94,
+ 0,0xDD6F,0xDD73,0xDD5C,0xDD5B,0xDD66,0xDD74,0xDD63,0xDD67,0xDD60,
+ 0xDD62,0xDD71,0xDD72,0xDD5E,0xDF23,
+ /* plane 6, row 12 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84C,0xD84C,0xD87E,0xD84C,0xD84D,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD87E,0xD840,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,
+ 0xD84F,0xD87E,0xD850,0xD850,0xD87E,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0x3E2B,0xD851,0xD851,0xD851,0x3E61,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0x72DD,
+ 1, /* first low-surrogate */
+ 0xDF26,0xDF64,0xDCD6,0xDFF2,0xDC01,0xDFDD,0xDFDC,0xDFDB,0xDFF3,
+ 0xDFFD,0xDFD8,0xDFF8,0xDFFB,0xDC83,0xDC8C,0xDC8E,0xDD49,0xDD54,0xDD52,
+ 0xDD4E,0xDD58,0xDD51,0xDD55,0xDD53,0xDD57,0xDD50,0xDD4F,0xDD4D,0xDDD2,
+ 0xDDD3,0xDDC9,0xDDD4,0xDEEF,0xDCF8,0xDCB1,0xDF05,0xDF04,0xDF2E,0xDF2D,
+ 0xDC45,0xDC5B,0xDC5A,0xDC59,0xDC9D,0xDC8E,0xDCBC,0xDCDD,0xDCBA,0xDCFD,
+ 0xDCD8,0xDCCB,0xDCD9,0xDCDA,0xDCC4,0xDCB8,0xDCBF,0xDCDB,0xDCC1,0xDCFC,
+ 0xDCC5,0xDD19,0xDDB1,0xDDAF,0xDD18,0xDCF7,0xDCF6,0xDCF8,0xDD50,0xDD51,
+ 0xDD71,0xDD70,0xDDB0,0xDDAF,0xDDAE,0xDDAD,0xDE25,0xDE2C,0xDE22,0xDE33,
+ 0xDE34, 0,0xDF3A,0xDF40,0xDF68, 0,0xDF64,0xDF5C,0xDF57,0xDF53,
+ 0xDF4F,0xDF51,0xDF54,0xDF66,
+ /* plane 6, row 13 */
+ 1 | (94 << 8), /* first, last */
+ 0x3EB2,0xD852,0xD852,0xD87E,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD847,0xD840,0xD840,0xD853,0xD853,0xD853,0xD853,0xD849,0xD853,
+ 0xD844,0xD853,0xD853,0xD853,0xD853,0xD853,0xD87E,0xD854,0xD854,0xD87E,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD87E,0xD87E,0xD855,
+ 0xD855,0x4129,0xD855,0xD856,0xD856,0xD856,0x4192,0xD856,0xD856,0xD857,
+ 0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,
+ 0xD84D,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD87E,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 2, /* first low-surrogate */
+ 0xDD0D,0xDD08,0xDD2B,0xDCFA,0xDEEA,0xDF2A,0xDFBB,0xDFD5,
+ 0xDFD7,0xDDA4,0xDCF0,0xDCB5,0xDC06,0xDC28,0xDC22,0xDC21,0xDC56,0xDC23,
+ 0xDDCD,0xDD30,0xDD34,0xDFC9,0xDFCA,0xDFC8,0xDD3D,0xDC44,0xDCF3,0xDD41,
+ 0xDCF8,0xDCFC,0xDCF6,0xDCFB,0xDCF7,0xDD00,0xDD02,0xDD40,0xDD4D,0xDC24,
+ 0xDE0D, 0,0xDF62,0xDD30,0xDD2B,0xDD2A, 0,0xDD2D,0xDEDA,0xDE28,
+ 0xDF86,0xDE77,0xDE7C,0xDF50,0xDF4E,0xDFF2,0xDCB2,0xDCCE,0xDCCF,0xDCE5,
+ 0xDC07,0xDD35,0xDD31,0xDE13,0xDE2B,0xDE2C,0xDE45,0xDE60,0xDE41,0xDE58,
+ 0xDE47,0xDE5B,0xDE50,0xDD82,0xDE5F,0xDE4A,0xDE56,0xDE43,0xDE44,0xDE51,
+ 0xDCFD,0xDD34,0xDD35,0xDD54,0xDD55,0xDE0C,0xDE0B,0xDE0A,0xDEF9,0xDF35,
+ 0xDF24,0xDF13,0xDF1C,0xDF69,0xDF25,
+ /* plane 6, row 14 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD87E,0xD87E,0xD87E,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD864,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0x3458,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD87E,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD87E,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,
+ 1, /* first low-surrogate */
+ 0xDF21,0xDD95,0xDD96,0xDD98,0xDE20,0xDDA9,0xDDA8,0xDDDE,0xDE09,
+ 0xDE0A,0xDE0B,0xDFE3,0xDC07,0xDCB2,0xDCB3,0xDD5D,0xDE58,0xDE86,0xDE87,
+ 0xDFB9,0xDFB8,0xDC0C,0xDC44,0xDC66,0xDC80,0xDC75,0xDC6D,0xDC7E,0xDC67,
+ 0xDC81,0xDC77,0xDEA8,0xDEA2,0xDEA5,0xDE9B,0xDC57,0xDE0F,0xDE32,0xDE2C,
+ 0xDE33,0xDDE7,0xDC6E,0xDCB7,0xDCF6,0xDCF2,0xDCF3,0xDD17,0xDD30,0xDD54,
+ 0xDD53,0xDE52,0xDE3D,0xDE3C,0xDE34,0xDE33,0xDE54,0xDE2F, 0,0xDE55,
+ 0xDE3F,0xDE37,0xDE56,0xDE61,0xDE58,0xDC06,0xDE3B,0xDE32,0xDE2E,0xDE3E,
+ 0xDC3B,0xDC8C,0xDC8D,0xDD13,0xDD16,0xDD12,0xDD5B,0xDD8A,0xDDD7,0xDDCE,
+ 0xDE50,0xDE51,0xDE4F,0xDE8E,0xDE8F,0xDEF2,0xDC21,0xDF28,0xDF1A,0xDF25,
+ 0xDF1D,0xDF14,0xDF20,0xDF1F,0xDF1B,
+ /* plane 6, row 15 */
+ 1 | (94 << 8), /* first, last */
+ 0xD841,0xD841,0xD841,0xD841,0xD87E,0xD842,0x351C,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD87E,0xD842,0xD842,0xD842,0xD842,0xD87E,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0x3637,
+ 0xD844,0xD844,0xD844,0xD852,0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,
+ 1, /* first low-surrogate */
+ 0xDF17,0xDF15,0xDF1C,0xDF13,0xDC25,0xDC60, 0,0xDC66,0xDCE3,
+ 0xDCDE,0xDCE0,0xDCE1,0xDD1A,0xDD1B,0xDD18,0xDD1C,0xDD19,0xDD42,0xDD40,
+ 0xDD3E,0xDD44,0xDD74,0xDD43,0xDC2D,0xDDF2,0xDE1B,0xDE19,0xDE1E,0xDC30,
+ 0xDE5E,0xDE66,0xDE5D,0xDE5A,0xDE5F,0xDE60,0xDE5B,0xDE5C,0xDE59,0xDEF0,
+ 0xDEF1,0xDF43,0xDF40,0xDF42,0xDF41,0xDF3F,0xDC57,0xDC69,0xDC6F,0xDCAB,
+ 0xDC71,0xDC93,0xDC56,0xDC90,0xDC6D,0xDC6C,0xDC70,0xDC66,0xDC67,0xDDD7,
+ 0xDDB5,0xDDDB,0xDDD8,0xDDD5,0xDDD4,0xDEBA,0xDEB7,0xDEBE,0xDEB9, 0,
+ 0xDEE0,0xDEDD,0xDEDE,0xDD18,0xDED8,0xDEBD,0xDEDB,0xDD1D,0xDD25,0xDF21,
+ 0xDF0C,0xDF29,0xDF2D,0xDF1B,0xDF0E,0xDF1F,0xDF04,0xDF1C,0xDF05,0xDF06,
+ 0xDF20,0xDF0D,0xDF2A,0xDF23,0xDF11,
+ /* plane 6, row 16 */
+ 1 | (94 << 8), /* first, last */
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD853,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD848,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD87E,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0x3843,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0x38B4,0xD841,0xD840,0xD848,0xD848,
+ 1, /* first low-surrogate */
+ 0xDD5C,0xDD66,0xDD5B,0xDD4F,0xDD5E,0xDD5D,0xDDF1,0xDDEA,0xDDF4,
+ 0xDDEB,0xDDF0,0xDDFA,0xDDFB,0xDF28,0xDF2C,0xDF6B,0xDF2A,0xDF6A,0xDF6F,
+ 0xDFDB,0xDFE0,0xDFD1,0xDFE3,0xDFE5,0xDFE7,0xDC4D,0xDC55,0xDC54,0xDC53,
+ 0xDC52,0xDC4E,0xDC60,0xDDC0,0xDD0F,0xDD11,0xDD13,0xDDC6,0xDDB3,0xDDC7,
+ 0xDDD2,0xDDB8,0xDDAC,0xDDAE,0xDDCF,0xDDC5,0xDC7B,0xDDCC,0xDDAB,0xDDC9,
+ 0xDDB9,0xDFFB,0xDFF8,0xDFF7,0xDFF9,0xDC20,0xDC3B,0xDC39,0xDC9E,0xDC9A,
+ 0xDCAA,0xDCAB,0xDCAF,0xDC96,0xDCA9,0xDCA6,0xDC91, 0,0xDCAE,0xDC9F,
+ 0xDCAC,0xDCA0,0xDD92,0xDD91,0xDDBF,0xDE17,0xDE0A,0xDE0C,0xDF4A,0xDF46,
+ 0xDF34,0xDF45,0xDF43,0xDF44,0xDC93,0xDF87,0xDF86,0xDF8A,0xDFDA,0xDFD8,
+ 0,0xDD18,0xDD34,0xDFD6,0xDFD4,
+ /* plane 6, row 17 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD849,0xD849,0xD849,0x38E0,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD87E,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD87E,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD87E,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD855,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0x3AE4,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD87E,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0x6804,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x3C26,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 1, /* first low-surrogate */
+ 0xDC54,0xDC59,0xDC5A,0xDC57, 0,0xDCDD,0xDCE9,0xDCE0,0xDE05,
+ 0xDE12,0xDE13,0xDE07,0xDE16,0xDE23,0xDE02,0xDCA1,0xDE4A,0xDE36,0xDE40,
+ 0xDE56,0xDE43,0xDCA0,0xDE4B,0xDE46,0xDE3E,0xDE49,0xDDA7,0xDDB6,0xDDA6,
+ 0xDDA8,0xDDAC,0xDDA9,0xDDAB,0xDE38,0xDE37,0xDE39,0xDE41,0xDE3E,0xDEC0,
+ 0xDEBB,0xDEBF,0xDEBD,0xDEFE,0xDF1E,0xDEEE,0xDEFC,0xDCB7,0xDEF9,0xDF06,
+ 0xDEE4,0xDEE9,0xDEE5,0xDF03,0xDEFD,0xDF49,0xDEBE,0xDF0A,0xDE26,0xDF18,
+ 0xDF0D,0xDF0F,0xDF0E,0xDF20,0xDC71,0xDC99,0xDCE2,0xDCDF,0xDCDE,0xDD78,
+ 0xDD79, 0,0xDD7C,0xDD7D,0xDD84,0xDD8B,0xDD8A,0xDCD2,0xDD89,0xDF2C,
+ 0xDF29,0xDF6C, 0,0xDC09,0xDC08,0xDC0C,0xDC0D,0xDC10, 0,0xDC9F,
+ 0xDC98,0xDCA2,0xDC9A,0xDDD5,0xDDE2,
+ /* plane 6, row 18 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD847,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD87E,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD87E,0xD851,0xD851,0xD851,
+ 0xD851,0x3E6F,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD842,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD87E,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,
+ 1, /* first low-surrogate */
+ 0xDDF0,0xDDEA,0xDDEB,0xDDED,0xDDE8,0xDDE0,0xDE85,0xDE86,0xDEF0,
+ 0xDE46,0xDF45,0xDF38,0xDF3E,0xDF42,0xDF40,0xDC47,0xDC5C,0xDC5E,0xDCB4,
+ 0xDCC2,0xDD14,0xDCE5,0xDD15,0xDD11,0xDCFF,0xDCEE,0xDCE7,0xDCF5,0xDCF4,
+ 0xDCE8,0xDD01,0xDCEF,0xDCF1,0xDD00,0xDDDB,0xDDBF,0xDDDA,0xDDC7,0xDDDD,
+ 0xDD1A,0xDDEB,0xDDE1,0xDDC1,0xDDBD,0xDD07,0xDCFD,0xDD01,0xDD0A,0xDD03,
+ 0xDD72,0xDD74,0xDD75,0xDDB2,0xDDB1,0xDDB4,0xDE4C,0xDE42,0xDE40,0xDE49,
+ 0xDE3C,0xDE4D,0xDE4A,0xDE3B,0xDF61,0xDF74,0xDD26,0xDF7F,0xDF7A,0xDF88,
+ 0xDF7C, 0,0xDF70,0xDD0F,0xDD28,0xDD13,0xDD2A,0xDEED,0xDEEF,0xDF2E,
+ 0xDFC1,0xDFDD,0xDF47,0xDC2D,0xDC2B,0xDC35,0xDC2F,0xDC31,0xDC34,0xDD35,
+ 0xDC30,0xDD3A,0xDD39,0xDD37,0xDD4B,
+ /* plane 6, row 19 */
+ 1 | (94 << 8), /* first, last */
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD87E,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0x401C,0xD854,0xD854,0xD854,0xD854,0xD87E,
+ 0xD85A,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0x4100,0xD855,0xD87E,0xD855,0xD84F,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0x42B6,0xD857,
+ 0xD87E,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD859,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0x43E4,0xD859,
+ 1, /* first low-surrogate */
+ 0xDD54,0xDD4D,0xDD51,0xDD47,0xDF27,0xDF50,0xDF4D,0xDF4E,0xDF54,
+ 0xDFD2,0xDFCE,0xDC4B,0xDC49,0xDD05,0xDD0F,0xDD19,0xDD43,0xDD06,0xDD0C,
+ 0xDD29,0xDD04,0xDD08,0xDD25, 0,0xDD03,0xDD27,0xDD10,0xDD0A,0xDD42,
+ 0xDF5D,0xDFAA,0xDFAB,0xDFA9,0xDC41,0xDC3A,0xDC3C,0xDC2B,0xDC49,0xDE15,
+ 0,0xDE16,0xDD53,0xDE31,0xDC4A,0xDF3C,0xDF7C,0xDF6D,0xDF6A,0xDF63,
+ 0xDF6B,0xDF7B,0xDF64,0xDF7A,0xDF69,0xDF6F,0xDD37,0xDD35,0xDD3C,0xDD36,
+ 0xDD3D,0xDD3E,0xDEE1,0xDEE0,0xDE2D,0xDE2B,0xDF8D,0xDF92, 0,0xDF8E,
+ 0xDD6B,0xDF91,0xDF96,0xDE7B,0xDE78,0xDE81,0xDE96,0xDEA3,0xDE95,0xDE97,
+ 0xDF54,0xDF52,0xDFF5,0xDC00,0xDFFB,0xDFF4,0xDFF6,0xDCE8,0xDCEA,0xDE3E,
+ 0xDE3D,0xDE3B,0xDE80, 0,0xDE88,
+ /* plane 6, row 20 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD844,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0x44AD,0xD85A,0x82FF,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD87E,0xD85A,0xD85A,0xD87E,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD860,0xD87E,0xD860,0xD861,0x8FEC,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0x48C3,0xD862,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD852,
+ 0xD841,0xD865,0xD865,0xD865,0xD865,
+ 1, /* first low-surrogate */
+ 0xDE81,0xDE82,0xDECE,0xDE83,0xDE77,0xDE79,0xDE73,0xDE6D,0xDE70,
+ 0xDE8D,0xDE75,0xDE8C,0xDE6A,0xDE91,0xDE89,0xDE8E,0xDEDC,0xDCFF,0xDD59,
+ 0xDDC7,0xDE12,0xDE14,0xDE13,0xDECB,0xDF42, 0,0xDF3D, 0,0xDF40,
+ 0xDF44,0xDF62,0xDF43,0xDF3F,0xDF45,0xDF3C,0xDD97,0xDF46,0xDF47,0xDDB3,
+ 0xDD9E,0xDD9D,0xDE2C,0xDE29,0xDE2F,0xDE2E,0xDE30,0xDDE1,0xDDE2,0xDE0E,
+ 0xDE19,0xDE12,0xDCB4,0xDFDA,0xDD26,0xDE59,0xDE5A,0xDE88,0xDFC0,0xDFBA,
+ 0xDEA0,0xDDDD,0xDEA2,0xDC86, 0,0xDC9D,0xDC88,0xDC8F,0xDC8E,0xDC9B,
+ 0xDEC1,0xDEC3,0xDEC4,0xDE96,0xDEC7,0xDEC6,0xDEBF, 0,0xDD0F,0xDE55,
+ 0xDE42,0xDE46,0xDE4B,0xDE43,0xDE53,0xDE48,0xDE49,0xDE4A,0xDE4E,0xDFDE,
+ 0xDE91,0xDC4B,0xDE80,0xDE81,0xDE83,
+ /* plane 6, row 21 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD865,0xD848,0xD842,0xD840,0xD840,0xD840,0xD847,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD842,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0x3467,0xD840,0xD840,0xD840,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD87E,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD87E,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0x53DE,0xD842,
+ 0xD842,0xD842,0xD842,0x3596,0xD87E,
+ 1, /* first low-surrogate */
+ 0xDE8A,0xDE82,0xDF42,0xDD22,0xDC70,0xDC71,0xDCBC,0xDD18,0xDCBE,
+ 0xDCBA,0xDCF8,0xDD37,0xDD35,0xDEFC,0xDD56,0xDD59,0xDD5E,0xDE6D,0xDE91,
+ 0xDE92,0xDE68,0xDE66,0xDE73, 0,0xDE96,0xDE8B,0xDE8C,0xDC96,0xDCEE,
+ 0xDD1C,0xDD1A,0xDD19,0xDD1B,0xDD5D,0xDD5E,0xDC18,0xDDDC,0xDDE2,0xDE52,
+ 0xDE92,0xDF30,0xDF52,0xDF42,0xDF41,0xDF45,0xDF37,0xDF40,0xDF3F,0xDF3D,
+ 0xDF38,0xDF3A,0xDF49,0xDC6B,0xDC78,0xDC79,0xDC26,0xDC6C,0xDCE9,0xDCE6,
+ 0xDCE5,0xDCEA,0xDCE7,0xDCE8,0xDD1F,0xDD4B,0xDD4A,0xDD53,0xDD76,0xDDA3,
+ 0xDDA4,0xDDF6,0xDDF3,0xDDF9,0xDDF7,0xDDFC,0xDE1D,0xDE6D,0xDE71,0xDE6C,
+ 0xDE6E,0xDE70,0xDE6F,0xDE67,0xDE68,0xDEFA,0xDEF9,0xDF4E, 0,0xDF4D,
+ 0xDF4F,0xDF4A,0xDF4C, 0,0xDC42,
+ /* plane 6, row 22 */
+ 1 | (94 << 8), /* first, last */
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD87E,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,0xD84B,0xD845,0xD845,0xD845,
+ 0xD845,0xD842,0xD845,0xD845,0xD87E,0xD87E,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0x5A30,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0x3759,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0x5BB2,0xD87E,0x3776,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD858,0xD847,0x37D2,0xD847,0xD847,
+ 1, /* first low-surrogate */
+ 0xDCEE,0xDCB2,0xDCC0,0xDCC1,0xDCF4,0xDCC8,0xDCC5,0xDCC6,0xDCAD,
+ 0xDDE2,0xDDEA,0xDDE3,0xDDE1,0xDEF7,0xDF01,0xDF12,0xDEF6,0xDEF1,0xDF1F,
+ 0xDEEE,0xDC52,0xDEF3,0xDF15,0xDF16,0xDF17,0xDEF8,0xDF19,0xDEF2,0xDEF4,
+ 0xDEF5,0xDF13,0xDF06,0xDD26,0xDD24,0xDD5A,0xDEC8,0xDD97,0xDD95,0xDD9A,
+ 0xDE1F,0xDEFB,0xDE29,0xDE20,0xDC62,0xDC63,0xDF4C,0xDF30,0xDF38,0xDF3D,
+ 0xDF51,0xDF4F,0xDF4A,0xDF34,0xDF36, 0,0xDD6A,0xDD68,0xDE1C,0xDE0E,
+ 0xDE1E, 0,0xDE09,0xDE08,0xDE13,0xDE01,0xDE0F,0xDE14,0xDE06,0xDE07,
+ 0,0xDC73, 0,0xDF79,0xDFEA,0xDFED,0xDFE9,0xDFEE,0xDC68,0xDC64,
+ 0xDC67,0xDC72,0xDC62,0xDC74,0xDC79,0xDD19,0xDD17,0xDD15,0xDD16,0xDDE6,
+ 0xDEA4,0xDDEE, 0,0xDDDF,0xDDE4,
+ /* plane 6, row 23 */
+ 1 | (94 << 8), /* first, last */
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD841,0xD848,0xD848,
+ 0xD848,0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,
+ 0xD84E,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0x3920,0xD849,0xD849,0xD849,0xD849,0xD849,0x3929,0xD849,
+ 0xD849,0xD849,0x3938,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD87E,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 1, /* first low-surrogate */
+ 0xDDDA,0xDDEA,0xDDED,0xDDE3,0xDDE9,0xDFFD,0xDE57,0xDC21,0xDCC6,
+ 0xDCB8,0xDCCB,0xDC85,0xDCBD,0xDCB5,0xDCBB,0xDCBF,0xDCBE,0xDCB2,0xDCC1,
+ 0xDCC2,0xDD99,0xDDC6,0xDE2C,0xDE2D,0xDE25,0xDE1E,0xDE1F,0xDE23,0xDF50,
+ 0xDF4E,0xDF4D,0xDF52,0xDFE9,0xDFEC,0xDFE8,0xDC58,0xDC5C,0xDC5B,0xDC8F,
+ 0xDD72,0xDCF6,0xDD00,0xDCFC,0xDCF8,0xDCEA,0xDCFE,0xDCF7,0xDCFD,0xDE70,
+ 0xDE62,0xDE44, 0,0xDE4D,0xDE4C,0xDE3F,0xDE66,0xDE35, 0,0xDE34,
+ 0xDE8D,0xDE84, 0,0xDE86,0xDE89,0xDE87,0xDE83,0xDE75,0xDE79,0xDEAF,
+ 0xDEB0,0xDDB7,0xDDBB,0xDDB9,0xDE46,0xDE47,0xDE45,0xDEEA,0xDEF6,0xDF68,
+ 0xDF39,0xDCB9,0xDF3D,0xDF3B,0xDF4D,0xDF30,0xDF4A,0xDF3E,0xDF40,0xDF4C,
+ 0xDF47,0xDF38,0xDF52,0xDF3A,0xDF53,
+ /* plane 6, row 24 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0x3A89,0x3AB0,0xD84C,0xD84C,0xD84C,0x3ABF,0xD84C,0xD84C,0xD84C,
+ 0x3AC5,0xD84C,0xD87E,0x3AEA,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD87E,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD87E,0xD84D,
+ 0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x3C37,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84F,0xD84F,0x3CE4,0xD84F,0xD87E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 1, /* first low-surrogate */
+ 0xDEC4,0xDEC1,0xDF1C,0xDF1D,0xDF2A,0xDF1E,0xDF2F,0xDF22,0xDF2E,
+ 0xDF25, 0, 0,0xDC4A,0xDC4B,0xDC76, 0,0xDCE8,0xDCEF,0xDCE9,
+ 0,0xDCEA,0xDCCC, 0,0xDD9B,0xDD9E,0xDD93,0xDDA7,0xDD9C,0xDDA0,
+ 0xDD9A,0xDDAB,0xDDBE,0xDDA9,0xDF2D,0xDF6E,0xDC44,0xDC3D,0xDC3A,0xDC68,
+ 0xDC3C,0xDC6A,0xDCE0,0xDC38,0xDC65,0xDC39,0xDC6D,0xDC36,0xDCE3,0xDC3E,
+ 0xDC7E,0xDC37,0xDC99,0xDCA9,0xDCAD,0xDCA7,0xDCA8,0xDD66,0xDD69,0xDD6D,
+ 0xDD67,0xDD6B,0xDD6A,0xDDEE,0xDE01,0xDE03,0xDDF4,0xDDFB, 0,0xDDF6,
+ 0xDDFC,0xDEF4,0xDF08,0xDF0A,0xDF09,0xDF6D,0xDF62,0xDF41,0xDF5E,0xDF5C,
+ 0xDCF3,0xDD26, 0,0xDD39,0xDD04,0xDD6C,0xDD2B,0xDD2E,0xDD3B,0xDD5E,
+ 0xDDFB,0xDD27,0xDD24,0xDD69,0xDD30,
+ /* plane 6, row 25 */
+ 1 | (94 << 8), /* first, last */
+ 0xD87E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD87E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x3CE8,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,
+ 0xD851,0xD851,0x3E20,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD853,0xD843,0xD853,0xD853,0xD853,0xD853,0xD853,0xD840,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0x3F86,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD854,0xD854,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDD05,0xDD62,0xDD38,0xDD35,0xDD2A,0xDD2C,0xDD68,0xDD31,0xDD2F,
+ 0xDD2D,0xDD3A,0xDD36,0xDD03,0xDD21,0xDD3C,0xDD20,0xDD64,0xDD3E, 0,
+ 0xDDF7,0xDE12,0xDDF1,0xDDF5,0xDE22,0xDDF2,0xDDDF,0xDE15,0xDE16,0xDD7A,
+ 0xDD76,0xDDBE, 0,0xDDBD,0xDE09,0xDE08,0xDE57,0xDFA3,0xDFBF,0xDFB8,
+ 0xDFAF,0xDF9C,0xDFA5,0xDF72,0xDF75,0xDF9D,0xDF99,0xDFB9,0xDD4E,0xDD39,
+ 0xDD3B,0xDD35,0xDD3C,0xDD55,0xDEF0,0xDEF3,0xDEF4,0xDF3B,0xDF3C,0xDF3A,
+ 0xDF36,0xDC07,0xDCEB,0xDC55,0xDC50,0xDC4F,0xDC52,0xDC56,0xDCBD,0xDC32,
+ 0xDD63,0xDD6B,0xDD66,0xDD57,0xDD5D, 0,0xDD6D,0xDD61,0xDD69,0xDD5A,
+ 0xDD5C,0xDD62,0xDF2A,0xDF29,0xDF58,0xDF5A,0xDFD7,0xDFDB,0xDFDC,0xDFDD,
+ 0xDFD8,0xDC54,0xDC5B,0xDC5C,0xDC53,
+ /* plane 6, row 26 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD87E,0xD87E,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD87E,0xD855,0xD855,0xD855,0xD855,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD840,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0x4356,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0x4367,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,
+ 1, /* first low-surrogate */
+ 0xDC4F,0xDC56,0xDC50,0xDC5A,0xDC6B,0xDD36,0xDD53,0xDD3A,0xDD3C,
+ 0xDD3E,0xDD49,0xDD40,0xDD46,0xDD47,0xDF64,0xDF65,0xDFB5,0xDFB6,0xDFB2,
+ 0xDC48,0xDC4A,0xDC72,0xDC69,0xDC5A,0xDC4C,0xDE2C,0xDE30,0xDE4B,0xDE49,
+ 0xDE42,0xDE44,0xDE4A,0xDE4F,0xDF92,0xDD57,0xDF97,0xDF80,0xDF82,0xDF86,
+ 0xDD53,0xDD5E,0xDD52,0xDD5B,0xDD4E,0xDE6D,0xDE6E,0xDEFA,0xDEF6,0xDEFB,
+ 0xDE33,0xDE3D,0xDE37,0xDE3E,0xDE35,0xDF9A,0xDFAB,0xDFA6,0xDFB0,0xDF99,
+ 0xDFA0,0xDF9E,0xDFA8,0xDFA1,0xDFAA,0xDFAD,0xDFBB,0xDF9C,0xDFA5,0xDCB3,
+ 0xDE27,0xDE8D,0xDE8E,0xDE8F,0xDE92, 0,0xDE91,0xDEAD,0xDF57,0xDF58,
+ 0xDF5E,0xDF5D,0xDF5C,0xDF5B, 0,0xDC0A,0xDC03,0xDC0E,0xDCB8,0xDD4D,
+ 0xDD3F,0xDD47,0xDD4B,0xDD4A,0xDD3D,
+ /* plane 6, row 27 */
+ 1 | (94 << 8), /* first, last */
+ 0x8038,0xD859,0xD859,0x8081,0xD859,0xD859,0xD859,0x43D1,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0x43EB,0xD859,0xD859,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD847,0xD85A,0xD85A,0xD85A,
+ 0xD87E,0xD85A,0xD85A,0xD85A,0x44B6,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0x45A3,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD87E,0xD85D,0x4610,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 2, /* first low-surrogate */
+ 0xDD41,0xDD4C, 0,0xDE62,0xDE69,0xDE61, 0,0xDEAA,
+ 0xDEA6,0xDEAC,0xDEBD,0xDEBB,0xDEA4,0xDEBA,0xDE9A, 0,0xDEA1,0xDEC1,
+ 0xDCE0,0xDD0A,0xDD03,0xDD06,0xDD39,0xDD3A,0xDD36,0xDD5B,0xDD5F,0xDD5E,
+ 0xDD67,0xDD61,0xDD62,0xDD5D,0xDDCA,0xDDCC,0xDDCE,0xDE18,0xDE1D,0xDE1F,
+ 0xDE20,0xDE17,0xDE15,0xDF1F,0xDF27,0xDF26,0xDE10,0xDF8B,0xDFAE,0xDF8A,
+ 0xDD99,0xDF92,0xDF89,0xDF87, 0,0xDF8F,0xDF84,0xDF83,0xDF8C,0xDF93,
+ 0xDF8D,0xDF98,0xDF7D,0xDF7E,0xDFD2,0xDF80,0xDF99,0xDDAC,0xDE50,0xDE55,
+ 0xDE42,0xDE3F,0xDE3C, 0,0xDE4C,0xDE49,0xDE57,0xDE58,0xDE4F,0xDE5C,
+ 0xDE47,0xDDB7,0xDDAB, 0,0xDDAF,0xDDAD,0xDDE8,0xDDE7,0xDE30,0xDE26,
+ 0xDE2F,0xDE28,0xDE2B,0xDE1D,0xDE2D,
+ /* plane 6, row 28 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85E,0xD85E,0xD87E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD87E,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0x491B,0xD862,0x4987,
+ 0xD863,0xD842,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD864,0xD864,0xD865,0xD865,0xD87E,0xD865,0xD866,
+ 0xD842,0xD840,0xD842,0xD840,0xD840,
+ 1, /* first low-surrogate */
+ 0xDE20,0xDE2A,0xDE2C,0xDE35,0xDE21,0xDE23,0xDE24,0xDE36,0xDE37,
+ 0xDFE9,0xDCBA,0xDCB8,0xDDCC,0xDD6D,0xDD6A,0xDD68,0xDD69,0xDD6B,0xDD61,
+ 0xDFDC,0xDFDB,0xDC2D,0xDC2C,0xDCA2,0xDD2B,0xDD32,0xDDD7,0xDE94,0xDE92,
+ 0xDE90,0xDFC9,0xDFC4,0xDFC1,0xDFC3,0xDFCD,0xDE14,0xDEA7,0xDEAF,0xDEAA,
+ 0xDC0D,0xDC54,0xDC5B,0xDC61,0xDCAE,0xDCB3,0xDCC0,0xDCC4,0xDCBF,0xDCCB,
+ 0xDCAD,0xDCA7,0xDCA4,0xDCBD,0xDCAF,0xDCB2,0xDCA5,0xDEE7,0xDEE0,0xDECE,
+ 0xDEDE,0xDED5,0xDEDF,0xDED9,0xDFF2,0xDD23,0xDD40, 0,0xDD3E, 0,
+ 0xDCCF,0xDF54,0xDE5B,0xDE58,0xDE62,0xDE5F,0xDE67,0xDE63,0xDE5E,0xDE60,
+ 0xDF85,0xDF86,0xDF87,0xDDE8,0xDDE6,0xDE71,0xDE85,0xDE02,0xDE86,0xDC10,
+ 0xDDF8,0xDCBF,0xDF61,0xDCFE,0xDCFC,
+ /* plane 6, row 29 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD87E,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,0xD87E,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD87E,0xD87E,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0x3557,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD87E,0xD843,0xD843,
+ 1, /* first low-surrogate */
+ 0xDD39,0xDD61,0xDD60,0xDEE2,0xDEEA,0xDEE3,0xDEB4,0xDEAE,0xDEBE,
+ 0xDEB8,0xDEA8,0xDEAA,0xDEA9,0xDEB3,0xDED5,0xDEAD,0xDEB9,0xDEBB,0xDEB1,
+ 0xDEC2,0xDC08,0xDEEB,0xDEBA,0xDED2,0xDED4,0xDCF1,0xDD1D,0xDC12,0xDD62,
+ 0xDD8C,0xDDE6,0xDDE7,0xDE5A,0xDE58,0xDE59,0xDE96,0xDE97,0xDF61,0xDF67,
+ 0xDF71,0xDF65,0xDF7D,0xDF7E,0xDC7D,0xDC84,0xDC7C,0xDC7E,0xDC7F,0xDC80,
+ 0xDCEF,0xDCF4,0xDD1E,0xDD4E,0xDDFB,0xDDFA,0xDDFD,0xDC31,0xDC32,0xDE79,
+ 0xDE7C,0xDE7D,0xDE84,0xDE7B,0xDE78, 0,0xDF5E,0xDF5A,0xDF5C,0xDF59,
+ 0xDF55,0xDF63,0xDF56,0xDF5F,0xDF60,0xDF5B,0xDD4A,0xDD65,0xDDB3,0xDD2C,
+ 0xDD77,0xDD3D,0xDD52,0xDD61,0xDD2A,0xDD3E,0xDD34,0xDD29,0xDDB2,0xDDAD,
+ 0xDD40,0xDD53,0xDC44,0xDD3F,0xDD41,
+ /* plane 6, row 30 */
+ 1 | (94 << 8), /* first, last */
+ 0xD843,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD87E,0xD87E,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0x369D,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD87E,0xD845,
+ 0xD845,0xD845,0xD87E,0xD846,0xD846,0xD846,0xD846,0xD846,0x375F,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0x3779,0xD840,
+ 0xD846,0xD847,0xD847,0xD847,0xD847,0x3798,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0x37DC,0x5D2B,0xD847,0x37DF,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,
+ 1, /* first low-surrogate */
+ 0xDD72,0xDDF6,0xDDF5,0xDDF4,0xDDF2,0xDDF9,0xDF27,0xDF54,0xDF55,
+ 0xDF2E,0xDC54,0xDC53,0xDF2C,0xDF38,0xDF39,0xDF31,0xDF4F,0xDF73,0xDF30,
+ 0xDF2B,0xDF51,0xDD2C,0xDD5B,0xDD5C,0xDD68,0xDD6C,0xDD6B,0xDD69,0xDD9F,
+ 0xDE38,0xDE3C,0xDE3A,0xDE35, 0,0xDE39,0xDE36,0xDE3B,0xDF60,0xDF61,
+ 0xDF63,0xDF64,0xDF94,0xDF93,0xDF5E,0xDF68,0xDF6A,0xDF65,0xDC66,0xDF90,
+ 0xDF5F,0xDF72,0xDC65,0xDE3C,0xDE27,0xDE24,0xDE26,0xDE25, 0,0xDE28,
+ 0xDE36,0xDF31,0xDF30,0xDF34,0xDF81,0xDF7D,0xDF82,0xDF80, 0,0xDED3,
+ 0xDFF2,0xDC66,0xDC8C,0xDC7B,0xDC83, 0,0xDC8E,0xDC7A,0xDC92,0xDC91,
+ 0xDC82,0xDD1B,0xDD1C,0xDE27,0xDE21, 0, 0,0xDE43, 0,0xDE18,
+ 0xDE7B,0xDE1A,0xDE4B,0xDE4A,0xDE4D,
+ /* plane 6, row 31 */
+ 1 | (94 << 8), /* first, last */
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD87E,0xD87E,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD87E,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,
+ 1, /* first low-surrogate */
+ 0xDE4F,0xDE19,0xDE35,0xDE13,0xDE52,0xDE14,0xDE1E,0xDE2C,0xDE20,
+ 0xDE22,0xDE12,0xDE1F,0xDC00,0xDC23,0xDC40,0xDC43,0xDCE4,0xDCDB,0xDCEA,
+ 0xDCDD,0xDCCC,0xDCD9,0xDCE8,0xDCF6,0xDCE3,0xDCD3,0xDCDA,0xDCD6,0xDCE7,
+ 0xDE3A,0xDE3F,0xDE40,0xDE48,0xDE59,0xDE37,0xDE44,0xDC8C,0xDC8B,0xDE55,
+ 0xDE39,0xDF54,0xDF55,0xDF56,0xDF57,0xDF58,0xDF59,0xDF8D,0xDFF2,0xDFF8,
+ 0xDFF5,0xDFF6,0xDFFC,0xDFFE,0xDFF1,0xDFFD,0xDC5E,0xDC96,0xDC97,0xDC9C,
+ 0xDC9B,0xDC95,0xDC9A,0xDD1A,0xDD09,0xDD04,0xDD0E,0xDD1C,0xDD18,0xDD0D,
+ 0xDD10,0xDD0C,0xDD03,0xDE7B,0xDEA6,0xDE77,0xDE88,0xDE74,0xDEDA,0xDE76,
+ 0xDE78,0xDE8A,0xDE8F,0xDE7D,0xDE90,0xDEED,0xDED9,0xDED0,0xDF1A,0xDED7,
+ 0xDEE2,0xDEE1,0xDEC5,0xDEE0,0xDECA,
+ /* plane 6, row 32 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD849,0xD87E,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD87E,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0x39FD,0xD84A,
+ 0xD84A,0xD84A,0xD87E,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0x3AF4,0xD84C,0x3AEF,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD87E,0xD87E,0xD84C,0xD84C,0xD84C,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0x3C31,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 1, /* first low-surrogate */
+ 0xDF25,0xDECC,0xDCB3,0xDDC6,0xDDC1,0xDE4D,0xDF4B,0xDF64,0xDF95,
+ 0xDF99,0xDCBC,0xDF94,0xDFA2,0xDFAE,0xDF9E,0xDFA7,0xDF86, 0,0xDFA4,
+ 0xDF91,0xDF93,0xDCBB,0xDF88,0xDECD,0xDECA,0xDF3F,0xDF40,0xDF46,0xDF41,
+ 0xDF45,0xDF58,0xDF3B,0xDF48,0xDC4E,0xDC52,0xDC4F,0xDC7B,0xDC7A,0xDCA0,
+ 0xDC9F,0xDCFB,0xDCF7,0xDDB8,0xDDB9,0xDDBB,0xDDB7, 0,0xDDBA, 0,
+ 0xDDDA,0xDDB5,0xDDBF,0xDDBC,0xDDC0,0xDCD3,0xDCD9,0xDF75,0xDF79,0xDF76,
+ 0xDC35,0xDC40,0xDCC0,0xDC81,0xDCAD,0xDCAF,0xDCAC,0xDC8F,0xDCA8,0xDCAA,
+ 0xDCA9,0xDC88,0xDC7F,0xDC80,0xDCBC,0xDCAE,0xDCBB,0xDCBD, 0,0xDD78,
+ 0xDD74,0xDE0C,0xDE11,0xDE08,0xDE06,0xDE10,0xDE8F,0xDE90,0xDE8D,0xDE8E,
+ 0xDE96,0xDE95,0xDF0B,0xDF0C,0xDF7C,
+ /* plane 6, row 33 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0x3D03,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0x3D09,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD87E,0xD851,0xD87E,0xD851,0xD851,
+ 0x3E3E,0xD851,0xD851,0xD851,0xD87E,0xD853,0xD851,0x3E77,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0x3E7B,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD85A,0xD852,
+ 1, /* first low-surrogate */
+ 0xDF73,0xDF75,0xDF76,0xDF7D,0xDF78,0xDF71,0xDC4B,0xDC4E,0xDD33,
+ 0xDD32, 0,0xDD91,0xDDE7,0xDDE9,0xDDA2,0xDD94,0xDD87,0xDDA3,0xDDDD,
+ 0xDD7B,0xDD83,0xDD81,0xDDDF,0xDD7C,0xDDE4,0xDDE2,0xDD93,0xDD7D,0xDDBF,
+ 0xDD9B,0xDD8E,0xDD9F, 0,0xDD8C,0xDD7F,0xDD9C,0xDD84,0xDD42,0xDDE6,
+ 0xDE51,0xDE4A,0xDE64,0xDE25,0xDE2F,0xDE2E,0xDE2B,0xDE28,0xDE32,0xDE2D,
+ 0xDE31,0xDE39,0xDE2C,0xDE61,0xDD11,0xDD10,0xDD12,0xDD53,0xDD55,0xDD7B,
+ 0xDD81,0xDD7D,0xDD7C,0xDDC2,0xDDC5,0xDD22,0xDDC4,0xDD23,0xDE6B,0xDE68,
+ 0,0xDE5C,0xDE5D,0xDE6A,0xDD24,0xDC76,0xDF76, 0,0xDFC4,0xDFCB,
+ 0xDFC8,0xDFD4,0xDFD5,0xDFC9,0xDFD7, 0,0xDD78,0xDD5A,0xDD5B,0xDD5C,
+ 0xDD56,0xDD58,0xDD71,0xDDD4,0xDF40,
+ /* plane 6, row 34 */
+ 1 | (94 << 8), /* first, last */
+ 0xD87E,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD87E,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD87E,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0x413A,0xffff,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,0xD856,0x41A0,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x41E5,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD857,0xD857,
+ 1, /* first low-surrogate */
+ 0xDD33,0xDF3F,0xDF43,0xDF41,0xDFE2,0xDFE0,0xDFE3,0xDC66,0xDC73,
+ 0xDC6C,0xDC71,0xDC6A,0xDC6D,0xDC6E,0xDC6B,0xDD8C,0xDD77,0xDD3A,0xDD7F,
+ 0xDD89,0xDD7A,0xDD85,0xDD78,0xDD8A,0xDD86,0xDF2C,0xDF67,0xDF5B,0xDFE5,
+ 0xDFE1,0xDC61,0xDC69,0xDC6A,0xDD65,0xDD6D,0xDD63,0xDD86,0xDD5C,0xDD62,
+ 0xDD48,0xDD79,0xDD69,0xDD70,0xDD76,0xDD5D,0xDD87,0xDD6E,0xDD71,0xDD7C,
+ 0xDD73,0xDD5B,0xDD6B,0xDFBF,0xDFC1,0xDFBD,0xDFC9,0xDFBC,0xDFC2,0xDFC0,
+ 0xDC92,0xDCA9,0xDC8F,0xDC76,0xDC7B,0xDC75,0xDCA4,0xDE64,0xDF3D,0xDFAF,
+ 0, 0,0xDF9D,0xDF99,0xDFB1,0xDD63,0xDD62,0xDD64,0xDD69, 0,
+ 0xDE75,0xDE73,0xDE71,0xDE74,0xDF0C,0xDF16, 0,0xDF11,0xDF1F,0xDF1A,
+ 0xDF0D,0xDF1B,0xDF13,0xDE4E,0xDE55,
+ /* plane 6, row 35 */
+ 1 | (94 << 8), /* first, last */
+ 0xD857,0x427D,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0x436D,0xD858,
+ 0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0x43F8,0xD859,0x8158,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD840,0x4450,0xD85A,
+ 0xD85A,0xD846,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0x4468,0x4467,0xD85A,0xD85A,0xD85A,0xD85A,0xD87E,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85B,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDE50, 0,0xDFD2,0xDFD3,0xDFD1,0xDFF1,0xDFDC,0xDFC8,0xDFCC,
+ 0xDFD0,0xDFCF,0xDFDF,0xDE2B,0xDE2E,0xDE2D,0xDE9D,0xDE9E,0xDE9F,0xDEA9,
+ 0xDEA0,0xDE98,0xDEA1,0xDEAB,0xDEAF,0xDF6E,0xDF5F,0xDF5A, 0,0xDF65,
+ 0xDF68,0xDF72,0xDC17,0xDC16,0xDC18,0xDC19,0xDC1A,0xDC22,0xDC1B,0xDC1C,
+ 0xDCBE,0xDCEE,0xDD5A,0xDD50,0xDD58,0xDD54,0xDD57,0xDD56,0xDE15,0xDE9B,
+ 0xDE93,0xDE92,0xDE72,0xDE98,0xDE99,0xDEDF, 0,0xDED5, 0,0xDED4,
+ 0xDEF3,0xDEF4,0xDEE7,0xDEE1,0xDEE6,0xDEEB,0xDEEC,0xDEDB, 0,0xDD0D,
+ 0xDD0C,0xDF2F,0xDD68,0xDD65,0xDD6B,0xDD69,0xDDD1,0xDDD3,0xDE27,0xDE28,
+ 0, 0,0xDE24,0xDED7,0xDFCA,0xDFC7,0xDD9E,0xDFD8,0xDFE1,0xDFC6,
+ 0xDFF8,0xDFC3,0xDFF4,0xDC17,0xDFEA,
+ /* plane 6, row 36 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85A,0xD85A,0x44CF,0xD85A,
+ 0xD85A,0xD87E,0x44CD,0xD85B,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85B,0xD85A,0xD85A,0xD85A,0xD87E,0xD87E,0xD87E,
+ 0xD87E,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0x45AB,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x46C1,0xD85E,0xD85E,
+ 0x8A24,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,
+ 1, /* first low-surrogate */
+ 0xDFCB,0xDF86,0xDFC4,0xDFD9,0xDC19,0xDFC2,0xDFE2, 0,0xDFDE,
+ 0xDFED,0xDD9C, 0,0xDC1D,0xDFDD,0xDFDB,0xDFE8,0xDFE9,0xDFBF,0xDFE0,
+ 0xDFD1,0xDFDC,0xDFCE,0xDC1E,0xDFCC,0xDFF2,0xDFF3,0xDD9F,0xDDA2,0xDDA3,
+ 0xDDA1,0xDDAB,0xDDAA,0xDDA7,0xDDA9,0xDE88,0xDE75,0xDE60,0xDE6C,0xDE73,
+ 0,0xDE6E,0xDE74,0xDE76,0xDE68,0xDE77,0xDE86,0xDDEA,0xDE51,0xDE50,
+ 0xDE58,0xDE4D,0xDE4F,0xDE4E,0xDE5C,0xDE52,0xDE44,0xDE4A,0xDE4B,0xDFEA,
+ 0xDC10,0xDC11,0xDCCD,0xDCBF,0xDCC4,0xDCD0,0xDCCE,0xDCC0,0xDCC2,0xDCCF,
+ 0xDCC9,0xDCBB,0xDD97,0xDD92,0xDD6F,0xDD7E,0xDD9A, 0,0xDD86,0xDD73,
+ 0,0xDD77,0xDD8F,0xDD70,0xDD81,0xDD82,0xDD99,0xDD7D,0xDD7F,0xDD7B,
+ 0xDD87,0xDFB2,0xDC2F,0xDC34,0xDC2E,
+ /* plane 6, row 37 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85F,0x4747,0xD85F,0x4757,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0x8DC3,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0x484E,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD861,0xD862,0xD861,0xD862,
+ 0xD861,0xD862,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD840,0xD840,
+ 1, /* first low-surrogate */
+ 0xDC32, 0,0xDCAA, 0,0xDCA9,0xDD38,0xDD36,0xDD37,0xDD47,
+ 0xDD33,0xDD39,0xDD35,0xDD44,0xDEA5,0xDEA6,0xDE9E,0xDFE3,0xDFDF,0xDFD3,
+ 0xDFF1,0xDFE4,0xDFE0,0xDFD6, 0,0xDFE6,0xDFD8,0xDFDE,0xDFDB,0xDFDC,
+ 0xDE1B,0xDE1F,0xDE1D,0xDE1C,0xDE1E,0xDE20,0xDE21, 0,0xDEB6,0xDEBC,
+ 0xDEC6,0xDEC7,0xDEBA,0xDEBE,0xDEBD,0xDEB5,0xDEB4,0xDC0F,0xDC62,0xDCEB,
+ 0xDCD9,0xDCE4,0xDCD7,0xDCD8,0xDCD6,0xDCCE,0xDCDD,0xDCE7,0xDCD2,0xDCC5,
+ 0xDCC9,0xDCDB,0xDE92,0xDE8A,0xDE8B,0xDE89,0xDF08,0xDF03,0xDF06,0xDF05,
+ 0xDEF5,0xDF0B,0xDEFB,0xDFFC,0xDC01,0xDC02,0xDFFA,0xDC08,0xDFF7,0xDC00,
+ 0xDFFF,0xDC06,0xDFF6,0xDFFB,0xDC0A,0xDD25,0xDD43,0xDD44,0xDC64,0xDC62,
+ 0xDC5E,0xDC5B,0xDCD6,0xDC72,0xDCC2,
+ /* plane 6, row 38 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,0xD864,
+ 0xD864,0xD865,0xD865,0xD840,0xD865,0xD865,0xD865,0xD865,0xD866,0xD848,
+ 0xD87E,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0x3477,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0x51F2,
+ 0xD841,0xD87E,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD87E,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,
+ 1, /* first low-surrogate */
+ 0xDE77,0xDE82,0xDE7C,0xDE7D,0xDE86,0xDE81,0xDE84,0xDE76,0xDE83,
+ 0xDE7F,0xDE7E,0xDF88,0xDF8D,0xDF8B,0xDF91,0xDF8F,0xDC7C,0xDC79,0xDC7A,
+ 0xDDEA,0xDC4C,0xDD99,0xDED1,0xDE8B,0xDE8D,0xDE8A,0xDE8E,0xDC11,0xDE56,
+ 0xDE15,0xDC74,0xDCC3,0xDCC4,0xDD1B,0xDD5F,0xDD6A,0xDD69,0xDD6B,0xDF0C,
+ 0xDEF6,0xDEED,0xDF29,0xDEFE,0xDEF1,0xDF17,0xDEFF,0xDEEE,0xDEFD,0xDF1C,
+ 0xDEFC,0xDF00,0xDF20, 0,0xDEF9,0xDF67,0xDF08,0xDC9E,0xDCF3,0xDD25,
+ 0xDD27,0xDD1F,0xDD65,0xDD63,0xDD94,0xDD97,0xDDF1,0xDE5F,0xDE62, 0,
+ 0xDE60,0xDC22,0xDF8C,0xDF82,0xDF90,0xDF8B,0xDF8D,0xDF81,0xDF9D,0xDC8E,
+ 0xDC8F,0xDC92,0xDD23,0xDD52,0xDC2E,0xDE00,0xDE01,0xDE02,0xDE1F,0xDE8C,
+ 0xDE89,0xDE8B,0xDE88,0xDE8D,0xDE8F,
+ /* plane 6, row 39 */
+ 1 | (94 << 8), /* first, last */
+ 0xD858,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0x55B6,
+ 0xD87E,0xD843,0xD87E,0xD840,0xD843,0xD843,0xD87E,0xD87E,0xD843,0xD87E,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0x35C4,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD844,0xD844,0xD844,0xD851,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0x3652,0xD844,0xD844,0xD844,
+ 0xD845,0xD868,0xD845,0xD845,0xD87E,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD87E,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,
+ 0xD847,0xD87E,0xD847,0xD847,0xD847,
+ 1, /* first low-surrogate */
+ 0xDF85,0xDF00,0xDF05,0xDF01,0xDF68,0xDF6E,0xDF67,0xDF75, 0,
+ 0xDC45,0xDDD7,0xDC46,0xDC48,0xDDD4,0xDDD8,0xDC47,0xDC48,0xDDBA,0xDC49,
+ 0xDDDB,0xDDBF,0xDE35,0xDDBC,0xDDD9, 0,0xDDDD,0xDE00,0xDDD5,0xDE30,
+ 0xDDBD,0xDDDC,0xDDFD,0xDDFE,0xDE07,0xDD17,0xDF6F,0xDF69,0xDF70,0xDF67,
+ 0xDFA9,0xDF95,0xDF90,0xDF6C,0xDF97,0xDF71, 0,0xDF74,0xDF6D,0xDF8E,
+ 0xDD2F,0xDF1B,0xDDA9,0xDE4E,0xDC5F,0xDE5A,0xDE48,0xDE55,0xDE4C,0xDE49,
+ 0xDE4F,0xDE4A,0xDFD6,0xDFA0,0xDFA9,0xDC67,0xDF9D,0xDFD4,0xDFA4,0xDFA8,
+ 0xDFA6,0xDFE6,0xDD7D,0xDD77,0xDD7A,0xDE41,0xDE49,0xDE59,0xDE45,0xDE48,
+ 0xDE40,0xDF8E,0xDF95,0xDF90,0xDFF7,0xDFF8,0xDFF6,0xDFFB,0xDC9E,0xDC9D,
+ 0xDC99,0xDC77,0xDCA3,0xDCA9,0xDC98,
+ /* plane 6, row 40 */
+ 1 | (94 << 8), /* first, last */
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD87E,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD87E,0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,0xD87E,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0x386B,0x5EC3,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD859,0xD849,0xD849,0xD849,0xD849,0x3941,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0x3950,0xD849,0xD849,0xD87E,0xD849,
+ 0xD849,0xD849,0xD87E,0xD849,0xD849,
+ 1, /* first low-surrogate */
+ 0xDCA0,0xDC96,0xDC94,0xDC95,0xDC9F,0xDCA1,0xDD21,0xDD1D,0xDD1F,
+ 0xDE6D,0xDC7C,0xDE9A,0xDE92,0xDE7A,0xDE7D,0xDEA1,0xDE9D,0xDE99,0xDE6B,
+ 0xDE6E,0xDC7D,0xDC45,0xDC84,0xDCFB,0xDCEB,0xDCF2,0xDCF9,0xDC86,0xDCF8,
+ 0xDCED,0xDD01,0xDCF7,0xDD06,0xDD9B,0xDDCA, 0, 0,0xDE6B,0xDE6C,
+ 0xDE74,0xDE67,0xDE5B,0xDE60,0xDE76,0xDE63,0xDE61,0xDF28,0xDF5B,0xDF5E,
+ 0xDF60,0xDF5D,0xDF5C,0xDFF4,0xDC00,0xDC08,0xDC07,0xDC01,0xDC05,0xDC64,
+ 0xDC63,0xDC9E,0xDCA0,0xDCA1,0xDC9F,0xDD26,0xDD2D,0xDD28,0xDD1D,0xDEEC,
+ 0xDEE3,0xDEEB,0xDF16,0xDEC8,0xDE1B,0xDEE9,0xDEE4,0xDF24,0xDED1, 0,
+ 0xDEDD,0xDEC2,0xDECB,0xDEC7,0xDEE7, 0,0xDEEA,0xDF4B,0xDCA5,0xDF60,
+ 0xDF7D,0xDF3E,0xDCA4,0xDF52,0xDF4E,
+ /* plane 6, row 41 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD87E,0xD84A,0xD84B,0xD84B,
+ 0xD84A,0xD84B,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84A,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD87E,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD87E,0xD84B,0xD84B,0xD84B,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0x3AC0,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0x3AFC,0xD84C,0xD84C,0xD84C,0xD84C,0xD87E,0xD84C,
+ 0xD84C,0x3479,0xD84C,0xD84C,0x440B,
+ 1, /* first low-surrogate */
+ 0xDF3C,0xDF32,0xDF30,0xDF23,0xDDCA,0xDDCB,0xDDC9,0xDDC8,0xDDCD,
+ 0xDF98,0xDFA0,0xDF9F,0xDF9C,0xDFA3,0xDF97,0xDCBE,0xDFF1,0xDC09,0xDC03,
+ 0xDFEA,0xDC45,0xDFED,0xDC05,0xDC1A,0xDC15,0xDC01,0xDFEC,0xDC0E,0xDC17,
+ 0xDC42,0xDC12,0xDC10,0xDFEF,0xDFFF,0xDC00,0xDC0C,0xDC0F,0xDC04,0xDC08,
+ 0xDC14,0xDC43,0xDCBD,0xDC1B,0xDC11,0xDC13,0xDECF,0xDECE,0xDF6F,0xDF6E,
+ 0xDF7A,0xDF70,0xDF64,0xDF5E,0xDF6C,0xDCC9,0xDF5B,0xDF61,0xDF65,0xDC7F,
+ 0xDC80,0xDC7C,0xDCA7,0xDCA6,0xDCA1, 0,0xDCA8,0xDCA3,0xDCA2,0xDCAD,
+ 0xDCA5,0xDD01,0xDCFF,0xDCFC,0xDD00,0xDD35,0xDDEE,0xDDEF,0xDDF6,0xDDE8,
+ 0xDDEA,0xDDE3,0xDE1F, 0,0xDDE4,0xDDFA,0xDDF1,0xDDFB,0xDCD4,0xDF3D,
+ 0xDF3C, 0,0xDF78,0xDF77,
+ /* plane 6, row 42 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD87E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD861,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD87E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,0xD84F,0xD87E,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x3D1E,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,
+ 1, /* first low-surrogate */
+ 0xDCD1,0xDCC7,0xDCDF,0xDCD0,0xDCE0,0xDCD6,0xDCD8,0xDD16,0xDD0E,
+ 0xDCD9,0xDD0F,0xDD11,0xDCCD,0xDC89,0xDCCE,0xDD14,0xDCDA,0xDD12,0xDCD3,
+ 0xDCC2,0xDCE1,0xDCE9,0xDCEA,0xDCDE,0xDD15,0xDCD9,0xDCD6,0xDCCD,0xDCD0,
+ 0xDCD3,0xDCF0,0xDD82,0xDD85,0xDD7F,0xDD7D,0xDD81,0xDD83,0xDD84,0xDCA0,
+ 0xDE28,0xDE0F,0xDE17,0xDE1A,0xDE25,0xDCF7,0xDE9B,0xDE99,0xDF92,0xDF8C,
+ 0xDF95,0xDF8D,0xDFA3,0xDF93,0xDF91,0xDDDB,0xDD99,0xDD9A,0xDE08,0xDE4C,
+ 0xDE0D,0xDE01,0xDE4E,0xDE02,0xDE4D,0xDE21,0xDDFC,0xDD09,0xDD8A,0xDD08,
+ 0xDD95,0xDE11,0xDE12,0xDE46,0xDE1C,0xDE49,0xDE0C, 0,0xDE13,0xDE16,
+ 0xDDFD,0xDE0F,0xDE1F,0xDE30,0xDE6E,0xDE6B,0xDE9B,0xDE7B,0xDE63,0xDE97,
+ 0xDE6D,0xDE9C,0xDE98,0xDE6F,0xDE67,
+ /* plane 6, row 43 */
+ 1 | (94 << 8), /* first, last */
+ 0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD87E,0x3E85,0xD851,0xD851,0xD852,0xD87E,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD853,0xD87E,0xD853,0xD853,0xD853,0x3F97,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD87E,0xD854,0xD854,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDE69,0xDD15,0xDD63,0xDD86,0xDD8A,0xDD87,0xDD88,0xDD85,0xDD89,
+ 0xDDCA,0xDDC7,0xDDCB,0xDDCC,0xDDC9,0xDE0D,0xDE83,0xDE84,0xDE78,0xDE82,
+ 0xDE73,0xDE79,0xDE8C,0xDFD0,0xDFCF,0xDFD2,0xDFD9,0xDFCC,0xDFEB,0xDFFD,
+ 0xDFEC,0xDFE8,0xDFF8,0xDFFA,0xDD27, 0,0xDFE1,0xDFFB,0xDCE7,0xDD2E,
+ 0xDDA5,0xDD91,0xDDA6,0xDD7C,0xDD92,0xDDA2,0xDDA0,0xDEFC,0xDEFE,0xDF57,
+ 0xDF53,0xDF58,0xDFE7,0xDC8E,0xDD38,0xDC83,0xDC8B,0xDC84, 0,0xDDA2,
+ 0xDDB7,0xDDA9,0xDDA5,0xDD9F,0xDDAA,0xDD97,0xDDA1,0xDD9E,0xDDAB,0xDD99,
+ 0xDDA3,0xDF30,0xDF32,0xDF2F,0xDF70,0xDF6C,0xDF6F,0xDFE8,0xDFEE,0xDFEA,
+ 0xDC6D,0xDC76,0xDC70,0xDC71,0xDC6C,0xDDEB,0xDDB5,0xDD96,0xDD90,0xDD8D,
+ 0xDD49,0xDDA2,0xDDB0,0xDD92,0xDDA0,
+ /* plane 6, row 44 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0x4093,0xD854,0xD840,0xD855,0x7861,0xD855,0xD855,0xD855,0x40B2,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD84C,0xD855,0xD855,0xD855,0xD855,0x7A06,0xD855,0xD855,0xD841,0xD855,
+ 0x7A01,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0x41A4,0xD856,0xD856,0x41F2,0xD856,0xD856,0xD856,0xD856,0x41F1,
+ 0xD856,0xD856,0xD857,0xD857,0x4281,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0x42DC,0xD87E,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD85B,0xD858,0xD858,0xD858,
+ 1, /* first low-surrogate */
+ 0xDD93,0xDDC3,0xDD8E,0xDDB6,0xDD9D,0xDD95,0xDDB3,0xDDA4,0xDF70,
+ 0xDFD4, 0,0xDFCF,0xDD70,0xDC94, 0,0xDCC0,0xDCB4,0xDCC1, 0,
+ 0xDCBD,0xDCAF,0xDE77,0xDE78,0xDE6B,0xDE6D,0xDE6E,0xDE72,0xDE6F,0xDE71,
+ 0xDCAB,0xDE8C,0xDF3F,0xDFB6,0xDFB7, 0,0xDFBB,0xDFB8,0xDF9C,0xDFB9,
+ 0,0xDD8B,0xDD7A,0xDD84,0xDD88,0xDD91,0xDD79,0xDD8E,0xDD80,0xDD82,
+ 0xDD7C, 0,0xDE84,0xDE7F, 0,0xDF3B,0xDF71,0xDF3D,0xDF30, 0,
+ 0xDF3E,0xDF38,0xDE5E,0xDE64, 0,0xDE5D,0xDE6D,0xDE4F,0xDE62,0xDE5F,
+ 0xDFEC,0xDFF2,0xDFF4,0xDFF7,0xDFF6,0xDC07,0xDFED,0xDFEA,0xDFF0,0xDFF8,
+ 0xDFF3, 0,0xDD72,0xDE31,0xDE2F,0xDEB6,0xDEAE,0xDEAA,0xDEBF,0xDECC,
+ 0xDEC7,0xDC83,0xDF80,0xDF7B,0xDF7F,
+ /* plane 6, row 45 */
+ 1 | (94 << 8), /* first, last */
+ 0xD858,0xD858,0xD87E,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD87E,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0x440C,0xD859,0xD85A,0xD85A,0xD851,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD851,0xD87E,0xD85A,0xD85A,0xD85A,0xD842,0x446D,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85A,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 1, /* first low-surrogate */
+ 0xDF7D,0xDF83,0xDD78,0xDC46,0xDC2D,0xDC25,0xDC26,0xDC2C,0xDC37,
+ 0xDC31,0xDC33,0xDC32,0xDC27,0xDC2A,0xDC2E,0xDC2F,0xDCC0,0xDD71,0xDD61,
+ 0xDD62,0xDD66,0xDE18,0xDEC5,0xDEC3,0xDEC4,0xDEC2,0xDEAE,0xDF10,0xDF08,
+ 0xDF1F,0xDF3A,0xDF3B,0xDF36,0xDF0C,0xDF06,0xDF2A,0xDF57,0xDF50,0xDF20,
+ 0xDD85,0xDF2C,0xDF21,0xDF0B,0xDF19,0xDF35,0xDF18,0xDF0F,0xDF13,0xDF55,
+ 0xDF39,0xDF1A, 0,0xDF17,0xDCE4,0xDCE9,0xDD8B,0xDD10,0xDD12,0xDD3F,
+ 0xDD6E,0xDD18,0xDD8C,0xDDD6,0xDDD5,0xDDD7,0xDF02, 0,0xDE31,0xDE30,
+ 0xDE3A,0xDF85,0xDF6B,0xDC48,0xDC4B,0xDC37,0xDC7B,0xDC6C,0xDC85,0xDC65,
+ 0xDC36,0xDC86,0xDC34,0xDC68,0xDC5A,0xDC58,0xDC72,0xDC6A,0xDFD3,0xDC3C,
+ 0xDC33,0xDC3B,0xDC4D,0xDC4F,0xDC7C,
+ /* plane 6, row 46 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x44E6,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85A,0xD85B,0xD85B,0xD85A,0xD87E,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD87E,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0x8849,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85E,0xD85E,0xD85E,0x8999,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x46D1,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0x472C,0xD85E,0xD85F,0xD85F,0xD85F,
+ 1, /* first low-surrogate */
+ 0xDCB0,0xDC5B,0xDC55,0xDC64,0xDC6B,0xDC53, 0,0xDC57,0xDC5E,
+ 0xDC6D,0xDC35,0xDC69,0xDC59,0xDC66,0xDC50,0xDC51,0xDC5C,0xDD5D,0xDC87,
+ 0xDC78,0xDC49,0xDC4E,0xDFF1,0xDC73,0xDC88,0xDFCF,0xDDA4,0xDDB1,0xDDB3,
+ 0xDE9C,0xDEA4,0xDE90,0xDEB8,0xDEA0,0xDE9D,0xDEA8,0xDEA9,0xDDB9,0xDEB1,
+ 0xDE93,0xDE9B,0xDEA2,0xDEA1,0xDEB0,0xDEA7,0xDDB3, 0,0xDDB4,0xDDF1,
+ 0xDDED,0xDDEC,0xDE68,0xDE75,0xDE6A,0xDE62,0xDE67,0xDE60,0xDE77,0xDE5F,
+ 0xDE79,0xDC23,0xDC21,0xDC1C, 0,0xDC1F,0xDC1E,0xDCD6,0xDCD3,0xDCD9,
+ 0xDCD7,0xDCD4,0xDCDC,0xDCD8,0xDDA3, 0,0xDDBE,0xDDA9,0xDDA1,0xDDA0,
+ 0xDDAB,0xDDA2,0xDDBA,0xDDC2,0xDD9C,0xDDBB,0xDDAA,0xDDAC,0xDDA5,0xDDC1,
+ 0,0xDFE2,0xDC36,0xDC3D,0xDC3A,
+ /* plane 6, row 47 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x476E,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0x47E5,0xD860,0xD85F,0xD85F,0xD860,0xD85F,0x47E6,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0x489F,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD844,0xD862,0x921F,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDC61,0xDC48,0xDC3C,0xDCB7,0xDCAC,0xDCB3,0xDCB6,0xDCB2, 0,
+ 0xDD5D,0xDD49,0xDD4E,0xDD4F,0xDD4D,0xDD5C,0xDE5D,0xDEBB,0xDECE,0xDEBF,
+ 0xDEBA,0xDEC3, 0,0xDC06,0xDFF8,0xDFFE,0xDC13,0xDFF6, 0,0xDE34,
+ 0xDE2D,0xDE2A,0xDE35,0xDE2C,0xDED4,0xDEDA,0xDED3,0xDED2,0xDECE,0xDECF,
+ 0,0xDCFD,0xDD0B,0xDCFE,0xDCF8,0xDCF7,0xDD17,0xDCFA,0xDCF9,0xDD00,
+ 0xDCF5,0xDCF1,0xDD03,0xDD05,0xDD1C,0xDEAC,0xDE9A,0xDEAD,0xDEA0,0xDF1B,
+ 0xDF25,0xDF24,0xDF26,0xDF27,0xDF28,0xDF2A,0xDF1A,0xDF2E,0xDF15,0xDC15,
+ 0xDC14,0xDC17,0xDC18,0xDC0F,0xDC13,0xDC0B,0xDC22,0xDF7A,0xDD26, 0,
+ 0xDD51,0xDD4D,0xDD4E,0xDD4A,0xDD4B,0xDD4C,0xDD50,0xDD62,0xDD4F,0xDD52,
+ 0xDC68,0xDC69,0xDCE5,0xDCF0,0xDCE1,
+ /* plane 6, row 48 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD87E,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0x4A0D,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,
+ 0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,0xD868,0xD869,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD87E,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0x34F8,0xD841,0xD841,0xD841,
+ 0xD841,0xD842,0xD842,0xD842,0x5313,0xD842,0x3533,0xD842,0xD842,0xD842,
+ 0x353C,0xD842,0xD842,0xD842,0xD842,
+ 1, /* first low-surrogate */
+ 0xDCE2,0xDDF2,0xDEA5,0xDEA9,0xDEA4,0xDEAF,0xDEAC,0xDEAE,0xDEAA,
+ 0xDF95,0xDF99,0xDF93,0xDF9D,0xDF98,0xDF9C,0xDF97, 0,0xDC89,0xDC87,
+ 0xDDD7,0xDDED,0xDDF1,0xDDF0,0xDE05,0xDE03,0xDE04,0xDE5F,0xDC57,0xDD9C,
+ 0xDDA1,0xDD9A,0xDE8F,0xDE93,0xDE9E,0xDEA3,0xDE98,0xDE99,0xDE95,0xDC6E,
+ 0xDC6A,0xDEF4,0xDEF7,0xDC79,0xDF8F,0xDF91,0xDC0B,0xDD02,0xDC84,0xDD04,
+ 0xDD80,0xDF2F,0xDF3F,0xDF3B,0xDF62,0xDF44,0xDF33,0xDF5F,0xDF2B,0xDC09,
+ 0xDF39,0xDF36,0xDF48,0xDF35,0xDF6C,0xDF58,0xDF3A,0xDCA8,0xDCF4,0xDD29,
+ 0xDD9A,0xDE00,0xDFBB,0xDFBD,0xDFB7,0xDFB2, 0,0xDFA8,0xDFAB,0xDFA6,
+ 0xDFBC,0xDC97,0xDC96,0xDCF8, 0,0xDD51, 0,0xDDB5,0xDDB4,0xDDB6,
+ 0,0xDDB7,0xDE05,0xDE23,0xDE95,
+ /* plane 6, row 49 */
+ 1 | (94 << 8), /* first, last */
+ 0xD842,0x354F,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0x35DC,0xD843,
+ 0xD843,0xD843,0xD87E,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0x55E0,0xD843,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD87E,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD87E,0xD845,0xD845,0xD845,0xD842,
+ 0xD845,0xD845,0xD87E,0xD845,0xD845,0xD845,0xD846,0xD845,0xD846,0xD845,
+ 0xD845,0xD845,0xD846,0xD87E,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD847,0xD847,0xD847,0xD847,
+ 1, /* first low-surrogate */
+ 0xDE98, 0,0xDE94,0xDE93,0xDF07,0xDF73,0xDF71,0xDF72,0xDF78,
+ 0xDE5F,0xDE6A,0xDE67,0xDE6B,0xDE69,0xDE8E,0xDE49,0xDE80, 0,0xDE44,
+ 0xDE8F,0xDE45,0xDC4C,0xDE4F,0xDE63,0xDE36,0xDE48,0xDE5C,0xDE93,0xDE61,
+ 0xDE60,0xDE4E,0xDE5E,0xDE3F,0xDEA4, 0,0xDE68,0xDE0B,0xDE11,0xDE0D,
+ 0xDE0E,0xDFC2,0xDC57,0xDFB0,0xDFC3,0xDFC8,0xDF65,0xDFD7,0xDFBD,0xDFB8,
+ 0xDFB6,0xDFC7,0xDFBC,0xDFB1,0xDFAF,0xDC5B,0xDD35,0xDD30,0xDD5D,0xDF76,
+ 0xDD6F,0xDDB0,0xDC5E,0xDDB4,0xDE5C,0xDE5D,0xDC08,0xDFEE,0xDC0B,0xDFF2,
+ 0xDFFD,0xDFF1,0xDC10,0xDC68,0xDC14,0xDD8B,0xDD8C,0xDD85,0xDE7A,0xDE6C,
+ 0xDE60,0xDE67,0xDE66,0xDE6A,0xDE5F,0xDE6D,0xDE68,0xDE64,0xDF3A,0xDF3B,
+ 0xDF39,0xDC02,0xDC04,0xDC03,0xDCB4,
+ /* plane 6, row 50 */
+ 1 | (94 << 8), /* first, last */
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD87E,
+ 0x37F5,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD849,0xD849,0x38C3,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0x6139,0xD849,
+ 0xD87E,0xD849,0xD849,0x3971,0xD849,0xD849,0xD87E,0xD849,0xD849,0xD849,
+ 0xD84A,0xD84A,0xD851,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 1, /* first low-surrogate */
+ 0xDCB3,0xDCBB,0xDCAC,0xDCB6,0xDCB1,0xDCAF,0xDCB5,0xDCBE,0xDCB2,
+ 0xDD24,0xDEB6,0xDEB9,0xDEAC,0xDEB0,0xDED7,0xDEBB,0xDEFE,0xDECB,0xDC7F,
+ 0,0xDEB3,0xDEBE,0xDECD,0xDEBC,0xDEBA,0xDEC7,0xDD16,0xDD1B,0xDD17,
+ 0xDD15,0xDD9F,0xDC8E,0xDE82,0xDE83,0xDE8E,0xDE6A,0xDE89,0xDE94,0xDE86,
+ 0xDE90,0xDF62,0xDF90,0xDC0C,0xDC0F, 0,0xDCA5,0xDCA7,0xDCA6,0xDCA4,
+ 0xDD35,0xDD38,0xDD36,0xDD43,0xDD47,0xDD37,0xDF43,0xDFA2,0xDF51,0xDF72,
+ 0xDF6D,0xDF2F,0xDF54,0xDF6E,0xDF55,0xDF37,0xDF4F,0xDF50, 0,0xDF9E,
+ 0xDCA8,0xDFB3,0xDFA7, 0,0xDFF9,0xDF91,0xDCA7,0xDFB6,0xDFDD,0xDF99,
+ 0xDDDF,0xDDD5,0xDFF5,0xDC28,0xDC40,0xDC71,0xDC98,0xDC95,0xDC65,0xDC78,
+ 0xDC7F,0xDC60,0xDC7C,0xDC96,0xDC6A,
+ /* plane 6, row 51 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD865,
+ 0xD84C,0xD854,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD87E,0x3B01,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD87E,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD87E,0xD84E,0xD84E,
+ 0xD84E,0xD842,0xD84E,0xD84E,0xD84E,
+ 1, /* first low-surrogate */
+ 0xDC79,0xDC73,0xDC72,0xDC7B,0xDC70,0xDED5,0xDED7,0xDF8F,0xDF89,
+ 0xDF9E,0xDF87,0xDFA0,0xDF8D,0xDF88,0xDF7F,0xDF8C,0xDF93,0xDC59,0xDDB0,
+ 0xDCB1,0xDDF4,0xDCAF,0xDCB2,0xDD08,0xDD0A,0xDD36,0xDD37,0xDCCF, 0,
+ 0xDE36,0xDE29,0xDE4A,0xDE26,0xDE28,0xDE24,0xDE2A,0xDE48,0xDF44,0xDF84,
+ 0xDF8C,0xDCC4,0xDCDC,0xDD87,0xDD53,0xDD7F,0xDD31,0xDD51,0xDD4B,0xDD52,
+ 0xDD80,0xDDA5,0xDD81,0xDD43,0xDD34,0xDD36,0xDD32,0xDD48,0xDD49,0xDD3C,
+ 0xDD4D,0xDD4A,0xDCE6,0xDD8A,0xDD46,0xDD3E,0xDD83,0xDD50,0xDDB4,0xDCF0,
+ 0xDCE4,0xDCE3,0xDCE5,0xDCE6,0xDCE7,0xDCE1,0xDCEF,0xDCE8,0xDCDD,0xDD03,
+ 0xDD88,0xDE26,0xDE16,0xDE3B,0xDE2F,0xDE39,0xDE34,0xDCF4,0xDE35,0xDE31,
+ 0xDE38,0xDF81,0xDEAA,0xDEA3,0xDEA4,
+ /* plane 6, row 52 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD87E,0xD84F,0xD84F,0xD84F,0xD84F,0x6ED7,0xD87E,0x3D41,0xD850,
+ 0xD850,0xD850,0x3DD7,0xD850,0xD850,0xD850,0xD850,0xD87E,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0x3DE2,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0x3E45,0xD851,
+ 0xD851,0xD851,0x733D,0xD852,0xD852,
+ 1, /* first low-surrogate */
+ 0xDEA0,0xDEA1,0xDEA9,0xDEA5,0xDFAF,0xDFB1,0xDFAB,0xDFAE,0xDFB0,
+ 0xDFB3,0xDFAC,0xDFA9,0xDFB2,0xDFA8,0xDFB4,0xDFC2,0xDC4F,0xDC66,0xDE1E,
+ 0xDE15,0xDE10,0xDE7F,0xDE7E,0xDE60,0xDECC,0xDEB2,0xDE62,0xDE8D,0xDE8E,
+ 0xDE77,0xDE7C,0xDE8F,0xDE5D,0xDE6D,0xDE63,0xDEAF,0xDE90,0xDE7D,0xDE7A,
+ 0xDE06,0xDD0B,0xDE68,0xDEB4,0xDE78,0xDEB1, 0,0xDD0C, 0,0xDEE8,
+ 0xDEE9,0xDEC0, 0,0xDEEA,0xDEB7,0xDEBA,0xDEB5,0xDD1D,0xDEB4,0xDEBC,
+ 0xDEC6,0xDEB8,0xDEBD,0xDEC2,0xDF4D,0xDEF0,0xDEC7,0xDEC1,0xDEC3,0xDEF1,
+ 0xDEEC, 0,0xDD1C,0xDD20,0xDD58,0xDD65,0xDD64,0xDD8C,0xDD8D,0xDDD9,
+ 0xDDE0,0xDE10,0xDE94,0xDE92,0xDE96,0xDE95,0xDEBF,0xDEA0, 0,0xDFF4,
+ 0xDFF6,0xDFDC, 0,0xDC16,0xDC15,
+ /* plane 6, row 53 */
+ 1 | (94 << 8), /* first, last */
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0x3FF2,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD84B,0x4049,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD855,0xD87E,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,
+ 1, /* first low-surrogate */
+ 0xDC1C,0xDC0F,0xDC2C,0xDC14,0xDC25,0xDC17,0xDC12,0xDC1E,0xDD80,
+ 0xDDA8,0xDDAF,0xDDD6,0xDDE2,0xDDB4,0xDDB3,0xDDB0,0xDDB2,0xDDA1,0xDF60,
+ 0xDF66,0xDF61,0xDF4E,0xDF5D,0xDF63,0xDFE6,0xDFEF,0xDFEC,0xDC98,0xDCA7,
+ 0xDC94,0xDC95,0xDC91,0xDC9D,0xDC99,0xDC9B,0xDC9C,0xDD1D,0xDD1C,0xDDD0,
+ 0xDDE0,0xDDCB,0xDDDB,0xDDDA,0xDDC2,0xDDD3,0xDDE5,0xDF7D,0xDF7B,0xDFFF,
+ 0,0xDFF9,0xDC77,0xDC7C,0xDC78,0xDC7B,0xDC7A,0xDDD2,0xDDCB,0xDDC9,
+ 0xDDCE,0xDDE4,0xDDCA,0xDDD0,0xDFA5, 0,0xDDD9,0xDDEE,0xDDDD,0xDE00,
+ 0xDDE1,0xDFDE,0xDFE2,0xDFDA,0xDCCE,0xDD4F,0xDCCF,0xDCDA,0xDCD1,0xDCD4,
+ 0xDCED,0xDCCB,0xDCD5,0xDCF1,0xDE9C,0xDE88,0xDF41,0xDFD0,0xDFF7,0xDFCF,
+ 0xDFD1,0xDFDB,0xDFDE,0xDFF8,0xDFDC,
+ /* plane 6, row 54 */
+ 1 | (94 << 8), /* first, last */
+ 0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,0x41A9,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD840,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD849,0x43CB,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0x440D,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,
+ 1, /* first low-surrogate */
+ 0xDFD9,0xDDA0,0xDDB2,0xDDA1,0xDDAA,0xDDA9, 0,0xDDA6,0xDD9C,
+ 0xDDB5,0xDDA7,0xDE8E,0xDE90,0xDE91,0xDF85,0xDF5B,0xDF70,0xDF64,0xDF67,
+ 0xDF63,0xDF77,0xDF68,0xDF65,0xDF6A,0xDF78,0xDF66,0xDE88,0xDE9E,0xDE74,
+ 0xDE7A,0xDE79,0xDE8B,0xDE7F,0xDC13,0xDC1E,0xDC17,0xDC1A,0xDC22,0xDC43,
+ 0xDC19,0xDC1F,0xDC27,0xDC12,0xDC24,0xDC25,0xDF5E,0xDE35,0xDE34,0xDED1,
+ 0xDEC4,0xDECA,0xDEC6,0xDECB,0xDECD,0xDEE2,0xDF89,0xDF8B,0xDF86,0xDF88,
+ 0xDF8D,0xDC3B,0xDC3C,0xDC3D,0xDCF5,0xDD79,0xDD75,0xDD82,0xDD7F,0xDD85,
+ 0xDD76,0xDD7C,0xDD7E,0xDD7B,0xDD80,0xDD7A,0xDD48, 0,0xDE1D,0xDEF6,
+ 0xDEF7,0xDEF9,0xDF63,0xDF6C,0xDF6E,0xDF14, 0,0xDF67,0xDF6F,0xDF69,
+ 0xDF76,0xDF95,0xDF71,0xDF61,0xDF78,
+ /* plane 6, row 55 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD856,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 1, /* first low-surrogate */
+ 0xDF6B,0xDF85,0xDF84,0xDD14,0xDD76,0xDDB6,0xDD75,0xDD74,0xDDE2,
+ 0xDE3F,0xDE44,0xDE3D,0xDE47,0xDE48,0xDEDB,0xDEDC,0xDEDD,0xDFE5,0xDFE6,
+ 0xDCC2,0xDD2E,0xDD1D,0xDCF8,0xDCF0,0xDCF6,0xDCC5,0xDCC6,0xDCFC,0xDD52,
+ 0xDD2F,0xDD10,0xDCF3,0xDCD2,0xDCEA,0xDCDC,0xDD1B,0xDCFB,0xDCC3,0xDD16,
+ 0xDD07,0xDCC9,0xDCD8,0xDD30,0xDD13,0xDD31,0xDCFA,0xDCF2,0xDDE3,0xDCD5,
+ 0xDD01,0xDCF1,0xDD1C,0xDCD6,0xDD08,0xDD0B,0xDD17,0xDD20,0xDCCA,0xDD32,
+ 0xDD05,0xDCE4,0xDCCE,0xDD33,0xDD02,0xDD19,0xDD1E,0xDCD3,0xDCF7,0xDCE8,
+ 0xDD1F,0xDCF4,0xDDD8,0xDDBF,0xDDBE,0xDDBD,0xDEDC,0xDEDD,0xDEAB,0xDEC9,
+ 0xDEC8,0xDEDF,0xDED9,0xDEDB,0xDECC,0xDEE0,0xDEEF,0xDEF3,0xDEAE,0xDF01,
+ 0xDDB7,0xDDB9,0xDDB6,0xDDB8,0xDDF6,
+ /* plane 6, row 56 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0x4631,0xD87E,0xD85D,0xD87E,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0x46D5,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD87E,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD84E,0xD85F,
+ 0xD87E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD85F,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,
+ 1, /* first low-surrogate */
+ 0xDDF3,0xDDF5,0xDDF2,0xDE91,0xDE9D,0xDE9B,0xDE92,0xDE8D,0xDE9E,
+ 0xDE8C, 0,0xDDC7,0xDE95,0xDDC6,0xDE8A,0xDE8E,0xDE9C,0xDFEF,0xDC2D,
+ 0xDC52,0xDC35,0xDC28,0xDC2E,0xDCE5,0xDDEA,0xDDF1,0xDDEB,0xDDD8,0xDDD0,
+ 0xDDF3,0xDDDB,0xDDCE, 0,0xDDDA,0xDDD7,0xDDE1,0xDDF2,0xDDC8,0xDDD9,
+ 0xDDDE,0xDDD1,0xDDE7,0xDDCF,0xDFB7,0xDC47,0xDC42,0xDC43,0xDDD3,0xDCC3,
+ 0xDCC1,0xDCC7,0xDD64,0xDD6A,0xDD66,0xDD50,0xDD6E,0xDD65,0xDCEC,0xDD7F,
+ 0xDDD5,0xDD9A,0xDD69,0xDD72,0xDD6F,0xDD7D,0xDD70,0xDE60,0xDEC2,0xDEE7,
+ 0xDED1,0xDEEB,0xDED4,0xDEDC,0xDEDB,0xDC37,0xDC25,0xDC1F,0xDC1E,0xDC21,
+ 0xDC1B,0xDC17,0xDC22,0xDC2A,0xDC1A,0xDC2D,0xDC23,0xDC26,0xDC36,0xDFFF,
+ 0xDE3A,0xDE40,0xDE42,0xDE38,0xDE3B,
+ /* plane 6, row 57 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD860,0xD860,0x4856,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD87E,
+ 0xD861,0xD861,0xD87E,0xD861,0x48F4,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD864,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDE3C,0xDE43,0xDEE8, 0,0xDEF9,0xDEEB,0xDEF1,0xDEE9,0xDEEC,
+ 0xDC15,0xDC47,0xDC46,0xDC45,0xDD24,0xDD56,0xDD21,0xDD27,0xDD4D,0xDD31,
+ 0xDD1E,0xDD2C,0xDD4F,0xDD2B,0xDD53,0xDD51,0xDD54,0xDD29,0xDD50,0xDD1F,
+ 0xDD32,0xDD2A,0xDD1D,0xDD28,0xDD2E,0xDD2D,0xDEBC,0xDEBB,0xDEBD,0xDDE4,
+ 0xDF47,0xDF41,0xDDE5,0xDF49, 0,0xDC2E,0xDC27,0xDD6A,0xDD7B,0xDD73,
+ 0xDD75,0xDD69,0xDD79,0xDD72,0xDC76,0xDC77,0xDC74,0xDC73,0xDD02,0xDCFE,
+ 0xDD01,0xDCF9,0xDCF4,0xDED3,0xDED5,0xDED8,0xDEC3,0xDECA,0xDED0,0xDECB,
+ 0xDECE,0xDEC5,0xDEE6,0xDEC4,0xDEC0,0xDED4,0xDEE8,0xDF76,0xDFA2,0xDFAE,
+ 0xDFA8,0xDFA3,0xDFA7,0xDF96,0xDFA9,0xDFA5,0xDFAF,0xDFA4,0xDFAB,0xDFAA,
+ 0xDFA6,0xDFA0,0xDC98,0xDDDB,0xDDF6,
+ /* plane 6, row 58 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0x9775,0xD864,0xD864,0xD864,0x4A58,0xD864,
+ 0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD87E,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD87E,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD850,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD868,0xD868,0xD868,0xD87E,0xD84E,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD87E,0x3487,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,
+ 1, /* first low-surrogate */
+ 0xDDF5,0xDE0C,0xDE0A, 0,0xDE68,0xDE63,0xDE66, 0,0xDE64,
+ 0xDE6A,0xDE69,0xDF95,0xDC02,0xDC6A,0xDC5E,0xDC68,0xDC69,0xDC65,0xDDFE,
+ 0xDDA7,0xDDAE,0xDDA8,0xDDB3,0xDE9C,0xDEA9,0xDEB6,0xDEB3,0xDEB2,0xDE03,
+ 0xDEB8,0xDEC0,0xDEBF,0xDEBA,0xDEA8,0xDC3C,0xDC72,0xDC71,0xDC75,0xDC73,
+ 0xDE17,0xDE15,0xDE16,0xDE1B,0xDEFA,0xDEF9,0xDC2C,0xDC85,0xDC82,0xDC7F,
+ 0xDC7D,0xDC88,0xDEF3,0xDD4E,0xDD50,0xDF93,0xDF97,0xDF98,0xDF9B,0xDF9C,
+ 0xDF96,0xDE8B,0xDEFD,0xDEFC,0xDE17,0xDD8B,0xDD08,0xDD07,0xDF73,0xDFA2,
+ 0xDFAF,0xDF82,0xDF7B,0xDF74,0xDFB0,0xDF76,0xDFB9,0xDF9E,0xDFB1,0xDFA1,
+ 0xDFB2,0xDF6E,0xDC0B, 0,0xDF78,0xDF7A,0xDF83,0xDF9A,0xDCF8,0xDD31,
+ 0xDD69,0xDD68,0xDD9C,0xDE04,0xDE99,
+ /* plane 6, row 59 */
+ 1 | (94 << 8), /* first, last */
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD845,0xD844,0xD844,0xD844,0xD844,0xD844,0xD87E,0xD844,0xD87E,
+ 0xD844,0xD845,0xD845,0xD85E,0xD844,0xD844,0xD844,0xD845,0xD844,0xD845,
+ 0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD845,0xD846,0xD846,
+ 1, /* first low-surrogate */
+ 0xDFC7,0xDFC6,0xDFDC,0xDFC4,0xDFD8,0xDFD4,0xDFDF,0xDFD1,0xDFD0,
+ 0xDFD6,0xDFCF,0xDCAD,0xDCAF,0xDCA7,0xDCFD,0xDD5B,0xDD5A,0xDE07,0xDE9D,
+ 0xDE9B,0xDEAB,0xDEA4,0xDE9C,0xDE9E,0xDEA5,0xDEAA,0xDEA6,0xDF0E,0xDF7E,
+ 0xDF7C,0xDEEE,0xDED5,0xDEE9,0xDE42,0xDEE2,0xDF23,0xDED9,0xDED4,0xDEE3,
+ 0xDF15,0xDEEF,0xDEF0,0xDED6,0xDEDD,0xDEF6,0xDF1C,0xDED8,0xDEDB,0xDEDA,
+ 0xDEED,0xDC11,0xDE15,0xDE18,0xDE1A,0xDE1F,0xDE16,0xDC4D,0xDE19,0xDC4B,
+ 0xDFF0,0xDC09,0xDC1B,0xDFE7,0xDFF6,0xDFF4,0xDFB5,0xDC10,0xDFF2,0xDC15,
+ 0xDFF3,0xDFF8,0xDD39,0xDD3B,0xDD36,0xDC0E,0xDD72,0xDD74,0xDDB9,0xDDB7,
+ 0xDDB8,0xDE72,0xDE6B,0xDC1D,0xDC37,0xDC22,0xDC43,0xDC4D,0xDC38,0xDC5B,
+ 0xDC79,0xDC1B,0xDFF3,0xDD91,0xDE7B,
+ /* plane 6, row 60 */
+ 1 | (94 << 8), /* first, last */
+ 0xD846,0xD87E,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xffff,0xD846,0xD846,0xD846,0xD846,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD87E,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0x37FA,0xD847,0xD847,0xD847,
+ 0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0x38F2,0xD849,0xD849,0xD849,0xD84A,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD84A,0xD849,0xD849,0xD849,0xD849,
+ 1, /* first low-surrogate */
+ 0xDE94,0xDC6F,0xDE96,0xDE7F,0xDE8F,0xDE84,0xDE7C,0xDE8E,0xDE90,
+ 0xDE98,0xDE83,0xDE80,0xDE93,0xDE82, 0,0xDF3D,0xDF41,0xDFA1,0xDF9F,
+ 0xDC0A,0xDC0D,0xDCC8,0xDCC9,0xDCC7,0xDCCD,0xDD25,0xDEB1,0xDEDC,0xDC80,
+ 0xDEE5,0xDEF4,0xDEBF,0xDEDB,0xDEEA,0xDEF2, 0,0xDEF1,0xDEED,0xDEE6,
+ 0xDC02,0xDC82,0xDD25,0xDD18,0xDD1F,0xDD20,0xDDCF,0xDE9D,0xDE99,0xDEA8,
+ 0xDF68,0xDF66,0xDF67,0xDF91,0xDC13,0xDC15,0xDC1D,0xDC16,0xDC19,0xDC6B,
+ 0xDC68,0xDC6A,0xDC6D,0xDC69,0xDCAA,0xDD57,0xDD52,0xDD50,0xDD5F,0xDD67,
+ 0xDD4F, 0,0xDD5B,0xDD5C,0xDD5D,0xDC1F,0xDF9D,0xDFB1,0xDFB0,0xDF94,
+ 0xDFC3,0xDFAF,0xDFA8,0xDFDC,0xDF98,0xDFC4,0xDFA4,0xDFAB,0xDFAA,0xDFA5,
+ 0xDC21,0xDFEB,0xDFE6,0xDFF7,0xDFF8,
+ /* plane 6, row 61 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD849,0xD849,0xD87E,0xD849,0xD87E,0xD849,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84B,0xD84E,0xD84B,0xD84B,0xD84B,0xD84B,0x3A2F,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD87E,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0x3AC1,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD87E,
+ 0xD859,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD87E,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x3C40,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 1, /* first low-surrogate */
+ 0xDFFC,0xDFFA,0xDFE0,0xDCAA,0xDFF6,0xDCA9,0xDFE1,0xDDEC,0xDDE2,
+ 0xDDE4,0xDDF9,0xDC6F,0xDE4C,0xDCBB,0xDCE1,0xDD00,0xDCD8, 0,0xDCD6,
+ 0xDCE2,0xDCC3,0xDCB3,0xDCD2,0xDCC1,0xDCCE,0xDCD0,0xDCD5,0xDCB9,0xDCBA,
+ 0xDCCF,0xDCBD,0xDEDB,0xDFAA,0xDFAD,0xDFB8,0xDFB6,0xDFB5,0xDFAF,0xDFB4,
+ 0xDFB7,0xDFA8,0xDFB9,0xDFBE,0xDC82,0xDCBC,0xDCB8,0xDCB6,0xDCB9, 0,
+ 0xDD10,0xDE27,0xDE69,0xDE70,0xDE56,0xDE6B,0xDE7A,0xDE6C,0xDE6D,0xDCD5,
+ 0xDFC1,0xDF8D,0xDF90,0xDDB6,0xDE10,0xDE12,0xDDBA,0xDDBD,0xDE05,0xDDC2,
+ 0xDE07,0xDDF5,0xDCE9,0xDDAF,0xDDF4,0xDDF7,0xDDF8,0xDE11,0xDCF6,0xDCF5,
+ 0xDCFB,0xDD01,0xDD00,0xDD02,0xDCFE,0xDCFA,0xDCFD, 0,0xDE37,0xDE49,
+ 0xDE4B,0xDE46,0xDE47,0xDEB3,0xDEB2,
+ /* plane 6, row 62 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x3D3F,0xD84F,0xD84F,
+ 0xD87E,0xD84F,0x3D46,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD851,0xD851,0xD851,0xD851,0xD840,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD87E,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0x3E8F,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,
+ 1, /* first low-surrogate */
+ 0xDEB0,0xDEB7,0xDF11,0xDFCC,0xDFDF,0xDFD3,0xDFD5,0xDFDB,0xDFC5,
+ 0xDFC8,0xDFC9,0xDFE2,0xDFCA,0xDFD1,0xDFD2,0xDFDD,0xDE6C,0xDE73,0xDF21,
+ 0xDEF0,0xDF1F,0xDF3B,0xDF22,0xDF23,0xDEE8,0xDEDD, 0,0xDF1B,0xDEED,
+ 0xDD0E,0xDEF2, 0,0xDEDC,0xDEE9,0xDF1D,0xDEDA,0xDEE6,0xDF13,0xDF15,
+ 0xDF16,0xDF3C,0xDF0B,0xDF1C,0xDF3A,0xDF3D,0xDF9A,0xDF1D,0xDF09,0xDF08,
+ 0xDF3B,0xDD22,0xDD26,0xDD25,0xDD24,0xDF9B,0xDD8F,0xDD90,0xDDE6,0xDDE3,
+ 0xDDE5,0xDE11,0xDD25,0xDEAE,0xDEBE,0xDEB4,0xDEB3,0xDEAF,0xDE91,0xDEC2,
+ 0xDEB6,0xDEB2,0xDC57,0xDC3B,0xDC58,0xDC51,0xDC41,0xDC39, 0,0xDC59,
+ 0xDC45,0xDC61,0xDCE8,0xDDFA,0xDDEA,0xDDEF,0xDDF2,0xDDF0,0xDF08,0xDF70,
+ 0xDF6A,0xDF73,0xDF68,0xDFC8,0xDFF2,
+ /* plane 6, row 63 */
+ 1 | (94 << 8), /* first, last */
+ 0xD842,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0x3FAC,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD856,0xD856,0xD856,0xD855,0xD856,0x4168,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD87E,0xD856,0xD856,0x41AB,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,
+ 1, /* first low-surrogate */
+ 0xDF7B,0xDCAE,0xDCAB,0xDCB5,0xDCAF,0xDCB2,0xDCB6,0xDCB0,0xDD1E,
+ 0xDE03,0xDE06,0xDE1F, 0,0xDE0F,0xDE02,0xDE19,0xDE18,0xDE22,0xDE15,
+ 0xDE07,0xDE0D,0xDE24,0xDE0C,0xDE1E,0xDF89,0xDF8A,0xDC0A,0xDC0B,0xDC07,
+ 0xDC04,0xDC09,0xDC84,0xDC83,0xDE18,0xDE14,0xDE05,0xDE16,0xDE0E,0xDE11,
+ 0xDE08,0xDE0B,0xDE15,0xDC85,0xDE37,0xDE2A,0xDE0D,0xDE0F,0xDF7E,0xDF76,
+ 0xDF77,0xDFEC,0xDCFC,0xDD08,0xDCFF,0xDD03,0xDD10,0xDD05,0xDD06,0xDCFA,
+ 0xDEC7,0xDEC0,0xDEC3,0xDEA7,0xDEA8,0xDEAB,0xDEC1,0xDEAA,0xDEC8,0xDF43,
+ 0xDC02,0xDC0E,0xDC01,0xDFFE,0xDC03, 0,0xDC22,0xDC21,0xDC07,0xDC08,
+ 0xDC0C,0xDDCA,0xDDBC,0xDDBE,0xDDBD,0xDD5C,0xDDBB,0xDDB9, 0,0xDDC5,
+ 0xDE99,0xDF6B,0xDF93,0xDF94,0xDFA9,
+ /* plane 6, row 64 */
+ 1 | (94 << 8), /* first, last */
+ 0xD856,0xD856,0xD87E,0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,
+ 0xD857,0xD857,0x4291,0xD857,0xD857,0xD857,0xD857,0xD848,0xD857,0xD857,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0x7FE4,0xD859,0xD859,0xD859,
+ 0xD859,0xD87E,0xD859,0xD859,0x8088,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD85A,0xD859,0xD859,0xD859,0xD859,0xD859,0x4430,
+ 0xD859,0xD859,0xD842,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDFA0,0xDFA6,0xDD61,0xDFAB,0xDF9E,0xDF9B,0xDF91,0xDF99,0xDEB6,
+ 0xDEB8,0xDE9A, 0,0xDE98,0xDE9B,0xDEB3,0xDEA2,0xDEAA,0xDEA0,0xDE9F,
+ 0xDC5B,0xDC70,0xDC54,0xDC71,0xDC65,0xDC51,0xDC9D,0xDC61,0xDC5A,0xDC74,
+ 0xDC4C,0xDC4B,0xDC5E,0xDC58,0xDC53,0xDC52,0xDE3B,0xDE39,0xDED6,0xDEE7,
+ 0xDED7,0xDED8,0xDED9,0xDEDA,0xDEDB,0xDEDC,0xDEE0,0xDEE4,0xDEDD,0xDEF5,
+ 0xDEF1,0xDF98,0xDF9D,0xDF99,0xDC50,0xDC49, 0,0xDC62,0xDCD7,0xDD01,
+ 0xDCF7,0xDD7D,0xDD8C,0xDD9C, 0,0xDE1F,0xDE1E,0xDF3D,0xDF3F,0xDF11,
+ 0xDF59,0xDF3E,0xDF58,0xDC00,0xDF9E,0xDFB6,0xDFAA,0xDFAF,0xDFAC, 0,
+ 0xDFC0,0xDFA9,0xDF10,0xDCEE,0xDD77,0xDD79,0xDD7A,0xDD7D,0xDD7F,0xDD83,
+ 0xDD78,0xDD7E,0xDDE4,0xDDE6,0xDDE5,
+ /* plane 6, row 65 */
+ 1 | (94 << 8), /* first, last */
+ 0x445D,0xD85A,0xD85A,0x4475,0xD87E,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD87E,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x44FF,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD87E,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x450B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0x45C8,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 2, /* first low-surrogate */
+ 0xDE4E,0xDE59, 0,0xDD8E,0xDE4F,0xDE4A,0xDEE3,0xDEDE,
+ 0xDEE2,0xDC74,0xDCAC,0xDC61,0xDC62,0xDC76,0xDC7A,0xDC79,0xDC60,0xDD64,
+ 0xDE81,0xDDDF,0xDD84,0xDD8A,0xDD92,0xDD79,0xDDDE,0xDD98,0xDD6C,0xDDE1,
+ 0xDDA5,0xDD7C,0xDD72,0xDD81,0xDDE0,0xDD65, 0,0xDD6A,0xDD97,0xDDAA,
+ 0xDDD3,0xDDAB,0xDD6E,0xDDAC,0xDD76,0xDD7B,0xDDAD,0xDDA6,0xDD94,0xDDD7,
+ 0xDD70,0xDDD5,0xDDF1,0xDD7A,0xDD68,0xDD96, 0,0xDD73,0xDDAE,0xDDDD,
+ 0xDDDA,0xDDAF,0xDDB0,0xDDDB,0xDD62,0xDDF8,0xDDC2,0xDDC7,0xDDC8,0xDDC5,
+ 0xDDC3,0xDDC6,0xDEDE, 0,0xDF11,0xDF15,0xDF28,0xDF21,0xDF2D,0xDF51,
+ 0xDF2B,0xDF16,0xDF24,0xDF35,0xDF1F,0xDF12,0xDF10,0xDF80,0xDF3B,0xDF29,
+ 0xDF2A,0xDF1B,0xDF18,0xDF20,0xDF3F,
+ /* plane 6, row 66 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD87E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD846,0xD85F,0xD85F,0x4774,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x47AC,0xD85F,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,
+ 1, /* first low-surrogate */
+ 0xDF1C,0xDF26,0xDF0B,0xDDBE,0xDDC4,0xDDBD,0xDDFA,0xDDFB,0xDEB1,
+ 0xDEB2,0xDEB0,0xDEB9,0xDEA6,0xDEBD,0xDEB6,0xDEB8,0xDEB4,0xDEB3,0xDEA7,
+ 0xDEAE,0xDEBC,0xDFF2,0xDFF3,0xDFF4,0xDC3B,0xDC40,0xDC46,0xDCF0,0xDCEE,
+ 0xDCE8,0xDCF1,0xDCEB,0xDCEF,0xDDFC,0xDE20,0xDE09,0xDE06,0xDE03,0xDDCF,
+ 0xDE19,0xDE24,0xDE1B,0xDE1D,0xDDFD,0xDE1E,0xDDF4,0xDE01,0xDE08,0xDE05,
+ 0xDE23,0xDDFF,0xDFEA,0xDC4D,0xDC4E,0xDC56,0xDC57,0xDC51,0xDC55,0xDC54,
+ 0xDCCB,0xDCD4,0xDCD1,0xDCCF,0xDCD2,0xDCCA,0xDCD6,0xDD8B,0xDD88,0xDD85,
+ 0xDD89,0xDE9B,0xDDBB,0xDD8C, 0,0xDD99,0xDD8A,0xDEEC,0xDEEF,0xDEF9,
+ 0xDF09,0xDEF8,0xDEF3,0xDF00,0xDF1D, 0,0xDEFD,0xDC48,0xDC5C,0xDC55,
+ 0xDC5E,0xDC49,0xDC63,0xDC60,0xDC53,
+ /* plane 6, row 67 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD87E,0xD862,0xD862,
+ 0xD862,0xD87E,0xD862,0xD862,0xD863,0xD863,0xD87E,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD87E,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,
+ 0xD864,0x4A16,0xD864,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDC62,0xDC40,0xDE49,0xDE4A,0xDE4C,0xDE4D,0xDF0A,0xDF06,0xDF2F,
+ 0xDF21,0xDF07,0xDF09,0xDF02,0xDF16,0xDF03,0xDF0B,0xDF0F,0xDD60,0xDD68,
+ 0xDD5E,0xDD5D,0xDD63,0xDD5F,0xDD64,0xDD78,0xDD61,0xDD69,0xDD65,0xDEDA,
+ 0xDEE6,0xDEDB,0xDEDC,0xDF39,0xDF57,0xDF55,0xDF65,0xDF61,0xDF54,0xDC45,
+ 0xDC41,0xDC3E,0xDC37,0xDD12,0xDD13,0xDD2C,0xDD96,0xDDE9,0xDD9C,0xDD9D,
+ 0xDD85,0xDDE8,0xDD9F,0xDDA3,0xDC82,0xDC83,0xDDEE,0xDD1D,0xDD14,0xDD1F,
+ 0xDD20,0xDE47,0xDE80,0xDEC9,0xDEF9,0xDF06,0xDEF0,0xDEF8,0xDEEF,0xDEFD,
+ 0xDEF1,0xDEFE,0xDFB8,0xDFC0,0xDFC3,0xDFB5,0xDFB6,0xDFC9,0xDDF3,0xDFBD,
+ 0xDFBA,0xDFBF,0xDFB3,0xDFC6,0xDFB2,0xDFBC,0xDFB7,0xDFB9,0xDFC8,0xDCB5,
+ 0xDCB3, 0,0xDCAC,0xDCA9,0xDCAD,
+ /* plane 6, row 68 */
+ 1 | (90 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD87E,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD87E,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0x4B3B,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD87E,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0x4BEF,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0xD869,0xD869,0xD869,0xD869,
+ 0xD845,
+ 1, /* first low-surrogate */
+ 0xDE11,0xDE0D,0xDE16,0xDE89,0xDE7C,0xDE8B,0xDE7B,0xDE88,0xDE84,
+ 0xDF9D,0xDF98,0xDC88,0xDC86,0xDC82,0xDC8B,0xDDFF,0xDC71,0xDC72,0xDC81,
+ 0xDC8C,0xDC80,0xDC89,0xDDBB,0xDDC1,0xDDBE,0xDE01,0xDDBD,0xDEC1,0xDEB4,
+ 0xDEB7,0xDEC8, 0,0xDED3,0xDED0,0xDEB0,0xDECA,0xDECD,0xDC15,0xDC19,
+ 0xDC17,0xDC3F,0xDC40,0xDC44,0xDC7C,0xDC78,0xDC79,0xDC88,0xDE06,0xDC89,
+ 0xDC7D,0xDE23,0xDE24,0xDE26,0xDE22,0xDE27,0xDE1F,0xDEC9,0xDEC3,0xDF0A,
+ 0xDF0B,0xDF04, 0,0xDF03,0xDF01,0xDF09,0xDC0F,0xDC2E,0xDC2D,0xDC91,
+ 0xDC99,0xDC9E,0xDC90,0xDC94,0xDC9D,0xDC98,0xDC9B,0xDC9C,0xDC9A,0xDD54,
+ 0xDF9D,0xDF9F,0xDFA3,0xDFA4,0xDFA5,0xDF02,0xDC17,0xDC1B,0xDC19,0xDCD1,
+ 0xDD37,
+ /* plane 6, row 69: --- */
+ /* plane 6, row 70: --- */
+ /* plane 6, row 71: --- */
+ /* plane 6, row 72: --- */
+ /* plane 6, row 73: --- */
+ /* plane 6, row 74: --- */
+ /* plane 6, row 75: --- */
+ /* plane 6, row 76: --- */
+ /* plane 6, row 77: --- */
+ /* plane 6, row 78: --- */
+ /* plane 6, row 79: --- */
+ /* plane 6, row 80: --- */
+ /* plane 6, row 81: --- */
+ /* plane 6, row 82: --- */
+ /* plane 6, row 83: --- */
+ /* plane 6, row 84: --- */
+ /* plane 6, row 85: --- */
+ /* plane 6, row 86: --- */
+ /* plane 6, row 87: --- */
+ /* plane 6, row 88: --- */
+ /* plane 6, row 89: --- */
+ /* plane 6, row 90: --- */
+ /* plane 6, row 91: --- */
+ /* plane 6, row 92: --- */
+ /* plane 6, row 93: --- */
+ /* plane 6, row 94: --- */
+ /* plane 7, row 1 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD840,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0x35F6,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD87E,0xD843,0xD843,0x5655,0xD844,0xD844,
+ 0xD844,0xD845,0xD845,0xD845,0x3667,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD841,0xD845,0xD845,0xD845,0xD845,0xD845,0xD87E,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,
+ 1, /* first low-surrogate */
+ 0xDC55,0xDD82,0xDD89,0xDD87,0xDFBE,0xDFBD,0xDFCA,0xDFD4,0xDFBC,
+ 0xDFC4,0xDFC1,0xDFC2,0xDFD7,0xDF70,0xDFBA,0xDFE3,0xDFBB,0xDCB1,0xDCB6,
+ 0xDCB0,0xDD6C,0xDE0D,0xDE07,0xDFF1,0xDFF5,0xDFED,0xDFEF,0xDFEB,0xDFEC,
+ 0xDFEE,0xDC07,0xDDC4,0xDE08,0xDEB3,0xDEAD,0xDEB0,0xDF11,0xDD8A,0xDF83,
+ 0xDF7A,0xDF82,0xDF68,0xDF71,0xDFB0,0xDFAF, 0,0xDF6C,0xDF6F,0xDF62,
+ 0xDF65,0xDF81,0xDF7F,0xDF64,0xDF73,0xDF6E,0xDF67,0xDF74,0xDF7D,0xDF78,
+ 0xDF85,0xDFAA,0xDF88,0xDFA6,0xDC4E,0xDF8A,0xDF84, 0,0xDE24,0xDE22,
+ 0xDE23,0xDC32,0xDC5B,0xDC4F, 0,0xDC26,0xDC3E,0xDC42,0xDC47,0xDC22,
+ 0xDE9B,0xDC4A,0xDC1F,0xDC49,0xDC2B,0xDC33,0xDC58,0xDC2A,0xDC28,0xDD3D,
+ 0xDD3C,0xDDBF,0xDE79,0xDE80,0xDE7C,
+ /* plane 7, row 2 */
+ 1 | (94 << 8), /* first, last */
+ 0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD841,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD849,0xD849,0xD84F,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0x617F,0xD849,0xD84A,0xD849,0xD849,0xD84A,0xD849,0xD84A,0xD84A,
+ 0xD84A,0xD87E,0x3992,0xD84A,0xD84A,
+ 1, /* first low-surrogate */
+ 0xDE7A,0xDE78,0xDC82,0xDC5C,0xDC5A,0xDC4B,0xDC7C,0xDC7F,0xDC1F,
+ 0xDC89,0xDC8B,0xDC57,0xDC7E,0xDC7D,0xDC53,0xDE9F,0xDEBC,0xDEA5,0xDE86,
+ 0xDEDC,0xDEA4,0xDEB6,0xDEA2,0xDEB4,0xDF48,0xDF46,0xDFA7,0xDC14,0xDC12,
+ 0xDC11,0xDCE1,0xDCD0,0xDD26,0xDD28,0xDD29,0xDF2F,0xDF0D,0xDF25,0xDF14,
+ 0xDF3C,0xDF0B,0xDF11,0xDF30,0xDF18,0xDF19,0xDF36,0xDF17,0xDF10,0xDF15,
+ 0xDC03,0xDC29,0xDC4C,0xDD3F,0xDD3E,0xDD34,0xDD42,0xDD35,0xDFF3,0xDDCD,
+ 0xDDD1,0xDDD2,0xDEAD,0xDEBA,0xDEC1,0xDEBB,0xDEB4,0xDEBC,0xDF6C,0xDF92,
+ 0xDC21,0xDC24,0xDF19,0xDCAD,0xDCAE,0xDCAB,0xDCAC,0xDD70,0xDD76,0xDD71,
+ 0xDD77, 0,0xDFEC,0xDC1C,0xDFFB,0xDFEE,0xDCE2,0xDFFD,0xDC1E,0xDC3B,
+ 0xDC4A,0xDCAE, 0,0xDC7D,0xDC56,
+ /* plane 7, row 3 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84B,0xD87E,0xD84B,0xD84B,0xD87E,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0x3A45,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x3BC9,
+ 0xD84D,0xD84D,0xD87E,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD87E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 1, /* first low-surrogate */
+ 0xDC44,0xDC4B,0xDDFA,0xDDE8,0xDDF8,0xDDFF,0xDDF7,0xDDF6,0xDDFE,
+ 0xDE07,0xDE5D,0xDCD4,0xDCC3,0xDCC8,0xDCC5,0xDCC0,0xDCC9,0xDD4D,0xDD20,
+ 0xDD36,0xDD35,0xDD88,0xDD25,0xDD21,0xDD26, 0,0xDD3F,0xDD3B,0xDD24,
+ 0xDD43,0xDD4E,0xDD4F,0xDD44,0xDD40,0xDD41,0xDD39,0xDD2B,0xDEDD,0xDEDE,
+ 0xDFCD,0xDFCB,0xDFDB,0xDFD8,0xDFD9,0xDFD2,0xDFCA,0xDFD1,0xDFD4,0xDFF9,
+ 0xDFD0,0xDC5E,0xDC5D,0xDC8A,0xDD14,0xDE83,0xDE84,0xDE9B,0xDE82,0xDE7D,
+ 0xDE7C,0xDE99,0xDE7E,0xDE9A,0xDE95,0xDE7B,0xDE86,0xDF48,0xDF92,0xDDB2,
+ 0xDE42,0xDE72,0xDE15,0xDE30,0xDE43,0xDE5B,0xDE1D,0xDE73,0xDE2D, 0,
+ 0xDE21,0xDE1C,0xDCEA,0xDE29,0xDE1E,0xDE33,0xDD10,0xDD0E,0xDCF1,0xDD0D,
+ 0xDD11,0xDD12,0xDD17,0xDD09,0xDD0F,
+ /* plane 7, row 4 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x3D55,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,
+ 1, /* first low-surrogate */
+ 0xDD98,0xDD94,0xDD96,0xDD99,0xDD95,0xDD97,0xDE50,0xDE52,0xDE4D,
+ 0xDE57,0xDE53,0xDE56,0xDEB8,0xDF12,0xDFF1,0xDFF0,0xDFEE,0xDFEF,0xDFE5,
+ 0xDFEB,0xDFE7,0xDFF2,0xDFE6,0xDFF7,0xDC09,0xDC6B,0xDC6A,0xDE79,0xDECD,
+ 0xDEEF,0xDEE4,0xDEE3,0xDF6C,0xDF67,0xDF62,0xDF58,0xDF69,0xDFAB,0xDF57,
+ 0xDFAD,0xDF54,0xDFAE,0xDF76,0xDF49,0xDF45,0xDF4F,0xDD0F,0xDF50,0xDF7D,
+ 0xDF44,0xDF66,0xDF48,0xDFA3,0xDF51,0xDF53,0xDD10,0xDF60,0xDF47,0xDF5E,
+ 0xDF85,0xDFAC,0xDF6D,0xDF75,0xDFA8, 0,0xDF43,0xDF4E,0xDF5C,0xDF56,
+ 0xDF6E,0xDF63,0xDF6A,0xDF56,0xDF12,0xDF5C,0xDF58,0xDF55,0xDF7E,0xDFA8,
+ 0xDF11,0xDF59,0xDF5A,0xDF67,0xDF54,0xDF5B,0xDFF0,0xDD29,0xDD2C,0xDD2A,
+ 0xDD27,0xDD67,0xDD68,0xDD93,0xDD95,
+ /* plane 7, row 5 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0x3EE8,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD842,0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0x3FB6,0xD853,0xD853,0xD853,
+ 0x3FBD,0xD853,0xD853,0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD84A,0xD854,0xD858,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD855,0xD87E,0xD855,0xD855,0xD855,
+ 1, /* first low-surrogate */
+ 0xDD9A,0xDDEE,0xDDF1,0xDDED,0xDDE9,0xDECB,0xDEDF,0xDEDB,0xDC3C,
+ 0xDC4E,0xDC6C,0xDC7B,0xDC7C,0xDC83,0xDC6B,0xDC66,0xDC63,0xDCA0,0xDC85,
+ 0xDC68,0xDCA2,0xDDEC, 0,0xDDE7,0xDE10,0xDE18,0xDE3A,0xDE1A,0xDE38,
+ 0xDE41,0xDE1B,0xDE14,0xDE1C,0xDE1D,0xDF12,0xDF0D,0xDF07,0xDF7E,0xDF7F,
+ 0xDEB9,0xDF80,0xDF7A,0xDFF3,0xDCB9,0xDCBB,0xDCBA,0xDCBD,0xDCB7,0xDCBF,
+ 0xDD21,0xDE3A,0xDE3D,0xDE36,0xDE49,0xDE81, 0,0xDE3F,0xDE4D,0xDE3E,
+ 0,0xDE30,0xDE4F,0xDF37,0xDF98,0xDF99,0xDC11,0xDC0D,0xDC88,0xDC8A,
+ 0xDE1C,0xDE55,0xDE56,0xDE62,0xDE57,0xDE42,0xDE10,0xDE4D,0xDE5A,0xDE66,
+ 0xDE46,0xDC7E,0xDE4F,0xDEF9,0xDF87,0xDF84,0xDFF4,0xDFF5,0xDFF2,0xDFF7,
+ 0xDD45,0xDD50,0xDD49,0xDD35,0xDCFD,
+ /* plane 7, row 6 */
+ 1 | (94 << 8), /* first, last */
+ 0xD855,0xD855,0xD855,0x40D6,0xD855,0xD855,0xD87E,0xD855,0xD85C,
+ 0xD855,0xD843,0xD855,0xD840,0xD856,0xD856,0xD856,0xD856,0x4171,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD87E,0xD856,
+ 0xD87E,0xD856,0xD856,0xD857,0xD856,0xD856,0xD856,0xD856,0xD857,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD87E,0xD856,0xD856,0xD856,0xD856,
+ 0xD857,0xD856,0xD857,0xD857,0xD857,0x4298,0xD857,0xD857,0xD857,0xD857,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD87E,0xD87E,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD840,
+ 0xD858,0xD858,0xD858,0xD859,0xD859,
+ 1, /* first low-surrogate */
+ 0xDD30,0xDD43,0xDD46, 0,0xDD33,0xDEC6,0xDD56,0xDED4,0xDDD8,
+ 0xDEE0,0xDFA7,0xDF44,0xDF98,0xDC54,0xDC3E,0xDC35,0xDC3A, 0,0xDC34,
+ 0xDC39,0xDC46,0xDC5A,0xDC5B,0xDC3C,0xDDDC,0xDDD6,0xDDD0,0xDD5E,0xDEAC,
+ 0xDD5D,0xDEA5,0xDFF4,0xDC24,0xDFE0,0xDFFD,0xDFF2,0xDFFC,0xDC02,0xDFF1,
+ 0xDFFF,0xDFD2,0xDFD8,0xDFD3,0xDFF9,0xDD63,0xDFED,0xDFF7,0xDFF0,0xDFD7,
+ 0xDC09,0xDFF5,0xDEC2,0xDEC5,0xDECF, 0,0xDEC1,0xDEC6,0xDED4,0xDECE,
+ 0xDC9B,0xDC99,0xDC8F,0xDCB7,0xDC82,0xDC93,0xDCB4,0xDCC1,0xDC90,0xDC9A,
+ 0xDC94,0xDC9C,0xDCB5,0xDD6F,0xDD6E,0xDC9F,0xDC8E,0xDC9E,0xDE3C,0xDE47,
+ 0xDE41,0xDEEB,0xDEEC,0xDEED,0xDEEE,0xDEDF,0xDEF2,0xDF0D,0xDF0E,0xDD86,
+ 0xDFA9,0xDFA4,0xDFA5,0xDC5F,0xDC5A,
+ /* plane 7, row 7 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD87E,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD856,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD87E,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD87E,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 1, /* first low-surrogate */
+ 0xDC66,0xDC68,0xDC6A,0xDC64,0xDC65,0xDCC1,0xDCD8,0xDD7B,0xDCD9,
+ 0xDD09,0xDDAA,0xDDA3,0xDDB9,0xDDE2,0xDDA5,0xDDAB,0xDE20,0xDF89,0xDF8B,
+ 0xDFDB,0xDFE4,0xDFEF,0xDFE2,0xDFE9,0xDFF0,0xDFF3,0xDFDD,0xDC1E,0xDD1D,
+ 0xDD46,0xDD7C,0xDD80,0xDD81,0xDD82,0xDD87,0xDD88,0xDD8A,0xDD8C,0xDDE7,
+ 0xDDEB,0xDDEA,0xDE68,0xDE6B,0xDE69,0xDE66,0xDE6A,0xDE65,0xDEE5,0xDEE4,
+ 0xDEE6,0xDD18,0xDE24,0xDE48,0xDE2F,0xDE7E,0xDD89,0xDE1E,0xDE49,0xDE26,
+ 0xDE09,0xDE34,0xDE2D,0xDE4A,0xDE15,0xDDA9,0xDE33,0xDE28,0xDE27,0xDE20,
+ 0xDE2B,0xDE29,0xDE6A,0xDE0B,0xDE0E,0xDE1C,0xDDFF,0xDDAA,0xDE35,0xDE11,
+ 0xDE4B,0xDE4C,0xDE1F,0xDE0F,0xDE39,0xDE68,0xDE1D,0xDE08,0xDE0C,0xDE0D,
+ 0xDE62,0xDEAF,0xDE32,0xDE2C,0xDE64,
+ /* plane 7, row 8 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD87E,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0x45CD,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x46F6,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 1, /* first low-surrogate */
+ 0xDE04,0xDE16,0xDE4D,0xDE07,0xDEAE,0xDDD4,0xDDD1,0xDDD5,0xDDD0,
+ 0xDF71,0xDF5D,0xDF5B,0xDF7A,0xDDBD,0xDF7F,0xDF79,0xDF67,0xDF9E,0xDF94,
+ 0xDF64,0xDF5E,0xDF81,0xDF5A,0xDF57,0xDF7C,0xDF98,0xDF66,0xDF7E,0xDF82,
+ 0xDF68,0xDF5F,0xDF63,0xDF97, 0,0xDF53,0xDF7B,0xDF7D,0xDF78,0xDC06,
+ 0xDDC0,0xDDC2,0xDDC3,0xDEDC,0xDEE6,0xDEEC,0xDEF2,0xDEE8,0xDEEB,0xDEEA,
+ 0xDEE5,0xDEE0,0xDED0,0xDED8,0xDED5,0xDED3,0xDEE4,0xDEF3,0xDEDB,0xDF2F,
+ 0xDFF9,0xDC5D,0xDC5B,0xDC4C,0xDC58,0xDC60,0xDC53,0xDC50,0xDD07,0xDD08,
+ 0xDCF4,0xDCF6,0xDD04,0xDCFD,0xDD05,0xDE28,0xDE56,0xDE42,0xDE5C,0xDE3D,
+ 0xDE2F,0xDE2B,0xDE58,0xDE61,0xDE2C,0xDE51,0xDE50,0xDE3C,0xDE36, 0,
+ 0xDE60,0xDE5B,0xDE2E,0xDE40,0xDE5F,
+ /* plane 7, row 9 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0x477A,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x47B8,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD87E,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0x4801,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,
+ 1, /* first low-surrogate */
+ 0xDE26,0xDE2D,0xDE5E,0xDE3B,0xDFEF,0xDFF3,0xDFEE,0xDFED,0xDC5A,
+ 0xDC62,0xDC5B,0xDC5F,0xDC5E,0xDC64,0xDCE0,0xDCE1,0xDCE5,0xDDA5,0xDD9B,
+ 0xDD9F,0xDD9C, 0,0xDDAA,0xDDA4,0xDDA3,0xDE67,0xDF26,0xDF1A, 0,
+ 0xDF1C,0xDF15,0xDF1B,0xDF18,0xDF1E,0xDF25,0xDDDC,0xDC7B,0xDC75,0xDC93,
+ 0xDC8F,0xDC7C,0xDC9B,0xDC88,0xDC91,0xDC7E, 0,0xDC86,0xDE5B,0xDE54,
+ 0xDF35,0xDF40,0xDF37,0xDF29,0xDF26,0xDF23,0xDF30,0xDF20,0xDF28,0xDF32,
+ 0xDF2A,0xDF31,0xDF24,0xDF41,0xDF42,0xDF43,0xDF25,0xDF38,0xDC1C,0xDC1D,
+ 0xDC1E,0xDCF6,0xDDA5,0xDD89,0xDD9D,0xDD8A,0xDD87,0xDDAB,0xDD86,0xDD9E,
+ 0xDD93,0xDDA1,0xDD88,0xDDA3,0xDD9F,0xDDA0,0xDEFF,0xDF00,0xDF02,0xDEF8,
+ 0xDEF7,0xDF01,0xDF87,0xDF89,0xDF76,
+ /* plane 7, row 10 */
+ 1 | (94 << 8), /* first, last */
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0x492F,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0x4931,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0x499C,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0x49E6,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD850,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDF6E,0xDF77,0xDF82,0xDF85,0xDF83,0xDF84,0xDC57,0xDC4B,0xDC56,
+ 0xDC5D,0xDC60,0xDC4D,0xDC55,0xDC54,0xDC53,0xDC50,0xDC63,0xDC62,0xDD17,
+ 0xDD16,0xDD2D,0xDDD9,0xDDBF, 0,0xDDB2,0xDDAC,0xDDB0,0xDDCF,0xDDB8,
+ 0,0xDDD3,0xDDB1,0xDDAF,0xDDCE,0xDDB4,0xDDB7,0xDDD5, 0,0xDD38,
+ 0xDD28,0xDD3F,0xDD40,0xDD41,0xDD33,0xDD2B,0xDD2E,0xDF11,0xDF18,0xDF17,
+ 0xDF19,0xDF16, 0,0xDF0D,0xDF26,0xDF79,0xDFD8,0xDFF3,0xDFD7,0xDFCC,
+ 0xDFCF,0xDFCB,0xDFD1,0xDFCE,0xDFD4,0xDFD5,0xDFD3,0xDFD6,0xDFCD,0xDFDA,
+ 0xDFD2,0xDFDE,0xDCCC,0xDCB8,0xDCB7,0xDCC2,0xDCC3,0xDDFA,0xDDF9,0xDE1F,
+ 0xDE1D,0xDF82,0xDEA6,0xDE90,0xDE9E,0xDE98,0xDE93,0xDE92,0xDEA5,0xDE95,
+ 0xDFA9,0xDFA8,0xDFAA,0xDFAB,0xDFAC,
+ /* plane 7, row 11 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0x4B38,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD87E,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0x4C3A,0xD867,0xD867,0x4CB1,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD868,
+ 1, /* first low-surrogate */
+ 0xDC1F,0xDC22,0xDCAA,0xDC96,0xDC91,0xDCAB,0xDCA2,0xDCA4,0xDC9D,
+ 0xDC97,0xDC7D,0xDC9F,0xDC9C,0xDC99,0xDCA6,0xDC92,0xDCA7,0xDDC9,0xDDC8,
+ 0xDDC7,0xDDCB,0xDE74,0xDEC9, 0,0xDED2,0xDEDB,0xDEEB,0xDEE9,0xDEEF,
+ 0xDEEE,0xDEF9,0xDEDE,0xDC16,0xDC45,0xDC7F,0xDC98,0xDC9F,0xDC86,0xDC90,
+ 0xDC9A,0xDC9D,0xDC8D,0xDC9C,0xDCA0,0xDCA7,0xDC8F,0xDE41,0xDE35,0xDE37,
+ 0xDE30,0xDE3A,0xDE36,0xDE08,0xDECA,0xDF12,0xDF15,0xDF22,0xDF13,0xDF18,
+ 0xDF21,0xDC10,0xDC20,0xDC2F,0xDCA5,0xDCA3,0xDCB6,0xDCAB,0xDD68,0xDD67,
+ 0xDD6F,0xDD77,0xDD64,0xDD78, 0,0xDD76,0xDD6E, 0,0xDFD0,0xDFB3,
+ 0xDFCB,0xDFD6,0xDFB1,0xDFB4,0xDFD7,0xDFC6,0xDFBA,0xDFD1,0xDFD2,0xDFB5,
+ 0xDFC4,0xDFCC,0xDFBB,0xDFB2,0xDE5B,
+ /* plane 7, row 12 */
+ 1 | (94 << 8), /* first, last */
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0x4D47,0xD868,0x4D51,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xffff,0xD853,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,0xD864,0xD841,0xD841,0xD841,
+ 0xD842,0xD841,0xD841,0xD842,0xD842,0xD841,0xD841,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD85E,0xD843,0xD843,0xD843,0xD861,0xD843,
+ 0xD843,0xD844,0xD844,0xD843,0xD843,0xD843,0xD844,0xD84A,0xD843,0xD87E,
+ 0xD843,0xD843,0xD843,0xD844,0xD843,0xD843,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD850,0xD845,0xD845,0xD846,
+ 1, /* first low-surrogate */
+ 0xDE5A,0xDE59,0xDE99,0xDE94,0xDE96,0xDE93,0xDE91,0xDE8F,0xDE98,
+ 0xDF0C,0xDF0A,0xDF0E,0xDF12,0xDF11,0xDF0B,0xDF9A, 0,0xDFB4, 0,
+ 0xDC1C,0xDC20,0xDC21,0xDCD3,0xDCD2,0xDD38, 0,0xDCCF,0xDD1D,0xDD92,
+ 0xDD8F,0xDD8C,0xDFEA,0xDCB9,0xDD6E,0xDDA0,0xDDDD,0xDE12,0xDE17,0xDE6D,
+ 0xDC05,0xDFFB,0xDFFD,0xDC06,0xDC00,0xDFFF,0xDFFE,0xDCB6,0xDD05,0xDD07,
+ 0xDEBC,0xDEBB,0xDF8B,0xDF87,0xDFFB,0xDFE7,0xDFE6,0xDFE2,0xDDD3,0xDFD9,
+ 0xDFCA,0xDC12,0xDC10,0xDFDC,0xDFD0,0xDF8B,0xDC13,0xDE10,0xDFDA,0xDC4F,
+ 0xDFFD,0xDFE5,0xDFCC,0xDC39,0xDFC7,0xDFD8,0xDC60,0xDC64,0xDC86,0xDC5E,
+ 0xDC66,0xDC5F,0xDC77,0xDC82,0xDC96,0xDD3E,0xDD79,0xDD7A,0xDE88,0xDE89,
+ 0xDE8C,0xDFE0,0xDE7B,0xDE86,0xDC94,
+ /* plane 7, row 13 */
+ 1 | (94 << 8), /* first, last */
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0x3747,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0x3817,0xD847,0xD849,0xD848,0xD848,0xD848,
+ 0xD848,0xD87E,0xD848,0xD87E,0xD848,0xD848,0xD848,0xD848,0xD848,0x38A3,
+ 0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD84C,0xD87E,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD87E,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD87E,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 1, /* first low-surrogate */
+ 0xDC97,0xDCB7,0xDCB5,0xDCB8,0xDC93,0xDCB2,0xDCB4,0xDC99,0xDCC3,
+ 0xDC9D,0xDC9B,0xDCA3, 0,0xDD9F,0xDD9E,0xDDA3,0xDDA0,0xDDA1,0xDEC5,
+ 0xDEC6,0xDEBE,0xDEC4,0xDEBF,0xDF4C,0xDF4A,0xDFB1,0xDC15,0xDC17,0xDC10,
+ 0xDC18,0xDCE0,0xDCDF,0xDD27,0xDF43,0xDF48,0xDF1D,0xDF50,0xDF58,0xDF47,
+ 0xDF54,0xDF53,0xDF40,0xDF55, 0,0xDF5A,0xDC70,0xDD5B,0xDD4D,0xDD56,
+ 0xDD4F,0xDC87,0xDD59,0xDC88,0xDD54,0xDD53,0xDD50,0xDEB3,0xDF6E, 0,
+ 0xDF6F,0xDF93,0xDC29,0xDC25,0xDC28,0xDC6F,0xDEB8,0xDC97,0xDCB3,0xDD79,
+ 0xDD7E,0xDD7C,0xDD83,0xDCAC,0xDC00,0xDC34,0xDC65,0xDC36,0xDCA7,0xDC59,
+ 0xDC58,0xDC31,0xDC62,0xDC38,0xDC73,0xDC3E,0xDC55,0xDC54,0xDC95,0xDCAD,
+ 0xDCA5,0xDC94,0xDC9A,0xDC9B,0xDC99,
+ /* plane 7, row 14 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0x3B1E,0xD84C,
+ 0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD87E,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 1, /* first low-surrogate */
+ 0xDC9F,0xDC53,0xDE12,0xDE0A,0xDE09,0xDE0C,0xDE0B,0xDE0E,0xDE0D,
+ 0xDE08,0xDD38,0xDD3A,0xDD37,0xDD3D,0xDD2D,0xDD82,0xDD95,0xDD87,0xDD9D,
+ 0xDDB5,0xDD81,0xDDC7,0xDD9B,0xDD98,0xDD94,0xDD86,0xDD90,0xDD34,0xDD8E,
+ 0xDD85,0xDDA6,0xDD96,0xDFEA,0xDFDF,0xDEBD,0xDFF7,0xDFEB,0xDFE0,0xDFE8,
+ 0xDFE1,0xDFE9,0xDFEE,0xDFE5,0xDFEC,0xDC63,0xDCC6,0xDCC2,0xDCC1,0xDCC0,
+ 0xDCC3,0xDD18,0xDEAE,0xDEA3,0xDEC5,0xDEA0,0xDEB4,0xDEA5, 0,0xDEA4,
+ 0xDEA8,0xDEA6,0xDEA8,0xDE8D,0xDE82,0xDE9E,0xDE89,0xDE83,0xDE91,0xDEA6,
+ 0xDE9A,0xDE90,0xDE85,0xDE7D,0xDCEC,0xDE9B,0xDEA5,0xDEF0,0xDE96,0xDE88,
+ 0xDED6,0xDED8,0xDE86,0xDEA4,0xDE97,0xDD1C,0xDD19,0xDD9E,0xDD9F,0xDD9D,
+ 0xDD9C,0xDE5D,0xDE5E,0xDE73,0xDE63,
+ /* plane 7, row 15 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84F,0xD84E,0xD84F,0xD850,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD850,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD850,0xD84F,0xD84F,0xD87E,0xD84F,0xD850,0xD850,0xD84F,0xD84F,
+ 0xD850,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0x71D7,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD852,0xD852,0x3E9A,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,
+ 1, /* first low-surrogate */
+ 0xDEBE,0xDEC1,0xDEBC,0xDEBF,0xDEBB,0xDEBD,0xDF13,0xDF14,0xDFF8,
+ 0xDFFA,0xDC06,0xDFFE,0xDC51,0xDC0B,0xDFF1,0xDFA9,0xDFD5,0xDFDC,0xDFCB,
+ 0xDFF2,0xDC5F,0xDFDB,0xDFD6,0xDFD9,0xDFD1,0xDFCF,0xDFD8,0xDFE0,0xDFD4,
+ 0xDFF3,0xDC05,0xDFCE,0xDFF4,0xDD12,0xDFDA,0xDC0E,0xDC06,0xDFD7,0xDFCD,
+ 0xDC07,0xDFE1,0xDC08,0xDFBE,0xDFEF,0xDFD9,0xDFDA, 0,0xDFA0,0xDFDF,
+ 0xDF9E,0xDFBF,0xDFAF,0xDFA7,0xDFAA,0xDFF4,0xDFAE,0xDFB5,0xDFB8,0xDFDB,
+ 0xDFC0,0xDFB7,0xDFA2,0xDFDD,0xDFA1,0xDFA5,0xDFB4,0xDFA6,0xDFAB,0xDFAC,
+ 0xDF9F,0xDFB1,0xDFFC,0xDD2E,0xDD30,0xDD99,0xDDF8,0xDDF6,0xDEF4,0xDEEB,
+ 0xDEE1,0xDEE4,0xDC75,0xDC69, 0,0xDC99,0xDC9E,0xDC94,0xDC93,0xDC91,
+ 0xDE19,0xDE17,0xDE49,0xDE47,0xDE48,
+ /* plane 7, row 16 */
+ 1 | (94 << 8), /* first, last */
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD853,0xD847,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0x3FC2,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD87E,0xD854,0xD854,0xD854,0xD854,0xD854,0xD84A,0xD854,
+ 0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0x40DC,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD87E,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x41B3,
+ 0xD856,0xD856,0xD856,0xD87E,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,
+ 1, /* first low-surrogate */
+ 0xDE52,0xDE40,0xDE63,0xDE46,0xDE5F,0xDF0E,0xDF85,0xDF87,0xDFCB,
+ 0xDFCC,0xDFC9,0xDCCB,0xDCE7,0xDD20,0xDE5F,0xDE60,0xDE6A,0xDE76,0xDE73,
+ 0xDE71,0xDE66, 0,0xDE6B,0xDE79,0xDE7B,0xDF3C,0xDF9E,0xDF9C,0xDC1C,
+ 0xDC1E,0xDC21,0xDC96,0xDCA1,0xDCB6,0xDCA0,0xDC94,0xDC97,0xDE81,0xDE86,
+ 0xDEC0,0xDE8A,0xDD4B,0xDE85,0xDE95,0xDE49,0xDE82,0xDE84,0xDC78,0xDE90,
+ 0xDEB1,0xDFFE,0xDFFB,0xDD50,0xDD56,0xDD5A,0xDD4C, 0,0xDD57,0xDEE1,
+ 0xDED9,0xDEDB,0xDEF4,0xDF45,0xDF47,0xDC74,0xDC6B,0xDC68,0xDC69,0xDC79,
+ 0xDD5B,0xDC80,0xDC81,0xDC61,0xDC70,0xDC6F,0xDC73,0xDC5D,0xDDFA, 0,
+ 0xDDF3,0xDE0A,0xDE17,0xDD5F,0xDEB0,0xDC3E,0xDC46,0xDC4F,0xDC44,0xDC69,
+ 0xDC33,0xDC2F,0xDC4E,0xDC3A,0xDC2B,
+ /* plane 7, row 17 */
+ 1 | (94 << 8), /* first, last */
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD87E,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD84A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD850,0xD85A,0xD85A,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDCA9,0xDC50,0xDC45,0xDC37,0xDC25,0xDC2C,0xDC3F,0xDC34,0xDC29,
+ 0xDC1E,0xDC3D,0xDEED,0xDD66,0xDEF3,0xDEEA,0xDEEB,0xDCCC,0xDCCE,0xDCD0,
+ 0xDCE3,0xDCE0,0xDCD1,0xDCDC,0xDCDD,0xDCF0,0xDCDB,0xDCE5,0xDCF1,0xDCC9,
+ 0xDCE8,0xDCE7,0xDCC8,0xDCDE,0xDCCD,0xDCC5,0xDCC6,0xDCE4,0xDCC3,0xDEFB,
+ 0xDEFC,0xDEFE,0xDF03,0xDF00,0xDEFD,0xDF05,0xDF13,0xDFA7,0xDFB4,0xDC70,
+ 0xDC74,0xDC71,0xDC75,0xDC7D,0xDC73,0xDCC4,0xDCC3,0xDCDE,0xDCDD,0xDD11,
+ 0xDD0F,0xDD10,0xDDC3,0xDDC2,0xDDCA,0xDDC1,0xDE23,0xDFB1,0xDC24,0xDC11,
+ 0xDC25,0xDC0A,0xDC1F,0xDC20,0xDC14,0xDC28,0xDC03,0xDC12,0xDC0B,0xDC17,
+ 0xDE11,0xDD49,0xDD89,0xDD90,0xDD8F,0xDD96,0xDD95,0xDD93,0xDDED,0xDDF0,
+ 0xDFDE,0xDE85,0xDE77,0xDE7A,0xDE84,
+ /* plane 7, row 18 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD87E,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0x8666,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0x45D9,0xD85C,0x45DD,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 1, /* first low-surrogate */
+ 0xDE79,0xDE7D,0xDE7B,0xDEED,0xDEEC,0xDDF6,0xDD9B,0xDE9D,0xDF11,
+ 0xDEC4,0xDEC8,0xDEDF,0xDEBF,0xDEB3,0xDEBA,0xDF10,0xDF06,0xDE88,0xDE9A,
+ 0xDEE0,0xDECC,0xDEB5,0xDEE1,0xDEBC,0xDEC6,0xDF0B,0xDEA4,0xDE95,0xDEA3,
+ 0xDEE2,0xDECD,0xDEE3,0xDEAB,0xDECB,0xDE8F,0xDDAB,0xDEA9,0xDF24,0xDEE4,
+ 0xDF12,0xDEE5,0xDF67,0xDEAA,0xDEA0,0xDEE6,0xDEC1,0xDEE7,0xDF0D,0xDE86,
+ 0xDEB0,0xDE8B,0xDEE8,0xDEC9,0xDF19,0xDEC0,0xDF0C,0xDEE9,0xDEEA,0xDDED,
+ 0xDDE3,0xDDE4,0xDDE8,0xDDD2,0xDDE2, 0,0xDFCF,0xDFD1,0xDFC3,0xDFC9,
+ 0xDFEA,0xDFB4,0xDFDC,0xDFBD,0xDFE6,0xDFC8,0xDFEC,0xDFB2,0xDFA9,0xDFD3,
+ 0xDFC0,0xDFE9,0xDFD5, 0,0xDFC5, 0,0xDFCB,0xDFD0,0xDFD2,0xDFE4,
+ 0xDFE8,0xDFCD,0xDFB6,0xDFAA,0xDFD4,
+ /* plane 7, row 19 */
+ 1 | (94 << 8), /* first, last */
+ 0xD861,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x46FC,0xD85E,0xD87E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD87E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD87E,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,
+ 1, /* first low-surrogate */
+ 0xDC49,0xDFC1,0xDFDD,0xDFCE,0xDDC9,0xDDCA,0xDEFD,0xDED9,0xDEFF,
+ 0xDF04,0xDEFA,0xDF06,0xDF15,0xDF11,0xDF07,0xDF0B,0xDFFC,0xDFFD,0xDC6D,
+ 0xDC65,0xDD14,0xDD13,0xDD0C,0xDD0B,0xDD18,0xDD22,0xDE7D,0xDE6F,0xDE75,
+ 0xDE7B,0xDE80,0xDE7F,0xDE96,0xDE6D,0xDE6B,0xDE86,0xDE73,0xDE62,0xDE77,
+ 0xDE81,0xDE69,0xDE82,0xDE97,0xDE84, 0,0xDE78,0xDDD0,0xDE7A,0xDE6A,
+ 0xDE65,0xDE7E,0xDE94,0xDFC2,0xDFC1,0xDFF9,0xDC71,0xDC6B,0xDC6D,0xDC6F,
+ 0xDC6E,0xDCF2,0xDCE8,0xDCEF,0xDCE9,0xDCEA,0xDCED,0xDCF3,0xDCE6,0xDDC9,
+ 0xDDB4,0xDDB3,0xDDB9,0xDDCA,0xDDB1,0xDDB6,0xDDC7,0xDDC4,0xDDB7,0xDE6F,
+ 0xDF33,0xDF32,0xDF1F,0xDDD9,0xDF2B,0xDF30,0xDF36,0xDF42,0xDF41,0xDDD8,
+ 0xDCA5,0xDCAB,0xDCA9,0xDCB3,0xDCA7,
+ /* plane 7, row 20 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD87E,0x8F3A,0xD860,
+ 0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD862,0x4907,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0x933D,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD845,
+ 0xD863,0xD87E,0xD863,0x49A8,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD87E,0xD863,0xD863,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDCA0,0xDCD2,0xDCA8,0xDCB6,0xDCAC,0xDCAE,0xDCE6,0xDE65,0xDF47,
+ 0xDF63,0xDF4D,0xDF5F,0xDF4B,0xDF60,0xDF49,0xDF53,0xDDDF, 0,0xDF57,
+ 0xDF4E,0xDF52,0xDF54,0xDC20,0xDC22,0xDDC1,0xDDD7,0xDDD5,0xDDC4,0xDDD0,
+ 0xDDBB,0xDDE2,0xDDCB,0xDDB8,0xDDBF,0xDDD8,0xDDC0,0xDDBA,0xDDB4,0xDDBC,
+ 0xDDD4,0xDDED,0xDDC2,0xDDD9,0xDDCC,0xDF2F,0xDF23,0xDF96,0xDF8D,0xDF9E,
+ 0xDF99,0xDC83, 0,0xDC6A,0xDC69,0xDC75,0xDC6C,0xDC80,0xDC6E,0xDC81,
+ 0xDC77,0xDC76,0xDC73,0xDC70,0xDC84,0xDD19,0xDDF2, 0,0xDDEC,0xDDEB,
+ 0xDDF6,0xDDEF,0xDDF4,0xDDEE,0xDDF3,0xDDED,0xDC9B,0xDC98,0xDC94,0xDC7A,
+ 0xDC9A,0xDDF0,0xDD4C, 0,0xDD57,0xDD51,0xDD62,0xDD52,0xDD5C,0xDD53,
+ 0xDDEF,0xDE85,0xDF2D,0xDF3E,0xDF30,
+ /* plane 7, row 21 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD87E,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0x4ACA,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,
+ 1, /* first low-surrogate */
+ 0xDF7D,0xDFE6,0xDFF6,0xDFE4,0xDFE9,0xDFEC,0xDFF2,0xDFE8,0xDFE3,
+ 0xDFEB,0xDFF0,0xDFEA,0xDFE7,0xDFFD,0xDFE5,0xDFEE,0xDFF5,0xDFF9,0xDFF1,
+ 0xDFF4,0xDDF4,0xDC11,0xDCDE,0xDCD8,0xDCDD,0xDCDB,0xDCD3,0xDCE1,0xDDDE,
+ 0xDDFC,0xDE28,0xDEB7,0xDEB8,0xDEC7,0xDEB2,0xDEA9,0xDEB9,0xDEBC,0xDEB3,
+ 0xDED1,0xDFB0,0xDFB1,0xDFB6,0xDC04,0xDC2C,0xDCC1,0xDC9E,0xDCBA, 0,
+ 0xDCD1,0xDCD3,0xDCD4,0xDCD5,0xDCC5,0xDCB6,0xDCB2,0xDCB5,0xDCC3,0xDCB9,
+ 0xDCC6,0xDDD6,0xDDE0,0xDDDB,0xDDD7,0xDDDD,0xDF15,0xDF0C,0xDF0F,0xDF0E,
+ 0xDEFE,0xDF04,0xDF0B,0xDF02,0xDEFF,0xDF08,0xDF10,0xDF17,0xDF13,0xDF06,
+ 0xDF09,0xDC24,0xDC26,0xDC25,0xDC48,0xDCB5,0xDCD2,0xDCD5,0xDCC4,0xDCAF,
+ 0xDCAD,0xDCC1,0xDCC0,0xDCCC,0xDCCD,
+ /* plane 7, row 22 */
+ 1 | (94 << 8), /* first, last */
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0x4B8D,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,
+ 0xD868,0xD868,0x4CC0,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0x4CCA,
+ 0xD867,0xD867,0xD867,0xD868,0xD868,0xD867,0xD867,0xD868,0xD868,0xD868,
+ 0x4D25,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0x4D4A,
+ 0xD868,0x4D53,0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,0xD854,
+ 0xD87E,0xD841,0xD842,0xD842,0xD842,
+ 1, /* first low-surrogate */
+ 0xDCC3,0xDCC8,0xDCC5,0xDCBA,0xDCD0,0xDCC2,0xDCCE, 0,0xDE43,
+ 0xDE42,0xDE40,0xDE31,0xDECF,0xDECE,0xDF30,0xDF34,0xDF32,0xDF43,0xDF3C,
+ 0xDC11,0xDC35,0xDC34,0xDC37,0xDC31,0xDCBF,0xDCBC,0xDCC2,0xDCC9,0xDD83,
+ 0xDD8B,0xDDA0,0xDD8D,0xDD8C,0xDD9A,0xDD8A,0xDD91,0xDFF1,0xDC0F,0xDC01,
+ 0xDC07,0xDC0C, 0,0xDFDC,0xDFEE,0xDFF7,0xDFF2,0xDFF8,0xDFEB, 0,
+ 0xDFE6,0xDFED,0xDFE9,0xDC08,0xDC00,0xDFE5,0xDFFC,0xDE61,0xDE5E,0xDE5F,
+ 0,0xDE9B,0xDF16,0xDF15,0xDF20,0xDF14,0xDF1A,0xDF17,0xDF9C, 0,
+ 0xDFF1, 0,0xDFF0,0xDC28,0xDC24,0xDC2A,0xDC2B,0xDCD5,0xDD04,0xDD05,
+ 0xDD91,0xDD92,0xDEA6,0xDD09,0xDC22,0xDC1A,0xDC0E,0xDC1B,0xDC08,0xDCB3,
+ 0xDC1C,0xDE9D,0xDC12,0xDC1E,0xDCBB,
+ /* plane 7, row 23 */
+ 1 | (94 << 8), /* first, last */
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD84D,0xD842,0xD842,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0x3605,0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDCBF,0xDCBC,0xDD08,0xDD09,0xDD63,0xDDC8,0xDF28,0xDF8E,0xDF8D,
+ 0xDC43,0xDC4D,0xDC6D,0xDC42,0xDC52,0xDC51,0xDC69,0xDC50,0xDC56,0xDC6C,
+ 0xDC44,0xDC45,0xDC6B, 0,0xDC68,0xDC57,0xDE2E,0xDE31,0xDE2D,0xDC8B,
+ 0xDCB2,0xDC8D,0xDCA3,0xDCA4,0xDC90,0xDC89,0xDC8E,0xDC92,0xDD7B,0xDE90,
+ 0xDE8F,0xDCE9,0xDCCD,0xDCC5,0xDCD0,0xDCC9,0xDCD1,0xDCC7,0xDCD2,0xDC5F,
+ 0xDCE1,0xDCCC,0xDCC6,0xDCE4,0xDDA9,0xDED3,0xDEDA,0xDED2,0xDEDB,0xDF4D,
+ 0xDF4E,0xDC1C,0xDCE8,0xDF6C,0xDF5F,0xDF66,0xDF64,0xDF78,0xDF65,0xDF6D,
+ 0xDF61,0xDF7A,0xDC07,0xDD66,0xDD68,0xDD62,0xDED3,0xDED4,0xDED1,0xDEDC,
+ 0xDF73,0xDF72,0xDC2D,0xDC2C,0xDC2F,0xDC72,0xDCB4,0xDD89,0xDCCD,0xDCA6,
+ 0xDCA2,0xDCA0,0xDC46,0xDCA1,0xDC57,
+ /* plane 7, row 24 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD87E,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0x3BF0,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD851,
+ 1, /* first low-surrogate */
+ 0xDCA3,0xDCB1,0xDCDB,0xDCF6,0xDCDC,0xDCD6,0xDE13,0xDD9C,0xDD97,
+ 0xDDD8,0xDDE4,0xDDD4,0xDDE5,0xDDDB,0xDDD0,0xDDDA,0xDDCC,0xDDDC,0xDDED,
+ 0xDDD3,0xDDD1,0xDDCE,0xDDD9,0xDDDD,0xDCC6,0xDEE6,0xDEE5,0xDEE9,0xDFFF,
+ 0xDFFE,0xDC0E,0xDC8C,0xDCCA,0xDCCB,0xDD1A,0xDED7,0xDECF,0xDED0,0xDEC9,
+ 0xDECC,0xDED3,0xDFA4,0xDFA3,0xDE81,0xDF26,0xDEF3,0xDF27,0xDEF2,0xDEFF,
+ 0xDEF5,0xDEFC,0xDF0E, 0,0xDEF6,0xDF00,0xDF23,0xDF05,0xDF25,0xDF08,
+ 0xDF50,0xDD25,0xDD20,0xDD23,0xDD21,0xDDA1,0xDE69,0xDE6C,0xDE68,0xDE6B,
+ 0xDECC,0xDECD,0xDC10,0xDC0D,0xDC0A,0xDC16,0xDC14,0xDC52,0xDC28,0xDC2E,
+ 0xDC2C,0xDC4D,0xDC49,0xDC31,0xDC30,0xDC33,0xDC2D,0xDC36,0xDC3E,0xDC2F,
+ 0xDC27,0xDC34,0xDC4C,0xDFFE,0xDC12,
+ /* plane 7, row 25 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0xD851,0xD850,0xD851,0xD850,0x3E02,0xD847,0xD850,0xD850,
+ 0xD851,0xD851,0xD851,0x3E23,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD87E,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,
+ 1, /* first low-surrogate */
+ 0xDC1F,0xDC17,0xDFF5,0xDC15,0xDFF7, 0,0xDF7D,0xDFFA,0xDFF9,
+ 0xDC4B,0xDD9C,0xDD9D, 0,0xDEF0,0xDEF6,0xDEEF,0xDC9D,0xDC9A,0xDCA7,
+ 0xDCAF,0xDCAA,0xDE64,0xDE86,0xDE75,0xDE70,0xDE84,0xDE6B,0xDE85,0xDE6C,
+ 0xDF17,0xDF94,0xDF93,0xDCD2,0xDCD7,0xDCD4,0xDEA6,0xDEA7,0xDE9C,0xDE8B,
+ 0xDE8D,0xDE98,0xDEB9,0xDE9B,0xDE9D,0xDE99,0xDEA8,0xDE91,0xDE87,0xDE9A,
+ 0xDFA6,0xDC1F,0xDCA7,0xDCB1,0xDCB2,0xDCB7,0xDED0,0xDEB3,0xDEB5,0xDEC4,
+ 0xDEC3,0xDEBC,0xDEB2,0xDEBA,0xDEBB,0xDEC2,0xDECD,0xDEBE,0xDEB7,0xDF8F,
+ 0xDC03,0xDC04,0xDD71,0xDD77,0xDD74,0xDD8B,0xDD7A,0xDD51,0xDD8C,0xDD73,
+ 0xDEFF,0xDEFB,0xDEFD,0xDEF0,0xDEF3,0xDEFC,0xDEF2,0xDC92,0xDC9E,0xDCAE,
+ 0xDC96,0xDE14,0xDE12,0xDE13,0xDE16,
+ /* plane 7, row 26 */
+ 1 | (94 << 8), /* first, last */
+ 0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD87E,
+ 0xD857,0xD857,0xD858,0xD858,0xD858,0x4315,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD87E,0xD858,
+ 0xD858,0xD87E,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD84F,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xD87E,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 1, /* first low-surrogate */
+ 0xDE0F,0xDEB6,0xDEBD,0xDC8C,0xDCAE,0xDCAC,0xDCAB,0xDC99,0xDC92,
+ 0xDCBB,0xDC9E,0xDC7E,0xDCAF,0xDCBC,0xDC98,0xDF01,0xDF09,0xDF06,0xDD67,
+ 0xDF07,0xDF08,0xDCCF,0xDD0E,0xDD32, 0,0xDD12,0xDD16,0xDD17,0xDD1B,
+ 0xDD15,0xDD31,0xDD18,0xDD1A,0xDD10,0xDD0A,0xDD09,0xDE4F,0xDD73,0xDF0F,
+ 0xDF10,0xDD75,0xDF28,0xDF11,0xDF16,0xDF17,0xDF02,0xDFBB,0xDFBA,0xDFC3,
+ 0xDFBC,0xDC8A,0xDC84,0xDC86,0xDCE0,0xDD17,0xDD18,0xDD1E,0xDD15,0xDDD3,
+ 0xDDDA,0xDDD9,0xDFE6,0xDFF4,0xDFE1,0xDC69,0xDC40,0xDC58,0xDC6C,0xDC4D,
+ 0xDD21,0xDD99,0xDDF1,0xDF68,0xDE86,0xDF5B,0xDF5C,0xDF77,0xDF2C,0xDDAD,
+ 0xDF58,0xDF64,0xDF61,0xDF48,0xDF97,0xDF59,0xDF29,0xDF62,0xDF2E,0xDF68,
+ 0xDF90,0xDF3A,0xDF3D,0xDF5E,0xDF46,
+ /* plane 7, row 27 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0x455D,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD87E,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85C,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD842,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x465A,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD87E,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 1, /* first low-surrogate */
+ 0xDF69,0xDF65,0xDF3E,0xDF49,0xDF56,0xDFE1,0xDF78,0xDF79,0xDF66,
+ 0xDF4A,0xDF35,0xDF7A,0xDF92,0xDF60,0xDF36,0xDF51,0xDF42, 0,0xDF3F,
+ 0xDF7B,0xDF5D,0xDF94,0xDF6A,0xDDB5,0xDDF2,0xDFBB,0xDC1B,0xDC1A,0xDC33,
+ 0xDC17,0xDC0A,0xDC15,0xDC12,0xDC01,0xDC2D,0xDFFD,0xDC23,0xDC05,0xDC11,
+ 0xDC00,0xDC1C,0xDC35,0xDC2E,0xDC36,0xDEBF,0xDC2F,0xDC0C,0xDC09,0xDC31,
+ 0xDFFC,0xDC0F,0xDC18,0xDC02,0xDE00,0xDF1F,0xDF37, 0,0xDF38,0xDF2B,
+ 0xDF2E,0xDF21,0xDF30,0xDF29,0xDF31,0xDDC9,0xDF01,0xDF2C,0xDF22,0xDFFF,
+ 0xDC77,0xDC67,0xDC7F,0xDC7D,0xDC7B,0xDC7E,0xDD1E,0xDD1C,0xDD21,0xDD26,
+ 0xDD27,0xDD29,0xDD2C,0xDD1D,0xDD2B,0xDEBF,0xDEA4,0xDEAA,0xDEAE,0xDE9F,
+ 0xDED0,0xDEB1,0xDEAD,0xDE9B,0xDEB2,
+ /* plane 7, row 28 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85F,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x4785,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD87E,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD87E,0xD862,0xD862,0xD862,0xD862,
+ 0x490B,0xD862,0xD862,0xD862,0xD862,0xD862,0xD853,0x4939,0xD862,0xD862,
+ 0xD862,0x4937,0xD862,0xD862,0xD862,
+ 1, /* first low-surrogate */
+ 0xDEA9,0xDEB3,0xDEB4,0xDEBA,0xDEA5,0xDEB7,0xDEAC,0xDECB,0xDECF,
+ 0xDFC6,0xDC01,0xDFFF,0xDFFD,0xDC77,0xDC78,0xDC76,0xDCF7,0xDDCC, 0,
+ 0xDDD4,0xDDD7,0xDDD5,0xDDD6,0xDDD3,0xDF5D,0xDF55,0xDCE0,0xDD48,0xDCEE,
+ 0xDCDB,0xDCE7,0xDCD6,0xDCE5,0xDCE1,0xDCDD,0xDCE2,0xDE70,0xDE66,0xDE6F,
+ 0xDE6E,0xDF81,0xDF69,0xDF6E,0xDF6D,0xDF6C,0xDF84,0xDF85,0xDF71,0xDF73,
+ 0xDF6A,0xDF6F,0xDF7B,0xDD6A,0xDD7C,0xDD7D,0xDD81,0xDDFA,0xDE05,0xDDEB,
+ 0xDDFB,0xDDE9,0xDDEF,0xDDFC,0xDDE7,0xDDE1,0xDDEE,0xDDFD,0xDF32,0xDFA7,
+ 0xDFB5,0xDFB1,0xDFB9,0xDFA8,0xDFB3,0xDDE6,0xDC8A,0xDC91,0xDC8D,0xDC99,
+ 0,0xDC9A,0xDC9B,0xDC92,0xDC8F,0xDCAB,0xDCDB, 0,0xDE75,0xDE31,
+ 0xDE38, 0,0xDE35,0xDE69,0xDE3B,
+ /* plane 7, row 29 */
+ 1 | (94 << 8), /* first, last */
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD87E,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0x4A6B,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0x4ACD,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,
+ 1, /* first low-surrogate */
+ 0xDE3D,0xDE6C,0xDE79,0xDE3C,0xDE3E,0xDC97,0xDCA5,0xDCA2,0xDC9D,
+ 0xDCA1,0xDD68,0xDD6F,0xDD6D,0xDD72,0xDD75,0xDD77,0xDD79,0xDEB5,0xDEEA,
+ 0xDEAB,0xDF43,0xDF41,0xDF42,0xDC09,0xDC08,0xDC06,0xDC01,0xDC03,0xDC00,
+ 0xDC04,0xDC0A,0xDC0E,0xDC0D,0xDC07,0xDC0F,0xDC14,0xDC02,0xDC15,0xDC0C,
+ 0xDC10,0xDC05,0xDCFD,0xDCFF,0xDD04,0xDD00,0xDD09,0xDE2B,0xDDF7,0xDE31,
+ 0xDEDB,0xDEC5,0xDED3,0xDECE, 0,0xDEC9,0xDEBF,0xDECB,0xDEC0,0xDED0,
+ 0xDED4,0xDFC1,0xDFB9,0xDFBB,0xDFC3,0xDFC9,0xDC07,0xDC2D,0xDCF8,0xDCE1,
+ 0xDCFA,0xDCEF,0xDCFD, 0,0xDCEB,0xDCF1,0xDCED,0xDCFE,0xDDF8,0xDE03,
+ 0xDDEE,0xDDE8,0xDE01,0xDEEC,0xDF22,0xDF14,0xDF34,0xDF2F,0xDF39,0xDF41,
+ 0xDF3C,0xDF49,0xDF58,0xDF3A,0xDF42,
+ /* plane 7, row 30 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD87E,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0x4C4D,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD87E,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD845,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD842,0x3510,0xD842,
+ 1, /* first low-surrogate */
+ 0xDF3F,0xDC22,0xDC23,0xDC4A,0xDCDC,0xDCD9,0xDCDB,0xDCE2,0xDE07,
+ 0xDCDF,0xDCE0,0xDCD7,0xDE4F,0xDE46,0xDE53,0xDE55,0xDE4E,0xDE4A,0xDE4C,
+ 0xDE63,0xDF51,0xDF53,0xDF58,0xDF4D,0xDF5A,0xDF49,0xDF5D,0xDC12,0xDC3C,
+ 0xDCD1,0xDCDF,0xDCD6,0xDCD8,0xDCE0,0xDCD9,0xDDB1,0xDDAC,0xDDAA,0xDDEE,
+ 0xDDBD, 0,0xDDC3,0xDDA8,0xDDAE,0xDDAB,0xDC1D,0xDC27,0xDC38,0xDC12,
+ 0xDC48,0xDC2B,0xDC16,0xDC19,0xDC3D,0xDC23,0xDC2A,0xDE64,0xDEAD,0xDEAC,
+ 0xDE14,0xDEB1,0xDEAF,0xDF2C,0xDF24,0xDF25,0xDF28,0xDFF9,0xDFF7,0xDFFD,
+ 0xDFFE,0xDC39,0xDC33,0xDCD7,0xDCD8,0xDCE4,0xDCA1,0xDD0E,0xDD3B,0xDD44,
+ 0xDD42,0xDD94,0xDD93,0xDDD5,0xDEA7,0xDC31,0xDC23,0xDC28,0xDC27,0xDCC6,
+ 0xDDA3,0xDE21,0xDC1B, 0,0xDCC1,
+ /* plane 7, row 31 */
+ 1 | (94 << 8), /* first, last */
+ 0xD842,0xD842,0xD842,0xD842,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0x367B,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0x381D,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0x64F5,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0x3B27,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,
+ 1, /* first low-surrogate */
+ 0xDCC3,0xDD2A,0xDD69,0xDE27,0xDCB6,0xDCA7,0xDCA4,0xDCA6,0xDC90,
+ 0xDC9E,0xDC94,0xDCA8,0xDCA5,0xDCA2,0xDC91, 0,0xDCBC,0xDCBD,0xDCB4,
+ 0xDCB0,0xDCE4,0xDD45,0xDD4B,0xDD7E,0xDD7F,0xDD7D,0xDDC3,0xDCFC,0xDCF7,
+ 0xDCF0,0xDCED,0xDCF1,0xDCF8,0xDEE9,0xDCEB, 0,0xDF90,0xDF8D,0xDF86,
+ 0xDF91,0xDF8A,0xDC08,0xDC50,0xDEEA,0xDEE6,0xDEE2,0xDEE7,0xDEED,0xDEE1,
+ 0xDC34,0xDC76,0xDC75,0xDC73,0xDCB5,0xDD90,0xDD92,0xDCE1,0xDCDF,0xDCD5,
+ 0xDCF2,0xDCFE,0xDD13,0xDD2E,0xDE19,0xDE08, 0,0xDE05,0xDE09,0xDE06,
+ 0xDE03,0xDDFD,0xDDFC,0xDE02,0xDE42,0xDC1A,0xDC11,0xDC15,0xDC16,0xDCCC,
+ 0xDCCF,0xDCD0,0xDD22,0xDD1E,0xDD21,0xDEE5, 0,0xDF54,0xDEEF,0xDF53,
+ 0xDF51,0xDFAD,0xDF67,0xDF68,0xDFA4,
+ /* plane 7, row 32 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD87E,0xD852,0xD852,
+ 0xD852,0x3FCF,0xD853,0xD853,0xD853,0x3FCD,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDF77,0xDF89,0xDF44,0xDF8B,0xDF79,0xDF5B,0xDF43,0xDF57,0xDF4A,
+ 0xDF7C,0xDF46,0xDF7B,0xDF56,0xDDA8,0xDE76,0xDE72,0xDED6,0xDED8,0xDED1,
+ 0xDC22,0xDC20,0xDC23,0xDC1E,0xDC6E,0xDCA3,0xDC77,0xDCA6,0xDC6D,0xDCA2,
+ 0xDC7C,0xDC84,0xDC68,0xDC74,0xDC86,0xDCA5,0xDC7B,0xDC7A,0xDC69,0xDC72,
+ 0xDC76,0xDC4A,0xDC37,0xDC2A,0xDC2D,0xDC46,0xDC28,0xDC26,0xDC42,0xDC2C,
+ 0xDC38,0xDC2B,0xDC33,0xDC45,0xDD39,0xDEF9,0xDEFA,0xDCB8,0xDCB7,0xDCBB,
+ 0xDCB9,0xDCB4,0xDE6F,0xDE87,0xDE8F,0xDEA2,0xDEA3,0xDD31,0xDF9B,0xDF9D,
+ 0xDFCE, 0,0xDEBD,0xDEBF,0xDE92, 0,0xDEEF,0xDEC9,0xDFA4,0xDFA8,
+ 0xDFAA,0xDC28,0xDC24,0xDC25,0xDC26,0xDCA9,0xDCBA,0xDCBE,0xDCBC,0xDCC0,
+ 0xDEF0,0xDEDF,0xDEE0,0xDEED,0xDEDB,
+ /* plane 7, row 33 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0x4182,0xD856,0xD856,0xD856,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD87E,0xD857,
+ 0xD857,0x4252,0xD857,0xD857,0xD857,0xD857,0xD87E,0xD857,0xD857,0xD857,
+ 0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xffff,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0x7F80,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDEFB,0xDEB9,0xDEDA,0xDEEB,0xDEEC,0xDD9A,0xDD9F,0xDD9B,0xDD97,
+ 0xDDA1,0xDF0F,0xDF05,0xDF48, 0,0xDCBC,0xDCBA,0xDEBF,0xDD01,0xDCE8,
+ 0xDCEF,0xDCE4,0xDCE6,0xDD02,0xDCEB,0xDCE0,0xDCED,0xDCD9,0xDD64,0xDD14,
+ 0xDCEE, 0,0xDD13,0xDCF9,0xDCF8,0xDF25,0xDD69,0xDF19,0xDF20,0xDF43,
+ 0xDF3F,0xDD45,0xDD4C,0xDD49,0xDD4F,0xDD41,0xDD3E,0xDD4D,0xDD52,0xDD4A,
+ 0xDD4E,0xDD73,0xDD42,0xDD51,0xDD55,0xDD50,0xDD6C, 0,0xDD6A,0xDD53,
+ 0xDD68,0xDE55,0xDE56,0xDF1C,0xDF1D, 0,0xDF1E,0xDF23,0xDF1F,0xDFE1,
+ 0xDFCD,0xDFCB,0xDFCC,0xDFC8,0xDFC9,0xDC9B,0xDC94,0xDC92,0xDC96,0xDC93,
+ 0xDC95,0xDC8F,0xDD1D,0xDD22,0xDD21,0xDDE9,0xDDEF,0xDDE0,0xDDE6,0xDDE4,
+ 0xDC29,0xDC2C,0xDC76,0xDC83,0xDC78,
+ /* plane 7, row 34 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD851,0xD85A,0x4451,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,0xD85C,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0x455A,0xD85B,0xD85B,0xD85B,0xD87E,0xD85B,
+ 0xD85B,0xD85B,0xD85C,0xD85C,0xD85B,0xD85C,0xD85B,0xD85B,0xD85B,0xD85C,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,0xD85C,
+ 0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD87E,0xD87E,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85A,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 1, /* first low-surrogate */
+ 0xDC3C,0xDC43,0xDC7A, 0,0xDCF2,0xDD9E,0xDD9B,0xDD9A,0xDDF6,
+ 0xDDF5,0xDEA5,0xDE93,0xDEA4,0xDE82,0xDEC7,0xDFB7,0xDC1D,0xDFE2,0xDFD7,
+ 0xDFE3,0xDFE4,0xDFBC,0xDFD3, 0,0xDF5A,0xDFD2,0xDF2D,0xDDAF,0xDFC4,
+ 0xDFD0,0xDFE5,0xDC05,0xDC07,0xDFE6,0xDC1B,0xDFE7,0xDFD8,0xDFBE,0xDC17,
+ 0xDFB4,0xDFD9,0xDFE8,0xDFAD,0xDFAF,0xDFC8,0xDFE9,0xDFEA,0xDDFE,0xDDFB,
+ 0xDE00,0xDC72,0xDC70,0xDC46,0xDC59,0xDC5E,0xDC48,0xDC4F,0xDC71,0xDC60,
+ 0xDC5F,0xDC6E,0xDC73,0xDDC0,0xDDBF,0xDC47,0xDC6D,0xDC6F,0xDC81,0xDC6C,
+ 0xDC78,0xDC83,0xDC49,0xDC68,0xDC74,0xDC63,0xDC6A,0xDC85,0xDC65,0xDC62,
+ 0xDCC8,0xDDD0,0xDDD4,0xDDD1,0xDE03,0xDF42,0xDF63,0xDF56,0xDF5B,0xDF55,
+ 0xDF50,0xDF2D,0xDF44,0xDF48,0xDF45,
+ /* plane 7, row 35 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85D,0x4665,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD845,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0x8D01,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0x48AF,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,
+ 1, /* first low-surrogate */
+ 0xDF82, 0,0xDF62,0xDC85,0xDC8D,0xDD36,0xDD2F,0xDD31,0xDD37,
+ 0xDEA7,0xDED9,0xDEF0,0xDEF2,0xDEFD,0xDEE8,0xDEEB,0xDEEE,0xDEE0,0xDEE9,
+ 0xDEED,0xDED6,0xDEF8,0xDED4,0xDEDF,0xDEE7,0xDED8,0xDEE3,0xDEEF,0xDF0F,
+ 0xDFCA,0xDD46,0xDC05,0xDC0C,0xDC0D,0xDC7F,0xDC80,0xDC81,0xDD01,0xDD03,
+ 0xDDF2,0xDDE2,0xDDE3,0xDDDE,0xDDE9,0xDDE8,0xDDE0,0xDE01,0xDDF5,0xDDE4,
+ 0,0xDE77,0xDF74,0xDF6F,0xDF62,0xDF61,0xDF6D,0xDF73,0xDF6A,0xDF69,
+ 0xDD12,0xDD2D,0xDD14,0xDD0F,0xDD29,0xDD16,0xDD03,0xDD46,0xDD5C,0xDD11,
+ 0xDD06,0xDCDC,0xDD2B,0xDD2A,0xDD2C,0xDD27,0xDE7A,0xDF9C,0xDF99,0xDF95,
+ 0xDF8B,0xDF98,0xDF96,0xDC32,0xDDA4,0xDDAA,0xDE1B, 0,0xDE0D,0xDE1C,
+ 0xDE0A,0xDE20,0xDE08,0xDE1A,0xDE13,
+ /* plane 7, row 36 */
+ 1 | (94 << 8), /* first, last */
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0x4941,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0x4A29,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0x4A2A,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0x4A96,0xD864,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0x4B12,
+ 1, /* first low-surrogate */
+ 0xDE11,0xDF5D,0xDF5F,0xDF5E,0xDF60,0xDFBB,0xDFBC,0xDFC1,0xDFC0,
+ 0xDFC8,0xDFCE,0xDCA7,0xDCB2,0xDCB6,0xDCA5,0xDCBA,0xDCB5,0xDCAD,0xDCA4,
+ 0xDCD3,0xDCB0,0xDCB1,0xDD1D,0xDE8D, 0,0xDE91,0xDEB6,0xDEB7,0xDEBD,
+ 0xDEBC,0xDE96,0xDE94,0xDEA0,0xDCA8,0xDCA6,0xDD84,0xDD96,0xDD88,0xDD9A,
+ 0xDED1,0xDECF,0xDF50,0xDF51,0xDF4E,0xDF80,0xDF81,0xDC1B,0xDC17,0xDC20,
+ 0xDC19,0xDC1A,0xDC21,0xDC1E,0xDC18,0xDC1D, 0,0xDD2D,0xDD24,0xDD27,
+ 0xDD2E,0xDD25,0xDD1C,0xDD19, 0,0xDD23,0xDD1F,0xDD1A,0xDD2B,0xDD1E,
+ 0xDDE0,0xDE33,0xDEE6,0xDEFC,0xDEE5,0xDEF8,0xDEF6,0xDEEA,0xDEF2,0xDEED,
+ 0xDEEB,0xDEF0,0xDEF1,0xDFC6,0xDFC8,0xDFCE,0xDFC5, 0,0xDFCB,0xDD13,
+ 0xDD14,0xDD07,0xDD0C,0xDE1A,
+ /* plane 7, row 37 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD87E,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,
+ 1, /* first low-surrogate */
+ 0xDE17,0xDE06,0xDE16,0xDE07,0xDE10,0xDE09,0xDE19,0xDE15,0xDF6E,
+ 0xDF3B,0xDF3E,0xDF6C,0xDF65,0xDF64,0xDF59,0xDF7C,0xDF70,0xDF79,0xDC2C,
+ 0xDC52,0xDC51,0xDC4C,0xDD00,0xDD10,0xDD13,0xDCFF,0xDCFE,0xDCED,0xDE5A,
+ 0xDE58,0xDE5C,0xDEDA,0xDF78,0xDF5E,0xDF67,0xDF64,0xDC13,0xDC23,0xDC41,
+ 0xDC3F,0xDC40,0xDCED,0xDCE3,0xDCEA,0xDCF0,0xDCE6,0xDCE9,0xDCF1,0xDCEE,
+ 0xDDD4,0xDDD1,0xDDDC,0xDDEC,0xDC69,0xDC6D,0xDC57,0xDC66,0xDCF9,0xDC4A,
+ 0xDC60,0xDC56,0xDC59,0xDC4C,0xDC6A,0xDC62,0xDC63,0xDC70,0xDC5F,0xDE0D,
+ 0xDC64,0xDC5D,0xDC68,0xDC9F,0xDEBA,0xDEB8,0xDEBC,0xDEB9,0xDEB4,0xDF3B,
+ 0xDF2D,0xDF38,0xDF2F,0xDF32,0xDC41,0xDCCB,0xDCDE,0xDCDD,0xDCDA,0xDCDC,
+ 0xDD10,0xDD4F,0xDD49,0xDD98,0xDD96,
+ /* plane 7, row 38 */
+ 1 | (94 << 8), /* first, last */
+ 0xD869,0xD869,0xD840,0xD869,0xD869,0xD869,0xD840,0xD840,0xD841,
+ 0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD87E,0xD845,0xD845,0xD845,0xD845,0xD845,0x367E,0x58E1,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,0xD869,0xD846,0xD87E,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD852,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 1, /* first low-surrogate */
+ 0xDD97,0xDDC7,0xDD9C,0xDDDA,0xDDD8,0xDEA8,0xDD0A,0xDD9D,0xDCCB,
+ 0xDD38,0xDD39,0xDDA6,0xDC23,0xDC22,0xDC21,0xDDCE,0xDF92,0xDF91,0xDCEC,
+ 0xDCE0,0xDCED,0xDD08,0xDCE5,0xDCEE,0xDCE4,0xDCEB,0xDCE3,0xDCEA,0xDD0A,
+ 0xDC59,0xDCD1,0xDCE3,0xDCD4,0xDCD0,0xDCD9, 0, 0,0xDCDA,0xDCD3,
+ 0xDD4C,0xDD4D,0xDD7C,0xDD80,0xDDCC,0xDCFF,0xDD08,0xDD08,0xDD01,0xDC6B,
+ 0xDD00,0xDEED,0xDEF3,0xDEEE,0xDEF1,0xDEF0,0xDEDE,0xDF51,0xDF82,0xDFA9,
+ 0xDF98,0xDF9D,0xDF9A,0xDF9E,0xDF9F,0xDFA6,0xDFA7,0xDC09,0xDC2F,0xDD71,
+ 0xDD6D,0xDD72,0xDEEF,0xDEF0,0xDC3B,0xDC39,0xDC3C,0xDC38,0xDFFD,0xDC3A,
+ 0xDC78,0xDC79,0xDC77,0xDD98,0xDD9C,0xDD99,0xDD9A,0xDD11,0xDD0A,0xDCFD,
+ 0xDD0F,0xDD19,0xDD03,0xDD15,0xDD0C,
+ /* plane 7, row 39 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD87E,0xD84A,
+ 0xD84A,0xD84A,0x39A7,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0x4320,0xD858,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD844,0xD841,
+ 0xD851,0xD851,0xD851,0xD851,0xD852,0xD87E,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD853,0xD853,
+ 1, /* first low-surrogate */
+ 0xDD09,0xDD12,0xDD34,0xDD2A,0xDD08,0xDD2D,0xDD28,0xDCB1,0xDD2C,
+ 0xDD26,0xDD33, 0,0xDE1A,0xDE1E,0xDE07,0xDE2C,0xDE32,0xDE28,0xDE31,
+ 0xDE29,0xDE30,0xDE2A,0xDE44,0xDE2E,0xDCD1,0xDD24,0xDEF7,0xDEF4,0xDEF3,
+ 0xDEF8,0xDFB5,0xDF96,0xDF98,0xDF95,0xDF91,0xDFB2,0xDF9E,0xDF59,0xDFA3,
+ 0xDF9A,0xDF9B, 0,0xDD83,0xDEDA,0xDEDF,0xDF16,0xDC1F,0xDC2D,0xDC2E,
+ 0xDC2B,0xDCB8,0xDCBB,0xDCBF,0xDCBA,0xDCD5,0xDCE3,0xDCC1,0xDCBE,0xDCBD,
+ 0xDCB4,0xDCC2,0xDCA1,0xDC87,0xDCD7,0xDCCA,0xDCB5,0xDCDA,0xDCD9,0xDCB3,
+ 0xDCD8,0xDC67,0xDC71,0xDC62,0xDC5C,0xDC68,0xDC52,0xDC56,0xDD09,0xDC42,
+ 0xDDA0,0xDF00,0xDEFE,0xDEFF,0xDCCB,0xDD28,0xDCCA,0xDCA9,0xDCC8,0xDEB4,
+ 0xDEAC,0xDEAA,0xDEA9,0xDC0E,0xDCE9,
+ /* plane 7, row 40 */
+ 1 | (94 << 8), /* first, last */
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD845,0xD855,0xD855,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0x7CE9,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD87E,0xD858,0xD858,
+ 0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,
+ 0xD85A,0xD85A,0x81CB,0xD85A,0xD85A,
+ 1, /* first low-surrogate */
+ 0xDCED,0xDCF2,0xDCEB,0xDCEE,0xDEE8,0xDEDB,0xDED7,0xDEE3,0xDEE5,
+ 0xDEEE,0xDED5,0xDFB3,0xDC2D,0xDCC1,0xDCC3,0xDF0C,0xDF0E,0xDF07,0xDF17,
+ 0xDF09,0xDF16,0xDF9A,0xDF9C,0xDDB4,0xDDB7,0xDDB3,0xDD4E,0xDF13,0xDF14,
+ 0xDCE6,0xDCDC,0xDCE8,0xDCE5,0xDE2E,0xDE2C,0xDE2B,0xDECD,0xDD3D,0xDD32,
+ 0xDD2D,0xDD45,0xDD3E,0xDD50,0xDD25,0xDD53,0xDD23,0xDF37,0xDF38,0xDF47,
+ 0xDF3D,0xDF3E,0xDF49,0xDF4A,0xDF1D, 0,0xDDA5,0xDD8C,0xDD8D,0xDD89,
+ 0xDD96,0xDD85,0xDD8F,0xDD77,0xDD8E,0xDD82,0xDD8A,0xDD88,0xDD7B,0xDD97,
+ 0xDD7D,0xDD79,0xDE59,0xDF24,0xDF2D,0xDF2E,0xDF2B,0xDD76,0xDFDA,0xDFD8,
+ 0xDFD6,0xDC87,0xDCA0,0xDD28,0xDD25,0xDD1F,0xDDF3,0xDDF7,0xDDF6,0xDC2B,
+ 0xDC5B,0xDC48, 0,0xDC5C,0xDC6D,
+ /* plane 7, row 41 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,
+ 0xD85B,0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85B,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0x4565,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,
+ 1, /* first low-surrogate */
+ 0xDC9D,0xDC99,0xDC8C,0xDC91,0xDC9B,0xDC9A,0xDC9C,0xDC95,0xDC8D,
+ 0xDC96,0xDCA5,0xDD2A,0xDDA1,0xDDA4,0xDDAD,0xDEA9,0xDEAE,0xDEB0,0xDC0D,
+ 0xDF63,0xDF71,0xDC51,0xDC54,0xDC2A,0xDC44,0xDC55,0xDC99,0xDC39,0xDC3F,
+ 0xDC3E,0xDC4F,0xDC4D,0xDC35,0xDC40,0xDC31,0xDFD5,0xDC2B,0xDC33,0xDC41,
+ 0xDC56,0xDC4C,0xDC46,0xDC3C,0xDC45,0xDC43,0xDC3D,0xDC70,0xDC57,0xDC38,
+ 0xDC58, 0,0xDC37,0xDE07,0xDE06,0xDE09,0xDCAB,0xDC90,0xDC93,0xDCBC,
+ 0xDCA9,0xDC9E,0xDCBF,0xDCAA,0xDC91,0xDCA4,0xDC9A,0xDCA7,0xDCA1,0xDC9C,
+ 0xDCA2,0xDC9B,0xDC9F,0xDC94,0xDC8F,0xDEF0,0xDC92,0xDC95,0xDCA5,0xDCA6,
+ 0xDE04,0xDF9C,0xDF79,0xDF7A,0xDF7E,0xDF7B,0xDF71,0xDF81,0xDF7F,0xDF7C,
+ 0xDF7D,0xDF75,0xDF76,0xDC8E,0xDC8F,
+ /* plane 7, row 42 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85E,0xD85E,0xD85E,0xD85E,0x4704,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD845,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0x4764,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD860,0xD860,0xD860,0x4823,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD858,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,
+ 1, /* first low-surrogate */
+ 0xDD3E,0xDD3F,0xDD40,0xDD41, 0,0xDF0D,0xDF17,0xDF10,0xDF0E,
+ 0xDEEA,0xDF1D,0xDF03,0xDF22,0xDF04,0xDF00,0xDF20,0xDF21,0xDF23,0xDF13,
+ 0xDF09,0xDF11,0xDFCB,0xDFCE,0xDFD0,0xDFCC,0xDFD4,0xDCDB,0xDC09,0xDC0B,
+ 0xDC85,0xDD06,0xDD0D, 0,0xDD14,0xDD0F,0xDE09,0xDE14,0xDE0B,0xDDFC,
+ 0xDE04,0xDE0A,0xDE00,0xDDFD,0xDE07,0xDE06,0xDE11,0xDE79,0xDE78,0xDF88,
+ 0xDF80,0xDF8B,0xDD59,0xDD61,0xDD75, 0,0xDD55,0xDD5B,0xDD5F,0xDD52,
+ 0xDD62,0xDD72,0xDD5D,0xDD68,0xDD71,0xDD65,0xDD66,0xDD67,0xDD76,0xDD4C,
+ 0xDD60,0xDD74,0xDD50,0xDE8A,0xDE81,0xDE86,0xDE7F,0xDE80,0xDFA5,0xDFA7,
+ 0xDFA8,0xDFA6,0xDFAF,0xDD95,0xDFB1,0xDC35,0xDC39,0xDDC3,0xDE30,0xDE2A,
+ 0xDE2B,0xDE2D,0xDE2E,0xDE2C,0xDE23,
+ /* plane 7, row 43 */
+ 1 | (94 << 8), /* first, last */
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,
+ 0xD863,0xD863,0x95D9,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD854,0xD864,0xD87E,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD842,0xD87E,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,
+ 1, /* first low-surrogate */
+ 0xDE21,0xDE22,0xDF6C,0xDF81,0xDF8F,0xDF80,0xDFD0,0xDFCD,0xDFD5,
+ 0xDFD4,0xDCD1,0xDCBE,0xDCCB,0xDCCE,0xDCBD,0xDCD0,0xDF04,0xDED5,0xDED0,
+ 0xDED3,0xDEFB,0xDED8,0xDED1,0xDEFD,0xDED9,0xDED6,0xDEE6,0xDEF9,0xDDA1,
+ 0xDD9D,0xDD9E, 0,0xDEFF,0xDF5F,0xDF57,0xDF60,0xDF59,0xDC2C,0xDC25,
+ 0xDC27,0xDC30,0xDC24,0xDC26,0xDC2D,0xDC2E,0xDC29,0xDC31,0xDD45,0xDD47,
+ 0xDD52,0xDD4A,0xDD50,0xDD46,0xDD4F,0xDD4E,0xDD53,0xDF21,0xDF09,0xDF1A,
+ 0xDF1B,0xDF15,0xDF10,0xDDF9,0xDF14,0xDF0E,0xDF12,0xDF0B,0xDFCF,0xDFD2,
+ 0xDFD0,0xDFD4,0xDFD3,0xDFD1,0xDF18,0xDDFB,0xDC09,0xDD1C,0xDD27,0xDD25,
+ 0xDD1B,0xDD29,0xDD1F,0xDD30,0xDD24,0xDD28,0xDD19,0xDD2F,0xDE24,0xDE21,
+ 0xDE25,0xDE26,0xDE27,0xDE76,0xDF66,
+ /* plane 7, row 44 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD85C,0xD865,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD869,
+ 1, /* first low-surrogate */
+ 0xDF75,0xDF69,0xDF7E,0xDF8F,0xDF74,0xDE10,0xDFAD,0xDC2B,0xDC2A,
+ 0xDC58,0xDD22,0xDD1D,0xDD2B,0xDD2C,0xDD2D,0xDD33,0xDD1B,0xDD27,0xDD2A,
+ 0xDD28,0xDD3B,0xDE7E,0xDE71,0xDE79,0xDE78,0xDE70,0xDE6D,0xDE7D,0xDE75,
+ 0xDE76,0xDEDE,0xDF66,0xDF83,0xDF87,0xDF7B,0xDF89,0xDF86,0xDF82,0xDF7C,
+ 0xDF81,0xDC43,0xDC45,0xDCF7,0xDCF9,0xDCFA,0xDE05,0xDDFE,0xDE0F,0xDDFF,
+ 0xDDFA,0xDE09,0xDE20,0xDE0C,0xDE3C,0xDE22,0xDDF8,0xDE0A,0xDE08,0xDDF7,
+ 0xDC8E,0xDC77,0xDC8B,0xDCB4,0xDC8A,0xDC9A,0xDC79,0xDC83,0xDC7F,0xDCA1,
+ 0xDC8F,0xDCA3,0xDC81,0xDC94,0xDC7E,0xDC82,0xDC90,0xDCA5,0xDCAD,0xDC9D,
+ 0xDE67,0xDE69,0xDECB,0xDEC8,0xDED1,0xDF40,0xDF4B,0xDF49,0xDF46,0xDF3E,
+ 0xDF43,0xDF3F,0xDFA5,0xDFA7,0xDC4E,
+ /* plane 7, row 45 */
+ 1 | (94 << 8), /* first, last */
+ 0xD869,0xD849,0xD869,0xD869,0xD869,0xD869,0xD869,0xD87E,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD840,0xD841,0xD841,0x34B9,
+ 0xD87E,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD864,0xD846,
+ 0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD841,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84C,0xD866,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,
+ 1, /* first low-surrogate */
+ 0xDC4D,0xDD9B,0xDCE5,0xDCE1,0xDCE2,0xDD16,0xDD14,0xDE1B,0xDD59,
+ 0xDD51,0xDD5F,0xDD4A,0xDD57,0xDD58,0xDDCA,0xDDDB,0xDDDE,0xDDE0,0xDDE1,
+ 0xDDDF,0xDDE2,0xDDE3,0xDE92,0xDEBF,0xDEBE,0xDD0B,0xDC52,0xDC4E, 0,
+ 0xDC13,0xDDA7,0xDC26,0xDC27,0xDCC6,0xDD0B,0xDD6A,0xDD78,0xDD1A,0xDD16,
+ 0xDD19,0xDD17,0xDD1B,0xDD18,0xDD20,0xDE37,0xDCEC,0xDD81,0xDE3D,0xDD0F,
+ 0xDDAD,0xDEFB,0xDF52,0xDFAF,0xDFB7,0xDFB2,0xDD78,0xDDAC,0xDF00,0xDEFE,
+ 0xDF02,0xDEFD,0xDF03,0xDC40,0xDC43,0xDC42,0xDCB7,0xDDA2,0xDD00,0xDD35,
+ 0xDD41,0xDD05,0xDC53,0xDD50,0xDD4E,0xDD53,0xDE53,0xDE50,0xDE57,0xDE5F,
+ 0xDE55,0xDEEA,0xDC26,0xDC30,0xDC2A,0xDC28,0xDC2C,0xDC2D,0xDCD4,0xDF07,
+ 0xDF58,0xDF59,0xDFC5,0xDFCD,0xDFC7,
+ /* plane 7, row 46 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84D,0x3C4B,0xD84E,0xD869,0xD84E,0xD84F,0xD842,0xD87E,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD841,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,
+ 0x40F1,0xD855,0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,
+ 1, /* first low-surrogate */
+ 0xDFE8, 0,0xDD32,0xDE97,0xDEDE,0xDC32,0xDEC8,0xDD15,0xDCF1,
+ 0xDCF0,0xDCEC,0xDD09,0xDCF9,0xDCF5,0xDCFE,0xDC74,0xDC81,0xDC7C,0xDC75,
+ 0xDC89,0xDC82,0xDC97,0xDC86,0xDC7D,0xDC93,0xDC9C,0xDC76,0xDC80,0xDD45,
+ 0xDEA1,0xDF03,0xDCC9,0xDCCD,0xDCD0,0xDEAD,0xDEC5,0xDFA2,0xDCEC,0xDCF6,
+ 0xDCF3,0xDEF3,0xDEFA,0xDEF9,0xDEF5,0xDEF4,0xDEF8,0xDFB6,0xDFB4,0xDC32,
+ 0xDCCD,0xDCC8,0xDCCE,0xDCCA,0xDF2A,0xDF21,0xDF1D,0xDDBD,0xDDBE,0xDDC2,
+ 0,0xDDC9,0xDF1F,0xDCF1,0xDCED,0xDCF2,0xDCE0,0xDCF7,0xDE30,0xDE37,
+ 0xDE31,0xDE36,0xDEC8,0xDD6D,0xDD69,0xDD7D,0xDD61,0xDD70,0xDD71,0xDD73,
+ 0xDD76,0xDD75,0xDD78,0xDD79,0xDD64,0xDD6E,0xDF51,0xDF4F,0xDF22,0xDDAF,
+ 0xDDAA,0xDDA3,0xDD9D,0xDD9C,0xDDA1,
+ /* plane 7, row 47 */
+ 1 | (94 << 8), /* first, last */
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 1, /* first low-surrogate */
+ 0xDDB6,0xDDAC,0xDDA2,0xDDA7,0xDDB0,0xDDA9,0xDDC3,0xDF31,0xDF32,
+ 0xDF33,0xDF34,0xDF37,0xDF3C,0xDFD9,0xDFDD,0xDFDE,0xDFDF,0xDFE0,0xDCA5,
+ 0xDCAA,0xDCA2,0xDCA3,0xDE04,0xDE03,0xDDFE,0xDE28,0xDCAF,0xDCAD,0xDCA6,
+ 0xDDAC,0xDDA5,0xDDB0,0xDDB1,0xDE01,0xDEB2,0xDED2,0xDEF1,0xDFD1,0xDC47,
+ 0xDCC9,0xDCA7,0xDCC8,0xDC95,0xDC8E,0xDC91,0xDC7D,0xDCEE,0xDC8D,0xDC8C,
+ 0xDCB0,0xDC96,0xDC42,0xDC7C,0xDCB1,0xDCB2,0xDC84,0xDC9D,0xDCA1,0xDC98,
+ 0xDCB3,0xDC22,0xDC7B,0xDC8A,0xDCCE,0xDC80,0xDC97,0xDCB4,0xDCB5,0xDC9A,
+ 0xDC9F,0xDC93,0xDE12,0xDE0B,0xDE0E,0xDCA3,0xDCCC,0xDCDC,0xDCE1,0xDCDE,
+ 0xDCD2,0xDCDB,0xDCD9,0xDCD7,0xDCD4,0xDCC9,0xDCEB,0xDCDA,0xDCD1,0xDD04,
+ 0xDCCA,0xDCE2,0xDDD7,0xDF8C,0xDF99,
+ /* plane 7, row 48 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85D,0xD85D,0xD85D,0xD85D,0x4667,0xD85D,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x4714,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD865,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD861,0x4889,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD87E,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD864,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDFA2,0xDF96,0xDF94,0xDF9F, 0,0xDF8E,0xDC03,0xDC94,0xDC93,
+ 0xDD44,0xDF2F,0xDF35,0xDF2B,0xDF32,0xDF2D,0xDF36, 0,0xDF31,0xDF12,
+ 0xDF33,0xDF1F,0xDF34,0xDF40,0xDF3F,0xDF41,0xDFD3,0xDC89,0xDD18,0xDD10,
+ 0xDE1A,0xDE25,0xDE1E,0xDF92,0xDF95,0xDF93,0xDD84,0xDD9A,0xDD89,0xDD8D,
+ 0xDD88,0xDD91,0xDD9B,0xDD9C,0xDD48,0xDE8E,0xDE92,0xDFC5,0xDFC1,0xDFB8,
+ 0xDFBE,0xDFB5,0xDFC7,0xDC3C, 0,0xDDEC,0xDE3F,0xDE39,0xDE37,0xDFA1,
+ 0xDF94,0xDFA0,0xDFDE,0xDFDB,0xDFDF,0xDFDC,0xDCD6,0xDCDC,0xDCDD,0xDCE0,
+ 0xDCE3,0xDCE1,0xDF18,0xDF19,0xDF53,0xDDEC,0xDF44,0xDF0E,0xDF0F,0xDF47,
+ 0xDF17,0xDF1D,0xDF11,0xDCB4,0xDCB6,0xDDB7,0xDDBE,0xDDC2,0xDDB4,0xDF31,
+ 0xDF15,0xDF83,0xDC3B,0xDC36,0xDC42,
+ /* plane 7, row 49 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD863,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0x4C0B,
+ 0xD87E,0xD866,0xD866,0x4C17,0xD867,
+ 1, /* first low-surrogate */
+ 0xDC50,0xDC40,0xDC34,0xDC38,0xDC3D,0xDC3E,0xDC35,0xDC3A,0xDC46,
+ 0xDC37,0xDC39,0xDC45,0xDD77,0xDD5D,0xDD6A,0xDD76,0xDD6B,0xDD6C,0xDD65,
+ 0xDD64,0xDD71,0xDD5F,0xDD72,0xDDFE,0xDDFF,0xDE3E,0xDF2B,0xDF36,0xDF2D,
+ 0xDF39,0xDF3F,0xDF3B,0xDF33,0xDF42,0xDF3A,0xDFD5,0xDFD8,0xDFD9,0xDC0D,
+ 0xDC0A,0xDC39,0xDC3A,0xDD3D,0xDD45,0xDD3A,0xDD37,0xDD3E,0xDD42,0xDF87,
+ 0xDF8C,0xDF82,0xDF6B,0xDFA0,0xDF9A,0xDF90,0xDF8E,0xDFA1,0xDFBD,0xDFB2,
+ 0xDFB5,0xDFB7,0xDFAA,0xDFA2,0xDFA5,0xDFAE,0xDFAB,0xDFBC,0xDC32,0xDC5A,
+ 0xDD64,0xDD5C,0xDD4D,0xDD3F,0xDD3E,0xDD52,0xDD58,0xDD57,0xDD5E,0xDD53,
+ 0xDD54,0xDD56,0xDF65,0xDE84,0xDE85,0xDE86,0xDF97,0xDFA1,0xDFA2, 0,
+ 0xDE0A,0xDFA3,0xDFA6, 0,0xDC15,
+ /* plane 7, row 50 */
+ 1 | (94 << 8), /* first, last */
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD866,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0x4C6D,0xD867,0x4C70,
+ 0xD867,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0x4CED,0xD868,0xD868,0xD87E,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0x4D8D,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0x34A7,0xD841,0xD841,0xD842,0xD842,0xD842,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,
+ 1, /* first low-surrogate */
+ 0xDC24,0xDC4A,0xDC49,0xDC48,0xDC4B,0xDD0E,0xDD62,0xDD0B,0xDD0A,
+ 0xDD08,0xDD06,0xDE43,0xDE47,0xDE3F,0xDE46,0xDE50, 0,0xDE4B, 0,
+ 0xDE52,0xDCD7,0xDCBF,0xDCD8,0xDCE0,0xDCE7,0xDCB8,0xDCD5,0xDCEF,0xDCE6,
+ 0xDCE4,0xDCD4,0xDCD6,0xDCEA, 0,0xDCBB,0xDCE9,0xDE10,0xDE6D,0xDE70,
+ 0xDE73,0xDE72,0xDED4,0xDECE,0xDED5,0xDF5A,0xDF58,0xDF52,0xDF50,0xDF55,
+ 0xDF4E,0xDF4D,0xDFCB,0xDFCC,0xDFCD,0xDFD1,0xDC58,0xDC63,0xDC5E,0xDC54,
+ 0xDC5B,0xDCE9,0xDCE7,0xDCE8,0xDD1D,0xDD67,0xDD5A,0xDD5C,0xDD5B,0xDD61,
+ 0xDDA1, 0,0xDDA4,0xDDE9,0xDDEF,0xDDE5,0xDDF5,0xDDEB,0xDDED,0xDE96,
+ 0xDE95,0xDEB3,0xDEB5,0xDEB1, 0,0xDC4D,0xDE24,0xDC2B,0xDDCF,0xDEC9,
+ 0xDD36,0xDD31,0xDD54,0xDD3A,0xDD38,
+ /* plane 7, row 51 */
+ 1 | (94 << 8), /* first, last */
+ 0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD848,
+ 0xD848,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0x6707,
+ 0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84D,0xD84D,0xD84E,0xD84E,0xD84F,
+ 0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD87E,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD87E,0xD848,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0x3E5A,0xD851,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD87E,0xD854,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDE39,0xDE38,0xDCF4,0xDCF3,0xDCF6,0xDCFC,0xDCF5,0xDCF1,0xDE9C,
+ 0xDD18,0xDD1A,0xDEFC,0xDEFE,0xDF03,0xDF53,0xDD2B,0xDFC6,0xDFC1,0xDD7B,
+ 0xDF06,0xDC49,0xDCB8,0xDDA3,0xDD52,0xDD4D,0xDD5F,0xDD5E,0xDD61,0xDE23,
+ 0xDE8C,0xDE6F,0xDE75,0xDE74,0xDE71,0xDE70,0xDE6C,0xDD26,0xDF08, 0,
+ 0xDFF0,0xDFEF,0xDFFB,0xDC10,0xDC0C,0xDFF6,0xDFFE,0xDE7C,0xDEE1,0xDC38,
+ 0xDC6F,0xDD18,0xDD15,0xDD1C,0xDD10,0xDD35,0xDD17,0xDD17,0xDD1D,0xDD26,
+ 0xDD28,0xDD29,0xDD2A,0xDD1A,0xDD16,0xDF07,0xDCAB,0xDCAC,0xDCA1,0xDCAE,
+ 0xDCA3,0xDCA7,0xDD48,0xDE04,0xDEFD, 0,0xDF08,0xDCD2,0xDEC6,0xDEBE,
+ 0xDF1C,0xDFA6,0xDFA7,0xDFAB,0xDC00,0xDCFB,0xDCFC,0xDCF9,0xDD01,0xDF06,
+ 0xDF04,0xDD3C,0xDC34,0xDF36,0xDF32,
+ /* plane 7, row 52 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,
+ 0xD869,0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x42AF,0xD857,0xD857,0xD857,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD87E,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0x456B,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 1, /* first low-surrogate */
+ 0xDF42,0xDF2D,0xDF35,0xDDD8,0xDF23,0xDF20,0xDD01,0xDD00,0xDD03,
+ 0xDEBC,0xDE3C,0xDE41,0xDE35,0xDEC9,0xDD8E,0xDD9E,0xDD99,0xDDB4,0xDDAA,
+ 0xDD9F,0xDD96,0xDD9D,0xDDC3,0xDD74,0xDDAB, 0,0xDF63,0xDF5B,0xDF5A,
+ 0xDDC5,0xDDC4,0xDDCF,0xDDC8,0xDDA4,0xDDBD,0xDDD3,0xDE60,0xDF3B,0xDFE3,
+ 0xDFE7,0xDCA8,0xDCAC,0xDCA9,0xDD2A,0xDE08,0xDE09,0xDCB9,0xDEC1,0xDEC2,
+ 0xDEB8,0xDCE1,0xDCEB,0xDCE5,0xDCFA,0xDCE4,0xDD0B,0xDCD7,0xDCEF,0xDCE0,
+ 0xDCEC,0xDCFB,0xDDB0,0xDCD3,0xDCE6,0xDCFC,0xDCE3,0xDCCF,0xDCDA,0xDCDC,
+ 0xDCD2,0xDCA4, 0,0xDE17,0xDE16,0xDCF2,0xDCFC,0xDD18,0xDCF6,0xDCFE,
+ 0xDCF3,0xDCF7,0xDD01,0xDCF9,0xDD06,0xDCF5,0xDD10,0xDCDF,0xDD03,0xDD08,
+ 0xDDD8,0xDE05,0xDF97,0xDFB3,0xDFAE,
+ /* plane 7, row 53 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0x471B,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85A,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0x4963,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD852,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDFAF,0xDFA7,0xDFB1,0xDFA8,0xDFAC,0xDFAB,0xDC04,0xDC9A,0xDD4A,
+ 0xDF42,0xDF58,0xDF4B,0xDF45,0xDF49,0xDF4C,0xDF59,0xDF56, 0,0xDF46,
+ 0xDF44,0xDF5B,0xDF69,0xDC8E,0xDC8F,0xDD1E,0xDCBC,0xDE2F,0xDF9E,0xDF9D,
+ 0xDF9F,0xDF9C,0xDDB4,0xDDAE,0xDDAB,0xDDB3,0xDDAF,0xDDC2,0xDE93,0xDE95,
+ 0xDE96,0xDE97,0xDFCF,0xDFCE,0xDFCB,0xDC4B,0xDE46,0xDE43,0xDE45,0xDE51,
+ 0xDFAE,0xDFAF,0xDFB0,0xDFB8,0xDFE2,0xDFE3,0xDFE6,0xDCED,0xDCEA,0xDD3A,
+ 0xDF59,0xDF84,0xDF5F,0xDF7C,0xDF5C,0xDF58,0xDF55,0xDF5D,0xDF7E,0xDF80,
+ 0xDF83,0xDF57, 0,0xDF5E,0xDCBA,0xDDD5,0xDF58,0xDF68,0xDF67,0xDC4A,
+ 0xDC4C,0xDC52,0xDC49,0xDC4E,0xDC47,0xDC4D,0xDC4B,0xDC4F,0xDD7E,0xDD87,
+ 0xDD83,0xDD89,0xDECA,0xDD86,0xDD88,
+ /* plane 7, row 54 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD864,0x4A80,0x4A84,0x4A7F,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0x4AF1,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0x9A47,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,
+ 1, /* first low-surrogate */
+ 0xDE47,0xDE42,0xDE49,0xDE48, 0, 0, 0,0xDF44,0xDF51,
+ 0xDF46,0xDF47,0xDFE4,0xDC0F,0xDC3F,0xDD4B,0xDD57,0xDD52, 0,0xDD51,
+ 0xDD58,0xDD5E,0xDD53,0xDD5D,0xDD4D,0xDE3C,0xDE3F,0xDE46,0xDE3E,0xDE44,
+ 0xDE45,0xDE41,0xDE38,0xDE42,0xDE43,0xDE7A,0xDFA3,0xDFBA,0xDFC0,0xDFC4,
+ 0xDFC6,0xDFCB,0xDC61,0xDD7A,0xDD73,0xDD72,0xDD74,0xDD80,0xDD81, 0,
+ 0xDE95,0xDE8F,0xDE90,0xDE92,0xDE94,0xDE8B,0xDEE6,0xDFB2,0xDFB8,0xDFBD,
+ 0xDFBE,0xDFCE,0xDFBA,0xDC16,0xDC26,0xDC25,0xDC4C,0xDC50,0xDC4E,0xDC51,
+ 0xDC52,0xDD14,0xDD15,0xDD1B,0xDE82,0xDE99,0xDE9A,0xDE7D,0xDE85,0xDE86,
+ 0xDE9C,0xDE79,0xDE7B,0xDE80,0xDE83,0xDE81,0xDD1E,0xDD1B,0xDD2A,0xDCFB,
+ 0xDD05,0xDD20,0xDD11,0xDD04,0xDCFD,
+ /* plane 7, row 55 */
+ 1 | (94 << 8), /* first, last */
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0x4D1C,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0x34A8,0xD841,0xD841,0xD841,0xD842,0xD842,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,
+ 0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,
+ 1, /* first low-surrogate */
+ 0xDD03,0xDD10,0xDD18,0xDD0A,0xDD4E,0xDD09,0xDD07,0xDD1C, 0,
+ 0xDE77,0xDE76,0xDED8,0xDED9,0xDF61,0xDF5C,0xDF5E,0xDF60,0xDFAA,0xDFD6,
+ 0xDFD8,0xDC09,0xDC08,0xDC6B,0xDC65,0xDC73,0xDC74,0xDCED,0xDD24,0xDD25,
+ 0xDD6A,0xDDA7,0xDDA8,0xDE0B,0xDDFA,0xDDF9,0xDDFF,0xDE04,0xDDF6,0xDE05,
+ 0xDE99,0xDEAB,0xDEBD,0xDEB8, 0,0xDC64,0xDC5A,0xDD72,0xDD7A,0xDF95,
+ 0xDD5F,0xDD61,0xDD5E,0xDD5A,0xDD5C,0xDD5D,0xDD6E,0xDD57,0xDD58,0xDD02,
+ 0xDD0B,0xDD08,0xDD51,0xDD25,0xDD28,0xDD23,0xDD21,0xDD24,0xDD29,0xDF06,
+ 0xDF0A,0xDFCA,0xDFCC,0xDFCB,0xDFCF,0xDD7F,0xDD7C,0xDDD6,0xDF09,0xDF0B,
+ 0xDF76,0xDC7D,0xDDA5,0xDD5B,0xDD5C,0xDD5D,0xDD65,0xDE6D,0xDE82,0xDE83,
+ 0xDE87,0xDE95,0xDE8A,0xDCD6,0xDD28,
+ /* plane 7, row 56 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84C,0xD84E,0xD87E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,
+ 0xD853,0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD855,0xD855,0xD855,0xD855,0x418B,0xD856,0xD856,0xD856,0xD856,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x432B,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0x457A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 1, /* first low-surrogate */
+ 0xDF0D,0xDC2E,0xDCEE,0xDC2D,0xDC21,0xDC19,0xDD3B,0xDD3C,0xDD3A,
+ 0xDE7E,0xDC3B,0xDD47,0xDD39,0xDD34,0xDD36,0xDD46,0xDD3B,0xDD41,0xDD45,
+ 0xDCC0,0xDCC4,0xDCBA,0xDCBD,0xDCBE,0xDDA3,0xDF0C,0xDCD9,0xDECD,0xDFAE,
+ 0xDCFF,0xDD24,0xDFBB,0xDFBC,0xDC36,0xDCD5,0xDCD3,0xDCD6,0xDF3C,0xDF3F,
+ 0xDDDE,0xDDE3,0xDF27,0xDF29, 0,0xDD05,0xDD07,0xDD0C,0xDED0,0xDDBE,
+ 0xDDBC,0xDDD0,0xDDC2,0xDDB5,0xDDC9,0xDF66, 0,0xDDD5,0xDDE2,0xDDDC,
+ 0xDDE3,0xDDDA,0xDDC2,0xDDE8,0xDFE9,0xDCAF,0xDCAD,0xDCAE,0xDE0B,0xDCC1,
+ 0xDDB6,0xDDB9,0xDEC0,0xDCA5,0xDD28,0xDD22,0xDD29,0xDD18,0xDD1F,0xDD1C,
+ 0xDD12,0xDD2A, 0,0xDD21,0xDD2B,0xDD17,0xDCF0,0xDD16,0xDD23,0xDD2B,
+ 0xDD26,0xDD3D,0xDD22,0xDD3A,0xDD31,
+ /* plane 7, row 57 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85D,0xD85D,0xD85D,0xD85D,0x4609,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x466D,0xD854,
+ 0xD857,0xD85E,0xD85E,0xD85E,0x471F,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD87E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0x496A,0x496C,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDD32,0xDD54,0xDD21,0xDD35, 0,0xDD2E,0xDD30,0xDD2F,0xDD36,
+ 0xDDDA,0xDDD9,0xDFBB,0xDFBC,0xDFB7,0xDFC2,0xDFBD,0xDFB2, 0,0xDF44,
+ 0xDDD1,0xDF52,0xDF6B,0xDF67, 0,0xDF61,0xDF6C,0xDF51,0xDF74,0xDF77,
+ 0xDF6F,0xDF6D,0xDF68,0xDDD1,0xDF84,0xDC90,0xDC92,0xDC93,0xDD1F,0xDE31,
+ 0xDE38,0xDE39,0xDE37,0xDFAB,0xDDC3,0xDDC8,0xDDCB,0xDDCF,0xDE98,0xDFD4,
+ 0xDFD3,0xDFD8,0xDFD9,0xDFDD,0xDFD1,0xDFD6,0xDC3E,0xDE58,0xDE57,0xDE55,
+ 0xDFC4,0xDFE4,0xDCEE,0xDCEF,0xDCF3,0xDCF2,0xDCF0,0xDFAB,0xDF9A,0xDFAF,
+ 0xDF97, 0, 0,0xDFBF,0xDF94,0xDF93,0xDCBE,0xDCBB,0xDCBC,0xDDD9,
+ 0xDF6C,0xDC53,0xDC54,0xDC5B,0xDC58,0xDC56,0xDC57,0xDD9F,0xDD94,0xDD96,
+ 0xDD97,0xDE4A,0xDE4B,0xDF55,0xDF5A,
+ /* plane 7, row 58 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0x4BB2,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD867,0xD867,0x4C1D,0xD867,0xD867,0xD867,0x4C2D,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD87E,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0x4D45,0xD868,
+ 1, /* first low-surrogate */
+ 0xDF5E,0xDF5F,0xDF59,0xDF5B,0xDF58,0xDF54,0xDFE8,0xDFEB,0xDFEC,
+ 0xDC13,0xDD66,0xDD6B,0xDD62,0xDD69,0xDD63,0xDD5F,0xDD4E,0xDE48,0xDE4A,
+ 0xDFE3,0xDFDB,0xDFD8,0xDFD6,0xDD86,0xDD90,0xDD91,0xDD88,0xDD94,0xDD83,
+ 0,0xDD9C,0xDD8D,0xDD85,0xDE98,0xDE9A,0xDE9C,0xDEE7,0xDFC5,0xDFD0,
+ 0xDFD1,0xDC19,0xDC27, 0,0xDC54,0xDD2D,0xDD22, 0,0xDD1F,0xDEBD,
+ 0xDEAE,0xDEBB,0xDEAD,0xDEBC,0xDEB9,0xDEB4,0xDECB,0xDEB7,0xDEB3,0xDEBA,
+ 0xDEB6,0xDECD,0xDEBE,0xDEC9,0xDE0B,0xDD5F,0xDD3B,0xDD61,0xDD5C,0xDD8A,
+ 0xDD5A,0xDD4D,0xDD46,0xDD44,0xDD3D,0xDD40,0xDD3C,0xDD8C,0xDD41,0xDD4C,
+ 0xDD3E,0xDD4A,0xDE7C,0xDE7A,0xDF65,0xDF6E,0xDF69,0xDF6A,0xDF6F,0xDF6C,
+ 0xDF70,0xDF68,0xDF6B, 0,0xDFAC,
+ /* plane 7, row 59 */
+ 1 | (94 << 8), /* first, last */
+ 0xD868,0xD868,0xD868,0xD851,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD841,0xD842,0xD844,
+ 0xD844,0xD844,0xD844,0xD845,0xD846,0xD848,0xD849,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD868,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD853,0xD853,0xD853,
+ 1, /* first low-surrogate */
+ 0xDFDE,0xDFDD,0xDFDC,0xDCC5,0xDC8C,0xDC83,0xDC82,0xDC88,0xDC85,
+ 0xDC81,0xDCF5,0xDCEF,0xDCF4,0xDCF2,0xDCF6,0xDCF3,0xDCF0,0xDCF1,0xDD2B,
+ 0xDD27,0xDD28,0xDD6C,0xDDAE,0xDE0E,0xDE1B,0xDE16,0xDE1F,0xDE22,0xDE20,
+ 0xDE21,0xDE14,0xDE13,0xDE9D,0xDE9C,0xDE9E,0xDE9F,0xDC6B,0xDCC8,0xDD78,
+ 0xDD76,0xDD70,0xDD71,0xDD0A,0xDD2C,0xDF11,0xDC7E,0xDD57,0xDD66,0xDD69,
+ 0xDD67,0xDD68,0xDD71,0xDD6F,0xDFAE,0xDE8B,0xDE96,0xDC35,0xDC3A,0xDC6B,
+ 0xDF16,0xDC43,0xDC46,0xDC3F,0xDC3B,0xDC3D,0xDDB1,0xDDB2,0xDEE4,0xDC40,
+ 0xDD5D,0xDD51,0xDD4D,0xDD4C,0xDD5B,0xDCD4,0xDCD2,0xDCCA,0xDCC8,0xDCD0,
+ 0xDCC9,0xDD49,0xDDA4,0xDF12,0xDF0F,0xDF11,0xDCDB,0xDCDD,0xDCDC,0xDED4,
+ 0xDF21,0xDFB2,0xDD04,0xDD02,0xDF11,
+ /* plane 7, row 60 */
+ 1 | (94 << 8), /* first, last */
+ 0xD853,0xD853,0xD853,0xD85C,0xD854,0xD854,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD851,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85D,0xD85D,0x460A,0xD85D,0xD85D,0xD85D,0xD85D,0x460C,0xD85D,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD852,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x482E,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,
+ 1, /* first low-surrogate */
+ 0xDF16,0xDF10,0xDFBE,0xDE1A,0xDF4C,0xDF4A,0xDDF2,0xDDF1,0xDF2A,
+ 0xDF2C,0xDF2F,0xDF31,0xDD11,0xDD12,0xDE4B,0xDDDB,0xDDD6,0xDDDD,0xDDE2,
+ 0xDDE4,0xDDE0,0xDDDF,0xDDE3,0xDF6E,0xDF71,0xDDE9,0xDDEA,0xDE63,0xDFEB,
+ 0xDFEA,0xDCBD,0xDCBB,0xDCC6,0xDCCC,0xDCC8,0xDCCF,0xDCC9,0xDCCA,0xDCCF,
+ 0xDCD0,0xDDBA,0xDDFB,0xDE03,0xDEC4,0xDD49,0xDD53,0xDD36,0xDD4A,0xDD41,
+ 0xDD4E,0xDD19,0xDD4D,0xDD45,0xDD4C,0xDD47,0xDD48,0xDD4F,0xDD37,0xDD42,
+ 0xDD4A,0xDD46, 0,0xDD49,0xDD4F,0xDD51,0xDD4C, 0,0xDE06,0xDD51,
+ 0xDF7A,0xDF83,0xDF7E,0xDF7F,0xDF80,0xDFB5,0xDC91,0xDC94,0xDC95,0xDD21,
+ 0xDD20,0xDE3D,0xDE40,0xDE46,0xDE84,0xDFAC,0xDFAD, 0,0xDDDA,0xDDD9,
+ 0xDFE2,0xDFE1,0xDFE3,0xDFE4,0xDFDE,
+ /* plane 7, row 61 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD865,
+ 0xD865,0xD863,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,
+ 1, /* first low-surrogate */
+ 0xDFDF,0xDE41,0xDE59,0xDE5C,0xDE5A,0xDFE8,0xDCF6,0xDCFC,0xDCF7,
+ 0xDCFA,0xDCF9,0xDFC4,0xDFBE,0xDFD2,0xDFBD,0xDF95,0xDFD4,0xDDE4,0xDC61,
+ 0xDC62,0xDC63,0xDC64,0xDC60,0xDC5C,0xDC5D,0xDC5E,0xDDA5,0xDDA6,0xDE4C,
+ 0xDF68,0xDF6E,0xDF71,0xDF6B,0xDF6F,0xDFEE,0xDFF1,0xDFF0,0xDFEF,0xDC15,
+ 0xDC14,0xDF6E,0xDC47,0xDD7C,0xDD7A,0xDD74,0xDD76,0xDD6E,0xDD78,0xDD6D,
+ 0xDD6C,0xDE4E,0xDFD7,0xDFEA,0xDFE5,0xDC64,0xDDB3,0xDDA3,0xDDA5,0xDDA7,
+ 0xDDA2,0xDD9F,0xDDA6,0xDD9E,0xDDA8,0xDEA9,0xDEA6,0xDEAA,0xDEAB,0xDEA0,
+ 0xDEA1,0xDEA8,0xDEE8,0xDEE9,0xDEEA,0xDFE4,0xDFDF,0xDFE0,0xDC28,0xDC5D,
+ 0xDC5B,0xDC56,0xDC57,0xDC5F,0xDC62,0xDEE1,0xDEE3,0xDEDE,0xDED9,0xDEE8,
+ 0xDEF2,0xDEF6,0xDEE6,0xDEF4,0xDEF5,
+ /* plane 7, row 62 */
+ 1 | (94 << 8), /* first, last */
+ 0xD867,0xD867,0x4C8D,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD87E,0xD869,0xD869,0xD842,0xD842,
+ 0xD842,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD846,0xD846,0xD846,
+ 0xD846,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xD84A,
+ 0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84E,0xD84E,
+ 0xD84E,0xD856,0xD87E,0xD84E,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,
+ 0xD852,0xD852,0xD853,0xD853,0xD853,
+ 1, /* first low-surrogate */
+ 0xDEE5,0xDEE2, 0,0xDD96,0xDDAA,0xDD97,0xDD70,0xDDA1,0xDD9D,
+ 0xDDA9,0xDD6F,0xDD7E,0xDD94,0xDD9A,0xDD73,0xDD87,0xDD71,0xDD77,0xDD88,
+ 0xDD8D,0xDD85,0xDD78,0xDDAD,0xDE80,0xDE81,0xDEE5,0xDEE7,0xDF7C,0xDFAF,
+ 0xDFE1,0xDC96,0xDCA3,0xDC90,0xDCF8,0xDD2E,0xDD75,0xDD7E,0xDD7D,0xDD7B,
+ 0xDD78,0xDDB0,0xDE34,0xDE36,0xDE30,0xDE1D,0xDE2E,0xDE37,0xDECE,0xDF97,
+ 0xDF98,0xDD7C,0xDD7E,0xDD7D,0xDD7F,0xDD0F,0xDEA4,0xDD31,0xDD2E,0xDD2F,
+ 0xDD32,0xDD2C,0xDFD4,0xDFDC,0xDFD8,0xDC0E,0xDD83,0xDD84,0xDF12,0xDD72,
+ 0xDD7C,0xDD7E,0xDEA6,0xDEA0,0xDE9E,0xDEA2,0xDD2A,0xDF18,0xDC4D,0xDC58,
+ 0xDC5B,0xDD14,0xDCF2,0xDEE6,0xDD64,0xDD68,0xDD60,0xDD62,0xDCD7,0xDD4B,
+ 0xDCE0,0xDF22,0xDD05,0xDF19,0xDF1A,
+ /* plane 7, row 63 */
+ 1 | (94 << 8), /* first, last */
+ 0xD853,0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD856,0xD856,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x4331,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD87E,0xD85A,
+ 0xD85A,0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDFC3,0xDCD8,0xDCDC,0xDF4F,0xDDF7,0xDDF4,0xDDF8,0xDD13,0xDE50,
+ 0xDDF0,0xDDE9,0xDDEF,0xDDED,0xDDEA,0xDDF8,0xDE05,0xDDF2,0xDF72, 0,
+ 0xDDF9,0xDDF3,0xDDF6,0xDDF2,0xDDF7,0xDE66,0xDE65,0xDF40,0xDD77,0xDCD1,
+ 0xDCD3,0xDE04,0xDD59,0xDD60,0xDD5B,0xDD5D,0xDD5E,0xDD69,0xDD5C,0xDD61,
+ 0xDD6A,0xDD5F,0xDD4E,0xDD5C,0xDD60,0xDD63,0xDDDB,0xDFCA,0xDFC9,0xDFC8,
+ 0xDCA5,0xDCA3,0xDF8E,0xDF87,0xDF89,0xDF85,0xDF86,0xDF8F,0xDF8A,0xDF90,
+ 0xDC98,0xDC9B,0xDE47,0xDE49,0xDE48,0xDDE5,0xDDEA,0xDDED,0xDFF0,0xDFEF,
+ 0xDFF2,0xDFEC,0xDC40,0xDE60,0xDE5F,0xDFEB,0xDFEC,0xDD00,0xDD01,0xDFE2,
+ 0xDFDF,0xDFE0,0xDFE1,0xDFE3,0xDCC3,0xDDEB,0xDDEA,0xDF61,0xDF71,0xDC6B,
+ 0xDC68,0xDC69,0xDC67,0xDDB0,0xDDB1,
+ /* plane 7, row 64 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD866,0xD866,0x4BBC,0x4BBB,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xD867,0xD849,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD842,0xD842,0xD844,0xD846,0xD87E,0xD87E,0xD849,
+ 0xD84C,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD850,0xD850,0xD850,
+ 0xD867,0xD851,0xD851,0xD851,0xD851,
+ 1, /* first low-surrogate */
+ 0xDDB2,0xDE51,0xDF74,0xDD7F,0xDD84,0xDE53,0xDE54,0xDFF0,0xDFF4,
+ 0xDFF1,0xDC37,0xDDBF, 0, 0,0xDDBD,0xDDBE,0xDDB7,0xDDC0,0xDDBA,
+ 0xDDB8,0xDDBC,0xDDBB,0xDEEB,0xDFE7,0xDC1D,0xDC1C,0xDC63,0xDC4B,0xDD38,
+ 0xDD36,0xDD34,0xDD37,0xDF06,0xDF1C,0xDF02,0xDF1D,0xDF1E,0xDEE0,0xDF11,
+ 0xDF18,0xDF21,0xDF20,0xDF10,0xDDBD,0xDDAE,0xDDB5,0xDDB8,0xDDB9,0xDDBE,
+ 0xDDC4,0xDDBC,0xDDBA,0xDE83,0xDEEA,0xDEEC,0xDF7E,0xDF7B,0xDFE5,0xDCA7,
+ 0xDC9E,0xDC9A,0xDD2F,0xDD31,0xDD83,0xDDB5,0xDE46,0xDE41,0xDE43,0xDE3D,
+ 0xDE42,0xDE3B,0xDE47,0xDD6B,0xDDD0,0xDD8E,0xDF11,0xDC71,0xDC89,0xDC4C,
+ 0xDD2B,0xDC4F,0xDC5E,0xDC63,0xDC6B,0xDD3F,0xDEE9,0xDD6D,0xDD6B,0xDD6A,
+ 0xDF2A,0xDCE0,0xDCDD,0xDCE1,0xDCDE,
+ /* plane 7, row 65 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,0xD853,0xD855,0xD869,
+ 0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD858,0xD858,0xD858,0xD85A,0xD851,0xD85A,0xD85A,0xD85A,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85D,0xD85D,0xD853,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD861,0xD863,0xD862,0xD862,0xD863,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0x4C14,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,
+ 1, /* first low-surrogate */
+ 0xDCDC,0xDD4D,0xDF16,0xDCE3,0xDEE5,0xDEE4,0xDF1D,0xDF4B,0xDEC1,
+ 0xDE4E,0xDED6,0xDDFD,0xDE07,0xDDFE,0xDE03,0xDE0B,0xDDFF,0xDF7A,0xDF77,
+ 0xDDFB,0xDF43,0xDFED,0xDDBC,0xDCDF,0xDE05,0xDEC6,0xDEC5,0xDD74,0xDD73,
+ 0xDD72,0xDD78,0xDD73,0xDD7A,0xDF1C,0xDD76,0xDD75,0xDD77,0xDFCF,0xDFCE,
+ 0xDFCD,0xDCA8,0xDF98,0xDF92,0xDF94,0xDC9A,0xDFB4,0xDDEB,0xDDF4,0xDDF3,
+ 0xDDEE,0xDDF2,0xDDF0,0xDE64,0xDC05,0xDFFB,0xDFFC,0xDDF3,0xDC6C,0xDDBA,
+ 0xDF79,0xDF7E,0xDF78,0xDFF4,0xDC16,0xDE57,0xDDC8,0xDDC3,0xDDCE,0xDEB3,
+ 0xDEED,0xDEEE,0xDFF1,0xDFF8, 0,0xDC64,0xDC65,0xDF35,0xDF29,0xDF2C,
+ 0xDF31,0xDF2B,0xDF2E,0xDF25,0xDDDA,0xDDE0,0xDDD4,0xDDE1,0xDDDD,0xDFE7,
+ 0xDC12,0xDCAE,0xDCAF,0xDD86,0xDD85,
+ /* plane 7, row 66 */
+ 1 | (94 << 8), /* first, last */
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD842,0xD842,0xD842,0x361C,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0x3772,0xD848,0xD849,0xD84B,0xD850,0xD851,0xD852,0xD852,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD855,0xD855,
+ 0xD85C,0xD855,0xD856,0xD857,0xD857,0xD87E,0xD858,0xD858,0xD858,0xD85A,
+ 0xD85A,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,
+ 0xD85F,0xD860,0xD860,0xD860,0xD861,0xD861,0xD862,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD864,0xD864,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDDD1,0xDE58,0xDE3F,0xDE52,0xDE4B,0xDE53,0xDE50,0xDE56,0xDE57,
+ 0xDECD,0xDECB,0xDC31,0xDC30,0xDDD1, 0,0xDD92,0xDD90,0xDD8F,0xDD93,
+ 0xDD91, 0,0xDF13,0xDC7F,0xDEAC,0xDD70,0xDCE5,0xDF23,0xDF24,0xDD08,
+ 0xDD07,0xDF1F,0xDF20,0xDF21,0xDCE1,0xDF54,0xDF57,0xDF55,0xDDFA,0xDF38,
+ 0xDD86,0xDF37,0xDE53,0xDF7E,0xDF7B,0xDD71,0xDDFD,0xDDFC,0xDF46,0xDD32,
+ 0xDEC7,0xDD71,0xDD83,0xDD6F,0xDD7E,0xDD7D,0xDD81,0xDD7C,0xDD8A,0xDD7E,
+ 0xDD80,0xDD7D,0xDD7F,0xDD82,0xDFD4,0xDFD0,0xDFD2,0xDD55,0xDF9B,0xDF9A,
+ 0xDE4E,0xDDF1,0xDFF8,0xDFFD,0xDE5E,0xDE66,0xDD05,0xDC0A,0xDC0B,0xDC0E,
+ 0xDC0D,0xDC11,0xDC09,0xDC10,0xDC0C,0xDC12,0xDCC4,0xDDF7,0xDDF8,0xDF6A,
+ 0xDF6B,0xDDC0,0xDDC2,0xDF85,0xDF80,
+ /* plane 7, row 67 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD866,0xD866,0xD866,
+ 0xD866,0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD868,0x4D0E,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,0xD854,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD842,0xD84E,0xD846,0xD846,0xD847,0xD848,0xD848,
+ 0xD848,0xD84B,0xD84E,0xD84E,0xD84E,0xD850,0xD851,0xD852,0xD853,0xD853,
+ 0xD853,0xD855,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD848,0xD860,0xD860,0xD861,0xD862,
+ 0xD862,0xD863,0xD863,0xD863,0xD864,
+ 1, /* first low-surrogate */
+ 0xDF84,0xDF81,0xDDC4,0xDD8B,0xDD8D,0xDD8E,0xDEB7,0xDEB9,0xDEEF,
+ 0xDFFB,0xDFFF,0xDC67,0xDC68,0xDC69,0xDD3F,0xDF3C,0xDF4C,0xDF3D,0xDF3E,
+ 0xDF3F,0xDF3B,0xDDFF, 0,0xDDF6,0xDDEE,0xDDFC,0xDDF8,0xDE01,0xDDFA,
+ 0xDE88,0xDF80,0xDC11,0xDCFE,0xDD00,0xDD35,0xDC3C,0xDDBD,0xDDBB,0xDE5C,
+ 0xDE5A,0xDED1,0xDED0,0xDE0B,0xDC73,0xDD39,0xDF1A,0xDFE3,0xDD87,0xDF77,
+ 0xDF78,0xDEB1,0xDC6A,0xDC74,0xDEEB,0xDD7B,0xDDA5,0xDCE4,0xDD0B,0xDD0E,
+ 0xDD0C,0xDF39,0xDE10,0xDE11,0xDE16,0xDF81,0xDF80,0xDDFE,0xDE01,0xDE00,
+ 0xDF47,0xDFEF,0xDD88,0xDD8B,0xDD8D,0xDD87,0xDD85,0xDD8F,0xDD84,0xDD88,
+ 0xDD8E,0xDD8C,0xDFD7,0xDFD6,0xDF9F,0xDD88,0xDE03,0xDFFE,0xDFEF,0xDD09,
+ 0xDD08,0xDC20,0xDC24,0xDC1F,0xDC70,
+ /* plane 7, row 68 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xD864,0xD864,0xD864,0xD865,0xD865,0xD865,0xD866,0xD866,
+ 0xD866,0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,0xD869,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD842,0xD85E,0xD846,0xD849,0xD84C,
+ 0xD84E,0xD84E,0xD84F,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD853,
+ 0x7674,0xD855,0xD857,0xD858,0xD858,0xD85A,0xD85C,0xD85C,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD860,0xD860,0xD862,
+ 0xD862,0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD866,0xD866,0xD866,0xD866,0x4BEC,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,
+ 1, /* first low-surrogate */
+ 0xDE56,0xDFF7,0xDFF8,0xDFF6,0xDD90,0xDE5E,0xDFF7,0xDDD6,0xDDD5,
+ 0xDEBB,0xDEF0,0xDC01,0xDC6C,0xDD41,0xDD42,0xDF4F,0xDF53,0xDF58,0xDE12,
+ 0xDE04,0xDE13,0xDE05,0xDE0D,0xDF82,0xDF81,0xDCB5,0xDCBA,0xDDBE,0xDE65,
+ 0xDE63,0xDE6E,0xDE6A,0xDE6C,0xDEC4,0xDD6C,0xDFA5,0xDF12,0xDC4D,0xDF1F,
+ 0xDC77,0xDC78,0xDC44,0xDD7C,0xDCEB,0xDCEA,0xDCEC,0xDDA7,0xDF19,0xDF23,
+ 0,0xDE01,0xDE1C,0xDE03,0xDF48,0xDCDA,0xDD91,0xDD92,0xDD96,0xDD97,
+ 0xDD91,0xDD93,0xDFD8,0xDFD5,0xDD57,0xDD58,0xDFA2,0xDE05,0xDFFA,0xDD0C,
+ 0xDD0A,0xDC2E,0xDC29,0xDC2F,0xDCC5,0xDC72,0xDDC8,0xDE5A,0xDE59,0xDF89,
+ 0xDF88,0xDDDB,0xDDD9,0xDDDA,0xDEBC, 0,0xDC06,0xDC05,0xDC6F,0xDC6D,
+ 0xDC70,0xDF60,0xDF5E,0xDF63,0xDF5A,
+ /* plane 7, row 69 */
+ 1 | (94 << 8), /* first, last */
+ 0xD867,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD869,0xD842,
+ 0xD846,0xD848,0xD848,0xD851,0xD852,0xD853,0xD853,0xD855,0xD858,0xD85A,
+ 0xD85A,0xD85A,0xD85C,0xD85D,0xD85D,0xD85E,0xD85E,0xD85F,0xD85F,0xD861,
+ 0xD863,0xD863,0xD864,0xD864,0xD864,0xD865,0xD866,0xD867,0xD867,0xD868,
+ 0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD854,0xD869,0xD845,0xD84E,
+ 0xD850,0x4279,0xD858,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD860,
+ 0xD861,0xD861,0xD861,0xD864,0xD866,0xD867,0xD868,0xD868,0xD869,0xD869,
+ 0xD869,0xD869,0xD869,0xD869,0xD84E,0xD858,0xD85C,0xD85E,0xD862,0xD862,
+ 0xD866,0xD866,0xD866,0xD867,0xD868,
+ 1, /* first low-surrogate */
+ 0xDF5F,0xDE19,0xDE1D,0xDE1B,0xDE22,0xDE1C,0xDE1E,0xDEF7,0xDF84,
+ 0xDC15,0xDCB8,0xDCC1,0xDD01,0xDD0A,0xDDD2,0xDE75,0xDE74,0xDE72,0xDED0,
+ 0xDF1B,0xDC10,0xDF79,0xDCED,0xDFB9,0xDF24,0xDFC5,0xDE03,0xDF4A,0xDCF7,
+ 0xDDC1,0xDDC2,0xDD94,0xDD99,0xDD9A,0xDD5A,0xDFA8,0xDC25,0xDC9E,0xDC41,
+ 0xDC32,0xDC33,0xDDCB,0xDDCA,0xDDCC,0xDD93,0xDDE0,0xDC71,0xDF6B,0xDE2B,
+ 0xDE29,0xDE1A,0xDE26,0xDE27,0xDE2A,0xDEF8,0xDC3D,0xDE76,0xDD18,0xDC7A,
+ 0xDD7F, 0,0xDFF0,0xDD9A,0xDD96,0xDD9E,0xDD9D,0xDDDC,0xDFDA,0xDE0B,
+ 0xDC02,0xDC42,0xDE67,0xDF8B,0xDDE2,0xDF71,0xDE2F,0xDE2E,0xDCC6,0xDD8E,
+ 0xDE7B,0xDE77,0xDE78,0xDE7C,0xDC7C,0xDE07,0xDD97,0xDFD9,0xDD0D,0xDD0E,
+ 0xDDE3,0xDDE4,0xDEF3,0xDC75,0xDE37,
+ /* plane 7, row 70 */
+ 1 | (53 << 8), /* first, last */
+ 0xD868,0xD869,0xD869,0xD869,0xD869,0xD84B,0xD868,0xD863,0xD853,
+ 0xD858,0xD85D,0xD85D,0xD864,0xD864,0xD867,0xD868,0xD869,0xD869,0xD842,
+ 0xD851,0xD853,0xD857,0xD863,0xD864,0xD864,0xD868,0xD842,0xD869,0xD869,
+ 0xD84C,0xD854,0xD864,0xD869,0xD845,0xD85F,0xD866,0xD868,0xD853,0xD868,
+ 0xD869,0xD854,0xD867,0xD867,0xD869,0xD85D,0xD864,0xD845,0xD85E,0xD864,
+ 0xD869,0xD85A,0xD85E,0xD865,
+ 1, /* first low-surrogate */
+ 0xDE35,0xDD8F,0xDE80,0xDE7F,0xDED4,0xDEB4,0xDFEC,0xDF75,0xDD10,
+ 0xDE69,0xDDA4,0xDFDB,0xDDD1,0xDF8D,0xDF76,0xDE39,0xDE84,0xDE82,0xDED2,
+ 0xDCEE,0xDD11,0xDF84,0xDF74,0xDF8F,0xDF8E,0xDE3B,0xDCCB,0xDE88,0xDE86,
+ 0xDF5C,0xDFA4,0xDC75,0xDE8B,0xDD19,0xDC9F,0xDDE5,0xDE40,0xDD12,0xDEFB,
+ 0xDE8C,0xDFA5,0xDC77,0xDC78,0xDED6,0xDFDF,0xDDD2,0xDD1A,0xDFA9,0xDDD3,
+ 0xDCCA,0xDDC4,0xDCB1,0xDE64,
+ /* plane 7, row 71: --- */
+ /* plane 7, row 72: --- */
+ /* plane 7, row 73: --- */
+ /* plane 7, row 74: --- */
+ /* plane 7, row 75: --- */
+ /* plane 7, row 76: --- */
+ /* plane 7, row 77: --- */
+ /* plane 7, row 78: --- */
+ /* plane 7, row 79: --- */
+ /* plane 7, row 80: --- */
+ /* plane 7, row 81: --- */
+ /* plane 7, row 82: --- */
+ /* plane 7, row 83: --- */
+ /* plane 7, row 84: --- */
+ /* plane 7, row 85: --- */
+ /* plane 7, row 86: --- */
+ /* plane 7, row 87: --- */
+ /* plane 7, row 88: --- */
+ /* plane 7, row 89: --- */
+ /* plane 7, row 90: --- */
+ /* plane 7, row 91: --- */
+ /* plane 7, row 92: --- */
+ /* plane 7, row 93: --- */
+ /* plane 7, row 94: --- */
+ /* plane 15, row 1 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0x5301,0xD842,0xD842,0xD87E,
+ 0xD842,0xffff,0xD842,0xD844,0xD845,0xD846,0xD846,0xD848,0xffff,0xD851,
+ 0xD840,0xD840,0xD840,0xD840,0xffff,0xD840,0x3436,0xD840,0xD841,0x434F,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD846,0xD842,0xffff,0x53FA,0xD844,
+ 0xD844,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,0x9F99,0xD846,0xffff,
+ 0xD847,0xD847,0xD847,0xD87E,0xD858,0xffff,0xD848,0xD848,0xD849,0xD84C,
+ 0x6C49,0xD84F,0xD851,0xD851,0x8FB7,0xD845,0x3406,0xffff,0xD840,0xD840,
+ 0xD840,0x4F29,0x343E,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD841,0xD858,0xD841,0xD841,
+ 1, /* first low-surrogate */
+ 0xDC02,0xDC8C,0xDCD4,0xDDA5,0xDC92,0xDC93,0xDCD8,0xDCD9,0xDDA7,
+ 0xDE2B,0xDE2C,0xDE2D,0xDE30,0xDE2E,0xDEAB, 0,0xDD2D,0xDD6D,0xDC34,
+ 0xDE0F, 0,0xDF9D,0xDDA2,0xDDD4,0xDF56,0xDFC3,0xDC14, 0,0xDF1A,
+ 0xDC0F,0xDC10,0xDC9A,0xDC9B, 0,0xDDAC, 0,0xDC97,0xDD46, 0,
+ 0xDD76,0xDD77,0xDDAE,0xDE3A,0xDE7D,0xDFC5,0xDFA8, 0, 0,0xDE41,
+ 0xDE42,0xDDD8,0xDDD9,0xDEAA,0xDEAB,0xDD42,0xDD41, 0,0xDFC6, 0,
+ 0xDD35,0xDD36,0xDD37,0xDC83,0xDF4D, 0,0xDDB5,0xDF17,0xDC82,0xDFB6,
+ 0,0xDC72,0xDD5C,0xDDA8, 0,0xDDE3, 0, 0,0xDCE6,0xDD44,
+ 0xDD45, 0, 0,0xDDC4,0xDDC5,0xDDC6,0xDDC7,0xDDC8,0xDDC9,0xDDCA,
+ 0xDDD4,0xDD7D,0xDE72,0xDDB2,0xDDB4,
+ /* plane 15, row 2 */
+ 1 | (94 << 8), /* first, last */
+ 0xD841,0xD841,0xD841,0xffff,0xD842,0xD842,0xD842,0xD842,0xD87E,
+ 0xD842,0xD840,0x534E,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD844,0xD844,0xD844,0xffff,0xD845,0xD845,0xD845,0xD845,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xffff,0xD846,0xD847,0xD847,0xD847,0x5C81,
+ 0xD848,0xffff,0xD848,0xD848,0xD848,0xD848,0x5F10,0xD849,0xD84A,0x6268,
+ 0xD84A,0xD84C,0xD84C,0xffff,0xD84C,0x6742,0x6740,0x51EA,0xD84E,0xD84E,
+ 0xD84F,0x6C62,0xD84F,0xD850,0xD850,0xD850,0xD851,0xD851,0xffff,0xffff,
+ 0x7391,0xD854,0xD855,0xD855,0xD855,0xffff,0xD859,0xD859,0xD85A,0xD85A,
+ 0xD85A,0x8FBB,0x8FBC,0xffff,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD841,
+ 1, /* first low-surrogate */
+ 0xDE82,0xDEC7,0xDEC8, 0,0xDC3C,0xDC3D,0xDC3E,0xDC3F,0xDC24,
+ 0xDCD3,0xDD47, 0,0xDE3D,0xDEE2,0xDFB8,0xDFB9,0xDFC2,0xDFBA,0xDFC6,
+ 0xDFBB,0xDDAD,0xDE4C,0xDE4D, 0,0xDEB2,0xDEB3,0xDEB4,0xDEB5,0xDDC3,
+ 0xDDC4,0xDDC5,0xDDC6,0xDDC7, 0,0xDFCE,0xDC30,0xDD47,0xDD48, 0,
+ 0xDC5C, 0,0xDC5F,0xDF18,0xDF19,0xDF7E, 0,0xDDB0,0xDE75, 0,
+ 0xDE76,0xDC41,0xDD42, 0,0xDFBD, 0, 0, 0,0xDF1E,0xDF1F,
+ 0xDC87, 0,0xDC78,0xDD88,0xDD89,0xDD8A,0xDE17,0xDE15, 0, 0,
+ 0,0xDCE5,0xDE09,0xDF3B,0xDF4F, 0,0xDE2E,0xDE2F,0xDEFF,0xDEFD,
+ 0xDEFE, 0, 0, 0,0xDC23,0xDCEA,0xDD2A,0xDD49,0xDD4A,0xDD4B,
+ 0xDDDF,0xDDE0,0xDDE1,0xDDE2,0xDDC1,
+ /* plane 15, row 3 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xD840,0xD840,0xD841,0xD840,0xD840,0xffff,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD87E,0xD842,0xffff,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0x3575,0xD842,0xD842,0xD842,0xffff,0xffff,0xD844,0x56E8,0xD844,
+ 0x575B,0xD844,0xD844,0xffff,0xD844,0xffff,0xD844,0xD844,0xD844,0xD87E,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD846,0xffff,0xD846,0xD846,0xD847,0xffff,0xD847,0xD847,0x5C99,0xD847,
+ 0xD847,0xD847,0x5C97,0xD847,0xD847,
+ 1, /* first low-surrogate */
+ 0xDDE3,0xDDE4,0xDDE5,0xDDC0,0xDDE6,0xDDF7, 0,0xDDE7,0xDDE8,
+ 0xDDE9,0xDDEA,0xDDEB,0xDD0E,0xDD80,0xDD81,0xDDBA,0xDDBB,0xDDBC,0xDDBD,
+ 0xDE3F,0xDE40,0xDE88,0xDC1F,0xDC46, 0,0xDC47,0xDC48,0xDD36,0xDD72,
+ 0xDD96,0xDE47,0xDEE7,0xDF34,0xDF35,0xDF36,0xDF37,0xDFE3,0xDFE4,0xDFE5,
+ 0xDFEB, 0,0xDFE6,0xDFE7,0xDFE8, 0, 0,0xDDB9, 0,0xDDBA,
+ 0,0xDE63,0xDE64, 0,0xDE65, 0,0xDE66,0xDE7C,0xDE67,0xDC5A,
+ 0xDD59,0xDDE9,0xDDEA,0xDDEB,0xDDEC,0xDDED,0xDDEE,0xDDEF,0xDEBF,0xDECB,
+ 0xDEC3,0xDED5,0xDEC4,0xDEC5,0xDED3,0xDEC6,0xDEC7,0xDEC8,0xDEC9,0xDECA,
+ 0xDD4A, 0,0xDDD1,0xDF61,0xDC37, 0,0xDD64,0xDD66, 0,0xDD67,
+ 0xDD68,0xDD69, 0,0xDD73,0xDD6A,
+ /* plane 15, row 4 */
+ 1 | (94 << 8), /* first, last */
+ 0xD847,0x6762,0xffff,0xD848,0x383C,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD87E,
+ 0xD849,0xD849,0xD849,0xD84A,0xD84A,0x62A4,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xffff,0xD84A,0xD84A,0xD84A,0xD84C,0xD84C,
+ 0xD84C,0xffff,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD87E,
+ 0xD84C,0x6766,0xD84C,0xD84E,0xD84E,0xD84E,0xffff,0xD84E,0xD84E,0xffff,
+ 0xD84F,0xD87E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0x6CA3,0xD84F,0xffff,0xD850,0xD850,0xD850,0x3DA5,0xffff,
+ 0xD850,0x707F,0xD850,0xD851,0xD851,0xD851,0xffff,0xD851,0xD87E,0xD852,
+ 0xD853,0xD853,0xD853,0xD854,0xD854,
+ 1, /* first low-surrogate */
+ 0xDD6B, 0, 0,0xDC72, 0,0xDDB9,0xDF1C,0xDF36,0xDFBC,
+ 0xDFBE,0xDFBF,0xDFC0,0xDC87,0xDDDC,0xDDDD,0xDDF5,0xDDDE,0xDDDF,0xDC9E,
+ 0xDDE0,0xDDE1,0xDDE2,0xDE2C,0xDE2D, 0,0xDEA9,0xDE9C,0xDE9D,0xDE9E,
+ 0xDE9F,0xDEA0,0xDEA1,0xDEA2, 0,0xDEA3,0xDEA4,0xDEA7,0xDC42,0xDC93,
+ 0xDD51, 0,0xDD52,0xDD44,0xDD53,0xDF22,0xDFC6,0xDFC7,0xDFC9,0xDCDD,
+ 0xDFCA, 0,0xDFC8,0xDF24,0xDF25,0xDF26, 0,0xDF27,0xDF28, 0,
+ 0xDC58,0xDCFB,0xDCA7,0xDC88,0xDC89,0xDCA5,0xDCA8,0xDCA9,0xDCAA,0xDCAB,
+ 0xDCAC,0xDCAD, 0,0xDC79, 0,0xDD94,0xDD95,0xDD96, 0, 0,
+ 0xDD97, 0,0xDD98,0xDD4E,0xDD4F,0xDE19, 0,0xDF41,0xDD2A,0xDCF7,
+ 0xDC04,0xDC19,0xDC17,0xDC40,0xDCEC,
+ /* plane 15, row 5 */
+ 1 | (94 << 8), /* first, last */
+ 0xD855,0xD855,0x77F6,0xD855,0xD855,0xD856,0xD857,0xD858,0xffff,
+ 0xD858,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0x8FC8,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xffff,0x95F5,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xD840,0xffff,0xD845,0xD840,0x4FAB,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0x3453,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD841,0xD841,0x5C2D,0xD841,0xD858,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xffff,0xffff,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD843,0x549C,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xffff,0xD843,0xD843,0xD843,
+ 1, /* first low-surrogate */
+ 0xDC1B,0xDC1C, 0,0xDE0E,0xDF52,0xDED8,0xDE26,0xDE74, 0,
+ 0xDE75,0xDDC6,0xDF0B,0xDF0C,0xDF0D,0xDF0E,0xDF0F,0xDF10, 0,0xDC59,
+ 0xDC5A,0xDE83,0xDE84,0xDE85, 0, 0,0xDE20,0xDE21,0xDE22,0xDE23,
+ 0xDE24,0xDE29,0xDCF4, 0,0xDD8F,0xDD51, 0,0xDE17,0xDE18,0xDE5B,
+ 0xDE19,0xDE1A, 0,0xDE1B,0xDE1C,0xDE1D,0xDE1E,0xDE1F,0xDE20,0xDE21,
+ 0xDC8B,0xDC88, 0,0xDD85,0xDE87,0xDDC7,0xDE4C,0xDE4D,0xDEFC,0xDEFD,
+ 0xDEFE,0xDEFF, 0, 0,0xDC56,0xDC57,0xDC58,0xDC59,0xDCDC,0xDCDD,
+ 0xDD73,0xDD9D,0xDDA1,0xDD9E,0xDD9F,0xDDA0,0xDDE6,0xDE51,0xDE52,0xDF3D,
+ 0xDC22, 0,0xDC23,0xDC24,0xDC25,0xDC26,0xDC27,0xDC28,0xDC29,0xDC2A,
+ 0xDC2B, 0,0xDC40,0xDC2C,0xDC2D,
+ /* plane 15, row 6 */
+ 1 | (94 << 8), /* first, last */
+ 0xD843,0xD843,0xD843,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xffff,0xD844,0xD844,0xD844,0xD844,0xD844,0x5788,
+ 0xD845,0xffff,0xD845,0xD845,0xffff,0xffff,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xffff,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0x34AC,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD87E,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,0xffff,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xffff,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,
+ 1, /* first low-surrogate */
+ 0xDC2E,0xDC2F,0xDC30,0xDDD0,0xDEA8,0xDE94,0xDE95,0xDE96,0xDE97,
+ 0xDE98,0xDE9C,0xDE9B, 0,0xDEA1,0xDEA0,0xDE99,0xDE9A,0xDEA7, 0,
+ 0xDD64, 0,0xDE00,0xDE01, 0, 0,0xDEE5,0xDEE9,0xDEFB,0xDEFC,
+ 0xDEEA,0xDEEB,0xDEEC,0xDEED,0xDEEE,0xDEEF,0xDEFA,0xDEF0,0xDEF1,0xDEF2,
+ 0xDEF3,0xDEF4,0xDD52,0xDD53,0xDD54,0xDD55,0xDD58,0xDD56, 0,0xDDDD,
+ 0xDDDE,0xDDE3,0xDDDF,0xDDE0,0xDF22,0xDF23,0xDF68,0xDFDF, 0,0xDC44,
+ 0xDD94,0xDD95,0xDD96,0xDD97,0xDD98,0xDD99,0xDC79,0xDD9A,0xDD9B,0xDD9D,
+ 0xDD9E,0xDD9F,0xDDA0,0xDFF3,0xDFF2,0xDC1F,0xDC88,0xDD8F,0xDD90, 0,
+ 0xDDFD,0xDDFE,0xDDFF,0xDE00,0xDE01,0xDE1A, 0,0xDDE3,0xDDE4,0xDDE5,
+ 0xDDE6,0xDDE7,0xDDEB,0xDDE8,0xDDE9,
+ /* plane 15, row 7 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0x39DE,0xD84A,0x62C3,0xD84B,0xD84B,0xD84B,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0x6619,0xD84C,0xD84C,0xffff,0xD84D,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0x3B49,0xD84C,0x67A1,0xD84C,0x67A6,0xD84C,
+ 0xffff,0xD84D,0xD84C,0xD84C,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x3C91,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0x3CD3,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xffff,0xD84F,0x3DA9,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,
+ 0xffff,0xD851,0xD851,0xD851,0xD851,
+ 1, /* first low-surrogate */
+ 0xDDEA,0xDE1D,0xDDA4,0xDDA3,0xDED4,0xDEC6,0xDEC7,0xDEC8,0xDEC9,
+ 0xDECA,0xDECB,0xDECC,0xDECD, 0,0xDECE, 0,0xDEB8,0xDEB9,0xDEBA,
+ 0xDC6E,0xDCDB,0xDCDC,0xDD68,0xDD69,0xDD6A,0xDD6B,0xDD6C,0xDD6D,0xDD6E,
+ 0,0xDF24,0xDF25, 0,0xDC00,0xDFE5,0xDFF9,0xDFE7,0xDFE8,0xDFE9,
+ 0xDFFE,0xDFEA,0xDFEB,0xDFEC, 0,0xDFED, 0,0xDFEE, 0,0xDFEF,
+ 0,0xDC17,0xDFF0,0xDFF1,0xDC94,0xDD5B,0xDD5C,0xDD5D,0xDF2F, 0,
+ 0xDF30,0xDF31,0xDF32,0xDF33,0xDCCC,0xDCCD,0xDCCE,0xDCAE,0xDCAF,0xDCB0,
+ 0,0xDCCF,0xDCD0,0xDCD1,0xDCD2,0xDCD3, 0,0xDCD4, 0,0xDDA6,
+ 0xDDA7,0xDDA8,0xDDB0,0xDDA9,0xDDAA,0xDDAB,0xDDAC,0xDDAD,0xDCFB,0xDCFC,
+ 0,0xDE2D,0xDE2E,0xDE50,0xDE2F,
+ /* plane 15, row 8 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xffff,0xD852,0xD853,0xD853,0xD853,0xD853,0xD855,0xD855,0xD855,0xD855,
+ 0x77FE,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD87E,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xffff,0xD857,0xffff,0xD857,
+ 0xD857,0xD858,0x7F57,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0x43D5,0xD859,0xD859,0xffff,0xffff,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD87E,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0x82C5,0xD85A,0xD85C,
+ 0xD85C,0xD85C,0xffff,0xD85C,0xD85C,0xD85D,0xD85F,0xD861,0x8FDF,0xD861,
+ 0xD861,0x8FDC,0x488C,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0x4099,0xD861,0xD861,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDE30,0xDF65,0xDCE6,0xDD0C,0xDD02,0xDD03,0xDD04,0xDD05,0xDD06,
+ 0,0xDFC0,0xDC24,0xDC25,0xDD16,0xDD32,0xDC20,0xDC21,0xDC22,0xDC23,
+ 0,0xDC25,0xDE19,0xDE24,0xDE1A,0xDE1B,0xDE1C,0xDE1D,0xDD52,0xDE1E,
+ 0xDF5A,0xDF5B,0xDF5C,0xDF5D,0xDF5E,0xDD31, 0,0xDE29, 0,0xDF88,
+ 0xDF89,0xDE89, 0,0xDF56,0xDCD1,0xDCE6,0xDD32,0xDD33,0xDE52,0xDE53,
+ 0,0xDE54,0xDE55, 0, 0,0xDF29,0xDF2A,0xDF2B,0xDF2C,0xDF2D,
+ 0xDD92,0xDF2E,0xDF2F,0xDF30,0xDF31,0xDF32,0xDF33, 0,0xDF34,0xDD9B,
+ 0xDE23,0xDE24, 0,0xDE25,0xDE27,0xDE16,0xDCA0,0xDC6F, 0,0xDC70,
+ 0xDC71, 0, 0,0xDC72,0xDC73,0xDC74,0xDE9C,0xDEAA,0xDE9D,0xDE9E,
+ 0,0xDEAB,0xDE9F,0xDE35,0xDE38,
+ /* plane 15, row 9 */
+ 1 | (94 << 8), /* first, last */
+ 0xD868,0xD840,0xD840,0xD856,0xD840,0xD869,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0x4FE4,0xD840,0xD840,0xffff,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD858,0xD841,0xffff,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xffff,0xD842,0xD842,0xD842,0xD840,0xD842,
+ 0xD842,0xD843,0x551B,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0x3588,0xffff,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD844,0xD844,0x57AA,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0x57AB,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD845,
+ 1, /* first low-surrogate */
+ 0xDF8D,0xDC35,0xDC36,0xDEEE,0xDCB4,0xDEC9,0xDD32,0xDD55,0xDE44,
+ 0xDE45,0xDE46,0xDE47, 0,0xDE48,0xDE49, 0,0xDE4A,0xDE4B,0xDE4C,
+ 0xDE4D,0xDE4E,0xDE4F,0xDE50,0xDE51,0xDE99,0xDDD1, 0,0xDDD2,0xDDD3,
+ 0xDDD4,0xDDD5,0xDF21,0xDF22,0xDF23,0xDC68,0xDC69,0xDC6A,0xDCE2,0xDD45,
+ 0xDDEC,0xDDED,0xDDEE,0xDDEF, 0,0xDE62,0xDE63,0xDEF4,0xDC6F,0xDF44,
+ 0xDF45,0xDC79, 0,0xDC7A,0xDC7B,0xDC7C,0xDC7D,0xDC7E,0xDC7F,0xDC80,
+ 0, 0,0xDC81,0xDC82,0xDC83,0xDC84,0xDC85,0xDC86,0xDC87,0xDC8F,
+ 0xDC88,0xDC89,0xDEC5,0xDEC6, 0,0xDEC7,0xDEC8,0xDEC9,0xDECA,0xDECB,
+ 0xDECC, 0,0xDECD,0xDECE,0xDEE3,0xDECF,0xDED0,0xDED1,0xDED2,0xDED3,
+ 0xDEC4,0xDED4,0xDED5,0xDED6,0xDD20,
+ /* plane 15, row 10 */
+ 1 | (94 << 8), /* first, last */
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0x36C9,0xD87E,0xffff,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD846,0xD846,0xD846,0xD846,0x5BA9,0xD846,0xD846,0xD846,0xD846,
+ 0x3917,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD85A,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD85A,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD87E,0xD849,0xD849,0xffff,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD87E,0xD849,0xD849,0xffff,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 1, /* first low-surrogate */
+ 0xDD21,0xDE1A,0xDE12,0xDE14,0xDE15,0xDE16,0xDE19,0xDE17,0xDE18,
+ 0,0xDC61, 0,0xDF12,0xDF13,0xDF14,0xDF15,0xDF16,0xDF17,0xDF18,
+ 0xDF19,0xDD61,0xDD62,0xDD63,0xDDF5, 0,0xDDF6,0xDDF7,0xDDF8,0xDF29,
+ 0,0xDC5D,0xDC57,0xDC58,0xDC59,0xDC5A,0xDC5B,0xDDBB,0xDDD1,0xDDBC,
+ 0xDDBD,0xDCDF,0xDDD0,0xDDBE,0xDDBF,0xDDC0,0xDDC1,0xDDC2,0xDDC3,0xDDC4,
+ 0xDF6C,0xDCA1,0xDCA2,0xDCA3,0xDD93,0xDE0D,0xDE0F,0xDE0E,0xDE10,0xDE11,
+ 0xDE12,0xDC95,0xDCE5,0xDE2F, 0,0xDE57,0xDE30,0xDE68,0xDE2B,0xDE31,
+ 0xDE58,0xDCA2,0xDE32,0xDE59, 0,0xDE5A,0xDE33,0xDE5B,0xDE5C,0xDE5D,
+ 0xDE1E,0xDDAE,0xDDAF,0xDE3B,0xDE3C,0xDE3D,0xDF07,0xDF08,0xDF09,0xDF0A,
+ 0xDF0B,0xDF0C,0xDF0D,0xDF0E,0xDF0F,
+ /* plane 15, row 11 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD87E,0xffff,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD843,
+ 0xffff,0xD84C,0xD84C,0xD84C,0xD87E,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,
+ 0xffff,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0x6811,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0x7551,0xD850,0xD850,0xD850,0xD850,
+ 1, /* first low-surrogate */
+ 0xDF10,0xDF22,0xDF11,0xDF12,0xDF13,0xDF14,0xDF15,0xDF16,0xDF17,
+ 0xDF18,0xDCB8, 0,0xDC46,0xDC47,0xDC48,0xDCE1,0xDD81,0xDD83,0xDC75,
+ 0,0xDD85,0xDD86,0xDF2A,0xDCD1,0xDF2B,0xDF6B,0xDC18,0xDC19,0xDC1A,
+ 0,0xDC1B,0xDC1C,0xDC1D,0xDC1E,0xDC1F,0xDC20,0xDC21,0xDC22,0xDC23,
+ 0,0xDC24,0xDC25,0xDC26,0xDC27,0xDC28,0xDC29,0xDC2A,0xDDEF,0xDF49,
+ 0xDF4A,0xDF4B,0xDF4C,0xDF4D,0xDF4E,0xDF4F,0xDF50,0xDF51,0xDF52,0xDF53,
+ 0xDF54,0xDF5A,0xDF55,0xDC5F,0xDD02,0xDD03,0xDD04,0xDD05,0xDCD5,0xDD06,
+ 0xDD07,0xDCD6,0xDD08,0xDD09,0xDD0A,0xDD0B,0xDCD7,0xDD0C,0xDD0D,0xDDC8,
+ 0xDDC9,0xDDCA,0xDDCB,0xDDCC,0xDDCD,0xDDCE,0xDDCF,0xDDD0,0xDDD1,0xDDD2,
+ 0,0xDDD3,0xDDD4,0xDDD5,0xDDD6,
+ /* plane 15, row 12 */
+ 1 | (94 << 8), /* first, last */
+ 0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xffff,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,0x3EBD,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD87E,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xffff,0xD852,0xD852,0xD852,0xD853,0xD853,
+ 0xD853,0xD853,0x7553,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD854,0xD854,0xD87E,0xD854,0xD855,0xD855,0xD855,
+ 0x7818,0xD855,0xD855,0xD855,0xD855,0xD855,0xffff,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0x4133,0xD855,0xD855,
+ 0xD855,0xD856,0xD856,0xD856,0xD856,0xffff,0x7AD7,0xD84E,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD857,
+ 1, /* first low-surrogate */
+ 0xDDD7,0xDDE2,0xDDD8,0xDD04,0xDD05,0xDD06, 0,0xDE43,0xDE44,
+ 0xDF84,0xDF8F,0xDF85,0xDF86,0xDD2F,0xDD1A,0xDD1B,0xDD1C, 0,0xDD1D,
+ 0xDD1E,0xDD1F,0xDD20,0xDD21,0xDD22,0xDD2C,0xDD23,0xDD24,0xDD0E,0xDD25,
+ 0xDD2B,0xDD2C,0xDD0B,0xDEEE, 0,0xDFC3,0xDFD8,0xDFD9,0xDC38,0xDC39,
+ 0xDC3A,0xDC3B, 0,0xDC3C,0xDC3D,0xDC3E,0xDC3F,0xDC40,0xDD48,0xDD4C,
+ 0xDF28,0xDF51,0xDF52,0xDC4C,0xDD23,0xDD45,0xDD24,0xDC31,0xDC32,0xDC33,
+ 0,0xDC34,0xDC35,0xDC36,0xDC40,0xDC37, 0,0xDC38,0xDC3D,0xDE38,
+ 0xDE39,0xDE3A,0xDE3B,0xDE3C,0xDE4C,0xDF73,0xDF74, 0,0xDF75,0xDF76,
+ 0xDF79,0xDD41,0xDD42,0xDD43,0xDE5B, 0, 0,0xDCA6,0xDE5C,0xDEE5,
+ 0xDEE6,0xDEE7,0xDEE8,0xDEED,0xDE30,
+ /* plane 15, row 13 */
+ 1 | (94 << 8), /* first, last */
+ 0x7C7E,0xD857,0xD857,0xD858,0xD858,0xD858,0xD859,0xffff,0xD859,
+ 0xD859,0xD859,0xffff,0xD859,0xffff,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,
+ 0x867E,0xD85C,0xffff,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xffff,
+ 0xD85D,0xD85D,0xD85F,0xD85F,0xffff,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD860,0x4844,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD863,
+ 0xD863,0xD863,0xD864,0xffff,0xD840,0xD840,0xD840,0xD840,0xD840,0xffff,
+ 0xD840,0xD840,0xD87E,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD841,0xD841,
+ 2, /* first low-surrogate */
+ 0xDE31,0xDF94,0xDF51,0xDFFD,0xDFFE,0xDCE9, 0,0xDEB3,
+ 0xDE84,0xDE94, 0,0xDE9C, 0,0xDE85,0xDD00,0xDD37,0xDD57,0xDF54,
+ 0xDF68,0xDF55,0xDF5C,0xDF56,0xDF57,0xDF58,0xDF59,0xDF5A,0xDF5B,0xDE34,
+ 0,0xDE35, 0,0xDE39,0xDE36,0xDE37,0xDE38,0xDDE5,0xDE59, 0,
+ 0xDE3A,0xDE3B,0xDD28,0xDE89, 0,0xDE8A,0xDE8B,0xDE8C,0xDE8D,0xDFBC,
+ 0xDEA3, 0,0xDEA4,0xDC93,0xDC94,0xDC95,0xDC96,0xDC97,0xDEB9,0xDE4F,
+ 0xDE50,0xDE51,0xDC76, 0,0xDCFB,0xDC83,0xDD38,0xDD5D,0xDE71, 0,
+ 0xDE77,0xDE78,0xDC07,0xDEC3,0xDE79,0xDE7A,0xDE7B,0xDE7C,0xDE72,0xDE7D,
+ 0xDEA0,0xDE7E,0xDE7F,0xDE80,0xDE81,0xDE82,0xDE83,0xDE9E,0xDE84,0xDE85,
+ 0xDE86,0xDE87,0xDE88,0xDC93,0xDC94,
+ /* plane 15, row 14 */
+ 1 | (94 << 8), /* first, last */
+ 0xD841,0xD841,0xD841,0xffff,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0x5266,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD843,0xD843,0x5520,0xD843,0xD843,0xD843,0xffff,0xffff,
+ 0xD843,0xD843,0x5521,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0x57D7,0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xffff,0x36E1,0xD845,0xD87E,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0x36E2,0xD845,
+ 0xD846,0xD846,0xD846,0xD846,0x5BBE,
+ 1, /* first low-surrogate */
+ 0xDC95,0xDCEF,0xDCF0, 0,0xDD8D,0xDD8F,0xDD90,0xDD91,0xDD92,
+ 0xDDDE,0xDDE1,0xDE53, 0,0xDF4A,0xDF4B,0xDF4C,0xDF51,0xDF4D,0xDF48,
+ 0xDC74,0xDC75,0xDD20,0xDD21,0xDDA5,0xDDA6,0xDE73,0xDE74,0xDF50,0xDF51,
+ 0xDF52,0xDF53,0xDCDB,0xDCDC, 0,0xDCDD,0xDCDE,0xDCFF, 0, 0,
+ 0xDCDF,0xDCE0, 0,0xDCE1,0xDCE2,0xDCE3,0xDCE4,0xDCE5,0xDCE6,0xDCE7,
+ 0xDCE8,0xDCE9,0xDCEA,0xDF07,0xDF08,0xDF09,0xDF0A,0xDF0B,0xDF0C,0xDF0D,
+ 0,0xDF1A,0xDF0E,0xDF0F,0xDF10,0xDF1C,0xDD27,0xDD66,0xDD98,0xDD99,
+ 0xDE33,0xDE24,0xDE25,0xDE26, 0, 0,0xDF3E,0xDC64,0xDF3F,0xDF57,
+ 0xDF40,0xDF41,0xDF58,0xDF42,0xDF43,0xDF44,0xDF45,0xDF46, 0,0xDF47,
+ 0xDD6B,0xDD6C,0xDE10,0xDE11,
+ /* plane 15, row 15 */
+ 1 | (94 << 8), /* first, last */
+ 0xD846,0xD846,0xD847,0xD847,0xffff,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD848,0xD848,0xD848,0xD848,0x387C,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0x38E3,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xffff,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xffff,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xffff,0xD84A,0xD84A,0xD84A,0xD859,0xD859,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0x3AEC,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 1, /* first low-surrogate */
+ 0xDF75,0xDFEF,0xDC6A,0xDC6B, 0,0xDC6C,0xDC6D,0xDC6E,0xDDEF,
+ 0xDDF0,0xDDF1,0xDDF2,0xDDF3,0xDDF4,0xDDF5,0xDDFF,0xDDF6,0xDE02,0xDDF7,
+ 0xDC22,0xDCC4,0xDCC3,0xDE28, 0,0xDF20,0xDF25,0xDF22,0xDF23,0xDFEB,
+ 0,0xDCF9,0xDCFA,0xDE99,0xDE9A,0xDE9B,0xDE63, 0,0xDE5E,0xDE5F,
+ 0xDE60,0xDE9C,0xDE61,0xDE9D,0xDF54,0xDF55,0xDF56,0xDF57,0xDF58,0xDF59,
+ 0xDF5A,0xDF19,0xDF6A,0xDF5B,0xDF5C,0xDF5D,0xDF66, 0,0xDF5E,0xDF5F,
+ 0xDF1A,0xDF60,0xDF61, 0,0xDF62,0xDF1B,0xDF63,0xDC10,0xDC11,0xDC4C,
+ 0xDC9B,0xDCEB,0xDCEC,0xDCED,0xDCEE,0xDDA3,0xDDA8,0xDDA6, 0,0xDF2F,
+ 0xDF30,0xDF31,0xDF32,0xDF33,0xDC4F,0xDC51,0xDC52,0xDC7D,0xDC53,0xDC54,
+ 0xDC55,0xDC56,0xDC57,0xDC58,0xDC59,
+ /* plane 15, row 16 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84D,0xD84D,0xD84D,0x6857,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xffff,0xD84D,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xffff,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0x3CDF,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,
+ 0xffff,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,
+ 1, /* first low-surrogate */
+ 0xDC5A,0xDC5B,0xDC5C, 0,0xDC5D,0xDC5E,0xDC5F,0xDC6F,0xDC60,
+ 0xDC61,0xDC62,0xDC63,0xDC72,0xDC64, 0,0xDC6E,0xDCB5,0xDF65,0xDF66,
+ 0xDF67,0xDF68,0xDF69,0xDF6A,0xDF6B,0xDF6C,0xDD0E,0xDD43, 0,0xDD0F,
+ 0xDD44,0xDD45,0xDD46,0xDD47,0xDD48,0xDD49,0xDD10,0xDD4A,0xDD4B,0xDD4C,
+ 0xDD4D, 0,0xDD4E,0xDD4F,0xDD50,0xDD51,0xDD52,0xDD53,0xDD54,0xDD55,
+ 0xDD56,0xDD57,0xDD58,0xDD59,0xDD5A,0xDD1D,0xDD5B,0xDD5C,0xDD5D,0xDD06,
+ 0,0xDDFE,0xDDFF,0xDE00,0xDE01,0xDE02,0xDE03,0xDE04,0xDE05,0xDE06,
+ 0xDE07,0xDE18,0xDE08,0xDE09,0xDDF3,0xDE0A,0xDE0B,0xDE1B,0xDE0C,0xDE0D,
+ 0xDE0E,0xDE0F,0xDE10,0xDD0F,0xDD61,0xDD79,0xDFC1,0xDFAC,0xDFAD,0xDD43,
+ 0xDD44,0xDD45,0xDD46,0xDD47,0xDD48,
+ /* plane 15, row 17 */
+ 1 | (94 << 8), /* first, last */
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0x3EC7,0xD87E,0xD852,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xffff,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD855,0xD854,0xD854,0xD855,0xD855,0xD855,0xffff,0xD855,0xD855,0xffff,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xffff,0xD856,0xD856,0xD856,0xffff,
+ 0xD856,0xD856,0xD856,0xD856,0xffff,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xffff,
+ 0xffff,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x7F3C,0xD858,
+ 0xD858,0xD858,0xD859,0xffff,0xD859,
+ 1, /* first low-surrogate */
+ 0xDD49,0xDD64,0xDD4A,0xDD4B,0xDD4C,0xDD4D, 0,0xDD2D,0xDF39,
+ 0xDC57,0xDC58,0xDC59,0xDC5F,0xDC5A,0xDD6A,0xDF2B,0xDF5D,0xDF5E,0xDF5F,
+ 0,0xDF60,0xDF61,0xDC58,0xDC59,0xDD4A,0xDD4B,0xDD4C,0xDD4D,0xDD4E,
+ 0xDC57,0xDFB3,0xDFB4,0xDC6E,0xDC5B,0xDC5C, 0,0xDC5D,0xDC5E, 0,
+ 0xDC6C,0xDE3D,0xDE54,0xDE3E,0xDE55,0xDE56,0xDE3F,0xDE57,0xDE58,0xDE59,
+ 0xDE5A,0xDE5B,0xDE5C,0xDF88,0xDF89, 0,0xDD58,0xDD59,0xDD5A, 0,
+ 0xDE67,0xDE68,0xDE69,0xDE6A, 0,0xDE6B,0xDE6C,0xDEFE,0xDEFF,0xDF00,
+ 0xDF01,0xDF02,0xDF03,0xDF04,0xDF05,0xDE39,0xDE3A,0xDE3B,0xDE3C, 0,
+ 0,0xDFB2,0xDFB3,0xDFB4,0xDFB5,0xDFB6,0xDFB7,0xDFB8, 0,0xDEA2,
+ 0xDF61,0xDF62,0xDC14, 0,0xDCEB,
+ /* plane 15, row 18 */
+ 1 | (94 << 8), /* first, last */
+ 0xD859,0xD859,0xffff,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xffff,0xffff,0xffff,0xD859,0xffff,0xD85A,0xD85A,0xffff,0x8273,0xD85A,
+ 0xffff,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD87E,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xffff,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xffff,0xD85C,0xD85C,0xD85D,0x4627,
+ 0xD85D,0xD85E,0xffff,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0x96BE,
+ 0xD864,0xD866,0xD840,0x66FA,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,
+ 1, /* first low-surrogate */
+ 0xDD42,0xDD48, 0,0xDD43,0xDD4E,0xDD44,0xDD45,0xDEB4,0xDEB5,
+ 0, 0, 0,0xDEB6, 0,0xDCE1,0xDD05, 0, 0,0xDF9A,
+ 0,0xDF9B,0xDF9C,0xDF9D,0xDF9E,0xDF9F,0xDD9A,0xDFA0,0xDFA1,0xDFA2,
+ 0xDFB5,0xDFA3,0xDFA4, 0,0xDFA5,0xDFA6,0xDFA7,0xDFA8,0xDFAF,0xDFA9,
+ 0xDFAA,0xDFAB,0xDFAC,0xDFAD,0xDFB3, 0,0xDDA0,0xDE56,0xDE34, 0,
+ 0xDE3C,0xDC0C, 0,0xDC3E,0xDCA3,0xDD30,0xDD31,0xDE97,0xDE98,0xDE99,
+ 0xDE9A,0xDE9B,0xDEB2,0xDEAB,0xDEAC,0xDEFC,0xDEE8,0xDEE9,0xDEEA,0xDFF1,
+ 0xDD3F,0xDCCE,0xDE6D,0xDE6E,0xDE6F,0xDE70,0xDE71,0xDE72,0xDE73, 0,
+ 0xDC78,0xDC3A,0xDD67, 0,0xDD64,0xDD65,0xDF07,0xDEC4,0xDEC5,0xDEC6,
+ 0xDEC7,0xDEC8,0xDEC9,0xDEE5,0xDECA,
+ /* plane 15, row 19 */
+ 1 | (94 << 8), /* first, last */
+ 0xD840,0xffff,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xffff,0xD841,0xD842,0xD842,0xD842,0xD842,0xD861,0xD842,
+ 0xD842,0xD843,0xD843,0xD843,0xD843,0x35AB,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xffff,0xffff,0xD843,0xD843,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0x364B,0xD844,0xD844,0xD844,0xD844,
+ 0xffff,0xffff,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,0xD845,
+ 0xD846,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0x5A72,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,
+ 1, /* first low-surrogate */
+ 0xDECB, 0,0xDECC,0xDECD,0xDECE,0xDECF,0xDED0,0xDC97,0xDC9A,
+ 0xDC9B,0xDDEA,0xDDEC,0xDDED,0xDDF7,0xDDEE,0xDDEF,0xDE5B,0xDE5C,0xDE5D,
+ 0xDF6D,0xDF6E, 0,0xDF6F,0xDC81,0xDC82,0xDD4F,0xDDAD,0xDF0A,0xDE7E,
+ 0xDF69,0xDD54,0xDD55,0xDD56,0xDD57, 0,0xDD58,0xDD59,0xDD5A,0xDD5B,
+ 0xDD5C,0xDD5D, 0, 0,0xDD5E,0xDD5F,0xDF3B,0xDF36,0xDF3C,0xDF3D,
+ 0xDF3E,0xDF3F,0xDF40,0xDF41,0xDF42, 0,0xDF43,0xDF44,0xDF45,0xDF37,
+ 0, 0,0xDF46,0xDF47,0xDF48,0xDF49,0xDD2D,0xDDA5,0xDE3D,0xDE3F,
+ 0xDD6E,0xDFE7,0xDF75,0xDF76,0xDF77,0xDF78,0xDF79,0xDF7A,0xDF7B,0xDF7C,
+ 0xDF8E,0xDF7D,0xDF7E, 0,0xDF7F,0xDF80,0xDF81,0xDF82,0xDF83,0xDF84,
+ 0xDF85,0xDF86,0xDF87,0xDF88,0xDF89,
+ /* plane 15, row 20 */
+ 1 | (94 << 8), /* first, last */
+ 0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,
+ 0xffff,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0x37E2,0xD847,0xD847,0xD847,0xD847,0xD847,0xffff,0xD847,0xD847,
+ 0xD847,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,0xD849,0xffff,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD84A,0xD84A,0xffff,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 1, /* first low-surrogate */
+ 0xDF8A,0xDF8B,0xDF8C,0xDD6F,0xDD70,0xDD71,0xDD72,0xDE2A,0xDE2B,
+ 0xDE2C,0xDE2D,0xDE2E,0xDE2F,0xDE30,0xDE31,0xDF83,0xDC84,0xDC85,0xDC93,
+ 0,0xDC86,0xDC87,0xDC88,0xDC89,0xDC8A,0xDC8B,0xDE36,0xDE38,0xDE39,
+ 0xDE3A, 0,0xDE3B,0xDE3C,0xDE3D,0xDE3E,0xDE3F, 0,0xDE40,0xDE41,
+ 0xDE42,0xDCDE,0xDCDF,0xDCE0,0xDCE1,0xDE4A,0xDE4B,0xDE4C,0xDE4D,0xDE4E,
+ 0xDE4F,0xDE50,0xDF27,0xDFF9,0xDFFA,0xDFFB,0xDC98,0xDC99,0xDC9A, 0,
+ 0xDD1E,0xDE9E,0xDEF7,0xDE9F,0xDEA0,0xDEF0,0xDEF8,0xDEF9,0xDEA1,0xDEA2,
+ 0xDEA3,0xDEA4,0xDEA5,0xDEFA,0xDEFB,0xDEFC,0xDEFD,0xDEFE,0xDF1F,0xDEFF,
+ 0xDF00,0xDF8C,0xDF01,0xDDC2,0xDDC3, 0,0xDDD3,0xDE4E,0xDFAF,0xDFB0,
+ 0xDFB1,0xDFB2,0xDFB3,0xDFC6,0xDFB4,
+ /* plane 15, row 21 */
+ 2 | (94 << 8), /* first, last */
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xffff,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x68BD,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xffff,0xD84D,
+ 0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD87E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,
+ 2, /* first low-surrogate */
+ 0xDFB5,0xDFB6,0xDFB7,0xDFB8,0xDFB9,0xDFBA,0xDFBB,0xDFBC,
+ 0xDFBD,0xDFBE,0xDFBF,0xDFC1,0xDFC0,0xDFC2,0xDFC3,0xDF51,0xDF52,0xDF53,
+ 0xDF54,0xDF55,0xDC5A,0xDC50,0xDC51,0xDC78,0xDCF8,0xDCF9,0xDDC6,0xDDCB,
+ 0xDDCC,0xDDCD,0xDDCE,0xDDCF,0xDDD0,0xDDD1,0xDDD2,0xDDD3,0xDDD4,0xDDD5,
+ 0,0xDF37,0xDF38,0xDF73,0xDC90,0xDC91,0xDCBF,0xDC92,0xDC93,0xDC94,
+ 0xDC95,0xDC96,0xDC97,0xDC98,0xDC99, 0,0xDC9A,0xDC9B,0xDC9C,0xDC9D,
+ 0xDC9E,0xDC9F,0xDCA0,0xDCA1,0xDCA2,0xDCA3,0xDCA4,0xDCA5, 0,0xDCA6,
+ 0xDCA7,0xDCBF,0xDCC0,0xDCC1,0xDCC2,0xDCC3,0xDCC4,0xDCC5,0xDCC6,0xDD75,
+ 0xDE43,0xDE12,0xDE9F,0xDE91,0xDCF6,0xDE92,0xDE93,0xDE94,0xDF7E,0xDF7F,
+ 0xDF80,0xDF81,0xDF82,0xDC4C,0xDC63,
+ /* plane 15, row 22 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84F,0xD84F,0xD84F,0xD850,0xD84F,0xD84F,0xD84F,0xD84F,0x6E15,
+ 0xD84F,0xffff,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x3D0E,
+ 0xffff,0xffff,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD850,0xD850,0xD850,0xD850,0xffff,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0x3DC1,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xffff,0xD850,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD852,0x7413,0xD852,0x3ED9,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0x74F8,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xffff,0xD853,0xD853,
+ 0xD854,0xD854,0xD854,0xD854,0x7B3D,
+ 1, /* first low-surrogate */
+ 0xDDC0,0xDDC1,0xDDC2,0xDE3A,0xDDC3,0xDDC4,0xDDC5,0xDDC6, 0,
+ 0xDDC7, 0,0xDDC8,0xDD73,0xDDC9,0xDDCA,0xDDCB,0xDDCC,0xDDCD, 0,
+ 0, 0,0xDDCE,0xDDCF,0xDDD0,0xDDD1,0xDDD2,0xDDD3,0xDDD4,0xDDD5,
+ 0xDE3B,0xDE3C,0xDE3D,0xDE3E, 0,0xDE3F,0xDE40,0xDE41,0xDE42,0xDE43,
+ 0,0xDE44,0xDE45,0xDE59,0xDE46,0xDE47,0xDE48, 0,0xDE49,0xDD13,
+ 0xDD82,0xDD83,0xDE66,0xDE67,0xDD65, 0,0xDD66, 0,0xDD75,0xDD74,
+ 0xDD67,0xDD6D,0xDD76,0xDD68,0xDD69,0xDD6A,0xDD6B,0xDD4F,0xDD6C,0xDEF8,
+ 0xDF45, 0,0xDF46,0xDFE4,0xDC85,0xDC6F,0xDC70,0xDD82,0xDD83,0xDD84,
+ 0xDD8B,0xDF2D,0xDF68,0xDF69,0xDF77,0xDF64,0xDF6A, 0,0xDFF2,0xDFE2,
+ 0xDC63,0xDC64,0xDC65,0xDC66,
+ /* plane 15, row 23 */
+ 1 | (94 << 8), /* first, last */
+ 0xD854,0xD854,0x76D8,0xffff,0xD854,0xD854,0xD854,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xffff,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xffff,0xD855,0x4148,0xD855,0xD855,
+ 0xD855,0x79FC,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xffff,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0x7B39,0xD856,0xD856,0xD857,0xD857,
+ 0xD857,0xffff,0x7D4B,0xD857,0xffff,0xffff,0xD857,0xD857,0xD857,0xD857,
+ 0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xffff,0xD859,0xffff,0xD85A,0xD85A,0xffff,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0x83B9,0xD85A,
+ 0xD85B,0xD85A,0xD85A,0xD85B,0xD85B,
+ 1, /* first low-surrogate */
+ 0xDC67,0xDC68, 0, 0,0xDD72,0xDD7D,0xDF69,0xDC84,0xDC86,
+ 0xDC87,0xDC88,0xDC9E, 0,0xDC89,0xDC8A,0xDC96,0xDC8B,0xDC8C,0xDC8D,
+ 0xDE79,0xDE83,0xDE7A,0xDE5D,0xDE7B, 0,0xDF9F, 0,0xDFA0,0xDFA1,
+ 0xDFA2, 0,0xDD6A,0xDD6B,0xDD6C,0xDD6D,0xDD6E,0xDE78, 0,0xDE79,
+ 0xDE7C,0xDF21,0xDF22,0xDF23,0xDF24, 0,0xDF25,0xDF26,0xDE51,0xDE52,
+ 0xDE56, 0, 0,0xDFE1, 0, 0,0xDFD6,0xDFD7,0xDFD8,0xDFD9,
+ 0xDEB5,0xDF6C,0xDF6F,0xDF70,0xDCBC,0xDCBD,0xDCED,0xDD5B,0xDD5C,0xDD5D,
+ 0xDD5E,0xDE86,0xDE87,0xDEED, 0,0xDEEE, 0,0xDD0E,0xDD0F, 0,
+ 0xDE2D,0xDE2A,0xDE2E,0xDECC,0xDFF9,0xDFFA,0xDFFB,0xDFFC, 0,0xDFFD,
+ 0xDC1B,0xDFFE,0xDFFF,0xDC00,0xDC01,
+ /* plane 15, row 24 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,0x86CF,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85D,0xffff,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,
+ 0xffff,0xD85E,0xD87E,0xD85E,0xffff,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xffff,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xffff,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0x8EAE,0xD860,0xffff,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xffff,0xD861,0xD861,0xD862,0xD862,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDC02,0xDC03,0xDC21,0xDC04,0xDC05,0xDC06,0xDC07,0xDC08,0xDC09,
+ 0xDC0A,0xDC0B,0xDC0C,0xDC0D,0xDC0E,0xDC0F,0xDC10,0xDC11,0xDC12,0xDC13,
+ 0xDC14,0xDC15,0xDE7B,0xDE7C,0xDE7D,0xDE7E, 0,0xDE7F,0xDE80,0xDE66,
+ 0xDE81,0xDE82,0xDE83,0xDDB2, 0,0xDE7F,0xDE72,0xDE5A,0xDFEB,0xDC15,
+ 0,0xDC16,0xDDCA,0xDC17, 0,0xDCC5,0xDCC6,0xDCC7,0xDD88,0xDD89,
+ 0,0xDD8A,0xDD8B,0xDD8C,0xDD8D,0xDFDF, 0,0xDD3B,0xDD3C,0xDD3D,
+ 0xDD3E,0xDD3F,0xDD40,0xDD41,0xDD42,0xDE5C,0xDEAF,0xDEA9,0xDEAA,0xDEAB,
+ 0xDEAC,0xDEB5,0xDEAD,0xDEAE,0xDFE2,0xDE24, 0,0xDEC4, 0,0xDCEA,
+ 0xDCD3,0xDCD4,0xDCD5,0xDE86, 0,0xDE87,0xDEFD,0xDC05,0xDD49,0xDC5F,
+ 0xDCD3,0xDCD5,0xDE8A,0xDE8B,0xDE8C,
+ /* plane 15, row 25 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,
+ 0x96EB,0xffff,0xffff,0xD864,0xD864,0xD867,0xD867,0xffff,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD84C,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xffff,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0x55B0,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0x5840,0x5842,
+ 1, /* first low-surrogate */
+ 0xDE8D,0xDE8E,0xDE8F,0xDE90,0xDE91,0xDE92,0xDE93,0xDC7D,0xDC7E,
+ 0, 0, 0,0xDDEC,0xDE5B,0xDC87,0xDC86, 0,0xDC46,0xDC47,
+ 0xDD02,0xDD6D,0xDD6E,0xDD6F,0xDF0D,0xDF0E,0xDF0F,0xDF10,0xDF11,0xDF12,
+ 0xDF13,0xDF14,0xDC9F,0xDCA0,0xDCA1,0xDCA3,0xDD21,0xDD22,0xDF7C,0xDD95,
+ 0xDD96,0xDE61,0xDE67,0xDF91,0xDF92,0xDF93,0xDF94,0xDC8A,0xDC8B,0xDCF7,
+ 0xDD24,0xDDB0,0xDDB1,0xDE8E,0xDF04,0xDF6A,0xDF6B,0xDF6C,0xDF6D,0xDDE8,
+ 0xDE0C,0xDDE9,0xDDEA,0xDE0D, 0,0xDDEB,0xDDEC,0xDDED,0xDDEE,0xDDEF,
+ 0xDDF0,0xDDF1,0xDDF2,0xDE16,0xDDF3,0xDE04,0xDE1D,0xDDF4,0xDDF5,0xDDF6,
+ 0xDDF7, 0,0xDE02,0xDE03,0xDE04,0xDF9A,0xDF7C,0xDFC5,0xDF7D,0xDF7E,
+ 0xDF7F,0xDF80,0xDF81,
+ /* plane 15, row 26 */
+ 1 | (94 << 8), /* first, last */
+ 0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xffff,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0x3701,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xffff,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD841,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xffff,0xD848,
+ 0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xffff,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,
+ 1, /* first low-surrogate */
+ 0xDF82,0xDF83,0xDF84,0xDF85,0xDF86,0xDF87,0xDDAE,0xDE4D,0xDFB0,
+ 0xDFDC,0xDFB6,0xDFB7,0xDFB8,0xDFB9,0xDFBA,0xDFBB,0xDFDB,0xDFBC,0xDFBD,
+ 0xDFBE, 0,0xDFBF,0xDFC0,0xDFC1,0xDFC2,0xDFC3,0xDFCE, 0,0xDFD9,
+ 0xDFC4,0xDFC5,0xDFDA,0xDFC6,0xDFC7,0xDFC8,0xDFC9,0xDFCA,0xDD7E,0xDD7B,
+ 0xDE4E,0xDE4F,0xDE50,0xDE51,0xDE52,0xDE53,0xDE54,0xDE55,0xDF8F,0xDFFC,
+ 0xDCA6,0xDCA7,0xDCA8,0xDD23,0xDE8B, 0,0xDE8C,0xDE8D,0xDE8E,0xDE8F,
+ 0xDEA4,0xDD99,0xDC24,0xDC46,0xDC47,0xDC48,0xDCFD,0xDCFE, 0,0xDE6E,
+ 0xDE7C,0xDE6F,0xDE70,0xDE71,0xDE72,0xDF29,0xDF2A,0xDF5F,0xDCA2,0xDD30,
+ 0xDD2B,0xDF61,0xDF02,0xDF03,0xDF04,0xDF05,0xDF06,0xDF07, 0,0xDF08,
+ 0xDF09,0xDF62,0xDF0A,0xDF0B,0xDF0C,
+ /* plane 15, row 27 */
+ 1 | (94 << 8), /* first, last */
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xffff,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD84B,0xD84A,0xD84B,0xffff,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xffff,0xD84B,0xD84B,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xffff,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xffff,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xffff,0xD84C,0xD84C,0xD84C,0xD84C,0xD859,0xD84D,0xD84D,
+ 0xffff,0xD84D,0xD84D,0xD84D,0xffff,0xD84D,0xD84D,0xD84D,0x692B,0xD84D,
+ 0x6916,0xD84D,0xD84D,0xD840,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 1, /* first low-surrogate */
+ 0xDF0D,0xDF0E,0xDF63,0xDF27,0xDF0F, 0,0xDF1B,0xDF64,0xDF10,
+ 0xDF11,0xDF81,0xDF12,0xDF65,0xDF13,0xDDCE,0xDC29,0xDFC4,0xDC2A, 0,
+ 0xDC2B,0xDC2C,0xDC2D,0xDC2E,0xDC2F,0xDC30,0xDC31,0xDC32,0xDC33,0xDC34,
+ 0,0xDC35,0xDC36,0xDFE3,0xDC37,0xDC38,0xDC39,0xDC3A,0xDC3B,0xDC4D,
+ 0xDC3C,0xDC3D,0xDC3E, 0,0xDED0,0xDED1,0xDC55,0xDD02,0xDD04,0xDDFC,
+ 0xDE07,0xDDFD,0xDDFE, 0,0xDDFF,0xDE00,0xDE08,0xDE01,0xDE02,0xDE35,
+ 0xDE03,0xDE04, 0,0xDF3B,0xDF89,0xDF81,0xDF82,0xDF33,0xDCEB,0xDCEC,
+ 0,0xDCED,0xDCEE,0xDCEF, 0,0xDCF0,0xDCF1,0xDCF2, 0,0xDCF3,
+ 0,0xDCF4,0xDCF5,0xDC4B,0xDCF6,0xDCF7,0xDCF8,0xDCF9,0xDCFA,0xDCFB,
+ 0xDCFC,0xDCFD,0xDCFE,0xDCFF,0xDD00,
+ /* plane 15, row 28 */
+ 1 | (94 << 8), /* first, last */
+ 0x691B,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x6927,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0x6BF5,0xD84E,
+ 0xffff,0xD84E,0xD84E,0xD84F,0xD84F,0x3D20,0xD84F,0xD84F,0xD84F,0x6E82,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xffff,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x3D21,0xD84F,
+ 0xD84F,0x6E7A,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xffff,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xffff,0xffff,0xD850,0xffff,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xffff,0x7129,
+ 2, /* first low-surrogate */
+ 0xDD01,0xDD02,0xDD03,0xDD04,0xDD05,0xDD06,0xDD07, 0,
+ 0xDD08,0xDD09,0xDD0A,0xDD0B,0xDD0C,0xDD0D,0xDCD7,0xDCD8,0xDE29,0xDE9C,
+ 0xDEF8,0xDF98,0xDFA4,0xDF99,0xDF9A,0xDF9B,0xDF97,0xDF9C, 0,0xDF9D,
+ 0,0xDF9E,0xDF9F,0xDC65,0xDDD6, 0,0xDE32,0xDE33,0xDE34, 0,
+ 0xDE35,0xDE36,0xDE37,0xDDD7, 0,0xDDD8,0xDE38,0xDE39,0xDE3A,0xDE3B,
+ 0xDE3C,0xDE3D,0xDE3E,0xDE3F,0xDE40,0xDDD9,0xDE41,0xDE42, 0,0xDE43,
+ 0xDE44, 0,0xDE7C,0xDE7D,0xDE7E,0xDE7F,0xDE80,0xDE81,0xDE82, 0,
+ 0xDE83,0xDE84,0xDE85,0xDE86,0xDEA5,0xDE87,0xDE88,0xDE89,0xDE8A,0xDE8B,
+ 0xDE8C,0xDE8D,0xDE8E, 0, 0,0xDE8F, 0,0xDE90,0xDE91,0xDE92,
+ 0xDE93,0xDE94,0xDE95,
+ /* plane 15, row 29 */
+ 1 | (94 << 8), /* first, last */
+ 0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0x3EDA,0xffff,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD853,0xD854,0xD854,0xffff,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD87E,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xffff,0xD855,0xffff,0xD856,0xD846,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD857,0xD857,0xffff,0xD857,
+ 1, /* first low-surrogate */
+ 0xDE96,0xDD56,0xDD57,0xDDE1,0xDE0E,0xDE0F,0xDE7A,0xDE7B,0xDE8B,
+ 0xDFF2,0xDFF3,0xDD93,0xDD94,0xDD95,0xDD96,0xDD97,0xDDAD,0xDD98,0xDDAB,
+ 0xDD7B,0xDD99,0xDD9A,0xDD9B,0xDD85,0xDD9C,0xDD9D, 0, 0,0xDDAC,
+ 0xDD79,0xDD9E,0xDDA4,0xDEFD,0xDFEB,0xDFEA,0xDC8F,0xDC90,0xDC86,0xDC87,
+ 0xDC88,0xDDAC,0xDDAD,0xDFEC,0xDC73,0xDC74, 0,0xDDAA,0xDDAB,0xDDAC,
+ 0xDFD1,0xDFD7,0xDCB9,0xDCBA,0xDCBB,0xDCBC,0xDE8E,0xDE8F,0xDE90,0xDE7C,
+ 0xDE91,0xDE92,0xDE93,0xDE94,0xDD54,0xDE9A,0xDE95,0xDE96,0xDE97,0xDFBD,
+ 0xDFC7,0xDFBE, 0,0xDFBF, 0,0xDD93,0xDE5E,0xDE86,0xDE87,0xDE88,
+ 0xDE89,0xDF41,0xDF42,0xDF43,0xDF44,0xDF45,0xDF46,0xDF4A,0xDF47,0xDF48,
+ 0xDF49,0xDE6B,0xDE66, 0,0xDE67,
+ /* plane 15, row 30 */
+ 1 | (94 << 8), /* first, last */
+ 0x7CAB,0xD857,0x7CAC,0xffff,0xD857,0xD857,0xD857,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD87E,0xD858,
+ 0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xffff,0xffff,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xffff,0xffff,0xffff,0xD85A,0xD85A,
+ 0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xffff,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0x83F7,0xffff,0xD85B,0xD85B,0xD85B,0x44EA,0xffff,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 2, /* first low-surrogate */
+ 0xDE68, 0, 0,0xDFFD,0xDFFE,0xDFFF,0xDC00,0xDC01,
+ 0xDC02,0xDC03,0xDC04,0xDC05,0xDC06,0xDE33,0xDEC2,0xDED0,0xDD74,0xDF95,
+ 0xDF96,0xDC35,0xDC36,0xDD67,0xDD68,0xDD69,0xDD6A,0xDD72,0xDD6B,0xDD6C,
+ 0xDD6D,0xDD6E,0xDD6F,0xDF22, 0, 0,0xDF23,0xDF41,0xDF24,0xDF25,
+ 0xDF26,0xDF27,0xDF28,0xDF29,0xDEB7, 0, 0, 0,0xDDDA,0xDECF,
+ 0xDEDA,0xDC89,0xDCB7,0xDC8A,0xDC8B,0xDD5E,0xDC8C, 0,0xDC8D,0xDC8E,
+ 0xDC8F,0xDC90,0xDC91,0xDC92,0xDC93,0xDC94,0xDCB6,0xDC95,0xDC96,0xDC97,
+ 0, 0,0xDC98,0xDC99,0xDC9A, 0, 0,0xDC9B,0xDCBD,0xDC9C,
+ 0xDC9D,0xDC9E,0xDC9F,0xDCC0,0xDCA0,0xDCA1,0xDCA2,0xDCA3,0xDCA4,0xDCA5,
+ 0xDCA6,0xDCA7,0xDCA8,0xDCA9,0xDCAA,
+ /* plane 15, row 31 */
+ 2 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD87E,0xD85E,0xD85E,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xffff,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD860,0xD87E,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xffff,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xffff,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xffff,0xD862,0xD863,0x4989,0xffff,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0x9596,
+ 2, /* first low-surrogate */
+ 0xDDB4,0xDDB5,0xDDB6,0xDEB9,0xDEBA,0xDEBB,0xDE91,0xDEBC,
+ 0xDDEE,0xDDEF,0xDE96,0xDE97,0xDE73,0xDE98,0xDE99,0xDFED,0xDFEE,0xDCDE,
+ 0xDDB0,0xDDB1,0xDDB2,0xDDB3,0xDDB4,0xDDB5,0xDDB6,0xDDCE,0xDDB7,0xDFE3,
+ 0xDCB9,0xDD55,0xDD7E,0xDD56,0xDD57,0xDD58,0xDD59,0xDD5A, 0,0xDEC4,
+ 0xDEC5,0xDEC6,0xDEC7,0xDEC8,0xDEC9,0xDEEE,0xDECF,0xDECA,0xDECB,0xDECC,
+ 0xDC09,0xDDDA,0xDC03,0xDE2F,0xDE30,0xDE31,0xDE32,0xDD0E,0xDD0F,0xDD10,
+ 0xDD11,0xDD12, 0,0xDD13,0xDD14,0xDD15,0xDCFF,0xDF1F,0xDF20,0xDF21,
+ 0xDF2D, 0,0xDC1B,0xDC1C,0xDC1D,0xDC1E,0xDD53,0xDD54,0xDD55,0xDD56,
+ 0xDD64,0xDD59,0xDD57, 0,0xDD58,0xDC6B, 0, 0,0xDCE7,0xDCE8,
+ 0xDCE9,0xDCEA,0xDCEB,0xDCEC,
+ /* plane 15, row 32 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0xffff,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xffff,0xD848,0xD865,0x4AB2,0xD865,0xD865,0xffff,0xD866,0xD84C,0xD867,
+ 0xD869,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD842,0xffff,0xD843,0xffff,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0x55F1,0xD843,0xD843,0xD844,
+ 0xD844,0xD844,0xD844,0xD866,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xD844,0xD845,0xD840,0xD845,0xD846,0xD845,0xD845,
+ 0xD846,0xffff,0xD846,0xD846,0xD846,
+ 1, /* first low-surrogate */
+ 0xDCED,0xDEB1,0xDEB4, 0,0xDC8A,0xDC8D,0xDC8C,0xDDF2,0xDDF3,
+ 0,0xDD08,0xDC17, 0,0xDD9F,0xDEA0, 0,0xDC6D,0xDC7D,0xDF90,
+ 0xDDC4,0xDC4C,0xDD74,0xDD75,0xDD76,0xDF49,0xDF4A,0xDF4B,0xDF4C,0xDF4D,
+ 0xDF4E,0xDF4F,0xDF50,0xDF51,0xDF52,0xDF53,0xDF54,0xDF55,0xDF56,0xDCA4,
+ 0xDCA9,0xDD2A,0xDD2B,0xDFB3,0xDFC1,0xDC98,0xDCFB,0xDCFC,0xDDBC,0xDE96,
+ 0xDF0A, 0,0xDEA2, 0,0xDE81,0xDE82,0xDE83,0xDE84,0xDE85,0xDE86,
+ 0xDE87,0xDE88,0xDE89,0xDE8A,0xDE8B,0xDE8C, 0,0xDE8D,0xDED1,0xDE14,
+ 0xDFC9,0xDFCA,0xDFCB,0xDEFD,0xDFCC,0xDFCD,0xDFCE,0xDFCF,0xDFD0,0xDFD1,
+ 0xDFD2,0xDFD3,0xDFD4,0xDFD5,0xDD71,0xDC4D,0xDE62,0xDC0E,0xDFFE,0xDFFF,
+ 0xDC00, 0,0xDC01,0xDC02,0xDC03,
+ /* plane 15, row 33 */
+ 1 | (94 << 8), /* first, last */
+ 0xD846,0xD846,0xD846,0xffff,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD87E,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD847,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xD848,0xD848,0xD848,
+ 0xD856,0x5F41,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,
+ 0xD849,0xD849,0xffff,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD87E,0xD84B,0xD84B,0xffff,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xD87E,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD84C,0xffff,0xD84C,0xD84C,
+ 1, /* first low-surrogate */
+ 0xDC15,0xDC04,0xDC05, 0,0xDD87,0xDD89,0xDE6E,0xDE6F,0xDE70,
+ 0xDE71,0xDC6E,0xDE72,0xDE73,0xDE74,0xDF9D,0xDCB8,0xDCB9,0xDCBA,0xDEC2,
+ 0xDEC3,0xDED5,0xDEC4,0xDEC0,0xDEC5,0xDEC6,0xDE8A,0xDE8B,0xDE8C,0xDF64,
+ 0xDF8C, 0,0xDC0D,0xDCA8,0xDD3B,0xDD3C,0xDD3D,0xDD3E,0xDD3F,0xDD40,
+ 0xDF66,0xDFCB,0xDFB7,0xDFB8,0xDFB9,0xDFBA,0xDF67,0xDFBB,0xDF68,0xDF69,
+ 0xDF6A,0xDFBC, 0,0xDDDB,0xDC81,0xDC82,0xDC83,0xDC84,0xDC85,0xDC86,
+ 0xDC87,0xDC88,0xDC89,0xDCBF,0xDC8A,0xDC8B, 0,0xDC8C,0xDC8D,0xDC8E,
+ 0xDC8F,0xDC90,0xDCA1,0xDC91,0xDED6,0xDF9F,0xDC58,0xDC85,0xDD0B,0xDD0C,
+ 0xDE37,0xDE38,0xDCCE,0xDE39,0xDE3A,0xDE3B,0xDE3C,0xDE3D,0xDE3E,0xDE40,
+ 0xDE41,0xDE42, 0,0xDE43,0xDF8A,
+ /* plane 15, row 34 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84C,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x698A,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x698C,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x6980,
+ 0xD84D,0x697F,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xffff,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xffff,0xffff,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,0xD84F,0xD850,0xffff,0x3DDA,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,
+ 1, /* first low-surrogate */
+ 0xDF8B,0xDD90,0xDD59,0xDD5B,0xDD5C,0xDD5D,0xDD5E, 0,0xDD5F,
+ 0xDD60,0xDD61,0xDD62,0xDD63,0xDD64,0xDD93,0xDD65,0xDD66,0xDD67,0xDD68,
+ 0xDD69,0xDD6A,0xDD6B,0xDD95,0xDD6C,0xDD6D,0xDD6E,0xDD6F, 0,0xDD70,
+ 0xDD71,0xDD72,0xDD73,0xDD74,0xDD75,0xDD76,0xDD77,0xDD78,0xDD79, 0,
+ 0xDD7A, 0,0xDD7B,0xDDA9,0xDD7C,0xDCF1,0xDCEB,0xDD8A,0xDE3D,0xDEA6,
+ 0xDEA7,0xDFBA, 0,0xDFBB,0xDFBC,0xDFBD,0xDE91,0xDE92,0xDE93,0xDE94,
+ 0xDE95,0xDE96,0xDE97,0xDDDA,0xDE98,0xDE99,0xDE9A, 0, 0,0xDE9B,
+ 0xDE9C,0xDE9D,0xDE9E,0xDE9F,0xDEA0,0xDEBF,0xDEA1,0xDEA2,0xDEA3,0xDEA4,
+ 0xDEA5,0xDEA6,0xDEA7,0xDE5B,0xDD0D,0xDEA8,0xDECB, 0, 0,0xDECC,
+ 0xDF4F,0xDECD,0xDECE,0xDECF,0xDF4E,
+ /* plane 15, row 35 */
+ 1 | (94 << 8), /* first, last */
+ 0xD850,0xD850,0xD850,0xffff,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD87E,0xD850,0xffff,0xffff,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0x3DDB,0xD850,
+ 0xD850,0xD851,0xD851,0xD851,0xffff,0xD852,0xffff,0xD852,0xD852,0xD852,
+ 0xD852,0x3EE2,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0x3EE3,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD87E,0xD852,
+ 0xD852,0xD852,0xD852,0xD853,0xD853,0xD853,0xD853,0xD853,0xD853,0xD854,
+ 0xD854,0xD854,0xD854,0xD854,0xD84D,0xD854,0xffff,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,
+ 1, /* first low-surrogate */
+ 0xDED0,0xDED1,0xDED2, 0,0xDED3,0xDED4,0xDED5,0xDED6,0xDED7,
+ 0xDED8,0xDED9,0xDEFA,0xDEDA,0xDEDB,0xDD1C,0xDEDC, 0, 0,0xDEDD,
+ 0xDEDE,0xDEDF,0xDEE0,0xDEE1,0xDEE2,0xDEE3,0xDEE4,0xDEE5, 0,0xDEE6,
+ 0xDEE7,0xDD8E,0xDE98,0xDE99, 0,0xDC0A, 0,0xDC26,0xDC27,0xDDBD,
+ 0xDDDF, 0,0xDDBE,0xDDDE,0xDDBF,0xDDC0,0xDDC1,0xDDC2,0xDD9F,0xDDC3,
+ 0xDDC4,0xDDC5,0xDDC6,0xDDC7, 0,0xDDC8,0xDDC9,0xDDE3,0xDDCA,0xDDCB,
+ 0xDDCC,0xDDCD,0xDDCE,0xDDCF,0xDDD0,0xDDD1,0xDDD2,0xDDD3,0xDD2F,0xDDD4,
+ 0xDF04,0xDF65,0xDFEE,0xDCA0,0xDCA1,0xDDDD,0xDDDE,0xDF83,0xDFFA,0xDC7F,
+ 0xDC80,0xDDE8,0xDDE9,0xDDEA,0xDDA6,0xDFE1, 0,0xDCDB,0xDCDC,0xDCDD,
+ 0xDCDE,0xDCDF,0xDCE0,0xDCE1,0xDCE2,
+ /* plane 15, row 36 */
+ 1 | (94 << 8), /* first, last */
+ 0xD855,0xD855,0xD855,0xD855,0x789C,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x7B7B,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,
+ 0xD859,0xD859,0xD87E,0xD859,0xD859,0xD859,0xD859,0xD859,0xffff,0xD859,
+ 0xD859,0xD859,0xD85A,0xD85B,0x4749,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 1, /* first low-surrogate */
+ 0xDCE3,0xDCE4,0xDCE5,0xDCE6, 0,0xDCE7,0xDEB0,0xDE98,0xDEB1,
+ 0xDE99,0xDEB2,0xDEB3,0xDEB4,0xDEB5,0xDEB6,0xDEB7,0xDEB8,0xDEB9,0xDFE2,
+ 0xDFE3,0xDFE4,0xDFE5,0xDFE6,0xDFE7,0xDFE8,0xDFE9,0xDDAD,0xDDCF,0xDDAE,
+ 0xDDAF,0xDDB0,0xDDB1,0xDE92,0xDE93,0xDE94,0xDF79, 0,0xDF7A,0xDF7B,
+ 0xDF7C,0xDF7D,0xDF7E,0xDF7F,0xDF80,0xDF81,0xDF82,0xDF83,0xDF84,0xDE97,
+ 0xDE84,0xDE85,0xDE89,0xDE86,0xDE87,0xDC2C,0xDC2D,0xDC2E,0xDC2F,0xDC30,
+ 0xDC31,0xDC32,0xDC33,0xDC34,0xDC35,0xDC36,0xDC37,0xDED2,0xDC44,0xDD00,
+ 0xDD83,0xDD84,0xDD86,0xDF7A,0xDF7B,0xDF7C,0xDF7D,0xDF7E, 0,0xDF7F,
+ 0xDF87,0xDF80,0xDE43,0xDD34, 0,0xDD35,0xDD36,0xDD37,0xDD38,0xDD39,
+ 0xDD3A,0xDD3B,0xDD3C,0xDD3D,0xDD3E,
+ /* plane 15, row 37 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xffff,0xD85B,0xD85B,0xD85B,0xD85B,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD87E,
+ 0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xffff,0xD85E,0xD85E,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0x47F3,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xffff,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0x90D2,0xD861,0xD861,
+ 0xD862,0xD862,0x9274,0xD87E,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD863,0x95A0,0xffff,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDD3F,0xDD40,0xDD41,0xDD42,0xDD43,0xDD44,0xDD45,0xDD46,0xDD47,
+ 0xDD48,0xDD49,0xDD4A, 0,0xDD4B,0xDD4C,0xDD4D,0xDD4E,0xDEE7,0xDEE8,
+ 0xDEE9,0xDEEA,0xDEEB,0xDEEC,0xDEED,0xDEEE,0xDDF7,0xDE9A,0xDECD,0xDDC8,
+ 0xDEA3,0xDECE,0xDC31,0xDC32,0xDC33,0xDDE4, 0,0xDDE5,0xDDE6,0xDCC8,
+ 0xDD74,0xDD75,0xDD76,0xDD77,0xDD78,0xDD79,0xDD7A,0xDE61,0xDEDF,0xDEE0,
+ 0xDEE1,0xDEE2,0xDEE3,0xDEE4,0xDEE5,0xDEE6, 0,0xDC31,0xDE3D,0xDE3E,
+ 0xDE3F,0xDEF4,0xDEF5,0xDEF6, 0,0xDC17,0xDD41,0xDD42,0xDD43,0xDD44,
+ 0xDD45,0xDD46,0xDD47,0xDD48,0xDD49,0xDD4A,0xDD4B, 0,0xDEBA,0xDF44,
+ 0xDD2A,0xDD6D, 0,0xDDE7,0xDD7E,0xDD6E,0xDD6F,0xDD70,0xDD71,0xDD76,
+ 0xDC79, 0, 0,0xDD04,0xDCF8,
+ /* plane 15, row 38 */
+ 1 | (94 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0x4A57,0xD865,
+ 0xD85F,0xffff,0xD865,0xD865,0xffff,0xD84C,0xD866,0xD867,0xD867,0xD868,
+ 0xD868,0xD868,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,
+ 0x51A9,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD843,0xD842,0xD842,0xD842,
+ 0xD842,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,
+ 1, /* first low-surrogate */
+ 0xDD05,0xDEDA,0xDEDB,0xDEDC,0xDEDD,0xDEDE,0xDEDF,0xDEE0,0xDEE1,
+ 0xDCC5,0xDC9A,0xDC9B,0xDC9C,0xDDD8,0xDDD9,0xDDDA,0xDE6E, 0,0xDC6B,
+ 0xDD83, 0,0xDED6,0xDEBD, 0,0xDE2E,0xDEFC,0xDD53,0xDDB7,0xDE8C,
+ 0xDF8E,0xDEFF,0xDC76,0xDD06,0xDD7E,0xDF84,0xDF85,0xDF86,0xDF87,0xDF88,
+ 0xDFA7,0xDF89,0xDF8A,0xDF8B,0xDF8C,0xDF8D,0xDF8E,0xDF8F,0xDFA3,0xDF90,
+ 0xDF91,0xDF92,0xDF93,0xDFAC,0xDF94,0xDF95,0xDF96,0xDCAA,0xDCAB,0xDD9E,
+ 0,0xDE08,0xDE09,0xDE68,0xDE69,0xDE6A,0xDE9A,0xDFD9,0xDFDA,0xDFDB,
+ 0xDCA8,0xDD01,0xDD28,0xDD77,0xDDBD,0xDDBE,0xDF60,0xDEA0,0xDEA2,0xDF0F,
+ 0xDF85,0xDEFE,0xDEFF,0xDF00,0xDF01,0xDF16,0xDF02,0xDF03,0xDF04,0xDF05,
+ 0xDF06,0xDF07,0xDF08,0xDF22,0xDF09,
+ /* plane 15, row 39 */
+ 1 | (94 << 8), /* first, last */
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD844,0xD844,0xD844,0xD845,0xD844,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD840,0xffff,0xD846,0xD846,0xD87E,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xffff,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,0xffff,0xD848,0xD848,
+ 0xffff,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,0xD848,
+ 0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD849,0xD84A,0xD849,
+ 0xD849,0xffff,0xD84A,0xD849,0xD84A,
+ 1, /* first low-surrogate */
+ 0xDF0A,0xDF0B,0xDF0C,0xDF14,0xDF29,0xDE6E,0xDF0D,0xDF0E,0xDF0F,
+ 0xDF10,0xDF11,0xDF12,0xDF13,0xDE1B,0xDE1C,0xDE1D,0xDC13,0xDFFF,0xDC00,
+ 0xDC01,0xDC02,0xDC03,0xDC04,0xDC0A,0xDC05,0xDC06,0xDC07,0xDC08,0xDD3A,
+ 0xDD73,0xDE6F,0xDE70,0xDE71,0xDC52, 0,0xDE9A,0xDC60,0xDC69,0xDC2B,
+ 0xDC24,0xDC2C,0xDC2D,0xDC2E,0xDC2F,0xDC30,0xDC31,0xDC32,0xDC33,0xDC34,
+ 0xDC35,0xDC45,0xDC36,0xDD92,0xDD93,0xDE88,0xDE89,0xDE8A,0xDE8B,0xDF3F,
+ 0,0xDCCA,0xDEF6,0xDEF7,0xDEF8,0xDEF9,0xDD2B, 0,0xDDA4,0xDDCE,
+ 0,0xDE9E,0xDE9F,0xDEA0,0xDEA1,0xDEA2,0xDEA3,0xDEA4,0xDEA5,0xDEA6,
+ 0xDC18,0xDD60,0xDD61,0xDD62,0xDD63,0xDD64,0xDFBD,0xDFBE,0xDC0B,0xDFBF,
+ 0xDFC0, 0,0xDC0C,0xDF8D,0xDC0D,
+ /* plane 15, row 40 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD849,0xD84A,0xffff,0xD849,0xD84A,
+ 0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xffff,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,0xD84D,
+ 0x3BBC,0xD84D,0xD84D,0x3BA4,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xffff,0xD84E,0xD87E,
+ 0xD84E,0xD87E,0xD84E,0xD84E,0xD84E,
+ 1, /* first low-surrogate */
+ 0xDC0E,0xDC5E,0xDC0F,0xDC10,0xDFC1,0xDC11, 0,0xDFC2,0xDDEA,
+ 0xDDEB,0xDCE3,0xDCE4,0xDCE5,0xDCE6,0xDCE7,0xDC92,0xDD4A, 0,0xDCE8,
+ 0xDCE9,0xDCEA,0xDD01,0xDCEB,0xDCEC,0xDCEF,0xDCED,0xDCEE,0xDCF0,0xDCF1,
+ 0xDCF2,0xDCF3,0xDCF4,0xDCF5,0xDCF6,0xDCF7,0xDCF8,0xDCF9,0xDCFE,0xDCFA,
+ 0xDCFB,0xDCFC,0xDE63,0xDE64,0xDE65,0xDE66,0xDE67,0xDE68,0xDE0B,0xDE0D,
+ 0,0xDE0E,0xDE0F, 0,0xDE14,0xDDD4,0xDDD5,0xDDD6,0xDDD7,0xDDD8,
+ 0xDDD9,0xDDDA,0xDDDB,0xDDDC,0xDDDD,0xDDDE,0xDDDF,0xDDE0,0xDDE1,0xDDE2,
+ 0xDDE3,0xDDE4,0xDDE5,0xDDE6,0xDDE7,0xDDE8,0xDDE9,0xDDEA,0xDDEB,0xDDEC,
+ 0xDEEC,0xDDED,0xDDEE,0xDDEF,0xDE00,0xDDF0,0xDD04, 0,0xDD05,0xDCF3,
+ 0xDEB5,0xDCF9,0xDFD6,0xDFD7,0xDFD8,
+ /* plane 15, row 41 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xffff,0xffff,
+ 0xD84F,0xffff,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xffff,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,
+ 0xffff,0xD850,0xD850,0x7195,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0x3DE8,0xffff,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0x7198,0xD850,0xffff,0xD850,0xD850,0xD850,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0x7478,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,
+ 1, /* first low-surrogate */
+ 0xDFD9,0xDEA9,0xDF00,0xDF01,0xDF02,0xDF03,0xDF04,0xDF05,0xDF06,
+ 0xDF3F,0xDF07,0xDF08,0xDF09,0xDF0A,0xDEB6,0xDF0B,0xDF0C, 0, 0,
+ 0xDF0D, 0,0xDF0E,0xDF0F,0xDF10,0xDF11,0xDF12,0xDF35,0xDF13,0xDF14,
+ 0xDEAA, 0,0xDFC1,0xDF15,0xDF16,0xDF17,0xDF1E,0xDF1F,0xDF20,0xDF21,
+ 0,0xDF22,0xDF23, 0,0xDF24,0xDF25,0xDF26,0xDF27,0xDF28,0xDF29,
+ 0xDF2A,0xDF2B,0xDF07,0xDF2C,0xDF2D,0xDF2E, 0, 0,0xDF2F,0xDF30,
+ 0xDF48,0xDF31,0xDF32, 0,0xDF33, 0,0xDF34,0xDF35,0xDF36,0xDD59,
+ 0xDD91,0xDDE7,0xDEB8,0xDEB9,0xDEBA,0xDEBB,0xDEC8,0xDC4D,0xDC89,0xDC50,
+ 0xDC28,0xDDFB,0xDDFC,0xDDFD,0xDDFE,0xDDFF, 0,0xDE00,0xDE01,0xDE02,
+ 0xDDE4,0xDDE5,0xDE03,0xDE04,0xDE05,
+ /* plane 15, row 42 */
+ 1 | (94 << 8), /* first, last */
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD853,0xD853,0xD853,0xD87E,0xD853,0xD853,0xD853,0xD853,
+ 0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0x78B9,0xD855,0xD855,0xffff,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xffff,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xD848,0xD855,0xD855,0xD855,0xD855,0xffff,0xD855,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x7A33,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD87E,0xD857,0xD857,0xD857,
+ 1, /* first low-surrogate */
+ 0xDE06,0xDE07,0xDE13,0xDE08,0xDE09,0xDDE6,0xDE0A,0xDE0B,0xDE0C,
+ 0xDF0B,0xDFF4,0xDC0A,0xDCB1,0xDE1D,0xDD3B,0xDF8B,0xDF8C,0xDF8F,0xDF8D,
+ 0xDF8E,0xDC06,0xDC86,0xDE22,0xDE23,0xDE24,0xDE25,0xDE26,0xDE27,0xDE28,
+ 0xDFF1, 0,0xDD23,0xDD12, 0,0xDD13,0xDD14,0xDD15,0xDD16,0xDD17,
+ 0xDD18,0xDD19,0xDD4B,0xDD1A,0xDD1B,0xDD1C, 0,0xDD1D,0xDD1E,0xDD1F,
+ 0xDD20,0xDECA,0xDEAC,0xDECB,0xDECC,0xDECD,0xDECE, 0,0xDECF,0xDC10,
+ 0xDC11,0xDC12,0xDC13,0xDC14,0xDC0F,0xDC15,0xDC16,0xDC17, 0,0xDC18,
+ 0xDDC6,0xDE9F,0xDEA0,0xDEA4,0xDEA1,0xDFB5,0xDFB6,0xDFB7,0xDFB8,0xDFB9,
+ 0xDFBA,0xDFD0,0xDFC6,0xDFBB,0xDFBC,0xDFBD,0xDFBE,0xDFBF,0xDFC0,0xDFC1,
+ 0xDFC2,0xDD60,0xDEA7,0xDEA8,0xDEA9,
+ /* plane 15, row 43 */
+ 1 | (94 << 8), /* first, last */
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0x7CC0,0xD857,0xD857,
+ 0xD857,0x7CC1,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xffff,0xD858,0xD858,0xD858,0xD858,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xffff,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xffff,0xD859,
+ 0xD859,0xD859,0xffff,0xD859,0xD87E,0xD87E,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xffff,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xffff,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 1, /* first low-surrogate */
+ 0xDEAA,0xDEAB,0xDEAC,0xDEBC,0xDEAD,0xDEAE, 0,0xDEAF,0xDEB0,
+ 0xDEB1, 0,0xDEB4,0xDEB2,0xDC66,0xDC67,0xDC68,0xDC69,0xDC6A,0xDC6B,
+ 0xDC6C,0xDC6D,0xDC6E,0xDC6F, 0,0xDE3E,0xDE3F,0xDE40,0xDEE8,0xDC52,
+ 0xDC53,0xDC54,0xDC55,0xDD91,0xDD92,0xDD93,0xDD94,0xDD95,0xDD96,0xDD97,
+ 0xDD98, 0,0xDD99,0xDD9A,0xDD9B,0xDFB7,0xDFB8,0xDFB9, 0,0xDFBA,
+ 0xDFBB,0xDFBD, 0,0xDFBC,0xDD88,0xDD87,0xDCEB,0xDCEC,0xDD16,0xDD44,
+ 0xDDE3,0xDE58,0xDE53,0xDE54,0xDEE0,0xDDB1,0xDDB2,0xDDB3,0xDDEA, 0,
+ 0xDDB4,0xDDF0,0xDDB5,0xDDB6,0xDDB7,0xDDB8,0xDDB9,0xDDBA,0xDDBB,0xDDBC,
+ 0xDDBD,0xDDBE,0xDDBF,0xDDC0,0xDDC1,0xDDC2,0xDDC3, 0,0xDDC4,0xDDC5,
+ 0xDDC6,0xDDFC,0xDDC7,0xDDC8,0xDDC9,
+ /* plane 15, row 44 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0x8744,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0x8AAD,0xD85E,0xD85E,0xD85E,0xD85E,0xffff,0xffff,
+ 0xD85F,0xD85F,0xffff,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xffff,0xD860,0xffff,0xD861,
+ 0xD861,0x4886,0xD862,0xD861,0xD861,0x9064,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,
+ 1, /* first low-surrogate */
+ 0xDDCA,0xDDCB,0xDDCC,0xDE84,0xDDCD,0xDDCE,0xDDCF,0xDDD0,0xDDD1,
+ 0xDDD2,0xDDCA,0xDDCB,0xDF36,0xDF37,0xDF9F,0xDF38,0xDF39,0xDF3A, 0,
+ 0xDEBE,0xDEF0,0xDEBF,0xDEC0,0xDFF7,0xDFF8,0xDFFA,0xDC43,0xDC44,0xDE0F,
+ 0xDE10,0xDE11,0xDE12, 0,0xDE13,0xDE14,0xDE15,0xDE16, 0, 0,
+ 0xDCD3,0xDCD7, 0,0xDDB0,0xDD98,0xDD90,0xDD91,0xDD92,0xDD97,0xDD93,
+ 0xDE64,0xDF01,0xDF02,0xDF03,0xDF04,0xDF05,0xDF06,0xDF07,0xDC5A,0xDC5B,
+ 0xDE4E,0xDE4F,0xDE50,0xDF19,0xDF1A,0xDF1B, 0,0xDF1C, 0,0xDC19,
+ 0xDC1A, 0,0xDD8A,0xDD6E,0xDD6F, 0,0xDD70,0xDD71,0xDD72,0xDD73,
+ 0xDD74,0xDD75,0xDD76,0xDC3A,0xDC3B,0xDC3C,0xDC5A,0xDC3D,0xDC42,0xDD8B,
+ 0xDDA0,0xDD8C,0xDD8D,0xDD8E,0xDDAB,
+ /* plane 15, row 45 */
+ 1 | (94 << 8), /* first, last */
+ 0xD862,0x9277,0xD862,0xD862,0xD862,0xD862,0x92AF,0xD862,0xD862,
+ 0xD862,0xD862,0xffff,0xffff,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD863,0xffff,0xD864,0xD864,0xffff,0xffff,0xD864,0xD864,0xD864,
+ 0xD865,0xD854,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD866,0xD867,0xD867,0xD867,0xD867,0xD867,0xffff,0xD867,0xD867,0xD867,
+ 0xD868,0xD868,0xD868,0xD842,0xD840,0xD840,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xffff,0xD840,0xD840,0xD840,0xD841,0xD841,0xffff,
+ 0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD840,0xD843,
+ 0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,0xD843,
+ 0xD843,0xD844,0xD845,0xD845,0xD845,
+ 1, /* first low-surrogate */
+ 0xDD8F, 0,0xDD90,0xDD91,0xDD92,0xDDAA, 0,0xDD93,0xDD94,
+ 0xDD9E,0xDDA8, 0, 0,0xDF00,0xDF01,0xDF02,0xDF03,0xDF04,0xDF05,
+ 0xDFC4,0xDFC5, 0,0xDCAE,0xDCB2, 0, 0,0xDDF7,0xDE13,0xDF9E,
+ 0xDC85,0xDF80,0xDCC8,0xDC41,0xDC81,0xDC82,0xDC83,0xDC84,0xDEC4,0xDEC5,
+ 0xDEC6,0xDC95,0xDC96,0xDC97,0xDD58,0xDD59, 0,0xDFA9,0xDFAA,0xDFAB,
+ 0xDE8E,0xDF03,0xDFB3,0xDF82,0xDC53,0xDD83,0xDD84,0xDD85,0xDFCC,0xDFCD,
+ 0xDFCE,0xDFCF,0xDFD0, 0,0xDFD1,0xDFD2,0xDFDA,0xDCB3,0xDCB4, 0,
+ 0xDE13,0xDE0E,0xDE6B,0xDD03,0xDD61,0xDDC1,0xDDC2,0xDEB5,0xDD40,0xDF98,
+ 0xDF99,0xDF9A,0xDF9B,0xDF9C,0xDF9D,0xDF9E,0xDF9F,0xDFEE,0xDFA0,0xDFA1,
+ 0xDF86,0xDE25,0xDC34,0xDC35,0xDC51,
+ /* plane 15, row 46 */
+ 1 | (94 << 8), /* first, last */
+ 0xD845,0xD850,0xD845,0xD845,0x366D,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0x366E,0xD845,0xD84C,0xD845,0xD845,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xffff,0xD846,
+ 0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xD847,0xffff,0xD847,
+ 0xD847,0xD848,0x5E64,0xD848,0xD848,0xffff,0xD848,0xD848,0xD849,0xD849,
+ 0xD849,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xffff,
+ 0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,
+ 1, /* first low-surrogate */
+ 0xDC2D,0xDF62,0xDC54,0xDC52, 0,0xDC36,0xDC37,0xDC38,0xDC39,
+ 0xDC3A,0xDC3B,0xDC68,0xDC3C, 0,0xDD77,0xDE96,0xDE7E,0xDE7F,0xDC69,
+ 0xDC6A,0xDC6B,0xDC6C,0xDC6D,0xDC6E,0xDC6F,0xDC5D,0xDC70,0xDC85,0xDC71,
+ 0xDC72,0xDC73,0xDC74,0xDC75,0xDC76,0xDC84,0xDC77,0xDC83,0xDD9A,0xDEA7,
+ 0xDEA8,0xDEA9,0xDEAA,0xDEAB,0xDEAC,0xDEB7,0xDEAD,0xDEAE, 0,0xDF45,
+ 0xDCD3,0xDCD4,0xDCD5,0xDCD6,0xDCD7,0xDF26,0xDF27,0xDF28, 0,0xDF29,
+ 0xDF2A,0xDC05, 0,0xDDD0,0xDEB7, 0,0xDEB8,0xDEB9,0xDC22,0xDC23,
+ 0xDD73,0xDD74,0xDC8F,0xDC12,0xDC13,0xDC14,0xDC15,0xDC16,0xDC17,0xDC18,
+ 0xDC61,0xDC66,0xDC67,0xDC19,0xDC68,0xDC1A,0xDC69,0xDE04,0xDE05, 0,
+ 0xDE06,0xDDFD,0xDD50,0xDD51,0xDD52,
+ /* plane 15, row 47 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD87E,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xffff,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xffff,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0x6A2B,0xD84D,0xD84D,0xffff,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xffff,0xD850,0xD84F,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD87E,0xD84F,0xD84F,0xD84F,0xD84F,0xffff,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0x6F46,
+ 0xffff,0xD84F,0xD84F,0x6F9A,0xD84F,
+ 1, /* first low-surrogate */
+ 0xDD53,0xDD54,0xDD55,0xDD63,0xDCC4,0xDD56,0xDD57,0xDD58,0xDD59,
+ 0xDD5A,0xDD5B, 0,0xDD5C,0xDD5D,0xDD5E,0xDD5F,0xDFD7, 0,0xDC60,
+ 0xDC61,0xDD17,0xDD39,0xDE8F,0xDEC8,0xDE90,0xDE91,0xDF98,0xDF99,0xDE44,
+ 0xDE45,0xDE46,0xDE59,0xDEEE, 0,0xDE47,0xDE48, 0,0xDE49,0xDE4A,
+ 0xDE4B,0xDE4C,0xDE4D,0xDE4E,0xDE4F,0xDE50,0xDE51,0xDE52,0xDE53,0xDE54,
+ 0xDE55,0xDE56,0xDD15,0xDD9A,0xDE58,0xDEFC,0xDEFD,0xDF86,0xDF87,0xDF88,
+ 0xDF89,0xDF8A,0xDF8B,0xDF8C, 0,0xDC1F,0xDF8D,0xDF8E,0xDF8F,0xDF90,
+ 0xDF91,0xDF92,0xDF93,0xDD11,0xDF94,0xDF95,0xDECA,0xDF18, 0,0xDF96,
+ 0xDF97,0xDF98,0xDF99,0xDF9A,0xDF9B,0xDF9C,0xDF9D,0xDF9E,0xDF9F, 0,
+ 0,0xDFA0,0xDFA1, 0,0xDFB7,
+ /* plane 15, row 48 */
+ 2 | (94 << 8), /* first, last */
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xffff,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD87E,
+ 0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0x3F53,0xD853,0xD853,0xD853,
+ 0xD853,0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,
+ 0xD854,0xD854,0xffff,0xD87E,0xffff,0xD854,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xffff,0xD855,0xD855,0xD855,0xD855,0xD856,0xffff,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xffff,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,
+ 2, /* first low-surrogate */
+ 0xDF96,0xDF68,0xDF69,0xDF8C,0xDF6A,0xDF6B,0xDF6C,0xDF6D,
+ 0xDF6E,0xDF6F,0xDF7F,0xDF84,0xDF70,0xDF71,0xDF85,0xDF72,0xDF73,0xDF74,
+ 0xDF75,0xDF76, 0,0xDF77,0xDF78,0xDF79,0xDF7A,0xDF7B,0xDF7C,0xDD1E,
+ 0xDD94,0xDED5,0xDC29,0xDE2B,0xDE2C,0xDE2D,0xDE2E,0xDE2F,0xDE30,0xDE3E,
+ 0xDE31,0xDE32,0xDE33,0xDE34,0xDE35,0xDF11, 0,0xDCC0,0xDE42,0xDE43,
+ 0xDE44,0xDE45,0xDE46,0xDC8C,0xDC8D,0xDC8E,0xDC8F,0xDC90,0xDC91,0xDE63,
+ 0xDE64,0xDE65, 0,0xDD4A, 0,0xDFF6,0xDD36,0xDD37,0xDD2C,0xDD38,
+ 0xDD39, 0,0xDD3A,0xDEE3,0xDEE2,0xDEF5,0xDC47, 0,0xDC48,0xDC49,
+ 0xDC4A,0xDC4B,0xDC4C,0xDEA8,0xDEA9,0xDEAA, 0,0xDC0B,0xDC06,0xDC73,
+ 0xDC0C,0xDC0D,0xDC0E,0xDC0F,0xDC10,
+ /* plane 15, row 49 */
+ 2 | (94 << 8), /* first, last */
+ 0xD857,0xD87E,0xD857,0xD857,0xD857,0xD857,0xffff,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xffff,0xD857,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xffff,0xD87E,0xD858,0xD858,0xD858,0xffff,0xffff,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0x443D,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD87E,0x4526,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0x4527,0xffff,0xD85B,0x4528,0xD85B,0xffff,0xD85C,
+ 0xD85C,0xD85C,0xffff,0xD87E,0xD85C,
+ 2, /* first low-surrogate */
+ 0xDC11,0xDD62,0xDC12,0xDC14,0xDC15,0xDC16, 0,0xDC13,
+ 0xDC17,0xDED9,0xDEDA,0xDEDB, 0,0xDEDC,0xDCA6,0xDCA7,0xDCA8,0xDCA9,
+ 0xDCAA,0xDCAB, 0,0xDD6D,0xDCAC,0xDCAD,0xDCAE, 0, 0,0xDCAF,
+ 0xDCB0,0xDCB1,0xDE44,0xDE45,0xDEF7,0xDEF8,0xDC6B,0xDC6C,0xDC61,0xDD12,
+ 0xDDAF,0xDDB0,0xDDB1,0xDDB2,0xDDB3,0xDDB4,0xDDB5,0xDDB6,0xDE22,0xDFEA,
+ 0xDFEB,0xDFEC,0xDFED, 0,0xDCED,0xDD1B,0xDD47,0xDDE8,0xDED0,0xDEE7,
+ 0xDEE8,0xDEE9,0xDE4E,0xDE4F,0xDE50,0xDE72,0xDE51,0xDE52,0xDDA7, 0,
+ 0xDE53,0xDE54,0xDE55,0xDE56,0xDE57,0xDE77,0xDE58,0xDE59,0xDE5A,0xDE5B,
+ 0xDE5C,0xDE6E,0xDE5D, 0, 0,0xDE5E, 0,0xDE5F, 0,0xDDD7,
+ 0xDF89,0xDF8A, 0,0xDDBE,0xDF8B,
+ /* plane 15, row 50 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0xD85C,0xD87E,0xD85C,0xffff,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85D,0xD85D,0xffff,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xffff,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,0xffff,
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xffff,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xffff,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0x92F2,0xD862,0xD862,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,
+ 0xD863,0xD864,0xD864,0xD864,0xD864,
+ 1, /* first low-surrogate */
+ 0xDF8C,0xDF8D,0xDF8E,0xDDBC,0xDF8F, 0,0xDF9A,0xDF90,0xDF91,
+ 0xDF92,0xDF93,0xDF12,0xDEF1, 0,0xDFFE,0xDFFB,0xDC57,0xDE49,0xDE4A,
+ 0xDE4B,0xDE4C, 0,0xDE4D,0xDE59,0xDE4E,0xDE4F,0xDFF4,0xDC65,0xDDA6,
+ 0xDDA7,0xDDA8,0xDF22,0xDF23,0xDC8B,0xDC8C,0xDC8D,0xDC8E,0xDE58, 0,
+ 0xDE59,0xDF3B,0xDF3C,0xDF3D,0xDF3E,0xDC48,0xDD94,0xDD95,0xDD96,0xDD97,
+ 0xDD98,0xDF7D,0xDEFE,0xDF7E,0xDF7F, 0,0xDC5B,0xDC5C,0xDDE4,0xDDC1,
+ 0xDDFD,0xDDC2,0xDDD6,0xDDC3,0xDDC4, 0,0xDDDC,0xDDC5,0xDDC6,0xDDC7,
+ 0xDDE1,0xDDC8,0xDDC9,0xDDCA,0xDDCB, 0,0xDDCC,0xDDCD,0xDD35,0xDD36,
+ 0xDD47,0xDD37,0xDF1B,0xDF1C,0xDF1D,0xDF1E,0xDF1F,0xDF20,0xDF7B,0xDF7A,
+ 0xDFFE,0xDCC6,0xDCC7,0xDCC8,0xDCC9,
+ /* plane 15, row 51 */
+ 1 | (94 << 8), /* first, last */
+ 0xD864,0xffff,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD866,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD867,0xD867,0xD867,0xD867,0xffff,0xD867,0xD867,0xffff,0xD867,0xD867,
+ 0x9B79,0xffff,0xD867,0xffff,0xD868,0xD841,0xD840,0xD840,0xD840,0xD840,
+ 0xD840,0xD840,0xD840,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,
+ 0xD843,0x567A,0xD843,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xffff,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,0xD844,
+ 0xffff,0xffff,0xffff,0xD844,0xD845,0xffff,0xD845,0xD845,0xD845,0xD845,
+ 0xD845,0xD846,0xD846,0xD846,0xD846,
+ 1, /* first low-surrogate */
+ 0xDCCA, 0,0xDCA0,0xDCA1,0xDDCC,0xDDCD,0xDEF1,0xDED7,0xDC42,
+ 0xDC46,0xDCA3,0xDCA5,0xDCA6,0xDECB,0xDECC,0xDF26,0xDF27,0xDF28,0xDF29,
+ 0xDCAE,0xDCAF,0xDCB0,0xDD73, 0,0xDD7C,0xDD74, 0,0xDF80,0xDD75,
+ 0, 0,0xDFCF, 0,0xDF8F,0xDE70,0xDC85,0xDF97,0xDFF6,0xDFF7,
+ 0xDFF8,0xDFFA,0xDFFB,0xDCBA,0xDCBB,0xDCBC,0xDCBD,0xDD34,0xDD35,0xDDA2,
+ 0xDE14,0xDE11,0xDE6E,0xDE6F,0xDC08,0xDCB8,0xDE09,0xDEBD,0xDEBE,0xDF88,
+ 0xDFFE, 0,0xDFFF,0xDC00,0xDC01,0xDC02,0xDC03,0xDC04,0xDC05,0xDC06,
+ 0,0xDC07,0xDC08,0xDC09,0xDC0A,0xDC0B,0xDC0C,0xDC0D,0xDC0E,0xDC0F,
+ 0, 0, 0,0xDE2C,0xDC6B, 0,0xDC6C,0xDC87,0xDC6D,0xDD78,
+ 0xDE8B,0xDCA4,0xDCA5,0xDCA6,0xDCA7,
+ /* plane 15, row 52 */
+ 1 | (94 << 8), /* first, last */
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xffff,
+ 0x372C,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD85F,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD847,0xD847,0xD848,
+ 0xffff,0xD848,0xD848,0xD848,0xD848,0x5F5C,0xD849,0xD849,0xD841,0xD84A,
+ 0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xffff,0xD84A,
+ 0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0x65D9,0xD84C,
+ 0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xffff,0xD84C,0xD84C,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD87E,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0x6A72,0xD84D,0xD84D,0xD84D,
+ 1, /* first low-surrogate */
+ 0xDCBE,0xDCA8,0xDCA9,0xDCAA,0xDC8D,0xDCAB,0xDCAC,0xDCBF, 0,
+ 0,0xDCAD,0xDCAE,0xDDA4,0xDDA5,0xDEC7,0xDEC8,0xDEC9,0xDDBC,0xDECA,
+ 0xDECB,0xDECC,0xDECD,0xDECE,0xDC19,0xDCE6,0xDF4C,0xDF4D,0xDF4E,0xDC06,
+ 0,0xDECD,0xDECE,0xDECF,0xDED0, 0,0xDD81,0xDD82,0xDD33,0xDC6A,
+ 0xDC6B,0xDCB2,0xDC6C,0xDC6D,0xDCCC,0xDCAE,0xDCB3,0xDC91, 0,0xDC6E,
+ 0xDCB4,0xDC6F,0xDDC9,0xDDA7,0xDDA8,0xDDA9,0xDDAA,0xDDAB,0xDDAC,0xDDAD,
+ 0xDDAE,0xDDAF,0xDDB0,0xDD60,0xDDB1,0xDEE1,0xDFE3,0xDFF6, 0,0xDEAF,
+ 0xDEB0,0xDEB1,0xDEBA,0xDEB2,0xDEB3,0xDF4C, 0,0xDFA0,0xDFA1,0xDEB0,
+ 0xDEB1,0xDEB2,0xDEB3,0xDEB4,0xDCEB,0xDEB5,0xDEB6,0xDEB7,0xDEB8,0xDEB9,
+ 0xDEBA, 0,0xDEBB,0xDEBC,0xDEBD,
+ /* plane 15, row 53 */
+ 1 | (93 << 8), /* first, last */
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x6A78,
+ 0xffff,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x6B5A,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD84F,0xD850,0xD850,0xD84F,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD84F,0xD84F,0xD87E,0xD850,0xD87E,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD864,0xD850,
+ 0xD850,0xD850,0xD850,0xD851,0xD850,0xD850,0xffff,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD851,0xD844,0xD852,0xD841,0xD852,0xD852,0xD852,
+ 0x3EFB,0xD852,0xD852,0xD852,
+ 1, /* first low-surrogate */
+ 0xDEBE,0xDEBF,0xDEDF,0xDEC0,0xDEC1,0xDEC2,0xDEC3,0xDEC4, 0,
+ 0,0xDEC5,0xDEC6,0xDEC7,0xDEC8,0xDEC9,0xDECA,0xDF3C,0xDECB,0xDECC,
+ 0xDECD,0xDECE,0xDECF,0xDED0,0xDED1, 0,0xDD1D,0xDD1E,0xDE64,0xDE65,
+ 0xDEC5,0xDEC6,0xDEC7,0xDEFF,0xDFFF,0xDC00,0xDC01,0xDC02,0xDFF5,0xDC5C,
+ 0xDFF6,0xDFF7,0xDFB0,0xDFF8,0xDFF9,0xDC5D,0xDC50,0xDFFA,0xDFFB,0xDFA2,
+ 0xDFFC,0xDFFD,0xDFFE,0xDFFF,0xDD13,0xDC00,0xDD1F,0xDFC1,0xDFC2,0xDFC3,
+ 0xDFC4,0xDFC5,0xDFC6,0xDFC7,0xDFC8,0xDFC9,0xDFCA,0xDFCB,0xDCEF,0xDFD7,
+ 0xDFCC,0xDFCD,0xDFCE,0xDC22,0xDFCF,0xDFD0, 0,0xDFD1,0xDFD2,0xDFE9,
+ 0xDFD3,0xDFD4,0xDFD5,0xDD38,0xDC3B,0xDC7D,0xDD6F,0xDCA1,0xDE53,0xDE54,
+ 0,0xDE55,0xDE3C,0xDE56,
+ /* plane 15, row 54 */
+ 1 | (94 << 8), /* first, last */
+ 0xD852,0x3EFC,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xffff,0xffff,0xD852,0xD852,0xD852,0xD852,0xD852,0xD853,0xD853,0xD868,
+ 0xD853,0xD853,0xD854,0xD854,0xD854,0xD854,0xD854,0xD854,0xD87E,0xD854,
+ 0xffff,0xD854,0xffff,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xffff,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD857,0xD857,0xffff,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,
+ 1, /* first low-surrogate */
+ 0xDE66, 0,0xDE57,0xDE58,0xDE59,0xDE5A,0xDE5B,0xDE67,0xDE5C,
+ 0, 0,0xDE6A,0xDE5D,0xDE3D,0xDE5E,0xDE65,0xDCE1,0xDCCD,0xDC11,
+ 0xDE6F,0xDE70,0xDC1A,0xDC9A,0xDC9B,0xDC9C,0xDC9E,0xDC9F,0xDD3F,0xDE8E,
+ 0,0xDFFD, 0,0xDD5E,0xDD5F,0xDD60,0xDD65,0xDD67,0xDD68,0xDD69,
+ 0,0xDD6A,0xDD8F,0xDD6B,0xDD6C,0xDD6D,0xDEF7,0xDEF8,0xDEF9,0xDEE4,
+ 0xDEFA,0xDCB1,0xDC75,0xDC76,0xDDFF,0xDE00,0xDE01,0xDE02,0xDE03,0xDEAE,
+ 0xDEAD,0xDC51,0xDC52, 0,0xDC53,0xDC54,0xDC55,0xDC56,0xDC57,0xDC58,
+ 0xDC59,0xDC5A,0xDC5B,0xDC5C,0xDC5D,0xDC5E,0xDC5F,0xDC60,0xDC61,0xDC62,
+ 0xDC63,0xDC64,0xDC4C,0xDC66,0xDEF1,0xDEF2,0xDCF2,0xDCF3,0xDCF4,0xDCF5,
+ 0xDCF6,0xDCF7,0xDCF8,0xDCF9,0xDCFA,
+ /* plane 15, row 55 */
+ 1 | (94 << 8), /* first, last */
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD87E,0xD87E,0xD859,
+ 0xD859,0xD859,0xD859,0xD859,0xD859,0xD859,0xffff,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xffff,0xD87E,
+ 0xffff,0xD85B,0xD85B,0xffff,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xffff,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xffff,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 1, /* first low-surrogate */
+ 0xDE4C,0xDE4B,0xDF1B,0xDFCE,0xDFB3,0xDC7F,0xDD79,0xDD7C,0xDD1A,
+ 0xDDC4,0xDDC5,0xDDC6,0xDDC7,0xDDC8,0xDDC9, 0,0xDC19,0xDC1C,0xDC1A,
+ 0xDD4C,0xDD8E,0xDE7E,0xDEEB,0xDEEC,0xDEED,0xDEEE,0xDEEF,0xDEF0,0xDEF1,
+ 0xDED8,0xDED9,0xDEDA,0xDEDB,0xDEF2,0xDEF3,0xDEF4,0xDF07, 0,0xDDAC,
+ 0,0xDEF5,0xDF15, 0,0xDEF6,0xDEF7,0xDEF8,0xDEF9,0xDEFA,0xDEFB,
+ 0xDEFC,0xDEFD,0xDEFE,0xDFA7,0xDEFF,0xDF00,0xDF01,0xDF02,0xDF03,0xDF04,
+ 0xDF05,0xDDE9,0xDDEA,0xDDEB,0xDFDE,0xDFDF, 0,0xDFE0,0xDFE1,0xDFE2,
+ 0xDFE3,0xDF3E,0xDF3F,0xDF40,0xDF41,0xDC71,0xDC72,0xDC73,0xDE88,0xDE89,
+ 0xDE8A,0xDE8B,0xDE8C,0xDE8D,0xDE8E,0xDE8F,0xDE90,0xDE91,0xDE92, 0,
+ 0xDCF1,0xDDBE,0xDDBF,0xDDC0,0xDDC1,
+ /* plane 15, row 56 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xffff,0xffff,0xD860,0xD860,0x8EBE,
+ 0xD860,0xffff,0xD860,0xD860,0xD860,0xD860,0xD860,0xD861,0xD861,0xD861,
+ 0xD861,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0x933B,0xD862,0xD862,0xD862,0xFA28,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0x9340,0xD862,0xD862,0xD862,0x933A,0xD862,0xffff,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xffff,0xD862,0xD862,0xD863,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,
+ 0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD864,0xD87E,0xD865,
+ 0xD865,0xffff,0xD865,0xD865,0xD865,
+ 1, /* first low-surrogate */
+ 0xDDC2,0xDDC3,0xDE6E,0xDF37,0xDF57,0xDF38,0xDF39,0xDF3A,0xDF3B,
+ 0xDF3C,0xDF3D,0xDF3E,0xDF27,0xDF3F, 0, 0,0xDCC0,0xDCC1, 0,
+ 0xDE67, 0,0xDE68,0xDF58,0xDF65,0xDF59,0xDF5A,0xDC24,0xDDCD,0xDDCE,
+ 0xDDCF,0xDDD2,0xDF9F,0xDF22,0xDC7D,0xDC7E,0xDDFF,0xDE25,0xDE00,0xDE01,
+ 0,0xDE02,0xDE03,0xDE04, 0,0xDE05,0xDE06,0xDE07,0xDE16,0xDE08,
+ 0xDE17,0xDE09,0xDE0A, 0,0xDE0B,0xDE0C,0xDE29, 0,0xDE0D, 0,
+ 0xDE0E,0xDE10,0xDE11,0xDE1D,0xDE12,0xDE13, 0,0xDE14,0xDE15,0xDC8D,
+ 0xDD54,0xDD55,0xDD56,0xDF33,0xDF34,0xDF35,0xDF36,0xDFFA,0xDCE3,0xDCE6,
+ 0xDCED,0xDCE7,0xDCE8,0xDCE9,0xDCEA,0xDCEB,0xDE27,0xDE20,0xDDF8,0xDC2A,
+ 0xDCC9, 0,0xDCCA,0xDCCB,0xDCD9,
+ /* plane 15, row 57 */
+ 1 | (94 << 8), /* first, last */
+ 0xD865,0xD865,0xD865,0xffff,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD87E,0xD866,
+ 0xD867,0xD867,0xD867,0xD867,0x9B96,0xD867,0xD867,0xffff,0xffff,0xD867,
+ 0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD840,
+ 0xD841,0xD841,0xD841,0xD841,0xD841,0xD87E,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD841,0xD841,0xD842,0xD842,0xD842,0xD844,0xD844,0xD844,
+ 0xffff,0xffff,0xD844,0xD844,0xD844,0xD844,0xD844,0xffff,0xD845,0xD845,
+ 0xD845,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xffff,0xD847,
+ 0xD847,0xD847,0xD848,0xffff,0xD848,
+ 1, /* first low-surrogate */
+ 0xDCCC,0xDCCD,0xDCCE, 0,0xDDE1,0xDF1B,0xDF1C,0xDF1D,0xDF1E,
+ 0xDC47,0xDCD1,0xDCC9,0xDED0,0xDED1,0xDF3F,0xDF40,0xDF41,0xDE09,0xDF42,
+ 0xDCC4,0xDD9B,0xDD92,0xDD93, 0,0xDD94,0xDD95, 0, 0,0xDFF3,
+ 0xDFF4,0xDFF5,0xDFF6,0xDE60,0xDE9E,0xDEA0,0xDEA1,0xDF1C,0xDF9F,0xDC56,
+ 0xDC12,0xDC1F,0xDC15,0xDC16,0xDC17,0xDC0C,0xDC18,0xDCC2,0xDCC3,0xDCC4,
+ 0xDDA1,0xDE1B,0xDE1C,0xDE71,0xDC13,0xDF17,0xDF8F,0xDC5F,0xDC60,0xDCAC,
+ 0, 0,0xDC61,0xDC62,0xDC63,0xDC64,0xDC65, 0,0xDC99,0xDC9A,
+ 0xDC9B,0xDC9C,0xDC9D,0xDC9E,0xDC9F,0xDCA0,0xDCDA,0xDCDB,0xDCDC,0xDCDD,
+ 0xDCDE,0xDCDF,0xDED5,0xDED6,0xDED7,0xDED8,0xDEE0,0xDFB4, 0,0xDF6E,
+ 0xDF6F,0xDF70,0xDD63, 0,0xDED5,
+ /* plane 15, row 58 */
+ 1 | (94 << 8), /* first, last */
+ 0xD848,0xD848,0xD848,0xD849,0xD84A,0xD84A,0xD84A,0xD84A,0x39A0,
+ 0xD84A,0xD84A,0xffff,0xD84A,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD84B,0xD84B,0xD87E,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xD84C,0xD840,0xD84D,0xD84D,0xffff,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD84E,0xD858,0xD84E,0xD84F,0xD84F,
+ 0xD84F,0xD84F,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xffff,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD851,0xD851,0x71F5,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,
+ 1, /* first low-surrogate */
+ 0xDED6,0xDED7,0xDED8,0xDC30,0xDCB5,0xDCB6,0xDCC1,0xDCF7, 0,
+ 0xDCCB,0xDCE8, 0,0xDCE9,0xDCB7,0xDE15,0xDDE6,0xDDE7,0xDDE8,0xDDE9,
+ 0xDDEA,0xDDEB,0xDCCA,0xDC0B,0xDC0C,0xDC64,0xDED4,0xDED5,0xDED6,0xDED8,
+ 0xDFA5,0xDC5B,0xDF0F,0xDF10, 0,0xDF11,0xDF12,0xDF13,0xDF14,0xDF15,
+ 0xDF16,0xDF17,0xDF18,0xDF19,0xDF1A,0xDF2F,0xDF1B,0xDF1C,0xDF3F,0xDF1D,
+ 0xDF1E,0xDF2C,0xDF1F,0xDD24,0xDDA4,0xDDA5,0xDE51,0xDEFE,0xDC11,0xDC12,
+ 0xDC13,0xDC54,0xDC5E,0xDC21,0xDC3F,0xDC40,0xDC41,0xDC42,0xDC43,0xDC44,
+ 0xDC20,0xDC45, 0,0xDC46,0xDCB0,0xDC47,0xDC57,0xDC01,0xDCB1,0xDC5A,
+ 0xDC48,0xDC04,0xDC05, 0,0xDC4F,0xDC50,0xDC06,0xDC07,0xDC08,0xDC09,
+ 0xDC0A,0xDC0B,0xDC0C,0xDC0D,0xDC0E,
+ /* plane 15, row 59 */
+ 1 | (94 << 8), /* first, last */
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,
+ 0xD852,0xD852,0xD852,0x3F01,0xD852,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD853,0xD853,0xffff,0xffff,0xD854,0xD854,0xffff,
+ 0xD854,0xD854,0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD855,0xffff,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,
+ 0xD855,0xD856,0xD856,0xD856,0xD856,0xD856,0xD856,0x7A50,0xD856,0xD856,
+ 0xD856,0xD857,0xD857,0x7C14,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xffff,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,
+ 1, /* first low-surrogate */
+ 0xDC0F,0xDC10,0xDC11,0xDD33,0xDD34,0xDD35,0xDDFC,0xDDFD,0xDCB0,
+ 0xDCB1,0xDCB2,0xDCB3, 0,0xDE7B,0xDE7C,0xDE7D,0xDE7E,0xDE7F,0xDE80,
+ 0xDE81,0xDE82,0xDFF9,0xDCDA,0xDEA1, 0, 0,0xDCAD,0xDCAE, 0,
+ 0xDEC8,0xDEC9,0xDECA,0xDD82,0xDD83,0xDD84,0xDD85,0xDD86,0xDD87,0xDD88,
+ 0xDD89,0xDD8A, 0,0xDF07,0xDF08,0xDF01,0xDF09,0xDF02,0xDF0A,0xDF0B,
+ 0xDF0C,0xDCA7,0xDC98,0xDC99,0xDC9A,0xDC9B,0xDC9C, 0,0xDC9D,0xDE1A,
+ 0xDEB2,0xDCB0,0xDCB1, 0,0xDCB2,0xDCB3,0xDCB4,0xDCB5,0xDCB6,0xDCC0,
+ 0xDCB7,0xDCB8,0xDCB9,0xDCBA,0xDD1D,0xDF0C,0xDF0D,0xDF0E,0xDF35,0xDF0F,
+ 0xDF10,0xDF11,0xDF12,0xDD22,0xDD23,0xDD24, 0,0xDD25,0xDD26,0xDD27,
+ 0xDD28,0xDD29,0xDD2A,0xDD2B,0xDD2C,
+ /* plane 15, row 60 */
+ 1 | (94 << 8), /* first, last */
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xD859,
+ 0xD859,0xD859,0xD859,0xD87E,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xffff,0xD85B,0xD85B,0xD85B,0xD85C,
+ 0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xffff,
+ 0xD85D,0xD85D,0xD85D,0xD849,0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xffff,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0x481A,0xD860,
+ 0xD860,0xD860,0xD860,0xD860,0xD861,
+ 1, /* first low-surrogate */
+ 0xDD2D,0xDD2E,0xDE52,0xDE53,0xDF19,0xDFBF,0xDC8B,0xDC8C,0xDD23,
+ 0xDD24,0xDDF1,0xDDD8,0xDD7F,0xDC4E,0xDC4F,0xDC55,0xDC50,0xDC51,0xDC52,
+ 0xDC53,0xDC02,0xDC54,0xDCF1,0xDD24,0xDED1,0xDF7C,0xDF7D,0xDF7E,0xDF7F,
+ 0xDF80,0xDF9F,0xDF81,0xDF82,0xDF83,0xDF84,0xDF85,0xDF86,0xDF87,0xDF88,
+ 0xDF9B,0xDF89,0xDF8A,0xDF8B,0xDF8C, 0,0xDFA1,0xDF8D,0xDF8E,0xDDF3,
+ 0xDDF4,0xDDF5,0xDC24,0xDC25,0xDC26,0xDC27,0xDC28,0xDC29,0xDC2A, 0,
+ 0xDC2B,0xDDCD,0xDE01,0xDD8D,0xDF70,0xDC80,0xDC81,0xDEC0,0xDEC1,0xDEC2,
+ 0xDEC3,0xDEC4,0xDEC5,0xDEC6,0xDEC7,0xDEC8,0xDCFE, 0,0xDDD9,0xDDDC,
+ 0xDDDA,0xDE75,0xDF58,0xDF59,0xDF5A,0xDF5B,0xDF5C,0xDCEC, 0,0xDCF3,
+ 0xDE72,0xDE73,0xDF82,0xDF83,0xDC2A,
+ /* plane 15, row 61 */
+ 1 | (93 << 8), /* first, last */
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xffff,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xffff,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0x9387,0xD862,0xD862,0xD862,0xD862,
+ 0xffff,0xD862,0xD862,0x9385,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0x493C,0xffff,0xD862,0xD862,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xD864,0xffff,0xD864,0xD864,0xD864,0xD864,0xD864,
+ 0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD865,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0x9BB1,0xD867,0xD867,0xD867,
+ 0xD868,0xD868,0xD868,0xD868,
+ 1, /* first low-surrogate */
+ 0xDC2B,0xDC2C,0xDC2D,0xDDF6,0xDE00,0xDDF7,0xDDF8,0xDDF9, 0,
+ 0xDC94,0xDC95,0xDC96,0xDD1B,0xDE86,0xDE4C,0xDE4D,0xDE83, 0,0xDE82,
+ 0xDE4E,0xDE4F,0xDE50,0xDE51,0xDE81, 0,0xDE52,0xDE53,0xDE54,0xDE55,
+ 0,0xDE56,0xDE57, 0,0xDE58,0xDE5B,0xDE5C,0xDE5D,0xDE5E,0xDE5F,
+ 0xDE60,0xDE61,0xDE7C,0xDE62, 0, 0,0xDE63,0xDE64,0xDD73,0xDF45,
+ 0xDF46,0xDF47,0xDF4C,0xDC12, 0,0xDC13,0xDD39,0xDD03,0xDD0D,0xDE30,
+ 0xDED5,0xDFC0,0xDCF2,0xDCF3,0xDCF4,0xDCF5,0xDCF6,0xDCF7,0xDDFA,0xDDFB,
+ 0xDF45,0xDF46,0xDC49,0xDCE7,0xDCE8,0xDED8,0xDED9,0xDF55,0xDF56,0xDF57,
+ 0xDCDA,0xDCDB,0xDCDC,0xDDB8,0xDDB9,0xDDBA, 0,0xDDBB,0xDF89,0xDDBC,
+ 0xDC30,0xDC31,0xDC32,0xDC33,
+ /* plane 15, row 62 */
+ 1 | (94 << 8), /* first, last */
+ 0xD868,0xD868,0xD868,0x9D47,0xD868,0xD868,0xD868,0xD868,0xD868,
+ 0xD869,0xffff,0xD841,0xffff,0xD841,0xD841,0xD841,0xD841,0xD841,0xD841,
+ 0xD841,0xD841,0xD842,0xD842,0xD842,0xD842,0xD842,0xD842,0xD844,0xD844,
+ 0xD844,0xD844,0xD844,0xffff,0xffff,0xD844,0xD844,0xD844,0xD844,0xD845,
+ 0xD845,0xD845,0xD844,0xD845,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD848,0xD848,
+ 0xD848,0xD849,0xD849,0xD84A,0xD84A,0xffff,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xD87E,0xD84B,0xD84B,0x3A6B,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xD84C,
+ 0xffff,0xD84C,0xD84C,0xD84D,0xD84D,
+ 1, /* first low-surrogate */
+ 0xDC34,0xDC35,0xDC36, 0,0xDC37,0xDEB2,0xDF90,0xDF26,0xDFA2,
+ 0xDC38, 0,0xDC2E, 0,0xDC2F,0xDC30,0xDC2A,0xDC2B,0xDCC9,0xDD37,
+ 0xDE20,0xDE72,0xDC1F,0xDD65,0xDDCA,0xDEC0,0xDEC1,0xDEC2,0xDCB7,0xDCB8,
+ 0xDCB9,0xDCBA,0xDCBB, 0, 0,0xDCBC,0xDCBD,0xDCBE,0xDCF2,0xDCB5,
+ 0xDCB7,0xDCB8,0xDCDF,0xDCB9,0xDCD5,0xDCBA,0xDCBB,0xDD4A,0xDCF2,0xDCF3,
+ 0xDCF4,0xDCFA,0xDCF5,0xDD02,0xDEE2,0xDEE3,0xDF8E,0xDF8B,0xDEE4,0xDEEB,
+ 0xDEE5,0xDC35,0xDD93,0xDCEA,0xDCEB, 0,0xDCEC,0xDCED,0xDD17,0xDCEE,
+ 0xDCEF,0xDCF0,0xDE0E,0xDE0F,0xDE10,0xDE19,0xDE18,0xDE11,0xDE12,0xDE13,
+ 0xDCC7,0xDE14,0xDE15, 0,0xDE16,0xDC65,0xDEEA,0xDEEB,0xDEEC,0xDEED,
+ 0,0xDEEE,0xDFAC,0xDFC2,0xDF69,
+ /* plane 15, row 63 */
+ 1 | (94 << 8), /* first, last */
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0x3BF4,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84F,0xD84F,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xffff,0xD850,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD851,
+ 0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD852,0xD852,0xD852,0xffff,0xD852,0xD852,0xD852,0xD852,0xD852,
+ 0xD852,0xD862,0xD852,0xD852,0xD852,0xD853,0xD854,0xD854,0xD854,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xD856,0xD856,
+ 0xD856,0xD856,0xD856,0xD846,0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,
+ 1, /* first low-surrogate */
+ 0xDF81,0xDF6A,0xDF6B,0xDF6C,0xDF6D,0xDF6E,0xDF6F,0xDF70, 0,
+ 0xDF71,0xDF72,0xDF73,0xDF8C,0xDF74,0xDF75,0xDF76,0xDC24,0xDC2A,0xDC8E,
+ 0xDCAF,0xDC8F,0xDC90,0xDC91, 0,0xDC92,0xDC93,0xDC94,0xDC95,0xDC96,
+ 0xDC97,0xDC98,0xDC99,0xDC9A,0xDC9B,0xDC9C,0xDC39,0xDC3B,0xDC3A,0xDC3C,
+ 0xDC3D,0xDC3E,0xDC3F,0xDC70,0xDC40,0xDC41,0xDCC0,0xDCC1,0xDEA4,0xDE97,
+ 0xDEA5,0xDE98,0xDE99,0xDE9A, 0,0xDE9B,0xDEA6,0xDE9C,0xDE9D,0xDE9E,
+ 0xDE9F,0xDECE,0xDEC8,0xDEA0,0xDF19,0xDC0D,0xDCBF,0xDEE9,0xDEEA,0xDDA2,
+ 0xDDA3,0xDDA4,0xDDA5,0xDDA6,0xDF15,0xDF17,0xDCBF,0xDCC0,0xDCC1,0xDCC2,
+ 0xDCC3,0xDCC4,0xDCC5,0xDD0D,0xDE23,0xDEBE,0xDD03,0xDD04,0xDD05,0xDD06,
+ 0xDD07,0xDD08,0xDD09,0xDD0A,0xDD0B,
+ /* plane 15, row 64 */
+ 1 | (94 << 8), /* first, last */
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xffff,0xD857,0xD857,0xD857,
+ 0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,0xD858,
+ 0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD859,0xD85A,0xD85A,0xD85A,
+ 0xffff,0xffff,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xffff,0x455C,0xD85B,0xD85B,0xD85B,
+ 0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,0xD85B,
+ 0xD85C,0xD87E,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xffff,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85E,0xD85E,0xD85E,
+ 0xD85E,0xD85E,0xD85E,0xffff,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0x4787,0xD85F,0xD85F,0xD85F,0xD860,
+ 1, /* first low-surrogate */
+ 0xDD0C,0xDD20,0xDD0D,0xDD0E,0xDD0F, 0,0xDF26,0xDF27,0xDF28,
+ 0xDD5D,0xDD5E,0xDD5F,0xDD60,0xDD61,0xDD62,0xDD63,0xDD64,0xDD65,0xDE57,
+ 0xDFCF,0xDFD0,0xDC99,0xDC9A,0xDDEA,0xDDEB,0xDDEC,0xDC7E,0xDC7F,0xDC80,
+ 0, 0,0xDC81,0xDC82,0xDCF3,0xDD25,0xDD9F,0xDDA0,0xDDF3,0xDE00,
+ 0xDFEB,0xDFEC,0xDFED,0xDFEE,0xDFEF, 0, 0,0xDFF0,0xDFF1,0xDFF2,
+ 0xDFF3,0xDFF4,0xDFF5,0xDFF9,0xDFFA,0xDFFB,0xDFFC,0xDFFD,0xDFFE,0xDFFF,
+ 0xDC00,0xDDAE,0xDC01,0xDC02,0xDE03,0xDC86,0xDC79, 0,0xDC7A,0xDC7B,
+ 0xDC7C,0xDC84,0xDC7D,0xDC7E,0xDC7F,0xDF86,0xDF87,0xDC00,0xDC01,0xDC88,
+ 0xDC89,0xDC8A,0xDEF5, 0,0xDF25,0xDEF6,0xDDEB,0xDDEC,0xDDED,0xDDEE,
+ 0,0xDDEF,0xDDF0,0xDF6C,0xDD21,
+ /* plane 15, row 65 */
+ 1 | (94 << 8), /* first, last */
+ 0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD861,0xD861,0xD861,0xD862,0xD862,0xD862,0xD862,0xD862,0x93B9,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xffff,0xD862,0xD862,
+ 0xD862,0xffff,0xD862,0xD862,0xD862,0x93BF,0xD862,0xD862,0xD862,0xD863,
+ 0xD863,0xD863,0xD87E,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,
+ 0xffff,0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,
+ 0xD866,0xD866,0xD866,0xffff,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,
+ 0xffff,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,
+ 0xD867,0xD867,0x9BCF,0xD867,0xD868,0xD868,0xD851,0x9D64,0xD868,0xD868,
+ 0xD868,0xD868,0x9EBF,0xD869,0xD841,
+ 1, /* first low-surrogate */
+ 0xDD22,0xDD23,0xDD24,0xDD25,0xDD26,0xDE7B,0xDE7C,0xDF91,0xDF92,
+ 0xDF93,0xDE0E,0xDE0F,0xDE10,0xDCB3,0xDD36,0xDEC6,0xDEA1,0xDEA2, 0,
+ 0xDEA3,0xDECC,0xDEA4,0xDEA5,0xDEA6,0xDECB,0xDEA7, 0,0xDEA8,0xDEA9,
+ 0xDEAA, 0,0xDEAB,0xDEAC,0xDEAD, 0,0xDEAE,0xDEAF,0xDEB0,0xDD8C,
+ 0xDD8D,0xDD8E,0xDDF1,0xDD92,0xDD8F,0xDF52,0xDF53,0xDF54,0xDF55,0xDD29,
+ 0,0xDEF3,0xDEF4,0xDD0D,0xDD0E,0xDD0F,0xDD10,0xDE14,0xDF71,0xDF72,
+ 0xDD0F,0xDD04,0xDD06, 0,0xDD07,0xDEDC,0xDEDD,0xDF6D,0xDF79,0xDF6E,
+ 0,0xDCEC,0xDDDD,0xDDDE,0xDDDF,0xDDE0,0xDDE1,0xDDE2,0xDDE3,0xDDE4,
+ 0xDE3A,0xDDE5, 0,0xDDE6,0xDC6B,0xDC6C,0xDC4E, 0,0xDEBD,0xDEBE,
+ 0xDEBF,0xDF34, 0,0xDD12,0xDC40,
+ /* plane 15, row 66 */
+ 1 | (94 << 8), /* first, last */
+ 0xD841,0xD844,0xD844,0xD844,0xD844,0xD844,0xD845,0xD845,0xD845,
+ 0xD846,0xD846,0xD846,0xD846,0xD846,0xD846,0xD847,0xD847,0xD847,0xD848,
+ 0xD848,0xD848,0xD848,0xffff,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,0xD84A,
+ 0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,0xD84B,
+ 0xffff,0xD84B,0xD84C,0xD84C,0xD84C,0xD84C,0xffff,0xD84D,0xffff,0xffff,
+ 0xD84D,0x3C07,0xD84D,0xffff,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,0xD84E,0xD84E,0xD850,0xD850,
+ 0xD850,0xD850,0xD850,0xD850,0xD850,0xffff,0xD850,0xD850,0xD850,0xD850,
+ 0xD850,0xD850,0xffff,0xffff,0xD851,0xD851,0xD851,0xD851,0x3F05,0xD852,
+ 0xD852,0x3F06,0xD852,0xD852,0xD852,
+ 1, /* first low-surrogate */
+ 0xDC41,0xDD02,0xDD03,0xDD04,0xDD05,0xDD06,0xDCD7,0xDCCC,0xDE98,
+ 0xDD06,0xDD07,0xDDAF,0xDDB0,0xDEEA,0xDEF2,0xDFA2,0xDFA3,0xDFA4,0xDD76,
+ 0xDEF5,0xDEF6,0xDEF7, 0,0xDD3B,0xDD25,0xDD3A,0xDD3C,0xDD3D,0xDD3E,
+ 0xDE37,0xDE38,0xDE39,0xDE3A,0xDE3B,0xDE3C,0xDE3D,0xDE3E,0xDE3F,0xDE4B,
+ 0,0xDE40,0xDC22,0xDC67,0xDCD3,0xDEFA, 0,0xDFBC, 0, 0,
+ 0xDFA5, 0,0xDFB6, 0,0xDFA6,0xDFBB,0xDFA7,0xDFA8,0xDFA9,0xDFAA,
+ 0xDFAB,0xDFAC,0xDFBF,0xDFAD,0xDFAE,0xDFAF,0xDD2E,0xDF00,0xDC9D,0xDC9E,
+ 0xDCCB,0xDCCC,0xDCCD,0xDCCE,0xDCCF, 0,0xDC9F,0xDCD0,0xDCD1,0xDCD2,
+ 0xDCD3,0xDCD4, 0, 0,0xDC5D,0xDC5E,0xDC5F,0xDC60, 0,0xDEBA,
+ 0xDEBC, 0,0xDEB5,0xDEBD,0xDEB6,
+ /* plane 15, row 67 */
+ 1 | (94 << 8), /* first, last */
+ 0xD852,0xD852,0xD852,0xD87E,0xD852,0xD852,0xD853,0xD854,0xD854,
+ 0xD854,0xD855,0xD855,0xD855,0xD855,0xD855,0xD856,0xD857,0xffff,0xD857,
+ 0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xffff,
+ 0xD857,0xD857,0xD858,0xD858,0xffff,0xD858,0xD858,0xD858,0xD858,0xD859,
+ 0xD859,0xD859,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,
+ 0xD85C,0xffff,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85B,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xffff,0xD85D,0xD85D,0xD85D,0x45F9,0xD85D,
+ 0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0x89B8,0xD85E,0xD85E,
+ 0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,
+ 1, /* first low-surrogate */
+ 0xDEB7,0xDEB8,0xDEA8,0xDD32,0xDFFE,0xDFFC,0xDEE1,0xDCC4,0xDCC5,
+ 0xDF14,0xDDAE,0xDDAF,0xDDB0,0xDDB1,0xDDB9,0xDCE7,0xDD46, 0,0xDD47,
+ 0xDD48,0xDD49,0xDD1E,0xDD1F,0xDD4A,0xDD4B,0xDD4C,0xDD4D,0xDD4E, 0,
+ 0xDF46,0xDF4B,0xDD90,0xDD91, 0,0xDD92,0xDD93,0xDD94,0xDE5B,0xDDF2,
+ 0xDDF8,0xDDF9,0xDC94,0xDCA4,0xDC97,0xDC98,0xDD29,0xDDAE,0xDEAF,0xDC59,
+ 0xDC5A, 0,0xDC5B,0xDC5C,0xDC5D,0xDC5E,0xDC5F,0xDC60,0xDC61,0xDFAA,
+ 0xDC62,0xDC63,0xDC64,0xDC65,0xDC66,0xDC67,0xDC68,0xDC69,0xDC6A,0xDC6B,
+ 0xDC6C,0xDC6D,0xDC6E,0xDC6F, 0,0xDCB2,0xDCB3,0xDCB4, 0,0xDCB5,
+ 0xDCB6,0xDCB7,0xDCB8,0xDCB9,0xDCBA,0xDCBB,0xDF88, 0,0xDF19,0xDF1A,
+ 0xDF1B,0xDC16,0xDE0C,0xDE0D,0xDE0E,
+ /* plane 15, row 68 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85F,0xffff,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xffff,
+ 0xD861,0xD861,0xD861,0xD861,0xD861,0xffff,0xffff,0xD862,0xD862,0xD862,
+ 0x4953,0xD862,0xD862,0xffff,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,
+ 0xD863,0xD863,0xD863,0xffff,0xD863,0xffff,0xD864,0xD864,0xD864,0xffff,
+ 0xD864,0xD864,0xD865,0xD865,0xD865,0xD865,0xD865,0xD865,0xffff,0xD866,
+ 0xD866,0xD866,0xffff,0xD866,0xD866,0xD866,0xffff,0xD866,0xD867,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0x9BF3,0xD867,0xffff,0xD867,0xD867,
+ 0xD867,0xD867,0x4C69,0xffff,0xD868,0x4CE5,0xD868,0xD868,0xffff,0xD868,
+ 0xD841,0xD841,0xD842,0xD844,0xD844,
+ 1, /* first low-surrogate */
+ 0xDE0F, 0,0xDF83,0xDF84,0xDF85,0xDE83,0xDE84,0xDFB0, 0,
+ 0xDE26,0xDE27,0xDE36,0xDE28,0xDE29, 0, 0,0xDEE7,0xDEE8,0xDEE9,
+ 0,0xDEEA,0xDEEB, 0,0xDEEC,0xDEED,0xDEEE,0xDEEF,0xDEF0,0xDEF1,
+ 0xDF0C,0xDEF2,0xDEF3,0xDEF4,0xDEF5,0xDEF6,0xDEF7,0xDEF8,0xDDA3,0xDDA4,
+ 0xDDA5,0xDDA6,0xDDA7, 0,0xDF5C, 0,0xDD4B,0xDDE1,0xDF15, 0,
+ 0xDF16,0xDF17,0xDD2C,0xDD2D,0xDE22,0xDE23,0xDF96,0xDF97, 0,0xDD2E,
+ 0xDD30,0xDD31, 0,0xDEDF,0xDF8B,0xDF8C, 0,0xDF8D,0xDCFC,0xDCFD,
+ 0xDCFE,0xDCFF,0xDE17,0xDE2D,0xDE18, 0,0xDE19, 0,0xDE12,0xDE1A,
+ 0xDE1B,0xDE1C, 0, 0,0xDC97, 0,0xDC98,0xDC99, 0,0xDFC4,
+ 0xDC4F,0xDCCD,0xDEC7,0xDD1C,0xDD1D,
+ /* plane 15, row 69 */
+ 1 | (94 << 8), /* first, last */
+ 0xD844,0xD845,0xD845,0xD845,0xD845,0xD846,0xD847,0xD847,0xD847,
+ 0xD849,0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84C,0xD84D,
+ 0xD84D,0xD84D,0xD84D,0xD84D,0xffff,0xD84D,0xD84D,0xD84D,0xD84D,0xD84D,
+ 0x3C12,0xD84D,0xffff,0xD84F,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,
+ 0xD851,0xffff,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xD851,0xffff,
+ 0xD852,0xD852,0xD852,0xD852,0xD854,0xD854,0xffff,0xffff,0xD855,0xD855,
+ 0xD855,0xD855,0xD855,0xD855,0xD856,0xD856,0xffff,0xD856,0xD856,0xD856,
+ 0xD856,0x7C4F,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,0xffff,
+ 0xD858,0xD858,0xD859,0xD859,0xD859,0xD859,0xD85A,0xffff,0xD85A,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 1, /* first low-surrogate */
+ 0xDD1E,0xDCE7,0xDCE9,0xDCEA,0xDCEB,0xDD15,0xDCF1,0xDCF2,0xDFB6,
+ 0xDDA0,0xDD4A,0xDE20,0xDE60,0xDE61,0xDE41,0xDE62,0xDF03,0xDF04,0xDFD9,
+ 0xDFDA,0xDFDB,0xDFDC,0xDFDD, 0,0xDFDE,0xDFDF,0xDFE0,0xDFE1,0xDFE2,
+ 0,0xDFE3, 0,0xDC31,0xDD05,0xDD06,0xDD07,0xDC72,0xDC8A,0xDC8B,
+ 0xDC88, 0,0xDC8C,0xDC8D,0xDC8E,0xDC8F,0xDC90,0xDD42,0xDD43, 0,
+ 0xDEC1,0xDEC2,0xDEC3,0xDEC4,0xDCCB,0xDF22, 0, 0,0xDDC3,0xDDC4,
+ 0xDDC5,0xDDC6,0xDF1E,0xDF25,0xDCF3,0xDCF4, 0,0xDCF5,0xDE38,0xDE48,
+ 0xDECA, 0,0xDD7A,0xDD7B,0xDF55,0xDF56,0xDDB1,0xDDB2,0xDDB3, 0,
+ 0xDDB4,0xDDB5,0xDCA4,0xDE00,0xDE01,0xDE02,0xDCAC, 0,0xDDB3,0xDCB6,
+ 0xDCB7,0xDCB8,0xDCB9,0xDCBA,0xDCBB,
+ /* plane 15, row 70 */
+ 1 | (94 << 8), /* first, last */
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,0xD85D,0xD85D,0xffff,0xD85D,
+ 0xD85D,0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD85F,0xD85F,0xD85F,0xD85F,0xD85F,0xD860,0xD860,0xD860,0xD860,0xD860,
+ 0xD860,0xD860,0xD860,0xD861,0xD861,0xffff,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0x9425,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD87E,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xffff,
+ 0xD862,0xD862,0xD862,0xffff,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD863,0xD863,0xD863,0xD863,0xD864,0xD864,0xffff,0xD864,0xD864,0xD864,
+ 0xD865,0xD865,0xD866,0xD866,0xD866,
+ 1, /* first low-surrogate */
+ 0xDCBC,0xDCBD,0xDCBE,0xDCBF,0xDCC0,0xDCC1,0xDCC2,0xDCC3,0xDCC4,
+ 0xDCC5,0xDCC6,0xDCC7,0xDCE3,0xDCE4,0xDCE5,0xDCE6,0xDCE7, 0,0xDFB5,
+ 0xDFA1,0xDC95,0xDF3B,0xDF3C,0xDF3D,0xDF3E,0xDC14,0xDE20,0xDE21,0xDE22,
+ 0xDE23,0xDE24,0xDF96,0xDF97,0xDF98,0xDD94,0xDD95,0xDD96,0xDD97,0xDD98,
+ 0xDE8F,0xDE90,0xDFBC,0xDC3B,0xDE3D, 0,0xDCDF,0xDD1E,0xDF23,0xDF24,
+ 0xDF49,0xDF25,0xDF26,0xDF27,0xDF28, 0,0xDF29,0xDF2A,0xDF2E,0xDF2F,
+ 0xDF4E,0xDF30,0xDDEB,0xDF31,0xDF32,0xDF33,0xDF34,0xDF35,0xDF36, 0,
+ 0xDF37,0xDF50,0xDF38, 0,0xDF39,0xDF3A,0xDF3B,0xDF3C,0xDF3D,0xDF3E,
+ 0xDDB8,0xDDB9,0xDF62,0xDF63,0xDC41,0xDD6D, 0,0xDF52,0xDF37,0xDFDB,
+ 0xDD3F,0xDE34,0xDC5B,0xDD46,0xDD5A,
+ /* plane 15, row 71 */
+ 1 | (94 << 8), /* first, last */
+ 0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,
+ 0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xffff,
+ 0xD867,0xffff,0xD868,0xD868,0xD868,0xD868,0xD868,0xD868,0xD869,0xD869,
+ 0xD869,0xD841,0xD87E,0xD841,0xD841,0xD841,0xD842,0xD842,0xffff,0xD844,
+ 0xD844,0xD845,0xD845,0xD845,0xD845,0xD846,0xD846,0xD846,0xD846,0xD847,
+ 0xD853,0xffff,0xD849,0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84E,
+ 0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xffff,0xD84F,0xD850,0xD850,0xD850,0xD850,0xffff,0xD850,0xD850,0xD850,
+ 0xD850,0xD851,0xD851,0xD851,0xD851,0xD851,0xD852,0xD853,0xD853,0xD853,
+ 0xD854,0xD854,0xD855,0xD855,0xD841,
+ 1, /* first low-surrogate */
+ 0xDD5B,0xDEE1,0xDEE2,0xDEE3,0xDEE4,0xDFA7,0xDFA8,0xDFA9,0xDD0F,
+ 0xDD2B,0xDE56,0xDE57,0xDE58,0xDE5E,0xDE59,0xDE5A,0xDE5B,0xDE5C, 0,
+ 0xDE68, 0,0xDD2C,0xDCE2,0xDCF3,0xDED2,0xDF56,0xDFCE,0xDC61,0xDE9B,
+ 0xDEB4,0xDC5C,0xDC10,0xDCD2,0xDD71,0xDE73,0xDC2C,0xDF94, 0,0xDD3F,
+ 0xDD40,0xDCF9,0xDCFA,0xDCFD,0xDCFB,0xDD1C,0xDD1D,0xDEFF,0xDF00,0xDCF7,
+ 0xDCFE, 0,0xDCB6,0xDD54,0xDE77,0xDE79,0xDE7A,0xDE7B,0xDC69,0xDC02,
+ 0xDC03,0xDC04,0xDC05,0xDC06,0xDC07,0xDC08,0xDC09,0xDC0A,0xDC0B,0xDC35,
+ 0,0xDC39,0xDD1E,0xDD1F,0xDD20,0xDD21, 0,0xDD22,0xDD23,0xDD24,
+ 0xDD2C,0xDCB3,0xDCB5,0xDCB6,0xDCB7,0xDCB8,0xDED0,0xDCFA,0xDF07,0xDFBD,
+ 0xDCD7,0xDCD2,0xDDDB,0xDDD6,0xDC5D,
+ /* plane 15, row 72 */
+ 1 | (94 << 8), /* first, last */
+ 0xD856,0xD856,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,0xD857,
+ 0xD857,0xD857,0xD858,0xD858,0xD858,0xD858,0xD859,0xD859,0xffff,0xD85A,
+ 0xD85A,0xD85A,0xD85A,0xD85A,0xD85C,0x4577,0xD85C,0xD85C,0xD85C,0xD85C,
+ 0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,
+ 0xD85D,0xD85D,0x8977,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xffff,0xD860,
+ 0xD860,0x4878,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD861,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD863,0xD863,0x95E6,0xD863,0xD863,0xD863,0xD864,0xffff,0xffff,0xD864,
+ 0xD865,0xD865,0xD865,0xD865,0xD865,
+ 1, /* first low-surrogate */
+ 0xDE43,0xDECF,0xDDA3,0xDDA4,0xDDA5,0xDDA6,0xDDA7,0xDDA8,0xDDA9,
+ 0xDF5D,0xDF5E,0xDDC9,0xDDCA,0xDDCB,0xDDCC,0xDE06,0xDE07, 0,0xDCC5,
+ 0xDCF5,0xDDB4,0xDDB8,0xDDB5,0xDCFD, 0,0xDCFE,0xDCFF,0xDD00,0xDD01,
+ 0xDD02,0xDD03,0xDD09,0xDD04,0xDD05,0xDD06,0xDD07,0xDD11,0xDD12,0xDD13,
+ 0xDD14,0xDD15, 0,0xDC98,0xDC99,0xDE3C,0xDE2D,0xDE2E, 0,0xDDBB,
+ 0xDDBC, 0,0xDC3D,0xDE47,0xDE48,0xDE49,0xDE4A,0xDFE1,0xDFE7,0xDCEB,
+ 0xDD20,0xDD38,0xDF62,0xDF67,0xDF68,0xDF69,0xDF6A,0xDF6B,0xDF6D,0xDF6E,
+ 0xDF6F,0xDF70,0xDF71,0xDF72,0xDF8F,0xDF73,0xDF74,0xDF75,0xDF76,0xDF77,
+ 0xDDC9,0xDDCA, 0,0xDDCB,0xDDCC,0xDDCD,0xDC51, 0, 0,0xDE45,
+ 0xDD59,0xDD5A,0xDD5B,0xDE40,0xDFCF,
+ /* plane 15, row 73 */
+ 1 | (94 << 8), /* first, last */
+ 0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,0xffff,0xD867,0xD867,
+ 0x9C2F,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD867,0xD868,
+ 0xD868,0xD868,0xD869,0xD869,0xD841,0xD841,0xD841,0xD841,0xD844,0xD845,
+ 0xD845,0xD846,0xD846,0xD84A,0xD84A,0xD84B,0xD84B,0xD84C,0xD84C,0xD84E,
+ 0xD84E,0xD84E,0xffff,0xD84E,0x6B0C,0xffff,0xD84E,0xD84E,0xD84E,0xD84E,
+ 0xD84F,0xD850,0xD850,0xD850,0xD851,0xD851,0xD851,0xD852,0xD852,0xD855,
+ 0xD855,0xD855,0xD856,0xD857,0xD857,0xD857,0xD857,0xD858,0xD858,0xD858,
+ 0xD858,0xD85A,0xD85C,0xffff,0xD85C,0xD85C,0xD85C,0xD85D,0xD85D,0xD85D,
+ 0xD85E,0xD85E,0xD85E,0xD85E,0xD85E,0xffff,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD860,0xffff,0xD860,0xD862,0xD862,
+ 1, /* first low-surrogate */
+ 0xDC5E,0xDD7B,0xDE93,0xDFBC,0xDD16,0xDD30, 0,0xDE8D,0xDE8E,
+ 0,0xDE8F,0xDE90,0xDE91,0xDE92,0xDE93,0xDE94,0xDE95,0xDE96,0xDD23,
+ 0xDD14,0xDEDB,0xDC0A,0xDDCE,0xDC66,0xDC68,0xDC67,0xDCD3,0xDD63,0xDD04,
+ 0xDE9E,0xDD26,0xDD2A,0xDD6C,0xDD64,0xDE8F,0xDE90,0xDC34,0xDF0E,0xDC25,
+ 0xDC26,0xDC27, 0,0xDC28, 0, 0,0xDC29,0xDC2A,0xDC2B,0xDC2C,
+ 0xDC3E,0xDD42,0xDD43,0xDD33,0xDCC1,0xDCC2,0xDCC3,0xDED6,0xDED7,0xDDE1,
+ 0xDDE2,0xDF2B,0xDED1,0xDDCC,0xDDCD,0xDDCE,0xDDCF,0xDDDE,0xDDDF,0xDDE0,
+ 0xDDE1,0xDCF6,0xDD2C, 0,0xDD54,0xDD2D,0xDD2E,0xDD41,0xDD42,0xDFC7,
+ 0xDCA0,0xDCA1,0xDF70,0xDF71,0xDF72, 0,0xDE34,0xDE35,0xDE36,0xDFA6,
+ 0xDDCC, 0,0xDE99,0xDCF4,0xDF9B,
+ /* plane 15, row 74 */
+ 1 | (94 << 8), /* first, last */
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,
+ 0xD862,0xD862,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD865,
+ 0xD865,0xD865,0xffff,0xD865,0xD866,0xD866,0xD866,0xD866,0xD866,0xD867,
+ 0x9C47,0x4C88,0xD867,0xD867,0xD867,0xD867,0xD868,0xD868,0xD868,0xD868,
+ 0xD868,0xD868,0xffff,0xD841,0xD841,0xD844,0xD848,0xD848,0xD84A,0xD84A,
+ 0xD84A,0xD84A,0xD84B,0xD84B,0xD84B,0xD84E,0xD84E,0xD84E,0xD84E,0xD850,
+ 0xD850,0xD850,0xffff,0xD851,0xD851,0xD852,0xD852,0xD852,0xD853,0xD855,
+ 0x7936,0xD855,0xD856,0xD857,0xD857,0xD858,0xD859,0xD85C,0xD85C,0xD85C,
+ 0xD85D,0xD85D,0xD85D,0xffff,0xD85E,0xD85E,0xD85F,0xD85F,0xD85F,0xD85F,
+ 0xD862,0xffff,0xD862,0xD862,0xD862,
+ 1, /* first low-surrogate */
+ 0xDF9E,0xDF9F,0xDFA0,0xDFA1,0xDFA2,0xDFA3,0xDFA4,0xDFA5,0xDFA6,
+ 0xDFA7,0xDFA8,0xDDDB,0xDDDC,0xDDDD,0xDDD7,0xDDDE,0xDDDF,0xDC59,0xDC46,
+ 0xDD65,0xDE49, 0,0xDFDD,0xDD95,0xDD96,0xDD97,0xDFD4,0xDFD6,0xDD26,
+ 0, 0,0xDEC8,0xDEC5,0xDEC6,0xDEC7,0xDD51,0xDD52,0xDD53,0xDD54,
+ 0xDD55,0xDEDE, 0,0xDC6D,0xDCD5,0xDD72,0xDDAE,0xDF0F,0xDD6B,0xDD6D,
+ 0xDD6E,0xDD78,0xDE98,0xDE99,0xDE9A,0xDC44,0xDC5C,0xDC45,0xDF01,0xDD58,
+ 0xDD59,0xDD5A, 0,0xDCD9,0xDCD6,0xDEDA,0xDEDF,0xDEDB,0xDD03,0xDDEF,
+ 0,0xDF33,0xDED2,0xDDE1,0xDF6F,0xDE64,0xDE0E,0xDD50,0xDD51,0xDD52,
+ 0xDD56,0xDD57,0xDD58, 0,0xDF81,0xDF82,0xDC1D,0xDC1E,0xDE43,0xDFAA,
+ 0xDCFD, 0,0xDFC6,0xDFC7,0xDFD9,
+ /* plane 15, row 75 */
+ 1 | (94 << 8), /* first, last */
+ 0xD862,0xffff,0xD862,0xD862,0xD862,0xD862,0xD862,0xffff,0xD862,
+ 0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,0xD863,0xD864,
+ 0xD864,0xD865,0xffff,0xffff,0xD866,0xD866,0xD866,0xD866,0xD867,0xD867,
+ 0xD867,0xD867,0xD868,0xD841,0xD841,0xD844,0xD845,0xD846,0xD846,0xD84A,
+ 0xD84A,0xD84B,0xD84B,0xD84B,0xD84B,0xD84C,0xD84E,0xD84E,0xD84E,0x6B15,
+ 0xD84E,0xD84E,0xD84E,0xD852,0xD852,0xD856,0xD856,0xD856,0xD857,0xD857,
+ 0xD857,0xD858,0xD859,0xD859,0xD85C,0xD85C,0xffff,0xD85C,0xD85E,0xD85E,
+ 0xD85E,0xD860,0xD862,0xD862,0xD862,0xD862,0xD862,0xD862,0xD863,0xD863,
+ 0xD864,0xD864,0xD865,0xD866,0xffff,0xD867,0xffff,0xffff,0xD867,0xD868,
+ 0xD868,0xD868,0xffff,0xffff,0xD869,
+ 1, /* first low-surrogate */
+ 0xDFD7, 0,0xDFC8,0xDFC9,0xDFCA,0xDFCB,0xDFDA, 0,0xDFCC,
+ 0xDFCD,0xDFCE,0xDFCF,0xDFD0,0xDFD1,0xDFBC,0xDDE1,0xDDE2,0xDDE3,0xDDA9,
+ 0xDE4E,0xDD77, 0, 0,0xDDAC,0xDDAD,0xDEB6,0xDFE5,0xDEF8,0xDEEA,
+ 0xDF8D,0xDEEB,0xDD95,0xDC6E,0xDCD8,0xDD83,0xDEA3,0xDD30,0xDF0F,0xDD79,
+ 0xDD7A,0xDEA7,0xDEA8,0xDEA9,0xDEAA,0xDF19,0xDC50,0xDC51,0xDC52, 0,
+ 0xDC68,0xDC53,0xDC54,0xDCE2,0xDEDC,0xDD15,0xDD16,0xDE4F,0xDDF5,0xDDF6,
+ 0xDDF7,0xDDF4,0xDCCC,0xDE0F,0xDD66,0xDD67, 0,0xDD68,0xDCA4,0xDF8B,
+ 0xDF8C,0xDDFA,0xDFE6,0xDFED,0xDFEE,0xDFEF,0xDFF0,0xDFFE,0xDDE7,0xDDE8,
+ 0xDDB3,0xDDE4,0xDD83,0xDEEC, 0,0xDF16, 0, 0,0xDF17,0xDDC3,
+ 0xDDAC,0xDEED, 0, 0,0xDDB4,
+ /* plane 15, row 76 */
+ 2 | (93 << 8), /* first, last */
+ 0xD844,0xD844,0xD846,0xD846,0xD847,0xD849,0xD84A,0xD84A,
+ 0xD84B,0xD84B,0xD84E,0xD84E,0xffff,0xD850,0xffff,0xD851,0xD852,0xD853,
+ 0xD856,0xffff,0xD859,0xD85A,0xD85C,0xD85C,0xD85E,0xD85E,0xD863,0xD863,
+ 0xD863,0xD87E,0xD863,0xD864,0xD866,0xD866,0xD867,0xD867,0xD867,0xD868,
+ 0xffff,0xD841,0xD846,0xffff,0xD84E,0xD857,0xffff,0xD857,0xD859,0xD85C,
+ 0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD863,0xD864,0xD867,0xD867,
+ 0xD867,0xD867,0xD868,0xD845,0xD846,0xD84B,0xD84C,0xD84E,0xD851,0xD851,
+ 0xD854,0xD855,0xD857,0xD858,0xD85A,0xD85C,0x4584,0xD85C,0xffff,0xD863,
+ 0xffff,0xffff,0xD867,0xD867,0xD867,0xD867,0xD868,0xD87E,0xffff,0xD844,
+ 0xD844,0xD848,0xD84A,0xD84A,
+ 2, /* first low-surrogate */
+ 0xDD8A,0xDD8B,0xDD34,0xDF14,0xDFDF,0xDCBB,0xDD7F,0xDD81,
+ 0xDEAD,0xDEAE,0xDC62,0xDC6E, 0,0xDD6E, 0,0xDF17,0xDEE6,0xDC10,
+ 0xDD19, 0,0xDE10,0xDEF2,0xDD76,0xDD77,0xDF95,0xDF96,0xDC00,0xDC01,
+ 0xDC31,0xDDED,0xDC1C,0xDC6D,0xDFF4,0xDFF5,0xDD3D,0xDF32,0xDF33,0xDEF4,
+ 0,0xDC73,0xDD37, 0,0xDC71,0xDE0F, 0,0xDE0E,0xDE11,0xDD85,
+ 0xDC14,0xDC15,0xDC16,0xDC17,0xDC18,0xDC19,0xDC1A,0xDDC3,0xDF42,0xDF43,
+ 0xDF44,0xDF48,0xDDFB,0xDEA5,0xDDB8,0xDEB2,0xDC3D,0xDC72,0xDCE7,0xDCE8,
+ 0xDF59,0xDF3A,0xDE14,0xDDFF,0xDDC0,0xDD8D, 0,0xDD8E, 0,0xDC22,
+ 0, 0,0xDC04,0xDC29,0xDF51,0xDF66,0xDE0E,0xDE13, 0,0xDD9B,
+ 0xDD9C,0xDF16,0xDD86,0xDD87,
+ /* plane 15, row 77 */
+ 1 | (25 << 8), /* first, last */
+ 0xD863,0xD863,0xD863,0xD865,0xffff,0xD850,0xD857,0xD860,0xD863,
+ 0xD863,0xD867,0xD867,0xD869,0x53B5,0xD84E,0xD858,0xD85D,0xD868,0xD860,
+ 0xD84A,0xD863,0xffff,0xD868,0xD863,0xD863,
+ 1, /* first low-surrogate */
+ 0xDC2C,0xDC30,0xDC28,0xDE5F, 0,0xDD7E,0xDE19,0xDE0A,0xDC36,
+ 0xDDFC,0xDF6D,0xDF6E,0xDEC6, 0,0xDC7B,0xDE06,0xDD9F,0xDE32,0xDE0D,
+ 0xDD8B,0xDC3B, 0,0xDE3D,0xDC3C,0xDC3D,
+ /* plane 15, row 78: --- */
+ /* plane 15, row 79: --- */
+ /* plane 15, row 80: --- */
+ /* plane 15, row 81: --- */
+ /* plane 15, row 82: --- */
+ /* plane 15, row 83: --- */
+ /* plane 15, row 84: --- */
+ /* plane 15, row 85: --- */
+ /* plane 15, row 86: --- */
+ /* plane 15, row 87: --- */
+ /* plane 15, row 88: --- */
+ /* plane 15, row 89: --- */
+ /* plane 15, row 90: --- */
+ /* plane 15, row 91: --- */
+ /* plane 15, row 92: --- */
+ /* plane 15, row 93: --- */
+ /* plane 15, row 94: --- */
+};
+
+static sal_Int32 const aImplCns116431992ToUnicodeRowOffsets[] = {
+ 0, /* plane 1, row 1; 182/190 bytes (95.8%) */
+ 95, /* plane 1, row 2; 186/190 bytes (97.9%) */
+ 190, /* plane 1, row 3; 94/94 bytes (100.0%) */
+ 237, /* plane 1, row 4; 186/190 bytes (97.9%) */
+ 332, /* plane 1, row 5; 162/162 bytes (100.0%) */
+ 413, /* plane 1, row 6; 62/62 bytes (100.0%) */
+ 444, /* plane 1, row 7; 8/28 bytes (28.6%) */
+ -1, /* plane 1, row 8 */
+ -1, /* plane 1, row 9 */
+ -1, /* plane 1, row 10 */
+ -1, /* plane 1, row 11 */
+ -1, /* plane 1, row 12 */
+ -1, /* plane 1, row 13 */
+ -1, /* plane 1, row 14 */
+ -1, /* plane 1, row 15 */
+ -1, /* plane 1, row 16 */
+ -1, /* plane 1, row 17 */
+ -1, /* plane 1, row 18 */
+ -1, /* plane 1, row 19 */
+ -1, /* plane 1, row 20 */
+ -1, /* plane 1, row 21 */
+ -1, /* plane 1, row 22 */
+ -1, /* plane 1, row 23 */
+ -1, /* plane 1, row 24 */
+ -1, /* plane 1, row 25 */
+ -1, /* plane 1, row 26 */
+ -1, /* plane 1, row 27 */
+ -1, /* plane 1, row 28 */
+ -1, /* plane 1, row 29 */
+ -1, /* plane 1, row 30 */
+ -1, /* plane 1, row 31 */
+ -1, /* plane 1, row 32 */
+ -1, /* plane 1, row 33 */
+ 458, /* plane 1, row 34; 68/68 bytes (100.0%) */
+ -1, /* plane 1, row 35 */
+ 492, /* plane 1, row 36; 190/190 bytes (100.0%) */
+ 587, /* plane 1, row 37; 190/190 bytes (100.0%) */
+ 682, /* plane 1, row 38; 190/190 bytes (100.0%) */
+ 777, /* plane 1, row 39; 190/190 bytes (100.0%) */
+ 872, /* plane 1, row 40; 190/190 bytes (100.0%) */
+ 967, /* plane 1, row 41; 190/190 bytes (100.0%) */
+ 1062, /* plane 1, row 42; 190/190 bytes (100.0%) */
+ 1157, /* plane 1, row 43; 190/190 bytes (100.0%) */
+ 1252, /* plane 1, row 44; 190/190 bytes (100.0%) */
+ 1347, /* plane 1, row 45; 190/190 bytes (100.0%) */
+ 1442, /* plane 1, row 46; 190/190 bytes (100.0%) */
+ 1537, /* plane 1, row 47; 190/190 bytes (100.0%) */
+ 1632, /* plane 1, row 48; 190/190 bytes (100.0%) */
+ 1727, /* plane 1, row 49; 190/190 bytes (100.0%) */
+ 1822, /* plane 1, row 50; 190/190 bytes (100.0%) */
+ 1917, /* plane 1, row 51; 190/190 bytes (100.0%) */
+ 2012, /* plane 1, row 52; 190/190 bytes (100.0%) */
+ 2107, /* plane 1, row 53; 190/190 bytes (100.0%) */
+ 2202, /* plane 1, row 54; 190/190 bytes (100.0%) */
+ 2297, /* plane 1, row 55; 190/190 bytes (100.0%) */
+ 2392, /* plane 1, row 56; 190/190 bytes (100.0%) */
+ 2487, /* plane 1, row 57; 190/190 bytes (100.0%) */
+ 2582, /* plane 1, row 58; 190/190 bytes (100.0%) */
+ 2677, /* plane 1, row 59; 190/190 bytes (100.0%) */
+ 2772, /* plane 1, row 60; 190/190 bytes (100.0%) */
+ 2867, /* plane 1, row 61; 190/190 bytes (100.0%) */
+ 2962, /* plane 1, row 62; 190/190 bytes (100.0%) */
+ 3057, /* plane 1, row 63; 190/190 bytes (100.0%) */
+ 3152, /* plane 1, row 64; 190/190 bytes (100.0%) */
+ 3247, /* plane 1, row 65; 190/190 bytes (100.0%) */
+ 3342, /* plane 1, row 66; 190/190 bytes (100.0%) */
+ 3437, /* plane 1, row 67; 190/190 bytes (100.0%) */
+ 3532, /* plane 1, row 68; 190/190 bytes (100.0%) */
+ 3627, /* plane 1, row 69; 190/190 bytes (100.0%) */
+ 3722, /* plane 1, row 70; 190/190 bytes (100.0%) */
+ 3817, /* plane 1, row 71; 190/190 bytes (100.0%) */
+ 3912, /* plane 1, row 72; 190/190 bytes (100.0%) */
+ 4007, /* plane 1, row 73; 190/190 bytes (100.0%) */
+ 4102, /* plane 1, row 74; 190/190 bytes (100.0%) */
+ 4197, /* plane 1, row 75; 190/190 bytes (100.0%) */
+ 4292, /* plane 1, row 76; 190/190 bytes (100.0%) */
+ 4387, /* plane 1, row 77; 190/190 bytes (100.0%) */
+ 4482, /* plane 1, row 78; 190/190 bytes (100.0%) */
+ 4577, /* plane 1, row 79; 190/190 bytes (100.0%) */
+ 4672, /* plane 1, row 80; 190/190 bytes (100.0%) */
+ 4767, /* plane 1, row 81; 190/190 bytes (100.0%) */
+ 4862, /* plane 1, row 82; 190/190 bytes (100.0%) */
+ 4957, /* plane 1, row 83; 190/190 bytes (100.0%) */
+ 5052, /* plane 1, row 84; 190/190 bytes (100.0%) */
+ 5147, /* plane 1, row 85; 190/190 bytes (100.0%) */
+ 5242, /* plane 1, row 86; 190/190 bytes (100.0%) */
+ 5337, /* plane 1, row 87; 190/190 bytes (100.0%) */
+ 5432, /* plane 1, row 88; 190/190 bytes (100.0%) */
+ 5527, /* plane 1, row 89; 190/190 bytes (100.0%) */
+ 5622, /* plane 1, row 90; 190/190 bytes (100.0%) */
+ 5717, /* plane 1, row 91; 190/190 bytes (100.0%) */
+ 5812, /* plane 1, row 92; 190/190 bytes (100.0%) */
+ 5907, /* plane 1, row 93; 88/88 bytes (100.0%) */
+ -1, /* plane 1, row 94 */
+ 5951, /* plane 2, row 1; 190/190 bytes (100.0%) */
+ 6046, /* plane 2, row 2; 190/190 bytes (100.0%) */
+ 6141, /* plane 2, row 3; 190/190 bytes (100.0%) */
+ 6236, /* plane 2, row 4; 190/190 bytes (100.0%) */
+ 6331, /* plane 2, row 5; 190/190 bytes (100.0%) */
+ 6426, /* plane 2, row 6; 190/190 bytes (100.0%) */
+ 6521, /* plane 2, row 7; 190/190 bytes (100.0%) */
+ 6616, /* plane 2, row 8; 190/190 bytes (100.0%) */
+ 6711, /* plane 2, row 9; 190/190 bytes (100.0%) */
+ 6806, /* plane 2, row 10; 190/190 bytes (100.0%) */
+ 6901, /* plane 2, row 11; 190/190 bytes (100.0%) */
+ 6996, /* plane 2, row 12; 190/190 bytes (100.0%) */
+ 7091, /* plane 2, row 13; 190/190 bytes (100.0%) */
+ 7186, /* plane 2, row 14; 190/190 bytes (100.0%) */
+ 7281, /* plane 2, row 15; 190/190 bytes (100.0%) */
+ 7376, /* plane 2, row 16; 190/190 bytes (100.0%) */
+ 7471, /* plane 2, row 17; 190/190 bytes (100.0%) */
+ 7566, /* plane 2, row 18; 190/190 bytes (100.0%) */
+ 7661, /* plane 2, row 19; 190/190 bytes (100.0%) */
+ 7756, /* plane 2, row 20; 190/190 bytes (100.0%) */
+ 7851, /* plane 2, row 21; 190/190 bytes (100.0%) */
+ 7946, /* plane 2, row 22; 190/190 bytes (100.0%) */
+ 8041, /* plane 2, row 23; 190/190 bytes (100.0%) */
+ 8136, /* plane 2, row 24; 190/190 bytes (100.0%) */
+ 8231, /* plane 2, row 25; 190/190 bytes (100.0%) */
+ 8326, /* plane 2, row 26; 190/190 bytes (100.0%) */
+ 8421, /* plane 2, row 27; 190/190 bytes (100.0%) */
+ 8516, /* plane 2, row 28; 190/190 bytes (100.0%) */
+ 8611, /* plane 2, row 29; 190/190 bytes (100.0%) */
+ 8706, /* plane 2, row 30; 190/190 bytes (100.0%) */
+ 8801, /* plane 2, row 31; 190/190 bytes (100.0%) */
+ 8896, /* plane 2, row 32; 190/190 bytes (100.0%) */
+ 8991, /* plane 2, row 33; 190/190 bytes (100.0%) */
+ 9086, /* plane 2, row 34; 190/190 bytes (100.0%) */
+ 9181, /* plane 2, row 35; 190/190 bytes (100.0%) */
+ 9276, /* plane 2, row 36; 190/190 bytes (100.0%) */
+ 9371, /* plane 2, row 37; 190/190 bytes (100.0%) */
+ 9466, /* plane 2, row 38; 190/190 bytes (100.0%) */
+ 9561, /* plane 2, row 39; 190/190 bytes (100.0%) */
+ 9656, /* plane 2, row 40; 190/190 bytes (100.0%) */
+ 9751, /* plane 2, row 41; 190/190 bytes (100.0%) */
+ 9846, /* plane 2, row 42; 190/190 bytes (100.0%) */
+ 9941, /* plane 2, row 43; 190/190 bytes (100.0%) */
+ 10036, /* plane 2, row 44; 190/190 bytes (100.0%) */
+ 10131, /* plane 2, row 45; 190/190 bytes (100.0%) */
+ 10226, /* plane 2, row 46; 190/190 bytes (100.0%) */
+ 10321, /* plane 2, row 47; 190/190 bytes (100.0%) */
+ 10416, /* plane 2, row 48; 190/190 bytes (100.0%) */
+ 10511, /* plane 2, row 49; 190/190 bytes (100.0%) */
+ 10606, /* plane 2, row 50; 190/190 bytes (100.0%) */
+ 10701, /* plane 2, row 51; 190/190 bytes (100.0%) */
+ 10796, /* plane 2, row 52; 190/190 bytes (100.0%) */
+ 10891, /* plane 2, row 53; 190/190 bytes (100.0%) */
+ 10986, /* plane 2, row 54; 190/190 bytes (100.0%) */
+ 11081, /* plane 2, row 55; 190/190 bytes (100.0%) */
+ 11176, /* plane 2, row 56; 190/190 bytes (100.0%) */
+ 11271, /* plane 2, row 57; 190/190 bytes (100.0%) */
+ 11366, /* plane 2, row 58; 190/190 bytes (100.0%) */
+ 11461, /* plane 2, row 59; 190/190 bytes (100.0%) */
+ 11556, /* plane 2, row 60; 190/190 bytes (100.0%) */
+ 11651, /* plane 2, row 61; 190/190 bytes (100.0%) */
+ 11746, /* plane 2, row 62; 190/190 bytes (100.0%) */
+ 11841, /* plane 2, row 63; 190/190 bytes (100.0%) */
+ 11936, /* plane 2, row 64; 190/190 bytes (100.0%) */
+ 12031, /* plane 2, row 65; 190/190 bytes (100.0%) */
+ 12126, /* plane 2, row 66; 190/190 bytes (100.0%) */
+ 12221, /* plane 2, row 67; 190/190 bytes (100.0%) */
+ 12316, /* plane 2, row 68; 190/190 bytes (100.0%) */
+ 12411, /* plane 2, row 69; 190/190 bytes (100.0%) */
+ 12506, /* plane 2, row 70; 190/190 bytes (100.0%) */
+ 12601, /* plane 2, row 71; 190/190 bytes (100.0%) */
+ 12696, /* plane 2, row 72; 190/190 bytes (100.0%) */
+ 12791, /* plane 2, row 73; 190/190 bytes (100.0%) */
+ 12886, /* plane 2, row 74; 190/190 bytes (100.0%) */
+ 12981, /* plane 2, row 75; 190/190 bytes (100.0%) */
+ 13076, /* plane 2, row 76; 190/190 bytes (100.0%) */
+ 13171, /* plane 2, row 77; 190/190 bytes (100.0%) */
+ 13266, /* plane 2, row 78; 190/190 bytes (100.0%) */
+ 13361, /* plane 2, row 79; 190/190 bytes (100.0%) */
+ 13456, /* plane 2, row 80; 190/190 bytes (100.0%) */
+ 13551, /* plane 2, row 81; 190/190 bytes (100.0%) */
+ 13646, /* plane 2, row 82; 74/74 bytes (100.0%) */
+ -1, /* plane 2, row 83 */
+ -1, /* plane 2, row 84 */
+ -1, /* plane 2, row 85 */
+ -1, /* plane 2, row 86 */
+ -1, /* plane 2, row 87 */
+ -1, /* plane 2, row 88 */
+ -1, /* plane 2, row 89 */
+ -1, /* plane 2, row 90 */
+ -1, /* plane 2, row 91 */
+ -1, /* plane 2, row 92 */
+ -1, /* plane 2, row 93 */
+ -1, /* plane 2, row 94 */
+ 13683, /* plane 3, row 1; 200/306 bytes (65.4%) */
+ 13836, /* plane 3, row 2; 196/366 bytes (53.6%) */
+ 14019, /* plane 3, row 3; 198/290 bytes (68.3%) */
+ 14164, /* plane 3, row 4; 200/286 bytes (69.9%) */
+ 14307, /* plane 3, row 5; 194/194 bytes (100.0%) */
+ 14404, /* plane 3, row 6; 194/194 bytes (100.0%) */
+ 14501, /* plane 3, row 7; 202/294 bytes (68.7%) */
+ 14648, /* plane 3, row 8; 190/190 bytes (100.0%) */
+ 14743, /* plane 3, row 9; 190/190 bytes (100.0%) */
+ 14838, /* plane 3, row 10; 196/218 bytes (89.9%) */
+ 14947, /* plane 3, row 11; 190/190 bytes (100.0%) */
+ 15042, /* plane 3, row 12; 196/228 bytes (86.0%) */
+ 15156, /* plane 3, row 13; 196/252 bytes (77.8%) */
+ 15282, /* plane 3, row 14; 196/202 bytes (97.0%) */
+ 15383, /* plane 3, row 15; 190/190 bytes (100.0%) */
+ 15478, /* plane 3, row 16; 196/290 bytes (67.6%) */
+ 15623, /* plane 3, row 17; 194/194 bytes (100.0%) */
+ 15720, /* plane 3, row 18; 190/190 bytes (100.0%) */
+ 15815, /* plane 3, row 19; 194/194 bytes (100.0%) */
+ 15912, /* plane 3, row 20; 198/254 bytes (78.0%) */
+ 16039, /* plane 3, row 21; 196/206 bytes (95.1%) */
+ 16142, /* plane 3, row 22; 198/348 bytes (56.9%) */
+ 16316, /* plane 3, row 23; 190/190 bytes (100.0%) */
+ 16411, /* plane 3, row 24; 190/190 bytes (100.0%) */
+ 16506, /* plane 3, row 25; 194/194 bytes (100.0%) */
+ 16603, /* plane 3, row 26; 196/276 bytes (71.0%) */
+ 16741, /* plane 3, row 27; 190/190 bytes (100.0%) */
+ 16836, /* plane 3, row 28; 194/194 bytes (100.0%) */
+ 16933, /* plane 3, row 29; 194/194 bytes (100.0%) */
+ 17030, /* plane 3, row 30; 190/190 bytes (100.0%) */
+ 17125, /* plane 3, row 31; 194/194 bytes (100.0%) */
+ 17222, /* plane 3, row 32; 196/312 bytes (62.8%) */
+ 17378, /* plane 3, row 33; 194/194 bytes (100.0%) */
+ 17475, /* plane 3, row 34; 190/190 bytes (100.0%) */
+ 17570, /* plane 3, row 35; 194/194 bytes (100.0%) */
+ 17667, /* plane 3, row 36; 196/338 bytes (58.0%) */
+ 17836, /* plane 3, row 37; 190/190 bytes (100.0%) */
+ 17931, /* plane 3, row 38; 194/194 bytes (100.0%) */
+ 18028, /* plane 3, row 39; 196/246 bytes (79.7%) */
+ 18151, /* plane 3, row 40; 196/330 bytes (59.4%) */
+ 18316, /* plane 3, row 41; 190/190 bytes (100.0%) */
+ 18411, /* plane 3, row 42; 190/190 bytes (100.0%) */
+ 18506, /* plane 3, row 43; 190/190 bytes (100.0%) */
+ 18601, /* plane 3, row 44; 190/190 bytes (100.0%) */
+ 18696, /* plane 3, row 45; 190/190 bytes (100.0%) */
+ 18791, /* plane 3, row 46; 190/190 bytes (100.0%) */
+ 18886, /* plane 3, row 47; 190/190 bytes (100.0%) */
+ 18981, /* plane 3, row 48; 194/194 bytes (100.0%) */
+ 19078, /* plane 3, row 49; 190/190 bytes (100.0%) */
+ 19173, /* plane 3, row 50; 190/190 bytes (100.0%) */
+ 19268, /* plane 3, row 51; 190/190 bytes (100.0%) */
+ 19363, /* plane 3, row 52; 194/194 bytes (100.0%) */
+ 19460, /* plane 3, row 53; 196/216 bytes (90.7%) */
+ 19568, /* plane 3, row 54; 194/194 bytes (100.0%) */
+ 19665, /* plane 3, row 55; 194/194 bytes (100.0%) */
+ 19762, /* plane 3, row 56; 196/234 bytes (83.8%) */
+ 19879, /* plane 3, row 57; 190/190 bytes (100.0%) */
+ 19974, /* plane 3, row 58; 196/200 bytes (98.0%) */
+ 20074, /* plane 3, row 59; 196/208 bytes (94.2%) */
+ 20178, /* plane 3, row 60; 194/194 bytes (100.0%) */
+ 20275, /* plane 3, row 61; 190/190 bytes (100.0%) */
+ 20370, /* plane 3, row 62; 190/190 bytes (100.0%) */
+ 20465, /* plane 3, row 63; 190/190 bytes (100.0%) */
+ 20560, /* plane 3, row 64; 194/194 bytes (100.0%) */
+ 20657, /* plane 3, row 65; 188/190 bytes (98.9%) */
+ 20752, /* plane 3, row 66; 120/180 bytes (66.7%) */
+ 20842, /* plane 3, row 67; 56/180 bytes (31.1%) */
+ 20932, /* plane 3, row 68; 126/188 bytes (67.0%) */
+ 21026, /* plane 3, row 69; 190/190 bytes (100.0%) */
+ 21121, /* plane 3, row 70; 180/186 bytes (96.8%) */
+ 21214, /* plane 3, row 71; 22/22 bytes (100.0%) */
+ -1, /* plane 3, row 72 */
+ -1, /* plane 3, row 73 */
+ -1, /* plane 3, row 74 */
+ -1, /* plane 3, row 75 */
+ -1, /* plane 3, row 76 */
+ -1, /* plane 3, row 77 */
+ -1, /* plane 3, row 78 */
+ -1, /* plane 3, row 79 */
+ -1, /* plane 3, row 80 */
+ -1, /* plane 3, row 81 */
+ -1, /* plane 3, row 82 */
+ -1, /* plane 3, row 83 */
+ -1, /* plane 3, row 84 */
+ -1, /* plane 3, row 85 */
+ -1, /* plane 3, row 86 */
+ -1, /* plane 3, row 87 */
+ -1, /* plane 3, row 88 */
+ -1, /* plane 3, row 89 */
+ -1, /* plane 3, row 90 */
+ -1, /* plane 3, row 91 */
+ -1, /* plane 3, row 92 */
+ -1, /* plane 3, row 93 */
+ -1, /* plane 3, row 94 */
+ 21225, /* plane 4, row 1; 264/380 bytes (69.5%) */
+ 21415, /* plane 4, row 2; 288/378 bytes (76.2%) */
+ 21604, /* plane 4, row 3; 278/376 bytes (73.9%) */
+ 21792, /* plane 4, row 4; 286/370 bytes (77.3%) */
+ 21977, /* plane 4, row 5; 282/374 bytes (75.4%) */
+ 22164, /* plane 4, row 6; 260/370 bytes (70.3%) */
+ 22349, /* plane 4, row 7; 282/378 bytes (74.6%) */
+ 22538, /* plane 4, row 8; 296/378 bytes (78.3%) */
+ 22727, /* plane 4, row 9; 266/368 bytes (72.3%) */
+ 22911, /* plane 4, row 10; 270/378 bytes (71.4%) */
+ 23100, /* plane 4, row 11; 300/376 bytes (79.8%) */
+ 23288, /* plane 4, row 12; 284/378 bytes (75.1%) */
+ 23477, /* plane 4, row 13; 272/374 bytes (72.7%) */
+ 23664, /* plane 4, row 14; 274/370 bytes (74.1%) */
+ 23849, /* plane 4, row 15; 298/372 bytes (80.1%) */
+ 24035, /* plane 4, row 16; 272/380 bytes (71.6%) */
+ 24225, /* plane 4, row 17; 278/376 bytes (73.9%) */
+ 24413, /* plane 4, row 18; 286/376 bytes (76.1%) */
+ 24601, /* plane 4, row 19; 246/380 bytes (64.7%) */
+ 24791, /* plane 4, row 20; 282/380 bytes (74.2%) */
+ 24981, /* plane 4, row 21; 276/380 bytes (72.6%) */
+ 25171, /* plane 4, row 22; 288/376 bytes (76.6%) */
+ 25359, /* plane 4, row 23; 292/378 bytes (77.2%) */
+ 25548, /* plane 4, row 24; 274/376 bytes (72.9%) */
+ 25736, /* plane 4, row 25; 276/378 bytes (73.0%) */
+ 25925, /* plane 4, row 26; 266/380 bytes (70.0%) */
+ 26115, /* plane 4, row 27; 284/372 bytes (76.3%) */
+ 26301, /* plane 4, row 28; 288/378 bytes (76.2%) */
+ 26490, /* plane 4, row 29; 270/370 bytes (73.0%) */
+ 26675, /* plane 4, row 30; 288/372 bytes (77.4%) */
+ 26861, /* plane 4, row 31; 264/380 bytes (69.5%) */
+ 27051, /* plane 4, row 32; 300/378 bytes (79.4%) */
+ 27240, /* plane 4, row 33; 276/374 bytes (73.8%) */
+ 27427, /* plane 4, row 34; 288/376 bytes (76.6%) */
+ 27615, /* plane 4, row 35; 266/370 bytes (71.9%) */
+ 27800, /* plane 4, row 36; 262/368 bytes (71.2%) */
+ 27984, /* plane 4, row 37; 270/376 bytes (71.8%) */
+ 28172, /* plane 4, row 38; 264/376 bytes (70.2%) */
+ 28360, /* plane 4, row 39; 272/380 bytes (71.6%) */
+ 28550, /* plane 4, row 40; 284/380 bytes (74.7%) */
+ 28740, /* plane 4, row 41; 284/378 bytes (75.1%) */
+ 28929, /* plane 4, row 42; 284/380 bytes (74.7%) */
+ 29119, /* plane 4, row 43; 274/364 bytes (75.3%) */
+ 29301, /* plane 4, row 44; 272/376 bytes (72.3%) */
+ 29489, /* plane 4, row 45; 272/374 bytes (72.7%) */
+ 29676, /* plane 4, row 46; 272/374 bytes (72.7%) */
+ 29863, /* plane 4, row 47; 286/378 bytes (75.7%) */
+ 30052, /* plane 4, row 48; 286/378 bytes (75.7%) */
+ 30241, /* plane 4, row 49; 282/380 bytes (74.2%) */
+ 30431, /* plane 4, row 50; 282/378 bytes (74.6%) */
+ 30620, /* plane 4, row 51; 296/366 bytes (80.9%) */
+ 30803, /* plane 4, row 52; 274/374 bytes (73.3%) */
+ 30990, /* plane 4, row 53; 276/376 bytes (73.4%) */
+ 31178, /* plane 4, row 54; 292/380 bytes (76.8%) */
+ 31368, /* plane 4, row 55; 266/376 bytes (70.7%) */
+ 31556, /* plane 4, row 56; 286/372 bytes (76.9%) */
+ 31742, /* plane 4, row 57; 288/374 bytes (77.0%) */
+ 31929, /* plane 4, row 58; 296/376 bytes (78.7%) */
+ 32117, /* plane 4, row 59; 284/370 bytes (76.8%) */
+ 32302, /* plane 4, row 60; 282/374 bytes (75.4%) */
+ 32489, /* plane 4, row 61; 306/368 bytes (83.2%) */
+ 32673, /* plane 4, row 62; 282/374 bytes (75.4%) */
+ 32860, /* plane 4, row 63; 268/362 bytes (74.0%) */
+ 33041, /* plane 4, row 64; 304/380 bytes (80.0%) */
+ 33231, /* plane 4, row 65; 280/370 bytes (75.7%) */
+ 33416, /* plane 4, row 66; 272/374 bytes (72.7%) */
+ 33603, /* plane 4, row 67; 276/376 bytes (73.4%) */
+ 33791, /* plane 4, row 68; 274/378 bytes (72.5%) */
+ 33980, /* plane 4, row 69; 294/380 bytes (77.4%) */
+ 34170, /* plane 4, row 70; 304/378 bytes (80.4%) */
+ 34359, /* plane 4, row 71; 292/368 bytes (79.3%) */
+ 34543, /* plane 4, row 72; 280/378 bytes (74.1%) */
+ 34732, /* plane 4, row 73; 286/368 bytes (77.7%) */
+ 34916, /* plane 4, row 74; 310/378 bytes (82.0%) */
+ 35105, /* plane 4, row 75; 282/378 bytes (74.6%) */
+ 35294, /* plane 4, row 76; 292/380 bytes (76.8%) */
+ 35484, /* plane 4, row 77; 298/380 bytes (78.4%) */
+ 35674, /* plane 4, row 78; 190/240 bytes (79.2%) */
+ -1, /* plane 4, row 79 */
+ -1, /* plane 4, row 80 */
+ -1, /* plane 4, row 81 */
+ -1, /* plane 4, row 82 */
+ -1, /* plane 4, row 83 */
+ -1, /* plane 4, row 84 */
+ -1, /* plane 4, row 85 */
+ -1, /* plane 4, row 86 */
+ -1, /* plane 4, row 87 */
+ -1, /* plane 4, row 88 */
+ -1, /* plane 4, row 89 */
+ -1, /* plane 4, row 90 */
+ -1, /* plane 4, row 91 */
+ -1, /* plane 4, row 92 */
+ -1, /* plane 4, row 93 */
+ -1, /* plane 4, row 94 */
+ 35794, /* plane 5, row 1; 374/380 bytes (98.4%) */
+ 35984, /* plane 5, row 2; 366/380 bytes (96.3%) */
+ 36174, /* plane 5, row 3; 368/380 bytes (96.8%) */
+ 36364, /* plane 5, row 4; 370/380 bytes (97.4%) */
+ 36554, /* plane 5, row 5; 354/380 bytes (93.2%) */
+ 36744, /* plane 5, row 6; 368/380 bytes (96.8%) */
+ 36934, /* plane 5, row 7; 366/380 bytes (96.3%) */
+ 37124, /* plane 5, row 8; 376/378 bytes (99.5%) */
+ 37313, /* plane 5, row 9; 362/380 bytes (95.3%) */
+ 37503, /* plane 5, row 10; 376/380 bytes (98.9%) */
+ 37693, /* plane 5, row 11; 364/378 bytes (96.3%) */
+ 37882, /* plane 5, row 12; 376/380 bytes (98.9%) */
+ 38072, /* plane 5, row 13; 370/380 bytes (97.4%) */
+ 38262, /* plane 5, row 14; 368/380 bytes (96.8%) */
+ 38452, /* plane 5, row 15; 376/380 bytes (98.9%) */
+ 38642, /* plane 5, row 16; 366/378 bytes (96.8%) */
+ 38831, /* plane 5, row 17; 370/380 bytes (97.4%) */
+ 39021, /* plane 5, row 18; 372/380 bytes (97.9%) */
+ 39211, /* plane 5, row 19; 366/380 bytes (96.3%) */
+ 39401, /* plane 5, row 20; 362/380 bytes (95.3%) */
+ 39591, /* plane 5, row 21; 362/380 bytes (95.3%) */
+ 39781, /* plane 5, row 22; 366/380 bytes (96.3%) */
+ 39971, /* plane 5, row 23; 368/380 bytes (96.8%) */
+ 40161, /* plane 5, row 24; 372/380 bytes (97.9%) */
+ 40351, /* plane 5, row 25; 370/380 bytes (97.4%) */
+ 40541, /* plane 5, row 26; 372/380 bytes (97.9%) */
+ 40731, /* plane 5, row 27; 362/380 bytes (95.3%) */
+ 40921, /* plane 5, row 28; 364/380 bytes (95.8%) */
+ 41111, /* plane 5, row 29; 372/380 bytes (97.9%) */
+ 41301, /* plane 5, row 30; 374/380 bytes (98.4%) */
+ 41491, /* plane 5, row 31; 368/378 bytes (97.4%) */
+ 41680, /* plane 5, row 32; 370/380 bytes (97.4%) */
+ 41870, /* plane 5, row 33; 372/380 bytes (97.9%) */
+ 42060, /* plane 5, row 34; 368/380 bytes (96.8%) */
+ 42250, /* plane 5, row 35; 366/380 bytes (96.3%) */
+ 42440, /* plane 5, row 36; 368/380 bytes (96.8%) */
+ 42630, /* plane 5, row 37; 376/380 bytes (98.9%) */
+ 42820, /* plane 5, row 38; 360/380 bytes (94.7%) */
+ 43010, /* plane 5, row 39; 366/378 bytes (96.8%) */
+ 43199, /* plane 5, row 40; 370/380 bytes (97.4%) */
+ 43389, /* plane 5, row 41; 368/380 bytes (96.8%) */
+ 43579, /* plane 5, row 42; 368/380 bytes (96.8%) */
+ 43769, /* plane 5, row 43; 364/380 bytes (95.8%) */
+ 43959, /* plane 5, row 44; 372/380 bytes (97.9%) */
+ 44149, /* plane 5, row 45; 360/380 bytes (94.7%) */
+ 44339, /* plane 5, row 46; 372/380 bytes (97.9%) */
+ 44529, /* plane 5, row 47; 366/380 bytes (96.3%) */
+ 44719, /* plane 5, row 48; 376/380 bytes (98.9%) */
+ 44909, /* plane 5, row 49; 374/380 bytes (98.4%) */
+ 45099, /* plane 5, row 50; 376/380 bytes (98.9%) */
+ 45289, /* plane 5, row 51; 372/380 bytes (97.9%) */
+ 45479, /* plane 5, row 52; 372/380 bytes (97.9%) */
+ 45669, /* plane 5, row 53; 370/380 bytes (97.4%) */
+ 45859, /* plane 5, row 54; 372/380 bytes (97.9%) */
+ 46049, /* plane 5, row 55; 380/380 bytes (100.0%) */
+ 46239, /* plane 5, row 56; 368/378 bytes (97.4%) */
+ 46428, /* plane 5, row 57; 380/380 bytes (100.0%) */
+ 46618, /* plane 5, row 58; 370/380 bytes (97.4%) */
+ 46808, /* plane 5, row 59; 372/380 bytes (97.9%) */
+ 46998, /* plane 5, row 60; 366/376 bytes (97.3%) */
+ 47186, /* plane 5, row 61; 368/380 bytes (96.8%) */
+ 47376, /* plane 5, row 62; 368/380 bytes (96.8%) */
+ 47566, /* plane 5, row 63; 378/380 bytes (99.5%) */
+ 47756, /* plane 5, row 64; 376/380 bytes (98.9%) */
+ 47946, /* plane 5, row 65; 370/380 bytes (97.4%) */
+ 48136, /* plane 5, row 66; 378/380 bytes (99.5%) */
+ 48326, /* plane 5, row 67; 372/380 bytes (97.9%) */
+ 48516, /* plane 5, row 68; 368/380 bytes (96.8%) */
+ 48706, /* plane 5, row 69; 368/378 bytes (97.4%) */
+ 48895, /* plane 5, row 70; 372/380 bytes (97.9%) */
+ 49085, /* plane 5, row 71; 360/380 bytes (94.7%) */
+ 49275, /* plane 5, row 72; 374/380 bytes (98.4%) */
+ 49465, /* plane 5, row 73; 372/380 bytes (97.9%) */
+ 49655, /* plane 5, row 74; 376/380 bytes (98.9%) */
+ 49845, /* plane 5, row 75; 362/380 bytes (95.3%) */
+ 50035, /* plane 5, row 76; 376/380 bytes (98.9%) */
+ 50225, /* plane 5, row 77; 374/380 bytes (98.4%) */
+ 50415, /* plane 5, row 78; 372/380 bytes (97.9%) */
+ 50605, /* plane 5, row 79; 372/380 bytes (97.9%) */
+ 50795, /* plane 5, row 80; 368/380 bytes (96.8%) */
+ 50985, /* plane 5, row 81; 370/380 bytes (97.4%) */
+ 51175, /* plane 5, row 82; 366/380 bytes (96.3%) */
+ 51365, /* plane 5, row 83; 376/380 bytes (98.9%) */
+ 51555, /* plane 5, row 84; 368/380 bytes (96.8%) */
+ 51745, /* plane 5, row 85; 358/380 bytes (94.2%) */
+ 51935, /* plane 5, row 86; 372/380 bytes (97.9%) */
+ 52125, /* plane 5, row 87; 372/380 bytes (97.9%) */
+ 52315, /* plane 5, row 88; 370/380 bytes (97.4%) */
+ 52505, /* plane 5, row 89; 374/380 bytes (98.4%) */
+ 52695, /* plane 5, row 90; 378/380 bytes (99.5%) */
+ 52885, /* plane 5, row 91; 376/380 bytes (98.9%) */
+ 53075, /* plane 5, row 92; 198/200 bytes (99.0%) */
+ -1, /* plane 5, row 93 */
+ -1, /* plane 5, row 94 */
+ 53175, /* plane 6, row 1; 368/378 bytes (97.4%) */
+ 53364, /* plane 6, row 2; 376/380 bytes (98.9%) */
+ 53554, /* plane 6, row 3; 374/380 bytes (98.4%) */
+ 53744, /* plane 6, row 4; 378/380 bytes (99.5%) */
+ 53934, /* plane 6, row 5; 368/380 bytes (96.8%) */
+ 54124, /* plane 6, row 6; 370/380 bytes (97.4%) */
+ 54314, /* plane 6, row 7; 376/380 bytes (98.9%) */
+ 54504, /* plane 6, row 8; 368/380 bytes (96.8%) */
+ 54694, /* plane 6, row 9; 374/380 bytes (98.4%) */
+ 54884, /* plane 6, row 10; 368/376 bytes (97.9%) */
+ 55072, /* plane 6, row 11; 374/380 bytes (98.4%) */
+ 55262, /* plane 6, row 12; 374/378 bytes (98.9%) */
+ 55451, /* plane 6, row 13; 374/378 bytes (98.9%) */
+ 55640, /* plane 6, row 14; 378/380 bytes (99.5%) */
+ 55830, /* plane 6, row 15; 376/380 bytes (98.9%) */
+ 56020, /* plane 6, row 16; 376/380 bytes (98.9%) */
+ 56210, /* plane 6, row 17; 372/380 bytes (97.9%) */
+ 56400, /* plane 6, row 18; 378/380 bytes (99.5%) */
+ 56590, /* plane 6, row 19; 372/380 bytes (97.9%) */
+ 56780, /* plane 6, row 20; 372/380 bytes (97.9%) */
+ 56970, /* plane 6, row 21; 374/380 bytes (98.4%) */
+ 57160, /* plane 6, row 22; 370/380 bytes (97.4%) */
+ 57350, /* plane 6, row 23; 374/380 bytes (98.4%) */
+ 57540, /* plane 6, row 24; 366/380 bytes (96.3%) */
+ 57730, /* plane 6, row 25; 374/380 bytes (98.4%) */
+ 57920, /* plane 6, row 26; 376/380 bytes (98.9%) */
+ 58110, /* plane 6, row 27; 366/378 bytes (96.8%) */
+ 58299, /* plane 6, row 28; 376/380 bytes (98.9%) */
+ 58489, /* plane 6, row 29; 378/380 bytes (99.5%) */
+ 58679, /* plane 6, row 30; 366/380 bytes (96.3%) */
+ 58869, /* plane 6, row 31; 380/380 bytes (100.0%) */
+ 59059, /* plane 6, row 32; 372/380 bytes (97.9%) */
+ 59249, /* plane 6, row 33; 370/380 bytes (97.4%) */
+ 59439, /* plane 6, row 34; 370/380 bytes (97.4%) */
+ 59629, /* plane 6, row 35; 366/380 bytes (96.3%) */
+ 59819, /* plane 6, row 36; 370/380 bytes (97.4%) */
+ 60009, /* plane 6, row 37; 372/380 bytes (97.9%) */
+ 60199, /* plane 6, row 38; 376/380 bytes (98.9%) */
+ 60389, /* plane 6, row 39; 374/380 bytes (98.4%) */
+ 60579, /* plane 6, row 40; 372/380 bytes (97.9%) */
+ 60769, /* plane 6, row 41; 372/378 bytes (98.4%) */
+ 60958, /* plane 6, row 42; 378/380 bytes (99.5%) */
+ 61148, /* plane 6, row 43; 376/380 bytes (98.9%) */
+ 61338, /* plane 6, row 44; 360/380 bytes (94.7%) */
+ 61528, /* plane 6, row 45; 376/380 bytes (98.9%) */
+ 61718, /* plane 6, row 46; 370/380 bytes (97.4%) */
+ 61908, /* plane 6, row 47; 370/380 bytes (97.4%) */
+ 62098, /* plane 6, row 48; 370/380 bytes (97.4%) */
+ 62288, /* plane 6, row 49; 374/380 bytes (98.4%) */
+ 62478, /* plane 6, row 50; 372/380 bytes (97.9%) */
+ 62668, /* plane 6, row 51; 378/380 bytes (99.5%) */
+ 62858, /* plane 6, row 52; 368/380 bytes (96.8%) */
+ 63048, /* plane 6, row 53; 376/380 bytes (98.9%) */
+ 63238, /* plane 6, row 54; 374/380 bytes (98.4%) */
+ 63428, /* plane 6, row 55; 380/380 bytes (100.0%) */
+ 63618, /* plane 6, row 56; 376/380 bytes (98.9%) */
+ 63808, /* plane 6, row 57; 376/380 bytes (98.9%) */
+ 63998, /* plane 6, row 58; 374/380 bytes (98.4%) */
+ 64188, /* plane 6, row 59; 380/380 bytes (100.0%) */
+ 64378, /* plane 6, row 60; 372/380 bytes (97.9%) */
+ 64568, /* plane 6, row 61; 374/380 bytes (98.4%) */
+ 64758, /* plane 6, row 62; 374/380 bytes (98.4%) */
+ 64948, /* plane 6, row 63; 374/380 bytes (98.4%) */
+ 65138, /* plane 6, row 64; 372/380 bytes (97.9%) */
+ 65328, /* plane 6, row 65; 370/378 bytes (97.9%) */
+ 65517, /* plane 6, row 66; 376/380 bytes (98.9%) */
+ 65707, /* plane 6, row 67; 378/380 bytes (99.5%) */
+ 65897, /* plane 6, row 68; 360/364 bytes (98.9%) */
+ -1, /* plane 6, row 69 */
+ -1, /* plane 6, row 70 */
+ -1, /* plane 6, row 71 */
+ -1, /* plane 6, row 72 */
+ -1, /* plane 6, row 73 */
+ -1, /* plane 6, row 74 */
+ -1, /* plane 6, row 75 */
+ -1, /* plane 6, row 76 */
+ -1, /* plane 6, row 77 */
+ -1, /* plane 6, row 78 */
+ -1, /* plane 6, row 79 */
+ -1, /* plane 6, row 80 */
+ -1, /* plane 6, row 81 */
+ -1, /* plane 6, row 82 */
+ -1, /* plane 6, row 83 */
+ -1, /* plane 6, row 84 */
+ -1, /* plane 6, row 85 */
+ -1, /* plane 6, row 86 */
+ -1, /* plane 6, row 87 */
+ -1, /* plane 6, row 88 */
+ -1, /* plane 6, row 89 */
+ -1, /* plane 6, row 90 */
+ -1, /* plane 6, row 91 */
+ -1, /* plane 6, row 92 */
+ -1, /* plane 6, row 93 */
+ -1, /* plane 6, row 94 */
+ 66079, /* plane 7, row 1; 374/380 bytes (98.4%) */
+ 66269, /* plane 7, row 2; 376/380 bytes (98.9%) */
+ 66459, /* plane 7, row 3; 376/380 bytes (98.9%) */
+ 66649, /* plane 7, row 4; 378/380 bytes (99.5%) */
+ 66839, /* plane 7, row 5; 374/380 bytes (98.4%) */
+ 67029, /* plane 7, row 6; 374/380 bytes (98.4%) */
+ 67219, /* plane 7, row 7; 380/380 bytes (100.0%) */
+ 67409, /* plane 7, row 8; 376/380 bytes (98.9%) */
+ 67599, /* plane 7, row 9; 374/380 bytes (98.4%) */
+ 67789, /* plane 7, row 10; 372/380 bytes (97.9%) */
+ 67979, /* plane 7, row 11; 374/380 bytes (98.4%) */
+ 68169, /* plane 7, row 12; 372/380 bytes (97.9%) */
+ 68359, /* plane 7, row 13; 374/380 bytes (98.4%) */
+ 68549, /* plane 7, row 14; 378/380 bytes (99.5%) */
+ 68739, /* plane 7, row 15; 376/380 bytes (98.9%) */
+ 68929, /* plane 7, row 16; 374/380 bytes (98.4%) */
+ 69119, /* plane 7, row 17; 380/380 bytes (100.0%) */
+ 69309, /* plane 7, row 18; 374/380 bytes (98.4%) */
+ 69499, /* plane 7, row 19; 378/380 bytes (99.5%) */
+ 69689, /* plane 7, row 20; 372/380 bytes (97.9%) */
+ 69879, /* plane 7, row 21; 378/380 bytes (99.5%) */
+ 70069, /* plane 7, row 22; 368/380 bytes (96.8%) */
+ 70259, /* plane 7, row 23; 378/380 bytes (99.5%) */
+ 70449, /* plane 7, row 24; 378/380 bytes (99.5%) */
+ 70639, /* plane 7, row 25; 376/380 bytes (98.9%) */
+ 70829, /* plane 7, row 26; 378/380 bytes (99.5%) */
+ 71019, /* plane 7, row 27; 376/380 bytes (98.9%) */
+ 71209, /* plane 7, row 28; 372/380 bytes (97.9%) */
+ 71399, /* plane 7, row 29; 376/380 bytes (98.9%) */
+ 71589, /* plane 7, row 30; 376/380 bytes (98.9%) */
+ 71779, /* plane 7, row 31; 372/380 bytes (97.9%) */
+ 71969, /* plane 7, row 32; 376/380 bytes (98.9%) */
+ 72159, /* plane 7, row 33; 370/380 bytes (97.4%) */
+ 72349, /* plane 7, row 34; 376/380 bytes (98.9%) */
+ 72539, /* plane 7, row 35; 374/380 bytes (98.4%) */
+ 72729, /* plane 7, row 36; 370/378 bytes (97.9%) */
+ 72918, /* plane 7, row 37; 380/380 bytes (100.0%) */
+ 73108, /* plane 7, row 38; 376/380 bytes (98.9%) */
+ 73298, /* plane 7, row 39; 376/380 bytes (98.9%) */
+ 73488, /* plane 7, row 40; 376/380 bytes (98.9%) */
+ 73678, /* plane 7, row 41; 378/380 bytes (99.5%) */
+ 73868, /* plane 7, row 42; 374/380 bytes (98.4%) */
+ 74058, /* plane 7, row 43; 378/380 bytes (99.5%) */
+ 74248, /* plane 7, row 44; 380/380 bytes (100.0%) */
+ 74438, /* plane 7, row 45; 378/380 bytes (99.5%) */
+ 74628, /* plane 7, row 46; 376/380 bytes (98.9%) */
+ 74818, /* plane 7, row 47; 380/380 bytes (100.0%) */
+ 75008, /* plane 7, row 48; 374/380 bytes (98.4%) */
+ 75198, /* plane 7, row 49; 376/380 bytes (98.9%) */
+ 75388, /* plane 7, row 50; 370/380 bytes (97.4%) */
+ 75578, /* plane 7, row 51; 376/380 bytes (98.9%) */
+ 75768, /* plane 7, row 52; 376/380 bytes (98.9%) */
+ 75958, /* plane 7, row 53; 376/380 bytes (98.9%) */
+ 76148, /* plane 7, row 54; 370/380 bytes (97.4%) */
+ 76338, /* plane 7, row 55; 376/380 bytes (98.9%) */
+ 76528, /* plane 7, row 56; 374/380 bytes (98.4%) */
+ 76718, /* plane 7, row 57; 370/380 bytes (97.4%) */
+ 76908, /* plane 7, row 58; 372/380 bytes (97.9%) */
+ 77098, /* plane 7, row 59; 380/380 bytes (100.0%) */
+ 77288, /* plane 7, row 60; 374/380 bytes (98.4%) */
+ 77478, /* plane 7, row 61; 380/380 bytes (100.0%) */
+ 77668, /* plane 7, row 62; 378/380 bytes (99.5%) */
+ 77858, /* plane 7, row 63; 378/380 bytes (99.5%) */
+ 78048, /* plane 7, row 64; 376/380 bytes (98.9%) */
+ 78238, /* plane 7, row 65; 378/380 bytes (99.5%) */
+ 78428, /* plane 7, row 66; 376/380 bytes (98.9%) */
+ 78618, /* plane 7, row 67; 378/380 bytes (99.5%) */
+ 78808, /* plane 7, row 68; 376/380 bytes (98.9%) */
+ 78998, /* plane 7, row 69; 378/380 bytes (99.5%) */
+ 79188, /* plane 7, row 70; 216/216 bytes (100.0%) */
+ -1, /* plane 7, row 71 */
+ -1, /* plane 7, row 72 */
+ -1, /* plane 7, row 73 */
+ -1, /* plane 7, row 74 */
+ -1, /* plane 7, row 75 */
+ -1, /* plane 7, row 76 */
+ -1, /* plane 7, row 77 */
+ -1, /* plane 7, row 78 */
+ -1, /* plane 7, row 79 */
+ -1, /* plane 7, row 80 */
+ -1, /* plane 7, row 81 */
+ -1, /* plane 7, row 82 */
+ -1, /* plane 7, row 83 */
+ -1, /* plane 7, row 84 */
+ -1, /* plane 7, row 85 */
+ -1, /* plane 7, row 86 */
+ -1, /* plane 7, row 87 */
+ -1, /* plane 7, row 88 */
+ -1, /* plane 7, row 89 */
+ -1, /* plane 7, row 90 */
+ -1, /* plane 7, row 91 */
+ -1, /* plane 7, row 92 */
+ -1, /* plane 7, row 93 */
+ -1, /* plane 7, row 94 */
+ /* plane 8: --- */
+ /* plane 9: --- */
+ /* plane 10: --- */
+ /* plane 11: --- */
+ /* plane 12: --- */
+ /* plane 13: --- */
+ /* plane 14: --- */
+ 79296, /* plane 15, row 1; 332/380 bytes (87.4%) */
+ 79486, /* plane 15, row 2; 322/380 bytes (84.7%) */
+ 79676, /* plane 15, row 3; 338/380 bytes (88.9%) */
+ 79866, /* plane 15, row 4; 334/380 bytes (87.9%) */
+ 80056, /* plane 15, row 5; 342/380 bytes (90.0%) */
+ 80246, /* plane 15, row 6; 348/380 bytes (91.6%) */
+ 80436, /* plane 15, row 7; 346/380 bytes (91.1%) */
+ 80626, /* plane 15, row 8; 340/380 bytes (89.5%) */
+ 80816, /* plane 15, row 9; 354/380 bytes (93.2%) */
+ 81006, /* plane 15, row 10; 362/380 bytes (95.3%) */
+ 81196, /* plane 15, row 11; 364/380 bytes (95.8%) */
+ 81386, /* plane 15, row 12; 354/380 bytes (93.2%) */
+ 81576, /* plane 15, row 13; 342/378 bytes (90.5%) */
+ 81765, /* plane 15, row 14; 350/378 bytes (92.6%) */
+ 81954, /* plane 15, row 15; 358/380 bytes (94.2%) */
+ 82144, /* plane 15, row 16; 364/380 bytes (95.8%) */
+ 82334, /* plane 15, row 17; 340/380 bytes (89.5%) */
+ 82524, /* plane 15, row 18; 332/380 bytes (87.4%) */
+ 82714, /* plane 15, row 19; 350/380 bytes (92.1%) */
+ 82904, /* plane 15, row 20; 362/380 bytes (95.3%) */
+ 83094, /* plane 15, row 21; 366/376 bytes (97.3%) */
+ 83282, /* plane 15, row 22; 342/378 bytes (90.5%) */
+ 83471, /* plane 15, row 23; 328/380 bytes (86.3%) */
+ 83661, /* plane 15, row 24; 348/380 bytes (91.6%) */
+ 83851, /* plane 15, row 25; 356/376 bytes (94.7%) */
+ 84039, /* plane 15, row 26; 362/380 bytes (95.3%) */
+ 84229, /* plane 15, row 27; 344/380 bytes (90.5%) */
+ 84419, /* plane 15, row 28; 336/374 bytes (89.8%) */
+ 84606, /* plane 15, row 29; 358/380 bytes (94.2%) */
+ 84796, /* plane 15, row 30; 336/378 bytes (88.9%) */
+ 84985, /* plane 15, row 31; 352/374 bytes (94.1%) */
+ 85172, /* plane 15, row 32; 352/380 bytes (92.6%) */
+ 85362, /* plane 15, row 33; 362/380 bytes (95.3%) */
+ 85552, /* plane 15, row 34; 354/380 bytes (93.2%) */
+ 85742, /* plane 15, row 35; 350/380 bytes (92.1%) */
+ 85932, /* plane 15, row 36; 370/380 bytes (97.4%) */
+ 86122, /* plane 15, row 37; 356/380 bytes (93.7%) */
+ 86312, /* plane 15, row 38; 368/380 bytes (96.8%) */
+ 86502, /* plane 15, row 39; 360/380 bytes (94.7%) */
+ 86692, /* plane 15, row 40; 364/380 bytes (95.8%) */
+ 86882, /* plane 15, row 41; 344/380 bytes (90.5%) */
+ 87072, /* plane 15, row 42; 364/380 bytes (95.8%) */
+ 87262, /* plane 15, row 43; 352/380 bytes (92.6%) */
+ 87452, /* plane 15, row 44; 352/380 bytes (92.6%) */
+ 87642, /* plane 15, row 45; 344/380 bytes (90.5%) */
+ 87832, /* plane 15, row 46; 358/380 bytes (94.2%) */
+ 88022, /* plane 15, row 47; 350/380 bytes (92.1%) */
+ 88212, /* plane 15, row 48; 350/376 bytes (93.1%) */
+ 88400, /* plane 15, row 49; 336/376 bytes (89.4%) */
+ 88588, /* plane 15, row 50; 354/380 bytes (93.2%) */
+ 88778, /* plane 15, row 51; 336/380 bytes (88.4%) */
+ 88968, /* plane 15, row 52; 356/380 bytes (93.7%) */
+ 89158, /* plane 15, row 53; 362/376 bytes (96.3%) */
+ 89346, /* plane 15, row 54; 354/380 bytes (93.2%) */
+ 89536, /* plane 15, row 55; 356/380 bytes (93.7%) */
+ 89726, /* plane 15, row 56; 346/380 bytes (91.1%) */
+ 89916, /* plane 15, row 57; 346/380 bytes (91.1%) */
+ 90106, /* plane 15, row 58; 364/380 bytes (95.8%) */
+ 90296, /* plane 15, row 59; 354/380 bytes (93.2%) */
+ 90486, /* plane 15, row 60; 366/380 bytes (96.3%) */
+ 90676, /* plane 15, row 61; 348/376 bytes (92.6%) */
+ 90864, /* plane 15, row 62; 352/380 bytes (92.6%) */
+ 91054, /* plane 15, row 63; 370/380 bytes (97.4%) */
+ 91244, /* plane 15, row 64; 352/380 bytes (92.6%) */
+ 91434, /* plane 15, row 65; 350/380 bytes (92.1%) */
+ 91624, /* plane 15, row 66; 338/380 bytes (88.9%) */
+ 91814, /* plane 15, row 67; 356/380 bytes (93.7%) */
+ 92004, /* plane 15, row 68; 316/380 bytes (83.2%) */
+ 92194, /* plane 15, row 69; 340/380 bytes (89.5%) */
+ 92384, /* plane 15, row 70; 358/380 bytes (94.2%) */
+ 92574, /* plane 15, row 71; 356/380 bytes (93.7%) */
+ 92764, /* plane 15, row 72; 356/380 bytes (93.7%) */
+ 92954, /* plane 15, row 73; 352/380 bytes (92.6%) */
+ 93144, /* plane 15, row 74; 354/380 bytes (93.2%) */
+ 93334, /* plane 15, row 75; 338/380 bytes (88.9%) */
+ 93524, /* plane 15, row 76; 330/372 bytes (88.7%) */
+ 93710, /* plane 15, row 77; 94/104 bytes (90.4%) */
+ -1, /* plane 15, row 78 */
+ -1, /* plane 15, row 79 */
+ -1, /* plane 15, row 80 */
+ -1, /* plane 15, row 81 */
+ -1, /* plane 15, row 82 */
+ -1, /* plane 15, row 83 */
+ -1, /* plane 15, row 84 */
+ -1, /* plane 15, row 85 */
+ -1, /* plane 15, row 86 */
+ -1, /* plane 15, row 87 */
+ -1, /* plane 15, row 88 */
+ -1, /* plane 15, row 89 */
+ -1, /* plane 15, row 90 */
+ -1, /* plane 15, row 91 */
+ -1, /* plane 15, row 92 */
+ -1, /* plane 15, row 93 */
+ -1, /* plane 15, row 94 */
+ /* plane 16: --- */
+};
+
+static sal_Int32 const aImplCns116431992ToUnicodePlaneOffsets[] = {
+ 0 * 94, /* plane 1; 264/376 bytes (70.2%) */
+ 1 * 94, /* plane 2; 328/376 bytes (87.2%) */
+ 2 * 94, /* plane 3; 284/376 bytes (75.5%) */
+ 3 * 94, /* plane 4; 312/376 bytes (83.0%) */
+ 4 * 94, /* plane 5; 368/376 bytes (97.9%) */
+ 5 * 94, /* plane 6; 272/376 bytes (72.3%) */
+ 6 * 94, /* plane 7; 280/376 bytes (74.5%) */
+ -1, /* plane 8 */
+ -1, /* plane 9 */
+ -1, /* plane 10 */
+ -1, /* plane 11 */
+ -1, /* plane 12 */
+ -1, /* plane 13 */
+ -1, /* plane 14 */
+ 7 * 94, /* plane 15; 308/376 bytes (81.9%) */
+ -1, /* plane 16 */
+};
+
+static sal_uInt8 const aImplUnicodeToCns116431992Data[] = {
+ /* plane 0, page 0 */
+ 167, 247, /* first, last */
+ 1, 1,80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2,88, 1, 2,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,18,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,19,
+ /* plane 0, page 1: --- */
+ /* plane 0, page 2 */
+ 199, 217, /* first, last */
+ 1, 5,79,
+ 0, 0, 0, 1, 5,77, 1, 5,78, 1, 5,80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 5,76,
+ /* plane 0, page 3 */
+ 145, 201, /* first, last */
+ 1, 4,85, 1, 4,86, 1, 4,87, 1, 4,88, 1, 4,89, 1, 4,90, 1, 4,91,
+ 1, 4,92, 1, 4,93, 1, 4,94, 1, 5, 1, 1, 5, 2, 1, 5, 3, 1, 5, 4, 1, 5, 5,
+ 1, 5, 6, 1, 5, 7, 0, 0, 0, 1, 5, 8, 1, 5, 9, 1, 5,10, 1, 5,11, 1, 5,12,
+ 1, 5,13, 1, 5,14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 5,15, 1, 5,16, 1, 5,17, 1, 5,18, 1, 5,19, 1, 5,20, 1, 5,21,
+ 1, 5,22, 1, 5,23, 1, 5,24, 1, 5,25, 1, 5,26, 1, 5,27, 1, 5,28, 1, 5,29,
+ 1, 5,30, 1, 5,31, 0, 0, 0, 1, 5,32, 1, 5,33, 1, 5,34, 1, 5,35, 1, 5,36,
+ 1, 5,37, 1, 5,38,
+ /* plane 0, page 4: --- */
+ /* plane 0, page 5: --- */
+ /* plane 0, page 6: --- */
+ /* plane 0, page 7: --- */
+ /* plane 0, page 8: --- */
+ /* plane 0, page 9: --- */
+ /* plane 0, page 10: --- */
+ /* plane 0, page 11: --- */
+ /* plane 0, page 12: --- */
+ /* plane 0, page 13: --- */
+ /* plane 0, page 14: --- */
+ /* plane 0, page 15: --- */
+ /* plane 0, page 16: --- */
+ /* plane 0, page 17: --- */
+ /* plane 0, page 18: --- */
+ /* plane 0, page 19: --- */
+ /* plane 0, page 20: --- */
+ /* plane 0, page 21: --- */
+ /* plane 0, page 22: --- */
+ /* plane 0, page 23: --- */
+ /* plane 0, page 24: --- */
+ /* plane 0, page 25: --- */
+ /* plane 0, page 26: --- */
+ /* plane 0, page 27: --- */
+ /* plane 0, page 28: --- */
+ /* plane 0, page 29: --- */
+ /* plane 0, page 30: --- */
+ /* plane 0, page 31: --- */
+ /* plane 0, page 32 */
+ 19, 62, /* first, last */
+ 1, 1,25, 1, 1,23, 0, 0, 0, 1, 2,61, 0, 0, 0,
+ 1, 1,68, 1, 1,69, 0, 0, 0, 0, 0, 0, 1, 1,70, 1, 1,71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,13, 1, 1,12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1,74, 0, 0, 0, 0, 0, 0, 1, 1,75, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,79, 0, 0, 0, 0, 0, 0, 1, 2, 3,
+ /* plane 0, page 33 */
+ 3, 153, /* first, last */
+ 1, 2,74, 0, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 2,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 4,11, 1, 4,12, 1, 4,13, 1, 4,14, 1, 4,15, 1, 4,16, 1, 4,17, 1, 4,18,
+ 1, 4,19, 1, 4,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 6,21, 1, 6,22, 1, 6,23, 1, 6,24, 1, 6,25, 1, 6,26, 1, 6,27, 1, 6,28,
+ 1, 6,29, 1, 6,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2,56, 1, 2,53, 1, 2,55, 1, 2,54, 0, 0, 0, 0, 0, 0, 1, 2,57, 1, 2,58,
+ 1, 2,60, 1, 2,59,
+ /* plane 0, page 34 */
+ 21, 191, /* first, last */
+ 1, 2,65, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 2,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,28, 1, 2,41,
+ 1, 2,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 2,37, 1, 2,38, 1, 2,45, 0, 0, 0, 0, 0, 0, 1, 2,46, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,48, 1, 2,47, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 2,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2,27, 1, 2,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,25, 1, 2,26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,42,
+ /* plane 0, page 35: --- */
+ /* plane 0, page 36 */
+ 0, 125, /* first, last */
+ 1,34, 1, 1,34, 2, 1,34, 3, 1,34, 4, 1,34, 5, 1,34, 6, 1,34, 7, 1,34, 8,
+ 1,34, 9, 1,34,10, 1,34,11, 1,34,12, 1,34,13, 1,34,14, 1,34,15, 1,34,16,
+ 1,34,17, 1,34,18, 1,34,19, 1,34,20, 1,34,21, 1,34,22, 1,34,23, 1,34,24,
+ 1,34,25, 1,34,26, 1,34,27, 1,34,28, 1,34,29, 1,34,30, 1,34,31, 1,34,32,
+ 0, 0, 0, 1,34,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 6, 1, 1, 6, 2, 1, 6, 3, 1, 6, 4, 1, 6, 5, 1, 6, 6, 1, 6, 7, 1, 6, 8,
+ 1, 6, 9, 1, 6,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6,11, 1, 6,12, 1, 6,13, 1, 6,14,
+ 1, 6,15, 1, 6,16, 1, 6,17, 1, 6,18, 1, 6,19, 1, 6,20,
+ /* plane 0, page 37 */
+ 0, 229, /* first, last */
+ 1, 3,25, 0, 0, 0, 1, 3,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,28, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 3,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,30, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 3,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,22, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,21, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,19, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 3,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,37, 0, 0, 0,
+ 0, 0, 0, 1, 3,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 3,38, 0, 0, 0, 0, 0, 0, 1, 3,32, 1, 3,33, 1, 3,35,
+ 1, 3,34, 1, 3,44, 1, 3,45, 1, 3,46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 3, 4, 1, 3, 5, 1, 3, 6, 1, 3, 7, 1, 3, 8, 1, 3, 9, 1, 3,10,
+ 1, 3,11, 1, 3,18, 1, 3,17, 1, 3,16, 1, 3,15, 1, 3,14, 1, 3,13, 1, 3,12,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,24, 1, 3,27, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1,92, 1, 1,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1,85, 1, 1,84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,94, 1, 1,93, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,90, 1, 1,89,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,82, 0, 0, 0, 0, 0, 0, 1, 1,86, 1, 1,83,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 3,40, 1, 3,41, 1, 3,43, 1, 3,42,
+ /* plane 0, page 38 */
+ 5, 66, /* first, last */
+ 1, 1,88, 1, 1,87, 0, 0, 0,
+ 0, 0, 0, 1, 2,52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2,49, 1, 2,51, 1, 2,50,
+ /* plane 0, page 39: --- */
+ /* plane 0, page 40: --- */
+ /* plane 0, page 41: --- */
+ /* plane 0, page 42: --- */
+ /* plane 0, page 43: --- */
+ /* plane 0, page 44: --- */
+ /* plane 0, page 45: --- */
+ /* plane 0, page 46: --- */
+ /* plane 0, page 47: --- */
+ /* plane 0, page 48 */
+ 0, 251, /* first, last */
+ 1, 1, 1, 1, 1, 3, 1, 1, 4, 1, 1,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1,50, 1, 1,51, 1, 1,46, 1, 1,47, 1, 1,54, 1, 1,55, 1, 1,58, 1, 1,59,
+ 1, 1,42, 1, 1,43, 1, 2,69, 0, 0, 0, 1, 1,38, 1, 1,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,72, 1, 1,73, 0, 0, 0,
+ 0, 0, 0, 1, 4,21, 1, 4,22, 1, 4,23, 1, 4,24, 1, 4,25, 1, 4,26, 1, 4,27,
+ 1, 4,28, 1, 4,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 6,
+ /* plane 0, page 49 */
+ 5, 41, /* first, last */
+ 1, 5,39, 1, 5,40, 1, 5,41,
+ 1, 5,42, 1, 5,43, 1, 5,44, 1, 5,45, 1, 5,46, 1, 5,47, 1, 5,48, 1, 5,49,
+ 1, 5,50, 1, 5,51, 1, 5,52, 1, 5,53, 1, 5,54, 1, 5,55, 1, 5,56, 1, 5,57,
+ 1, 5,58, 1, 5,59, 1, 5,60, 1, 5,61, 1, 5,62, 1, 5,63, 1, 5,64, 1, 5,65,
+ 1, 5,66, 1, 5,67, 1, 5,68, 1, 5,69, 1, 5,70, 1, 5,71, 1, 5,72, 1, 5,73,
+ 1, 5,74, 1, 5,75,
+ /* plane 0, page 50 */
+ 163, 163, /* first, last */
+ 1, 2, 1,
+ /* plane 0, page 51 */
+ 142, 213, /* first, last */
+ 1, 2,85, 1, 2,86,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,80, 1, 2,81, 1, 2,82, 0, 0, 0,
+ 0, 0, 0, 1, 2,84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,87, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,83, 0, 0, 0,
+ 0, 0, 0, 1, 2,44, 1, 2,43, 0, 0, 0, 0, 0, 0, 1, 2,79,
+ /* plane 0, page 52 */
+ 0, 254, /* first, last */
+ 6, 2,12, 4, 2, 4, 0, 0, 0, 0, 0, 0, 6, 1,16, 6, 1, 3,15, 1,76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1,55, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3,22, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8,21, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,20,27, 0, 0, 0, 0, 0, 0, 3,25,77, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 7,33, 3, 8,76, 0, 0, 0, 3, 3, 3, 4, 3,23, 4, 5,20, 3,32,20, 0, 0, 0,
+ 4, 1,57, 3, 1,85, 3, 1,78, 3, 1,81, 3, 1,83, 0, 0, 0,15, 1,36, 0, 0, 0,
+ 6, 3,46, 3, 2,81, 4, 2,17, 3, 2,73, 3, 2,74, 0, 0, 0,15, 1,82, 0, 0, 0,
+ 0, 0, 0, 5, 3,20, 3, 4,42, 3, 4,39, 3, 4,45, 6, 5,81, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 7,38, 5, 5, 5, 4, 5,25, 4, 5,28, 3, 7,37, 5, 5,11, 4, 5,27,
+ 4, 5,24, 3, 7,48, 0, 0, 0,15, 5,42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,11,17,
+ 6,14,58, 4, 8,25, 3,11,16, 5, 8, 1, 4, 8,26, 3,11,10, 4, 8,23, 4, 8,28,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,11,76, 3,20,41, 3,15,50, 4,11,69, 6,21,24,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,16,37, 3,20,30,
+ 3,20,40, 4,16,42, 0, 0, 0, 4,22,24, 3,25,83, 4,22,18, 4,22,23, 6,38,53,
+ 0, 0, 0, 6,41,91, 3,25,84, 3,32,21, 3,32,24, 3,32,27, 4,28,12, 4,28,13,
+ 4,28, 8, 4,28,10, 5,36,55, 4,34,23, 4,34,19, 4,34,14, 3,37,88, 6,58,83,
+ 4,34,15, 3,37,83, 4,47,57, 3,37,82, 3,37,79, 3,37,87, 4,34,18, 0, 0, 0,
+ 0, 0, 0, 4,40,91, 3,43, 6, 3,43, 5, 4,40,93, 3,43, 4, 3,43, 8, 3,43,10,
+ 0, 0, 0, 3,48,18, 4,47,61, 5,51,57, 4,47,59, 3,52,31, 3,55,51, 4,58,71,
+ 4,58,72, 4,63,41, 0, 0, 0, 0, 0, 0, 4,67,15, 3,60,19, 3,60,17, 7,50,84,
+ 7,55,44, 4,74,33, 3,65,28, 4, 2,19,15, 6,58, 4,11,73, 0, 0, 0, 3,55,52,
+ 3, 1,86, 0, 0, 0, 3, 2,89, 3, 4,53, 5, 3,23, 6, 5,91, 6, 5,93, 3, 4,54,
+ 3,11,24, 7,45,29, 3,10,44, 4,16,44, 5,17, 6, 4,22,29, 4,28,18, 4,74,34,
+ 0, 0, 0, 0, 0, 0, 3,11,26, 3,25,88, 4,41, 2, 3, 1,48, 0, 0, 0, 3, 3, 1,
+ 3, 4,56, 5, 5,14, 3, 7,55, 3, 7,54, 3, 7,56, 0, 0, 0, 4, 8,35, 3,11,28,
+ 3,15,61, 3,15,60, 0, 0, 0, 4,16,45, 3,25,91, 3,25,92, 4,28,20, 3,37,89,
+ 5,17, 9, 0, 0, 0, 4, 1,65, 6, 2,33, 3, 1,94, 4, 2,28, 5, 2,16, 4, 3,30,
+ 4, 3,31, 4, 5,42, 4, 5,44, 4, 5,40, 4, 5,39, 0, 0, 0, 0, 0, 0, 3,11,33,
+ 3,11,37, 3,11,34, 0, 0, 0, 0, 0, 0, 5,11,92, 4,16,51, 3,15,71, 3,15,73,
+ 0, 0, 0, 4,16,55, 4,16,56, 4,16,50, 5,17,12, 4,16,52, 4,16,57, 3,26, 4,
+ 6,48,76, 4,22,34, 4,22,37, 3,26, 2, 5,29,80, 3,32,34, 4,34,33,
+ /* plane 0, page 53 */
+ 0, 255, /* first, last */
+ 4,34,35, 4,34,34, 4,34,28, 3,37,93, 3,37,91, 4,34,31, 4,34,30, 3,37,92,
+ 0, 0, 0, 0, 0, 0, 4,41, 3, 4,47,66, 4,47,65, 4,47,67, 5,65,27, 4,53,76,
+ 7,30,93, 4,63,42, 4,67,16, 4, 1,68, 0, 0, 0, 4, 2,32, 0, 0, 0, 4, 3,36,
+ 3, 4,68, 4, 5,47, 6, 9,79, 0, 0, 0, 6,15, 7, 4,11,85, 3,15,75, 0, 0, 0,
+ 4,16,58, 4,22,43, 3,38, 2, 4,53,79, 3,52,35, 4,53,80, 5,51,67, 4,58,78,
+ 4,16,60, 4,22,45, 5,29,88, 0, 0, 0, 6, 9,82, 3,20,51, 5,80,88, 4, 3,43,
+ 6, 6,24, 4,11,87, 3,26, 5, 6,48,86, 4,28,30, 5,36,76, 4,77,51, 6, 6,22,
+ 4,22,48, 3, 1,56, 6, 3,81, 3, 3,12, 6,48,90, 3, 7,68, 4, 1,11, 6, 1,27,
+ 6, 8,68, 4, 5,54, 3, 3,16, 5, 2,28, 3, 3,14, 3, 4,74, 3, 4,73, 3, 4,72,
+ 3, 7,72, 6,10,10, 3,11,44, 3,15,80, 4,11,90, 3,15,81, 4,22,49, 6,49, 2,
+ 5,44,17, 3,38, 4, 4,41, 7, 0, 0, 0, 3,64,80, 3, 1,61, 3,15,82, 6,29,65,
+ 3,20,54, 4,41, 9, 5, 1,33, 3, 1,63, 3, 3,18, 0, 0, 0, 4, 5,58, 4, 8,55,
+ 3,31,88, 3,38, 7, 4,39,54, 4, 1,75, 3, 2,16, 3, 2,12, 3, 3,24, 3, 3,22,
+ 0, 0, 0, 3, 4,76, 4, 3,49, 3, 4,75, 3, 4,81, 4, 3,52, 4, 3,57, 3, 4,82,
+ 4, 3,51, 3, 4,79, 3, 4,78, 3, 4,90, 0, 0, 0,15, 3,41, 3, 5, 5, 3, 7,90,
+ 3, 7,77, 4, 5,61, 3, 7,86, 5, 5,34, 6,10,25, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3,11,50, 3,11,64, 3,11,63, 3,11,66, 3,11,58, 4, 8,57, 4, 8,60, 3,11,54,
+ 15, 9,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,12, 5,
+ 3,15,93, 4,11,94, 3,15,85, 3,15,92, 4,12, 1, 4,11,93, 6,21,93, 3,16, 4,
+ 5,12,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,20,61,
+ 3,20,69, 4,16,74, 5,22,80, 3,20,67, 3,20,60, 4,16,80, 3,20,58, 4,16,83,
+ 4,16,81, 4,16,77, 4,16,76,15,19,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,24,51, 4,16,79, 5,22,86, 3,26,18,
+ 4,22,71, 3,26,21, 3,26,12, 4,22,62, 4,22,57, 3,26,25, 3,26,30, 3,26,13,
+ 4,22,64, 3,26,29, 4,22,63, 3,26,23, 6,39,25, 5,22,89, 5,22,90, 3,26,16,
+ 4,22,56, 4,22,69, 4,22,67, 3,26,33, 5,22,78, 3,26,31, 0, 0, 0, 0, 0, 0,
+ 3,26,26, 0, 0, 0, 0, 0, 0, 5,30,25, 4,28,42, 4,28,38, 3,32,47, 5,30,29,
+ 4,28,39, 4,28,44, 3,32,45, 3,32,48, 6,49,18, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,34,50, 3,38,18, 3,38,15, 3,38,13, 4,34,47, 4,34,42,
+ 4,34,53, 3,38,11, 3,43,26, 4,34,51, 4,34,54, 4,34,49, 0, 0, 0, 0, 0, 0,
+ 5,37, 2, 4,41,16, 4,41,12, 3,43,34, 4,41,13, 3,43,22, 7, 1,46, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,47,75, 4,47,76, 3,48,33, 4,47,71, 4,47,74,
+ /* plane 0, page 54 */
+ 0, 254, /* first, last */
+ 4,47,79, 3,48,28, 3,48,26, 0, 0, 0, 0, 0, 0, 7,23,23, 4,53,82, 3,52,38,
+ 4,53,83, 4,47,77, 5,65,32, 4,58,80, 3,55,54, 5,65,37, 0, 0, 0, 0, 0, 0,
+ 4,63,44, 5,71,57, 0, 0, 0, 5,75,83, 3,60,21, 3,62, 7, 4,70,18, 0, 0, 0,
+ 0, 0, 0, 3,64,14, 3,64,13, 4,76,76, 7,66,15, 3, 2,18, 3, 2, 1, 3, 3,29,
+ 5, 5,51, 3, 7,94, 3,11,68, 3,16, 6, 4,34,56, 4,67,18, 3, 2,19, 3, 5,14,
+ 4, 3,63, 3, 5,25, 3, 5,26, 4, 3,62, 3, 5,29, 3, 5,31, 0, 0, 0, 3, 5,27,
+ 3, 5,20, 3, 8, 7, 4, 5,77, 3, 8,11, 3, 8,12, 0, 0, 0, 3,11,86, 6,15,69,
+ 3,11,84, 3,11,85, 3,11,83, 3,11,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,16, 9,
+ 4,12,15, 4,12,17, 3,16,13, 3,16,12, 3,16,14, 3,16,17, 0, 0, 0, 3,20,76,
+ 3,20,77, 3,20,83, 3,20,74,15,19,55, 0, 0, 0, 4,17, 1, 4,22,75, 3,26,38,
+ 4,22,78, 3,26,49, 6,39,46, 3,26,40, 0, 0, 0, 3,26,45, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,28,57, 4,28,59, 3,32,51, 3,32,53, 4,28,54, 4,28,56, 0, 0, 0,
+ 4,34,62, 4,34,61, 4,34,59, 3,38,27, 4,34,63, 3,38,25, 0, 0, 0, 7, 1,74,
+ 3,43,50, 3,43,40, 4,41,19, 3,43,42, 3,43,46,15,46, 5,15,46,14, 4,41,10,
+ 3,48,36, 4,47,88, 3,48,39, 3,48,34, 3,48,35, 3,48,38, 3,48,37, 4,53,92,
+ 3,52,45, 3,52,42, 4,53,91, 7,31,16, 3,55,61, 0, 0, 0, 7,38,36, 0, 0, 0,
+ 5,75,86, 3,64,82, 4,76,78, 5,23,28, 3,45,33, 3,11,88, 0, 0, 0, 4, 8,65,
+ 0, 0, 0, 5, 5,56, 4,22,87, 4,34,64, 3,38,39, 4,58,90, 3, 2,26, 3, 3,38,
+ 3, 3,40, 0, 0, 0, 4, 3,69, 3, 5,42, 4, 5,81, 5, 5,57, 4, 5,87, 4, 5,83,
+ 4, 5,88, 0, 0, 0, 3,11,93, 0, 0, 0, 4,17, 5, 6,30,34, 3,20,90, 3,26,53,
+ 4,28,60, 3,48,30, 3, 1,84, 3, 3,44, 3, 3,42, 4, 2,54, 4, 2,57, 4, 2,53,
+ 3, 3,41, 3, 5,50, 3, 5,55, 3, 5,48, 3, 5,47, 3, 5,45, 3, 5,52, 0, 0, 0,
+ 3, 8,17, 3, 8,27, 4, 5,91, 3, 8,34, 3, 8,18, 3, 8,26, 3, 8,35, 3, 8,39,
+ 3, 8,20, 4, 6, 1, 3, 8,36, 3, 8,30, 3, 8,22, 3, 8,28, 5, 5,61, 3, 8,25,
+ 0, 0, 0, 3, 8,16, 4, 8,77, 4, 8,73, 3,11,94, 3,12, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,10,10, 4, 8,71, 0, 0, 0, 0, 0, 0, 3,16,31, 3,16,34, 3,16,29,
+ 3,16,41, 3,16,39, 4,12,27, 3,16,35, 3,16,48, 3,16,44, 3,16,36, 4,12,31,
+ 4,12,26, 3,16,25, 4,12,28, 3,16,49, 3,16,38, 3,16,33, 3,16,26, 0, 0, 0,
+ 0, 0, 0,15,14,75,15,14,88, 0, 0, 0, 0, 0, 0, 4,17, 9, 3,21, 6, 3,21,13,
+ 3,21, 1, 3,21,22, 4,17, 8, 3,21,12, 3,21, 3, 3,21, 5, 3,26,81, 3,26,71,
+ 3,26,84, 3,26,68, 3,26,86, 3,26,76, 3,26,74, 3,26,69, 5,23,46, 3,26,78,
+ 5,23,38, 4,22,94, 3,26,79, 3,26,63, 4,22,93, 3,26,80, 3,26,61,
+ /* plane 0, page 55 */
+ 1, 255, /* first, last */
+ 15,26,28, 3,26,77, 3,26,73, 3,26,72, 4,28,63, 3,32,66, 4,28,65,
+ 3,32,78, 3,32,77, 3,32,72, 3,32,67, 4,28,68, 3,32,69, 4,28,67, 3,32,80,
+ 3,32,75, 3,32,79, 3,32,76, 3,32,73, 0, 0, 0, 3,38,43, 4,34,71, 4,34,76,
+ 4,34,72, 4,34,70, 3,38,41, 3,38,50, 3,38,49, 4,34,75, 4,34,77, 0, 0, 0,
+ 3,38,45, 3,38,46, 4,34,73, 4,41,28, 4,41,26, 3,43,57, 3,43,55, 4,41,32,
+ 3,43,53, 3,48,50, 3,48,53, 4,48, 1,15,52,10, 0, 0, 0, 4,54, 2, 4,54, 4,
+ 3,55,63, 3,55,64, 4,63,52, 5,71,62, 3,58,16, 3,58,18, 3,60,23, 4,67,21,
+ 3,60,24, 4,70,23, 4,72,69, 3,65,66, 3,65,67, 3, 3,46, 6, 6,88, 4, 3,77,
+ 3, 8,41, 4, 8,80, 4,12,33, 3,16,52, 3,26,93, 4,28,71, 0, 0, 0, 7,13,13,
+ 3,65,29, 0, 0, 0, 3, 2,28, 0, 0, 0, 3, 3,47, 6, 6,89, 3, 5,57, 4, 3,80,
+ 3, 5,59, 6, 6,90, 3, 8,47, 5, 8,78, 3,12,16, 3,12,17, 3,12,19, 4,12,34,
+ 5,12,92, 6,22,61, 0, 0, 0, 3,21,34, 3,21,29, 3,21,30, 4,17,14, 6,30,58,
+ 3,21,32, 0, 0, 0, 3,27, 1, 4,23, 2, 4,28,74, 4,28,76, 4,28,79, 3,32,87,
+ 0, 0, 0, 4,34,84, 4,34,85, 3,43,64, 4,34,87, 4,41,35, 4,41,37, 4,41,38,
+ 4,58,93, 3,62,11, 7,66,21, 0, 0, 0, 4, 3,81, 4, 6, 6, 6,22,72, 3,27, 2,
+ 4,12,44, 6,30,68, 4,34,88, 5,44,67, 4, 2,61, 4, 3,84, 4, 6, 8, 4, 6, 7,
+ 4, 8,84, 4, 8,85, 4,12,45, 5,17,85, 4,17,19, 5,17,83, 4,17,18, 4,23, 8,
+ 4,23, 9, 4,28,81, 4,34,89, 3, 2,32, 3, 3,51, 0, 0, 0, 0, 0, 0, 4, 6,10,
+ 3, 8,50, 3, 8,51, 4, 8,89, 4, 8,88, 3,12,25, 3,12,24, 3,12,22, 4,12,46,
+ 6,30,75, 3,21,37, 4,23,11, 5,23,70, 4,34,93, 0, 0, 0, 0, 0, 0, 4,41,42,
+ 0, 0, 0, 3,58,23, 3, 1,66, 4, 3,87, 3, 2,34, 3, 2,35, 3, 2,33, 3, 2,36,
+ 3, 3,54, 4, 2,65, 5, 2,49, 4, 3,91, 5, 2,48, 3, 3,55, 0, 0, 0, 3, 3,56,
+ 4, 3,88, 4, 3,89, 3, 5,64, 5, 3,80, 5, 3,84, 3, 5,68, 3, 5,69, 4, 3,86,
+ 0, 0, 0, 3, 8,59, 6,10,91, 4, 6,17, 4, 6,18, 4, 6,14, 3, 8,54, 6,10,86,
+ 3, 8,57, 3, 8,58, 0, 0, 0, 5, 5,78, 3,12,26, 4, 8,91, 0, 0, 0, 4,12,59,
+ 4,12,51, 4,12,49, 3,16,64, 4,12,63, 4,12,53, 3,16,60, 4,12,58, 4,12,62,
+ 4,12,55, 3,16,61, 6,22,92, 5,13,14, 3,16,69, 0, 0, 0, 4,12,52, 3,21,54,
+ 3,21,41, 4,17,23, 3,21,44, 4,17,29, 6,30,85, 3,21,45, 4,17,25, 6,30,88,
+ 3,21,48, 0, 0, 0,15,20,31, 0, 0, 0, 0, 0, 0, 3,21,51, 3,27,15, 3,27,18,
+ 3,27, 9, 4,23,18, 4,23,20, 3,27,21, 4,28,82, 3,27,16, 0, 0, 0, 3,27,12,
+ 4,28,86, 4,28,83, 4,28,94, 5,30,77, 4,29, 1, 6,50,20, 3,32,91, 0, 0, 0,
+ 4,28,87, 4,35, 2, 6,60,36, 4,35,13, 4,35,10, 4,35, 1, 3,38,53, 4,35, 4,
+ /* plane 0, page 56 */
+ 0, 255, /* first, last */
+ 3,38,59, 3,38,56, 4,35,14, 0, 0, 0, 3,38,55, 4,41,48, 4,41,44, 5,44,76,
+ 3,43,66, 5,44,72, 4,41,43, 4,41,51, 3,43,68, 4,41,47, 4,41,45, 3,43,65,
+ 4,41,52, 4,48, 6, 4,48, 7, 4,54, 8, 4,48, 5, 5,52,22, 3,48,57, 7,13,44,
+ 3,52,58, 3,52,54, 5,59,28, 4,54, 7, 3,52,56, 7,31,36, 0, 0, 0, 0, 0, 0,
+ 4,63,58, 5,71,67, 5,71,68, 0, 0, 0, 0, 0, 0, 4,70,26, 3,62,12, 4,72,72,
+ 5,91,29, 3, 3,59, 6, 1,78, 0, 0, 0, 0, 0, 0, 3,27,24, 4,41,53, 3, 2,37,
+ 0, 0, 0, 4,17,34, 3, 2,38, 0, 0, 0, 4, 2,69, 4, 2,70, 3, 3,61, 4, 4, 2,
+ 4, 4, 4, 3, 5,73, 4, 4, 1, 3, 5,74,15, 4, 5, 4, 6,22, 4, 6,23, 4, 9, 5,
+ 4, 4, 5, 4, 9, 2, 4, 9, 4, 6,16,67, 3,12,39, 4, 9, 3, 4, 9, 1, 4,12,70,
+ 4,12,72, 4,17,39, 4,17,40, 4,17,37, 4,17,41, 0, 0, 0, 3,21,60, 4,23,27,
+ 4,23,22, 4,23,29, 4,23,26, 3,27,28, 4,23,28, 3,27,25, 4,23,25, 4,29, 8,
+ 4,29, 3, 4,29, 7, 4,29, 6, 4,29, 9, 4,35,19, 4,35,18, 4,35,17, 4,35,15,
+ 3,43,78, 0, 0, 0, 3,43,79, 4,48, 9, 0, 0, 0, 4,54,13, 4,54,11, 4,67,27,
+ 4,67,26, 3,63,36, 4,72,75, 6,40,36, 0, 0, 0, 3,38,62, 4,48,11, 3, 3,64,
+ 3, 3,63, 3, 3,62, 3, 5,76, 6, 7,39, 4, 6,24, 4, 6,29, 4, 6,27, 5, 6, 6,
+ 4, 6,28, 3, 8,68, 4, 6,26, 3, 8,70,15,15,24, 3,12,41, 3,12,42, 4, 9,10,
+ 5, 9, 6, 4, 9, 9, 4, 9, 8, 4,12,75, 4,12,77, 4,12,76, 3,16,77, 0, 0, 0,
+ 3,21,62, 4,17,46, 4,17,44, 4,17,47, 3,21,61, 5,24, 9, 4,23,32, 4,23,33,
+ 3,27,33, 5,31, 1, 4,35,22, 3,38,63, 4,35,25, 4,35,26, 4,41,59, 4,41,60,
+ 3,43,81, 3,48,61, 4,48,12, 4,48,14, 5,52,34, 4,63,62, 4,67,28, 4, 4, 9,
+ 3, 8,74, 3,38,66, 0, 0, 0, 7,13,59, 0, 0, 0, 4, 9,11, 4,29,13, 6, 1,89,
+ 4, 2,74, 3, 3,67, 3, 3,68, 0, 0, 0, 3, 5,80, 0, 0, 0, 3, 8,79, 4, 6,32,
+ 4, 6,33, 0, 0, 0, 3,12,46, 4, 9,13, 6,16,90, 4, 9,14, 3,12,47, 0, 0, 0,
+ 4,12,81, 0, 0, 0, 5,18,38, 4,17,49, 4,12,82, 3,27,38, 3,27,35, 0, 0, 0,
+ 5,31, 9, 4,29,15, 4,29,14, 6,50,45, 4,41,61, 4,41,63, 3,62,14, 4, 6,34,
+ 4,48,17, 6, 4,80, 0, 0, 0, 3, 8,83, 4, 6,35, 3, 8,82, 3,21,68, 3,27,40,
+ 3,27,41, 4,35,27, 4,41,65, 3,48,63, 3, 2,43, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,11,30, 3, 8,84, 4, 9,18, 4, 9,20, 3,12,50, 5, 9,15, 5, 9,19, 3,12,51,
+ 6,17, 5, 0, 0, 0, 5,13,39,15,15,30, 4,17,52, 3,21,70, 3,21,71, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,23,41, 3,27,42, 4,23,40, 0, 0, 0, 4,29,19,
+ 5,37,73, 4,35,29, 6,60,71, 0, 0, 0, 0, 0, 0, 3,48,64, 4,48,20, 4,54,15,
+ 0, 0, 0, 0, 0, 0, 6, 1,94, 3, 3,69, 3, 3,72, 4, 4,17, 5, 2,71, 4, 2,80,
+ /* plane 0, page 57 */
+ 1, 255, /* first, last */
+ 3, 8,91, 3, 8,93, 3, 5,89, 4, 4,14, 3, 8,92, 4, 4,16, 4, 4,19,
+ 3, 5,83, 4, 4,15, 4, 4,18, 3, 6, 4, 3, 8,89, 4, 9,21, 4, 9,23, 4, 6,45,
+ 3,12,57, 3, 9, 4, 4, 6,40, 3, 9, 3, 4, 6,46, 4, 6,44, 4, 6,38,15,10,30,
+ 0, 0, 0, 3,12,56, 4, 9,33, 3,12,66, 4, 9,28, 4, 6,41, 4, 9,25, 3,16,93,
+ 6,23,52, 4, 9,29, 5, 9,21, 4,13, 8, 4, 9,40, 4, 9,26, 4, 9,27, 4, 9,32,
+ 3,12,53, 6,23,58, 3,16,92, 0, 0, 0, 3,12,62, 0, 0, 0, 4,17,59, 5,13,58,
+ 3,21,83, 4,13, 2, 3,21,73, 3,16,85, 4,13, 3, 3,21,80, 4,13, 4, 3,16,87,
+ 6,23,62, 3,17, 4, 4,13,11, 4,17,58, 0, 0, 0, 0, 0, 0, 4,17,60, 4,17,66,
+ 3,21,75, 6,40,79, 4,17,67, 3,21,85, 4,17,64, 5,18,59, 4,17,61, 3,21,76,
+ 3,27,46, 4,17,76, 4,17,71, 3,27,44, 3,21,77, 3,21,87, 3,27,55, 4,17,68,
+ 6,40,85, 3,27,51, 4,17,70, 4,17,62, 5,13,55, 3,27,50, 5,24,34, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,17,74, 5,24,40, 4,23,54, 4,23,48, 3,27,60, 4,23,57,
+ 3,27,63, 4,23,52, 4,23,46, 5,31,18, 3,33, 5, 4,23,53, 4,29,30, 3,27,64,
+ 4,29,23, 5,18,56, 0, 0, 0, 3,27,59, 3,33, 6, 3,33,13, 4,29,27, 4,35,35,
+ 5,31,34, 6,50,73, 3,38,71, 4,29,26, 4,29,28, 3,33,16, 3,38,69, 4,35,34,
+ 4,35,48, 3,38,70, 3,33,15, 0, 0, 0, 4,35,40, 4,35,39, 4,35,41, 3,43,93,
+ 4,35,45, 4,41,69, 3,44, 2, 3,38,73, 3,43,91, 4,35,42, 4,35,44, 4,35,38,
+ 0, 0, 0, 3,44, 7, 3,43,88, 4,35,43, 4,48,24, 3,44,10, 4,41,71, 4,41,73,
+ 4,41,72, 4,41,75, 7, 2,92, 4,41,77, 3,48,73, 4,41,76, 3,44, 6, 4,48,25,
+ 5,59,44, 0, 0, 0, 4,59, 3, 4,59, 9, 4,54,22, 4,59, 5, 3,55,71, 4,59, 4,
+ 15,58, 9, 3,55,70, 4,48,26, 5,71,88, 4,67,35, 4,63,68, 5,71,83, 7,39,12,
+ 3,62,16, 4,67,34, 4,67,32, 3,63,39, 4,72,76, 3,65,88, 3, 3,74, 3, 6, 6,
+ 4, 6,52, 0, 0, 0, 6,11,50, 0, 0, 0, 4,13,15, 4,13,16, 5,13,61, 3,21,90,
+ 3,27,69, 4,29,34, 4,35,52, 5,45,23, 3,44,11, 3,52,66, 6, 7,78, 4, 6,53,
+ 4, 6,54, 4, 9,45, 3,12,68, 4, 1,91, 4, 1,90, 3, 2,47, 4, 2,84, 4, 2,83,
+ 4, 2,85, 4, 4,26, 4, 4,22, 3, 6,12, 3, 6,13, 3, 6,16, 3, 6,11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4, 6,56, 3, 9,13, 5, 6,26, 3, 9,12, 3, 9,24, 4, 9,53,
+ 4,13,19, 4, 6,57, 3, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 7,14, 0, 0, 0,
+ 0, 0, 0, 4, 9,46, 4, 9,52, 3,12,70, 3, 9, 7, 3,12,71, 3,12,73, 4,13,28,
+ 3,12,81, 4, 9,54, 3,12,72, 4, 9,50, 4,13,18, 4,13,17, 3,12,74, 3,12,69,
+ 0, 0, 0, 3,17,20, 3,17,10, 3,21,91, 3,17,17, 3,17,26, 4,13,27, 3,17,13,
+ 3,17,11, 4,17,92, 4,18, 1, 4,17,91, 3,22,12, 6,32,18, 4,18, 5, 3,22,15,
+ /* plane 0, page 58 */
+ 0, 253, /* first, last */
+ 3,22,16, 4,17,89, 3,21,94, 4,17,81, 3,22, 5, 4,17,94, 4,17,90, 3,27,75,
+ 3,22,10, 4,23,78, 4,23,66, 3,22, 1, 4,29,37, 3,33,17, 4,23,68, 3,27,74,
+ 4,23,75, 4,23,72, 4,23,69, 3,27,76, 3,27,73, 4,23,80, 4,23,65, 3,27,78,
+ 0, 0, 0, 4,29,48, 4,29,47, 3,33,23, 4,29,44, 4,29,42, 3,33,21, 3,33,27,
+ 4,29,40, 4,29,46, 3,33,28, 3,33,42, 3,33,35, 3,33,31, 3,33,39, 3,33,32,
+ 3,33,38, 3,33,33, 3,33,25, 0, 0, 0, 0, 0, 0, 4,35,56, 4,35,65, 6,61,18,
+ 3,38,89, 3,39,14, 3,39,13, 4,35,54, 3,38,92, 3,39, 7, 3,39,15, 4,35,60,
+ 3,38,87, 5,38, 5, 3,38,93, 4,41,85, 3,44,22, 4,35,68, 5,38, 3, 3,39,11,
+ 3,39,12, 0, 0, 0, 0, 0, 0, 4,42, 4, 3,44,19, 7, 3,26, 4,41,89, 4,41,90,
+ 4,41,86, 4,42, 8, 4,42, 2, 5,45,26, 4,41,94, 5,45,30, 3,44,28, 0, 0, 0,
+ 4,42, 3, 0, 0, 0, 3,48,84, 4,54,25, 4,48,37, 3,48,83, 3,48,78, 3,48,88,
+ 3,48,82, 3,48,81, 3,52,69, 3,52,74, 3,52,72, 3,52,67, 3,52,70, 0, 0, 0,
+ 4,59,13, 3,55,73, 4,59,18, 4,59,16, 4,59,14, 3,55,79, 3,55,81, 4,59,17,
+ 3,55,72, 4,59,15, 3,55,82,15,62,83, 3,58,29, 3,58,30, 0, 0, 0, 4,67,39,
+ 3,60,32, 4,67,38, 5,80, 4, 3,62,18, 4,70,32, 3,64,17, 4,74,41, 4,74,40,
+ 0, 0, 0, 5,89,10, 4, 6,59, 4,13,32, 4,13,31, 4,18, 7, 4,29,52, 4, 4,32,
+ 3, 6,26, 4, 6,62, 4, 6,63, 0, 0, 0, 4, 9,61, 3,12,85, 0, 0, 0, 3,17,30,
+ 4,13,34, 6,24,11, 0, 0, 0, 3,22,19, 4,18, 8, 3,22,21, 4,18,12, 4,23,89,
+ 0, 0, 0, 4,23,85, 4,23,88, 4,23,87, 0, 0, 0, 4,23,86, 5,24,92, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,27,87, 0, 0, 0, 4,29,60, 4,29,57, 4,29,59, 3,33,44,
+ 4,35,70, 5,38,16, 5,38,14, 4,35,73, 4,42,11, 4,42,10, 4,42, 9, 0, 0, 0,
+ 4,48,41, 4,48,44, 0, 0, 0, 3,55,83, 4,59,26, 4,67,44, 4,70,35, 3, 6,27,
+ 6,24,12, 3,33,47, 0, 0, 0, 0, 0, 0, 3, 9,26, 4, 9,65, 3,17,33, 3,25,11,
+ 3,27,88, 4,42,14, 4,54,30, 4,74,43, 4, 9,66, 0, 0, 0, 4,13,41, 6,24,16,
+ 6,41,65, 6,61,49, 5,45,43, 3, 3,81, 6,11,80, 6,24,20, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,22,27, 3,22,30, 0, 0, 0, 4,29,69, 4,42,16, 4,42,17,
+ 4, 2,88, 4, 2,89, 4, 4,35, 3, 6,28, 3, 6,31, 3, 6,30, 0, 0, 0, 3, 6,32,
+ 3, 9,31, 3, 9,29, 4, 6,67, 5, 9,47, 4, 9,67, 3,12,91, 4, 9,68, 4, 9,69,
+ 3,12,88, 3,13, 6, 0, 0, 0, 0, 0, 0, 6,17,71, 4,13,44, 4,18,27, 4,13,43,
+ 0, 0, 0, 3,17,39, 6,24,23, 3,17,42,15,15,78, 0, 0, 0, 4,13,45, 6,32,49,
+ 4,18,22, 4,18,26, 4,18,23, 3,22,35, 6,32,47, 3,28, 2, 4,23,94, 3,27,90,
+ 3,27,91, 4,24, 5, 3,28, 7, 4,24, 2, 6,41,83, 3,28, 1,
+ /* plane 0, page 59 */
+ 1, 255, /* first, last */
+ 6,51,29, 5,31,66, 3,33,50, 3,33,55, 3,33,58, 3,33,53, 3,33,51,
+ 3,33,60, 3,33,56, 4,29,72, 4,29,71, 3,33,52, 3,39,24, 4,35,78, 3,39,18,
+ 3,39,22, 0, 0, 0, 5,45,51, 4,42,18, 3,44,34, 3,44,37, 0, 0, 0, 4,48,50,
+ 4,48,49, 3,49, 1, 5,45,48, 3,48,91, 3,48,92, 4,48,51, 7,14,58, 0, 0, 0,
+ 3,52,83, 3,52,78, 4,54,32, 4,59,32, 0, 0, 0, 4,59,33, 4,59,31, 7,31,86,
+ 0, 0, 0, 3,58,32, 3,58,33, 3,60,36, 3,63,44, 3,63,45, 5,85,78, 5,85,77,
+ 3, 3,84, 4,48,54, 3,52,84, 3, 9,36, 3,17,46, 5,14, 5, 3,22,41, 0, 0, 0,
+ 3,28, 8, 4,26,35, 0, 0, 0, 5,38,37, 5,45,56, 0, 0, 0, 0, 0, 0, 3,49, 5,
+ 0, 0, 0, 3, 3,86, 3, 6,35, 4, 4,40, 3, 6,38, 0, 0, 0, 0, 0, 0, 3, 9,43,
+ 3, 9,38,15, 7,44, 3, 9,48, 3, 9,45, 5, 6,49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,13, 8, 3,13,12, 4, 9,79, 4, 9,76, 3,13, 9, 0, 0, 0, 0, 0, 0,
+ 4,13,55, 4,13,49, 4,13,52, 4,13,56, 3,17,50, 5,14,11, 4,13,50, 4,13,59,
+ 3,17,53, 4,13,54, 3,17,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3,22,57, 4,18,35, 3,22,42, 3,22,47, 5,18,89, 4,18,34, 4,18,38, 4,18,33,
+ 4,24,20, 3,22,56, 3,22,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,24,15, 3,28,14, 4,24,12, 3,28,31, 3,28,16, 4,24,10, 5,25,19, 4,24,13,
+ 3,28,12, 5,25,25, 4,24,21, 3,28,21, 4,24,23, 3,28,22, 3,28,35, 3,28,11,
+ 3,28,13, 0, 0, 0, 0, 0, 0, 4,29,88, 3,33,81, 3,33,70, 3,33,80, 4,29,75,
+ 4,29,78, 4,29,79, 3,33,76, 3,33,73, 3,33,68, 4,29,77, 3,33,62, 4,29,85,
+ 3,33,66, 3,33,67, 3,33,90, 3,33,65, 3,33,63, 4,36, 3, 4,29,86, 3,33,64,
+ 0, 0, 0, 3,34,58, 0, 0, 0, 3,33,71,15,40,53, 4,36, 4, 4,35,85, 4,36, 1,
+ 4,35,92, 3,39,31, 4,35,88, 4,35,83, 3,39,33, 4,35,84, 3,39,42, 4,35,93,
+ 4,35,94, 4,35,90, 4,36, 2, 3,39,47, 3,39,32, 4,36, 5, 4,35,81, 5,38,43,
+ 3,39,41, 4,29,82, 3,39,48, 0, 0, 0,15,40,50, 0, 0, 0, 0, 0, 0, 3,44,46,
+ 5,45,77, 4,42,26, 3,44,44, 5,45,65, 3,44,51, 4,42,23, 4,42,22, 3,44,61,
+ 3,44,56, 7, 3,79, 4,42,24, 4,42,34, 3,44,58, 3,44,60, 3,44,40, 3,44,53,
+ 3,49,35, 0, 0, 0, 0, 0, 0, 3,49,34, 4,48,64, 4,48,58, 3,49,23, 3,49,16,
+ 4,48,57, 4,42,25, 3,49,31, 3,49,10, 3,49,29, 4,54,41, 3,49,19, 3,49,25,
+ 3,44,43, 4,48,62, 3,49,13, 4,48,68, 3,49,21, 3,49,20, 3,49,22, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,53, 2, 4,54,40, 3,52,94, 3,53, 5, 3,52,93, 4,54,43,
+ 7,24,53, 5,59,72, 3,52,87, 3,53, 6,15,63, 9, 3,52,89, 3,53, 8, 4,59,40,
+ 4,59,36, 3,55,92, 4,59,42, 4,59,41, 0, 0, 0, 0, 0, 0, 4,63,79, 4,63,83,
+ /* plane 0, page 60 */
+ 0, 255, /* first, last */
+ 3,58,41, 4,63,80, 4,63,78, 4,63,82, 4,63,85, 3,58,44, 3,58,43,15,66,51,
+ 3,58,42, 3,60,44, 3,60,38, 4,67,49, 4,67,47, 3,60,40, 3,60,45, 4,67,52,
+ 3,60,43, 3,60,37,15,69,30, 0, 0, 0, 5,80, 7, 3,62,22, 3,60,42, 3,63,48,
+ 4,72,78, 3,64,21, 3,64,19, 3,64,20, 0, 0, 0, 5, 4,40, 6, 8,16, 4, 6,77,
+ 5, 6,54, 4, 6,80, 4, 6,76, 4,13,64, 4, 9,80, 4, 9,81, 6,17,88, 4, 9,84,
+ 4, 9,83, 5,14,14, 4,13,61, 4,13,65, 4,13,66, 4,13,62, 3,22,65, 4,18,40,
+ 4,18,41, 6,32,78, 4,24,27, 4,24,25, 3,28,38, 5,25,35, 4,24,28, 6,24,68,
+ 0, 0, 0, 4,30, 1, 4,29,92, 4,29,91, 4,29,93, 4,29,94, 4,30, 2, 3,39,50,
+ 6,61,87, 4,36,10, 4,42,44, 3,44,72, 4,48,70, 4,48,71, 4,54,47, 4,54,46,
+ 3,53,10, 3,53,12, 4,63,87, 7,46, 2, 4,72,81, 5,85,87, 5,89,15, 6, 5, 5,
+ 0, 0, 0, 0, 0, 0, 3,13,30, 0, 0, 0, 3,11,91, 3,28,40, 4,24,31, 5,38,63,
+ 3,56, 4, 4, 2,92, 3, 9,55, 5, 6,66, 4, 6,85, 0, 0, 0, 3,13,31, 3,13,33,
+ 3,13,32, 3,17,73, 3,22,67, 4,18,42, 4,24,37, 4,24,36, 4,24,38, 4,24,34,
+ 3,28,42, 0, 0, 0, 3,34, 3, 4,30, 3, 4,30, 4, 3,34, 4, 0, 0, 0, 4,36,18,
+ 5,38,64, 4,36,19, 4,36,16, 4,42,48, 4,42,47, 4,48,75, 4,48,74, 0, 0, 0,
+ 4,54,49, 4,67,53, 3,60,46, 5,85,88, 5, 4,46, 4, 6,88, 4,13,68, 3,17,75,
+ 4,18,47, 4,24,41, 4,24,42, 4,24,43, 3,34, 5, 4,36,21, 3,49,39, 3,49,40,
+ 4,48,78, 4,54,51, 3,56, 5, 4, 9,91, 3, 3,91, 4, 6,89, 3, 9,59, 4, 6,90,
+ 0, 0, 0,15, 7,59, 3,13,35, 4,13,70, 4,18,50, 4,18,52, 4,18,51, 4,18,53,
+ 3,22,71, 4,13,71, 4,18,49, 5,25,59, 3,28,44, 4,24,47, 4,24,44, 4,30, 9,
+ 3,34, 7, 4,30, 8, 4,30, 7, 4,36,31, 4,36,24, 4,36,25, 4,36,26, 5,38,72,
+ 4,36,28, 0, 0, 0, 4,48,79, 4,48,81, 4,48,82, 3,49,41, 0, 0, 0, 4,59,48,
+ 4,59,47, 3,58,48, 4,77,55, 4,13,74, 3, 9,60, 3,22,72, 3,44,73, 3,49,42,
+ 4, 1,47, 3, 2,54, 3, 2,53, 3, 4, 2, 5, 1,84, 4, 3, 2, 3, 6,52, 0, 0, 0,
+ 3, 6,47, 4, 4,47, 3, 6,61, 6, 8,41, 3, 6,58, 4, 4,49, 3, 6,43, 6, 8,42,
+ 6, 8,36, 0, 0, 0, 3, 6,56, 3, 9,65, 3, 9,63, 3, 9,62, 3, 9,66, 3, 9,64,
+ 4, 6,94, 3, 9,72, 3, 9,70,15, 7,70, 0, 0, 0, 0, 0, 0, 3,13,36, 5,10, 4,
+ 4, 7, 2, 3,13,52, 5, 9,91, 5, 9,92, 4, 9,94, 3,13,54, 3,13,44,15,16,41,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,24,82, 3,17,80, 3,17,81, 4,13,75,
+ 6,25,19, 3,17,84, 4,13,76, 3,22,73, 3,18, 4, 3,18, 3, 3,17,94, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,17,85, 4,18,55, 3,22,81, 4,18,67, 4,18,68,
+ 3,22,78, 4,18,62, 3,23, 2, 3,22,77, 3,28,47, 3,22,94, 4,18,56, 4,18,72,
+ /* plane 0, page 61 */
+ 0, 255, /* first, last */
+ 5,25,62, 4,18,58, 4,18,60, 6,33,11, 5,19,29, 3,28,62, 3,22,91, 3,28,63,
+ 3,22,83, 6,33,33, 3,22,88, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,22,19, 4,24,49,
+ 4,24,54, 3,28,69, 4,24,50, 3,28,57, 4,24,57, 3,28,74, 3,28,71, 3,28,53,
+ 4,24,55, 4,24,58, 3,28,51, 3,28,55, 3,28,65, 3,34,11, 6,42,77, 0, 0, 0,
+ 15,28,35,15,28,58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,30,23, 3,34,12, 3,34,23,
+ 3,34,21, 3,34,40, 3,34,24, 4,30,16, 4,30,25, 4,30,13, 3,34,34, 4,30,24,
+ 3,34,20, 3,34,28, 4,30,28, 3,34,15, 3,34,33, 5,32, 7, 4,30,15, 4,30,18,
+ 3,34,18, 0, 0, 0, 0, 0, 0, 3,34,35, 3,39,53, 4,36,41, 3,39,64, 6,62,27,
+ 3,39,57, 6,52,48, 3,39,56, 4,36,38, 4,36,45, 4,36,42, 6,62,32, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,44,78, 4,42,63, 4,42,65, 3,44,79, 3,44,92, 4,42,72,
+ 4,42,61, 3,44,77, 4,42,57, 3,44,82, 5,38,88, 7, 4,65, 3,44,80, 4,48,84,
+ 3,49,43, 3,44,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,48,87, 4,48,93, 5,53,22,
+ 4,48,86, 3,49,47, 3,49,46, 4,48,90, 5,53,13, 3,49,51, 3,49,55, 4,48,91,
+ 4,54,54, 3,49,49, 3,49,44, 4,48,88, 3,49,50, 4,42,66, 5,53,14, 3,53,18,
+ 3,53,24, 4,54,62, 4,54,64, 3,53,20, 4,54,56, 3,53,14, 4,54,55, 4,54,60,
+ 3,53,27, 4,54,57, 4,54,59, 3,53,19, 0, 0, 0, 4,59,54, 4,59,52, 4,59,58,
+ 4,59,55, 4,59,64, 0, 0, 0, 0, 0, 0, 4,63,91, 4,63,93, 4,59,59, 4,63,89,
+ 3,58,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,60,48, 4,67,58, 4,67,62, 4,67,59,
+ 0, 0, 0, 3,60,50, 4,70,41, 5,80,30, 4,70,42, 4,70,44, 4,72,83, 3,62,25,
+ 3,62,24, 0, 0, 0, 3,63,49, 4,74,46, 3,64,24, 0, 0, 0, 4,75,77, 4,75,78,
+ 3,65,70, 3, 4,10, 0, 0, 0, 4, 4,50, 3, 6,65,15, 4,78, 3, 9,78, 4, 7, 7,
+ 3, 9,88,15, 7,78, 3, 9,83, 3,13,71, 3,13,57, 3,13,70, 3,13,65, 3,13,64,
+ 3,13,59, 0, 0, 0, 4,10, 7, 3,18,14, 4,13,83, 3,18,18, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,23,11, 3,23,10, 3,23,20, 4,18,81, 0, 0, 0, 4,18,86, 4,18,80,
+ 4,18,87,15,22,40, 3,28,86, 4,24,69, 4,24,65, 3,28,85, 4,24,66, 4,24,68,
+ 4,24,64, 3,27, 3, 3,28,94, 3,28,80, 0, 0, 0, 3,28,88, 3,34,52, 3,34,45,
+ 3,34,54, 4,30,43, 3,34,42, 3,34,53, 4,30,40, 4,30,38, 4,30,41, 6,52,52,
+ 3,34,43, 3,34,48,15,34,88,15,35,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,36,57,
+ 3,39,83, 3,39,73, 6,52,71, 4,36,54, 4,36,58, 4,36,60, 3,39,81, 0, 0, 0,
+ 15,41,56, 0, 0, 0, 0, 0, 0, 3,45, 6, 3,45, 3, 3,45,11, 3,45, 1, 3,45, 7,
+ 4,42,74, 0, 0, 0, 0, 0, 0, 4,49, 5, 3,49,61, 3,49,59, 4,49,11, 3,49,63,
+ 3,49,65, 4,49, 4, 0, 0, 0, 3,49,68, 3,49,69, 0, 0, 0, 3,53,29, 4,54,66,
+ /* plane 0, page 62 */
+ 0, 255, /* first, last */
+ 3,53,31, 3,53,36, 7,25, 6, 3,55,49, 3,56,12, 4,54,68, 0, 0, 0, 0, 0, 0,
+ 3,60,58, 3,58,57, 3,60,52, 3,60,59, 4,67,63, 4,70,46, 5,83,55, 4,74,48,
+ 3,64,26, 3,65,90, 4, 7,12, 3, 9,90, 3,23,56, 3,39,84, 3,13,74, 4,13,86,
+ 3,23,22, 4,24,75, 3, 9,91, 4,10,12, 4,24,76, 3, 9,93, 3, 9,94, 5,14,51,
+ 6,25,32, 4,13,90, 4,36,63, 7,25,13, 4,59,68, 4,70,48, 3, 1,74, 3,18,19,
+ 4, 3, 6, 3, 6,69, 4, 4,53, 6,12,81, 4, 7,19, 5, 6,87, 4, 7,18, 4, 7,15,
+ 3,13,76, 3,13,79, 4,10,14, 3,13,78, 0, 0, 0, 3,18,20, 3,18,21, 4,13,93,
+ 4,13,92, 4,18,90, 5,19,45, 4,18,89, 4,18,94, 3,23,24, 6,33,70, 0, 0, 0,
+ 3,23,23, 4,24,80, 4,24,82, 4,24,83, 4,36,67, 6,52,88, 4,30,46, 3,34,62,
+ 0, 0, 0, 4,36,66, 4,36,64, 4,36,68, 4,42,79, 4,42,78, 4,42,82, 4,42,81,
+ 4,42,83, 4,49,14, 4,49,16, 4,49,15, 4,54,71, 3,53,38, 3,53,39, 4,59,70,
+ 4,59,69, 4,64, 4, 7,51,75, 4,74,49, 4, 7,20, 4, 4,57, 3, 6,77, 4, 4,54,
+ 3, 6,76, 6,12,85, 4, 7,25, 5, 7,14, 3,10, 9, 3,10, 4, 3,10, 5, 4, 7,26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,10,18, 4,10,20, 4,10,21, 3,13,82, 6,18,71,
+ 0, 0, 0, 3,18,23, 5,14,60, 4,14, 1, 4,13,94, 4,14, 2, 4,14, 6, 6,33,77,
+ 4,14, 7, 5,19,49, 4,19, 8, 6,33,85, 4,19, 9, 4,19, 5, 4,19,11, 4,19, 7,
+ 4,19,14, 4,24,89, 4,24,87, 3,29,12, 4,24,91, 6,43,35, 0, 0, 0, 4,36,69,
+ 4,30,52, 4,36,70, 4,30,51, 3,34,64, 4,30,50, 0, 0, 0, 4,36,74, 6,62,78,
+ 4,36,73, 4,36,72, 4,36,71, 3,39,86, 4,24,90, 4,42,91, 4,42,86, 4,42,90,
+ 4,42,92, 0, 0, 0, 7,15,84, 4,49,18, 4,49,20, 3,53,40, 4,54,74, 4,54,75,
+ 4,59,71, 5,72,27, 0, 0, 0, 4,67,69, 4,67,70, 4,67,71, 4,67,67, 4,75,79,
+ 3, 4,14, 4, 3, 9, 3, 4,16, 3, 4,17, 3, 6,81, 3, 6,79, 3, 6,80, 0, 0, 0,
+ 3,10,14, 3,13,86, 6,13, 1, 3,10,16, 4, 7,27, 3,10,17, 0, 0, 0, 3,13,93,
+ 3,18,26, 4,10,23, 4,10,24, 0, 0, 0, 0, 0, 0,15,12,18, 0, 0, 0, 4,19,15,
+ 3,18,35, 3,18,36, 3,18,27, 4,19,16, 3,18,37, 0, 0, 0, 0, 0, 0,15,17, 7,
+ 3,18,34, 3,23,31, 3,23,34, 3,23,33, 4,19,19, 3,23,30, 3,23,35, 0, 0, 0,
+ 0, 0, 0, 3,29,20, 4,24,93, 5,26,13, 3,34,67, 3,29,17, 3,29,16, 3,34,76,
+ 0, 0, 0,15,22,57,15,29,27, 0, 0, 0, 0, 0, 0, 4,30,57, 3,34,69, 3,34,73,
+ 5,32,46, 3,34,82,15,35,41,15,35,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,40, 4,
+ 7, 5,23, 0, 0, 0, 0, 0, 0, 4,43, 2, 4,43, 1, 3,45,23, 3,45,28, 3,45,19,
+ 3,45,24, 3,45,20, 3,45,18, 0, 0, 0, 0, 0, 0, 3,49,72, 5,53,61, 4,49,23,
+ 3,49,73, 3,53,42, 4,54,79,15,53,90,15,54, 2, 3,53,46, 4,59,73, 3,53,44,
+ /* plane 0, page 63 */
+ 1, 255, /* first, last */
+ 15,59,13, 3,56,17, 0, 0, 0, 4,64,10,15,66,88,15,66,91, 3,60,65,
+ 0, 0, 0, 4,10,25, 4,10,26, 5,14,66, 4,14,11, 4,19,21, 4,19,20, 4,24,94,
+ 4,36,80, 4,36,81, 4,36,79, 4,43, 3, 4,43, 4, 4,59,76, 4,77,58, 4, 4,62,
+ 5, 7,18, 3,10,20, 3,14, 3, 4,10,29, 3,18,42, 3,18,43, 4,14,13, 3,18,41,
+ 4,14,12, 4,19,27, 4,25, 1, 4,19,26, 4,19,24, 4,19,25, 4,19,23, 4,25, 3,
+ 4,25, 6, 4,19,28, 4,25, 4, 4,30,66, 4,30,65, 4,30,61, 4,30,64, 3,34,86,
+ 4,30,67, 5,39,40, 4,36,83, 4,36,86, 4,36,84, 4,36,88, 4,36,87, 4,36,85,
+ 4,43, 5, 4,43, 7, 4,43, 6, 4,49,31, 3,49,79, 4,49,34, 4,49,33, 4,54,82,
+ 4,54,83, 3,53,49, 4,54,85, 3,53,48, 4,54,81, 0, 0, 0, 4,59,79, 4,59,78,
+ 4,64,12, 4,64,11, 4,72,85, 4,75,80, 4,74,51, 3,18,44, 4,30,69, 0, 0, 0,
+ 3,45,31, 4,54,88, 3,29,32,15,48,46, 0, 0, 0, 5, 4,67, 6, 8,66, 3, 6,82,
+ 4,10,33, 3,14, 9, 4,10,35, 4,14,15, 4,14,17, 5,19,68, 3,23,40, 3,29,33,
+ 4,25, 8, 4,30,73, 3,34,89, 3,34,90, 4,30,72, 4,36,89, 3,45,32, 4,43,10,
+ 4,43, 9, 4,49,36, 5,60,15, 4,59,82, 4,59,83, 4,64,14, 4,67,73, 4,74,52,
+ 4,30,77, 4, 4,65, 4, 4,66, 0, 0, 0, 5, 7,23, 3,10,28, 0, 0, 0, 4,10,38,
+ 3,14,13, 4,10,41, 3,14,12, 3,14,14, 0, 0, 0, 3,18,54, 4,14,23, 4,14,27,
+ 4,14,21, 4,14,22, 3,18,52, 4,14,19, 4,14,31, 4,14,25, 6,25,75, 3,18,51,
+ 4,14,24, 4,14,26, 5,19,77, 4,19,34, 3,23,44, 4,19,32, 4,14,28, 4,19,31,
+ 4,19,37, 3,23,43, 4,19,35, 4,25,18, 4,25,19, 3,29,38, 3,29,43, 6,43,58,
+ 3,29,41, 4,25,22, 5,32,64, 4,25,15, 4,25,16, 3,29,40, 3,29,42, 5,26,27,
+ 4,25,21, 4,25,24, 4,30,84, 5,32,68, 4,30,79, 4,30,88, 4,30,78, 4,30,86,
+ 4,30,83, 4,30,90, 4,37, 4, 4,37, 8, 6,63,13, 3,40,10, 3,40,12, 4,37, 3,
+ 4,37, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5,56, 4,43,24,
+ 3,45,34, 4,43,23, 4,43,21, 4,43,19, 4,43,15, 7, 5,60, 4,43,14, 5,39,57,
+ 0, 0, 0, 4,43,27, 7,16,22, 4,49,40, 4,49,41, 3,49,85, 4,49,46, 4,49,42,
+ 4,49,48, 4,55, 6, 4,55, 2, 4,59,91, 4,59,87, 7,32,75, 4,55, 5, 7,32,71,
+ 0, 0, 0, 4,64,18, 4,64,15, 4,64,16, 0, 0, 0, 4,70,56, 4,70,57, 3,62,32,
+ 5,83,60, 4,74,53, 4,75,82, 4,75,81, 3,66,13, 3, 6,85, 3,14,16, 3,18,56,
+ 0, 0, 0, 3,23,46, 3,35, 2, 3,40,13, 5,39,59, 5,46,57, 4,49,54, 4,64,23,
+ 4,70,59, 4,76,83, 4, 7,38, 4,10,46, 3,14,17, 4,14,38, 4,14,37, 4,19,39,
+ 4,19,40, 4,25,26, 6,53,50, 4,37,16, 4,37,18, 3,40,15, 3,45,35, 4,43,29,
+ 4,49,55, 4,59,94, 4,67,76, 4, 7,40, 4,10,49, 4,10,48, 4,14,39, 4,14,41,
+ /* plane 0, page 64 */
+ 0, 255, /* first, last */
+ 3,18,57, 4,19,43, 3,23,47, 3,29,46, 3,35, 3, 5,32,79, 3,40,18, 4,49,58,
+ 4,37,22, 4,55,12, 4,64,24, 3,63,24, 0, 0, 0, 4,78,40, 3, 6,89, 4, 4,69,
+ 4, 7,46, 4, 7,47, 4, 7,45, 4, 7,44, 4, 7,42, 4,10,51, 4,10,54, 4,10,55,
+ 4,10,52, 4,10,56, 5,10,77, 4,10,58, 6,19,24, 0, 0, 0, 3,14,20, 4,14,50,
+ 3,18,61, 3,18,70, 3,18,64, 4,14,45, 3,18,65, 0, 0, 0, 0, 0, 0, 5,19,86,
+ 4,19,48, 4,19,49, 3,23,54, 3,23,52, 4,19,50, 4,19,46, 4,19,45, 3,29,48,
+ 4,25,41, 3,29,52, 4,25,42, 3,29,53, 4,25,37, 4,25,40, 4,25,31, 4,25,33,
+ 4,25,43, 4,25,38, 4,25,45, 4,25,39, 4,25,35, 4,31, 2, 4,25,44, 4,25,34,
+ 0, 0, 0, 4,31,16, 4,31,13, 3,35, 4, 4,31, 5, 4,31, 6, 4,31, 7, 4,31,11,
+ 4,31,12, 6,53,65, 5,39,65, 4,37,25, 4,37,33, 4,37,28, 4,37,23, 3,40,23,
+ 4,37,35, 4,37,38, 4,37,31, 4,37,36, 3,40,26, 4,37,24, 0, 0, 0, 3,45,37,
+ 4,43,37, 4,43,34, 4,43,36, 4,43,39, 4,43,35, 4,43,45, 3,45,39, 5,46,64,
+ 4,43,31, 0, 0, 0, 3,49,87, 3,49,88, 4,49,60, 4,49,64, 3,49,92, 3,49,90,
+ 4,49,61, 4,49,68, 0, 0, 0, 4,55,18, 4,55,14, 4,55,17, 4,55,15, 3,53,58,
+ 4,55,16, 4,55,19, 4,55,20, 5,54, 2, 5,66,73, 4,60, 7, 4,60, 9, 4,60,10,
+ 4,60, 5, 3,56,23, 4,60, 6, 4,67,80, 4,67,78, 4,67,81, 4,67,79, 4,70,61,
+ 3,62,33, 4,72,88, 4,74,55, 4,72,90, 4,76,85, 4,78,45, 4, 7,49, 4,10,63,
+ 4,19,55, 4,37,42, 3,53,61, 0, 0, 0, 4,55,24, 4,67,84, 4,75,85, 4,14,55,
+ 4,14,56, 4,19,58, 4,19,57, 6,44,11, 4,31,19, 4,37,44, 3, 4,18, 3, 6,90,
+ 4, 7,51,15, 8,90, 4,10,68, 3,14,24, 4,10,66, 3,14,28, 3,13,27, 4,14,63,
+ 4,14,60, 4,14,66, 5,15,20, 3,23,59, 3,18,74, 3,18,75, 4,14,62, 4,14,65,
+ 0, 0, 0, 4,19,62, 4,19,65, 3,23,60, 4,19,63, 3,23,58, 4,19,64, 3,23,62,
+ 3,29,59, 5,26,57, 6,44,19, 4,25,56, 3,29,56, 0, 0, 0, 4,25,51, 4,31,32,
+ 4,31,25, 4,31,31, 3,35,15, 4,31,28, 3,35,18, 4,31,29, 3,35,12, 4,31,30,
+ 4,31,24, 4,31,26, 4,31,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,31,34,
+ 4,37,46, 3,40,35, 4,37,49, 3,40,33, 4,37,45, 4,37,53, 4,37,47, 5,39,86,
+ 0, 0, 0, 4,43,60, 4,43,56, 4,43,54, 4,43,53, 4,43,62, 7, 6, 4, 4,43,59,
+ 3,50, 3, 3,49,93, 4,49,76, 3,49,94, 7,16,57, 5,54,19, 4,49,80, 0, 0, 0,
+ 4,49,77, 4,55,27, 4,55,33, 3,40,34, 4,55,25, 3,53,62, 3,53,63, 4,55,31,
+ 0, 0, 0, 3,56,33, 4,60,13, 3,56,29, 4,60,17, 4,60,15, 4,60,14, 0, 0, 0,
+ 4,64,31, 7,46,60, 3,60,67, 4,67,86, 4,67,85, 4,70,63, 4,70,64, 4,70,65,
+ 4,72,92, 4,72,91, 3,64,85, 3,65,71, 0, 0, 0, 3,14,31, 4,10,71, 4,10,70,
+ /* plane 0, page 65 */
+ 0, 254, /* first, last */
+ 6,19,40, 3,18,78, 4,14,68, 3,18,81, 3,23,68, 4,19,67, 4,19,66, 3,29,65,
+ 3,29,64, 4,25,57, 0, 0, 0, 4,31,37, 4,31,36, 3,35,26, 3,35,27, 3,35,30,
+ 4,31,39, 3,35,28, 3,35,31, 3,40,38, 5,40, 4, 3,40,41, 0, 0, 0, 0, 0, 0,
+ 5,46,86, 3,45,46, 4,49,86, 3,50, 5, 4,49,84, 4,49,85, 0, 0, 0, 4,55,34,
+ 3,56,38, 3,56,39, 3,58,68, 0, 0, 0, 4,70,67, 3,66,20, 5, 4,78, 3, 6,93,
+ 5, 7,38, 6,13,41, 4, 7,54, 3,10,32, 3,10,33, 3,10,35, 4,10,74, 4,10,79,
+ 4,10,75, 4,10,73, 4,10,76,15,12,77, 0, 0, 0, 0, 0, 0, 4,14,69, 3,18,85,
+ 3,18,90, 0, 0, 0, 6,34,70, 4,19,71, 4,19,70, 3,23,77, 4,19,69, 5,20,27,
+ 5,20,25, 4,19,74, 4,19,73, 4,19,75, 3,23,72, 4,19,77, 5,20,24, 3,23,78,
+ 15,23,27, 0, 0, 0, 4,19,68, 5,26,69, 4,25,62, 4,25,66, 3,29,71, 4,25,68,
+ 3,29,74, 4,25,67, 3,29,75, 4,25,65, 4,31,47, 3,35,32, 4,31,45, 3,35,37,
+ 4,31,44, 3,35,34, 4,31,43, 3,35,35, 4,37,55, 4,31,41, 5,33,17, 0, 0, 0,
+ 3,40,49, 3,40,42, 4,37,59, 3,40,51, 3,40,46, 4,37,58, 3,40,44, 4,37,56,
+ 6,63,75, 4,37,57, 0, 0, 0, 0, 0, 0, 4,43,69, 4,43,65, 3,45,52, 4,43,66,
+ 3,45,50, 7, 6,18, 3,45,56, 4,43,72, 4,43,70, 4,43,68, 3,45,57, 4,49,93,
+ 4,49,92, 3,50,11, 4,49,89, 4,49,88, 4,49,90, 3,50,13, 4,55,37, 3,53,67,
+ 4,55,39, 3,56,40, 7,33,14, 4,60,23, 4,60,21, 4,60,22, 0, 0, 0, 0, 0, 0,
+ 3,62,38, 4,67,89, 4,70,69, 7,56,44, 0, 0, 0, 4,70,68, 4,72,94, 4,73, 1,
+ 3,66,25, 4, 4,73, 6,13,46, 3,14,38, 3,14,37, 4,10,81, 4,10,82, 3,19, 1,
+ 3,18,94, 3,18,93, 4,19,79, 4,19,80, 3,23,79, 5,20,37, 4,19,82, 4,19,81,
+ 6,34,79, 3,29,76, 4,25,71, 3,29,77, 6,44,51, 3,29,78, 5,33,25, 4,31,51,
+ 4,31,50, 6,54, 7, 4,37,64, 6,63,88, 4,43,76, 5,47, 3, 0, 0, 0, 5,52, 4,
+ 4,50, 5, 4,50, 2, 4,50, 4, 7,16,79, 0, 0, 0, 3,53,69, 3,53,70, 4,55,44,
+ 4,55,45, 4,55,43, 4,55,47, 3,53,71, 4,60,25, 4,60,26, 4,64,40, 4,64,41,
+ 4,67,92, 4,73, 2, 3, 4,20, 3,10,38, 0, 0, 0, 4,10,86, 3,14,42, 3,19, 5,
+ 4,14,77, 3,19, 2, 0, 0, 0, 5,20,38, 3,29,79, 4,25,74, 3,35,40, 4,31,52,
+ 4,31,53, 4,31,58, 4,37,67, 4,55,50, 4,60,27, 3,58,72, 5,11, 1, 4,14,85,
+ 4,14,80, 3,19, 8, 4,14,87, 3,19, 9, 4,14,83, 4,14,82, 4,19,86, 4,19,93,
+ 3,23,84, 5,20,40, 4,19,87, 4,19,91, 3,23,85, 6,34,86, 4,19,88, 4,25,77,
+ 4,25,84, 4,25,81, 3,29,84, 4,31,59, 4,25,82, 3,29,90, 4,25,85, 3,29,83,
+ 4,25,79, 6,44,59, 6,44,54, 0, 0, 0, 0, 0, 0, 3,35,48, 4,31,70, 4,31,66,
+ 4,31,65, 3,35,50, 3,35,51, 4,31,61, 3,35,46, 4,31,64, 3,35,43,
+ /* plane 0, page 66 */
+ 0, 255, /* first, last */
+ 4,31,67, 5,40,38, 4,25,86, 4,37,69, 3,40,59, 4,37,74, 4,37,73, 3,40,63,
+ 4,37,78, 4,37,72, 3,40,57, 4,37,77, 4,37,70, 5,40,22, 4,43,91, 4,43,85,
+ 4,43,80, 3,45,65, 3,45,62, 4,44, 2, 3,45,71, 4,43,94, 3,45,66, 4,44,14,
+ 5,47,27, 3,45,68, 4,44,16, 4,44, 5, 4,44,13, 4,43,89, 5,47,18, 3,45,63,
+ 5,47,37, 4,44,12, 4,44, 7, 4,43,87, 3,45,70, 3,45,72, 4,44, 8, 5,47,22,
+ 0, 0, 0, 0, 0, 0, 4,50,20, 4,50,26, 3,50,17, 4,50,23, 4,50,11, 4,50,24,
+ 3,50,21, 4,50,25, 4,50,27, 4,50,22, 4,50,15, 4,50,29, 4,50, 9, 3,50,18,
+ 4,55,59, 5,60,77, 4,55,62, 4,55,58, 4,55,66, 5,60,93, 4,55,69, 4,55,51,
+ 3,53,76, 4,55,54, 4,55,56, 4,55,57, 5,60,94, 4,55,53, 5,61,16, 0, 0, 0,
+ 4,60,36, 4,60,47, 4,60,43, 4,60,48, 4,60,35, 3,56,42, 4,60,42, 3,58,76,
+ 4,60,34, 4,60,44, 7,33,31, 4,60,38, 4,60,41, 4,60,32, 5,67,20, 4,60,40,
+ 3,56,45, 3,56,43, 5,67,33, 4,64,54, 5,72,78, 3,58,74, 4,64,51, 5,72,70,
+ 3,58,77, 3,58,73, 3,58,75, 4,60,49, 0, 0, 0, 4,67,94, 4,70,73, 4,70,76,
+ 4,70,78, 3,62,42, 4,70,74, 3,62,45, 4,70,72, 4,70,77, 3,63,54, 5,80,65,
+ 4,73, 6, 4,73, 8, 4,74,61, 4,74,65, 4,74,60, 3,64,63, 4,75,86, 4,77,60,
+ 4,77,86, 7,69,61, 4,10,87, 3,19,15, 3,19,19, 6,35, 2, 4,20, 5, 5,20,57,
+ 3,23,92, 6,44,64, 4,25,91, 4,25,92, 3,29,93, 3,29,92, 4,25,93, 3,35,58,
+ 3,35,54, 3,35,55, 3,35,57, 3,35,59, 0, 0, 0, 3,40,67, 4,37,82, 3,40,68,
+ 3,40,69, 6,64,12, 3,40,70, 3,45,75, 3,45,76, 3,45,73, 3,45,74, 4,44,23,
+ 7, 6,55, 4,44,21, 3,50,22, 4,55,77, 3,53,83, 3,53,82, 4,55,73, 4,55,74,
+ 3,45,84, 4,55,75, 0, 0, 0, 5,67,46, 4,60,54, 3,56,50, 4,60,53, 4,60,52,
+ 5,67,52, 3,56,51, 3,58,80, 4,64,59, 4,64,61, 4,68, 3, 3,60,72, 7,52,26,
+ 5,80,80, 4,74,69, 5,86,25, 4,76,90, 3,65,37, 4, 7,60, 6,19,68, 3,14,55,
+ 3,14,53, 3,14,56, 4,14,88, 4,14,94, 3,19,21, 3,19,20, 4,14,92, 3,19,25,
+ 4,15, 1, 3,19,24, 4,14,93, 3,19,22, 3,19,26, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,20,14, 4,20, 6, 3,24, 3, 3,24,10, 4,20, 7, 4,20,16, 3,24,12, 4,20,13,
+ 4,20,11, 4,20, 9, 3,24, 8, 3,24,13, 3,24, 5, 3,30,22, 5,27,12, 3,30,13,
+ 3,30,18, 3,30, 7, 3,30,16, 3,30, 5, 6,44,81, 0, 0, 0, 3,30,17, 4,31,74,
+ 3,35,69, 3,35,75, 4,31,78, 4,31,83, 4,31,79, 3,35,65, 3,35,61, 3,40,76,
+ 4,37,85, 4,37,94, 4,37,89, 4,38, 1, 3,40,71, 3,35,63, 3,40,82, 3,40,85,
+ 4,38, 3, 5,40,52, 3,40,79, 3,46,10, 5,47,51, 4,44,30, 4,44,28, 4,44,32,
+ 3,45,91, 3,46, 1, 3,46,13, 3,45,86, 3,45,89, 4,44,26, 4,44,29, 4,44,31,
+ /* plane 0, page 67 */
+ 0, 255, /* first, last */
+ 3,45,90, 4,44,36, 5,47,52, 3,46, 6, 3,46, 3, 3,50,26, 4,50,41, 3,50,28,
+ 4,50,39, 3,50,29, 3,50,30, 0, 0, 0, 4,55,83, 3,53,88, 5,61,31, 3,53,86,
+ 5,61,38, 3,53,87, 4,55,78, 3,53,92, 3,53,91, 7,26,25, 4,60,66, 4,60,64,
+ 4,55,82, 3,56,55, 3,56,54, 3,57, 9, 4,64,70, 4,64,67, 4,64,72, 4,64,66,
+ 7,39,42, 3,58,83, 3,58,81, 5,77, 2, 3,60,73, 4,68, 4, 3,60,74, 3,60,75,
+ 3,62,47, 3,62,46, 4,73,10, 7,56,56, 3,63,57, 4,73,11, 4,74,70, 4,75,89,
+ 4,75,88, 7,63,19, 3,64,88, 4,76,92, 4,76,91, 4,77,87, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,10,89, 4,15, 9, 3,24,15, 3,24,18, 5,20,64, 4,20,20,
+ 3,24,16, 4,20,19, 4,26, 8, 4,38, 5, 3,40,86, 4,50,46, 4,74,75,15, 1,39,
+ 3,10,45, 3,14,60, 3,14,59, 3,14,57, 4,10,91, 4,15,10, 6,26,75, 4,15,13,
+ 4,20,21, 4,31,85, 4,26,10, 3,35,76, 3,35,77, 5,33,69, 3,40,90, 3,40,91,
+ 0, 0, 0, 4,50,47, 4,55,85, 4,60,69, 4,64,77, 4,70,91, 4,75,91, 6,26,84,
+ 4,15,14, 3,17,31, 4,20,24, 4,20,22, 4,20,23, 6,35,28, 4,26,13, 4,26,17,
+ 4,26,16, 4,31,86, 3,40,94, 4,38, 7, 3,40,93, 4,38, 8, 3,40,92, 4,44,41,
+ 4,50,51, 3,50,33, 4,55,87, 4,60,74, 4,60,75, 4,73,12, 3,19,32, 3,19,33,
+ 4,20,26, 3,24,19, 4,20,27, 4,20,30, 4,20,28, 3,24,21, 3,24,20, 4,26,20,
+ 4,26,21, 5,27,26, 4,26,19, 3,35,80, 4,31,88, 3,35,81, 4,31,87, 3,35,79,
+ 3,41, 1, 4,38,10, 4,38, 9, 4,38,11, 4,50,53, 4,50,54, 3,56,62, 3,56,64,
+ 3,56,63, 3,60,78, 4,70,93, 0, 0, 0, 3,30,25, 3,30,26, 0, 0, 0, 4,11, 7,
+ 4,11, 8, 4,15,24, 4,11, 9, 3,24,24, 4,31,90, 0, 0, 0, 4,38,14, 4,38,13,
+ 4,38,15, 4,38,18, 4,38,16, 4,44,47, 0, 0, 0, 4,55,93, 4,55,90, 4,55,91,
+ 4,60,80, 4,71, 1, 4, 4,77, 3,19,38, 3,19,37, 3,24,26, 4,20,33, 4,26,25,
+ 5,33,80, 3,35,84, 4,38,22, 4,38,20, 4,38,21, 4,38,23, 3,41, 4, 3,46,19,
+ 4,44,50, 4,50,58, 3,50,34, 4,50,59, 4,56, 1, 4,56, 4, 4,56, 3, 4,56, 2,
+ 3,56,68, 4,68, 8, 3,63,60, 6,54,77, 4, 3,13, 6, 5,41, 4, 4,79, 4, 4,78,
+ 3,10,49, 6,27, 8, 3,10,53, 3,10,48, 4, 7,70,15, 8,50, 4, 7,66, 4, 7,71,
+ 4, 7,67, 4, 7,69, 5, 7,56, 3,10,58, 3,10,51, 0, 0, 0, 5,11,19, 4,11,15,
+ 4,11,10, 4,11,12, 3,14,66, 3,14,63, 6,19,93, 5,11,25, 3,19,49, 4,15,33,
+ 4,15,38, 4,15,39, 4,15,31, 6,27,17, 5,15,77, 0, 0, 0, 0, 0, 0, 3,24,38,
+ 4,20,44, 4,20,40, 3,24,36, 4,20,43, 4,20,50, 4,20,49, 4,20,42, 4,20,51,
+ 6,35,56, 3,24,32, 3,24,31, 3,24,35, 4,26,41, 4,26,26, 3,30,31, 4,26,37,
+ /* plane 0, page 68 */
+ 0, 255, /* first, last */
+ 5,27,45, 4,26,42, 4,26,33, 4,26,32, 4,26,34, 4,26,29, 0, 0, 0, 3,30,38,
+ 4,26,31, 4,26,36, 4,26,43, 6,41,94, 6,45,52, 6,54,86, 4,32, 7, 3,35,88,
+ 4,32,10, 4,32, 3, 4,32, 6, 3,35,90, 4,31,93, 4,32, 8, 3,36, 1, 4,32,12,
+ 3,35,93, 3,35,89, 5,20,74, 4,32, 5, 4,38,37, 4,38,30, 4,38,28, 4,38,29,
+ 4,38,31, 3,50,40, 4,38,34, 4,38,32, 4,38,27, 3,41, 9, 3,41, 8, 4,38,24,
+ 4,38,39, 4,38,33, 0, 0, 0, 4,44,61, 4,44,56, 4,44,62, 4,44,53, 4,44,60,
+ 6,64,79, 4,44,52, 4,44,59, 4,44,63, 5,34, 8, 4,50,67, 4,50,68, 3,50,38,
+ 3,50,37, 4,50,62, 4,50,65, 4,50,66, 4,50,70,15,49,53, 5,61,59, 4,56,11,
+ 4,56, 8, 4,56,12, 4,60,84, 3,56,70, 4,60,86, 3,56,71, 3,58,86, 4,64,84,
+ 4,64,83, 5,77,12, 4,68,10, 4,71, 2, 4,71, 4, 4,71, 3, 4,71, 5, 4,73,16,
+ 6,35,68, 7,34, 4, 3,11,36, 3,36, 4, 4,15,42, 4,20,56, 0, 0, 0, 4,44,67,
+ 4,50,75, 3,19,51, 3,19,52, 3,24,42, 4,44,68, 6,65, 1, 3,50,43, 3,62,52,
+ 4, 7,79, 4,11,19, 4,11,18, 3,14,71, 3,19,54, 4,15,48, 3,24,43, 6,35,81,
+ 6,35,80, 0, 0, 0, 3,30,42, 4,26,46, 4,26,47, 6,45,67, 0, 0, 0, 5,34,13,
+ 4,32,15, 4,38,47, 4,38,49, 4,38,48, 3,41,12, 6,65, 4, 5,41,12, 0, 0, 0,
+ 0, 0, 0, 3,46,30, 4,44,72, 4,44,69, 4,50,76, 4,50,77, 0, 0, 0, 4,56,16,
+ 4,56,20, 4,56,19, 3,54, 5, 3,54, 6, 5,61,71, 5,60,45, 4,56,18, 0, 0, 0,
+ 4,60,92, 4,68,13, 4,15,51, 4,20,60, 4,50,79, 4,50,78, 4,56,21, 4,60,93,
+ 4,73,19, 0, 0, 0, 6, 5,47, 3, 4,23, 3, 4,25, 3, 7, 7, 4, 4,86, 4, 4,93,
+ 3, 7,12, 0, 0, 0, 3,10,67, 3,10,71, 3,10,68, 3,10,74, 4, 7,82, 3,10,66,
+ 4, 8, 1, 4, 7,83, 3,10,69, 3,10,73, 5, 7,67, 3,10,65, 3,14,77, 4,11,22,
+ 3,14,80, 3,14,81, 3,14,76, 3,14,83, 3,14,85, 6,20,26, 0, 0, 0, 0, 0, 0,
+ 4,15,53, 3,19,65, 4,15,65, 3,19,68, 3,19,59, 3,19,62, 6,27,54, 3,19,61,
+ 4,15,62, 3,19,60, 3,19,69, 5,16, 1, 4,15,57, 4,15,68, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,19,64, 4,20,62, 4,20,76, 4,20,81, 3,24,58, 4,20,73, 4,20,69,
+ 3,24,54, 4,20,70, 4,20,66, 4,20,61, 4,20,67, 6,36,12, 3,24,44, 6,36, 8,
+ 5,21,10, 3,24,57, 3,24,60, 5,21, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,26,76,
+ 4,26,64, 4,26,63, 4,26,68, 4,26,57, 5,27,54, 4,26,59, 4,26,54, 3,30,51,
+ 4,26,62, 3,30,52, 3,30,49, 4,26,60, 4,26,65, 3,30,53, 6,46, 7, 3,30,44,
+ 0, 0, 0, 0, 0, 0,15,30,75, 0, 0, 0, 0, 0, 0, 4,32,16, 4,32,18, 4,26,69,
+ 3,36,23, 4,38,73, 4,32,39, 4,32,41, 4,32,26, 3,36,11, 3,36, 9, 3,36,20,
+ 4,32,40, 3,36,29, 4,32,44, 0, 0, 0, 4,38,69, 3,41,15, 4,38,55, 6,65,36,
+ /* plane 0, page 69 */
+ 0, 255, /* first, last */
+ 4,38,68, 3,41,17, 4,38,51, 5,41,28, 4,38,65, 3,41,16, 4,38,77, 4,38,64,
+ 4,38,60, 3,41,20, 5,41,27, 6,65,56, 3,41,23, 3,41,32, 3,46,35, 4,44,82,
+ 3,46,31, 4,44,80, 4,45, 4, 4,44,75, 3,46,33, 4,44,81, 3,46,51, 4,44,77,
+ 4,44,83, 3,46,39, 3,46,37, 3,46,54, 4,44,93, 3,50,49, 4,44,76, 3,46,42,
+ 4,44,78, 3,46,40, 3,46,53, 3,46,41, 5,48,38, 3,46,48,15,49,69,15,49,83,
+ 15,49,86, 4,45, 1, 4,44,79, 3,46,49, 4,44,87, 4,50,87, 4,50,91, 4,50,89,
+ 4,51,12, 4,51, 1, 4,50,86, 3,50,51, 4,51, 5, 3,50,55, 4,50,94, 3,50,45,
+ 4,51, 3, 4,50,90, 4,50,92, 4,50,82, 5,68,13, 3,50,44, 4,51, 2, 4,50,83,
+ 3,50,46, 4,51, 7, 0, 0, 0, 4,51,17, 4,38,71, 4,56,36, 4,56,28, 4,56,24,
+ 4,56,34, 5,61,89, 4,56,22, 4,56,27, 3,54,14, 3,54, 7, 4,56,29, 3,54,10,
+ 0, 0, 0, 3,54,15, 3,56,73, 4,60,94, 4,61,11, 3,56,77, 3,56,80, 3,56,74,
+ 3,56,81, 4,61, 3, 7,34,24, 4,61, 1,15,64,46, 7,27,18, 4,64,87, 3,60,83,
+ 3,59, 3, 4,64,88, 3,59, 1, 0, 0, 0, 3,59, 4, 7,41,51, 4,68,15, 4,68,20,
+ 3,60,93, 4,68,19, 3,60,84, 7,52,72, 3,60,89, 4,68,18, 4,68,24, 3,60,90,
+ 4,68,16, 3,60,85, 4,68,22, 4,71, 7, 3,62,57, 4,71, 8, 0, 0, 0,15,72,25,
+ 3,63,61, 4,73,23, 7,56,82, 3,64,33, 3,64,34, 5,88, 5, 4,75,93, 4,77,62,
+ 4,76,93, 3,65,74, 4,77,89, 4,77,91,15,76,76, 4,78,23, 4,78,22, 5,92,30,
+ 3,10,77, 4,11,30, 4,15,71, 3,19,71, 3,19,70, 3,19,72, 5,21,21, 3,24,66,
+ 5,27,80, 3,30,64, 3,36,33, 5,34,52, 5,34,51, 3,36,34, 3,36,35, 4,45, 6,
+ 4,51,22, 4,61,18, 5,68,27, 5,68,26, 4,68,26, 3, 7,14, 3,14,93, 3,15, 1,
+ 3,15, 2, 4,15,73, 4,15,75, 6,27,73, 3,24,72, 3,24,71, 4,20,92, 3,24,69,
+ 4,20,91, 4,20,89, 5,28, 6, 6,36,40, 0, 0, 0, 4,26,82, 3,30,71, 4,26,84,
+ 3,30,69, 5,27,84, 4,26,80, 4,26,77, 3,30,68, 3,30,70, 4,32,54, 4,32,55,
+ 3,36,43, 3,36,39, 4,32,59, 4,26,78, 4,32,61, 3,36,42, 0, 0, 0, 4,38,88,
+ 3,41,38, 4,38,82, 4,38,83, 4,38,81, 4,38,85, 3,41,39, 4,38,80, 4,38,86,
+ 6,65,73, 3,41,40, 4,38,91, 3,46,58, 3,46,60, 7, 8,34, 3,46,55, 3,46,56,
+ 4,45,16, 3,46,59, 4,38,89, 4,45,22, 4,45,15, 3,41,45, 0, 0, 0, 4,51,30,
+ 3,50,60, 7,18,83, 4,51,29, 4,56,45, 3,50,64, 7,18,85, 3,50,65, 5,62,18,
+ 4,56,55, 4,56,50, 3,54,23, 4,56,56, 4,56,47, 4,56,54, 3,54,24, 4,56,46,
+ 3,54,18, 4,56,52, 4,56,63, 3,54,21, 3,54,28, 0, 0, 0, 3,54,17, 4,61,27,
+ 5,62,21, 4,61,25, 3,56,82, 0, 0, 0, 4,65, 4, 5,73,33, 3,59,10, 4,65, 1,
+ 4,65, 5,15,67,78, 5,77,43, 0, 0, 0, 4,68,27, 4,68,28, 4,68,32, 4,68,30,
+ /* plane 0, page 70 */
+ 0, 255, /* first, last */
+ 4,68,33, 3,61, 6, 3,62,62, 4,71,16, 4,68,29, 4,73,30, 3,63,62, 3,63,64,
+ 3,64,36, 7,57, 5, 7,60,62, 4,74,88, 7,60,67, 3,65,40, 4,78,25, 3,15, 5,
+ 6,27,83, 3,24,73, 3,36,44, 4,39, 3, 4,45,23, 4,15,79, 4,26,88, 3,46,62,
+ 4,51,42, 3,59,14, 3,10,78, 0, 0, 0, 3,15, 8, 4,11,38, 0, 0, 0, 5,16,29,
+ 4,15,82, 5,16,25, 4,21,10, 4,26,90, 4,21,13, 4,21,14, 4,21,12,15,18,49,
+ 4,26,89, 3,30,81, 4,21,16, 3,30,78, 3,30,76, 3,30,75, 3,15,42, 4,32,66,
+ 4,39, 5, 6,56,11, 0, 0, 0, 3,41,51, 4,39,13, 5,41,76, 5,41,77, 4,32,70,
+ 4,39,17, 4,39, 7, 3,41,53, 4,32,64, 4,39,10, 4,39,14, 4,39, 6, 4,39,11,
+ 3,41,58, 3,41,48, 3,41,59, 4,45,28, 4,45,31, 4,45,26, 4,45,25, 4,45,34,
+ 4,45,32, 4,45,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,51,50, 4,51,53,
+ 4,51,54, 3,46,67, 4,51,47, 0, 0, 0, 4,56,67, 4,56,71, 3,54,37, 3,54,35,
+ 4,56,68, 3,54,30, 7,27,57, 3,54,36, 4,56,69, 3,54,33, 5,68,54, 4,61,42,
+ 4,61,40, 4,61,41, 4,61,36, 4,61,38, 4,65,10, 7,35, 2, 4,68,35, 7,48, 5,
+ 3,61, 7, 4,68,36, 3,62,63, 0, 0, 0, 4,74,91, 7,57,18, 3,64,90, 4,76, 6,
+ 3,64,89, 4,77,93, 5,11,39, 4,15,83, 4,21,17, 4,27, 1, 0, 0, 0, 3,19,89,
+ 3,19,88, 4,21,19, 4,21,21, 0, 0, 0, 4,27, 3, 5,28,21, 4,27, 2, 3,30,83,
+ 3,36,48, 3,36,49, 4,39,22, 4,39,24, 4,45,42, 4,45,40, 4,51,58, 4,51,59,
+ 5,56,18, 4,51,60, 5,62,35, 4,56,72, 4,56,73, 4,61,46, 4,61,48, 4,65,13,
+ 4,65,14, 3,59,16, 4,65,12, 4,65,16, 3,62,64, 0, 0, 0, 3,66,28, 4,21,26,
+ 3,36,51, 4,32,71, 3,36,50, 4,39,26, 4,45,49, 4,45,44, 4,45,46, 4,45,51,
+ 4,45,47, 4,51,68, 4,51,65, 4,51,66, 0, 0, 0, 4,56,75, 4,56,74, 5,68,67,
+ 4,65,17, 4,65,20, 4,68,38, 4,68,39, 0, 0, 0, 4,77, 2, 3,15,11, 5,11,41,
+ 3,15,13, 4,15,94, 3,19,93, 4,21,33, 3,24,92, 3,24,88, 5,21,55, 4,21,36,
+ 5,21,62, 3,25, 4, 3,25, 8, 3,25, 1, 4,21,31, 3,24,93, 3,25, 7, 4,21,35,
+ 5,21,61, 6,36,77, 3,25, 6, 5,21,54, 4,27,19, 3,30,89, 3,30,90, 4,27,22,
+ 4,27,21, 3,30,86, 3,30,91, 3,30,87, 4,27,20, 4,27,10, 4,27, 9, 4,27,11,
+ 3,31, 6, 6,46,75, 3,31, 5, 0, 0, 0, 3,36,55, 6,56,33, 3,36,62, 4,32,78,
+ 4,32,77, 4,32,76, 3,36,58, 3,36,63, 3,36,66, 4,39,29, 4,39,32, 4,39,42,
+ 4,39,28, 3,41,74, 4,39,38, 4,39,34, 3,41,65, 4,39,35, 3,41,73, 3,41,71,
+ 3,41,61, 4,45,57, 4,45,54, 4,45,60, 4,45,62, 3,46,72, 4,45,65, 4,45,56,
+ 4,45,59, 3,46,77, 4,45,63, 4,45,58, 3,46,75, 4,45,64, 7, 8,89, 4,45,53,
+ 3,46,81, 4,51,74, 3,50,76, 3,50,77, 7,19,45, 4,51,75, 3,54,39, 4,56,80,
+ /* plane 0, page 71 */
+ 0, 255, /* first, last */
+ 3,54,43, 3,54,44, 5,62,53, 4,61,58, 7,42, 5, 4,61,55, 4,61,59, 3,57, 2,
+ 3,57, 5, 4,61,52, 3,57, 7, 4,65,32, 5,73,50, 3,59,19, 4,65,27, 4,65,29,
+ 4,65,37, 5,73,49, 4,68,46, 3,61,13, 7,48,17, 4,68,44, 3,61,15, 4,68,40,
+ 3,61,17, 4,71,29, 4,71,31, 7,53,18, 4,71,30, 4,71,32, 4,71,25, 7,57,24,
+ 3,63,67, 4,73,40, 5,86,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,11,41, 4,16, 3, 6,46,90, 3,31, 7, 4,39,44, 3,46,87,
+ 4,56,85, 4,61,65, 4,73,44, 0, 0, 0, 4,21,42, 3,31, 8, 4,32,84, 4,39,46,
+ 4,39,47, 3,41,76, 4,45,68, 3,50,80, 4,51,83, 3,50,79, 4,51,82, 3,50,81,
+ 4,56,86, 4,56,87, 3,54,46, 4,71,36, 4,77, 4, 4,16, 5, 4,21,43, 6,37, 2,
+ 4,21,44,15,36,84, 4,45,71, 4,45,69, 4,45,72, 4,51,85, 4,51,87, 4,61,68,
+ 4,65,40, 4,65,38, 4,71,37, 3,63,69, 3,65,44, 4,77, 5, 4,21,48, 6,37, 4,
+ 3,25,15, 0, 0, 0, 4,27,30, 0, 0, 0, 3,41,78, 3,46,89, 3,46,88, 3,50,82,
+ 3,54,48, 3,57,12, 3,57,13, 4,65,42, 7,42,33, 3,59,23, 4,61,72, 4,21,49,
+ 4,21,52, 5,28,44, 4,27,31, 4,27,33, 3,31,14, 4,27,34, 6,47, 9, 4,27,35,
+ 4,33, 1, 3,36,70, 3,36,72, 5,42, 9, 6,66,74, 3,41,79, 3,46,91, 3,46,92,
+ 4,45,78, 4,45,76, 7, 9,22, 4,45,77, 0, 0, 0, 5,49,25, 3,47, 1, 3,50,84,
+ 4,51,93, 4,51,89, 4,51,91, 4,51,90, 3,50,86, 7,28,19, 4,56,90,15,64,90,
+ 4,51,94, 3,61,21, 3,62,68, 4,75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,16,43, 5,35,20, 4,39,57, 4,39,56, 4,71,40, 5,16,44, 4,16, 7,
+ 4,16, 8, 4,21,53, 4,21,54, 3,25,20, 3,25,22, 3,31,17, 4,27,37, 3,31,22,
+ 3,31,18, 5,28,50, 3,31,21, 4,27,40, 4,27,39, 4,33, 6, 4,33, 7, 5,35,28,
+ 3,36,74, 4,33, 8, 5,35,24, 4,39,58, 6,66,85, 4,39,59, 3,41,86, 5,42,20,
+ 3,41,87, 5,42,18, 0, 0, 0, 3,47, 7, 4,45,83, 4,45,81, 3,47, 4, 4,45,84,
+ 7, 9,29, 4,52, 6, 5,56,60, 5,56,53, 3,50,88, 4,56,93, 4,57, 5, 4,56,92,
+ 5,62,77, 4,61,77, 3,57,15, 4,61,76, 4,61,74, 4,61,78, 3,57,16, 4,65,45,
+ 3,61,22, 4,68,53, 4,68,51, 4,68,54, 4,71,42, 4,73,46, 3,63,70, 4,73,47,
+ 4,75, 3, 4,76, 8, 4,77, 7, 4,11,44, 3,15,15, 4,16,10, 3,19,94, 4,21,62,
+ 4,21,57, 5,21,82, 3,25,27, 4,21,59, 4,21,60, 4,21,61, 3,25,28, 5,28,67,
+ 4,27,44, 4,27,48, 3,31,29, 4,27,45, 4,27,41, 6,47,22, 6,47,28, 5,28,60,
+ 4,27,42, 4,27,43, 4,27,47, 3,31,28, 5,28,63, 4,27,49, 4,33, 9, 5,35,43,
+ 3,36,76, 3,36,78, 0, 0, 0,15,37,56, 5,42,30, 4,39,62, 4,39,65, 4,39,63,
+ 4,39,66, 4,39,69, 3,41,88, 4,39,68, 3,47, 8, 3,36,79, 4,45,87, 4,46, 2,
+ /* plane 0, page 72 */
+ 0, 255, /* first, last */
+ 3,47,10, 7, 9,46, 3,47,14, 3,47, 9, 4,45,94, 4,46, 1, 4,45,93, 4,45,89,
+ 4,45,88, 4,45,86, 3,47,13, 4,46, 3, 0, 0, 0, 4,52,14, 3,50,93, 3,50,90,
+ 4,52,15, 4,52,13, 5,56,66, 4,52,16, 3,50,89, 5,62,91, 0, 0, 0, 4,57,11,
+ 4,57,12, 4,57, 6,15,60,88, 4,57,10, 4,57, 8, 3,54,51, 3,57,19, 4,61,84,
+ 4,61,88, 4,61,82, 4,61,85, 7,42,55, 4,65,48, 3,57,20, 4,65,49, 4,61,87,
+ 4,68,59, 4,68,58, 4,71,48, 4,71,44, 5,84,43, 4,75, 4, 7,60,87, 4,76, 9,
+ 3,65,47, 3,66,14, 3,31,34, 5,28,71, 4,27,50, 4,27,51, 3,31,33, 3,36,81,
+ 3,36,80, 3,36,82, 0, 0, 0, 4,46, 6, 4,52,18, 4,57,16, 3,54,54, 3,59,30,
+ 4,68,63, 3,64,44, 4,11,45, 4,11,46,15,13,51, 3,20, 2, 3,25,35, 3,25,36,
+ 3,25,40, 4,21,65, 4,21,66, 3,25,37, 3,25,38, 3,25,34, 6,37,37, 3,31,40,
+ 3,31,35, 4,27,52, 3,31,42, 3,36,85, 4,33,10, 3,36,84, 6,57, 4, 4,33,12,
+ 4,39,70, 4,39,73, 4,39,71, 3,41,94, 4,46, 8, 4,46, 7, 4,46,10, 4,46, 9,
+ 3,51, 3, 5,56,82, 4,52,19, 4,52,20, 5,49,65, 3,54,56, 4,57,18, 4,57,21,
+ 4,57,23, 3,54,55, 4,57,17, 4,61,92, 4,61,91, 4,61,90, 5,69,21, 4,61,93,
+ 4,61,94, 0, 0, 0, 4,65,57, 4,65,56, 4,65,55, 4,68,64, 4,68,65, 4,71,50,
+ 15,72,51, 3,63,72, 3,63,71, 0, 0, 0, 3,64,93, 4,77,65, 4,78, 1, 3,66,29,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,46,14, 3,61,25, 4,39,75,15,44,71, 3,47,24,
+ 4,68,67, 7,48,54, 3, 7,18, 4, 5, 2,15, 8,82, 3,10,79, 5, 7,73, 0, 0, 0,
+ 4,11,51, 4,11,48, 3,20, 3, 4,16,13, 4,16,16, 3,20, 4, 4,16,14, 0, 0, 0,
+ 0, 0, 0, 3,25,41, 4,21,73, 3,25,45, 3,31,51, 4,27,55, 3,31,46, 6,47,40,
+ 3,31,50, 4,33,15, 3,42, 5, 0, 0, 0, 4,39,76, 3,42, 3, 3,47,26, 4,46,17,
+ 4,46,21, 3,47,29, 3,51,10, 3,51, 8, 3,51, 9, 4,57,24, 4,57,25, 7,35,87,
+ 3,57,25, 4,65,62, 4,76,12, 3, 2,63, 4, 3,18, 3, 7,22, 3, 7,23, 3, 7,24,
+ 3,10,86, 4, 8, 9, 0, 0, 0, 3,15,22, 4,11,54, 3,37, 2, 3,15,29, 4,11,52,
+ 4,11,56, 3,15,25, 3,15,26, 6,20,77, 4,16,24, 4,16,20, 3,20, 8, 4,16,19,
+ 4,39,81, 0, 0, 0, 4,21,76, 4,21,78, 4,21,83, 4,21,75, 3,25,48, 4,21,80,
+ 4,27,62, 3,31,56, 0, 0, 0, 4,33,20, 4,33,22, 3,37, 1, 4,57,28, 4,33,24,
+ 4,39,77, 4,39,78, 3,42, 9, 3,42, 8, 5,42,64, 4,39,80, 3,47,30, 4,46,29,
+ 4,46,28, 5,56,94, 5,63,28, 3,64,45, 4,75, 6, 3,15,31, 0, 0, 0, 3,20,11,
+ 3,20,12, 4,21,88, 4,21,84, 3,25,51, 5,22,22, 4,21,85, 4,27,64, 3,31,58,
+ 3,31,59, 3,31,60, 4,27,68, 0, 0, 0, 6,57,44, 3,37, 6, 4,33,29, 4,33,28,
+ 4,33,31, 4,33,30, 4,39,83, 4,39,84, 4,46,31, 4,46,33, 4,46,30, 4,46,32,
+ /* plane 0, page 73 */
+ 1, 255, /* first, last */
+ 4,52,29, 4,52,28, 4,52,26, 3,51,14, 4,52,32, 4,52,27, 7,20,52,
+ 3,51,16, 4,57,29, 4,57,34, 7,28,80, 4,57,33, 5,69,37, 4,65,65, 4,65,68,
+ 4,65,67, 4,65,66, 4,65,69, 4,71,58, 4,71,59, 4,73,52, 4,73,51, 4,76,14,
+ 4,76,13, 4,78,29, 4,21,90, 6,28,67, 3,25,58, 3,31,63, 3,31,68, 3,31,65,
+ 3,31,71, 3,37,12, 5,35,77, 0, 0, 0, 3,42,14, 4,39,89, 3,42,22, 4,39,86,
+ 4,39,91, 0, 0, 0, 4,39,88, 3,47,47, 4,46,35, 3,47,39, 3,47,38, 7,10,24,
+ 3,47,42, 7,10,30, 0, 0, 0, 3,51,19, 3,51,20, 4,52,40, 4,52,38, 7,28,91,
+ 3,54,73, 7,28,87, 4,57,37, 4,57,36,15,61,44, 3,57,31, 3,57,33, 4,62,15,
+ 4,62,12, 7,36,25, 4,62, 7, 5,69,47, 4,62,11, 3,57,40, 3,57,39, 0, 0, 0,
+ 3,59,38, 4,65,70, 3,59,43, 3,59,32, 3,59,50, 4,65,73, 5,74,19, 4,65,72,
+ 3,59,49, 3,59,44, 3,59,41,15,68,20, 3,61,27, 4,65,76, 3,61,32, 4,68,70,
+ 4,68,76, 5,78,21, 3,61,40, 4,68,77, 0, 0, 0, 4,71,63, 3,62,75, 4,68,73,
+ 4,71,65, 3,62,76, 4,71,67, 7,53,72, 3,62,73, 3,62,78, 3,62,79, 3,63,79,
+ 3,64,49, 5,81,53, 7,57,71, 3,63,77, 7,57,72, 3,63,80, 5,84,53, 4,75,10,
+ 5,86,63, 4,75, 7, 3,64,46, 3,64,48, 3,65, 3, 3,65, 1, 4,76,16, 3,65, 4,
+ 3,65,78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,28,69,
+ 4,27,71,15,31,86, 4,33,41, 4,62,18, 3,25,59, 4,21,92, 3,31,74, 4,27,75,
+ 3,31,78, 3,31,75, 3,37,27, 4,33,48, 4,33,46, 4,40, 3, 3,42,27, 3,42,31,
+ 3,42,26, 5,42,78, 3,42,28, 0, 0, 0, 7,10,38, 4,46,40, 3,47,52, 3,47,55,
+ 4,52,47, 4,52,43, 3,51,31, 4,52,44, 3,51,33, 3,51,35, 3,51,38, 3,51,37,
+ 7,20,83, 0, 0, 0, 4,57,46, 4,57,47, 4,57,52, 3,54,78, 3,54,76, 4,57,45,
+ 0, 0, 0, 4,57,50, 4,71,70, 4,68,81, 5,81,59, 4,73,53, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 1,93, 3, 2,64, 3, 4,30, 5, 4,91, 6, 9,21, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4, 8,17, 4, 8,18, 3,10,90, 5,11,68, 4,11,58, 3,15,33, 4,11,57,
+ 0, 0, 0, 4,16,32, 4,16,29, 3,20,21, 4,16,30, 3,20,23, 4,16,28, 0, 0, 0,
+ 3,25,67, 3,25,61, 4,21,93, 3,25,64, 3,25,66, 3,25,68, 3,25,63, 3,31,79,
+ 4,27,77, 3,31,84, 3,37,31, 3,37,30, 4,33,53, 4,33,52, 3,37,29, 3,37,33,
+ 3,42,33, 3,42,32, 3,42,35, 3,42,34, 3,47,57, 3,47,56, 7,10,52, 3,51,39,
+ 4,52,51, 0, 0, 0, 4,52,49, 0, 0, 0, 4,57,53, 0, 0, 0, 3,59,52, 4,68,83,
+ 4,71,71, 3,20,24, 4,22, 4, 3,31,90, 3,31,86, 3,31,89, 3,31,87, 4,33,54,
+ 3,37,36, 3,37,35, 3,37,37, 3,42,40, 3,47,61, 3,47,60, 3,51,43, 3,51,42,
+ /* plane 0, page 74 */
+ 0, 255, /* first, last */
+ 3,50,24, 4,57,56, 3,54,82, 3,57,44, 3,59,53, 3,61,42, 3,59,54, 3,61,43,
+ 4,73,54, 3,65,49, 3,66,32, 3,25,70, 3,31,93, 6,48,17, 3,37,40, 4,40,13,
+ 4,40,17, 4,40,14, 3,42,42, 4,40,20, 3,42,43, 4,40,19, 6,67,91, 3,47,62,
+ 3,47,65, 3,47,63, 0, 0, 0, 4,52,57, 3,51,47, 3,51,46, 4,57,64, 3,54,83,
+ 3,54,87, 4,52,56, 3,54,86, 4,57,61, 4,57,63, 4,62,21, 3,57,45, 3,57,46,
+ 4,62,22, 7,36,56, 7,36,64, 4,65,84, 4,65,83, 3,59,55, 3,59,56, 3,59,57,
+ 4,68,85, 3,61,45, 4,73,56, 4,73,58, 4,73,59, 3,64,56, 3,65,51, 3,65, 7,
+ 3,65,50, 3,66, 4, 3,66,36, 3,66,38, 4,73,60, 4,22, 8, 4,22,10, 4,27,84,
+ 4,46,44, 4,68,91, 4,33,58, 3,37,42, 0, 0, 0, 3,42,45, 4,40,24, 4,40,23,
+ 4,52,61, 4,52,60, 4,57,66, 4,68,92, 4,71,78, 5,81,67, 0, 0, 0, 4,76,19,
+ 4,27,89, 3,32, 3, 4,27,86, 3,37,45, 4,33,61, 4,33,63, 3,37,44,15,38,18,
+ 6,58, 8, 4,40,26, 4,40,32, 4,40,27, 3,42,47, 3,42,48, 4,40,29, 4,46,47,
+ 4,52,67, 4,52,65, 4,52,64, 4,52,68, 4,52,66, 4,57,67, 4,52,72, 3,51,50,
+ 3,54,92, 4,57,72, 4,57,68, 7,29,54, 3,54,89, 3,54,93, 3,54,94, 4,62,30,
+ 5,69,94, 4,62,34, 4,62,28, 5,69,83, 5,69,91, 4,62,27, 4,62,33, 3,59,60,
+ 3,59,59, 4,65,87, 4,65,91, 3,59,58, 4,69, 3, 4,68,94, 5,78,41, 7,54, 7,
+ 7,54, 5, 4,71,82, 4,71,80, 5,81,73, 7,54, 6, 3,63,84, 5,84,66, 4,75,12,
+ 3,64,58, 4,76,20, 4,77,13, 3,65,52, 4,77,69, 3,65,80, 4,78, 2, 4,33,65,
+ 4,40,35, 4,40,33, 4,40,34, 4,40,36, 3,51,52, 4,57,75, 7,36,87, 4,62,37,
+ 3,57,50, 4,65,93, 4,65,94, 4,71,83, 4,73,64, 3,64,59, 3,37,46, 0, 0, 0,
+ 3,55, 1, 3,59,67, 3,59,66, 3,61,50, 4,71,85, 4,75,13, 3,32, 5, 3,32, 6,
+ 3,32, 7, 3,37,49, 0, 0, 0, 4,52,74, 4,52,73, 3,57,51, 4,66, 2, 4,66, 3,
+ 3,63,85, 4,27,91,15,32,13, 4,33,69, 4,33,68, 5,36,20, 5,43,30, 4,40,45,
+ 3,42,49, 4,40,46, 3,42,51, 4,40,44, 4,40,43, 5,43,31, 4,40,39, 3,47,72,
+ 4,46,57, 4,46,60, 5,50,64, 4,52,77, 4,52,79, 3,51,54, 4,46,61, 3,51,64,
+ 3,51,55, 3,51,62, 7,21,49, 3,55, 5, 4,57,83, 7,29,73, 3,55, 2, 4,57,87,
+ 3,55, 3, 3,55, 4, 3,55, 7, 3,55, 9, 4,62,46, 3,57,52, 4,62,41, 4,62,39,
+ 4,62,43, 3,57,55, 3,57,53, 4,62,45, 4,62,44, 3,57,58, 4,66, 7, 4,66, 9,
+ 4,66,13, 4,66, 6, 4,66,12, 3,59,68, 4,66, 5, 4,66,15, 4,66, 8, 4,66,11,
+ 4,69,15, 4,69,17, 4,69,16, 3,61,52, 4,71,87, 4,71,89, 4,71,86, 4,71,92,
+ 4,71,91, 7,54,18, 4,73,67, 3,63,86, 4,73,66, 4,76,25, 5,88,40, 3,65,53,
+ 4,22,11, 4,27,94, 3,37,51, 4,33,77, 4,33,82, 4,33,78, 4,40,49, 4,40,54,
+ /* plane 0, page 75 */
+ 0, 255, /* first, last */
+ 4,40,57, 4,40,48, 4,40,52, 3,42,55, 4,46,64, 4,46,65, 4,52,86, 4,52,87,
+ 4,52,83, 4,52,84, 4,52,85, 4,57,93, 4,58, 2, 4,58, 1, 4,57,92, 4,57,90,
+ 4,57,94, 4,62,49, 7,36,94, 4,62,48, 4,62,50, 3,57,61, 3,57,62, 3,57,63,
+ 4,66,18, 3,59,71, 3,59,70, 4,69,22, 3,61,53, 4,71,94, 4,75,16, 4,76,26,
+ 3,55,11, 3,57,64, 3,20,26, 4,22,12, 3,32, 9, 3,32,10, 4,28, 4, 3,32, 8,
+ 4,28, 5, 3,37,61, 3,32,12, 4,33,87, 4,33,84, 3,42,60, 3,37,62, 4,33,85,
+ 3,37,54, 3,37,53, 3,37,58, 4,33,89, 4,33,90, 3,42,56, 3,42,57, 4,40,59,
+ 7,11,24, 3,42,58, 4,40,60, 6,68,32, 3,47,74, 4,46,69, 4,46,68, 4,46,71,
+ 4,46,70, 4,52,88, 4,46,73, 4,52,92, 4,52,93, 4,52,90, 4,58, 7, 4,53, 2,
+ 4,58, 8, 4,58,10, 5,64,17, 3,55,13, 3,57,68, 5,64,12, 3,55,12, 0, 0, 0,
+ 4,62,56, 4,62,55, 4,62,59, 4,62,57, 4,62,58, 4,69,25, 4,66,22, 3,59,72,
+ 4,69,28, 4,69,27, 3,61,55, 3,61,57, 0, 0, 0, 4,72, 4, 4,72, 3, 3,62,93,
+ 4,72, 2, 4,73,71, 4,73,69, 3,63,87, 4,73,72, 4,75,17, 3,65,54, 4,77,16,
+ 4,77,71, 4,78, 5, 0, 0, 0, 3,47,76, 3,51,71, 4,62,63, 4,66,28, 4,40,61,
+ 3,55,15, 4,53, 6, 3,55,14, 3,65,81, 3,32,13, 5,36,42, 3,37,64, 4,40,62,
+ 3,42,69, 4,40,63, 3,42,63, 3,42,71, 3,42,72, 3,42,75, 3,42,73, 4,46,79,
+ 3,47,81, 3,47,80, 4,46,78, 3,47,79, 4,46,77, 4,46,80, 3,51,79, 3,51,78,
+ 3,51,77, 5,58,12, 3,51,73, 4,53,13, 5,58,14, 7,22, 8, 4,58,14, 3,55,18,
+ 3,55,21, 4,58,13, 3,55,17, 4,62,71, 5,74,78, 4,62,66, 3,57,72, 4,62,72,
+ 3,57,73, 4,62,67, 4,62,69, 3,57,76, 4,66,33, 4,66,31, 3,59,74, 4,66,38,
+ 4,66,32, 4,66,36, 4,66,37, 4,69,33, 4,69,32, 3,61,61, 3,61,59, 4,69,39,
+ 5,78,70, 5,78,77, 3,61,60, 4,72, 9, 4,72,10, 4,72,11, 4,72,13, 3,63, 3,
+ 5,82,13, 4,72, 8, 7,58,30, 5,84,86, 4,73,75, 4,73,73, 3,63,90, 4,75,19,
+ 4,75,20, 4,75,18, 3,65,11, 7,64,14, 7,64,13, 3,65,55, 4,77,72, 3,66, 7,
+ 4,78,31, 3,66,23, 4,78,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,25,73, 3,32,14,
+ 4,40,66, 3,42,77, 3,47,85, 4,46,85, 4,46,83, 4,46,86, 3,47,88, 3,51,82,
+ 3,51,83, 4,53,16, 4,53,18, 4,53,15, 4,53,14, 3,55,25, 4,58,17, 4,58,21,
+ 4,58,16, 3,55,24, 4,58,19, 5,70,49, 4,62,78, 3,59,80, 4,66,40, 4,66,39,
+ 4,69,41, 3,61,63, 4,72,16, 4,73,78, 4,75,21, 4,76,30, 4,77,19, 3,32,16,
+ 4,34, 2, 0, 0, 0, 4,66,42, 5,84,90, 7,68,85, 3,32,17, 5,29,50, 6,68,62,
+ 4,40,74, 4,40,73, 4,40,71, 3,42,84, 5,43,57, 4,46,91, 3,47,90, 4,53,21,
+ 4,53,22, 4,58,24, 3,55,29, 0, 0, 0, 4,58,27, 4,62,80, 4,62,83, 3,57,78,
+ /* plane 0, page 76 */
+ 0, 255, /* first, last */
+ 4,62,84, 4,62,86, 4,62,85, 4,62,87, 4,66,46, 3,59,82, 4,66,44, 0, 0, 0,
+ 4,69,45, 4,69,47, 4,69,46, 7,49,89, 5,82,31, 3,63, 6, 4,73,82, 4,76,35,
+ 4,76,33, 3,65,13, 5,88,50, 4,77,21, 7,65,74, 4,77,73, 4,78,41, 7,49,93,
+ 5,82,33, 3,42,87, 3,42,86, 3,45,30, 3,51,86, 7,58,43, 3,65,56, 3,42,89,
+ 4,47, 4, 4,47, 5, 4,53,31, 3,51,87, 4,62,94, 3,57,80, 4,62,93, 4,62,92,
+ 3,59,83, 5,70,72, 3,61,69, 4,73,87, 4,73,86, 7,58,47, 0, 0, 0, 4,76,40,
+ 4,76,41, 4,78,56, 5,29,52, 0, 0, 0, 4,40,77, 5,43,68, 0, 0, 0, 4,47, 8,
+ 4,47,20, 3,48, 1, 7,11,74, 4,47,25, 4,47,18, 4,47,11, 4,47, 9, 3,52, 7,
+ 4,53,36, 4,53,34, 4,53,40, 3,51,94, 3,52, 8, 4,53,33, 3,52, 6, 3,52, 4,
+ 3,52, 2, 3,51,91, 4,58,32, 3,55,33, 4,63, 1, 7,30,41, 4,58,34, 3,57,82,
+ 4,63, 3, 5,70,78, 4,63, 7, 4,63, 5, 3,57,88, 4,63, 4, 3,57,87, 4,63, 9,
+ 4,63,11, 4,66,61, 5,75,21, 4,66,71, 4,66,55, 4,66,65, 4,66,57, 4,66,52,
+ 3,59,86, 5,75,17, 4,66,66, 5,75,11, 4,66,64, 4,66,68, 3,59,88, 3,59,91,
+ 3,59,92,15,68,82, 0, 0, 0, 3,61,87, 4,69,53, 7,50,17, 4,69,59, 3,61,76,
+ 7,50,19, 4,69,51, 3,61,75, 3,61,77, 0, 0, 0, 4,72,29, 3,63,13, 3,63,16,
+ 4,72,28, 3,63,14, 3,63,11, 4,72,26, 3,63, 9, 3,63,15, 4,73,93, 3,63,93,
+ 4,74, 1, 4,73,92, 3,63,92, 4,73,94, 3,64, 4, 4,73,91, 3,64, 1, 0, 0, 0,
+ 15,74,31, 4,75,28, 4,75,29, 4,75,32, 4,75,27, 7,62, 3, 3,64,71, 3,64,68,
+ 5,88,59, 5,88,54, 3,65,16, 4,76,45, 4,76,46, 5,87, 4, 3,65,58, 4,77,25,
+ 0, 0, 0, 3,65,17, 4,78,12, 4,78,13, 4,78,59, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,37,69, 3,42,90, 3,42,91,
+ 3,42,92, 3,42,94, 5,43,75, 3,42,93, 5,51,24, 4,47,31, 3,48, 3, 4,47,36,
+ 4,47,27, 7,11,77, 4,47,32, 3,48, 8, 3,48, 9, 3,48, 6, 0, 0, 0, 3,44,67,
+ 4,47,33, 4,53,46, 3,52,15, 4,53,45, 3,52,16, 4,53,47, 3,52,11, 4,53,52,
+ 7,22,42, 4,53,42, 3,52,14, 4,53,55, 3,55,43, 4,53,43, 3,52,17, 4,53,53,
+ 3,52,20, 4,53,48, 7,22,49, 3,54,19, 3,55,44, 4,58,49, 3,55,39, 3,55,41,
+ 3,55,38, 4,58,50, 3,55,46, 4,58,48, 4,63,15, 4,63,21, 4,63,12, 3,58, 1,
+ 3,57,92, 4,63,18, 4,63,17, 5,71, 6, 4,63,24, 4,66,74, 3,60, 1, 4,66,76,
+ 4,69,65, 3,60, 8, 4,66,79, 5,75,28, 4,63,22,15,68,85, 3,61,88, 4,69,76,
+ 3,61,93, 3,61,91, 4,69,74, 4,69,68, 3,61,92, 7,50,34, 4,69,66, 4,69,75,
+ 3,61,94, 3,63,20, 4,72,32, 4,72,34, 4,72,33, 5,82,67, 3,63,19, 4,74, 7,
+ 4,74,12, 0, 0, 0, 3,64, 8, 4,74, 6, 3,64, 6, 3,64, 7, 4,75,37, 3,64,75,
+ /* plane 0, page 77 */
+ 0, 181, /* first, last */
+ 5,87,12, 4,75,36, 5,87,20, 4,75,39, 3,64,74, 3,64,73, 4,75,40, 4,76,48,
+ 4,76,50, 4,76,49, 3,65,22, 4,76,52, 4,77,29, 3,65,60, 7,67,23, 3,66,10,
+ 3,66,30, 4,78,57, 3,66,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,47,39, 4,63,25, 7,55, 9, 4,75,45, 5,89,83, 5,43,77,
+ 4,47,41, 4,47,42, 3,48,13, 3,52,24, 4,53,56, 7,22,60, 3,58, 3, 4,66,82,
+ 0, 0, 0, 3,63,25, 3,65,23, 3,65,24, 4,40,83, 4,40,84, 3,43, 1, 4,47,45,
+ 4,47,43, 4,53,57, 4,53,60, 4,53,58, 4,53,61, 3,55,47, 4,63,28, 4,63,27,
+ 3,58, 7, 4,66,89, 4,66,86, 4,66,93, 4,66,87, 4,66,92, 4,72,41, 4,72,40,
+ 4,72,42, 5,85,45, 5,85,40, 4,75,46, 3,65,25, 7,58,93, 4,77,33, 7,12,17,
+ 4,69,81, 4,69,82, 7,22,69, 4,63,29, 4,67, 1, 4,69,86, 4,72,43, 4,75,50,
+ 4,76,58, 7,12,19, 4,53,62, 7,22,71, 5,79,50, 4,69,89, 5,79,52, 4,72,44,
+ 4,72,46, 4,72,45, 4,74,17, 4,75,53, 4,77,34, 4,34,12, 3,43, 3, 4,47,50,
+ 4,47,51, 4,53,63, 4,58,63, 5,65, 3, 5,71,32, 5,71,29, 4,63,31, 5,71,33,
+ 4,67, 3, 3,60,11, 4,69,92, 4,70, 1, 4,69,93, 5,79,56, 4,72,50, 3,63,27,
+ 4,75,54, 4,76,59, 4,77,36, 3,65,62, 4,77,35, 4,77,79, 4,63,32, 3,60,12,
+ 4,74,23, 3,65,26, 4,53,65, 4,76,65, 4,76,66, 4,63,35, 4,63,34, 4,63,36,
+ 4,67, 6, 4,72,57, 4,53,66, 4,58,67, 4,63,37, 4,67, 7, 4,72,58, 3,64,10,
+ 4,75,56, 4,75,59, 3,58,12, 4,63,38, 3,62, 3, 7,50,71, 5,79,65, 4,72,60,
+ 4,78,17, 5,91,90, 4,58,70, 5,65,13, 4,63,40, 4,67, 9, 4,67,11, 4,70, 7,
+ 4,70, 5, 4,70, 6, 3,63,29, 4,72,65, 4,74,29, 4,74,28, 3,64,78, 5,87,45,
+ 4,76,73, 4,76,70, 4,76,74, 4,77,44, 4,77,43, 4,77,80, 3,65,86, 3,66,11,
+ 3,66,18, 4,78,43, 4,78,44, 4,78,58, 5,85,65, 0, 0, 0, 0, 0, 0, 5,75,73,
+ 5,76,36, 4,72,66, 0, 0, 0, 4,72,67, 4,77,49, 3,66,12,
+ /* plane 0, page 78 */
+ 0, 255, /* first, last */
+ 1,36, 1, 1,36, 3, 4, 1, 6, 1,36, 4, 3, 1, 6, 3, 1, 5, 0, 0, 0, 2, 1, 6,
+ 1,36,23, 1,36,21, 1,36,24, 1,36,22, 2, 1, 7, 1,36,66, 2, 1,15, 2, 1,13,
+ 1,36,65, 1,36,64, 4, 1,25, 0, 0, 0, 1,37,66, 1,37,65, 1,37,64, 4, 1,53,
+ 1,37,67, 1,37,63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,39, 2, 1,39, 3,
+ 3, 2,66, 3, 2,65, 3, 2,67, 4, 3,21, 3, 4,31, 0, 0, 0, 1,43,68, 0, 0, 0,
+ 3, 1, 1, 4, 1, 7, 3, 1,12, 1,36,25, 0, 0, 0, 1,36,67, 2, 1,16, 4, 1,26,
+ 1,36,68, 2, 1,35, 1,40,75, 2, 5,17, 0, 0, 0, 4,11,62, 3, 1, 2, 0, 0, 0,
+ 1,36,26, 1,36,69, 0, 0, 0, 1,37,68, 2, 1,36, 3, 7,32, 0, 0, 0, 3, 1, 3,
+ 4, 1, 2, 4, 1, 3, 2, 1, 1, 1,36, 5, 0, 0, 0, 1,36,28, 3, 1,16, 2, 1, 8,
+ 1,36,29, 3, 1,14, 0, 0, 0, 1,36,70, 0, 0, 0, 1,37,69, 1,37,71, 1,37,70,
+ 0, 0, 0, 4, 2, 7, 1,39, 4, 1,39, 5, 3, 3,37, 0, 0, 0, 1,43,69, 3,11, 2,
+ 1,51,93, 1,36, 2, 4, 1, 4, 0, 0, 0, 2, 1, 2, 1,36, 6, 1,36,31, 1,36,30,
+ 0, 0, 0, 0, 0, 0, 3, 1,38, 3, 1,37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 2,68, 1,39, 6, 4, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 4,32, 0, 0, 0, 1,43,70, 4, 5,17, 4, 5,16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,11, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,56,81, 2,19,46,
+ 3,25,76, 3,25,78, 1,67,10, 2,33,54, 2,33,55, 3, 1, 4, 1,36, 7, 3, 1,13,
+ 1,36,72, 3, 2,69, 0, 0, 0, 1,43,71, 1,36, 8, 2, 1, 9, 1,36,32, 3, 1,17,
+ 0, 0, 0, 1,36,73, 1,36,75, 2, 1,17, 1,36,76, 1,36,74, 4, 1,27, 3, 1,76,
+ 3, 2,70, 1,39, 7, 0, 0, 0, 1,43,72, 3, 4,34, 3, 7,34, 1,43,73, 1,47,71,
+ 1, 7, 8, 1,36,33, 1,36,77, 3, 1,39, 1,39, 8, 1,39,10, 1,39, 9, 0, 0, 0,
+ 1,40,76, 0, 0, 0, 0, 0, 0, 1,43,74, 1,43,75, 1,47,72, 1,47,73, 3,11, 6,
+ 3,11, 5, 3,11, 7, 3,11, 4, 1,51,94, 4,22,14, 0, 0, 0, 2,33,56, 3,32,19,
+ 0, 0, 0, 2,77,36, 1,36, 9, 0, 0, 0, 3, 1,18, 0, 0, 0, 3, 1,19, 0, 0, 0,
+ 1,36,79, 1,36,78, 2, 1,18, 1,36,80, 1,36,86, 3, 1,41, 1,36,81, 1,36,82,
+ 2, 1,20, 2, 1,19, 1,36,84, 1,36,85, 3, 1,44, 1,36,83, 3, 1,43, 3, 1,42,
+ 4, 1,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,37,74, 1,37,75, 1,37,76, 1,37,77,
+ 1,37,73, 1,37,80, 2, 1,42, 4, 1,59, 2, 1,38, 2, 1,41, 1,37,81, 1,38, 3,
+ 3, 1,77, 2, 1,40, 4, 1,58, 1,37,78, 1,37,79, 1,37,72, 3, 1,82, 3, 1,80,
+ 2, 1,37, 2, 1,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2,79, 3, 2,72,
+ 1,39,23, 2, 1,79, 1,39,20, 1,39,24, 2, 1,89, 2, 1,77, 1,39,21, 2, 1,81,
+ 3, 2,75, 3, 2,71, 3, 2,86, 1,39,22, 3, 2,78, 1,39,25, 4, 2,13, 1,39,11,
+ /* plane 0, page 79 */
+ 0, 255, /* first, last */
+ 2, 1,80, 1,39,26, 2, 1,84, 3, 2,77, 2, 1,88, 2, 1,85, 3, 2,76, 3, 2,84,
+ 2, 1,82, 1,39,12, 1,39,14, 1,39,27, 4, 2,10, 1,39,16, 2, 1,74, 1,39,19,
+ 1,39,17, 1,39,18, 2, 1,90, 2, 1,87, 2, 1,78, 1,39,15, 3, 2,80, 3, 2,87,
+ 2, 1,75, 1,39,13, 3, 2,85, 4, 2,14, 3, 2,83, 2, 1,83, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2, 1,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 2,82,15, 1,81, 0, 0, 0, 0, 0, 0, 2, 1,76, 2, 3, 8, 4, 3,25, 1,41, 4,
+ 1,40,85, 3, 4,48, 3, 4,40, 2, 3, 9, 1,40,82, 3, 4,47, 1,41, 6, 3, 4,38,
+ 1,40,90, 3, 4,37, 1,40,89, 2, 2,91, 1,40,93, 1,40,88, 2, 3, 2, 2, 3,10,
+ 3, 4,46, 2, 3, 6, 3, 4,41, 1,40,91, 3, 4,43, 3, 4,35, 1,40,94, 1,40,79,
+ 1,41, 9, 2, 2,93, 3, 4,36, 3, 4,44, 2, 5,29, 1,40,77, 1,41, 5, 1,40,78,
+ 1,40,86, 1,40,87, 2, 3, 4, 2, 2,94, 1,40,92, 1,40,84, 2, 2,90, 1,40,80,
+ 2, 3, 7, 1,41, 7, 1,41,10, 1,40,83, 1,41, 2, 1,41, 8, 1,40,81, 2, 3, 5,
+ 1,41, 3, 2, 3,11, 2, 2,92, 1,41, 1, 2, 3, 1, 0, 0, 0, 3,68,40, 2, 3, 3,
+ 3,68,41, 1,43,89, 2, 5,31, 2, 5,43, 1,43,81, 3, 7,39, 2, 5,44, 1,43,76,
+ 1,43,86, 4, 5,30, 3, 7,47, 1,43,79, 2, 5,25, 1,43,87, 2, 5,24, 2, 5,28,
+ 2, 5,35, 2, 5,33, 1,44, 1, 1,43,90, 2, 5,19, 2, 5,21, 1,43,92, 1,43,80,
+ 2, 5,22, 2, 5,34, 2, 5,41, 1,43,85, 2, 5,27, 2, 5,20, 1,43,84, 2, 5,23,
+ 1,43,88, 2, 5,26, 3, 7,36, 1,43,83, 3, 7,49, 1,43,78, 3, 7,40, 1,43,93,
+ 2, 5,36, 1,43,94, 2, 5,40, 3, 7,35, 2, 5,38, 2, 5,42, 1,43,91, 2, 5,30,
+ 2, 5,18, 4, 5,22, 2, 5,32, 1,43,82, 2, 5,37, 1,43,77, 2, 5,39, 3, 7,44,
+ 3, 7,41, 3, 7,43, 3, 7,42, 3, 7,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 5,36, 0, 0, 0, 0, 0, 0, 1,47,88, 1,47,76,
+ 3,11,13, 3,11,14, 2, 9, 2, 2, 9,10, 3,11,22, 1,47,75, 1,47,83, 1,48, 1,
+ 3,11,12, 2, 9,16, 2, 9,14, 2, 9, 9, 4, 8,24, 4, 8,30, 3,11,11, 1,47,77,
+ 2, 9,15, 2, 9, 5, 1,47,91, 1,47,82, 1,47,90, 2, 8,94, 3,11,18, 2, 9,12,
+ 3,11,15, 2, 9, 3, 1,47,86, 2, 9, 4, 3,11,19, 2, 8,93, 1,47,93, 1,47,80,
+ 1,47,89, 1,47,79, 3,11, 8, 2, 9, 1, 2, 9, 6, 3,11, 9, 2, 9,13, 1,47,87,
+ 1,47,84, 2, 9, 8, 1,47,92, 2, 9,11, 2, 9, 7, 1,47,81, 1,47,94, 1,47,85,
+ 1,47,78, 1,47,74, 4, 8,31, 3,11,21,15, 9,13, 3,11,20, 0, 0, 0, 3,68,42,
+ 0, 0, 0, 4, 8,29, 0, 0, 0, 0, 0, 0, 2, 9,17, 0, 0, 0, 1,52,26, 1,52, 4,
+ 3,15,40, 1,52,20, 3,15,45, 1,52,25, 2,13,81, 2,13,80, 2,13,85, 2,13,86,
+ 1,52, 7, 3,15,36, 1,52,16, 3,15,56, 3,15,44, 3,15,54, 1,52,29, 3,15,38,
+ /* plane 0, page 80 */
+ 0, 255, /* first, last */
+ 1,52,17, 4,11,66, 3,15,43, 3,15,41, 3,15,39, 2,13,74, 1,52,10, 2,13,75,
+ 3,15,47, 1,52,31, 4,11,68, 1,52,22, 1,52, 1, 1,52, 2, 2,13,94, 1,57, 4,
+ 3,15,51, 1,52,15, 1,52,14, 2,13,76, 1,52,18, 2,19,62, 1,52, 9, 2,13,87,
+ 1,52,24, 1,52,23, 1,52,13, 2,13,79, 2,13,88, 3,15,37, 2,13,73, 1,52,12,
+ 2,13,89, 1,52,21, 2,13,77, 1,52, 3, 3,15,46, 1,52, 6, 1,52, 5, 2,13,90,
+ 1,52,19, 1,52, 8, 1,52,28, 1,52,30, 2,13,84, 1,52,27, 3,15,49, 2,13,92,
+ 2,13,78, 2,13,93, 3,15,35, 2,13,82, 4,11,65, 2,13,91, 3,15,48, 2,13,83,
+ 3,15,52, 3,15,53, 0, 0, 0, 0, 0, 0, 1,52,11, 0, 0, 0, 0, 0, 0, 3,68,43,
+ 2,19,70, 2,19,58, 3,20,28, 1,56,86, 3,20,31, 2,19,63, 2,19,69, 1,56,85,
+ 2,19,56, 1,56,89, 2,19,60, 2,19,53, 1,56,87, 2,19,57, 1,56,92, 1,57, 3,
+ 3,20,36, 2,19,74, 3,20,33, 2,19,52, 3,20,34, 1,56,93, 3,15,55, 2,19,73,
+ 3,20,39, 3,20,29, 1,56,88, 2,19,59, 1,56,84, 2,19,54, 2,19,50, 2,19,64,
+ 2,19,51, 2,19,49, 2,19,61, 2,19,67, 2,19,68, 1,56,90, 3,20,32, 4,16,39,
+ 2,26,31, 2,19,65, 2,19,48, 2,19,66, 3,20,43, 1,57, 6, 2,19,71, 1,57, 5,
+ 2,19,47, 3,20,35, 2,19,55, 2,19,72, 1,57, 1, 1,56,94, 1,56,91, 1,57, 2,
+ 3,20,44, 3,20,42, 1,56,82, 3,20,37, 3,20,38, 1,56,83, 0, 0, 0, 0, 0, 0,
+ 1,62,14, 3,25,85, 2,26,34, 2,26,27, 4,22,20, 1,62,11, 4,22,19, 2,26,35,
+ 3,25,81, 3,25,82, 4,22,22, 2,26,25, 2,26,28, 1,62,10, 2,26,29, 3,25,79,
+ 4,22,17, 1,62,13, 2,26,33, 4,22,28, 2,26,23, 2,26,22, 1,62,15, 3,25,80,
+ 1,62,16, 1,62,12, 1,62,17, 2,26,21, 2,26,32, 2,26,30, 2,26,24, 4,22,25,
+ 4,22,16, 4,22,26, 1,62, 9, 2,26,26, 0, 0, 0, 0, 0, 0, 3,68,45, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,32,25, 3,32,28, 1,67,17, 1,67,11, 2,33,60, 1,67,20,
+ 2,33,66, 2,33,69, 1,67,13, 1,67,14, 2,33,63, 1,67,12, 2,33,72, 1,67,18,
+ 2,33,73, 3,32,26, 2,33,68, 1,67,19, 3,32,23, 2,33,57, 1,67,16, 2,33,58,
+ 4,28, 9, 2,33,67, 2,33,65, 3,32,29, 2,33,61, 1,67,15, 2,33,59, 1,67,21,
+ 2,33,64, 2,33,71, 2,33,62, 2,33,70, 3,32,22, 3,32,30, 1,71,92, 1,71,89,
+ 3,37,75, 1,71,90, 4,34,13, 2,41, 1, 2,40,87, 1,71,88, 1,71,85, 2,40,88,
+ 3,37,78, 3,37,76, 1,71,87, 2,40,91, 3,37,77, 2,40,93, 3,37,86, 4,34,21,
+ 2,41, 6, 3,37,80, 3,37,85, 2,41, 5, 2,40,94, 1,71,84, 2,40,86, 1,71,82,
+ 2,40,89, 1,71,93, 2,40,92, 3,37,81, 2,41, 2, 1,71,86, 1,71,83, 2,41, 4,
+ 2,41, 3, 1,71,91, 0, 0, 0, 2,40,90, 3,37,84, 1,76, 3, 2,47,52, 3,43, 9,
+ 2,47,49, 1,76, 4, 4,40,89, 1,76, 2, 3,43,11, 2,47,56, 2,47,53, 2,47,46,
+ /* plane 0, page 81 */
+ 0, 254, /* first, last */
+ 1,76, 1, 3,43,13, 1,76, 5, 2,47,47, 1,75,94, 1,76, 8, 2,47,50, 2,47,51,
+ 1,76, 6, 1,76, 7, 2,47,57, 2,47,54, 2,47,55, 3,43,12, 3,43, 7, 3,68,46,
+ 1,80,19, 2,54,35, 1,80,16, 2,54,32, 1,80,18, 1,80,20, 3,48,17, 2,54,33,
+ 1,80,17, 4,47,58, 2,54,34, 3,48,21, 2,54,31, 3,48,16, 3,48,20, 1,83,33,
+ 2,60,41, 1,83,34, 2,60,39, 4,53,69, 2,60,40, 2,60,38, 2,60,37, 3,52,33,
+ 3,52,32, 2,60,42, 1,83,32, 3,48,19, 4,53,73, 2,65,36, 2,65,37, 3,55,50,
+ 2,47,48, 2,65,35, 1,83,35, 1,88,11, 2,69,23, 2,69,24, 3,60,18, 1,90,66,
+ 1,90,67, 2,75,47, 2,75,46, 1,91,56, 1,91,55, 2,78,93, 3,64,79, 1,36,10,
+ 1,36,34, 1,36,88, 4, 1,29, 1,36,87, 1,37,83, 1,37,82, 1,39,30, 1,39,29,
+ 1,39,31, 1,39,28, 3, 2,88, 1,41,12, 1,41,11, 1,41,13, 3, 4,52, 4, 3,27,
+ 3, 4,51, 3, 4,49, 1,44, 3, 4, 5,31, 1,44, 2, 1,44, 4, 3, 7,50, 1,48, 2,
+ 4, 8,32, 1, 2,89, 2,14, 1, 1, 2,90, 1,57, 7, 1, 2,92, 1, 2,91, 2,26,36,
+ 3,25,86, 1, 2,93, 1,71,94, 1, 2,94, 3,62, 5, 1,36,11, 3, 1,20, 1,36,89,
+ 1,39,32, 1,44, 5, 3,11,23, 1,36,12, 1,36,92, 1,36,90, 1,36,91, 0, 0, 0,
+ 0, 0, 0, 1,39,33, 3, 2,90, 4, 2,20, 0, 0, 0, 1,41,14, 1,44, 7, 1,44, 6,
+ 1,44, 8, 3,14,91, 0, 0, 0, 0, 0, 0, 1,52,32, 0, 0, 0, 3,32,31, 3,68,51,
+ 1,80,21, 0, 0, 0, 3, 1, 7, 4, 1,30, 3, 1,45, 3, 1,40, 3, 1,46, 2, 1,14,
+ 4, 1,50, 1,37,84, 1,37,85, 3, 1,88, 3, 1,89, 1,39,34, 4, 2,22, 2, 3,12,
+ 3, 7,53, 1,48, 4, 1,48, 3, 2,14, 3, 2,14, 2, 1,57, 8, 3, 1, 8, 1,36,93,
+ 2, 1,21, 3, 1,90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4,55, 2, 5,45, 3,11,25,
+ 1,48, 5, 3,15,59, 1,52,35, 3,15,57, 1,52,33, 1,52,34, 3,15,58, 0, 0, 0,
+ 3,20,45,15,38,60, 1,80,22, 1, 7,15, 1,37,86, 4, 1,62, 0, 0, 0, 0, 0, 0,
+ 1,39,35, 2, 1,91, 3, 2,94, 3, 2,93, 3, 2,92, 3, 4,57, 1,41,15, 1,41,16,
+ 3, 4,58, 2, 3,13, 4, 3,29, 0, 0, 0, 2, 5,46, 1,44, 9, 2, 5,47, 4, 5,32,
+ 4, 5,35, 3,11,27, 3,11,29, 3,11,30, 2,14, 5, 2,14, 6, 1,52,38, 3,15,62,
+ 2,14, 7, 3,15,63, 2,14, 4, 1,52,39, 1,52,37, 1,52,36, 2,14, 8, 3,20,47,
+ 2,19,75, 3,20,46, 3,25,93, 3,25,90, 2,26,37, 4,22,31, 3,25,94, 2,33,74,
+ 2,41, 7, 3,43,15, 3,43,14, 3,43,16, 1,76, 9, 1,80,23, 2,54,36, 3,52,34,
+ 1,36,13, 1,36,27, 3, 1,15, 3, 1,21, 3, 1,49, 3, 1,91, 0, 0, 0, 0, 0, 0,
+ 3, 3, 2, 0, 0, 0,15, 2,57, 0, 0, 0, 3, 4,59, 3, 7,57, 4, 5,37, 0, 0, 0,
+ 1,57, 9, 1,62,19, 6,38,69, 1,72, 1, 3,37,90, 2, 1, 3, 1,36,94, 4, 1,64,
+ 1,37,89, 1,37,87, 1,37,88, 0, 0, 0, 0, 0, 0, 1,44,10, 3, 7,58,
+ /* plane 0, page 82 */
+ 0, 255, /* first, last */
+ 1,36,14, 1,36,15, 4, 1,10, 1,36,35, 3, 1,22, 3, 1,50, 1,37, 1, 1,37, 2,
+ 1,37, 3, 2, 1,44, 1,37,90, 3, 1,93, 2, 1,43, 0, 0, 0, 1,39,39, 3, 3, 5,
+ 2, 1,93, 1,39,37, 1,39,38, 2, 1,92, 3, 3, 4, 3, 3, 6, 1,39,40, 1,39,36,
+ 3, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3,14, 1,47,47, 2, 3,15, 3, 4,63,
+ 3, 4,65, 2, 3,16, 4, 3,32, 3, 4,60, 1,41,18, 1,41,17, 3, 4,62, 3, 4,61,
+ 1,41,21, 1,41,19, 1,41,20, 3, 4,64, 0, 0, 0, 0, 0, 0, 1,44,16, 3, 7,59,
+ 1,44,15, 2, 5,52, 2, 5,49, 2, 5,50, 3, 7,62, 2, 5,48, 1,44,17, 1,44,13,
+ 1,44,12, 3, 7,63, 1,44,14, 1,44,11, 3, 7,61, 4, 5,46, 3,68,47, 0, 0, 0,
+ 0, 0, 0, 1,44,18, 0, 0, 0, 1,48, 7, 2, 9,18, 3,11,31, 2, 5,51, 1,48,12,
+ 3,11,32, 2, 9,19, 1,48, 8, 1,48,11, 1,48,10, 1,48, 9, 1,48, 6, 3,11,35,
+ 0, 0, 0, 0, 0, 0, 2,14,11, 3,15,72, 1,52,42, 2,14,14, 1,52,40, 3,15,69,
+ 4,11,78, 3,15,66, 2,14,10, 1,52,43, 1,52,41, 1,52,44, 2,14,12, 2,14,13,
+ 3,15,64, 2,14, 9, 2,14,15, 3,15,70, 3,15,65, 3,15,67,15,14,13, 3,15,68,
+ 3,20,48, 1,62,23, 1,57,10, 2,19,76, 2,19,78, 2,19,77, 2,19,79, 1,57,11,
+ 3,26, 3, 0, 0, 0, 1,62,20, 3,26, 1, 1,62,21, 1,62,22, 3,20,49, 1,67,23,
+ 2,33,76, 3,32,33, 2,33,75, 2,33,77, 2,33,78, 1,67,24, 3,32,32, 1,67,22,
+ 2,41, 8, 2,41, 9, 1,72, 3, 1,72, 2, 2,44,65, 4,41, 5, 3,43,17, 1,76,10,
+ 1,76,11, 1,76,12, 1,76,14, 2,47,58, 2,47,59, 1,76,13, 3,43,18, 0, 0, 0,
+ 3,48,22, 1,80,24, 4,47,68, 1,80,25, 3,48,23, 4,53,77, 2,69,25, 2,75,49,
+ 2,75,48, 2,78,94, 3,64,12, 1,36,16, 3, 1,23, 3, 1,52, 3, 1,51, 1,37,92,
+ 1,37,91, 0, 0, 0, 0, 0, 0, 1,39,41, 4, 2,34, 4, 2,31, 2, 1,94, 4, 2,33,
+ 3, 3, 8, 1,41,23, 1,41,24, 1,41,22, 1,41,25, 2, 3,17, 2, 3,18, 4, 3,38,
+ 4, 3,39, 4, 3,40, 0, 0, 0, 3, 4,67, 3, 4,66, 3, 7,65, 5, 5,26, 5, 5,23,
+ 5, 5,24, 3, 7,64, 5, 5,27, 1,44,20, 2, 5,53, 4, 5,48, 1,44,19, 3, 7,66,
+ 2, 9,20, 1,48,16, 2, 9,21, 1,48,15, 3,11,40, 3,11,38, 4, 8,41, 1,48,13,
+ 4, 8,43, 1,48,14, 3,11,39, 0, 0, 0, 3,15,79, 2,14,16, 3,15,76, 3,15,74,
+ 3,15,77, 3,15,78, 1,57,12, 2,19,81, 3,20,50, 1,57,15, 2,19,80, 1,59,11,
+ 1,57,14, 1,57,13, 0, 0, 0, 1,62,26, 5,22,74, 1,62,25, 1,62,24, 1,67,25,
+ 3,32,37, 3,32,36, 1,67,28, 1,67,29, 1,67,27, 4,28,28, 1,67,26, 3,32,38,
+ 5,36,71, 2,41,10, 3,38, 1, 2,41,11, 5,36,67, 3,37,94, 3,43,19, 2,47,61,
+ 1,76,15, 2,47,60, 3,45,12, 1,80,26, 2,60,43, 1,83,36, 5,51,66, 2,69,26,
+ 1,89,65, 1, 7,20, 1,36,36, 1,37, 4, 2, 1,22, 3, 1,53, 1,37, 5, 1,37, 6,
+ /* plane 0, page 83 */
+ 0, 255, /* first, last */
+ 3, 1,54,15, 1,16, 0, 0, 0, 3, 2, 3, 3, 2, 2, 1,37,93, 1,37,94, 3, 2, 4,
+ 1,39,42, 2, 3,19, 2, 5,54, 2, 5,55, 4, 5,49, 1,48,17, 2,14,17, 1,57,17,
+ 1,57,16, 2,26,39, 2,26,38, 6,48,84, 3,48,24, 1,36,17, 1,37, 7, 1,38, 1,
+ 4,16,62, 1,57,18, 2, 1, 4, 4, 1,69, 2, 1,45, 1,38, 2, 3, 2, 6, 2, 2, 2,
+ 1,39,44, 1,39,43, 2, 2, 1, 1,41,26, 3,68,48, 3, 4,69, 0, 0, 0, 3,11,41,
+ 4, 8,46, 4, 8,48, 1,52,45, 4,11,88, 4,16,63, 2,19,82, 0, 0, 0, 1,67,30,
+ 2,41,12, 1,72, 4, 3,38, 3, 3,43,20, 2,54,37, 3,52,36, 3,60,20, 2,72,74,
+ 3, 1, 9, 1,37, 8, 3, 1,55, 3, 4,70, 2, 5,56, 2, 9,22, 1,57,21, 1,57,19,
+ 1,57,20, 1,36,18, 4, 1,16, 1,36,37, 1, 4,31, 1,37,11, 3, 1,57, 1,37,10,
+ 1,37, 9, 1,38, 5, 1,38, 4, 3, 3,10, 2, 1,46, 2, 2, 3,15, 2,12, 3, 3,11,
+ 3, 3,13, 1,44,24, 1,44,21, 1,44,23, 1,44,22, 3, 7,67, 0, 0, 0, 1,48,18,
+ 3,11,42, 4,16,64, 1,62,27, 4,70,16, 1,36,19, 3, 1,58, 1,37,12, 3, 2, 7,
+ 1,38, 7, 1,38, 6, 0, 0, 0, 2, 3,20, 4, 3,45, 3,68,49, 1,44,25, 3,10,60,
+ 4,16,68, 3, 1,10, 4, 1,17, 0, 0, 0, 2, 1,23, 3, 2, 8, 1,38, 9, 1,38, 8,
+ 1,39,45, 1,39,46, 2, 3,21, 1,41,27, 3, 4,71, 1,41,28, 3, 7,69, 1,44,26,
+ 1,44,27, 1,44,28, 3, 7,70, 1,48,19, 2, 9,23, 3,11,43, 4,16,69, 1,52,46,
+ 3,32,39, 0, 0, 0, 2, 1, 5, 4, 1,36, 1,37,13, 0, 0, 0, 3, 1,59, 4, 1,71,
+ 4, 1,70, 3, 2, 9, 2, 2, 4, 3, 3,15, 0, 0, 0, 0, 0, 0, 2, 3,22, 2, 3,23,
+ 0, 0, 0, 0, 0, 0, 2, 5,57, 3, 7,71, 2, 5,58, 0, 0, 0, 2, 9,25, 2, 9,24,
+ 2, 9,27, 2, 9,26, 1,48,20, 3,68,50, 2,19,83, 1,52,48, 2,14,18, 1,52,47,
+ 3,20,52, 4,16,72, 0, 0, 0, 0, 0, 0, 2,26,40, 1,62,28, 3,26, 8, 2,26,41,
+ 3,26, 7, 3,32,42, 3,32,41, 3,32,40, 2,41,13, 1,72, 5, 3,38, 5, 4,28,32,
+ 3,38, 6, 3,43,21, 1,76,16, 3,52,37, 2,69,27,15,77,14, 3, 1,11, 3, 1,60,
+ 4, 1,37, 2, 1,24, 3, 2,10, 1,38,10, 0, 0, 0, 4, 2,40, 3, 3,17, 0, 0, 0,
+ 4, 5,57, 3, 7,73, 3, 7,74, 1,57,22, 3,20,53, 3,26, 9, 0, 0, 0, 0, 0, 0,
+ 1,36,20, 1,36,38, 1,37,15, 1,37,14, 3, 1,62, 1,37,16, 3, 1,64, 4, 1,73,
+ 3, 2,11, 0, 0, 0, 3, 3,19, 4, 3,47, 1,44,30, 3, 7,75, 1,44,29, 1,44,31,
+ 0, 0, 0, 3,11,48, 3,11,47, 1,48,21, 3,11,46, 3,11,45, 6,21,88, 1,52,49,
+ 3,32,43, 2,54,38, 1,86,27, 1,36,39, 1,38,12, 1,38,27, 1,38,22, 4, 1,76,
+ 1,38,17, 1,38,16, 1,38,23, 1,38,21, 1,38,14, 1,38,28, 1,38,15, 1,38,11,
+ 1,38,26, 1,38,25, 1,38,24, 1,38,13, 3, 2,17, 1,38,20, 3, 2,13, 3, 2,14,
+ 1,38,19, 3, 2,15,15, 1,48, 1,38,29, 1,38,18, 4, 1,74, 0, 0, 0, 3, 3,21,
+ /* plane 0, page 84 */
+ 0, 255, /* first, last */
+ 3, 3,23, 1,39,52, 4, 2,44, 1,39,58, 1,39,54, 3, 3,25, 1,39,60, 2, 2, 5,
+ 1,39,57, 1,39,47, 1,39,50, 1,39,53, 1,39,49, 1,39,56, 1,39,59, 1,39,48,
+ 1,39,51, 1,39,55, 1,39,61, 3, 3,26, 0, 0, 0, 3, 3,27, 3, 3,20, 0, 0, 0,
+ 2, 3,32, 2, 3,29, 3, 4,86, 1,41,41, 2, 3,30, 1,41,29, 1,41,31, 1,41,55,
+ 1,41,50, 3, 4,89, 3, 4,94, 3, 4,85, 2, 3,37, 2, 3,31, 1,41,33, 1,41,35,
+ 2, 3,36, 1,41,42, 2, 3,26, 1,41,54, 1,41,56, 1,41,30, 1,41,47, 3, 5, 4,
+ 2, 3,24, 1,41,53, 3, 4,87, 1,41,38, 3, 4,91, 1,41,48, 1,41,49, 2, 3,25,
+ 1,41,46, 1,41,44, 3, 4,80, 1,41,45, 1,41,51, 2, 3,33, 1,41,32, 3, 5, 1,
+ 1,41,52, 2, 3,35, 1,41,40, 1,41,37, 3, 4,83, 2, 3,28, 1,41,36, 2, 3,38,
+ 1,41,39, 3, 4,92, 1,41,43, 3, 4,88, 3, 4,84, 3, 4,77, 1,41,34, 2, 3,34,
+ 3, 4,93, 3, 5, 2, 0, 0, 0, 0, 0, 0, 2, 3,27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 5, 3, 0, 0, 0, 0, 0, 0, 4, 5,68, 4, 5,67, 3, 7,78,
+ 2, 5,75, 2, 5,74, 1,44,49, 2, 5,77, 2, 5,79, 2, 5,68, 2, 5,71, 2, 5,78,
+ 1,44,50, 3, 7,84, 3, 7,88, 2, 5,65, 2, 5,69, 3, 7,85, 4, 5,63, 2, 5,73,
+ 2, 9,42, 1,44,45, 2, 9,46, 1,44,32, 2, 5,70, 1,44,33, 1,44,46, 1,44,39,
+ 1,44,35, 3, 7,81, 2, 5,66, 1,44,38, 1,44,43, 1,44,52, 2, 5,67, 2, 5,60,
+ 1,44,37, 2, 5,61, 2, 5,63, 4, 5,64, 1,44,40, 3, 7,76, 1,44,42, 2, 5,59,
+ 2, 5,64, 3, 7,80, 3, 7,89, 1,44,51, 1,44,47, 2, 5,72, 1,44,53, 3, 7,83,
+ 1,44,44, 2, 5,62, 1,44,41, 3, 7,79, 3, 7,87, 1,44,36, 1,44,34, 0, 0, 0,
+ 2, 5,76, 0, 0, 0, 1,44,48, 0, 0, 0,15, 5,81, 0, 0, 0, 3,11,60, 3,11,61,
+ 2, 9,41, 2, 9,29, 2, 9,44, 3,11,55, 3,11,57, 2, 9,31, 1,48,28, 1,48,42,
+ 1,48,24, 1,48,41, 1,48,33, 1,48,38, 1,48,22, 2, 9,30, 2, 9,36, 1,48,37,
+ 2, 9,48, 1,48,39, 3,11,59, 1,48,29, 3,11,52, 3,11,62, 2, 9,38, 2, 9,35,
+ 1,48,27, 3,11,49, 2, 9,28, 1,48,40, 2, 9,43, 1,48,32, 2, 9,45, 1,48,43,
+ 1,48,23, 1,48,34, 1,48,31, 2, 9,33, 1,48,35, 2, 9,39, 2, 9,40, 1,48,30,
+ 1,48,36, 1,48,26, 3,11,53, 3,68,52, 3,11,67, 3,11,65, 1,48,25, 2, 9,32,
+ 3,11,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 9,37, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,11,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 9,47, 0, 0, 0,
+ 2,14,38, 1,52,62, 2,14,20, 4,12,13, 2,14,25, 1,52,55, 1,52,66, 2,14,23,
+ 1,52,50, 1,52,60, 1,52,65, 2,14,30, 4,12, 6, 1,52,61, 1,52,64, 3,15,87,
+ 3,16, 1, 2,14,33, 1,52,56, 2,14,24, 3,15,84, 3,15,88, 3,16, 2, 2,14,36,
+ 2,14,37, 3,15,89, 1,52,58, 2,14,35, 1,52,54, 1,52,69, 4,12, 9, 2,14,27,
+ /* plane 0, page 85 */
+ 0, 255, /* first, last */
+ 3,15,91, 1,52,52, 3,15,90, 2,14,40, 2,14,28, 2,14,32, 1,52,57, 1,52,68,
+ 2,14,29, 1,52,63, 2,14,34, 2,14,41, 2,20, 4, 3,15,83, 2,14,39, 1,52,70,
+ 1,52,51, 2,14,31, 2,14,22, 3,15,86, 1,52,59, 4,12, 8, 4,12,14, 2,14,21,
+ 3,15,94, 3,16, 5, 2,14,26,15, 9,52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,14,34,15,14,42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,14,19, 1,52,67,
+ 3,71, 1, 3,20,63, 2,19,90, 3,20,72, 1,57,41, 2,20,10, 1,57,39, 1,57,36,
+ 2,20, 1, 1,57,32, 2,20, 5, 1,57,43, 2,19,89, 2,19,94, 2,19,93, 1,52,53,
+ 1,57,38, 2,20, 8, 3,20,70, 2,20,11, 2,19,86, 4,16,87, 1,62,46, 3,20,71,
+ 2,20,12, 1,57,44, 4,16,82, 1,57,30, 1,57,27, 2,20, 3, 1,57,24, 4,16,84,
+ 2,20, 9, 3,20,59, 1,57,31, 2,20,13, 3,20,56, 2,19,87, 2,20, 7, 1,57,34,
+ 2,19,88, 2,19,91, 2,20, 2, 3,20,66, 3,20,65, 1,57,35, 1,57,33, 1,57,45,
+ 3,20,55, 3,26,22, 3,20,68, 4,16,75, 1,57,40, 3,20,62, 1,57,28, 1,58,86,
+ 4,16,90, 1,57,29, 2,19,92, 1,57,42, 1,57,37, 2,20, 6, 1,57,26, 0, 0, 0,
+ 3,20,57, 0, 0, 0, 1,57,25, 3,68,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,68,54, 3,71, 2, 3,68,53, 0, 0, 0, 2,19,84, 2,19,85, 2,26,46,
+ 0, 0, 0, 0, 0, 0, 3,26,28, 1,62,29, 1,62,32, 2,26,57, 1,62,52, 2,26,60,
+ 1,62,30, 2,26,53, 1,62,36, 1,62,42, 1,65,35, 3,26,17, 3,26,24, 1,62,40,
+ 2,26,50, 1,62,53, 1,62,33, 1,62,41, 2,26,58, 2,33,92, 2,26,63, 2,26,51,
+ 4,22,60, 2,26,42, 2,26,55, 2,26,49, 1,62,39, 2,26,61, 3,26,14, 3,26,10,
+ 1,62,35, 1,62,55, 1,62,48, 3,26,19, 1,62,37, 1,62,34, 3,26,32, 1,62,45,
+ 3,26,20, 2,26,62, 2,26,48, 2,26,54, 2,26,56, 2,26,44, 2,26,59, 1,62,31,
+ 2,26,43, 3,26,34, 1,62,38, 1,62,54, 1,62,50, 2,26,45, 1,62,44, 3,26,27,
+ 15,25,81, 1,62,51, 1,62,47, 1,62,43, 3,26,15, 2,26,52, 6,39, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,71, 3, 1,62,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,33,90,
+ 2,33,86, 3,32,49, 2,34, 7, 2,33,79, 2,33,88, 1,67,44, 1,67,45, 1,67,37,
+ 2,34, 3, 1,67,47, 2,33,84, 2,33,83, 2,33,81, 2,34, 5, 1,67,35, 2,33,93,
+ 2,33,82, 1,67,38, 2,33,91, 1,67,33, 2,33,87, 2,33,94, 2,34, 2, 3,32,46,
+ 4,28,43, 2,34, 6, 1,67,42, 2,33,80, 1,67,36, 2,33,85, 3,26,11, 1,67,31,
+ 6,49,35, 1,67,43, 2,34, 1, 1,67,39, 1,67,40, 1,67,46, 1,67,34, 1, 3, 1,
+ 1,67,32, 2,33,89, 3,32,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,71, 5, 1,67,41,
+ 3,71, 4,15,32,66, 2,34, 4, 0, 0, 0, 3,68,56, 0, 0, 0, 1,72,21, 1,72,16,
+ 3,38,14, 2,41,28, 2,41,24, 3,38, 8, 2,41,18, 1,72,10, 1,72, 6, 2,41,27,
+ /* plane 0, page 86 */
+ 0, 255, /* first, last */
+ 1,72, 7, 2,41,21, 2,41,23, 3,38, 9, 2,41,26, 3,38,22, 1,72,12, 3,38,12,
+ 1,72,19, 1,72,13, 4,34,55, 3,38,10, 2,41,16, 1,72,14, 1,72,15, 2,41,19,
+ 1,72,20, 3,38,20, 2,41,17, 2,41,22, 1,72,11, 2,41,15, 1,72,17, 1,72, 9,
+ 3,38,19, 4,34,43, 0, 0, 0, 1,72, 8, 2,41,20, 2,41,25, 3,38,17, 1,72,18,
+ 3,68,58, 0, 0, 0, 3,68,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,38,48, 2,41,14,
+ 3,38,16, 1,76,23, 2,47,78, 3,43,33, 2,47,75, 3,43,24, 1,76,17, 1,76,29,
+ 1,76,30, 3,43,29, 1,76,20, 2,47,73, 1,76,22, 2,47,65, 1,76,28, 3,43,36,
+ 2,47,77, 1,76,19, 2,47,79, 1,76,18, 4,41,17, 2,47,74, 2,47,76, 1,76,21,
+ 2,47,72, 2,47,66, 2,47,63, 4,41,14, 3,43,30, 2,26,47, 2,47,69, 3,43,23,
+ 2,47,62, 2,47,68, 2,47,67, 3,43,27, 2,47,64, 3,43,35, 1,76,25, 3,43,37,
+ 3,43,32, 3,38,21, 3,43,28, 1,76,24, 3,43,25, 7, 1,67, 3,43,31, 1,76,26,
+ 2,47,70, 1,80,27, 2,47,71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,54,47, 3,48,31,
+ 2,54,40, 3,48,32, 1,80,39, 2,54,44, 1,80,31, 1,80,35, 2,54,43, 3,48,27,
+ 1,80,34, 1,80,30, 1,80,33, 1,80,28, 1,80,38, 2,54,45, 2,54,41, 1,80,37,
+ 2,54,39, 1,80,36, 2,54,46, 2,54,42, 1,76,27, 4,47,81, 1,80,40, 2,54,48,
+ 1,80,32, 1,80,29,15,51,61, 3,48,29, 0, 0, 0, 3,52,40, 2,60,50, 2,60,52,
+ 1,83,38, 2,60,53, 2,60,51, 2,60,49, 2,60,48, 1,83,40, 2,60,47, 1,83,41,
+ 4,53,84, 3,52,41, 3,52,39, 4,53,88, 2,60,45, 2,60,46, 1,83,37, 1,83,42,
+ 1,83,39, 3,68,61, 3,68,59, 2,60,44, 3,55,59, 1,86,28, 3,55,58, 2,65,40,
+ 2,65,38, 2,65,43, 2,65,41, 3,55,56, 2,65,39, 2,65,42, 3,55,57, 3,55,55,
+ 3,55,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,88,12, 2,69,30, 2,69,31,
+ 1,88,13, 4,63,45, 2,69,32, 2,69,28, 2,69,33, 2,69,29, 1,86,29, 3,58,13,
+ 3,68,62, 4,67,17, 2,72,75, 2,72,77, 1,89,68, 2,72,76, 1,89,67, 1,89,66,
+ 3,71, 6, 3,71, 7, 3,68,60, 3,62, 6, 1,89,69, 2,75,51, 2,75,52, 4,70,20,
+ 1,90,69, 1,90,68, 1,90,70, 2,75,50, 3,71, 8, 2,77,38, 2,77,37, 3,63,32,
+ 1,91,57, 1,91,59, 1,91,58, 2,77,39, 1,92,20, 2,80,20, 0, 0, 0, 4,74,36,
+ 4,74,35, 1,92,61, 3,64,81, 2,80,19, 2,80,92, 0, 0, 0, 0, 0, 0, 2, 1,10,
+ 3, 1,87, 4, 1,79, 1,38,31, 1,38,30, 4, 1,77, 1,39,64, 1,39,63, 2, 2, 7,
+ 1,39,62, 2, 2, 6, 0, 0, 0, 3, 3,30, 1,41,59, 2, 3,41, 3, 5,12, 2, 3,40,
+ 15, 3,48, 3, 5, 6, 1,41,57, 1,41,60, 3, 5,11, 3, 5,10, 2, 3,39, 3, 5, 9,
+ 1,41,58, 3, 5,40, 3, 5, 7, 3, 5, 8, 0, 0, 0, 0, 0, 0, 3, 8, 2, 2, 5,80,
+ 3, 7,93, 2, 5,81, 1,44,54, 3, 7,92, 3, 8, 1, 3, 7,91, 0, 0, 0, 1,48,44,
+ /* plane 0, page 87 */
+ 0, 255, /* first, last */
+ 3,11,69, 2,14,42, 2,14,43, 1,52,71, 1,52,72, 3,16, 7, 0, 0, 0, 2,20,15,
+ 1,57,46, 1,57,48, 2,20,14, 1,57,47, 2,26,64, 1,62,56, 3,26,36, 3,26,35,
+ 4,22,72, 4,28,50, 1,67,48, 1,67,49, 2,34, 8, 3,32,50, 1,72,23, 3,38,23,
+ 1,72,22, 0, 0, 0, 2,47,80, 2,54,50, 2,54,49, 3,63,33, 2,81,58, 1,36,40,
+ 2, 1,25, 3, 1,65, 2, 1,47, 2, 1,48, 3, 2,20, 4, 1,80, 0, 0, 0, 4, 1,81,
+ 1,39,67, 1,39,71, 2, 2, 9, 4, 2,49, 1,39,69, 1,39,68, 2, 2, 8, 1,39,70,
+ 1,39,66, 3, 3,33, 3, 3,34, 1,39,65, 2, 2,10, 3, 3,31, 3, 3,32, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,41,70, 3, 5,17, 3, 5,30, 1,41,67, 3, 5,16,
+ 1,41,63, 2, 3,42, 3, 5,32, 3, 5,22, 3, 5,15, 2, 3,43, 3, 5,28, 1,41,65,
+ 3, 5,13, 2, 3,45, 1,41,61, 2, 3,46, 2, 3,44, 1,41,64, 1,41,66, 1,41,69,
+ 1,41,68, 1,41,62, 2, 3,47, 3, 5,18, 3, 5,33, 3, 5,34, 3, 5,19, 3, 5,24,
+ 3, 5,23, 3,68,63, 0, 0, 0,15, 3,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5,21,
+ 0, 0, 0, 1,44,59, 2, 5,94, 3, 8, 5, 1,44,61, 3, 8, 3, 1,44,60, 3, 8, 6,
+ 2, 6, 1, 1,44,58, 1,44,57, 2, 5,85, 4, 5,73, 2, 5,84, 3, 8, 8, 2, 5,82,
+ 2, 5,87, 2, 5,86, 2, 5,83, 2, 5,92, 2, 5,93, 2, 5,90, 2, 5,88, 1,44,56,
+ 3, 8, 9, 4, 5,70, 4, 5,72, 2, 5,91, 1,44,62, 2, 6, 2, 4, 5,69, 3, 8,10,
+ 2, 5,89, 3, 8, 4, 1,48,45, 1,44,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5,78,
+ 15, 6,19, 0, 0, 0, 3,68,64, 1,48,46, 2, 9,53, 3,11,73, 3,11,72, 2, 9,59,
+ 3,11,76, 3,11,71, 3,11,74, 1,48,52, 2, 9,57, 2, 9,63, 3,11,81, 2, 9,54,
+ 2, 9,58, 2, 9,60, 2, 9,62, 2, 9,56, 3,11,80, 2, 9,55, 2, 9,50, 2, 9,51,
+ 1,48,47, 3,11,75, 1,48,49, 1,48,48, 2, 9,52, 2, 9,61, 3,11,77, 3,11,82,
+ 3,11,78, 4, 8,64,15, 9,74,15, 9,81, 3,11,70, 0, 0, 0, 1,48,51, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8,62, 2, 9,49, 2,14,53, 3,16,10,
+ 2,14,52, 2,14,57, 2,14,48, 3,16,16, 2,14,51, 2,14,50, 3,16,15, 2,14,54,
+ 3,16,24, 2,14,58, 1,52,73, 1,52,76, 3,16,20, 3,16,21, 2,14,49, 2,14,55,
+ 3,16,19, 3,16, 8, 3,16,23, 1,52,75, 2,14,44, 3,16,11, 1,48,50, 2,20,29,
+ 2,14,56, 3,16,22, 2,14,47, 4,12,19, 1,52,74, 2,14,46, 0, 0, 0,15,14,60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,16,18, 2,20,20, 3,20,78, 3,20,81, 1,57,49,
+ 1,57,53, 2,20,36, 2,20,18, 2,20,32, 1,57,54, 2,20,34, 3,20,82, 2,20,40,
+ 3,20,84, 2,20,44, 3,20,73, 4,16,91, 2,20,35, 2,20,23, 2,20,31, 3,20,75,
+ 2,20,45, 2,20,43, 2,20,33, 2,20,28, 2,20,21, 2,26,72, 2,20,19, 1,57,58,
+ 2,20,26, 1,57,59, 1,57,55, 2,20,16, 2,20,38, 2,20,24, 3,20,79, 3,20,85,
+ /* plane 0, page 88 */
+ 0, 255, /* first, last */
+ 2,20,22, 2,20,41, 1,57,56, 3,20,86, 2,20,47, 1,57,50, 1,57,52, 2,20,30,
+ 2,20,25, 1,52,77, 1,57,51, 2,20,27, 2,20,42, 2,20,46, 2,20,37, 3,68,65,
+ 2,20,39, 0, 0, 0, 3,68,66, 3,68,67, 2,20,17, 0, 0, 0, 0, 0, 0, 4,22,73,
+ 3,26,42, 2,26,67, 3,26,37, 2,26,76, 2,26,75, 1,62,64, 2,26,68, 3,26,39,
+ 1,62,65, 1,62,63, 3,26,48, 2,26,70, 1,62,60, 2,26,74, 3,26,44, 2,26,69,
+ 2,26,71, 2,26,65, 1,62,58, 4,22,79, 2,26,84, 2,26,83, 2,26,80, 1,62,57,
+ 1,62,61, 1,62,62, 2,14,45, 2,26,77, 1,62,59, 1,57,57, 2,26,79, 2,26,66,
+ 2,26,82, 2,26,81, 3,26,46, 2,26,85, 3,26,41, 2,34,22, 3,26,43, 2,26,78,
+ 15,25,93, 0, 0, 0,15,25,94, 4,28,55, 4,22,77, 4,22,81, 0, 0, 0, 3,68,68,
+ 2,26,73, 2,34,14, 1,67,59, 1,67,62, 1,67,57, 2,34,13, 2,34,17, 2,34,12,
+ 3,32,55, 1,67,51, 1,67,61, 2,34, 9, 1,67,55, 2,34,16, 3,32,59, 1,67,53,
+ 1,67,52, 2,34,19, 1,67,54, 2,34,21, 3,32,54, 2,34,18, 1,67,50, 3,32,62,
+ 3,32,60, 3,32,56, 1,67,60, 2,34,23, 2,34,11, 2,34,20, 3,32,61, 4,28,51,
+ 2,34,10, 3,32,58, 3,32,57, 1,67,56, 3,32,52, 1,67,58, 0, 0, 0, 2,34,15,
+ 0, 0, 0, 2,34,24, 3,38,35, 3,38,30, 2,41,36, 1,72,24, 2,41,42, 3,38,34,
+ 3,38,28, 1,72,29, 2,41,38, 2,41,45, 2,41,30, 1,72,31, 1,72,25, 2,41,35,
+ 1,76,31, 2,41,34, 2,41,43, 1,72,26, 3,38,29, 1,72,30, 2,41,33, 2,41,39,
+ 2,41,44, 2,41,29, 1,72,28, 2,41,37, 3,38,26, 3,38,37, 2,41,41, 2,41,47,
+ 2,41,31, 2,41,40, 3,38,24, 1,72,27, 2,41,46, 3,38,33, 3,38,36, 3,38,32,
+ 2,41,32, 0, 0, 0, 4,34,57, 3,68,69, 1,76,35, 2,47,82, 1,76,33, 1,76,32,
+ 2,47,84, 2,47,89, 3,43,38, 2,47,85, 3,43,48, 2,47,88, 1,76,38, 3,43,49,
+ 1,80,14, 1,76,37, 3,43,43, 2,47,81, 2,47,87, 3,38,31, 1,76,36, 2,47,86,
+ 3,43,45, 2,47,83, 3,43,41, 1,76,34, 3,43,47, 3,43,44, 0, 0, 0, 3,43,39,
+ 0, 0, 0, 0, 0, 0, 2,54,55, 3,48,42, 2,54,57, 2,54,52, 1,80,42, 2,54,54,
+ 3,48,43, 1,80,41, 2,54,56, 3,48,40, 3,48,44, 1,80,44, 2,54,58, 1,80,43,
+ 2,54,51, 2,54,53, 3,48,41, 0, 0, 0, 0, 0, 0, 3,52,43, 1,83,46, 2,60,56,
+ 3,52,44, 1,83,45, 2,60,57, 1,83,44, 2,60,55, 1,83,43, 2,60,54, 0, 0, 0,
+ 1,86,31, 1,86,30, 2,69,34, 2,69,36, 3,58,15, 2,69,35, 1,88,14, 1,88,15,
+ 3,58,14, 7,38,37, 1,88,16, 2,72,78, 1,89,70, 0, 0, 0, 3,62, 8, 2,79, 2,
+ 2,79, 1, 1,92,62, 0, 0, 0, 1,36,41, 1,37,17, 0, 0, 0, 3, 3,35, 1,41,71,
+ 3, 5,37, 3, 5,35, 3, 5,36, 3, 8,13, 2, 9,64, 3,11,87, 0, 0, 0, 3,20,87,
+ 0, 0, 0, 1,62,66, 1,62,67, 3,26,50, 2,34,25, 1,72,32, 2,41,48, 2,47,90,
+ /* plane 0, page 89 */
+ 0, 255, /* first, last */
+ 3,68,70, 3,48,45, 3, 1,25, 2, 1,26, 3, 2,21, 3, 3,36, 2, 3,48, 0, 0, 0,
+ 3,11,90, 3,11,89, 3, 1,26, 3, 5,38, 2, 6, 3, 2, 9,65, 2,14,59, 1,52,78,
+ 3,38,38, 3,69,64, 2,69,37, 4,63,50, 1,90,71, 1,36,42, 1,38,32, 2, 1,49,
+ 3, 2,22, 1,39,72, 1,39,73, 4, 2,50, 1,44,63, 4, 5,80, 0, 0, 0, 3,20,89,
+ 1,57,60, 5,23,29, 1,72,34, 3,32,63, 1,72,35, 1,72,33, 3,43,51, 1,36,43,
+ 4, 1,41, 1,37,18, 1,37,20, 1,37,19, 2, 1,27, 1,37,21, 1,38,33, 2, 1,50,
+ 3, 2,24, 1,38,34, 3, 2,23, 4, 1,82, 3, 2,25, 4, 2,51, 3, 3,39, 1,39,74,
+ 1,39,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,11, 3, 5,41, 1,41,72, 4, 3,66,
+ 2, 3,49, 0, 0, 0, 0, 0, 0, 4, 5,85, 1,44,67, 2, 6, 4, 4, 5,82, 1,44,65,
+ 1,44,66, 1,44,64, 2,14,60, 3, 8,14, 3, 8,15, 3,68,71, 1,48,56, 1,48,55,
+ 1,48,57, 1,48,54, 3,11,92, 2, 9,66, 1,44,68, 1,48,53, 0, 0, 0, 1,52,79,
+ 1,52,80, 4,12,24, 1,52,81, 3,20,91, 2,20,48, 3,20,92, 3,20,93, 4,17, 6,
+ 1,62,68, 2,26,86, 1,57,61, 3,26,51, 3,26,52, 4,22,89, 3,32,64, 1,67,63,
+ 3,32,65, 1,72,37, 1,72,36, 2,41,49, 3,38,40, 1,76,39, 1,80,45, 4,47,91,
+ 2,65,44, 2,77,40, 2,79, 3, 1,36,44, 1,38,35, 3, 2,27, 1,38,36, 2, 2,17,
+ 1,39,77, 1,39,80, 3, 3,43, 2, 2,15, 2, 2,13, 1,39,79, 2, 2,16, 2, 2,18,
+ 2, 2,12, 1,39,82, 1,39,81, 1,39,78, 1,39,76, 2, 2,14, 3, 3,45, 0, 0, 0,
+ 0, 0, 0, 3, 5,53, 1,41,83, 4, 3,71, 3, 5,44, 1,41,80, 2, 3,54, 2, 3,57,
+ 2, 3,56, 4, 3,73, 1,41,74, 1,41,82, 3, 5,43, 4, 3,74, 1,41,79, 2, 3,53,
+ 2, 3,51, 1,41,78, 3, 5,54, 3, 5,51, 3, 5,46, 1,41,73, 1,41,76, 3, 5,49,
+ 2, 3,52, 2, 3,59, 2, 3,55, 1,41,77, 1,41,81, 1,41,84, 2, 3,50, 2, 3,58,
+ 1,41,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8,33, 3, 8,19, 1,44,73, 1,44,81,
+ 3, 8,24, 2, 6,16, 2, 6, 9, 1,44,82, 2, 6,20, 2, 6, 5, 2, 6,12, 3, 8,37,
+ 3, 8,32, 1,44,72, 2, 6, 6, 1,44,70, 2, 6,13, 2, 6,17, 1,44,69, 3, 8,29,
+ 2, 6,18, 2, 6,11, 3, 8,23, 2, 6,14, 3, 8,21, 1,44,84, 1,44,75, 2, 6,21,
+ 2, 6,19, 3, 8,31, 1,44,80, 1,44,78, 2, 6,10, 1,44,77, 2, 6, 8, 2, 6, 7,
+ 1,44,76, 1,44,74, 1,44,83, 1,44,79, 1,44,71, 3,12, 6, 2, 6,15, 3, 8,38,
+ 1,48,59, 3,12,13, 1,48,66, 2, 9,80, 1,48,58, 2, 9,72, 2, 9,68, 3,12, 1,
+ 2, 9,84, 2, 9,67, 3,12,12, 1,48,61, 2, 9,77, 1,48,64, 1,48,67, 3,12,14,
+ 1,48,62, 2, 9,81, 1,48,65, 3,12, 3, 1,52,88, 2, 9,87, 2, 9,69, 3,12, 4,
+ 3,12, 5, 2, 9,71, 2, 9,78, 2, 9,82, 2, 9,86, 2, 9,83, 2, 9,76, 2, 9,79,
+ 3,12,11, 3,12, 9, 2, 9,73, 1,48,69, 2, 9,75, 2, 9,74, 2, 9,85, 1,48,60,
+ /* plane 0, page 90 */
+ 0, 255, /* first, last */
+ 2, 9,70, 1,48,68, 3,12,10, 1,48,63, 3,12, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1,52,94, 2,14,68, 3,16,32, 1,52,93, 3,12, 7, 4,12,32, 2,14,66,
+ 4,12,30, 1,52,82, 3,16,47, 1,52,87, 3,16,42, 2,14,65, 2,14,62, 2,14,67,
+ 1,52,83, 2,14,61, 3,16,46, 1,52,86, 1,52,84, 3,16,30, 2,14,69, 1,52,85,
+ 1,52,89, 3,16,27, 3,16,37, 1,52,90, 3,16,40, 1,52,92, 3,16,50, 4,12,25,
+ 4,12,29, 1,52,91, 3,16,28, 3,21, 2, 3,21,24, 2,14,63, 2,14,64, 3,16,45,
+ 6,22,55, 3,16,43, 0, 0, 0, 2,14,70, 0, 0, 0, 2,20,55, 1,57,62, 2,27, 6,
+ 2,20,54, 2,20,73, 3,21, 8, 3,21, 4, 1,57,68, 3,21,17, 2,20,71, 3,21,19,
+ 1,57,67, 1,57,63, 2,20,80, 2,20,64, 2,20,67, 3,21,14, 1,57,71, 2,20,77,
+ 2,20,69, 1,57,64, 1,57,72, 3,21,10, 2,20,74, 2,20,72, 3,21,15, 3,21,27,
+ 2,20,57, 2,20,78, 2,20,66, 2,20,61, 3,21,26, 2,20,51, 2,20,79, 2,20,63,
+ 2,20,50, 3,21,25, 1,57,70, 2,20,68, 2,20,81, 2,20,65, 2,20,53, 2,20,58,
+ 2,20,49, 3,21, 7, 1,57,69, 3,21,28, 2,20,62, 2,20,59, 1,57,65, 2,20,52,
+ 3,21,16, 2,20,76, 1,57,66, 3,21,11, 2,20,60, 2,20,56, 3,21, 9, 3,21,20,
+ 2,20,75, 3,21,18,15,19,83, 3,21,23, 0, 0, 0, 3,21,21, 0, 0, 0, 1,62,69,
+ 2,26,93, 3,26,85, 2,26,90, 2,27,13, 2,27, 1, 2,27,14, 3,26,92, 1,62,71,
+ 3,26,67, 3,26,65, 3,26,56, 2,27,10, 2,27, 7, 3,26,59, 3,26,87, 3,26,82,
+ 3,26,57, 3,26,64, 2,27, 8, 2,27,11, 2,27,15, 3,26,91, 2,20,70, 2,27,17,
+ 2,34,45, 3,26,70, 1,62,72, 2,27,18, 2,26,88, 2,27, 4, 3,26,66, 2,27, 9,
+ 3,26,60, 3,26,62, 1,62,70, 1,62,73, 2,27,16, 2,27,19, 2,26,92, 2,26,89,
+ 3,26,83, 3,26,58, 2,26,91, 3,26,55, 3,26,90, 2,27, 2, 2,26,94, 1,62,74,
+ 3,26,54, 2,27,12, 3,26,89, 3,26,88, 2,27, 3, 0, 0, 0, 2,27, 5, 2,26,87,
+ 2,34,33, 2,34,31, 1,67,72, 1,67,70, 2,34,41, 2,34,32, 2,34,42, 2,34,38,
+ 2,34,30, 2,34,44, 2,34,29, 2,34,36, 1,67,69, 1,67,68, 1,67,67, 2,34,34,
+ 2,34,39, 1,67,64, 1,67,71, 3,32,71, 2,34,27, 3,32,70, 2,34,37, 2,34,26,
+ 2,34,35, 1,67,65, 2,34,40, 2,34,28, 1,67,66, 2,34,43, 3,32,68, 3,26,75,
+ 3,32,74, 3,68,72, 0, 0, 0, 3,68,73, 0, 0, 0, 2,41,53, 1,72,42, 1,72,41,
+ 1,72,43, 2,41,65, 2,41,55, 2,41,61, 2,41,50, 2,41,64, 2,41,63, 2,41,67,
+ 2,41,60, 1,72,38, 2,41,59, 1,72,44, 3,38,44, 2,41,52, 1,72,39, 3,38,42,
+ 2,41,66, 1,72,40, 2,41,54, 2,41,57, 2,41,62, 2,41,56, 2,41,51, 3,38,47,
+ 3,38,51, 0, 0, 0, 0, 0, 0, 2,41,58, 2,47,92, 1,76,43, 2,48, 1, 2,47,94,
+ 2,48, 3, 2,48, 5, 3,43,60, 1,76,41, 3,43,56, 2,47,93, 3,43,52, 2,47,91,
+ /* plane 0, page 91 */
+ 0, 255, /* first, last */
+ 3,43,62, 2,48, 6, 2,48, 4, 2,48, 2, 3,43,54, 2,48, 8, 3,43,58, 2,48, 7,
+ 1,76,45, 1,76,40, 3,43,59, 1,76,42, 1,76,44, 3,43,61, 3,43,63, 2,48, 9,
+ 2,54,65, 3,48,48, 3,48,51, 2,54,64, 2,54,63, 3,48,49, 2,54,66, 2,54,59,
+ 3,48,47, 2,54,60, 2,54,68, 2,54,61, 3,48,52, 1,80,46, 2,54,70, 3,48,46,
+ 2,54,69, 2,54,62, 3,48,54, 2,60,61, 1,83,49, 2,60,59, 2,60,64, 2,60,63,
+ 2,54,67, 3,52,48, 1,83,48, 3,52,46, 2,60,62, 2,60,58, 2,60,66, 2,60,65,
+ 1,83,47, 3,52,50, 2,60,60, 3,52,47, 1,80,47, 3,52,49, 0, 0, 0, 3,52,51,
+ 1,86,32, 3,58,17, 3,55,65, 3,55,62, 2,65,45, 2,69,38, 2,69,39, 2,69,40,
+ 1,89,71, 4,67,20, 3,60,22, 1,89,72, 3,60,25, 2,72,79, 3,60,26, 2,75,54,
+ 2,75,53, 3,62, 9, 3,63,34, 2,77,41, 2,77,42, 2,79, 4, 2,80,21, 3,64,83,
+ 1,36,45, 1,36,46, 4, 1,18, 1,36,47, 1,37,22, 1,38,37, 2, 2,19, 1,39,83,
+ 1,39,84, 0, 0, 0, 1,41,87, 1,41,88, 1,41,86, 1,41,85, 0, 0, 0, 1,44,85,
+ 3, 8,40, 4, 6, 2, 2, 6,22, 1,44,87, 1,44,86, 2, 6,23, 4, 6, 3, 3,68,74,
+ 4, 8,78, 1,48,70, 3,12,15, 1,53, 1, 2,14,71, 0, 0, 0, 2,20,83, 4,17,12,
+ 1,57,73, 1,62,76, 2,20,82, 1,62,75, 3,32,81, 1,72,45, 3,32,82, 2,41,68,
+ 1,80,48, 3,48,55, 1,83,50, 2,60,67, 3,58,20, 1,89,73, 3,60,27, 1,91,60,
+ 3, 1,27, 2, 1,51, 3, 2,29, 1,38,38, 2, 1,52, 1,39,87, 3, 3,48, 1,39,85,
+ 1,39,86, 1,39,88, 4, 3,79, 1,41,90, 1,41,89, 3, 5,58, 2, 3,60, 1,41,91,
+ 4, 6, 5, 0, 0, 0, 2, 3,61, 2, 6,24, 3, 8,44, 2, 6,25, 3, 8,42, 1,44,88,
+ 1,44,90, 1,44,92, 1,44,89, 1,44,93, 1,44,91, 3, 8,46, 3, 8,43, 3, 8,45,
+ 0, 0, 0, 0, 0, 0, 1,48,74, 1,48,71, 1,48,73, 1,48,75, 1,48,72, 2,14,72,
+ 2, 9,88,15,10,25, 0, 0, 0, 3,12,18, 2,14,74, 2,14,73, 1,53, 7, 4,12,38,
+ 1,53, 3, 4,12,41, 6,22,70, 1,53, 4, 1,53, 6, 1,53, 8, 1,53, 5, 3,16,55,
+ 1,53,10, 1,53, 9, 4,12,40, 3,16,54, 3,16,53, 0, 0, 0,15,14,94, 1,57,78,
+ 2,20,85, 2,20,84, 1,57,77, 3,21,33, 1,57,76, 1,57,75, 1,57,79, 1,57,74,
+ 3,21,31, 0, 0, 0, 2,27,25, 2,27,22, 1,62,78, 2,27,21, 2,27,26, 4,23, 4,
+ 1,62,80, 2,27,24, 1,62,77, 1,62,79, 2,27,23, 3,26,94, 2,34,46, 3,32,84,
+ 2,34,47, 2,34,48, 3,32,85, 3,32,86, 3,32,83, 4,28,78, 1,72,46, 1,72,54,
+ 2,41,69, 1,72,48, 1,72,52, 2,41,70, 1,72,53, 1,72,49, 1,72,50, 1,72,47,
+ 1,72,51, 1,76,48, 2,27,20, 1,76,49, 1,76,47, 4,41,36, 1,76,46, 2,54,71,
+ 1,80,49, 2,60,68, 2,60,69, 3,58,21, 4,63,53, 1,88,17, 1,89,74, 3,62,10,
+ 1,36,48, 3, 2,30, 1,39,89, 0, 0, 0, 0, 0, 0, 3, 5,62, 3, 5,60, 3, 5,61,
+ /* plane 0, page 92 */
+ 0, 255, /* first, last */
+ 3, 8,48, 1,48,76, 0, 0, 0, 2,14,75, 1,53,11, 3,16,56, 3,16,57, 1,57,82,
+ 1,57,81, 1,57,80, 1,62,81, 1,62,82, 2,27,27, 1,72,55, 1,80,50, 1,36,49,
+ 2, 1,28, 1,37,23, 2, 1,53, 4, 1,83, 3, 2,31, 2, 2,20, 1,39,90, 4, 2,60,
+ 3, 3,50, 3, 8,49, 1,44,94, 3,12,20, 0, 0, 0, 0, 0, 0, 3,27, 4, 2,34,49,
+ 3,32,88, 3,69, 5, 1,36,50, 4, 1,43, 1,37,24, 2, 2,21, 0, 0, 0, 0, 0, 0,
+ 2, 3,62, 4, 6, 9, 2, 3,63, 3, 5,63, 1,41,92,15, 5,52, 0, 0, 0, 3,12,21,
+ 2,27,28, 1,62,83, 0, 0, 0, 2,34,50, 0, 0, 0, 4,41,41, 3,52,52, 1,83,51,
+ 1,36,51, 1,36,71, 1,37,25, 2, 1,54, 1,38,39, 3, 3,52, 1,42, 2, 1,42, 1,
+ 1,41,93, 1,41,94, 0, 0, 0, 0, 0, 0, 2, 6,26, 1,45, 2, 1,45, 3, 2, 6,27,
+ 1,45, 1, 3, 8,52, 3, 8,53, 1,48,80, 2, 9,89, 1,48,79, 1,48,77, 1,48,78,
+ 1,53,14, 1,53,12, 3,16,58, 3,16,59, 2,14,77, 1,53,13, 2,14,76, 3,68,75,
+ 1,53, 2, 2,20,86, 4,17,21, 3,21,35, 1,57,84, 1,57,85, 3,27, 6, 3,27, 5,
+ 1,57,83, 3,21,36, 1,72,56, 2,41,71, 1,76,50, 1,76,51, 0, 0, 0, 2,48,10,
+ 1,83,52, 2,65,46, 2,65,47, 3,58,24, 1,90,72, 2,80,22, 2, 1,11, 1,37,26,
+ 4, 2,63, 1,36,52, 0, 0, 0, 2, 1,56, 2, 1,55, 4, 1,86, 0, 0, 0, 3,68,76,
+ 3, 3,53, 1,39,91, 2, 2,23, 2, 2,24, 2, 2,22, 4, 2,64, 2, 2,25, 0, 0, 0,
+ 3, 3,58,15, 2,39, 0, 0, 0, 0, 0, 0, 3, 5,65, 3, 5,70, 2, 3,71, 4, 3,90,
+ 2, 3,66, 2, 3,68, 2, 3,70, 2, 3,67, 1,42, 6, 2, 3,64, 3, 5,66, 2, 3,65,
+ 1,42, 3, 1,42, 4, 2, 3,69, 2, 3,72, 1,42, 5, 2, 3,73, 0, 0, 0,15, 3,92,
+ 0, 0, 0,15, 3,88, 0, 0, 0, 0, 0, 0, 3, 5,67, 2, 6,41, 3, 8,61, 2, 6,35,
+ 2, 6,30, 1,45, 5, 2, 6,38, 2, 6,36, 2, 6,29, 2, 6,42, 2, 6,45, 2, 6,40,
+ 2, 6,33, 1,45, 7, 2, 6,39, 1,45, 8, 2, 6,34, 2, 6,37, 2, 6,28, 2, 6,32,
+ 2, 6,44, 1,45, 9, 4, 6,15, 1,45,10, 3, 8,62, 2, 6,31, 2, 6,43, 1,45, 4,
+ 1,45, 6, 3, 8,60, 3, 8,63, 3, 8,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 6,20, 3, 8,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,10,12, 2,10, 5,
+ 2,10,11, 2,10, 4, 2,10, 6, 2, 9,94, 2, 9,92, 3,12,31, 2,10,13, 2,10,10,
+ 2, 9,90, 3,12,27, 1,48,82, 2,10, 8, 2,10, 9, 3,68,77, 2,10, 7, 2, 9,93,
+ 2, 9,91, 1,48,81, 2,10, 3, 2,10, 1, 3,12,28, 3,12,34, 2,10, 2, 2,10,14,
+ 0, 0, 0, 3,12,30, 3,12,33, 0, 0, 0, 0, 0, 0, 3,12,35, 3,12,29, 0, 0, 0,
+ 1,53,19, 3,16,67, 1,53,18, 3,16,63, 2,14,78, 1,53,15, 2,14,80, 3,16,68,
+ 1,53,20, 2,14,81, 4,12,64, 3,16,65, 1,53,23, 3,16,66, 1,53,21, 2,14,82,
+ 2,10,15, 2,14,84, 3,16,62, 1,53,17, 4,12,60, 1,53,16, 4,12,65, 2,14,79,
+ /* plane 0, page 93 */
+ 0, 255, /* first, last */
+ 2,14,83, 1,53,22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,57,87, 1,57,86,
+ 3,21,43, 3,21,40, 3,21,39, 2,20,88, 2,20,92, 2,20,94, 1,57,88, 2,21, 3,
+ 3,21,49, 1,57,92, 2,21, 5, 3,21,50, 1,57,94, 3,21,47, 1,57,90, 1,58, 4,
+ 3,21,53, 1,58, 1, 2,20,90, 1,57,89, 3,27,11, 2,20,89, 2,20,87, 2,21, 7,
+ 2,20,91, 3,21,38, 1,57,91, 2,21, 6, 1,58, 2, 2,21, 2, 2,21, 1, 1,58, 3,
+ 2,20,93, 1,57,93, 3,21,46, 6,30,86, 3,21,42, 0, 0, 0, 2,21, 8, 3,21,52,
+ 2,21, 4, 2,27,43, 2,27,50, 2,27,39, 1,62,86, 2,27,35, 2,27,51, 2,27,29,
+ 2,27,48, 2,27,46, 2,27,40, 3,27,22, 2,27,49, 2,27,42, 3,27, 8, 2,27,34,
+ 2,27,52, 2,27,32, 2,27,45, 2,27,30, 3,27, 7, 2,27,53, 3,27,23, 1,62,87,
+ 3,27,10, 2,27,47, 2,34,53, 2,27,33, 1,62,84, 3,27,14, 2,27,37, 3,27,20,
+ 1,62,85, 2,27,36, 2,27,41, 3,27,19, 4,23,21, 2,27,38, 4,23,15, 3,27,17,
+ 0, 0, 0, 2,27,44, 0, 0, 0, 3,27,13, 0, 0, 0, 0, 0, 0, 2,34,57, 4,28,89,
+ 3,33, 1, 4,28,91, 2,34,60, 2,34,52, 3,32,92, 2,34,54, 3,32,90, 2,34,59,
+ 2,34,58, 1,67,73, 4,28,85, 2,27,31, 2,34,56, 3,32,89, 3,32,93, 1,67,74,
+ 4,28,84, 2,34,51, 2,34,55, 4,28,92, 4,28,88, 3,68,78, 0, 0, 0, 2,41,78,
+ 3,38,60, 2,41,85, 2,41,76, 3,38,52, 2,41,83, 2,41,74, 2,41,82, 2,41,86,
+ 2,41,73, 2,41,77, 2,41,72, 3,38,54, 1,72,57, 4,35,12, 2,41,75, 1,72,58,
+ 2,41,81, 2,41,80, 2,41,79, 3,38,57, 3,38,58, 2,41,84, 3,68,79, 3,43,69,
+ 3,43,70, 3,43,67, 2,48,14, 2,48,16, 1,76,53, 2,48,17, 3,43,75, 2,48,12,
+ 3,43,71, 2,48,11, 2,48,21, 3,43,73, 2,48,19, 1,76,52, 2,48,22, 2,48,13,
+ 2,48,18, 2,48,20, 2,48,15, 3,43,74, 3,43,72, 3,68,80, 3,48,56, 2,54,75,
+ 2,54,80, 2,54,74, 2,54,79, 3,48,59, 2,54,72, 2,54,82, 2,54,78, 2,54,83,
+ 2,54,77, 2,54,73, 2,54,81, 3,48,58, 2,54,84, 2,54,76, 3,68,81, 2,60,70,
+ 1,83,56, 3,52,55, 1,83,54, 3,52,57, 1,83,53, 1,83,55, 3,52,53, 3,68,82,
+ 2,65,48, 3,55,66, 2,68,30, 2,69,41, 3,58,25, 0, 0, 0, 2,72,80, 2,72,81,
+ 3,60,29, 1,89,75, 3,60,28, 2,75,55, 3,60,30, 1,90,73, 4,70,27, 2,75,56,
+ 3,62,13, 2,77,44, 1,91,62, 3,63,35, 1,91,61, 2,77,43, 1,92,21, 3,64,16,
+ 2,79, 5, 4,75,72, 4,74,38, 3, 1,28, 4, 1,12, 1,36,53, 1,39,92, 2, 2,26,
+ 2, 3,74, 1,43,54, 1,58, 5, 3,21,55, 3,43,76, 1,36,54, 1,38,42, 1,38,41,
+ 1,38,40, 4, 2,67, 0, 0, 0, 1,42, 7, 0, 0, 0, 0, 0, 0, 1,53,24, 0, 0, 0,
+ 2,34,61, 1,36,55, 1,36,56, 1,36,57, 1,37,27, 3, 5,71, 3, 8,64, 1,48,83,
+ 4,12,68, 2,10,16, 3,12,37, 3,12,36, 0, 0, 0, 1,62,88, 1,36,58, 2, 1,29,
+ /* plane 0, page 94 */
+ 0, 255, /* first, last */
+ 3, 1,67, 4, 1,44, 1,38,43, 1,38,44, 2, 1,57, 0, 0, 0, 1,39,93, 5, 2,60,
+ 3, 3,60, 3, 5,72, 2, 3,75, 3, 5,75, 1,42, 8, 4, 4, 3, 2, 3,76, 0, 0, 0,
+ 0, 0, 0, 1,45,16, 3, 8,66, 3, 8,65, 2, 6,47, 1,45,14, 1,45,13, 2, 6,46,
+ 1,45,11, 2, 6,48, 1,45,12, 1,45,15, 0, 0, 0, 1,48,84, 3,12,38, 1,48,86,
+ 2,10,20, 2,10,17, 2,10,18, 2,10,19, 2,10,21, 1,48,85, 0, 0, 0, 0, 0, 0,
+ 2,14,86, 2,14,85, 3,16,70, 1,53,26, 3,16,73, 1,53,25, 3,16,72, 3,16,74,
+ 3,16,71, 0, 0, 0, 3,21,59, 1,58, 8, 2,21,10, 3,21,57, 1,58, 7, 1,58, 9,
+ 1,58, 6, 3,21,56, 3,21,58, 0, 0, 0, 0, 0, 0, 1,62,90, 2,21, 9, 5,23,92,
+ 1,62,91, 2,27,55, 3,25,89, 1,62,92, 2,27,54, 1,62,89, 3,27,26, 3,27,27,
+ 3,27,29, 0, 0, 0, 2,34,64, 2,34,66, 1,67,75, 2,34,65, 2,34,63, 2,34,62,
+ 4,29,10, 4,35,21, 3,38,61, 2,41,89, 1,72,63, 1,72,61, 4,35,16, 1,72,62,
+ 2,41,87, 2,41,88, 3,43,77, 1,72,59, 2,48,26, 2,48,24, 3,43,80, 1,76,55,
+ 2,48,25, 1,76,56, 1,76,54, 1,72,60,15,46,62, 3,68,83, 2,54,87, 2,54,85,
+ 2,54,86, 2,48,23, 2,60,72, 1,83,57, 2,60,71, 2,65,49, 2,65,50, 2,54,88,
+ 2,69,42, 3,70,87, 1,36,59, 1,38,45, 1,40, 1, 2, 2,27, 1,39,94, 3, 8,67,
+ 1,45,17, 1,67,76, 3, 1,29, 1,37,28, 1,38,46, 1,48,87, 1,62,93, 3, 1,30,
+ 2, 1,58, 3, 2,39, 2, 1,59, 3, 2,40, 2, 2,28, 3,70,88, 0, 0, 0, 1,42,10,
+ 2, 3,80, 2, 3,78, 1,42,11, 2, 3,77, 2, 3,79, 2, 3,81, 4, 4, 8, 1,42, 9,
+ 3, 5,78, 0, 0, 0, 3, 5,77, 0, 0, 0, 0, 0, 0, 1,45,21, 1,45,22, 1,45,19,
+ 3, 8,69, 3, 8,71, 1,45,18, 2,10,25, 1,45,20, 3, 8,72, 0, 0, 0, 0, 0, 0,
+ 1,48,88, 3,12,40, 2,10,24, 2,10,26, 2,10,23, 2,10,27, 1,48,89, 1,53,29,
+ 2,14,87, 3,16,76, 2,14,89, 1,53,27, 2,14,90, 1,53,28, 2,14,88, 3,16,75,
+ 2,10,22, 2,21,11, 2,21,14, 2,21,15, 2,21,12, 1,58,13, 1,58,12, 1,58,10,
+ 1,58,11, 2,21,13, 3,21,65, 3,21,64, 0, 0, 0, 3,27,31, 1,58,14, 3,27,32,
+ 3,27,30, 1,63, 1, 1,63, 2, 6,40,37, 1,63, 3, 2,34,67, 2,34,69, 2,34,71,
+ 1,67,78, 1,67,77, 1,62,94, 2,34,70, 2,34,68, 3,68,84, 2,41,93, 3,38,65,
+ 3,38,64, 2,41,91, 2,42, 3, 1,72,64, 2,42, 4, 2,42, 1, 1,72,65, 2,41,92,
+ 2,41,90, 2,42, 2, 1,76,58, 2,48,28, 2,41,94, 1,76,60, 2,48,29, 1,76,59,
+ 1,76,62, 2,48,30, 1,76,57, 1,76,61, 0, 0, 0, 2,54,93, 2,54,91, 2,54,90,
+ 2,54,92, 2,54,89, 3,48,60, 4,59, 1, 1,88,19, 3,68,85, 2,72,82, 2,72,83,
+ 3,60,31, 2,75,57, 2,77,45, 1,93, 2, 3, 1,31, 3, 3,65, 1,45,23, 1,42,12,
+ 3, 8,73, 3, 8,75, 1,48,90, 3,12,44, 3,12,43, 3,16,78, 1,36,60, 1,37,29,
+ /* plane 0, page 95 */
+ 0, 255, /* first, last */
+ 4, 1,45, 1,38,47, 2, 2,29, 3, 5,79, 1,42,13, 2, 3,82, 3, 8,77, 2,10,28,
+ 1,48,91, 0, 0, 0, 1,72,66, 1,36,61, 3, 1,68, 3, 2,41, 3, 3,66, 1,40, 2,
+ 15, 2,46, 3,27,34, 1,67,79, 1,36,62, 1,37,30, 1,37,31, 0, 0, 0, 1,38,49,
+ 1,38,48, 4, 2,75, 2, 2,30, 1,40, 3, 4, 2,76, 2, 3,83, 3, 5,81, 1,42,14,
+ 0, 0, 0, 3, 8,78, 2, 6,50, 2, 6,51, 2, 6,52, 3, 8,80, 1,45,24, 1,45,25,
+ 2, 6,49, 1,45,26, 0, 0, 0, 4, 9,12, 4,12,80, 1,48,92, 2,10,29, 3,12,45,
+ 2,14,92, 1,53,30, 3,16,79, 2,14,91, 3,21,66, 1,58,15, 2,21,16, 1,58,16,
+ 2,21,17, 3,21,67, 3,27,39, 3,27,37, 1,63, 4, 4,23,37, 3,27,36, 4,29,16,
+ 2,34,72,15,33,31, 3,33, 2, 2,42, 6, 2,42, 5, 0, 0, 0, 1,72,67, 4,41,62,
+ 1,76,63, 2,48,31, 1,80,51, 2,54,94, 1,83,58, 3,55,67, 1,91,63, 2,79, 7,
+ 3, 1,32, 3, 1,33, 3, 2,42, 3, 3,49, 2, 6,53, 3, 8,81, 2,10,30, 1,58,17,
+ 2,27,56, 1,67,80, 3,33, 3, 3,48,62,15,52,35, 3,55,68, 1,86,33, 0, 0, 0,
+ 3,65,68, 3, 1,34, 1,42,16, 3, 5,82, 1,42,15, 1,48,93, 3,12,48, 2,14,93,
+ 0, 0, 0, 1,58,19, 1,61, 9, 1,58,20, 1,58,18, 1,63, 5, 3,33, 4, 2,42, 7,
+ 1,72,68, 1,76,64, 3,63,37, 2, 1,12, 2, 2,31, 4, 2,77, 2, 3,85, 1,42,17,
+ 2, 3,84, 1,42,18, 4, 4,12, 0, 0, 0, 1,45,30, 2, 6,56, 2, 6,55, 1,45,29,
+ 1,45,27, 1,45,28, 2, 6,54, 3, 8,86, 3, 8,85, 1,49, 1, 2,10,31, 1,49, 4,
+ 1,48,94, 1,49, 6, 1,49, 2, 1,49, 3, 1,49, 5, 4, 9,17, 3,16,80, 3,16,82,
+ 1,53,33, 1,53,32, 1,53,31, 3,16,81, 3,68,86, 0, 0, 0, 2,21,19, 1,58,21,
+ 1,58,24, 1,58,22, 3,68,87, 2,21,18, 1,58,27, 4,17,51, 1,58,23, 2,21,20,
+ 1,58,26, 1,58,25, 4,17,50, 4,17,55, 4,23,42, 2,27,58, 2,27,57, 3,27,43,
+ 1,63, 8, 1,63, 6, 1,63, 7, 2,27,59, 1,67,81, 2,34,74, 1,67,82, 2,34,73,
+ 4,29,20, 4,35,31, 2,48,32, 3,38,67, 3,38,68, 1,76,66, 2,42, 8, 1,76,65,
+ 3,43,82, 1,72,69, 3,68,88, 2,55, 2, 2,55, 1, 1,83,59, 2,60,73, 2,69,43,
+ 2,72,84, 2,72,85, 3,62,15, 1,37,32, 4, 1,22, 1,38,50, 0, 0, 0, 3, 2,45,
+ 4, 2,81, 2, 1,60, 3, 2,44, 5, 2,70, 1,42,20, 1,42,22, 3, 5,88, 2, 2,34,
+ 2, 3,88, 2, 3,87, 2, 3,86, 3, 3,70, 2, 2,33, 2, 2,32, 1,40, 5, 1,42,21,
+ 1,42,19, 1,40, 4, 3, 3,71, 3, 3,73, 3, 5,87, 1,45,31, 2, 6,57, 3, 5,91,
+ 1,45,32, 2, 3,93, 4, 6,48, 2, 4, 1, 2, 3,94, 2, 6,58, 3, 5,86, 3, 5,84,
+ 2, 3,90, 3, 8,94, 1,42,26, 1,42,24, 3, 5,92, 2, 3,89, 2, 3,91, 2, 4, 3,
+ 3, 6, 2, 1,42,23, 3, 6, 1, 2, 3,92, 2, 4, 7, 1,45,34, 3, 5,93, 2, 4, 4,
+ 1,42,25, 3, 6, 3, 2, 4, 2, 2, 4, 5, 3, 5,90, 1,45,33, 3, 5,85, 1,45,35,
+ /* plane 0, page 96 */
+ 0, 255, /* first, last */
+ 2, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8,88,
+ 3, 9, 2, 2, 6,78, 2, 6,65, 2, 6,63, 2, 6,77, 2, 6,72, 1,49,11, 1,45,36,
+ 2, 6,73, 2, 6,76, 1,49, 7, 2, 6,75, 1,45,37, 1,45,42, 1,45,40, 2, 6,66,
+ 4, 9,22, 2, 6,61, 2, 6,68, 1,45,47, 2, 6,79, 1,49, 8, 2, 6,69, 4, 6,47,
+ 1,49, 9, 1,45,43, 2, 6,71, 3,12,58, 2,10,46, 1,49,10, 2, 6,60, 1,45,44,
+ 1,49,12, 1,45,45, 1,45,41, 1,45,46, 2, 6,70, 2, 6,59, 2, 6,74, 1,45,38,
+ 3, 8,87, 3,12,59, 2, 6,62, 2, 6,67, 2, 6,64, 1,45,39, 3, 8,90, 2,10,32,
+ 4, 9,37, 2,10,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 9, 1, 0, 0, 0, 0, 0, 0,
+ 2,10,43, 2,15, 3, 2,10,44, 1,49,18, 2,10,47, 2,10,37, 1,49,17, 2,10,39,
+ 4, 9,31, 2,10,40, 3,12,64, 3,16,89, 2,10,42, 1,49,13, 3,12,54, 3,16,83,
+ 1,53,37, 3,12,55, 3,12,61, 2,10,38, 2,10,34, 1,53,38, 3,16,94, 4, 9,30,
+ 2,10,48, 1,53,34, 2,15, 1, 2,10,41, 3,12,52, 2,14,94, 2,10,36, 2,10,45,
+ 3,12,63, 3,12,65, 1,49,16, 1,53,35, 1,49,22, 1,53,36, 2,10,49, 2,15, 2,
+ 1,49,15, 1,53,40, 1,49,21, 1,49,20, 1,49,19, 1,53,39, 2,10,50, 1,53,41,
+ 1,49,14, 4, 9,43, 2,10,35, 3,16,90, 3,16,88, 3,16,91, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,12,60, 0, 0, 0, 3,16,86, 1,58,28,
+ 2,15, 6, 2,15, 8, 4,13, 5, 2,15,10, 1,53,42, 1,53,48, 2,21,23, 2,15,14,
+ 2,15, 5, 1,58,30, 2,21,21, 3,17, 2, 1,53,47, 1,53,45, 2,15,16, 4,13,13,
+ 2,21,22, 4,13,12, 2,15, 7, 3,17, 5, 1,53,46, 2,15,11, 1,53,49, 2,15,13,
+ 3,21,72, 3,16,84, 1,53,44, 2,15,12, 2,15,15, 2,15, 9, 3,17, 7, 1,53,43,
+ 1,58,31, 3,21,81, 2,15, 4, 1,58,29, 3,21,82, 4,17,75, 3,17, 3, 3,17, 8,
+ 1,58,32, 3,17, 1, 3,21,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,17, 6, 0, 0, 0,
+ 2,21,25, 2,21,34, 1,63,11, 3,27,52, 1,58,34, 1,58,39, 1,63,12, 2,21,36,
+ 1,58,46, 2,27,61, 2,21,26, 1,58,38, 1,58,41, 1,58,36, 2,21,24, 2,21,38,
+ 2,21,41, 2,27,76, 4,17,72, 2,21,39, 2,27,65, 1,58,37, 1,58,44, 1,58,48,
+ 2,21,33, 2,27,60, 2,21,37, 1,58,33, 2,27,62, 2,21,40, 2,27,64, 2,21,29,
+ 3,21,74, 1,63, 9, 3,27,54, 2,21,27, 2,21,28, 1,58,43, 3,27,53, 3,21,78,
+ 1,58,42, 2,21,31, 1,58,47, 2,21,35, 1,58,40, 2,21,32, 3,21,89, 1,58,45,
+ 1,63,13, 1,63,10, 2,27,63, 3,27,56, 2,21,30, 3,27,57, 1,58,35, 3,21,86,
+ 3,21,88, 3,27,58, 3,27,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,21,84, 0, 0, 0,
+ 1,63,18, 1,63,22, 2,27,67, 1,67,87, 1,63,20, 2,27,71, 1,63,24, 2,34,75,
+ 2,27,73, 1,67,89, 1,63,16, 1,63,19, 2,27,74, 3,27,62, 2,27,75, 2,27,81,
+ /* plane 0, page 97 */
+ 0, 255, /* first, last */
+ 1,63,26, 1,67,90, 4,29,29, 2,27,77, 2,27,82, 2,27,70, 1,68, 6, 3,27,47,
+ 1,67,91, 1,63,25, 2,27,68, 2,27,83, 3,27,49, 1,68, 5, 1,63,23, 1,67,84,
+ 2,27,80, 3,27,61, 1,63,27, 2,27,72, 2,27,66, 1,63,17, 2,27,69, 5,31,16,
+ 2,27,78, 3,33,11, 1,67,83, 1,67,88, 1,63,14, 2,27,79, 3,27,65, 1,67,86,
+ 3,27,66, 3,27,67, 3,27,48, 1,63,15, 0, 0, 0, 3,68,89, 0, 0, 0, 1,68, 4,
+ 2,42,10, 2,34,86, 3,33, 9, 2,34,78, 2,42, 9, 4,29,25, 2,34,82, 2,34,84,
+ 3,33, 7, 3,33,12, 2,34,81, 3,38,79, 1,68, 3, 4,29,24, 2,34,80, 1,68, 7,
+ 3,38,78, 6,50,68, 3,33, 8, 2,42,25, 3,38,76, 3,33,14, 1,68, 2, 1,72,71,
+ 2,34,87, 2,42,11, 3,38,77, 3,33,10, 1,67,94, 2,34,79, 2,34,83, 1,72,70,
+ 1,67,85, 2,34,76, 2,34,77, 1,72,72, 1,67,93, 1,68, 1, 1,67,92, 2,34,85,
+ 3,68,90, 0, 0, 0, 2,42,15, 2,42,16, 2,42,21, 1,76,71, 2,42,28, 3,43,83,
+ 1,72,78, 3,43,94, 1,72,77, 2,42,23, 3,43,84, 1,76,70, 2,42,12, 1,72,76,
+ 3,38,81, 2,42,27, 1,72,74, 1,72,75, 3,43,92, 2,42,24, 2,48,49, 1,76,68,
+ 1,63,21, 3,38,82, 2,42,26, 1,76,75, 2,42,18, 4,41,79, 1,76,69, 3,38,74,
+ 1,76,74, 2,42,13, 2,42,17, 2,42,14, 2,42,20, 1,72,79, 1,76,67, 1,72,73,
+ 3,44, 1, 2,48,35, 2,42,22, 3,38,72, 1,76,73, 3,38,83, 1,76,76, 7, 2,81,
+ 2,42,19, 3,38,75, 1,76,72, 2,48,34, 5,45,10, 3,44, 3, 3,38,84, 3,44, 4,
+ 3,43,87, 2,48,39, 1,80,55, 2,48,33, 2,55,14, 2,48,48, 1,76,80, 3,43,90,
+ 1,76,78, 1,80,53, 2,48,45, 2,48,41, 1,76,84, 3,43,86, 2,55, 5, 3,48,72,
+ 3,44, 8, 3,48,71, 1,76,82, 2,48,40, 3,44, 9, 2,55, 3, 3,44, 5, 2,48,44,
+ 4,48,27, 2,48,47, 2,48,38, 3,43,89, 1,76,83, 4,48,23, 3,43,85, 1,76,77,
+ 2,55, 4, 1,80,54, 2,48,46, 1,76,79, 1,76,81, 2,48,43, 1,76,85, 2,48,42,
+ 2,48,37, 2,48,36, 1,80,52, 2,48,50, 2,55, 7, 2,60,75, 1,80,57, 3,48,65,
+ 2,55,13, 3,48,67, 2,55,11, 3,48,74, 2,60,76, 3,48,68, 1,80,58, 2,55,12,
+ 3,48,70, 2,55, 9, 1,83,61, 2,60,74, 3,48,76, 2,55, 6, 2,55, 8, 1,83,62,
+ 1,80,60, 1,83,60, 1,80,59, 1,83,64, 2,55,10, 1,80,56, 3,48,66, 3,48,69,
+ 3,48,75, 0, 0, 0, 0, 0, 0, 3,70,89, 0, 0, 0, 4,59,11, 2,65,59, 4,54,19,
+ 2,65,51, 3,52,65, 3,52,63, 3,52,60, 3,52,62, 3,52,61, 2,60,82, 2,65,52,
+ 2,60,78, 4,54,18, 3,52,59, 1,86,34, 2,60,80, 2,60,79, 1,83,63, 2,60,77,
+ 2,60,81, 2,65,60, 2,65,56, 2,65,58, 4,63,64, 2,65,53, 2,65,54, 4,63,65,
+ 2,65,57, 2,65,55, 1,88,20, 3,55,69, 0, 0, 0, 1,88,23, 1,88,22, 1,88,21,
+ 1,89,76, 2,72,86, 1,89,77, 2,69,44, 1,90,74, 2,75,58, 1,90,75, 1,91,64,
+ /* plane 0, page 98 */
+ 0, 255, /* first, last */
+ 1,92,22, 2,79, 8, 3,63,38, 2,79, 9, 2,79,10, 3,65,30, 0, 0, 0, 2,82,10,
+ 1,37,33, 2, 1,61, 1,38,51, 0, 0, 0, 1,40, 7, 1,40, 8, 1,40, 6, 3, 3,75,
+ 1,40, 9, 1,42,28, 1,42,27, 3, 6, 5, 2, 6,80, 1,45,49, 1,45,48, 0, 0, 0,
+ 3,12,67, 2,15,17, 1,58,49, 1,58,50, 4,17,78, 4,17,80, 3,27,68, 1,63,28,
+ 2,34,88, 1,68, 8, 1,68, 9, 2,34,90, 2,34,92, 2,34,91, 4,29,35, 2,42,30,
+ 3,38,86, 2,42,29, 1,72,80, 2,42,31, 3,38,85, 2,48,51, 1,76,86, 3,44,12,
+ 1,80,61, 3,48,77, 1,83,65, 1,86,35, 1,83,66, 3,63,40, 1,37,34, 3, 1,69,
+ 3, 1,70, 3, 2,46, 2, 4, 8, 3, 6, 8, 3, 6, 9, 2, 6,81, 1,45,51, 1,45,50,
+ 1,45,52, 1,49,23, 2,10,51, 2,10,52, 0, 0, 0, 3,17, 9, 2,15,18, 1,53,50,
+ 1,58,51, 1,63,29, 2,27,84, 1,37,35, 4, 1,23, 1,36,63, 1,37,36, 3, 2,48,
+ 2, 1,62, 1,38,55, 1,38,54, 1,38,52, 1,38,53, 0, 0, 0, 0, 0, 0, 3, 3,79,
+ 1,40,12, 2, 2,41, 2, 2,43, 1,40,11, 2, 2,35, 3, 3,76, 2, 2,36, 3, 3,77,
+ 2, 2,42, 2, 2,38, 2, 2,40, 1,40,10, 2, 2,37, 2, 2,44, 2, 2,39, 3, 3,78,
+ 15, 2,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,42,35, 1,42,44, 1,42,42,
+ 2, 4,18, 2, 4,15, 2, 4,23, 1,42,40, 2, 4,24, 3, 6,25, 1,42,33, 2, 4,21,
+ 3, 6,14, 1,42,39, 2, 4,17, 2, 4,16, 1,42,37, 2, 4,22, 1,42,38, 1,45,53,
+ 1,42,32, 2, 4,19, 3, 6,10, 2, 4, 9, 1,42,29, 3, 6,23, 1,42,48, 2, 4,14,
+ 2, 4,20, 1,42,34, 1,42,36, 3, 6,15, 2, 4,10, 3, 6,22, 2, 4,11, 2, 4,12,
+ 4, 4,25, 1,42,47, 1,42,41, 1,42,46, 2, 4,13, 1,42,45, 1,42,31, 1,42,30,
+ 1,42,43, 3, 6,21, 4, 4,28, 3, 6,19, 3, 6,20, 3, 6,24, 3, 6,17, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,68,91,15, 4,25, 3, 6,18, 3, 9,17, 3, 9,10,
+ 1,45,67, 2, 6,93, 2, 6,86, 1,45,62, 1,45,81, 2, 6,82, 2, 6,89, 2, 6,91,
+ 2, 6,94, 1,45,76, 3, 9, 6, 2, 6,90, 2, 6,83, 1,45,74, 2, 6,87, 3, 9, 8,
+ 2, 7, 1, 1,45,59, 3, 9, 5, 2, 6,92, 1,45,69, 1,45,68, 2, 6,85, 1,45,57,
+ 3, 9,20, 3, 9,18, 1,45,58,15, 7,16, 1,45,56, 3, 9,19, 1,45,80, 1,45,72,
+ 1,45,66, 1,45,54, 2, 6,88, 1,45,65, 1,45,55, 1,45,73, 1,45,82, 2,10,53,
+ 1,45,70, 2, 6,84, 1,45,60, 1,45,63, 1,45,64, 3, 9,14, 1,45,78, 1,45,79,
+ 1,45,77, 1,45,71, 1,45,75, 1,45,61, 1,49,24, 3, 9,16, 3, 9,23, 3, 9,21,
+ 3, 9,22, 3, 9,15, 0, 0, 0, 0, 0, 0, 3, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,12,77, 2,10,59, 1,49,36, 1,49,28, 1,49,30, 1,49,35,
+ 2,10,71, 1,49,33, 2,15,19, 1,53,51, 1,49,38, 2,10,56, 2,10,64, 1,49,34,
+ 2,10,63, 2,10,60, 2,10,68, 2,10,70, 1,49,27, 1,49,31, 1,49,37, 1,53,53,
+ /* plane 0, page 99 */
+ 0, 254, /* first, last */
+ 2,10,65, 1,49,29, 1,49,40, 2,10,58, 3,12,79, 3,12,80, 5, 9,37, 1,49,32,
+ 1,53,52, 1,49,26, 4, 9,57, 2,10,55, 2,10,62, 2,10,54, 2,10,57, 2,10,61,
+ 2,15,20, 1,49,39, 4, 9,49, 2,10,66, 2,10,67, 2,10,69, 1,49,25, 3,12,76,
+ 0, 0, 0, 3,17,18, 0, 0, 0, 3,17,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,12,75,
+ 0, 0, 0, 3,12,78, 0, 0, 0, 4, 9,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1,53,67, 2,15,32, 1,53,65, 1,53,66, 2,15,22, 2,15,38, 3,17,12, 1,53,56,
+ 3,17,15, 3,17,21, 2,21,42, 2,15,40, 2,15,34, 3,17,24, 2,15,25, 3,17,23,
+ 2,15,43, 2,15,28, 1,53,62, 2,21,65, 2,15,31, 1,53,64, 1,53,55, 3,17,28,
+ 2,15,45, 2,15,33, 1,53,58, 2,15,26, 2,15,23, 2,15,24, 1,53,59, 2,15,39,
+ 2,15,46, 1,53,61, 2,15,30, 2,15,29, 1,53,69, 1,53,68, 1,53,54, 1,53,60,
+ 1,53,63, 2,15,42, 3,17,14, 3,17,25, 2,15,36, 1,53,57, 2,15,21, 2,15,44,
+ 2,15,35, 2,15,37, 2,15,41, 3,17,16, 3,17,27, 3,17,22, 0, 0, 0, 0, 0, 0,
+ 3,68,92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,68,93, 2,21,43, 3,22,17, 1,58,59,
+ 1,58,79, 1,58,78, 3,22, 7, 1,58,67, 3,22, 9, 2,21,61, 2,21,57, 2,21,54,
+ 2,21,72, 1,58,62, 1,58,54, 3,22, 6, 3,22,18, 2,21,59, 1,63,45, 1,58,58,
+ 2,21,67, 3,22, 2, 1,58,80, 1,58,77, 2,21,63, 2,21,46, 3,21,92, 3,22,11,
+ 1,58,76, 2,21,69, 2,21,45, 1,58,65, 1,58,69, 2,21,68, 3,22, 3, 2,21,55,
+ 1,58,70, 1,58,64, 2,21,44, 3,21,93, 1,63,31, 2,21,71, 2,21,53, 1,58,75,
+ 2,21,56, 2,21,70, 1,58,74, 3,22, 4, 2,27,85, 4,17,87, 1,58,55, 2,21,51,
+ 1,58,60, 1,58,71, 4,17,88, 1,58,66, 2,21,60, 2,21,50, 2,21,48, 2,21,66,
+ 1,58,52, 1,58,72, 1,58,56, 1,63,30, 2,21,64, 1,58,57, 4,18, 3, 1,58,53,
+ 1,58,68, 1,58,63, 1,58,61, 2,21,52, 1,58,73, 2,21,49, 2,21,62, 2,21,58,
+ 2,27,87, 2,27,86, 3,22,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,68,94, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,22,14, 0, 0, 0, 0, 0, 0, 2,21,47, 2,28, 9, 3,27,81,
+ 1,63,33, 3,27,80, 2,28,15, 2,27,92, 2,28,12, 2,34,93, 1,63,36, 2,28,16,
+ 2,28,19, 1,63,35, 2,28, 1, 2,28,18, 2,28,17, 1,63,37, 2,27,88, 1,63,32,
+ 1,63,40, 3,27,83, 1,63,38, 2,28,14, 4,23,81, 2,28, 4, 1,63,42, 2,28,21,
+ 2,28,13, 2,28,22, 1,63,50, 1,63,48, 2,28,11, 2,28,10, 3,27,71, 2,28, 8,
+ 2,28, 2, 1,63,41, 3,27,70, 1,63,39, 2,15,27, 2,27,89, 3,27,72, 2,35,29,
+ 2,27,90, 1,63,34, 1,63,47, 2,35, 1, 4,23,64, 1,63,43, 1,63,44, 2,27,91,
+ 2,28,20, 2,34,94, 2,28, 5, 2,27,94, 1,63,46, 2,28, 6, 2,28, 3, 3,27,82,
+ 3,27,77, 1,63,51, 4,23,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,27,79,
+ /* plane 0, page 100 */
+ 3, 255, /* first, last */
+ 3,69, 1, 0, 0, 0, 0, 0, 0, 1,68,24, 3,33,41,
+ 3,33,18, 2,35, 4, 2,35,23, 2,35,28, 2,35,16, 1,68,20, 2,35,33, 1,68,17,
+ 2,35, 2, 3,33,26, 2,35, 3, 1,68,10, 1,68,19, 2,35,10, 1,68,22, 1,68,23,
+ 2,35,11, 3,33,24, 2,35,24, 2,35,30, 1,68,18, 3,33,30, 1,68,12, 2,35, 9,
+ 2,35, 5, 2,35,32, 2,35,14, 2,35,15, 2,35, 6, 2,35,26, 2,35,17, 2,35,27,
+ 2,35,19, 3,33,29, 1,68,13, 2,42,32, 1,68,16, 1,68,14, 2,35,31, 2,35,22,
+ 2,35,18, 3,33,22, 3,33,19, 2,35, 7, 1,72,90, 2,35,21, 1,68,21, 2,35,13,
+ 3,33,20, 2,35,12, 3,33,40, 3,39, 5, 3,33,34, 1,68,15, 1,68,11, 2,42,53,
+ 2,35,25, 2,35,20, 0, 0, 0, 2,35, 8, 0, 0, 0, 0, 0, 0, 3,33,36, 3,33,37,
+ 0, 0, 0, 3,70,86, 0, 0, 0, 2,42,48, 3,38,88, 2,42,33, 2,42,44, 3,39, 8,
+ 2,42,51, 1,72,88, 1,63,49, 2,42,49, 1,72,83, 3,38,94, 3,39, 4, 3,38,90,
+ 1,72,82, 2,42,56, 4,35,61, 2,42,34, 2,42,47, 2,42,35, 2,42,46, 1,72,86,
+ 2,42,50, 2,28, 7, 3,39, 1, 4,35,62, 3,39,10, 2,42,57, 2,42,42, 1,72,89,
+ 2,48,65, 1,76,87, 3,39, 3, 2,42,55, 2,42,54, 1,72,91, 2,48,52, 1,76,88,
+ 2,48,53, 3,39, 2, 2,42,38, 2,42,39, 2,42,36, 2,42,41, 2,42,37, 2,42,58,
+ 1,72,85, 1,76,89, 1,72,87, 1,72,92, 3,38,91, 2,42,40, 3,39, 9, 2,42,52,
+ 3,44,13, 3,39, 6, 2,42,45, 3,44,21, 0, 0, 0, 2,48,56, 3,44,24, 1,72,81,
+ 1,76,92, 2,55,21, 2,48,61, 2,48,60, 2,48,62, 3,44,16, 3,44,15, 2,48,59,
+ 1,76,93, 3,44,27, 1,77, 5, 1,77, 2, 3,44,17, 1,77, 3, 2,48,54, 2,48,57,
+ 2,48,67, 1,77,11, 1,77, 9, 3,44,14, 2,48,58, 2,27,93, 1,76,90, 2,48,64,
+ 2,48,55, 3,44,30, 1,77,12, 2,48,63, 1,72,84, 1,77, 1, 2,42,43, 3,44,31,
+ 3,44,20, 1,77, 4, 3,44,29, 1,77, 8, 1,77,10, 1,77, 7, 1,77, 6, 3,44,26,
+ 1,76,94, 2,48,66, 1,76,91, 1,77,13, 3,44,25, 0, 0, 0, 3,69, 2, 0, 0, 0,
+ 0, 0, 0, 3,44,23, 0, 0, 0, 1,80,65, 1,80,66, 2,55,20, 1,80,75, 1,80,72,
+ 3,48,80, 1,80,63, 1,80,70, 2,55,22, 1,80,68, 1,80,62, 3,44,18, 1,80,69,
+ 3,48,87, 2,55,19, 1,83,68, 1,80,64, 5,52,62, 1,80,71, 1,83,67, 2,55,18,
+ 2,55,17, 3,48,86, 1,80,73, 3,48,79, 1,80,74, 3,48,89, 2,55,16, 2,55,15,
+ 1,83,69, 2,55,25, 1,80,67, 2,55,23, 3,48,85, 0, 0, 0, 0, 0, 0, 3,52,68,
+ 1,83,70, 3,52,71, 1,83,75, 2,60,85, 2,60,87, 3,55,75, 1,83,72, 3,55,77,
+ 2,60,88, 2,60,84, 3,55,76, 2,60,86, 1,83,73, 1,83,76, 3,52,73, 2,60,83,
+ 1,83,71, 1,83,74, 1,86,37, 2,55,24, 1,86,36, 7,31,66, 3,55,74, 1,86,42,
+ 2,65,64, 3,55,80, 1,86,40, 1,86,41, 2,65,67, 2,65,63, 1,86,38, 2,65,61,
+ /* plane 0, page 101 */
+ 0, 255, /* first, last */
+ 1,88,24, 2,65,65, 4,59,22, 2,65,66, 2,65,62, 3,55,78, 1,86,39, 2,69,45,
+ 3,58,27, 2,69,48, 3,58,28, 3,58,26, 2,69,49, 2,69,47, 2,69,50, 1,88,25,
+ 2,69,46, 3,62,17, 0, 0, 0, 2,72,90, 1,89,79, 2,72,89, 2,72,88, 2,72,87,
+ 1,89,78, 1,89,80, 3,69, 3, 2,75,59, 1,90,77, 1,90,76, 3,63,42, 3,63,43,
+ 2,77,47, 2,77,46, 2,77,49, 1,92,23, 1,91,65, 2,79,12, 2,77,48, 3,63,41,
+ 3,64,18, 2,79,11, 1,92,25, 1,92,24, 1,92,63, 2,80,23, 2,80,93, 1,37,37,
+ 6, 3,76, 3,12,82, 2,28,23, 2,55,26, 3, 1,71, 3, 1,72, 1,40,13, 2, 2,45,
+ 1,42,51, 1,42,49, 4, 4,31, 1,42,50, 4, 4,30, 2, 7, 2, 1,45,83, 1,49,41,
+ 3,12,84, 2,10,72, 3,12,86, 2,10,73, 3,12,83, 1,49,42, 2,15,48, 4,13,35,
+ 1,53,70, 1,53,71, 2,15,47, 3,17,29, 4,13,36, 3,22,23, 3,22,22, 1,58,87,
+ 4,18,11, 1,58,83, 4,18,15, 2,21,73, 1,58,90, 1,58,89, 1,58,82, 1,58,85,
+ 1,58,88, 1,58,84, 3,22,20, 0, 0, 0, 2,28,27, 1,58,81, 1,63,52, 3,27,84,
+ 3,27,85, 3,27,86, 1,63,54, 1,63,55, 2,28,26, 2,28,29, 1,63,53, 2,28,24,
+ 2,28,28, 0, 0, 0, 2,28,25, 3,33,43, 1,68,25, 3,33,46, 4,29,61, 2,35,34,
+ 3,33,45, 3,39,16, 1,72,93, 2,42,59, 1,80,76, 1,77,14, 2,48,68, 1,77,15,
+ 1,77,16, 2,48,70, 2,48,69, 2,48,71, 2,55,28, 0, 0, 0, 0, 0, 0, 2,55,27,
+ 2,60,90, 2,60,89, 1,83,77, 1,83,78, 2,69,51, 3,60,33, 0, 0, 0, 1,37,38,
+ 3, 5,56, 3, 9,25, 4,13,39, 3,17,32, 2,28,30, 3,22,24, 3,22,25, 0, 0, 0,
+ 1,63,57, 1,63,56, 2,35,35, 0, 0, 0, 2,65,68, 1,90,78, 2,79,13, 1,37,39,
+ 4, 4,33, 1,53,72, 3,17,34, 1,58,92, 1,58,91, 2,28,31, 2,28,32, 1,68,26,
+ 2,42,60, 1,72,94, 2,55,29, 4,54,31, 1,37,40, 1,38,56, 3, 9,27, 1,45,84,
+ 2, 7, 3, 0, 0, 0, 2,10,74, 1,49,43, 1,58,93, 3,22,26, 2,28,33, 1,63,58,
+ 1,68,27, 4,29,67, 2,48,72, 2,48,73, 4,48,46, 3,52,75, 2,60,91, 1,86,43,
+ 2,80,94, 1,37,41, 3, 9,28, 2, 7, 4, 1,45,85, 1,49,44, 3,12,87, 2,10,75,
+ 0, 0, 0, 1,53,73, 2,15,52, 2,15,50, 2,15,51, 1,53,74, 2,15,49, 3,22,28,
+ 4,18,20, 3,22,31, 3,22,29, 1,59, 1, 1,59, 2, 2,21,74, 1,59, 3, 1,58,94,
+ 2,28,34, 3,27,89, 2,28,35, 2,35,36, 4,29,68, 0, 0, 0, 1,73, 2, 1,73, 1,
+ 4,48,47,15,52,68, 2,60,92, 2,65,69, 3,58,31, 2,69,53, 2,69,52, 2,72,91,
+ 3, 1,73, 2, 1,30, 1,49,45, 3,22,33, 3,33,48, 1,37,42, 1,38,57, 3, 2,49,
+ 1,40,15, 1,40,14, 3, 3,83, 3, 3,82, 1,40,16, 1,40,17, 2, 2,47, 2, 2,46,
+ 2, 4,25, 1,42,52, 2, 4,28, 2, 4,27, 2, 4,26, 2, 4,29, 3, 6,29, 0, 0, 0,
+ 0, 0, 0, 4, 6,66, 1,45,86, 2, 7,10, 2, 7, 6, 2, 7,15, 3, 9,35, 3, 9,30,
+ /* plane 0, page 102 */
+ 0, 255, /* first, last */
+ 1,45,93, 3, 9,34, 1,45,91, 2, 7,11, 2, 7, 7, 2, 7,14, 1,45,90, 1,46, 3,
+ 2, 7, 9, 2, 7, 5, 1,46, 2, 2, 7,12, 1,45,89, 2, 7,13, 1,45,92, 1,45,94,
+ 2, 7,17, 2, 7,16, 2, 7, 8, 1,45,88, 1,45,87, 1,46, 1, 4, 6,65, 3, 9,32,
+ 3, 9,33,15, 7,30, 3,12,94, 3,12,90, 2,10,80, 2,10,86, 3,13, 3, 1,49,51,
+ 1,49,48, 2,10,77, 2,10,82, 3,12,92, 1,49,54, 1,49,46, 2,10,81, 1,49,49,
+ 1,49,52, 3,12,89, 4, 9,71, 2,10,84, 3,12,93, 1,49,47, 2,10,89, 1,49,50,
+ 3,13, 1, 1,49,53, 2,10,78, 2,10,83, 2,10,87, 2,10,79, 2,10,76, 3,13, 4,
+ 3,13, 5, 2,10,88, 2,10,85, 3,13, 2, 3,12,23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3,17,38, 1,53,82, 1,53,75, 1,53,78, 3,17,44, 1,53,81, 3,17,36, 2,15,55,
+ 3,17,41, 1,53,76, 2,15,53, 3,17,40, 1,53,80, 3,17,45, 3,17,37, 1,53,77,
+ 3,17,35, 2,15,56, 1,53,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,22,34,
+ 4,18,25, 2,21,78, 1,59, 5, 2,21,77, 2,21,79, 1,59, 4, 1,59, 9, 2,15,54,
+ 3,17,43, 2,21,76, 2,21,80, 3,22,36, 1,59, 6, 2,21,75, 1,59, 8, 3,22,37,
+ 1,59, 7, 3,28, 6, 2,28,42, 3,27,93, 2,28,37, 3,28, 5, 1,63,59, 1,63,63,
+ 1,63,60, 2,28,40, 2,28,43, 3,28, 3, 1,63,61, 4,24, 4, 1,63,62, 1,63,67,
+ 2,35,45, 2,28,41, 1,63,65, 2,28,38, 2,28,36, 3,27,92, 1,63,66, 3,27,94,
+ 2,28,39, 3,28, 4, 0, 0, 0, 0, 0, 0, 1,68,33, 4,29,73, 2,35,37, 1,68,30,
+ 1,68,31, 1,68,29, 2,35,42, 2,35,41, 2,35,38, 1,68,35, 3,33,59, 3,33,54,
+ 2,35,40, 1,63,64, 3,33,57, 3,33,49, 2,35,44, 2,35,39, 1,68,32, 1,68,28,
+ 1,68,34, 2,35,43, 3,39,20, 4,35,75, 3,39,21, 1,73, 5, 4,35,79, 2,42,63,
+ 2,42,62, 2,42,61, 1,73, 3, 4,35,77, 3,39,25, 3,39,19, 3,39,23, 0, 0, 0,
+ 1,73, 4, 2,48,76, 2,48,79, 1,77,18, 3,44,36, 3,44,38, 1,77,17, 2,48,80,
+ 2,48,75, 1,77,20, 2,48,77, 3,44,33, 1,77,19, 2,48,74, 3,44,32, 2,48,78,
+ 1,80,82, 1,80,79, 2,55,38, 2,55,37, 3,44,35, 2,55,36, 2,55,31, 3,48,93,
+ 2,55,32, 3,49, 3, 4,48,48, 3,48,90, 1,80,80, 3,48,94, 1,80,77, 1,80,81,
+ 2,55,30, 1,80,78, 2,55,33, 2,55,34, 2,55,39, 3,49, 2, 3,52,81, 2,55,35,
+ 3,52,79, 3,52,80, 2,60,93, 4,54,33, 3,52,76, 3,52,77, 1,83,80, 3,52,82,
+ 2,65,72, 1,83,79, 2,65,70, 2,65,71, 1,86,44, 1,88,27, 2,69,54, 3,58,35,
+ 1,88,26, 3,58,34, 3,69, 6, 2,72,93, 2,72,94, 3,60,34, 1,89,81, 3,60,35,
+ 2,72,92, 1,90,79, 4,74,44, 2,79,14, 1,92,26, 2,80,24, 2,80,25, 3,65,31,
+ 1,37,43, 4, 1,92, 1,40,18, 1,40,19, 1,42,53, 3, 6,33, 2, 7,18, 1,49,55,
+ 1,53,83, 1,59,10,15,18,83, 0, 0, 0, 1,57,23, 0, 0, 0, 1,63,68, 1,63,69,
+ /* plane 0, page 103 */
+ 0, 255, /* first, last */
+ 1,62,18, 2,28,44, 3,69, 7, 1,68,36, 2,42,65, 2,42,64, 3,49, 4, 7,51,39,
+ 1,37,44, 1,40,20, 2, 7,19, 1,46, 5, 3, 9,37, 1,46, 4, 3,13, 7, 2,10,90,
+ 2,10,91, 3,70,18, 2,15,57, 2,15,58, 1,53,84, 1,53,85, 3,22,40, 1,53,86,
+ 2,21,81, 3,22,39, 3,22,38, 1,59,12, 4,24, 9, 1,63,71, 3,28, 9, 1,63,70,
+ 2,35,46, 2,38,33, 2,42,66, 2,55,40, 3,49, 6, 3,70,19, 1,86,45, 1,89,82,
+ 1,37,45, 0, 0, 0, 1,38,60, 1,38,61, 1,38,59, 1,38,62, 1,38,58, 3, 2,50,
+ 0, 0, 0, 1,40,23, 3, 3,87, 2, 2,55, 1,40,22, 1,40,24, 3, 3,88, 3, 3,85,
+ 2, 2,50, 2, 2,49, 2, 2,52, 2, 2,51, 2, 2,54, 1,40,21, 2, 2,48, 2, 2,53,
+ 15, 2,56, 0, 0, 0,15, 2,55, 0, 0, 0, 3, 6,40, 2, 4,30, 1,42,63, 2, 4,31,
+ 2, 4,35, 1,42,62, 3, 6,41, 2, 4,39, 2, 4,34, 2, 4,37, 1,42,55, 1,42,56,
+ 1,42,57, 1,42,58, 3, 6,37, 1,42,65, 3, 6,36, 2, 4,33, 1,42,60, 1,42,66,
+ 3, 6,39, 2, 4,32, 2, 4,38, 3, 6,34, 1,42,59, 2, 4,36, 1,42,61, 1,42,54,
+ 1,42,64, 3, 6,42,15, 4, 2, 0, 0, 0, 0, 0, 0, 4, 4,38,15, 4,51, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1,46,26, 3, 9,39, 2, 7,21, 1,46, 6, 4, 6,73, 1,46,16,
+ 1,46,17, 1,46, 9, 1,46,27, 1,46,11, 2, 7,29, 1,46,22, 2, 7,24, 1,46,12,
+ 2, 7,39, 2, 7,40, 2, 7,32, 2, 7,25, 1,46,25, 2, 7,37, 1,46,20, 1,46,18,
+ 3, 9,50, 2, 7,38, 3, 9,41, 2, 7,36, 2, 7,28, 2, 7,20, 2, 7,27, 1,46,13,
+ 4, 6,69, 1,46,19, 3, 9,42, 1,46, 7, 2, 7,31, 2, 7,30, 2, 7,22, 3, 9,47,
+ 1,46,21, 2, 7,34, 2, 7,23, 1,46,24, 2, 7,41, 1,46, 8, 3, 9,40, 1,46,15,
+ 2, 7,26, 2, 7,35, 1,46,23, 4, 6,71, 1,46,10, 1,46,14, 4, 6,74, 2, 7,33,
+ 0, 0, 0,15, 7,46, 3, 9,46, 3, 9,44, 3,69, 8, 0, 0, 0,15, 7,48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,69, 9, 0, 0, 0, 2,11,29, 1,49,63,
+ 1,49,76, 3,13,22, 2,11,24, 2,11,14, 1,49,69, 2,11,12, 1,49,62, 2,11, 7,
+ 1,49,72, 2,11,20, 2,11, 1, 2,11, 3, 3,13,14, 4,13,57, 4, 9,78, 3,13,16,
+ 2,11, 6, 2,10,92, 2,11,19, 2,11,35, 1,49,67, 2,11, 8, 2,11,26, 3,13,13,
+ 2,10,94, 2,11,33, 2,11,34, 2,11,37, 2,11,28, 2,11,13, 2,11,21, 1,49,73,
+ 1,49,60, 1,49,68, 1,49,80, 1,49,57, 1,49,59, 3,13,17, 3,13,11, 3,13,26,
+ 2,11, 5, 1,49,77, 1,49,70, 2,11,31, 2,11, 2, 1,49,79, 1,49,74, 2,11,11,
+ 4, 9,77, 4,13,46, 1,49,78, 2,11,18, 2,11,10, 1,49,71, 2,11,30, 2,11,22,
+ 3,13,10, 1,49,65, 2,11,36, 2,11, 9, 1,49,61, 2,11,27, 2,11,17, 1,49,66,
+ 2,11,23, 1,49,58, 2,10,93, 1,49,75, 1,54, 7, 1,49,64, 2,11,16, 2,11,15,
+ 2,11, 4, 3, 9,49, 2,11,32, 3,13,20, 2,11,25, 0, 0, 0, 3,13,18, 1,49,56,
+ /* plane 0, page 104 */
+ 0, 255, /* first, last */
+ 3,13,25, 3,13,23, 0, 0, 0, 0, 0, 0, 6,17,82, 3,13,24, 3,69,11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3,69,10,15,11,40, 2,15,78, 1,54,14, 2,15,79, 3,17,61, 2,15,67, 1,54, 3,
+ 1,54,15, 3,17,55, 2,15,60, 3,17,51, 2,15,69, 2,15,77, 3,17,59, 2,15,59,
+ 2,15,86, 1,53,87, 3,17,62, 3,17,68, 3,17,48, 2,15,85, 2,15,80, 3,17,63,
+ 2,15,81, 1,54, 1, 1,54,12, 2,15,71, 3,17,54, 2,15,72, 2,15,82, 2,15,73,
+ 3,17,67, 2,15,68, 2,15,62, 2,15,63, 2,15,76, 2,15,70, 3,17,52, 3,17,47,
+ 1,53,88, 1,53,92, 2,15,84, 2,15,64, 1,54,10, 1,54, 6, 3,17,58, 4,13,53,
+ 1,54, 9, 1,54,16, 1,53,93, 1,54,11, 2,15,75, 1,54,13, 1,53,90, 3,17,57,
+ 1,53,89, 2,15,61, 4,13,47, 2,15,65, 1,54, 4, 2,15,83, 2,15,74, 2,15,66,
+ 1,54, 8, 1,54, 5, 3,13,15, 1,53,91, 1,53,94, 3,17,66, 3,17,56,15,16, 4,
+ 3,17,65, 3,17,64, 3,69,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,69,12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,22, 8, 3,22,53, 2,21,86, 2,21,87, 2,21,91,
+ 3,22,64, 2,22,12, 2,22, 9, 3,22,46, 2,22, 2, 2,22, 1, 1,59,19, 2,22, 5,
+ 2,22,20, 2,21,82, 3,22,59, 2,22,21, 2,22, 7, 2,22,25, 2,22,13, 1,59,18,
+ 2,22,11, 1,59,13, 1,59,34, 1,59,24, 3,22,55, 1,59,28, 1,59,27, 2,21,83,
+ 4,18,31, 2,22,18, 2,22,24, 2,22,16, 2,22,23, 0, 0, 0, 3,22,49, 2,22, 4,
+ 2,21,84, 2,22,22, 2,22, 6, 1,59,16, 1,59,29, 3,22,58, 2,22,15, 1,59,22,
+ 3,22,45, 3,22,60, 3,22,48, 2,22,14, 2,21,85, 1,59,30, 3,22,43, 1,59,32,
+ 2,22,17, 1,59,33, 1,59,15, 2,21,92, 2,22,19, 3,22,52, 3,20,88, 1,59,21,
+ 1,59,31, 2,21,94, 2,22,10, 2,21,89, 2,21,93, 1,59,26, 2,21,88, 1,59,14,
+ 1,59,23, 1,59,20, 2,22, 3, 1,54, 2, 2,28,67, 1,59,17, 3,22,44, 3,22,50,
+ 3,22,62, 3,22,63, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,21,55, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,22,54, 0, 0, 0, 3,28,37, 1,59,25, 3,28,33, 2,28,70, 2,28,92,
+ 2,28,81, 1,63,91, 3,28,24, 1,63,86, 2,28,64, 1,63,87, 2,28,80, 3,28,30,
+ 2,28,73, 2,28,86, 1,63,83, 2,28,46, 2,28,88, 1,63,73, 2,28,54, 1,63,76,
+ 1,63,75, 4,24,18, 1,63,92, 3,22,51, 2,28,48, 2,28,82, 2,28,83, 1,63,78,
+ 1,63,74, 2,28,62, 3,28,29, 1,63,85, 2,28,57, 3,28,18, 2,28,84, 1,63,81,
+ 2,28,76, 2,28,89, 2,28,51, 2,28,56, 2,28,50, 3,28,10, 1,63,80, 2,28,69,
+ 2,35,68, 2,28,52, 1,63,84, 2,28,61, 2,28,85, 1,63,79, 2,28,58, 2,28,55,
+ 2,28,72, 1,63,82, 1,63,72, 1,63,94, 2,28,75, 2,28,74, 3,28,17, 3,28,34,
+ /* plane 0, page 105 */
+ 0, 255, /* first, last */
+ 3,28,25, 3,28,27, 3,28,20, 3,28,15, 2,28,47, 1,63,77, 2,28,87, 2,28,63,
+ 2,28,65, 3,28,23, 2,28,78, 2,28,77, 2,28,45, 1,63,88, 1,63,90, 2,28,53,
+ 2,28,60, 2,28,68, 1,63,89, 2,28,59, 2,28,71, 2,28,90,15,27,80, 2,28,79,
+ 3,28,28, 0, 0, 0, 0, 0, 0,15,28, 1, 3,28,36, 0, 0, 0, 3,28,19, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,28,91, 0, 0, 0,15,28, 9,
+ 0, 0, 0, 3,69,15, 2,28,49,15,27,78, 3,69,14, 0, 0, 0, 3,28,32, 2,35,88,
+ 1,68,44, 3,33,69, 2,35,86, 2,35,65, 2,35,70, 2,35,63, 3,33,87, 2,35,82,
+ 2,35,49, 2,35,56, 4,29,81, 2,35,80, 2,35,90, 2,35,66, 3,33,72, 2,35,53,
+ 2,35,72, 2,35,77, 2,35,57, 3,33,75, 2,35,74, 2,35,54, 3,33,61, 3,33,85,
+ 2,35,61, 2,35,62, 1,68,46, 2,35,81, 2,35,79, 3,33,83, 2,35,50, 2,35,84,
+ 3,33,84, 2,35,85, 2,35,87, 1,68,50, 1,68,42, 3,33,79, 2,21,90, 2,35,58,
+ 2,35,76, 2,35,59, 1,68,39, 1,68,55, 2,35,83, 1,68,53, 1,68,49, 2,35,48,
+ 1,68,41, 3,33,89, 2,35,51, 1,68,54, 3,33,88, 2,35,67, 2,35,47, 3,33,86,
+ 1,68,47, 2,35,71, 2,35,55, 1,68,48, 2,35,64, 1,68,38, 1,63,93, 2,35,73,
+ 2,28,66, 2,35,52, 4,29,76, 3,33,77, 2,35,78, 1,68,43, 2,35,75, 1,68,40,
+ 2,35,69, 1,68,51, 2,35,60, 2,35,89, 3,33,74, 3,33,91, 0, 0, 0,15,34,41,
+ 15,34,39, 0, 0, 0, 1,68,45, 2,37,12, 0, 0, 0, 3,33,82, 1,68,52, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,34, 8, 0, 0, 0,15,34,28, 2,42,80, 2,42,78, 3,39,26,
+ 2,43, 6, 2,42,76, 3,39,29, 2,42,94, 1,68,37, 1,73, 8, 2,42,72, 2,43, 5,
+ 3,39,49, 2,42,77, 2,42,91, 1,73,13, 1,73, 6, 3,39,46, 2,43, 3, 3,39,38,
+ 2,42,70, 2,43, 2, 3,39,39, 1,73,24, 2,42,87, 2,43, 9, 1,73,22, 2,42,79,
+ 1,73, 7, 2,42,81, 2,43, 1, 1,73,16, 2,42,74, 1,73,20, 1,73,10, 2,42,83,
+ 2,42,73, 2,42,67, 3,39,30, 2,42,93, 1,73,17, 2,43, 8, 2,42,68, 1,73,14,
+ 4,35,87, 2,42,89, 4,35,89, 1,73,15, 2,42,75, 2,42,86, 2,42,82, 2,42,84,
+ 3,39,35, 1,73, 9, 2,43, 7, 1,73,23, 2,42,85, 3,39,27, 2,43,10, 4,36, 7,
+ 3,39,28, 2,42,69, 2,42,90, 1,73,12, 1,73,21, 1,73,19, 2,42,71, 2,42,92,
+ 1,73,18, 3,39,37, 3,39,40, 1,73,11, 2,42,88, 3,39,45, 3,39,36, 4,36, 8,
+ 3,44,52, 2,43, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,39,44, 2,48,92, 3,39,34, 2,48,88, 2,48,84, 2,49,10, 2,49, 7,
+ 1,77,23, 3,44,68, 3,44,64, 2,49,14, 2,48,91, 1,77,34, 2,49, 4, 3,44,47,
+ 3,44,49, 2,48,87, 2,49, 3, 1,77,31, 2,49,23, 4,42,29, 2,49,20, 2,49, 6,
+ 2,48,85, 3,44,63, 3,44,55, 2,49,11, 2,49,13, 1,77,27, 2,49, 1, 2,48,90,
+ /* plane 0, page 106 */
+ 0, 255, /* first, last */
+ 2,48,81, 1,77,24, 1,77,32, 4,42,40, 2,49,16, 1,77,33, 2,48,82, 2,49,22,
+ 2,49, 9, 2,49,15, 1,77,30, 3,44,45, 3,44,48, 2,49,12, 3,44,39, 2,49,19,
+ 3,44,59, 1,77,35, 3,44,54, 1,77,29, 2,49, 5, 2,48,86, 2,49,24, 2,48,83,
+ 2,49,17, 1,77,26, 3,44,42, 2,48,93, 3,44,41, 2,48,94, 1,77,25, 1,77,22,
+ 2,48,89, 1,77,28, 3,44,50, 1,77,21, 3,44,66, 2,49,18, 2,49,21, 2,49, 2,
+ 2,55,53, 3,44,62, 3,44,57,15,47,34, 3,44,65, 3,69,16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2,55,45, 3,49,12, 2,55,41, 1,81, 1, 3,49,28, 3,49,24,
+ 1,80,84, 1,80,89, 1,80,85, 2,55,55, 2,55,66, 1,80,83, 2,55,47, 2,55,56,
+ 2,49, 8, 2,55,57, 3,49, 8, 3,49,11, 1,80,90, 3,49,32, 2,55,72, 1,80,94,
+ 1,81, 3, 2,55,43, 3,49,27, 1,80,93, 3,49,17, 2,55,70, 2,55,71, 2,55,61,
+ 2,55,60, 2,55,52, 3,49, 9, 3,49,30, 2,55,62, 2,55,69, 2,55,68, 3,49,15,
+ 1,80,88, 1,80,86, 2,55,54, 2,55,51, 3,49,36, 2,55,48, 2,55,67, 1,81, 2,
+ 2,55,65, 1,80,92, 1,80,91, 3,49, 7, 2,55,59, 4,42,43, 2,55,42, 2,55,44,
+ 2,55,46, 2,55,64, 2,55,58, 1,80,87, 3,49,14, 2,55,49, 3,49,18, 2,55,63,
+ 3,49,33, 3,49,26,15,52,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,55,50, 3,69,17,
+ 15,53, 9, 0, 0, 0, 3,69,18, 0, 0, 0, 0, 0, 0, 3,52,85, 1,83,88, 2,61,17,
+ 1,83,81, 2,61, 2, 3,52,91, 2,61,13, 1,83,83, 2,61,20, 3,53, 1, 2,61, 9,
+ 3,52,92, 2,61, 4, 3,52,86, 4,54,37, 2,61,21, 2,60,94, 2,61,11, 3,53, 7,
+ 1,83,90, 2,61,16, 2,61,22, 2,61,10, 1,83,82, 2,61,12, 2,61, 1, 1,83,89,
+ 3,53, 3, 3,52,90, 2,61,19, 2,61, 6, 1,83,85, 3,53, 4, 2,61, 8, 2,61, 5,
+ 1,83,91, 2,61, 7, 1,83,84, 1,83,87, 2,61,15, 2,61, 3, 2,61,18, 3,52,88,
+ 2,61,14, 0, 0, 0, 3,53, 9, 3,55,84, 1,86,47, 2,65,83, 1,86,52, 1,86,53,
+ 3,55,87, 3,56, 1, 3,55,86, 1,86,46, 2,65,82, 3,55,88, 2,65,79, 2,65,80,
+ 1,86,50, 2,65,74, 2,65,78, 1,86,49, 3,55,94, 2,65,75, 3,55,89, 3,56, 3,
+ 3,55,93, 3,55,90, 1,86,51, 1,86,48, 3,56, 2, 2,65,73, 2,65,77, 2,65,81,
+ 3,55,91, 0, 0, 0, 3,69,19, 2,69,60, 2,69,57, 2,69,66, 3,58,36, 2,69,65,
+ 2,69,63, 2,69,58, 3,58,47, 1,88,31, 3,58,37, 3,58,46, 4,63,81, 3,58,39,
+ 3,58,45, 2,69,59, 1,88,30, 1,83,86, 2,69,62, 1,88,29, 2,69,67, 2,69,61,
+ 2,69,56, 2,65,76, 3,58,40, 3,58,38, 0, 0, 0, 1,88,28, 3,69,20, 2,69,55,
+ 2,73, 4, 3,60,41, 2,73, 3, 2,69,64, 1,89,83, 3,55,85, 2,73, 7, 2,73, 8,
+ 2,73, 2, 2,73, 6, 4,67,48, 2,73, 1, 3,60,39, 3,69,21, 4,67,46, 0, 0, 0,
+ 2,75,63, 2,73, 5, 1,90,82, 1,90,80, 2,75,61, 3,62,21, 3,62,20, 3,62,19,
+ /* plane 0, page 107 */
+ 0, 255, /* first, last */
+ 2,75,64, 3,62,23, 2,75,60, 2,75,62, 1,90,81, 0, 0, 0, 3,63,47, 3,63,46,
+ 2,77,51, 2,77,52, 1,91,66, 2,77,50,15,73,44, 3,69,22, 3,69,23, 2,79,17,
+ 1,92,27, 2,79,15, 2,79,16, 2,80,26, 3,64,84,15,75,49, 1,93, 3, 2,81, 3,
+ 2,81, 1, 2,81, 2, 2,81, 4, 3,65,32, 3,65,69, 3,65,33, 2,82,11, 0, 0, 0,
+ 1,37,46, 1,40,25, 3, 3,89, 1,46,28, 4, 6,81, 2, 7,42, 3, 9,51, 3, 9,52,
+ 2,11,38, 4, 9,82, 3,13,28, 3,17,70, 2,15,87, 2,15,89, 3,17,69, 2,15,88,
+ 3,17,71, 2,15,90, 1,59,35, 2,22,27, 2,15,91, 3,22,66, 2,22,26, 2,22,28,
+ 2,22,29, 2,28,93, 1,64, 2, 2,28,94, 2,29, 2, 1,64, 3, 1,64, 1, 2,29, 1,
+ 3,33,93, 2,36, 2, 2,35,94, 2,35,93, 3,33,92, 2,35,92, 2,35,91, 1,68,56,
+ 2,36, 1, 1,73,25, 2,43,11, 2,43,13, 1,73,26, 2,43,12, 1,77,37, 3,44,70,
+ 1,77,36, 2,49,25, 3,44,69, 3,44,71, 2,55,74, 2,55,73, 2,55,75, 3,49,38,
+ 3,49,37, 1,81, 4,15,53,25, 2,61,23, 1,83,92, 3,53,11, 2,65,84, 1,86,54,
+ 2,69,68, 1,91,67, 1,37,47, 1,38,63, 1,40,26, 1,42,67, 1,46,29, 1,46,30,
+ 3, 9,53, 3, 9,54, 1,49,81, 3,13,29, 3,17,72, 2,15,92, 3,28,41, 3,28,39,
+ 4,36,13, 3,33,94, 1,68,57, 3,34, 1, 3,39,51, 4,42,46, 2,50,57, 1,81, 5,
+ 1,86,55, 1,37,48, 3, 2,51, 1,40,27, 0, 0, 0, 4, 6,86, 2, 7,44, 1,46,31,
+ 2, 7,43, 3, 9,56, 2,11,39, 1,49,82, 2,11,40, 5, 9,73, 1,49,83, 0, 0, 0,
+ 2,15,94, 1,54,18, 1,54,17, 3,17,74, 2,22,34, 2,22,32, 2,22,33, 2,22,31,
+ 3,22,68, 2,22,30, 0, 0, 0, 0, 0, 0, 2,29, 3, 2,29, 6, 1,64, 5, 2,29, 4,
+ 1,64, 4, 2,29, 5, 0, 0, 0, 2,36, 3, 3,34, 2, 4,36,17, 2,43,14, 2,43,15,
+ 2,43,16, 3,39,52, 2,49,28, 2,49,27, 1,77,38, 2,49,26, 2,49,29, 2,55,76,
+ 4,48,77, 5,59,82, 2,55,77, 2,55,78, 4,54,50, 2,61,24, 1,83,93, 1,86,56,
+ 2,69,69, 0, 0, 0, 1,90,83, 2, 1,31, 3, 9,57, 1,49,84, 2,11,41, 1,54,19,
+ 4,18,46, 4,18,48, 1,59,36, 3,22,69, 1,64, 6, 2,29, 7, 3,28,43, 1,68,59,
+ 1,68,58, 3,34, 6, 0, 0, 0, 2,43,17, 2,43,18, 1,77,39, 1,77,40, 2,55,80,
+ 2,55,79, 2,65,85, 2,79,18, 1,37,49, 2, 1,32, 1,38,64, 3, 3,90, 1,42,68,
+ 2, 4,40, 3, 9,58, 1,49,85, 1,68,60, 1,37,50, 0, 0, 0, 2,11,42, 1,49,86,
+ 2,11,43, 0, 0, 0, 1,83,94, 1,37,51, 3,69,24, 3,69,25, 2, 7,45, 0, 0, 0,
+ 2,11,44, 3,13,34, 2,16, 5, 2,16, 4, 2,16, 2, 3,17,78, 2,16, 1, 2,16, 6,
+ 2,16, 3, 3,17,76, 3,17,77, 1,59,37, 1,59,38, 3,22,70, 0, 0, 0, 1,64, 7,
+ 2,29, 8, 4,24,46, 2,29, 9, 2,29,10, 3,28,45,15,28,28, 3,69,26, 2,36, 7,
+ 2,36, 8, 2,36, 6, 3,34, 8, 2,36, 4, 2,36, 5, 1,68,61, 2,43,19, 2,49,32,
+ /* plane 0, page 108 */
+ 0, 255, /* first, last */
+ 2,49,31, 2,49,30, 2,49,33, 2,55,82, 2,55,81, 1,81, 6, 2,55,83, 0, 0, 0,
+ 1,84, 1, 2,61,25, 3,53,13, 2,65,86, 2,69,70, 2,77,53, 0, 0, 0, 1,37,52,
+ 1,38,66, 1,38,65, 4, 3, 1, 1,46,32, 2, 1,33, 2, 1,63, 1,40,28, 0, 0, 0,
+ 2, 2,56, 2, 4,41, 2, 4,42, 1,46,33, 3, 9,61, 2, 7,46, 3,69,27, 1,49,87,
+ 2,11,45, 2,11,46, 0, 0, 0, 1,54,20, 1,54,24, 2,16, 7, 1,54,23, 1,54,21,
+ 1,54,22, 0, 0, 0, 2,22,35, 1,59,39, 1,64,10, 3,28,46, 1,64, 8, 1,64, 9,
+ 2,29,11, 3,34, 9, 3,34,10, 1,73,27, 1,37,53, 0, 0, 0, 2, 1,64, 3, 2,55,
+ 1,38,67, 3, 2,52, 0, 0, 0, 2, 1,67, 3, 4, 1, 0, 0, 0, 1,38,70, 2, 1,66,
+ 1,38,69, 1,38,68, 1,42,69, 2, 1,65, 3, 2,56, 3, 2,57, 2, 2,57, 0, 0, 0,
+ 0, 0, 0,15, 1,70, 2, 2,61, 2, 2,63, 2, 2,64, 1,40,38, 1,40,39, 2, 2,60,
+ 1,40,34, 3, 3,93, 2, 2,58, 3, 4, 5, 2, 2,62, 1,40,35, 3, 6,53, 1,40,30,
+ 3, 3,92, 1,40,31, 3, 4, 3, 1,40,37, 2, 2,59, 1,40,29, 1,42,70, 1,40,32,
+ 1,40,33, 1,40,36,15, 2,61, 3,69,28, 0, 0, 0, 2, 4,59, 2, 4,57, 2, 4,44,
+ 1,42,82, 2, 4,51, 1,42,77, 2, 4,45, 3, 9,68, 2, 4,53, 3, 6,48, 2, 4,50,
+ 1,42,80, 2, 4,49, 1,42,87, 2, 4,58, 1,42,89, 3, 6,51, 1,42,91, 3, 3,94,
+ 2, 4,43, 3, 6,55, 1,42,78, 2, 4,60, 3, 6,49, 1,42,85, 1,42,88, 3, 6,44,
+ 2, 7,69, 1,42,72, 1,43, 1, 1,42,86, 2, 4,46, 1,42,75, 1,42,90, 2, 4,54,
+ 1,42,73, 1,42,74, 2, 7,67, 2, 4,47, 1,42,81, 1,42,92, 2, 4,61, 2, 4,48,
+ 1,42,79, 3, 6,45, 1,42,84, 2, 7,47, 1,42,93, 2, 4,55, 1,42,83, 3, 9,67,
+ 1,42,94, 1,42,71, 2, 4,52, 1,42,76, 2, 4,56, 2, 7,68, 3, 6,46, 3, 6,50,
+ 3, 6,60, 3, 6,57, 3, 6,54,15, 4,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 6,59, 1,46,45, 1,46,61, 2, 7,54, 1,46,52, 3,13,46,
+ 2, 7,75, 1,46,37, 3, 9,75, 1,46,40, 2, 7,66, 4, 7, 6, 2, 7,52, 2, 7,56,
+ 1,46,48, 1,46,50, 2, 7,59, 1,46,57, 1,46,43, 1,46,41, 1,46,42, 1,46,56,
+ 2, 7,71, 1,46,51, 2, 7,58, 2, 7,60, 1,46,49, 1,46,54, 2, 7,61, 2, 7,74,
+ 3, 9,77, 1,49,88, 1,46,60, 4, 6,93, 1,46,38, 2, 7,73, 3, 9,76, 2, 7,77,
+ 2, 7,57, 2, 7,79, 2, 7,64, 1,46,47, 2, 7,53, 1,46,46, 1,46,64, 1,46,53,
+ 3, 9,74, 2, 7,51, 2,11,55, 1,46,59, 1,46,63, 2, 7,65, 2, 7,70, 3, 9,69,
+ 1,46,65, 1,46,58, 1,46,44, 1,46,34, 3, 9,73, 1,46,39, 4, 6,91, 2, 7,55,
+ 1,46,35, 2, 7,78, 3, 9,71, 2, 7,49, 2, 7,48, 2, 7,62, 2, 7,50, 1,46,62,
+ 1,54,25, 1,46,55, 2, 7,63, 1,46,36, 3,13,47, 1,50, 9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 7,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,13,38,
+ /* plane 0, page 109 */
+ 0, 255, /* first, last */
+ 2,11,62, 2,11,65, 3,13,48, 2,11,68, 2,11,57, 3,13,40, 3,13,42, 2,11,71,
+ 2,11,74, 2,11,76, 2,11,54, 1,49,89, 1,49,94, 2,16,12, 1,50,16, 2,11,69,
+ 2,11,77, 2,11,61, 2,11,53, 3,13,41, 3,13,39, 3,13,45, 2,16,39, 1,50, 3,
+ 2,11,66, 2,11,58, 2,11,60, 1,50, 8, 3,17,90, 2,11,63, 1,50, 2, 2,11,50,
+ 2,11,72, 3,13,43, 2,11,75, 3,13,37, 3,13,55, 1,49,93, 3,13,51, 1,50,11,
+ 2,11,47, 1,50,13, 1,49,91, 1,50,17, 2,11,73, 2,11,49, 1,50,14, 2,16,33,
+ 2, 7,72, 1,50, 1, 1,49,90, 2,11,56, 2,11,48, 1,50,15, 1,50, 7, 2,11,67,
+ 1,50,12, 1,50,10, 2,11,59, 1,50, 4, 2,11,51, 1,50, 5, 1,50, 6, 2,11,52,
+ 2,11,70, 1,49,92, 2,11,64, 4,10, 1, 3,13,53, 3,13,49, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,17,87, 3,17,83,
+ 2,16,15, 1,54,33, 1,54,38, 3,17,89, 3,18, 6, 3,17,86, 2,16,24, 2,16,30,
+ 2,16,26, 2,16,13, 2,16,16, 2,16, 9, 2,16,10, 1,54,45, 1,54,30, 2,16,25,
+ 2,16,34, 1,54,40, 1,54,26, 3,17,79, 1,54,35, 2,16,17, 1,54,37, 2,16,18,
+ 2,16,28, 3,18, 2, 3,18, 5, 3,17,82, 1,54,39, 2,16,43, 2,16,11, 1,54,32,
+ 1,54,31, 1,54,43, 2,16, 8, 2,16,41, 2,16,29, 2,16,42, 2,16,36, 2,16,22,
+ 2,16,37, 3,18, 1, 2,16,31, 2,16,40, 2,16,38, 1,54,44, 2,16,23, 1,54,29,
+ 1,54,28, 1,54,36, 1,54,42, 2,16,35, 1,54,41, 2,16,20, 1,59,40, 3,17,88,
+ 2,16,44, 2,16,19, 2,16,14, 1,54,34, 1,54,46, 1,54,27, 3,18, 7, 2,16,27,
+ 2,16,32, 3,17,93, 3,17,91, 3,17,92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,69,29, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1,59,74, 2,22,37, 2,22,41, 3,22,79, 1,59,55, 1,59,53,
+ 3,22,90, 3,23, 1, 1,59,44, 2,22,39, 2,22,38, 1,59,64, 3,28,48, 2,22,44,
+ 1,59,58, 3,22,82, 2,22,62, 2,22,74, 1,59,41, 2,22,59, 2,22,52, 1,59,76,
+ 2,22,36, 3,22,74, 2,22,64, 3,22,75, 1,59,73, 1,59,61, 1,59,72, 1,59,51,
+ 2,22,48, 2,22,66, 2,22,58, 1,59,52, 1,59,46, 2,22,72, 3,22,76, 2,22,65,
+ 2,22,67, 1,59,54, 1,59,62, 2,22,69, 2,22,46, 2,22,63, 2,22,51, 2,22,71,
+ 1,59,67, 1,59,43, 1,59,65, 2,22,56, 2,22,54, 2,22,55, 1,59,56, 2,22,50,
+ 2,22,49, 1,59,45, 2,22,43, 2,22,73, 1,59,47, 2,22,53, 1,59,77, 3,22,84,
+ 1,59,71, 2,22,42, 1,59,68, 1,59,66, 1,59,75, 2,22,60, 1,59,70, 2,16,21,
+ 2,22,61, 1,59,69, 2,22,68, 1,59,42, 2,22,57, 1,59,60, 2,22,45, 1,59,59,
+ 3,22,92, 1,59,57, 1,59,49, 1,59,48, 2,29,12, 2,22,70, 3,28,61, 3,23, 8,
+ /* plane 0, page 110 */
+ 0, 255, /* first, last */
+ 2,22,47, 3,23, 6, 3,23, 3, 2,29,33, 3,22,80, 1,59,50, 3,22,87, 3,23, 4,
+ 3,22,86, 3,23, 5, 3,22,89, 4,18,77, 3,22,93, 0, 0, 0, 0, 0, 0, 3,69,30,
+ 0, 0, 0, 0, 0, 0, 3,23, 9, 0, 0, 0, 0, 0, 0,15,22, 9, 0, 0, 0, 3,23, 7,
+ 3,28,52, 1,64,39, 1,59,63, 1,64,21, 2,29,27, 1,64,35, 3,28,50, 2,29,15,
+ 1,64,18, 1,64,14, 2,29,45, 1,64,20, 1,64,24, 1,64,19, 1,64,28, 2,29,49,
+ 2,29,40, 3,28,75, 3,28,77, 2,29,22, 1,64,33, 1,64,27, 2,29,34, 1,64,11,
+ 2,29,46, 2,29,39, 1,64,15, 2,29,28, 1,64,30, 2,29,57, 2,29,58, 4,24,59,
+ 1,64,12, 2,29,44, 1,64,32, 2,29,32, 2,29,18, 2,29,19, 1,64,36, 2,29,23,
+ 2,29,30, 2,29,24, 3,28,58, 1,64,34, 1,64,42, 2,29,20, 2,29,13, 2,29,14,
+ 3,28,54, 2,29,16, 1,64,17, 2,29,29, 3,28,78, 1,64,31, 1,64,40, 3,28,56,
+ 3,28,73, 2,29,31, 2,29,55, 2,29,47, 1,64,13, 2,29,53, 1,64,25, 3,28,70,
+ 1,64,23, 3,28,68, 2,29,59, 1,64,22, 2,29,37, 2,29,25, 2,29,35, 1,64,45,
+ 2,29,41, 2,29,38, 2,29,21, 1,64,41, 2,29,51, 2,29,48, 2,29,56, 1,64,16,
+ 2,29,36, 1,64,44, 3,28,59, 2,29,43, 3,34,26, 3,28,64, 1,64,26, 1,64,29,
+ 3,28,60, 2,29,42, 1,64,43, 2,29,26, 2,22,40, 3,28,49, 3,28,76, 2,29,52,
+ 2,29,50, 2,29,54,15,28,61, 3,28,66, 3,69,34, 4,24,62, 3,28,67, 0, 0, 0,
+ 3,28,72, 0, 0, 0,15,28,39, 0, 0, 0, 3,69,32, 0, 0, 0, 4,24,63, 0, 0, 0,
+ 2,29,17, 1,64,38, 3,69,31, 3,69,33, 0, 0, 0, 2,36,39, 2,36,38, 2,36,12,
+ 1,68,67, 3,34,16, 2,36,37, 2,36,15, 2,36,16, 4,30,31, 1,68,77, 2,36,46,
+ 1,68,72, 2,36,36, 3,34,19, 2,36, 9, 1,68,78, 1,68,68, 2,36,24, 2,36,14,
+ 2,36,17, 2,36,41, 1,68,62, 2,36,48, 2,36,40, 1,68,71, 2,36,29, 1,68,82,
+ 3,34,14, 3,34,22, 1,68,81, 1,68,75, 3,34,32, 4,30,22, 2,36,47, 1,68,63,
+ 2,36,27, 2,36,18, 2,36,31, 2,36,43, 1,68,83, 3,34,25, 1,68,65, 2,36,26,
+ 3,34,13, 2,36,19, 1,68,74, 3,34,17, 1,68,73, 2,36,22, 2,36,32, 2,36,42,
+ 2,36,13, 2,36,23, 1,68,66, 2,36,33, 1,68,79, 1,68,70, 2,36,20, 1,68,69,
+ 2,36,11, 2,36,25, 2,36,45, 1,64,37, 1,73,55, 2,36,28, 2,43,20, 2,36,30,
+ 2,36,44, 1,68,76, 2,36,21, 1,68,64, 1,68,80, 1,77,58, 2,36,10, 6,52,46,
+ 2,36,35, 3,34,36, 3,34,30, 3,34,39, 2,36,34, 3,34,29, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,34,37, 0, 0, 0, 0, 0, 0, 3,34,31, 0, 0, 0,
+ 3,34,27, 3,34,38, 0, 0, 0, 2,43,48, 1,73,52, 2,43,37, 2,43,42, 1,73,41,
+ 3,39,54, 2,43,22, 1,73,54, 3,39,55, 1,73,32, 2,43,21, 2,43,54, 1,73,56,
+ 2,43,25, 2,43,41, 3,39,69, 2,43,27, 2,43,57, 2,43,53, 1,73,30, 1,73,40,
+ /* plane 0, page 111 */
+ 0, 255, /* first, last */
+ 2,49,59, 1,73,53, 1,73,38, 2,43,23, 3,39,67, 2,43,52, 1,73,42, 2,43,49,
+ 2,43,62, 2,43,29, 2,43,38, 3,44,88, 3,39,59, 2,43,60, 2,43,50, 1,73,37,
+ 3,44,74, 3,39,68, 2,43,36, 1,73,31, 1,73,29, 1,73,47, 4,36,35, 3,39,63,
+ 2,43,34, 2,43,31, 2,43,32, 3,39,58, 2,43,56, 3,39,60, 2,43,61, 2,43,59,
+ 1,73,35, 2,43,63, 1,73,39, 1,73,46, 4,36,36, 2,43,24, 2,49,35, 2,43,33,
+ 3,39,62, 1,73,33, 1,73,51, 1,73,48, 1,73,36, 2,43,43, 2,43,28, 1,73,49,
+ 2,43,45, 1,73,43, 1,73,45, 1,73,28, 3,39,61, 2,43,47, 2,43,39, 2,43,26,
+ 1,73,44, 2,43,55, 2,43,58, 2,43,35, 2,43,46, 3,44,84, 1,73,34, 1,77,41,
+ 2,43,44, 2,49,34, 3,39,66, 2,43,51, 3,39,65, 4,36,50,15,47,89, 0, 0, 0,
+ 3,69,36, 3,69,37, 3,39,70, 0, 0, 0, 3,69,35, 0, 0, 0, 2,43,30, 2,49,44,
+ 2,49,54, 1,77,44, 2,49,53, 2,49,65, 1,77,46, 2,49,51, 4,42,56, 2,49,55,
+ 1,77,57, 3,44,93, 2,49,46, 1,77,49, 3,44,83, 2,49,58, 2,55,91, 1,77,61,
+ 1,77,60, 2,49,60, 2,49,43, 2,49,70, 1,77,55, 3,44,75, 1,77,45, 2,49,63,
+ 4,42,73, 2,49,67, 2,49,72, 2,49,61, 2,49,49, 1,77,48, 1,77,51, 1,77,59,
+ 1,77,54, 3,44,85, 2,49,52, 2,43,40, 3,44,94, 3,44,76, 2,49,48, 2,49,71,
+ 1,77,50, 3,44,89, 1,77,53, 2,49,73, 1,77,42, 2,49,62, 2,49,36, 2,49,68,
+ 1,84,10, 3,44,90, 2,49,50, 4,48,85, 1,77,43, 2,49,45, 1,77,47, 2,49,37,
+ 1,73,50, 2,49,41, 4,42,55, 2,49,66, 2,49,42, 2,49,40, 1,77,52, 3,44,91,
+ 2,49,64, 3,44,87, 2,49,39, 2,49,57, 2,49,56, 2,49,69, 2,49,47, 1,77,56,
+ 4,42,68, 3,69,39,15,47,93, 0, 0, 0, 0, 0, 0, 3,69,38, 2,55,94, 3,49,54,
+ 1,81,19, 1,81, 9, 2,56,12, 2,55,86, 1,81,11, 2,56, 4, 1,81,18, 1,81,13,
+ 2,56, 2, 2,61,27, 2,56, 8, 2,56,14, 2,56, 7, 2,55,84, 2,56, 5, 2,56,16,
+ 2,56,18, 1,81, 8, 2,56,17, 1,81,14, 1,81,20, 3,49,52, 1,81,17, 3,49,56,
+ 2,56,11, 1,81,16, 2,56, 6, 3,49,45, 2,55,88, 2,55,93, 3,49,48, 2,56,10,
+ 1,81,15, 1,81,12, 1,81, 7, 1,81,10, 2,55,92, 4,49, 2, 2,49,38, 2,55,87,
+ 2,55,90, 2,56,13, 2,56, 1, 2,55,85, 2,61,26, 2,56,15, 2,55,89, 2,56, 9,
+ 3,44,81, 0, 0, 0, 0, 0, 0, 3,49,53, 2,61,29, 1,84,14, 3,53,16, 3,53,15,
+ 1,84, 2, 3,53,21, 3,53,22, 1,84, 6, 2,61,31, 2,61,37, 2,61,35, 1,84, 4,
+ 1,84, 5, 1,84,12, 2,61,38, 2,61,30, 1,84, 7, 3,53,17, 2,61,34, 2,61,33,
+ 2,61,39, 1,84,13, 3,53,23, 1,84, 8, 1,84,11, 2,61,32, 1,84,15, 1,84, 9,
+ 1,84,16, 1,84, 3, 2,61,36, 3,58,53, 2,61,28, 3,49,57, 3,53,25, 2,66, 5,
+ 3,69,40, 0, 0, 0, 1,86,61, 2,66, 2, 2,66, 4, 3,56, 8, 1,86,59, 2,65,94,
+ /* plane 0, page 112 */
+ 0, 255, /* first, last */
+ 2,66, 1, 2,65,90, 3,56,10, 3,56, 7, 2,56, 3, 2,65,91, 1,86,60, 2,65,87,
+ 3,56, 6, 1,86,57, 2,66, 6, 1,86,58, 2,65,88, 2,65,89, 2,65,93, 1,86,63,
+ 3,56, 9, 1,86,62, 4,59,62, 3,56,11, 2,65,92, 1,88,37, 2,69,74, 2,69,80,
+ 1,88,38, 2,69,71, 1,88,35, 1,88,32, 2,69,82, 1,88,36, 3,58,50, 1,88,33,
+ 2,69,73, 2,69,76, 2,69,77, 2,69,78, 2,69,81, 3,58,52, 2,66, 3, 2,69,72,
+ 1,88,34, 2,69,79, 2,73,20, 2,69,75, 3,58,51, 3,69,42, 3,69,41, 2,73,11,
+ 1,89,85, 2,73,14, 1,89,86, 2,73,23, 2,73,13, 2,73,10, 3,60,49, 2,73,12,
+ 2,73,16, 2,73,19, 2,73,18, 2,73,22, 2,73, 9, 3,60,47, 1,89,84, 2,73,17,
+ 2,73,21, 2,73,24, 2,73,15, 2,75,65, 2,75,66, 2,75,70, 2,75,71, 3,62,28,
+ 2,75,68, 2,75,69, 2,75,67, 3,62,26, 1,90,84, 3,62,27, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1,91,68, 2,77,57, 3,64,22, 3,63,50, 2,77,54, 2,77,55, 2,77,56,
+ 1,91,69, 3,64,23, 2,79,20, 2,79,19, 3,69,43, 2,80,29, 1,92,64, 2,80,27,
+ 2,80,30, 2,80,28, 2,81, 5, 1,93, 4, 1,93,18, 2,81,81, 2,81,59, 3,65,89,
+ 2,81,80, 2,82,30, 2,82,31, 1,37,54, 4, 1,48, 0, 0, 0, 3, 4, 8, 3, 4, 6,
+ 1,40,40, 2, 2,65, 3, 4, 7, 3, 4,11, 2, 4,62, 3, 6,66, 1,43, 2, 3, 6,63,
+ 1,43, 5, 3, 6,62, 2, 4,63, 3, 6,67, 1,43, 3, 1,43, 4, 3, 6,64,15, 4,81,
+ 0, 0, 0, 3, 9,87, 2, 7,88, 2, 7,90, 2, 7,85, 2, 7,82, 2, 7,84, 3, 9,84,
+ 3, 9,80, 3, 9,85, 1,46,69, 3, 9,79, 3, 9,89, 3, 9,86, 1,46,67, 3, 9,82,
+ 3, 9,81, 2, 7,86, 1,46,68, 2, 7,83, 2, 7,80, 1,46,66, 2, 7,87, 4, 7, 9,
+ 2, 7,81, 1,46,70, 2, 7,89, 4, 7,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,11,79,
+ 3,13,62, 2,11,83, 3,13,60, 3,13,58, 1,50,26, 3,13,56, 4,10, 6, 3,13,69,
+ 3,13,66, 2,11,86, 3,13,63, 1,50,18, 1,50,21, 1,50,23, 1,50,25, 1,50,22,
+ 2,11,82, 2,11,81, 3,13,68, 1,50,20, 2,11,84, 2,11,85, 3,13,67, 2,11,78,
+ 1,50,24, 3,13,72, 1,50,19, 3,13,61, 0, 0, 0, 0, 0, 0, 2,11,80, 3,69,45,
+ 4,10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,18, 8, 2,16,58, 2,16,59, 2,16,60,
+ 1,54,51, 4,13,85, 1,54,47, 2,16,49, 3,18,10, 2,16,57, 2,16,62, 1,54,52,
+ 3,18,11, 2,16,47, 2,16,53, 2,16,46, 2,16,56, 3,18,17, 3,18,15, 2,16,52,
+ 1,54,48, 1,54,50, 2,16,61, 3,18, 9, 2,16,45, 2,16,48, 2,16,54, 3,18,13,
+ 2,16,55, 2,16,63, 2,16,51, 3,18,12, 1,54,49, 3,69,47, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,69,46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,18,16, 1,59,82,
+ 2,22,81, 3,23,16, 3,23,18, 2,22,83, 2,22,79, 3,23,15, 2,22,91, 2,22,77,
+ 2,22,90, 1,59,78, 2,22,75, 2,29,63, 2,22,85, 1,59,81, 3,23,21, 2,22,86,
+ /* plane 0, page 113 */
+ 0, 255, /* first, last */
+ 2,22,89, 3,23,14, 2,22,93, 3,23,12, 2,22,82, 4,18,82, 2,22,87, 3,23,13,
+ 3,23,17, 1,59,79, 1,59,80, 2,22,92, 2,22,80, 2,22,76, 2,22,94, 3,23,19,
+ 2,22,84, 3,69,48, 3,69,49, 2,22,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,22,78,
+ 0, 0, 0, 1,64,46, 1,64,47, 2,29,73, 1,64,53, 3,28,84, 2,29,61, 2,29,70,
+ 2,29,60, 1,64,50, 2,29,68, 2,29,66, 3,28,93, 2,29,67, 1,64,48, 3,28,92,
+ 2,29,71,15,28,94, 3,28,79, 3,28,90, 3,28,82, 3,29, 1, 2,29,64, 2,29,62,
+ 1,64,49, 2,29,65, 2,29,69, 3,28,91, 3,28,89, 3,28,81, 1,64,51, 3,28,83,
+ 3,28,87, 3,69,51, 2,29,72, 3,69,52, 0, 0, 0, 3,69,53, 0, 0, 0, 3,69,50,
+ 0, 0, 0, 2,36,54, 2,36,61, 2,36,63, 2,36,69, 3,34,55, 1,69, 2, 2,36,49,
+ 3,34,44, 1,68,88, 3,34,46, 2,36,64, 1,68,93, 2,36,70, 1,68,84, 3,34,49,
+ 2,36,67, 3,34,56, 2,36,51, 2,36,68, 2,36,50, 0, 0, 0, 1,69, 4, 3,34,50,
+ 2,36,62, 1,68,85, 2,36,71, 3,40,28, 1,68,90, 2,36,55, 1,69, 1, 2,36,66,
+ 2,36,53, 2,36,60, 2,36,56, 2,36,52, 1,68,87, 1,68,94, 1,68,92, 1,68,89,
+ 1,69, 3, 1,68,86, 2,36,59, 3,34,47, 1,68,91, 3,34,57, 1,64,52, 3,34,41,
+ 2,36,65, 3,69,57, 2,36,57, 0, 0, 0, 3,34,51, 3,69,55, 3,69,56, 3,69,54,
+ 2,36,58, 4,36,55, 4,36,59, 2,43,71, 3,39,79, 1,73,59, 3,39,78, 3,39,76,
+ 2,43,67, 2,43,73, 2,43,69, 3,39,80, 1,73,61, 2,43,68, 2,43,72, 2,43,64,
+ 3,39,82, 2,43,66, 1,73,60, 3,39,74, 3,39,77, 3,39,75, 3,39,72, 2,43,70,
+ 2,43,65, 3,39,71, 1,73,62, 3,69,59, 1,73,57,15,41,43, 3,69,58, 2,43,74,
+ 15,41,63, 1,73,58, 2,49,79, 2,49,76, 2,49,88, 2,49,82, 2,49,84, 1,77,62,
+ 2,49,78, 2,49,86, 3,45,10, 3,45, 4, 2,49,85, 2,49,83, 3,45, 9, 2,49,89,
+ 1,77,65, 2,49,80, 2,49,87, 3,45, 8, 1,77,63, 3,45, 5, 3,45, 2, 2,49,75,
+ 2,49,77, 1,77,64, 2,49,74, 2,49,90, 3,69,60, 2,49,81, 3,49,66, 3,49,58,
+ 2,56,22, 1,81,27, 3,49,64, 3,49,60, 2,56,33, 2,56,31, 1,81,21, 2,56,21,
+ 2,56,24, 2,56,25, 2,56,20, 1,81,31, 1,81,32, 2,56,19, 2,56,34, 2,56,29,
+ 1,81,25, 1,81,22, 2,56,28, 2,56,26, 3,49,67, 4,49, 3, 1,81,28, 2,56,30,
+ 1,81,23, 3,49,62, 1,81,24, 3,49,70, 2,56,27, 1,81,26, 2,56,23, 7,15,47,
+ 2,56,32, 1,81,29, 2,56,35, 2,56,36, 1,81,30, 3,69,61, 3,69,62, 1,84,18,
+ 1,84,25, 2,61,40, 2,61,46, 3,53,28, 2,61,44, 1,84,21, 1,84,20, 1,84,17,
+ 2,61,42, 3,53,30, 3,53,35, 3,53,32, 1,84,23, 1,84,22, 1,84,19, 3,53,33,
+ 2,61,45, 2,61,41, 2,61,43, 3,53,34, 1,84,24,15,58,83, 0, 0, 0, 0, 0, 0,
+ 1,86,67, 2,66, 9, 3,56,13, 1,86,64, 1,86,65, 2,66,11, 1,86,66, 2,66, 8,
+ /* plane 0, page 114 */
+ 0, 255, /* first, last */
+ 3,56,14, 2,66, 7, 2,69,86, 2,66,10, 3,58,54, 2,69,87, 1,88,39, 2,69,85,
+ 3,58,55, 4,63,94, 2,69,84, 3,60,57, 2,69,83, 1,88,40, 3,69,63, 3,60,54,
+ 1,89,87, 3,60,56, 3,60,53, 2,73,25, 2,73,26, 3,58,56, 3,60,51, 3,60,55,
+ 3,69,65, 2,75,74, 2,75,73, 1,90,85, 3,63,51, 2,75,72, 2,77,58, 2,77,59,
+ 3,63,52, 3,64,25, 2,79,21, 2,80,31, 3,65,35, 3,65,34, 2,81, 6, 2,82,12,
+ 1,93,38, 2,82,32, 1,37,55, 4, 1,49, 1,46,71, 1,46,72, 3,13,73, 4,10,10,
+ 1,50,27, 0, 0, 0, 3,29, 2, 0, 0, 0, 4,42,76, 1,84,26, 1,37,56, 0, 0, 0,
+ 1,46,73, 1,54,53, 1,69, 5, 1,37,57, 3,13,75, 1,59,83, 1,73,63, 2, 1,34,
+ 3, 9,92, 2,11,87, 2,16,64, 4,30,44, 2,43,75, 4,42,77, 1,84,27, 1,37,58,
+ 1,46,74, 2,11,88, 2,11,89, 2,29,74, 1,64,54, 0, 0, 0, 3,34,61, 2,36,72,
+ 3,34,60, 3,34,59, 1,69, 6, 2,43,76, 4,36,62, 3,45,14, 1,77,66, 3,45,13,
+ 1,88,41, 1,37,59, 2,29,75, 1,37,60, 0, 0, 0, 1,40,42, 2, 2,66, 1,40,41,
+ 1,43, 8, 1,43, 7, 1,43, 6, 2, 4,64, 3, 6,68, 3,10, 1, 3,10, 2, 1,46,75,
+ 3,10, 3, 1,46,76, 2, 7,91, 4, 7,17, 2,11,90, 3,13,77, 2,11,93, 1,50,29,
+ 2,11,91, 4,10,15, 1,50,28, 2,11,92, 1,50,30, 0, 0, 0, 2,16,67, 2,16,66,
+ 2,16,65, 1,54,54, 3,18,22, 2,23, 2, 2,23, 3, 1,59,84, 2,23, 1, 2,23, 4,
+ 1,64,56, 1,59,85, 3,29, 4, 3,29, 3, 1,64,55, 2,29,79, 2,29,78, 3,29, 5,
+ 2,29,76, 2,29,77, 0, 0, 0, 2,29,80, 2,36,74, 2,36,73, 2,36,77, 4,30,47,
+ 2,36,76, 2,36,75, 1,73,64, 2,43,79, 3,39,85, 2,43,78, 1,73,65, 2,43,77,
+ 2,49,91, 3,45,15, 2,49,92, 1,77,67, 4,49,13, 2,56,37, 2,56,38, 5,46,23,
+ 0, 0, 0, 2,69,92, 1,88,42, 2,69,91, 2,69,90, 2,69,88, 2,69,89, 1,90,86,
+ 2,73,27, 2,77,60, 2,81, 7, 3,65,91, 1,37,61, 4, 1,24, 2, 1,68, 1,38,71,
+ 2, 1,69, 3, 4,12, 3, 4,13, 4, 3, 7, 2, 2,67, 2, 2,68, 3, 6,75, 0, 0, 0,
+ 0, 0, 0, 3, 6,73, 2, 4,70, 3, 6,70, 3, 6,71, 2, 4,66, 3, 6,74, 2, 4,65,
+ 1,46,77, 2, 4,69, 1,43,10, 2, 4,67, 1,43, 9, 2, 4,71, 2, 4,68, 3, 6,72,
+ 0, 0, 0, 2, 8, 1, 2,11,94, 2, 7,93, 2, 8, 6, 3,10, 6, 1,46,78, 3,10,10,
+ 1,46,81, 2, 8, 7, 2, 8, 3, 3,10, 7, 2, 8, 4, 4, 7,22, 2, 7,92, 1,46,80,
+ 2, 7,94, 1,46,79, 2, 8, 5, 3,10, 8, 2, 8, 2, 6,12,94, 0, 0, 0, 2,12, 4,
+ 1,50,32, 1,50,33, 3,13,85, 2,12, 7, 2,12, 1, 3,13,84, 2,12, 6, 3,13,80,
+ 2,12, 2, 1,50,31, 2,12, 5, 2,12, 3, 3,13,83, 3,13,81, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,16,73, 2,16,70, 3,18,24, 2,16,72, 1,54,59,
+ 1,54,58, 1,54,56, 2,16,69, 2,16,74, 1,54,55, 1,54,57, 2,16,71, 2,23,12,
+ /* plane 0, page 115 */
+ 0, 255, /* first, last */
+ 2,16,68, 2,16,75, 3,18,25, 0, 0, 0, 4,19, 3, 4,19,10, 3,29, 6, 2,23, 7,
+ 2,23,11, 5,19,52, 2,23,10, 2,29,82, 2,29,93, 4,19,13, 3,23,27, 2,23,13,
+ 3,23,26, 2,23, 8, 2,29,81, 1,59,89, 4,19, 2, 4,19,12, 1,59,88, 2,23, 6,
+ 2,23, 9, 1,59,90, 3,23,25, 1,59,87, 1,59,86, 2,23, 5, 2,23,14, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2,29,84, 2,29,91, 3,29, 7, 1,64,58, 2,29,90, 2,29,87,
+ 3,29,14, 1,64,60, 3,29, 9, 3,29,11, 3,29,10, 2,29,89, 3,34,65, 3,29,13,
+ 2,29,83, 2,29,85, 2,29,88, 2,29,86, 1,64,59, 2,29,92, 1,64,57, 1,69, 7,
+ 3,29, 8, 0, 0, 0, 2,36,81, 2,36,80, 2,36,78, 6,52,92, 1,69,10, 1,69, 9,
+ 2,36,82, 3,34,63, 2,36,79, 2,43,80, 1,73,66, 1,69, 8, 3,34,66, 3,69,66,
+ 3,69,67, 2,36,84, 2,36,83, 3,45,16, 2,43,83, 2,43,81, 1,77,68, 3,39,89,
+ 1,73,67, 2,43,82, 2,49,94, 3,39,88, 3,39,90, 3,39,87, 4,42,87, 1,77,69,
+ 2,49,93, 2,50, 8, 2,50, 7, 2,50, 5, 4,42,85, 2,50, 4, 2,50, 1, 2,50, 2,
+ 2,50, 3, 2,50, 6, 2,50, 9, 0, 0, 0, 0, 0, 0, 2,56,43, 2,56,40, 2,56,41,
+ 1,81,33, 2,56,39, 2,56,45, 2,56,44, 2,56,42, 0, 0, 0, 2,61,48, 2,61,49,
+ 1,84,28, 3,53,41, 1,84,29, 2,61,47, 4,54,76, 1,86,69, 2,66,12, 1,86,68,
+ 1,88,43, 4,64, 5, 1,88,44, 1,89,88, 2,73,29, 2,73,28, 2,75,75, 2,77,61,
+ 1,91,70, 2,79,23, 2,79,22, 2,79,24, 1,38,72, 2,12, 8, 1,54,60, 1,59,91,
+ 2,23,15, 1,38,73, 2, 1,70, 1,37,62, 3, 2,58, 3, 1,75, 2, 2,69, 3, 4,15,
+ 4, 3,10,15, 2,70, 2, 4,76, 2, 4,74, 2, 4,75, 2, 4,72, 1,43,11, 2, 4,73,
+ 3, 6,78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,10,19, 2, 8,15, 3,10,13, 1,46,84,
+ 2, 8,13, 2, 8, 9, 2, 8,12, 3,10,12, 2, 8, 8, 1,46,86, 2, 8,11, 3,10,11,
+ 1,46,83, 1,46,82, 3,10,18, 1,46,85, 2, 8,14, 2, 8,10, 0, 0, 0, 3,10,15,
+ 0, 0, 0, 0, 0, 0, 1,50,37, 1,50,40, 2,12,16, 2,12,15, 2,12,14, 1,50,34,
+ 2,12,23, 2,12,13, 4,14,10, 1,50,36, 2,16,80, 3,13,88, 2,12,20, 2,12,18,
+ 1,50,39, 3,13,91, 2,12,10, 2,12,21, 3,13,87, 2,12,12, 2,12,22, 2,12,19,
+ 2,12,11, 3,13,90, 1,50,35, 2,12,24, 2,12, 9, 1,50,38, 3,13,94, 3,13,89,
+ 3,13,92, 0, 0, 0, 2,16,85, 2,16,76, 2,16,87, 3,18,30, 2,16,79, 2,16,90,
+ 2,16,91, 2,16,77, 2,16,89, 2,16,86, 2,16,84, 2,16,88, 1,54,66, 3,18,32,
+ 1,54,64, 3,18,39, 3,18,28, 2,16,82, 3,18,38, 2,16,78, 3,18,33, 2,16,81,
+ 2,16,92, 2,16,83, 1,54,65, 2,12,17, 3,18,29, 1,54,61, 1,54,63, 3,69,68,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,23,29, 2,23,29, 2,23,18, 2,23,16, 3,29,24,
+ 2,23,17, 3,18,31, 2,23,24, 3,23,32, 2,23,25, 2,23,21, 1,60, 2, 2,23,26,
+ /* plane 0, page 116 */
+ 0, 255, /* first, last */
+ 2,23,23, 2,23,20, 3,23,28, 1,59,94, 2,23,19, 1,59,92, 1,60, 1, 2,23,22,
+ 2,23,30, 1,54,62, 1,59,93, 2,23,28, 2,23,27, 1,60, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,69,69,15,22,55, 3,29,22, 3,29,26, 2,30, 4, 3,29,15,
+ 3,29,27, 3,29,18, 2,30, 5, 1,64,70, 3,29,25, 2,30,11, 3,34,77, 3,29,21,
+ 2,30,13, 2,30, 6, 1,64,64, 2,30,10, 2,30, 9, 1,64,65, 1,64,71, 3,34,68,
+ 1,64,72, 2,30,12, 1,64,62, 2,30, 3, 2,30, 1, 2,30, 7, 2,29,94, 1,64,69,
+ 2,30, 2, 2,30, 8, 2,30,14, 1,64,63, 1,64,68, 1,64,66, 1,64,67, 0, 0, 0,
+ 3,29,19, 3,29,28, 1,64,61, 3,69,70, 3,29,23, 3,34,72, 3,34,85, 1,69,17,
+ 2,36,91, 1,69,16, 2,37, 1, 3,34,79, 2,36,85, 3,34,84, 2,37, 2, 3,34,78,
+ 3,34,70, 3,34,81, 2,36,86, 2,36,87, 3,34,83, 2,37, 3, 2,36,94, 2,36,92,
+ 2,36,93, 2,36,89, 2,36,88, 3,34,71, 2,37, 4, 1,69,13, 3,34,75, 2,36,90,
+ 3,34,80, 1,69,18, 1,69,12, 1,69,19, 1,69,20, 3,34,74, 1,69,15, 1,69,14,
+ 3,40, 5, 3,39,94, 2,43,84, 1,73,69, 1,73,68, 3,39,92, 3,39,93, 2,43,89,
+ 3,40, 2, 1,77,70, 1,73,70, 3,40, 1, 3,39,91, 1,73,72, 2,43,90, 1,69,11,
+ 1,73,71, 2,43,86, 2,43,88, 2,43,85, 3,40, 7, 2,43,87, 3,40, 3, 0, 0, 0,
+ 15,41,86, 2,50,19, 3,45,17, 3,45,27, 2,50,18, 2,50,15, 1,77,73, 2,56,46,
+ 1,77,74, 2,50,14, 3,45,25, 1,77,72, 3,45,22, 2,50,16, 2,50,13, 2,50,10,
+ 2,50,17, 2,50,11, 2,50,12, 1,77,71, 3,45,21, 3,69,72, 0, 0, 0, 4,49,25,
+ 2,61,53, 4,49,26, 2,56,50, 3,45,26, 2,56,49, 2,56,51, 3,49,74, 2,61,50,
+ 1,81,36, 4,49,24, 2,56,47, 3,49,71, 1,81,34, 3,49,76, 1,81,38, 1,81,37,
+ 2,56,48, 2,56,52, 3,49,75, 1,81,35, 3,69,71, 2,61,57, 1,84,32, 1,86,70,
+ 1,84,33, 1,84,30, 2,61,54, 2,61,52, 3,53,47, 2,61,55, 3,53,43, 2,61,58,
+ 1,84,31, 2,61,56, 2,61,51, 3,53,45, 3,69,73, 2,66,15, 2,66,18, 2,70, 1,
+ 2,66,13, 3,56,15, 2,73,30, 2,66,19, 3,56,16, 1,88,45, 2,66,17, 1,86,71,
+ 2,66,14, 2,66,16, 2,66,20, 2,70, 2, 3,58,58, 2,69,94, 4,64, 7, 3,58,60,
+ 3,58,61, 3,58,59, 1,88,46, 2,69,93, 3,60,62, 3,60,60, 3,60,63, 1,89,89,
+ 3,60,61, 3,60,64, 0, 0, 0, 3,62,29, 1,90,88, 2,77,63, 1,90,87, 2,77,65,
+ 2,77,62, 2,77,64, 1,92,28, 2,80,32, 1,38,74, 2, 8,16, 2,16,93, 2,16,94,
+ 1,60, 4, 2,37, 5, 1,81,39, 1,88,47, 1,91,71, 2,80,33, 1,38,75, 0, 0, 0,
+ 2, 8,17, 1, 3, 2, 4,10,28, 3,14, 2, 2,12,25, 3,14, 1, 2,12,26, 3,14, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,18,40, 2,17, 1, 2,17, 2, 1,60, 5, 1,60, 6,
+ 15,22,71, 3,29,29, 4,25, 5, 2,30,15, 0, 0, 0, 2,37, 8, 2,37, 7, 2,37, 6,
+ /* plane 0, page 117 */
+ 0, 255, /* first, last */
+ 2,43,91, 3,34,87, 2,43,92, 2,43,93, 1,73,73, 0, 0, 0, 3,40, 8, 2,50,21,
+ 2,50,20, 3,45,29, 3,49,77, 2,56,53, 1,81,40, 1,81,41, 3,49,78, 2,61,62,
+ 2,61,59, 2,61,60, 2,61,61, 2,66,22, 2,66,21, 1,86,72, 2,70, 3, 2,75,76,
+ 1,38,76, 0, 0, 0, 1,50,41, 3,23,36, 1,60, 7, 2,37, 9, 3,34,88, 1,38,77,
+ 4,10,32, 2,17, 3, 1,60, 8, 3,23,37, 3,29,30, 1,64,73, 1,64,74, 5,39,41,
+ 1,38,78, 1,38,79, 2, 2,70, 1,43,13, 1,43,12, 1,50,42, 2,12,27, 2,30,16,
+ 1,38,80, 1,38,81, 1,38,82, 1,38,83, 0, 0, 0, 0, 0, 0, 4, 3,11, 1,43,14,
+ 1,43,15, 2, 4,78, 2, 4,77, 3,10,23, 0, 0, 0, 1,46,87, 2, 8,20, 2, 8,18,
+ 2, 8,19, 3,10,24, 3,10,21, 4, 7,32, 3,10,22, 0, 0, 0, 3,14, 7, 2,12,28,
+ 2,12,29, 3,14, 5, 3,14, 8, 1,50,46, 1,50,44, 3,14,10, 1,50,45, 1,50,43,
+ 3,14, 6,15,11,90, 0, 0, 0,15,12,42, 1,54,67, 3,18,46, 3,18,45, 3,18,48,
+ 3,18,47, 1,54,71, 1,54,70, 2,17, 4, 1,54,69, 1,54,68, 3,18,49, 2,17, 5,
+ 0, 0, 0, 3,23,38, 1,60,11, 2,23,32, 2,23,31, 1,60, 9, 1,60,10, 3,23,41,
+ 3,23,39, 0, 0, 0, 1,64,76, 1,64,75, 2,30,18, 3,29,35, 3,29,34, 2,30,17,
+ 1,60,12, 3,29,36, 4,25,12, 0, 0, 0, 0, 0, 0, 4,30,75, 1,69,21, 2,37,11,
+ 1,69,22, 2,37,10, 3,34,91, 4,36,92, 4,36,91, 2,43,94, 2,50,22, 1,77,75,
+ 2,56,54, 3,49,80, 0, 0, 0, 3,53,50, 2,61,63, 4,59,84, 1,88,49, 1,88,48,
+ 4,67,72, 3,60,66, 1,91,72, 1,38,84, 2, 8,21, 0, 0, 0, 3,29,37, 1,60,13,
+ 2,44, 1, 1,73,74, 3, 2,59, 3, 6,83, 2, 4,79, 2, 4,80, 0, 0, 0, 0, 0, 0,
+ 2, 8,22, 1,46,89, 1,46,90, 3,10,26, 4, 7,35, 1,46,88, 3,10,27, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1,50,50, 1,50,51, 1,50,48, 1,50,49, 3,14,11, 2,12,30,
+ 3,14,15, 4,10,42, 2,12,31, 1,50,47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2,17, 6, 3,18,55, 1,54,75, 1,54,76, 3,18,53, 1,60,16, 2,17,12, 4,14,32,
+ 1,54,81, 1,54,79, 2,17,13, 2,17, 8, 1,54,78, 1,54,77, 1,54,72, 2,17,11,
+ 2,17,10, 2,17, 7, 1,54,80, 3,18,50, 2,17, 9, 1,54,73, 4,14,20, 1,54,74,
+ 0, 0, 0, 0, 0, 0, 1,60,17, 2,23,36, 2,23,37, 1,60,18, 2,23,33, 2,23,35,
+ 2,23,39, 2,23,38, 2,23,34, 3,23,42, 1,60,14, 1,60,15, 0, 0, 0, 2,30,26,
+ 1,64,81, 1,64,80, 2,30,20, 1,64,78, 4,25,20, 2,30,23, 1,64,82, 2,30,24,
+ 1,64,83, 2,30,21, 1,64,77, 1,64,79, 2,30,25, 3,29,39, 2,30,22, 2,30,19,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,30,87, 2,37,24, 3,34,92, 2,37,13,
+ 1,69,24, 1,69,27, 1,69,26, 1,69,31, 1,69,30, 2,37,25, 2,37,23, 2,37,16,
+ 2,37,20, 2,37,19, 1,69,28, 2,37,22, 2,37,18, 2,37,26, 2,37,17, 1,69,29,
+ /* plane 0, page 118 */
+ 0, 255, /* first, last */
+ 1,69,23, 1,69,25, 3,34,93, 2,37,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,40,11,
+ 2,44, 3, 1,73,78, 2,44, 7, 1,73,77, 2,44, 4, 1,73,76, 3,40, 9, 2,37,14,
+ 2,37,21, 2,44, 6, 4,36,94, 1,73,79, 2,44, 8, 2,44, 5, 2,44, 2, 0, 0, 0,
+ 0, 0, 0, 2,50,25, 2,50,29, 2,50,31, 2,50,27, 2,50,26, 2,50,24, 1,77,78,
+ 1,77,76, 1,77,81, 1,77,82, 2,50,28, 1,77,79, 2,50,23, 1,77,80, 1,73,75,
+ 2,50,30, 1,77,77, 0, 0, 0, 0, 0, 0, 3,49,81, 2,56,56, 4,49,47, 2,56,55,
+ 2,56,63, 2,56,57, 2,56,62, 2,56,59, 1,81,42, 2,56,61, 3,49,83, 3,49,82,
+ 1,81,43, 4,49,45, 1,81,44, 3,49,84, 2,56,60, 2,56,58, 0, 0, 0, 0, 0, 0,
+ 4,55, 1, 4,55, 4, 1,84,35, 2,61,64, 3,53,53, 3,53,51, 1,84,34, 2,61,67,
+ 2,61,65, 2,61,66, 5,53,73, 5,60,22, 1,84,36, 0, 0, 0, 3,53,52, 3,56,20,
+ 2,66,26, 3,56,19, 1,86,75, 2,66,27, 4,59,85, 4,59,89, 1,86,73, 2,66,28,
+ 1,86,74, 2,66,25, 2,66,29, 3,56,18, 2,66,23, 0, 0, 0, 0, 0, 0, 1,88,50,
+ 2,70, 4, 1,88,51, 1,89,90, 0, 0, 0, 2,66,24, 1,89,91, 0, 0, 0, 3,62,31,
+ 3,62,30, 1,90,89, 2,75,77, 0, 0, 0, 1,91,74, 2,77,66, 1,91,73, 3,64,27,
+ 2,79,25, 1,92,65, 1,92,66, 3,69,74, 7,68,50, 2,82,26, 3, 2,60, 3,69,75,
+ 1,50,52, 2,12,32, 0, 0, 0, 1,64,84, 1,64,85, 1,38,85, 1,40,43, 2, 2,71,
+ 3, 6,84, 2, 4,81, 1,43,16, 3, 6,86, 1,46,91, 4,10,44, 1,50,53, 1,50,54,
+ 1,50,55, 2,23,41, 2,17,14, 1,54,82, 4,14,33, 4,14,35, 1,60,19, 2,23,40,
+ 3,23,45, 0, 0, 0, 2,30,28, 1,64,87, 3,29,44, 2,30,27, 1,64,86, 3,34,94,
+ 3,35, 1, 2,37,27, 1,77,83, 2,50,35, 2,50,32, 2,50,33, 2,50,34, 4,49,52,
+ 4,49,53, 3,49,86, 5,60,35, 3,53,54, 2,61,68, 3,53,55, 2,66,30, 4,59,92,
+ 4,59,93, 3,58,62, 2,73,32, 2,73,31, 4,70,58, 2,77,67, 1,38,86, 2, 8,23,
+ 1,54,83, 0, 0, 0, 0, 0, 0, 3,29,45, 1,64,88, 2,37,28, 4,37,20, 3,40,16,
+ 2,44, 9, 3,40,14, 1,77,84, 2,56,64, 3,69,76, 2,66,31, 2,73,33, 1,38,87,
+ 3, 6,87, 3, 6,88, 1,46,92, 1,50,58, 2,12,33, 1,50,59, 1,50,57, 3,14,18,
+ 1,50,56, 2,17,15, 1,54,84, 3,18,58, 3,18,59, 1,54,85, 1,54,86, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1,60,21, 2,23,42, 1,60,20, 3,23,48, 3,23,50, 3,23,49,
+ 15,23, 3, 3,29,47, 2,30,29, 1,60,22, 1,64,89, 2,37,29, 1,69,32, 1,69,33,
+ 4,37,21, 1,73,80, 3,40,17, 1,73,81, 1,77,85, 1,81,46, 2,56,65, 1,81,45,
+ 4,55,13, 2,61,69, 1,84,37, 3,56,21, 2,66,32, 2,73,34, 1,38,88, 1,43,17,
+ 2, 8,26, 2, 8,25, 1,46,93, 2, 8,24, 1,46,94, 2, 8,27, 4,10,53, 2,12,39,
+ 1,50,62, 1,50,61, 2,12,41, 2,12,40, 1,50,66, 3,14,21, 1,50,65, 3,14,19,
+ /* plane 0, page 119 */
+ 0, 254, /* first, last */
+ 4,10,57, 1,50,60, 4,10,61, 2,12,35, 2,12,36, 2,12,37, 4,10,50, 1,50,67,
+ 2,12,34, 1,50,63, 2,12,38, 1,50,64, 0, 0, 0, 0, 0, 0, 3,18,68, 3,18,63,
+ 2,17,18, 2,17,22, 2,17,20, 2,17,19, 4,14,53, 2,17,23, 3,18,62, 4,14,47,
+ 3,18,72, 2,17,24, 2,17,25, 2,17,17, 4,14,49, 2,17,16, 3,23,57, 1,54,88,
+ 1,54,89, 3,18,71, 2,17,26, 2,17,21, 3,18,69, 2,23,51, 3,23,53, 2,17,27,
+ 1,54,90, 1,54,87, 3,18,60, 3,18,67, 0, 0, 0, 2,23,45, 4,19,47, 2,23,44,
+ 3,23,51, 2,23,46, 2,23,47, 2,23,49, 2,23,48, 2,23,53, 1,60,26, 1,60,23,
+ 1,60,27, 2,23,43, 1,60,28, 2,23,52, 1,60,25, 2,23,50, 1,60,24, 3,18,66,
+ 3,23,55, 4,19,54, 3,29,54, 3,29,51, 2,30,32, 2,30,34, 2,30,30, 2,30,31,
+ 3,29,49, 3,29,50, 2,30,35, 2,30,37, 2,30,38, 2,30,33, 2,30,36, 1,64,90,
+ 0, 0, 0, 0, 0, 0, 2,37,33, 3,35, 7, 2,37,38, 2,37,30, 2,37,34, 4,31, 9,
+ 3,35, 8, 2,37,39, 2,37,35, 1,69,34, 1,69,42, 3,35, 5, 1,69,37, 2,37,31,
+ 2,37,32, 1,73,85, 1,69,45, 1,69,38, 3,35, 6, 1,69,43, 1,69,36, 2,37,37,
+ 1,69,44, 2,37,36, 1,69,40, 1,69,35, 1,69,41, 2,37,40, 2,44,14, 2,44,16,
+ 4,37,34, 3,40,25, 4,37,32, 4,37,29, 3,40,19, 3,40,22, 3,40,21, 3,40,20,
+ 3,40,24, 1,69,39, 3,40,27, 3,40,29, 2,44,11, 1,73,83, 2,44,17, 1,73,84,
+ 2,44,15, 2,44,10, 2,44,13, 2,44,18, 1,73,82, 2,44,12, 0, 0, 0, 1,77,87,
+ 2,50,39, 2,50,38, 3,45,36, 1,77,90, 1,77,88, 2,50,36, 1,77,86, 2,50,37,
+ 3,45,38, 1,77,89, 0, 0, 0, 0, 0, 0, 4,49,63, 2,56,73, 3,49,91, 2,56,75,
+ 3,49,89, 2,56,74, 2,56,66, 2,56,70, 2,56,69, 2,56,67, 1,81,48, 1,81,49,
+ 1,81,47, 2,56,68, 2,56,71, 2,56,72, 3,53,57, 1,81,50, 3,53,56, 1,84,42,
+ 2,61,77, 3,53,59, 1,84,39, 2,61,71, 1,84,41, 1,84,43, 4,49,65, 3,53,60,
+ 1,84,40, 2,61,76, 2,61,72, 1,84,38, 2,61,75, 2,61,70, 2,61,74, 2,61,73,
+ 3,56,22, 3,56,24, 2,66,34, 1,86,78, 1,86,79, 1,86,76, 3,56,27, 1,86,77,
+ 3,56,26, 3,56,25, 2,66,33, 4,64,25, 2,70, 7, 3,58,64, 3,58,63, 1,88,52,
+ 0, 0, 0, 2,70, 5, 2,70, 6, 0, 0, 0, 2,73,35, 2,73,38, 2,73,36, 2,73,37,
+ 2,75,78, 3,62,34, 4,70,62, 1,90,90, 2,79,26, 2,80,34, 4,75,84, 1,92,67,
+ 2,81, 8, 2,81, 9, 1,93,19, 1,38,89, 1,50,68, 3,18,73, 2,30,39, 3,29,55,
+ 2,37,41, 4,76,86, 1,38,90, 1,43,18, 4, 7,50, 1,47, 1, 3,14,22, 2,12,42,
+ 2,12,43, 1,54,91, 4,19,59, 0, 0, 0, 2,30,40, 1,64,91, 1,69,46, 1,84,44,
+ 2,61,78, 2,70, 8, 2,73,39, 1,38,91, 3, 6,91, 3, 6,92,15, 5, 3, 2, 8,33,
+ 2, 8,28, 2, 8,30, 2, 8,32, 2, 8,31, 2, 8,29, 1,47, 2,15, 8,20,
+ /* plane 0, page 120 */
+ 2, 255, /* first, last */
+ 1,50,69, 2,12,52, 3,14,25, 2,12,47, 2,12,44, 3,14,27,
+ 3,14,30, 2,12,51, 3,14,23, 3,14,26, 1,50,71, 1,50,72, 2,12,50, 2,12,49,
+ 2,12,48, 2,12,45, 2,12,46, 2,12,53, 1,50,70, 3,14,29, 0, 0, 0, 0, 0, 0,
+ 15,12,60, 3,69,77, 0, 0, 0, 3,69,78, 0, 0, 0, 1,55, 1, 3,70,92, 1,55, 7,
+ 1,55, 6, 2,17,36, 2,17,30, 2,17,28, 3,18,76, 1,55, 4, 2,23,60, 1,54,93,
+ 2,17,33, 2,17,37, 2,17,39, 2,17,35, 2,17,29, 1,55, 5, 2,17,34, 2,17,32,
+ 1,54,92, 2,17,40, 1,55, 8, 2,17,38, 1,55, 2, 2,17,31, 3,18,77, 1,55, 3,
+ 1,54,94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,69,79, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,23,66, 1,60,30, 4,19,61, 2,23,61, 3,23,67, 3,23,61,
+ 2,23,54, 2,23,56, 2,23,58, 3,23,63, 2,23,59, 2,23,57, 1,60,31, 3,23,65,
+ 2,23,62, 3,23,64, 2,23,55, 3,69,80, 3,69,81, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3,69,82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,30,44, 1,64,92, 2,30,52, 3,29,60,
+ 2,30,41, 6,44,15, 2,30,53, 3,29,57, 2,30,42, 2,30,43, 3,29,61, 4,25,52,
+ 2,30,51, 2,30,50, 2,30,47, 1,60,29, 1,64,93, 2,30,45, 2,30,48, 1,64,94,
+ 2,30,49, 2,30,46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,29,58, 0, 0, 0,
+ 3,35,17, 2,37,52, 3,35,13, 2,37,56, 1,69,53, 3,35,14, 2,44,24, 1,69,56,
+ 2,37,54, 3,35,23, 3,35, 9, 2,37,51, 2,37,46, 2,37,48, 2,37,49, 2,37,42,
+ 3,35,21, 1,69,52, 3,35,11, 3,35,16, 1,69,51, 3,35,20, 1,69,47, 2,37,45,
+ 3,35,10, 1,69,54, 3,35,22, 1,69,55, 2,37,44, 2,37,47, 2,37,55, 1,69,49,
+ 1,69,50, 2,37,53, 2,37,43, 0, 0, 0,15,36, 5, 4,37,51, 2,44,26, 1,73,87,
+ 2,44,28, 2,37,50, 2,44,30, 1,73,91, 2,44,31, 2,44,27, 3,40,30, 1,73,88,
+ 2,44,23, 1,73,90, 2,44,20, 2,44,25, 2,44,29, 2,44,22, 3,40,31, 3,40,37,
+ 1,69,48, 3,40,36, 2,44,19, 1,73,89, 2,44,21, 0, 0, 0, 0, 0, 0, 3,69,83,
+ 3,40,32,15,42,31, 1,77,93, 2,50,41, 1,78, 3, 4,43,57, 1,78, 1, 4,43,55,
+ 3,45,42, 1,73,86, 3,45,45, 2,50,48, 2,50,49, 1,77,92, 3,45,40, 3,45,44,
+ 2,50,47, 2,50,50, 1,77,94, 1,77,91, 2,50,43, 2,50,40, 2,50,45, 2,50,42,
+ 1,78, 4, 2,50,44, 3,45,43, 3,45,41, 2,50,46, 1,78, 2, 3,50, 1, 0, 0, 0,
+ 3,69,84, 0, 0, 0, 1,81,52, 2,56,82, 3,50, 4, 2,56,76, 2,56,80, 2,56,86,
+ 2,56,87, 2,56,83, 2,56,84, 2,56,81, 4,43,61, 2,56,78, 4,49,78, 1,81,54,
+ 1,81,51, 2,56,77, 2,56,79, 3,50, 2, 1,81,53, 2,56,85, 3,69,85, 1,84,48,
+ 3,53,64, 3,53,66, 2,61,85, 2,61,79, 1,84,47, 0, 0, 0, 4,55,30, 1,84,45,
+ 3,53,65, 2,61,87, 1,84,46, 2,61,82, 2,61,83, 2,61,80, 2,61,88, 2,61,84,
+ /* plane 0, page 121 */
+ 0, 255, /* first, last */
+ 4,55,32, 1,84,49, 2,61,81, 0, 0, 0, 2,61,89, 2,61,86, 3,56,35, 3,56,30,
+ 3,56,32, 2,66,38, 3,56,31, 3,56,28, 2,66,35, 3,56,34, 1,86,80, 4,60,18,
+ 2,66,39, 2,66,41, 2,66,40, 2,66,36, 2,66,37, 3,56,36, 0, 0, 0, 2,70,13,
+ 3,58,65, 1,88,53, 3,58,66, 2,70,10, 2,70,12, 2,70, 9, 2,70,14, 4,64,34,
+ 3,58,67, 2,70,11, 3,69,86, 2,73,41, 2,73,44, 2,73,40, 1,89,92, 2,73,42,
+ 2,73,43, 2,73,45, 1,89,93, 1,90, 1, 1,89,94, 2,75,79, 3,62,37, 2,75,81,
+ 3,62,35, 2,75,80, 3,62,36, 0, 0, 0, 0, 0, 0, 2,77,68,15,74,70, 3,64,28,
+ 2,80,35, 2,81,10, 1,38,92, 0, 0, 0, 3, 4,19, 2, 4,82, 1,47, 3, 2, 8,35,
+ 1,47, 4, 1,47, 5, 2, 8,34, 0, 0, 0, 2,12,58, 2,12,57, 1,50,73, 1,50,76,
+ 1,50,75, 1,50,74, 2,12,54, 2,12,56, 2,12,55, 3,69,87, 0, 0, 0, 2,17,43,
+ 1,55,10, 2,17,47, 2,17,46, 2,17,45, 2,17,41, 1,55, 9, 1,55,13, 1,55,16,
+ 3,18,79, 3,18,80, 1,55,17, 2,17,42, 2,17,44, 1,55,15, 1,55,14, 1,55,12,
+ 1,55,11, 2,23,69, 3,18,82, 2,23,67, 2,23,63, 1,60,32, 3,29,62, 2,23,64,
+ 1,60,33, 2,23,65, 2,23,66, 2,23,68, 3,23,70, 1,60,34, 3,23,69, 0, 0, 0,
+ 2,30,57, 3,29,63, 2,30,56, 2,30,55, 2,30,54, 3,29,68, 3,29,66, 4,25,58,
+ 0, 0, 0, 2,37,60, 1,69,57, 4,31,38, 2,37,57, 2,37,59, 3,35,24, 1,69,58,
+ 3,35,29, 1,69,59, 2,37,58, 3,35,25, 3,29,67, 0, 0, 0, 3,69,88, 3,40,40,
+ 2,44,40, 3,40,39, 2,44,33, 2,44,34, 5,39,94, 1,73,94, 1,73,92, 1,73,93,
+ 2,44,42, 5,40, 2, 2,44,41, 2,44,38, 2,44,37, 2,44,36, 2,44,35, 2,44,39,
+ 2,44,32, 3,69,89, 2,50,51, 2,50,56, 2,50,54, 3,45,48, 3,45,49, 3,45,47,
+ 2,50,53, 2,50,52, 2,50,55, 3,69,90, 2,56,88, 3,50, 6, 1,81,55, 1,84,50,
+ 2,61,91, 3,50, 7, 1,84,51, 2,61,90, 2,66,43, 2,66,42, 1,86,81, 3,56,37,
+ 2,70,15, 1,88,54, 2,73,46, 1,91,75, 2,77,69, 3,64,29, 2,80,37, 2,80,36,
+ 2, 1,71, 1,50,77, 1,50,78, 2,23,70, 3,69,91, 1,69,61, 1,38,93, 1,43,21,
+ 1,43,20, 1,43,19, 4, 4,72, 3,10,30, 3,10,29, 2, 8,36, 3,10,31, 3,10,34,
+ 1,47, 7, 1,47, 6, 3,10,36, 1,50,81, 3,69,44, 2,12,60, 2,12,63, 2,12,61,
+ 3,14,34, 1,50,79, 1,50,80, 3,14,32, 3,14,33, 2,12,59, 2,12,62, 3,14,35,
+ 1,55,24, 3,18,84, 3,18,83, 3,18,89, 2,17,54, 2,17,56, 2,17,55, 1,55,21,
+ 2,17,50, 3,18,86, 3,18,91, 1,55,19, 1,55,18, 3,18,87, 1,55,22, 1,55,20,
+ 3,18,88, 1,55,23, 2,17,53, 2,17,48, 2,17,49, 2,17,52, 2,17,51, 0, 0, 0,
+ 3,18,92, 3,23,73, 3,23,71, 3,23,75, 0, 0, 0, 3,23,74, 2,23,73, 2,23,74,
+ 2,23,72, 3,23,76, 2,23,71, 1,60,35,15,23,31, 0, 0, 0, 0, 0, 0, 3,29,69,
+ /* plane 0, page 122 */
+ 0, 255, /* first, last */
+ 1,65, 5, 6,44,40, 2,30,58, 2,30,60, 2,30,62, 1,65, 4, 6,44,35, 3,29,70,
+ 1,65, 2, 3,29,73, 2,30,59, 1,65, 3, 2,30,61, 1,65, 1, 3,29,72, 3,35,33,
+ 2,37,70, 2,37,61, 2,37,64, 2,37,68, 1,69,65, 2,37,66, 4,31,48, 2,37,65,
+ 2,37,62, 2,37,63, 1,69,63, 2,37,69, 1,69,62, 3,35,36, 1,69,67, 1,69,66,
+ 1,69,64, 4,31,42, 2,37,67, 0, 0, 0, 0, 0, 0, 3,69, 4, 2,44,48, 4,37,61,
+ 2,44,47, 3,40,43, 3,40,45, 2,44,43, 3,40,48, 3,40,47, 1,74, 1, 2,44,46,
+ 2,44,45, 1,74, 2, 3,40,50,15,42,68, 4,43,67, 4,37,62, 4,43,75, 1,78, 9,
+ 3,45,53, 2,50,58, 3,45,54, 1,78,10, 1,78, 6, 1,78, 8, 3,45,58, 1,78, 5,
+ 1,78, 7, 3,45,51, 3,45,55, 0, 0, 0, 2,56,89, 3,50,10, 1,81,58, 2,56,91,
+ 2,56,90, 3,53,68, 2,44,44, 1,81,60, 1,81,59, 1,81,56, 1,81,57, 3,50,12,
+ 15,59,57, 0, 0, 0, 0, 0, 0, 3,50, 9, 2,62, 2, 4,55,41, 2,61,94, 1,84,52,
+ 2,62, 1, 4,55,40, 2,62, 3, 2,61,93, 2,61,92, 0, 0, 0, 0, 0, 0, 2,66,44,
+ 1,86,84, 1,86,82, 1,86,83, 0, 0, 0, 3,58,70, 4,64,37, 3,58,69, 2,70,16,
+ 2,70,17, 1,88,56, 3,58,71, 1,88,55, 2,73,48, 2,73,49, 2,73,47, 3,60,68,
+ 2,77,70, 2,77,71, 3,64,86, 3,64,87, 1,38,94, 2, 2,72, 1,43,22, 0, 0, 0,
+ 2, 8,37, 1,47, 9, 1,47, 8, 2, 8,38, 3,14,36, 3,14,39, 2,12,65, 1,50,82,
+ 2,12,64, 1,50,83, 3,14,41, 3,14,40, 1,55,25, 2,17,59, 2,17,57, 2,17,63,
+ 1,55,26, 2,17,58, 2,17,62, 2,17,60, 2,17,61, 0, 0, 0, 0, 0, 0, 2,23,75,
+ 2,23,77, 3,23,82, 1,60,36, 3,23,81, 2,23,76, 1,60,37, 1,65, 8, 1,65, 7,
+ 1,65, 6, 2,30,63, 3,23,80, 4,25,69, 0, 0, 0, 0, 0, 0, 2,37,73, 1,69,68,
+ 1,69,69, 3,35,38, 2,37,72, 2,37,71, 3,35,39, 0, 0, 0, 0, 0, 0, 3,69,92,
+ 2,44,49, 1,74, 4, 1,74, 3, 2,44,50, 2,44,51, 0, 0, 0, 1,78,12, 1,78,11,
+ 3,45,59, 2,57, 1, 2,50,59, 2,50,61, 2,50,60, 2,56,94, 2,56,92, 2,57, 2,
+ 2,56,93, 5,54,50, 1,81,61, 3,50,15, 4,50, 7, 3,50,14, 2,62, 4, 1,84,53,
+ 2,62, 5, 2,62, 6, 3,53,72, 0, 0, 0, 1,86,85, 1,86,86, 4,64,43, 1,90, 2,
+ 3,62,41, 3,62,40, 1,92,29, 1,39, 1, 3, 6,94, 3, 7, 1, 4, 7,59, 3,10,39,
+ 3,14,46, 2,12,66, 3,14,47, 3,14,45, 3,14,43, 3,14,44, 0, 0, 0,15,12,86,
+ 2,17,64, 1,55,27, 3,19, 3, 3,19, 6, 3,19, 7, 3,19, 4, 0, 0, 0, 1,61,94,
+ 1,61,93, 3,23,83, 3,29,81, 1,65,10, 2,30,65, 1,65, 9, 2,30,64, 3,29,80,
+ 4,31,55, 3,35,41, 3,35,42, 2,37,74, 3,40,52, 1,74, 5, 2,44,52, 1,74, 6,
+ 3,40,53, 3,50,16, 3,53,73, 3,53,74, 4,55,48, 3,56,41, 1,90, 3, 2,73,50,
+ 3,63,53, 1,40,44, 1,47,10, 2, 8,39, 3,14,49, 1,50,85, 3,14,48, 1,50,84,
+ /* plane 0, page 123 */
+ 0, 255, /* first, last */
+ 2,12,67, 2,12,68, 0, 0, 0, 0, 0, 0, 2,17,66, 2,17,68, 1,55,28, 0, 0, 0,
+ 2,17,70, 2,17,73, 2,17,71, 3,19,11, 4,14,81, 3,19,10, 2,17,72, 2,17,69,
+ 2,17,65, 1,55,29, 2,17,74, 2,17,67, 3,19,12, 0, 0, 0, 3,23,88, 3,23,89,
+ 2,23,86, 1,60,43, 2,24, 1, 1,60,40, 3,23,87, 2,23,88, 1,60,44, 3,23,91,
+ 1,60,38, 3,23,86, 2,23,83, 2,24, 2, 2,23,84, 2,23,81, 1,60,42, 4,19,92,
+ 1,60,39, 4,19,90, 2,23,87, 2,23,90, 1,60,41, 2,23,91, 1,60,45, 2,23,92,
+ 2,23,82, 2,23,89, 2,23,93, 2,23,85, 2,23,80, 2,23,78, 3,23,90, 3,69,93,
+ 2,23,94,15,23,45, 0, 0, 0, 2,23,79, 0, 0, 0,15,22,94, 0, 0, 0, 5,27, 4,
+ 2,30,72, 3,29,91, 3,29,88, 3,29,85, 2,30,68, 2,30,74, 1,65,13, 2,30,67,
+ 2,30,69, 1,65,11, 2,30,66, 1,65,18, 2,30,70, 1,65,17, 2,30,71, 1,65,19,
+ 1,65,14, 1,65,20, 1,65,15, 3,29,89, 1,65,16, 3,29,82, 1,65,12, 3,29,86,
+ 2,30,73, 3,69,94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,35,47, 4,31,71,
+ 1,69,72, 2,37,85, 3,35,44, 2,37,88, 2,37,76, 2,37,81, 2,37,75, 1,69,74,
+ 3,35,53, 2,37,79, 4,31,62, 3,35,45, 3,29,87, 2,37,77, 1,69,73, 3,35,52,
+ 2,37,84, 2,37,83, 2,37,80, 2,37,82, 2,37,78, 1,74,10, 2,37,87, 1,69,70,
+ 2,37,86, 3,35,49, 0, 0, 0,15,36,37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,40,54, 2,44,68, 3,40,56, 1,74,17, 2,44,63, 3,40,64, 1,74,16,
+ 2,44,53, 4,37,75, 2,44,55, 1,74, 9, 2,44,60, 2,44,59, 2,44,62, 1,74,14,
+ 2,44,57, 2,44,56, 3,40,58, 3,40,62, 1,74,13, 1,74, 8, 2,44,58, 1,74,11,
+ 2,44,64, 2,44,66, 0, 0, 0, 2,44,61, 2,44,54, 1,74,12, 3,40,55, 3,40,61,
+ 1,78,20, 1,74, 7, 4,37,68, 3,40,60, 2,44,67, 4,37,80, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,50,65, 1,78,13, 3,45,60, 2,50,67,
+ 4,44,11, 1,78,14, 3,45,69, 3,45,61, 1,78,16, 2,50,70, 4,43,90, 2,50,62,
+ 1,74,15, 2,50,68, 4,43,83, 4,44,17, 4,43,84, 4,44,10, 2,50,64, 3,45,64,
+ 1,69,71, 1,78,19, 4,44, 1, 4,43,88, 1,78,15, 4,44, 6, 1,78,17, 1,78,18,
+ 4,43,86, 1,81,64, 2,50,69, 2,50,63, 1,78,21, 3,45,67, 2,50,66, 0, 0, 0,
+ 3,70, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,57,12, 2,57, 7, 4,50,13, 5,54,73,
+ 2,57,17, 1,81,62, 2,57, 9, 1,81,66, 2,57,15, 2,57, 6, 2,57, 3, 2,57,18,
+ 1,84,59, 1,81,67, 2,57,14, 2,57, 4, 1,81,65, 2,57, 8, 1,81,69, 2,57, 5,
+ 2,57,10, 1,81,68, 2,57,13, 2,57,16, 3,50,19, 3,50,20, 0, 0, 0, 0, 0, 0,
+ 2,62,24, 2,62,25, 2,62, 9, 2,62,16, 2,62,14, 4,55,63, 3,53,77, 1,84,57,
+ 2,62,21, 2,57,11, 3,53,75, 2,62,12, 3,53,78, 2,62,22, 1,84,56, 2,62,11,
+ /* plane 0, page 124 */
+ 0, 255, /* first, last */
+ 2,62,10, 2,62,20, 2,62,17, 2,62,19, 4,55,52, 2,62, 7, 2,62,23, 1,84,54,
+ 3,53,80, 2,62,18, 2,62,27, 2,62,15, 1,84,58, 1,84,55, 2,62,13, 2,62, 8,
+ 2,62,26, 1,81,63, 3,53,81, 0, 0, 0,15,59,63, 4,55,55, 0, 0, 0, 0, 0, 0,
+ 3,53,79, 2,66,47, 3,56,48, 3,56,46, 2,66,45, 2,66,51, 1,86,90, 2,66,49,
+ 2,66,48, 1,86,92, 2,66,54, 1,86,91, 3,56,49, 2,66,55, 2,66,52, 1,86,88,
+ 2,66,53, 2,66,46, 1,86,89, 1,86,87, 2,70,21, 2,66,50, 3,56,44, 3,70, 2,
+ 2,66,56, 0, 0, 0, 3,70, 3, 2,70,18, 3,58,79, 3,58,78, 4,64,46, 1,88,61,
+ 1,88,59, 2,70,20, 4,64,44, 2,70,22, 2,70,19, 1,88,60, 1,88,57, 1,88,58,
+ 1,88,62, 0, 0, 0, 3,70, 4, 1,90, 5, 3,60,70, 2,73,55, 5,76,89, 2,73,54,
+ 2,73,52, 2,73,51, 2,73,53, 3,60,69, 1,90, 4, 1,90, 6, 3,70, 5,15,69,71,
+ 1,90,91, 3,62,44, 4,70,79, 2,75,83, 2,75,82, 3,60,71, 3,62,43, 2,77,72,
+ 3,63,56, 2,77,74, 2,77,76, 2,77,75, 2,77,73, 3,63,55, 3,64,31, 1,91,77,
+ 1,91,76, 0, 0, 0, 3,64,30, 1,92,31, 1,92,30, 1,92,32, 2,79,28, 2,79,27,
+ 3,70, 6, 2,81,11, 2,80,38, 2,81,12, 1,93, 5, 3,65,36, 1,93, 6, 2,81,60,
+ 4,77,59, 3,66,26, 1,93,43, 1,40,45, 3,10,41, 2, 8,40, 3,10,40, 3,14,50,
+ 2,12,70, 2,12,71, 2,12,69, 3,14,52, 3,14,51, 1,50,86,15,13, 1, 2,12,72,
+ 2,12,73, 2,12,74, 0, 0, 0, 3,19,17, 2,17,75, 2,17,81, 3,19,14, 3,19,16,
+ 2,17,79, 1,55,30, 2,17,77, 3,19,18, 2,17,78, 2,17,80, 3,19,13, 0, 0, 0,
+ 0, 0, 0, 2,17,76, 1,60,46, 3,23,93, 2,24, 3, 1,60,48, 2,24, 5, 1,60,47,
+ 2,24, 4, 3,23,94, 3,24, 1, 3,24,30, 3,24, 2, 4,20, 2, 2,30,76, 1,65,21,
+ 3,30, 1, 2,30,78, 2,30,75, 2,24, 6, 3,30, 3, 1,65,22, 3,30, 2, 3,29,94,
+ 2,30,77, 3,70, 7, 0, 0, 0,15,30, 1,15,30, 3, 0, 0, 0, 3,35,56, 2,37,91,
+ 3,35,60, 1,69,75, 2,37,89, 1,69,76, 2,37,90, 1,69,77, 4,37,84, 3,40,66,
+ 3,40,65, 1,74,18, 2,44,72, 2,44,69, 2,44,71, 1,74,19, 1,74,20, 2,44,70,
+ 15,43, 7,15,43,11, 3,45,79, 3,45,81, 3,45,77, 2,50,71, 3,45,80, 3,45,83,
+ 2,50,72, 3,45,82, 1,78,22, 2,50,74, 2,50,73, 3,45,78, 1, 3, 3, 4,50,36,
+ 2,57,22, 2,57,23, 2,57,19, 3,50,23, 2,57,20, 1,81,70, 1,81,71, 2,57,21,
+ 0, 0, 0, 1,84,65, 3,53,85, 3,53,84, 1,84,61, 1,84,66, 1,84,62, 1,84,64,
+ 1,84,60, 3,50,25, 1,84,63, 3,56,53, 4,60,58, 4,60,59, 3,56,52, 1,86,93,
+ 2,62,28, 7,40,55, 2,70,24, 4,64,58, 2,70,23, 3,70, 8, 2,73,56, 1,90, 7,
+ 1,90, 8, 2,77,78, 2,75,84, 3,65,73, 2,77,77, 3,64,32, 2,81,13, 2,81,82,
+ 1,40,46, 0, 0, 0, 3, 7, 2, 1,43,23, 3,10,43, 2, 8,41, 1,47,11, 3,10,42,
+ /* plane 0, page 125 */
+ 0, 255, /* first, last */
+ 1,50,89, 2,12,77, 1,50,87, 2,12,75, 1,50,92, 1,50,88, 1,50,93, 1,50,91,
+ 2,12,76, 1,50,90, 1,55,34, 1,55,33, 2,17,92, 1,55,42, 2,17,85, 2,17,91,
+ 1,55,38, 2,17,84, 2,17,90, 2,17,88, 1,55,37, 1,55,39, 2,17,87, 1,55,32,
+ 2,17,86, 1,55,43, 1,55,40, 1,55,44, 1,55,41, 2,17,83, 2,17,82, 2,17,89,
+ 1,55,35, 1,55,31, 1,55,36, 4,15, 5, 3,19,23, 3,19,27, 0, 0, 0, 0, 0, 0,
+ 2,24,21, 2,24,14, 4,26, 6, 1,65,27, 2,24,13, 3,24, 9, 1,60,52, 1,60,59,
+ 1,60,56, 1,60,62, 1,60,61, 1,60,57, 3,24, 6, 2,24, 7, 2,24,10, 3,24, 7,
+ 2,24, 9, 1,60,53, 2,24,11, 2,24,20, 1,60,54, 2,24, 8, 2,24,17, 2,24,18,
+ 1,60,55, 2,24,15, 1,60,60, 1,60,50, 1,60,58, 2,24,12, 1,60,49, 2,24,16,
+ 3,24,14, 3,24, 4, 2,24,19,15,23,52, 3,24,11, 3,30,20, 2,31, 1, 2,30,86,
+ 1,65,24, 2,30,93, 2,30,90, 2,30,82, 2,30,91, 1,65,26, 2,30,83, 3,30, 9,
+ 2,30,79, 3,30, 6, 3,30,14, 1,69,83, 2,30,88, 3,30,15, 1,65,23, 2,30,94,
+ 3,30, 8, 1,65,30, 1,65,32, 2,30,81, 3,30,12, 4,26, 7, 1,65,31, 2,30,84,
+ 1,65,25, 2,30,92, 2,30,85, 2,30,89, 3,30,10, 2,30,87, 1,65,28, 2,30,80,
+ 1,65,33, 1,60,51, 1,65,29, 1,65,34, 3,30, 4, 3,30,21, 3,30,19, 0, 0, 0,
+ 3,35,71, 1,69,79, 2,38, 4, 2,38, 6, 2,38, 8, 2,38,12, 3,30,11, 2,38, 2,
+ 2,37,94, 1,69,81, 4,31,81, 2,38, 7, 2,38,11, 2,38, 3, 2,37,93, 3,35,70,
+ 2,37,92, 3,35,73, 3,35,64, 3,35,66, 2,38, 9, 2,38, 1, 2,38, 5, 1,69,82,
+ 3,35,62, 1,69,80, 2,38,13, 1,69,78, 2,38,10, 3,35,68, 2,44,89, 3,35,72,
+ 3,35,74, 3,35,67, 0, 0, 0, 0, 0, 0, 1,74,23, 2,44,81, 1,78,35, 2,44,91,
+ 1,74,26, 2,45, 1, 1,74,32, 2,44,76, 3,40,84, 4,37,91, 2,44,92, 2,44,73,
+ 3,40,77, 2,44,94, 2,44,77, 3,40,78, 1,74,39, 1,74,36, 2,44,93, 2,44,87,
+ 1,74,22, 1,74,30, 1,74,29, 3,40,80, 1,74,28, 1,74,34, 3,40,73, 2,44,74,
+ 1,74,35, 2,44,88, 1,74,31, 1,74,21, 2,44,90, 1,74,24, 1,74,25, 1,74,33,
+ 2,44,79, 2,44,78, 2,44,75, 4,37,92, 2,44,83, 2,44,80, 2,44,84, 1,74,38,
+ 3,40,72, 2,45, 2, 1,74,27, 2,44,85, 2,44,86, 3,40,81, 2,44,82, 3,40,83,
+ 3,70, 9, 3,40,75, 1,74,37, 3,70,11, 0, 0, 0, 0, 0, 0, 3,46, 2, 2,50,79,
+ 1,78,27, 1,78,36, 1,78,32, 2,50,76, 3,45,92, 1,78,29, 1,78,33, 2,50,88,
+ 1,78,23, 2,50,80, 3,45,88, 1,78,31, 3,46, 4, 3,46,15, 2,50,83, 2,50,78,
+ 1,78,30, 1,78,34, 2,50,77, 3,46,14, 1,78,28, 3,45,87, 2,50,87, 1,78,25,
+ 2,50,86, 2,50,85, 1,78,37, 2,48,27, 1,78,24, 3,46,11, 2,50,84, 2,50,75,
+ 3,45,85, 1,78,38, 2,50,82, 1,78,26, 3,46, 8, 3,46, 9, 3,46, 5, 3,46,12,
+ /* plane 0, page 126 */
+ 0, 158, /* first, last */
+ 3,46, 7, 3,45,94, 3,45,93, 2,50,81, 4,44,37, 0, 0, 0, 0, 0, 0, 3,70,10,
+ 1,81,74, 1,81,79, 1,81,72, 2,57,36, 2,57,27, 2,57,39, 2,57,31, 2,57,37,
+ 1,81,80, 1,81,73, 2,57,24, 2,57,30, 2,57,40, 2,57,33, 2,57,38, 2,57,26,
+ 4,50,44, 3,50,27, 2,57,34, 1,81,75, 2,57,32, 1,81,78, 1,81,77, 2,57,28,
+ 2,57,29, 2,57,25, 2,57,35, 1,81,76, 2,57,42, 2,57,41, 3,50,32, 3,50,31,
+ 0, 0, 0, 2,62,39, 2,62,35, 1,84,73, 3,53,89, 2,62,29, 1,84,67, 1,84,83,
+ 2,62,41, 1,84,75, 1,84,71, 2,62,32, 1,84,78, 1,84,81, 2,62,43, 1,84,70,
+ 2,62,34, 1,84,79, 2,62,45, 2,62,42, 2,62,30, 1,84,74, 1,84,68, 1,84,82,
+ 2,62,37, 1,84,77, 2,62,31, 1,84,72, 2,62,44, 1,84,76, 1,84,69, 2,62,38,
+ 1,84,80, 2,62,36, 0, 0, 0, 0, 0, 0, 2,62,40, 3,53,90, 4,60,63, 3,56,57,
+ 2,66,58, 2,66,64, 1,87, 5, 2,66,67, 1,86,94, 1,87, 1, 2,66,59, 2,66,66,
+ 2,66,61, 1,87, 6, 1,87, 3, 3,56,59, 2,66,57, 3,56,56, 1,87, 2, 2,66,63,
+ 2,66,65, 1,87, 4, 2,66,62, 2,66,60, 3,70,12, 4,60,62, 3,56,58, 0, 0, 0,
+ 2,70,34, 1,88,66, 1,88,67, 1,88,63, 3,58,82, 1,88,64, 3,58,84, 2,70,30,
+ 2,70,28, 3,58,85, 2,70,32, 1,88,68, 2,70,33, 2,70,26, 2,70,25, 2,70,29,
+ 2,70,27, 1,88,65, 2,70,31, 2,73,57, 1,90,11, 1,90,10, 2,73,58, 3,60,76,
+ 2,73,60, 2,73,59, 1,90,12, 0, 0, 0, 3,62,51, 3,62,48, 2,75,89, 2,75,86,
+ 2,75,87, 3,62,49, 2,75,85, 2,75,88, 1,90,93, 2,75,90, 3,62,50, 1,90,92,
+ 0, 0, 0, 2,77,79, 3,63,58, 1,92,33, 1,92,35, 2,79,29, 1,92,34, 2,80,39,
+ 2,81,15, 2,81,17, 2,81,14, 2,81,16, 1,93,25, 4,77,88, 3,66,21,
+ /* plane 0, page 127 */
+ 54, 255, /* first, last */
+ 1,40,47, 4, 5,55,
+ 1,50,94, 2,16,50, 1,55,45, 3,24,17,15,17,88, 1,60,63, 2,31, 2, 2,31, 3,
+ 3,70,13, 3,40,87, 0, 0, 0, 2,57,43, 1,84,84, 2,62,46, 3,53,93, 3,56,60,
+ 1,87, 7, 0, 0, 0, 2,70,36, 2,70,35, 1,90,13, 2,75,91, 3,63,59, 2,77,80,
+ 1,92,68, 2, 2,73, 4, 2, 1, 0, 0, 0, 1,47,12, 1,43,24, 0, 0, 0,15, 8,42,
+ 2,12,78, 3,10,46, 0, 0, 0, 2,18, 4, 2,17,93, 2,18, 3, 2,18, 1, 1,55,46,
+ 2,18, 2, 2,17,94, 3,19,28, 2,24,22, 4,26,11, 2,31, 4, 2,31, 5, 2,38,16,
+ 2,38,17, 1,69,85, 1,69,86, 2,38,15, 2,38,18, 2,38,14, 1,69,84, 3,40,88,
+ 1,74,40, 3,40,89, 1,69,87, 2,45, 3, 0, 0, 0, 1,78,39, 2,50,89, 1,78,40,
+ 3,46,16, 1,81,81, 2,57,46, 2,57,44, 2,57,45, 2,62,49, 2,62,48, 2,62,47,
+ 7,33,65, 0, 0, 0, 4,60,72, 2,70,37, 4,64,79, 1,88,69, 2,70,38, 2,77,81,
+ 1,92,69, 2,80,40, 1,40,48, 1,47,14, 1,47,13, 2,12,80, 1,51, 1, 3,14,61,
+ 4,15,16, 2,12,79, 2,18, 6, 3,19,29, 1,55,47, 2,24,23, 2,18, 5, 3,19,31,
+ 4,15,15, 3,19,30, 1,60,65, 2,24,26, 2,24,24, 2,24,25, 1,60,64, 0, 0, 0,
+ 2,31, 7, 2,31, 8, 2,31, 6, 3,35,78, 1,69,90, 2,38,20, 2,38,19, 2,38,21,
+ 1,69,89, 1,69,88, 0, 0, 0, 4,38, 6, 2,50,90, 2,50,92, 3,46,17, 1,78,41,
+ 2,50,91, 2,57,47, 1,81,82, 2,66,69, 3,56,61, 2,66,68, 1,88,70, 2,70,39,
+ 1,88,72, 1,88,71, 2,73,61, 2,75,92, 1,90,94, 1,40,49, 2,12,81, 1,51, 2,
+ 2,18, 9, 1,55,49, 2,18, 8, 2,18, 7, 3,19,34, 1,55,48, 3,19,35, 2,24,32,
+ 4,20,29, 2,24,34, 2,24,27, 2,24,28, 1,60,66, 2,24,29, 1,60,67, 2,24,33,
+ 2,24,30, 2,24,31, 1,60,68, 3,30,23, 1,65,36, 1,65,37, 3,30,24, 2,31, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,38,22, 2,38,23, 3,35,82, 2,45, 7, 1,74,43,
+ 1,74,41, 1,74,42, 2,45, 4, 2,45, 5, 6,64,56, 2,45, 6, 2,51, 3, 3,46,18,
+ 2,51, 4, 1,78,42, 2,51, 1, 2,50,94, 2,51, 2, 2,50,93, 1,81,85, 2,57,48,
+ 1,81,83, 1,81,84, 2,62,51, 1,84,85, 2,62,50, 2,65,20, 3,53,94, 2,66,70,
+ 2,66,71, 1,87, 8, 3,56,65, 1,87, 9, 1,84,86, 2,70,40, 2,70,41, 2,73,62,
+ /* plane 0, page 128 */
+ 0, 255, /* first, last */
+ 1,90,14, 1,40,50, 3,70,91, 1,40,51, 1,55,51, 1,47,15, 1,55,50, 2,12,82,
+ 3,24,22, 4,11, 5, 3,19,36, 1,65,38, 1,40,52, 1,51, 4, 2,12,83, 2,12,84,
+ 1,51, 3, 1,51, 5, 1,40,53, 4, 7,65, 2,12,85, 1,55,53, 2,18,10, 1,55,55,
+ 1,55,52, 1,55,54, 3,24,23, 2,24,37, 1,60,69, 3,24,25, 2,24,36, 2,24,35,
+ 4,26,24, 2,38,24, 0, 0, 0, 3,41, 2, 2,45, 8, 4,38,12, 1,78,43, 0, 0, 0,
+ 1,81,86, 2,57,50, 2,57,49, 3,54, 1, 2,62,52, 4,60,81, 3,56,66, 3,60,79,
+ 2,75,93, 4,73,14, 4,73,13, 1,40,54, 2, 4,83, 2, 8,42, 1,51, 6, 2,12,86,
+ 6,27, 1, 2,18,12, 4,15,26, 3,19,41, 3,19,40, 1,55,56, 2,18,11, 1,55,57,
+ 3,19,39, 3,70,15, 0, 0, 0, 2,24,39, 3,24,29, 3,24,28, 1,60,71, 2,24,38,
+ 2,24,40, 3,24,27, 1,60,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,30,28, 2,31,11,
+ 2,31,12, 2,31,10, 1,65,39, 3,71, 9, 0, 0, 0, 4,31,92, 1,69,91, 3,35,83,
+ 1,69,92, 4,38,19, 1,74,45, 3,41, 3, 2,45,10, 2,45, 9, 1,74,44, 3,41, 6,
+ 3,30,27, 3,41, 5, 0, 0, 0, 3,70,16, 2,51, 5, 3,46,20, 3,46,22, 2,51, 6,
+ 3,46,23, 0, 0, 0, 3,46,21, 3,46,24, 2,57,51, 4,50,60, 3,50,35, 1,84,90,
+ 1,84,89, 1,84,87, 1,84,88, 1,84,91, 3,54, 2, 2,66,72, 1,87,11, 1,87,10,
+ 2,70,42, 2,73,63, 3,60,80, 3,60,81, 3,60,82, 1,91,79, 1,91,78, 1,40,55,
+ 0, 0, 0, 6,27, 4, 2,15,93, 0, 0, 0, 1,69,94, 1,65,40, 1,69,93, 1,74,46,
+ 6,64,64, 1,40,56, 2, 1,72, 1,40,57, 1,40,58, 3, 4,21, 3, 4,22, 2, 8,43,
+ 2, 4,86, 3, 7, 4, 2, 4,87, 1,43,26, 3, 7, 6, 2, 4,84, 1,43,25, 3, 7, 5,
+ 1,43,28, 2, 4,85, 1,43,30, 1,43,29, 2, 4,88, 1,43,27, 4, 4,80, 3, 7, 3,
+ 0, 0, 0, 1,47,20, 1,47,18, 2, 8,45, 3,10,54, 1,47,17, 3,10,59, 3,10,56,
+ 3,10,47, 1,47,22, 1,47,24, 1,47,21, 3,10,57, 2, 8,48, 2, 8,44, 1,47,25,
+ 3,10,50, 1,47,19, 1,43,31, 3,10,52, 1,47,23, 2, 8,47, 3,10,55, 4, 7,68,
+ 2, 8,46, 4, 7,73, 1,47,16, 3,70,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2,12,92, 1,51,10, 1,51,11, 2,12,94, 3,14,70, 2,12,88,
+ 2,12,91, 2,13, 6, 2,13, 4, 3,14,64, 1,51,12, 2,13,10, 1,51,15, 2,13, 7,
+ 2,12,93, 2,12,90, 3,14,65, 3,14,62, 2,31,14, 2,13, 5, 1,51, 7, 2,13, 8,
+ 2,12,87, 2,13, 2, 1,51, 9, 1,51,14, 2,13, 3, 1,51,18, 1,51,16, 3,14,69,
+ 2,12,89, 1,51,13, 3,14,68, 2,13, 1, 1,51,17, 1,51, 8, 2,13, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,55,62, 3,19,44, 1,55,71,
+ 1,55,60, 1,55,58, 2,18,14, 1,55,66, 1,55,63, 2,18,16, 3,19,42, 3,19,50,
+ 1,55,65, 2,18,15, 2,18,13, 2,18,18, 1,55,70, 1,55,68, 2,31,13, 3,19,43,
+ /* plane 0, page 129 */
+ 0, 255, /* first, last */
+ 2,18,19, 2,18,17, 1,55,59, 3,19,46, 3,19,45, 1,55,61, 1,55,64, 3,19,47,
+ 1,55,67, 3,14,67, 1,55,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,30,36, 2,24,50, 1,60,73, 3,24,41,
+ 2,24,41, 2,24,43, 3,24,39, 2,24,44, 4,20,45, 2,24,52, 2,24,48, 2,24,46,
+ 4,26,27, 2,24,49, 2,24,53, 1,60,74, 1,60,78, 2,24,42, 4,20,39, 2,24,51,
+ 4,20,48, 1,60,76, 3,24,33, 1,60,75, 2,24,47, 2,24,45, 3,24,34, 1,60,72,
+ 1,60,77, 3,24,37, 0, 0, 0, 0, 0, 0, 3,24,40, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1,65,46, 2,31,22, 3,30,30, 4,26,30, 2,31,20, 1,65,48, 4,26,39,
+ 3,30,35, 3,30,37, 3,30,33, 2,31,15, 2,38,38, 3,30,29, 1,65,47, 2,31,19,
+ 3,30,32, 3,30,34, 2,31,16, 1,65,43, 1,65,49, 2,31,21, 1,65,45, 2,31,18,
+ 1,74,47, 1,65,44, 2,31,17, 1,65,50, 1,65,42, 1,65,41, 0, 0, 0, 0, 0, 0,
+ 6,35,58, 0, 0, 0, 0, 0, 0, 2,38,30, 2,38,28, 3,35,91, 2,38,34, 3,35,94,
+ 2,38,26, 2,38,39, 2,38,31, 3,35,85, 2,38,25, 1,70, 4, 1,70,10, 2,38,36,
+ 4,32, 9, 2,38,29, 3,35,86, 1,70, 7, 3,35,87, 3,36, 3, 1,70, 5, 2,38,37,
+ 1,70, 2, 1,70, 1, 2,38,32, 1,70, 6, 1,65,51, 3,35,92, 2,38,35, 2,38,27,
+ 1,70, 3, 1,70, 8, 1,70, 9, 0, 0, 0, 0, 0, 0, 3,36, 2, 0, 0, 0, 1,74,52,
+ 1,74,48, 3,41, 7, 1,74,53, 2,45,13, 3,41,10, 4,38,25, 2,45,12, 2,45,14,
+ 1,74,50, 2,45,11, 1,74,51, 2,45,17, 2,45,16, 2,45,15, 4,38,38, 1,74,49,
+ 4,50,71, 0, 0, 0, 3,46,27, 3,46,29, 3,46,25, 2,51,10, 3,46,28, 2,51,13,
+ 1,78,49, 2,51,12, 1,78,48, 1,78,44, 1,78,45, 1,78,46, 2,51, 9, 2,51, 8,
+ 1,78,47, 3,46,26, 2,51,11, 2,51, 7, 0, 0, 0, 0, 0, 0, 2,57,53, 2,57,63,
+ 1,81,89, 1,81,88, 3,50,41, 2,57,57, 2,57,59, 3,50,39, 2,57,54, 3,50,36,
+ 2,57,58, 2,57,52, 2,57,61, 1,81,87, 2,57,60, 2,57,56, 0, 0, 0, 2,57,62,
+ 3,54, 3, 2,57,55, 1,84,94, 2,62,53, 2,62,59, 1,85, 4, 1,85, 6, 1,85, 3,
+ 1,85, 2, 4,56, 7, 1,85, 1, 1,84,93, 2,62,54, 2,62,57, 1,84,92, 2,62,58,
+ 3,54, 4, 1,85, 5, 2,62,56, 7,40,92, 2,62,55, 1,87,12, 3,56,69, 1,87,13,
+ 2,66,75, 2,66,73, 2,66,74, 0, 0, 0, 3,58,87, 2,70,44, 3,58,88, 2,70,43,
+ 1,88,73, 2,73,65, 1,90,15, 2,73,64, 0, 0, 0, 2,75,94, 2,77,82, 1,91,80,
+ 2,81,18, 2,81,19, 1,92,36, 1,40,59, 4, 7,76, 1,47,26, 2,31,23, 1,74,54,
+ 1,85, 7, 2,62,60, 1,40,60, 4, 4,83, 1,55,73, 1,55,72, 2,31,24, 3,30,39,
+ 4,26,44, 4,44,66, 2,57,64, 1,40,61, 1,51,19, 4,26,45, 3,30,40, 2,31,25,
+ 2,31,26, 2,31,27, 1,74,55, 1,81,90, 1,40,62, 4, 7,77, 1,47,27, 2,13,11,
+ /* plane 0, page 130 */
+ 0, 255, /* first, last */
+ 1,55,74, 2,18,20, 1,60,79, 3,30,41, 2,31,28, 1,70,11, 0, 0, 0, 1,74,56,
+ 1,81,91, 1,85, 8, 1,87,14, 2,70,45, 1,40,63, 1,47,28, 3,10,61, 4, 7,78,
+ 1,55,75, 2,24,54, 1,65,52, 3,41,11, 1,74,57, 2,45,18, 2,51,14, 0, 0, 0,
+ 3,50,42, 3,56,72, 3,58,89, 1,40,64, 1,65,53, 2,38,40, 1,74,58, 1,40,65,
+ 2, 8,49, 2,13,12, 1,51,20, 0, 0, 0, 3,14,72, 2,18,22, 4,15,47, 3,19,55,
+ 1,55,78, 3,19,56, 1,55,76, 1,55,77, 1,55,79, 3,19,53, 0, 0, 0, 2,18,21,
+ 0, 0, 0, 0, 0, 0, 2,24,59, 2,24,56, 2,24,58, 1,60,80, 1,60,82, 1,60,81,
+ 2,24,55, 1,60,83, 2,24,57, 0, 0, 0, 2,31,29, 2,31,30, 0, 0, 0, 2,31,31,
+ 2,38,43, 3,36, 6, 2,38,44, 4,32,14, 2,38,42, 2,38,45, 4,32,13, 1,70,12,
+ 3,70,20, 2,38,41, 3,41,13, 1,74,59, 3,41,14, 0, 0, 0, 2,51,19, 2,51,15,
+ 2,51,18, 2,51,20, 2,51,17, 2,51,16, 0, 0, 0, 2,57,65, 2,57,66, 2,57,67,
+ 1,81,92, 1,81,93, 2,62,62, 2,62,61, 2,62,63, 0, 0, 0, 2,66,77, 2,66,76,
+ 0, 0, 0, 2,70,47, 3,58,90, 2,70,48, 2,70,46, 3,58,91, 1,90,16, 4,68,12,
+ 2,73,66, 2,73,67, 3,62,53, 2,77,83, 2,79,30, 2,80,41, 1,40,66, 1,43,32,
+ 0, 0, 0, 1,85, 9, 1,40,67,15,18,18, 2,24,60, 2,31,32, 3,58,92, 1,92,76,
+ 2, 2,74, 4, 1,51, 0, 0, 0, 3, 4,24, 2, 2,75, 2, 2,77, 1,40,68, 2, 2,78,
+ 2, 2,76, 4, 3,15, 0, 0, 0, 2, 5, 2, 2, 5, 3, 2, 4,91, 3, 7, 8, 4, 4,91,
+ 0, 0, 0, 4, 4,85, 2, 5, 1, 1,43,34, 3, 7, 9, 1,43,35, 2, 4,92, 2, 4,90,
+ 2, 4,89, 2, 4,93, 1,43,33, 2, 4,94, 2,13,13, 3, 7,11, 4, 4,89, 0, 0, 0,
+ 2, 8,54, 1,47,31, 2, 8,53, 2, 8,55, 3,10,64, 1,47,30, 2, 8,60, 1,47,34,
+ 2, 8,50, 2, 8,64, 2, 8,70, 1,47,41, 2, 8,67, 1,47,38, 3,10,75, 2, 8,57,
+ 2, 8,63, 2, 8,65, 3,10,70, 2, 8,52, 1,47,37, 1,47,32, 2, 8,58, 1,47,39,
+ 1,47,42, 1,47,36, 3,10,76, 1,47,29, 2, 8,62, 2, 8,56, 2, 8,69, 1,47,44,
+ 1,47,40, 1,47,35, 2, 8,61, 1,55,80, 2, 8,59, 1,47,33, 1,47,43, 4, 7,90,
+ 2, 8,51, 4, 7,94, 2, 8,66, 2, 8,68, 3,10,62,15, 8,67, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,10,72, 4, 7,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3,14,86, 1,51,37, 1,51,31, 1,51,39, 1,51,36, 2,13,20, 2,13,23, 1,51,32,
+ 3,14,74, 2,13,14, 4,11,26, 1,51,25, 1,51,35, 3,14,75, 1,51,38, 1,51,40,
+ 2,13,35, 2,13,26, 3,14,88, 1,51,24, 2,13,34, 1,51,28, 1,51,26, 1,51,21,
+ 2,13,18, 3,14,82, 2,13,33, 2,13,22, 2,13,25, 2,13,38, 3,14,84, 1,51,41,
+ 2,13,32, 1,51,33, 2,13,27, 2,13,37, 2,13,24, 2,13,28, 2,13,31, 3,14,73,
+ 3,14,78, 2,13,16, 2,13,36, 2,13,30, 3,14,79, 3,14,90, 2,13,15, 6,20,28,
+ /* plane 0, page 131 */
+ 0, 255, /* first, last */
+ 2,13,19, 1,51,34, 1,51,29, 1,51,22, 1,51,27, 1,51,23, 1,51,42, 2,13,17,
+ 2,18,39, 1,51,30, 4,11,29, 3,14,89, 2,13,29, 2, 9,34, 3,14,87, 0, 0, 0,
+ 3,70,21, 0, 0, 0, 3,70,23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,18,42, 1,55,94,
+ 3,19,66, 2,18,26, 4,15,61, 2,18,37, 2,18,33, 3,24,45, 2,18,52, 3,19,57,
+ 2,18,44, 3,19,63, 2,18,34, 3,24,59, 2,18,43, 2,18,28, 2,18,32, 2,18,55,
+ 1,56, 3, 2,18,47, 2,18,38, 1,55,81, 2,18,53, 2,18,24, 4,15,58, 2,18,46,
+ 4,15,67, 1,56, 2, 1,55,91, 2,18,23, 1,55,89, 1,55,88, 1,55,93, 2,18,45,
+ 1,55,85, 1,55,92, 2,13,21, 2,31,33, 2,18,40, 4,15,63, 3,10,63, 2,18,30,
+ 1,56, 1, 2,18,31, 2,18,35, 1,56, 4, 2,18,25, 2,18,49, 3,30,55, 2,18,48,
+ 2,18,56, 1,55,87, 1,55,84, 2,18,54, 2,18,50, 2,18,41, 2,18,36, 1,55,90,
+ 1,55,86, 2,18,27, 1,55,82, 2,18,51, 1,55,83, 4,15,60, 2,18,29, 3,19,58,
+ 3,19,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,70,22, 3,13,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,20,71, 3,24,46, 3,24,49, 2,24,66, 2,24,68, 2,24,73, 2,24,93, 1,61, 3,
+ 1,60,87, 3,24,52, 2,24,65, 1,61, 4, 1,61, 5, 2,24,76, 2,24,83, 2,24,89,
+ 3,24,48, 2,24,70, 4,20,77, 2,24,77, 3,24,47, 3,24,61, 1,61, 6, 2,24,91,
+ 2,24,86, 1,61, 1, 1,60,93, 2,24,82, 2,24,78, 2,24,64, 1,60,84, 2,24,69,
+ 2,24,61, 3,24,53, 1,60,92, 1,60,94, 2,24,74, 2,24,71, 1,60,89, 2,24,87,
+ 1,60,86, 2,24,72, 2,31,74, 2,24,80, 3,24,62, 2,24,79, 1,60,85, 3,24,55,
+ 1,61, 2, 3,24,50, 1,60,88, 2,24,62, 2,24,67, 2,24,84, 2,24,90, 1,61, 7,
+ 2,24,63, 2,24,75, 2,24,81, 1,60,91, 4,20,79, 3,24,56, 2,24,92, 2,24,85,
+ 2,24,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,24,63,
+ 0, 0, 0,15,23,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,60,90, 4,26,72, 2,31,49,
+ 2,31,37, 1,65,61, 2,31,66, 2,31,75, 2,31,78, 1,65,59, 2,31,45, 2,31,70,
+ 2,31,46, 2,31,60, 1,65,72, 2,31,56, 1,65,69, 3,30,62, 2,31,57, 2,31,34,
+ 5,27,79, 2,31,71, 3,30,47, 3,30,57, 1,65,78, 2,31,68, 2,31,58, 2,31,80,
+ 2,31,53, 2,38,77, 3,30,45, 2,31,83, 1,65,76, 2,31,51, 2,31,63, 1,65,79,
+ 1,65,58, 2,31,55, 2,31,81, 2,31,48, 2,31,41, 2,31,52, 3,30,63, 2,31,40,
+ 2,31,38, 1,65,54, 2,31,72, 2,31,47, 2,31,76, 3,30,43, 2,31,77, 1,65,62,
+ 1,65,67, 1,65,63, 1,65,71, 2,31,67, 1,65,64, 2,31,59, 2,31,43,15,30,70,
+ 1,65,56, 2,31,35, 2,31,69, 2,31,79, 2,31,42, 1,65,70, 2,31,84, 2,31,54,
+ /* plane 0, page 132 */
+ 0, 255, /* first, last */
+ 3,30,50, 2,31,50, 3,30,60, 1,65,55, 1,65,75, 3,30,58, 2,31,65, 1,65,77,
+ 3,30,48, 2,31,61, 1,65,66, 1,65,60, 1,65,68, 1,65,57, 1,65,74, 2,31,62,
+ 2,31,44, 2,31,64, 2,31,39, 2,31,73, 3,30,56, 4,26,71, 3,30,61, 3,30,54,
+ 3,30,46, 0, 0, 0, 0, 0, 0, 2,31,82, 0, 0, 0, 0, 0, 0, 3,70,25, 3,30,59,
+ 0, 0, 0, 3,70,24, 0, 0, 0, 2,31,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2,38,76, 3,36,13, 2,39, 4, 1,69,60, 2,38,81, 3,36,17, 2,38,79,
+ 2,38,58, 1,70,16, 2,38,74, 2,38,94, 2,38,70, 1,70,24, 2,38,93, 2,38,68,
+ 1,65,73, 2,38,84, 2,38,69, 2,38,91, 1,70,23, 1,70,15, 3,36,26, 2,38,47,
+ 2,38,55, 3,36,21, 2,38,80, 2,38,72, 2,39, 3, 2,38,75, 1,70,29, 2,38,92,
+ 3,36,12, 1,70,20, 3,36,30, 2,38,78, 2,38,86, 2,38,59, 2,38,85, 3,36, 7,
+ 2,39, 8, 2,38,54, 2,38,87, 3,36,19, 2,39, 6, 3,36,31, 2,38,48, 1,65,65,
+ 3,36,32, 2,38,62, 2,38,61, 1,70,22, 3,36,18, 2,38,65, 2,38,67, 2,38,82,
+ 2,39, 5, 1,70,25, 3,36,24, 1,70,26, 3,36,16, 2,38,53, 1,70,18, 2,38,57,
+ 2,39, 1, 1,70,27, 4,32,36, 1,70,19, 1,70,21, 1,70,28, 2,39, 7, 2,38,88,
+ 2,38,83, 3,36,28, 3,36,15, 2,38,64, 2,38,63, 1,70,17, 2,38,49, 1,70,14,
+ 2,38,73, 2,38,50, 2,38,71, 3,36,14, 4,32,33, 2,38,60, 2,39, 2, 3,36,10,
+ 3,36,25, 4,32,22, 1,70,13, 3,36,27, 3,36, 8, 0, 0, 0, 2,38,56, 0, 0, 0,
+ 4,32,38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,38,52, 2,38,90, 2,38,51,
+ 1,74,72, 2,45,58, 3,41,21, 3,41,36, 2,45,41, 3,41,19, 3,41,24, 2,45,19,
+ 2,45,49, 1,74,64, 2,45,34, 2,45,44, 1,74,67, 2,45,37, 1,74,65, 2,45,22,
+ 2,45,52, 2,45,21, 2,45,40, 3,41,28, 2,45,20, 3,41,25, 4,38,76, 2,45,38,
+ 2,45,47, 2,45,45, 2,45,33, 2,45,28, 2,45,26, 3,41,34, 2,45,27, 2,45,46,
+ 2,45,57, 2,45,35, 1,74,66, 3,41,27, 2,45,30, 3,41,26, 2,45,50, 3,41,33,
+ 1,74,69, 2,45,29, 2,45,23, 2,45,39, 1,74,73, 3,41,18, 4,38,56, 1,74,61,
+ 1,74,70, 2,45,31, 2,45,25, 3,41,22, 1,74,63, 2,38,89, 1,74,62, 2,45,42,
+ 3,36,22, 1,74,60, 1,74,75, 1,74,68, 2,45,43, 2,45,32, 2,45,24, 2,45,51,
+ 2,45,36, 1,74,74, 2,45,55, 1,74,71, 2,45,54, 3,41,31, 2,45,48, 2,45,53,
+ 3,41,30, 0, 0, 0, 3,41,35, 2,45,56, 0, 0, 0, 0, 0, 0, 3,70,27, 0, 0, 0,
+ 0, 0, 0, 3,70,28, 3,70,26, 0, 0, 0, 3,41,29, 0, 0, 0, 0, 0, 0, 2,51,60,
+ 2,51,61, 2,51,48, 2,51,47, 2,51,43, 1,78,61, 3,46,47, 1,78,53, 2,51,63,
+ 2,51,62, 2,38,46, 2,51,40, 2,51,44, 2,51,38, 3,46,36, 2,51,57, 2,51,42,
+ 3,46,34, 2,51,64, 2,51,35, 2,51,33, 2,51,45, 2,51,55, 2,51,50, 1,78,63,
+ /* plane 0, page 133 */
+ 0, 255, /* first, last */
+ 2,51,24, 3,46,32, 2,51,54, 3,46,44, 3,46,38, 3,46,52, 1,78,64, 2,38,66,
+ 2,51,36, 2,51,27, 2,51,30, 2,51,68, 2,51,37, 2,51,28, 2,51,26, 2,51,23,
+ 4,44,90, 1,78,57, 2,51,46, 1,78,56, 1,78,60, 2,51,41, 2,51,49, 1,78,50,
+ 2,51,65, 2,51,69, 1,78,52, 3,46,43, 2,51,32, 2,51,52, 2,51,56, 2,51,29,
+ 2,51,66, 1,78,59, 4,44,74, 1,78,58, 2,51,21, 1,78,62, 2,51,59, 2,51,31,
+ 2,51,51, 2,51,25, 2,51,39, 2,51,34, 1,78,54, 1,78,55, 2,51,53, 2,51,70,
+ 2,51,67, 2,51,58, 4,44,88, 3,46,45, 3,46,46, 3,46,50, 0, 0, 0, 0, 0, 0,
+ 4,44,84, 0, 0, 0, 0, 0, 0, 2,51,22, 0, 0, 0, 1,78,51, 2,57,84, 3,50,58,
+ 2,57,75, 2,57,78, 3,50,50, 1,82, 5, 2,57,80, 2,57,69, 2,57,76, 2,57,82,
+ 1,82, 2, 1,82, 6, 1,81,94, 3,50,57, 3,50,48, 2,57,71, 2,57,87, 4,45, 5,
+ 4,51,19, 2,57,81, 4,51, 4, 2,57,72, 2,58, 2, 2,57,90, 2,57,68, 2,62,82,
+ 2,57,74, 1,82, 1, 3,50,56, 2,57,85, 3,50,52, 2,58, 1, 1,82, 9, 3,50,54,
+ 2,57,92, 2,57,73, 2,57,79, 2,57,83, 2,57,77, 2,58, 3, 2,57,94, 2,57,91,
+ 1,82, 3, 1,82, 4, 1,82, 8, 2,57,70, 2,58, 4, 1,82, 7, 2,57,88, 3,50,47,
+ 3,50,53, 2,57,86, 0, 0, 0, 3,70,29, 0, 0, 0, 2,57,89, 2,63, 1, 2,62,76,
+ 2,62,81, 2,62,94, 2,62,80, 2,62,72, 2,62,77, 4,56,30, 1,85,12, 3,54,11,
+ 2,62,65, 2,62,89, 2,62,91, 2,62,64, 1,85,11, 2,62,93, 2,62,85, 1,85,18,
+ 2,62,92, 2,62,78, 1,85,20, 2,62,70, 2,57,93, 2,62,86, 2,62,83, 2,62,66,
+ 2,63, 3, 1,85,14, 3,54, 8, 3,54, 9, 1,85,15, 2,62,68, 2,62,84, 3,54,13,
+ 2,63, 2, 2,62,87, 2,62,74, 1,85,17, 1,85,13, 2,62,88, 2,62,75, 2,63, 4,
+ 2,62,69, 2,62,79, 2,62,90, 2,62,71, 2,62,73, 4,56,32, 1,85,21, 2,62,67,
+ 1,85,19, 1,87,16, 1,85,10, 3,54,12, 3,54,16, 0, 0, 0, 0, 0, 0, 1,85,16,
+ 1,87,20, 2,66,93, 3,56,76, 2,66,83, 2,66,78, 2,66,84, 2,66,94, 2,67, 4,
+ 2,67, 3, 1,87,22, 1,87,21, 3,56,78, 4,61,12, 2,66,85, 2,67, 5, 2,66,88,
+ 2,66,80, 3,56,79, 2,66,82, 2,66,81, 2,66,87, 2,66,92, 2,66,79, 2,66,86,
+ 2,66,91, 1,87,19, 4,61, 8, 2,66,89, 3,56,75, 1,87,17, 2,66,90, 1,87,15,
+ 1,87,18, 2,70,64, 2,67, 1, 0, 0, 0, 3,70,30, 1,88,77, 3,58,94, 2,70,56,
+ 2,70,60, 2,70,52, 2,70,55, 3,58,93, 2,70,63, 1,88,75, 2,70,68, 2,70,61,
+ 4,64,90, 2,70,53, 2,70,69, 2,70,62, 1,88,78, 1,88,79, 2,70,66, 3,59, 2,
+ 2,70,54, 1,88,74, 1,88,76, 2,70,49, 2,70,57, 2,70,51, 3,60,91, 2,70,67,
+ 2,70,65, 2,70,50, 2,70,58, 4,64,91, 3,59, 5, 3,70,31, 2,73,74, 1,88,80,
+ 2,70,59, 1,90,18, 1,90,20, 1,90,17, 3,60,86, 2,73,79, 2,73,71, 2,73,69,
+ /* plane 0, page 134 */
+ 0, 255, /* first, last */
+ 2,73,73, 2,73,70, 3,60,88, 3,60,92, 2,73,75, 2,73,77, 1,90,21, 1,90,23,
+ 3,61, 2, 2,73,76, 1,90,24, 1,90,22, 2,73,78, 3,60,94, 4,68,23, 3,61, 3,
+ 3,60,87, 1,90,19, 0, 0, 0, 3,61, 1, 0, 0, 0, 3,62,59, 3,62,58, 1,91, 1,
+ 2,76, 1, 2,76, 7, 1,91, 3, 2,73,72, 2,76, 6, 3,62,60, 2,76,13, 2,76, 4,
+ 2,76,11, 2,76,10, 2,73,68, 2,76, 5, 2,67, 2, 2,76,14, 2,76, 3, 2,76, 8,
+ 3,62,56, 2,76,12, 2,76, 2, 3,62,54, 2,77,87, 1,91, 2, 2,76, 9, 3,62,55,
+ 0, 0, 0, 2,79,35, 2,77,88, 2,77,86, 2,77,84, 2,77,85, 2,77,89, 3,70,32,
+ 1,92,37, 2,79,33, 2,79,31, 2,79,36, 2,79,34, 3,64,35, 2,79,37, 1,92,38,
+ 2,79,32, 3,64,15, 3,65,38, 2,80,42, 0, 0, 0, 3,70,33, 2,81,20, 2,81,21,
+ 2,81,22, 3,65,39, 3,65,92, 2,82,21, 2,82,13, 2, 2,79, 1,47,45, 0, 0, 0,
+ 1,51,43, 4,15,72, 2,18,58, 2,18,57, 1,56, 5, 1,61, 8, 2,25, 1, 3,24,67,
+ 3,24,64, 2,24,94, 3,24,65, 1,65,80, 1,70,31, 3,30,65, 1,70,30, 1,70,32,
+ 5,41,46, 2,45,59, 2,51,71, 2,58, 5, 2,58, 7, 2,58, 6, 7,18,65, 1,85,22,
+ 2,63, 5, 2,67, 6, 2,81,83, 1,40,69, 3, 7,13, 2, 8,73, 2, 8,74, 2, 8,72,
+ 2, 8,71, 1,47,46, 3,70,34, 2,13,42, 2,13,40, 3,15, 3, 3,14,92, 2,13,39,
+ 3,14,94, 1,51,44, 1,51,46, 1,51,45, 2,13,41, 3,15, 4,15,13,30, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,19,73, 2,18,70, 2,18,67, 2,18,65,
+ 4,15,77, 3,19,76, 1,56, 6, 2,18,68, 1,56,11, 2,18,62, 2,18,77, 3,19,79,
+ 2,18,79, 2,18,63, 3,19,78, 1,56, 8, 2,18,80, 2,18,75, 2,18,61, 2,18,66,
+ 2,18,76, 2,18,72, 2,18,69, 3,19,75, 1,56,13, 2,18,78, 2,18,64, 3,19,74,
+ 3,19,80, 2,18,73, 2,18,59, 1,56,12, 1,56, 9, 2,18,71, 3,19,77, 2,18,74,
+ 2,18,60, 1,56,10, 1,56, 7, 0, 0, 0, 0, 0, 0, 4,20,90, 3,24,70, 1,61,18,
+ 2,25, 8, 1,61,17, 3,24,68, 2,25,11, 2,25,14, 1,61,14, 1,61,12, 2,25, 3,
+ 2,25,12, 2,25,10, 2,25, 7, 2,25,15, 2,25,16, 2,25,18, 2,25,19, 2,25, 2,
+ 1,61,11, 2,25, 5, 2,25, 4, 2,25,17, 1,61,13, 2,25, 6, 1,61,15, 1,61,10,
+ 2,25, 9, 1,61,19, 4,21, 6, 1,61,16, 2,25,13, 0, 0, 0, 0, 0, 0,15,24,26,
+ 1,65,87, 2,32, 5, 4,26,81, 2,31,88, 1,65,84, 3,30,66, 2,39,14, 2,32, 3,
+ 2,31,85, 1,65,82, 2,31,90, 1,65,85, 2,31,94, 2,31,92, 1,65,88, 1,65,81,
+ 4,26,86, 3,30,67, 2,31,86, 2,31,89, 1,65,86, 4,26,79, 2,31,87, 5,27,91,
+ 2,32, 4, 2,32, 2, 2,31,91, 2,31,93, 2,32, 1, 1,65,83, 3,30,72, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,39,15, 2,39,21, 2,39,11,
+ 2,39,17, 1,70,33, 2,39,13, 1,70,39, 3,36,36, 3,36,37, 1,70,38, 3,36,41,
+ /* plane 0, page 135 */
+ 0, 255, /* first, last */
+ 1,70,37, 2,39,20, 1,70,40, 1,70,41, 2,39,10, 2,39,23, 1,70,42, 1,70,36,
+ 1,70,35, 2,39,19, 1,70,43, 2,39, 9, 2,39,12, 2,39,22, 2,39,18, 4,32,57,
+ 4,32,50, 2,45,91, 2,45,80, 1,70,34, 5,34,61, 3,36,38, 3,36,40, 0, 0, 0,
+ 1,74,82, 2,45,68, 2,45,89, 2,45,69, 1,74,77, 3,41,47, 2,45,66, 4,32,53,
+ 2,45,75, 2,45,67, 1,74,79, 2,45,61, 2,45,88, 1,74,80, 2,45,85, 2,45,86,
+ 2,45,62, 1,74,85, 2,45,77, 3,41,42, 2,45,71, 2,45,78, 2,45,65, 4,38,94,
+ 2,45,90, 2,45,82, 2,45,76, 2,45,60, 1,74,81, 2,45,83, 3,41,37, 1,74,84,
+ 2,45,87, 3,41,44, 2,45,81, 1,74,78, 2,45,79, 3,41,41, 2,45,73, 1,74,76,
+ 2,45,64, 2,45,72, 2,45,84, 2,45,70,15,44,19, 3,41,46, 2,45,74, 3,41,43,
+ 0, 0, 0, 0, 0, 0, 3,70,35, 0, 0, 0, 1,78,74, 2,39,16, 2,51,89, 2,52, 4,
+ 2,51,88, 2,51,84, 2,51,81, 1,78,75, 2,51,79, 1,74,83, 2,51,72, 1,78,73,
+ 2,51,78, 1,78,72, 2,51,83, 2,51,80, 2,52, 2, 2,51,91, 2,51,85, 2,51,90,
+ 1,78,68, 2,51,82, 2,52, 7, 2,51,73, 2,51,74, 2,52, 3, 1,78,69, 2,52, 8,
+ 1,78,71, 2,52, 9, 2,51,87, 2,45,63, 2,51,93, 2,51,86, 2,52, 1, 2,51,92,
+ 5,48,53, 3,46,61, 4,45, 8, 2,51,77, 1,78,66, 2,52, 6, 1,78,67, 2,51,75,
+ 1,78,70, 2,58,18, 2,51,94, 2,52, 5, 4,45,17, 3,46,57, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2,58,15, 1,78,65, 1,82,10, 2,58,25, 2,58,21, 4,51,28, 2,58,19,
+ 2,58,14, 2,58,29, 3,50,59, 3,50,61, 4,51,36, 1,82,14, 3,50,63, 2,58,10,
+ 2,58,22, 2,58,23, 2,58,13, 2,58,12, 2,58,26, 4,51,33, 2,58,16, 2,58,11,
+ 2,58,17, 3,50,66, 2,58,28, 2,58, 9, 2,58,27, 2,58,24, 1,82,12, 1,82,11,
+ 4,51,25, 3,50,62, 1,82,13, 2,58,20, 2,58, 8, 3,70,37, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,70,36, 2,63, 7, 1,85,28, 2,63,11, 2,63, 8, 2,63,15, 2,63,21,
+ 2,63,10, 3,54,26, 2,63,30, 1,85,25, 2,63,24, 2,63,13, 2,63,25, 2,63,20,
+ 2,63,27, 2,63,12, 1,85,30, 1,85,29, 2,63,14, 2,63,28, 2,63, 6, 2,63,26,
+ 1,85,23, 3,54,25, 2,63,18, 2,63,17, 2,63,22, 2,63, 9, 1,85,27, 3,54,27,
+ 1,85,31, 2,63,16, 2,63,23, 1,85,32, 2,63,19, 3,54,22, 3,54,20, 0, 0, 0,
+ 0, 0, 0, 1,85,24, 1,85,26, 2,67,19, 2,67,17, 3,59, 8, 3,56,86, 2,67,23,
+ 2,67,21, 2,67,24, 3,56,88, 2,67,10, 2,67,18, 2,67,28, 2,63,29, 2,67,14,
+ 1,87,26, 2,51,76, 2,67, 9, 2,67,22, 2,67,16, 2,67,13, 2,67, 8, 2,67, 7,
+ 2,67,27, 3,56,83, 2,67,12, 2,67,11, 1,87,24, 2,67,20, 3,56,84, 1,87,23,
+ 3,56,85, 5,68,40, 1,87,25, 2,67,15, 2,67,26, 3,70,38, 2,70,73, 2,70,74,
+ 3,59,12, 1,88,84, 2,70,71, 1,88,81, 2,70,79, 3,59, 7, 1,88,85, 2,70,81,
+ /* plane 0, page 136 */
+ 0, 255, /* first, last */
+ 2,70,70, 2,67,25, 2,70,83, 2,70,72, 5,73,35, 1,88,82, 2,70,78, 3,59, 9,
+ 2,70,80, 2,70,75, 2,70,82, 2,70,77, 2,70,76, 1,88,83, 3,56,87, 3,59,11,
+ 2,73,81, 2,73,82, 3,61, 5, 2,73,84, 1,90,25, 1,90,26, 2,73,85, 2,73,83,
+ 3,61, 4, 2,73,80, 3,62,61, 2,76,17, 2,76,20, 2,76,16, 4,65, 6, 1,91, 7,
+ 2,76,18, 1,91, 6, 1,91, 5, 1,91, 4, 2,76,19, 2,77,94, 2,77,92, 3,63,63,
+ 2,77,91, 2,76,15, 2,77,93, 2,76,21, 2,77,90, 3,64,37, 2,79,40, 2,79, 6,
+ 2,79,38, 1,92,39, 2,79,39, 2,79,41, 3,70,39, 2,80,45, 1,92,70, 2,80,44,
+ 2,80,43, 1,92,71, 4,76, 3, 1,93, 7, 2,81,61, 2,81,85, 2,81,84, 2,81,86,
+ 1,40,70, 2,13,43, 3,15, 6, 2,18,81, 2,18,82, 3,24,74, 3,30,74, 3,30,73,
+ 2,32, 6, 6,46,47, 2,76,22, 2,80,46, 1,40,71, 1,51,47, 2,13,44, 3,19,81,
+ 3,70,40, 4,21, 7, 2,25,20, 1,61,20, 0, 0, 0, 2,32, 8, 2,32, 7, 1,65,89,
+ 3,36,45, 1,70,44, 2,52,10, 1,78,76, 3,46,63, 1,78,77, 3,50,67, 3,50,68,
+ 4,51,43, 1,82,15, 1,92,72, 1,40,72, 0, 0, 0, 0, 0, 0, 3,15, 7, 2,13,45,
+ 1,47,48, 2,13,47, 2,13,46, 1,51,48, 0, 0, 0, 2,18,83, 3,19,84, 2,18,90,
+ 1,56,14, 2,18,88, 2,18,86, 3,19,87, 2,18,93, 2,18,84, 2,18,85, 1,56,15,
+ 3,19,82, 1,56,19, 3,19,83, 3,19,85, 2,18,94, 1,56,18, 2,18,92, 2,18,89,
+ 2,18,87, 1,56,16, 1,56,17, 2,18,91, 3,19,86, 0, 0, 0, 0, 0, 0, 3,70,41,
+ 1,61,22, 2,25,21, 3,24,82, 1,61,27, 2,25,37, 1,61,26, 2,25,39, 3,24,78,
+ 3,24,84, 2,25,27, 1,61,24, 2,25,38, 3,24,76, 2,25,22, 1,61,25, 2,25,34,
+ 2,25,30, 2,25,32, 2,25,26, 2,25,33, 3,24,75, 4,21,15, 1,61,21, 2,25,29,
+ 3,24,83, 2,25,28, 2,25,24, 3,24,77, 2,25,35, 3,24,79, 3,24,81, 2,25,31,
+ 2,25,23, 3,24,80, 2,25,25, 1,61,23, 2,25,36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1,65,92, 2,32,19, 4,26,91, 3,30,80, 3,30,82, 2,32,15, 2,32,17,
+ 2,32,12, 2,32,11, 2,32, 9, 3,30,77, 2,32,16, 2,32,18, 2,32,14, 3,30,79,
+ 2,32,13, 1,65,90, 1,65,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2,32,21, 1,70,52, 2,39,25, 2,39,31, 2,39,26, 2,39,27, 3,36,46,
+ 2,39,32, 5,34,76, 1,70,54, 4,32,65, 1,70,46, 1,70,53, 2,39,24, 2,32,10,
+ 1,70,49, 1,70,47, 2,39,30, 2,39,29, 1,70,48, 1,70,50, 2,39,28, 1,70,45,
+ 3,36,47, 1,70,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,46,64, 2,45,93,
+ 1,74,92, 3,41,57, 3,41,50, 2,46,10, 2,46, 9, 3,41,55, 2,46, 4, 1,74,94,
+ 2,46, 8, 2,45,94, 2,46, 1, 1,74,86, 1,74,88, 3,41,52, 2,46, 6, 2,45,92,
+ 1,74,90, 1,74,89, 2,46, 2, 2,46, 7, 2,46, 5, 1,74,91, 2,46, 3, 3,41,49,
+ /* plane 0, page 137 */
+ 0, 255, /* first, last */
+ 3,41,54, 2,32,20, 1,74,87, 3,41,56, 0, 0, 0, 2,52,11, 2,52,18, 1,78,79,
+ 4,45,38, 2,52,22, 1,78,83, 2,52,14, 2,52,12, 4,45,30, 2,52,21, 3,46,65,
+ 1,78,78, 2,52,20, 1,78,80, 1,78,81, 2,52,13, 1,78,82, 2,52,19, 2,52,15,
+ 2,52,16, 2,52,17, 1,74,93, 3,46,66, 0, 0, 0, 0, 0, 0, 2,58,30, 2,58,42,
+ 4,51,51, 1,82,20, 2,58,37, 2,58,39, 3,50,69, 1,82,18, 2,58,31, 2,58,35,
+ 4,51,48, 2,58,38, 1,82,16, 1,82,19, 2,58,41, 2,58,33, 2,58,34, 2,58,40,
+ 2,58,32, 2,58,36, 1,82,17, 2,63,32, 0, 0, 0, 2,63,31, 1,85,34, 2,63,37,
+ 1,85,36, 3,54,32, 4,56,66, 1,85,33, 2,63,33, 1,85,37, 2,63,34, 3,54,31,
+ 3,54,29, 2,63,35, 2,63,38, 3,54,34, 1,85,35, 0, 0, 0, 2,67,33, 0, 0, 0,
+ 3,56,89, 2,67,36, 3,56,90, 2,67,30, 2,67,32, 3,56,92, 3,56,91, 2,67,31,
+ 2,67,34, 2,67,35, 2,63,36, 2,67,29, 3,70,42, 0, 0, 0, 1,88,88, 2,70,87,
+ 2,70,90, 2,70,92, 2,70,85, 2,70,86, 2,70,89, 2,70,91, 1,88,89, 1,88,87,
+ 1,88,86, 2,70,88, 2,70,84, 2,73,86, 1,90,27, 3,61, 9, 2,73,87, 3,61, 8,
+ 0, 0, 0, 2,76,24, 1,91, 8, 2,76,26, 1,91, 9, 2,76,23, 2,76,25, 1,91,82,
+ 5,84,24, 2,78, 1, 1,91,81, 2,79,44, 2,79,43, 4,76, 5, 2,79,42,15,72,42,
+ 3,65,41, 2,81,23, 2,81,24, 2,81,26, 2,81,25, 3,65,93, 2, 2,80, 1,40,73,
+ 0, 0, 0, 1,51,49, 2,25,40, 1,65,93, 3,70,43, 2,39,33, 1,87,27, 3,59,15,
+ 2,70,93, 3,64,38, 3,65,42, 1,43,36, 3,15, 9, 4,15,86, 4,15,85, 1,61,29,
+ 4,21,20, 3,24,86, 3,24,85, 1,61,28, 3,24,87, 2,32,22, 1,65,94, 2,32,24,
+ 2,32,23, 6,46,64, 3,30,84, 2,39,34, 1,70,55, 2,46,11, 2,46,14, 2,46,13,
+ 4,39,21, 2,46,12, 2,52,23, 2,52,25, 2,52,24, 3,46,69, 1,82,22, 3,50,70,
+ 4,51,57, 3,46,68, 1,82,21, 3,54,38, 1,85,38, 2,63,39, 2,63,41, 2,63,40,
+ 3,56,94, 3,56,93, 1,87,28, 3,57, 1, 4,65,15, 3,59,17, 2,71, 1, 2,70,94,
+ 15,67,87, 2,73,88, 1,90,28, 3,61,10, 3,62,65, 1,91,10, 2,78, 3, 2,78, 2,
+ 1,93, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1,43,37, 2,13,48, 1,51,50, 2,25,43, 2,25,41, 4,21,25,
+ 4,21,24, 2,25,42, 2,32,26, 2,32,27, 2,39,41, 2,32,25, 0, 0, 0, 2,39,35,
+ 2,39,39, 2,39,38, 2,39,40, 1,70,56, 2,39,37, 2,39,36, 2,39,42, 3,36,52,
+ 2,46,17, 2,46,15, 3,41,60, 2,46,16, 2,52,28, 2,52,26, 3,46,70, 0, 0, 0,
+ 2,52,27, 2,58,43, 2,63,42, 2,63,43, 1,87,29, 3,59,18, 2,71, 2, 2,73,89,
+ 1,90,29, 4,65,23, 2,76,27, 2,78, 4, 1,91,83, 4,73,37, 2,79,45, 2,81,27,
+ /* plane 0, page 138 */
+ 0, 255, /* first, last */
+ 1,43,38, 0, 0, 0, 1,51,52, 1,51,53, 2,13,49, 3,15,10, 3,15,12, 2,13,50,
+ 1,51,51, 4,15,92, 1,56,25, 3,19,91, 1,56,23, 3,19,90, 1,56,22, 1,56,29,
+ 1,56,21, 1,56,30, 2,19, 1, 1,56,27, 4,15,93, 1,56,24, 1,56,28, 1,56,26,
+ 1,56,20, 3,19,92, 0, 0, 0, 1,61,37, 3,24,94, 1,61,31, 2,25,47, 1,61,36,
+ 3,25, 3, 3,25, 9, 1,61,38, 1,61,32, 6,36,80, 1,61,33, 3,24,89, 2,25,45,
+ 3,24,91, 3,25, 5, 1,61,30, 3,25, 2, 2,25,46, 1,61,35, 4,21,29, 5,21,59,
+ 2,25,44, 1,61,34, 3,24,90, 0, 0, 0, 1,66,11, 3,30,92, 1,66,13, 4,27,15,
+ 3,30,93, 2,32,30, 1,66,12, 1,66, 1, 1,66, 5, 3,31, 4, 1,70,75, 2,39,47,
+ 2,32,32, 1,66, 6, 3,30,94, 3,30,85, 2,32,35, 2,32,36, 1,66,10, 4,27,16,
+ 2,32,38, 3,31, 1, 2,32,40, 3,31, 3, 2,32,41, 2,32,29, 2,32,28, 2,32,42,
+ 1,66, 9, 2,32,39, 2,32,37, 4,27,12, 1,66, 7, 1,66, 3, 1,66,14, 2,32,33,
+ 2,32,34, 2,32,31, 3,30,88, 1,66, 8, 4,27,17, 3,31, 2, 1,66, 4, 0, 0, 0,
+ 1,66, 2, 2,39,46, 1,70,70, 1,70,65, 3,36,64, 3,36,57, 1,70,60, 3,36,67,
+ 1,70,76, 1,70,61, 3,36,53, 1,70,57, 1,70,72, 1,70,69, 1,70,71, 3,36,56,
+ 1,70,62, 1,70,67, 1,70,58, 1,70,59, 2,39,54, 2,39,51, 2,39,43, 2,39,48,
+ 3,36,59, 1,70,73, 2,39,55, 1,70,74, 1,70,64, 3,36,60, 3,36,65, 2,39,45,
+ 3,36,54, 2,39,53, 2,39,49, 2,39,52, 2,39,50, 1,70,68, 2,39,44, 1,70,63,
+ 3,36,61, 0, 0, 0, 0, 0, 0, 2,46,20, 1,75, 2, 1,75, 5, 3,41,63, 2,46,22,
+ 3,41,68, 1,75,13, 2,46,21, 1,75, 7, 3,41,67, 1,78,88, 2,46,23, 4,39,37,
+ 1,75,12, 2,46,19, 1,75,14, 3,41,62, 3,41,66, 3,41,75, 1,75, 3, 3,41,72,
+ 1,70,66, 1,75, 6, 3,41,64, 1,75, 4, 1,75, 8, 1,75,10, 1,75, 1, 1,75,15,
+ 1,75,11, 3,41,69, 1,75, 9, 2,46,18, 3,41,70,15,44,33, 0, 0, 0, 3,46,84,
+ 1,79, 1, 3,46,71, 1,78,91, 3,46,82, 3,46,80, 3,46,78, 1,79, 4, 3,46,76,
+ 2,52,31, 1,79, 5, 2,52,43, 2,52,36, 1,78,84, 2,52,44, 2,52,38, 1,78,94,
+ 2,52,39, 3,46,83, 1,78,93, 2,52,42, 1,78,87, 2,52,40, 2,52,30, 1,78,86,
+ 2,58,54, 1,78,92, 3,46,85, 1,78,89, 3,46,73, 1,79, 3, 3,46,74, 2,52,29,
+ 3,46,86, 2,52,33, 1,78,85, 2,52,32, 2,52,34, 2,52,35, 1,79, 2, 2,52,37,
+ 2,52,41, 2,52,45, 0, 0, 0, 1,79, 6, 1,82,28, 2,58,49, 2,58,55, 2,58,52,
+ 2,58,44, 2,58,56, 2,58,45, 3,50,74, 2,58,51, 3,50,75, 1,82,23, 1,82,29,
+ 2,58,57, 3,46,79, 3,50,71, 1,82,25, 3,50,78, 1,82,35, 1,82,30, 2,58,59,
+ 2,58,53, 1,82,26, 2,58,46, 1,82,36, 2,58,47, 2,58,48, 1,82,37, 1,82,34,
+ 1,78,90, 3,50,73, 1,82,24, 2,58,60, 1,82,38, 3,50,72, 1,82,31, 2,58,58,
+ /* plane 0, page 139 */
+ 0, 159, /* first, last */
+ 1,82,27, 1,82,32, 1,82,33, 3,70,44, 1,85,46, 2,63,48, 2,63,57, 2,63,54,
+ 2,63,56, 3,54,41, 1,85,43, 2,63,49, 3,54,42, 2,63,55, 1,85,39, 2,63,51,
+ 1,85,47, 2,63,47, 2,63,52, 2,63,59, 2,58,50, 2,63,53, 2,63,46, 1,85,40,
+ 2,63,45, 1,85,41, 2,63,60, 1,85,42, 2,63,58, 1,85,45, 2,63,44, 3,54,40,
+ 1,85,44, 0, 0, 0, 2,63,50, 2,67,39, 2,67,53, 2,67,48, 2,67,50, 2,67,38,
+ 1,87,30, 3,57,10, 2,67,37, 1,87,33, 1,87,32, 3,57, 6, 2,67,52, 2,67,44,
+ 2,67,41, 2,67,47, 3,57, 4, 2,67,40, 3,57, 8, 2,67,42, 2,67,51, 2,67,49,
+ 3,57, 3, 1,87,31, 2,67,56, 2,67,54, 2,67,45, 2,67,55, 2,67,46, 3,59,20,
+ 2,71, 6, 1,88,90, 2,71,13, 3,59,21, 4,65,26, 2,76,30, 1,89, 3, 2,67,43,
+ 2,71, 4, 1,88,93, 2,71, 5, 2,71,10, 3,59,22, 3,61,19, 1,89, 1, 1,89, 2,
+ 2,71, 3, 2,71,12, 2,71,14, 2,71, 7, 2,71, 9, 2,71,11, 2,71, 8, 2,71,15,
+ 1,88,92, 1,89, 4, 1,88,94, 0, 0, 0, 1,88,91, 2,73,92, 4,68,45, 1,90,34,
+ 2,73,90, 3,61,16, 3,61,12, 2,73,94, 3,61,18, 2,74, 1, 1,90,32, 2,74, 2,
+ 2,73,93, 3,61,11, 2,73,91, 1,90,35, 1,90,31, 2,74, 3, 3,61,14, 1,90,33,
+ 1,90,30, 3,60,77, 0, 0, 0, 4,71,27, 1,91,11, 3,62,66, 4,71,33, 1,91,12,
+ 2,76,29, 2,76,28, 2,76,31, 2,76,32, 3,62,67, 1,91,13, 2,78, 5, 2,78,10,
+ 1,91,84, 3,63,65, 2,78, 7, 3,63,66, 2,78, 6, 2,78, 9, 2,78, 8, 3,64,40,
+ 2,79,49, 4,74,92, 1,92,40, 2,79,48, 2,79,46, 3,64,39, 2,79,47, 0, 0, 0,
+ 3,64,41, 3,64,91, 1,92,74, 1,92,73, 2,80,47, 2,80,48, 1,92,75, 3,65,43,
+ 2,81,28, 2,81,29, 1,93,20, 3,65,75, 1,93,26, 3,65,94, 2,81,87, 2,82,22,
+ /* plane 0, page 140 */
+ 55, 255, /* first, last */
+ 1,43,39,
+ 5,16,38, 2,25,48, 3,25,10, 2,25,49, 2,39,56, 2,46,24, 2,52,46, 1,85,49,
+ 3,54,45, 1,85,48, 2,67,57, 2,71,16, 3,63,68, 2,79,50, 1,43,40, 2,19, 2,
+ 1,56,31, 1,61,39, 2,39,58, 2,39,57, 1,79, 7, 2,52,47, 1,79, 8, 2,63,61,
+ 1,87,34, 3,61,20, 3,70,45, 3,66, 1, 1,93,35, 1,43,41, 2, 8,75, 2,19, 3,
+ 3,25,13, 4,21,45, 1,61,40, 3,25,12, 2,25,50, 2,25,51, 3,31,10, 2,32,43,
+ 3,31, 9, 1,66,15, 1,70,77, 3,36,68, 2,39,60, 2,39,59, 2,39,61, 3,41,77,
+ 2,46,25, 2,46,26, 1,75,16, 1,82,39, 1,79, 9, 1,82,40, 0, 0, 0, 2,63,65,
+ 2,63,62, 2,63,64, 2,63,63, 1,85,50, 3,57,11, 2,67,58, 2,71,18, 2,71,17,
+ 2, 5, 4, 1,56,33, 1,56,32, 2,19, 4, 3,25,14, 2,25,52, 3,31,12, 3,31,11,
+ 2,32,45, 2,32,44, 1,66,16, 3,31,13, 2,39,63, 2,39,64, 2,39,62, 4,32,88,
+ 3,36,69, 1,70,79, 1,70,78, 4,39,52, 1,75,18, 1,75,17, 3,46,90, 2,52,48,
+ 2,58,63, 2,58,61, 2,58,62, 1,82,41, 2,63,67, 2,63,66, 3,54,47, 2,67,61,
+ 2,67,60, 2,67,59, 2,71,19, 3,65,45, 2,81,88, 1,43,42, 1,51,54, 3,15,14,
+ 1,51,55, 1,56,34, 1,56,35, 2,19, 6, 2,19, 5, 2,25,53, 3,25,16, 1,61,46,
+ 1,61,44, 1,61,41, 1,61,45, 1,61,43, 1,61,42, 3,25,18, 3,25,17, 1,66,17,
+ 2,32,48, 3,31,15, 1,70,84, 1,66,19, 1,66,24, 2,32,50, 1,66,26, 1,66,25,
+ 1,66,28, 2,32,49, 2,32,46, 1,66,22, 1,66,18, 1,66,20, 2,32,47, 1,66,27,
+ 1,66,23, 1,66,21, 1,70,86, 1,70,85, 1,70,83, 1,70,87, 4,32,94, 1,70,81,
+ 1,70,82, 3,36,73, 1,70,80, 5,35,13, 2,39,65, 3,36,71, 0, 0, 0, 2,46,28,
+ 3,41,80, 1,75,20, 1,75,21, 1,75,19, 3,41,82, 2,46,27, 3,41,81, 2,46,29,
+ 3,70,46, 2,52,51, 2,52,53, 3,46,94, 1,79,18, 2,52,54, 1,79,11, 2,52,50,
+ 1,79,10, 1,79,20, 1,79,16, 1,79,17, 1,79,13, 2,52,49, 1,79,12, 2,52,55,
+ 2,52,52, 3,46,93, 1,79,19, 3,47, 2, 1,79,14, 1,79,15, 2,58,65, 3,50,85,
+ 2,58,67, 2,58,66, 3,50,83, 2,58,68, 1,82,42, 2,58,64, 3,54,49, 3,54,50,
+ 1,85,54, 2,63,68, 1,85,51, 1,85,55, 1,85,53, 1,85,52, 2,67,62, 4,61,73,
+ /* plane 0, page 141 */
+ 0, 255, /* first, last */
+ 2,67,65, 7,35,50, 2,67,64, 3,57,14, 2,67,63, 1,87,35, 2,71,20, 2,71,21,
+ 1,89, 5, 2,71,22, 1,89, 6, 3,59,24, 3,70,47, 1,90,37, 4,68,47, 1,90,36,
+ 2,76,33, 3,62,69, 3,62,70, 1,91,14, 2,76,34, 2,78,11, 1,91,85, 1,91,86,
+ 3,70,48, 2,79,51, 3,64,42, 1,92,77, 3,65,46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,43,43, 3,25,19, 1,61,48, 1,61,47,
+ 2,39,66, 2,39,67, 0, 0, 0, 1,75,22, 2,58,69, 1,79,21, 2,58,70, 2,63,69,
+ 1,43,44, 3, 4,26, 2,13,51, 1,51,57, 1,51,56, 0, 0, 0, 2,19, 7, 1,56,36,
+ 2,19, 8, 2,25,56, 3,25,25, 2,25,55, 3,25,23, 2,25,54, 3,25,21, 3,25,24,
+ 2,32,52, 1,66,31, 3,31,25, 3,31,20, 2,32,51, 1,66,30, 3,31,23, 3,31,16,
+ 3,31,19, 2,32,53, 1,66,29, 3,31,24, 2,39,69, 2,39,72, 2,39,70, 2,39,71,
+ 2,39,75, 2,39,68, 2,39,76, 2,39,73, 2,39,74, 1,75,24, 2,46,30, 3,41,85,
+ 3,41,83, 1,75,23, 3,41,84, 2,52,59, 2,52,57, 3,47, 6, 4,45,85, 1,79,22,
+ 2,52,56, 2,52,58, 3,47, 5, 1,79,23, 3,47, 3, 2,58,71, 3,50,87, 2,58,72,
+ 1,85,56, 3,57,17, 2,71,24, 2,71,26, 2,71,23, 2,71,25, 2,74, 4, 2,76,35,
+ 3,70,49, 0, 0, 0, 2,81,62, 1,43,45, 1,51,58, 2,19, 9, 2,19,11, 2,19,10,
+ 0, 0, 0, 2,25,59, 1,61,50, 3,25,30, 2,25,57, 3,25,26, 1,61,49, 2,25,60,
+ 3,25,29, 2,25,61, 2,25,58, 6,37,24, 0, 0, 0, 2,32,65, 1,66,39, 2,32,57,
+ 2,32,63, 3,31,31, 3,31,26, 1,66,34, 1,66,37, 2,32,56, 1,66,32, 2,32,60,
+ 2,39,82, 1,66,36, 3,31,27, 2,32,55, 3,31,30, 2,32,61, 2,32,58, 2,32,64,
+ 2,32,54, 2,32,62, 1,66,35, 1,66,38, 2,32,59, 1,66,33, 0, 0, 0, 1,70,89,
+ 2,39,78, 1,70,88, 2,39,85, 2,39,84, 1,71, 1, 0, 0, 0, 1,71, 2, 2,39,86,
+ 1,70,90, 2,39,83, 1,70,94, 2,39,88, 2,39,79, 3,36,75, 2,39,81, 1,70,91,
+ 2,39,77, 2,39,80, 2,39,87, 1,70,92, 2,39,89, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1,70,93, 0, 0, 0, 1,75,25, 2,46,35, 2,46,41, 2,46,33,
+ /* plane 0, page 142 */
+ 0, 255, /* first, last */
+ 2,46,42, 3,41,91, 2,46,32, 2,46,37, 2,46,43, 2,46,40, 2,46,39, 2,46,38,
+ 3,41,90, 2,46,31, 2,46,36, 3,41,89, 0, 0, 0, 2,46,34, 0, 0, 0, 1,79,28,
+ 1,79,25, 2,52,68, 2,52,73, 2,52,75, 2,52,72, 2,52,65, 2,52,67, 2,52,77,
+ 2,52,74, 2,52,69, 2,52,78, 2,52,66, 2,52,76, 1,79,26, 1,79,32, 1,79,30,
+ 2,52,60, 1,79,31, 1,79,27, 2,52,61, 2,52,63, 2,52,62, 2,52,70, 2,52,71,
+ 3,47,12, 1,79,29, 3,47,11, 1,79,24, 0, 0, 0, 0, 0, 0, 2,52,64, 0, 0, 0,
+ 2,58,82, 1,82,44, 3,50,94, 2,58,73, 1,82,45, 1,82,48, 2,58,78, 5,49,40,
+ 2,58,75, 1,82,47, 4,52, 9, 3,50,91, 2,58,79, 2,58,80, 2,58,74, 2,58,83,
+ 2,58,76, 2,58,81, 1,82,46, 3,50,92, 1,82,43, 2,58,77, 3,54,52, 2,63,75,
+ 1,85,59, 1,85,57, 1,85,60, 1,85,58, 2,63,74, 2,63,71, 2,63,70, 3,54,53,
+ 2,63,73, 4,57,13, 0, 0, 0, 2,63,72, 2,67,79, 1,87,41, 2,67,70, 2,67,69,
+ 3,57,18, 1,87,36, 2,67,75, 2,67,74, 2,67,66, 2,67,77, 2,67,71, 1,87,40,
+ 2,67,68, 2,67,76, 2,67,67, 1,87,37, 1,87,39, 2,67,72, 1,87,38, 2,67,73,
+ 3,59,26, 2,67,78, 2,71,30, 3,59,25, 1,89,11, 2,71,27, 4,65,50, 2,71,31,
+ 3,59,27, 4,65,47, 1,89, 8, 2,71,29, 1,89,13, 3,59,28, 1,89,10, 3,59,29,
+ 2,71,28, 4,65,52, 1,89,12, 2,71,32, 1,89, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1,90,39, 1,90,41, 3,61,23, 2,74, 7, 1,90,40, 2,74, 5, 1,89, 9,
+ 2,74, 6, 1,90,38, 1,91,15, 1,91,17, 2,76,37, 1,91,16, 2,76,36, 0, 0, 0,
+ 2,78,16, 1,91,87, 2,78,15, 1,91,88, 2,78,13, 2,78,12, 2,78,17, 2,78,18,
+ 2,79,52, 3,64,43, 2,78,14, 0, 0, 0, 0, 0, 0, 2,80,52, 2,80,49, 2,80,50,
+ 2,80,51, 1,93, 9, 3,65,48, 2,81,32, 2,81,31, 2,81,30, 2,81,63, 3,65,76,
+ 2,82,14, 2,81,89, 1,93,27, 1,43,46, 1,56,37, 3,25,31,15,24,76, 3,25,32,
+ 3,31,32, 3,36,83, 1,71, 3, 3,41,93, 3,41,92, 0, 0, 0, 3,47,16, 3,47,18,
+ 3,47,15, 3,47,17, 1,79,33, 0, 0, 0, 3,70,50, 2,58,84,15,56,19, 3,57,21,
+ 1,87,42, 3,57,22, 2,71,33, 3,59,31, 4,65,54, 0, 0, 0, 3,61,24, 4,71,49,
+ 0, 0, 0, 2,81,90, 1,43,47, 1,47,49, 1,51,60, 1,51,59, 5,16,53, 1,56,40,
+ 3,20, 1, 2,19,12, 1,56,38, 2,19,13, 1,56,39, 3,70,51, 3,25,33, 2,25,66,
+ 2,25,62, 3,25,39, 4,21,67, 1,61,51, 2,25,65, 2,25,64, 2,25,63, 1,61,52,
+ 2,25,67, 2,25,68, 0, 0, 0, 0, 0, 0, 3,31,37, 2,32,72, 2,32,70, 2,32,74,
+ 2,32,75, 2,32,81, 3,31,39, 2,32,77, 2,32,79, 5,35,48, 2,32,71, 2,32,66,
+ 4,27,53, 2,32,78, 3,31,36, 3,31,38, 2,32,80, 2,32,73, 2,32,76, 2,32,67,
+ 1,66,41, 2,32,69, 2,32,68, 1,66,40, 1,66,42, 3,31,41, 1,71, 6, 2,39,91,
+ /* plane 0, page 143 */
+ 0, 255, /* first, last */
+ 2,39,93, 2,39,92, 2,40, 3, 1,71, 4, 3,36,86, 2,39,94, 2,39,90, 2,40, 1,
+ 2,40, 2, 1,71, 5, 1,71, 7, 2,40, 4, 0, 0, 0, 2,46,47, 2,46,46, 4,39,74,
+ 2,46,44, 2,46,45, 1,75,27, 1,75,29, 1,75,26, 1,75,28, 2,52,85, 2,52,86,
+ 2,52,81, 3,47,22, 2,52,82, 1,79,35, 1,79,40, 1,79,34, 1,79,41, 1,79,36,
+ 2,52,83, 4,46,13, 3,47,19, 2,52,84, 2,52,80, 1,79,42, 1,79,38, 3,47,21,
+ 4,46,11, 1,79,37, 1,79,39, 3,47,20, 2,52,79, 3,51, 4, 2,58,86, 1,82,50,
+ 3,51, 2, 3,51, 1, 2,58,88, 1,82,52, 2,58,91, 2,58,87, 2,58,85, 2,58,90,
+ 1,82,51, 2,58,89, 7,20,18, 1,82,49, 3,51, 5, 3,54,57, 1,85,62, 1,85,65,
+ 2,63,77, 3,54,58, 1,85,63, 2,63,76, 1,85,61, 1,85,64, 2,67,80, 2,67,81,
+ 2,67,82, 1,87,43, 3,57,23, 2,67,83, 0, 0, 0, 1,87,44, 1,89,15, 2,71,36,
+ 2,71,37, 2,71,35, 2,71,34, 2,71,38, 1,89,14, 2,74,11, 2,74, 9, 2,74,10,
+ 2,74,12, 2,74, 8, 2,74,13, 2,76,39, 3,62,71, 2,76,40, 2,76,38, 1,91,18,
+ 2,78,19, 1,91,89, 2,78,20, 2,79,54, 2,79,53, 3,66, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,43,48, 1,66,43, 3,31,43, 3,36,87, 1,71, 8,
+ 3,36,88, 3,42, 1, 3,42, 2, 1,75,30, 3,47,23, 3,51, 7, 1,82,54, 3,51, 6,
+ 1,82,53, 0, 0, 0, 3,70,52, 0, 0, 0, 3,57,24, 1,89,16, 1,90, 9, 1,91,19,
+ 1,43,49, 1,56,41, 1,71, 9, 3,47,25, 2,71,39, 3, 7,15, 4, 1,52,15, 1,74,
+ 4, 3,16, 3, 4,27, 0, 0, 0,15, 2,81,15, 2,82, 0, 0, 0, 3, 7,16, 2, 5, 6,
+ 4, 5, 1, 3, 7,19, 1,43,50, 4, 5, 3, 1,43,53, 1,43,52, 1,43,51, 3, 7,17,
+ 15, 5,18, 2, 5, 5, 3,10,82, 2, 8,77, 3,10,80, 2, 8,79, 1,47,50, 3,10,84,
+ 4, 8, 6, 1,47,52, 2, 8,76, 2, 8,78, 1,47,51, 2, 8,81, 2, 8,80, 2, 8,82,
+ 3,10,83, 3,10,81, 0, 0, 0, 0, 0, 0,15, 8,81, 0, 0, 0, 0, 0, 0,15, 8,78,
+ 2,13,55, 2,13,53, 1,51,63, 2,13,52, 1,51,68, 1,51,65, 1,51,62, 3,15,17,
+ 1,51,69, 3,15,18, 1,51,64, 1,51,67, 6,20,64, 1,51,66, 2,13,54, 3,15,19,
+ 1,51,61, 3,15,16, 0, 0, 0, 0, 0, 0, 1,56,47, 2,19,15, 2,19,21, 1,56,44,
+ 1,56,51, 3,20, 5, 1,56,46, 2,19,18, 2,19,20, 1,56,49, 2,19,14, 2,19,17,
+ /* plane 0, page 144 */
+ 0, 255, /* first, last */
+ 1,56,45, 1,56,42, 2,19,16, 1,56,48, 2,19,19, 1,56,50, 1,56,43, 4,16,15,
+ 3,20, 7, 3,20, 6, 0, 0, 0, 2,25,70, 2,25,73, 1,61,54, 3,25,43, 1,61,64,
+ 1,61,60, 2,25,71, 3,25,42, 3,25,46, 1,61,68, 1,61,61, 1,61,66, 1,61,56,
+ 4,21,72, 1,61,53, 1,61,55, 1,61,67, 2,25,72, 1,61,59, 1,61,62, 1,61,58,
+ 1,61,63, 2,25,74, 1,61,65, 1,61,57, 2,25,69, 3,25,44, 0, 0, 0, 0, 0, 0,
+ 3,31,47, 3,31,48, 3,31,45, 3,31,44, 3,31,49, 2,32,82, 1,66,44, 2,32,84,
+ 3,31,53, 1,66,46, 1,66,48, 4,21,70, 2,32,83, 1,66,45, 1,66,49, 3,31,54,
+ 1,66,47, 0, 0, 0, 3,31,52, 3,31,55, 1,71,15, 2,40, 9, 1,71,23, 2,40, 6,
+ 3,36,93, 1,71,24, 1,71,13, 3,36,89, 2,40, 7, 3,36,92, 3,36,90, 1,71,18,
+ 3,36,91, 2,40, 8, 1,71,11, 1,71,10, 3,36,94, 1,71,21, 1,71,20, 1,71,19,
+ 1,71,17, 1,71,22, 2,40, 5, 1,71,12, 1,71,14, 1,71,16, 0, 0, 0, 0, 0, 0,
+ 1,75,32, 1,75,35, 3,42, 4, 1,75,39, 1,75,33, 1,75,38, 1,75,36, 3,42, 7,
+ 1,75,31, 3,42, 6, 1,75,37, 1,75,34,15,44,75, 0, 0, 0, 4,46,18, 2,52,90,
+ 1,79,45, 1,79,43, 3,47,28, 2,52,91, 4,46,19, 1,79,46, 1,79,44, 2,52,89,
+ 2,52,88, 3,47,27, 1,82,58, 2,52,87, 1,82,56, 1,82,55, 2,58,92, 1,79,47,
+ 1,82,57, 2,58,93, 1,82,60, 2,58,94, 1,82,59, 1,85,67, 2,63,79, 1,85,66,
+ 1,85,71, 1,85,69, 1,85,70, 1,87,46, 1,85,68, 2,63,78, 2,59, 1, 1,87,45,
+ 1,87,47, 3,57,26, 1,89,17, 1,89,18, 4,65,63, 2,74,14, 4,73,50, 1,92,42,
+ 1,92,41, 1,43,55, 3, 2,62, 3, 2,61, 2, 2,85, 1,56,52, 3, 4,28, 2, 2,82,
+ 2, 2,83, 2, 2,81, 3, 4,29, 2, 2,84, 3,70,53, 0, 0, 0, 2, 5,10, 2, 5, 7,
+ 2, 5,12, 2, 5, 8, 1,43,56, 1,43,59, 3, 7,21, 2, 5, 9, 1,43,58, 2, 5,11,
+ 3, 7,25, 3, 7,20, 1,43,57, 3,25,49, 0, 0, 0, 3,10,87, 4, 8,11, 2, 8,85,
+ 2, 8,87, 1,47,55, 2, 8,83, 2, 8,86, 2, 8,84, 1,47,53, 1,47,56, 3,10,85,
+ 1,47,54, 3,10,88, 0, 0, 0, 0, 0, 0, 3,15,21, 2,13,57, 2,13,61, 2,13,58,
+ 3,15,24, 1,51,72, 3,15,20, 1,51,73, 3,15,30, 2,13,60, 3,15,23, 2,13,62,
+ 2,13,64, 3,15,28, 1,51,70, 2,13,63, 4,33,25, 3,15,27, 1,51,71, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,37,77, 0, 0, 0, 2,25,81, 2,13,59, 2,19,22, 2,19,31,
+ 2,19,29, 2,19,24, 2,19,25, 2,19,30, 2,19,32, 1,56,54, 3,20, 9, 2,19,27,
+ 2,19,23, 1,56,53, 1,56,55, 2,19,26, 2,19,33, 2,19,28, 0, 0, 0, 0, 0, 0,
+ 1,61,69, 2,25,84, 2,25,76, 2,25,82, 2,25,83, 1,61,70, 3,25,47, 2,25,75,
+ 2,25,77, 2,13,56, 2,25,79, 2,25,80, 2,25,78, 1,66,51, 4,46,27, 3,25,50,
+ 0, 0, 0, 2,32,91, 2,59, 2, 2,32,92, 2,32,89, 1,61,71, 1,66,53, 2,32,88,
+ /* plane 0, page 145 */
+ 0, 255, /* first, last */
+ 2,32,94, 2,32,93, 1,66,50, 2,33, 3, 2,32,87, 2,33, 2, 2,32,85, 2,33, 1,
+ 2,32,90, 1,66,52, 3,31,57, 2,40,16, 3,37, 3, 2,40,11, 2,40,17, 2,40,12,
+ 2,40,10, 2,40,13, 1,71,25, 3,37, 4, 2,40,15, 3,37, 5, 2,40,14, 1,71,26,
+ 1,75,41, 1,75,40, 2,46,54, 2,46,57, 2,46,49, 2,46,53, 1,75,42, 2,46,52,
+ 2,46,50, 2,46,56, 2,46,51, 2,46,48, 2,46,55, 3,42,10, 2,53, 3, 1,79,50,
+ 2,67,84, 2,52,94, 2,53, 1, 2,52,93, 2,32,86, 1,79,49, 2,53, 4, 2,52,92,
+ 1,79,48, 1,79,51, 2,53, 2, 2,59, 3, 1,82,61, 2,59, 4, 2,59, 5, 3,51,11,
+ 2,63,80, 1,85,72, 2,67,85, 2,67,86, 3,57,28, 3,57,27, 2,67,87, 2,71,41,
+ 2,71,40, 2,74,16, 0, 0, 0, 2,74,15, 2,76,42, 2,76,43, 2,76,41, 2,78,21,
+ 1,91,90, 1,43,60, 1,51,75, 1,51,74, 1,56,58, 1,56,57, 2,19,35, 2,19,36,
+ 2,19,34, 3,20,10, 1,56,56, 2,25,88, 3,25,53, 2,25,89, 2,25,85, 1,61,72,
+ 2,25,86, 3,25,52, 2,25,87, 0, 0, 0, 3,70,55, 0, 0, 0, 0, 0, 0, 2,33, 6,
+ 2,33, 8, 2,33, 4, 2,33, 7, 1,66,54, 2,33, 5, 1,66,55, 0, 0, 0, 3,37, 8,
+ 2,34,89, 1,71,29, 1,71,28, 3,37, 7, 1,71,27, 4,33,26, 2,40,18, 2,40,19,
+ 4,33,27, 0, 0, 0, 2,46,59, 2,46,61, 1,75,46, 1,75,43, 3,42,12, 1,75,45,
+ 1,75,44, 2,46,60, 2,46,58, 3,42,11, 3,42,13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2,53,11, 2,53, 8, 2,53, 9, 1,79,55, 2,53,10, 2,53, 5, 2,53, 6, 1,79,52,
+ 3,47,31, 1,79,53, 2,53, 7, 1,79,54, 3,47,32, 2,59, 9, 3,51,13, 2,59,10,
+ 2,59, 7, 2,59, 8, 1,82,62, 2,59, 6, 4,52,34, 3,51,12, 3,51,15, 0, 0, 0,
+ 4,57,31, 2,63,84, 2,63,81, 2,63,83, 1,85,75, 2,63,87, 1,85,74, 2,63,85,
+ 2,63,88, 2,63,86, 2,63,82, 1,85,73, 0, 0, 0, 2,67,89, 4,62, 4, 2,67,90,
+ 2,67,88, 3,57,29, 2,67,92, 1,87,48, 1,87,49, 2,71,43, 1,89,20, 2,67,91,
+ 2,71,42, 1,89,19, 2,74,19, 2,74,20, 1,90,42, 2,74,18, 4,68,69, 2,74,17,
+ 0, 0, 0, 2,76,44, 1,91,20, 3,62,72, 2,79,55, 2,80,54, 2,80,53, 3,64,94,
+ 1,92,78, 1,93,10, 2,80,55, 2,81,64, 3,65,77, 1,93,28, 1,43,61, 1,47,57,
+ 0, 0, 0, 1,71,30, 0, 0, 0, 1,90,43, 1,43,62, 1,51,76, 1,61,73, 1,66,56,
+ 1,87,50, 1,47,58, 0, 0, 0, 2,13,66, 2,13,65, 2,19,37, 3,20,16, 1,56,61,
+ 1,56,59, 1,56,63, 2,19,39, 3,20,13, 1,56,62, 1,56,60, 3,20,15, 3,20,14,
+ 3,20,17, 0, 0, 0, 2,19,38, 1,61,76, 2,26, 1, 3,25,56, 1,61,75, 1,61,77,
+ 2,26, 6, 1,61,79, 2,26, 3, 2,26, 4, 2,25,90, 1,61,78, 2,26, 7, 4,21,91,
+ 3,25,55, 2,25,92, 3,25,54, 2,25,93, 2,25,91, 1,61,74, 3,25,57, 2,26, 5,
+ 2,25,94, 2,26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,33,20, 3,31,61, 2,33,19,
+ /* plane 0, page 146 */
+ 0, 255, /* first, last */
+ 2,33,17, 2,33, 9, 2,33,24, 2,33,12, 2,33,22, 2,33,29, 2,33,21, 1,66,64,
+ 3,31,70, 1,66,60, 2,33,10, 3,31,64, 2,33,16, 1,66,62, 3,31,72, 2,33,15,
+ 1,66,63, 1,66,65, 2,33,18, 3,31,73, 1,66,57, 1,66,58, 2,33,30, 2,33,28,
+ 3,31,66, 2,33,27, 2,33,13, 3,31,69, 2,33,25, 4,27,70, 1,66,61, 6,47,79,
+ 3,31,62, 3,70,57, 3,31,67, 1,66,59, 2,33,26, 2,33,11, 2,33,14, 2,33,23,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,70,56, 0, 0, 0, 2,47, 2, 2,40,29, 3,37,14,
+ 2,40,22, 2,40,41, 2,40,50, 2,40,25, 1,71,41, 3,37,11, 2,40,38, 1,71,31,
+ 1,71,33, 1,71,45, 2,40,23, 3,37,23, 3,37,15, 1,71,34, 1,71,36, 1,71,46,
+ 1,71,35, 3,37,25, 4,33,33, 4,33,38, 3,37,24, 1,71,44, 2,40,31, 4,33,40,
+ 2,40,20, 1,71,42, 2,40,30, 1,71,38, 2,40,48, 1,71,43, 2,40,46, 2,40,34,
+ 2,40,44, 1,71,40, 2,40,21, 2,40,47, 2,40,42, 3,37,10, 2,40,49, 1,71,32,
+ 4,33,32, 3,37,13, 1,71,47, 1,71,37, 3,37,17, 3,37, 9, 2,40,27, 3,37,20,
+ 2,40,35, 2,40,39, 3,37,19, 2,40,43, 1,71,39, 2,40,26, 2,40,24, 2,40,36,
+ 4,33,34, 4,33,35, 3,37,18, 3,37,21, 2,40,33, 2,40,32, 3,37,22, 2,40,37,
+ 2,40,40, 0, 0, 0, 2,40,45, 3,70,58,15,37,82, 4,39,85, 2,46,64,15,45, 2,
+ 1,75,47, 2,46,74, 2,46,66, 1,75,53, 1,75,57, 2,46,83, 2,46,91, 2,46,76,
+ 1,75,49, 3,42,20, 2,46,80, 2,40,28, 3,42,21, 1,75,50, 2,46,87, 2,46,92,
+ 2,46,84, 3,42,15, 2,46,86, 2,47, 1, 2,46,88, 2,46,70, 2,46,79, 3,37,16,
+ 3,42,24, 1,75,58, 3,42,19, 1,75,54, 2,46,68, 2,46,81, 1,75,52, 2,46,75,
+ 1,75,51, 2,46,89, 2,46,72, 2,46,65, 1,75,55, 2,46,94, 3,42,25, 4,39,87,
+ 2,46,67, 2,46,85, 2,46,82, 2,46,77, 2,46,63, 2,46,62, 2,46,71, 2,46,90,
+ 1,75,56, 2,46,93, 2,46,69, 2,46,73, 1,75,48, 3,42,18, 3,42,23,15,45, 7,
+ 3,71,10, 3,42,17, 1,79,67, 1,79,62, 2,53,45, 2,53,41, 2,53,17, 1,79,58,
+ 3,47,34, 3,47,48, 4,46,37, 1,79,57, 1,79,63, 4,46,39, 3,47,35, 3,47,33,
+ 2,53,15, 1,79,61, 2,53,27, 2,53,13, 2,53,14, 1,79,56, 2,53,44, 1,79,65,
+ 2,53,30, 2,53,35, 2,53,29, 2,59,28, 2,53,25, 2,53,33, 2,53,31, 2,53,18,
+ 2,53,12, 2,53,39, 1,79,64, 2,53,40, 3,47,40, 2,53,34, 3,47,41, 2,53,23,
+ 2,53,21, 2,53,16, 3,47,43, 3,47,46, 3,47,36, 2,53,24, 2,53,37, 2,53,20,
+ 2,53,36, 2,53,42, 3,47,49, 4,46,38, 1,79,60, 3,47,37, 2,53,32, 2,53,38,
+ 2,53,28, 2,53,22, 1,79,59, 3,47,50, 4,46,36, 3,47,44, 2,46,78, 2,53,26,
+ 1,79,66, 2,53,19,15,50,75, 3,47,45, 3,70,59, 3,70,60, 3,42,16, 2,59,33,
+ 1,82,65, 2,59,32, 2,59,30, 2,59,48, 1,82,69, 3,51,21, 2,59,45, 2,59,37,
+ /* plane 0, page 147 */
+ 0, 255, /* first, last */
+ 2,59,47, 2,59,23, 2,59,35, 3,51,29, 1,82,71, 3,51,30, 2,59,15, 3,51,24,
+ 2,59,13, 2,59,46, 3,51,18, 2,59,44, 2,59,43, 2,59,27, 2,59,26, 2,59,16,
+ 1,82,73, 4,52,35, 2,59,22, 2,59,31, 2,59,42, 1,82,76, 2,59,49, 3,51,22,
+ 1,85,83, 1,82,78, 1,82,72, 2,59,20, 3,51,23, 2,59,29, 2,59,12, 2,59,14,
+ 1,82,63, 1,82,75, 1,82,68, 2,59,21, 2,59,36, 2,53,43, 1,82,74, 2,59,11,
+ 1,85,78, 2,59,38, 2,59,41, 1,82,70, 3,51,27, 2,59,25, 1,82,77, 1,82,67,
+ 3,51,28, 3,51,25, 3,51,26, 1,82,66, 2,59,34, 2,59,40, 1,82,64, 4,52,37,
+ 2,59,18, 2,59,39,15,56,57,15,56,40, 2,59,19, 7,20,67, 0, 0, 0, 3,70,61,
+ 15,56,53, 0, 0, 0, 3,70,62, 4,52,41, 0, 0, 0, 3,51,17, 2,59,24, 2,63,94,
+ 3,54,69, 2,64, 5, 1,85,80, 1,85,82, 2,64,11, 1,85,76, 2,64,25, 2,64,17,
+ 2,64, 6, 2,64, 7, 2,64,16, 3,54,70, 1,85,89, 2,64,15, 2,63,93, 2,64,14,
+ 2,64, 2, 2,64,26, 1,85,88, 1,85,86, 2,64, 3, 3,54,61, 2,64,22, 3,54,71,
+ 2,64, 8, 2,64,21, 3,54,68, 2,64,23, 2,63,92, 1,85,81, 3,54,59, 2,64,24,
+ 3,54,72, 3,54,62, 2,64,12, 3,54,75, 1,85,85, 2,64, 9, 3,54,65, 4,57,41,
+ 1,85,87, 2,64,18, 3,54,66, 3,54,67, 3,54,63, 1,85,79, 2,64, 4, 2,64,19,
+ 3,54,60, 2,64,13, 2,59,17, 2,64,20, 2,64, 1, 3,54,64, 1,85,84, 3,54,74,
+ 2,68,15, 4,57,39, 1,85,77, 2,63,90, 4,57,38,15,61,33, 3,70,63,15,61,25,
+ 2,68,12, 2,68, 5, 1,87,52, 3,57,35, 2,67,94, 2,68,16, 2,68, 7, 2,64,10,
+ 3,57,32, 2,68,18, 2,68, 1, 3,57,34, 1,87,51, 2,68,11, 1,87,53, 1,87,61,
+ 1,87,59, 2,68,13, 1,87,60, 2,68, 3, 3,57,41, 2,68, 4, 2,68, 9, 2,68,14,
+ 3,57,30, 2,63,89, 1,87,54, 2,68,23, 2,68,20, 2,71,65, 2,68,10, 2,68, 6,
+ 2,68,21, 2,71,54, 2,68, 8, 4,62,17, 1,87,57, 3,57,36, 1,87,56, 2,63,91,
+ 1,87,58, 2,68,17, 2,68,19, 1,87,55, 2,68,22, 2,67,93, 4,62, 9, 2,68, 2,
+ 3,57,38,15,65,19, 0, 0, 0, 3,57,37, 3,70,65, 3,70,66, 3,70,64,15,65,35,
+ 2,71,63, 3,59,48, 2,71,47, 1,89,24, 2,71,61, 3,59,36, 3,59,37, 2,71,45,
+ 1,89,25, 4,65,71, 2,71,56, 3,59,35, 2,71,52, 1,89,30, 2,71,62, 2,71,46,
+ 2,71,49, 1,89,22, 2,71,64, 3,59,40, 2,71,57, 2,71,60, 1,89,28, 1,89,33,
+ 1,89,31, 2,71,53, 2,71,48, 3,59,45, 1,89,26, 1,89,27, 2,71,44, 1,89,23,
+ 3,59,47, 1,89,21, 1,89,29, 2,71,59, 1,89,32, 3,59,42, 2,71,55, 2,71,66,
+ 1,89,34, 3,59,33, 3,59,34, 3,59,46, 2,71,51, 3,59,39, 2,71,58, 3,70,69,
+ 0, 0, 0, 3,70,67, 3,70,68, 3,61,33, 3,62,74, 2,74,33, 2,74,48, 2,74,35,
+ 2,74,42, 2,71,50, 2,74,40, 2,74,23, 2,74,46, 1,90,46, 2,74,27, 2,74,45,
+ /* plane 0, page 148 */
+ 0, 132, /* first, last */
+ 2,74,34, 4,68,71, 3,61,35, 1,90,45, 3,61,28, 3,61,31, 2,74,50, 2,74,36,
+ 3,61,30, 2,74,41, 2,74,44, 2,74,21, 2,74,47, 2,74,32, 2,74,37, 2,74,25,
+ 2,74,29, 2,74,49, 2,74,39, 2,74,22, 2,74,26, 2,74,28, 2,74,38, 3,61,29,
+ 1,90,44, 2,74,31, 3,61,36, 3,61,37, 3,61,39, 4,68,75, 3,61,34, 3,61,26,
+ 2,74,24, 0, 0, 0, 3,70,70, 3,70,71, 3,70,72,15,70,55, 0, 0, 0, 3,61,38,
+ 2,74,30, 2,76,48, 2,76,52, 1,91,27, 2,76,54, 3,62,77, 1,91,21, 4,68,79,
+ 2,76,50, 2,76,56, 1,91,26, 1,91,22, 4,71,60, 1,91,23, 2,76,47, 2,76,53,
+ 1,91,25, 2,76,51, 1,91,24, 2,76,46, 2,74,43, 2,76,49, 4,71,66, 2,76,45,
+ 2,76,55, 0, 0, 0, 3,63,73, 3,63,78, 1,91,91, 2,78,28, 2,78,31, 2,78,27,
+ 2,78,29, 2,78,30, 2,78,24, 2,78,25, 2,78,22, 3,63,74, 3,63,76, 2,78,26,
+ 2,78,23, 1,91,92, 1,91,93, 0, 0, 0, 3,63,75, 2,79,57, 3,64,50, 2,79,59,
+ 4,75, 9, 5,86,61, 3,64,53, 3,64,52, 3,64,54, 2,79,58, 2,79,60, 3,64,47,
+ 1,92,44, 3,64,51, 2,79,56, 1,92,43, 1,92,45, 3,64,55, 3,70,74, 3,70,73,
+ 2,80,57, 2,80,58, 1,92,79, 2,80,56, 3,65, 2, 2,81,34, 2,81,33, 2,81,35,
+ 1,93,12, 2,81,36, 1,93,11, 2,81,37, 2,81,65, 2,81,68, 2,81,67, 1,93,21,
+ 2,81,66, 4,77,66, 3,65,79, 3,66, 3, 1,93,31, 1,93,29, 1,93,30, 1,93,36,
+ 2,82,16, 2,82,17, 2,82,15, 2,82,23, 3,66,22,
+ /* plane 0, page 149 */
+ 119, 245, /* first, last */
+ 1,47,59,
+ 4, 5,11, 4,16,26, 2,26, 8, 2,33,31, 2,53,46, 2,71,67, 5,81,54, 0, 0, 0,
+ 1,47,60, 3,15,32, 1,51,77, 1,56,64, 4,16,27, 3,20,18, 2,26, 9, 3,25,60,
+ 2,26,10, 1,61,80, 0, 0, 0, 1,66,68, 2,33,33, 2,33,32, 1,66,72, 1,66,67,
+ 2,33,34, 1,66,69, 1,66,71, 1,66,70, 1,66,66, 3,31,76,15,31,94, 3,70,75,
+ 1,71,48, 3,37,28, 3,37,26, 2,40,54, 2,40,52, 4,33,51, 2,40,53, 2,40,51,
+ 15,37,91, 1,75,59, 3,42,29, 1,75,62, 1,75,64, 1,75,63, 4,40, 2, 3,42,30,
+ 1,75,60, 1,75,61, 0, 0, 0, 2,53,48, 2,53,47, 1,79,68, 2,53,49, 3,47,51,
+ 2,53,50, 1,79,69, 3,47,53, 3,47,54, 4,46,42, 2,59,57, 2,59,55, 2,64,32,
+ 3,51,34, 2,59,53, 2,59,54, 1,82,79, 2,59,50, 2,59,58, 2,59,52, 2,59,56,
+ 2,64,28, 3,51,36, 3,51,32, 2,64,30, 3,54,77, 2,64,31, 1,85,94, 2,64,27,
+ 1,85,93, 2,64,29, 1,85,90, 1,85,91, 1,85,92, 2,59,51, 3,70,76, 0, 0, 0,
+ 1,87,64, 2,68,26, 2,68,24, 2,68,25, 1,87,62, 1,87,65, 1,87,63, 3,57,43,
+ 3,57,42, 7,43,32, 2,71,68, 2,71,69, 1,89,35, 3,59,51, 2,74,51, 2,74,53,
+ 2,74,52, 1,90,47, 1,91,28, 2,76,59, 2,76,58, 2,76,57,15,72,82, 3,70,77,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 5,25,
+ /* plane 0, page 150 */
+ 28, 255, /* first, last */
+ 1,47,61, 3, 1,35, 2, 1,73, 0, 0, 0,
+ 2, 2,88, 1,40,74, 2, 2,86, 2, 2,89, 2, 2,87, 4, 5,14, 3, 7,27, 3, 7,26,
+ 2, 5,14, 3, 7,31, 1,43,66, 3, 7,28, 1,43,67, 2, 5,16, 1,43,64, 2, 5,15,
+ 2, 5,13, 1,43,65, 1,43,63, 3, 7,29, 3, 7,30, 0, 0, 0, 0, 0, 0, 3,10,89,
+ 4, 8,19, 2, 8,88, 2, 8,91, 1,47,64, 2, 8,90, 2, 8,89, 3,10,92, 1,47,63,
+ 1,47,62, 3,10,91, 1,47,66, 2, 8,92, 1,47,65, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2,13,71, 1,51,79, 1,51,80, 1,51,81, 2,13,72, 2,13,68,
+ 1,51,78, 2,13,69, 4,11,61, 2,13,70, 2,13,67, 4,11,59, 3,20,22, 4,16,31,
+ 1,56,71, 3,20,20, 3,25,62, 1,56,68, 2,19,40, 1,56,69, 1,56,72, 2,19,41,
+ 3,20,19, 1,56,67, 1,56,65, 1,56,66, 1,56,70, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1,61,81, 2,26,13, 1,61,89, 2,26,12, 3,25,65, 2,26,15,
+ 1,61,85, 2,26,14, 1,66,80, 1,61,83, 1,61,86, 1,61,82, 1,61,87, 1,61,88,
+ 1,61,84, 3,25,69, 0, 0, 0, 3,31,81, 2,26,11, 1,66,76, 2,33,36, 3,31,82,
+ 2,33,40, 3,31,83, 3,31,85, 2,33,39, 1,66,81, 1,66,77, 1,66,78, 2,33,35,
+ 2,33,37, 2,33,38, 1,66,73, 1,66,75, 3,31,80, 1,66,79, 1,66,74, 3,37,32,
+ 0, 0, 0, 2,40,57, 2,40,55, 2,40,56, 1,71,50, 1,71,51, 3,37,34, 2,40,58,
+ 1,71,49, 1,75,65, 4,40, 4, 1,75,67, 1,75,66, 3,42,37, 2,47, 3, 3,42,38,
+ 3,42,36, 2,47, 4, 2,53,52, 3,47,58, 2,53,51, 3,47,59, 4,52,50, 1,82,80,
+ 1,82,81, 2,59,59, 1,82,82, 3,51,40, 2,64,35, 3,54,80, 2,64,33, 3,54,79,
+ 2,64,34, 1,86, 1, 3,54,81, 2,68,27, 1,89,36, 3,61,41, 3,10,93, 3,51,41,
+ 1,86, 2, 1,47,67, 4,16,33, 1,56,73, 2,19,42, 3,20,25,15,18,79, 2,26,16,
+ 1,61,90, 1,66,82, 2,33,41, 2,33,43, 1,66,84, 1,66,83, 1,66,85, 1,66,86,
+ 2,33,42, 1,71,54, 1,71,55, 1,71,53, 1,75,68, 1,71,52, 2,40,59, 4,33,55,
+ 3,42,39, 3,42,41, 1,75,69, 2,53,53, 2,59,60, 1,82,83, 1,86, 3, 2,68,28,
+ 2,68,32, 1,87,68, 2,68,29, 1,87,69, 1,87,67, 2,68,33, 1,87,70, 2,68,31,
+ 0, 0, 0, 2,71,70, 1,87,66, 1,89,37, 3,62,80, 2,80,59, 3,65, 5, 3,66,15,
+ 1,47,68, 1,61,92, 1,61,91,15,25,10, 3,31,94, 3,31,92, 3,31,91, 1,66,87,
+ 2,33,45, 2,33,44, 1,66,88, 0, 0, 0, 3,37,38, 2,40,63, 1,71,59, 1,71,56,
+ 2,40,62, 1,71,58, 2,40,60, 1,71,57, 3,37,39, 2,40,61, 0, 0, 0, 2,47, 5,
+ /* plane 0, page 151 */
+ 0, 255, /* first, last */
+ 1,75,70, 0, 0, 0, 2,53,56, 5,50,27, 1,79,70, 2,53,54, 1,79,71, 1,79,72,
+ 2,53,55, 1,79,73, 3,47,64, 2,59,61, 3,51,48, 1,82,87, 1,82,84, 1,82,89,
+ 2,59,63, 1,82,85, 2,59,62, 1,82,88, 3,51,45, 3,51,44, 1,82,86, 3,51,49,
+ 2,64,38, 2,64,40, 3,54,84, 3,54,85, 1,86, 4, 2,64,39, 1,86, 5, 2,64,37,
+ 2,64,36, 4,62,24, 2,68,35, 2,68,34, 1,87,71, 2,68,36, 2,71,75, 1,89,39,
+ 2,71,74, 2,71,71, 1,89,38, 2,71,72, 2,71,73, 0, 0, 0, 2,74,54, 2,74,55,
+ 1,90,48, 3,61,47, 1,91,31, 3,61,44, 3,61,46, 2,76,60, 3,62,82, 3,62,81,
+ 1,91,29, 1,91,30, 2,76,61, 3,70,78, 3,63,81, 1,91,94, 1,92, 1, 2,78,32,
+ 3,63,82, 3,64,57, 1,92,80, 2,80,61, 1,92,82, 3,65, 6, 2,80,60, 2,80,62,
+ 1,92,81, 2,81,38, 4,77,68, 2,81,91, 0, 0, 0, 3,70,79, 0, 0, 0, 0, 0, 0,
+ 3,66,37, 3,10,94, 1,47,69, 0, 0, 0, 0, 0, 0, 3,37,41, 1,71,60, 4,40,21,
+ 2,47, 6, 3,42,44, 2,53,57, 1,82,90, 1,82,91, 3,57,47, 1,47,70, 3,32, 1,
+ 1,79,74, 1,89,40, 1,51,82, 3,11, 1, 3,42,46, 0, 0, 0, 1,82,92, 3,62,83,
+ 1,92,46, 1,51,83, 2,26,17, 4,27,87, 2,33,46, 3,32, 4, 2,33,48, 3,32, 2,
+ 2,33,47, 0, 0, 0, 2,40,67, 2,40,64, 1,71,61, 6,58, 4, 1,71,62, 2,40,65,
+ 2,40,66, 3,37,43, 2,47, 8, 2,47,13, 1,75,71, 2,47, 7, 2,47, 9, 2,47,16,
+ 2,47,11, 2,47,15, 2,47,12, 2,47,10, 2,47,14, 1,75,72, 0, 0, 0, 3,47,66,
+ 2,53,60, 3,47,67, 2,53,58, 1,79,76, 3,47,68, 1,79,75, 2,53,59, 1,79,77,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,51,51, 2,59,66, 4,52,63, 4,52,71, 2,59,65,
+ 1,82,93, 2,59,64, 2,64,41, 3,54,90, 2,64,43, 2,64,45, 2,64,44, 3,54,91,
+ 1,86, 6, 2,64,42, 2,68,43, 1,87,72, 2,68,41, 2,68,44, 1,87,73, 4,62,35,
+ 2,68,39, 3,57,48, 2,68,42, 2,68,40, 2,68,37, 1,87,74, 2,68,38, 0, 0, 0,
+ 4,65,92, 3,59,63, 3,59,61, 2,71,76, 3,59,62, 3,59,64, 2,71,78, 2,71,77,
+ 3,61,48, 2,74,56, 3,61,49, 2,74,57, 4,71,81, 3,62,85, 3,62,84, 2,76,62,
+ 3,63,83, 1,92, 3, 4,73,62, 1,92, 2, 2,79,61, 2,79,62, 1,92,83, 2,80,63,
+ 3,65, 8, 1,93,22, 3,66,27, 1,51,84, 1,66,89, 2,47,18, 2,47,17, 2,53,62,
+ 2,53,61, 4,46,55, 3,51,53, 1,86, 7, 2,64,47, 2,64,46, 2,68,47, 2,68,45,
+ 2,68,48, 2,68,46, 3,57,49, 4,69, 9, 1,89,41, 2,71,79, 2,71,80, 2,71,81,
+ 4,69, 7, 2,76,63, 3,62,86, 2,78,33, 3,65, 9, 2,80,64, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,51,85, 3,37,47, 3,47,69,
+ 2,59,67, 2,64,48, 3,59,65, 1,51,86, 4,33,67, 3,37,48, 1,75,73, 4,40,38,
+ 2,59,68, 1,87,75, 2,68,49, 1,89,42, 3,61,51, 2,74,58, 2,74,59, 1,91,32,
+ /* plane 0, page 152 */
+ 0, 255, /* first, last */
+ 2,79,63, 1,51,87, 1,62, 1, 1,62, 2, 2,26,18, 1,66,90, 1,66,91, 2,33,49,
+ 1,66,92, 4,33,72, 1,71,66, 3,37,50, 1,71,68, 2,40,69, 2,40,70, 2,40,68,
+ 1,71,63, 1,71,64, 1,71,67, 1,71,65, 3,42,52, 3,42,53, 2,47,19, 1,75,74,
+ 1,75,75, 3,42,50, 3,42,54, 2,53,69, 1,79,80, 2,53,64, 2,53,63, 3,47,73,
+ 2,53,68, 1,79,78, 3,47,71, 4,46,58, 1,83, 6, 4,52,80, 2,53,65, 2,53,70,
+ 2,53,67, 2,53,66, 3,47,70, 1,79,79, 0, 0, 0, 1,83, 4, 3,51,60, 2,59,70,
+ 1,82,94, 3,51,57, 2,59,71, 3,51,58, 3,50, 8, 2,59,69, 3,51,56, 1,83, 3,
+ 1,83, 1, 1,83, 5, 3,51,61, 1,83, 2, 3,51,59, 3,51,63, 4,62,47, 3,57,59,
+ 3,55, 6, 2,64,49, 4,57,80, 2,64,54, 2,64,50, 2,64,53, 1,86, 8, 3,55, 8,
+ 2,62,33, 2,64,52, 2,64,51, 3,57,57, 1,87,78, 1,87,76, 1,87,79, 1,87,77,
+ 2,68,50, 2,68,51, 2,68,52, 1,87,80, 3,57,54, 3,57,56, 3,59,69, 2,71,85,
+ 1,89,44, 2,71,83, 4,66,16, 1,89,45, 2,71,82, 2,71,84, 1,89,43, 2,74,63,
+ 2,74,60, 4,69,12, 2,74,61, 2,74,62, 2,76,64, 1,91,34, 3,62,88, 1,91,33,
+ 3,62,87, 2,78,35, 2,78,34, 1,92, 4, 3,64,61, 3,64,62, 3,64,60, 1,92,47,
+ 1,92,84, 1,93,13, 2,81,39, 2,81,92, 2,81,93, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1,51,88, 2,33,50, 0, 0, 0, 4,33,81, 2,40,71, 2,47,20, 2,47,21, 1,75,76,
+ 4,40,55, 1,75,77, 2,53,71, 1,79,81, 0, 0, 0, 3,51,65, 1,86, 9, 3,55,10,
+ 2,68,53, 3,57,60, 1,87,81, 2,71,88, 1,89,46, 2,71,87, 2,71,89, 2,71,86,
+ 2,76,67, 2,74,64, 2,74,65, 3,61,54, 1,90,49, 0, 0, 0, 2,76,66, 3,62,91,
+ 3,62,89, 2,76,65, 3,62,90, 2,78,36, 2,81,94, 3,66, 5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,51,89, 3,62,92, 3,66, 6, 0, 0, 0, 1,51,90,
+ 0, 0, 0, 3,25,71, 1,56,74, 2,19,43, 3,70,80, 2,26,19, 3,25,72, 1,66,93,
+ 0, 0, 0, 1,67, 2, 1,66,94, 2,33,51, 3,37,59, 1,67, 4, 0, 0, 0, 1,67, 1,
+ 3,32,11, 3,37,60, 1,67, 3, 3,37,52, 1,71,70, 3,37,57, 2,40,72, 3,37,55,
+ 3,42,61, 2,40,73, 2,53,73, 4,33,91, 1,71,69, 1,71,71, 1,71,72, 3,37,56,
+ /* plane 0, page 153 */
+ 0, 255, /* first, last */
+ 2,47,23, 3,42,62, 2,47,22, 1,75,78, 5,43,44, 1,75,79, 3,42,59, 2,47,24,
+ 2,53,72, 1,75,81, 1,79,82, 4,46,67, 1,75,80, 0, 0, 0, 3,70,90, 0, 0, 0,
+ 1,83, 7, 2,53,74, 1,79,84, 1,79,83, 2,53,75, 2,53,78, 2,53,76, 2,53,77,
+ 1,79,85, 3,47,75, 1,83,12, 1,83,10, 3,51,69, 3,51,70, 1,83, 9, 2,59,73,
+ 3,51,68, 1,83,11, 3,51,66, 3,51,67, 2,59,72, 2,64,55, 4,52,94, 2,59,74,
+ 1,83, 8, 2,59,75, 2,64,58, 2,64,56, 2,64,57, 2,64,62, 1,87,85, 2,64,61,
+ 2,64,64, 2,64,63, 2,64,60, 2,64,59, 4,53, 1, 1,86,10, 3,57,66, 4,58, 9,
+ 3,57,65, 3,57,70, 2,68,56, 3,57,69, 2,68,55, 1,87,84, 1,87,82, 1,87,83,
+ 3,57,67, 2,68,54, 3,70,81, 2,71,92, 3,59,73, 1,89,47, 4,66,24, 2,71,91,
+ 2,71,90, 1,89,48, 4,69,26, 2,74,70, 2,74,69, 3,61,56, 2,74,67, 3,62,94,
+ 2,74,66, 1,90,51, 1,90,50, 2,74,71, 2,78,37, 1,92, 5, 2,76,69, 1,91,35,
+ 2,76,68, 2,74,68, 3,63,88, 2,78,38, 1,92,48, 3,65,10, 1,93,14, 2,81,40,
+ 4,78, 4, 2,82, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,51,91, 2,26,20,
+ 2,64,65, 1,51,92, 3,37,63, 5,43,46, 2,47,26, 2,47,25, 2,59,76, 5,58, 6,
+ 3,51,72, 2,64,67, 3,55,16, 2,64,66, 3,57,71, 1,87,86, 2,71,93, 2,71,94,
+ 1,90,52, 3,63, 1, 3,64,64, 2,82, 2, 1,56,75, 1,67, 6, 1,67, 5, 2,40,74,
+ 2,40,76, 1,71,74, 2,40,75, 1,71,73, 1,71,75, 2,40,77, 3,42,67, 3,42,66,
+ 3,42,70, 2,47,28, 2,47,30, 2,47,29, 3,42,65, 2,47,32, 3,42,64, 3,42,76,
+ 3,42,68, 1,75,82, 2,47,31, 2,47,27, 3,42,74, 0, 0, 0, 4,40,64, 2,47,33,
+ 3,47,83, 2,53,85, 3,47,77, 2,53,88, 2,53,90, 2,53,80, 2,53,84, 2,53,81,
+ 1,79,87, 1,79,90, 1,79,92, 2,53,82, 2,53,83, 1,79,91, 2,53,86, 2,53,89,
+ 2,53,87, 1,79,93, 3,47,78, 1,79,89, 2,53,79, 1,79,86, 3,47,82, 1,79,88,
+ 3,47,84, 3,51,80, 1,83,14, 2,59,82, 2,59,80, 2,59,79, 3,51,81, 2,59,85,
+ 3,51,75, 2,59,84, 2,59,83, 3,51,76, 2,59,78, 1,83,13, 2,59,77, 3,51,74,
+ 2,59,81, 1,83,15, 0, 0, 0, 3,55,20, 2,64,70, 3,55,23, 2,64,74, 2,64,71,
+ 2,64,73, 2,64,72, 2,64,69, 2,64,75, 2,64,78, 2,64,76, 2,64,77, 1,86,12,
+ /* plane 0, page 154 */
+ 0, 255, /* first, last */
+ 3,55,19, 1,86,11, 2,64,68, 2,64,79, 2,68,61, 2,68,64, 2,68,66, 2,68,65,
+ 3,57,74, 2,68,59, 2,68,63, 2,68,58, 3,57,75, 2,68,60, 1,87,87, 2,68,57,
+ 3,57,77, 2,68,62, 0, 0, 0, 0, 0, 0, 2,72,13, 2,72, 2, 1,89,49, 3,59,79,
+ 3,59,77, 1,89,50, 2,72, 1, 2,72, 6, 2,72,12, 2,72, 4, 2,72,11, 3,59,76,
+ 2,72, 8, 3,59,78, 2,72, 7, 2,72,10, 2,72, 5, 2,72, 3, 3,59,75, 2,72, 9,
+ 0, 0, 0, 2,74,78, 2,74,76, 1,90,53, 2,74,75, 2,74,81, 2,74,79, 3,61,58,
+ 1,90,54, 2,74,74, 2,74,72, 4,69,38, 2,74,73, 1,90,56, 2,74,77, 1,90,55,
+ 2,74,80, 2,76,70, 2,76,76, 3,63, 4, 3,63, 2, 2,76,71, 1,91,39, 2,76,77,
+ 1,91,38, 2,76,75, 2,76,74, 1,91,37, 2,76,73, 1,91,36, 2,76,72, 7,54,49,
+ 2,78,44, 2,78,46, 2,78,45, 4,73,74, 2,78,42, 1,92, 7, 2,78,39, 2,78,43,
+ 2,78,48, 3,63,89, 2,78,47, 2,78,40, 2,78,41, 1,92, 6, 2,79,64, 1,92,51,
+ 3,64,66, 2,79,65, 1,92,49, 1,92,50, 3,64,65, 4,76,29, 2,80,65, 1,92,85,
+ 2,81,69, 3,65,82, 1,93,23, 3,65,83, 2,82, 3, 1,93,24, 2,82, 4, 2,82, 5,
+ 2,82,19, 2,82,18, 1,93,39, 2,82,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1,56,76, 3,32,15, 4,34, 1, 2,40,79, 4,33,93, 2,40,78, 4,33,94, 1,75,83,
+ 1,75,84, 2,47,34, 4,46,84, 2,53,91, 2,59,88, 3,47,87, 3,47,86, 1,79,94,
+ 1,83,16, 2,59,86, 4,53,17, 2,59,89, 1,83,17, 3,55,26, 2,64,80, 2,59,87,
+ 2,68,67, 1,87,88, 2,72,14, 4,66,41, 3,61,65, 0, 0, 0, 2,74,84, 2,74,82,
+ 3,61,64, 3,61,62, 2,74,83, 0, 0, 0, 0, 0, 0, 2,76,78, 3,63, 5, 1,91,40,
+ 2,78,49, 1,92,54, 1,92, 8, 1,92,52, 1,92,53, 2,80,66, 1,93,15, 3,65,84,
+ 1,56,77, 4,22,13, 3,42,78, 4,46,89, 2,68,68, 3,63,91, 3,64,67, 2,19,44,
+ 3,32,18, 1,71,76, 3,37,65, 2,47,35, 3,42,79, 3,42,83, 1,75,85, 2,47,36,
+ 3,42,81, 3,42,80, 3,42,82, 2,53,93, 2,53,92, 1,83,19, 1,80, 1, 1,80, 2,
+ 4,47, 1, 2,54, 2, 2,54, 1, 2,53,94, 3,47,89, 3,51,85, 2,59,90, 2,59,93,
+ 3,51,84, 2,59,92, 2,59,91, 1,83,18, 2,64,84, 2,64,82, 2,64,81, 4,58,23,
+ /* plane 0, page 155 */
+ 0, 255, /* first, last */
+ 3,55,27, 2,64,83, 3,55,28, 1,87,89, 2,68,70, 2,68,71, 1,87,90, 3,57,79,
+ 2,68,69, 3,59,81, 2,72,16, 2,72,15, 2,72,18, 1,89,51, 2,72,17, 4,66,47,
+ 2,74,85, 2,74,87, 2,74,86, 0, 0, 0, 3,63, 7, 2,76,79, 2,76,82, 2,76,80,
+ 2,76,81, 2,78,50, 1,92, 9, 4,73,84, 4,73,81, 3,70,82, 2,79,66, 2,79,67,
+ 2,79,68, 3,65,12, 1,92,86, 1,93,16, 2,82, 6, 1,56,78, 3,42,85, 1,80, 3,
+ 1,83,20, 2,68,72, 3,61,66, 2,78,51, 3,65,14, 4,77,23, 2,81,70, 2,19,45,
+ 3,66, 8, 1,93,40, 1,56,79, 2,59,94, 3,55,30, 2,68,73, 0, 0, 0, 2,72,19,
+ 3,61,67, 4,72,22, 2,76,83, 2,78,52, 1,56,80, 3,37,66, 2,47,37, 2,47,38,
+ 3,42,88, 1,75,86, 1,75,87, 2,54, 4, 1,80, 5, 1,80, 4, 2,54, 3, 0, 0, 0,
+ 2,64,85, 3,55,31, 2,68,74, 2,68,76, 2,68,75, 1,87,93, 1,87,92, 1,87,91,
+ 3,61,68, 1,91,42, 2,76,84, 3,63, 8, 1,91,41, 2,78,54, 2,78,53, 3,65,15,
+ 1,92,87, 2,80,67, 1,62, 3, 2,40,80, 4,34, 9, 3,37,67, 0, 0, 0, 2,47,41,
+ 2,47,39, 2,47,40, 4,40,75, 3,47,94, 2,54,13, 4,47,16, 2,54, 8, 2,54, 5,
+ 2,54,12, 3,47,92, 4,47,21, 3,47,91, 2,54,14, 4,47,23, 4,47,12, 1,80, 7,
+ 2,54,11, 2,54, 7, 3,47,93, 4,47,10, 2,54, 6, 2,54,10, 2,54, 9, 1,80, 6,
+ 0, 0, 0,15,51,30, 2,60,11, 2,60, 6, 2,60, 4, 2,60,13, 2,60, 5, 4,53,39,
+ 2,60, 1, 4,53,35, 2,60, 7, 3,51,88, 3,51,90, 2,60, 2, 2,64,94, 2,60, 3,
+ 2,60,14, 3,52, 3, 4,53,37, 3,51,92, 3,52, 1, 5,58,42, 3,52, 5, 3,51,93,
+ 2,60,10, 1,83,21, 2,60, 9, 2,60, 8, 3,51,89, 2,60,12,15,57,24, 0, 0, 0,
+ 3,70,83, 3,55,36, 2,64,86, 2,64,89, 4,58,41, 3,55,37, 2,64,88, 3,55,32,
+ 2,65, 2, 2,64,91, 2,65, 1, 3,55,34, 2,64,93, 2,64,92, 2,64,90, 4,58,33,
+ 2,64,87, 4,58,31, 1,86,15, 1,86,14, 4,58,36, 1,86,16, 1,86,13, 2,65, 3,
+ 4,58,37,15,61,86, 0, 0, 0, 4,58,35, 0, 0, 0, 2,68,82, 2,68,85, 4,63, 6,
+ 2,68,83, 2,68,87, 5,70,89, 3,57,84, 4,63, 2, 2,68,88, 4,63,10, 2,68,80,
+ 1,88, 4, 2,68,81, 3,57,83, 2,68,79, 2,68,86, 3,59,84, 2,68,78, 2,68,77,
+ 1,88, 3, 1,88, 1, 1,87,94, 3,57,86, 3,57,85, 3,55,35, 0, 0, 0,15,65,82,
+ 0, 0, 0, 0, 0, 0, 3,57,81, 2,68,84, 2,72,28, 2,72,34, 1,89,54, 2,72,29,
+ 5,75,19, 2,72,32, 2,72,36, 1,89,55, 2,72,31, 4,66,60, 2,72,23, 3,59,85,
+ 2,72,22, 2,72,35, 2,72,26, 3,59,87, 2,72,24, 2,72,33, 2,72,25, 1,89,53,
+ 1,89,52, 3,59,89, 2,72,20, 2,72,21, 2,72,30, 4,66,70, 3,59,90, 4,66,72,
+ 2,72,27, 0, 0, 0, 0, 0, 0,15,68,75, 4,66,53, 0, 0, 0, 3,61,79, 2,74,90,
+ 2,74,93, 3,61,81, 4,66,54, 3,61,71, 3,61,73, 1,88, 2, 3,61,74, 3,61,84,
+ /* plane 0, page 156 */
+ 0, 255, /* first, last */
+ 3,61,85, 4,69,58, 3,61,78, 4,69,57, 3,61,72, 2,74,91, 2,75, 3, 2,75, 1,
+ 2,74,89, 2,75, 6, 3,61,70, 2,74,88, 3,61,86, 1,90,58, 2,75, 2, 4,69,52,
+ 3,61,83, 4,69,55, 2,74,92, 1,90,57, 2,75, 5, 3,61,82, 4,69,61, 2,75, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,61,80, 2,76,87, 2,76,86, 5,82,49, 3,63,12,
+ 5,82,43, 2,76,93, 5,82,46, 2,76,89, 2,76,92, 1,91,44, 4,72,27, 4,72,30,
+ 2,76,90, 2,76,91, 4,72,25, 2,76,85, 2,76,88, 1,91,43, 3,63,10,15,73,10,
+ 0, 0, 0, 1,92,11, 2,78,65, 2,78,60, 2,78,64, 3,64, 5, 2,78,67, 2,78,63,
+ 3,63,94, 2,78,59, 3,64, 3, 1,92,13, 2,78,62, 2,78,66, 1,92,12, 2,78,57,
+ 2,74,94, 2,78,61, 4,74, 3, 5,85,13, 2,78,58, 3,64, 2, 2,78,55,15,74,30,
+ 2,78,56, 1,92,10, 2,79,72, 2,79,74, 2,79,77, 2,79,73, 2,79,78, 3,64,69,
+ 2,79,71, 3,64,70, 2,79,69, 3,64,72, 1,92,55, 2,79,75, 1,92,57, 1,92,56,
+ 2,79,70, 2,79,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,65,18, 2,80,72, 1,92,88,
+ 2,80,73, 3,65,19, 2,80,71, 2,80,68, 4,76,42, 3,65,20, 2,80,70, 2,80,69,
+ 2,81,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,65,57, 2,81,43, 2,81,42, 3,65,59,
+ 0, 0, 0, 2,81,73, 5,90,51, 2,81,72, 2,81,71, 2,81,74, 3,65,85, 1,93,32,
+ 1,93,33, 2,82,24, 2,82,28, 3,66,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,62, 4, 2,33,52, 2,40,83,
+ 3,37,68, 1,71,77, 2,40,81, 3,37,70, 3,15,34, 2,40,82, 3,37,72, 3,37,71,
+ 0, 0, 0, 2,47,42, 2,47,43, 1,75,90, 1,75,88, 2,47,44, 1,75,89, 2,54,19,
+ 3,48, 7, 2,54,22, 2,54,16, 2,54,23, 2,54,15, 2,54,17, 3,48,10, 2,54,18,
+ /* plane 0, page 157 */
+ 0, 255, /* first, last */
+ 2,54,21, 3,48, 4, 3,48,11, 1,80,10, 2,54,26, 2,54,25, 1,80, 8, 2,54,20,
+ 2,54,24, 1,80, 9, 3,52,13, 4,47,34, 3,48, 5, 3,48, 2, 0, 0, 0, 3,52,10,
+ 2,60,24, 4,53,50, 1,83,26, 3,52,12, 2,60,19, 1,83,22, 3,52,22, 2,60,16,
+ 2,60,22, 2,60,25, 3,52,19, 1,83,27, 4,58,46, 2,60,21, 2,60,18, 2,60,26,
+ 2,60,17, 3,52,23, 2,60,23, 1,83,23, 3,52, 9, 2,60,15, 1,83,24, 3,52,21,
+ 1,83,25, 2,60,20, 3,52,18, 0, 0, 0, 0, 0, 0, 2,65,21, 2,65, 8, 2,65, 9,
+ 2,65,12, 2,65,10, 4,58,53, 2,65, 4, 4,58,54, 3,55,45, 2,65, 7, 2,65,17,
+ 2,65,11, 3,55,40, 4,58,47, 1,86,17, 4,58,45, 2,65,19, 2,65,16, 1,86,18,
+ 2,65,18, 2,65, 5, 2,65,14, 2,65,15, 3,55,42, 2,65,13, 0, 0, 0,15,62, 4,
+ 0, 0, 0, 3,70,85, 2,68,92, 2,68,94, 2,69, 3, 3,57,89, 3,57,91, 2,68,91,
+ 3,57,93, 1,88, 5, 2,69, 5, 2,68,90, 2,69, 6, 3,57,94, 2,69, 2, 2,69, 4,
+ 2,69, 8, 2,69, 1, 2,69, 9, 2,68,93, 2,68,89, 1,88, 6, 3,58, 2, 2,69, 7,
+ 1,88, 7, 1,89,57, 4,63,20, 3,57,90,15,65,87, 0, 0, 0, 3,59,93, 2,65, 6,
+ 2,72,62, 2,72,53, 1,89,59, 2,72,49, 1,89,60, 3,60, 7, 3,60, 2, 2,72,58,
+ 2,72,52, 2,72,42, 1,89,58, 2,72,55, 2,72,50, 2,72,51, 3,60, 5, 2,72,37,
+ 2,72,44, 2,72,59, 3,59,94, 2,72,56, 5,75,31, 2,72,48, 3,60, 6, 2,72,60,
+ 2,72,43, 2,72,38, 2,72,57, 3,60, 4, 2,72,40, 2,72,54, 2,72,45, 2,72,61,
+ 2,72,41, 1,89,56, 2,72,39, 2,72,46, 2,72,47, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2,75,13, 3,60, 3, 2,75,11, 4,69,73, 2,75,16, 3,61,89, 2,75,28, 2,75,19,
+ 2,75,12, 2,75, 8, 2,75,21, 2,75,14, 2,75,17, 2,75,10, 2,75,24, 2,75, 7,
+ 2,75,15, 2,75,20, 2,75,22, 2,75,25, 2,75, 9, 3,61,90, 2,75,29, 2,75,30,
+ 2,75,23, 2,75,27, 2,75,18, 0, 0, 0, 2,77,15, 2,77,18, 3,63,21, 1,91,45,
+ 3,63,17, 2,77,17, 2,77,22, 2,77,20, 1,91,46, 2,77,11, 2,77, 1, 2,76,94,
+ 1,91,48, 2,77,13, 2,77,14, 2,77,10, 2,77, 2, 3,63,18, 2,77, 7, 2,75,26,
+ 4,72,35, 2,77, 3, 1,91,47, 2,77, 9, 3,63,22, 2,77, 8, 0, 0, 0, 2,77, 4,
+ 2,77,16, 4,72,36, 2,77, 5, 2,78,72, 2,77,19, 2,77,21, 2,77,12, 2,77, 6,
+ 2,78,73, 2,78,75, 2,78,69, 1,92,14, 4,74, 5, 2,78,82, 2,78,80, 1,92,15,
+ 2,78,79, 2,78,78, 2,78,71, 2,78,68, 2,78,74, 2,78,83, 2,78,70, 2,78,76,
+ 5,85,37, 2,79,87, 2,79,92, 2,79,82, 2,79,85, 1,92,58, 2,79,89, 4,75,38,
+ 2,80, 2, 2,78,77, 4,75,42, 2,79,83, 2,79,93, 2,80, 3, 2,79,88, 2,79,81,
+ 2,79,91, 4,75,43, 2,79,90, 2,80, 1, 2,79,94, 2,78,81, 2,79,86, 2,79,80,
+ 2,79,84, 1,92,89, 1,92,90, 2,79,79, 3,64,76, 2,80,84, 2,80,75, 2,80,83,
+ /* plane 0, page 158 */
+ 0, 255, /* first, last */
+ 2,80,80, 2,80,81, 2,80,74, 2,80,77, 2,80,85, 2,80,79, 2,80,78, 2,80,76,
+ 3,65,21, 2,80,82, 4,76,54, 2,81,44, 4,77,26, 2,81,45, 3,65,61, 2,81,47,
+ 2,81,46, 2,81,49, 2,81,48, 2,81,76, 2,81,75, 2,82, 7, 3,66, 9, 2,82, 8,
+ 3,66,16, 2,82,20, 1,93,37, 1,93,41, 3,66,24, 2,82,29, 1,93,42, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,62, 5, 4,47,40, 5,58,59,
+ 0, 0, 0, 1,90,59, 2,77,23, 3,63,23, 1,92,91, 1,92,92, 0, 0, 0, 1,62, 6,
+ 2,40,84, 3,37,73, 1,71,78, 2,54,27, 3,48,12, 3,52,25, 2,60,28, 2,60,29,
+ 2,60,27, 2,65,23, 2,65,22, 1,86,19, 2,69,11, 2,65,24, 2,69,10, 4,63,26,
+ 3,58, 4, 2,72,64, 1,89,61, 1,89,63, 2,72,63, 3,60, 9, 4,66,85, 1,89,62,
+ 3,62, 1, 2,75,31, 2,75,33, 2,75,32, 2,77,24, 1,91,49, 3,63,26, 1,92,59,
+ 2,80,86, 2,81,50, 3,66,17, 3,66,31, 2,82,33, 1,62, 7, 3, 5,39, 2,47,45,
+ 4,47,44, 1,80,11, 3,48,15, 3,48,14, 3,52,26, 2,60,31, 2,60,30, 3,55,48,
+ 2,65,25, 3,58, 6, 3,58, 5, 4,66,94, 1,89,64, 1,90,60, 2,78,84, 2,82,25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,62, 8, 1,75,91, 3,43, 2, 1,80,12,15,65,92,
+ 2,72,65, 3,62, 2, 2,80, 4, 1,67, 7, 3,25,74, 3,52,28, 3,52,27, 4,58,61,
+ 2,65,26, 0, 0, 0, 3,58, 8, 4,63,30, 1,93,17, 1,67, 8, 1,80,13, 1,86,20,
+ 2,80, 5, 1,67, 9, 3,25,75, 2,54,28, 1,83,29, 2,60,32, 2,60,33, 3,52,29,
+ 1,83,28, 4,53,64, 2,65,27, 1,86,24, 1,86,22, 1,86,23, 1,86,21, 2,69,12,
+ 1,88, 8, 0, 0, 0, 4,67, 4, 3,60,10, 2,75,35, 2,75,34, 2,75,37, 2,75,36,
+ 1,90,61, 0, 0, 0, 0, 0, 0, 2,77,25, 4,72,54, 2,77,27, 2,77,26, 1,91,50,
+ 2,78,85, 3,64, 9, 2,80, 6, 2,80, 7, 1,92,60, 2,81,51, 2,81,77, 1,93,34,
+ 4,78,35, 2,33,53, 2,60,34, 2,65,28, 2,72,66, 2,40,85, 3, 7,82, 2,65,29,
+ /* plane 0, page 159 */
+ 0, 165, /* first, last */
+ 2,69,14, 2,69,13, 3,58, 9, 3,60,13, 3,60,14, 3,63,28, 2,80, 8, 1,92,93,
+ 3,65,63, 2,81,52, 2,81,78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,71,79, 2,54,29,
+ 2,54,30, 4,47,54, 2,60,35, 1,71,80, 3,37,74, 1,88, 9, 2,69,15, 3,60,16,
+ 2,77,29, 1,91,51, 2,77,30, 2,77,28, 2,80, 9, 3,65,64, 2,80,87, 4,77,40,
+ 1,71,81, 0, 0, 0, 2,65,32, 2,65,31, 2,65,30, 2,69,16, 3,58,11, 3,58,10,
+ 2,69,20, 2,69,19, 2,69,18, 2,69,17, 1,88,10, 2,72,67, 2,75,39, 1,90,62,
+ 2,75,38, 2,77,31, 2,78,88, 2,78,87, 1,92,16, 2,78,86, 2,80,12, 2,80,11,
+ 2,80,10, 3,64,77, 4,78,36, 1,75,92, 4,53,67, 2,60,36, 1,86,25, 4,58,68,
+ 2,72,68, 2,72,69, 2,78,89, 2,80,13, 4,75,60, 3,65,27, 2,80,88, 2,81,53,
+ 2,82, 9, 2,82,35, 1,75,93, 1,86,26, 2,69,21, 2,72,70, 2,77,32, 2,80,14,
+ 3, 3,80, 0, 0, 0, 1,80,15, 3,52,30, 2,65,33, 2,69,22, 2,72,71, 2,72,72,
+ 2,72,73, 2,75,44, 3,62, 4, 2,75,40, 1,91,52, 2,75,43, 2,75,42, 1,90,63,
+ 2,75,41, 1,90,65, 0, 0, 0, 1,90,64, 2,77,34, 2,77,33, 1,91,53, 1,91,54,
+ 4,72,64, 3,63,30, 1,92,18, 2,78,90, 1,92,17, 4,75,65, 2,80,17, 2,80,18,
+ 2,80,16, 2,80,15, 1,93, 1, 4,76,68, 2,80,89, 2,80,90, 2,80,91, 1,92,94,
+ 2,81,54, 2,81,57, 2,81,56, 2,81,55, 3,66,19, 4,78,37, 2,82,34, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,83,30, 3,55,53, 4,67,13,
+ 1,88,18, 2,75,45, 2,77,35, 3,64,11, 1,92,19, 2,78,91, 4,78,53, 3,66,34,
+ 2,82,36,15, 1,57, 0, 0, 0, 0, 0, 0, 1,83,31, 3,62,39, 4,78,19, 0, 0, 0,
+ 2,65,34, 3,63,31, 2,78,92, 3,65,65, 2,81,79, 3,65,87,
+ /* plane 0, page 160: --- */
+ /* plane 0, page 161: --- */
+ /* plane 0, page 162: --- */
+ /* plane 0, page 163: --- */
+ /* plane 0, page 164: --- */
+ /* plane 0, page 165: --- */
+ /* plane 0, page 166: --- */
+ /* plane 0, page 167: --- */
+ /* plane 0, page 168: --- */
+ /* plane 0, page 169: --- */
+ /* plane 0, page 170: --- */
+ /* plane 0, page 171: --- */
+ /* plane 0, page 172: --- */
+ /* plane 0, page 173: --- */
+ /* plane 0, page 174: --- */
+ /* plane 0, page 175: --- */
+ /* plane 0, page 176: --- */
+ /* plane 0, page 177: --- */
+ /* plane 0, page 178: --- */
+ /* plane 0, page 179: --- */
+ /* plane 0, page 180: --- */
+ /* plane 0, page 181: --- */
+ /* plane 0, page 182: --- */
+ /* plane 0, page 183: --- */
+ /* plane 0, page 184: --- */
+ /* plane 0, page 185: --- */
+ /* plane 0, page 186: --- */
+ /* plane 0, page 187: --- */
+ /* plane 0, page 188: --- */
+ /* plane 0, page 189: --- */
+ /* plane 0, page 190: --- */
+ /* plane 0, page 191: --- */
+ /* plane 0, page 192: --- */
+ /* plane 0, page 193: --- */
+ /* plane 0, page 194: --- */
+ /* plane 0, page 195: --- */
+ /* plane 0, page 196: --- */
+ /* plane 0, page 197: --- */
+ /* plane 0, page 198: --- */
+ /* plane 0, page 199: --- */
+ /* plane 0, page 200: --- */
+ /* plane 0, page 201: --- */
+ /* plane 0, page 202: --- */
+ /* plane 0, page 203: --- */
+ /* plane 0, page 204: --- */
+ /* plane 0, page 205: --- */
+ /* plane 0, page 206: --- */
+ /* plane 0, page 207: --- */
+ /* plane 0, page 208: --- */
+ /* plane 0, page 209: --- */
+ /* plane 0, page 210: --- */
+ /* plane 0, page 211: --- */
+ /* plane 0, page 212: --- */
+ /* plane 0, page 213: --- */
+ /* plane 0, page 214: --- */
+ /* plane 0, page 215: --- */
+ /* plane 0, page 216: --- */
+ /* plane 0, page 217: --- */
+ /* plane 0, page 218: --- */
+ /* plane 0, page 219: --- */
+ /* plane 0, page 220: --- */
+ /* plane 0, page 221: --- */
+ /* plane 0, page 222: --- */
+ /* plane 0, page 223: --- */
+ /* plane 0, page 224: --- */
+ /* plane 0, page 225: --- */
+ /* plane 0, page 226: --- */
+ /* plane 0, page 227: --- */
+ /* plane 0, page 228: --- */
+ /* plane 0, page 229: --- */
+ /* plane 0, page 230: --- */
+ /* plane 0, page 231: --- */
+ /* plane 0, page 232: --- */
+ /* plane 0, page 233: --- */
+ /* plane 0, page 234: --- */
+ /* plane 0, page 235: --- */
+ /* plane 0, page 236: --- */
+ /* plane 0, page 237: --- */
+ /* plane 0, page 238: --- */
+ /* plane 0, page 239: --- */
+ /* plane 0, page 240: --- */
+ /* plane 0, page 241: --- */
+ /* plane 0, page 242: --- */
+ /* plane 0, page 243: --- */
+ /* plane 0, page 244: --- */
+ /* plane 0, page 245: --- */
+ /* plane 0, page 246: --- */
+ /* plane 0, page 247: --- */
+ /* plane 0, page 248: --- */
+ /* plane 0, page 249: --- */
+ /* plane 0, page 250 */
+ 40, 40, /* first, last */
+ 15,56,44,
+ /* plane 0, page 251: --- */
+ /* plane 0, page 252: --- */
+ /* plane 0, page 253: --- */
+ /* plane 0, page 254 */
+ 48, 107, /* first, last */
+ 1, 1,11, 1, 1,22, 1, 1,24, 0, 0, 0, 0, 0, 0, 1, 1,32, 1, 1,33, 1, 1,36,
+ 1, 1,37, 1, 1,40, 1, 1,41, 1, 1,44, 1, 1,45, 1, 1,48, 1, 1,49, 1, 1,52,
+ 1, 1,53, 1, 1,56, 1, 1,57, 1, 1,60, 1, 1,61, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 2, 7, 1, 2, 8, 1, 2,11, 1, 2,12, 1, 2, 9, 1, 2,10, 0, 0, 0,
+ 1, 1,14, 1, 1,15, 1, 1,16, 0, 0, 0, 1, 1,18, 1, 1,19, 1, 1,20, 1, 1,21,
+ 0, 0, 0, 1, 1,62, 1, 1,63, 1, 1,64, 1, 1,65, 1, 1,66, 1, 1,67, 1, 2,13,
+ 1, 2,14, 1, 2,15, 1, 2,31, 1, 2,32, 1, 2,33, 1, 2,35, 1, 2,34, 0, 0, 0,
+ 1, 2,66, 1, 2,76, 1, 2,77, 1, 2,78,
+ /* plane 0, page 255 */
+ 1, 229, /* first, last */
+ 1, 1,10, 0, 0, 0, 1, 1,76, 1, 2,67, 1, 2,72, 1, 1,77, 0, 0, 0,
+ 1, 1,30, 1, 1,31, 1, 1,78, 1, 2,16, 1, 1, 2, 1, 2,17, 1, 1, 5, 1, 2,63,
+ 1, 4, 1, 1, 4, 2, 1, 4, 3, 1, 4, 4, 1, 4, 5, 1, 4, 6, 1, 4, 7, 1, 4, 8,
+ 1, 4, 9, 1, 4,10, 1, 1, 8, 1, 1, 7, 1, 2,22, 1, 2,24, 1, 2,23, 1, 1, 9,
+ 1, 2,73, 1, 4,33, 1, 4,34, 1, 4,35, 1, 4,36, 1, 4,37, 1, 4,38, 1, 4,39,
+ 1, 4,40, 1, 4,41, 1, 4,42, 1, 4,43, 1, 4,44, 1, 4,45, 1, 4,46, 1, 4,47,
+ 1, 4,48, 1, 4,49, 1, 4,50, 1, 4,51, 1, 4,52, 1, 4,53, 1, 4,54, 1, 4,55,
+ 1, 4,56, 1, 4,57, 1, 4,58, 0, 0, 0, 1, 2,64, 0, 0, 0, 0, 0, 0, 1, 2, 5,
+ 0, 0, 0, 1, 4,59, 1, 4,60, 1, 4,61, 1, 4,62, 1, 4,63, 1, 4,64, 1, 4,65,
+ 1, 4,66, 1, 4,67, 1, 4,68, 1, 4,69, 1, 4,70, 1, 4,71, 1, 4,72, 1, 4,73,
+ 1, 4,74, 1, 4,75, 1, 4,76, 1, 4,77, 1, 4,78, 1, 4,79, 1, 4,80, 1, 4,81,
+ 1, 4,82, 1, 4,83, 1, 4,84, 1, 1,34, 1, 2,62, 1, 1,35, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2,70, 1, 2,71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,68,
+ /* plane 1: --- */
+ /* plane 2, page 0 */
+ 0, 254, /* first, last */
+ 5, 1, 5, 0, 0, 0,15, 1, 1, 6, 1,15, 6, 1,13, 6, 1,14, 0, 0, 0, 6, 1,34,
+ 6, 1,35, 5, 1,19, 0, 0, 0, 3, 1,36, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 1,30,
+ 15, 1,31, 0, 0, 0, 6, 2,11, 0, 0, 0, 5, 1,45, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 3,32, 6, 3,30, 6, 3,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 4,71, 6, 5,63, 5, 3,15,15, 2,84, 0, 0, 0, 6, 5,71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 5,67, 0, 0, 0, 0, 0, 0, 6, 9,23, 6, 9,26, 6, 9,24, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 9, 2,15, 9, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,14,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,16,82, 0, 0, 0, 5,19, 3, 0, 0, 0, 0, 0, 0,15,25,18,15,25,19,
+ 6,39,13, 0, 0, 0, 0, 0, 0,15,27,83,15,32,21,15,32,85, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,39,34,15,45,54, 0, 0, 0, 7, 1, 1,15,57,39, 4,47,92,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,58,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 1,12, 6, 1, 2, 0, 0, 0, 6, 2,63, 4, 1,54, 6, 3,33, 6, 5,64,
+ 0, 0, 0, 6, 9,27, 0, 0, 0, 5, 5, 1, 0, 0, 0, 5, 7,90, 6,14,42,15, 9,48,
+ 6,21, 5, 6,21, 6, 6,37,93, 0, 0, 0, 6,38,31, 0, 0, 0,15,38,32, 5,36,94,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1,18, 5, 1,13, 6, 2,13,
+ 0, 0, 0, 0, 0, 0, 6, 3,34,15,13,65, 6,48,48,15,51,36, 4, 1, 1, 5, 1, 6,
+ 6, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 1, 2, 6, 1,19, 0, 0, 0, 6, 1,36,
+ 0, 0, 0, 0, 0, 0,15, 1, 5,15, 1, 6, 5, 1,46, 6, 2,16, 0, 0, 0,15, 1,37,
+ 6, 2,46, 6, 2,15,15, 1,32,15, 1,33, 6, 1,37, 0, 0, 0, 6, 2,17, 0, 0, 0,
+ 6, 2,14, 0, 0, 0, 4, 2, 6, 4, 2, 5, 5, 2, 4, 5, 2, 5, 0, 0, 0, 0, 0, 0,
+ 6, 3,35, 6, 9,30, 0, 0, 0, 0, 0, 0, 6, 4,61, 0, 0, 0, 6, 5,54, 6, 5,65,
+ 6, 5,66, 6,12,35, 6, 9,28, 6,26,69,15, 9, 5, 6,13,13, 6, 9,29, 6,14,43,
+ 0, 0, 0, 5,11,71, 6,21,10, 0, 0, 0, 6,21, 7, 6,25,68, 6,21, 9, 6,28,91,
+ 0, 0, 0, 0, 0, 0, 6,37,94, 6,38,32, 6,38,33, 0, 0, 0, 5,29,54, 0, 0, 0,
+ 0, 0, 0, 5, 1, 3, 0, 0, 0, 5, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 6,
+ 6, 1, 5, 5, 1, 1, 5, 1,11, 0, 0, 0,15, 1, 3, 6, 1,38, 5, 1,20, 0, 0, 0,
+ 15, 1, 7,15, 1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2,19, 6, 2,18,
+ 6, 2,10, 5, 1,47, 0, 0, 0, 0, 0, 0, 6, 3,38, 6, 3,36,15, 1,78, 6, 3,37,
+ 0, 0, 0, 0, 0, 0,15, 2,85, 0, 0, 0, 0, 0, 0, 6, 9,31, 0, 0, 0, 0, 0, 0,
+ 6,13,12, 4, 6, 4, 6,14,45, 6,14,46,15, 5,32, 0, 0, 0, 6,14,44, 0, 0, 0,
+ 6,21,11, 0, 0, 0, 0, 0, 0,15,13,64, 6,28,94, 5,16,83, 6,28,93,
+ /* plane 2, page 1 */
+ 2, 255, /* first, last */
+ 15,25,20, 0, 0, 0, 6,48,49, 5,36,53,15,38,33, 6,58,67,
+ 6,58,66, 7,22,83, 7,38, 7, 7,45,26, 5, 1, 4, 5, 1, 7, 4, 1, 8, 5, 1, 8,
+ 0, 0, 0, 5, 1,12, 6, 1,39, 6, 1,40, 6, 1,41, 6, 3,39, 5, 3,16, 6, 5,68,
+ 0, 0, 0, 6, 9,32, 5,16,84, 6,38,34, 0, 0, 0, 7,12,28, 6, 1, 7, 6, 1, 8,
+ 6, 1, 9, 6, 1,42, 6, 5,69, 6, 3,40, 6, 3,41, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 5,72, 0, 0, 0,15, 2,86, 0, 0, 0, 4, 5,19, 5, 5, 2, 4, 5,18, 0, 0, 0,
+ 6,14,48, 5, 7,91,15, 9, 7, 0, 0, 0, 6,16,92, 6,21,13, 0, 0, 0, 6,21,12,
+ 15,13,66, 6,29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,45,78, 0, 0, 0, 0, 0, 0, 6, 3,42,15, 1,79,15, 1,80, 0, 0, 0,15, 2,11,
+ 5, 3,17,15, 2,87,15, 2,88,15, 2,89, 5, 5, 3, 0, 0, 0, 0, 0, 0, 6, 9,33,
+ 0, 0, 0,15, 5,35, 0, 0, 0, 6,14,50, 6,14,49,15, 9, 8, 6,21,15, 5,12,70,
+ 4,11,63, 6,21,16, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,13,67, 6,21,17, 6,38,35,
+ 6,29, 3, 6,29, 2, 4,16,36, 5,16,85,15,18,84,15,18,85, 0, 0, 0,15,18,82,
+ 0, 0, 0, 6,38,37, 6,38,36, 6,38,38, 4,22,15,15,25,21,15,25,22,15,25,23,
+ 6,44,13, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,32,22,15,32,23,15,32,24, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,38,34, 0, 0, 0,
+ 6,48,50, 5,43,81, 7, 1, 2,15,45,55,15,45,56,15,45,57, 7, 6,89, 7, 1, 4,
+ 0, 0, 0, 7, 1, 3, 7, 1,38, 0, 0, 0, 7,12,31, 0, 0, 0, 5,51,51, 7,12,30,
+ 0, 0, 0, 0, 0, 0, 7,12,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,38, 3, 7,38, 8, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1,20, 6, 1,21,15, 1, 4, 6, 1,44,15, 1, 9,
+ 6, 1,43, 3, 1,79, 0, 0, 0, 0, 0, 0,15, 1,35, 6, 2,21, 0, 0, 0, 6, 2,20,
+ 6, 2,22, 0, 0, 0, 4, 1,56, 0, 0, 0, 4, 2,12, 4, 2,11, 4, 2, 9, 6, 3,47,
+ 4, 2,16, 6, 3,48, 5, 2, 7, 6, 3,45, 6, 3,44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4, 2,15, 6, 3,43,15, 1,83,15, 1,84,15, 1,85,15, 1,86,
+ 15, 1,87,15, 1,88,15, 1,89, 5, 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3,49,
+ 5, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 1,90, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 3,18, 6, 5,74, 4, 3,26, 6, 5,75, 6, 5,84, 6, 5,80, 6, 5,76,15, 2,90,
+ 15, 2,91,15, 2,92,15, 2,93,15, 3, 1,15, 3, 2,15, 3, 3,15, 3, 5,15, 3, 8,
+ 15, 3, 9,15, 3,10,15, 3,11,15, 3,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4, 3,24, 6, 5,77, 0, 0, 0, 6, 5,79, 0, 0, 0, 0, 0, 0,15, 3, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 5,78, 6, 5,73,
+ /* plane 2, page 2 */
+ 0, 255, /* first, last */
+ 5, 3,19, 6, 5,83, 0, 0, 0, 6, 9,35, 6, 9,37, 4, 5,26, 5, 5, 8, 6, 9,38,
+ 5, 5, 9, 3, 7,46, 5, 5,10, 4, 5,23, 4, 5,21, 6, 9,42, 6, 9,36, 6, 9,44,
+ 6, 9,39, 6, 9,46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 6, 6, 9,34,15, 5,37,
+ 15, 5,38,15, 5,40,15, 5,41,15, 5,43,15, 5,44,15, 5,45,15, 5,46,15, 5,47,
+ 15, 5,48,15, 5,49, 6, 9,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 9,40,
+ 6, 9,41, 6, 9,43, 5, 5, 4, 0, 0, 0, 5, 5, 7, 5, 7,92, 6,14,68, 6,14,57,
+ 5,11,82, 4, 8,22, 6,14,67, 6,14,55, 6,14,54, 5, 8, 3, 4, 8,27, 6,14,61,
+ 5, 7,94, 5, 7,93, 5, 8, 2, 6,14,66, 6,14,53, 6,14,52, 6,14,69, 6,14,60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 9, 9,15, 9,10,15, 9,11,15, 9,12,
+ 15, 9,14,15, 9,15,15, 9,17,15, 9,18,15, 9,19,15, 9,20,15, 9,21,15, 9,22,
+ 15, 9,23,15, 9,24, 6,14,51, 0, 0, 0, 6,14,56, 6,14,59, 6,14,62, 0, 0, 0,
+ 6,14,64, 0, 0, 0, 0, 0, 0,15, 5,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,14,63, 5, 8, 4, 4,11,67, 5,11,80, 4,11,71, 6,21,22, 5,11,75,
+ 6,21,21, 5,11,84, 4,11,70, 4,11,72, 5,11,79, 6,21,18, 5,11,73, 0, 0, 0,
+ 0, 0, 0,15,13,68,15,13,78, 6,21,23, 0, 0, 0, 0, 0, 0, 5,11,78,15,13,70,
+ 15,13,71,15,13,74,15,13,75,15,13,76,15,13,77,15,13,79,15,13,81,15,13,82,
+ 15,13,83,15,13,84,15,13,85,15,13,86,15,13,88,15,13,89,15,13,90,15,13,91,
+ 15,13,92, 0, 0, 0, 6,21, 1, 6,21,26, 6,21,27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,21,19, 6,21,20, 0, 0, 0, 5,11,72, 0, 0, 0, 6,21,25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,13,87, 0, 0, 0,
+ 15,13,80, 0, 0, 0, 5,11,74, 5,11,77, 5,11,85, 5,11,81, 5,11,83, 4,11,64,
+ 6,29,11, 6,29,13, 6,29,12, 4,16,41, 4,16,40, 6,29,16, 6,29, 8, 0, 0, 0,
+ 5,17, 1, 6,29,19, 5,16,87, 6,29,14, 6,29, 7, 5,17, 2, 5,16,86, 4,16,38,
+ 6,29,10, 6,29,17, 6,29,23, 6,29,18, 0, 0, 0, 0, 0, 0, 6,29, 9, 0, 0, 0,
+ 0, 0, 0, 4,16,43, 6,29,20,15,13,73,15,18,87,15,18,88,15,18,89,15,18,90,
+ 15,18,91,15,18,92,15,18,94,15,19, 1,15,19, 3,15,19, 4,15,19, 5,15,19, 6,
+ 15,19, 7, 6,38,23, 6,29,24, 6,30,69, 6,29,25, 6,29,15, 5,16,90, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,35,67, 0, 0, 0, 5,16,93, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,17, 3, 6,29, 4, 6,29, 6, 0, 0, 0,15,18,93, 0, 0, 0, 5,16,89,
+ 5,16,94, 5,16,88, 6,29, 5, 6,29,22, 5,16,92, 6,38,41, 6,38,47, 5,22,54,
+ 5,22,49, 6,38,44, 5,22,46, 5,22,50, 5,22,67, 5,22,51, 6,38,40, 5,22,53,
+ 5,22,48, 6,38,54, 4,22,21, 5,22,52, 6,38,50, 6,38,48, 6,38,43, 6,38,46,
+ /* plane 2, page 3 */
+ 0, 251, /* first, last */
+ 6,38,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,18,86,
+ 6,38,56, 5,22,47, 0, 0, 0, 5,22,55, 6,38,39,15,25,24,15,25,25,15,25,26,
+ 15,25,27,15,25,28,15,25,29,15,25,30,15,25,31, 0, 0, 0, 0, 0, 0, 6,38,45,
+ 4,22,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,38,49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,38,52, 5,22,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,38,42, 5,20, 1, 6,48,58, 4,34,24, 5,29,58, 5,29,56, 6,48,51,
+ 5,16,91, 5,29,62, 5,29,60, 6,48,56, 5,29,59, 6,48,63, 6,48,61, 4,28,14,
+ 0, 0, 0, 6,48,60, 6,48,66, 6,48,53, 4,28,15, 0, 0, 0, 5,29,64, 6,48,52,
+ 5,29,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,48,55, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,48,62,15,32,25,15,32,26,15,32,27,15,32,28,15,32,29,15,32,30,15,32,31,
+ 15,32,32,15,32,33,15,32,34,15,32,35,15,32,36,15,32,37,15,32,38, 0, 0, 0,
+ 6,48,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,54,46, 6,48,57,
+ 0, 0, 0, 0, 0, 0, 6,48,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,38,55,
+ 5,29,57, 5,29,61, 5,29,63, 4,28,11, 6,48,64, 0, 0, 0, 6,58,81, 5,29,65,
+ 7, 1,14, 4,34,20, 5,36,54, 6,58,68, 6,58,73, 5,29,66, 6,58,75, 4,34,25,
+ 6,58,84, 4,34,17, 6,58,85, 6,58,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,58,71, 6,58,86,15,38,35,15,38,36,15,38,37,15,38,38,
+ 15,38,39,15,38,41,15,38,42,15,38,43,15,38,44,15,38,45,15,38,46,15,38,47,
+ 15,38,49,15,38,50,15,38,51,15,38,52,15,38,54,15,38,55,15,38,56,15,51,37,
+ 7, 6,13, 5,36,56, 6,58,87, 6,62,55, 0, 0, 0, 0, 0, 0, 6,58,77, 0, 0, 0,
+ 0, 0, 0, 6,58,79, 6,58,69,15,38,48, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,38,40,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,38,53, 0, 0, 0, 4,34,16, 6,58,70,
+ 6,58,74, 6,58,78, 6,58,80, 4,34,22, 0, 0, 0, 0, 0, 0, 5,31,38, 4,40,94,
+ 4,40,90, 6,58,76, 7, 1,15, 7, 1,17, 7, 1, 9, 7, 1, 6, 7, 1, 5, 5,43,87,
+ 4,40,92, 7, 1,11, 7, 1,12, 5,43,83, 7, 1,10, 0, 0, 0, 0, 0, 0, 5,43,89,
+ 5,43,88, 0, 0, 0, 7, 1, 7, 0, 0, 0,15,45,58,15,45,59,15,45,60,15,45,61,
+ 15,45,62,15,45,64,15,45,65, 0, 0, 0, 7, 1, 8, 0, 0, 0, 5,43,82, 7, 1,13,
+ 0, 0, 0, 0, 0, 0,15,45,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,41, 1, 5,43,85, 7, 1,16, 5,43,84, 0, 0, 0, 0, 0, 0, 5,44,37,
+ 5,51,52, 5,51,58, 7,12,32, 4,47,56, 4,47,63, 5,51,56, 4,47,60, 4,47,62,
+ 5,51,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,51,54, 0, 0, 0,15,51,38,15,51,39,
+ 15,51,40, 0, 0, 0,15,51,41,15,51,42,
+ /* plane 2, page 4 */
+ 0, 253, /* first, last */
+ 5,51,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,51,55, 0, 0, 0,
+ 7,22,88, 5,43,86, 5,58,79, 5,58,80, 4,53,71, 4,53,70, 7,22,86, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,57,40, 0, 0, 0, 0, 0, 0,15,57,42,15,57,43,15,57,44,
+ 15,57,46, 0, 0, 0, 7,22,85, 7,22,87, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,57,41,
+ 0, 0, 0, 4,53,72, 7,22,84, 7,30,86, 4,58,75, 4,58,73, 4,58,74, 7,30,88,
+ 7,30,87, 0, 0, 0,15,62,16,15,62,17, 0, 0, 0, 0, 0, 0,15,62,12,15,62,14,
+ 15,62,15, 7,30,85, 5,65,17, 4,58,76, 0, 0, 0, 5,65,15, 5,65,16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,65,18, 5,71,42, 5,71,46, 4,67,14, 5,71,45, 5,71,47,
+ 15,65,94,15,66, 1, 7,39,79, 0, 0, 0, 5,71,44, 5,71,43, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,73,92, 7,50,85, 7,45,28,15,68,90,
+ 0, 0, 0, 5,75,75, 7,45,27, 7,45,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,70,15,
+ 4,70,14, 5,79,72, 7,55,46, 5,75,76,15,71,31,15,71,94, 0, 0, 0, 4,70,13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,55,45, 0, 0, 0,15,73,24,15,73,26,
+ 15,73,25, 5,83,17, 4,74,32, 7,59,37, 0, 0, 0,15,74,43,15,75,33, 5,85,66,
+ 0, 0, 0, 0, 0, 0, 4,77,50,15,76,41, 0, 0, 0, 0, 0, 0, 6, 1,45, 4, 1,60,
+ 0, 0, 0, 4, 2,18, 6, 3,51, 6, 3,52, 0, 0, 0, 6, 5,85, 6, 5,87, 6, 5,88,
+ 5, 3,21, 6, 5,86, 0, 0, 0, 6, 9,49, 6, 9,48, 6, 9,47, 6, 9,51, 0, 0, 0,
+ 15, 5,51, 0, 0, 0, 6, 9,50,15, 5,50, 6,14,71, 6,14,72, 0, 0, 0, 0, 0, 0,
+ 5,11,86, 0, 0, 0, 0, 0, 0,15,13,93,15,13,94,15,14, 1, 6,21,28,15,19, 8,
+ 5,17, 4, 5,17, 5,15,19, 9,15,19,10, 0, 0, 0, 0, 0, 0, 6,38,57,15,25,32,
+ 15,25,33,15,25,34, 5,22,56,15,25,35,15,32,39, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,48,67,15,32,40,15,38,57,15,38,58, 0, 0, 0, 5,36,57, 0, 0, 0, 0, 0, 0,
+ 7, 1,20, 7, 1,18, 5,43,91,15,45,67,15,45,68, 5,43,90, 7, 1,19, 0, 0, 0,
+ 5,51,60, 7,12,33,15,51,43,15,51,44,15,51,45,15,51,46, 0, 0, 0, 5,58,81,
+ 0, 0, 0, 0, 0, 0,15,57,47,15,57,48,15,57,49, 0, 0, 0, 7,30,89, 0, 0, 0,
+ 5,65,19,15,62,18, 0, 0, 0, 7,38, 9, 5,71,48,15,68,91, 5,71,49, 5,75,77,
+ 0, 0, 0, 0, 0, 0,15,71,33,15,73,27, 0, 0, 0,15,74,44, 0, 0, 0, 5,87,51,
+ 15,75,34, 0, 0, 0, 0, 0, 0, 6, 1,22, 5, 1,22, 5, 1,21, 0, 0, 0, 6, 2,23,
+ 6, 3,54, 6, 3,53, 0, 0, 0, 0, 0, 0, 5, 3,22, 6, 5,89, 0, 0, 0, 5, 3,24,
+ 0, 0, 0, 0, 0, 0, 5, 8, 5, 5, 8, 6, 0, 0, 0, 4,11,74, 6,21,29,15,14, 2,
+ 15,14, 3, 6,29,26, 0, 0, 0, 6,38,58, 6,48,68, 0, 0, 0, 5,29,67, 4,28,17,
+ 6,58,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,58,82,
+ /* plane 2, page 5 */
+ 0, 255, /* first, last */
+ 6, 1,23, 6, 1,46, 5, 1,23, 6, 1,33, 6, 1,57, 0, 0, 0, 5, 1,48, 6, 3,27,
+ 4, 2,21, 6, 3,55, 6, 5,92, 6, 5,94, 5, 3,25, 0, 0, 0,15, 3,13, 6, 5,90,
+ 6, 9,52, 0, 0, 0, 6,14,75, 6,14,73, 0, 0, 0, 5, 8, 7, 6,14,74, 6,14,47,
+ 6,16,91, 6,21,32, 6,21,31, 6,21,33, 6,21,30, 6,29,27, 0, 0, 0, 6,38,61,
+ 5,29,68,15,25,36,15,25,37, 0, 0, 0, 0, 0, 0, 6,38,59, 0, 0, 0, 6,38,60,
+ 5,29,69, 6,48,69,15,32,41,15,32,42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,34,26,
+ 0, 0, 0, 6,58,89, 0, 0, 0,15,52,38,15,51,47,15,51,48, 5,65,20,15,62,19,
+ 7,38,10, 7,38,11, 0, 0, 0, 0, 0, 0, 4, 1,13, 6, 1,47, 6, 1,49, 0, 0, 0,
+ 0, 0, 0, 6, 2,25, 4, 1,61, 6, 2,24, 5, 1,50, 0, 0, 0,15, 1,38, 0, 0, 0,
+ 6, 2,26, 0, 0, 0, 5, 1,49, 6, 3,58, 0, 0, 0, 6, 3,56, 6, 5,39, 0, 0, 0,
+ 6, 6, 3, 6, 6, 1, 6, 6, 2, 5, 3,26, 6, 8,90, 0, 0, 0, 5, 5,12, 0, 0, 0,
+ 6, 9,53, 0, 0, 0, 6, 9,54, 6,14,76, 0, 0, 0, 6,21,34, 6,21,35, 5,11,87,
+ 5,11,88, 0, 0, 0, 6,29,29, 6,38,63, 3,25,87, 6,38,62, 4,28,19, 5,29,70,
+ 6,58,91, 6,58,90, 0, 0, 0, 0, 0, 0, 7, 1,21, 5,51,61, 7,12,34,15,53,86,
+ 4,58,77,15,71,34, 7,55,47, 5, 1,24, 0, 0, 0, 6, 2,27,15, 1,40,15, 1,41,
+ 0, 0, 0, 6, 3,59, 4, 2,23, 5, 2, 9, 0, 0, 0,15, 1,91, 0, 0, 0, 0, 0, 0,
+ 15, 3,14,15, 3,15, 0, 0, 0, 0, 0, 0, 5, 5,13,15, 5,53, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,14,77, 0, 0, 0, 6,29,30,15,14, 5, 0, 0, 0,15,14, 6,
+ 15,14, 7,15,14, 8,15,14, 9, 5,17, 7, 6,38,64,15,25,39,15,25,40, 6,38,65,
+ 0, 0, 0,15,26,61, 6,48,70, 0, 0, 0, 6,58,92, 0, 0, 0,15,38,59, 5,46,87,
+ 7,12,35,15,57,50,15,51,49, 7,30,90, 0, 0, 0, 0, 0, 0, 7,38,12, 7,45,31,
+ 0, 0, 0, 5,79,73, 0, 0, 0, 5,85,67, 0, 0, 0, 0, 0, 0,15, 1,42, 0, 0, 0,
+ 0, 0, 0, 6, 3,60,15, 1,93, 0, 0, 0,15, 1,94, 0, 0, 0, 4, 2,24, 5, 3,27,
+ 6, 6, 4, 4, 3,28,15, 3,16,15, 3,17,15, 3,18,15, 3,19, 0, 0, 0, 0, 0, 0,
+ 15, 3, 4,15, 2,94, 4, 5,33, 4, 5,34, 6, 9,56, 6, 9,57, 5, 5,15,15, 5,55,
+ 5, 8, 9, 4, 8,33, 4, 8,34, 5, 8,12, 5, 8, 8, 5, 8,10, 6,14,79, 0, 0, 0,
+ 0, 0, 0,15, 9,26,15, 9,28,15, 9,29,15, 9,30,15, 9,31, 0, 0, 0, 6,14,78,
+ 5,11,90, 4,11,75, 5,11,89, 5, 8,11, 6,21,37, 5,11,91,15,14,10, 0, 0, 0,
+ 0, 0, 0,15,14,11, 6,21,38, 0, 0, 0, 0, 0, 0, 5,17, 8, 6,29,31, 6,29,32,
+ 4,16,46, 0, 0, 0,15,19,11, 0, 0, 0,15,19,12,15,19,13,15,19,15,15,19,16,
+ 0, 0, 0, 6,38,66, 5,22,60, 5,22,58, 5,22,59, 5,22,57, 4,22,30,15,19,14,
+ 0, 0, 0, 0, 0, 0, 5,29,76, 5,29,71, 5,29,73, 5,29,74, 5,29,72, 5,29,75,
+ /* plane 2, page 6 */
+ 0, 255, /* first, last */
+ 6,48,71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,58,93, 5,44, 1, 5,36,58, 7, 1,23,
+ 15,38,61,15,38,62, 5,43,94, 5,43,93, 5,43,92, 7, 1,22,15,45,71, 0, 0, 0,
+ 0, 0, 0,15,51,51, 7,12,37,15,45,70,15,51,50, 0, 0, 0, 4,53,74, 7,12,38,
+ 5,58,83, 0, 0, 0, 0, 0, 0,15,57,51,15,57,52, 5,65,22, 5,65,21, 5,65,23,
+ 15,62,20, 7,30,91, 5,71,50, 5,71,51, 7,50,86, 5,83,18, 0, 0, 0, 4, 1, 9,
+ 0, 0, 0, 6, 1,50, 0, 0, 0,15, 1,10,15, 1,11,15, 1,12,15, 1,14, 6, 1,60,
+ 15, 1,13, 5, 1,51, 6, 2,29, 4, 1,63, 0, 0, 0, 6, 3,62, 6, 3,61, 6, 3,63,
+ 6, 3,64, 0, 0, 0,15, 1,43, 0, 0, 0, 6, 6, 7, 6, 6, 5, 6, 6, 6,15, 3,20,
+ 15, 3,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5,38, 6, 9,58,
+ 4, 5,36, 6, 9,59, 6, 9,60, 6, 9,61,15, 5,56,15, 5,57, 0, 0, 0, 6,14,82,
+ 6,14,80, 6,14,81, 6,21,39,15,14,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,23, 7,
+ 6,29,34, 6,29,35, 6,29,33,15,19,17,15,19,18,15,19,19, 0, 0, 0, 6,38,67,
+ 6,38,70,15,25,41, 6,38,68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,25,42,
+ 15,38,63,15,38,64,15,38,65,15,45,72, 0, 0, 0, 7,12,39,15,51,52,15,51,53,
+ 15,51,35,15,57,53,15,62,21,15,71,35, 0, 0, 0, 4, 1,14, 5, 1,25, 6, 1,51,
+ 6, 1,52, 6, 2,31, 5, 1,52, 6, 2,30, 0, 0, 0,15, 1,44, 6, 3,69, 6, 3,65,
+ 6, 3,66, 6, 3,67,15, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2,10, 6, 6, 8,
+ 15, 3,22, 0, 0, 0, 0, 0, 0, 6, 9,64, 0, 0, 0, 6, 9,63, 6,14,83, 6,14,84,
+ 0, 0, 0, 6,20,90, 6,21,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,29,36, 6,29,37,
+ 5,22,61, 6,58,94,15,38,66, 7, 1,80, 0, 0, 0, 7,22,91, 5,58,86, 5,71,52,
+ 0, 0, 0, 7,46,30, 0, 0, 0, 6, 1,25, 0, 0, 0, 4, 1,32, 6, 1,53, 5, 1,26,
+ 5, 1,27, 6, 1,54, 4, 1,33,15, 1,15, 6, 1,55, 5, 1,53, 5, 1,54, 4, 1,66,
+ 6, 2,36, 5, 1,55, 6, 2,35, 6, 2,32, 6, 2,37, 0, 0, 0, 0, 0, 0, 4, 2,26,
+ 6, 3,74, 5, 2,14, 5, 2,12, 5, 2,11, 4, 2,27, 4, 2,25, 6, 3,72, 6, 3,71,
+ 5, 2,15, 6, 3,75, 6, 3,73, 5, 2,13, 4, 2,29, 0, 0, 0, 0, 0, 0,15, 2, 2,
+ 15, 2, 3, 4, 2,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3,70, 4, 3,33, 6, 6,11,
+ 4, 3,35, 5, 3,29, 4, 3,34, 5, 3,38, 5, 3,37, 5, 3,35, 5, 3,32, 6, 6, 9,
+ 5, 3,31, 5, 3,34, 5, 3,33, 6, 6,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 6,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3,30, 5, 3,36, 6, 9,73,
+ 5, 5,19, 5, 5,21, 4, 5,41, 4, 5,43, 3, 7,60, 6, 9,70, 4, 5,45, 6, 9,68,
+ 6, 9,69, 6, 9,76, 6,14,85, 0, 0, 0, 6, 9,74, 5, 5,16, 5, 5,22, 6, 9,75,
+ 5, 5,18, 6, 9,71, 0, 0, 0, 5, 5,20,15, 5,58,15, 5,59,15, 5,60,15, 5,61,
+ /* plane 2, page 7 */
+ 2, 255, /* first, last */
+ 6, 9,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 9,66, 6, 9,65,
+ 0, 0, 0, 5, 5,17, 0, 0, 0, 0, 0, 0, 6, 9,55, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 8,39, 5, 8,13, 4, 8,37, 6,15, 4, 6,14,91, 6,15, 2, 4, 8,40, 6,15, 1,
+ 4, 8,36, 4, 8,38, 6,14,88, 6,14,94, 6,15, 3, 6,14,90, 0, 0, 0, 6,14,93,
+ 6,14,92,15, 9,32,15, 9,33,15, 9,34, 0, 0, 0, 6,14,89, 5, 8,14, 0, 0, 0,
+ 6,14,87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,21,41, 4,11,80, 4,11,77, 5,12, 5, 5,12, 3, 4,11,79, 4,11,83, 6,21,46,
+ 6,21,50, 5,12, 2, 6,21,51, 4,11,76, 5,12, 6, 6,21,49, 4,11,81, 6,21,48,
+ 6,21,47, 6,21,44, 6,21,43, 4,11,82, 5,12, 4, 6,21,45, 0, 0, 0, 0, 0, 0,
+ 15,14,19, 6,21,52,15,14,14,15,14,15,15,14,16,15,14,18, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,14,17, 6,21,42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,12, 7, 5,11,93, 5,12, 1, 5,11,94, 0, 0, 0, 4,16,48, 5,17,11, 4,16,49,
+ 5,17,10, 6,29,38, 4,16,54, 4,22,41, 4,16,53, 6,29,41, 0, 0, 0, 6,29,39,
+ 5,22,62, 4,16,47, 5,12, 8, 0, 0, 0, 0, 0, 0,15,19,20,15,19,21,15,19,23,
+ 0, 0, 0, 6,29,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,29,42, 6,29,43, 4,22,35,
+ 5,22,63, 6,38,77, 6,38,73, 4,22,38, 4,22,39, 5,22,64, 5,22,68, 4,22,42,
+ 4,22,36, 4,22,33, 4,22,32, 6,38,75, 6,38,72, 6,38,76, 5,22,65, 5,22,66,
+ 6,38,74,15,25,43,15,25,44,15,25,45,15,25,46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,22,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,44,38, 6,38,78, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,22,69, 4,28,25, 6,48,79, 5,29,83,
+ 6,48,77, 4,28,21, 5,29,84, 6,48,78, 5,29,77, 4,28,23, 4,28,22, 5,29,78,
+ 4,28,26, 5,29,79, 6,48,75,15,32,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,48,74,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,48,72, 6,48,80, 6,48,73, 5,29,82, 5,29,81,
+ 0, 0, 0,15,32,44, 5,36,59, 4,34,27, 6,59, 4, 5,36,65, 6,59, 2, 6,59, 1,
+ 4,28,24, 4,34,32, 5,36,66, 5,36,60, 5,36,63, 4,34,29, 4,34,36, 6,59,11,
+ 6,59, 9, 6,59, 8, 5,36,62, 5,44, 2, 6,59, 6, 5,36,61, 6,59,10, 5,36,64,
+ 6,59, 5,15,38,67,15,38,68,15,38,69, 6,59, 3, 0, 0, 0, 0, 0, 0, 6,59, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,44, 3, 5,44, 7,
+ 4,41, 4, 5,44, 4, 5,44, 6, 7, 1,28, 7, 1,29, 7, 1,26, 7, 1,30, 7, 1,27,
+ 5,44, 5, 7, 1,24, 0, 0, 0, 7, 2,58, 0, 0, 0, 7, 1,25, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,47,64, 7,12,41, 5,58,87, 7,12,42, 7,12,46, 7,12,45,
+ /* plane 2, page 8 */
+ 0, 255, /* first, last */
+ 7,12,44, 5,51,63, 5,51,65, 5,51,64, 5,51,62, 7,12,40, 7,12,43, 7, 1,31,
+ 15,51,54, 0, 0, 0, 0, 0, 0, 5,56,49, 0, 0, 0, 5,58,90, 4,53,75, 5,58,89,
+ 5,58,88, 0, 0, 0, 7,22,92,15,57,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,53,78,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,30,92, 5,65,24, 5,65,25, 7,22,93,15,62,22,
+ 5,65,26, 7,38,15, 7,38,14, 7,38,13, 0, 0, 0, 0, 0, 0, 7,45,32, 7,45,33,
+ 0, 0, 0, 0, 0, 0, 5,79,74, 7,50,87,15,71,36, 0, 0, 0, 5,85,68, 4,75,69,
+ 7,66,13, 7,66,12, 6, 1,26, 5, 1,28, 6, 1,56, 0, 0, 0, 4, 1,67, 5, 1,57,
+ 5, 1,56, 5, 2,17, 0, 0, 0, 5, 2,18,15, 2, 5,15, 2, 6,15, 2, 7,15, 2, 8,
+ 0, 0, 0, 5, 2,19, 6, 6,14, 4, 3,37, 5, 3,39, 0, 0, 0,15, 3,24,15, 3,26,
+ 15, 3,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6,13, 4, 3,41, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 5,29, 5, 5,25, 6, 9,77, 5, 5,28, 6, 9,78,15, 5,64,15, 5,65,
+ 15, 5,66,15, 5,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8,16, 4, 8,42,
+ 6,15, 6, 5, 8,17, 5, 8,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,15, 8, 0, 0, 0,
+ 15, 9,35,15, 9,36,15, 9,37, 6,21,53, 6,21,57, 4,11,84, 5,12,13, 5,12, 9,
+ 5,12,11, 5,12,12, 5,12,10, 0, 0, 0,15,14,20,15,14,21, 0, 0, 0, 0, 0, 0,
+ 6,21,54, 6,21,55, 0, 0, 0, 5,17,13, 6,29,46, 6,29,44, 6,29,47, 6,29,48,
+ 6,29,49,15,19,24,15,19,25, 0, 0, 0, 6,29,45, 5,22,73, 5,22,70, 5,22,72,
+ 5,22,75, 5,22,71,15,25,47,15,25,48, 0, 0, 0, 0, 0, 0, 6,38,79, 6,38,80,
+ 0, 0, 0, 0, 0, 0, 6,38,81, 5,29,86, 5,29,85, 4,28,27, 6,48,82, 6,48,81,
+ 15,32,45, 5,29,87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,34,38, 5,36,70, 5,36,68, 5,36,69, 5,36,73, 4,34,37, 5,36,72, 6,59,14,
+ 15,38,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,59,12, 0, 0, 0, 6,59,13,
+ 5,44,11, 5,44, 8, 4,41, 6, 5,44, 9, 5,44,10, 0, 0, 0, 7,12,47, 5,58,92,
+ 15,51,55, 5,58,91, 5,58,93, 7,22,94, 7,23, 2, 0, 0, 0, 0, 0, 0, 7,23, 1,
+ 5,65,28, 7,30,94, 0, 0, 0, 7,31, 1, 5,71,54, 5,71,53, 7,45,34, 5,79,75,
+ 7,59,38, 5,85,69, 4,76,75, 7,70,27, 5, 1,29, 6, 2,39, 6, 2,40, 5, 2,21,
+ 0, 0, 0, 5, 2,20, 5, 2,22,15, 2,10, 6, 6,15, 0, 0, 0, 5, 3,40, 5, 3,41,
+ 4, 5,50, 6, 9,81, 6, 9,80, 0, 0, 0,15, 5,68,15, 5,69, 6,15,10, 4, 8,44,
+ 6,15,11, 6,15,12,15, 9,38, 6,15, 9, 4,11,86, 6,21,60, 6,21,59, 6,21,62,
+ 6,21,63, 6,21,58, 6,21,61, 5,12,15, 0, 0, 0, 0, 0, 0, 4,16,61, 6,29,50,
+ 5,12,14, 5,17,14, 0, 0, 0, 5,17,15, 6,29,51, 4,22,46, 0, 0, 0,15,25,49,
+ 6,48,83, 4,16,59, 5,29,89,15,32,46,15,32,47, 6,59,15, 4,34,39, 5,36,74,
+ /* plane 2, page 9 */
+ 0, 253, /* first, last */
+ 5,36,75,15,38,71, 0, 0, 0,15,45,73, 4,47,69, 7,12,48, 0, 0, 0, 7,12,49,
+ 7,23, 3, 7,23, 4, 5,58,94, 7,45,35, 0, 0, 0, 0, 0, 0, 6, 1,10, 4, 1,34,
+ 6, 2,42, 6, 6,16, 6, 6,19, 5, 3,42, 6, 6,17, 6, 6,18, 0, 0, 0, 4, 8,45,
+ 6,15,15, 6,15,17, 6,15,13, 6,15,14, 6,15,16, 0, 0, 0, 6,29,52, 6,21,64,
+ 15,14,22,15,14,23, 6,21, 4, 6,38,82,15,25,50, 4,28,29, 0, 0, 0, 0, 0, 0,
+ 15,38,72, 0, 0, 0, 7,31, 2, 5,77,18, 6, 1,11,15, 1,17, 5, 2,23, 6, 3,78,
+ 4, 2,35, 6, 3,77, 0, 0, 0, 6, 6,20, 4, 3,42, 6, 6,21,15, 3,28, 0, 0, 0,
+ 6, 9,83, 5, 5,30, 5, 5,31, 0, 0, 0, 4, 8,47, 0, 0, 0, 6,15,20, 5, 8,19,
+ 6,15,19, 5, 8,18, 6,15,18, 6,15,23, 6,15,21,15, 9,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,12,16, 6,21,66, 6,21,65, 5,12,17, 0, 0, 0, 6,29,53,15,19,26,
+ 4,22,47, 6,48,85, 6,38,83, 6,21,67, 0, 0, 0, 0, 0, 0, 5,29,90, 0, 0, 0,
+ 0, 0, 0, 4,34,40, 6,59,17, 6,59,16, 5,44,12, 5,44,13, 5,44,14, 0, 0, 0,
+ 0, 0, 0,15,45,74, 5,51,68, 7,23, 5, 0, 0, 0,15,62,23, 4,63,43, 0, 0, 0,
+ 0, 0, 0, 7,31, 3, 7,45,36, 7,64,73, 7,68,35,15, 1,18, 5, 2,24, 6, 3,79,
+ 5, 3,44, 6, 6,23,15, 3,29,15, 5,70, 6,15,22, 5, 8,20, 6,21,68,15,38,73,
+ 7,45,37, 0, 0, 0, 7,55,48, 6, 1,58, 0, 0, 0, 5, 1,58, 5, 1,59, 0, 0, 0,
+ 6, 2,43, 0, 0, 0, 6, 3,80, 4, 2,36, 0, 0, 0, 4, 2,37, 6, 3,83, 6, 3,82,
+ 5, 2,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2,25, 6, 3,84, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 6,25, 5, 3,45, 6, 6,26, 6, 3,85, 6, 6,27,15, 3,30, 0, 0, 0,
+ 5, 5,32, 6, 9,84, 6, 9,87, 6, 9,88, 6, 9,86,15, 5,71,15, 5,73,15, 5,74,
+ 15, 5,75,15, 5,72, 6, 9,85, 6,21,69, 6,21,70,15,14,24,15,14,25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,16,67, 4,16,65, 4,16,66,15,19,27, 0, 0, 0, 0, 0, 0,
+ 15,25,51,15,25,52, 0, 0, 0, 0, 0, 0, 6,48,88, 6,48,87, 6,48,89, 6,48,91,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,32,48,15,38,74,15,38,75, 0, 0, 0,
+ 5,44,15,15,45,75,15,45,76, 0, 0, 0, 7, 1,32, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,23, 6, 0, 0, 0,15,62,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,38,16, 7,50,88,
+ 7,64,74, 7,66,14, 0, 0, 0, 6, 2,44, 6, 3,87, 0, 0, 0, 0, 0, 0, 6, 3,86,
+ 6, 3,88, 4, 3,44, 5, 3,47, 5, 3,46, 6, 6,28, 0, 0, 0, 4, 5,53, 4, 5,52,
+ 6, 9,92, 6, 9,91, 6, 9,93, 6, 9,90, 6, 9,94, 6, 9,89,15, 5,76, 0, 0, 0,
+ 6,10, 2, 4, 8,50, 4, 8,49, 5, 8,23,15, 9,40,15, 9,41,15, 9,42,15, 9,43,
+ 0, 0, 0, 0, 0, 0, 6,15,25, 6,21,72, 4,11,89, 5,12,18, 6,21,71, 6,21,74,
+ 6,28,90, 6,21,73, 6,29,55, 6,29,54, 6,21,75, 6,29,56,
+ /* plane 2, page 10 */
+ 0, 255, /* first, last */
+ 6,38,85, 6,38,86, 6,38,87, 5,23,31, 0, 0, 0, 6,48,92, 5,36,77, 6,59,18,
+ 7, 1,33,15,51,56, 0, 0, 0, 7,67,43, 0, 0, 0, 5, 1,30, 4, 1,35,15, 1,20,
+ 6, 1,59, 0, 0, 0, 4, 2,38, 6,10, 4, 6, 3,90, 0, 0, 0, 6, 3,89, 0, 0, 0,
+ 4, 3,46, 6,15,27, 5, 8,24, 6,15,26, 4, 8,51, 6,21,76, 6,15,28, 6,38,88,
+ 5,12,19, 0, 0, 0, 5,29,91, 6,48,93, 0, 0, 0, 5,36,78, 0, 0, 0, 7,31, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1,31, 5, 1,60, 6, 3,91, 6, 2,47,
+ 6, 2,45, 6, 2,48, 5, 1,61, 0, 0, 0, 4, 2,39, 5, 2,27, 6, 3,92, 6, 3,93,
+ 5, 2,31, 5, 2,32, 5, 2,29, 5, 2,30, 0, 0, 0,15, 2,13, 0, 0, 0, 0, 0, 0,
+ 6, 6,30, 5, 3,48, 6, 6,29, 5, 3,49, 6, 5,62, 0, 0, 0, 0, 0, 0,15, 3,31,
+ 0, 0, 0, 0, 0, 0, 6,10, 7, 6,10, 6, 6,10, 9, 6,10, 8, 5, 5,33, 4, 5,56,
+ 0, 0, 0,15, 5,77,15, 5,78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,10, 5, 5, 8,25,
+ 4, 8,52, 6,15,38, 6,15,33, 6,15,36, 6,15,37, 6,15,32, 6,15,30, 6,15,34,
+ 6,15,35, 0, 0, 0,15, 9,45,15, 9,46, 4, 8,53, 0, 0, 0, 6,15,31, 6,21,83,
+ 6,21,84, 4,11,91, 5,12,20, 4,11,92, 6,21,79, 6,21,77, 6,21,80, 6,21,82,
+ 6,21,81, 6,21,78, 5,12,21,15,14,26,15,14,27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,29,64, 6,29,59, 4,16,71, 6,29,63, 6,29,60, 6,29,61,15,19,29, 5,17,16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,29,62, 0, 0, 0, 4,16,70, 4,22,50,
+ 6,38,92, 6,38,90, 4,22,51, 6,38,91, 6,38,89, 6,38,93,15,25,53, 6,38,94,
+ 0, 0, 0, 5,29,92, 5,29,93, 6,49, 4, 6,49, 3, 6,48,94,15,32,49, 0, 0, 0,
+ 6,49, 1, 4,28,31, 4,34,41, 6,59,20, 6,59,23, 6,59,19, 6,59,24, 5,36,79,
+ 15,38,77, 0, 0, 0,15,38,78, 0, 0, 0, 6,59,22, 6,59,25, 6,59,27, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,59,26, 6,59,21, 0, 0, 0, 7, 1,35, 4,41, 8, 5,44,16,
+ 7, 1,36, 0, 0, 0, 0, 0, 0, 7, 1,34, 0, 0, 0,15,45,77, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 5,40, 5,51,69, 7,12,51, 7,12,50,15,51,57,15,51,58, 7,27,45,
+ 15,62,25,15,62,26,15,62,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,68,92,
+ 7,46, 7, 7,50,89, 0, 0, 0, 0, 0, 0, 5,87,52, 0, 0, 0, 7,62,48, 0, 0, 0,
+ 7,69,19, 0, 0, 0, 7,70,19, 5, 1,14, 6, 1,28, 6, 1,29, 0, 0, 0, 6, 1,61,
+ 0, 0, 0, 6, 2,50, 6, 2,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2,42, 6, 4, 3,
+ 6, 4, 1, 0, 0, 0,15, 2,14, 0, 0, 0, 4, 2,41, 6, 4, 2, 6, 6,32,15, 3,32,
+ 5, 3,28, 6,10,12, 6,10,11, 6,10,13, 6,10,14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,15,39, 6,15,40, 0, 0, 0, 4, 8,54,15, 9,47, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,21,86, 6,21,85, 6,22,41, 6,21,14, 0, 0, 0, 0, 0, 0, 5,22,76,
+ /* plane 2, page 11 */
+ 0, 246, /* first, last */
+ 6,39, 2, 6,39, 4, 6,45,66, 0, 0, 0,15,25,54, 6,39, 3, 5,30, 1, 6,49, 5,
+ 5,29,94, 0, 0, 0,15,32,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,59,28,15,38,79,
+ 6,64,82, 7, 1,37, 0, 0, 0, 5,51,70, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,57,55,
+ 7,43,74, 0, 0, 0, 6, 1,64, 5, 1,32, 6, 1,62, 5, 1,34, 6, 1,66, 6, 1,63,
+ 0, 0, 0, 6, 2,53, 4, 1,72, 5, 1,62, 0, 0, 0, 6, 2,54, 5, 1,63, 6, 2,51,
+ 6, 2,52, 6, 4, 5, 4, 2,43, 6, 4, 4, 5, 2,34, 6, 4, 6, 5, 2,33, 6, 4, 7,
+ 0, 0, 0, 6, 6,36, 6, 6,34, 5, 3,50,15, 3,33,15, 3,34,15, 3,35,15, 3,36,
+ 4, 3,48, 6,10,17, 6,10,15, 6,10,18, 6,10,16,15, 5,79, 0, 0, 0, 6,15,45,
+ 6,15,42, 6,15,44, 6,15,43, 6,15,41,15, 9,49,15, 9,50, 0, 0, 0, 6,18,82,
+ 0, 0, 0, 5, 8,22, 6,21,91, 5,12,22, 6,21,92, 6,21,89, 6,21,87, 6,21,90,
+ 15,14,28,15,14,29,15,14,30,15,14,31, 6,28,71, 6,29,70, 6,29,72, 5,17,18,
+ 5,17,19, 6,29,69, 6,29,67, 6,29,75, 6,29,68, 5,12,23, 6,29,66, 6,29,73,
+ 6,29,74, 6,28,92, 0, 0, 0, 6,29,71, 0, 0, 0, 4,22,52, 5,22,77, 6,39, 7,
+ 6,39, 5,15,19,30,15,25,55,15,25,56,15,25,57,15,25,58, 6,39, 6, 4,28,35,
+ 4,28,34, 6,49, 7, 6,49, 8, 6,49, 6, 4,28,33, 6,39, 8, 6,49,59, 0, 0, 0,
+ 6,49, 9, 0, 0, 0, 0, 0, 0, 6,63, 1, 6,59,30, 0, 0, 0, 6,59,29, 5,36,80,
+ 0, 0, 0, 6,51,91,15,45,53, 5,44,19, 5,44,20,15,38,80, 5,44,18, 7,12,53,
+ 15,51,59, 3,48,25, 5,52,14, 7,12,52, 0, 0, 0, 7,23, 9, 7,23, 8,15,57,56,
+ 4,58,79, 7,38,18, 7,38,17, 4,70,17,15,71,37, 7,55,49, 5,85,70, 7,62,49,
+ 7,62,50, 5, 1,35, 6, 1,68, 4, 1,39, 4, 1,38,15, 1,22, 6, 1,67, 0, 0, 0,
+ 5, 1,65, 6, 2,57, 6, 2,56, 6, 2,62, 6, 2,58, 6, 2,61, 6, 2,55, 6, 2,34,
+ 15, 1,46, 0, 0, 0, 6, 2,60, 5, 2,39, 6, 4,13, 5, 2,37, 6, 4,14, 4, 2,45,
+ 5, 2,38, 4, 2,48, 6, 4,12, 4, 2,47, 4, 2,46, 5, 2,36, 0, 0, 0, 6, 4, 8,
+ 15, 2,15,15, 2,16,15, 2,18,15, 2,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 4,10,15, 2,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 2,19, 0, 0, 0,
+ 5, 2,35, 6, 4, 9, 6, 4,11, 4, 3,54, 6, 6,47, 6, 6,38, 6, 6,45, 6, 6,44,
+ 5, 3,54, 4, 3,58, 4, 3,61, 5, 3,59, 5, 3,52, 6, 6,40, 4, 3,55, 4, 3,50,
+ 4, 3,56, 5, 3,56, 6, 6,41, 5, 3,57, 4, 3,53, 5, 3,53, 6, 6,39, 0, 0, 0,
+ 0, 0, 0, 5, 3,60, 0, 0, 0,15, 3,37,15, 3,38,15, 3,39,15, 3,42,15, 3,43,
+ 15, 3,44, 0, 0, 0, 0, 0, 0,15, 3,40, 6, 6,43, 0, 0, 0, 6, 6,42, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6,48, 0, 0, 0, 6, 6,37, 5, 3,51,
+ /* plane 2, page 12 */
+ 4, 255, /* first, last */
+ 5, 3,55, 5, 3,58, 0, 0, 0, 0, 0, 0,
+ 4, 5,60, 4, 5,62, 6,10,22, 5, 5,44, 5, 5,36, 4, 5,59, 6,10,20, 5, 5,45,
+ 5, 5,37, 5, 5,39, 4, 5,65, 5, 5,48, 6,10,19, 5, 5,50, 5, 8,39, 6,10,27,
+ 5, 5,40, 5, 5,43, 5, 5,42, 5, 5,49, 5, 5,41, 5, 5,46, 6,10,29, 0, 0, 0,
+ 0, 0, 0, 5, 5,47,15, 5,80,15, 5,82,15, 5,83,15, 5,84,15, 5,85,15, 5,86,
+ 15, 5,87,15, 5,88,15, 5,89,15, 5,90,15, 5,93,15, 5,94,15, 6, 1,15, 6, 2,
+ 15, 6, 3, 0, 0, 0, 5, 5,38, 0, 0, 0, 0, 0, 0, 6,10,21, 5, 5,35, 0, 0, 0,
+ 6,10,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,10,23,
+ 15, 5,92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,10,26, 0, 0, 0,
+ 5,12,24, 5, 8,38, 5, 8,50, 5, 8,45, 5, 8,28, 5, 8,49, 6,15,52, 6,15,46,
+ 5, 8,31, 4, 8,59, 4, 8,58, 5, 8,47, 5, 8,37, 5, 8,43, 5, 8,42, 5, 8,46,
+ 5, 8,40, 5, 8,41, 5, 8,29, 5, 8,33, 5, 8,44, 4, 5,66, 6,15,57, 6,15,58,
+ 5, 8,51, 6,15,47, 0, 0, 0, 5, 8,26, 6,15,55, 6,15,54, 5, 8,48, 6,15,48,
+ 6,15,56, 6,15,50, 5, 8,32, 5, 8,34, 0, 0, 0,15,11,19, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15, 9,51,15, 9,53,15, 9,54,15, 9,55,15, 9,56,15, 9,57,15, 9,58,
+ 15, 9,59,15, 9,62,15, 9,63,15, 9,64,15, 9,65,15, 9,66,15, 9,67,15, 9,68,
+ 15, 9,70,15, 9,71, 0, 0, 0, 5, 8,35, 5, 8,36, 0, 0, 0, 4, 8,61,15, 9,69,
+ 6,15,53, 0, 0, 0, 0, 0, 0, 6,15,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8,56,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 8,27, 5, 8,30, 6,15,49, 0, 0, 0, 6,22, 9, 4,12, 4, 4,12,11,
+ 4,12,12, 4,12, 7, 6,22, 2, 5,12,46, 5,12,33, 5,12,31, 5,12,44, 5,12,29,
+ 5,12,38, 5,12,54, 5,12,41, 4,12,10, 5,12,45, 5,12,52, 5,12,50, 4,12, 2,
+ 6,22, 3, 6,22, 4, 5,12,49, 4,12, 3, 5,12,32, 6,22, 7, 6,22, 8, 5,12,55,
+ 6,22, 6, 5,12,51, 5,12,56, 5,12,39, 5,12,57, 5,12,36, 5,12,53, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,14,32,15,14,33,15,14,35,15,14,36,15,14,40,
+ 15,14,41,15,14,43,15,14,44,15,14,45,15,14,46,15,14,47,15,14,48,15,14,49,
+ 15,14,50,15,14,51,15,14,52, 6,25,62, 0, 0, 0, 0, 0, 0, 6,22, 1, 5,12,34,
+ 5,12,37, 5,12,40, 0, 0, 0, 0, 0, 0, 6,22, 5, 0, 0, 0, 0, 0, 0, 5,12,48,
+ 5,12,43, 5,12,25, 5,12,26, 5,12,27, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,14,37,
+ /* plane 2, page 13 */
+ 3, 254, /* first, last */
+ 5,12,42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,12,47, 5,12,30, 5,12,28, 0, 0, 0, 0, 0, 0, 5,12,58, 5,17,38,
+ 4,16,73, 6,29,87, 6,29,84, 4,16,88, 6,29,79, 4,16,85, 5,17,49, 5,17,41,
+ 5,17,44, 4,16,78, 4,16,89, 5,17,36, 6,29,86, 5,17,22, 5,17,42, 5,17,37,
+ 5,17,46, 5,17,20, 5,17,45, 5,17,34, 5,17,27, 6,29,81, 6,29,85, 6,29,93,
+ 6,29,90, 6,29,94, 5,17,26, 5,17,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,29,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,17,24, 6,29,82, 6,29,91,15,19,31,15,19,32,15,19,33,15,19,34,
+ 15,19,36,15,19,37,15,19,38,15,19,39,15,19,40,15,19,41,15,19,44,15,19,45,
+ 5,17,23, 6,29,83, 5,17,25, 0, 0, 0, 0, 0, 0, 6,29,77, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,17,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,17,40, 0, 0, 0, 6,30, 1, 0, 0, 0, 0, 0, 0, 5,17,50, 0, 0, 0, 6,29,80,
+ 0, 0, 0, 5,17,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,17,21,
+ 5,17,39, 5,17,30, 5,17,35, 5,17,29, 5,17,48, 6,29,89, 3,20,64, 0, 0, 0,
+ 5,17,51, 5,17,47, 6,29,88, 6,29,78, 5,17,31, 5,17,43, 0, 0, 0, 4,22,53,
+ 4,22,65, 0, 0, 0, 6,39,18, 5,23, 4, 6,39,23, 6,39,30, 5,22,87, 6,39,21,
+ 5,22,92, 4,22,54, 5,23, 8, 5,22,79, 5,22,81, 4,22,58, 5,22,88, 4,22,55,
+ 5,23, 9, 5,22,94, 4,22,66, 4,22,59, 5,23, 3, 5,23, 7, 4,22,70, 5,23,16,
+ 0, 0, 0, 4,22,61, 5,23,12, 5,23,14, 6,39,14, 6,39,28, 5,30, 2, 6,39,11,
+ 6,39,15, 6,39,24, 5,23, 2, 6,39,20, 6,39,31, 6,39,26, 4,22,68, 5,23, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,22,83,
+ 15,25,59,15,25,61,15,25,62,15,25,65,15,25,66,15,25,67,15,25,68,15,25,69,
+ 15,25,70,15,25,71,15,25,72,15,25,74,15,25,77,15,25,78,15,25,79,15,25,80,
+ 5,22,84, 0, 0, 0, 0, 0, 0, 5,22,85, 5,22,91, 5,23, 5, 5,23, 1,
+ /* plane 2, page 14 */
+ 0, 255, /* first, last */
+ 6,39,27, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,25,75, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,25,60,15,25,63, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,25,73, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,25,76, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,23,11, 5,23,15, 0, 0, 0,
+ 6,39,29, 5,23,13, 5,23,10, 5,22,93, 0, 0, 0, 6,39,22, 6,49,25, 5,30, 3,
+ 4,28,41, 5,30, 7, 4,28,46, 5,22,82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,49,33,
+ 4,28,40, 4,28,36, 6,59,34, 5,30,13, 6,49,19, 6,49,21, 5,30,10, 5,30,24,
+ 6,49,26, 6,49,16, 5,30,14, 5,30, 4, 5,30,21, 5,30,31, 6,49,31, 6,49,23,
+ 5,30,20, 5,30,23, 4,28,45, 5,30,26, 4,28,37, 5,30,19, 5,30,12, 4,28,47,
+ 5,30,15, 4,28,49, 5,30,17, 5,30,18, 6,49,27, 0, 0, 0, 6,49,32, 6,49,10,
+ 6,49,30, 6,49,29, 5,30,27, 6,49,24, 5,30, 8, 5,30,16, 5,30,11, 6,49,12,
+ 6,49,36, 6,49,14, 6,49,11, 6,49,13, 0, 0, 0, 0, 0, 0,15,39, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,30,30,
+ 6,49,17,15,32,54,15,32,55,15,32,56,15,32,57,15,32,58,15,32,59,15,32,60,
+ 15,32,61,15,32,62,15,32,63,15,32,64,15,32,65,15,32,67, 6,49,15, 6,49,20,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,49,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,32,52, 0, 0, 0, 6,49,34, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,30,28, 5,30,22, 5,30, 5, 5,30, 9,
+ 5,30, 6,15,32,68, 0, 0, 0, 0, 0, 0, 6,59,38, 6,59,32, 6,59,43, 4,34,45,
+ 6,59,47, 6,59,37, 6,59,49, 6,59,48, 4,34,46, 6,59,44, 5,36,83, 5,36,87,
+ 5,36,85, 5,36,92, 6,59,35, 6,59,39, 4,34,44, 4,34,52, 5,36,91, 4,34,48,
+ 5,36,86, 6,59,33, 5,36,81, 5,36,82, 5,36,89, 6,59,50, 6,59,31, 6,59,41,
+ 6,59,42, 5,36,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,59,45, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,38,81,15,38,82,
+ /* plane 2, page 15 */
+ 0, 255, /* first, last */
+ 15,38,83,15,38,84,15,38,86,15,38,87,15,38,88,15,38,89,15,38,90,15,38,91,
+ 15,38,92,15,38,94,15,39, 1,15,39, 2,15,39, 3,15,39, 7,15,39, 8,15,39, 9,
+ 15,39,10,15,39,11,15,39,12,15,39,13,15,39, 4, 6,59,40,15,38,85, 0, 0, 0,
+ 5,36,84, 0, 0, 0, 5,36,90, 0, 0, 0, 6,59,46, 0, 0, 0, 5,37, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,38,93, 6,59,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,39, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,44,21, 5,36,93, 0, 0, 0, 0, 0, 0,
+ 15,38,76, 0, 0, 0, 7, 1,49, 5,44,27, 7, 1,53, 7, 1,50, 5,44,25, 7, 1,56,
+ 7, 1,42, 5,44,32, 5,44,38, 5,44,29, 7, 1,47, 5,44,30, 7, 1,55, 7, 1,48,
+ 5,44,22, 7, 1,43, 5,44,31, 7, 1,54, 7, 1,57, 5,44,33, 4,41,15, 0, 0, 0,
+ 7, 1,59, 5,44,26, 7, 1,40, 5,44,24, 5,59, 7, 7, 1,58, 4,41,11, 7, 1,52,
+ 5,37, 3, 7, 1,51, 7, 1,41, 7, 1,39, 7, 1,66, 7, 1,60,15,45,90, 0, 0, 0,
+ 7, 1,62, 5,44,34, 7, 1,65, 7,12,65, 5,44,23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,41,18, 5,44,39,
+ 15,45,79,15,45,80,15,45,81,15,45,82,15,45,83,15,45,84,15,45,85,15,45,86,
+ 15,45,88,15,45,89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,44,36, 7, 1,63, 7, 6,11,
+ 0, 0, 0, 0, 0, 0, 7, 1,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1,45,
+ 7, 1,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,44,28, 5,44,35, 7,12,74,
+ 4,47,78, 5,51,84, 7,12,60, 5,51,82, 7,12,72, 4,47,82, 5,51,74, 5,51,88,
+ 7,12,64, 4,47,72, 4,47,83, 4,47,70, 5,51,81, 4,47,80, 5,51,79, 5,51,72,
+ 7,12,75, 7,12,59, 7,12,68, 5,51,78, 7,12,63, 5,51,76, 5,51,71, 5,51,85,
+ 5,51,80, 5,51,83, 7,12,57, 5,51,75, 5,51,73, 7,12,71, 7,12,56, 7,12,55,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,45,87, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,47,73, 4,47,84, 5,51,87, 7,12,70,15,51,60,15,51,62,
+ /* plane 2, page 16 */
+ 0, 247, /* first, last */
+ 15,51,63,15,51,64,15,51,65,15,51,66,15,51,67,15,51,68,15,51,69,15,51,71,
+ 15,51,72,15,51,73,15,51,74,15,51,75,15,51,76,15,51,77,15,51,78,15,51,79,
+ 7,12,62, 0, 0, 0, 7,12,61, 7,12,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,12,73, 5,51,77,15,53,84, 5,51,86, 4,53,90, 0, 0, 0, 5,59, 6,
+ 0, 0, 0, 5,59, 1, 7,23,13, 7,23,10, 7,23,20, 7,23,21, 5,59, 3, 5,59,11,
+ 4,53,81, 4,53,86, 0, 0, 0, 5,59, 8, 4,53,87, 7,23,11, 5,59, 9, 4,53,89,
+ 7,23,17, 7,23,15, 7,23,14, 5,59, 4, 0, 0, 0, 4,53,85, 7,23,18, 7,23,25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,57,57,
+ 15,57,58,15,57,62,15,57,63,15,57,64,15,57,65,15,57,66, 0, 0, 0, 0, 0, 0,
+ 7,23,24, 7,23,16, 0, 0, 0, 7,23,22, 7,23,19, 7,23,12, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,59,10, 5,59, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,58,84,
+ 7,31, 9, 7,31,15, 4,58,83, 5,65,30, 7,31,11, 4,58,81, 4,58,86, 5,65,38,
+ 4,58,87, 5,71,56, 5,65,29, 5,65,36, 5,65,35, 4,58,88, 7,31,10, 4,58,85,
+ 4,58,89, 4,58,82, 7,31,14, 5,65,33, 7,31, 7, 7,31,13, 7,31, 8, 7,31, 6,
+ 7,31,12, 5,65,34, 0, 0, 0, 0, 0, 0,15,57,59, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,31, 5,15,62,28,
+ 15,62,29,15,62,30,15,62,31,15,62,32,15,62,35,15,62,36,15,62,37, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,65,31, 0, 0, 0,15,62,42,
+ 7,38,20, 4,63,46, 5,59, 5, 7,38,27, 7,38,25, 7,38,23, 5,71,58, 5,71,59,
+ 4,63,48, 5,71,55, 7,38,28, 7,38,26, 7,38,19, 7,38,21, 7,38,24, 4,63,47,
+ 0, 0, 0, 0, 0, 0,15,62,38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,71,60,
+ /* plane 2, page 17 */
+ 2, 255, /* first, last */
+ 15,66, 2,15,66, 3,15,66, 4,15,66, 5,15,66, 6, 0, 0, 0,
+ 7,38,22, 7,39,78, 7,38,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,75,84, 5,75,85, 5,75,79, 5,75,81, 5,75,80, 7,45,39, 7,45,41,
+ 7,45,43, 7,45,40, 7,45,38, 7,45,42,15,68,93,15,68,94,15,69, 1, 0, 0, 0,
+ 7,45,44, 0, 0, 0, 0, 0, 0, 5,75,82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,50,91, 5,79,81, 5,79,79, 4,70,21, 5,79,78, 7,50,90, 5,79,77,
+ 7,50,94, 5,79,80, 7,50,93, 4,70,19, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,71,39,
+ 15,71,40, 5,79,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,50,92, 0, 0, 0, 0, 0, 0, 7,55,57,
+ 7,55,58, 5,83,19, 7,55,53, 0, 0, 0, 7,55,54, 7,55,55, 7,55,52, 7,55,50,
+ 0, 0, 0, 7,55,51, 0, 0, 0,15,73,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,72,68, 7,55,56, 0, 0, 0,
+ 7,59,41, 7,59,42,15,74,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,59,40, 0, 0, 0,
+ 7,59,39, 5,87,53, 5,87,54, 4,75,70, 7,62,51, 7,62,53, 7,62,52, 7,62,54,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,75,35, 0, 0, 0, 5,85,71, 5,89, 3, 0, 0, 0,
+ 0, 0, 0, 4,76,77,15,76, 2,15,76, 3, 0, 0, 0, 0, 0, 0, 7,64,75, 7,66,18,
+ 7,66,17, 7,66,20, 7,66,16, 7,66,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,76,89,15,76,90, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 1,69, 6, 1,70,15, 1,23, 4, 1,78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4,18,
+ 6, 4,16, 5, 2,41, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 2,21, 0, 0, 0, 0, 0, 0,
+ 6, 4,17, 0, 0, 0, 6, 4,15, 5, 2,40, 6, 6,52, 6,15,60, 6,10,30, 6, 6,56,
+ 6, 6,54,15, 3,47,15, 3,49, 6, 6,55, 6, 6,57, 0, 0, 0, 6, 6,60, 6, 6,58,
+ 0, 0, 0, 6, 6,49, 0, 0, 0, 6, 6,53, 6, 6,50, 0, 0, 0, 6, 6,51, 6, 6,59,
+ 5, 5,53, 6,10,35, 6,10,32, 6,10,33, 6,10,34, 6,13,20, 6,10,31, 0, 0, 0,
+ 15, 6, 4, 5, 5,52, 5, 8,52, 5, 8,54, 6,15,64, 6,15,63, 5, 8,53, 6,15,59,
+ 6,15,62, 0, 0, 0, 0, 0, 0, 6,15,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,12,60, 6,22,13, 6,22,10, 6,22,12, 5,12,59, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,22,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,12,61, 5,17,54, 6,30, 5, 5,17,55, 6,30, 4, 6,30, 3, 6,30, 2, 5,17,52,
+ 0, 0, 0, 6,30, 6, 0, 0, 0, 0, 0, 0, 5,23,19, 6,39,32, 6,39,33, 5,23,17,
+ /* plane 2, page 18 */
+ 0, 248, /* first, last */
+ 5,17,53, 0, 0, 0,15,25,82,15,25,83,15,25,84, 0, 0, 0, 0, 0, 0, 6,39,34,
+ 0, 0, 0, 5,23,18, 5,30,32, 6,49,37, 5,30,33, 6,49,39, 6,49,40, 5,30,34,
+ 0, 0, 0, 6,49,38, 0, 0, 0, 0, 0, 0,15,32,69, 6,59,52, 6,59,56, 5,37, 4,
+ 6,59,53, 6,59,58, 6,59,54,15,39,14,15,39,15,15,39,16, 0, 0, 0, 6,59,55,
+ 0, 0, 0, 0, 0, 0, 7, 1,69, 7, 1,70, 7, 1,68,15,45,91, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,47,85, 0, 0, 0,15,51,83, 7,23,28, 7,23,26, 0, 0, 0,
+ 0, 0, 0, 7,23,27, 0, 0, 0, 4,63,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,45,45,
+ 7,51, 2, 7,51, 1, 0, 0, 0, 0, 0, 0, 4, 1,40, 0, 0, 0, 5, 1,36, 6, 2,64,
+ 0, 0, 0,15, 1,49,15, 1,50, 0, 0, 0, 6, 2,65, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 4,21, 0, 0, 0,15, 2,22,15, 2,23, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 4,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 6,74, 4, 3,64, 6, 6,70, 6, 6,66, 0, 0, 0, 6, 6,62, 0, 0, 0, 6, 6,73,
+ 6, 6,61, 6, 6,69, 6, 6,71,15, 3,51,15, 3,52,15, 3,54,15, 3,56,15, 3,58,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6,64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 6,67, 6, 6,72, 6, 6,68, 0, 0, 0, 6, 6,65, 6, 6,63, 5, 3,62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 3,57, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 3,61, 5, 3,63, 5, 3,64, 5, 3,65, 4, 5,74, 6,10,47, 6,10,39, 6,10,44,
+ 6,10,38, 4, 5,71, 6,10,42, 4, 5,76, 6,10,40, 5, 5,54, 6,10,49, 6, 6,33,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,10,41,15, 6, 6,15, 6, 7,15, 6, 8,15, 6, 9,
+ 15, 6,10,15, 6,16,15, 6,17,15, 6,12,15, 6,11, 0, 0, 0, 4, 5,75, 0, 0, 0,
+ 15, 6,15,15, 6,14, 0, 0, 0, 6,10,48, 6,10,43, 6,10,45, 6,10,46,15, 6,18,
+ 15, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,10,37, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,10,36, 5, 5,55, 5, 8,59, 6,15,66,
+ 5, 8,55, 6,15,68, 6,15,65, 5, 8,56, 4, 8,63, 6,15,75, 6,15,67, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 9,90,15, 9,72,15, 9,73,15, 9,75,
+ 15, 9,76,15, 9,77,15, 9,78,15, 9,79,15, 9,80,15, 9,82,15, 9,83,15, 9,85,
+ 15, 9,86,15, 9,87,15, 9,88,15, 9,89,15, 9,91,15, 9,92,15, 9,93, 0, 0, 0,
+ 6,15,74, 0, 0, 0, 0, 0, 0, 6,15,76, 6,20,17, 6,15,71, 6,15,72, 0, 0, 0,
+ 6,15,70, 0, 0, 0, 0, 0, 0,15, 9,84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8,61,
+ 5, 8,58, 5, 8,62, 5, 8,60, 5, 8,57, 5,12,62, 4,12,18, 6,22,20, 4,12,16,
+ 4,12,20, 6,22,18, 6,22,28, 6,22,22, 6,22,29, 6,22,30, 6,22,17, 6,22,14,
+ 6,22,26,
+ /* plane 2, page 19 */
+ 1, 255, /* first, last */
+ 6,22,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,22,32,15,14,53,
+ 15,14,54,15,14,55,15,14,56,15,14,57,15,14,58,15,14,59,15,14,62,15,14,63,
+ 15,14,64, 0, 0, 0, 6,22,16, 6,22,31, 0, 0, 0, 6,22,23, 6,22,24, 6,22,25,
+ 5,12,64, 6,22,27,15,14,61, 0, 0, 0,15,14,65, 0, 0, 0, 0, 0, 0, 6,22,19,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,12,63, 5,12,66, 4,16,93, 6,30, 7,
+ 0, 0, 0, 4,16,92, 5,17,61, 6,30,20, 6,30,13, 5,17,59, 6,30,10, 5,12,65,
+ 6,30,19, 6,30,16, 5,17,58, 4,17, 2, 4,17, 3, 0, 0, 0,15,19,47,15,19,59,
+ 6,30,14, 6,30,15, 0, 0, 0,15,19,46,15,19,48,15,19,49,15,19,50,15,19,51,
+ 15,19,52,15,19,53,15,19,54,15,19,56,15,19,57,15,19,58,15,19,62,15,19,63,
+ 15,19,64,15,19,65, 5,17,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,30,17,
+ 0, 0, 0, 6,30,21, 0, 0, 0, 4,16,94, 6,30, 8, 6,30, 9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,17,56, 5,17,57, 0, 0, 0, 0, 0, 0, 3,26,47, 6,49,46, 4,22,82, 6,39,39,
+ 4,22,74, 6,39,37, 4,22,80, 4,22,76, 6,39,43, 6,39,48, 4,22,85, 6,39,36,
+ 6,39,38, 6,39,45, 5,23,20, 6,30,18, 6,39,47, 4,28,58, 5,23,25, 4,22,83,
+ 0, 0, 0, 0, 0, 0, 6,47,77, 5,23,24,15,25,86,15,25,88,15,25,89,15,25,90,
+ 15,25,91,15,25,92,15,26, 1,15,26, 2,15,26, 3,15,26, 4,15,26, 5,15,26, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,39,49, 0, 0, 0,
+ 6,39,42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,39,41, 4,22,84, 6,39,44,
+ 0, 0, 0, 0, 0, 0,15,25,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,23,23,
+ 5,23,26, 6,39,40, 5,23,21, 5,23,22, 5,23,27, 0, 0, 0, 5,30,38, 6,49,54,
+ 6,49,43, 6,49,53, 0, 0, 0, 5,30,45, 4,28,52, 6,59,66, 6,49,50, 5,30,44,
+ 6,49,49, 5,30,36, 5,30,43, 5,30,35, 6,49,52, 6,49,48, 5,30,41, 5,30,42,
+ 4,28,53, 5,30,39, 6,49,41, 6,49,44, 0, 0, 0,15,25,87, 0, 0, 0, 6,49,51,
+ 6,49,45,15,32,70,15,32,71,15,32,72,15,32,74,15,32,75,15,32,76,15,32,77,
+ 15,32,78,15,32,79,15,32,80,15,32,81,15,32,82,15,32,83, 0, 0, 0, 6,49,47,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,30,46, 5,30,40, 5,30,37, 0, 0, 0, 5,37, 9, 5,37, 8, 5,37, 7,
+ 6,59,60, 4,34,60, 6,59,68, 6,59,70, 6,59,65, 5,37,10, 6,59,64, 5,37, 6,
+ 6,59,71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,39,18,
+ /* plane 2, page 20 */
+ 0, 255, /* first, last */
+ 15,39,19,15,39,20,15,39,21,15,39,22,15,39,23,15,39,25,15,39,26,15,39,27,
+ 15,39,28, 6,59,61,15,39,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,59,75, 0, 0, 0,
+ 6,59,67, 6,59,51, 0, 0, 0,15,39,17, 4,34,58, 6,59,69, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,59,62, 0, 0, 0, 5,37, 5, 5,37,11, 7, 1,82,
+ 4,41,20, 4,41,21, 7, 1,79, 4,41,22, 5,44,43, 5,44,44, 7, 1,75, 0, 0, 0,
+ 7, 1,88, 4,41,23, 7, 1,87, 7, 1,84, 0, 0, 0,15,46, 1, 0, 0, 0, 0, 0, 0,
+ 5,44,45, 5,44,47, 7, 1,71, 7, 1,85,15,45,92,15,45,93,15,46, 6,15,46, 7,
+ 15,46, 8,15,46, 9,15,46,10,15,46,11,15,46,13, 0, 0, 0, 7, 1,76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7, 1,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1,78,
+ 5,44,81, 7, 1,83, 7, 1,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1,73,
+ 0, 0, 0,15,45,94,15,46, 4, 0, 0, 0,15,46, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,44,46, 5,44,42, 5,44,40, 7, 1,72, 5,44,41, 0, 0, 0, 7,12,79, 7,12,81,
+ 7,12,76, 4,47,87, 4,47,90, 4,47,89, 7,12,77, 0, 0, 0, 7,12,80, 0, 0, 0,
+ 15,46,12, 0, 0, 0, 0, 0, 0,15,51,84,15,51,86,15,51,88, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,51,90, 7,12,82,
+ 5,51,91, 5,51,89, 7,20,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,12,83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,12,78,15,51,87,
+ 4,47,86, 7,23,35, 4,53,93, 7,23,29, 5,59,14, 7,23,31, 7,23,36, 0, 0, 0,
+ 7,23,34, 0, 0, 0, 7,23,37, 5,59,12, 0, 0, 0, 0, 0, 0, 7,12,84, 0, 0, 0,
+ 0, 0, 0,15,57,68,15,57,69,15,57,70,15,57,71,15,57,72,15,57,73,15,57,74,
+ 15,57,75, 7,30,76, 0, 0, 0, 7,23,32, 7,23,33, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,53,94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,59,15,
+ 7,31,20, 5,65,39, 7,23,30, 5,65,41, 7,31,19,15,62,39, 0, 0, 0,15,62,40,
+ 15,62,41,15,62,43,15,62,45,15,62,46, 7,31,17, 7,31,18, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,59,16, 5,65,40, 0, 0, 0,15,66, 8, 5,65,42, 0, 0, 0, 0, 0, 0,
+ 7,38,34, 7,38,31, 5,71,61, 7,38,39, 7,38,33,15,62,44, 0, 0, 0,15,66, 7,
+ 0, 0, 0, 7,38,35, 7,38,38, 7,42,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,38,32, 7,31,21, 0, 0, 0, 4,67,19,15,69, 2,
+ 0, 0, 0,15,69, 3,15,69, 4,15,69, 5, 7,45,46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,75,87, 7,51, 8, 4,70,22, 7,51, 4, 7,51, 3, 7,51, 7, 7,51, 5, 0, 0, 0,
+ 5,79,84,15,71,41,15,71,42,15,71,44, 7,51, 6,15,71,43, 0, 0, 0, 5,79,82,
+ /* plane 2, page 21 */
+ 1, 255, /* first, last */
+ 5,79,83, 7,55,59, 0, 0, 0,15,73,29, 0, 0, 0, 0, 0, 0, 5,83,20,
+ 7,55,61, 5,83,21, 7,59,43, 7,55,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,62,55,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,87,55, 0, 0, 0, 5,91,63,
+ 7,69,58, 7,70,34, 7,70,47, 6, 2,66, 0, 0, 0, 6,15,77, 6, 6,75, 6,10,50,
+ 15, 9,94,15,10, 1, 5,12,68, 0, 0, 0, 6,22,34, 6,15,78, 6,22,33,15,14,66,
+ 5,12,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,30,22,15,19,66, 0, 0, 0, 6,39,50,
+ 6,49,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,49,56, 6,59,74, 6,68,90,
+ 0, 0, 0, 6,59,72,15,39,29, 6,59,73, 7, 1,90, 7, 1,89, 7,12,85, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,31,22, 7,35,31, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,62,47, 7,31,23, 7,38,40, 7,38,41, 7,40,27, 0, 0, 0,
+ 0, 0, 0, 7,55,62, 5, 1,15, 6, 2,67, 0, 0, 0, 6, 4,23, 6, 4,22, 0, 0, 0,
+ 6, 6,76,15, 3,60, 6,22,35, 6,30,23, 6,30,24, 6,49,58, 6, 4,25, 6, 4,24,
+ 5, 3,68, 5, 3,67, 4, 5,79, 6,10,51,15, 6,20, 0, 0, 0,15,14,67, 5,17,62,
+ 6,30,25, 6,30,28, 5,12,69, 6,30,27, 6,30,26, 0, 0, 0, 5,30,47, 6,49,60,
+ 0, 0, 0,15,32,84, 6,59,76,15,39,30, 6,59,77, 0, 0, 0, 5,44,48,15,46,15,
+ 15,51,89, 7,12,86, 7,12,87, 7,23,38, 7,38,42, 7,31,26, 7,31,24, 7,31,25,
+ 7,38,43, 7,45,47, 0, 0, 0, 0, 0, 0, 6, 2,68, 0, 0, 0, 6, 2,69, 0, 0, 0,
+ 6, 4,26, 0, 0, 0, 6, 6,78, 6, 6,77, 0, 0, 0, 6,10,52, 0, 0, 0,15, 5,34,
+ 0, 0, 0, 5, 8,63, 5,12,72, 4,12,21, 5,12,71, 6,22,38, 0, 0, 0, 6,22,37,
+ 15,14,68,15,14,69, 6,22,39, 0, 0, 0, 5,12,73, 4,17, 4, 5,17,65, 6,30,29,
+ 0, 0, 0, 0, 0, 0, 5,17,63, 5,17,64, 5,17,66,15,19,67, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,39,52, 5,23,30, 5,23,34, 5,23,32, 5,23,33,15,26, 7, 5,30,48,
+ 6,49,61, 0, 0, 0, 5,30,50, 5,30,49, 6,49,63, 0, 0, 0, 4,34,65, 6,59,79,
+ 6,59,80, 6,59,78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,37,12, 5,37,14, 7, 1,91,
+ 0, 0, 0, 5,44,49, 0, 0, 0, 7,31,27, 0, 0, 0, 0, 0, 0, 5,59,17, 0, 0, 0,
+ 5,59,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,38,44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 1,71, 6, 1,72,15, 1,24, 6, 2,70, 0, 0, 0, 0, 0, 0,
+ 15, 1,51,15, 1,52, 0, 0, 0, 0, 0, 0, 5, 1,86, 6, 4,28, 4, 2,52, 6, 4,31,
+ 6, 4,32, 6, 4,30, 6, 4,29,15, 1,75, 0, 0, 0, 4, 3,67, 4, 3,68, 0, 0, 0,
+ 4, 3,70,15, 3,61,15, 3,62,15, 3,63,15, 3,64,15, 3,65,15, 3,66,15, 3,67,
+ 6, 6,80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6,79, 0, 0, 0, 0, 0, 0, 4, 5,86,
+ 5, 5,58, 4, 5,84, 6,10,53, 6,10,54, 4, 8,67, 6,10,60, 6,10,56, 6,10,57,
+ /* plane 2, page 22 */
+ 0, 254, /* first, last */
+ 15, 6,22,15, 6,23, 6,10,58, 0, 0, 0, 6,10,59, 6,10,61, 4, 5,89, 0, 0, 0,
+ 0, 0, 0, 6,10,55, 0, 0, 0, 6, 9,25, 4, 8,68, 4, 8,66, 5, 8,65, 5, 8,66,
+ 5, 8,64, 0, 0, 0,15,10, 3, 0, 0, 0,15,10, 4,15,10, 5,15,10, 6,15,10, 8,
+ 15,10, 9,15,10, 7,15,10, 2, 0, 0, 0, 0, 0, 0, 5,12,76, 0, 0, 0, 6,22,40,
+ 6,22,43, 0, 0, 0, 5,12,74, 5,12,77,15,14,71,15,14,72,15,14,73, 0, 0, 0,
+ 0, 0, 0, 6,22,42, 0, 0, 0, 4,12,23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,12,75, 0, 0, 0, 5,17,68,15,14,70, 4,12,22, 6,30,33, 6,30,36, 3,20,94,
+ 6,30,30, 6,30,35, 6,30,32, 6,30,37, 6,30,31,15,19,68, 0, 0, 0,15,19,69,
+ 0, 0, 0, 4,17, 7, 0, 0, 0, 0, 0, 0, 5,17,67, 0, 0, 0, 0, 0, 0, 4,28,62,
+ 6,39,56, 6,39,59, 6,39,61, 0, 0, 0, 6,39,58,15,26, 8, 6,39,53, 6,39,60,
+ 5,23,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,39,57, 4,22,90, 4,22,88,
+ 5,23,36, 0, 0, 0, 6,39,55, 0, 0, 0, 6,49,64, 6,49,65, 0, 0, 0, 0, 0, 0,
+ 4,28,61, 0, 0, 0,15,32,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,30,51, 5,30,52, 5,30,53, 6,59,82, 4,34,67, 5,37,15, 4,34,66,15,39,31,
+ 15,39,32,15,39,33, 6,59,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,37,16, 4,41,24,
+ 7, 2, 2, 7, 1,92, 7, 2, 1, 7,12,92, 7, 1,94, 5,44,51,15,46,17,15,46,18,
+ 7, 1,93, 4,34,68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,44,50, 7,12,93, 5,51,92,
+ 7,12,88, 7,12,89, 4,54, 1,15,51,90, 7,12,90, 0, 0, 0, 0, 0, 0, 7,23,40,
+ 7,23,39, 5,59,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,54,14, 4,58,91,
+ 15,66, 9, 0, 0, 0, 0, 0, 0, 5,75,88, 7,51, 9, 0, 0, 0,15,73,30, 0, 0, 0,
+ 5,85,72, 0, 0, 0, 0, 0, 0,15,75,36, 7,62,56,15,76,63, 0, 0, 0, 0, 0, 0,
+ 5, 1,66, 0, 0, 0,15, 1,53,15, 1,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4,33,
+ 4, 2,56, 6, 4,34,15, 2,25,15, 2,26,15, 2,27,15, 2,28, 0, 0, 0, 0, 0, 0,
+ 4, 2,55, 5, 2,43, 6, 4,35, 5, 2,42, 6, 6,84, 4, 3,72, 4, 3,75,15, 3,68,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 3,70,15, 3,72,15, 3,73,15, 3,75,15, 3,76,
+ 15, 3,77,15, 3,78,15, 3,79,15, 3,69, 0, 0, 0, 6, 6,82, 6, 6,83, 0, 0, 0,
+ 6, 6,85, 0, 0, 0, 6, 6,81,15, 3,74, 0, 0, 0,15, 3,71, 5, 3,70, 5, 3,71,
+ 5, 3,69, 4, 5,92, 6,10,65, 6,10,64, 5, 5,64, 4, 5,90, 5, 5,62, 4, 5,93,
+ 5, 5,59, 5, 5,60, 4, 5,94, 0, 0, 0, 0, 0, 0,15, 6,26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15, 6,27,15, 6,30,15, 6,31,15, 6,32,15, 6,33,15, 6,34,15, 6,35,
+ 15, 6,37,15, 6,38,15, 6,39,15, 6,40,15, 6,41, 0, 0, 0, 0, 0, 0, 6,10,63,
+ 0, 0, 0, 6,10,62,15, 6,36,15, 6,28,15, 6,29, 5, 5,66, 5, 5,63,
+ /* plane 2, page 23 */
+ 0, 255, /* first, last */
+ 5, 5,67, 5, 5,65, 4, 8,72, 5, 8,68, 6,15,86, 6,15,88, 6,15,89, 4, 8,69,
+ 4, 8,75, 5, 8,70, 4, 8,70, 5, 8,67, 6,15,80, 6,15,91, 6,15,84, 5, 8,75,
+ 0, 0, 0, 6,15,94,15,10,13,15,10,14,15,10,15,15,10,16,15,10,17,15,10,18,
+ 15,10,19,15,10,20, 0, 0, 0, 6,15,83, 6,15,87, 4, 8,76, 0, 0, 0, 6,15,85,
+ 6,15,90, 6,15,79, 0, 0, 0, 6,15,93, 0, 0, 0, 5, 8,73, 4, 8,74, 5, 8,74,
+ 5, 8,71, 6,15,81, 6,15,92, 5, 8,69, 5, 8,72, 6,15,82, 3,16,51, 5,12,80,
+ 6,22,47, 5,12,82, 5,12,85, 5,12,79, 6,22,53, 5,12,78, 6,22,54, 0, 0, 0,
+ 6,22,48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,22,49,15,14,76,15,14,78,
+ 15,14,80,15,14,81,15,14,83,15,14,84,15,14,85,15,14,86,15,14,87,15,14,89,
+ 0, 0, 0, 0, 0, 0, 6,22,52, 0, 0, 0, 6,22,46, 5,12,81, 0, 0, 0, 6,22,51,
+ 0, 0, 0, 6,22,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,14,79,
+ 15,14,82, 5,12,87, 5,12,84, 5,12,83, 5,12,86, 5,12,88, 6,30,44, 6,30,50,
+ 6,30,38, 6,30,39, 5,17,74, 6,30,40, 6,30,41, 6,30,47, 5,17,73, 5,17,77,
+ 6,30,45, 4,17,11, 6,30,46, 5,17,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,30,51, 0, 0, 0, 0, 0, 0,15,19,72,15,19,73,15,19,74,
+ 15,19,75,15,19,76,15,19,77,15,19,78,15,19,79,15,19,81,15,19,82,15,19,84,
+ 15,19,85,15,19,86,15,19,87,15,19,88,15,19,89,15,19,90,15,19,91,15,19,92,
+ 15,19,93,15,19,94,15,20, 1,15,20, 2,15,20, 3, 0, 0, 0,15,19,80, 0, 0, 0,
+ 6,30,49, 4,17,10, 0, 0, 0, 6,30,43, 6,30,42, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,17,70, 5,17,71, 5,17,72, 5,17,69, 4,22,91, 6,39,66, 4,22,92, 5,23,58,
+ 6,39,63, 4,23, 1, 5,23,40, 5,23,57, 6,39,68, 0, 0, 0, 6,39,70, 5,23,47,
+ 6,39,69, 6,39,64, 5,23,48, 5,23,41, 5,23,55, 5,23,52, 5,23,39, 5,23,43,
+ 15,26, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,26,11,15,26,12,
+ 15,26,13,15,26,14,15,26,15,15,26,16,15,26,18,15,26,19,15,26,20,15,26,22,
+ 15,26,23,15,26,24,15,26,25,15,26,26,15,26,30,15,26,31,15,26,33,15,26,34,
+ 15,26,35,15,26,36,15,26,37, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,26,27, 0, 0, 0,
+ 0, 0, 0, 5,23,54, 0, 0, 0, 0, 0, 0, 6,39,67, 5,23,56, 6,39,62, 0, 0, 0,
+ 0, 0, 0,15,26,29,15,26,32,15,26,17,15,26,10, 5,23,37, 5,30,54, 5,23,51,
+ 5,23,44, 5,23,50, 5,23,49, 5,23,42, 5,23,45, 5,23,53, 6,39,71,15,19,71,
+ 5,30,63, 5,30,58, 5,30,61, 5,30,55, 4,28,69, 5,30,57, 6,49,67, 4,28,66,
+ 4,28,64, 6,49,71, 6,49,69, 6,59,92, 5,30,60, 0, 0, 0, 0, 0, 0, 5,30,59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,49,70,15,32,88,15,32,89,
+ /* plane 2, page 24 */
+ 0, 255, /* first, last */
+ 15,32,90,15,32,92,15,32,93,15,32,94,15,33, 2,15,33, 3, 0, 0, 0, 0, 0, 0,
+ 6,49,66, 0, 0, 0, 0, 0, 0, 6,49,68, 0, 0, 0, 0, 0, 0,15,32,87, 0, 0, 0,
+ 6,49,72, 5,30,56, 5,30,62, 5,30,64, 6,49,74,15,33, 1, 0, 0, 0, 4,34,80,
+ 0, 0, 0, 5,37,18, 4,34,74, 6,59,91, 4,34,81, 6,59,83, 5,37,20, 7, 2, 9,
+ 4,34,83, 0, 0, 0, 6,59,85, 0, 0, 0,15,39,40, 4,34,79, 5,37,23, 4,34,78,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,39,39,15,39,41,15,39,42,15,39,43,15,39,44,
+ 15,39,45,15,39,46,15,39,47,15,39,48,15,39,49,15,39,50,15,39,52, 6,59,84,
+ 6,59,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,34,82, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,34,69, 6,59,86, 0, 0, 0,15,39,51, 0, 0, 0, 0, 0, 0,
+ 5,37,19, 5,37,22, 5,37,21, 7, 2, 6, 5,37,17, 6,59,87, 0, 0, 0, 5,44,59,
+ 5,44,57, 4,41,25, 5,44,54, 7, 2,15, 5,44,55, 4,41,31, 4,41,27, 7, 2,12,
+ 0, 0, 0, 4,41,30, 7, 2, 5, 6,59,89, 7, 2, 4,15,46,26, 0, 0, 0, 7,23,49,
+ 15,39,37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,44,52, 0, 0, 0, 0, 0, 0,
+ 5,44,60,15,46,19,15,46,20,15,46,21,15,46,22,15,46,23,15,46,24,15,46,25,
+ 15,46,27,15,46,29,15,46,30,15,46,31,15,46,32,15,46,33,15,46,34,15,46,36,
+ 0, 0, 0, 6,59,90, 0, 0, 0, 0, 0, 0, 7, 2, 7, 7, 2,14, 7, 2,13, 7, 2, 8,
+ 0, 0, 0, 0, 0, 0, 7, 2, 3,15,46,37,15,46,35,15,46,28, 5,44,58, 5,44,53,
+ 4,41,29, 7, 2,10, 5,44,56, 7, 2,11, 0, 0, 0,15,52, 5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,52, 8, 5,52, 3, 7,13, 5, 7,12,94, 5,52, 9, 5,52, 6, 7,13, 1,
+ 4,47,94, 7,13, 8, 5,52, 2, 7,13,11, 5,51,93, 7,13,10, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,13,12,15,51,91,15,51,92,15,51,93,15,51,94,
+ 15,52, 2,15,52, 3,15,52, 4,15,52, 6,15,52, 7,15,52,11,15,52,12, 0, 0, 0,
+ 0, 0, 0, 5,51,94, 7,13, 6, 0, 0, 0, 7,13, 7, 7,13, 3, 0, 0, 0, 7,13, 2,
+ 7,13, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,52, 1,15,52, 8,
+ 5,52, 7, 5,52, 1, 5,52, 5, 7,13, 9, 0, 0, 0, 7,23,43, 7,23,52, 7,23,47,
+ 4,47,93, 7,23,45, 0, 0, 0, 4,54, 3, 7,23,51, 7,23,42, 5,59,22, 5,59,20,
+ 7,23,44, 7,23,46, 7,23,48, 0, 0, 0, 5,59,21, 4,54, 5, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,57,76,15,57,77,15,57,78,15,57,79,15,57,80,15,57,81,
+ 0, 0, 0, 7,23,50, 0, 0, 0, 0, 0, 0, 7,23,53, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,23,41, 5,65,43, 4,58,92, 0, 0, 0, 7,31,31, 5,65,44, 5,65,45,
+ 7,31,30, 7,31,32,15,62,48,15,62,49,15,62,50,15,62,52, 0, 0, 0, 7,31,29,
+ 7,31,33, 0, 0, 0,15,62,51, 0, 0, 0, 7,31,28, 5,71,63, 4,63,51, 7,38,45,
+ /* plane 2, page 25 */
+ 0, 251, /* first, last */
+ 7,38,50, 7,38,48,15,62,53, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,66,10,15,66,11,
+ 7,38,46, 0, 0, 0, 0, 0, 0, 5,71,65, 5,71,64,15,63,83, 0, 0, 0, 7,45,49,
+ 0, 0, 0, 0, 0, 0, 5,75,89, 0, 0, 0, 0, 0, 0,15,69, 6, 5,75,90, 5,75,91,
+ 7,51,10, 5,79,86, 7,51,11, 5,79,85,15,71,45,15,71,46, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,55,66, 5,83,22, 7,55,65, 7,55,67, 7,55,63,15,73,31, 0, 0, 0,
+ 7,55,64, 7,55,68,15,73,32, 5,85,73, 7,59,44, 0, 0, 0, 7,62,58, 7,62,59,
+ 15,75,37, 7,62,57, 7,62,60, 0, 0, 0,15,76, 4, 0, 0, 0, 5,89, 4,15,76,42,
+ 0, 0, 0, 7,67,45, 5,90,69, 0, 0, 0, 4, 1,19, 0, 0, 0, 6, 2,72, 5, 1,67,
+ 6, 2,73,15, 1,56,15, 1,55, 6, 4,37, 0, 0, 0, 6, 4,36, 6, 6,86, 6, 6,87,
+ 5, 3,74, 4, 3,76,15, 3,80, 0, 0, 0, 0, 0, 0, 5, 3,73, 4, 8,79, 6,16, 4,
+ 6,10,67, 6,10,66,15, 6,42,15, 6,43,15, 6,44,15, 6,45,15, 6,47, 6,10,68,
+ 15, 6,46, 0, 0, 0, 0, 0, 0, 6,16, 3, 6,16, 1, 6,16, 6, 6,16, 5, 0, 0, 0,
+ 0, 0, 0,15,10,21,15,10,22,15,10,23, 0, 0, 0, 0, 0, 0, 6,16, 2, 0, 0, 0,
+ 6,22,57, 5,12,89, 6,22,56,15,14,90,15,14,91, 5,12,90,15,19,70,15,20, 4,
+ 15,20, 5,15,20, 6,15,20, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,23,60, 6,39,73,
+ 0, 0, 0, 5,23,59, 6,39,74,15,26,39, 0, 0, 0, 6,39,72,15,26,38, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,28,70, 4,28,72, 6,49,77, 5,30,66,15,33, 5,
+ 0, 0, 0,15,33, 6, 0, 0, 0, 6,49,75, 6,49,76, 0, 0, 0, 5,30,65, 4,28,73,
+ 0, 0, 0, 6,59,93,15,39,53,15,39,54, 0, 0, 0, 5,37,24, 0, 0, 0, 4,41,33,
+ 4,41,34, 0, 0, 0,15,46,38, 0, 0, 0, 0, 0, 0, 5,44,61, 7,13,15, 7,13,14,
+ 7,13,17, 7,13,18, 5,52,10, 7,13,16,15,52,13,15,52,14, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,23,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,45,50, 0, 0, 0,15,66,12,
+ 15,66,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,75,92, 0, 0, 0, 0, 0, 0,
+ 15,76,64, 6, 1,73, 0, 0, 0, 0, 0, 0, 5, 1,68, 6, 4,38, 6, 4,41, 6, 4,42,
+ 0, 0, 0, 0, 0, 0, 4, 2,58,15, 2,29,15, 2,30,15, 2,31,15, 2,32,15, 2,33,
+ 6, 4,39, 0, 0, 0, 0, 0, 0, 6, 6,94, 6, 6,93, 4, 3,78, 6, 6,91, 6, 6,92,
+ 0, 0, 0,15, 3,82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5,69, 5, 5,68,
+ 6,10,70, 5, 5,70, 6,10,71, 0, 0, 0, 6,10,72,15, 6,49,15, 6,50,15, 6,52,
+ 15, 6,53, 0, 0, 0, 6,10,69,15, 6,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 8,76, 6,16, 8, 6,16,10, 5, 8,77, 4, 8,81, 4, 8,82, 4, 8,83,
+ 6,16,11, 6,16, 7, 0, 0, 0, 0, 0, 0, 6,16, 9,15,10,24,15,10,26,15,10,27,
+ 15,10,28, 0, 0, 0, 6,16,12, 6,16,13,
+ /* plane 2, page 26 */
+ 0, 255, /* first, last */
+ 4,12,42, 6,22,65, 4,12,37, 4,12,36, 4,12,35, 4,12,39, 6,22,68, 6,22,69,
+ 6,22,63, 6,22,62, 5,12,93, 0, 0, 0, 0, 0, 0, 5,13, 2, 6,22,59, 6,22,66,
+ 15,14,92,15,14,93, 0, 0, 0, 6,22,64, 6,22,67, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,22,58, 0, 0, 0, 6,22,60, 5,13, 1,
+ 5,12,94, 0, 0, 0, 4,17,13, 5,17,79, 6,30,55, 6,30,57, 6,30,56, 6,30,54,
+ 6,30,59, 5,17,80,15,20, 8,15,20, 9,15,20,10,15,20,11,15,20,12,15,20,13,
+ 15,20,14,15,20,15, 0, 0, 0, 0, 0, 0, 4,17,15, 0, 0, 0, 6,30,60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,17,78, 6,30,53, 5,23,62, 4,23, 6, 5,23,65,
+ 6,39,80, 6,39,75, 4,23, 3, 5,23,61, 5,23,64, 6,39,78, 4,23, 5, 5,23,63,
+ 6,39,79, 6,39,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,26,40,15,26,41,
+ 15,26,42,15,26,43,15,26,44,15,26,45,15,26,46,15,26,47, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,39,77, 0, 0, 0, 5,23,66, 0, 0, 0, 0, 0, 0,15,29,76, 6,49,84,
+ 6,49,80, 4,28,75, 4,28,80, 5,30,67, 6,49,87, 5,30,68, 6,49,82, 6,49,81,
+ 6,49,86, 4,28,77, 6,49,83, 0, 0, 0, 6,49,79, 6,49,85,15,33, 7,15,33, 8,
+ 15,33, 9,15,33,10,15,33,12,15,33,13,15,33,14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,49,78, 6,59,94, 6,60, 7, 5,37,28, 5,37,26, 6,60, 4,
+ 6,60,12, 4,34,86, 6,60,14, 6,60,11, 6,60, 6, 5,37,25, 7, 2,19, 0, 0, 0,
+ 15,39,55,15,39,56,15,39,57,15,39,58, 0, 0, 0, 0, 0, 0, 6,60, 8, 6,60, 5,
+ 6,60, 9, 0, 0, 0, 0, 0, 0, 6,60,13, 6,60, 1, 0, 0, 0, 6,60, 3, 5,37,27,
+ 6,60,10, 0, 0, 0,15,39,36, 6,66,71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2,16,
+ 5,44,62, 4,41,39, 7, 2,23, 4,41,40, 7, 2,21, 7, 2,18, 0, 0, 0,15,46,39,
+ 15,46,40,15,46,41,15,46,42,15,46,43,15,46,44,15,46,46,15,46,47, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2,24, 0, 0, 0, 7, 2,22,15,46,45,
+ 5,44,65, 0, 0, 0, 5,44,63, 0, 0, 0, 7, 2,17, 5,44,64, 7,13,21, 7,13,23,
+ 5,52,12, 4,48, 2, 5,52,13, 5,52,11, 7,13,22, 7,13,19, 7,13,20,15,52,15,
+ 15,52,16,15,52,17,15,52,19,15,52,20,15,52,21,15,52,22,15,52,23, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,23,57, 7,23,55, 5,59,24,15,57,82,15,57,83,15,57,84,
+ 15,57,85, 0, 0, 0, 7,23,56, 7,23,58, 7, 2,20, 5,59,23, 7,38,56, 5,65,46,
+ 15,57,86, 0, 0, 0,15,62,54,15,62,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,31,34,15,66,14, 0, 0, 0, 4,63,55, 7,38,51, 7,38,53, 4,63,54,
+ 7,38,55, 7,38,54,15,66,15, 7,38,52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,67,22,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,45,51, 7,51,12, 4,70,24, 7,51,13,15,71,47,
+ /* plane 2, page 27 */
+ 0, 252, /* first, last */
+ 15,71,48, 0, 0, 0, 0, 0, 0, 7,51,14, 5,83,24, 4,72,70, 7,55,69, 5,83,23,
+ 0, 0, 0, 0, 0, 0, 7,55,70, 0, 0, 0, 4,74,37, 4,75,71, 0, 0, 0,15,75,38,
+ 0, 0, 0, 7,64,76, 7,68,37, 5,89, 5,15,76, 5, 0, 0, 0, 4,77,52, 0, 0, 0,
+ 5,90, 7, 4,77,81, 7,67,46, 7,69,20, 0, 0, 0, 6, 1,74, 0, 0, 0, 6,10,74,
+ 6,10,73, 0, 0, 0,15, 6,54,15, 6,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8,79,
+ 6,16,14,15,10,29, 6,16,17, 0, 0, 0, 6,16,15, 0, 0, 0, 4,17,17, 6,35,71,
+ 6,30,62, 6,30,61, 0, 0, 0, 4,23, 7, 6,30,63, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,49,90, 6,49,88, 6,49,89, 0, 0, 0, 6,60,16, 4,36, 6,15,39,59,
+ 0, 0, 0, 6,60,17, 5,37,29, 0, 0, 0, 0, 0, 0,15,46,49, 7, 2,26, 0, 0, 0,
+ 7, 2,25, 0, 0, 0, 7,13,25, 5,51,50, 7,13,24, 7,23,59, 7,23,60, 0, 0, 0,
+ 5,65,47, 7,38,57, 7,45,52, 7,51,15, 0, 0, 0, 6, 1,75,15, 1,25, 0, 0, 0,
+ 0, 0, 0, 6, 4,44, 5, 2,44, 0, 0, 0, 0, 0, 0, 6, 7, 4, 4, 3,82, 6, 7, 3,
+ 6, 7, 2,15, 3,83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5,71, 0, 0, 0, 0, 0, 0,
+ 15, 6,56, 6,10,75, 6,16,18, 6,16,16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,16,19,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8,80, 4,12,43,15,15, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,22,73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,30,65, 5,17,81, 5,23,67,
+ 6,30,67, 6,30,64, 6,30,66,15,20,16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,39,81,15,26,48,
+ 6,39,83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,39,82, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,30,69, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,33,15, 5,37,30, 6,60,19,
+ 0, 0, 0, 6,60,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,44,66, 7, 2,27,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,52,15, 7,13,26, 0, 0, 0, 0, 0, 0,15,57,87, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,65,48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,79,87,
+ 0, 0, 0, 0, 0, 0, 4, 1,42,15, 1,26, 5, 1,69,15, 1,45,15, 1,58, 0, 0, 0,
+ 0, 0, 0, 6, 2,75, 6, 2,74, 0, 0, 0, 0, 0, 0, 5, 2,45,15, 2,35, 5, 3,76,
+ 4, 3,83, 0, 0, 0, 5, 5,72, 0, 0, 0, 6, 7, 5, 0, 0, 0, 5, 3,75, 0, 0, 0,
+ 5, 3,78, 5, 3,77, 0, 0, 0, 6,16,20, 5, 5,73, 6,10,76, 5, 5,75,15, 6,57,
+ 6,16,21, 5, 5,74, 5, 8,81, 6,16,23, 0, 0, 0, 6,16,24, 5, 8,82, 6,16,25,
+ 5,13, 3, 6,22,76, 6,22,74, 0, 0, 0, 5,13, 4, 6,22,75, 6,22,77,15,15, 2,
+ 0, 0, 0, 0, 0, 0, 6,30,70, 5,17,82, 4,17,20, 5,17,84, 6,39,86, 6,39,84,
+ 6,39,85, 0, 0, 0, 4,23,10, 6,39,87,15,26,49,
+ /* plane 2, page 28 */
+ 2, 255, /* first, last */
+ 6,49,91, 6,49,93, 6,49,92, 0, 0, 0, 0, 0, 0, 5,40, 6,
+ 0, 0, 0, 4,34,90, 6,60,20, 5,37,32, 5,37,31, 6,60,21, 5,37,33, 0, 0, 0,
+ 7,13,29, 7, 2,30, 7, 2,29, 0, 0, 0, 7, 2,28, 7,13,27, 5,52,16, 7,13,28,
+ 7,13,30,15,52,24, 0, 0, 0, 0, 0, 0, 7,23,61, 4,70,25, 0, 0, 0, 0, 0, 0,
+ 4,72,71, 0, 0, 0, 5,89, 6, 6, 1,30, 4, 1,85, 4, 1,84, 6, 2,76, 0, 0, 0,
+ 0, 0, 0, 6, 4,45, 4, 2,62, 5, 2,46, 6, 4,46, 6, 4,48, 6, 4,49, 6, 4,47,
+ 15, 2,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 9,15, 3,84,
+ 6, 7, 7, 0, 0, 0, 6, 7, 6, 0, 0, 0, 6, 7, 8, 5, 3,79, 4, 6,12, 4, 6,11,
+ 6,10,77, 6,10,78, 5, 5,76, 6,10,79,15, 6,59, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5,77, 4, 8,87, 6,16,26, 6,16,31, 4, 8,90,
+ 4, 8,86, 5, 8,85, 6,16,30, 6,16,29, 6,16,28, 6,16,27, 0, 0, 0,15,10,32,
+ 15,10,33,15,10,34,15,10,35,15,10,36, 0, 0, 0,15,10,31, 0, 0, 0, 0, 0, 0,
+ 6,16,32, 5, 8,84, 6,22,82, 4,12,48, 6,22,79, 4,12,47, 6,30,71, 6,22,80,
+ 6,22,78, 0, 0, 0,15,15, 3,15,15, 4,15,15, 6,15,15, 7,15,15, 8, 0, 0, 0,
+ 5,13, 6, 5,13, 7, 6,22,81, 0, 0, 0, 6,22,83, 0, 0, 0, 0, 0, 0, 5,13, 5,
+ 0, 0, 0, 6,22,84, 6,30,77, 6,30,73, 5,17,88, 5,17,90, 5,17,87, 5,17,89,
+ 5,17,86, 5,17,91, 6,30,80, 6,30,74,15,20,17,15,20,18,15,20,21,15,20,22,
+ 15,20,23,15,20,24,15,20,25,15,20,26, 6,30,72, 0, 0, 0, 6,30,76, 0, 0, 0,
+ 0, 0, 0, 6,30,79, 6,30,78,15,20,19, 6,40, 3, 6,40, 4, 6,40, 2, 4,23,12,
+ 6,39,94, 6,39,90, 5,23,68, 4,23,13, 5,23,69, 6,39,89, 6,39,88, 6,40, 5,
+ 6,40, 1, 6,40, 6, 0, 0, 0, 6,39,92, 0, 0, 0, 0, 0, 0,15,26,50,15,26,51,
+ 15,26,52, 6,39,93, 4,23,14, 0, 0, 0, 6,50, 3, 5,30,73, 5,30,71, 6,50, 6,
+ 5,30,72, 6,50, 5, 6,50, 9, 6,50, 1, 6,49,94, 6,50, 7, 6,50, 4, 0, 0, 0,
+ 15,33,16,15,33,17,15,33,18, 6,50, 2, 0, 0, 0, 0, 0, 0, 6,50, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,30,70, 0, 0, 0, 4,34,92, 4,34,94, 4,34,91, 6,60,24,
+ 6,60,22, 6,60,23,15,39,61, 0, 0, 0, 0, 0, 0, 6,60,25, 0, 0, 0, 5,37,34,
+ 7, 2,32, 5,44,70, 0, 0, 0,15,46,50,15,46,51,15,46,52,15,46,53,15,46,54,
+ 5,44,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,44,68, 7,13,32,
+ 7,13,31, 7, 2,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,52,25, 7,16,13,
+ 7,23,62, 0, 0, 0, 0, 0, 0, 7,31,35, 4,63,56, 5,71,66, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,69, 7,15,69, 8, 0, 0, 0, 5,75,93, 0, 0, 0, 0, 0, 0,15,71,49,
+ 5,83,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1,16, 6, 1,76,
+ /* plane 2, page 29 */
+ 0, 255, /* first, last */
+ 6, 2,77, 6, 4,52, 6, 4,51, 0, 0, 0, 6, 4,50, 5, 2,47, 4, 3,85, 0, 0, 0,
+ 6, 7,10, 0, 0, 0, 0, 0, 0, 4, 6,13, 6,10,81, 6,10,80, 5, 8,87, 6,16,34,
+ 0, 0, 0, 6,16,35, 5, 8,86, 6,16,36, 0, 0, 0, 6,22,87, 6,22,88, 6,22,86,
+ 6,21, 8, 6,22,85, 0, 0, 0, 6,30,81, 6,30,82, 6,40, 8, 5,23,71, 6,40, 9,
+ 0, 0, 0, 6,40, 7, 0, 0, 0,15,26,53, 6,50,10, 6,60,26, 7, 2,33, 7,13,33,
+ 7, 2,34, 7, 2,35, 0, 0, 0, 7,51,16, 7,62,61, 5, 1,37, 0, 0, 0, 5, 1,38,
+ 6, 2,80, 6, 2,78, 6, 2,82, 6, 2,81, 0, 0, 0,15, 1,60,15, 1,61,15, 1,62,
+ 6, 2,83, 0, 0, 0, 0, 0, 0, 5, 1,70, 6, 2,79, 0, 0, 0, 0, 0, 0, 6, 4,55,
+ 6, 4,53, 6, 4,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,57,15, 2,37,
+ 15, 2,38, 0, 0, 0, 6, 4,54, 5, 2,51, 0, 0, 0, 0, 0, 0, 6, 4,58, 6, 4,56,
+ 0, 0, 0, 5, 2,50, 0, 0, 0, 6, 7,14, 5, 3,81, 5, 3,88, 5, 3,89, 6, 7,16,
+ 5, 3,86, 5, 3,85, 5, 3,87, 5, 3,82, 5, 3,83, 6, 7,17, 6, 7,12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7,18,15, 3,86, 0, 0, 0,15, 3,87,15, 3,89,
+ 15, 3,90,15, 3,91,15, 3,94,15, 4, 1, 0, 0, 0, 0, 0, 0, 6, 7,13, 0, 0, 0,
+ 6, 7,15, 4, 3,93, 0, 0, 0,15, 3,93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 7,20, 6, 7,19, 0, 0, 0, 4, 3,92, 0, 0, 0, 6, 7,11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5, 3,90, 4, 6,16, 5, 5,85, 6,10,85, 4, 6,19, 6,10,82,
+ 5, 5,83, 5, 5,84, 6,10,90, 5, 5,81, 6,10,87, 6,10,92, 5, 5,79, 6,10,89,
+ 5, 5,82, 5, 5,80, 6,10,84, 6, 7,21,15, 6,60,15, 6,61,15, 6,62,15, 6,63,
+ 15, 6,64,15, 6,65,15, 6,67,15, 6,68, 0, 0, 0,15, 6,69,15, 6,70,15, 6,71,
+ 15, 6,72, 0, 0, 0, 6,10,88, 0, 0, 0, 6,13,11, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,10,83, 5, 5,86, 6,16,48, 6,16,42, 5, 8,88, 6,16,43, 5, 8,89,
+ 4, 8,94, 5, 8,90, 0, 0, 0, 6,16,38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,16,41, 6,16,50, 0, 0, 0,15,10,37,15,10,39,15,10,40,15,10,43,15,10,44,
+ 15,10,45,15,10,46,15,10,47,15,10,48,15,10,49, 6,16,45, 6,16,37, 6,16,39,
+ 0, 0, 0, 6,16,49, 0, 0, 0, 0, 0, 0, 6,16,47, 0, 0, 0, 0, 0, 0, 6,16,44,
+ 15,10,42,15,10,38, 6,16,40, 5, 8,91, 4, 8,92, 5,13,12, 5,13, 9, 4,12,50,
+ 4,12,57, 5,13,10, 6,23, 1, 4,12,56, 5,13,20, 5,13,16, 5,13,11, 6,22,93,
+ 5,13,17, 5,13,13, 5,13,15, 6,23, 4, 6,22,94, 4,12,66, 6,22,89, 4,12,67,
+ 4,12,54, 6,23, 5, 6,23, 2, 0, 0, 0, 0, 0, 0, 6,23, 3, 6,22,91,15,15, 9,
+ 15,15,10,15,15,11,15,15,12,15,15,13,15,15,14,15,15,15,15,15,17,15,15,19,
+ 5,13, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,15,16,
+ /* plane 2, page 30 */
+ 2, 254, /* first, last */
+ 15,15,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,13,19, 4,12,61, 5,13,21, 0, 0, 0, 5,13,22, 0, 0, 0, 5,13,18, 0, 0, 0,
+ 6,27,46, 4,17,26, 6,31,11, 6,31, 4, 6,31, 6, 4,17,28, 4,17,30, 5,17,94,
+ 6,30,89, 6,31, 2, 6,30,91, 5,18, 8, 4,17,24, 0, 0, 0, 6,31, 7, 6,31,12,
+ 6,31, 9, 6,30,84, 6,31,10, 4,17,32, 4,17,27, 5,17,92, 5,18, 6, 6,30,83,
+ 4,17,22, 5,17,93, 5,18, 4, 0, 0, 0, 6,31, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,31, 3,15,20,27, 0, 0, 0,
+ 15,20,28,15,20,29,15,20,30,15,20,32,15,20,33,15,20,34,15,20,35,15,20,36,
+ 15,20,38,15,20,39,15,20,40, 6,30,87, 0, 0, 0, 0, 0, 0, 6,18,10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,30,93, 6,30,92, 0, 0, 0, 6,30,94, 0, 0, 0, 6,31, 1,
+ 0, 0, 0, 0, 0, 0, 6,31, 5, 0, 0, 0, 4,17,31, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,18, 9, 5,18, 1, 5,18, 7, 5,18, 3, 0, 0, 0, 5,18, 2,
+ 5,18, 5, 5,18,10, 5,23,73, 6,40,19, 5,23,78, 6,40,10, 6,40,20, 5,23,79,
+ 5,23,76, 0, 0, 0, 5,23,75, 4,23,16, 0, 0, 0, 5,23,80, 5,23,74, 5,23,81,
+ 5,23,82, 5,23,84, 6,40,14, 6,30,90, 4,23,17, 6,40,15, 5,23,77, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,23,19, 0, 0, 0,
+ 5,23,72, 0, 0, 0, 5,23,83,15,26,54,15,26,56,15,26,57,15,26,58,15,26,59,
+ 0, 0, 0, 0, 0, 0, 6,40,13, 0, 0, 0, 5,23,85, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,40,18, 6,40,12, 0, 0, 0, 0, 0, 0, 6,40,17, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,40,16, 0, 0, 0, 0, 0, 0,15,26,60, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,30,80, 6,50,13, 5,30,76, 4,28,90, 5,30,81,
+ 6,50,14, 6,60,27, 4,28,93, 6,50,21, 5,30,74, 5,30,83, 6,50,11, 5,30,79,
+ 0, 0, 0, 6,50,12, 6,50,25, 6,50,16, 6,50,24, 5,30,78, 6,50,22, 6,60,32,
+ 15,33,23, 5,30,82,15,33,19,15,33,20,15,33,22,15,33,24,15,33,25, 6,50,26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,50,18, 0, 0, 0, 6,50,23, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,30,75, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,33,21, 0, 0, 0, 6,50,15,
+ 5,37,35, 5,37,43, 5,37,41, 6,60,33, 6,60,28, 4,35,11, 4,35, 6, 4,35, 5,
+ 5,37,36, 5,37,40, 5,37,39, 5,37,42, 5,37,46, 6,60,30, 6,60,39, 5,37,45,
+ 5,37,37, 5,37,38, 6,60,34, 0, 0, 0, 4,35, 9, 6,60,38, 4,35, 7, 4,35, 3,
+ 5,37,44, 6,60,37, 6,60,35, 0, 0, 0, 6,60,31, 4,35, 8,15,39,62,15,39,63,
+ 15,39,64,15,39,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,50,17,
+ /* plane 2, page 31 */
+ 10, 255, /* first, last */
+ 4,41,46, 7, 2,41, 4,41,50, 7, 2,37, 5,44,73, 0, 0, 0,
+ 7, 2,48, 7, 2,42, 5,44,78, 5,44,71, 7, 2,39, 7, 2,49, 5,44,79, 7, 2,47,
+ 7, 2,44, 7, 2,45, 5,44,80, 5,44,74, 5,44,77, 7,13,36, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2,38,15,46,55,15,46,56,
+ 15,46,57,15,46,59,15,46,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2,36,
+ 7, 2,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2,46, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,44,75, 0, 0, 0, 7, 2,40, 4,41,49, 5,52,19, 4,48, 3,
+ 7,13,42, 4,48, 4, 5,52,21, 7,13,34, 5,52,24, 5,52,20, 5,52,17, 7,13,39,
+ 7,13,35, 5,59,25, 5,52,18, 0, 0, 0,15,52,26,15,52,27,15,52,28, 0, 0, 0,
+ 7,13,37, 0, 0, 0, 0, 0, 0, 7,13,41, 7,13,40, 7,13,43, 0, 0, 0, 0, 0, 0,
+ 7,13,38, 0, 0, 0, 7,13,45, 5,52,23, 4,54, 9, 5,59,27, 5,65,53, 7,23,64,
+ 5,59,31, 7,23,70, 0, 0, 0, 5,59,26, 7,23,66, 7,23,68, 7,23,65, 5,59,29,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,23,63, 7,23,69,15,57,89,15,57,90,
+ 15,57,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,54,10, 0, 0, 0, 0, 0, 0,
+ 7,23,67, 0, 0, 0, 7,23,71, 0, 0, 0, 0, 0, 0, 7,25, 7, 0, 0, 0, 0, 0, 0,
+ 5,59,32, 0, 0, 0, 7,38,58, 0, 0, 0, 0, 0, 0, 5,65,52, 7,31,39, 4,58,94,
+ 5,65,49, 5,65,50, 7,31,41,15,62,57, 5,65,51, 7,31,38,15,62,56, 0, 0, 0,
+ 7,31,37, 7,31,40, 0, 0, 0, 0, 0, 0, 5,65,54, 5,65,55, 0, 0, 0, 0, 0, 0,
+ 7,38,60, 4,63,59, 7,38,62, 5,71,69, 4,63,57, 7,38,61, 7,38,63, 7,38,64,
+ 0, 0, 0, 0, 0, 0,15,66,16,15,66,17,15,66,18, 0, 0, 0, 7,38,65, 7,38,66,
+ 0, 0, 0, 7,38,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,67,24, 7,45,53,
+ 4,67,23, 5,75,94, 7,45,55, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,69, 9, 7,45,54,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,59,30, 5,79,88, 5,79,90, 5,79,89, 0, 0, 0,
+ 0, 0, 0, 7,51,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,51,17, 5,83,27,
+ 4,72,73, 4,72,74, 7,55,71, 7,55,73, 7,55,72, 0, 0, 0, 0, 0, 0, 7,55,74,
+ 0, 0, 0, 5,83,28, 0, 0, 0, 0, 0, 0, 7,62,62, 4,75,74, 4,75,73, 0, 0, 0,
+ 7,62,64, 0, 0, 0, 0, 0, 0, 5,87,56, 7,62,63, 5,89, 7, 0, 0, 0,15,76, 6,
+ 5,90, 8, 5,90,70, 5,91,28, 7,67,47, 0, 0, 0, 5,92,20, 0, 0, 0, 6, 1,77,
+ 4, 1, 5, 4, 2,66, 5, 2,52, 6, 4,59, 6, 4,60, 5, 2,53, 6, 3,94, 4, 3,94,
+ 5, 3,91, 6,10,93,15, 6,74,15, 6,73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,16,53,
+ 6,16,52, 6,16,54, 0, 0, 0, 6,16,51, 0, 0, 0, 6,23, 6, 5,18,11, 4,17,33,
+ /* plane 2, page 32 */
+ 0, 254, /* first, last */
+ 6,31,13, 5,23,86, 6,60,40, 7, 2,50, 5,52,25,15,46,61,15,52,29, 7,23,72,
+ 7,31,42, 7,38,67, 5,71,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,62,65, 0, 0, 0,
+ 7,69,21, 6, 1,79, 6, 1,81, 6, 1,80,15, 1,27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 1,72, 5, 1,71, 0, 0, 0, 0, 0, 0, 5, 3,92, 6, 7,23, 0, 0, 0,15, 6,75,
+ 6,16,55, 6,23, 8,15,15,20, 6,31,14,15,26,62, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 2,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,38,68,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2,84, 0, 0, 0, 5, 2,54, 6,10,94,
+ 0, 0, 0, 6,16,57, 0, 0, 0, 6,16,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,12,69,
+ 6,31,15, 5,21,63, 5,18,13, 6,31,16, 5,18,12, 6,40,22,15,26,63,15,26,64,
+ 15,26,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2,52, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,31,43, 0, 0, 0, 4, 1,87, 6, 2,85, 6, 2,86, 5, 2,57, 5, 2,56, 4, 2,68,
+ 5, 2,59, 6, 4,65, 6, 4,64, 6, 4,62,15, 2,40, 0, 0, 0, 0, 0, 0,15, 2,42,
+ 0, 0, 0, 0, 0, 0, 5, 2,55, 6, 4,63, 5, 2,58, 6, 7,33, 6, 7,27, 5, 4, 2,
+ 6, 7,24, 5, 3,94, 5, 3,93, 0, 0, 0, 5, 4, 3, 6, 7,32, 5, 4, 4, 6, 7,28,
+ 6, 7,31, 5, 4, 1,15, 4, 4, 6, 7,25, 6, 7,26, 6, 7,29, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 4, 5, 6, 7,30, 5, 5,91, 4, 6,21, 5, 5,89, 5, 5,93, 5, 5,90,
+ 5, 5,92, 5, 6, 1, 6,11, 3, 5, 5,94, 0, 0, 0, 0, 0, 0, 5, 6, 2, 6,11, 2,
+ 15, 6,76, 0, 0, 0, 5, 6, 3, 6,11, 1, 0, 0, 0, 5, 5,87, 0, 0, 0, 5, 5,88,
+ 5, 8,94, 6,16,66, 5, 8,93, 5, 9, 2, 5, 8,92, 5, 9, 3, 6,16,63, 5, 9, 5,
+ 5, 9, 4, 0, 0, 0, 6,16,59, 0, 0, 0, 0, 0, 0, 5, 9, 1, 6,16,58, 6,16,69,
+ 6,16,71,15,10,51,15,10,52,15,10,53, 0, 0, 0, 4, 9, 6, 6,16,65, 0, 0, 0,
+ 0, 0, 0, 6,16,64, 6,16,60, 6,16,61, 6,16,70, 0, 0, 0, 6,16,68, 6,16,62,
+ 0, 0, 0, 5,13,24, 6,23,18, 0, 0, 0, 5,13,23, 6,23,14, 5,13,25, 5,18,14,
+ 6,23,10, 4,12,73, 4,12,74, 6,23,15, 5,13,26, 6,23,13, 6,23,17, 6,23,16,
+ 4,12,71, 6,23,19, 6,23,20,15,15,22,15,15,21, 0, 0, 0, 6,23, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,23,11, 6,31,21, 5,18,21, 4,17,38, 4,17,35,
+ 4,17,36, 5,18,19, 5,18,15, 6,31,26, 5,18,16, 5,18,20, 6,31,28, 5,18,17,
+ 5,18,22, 6,31,22, 6,31,27, 6,31,18, 5,18,18, 6,31,20,15,20,41,15,20,42,
+ 15,20,43,15,20,44, 0, 0, 0, 6,31,25, 6,31,17, 0, 0, 0, 0, 0, 0, 6,31,29,
+ 6,31,23, 0, 0, 0, 6,31,19, 6,40,25, 4,23,30, 6,40,30, 5,23,89, 5,23,90,
+ 4,23,24, 5,23,88, 6,40,26, 4,23,23, 5,24, 1, 5,24, 2, 6,31,24, 6,40,32,
+ 6,40,29, 6,40,27, 5,23,93, 6,40,24, 0, 0, 0,15,26,66,15,26,67,
+ /* plane 2, page 33 */
+ 1, 255, /* first, last */
+ 6,40,31, 0, 0, 0, 0, 0, 0, 5,23,91, 5,23,87, 6,40,33, 5,23,94,
+ 15,32,11, 0, 0, 0, 5,30,88, 4,29, 2, 5,37,50, 4,29, 5, 5,30,85, 5,30,84,
+ 4,29, 4, 0, 0, 0, 0, 0, 0, 5,30,87, 5,30,90, 6,50,30, 6,50,27, 6,50,29,
+ 6,60,43, 0, 0, 0, 5,30,91, 6,50,28, 5,30,86, 0, 0, 0, 5,30,89, 6,60,44,
+ 6,60,45, 5,37,56, 4,35,20, 5,37,47, 5,37,53, 6,60,42, 5,37,52, 5,37,55,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,39,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,37,57, 5,37,48, 5,37,54, 5,37,49, 7, 2,55, 7, 2,57, 5,44,84, 5,44,83,
+ 5,44,85, 4,41,55, 5,44,86, 0, 0, 0, 5,44,88, 4,41,54, 7, 2,54, 7, 2,53,
+ 0, 0, 0, 0, 0, 0, 7, 2,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,44,87, 5,44,89, 5,44,82, 0, 0, 0, 7,13,48, 5,52,30, 7,13,50,
+ 7,13,56, 5,52,29, 4,48, 8, 7,13,55, 7,13,54, 5,52,27, 7,13,49, 5,52,28,
+ 0, 0, 0, 7,13,52, 5,52,31, 7,13,47, 0, 0, 0, 0, 0, 0, 4,48,10, 5,59,33,
+ 5,59,34, 4,54,12, 7,23,75,15,57,92, 0, 0, 0, 0, 0, 0, 7,23,73, 0, 0, 0,
+ 7,23,74, 5,65,58, 5,65,57, 5,65,56, 0, 0, 0, 7,38,70, 4,63,61, 5,71,71,
+ 4,63,60, 7,38,69, 7,38,71, 0, 0, 0, 0, 0, 0, 5,71,72,15,66,19, 0, 0, 0,
+ 7,45,56, 5,76, 1, 0, 0, 0, 7,51,19, 7,55,76, 5,79,91, 5,83,29, 7,55,75,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,62,66, 7,62,67, 5,87,57, 0, 0, 0, 7,67,48,
+ 7,67,85, 4, 1,88, 6, 7,34, 5, 4, 6, 0, 0, 0, 4, 4, 6, 6,11, 4,15, 6,77,
+ 15, 6,78, 6,16,73, 6,16,72,15,10,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,23,21, 5,18,23, 6,40,34, 5,24, 3, 0, 0, 0, 0, 0, 0, 6,50,31,
+ 0, 0, 0, 0, 0, 0, 5,37,58, 0, 0, 0,15,39,68, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,45,57, 0, 0, 0,15,74,46, 6, 1,82,
+ 0, 0, 0, 6, 1,83, 6, 2,88, 5, 1,73, 6, 2,87,15, 1,66, 4, 2,71, 4, 4, 7,
+ 5, 4, 7,15, 4, 6, 0, 0, 0, 6, 9,62, 6,11, 5, 5, 6, 4, 5, 6, 5, 6,16,74,
+ 6,16,33, 4,15, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,23,22, 4,17,42,
+ 0, 0, 0, 0, 0, 0, 6,40,35, 5,30,92, 5,37,59, 7, 2,59,15,39,69, 6,60,46,
+ 15,46,63, 7, 2,60, 7, 2,61, 0, 0, 0, 4,54, 6, 0, 0, 0, 7,55,77, 4, 2,72,
+ 5, 2,62, 6, 4,68, 5, 2,61, 6, 4,67, 6, 4,66, 6, 4,70, 4, 2,73, 0, 0, 0,
+ 6, 4,69, 0, 0, 0, 0, 0, 0, 6, 7,37, 5, 4,10, 5, 4,12, 5, 4,11, 5, 4, 8,
+ 5, 4, 9, 6, 7,36, 6, 7,40, 6,11, 8, 0, 0, 0, 6, 7,35, 0, 0, 0, 6, 7,38,
+ 5, 4,13, 0, 0, 0, 5, 6,12, 5, 6, 8, 5, 6, 7, 5, 6,11, 5, 6,10, 4, 6,25,
+ 6,11, 6, 6,11, 9, 6,11, 7, 4, 6,30, 6,11,10,15, 6,80,15, 6,81,15, 6,82,
+ /* plane 2, page 34 */
+ 0, 255, /* first, last */
+ 15, 6,83,15, 6,84, 5, 6, 9, 0, 0, 0, 5, 6,13, 6,11,11, 0, 0, 0, 5, 9, 8,
+ 5, 9,10, 4, 9, 7, 6,16,76, 5, 9, 9, 6,16,77,15,10,55,15,10,57,15,10,56,
+ 15,10,58,15,10,59,15,10,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,16,75,
+ 0, 0, 0, 5,13,29, 5,13,32, 5,13,30, 5,13,33, 5,13,27, 6,23,26, 6,23,27,
+ 4,12,78, 5,13,34, 5,13,31, 6,23,28, 5,13,28, 6,23,25, 0, 0, 0, 0, 0, 0,
+ 15,15,23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,23,23, 6,23,24, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,12,91, 5,18,36, 5,18,27, 5,18,25, 4,17,45, 6,31,35,
+ 5,18,34, 6,31,40, 6,31,30, 5,18,29, 5,18,28, 5,18,31, 5,18,30, 6,31,31,
+ 6,31,32, 5,18,33, 5,18,24, 4,17,48, 6,31,36, 5,18,35, 5,24, 8, 0, 0, 0,
+ 6,31,33, 0, 0, 0,15,20,45,15,20,46,15,20,47,15,20,48,15,20,49,15,20,50,
+ 15,20,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,31,39, 6,38,29, 0, 0, 0,
+ 5,18,26, 6,31,34, 5,18,32, 6,40,42, 4,17,43, 5,24,11, 5,24,12, 5,24,13,
+ 6,40,43, 6,40,46, 5,24, 7, 6,40,45, 4,23,34, 5,24,10, 5,24, 6, 6,40,41,
+ 4,23,35, 5,24, 5, 6,50,36, 6,40,38, 6,40,39, 5,24, 4,15,26,69,15,26,71,
+ 15,26,72,15,26,73,15,26,74, 0, 0, 0, 6,40,40, 0, 0, 0, 6,40,44, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,26,70, 0, 0, 0, 0, 0, 0, 4,29,11,
+ 5,31, 5, 4,29,12, 6,50,33, 6,50,34, 5,31, 2, 5,31, 3, 6,50,39, 5,30,93,
+ 0, 0, 0, 6,50,37,15,33,26,15,33,27,15,33,28, 0, 0, 0, 6,50,35, 0, 0, 0,
+ 6,50,40, 0, 0, 0, 5,31, 4, 5,30,94, 6,50,38, 4,35,24, 5,37,60, 4,35,23,
+ 5,37,62, 6,60,48, 0, 0, 0, 5,37,64, 5,37,63, 6,60,47,15,39,71,15,39,72,
+ 15,39,73,15,39,74,15,39,75,15,39,76,15,39,77,15,39,78,15,39,79, 0, 0, 0,
+ 6,60,49, 0, 0, 0, 6,64,17, 0, 0, 0,15,42,52, 7, 2,62, 4,41,58, 4,23,31,
+ 4,41,56, 5,44,90, 4,41,57, 7,13,57, 7, 2,66, 5,44,92, 5,44,94,15,46,64,
+ 15,46,66,15,46,67, 7, 2,63, 7, 2,65, 7, 2,67, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 2,64, 5,44,91, 5,52,33, 5,44,93, 5,52,35, 5,52,32, 4,48,13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,52,36,15,52,31,15,52,32,15,52,33,
+ 15,52,34, 7,23,78, 5,59,36, 7,23,76, 7,23,77,15,57,94,15,58, 1,15,58, 2,
+ 15,58, 3, 0, 0, 0, 5,59,35, 0, 0, 0, 7,23,79, 5,59,37, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,31,49, 7,31,46, 5,65,59,15,62,58,15,62,60, 7,31,45, 7,31,47,
+ 0, 0, 0, 0, 0, 0, 7,31,44,15,62,59, 0, 0, 0, 7,31,48, 0, 0, 0, 7,38,72,
+ 7,38,73, 5,65,60, 5,71,73, 0, 0, 0, 0, 0, 0,15,66,20,15,66,21,15,66,22,
+ 5,71,74, 0, 0, 0, 0, 0, 0, 5,76, 4, 5,76, 3, 7,45,61, 7,45,59, 5,76, 2,
+ /* plane 2, page 35 */
+ 0, 254, /* first, last */
+ 7,45,58, 0, 0, 0, 7,45,60, 7,45,62, 4,70,28, 0, 0, 0, 7,51,20, 7,51,65,
+ 5,83,30, 7,55,78, 0, 0, 0, 7,55,79, 0, 0, 0, 5,85,74, 0, 0, 0,15,74,47,
+ 0, 0, 0, 7,59,45, 7,62,68, 7,66,22, 5,90,72, 5,90,71,15,76,91,15, 1,67,
+ 15, 2,43,15, 2,44, 0, 0, 0, 6,11,12,15, 4, 7, 6,11,13, 6,11,14, 0, 0, 0,
+ 15,15,25, 0, 0, 0,15,15,27,15,15,28, 0, 0, 0,15,15,26, 5,18,37,15,20,52,
+ 6,40,47,15,26,75,15,26,76, 5,31, 6, 6, 1,31, 6, 1,85, 0, 0, 0, 6, 2,89,
+ 0, 0, 0, 6, 7,41, 0, 0, 0, 4, 4,10, 6,16,80, 6, 7,45,15, 4, 8, 0, 0, 0,
+ 6, 7,43, 0, 0, 0, 6, 7,46, 4, 6,31, 6,11,16, 5, 6,14, 6,11,17, 3,10,25,
+ 0, 0, 0, 4, 7,33, 6,21, 3, 6,16,82, 6,16,83, 6,16,81, 6,16,79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,16,78, 0, 0, 0, 0, 0, 0, 6,23,31, 6,23,30, 4,12,79,
+ 6,23,29, 0, 0, 0, 6,23,32, 0, 0, 0, 6,31,41, 6,31,42, 6,31,43, 6,31,44,
+ 6,31,45, 6,31,46, 4,23,36, 6,40,48, 6,40,52, 6,40,51, 6,40,49,15,26,77,
+ 6,40,50, 0, 0, 0, 6,50,41, 5,31, 7,15,33,29, 0, 0, 0, 6,60,51, 6,60,52,
+ 6,60,50, 0, 0, 0, 0, 0, 0, 5,37,65, 7, 2,68, 0, 0, 0, 7,13,58, 7,13,60,
+ 4,48,15, 5,52,37, 7,23,81, 7,23,80, 0, 0, 0, 0, 0, 0, 7,55,80, 7,67,49,
+ 7,67,50, 7,69,22, 6, 1,32, 6, 1,86, 0, 0, 0, 0, 0, 0,15, 2,45, 4, 4,11,
+ 6, 7,48, 6, 7,47, 0, 0, 0, 5, 4,14, 6,11,18, 0, 0, 0, 6,16,86, 6,16,85,
+ 0, 0, 0, 0, 0, 0, 6,16,87, 0, 0, 0, 5,14,72, 6,31,47, 5,24,14, 0, 0, 0,
+ 6,50,42, 6,60,53, 7, 2,69, 7,13,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 1,10, 5, 1,39, 6, 1,88, 0, 0, 0, 6, 1,92, 6, 1,87, 0, 0, 0, 6, 1,90,
+ 6, 1,91, 0, 0, 0, 6, 3, 1, 6, 3, 2, 6, 2,92, 6, 2,90, 6, 3, 3, 6, 2,91,
+ 6, 2,93, 6, 2,94, 5, 1,74, 5, 2,64, 0, 0, 0, 5, 2,63, 0, 0, 0, 0, 0, 0,
+ 6, 4,72, 6, 4,73, 6, 4,74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4,75, 5, 4,15,
+ 6, 7,49, 5, 4,17, 6, 7,51, 5, 4,16,15, 4, 9, 0, 0, 0,15, 4,10,15, 4,11,
+ 15, 4,12, 6, 7,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4,18, 5, 6,15, 6,11,22,
+ 6,11,19, 6,11,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,11,23, 6,11,21, 6,16,94, 5, 9,12, 6,16,93, 4, 9,16,
+ 6,16,89, 5, 9,11, 6,16,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,13,36, 0, 0, 0, 5,13,35, 5,13,37,
+ 6,23,35, 6,23,33, 5,13,38,15,15,29, 6,23,34, 0, 0, 0, 5,18,42, 5,18,40,
+ 5,18,41, 6,31,54, 6,31,48, 4, 9,15, 6,40,53, 6,31,50, 6,31,51, 5,18,39,
+ 6,31,49,15,20,53,15,20,54,15,20,55, 6,31,52, 6,31,55, 6,31,53,
+ /* plane 2, page 36 */
+ 0, 254, /* first, last */
+ 6,40,54, 6,40,57, 5,24,15, 5,24,18, 5,24,17, 6,40,58, 5,24,16, 6,40,56,
+ 6,40,55, 0, 0, 0, 5,31, 8, 4,29,17, 6,50,43,15,33,32, 0, 0, 0, 6,50,44,
+ 0, 0, 0, 0, 0, 0, 5,37,66, 6,60,54, 5,37,67, 6,60,55, 6,60,57, 0, 0, 0,
+ 15,39,80, 6,60,58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,60,56, 5,45, 1, 5,45, 2,
+ 4,41,64, 7, 2,70,15,46,68,15,46,69, 7, 2,71, 7,13,63, 5,52,38, 4,48,16,
+ 7,13,64, 7,13,62, 0, 0, 0, 0, 0, 0, 7,23,83, 7,23,82, 0, 0, 0, 7,23,84,
+ 15,58, 4, 0, 0, 0, 4,59, 2, 5,65,62, 7,31,50,15,62,61, 0, 0, 0, 5,65,61,
+ 7,38,77, 7,38,75, 7,38,79, 7,38,74, 7,38,76, 0, 0, 0, 5,71,75, 5,76, 5,
+ 7,45,63, 4,63,63, 7,45,65, 7,45,64, 5,76, 6, 0, 0, 0, 5,79,92, 5,79,93,
+ 4,70,29, 7,51,21, 5,83,31, 7,64,28, 7,64,79, 7,68,38, 0, 0, 0, 0, 0, 0,
+ 6, 4,78, 6, 4,76, 6, 4,77, 5, 4,19, 6,17, 1, 6,11,24, 6,13,18, 6,17, 4,
+ 6,23,36, 6,17, 2, 6,17, 3, 6,23,38, 6,23,37, 0, 0, 0, 6,31,56, 0, 0, 0,
+ 0, 0, 0, 6,47, 1, 5,24,19, 6,40,60, 6,40,59, 0, 0, 0, 5,31,10, 0, 0, 0,
+ 6,60,60, 6,60,63, 6,60,61, 6,60,59, 0, 0, 0, 6,60,62, 0, 0, 0, 7,13,65,
+ 7,13,46, 4,48,18, 7,23,85, 7,31,53, 0, 0, 0, 7,31,52, 7,31,51, 7,38,82,
+ 7,38,80, 7,38,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,55,81, 7,59,46, 7,66,23,
+ 6, 3, 5, 6, 3, 4,15, 1,68, 6, 4,81, 6, 4,79, 0, 0, 0, 0, 0, 0,15, 4,13,
+ 6, 7,52, 5, 6,16, 6,11,27, 0, 0, 0, 6,11,26, 0, 0, 0, 0, 0, 0, 6,23,39,
+ 4,12,84, 4,12,83, 0, 0, 0, 0, 0, 0, 5,21,64, 6,31,61, 6,31,57, 6,31,58,
+ 15,20,56,15,20,57,15,20,58, 6,31,60, 6,31,59, 5,18,43, 6,40,61, 6,40,64,
+ 6,40,62, 6,40,63,15,26,78, 0, 0, 0, 6,50,49, 6,50,46, 6,50,48, 6,50,47,
+ 15,33,33, 4,35,28, 6,60,64, 7, 2,75, 7, 2,76, 7, 2,73, 7, 2,74, 5,45, 3,
+ 4,48,19, 0, 0, 0, 5,52,39, 7,13,68, 7,23,86, 7,31,54,15,71,52, 7,45,66,
+ 7,51,22, 5,83,33, 0, 0, 0,15,76, 7, 0, 0, 0, 6, 1,93, 5, 1,75, 4, 1,89,
+ 5, 2,65, 0, 0, 0, 4, 2,78, 5, 2,66, 5, 4,20, 6, 7,56, 5, 4,21, 6, 7,55,
+ 6, 7,57, 6, 7,59, 6, 7,54, 5, 4,22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7,53,
+ 6, 7,58, 0, 0, 0, 5, 6,19, 6,11,29, 5, 6,17, 6,11,28, 5, 6,18, 5, 9,13,
+ 6,11,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 9,19, 6,17, 6, 5, 9,16, 5, 9,14,
+ 6,17, 8, 0, 0, 0, 5, 9,18, 5, 9,17, 0, 0, 0,15,10,62, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,17, 7, 6,23,45, 4,12,89, 4,12,87, 4,12,92, 4,12,85, 5,13,43,
+ 5,13,41, 4,12,88, 4,12,90, 4,12,86, 4,12,91, 5,13,42, 6,23,41, 6,23,47,
+ 6,23,44,15,15,31,15,15,32, 0, 0, 0, 6,23,43, 6,23,48, 6,23,46,
+ /* plane 2, page 37 */
+ 0, 255, /* first, last */
+ 6,23,42, 4,17,54, 5,18,47, 6,31,72, 6,31,65, 0, 0, 0, 5,18,44, 5,18,49,
+ 5,18,46, 6,31,64, 5,18,48, 4,17,56, 6,31,71, 6,31,69, 6,31,66, 4,17,57,
+ 6,31,70, 5,18,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,31,68, 0, 0, 0, 6,31,63, 0, 0, 0, 6,31,67, 6,40,68,15,20,60, 4,23,38,
+ 5,24,22, 5,24,21, 5,24,27, 5,24,26, 5,24,23, 4,23,39, 6,40,65, 5,24,20,
+ 6,40,67, 5,24,24, 4,17,53,15,26,80, 0, 0, 0, 6,40,66, 0, 0, 0, 0, 0, 0,
+ 15,26,79, 5,24,25, 0, 0, 0, 5,31,12, 5,31,11, 6,50,50, 6,50,52, 6,50,55,
+ 6,50,51, 0, 0, 0, 0, 0, 0,15,33,34,15,33,35,15,33,36,15,33,37,15,33,38,
+ 15,33,39, 0, 0, 0, 0, 0, 0, 6,50,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,50,54,
+ 6,54,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,31,13, 4,29,18, 6,60,70,
+ 6,60,67, 5,37,70, 6,60,66, 4,35,30, 5,37,69, 4,35,33, 4,35,32, 6,60,65,
+ 5,37,72, 5,37,74, 5,37,68, 6,60,72, 6,60,73, 6,60,74, 5,37,71, 6,60,68,
+ 15,39,81,15,39,82,15,39,83,15,39,84,15,39,85, 0, 0, 0, 0, 0, 0, 6,60,69,
+ 0, 0, 0, 0, 0, 0, 4,41,68, 5,45, 4, 5,59,40, 4,41,67, 4,41,66, 5,45, 5,
+ 7, 2,77, 7, 2,79, 0, 0, 0,15,46,70,15,46,71, 0, 0, 0, 7, 2,78, 7, 2,80,
+ 0, 0, 0, 7,13,69, 5,52,40, 5,52,42, 7,13,71, 0, 0, 0, 7,13,70, 0, 0, 0,
+ 0, 0, 0,15,52,36,15,52,37, 7,13,72, 5,52,41, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,59,39, 7,23,87, 4,54,16, 0, 0, 0, 0, 0, 0,15,60,63, 5,59,38, 5,65,64,
+ 7,31,55, 5,65,63, 7,31,56,15,62,62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,65,65,
+ 7,38,83, 7,38,85, 7,38,86, 7,45, 2, 7,38,84, 5,76, 7, 4,67,30, 4,67,29,
+ 15,69,10, 0, 0, 0, 7,45,67, 7,51,23, 5,79,94, 7,55,82, 4,74,39, 5,89, 8,
+ 0, 0, 0, 5, 1,17, 6, 2, 1, 4, 2,79, 5, 1,76, 6, 3, 6, 0, 0, 0, 0, 0, 0,
+ 15, 2,47, 0, 0, 0, 6, 4,85, 5, 2,67, 6, 7,64, 5, 2,73, 6, 7,61, 5, 2,68,
+ 6, 4,83, 6, 4,84, 5, 2,69, 6, 7,60, 0, 0, 0, 6, 7,62, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 7,65, 0, 0, 0, 6, 4,82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2,72,
+ 5, 4,23, 5, 4,25, 4, 6,37, 6, 7,70, 6, 7,68, 6,11,38, 6, 7,71, 0, 0, 0,
+ 6,11,32, 6, 7,66, 6, 7,67, 6,11,36, 6, 7,69, 6, 7,72, 0, 0, 0, 3, 5,94,
+ 6, 7,73, 0, 0, 0, 0, 0, 0, 5, 4,26,15, 4,14,15, 4,15,15, 4,17,15, 4,18,
+ 15, 4,20,15, 4,21,15, 4,22,15, 6,87,15, 6,88,15, 6,89,15, 6,90,15, 6,91,
+ 15, 6,93,15, 6,94,15, 7, 1,15, 6,92, 6,11,37, 0, 0, 0, 6,11,33, 0, 0, 0,
+ 0, 0, 0, 6,11,34, 4, 4,13, 0, 0, 0, 0, 0, 0,15, 4,16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4, 6,36, 5, 6,20, 6,11,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6,39,
+ /* plane 2, page 38 */
+ 0, 255, /* first, last */
+ 6,11,44, 4, 9,39, 6,17,15, 4, 6,43, 6,11,45, 6,17, 9, 5, 6,21, 6,17,12,
+ 6,11,47, 4, 6,42, 5, 6,23, 4, 9,24, 5, 6,22, 4, 9,35, 6,11,41, 5, 6,24,
+ 4, 6,49, 4, 9,36, 6,17,10, 6,17,11, 6,11,48, 6,11,39, 6,17,13, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15, 6,85, 0, 0, 0, 0, 0, 0,15, 7, 2,15,10,80, 0, 0, 0,
+ 4, 9,38, 0, 0, 0, 0, 0, 0, 6,17,14, 0, 0, 0, 0, 0, 0, 6,11,40, 6,11,42,
+ 6,11,46, 0, 0, 0, 6,11,43,15,10,68, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,10,63,
+ 15,10,66,15,10,69,15,10,72,15,10,76, 6,23,59, 6,23,57, 6,17,18, 4, 9,41,
+ 5, 9,23, 0, 0, 0, 4, 9,34, 4,13, 9, 5,13,46, 5, 9,22, 6,17,25, 6,23,55,
+ 6,17,19, 4,12,93, 5,13,44, 6,17,21, 6,23,51, 4,13, 1, 6,17,24, 5, 9,20,
+ 4,12,94, 6,17,26, 6,17,17, 6,17,23, 6,23,54, 6,23,53, 4,13,10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,17,20,15,10,65,
+ 15,10,70,15,10,73,15,10,75,15,10,77,15,10,78,15,10,79,15,15,38,15,15,39,
+ 15,15,40,15,15,42, 6,23,50,15,15,36, 0, 0, 0, 0, 0, 0, 6,23,56, 0, 0, 0,
+ 15,10,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,13,45, 0, 0, 0,
+ 6,23,49, 5,13,50, 5,13,56, 5,13,59, 6,31,77, 6,23,67, 6,31,79, 6,31,75,
+ 6,31,80, 6,23,68, 5,13,53, 6,31,73, 4,13,14, 6,31,83, 5,13,54, 4,13, 6,
+ 5,18,61, 5,13,49, 5,13,60, 6,23,66, 6,23,61, 5,18,52, 6,23,63, 6,23,65,
+ 6,31,76, 6,23,64, 6,31,81, 4,13, 7, 5,13,48, 6,23,60, 5,18,51, 6,31,82,
+ 6,31,84, 5,18,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,13,47,
+ 0, 0, 0,15,15,33,15,15,34,15,15,35,15,15,41,15,15,43,15,20,61,15,20,63,
+ 15,20,64,15,20,68,15,20,69,15,20,70,15,20,71,15,20,72, 6,31,74, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,23,69,
+ 6,23,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,13,52, 5,13,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,23,58, 6,40,81, 4,23,45, 5,18,57, 6,31,92, 4,23,43, 6,40,83,
+ 6,40,73, 5,24,53, 6,31,94, 6,40,82, 6,32, 2, 4,17,69, 5,13,51, 4,17,77,
+ 6,31,87, 6,40,78, 4,17,65, 5,24,31, 5,18,55, 5,18,58, 4,23,44, 6,31,89,
+ 5,18,60, 6,31,86, 6,31,78, 4,17,73, 5,24,28, 6,40,80, 5,18,62, 4,17,63,
+ 6,31,93, 6,31,91, 6,31,90, 6,40,70, 6,40,76, 5,24,30, 5,24,33, 6,40,84,
+ 5,18,53, 6,40,75, 6,40,86, 6,40,71, 6,40,69, 6,31,85, 5,24,32, 0, 0, 0,
+ 15,20,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,20,62,
+ 15,20,66,15,20,67,15,20,73,15,20,74,15,20,75,15,20,76,15,20,77,15,20,79,
+ /* plane 2, page 39 */
+ 0, 255, /* first, last */
+ 15,20,80,15,20,82,15,26,82,15,26,83,15,26,84,15,26,85,15,26,86,15,26,87,
+ 15,26,89,15,26,90,15,26,92,15,26,93,15,26,94,15,27, 1,15,27, 2,15,27, 5,
+ 15,27, 9,15,27,10,15,27,12,15,27,14, 0, 0, 0, 0, 0, 0, 6,40,72, 5,18,54,
+ 0, 0, 0, 0, 0, 0, 6,31,88,15,27, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,20,78,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,41, 4, 6,40,77, 6,32, 1, 0, 0, 0,15,27, 4,
+ 4,29,31, 5,24,42, 5,24,45, 5,24,50, 4,23,47, 4,23,55, 4,23,49, 6,50,61,
+ 6,41, 3, 5,24,48, 6,41, 2, 4,23,51, 5,24,54, 5,24,56, 5,24,35, 6,50,65,
+ 5,24,58, 5,31,19, 4,23,59, 5,24,51, 6,41, 1, 5,24,38, 6,40,91, 5,31,20,
+ 5,24,36, 5,24,52, 5,18,63, 6,50,56, 5,24,39, 4,29,22, 4,23,56, 5,24,57,
+ 5,24,49, 5,24,43, 5,31,17, 6,40,87, 5,24,47, 5,24,29, 6,40,94, 6,50,66,
+ 6,50,67, 6,50,58, 6,40,93, 5,24,55, 6,50,62, 6,50,64, 0, 0, 0, 5,31,15,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,29,32, 4,23,50, 5,24,41,
+ 6,40,89,15,26,81,15,26,91,15,27, 3,15,27, 8,15,27,13,15,33,40,15,33,46,
+ 15,33,48,15,33,49,15,33,50, 0, 0, 0, 0, 0, 0, 6,50,60, 6,50,63, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,50,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,40,90, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,27,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,24,46,
+ 0, 0, 0, 5,31,14, 5,24,44, 0, 0, 0,15,20,81,15,39,93, 5,31,28, 5,31,22,
+ 5,31,21, 6,50,75, 5,45, 6, 5,31,37, 6,60,79, 5,31,25, 5,31,31, 5,31,36,
+ 6,60,84, 6,50,79, 5,37,75, 0, 0, 0, 5,31,27, 6,60,76, 6,50,69, 5,31,24,
+ 5,31,29, 5,31,26, 6,50,57, 4,41,78, 6,60,86, 6,60,89, 5,31,35, 6,50,72,
+ 6,60,82, 4,35,47, 6,60,88, 6,60,87, 5,31,33, 5,37,77, 5,31,30, 6,60,81,
+ 6,60,78, 6,60,77, 5,31,23, 6,50,71, 0, 0, 0, 0, 0, 0, 6,50,77,15,33,42,
+ 15,33,43,15,33,44,15,33,45,15,33,47,15,33,51,15,39,86,15,39,87,15,39,89,
+ 15,39,90,15,40, 5,15,40, 8, 6,60,80, 6,60,85, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,31,32,15,33,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,60,83, 6,50,78, 0, 0, 0, 0, 0, 0,
+ 6,61, 3, 6,61, 7, 4,35,37, 4,35,36, 5,45, 7, 0, 0, 0, 6,60,92, 5,37,87,
+ 5,37,86, 5,37,83, 4,29,21, 6,60,91, 7, 2,82, 0, 0, 0, 7, 2,85, 5,45, 9,
+ 5,37,80, 5,37,79, 5,37,76, 5,37,81, 5,37,82, 5,37,89, 6,61, 5, 6,60,93,
+ 6,60,94, 6,50,74, 6,61, 2, 7, 2,84, 6,61, 1, 7, 2,87, 5,37,84, 5,37,88,
+ /* plane 2, page 40 */
+ 0, 255, /* first, last */
+ 7,13,74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,35,51,15,39,88,15,39,92,15,39,94,15,40, 1,15,40, 3,
+ 15,40, 4,15,40, 6,15,46,73,15,46,74,15,46,75,15,46,76,15,46,77,15,46,78,
+ 15,46,79,15,46,83,15,46,85, 0, 0, 0, 7, 2,83, 0, 0, 0, 7, 2,88, 6,60,75,
+ 5,37,78, 6,60,90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,45, 8, 0, 0, 0, 5,37,85, 0, 0, 0,
+ 0, 0, 0, 7,13,81, 4,41,70, 4,35,50, 7,13,75, 4,41,81, 7,13,77, 5,45,15,
+ 7,13,83, 4,41,74, 5,45,14, 7, 2,89, 5,45,19, 4,41,82, 7,13,85, 5,24,37,
+ 5,45,18, 5,45,21, 4,48,21, 4,48,22, 7, 3, 1, 5,45,20, 7,23,92, 5,45,16,
+ 5,52,46, 4,54,20, 7, 2,90, 7, 3, 2, 0, 0, 0, 0, 0, 0, 5,52,52, 5,45,11,
+ 5,45,13, 5,52,45, 5,45,12, 7,14, 2, 7,13,87, 7,13,86, 7, 2,94, 4,48,28,
+ 7,13,80, 7,13,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,40, 2, 0, 0, 0,
+ 0, 0, 0,15,46,80, 7,13,82, 0, 0, 0, 5,45,17, 7,13,76,15,46,81,15,46,82,
+ 15,46,84,15,46,86,15,52,39,15,52,40,15,52,42,15,52,43,15,52,49,15,52,51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,13,84, 5,52,43, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,16,48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2,93, 7, 5,81, 4,41,80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,52,44, 5,52,47, 0, 0, 0,15,46,72,
+ 0, 0, 0,15,52,47, 5,52,48, 5,52,50, 7,13,91, 7,13,88, 5,52,53, 5,52,54,
+ 5,52,49, 7,13,94, 7,13,92, 7,13,93, 5,52,55, 4,48,29, 5,59,41, 7,14, 1,
+ 7,23,91, 7,23,93, 7,23,90, 7,24, 1, 5,59,43, 7,13,90, 7,23,89, 7,13,78,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,52,45, 0, 0, 0,
+ 5,52,51, 7,24, 2,15,52,41,15,52,46,15,52,50,15,58, 5,15,58, 6,15,58,14,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,58, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,59,42, 5,52,56,15,58,10,15,52,44, 7,23,88, 5,59,49, 4,54,21,
+ 4,54,17, 4,59,10, 5,59,46, 5,65,68, 5,65,66, 7,31,59, 7,24, 6, 0, 0, 0,
+ 4,59, 6, 5,59,45, 5,59,47, 7,24, 3, 7,24, 5, 5,59,48, 5,65,67, 7,31,58,
+ 5,65,69, 7,31,57, 7, 2,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,58,11,15,58,13,15,62,63,15,62,64,15,62,66,15,62,67,15,62,69,15,62,70,
+ 15,62,71, 0, 0, 0, 7,31,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,24, 4,15,58, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,59, 7, 5,59,50, 7,38,89, 7,31,61, 5,65,72,
+ /* plane 2, page 41 */
+ 0, 255, /* first, last */
+ 7,45,68, 4,63,67, 4,63,66, 7,38,92, 5,65,73, 7,45,71, 4,59, 8, 5,65,74,
+ 7,39, 5, 7,39, 1, 7,38,88, 5,65,71, 7,38,94, 0, 0, 0, 5,71,77, 7,38,90,
+ 5,71,80, 7,38,87, 7,39, 2, 7,31,62, 0, 0, 0, 7,38,93, 5,71,78,15,62,68,
+ 5,71,79, 7,38,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,71,76,15,66,25, 7,39,10, 4,67,36,
+ 7,39, 7, 5,71,84, 7,39, 4, 5,76,10, 7,39, 9, 7,39, 6, 7,31,63, 5,71,85,
+ 4,67,31, 5,71,81, 5,76, 8, 7,39,11, 7,39, 3, 7,45,69, 5,71,87, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,66,26,15,66,24,15,66,27,15,66,28,15,66,29, 0, 0, 0,
+ 0, 0, 0, 7,45,70, 0, 0, 0, 5,65,70, 5,71,82, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,69,11, 5,71,86, 5,76, 9, 7,51,25, 7,45,74, 4,67,33,
+ 7,45,73, 4,67,37, 7,51,24, 7,45,75,15,71,53, 0, 0, 0, 0, 0, 0, 7,59,47,
+ 4,70,30, 0, 0, 0, 5,76,11, 7,55,83, 7,55,84, 7,55,85, 7,51,27, 7,51,26,
+ 0, 0, 0, 7,51,28, 0, 0, 0, 0, 0, 0,15,73,34, 7,55,86, 7,59,48, 7,59,50,
+ 7,59,51, 7,59,49, 0, 0, 0,15,74,48,15,73,33,15,74,49,15,74,50, 7,59,53,
+ 5,87,58, 7,59,52, 7,62,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,74,51,15,75,39,15,75,40, 5,87,59, 7,62,70, 5,89, 9, 7,62,71,15,76, 8,
+ 0, 0, 0,15,76, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,77,82,15,76,92,15,76,93,
+ 5,91,30, 5,91,64, 0, 0, 0,15,77,20, 0, 0, 0, 0, 0, 0, 5, 2,74, 4, 2,82,
+ 6, 4,86, 0, 0, 0, 0, 0, 0, 6, 7,75, 5, 4,27, 6, 7,74, 6, 7,77, 0, 0, 0,
+ 0, 0, 0, 6, 7,76, 4, 6,50, 6,11,49, 6,11,56, 6,11,52, 6,11,54, 4, 6,51,
+ 6,11,53, 6,11,51, 6,11,55,15, 7, 4,15, 7, 3, 0, 0, 0, 6,17,29, 6,17,27,
+ 6,17,30, 6,17,32, 4, 9,44, 6,17,33, 6,17,31, 0, 0, 0,15,10,81,15,10,82,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,17,28, 6,23,71,
+ 5,13,63, 6,23,73, 5,13,62, 6,23,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,18,65,
+ 4,17,79, 6,32, 5,15,20,83,15,20,84, 0, 0, 0, 0, 0, 0, 6,32, 4, 5,18,64,
+ 6,41, 8, 6,41, 7, 6,41, 5, 6,41, 6, 4,23,60, 6,41, 9,15,27,15, 0, 0, 0,
+ 0, 0, 0, 5,24,59, 5,24,60,15,20,86, 4,29,36, 6,50,81, 5,31,39, 0, 0, 0,
+ 5,31,41, 0, 0, 0, 0, 0, 0,15,33,53, 4,29,33, 0, 0, 0, 0, 0, 0, 6,50,80,
+ 5,31,40, 0, 0, 0, 6,61, 9, 0, 0, 0, 6,61,10, 5,37,90, 5,37,92, 5,37,91,
+ 7, 3, 4, 5,37,93,15,40, 9,15,40,10, 6,61, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,45,22, 4,41,83, 4,41,84, 7, 3, 8, 7, 3, 7,
+ 7, 3, 5, 6,61,11, 7, 3, 3, 0, 0, 0, 0, 0, 0,15,46,91, 7, 3, 9, 7, 3, 6,
+ /* plane 2, page 42 */
+ 4, 255, /* first, last */
+ 15,46,87,15,46,88,15,46,90, 7, 3,10,
+ 7,14,10, 7,14, 5, 7,14, 4, 7,14, 7, 7,14, 6, 7,14, 9, 7,14, 8, 0, 0, 0,
+ 7,12,67, 7,17,80, 7,14, 3, 7,24, 7, 5,59,51,15,58,15, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,31,64, 7,39,13, 4,63,69, 0, 0, 0, 0, 0, 0, 7,39,14, 5,76,12,
+ 15,69,12, 5,80, 1, 0, 0, 0, 7,51,29, 6, 3, 7, 5, 1,77, 6, 4,87, 0, 0, 0,
+ 0, 0, 0, 6, 4,88, 4, 4,20, 0, 0, 0,15, 4,23,15, 4,24, 0, 0, 0, 5, 6,25,
+ 0, 0, 0, 0, 0, 0, 6,11,57, 0, 0, 0, 6,11,58, 0, 0, 0, 0, 0, 0, 6,17,35,
+ 6,17,34, 6,17,36, 5, 9,25,15,10,83,15,10,84,15,10,85, 6,17,38, 0, 0, 0,
+ 0, 0, 0, 6,17,37, 0, 0, 0, 0, 0, 0, 5, 9,24, 6,23,76, 6,23,74, 6,23,75,
+ 5,13,65, 0, 0, 0, 0, 0, 0, 5,13,64, 0, 0, 0, 6,32, 6,15,20,87, 0, 0, 0,
+ 0, 0, 0, 5,24,61, 5,24,63, 5,24,64, 0, 0, 0, 5,24,62, 5,31,42, 0, 0, 0,
+ 5,37,94, 4,35,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3,11, 0, 0, 0, 0, 0, 0,
+ 5,59,52, 0, 0, 0, 5,80, 2, 0, 0, 0, 0, 0, 0, 6, 3, 8, 5, 1,78, 0, 0, 0,
+ 6, 3, 9, 6, 3,10, 0, 0, 0, 5, 1,79, 5, 2,76, 4, 2,86, 6, 4,89, 0, 0, 0,
+ 5, 2,82, 5, 2,80, 5, 2,79, 5, 2,75, 5, 2,77,15, 2,48,15, 2,50, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5, 2,81, 4, 4,23, 6, 7,83, 6, 7,86, 6, 7,85, 4, 6,55,
+ 5, 4,29, 6, 7,79, 4, 4,24, 4, 4,21, 6, 7,87, 5, 4,30, 4, 4,27, 6, 7,82,
+ 6,11,61, 6, 7,81, 6,11,69, 6,11,59, 6, 7,80, 5, 4,28, 6,11,60, 6, 7,84,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 4,27,15, 4,28,15, 4,29,15, 4,30,
+ 15, 4,31,15, 4,32,15, 4,33,15, 4,35,15, 4,36, 0, 0, 0, 0, 0, 0,15, 4,37,
+ 0, 0, 0,15, 4,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,11,62, 6,11,63, 6,11,65, 5, 6,27,
+ 5, 9,26, 0, 0, 0, 6,11,68, 6,17,40, 5, 6,29, 6,17,42, 5, 6,28, 6,17,41,
+ 6,17,39, 0, 0, 0, 6,11,66, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 7, 6,15, 7, 7,
+ 15, 7, 8,15, 7, 9,15, 7,10,15, 7,11,15, 7,12,15, 7,13,15, 7,15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 7, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5, 6,30, 0, 0, 0, 6,17,50, 6,17,52, 4, 9,56, 4, 9,47,
+ 4, 9,48, 6,17,51, 6,23,77, 5, 9,31, 5, 9,34, 5, 9,33, 6,17,45, 5, 9,39,
+ 4,13,20, 4, 9,60, 5, 9,30, 5, 9,29, 5,13,67, 4, 9,51, 6,23,78, 5, 9,40,
+ 4, 9,58, 6,17,48, 5, 9,32, 5, 9,36, 6,17,46, 6,17,54, 6,17,43, 5, 9,35,
+ /* plane 2, page 43 */
+ 0, 255, /* first, last */
+ 5, 9,28, 0, 0, 0, 0, 0, 0, 6,17,53, 0, 0, 0, 0, 0, 0, 6,17,49,15,10,86,
+ 15,10,87,15,10,88,15,10,89,15,10,90,15,10,91,15,10,92,15,10,93,15,10,94,
+ 15,11, 1,15,11, 3,15,11, 4,15,11, 5,15,11, 6,15,11, 7,15,11, 8,15,11, 9,
+ 15,11,10,15,15,51,15,15,60,15,15,65, 0, 0, 0, 0, 0, 0, 6,17,44, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5, 9,27, 5,13,66, 5,13,68, 0, 0, 0, 0, 0, 0, 4,13,29,
+ 6,23,85, 4,13,24, 5,13,77, 5,13,75, 4,13,25, 4, 9,55, 4,13,21, 5,13,74,
+ 6,23,91, 6,23,80, 6,23,93, 6,23,83, 5,13,73, 6,23,82, 6,23,87, 4,13,22,
+ 6,23,88, 5,13,76, 5,13,69, 4,13,23, 5,13,71, 5,13,72, 4,13,26, 6,23,90,
+ 5,13,70, 6,17,55, 6,23,86, 6,32, 7, 6,23,89, 6,23,84, 5, 9,38, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,23,92, 6,23,94,15,15,44,15,15,45,15,15,46,15,15,47,
+ 15,15,48,15,15,49,15,15,50,15,15,53,15,15,54,15,15,55,15,15,58,15,15,59,
+ 15,15,61,15,15,62,15,15,64,15,15,66, 6,32, 8, 0, 0, 0,15,15,56, 0, 0, 0,
+ 6,23,79, 0, 0, 0,15,15,52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,17,82, 4,17,83, 4,23,62, 5,18,73, 0, 0, 0, 6,32,17, 5,13,78,
+ 6,32,23, 5,18,67, 4,17,84, 4,18, 2, 4,17,86, 5,18,66, 4,17,93, 5,24,65,
+ 5,18,68, 6,32,20, 5,18,71, 6,32,21, 6,32,12, 6,32, 9, 4,18, 4, 6,41,15,
+ 6,41,10, 6,32,10, 5,18,69, 0, 0, 0, 6,41,13, 4,23,61, 6,32,15, 6,41,12,
+ 6,41,11, 5,18,72, 6,32,13, 6,41,14, 6,32,19, 0, 0, 0, 0, 0, 0, 6,32,16,
+ 4,17,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,32,14,15,20,88,
+ 15,20,89,15,20,90,15,20,91,15,20,92,15,20,94,15,21, 2,15,21, 3,15,21, 4,
+ 15,21, 5,15,21, 6,15,21, 7,15,21, 8,15,21, 9,15,21,10,15,21,11,15,21,12,
+ 15,21,14,15,21,13,15,21,15,15,21,16,15,27,17, 0, 0, 0,15,20,93, 0, 0, 0,
+ 5,18,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,18, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,27,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,24,75, 6,41,20, 4,23,73, 6,41,27, 6,41,22, 5,24,77, 6,41,33,
+ 5,24,84, 6,41,17, 4,29,49, 4,23,71, 5,24,66, 5,24,74, 4,23,63, 5,24,72,
+ 4,23,67, 5,24,73, 4,23,74, 5,24,70, 4,23,77, 5,24,79, 4,23,70, 6,41,34,
+ /* plane 2, page 44 */
+ 0, 254, /* first, last */
+ 6,41,35, 6,41,26, 5,24,81, 6,41,19, 6,41,38, 6,41,23, 5,24,80, 4,23,76,
+ 6,41,39, 6,41,18, 5,24,76, 5,24,78, 6,41,36, 5,24,68, 6,41,28, 6,41,37,
+ 6,41,32, 6,41,44, 6,41,31, 6,41,45, 6,41,40, 6,41,25, 5,24,82, 6,41,29,
+ 5,24,83, 5,24,71, 6,41,24, 6,41,43, 5,24,69, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,50,83,15,27,16,15,27,18,15,27,20,15,27,21,15,27,22,15,27,23,15,27,24,
+ 15,27,25,15,27,26,15,27,27,15,27,28,15,27,29,15,27,31,15,27,32,15,27,34,
+ 15,27,35,15,27,36,15,27,37,15,27,38,15,27,40,15,27,41,15,27,42, 0, 0, 0,
+ 6,50,84, 0, 0, 0, 6,41,30, 6,41,41, 0, 0, 0, 6,41,21, 0, 0, 0, 5,24,67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,27,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,31,50,
+ 6,50,91, 4,29,43, 4,29,41, 5,31,53, 4,29,38, 6,50,88, 4,29,45, 4,29,51,
+ 4,29,39, 4,29,50, 6,50,94, 5,31,49, 5,38, 1, 0, 0, 0, 5,31,43, 6,61,12,
+ 6,51, 5, 6,50,85, 6,51, 3, 6,51, 2, 5,31,45, 0, 0, 0, 5,31,51, 5,31,46,
+ 6,50,89, 6,51, 1, 5,31,48, 6,51, 4, 6,50,92, 0, 0, 0, 5,31,44, 6,50,90,
+ 5,31,47,15,33,54,15,33,55,15,33,56,15,33,57,15,33,58,15,33,59,15,33,60,
+ 15,33,61,15,33,62,15,33,64,15,33,65,15,33,67,15,33,68,15,33,69,15,33,70,
+ 15,33,71,15,33,73,15,40,16, 0, 0, 0, 0, 0, 0, 6,50,87, 6,50,93, 0, 0, 0,
+ 6,50,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,33,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,31,52, 0, 0, 0, 0, 0, 0, 6,61,22, 5,45,25, 5,38, 7, 5,38,10, 4,35,66,
+ 4,35,63, 6,61,28, 6,61,29, 6,61,14, 4,35,55, 6,61,31, 5,38, 6, 0, 0, 0,
+ 4,35,67, 5,45,24, 5,38, 9, 6,61,21, 4,35,57, 7, 3,15, 4,35,59, 4,35,58,
+ 7, 3,14, 7, 3,17, 0, 0, 0, 5,38, 4, 0, 0, 0, 4,35,69, 6,61,25, 6,61,30,
+ 6,61,26, 5,38, 8, 6,61,23, 5,38,11, 7, 3,12, 6,61,27, 6,61,19, 0, 0, 0,
+ 6,61,17, 5,38, 2, 4,35,64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,61,15, 6,61,20,15,40,11,15,40,12,15,40,13,15,40,14,15,40,15,
+ 15,40,19,15,40,20,15,40,21,15,40,23,15,40,24,15,40,26,15,40,27,15,40,25,
+ 15,40,28,15,40,29,15,40,30,15,40,31,15,40,32,15,40,33,15,40,34,15,40,35,
+ 15,40,36,15,40,37,15,40,39,15,40,40,15,40,41, 0, 0, 0,15,40,38,
+ /* plane 2, page 45 */
+ 0, 255, /* first, last */
+ 6,61,16,15,40,22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 3,19, 7, 3,24, 5,45,28, 4,42, 5, 7, 3,29, 7, 3,23, 7, 3,25, 4,41,91,
+ 4,41,88, 5,45,29, 5,45,27, 7, 3,37, 4,41,93, 7,14,15, 4,42, 1, 0, 0, 0,
+ 5,45,33, 4,42, 6, 4,41,92, 5,52,57, 7,14,28, 7, 3,21, 7, 3,20, 7,14,13,
+ 7,14,11, 7, 3,36, 7,14,12, 7, 3,28, 5,45,32, 7,14,14, 5,45,31, 7, 3,27,
+ 7, 3,34, 7, 3,35, 0, 0, 0, 7, 3,30, 7, 3,33, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,41,87, 0, 0, 0,15,40,17, 0, 0, 0, 0, 0, 0, 7, 3,18, 7, 3,31, 7, 3,32,
+ 15,46,92,15,46,93,15,46,94,15,47, 1,15,47, 2,15,47, 3,15,47, 6,15,47, 7,
+ 15,47, 8,15,47, 9,15,47,10,15,47,11,15,47,13,15,47,14,15,47,15,15,47,16,
+ 15,52,63, 0, 0, 0, 0, 0, 0,15,47, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,54,24,
+ 4,48,33, 7,14,21, 7,14,16, 5,52,58, 5,52,59, 7,14,30, 7,14,26, 7,14,18,
+ 7, 3,22, 4,48,30, 4,48,35, 4,48,32, 5,52,61, 4,48,31, 7,14,29, 4,48,38,
+ 7,14,27, 4,48,40, 4,48,34, 4,48,39, 7,14,25, 7,14,17, 7,14,32, 7,24, 9,
+ 7,14,24, 5,52,63, 5,52,60, 7,14,23, 7,24, 8, 7,14,19, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,14,31,15,52,53,
+ 15,52,54,15,52,55,15,52,56,15,52,57,15,52,58,15,52,59,15,52,60,15,52,61,
+ 15,52,62,15,52,64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,14,20, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,14,22,
+ 4,48,36,15,52,52, 0, 0, 0, 5,59,54, 7,24,17, 5,59,55, 7,24,22, 4,54,27,
+ 7,24,15, 7,24,21, 4,54,26, 7,24,20, 7,24,12, 5,59,56, 4,54,23, 5,59,53,
+ 7,24,10, 7,24,23, 7,24,16, 7,24,14, 7,24,18, 7,24,24, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,24,11, 7,24,13,15,58,16,15,58,17,
+ 15,58,18,15,58,19,15,58,20,15,58,21, 0, 0, 0, 7,24,19, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,59,19, 4,59,24,
+ 5,65,78, 5,65,75, 5,65,76, 5,65,77, 7,31,72, 7,31,71, 4,59,21, 4,59,23,
+ /* plane 2, page 46 */
+ 0, 254, /* first, last */
+ 5,71,90, 5,76,13, 7,31,73, 7,31,70, 4,59,20, 7,31,67, 7,31,69, 7,39,15,
+ 7,31,65, 7,31,68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,62,72,15,62,73,
+ 15,62,74,15,62,77,15,62,78,15,62,79,15,62,81,15,62,82,15,62,84, 0, 0, 0,
+ 15,62,76,15,62,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,63,70, 4,63,72, 4,63,71, 4,63,73, 5,76,15,
+ 7,39,18, 7,39,20, 7,39,22, 5,71,91, 7,39,16, 5,76,14, 7,39,24, 4,63,75,
+ 7,39,21, 7,39,19, 7,39,17, 4,63,74, 5,71,89, 0, 0, 0, 0, 0, 0,15,66,30,
+ 15,66,31,15,66,32,15,66,33,15,66,34,15,66,35,15,66,36,15,66,37,15,66,38,
+ 15,66,41,15,69,15, 7,31,74, 0, 0, 0, 7,39,23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,66,39, 0, 0, 0, 5,76,18, 0, 0, 0, 4,70,31,
+ 7,45,77, 4,67,40, 0, 0, 0, 7,45,76, 4,67,41, 7,45,80, 4,67,42, 7,45,78,
+ 5,76,19, 5,76,16, 5,76,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,45,79,
+ 15,69,13,15,69,14,15,69,16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,51,36, 7,55,87, 4,70,33, 7,51,31,
+ 7,51,35, 7,51,34, 4,70,34, 5,83,37, 7,51,33, 7,51,32, 0, 0, 0,15,71,54,
+ 0, 0, 0,15,71,55,15,71,56,15,71,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,55,88, 7,55,89, 5,83,36, 5,83,39, 5,80, 3, 7,55,90,
+ 5,83,34, 5,83,38, 7,55,92, 7,59,55, 7,51,30, 0, 0, 0, 0, 0, 0,15,73,35,
+ 15,73,36, 5,83,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,55,91, 7,59,56, 0, 0, 0,
+ 15,74,52,15,74,53,15,74,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,62,74, 5,87,61,
+ 7,62,73, 4,75,75, 7,62,75, 0, 0, 0, 0, 0, 0, 5,87,60, 7,62,72,15,75,41,
+ 15,75,42,15,75,43,15,75,44, 0, 0, 0, 7,66,24,15,76,10,15,76,11, 0, 0, 0,
+ 4,77,83, 7,67,51,15,76,65, 0, 0, 0, 7,70, 6, 4, 2,87, 4, 4,29, 4, 6,58,
+ 15, 7,17,15, 7,18,15, 7,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,17,56, 0, 0, 0,
+ 0, 0, 0, 6,24, 2, 5,15,60, 4,13,30, 6,24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,22,36, 0, 0, 0, 6,32,25, 0, 0, 0, 0, 0, 0, 6,32,24, 6,41,47, 6,41,46,
+ 15,27,44,15,27,45, 0, 0, 0, 0, 0, 0, 5,24,85, 6,51, 6,15,33,74, 6,51, 7,
+ 0, 0, 0, 0, 0, 0, 5,38,13, 6,61,32, 0, 0, 0, 7, 3,38, 7, 3,39, 0, 0, 0,
+ 5,52,64,15,52,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,24,27, 7,24,26, 5,59,57,
+ 0, 0, 0, 7,24,28, 7,45,81, 0, 0, 0, 5, 4,31, 6, 7,89, 5, 4,32, 6, 7,90,
+ 0, 0, 0, 5, 4,33, 6, 7,88, 6,11,72, 4, 6,64, 0, 0, 0, 5, 6,34, 5, 6,32,
+ 0, 0, 0, 4, 6,61, 6,11,76, 6,11,70, 0, 0, 0, 6,11,74, 6,11,73,
+ /* plane 2, page 47 */
+ 5, 255, /* first, last */
+ 6,11,71, 5, 6,31, 5, 6,33,
+ 4, 6,60, 4, 9,64, 6,17,57, 5, 9,44, 5, 9,43, 6,17,60, 6,17,62, 6,17,61,
+ 5, 9,41, 5, 9,42, 0, 0, 0, 0, 0, 0, 4, 9,62, 4, 9,63, 0, 0, 0, 0, 0, 0,
+ 6,17,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,24, 3, 6,24, 4, 6,24, 6, 5,13,82,
+ 6,17,63, 4,13,37, 6,24, 8, 5,13,80, 0, 0, 0, 6,24,10, 0, 0, 0, 5,13,79,
+ 5,13,84, 0, 0, 0, 6,24, 5, 0, 0, 0, 5,13,83, 5,13,81, 6,24, 9, 6,24, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,13,33, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,18,77, 6,32,32, 0, 0, 0, 4,18,14, 0, 0, 0, 6,32,26,
+ 6,32,27, 6,32,29, 5,18,79, 5,18,80, 4,18,16, 6,32,30, 6,32,28, 5,18,75,
+ 6,32,33, 4,18,17, 4,18,10, 4,18,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,18, 9,
+ 5,18,78,15,21,17,15,21,18,15,21,19,15,21,20,15,21,21, 0, 0, 0, 5,18,74,
+ 6,32,31, 0, 0, 0, 0, 0, 0, 6,41,56, 0, 0, 0, 5,25, 2, 6,41,53, 4,23,90,
+ 4,23,91, 6,41,57, 0, 0, 0, 0, 0, 0, 6,41,52, 6,41,58, 5,24,86, 5,24,94,
+ 5,25, 1, 5,24,93, 5,24,87, 0, 0, 0, 6,41,54, 5,24,91, 6,41,49, 6,41,48,
+ 6,41,51, 0, 0, 0, 4,23,82, 4,23,83, 4,23,84, 5,24,88, 5,24,89, 5,18,76,
+ 0, 0, 0, 0, 0, 0, 6,41,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,51,15,
+ 5,24,90, 0, 0, 0, 5,31,55, 5,31,58, 5,31,60, 4,29,55, 4,29,63, 6,51,11,
+ 6,51,14, 6,51, 9, 0, 0, 0, 5,31,59, 6,51,16, 6,51,13, 0, 0, 0, 6,51, 8,
+ 4,29,64, 0, 0, 0, 5,31,54, 6,51,17, 5,31,57, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,29,62, 4,29,53, 4,29,54, 4,29,56, 5,31,56, 6,51,10,15,33,75,
+ 6,51,12, 0, 0, 0, 0, 0, 0, 5,18,81, 4,29,58, 6,53,64, 0, 0, 0, 5,38,20,
+ 6,61,41, 5,38,18, 6,61,33, 4,35,72, 5,38,17, 6,61,34, 5,38,15, 6,61,38,
+ 0, 0, 0, 5,38,23, 0, 0, 0, 5,38,21, 6,61,39, 6,61,37, 6,61,36, 6,61,40,
+ 6,61,35, 6,61,42, 5,38,19, 0, 0, 0, 4,35,71, 5,38,22, 6,61,43, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,40, 5, 5,45,34,
+ 5,45,39, 4,42,12, 7, 3,46, 7, 3,41, 0, 0, 0, 7, 3,40, 5,45,38, 0, 0, 0,
+ 7, 3,50, 7, 3,47, 7, 3,45, 5,45,37, 7, 3,48, 5,45,35, 5,45,36,15,47,17,
+ 7, 3,43, 7, 3,44, 0, 0, 0, 7, 3,42, 0, 0, 0, 0, 0, 0, 4,48,43, 7,14,34,
+ 7,14,38, 7,14,40, 0, 0, 0,15,52,66, 5,52,65, 7,14,43, 0, 0, 0, 0, 0, 0,
+ 7,14,39, 7,14,41, 7,14,33, 7,14,37, 7,14,44, 5,52,67, 7,14,42, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,48,42, 5,52,68, 5,52,69, 5,52,70,15,52,67, 7,14,36,
+ 5,52,66, 7, 3,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,52,71, 7,24,30, 7,24,29,
+ /* plane 2, page 48 */
+ 0, 255, /* first, last */
+ 5,59,58, 5,59,62, 5,59,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,54,28, 0, 0, 0,
+ 0, 0, 0, 4,54,29, 5,59,59,15,58,23,15,58,24, 0, 0, 0, 7,24,31, 5,59,60,
+ 5,65,80, 7,31,76, 5,65,79, 0, 0, 0, 4,59,27, 7,31,77, 7,31,78, 0, 0, 0,
+ 4,59,25, 0, 0, 0, 7,31,75, 0, 0, 0, 0, 0, 0, 5,72, 1, 5,71,94, 0, 0, 0,
+ 5,71,92, 5,71,93,15,66,42, 5,76,20, 4,67,45, 5,76,21, 7,45,82, 4,67,43,
+ 7,45,85, 0, 0, 0, 7,45,84, 5,76,22, 7,45,86, 7,45,87, 4,70,36, 5,80, 5,
+ 0, 0, 0, 5,80, 6, 0, 0, 0, 5,83,40,15,73,37, 7,59,57, 5,85,75, 4,74,42,
+ 0, 0, 0, 0, 0, 0, 7,59,58, 0, 0, 0, 4,76,79,15,76,66, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15, 2,51,15, 4,38, 6,11,77, 0, 0, 0, 0, 0, 0,15,11,13,15,11,14,
+ 15,11,15, 0, 0, 0, 6,24,13, 6,24,14,15,15,69, 0, 0, 0, 6,32,34, 6,32,36,
+ 15,21,23,15,21,24, 6,32,35, 0, 0, 0, 0, 0, 0,15,27,46, 0, 0, 0, 5,31,61,
+ 15,33,76, 6,51,18,15,21,22, 0, 0, 0, 5,45,40, 7, 3,52, 7, 3,51, 5,45,41,
+ 15,47,19,15,47,20, 5,45,42, 7,14,45,15,58,25,15,62,85, 0, 0, 0,15,66,43,
+ 0, 0, 0,15,71,58, 0, 0, 0, 7,59,59, 6, 2, 2, 0, 0, 0,15, 7,20, 0, 0, 0,
+ 0, 0, 0, 6,17,64, 0, 0, 0, 4,13,40, 5,13,86, 5,13,85, 6,24,15, 5,18,82,
+ 15,21,25, 0, 0, 0, 6,32,38, 6,32,37, 6,41,61,15,32,18, 0, 0, 0, 6,41,59,
+ 6,41,60, 4,29,65, 6,61,44, 0, 0, 0, 5,31,62,15,33,77, 4,35,74, 0, 0, 0,
+ 0, 0, 0, 4,42,13, 7, 3,53, 0, 0, 0, 7,24,32, 0, 0, 0, 0, 0, 0, 4,63,76,
+ 0, 0, 0, 6, 2, 3, 0, 0, 0,15, 4,39, 6,11,79, 6,11,78, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,17,65, 0, 0, 0,15,15,70, 0, 0, 0, 0, 0, 0, 4,18,18, 6,32,40,
+ 6,32,39, 6,41,64, 6,41,68, 6,41,67, 5,25, 3, 6,41,70, 6,41,63, 6,41,62,
+ 6,41,66, 0, 0, 0, 4,23,92, 6,44,30, 0, 0, 0, 6,41,69, 4,29,66, 6,51,22,
+ 0, 0, 0, 6,51,20, 6,51,23, 0, 0, 0, 0, 0, 0, 5,31,63, 6,61,47, 0, 0, 0,
+ 6,61,46, 6,61,48, 3,39,17, 4,42,15, 6,61,45, 5,45,44, 0, 0, 0, 5,45,45,
+ 7,14,49, 7,14,48, 7,14,47, 7,14,50, 0, 0, 0, 0, 0, 0, 7,14,46, 0, 0, 0,
+ 4,48,45, 0, 0, 0, 7,24,33, 7,24,34, 7,31,79, 4,59,28, 0, 0, 0, 7,31,80,
+ 7,31,81, 7,39,25, 0, 0, 0,15,66,44, 7,45,88, 0, 0, 0, 7,55,93, 0, 0, 0,
+ 4, 4,34, 6, 7,91, 0, 0, 0,15, 7,21,15, 7,22, 5, 9,45, 6,17,68, 6,17,67,
+ 0, 0, 0,15,11,16, 6,17,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,13,42, 5,13,87,
+ 6,24,17, 6,24,19, 6,24,21,15,15,71,15,15,72,15,15,73,15,15,74, 6,24,18,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,18,19, 0, 0, 0, 4,18,21, 0, 0, 0, 6,32,42,
+ 15,21,26,15,21,27, 0, 0, 0, 6,32,41, 6,41,73, 5,25, 5, 5,25, 4, 6,41,72,
+ /* plane 2, page 49 */
+ 0, 255, /* first, last */
+ 6,41,74, 6,41,71,15,27,47, 0, 0, 0,15,27,48, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,51,24, 5,31,64, 6,51,25,15,33,78,15,33,79, 0, 0, 0, 5,38,24, 5,38,26,
+ 6,61,50, 5,38,25, 0, 0, 0, 0, 0, 0, 7, 3,54, 0, 0, 0, 0, 0, 0,15,47,21,
+ 7,14,51, 5,52,72, 7,24,35, 0, 0, 0, 0, 0, 0, 5,59,63, 7,31,83, 5,65,81,
+ 4,59,29, 7,31,84, 7,31,82, 0, 0, 0, 7,39,26, 0, 0, 0, 7,51,37, 4,72,77,
+ 7,55,94, 0, 0, 0, 7,62,76, 7,64,80, 0, 0, 0, 0, 0, 0, 5, 4,34, 0, 0, 0,
+ 5, 9,46, 5,13,89, 5,13,88, 0, 0, 0, 4,23,93, 6,41,75, 6,51,26, 6,51,27,
+ 4,29,70,15,47,22, 0, 0, 0, 6, 3,12, 6, 3,11, 0, 0, 0, 6, 4,91, 5, 2,83,
+ 6, 4,90, 6, 4,92,15, 2,52, 0, 0, 0,15, 4,43, 0, 0, 0, 6, 7,92, 6, 7,93,
+ 6, 8, 5, 5, 4,35, 6, 8, 2, 6, 7,94, 6, 8, 4, 0, 0, 0, 6, 8, 3, 0, 0, 0,
+ 6, 8, 1,15, 4,40,15, 4,42,15, 4,44, 0, 0, 0, 0, 0, 0, 4, 4,36, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5, 6,40, 6,11,84, 6,11,83, 5, 6,41, 6,11,93, 5, 6,36,
+ 6,11,89, 5, 6,39, 6,11,90, 6,11,87, 5, 6,38, 5, 6,37, 6,11,85, 6,11,88,
+ 15, 7,23,15, 7,24,15, 7,25,15, 7,26,15, 7,27,15, 7,28,15, 7,29, 6,11,81,
+ 0, 0, 0, 6,11,91, 6,11,92, 6,11,82, 6,11,86, 0, 0, 0, 0, 0, 0, 5, 9,49,
+ 6,17,69, 6,17,70, 5, 9,48, 4, 9,70, 6,17,72, 6,17,73, 4, 9,72, 0, 0, 0,
+ 0, 0, 0,15,11,17, 0, 0, 0,15,11,18, 6,17,74,15,11,21,15,11,22, 0, 0, 0,
+ 0, 0, 0, 6,17,78, 6,17,76, 6,17,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,13,94, 6,24,26, 5,14, 1, 5,14, 2, 5,13,91, 5,14, 3,
+ 5,13,92, 5,13,90, 6,24,30, 6,24,24, 6,24,28, 5,13,93, 6,24,25, 0, 0, 0,
+ 6,24,29, 0, 0, 0, 0, 0, 0,15,15,75, 0, 0, 0, 0, 0, 0,15,15,77, 6,24,27,
+ 15,15,76, 6,24,33, 0, 0, 0, 6,24,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,18,83, 4,18,24, 4,24, 1, 6,32,51, 4,18,29, 6,32,46,
+ 6,32,43, 6,32,44, 6,32,48, 6,32,45, 6,32,53, 5,18,85, 6,24,32, 6,32,52,
+ 6,32,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,21,28, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,21,29,15,21,30,15,21,31,15,21,32,15,21,33,
+ 15,21,34,15,21,35,15,21,36,15,21,37,15,21,38,15,21,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,32,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,18,84, 6,41,81, 6,41,84, 4,18,28, 5,31,65, 5,25,10,
+ 6,41,79, 5,25, 7, 6,41,80, 5,25, 9, 5,25, 6, 0, 0, 0, 6,41,76, 6,41,77,
+ 4,24, 3, 6,41,86, 5,25,11, 4,24, 7, 0, 0, 0, 0, 0, 0, 6,41,78, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,41,85, 6,41,87,15,27,49,15,27,51,15,27,52,15,27,54,
+ /* plane 2, page 50 */
+ 0, 255, /* first, last */
+ 15,27,55,15,27,57,15,27,58,15,27,60,15,27,61, 0, 0, 0, 0, 0, 0,15,27,50,
+ 15,27,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,24, 6, 0, 0, 0, 4,24, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,41,82,
+ 5,25,12, 5,25, 8, 0, 0, 0, 0, 0, 0, 6,51,35, 5,31,67, 6,51,33, 6,61,51,
+ 6,51,34, 6,51,31, 6,51,36, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,38,25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,27,59, 6,51,30,15,33,80,
+ 15,33,81,15,33,83,15,33,84,15,33,85,15,33,86,15,33,87,15,33,88, 0, 0, 0,
+ 15,33,89,15,33,90,15,33,91,15,33,93, 5,29,53, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,51,37, 0, 0, 0, 6,51,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,31,68, 5,38,27, 5,38,31, 5,38,29, 5,38,30, 6,61,54, 5,38,32,
+ 5,38,35, 5,38,36, 4,35,76, 5,38,34, 5,45,46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,40,42,15,40,43,15,40,44,15,40,45,15,40,46,
+ 15,40,47, 6,61,52, 5,38,28, 6,61,55, 6,61,57, 6,61,58, 0, 0, 0, 0, 0, 0,
+ 6,61,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,61,56, 7, 3,65, 7, 3,60, 7, 3,59, 7, 3,62, 5,45,50,
+ 0, 0, 0, 5,45,53, 7, 3,58, 7, 3,55, 7, 3,56, 0, 0, 0, 7, 3,66, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,47,23,
+ 15,47,25,15,47,26, 0, 0, 0, 0, 0, 0, 5,45,52, 7, 3,64,15,46,16, 0, 0, 0,
+ 0, 0, 0, 7, 3,61, 7, 3,63, 7, 3,57, 0, 0, 0, 5,45,49, 5,52,73, 5,52,75,
+ 7,14,55, 4,48,53, 0, 0, 0, 7,14,53, 7,14,59, 7,14,57, 7,14,61, 4,48,52,
+ 7,14,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,14,52,15,52,69,
+ 15,52,70,15,52,71,15,52,73,15,52,74, 7,14,56, 0, 0, 0, 5,45,47, 0, 0, 0,
+ 7,13,66, 0, 0, 0,15,52,72, 0, 0, 0, 0, 0, 0, 7,14,35, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,52,74, 7,14,54, 0, 0, 0, 0, 0, 0,
+ 15,47,24, 7,24,39, 5,59,64, 5,59,65, 7,24,40, 5,59,66, 0, 0, 0, 7,24,37,
+ 7,24,38, 0, 0, 0, 0, 0, 0, 7,24,41,15,58,26,15,58,27,15,58,28, 7,24,36,
+ 15,58,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,59,30, 5,65,82,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,65,83, 0, 0, 0, 7,31,85, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,62,86,15,62,87,15,62,88,15,62,89,15,62,91, 7,31,88,
+ 0, 0, 0, 0, 0, 0, 5,72, 3, 7,39,29, 7,39,28, 5,72, 2, 5,72, 4, 7,39,27,
+ 7,39,30, 0, 0, 0,15,66,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,76,23,
+ /* plane 2, page 51 */
+ 3, 254, /* first, last */
+ 15,69,17,15,69,18, 5,75,78, 0, 0, 0, 7,45,89,
+ 7,51,38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,56, 1,15,73,38, 5,83,25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,83,41, 0, 0, 0, 0, 0, 0, 7,59,60, 5,87,62,
+ 7,62,77,15,75,45, 0, 0, 0, 0, 0, 0, 5,89,11, 0, 0, 0, 0, 0, 0, 7,68,39,
+ 0, 0, 0, 0, 0, 0,15, 4,45, 6,11,94,15, 7,31,15, 7,32, 6,12, 1, 5, 9,51,
+ 5, 9,50, 6,17,80,15,11,23,15,11,25, 6,17,79, 6,24,34, 0, 0, 0,15,15,79,
+ 15,15,80,15,15,81,15,15,82,15,15,83, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,21,41,
+ 15,21,42, 0, 0, 0, 0, 0, 0,15,27,63, 6,41,90, 6,41,89, 5,31,69, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,35,80, 6,51,38, 0, 0, 0, 5,45,55, 5,45,54,
+ 7, 3,67, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,52,75, 0, 0, 0, 0, 0, 0, 5,59,67,
+ 0, 0, 0, 7,31,90, 5,65,84, 7,31,89, 7,31,87, 0, 0, 0, 4,63,77, 0, 0, 0,
+ 7,45,90, 7,45,91, 0, 0, 0, 5,91,31, 7,70,30, 6, 3,13, 6, 4,93, 5, 4,36,
+ 6, 8, 9, 6, 8, 7, 6, 8, 8, 6, 8, 6, 6,12, 2, 5, 9,52, 4, 9,73, 4, 9,74,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,11,26, 6,17,81, 0, 0, 0, 6,24,35, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,21,43, 5,18,86, 6,32,57, 6,32,59, 6,41,93,
+ 6,41,92, 6,32,58, 5,25,13, 0, 0, 0,15,25,38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,27,65,15,27,66, 0, 0, 0, 6,51,39, 5,31,71, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,27,64,15,33,94,15,34, 1, 6,51,40, 6,61,61, 0, 0, 0, 0, 0, 0,
+ 6,61,62, 0, 0, 0, 7, 3,68, 4,42,20, 5,45,57, 0, 0, 0, 0, 0, 0, 4,42,19,
+ 15,47,27,15,47,28, 5,52,78, 5,52,76, 5,59,68, 0, 0, 0, 0, 0, 0, 5,52,77,
+ 15,52,77,15,52,78, 0, 0, 0, 7,24,43, 7,24,42,15,58,30, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,65,85, 0, 0, 0, 0, 0, 0,15,62,92, 7,31,91, 5,76,24, 0, 0, 0,
+ 0, 0, 0, 5,85,79, 5,87,63, 5, 1,40, 4, 1,46, 4, 1,93,15, 1,69, 0, 0, 0,
+ 5, 2,85, 6, 5, 2, 5, 2,84, 6, 4,94, 6, 5, 1,15, 2,54, 0, 0, 0, 4, 2,91,
+ 4, 2,90, 6, 8,12, 4, 4,41, 6, 8,10, 0, 0, 0, 6, 8,11,15, 4,46,15, 4,47,
+ 15, 4,52,15, 4,48,15, 4,50, 5, 4,38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 8,13, 5, 4,37, 4, 4,37, 0, 0, 0, 4, 6,75, 5, 6,44, 4, 6,70, 5, 6,43,
+ 6,12,11, 5, 6,48, 5, 6,50, 6,12, 8, 6,12, 7, 6,12, 6, 5, 6,45, 5, 6,51,
+ 5, 6,47, 5, 6,46, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 7,35, 0, 0, 0,15, 7,37,
+ 15, 7,38,15, 7,39,15, 7,41,15, 7,42,15, 7,43,15, 7,45,15, 7,47,15, 7,49,
+ 15, 7,52,15, 7,53, 6,12, 4, 6,12, 9, 0, 0, 0, 0, 0, 0, 5, 6,52, 0, 0, 0,
+ 6,12,12,15, 7,36, 0, 0, 0, 6,12,13, 0, 0, 0, 6,12,10,15, 7,40,
+ /* plane 2, page 52 */
+ 0, 255, /* first, last */
+ 15, 7,34, 6,12, 5, 0, 0, 0, 5, 6,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,13,60,
+ 6,17,84, 6,17,83, 4, 9,75, 5, 9,54, 6,17,85, 6,17,86, 5, 9,53, 5, 9,57,
+ 6,17,87, 5,14, 6, 5, 9,58, 5, 9,56, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 7,51,
+ 15,11,27,15,11,28,15,11,29,15,11,31,15,11,32,15,11,33,15,11,34,15,11,35,
+ 15,11,36,15,11,37,15,11,38,15,11,39,15,11,41,15,11,42,15,11,43,15,11,44,
+ 15,11,45,15,11,46,15,11,47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 9,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,32,60, 6,24,47, 6,24,51,
+ 6,24,43, 6,24,45, 6,24,38, 5,14, 7, 6,24,40, 6,24,37, 6,24,49, 4,13,48,
+ 6,32,61, 5, 9,55, 5,14, 9, 5,14,10, 6,24,36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,15,84,
+ 0, 0, 0,15,15,85,15,15,86,15,15,88,15,15,89,15,15,90,15,15,91,15,15,92,
+ 15,15,93,15,15,94,15,16, 1,15,16, 2,15,16, 3,15,16, 5,15,16, 6,15,16, 7,
+ 15,16, 9,15,16,10,15,16,11,15,16,12,15,16,14, 6,24,44, 0, 0, 0, 0, 0, 0,
+ 6,24,39, 0, 0, 0, 6,24,41, 4,13,51, 0, 0, 0, 6,24,46,15,16,16,15,16, 8,
+ 0, 0, 0, 4,13,58,15,16,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,14,12, 5,14, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,15,87, 6,24,50, 6,32,72,
+ 6,32,73, 6,32,63, 5,18,87, 5,19, 1, 5,25,22, 4,18,37, 4,18,32, 5,18,93,
+ 6,32,71, 6,42,14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,32,67,
+ 15,21,44,15,21,45,15,21,47,15,21,48,15,21,49,15,21,50,15,21,51,15,21,52,
+ 15,21,53,15,21,54,15,21,56,15,21,57,15,21,58,15,21,59,15,21,60,15,21,61,
+ 15,21,62,15,21,63,15,21,64,15,21,65,15,21,66,15,21,67,15,21,69,15,21,70,
+ 6,32,68, 6,32,70, 6,32,69, 4,18,39, 6,32,66, 6,32,64, 0, 0, 0, 6,32,65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,18,36, 5,19, 2,
+ 5,18,88, 5,18,91, 5,18,90, 5,18,92, 6,32,74, 0, 0, 0, 0, 0, 0,15,21,46,
+ 6,32,62, 4,24,22, 6,42,20, 5,25,21, 6,51,41, 4,24,14, 5,25,24, 6,42, 2,
+ 5,25,18, 4,24,11, 5,25,16, 5,25,20, 4,24,17, 6,42,13, 6,42,15, 5,25,26,
+ 6,42, 4, 6,42, 1, 5,25,23, 6,42,19, 5,25,28, 5,25,27, 6,42, 6, 4,24,16,
+ 6,42, 7, 6,42,10, 6,42,17, 5,25,32, 6,51,42, 5,25,29, 6,42,24, 6,42, 3,
+ 6,42, 5, 6,42,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,24,19,
+ 4,24,24, 6,42,22, 6,42,23,15,27,68,15,27,69,15,27,71,15,27,72,15,27,73,
+ 15,27,75,15,27,76,15,27,77,15,27,79,15,27,81,15,27,82,15,27,84,15,27,85,
+ 15,27,86,15,27,87,15,27,88,15,27,89,15,27,90,15,27,91,15,27,92,15,27,93,
+ /* plane 2, page 53 */
+ 0, 251, /* first, last */
+ 15,27,94,15,28, 2,15,28, 3,15,28, 4,15,28, 5,15,28, 6,15,28, 7,15,28, 8,
+ 15,28,10,15,28,11,15,28,12,15,28,13,15,28,14,15,28,15, 6,42, 9, 6,42,11,
+ 0, 0, 0, 6,42,12, 6,42,18, 5,25,34, 6,42,16, 6,42,25, 6,42, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,25,30, 5,25,33, 5,25,14, 5,25,15, 5,25,17,
+ 0, 0, 0, 6,51,46, 6,51,56, 4,29,87, 6,51,54, 4,29,84, 6,51,55, 5,31,79,
+ 5,31,74, 5,31,78, 5,31,75, 4,29,74, 6,51,59, 5,31,83, 6,51,65, 5,31,72,
+ 4,29,90, 5,31,84, 5,31,73, 6,51,53, 5,31,80, 5,31,77, 6,51,64, 4,29,83,
+ 6,51,57, 6,51,58, 6,51,61, 6,51,48, 4,29,80, 6,51,60, 5,31,76, 0, 0, 0,
+ 6,51,67, 6,51,47, 6,51,49, 6,51,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,34, 3, 0, 0, 0,15,34, 4,15,34, 5,15,34, 6,15,34, 7,15,34, 9,
+ 15,34,10,15,34,11,15,34,12,15,34,13,15,34,14,15,34,16,15,34,17,15,34,18,
+ 15,34,19,15,34,20,15,34,21,15,34,22,15,34,24,15,34,25,15,34,26,15,34,27,
+ 15,34,29,15,34,30,15,34,31,15,34,32,15,34,33,15,34,34,15,34,35,15,34,36,
+ 15,34,37,15,34,38,15,34,40,15,34,42,15,34,44, 0, 0, 0, 0, 0, 0, 6,51,45,
+ 6,51,50, 6,51,52, 4,29,89, 6,51,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,51,43,
+ 0, 0, 0, 0, 0, 0, 6,51,63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,34, 2, 0, 0, 0, 0, 0, 0,15,34,15, 0, 0, 0,15,34,23, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,25,31, 5,31,82, 6,51,51,15,35,84, 0, 0, 0,
+ 5,38,46,15,34,43, 5,38,48, 4,35,91, 4,35,82, 5,38,45, 5,38,47, 6,61,73,
+ 5,38,53, 5,38,50, 7, 3,69, 0, 0, 0, 6,51,68, 5,38,39, 6,61,63, 5,38,52,
+ 5,38,38, 5,38,56, 6,61,66, 5,38,42, 5,38,51, 6,61,67, 4,35,86, 5,38,40,
+ 0, 0, 0, 5,38,41, 6,61,69, 5,38,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,38,49, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,40,55,15,40,56,15,40,57,15,40,58,
+ 15,40,59,15,40,60,15,40,61,15,40,62,15,40,63,15,40,64,15,40,65,15,40,66,
+ 15,40,67,15,40,68,15,40,69,15,40,70,15,40,71,15,40,72,15,40,73,15,40,74,
+ 15,40,75,15,40,76,15,40,77,15,40,78,15,40,79,15,40,81,15,40,82,15,40,83,
+ 15,40,85, 0, 0, 0, 0, 0, 0, 3,39,43, 6,61,74, 6,61,71, 0, 0, 0, 6,61,75,
+ 6,61,76, 0, 0, 0, 5,38,54, 5,38,55,
+ /* plane 2, page 54 */
+ 0, 255, /* first, last */
+ 15,40,84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,61,68, 0, 0, 0, 6,61,70,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,40,48, 0, 0, 0,15,40,49,15,40,51,15,40,52,
+ 6,61,64, 6,61,77, 6,61,65, 0, 0, 0,15,40,54, 7, 3,72, 5,45,71, 5,45,62,
+ 4,42,27, 4,42,39, 5,45,59, 4,42,32, 7, 3,81, 7, 3,76, 7, 3,84, 5,45,75,
+ 5,45,69, 7, 3,80, 4,42,38, 5,45,63, 4,42,31, 5,45,68, 4,42,35, 4,42,30,
+ 4,42,21, 7, 3,83, 5,45,60, 4,42,42, 5,45,73, 7, 3,78, 5,45,67, 5,45,74,
+ 7, 3,73, 4,42,33, 5,45,61, 7, 3,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,42,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,42,37,
+ 0, 0, 0, 4,42,41, 7, 3,70, 7, 3,74,15,47,29,15,47,30,15,47,31,15,47,35,
+ 15,47,36,15,47,38,15,47,39,15,47,40,15,47,41,15,47,42,15,47,43,15,47,44,
+ 15,47,45,15,47,46,15,47,47,15,47,48,15,47,49,15,47,50,15,47,51, 0, 0, 0,
+ 0, 0, 0,15,47,32, 0, 0, 0, 7, 3,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,45,76, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,45,72, 5,45,70, 7, 3,71, 7, 3,77, 5,45,64, 5,45,58, 5,45,66, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,48,59, 5,52,93, 7,14,73, 4,48,69, 4,48,56,
+ 5,59,69, 7,24,44, 7,14,64, 7,14,67, 5,52,91, 7,14,72, 7,14,82, 5,52,90,
+ 7,14,79, 7,14,66, 4,48,66, 4,54,44, 4,48,55, 7,14,63, 4,48,63, 5,52,89,
+ 7,14,71, 7,14,68, 5,52,81, 0, 0, 0, 5,52,87, 4,48,60, 7,14,78, 7,14,84,
+ 5,52,88, 4,48,61, 7,14,70, 7,14,75, 4,48,67, 5,52,80, 7,14,65, 5,65,91,
+ 5,52,85, 5,52,86, 5,52,82, 4,42,36, 7,14,83, 7,14,76, 7,14,69, 0, 0, 0,
+ 7,14,62, 5,52,92, 5,52,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,52,83,
+ 15,52,79,15,52,80,15,52,81,15,52,82,15,52,83,15,52,85,15,52,86,15,52,87,
+ 15,52,88,15,52,89,15,52,90,15,52,92,15,52,93,15,52,94,15,53, 1,15,53, 2,
+ 15,53, 4,15,53, 5,15,53, 6,15,53, 7,15,53, 8,15,53,11,15,53,12,15,53,13,
+ 15,53,14,15,53,15,15,53,16,15,53,18,15,53,19,15,53,20,15,53,21,15,53,22,
+ 15,53,23,15,53,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,14,80, 0, 0, 0,
+ 7,14,81, 0, 0, 0, 4,48,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,53, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,52,84,15,40,80, 0, 0, 0,15,47,33, 0, 0, 0,
+ 7,14,77, 4,54,35, 7,24,48, 7,24,46, 4,54,39, 7,24,50, 7,24,54, 5,59,74,
+ 5,59,75, 4,54,42, 4,54,38, 5,59,78, 7,24,51, 5,59,76, 0, 0, 0, 7,24,49,
+ /* plane 2, page 55 */
+ 0, 254, /* first, last */
+ 7,24,55, 5,65,92, 5,59,71, 4,54,45, 4,54,36, 7,24,57, 4,54,34, 5,59,73,
+ 7,24,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,59,70, 7,24,52,15,58,32,
+ 15,58,33,15,58,35,15,58,36,15,58,37,15,58,38,15,58,39,15,58,40,15,58,41,
+ 15,58,42,15,58,43,15,58,44,15,58,46,15,58,47,15,58,49,15,58,50,15,58,52,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,24,56, 5,59,77, 7,24,58, 7,24,45, 7,24,47,
+ 7,23, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,58,51, 0, 0, 0, 0, 0, 0,15,58,45,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,59,79, 5,59,80, 0, 0, 0,15,53,17, 0, 0, 0, 0, 0, 0,15,58,48,
+ 0, 0, 0, 4,59,39, 5,65,88, 7,32, 7, 7,32, 3, 4,59,34, 7,32,11, 5,66, 4,
+ 5,65,93, 5,66, 6, 7,32, 9, 4,59,37, 5,65,90, 5,66, 2, 5,66, 7, 5,65,94,
+ 7,24,60, 5,66,11, 5,65,89, 4,59,35, 4,59,44, 4,59,38, 7,32,13, 7,32, 8,
+ 5,66, 3, 7,39,38, 5,66, 9, 7,32, 6, 4,59,43, 5,66, 8, 5,66, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,65,86, 0, 0, 0, 7,31,92,
+ 7,31,93,15,62,94,15,63, 2,15,63, 3,15,63, 4,15,63, 5,15,63, 6,15,63, 7,
+ 15,63, 8,15,63,10,15,63,11,15,63,12,15,63,14,15,63,15,15,63,16, 7,32, 1,
+ 0, 0, 0, 7,32, 5, 0, 0, 0, 7,32,12, 7,32,10, 0, 0, 0, 5,66, 1, 0, 0, 0,
+ 0, 0, 0,15,63, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,66,10, 5,65,87,
+ 0, 0, 0, 7,32, 2, 0, 0, 0, 7,32, 4,15,63,13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,72, 5, 7,39,35, 5,72, 8, 5,72,11, 5,72, 9, 7,39,34, 7,39,32, 5,72,13,
+ 7,39,33, 4,63,84, 7,39,40, 7,39,41, 5,72, 7, 5,72, 6, 7,39,37, 5,72,15,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,39,39, 7,31,94,15,66,50,15,66,54,15,66,56,
+ 15,66,57,15,66,58,15,66,59,15,66,60,15,66,61,15,66,63,15,66,64,15,66,65,
+ 5,72,14, 0, 0, 0, 7,39,36, 0, 0, 0, 0, 0, 0, 7,39,31,15,66,52, 5,72,12,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,66,55,15,66,47, 0, 0, 0, 0, 0, 0,15,66,62,
+ 0, 0, 0, 0, 0, 0,15,62,93, 0, 0, 0, 4,67,51, 7,45,92, 5,76,31, 7,45,94,
+ 5,76,34, 5,72,16, 5,76,26, 5,76,25, 5,76,29, 7,45,93, 5,76,28, 5,76,33,
+ 5,76,27, 5,72,10, 5,76,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,76,30,15,69,19,15,69,20,15,69,21,15,69,22,15,69,23,15,69,25,15,69,26,
+ 15,69,27,15,69,28,15,69,29,15,69,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,67,50, 0, 0, 0, 0, 0, 0, 7,51,41,
+ 7,51,40, 0, 0, 0, 5,80,11, 5,80,13, 4,70,38, 5,80, 9, 7,51,45, 0, 0, 0,
+ 5,80, 8, 5,80,10, 5,80,12, 7,51,42, 4,70,37, 5,80,15, 7,51,46,
+ /* plane 2, page 56 */
+ 1, 255, /* first, last */
+ 5,80,18,15,71,59,15,71,60,15,71,61,15,71,62,15,71,63,15,71,64,
+ 15,71,65,15,71,66,15,71,67,15,71,68, 7,51,44, 0, 0, 0, 5,80,17, 5,80,16,
+ 7,51,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,80,14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,56, 6, 5,83,46, 5,83,47, 5,83,44, 5,83,42, 4,72,79, 5,83,43,
+ 5,83,45, 7,56, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,73,39,15,73,40,15,73,41,
+ 15,73,43,15,73,46,15,73,47,15,73,48,15,73,49, 7,56, 4, 7,56, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,71,69, 0, 0, 0, 5,85,81,
+ 5,85,83, 5,87,64, 5,85,84, 7,59,64, 5,85,82, 7,59,65, 5,85,85, 7,59,63,
+ 5,87,65, 0, 0, 0, 0, 0, 0, 7,59,61,15,74,55,15,74,57, 7,59,62, 0, 0, 0,
+ 0, 0, 0, 5,85,86, 5,85,80, 0, 0, 0, 4,75,76, 7,62,78, 5,87,66, 7,64,81,
+ 15,75,46,15,75,47,15,75,48,15,75,51,15,75,52, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,62,79, 0, 0, 0, 0, 0, 0, 7,62,80,15,74,56, 0, 0, 0, 7,64,82, 0, 0, 0,
+ 5,89,13, 0, 0, 0,15,76,12, 7,64,83, 0, 0, 0, 5,89,12, 0, 0, 0, 5,89,14,
+ 15,75,50, 5,90, 9, 7,67,52, 7,64,84, 0, 0, 0, 4,77,53,15,76,13, 0, 0, 0,
+ 0, 0, 0,15,76,44,15,76,67, 7,67,44, 7,67,53, 0, 0, 0, 5,91,32, 7,68,40,
+ 7,68,41, 0, 0, 0, 7,69,59,15,77,15, 7,69,84, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 5, 4, 4, 4,43, 6, 8,15, 6,12,14, 6, 8,18, 5, 4,39, 6, 8,17, 4, 4,42,
+ 0, 0, 0, 5, 6,60, 5, 6,59, 5, 6,56, 6,12,15, 4, 6,79, 6,12,16, 5, 6,61,
+ 4, 6,78, 5, 6,57, 5, 6,58, 5, 6,55,15, 7,54, 0, 0, 0, 0, 0, 0, 5, 9,63,
+ 6,17,90, 6,24,52, 6,17,92, 5, 9,66, 4, 9,85, 5, 9,65, 5, 9,62, 6,17,89,
+ 5, 9,60, 5, 9,64, 6,17,91, 5, 9,61, 0, 0, 0, 0, 0, 0,15,12,87, 6,24,55,
+ 6,24,56, 6,24,53, 5,14,19, 0, 0, 0, 5,14,13, 6,24,54, 6,32,75, 5,14,18,
+ 4,13,63, 5,14,15, 5,14,20, 5,14,17, 5,14,16,15,16,17, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,19, 5, 6,32,76, 0, 0, 0, 6,32,77, 0, 0, 0,15,21,71,
+ 15,21,72,15,21,73,15,21,74,15,21,75,15,21,76,15,21,77,15,21,78, 0, 0, 0,
+ 4,24,29, 5,25,39, 5,31,87, 4,24,26, 5,25,37, 6,42,28, 5,19, 4, 5,25,40,
+ 6,42,29, 5,25,36, 5,25,41, 6,42,30, 0, 0, 0, 5,25,38, 6,42,27,15,28,16,
+ 15,28,17, 6,42,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,51,78, 5,31,86, 5,31,85,
+ 5,31,90, 6,51,75, 5,31,89, 6,51,71, 6,51,70, 6,51,72, 6,51,73, 6,51,74,
+ 6,51,77, 5,31,88, 0, 0, 0,15,34,46, 6,56,58, 0, 0, 0, 0, 0, 0, 6,51,76,
+ 6,51,69,15,34,45, 5,38,60, 4,36,11, 5,38,62, 6,61,79, 6,61,78, 4,36,12,
+ 5,38,61, 4,36, 9, 6,61,85, 6,61,80, 5,38,58, 6,61,86, 6,61,84, 5,38,59,
+ /* plane 2, page 57 */
+ 0, 255, /* first, last */
+ 6,61,82, 6,61,81, 6,61,83, 6,51,79,15,40,86,15,40,88, 0, 0, 0, 5,38,57,
+ 5,45,78, 7, 3,93, 5,45,80, 5,45,81, 4,42,45, 7, 3,89, 7, 3,87, 7, 3,94,
+ 7, 3,86, 7, 3,90, 7, 3,91, 0, 0, 0, 5,45,79,15,47,52, 0, 0, 0, 7, 3,92,
+ 5,52,94, 7,14,86, 4,48,72, 0, 0, 0, 7,14,85,15,53,26,15,53,27, 0, 0, 0,
+ 7,24,62, 7,24,64, 5,59,81, 7,24,63,15,58,53, 7,24,61, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,66,12, 0, 0, 0, 0, 0, 0, 5,72,18, 5,72,17,15,66,66, 0, 0, 0,
+ 0, 0, 0, 5,80,22, 7,46, 3, 0, 0, 0, 5,80,21, 5,80,20, 4,72,80, 5,80,19,
+ 0, 0, 0, 5,83,48, 7,56, 9, 7,56, 7, 7,56, 8, 0, 0, 0, 5,87,67, 7,64,85,
+ 4,76,80, 4,77,54, 5, 1,18, 5, 1,80, 6, 3,14, 6, 5, 6, 0, 0, 0, 5, 4,42,
+ 6, 8,20, 6,12,17, 5, 4,41, 5, 4,43, 6, 8,19, 6,12,28, 6,12,20, 6,12,27,
+ 6,12,26, 6,12,22, 6,12,19, 6,12,24, 6,12,18, 6,12,23, 5, 6,62, 6,12,25,
+ 6,12,21, 5, 6,63, 0, 0, 0,15, 7,55,15, 7,56,15, 7,57, 0, 0, 0, 0, 0, 0,
+ 4, 6,82, 0, 0, 0, 4, 9,86, 5, 9,67, 0, 0, 0, 5, 8,21, 6,24,57, 6,24,60,
+ 5,14,21, 6,24,58, 6,24,62, 6,24,61, 0, 0, 0, 6,24,59, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,23,40, 5,19, 6, 6,32,80,15,21,79, 0, 0, 0, 0, 0, 0,
+ 6,32,79, 4,24,32, 4,24,30, 5,25,42, 5,25,43, 6,42,35, 4,24,33, 6,42,34,
+ 0, 0, 0, 6,42,36, 6,42,32, 6,42,37, 6,42,38, 6,42,33, 0, 0, 0, 5,31,92,
+ 6,51,80, 5,31,91,15,34,47, 6,58,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4, 2, 7, 4, 5, 7, 4, 3, 7, 4, 6,
+ 7, 4, 1, 7, 4, 4,15,47,53, 0, 0, 0, 7,14,90, 7,14,89, 7,14,87, 7,14,88,
+ 0, 0, 0, 7,24,65, 4,54,48, 0, 0, 0,15,58,54,15,58,55, 5,66,13, 5,66,14,
+ 7,32,14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,83,49,
+ 0, 0, 0, 7,59,66, 7,59,67, 0, 0, 0, 0, 0, 0, 5, 1,81, 5, 1,41, 5, 2,86,
+ 6, 8,21, 4, 2,93, 6, 5, 7, 5, 4,44, 4, 4,45, 6, 5, 8, 0, 0, 0, 6, 8,22,
+ 6, 8,27, 6, 8,23, 4, 4,44, 6, 8,28, 5, 4,45, 6, 8,25, 6, 8,24, 6, 8,26,
+ 0, 0, 0, 6,12,31, 5, 6,64, 5, 6,70, 5, 6,65, 5, 6,68, 4, 6,83, 4, 6,84,
+ 5, 6,67, 4, 6,87, 6,12,29, 6,12,30, 6,12,32, 6,17,93, 5, 6,69, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9,72, 4, 9,88, 4, 9,89,
+ 6,18, 6, 4, 9,87, 6,17,94, 5, 9,68, 5, 9,69, 5, 9,75, 5, 9,70, 5, 9,71,
+ 6,18, 5, 4, 9,90, 6,18, 2, 6,18, 3, 5, 9,74, 6,18, 4, 6,24,63,15,11,48,
+ 6,18, 1, 5, 9,76, 5,14,22, 4,13,67, 6,24,66, 5,14,27, 6,24,69, 5,14,28,
+ 5,14,24, 5,14,25, 0, 0, 0, 6,24,67, 6,24,70, 5,14,29, 5,14,23, 5,14,26,
+ /* plane 2, page 58 */
+ 0, 255, /* first, last */
+ 5,14,30, 6,24,64, 0, 0, 0, 6,24,65, 0, 0, 0, 5,19,11, 6,32,84, 5,19,10,
+ 6,32,83, 5,19, 7, 5,19, 8, 5,19, 9, 6,32,81, 4,18,43, 5,19,12, 6,42,41,
+ 6,32,85, 6,32,82,15,21,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,51,82, 6,42,42,
+ 5,25,51, 4,24,40, 6,42,43, 4,24,35, 5,25,46, 5,25,45, 5,25,47, 4,24,39,
+ 5,25,50, 5,25,52, 5,25,48, 5,25,44, 5,25,49, 6,42,44, 6,51,81, 0, 0, 0,
+ 6,42,40,15,28,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,51,84,
+ 0, 0, 0, 6,51,89, 5,31,93, 5,31,94, 6,51,86, 6,51,88, 4,30, 5, 6,61,88,
+ 6,51,90, 6,51,85, 0, 0, 0, 6,51,83, 0, 0, 0,15,34,48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,21,80, 4,36,20, 4,36,14, 6,61,91, 6,61,92,
+ 4,36,15, 6,61,89, 0, 0, 0, 6,61,90, 6,61,13, 7, 4, 9, 4,42,49, 5,45,82,
+ 7, 4, 7, 5,45,85, 7, 4, 8, 7, 4,11, 5,45,84, 4,48,73, 7, 4,12, 7, 4,10,
+ 15,47,54, 5,45,83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,14,91, 7,14,92, 5,53, 1,
+ 4,48,76, 5,53, 3, 5,53, 2, 7,14,94,15,53,28,15,53,29, 0, 0, 0, 0, 0, 0,
+ 7,24,68, 7,24,66, 5,59,83, 7,24,69, 7,24,67, 5,59,84, 0, 0, 0, 5,66,16,
+ 5,66,15, 4,59,45, 7,32,16, 7,14,93, 5,59,85, 0, 0, 0, 7,32,15, 5,72,19,
+ 0, 0, 0, 0, 0, 0, 5,80,23, 5,80,24, 7,51,47, 0, 0, 0, 7,56,10, 5,85,90,
+ 5,85,89, 0, 0, 0, 5, 6,72, 5, 6,71, 0, 0, 0, 6,18, 7, 6,18, 8, 0, 0, 0,
+ 5,14,31, 0, 0, 0, 0, 0, 0, 4,18,44, 4,18,45, 6,32,88, 6,32,89, 6,32,86,
+ 6,32,87,15,21,83,15,21,85,15,21,86,15,21,87, 6,32,91, 6,32,90, 5,19,13,
+ 0, 0, 0, 6,42,47, 0, 0, 0, 6,42,46,15,28,19, 0, 0, 0, 0, 0, 0,15,21,82,
+ 6,52, 1, 6,52, 2, 0, 0, 0, 6,51,93, 6,51,94, 6,52, 4,15,34,49,15,34,50,
+ 0, 0, 0, 6,52, 3, 6,51,92, 0, 0, 0, 5,32, 1, 5,32,91, 5,38,65, 4,36,22,
+ 6,62, 1, 4,36,23, 6,61,94, 6,61,93, 0, 0, 0,15,40,90, 5,45,86, 6,62, 2,
+ 7, 4,13, 4,42,50, 0, 0, 0, 7,15, 5, 7,15, 3, 7,15, 6, 7,15, 1, 7,15, 4,
+ 5,53, 4, 7,15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,53,30,15,53,31,15,53,32,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,24,70, 7,24,71, 0, 0, 0, 0, 0, 0,
+ 4,59,46, 7,32,19, 5,66,18, 5,66,17, 0, 0, 0, 0, 0, 0, 7,32,17, 0, 0, 0,
+ 7,32,18, 4,63,88, 7,39,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,46, 5, 7,39,45,
+ 0, 0, 0, 7,51,48, 4,74,45, 5,85,91, 7,59,68, 5,83,50, 7,62,83, 5,87,69,
+ 5,87,68, 7,64,86, 0, 0, 0, 7,67,54, 5, 1,82, 6, 8,29, 0, 0, 0, 6,12,33,
+ 6,18, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,24,71, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,28,20, 5,32, 2, 4,42,51, 0, 0, 0,15,47,55,15,47,56,15,58,57,15,53,33,
+ /* plane 2, page 59 */
+ 0, 255, /* first, last */
+ 15,66,67,15,74,58, 5, 4,47, 6, 8,30, 6,12,37, 6,12,36, 5, 6,73, 0, 0, 0,
+ 6,24,72, 6,24,74, 6,24,73, 6,32,92, 6,32,93, 5,32, 3, 4,30, 6, 5,38,66,
+ 5,38,67, 6,62, 3, 7, 4,14, 7,15, 7, 7,15, 8, 5,53, 5, 7,39,46, 5,76,35,
+ 0, 0, 0, 0, 0, 0, 5,89,16, 5, 1,42, 4, 2,94, 0, 0, 0,15, 2,58,15, 2,59,
+ 0, 0, 0, 6, 8,32, 6, 8,31, 4, 4,46,15, 4,53,15, 4,54,15, 4,55,15, 4,57,
+ 15, 4,58, 5, 6,77, 5, 6,74, 5, 6,76, 5, 6,75, 6,12,39, 6,12,38,15, 7,58,
+ 15, 7,60,15, 7,61,15, 7,62,15, 7,63, 0, 0, 0, 5, 6,35, 0, 0, 0, 0, 0, 0,
+ 6,18,12, 5, 9,78, 5, 9,79, 5, 9,77, 5, 9,80, 5, 9,81, 6,18,13, 5, 9,83,
+ 6,18,15, 6,24,77, 6,18,14, 0, 0, 0, 5, 9,84, 6,18,11, 0, 0, 0, 5, 9,82,
+ 0, 0, 0,15,11,49,15,11,50,15,11,51,15,11,52,15,11,53,15,11,54,15,11,55,
+ 15,11,56,15,11,57,15,11,58,15,11,59,15,11,60,15,11,62, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,11,61, 0, 0, 0, 6,24,79, 5,14,33, 6,24,78, 4,13,73,
+ 5,14,35, 4,13,72, 6,24,76, 5,14,34, 0, 0, 0,15,16,18,15,16,19,15,16,20,
+ 15,16,21,15,16,22,15,16,23,15,16,24,15,16,25, 6,24,75, 5,14,32, 0, 0, 0,
+ 0, 0, 0, 6,33, 6, 4,18,54, 6,33, 1, 5,19,17, 6,33, 2, 6,33, 3, 5,19,14,
+ 6,33, 5, 5,19,18, 5,19,16, 5,19,15, 6,32,94, 6,33, 4,15,21,88,15,21,89,
+ 15,21,90,15,21,91,15,21,92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,25,53, 4,24,45, 5,25,54, 4,24,48, 6,42,49, 6,42,51, 5,25,57, 5,25,56,
+ 5,25,58, 6,42,54, 6,42,48, 6,42,53, 5,25,55, 6,42,50, 0, 0, 0,15,28,26,
+ 15,28,21,15,28,23,15,28,24,15,28,25,15,28,27,15,28,29,15,28,31,15,28,32,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,42,52,15,28,22, 0, 0, 0, 0, 0, 0, 5,25,60,
+ 6,52,14, 6,52,12, 4,30,11, 6,52, 7, 6,52,11, 4,30,10, 6,52, 8, 6,52, 5,
+ 6,52, 9, 6,52, 6, 6,52,13, 6,52,10, 6,52,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,32, 4,15,34,51,15,34,53,15,34,54,15,34,55, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,52,16, 0, 0, 0, 0, 0, 0, 6,62, 9, 5,38,70, 5,38,69,
+ 6,62,10, 6,62,11, 6,62,13, 4,36,29, 6,62, 4, 4,36,30, 5,38,71, 4,36,27,
+ 0, 0, 0, 6,62,14, 6,62,15, 6,62, 6, 0, 0, 0, 6,62, 7,15,40,92,15,40,93,
+ 15,40,94,15,41, 1, 0, 0, 0, 6,62, 8, 5,38,73, 6,62,16, 0, 0, 0, 6,62, 5,
+ 0, 0, 0, 0, 0, 0, 6,62,12, 0, 0, 0, 4,42,54, 7, 4,19, 7, 4,23, 7, 4,21,
+ 4,42,53, 4,42,52, 5,45,89, 7, 4,20, 5,45,87, 5,45,88, 7, 4,17, 7, 4,18,
+ 7, 4,16, 7, 4,15, 7, 4,22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4,24,
+ 7,15, 9, 5,53, 7, 7,15,10, 4,48,80, 5,53, 6, 4,48,83, 7,15,12,15,53,34,
+ /* plane 2, page 60 */
+ 0, 247, /* first, last */
+ 15,53,35,15,53,36,15,53,37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,15,11, 0, 0, 0,
+ 0, 0, 0, 7, 4,25, 7,24,74, 4,54,53, 4,54,52, 7,24,73, 5,59,86, 0, 0, 0,
+ 7,24,72,15,58,58,15,58,59,15,58,60, 7,24,76, 0, 0, 0, 7,24,75, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,66,21, 5,66,20, 5,66,22, 0, 0, 0, 7,32,23, 7,39,47,
+ 7,32,21, 5,66,23, 7,32,20, 7,32,22,15,63,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,66,19, 0, 0, 0,15,63,18, 7,39,50, 5,72,20, 7,39,48, 7,39,49, 0, 0, 0,
+ 0, 0, 0,15,69,33, 7,46, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,70,39, 5,80,25,
+ 7,51,49,15,71,71, 0, 0, 0, 7,56,11, 5,83,51, 0, 0, 0,15,73,50, 5,85,92,
+ 7,59,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,68,42, 6,12,40, 0, 0, 0, 6,18,16,
+ 5, 9,85, 5, 9,86, 6,19,44, 6,33, 7,15,21,93, 0, 0, 0, 6,33, 8, 6,52,17,
+ 4,36,32, 7,15,13, 7,24,77, 4,59,49,15,58,61, 6, 5,10, 6, 5, 9, 0, 0, 0,
+ 15, 4,60, 6,12,43, 6,12,42, 6,12,41, 6,18,17, 0, 0, 0, 6,18,18,15,11,63,
+ 5, 9,87, 5,14,36, 0, 0, 0,15,21,94, 5,25,61,15,28,33, 6,52,18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7, 4,27, 7, 4,26, 0, 0, 0, 0, 0, 0, 7,32,24, 7,51,50,
+ 0, 0, 0, 0, 0, 0,15, 1,71, 0, 0, 0, 6, 2, 4, 6, 5,11, 5, 1,83, 6, 5,12,
+ 15, 2,62,15, 4,73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 3, 3, 6, 5,13, 5, 4,48, 6, 5,15, 6, 5,17, 0, 0, 0, 3, 4, 4,15, 2,60,
+ 15, 4,63,15, 4,64, 0, 0, 0, 6, 5,16, 0, 0, 0, 0, 0, 0, 6,12,45, 5, 4,50,
+ 6, 8,34, 5, 4,49, 5, 4,51, 4, 4,48, 6, 8,38, 6, 8,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,12,44, 6, 8,35, 6, 8,33,
+ 6, 8,37, 6, 8,40, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 4,65, 0, 0, 0,15, 4,62,
+ 15, 4,66,15, 4,67,15, 4,68,15, 4,69,15, 4,70,15, 4,71,15, 7,67,15, 7,68,
+ 15, 7,69, 0, 0, 0, 4, 7, 3, 5, 6,79, 6,18,19, 5, 6,82, 5, 6,83, 4, 7, 1,
+ 6,12,55, 4, 7, 5, 6,12,48, 4, 7, 4, 6,12,46, 5, 6,78, 5, 6,80, 6,12,56,
+ 5, 6,81, 6,12,58, 6,18,20, 0, 0, 0, 6,12,54, 6,12,60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4, 6,92, 6,12,51,15, 7,64,15, 7,65,15, 7,66,15, 7,71,
+ 15, 7,72,15, 7,73,15, 7,74,15, 7,75,15, 7,77,15,11,68,15,11,71,15,11,76,
+ 6,12,50, 6,12,52, 6,12,53, 6,12,57, 0, 0, 0, 6,12,47, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 9,88, 4, 9,92, 6,18,22, 5,10, 2, 6,18,27,
+ 6,18,30, 5, 9,89, 4,10, 2, 4,13,81, 5,10, 1, 5, 9,94, 6,18,26, 6,18,32,
+ 5, 9,90, 6,18,33, 5, 9,93, 6,24,80, 6,18,29, 6,18,28, 4,10, 3, 4, 9,93,
+ /* plane 2, page 61 */
+ 1, 255, /* first, last */
+ 6,18,31,15,11,64,15,11,65,15,11,66,15,11,67,15,11,69,15,11,70,
+ 15,11,72,15,11,73,15,11,74,15,11,75,15,11,77,15,11,78,15,16,26,15,16,29,
+ 15,16,36, 6,18,24, 4,10, 4, 0, 0, 0, 6,18,21, 6,18,23, 5,10, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,16,55, 4,13,78, 5,14,41,
+ 6,25,16, 6,25,14, 5,14,40, 5,14,39, 6,24,92, 5,14,42, 6,24,81, 6,24,91,
+ 4,13,77, 4,13,79, 6,25, 5, 6,24,86, 6,25, 6, 6,25,10, 6,24,87, 6,25, 9,
+ 6,24,94, 6,25, 8, 6,33,10, 6,33, 9, 4,18,70, 6,25, 4, 6,25,12, 5,14,37,
+ 6,25, 3, 6,24,83, 6,25,11, 6,24,88, 6,25,15, 0, 0, 0, 6,25,18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,33,38,15,16,27,15,16,30,15,16,31,15,16,32,15,16,33,
+ 15,16,34,15,16,35,15,16,37,15,16,38,15,16,39,15,16,40,15,16,42,15,16,43,
+ 15,16,44,15,16,45,15,16,46,15,16,47,15,16,48,15,16,49,15,16,50,15,16,51,
+ 15,16,52,15,16,53,15,16,54,15,16,56,15,16,57,15,16,58, 6,24,89, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,25, 2, 0, 0, 0, 6,25,17, 0, 0, 0, 4,13,82, 0, 0, 0,
+ 6,25, 7, 6,24,93, 0, 0, 0, 0, 0, 0, 6,24,85, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,14,38, 0, 0, 0,15,22,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,18,61,
+ 5,19,32, 4,18,59, 4,18,75, 6,33,20, 6,33,24, 6,33,28, 4,18,74, 6,33,35,
+ 4,18,65, 6,33,22, 4,18,69, 6,33,21, 6,33,37, 4,18,73, 5,19,19, 6,33,17,
+ 4,18,64, 4,18,71, 6,42,68, 5,19,31, 6,33,34, 5,19,30, 6,33,31, 4,18,57,
+ 4,18,63, 6,33,12, 4, 5,15, 6,33,27, 6,33,16, 6,42,70, 5,19,24, 0, 0, 0,
+ 5,19,33, 6,42,56, 6,42,57, 6,33,30, 6,33,36, 5,19,22, 4,18,66, 6,33,32,
+ 0, 0, 0, 5,19,27, 6,33,15, 6,33,18, 5,19,26, 5,19,21, 4,18,76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,18,78, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,19,23, 6,33,29,
+ 15,22, 1,15,22, 2,15,22, 3,15,22, 5,15,22, 6,15,22, 7,15,22, 8,15,22,10,
+ 15,22,12,15,22,14,15,22,15,15,22,16,15,22,17,15,22,18,15,22,22,15,22,23,
+ 15,22,24,15,22,25,15,22,26,15,22,27,15,22,28,15,22,29,15,28,34,15,28,43,
+ 15,28,45,15,28,55,15,34,63, 6,42,55, 0, 0, 0, 6,33,19, 0, 0, 0, 6,33,23,
+ 0, 0, 0, 5,19,25, 6,33,26, 0, 0, 0, 6,33,25, 0, 0, 0, 6,33,39, 6,33,13,
+ 0, 0, 0, 6,33,14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,19,20, 5,19,28, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,24,90, 6,42,66, 6,42,80, 4,24,52, 5,25,67,
+ /* plane 2, page 62 */
+ 0, 255, /* first, last */
+ 4,24,53, 6,42,61, 6,42,63, 5,25,71, 5,25,74, 5,25,66, 6,52,40, 5,25,76,
+ 6,42,58, 4,24,51, 5,19,34, 4,24,56, 6,42,76, 6,42,60, 5,25,72, 6,42,81,
+ 6,52,21, 6,42,71, 6,42,72, 6,42,78, 5,25,64, 6,52,20, 6,42,79, 4,30,12,
+ 5,25,63, 5,25,70, 5,25,69, 5,25,68, 6,42,74, 5,25,65, 6,52,19, 6,42,82,
+ 5,25,77, 6,42,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,28,36,15,28,37,15,28,38,15,28,40,15,28,41,15,28,42,
+ 15,28,46,15,28,47,15,28,48,15,28,49,15,28,50,15,28,51,15,28,52,15,28,53,
+ 15,28,54,15,28,56,15,28,57,15,28,59,15,28,60, 0, 0, 0, 6,42,73, 5,25,73,
+ 0, 0, 0, 6,42,75, 4,24,61, 0, 0, 0, 6,42,59, 6,42,64, 6,42,62, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,25,75,15,34,83, 0, 0, 0, 6,52,33, 5,32, 5, 4,30,33,
+ 6,52,24, 4,30,20, 6,52,27, 6,52,35, 4,30,27, 4,30,35, 4,30,30, 4,30,14,
+ 6,52,42, 5,32, 9, 5,32, 6, 4,30,32, 6,62,17, 6,52,34, 4,30,26, 5,32,15,
+ 0, 0, 0, 5,32,13, 4,30,17, 6,62,18, 4,30,34, 5,32,12, 5,32,14, 6,52,30,
+ 6,52,44, 7, 4,28, 6,52,39, 4,36,43, 6,52,31, 6,52,38, 6,52,23, 6,52,22,
+ 5,32,11, 5,32, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,30,29, 6,52,28, 6,52,29, 6,52,32,
+ 6,52,37,15,34,56,15,34,57,15,34,58,15,34,59,15,34,60,15,34,61,15,34,62,
+ 15,34,64,15,34,65,15,34,66,15,34,69,15,34,70,15,34,71,15,34,72,15,34,73,
+ 15,34,74,15,34,76,15,34,77,15,34,78,15,34,79,15,34,80,15,34,81,15,34,82,
+ 15,34,85,15,41, 2,15,41,30, 0, 0, 0, 5,32,10, 0, 0, 0, 0, 0, 0, 6,52,36,
+ 4,30,21, 6,52,45, 6,52,26, 0, 0, 0, 6,52,43, 0, 0, 0,15,41,15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,34,75,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,47,76, 0, 0, 0, 6,52,25, 7, 4,29, 0, 0, 0, 4,36,52,
+ 4,36,39, 4,36,40, 4,36,44, 5,38,75, 4,36,46, 5,38,74, 5,38,84, 5,38,86,
+ 4,36,37, 4,36,51, 6,62,36, 5,38,79, 6,62,33, 6,62,26, 4,36,49, 4,36,48,
+ 5,38,85, 5,38,82, 5,38,77, 7, 4,32, 7, 4,31, 5,38,87, 6,62,37, 4,36,47,
+ 6,62,25, 6,62,34, 5,38,80, 5,38,81, 4,36,33, 6,62,29, 5,45,90, 7, 4,30,
+ 6,62,20, 5,38,78, 6,62,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,38,83,
+ /* plane 2, page 63 */
+ 0, 255, /* first, last */
+ 15,41, 3,15,41, 4,15,41, 5,15,41, 6,15,41, 7,15,41, 8,15,41, 9,15,41,11,
+ 15,41,12,15,41,13,15,41,14,15,41,16,15,41,17,15,41,20,15,41,22,15,41,23,
+ 15,41,24,15,41,25,15,41,26,15,41,28,15,41,29,15,41,33,15,41,34,15,41,35,
+ 15,47,77, 7, 2,72, 4,36,34, 6,62,28, 0, 0, 0, 6,62,35, 0, 0, 0, 6,62,21,
+ 5,38,76, 6,62,19, 6,62,23, 6,62,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,41,27, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,62,22, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,41,10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4,66, 7, 4,50, 7, 4,45, 4,42,64, 7, 4,58,
+ 7, 4,52, 7, 4,44, 4,42,69, 4,42,71, 5,46, 5, 0, 0, 0, 7, 4,67, 7, 4,46,
+ 7, 4,48, 7, 4,54, 4,42,60, 7, 4,55, 7, 4,41, 5,46, 1, 7, 4,69, 7, 4,39,
+ 7, 4,36, 4,42,70, 5,45,91, 5,46, 4, 7, 4,68, 4,42,59, 7, 4,59, 4,42,58,
+ 7, 4,57, 5,45,94, 7, 4,35, 7, 4,71, 5,46, 3, 5,45,93, 7, 4,51, 7, 4,34,
+ 7,26,73, 7, 4,37, 7, 4,72, 5,46, 2, 7, 4,33, 7, 4,62, 7, 4,70, 5,46, 6,
+ 5,46, 8, 0, 0, 0, 0, 0, 0, 5,45,92, 4,42,62, 7, 4,63, 7, 4,43, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 4,49, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,46, 7, 7, 4,60,15,47,57,15,47,58,
+ 15,47,59,15,47,60,15,47,61,15,47,62,15,47,63,15,47,66,15,47,67,15,47,68,
+ 15,47,69,15,47,70,15,47,71,15,47,72,15,47,74,15,47,75,15,47,79,15,47,80,
+ 15,47,81,15,47,82,15,47,83,15,47,84,15,47,85,15,47,86,15,47,87,15,47,88,
+ 15,47,91,15,47,92,15,53,49, 7, 4,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 4,64, 7,15,16, 4,42,67, 7, 4,38, 7, 4,61, 7, 4,40, 7, 4,42, 0, 0, 0,
+ 15,53,42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,47,94,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,41,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,48,92, 5,53,21, 5,53,20,
+ 5,53, 8, 5,53, 9, 5,53,11, 7,15,19, 5,53,16, 7,15,39, 7,15,32, 7,15,26,
+ 4,48,89, 7,15,25, 4,48,94, 5,53,19, 7,15,29, 7,15,17, 7,15,23, 7,15,38,
+ 7,15,27, 7,15,24, 7,15,35, 7,15,22, 7,15,18, 5,53,17, 5,53,10, 5,59,87,
+ 7,15,28, 7,15,41, 5,53,12, 5,59,89, 5,53,18, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,15,15, 7,15,20, 7,15,30, 7,15,33,15,53,38,15,53,40,15,53,41,
+ 15,53,43,15,53,44,15,53,47,15,53,48,15,53,50,15,53,51,15,53,52,15,53,53,
+ /* plane 2, page 64 */
+ 0, 254, /* first, last */
+ 15,53,55,15,58,77, 0, 0, 0, 0, 0, 0, 5,53,15, 7,15,31, 7,15,37, 7,15,40,
+ 7,15,42, 0, 0, 0, 0, 0, 0, 7,15,14, 0, 0, 0, 0, 0, 0, 7,15,36, 0, 0, 0,
+ 0, 0, 0, 4,49, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,47,65,
+ 15,58,70,15,58,63, 5,52,26, 5,59,92, 4,54,58, 4,54,63, 5,59,90, 7,24,90,
+ 7,24,78, 4,59,50, 5,59,91, 5,59,88, 7,24,80, 7,24,86, 7,24,79, 7,24,89,
+ 7,24,84, 7,24,83, 5,66,24, 7,24,85, 7,24,91, 5,59,93, 7,24,87, 5,53,23,
+ 0, 0, 0, 3,53,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,24,88,15,58,64,
+ 15,58,65,15,58,66,15,58,67,15,58,68,15,58,69,15,58,71,15,58,73,15,58,75,
+ 15,58,80, 7,24,82, 5,59,94, 0, 0, 0, 7,24,92, 7,24,81, 0, 0, 0, 0, 0, 0,
+ 15,53,46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,58,76,
+ 0, 0, 0, 0, 0, 0,15,58,79, 0, 0, 0,15,53,39,15,53,45,15,58,62, 7,15,21,
+ 0, 0, 0, 5,66,31, 5,66,38, 5,66,37, 4,59,61, 5,66,29, 5,66,25, 5,66,34,
+ 7,32,32, 7,32,38, 4,59,57, 5,66,43, 5,66,36, 7,32,28, 5,66,33, 5,66,42,
+ 4,59,56, 5,66,35, 7,32,39, 5,66,27, 7,32,33, 5,66,32, 7,32,40, 7,32,26,
+ 4,59,63, 4,59,53, 7,32,37, 7,32,36, 7,32,30, 5,66,26, 4,59,51, 5,66,28,
+ 5,66,30, 5,66,41, 5,66,44, 5,66,39, 7,32,31, 4,59,60, 7,32,34, 7,39,63,
+ 0, 0, 0, 0, 0, 0, 5,66,45, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,63,19,15,63,21,
+ 15,63,22,15,63,23,15,63,25,15,63,26,15,63,27,15,63,28,15,63,29,15,63,30,
+ 15,63,31,15,63,32,15,63,33,15,63,34,15,63,35,15,66,68,15,66,69,15,66,76,
+ 0, 0, 0, 7,39,62, 7,32,29, 7,32,25, 0, 0, 0, 7,32,35, 7,32,27, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,63,20,
+ 15,58,74,15,58,78, 5,66,40, 7,39,69, 7,39,60, 7,39,66, 4,63,92, 4,63,90,
+ 7,39,51, 5,72,22, 7,39,54, 7,39,52, 0, 0, 0, 7,39,59, 7,39,58, 7,39,53,
+ 5,72,21, 7,39,57, 7,39,61, 0, 0, 0, 5,76,37, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,39,65,15,66,70,15,66,71,15,66,72,15,66,73,15,66,74,
+ 15,66,77,15,66,78,15,66,79,15,66,80,15,66,81, 7,39,55, 0, 0, 0, 7,39,64,
+ 7,39,70, 7,39,68, 7,39,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,39,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,76,39, 5,76,42, 5,76,43, 7,46,11, 4,67,57, 0, 0, 0, 4,67,61,
+ 7,46,10, 7,46, 9, 5,76,40, 0, 0, 0, 4,67,60, 7,46,14, 4,67,55, 4,67,56,
+ 4,67,54, 7,46,13, 0, 0, 0, 5,80,27, 5,76,41, 5,76,44, 7,46,15,
+ /* plane 2, page 65 */
+ 5, 255, /* first, last */
+ 15,69,34,15,69,35,15,69,36,
+ 0, 0, 0, 7,46,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,70,40, 5,80,32,
+ 7,51,54, 5,80,31, 0, 0, 0, 5,80,29, 4,70,43, 7,51,52, 5,80,28, 7,51,57,
+ 7,51,51, 4,70,45, 7,51,63, 5,80,33, 7,51,53, 7,51,58,15,71,72,15,71,73,
+ 15,71,74,15,71,75,15,71,77,15,71,78,15,71,79, 0, 0, 0, 7,51,59, 0, 0, 0,
+ 7,51,60, 7,51,61, 7,51,62, 5,80,26,15,71,80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,73,53, 7,56,14, 7,51,55, 7,56,15, 5,83,52,
+ 5,80,34, 7,56,13, 5,83,53, 7,56,17, 0, 0, 0, 4,72,82, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,56,18,15,73,51,15,73,52, 0, 0, 0, 7,56,19, 7,56,16, 7,56,12,
+ 0, 0, 0, 0, 0, 0, 5,86, 1, 5,86, 2, 7,59,73, 7,59,72, 5,85,94, 0, 0, 0,
+ 0, 0, 0, 7,59,71, 5,85,93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,74,59,15,74,60,15,74,61, 7,59,74, 0, 0, 0, 7,59,70, 0, 0, 0, 0, 0, 0,
+ 7,62,86, 5,87,71, 7,62,87, 4,76,81, 7,62,84, 0, 0, 0, 5,87,70, 0, 0, 0,
+ 7,62,85, 4,76,82, 7,64,89, 7,64,88, 0, 0, 0, 7,64,87,15,76,15, 0, 0, 0,
+ 7,66,25, 4,77,56, 5,90,11, 5,90,10, 4,77,57, 0, 0, 0, 0, 0, 0, 4,77,84,
+ 5,90,73, 5,90,74, 0, 0, 0, 7,67,55, 7,68,43, 5,91,33,15,77, 6, 7,69,60,
+ 5,92,28, 0, 0, 0, 6, 3,15, 6, 5,19, 4, 3, 4, 4, 3, 5, 6, 5,18, 0, 0, 0,
+ 15, 2,63,15, 2,64,15, 2,65, 6, 5,20, 0, 0, 0, 4, 4,51, 4, 4,52, 5, 4,52,
+ 6, 8,44, 5, 4,53, 5, 4,55, 0, 0, 0,15, 4,75,15, 4,76,15, 4,77,15, 4,80,
+ 15, 4,82, 0, 0, 0, 6, 8,43, 0, 0, 0, 0, 0, 0, 5, 6,84, 4, 7, 8, 5, 6,85,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 7,79,15, 7,80,
+ 15, 7,81,15, 7,83,15, 7,84,15, 7,85,15, 7,86,15, 7,87, 0, 0, 0, 6,12,63,
+ 15, 7,82, 6,12,62, 4, 7,10, 0, 0, 0, 5, 4,54, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,10, 5, 6,18,44, 5,10, 6, 6,18,36,
+ 5,10, 7, 6,18,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,18,38,
+ 15,11,79,15,11,80,15,11,81,15,11,82,15,11,83,15,11,84,15,11,85,15,11,86,
+ 15,11,87,15,11,88,15,11,89,15,11,91,15,11,92,15,11,93,15,11,94,15,12, 1,
+ 15,12, 3, 4,10, 9, 6,18,37, 6,18,35, 0, 0, 0, 6,18,39, 0, 0, 0, 6,25,26,
+ 5,10, 8, 6,18,42,15,12, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,18,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,14,47,
+ 5,14,46, 6,25,22, 6,25,25,15,16,74, 4,18,79, 6,25,23, 4,13,84, 6,25,20,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,14,43,15,16,61,15,16,62,
+ /* plane 2, page 66 */
+ 0, 250, /* first, last */
+ 15,16,63,15,16,64,15,16,65,15,16,66,15,16,67,15,16,68,15,16,69,15,16,70,
+ 15,16,72,15,16,73,15,16,75,15,16,76,15,16,78,15,16,79,15,16,80,15,16,81,
+ 15,16,82, 5,14,44, 6,25,21, 0, 0, 0, 0, 0, 0, 6,25,27, 6,25,28, 0, 0, 0,
+ 15,16,71, 0, 0, 0, 0, 0, 0,15,16,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,25,24, 5,14,45, 0, 0, 0, 6,33,43, 4,18,84, 5,19,36,
+ 6,33,47, 4,18,83, 4,18,85, 6,33,46, 6,33,52, 6,33,49, 6,33,45, 6,33,44,
+ 6,42,83, 6,33,50, 6,33,48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,33,51,15,22, 4,15,22,30,15,22,31,15,22,32,15,22,33,15,22,35,
+ 15,22,36,15,22,37,15,22,38,15,22,39,15,22,41,15,22,42,15,22,44,15,22,45,
+ 15,22,46,15,22,48, 6,33,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,33,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,22,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,19,35, 0, 0, 0, 5,19,37,
+ 0, 0, 0, 6,33,53, 4,24,73, 6,42,88, 6,33,42, 5,25,81, 5,25,79, 6,42,94,
+ 0, 0, 0, 6,43, 1, 5,25,78, 6,42,85, 4,24,70, 6,42,90, 6,42,84, 6,42,93,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,24,67, 5,25,80, 6,42,87,15,28,62,15,28,63,15,28,64,15,28,65,
+ 15,28,66,15,28,67,15,28,68,15,28,70,15,28,71,15,28,72,15,28,73,15,28,75,
+ 15,28,76,15,28,77,15,28,78,15,28,79,15,28,80,15,28,81,15,28,82,15,28,85,
+ 15,28,87,15,28,88,15,28,89,15,28,90,15,28,91,15,28,92,15,29, 1, 6,42,89,
+ 6,42,92, 4,24,71, 0, 0, 0, 6,42,86, 6,42,91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,28,74, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,25,82,
+ 0, 0, 0, 0, 0, 0, 5,32,20, 0, 0, 0, 6,52,58, 6,52,56, 5,32,16, 6,52,54,
+ 6,52,61, 4,30,39, 6,52,55, 4,30,36, 6,52,59, 6,52,62, 4,30,37, 5,32,18,
+ 6,52,51, 6,52,67, 6,52,63, 6,52,68, 5,32,21, 0, 0, 0, 6,52,60, 6,52,66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,34,86,15,34,89,15,34,91,15,34,92,15,34,93,
+ 15,35, 1,15,35, 2,15,35, 3,15,35, 5,15,35, 6,15,35, 7,15,35, 8,15,35, 9,
+ 15,35,10,15,35,11,15,35,13,15,35,14,15,35,16,15,35,19,15,35,20,15,35,21,
+ 15,35,22,15,35,23,15,35,24,15,35,25,15,35,26,15,35,27,15,35,29,15,35,30,
+ 6,52,49, 6,52,50, 6,52,53, 0, 0, 0, 6,52,70, 0, 0, 0, 0, 0, 0, 4,30,42,
+ 6,52,65, 6,52,69, 0, 0, 0, 6,58,52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,35,12,
+ /* plane 2, page 67 */
+ 1, 255, /* first, last */
+ 5,32,19, 0, 0, 0, 5,32,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,41,52,
+ 6,62,49, 6,62,48, 5,38,94, 6,62,42, 5,39, 2, 4,36,53, 5,38,92, 5,38,91,
+ 5,38,90, 7, 4,80, 7, 4,74, 6,62,38, 5,39, 1, 6,62,39, 6,62,40, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,38,89, 6,62,43, 6,62,47,15,41,36,15,41,37,
+ 15,41,38,15,41,39,15,41,41,15,41,42,15,41,44,15,41,45,15,41,46,15,41,47,
+ 15,41,48,15,41,49,15,41,50,15,41,51,15,41,53,15,41,54,15,41,55,15,41,58,
+ 15,41,59,15,41,61,15,41,62,15,41,64,15,41,66,15,41,67,15,41,68, 0, 0, 0,
+ 4,36,61, 5,38,93, 6,62,44, 6,62,50, 6,62,41, 6,62,45, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,41,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,52,64,15,34,94,15,34,90,
+ 4,42,75, 0, 0, 0, 0, 0, 0, 5,46,12, 7, 4,84, 7, 4,77, 7, 4,73, 5,46,10,
+ 7, 4,76, 7, 4,81, 7, 4,82, 7, 4,85, 7, 4,75, 5,46, 9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,46, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,46,11, 7, 4,83,
+ 15,48, 3,15,48, 4,15,48, 6,15,48, 7,15,48, 8,15,48, 9,15,48,10,15,48,11,
+ 15,48,14,15,48,15,15,48,17,15,48,18,15,48,19,15,48,20,15,48,21,15,48,23,
+ 15,48,24,15,48,25,15,48,26,15,48,27,15,48,28, 0, 0, 0, 7, 4,78,15,48,12,
+ 0, 0, 0, 0, 0, 0, 7,10,81, 0, 0, 0,15,48,13,15,48,16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,48, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,48, 2, 5,46,14,
+ 5,46,13, 0, 0, 0, 6,62,46, 0, 0, 0, 0, 0, 0, 4,49,10, 7,15,50, 7,15,70,
+ 7,15,48, 7,15,64, 7,15,62, 5,53,27, 4,49, 7, 7,15,65, 7,15,67, 7,15,53,
+ 7, 4,79, 4,49, 8, 7,15,54, 7,15,68, 7,15,69, 4,49, 6, 7,15,56, 7,15,52,
+ 4,49, 9, 7,15,71, 5,53,26, 5,53,28, 7,15,66, 7,15,57, 0, 0, 0, 7,15,61,
+ 7,15,58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,15,43, 7,15,51,
+ 7,15,60,15,53,57,15,53,58,15,53,59,15,53,60,15,53,61,15,53,62,15,53,63,
+ 15,53,64,15,53,65,15,53,66,15,53,67,15,53,70,15,53,71,15,53,72,15,53,74,
+ 15,53,75,15,53,77,15,53,78,15,53,80,15,53,81,15,53,82, 0, 0, 0,15,53,69,
+ 5,53,24, 7,15,45, 7,15,46, 7,15,59, 0, 0, 0, 7,15,63, 7,17,90, 7,15,49,
+ 7,12,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,53,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,53,29, 5,53,25, 7,15,44,
+ 7, 4,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,15,55, 7,25, 3, 4,54,65, 7,25, 5,
+ 5,53,30, 7,25, 9, 7,25, 8, 4,54,67, 7,15,72, 5,60, 1, 7,24,93, 5,60, 4,
+ /* plane 2, page 68 */
+ 0, 254, /* first, last */
+ 5,60, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,58,81,15,58,82,15,58,86,15,58,87,
+ 15,58,88,15,58,89,15,58,90,15,58,91,15,58,92,15,58,93,15,58,94,15,59, 1,
+ 15,59, 2,15,59, 3, 7,24,94, 0, 0, 0, 0, 0, 0, 7,25, 4, 0, 0, 0, 7,25, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,60, 3, 7,25, 1,
+ 0, 0, 0, 0, 0, 0,15,53,73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,32,47, 4,59,66,
+ 7,32,46, 5,66,46, 7,32,43, 7,32,51, 7,32,49, 7,32,44, 0, 0, 0, 4,59,67,
+ 5,66,47, 5,66,48, 4,59,65, 7,32,52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,32,42,
+ 7,32,50,15,63,36,15,63,38,15,63,37,15,63,39,15,63,40,15,63,41,15,63,42,
+ 15,63,44,15,63,45, 7,32,48, 7,34, 2, 0, 0, 0, 7,32,53, 7,32,45, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,32,41, 7,25,10, 0, 0, 0, 0, 0, 0,15,65,86,15,58,84,
+ 15,58,85, 0, 0, 0, 7,39,76, 5,72,23, 4,64, 1, 0, 0, 0, 7,39,77, 4,64, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,39,74,15,66,84,15,66,85,15,66,86,
+ 15,66,87, 0, 0, 0, 7,39,73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,39,71,
+ 7,39,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,63,43, 7,39,72,15,69,37, 5,76,47, 7,46,16, 7,46,19, 7,46,27, 5,76,46,
+ 5,76,45, 5,76,49, 4,64, 3, 0, 0, 0, 7,46,18, 7,46,24, 4,67,66, 4,67,64,
+ 7,46,28, 7,46,17, 7,46,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,46,23, 0, 0, 0,
+ 15,69,40, 7,46,20,15,69,38,15,69,39,15,69,42,15,69,43,15,69,44,15,69,45,
+ 15,69,46, 0, 0, 0, 0, 0, 0, 7,46,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,46,22,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,46,26, 0, 0, 0, 5,76,48, 0, 0, 0,
+ 0, 0, 0, 7,51,68, 4,67,65, 7,51,70, 5,80,35, 0, 0, 0, 4,70,47, 7,51,71,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,51,66, 7,51,67, 0, 0, 0, 7,51,69, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,71,81, 0, 0, 0,15,71,82,15,71,83,15,71,84,
+ 15,71,85, 0, 0, 0, 7,56,22, 5,83,54, 4,74,47, 7,56,23, 7,56,24, 0, 0, 0,
+ 7,56,20,15,73,54,15,73,55,15,73,56, 7,56,21, 7,59, 4, 0, 0, 0, 0, 0, 0,
+ 7,59,78, 7,59,80, 7,59,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,60,36,
+ 7,59,79, 0, 0, 0, 7,59,76, 0, 0, 0, 7,59,75, 5,86, 3,15,74,64, 7,62,88,
+ 0, 0, 0,15,74,63, 5,87,72, 0, 0, 0, 7,65, 1, 7,64,92, 7,64,94, 7,65,24,
+ 7,64,91, 7,64,93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,66,26, 5,90,75,15,76,68,
+ 15,76,69, 0, 0, 0, 7,68,45, 7,68,44, 7,68,46, 7,69,23, 7,70,20, 5, 1,43,
+ 0, 0, 0, 6, 3,16, 6, 8,45, 6, 8,46, 5, 4,56, 0, 0, 0, 6,12,66, 6,12,65,
+ 6,12,67, 0, 0, 0, 0, 0, 0,15, 7,88,15, 7,89, 6,18,46, 5,10,11,
+ /* plane 2, page 69 */
+ 0, 255, /* first, last */
+ 5,10, 9, 6,18,47, 5,10,10, 6,18,49,15,12, 4,15,12, 5,15,12, 6, 6,18,45,
+ 0, 0, 0, 0, 0, 0, 6,18,48, 0, 0, 0, 5,14,49, 0, 0, 0, 5,14,48,15,16,83,
+ 6,33,55, 6,33,54, 6,33,56,15,22,49, 4,24,74, 6,43, 2, 0, 0, 0, 6,39,35,
+ 6,45,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,52,72, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,52,73, 0, 0, 0, 6,62,51, 5,39, 3, 6,62,54, 6,62,53, 6,62,52, 7, 4,90,
+ 5,46,15, 7, 4,87, 7, 4,89, 0, 0, 0, 7, 4,88, 0, 0, 0, 7,15,73, 0, 0, 0,
+ 7,15,74, 5,53,31, 4,54,69,15,59, 4,15,59, 5,15,59, 6, 0, 0, 0, 0, 0, 0,
+ 15,53,83, 7,32,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,72,24, 0, 0, 0,15,69,47,15,69,48, 0, 0, 0, 7,46,29, 0, 0, 0, 0, 0, 0,
+ 7,51,72, 7,59,81, 0, 0, 0, 7,62,89, 0, 0, 0, 7,65, 2,15, 4,83,15, 4,84,
+ 6,12,68, 6,12,69, 0, 0, 0, 6,33,57, 0, 0, 0, 6,33,58,15,29, 2,15,29, 3,
+ 6,52,74,15,41,69, 5,39, 4, 5,53,32,15, 1,72, 6,11,75, 5,10,12, 4,10,11,
+ 4,13,87,15,16,84, 5,17,76, 6,43, 3, 6,52,76, 6,52,75, 5,53,33, 7, 4,91,
+ 7, 4,92, 5,53,34, 6, 2, 5, 6, 3,17, 0, 0, 0, 6, 5,21, 6, 8,47, 4, 7,13,
+ 6,12,71, 6,12,70, 6,18,50, 4,10,13, 6,18,51, 6,18,52, 6,25,30, 4,13,88,
+ 0, 0, 0,15,16,85, 6,25,29, 6,33,59, 6,33,62, 6,33,61, 4,18,88, 0, 0, 0,
+ 0, 0, 0, 6,33,60,15,22,50,15,22,51, 0, 0, 0, 6,43, 8, 6,43, 4, 6,43, 6,
+ 6,43, 7, 6,43, 9, 6,43, 5, 6,45,56, 6,52,77, 6,52,78,15,35,31, 6,62,56,
+ 6,62,57,15,41,70, 0, 0, 0, 7, 4,93,15,48,30, 7, 4,94, 5,53,35, 5,66,49,
+ 4,49,12, 7,15,75, 7, 5, 1, 5,53,36, 7,25,11, 7,25,12, 5,60, 5, 0, 0, 0,
+ 7,39,80, 0, 0, 0, 5,76,50, 7,56,25, 7,59,82, 7,67,56, 5,91,34, 7,68,47,
+ 15, 1,73, 6, 8,49, 5, 4,57, 6, 8,48, 4, 7,14, 6,12,75, 6,12,74, 6,12,73,
+ 6,12,72, 6,18,54, 6,18,53, 5,10,13, 6,18,55, 0, 0, 0, 0, 0, 0, 5,10,14,
+ 0, 0, 0, 0, 0, 0, 5,14,50, 4,13,89, 4,13,91, 6,25,33, 6,25,31, 0, 0, 0,
+ 5,19,38, 5,19,39, 6,33,63, 0, 0, 0, 6,33,66, 6,33,64, 0, 0, 0, 6,43,11,
+ 4,24,77, 6,43,14, 6,43,10, 6,43,12, 6,43,13, 5,25,83, 5,25,86, 5,25,84,
+ 0, 0, 0, 5,25,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,24,78,
+ 5,32,24, 6,52,79, 4,30,45, 5,32,22, 5,32,23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,52,80,15,29, 4, 5,39, 5, 6,62,59, 0, 0, 0, 6,62,60, 6,62,58,15,41,71,
+ 5,46,18, 7, 5, 5, 5,46,17, 5,46,16, 5,46,19, 7, 5, 4, 7, 5, 2, 5,46,20,
+ 0, 0, 0, 7, 5, 3, 0, 0, 0, 5,53,38, 5,53,39, 5,53,40, 7,15,77, 5,53,37,
+ 7,15,76, 0, 0, 0, 5,60, 6, 4,54,70,15,59, 7,15,59, 8, 0, 0, 0, 5,66,51,
+ /* plane 2, page 70 */
+ 0, 255, /* first, last */
+ 5,66,50, 0, 0, 0, 0, 0, 0, 5,76,51, 7,51,73, 5, 3,72, 0, 0, 0, 0, 0, 0,
+ 6,25,35, 6,25,34, 0, 0, 0, 0, 0, 0, 4,24,79, 6,43,15,15,29, 5,15,29, 6,
+ 6,52,81, 6,62,61, 0, 0, 0, 0, 0, 0, 5, 1,85,15, 2,67, 6, 5,22,15, 2,66,
+ 6, 8,51,15, 4,85, 6, 8,50, 6, 8,52, 5, 6,89, 5, 7, 2, 5, 6,88, 5, 6,91,
+ 5, 6,86, 5, 6,93, 6,12,78, 4, 7,16, 5, 7, 1, 6,12,76, 5, 6,94, 5, 7, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6,92, 6,12,77,15, 7,91,15, 7,92,15, 7,94,
+ 15, 8, 1, 0, 0, 0, 5, 6,90, 6,12,79, 6,12,80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,10,18, 5,10,16, 5,10,15, 6,18,63, 6,18,60, 5,10,19, 5,10,17, 4,10,16,
+ 6,18,58, 0, 0, 0, 6,18,57,15,12, 8,15,12, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,18,59, 6,18,62, 0, 0, 0, 6,18,56, 6,18,61, 0, 0, 0, 5,10,20,
+ 15, 7,93, 5,14,56, 5,14,52, 5,14,54, 5,14,55, 5,14,53, 0, 0, 0, 6,25,36,
+ 5,14,57, 0, 0, 0, 0, 0, 0, 4,18,91, 6,33,71, 6,33,72, 5,19,41, 5,25,87,
+ 4,18,93, 4,18,92, 5,19,43, 0, 0, 0, 5,19,44, 0, 0, 0,15,22,52,15,22,53,
+ 6,33,69, 0, 0, 0, 6,33,73, 6,33,68, 0, 0, 0, 5,19,40, 0, 0, 0, 0, 0, 0,
+ 4,24,81, 4,24,84, 5,25,93, 6,43,20, 5,25,89, 5,25,91, 0, 0, 0, 5,25,88,
+ 6,43,18, 6,43,21,15,29, 7,15,29, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,43,19, 6,43,16, 6,43,17, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,25,90, 5,25,92, 5,19,42,15,29, 9, 6,43,22, 5,39,11, 5,32,30, 5,32,28,
+ 4,30,48, 6,62,68, 6,52,83, 5,39, 6, 6,52,82, 6,52,85, 6,52,84, 0, 0, 0,
+ 15,35,32,15,35,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,32,29, 0, 0, 0,
+ 6,52,87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,32,27, 4,36,65, 5,39,13, 5,39, 8, 5,39,14, 5,39,12, 6,62,63, 6,62,67,
+ 5,39, 7, 5,39,10, 6,62,71, 6,62,66, 6,62,65, 5,32,26, 6,62,70, 0, 0, 0,
+ 15,41,72,15,41,73,15,41,74,15,41,75, 5,39,15, 5,39, 9, 6,62,64, 6,52,86,
+ 0, 0, 0, 0, 0, 0, 6,62,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,41,76, 5,39,16, 5,46,22, 7, 5, 6, 4,42,84, 5,46,25, 5,46,26, 5,46,24,
+ 4,42,80, 5,46,21, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,48,31, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5, 7,
+ 0, 0, 0, 7,15,80, 5,53,41, 5,53,46, 7,15,81, 5,53,43, 5,53,45, 5,53,42,
+ 0, 0, 0, 5,53,44, 0, 0, 0, 7,15,79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,25,16,
+ 7,25,14, 5,60, 7, 4,54,72, 4,54,73, 7,15,78, 0, 0, 0, 7,25,15, 0, 0, 0,
+ 0, 0, 0, 7,32,55, 7,32,56, 5,72,26, 0, 0, 0, 7,51,74, 7,39,82, 7,39,83,
+ /* plane 2, page 71 */
+ 0, 253, /* first, last */
+ 7,39,81, 0, 0, 0, 5,72,25, 7,46,31, 5,76,52, 5,76,53, 0, 0, 0, 5,80,37,
+ 7,51,76, 5,80,36, 0, 0, 0, 5,80,38, 7,56,26, 5,83,57, 0, 0, 0, 7,59,84,
+ 5,83,56, 7,59,85, 7,59,83, 0, 0, 0, 5,87,73, 0, 0, 0, 7,65, 3,15,76,17,
+ 0, 0, 0, 7,68,48,15, 1,29, 6, 3,18, 5, 1,87, 5, 1,88, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 2,88, 5, 2,91, 5, 2,87, 4, 3, 8, 0, 0, 0, 5, 2,90, 0, 0, 0,
+ 6, 5,23, 0, 0, 0, 0, 0, 0, 5, 2,89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4,62,
+ 5, 4,63, 4, 4,59, 4, 7,23, 6, 8,56, 4, 4,58, 5, 4,58, 6, 8,62, 5, 4,59,
+ 6, 8,59, 5, 7,15, 6,12,82, 4, 4,55, 5, 4,61, 5, 4,60, 6, 8,58, 6, 8,57,
+ 6,12,83,15, 4,87, 6, 8,55, 6, 8,60, 0, 0, 0, 0, 0, 0, 6, 8,61, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8,54, 4, 4,56, 0, 0, 0, 6,12,90,
+ 5, 7, 8, 6,12,91, 5, 7,12, 6,12,89, 6,12,92, 5, 7, 7, 5, 7,10, 6,12,88,
+ 5, 7,13, 5, 7, 5, 5, 7, 9, 5, 7, 4, 6,12,87, 0, 0, 0, 4, 7,24, 5,10,22,
+ 6, 8,53, 6,18,64, 0, 0, 0, 5, 7,11, 6,12,86,15, 8, 2, 6,12,93, 0, 0, 0,
+ 6,12,84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7,21, 0, 0, 0, 5,10,21, 5,10,30,
+ 6,18,72, 5,10,25, 6,25,43, 5,10,29, 6,18,65, 6,25,44, 6,33,76, 5,10,28,
+ 4,10,17, 5,10,27, 6,18,68, 5,10,26, 6,18,70, 4,10,19, 5,10,32, 6,18,67,
+ 5, 7, 6, 5,10,23, 5,10,24, 0, 0, 0,15,12,10,15,12,12,15,12,13, 0, 0, 0,
+ 6,18,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,12,11,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,10,31,
+ 0, 0, 0, 6,25,46, 5,14,62, 4,19, 1, 6,25,41, 6,25,45, 4,14, 5, 5,14,59,
+ 5,14,64, 5,14,61, 4,14, 3, 6,25,37, 0, 0, 0, 6,25,42, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,16,87,15,16,88, 0, 0, 0, 6,25,40,
+ 5,14,58, 0, 0, 0, 4,14, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,25,39, 6,25,47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,14,63, 6,25,38,
+ 5,19,46,15,16,86, 0, 0, 0, 4,19, 4, 6,33,78, 5,19,53, 5,25,94, 5,19,50,
+ 6,33,80, 6,33,83, 5,19,47, 6,33,79, 6,43,27, 4,19, 6, 5,19,51, 6,43,24,
+ 6,43,23, 5,19,48, 6,43,25, 0, 0, 0, 6,33,81, 6,33,82, 0, 0, 0, 6,33,84,
+ 0, 0, 0, 6,43,26, 5,26, 8, 0, 0, 0, 6,52,91, 5,26, 6, 5,32,31, 4,24,85,
+ 5,26, 2, 6,43,36, 5,32,32, 5,26, 7, 4,24,86, 5,26, 5, 5,26, 4, 4,24,88,
+ 6,43,31, 4,30,49, 5,26, 1, 6,43,28, 6,43,30, 4,30,55, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,29,10,15,29,11, 6,52,89, 6,50,82, 6,52,90, 0, 0, 0,
+ 6,43,32, 0, 0, 0, 6,43,33, 6,43,37, 0, 0, 0, 6,43,29,
+ /* plane 2, page 72 */
+ 7, 252, /* first, last */
+ 5,26, 3,
+ 0, 0, 0, 0, 0, 0,15,35,35, 0, 0, 0, 0, 0, 0, 4,30,54, 5,32,40, 6,53, 2,
+ 5,32,39, 4,30,53, 6,53, 7, 5,32,43, 6,53, 4, 6,52,94, 6,52,93, 6,53, 6,
+ 5,32,38, 5,32,36, 5,32,35, 0, 0, 0, 6,53, 1, 5,32,34, 6,53, 8, 5,32,42,
+ 5,32,33, 4,30,56, 0, 0, 0, 0, 0, 0, 5,32,41, 6,53, 5,15,35,37,15,35,38,
+ 15,41,80,15,48,32, 0, 0, 0, 5,32,37, 6,53, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,32,44, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,62,77, 5,39,26, 6,62,73, 7, 5, 9, 5,39,23, 4,36,75, 5,39,21,
+ 5,39,19, 6,62,76, 5,39,27, 5,39,22, 5,39,20, 6,62,80, 4,36,76, 5,39,17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,41,77, 7, 5,10, 0, 0, 0,
+ 15,41,79, 6,62,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,62,72,
+ 6,62,74, 6,62,79, 0, 0, 0, 0, 0, 0, 4,42,93, 5,39,29, 5,39,28, 5,39,25,
+ 5,39,24, 6,62,81, 5,39,18, 7, 5,17, 4,42,88, 4,42,89, 7, 5,16, 5,46,28,
+ 7, 5,20, 7,15,83, 5,46,33, 7, 5,15, 7, 5,11, 5,46,30, 5,46,37, 0, 0, 0,
+ 5,46,27, 5,46,36, 5,46,35, 5,46,29, 5,53,47, 7,15,82, 5,46,31, 0, 0, 0,
+ 0, 0, 0, 5,46,32, 5,46,38, 7, 5,12, 7, 5,13,15,53,85, 0, 0, 0, 5,53,48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5,14, 0, 0, 0, 7, 5,19, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,41,78, 4,49,19, 5,46,34, 5,53,55, 4,49,21, 5,53,53, 5,53,49,
+ 5,53,50, 7,15,89, 4,49,17, 7,15,88, 7,15,87, 5,60, 8, 4,49,22, 5,53,51,
+ 5,53,54, 7,15,85, 7,25,18, 0, 0, 0, 4,54,77, 7,25,17, 7,15,86, 0, 0, 0,
+ 7, 5,18,15,53,87, 7, 5,21, 5,53,52, 0, 0, 0, 0, 0, 0, 5,60,10, 7,25,19,
+ 5,60, 9, 7,39,87, 7,25,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,25,20,
+ 15,59, 9,15,59,10,15,59,11,15,59,12, 7,32,61, 5,66,53, 5,66,52, 7,32,58,
+ 7,32,57, 7,32,60, 4,59,72, 7,32,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,63,46,15,63,47, 0, 0, 0, 5,66,54, 0, 0, 0, 4,67,68, 0, 0, 0, 0, 0, 0,
+ 7,39,88, 7,46,32, 7,39,86, 7,39,84, 0, 0, 0, 7,46,33, 5,76,54, 0, 0, 0,
+ 7,46,34, 5,80,40, 7,51,77, 5,80,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,72,84,
+ 5,80,41, 7,56,27, 0, 0, 0, 7,59,86, 7,59,88, 7,59,87, 0, 0, 0, 5,87,74,
+ 7,62,90, 0, 0, 0,15,75,53, 7,65, 4, 7,67,57, 0, 0, 0,15, 8, 3, 6,43,38,
+ 6,62,82, 5, 1,44, 6, 5,24, 6, 3,19, 0, 0, 0, 0, 0, 0, 6, 8,63, 5, 4,65,
+ 4, 4,61, 0, 0, 0, 4, 4,60, 0, 0, 0, 6, 8,65, 6, 8,64, 0, 0, 0,15, 4,89,
+ 5, 4,64, 5, 7,16, 6,13, 5, 4, 7,28, 5,10,33,
+ /* plane 2, page 73 */
+ 2, 255, /* first, last */
+ 15, 8, 5,15, 8, 6,15, 8, 7,15, 8, 8,15, 8, 9, 0, 0, 0,
+ 6,13, 3, 0, 0, 0, 0, 0, 0,15,12,32,15, 8, 4, 6,13, 2,15,12,28, 6,18,73,
+ 5,10,37, 5,10,34, 4,10,22, 6,18,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,15,73, 0, 0, 0,15,12,15,15,12,16,15,12,17,15,12,19,15,12,20,15,12,21,
+ 15,12,22,15,12,23,15,12,24,15,12,26,15,12,27,15,12,29, 0, 0, 0, 0, 0, 0,
+ 6,18,74, 0, 0, 0, 6,18,76,15,12,30,15,12,31, 0, 0, 0, 0, 0, 0,15,12,14,
+ 0, 0, 0, 5,10,36, 5,10,35, 0, 0, 0, 0, 0, 0, 6,25,51, 5,19,54, 5,14,65,
+ 4,14, 9, 6,25,49, 4,14, 8, 6,25,50, 6,25,52, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,16,89,15,16,90,15,16,91,15,16,92,15,16,93,
+ 15,16,94,15,17, 1,15,17, 3,15,17, 4,15,17, 5,15,17, 6, 6,25,48,15,22,67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,19,17, 6,25,53, 6,33,90, 5,19,55,
+ 6,33,91, 4,19,18, 6,33,87, 6,33,88, 6,33,89, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,17, 2,15,22,54,15,22,56,15,22,60,
+ 15,22,63,15,22,64,15,22,65,15,22,66,15,22,68,15,22,61, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,33,92, 0, 0, 0, 0, 0, 0,15,22,59,15,22,58,15,22,62, 5,19,56,
+ 6,33,86,15,29,30, 0, 0, 0,15,29,20, 6,43,43, 5,26,11, 5,26,10, 5,26,12,
+ 6,53, 9, 4,30,58, 0, 0, 0, 5,32,45, 0, 0, 0,15,29,24, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,24,92, 6,43,41, 6,43,44,15,29,12,15,29,13,15,29,14,15,29,15,15,29,16,
+ 15,29,18,15,29,21,15,29,22,15,29,23,15,29,25,15,29,26,15,29,31,15,35,48,
+ 6,43,46, 6,53,18, 6,43,45, 0, 0, 0,15,29,32, 6,43,40, 6,43,42, 0, 0, 0,
+ 6,53,10, 0, 0, 0, 0, 0, 0,15,29,19,15,29,29,15,29,17, 5,26, 9, 6,53,11,
+ 6,53,16, 4,30,59, 6,53,17, 6,53,15, 6,53,14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,39,30,15,35,39,15,35,42,15,35,44,
+ 15,35,45,15,35,46,15,35,47,15,35,49,15,35,50,15,35,51,15,35,52,15,35,53,
+ 15,35,55,15,35,56,15,35,58,15,35,59,15,35,60,15,35,61,15,35,62,15,35,63,
+ 15,35,64,15,35,65,15,35,66,15,35,67,15,35,69, 0, 0, 0, 6,53,12, 5,32,47,
+ 0, 0, 0, 5,26,14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,35,43,15,35,40,
+ 5,39,31, 0, 0, 0, 6,53,13,15,35,57,15,41,90,15,41,91,15,42, 6, 7, 5,24,
+ 0, 0, 0, 0, 0, 0, 6,62,84, 5,39,33, 7, 5,22, 4,36,77, 5,39,32, 6,62,85,
+ 6,62,87, 0, 0, 0, 6,62,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,62,83,15,41,81,15,41,82,15,41,83,15,41,84,15,41,85,
+ /* plane 2, page 74 */
+ 0, 254, /* first, last */
+ 15,41,87,15,41,88,15,41,89,15,41,92,15,41,93,15,41,94,15,42, 1,15,42, 2,
+ 15,42, 4,15,42, 5,15,42, 7,15,42, 8,15,42, 9, 5,39,34, 0, 0, 0, 3,40, 6,
+ 7, 5,25, 0, 0, 0, 0, 0, 0,15,42, 3, 7, 5,32, 4,42,94, 5,46,39, 7,15,91,
+ 7, 5,26, 7,15,90, 7, 5,28, 7, 5,31, 7, 5,33, 7, 5,34, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,48,33,15,48,34,15,48,35,15,48,36,15,48,37,
+ 15,48,38,15,48,40,15,48,41,15,48,42,15,48,43,15,48,44, 0, 0, 0, 0, 0, 0,
+ 7, 5,29, 5,46,40, 7, 5,27, 5,46,41,15,53,92,15,54,14,15,48,39, 0, 0, 0,
+ 7,16, 2, 7, 5,30, 5,53,56, 5,53,59, 5,53,57, 4,49,27, 7,16, 4, 7,15,93,
+ 7,15,94, 7,15,92, 0, 0, 0, 4,49,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,16, 1,15,53,88,15,53,89,15,53,91,15,53,93,15,54, 3,
+ 15,54, 4,15,54, 5,15,54, 6,15,54, 7,15,54, 9,15,54,13,15,54,15, 7,16, 5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,16, 3, 7,25,22,15,54,16,15,54, 1,15,54, 8,
+ 5,53,60, 5,53,58,15,54,12, 7,25,27, 7,25,29, 5,60,13, 5,60,11, 7,32,62,
+ 7,25,25, 4,59,74, 4,54,78, 0, 0, 0, 4,54,80, 7,25,24, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,59,14,15,59,15,15,59,16,15,59,17,15,59,18,
+ 15,59,19,15,59,20,15,59,21, 5,60,12, 7,25,26, 7,25,28, 7,25,23, 7,32,63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,72,28, 4,59,75, 5,66,55, 4,64, 6, 7,32,64,
+ 4,64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,63,49,
+ 15,63,51,15,63,52,15,63,53,15,63,55,15,63,57,15,63,58,15,63,59,15,63,60,
+ 15,63,63, 0, 0, 0, 7,32,65, 7,32,66,15,63,48,15,63,50,15,63,56, 0, 0, 0,
+ 15,67, 3, 7,39,92, 7,39,91, 5,72,30, 7,39,90, 7,46,35, 5,72,29, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,39,89,15,66,92,15,66,94,15,67, 1,
+ 15,67, 2, 4,64, 9,15,66,89, 0, 0, 0,15,66,90,15,66,93, 7,51,79, 5,76,55,
+ 4,70,50,15,69,50,15,69,51,15,69,52,15,69,53, 7,46,36, 7,51,78, 0, 0, 0,
+ 15,63,62, 4,70,49, 7,53,92, 0, 0, 0, 4,70,51, 7,56,28, 0, 0, 0, 0, 0, 0,
+ 15,71,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,59,89, 4,74,50,15,73,57,15,73,58,
+ 5,86, 4, 0, 0, 0,15,74,65,15,74,67,15,75,54, 0, 0, 0, 0, 0, 0,15,74,66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,89,17, 7,65, 6, 7,65, 5,15,76,18, 0, 0, 0,
+ 5,90,12, 4,78,20, 6,13, 6, 5,10,39, 5,10,38, 6,18,77,15,12,33, 6,18,78,
+ 6,25,54, 5,14,67, 5,14,68, 6,25,55, 6,25,56, 4,19,22, 5,19,57, 5,19,58,
+ 15,22,69, 0, 0, 0, 5,26,15, 5,26,16, 6,43,47,15,29,33, 6,43,48,
+ /* plane 2, page 75 */
+ 1, 254, /* first, last */
+ 4,30,60, 5,32,48, 5,32,49,15,35,70, 0, 0, 0, 0, 0, 0, 7, 5,37,
+ 6,62,88, 5,39,35, 0, 0, 0,15,42,10, 5,39,36, 7, 5,36, 7,16, 6, 4,49,29,
+ 5,46,42,15,48,45, 7, 5,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,49,30, 7,25,30,
+ 5,66,56,15,63,64, 4,59,77, 4,70,52, 7,51,80, 5,80,42, 0, 0, 0, 0, 0, 0,
+ 5,86, 5, 7,59,90, 7,62,91, 7,66,27, 7,66,28, 0, 0, 0, 5, 4,66, 0, 0, 0,
+ 5, 7,17, 4, 7,29, 6,13, 7, 0, 0, 0, 5,10,40, 5,10,41, 6,18,79, 4,10,27,
+ 4,10,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,14,69, 5,14,71, 6,25,60, 5,14,70,
+ 0, 0, 0,15,17, 9, 6,25,59, 6,25,57, 6,25,58, 0, 0, 0, 5,19,61, 6,34, 2,
+ 6,33,94, 6,34, 4, 5,19,62, 6,34, 3, 5,19,60,15,22,70,15,22,72, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,25, 2, 5,26,17, 6,53,22, 4,25, 7,
+ 5,26,20, 5,26,19, 5,19,63, 6,43,50, 5,26,18, 5,19,59, 0, 0, 0, 6,43,49,
+ 6,43,51, 0, 0, 0, 0, 0, 0, 4,30,68, 5,32,50, 6,53,23, 4,30,62, 5,32,51,
+ 6,53,19, 6,53,21, 4,30,63, 6,53,24, 0, 0, 0,15,35,71, 6,53,20, 5,39,39,
+ 6,62,92, 5,39,37, 6,62,90, 0, 0, 0, 4,36,82, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,62,89, 0, 0, 0, 0, 0, 0, 6,62,91, 5,39,38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,43, 8, 7, 5,42, 5,46,44, 5,46,45, 5,46,46, 7, 5,38, 7, 5,39,
+ 7, 5,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,16, 7, 4,54,84, 7,16, 8,
+ 5,53,63, 5,53,65, 4,49,32, 5,53,64, 0, 0, 0, 5,53,62, 4,54,86, 5,60,14,
+ 4,54,87, 0, 0, 0, 0, 0, 0, 7,25,32, 7,25,31, 0, 0, 0, 5,46,43, 0, 0, 0,
+ 4,59,80, 5,66,59, 5,66,58, 7,32,68, 5,66,57, 7,32,69, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,72,31, 7,46,37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,51,81, 7,51,82,
+ 4,70,54, 5,80,43, 4,70,53, 7,51,83, 0, 0, 0, 4,72,86, 7,56,29, 5,83,58,
+ 5,86, 8, 5,86, 7, 7,59,91, 5,86, 6, 0, 0, 0, 7,60,75, 0, 0, 0, 0, 0, 0,
+ 5,90,76, 7,69,24, 6, 3,20, 6,13, 8, 5, 7,19, 4, 7,30, 0, 0, 0, 0, 0, 0,
+ 15, 8,11, 6,18,80, 0, 0, 0,15,12,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,32,52,
+ 6,62,93, 7,16,11, 0, 0, 0, 7,16, 9, 7,16,10, 4,54,89, 7,32,70, 0, 0, 0,
+ 5,80,44, 0, 0, 0, 0, 0, 0, 6, 3,21, 6, 5,25, 6,13, 9, 5, 7,20, 6,13,10,
+ 15,12,36,15,12,37, 5,10,42, 4,10,31, 0, 0, 0, 6,18,81, 6,20,89, 5,14,73,
+ 6,34, 6, 5,19,64, 6,34, 5, 6,34, 7,15,22,73, 0, 0, 0, 6,53,25, 6,43,52,
+ 0, 0, 0, 0, 0, 0,15,29,35,15,29,34, 6,53,27, 0, 0, 0,15,35,72, 6,53,26,
+ 0, 0, 0, 0, 0, 0, 6,62,94, 7, 5,43,15,42,11, 0, 0, 0, 0, 0, 0, 4,54,90,
+ 0, 0, 0,15,59,22, 0, 0, 0, 0, 0, 0,15,67, 6, 7,38,78,15,67, 5,
+ /* plane 2, page 76 */
+ 0, 255, /* first, last */
+ 7,51,84, 0, 0, 0, 0, 0, 0, 6, 5,26,15, 4,90, 5, 7,21, 6,13,14, 6,25,61,
+ 5,19,65, 0, 0, 0,15,42,12, 0, 0, 0, 0, 0, 0,15,63,65, 7,39,93, 0, 0, 0,
+ 15,76,19, 5,83,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4,63, 0, 0, 0,15, 4,92,
+ 0, 0, 0,15, 4,91, 0, 0, 0, 6, 8,67, 0, 0, 0, 4, 7,34, 4, 5,51, 4, 7,31,
+ 5, 7,22, 6,13,17, 6,13,16, 6,13,19,15, 8,12,15, 8,13, 0, 0, 0, 0, 0, 0,
+ 6,13,15, 4,10,34, 5,10,45, 6,18,84, 5,10,44, 6,18,83, 5,10,43, 6,18,86,
+ 6,18,90, 6,18,87, 6,25,69, 5,10,46, 6,18,88, 6,18,85, 5,14,78, 0, 0, 0,
+ 15,12,38,15,12,39,15,12,40,15,12,41,15,12,43,15,12,44,15,12,45,15,12,46,
+ 15,12,47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,10,47, 5,14,74, 4,14,14, 5,14,75, 6,25,65,
+ 6,25,64, 0, 0, 0, 6,25,66, 0, 0, 0, 0, 0, 0, 6,25,63, 6,25,67,15,17,10,
+ 15,17,11,15,17,12,15,17,14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,14,16,15,17,13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,14,77, 5,14,76, 4,19,30, 6,34, 8, 5,19,67,
+ 5,19,66, 4,19,29, 6,34,12, 6,34,15, 6,34,10, 6,34,13, 6,34,14,15,22,75,
+ 15,22,76, 6,34,11, 0, 0, 0, 6,34, 9, 0, 0, 0, 0, 0, 0, 6,33,75, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,25,11, 4,25, 9, 4,25,10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,43,55, 6,43,57,15,22,74,15,29,38,15,29,39,
+ 15,29,40, 0, 0, 0, 0, 0, 0, 6,43,56, 0, 0, 0, 4,25,13, 6,43,53,15,29,36,
+ 15,29,37, 6,53,32, 4,30,74, 4,30,71, 6,53,30, 6,53,31, 4,30,70, 5,32,54,
+ 6,53,28, 6,53,34, 5,32,53, 6,53,35, 6,53,36, 6,53,33, 0, 0, 0, 0, 0, 0,
+ 15,35,73,15,35,74, 0, 0, 0, 5,32,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,53,29,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,63, 3, 4,36,90, 5,39,42, 6,63, 2, 6,63, 5,
+ 6,63, 8,15,42,13, 6,63, 6, 0, 0, 0, 0, 0, 0, 6,63, 4, 6,63, 7, 7, 5,48,
+ 4,43,12, 7, 5,44, 7, 5,46, 7, 5,45, 0, 0, 0, 7, 5,47, 5,46,47, 7, 5,49,
+ 15,48,47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,43,11, 0, 0, 0, 0, 0, 0,
+ 4,49,37, 4,49,35, 4,49,38, 7,16,12, 5,53,66,15,54,18, 0, 0, 0, 7,12,27,
+ 0, 0, 0, 0, 0, 0, 7,25,33, 5,60,19, 7,25,35, 5,60,17, 4,54,91, 7,25,34,
+ 5,60,20, 0, 0, 0,15,59,23, 7,28,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,60,16,
+ 5,60,18,15,54,17, 0, 0, 0, 0, 0, 0, 4,59,81, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,39,94, 5,72,33, 7,40, 3, 7,46,38, 7,40, 1, 7,40, 4, 4,64,13,
+ 0, 0, 0, 0, 0, 0, 7,40, 2, 7,46,40, 0, 0, 0, 0, 0, 0, 7,46,39, 0, 0, 0,
+ 0, 0, 0, 7,51,87,15,71,87, 7,51,85, 7,51,86, 0, 0, 0,15,71,50, 7,56,30,
+ /* plane 2, page 77 */
+ 0, 255, /* first, last */
+ 4,72,87, 7,51,88, 7,59,93,15,74,68, 7,59,92, 7,62,92, 0, 0, 0, 7,66,30,
+ 7,66,29, 0, 0, 0, 0, 0, 0, 7,67,58, 7,67,60, 0, 0, 0, 7,67,59, 0, 0, 0,
+ 7,70, 9, 7,70,21, 7,70,38, 6, 3,22, 0, 0, 0, 6, 5,27,15, 8,14, 4,14,18,
+ 5,10,48, 4,25,14, 0, 0, 0, 0, 0, 0, 6,53,38, 6,53,37, 6,63, 9, 5,53,67,
+ 7,16,14, 7, 5,50, 0, 0, 0, 0, 0, 0, 7,56,31, 5, 2,92, 5, 4,68, 5, 4,69,
+ 4, 4,64, 6, 8,70, 6, 8,71, 6, 8,69, 0, 0, 0, 0, 0, 0, 6, 8,72, 4, 7,37,
+ 6,13,21, 4, 7,36,15, 8,15, 5, 7,24, 6,13,22, 0, 0, 0, 0, 0, 0, 6,18,93,
+ 4,10,43, 6,18,92, 6,18,91, 5,10,50, 5,10,54, 4,10,39, 4,10,40, 5,10,51,
+ 4,10,37, 5,10,52, 5,10,49, 5,10,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,19, 4,
+ 15,12,48, 0, 0, 0, 0, 0, 0, 6,18,94,15,12,49, 6,19, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,19, 3, 0, 0, 0, 0, 0, 0, 6,19, 1, 0, 0, 0, 0, 0, 0, 6,25,73,
+ 5,14,79, 5,14,83, 6,25,79, 5,14,81, 6,25,80, 6,25,74, 5,14,86, 5,14,82,
+ 5,14,85, 6,25,77, 6,25,81, 6,25,70, 4,14,29, 5,14,84, 6,25,72, 4,14,30,
+ 5,14,80, 6,25,78,15,17,15, 6,25,71, 0, 0, 0, 6,25,76, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,34,17,
+ 6,34,23, 5,19,72, 6,34,21, 5,19,75, 4,19,33, 5,19,74, 5,19,70, 6,34,19,
+ 4,19,36, 5,19,73,15,22,77,15,22,78,15,22,79, 6,34,22, 6,34,25, 0, 0, 0,
+ 0, 0, 0, 6,34,20, 6,34,24,15,22,80, 6,34,16, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,19,71, 5,19,76, 5,26,22, 5,26,31, 6,43,65,
+ 5,26,21, 6,43,69, 5,26,25, 5,26,26, 5,26,28, 5,26,23, 6,43,67, 6,43,63,
+ 5,26,32, 6,43,66, 6,43,59, 6,43,70, 5,26,30, 6,43,62, 0, 0, 0, 0, 0, 0,
+ 4,25,25, 6,43,61, 6,43,64, 6,43,68,15,29,41,15,29,42, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,25,23, 6,43,60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,25,17, 5,26,24, 6,53,44, 4,30,82, 4,30,80, 4,30,91, 5,32,57, 4,30,81,
+ 4,30,85, 4,36,93, 4,30,89, 6,53,41, 5,32,58, 5,32,60, 5,32,66, 4,30,92,
+ 6,53,39, 5,32,65, 0, 0, 0, 6,53,45, 5,32,69, 5,32,67, 5,32,59, 5,26,29,
+ 5,32,63, 5,32,62, 6,53,43, 6,53,42, 4,30,93,15,35,75,15,35,76, 0, 0, 0,
+ 6,53,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,53,46, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,32,56,
+ 5,32,70, 5,32,61, 0, 0, 0, 5,39,56, 5,39,48, 4,37, 5, 4,37,11, 5,39,43,
+ /* plane 2, page 78 */
+ 0, 250, /* first, last */
+ 5,39,47, 4,37, 6, 6,63,15, 6,63,10, 4,37,14, 4,37,10, 6,63,11, 6,63,20,
+ 5,39,45, 5,39,46, 5,39,51, 4,37,12, 6,63,23, 6,63,21, 5,39,58, 6,63,14,
+ 0, 0, 0, 4,37, 7, 4,37, 2, 5,39,49, 5,39,50, 6,63,19, 5,39,44, 5,39,54,
+ 6,63,17, 6,63,16, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,42,14, 6,63,24, 6,63,12,
+ 4,37,13, 0, 0, 0, 6,63,18, 0, 0, 0, 6,63,22, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,39,53, 4,43,26, 4,43,22, 4,43,13, 4,43,25, 5,46,51, 4,43,20,
+ 7, 5,61, 4,43,18, 5,46,53, 5,46,55, 5,46,52, 4,43,17, 7, 5,53, 4,43,16,
+ 5,46,49, 5,46,50, 7, 5,51, 5,39,55, 5,46,56, 7, 5,52, 7, 5,59, 7, 5,57,
+ 0, 0, 0, 0, 0, 0,15,48,48,15,48,49,15,48,50,15,48,51,15,48,52, 0, 0, 0,
+ 0, 0, 0, 7, 5,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5,58, 0, 0, 0, 7, 5,62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,46,54, 5,46,48, 4,49,43, 5,53,69, 7,16,15,
+ 7,16,16, 5,53,76, 5,53,77, 4,49,44, 4,49,39, 5,53,72, 7,16,21, 5,53,70,
+ 5,53,71, 5,53,75, 7,16,17, 7,16,23, 5,53,78, 0, 0, 0, 0, 0, 0,15,54,20,
+ 15,54,21, 7,16,20, 0, 0, 0, 7,16,19, 5,53,74, 0, 0, 0, 7,16,18, 0, 0, 0,
+ 0, 0, 0, 7,16,24, 0, 0, 0, 7,16,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,53,68, 7, 5,55, 0, 0, 0, 0, 0, 0, 4,54,92, 5,60,25, 5,53,80, 7,25,48,
+ 4,49,49, 4,37, 9, 4,54,94, 7,25,39, 5,60,21, 7,25,40, 5,60,28, 5,60,26,
+ 5,60,29, 7,25,47, 7,32,74, 5,53,79, 5,60,23, 4,54,93, 5,60,24, 4,55, 3,
+ 7,25,41, 7,25,45, 7,25,49, 7,25,43, 7,25,38, 7,25,44, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,59,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,25,36, 7,25,37,
+ 7,25,46, 5,60,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,66,60,
+ 5,60,30, 7,25,42, 4,59,88, 5,60,32, 5,66,64, 7,32,72, 5,66,69, 7,32,73,
+ 5,66,65, 5,66,68, 4,59,86, 5,60,31, 5,66,61, 5,66,66, 5,66,62, 5,66,63,
+ 4,59,90, 7,32,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,66,67, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,40,11, 4,64,19, 7,40, 7,
+ 4,64,20, 5,72,36, 4,64,21, 7,40, 6, 5,72,35, 5,72,34, 4,64,22, 0, 0, 0,
+ 0, 0, 0,15,67, 7, 4,64,17, 7,40, 8, 0, 0, 0, 7,40, 9, 0, 0, 0, 0, 0, 0,
+ 7,40, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,40,10, 7,32,76,
+ 0, 0, 0, 4,67,74, 4,67,75, 7,46,41, 7,46,45, 7,46,44, 5,76,56, 5,76,57,
+ 7,46,46, 7,46,43, 7,46,42,
+ /* plane 2, page 79 */
+ 0, 255, /* first, last */
+ 5,80,49, 5,80,48, 5,80,46, 4,70,55, 7,51,90, 5,80,47, 7,51,89,15,71,88,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,83,63, 5,83,62, 5,83,61, 0, 0, 0, 0, 0, 0,
+ 7,60, 2, 7,59,94, 4,74,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,60, 1, 5,86, 9,
+ 5,87,75, 7,62,93, 7,62,94, 0, 0, 0, 7,65,34, 7,65, 7, 0, 0, 0, 7,66,31,
+ 7,66,32, 7,66,33, 5,90,77, 7,68,49, 7,69,25, 4, 4,67, 0, 0, 0, 6,19, 5,
+ 15,12,50, 6,25,83, 6,25,82,15,17,16, 6,34,26,15,22,81, 0, 0, 0, 6,43,73,
+ 6,43,71, 5,26,33, 6,43,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 5,63,
+ 0, 0, 0, 4,49,51, 4,49,50, 0, 0, 0, 7,16,26, 6, 5,28, 6, 5,29, 0, 0, 0,
+ 0, 0, 0, 5, 4,70, 5, 7,26, 5, 7,27, 0, 0, 0, 0, 0, 0, 5, 7,25, 5, 7,28,
+ 4,10,45, 5,10,57, 5,10,56, 0, 0, 0, 5,10,55, 6,19, 7, 6,19, 8, 0, 0, 0,
+ 6,19, 6,15,12,51,15,12,52, 0, 0, 0, 6,19, 9, 0, 0, 0, 5,10,58, 0, 0, 0,
+ 6,25,84, 4,14,34, 6,25,85, 6,34,28, 0, 0, 0,15,17,17,15,17,18,15,17,19,
+ 15,17,21,15,17,22, 0, 0, 0, 0, 0, 0,15,22,85, 4,19,38, 5,19,78, 6,34,27,
+ 15,22,82,15,22,83,15,22,86, 0, 0, 0, 6,43,75, 0, 0, 0, 0, 0, 0, 6,43,76,
+ 6,43,74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,22,84,
+ 0, 0, 0, 5,32,72, 5,32,71, 6,53,48, 4,30,94, 6,53,47, 0, 0, 0, 5,32,73,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,35,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,37,15, 6,63,25, 6,63,26,15,42,16,15,42,17,15,42,19,15,42,20,15,42,18,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,43,28, 0, 0, 0, 0, 0, 0,
+ 7, 5,64, 7, 5,65, 0, 0, 0, 5,53,82, 7,16,28, 5,53,81, 7,16,27, 0, 0, 0,
+ 4,55, 7, 4,55, 8, 5,60,34, 5,60,36, 7,32,78, 5,60,33, 7,25,50, 5,66,70,
+ 7,32,79, 0, 0, 0, 7,32,80, 5,72,37, 5,72,38, 5,72,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,72,40, 7,40,12, 7,46,48, 0, 0, 0, 7,46,47, 0, 0, 0,
+ 5,66,71, 0, 0, 0, 0, 0, 0, 7,56,32, 7,56,33,15,71,89, 7,60, 3, 0, 0, 0,
+ 4,75,83, 0, 0, 0, 0, 0, 0, 7,63, 1, 0, 0, 0, 7,69,26, 5, 4,71, 5, 4,72,
+ 6,13,25, 6,13,23, 6,13,24, 5, 7,29, 0, 0, 0, 0, 0, 0, 6,19,11, 5,10,59,
+ 4,10,47, 6,16,22, 6,19,10, 0, 0, 0, 0, 0, 0, 5,14,87, 5,14,88, 6,25,86,
+ 6,25,90, 5,19,79, 4,14,36, 6,25,87, 6,25,88, 6,25,89, 0, 0, 0, 4,19,41,
+ 5,19,80, 6,34,30,15,22,89, 0, 0, 0, 0, 0, 0, 6,34,29, 0, 0, 0, 4,25,28,
+ 6,43,77, 5,26,34, 6,43,79, 4,25,27,15,29,43, 0, 0, 0, 6,43,78, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,22,88, 5,32,74, 5,32,77, 5,32,75, 5,32,76, 5,32,78,
+ 0, 0, 0, 6,53,51,15,35,78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,53,49,
+ /* plane 2, page 80 */
+ 1, 253, /* first, last */
+ 4,31, 1, 4,37,17, 4,37,19, 6,63,30, 0, 0, 0,15,42,21, 6,63,29,
+ 5,39,60, 6,63,31, 6,63,27, 6,63,28, 0, 0, 0, 7, 5,67, 5,46,58, 5,46,59,
+ 5,46,60, 7, 5,66, 0, 0, 0, 0, 0, 0, 5,53,86, 5,53,88, 5,53,84, 4,49,56,
+ 5,53,87, 5,53,85,15,54,22, 5,53,83, 7,16,29, 0, 0, 0, 7,16,30, 7,25,51,
+ 0, 0, 0, 7,16,31, 4,55, 9, 5,66,72, 7,32,82, 7,32,83, 7,32,84, 0, 0, 0,
+ 7,32,81, 0, 0, 0, 0, 0, 0, 5,72,42, 5,72,41, 7,40,13, 0, 0, 0, 4,67,77,
+ 5,76,59, 5,76,58, 7,46,49, 0, 0, 0, 7,51,92, 4,70,60, 7,56,34, 0, 0, 0,
+ 0, 0, 0, 5,87,76, 5,87,77, 0, 0, 0, 7,67,36, 7,69,56, 0, 0, 0, 6, 8,73,
+ 15, 4,93, 4, 7,41, 5, 7,30, 4, 7,39, 6,13,27, 5, 7,31, 5,10,62, 5,10,60,
+ 5,10,61, 6,19,13, 0, 0, 0, 6,19,12,15,12,53, 0, 0, 0, 5,14,89, 6,26, 1,
+ 6,26, 3, 4,14,40, 5,14,90, 6,25,94, 6,25,91, 4,14,42, 6,26, 2, 0, 0, 0,
+ 15,17,23,15,17,24, 6,26, 4, 6,25,92, 6,25,93, 0, 0, 0, 4,19,44, 5,19,82,
+ 4,19,42, 6,34,31, 0, 0, 0,15,22,90,15,22,91,15,22,92,15,22,93,15,23, 1,
+ 15,23, 2, 6,34,32, 6,34,33, 6,26, 5, 6,43,84, 6,43,80, 5,26,35, 4,25,29,
+ 6,43,82, 6,43,83, 0, 0, 0,15,29,44,15,29,45, 0, 0, 0, 6,43,81, 6,53,52,
+ 6,53,54, 5,32,80, 6,53,56, 6,53,55, 6,53,53, 0, 0, 0, 0, 0, 0,15,35,79,
+ 15,35,80, 0, 0, 0, 0, 0, 0, 6,63,33, 6,63,32, 6,63,43,15,42,22, 5,46,61,
+ 7, 5,68, 0, 0, 0, 7, 5,69, 0, 0, 0,15,48,53,15,48,54,15,48,55,15,48,56,
+ 15,48,57,15,48,58, 0, 0, 0, 4,49,57, 7,16,36, 4,49,59, 7,16,32, 7,16,37,
+ 5,53,90, 5,53,89,15,54,23,15,54,24,15,54,25, 0, 0, 0,15,54,26,15,54,27,
+ 7,16,35, 7,16,33, 0, 0, 0, 0, 0, 0, 4,55,11, 4,60, 3, 4,55,10, 7,25,52,
+ 5,60,39, 7,32,85, 0, 0, 0, 0, 0, 0, 5,60,38,15,59,27,15,59,28, 0, 0, 0,
+ 0, 0, 0, 7,25,53, 7,25,54, 7,22,89, 0, 0, 0, 5,60,37, 7,16,34, 7,25,55,
+ 4,60, 2, 4,60, 1, 7,32,86, 0, 0, 0, 7,32,88, 0, 0, 0, 7,32,87,15,63,66,
+ 7,32,89, 7,40,14, 5,72,43, 7,40,15,15,67, 8,15,67, 9, 0, 0, 0, 5,76,61,
+ 7,46,51, 5,76,60, 7,46,53,15,69,54, 0, 0, 0, 7,46,50, 7,46,52, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,71,91, 7,56,36, 5,83,64, 7,56,35, 7,56,37,15,71,90,
+ 7,63, 2, 5,86,10, 0, 0, 0, 0, 0, 0, 7,63, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,66,34, 0, 0, 0, 0, 0, 0, 5, 2,93,15, 2,71, 6, 8,74, 4, 4,68,
+ 5, 4,74, 4, 4,70, 5, 4,75, 5, 4,73,15, 4,94, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4, 7,48, 6,13,28, 5, 7,33, 4, 7,43, 6,13,32, 6,13,34,
+ 6,13,30, 5, 7,34, 5, 7,35, 6,13,33, 6,13,31, 5, 7,32,
+ /* plane 2, page 81 */
+ 0, 255, /* first, last */
+ 6,13,35, 0, 0, 0, 6,13,36, 6,19,25, 6,19,21, 6,19,14, 6,19,18, 4,10,62,
+ 6,19,22, 4,10,60, 6,19,28, 5,10,69, 6,19,19, 5,10,73, 4,10,59, 6,19,15,
+ 6,19,27, 5,10,64, 5,10,71, 5,10,75, 5,10,65, 5,10,74, 5,10,72, 5,10,67,
+ 5,10,76, 6,19,16, 0, 0, 0, 5,10,63, 5,10,70, 5,10,66, 5,10,68, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,12,54,15,12,56, 6,19,23, 0, 0, 0, 6,19,26,
+ 0, 0, 0, 6,19,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,14,48, 5,15, 4, 3,14,58, 4,14,44, 5,14,91, 6,26, 6, 4,14,46,
+ 5,15, 2, 5,14,92, 6,26, 8, 4,14,43, 6,26, 9, 5,15, 3, 6,26,10, 4,14,51,
+ 6,26,12, 5,14,94, 0, 0, 0, 0, 0, 0, 5,15, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,26,11,15,17,25,15,17,26,15,17,27,15,17,28,15,17,29, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,26, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,15, 1,
+ 5,14,93, 4,14,52, 4,19,53, 6,34,51, 6,34,38, 6,34,45, 5,19,84, 5,19,83,
+ 5,19,93, 4,19,52, 6,34,39, 6,34,36, 0, 0, 0, 6,34,34, 5,19,90, 5,19,91,
+ 5,19,85, 6,34,42, 5,19,88, 6,34,52, 5,19,89, 6,34,35, 6,34,47, 0, 0, 0,
+ 6,34,43, 6,34,48,15,23, 5, 6,34,50, 0, 0, 0, 0, 0, 0, 6,34,44, 0, 0, 0,
+ 0, 0, 0, 6,34,41, 0, 0, 0, 0, 0, 0, 6,34,49,15,23, 6, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,19,94, 6,34,37, 6,34,46,
+ 5,19,87, 5,19,92, 0, 0, 0, 5,26,41, 5,26,44, 6,43,89, 6,44, 3, 4,19,51,
+ 6,43,88, 5,26,43, 6,43,93, 6,44, 1, 5,26,38, 6,44, 6, 6,43,87, 4,25,47,
+ 5,26,42, 5,26,40, 5,26,36, 4,25,46, 5,32,81, 6,44, 5, 5,32,94, 4,25,32,
+ 6,43,94, 5,26,45, 6,43,91, 5,26,46, 6,44, 8, 5,26,37, 5,26,39, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,29,47,15,29,48,15,29,49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,43,92, 0, 0, 0, 0, 0, 0, 6,44, 7, 0, 0, 0, 6,43,86, 6,44, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,44, 2, 4,25,36, 4,25,48, 5,26,47, 4,25,30,
+ 0, 0, 0, 6,53,59, 6,53,62, 6,53,58, 4,31,10, 5,32,88, 6,53,60, 5,32,87,
+ 6,53,63, 5,32,85, 6,53,57, 4,31, 3, 4,31, 8, 4,31,17, 4,31,14, 0, 0, 0,
+ 5,32,90, 6,53,66, 5,32,86, 4,31,15, 4,31, 4, 6,53,68, 5,32,89, 5,32,82,
+ 5,32,92, 6,53,70, 0, 0, 0, 0, 0, 0, 6,53,61, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,35,81,15,35,82,15,35,83, 6,43,85, 0, 0, 0, 0, 0, 0, 6,53,67, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,51,21, 5,32,83, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,32,93, 5,32,84,
+ /* plane 2, page 82 */
+ 0, 255, /* first, last */
+ 6,53,69, 0, 0, 0, 5,39,64, 4,37,37, 0, 0, 0, 6,63,36, 4,37,30, 5,39,67,
+ 6,63,40, 5,39,69, 5,39,70, 6,63,41, 4,43,47, 6,63,46, 6,63,38, 6,63,47,
+ 7, 5,76, 6,63,39, 5,39,71, 5,39,68, 6,63,35, 6,63,42, 6,63,37, 5,39,66,
+ 6,63,34, 5,39,63, 5,39,62, 5,39,61, 7, 5,70, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,42,23,15,42,24,15,42,25,15,42,26,15,42,27,15,42,28,
+ 15,42,29, 4,37,26, 6,63,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,63,44,
+ 5,39,73, 0, 0, 0, 0, 0, 0, 4,37,27, 4,43,48, 4,43,44, 4,43,30, 5,46,66,
+ 5,46,71, 4,43,46, 7, 5,75, 5,46,76, 5,46,69, 4,43,33, 7, 5,80, 4,43,32,
+ 4,49,69, 7,16,45, 5,46,68, 5,54, 1, 5,46,70, 7, 5,77, 5,46,74, 7, 5,82,
+ 4,43,41, 4,43,43, 4,43,38, 5,46,63, 5,46,75, 7, 5,71, 7, 5,72, 7, 5,74,
+ 4,43,42, 5,46,67, 7, 5,78, 5,46,62, 5,46,65, 5,53,91, 5,46,73, 5,46,72,
+ 0, 0, 0, 0, 0, 0, 7, 5,73,15,48,59,15,48,60,15,48,61, 7, 5,79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,43,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,54,10, 5,54,11, 4,49,62, 5,54, 5,
+ 5,54, 3, 5,54, 7, 5,53,93, 4,49,67, 5,54, 9, 5,53,94, 5,54, 6, 5,54, 4,
+ 4,49,66, 7,16,38, 7,16,46, 0, 0, 0, 7,16,47, 7,16,43, 7,16,39, 5,46,77,
+ 4,49,71, 5,53,92, 7,16,41, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,54,29, 0, 0, 0,
+ 7,16,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,16,44, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,54,12,
+ 4,49,70, 0, 0, 0, 5,39,72, 5,54, 8, 4,60,11, 5,60,40, 5,60,43, 4,55,21,
+ 4,55,22, 7,16,50, 7,25,62, 7,25,57, 5,60,42, 7,25,58, 5,60,44, 7,25,68,
+ 5,60,41, 7,33, 2, 7,25,63, 7,25,64, 7,25,61, 4,55,23, 7,25,67, 5,60,47,
+ 7,16,40, 5,60,46, 7,25,65, 7,25,60, 7,25,59, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,59,30,15,59,31,15,59,32, 0, 0, 0, 0, 0, 0, 7,25,66, 0, 0, 0, 0, 0, 0,
+ 7,25,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,60, 8, 7,33, 3, 7,32,94, 5,66,78, 4,60,12, 5,66,75, 7,32,91,
+ 7,32,92, 5,66,80, 4,60, 4, 5,66,76, 5,66,79, 5,66,81, 0, 0, 0, 0, 0, 0,
+ 5,66,74,15,63,67,15,63,68, 7,33, 4, 7,33, 5, 7,32,93, 0, 0, 0, 5,66,77,
+ 7,32,90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,33, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,72,47,
+ /* plane 2, page 83 */
+ 0, 254, /* first, last */
+ 5,72,44, 5,72,49, 4,64,30, 5,72,48, 4,64,27, 5,72,52, 5,72,46, 7,40,18,
+ 4,64,26, 7,40,20, 4,64,28, 4,64,29, 7,40,16, 5,72,45, 7,40,17, 5,72,51,
+ 5,72,50, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,67,10, 7,43,61, 7,40,21, 7,40,19,
+ 0, 0, 0, 0, 0, 0, 5,76,64, 5,76,66, 5,76,62, 7,46,56, 5,76,65, 5,76,67,
+ 0, 0, 0, 7,46,55,15,69,55, 4,67,82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,76,63, 4,67,83, 7,46,54, 0, 0, 0, 0, 0, 0, 7,52, 2, 5,80,50, 5,80,52,
+ 5,80,51, 5,80,53, 7,51,94, 0, 0, 0, 0, 0, 0, 7,52, 3, 7,51,93, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,72,89, 5,83,67, 7,56,38, 5,83,65, 5,83,66, 7,56,39,
+ 5,83,69, 4,74,57, 7,52, 1, 5,83,68, 7,57,19, 0, 0, 0, 5,83,70, 0, 0, 0,
+ 0, 0, 0, 5,86,11, 7,60, 6, 4,74,56, 7,60, 5, 0, 0, 0, 0, 0, 0, 7,63, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,76,84, 7,66,35, 7,66,37, 0, 0, 0, 7,66,36,
+ 0, 0, 0,15,76,70, 5,91,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7,36, 4,10,64,
+ 4,10,65, 4,14,54, 5,15, 8, 5,15, 7, 6,26,15, 6,26,16, 0, 0, 0, 4,19,56,
+ 5,20, 2,15,23, 7, 5,26,50, 4,25,49, 5,26,51, 5,26,49, 5,26,53, 5,26,48,
+ 6,44, 9, 5,26,52, 5,33, 3, 5,33, 2, 0, 0, 0, 5,33, 1, 6,63,49, 6,63,50,
+ 4,37,39, 4,37,40, 5,39,76, 5,39,74, 5,39,75, 4,37,41, 6,63,48, 4,37,43,
+ 15,45,31, 0, 0, 0, 5,46,78, 4,43,50, 7, 5,85, 5,46,79, 4,43,49, 7, 5,84,
+ 0, 0, 0, 4,43,51, 4,49,73, 4,49,72, 4,49,74, 5,54,13, 5,66,85, 7,25,69,
+ 5,58,85, 0, 0, 0, 5,60,48, 5,66,84, 5,66,83, 5,66,82, 5,72,55, 5,72,54,
+ 5,72,53, 5,72,56, 7,40,22, 0, 0, 0, 7,40,23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,74,58, 0, 0, 0, 0, 0, 0, 7,70,31, 7,70,41, 6, 6,31, 6, 8,75,
+ 6, 8,76, 6,19,33, 6,19,31, 6,19,32, 5,10,78, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,15,10, 5,15,11, 6,26,19,15,17,31,15,17,32, 6,26,17, 6,26,18, 0, 0, 0,
+ 5,15, 9, 5,20, 3, 5,20, 4, 4,19,60, 6,34,57, 6,34,55, 5,20, 5, 6,34,53,
+ 6,34,59, 6,34,54, 6,34,58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,34,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,25,50, 6,44,12,
+ 0, 0, 0,15,29,50, 0, 0, 0, 0, 0, 0, 6,44,10, 0, 0, 0, 0, 0, 0,15,29,51,
+ 5,33, 4, 4,31,18, 6,53,73, 0, 0, 0, 4,31,21, 4,31,20, 6,53,71, 5,26,54,
+ 4,31,22,15,35,85, 6,53,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,39,77, 5,39,78, 6,63,51, 0, 0, 0, 0, 0, 0, 5,39,79,
+ 5,39,80,15,42,30, 7, 5,88, 4,43,52, 7, 5,86, 7, 5,87,15,48,65, 7, 5,89,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,16,52, 4,49,75,15,54,31, 7,16,51,
+ /* plane 2, page 84 */
+ 0, 255, /* first, last */
+ 5,60,49, 5,60,50, 0, 0, 0, 7,25,70, 7,25,71, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,83,71, 0, 0, 0, 5,86,12, 0, 0, 0, 5, 2,94, 6, 5,30, 4, 4,71,
+ 6, 8,77, 5, 4,77, 5, 4,76,15, 5, 1,15, 5, 2, 5, 7,37, 4, 7,52, 0, 0, 0,
+ 15, 8,16,15, 8,17,15, 8,18,15, 8,19, 6,13,39,15, 8,21, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,10,69, 4,10,67, 6,19,37, 5,10,80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,12,57,15,12,58,15,12,59,15,12,61,15,12,62,15,12,63,15,12,65,
+ 15,12,67, 0, 0, 0, 6,19,35, 0, 0, 0, 6,19,36,15,12,68, 0, 0, 0, 0, 0, 0,
+ 15,12,64, 6,19,34, 0, 0, 0, 0, 0, 0, 5,10,79, 5,10,81, 4,14,64, 5,15,19,
+ 6,26,20, 6,19,38, 6,26,21, 5,15,15, 6,26,25, 5,15,12, 5,15,17, 5,15,16,
+ 4,14,59, 4,14,61, 5,15,22, 5,15,18, 5,15,21, 0, 0, 0, 0, 0, 0,15,17,30,
+ 4,14,57, 5,15,23, 6,26,24,15,17,34,15,17,35,15,17,37,15,17,38, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,14,58, 5,15,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,26,23, 0, 0, 0, 0, 0, 0,15,17,40, 0, 0, 0,15,17,33, 5,20, 6,
+ 5,15,14, 0, 0, 0, 6,26,22, 5,20,12, 5,20, 8, 6,34,65, 6,34,63, 0, 0, 0,
+ 5,20,17, 5,20,16, 5,20,10, 6,34,64, 5,20,20, 5,20,18, 5,15,24, 5,20,14,
+ 5,20, 7, 5,20, 9, 5,20,13, 0, 0, 0,15,23, 8, 0, 0, 0,15,23, 9,15,23,10,
+ 15,23,11,15,23,14,15,23,15,15,23,17,15,23,18,15,23,19, 0, 0, 0, 6,34,62,
+ 0, 0, 0, 0, 0, 0, 6,34,60, 0, 0, 0, 6,44,14, 0, 0, 0,15,23,16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,20,11, 0, 0, 0,15,23,12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,34,66, 0, 0, 0, 0, 0, 0, 5,20,15,
+ 5,20,19, 6,34,61, 5,26,56, 5,26,62, 5,26,55, 5,26,59, 4,25,54, 6,44,21,
+ 4,25,55, 4,25,53, 5,26,60, 5,26,61, 6,44,17, 5,26,58, 5,26,63, 0, 0, 0,
+ 0, 0, 0,15,29,52,15,29,53,15,29,54,15,29,55, 6,44,20, 0, 0, 0, 0, 0, 0,
+ 6,44,16, 6,44,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,26,65, 5,26,64,
+ 0, 0, 0, 0, 0, 0, 5,33, 8, 6,53,81, 4,31,23, 5,33, 9, 6,53,74, 6,53,76,
+ 5,33, 5, 6,53,78, 4,31,33, 4,31,35, 6,53,79, 6,53,82, 5,33, 6, 5,33, 7,
+ 0, 0, 0, 0, 0, 0, 6,53,77,15,35,87,15,35,88,15,35,89,15,35,90,15,35,91,
+ 15,35,92,15,35,93,15,35,94,15,36, 1,15,36, 2,15,36, 3,15,36, 4,15,36, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,53,80, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,53,83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,63,59, 5,39,88, 6,63,52, 7, 5,94, 5,39,90, 6,63,54,
+ /* plane 2, page 85 */
+ 0, 255, /* first, last */
+ 4,37,50, 5,39,83, 5,39,82, 6,63,55, 5,39,91, 6,63,57, 6,63,58, 5,39,85,
+ 6,63,53, 5,39,81, 5,39,93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,63,56, 0, 0, 0,15,42,33,15,42,35,15,42,36,15,42,37,15,42,38,15,42,39,
+ 15,42,40,15,42,41,15,42,43,15,42,44,15,42,45,15,42,47,15,42,48,15,42,49,
+ 15,42,50, 0, 0, 0, 4,37,52,15,42,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,39,87, 5,39,92, 5,39,89, 5,39,84,15,48,68, 4,43,58, 5,46,82, 5,46,83,
+ 7, 6, 1, 5,46,80, 4,37,48, 7, 6, 5, 5,46,85, 7, 5,93,15,48,66,15,48,67,
+ 15,48,69,15,48,70,15,48,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 2, 0, 0, 0, 7, 5,90, 7, 6, 3, 5,46,81,
+ 5,46,84, 7, 5,92, 0, 0, 0,15,42,42, 7,16,56, 5,54,17, 5,54,14, 5,54,18,
+ 7,16,53, 4,49,81, 0, 0, 0, 4,49,83, 5,54,20, 4,49,82, 7,16,54, 7,16,58,
+ 4,49,79, 0, 0, 0, 7,16,55, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,54,33,15,54,34,
+ 15,54,35, 5,54,16, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,54,36, 5,54,15,15,54,37,
+ 15,54,38,15,54,39,15,54,41,15,54,43,15,54,44,15,54,45, 0, 0, 0, 0, 0, 0,
+ 5,60,54, 7,25,72, 5,60,52, 7,25,79, 7,25,74, 5,60,51, 4,55,26, 7,25,73,
+ 5,60,53, 4,55,29, 7,25,76, 4,55,28, 5,54,21, 5,60,56, 5,60,55, 5,60,57,
+ 0, 0, 0, 0, 0, 0,15,59,33,15,59,34,15,59,35,15,59,36,15,59,37,15,59,38,
+ 15,59,39,15,59,40,15,59,41, 7,25,75, 7,25,78, 0, 0, 0, 0, 0, 0,15,54,42,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,33, 9,
+ 5,66,86, 5,66,88, 7,33, 6, 7,33, 8, 5,66,87, 4,60,16, 5,66,90, 7,33, 7,
+ 5,66,89, 7,33,10,15,63,69,15,63,70,15,63,71,15,63,72,15,63,73, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,64,32, 5,72,58, 5,72,57, 0, 0, 0,15,67,11,15,67,12,
+ 15,67,13,15,67,14, 0, 0, 0, 7,40,26, 7,40,24, 0, 0, 0, 0, 0, 0, 7,40,25,
+ 0, 0, 0,15,67,15, 0, 0, 0, 5,76,69, 5,76,70, 7,46,57, 7,46,58, 5,76,68,
+ 5,76,71, 4,64,33, 7,46,59,15,69,58,15,69,59,15,69,60,15,69,61, 0, 0, 0,
+ 0, 0, 0, 7,46,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,80,54, 5,80,55, 0, 0, 0, 0, 0, 0,15,71,93, 0, 0, 0,
+ 7,52, 4, 4,70,66, 0, 0, 0,15,71,92, 0, 0, 0, 5,83,72, 7,56,40, 5,83,73,
+ 0, 0, 0,15,73,59,15,73,60, 7,56,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,83,74, 5,86,14, 4,74,59, 5,86,13, 5,86,15,15,74,69,
+ 0, 0, 0, 7,60, 8, 7,60, 7, 0, 0, 0, 7,63, 6, 0, 0, 0, 0, 0, 0, 7,63, 5,
+ 7,63, 7, 0, 0, 0, 7,66,38, 5,90,13, 0, 0, 0, 0, 0, 0, 5,90,78, 4,77,85,
+ /* plane 2, page 86 */
+ 1, 255, /* first, last */
+ 7,68,51, 0, 0, 0, 7,69,27, 5,92,35, 6, 2, 7, 6, 5,32, 0, 0, 0,
+ 6, 8,78,15, 2,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,13,40,15, 5, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,19,39, 6,19,41, 0, 0, 0,
+ 0, 0, 0,15, 8,22,15, 8,24,15, 8,25,15, 8,26,15, 8,27,15, 8,29, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 8,23, 0, 0, 0, 6,17,58, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,15,25, 6,26,26, 4,14,67, 5,15,26, 0, 0, 0,
+ 6,26,27, 6,19,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,12,69,15,12,70,15,12,71,15,12,72,15,12,73,15,17,41,15,17,43,15,17,46,
+ 0, 0, 0, 0, 0, 0, 6,26,30, 0, 0, 0, 6,26,31, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,26,29, 6,26,32, 6,26,28,15,12,74, 4,10,72, 5,20,22, 6,26,33,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,17,42,15,17,44,15,17,45,15,17,47,
+ 15,17,48,15,17,49,15,17,50,15,17,51,15,17,52,15,23,23, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,34,67, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,20,21, 0, 0, 0, 0, 0, 0, 6,44,24, 5,26,66, 6,44,25, 6,44,26, 6,44,28,
+ 5,26,67, 6,44,29, 6,44,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,44,22,
+ 6,44,23,15,23,20,15,23,22,15,23,24,15,29,59, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,23,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,53,85, 5,33,11, 5,33,10, 5,33,12, 6,44,31, 4,31,40,15,29,56,15,29,57,
+ 15,29,58,15,29,60,15,29,61,15,29,62,15,29,63,15,29,66,15,29,67,15,29,68,
+ 15,36, 8,15,36,10,15,29,65, 0, 0, 0, 6,53,84, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,40, 3, 6,63,63,
+ 6,63,64, 4,37,54, 6,63,67, 6,63,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,36, 7,15,36, 9,15,36,11,15,36,12,15,36,13,15,36,14,15,36,15,15,36,16,
+ 15,36,17,15,36,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,63,61, 6,63,66, 5,40, 1, 6,63,62, 0, 0, 0, 4,43,63, 7, 6, 6, 6,63,60,
+ 6,63,68, 0, 0, 0,15,42,51,15,42,53,15,42,54,15,42,55,15,42,56,15,42,58,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,54,24, 7,16,60, 5,54,22, 7,16,61, 4,49,87, 5,54,25, 5,54,23, 5,54,26,
+ 7, 6,10, 7,16,59,15,48,74,15,48,73,15,54,49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,55,35, 5,60,58,
+ 7,25,83, 4,55,36, 7,25,86, 7,25,84, 7,16,62,15,48,75, 0, 0, 0,15,54,46,
+ 15,54,47,15,54,48,15,54,50, 7,25,81, 7,25,85, 7,25,82, 0, 0, 0, 7,25,80,
+ /* plane 2, page 87 */
+ 1, 255, /* first, last */
+ 15,59,45,15,59,47, 4,60,20, 5,66,91, 7,33,12, 0, 0, 0,15,59,43,
+ 15,59,44,15,59,46,15,59,48,15,59,49,15,59,50, 0, 0, 0, 0, 0, 0, 7,33,11,
+ 0, 0, 0, 4,60,19, 5,72,59, 7,40,28, 7,40,29,15,63,74, 0, 0, 0,15,63,75,
+ 0, 0, 0, 0, 0, 0, 5,76,72, 4,67,87, 0, 0, 0, 0, 0, 0,15,69,62, 7,46,62,
+ 7,52, 6, 0, 0, 0, 0, 0, 0, 7,52, 5, 0, 0, 0,15,69,63, 4,72,93, 7,56,42,
+ 0, 0, 0, 7,56,43, 7,60, 9,15,73,61, 7,60,10, 0, 0, 0, 0, 0, 0, 7,60,11,
+ 5,87,78, 7,60,12, 5,87,79,15,74,71, 5,89,18, 0, 0, 0, 0, 0, 0, 7,66,41,
+ 7,66,39, 7,67,61,15,76,71,15, 2,73, 6,19,45, 6,34,68, 4,25,59, 6,44,32,
+ 0, 0, 0, 6,53,86, 0, 0, 0, 6,63,69, 7, 6,12, 7,16,63, 0, 0, 0, 7,16,64,
+ 7,33,13, 0, 0, 0, 5,83,75, 7,65, 8, 4, 1,94, 6, 5,33, 0, 0, 0,15, 2,74,
+ 6, 8,79, 0, 0, 0,15, 5, 5, 6, 8,80, 4, 7,53, 5, 7,40, 4, 7,55, 0, 0, 0,
+ 5, 7,39, 0, 0, 0,15, 8,30,15, 8,31,15, 8,32,15, 8,33,15, 8,34, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,13,42, 6,19,49, 6,19,52, 5,10,84, 5,10,82, 4,10,80,
+ 5,10,85, 6,19,54, 6,19,48, 6,19,50, 4,10,77, 6,19,47, 5,10,83, 6,19,55,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,12,75,15,12,76,15,12,78,15,12,79, 0, 0, 0,
+ 0, 0, 0,15,12,80, 6,19,53, 6,19,51, 6,19,46, 0, 0, 0, 5,15,28, 5,15,27,
+ 6,26,37, 5,15,29, 6,26,38, 5,15,30, 5,10,86, 5,20,28, 6,26,39, 0, 0, 0,
+ 15,17,53,15,17,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,26,34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,26,36,
+ 5,20,26, 6,34,73, 5,20,31, 4,19,72, 5,20,29, 6,34,72, 5,20,23,15,23,26,
+ 15,23,28,15,23,29,15,23,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,19,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,34,69,
+ 0, 0, 0, 6,34,74, 4,25,63, 5,26,68, 4,25,64, 4,25,60, 6,44,33, 6,44,34,
+ 6,44,37, 6,44,39, 4,25,61, 6,44,36, 4,31,49,15,29,69,15,29,71,15,29,73,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,20,30, 0, 0, 0,15,29,70,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,33,22, 5,33,15, 6,53,89,
+ 6,53,87, 6,53,90, 5,33,16, 5,33,13, 5,33,18, 5,33,20, 5,33,24, 5,33,19,
+ 4,31,46, 6,54, 1, 5,33,14, 6,53,91, 6,53,94, 0, 0, 0, 6,53,92, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,36,19,15,36,20,15,36,21,15,36,22,15,36,23,15,36,24,
+ 15,36,25,15,36,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,53,88,
+ 6,53,93, 0, 0, 0, 5,33,23, 5,33,21, 0, 0, 0, 5,40, 8, 6,63,73, 5,37,13,
+ /* plane 2, page 88 */
+ 0, 254, /* first, last */
+ 5,40,13, 6,63,72, 6,63,70, 6,63,74, 4,37,60, 5,40,14, 5,40, 9, 6,63,78,
+ 6,63,79, 5,40,11, 5,40, 7, 5,40,12, 6,63,80, 5,40,10, 6,63,71,15,42,64,
+ 15,42,59,15,42,60,15,42,61,15,42,62,15,42,63,15,42,65,15,42,66,15,42,67,
+ 15,42,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,63,77, 6,63,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,46,91, 5,46,88, 5,46,90, 7, 6,19, 7, 6,16, 5,46,89, 4,43,73,
+ 0, 0, 0, 7, 6,20, 7, 6,17, 0, 0, 0, 7, 6,24, 5,40,15, 7, 6,15, 5,54,37,
+ 5,46,92, 5,46,93, 0, 0, 0, 4,43,71, 0, 0, 0, 4,43,74, 7, 6,21,15,48,76,
+ 15,48,78,15,48,79,15,48,80,15,48,81,15,48,82, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 6,14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7, 6,22, 7, 6,23, 4,49,91, 7,16,77, 0, 0, 0, 5,54,29,
+ 5,54,32, 7,16,73, 5,54,28, 5,54,31, 5,54,30, 4,49,94, 5,54,27, 5,54,35,
+ 7,16,67, 7,16,68, 5,54,34, 7,16,66, 5,54,38, 5,60,59, 5,54,39, 7,16,75,
+ 7,16,74, 0, 0, 0, 0, 0, 0, 7,16,76, 7,16,65,15,54,52,15,54,53, 0, 0, 0,
+ 0, 0, 0, 7,16,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,16,71, 7,16,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,54,36,
+ 5,54,33, 0, 0, 0, 5,60,62, 5,60,65, 5,60,66, 5,60,63, 5,60,60, 5,60,61,
+ 0, 0, 0, 4,55,42, 7,25,87, 5,60,68, 4,55,38, 5,60,64, 7,25,90, 0, 0, 0,
+ 15,59,52,15,59,53,15,59,54,15,59,55,15,59,56,15,59,58, 7,25,88, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,59,51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,54,40, 7,25,89, 0, 0, 0,
+ 5,60,67,15,54,51, 0, 0, 0, 0, 0, 0, 5,66,93, 5,67, 6, 5,67, 4, 5,67, 1,
+ 5,67, 2, 5,67, 5, 7,33,16, 5,66,94, 7,33,15, 5,67, 3, 0, 0, 0,15,63,76,
+ 15,63,77,15,63,78,15,63,79,15,63,80,15,63,81,15,63,82, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,66,92, 0, 0, 0, 0, 0, 0, 5,72,62, 4,64,35,
+ 5,72,60, 4,64,36, 4,64,39, 0, 0, 0, 7,40,31, 0, 0, 0, 4,64,38, 5,72,61,
+ 7,46,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,40,33, 7,40,30,15,67,16,
+ 7,40,32, 5,76,75, 4,67,90, 4,67,88, 5,76,74, 7,46,64, 4,60,24, 5,76,73,
+ 5,76,76, 7,46,63, 7,46,65,15,69,64,15,69,65,15,69,67, 0, 0, 0, 7,46,67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,76,77,
+ /* plane 2, page 89 */
+ 0, 255, /* first, last */
+ 7,52, 8, 7,52, 7, 5,80,56, 7,52, 9, 0, 0, 0, 7,56,45, 5,83,76, 7,56,46,
+ 0, 0, 0, 0, 0, 0, 5,86,16, 5,86,17, 7,56,47, 0, 0, 0, 5,87,80, 0, 0, 0,
+ 0, 0, 0, 7,60,13, 7,60,14, 7,63, 8, 7,62,81,15,75,55,15,75,56, 4,76,87,
+ 5,89,19,15,76,20, 4,76,88, 0, 0, 0, 5,90,14, 0, 0, 0, 5,91,65, 5,91,66,
+ 0, 0, 0, 0, 0, 0, 6, 3,23, 5, 4,79, 5, 4,80, 0, 0, 0, 0, 0, 0, 4, 7,57,
+ 4, 7,58, 4, 7,56, 6,13,45, 6,13,44, 0, 0, 0, 6,13,47, 3,10,37, 0, 0, 0,
+ 6,13,43,15, 8,35, 0, 0, 0, 0, 0, 0, 4,10,84, 6,19,57, 6,19,59, 6,19,56,
+ 5,10,87, 4,10,83, 5,10,89, 5,10,88, 6,19,58, 6,19,60, 6,19,61, 5,10,90,
+ 0, 0, 0,15,12,81,15,12,82,15,12,83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,15,31,
+ 4,14,70, 4,14,75, 4,14,72, 5,15,35, 5,15,34, 5,15,33, 6,26,44, 4,14,73,
+ 4,14,74, 4,14,71, 6,26,42, 6,26,40, 5,15,32, 0, 0, 0, 0, 0, 0, 5,15,36,
+ 15,17,56,15,17,57,15,17,58, 6,26,43, 0, 0, 0, 0, 0, 0, 6,26,41, 0, 0, 0,
+ 5,20,36, 5,20,35, 6,34,76, 6,34,75, 6,34,77, 5,20,33, 4,19,78, 5,20,34,
+ 5,20,32, 6,34,78,15,23,32,15,23,33,15,23,34,15,23,35,15,23,36, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,26,82, 4,25,70,
+ 5,26,84, 6,44,46, 6,44,42, 4,25,73, 6,44,50, 5,26,73, 5,26,79, 5,26,81,
+ 6,44,48, 5,26,71, 6,44,49, 5,26,72, 6,44,43, 5,26,74, 4,25,72, 5,26,83,
+ 6,44,44, 0, 0, 0, 5,26,80, 6,44,41, 5,26,70, 5,26,77, 6,44,47, 5,26,78,
+ 5,26,75, 6,44,45, 0, 0, 0,15,29,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,33,26, 6,54, 9, 5,33,28, 5,33,27, 5,33,30,
+ 6,54, 2, 6,54, 4, 5,26,76, 0, 0, 0, 5,33,29, 5,33,31, 6,54, 8, 6,54,11,
+ 5,33,32, 6,54, 6, 6,54, 5, 0, 0, 0, 0, 0, 0,15,36,27,15,36,29,15,36,30,
+ 15,36,31,15,36,32, 6,54, 3, 0, 0, 0, 0, 0, 0, 6,54,10, 6,55, 6, 0, 0, 0,
+ 4,37,65, 6,63,87, 5,40,18, 6,63,86, 6,63,82, 6,63,84, 6,63,83, 5,40,17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,63,89,15,42,70, 5,40,19,
+ 0, 0, 0, 0, 0, 0, 6,63,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,36,28,
+ 7, 6,27, 0, 0, 0, 5,47, 1, 5,47, 7, 5,47,10, 5,40,16, 7, 6,26, 5,47,11,
+ 5,47, 6, 5,47, 2, 5,47,12, 5,47, 5, 7, 6,25, 5,46,94, 5,47, 8, 5,47, 4,
+ 5,47, 9, 0, 0, 0, 7, 7,14, 0, 0, 0, 0, 0, 0, 4,43,77, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,54,47, 5,54,49, 4,50, 3, 5,54,48,
+ 4,50, 6, 5,54,41, 4,50, 8, 7,16,80, 5,54,42, 5,54,44, 5,54,43, 5,54,51,
+ 5,54,45, 5,54,52, 7,16,78, 5,54,46, 5,60,69, 5,54,53, 0, 0, 0,15,54,54,
+ /* plane 2, page 90 */
+ 0, 255, /* first, last */
+ 15,54,55,15,54,56,15,54,57,15,54,58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,16,81, 0, 0, 0, 0, 0, 0, 5,60,74, 5,60,71, 7,26, 1,
+ 4,55,46, 5,60,73, 7,25,92, 7,25,93, 7,25,91, 5,60,70, 7,25,94, 7,16,82,
+ 5,60,72, 0, 0, 0,15,59,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,67, 8, 5,67, 7,15,63,84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,64,42, 7,40,36, 7,40,35, 5,72,63, 7,40,34, 0, 0, 0,
+ 7,46,68, 7,46,70, 5,72,64, 4,67,91, 5,76,78, 7,52,13, 7,46,71, 7,46,69,
+ 15,69,68, 0, 0, 0, 0, 0, 0, 5,80,59, 7,52,11, 4,70,71, 0, 0, 0, 4,70,70,
+ 5,80,57, 7,52,12, 5,80,58,15,72, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,69,69, 0, 0, 0, 5,86,18, 7,60,15, 5,87,81, 0, 0, 0, 7,65,10,15,75,57,
+ 7,63, 9, 0, 0, 0, 5,89,20, 7,66,42, 5,91,67, 6, 8,82, 6, 8,81, 5, 7,41,
+ 5, 7,42, 4,10,85, 0, 0, 0,15,12,84,15,12,88, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,14,79, 5,15,39, 5,15,40, 4,14,76, 5,15,38, 5,15,37, 4,14,78,15,17,60,
+ 15,17,61,15,17,62,15,17,63,15,17,65,15,17,66, 6,26,45, 6,26,46, 0, 0, 0,
+ 0, 0, 0, 6,34,82, 4,19,83, 6,34,81, 6,34,83, 6,34,80, 4,19,84, 0, 0, 0,
+ 15,23,37,15,23,39, 0, 0, 0, 5,20,39,15,23,40, 0, 0, 0, 4,25,75, 6,44,53,
+ 5,26,85, 5,26,87, 5,26,86, 5,26,88, 6,44,52, 0, 0, 0,15,29,77,15,29,78,
+ 15,29,79,15,29,80, 4,31,54, 4,31,56, 5,33,34, 4,31,57, 6,54,12, 5,33,33,
+ 6,54,13, 6,54,14,15,36,33,15,36,34,15,36,35, 5,33,35, 0, 0, 0, 0, 0, 0,
+ 5,40,20, 6,63,90, 5,40,21, 4,37,66, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,42,71,
+ 15,42,72,15,42,74, 0, 0, 0, 0, 0, 0,15,42,73, 7, 6,31, 4,43,78, 5,47,13,
+ 15,48,83,15,48,84,15,48,85, 0, 0, 0, 7, 6,29,15,54,60,15,54,59, 4,55,49,
+ 7,16,84, 5,54,54,15,59,60, 5,60,76, 0, 0, 0, 5,61,67, 7,26, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,60,75, 5,67,10, 7,26, 3,15,63,85, 7,33,17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,67, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,46,72, 7,52,14,15,69,70, 0, 0, 0, 0, 0, 0, 7,40,37, 5,80,60,15,72, 2,
+ 7,56,48,15,73,62,15,74,72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,65,11, 0, 0, 0,
+ 15, 5, 6, 5, 7,43, 6,13,48, 5, 7,45, 5, 7,44, 5,10,92, 5,10,93, 5,10,91,
+ 6,19,63, 6,19,62, 5,10,94, 0, 0, 0, 0, 0, 0,15,12,89,15,12,90,15,12,91,
+ 15,12,92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,12,93,15, 9, 4, 5,15,46,
+ 5,15,41, 4,14,84, 0, 0, 0, 5,15,42, 5,15,44, 5,15,45, 6,26,48, 5,15,49,
+ 5,15,47, 5,15,43, 6,26,47, 6,26,49, 5,15,48, 5,15,50,15,17,67,15,17,68,
+ /* plane 2, page 91 */
+ 0, 255, /* first, last */
+ 15,17,69,15,17,70,15,17,71,15,17,72,15,17,73,15,17,74, 0, 0, 0, 4,14,86,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,34,84, 6,34,90, 5,20,42, 4,19,89,
+ 5,20,45, 6,34,87, 5,20,44, 6,34,92, 4,19,85, 5,20,46, 6,34,85, 5,15,51,
+ 0, 0, 0, 5,20,41, 6,34,89, 6,34,91, 0, 0, 0, 5,20,48, 5,20,49, 6,34,88,
+ 0, 0, 0,15,23,41,15,23,42,15,23,43,15,23,44,15,23,46,15,23,47, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,26,92, 5,27, 2, 5,26,91, 5,26,94, 4,25,76, 4,25,78,
+ 6,44,58, 5,20,43, 4,25,83, 5,27, 1, 5,26,90, 4,25,89, 4,25,87, 4,25,80,
+ 6,44,61, 4,25,88, 0, 0, 0, 6,44,55, 5,27, 5, 6,44,57, 6,44,60, 5,20,47,
+ 5,26,93,15,29,81,15,29,82,15,29,83,15,29,84,15,29,85,15,29,86,15,29,88,
+ 15,29,89,15,29,90,15,29,87, 5,27, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,33,52, 5,33,40, 5,33,47, 4,31,60, 5,33,45, 5,33,37, 4,31,68, 4,31,69,
+ 5,33,48, 4,31,63, 5,26,89, 6,54,16, 5,33,38, 5,33,53, 5,33,43, 5,33,50,
+ 5,33,36, 5,33,41, 5,33,44, 6,54,20, 6,54,18, 6,54,23, 6,54,26, 6,54,19,
+ 6,54,22, 0, 0, 0, 6,54,24, 6,63,91, 5,33,51, 5,33,49, 5,33,46, 5,33,39,
+ 6,54,17, 6,44,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,54,21,
+ 6,54,25,15,36,36,15,36,38,15,36,39,15,36,40,15,36,41,15,36,42,15,36,43,
+ 15,36,44,15,36,45,15,36,46,15,36,47,15,36,48, 6,54,15, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,33,30, 5,40,37, 5,33,54, 4,37,76,
+ 5,40,35, 6,64, 7, 4,37,71, 6,63,92, 6,63,93, 5,40,28, 5,40,27, 5,40,34,
+ 4,37,79, 6,64, 8, 5,40,32, 6,64, 6, 5,40,24, 5,40,25, 6,64, 5, 0, 0, 0,
+ 6,64, 1, 0, 0, 0, 5,40,26, 5,40,33, 5,40,23, 5,40,29, 6,64, 2, 5,33,42,
+ 5,40,39, 6,63,94, 5,40,30, 6,64, 4, 0, 0, 0, 5,40,31, 4,37,81, 5,40,36,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,42,75,15,42,76,15,42,77,
+ 15,42,78,15,42,79,15,42,80,15,42,83,15,42,84,15,42,85,15,42,86,15,42,87,
+ 15,42,88,15,42,89,15,42,90, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,42,82, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,42,81, 5,47,26, 7, 6,41, 7, 6,43, 5,47,36, 4,44,15, 5,47,19, 7, 6,49,
+ 7, 6,42, 5,47,30, 4,43,81, 4,43,79, 5,47,33, 5,47,15, 5,47,20, 5,47,35,
+ 7, 6,34, 5,47,32, 5,47,17, 4,50,32, 5,47,25, 5,47,34, 4,43,82, 4,44, 9,
+ 4,44, 3, 4,43,93, 5,47,24, 5,47,23, 5,47,28, 7, 6,46, 5,40,40, 5,47,21,
+ 7, 6,48, 7, 6,39, 7, 6,36, 5,47,31, 7, 6,32, 7, 6,51, 4,44, 4, 7, 6,47,
+ 4,43,92, 7, 6,44, 5,47,29, 0, 0, 0, 7, 6,37, 7, 6,35, 5,47,14, 7, 6,40,
+ /* plane 2, page 92 */
+ 2, 255, /* first, last */
+ 7, 6,38, 0, 0, 0, 0, 0, 0, 5,47,38,15,48,88, 0, 0, 0,
+ 0, 0, 0, 7, 6,50, 0, 0, 0,15,48,87,15,48,90,15,48,91,15,48,92,15,48,93,
+ 15,48,94,15,49, 2,15,49, 4,15,49, 9,15,49, 5,15,49, 6,15,49, 7,15,49,10,
+ 5,54,68, 4,50,33, 4,50,30, 5,54,56, 5,54,62, 5,54,70, 7,17,10, 5,54,60,
+ 4,50,14, 5,54,61, 4,50,12, 5,54,72, 7, 6,33, 7,17, 5, 4,50,18, 5,54,71,
+ 4,50,17, 7,17, 9, 4,50,28, 7,16,94, 7,17, 6, 4,50,16, 5,54,64, 7,16,91,
+ 4,50,31, 5,54,63, 5,54,57, 7,16,90, 7,17, 8, 4,50,10, 5,54,55, 7,17, 4,
+ 4,50,21, 5,54,69, 7,16,93, 5,54,66, 4,50,19, 7,17,11, 7,16,85, 7,17, 7,
+ 5,47,16, 5,54,67, 5,54,58, 0, 0, 0, 7,16,88, 7,17, 3, 7,16,86, 5,54,65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,54,82, 5,54,59, 7,16,92, 7,16,87,
+ 7,17, 2,15,54,61,15,54,62,15,54,64,15,54,65,15,54,66,15,54,67,15,54,68,
+ 15,54,69,15,54,70,15,54,71,15,54,72,15,54,73,15,54,74,15,54,75,15,54,76,
+ 15,54,77,15,54,78,15,54,79,15,54,80,15,54,81, 0, 0, 0,15,54,83, 0, 0, 0,
+ 0, 0, 0, 7,16,89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,48,89, 0, 0, 0, 5,61, 4, 5,61, 1, 4,55,61,
+ 5,60,85, 5,61,13, 5,60,89, 4,55,60, 4,55,67, 4,55,71, 7,26,12, 5,61,11,
+ 4,55,64, 5,61, 2, 0, 0, 0, 0, 0, 0, 5,60,80, 5,61, 3, 5,60,82, 5,61,17,
+ 5,60,91, 5,61,10, 5,60,87, 5,61,20, 7,26, 4, 5,60,86, 5,60,92, 5,61, 6,
+ 4,55,68, 5,61, 7, 7,26, 9, 0, 0, 0, 0, 0, 0, 5,67,34, 5,61,12, 5,60,90,
+ 7,26,15, 7,26, 8, 5,60,79, 5,61,18, 5,61, 9, 5,60,83, 7,26,11, 5,61,14,
+ 5,60,81, 5,60,78, 5,61, 8, 4,55,70, 4,60,28, 5,61,19, 5,60,88, 5,61,15,
+ 5,61, 5, 7,17, 1, 5,60,84, 7,26, 7, 7,26, 6, 0, 0, 0, 7,26, 5, 7,26,13,
+ 15,59,61,15,59,62,15,59,64,15,59,65,15,59,66,15,59,67,15,59,68,15,59,70,
+ 15,59,71,15,59,72,15,59,73, 7,26,10, 7,26,14, 4,55,72, 0, 0, 0, 0, 0, 0,
+ 15,59,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,55,65, 5,67,43,
+ 5,67,39, 5,61,21, 4,60,50, 5,67,37, 5,67,24, 5,67,19, 4,60,39, 5,67,42,
+ 5,67,32, 3,56,47, 5,67,14, 4,60,46, 4,60,37, 5,67,35, 5,67,25, 5,67,44,
+ 4,60,29, 7,33,27, 5,67,38, 5,67,16, 5,67,23, 4,60,30, 4,60,31, 5,67,40,
+ 7,33,25, 5,67,21, 5,67,18, 5,67,31, 7,33,21, 5,67,12, 7,33,22, 4,60,33,
+ 7,33,19, 4,60,51, 5,67,30, 7,33,24, 5,67,29, 7,33,26, 7,33,30, 7,33,20,
+ 5,67,17, 4,60,45, 5,67,22, 5,67,26, 5,67,36, 5,67,41, 5,67,28, 5,67,13,
+ 7,33,34, 7,33,33, 5,67,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,67,11,
+ /* plane 2, page 93 */
+ 0, 255, /* first, last */
+ 5,67,15, 7,33,18, 7,33,23,15,63,86,15,63,87,15,63,88,15,63,89,15,63,90,
+ 15,63,91,15,63,92,15,63,93,15,63,94,15,64, 1,15,64, 3,15,64, 4,15,64, 5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,33,32, 7,33,29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,59,74,15,67,22,15,67,23,
+ 15,64, 2, 5,72,74, 5,72,79, 7,40,46, 4,64,57, 7,40,44, 5,72,67, 4,64,52,
+ 4,64,53, 4,64,49, 5,72,73, 4,64,47, 4,64,48, 7,40,40, 4,64,50, 5,72,66,
+ 4,64,56, 4,64,45, 7,40,39, 0, 0, 0, 5,72,77, 5,72,72, 5,72,80, 5,72,76,
+ 5,72,75, 5,72,69, 5,72,68, 5,72,71, 0, 0, 0, 7,40,38, 7,40,42, 5,72,65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,72,81, 7,40,41,15,67,17,15,67,19,
+ 15,67,20,15,67,21,15,67,24,15,67,25,15,67,26,15,67,27,15,67,28, 0, 0, 0,
+ 7,40,43, 0, 0, 0, 0, 0, 0, 7,40,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,76,92, 5,76,91, 5,76,86, 4,64,55,
+ 5,76,84, 7,46,76, 5,76,90, 4,67,93, 7,46,84, 4,68, 2, 5,76,88, 5,76,83,
+ 4,70,80, 7,46,74, 5,76,79, 5,76,85, 5,76,81, 7,46,73, 7,46,85, 5,76,87,
+ 7,46,77, 7,46,78, 5,76,82, 7,46,79, 7,52,24, 7,46,81, 7,46,80, 0, 0, 0,
+ 7,46,82, 7,46,83,15,69,72,15,69,73, 0, 0, 0, 7,46,75, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,80,68, 5,80,72,
+ 5,80,73, 0, 0, 0, 4,70,81, 4,70,75, 5,80,70, 5,80,75, 7,52,15, 5,80,62,
+ 5,80,67, 5,80,64, 4,68, 1, 5,80,71, 5,80,63, 5,76,80, 7,52,21, 5,80,74,
+ 5,80,61, 7,52,17, 5,80,69, 4,73, 7, 5,80,76, 7,52,22, 7,52,16, 7,52,20,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,72, 3,15,72, 4,15,72, 5,15,72, 6,15,72, 7,
+ 15,72, 8,15,72, 9, 7,52,19, 7,52,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,52,18, 7,56,53, 4,73, 4, 4,73, 3,
+ 5,83,80, 5,83,78, 5,80,66, 5,83,81, 7,56,50, 5,80,77, 7,56,49, 5,83,84,
+ 4,73, 5, 5,83,77, 7,56,52, 7,52,23, 5,83,86, 5,83,83, 5,83,79, 5,83,85,
+ 5,83,82, 7,56,54, 0, 0, 0, 0, 0, 0,15,73,63,15,73,64,15,73,65,15,73,66,
+ 7,56,51, 7,57,20, 0, 0, 0, 0, 0, 0, 4,74,62, 5,86,19, 7,60,17, 5,86,20,
+ 4,74,63, 4,74,64, 4,74,66, 7,60,16, 5,86,22, 7,60,18, 5,86,21, 7,60,22,
+ 7,60,21,15,74,73, 7,60,19, 7,60,23, 7,60,20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,87,82, 7,63,11, 7,63,14, 5,87,84, 5,87,85, 7,63,13, 5,86,23, 7,63,12,
+ 7,63,10, 5,87,83, 7,63,17, 0, 0, 0, 4,75,87,15,75,58,15,75,59,15,75,60,
+ 7,63,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,89,21, 7,65,12, 7,65,14, 7,65,17,
+ /* plane 2, page 94 */
+ 0, 255, /* first, last */
+ 4,76,89, 0, 0, 0, 0, 0, 0, 7,65,15, 0, 0, 0, 7,63,16, 0, 0, 0, 7,65,13,
+ 5,90,17, 5,90,15, 5,90,16, 7,65,16, 0, 0, 0, 0, 0, 0,15,76,47,15,76,45,
+ 7,67,62, 7,67,63, 0, 0, 0, 0, 0, 0,15,76,72, 0, 0, 0, 7,67,64, 5,91,36,
+ 5,91,68,15,77, 7, 0, 0, 0, 0, 0, 0, 7,68,52, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,78,46, 5,91,92, 5,92,11, 0, 0, 0, 5, 4,81,15, 5, 7, 5, 7,46,
+ 6,13,49,15, 8,37, 0, 0, 0, 6,19,65, 5,11, 2, 6,19,64, 0, 0, 0, 5,11, 3,
+ 15,12,94,15,13, 2, 0, 0, 0, 6,26,50, 5,15,52, 6,26,54, 5,15,53, 6,26,52,
+ 5,15,54,15,17,75,15,17,76,15,17,77,15,17,78, 6,26,51, 6,26,53, 0, 0, 0,
+ 0, 0, 0, 4,19,94, 5,20,53, 4,20, 4, 0, 0, 0, 5,20,52, 4,20, 1, 5,20,56,
+ 5,20,51, 5,20,54, 5,20,55, 4,20, 3, 5,20,58, 5,20,50, 6,34,93, 6,44,67,
+ 6,35, 1,15,23,48,15,23,49, 0, 0, 0, 0, 0, 0, 6,34,94,15,23,50, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,27, 6, 0, 0, 0, 4,25,90, 6,44,65, 6,44,62, 6,44,69,
+ 5,27, 8, 4,26, 1, 6,44,68, 0, 0, 0, 6,44,63, 0, 0, 0,15,29,92,15,29,94,
+ 15,30, 2, 0, 0, 0, 0, 0, 0,15,29,91, 0, 0, 0, 6,44,66, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,33,55, 4,31,72, 6,54,29, 5,33,57, 5,33,58, 5,27, 7,
+ 5,33,56, 6,54,31, 6,54,30, 4,25,94, 5,33,59, 5,33,61, 5,33,60, 6,54,33,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,36,50,15,36,51,15,36,53,15,36,54,
+ 6,54,27,15,36,52, 0, 0, 0, 6,54,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,36,49,
+ 6,64,13, 5,40,42, 6,64,11, 6,64,14, 5,40,44, 4,37,83, 6,54,28, 6,64,19,
+ 6,64,18, 5,40,43, 6,64,16, 5,40,41, 5,40,45, 0, 0, 0, 0, 0, 0,15,42,92,
+ 15,42,93,15,42,94,15,43, 1,15,43, 2,15,43, 3,15,43, 5,15,43, 6,15,43, 8,
+ 15,43, 9,15,43,10,15,43,13, 6,64,15,15,43,12, 0, 0, 0, 6,64, 9, 0, 0, 0,
+ 6,64,10, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,43, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 6,56, 7, 6,52, 4,44,22, 5,47,43, 7, 6,53, 7, 6,57, 4,44,19,
+ 5,47,42, 5,47,44, 5,47,48, 5,40,46, 5,47,47, 5,47,45, 7, 6,59, 7, 6,54,
+ 5,47,41, 4,44,20, 5,47,46, 4,44,18, 7, 6,58, 5,47,40, 5,47,39, 0, 0, 0,
+ 0, 0, 0,15,49,11,15,49,12,15,49,13,15,49,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,54,78, 5,54,76, 5,61,28, 4,50,35,
+ 5,54,75, 4,50,34, 7,17,15, 7,17,16, 5,54,79, 7,17,12, 5,54,74, 5,54,77,
+ 5,54,80,15,54,84,15,54,85, 7,17,14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,61,22,
+ /* plane 2, page 95 */
+ 0, 255, /* first, last */
+ 5,61,24, 7,26,16, 5,61,25, 5,61,23, 5,61,26, 5,61,27, 7,26,18, 7,26,20,
+ 7,26,21, 7,26,17, 0, 0, 0, 0, 0, 0,15,59,75,15,59,76,15,59,77,15,59,79,
+ 15,59,80,15,59,81,15,59,82, 4,55,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,67,50, 7,33,37, 4,60,55, 5,67,51, 5,67,47, 7,40,54, 5,67,49, 5,61,29,
+ 7,33,38, 5,67,48, 7,46,88, 0, 0, 0, 5,67,45, 7,33,35,15,64, 7,15,64, 8,
+ 15,64, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,59,78, 5,72,84, 7,40,47,
+ 7,40,48, 4,64,62, 4,64,60, 5,72,83, 5,80,78, 7,40,50, 7,40,51, 7,33,40,
+ 4,64,63, 4,60,56, 5,72,85, 7,33,39, 0, 0, 0, 5,72,82,15,67,30, 7,40,49,
+ 0, 0, 0, 7,40,52, 7,40,53,15,67,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,46,87,
+ 5,76,94, 7,46,86, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,69,74,15,69,75, 4,70,83,
+ 4,70,82, 5,80,79, 7,52,29, 7,52,28, 0, 0, 0,15,72,10,15,72,11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,52,27, 0, 0, 0, 5,83,87, 7,56,55, 5,83,88,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,74,67, 4,74,68, 7,60,24,15,74,74,
+ 5,86,24, 7,60,25, 7,63,18, 5,87,87, 5,87,86, 0, 0, 0, 5,89,24, 7,65,19,
+ 5,89,23, 5,89,22, 7,65,18, 7,66,44, 4,77,61, 5,90,18, 7,66,43, 5,90,19,
+ 7,67,66, 7,67,65, 5,91,93, 0, 0, 0, 7,70,22, 5, 7,47, 6,13,50, 5, 7,48,
+ 15, 8,39,15, 8,40, 5, 7,49, 0, 0, 0, 5,11, 6, 6,19,66, 6,19,69, 5,11, 4,
+ 5,11, 5, 6,19,71, 6,19,67, 5,11, 7,15,13, 3, 0, 0, 0, 6,19,72, 0, 0, 0,
+ 0, 0, 0, 6,26,59, 6,26,55, 4,14,89, 6,26,67, 4,14,91, 6,26,61, 0, 0, 0,
+ 6,26,60, 6,26,63, 5,15,58, 4,14,90, 4,15, 4, 6,26,68, 6,26,57, 4,15, 3,
+ 6,26,62, 4,15, 2, 6,26,64, 6,26,56, 5,15,57, 6,26,65, 5,15,56, 5,15,55,
+ 6,26,58, 0, 0, 0,15,17,81,15,17,82,15,17,83,15,17,84,15,17,85,15,17,86,
+ 15,17,87, 0, 0, 0, 4,15, 6, 6,26,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,20,63, 5,20,61, 4,20,18, 4,20, 8, 4,20,10,
+ 6,35, 8, 4,20,15, 5,20,62, 4,20,17, 6,35, 9, 5,20,59, 4,20,12, 6,35,11,
+ 6,35,10, 6,35, 5, 6,35, 3, 6,35, 4, 0, 0, 0, 5,20,60,15,23,56,15,23,57,
+ 15,23,58,15,23,59, 0, 0, 0, 0, 0, 0, 6,35, 7, 0, 0, 0, 0, 0, 0, 6,35,12,
+ 0, 0, 0,15,23,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,27,17, 5,27,16,
+ 5,27,14, 5,27,18, 6,44,77, 4,26, 3, 6,44,70, 6,44,76, 4,26, 2, 4,26, 4,
+ 6,44,78, 6,35, 6, 6,44,71, 6,44,80, 6,44,72, 5,27,13, 6,44,74, 6,44,73,
+ 6,44,79, 5,27,10, 5,27, 9, 0, 0, 0, 5,27,11,15,30, 5,15,30, 6,15,30, 7,
+ /* plane 2, page 96 */
+ 0, 250, /* first, last */
+ 15,30, 8,15,30, 9,15,30,10,15,30,11,15,30,12,15,30,13,15,30,14, 6,44,75,
+ 0, 0, 0, 5,27,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,54,43, 6,54,34, 5,33,63, 5,33,62, 4,31,76, 6,54,36,
+ 4,31,77, 6,54,40, 6,54,37, 4,31,73, 5,33,65, 5,33,64, 6,54,35, 6,54,41,
+ 4,26, 5, 4,31,75, 6,54,38, 5,33,66, 6,54,44, 6,54,45, 4,31,82, 6,54,42,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,36,55,15,36,56,15,36,57,15,36,58,
+ 15,36,59,15,36,60,15,36,61,15,36,62,15,36,63,15,36,64,15,36,65,15,36,66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,54,39, 4,31,80, 0, 0, 0, 4,37,88, 0, 0, 0,
+ 5,40,48, 4,37,86, 5,40,50, 6,64,31, 6,64,30, 5,40,54, 4,37,90, 5,40,53,
+ 4,37,87, 6,64,25, 6,64,35, 6,64,34, 6,64,22, 4,37,93, 5,40,47, 5,33,67,
+ 6,64,33, 5,40,49, 6,64,28, 6,64,20, 5,40,51, 5,40,55, 6,64,32, 0, 0, 0,
+ 0, 0, 0, 6,64,27, 0, 0, 0, 0, 0, 0, 4,38, 2, 6,64,24,15,43,14,15,43,15,
+ 15,43,16,15,43,17,15,43,18,15,43,19,15,43,20,15,43,21,15,43,22,15,43,23,
+ 6,64,21, 6,64,23, 0, 0, 0, 0, 0, 0, 6,64,29, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,44,24, 4,44,35, 7, 6,64, 4,44,34, 4,44,27, 5,47,59, 5,47,57, 4,50,40,
+ 5,47,56, 5,47,61, 0, 0, 0, 5,47,53, 4,44,38, 5,47,58, 7, 6,76, 7, 6,62,
+ 7, 6,68, 5,47,60, 5,47,50, 7, 6,65, 7, 6,70, 5,47,55, 0, 0, 0, 4,44,33,
+ 4,44,25, 7, 6,61, 7, 6,69, 7, 6,60, 7, 6,71, 6,64,26, 7, 6,77, 7, 6,75,
+ 5,47,49, 5,47,54, 5,47,62, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,49,16,15,49,17,
+ 15,49,18,15,49,19,15,49,20,15,49,21,15,49,24,15,49,25,15,49,26,15,49,29,
+ 15,49,30,15,49,31, 0, 0, 0, 0, 0, 0, 7, 6,66, 7, 6,72, 0, 0, 0, 7, 6,63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 6,67, 0, 0, 0, 7,17,38, 4,50,38, 7,17,35, 7,17,36, 4,50,42,
+ 7,17,32, 7,17,29, 5,54,84, 5,54,86, 7,17,17, 7,17,34, 7,17,18, 7,26,22,
+ 7,17,19, 7,17,22, 5,54,85, 5,54,87, 5,54,83, 5,61,37, 4,50,37, 5,54,81,
+ 5,54,82, 4,50,43, 0, 0, 0, 7,17,26, 7,17,23, 7,17,24, 7,17,33, 4,50,45,
+ 7,17,21, 0, 0, 0, 5,54,89, 7,17,20, 7,17,37, 7,17,27, 5,54,88, 7,17,31,
+ 7,17,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,17,25, 7,17,28,15,54,86,15,54,87,15,54,88,15,54,89,15,54,90,15,54,91,
+ 15,54,92,15,54,93,15,54,94,
+ /* plane 2, page 97 */
+ 9, 255, /* first, last */
+ 7,26,36, 7,26,35, 5,61,35, 5,61,32, 4,55,81, 7,26,23, 5,61,33,
+ 7,26,34, 4,55,79, 7,26,26, 5,61,36, 5,61,30, 7,26,30, 7,26,27, 7,26,28,
+ 7,26,32, 5,61,34, 7,26,33, 7,26,29, 5,61,39, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,59,83,15,59,84,15,59,85,15,59,87,15,59,88,15,59,89,
+ 15,59,90,15,59,91,15,59,92,15,59,93,15,59,94,15,60, 1,15,60, 2, 0, 0, 0,
+ 0, 0, 0, 7,26,31, 7,26,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,60,68, 4,60,60, 7,33,46, 4,60,67,
+ 4,60,61, 7,33,45, 7,33,52, 4,60,65, 4,55,80, 7,33,41, 5,67,53, 5,67,56,
+ 5,67,55, 7,33,43, 7,33,49, 5,67,54, 7,33,42, 7,33,47, 7,33,50, 7,33,44,
+ 7,33,55, 7,33,53, 7,33,48, 7,33,59, 5,67,58, 7,33,54, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,64,10,15,64,11,15,64,12,
+ 15,64,13,15,64,14,15,64,15,15,64,16,15,64,17,15,64,18, 0, 0, 0, 5,67,57,
+ 7,33,60, 0, 0, 0, 7,33,58, 0, 0, 0, 7,33,56, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,33,51, 0, 0, 0, 4,64,68, 4,64,69, 7,40,63,
+ 4,64,73, 7,40,71, 5,72,86, 7,40,68, 4,64,71, 7,40,70, 4,64,75, 5,72,89,
+ 4,64,64, 5,72,90, 7,40,65, 7,39,43, 4,64,65, 7,40,61, 5,72,87, 0, 0, 0,
+ 7,40,67, 7,40,59, 7,40,66, 5,72,88, 7,40,57, 7,40,58, 7,40,64, 7,40,62,
+ 15,67,32,15,67,33,15,67,35,15,67,36,15,67,37, 7,42,83, 7,40,60, 7,40,69,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,64,74, 7,46,93, 7,46,92, 5,77, 3, 5,77, 1,
+ 4,68, 5, 7,46,94, 7,47, 3, 7,46,91, 7,52,34, 7,40,56, 5,77, 4, 7,47, 4,
+ 0, 0, 0, 7,47, 6, 7,46,90, 4,70,89, 7,47, 2, 0, 0, 0, 0, 0, 0, 7,46,89,
+ 7,47, 5,15,69,76,15,69,77,15,69,78,15,69,80,15,69,81, 7,47, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,80,82, 4,70,85, 7,52,35, 5,80,83, 4,70,88,
+ 4,70,86, 4,70,87, 7,56,62, 7,47, 7, 7,52,31, 7,52,30, 0, 0, 0, 0, 0, 0,
+ 7,52,33,15,72,12,15,72,13,15,72,14,15,72,15, 0, 0, 0, 4,70,84, 7,52,32,
+ 0, 0, 0, 5,80,81, 0, 0, 0, 7,52,36, 5,83,91, 7,56,57, 5,83,92, 5,83,89,
+ 4,73, 9, 5,86,26, 7,56,61, 5,83,90, 7,56,59, 0, 0, 0,15,73,67,15,73,68,
+ 15,73,69,15,73,70, 7,56,58, 7,56,60, 0, 0, 0, 4,73,43, 0, 0, 0, 4,74,71,
+ 7,56,63, 7,60,26, 7,60,27, 4,74,72, 4,74,73, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,75,90, 5,87,88, 7,63,23, 7,63,21,15,75,61, 0, 0, 0, 7,63,22, 7,63,24,
+ 5,89,26, 7,63,20, 5,89,25, 7,65,20, 7,66,47, 7,66,46, 7,67,67,15,76,73,
+ /* plane 2, page 98 */
+ 0, 255, /* first, last */
+ 7,67,69, 7,67,68, 0, 0, 0, 7,68,53, 0, 0, 0, 5,91,69,15,77,16, 7,69,85,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 5,34, 4,10,88, 0, 0, 0, 5,11, 8, 4,15, 8, 6,26,70,
+ 5,15,59, 5,20,65, 0, 0, 0, 6,35,13, 5,27,20, 6,35,15, 6,35,14, 6,44,84,
+ 4,26, 9, 6,44,83, 5,27,19,15,30,15, 6,54,48, 6,54,47, 4,31,84, 0, 0, 0,
+ 4,38, 4, 6,64,37, 5,40,56, 6,64,36, 7, 6,78, 0, 0, 0,15,43,25,15,43,26,
+ 15,43,27, 7, 6,80, 4,44,39, 0, 0, 0,15,49,32,15,49,33, 0, 0, 0, 7, 6,79,
+ 5,54,91, 5,54,90, 0, 0, 0,15,55, 2,15,55, 1, 0, 0, 0, 5,61,41, 7,26,37,
+ 5,61,40,15,58,56,15,60, 3,15,60, 4, 0, 0, 0, 7,33,61, 7,33,62,15,64,19,
+ 0, 0, 0, 7,40,72, 4,64,76,15,67,38, 0, 0, 0, 5,80,84, 4,68, 7, 4,70,90,
+ 7,52,37, 0, 0, 0, 4,74,74, 7,60,28,15,74,75, 7,63,26, 7,63,25, 5,90,20,
+ 0, 0, 0, 7,70,10, 6, 2, 9, 6, 2, 8, 4, 4,74, 6, 5,36, 6, 5,37, 6, 8,83,
+ 0, 0, 0, 0, 0, 0,15, 1,92, 6, 5,35,15, 5, 8,15, 5,10, 0, 0, 0, 6,13,51,
+ 6,19,74, 4, 7,61, 0, 0, 0, 6,19,73, 6,13,52, 0, 0, 0, 4, 7,62, 6, 8,84,
+ 4, 4,75, 6,19,75, 4,10,90, 4,10,92, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 5,54,
+ 5,11, 9,15, 8,41, 0, 0, 0, 5, 7,50, 0, 0, 0, 6,26,71, 6,26,72, 6,26,73,
+ 5,15,63, 6,26,76, 6,26,74, 4,15,12, 4,15,11, 6,19,78, 6,19,76, 6,19,79,
+ 6,35,21,15, 9,25, 0, 0, 0, 0, 0, 0, 5,15,61, 6,35,16, 6,35,17, 6,35,18,
+ 6,35,20, 6,35,22,15,17,89, 6,19,77, 6,22,90, 0, 0, 0, 0, 0, 0, 5,11,10,
+ 4,10,93, 6,35,19, 6,44,87, 6,35,23, 0, 0, 0, 6,26,77, 6,44,86, 6,35,24,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,15,62, 5,20,66,15,23,60, 6,44,85, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,27,22, 5,27,21, 4,26,12, 6,44,88,
+ 0, 0, 0, 0, 0, 0,15,30,16, 0, 0, 0, 6,54,50, 5,33,71, 6,54,52, 6,44,90,
+ 5,33,68, 5,33,70, 6,54,51, 6,54,53, 6,44,89, 6,54,54, 0, 0, 0, 0, 0, 0,
+ 15,30,17, 6,54,49,15,36,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,64,38, 6,64,40,
+ 6,64,41, 6,64,42, 6,64,43, 6,64,44, 6,64,45, 6,64,48, 5,40,59, 7, 6,85,
+ 6,64,46, 5,40,58, 6,54,55, 5,40,57, 6,64,47, 0, 0, 0, 0, 0, 0, 6,64,39,
+ 15,43,28, 0, 0, 0, 0, 0, 0, 7, 6,81, 7, 6,82, 7, 6,83, 7, 6,84, 5,47,66,
+ 5,47,63, 6,64,50, 7, 6,86, 5,47,64, 5,47,65, 6,64,49, 0, 0, 0,15,49,34,
+ 15,49,35, 7, 5,83, 0, 0, 0, 7,17,39, 7,17,40, 7,17,44, 7,17,41, 5,54,92,
+ /* plane 2, page 99 */
+ 0, 254, /* first, last */
+ 7,17,43, 4,50,49, 7,26,46, 7,17,42, 0, 0, 0, 7,17,45, 5,47,67, 0, 0, 0,
+ 0, 0, 0, 5,54,93, 4,50,48, 0, 0, 0, 0, 0, 0, 7, 6,87, 7, 6,88, 7,26,39,
+ 7,26,40, 7,26,43, 5,61,42, 7,17,46, 4,55,84, 5,67,59, 7,26,44, 7,26,45,
+ 0, 0, 0,15,60, 5, 0, 0, 0,15,55, 3, 7,33,63, 7,33,64, 7,33,66, 7,33,68,
+ 4,60,71, 4,60,70, 5,67,60, 7,33,67, 7,40,73, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,26,42, 5,67,62, 5,72,91, 7,40,76, 4,64,78, 7,40,74, 7,40,75, 0, 0, 0,
+ 0, 0, 0, 7,47, 8, 7,47, 9, 7,47,10, 7,47,11, 5,77, 5, 5,77, 7, 7,47,12,
+ 5,77, 6, 0, 0, 0, 5,77, 8, 7,52,38, 7,47,13, 0, 0, 0, 5,87,90, 4,75,92,
+ 7,63,27, 5,87,91, 5,87,89, 7,65,21, 0, 0, 0, 0, 0, 0, 7,66,48, 7,67,70,
+ 7,68,54, 0, 0, 0, 7,69,28, 4, 4,76, 4, 3,12,15, 1,64, 6,13,54, 5, 7,51,
+ 6,13,53,15,13, 4, 6,19,81, 0, 0, 0, 6,19,80, 4,10,94,15, 8,43, 6,26,78,
+ 6,26,79, 0, 0, 0, 6,35,27, 6,26,83, 6,26,82, 6,26,81, 6,26,80, 6,35,26,
+ 0, 0, 0,15,17,90,15,17,91, 0, 0, 0, 0, 0, 0, 6,35,29, 5,20,68, 4,26,14,
+ 6,35,30, 4,20,25, 5,20,69, 0, 0, 0,15,23,61, 5,20,67, 6,35,25,15,23,62,
+ 15,23,63, 0, 0, 0, 6,35,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,27,25, 5,27,23, 6,44,93, 4,26,15, 6,45, 1, 5,27,24, 6,44,94,
+ 6,44,92, 0, 0, 0, 0, 0, 0, 6,45, 2, 0, 0, 0, 6,39, 1, 6,54,58, 5,33,72,
+ 6,54,59, 6,54,56, 5,33,73, 6,54,57, 0, 0, 0, 6,54,60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,33,74,15,30,19,15,30,20, 5,40,60,
+ 6,64,51, 6,64,53, 5,40,61, 0, 0, 0, 0, 0, 0, 6,64,52, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,47,68, 4,44,42, 7, 6,91, 7, 6,92, 4,44,43, 7,17,47,
+ 0, 0, 0, 7, 6,90, 0, 0, 0, 4,44,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,55, 1,
+ 5,54,94, 4,50,50, 0, 0, 0,15,55, 5, 7,17,48, 0, 0, 0, 0, 0, 0, 4,55,88,
+ 4,55,86, 5,61,43, 7,26,48, 7,26,47, 7,26,50, 0, 0, 0, 0, 0, 0,15,60, 6,
+ 0, 0, 0, 4,50,52, 0, 0, 0, 7,26,49, 0, 0, 0, 5,67,61, 4,60,73, 5,67,63,
+ 7,33,73, 7,33,74, 4,60,77, 7,33,71, 7,33,72, 7,33,70,15,55, 4,15,64,20,
+ 15,64,21, 4,60,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,72,92, 7,40,80, 5,86,27,
+ 7,40,79, 7,47,14, 7,40,78, 0, 0, 0, 5,77, 9, 7,47,15, 7,47,16, 7,47,17,
+ 7,47,18, 7,33,69, 5,80,85, 7,52,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,52,40,
+ 5,83,93, 7,56,64, 7,60,30, 7,60,29, 0, 0, 0, 7,65,22, 0, 0, 0, 7,67,71,
+ 7,69,62, 0, 0, 0, 6,13,55, 0, 0, 0, 6,19,85, 6,19,82, 6,19,86, 5,11,11,
+ 4,11, 2, 4,11, 1, 4,11, 4, 6,19,84, 4,11, 3,15,13, 5,15,13, 6,
+ /* plane 2, page 100 */
+ 0, 254, /* first, last */
+ 6,19,83, 0, 0, 0, 4,15,19, 6,26,86, 5,15,65, 5,15,67, 5,15,64, 4,15,17,
+ 4,15,22, 4,15,21, 6,26,85, 5,15,66, 4,15,20, 4,15,18, 6,26,87, 0, 0, 0,
+ 15,15,67,15,15,68, 0, 0, 0, 4,15,23,15,17,92, 5,20,70, 6,35,33, 6,35,32,
+ 6,35,34, 6,35,35, 6,35,36, 6,35,38, 6,35,39, 0, 0, 0, 4,20,31, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,35,37, 5,27,27, 4,26,18, 6,45, 6, 6,45, 7, 6,45,13,
+ 5,27,29, 4,26,22, 6,45,14, 0, 0, 0, 6,45, 8, 6,45, 5, 6,45,15, 6,45,16,
+ 5,27,28, 6,45,10, 6,45,12, 6,45,11, 0, 0, 0,15,30,21,15,30,22, 6,45, 9,
+ 5,33,78, 5,33,75, 4,31,89, 6,54,61, 6,54,62, 6,54,63, 5,33,77, 0, 0, 0,
+ 5,33,76, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,36,68, 0, 0, 0, 6,45, 4, 5,40,69,
+ 5,40,62, 6,64,55, 5,40,63, 5,40,67, 5,40,64, 5,40,68, 5,40,65, 5,40,66,
+ 6,64,54, 5,40,70,15,43,29,15,43,30,15,43,31,15,43,32, 0, 0, 0, 0, 0, 0,
+ 5,47,74, 5,47,75, 7, 6,94, 5,47,72, 4,44,44, 5,47,76, 5,47,69, 7, 6,93,
+ 5,47,71,15,49,38, 6,64,57, 5,47,70, 7, 7, 4, 7, 7, 5, 7, 7, 1, 4,44,46,
+ 7, 7, 2, 4,44,45, 7, 7, 3,15,49,36,15,49,37, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,17,49, 7,17,51, 5,55, 5, 7,17,54, 7,17,50, 7,17,52, 4,50,55, 0, 0, 0,
+ 5,55, 3, 5,55, 6, 5,55, 4, 5,47,73, 5,55, 2, 7,17,53, 5,55, 7,15,55, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,55,89, 7,26,52, 5,61,44, 7,26,53, 7,40,81,
+ 5,61,45, 0, 0, 0, 7,26,51,15,60, 7,15,60, 8, 5,67,64, 4,60,78, 7,33,81,
+ 5,61,46, 4,60,79, 7,33,77, 7,33,79, 7,33,76, 7,33,80, 7,33,78, 0, 0, 0,
+ 0, 0, 0,15,64,22,15,64,23, 7,33,75, 4,64,80, 5,72,94, 0, 0, 0, 5,72,93,
+ 7,40,82, 0, 0, 0, 7,47,21, 7,47,22,15,69,82, 7,47,19, 4,70,92, 0, 0, 0,
+ 7,52,41, 7,52,43, 7,47,20, 0, 0, 0, 7,52,42, 7,56,66, 7,56,67, 7,56,65,
+ 0, 0, 0, 6, 5,38, 6,13,56, 6, 8,85, 0, 0, 0, 0, 0, 0, 4, 7,63, 4, 7,64,
+ 6,26,88, 0, 0, 0, 4,20,32, 5,11,12,15,23,64,15,23,65, 6,35,40, 0, 0, 0,
+ 6,45,17, 7, 7, 6, 0, 0, 0, 7,17,56, 7,17,55, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,75,62, 0, 0, 0, 6,13,57, 6,13,58,
+ 5, 1,89,15, 8,44, 4,15,25, 5,20,71, 5,27,30, 0, 0, 0, 5,33,79, 6,64,58,
+ 7, 7, 7, 7, 7, 9, 5,40,71, 0, 0, 0, 0, 0, 0, 7,17,58, 7,17,57, 0, 0, 0,
+ 7,26,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 1, 6,13,59,15, 8,45, 0, 0, 0,
+ 6,19,87,15,13, 7, 6,19,88,15,17,94, 5,20,72,15,23,66, 6,35,41, 4,26,23,
+ 5,27,33, 5,27,32, 0, 0, 0, 0, 0, 0, 4,31,91, 6,54,64, 0, 0, 0, 6,64,60,
+ 5,40,76, 5,40,72, 5,40,77, 5,40,74, 5,40,73, 5,40,75, 4,38,17,
+ /* plane 2, page 101 */
+ 0, 254, /* first, last */
+ 15,36,69, 6,64,59, 5,47,79, 5,47,80, 5,47,81, 5,47,77, 5,47,78, 0, 0, 0,
+ 0, 0, 0, 7, 7,10, 0, 0, 0, 5,55, 9, 5,55, 8, 4,50,56, 4,50,57, 7,17,60,
+ 7,17,61, 7,17,59,15,49,39, 5,61,47, 4,55,92, 7,26,58, 0, 0, 0, 7,26,55,
+ 7,26,56, 0, 0, 0,15,55, 9, 5,67,65, 4,55,94, 7,33,82, 7,26,57, 7,40,85,
+ 5,67,66, 7,33,84, 7,33,83,15,60, 9,15,60,10, 7,40,84, 5,73, 1, 0, 0, 0,
+ 7,40,83, 4,70,94, 7,52,44, 4,74,76, 5,87,92, 5,89,27, 0, 0, 0, 5, 7,53,
+ 5, 7,52, 6,13,62,15, 8,46,15, 8,47, 0, 0, 0, 6,13,61, 0, 0, 0, 5,11,15,
+ 5,11,13, 5,11,14, 0, 0, 0, 0, 0, 0, 4,15,28, 6,26,94, 4,15,27, 6,26,90,
+ 5,15,68, 6,27, 2,15,18, 1,15,18, 4,15,18, 6,15,18, 7, 0, 0, 0, 6,26,91,
+ 15,18, 2, 0, 0, 0, 6,26,93, 6,26,92, 6,27, 3, 6,26,89,15,18, 5, 5,15,69,
+ 6,35,43, 4,20,35, 4,20,34, 4,20,36, 6,35,45, 5,20,73, 6,35,47, 6,35,46,
+ 6,35,44, 0, 0, 0, 6,35,42,15,23,67,15,23,68,15,23,69,15,23,70, 0, 0, 0,
+ 5,27,34, 6,45,19, 6,45,20, 0, 0, 0, 0, 0, 0, 5,27,35, 6,45,21,15,30,23,
+ 15,30,24,15,30,25,15,30,26,15,30,28,15,30,29,15,30,30,15,30,31,15,30,32,
+ 0, 0, 0, 6,45,18,15,30,27, 0, 0, 0, 0, 0, 0, 6,54,66, 6,54,70, 5,33,81,
+ 5,33,82, 6,54,65, 6,54,75, 6,54,73, 6,54,71, 5,33,83, 6,54,72, 6,54,68,
+ 6,54,74, 0, 0, 0, 6,54,67,15,36,70,15,36,71, 6,54,69, 0, 0, 0, 0, 0, 0,
+ 5,40,80, 5,40,81, 5,40,78, 4,44,48, 6,64,62, 5,40,82, 5,40,79, 0, 0, 0,
+ 5,40,83,15,43,33,15,43,34,15,43,35,15,43,36,15,43,37,15,43,38,15,43,39,
+ 15,43,40,15,43,42,15,43,43,15,43,44, 6,64,63, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,47,82, 7, 7,12, 5,47,85, 7, 7,15, 5,47,84, 5,47,83,
+ 4,44,49, 5,47,87, 7, 7,11, 7, 7,16, 5,47,86, 0, 0, 0, 0, 0, 0,15,49,40,
+ 15,49,41,15,49,42,15,49,43,15,49,44,15,49,45,15,49,46,15,49,47, 0, 0, 0,
+ 0, 0, 0, 7, 7,13, 0, 0, 0, 0, 0, 0, 5,55,12, 5,55,15, 5,55,11, 5,55,13,
+ 5,55,14, 7,17,65, 7,17,63, 7,17,62,15,55,10,15,55,11,15,55,12,15,55,13,
+ 15,55,14,15,55,15, 7,17,64, 0, 0, 0, 0, 0, 0, 5,55,10, 0, 0, 0, 0, 0, 0,
+ 5,61,48, 5,61,49, 5,61,50, 7,26,59, 4,56, 5, 4,56, 6, 5,61,52, 5,61,51,
+ 15,60,12, 7,26,61, 7,26,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,56,67,
+ 7,33,87, 5,67,70, 5,67,67, 4,60,82, 7,33,89, 5,61,53, 7,33,88, 5,67,68,
+ 5,67,69, 7,33,85,15,64,24,15,64,25,15,64,26, 0, 0, 0, 0, 0, 0, 7,33,86,
+ 0, 0, 0,15,60,11,15,67,39, 7,40,86, 5,73, 2, 5,73, 3, 7,40,88, 7,40,87,
+ 15,67,40,15,67,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,47,25,
+ /* plane 2, page 102 */
+ 0, 249, /* first, last */
+ 15,69,83,15,69,84,15,69,85, 7,47,24, 7,47,23, 5,80,86,15,72,16,15,72,17,
+ 7,52,45, 7,52,46, 5,83,94, 7,56,68, 0, 0, 0, 4,74,77,15,74,76,15,75,63,
+ 15,76,22,15,76,48, 5, 1,90, 6,13,63, 5,11,16, 6,35,48, 0, 0, 0, 0, 0, 0,
+ 6,45,22, 0, 0, 0, 0, 0, 0, 6,40,74, 0, 0, 0, 6,54,78, 6,64,66, 6,64,65,
+ 7, 7,17, 0, 0, 0,15,49,48, 7,17,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,47,26, 5, 3, 5, 5, 3, 3, 6,13,64, 6,13,65, 6, 5,40,15, 2,76,15, 2,77,
+ 0, 0, 0, 0, 0, 0, 5, 3, 4, 5, 3, 2, 5, 4,83, 5, 4,82, 6, 8,89, 6, 8,88,
+ 6, 8,87, 0, 0, 0, 6, 8,86, 6,19,91, 0, 0, 0, 6,19,90, 6,19,89, 5, 7,58,
+ 5, 7,62, 6,13,68, 4,15,35, 6,13,77, 6,13,78, 6,13,66, 5, 7,61, 6,13,70,
+ 5, 7,57, 5, 7,55, 6,13,75, 5, 7,59, 0, 0, 0, 4, 7,75, 0, 0, 0, 0, 0, 0,
+ 6,13,72, 6,13,79,15, 8,48,15, 8,49,15, 8,51,15, 8,52, 6,13,76, 4, 6,68,
+ 6,13,69, 0, 0, 0, 0, 0, 0, 6,13,71, 5, 7,60, 0, 0, 0, 0, 0, 0, 6,13,74,
+ 6,13,67, 6,27, 7, 6,27, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,15,29,
+ 5, 7,54, 6,27, 6, 6,20,13, 4,11,13, 5,11,20, 6,20, 8, 5,11,17, 5,11,24,
+ 6,20, 9, 4,11,14, 6,35,52, 6,20, 7, 4,11,11, 6,20,11, 4,11,16, 6,20, 5,
+ 5,11,22, 6,20, 6, 5,11,23, 5,11,18, 4,15,40, 0, 0, 0, 0, 0, 0, 5,11,21,
+ 6,19,92, 6,20, 1, 6,20, 2, 6,20, 4,15,13,10,15,13,15,15,23,71,15,23,72,
+ 6,19,94, 6,20,15, 0, 0, 0, 0, 0, 0, 6,20,12, 6,20,10, 6,20,16, 0, 0, 0,
+ 0, 0, 0, 6,20,14, 6,35,51, 6,35,50,15,13,11, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,35,53, 6,35,54, 6,27,16, 6,35,49,15,13,13, 5,15,71, 4,15,30, 4,20,37,
+ 4,15,37, 6,27,18, 5,15,76, 4,15,36, 6,27,14, 5,15,78, 6,27,10, 5,15,80,
+ 5,27,36, 5,15,79, 6,27, 9, 5,15,70, 6,27,11, 4,15,32, 6,45,27, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,15,73,15,13, 9,15,18, 8,15,18, 9,15,18,13,15,30,44,
+ 5,15,72, 5,14, 4, 6,27,15, 6,27,13, 0, 0, 0, 6,27,12, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,27,19, 6,45,26, 6,45,24, 6,45,25, 6,45,23, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,20, 3, 5,15,75,
+ 5,15,81, 0, 0, 0, 5,15,74, 5,20,84, 6,35,59, 6,35,57, 5,20,75, 4,20,46,
+ 5,20,76, 4,15,34, 5,20,81, 4,20,38, 4,20,53, 5,33,84, 4,20,52, 6,35,55,
+ 5,20,78, 6,35,63, 0, 0, 0, 4,20,41, 5,20,85, 5,20,86, 6,35,64, 6,35,62,
+ 0, 0, 0, 4,20,47, 5,20,82, 6,35,65, 6,35,66,15,23,73,15,23,75, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,35,60, 6,35,61, 0, 0, 0, 6,54,79, 6,54,80,
+ 0, 0, 0, 6,54,81,
+ /* plane 2, page 103 */
+ 2, 244, /* first, last */
+ 5,20,83, 5,20,79, 5,20,80, 0, 0, 0, 6,45,35, 5,27,40,
+ 6,45,29, 0, 0, 0, 5,27,37, 6,45,43, 6,45,34, 4,26,28, 5,27,42, 6,45,47,
+ 6,45,28, 6,64,69, 5,27,39, 6,45,48, 6,54,85, 4,26,40, 5,27,44, 6,45,53,
+ 6,45,46, 6,45,44, 6,45,51, 5,27,38, 5,40,85, 0, 0, 0, 0, 0, 0, 6,45,30,
+ 6,45,39, 6,45,42,15,30,33,15,30,36,15,30,38,15,30,39,15,30,40,15,30,41,
+ 15,30,42,15,30,43, 6,45,36, 0, 0, 0, 6,45,41, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,27,67, 0, 0, 0, 6,45,45, 6,45,33, 0, 0, 0,
+ 0, 0, 0, 6,45,50, 6,45,31, 6,45,32, 0, 0, 0, 6,64,67, 6,64,71, 6,64,68,
+ 0, 0, 0,15,30,37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,27,41,
+ 6,45,38, 5,20,77, 5,27,43, 5,27,46, 5,27,47, 6,45,49, 5,27,49, 6,45,37,
+ 6,64,72, 6,64,70, 5,33,93, 4,32, 1, 5,34, 6, 5,34, 1, 5,33,85, 5,33,89,
+ 5,34, 7, 6,54,93, 4,31,94, 6,54,82, 4,26,38, 5,34, 2, 5,33,88, 6,54,87,
+ 4,32, 4, 6,54,89, 4,32, 2, 6,55, 1, 6,54,83, 5,34, 9, 6,54,84, 6,54,88,
+ 5,34, 3, 6,54,92, 5,33,91, 5,33,90, 5,34, 5, 5,34, 4, 6,54,90, 5,33,86,
+ 6,54,94, 0, 0, 0,15,36,73,15,36,74,15,36,75,15,36,76,15,36,77,15,36,79,
+ 15,36,81, 4,32,11, 0, 0, 0, 0, 0, 0, 6,55, 3, 6,55, 2, 0, 0, 0,15,36,80,
+ 0, 0, 0, 7, 7,18, 0, 0, 0, 7, 7,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,54,91, 5,33,94, 5,33,92,
+ 0, 0, 0, 4,38,36, 5,40,91, 4,38,44, 4,38,35, 5,41, 3, 6,64,74, 5,40,90,
+ 4,38,42, 5,41, 4, 5,41, 1, 4,38,41, 5,40,87, 5,40,93, 4,38,26, 4,38,43,
+ 5,40,88, 6,64,81, 6,64,76, 5,40,86, 6,64,78, 5,40,89, 0, 0, 0, 6,64,77,
+ 5,40,92, 7,17,67, 5,41, 2, 0, 0, 0, 0, 0, 0, 4,38,40, 6,64,75,15,43,45,
+ 15,43,46,15,43,47,15,43,49,15,43,50,15,43,53,15,43,51, 0, 0, 0, 0, 0, 0,
+ 6,64,80, 6,61,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,33,87, 5,40,94, 0, 0, 0, 0, 0, 0,
+ 4,44,51, 5,47,91, 0, 0, 0, 7, 7,20, 4,44,55, 7, 7,27, 0, 0, 0, 5,47,90,
+ 4,44,57, 7,26,64, 7, 7,23, 5,47,92, 7, 7,21, 4,44,58, 7,26,62, 5,47,88,
+ 0, 0, 0, 7, 7,24,15,49,49,15,49,50,15,49,51,15,49,52, 0, 0, 0, 7, 7,22,
+ 7, 7,25, 0, 0, 0, 0, 0, 0, 7, 7,26, 7,26,63,
+ /* plane 2, page 104 */
+ 0, 255, /* first, last */
+ 6,64,73, 5,47,89,15,60,21, 7,17,76, 5,55,23, 5,55,18, 4,50,72, 4,50,61,
+ 5,55,17, 4,50,63, 7,17,71, 7,17,78, 5,55,21, 5,55,22, 4,50,69, 5,47,93,
+ 5,55,20, 7,17,69, 7,17,77, 5,55,25, 7,17,74, 5,73, 4, 4,50,64, 7,17,79,
+ 0, 0, 0,15,55,17,15,55,19, 0, 0, 0,15,55,18, 0, 0, 0, 7, 7,28, 7,17,72,
+ 7,17,73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,17,68, 7,17,70, 0, 0, 0, 0, 0, 0,
+ 7,17,75, 7,33,90, 0, 0, 0, 7,40,89, 7,33,91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,55,26,
+ 5,55,16, 5,55,27, 5,55,24, 5,55,19, 7,34, 1, 0, 0, 0, 5,61,58, 5,61,57,
+ 7,26,66, 4,56,14, 4,56,10, 4,56, 9, 0, 0, 0, 5,61,56, 5,61,54, 4,64,81,
+ 7,40,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,61,62, 7,26,69,15,60,14,15,60,15,
+ 15,60,17,15,60,18,15,60,19,15,60,20,15,60,22,15,60,16, 0, 0, 0, 7,23,94,
+ 7,26,67, 0, 0, 0, 0, 0, 0, 7,40,90, 7,40,93, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,61,61, 7,26,65, 5,61,60, 5,61,55, 7,26,68, 7,40,94, 0, 0, 0, 0, 0, 0,
+ 4,60,85, 5,67,74, 5,67,71, 0, 0, 0, 5,67,73, 5,67,76, 7,33,92, 5,67,78,
+ 7,33,94, 5,67,75, 7,34, 3, 5,67,72, 5,77,10, 5,67,79,15,64,27,15,64,28,
+ 15,64,29,15,64,32,15,64,33, 7,33,93, 0, 0, 0, 7,34,77, 0, 0, 0, 0, 0, 0,
+ 4,60,83, 0, 0, 0, 4,64,82, 0, 0, 0, 7,41, 3, 7,41, 9, 5,73, 5, 5,73, 6,
+ 5,67,77, 7,41, 4, 0, 0, 0, 0, 0, 0,15,67,42, 7,41, 8, 7,41,10,15,67,44,
+ 15,67,45, 7,41, 2, 7,41, 6, 7,41, 5, 7,41, 7, 7,41, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,67,43, 7,41,11, 7,47,29, 5,77,14,
+ 5,77,13, 4,68,11, 4,68, 9, 5,77,11,15,69,86, 7,47,28, 0, 0, 0, 7,47,27,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,71, 6, 7,52,47, 5,80,87, 7,60,32, 7,53,26, 7,60,31, 0, 0, 0, 4,73,17,
+ 4,73,15, 7,56,69, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,72,19, 7,60,33, 5,86,29,
+ 7,60,35, 7,60,37, 7,60,38, 5,86,28, 7,60,34, 4,74,78, 0, 0, 0, 7,60,39,
+ 7,60,40, 7,63,29, 5,87,93, 7,63,30, 0, 0, 0, 0, 0, 0, 5,89,28, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,68,55, 5,90,79, 5,91,37, 6, 8,92, 4, 4,81,15,10,41,
+ 6,27,20,15,18,15, 0, 0, 0, 0, 0, 0, 6,45,54, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,45,55, 0, 0, 0,15,43,56,15,43,57,15,49,54, 6,64,83, 0, 0, 0,
+ 0, 0, 0,15,60,23, 7,34, 5,15,64,34, 5,80,89,15,72,20,15,73,71, 7,69,29,
+ 5,92,12, 6, 5,42, 6, 8,94, 4, 4,82, 6, 8,93, 6,13,80, 5,11,26, 6,20,18,
+ /* plane 2, page 105 */
+ 0, 255, /* first, last */
+ 15,13,16, 0, 0, 0, 5,15,82, 6,27,22, 4,15,41,15,18,16, 6,27,23, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,27,21, 0, 0, 0, 6,35,70, 6,35,69,15,23,77,15,23,78,
+ 6,45,57, 0, 0, 0, 6,45,58, 0, 0, 0, 6,55, 4, 5,41, 5,15,43,58, 0, 0, 0,
+ 4,44,64, 4,44,65, 5,47,94,15,49,55, 0, 0, 0, 7, 7,29, 4,50,73, 5,55,28,
+ 0, 0, 0, 7,26,70, 5,61,64, 5,61,63,15,60,24,15,64,35, 5,73, 7, 4,64,85,
+ 5,77,17,15,67,46, 7,41,12, 5,77,15, 5,77,16, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,66,49, 6, 9, 1, 6,13,81, 6,13,82, 6,27,26,15,13,17,
+ 0, 0, 0, 6,27,24, 6,27,25, 5,20,87, 4,20,54, 0, 0, 0, 0, 0, 0, 6,45,59,
+ 0, 0, 0, 5,34,10, 5,41, 6, 0, 0, 0,15,43,59, 5,48, 1, 7, 7,30,15,49,56,
+ 5,48, 2, 7,17,81, 4,50,74, 5,55,29,15,55,20, 0, 0, 0, 4,56,15, 5,67,80,
+ 5,67,81, 4, 4,84, 6, 5,43, 6, 3,68, 6,13,83, 6,13,84, 0, 0, 0,15,13,18,
+ 4,15,43, 6,20,19, 0, 0, 0, 6,27,27, 0, 0, 0, 6,27,33, 6,27,29, 6,27,28,
+ 4,15,44, 6,27,31, 6,27,32, 0, 0, 0, 0, 0, 0, 6,35,73, 5,20,88, 6,27,30,
+ 6,35,72, 6,35,75, 0, 0, 0, 6,35,74, 0, 0, 0, 5,27,50, 6,45,60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,27,51, 5,41, 7, 6,55, 8, 6,55, 7, 6,55, 5, 6,64,84,
+ 6,64,90, 6,64,85, 6,64,86, 5,48, 3, 7, 7,31, 6,64,87, 6,64,91, 6,64,88,
+ 7, 7,32, 7, 7,33, 7, 7,34, 6,64,89, 5,41, 8, 5,48, 4, 5,48, 5, 7, 7,35,
+ 7, 7,36, 7,17,82, 7, 7,37, 0, 0, 0, 7, 7,38, 0, 0, 0,15,55,21, 7,17,84,
+ 7,17,83, 5,61,66, 0, 0, 0, 7,17,87, 0, 0, 0, 7,17,86, 7,17,85, 5,61,65,
+ 5,61,68, 7,26,71, 7,34, 8, 7,34, 7, 5,61,69, 4,60,87, 7,34, 6,15,64,36,
+ 15,64,37, 7,41,13, 5,67,83, 5,67,82, 7,41,14, 7,47,31, 0, 0, 0, 5,73, 8,
+ 0, 0, 0, 5,77,19, 5,77,20, 5,77,21, 7,47,30, 7,41,15,15,67,47, 5,73, 9,
+ 7,47,32, 7,47,33, 5,80,90,15,69,88,15,72,21,15,72,23, 7,56,70, 0, 0, 0,
+ 15,72,22, 7,56,71, 7,60,41, 5,87,94, 7,65,23, 5,89,29, 5,89,31, 5,89,30,
+ 15,76,74, 7,69,30, 7,69,31, 0, 0, 0, 7,70,51, 5,92,48,15, 5,11, 6,20,20,
+ 4,15,46, 4,15,45, 6,27,34, 0, 0, 0, 6,27,35, 0, 0, 0, 6,27,36, 5,15,83,
+ 5,15,84, 6,35,76, 0, 0, 0, 6,35,77, 6,33,93, 6,45,64, 6,45,63, 6,45,65,
+ 0, 0, 0, 0, 0, 0,15,30,48, 0, 0, 0, 0, 0, 0, 5,41, 9, 0, 0, 0, 4,38,45,
+ 5,37,51, 4,38,46, 6,55, 9,15,43,60, 6,64,92, 6,64,94, 6,64,93, 7, 7,39,
+ 15,49,57, 0, 0, 0, 7, 7,41, 7, 7,40, 0, 0, 0, 7,17,88, 5,55,30, 0, 0, 0,
+ 7,17,89, 7,26,72, 0, 0, 0,15,64,38, 5,67,84, 7,34,10, 7,34, 9, 0, 0, 0,
+ 5,77,22, 5,80,91, 0, 0, 0, 7,60,42, 5,86,30, 0, 0, 0, 5,48, 6, 5,48, 7,
+ /* plane 2, page 106 */
+ 0, 255, /* first, last */
+ 15,64,39, 7,47,34, 0, 0, 0, 7,60,43, 7,63,31, 7,65,25, 5,90,80, 5, 4,84,
+ 4, 7,81, 4, 7,80, 6,13,87, 6,13,86, 6,13,85, 5, 7,63, 4,11,17, 4,11,21,
+ 4,11,20, 0, 0, 0, 6,20,21, 6,20,23, 6,20,22, 6,27,42, 5,15,85, 6,27,41,
+ 6,27,37, 5,15,86, 4,15,50, 0, 0, 0, 4,15,49, 6,27,38, 0, 0, 0, 6,27,39,
+ 6,27,40, 5,20,90, 4,20,57, 4,20,59, 6,35,82, 0, 0, 0, 5,20,91, 6,35,78,
+ 6,35,79, 0, 0, 0,15,23,81, 0, 0, 0, 5,20,89,15,23,80,15,23,82, 5,27,52,
+ 6,45,69, 6,45,68, 4,20,58, 0, 0, 0, 4,26,50, 4,26,48, 4,26,49, 4,26,51,
+ 0, 0, 0, 0, 0, 0, 6,45,70, 0, 0, 0, 5,34,11, 6,55,12, 5,34,12, 6,55,10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,36,82, 6,55,11, 0, 0, 0, 0, 0, 0, 6,55,13,
+ 6,55,14, 5,34,14, 6,65, 7, 5,41,13, 5,41,11, 4,38,50, 6,65, 2, 6,65, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,43,62,15,43,63, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,43,61, 6,65, 3, 0, 0, 0, 0, 0, 0, 5,41,10, 5,48,15, 4,44,71, 4,44,70,
+ 5,48,14, 5,48,11, 5,48,12, 5,48,16, 5,48, 8, 7, 7,47, 7, 7,45, 5,48,17,
+ 7, 7,42, 7, 7,44, 7, 7,46, 7, 7,43, 5,48,13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,48, 9, 5,48,10, 0, 0, 0, 5,55,34, 5,55,31, 5,55,35, 7,17,92,
+ 5,55,32, 7,18, 1, 7,17,93, 7,18, 3, 5,55,33, 7,18, 2,15,55,22, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,17,94, 7,17,91, 7,26,74, 4,56,17,
+ 5,61,76, 5,61,70, 5,61,73, 5,61,72, 0, 0, 0, 5,61,74, 5,61,75, 0, 0, 0,
+ 0, 0, 0, 4,60,89, 5,67,91, 7,34,12, 5,67,85, 5,67,90, 5,67,93, 5,67,89,
+ 4,60,90, 4,60,91, 5,67,86, 5,67,87, 5,67,92, 4,60,88, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,34,13, 7,34,11, 0, 0, 0, 5,67,88,
+ 0, 0, 0, 7,41,16, 5,73,13, 5,73,12, 5,73,11, 5,73,10, 7,41,17,15,67,48,
+ 7,41,18, 5,77,23, 7,47,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,80,93, 5,80,92,
+ 7,52,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,84, 1, 5,84, 2, 4,73,18,
+ 7,56,72, 7,52,48, 7,52,49, 4,74,79, 7,60,44, 7,65,27, 7,65,26, 7,66,50,
+ 5,90,81, 0, 0, 0, 4,78,47, 6,20,24,15,23,83, 0, 0, 0, 5,27,31,15,30,49,
+ 15,49,58,15,60,25, 7,47,36, 0, 0, 0, 5,20,92, 5,20,93, 0, 0, 0, 6,35,83,
+ 0, 0, 0, 5,20,94,15,30,50, 6,55,15, 6,55,16, 6,55,17, 6,65, 9, 0, 0, 0,
+ 15,43,64, 0, 0, 0, 6,65,10, 6,65, 8, 7, 7,49, 7, 7,48, 7, 7,50,15,49,59,
+ 15,49,60,15,49,61, 5,55,36, 5,55,37, 7,18, 5, 7,18, 4, 0, 0, 0, 5,77,25,
+ 5,77,24, 7,47,37,15,76,23, 5, 1,91, 6, 3,24, 0, 0, 0, 4, 3,14, 6, 5,48,
+ 6, 5,49, 6,13,88, 6, 5,46, 5, 3, 6, 6, 5,45,15, 2,79,15, 2,80,15, 2,78,
+ /* plane 2, page 107 */
+ 0, 255, /* first, last */
+ 6, 5,44, 4, 4,87, 4, 4,88, 4, 4,92, 6, 9, 2, 4, 4,90, 6, 9, 5, 6, 9, 3,
+ 6, 9, 4, 6, 9, 6, 0, 0, 0,15, 5,12,15, 5,13,15, 5,14,15, 5,15,15, 5,16,
+ 15, 5,17, 0, 0, 0, 0, 0, 0, 6,13,91, 4, 7,92, 4, 7,87, 4, 7,89, 5, 7,66,
+ 4, 7,93, 4, 7,88, 4, 7,85, 5, 7,64, 6,13,92, 5, 7,65, 4, 7,84, 6,27,43,
+ 6, 7,44, 6,14, 1, 5, 7,68, 4, 7,86, 6,13,90, 6,13,94, 6,27,45, 6,27,44,
+ 0, 0, 0,15, 8,55,15, 8,56,15, 8,57,15, 8,58,15, 8,59,15, 8,61,15, 8,62,
+ 15, 8,63,15, 8,64,15, 8,65,15, 8,66,15, 8,68, 6,13,89, 0, 0, 0, 4,11,27,
+ 4,11,23, 4,11,24, 4,11,25, 5,11,31, 6,20,35, 6,20,27, 4,11,28, 6,20,33,
+ 6,20,29, 5,11,29, 6,20,25, 6,20,32, 6,20,30, 6,20,34, 6,20,37, 6,20,38,
+ 5,11,27, 5,11,30, 0, 0, 0, 5,11,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,13,19,15,13,21,15,13,23,15,13,24,
+ 15,13,25,15,13,26,15,13,27,15,13,28,15,13,22, 6,19,30, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,20,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,13,20, 6,13,93, 0, 0, 0, 6,45,72,15,10,50, 5,15,92, 4,15,54, 4,15,55,
+ 4,15,66, 5,15,88, 5,15,90, 5,15,94, 4,15,52, 5,15,87, 5,16, 3, 4,15,59,
+ 5,16, 7, 4,15,56, 4,15,69, 5,16, 4, 4,15,64, 6,27,62, 6,27,63, 5,16, 5,
+ 6,27,65, 5,16, 2, 4,15,70, 6,27,57, 6,27,56, 6,45,71, 6,36, 2, 6,27,53,
+ 5,15,93, 6,27,52, 6,27,49, 6,27,47, 6,27,58, 6,27,60, 5,15,91, 6,27,55,
+ 5,16, 6, 5,15,89, 6,27,51, 6,27,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,27,61, 6,27,66,15,18,19,15,18,21,15,18,22,15,18,23,15,18,24,15,18,25,
+ 15,18,27,15,18,28,15,18,29,15,18,31,15,18,32,15,18,34,15,18,35,15,18,36,
+ 15,18,37,15,18,39,15,18,40,15,18,41,15,18,42,15,18,43, 6,27,48,15,18,38,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,18,44, 0, 0, 0,15,18,30, 0, 0, 0, 5,21,11,
+ 5,21,14, 5,21, 7, 4,20,80, 5,21,12, 4,20,65, 4,20,78, 4,20,72, 6,36,18,
+ 4,20,82, 4,20,85, 6,36, 6, 6,35,91, 6,36, 3, 5,21, 3, 6,35,89, 6,35,85,
+ 4,20,64, 5,21,18, 6,35,84, 6,36, 1, 6,36,24, 4,20,68, 6,36,22, 6,46,26,
+ 0, 0, 0, 6,36,20, 6,27,64, 6,45,88, 4,20,63, 5,21, 1, 4,20,75, 0, 0, 0,
+ 6,35,87, 6,36, 4, 5,21,16, 6,36,15, 6,36,21, 6,36,14, 6,36, 9, 5,21,15,
+ 6,36,19, 6,35,88, 6,36, 7, 5,21,17, 5,34,15, 6,55,18, 6,55,19, 0, 0, 0,
+ 6,36,16, 6,36,17, 6,35,94, 5,21, 2, 5,21,19, 6,36,10, 5,21, 9, 5,21,13,
+ 5,21, 6, 6,46,23, 6,36,25, 6,36,26, 6,35,92, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,35,90,15,23,84,15,23,85,15,23,86,15,23,87,15,23,89,15,23,91,15,23,92,
+ /* plane 2, page 108 */
+ 0, 255, /* first, last */
+ 15,23,93,15,23,94,15,24, 1,15,24, 2,15,24, 4,15,24, 5,15,24, 6,15,24, 7,
+ 15,24, 8,15,24, 9,15,24,10,15,24,11,15,24,12,15,24,13,15,24,14,15,24,15,
+ 15,24,16,15,24,17,15,24,18,15,24,19,15,24,20,15,24,21, 5,27,61, 6,35,93,
+ 5,21, 8, 6,36, 5, 0, 0, 0,15,23,90, 0, 0, 0, 6,36,13, 6,36,23, 0, 0, 0,
+ 0, 0, 0,15,24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,21, 5,
+ 0, 0, 0, 0, 0, 0, 5,27,53, 4,26,53, 5,27,73, 5,27,74, 5,27,66, 5,27,76,
+ 5,27,77, 5,27,67, 4,26,61, 6,45,90, 6,45,82, 6,46,11, 6,45,80, 6,45,75,
+ 5,27,63, 5,27,71, 5,27,72, 6,45,91, 6,45,89, 5,27,62, 5,27,78, 5,27,75,
+ 4,20,74, 4,26,55, 4,26,58, 4,26,56, 4,26,66, 5,27,58, 0, 0, 0, 4,26,52,
+ 6,45,73, 6,46,21, 4,26,67, 6,45,74, 5,27,68, 6,45,92, 6,46,22, 6,45,93,
+ 6,46,15, 6,46,16, 4,26,75, 6,46, 6, 4,26,73, 6,46, 3, 5,27,60, 6,46, 8,
+ 6,45,85, 6,46,13, 6,45,84, 6,46, 2, 6,46,17, 0, 0, 0, 6,46, 9, 5,27,69,
+ 6,65,18, 6,65,13, 6,65,14, 5,27,55, 6,46, 4, 6,45,79, 6,46,14, 5,41,14,
+ 6,45,83, 6,46,12, 6,45,87, 6,46, 5, 6,45,77, 6,46,10, 4,26,74, 5,27,64,
+ 5,27,59, 0, 0, 0, 6,45,86, 6,46,24, 6,65,11, 5,27,70, 6,65,15, 5,27,65,
+ 6,46,20, 6,65,17, 6,65,16, 6,45,76, 6,45,94, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,44,91, 5,27,56, 6,45,78, 6,45,81, 6,46,19,
+ 6,46,25,15,30,51,15,30,53,15,30,54,15,30,56,15,30,58,15,30,59,15,30,60,
+ 15,30,61,15,30,62,15,30,63,15,30,64,15,30,65,15,30,67,15,30,68,15,30,69,
+ 15,30,72,15,30,73,15,30,74,15,30,77,15,30,79,15,30,80,15,30,81,15,30,82,
+ 15,30,84,15,30,85,15,30,86,15,30,87,15,30,88,15,30,89,15,30,90,15,30,91,
+ 15,30,92,15,30,93,15,30,94, 0, 0, 0, 6,65,12, 0, 0, 0, 0, 0, 0, 5,27,57,
+ 6,46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,30,66,15,30,52,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,30,78, 0, 0, 0, 0, 0, 0,
+ 15,30,83, 4,32,35, 6,55,20, 6,55,38, 5,34,46, 6,55,26, 6,55,27, 5,34,20,
+ 4,32,29, 6,55,41, 6,55,58, 4,32,32, 4,32,34, 5,34,37, 6,55,62, 5,34,26,
+ 4,32,23, 4,32,20, 6,55,33, 6,55,67, 5,34,19, 6,55,49, 6,55,53, 5,34,35,
+ 6,55,42, 4,32,24, 4,32,27, 5,34,22, 6,55,35, 4,32,28, 4,32,37, 5,34,33,
+ 4,32,45, 5,34,47, 4,32,30, 5,34,38, 6,55,61, 5,34,31, 4,32,19, 4,32,17,
+ 6,55,69, 4,32,31, 6,55,34, 5,34,40, 5,34,34, 5,34,24, 5,34,30, 0, 0, 0,
+ 6,55,24, 6,55,51, 6,55,47, 6,55,32, 6,55,71, 5,34,29, 6,55,25, 6,55,68,
+ 6,55,23, 5,34,48, 6,55,46, 6,55,37, 6,55,28, 5,34,41, 5,34,45, 5,34,27,
+ /* plane 2, page 109 */
+ 0, 255, /* first, last */
+ 5,34,39, 6,55,50, 6,55,64, 0, 0, 0, 0, 0, 0, 6,55,60, 0, 0, 0, 6,55,40,
+ 6,55,54, 5,34,25, 4,32,25, 6,55,55, 5,34,16, 5,34,32, 5,34,18, 5,34,42,
+ 6,55,31, 4,32,21, 4,32,43, 6,55,44, 5,34,21, 5,34,17, 6,55,39, 6,55,56,
+ 7, 7,51, 6,55,65, 5,34,28, 6,55,36, 6,55,52, 6,55,22, 6,55,66, 6,55,70,
+ 6,55,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,32,46, 5,34,36, 5,34,43, 6,55,21, 6,55,30,
+ 6,55,43, 6,55,45, 6,55,59, 6,55,63,15,36,83,15,36,85,15,36,86,15,36,87,
+ 15,36,88,15,36,89,15,36,90,15,36,91,15,36,92,15,36,93,15,36,94,15,37, 1,
+ 15,37, 2,15,37, 3,15,37, 4,15,37, 5,15,37, 6,15,37, 7,15,37, 8,15,37, 9,
+ 15,37,10,15,37,11,15,37,12,15,37,14,15,37,15,15,37,16,15,37,17, 0, 0, 0,
+ 5,34,44, 4,32,42, 6,55,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,46,18,15,30,55, 5,34,23,
+ 0, 0, 0, 4,38,70, 6,65,64, 5,41,37, 6,65,19, 6,65,35, 5,41,43, 4,38,67,
+ 6,65,54, 4,38,54, 6,65,37, 4,38,57, 6,65,28, 5,41,33, 6,65,42, 4,38,53,
+ 6,65,50, 5,41,29, 6,65,32, 6,65,57, 5,41,41, 5,41,38, 6,65,44, 5,41,26,
+ 4,38,58, 6,65,25, 6,65,53, 6,65,45, 6,65,31, 5,41,36, 5,41,25, 5,41,16,
+ 4,38,66, 6,65,33, 4,38,62, 0, 0, 0, 6,65,22, 4,38,61, 4,38,75, 4,38,59,
+ 5,41,31, 7, 7,56, 6,65,23, 5,41,18, 5,41,23, 5,41,17, 5,41,40, 5,48,27,
+ 4,38,63, 5,41,35, 6,65,24, 4,38,72, 6,65,48, 5,41,24, 6,65,55, 6,65,38,
+ 6,65,27, 5,41,32, 5,41,22, 7,18, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,41,15, 5,41,20, 6,65,39, 6,65,41, 6,65,43, 6,65,46, 6,65,58, 6,65,61,
+ 6,65,62,15,43,65,15,43,66,15,43,67,15,43,70,15,43,72,15,43,73,15,43,74,
+ 15,43,75,15,43,76,15,43,77,15,43,78,15,43,79,15,43,80,15,43,81,15,43,82,
+ 15,43,83,15,43,84,15,43,85,15,43,86,15,43,88,15,43,89,15,43,90,15,43,92,
+ 15,43,93,15,43,94,15,44, 1,15,44, 2,15,44, 3,15,44, 5,15,44, 6,15,44, 7,
+ 15,44, 8,15,44, 9,15,44,10, 6,65,40, 5,41,34, 6,65,51, 0, 0, 0, 6,65,49,
+ 6,55,72, 5,41,42, 6,65,60, 6,65,63, 0, 0, 0, 6,65,59, 6,65,26, 6,65,21,
+ 6,65,34, 6,65,29, 0, 0, 0, 6,55,48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,43,68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,43,71, 6,65,52, 4,38,74, 4,38,52, 5,41,21, 5,41,45, 7,18, 6, 5,41,19,
+ 6,65,65, 5,41,39, 5,41,44, 5,55,38,15,43,91, 5,41,30, 0, 0, 0, 7, 7,76,
+ /* plane 2, page 110 */
+ 0, 255, /* first, last */
+ 4,44,94, 5,48,18, 4,44,73, 4,44,92, 7, 8, 1, 0, 0, 0, 5,48,21, 7, 8, 4,
+ 7, 7,87, 7, 7,60, 5,48,25, 7, 7,73, 7, 7,88, 7, 7,89, 7, 7,74, 7, 7,83,
+ 5,48,26, 7, 7,79, 4,44,85, 5,48,29, 5,48,34, 7, 7,64, 7, 8, 2, 5,48,32,
+ 5,48,31, 5,55,39, 5,48,33, 5,48,43, 7, 7,75, 7, 7,86, 7, 7,57, 7, 7,82,
+ 7, 7,69, 5,48,40, 5,48,23, 4,44,91, 7, 7,52, 0, 0, 0, 7, 7,59, 7, 7,68,
+ 7, 7,67, 7, 7,71, 5,48,19, 7, 7,70, 7, 7,93, 7, 7,62, 5,48,30, 7, 7,54,
+ 5,48,20, 5,48,42, 7, 7,92, 7, 7,66, 7, 7,61, 7, 7,78, 4,44,86, 5,48,41,
+ 5,48,37, 7, 7,84, 5,55,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,45, 2, 5,48,35,
+ 7, 7,53, 7, 7,58, 7, 7,63, 7, 7,80, 7, 7,81, 7, 8, 3,15,49,62,15,49,63,
+ 15,49,64,15,49,66,15,49,67,15,49,70,15,49,71,15,49,72,15,49,73,15,49,74,
+ 15,49,76,15,49,77,15,49,78,15,49,79,15,49,80,15,49,82,15,49,85,15,49,87,
+ 0, 0, 0, 4,45, 3, 7, 7,90, 5,48,36, 7, 7,94, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 7,85, 0, 0, 0, 7, 7,72, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,49,81, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,49,65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,49,75,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,48,22, 7, 7,55, 5,48,39,
+ 5,48,28, 6,65,20, 7,34,14, 0, 0, 0,15,44, 4, 0, 0, 0, 7,18,49, 4,51,13,
+ 7,18,18, 4,51,10, 4,51,20, 7,18,51, 5,55,41, 4,51,11, 5,55,61, 7,18,35,
+ 5,55,52, 4,50,81, 4,51,16, 5,55,49, 5,55,59, 7,18,28, 4,50,85, 5,55,58,
+ 5,55,43, 5,55,63, 7,18,19, 5,55,65, 4,51,15, 7,18, 8, 5,55,45, 5,55,47,
+ 7,18,44, 5,55,53, 5,55,66, 7,18,29, 7,18,27, 5,48,44, 4,50,80, 5,55,40,
+ 5,55,62, 7,18,37, 7,18,43, 7,18,33, 5,55,68, 5,55,64, 7, 8, 5, 7, 7,91,
+ 7,18,50, 5,61,90, 4,51, 6, 7,18,14, 4,51, 9, 7,18,22, 5,55,51, 4,51, 8,
+ 4,50,84, 5,48,24, 7,18,15, 5,55,50, 7,18,24, 5,55,54, 5,55,44, 7,18,13,
+ 7,18,55, 7,18,46, 4,51,14, 5,55,60, 7,18,10, 4,50,88, 7,18,25, 7,34,15,
+ 7,18,11, 7,18,53, 4,51,18, 7,18,34, 7,18,21, 7,18,31, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,55,30,15,55,31,15,55,32,15,55,33, 5,55,42, 5,55,48, 5,55,55, 7,18,12,
+ 7,18,20, 7,18,23, 7,18,30, 7,18,32, 7,18,39, 7,18,41, 7,18,45, 7,18,47,
+ 7,18,52, 7,18,57, 7,18,58,15,55,23,15,55,24,15,55,25,15,55,26,15,55,27,
+ 15,55,28,15,55,29,15,55,34,15,55,35,15,55,36,15,55,41,15,55,44,15,55,45,
+ 15,55,46,15,55,47,15,55,48,15,55,49,15,55,50,15,55,51,15,55,52,15,55,54,
+ /* plane 2, page 111 */
+ 0, 255, /* first, last */
+ 15,55,55,15,55,56,15,55,57,15,55,58,15,55,59,15,55,60, 7,18,17,15,55,37,
+ 0, 0, 0, 0, 0, 0, 4,50,93, 7,18,26, 7,18,56, 7,18,48, 5,55,69, 5,55,46,
+ 7,18,16, 7,18, 9, 7,18,40, 0, 0, 0, 0, 0, 0,15,55,42, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,18,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,55,67, 5,55,57, 0, 0, 0, 7,18,38, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,26,86, 4,56,26, 4,56,31, 7,26,78, 7,34,27, 7,26,88, 4,56,40,
+ 4,56,41, 5,55,70, 5,61,85, 5,61,93, 5,61,83, 7,27,11, 7,27,15, 5,61,79,
+ 4,56,42, 4,56,23, 7,26,91, 4,56,37, 5,62, 1, 7,26,92, 7,27, 3, 7,27,19,
+ 5,61,94, 5,62, 5, 7,27,17, 5,62, 2, 5,61,78, 5,61,88, 7,26,94, 5,61,92,
+ 7,26,83, 7,27, 4, 7,27,10, 5,61,91, 4,56,43, 0, 0, 0, 5,61,77, 5,62, 3,
+ 4,56,33, 7,27,16, 5,61,87, 4,56,38, 5,61,81, 5,62, 4, 7,27, 5, 5,61,86,
+ 7,26,80, 7,26,85, 7,34,25, 7,26,75, 7,26,76, 7,27,21, 7,26,93, 4,56,39,
+ 7,27,14, 7,26,82, 7,26,87, 7,41,20, 7,26,81, 7,27, 2, 7,27, 9, 7,18,42,
+ 7,26,89, 7,27, 1, 7,27,23, 5,61,84, 5,48,45, 0, 0, 0, 4,56,35, 0, 0, 0,
+ 0, 0, 0, 7,41,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,61,80, 5,61,82, 7,26,77,
+ 7,27, 7, 7,27, 8, 7,27,12, 7,27,20,15,60,26,15,60,27,15,60,28,15,60,29,
+ 15,60,30,15,60,32,15,60,33,15,60,34,15,60,35,15,60,36,15,60,37,15,60,38,
+ 15,60,39,15,60,41,15,60,42,15,60,43,15,60,44,15,60,47,15,60,48, 4,56,25,
+ 7,26,90, 0, 0, 0, 7,27,13, 0, 0, 0, 7,27,22, 0, 0, 0, 0, 0, 0, 7,26,84,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,60,40, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,60,31,
+ 0, 0, 0,15,60,46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,55,53,
+ 0, 0, 0, 0, 0, 0,15,67,59, 0, 0, 0, 5,68,12, 7,34,43, 4,61, 4, 7,34,44,
+ 5,68, 2, 4,61, 5, 5,62, 6, 5,68,15, 7,34,40, 5,68, 5, 5,67,94, 7,34,16,
+ 5,68, 1, 5,68, 9, 5,68,22, 5,68,25, 7,34,22, 5,68,19, 7,34,38, 4,61, 2,
+ 5,62, 7, 5,68,24, 5,68, 6, 5,68,16, 7,34,29, 5,68, 4, 5,68,14, 0, 0, 0,
+ 7,34,45, 4,61,16, 5,68,17, 4,61,14, 4,61, 6, 4,61,10, 5,68,20, 5,68,18,
+ 7,34,30, 7,47,38, 7,34,26, 7,34,23, 4,61,15, 7,41,36, 5,68,11, 7,34,19,
+ 7,34,37, 7,34,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,61,13, 7,27, 6, 7,34,18, 7,34,20, 7,34,21, 7,34,31, 7,34,34, 7,34,36,
+ 7,34,42, 7,34,46, 7,34,47,15,64,40,15,64,41,15,64,42,15,64,43,15,64,44,
+ 15,64,47,15,64,48,15,64,49,15,64,50,15,64,51,15,64,52, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,64,53,15,64,54,15,64,55,15,64,56,15,64,57,15,64,58,15,64,59,
+ /* plane 2, page 112 */
+ 0, 255, /* first, last */
+ 15,64,60,15,64,62,15,64,63, 0, 0, 0, 4,61, 7, 7,34,32, 5,68, 7, 7,34,33,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,41,19, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,68,21, 5,68,10, 4,61, 9, 7,34,39,
+ 5,68, 3, 5,68, 8, 5,68,23, 7,34,35, 0, 0, 0, 7,34,17, 0, 0, 0, 0, 0, 0,
+ 5,73,30, 5,73,15, 7,47,61, 5,73,16, 5,73,26, 5,73,22, 4,64,93, 4,64,89,
+ 5,73,31, 5,73,23, 7,41,24, 7,41,37, 5,73,27, 5,73,21, 4,64,92, 5,73,14,
+ 5,77,34, 7,41,35, 5,73,24, 7,41,38, 5,73,25, 7,41,33, 0, 0, 0, 7,41,52,
+ 7,41,49, 7,41,28, 5,73,19, 5,73,29, 7,41,43, 7,41,46, 7,41,30, 7,41,29,
+ 7,41,34, 7,41,39, 7,47,52, 7,41,45, 7,41,25, 7,41,44, 7,41,42, 7,47,39,
+ 5,73,20, 5,73,18, 4,64,86, 5,73,28, 7,41,41, 7,41,32, 0, 0, 0, 7,41,31,
+ 0, 0, 0, 7,41,22, 0, 0, 0, 0, 0, 0, 7,41,23, 7,41,26, 7,41,40, 7,41,48,
+ 7,41,50,15,67,49,15,67,50,15,67,52,15,67,53,15,67,54,15,67,55,15,67,56,
+ 15,67,57,15,67,58,15,67,60,15,67,61,15,67,62,15,67,63,15,67,64,15,67,65,
+ 15,67,66,15,67,67,15,67,68,15,67,69,15,67,70,15,67,71,15,67,72,15,67,73,
+ 7,41,47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,47,62, 7,47,53, 7,47,46, 5,77,32, 5,77,39,
+ 7,47,65, 5,77,33, 5,77,36, 4,68,25, 7,47,56, 5,77,38, 4,68,21, 0, 0, 0,
+ 5,77,31, 5,80,94, 7,47,63, 5,77,27, 7,47,49, 7,47,48, 7,47,44, 5,77,30,
+ 5,77,37, 7,47,45, 4,68,17, 7,47,71, 5,77,28, 7,47,43, 7,47,51, 7,47,66,
+ 7,47,59, 7,41,27, 7,47,69, 5,77,35, 4,68,14, 7,47,57, 5,77,29, 7,47,70,
+ 0, 0, 0, 7,47,58, 0, 0, 0, 5,73,17, 7,52,71, 7,56,73, 0, 0, 0, 7,47,41,
+ 5,77,26, 5,77,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,47,50, 7,47,54, 7,47,55, 7,47,60, 7,47,67, 7,47,68,15,69,89,15,69,90,
+ 15,69,91,15,69,92,15,69,93,15,69,94,15,70, 1,15,70, 2,15,70, 3,15,70, 4,
+ 15,70, 5,15,70, 6,15,70, 7,15,70, 8,15,70, 9,15,70,10,15,70,11,15,70,12,
+ 7,47,42, 7,47,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,47,64, 7,52,67,
+ 4,73,21, 5,81, 8, 7,52,70, 7,52,63, 5,81, 4, 4,71,12, 4,71,10, 7,52,57,
+ 4,71,14, 5,81, 2, 7,52,68, 5,81, 5, 7,52,69, 4,71, 9, 5,77,41, 5,81, 7,
+ 7,52,59, 7,52,51, 5,81, 6, 7,52,66, 7,52,55, 7,52,53, 7,52,64, 4,71,13,
+ 5,81, 3, 5,81, 9, 5,81,10, 7,52,52, 7,52,60, 0, 0, 0, 7,47,47, 7,52,58,
+ 7,56,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,81, 1, 7,52,54, 7,52,61, 7,52,65,15,72,24,15,72,26,15,72,27,
+ /* plane 2, page 113 */
+ 0, 255, /* first, last */
+ 15,72,28,15,72,29,15,72,30,15,72,31,15,72,33,15,72,34,15,72,35,15,72,36,
+ 0, 0, 0,15,72,32, 0, 0, 0, 7,52,56, 0, 0, 0, 5,84, 4, 4,73,22, 5,84, 5,
+ 5,84, 7, 5,84, 8, 7,56,80, 5,84, 9, 4,73,27, 4,73,26, 7,56,87, 7,56,85,
+ 7,56,77, 7,60,51, 5,84, 3, 5,84, 6, 7,56,79, 4,73,24, 4,73,25, 7,56,78,
+ 4,73,20, 7,56,83, 7,56,75, 7,56,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,56,74, 7,56,76, 7,56,81, 7,56,84,15,73,72,15,73,75,15,73,76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,60,47, 7,60,58,
+ 4,74,85, 5,86,32, 4,74,84, 5,86,31, 4,74,81, 4,74,83, 4,74,82, 4,74,80,
+ 5,86,35, 7,60,49, 7,60,59, 5,86,34, 5,89,32, 7,60,53, 5,86,36, 7,60,55,
+ 7,60,56, 7,60,45, 7,60,48, 5,86,33, 7,60,54, 7,60,52, 7,60,50, 7,60,57,
+ 15,74,77,15,74,78,15,74,79, 7,60,46,15,73,74, 0, 0, 0, 5,88, 3, 5,88, 2,
+ 5,88, 1, 7,63,32, 5,88, 4, 7,63,34, 7,63,38, 7,63,35, 7,63,36, 7,63,41,
+ 7,63,33, 7,63,39, 5,89,34, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,75,64,15,75,65,
+ 15,75,67, 7,63,37, 7,63,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,89,35, 7,66,53,
+ 5,89,33, 7,66,51, 7,65,30, 7,65,29, 7,65,28, 0, 0, 0,15,76,24,15,76,25,
+ 7,65,31, 0, 0, 0, 5,90,21, 5,90,22, 7,66,57, 7,66,55, 7,66,54, 0, 0, 0,
+ 0, 0, 0, 7,66,56, 0, 0, 0, 7,66,52, 0, 0, 0,15,76,49, 7,66,40, 4,77,90,
+ 7,67,72, 5,90,82, 4,77,63, 4,77,92, 0, 0, 0,15,76,75,15,76,77, 5,91,38,
+ 4,78,21, 7,68,56, 7,68,57, 5,92,41, 7,69,32, 5,91,70, 7,69,64, 7,69,86,
+ 5,92,47, 5,92,29, 7,69,63,15, 8,69, 4,11,31, 6,20,41, 6,20,40, 0, 0, 0,
+ 15,18,46, 0, 0, 0, 0, 0, 0, 5,21,22, 5,21,20, 4,20,87, 4,20,86, 6,36,33,
+ 4,20,88, 6,36,34, 6,36,32, 6,36,31, 6,27,67, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,46,28, 5,27,81, 6,46,29,15,31, 2,15,31, 3,15,31, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,34,53, 5,34,49, 5,34,50, 6,55,75, 6,55,74, 6,55,73,
+ 0, 0, 0, 5,41,47, 6,65,66, 6,65,70, 4,38,79, 6,65,69, 6,65,71, 6,65,67,
+ 6,65,68, 5,41,48,15,44,11,15,44,12, 0, 0, 0, 4,38,78, 0, 0, 0, 0, 0, 0,
+ 7, 8, 9, 7, 8, 7, 7,18,63, 5,48,46, 7, 8, 6, 7, 8, 8, 0, 0, 0,15,49,89,
+ 7, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,55,74, 5,55,75, 5,55,72, 5,55,73,
+ 4,51,21, 5,55,71, 7,18,64, 7,18,60, 7,18,61, 4,51,24, 4,51,23, 5,55,77,
+ 7,18,62,15,55,61,15,55,62,15,55,63, 5,55,76, 7,18,59, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,56,44, 7,27,25,15,60,49,15,60,50,15,60,51, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,34,49, 5,68,29, 4,61,19, 7,34,48, 4,61,17,
+ /* plane 2, page 114 */
+ 0, 243, /* first, last */
+ 7,34,50, 5,68,28, 0, 0, 0,15,64,64, 0, 0, 0, 0, 0, 0, 7,41,54, 7,41,53,
+ 4,64,94, 7,41,55, 0, 0, 0, 7,47,73, 0, 0, 0, 5,77,42, 7,47,74, 0, 0, 0,
+ 7,44, 6, 5,81,12, 7,47,72, 5,81,11, 0, 0, 0, 5,80,45, 7,52,74, 7,52,73,
+ 5,84,10, 0, 0, 0, 7,60, 4, 0, 0, 0, 4,78,24, 5, 4,85, 6, 9, 9, 4, 8, 2,
+ 6,14, 5, 0, 0, 0, 0, 0, 0,15, 8,70,15, 8,71,15, 8,73, 0, 0, 0,15, 8,74,
+ 4,11,35, 6,20,43, 4,11,32, 4,11,34, 6,20,42, 5,11,32, 6,20,45, 6,20,44,
+ 6,20,46, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,13,29,15,13,31,15,13,34,15,13,35,
+ 15,13,36,15,13,33, 4,11,33, 5,16,16, 6,27,72, 5,16,12, 5,16,19, 6,27,71,
+ 5,16,13, 5,16,18, 6,27,70, 4,15,76, 4,15,74, 4,15,78, 5,16,14, 6,27,80,
+ 5,16, 9, 6,27,75, 5,16,17, 5,16, 8, 6,27,74, 5,16,15, 5,16,20, 6,27,78,
+ 6,27,68, 5,16,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,27,69,15,18,47, 6,27,76,
+ 6,27,77, 0, 0, 0, 0, 0, 0, 5,16,10, 6,27,79, 0, 0, 0, 5,21,23, 4,20,93,
+ 6,36,37, 5,21,24, 5,21,25, 5,21,26, 5,21,32, 4,21, 2,15,24,29, 4,21, 3,
+ 6,36,44, 5,21,28, 4,21, 1, 5,21,29, 6,36,38, 5,21,33, 6,36,41, 4,21, 4,
+ 4,20,94, 0, 0, 0, 0, 0, 0, 6,36,39, 6,36,42, 6,36,36, 6,36,43, 6,36,45,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,24,22,15,24,23,15,24,24,15,24,25,15,24,27,
+ 15,24,28,15,24,30,15,24,31,15,24,32, 0, 0, 0, 5,21,30, 6,36,46, 4,21, 5,
+ 6,36,35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,21,31, 5,21,27, 5,27,83,
+ 6,46,32,15,31, 8, 4,26,83, 6,46,40, 5,28, 8, 5,27,88, 5,27,85, 5,27,87,
+ 5,27,90, 5,28, 3, 5,27,93, 6,46,41, 6,46,30, 6,46,35, 5,27,86, 5,28, 7,
+ 6,46,34, 6,46,43, 6,46,42, 5,27,92, 6,46,31, 5,27,89, 5,28, 1, 6,46,45,
+ 6,46,36, 6,46,37, 0, 0, 0, 6,55,78, 5,28, 5, 5,27,94, 6,55,88, 5,28, 4,
+ 6,46,44, 6,46,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,28, 2, 5,27,82,
+ 6,46,33,15,31, 5,15,31, 6,15,31, 7,15,31, 9, 0, 0, 0, 0, 0, 0, 4,26,87,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,55,80, 6,55,79, 4,32,58, 4,32,60, 6,55,84, 4,32,52, 5,34,56, 5,34,59,
+ 5,34,54, 4,32,49, 4,32,51, 5,34,60, 5,34,62, 5,34,58, 5,34,55, 4,32,62,
+ 4,32,48, 6,55,82, 0, 0, 0, 6,55,83, 6,55,76, 6,55,77, 6,65,72, 6,55,81,
+ 6,55,85, 5,34,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,37,18,
+ 15,37,19,15,37,20,15,37,21,15,37,22,15,37,23,15,37,24,15,37,25, 6,55,86,
+ 7,41,75, 0, 0, 0, 0, 0, 0, 6,55,87,
+ /* plane 2, page 115 */
+ 1, 255, /* first, last */
+ 6,55,89, 0, 0, 0, 5,41,49, 5,41,54, 5,41,59, 5,41,55, 5,41,60,
+ 4,39, 1, 5,41,53, 4,38,93, 6,66, 3, 5,41,63, 4,38,87, 5,41,57, 4,38,84,
+ 6,65,86, 6,65,74, 6,65,85, 4,39, 2, 5,41,62, 6,65,75, 6,65,81, 5,41,52,
+ 6,65,92, 5,41,61, 5,41,56, 6,65,91, 6,66, 1, 5,41,64, 0, 0, 0, 6,65,84,
+ 6,65,93, 6,65,77, 5,41,65, 5,41,66, 6,65,82, 0, 0, 0, 6,66, 2, 5,41,58,
+ 6,65,76, 6,65,89, 6,65,90, 6,65,80, 5,41,50, 6,65,78, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,41,51, 6,65,83,15,44,13,15,44,14,
+ 15,44,16,15,44,17,15,44,18, 6,65,88, 0, 0, 0, 4,32,56, 0, 0, 0, 6,65,94,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,65,79, 4,45,13, 7, 8,35, 5,48,51, 4,45,14, 4,45,11, 7, 8,24,
+ 4,45,20, 5,48,63, 7, 8,23, 7, 8,12, 5,48,49, 7, 8,11, 7, 8,21, 7, 8,31,
+ 5,48,55, 4,45,18, 4,45,10, 7, 8,32, 7, 8,20, 5,48,54, 7, 8,27, 7, 8,17,
+ 7, 8,30, 5,55,78, 4,45,12, 4,45, 9, 5,48,60, 5,48,58, 5,48,48, 5,48,57,
+ 5,48,56, 7, 8,10, 5,48,59, 4,38,90, 5,48,50, 5,48,62, 5,48,61, 4,45,21,
+ 7, 8,38, 7, 8,16, 7, 8,13, 7, 8,36, 7, 8,25, 7, 8,37, 7, 8,28, 7, 8,15,
+ 6,65,87, 7, 8,22, 7, 8,29, 5,48,52, 4,45, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,48,47,15,49,90,15,49,91,15,49,94,15,50, 1,15,50, 2,15,50, 3,15,50, 5,
+ 15,50, 8,15,50, 9,15,50,10,15,50,11, 7, 8,19, 0, 0, 0, 0, 0, 0, 7, 8,33,
+ 7, 8,26, 0, 0, 0,15,50, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8,18,15,44,15,
+ 0, 0, 0, 5,55,80, 4,51,37, 5,55,86, 5,55,85, 4,51,26, 5,55,84, 0, 0, 0,
+ 5,55,81, 7,18,78, 7,18,93, 5,55,87, 4,51,40, 5,55,91, 4,51,41, 4,51,32,
+ 4,51,34, 5,55,92, 7,18,77, 4,51,27, 7,18,71, 4,51,31, 7,18,92, 5,55,89,
+ 5,55,79, 5,56, 1, 5,55,82, 7,27,26, 5,55,88, 7,18,73, 4,51,38, 5,55,90,
+ 7,18,80, 7,19, 2, 5,55,83, 7,18,68, 5,55,94, 7,18,84, 4,51,39, 5,48,64,
+ 7,18,75, 7,18,69, 5,55,93, 7,18,86, 4,51,35, 7,18,91, 7,19, 4, 7,18,66,
+ 7,18,87, 7,18,67, 7,18,88, 7,18,79, 7,18,94, 7,18,82, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,18,72, 7,19, 3,15,55,64,15,55,65,
+ 15,55,67,15,55,68,15,55,69,15,55,70, 7,18,89, 0, 0, 0, 7,18,74, 0, 0, 0,
+ 7,18,90, 7,18,81, 7,18,70, 0, 0, 0, 7,18,76, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,56,57, 5,62, 9, 5,62,12, 4,56,53, 7,27,50, 7,27,36, 4,56,64, 4,56,60,
+ /* plane 2, page 116 */
+ 0, 255, /* first, last */
+ 7,27,40, 7,27,34, 7,27,53, 0, 0, 0, 4,56,62, 7,27,38, 7, 8,39, 4,56,48,
+ 5,62,17, 7,27,48, 7,27,31, 4,56,61, 7,27,47, 5,62,11, 5,62,15, 7,27,51,
+ 4,56,58, 7,27,39, 7,27,33, 5,62,19, 4,56,51, 7,27,32, 4,56,49, 7,27,30,
+ 7,27,52, 5,62,10, 7,27,28, 7,27,27, 7,27,41, 4,56,59, 5,62,13, 5,62,14,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,27,37,15,60,52,15,60,53,15,60,54,15,60,55,
+ 15,60,56,15,60,57,15,60,58,15,60,60, 0, 0, 0, 7,27,35, 7,27,43, 7,27,46,
+ 0, 0, 0, 7,27,49, 0, 0, 0, 7,27,29, 5,62, 8, 7,27,42, 7,27,44, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,62,16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,61,29, 4,61,23, 7,34,53, 7,34,65,
+ 7,34,56, 7,34,72, 5,68,35, 5,68,36, 5,62,20, 4,61,24, 5,68,48, 7,34,57,
+ 4,61,22, 5,68,37, 4,61,21, 4,61,26, 5,68,31, 5,68,34, 5,68,45, 4,61,20,
+ 5,68,42, 7,34,54, 5,68,30, 0, 0, 0, 5,68,33, 5,68,43, 7,34,55, 7,34,60,
+ 7,34,59, 5,68,32, 7,34,79, 7,34,75, 5,68,47, 7,34,78, 5,68,41, 5,68,44,
+ 7,34,73, 5,68,38, 7,34,76, 5,68,39, 7,34,69, 7,34,66, 7,34,61, 7,34,67,
+ 7,34,52, 7,34,58, 7,34,51, 7,34,62, 7,34,74, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,34,70,15,64,66,15,64,68,15,64,69,15,64,70,15,64,72,15,64,73,15,64,74,
+ 0, 0, 0, 7,34,68, 4,61,28, 7,34,71,15,64,71, 0, 0, 0,15,64,65, 0, 0, 0,
+ 5,68,46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,65, 8, 7,41,74,
+ 7,41,57, 7,41,64, 7,41,76, 7,41,58, 7,41,73, 7,41,77, 4,65, 3, 5,73,34,
+ 5,73,32, 0, 0, 0, 7,41,66, 7,41,71, 7,41,69, 5,73,36, 7,41,61, 7,41,72,
+ 0, 0, 0, 7,41,68, 7,41,70, 7,47,75, 7,41,65, 7,41,78, 7,41,79, 7,41,67,
+ 5,73,37, 7,41,60, 7,41,63, 7,41,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,67,75,15,67,76,15,67,77,15,67,79,15,67,80,15,67,81,
+ 15,67,82,15,67,83,15,67,84,15,67,85, 7,41,59, 4,65, 2, 4,65, 7, 7,41,62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,34,80, 7,47,85, 7,47,90, 5,77,45, 7,47,76, 0, 0, 0, 4,68,34, 5,77,44,
+ 5,77,49, 7,47,88, 7,47,80, 5,77,48, 7,47,84, 5,77,50, 5,77,51, 7,47,83,
+ 5,77,46, 7,47,82, 7,47,87, 7,47,81, 7,47,77, 5,77,47, 7,47,79, 7,52,87,
+ 0, 0, 0, 7,47,78, 7,47,91,15,70,13,15,70,14,15,70,15,15,70,16,15,70,17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,47,86, 4,71,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4,71,20, 7,52,75, 7,52,80, 5,81,15, 7,52,85, 7,52,78, 7,52,81,
+ 5,81,14, 7,52,83, 5,81,13, 5,81,16, 7,52,76, 4,71,19, 7,52,79, 4,71,21,
+ /* plane 2, page 117 */
+ 0, 255, /* first, last */
+ 4,71,17, 7,52,82, 5,81,18, 7,52,88, 7,47,89, 0, 0, 0, 7,52,84, 4,71,18,
+ 7,52,89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,81,17, 5,81,19,
+ 7,52,86,15,72,37,15,72,38,15,72,39,15,72,40,15,72,41, 0, 0, 0, 0, 0, 0,
+ 7,52,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,84,14, 4,73,28, 5,84,12,
+ 5,84,11, 7,57, 3, 7,56,92, 5,84,13, 5,84,17, 5,84,16, 7,56,90, 5,84,19,
+ 5,84,21, 0, 0, 0, 5,84,18, 7,56,89, 4,73,29, 0, 0, 0, 7,57, 6, 7,57, 8,
+ 7,57, 7, 7,56,94, 7,57, 1, 5,84,20, 5,84,22, 7,57, 4, 7,57, 9, 5,84,15,
+ 0, 0, 0, 0, 0, 0, 7,56,93, 0, 0, 0, 0, 0, 0, 7,56,91, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,73,77,15,73,78, 5,86,38, 4,74,86, 4,74,87, 7,60,61, 5,86,39,
+ 4,74,89, 7,60,63, 7,60,60, 5,86,40, 7,60,66, 5,86,37, 7,63,42, 7,60,64,
+ 4,74,90, 7,60,65, 5,86,42, 0, 0, 0, 7,57, 2, 5,86,41,15,74,80,15,74,81,
+ 15,74,82, 0, 0, 0, 0, 0, 0, 5,88,12, 7,63,43, 4,75,94, 5,88,11, 5,88, 9,
+ 7,63,44, 5,88, 6, 4,76, 2, 7,63,45, 5,88,10, 5,88, 8, 4,76, 4, 5,88,13,
+ 5,88, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,89,36, 4,76,94,
+ 5,89,40, 5,89,42, 4,76, 1, 7,65,32, 5,89,38, 7,65,36, 7,65,35, 7,65,37,
+ 5,89,39, 5,89,41, 7,65,33, 0, 0, 0, 5,89,37, 7,66,61, 7,66,59, 7,66,62,
+ 7,66,60, 0, 0, 0, 7,66,63, 0, 0, 0, 7,67,78, 7,67,76, 5,90,83, 7,67,75,
+ 7,67,79, 0, 0, 0, 7,66,58, 7,67,73, 7,67,81, 7,67,74, 7,67,80, 7,67,77,
+ 0, 0, 0, 7,68,60, 4,78,26, 7,68,61, 5,91,39, 5,91,40, 7,68,58, 7,68,59,
+ 5,91,71, 7,69,33, 7,69,34, 5,91,72, 4,78,48, 7,69,66, 7,69,65,15,77,17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,70,11, 0, 0, 0, 0, 0, 0, 5, 7,69,
+ 6,14, 7, 6,14, 6, 4,11,36, 6,27,82, 5,16,21, 6,27,85, 0, 0, 0, 6,27,84,
+ 0, 0, 0, 0, 0, 0,15,24,33, 6,46,46, 6,46,48, 5,34,63, 6,55,92, 6,55,90,
+ 6,55,93, 6,55,91, 5,41,69, 5,41,67, 5,41,68, 6,66, 6, 6,66, 4, 0, 0, 0,
+ 7, 8,40, 5,48,65, 7, 8,41, 7, 8,42, 6,66, 5, 0, 0, 0, 5,56, 3, 5,56, 4,
+ 5,56, 2, 7,19, 5, 7,19, 6, 5,62,23, 5,62,22,15,60,61, 4,61,30, 4,61,31,
+ 7,34,81, 7,34,83, 4,61,32, 0, 0, 0, 7,34,82, 5,73,38, 5,77,52, 7,47,92,
+ 7,52,90, 7,57,11, 7,57,10, 7,63,46, 7,69,67, 4, 8, 3, 6,14, 8, 4, 8, 4,
+ 0, 0, 0, 6,20,47, 6,20,48, 5,11,33, 0, 0, 0,15,13,37, 5,16,22, 6,27,87,
+ 6,27,86, 5,16,23, 6,36,47, 5,28, 9, 6,46,51, 6,46,50,15,31,10,15,31,11,
+ 0, 0, 0, 6,46,49, 6,56, 3, 6,56, 1, 4,32,63, 6,56, 2, 6,55,94,15,37,26,
+ 4,39, 4, 5,48,66, 6,66, 7, 6,66, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,56,65,
+ /* plane 2, page 118 */
+ 0, 255, /* first, last */
+ 7,27,54,15,60,62, 4,61,33, 7,34,84, 7,41,80, 7,52,91, 7,60,68, 0, 0, 0,
+ 5, 7,70, 6,14, 9, 6,14,10, 6,14,11, 0, 0, 0, 5,11,35, 6,20,49, 4,11,37,
+ 4,11,39, 5,11,37, 6,20,51, 5,11,36, 0, 0, 0, 0, 0, 0,15, 8,75, 0, 0, 0,
+ 0, 0, 0, 6,20,50, 5,11,34, 0, 0, 0, 5,11,38, 6,27,93, 5,16,28, 4,15,81,
+ 6,28, 1, 6,28, 5, 5,16,31, 6,28, 6, 6,28, 7, 4,15,80, 6,27,89, 5,16,32,
+ 6,27,91, 5,16,24, 6,28, 2, 6,27,92, 6,28, 3, 6,27,94, 5,16,27, 6,27,90,
+ 6,27,88, 0, 0, 0, 0, 0, 0, 5,16,26,15,18,48, 6,28, 4, 6,28, 8, 6,28, 9,
+ 0, 0, 0, 0, 0, 0,15,13,40,15,13,41,15,18,50, 4,21, 8, 5,28,18, 0, 0, 0,
+ 4,21,11, 4,26,92, 5,21,38, 4,21, 9, 6,36,56, 5,21,39, 5,21,42, 5,21,36,
+ 5,21,37, 5,21,35, 6,36,57, 6,36,58, 5,21,34, 6,36,51, 6,36,53, 6,36,52,
+ 6,36,49, 6,36,48, 6,36,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,36,50,15,13,38,15,24,37, 5,21,40, 6,36,54, 5,21,41, 5,28,17, 6,46,59,
+ 6,46,57, 5,28,14, 6,46,55, 5,28,15, 5,28,19, 4,26,94, 0, 0, 0, 6,46,56,
+ 6,46,52, 4,26,93, 6,46,54, 5,28,16, 5,28,13, 5,28,11, 5,34,68, 5,28,10,
+ 0, 0, 0, 0, 0, 0,15,24,36,15,31,14, 0, 0, 0, 6,46,53, 0, 0, 0, 6,46,58,
+ 0, 0, 0, 6,46,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,28,12,15,24,35,
+ 5,34,74, 5,34,66, 5,34,70, 4,32,69, 5,34,75, 5,34,67, 5,34,71, 4,32,67,
+ 5,34,69, 5,34,73, 6,56,15, 4,32,68, 6,56,10, 6,56, 8, 6,56,16, 5,34,72,
+ 5,34,64, 6,56, 4, 6,56, 7, 0, 0, 0, 0, 0, 0, 6,56,13,15,31,12,15,31,13,
+ 15,31,15,15,31,16,15,37,27, 6,56, 6, 6,56,17, 6,56, 5, 6,56, 9, 0, 0, 0,
+ 0, 0, 0, 5,34,65, 0, 0, 0,15,37,30, 4,39,16, 4,39,12, 6,66,13, 6,66,19,
+ 4,39, 9, 5,41,70, 5,41,73, 4,39, 8, 5,41,72, 5,28,20, 6,66,20, 5,41,74,
+ 6,66,11, 6,66, 9, 6,66,10, 6,66,18, 6,66,17, 5,41,71, 6,66,15, 5,41,75,
+ 6,66,16, 6,66,12, 4,39,19, 0, 0, 0, 6,66,21, 6,66,14,15,44,20,15,44,22,
+ 15,44,23, 0, 0, 0, 0, 0, 0, 4,39,15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,37,28,15,37,31, 5,48,70,
+ 7, 8,52, 4,45,33, 5,48,73, 7, 8,55, 4,39,18, 7, 8,54, 5,48,69, 4,45,24,
+ 7, 8,53, 7,19, 8, 5,48,71, 7, 8,58, 7, 8,43, 4,45,37, 4,45,27, 4,45,29,
+ 7, 8,51, 4,45,36, 4,45,35, 5,48,67, 7, 8,56, 7, 8,50, 7, 8,44, 5,48,68,
+ 7, 8,47, 5,48,72, 7, 8,49, 7, 8,48, 7, 8,45, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,44,21,15,50,13, 7, 8,46, 7, 8,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,56,12, 5,56,11, 7,19,11, 5,56, 7, 5,56,10, 7,19, 7, 4,51,49, 7,19, 9,
+ /* plane 2, page 119 */
+ 0, 255, /* first, last */
+ 4,51,52, 7,27,66, 5,56, 9, 5,56, 8, 7,19,10, 4,51,46, 7,19,12, 7,19,15,
+ 4,51,45, 0, 0, 0, 5,56, 5, 7,19,16, 0, 0, 0, 5,56, 6, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,19,14,15,50,12, 0, 0, 0, 0, 0, 0, 7,19,13, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,62,30, 5,62,31, 7,27,55,
+ 5,62,27, 7,27,61, 7,27,68, 4,56,70, 5,62,24, 5,62,25, 5,62,29, 5,62,28,
+ 0, 0, 0, 7,27,63, 0, 0, 0, 7,27,59, 7,27,67, 7,34,91, 7,27,60, 7, 8,59,
+ 7,27,62, 7,27,64, 5,62,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,27,56,
+ 7,27,58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,62,26,15,55,71,15,55,72,
+ 15,55,73,15,55,74, 7,34,85, 4,61,37, 7,34,92, 7,34,94, 5,68,59, 5,68,55,
+ 7,34,93, 4,61,43, 5,68,52, 5,68,53, 5,68,63, 4,61,45, 0, 0, 0, 4,61,34,
+ 7,34,90, 5,68,51, 4,61,39, 4,61,44, 5,68,61, 7,34,89, 7,34,87, 5,68,49,
+ 4,61,35, 5,62,34, 5,68,50, 7,34,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,35, 3, 7,34,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,68,57, 5,68,58, 5,62,33, 5,68,60, 5,68,62, 5,68,56,
+ 15,60,64, 7,41,86, 5,73,41, 5,73,42, 4,65, 9, 7,41,91, 7,41,92, 5,73,39,
+ 5,73,40, 7,41,82, 7,41,83, 7,41,85, 7,41,89, 7,41,90, 7,41,84, 7,41,88,
+ 4,65,11, 7,41,87, 7,35, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,64,75,15,64,76,
+ 15,67,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,47,93, 5,77,56, 7,48, 6, 5,77,59,
+ 5,81,20, 0, 0, 0, 5,77,53, 4,68,37, 7,48, 3, 5,77,54, 7,48, 2, 7,52,92,
+ 0, 0, 0, 7,47,94, 0, 0, 0, 5,77,57, 7,41,81, 5,77,58, 5,77,60, 7,48, 4,
+ 0, 0, 0,15,70,20, 7,48, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,77,61, 7,53, 2,
+ 7,53, 4, 5,81,22, 4,71,22, 7,53, 6, 7,53, 5, 5,81,21, 7,52,94, 7,53, 1,
+ 4,71,23, 7,53, 3, 7,57,17, 7,52,93, 0, 0, 0,15,70,19, 4,73,33, 7,57,14,
+ 4,73,32, 4,73,31, 5,84,23, 7,57,12, 7,57,13, 7,57,16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,57,15, 5,88,14, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,73,79,
+ 7,63,49, 7,63,48, 7,63,47, 0, 0, 0, 5,89,43, 7,65,40, 7,65,39, 7,65,38,
+ 7,66,65, 5,90,23, 7,66,66, 0, 0, 0, 7,66,64, 7,68,63, 7,67,83, 7,67,82,
+ 7,68,62, 5,91,94, 7,69,68, 7,70,12, 0, 0, 0, 0, 0, 0, 5,92,43, 7,70,45,
+ 0, 0, 0, 5, 4,86, 0, 0, 0, 6,14,12, 0, 0, 0, 0, 0, 0, 4,11,40, 5,16,33,
+ 4,15,84, 6,28,10, 6,36,59,15,24,38, 0, 0, 0,15,31,17,15,31,18, 6,56,18,
+ 0, 0, 0, 4,39,20, 6,66,22, 6,66,23, 6,66,24, 0, 0, 0, 0, 0, 0,15,44,24,
+ 15,44,25, 7, 8,60,15,44,26,15,50,16, 7,19,17, 7,19,18,15,50,15, 7,27,69,
+ /* plane 2, page 120 */
+ 0, 254, /* first, last */
+ 15,64,77,15,64,78, 5,73,43, 7,48, 7, 7,53, 7, 0, 0, 0, 5, 7,71, 6,14,13,
+ 0, 0, 0, 4,15,87, 0, 0, 0, 5,16,34,15,18,51, 0, 0, 0, 5,21,45, 5,21,46,
+ 6,36,60, 6,36,61, 5,21,48, 5,21,43, 0, 0, 0,15,24,39,15,24,41,15,24,43,
+ 4,21,18, 4,21,22, 5,21,44, 5,21,47, 6,46,63, 4,27, 5, 6,46,66, 6,46,65,
+ 5,28,22, 6,46,62, 4,27, 4, 6,46,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,56,22, 5,34,77, 5,34,79, 5,34,78, 0, 0, 0, 6,56,19, 6,56,23, 0, 0, 0,
+ 5,34,80,15,37,32,15,37,33,15,37,34, 0, 0, 0, 6,56,21, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,66,25, 5,41,81, 5,41,78, 5,41,82, 4,39,23,
+ 6,66,26, 0, 0, 0, 0, 0, 0,15,44,27,15,44,28, 5,41,79, 6,66,27, 0, 0, 0,
+ 5,41,80, 0, 0, 0, 0, 0, 0, 4,45,41, 7, 8,63, 5,48,76, 4,45,43, 5,48,75,
+ 7, 8,67, 5,48,77, 6,56,20, 7, 8,66, 0, 0, 0, 5,48,74, 5,48,78,15,50,17,
+ 7, 8,64, 0, 0, 0, 0, 0, 0, 7, 8,62, 0, 0, 0, 7, 8,61, 0, 0, 0, 0, 0, 0,
+ 7, 8,65, 5,56,16, 5,56,15, 5,56,14, 4,51,55, 7,19,20, 5,56,20, 7,27,71,
+ 4,51,56, 4,51,62, 4,51,61, 5,56,17, 5,56,21, 7,19,19, 5,56,13, 5,56,19,
+ 0, 0, 0,15,55,75,15,55,76,15,55,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,27,70,
+ 5,68,64, 5,62,37, 5,62,36, 7,27,74, 0, 0, 0, 7,27,73, 7,27,75, 7,27,72,
+ 15,60,65,15,60,66, 5,68,66, 4,61,49, 4,61,47, 7,35, 4, 5,68,65, 0, 0, 0,
+ 15,64,79,15,64,80,15,64,81, 0, 0, 0, 0, 0, 0, 7,35, 5, 7,41,93, 7,41,94,
+ 0, 0, 0, 0, 0, 0, 5,77,63, 7,48, 9, 7,48, 8,15,70,21, 5,77,62, 0, 0, 0,
+ 15,72,43,15,72,44, 7,53, 8, 0, 0, 0, 4,73,35, 5,84,25, 4,73,34, 0, 0, 0,
+ 15,73,80,15,73,81, 5,88,15, 7,63,51,15,75,68, 7,63,50, 5,89,45, 5,89,44,
+ 7,65,41, 0, 0, 0, 0, 0, 0, 4,77, 1, 0, 0, 0, 5,90,84, 4,78,27, 5,92,36,
+ 0, 0, 0, 7,70,52, 6,14,14, 6,14,15, 6,20,52, 5,11,40, 0, 0, 0, 4,15,88,
+ 6,28,12, 4,15,89, 6,28,11, 6,36,71, 4,21,27, 5,21,51, 5,21,50, 6,36,63,
+ 6,36,67, 4,21,23, 6,36,68, 5,21,49, 6,36,64,15,24,45,15,24,46,15,24,47,
+ 4,21,28, 6,36,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,36,62, 6,36,66, 6,36,69,
+ 6,36,65, 5,28,23, 4,27, 6, 6,46,68, 6,46,71, 5,28,24, 6,46,67, 6,46,70,
+ 6,46,73, 6,46,69, 4,27, 7, 4,27, 8, 6,46,72, 0, 0, 0,15,31,19, 0, 0, 0,
+ 0, 0, 0, 5,34,83, 5,34,81, 5,34,82, 0, 0, 0, 6,56,24, 0, 0, 0, 0, 0, 0,
+ 6,66,30, 5,41,85, 4,39,25, 6,66,32, 5,41,83, 5,41,84, 6,66,29, 6,66,33,
+ 6,66,28, 6,66,31, 0, 0, 0, 0, 0, 0, 7, 8,70, 5,48,85, 7, 8,71, 5,48,84,
+ 5,48,80, 5,48,79, 4,45,48, 4,45,50, 4,45,45, 7, 8,73, 4,45,52,
+ /* plane 2, page 121 */
+ 3, 255, /* first, last */
+ 5,48,82, 7, 8,72, 7, 8,74, 5,48,81, 7, 8,68,
+ 7, 8,69, 5,48,83, 0, 0, 0, 7,19,24, 7,19,23, 4,51,63, 5,56,22, 4,51,67,
+ 5,56,25, 5,56,27, 4,51,64, 7,19,22, 7,19,21, 5,56,23, 5,56,24, 5,56,26,
+ 7,19,25, 0, 0, 0, 0, 0, 0, 5,62,38, 7,27,77, 7,27,83, 7,27,76, 5,62,42,
+ 5,62,41, 7,27,78, 7,19,26, 5,62,40, 0, 0, 0, 0, 0, 0, 7,27,79, 7,27,80,
+ 0, 0, 0, 7,27,81, 4,56,76, 7,27,84, 7,27,82, 0, 0, 0, 5,62,39, 7,35, 7,
+ 0, 0, 0, 7,35, 8, 4,61,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,35, 6, 7,35, 9,
+ 0, 0, 0, 0, 0, 0, 4,65,21, 5,73,44, 4,65,18, 4,65,19, 7,42, 1, 7,42, 2,
+ 7,42, 3, 7,42, 4, 4,65,22, 0, 0, 0, 7,48,10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,81,23, 0, 0, 0, 7,53, 9, 0, 0, 0, 5,84,26, 4,73,36, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,60,69, 0, 0, 0, 5,88,16, 0, 0, 0, 7,66,67, 4,77,64, 7,68,64,
+ 7,68,65, 5,91,73, 7,69,35, 5, 3, 7, 5, 3, 8, 6,14,16, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,28,19, 4,16, 1, 4,15,91, 4,15,90, 4,16, 2, 5,16,35, 0, 0, 0,
+ 6,28,16, 6,28,17, 6,28,15, 6,28,18, 0, 0, 0, 6,28,14, 4,21,32, 6,36,74,
+ 6,36,83, 4,21,30, 0, 0, 0, 6,36,79, 5,21,60, 5,21,57, 0, 0, 0, 6,36,81,
+ 4,21,34, 5,21,52, 4,21,38, 6,36,89, 5,21,53, 6,36,87, 6,36,75, 6,36,88,
+ 5,21,56, 6,36,84, 6,36,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,36,78, 6,36,90,
+ 15,24,48,15,24,49,15,24,51,15,24,52,15,24,53,15,24,54, 0, 0, 0, 6,36,82,
+ 0, 0, 0, 0, 0, 0, 6,36,73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,36,72,
+ 0, 0, 0, 6,36,86, 6,36,76, 5,21,58, 6,46,84, 4,27,18, 4,27,14, 5,28,27,
+ 6,46,79, 6,46,78, 6,46,81, 6,46,74, 4,27,13, 6,46,88, 4,27,24, 4,27,25,
+ 5,28,28, 6,46,77, 6,46,86, 6,46,80, 6,46,87, 4,27,23, 5,28,25, 5,28,26,
+ 15,31,20,15,31,21,15,31,22,15,31,23,15,31,24,15,31,25,15,31,26,15,31,28,
+ 0, 0, 0, 0, 0, 0, 6,46,82, 6,46,85, 0, 0, 0, 0, 0, 0, 6,46,76, 0, 0, 0,
+ 0, 0, 0, 6,46,89, 6,46,83, 0, 0, 0, 5,34,85, 4,32,72, 4,32,74, 0, 0, 0,
+ 6,56,38, 5,34,86, 5,28,29, 5,34,89, 4,32,81, 4,32,80, 6,56,32, 6,56,43,
+ 6,56,29, 6,56,41, 4,32,73, 4,32,75, 5,34,92, 5,34,84, 4,32,83, 6,56,35,
+ 6,56,28, 6,56,39, 6,56,34, 6,56,31, 4,32,82, 5,34,90, 6,56,40, 5,34,88,
+ 5,34,87, 6,56,36, 0, 0, 0, 0, 0, 0,15,37,35,15,37,37,15,37,38, 6,56,42,
+ 5,34,91, 0, 0, 0, 6,56,25, 6,56,27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,32,79, 6,56,26, 6,56,37, 6,56,30, 6,66,46, 4,39,31, 5,41,90, 4,39,27,
+ 5,41,88, 5,41,91, 4,39,30, 4,39,40, 6,66,34, 6,66,44, 4,39,33, 6,66,51,
+ /* plane 2, page 122 */
+ 0, 255, /* first, last */
+ 4,39,36, 6,66,47, 4,39,39, 6,66,38, 5,41,89, 6,66,49, 6,66,37, 4,39,41,
+ 6,66,48, 6,66,36, 5,41,86, 5,41,87, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,44,29,
+ 15,44,30,15,44,31,15,44,32,15,44,34,15,44,35,15,44,36,15,44,37, 0, 0, 0,
+ 0, 0, 0, 6,66,40, 4,39,43, 6,66,42, 5,34,93, 6,66,43, 6,66,45, 0, 0, 0,
+ 6,66,35, 0, 0, 0, 0, 0, 0, 6,66,50, 6,66,41, 0, 0, 0, 7, 9, 1, 5,49,10,
+ 7, 8,75, 5,48,90, 5,49, 2, 7, 8,81, 7, 8,84, 7, 9, 2, 7, 8,92, 7, 8,80,
+ 5,49, 7, 4,45,55, 5,49, 9, 5,49, 3, 5,48,91, 5,48,94, 7, 8,88, 5,49, 4,
+ 4,45,61, 5,49, 6, 4,45,66, 7, 9, 4, 7, 8,87, 7, 8,79, 5,48,88, 5,48,92,
+ 7, 8,93, 0, 0, 0, 7, 8,77, 5,49, 5, 5,48,93, 5,48,87, 5,48,89, 5,48,86,
+ 0, 0, 0,15,50,18,15,50,19,15,50,20,15,50,21,15,50,23,15,50,25,15,50,26,
+ 7, 8,86, 7, 8,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8,76, 0, 0, 0,
+ 7, 8,82,15,50,24, 5,49, 1, 7, 8,91, 7, 8,78, 5,49, 8, 7, 9, 3, 7, 8,94,
+ 7, 8,90, 7, 8,83, 7,19,38, 5,56,32, 4,51,81, 7,19,50, 4,51,72, 4,51,69,
+ 4,51,76, 7,19,41, 7,19,49, 7,19,35, 5,56,29, 7,19,34, 5,56,28, 7,19,28,
+ 0, 0, 0, 4,51,80, 4,51,71, 7,19,37, 4,51,79, 7,19,29, 4,51,78, 7,19,39,
+ 7,19,46, 4,51,70, 7,19,48, 7,19,30, 4,51,73, 7,19,27, 7,19,51, 7,19,32,
+ 7,19,31, 7,19,40, 7,19,42, 5,56,31, 7,19,44, 4,51,77, 7,19,36, 5,56,30,
+ 15,55,78,15,55,79,15,55,80,15,55,81,15,55,82,15,55,83,15,55,84,15,55,85,
+ 15,55,86,15,55,87,15,55,88, 0, 0, 0, 7,19,52, 0, 0, 0, 7,19,33, 7,19,43,
+ 4,56,78, 5,62,50, 5,62,49, 7,27,93, 4,56,79, 5,62,52, 4,56,81, 7,27,89,
+ 4,56,77, 5,62,45, 5,62,51, 5,62,46, 7,27,86, 7,28, 5, 4,56,82, 7,35,10,
+ 5,62,47, 7,28, 1, 7,27,87, 5,62,54, 7,28, 7, 7,27,92, 7,27,88, 5,62,48,
+ 4,56,84, 7,27,91, 7,27,94, 7,28, 2, 7,28, 3, 4,56,83, 5,62,43, 7,28, 6,
+ 0, 0, 0, 5,62,44, 7,28, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,27,85,
+ 15,60,67,15,60,68,15,60,69,15,60,70,15,60,71,15,60,72,15,60,73,15,60,74,
+ 15,60,75, 0, 0, 0, 0, 0, 0, 7,28, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,28, 9,
+ 7,27,90, 0, 0, 0, 4,61,62, 4,61,54, 7,35,23, 4,61,56, 7,35,21, 5,68,72,
+ 7,35,26, 7,35,11, 4,61,64, 5,68,70, 5,56,33, 4,61,57, 5,68,71, 7,35,24,
+ 7,35,18, 5,68,68, 4,61,51, 7,35,27, 4,61,53, 5,68,69, 4,61,61, 7,35,25,
+ 7,35,15, 7,35,19, 7,42,10, 7,35,16, 4,61,60, 7,35,20, 7,35,17, 7,35,28,
+ 7,35,12, 0, 0, 0, 7,35,13, 0, 0, 0, 0, 0, 0,15,64,82,15,64,85, 0, 0, 0,
+ 7,35,22, 0, 0, 0, 4,61,63, 0, 0, 0, 0, 0, 0, 7,35,14, 5,73,45, 5,73,47,
+ /* plane 2, page 123 */
+ 0, 255, /* first, last */
+ 7,42,15, 0, 0, 0, 4,65,30, 7,42,12, 7,42,14, 4,65,35, 4,65,25, 5,73,48,
+ 4,65,33, 7,42,20, 4,65,34, 5,73,46, 4,65,31, 7,42, 6, 7,42, 9, 7,35,29,
+ 7,42, 8, 7,42,21, 7,48,19, 7,42,19, 0, 0, 0, 4,65,28, 5,77,64, 7,42, 7,
+ 0, 0, 0,15,67,88,15,67,89,15,67,90, 4,65,36, 7,42,11, 0, 0, 0, 7,48,21,
+ 7,42,16, 7,42,17, 7,42,13, 7,42,18, 4,65,24,15,64,84, 0, 0, 0, 4,68,42,
+ 4,68,43, 5,77,66, 5,77,65, 7,48,13, 5,77,67, 7,48,15, 4,68,41, 7,48,11,
+ 5,73,51, 7,48,18, 7,48,14, 7,48,20, 7,48,22, 7,48,12, 7,48,16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,70,22,15,70,23,15,70,24,15,70,25, 7,48,24,
+ 7,48,23, 7,48,25, 7,53,10, 4,71,34, 7,53,20, 7,53,13, 7,53,19, 0, 0, 0,
+ 4,71,24, 7,53,14, 5,81,29, 7,53,12, 7,53,15, 4,71,28, 5,81,26, 5,81,25,
+ 4,71,35, 7,57,27, 7,57,21, 4,71,26, 5,81,28, 5,81,27, 7,53,17, 0, 0, 0,
+ 7,53,11, 7,53,16, 5,81,24, 7,53,21, 5,84,27, 5,84,29, 5,84,32, 5,86,43,
+ 4,73,39, 7,57,25, 4,73,42, 5,84,31, 4,73,41, 5,84,30, 0, 0, 0, 7,57,23,
+ 7,57,32, 7,53,22, 5,84,28, 7,57,22, 7,57,26, 7,57,31, 4,73,38, 7,57,30,
+ 15,73,82,15,73,83,15,73,84, 0, 0, 0, 7,57,28, 0, 0, 0, 0, 0, 0, 7,57,29,
+ 4,74,93, 4,74,94, 7,60,70, 5,86,46, 5,86,45, 5,88,17, 7,60,72, 7,60,73,
+ 7,60,74,15,74,84,15,74,85, 7,60,71, 7,57,34, 7,63,55, 7,63,56, 7,63,53,
+ 4,76, 7, 7,63,54, 7,63,58,15,75,69,15,75,70, 0, 0, 0, 7,63,52, 7,63,57,
+ 7,63,59, 4,77, 3, 7,65,43, 5,89,46, 7,65,44,15,76,26,15,76,27, 0, 0, 0,
+ 7,65,42, 5,90,85, 7,66,69, 7,66,68, 0, 0, 0, 5,90,25, 4,77,94, 7,67,84,
+ 0, 0, 0, 0, 0, 0, 7,68,66, 4,78,28, 0, 0, 0, 7,68,36, 0, 0, 0, 0, 0, 0,
+ 7,69,36, 7,70,48, 0, 0, 0, 5, 4,87, 4,16, 4, 5,16,36, 5,16,37, 4,21,40,
+ 4,21,41, 4,21,39, 6,36,91, 4,27,26, 0, 0, 0, 5,34,94, 5,35, 1, 6,56,44,
+ 4,39,45, 0, 0, 0, 5,49,12, 4,45,67, 5,49,13, 5,49,11, 0, 0, 0, 0, 0, 0,
+ 5,56,34, 7,19,54, 7,19,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,28,10, 0, 0, 0,
+ 0, 0, 0, 5,62,55, 7,35,30, 7,42,22, 7,42,25, 5,73,52, 7,42,23, 5,73,53,
+ 7,42,24, 0, 0, 0, 0, 0, 0, 7,48,26, 7,42,26, 5,81,30, 0, 0, 0, 0, 0, 0,
+ 5,90,86, 7,69,87, 6,20,53, 6,28,21, 6,28,20, 0, 0, 0, 0, 0, 0,15,24,55,
+ 4,27,27, 5,28,30, 6,46,91,15,31,29, 0, 0, 0, 5,35, 2, 4,32,85, 6,59,63,
+ 0, 0, 0, 4,39,48, 6,66,52, 4,39,49, 0, 0, 0, 7, 9, 8, 7, 9, 7, 7, 9, 5,
+ 5,49,15, 5,49,14, 0, 0, 0, 7, 9, 6,15,50,27, 0, 0, 0, 0, 0, 0, 5,56,35,
+ 4,51,84, 7,19,55, 5,56,36, 7,12,54, 5,62,58, 7,28,13, 5,62,56, 7,28,12,
+ /* plane 2, page 124 */
+ 0, 254, /* first, last */
+ 5,62,57, 7,28,11, 0, 0, 0, 5,68,73, 4,61,67, 7,35,32, 4,61,66, 5,62,59,
+ 0, 0, 0, 7,42,28, 5,73,55, 7,42,29, 7,35,33, 7,35,34, 0, 0, 0, 0, 0, 0,
+ 5,73,54, 5,77,70, 5,77,69, 5,77,71,15,70,26, 5,77,68,15,67,91, 0, 0, 0,
+ 5,81,31, 5,84,33, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,74,86,15,74,87, 0, 0, 0,
+ 5,88,18, 5,89,47, 0, 0, 0, 5,90,87, 0, 0, 0, 7,69,37, 0, 0, 0, 6, 5,52,
+ 5, 3, 9, 5,11,42, 5,16,40, 5,16,39, 6,28,23, 6,28,22, 6,36,94, 6,36,92,
+ 5,21,65, 0, 0, 0, 6,37, 1, 0, 0, 0, 6,36,93, 4,27,28, 6,46,92, 4,27,29,
+ 5,28,32, 5,28,31, 6,46,94, 5,28,33, 6,47, 3, 6,46,93,15,18,53, 4,32,87,
+ 5,35, 5, 4,32,86, 6,56,46, 6,56,47, 5,35, 7, 5,35, 3, 5,35, 6, 6,56,45,
+ 6,47, 2, 5,35, 4, 5,35, 8, 0, 0, 0, 0, 0, 0, 6,66,53, 6,66,54, 4,39,51,
+ 4,39,50, 6,66,57, 5,41,93, 5,41,92, 6,66,59, 6,66,58, 6,66,55, 6,66,56,
+ 5,49,18, 4,45,70, 7, 9, 9, 7, 9,11, 5,49,17, 5,49,19, 7, 9,13, 7, 9,12,
+ 5,41,94, 5,49,16, 7, 9,10, 5,42, 1, 7, 9,14,15,50,28, 0, 0, 0, 0, 0, 0,
+ 5,56,39, 5,56,40, 5,56,38, 7,19,57, 4,51,86, 7,19,58, 7,19,60, 7,19,59,
+ 5,56,37, 7,19,56, 5,62,61, 5,62,62, 5,62,63, 5,62,60, 7,28,16, 7,28,14,
+ 7,28,15, 0, 0, 0, 0, 0, 0, 4,61,69, 5,68,74, 0, 0, 0, 5,68,75, 7,35,35,
+ 7,35,36, 7,35,37, 4,65,39, 5,73,56, 5,56,41, 7,42,30, 4,65,41, 5,77,75,
+ 5,77,72, 7,48,27, 5,77,74, 5,77,73, 4,71,38, 5,81,32, 7,53,23, 7,53,24,
+ 7,57,35, 7,60,76, 7,57,36, 7,57,37, 7,60,77, 7,60,78, 0, 0, 0, 5,84,34,
+ 7,63,60, 0, 0, 0, 7,65,45, 7,63,61, 5,89,48, 5,90,26, 7,69,38, 7,70,35,
+ 15, 8,76, 5,11,43, 6,28,24,15,18,54, 5,21,68, 5,21,67, 4,21,47, 5,21,66,
+ 4,21,46, 6,37, 5, 6,37, 3, 0, 0, 0, 6,47, 5, 5,28,34, 5,28,38, 5,28,36,
+ 5,28,40, 5,28,37, 6,47, 8, 6,47, 6, 5,28,39, 5,28,35, 6,47, 7, 6,47, 4,
+ 0, 0, 0,15,31,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,32,92, 4,32,93,
+ 4,32,90, 6,56,50, 5,35,11, 6,56,49, 5,35,10, 4,32,89, 4,32,91, 6,56,51,
+ 15,37,39, 5,35, 9, 6,66,65, 6,66,60, 5,42, 5, 5,42, 3, 5,42, 2, 6,66,63,
+ 5,42, 4, 6,66,62, 6,66,64,15,44,40, 6,66,61, 0, 0, 0, 6,66,66,15,44,41,
+ 0, 0, 0, 5,49,21, 5,49,20, 4,45,73, 5,49,23, 5,49,22, 5,49,24, 4,45,74,
+ 7, 9,15, 7, 9,16, 4,45,75, 0, 0, 0, 0, 0, 0, 7, 9,17, 7,19,68, 5,56,43,
+ 7,19,62, 7,19,64, 7,19,65, 4,51,88, 5,56,42, 7,19,66, 5,56,44, 7,19,63,
+ 0, 0, 0,15,55,90, 7,19,61, 7,19,67, 0, 0, 0, 4,56,89, 5,62,67, 7,28,17,
+ 5,62,66, 4,56,88, 5,62,64, 5,62,68, 5,62,65, 0, 0, 0,15,60,76,
+ /* plane 2, page 125 */
+ 1, 255, /* first, last */
+ 7,35,38, 4,61,71, 7,35,39, 4,61,70, 5,68,76, 7,42,31, 5,68,77,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,73,59, 7,42,32, 5,73,58, 7,42,35,
+ 7,48,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,42,34, 5,73,57, 5,77,77, 5,77,76,
+ 7,48,28, 5,81,34, 5,77,78, 0, 0, 0, 0, 0, 0, 5,81,33, 7,53,25, 7,57,38,
+ 7,60,80, 7,60,79, 0, 0, 0, 5,90,88, 5,11,44, 4,11,42, 6,20,54, 0, 0, 0,
+ 15,13,42, 0, 0, 0, 4,16, 6, 6,28,25, 5,16,41, 5,16,42, 0, 0, 0, 0, 0, 0,
+ 15,18,55,15,18,56, 6,28,26, 6,37,10, 0, 0, 0, 6,37,12, 6,37, 7, 6,37, 8,
+ 6,37, 6, 6,37,11, 5,21,69,15,24,57,15,24,58,15,24,59,15,24,60,15,24,61,
+ 15,24,62,15,24,63,15,24,64, 0, 0, 0, 6,37,13, 4,21,51, 0, 0, 0, 6,37, 9,
+ 4,21,50, 6,47,11, 4,27,32, 5,28,41, 5,28,43, 6,47,14, 6,47,12, 6,47,13,
+ 6,56,55, 5,28,42, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,31,31,15,31,33,15,31,34,
+ 15,31,35,15,31,36,15,31,37, 0, 0, 0, 6,47,15, 6,47,10, 0, 0, 0, 0, 0, 0,
+ 5,28,45, 0, 0, 0, 0, 0, 0, 4,33, 2, 6,56,52, 6,56,57, 6,56,54, 5,35,16,
+ 5,35,12, 6,56,62, 6,56,53, 5,35,15, 5,35,17, 5,35,18, 6,56,56, 6,56,64,
+ 6,56,66, 5,35,19, 6,56,63, 0, 0, 0,15,37,40,15,37,41,15,37,42,15,37,43,
+ 15,37,44,15,37,45,15,37,46, 0, 0, 0, 0, 0, 0, 6,56,65,15,31,32, 6,56,59,
+ 0, 0, 0, 0, 0, 0, 5,35,14,15,38,20, 0, 0, 0, 6,66,69, 4,39,53, 5,42, 6,
+ 6,66,68, 6,66,70, 6,66,76, 6,66,67, 6,66,73, 5,42, 7, 4,39,55, 0, 0, 0,
+ 15,44,45,15,44,46,15,44,47,15,44,49, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,44,48,
+ 15,44,44, 6,66,75, 6,56,61, 7, 9,19, 7, 9,21, 5,42, 8, 4,45,79, 7, 9,20,
+ 5,49,26, 4,45,80, 5,49,27, 7, 9,25, 7, 9,24, 7, 9,18,15,50,29,15,50,30,
+ 15,50,31, 0, 0, 0, 7, 9,23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,44,43, 7,19,74, 5,56,46, 7,19,71, 7,19,70, 5,56,47, 7,19,75, 7,19,78,
+ 4,51,92, 7,19,72, 5,56,45, 6,66,72,15,52,18, 0, 0, 0,15,55,91,15,55,92,
+ 15,55,93,15,55,94,15,56, 1,15,56, 2, 7,19,77, 0, 0, 0, 0, 0, 0, 7,19,76,
+ 0, 0, 0, 7,19,69, 7,19,73, 5,56,48, 7,28,18, 5,62,69, 5,59,13, 5,62,71,
+ 5,56,50, 5,62,70, 4,56,91, 7,28,24, 7,28,20, 7,28,22, 7,28,23, 7,28,21,
+ 0, 0, 0,15,60,78,15,60,80, 0, 0, 0,15,60,79, 0, 0, 0, 7,35,43, 5,68,83,
+ 7,35,46, 5,68,79, 7,35,41, 7,35,42, 7,35,49, 5,68,81, 5,68,78, 5,68,82,
+ 7,35,45, 7,35,44, 0, 0, 0,15,64,86,15,64,87,15,64,88,15,64,89,15,64,91,
+ 15,64,92, 0, 0, 0, 7,35,40, 0, 0, 0, 0, 0, 0, 7,35,48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,68,80, 7,42,39, 7,42,43, 5,73,61, 5,68,84,
+ /* plane 2, page 126 */
+ 0, 255, /* first, last */
+ 7,42,42, 7,35,47, 5,73,60, 4,65,43, 7,42,40, 5,73,62, 7,42,45, 7,42,44,
+ 5,73,64, 7,42,36, 7,42,41, 7,42,38,15,67,92,15,67,93,15,67,94,15,68, 1,
+ 0, 0, 0, 7,42,46, 0, 0, 0, 0, 0, 0, 7,42,37, 5,73,63, 4,68,49, 5,77,80,
+ 4,68,48, 5,77,79, 7,48,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,48,32, 0, 0, 0,
+ 15,70,27,15,70,28,15,70,29,15,70,30,15,70,31, 7,48,31, 5,81,35, 4,71,39,
+ 5,81,36, 0, 0, 0, 0, 0, 0, 5,81,37, 0, 0, 0,15,72,46,15,72,47, 7,53,27,
+ 0, 0, 0, 7,57,39, 5,84,37, 5,84,36,15,73,86,15,73,87,15,73,88, 7,57,42,
+ 7,57,40, 7,57,41, 0, 0, 0, 0, 0, 0,15,72,45, 7,60,81, 4,75, 2, 5,84,35,
+ 7,60,82, 0, 0, 0, 0, 0, 0,15,74,88, 0, 0, 0, 0, 0, 0, 7,60,83, 7,63,62,
+ 7,63,64, 7,63,63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,66,70, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,14,17, 6,20,55, 6,20,56, 5,21,70,15,24,65, 6,47,16, 4,27,36, 0, 0, 0,
+ 6,56,67,15,37,47, 0, 0, 0, 5,42,10,15,44,50, 0, 0, 0, 0, 0, 0, 7, 9,26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,56,52, 5,56,51,15,56, 3, 7,19,79,
+ 0, 0, 0, 0, 0, 0, 5,62,73, 5,62,74, 5,62,72,15,60,81, 5,68,85, 7,35,51,
+ 7,42,48, 7,42,47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,81,38, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,60,84, 0, 0, 0, 6,14,18, 6,14,19,
+ 6,20,57,15,13,43,15,13,45,15,13,46,15,13,47,15,13,48, 4,11,43, 5,16,45,
+ 6,28,30, 0, 0, 0, 6,28,29, 5,16,46, 6,28,28, 0, 0, 0, 4,16, 9,15,18,57,
+ 15,18,58,15,18,59,15,18,60,15,18,61, 0, 0, 0, 5,21,77, 6,37,16, 5,21,71,
+ 4,21,55, 5,21,74, 5,21,79, 5,21,78, 4,21,56, 6,37,14, 6,37,15, 5,21,75,
+ 5,21,72,15,24,67,15,24,68,15,24,69,15,24,70,15,24,72,15,24,73,15,24,66,
+ 0, 0, 0, 0, 0, 0, 5,21,76, 5,21,73, 0, 0, 0,15,24,71, 5,28,49, 5,28,48,
+ 5,28,52, 5,28,47, 6,47,20, 6,47,17, 5,35,25, 5,28,51, 5,28,46, 6,47,19,
+ 4,27,38, 5,28,53, 6,56,68, 6,47,21,15,31,39,15,31,40,15,31,41,15,31,42,
+ 15,31,43,15,31,44,15,31,47,15,31,48,15,31,49, 0, 0, 0, 6,47,18,15,31,46,
+ 0, 0, 0, 6,56,70, 5,35,22, 4,33, 3, 6,56,72, 4,33, 5, 5,35,27, 5,35,21,
+ 5,35,29, 5,35,23, 4,33, 4, 6,56,74, 6,56,73, 5,35,26, 0, 0, 0,15,37,48,
+ 15,37,49,15,37,50,15,37,51,15,37,52,15,37,53,15,37,54,15,37,55, 6,56,69,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,56,71, 6,66,77, 0, 0, 0,15,31,45, 6,66,78,
+ 4,39,60, 5,42,12, 5,42,16, 6,66,82, 5,42,11, 5,42,14, 5,42,17, 0, 0, 0,
+ 6,66,81, 6,66,79, 5,42,19, 4,39,61, 5,42,15, 6,66,86, 0, 0, 0, 5,42,13,
+ /* plane 2, page 127 */
+ 0, 255, /* first, last */
+ 6,66,83,15,44,51,15,44,52,15,44,53,15,44,54,15,44,55,15,44,56,15,44,57,
+ 0, 0, 0, 6,66,80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,49,34, 5,49,28,
+ 4,45,82, 5,49,31, 5,49,30, 5,49,29, 5,49,32, 7, 9,31, 5,49,38, 5,49,35,
+ 7, 9,33, 5,49,33, 7, 9,28, 7, 9,32, 7, 9,30, 6,66,84, 7, 9,34, 7,19,82,
+ 5,49,37, 5,49,36,15,50,32,15,50,33, 0, 0, 0, 7, 9,35, 7, 9,27,15,56,13,
+ 4,52, 3, 4,52, 4, 4,52, 8, 7,19,84, 5,56,57, 4,52, 1, 4,52, 2, 4,52, 7,
+ 7,19,85, 4,52, 5, 7,19,81, 7,19,80, 5,56,56, 5,56,58, 7,19,86,15,56, 4,
+ 15,56, 6,15,56, 7,15,56, 8,15,56, 9,15,56,10,15,56,11,15,56,12,15,56,14,
+ 0, 0, 0, 7,19,88, 7,19,87, 0, 0, 0, 5,56,59, 5,56,54, 5,56,55, 0, 0, 0,
+ 0, 0, 0, 5,62,79, 5,62,81, 4,57, 2, 5,62,80, 4,57, 4, 4,57, 1, 5,62,82,
+ 4,56,94, 5,62,76, 4,57, 3, 5,62,78, 5,62,75, 7,28,26, 5,62,83,15,56, 5,
+ 15,60,82,15,60,83,15,60,84,15,60,85,15,60,86, 7,28,25, 5,68,89, 5,68,92,
+ 4,61,75, 7,35,55, 7,35,54, 5,68,86, 5,68,90, 5,68,88, 5,68,87, 5,68,93,
+ 5,68,94, 7,35,59, 7,35,58, 5,68,91,15,64,93, 7,35,56, 0, 0, 0, 7,35,53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,35,57, 7,35,52, 0, 0, 0, 5,56,61, 5,73,66,
+ 5,73,70, 5,73,72, 4,65,46, 4,65,44, 5,73,67, 5,73,71, 5,73,69, 5,73,65,
+ 7,42,50, 5,73,73, 5,73,68,15,68, 3,15,68, 4,15,68, 5, 0, 0, 0, 0, 0, 0,
+ 7,42,49, 0, 0, 0, 0, 0, 0, 7,42,51, 0, 0, 0, 4,68,50, 4,68,52, 4,68,56,
+ 4,68,55, 5,77,81, 7,48,33, 7,48,35, 5,77,82, 7,48,34,15,70,32,15,70,33,
+ 15,70,34, 4,71,41, 5,81,40, 5,81,41, 7,53,31, 7,53,29, 7,53,28, 7,53,30,
+ 5,81,39, 5,84,38, 5,84,41, 4,73,45, 5,84,40, 5,84,39,15,73,89, 0, 0, 0,
+ 5,86,47, 5,86,48,15,74,89, 7,57,43, 7,60,85, 7,60,86, 5,88,19, 5,88,20,
+ 5,88,21, 4,77, 6, 0, 0, 0, 0, 0, 0, 7,65,46, 5,90,89, 5,91,41, 0, 0, 0,
+ 6,14,21, 6,14,20, 6,20,59, 5,11,45,15,13,49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,20,58, 6,28,33, 4,16,11, 6,28,34, 6,28,32, 5,16,48, 5,16,47, 0, 0, 0,
+ 0, 0, 0, 6,28,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,28,35, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,21,63, 6,37,19, 4,21,58, 5,21,83, 6,37,23, 5,21,87,
+ 6,37,26, 5,21,81, 5,21,85, 6,37,28, 6,37,29, 5,21,84, 6,37,27, 6,37,18,
+ 6,37,22, 0, 0, 0,15,24,74, 6,37,17, 6,37,21, 0, 0, 0, 6,37,25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,21,86, 5,21,80,
+ 0, 0, 0, 6,37,20, 5,28,64, 5,28,55, 5,28,56, 5,28,59, 6,47,27, 5,28,54,
+ 6,47,24, 4,27,46, 5,28,61, 5,28,57, 5,28,65, 5,28,58, 6,47,25, 6,56,89,
+ /* plane 2, page 128 */
+ 0, 255, /* first, last */
+ 5,28,66, 0, 0, 0, 0, 0, 0,15,31,52, 0, 0, 0, 0, 0, 0, 6,47,23, 0, 0, 0,
+ 0, 0, 0,15,31,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,47,26, 5,28,62, 5,35,33, 5,35,31, 6,56,81,
+ 5,35,32, 5,35,34, 6,56,84, 6,56,80, 5,35,39, 5,35,37, 6,56,78, 6,56,77,
+ 5,35,30, 6,56,79, 6,56,82, 6,56,86, 5,35,42, 6,56,76, 6,56,87, 5,35,35,
+ 5,35,44, 5,35,40, 6,56,83, 5,35,41, 5,35,38, 6,56,85, 5,42,21, 0, 0, 0,
+ 0, 0, 0,15,37,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,56,88, 6,56,75,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,67, 2, 5,42,35, 4,39,64, 5,42,23, 5,42,31, 5,42,22, 5,49,46, 5,42,27,
+ 6,66,87, 6,66,91, 5,42,34, 5,42,28, 5,42,25, 5,42,32, 5,42,33, 5,42,29,
+ 5,35,36, 5,42,24, 5,42,36, 6,66,94, 5,42,38, 6,66,89, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,42,39,15,44,58,15,44,59, 6,66,88, 0, 0, 0, 6,66,90, 0, 0, 0,
+ 6,66,93, 0, 0, 0, 6,67, 1, 6,66,92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,42,26, 0, 0, 0, 7, 9,38, 4,45,90, 5,49,44,
+ 5,49,39, 5,49,42, 5,49,47, 7, 9,37, 7, 9,41, 4,45,92, 7, 9,45, 4,45,91,
+ 5,49,43, 5,49,45, 4,46, 4, 5,49,49, 5,49,50, 4,39,67, 7, 9,47, 5,49,41,
+ 7, 9,43, 0, 0, 0, 0, 0, 0,15,50,34,15,50,35,15,50,36,15,50,37, 7, 9,40,
+ 0, 0, 0, 7, 9,44, 0, 0, 0, 7, 9,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9,42, 5,49,48, 5,49,52, 5,49,53, 5,42,37,
+ 7,20, 1, 5,56,64, 5,42,40, 5,56,73, 4,52,10, 7,19,90, 5,56,67, 7,19,94,
+ 7,20, 3, 7,19,92, 5,56,63, 7,19,91, 7,20, 5, 5,49,51, 7,20, 6, 5,56,71,
+ 5,56,72, 5,56,62, 5,56,65, 7,19,93, 5,56,69, 5,56,68, 7,20, 4, 4,52,11,
+ 5,56,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,52,12,
+ 15,56,17,15,56,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,20, 2, 5,62,90, 5,62,93, 5,62,85, 7,28,32, 5,62,86,
+ 5,62,92, 5,62,88, 4,57, 9, 7,28,30, 7,35,71, 7,28,35, 5,62,94, 4,57,14,
+ 7,28,27, 7,28,34, 7,28,36, 5,62,89, 4,57, 7, 7,28,33, 7,20, 7, 7,28,31,
+ 4,57,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,60,87, 0, 0, 0, 7,28,29, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,60,89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,62,87,
+ /* plane 2, page 129 */
+ 0, 253, /* first, last */
+ 5,62,84, 0, 0, 0, 0, 0, 0, 7,35,66, 0, 0, 0, 4,61,80, 7,35,70, 4,61,79,
+ 5,69, 1, 5,69, 2, 5,69,13, 5,69, 6, 4,61,81, 5,69,12, 5,69, 8, 7,35,63,
+ 5,73,80, 7,35,69, 7,35,60, 5,69,14, 7,35,62, 5,69, 4, 7,35,65, 5,69, 3,
+ 5,69, 9, 4,63,19, 4,61,86, 5,69, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,64,94,15,65, 1,15,65, 2,15,65, 3,15,65, 4,15,65, 5, 7,35,75,
+ 5,69, 7, 7,35,64, 7,35,73, 7,35,72, 7,35,74, 7,35,61, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,69,11, 7,35,67, 0, 0, 0,
+ 7,28,28, 0, 0, 0, 5,69,15, 5,73,74, 7,42,69, 0, 0, 0, 5,73,79, 5,73,81,
+ 7,42,72, 5,73,84, 7,42,59, 5,69,10, 5,73,78, 7,42,56, 5,73,77, 5,73,82,
+ 4,65,53, 7,42,52, 4,61,83, 7,42,57, 7,35,68, 7,42,62, 5,73,83, 7,42,58,
+ 7,42,70, 7,42,53, 7,42,60, 5,73,75, 5,73,76, 7,42,65, 7,42,66, 7,42,67,
+ 7,42,63, 5,73,86, 5,73,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,42,64, 7,42,61, 0, 0, 0, 7,42,71, 7,42,54, 7,42,68, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,65,51, 4,68,57, 5,77,93, 5,77,87, 7,48,36, 5,77,91, 5,77,86, 5,77,89,
+ 7,48,40, 7,48,38, 4,68,60, 5,77,83, 4,68,61, 7,48,39, 5,77,88, 5,77,85,
+ 5,77,84, 7,48,41, 0, 0, 0, 0, 0, 0,15,70,35,15,70,36,15,70,37,15,70,38,
+ 15,70,39, 0, 0, 0, 7,48,37, 7,48,42, 7,48,43, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,77,92, 5,77,94,
+ 5,77,90, 0, 0, 0, 4,71,46, 7,53,34, 4,71,47, 5,81,43, 7,53,33, 7,53,36,
+ 4,71,45, 4,71,43, 5,81,44, 7,53,35, 7,53,32, 5,81,42, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,72,49,15,72,50, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,84,42, 7,53,37, 7,57,44, 5,84,45, 5,84,47, 5,84,46, 5,84,44,
+ 7,57,45, 0, 0, 0, 5,84,49, 7,57,46,15,73,90, 0, 0, 0, 0, 0, 0, 7,57,47,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,84,48, 0, 0, 0, 5,86,52, 5,86,50,
+ 5,86,53, 7,60,89, 7,60,88, 0, 0, 0, 0, 0, 0, 5,86,51, 5,86,49, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,76,11, 7,63,65, 5,88,23, 5,88,22,
+ 4,76,10, 5,88,24, 7,63,66, 7,65,47, 0, 0, 0, 7,63,67, 7,65,50, 4,77, 8,
+ 7,65,52, 7,66,71, 7,65,51, 7,65,49, 7,65,48, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,75,71, 5,90,28, 5,90,27, 5,90,29,
+ /* plane 2, page 130 */
+ 3, 252, /* first, last */
+ 7,67,86, 5,91,42, 7,68,67, 0, 0, 0, 0, 0, 0,
+ 5,91,74, 0, 0, 0,15,77, 8, 7,69,69, 0, 0, 0,15,77,19, 0, 0, 0, 6, 3,25,
+ 6, 3,26, 6, 5,53, 0, 0, 0, 5,16,50, 6,28,36, 5,16,49, 0, 0, 0, 0, 0, 0,
+ 5,21,90, 5,21,89, 5,21,88, 6,37,30, 6,37,33, 6,37,32, 6,37,34, 6,37,31,
+ 6,37,35, 6,37,36, 4,21,64, 0, 0, 0,15,24,75, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,28,69, 6,47,31, 5,28,68, 6,47,33, 6,47,30, 5,28,70,15,31,53,
+ 15,31,54,15,31,55,15,31,56, 0, 0, 0, 6,47,29, 6,47,32, 0, 0, 0, 0, 0, 0,
+ 6,56,93, 5,35,45, 6,56,90, 6,56,94, 6,57, 1,15,37,58,15,37,59,15,37,60,
+ 6,56,91, 0, 0, 0, 6,56,92, 6,57, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,42,42, 6,67, 3, 6,67, 4, 5,42,41, 6,67, 5, 6,67, 6,15,44,60,15,44,61,
+ 15,44,62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9,49, 5,49,54, 0, 0, 0, 4,46, 5,
+ 15,50,38,15,50,40, 0, 0, 0, 7, 9,48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,56,74, 4,52,17, 5,56,75, 7,20, 8, 7,28,38,15,56,20,
+ 15,56,22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,28,40, 7,28,39,
+ 7,28,37, 5,63, 1,15,60,90,15,60,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,69,16, 7,35,76,15,65, 6,15,65, 7, 0, 0, 0, 0, 0, 0, 7,42,76,
+ 7,42,77, 7,42,74, 0, 0, 0,15,68, 6,15,68, 7, 0, 0, 0, 7,42,75, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,42,73, 0, 0, 0, 0, 0, 0, 4,68,62, 7,48,45,15,70,40,
+ 15,70,41, 0, 0, 0, 7,48,46, 7,53,38, 5,81,45, 7,53,39, 7,53,40, 7,53,41,
+ 7,57,48,15,73,92, 0, 0, 0, 5,86,54, 0, 0, 0, 5,89,49, 0, 0, 0, 0, 0, 0,
+ 6,20,60, 5,11,46, 6,20,62,15,13,50,15,13,52, 0, 0, 0, 0, 0, 0, 6,28,37,
+ 0, 0, 0, 5,16,52, 6,28,39,15,18,63,15,18,64, 0, 0, 0, 0, 0, 0, 6,28,38,
+ 0, 0, 0, 5,16,51,15,18,62, 5,21,91, 6,37,46, 6,37,45, 6,37,38, 4,21,68,
+ 5,22, 2, 5,22, 1, 6,37,42, 5,21,93, 6,37,39, 6,37,44, 6,37,43, 5,21,92,
+ 5,21,94, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,24,77, 0, 0, 0, 6,37,40, 6,37,41,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,21,69, 0, 0, 0, 6,47,38, 6,47,39,
+ 5,28,80, 5,28,78, 6,47,37, 6,47,36, 6,47,34, 5,22, 3, 5,28,77, 5,28,72,
+ 5,28,75, 5,28,74, 6,47,35, 5,28,73, 5,28,81, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,28,76, 5,28,79,
+ 6,57, 3, 6,57, 8, 5,35,51, 6,57, 6, 6,57, 9, 5,35,49, 4,33,11, 5,35,50,
+ 5,35,47, 6,57, 7, 5,35,46, 0, 0, 0,15,37,61,15,37,62,15,37,63, 0, 0, 0,
+ 0, 0, 0, 6,57, 5, 0, 0, 0, 0, 0, 0, 4,33,13,
+ /* plane 2, page 131 */
+ 1, 254, /* first, last */
+ 5,35,52, 6,67,13, 6,67,15, 5,42,48, 4,39,72, 6,67, 8, 6,67,11,
+ 5,42,45, 6,67,12, 6,67, 7, 6,67,16, 0, 0, 0, 5,42,43, 5,42,46, 6,67,17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,67,14, 0, 0, 0,
+ 0, 0, 0,15,44,63,15,44,64,15,44,65,15,44,67, 5,42,47, 0, 0, 0, 5,42,44,
+ 7, 9,57, 6,67,10, 5,49,64, 7, 9,55, 7, 9,62, 7, 9,66, 7, 9,54, 5,49,57,
+ 7, 9,58, 7, 9,53, 7, 9,60, 5,49,56, 5,49,59, 5,49,62, 4,46,12, 6,67, 9,
+ 7, 9,56, 7, 9,61, 7, 9,59, 5,49,61, 5,49,63, 7, 9,50, 5,49,55, 7, 9,52,
+ 7, 9,67, 0, 0, 0, 0, 0, 0,15,50,41,15,50,42,15,50,43,15,50,44, 0, 0, 0,
+ 7, 9,51, 7, 9,63, 7, 9,64, 7, 9,65, 0, 0, 0, 5,49,60, 5,49,58, 7,20, 9,
+ 5,56,83, 7,20,15, 5,56,84, 7,20,13, 5,56,80, 7,20,11, 7,20,20, 5,56,78,
+ 5,56,81, 5,56,77, 7,20,21, 7,20,16, 7,20,22, 0, 0, 0, 5,56,76, 7,20,19,
+ 15,56,23,15,56,25,15,56,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,20,12,
+ 7,20,14, 0, 0, 0, 0, 0, 0, 7,20,10, 0, 0, 0,15,56,24, 0, 0, 0, 4,52,21,
+ 5,56,79, 7,28,42, 7,28,50, 5,63, 5, 7,28,45, 7,28,44, 7,28,43, 7,28,51,
+ 4,57,19, 7,28,48, 4,57,20, 7,28,49, 5,63, 2, 0, 0, 0, 5,63,11, 4,57,22,
+ 5,63, 8, 5,63, 7, 0, 0, 0, 7,28,52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,63, 4,
+ 5,63,10, 7,28,41,15,60,92,15,60,93, 7,28,46, 7,28,47, 0, 0, 0, 5,63, 6,
+ 5,63, 3, 5,63, 9, 4,61,89, 7,35,80, 4,62, 1, 5,69,18, 0, 0, 0, 0, 0, 0,
+ 5,69,20,15,65, 8,15,65, 9,15,65,10, 0, 0, 0, 7,35,79, 7,35,82, 0, 0, 0,
+ 7,35,81, 7,35,78, 0, 0, 0, 0, 0, 0, 7,35,77, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,69,17, 5,69,19, 0, 0, 0, 5,73,88, 7,42,78, 7,42,81, 7,42,79,
+ 7,42,80, 5,73,90, 4,65,58, 4,65,59, 5,73,89, 5,73,87, 5,73,91, 7,42,82,
+ 15,68, 8, 7,42,84, 4,68,66, 5,78, 5, 5,78, 3, 7,48,51, 5,78, 4, 5,78, 2,
+ 7,48,49, 5,78, 1, 0, 0, 0, 0, 0, 0,15,70,42, 0, 0, 0, 7,48,50, 0, 0, 0,
+ 0, 0, 0, 7,48,48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,48,47, 5,78, 6, 7,48,52,
+ 4,71,51, 5,81,46, 4,71,52, 7,53,44, 0, 0, 0, 0, 0, 0, 7,53,43, 7,53,42,
+ 0, 0, 0, 7,57,54, 4,73,48, 7,57,50, 7,57,49, 4,73,49, 7,57,55, 0, 0, 0,
+ 7,57,51, 7,57,52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,57,53, 7,60,94, 7,61, 1,
+ 5,86,55, 7,60,91, 7,60,90, 7,60,92, 7,60,93, 0, 0, 0, 5,86,57, 0, 0, 0,
+ 5,86,56, 5,88,28, 5,88,27, 5,88,26, 7,63,71, 0, 0, 0, 0, 0, 0, 7,63,69,
+ 7,63,68, 5,88,25, 7,63,70, 5,89,51, 5,89,50, 5,90,30, 5,90,31, 0, 0, 0,
+ 7,66,72, 5,90,90, 7,68,68, 0, 0, 0, 0, 0, 0, 7,66,73, 7,67,87,
+ /* plane 2, page 132 */
+ 1, 255, /* first, last */
+ 5,91,75, 7,69,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 9,11, 6,14,22, 6,28,40, 0, 0, 0, 6,37,47,
+ 5,22, 5, 5,22, 4, 0, 0, 0, 0, 0, 0, 4,33,14, 6,57,10, 0, 0, 0,15,37,65,
+ 5,42,49,15,44,69,15,44,70, 5,42,50, 7, 9,68, 7, 9,69, 7, 9,70, 5,49,66,
+ 7,20,23, 5,56,85, 7,20,24, 0, 0, 0,15,56,27, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,63,13, 5,63,12,15,60,94,15,61, 1,15,61, 2,15,61, 3, 0, 0, 0, 5,63,14,
+ 5,69,23, 5,69,22, 7,35,83, 0, 0, 0, 0, 0, 0, 7,42,85, 4,65,60, 0, 0, 0,
+ 0, 0, 0, 7,42,86, 0, 0, 0,15,70,43, 7,48,53,15,72,52, 7,57,56, 0, 0, 0,
+ 7,63,72, 7,69,39, 7,69,71, 6, 9,12, 6,14,23, 6,57,13, 6,57,12, 6,57,11,
+ 15,50,45, 7,19, 1, 4,65,61, 7,53,45, 0, 0, 0, 6, 5,57, 0, 0, 0, 6, 5,56,
+ 6, 5,55, 4, 4,94, 6, 9,13, 4, 5, 4, 6,28,41, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 9,14,15, 5,19,15, 5,20, 6,28,42, 0, 0, 0, 0, 0, 0, 6, 9,15, 0, 0, 0,
+ 5, 4,88, 6,28,43, 6,37,48, 5, 7,74, 5, 7,75, 5, 7,80, 6,14,24, 6,14,29,
+ 5, 7,79, 4, 8, 5, 5, 7,81, 5, 7,77, 4, 8, 8, 6,14,27, 0, 0, 0,15, 8,77,
+ 15, 8,79,15, 8,80,15, 8,83,15, 8,84,15, 8,85, 6,14,26, 0, 0, 0, 6,14,31,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7,78, 5, 7,72, 6,14,28, 5, 7,76,
+ 6,14,25, 6,14,30, 0, 0, 0, 5,11,47, 5,11,54, 5,11,50, 6,20,63, 5,11,49,
+ 6,20,66, 5,11,53, 5,11,51, 4,11,47, 4,11,49, 5,11,48, 6,20,68, 6,20,67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,13,53,15,13,54,15,13,55,15,13,56,15,13,57,
+ 0, 0, 0, 0, 0, 0, 4,11,50, 6,20,69, 0, 0, 0, 6,20,65, 0, 0, 0, 0, 0, 0,
+ 6,42,39, 0, 0, 0, 5,11,55, 5,11,52, 6,28,52, 6,28,56, 5,16,59, 6,28,51,
+ 5,16,54, 5,16,58, 4,16,17, 5,16,55, 5,16,57, 6,28,50, 6,28,44, 6,28,54,
+ 4,16,18, 0, 0, 0, 6,28,55, 6,28,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,35,53, 6,28,53, 5,16,56, 6,28,48,
+ 6,28,46, 5,16,60, 5,22, 7, 5,22, 6, 6,28,47, 6,37,59, 0, 0, 0, 5,22,12,
+ 4,21,74, 6,37,60, 5,22,11, 6,28,49, 0, 0, 0, 5,22, 9, 6,37,55, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,37,58,15,24,80,15,24,81,15,24,82, 6,37,54, 6,37,52,
+ 6,37,53, 6,37,50, 0, 0, 0, 6,37,61, 0, 0, 0, 6,37,56, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,37,51, 5,22,10, 4,21,71, 6,37,57,
+ 5,22,13, 5,22, 8,15,24,79, 6,37,49, 5,28,86, 5,28,82, 5,28,88, 5,28,87,
+ 4,27,54, 6,47,51, 4,27,58, 4,27,56, 5,28,89, 6,47,50, 7, 9,71, 6,47,45,
+ 6,47,44, 6,47,48, 6,47,47, 4,27,59, 0, 0, 0, 6,47,41, 6,47,43,15,31,66,
+ /* plane 2, page 133 */
+ 0, 253, /* first, last */
+ 6,47,49, 0, 0, 0, 0, 0, 0, 6,47,52, 0, 0, 0, 6,47,53, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,47,42, 0, 0, 0, 0, 0, 0,15,31,57,15,31,58,
+ 15,31,59,15,31,60,15,31,61,15,31,63,15,31,64,15,31,65, 5,28,85, 6,47,46,
+ 0, 0, 0, 5,28,84, 5,28,83, 4,27,57, 6,47,54, 6,57,32, 6,57,20, 6,57,29,
+ 0, 0, 0, 6,57,16, 4,33,17, 4,33,16, 6,57,14, 0, 0, 0, 5,35,57, 6,57,17,
+ 6,57,33, 6,57,27, 6,57,31, 6,57,23, 6,57,21, 6,57,35, 6,57,34, 5,28,90,
+ 4,33,18, 6,57,19, 6,57,30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,37,66,15,37,67,15,37,68,15,37,69,15,37,70,15,37,71,15,37,72,
+ 15,37,73,15,37,74,15,37,75,15,37,76, 0, 0, 0, 6,57,18, 0, 0, 0, 6,57,22,
+ 6,57,28, 6,57,25, 0, 0, 0, 6,57,24, 6,57,26, 0, 0, 0, 6,57,15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,35,56, 5,35,55, 5,35,54, 6,67,21, 6,67,20, 6,67,23,
+ 6,67,18, 6,67,26, 5,42,52, 6,67,22, 6,67,24, 6,67,28, 5,42,51, 5,42,54,
+ 6,67,19, 6,67,27, 7,28,53, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,44,73,15,44,74,
+ 15,44,76,15,44,77,15,44,78,15,44,79,15,44,80,15,44,81,15,44,82, 0, 0, 0,
+ 6,67,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,28,54, 7,28,55, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,28,56, 0, 0, 0, 5,42,53, 0, 0, 0, 0, 0, 0, 7, 9,78, 7, 9,76,
+ 7, 9,82, 7, 9,73, 7, 9,75, 4,46,15, 5,49,68, 4,46,16, 5,49,72, 5,49,69,
+ 4,46,20, 0, 0, 0, 0, 0, 0, 7, 9,80,15,50,46,15,50,47,15,50,48,15,50,49,
+ 15,50,50, 5,49,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9,74, 7, 9,79, 7, 9,84,
+ 7, 9,85, 7, 9,81, 0, 0, 0, 7, 9,83, 7,35,84, 7, 9,72, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,35,85, 7, 9,77, 5,49,73, 5,49,71, 5,49,76, 5,49,70,
+ 5,49,74, 5,49,75, 0, 0, 0, 5,49,67, 7,20,38, 5,56,92, 5,56,91, 5,56,89,
+ 7,20,33, 5,56,87, 7,20,37, 7,20,30, 7,20,39, 0, 0, 0, 4,52,22, 7,20,34,
+ 7,20,36, 7,20,25, 7,20,42, 7,42,87, 7,20,28, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,20,32, 7,20,44,15,56,28,15,56,29,15,56,30,
+ 7,20,29, 0, 0, 0,15,56,31, 7,12,58, 7,20,40, 7,20,27, 0, 0, 0, 7,20,26,
+ 7,20,35, 7,20,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,56,88, 5,56,93,
+ 0, 0, 0, 5,56,90, 7,20,31, 5,56,86, 0, 0, 0, 5,63,15, 4,57,26, 7,28,64,
+ 5,63,19, 7,28,61, 5,63,20, 7,28,59, 7,48,55, 7,20,41, 7,28,66, 7,28,62,
+ 5,63,18, 5,63,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,61, 4,15,61, 6,
+ 15,61, 7,15,61, 8, 7,28,57, 7,28,60, 7,28,63, 7,28,67,
+ /* plane 2, page 134 */
+ 0, 255, /* first, last */
+ 15,61, 5, 5,63,22, 5,63,23, 5,63,17, 5,63,16, 7,28,58, 0, 0, 0, 5,69,29,
+ 7,35,92, 4,62, 2, 7,35,90, 0, 0, 0, 5,69,26, 7,35,88,15,65,11,15,65,12,
+ 15,65,13, 7,36, 1, 0, 0, 0, 7,35,94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,69,25, 7,35,93, 7,35,86, 7,35,89, 5,69,28, 5,69,27, 5,69,24,
+ 7,35,91, 7,43, 1, 7,43, 2, 7,42,94, 0, 0, 0, 0, 0, 0,15,68,10,15,68,11,
+ 15,68,13,15,68,14, 7,42,89, 7,42,90, 7,42,93, 7,42,91, 7,42,92, 0, 0, 0,
+ 7,42,88, 0, 0, 0, 5,74, 1, 0, 0, 0, 0, 0, 0, 5,73,94,15,68,12, 7,48,58,
+ 5,78, 9, 7,48,57, 0, 0, 0, 0, 0, 0, 5,78, 7,15,70,44, 0, 0, 0, 7,48,56,
+ 5,78, 8, 7,61, 2, 4,71,53, 7,53,47, 5,81,49, 7,53,48, 7,53,46,15,72,53,
+ 15,72,54,15,72,55,15,72,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,81,47, 5,81,48,
+ 5,73,93, 7,53,49, 5,81,50, 5,84,50, 4,75, 5, 7,57,59, 0, 0, 0, 7,57,58,
+ 7,57,57, 7,61, 3, 7,61, 5, 0, 0, 0, 7,61, 4, 0, 0, 0, 7,66,74, 7,63,74,
+ 7,63,73, 0, 0, 0, 0, 0, 0, 5,88,29, 7,65,53, 0, 0, 0, 7,66,75, 7,69,72,
+ 6, 9,16, 5, 1,92, 0, 0, 0, 5, 3,12, 0, 0, 0, 5, 3,11, 5, 3,13, 5, 3,10,
+ 4, 3,17, 6, 5,58, 6, 5,60, 0, 0, 0, 0, 0, 0, 4, 3,19, 4, 5, 7, 5, 4,89,
+ 4, 5, 6, 4, 5, 8, 4, 5, 5, 6, 9,19, 4, 5,10, 5, 4,90, 4,21,81, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 9,18,15, 5,21,15, 5,22,15, 5,23,15,24,83,15,24,85,
+ 0, 0, 0, 6,37,65, 6,37,63, 6,37,64, 0, 0, 0, 6, 9,17, 0, 0, 0, 4, 5, 9,
+ 0, 0, 0, 4, 8,14, 6,37,62, 4, 8,10, 4, 8,13, 4, 8,12, 6,20,73, 4, 8,15,
+ 5, 7,82, 5, 7,83, 6,47,56, 6,14,35,15, 8,86,15, 8,88,15, 8,89,15, 8,92,
+ 6,47,58, 0, 0, 0, 6,14,33, 0, 0, 0, 0, 0, 0, 6,14,34, 0, 0, 0, 0, 0, 0,
+ 6,14,32, 0, 0, 0,15, 8,87,15, 8,91, 6,47,55, 6,47,57, 5, 7,84, 5,11,58,
+ 5,11,57, 5,11,56, 4,11,55, 4,11,53, 5,11,63, 4,33,19, 5,11,59, 0, 0, 0,
+ 0, 0, 0,15,13,58,15,37,78, 6,57,37, 6,57,36, 6,57,38, 0, 0, 0, 6,20,76,
+ 0, 0, 0, 6,20,70, 0, 0, 0, 6,20,71, 6,20,72, 0, 0, 0, 6,20,75, 6,20,74,
+ 5,11,62, 5,11,60, 5,11,61, 5,16,65, 5,16,61, 4,16,22, 6,28,59, 5,16,69,
+ 5,16,70, 5,16,62, 5,16,67, 5,16,63, 4,16,21, 6,28,61, 4,16,23, 0, 0, 0,
+ 0, 0, 0, 6,28,63, 6,67,29, 6,67,31, 6,67,32, 0, 0, 0, 6,28,60, 6,28,62,
+ 6,28,58, 5,16,66, 0, 0, 0, 5,16,68, 5,16,64, 5,16,71, 6,67,30, 6,28,57,
+ 15,18,66,15,18,67,15,18,68, 5,49,78, 4,46,22, 4,21,79, 5,22,17, 5,22,16,
+ 5,22,21, 5,22,14, 0, 0, 0, 5,22,18, 4,21,77, 6,37,70, 5,22,20, 7, 9,90,
+ 7, 9,89, 0, 0, 0, 0, 0, 0, 6,37,72,15,18,65,15,24,86,15,50,52, 7, 9,86,
+ /* plane 2, page 135 */
+ 0, 255, /* first, last */
+ 7, 9,87, 7, 9,91, 7, 9,88, 6,37,67, 0, 0, 0, 6,37,69, 6,37,68, 0, 0, 0,
+ 6,37,66, 0, 0, 0,15,19,28, 6,37,71, 5,22,15, 5,22,19, 5,16,72, 4,27,63,
+ 5,29, 3, 5,28,94, 5,29, 2, 4,27,61, 5,29, 4, 6,47,68, 5,29, 1, 5,35,71,
+ 5,28,93, 5,28,92, 6,47,66, 6,47,59, 4,27,60, 0, 0, 0, 0, 0, 0,15,31,67,
+ 15,31,68,15,31,69,15,56,33, 7,20,46, 6,47,61, 6,47,60, 6,47,62, 6,47,63,
+ 6,47,64, 0, 0, 0, 6,47,65, 0, 0, 0, 0, 0, 0,15,31,70, 6,47,67, 7,20,45,
+ 5,28,91, 0, 0, 0, 7,28,68, 5,35,59, 5,35,64, 5,35,67, 5,35,62, 5,35,61,
+ 4,33,21, 6,67,33, 5,35,60, 5,35,66, 5,35,63, 5,35,68, 5,35,70, 4,33,23,
+ 5,35,69, 6,57,41, 0, 0, 0, 5,35,58,15,37,79, 0, 0, 0, 0, 0, 0, 6,57,40,
+ 0, 0, 0, 6,57,43, 5,35,65, 4,39,79, 5,42,61, 5,42,60, 5,42,57, 5,42,56,
+ 5,42,67, 5,42,63, 0, 0, 0, 5,42,59, 6,67,38, 6,67,35, 0, 0, 0, 6,67,34,
+ 5,42,65, 0, 0, 0, 0, 0, 0, 5,42,66, 0, 0, 0, 7,36, 2, 7,36, 4, 7,36, 3,
+ 7,36, 5, 6,67,37, 5,42,55, 4,39,82, 0, 0, 0, 6,67,36, 5,69,30, 5,42,58,
+ 5,42,62, 0, 0, 0, 5,42,68, 4,46,24, 7,43, 3, 5,49,82, 7,10, 1, 4,46,23,
+ 5,49,83, 4,46,25, 0, 0, 0, 5,57, 8, 5,49,79, 5,49,80, 7, 9,94, 7,10, 2,
+ 4,46,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,50,51,15,50,53,15,50,54,
+ 7,43, 6, 7,43, 4, 7,10, 3, 7,10, 5, 7,10, 6, 7,10, 4, 0, 0, 0, 7, 9,92,
+ 0, 0, 0, 7, 9,93, 0, 0, 0, 0, 0, 0, 5,49,84, 7,20,48, 5,49,81, 7,43, 5,
+ 0, 0, 0, 5,78,10, 5,57, 5, 5,57, 6, 7,48,60, 4,52,24, 7,20,47, 5,57, 1,
+ 5,57, 4, 7,20,50, 5,57, 2, 5,57, 3, 4,52,25, 0, 0, 0, 7,20,49,15,56,32,
+ 7,48,61, 7,48,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,78,11, 7,28,69,
+ 7,28,73, 5,63,24, 4,57,27, 5,63,25, 0, 0, 0, 0, 0, 0, 7,53,50, 7,53,51,
+ 7,53,52, 7,28,71, 0, 0, 0, 7,28,74, 0, 0, 0, 7,28,70, 5,63,27, 5,63,26,
+ 7,53,53, 7,28,72, 5,69,32, 7,36, 6, 7,36, 7, 5,69,33, 5,74, 5, 5,69,36,
+ 7,36, 9, 7,36, 8, 5,69,34, 5,69,35, 7,57,60, 5,69,31, 0, 0, 0, 0, 0, 0,
+ 7,36,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,43, 8, 7,36,11, 5,74, 4,
+ 7,43, 7, 5,74, 3, 0, 0, 0, 0, 0, 0, 7,43,10, 7,43, 9, 4,65,64, 5,57, 7,
+ 5,74, 2, 4,68,68, 5,78,12, 7,48,63, 7,48,65, 0, 0, 0, 7,48,62, 7,48,64,
+ 4,71,54,15,72,57, 7,53,54, 7,53,55, 7,57,61, 0, 0, 0, 7,53,56,15,72,58,
+ 7,61, 6, 0, 0, 0, 0, 0, 0, 7,63,75, 7,63,76, 0, 0, 0, 5,91,43, 7,67,88,
+ 4,16,25,15,18,69, 6,28,64, 0, 0, 0, 5,22,24, 5,22,23, 6,37,82, 6,37,78,
+ 5,22,25, 4,21,86, 6,37,76, 6,37,83, 6,37,73, 4,21,87, 5,22,26, 6,37,80,
+ /* plane 2, page 136 */
+ 0, 255, /* first, last */
+ 6,37,79, 6,37,74, 6,37,75, 0, 0, 0, 0, 0, 0,15,24,87, 6,37,81, 4,21,89,
+ 6,37,77, 0, 0, 0, 6,37,84, 6,47,75, 5,29, 5, 5,29, 6, 4,27,69, 6,47,73,
+ 5,35,74, 4,27,66, 4,27,67, 6,47,74, 6,47,70, 6,47,69, 4,27,65, 6,47,71,
+ 6,47,72, 0, 0, 0, 0, 0, 0,15,31,72,15,31,73,15,31,74,15,31,75, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,47,76, 0, 0, 0, 5,35,73, 5,35,76, 5,35,72, 6,57,46,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,57,45, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,35,75, 6,67,42,
+ 5,42,70, 5,42,69,15,44,83,15,44,84,15,44,85,15,44,87, 6,67,41, 0, 0, 0,
+ 0, 0, 0, 6,67,40,15,44,88, 0, 0, 0, 0, 0, 0, 6,67,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10, 8, 5,49,88, 7,10,12, 5,49,89, 5,49,85,
+ 7,10,16, 5,49,86, 0, 0, 0, 7,10,15, 7,10,14, 7,10,13, 7,10, 9, 7,10, 7,
+ 5,49,87, 0, 0, 0,15,44,86,15,50,56,15,50,57, 7,10,10, 0, 0, 0, 0, 0, 0,
+ 7,10,11, 0, 0, 0, 7,10,18, 7,10,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,20,54, 7,20,53, 5,57, 9, 7,20,56, 5,57,12, 7,20,58, 4,52,33,
+ 7,20,63, 4,52,30, 4,52,31, 7,20,62, 5,57,10, 7,20,55, 7,20,61, 7,20,60,
+ 5,57,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,56,34,15,56,35, 0, 0, 0,
+ 7,20,57, 7,20,59, 0, 0, 0, 7,20,51, 7,20,64, 5,63,33, 5,63,31, 5,63,32,
+ 5,63,35, 4,57,32, 7,28,76, 5,63,34, 4,57,30, 7,28,78, 5,63,30, 7,28,84,
+ 5,63,36, 7,28,77, 7,28,83, 0, 0, 0,15,61,10,15,61,11,15,61,12, 0, 0, 0,
+ 0, 0, 0, 7,28,79, 7,28,81, 7,28,82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,63,29, 5,69,38, 5,69,39, 5,69,41, 7,36,19, 7,36,15, 4,62, 3, 7,36,12,
+ 5,69,40, 4,62, 6, 5,69,42, 7,28,85, 4,62, 5, 7,36,18, 0, 0, 0, 5,69,43,
+ 7,36,21, 7,36,22, 7,36,13,15,65,14, 0, 0, 0, 7,36,17, 7,36,14, 0, 0, 0,
+ 0, 0, 0, 5,69,44, 7,36,16, 0, 0, 0, 0, 0, 0, 7,43,15, 7,43,12, 5,74,14,
+ 5,74,11, 5,74, 7, 5,74,10, 5,74, 9, 5,74,15, 5,74,12, 5,74, 8, 5,74,13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,43,13, 0, 0, 0, 0, 0, 0, 7,43,14, 0, 0, 0,
+ 7,43,16, 7,43,11, 0, 0, 0, 7,36,20, 5,74,16, 5,74, 6, 7,48,66, 5,78,17,
+ 5,78,14, 5,78,15, 5,78,13, 5,78,16, 7,48,67, 7,48,68, 0, 0, 0,15,70,46,
+ 7,48,69, 7,48,71, 0, 0, 0, 7,48,70, 0, 0, 0, 0, 0, 0, 4,71,57, 4,71,55,
+ 4,71,56, 5,81,51, 7,53,58,15,72,59, 0, 0, 0, 7,53,57, 7,57,62, 7,57,63,
+ 7,57,66, 5,84,51, 7,57,65, 7,57,64,15,73,93, 0, 0, 0, 7,61, 7, 7,61, 9,
+ 5,86,58, 7,61,11, 7,61,10, 5,86,59, 7,61, 8,15,74,90, 5,88,31, 4,76,15,
+ /* plane 2, page 137 */
+ 0, 255, /* first, last */
+ 7,63,77, 7,63,78, 5,88,30, 0, 0, 0, 0, 0, 0, 7,66,76, 0, 0, 0, 5,90,91,
+ 7,67,90, 7,67,89, 7,68,70, 0, 0, 0, 7,68,69, 7,69,88, 7,69,89, 6,20,78,
+ 5,29, 7, 5,22,27, 6,67,43, 6,67,44, 0, 0, 0, 5,49,90, 7,10,20, 7,10,19,
+ 5,57,13, 7,20,65, 5,63,37,15,61,13, 0, 0, 0, 7,36,23,15,70,47, 0, 0, 0,
+ 15,72,60, 5,84,52, 5,22,28, 6,28,65, 0, 0, 0, 6,37,85, 6,47,78, 0, 0, 0,
+ 5,29, 9, 5,29, 8,15,37,80, 0, 0, 0, 6,67,45, 7,10,21, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,63,38, 0, 0, 0,15,65,15, 5,69,45,
+ 15,72,61, 5,81,52, 7,53,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,28,68,15,18,70,
+ 6,28,66, 0, 0, 0, 5,22,29, 6,37,86, 6,37,87, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,24,88, 6,47,83, 6,47,84, 6,47,85, 6,47,81, 6,47,82, 6,47,88,
+ 6,47,86, 6,47,80, 6,47,89,15,31,76,15,31,77,15,31,78,15,31,79,15,31,82,
+ 15,31,84,15,31,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6,47,87, 0, 0, 0,15,31,80, 4,33,39, 5,35,78, 4,33,37,
+ 4,33,36, 6,57,51, 6,57,47, 0, 0, 0, 0, 0, 0,15,37,81,15,37,85,15,37,86,
+ 15,37,87,15,37,88, 6,57,53, 6,57,49, 0, 0, 0, 6,57,50,15,37,89, 0, 0, 0,
+ 0, 0, 0, 6,57,52, 0, 0, 0, 6,57,48, 0, 0, 0, 0, 0, 0,15,37,84, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,42,71, 0, 0, 0, 5,42,72, 6,67,50, 5,42,73, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,44,72,15,44,89,15,44,91,15,44,92,15,44,93,15,45, 1,
+ 15,45, 3,15,45, 4,15,45, 5,15,45, 8,15,45, 9, 0, 0, 0, 6,67,46, 0, 0, 0,
+ 0, 0, 0, 4,39,90, 0, 0, 0, 0, 0, 0, 6,67,48, 6,67,49,15,45,10, 6,67,52,
+ 15,44,90, 0, 0, 0, 0, 0, 0, 6,67,53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,45,11, 0, 0, 0,15,45, 6,15,44,94, 7,10,26, 4,46,34, 5,49,94, 7,10,33,
+ 7,10,27, 7,10,32, 7,10,25, 5,49,93, 7,10,35, 0, 0, 0, 0, 0, 0, 7,10,36,
+ 7,10,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,49,91, 7,10,23,
+ 0, 0, 0,15,50,59,15,50,61,15,50,63,15,50,64,15,50,67,15,50,68,15,50,69,
+ 15,50,71,15,50,72,15,50,73,15,50,74,15,50,76,15,50,77, 7,10,34, 7,10,28,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,31, 0, 0, 0, 7,10,37,15,50,62, 0, 0, 0,
+ 0, 0, 0, 7,10,22, 0, 0, 0, 5,49,92,15,50,66, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,50,70, 0, 0, 0, 0, 0, 0,15,50,58, 5,57,20, 5,57,23, 5,57,18,
+ 4,52,39, 5,57,14, 5,57,16, 7,20,69, 7,20,68, 7,20,75, 7,20,73, 7,20,71,
+ 5,57,22, 4,52,36, 7,20,66, 7,20,74, 7,20,72, 5,57,15, 7,20,70, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,50,60, 5,57,19,15,56,36,
+ /* plane 2, page 138 */
+ 0, 253, /* first, last */
+ 15,56,38,15,56,39,15,56,41,15,56,42,15,56,43,15,56,45,15,56,46,15,56,47,
+ 15,56,49,15,56,51,15,56,52,15,56,54,15,56,55,15,56,58,15,56,60, 0, 0, 0,
+ 15,56,61,15,56,62,15,56,64,15,56,65,15,56,67,15,56,68,15,56,48,15,56,50,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,56,63, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,56,37, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,56,56, 0, 0, 0, 0, 0, 0, 5,57,24, 0, 0, 0, 5,57,17, 5,63,40,
+ 5,63,41, 7,28,89, 4,57,35, 5,63,44, 5,63,43, 7,28,92, 5,57,21, 5,63,39,
+ 7,28,90, 5,63,42, 5,63,47, 7,28,94, 7,29, 4, 7,29, 1, 7,29, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,61,15,15,61,16,15,61,20,15,61,21,
+ 15,61,22,15,61,23,15,61,26,15,61,27,15,61,28,15,61,29,15,61,31,15,61,32,
+ 15,61,34, 0, 0, 0, 0, 0, 0,15,61,35,15,61,36,15,61,37,15,61,38,15,61,39,
+ 15,61,40,15,61,41,15,61,43,15,61,46,15,61,47, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,28,93, 0, 0, 0, 0, 0, 0, 7,29, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,28,88, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,29, 3, 4,57,40, 0, 0, 0,15,61,42, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,61,24,15,61,19,15,61,17, 5,63,46, 5,63,45,15,61,14, 5,69,49,
+ 4,62,13, 4,62,14, 5,69,50, 4,62, 8, 4,62,10, 7,36,24, 5,69,48, 5,69,46,
+ 5,74,17, 7,36,26, 5,69,51, 4,62,16, 7,36,32, 0, 0, 0, 7,36,31, 5,69,52,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,69,53,
+ 7,36,33,15,65,17,15,65,18,15,65,20,15,65,22,15,65,23,15,65,24,15,65,26,
+ 15,65,28,15,65,29,15,65,30,15,65,32,15,65,33,15,65,34,15,65,36,15,65,37,
+ 15,65,38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,36,27, 7,36,28,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,36,30, 7,36,29, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,65,16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,65,25,15,65,21, 0, 0, 0,15,63,61, 4,65,75,
+ 7,43,19, 7,43,23, 5,74,18, 7,43,20, 5,74,20, 7,43,18, 7,43,26, 0, 0, 0,
+ 7,43,22, 7,43,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,43,27,15,68,17,
+ 15,68,18,15,68,19,15,68,21,15,68,22,15,68,24,15,68,25,15,68,26,15,68,27,
+ 15,68,28,15,68,29,15,68,31,15,68,32,15,68,33,15,68,34,15,68,35,15,68,36,
+ 15,68,37, 7,43,28, 0, 0, 0, 7,43,21, 0, 0, 0, 7,43,24,
+ /* plane 2, page 139 */
+ 3, 254, /* first, last */
+ 4,65,74, 7,43,17, 5,69,54, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,68,30, 4,68,72, 7,48,77, 7,48,78,
+ 5,78,24, 7,48,82, 5,78,19, 4,68,74, 5,78,22, 0, 0, 0, 5,78,18, 7,48,80,
+ 7,48,72, 7,48,73, 5,78,23, 4,68,78, 0, 0, 0, 7,48,81, 0, 0, 0, 5,78,20,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,70,48,15,70,49,15,70,51,15,70,52,15,70,53,
+ 15,70,54,15,70,56,15,70,57, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,70,58,15,70,59,
+ 15,70,61,15,70,63,15,70,64,15,70,65,15,70,66,15,70,67,15,70,68,15,70,70,
+ 15,70,72,15,70,74,15,70,75,15,70,76,15,70,77,15,70,78,15,70,79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,48,76, 0, 0, 0, 0, 0, 0, 7,48,79,
+ 0, 0, 0,15,70,50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,70,60, 0, 0, 0,
+ 15,70,71, 0, 0, 0, 0, 0, 0, 7,48,74, 0, 0, 0, 7,53,66, 4,71,62, 7,53,71,
+ 7,53,65, 7,53,60, 4,71,64, 4,71,61, 7,53,64, 7,53,67, 7,53,73, 7,53,62,
+ 0, 0, 0, 0, 0, 0,15,72,62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,72,63,
+ 15,72,64,15,72,65,15,72,66,15,72,67, 0, 0, 0,15,72,68,15,72,69,15,72,70,
+ 15,72,71,15,72,72,15,72,73,15,72,75,15,72,76,15,72,77,15,72,78,15,72,79,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,53,63, 0, 0, 0, 7,53,68, 0, 0, 0,
+ 7,53,69, 0, 0, 0, 0, 0, 0, 7,53,70, 7,53,61, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,72,74,
+ 0, 0, 0, 0, 0, 0, 5,84,55, 7,57,75, 7,57,74, 7,61,16, 0, 0, 0, 7,57,70,
+ 0, 0, 0, 0, 0, 0, 7,57,68,15,73,94, 0, 0, 0, 0, 0, 0,15,74, 1,15,74, 2,
+ 15,74, 3,15,74, 4,15,74, 5,15,74, 6,15,74, 7,15,74, 8,15,74, 9,15,74,10,
+ 15,74,11, 0, 0, 0, 0, 0, 0, 7,57,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,57,69,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,84,54,
+ 5,86,62, 4,75, 8, 0, 0, 0, 5,86,60,15,75,15, 7,61,15, 7,61,13, 7,57,73,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,61,12, 0, 0, 0,15,74,92,15,74,93,
+ 15,75, 3,15,75, 4,15,75, 5,15,75, 6,15,75, 9,15,75,10,15,75,11,15,75,12,
+ 15,75,13,15,75,14, 7,61,14, 0, 0, 0, 7,61,17, 0, 0, 0, 0, 0, 0,15,75, 1,
+ 0, 0, 0,15,74,94,15,75, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,88,32, 7,63,80,
+ 7,63,81, 7,63,82, 7,63,79, 7,63,83, 0, 0, 0, 0, 0, 0,15,75,72, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,75,73,15,75,74,15,75,75,
+ 15,75,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,77,67, 7,65,55, 7,65,56, 0, 0, 0,15,75,77,
+ /* plane 2, page 140 */
+ 0, 255, /* first, last */
+ 15,76,28,15,76,29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,65,54, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,66,82, 7,66,77, 7,66,78, 7,66,84, 7,66,80, 7,66,79, 5,90,32,
+ 7,66,83, 7,66,81, 7,66,85, 0, 0, 0,15,76,50,15,76,51,15,76,52,15,76,53,
+ 15,76,54,15,76,55,15,76,56, 0, 0, 0,15,76,32, 5,90,33, 5,90,92, 7,67,93,
+ 7,67,91, 0, 0, 0,15,76,79, 0, 0, 0, 7,67,92, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,77, 3, 7,68,72, 0, 0, 0, 0, 0, 0,15,77, 1, 0, 0, 0, 7,68,71, 7,68,73,
+ 15,77, 2,15,76,30, 7,69,40, 7,69,41, 0, 0, 0, 0, 0, 0,15,77, 9, 0, 0, 0,
+ 5,92, 1, 0, 0, 0, 0, 0, 0,15,77,21,15,77,24,15,77,25, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,14,36,
+ 6, 9,20, 5,11,64, 5,22,31, 6,37,91, 5,22,30, 5,22,32, 6,37,90,15,24,89,
+ 0, 0, 0, 0, 0, 0, 6,37,89, 0, 0, 0, 6,37,88, 5,29,10, 5,29,11, 4,27,72,
+ 6,47,90, 6,47,91, 0, 0, 0,15,31,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,57,57, 6,57,56, 4,33,42, 6,57,54, 6,57,55,
+ 0, 0, 0,15,37,90, 5,35,80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,35,79,
+ 5,42,74, 4,39,92, 6,67,54, 6,67,55, 0, 0, 0, 0, 0, 0, 5,42,75, 5,50, 1,
+ 5,50, 3, 5,57,25, 5,50, 2, 5,50, 4, 5,50, 5,15,56,69, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,57,27, 7,20,78, 5,57,26, 0, 0, 0, 7,29, 6,
+ 7,20,77, 0, 0, 0, 7,20,80, 7,20,76, 0, 0, 0, 7,29, 9, 4,57,42, 5,63,48,
+ 4,57,43, 7,29,10, 7,29, 8, 0, 0, 0, 0, 0, 0, 7,29, 7, 7,36,35, 5,69,56,
+ 7,36,34, 5,69,55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,74,24, 5,74,22, 5,74,21,
+ 0, 0, 0, 0, 0, 0, 5,74,23, 5,78,25, 7,48,83, 0, 0, 0, 7,48,84, 0, 0, 0,
+ 4,71,68, 0, 0, 0, 7,53,74, 7,57,77, 7,57,78, 0, 0, 0, 7,57,76, 0, 0, 0,
+ 5,86,65, 5,86,64, 5,88,33, 7,63,84, 7,66,86, 7,68,74, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,11,65, 5,16,74, 5,16,75, 5,16,73, 0, 0, 0,15,18,71, 6,28,70,
+ 5,22,34, 5,22,33, 0, 0, 0,15,24,90, 0, 0, 0,15,24,91, 6,37,92, 5,29,19,
+ 5,29,17, 5,29,15, 4,27,74, 5,29,16, 4,27,76, 3,31,77, 5,29,12, 5,29,13,
+ 5,29,14, 6,47,94, 6,48, 1, 5,29,18, 0, 0, 0, 6,47,92, 0, 0, 0,15,31,88,
+ 15,31,89,15,31,90,15,31,91,15,31,92,15,31,93,15,32, 1, 0, 0, 0, 0, 0, 0,
+ 6,47,93, 0, 0, 0, 4,27,73, 4,33,44, 6,57,62, 4,33,50, 4,33,45, 4,33,43,
+ 15,37,94, 6,57,61, 5,35,84, 5,35,81, 5,35,83, 5,35,82, 6,57,59, 4,33,49,
+ /* plane 2, page 141 */
+ 0, 252, /* first, last */
+ 4,33,47, 6,57,60, 6,57,58, 0, 0, 0,15,37,93,15,38, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,42,83, 5,42,79, 5,42,81,
+ 4,39,94, 5,42,77, 4,40, 1, 5,42,84, 6,67,58, 5,42,80, 5,42,85, 4,39,93,
+ 5,42,82, 5,42,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,67,57, 0, 0, 0, 6,67,59,
+ 6,67,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,42,76, 0, 0, 0, 0, 0, 0,
+ 7,10,40, 5,50,13, 5,50, 8, 7,10,45, 5,50,10, 5,50, 7, 7,10,46, 4,46,41,
+ 5,50,12, 5,50, 9, 0, 0, 0, 7,10,44, 0, 0, 0,15,50,78,15,50,79,15,50,81,
+ 7,10,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,41,
+ 7,10,42, 7,10,43, 0, 0, 0, 0, 0, 0, 5,50, 6, 5,50,11, 5,50,14,15,50,80,
+ 4,52,48, 4,52,45, 5,57,29, 5,57,32, 7,20,82, 5,57,28, 0, 0, 0, 5,57,30,
+ 5,57,31, 7,20,85, 7,20,87, 7,20,89,15,56,70,15,56,71,15,56,72, 7,20,84,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,20,88, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,20,86, 0, 0, 0, 4,52,46, 4,57,51, 4,57,49, 5,63,52,
+ 7,29,11, 5,63,49, 5,63,51, 5,63,53, 5,63,50, 7,29,13, 4,57,48, 7,29,12,
+ 4,57,44, 0, 0, 0, 7,29,14,15,61,48, 0, 0, 0, 7,29,15, 0, 0, 0, 7,29,16,
+ 0, 0, 0, 7,29,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,69,63, 5,69,62, 5,69,58, 4,62,19, 7,36,36, 5,69,59, 5,69,65, 5,69,64,
+ 7,36,38, 5,69,61, 5,69,57, 5,69,60,15,65,39,15,65,40,15,65,41,15,65,44,
+ 0, 0, 0, 0, 0, 0,15,65,43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,36,37, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,36,39, 0, 0, 0, 5,74,25, 7,43,30, 7,43,31, 4,65,77,
+ 5,74,26, 7,43,29, 4,65,78,15,68,38,15,68,39,15,68,40,15,68,41,15,68,42,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,68,80, 5,78,31, 5,78,26, 5,78,29,
+ 5,78,28, 5,78,30, 5,78,32, 4,68,82, 7,48,88, 0, 0, 0, 5,74,27, 7,48,85,
+ 15,70,80,15,70,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,48,86, 0, 0, 0,
+ 0, 0, 0, 5,78,27, 7,48,87, 5,81,58, 5,78,33, 4,71,69, 5,81,57, 5,81,55,
+ 0, 0, 0,15,72,80,15,72,81,15,72,83,15,72,84,15,72,85, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,81,60, 5,81,56, 5,84,56, 7,53,75, 0, 0, 0,15,74,15,
+ 0, 0, 0, 7,57,79, 0, 0, 0,15,74,12,15,74,13,15,74,14,15,74,16,15,74,17,
+ 0, 0, 0,15,75,16,15,75,17,15,75,18, 7,61,18, 0, 0, 0, 5,88,34,15,75,78,
+ 15,75,79, 0, 0, 0, 7,63,86, 7,63,85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,89,52, 4,77, 9, 4,77,10, 7,65,57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,66,87,
+ 7,66,88, 0, 0, 0, 0, 0, 0, 5,90,93,15,77,10,
+ /* plane 2, page 142 */
+ 15, 255, /* first, last */
+ 6,14,37,
+ 5, 2, 2, 5, 1,94, 4, 2, 3, 5, 2, 3, 4, 2, 2, 5, 2, 1, 5, 3,14, 4, 3,20,
+ 6, 5,61, 0, 0, 0, 5, 4,93, 4, 5,12, 4, 5,13, 5, 4,94, 5, 4,92, 0, 0, 0,
+ 15, 5,26,15, 5,27,15, 5,28,15, 5,29,15, 5,30, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15, 5,31, 0, 0, 0, 5, 7,85, 6,14,39, 5, 7,86, 5, 7,88, 5, 7,89,
+ 4, 8,16, 5, 7,87, 6,14,38, 6,14,40, 0, 0, 0,15, 8,93, 0, 0, 0, 0, 0, 0,
+ 15, 8,94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,11,66, 6,20,80, 6,20,83, 4,11,60, 5,11,69, 6,20,81, 6,67,61,
+ 6,20,85, 6,20,86, 6,20,87, 6,20,82, 5,11,67, 0, 0, 0, 6,20,88,15,13,59,
+ 15,13,60,15,13,61, 0, 0, 0, 6,20,84, 0, 0, 0, 6,20,79, 0, 0, 0, 0, 0, 0,
+ 6,28,73, 5,16,79, 5,11,70, 6,28,72, 5,16,76, 5,16,78, 6,28,78, 6,28,75,
+ 6,28,79, 5,16,77, 6,28,74, 6,28,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,28,76,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,18,72,15,18,73,15,18,74,
+ 15,18,75,15,18,76,15,18,77,15,18,78, 0, 0, 0, 5,22,35, 6,38, 8, 6,38, 1,
+ 4,21,94, 4,22, 2, 4,22, 1, 5,22,36, 6,38, 3, 6,38, 4, 6,38,11, 6,38,10,
+ 6,67,62, 6,38, 6, 6,38, 2, 6,38, 9, 6,38, 7, 7,20,91, 6,38, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,24,92,15,24,93,15,24,94,15,25, 1,15,25, 2,15,25, 3,
+ 15,25, 4,15,25, 5,15,25, 6,15,25, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,29,24,
+ 5,29,29, 5,29,25, 5,29,26, 5,29,28, 6,48, 5, 6,48, 3, 5,29,20, 5,29,21,
+ 5,29,23, 6,48, 4, 6,48, 9, 7,29,20, 6,48, 7, 5,29,27, 6,48, 8, 6,48, 6,
+ 0, 0, 0,15,32, 2, 0, 0, 0, 0, 0, 0,15,32, 3, 7,29,18, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,29,22,
+ 6,57,74, 5,35,91, 5,35,88, 6,57,66, 6,57,73, 6,57,71, 5,35,92, 5,35,89,
+ 5,35,87, 6,67,63, 6,57,67, 6,57,69, 5,35,93, 5,35,90, 6,57,70, 7,36,41,
+ 6,57,68, 7,36,40, 5,35,86, 6,57,63, 6,57,75, 6,57,64, 5,35,85, 0, 0, 0,
+ 6,57,65, 0, 0, 0,15,38, 2,15,38, 3,15,38, 4,15,38, 5,15,38, 6,15,38, 7,
+ 15,38, 8,15,38, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,57,72, 0, 0, 0,
+ 6,57,76, 0, 0, 0, 7,29,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,67,68,
+ 6,67,66, 6,67,70, 4,40, 7, 4,40, 6, 5,50,15, 4,40, 8, 4,40, 9, 5,42,88,
+ 6,67,67, 6,67,64, 4,40, 5, 5,42,89, 5,42,90, 6,67,69, 6,67,71, 7,43,33,
+ /* plane 2, page 143 */
+ 0, 255, /* first, last */
+ 15,45,14,15,45,15,15,45,16,15,45,17,15,45,18,15,45,19, 6,67,65, 0, 0, 0,
+ 5,42,87, 0, 0, 0, 5,50,22, 5,50,20, 5,50,21, 7,10,53, 5,50,24, 5,50,18,
+ 5,50,17, 7,10,47, 5,50,19, 5,50,23, 5,50,16, 7,48,90, 7,10,51, 7,10,49,
+ 7,10,48, 7,10,50, 0, 0, 0,15,50,82,15,50,83,15,50,84,15,50,85,15,50,86,
+ 15,50,87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,54, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,57,33, 5,57,34, 4,52,52, 7,20,92, 5,57,36, 5,57,35,
+ 7,20,94, 7,48,89, 0, 0, 0,15,56,73,15,56,74,15,56,75,15,56,76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,74,28, 7,20,93, 5,63,54,
+ 5,63,55, 7,29,22, 7,29,23, 7,29,21, 5,84,57,15,61,49,15,61,50,15,61,51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,61,52, 5,69,66, 7,36,44, 4,62,20,
+ 7,36,42, 7,36,43,15,65,45,15,65,46,15,65,47,15,65,48, 5,74,29, 7,43,35,
+ 7,53,76, 7,43,37, 0, 0, 0, 0, 0, 0,15,68,44, 5,88,35, 0, 0, 0, 7,43,34,
+ 7,43,36, 7,63,87,15,70,82,15,70,83, 0, 0, 0, 7,49,82, 5,81,61, 7,53,78,
+ 7,53,77, 0, 0, 0, 7,66,89, 7,66,90, 7,57,80, 0, 0, 0, 7,61,41, 0, 0, 0,
+ 0, 0, 0, 7,63,88, 5,90,94, 5,91, 1, 7,70,23, 7,70, 8, 6,57,77, 0, 0, 0,
+ 4,46,43, 7,10,55,15,50,89,15,50,88, 5,57,37, 7,21, 1, 0, 0, 0, 4,57,54,
+ 7,36,45, 7,36,46, 5,74,30, 7,48,91, 0, 0, 0, 6,28,80, 6,28,81, 6,28,82,
+ 6,38,12, 5,22,37, 4,22, 3, 6,38,14, 0, 0, 0, 6,38,13, 0, 0, 0, 6,38,16,
+ 0, 0, 0, 6,38,15, 4,27,80, 6,48,12, 4,27,78, 6,48,10, 6,57,83, 6,48,16,
+ 6,48,14, 6,48,11, 4,27,81, 4,27,79, 6,48,15, 6,48,13, 0, 0, 0, 0, 0, 0,
+ 6,57,91, 5,35,94, 6,57,78, 6,57,81, 6,57,87, 6,57,85, 6,57,90, 6,57,82,
+ 6,57,80, 6,57,84, 6,57,89, 6,57,88, 0, 0, 0, 0, 0, 0, 6,57,79, 6,57,86,
+ 0, 0, 0, 0, 0, 0, 6,67,84, 6,67,82, 5,42,91, 6,67,75, 6,67,76, 6,67,86,
+ 6,67,72, 6,67,87, 6,67,80, 4,40,10, 6,67,85, 6,67,79, 5,42,92, 6,67,81,
+ 6,67,73, 5,42,93, 4,40,11, 6,67,74,15,45,20,15,45,21, 6,67,83, 0, 0, 0,
+ 6,67,88, 6,67,77, 0, 0, 0, 7,10,61, 7,10,59, 7,10,68, 7,10,63, 7,10,60,
+ 5,50,26, 7,10,62, 7,10,70, 7,10,66, 7,10,64, 7,10,65, 7,10,67, 7,10,58,
+ 7,10,56, 5,50,25, 7,10,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,71, 0, 0, 0,
+ 4,57,55, 4,52,53, 5,57,39, 7,21, 9, 7,21, 4, 7,21,15, 7,21, 2, 7,21,13,
+ 7,21, 8, 7,21, 5, 7,21,12, 7,21,10, 7,21, 6, 5,57,38, 7,21,16, 4,52,54,
+ 7,21,11, 7,21,19, 7,21, 7, 7,10,57, 7,21,20, 7,21,17, 7,21, 3, 0, 0, 0,
+ 0, 0, 0, 7,21,18,15,56,77, 0, 0, 0, 0, 0, 0, 7,21,14,15,50,90, 4,57,57,
+ /* plane 2, page 144 */
+ 0, 255, /* first, last */
+ 7,29,29, 7,29,27, 7,29,37, 7,29,28, 7,29,30, 7,29,41, 7,29,26, 7,29,34,
+ 7,29,25, 7,29,24, 7,29,31, 5,63,56, 7,29,39, 7,29,33, 7,29,32, 7,29,35,
+ 7,29,40, 7,21,22,15,61,53,15,61,55, 7,29,36, 7,29,38, 0, 0, 0, 7,36,48,
+ 7,36,54, 7,36,50, 7,36,51, 7,36,47, 5,69,67, 7,36,55, 7,36,53, 5,69,68,
+ 7,36,49, 7,36,52, 0, 0, 0, 0, 0, 0, 7,43,42, 7,43,39, 7,43,43, 7,43,40,
+ 5,74,31, 7,43,46, 4,65,79, 5,74,32, 7,43,38, 7,43,44, 7,43,45, 4,65,80,
+ 7,43,41, 7,43,47, 0, 0, 0, 0, 0, 0, 7,49, 3, 7,49, 7, 7,48,93, 7,49,10,
+ 7,49, 4, 7,49,11, 7,49, 8, 7,48,92, 5,78,34, 7,49, 5, 7,49, 6, 5,78,35,
+ 7,49, 2,15,70,84, 7,48,94, 0, 0, 0, 0, 0, 0, 7,49,12, 7,49, 9, 7,53,84,
+ 4,71,72, 7,53,82, 7,53,79, 7,53,86, 7,53,80, 7,53,85, 7,53,83, 7,53,87,
+ 7,49, 1,15,72,86, 7,53,81, 7,57,81, 7,57,82, 4,73,55, 7,57,85, 7,57,86,
+ 7,57,84,15,74,18, 0, 0, 0, 7,57,83, 7,61,24, 7,61,25, 7,61,26, 4,75,11,
+ 7,61,23, 7,61,19, 7,61,20, 7,61,21, 7,61,22, 0, 0, 0, 0, 0, 0, 7,63,92,
+ 7,63,90, 7,63,91, 0, 0, 0, 7,63,89, 7,65,58,15,76,33, 0, 0, 0, 0, 0, 0,
+ 7,67,94, 0, 0, 0, 7,68,75, 0, 0, 0, 0, 0, 0, 7,70,32,15,13,62, 5,16,80,
+ 15,18,80, 6,38,18, 6,38,19, 4,22, 5, 6,38,17,15,25, 8,15,25, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,29,32, 5,29,30, 5,29,33, 5,29,31, 4,27,83, 6,48,19,
+ 4,27,82, 6,48,18,15,32, 5, 0, 0, 0,15,32, 7,15,32, 6, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,33,56, 5,36, 5, 5,36, 2, 5,36, 1, 5,36, 4, 5,36, 3,
+ 6,57,92, 0, 0, 0,15,38,11,15,38,12,15,38,13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,36, 6, 5,43, 2, 4,40,16, 5,43, 3, 5,43, 1, 5,42,94, 4,40,12,
+ 4,40,15, 6,67,93, 4,40,18, 0, 0, 0, 6,67,92, 6,67,94,15,45,23, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,15,45,24, 6,67,90, 0, 0, 0, 6,67,89, 0, 0, 0, 7,10,74,
+ 7,10,73, 5,50,37, 5,50,32, 5,50,33, 5,50,31, 5,50,30, 5,50,35, 5,50,29,
+ 4,52,55, 5,50,28, 7,10,75, 7,10,76, 0, 0, 0,15,38,10,15,50,91,15,50,92,
+ 15,50,93,15,50,94,15,51, 1, 0, 0, 0, 7,10,72, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,50,36, 5,50,34, 5,63,57, 7,21,27, 4,52,59, 5,57,46, 5,57,43, 4,52,58,
+ 7,21,24, 5,57,45, 5,57,42, 7,21,26, 5,57,41, 7,21,25, 7,21,23, 0, 0, 0,
+ 5,57,40, 7,21,28, 0, 0, 0,15,56,78, 0, 0, 0, 0, 0, 0,15,56,79,15,56,81,
+ 15,56,82,15,56,83,15,56,84,15,56,85, 0, 0, 0,15,56,80, 0, 0, 0,15,53,68,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,57,44, 4,57,60, 4,57,58, 4,57,59,
+ 5,63,58, 4,57,65, 5,63,60, 0, 0, 0, 4,57,62, 7,29,42, 5,69,72, 7,29,43,
+ /* plane 2, page 145 */
+ 0, 255, /* first, last */
+ 7,29,45, 5,63,59, 0, 0, 0,15,61,57, 7,29,44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,29,46, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,61,58, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,63,61, 5,69,76,
+ 5,69,79, 7,36,63, 7,36,67, 5,69,73, 7,36,62, 5,69,70, 7,36,69, 7,36,66,
+ 4,62,23, 5,69,69, 5,69,71, 7,36,65, 7,36,58, 7,36,61, 5,69,78, 7,36,59,
+ 0, 0, 0,15,65,49, 0, 0, 0, 7,36,68, 0, 0, 0, 7,36,57, 7,36,60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,69,75,
+ 5,69,77,15,61,56, 5,69,74, 5,74,39, 5,74,33, 5,74,37, 5,74,34, 5,74,35,
+ 4,65,82, 5,74,38, 5,74,36, 5,74,41, 4,65,81, 7,43,48, 7,43,53, 7,43,49,
+ 0, 0, 0, 5,74,40, 7,43,51,15,68,46, 0, 0, 0, 0, 0, 0, 7,43,55, 7,43,54,
+ 7,43,52, 0, 0, 0, 7,43,50, 7,43,56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,49,14, 4,68,84, 7,49,22,
+ 4,68,86, 5,78,36, 4,71,77, 4,68,88, 7,49,20, 7,49,19, 5,78,37, 4,68,90,
+ 4,68,87, 4,68,89, 7,49,15, 7,49,17, 7,49,18,15,70,85, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,49,21, 7,49,23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,49,16, 7,49,13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,71,74, 4,71,73, 7,53,88, 5,81,62,
+ 5,81,63, 4,71,75, 4,71,76, 7,53,90, 5,81,64, 5,81,65, 7,53,93, 7,53,89,
+ 7,53,94, 7,53,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,84,60, 5,84,63, 4,73,57, 7,57,88, 5,84,61, 7,57,89, 7,57,90,
+ 5,84,58, 0, 0, 0, 5,84,62, 5,84,59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,57,87,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,86,66, 7,61,27, 7,61,28, 0, 0, 0,
+ 0, 0, 0,15,75,19, 0, 0, 0, 5,86,67, 0, 0, 0, 5,88,36, 4,76,18, 4,76,17,
+ 7,63,93, 7,63,94, 7,64, 1,15,75,80, 0, 0, 0, 4,77,12, 5,89,54, 4,77,11,
+ 5,89,53, 0, 0, 0, 7,65,59, 0, 0, 0, 0, 0, 0, 5,89,55, 0, 0, 0, 5,90,36,
+ 7,66,91, 5,90,35, 7,66,92,15,76,57, 7,67, 3, 0, 0, 0, 0, 0, 0, 5,90,34,
+ 7,68,76, 4,78,30, 7,69,43, 7,69,42, 7,69,44, 0, 0, 0, 5,91,76, 0, 0, 0,
+ 0, 0, 0, 7,70,13, 7,70,46, 7,70,49, 4,78,60, 4,22, 6, 0, 0, 0, 6,48,20,
+ 15,38,14,15,38,15,15,38,16, 6,57,93, 4,40,22, 7,12,36, 7,21,29, 5,58,84,
+ 7,36,70,15,68,47, 0, 0, 0, 5,81,66,15,75,81, 0, 0, 0, 6,28,84, 6,14,41,
+ 6,28,83, 4,22, 7, 6,38,20, 4,22, 9,15,25,13, 6,48,21, 5,29,34, 4,27,85,
+ 6,48,23, 6,48,22,15,32, 8,15,32, 9, 0, 0, 0, 6,58, 1, 6,57,94,15,45,27,
+ 4,46,45, 7,10,78, 7,10,77, 0, 0, 0, 7,21,30, 0, 0, 0, 7,49,24, 7,49,25,
+ /* plane 2, page 146 */
+ 3, 255, /* first, last */
+ 6,48,25, 6,48,26, 6,48,24, 4,33,57, 4,33,59,
+ 5,36, 8, 5,36, 7, 6,58, 3, 0, 0, 0, 6,58, 2, 6,68, 2, 5,43, 5, 4,40,25,
+ 0, 0, 0, 6,68, 1, 5,43, 4,15,45,28, 0, 0, 0, 0, 0, 0, 6,68, 3, 0, 0, 0,
+ 0, 0, 0, 4,46,46, 5,50,38, 5,50,40, 5,50,39, 7,10,80, 0, 0, 0, 7,10,79,
+ 15,56,87, 5,57,48, 5,57,47, 5,57,52, 5,57,49, 5,57,50, 5,57,51,15,56,86,
+ 7,21,31, 0, 0, 0, 0, 0, 0, 7,29,47, 5,63,63, 5,63,64, 5,63,66, 5,63,65,
+ 15,61,59, 7,29,49, 5,69,82, 7,36,71, 5,69,80, 5,69,81, 4,62,25, 0, 0, 0,
+ 5,74,43, 5,74,42, 0, 0, 0, 5,78,39, 5,78,38, 7,45,48, 7,49,26, 0, 0, 0,
+ 5,76,38, 5,81,68, 7,54, 2, 5,81,70, 5,81,69,15,72,89, 0, 0, 0, 7,54, 1,
+ 7,54, 4, 7,54, 3, 7,57,91, 7,57,92, 7,61,29, 5,86,68,15,75,20, 0, 0, 0,
+ 0, 0, 0, 7,64, 2, 0, 0, 0, 0, 0, 0, 5,90,37, 0, 0, 0, 7,68, 1, 0, 0, 0,
+ 0, 0, 0, 7,68,78, 7,68,77,15,25,14, 0, 0, 0, 5,29,35, 4,27,88, 6,48,27,
+ 0, 0, 0, 5,36,12, 5,36,11, 6,58, 6, 6,58, 9, 5,36,10, 6,58, 7, 5,36, 9,
+ 6,58, 5, 6,58,11, 6,58,10, 4,33,60, 4,33,62, 0, 0, 0,15,38,17, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,43, 7, 4,40,28, 5,43, 6, 6,68, 7, 6,68, 5, 5,43, 8, 5,43, 9, 4,40,30,
+ 5,43,12, 5,43,10, 5,43,13, 5,43,11, 6,68, 9, 4,40,31, 0, 0, 0, 0, 0, 0,
+ 6,68, 8, 6,68, 4, 0, 0, 0, 6,68, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,10,83, 5,50,41, 7,10,87, 7,10,86, 4,46,49, 7,10,89, 5,50,42, 4,46,50,
+ 7,10,85, 4,46,51, 5,50,45, 4,46,48, 5,50,44, 5,50,46, 7,10,84, 5,50,43,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,88, 7,10,82, 0, 0, 0,
+ 0, 0, 0, 7,21,36, 5,57,53, 5,57,56, 4,52,70, 4,52,62, 4,52,69, 5,57,54,
+ 5,57,55, 0, 0, 0, 7,21,35, 7,21,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,21,32,
+ 7,21,33, 7,21,37, 0, 0, 0, 0, 0, 0, 7,21,38, 0, 0, 0, 0, 0, 0, 7,29,56,
+ 7,29,58, 5,63,67, 5,63,73, 4,57,70, 5,63,69, 7,29,51, 4,57,71, 7,21,34,
+ 5,63,77, 7,29,55, 4,57,69, 7,29,57, 5,63,71, 5,63,74, 7,29,53, 5,63,75,
+ 7,29,59, 7,21,40, 5,63,72, 7,29,52, 7,29,60,15,61,60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,29,50, 0, 0, 0, 5,63,76, 5,63,70, 4,62,36,
+ 5,69,92, 5,69,84, 4,62,26, 5,69,86, 5,70, 2, 7,36,74, 7,36,72, 4,62,31,
+ 5,69,87, 4,62,32, 7,36,77, 7,36,80, 5,70, 1, 7,36,79, 4,62,29, 5,70, 3,
+ 7,36,81, 7,36,82, 7,36,78,15,65,51,15,65,52, 5,63,68, 7,36,76, 0, 0, 0,
+ 7,36,75, 5,69,88, 5,70, 4, 0, 0, 0, 7,36,73, 5,69,85, 5,69,90, 5,69,89,
+ /* plane 2, page 147 */
+ 0, 251, /* first, last */
+ 5,69,93, 0, 0, 0, 0, 0, 0, 4,65,90, 5,74,49, 5,74,52, 5,74,47, 4,65,89,
+ 5,74,45, 7,43,58, 5,74,53, 7,43,67, 5,74,46, 4,65,88, 7,43,65, 4,65,86,
+ 7,43,62, 4,65,85, 7,43,66, 5,74,48, 7,43,64,15,68,48,15,68,50,15,68,51,
+ 0, 0, 0, 0, 0, 0, 7,43,59, 7,43,60, 0, 0, 0, 5,74,51, 0, 0, 0, 0, 0, 0,
+ 5,74,50, 7,43,57, 5,74,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,69, 4, 5,78,46,
+ 4,68,93, 5,78,47, 5,78,42, 7,49,27, 5,78,40, 7,49,29, 4,69, 1, 5,78,44,
+ 4,69, 2, 4,69, 5, 5,78,45, 7,49,33, 0, 0, 0, 0, 0, 0, 7,49,28,15,70,88,
+ 0, 0, 0, 7,49,30, 7,49,35, 7,49,32, 0, 0, 0, 0, 0, 0, 5,78,43, 7,49,31,
+ 5,78,48, 4,69, 6, 7,49,34, 5,81,77, 7,54, 8, 4,71,79, 7,54,10, 7,54,11,
+ 0, 0, 0, 5,81,74, 5,81,75, 5,81,76, 0, 0, 0, 0, 0, 0, 5,81,71, 5,81,72,
+ 0, 0, 0, 7,54, 9,15,70,87, 5,84,64, 7,58, 6, 7,57,93, 4,73,61, 5,84,65,
+ 7,58, 5, 7,58, 3, 7,57,94, 7,58, 4, 5,84,67, 5,84,68, 7,58, 1, 7,58, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,84,69, 5,86,69, 5,86,72, 5,86,70,
+ 7,61,30, 5,86,73, 5,86,71, 7,61,33, 0, 0, 0, 0, 0, 0, 7,61,31, 7,61,34,
+ 0, 0, 0, 7,61,32, 5,88,38, 5,89,56, 7,64, 3, 5,88,37, 0, 0, 0, 5,88,39,
+ 7,65,62, 7,65,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,65,61, 5,90,38,
+ 7,66,94, 7,67, 2, 5,89,57, 0, 0, 0, 7,67, 1, 7,66,93, 0, 0, 0, 5,91, 2,
+ 7,68,80, 7,68,79, 5,91,44, 7,69,73, 5,92,21, 7,70,14, 7,70,25, 7,70,24,
+ 0, 0, 0, 5,92,44, 5,29,36, 4,33,64, 4,33,66, 6,58,12, 0, 0, 0, 5,36,13,
+ 6,68,11, 5,43,15, 5,43,17, 5,43,14, 5,43,16, 6,68,10,15,45,29, 0, 0, 0,
+ 0, 0, 0, 5,43,18, 0, 0, 0, 0, 0, 0, 4,46,53, 5,50,48, 4,46,52, 4,46,54,
+ 7,10,91, 7,10,90, 7,10,92, 7,10,93, 7,10,94, 5,50,47, 5,50,49, 5,57,57,
+ 7,21,41, 7,21,42, 5,57,60, 5,57,61, 0, 0, 0, 5,57,59, 7,21,43, 5,57,58,
+ 4,57,73, 7,29,62, 5,63,78, 7,29,63, 4,57,76, 4,57,74, 5,63,79, 5,63,80,
+ 15,61,61, 7,29,61, 0, 0, 0, 7,29,64, 0, 0, 0, 7,36,86, 7,36,83, 4,62,38,
+ 7,36,84, 7,29,65, 5,70, 5, 7,36,88, 0, 0, 0, 0, 0, 0, 7,36,85, 7,43,68,
+ 7,43,70, 7,43,73, 7,43,69, 7,43,72, 7,43,71, 7,49,36, 5,74,54, 5,74,55,
+ 7,49,37, 7,49,38, 4,69, 8,15,70,89, 0, 0, 0, 0, 0, 0, 5,78,50, 5,78,49,
+ 5,81,78, 5,81,80, 5,81,82, 4,71,84, 7,54,12, 5,81,79, 5,81,81, 0, 0, 0,
+ 7,58, 7, 4,73,63, 5,84,70, 7,58, 8, 7,58, 9, 5,84,71, 7,61,35, 7,61,38,
+ 7,61,37, 7,61,36, 4,76,21, 0, 0, 0, 7,65,63, 5,90,39, 7,68, 4, 7,68, 2,
+ 7,68, 3, 5,91,45, 5,91,77, 5,92, 2,
+ /* plane 2, page 148 */
+ 1, 254, /* first, last */
+ 5,36,14, 6,58,13, 5,50,50, 7,21,44, 4,57,77, 0, 0, 0, 7,29,66,
+ 0, 0, 0, 7,43,76, 7,49,40, 4,69,11, 5,81,83, 7,49,39, 0, 0, 0, 7,54,13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,58,10, 7,61,40, 7,61,39, 7,65,64,15,32,12,
+ 5,36,16, 5,36,15, 5,43,19, 4,40,37, 5,43,20, 0, 0, 0, 5,50,58, 7,11, 1,
+ 5,50,52, 5,50,55, 7,11, 2, 5,50,53, 5,50,54, 5,50,57, 5,50,51, 4,52,75,
+ 5,50,56, 0, 0, 0,15,56,89, 5,57,62, 7,21,45, 7,29,67, 5,63,81, 0, 0, 0,
+ 5,63,82, 5,70, 6, 5,70, 7, 0, 0, 0, 5,70, 8, 4,66, 1, 5,74,56, 5,74,57,
+ 0, 0, 0, 7,49,41, 7,49,42, 5,78,52, 5,78,51, 0, 0, 0, 5,78,53, 7,54,14,
+ 5,81,84, 5,70, 9, 5,84,72, 5,84,73, 0, 0, 0, 4,73,65,15,74,19, 7,61,42,
+ 4,76,22, 5,91, 3, 5,92,31, 6,20,91, 6,38,21, 5,22,38, 0, 0, 0, 0, 0, 0,
+ 5,29,42, 5,29,40, 5,29,41, 5,29,38, 4,27,93, 5,29,37, 4,27,92, 6,48,28,
+ 4,27,90, 4,33,76, 5,36,26, 4,33,75, 5,36,17, 5,36,25, 6,58,15, 4,33,73,
+ 5,43,27, 5,36,23, 4,33,70, 4,33,71, 4,33,74, 6,58,18, 5,36,22, 5,36,18,
+ 6,58,16, 6,58,17, 6,58,14,15,38,19, 5,36,19, 0, 0, 0, 5,36,24, 0, 0, 0,
+ 5,43,29, 6,68,17, 6,68,18, 5,43,23, 5,43,36, 5,43,24, 4,40,41, 4,40,40,
+ 5,43,26, 5,43,22, 4,40,47, 5,43,34, 5,43,25, 7,11,11, 5,43,35, 0, 0, 0,
+ 6,68,21, 6,68,19, 6,68,14, 5,43,28, 5,43,33,15,45,30, 6,68,13, 5,43,32,
+ 6,68,12, 6,68,22, 5,43,21, 6,68,15, 6,68,20, 0, 0, 0, 0, 0, 0, 5,50,61,
+ 4,46,59, 7,11, 5, 7,11,16, 5,50,60, 5,50,59, 4,46,56, 7,11, 4, 7,11,10,
+ 4,40,42, 7,11,14, 5,50,62, 4,46,62, 7,11,13, 7,11, 9, 7,21,47, 7,11,12,
+ 15,51, 3,15,51, 4, 7,11, 7, 0, 0, 0, 7,11, 8, 0, 0, 0, 7,11,15, 7,11,17,
+ 0, 0, 0, 0, 0, 0, 7,11, 3, 7,11, 6, 0, 0, 0, 5,50,63, 4,52,76, 5,57,65,
+ 4,52,78, 5,57,73, 7,21,56, 5,57,72, 5,57,70, 7,21,57, 7,21,55, 5,57,69,
+ 5,57,67, 7,21,59, 7,21,48, 5,57,74, 5,57,66, 5,57,75, 5,57,68, 5,57,71,
+ 4,52,81, 7,21,46, 5,57,64, 7,21,58, 4,52,82, 7,21,54, 7,21,60, 0, 0, 0,
+ 15,45,32,15,56,90,15,56,92,15,56,93,15,57, 1,15,57, 2,15,57, 3, 0, 0, 0,
+ 0, 0, 0, 7,21,50, 0, 0, 0, 7,21,51, 7,21,52, 7,21,53, 5,57,76, 0, 0, 0,
+ 5,57,63,15,56,94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,57,77, 4,57,85, 4,57,81,
+ 4,57,78, 7,29,69, 5,63,87, 4,57,89, 5,63,88, 4,57,84, 5,63,86, 5,63,83,
+ 5,63,85, 4,57,79, 5,63,91, 7,29,74, 4,57,82, 7,29,76, 5,63,84, 7,29,71,
+ 4,57,88, 7,29,75,15,61,62,15,61,63,15,61,64,15,61,65,15,61,66,15,61,67,
+ 7,29,68, 0, 0, 0, 7,29,70, 5,63,89, 5,63,90, 7,29,72, 7,29,77,
+ /* plane 2, page 149 */
+ 0, 251, /* first, last */
+ 5,70,10, 4,62,42, 5,70,16, 5,70,14, 4,66, 4, 5,70,13, 5,70,11, 7,36,91,
+ 5,70,12, 4,62,40, 5,70,17, 5,70,15, 7,36,92,15,65,53,15,65,54,15,65,55,
+ 15,65,56, 0, 0, 0, 0, 0, 0, 7,36,89, 7,36,90, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,43,86, 5,74,61, 7,43,80, 7,43,77, 5,74,62, 4,66,14, 7,43,82,
+ 5,74,60, 5,78,54, 5,74,59, 5,74,58, 7,43,84, 7,43,79, 4,66,10, 7,43,78,
+ 7,43,85, 7,43,81, 0, 0, 0, 0, 0, 0,15,68,52,15,68,53, 0, 0, 0, 7,43,87,
+ 7,43,83, 0, 0, 0, 0, 0, 0, 4,69,14, 4,69,13, 5,78,59, 5,78,57, 7,49,46,
+ 5,78,58, 4,69,18, 7,49,45, 4,69,19, 5,78,56, 7,49,43, 7,49,47,15,70,90,
+ 4,69,20, 0, 0, 0, 7,49,48, 0, 0, 0, 0, 0, 0, 7,49,44, 5,78,55, 0, 0, 0,
+ 7,48,44, 5,81,85, 5,81,86, 7,54,15, 5,81,88, 7,54,24, 7,58,17, 4,71,90,
+ 4,71,88, 7,54,19, 7,54,17, 7,54,22, 5,81,87, 5,81,89, 5,81,90, 7,54,16,
+ 7,54,20,15,72,90,15,72,91,15,72,92, 0, 0, 0, 7,54,23, 7,54,21, 7,58,16,
+ 5,84,76, 5,84,75, 7,58,13, 7,58,15, 5,84,74,15,74,20, 7,58,11, 0, 0, 0,
+ 0, 0, 0, 7,58,14, 0, 0, 0, 7,58,12, 7,61,50, 7,61,49, 7,61,47, 5,86,76,
+ 0, 0, 0, 5,86,77, 4,75,14, 5,86,74, 7,61,45, 4,75,15, 7,61,46,15,75,21,
+ 7,61,48, 0, 0, 0, 7,61,44, 0, 0, 0, 7,61,43, 0, 0, 0, 4,76,24, 7,64, 4,
+ 5,86,75, 4,76,23, 0, 0, 0,15,75,82, 7,64, 5, 0, 0, 0, 4,77,14, 5,89,58,
+ 0, 0, 0, 0, 0, 0, 5,90,40, 7,67, 4, 5,90,41, 7,67, 5, 7,67, 6, 4,78, 3,
+ 7,68, 5, 0, 0, 0, 0, 0, 0, 7,69,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,38,22, 6,48,31, 4,28, 1, 6,48,29, 5,29,43, 0, 0, 0,15,32,14,
+ 0, 0, 0, 6,48,30, 5,36,27, 5,36,32, 4,33,79, 5,36,29, 5,36,30, 6,58,20,
+ 6,58,22, 5,36,28, 0, 0, 0, 0, 0, 0, 4,33,80, 0, 0, 0, 6,58,21, 0, 0, 0,
+ 6,51,19, 0, 0, 0, 5,36,31, 6,58,23, 4,40,56, 5,43,40, 4,40,53, 5,43,39,
+ 5,43,38, 5,43,37, 4,40,51, 6,68,23, 4,40,50, 6,68,27, 6,68,25, 0, 0, 0,
+ 0, 0, 0, 6,68,24, 0, 0, 0, 0, 0, 0, 4,46,63, 5,50,66, 4,46,66, 7,11,20,
+ 7,11,19, 7,11,18, 5,50,65, 7,11,21,15,51, 5,15,51, 6, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,57,79, 5,57,87, 5,57,80, 7,21,61, 7,21,64,
+ 5,57,78, 5,57,83, 5,57,86, 7,21,63, 0, 0, 0, 7,21,65, 5,57,84, 5,57,85,
+ 7,21,62,15,57, 5, 5,57,82, 5,57,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,29,81, 4,58, 5, 5,64, 5, 5,64, 6, 4,57,91, 5,63,92, 7,29,80, 4,58, 4,
+ 5,70,18, 5,64, 2, 4,58, 3, 5,63,94, 5,64, 1, 5,64, 4, 5,63,93, 5,64, 3,
+ 7,29,78, 0, 0, 0,15,61,68,15,61,69,
+ /* plane 2, page 150 */
+ 1, 255, /* first, last */
+ 7,29,82, 0, 0, 0, 7,29,79, 0, 0, 0, 4,62,51, 7,37, 2, 7,37, 4,
+ 5,70,23, 7,37, 6, 5,70,20, 5,70,24, 4,62,52, 5,70,26, 4,66,17, 5,70,21,
+ 7,37, 5, 5,70,22, 5,70,25, 5,70,19,15,65,57, 7,37, 8, 7,37, 3, 7,37, 1,
+ 0, 0, 0, 7,37, 7, 7,36,93, 0, 0, 0, 5,74,63, 4,66,19, 4,66,20, 4,66,21,
+ 5,74,64, 7,43,89,15,68,54,15,68,55, 7,43,88, 7,43,90, 7,43,91, 7,43,92,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,78,62, 5,78,65, 5,78,64,
+ 4,69,21, 5,78,60, 4,69,23, 5,78,63,15,70,91, 5,78,66, 5,78,61, 4,69,24,
+ 7,54,32, 4,71,93, 4,72, 1, 5,81,91, 7,54,25, 5,81,92, 7,54,28, 7,54,26,
+ 15,72,93, 7,54,31, 7,54,33, 7,54,34, 7,54,29, 7,54,30, 7,54,27, 0, 0, 0,
+ 7,58,18,15,74,21, 7,58,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,61,51, 0, 0, 0,
+ 0, 0, 0, 5,88,41, 4,76,27, 7,64, 6, 7,64, 7, 0, 0, 0, 5,89,59, 7,65,65,
+ 0, 0, 0, 5,89,60, 4,77,15, 4,77,70, 5,90,42, 5,91, 4, 7,68, 6,15,77, 4,
+ 0, 0, 0, 5,92,39, 0, 0, 0, 0, 0, 0, 7,70,53, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,28,85, 5,32,25, 0, 0, 0, 7,11,22, 0, 0, 0, 7,43,93, 5,74,65,
+ 0, 0, 0, 0, 0, 0, 7,54,35, 0, 0, 0, 4,73,68, 5,84,77, 0, 0, 0, 0, 0, 0,
+ 6,20,92, 6,20,93, 6,21, 2, 6,20,94, 5,16,81, 6,28,86, 6,28,88, 5,29,44,
+ 5,22,42, 5,22,39, 6,38,26, 6,38,24, 5,22,41, 6,38,25, 6,38,27, 6,48,32,
+ 0, 0, 0, 0, 0, 0, 5,22,40, 6,48,33, 0, 0, 0, 6,48,38, 4,28, 2, 5,29,45,
+ 6,48,36, 6,48,37, 4,28, 6, 5,29,46, 6,58,24, 5,29,47, 6,48,34, 0, 0, 0,
+ 15,32,15, 0, 0, 0, 0, 0, 0, 6,48,35, 4,28, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6,58,34, 6,58,25, 5,36,34, 5,36,36, 5,36,33, 5,36,39, 4,33,86, 5,36,35,
+ 6,68,35, 5,36,37, 6,58,28, 6,58,27, 6,68,29, 4,33,83, 6,58,26, 6,68,30,
+ 6,58,30, 5,36,40, 6,58,33, 5,50,67, 0, 0, 0,15,38,23, 0, 0, 0, 6,58,32,
+ 6,58,31, 6,68,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,33,88, 5,36,38, 0, 0, 0,
+ 6,68,31, 7,11,23, 6,68,36, 5,43,45, 5,43,41, 6,68,37, 5,43,42, 4,40,58,
+ 6,68,34, 5,43,43, 7,11,25, 6,68,33, 0, 0, 0, 0, 0, 0,15,38,22,15,51, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,11,26, 0, 0, 0, 4,46,75, 7,11,32, 4,46,74,
+ 5,50,73, 5,50,68, 5,57,89, 4,46,72, 5,50,70, 5,50,75, 5,50,72, 4,46,76,
+ 5,50,74, 7,11,28, 5,50,69, 7,11,27, 7,29,83, 5,50,71, 7,11,30, 7,11,29,
+ 0, 0, 0,15,51, 7, 0, 0, 0, 5,57,88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,11,31, 5,58, 3, 4,58, 6, 5,58, 4, 4,52,91, 7,21,70, 7,21,74,
+ /* plane 2, page 151 */
+ 0, 248, /* first, last */
+ 5,64, 7, 5,57,91, 7,21,73, 5,57,94, 7,21,71, 5,57,92, 7,21,79, 4,52,89,
+ 7,21,75, 7,21,80, 5,58, 5, 7,21,72, 7,21,67, 5,57,90, 7,21,69, 7,21,68,
+ 7,21,76, 0, 0, 0, 5,64, 9, 7,21,78, 7,29,85, 7,21,66, 5,58, 2, 7,21,77,
+ 0, 0, 0, 0, 0, 0, 5,57,93,15,57, 6,15,57, 7,15,57, 8,15,57, 9, 5,58, 1,
+ 0, 0, 0, 0, 0, 0, 7,29,84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,64, 8, 5,64,20, 0, 0, 0, 7,29,87,
+ 5,64,13, 5,64,15, 5,64,19, 5,64,11, 7,29,86, 5,64,18, 5,64,21, 4,58,11,
+ 5,64,22, 7,29,88, 7,29,93, 7,37,10, 7,29,90, 5,64,10, 7,37,11, 7,30, 1,
+ 5,64,14, 7,29,89, 7,29,94, 0, 0, 0, 0, 0, 0,15,61,70,15,61,71, 0, 0, 0,
+ 0, 0, 0, 7,29,91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,64,16,
+ 7,29,92, 7,37,15, 5,70,31, 5,70,27, 0, 0, 0, 4,62,54, 4,62,60, 5,64,24,
+ 4,62,61, 5,70,29, 5,64,23, 5,70,28, 7,37,14, 7,37,13, 7,43,94, 4,62,62,
+ 5,70,30, 7,44, 2, 0, 0, 0, 7,49,52, 7,37,12, 0, 0, 0, 7,37, 9, 0, 0, 0,
+ 7,37,17,15,65,58,15,65,59, 0, 0, 0, 7,44, 5, 7,44, 1, 0, 0, 0, 0, 0, 0,
+ 4,62,53, 7,37,18, 0, 0, 0, 0, 0, 0, 7,37,16, 5,74,68, 7,44, 3, 5,74,66,
+ 4,66,27, 4,69,29, 7,49,51, 5,74,73, 5,74,70, 5,74,72, 5,74,74, 7,49,49,
+ 4,66,23, 5,74,71, 5,64,25, 5,74,67, 7,49,50, 4,66,25, 7,49,56, 7,44, 4,
+ 7,49,55, 4,66,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,68,56,15,68,57,
+ 0, 0, 0, 5,74,69, 7,49,54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,74,75, 4,69,30,
+ 7,49,53, 7,49,57, 7,49,63, 7,54,36, 5,81,93, 7,49,64, 5,78,69, 4,69,31,
+ 5,81,94, 5,78,68, 7,49,62, 7,49,66, 5,78,67, 7,44, 7, 7,49,65, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,49,59, 0, 0, 0, 0, 0, 0, 7,49,60, 0, 0, 0, 7,49,61,
+ 0, 0, 0, 0, 0, 0, 7,54,37, 0, 0, 0, 7,49,67, 7,49,58, 5,82, 8, 5,82, 2,
+ 7,54,38, 4,72, 5, 5,82, 4, 5,82, 1, 7,54,39, 5,82,11, 7,54,40, 5,82,10,
+ 5,82, 3, 5,82, 7, 5,82, 5, 7,54,41, 5,82, 6, 5,82, 9, 0, 0, 0,15,72,94,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,73,70, 5,84,78, 5,84,79, 7,58,23, 7,61,52,
+ 7,58,22, 5,84,80, 0, 0, 0, 7,58,21, 0, 0, 0,15,74,23, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,58,20, 5,86,78, 7,61,54, 5,86,79, 5,86,80,
+ 5,88,42, 0, 0, 0, 7,61,53, 0, 0, 0, 0, 0, 0, 5,88,43, 5,88,44, 4,76,28,
+ 7,64, 8, 7,64,10, 0, 0, 0, 0, 0, 0, 7,64, 9, 0, 0, 0, 5,89,61, 7,68, 7,
+ 5,91, 5,
+ /* plane 2, page 152 */
+ 16, 255, /* first, last */
+ 6,28,89, 6,38,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,68,38, 7,11,33, 6,68,40,
+ 0, 0, 0, 6,68,39, 5,50,76, 4,53, 4, 4,53, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,30, 2, 7,30, 3, 7,21,81, 7,21,83, 7,21,82, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,44, 9, 7,44, 8, 7,37,19, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,45,83, 0, 0, 0, 7,49,68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,64,11,
+ 0, 0, 0, 4,78, 6,15,18,81, 4,33,92, 6,58,35, 0, 0, 0, 5,39,52, 6,68,41,
+ 6,68,42,15,45,33,15,51, 9, 0, 0, 0, 6,68,43, 7,11,34,15,51,10,15,57,10,
+ 7,21,84,15,61,72, 7,30, 4, 0, 0, 0, 7,37,22, 5,70,33, 5,70,32, 0, 0, 0,
+ 5,70,34, 7,37,21, 7,37,20, 5,74,76, 4,66,29, 4,66,30, 0, 0, 0, 0, 0, 0,
+ 7,44,10, 0, 0, 0, 7,49,69,15,70,92, 0, 0, 0, 5,82,12,15,73, 1, 0, 0, 0,
+ 0, 0, 0, 7,54,42, 0, 0, 0, 0, 0, 0, 7,61,55, 5,90,43, 0, 0, 0, 5,22,43,
+ 5,22,44, 5,29,48, 6,48,40, 0, 0, 0, 0, 0, 0,15,32,17, 6,48,39, 0, 0, 0,
+ 5,36,41, 6,58,37, 6,58,36, 6,58,39, 0, 0, 0, 6,58,38, 0, 0, 0, 5,43,49,
+ 6,68,45, 6,68,46, 5,43,48, 4,40,65, 6,68,44, 6,68,50, 5,43,47, 7,11,35,
+ 0, 0, 0,15,45,34,15,45,35,15,45,36,15,45,37, 0, 0, 0, 7,11,38, 0, 0, 0,
+ 6,68,47, 6,68,49, 0, 0, 0, 0, 0, 0, 5,43,50, 7,11,42, 5,50,82, 7,11,46,
+ 7,11,39, 5,58,18, 5,50,84, 5,50,87, 5,50,77, 5,50,80, 5,50,78, 5,50,85,
+ 7,11,36, 5,50,86, 7,11,40, 5,50,83, 7,11,43, 7,11,41, 5,50,79, 7,11,37,
+ 7,11,44, 5,50,81, 0, 0, 0,15,51,11, 0, 0, 0,15,51,12,15,51,13, 7,11,45,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,21,90, 4,53,12, 7,21,89,
+ 5,58,15, 4,53,10, 4,53, 7, 4,53,11, 4,53, 8, 7,21,85, 5,58, 9, 4,53, 9,
+ 5,58,16, 5,58,13, 7,22, 4, 5,58,19, 5,58, 7, 5,58,17, 5,58,20, 5,58,11,
+ 7,21,92, 7,21,91, 7,22, 6, 7,22, 1, 7,21,88, 7,22, 3, 0, 0, 0, 5,58,10,
+ 7,22, 2,15,57,12, 5,58, 8, 0, 0, 0, 7,21,93, 7,21,94, 7,22, 7, 0, 0, 0,
+ 7,22, 5,15,57,11, 7,21,86, 0, 0, 0, 0, 0, 0, 7,21,87, 5,64,26, 7,30,12,
+ 5,64,27, 7,30, 6, 4,58,15, 7,30, 7, 7,30, 5, 5,64,28, 4,58,12, 7,30,10,
+ 7,30,11, 5,43,51, 7,30, 8, 5,64,30, 5,64,29, 0, 0, 0, 0, 0, 0,15,61,73,
+ 15,61,74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,37,28, 5,70,44, 5,70,43,
+ 5,70,39, 4,62,68, 5,70,41, 5,70,40, 4,62,65, 5,70,37, 5,70,46, 4,62,77,
+ 4,62,73, 4,62,74, 4,62,70, 5,70,47, 5,70,35, 4,62,76, 7,37,27, 7,37,26,
+ /* plane 2, page 153 */
+ 0, 229, /* first, last */
+ 7,37,23, 5,70,42, 0, 0, 0, 0, 0, 0,15,65,61, 0, 0, 0,15,65,62,15,65,64,
+ 0, 0, 0, 4,62,75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,65,60,
+ 7,37,24, 0, 0, 0, 5,70,36, 7,37,25, 0, 0, 0, 0, 0, 0, 5,70,45, 5,74,77,
+ 5,74,83, 5,74,79, 4,66,35, 7,44,17, 5,70,48, 7,44,12, 5,70,38, 5,74,81,
+ 5,74,80, 5,74,84, 7,44,11, 5,74,82, 5,74,86, 4,66,34, 5,74,87, 7,44,18,
+ 7,44,20, 5,74,85, 7,44,19, 7,44,13, 7,44,14, 7,44,15,15,68,59, 0, 0, 0,
+ 15,68,60,15,68,61, 0, 0, 0, 7,44,16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,55,22,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,44,21, 0, 0, 0, 4,69,37, 7,49,74, 7,49,73,
+ 5,78,78, 5,78,73, 5,78,75, 5,78,72, 4,69,34, 5,78,80,15,70,93, 4,69,35,
+ 4,69,36, 4,69,40, 5,78,81, 5,78,82, 5,78,71, 7,49,72, 4,72, 6, 5,78,74,
+ 5,78,79, 5,78,76, 7,49,75, 7,49,79, 7,49,80, 0, 0, 0, 7,49,81, 7,49,77,
+ 7,49,76, 0, 0, 0,15,70,94,15,71, 1, 7,49,71, 0, 0, 0, 7,49,78, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,50, 7, 0, 0, 0, 7,49,70, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,82,15, 5,82,14, 5,82,17, 4,72, 7, 5,82,18,
+ 5,82,16, 4,72,12, 7,54,45, 7,54,44, 7,54,46, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,54,43,15,73, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,54,47, 7,54,48, 5,84,88, 7,58,29, 5,82,20, 7,58,33, 7,58,24, 5,84,81,
+ 7,58,27, 5,82,19, 5,84,84, 5,84,87, 5,84,83, 7,58,32, 4,73,76, 5,84,85,
+ 7,58,25, 7,58,26, 0, 0, 0, 0, 0, 0, 7,58,28,15,74,24,15,74,25,15,74,26,
+ 0, 0, 0, 5,84,82, 0, 0, 0, 5,84,89, 7,58,31, 0, 0, 0, 7,61,63, 7,61,61,
+ 5,86,81, 5,88,46, 7,61,60, 7,61,57, 5,86,82, 7,61,58, 7,61,62, 7,61,59,
+ 7,61,64, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,75,24,15,75,25, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,61,56, 0, 0, 0, 0, 0, 0, 5,88,47, 7,64,17,
+ 7,64,20, 5,88,45, 7,64,19, 7,64,22, 7,64,21, 7,64,15, 7,64,16, 7,64,12,
+ 7,64,18, 0, 0, 0, 5,89,66, 7,65,67, 5,89,67, 5,89,63, 4,77,17, 5,89,64,
+ 7,65,66, 5,89,62, 5,89,65, 4,77,18, 0, 0, 0, 0, 0, 0, 7,65,68, 5,90,44,
+ 5,90,45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,78, 7, 7,68, 9, 7,68, 8, 0, 0, 0,
+ 4,78,32, 7,68,82, 7,68,83, 7,68,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,69,46, 5,92, 3, 7,69,74, 7,69,90, 7,69,91, 7,70,36,
+ /* plane 2, page 154 */
+ 17, 255, /* first, last */
+ 5,29,49, 4,28, 7, 0, 0, 0, 0, 0, 0, 6,58,41, 6,58,42, 6,58,40,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,58,43, 4,40,67, 4,40,69, 5,43,53, 6,68,56,
+ 5,43,52, 4,40,68, 6,68,54, 6,68,51, 6,68,52, 0, 0, 0, 6,68,53, 6,68,55,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,46,82, 4,46,81, 5,50,90, 5,50,89,
+ 7,11,50, 7,22,12, 5,50,88, 5,50,91, 4,46,87, 7,11,48, 7,11,52, 7,11,49,
+ 4,46,88, 0, 0, 0, 7,11,51, 0, 0, 0, 0, 0, 0, 5,58,22, 5,58,21, 4,53,19,
+ 7,22,11, 7,11,47, 7,22,10, 7,22, 9, 0, 0, 0, 0, 0, 0, 7,30,14, 0, 0, 0,
+ 0, 0, 0, 4,58,20, 7,30,18, 4,58,18, 7,30,19, 5,64,31, 7,30,17, 7,30,13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,30,15, 0, 0, 0, 7,30,16, 0, 0, 0, 5,70,57,
+ 7,37,30, 4,62,79, 7,37,29, 5,70,55, 7,37,31, 5,70,50, 5,74,88, 5,70,53,
+ 5,70,51, 5,70,54, 5,70,56, 7,30,20, 0, 0, 0, 0, 0, 0, 5,70,52, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,44,27, 5,74,90, 5,74,89,
+ 7,44,26, 7,44,23, 5,74,92, 5,74,93, 5,74,91, 7,44,29, 7,44,30, 0, 0, 0,
+ 7,44,25, 7,44,24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,44,28, 7,44,22, 0, 0, 0,
+ 4,69,42, 5,78,85, 5,78,84, 5,78,83, 7,49,83, 7,49,84, 7,49,85, 0, 0, 0,
+ 0, 0, 0, 4,72,15, 5,82,22, 7,54,55, 4,72,14, 5,82,21, 5,82,23, 7,54,51,
+ 7,54,52, 5,82,24, 7,54,53,15,73, 3, 7,54,54, 7,54,50, 0, 0, 0, 4,73,77,
+ 7,58,34, 4,73,80, 7,58,35, 4,73,79, 7,58,36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,61,69, 7,61,70, 5,86,83, 4,75,22, 5,86,85, 4,75,23, 7,61,66, 5,86,84,
+ 7,61,71, 7,61,65, 7,61,67, 7,61,68, 0, 0, 0, 4,76,31, 5,88,48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,77,20, 7,65,69, 0, 0, 0, 0, 0, 0,15,75,26, 7,67, 7,
+ 5,90,46, 7,67, 8, 0, 0, 0, 7,68,10, 7,68,84, 0, 0, 0, 5,91,78, 4,34, 3,
+ 4,40,70, 5,38,68, 5,43,54, 6,68,58,15,45,38,15,45,39,15,45,40, 0, 0, 0,
+ 0, 0, 0, 6,68,57, 7,11,54,15,51,14,15,51,15, 0, 0, 0, 7,22,14, 7,22,13,
+ 15,57,13,15,57,14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,58,22, 0, 0, 0, 5,64,32,
+ 15,61,75,15,61,76, 7,37,32, 0, 0, 0,15,65,65,15,65,66, 7,44,31,15,68,63,
+ 5,78,86,15,71, 2,15,71, 3,15,71, 4,15,71, 5, 4,72,17, 7,54,56, 7,58,37,
+ 7,61,72, 7,61,73, 7,61,74, 7,64,23,15,75,83, 7,65,70, 7,65,71, 7,67, 9,
+ 7,68,11, 4,78, 8, 0, 0, 0, 7,69,92, 6,48,41, 0, 0, 0, 0, 0, 0, 6,48,42,
+ 0, 0, 0, 6,58,45, 6,58,44, 0, 0, 0,15,38,26,15,32,73, 0, 0, 0, 4,40,72,
+ /* plane 2, page 155 */
+ 0, 255, /* first, last */
+ 5,43,56, 6,68,64, 0, 0, 0, 6,68,63, 6,68,61, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6,68,65, 6,68,59, 6,68,60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,43,55,
+ 5,43,58, 5,50,94, 7,11,55, 7,11,58, 4,46,94, 7,11,56, 5,51, 4, 4,47, 2,
+ 7,11,59, 5,51, 3, 4,46,92, 4,46,93, 5,50,92, 4,46,90, 5,50,93, 5,51, 2,
+ 5,51, 1, 7,11,60, 7,11,57, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,51,16,15,51,17,
+ 15,51,18,15,51,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,22,15, 4,53,23, 7,22,17, 5,58,26, 7,22,16, 4,53,25, 4,53,20, 4,53,27,
+ 5,58,23, 5,58,25, 4,53,26, 4,53,24, 7,22,19, 5,58,24, 0, 0, 0,15,57,15,
+ 15,57,16,15,57,17,15,57,19, 7,22,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,58,26,
+ 4,58,28, 7,30,26, 5,64,33, 5,64,36, 5,64,34, 7,30,24, 5,64,37, 5,64,38,
+ 5,64,35, 7,30,21, 4,58,25, 7,30,22, 0, 0, 0,15,61,77,15,61,78,15,61,79,
+ 7,30,23, 0, 0, 0, 7,30,25, 0, 0, 0, 0, 0, 0, 7,30,27, 7,37,34, 5,70,62,
+ 4,62,81, 5,70,60, 5,70,64, 5,70,63, 7,37,36, 5,70,65, 7,44,32, 7,37,35,
+ 4,62,82, 5,70,58, 4,62,88, 5,70,59, 0, 0, 0,15,65,67,15,65,69, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,70,61,
+ 7,37,33,15,65,68, 4,66,45, 7,44,35, 7,44,39, 5,74,94, 5,75, 1, 5,75, 3,
+ 4,66,48, 7,44,40, 7,44,38, 7,44,33, 5,75, 4, 5,75, 2, 7,44,37, 7,44,34,
+ 4,66,43, 7,44,36, 0, 0, 0,15,68,64,15,68,65,15,68,67, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,78,92, 7,49,86,
+ 5,78,87, 5,78,91, 5,78,90, 5,78,89, 4,69,48, 4,69,44, 5,78,94, 5,78,88,
+ 4,69,43, 7,49,87, 7,49,88, 7,49,91, 0, 0, 0, 0, 0, 0, 7,49,92,15,71, 6,
+ 15,71, 7,15,71, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,78,93, 5,82,27,
+ 5,82,30, 5,82,26, 7,54,57, 4,72,18, 4,72,20, 5,82,25, 4,72,19, 5,82,29,
+ 7,54,58, 5,82,28, 7,54,62, 0, 0, 0,15,73, 4, 7,54,59, 7,54,60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,85, 1, 5,84,92, 7,58,38, 5,85, 2, 5,84,94,
+ 5,84,91, 5,85, 5, 5,85, 4, 5,85, 3, 5,84,93, 5,85, 6, 7,54,61, 4,73,83,
+ 7,58,39, 7,58,40, 0, 0, 0, 0, 0, 0,15,74,27, 0, 0, 0,15,74,28, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,86,87, 4,75,24, 4,75,25, 5,86,86, 7,61,76,
+ 7,61,77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,61,75,15,75,27, 4,76,32, 7,64,24,
+ 5,88,49, 4,76,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,76,34, 0, 0, 0, 0, 0, 0,
+ 5,89,69, 7,65,72, 5,89,68, 4,77,22,15,76,34,15,76,35, 0, 0, 0, 0, 0, 0,
+ 7,65,73, 0, 0, 0, 5,90,47, 7,67,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,67,11,
+ /* plane 2, page 156 */
+ 1, 255, /* first, last */
+ 7,68,12, 4,78, 9, 5,91, 6,15,76,82, 7,68,87, 7,68,86, 5,91,46,
+ 0, 0, 0, 4,78,52, 6, 3,29, 6, 3,28, 5,36,43, 5,43,59, 5,43,60, 6,68,66,
+ 7,11,61, 7,22,20, 7,30,28, 7,37,37, 4,62,89, 7,49,94, 7,54,63, 5,82,32,
+ 0, 0, 0, 7,58,41, 0, 0, 0, 0, 0, 0, 7,64,26, 7,64,25, 5,88,51, 5,91,47,
+ 7,11,62, 4,47, 3, 4,53,28, 7,37,38, 7,50, 1, 7,54,65, 7,54,64, 7,58,42,
+ 7,61,78,15,76,83, 5,91,48, 4,34, 4, 6,58,46, 6,68,68, 6,68,67, 7,11,63,
+ 0, 0, 0, 7,22,24, 4,53,30, 5,58,27, 7,22,22, 7,22,21, 4,53,29, 7,22,23,
+ 0, 0, 0, 5,64,39, 0, 0, 0, 0, 0, 0, 7,30,29, 0, 0, 0, 4,62,90, 7,37,40,
+ 7,37,41, 7,37,39, 0, 0, 0, 7,44,41, 5,75, 5, 7,44,42, 0, 0, 0, 4,69,49,
+ 7,50, 4, 7,50, 3, 7,50, 2, 7,50, 5, 7,54,66, 4,72,21, 7,54,68, 5,82,34,
+ 7,54,67, 7,54,69, 7,54,70, 5,85, 7, 7,58,44, 0, 0, 0, 7,61,81, 7,61,82,
+ 5,86,88, 4,73,85, 4,75,26, 7,61,80, 5,86,89, 7,61,79, 0, 0, 0, 7,61,83,
+ 4,76,38, 4,76,37, 7,61,84, 7,64,27, 7,65,75, 7,65,76, 5,90,48, 7,67,12,
+ 7,67,13, 7,67,14, 0, 0, 0, 4,78,10, 7,68,13, 7,68,89, 0, 0, 0, 7,68,88,
+ 7,68,90, 7,69,47, 5,92, 4, 4,78,49, 5,92,13, 7,69,93, 0, 0, 0, 7,70,42,
+ 7,70,43, 6,48,43, 5,29,51, 0, 0, 0, 0, 0, 0, 6,58,50, 5,36,46, 6,58,49,
+ 4,34, 6, 5,36,44, 6,58,48, 5,36,45, 4,34, 5, 6,58,47,15,25,16,15,25,15,
+ 6,58,51, 0, 0, 0, 5,43,63, 5,43,64, 5,43,65, 5,43,62, 5,43,61, 5,43,66,
+ 6,68,72, 6,68,69, 0, 0, 0, 0, 0, 0, 6,68,73,15,45,41,15,45,42,15,45,43,
+ 6,68,75, 6,68,70, 6,68,78, 6,68,76, 6,68,77, 6,68,74, 6,68,71, 0, 0, 0,
+ 0, 0, 0, 4,47, 7, 5,51, 9, 7,11,65, 0, 0, 0, 7,11,64, 5,51, 8, 5,51,11,
+ 5,58,33, 5,51,10, 4,47, 6, 7,11,67, 5,51, 5, 0, 0, 0,15,51,20,15,51,21,
+ 15,51,22, 0, 0, 0, 0, 0, 0, 5,51, 7, 0, 0, 0, 0, 0, 0, 7,11,66, 0, 0, 0,
+ 0, 0, 0, 5,51, 6, 0, 0, 0, 5,58,28, 7,22,26, 5,58,37, 5,58,35, 7,22,25,
+ 4,53,32, 5,58,36, 7,22,27, 0, 0, 0,15,57,20, 5,58,30, 5,58,29, 5,58,31,
+ 5,58,34, 7,22,28, 0, 0, 0, 5,58,32, 4,58,29, 5,64,41, 5,64,44, 5,64,48,
+ 4,58,30, 7,30,30, 5,64,40, 5,64,42, 5,64,47, 5,64,45, 7,30,32, 0, 0, 0,
+ 7,30,33, 7,30,35,15,61,80,15,61,81,15,61,82, 5,64,46, 0, 0, 0, 7,30,31,
+ 7,30,34, 5,64,43, 5,70,67, 7,37,43, 4,62,91, 5,70,73, 7,37,46, 5,70,71,
+ 5,70,69, 7,37,47, 7,37,44, 0, 0, 0,15,65,71, 7,37,42, 7,37,49, 5,70,66,
+ 7,37,45, 7,37,48, 5,70,70, 0, 0, 0, 0, 0, 0, 5,75, 6, 5,75, 9, 7,44,43,
+ 5,75, 7, 7,44,44, 7,44,45, 0, 0, 0,15,68,68,15,68,69,15,68,70,15,68,71,
+ /* plane 2, page 157 */
+ 0, 255, /* first, last */
+ 5,70,68, 0, 0, 0, 0, 0, 0, 5,75, 8, 0, 0, 0, 0, 0, 0, 7,50,11, 4,69,50,
+ 7,50,10, 5,79, 1, 7,50, 9, 7,50, 8, 0, 0, 0, 5,79, 2, 7,50, 6,15,71, 9,
+ 5,82,36, 5,82,38, 5,82,40, 4,72,23, 7,54,71, 7,54,72,15,73, 5, 0, 0, 0,
+ 5,82,37, 5,82,35, 0, 0, 0, 7,54,73, 5,82,39, 5,85,10, 4,66,49, 7,58,48,
+ 4,73,88, 5,85, 8, 7,58,46, 4,73,89, 5,85,11, 0, 0, 0,15,74,29, 0, 0, 0,
+ 5,85,12, 5,85, 9, 4,73,90,15,71,10, 0, 0, 0, 7,58,45, 5,86,91, 5,86,90,
+ 15,73, 6, 5,88,52, 5,88,53, 4,76,39, 7,64,31, 0, 0, 0, 7,64,30, 7,64,32,
+ 7,64,29, 0, 0, 0, 5,89,71, 5,89,70, 0, 0, 0,15,76,36, 0, 0, 0, 7,67,15,
+ 4,78,11, 7,68,14, 7,68,15, 0, 0, 0, 4,78,33, 5,91,49, 0, 0, 0, 5,91,79,
+ 5,92, 5, 0, 0, 0, 5,92,32, 4,16,35, 4,34,10, 4,34, 7, 6,58,53, 4,34, 8,
+ 6,58,54, 5,36,47, 0, 0, 0,15,38,27, 6,68,79, 5,43,69, 4,40,76, 5,43,67,
+ 15,45,44,15,45,45, 0, 0, 0, 5,43,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,47,15, 4,47,19, 4,47,17, 4,47,13, 7,11,72, 5,51,17, 5,51,16, 7,11,69,
+ 7,11,68, 5,51,14, 4,47,24, 5,51,19, 5,51,12, 5,51,13, 7,11,76, 7,11,70,
+ 4,47,22, 5,51,18, 0, 0, 0,15,51,23,15,51,26,15,51,29, 7,11,75, 7,11,71,
+ 7,11,73, 4,47,14, 0, 0, 0, 0, 0, 0,15,51,25, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,51,15, 5,58,40, 5,58,38, 7,22,29, 5,58,41, 4,53,38, 4,58,38, 5,58,46,
+ 5,58,45, 4,53,41, 7,22,35, 7,22,30, 7,22,33, 7,22,32, 5,58,44, 0, 0, 0,
+ 0, 0, 0, 7,22,36,15,57,22,15,57,23,15,57,25,15,57,26, 5,58,43, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,22,34,15,57,21, 0, 0, 0, 0, 0, 0, 5,58,39, 0, 0, 0,
+ 7,22,31, 0, 0, 0, 5,64,54, 4,58,40, 5,64,55, 5,64,52, 5,64,50, 4,58,39,
+ 7,30,43, 5,64,53, 7,30,38, 7,30,45, 7,30,37, 4,58,43, 7,30,44, 5,64,58,
+ 5,64,56, 7,30,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,58,42,15,38,28,
+ 15,61,83,15,61,84,15,61,85,15,61,87,15,61,89, 7,30,40, 0, 0, 0, 5,64,59,
+ 0, 0, 0, 0, 0, 0, 5,64,51, 7,30,42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,64,49, 5,64,57, 5,70,87, 5,70,84, 5,70,80,
+ 5,70,75, 7,37,51, 4,63, 8, 5,70,77, 7,37,50, 5,70,74, 5,70,81, 5,70,85,
+ 5,70,82, 5,70,79, 5,70,76, 0, 0, 0, 7,37,52,15,65,72,15,65,73,15,65,74,
+ 15,65,75,15,65,76,15,65,77,15,65,78,15,65,79,15,65,81,15,65,83, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,37,53, 0, 0, 0, 7,30,39, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,70,86, 5,70,83, 0, 0, 0, 7,44,59,
+ 7,44,56, 4,66,62, 7,44,50, 5,75,13, 4,66,50, 5,75,15, 7,44,47, 7,44,49,
+ /* plane 2, page 158 */
+ 0, 248, /* first, last */
+ 4,66,63, 5,70,88, 4,66,67, 5,75,18, 4,66,59, 7,44,46, 4,66,58, 4,66,69,
+ 7,44,58, 7,44,51, 7,44,57, 4,66,56, 7,44,53, 5,75,22, 5,75,14, 7,44,48,
+ 5,75,20, 0, 0, 0,15,68,78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,68,72,
+ 15,68,74,15,68,76,15,68,79,15,68,80,15,68,81, 0, 0, 0, 0, 0, 0, 5,75,16,
+ 7,44,52, 0, 0, 0, 7,44,55, 0, 0, 0, 0, 0, 0, 4,66,51, 0, 0, 0, 5,75,23,
+ 5,75,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,68,73, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,75,12,15,65,80, 0, 0, 0, 7,44,54, 0, 0, 0, 5,79, 7, 7,50,14,
+ 5,79, 6, 5,75,24, 5,79, 9, 7,50,12, 4,69,56, 5,79,11, 7,50,15, 7,50,13,
+ 5,79, 8, 4,69,54, 5,79, 4, 7,50,18, 4,69,62, 5,79, 5, 5,79, 3, 4,69,64,
+ 7,50,16, 5,79,12, 7,50,20, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,71,11,15,71,12,
+ 15,71,13,15,71,15,15,71,16,15,71,17,15,71,18, 0, 0, 0,15,71,14, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,79,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,71,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,82,42, 4,72,31, 5,82,47, 5,82,51, 5,87, 3, 5,82,41, 5,82,50,
+ 4,72,24, 7,54,81, 5,82,44, 7,54,82, 5,82,55, 7,54,77, 5,82,52, 5,82,45,
+ 7,54,83, 7,54,85, 7,54,74, 7,54,84, 5,82,54, 7,54,78, 7,54,79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,73, 8,15,73, 9,15,73,11,
+ 15,73,12,15,73,13,15,73,14,15,73,15,15,73,16,15,73,17,15,73,18, 0, 0, 0,
+ 0, 0, 0, 7,54,75, 7,54,76, 5,82,53, 7,54,80, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,82,48, 0, 0, 0, 7,58,52, 7,58,50, 5,85,18,
+ 4,74, 2, 5,85,14, 5,85,15, 7,58,58, 7,58,55, 5,85,16, 7,58,60, 7,58,57,
+ 5,85,20, 7,58,54, 7,58,59, 7,58,51, 7,58,53, 7,58,49, 7,58,62, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,74,33,15,74,34,15,74,35,
+ 15,74,32, 7,58,63, 5,85,19, 7,58,56, 0, 0, 0, 7,58,61, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,85,17, 0, 0, 0,
+ 5,86,94, 7,61,88, 5,87, 2, 4,75,30, 4,75,31, 5,86,92, 7,61,87, 4,69,60,
+ 7,64,38, 7,61,85, 7,62, 2, 7,61,86, 5,86,93, 7,62, 1, 7,61,92, 5,87, 1,
+ 7,61,89, 0, 0, 0,15,75,29,15,75,31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,61,90, 0, 0, 0, 7,61,93, 7,61,94, 7,61,91, 0, 0, 0,
+ 15,75,28,
+ /* plane 2, page 159 */
+ 2, 252, /* first, last */
+ 7,64,35, 5,88,60, 5,88,64, 5,88,58, 7,64,33, 4,76,47,
+ 4,76,44, 5,88,57, 5,88,65, 4,76,43, 5,88,63, 5,88,62, 5,88,55, 0, 0, 0,
+ 7,64,43, 7,64,39, 5,88,56, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,75,85,15,75,88,
+ 7,64,40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,64,34, 7,64,36, 7,64,37, 5,88,61,
+ 7,64,42, 7,64,41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,65,83, 5,89,72, 4,77,24,
+ 5,89,73, 7,65,78, 7,64,90, 7,65,81, 7,65,79, 5,89,75, 7,65,82, 0, 0, 0,
+ 0, 0, 0, 7,65,80,15,76,37,15,76,38, 5,89,74, 7,65,77, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,67,21, 7,67,16, 7,67,18, 7,67,19, 7,67,20,
+ 5,90,49, 5,90,50,15,76,58,15,76,59,15,76,60, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,76,61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,67,17, 5,91, 8, 5,91, 7, 7,68,16,
+ 5,91, 9,15,76,84, 0, 0, 0, 7,68,17, 0, 0, 0, 5,91,10, 0, 0, 0, 0, 0, 0,
+ 7,68,18, 0, 0, 0, 7,68,94, 5,91,51, 5,91,50, 5,91,53, 7,68,92, 7,69, 1,
+ 7,68,91, 5,91,52, 0, 0, 0, 7,68,93, 0, 0, 0, 0, 0, 0,15,76,85, 5,91,83,
+ 5,91,82, 5,91,81, 5,91,80, 7,69,48, 5,92, 6,15,77,11,15,77,12, 0, 0, 0,
+ 5,92, 7, 7,69,75, 0, 0, 0, 5,92,14, 0, 0, 0, 5,92,23, 7,70,15, 5,92,22,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,51,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,15,61,88, 0, 0, 0, 0, 0, 0, 0, 0, 0,15,75,30, 0, 0, 0, 6,48,44,
+ 15,32,19, 6,48,45, 4,34,11, 6,58,55, 5,36,49, 5,36,50, 6,58,60, 6,58,56,
+ 6,58,57, 5,36,48, 0, 0, 0, 6,58,58, 6,58,59, 6,68,80, 5,43,74, 6,68,81,
+ 5,43,73, 4,40,78, 4,40,79, 6,68,82, 6,68,83, 6,68,84, 4,40,80, 5,43,72,
+ 0, 0, 0,15,45,47,15,45,48,15,45,49, 5,43,71, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,47,37, 7,11,82, 7,11,93, 7,11,79, 7,11,83, 7,11,89, 5,51,23, 5,51,27,
+ 5,51,29, 5,51,25, 7,11,86, 7,11,92, 5,51,31, 5,51,20, 4,47,29, 5,51,33,
+ 5,51,30, 5,51,21, 4,47,30, 5,51,34, 7,11,90, 4,47,28, 7,11,85, 4,47,35,
+ 4,47,26, 5,51,35, 4,47,38, 7,11,80, 7,11,91, 0, 0, 0, 0, 0, 0,15,51,32,
+ 7,11,78, 7,11,87, 7,11,88, 5,51,22, 5,51,26, 5,51,32, 7,11,81, 7,11,84,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,51,28, 7,22,43, 5,58,52, 5,58,54, 5,58,49,
+ 5,58,47, 4,53,44, 5,58,51, 5,58,57, 5,58,50, 7,22,55, 7,22,50, 5,58,55,
+ 4,53,54, 7,22,52, 5,58,56, 7,22,48, 5,58,53, 7,22,51, 7,22,44, 0, 0, 0,
+ 0, 0, 0, 7,22,37, 7,22,46,15,57,29,15,57,30,15,57,31,15,57,32, 7,22,45,
+ 7,22,47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,22,56,
+ /* plane 2, page 160 */
+ 0, 255, /* first, last */
+ 7,22,54, 7,22,39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,22,40,
+ 7,22,53, 4,53,51, 4,53,49, 6,48,46, 7,22,41, 5,58,48, 0, 0, 0, 7,22,38,
+ 0, 0, 0,15,54,19, 7,30,49, 4,58,44, 5,64,62, 5,64,73, 7,30,52, 4,58,51,
+ 5,64,71, 7,30,53, 5,64,61, 5,64,65, 0, 0, 0, 7,30,46, 5,64,68, 5,64,75,
+ 5,64,64, 5,64,66, 4,58,52, 7,30,55, 5,64,60, 5,64,67, 4,58,56, 7,30,47,
+ 4,58,59, 5,64,76, 7,30,56, 7,30,51, 5,64,72, 5,64,74, 0, 0, 0, 0, 0, 0,
+ 15,61,90,15,61,91,15,61,92,15,61,93,15,62, 1,15,62, 2,15,62, 3,15,62, 5,
+ 7,30,48, 0, 0, 0, 5,64,63, 0, 0, 0, 4,58,58, 7,30,54, 0, 0, 0, 5,64,69,
+ 5,64,70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,30,50, 4,58,55, 7,37,59, 5,64,77, 7,37,63, 5,70,93, 5,71, 5, 5,71, 7,
+ 4,63,14, 5,71,10, 5,70,90, 5,71, 1, 5,70,94, 5,70,91, 7,37,61, 7,37,56,
+ 4,63,13, 7,37,62, 5,70,92, 5,71,11, 4,63,16, 7,37,71, 5,71, 2, 7,37,68,
+ 7,37,60, 5,71, 8, 7,37,65, 7,37,66, 7,37,70, 5,71, 4, 7,37,57, 5,71, 3,
+ 7,37,72, 7,37,54, 7,37,64,15,65,84,15,65,85, 7,37,55, 5,71, 9, 0, 0, 0,
+ 7,37,67, 0, 0, 0, 5,75,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,44,61,
+ 5,75,26, 7,44,66, 0, 0, 0, 5,75,30, 5,75,42, 5,75,32, 7,44,74, 7,44,68,
+ 5,75,27, 7,44,72, 7,44,75, 7,44,67, 5,75,44, 5,75,29, 5,75,43, 4,66,75,
+ 5,75,34, 5,75,37, 7,44,64, 7,44,62, 5,75,40, 5,75,36, 7,44,60, 7,44,70,
+ 7,44,76, 5,75,33, 0, 0, 0, 4,66,77, 7,44,73, 5,75,38, 0, 0, 0,15,68,84,
+ 15,68,86,15,68,87, 7,44,65, 5,75,39, 0, 0, 0, 7,44,79, 5,75,41, 7,37,73,
+ 0, 0, 0, 7,44,69, 0, 0, 0, 7,44,71, 0, 0, 0, 7,44,77, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,75,35, 0, 0, 0, 0, 0, 0, 7,44,78, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,44,63, 4,66,73, 5,79,24, 5,79,16,
+ 7,50,26, 4,69,69, 5,79,30, 7,50,35, 5,79,18, 5,79,34, 4,66,80, 7,50,22,
+ 5,79,15, 4,69,67, 5,79,17, 4,69,78, 4,69,72, 5,79,19, 5,79,13, 5,79,23,
+ 5,79,36, 5,79,25, 4,69,77, 4,69,70, 5,79,26, 5,79,28, 5,79,32, 4,69,71,
+ 5,79,14, 5,79,27, 5,79,22, 5,79,31, 7,50,31, 7,50,27, 7,50,32, 7,50,21,
+ 7,50,23, 0, 0, 0, 5,79,29, 5,79,21, 5,79,20, 5,79,35, 0, 0, 0, 0, 0, 0,
+ 7,50,24, 0, 0, 0,15,71,23, 0, 0, 0, 7,50,30, 0, 0, 0, 7,50,29, 7,50,25,
+ 0, 0, 0, 7,50,36, 7,50,33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,50,28,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,15,71,24, 0, 0, 0, 0, 0, 0, 5,79,33, 0, 0, 0,
+ 0, 0, 0, 7,37,58, 5,82,62, 7,54,89, 5,82,70, 7,54,94, 5,82,61, 5,82,64,
+ /* plane 2, page 161 */
+ 0, 255, /* first, last */
+ 5,82,59, 5,82,69, 5,82,68, 7,55, 1, 7,54,93, 7,54,90, 5,82,72, 7,55, 7,
+ 0, 0, 0, 7,55, 6, 7,55, 4, 5,82,60, 5,82,65, 5,79,37, 5,82,58, 5,82,66,
+ 7,55, 2, 7,54,92, 5,82,73, 5,82,74,15,73,20, 0, 0, 0, 0, 0, 0, 5,82,63,
+ 7,55, 3, 0, 0, 0, 0, 0, 0, 7,54,87, 7,55, 8, 0, 0, 0, 7,54,86, 0, 0, 0,
+ 7,54,91, 0, 0, 0, 0, 0, 0,15,73,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,82,56, 7,54,88, 5,82,57,15,71,22, 5,85,34, 5,85,29, 4,74, 4,
+ 4,74,13, 5,85,28, 4,74, 8, 5,85,35, 5,85,25, 5,79,38, 5,85,36, 5,85,32,
+ 5,85,31, 4,74,11, 0, 0, 0, 7,58,66, 7,58,76, 7,58,74, 7,58,80, 4,74,10,
+ 7,58,75, 7,58,78, 5,85,27, 4,74, 9, 7,58,73, 5,85,23, 7,58,72, 5,85,24,
+ 5,85,38, 5,82,71, 7,58,81, 5,85,33, 7,58,79, 7,58,71, 7,55, 5, 0, 0, 0,
+ 0, 0, 0,15,74,36,15,74,37,15,74,38,15,74,39,15,74,40, 5,85,30, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,58,70, 0, 0, 0, 7,58,68, 0, 0, 0, 0, 0, 0, 7,58,65,
+ 0, 0, 0, 7,58,67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,85,26, 7,62,11,
+ 7,62, 7, 7,62,17, 5,87,19, 7,62,15, 5,87,14, 5,87, 9, 4,75,35, 7,62,18,
+ 7,62,22, 5,87, 5, 5,87,16, 5,87,10, 5,87, 8, 5,87,15, 7,62,12, 5,87, 7,
+ 5,87, 6, 5,87,24, 5,87,11, 4,75,41, 4,75,34, 7,62,21, 5,87,17, 7,62,16,
+ 7,62,19, 5,87,13, 7,58,69, 5,87,21, 7,58,77, 7,62,20, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,87,22, 0, 0, 0, 0, 0, 0, 7,62,13,15,75,32, 7,62, 4, 7,62, 6,
+ 0, 0, 0, 0, 0, 0, 7,62,14, 0, 0, 0, 0, 0, 0, 7,62, 9, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,62, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,87,18, 7,62,10, 7,62, 5, 4,75,33,15,75,90, 7,62,23, 7,64,45, 5,88,71,
+ 5,88,73, 5,88,77, 5,88,69, 5,87,23, 5,88,72, 7,64,46, 5,88,74, 5,88,75,
+ 7,64,47, 7,64,48, 7,64,52, 5,88,76, 7,64,51, 7,64,44, 7,64,49, 5,88,67,
+ 0, 0, 0, 5,88,70, 5,88,66,15,75,89, 7,64,50, 0, 0, 0, 4,76,53, 0, 0, 0,
+ 0, 0, 0, 5,88,68, 4,76,51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5,89,81, 5,89,77, 5,89,80, 7,65,86, 4,77,27, 5,89,78, 5,89,76,
+ 4,77,28, 0, 0, 0, 7,65,84, 0, 0, 0, 5,89,79, 7,65,88, 0, 0, 0, 0, 0, 0,
+ 7,65,85, 7,65,87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,77,30, 5,90,56, 7,67,25, 5,90,54,
+ 4,77,75, 5,90,58, 5,90,57, 5,90,53, 5,90,55, 4,77,74, 7,67,24, 5,90,52,
+ 7,67,27, 5,90,59, 7,67,29,15,76,62, 7,67,26, 0, 0, 0, 0, 0, 0, 7,67,22,
+ /* plane 2, page 162 */
+ 1, 255, /* first, last */
+ 7,67,28, 0, 0, 0, 5,91,14, 7,68,20, 7,68,22, 5,91,15, 5,91,12,
+ 0, 0, 0, 5,91,11, 5,91,17, 5,91,16, 5,91,13, 7,68,23,15,76,86, 0, 0, 0,
+ 4,78,14, 0, 0, 0, 7,68,19, 7,68,21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,91,54, 7,69, 2, 7,69,51, 7,69, 4, 7,69, 6, 7,69, 3, 7,69, 7, 5,91,55,
+ 0, 0, 0, 0, 0, 0, 7,69, 5, 0, 0, 0, 4,78,34, 5,91,84, 7,69,52, 7,69,53,
+ 5,91,85, 7,69,50, 7,69,54, 7,69,49, 0, 0, 0, 0, 0, 0, 7,69,77, 7,69,76,
+ 5,92, 9, 5,92, 8,15,77,18, 0, 0, 0, 5,92,15, 7,70, 1, 0, 0, 0, 7,69,94,
+ 5,92,24, 7,70,16, 5,92,25, 7,70,26, 5,92,33,15,77,23, 0, 0, 0, 5,92,40,
+ 7,70,37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,40,81, 4,40,82,
+ 5,51,36, 7,12, 2, 7,12, 1, 7,11,94, 5,58,58, 5,58,60, 7,22,58, 7,22,59,
+ 15,57,33, 7,22,57, 0, 0, 0, 5,71,12, 7,30,57, 0, 0, 0, 4,66,81, 7,44,80,
+ 5,75,45, 7,44,81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,50,38, 5,79,40, 5,79,41,
+ 7,50,39, 5,79,39, 7,50,41, 7,50,40, 0, 0, 0, 4,72,37, 7,55,11, 7,55,10,
+ 5,82,75, 0, 0, 0, 7,58,83, 0, 0, 0, 7,58,82, 0, 0, 0, 0, 0, 0, 4,75,44,
+ 7,62,24, 7,62,25, 5,87,25, 7,64,53, 4,76,55, 0, 0, 0, 5,89,82, 4,77,31,
+ 7,67,30, 5,91,18, 0, 0, 0, 6,58,61,15,38,29, 5,43,76,15,45,50, 7,12, 8,
+ 5,51,37, 7,12, 7, 0, 0, 0, 7,12, 6, 7,12, 4, 5,51,38, 7,12, 5, 5,51,39,
+ 7,12, 9, 7,12, 3, 0, 0, 0, 7,22,61, 5,58,61, 0, 0, 0,15,57,34, 0, 0, 0,
+ 15,57,35,15,57,36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,64,79, 5,64,82, 5,64,80,
+ 4,58,60, 0, 0, 0, 5,64,83, 5,64,81, 7,30,59, 7,30,58, 0, 0, 0, 7,30,62,
+ 0, 0, 0, 7,30,61,15,62, 6, 5,64,78, 7,37,78, 5,71,17, 5,71,14, 5,71,13,
+ 7,37,75, 7,37,77, 7,37,74, 5,71,16, 7,37,76,15,65,88,15,65,89,15,65,90,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,71,15, 5,75,47, 5,75,46, 5,75,49, 4,66,83,
+ 7,44,83, 5,75,48, 0, 0, 0, 7,44,82, 0, 0, 0, 5,72,32, 7,50,43, 4,66,84,
+ 4,69,79, 7,44,84,15,71,25, 0, 0, 0, 7,50,42, 7,50,44, 5,79,42, 4,72,39,
+ 7,55,12, 7,55,13, 4,72,38,15,73,21, 5,85,39, 4,74,14,15,74,41, 0, 0, 0,
+ 0, 0, 0, 5,87,26, 5,87,28, 5,87,27, 0, 0, 0, 7,62,26, 0, 0, 0, 7,62,27,
+ 0, 0, 0, 0, 0, 0, 7,64,54, 4,76,56, 7,64,55,15,75,91, 5,89,85, 5,89,84,
+ 5,88,78, 0, 0, 0, 4,77,32, 4,77,76,15,76,39, 0, 0, 0, 0, 0, 0, 7,69, 8,
+ 7,69,55, 0, 0, 0, 5,92,38, 7,70,39, 6,58,63, 6,58,62, 5,36,51,15,38,31,
+ /* plane 2, page 163 */
+ 1, 255, /* first, last */
+ 4,40,85, 6,68,85,15,45,51, 0, 0, 0, 5,51,43, 5,51,42, 4,47,47,
+ 5,51,41, 5,51,40, 7,12,11, 7,12,15, 7,12,10, 4,47,46, 7,12,12, 0, 0, 0,
+ 5,51,44, 7,12,14, 7,12,13, 0, 0, 0, 7,22,65, 7,22,63, 7,22,62, 7,22,67,
+ 4,53,59, 0, 0, 0, 7,22,66, 6,39,51,15,57,37, 5,58,62, 0, 0, 0, 0, 0, 0,
+ 7,22,64, 0, 0, 0, 5,64,84, 5,64,85, 7,30,64, 7,30,65,15,62, 8, 0, 0, 0,
+ 7,30,66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,30,63, 7,37,80, 5,71,18, 7,37,82,
+ 5,71,19, 5,71,21, 7,37,83, 5,71,20,15,65,91, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,37,81, 0, 0, 0, 0, 0, 0, 7,37,79, 4,66,90, 4,66,88, 7,44,89, 7,44,91,
+ 7,44,85, 5,75,52, 5,75,50, 7,44,90, 5,75,53, 5,75,51, 7,44,88, 4,66,91,
+ 0, 0, 0, 7,44,87, 0, 0, 0, 7,44,86, 5,79,43, 7,50,51, 7,50,50, 5,79,44,
+ 7,50,48, 4,69,80, 7,50,47, 5,79,46, 5,79,45, 7,50,49,15,71,26, 0, 0, 0,
+ 7,50,46, 0, 0, 0, 7,50,45, 5,82,76, 7,55,15, 5,82,79, 7,55,16, 5,82,78,
+ 7,55,17, 7,55,14, 5,82,77, 5,85,43, 5,85,44, 7,58,84, 5,85,41, 5,85,46,
+ 7,58,91, 7,58,86, 7,58,87, 7,58,92, 7,58,89, 5,85,42, 7,58,85, 7,58,88,
+ 7,58,90, 0, 0, 0, 5,87,31, 4,75,47, 5,87,30, 5,87,32, 5,87,29, 0, 0, 0,
+ 5,88,79, 5,88,81, 5,88,80, 7,64,57, 7,62,28, 4,76,57, 7,64,56, 4,77,77,
+ 7,67,31, 7,68,25, 7,68,24, 5,91,56, 7,69, 9, 0, 0, 0, 4,78,50, 5,92,16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,15, 9, 1,15,38,30,15,51,34,
+ 15,62, 7, 0, 0, 0, 5,43,80, 5,43,78, 5,43,79, 5,51,46, 4,47,48, 5,51,45,
+ 0, 0, 0, 0, 0, 0, 7,12,16, 5,58,65, 7,22,68, 5,58,63, 5,58,64,15,57,38,
+ 5,64,88, 5,64,86,15,62, 9, 5,64,87, 5,71,22, 7,44,92, 5,75,54, 7,44,93,
+ 4,69,83, 0, 0, 0, 7,55,18, 5,82,80, 7,58,94, 4,75,48, 7,59,54, 7,62,29,
+ 4,75,49, 0, 0, 0, 5,92,17,15,45,52, 7,12,18, 5,58,66, 5,58,68, 0, 0, 0,
+ 0, 0, 0, 5,58,67, 5,64,90, 5,71,24, 0, 0, 0, 5,64,89, 5,71,25, 0, 0, 0,
+ 0, 0, 0, 5,71,23, 5,75,55, 4,67, 2,15,68,89, 0, 0, 0, 4,69,85, 4,69,84,
+ 5,79,48, 5,79,47, 4,69,87, 7,50,52, 7,50,53, 7,50,54,15,71,27, 0, 0, 0,
+ 0, 0, 0, 7,50,55, 0, 0, 0, 5,82,83, 5,82,82, 5,82,81, 7,55,19, 0, 0, 0,
+ 7,55,20, 5,85,47, 4,74,15, 4,74,16, 7,59, 3, 7,59, 2, 7,59, 1, 0, 0, 0,
+ 0, 0, 0, 7,62,30, 0, 0, 0, 0, 0, 0, 5,88,82, 7,64,58, 5,88,83, 7,65,89,
+ 5,89,86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,70, 7, 4,40,86, 5,51,47, 4,47,49,
+ 7,22,72, 7,22,70, 5,58,70, 5,58,69, 5,58,71, 0, 0, 0, 5,64,94, 7,30,68,
+ 5,64,92, 7,30,67, 5,64,91, 4,58,62, 5,64,93, 7,30,69, 7,30,70, 5,71,27,
+ /* plane 2, page 164 */
+ 0, 255, /* first, last */
+ 5,71,26, 0, 0, 0, 4,69,88, 5,79,49, 5,79,51, 0, 0, 0, 0, 0, 0, 5,82,84,
+ 7,55,22, 7,55,21,15,73,22, 5,85,48, 4,75,52, 5,87,34, 5,87,33, 4,75,51,
+ 0, 0, 0, 7,67,32, 7,65,90, 4,77,78, 5,91,58, 7,69,10, 5,91,57, 6,68,86,
+ 5,36,52, 6,68,88, 0, 0, 0, 6,68,87, 7,12,20, 4,47,53, 4,47,52, 5,51,48,
+ 7,12,21, 7,12,22, 0, 0, 0, 0, 0, 0, 7,22,74, 5,58,74, 5,58,72, 5,58,73,
+ 7,22,73, 0, 0, 0, 7,22,75, 7,22,76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,58,64, 7,30,72, 5,65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15,62,10, 7,30,71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,71,30,
+ 5,71,28, 7,37,84, 5,75,56, 5,65, 2, 5,71,31, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5,75,58, 5,75,57, 5,75,59, 5,75,61, 5,75,60, 7,45, 1, 7,44,94, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,79,54, 5,79,55, 7,50,59, 5,79,59, 5,79,57, 5,79,53,
+ 7,50,56, 4,69,94, 4,69,91, 7,50,60, 5,79,58, 4,69,90, 7,50,58, 0, 0, 0,
+ 0, 0, 0,15,71,28, 0, 0, 0, 7,50,57, 0, 0, 0, 7,55,24, 4,72,51, 4,72,49,
+ 5,82,88, 4,72,48, 5,82,91, 7,55,23, 5,82,85, 5,82,89, 5,82,87, 4,72,52,
+ 5,82,86, 4,72,53, 4,74,20, 7,55,25, 7,55,26, 0, 0, 0, 0, 0, 0, 5,82,90,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,85,49, 4,74,19,
+ 4,74,21, 7,59,10, 7,59, 7, 7,59, 6, 4,74,18, 7,59, 9, 0, 0, 0, 0, 0, 0,
+ 7,59, 8, 0, 0, 0, 0, 0, 0, 5,85,50, 7,59, 5, 0, 0, 0, 0, 0, 0, 5,87,39,
+ 7,62,33, 5,87,38, 5,87,36, 5,87,37, 5,87,35, 5,87,40, 7,62,31, 0, 0, 0,
+ 5,88,86, 5,88,87, 7,64,61, 4,76,60, 4,76,64, 5,88,85, 7,64,60, 5,88,84,
+ 4,76,63, 4,76,62, 4,76,61, 7,62,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,64,59,
+ 0, 0, 0, 5,89,88, 5,89,89, 5,89,90, 5,89,87, 4,77,37, 7,65,91, 7,65,92,
+ 4,77,38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,90,60, 7,68,26, 0, 0, 0, 0, 0, 0,
+ 7,69,11, 4,78,16, 7,68,27, 5,91,19, 0, 0, 0, 0, 0, 0, 4,78,15, 5,91,59,
+ 5,91,60, 7,69,12, 0, 0, 0, 4,78,42, 5,91,86, 0, 0, 0, 7,69,78, 0, 0, 0,
+ 0, 0, 0, 5,92,42, 7,70,50, 7,37,85, 4,70, 2, 0, 0, 0, 5,82,92, 4,72,55,
+ 5,87,41, 6,68,89, 7,12,24, 7,12,23, 5,65, 4, 7,22,77, 4,58,65, 7,30,73,
+ 7,30,74, 0, 0, 0, 7,37,88, 5,71,34, 7,37,89, 7,37,87, 7,37,86, 4,63,33,
+ 0, 0, 0, 7,45, 4, 7,45, 5, 0, 0, 0, 7,30,75, 7,45, 3, 0, 0, 0, 7,50,62,
+ 7,50,63, 7,50,61, 0, 0, 0, 0, 0, 0, 5,82,93, 7,55,27, 4,74,22, 7,59,12,
+ 7,59,17, 7,59,18, 7,59,14, 7,59,16, 7,59,13, 7,59,11, 7,59,15, 5,87,42,
+ 7,62,34, 5,88,88, 0, 0, 0, 5,89,91, 5,90,61, 4,77,39, 7,67,33, 5,91,20,
+ /* plane 2, page 165 */
+ 0, 255, /* first, last */
+ 7,67,34, 7,69,13, 6,48,47, 0, 0, 0, 7,22,78, 7,22,79, 5,58,75, 0, 0, 0,
+ 7,38,47, 0, 0, 0, 7,69,14, 5,58,76, 0, 0, 0, 5,65, 5, 7,30,77, 5,71,35,
+ 7,37,90, 5,71,36,15,65,93, 0, 0, 0, 7,45, 7, 5,75,64, 7,45, 6, 5,75,62,
+ 5,75,63, 0, 0, 0, 0, 0, 0, 4,67, 5, 4,70, 3, 7,50,64, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 4,74,25, 4,72,56, 7,55,28, 7,55,29, 5,85,51, 7,59,20,
+ 7,59,21, 5,85,53, 4,74,24, 7,59,19, 5,85,52, 0, 0, 0, 7,62,35, 7,64,62,
+ 5,88,89, 7,64,63, 0, 0, 0, 5,89,92, 0, 0, 0, 7,67,35, 5,91,21, 5,91,87,
+ 7,12,25, 0, 0, 0, 5,58,77, 7,30,78, 5,58,78, 5,65, 8, 5,65,10, 5,65,11,
+ 5,65, 9, 5,65, 7, 7,30,80, 5,65, 6, 7,30,79, 0, 0, 0, 5,65,12, 0, 0, 0,
+ 4,58,66, 7,37,92, 7,45,12, 5,71,39, 5,71,40, 5,71,38, 5,71,37, 7,37,91,
+ 0, 0, 0, 7,45,10, 5,75,65, 5,75,67, 5,75,66, 0, 0, 0, 0, 0, 0, 7,45,13,
+ 7,45,14, 7,45, 9, 7,50,66, 7,50,68, 7,50,67, 5,79,61, 5,79,62, 7,45,11,
+ 0, 0, 0, 7,50,69, 0, 0, 0, 0, 0, 0, 5,79,60, 0, 0, 0, 0, 0, 0, 7,50,65,
+ 5,83, 1, 5,82,94, 7,55,30, 5,85,55, 7,59,22, 5,85,56, 5,85,57, 5,85,54,
+ 0, 0, 0, 4,74,26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,62,36, 5,87,43, 4,75,57,
+ 7,62,40, 4,75,55, 4,75,58, 7,62,39, 0, 0, 0, 7,62,38, 7,62,37, 5,88,93,
+ 4,76,67, 5,88,91, 5,88,90, 7,64,64, 0, 0, 0, 7,65,94, 7,65,93, 4,77,41,
+ 5,89,93, 0, 0, 0, 0, 0, 0, 5,91,22, 5,91,89, 5,91,88, 7,69,79, 7,70, 2,
+ 4,47,55, 7,22,80, 7,22,81, 7,30,82, 7,30,81, 5,71,41, 7,37,94, 7,38, 1,
+ 7,37,93, 0, 0, 0, 5,75,68, 5,75,69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7,50,70, 5,79,63, 5,79,64, 7,50,72, 4,72,59, 5,83, 2, 7,55,31,
+ 7,55,32, 5,83, 3, 5,83, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,59,23, 5,87,44,
+ 7,62,41, 0, 0, 0, 0, 0, 0, 5,88,92,15,75,94, 7,64,65, 5,89,94, 5,90, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,67,38, 5,90,62, 7,67,37, 7,68,28, 0, 0, 0,
+ 0, 0, 0, 4,78,51, 5,92,18, 0, 0, 0,15,32,20, 4,53,68, 4,58,69, 7,38, 2,
+ 0, 0, 0, 4,67, 8, 7,45,15, 5,77,55, 4,70, 4, 4,74,27,15,73,23, 5,90, 3,
+ 5,90, 2, 7,66, 1, 7,69,15, 0, 0, 0, 5,65,14, 7,30,83, 0, 0, 0, 0, 0, 0,
+ 7,38, 5, 4,63,39, 7,38, 4, 7,45,16, 5,75,70, 4,67,10, 7,45,17, 7,45,20,
+ 7,45,18, 7,45,19, 7,45,21, 7,45,22, 5,75,71, 7,50,75, 5,79,67, 5,79,66,
+ 4,70, 8, 7,50,73, 4,70,10, 7,50,77, 4,70, 9, 7,50,78, 0, 0, 0, 7,50,74,
+ 0, 0, 0, 0, 0, 0, 4,40,88, 0, 0, 0, 0, 0, 0, 7,50,76, 7,55,38, 5,83,10,
+ 5,83, 7, 7,55,35, 7,55,34, 4,72,62, 5,83, 8, 4,72,63, 4,72,61, 7,55,36,
+ /* plane 2, page 166 */
+ 0, 214, /* first, last */
+ 5,83, 5, 5,83,11, 0, 0, 0, 0, 0, 0, 7,55,37, 7,55,39, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,83, 9, 7,55,33, 0, 0, 0, 5,83, 6, 7,59,24, 4,74,30,
+ 5,85,60, 5,85,59, 5,85,62, 7,59,32, 7,59,31, 5,85,63, 7,59,26, 5,85,64,
+ 4,74,31, 0, 0, 0, 0, 0, 0, 7,59,25, 5,85,58, 0, 0, 0, 0, 0, 0, 7,59,27,
+ 7,59,29, 7,59,30, 7,59,28, 0, 0, 0, 5,85,61, 5,87,47, 5,87,46, 4,75,62,
+ 4,75,66, 4,75,67, 4,75,63, 0, 0, 0, 4,75,64, 5,87,48, 7,62,46, 0, 0, 0,
+ 7,62,44, 0, 0, 0, 4,75,61, 0, 0, 0, 7,62,42, 0, 0, 0, 7,62,43, 7,62,47,
+ 4,75,68, 4,76,71, 5,88,94, 7,64,71, 4,76,72, 7,64,69, 5,89, 1, 7,66, 3,
+ 4,76,69, 7,64,67, 7,64,70, 7,64,68, 0, 0, 0, 0, 0, 0, 7,64,66, 7,64,72,
+ 5,89, 2, 4,77,46, 4,77,42, 7,66, 5, 5,90, 6, 4,77,48, 4,77,45, 5,90, 4,
+ 7,66, 7, 4,77,47, 7,66, 4, 7,66, 6, 0, 0, 0, 0, 0, 0, 7,66, 8, 7,66, 9,
+ 7,66, 2, 5,90, 5, 7,67,40, 5,90,64, 7,67,39, 5,90,66, 5,90,63, 5,90,65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,68,30, 4,78,18, 7,68,29, 5,91,23, 5,91,25,
+ 0, 0, 0, 5,91,24, 7,68,32, 0, 0, 0, 7,68,33, 0, 0, 0, 7,68,31, 0, 0, 0,
+ 4,78,38, 0, 0, 0, 7,69,18, 5,91,61, 7,69,17, 7,69,16, 7,69,57, 7,69,81,
+ 7,69,82, 5,92,10, 0, 0, 0, 7,69,80, 7,69,83, 5,92,19, 0, 0, 0, 7,70, 4,
+ 7,70, 3, 5,92,27, 7,70,18, 5,92,26, 7,70,17, 0, 0, 0, 7,70,29, 0, 0, 0,
+ 7,70,28, 5,92,37, 0, 0, 0, 7,70,33, 7,70,40, 5,92,46, 5,92,45, 0, 0, 0,
+ 0, 0, 0, 5,75,72, 7,45,23, 4,67,12, 0, 0, 0, 7,50,80, 7,50,79, 7,46, 4,
+ 5,79,68, 7,55,40, 0, 0, 0,15,71,29, 7,59,34, 7,59,33, 7,59,35, 7,59,36,
+ 5,87,49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,92,49, 7,22,82, 7,30,84,
+ 7,38, 6, 0, 0, 0, 0, 0, 0, 7,55,41, 5,79,69, 4,70,11, 5,79,71, 5,79,70,
+ 4,70,12, 7,50,83, 0, 0, 0, 7,50,81,15,71,30, 7,50,82, 5,83,12, 5,83,14,
+ 7,55,43, 5,83,15, 5,75,74, 5,83,13, 7,52,10, 7,55,42, 7,45,25, 7,45,24,
+ 5,91,62, 7,65, 9, 5,91,26, 5,87,50, 7,68,34, 0, 0, 0,15,77,13, 0, 0, 0,
+ 5,92,34,15, 9, 6, 5,83,16, 7,66,11, 0, 0, 0, 7,66,10, 5,90,68, 5,90,67,
+ 7,67,42, 7,67,41, 5,91,27, 4,78,39, 7,70, 5, 4,78,54, 7,70,44,
+ /* plane 2, page 167: --- */
+ /* plane 2, page 168: --- */
+ /* plane 2, page 169: --- */
+ /* plane 2, page 170: --- */
+ /* plane 2, page 171: --- */
+ /* plane 2, page 172: --- */
+ /* plane 2, page 173: --- */
+ /* plane 2, page 174: --- */
+ /* plane 2, page 175: --- */
+ /* plane 2, page 176: --- */
+ /* plane 2, page 177: --- */
+ /* plane 2, page 178: --- */
+ /* plane 2, page 179: --- */
+ /* plane 2, page 180: --- */
+ /* plane 2, page 181: --- */
+ /* plane 2, page 182: --- */
+ /* plane 2, page 183: --- */
+ /* plane 2, page 184: --- */
+ /* plane 2, page 185: --- */
+ /* plane 2, page 186: --- */
+ /* plane 2, page 187: --- */
+ /* plane 2, page 188: --- */
+ /* plane 2, page 189: --- */
+ /* plane 2, page 190: --- */
+ /* plane 2, page 191: --- */
+ /* plane 2, page 192: --- */
+ /* plane 2, page 193: --- */
+ /* plane 2, page 194: --- */
+ /* plane 2, page 195: --- */
+ /* plane 2, page 196: --- */
+ /* plane 2, page 197: --- */
+ /* plane 2, page 198: --- */
+ /* plane 2, page 199: --- */
+ /* plane 2, page 200: --- */
+ /* plane 2, page 201: --- */
+ /* plane 2, page 202: --- */
+ /* plane 2, page 203: --- */
+ /* plane 2, page 204: --- */
+ /* plane 2, page 205: --- */
+ /* plane 2, page 206: --- */
+ /* plane 2, page 207: --- */
+ /* plane 2, page 208: --- */
+ /* plane 2, page 209: --- */
+ /* plane 2, page 210: --- */
+ /* plane 2, page 211: --- */
+ /* plane 2, page 212: --- */
+ /* plane 2, page 213: --- */
+ /* plane 2, page 214: --- */
+ /* plane 2, page 215: --- */
+ /* plane 2, page 216: --- */
+ /* plane 2, page 217: --- */
+ /* plane 2, page 218: --- */
+ /* plane 2, page 219: --- */
+ /* plane 2, page 220: --- */
+ /* plane 2, page 221: --- */
+ /* plane 2, page 222: --- */
+ /* plane 2, page 223: --- */
+ /* plane 2, page 224: --- */
+ /* plane 2, page 225: --- */
+ /* plane 2, page 226: --- */
+ /* plane 2, page 227: --- */
+ /* plane 2, page 228: --- */
+ /* plane 2, page 229: --- */
+ /* plane 2, page 230: --- */
+ /* plane 2, page 231: --- */
+ /* plane 2, page 232: --- */
+ /* plane 2, page 233: --- */
+ /* plane 2, page 234: --- */
+ /* plane 2, page 235: --- */
+ /* plane 2, page 236: --- */
+ /* plane 2, page 237: --- */
+ /* plane 2, page 238: --- */
+ /* plane 2, page 239: --- */
+ /* plane 2, page 240: --- */
+ /* plane 2, page 241: --- */
+ /* plane 2, page 242: --- */
+ /* plane 2, page 243: --- */
+ /* plane 2, page 244: --- */
+ /* plane 2, page 245: --- */
+ /* plane 2, page 246: --- */
+ /* plane 2, page 247: --- */
+ /* plane 2, page 248 */
+ 0, 255, /* first, last */
+ 6, 9,22, 6, 1,17, 6, 1, 1, 6, 5,70, 6, 5,82, 4, 5,29, 6,14,65,15,13,72,
+ 6,29,21, 6,48,59, 4,28,16, 6,58,82,15,57,45, 6, 3,50, 3, 4,50, 3, 7,51,
+ 15,71,32, 3, 7,52, 6,29,28, 7,45,30, 6, 1,48, 3, 2,91, 6, 3,57, 3, 1,47,
+ 6,21,36, 4, 1,31, 6, 2,28, 3, 4,33, 7,22,90, 5, 1, 9, 6, 1,24,15, 3,23,
+ 6, 9,67, 6,14,86, 6,38,71, 3,32,35,15, 2, 9, 6,15, 5, 6,21,56, 4,22,44,
+ 4, 1,15, 6, 2,38, 3, 2, 5, 6, 2,41, 3, 3, 9, 6,15,24, 6,38,84, 6,10, 3,
+ 6,15,29, 6,29,57, 6,29,58, 3,26, 6,15, 1,19, 3, 4, 9, 6, 1,65, 6, 6,35,
+ 5,17,17, 6, 2,59, 5, 1,64, 3, 3,28, 4, 3,60, 6, 6,46, 4, 3,59, 6,10,28,
+ 0, 0, 0, 3,16, 3, 6,21,94, 4,16,86, 6,29,92, 6,39,10, 6,39,12, 6,39,16,
+ 6,39,17, 6,39,19, 4,28,48, 6,59,59, 6,49,22, 6,59,57, 7, 1,64, 7,12,69,
+ 3, 1,92, 6, 4,19, 6,22,21, 6,30,12, 6,30,11, 3,20,80, 4,22,86, 6,49,42,
+ 7, 1,86, 7,38,30,15, 3,59, 6,49,55, 5, 3,66, 6, 4,27, 6,49,62, 6,39,54,
+ 6, 2,71,15,10,11, 6,22,44, 6,22,45,15,14,77, 6,30,52, 6,30,48, 6,39,65,
+ 6,49,73,15,39,38, 3,58,19, 7,38,49, 6, 4,40, 4,17,16,15,33,11, 6,60, 2,
+ 3,58,22, 7,64,77, 6, 7, 1, 6,22,71, 6, 4,43, 4, 1,20, 5, 8,83, 6,39,91,
+ 4, 1,21,15, 6,66, 3,12,32, 6,16,46, 6,40,11, 6,40,21, 3,32,94, 6,50,19,
+ 6,60,29, 6, 7,22, 6,60,41,15, 1,63, 6,40,23, 6,23,12, 6,40,28, 7,13,51,
+ 7,13,53, 7,64,78, 5, 9, 7, 6,31,38, 6,31,37, 3,21,63, 6,50,32, 5,37,61,
+ 6, 1,84, 6, 7,42, 6,11,15, 6,16,84, 0, 0, 0,15,10,61, 6,11,25, 7,13,67,
+ 5,83,32, 3,12,49, 6,31,62, 5,13,40, 3,21,69, 6, 7,63,15, 4,19, 5, 4,24,
+ 6,17,22, 6,17,16,15,10,71, 4, 9,42, 6,40,92, 6,40,88, 3,38,80, 6,50,76,
+ 6,50,70, 6,61, 6, 6,61, 4, 4,35,49, 7,13,73, 7,13,89, 7, 2,91, 3,52,64,
+ 4,59,12, 7,39, 8, 3, 6, 7, 6,32, 3, 5, 2,78, 6,11,67, 6,11,64, 6,17,47,
+ 15,11,11, 6,23,81, 3,22, 8, 6,32,22, 6,32,11, 6,41,42, 6,41,16,15,33,63,
+ 7, 3,16, 6,61,24, 5,38,12, 7, 3,13,15,47, 5, 4,42, 7, 7,24,25,15,62,80,
+ 4,13,38, 6,41,55,15,58,22, 3,22,32, 6,24,22, 0, 0, 0,15,33,82, 6,51,28,
+ 5,38,33,15,11,24, 6,17,77, 6,32,55, 6,41,88, 6,61,59, 6,12, 3, 5, 6,42,
+ 4,18,30, 6,32,56, 5,31,70, 4, 4,39, 6, 8,14,15, 4,49, 4, 6,72, 3,13,21,
+ 6,24,42, 3,17,60, 4,13,60, 6,24,48, 5,18,94, 3,28,26, 6,51,62, 5,31,81,
+ 3,33,78, 6,61,72, 7, 3,82,15,52,84, 7,14,74, 4,63,86, 7,56, 3, 6, 5, 3,
+ 6,42,31, 7, 3,88, 7,62,82,15,40,89, 6,51,87, 4,13,69,15,21,84, 6,42,45,
+ 6,12,34,15,40,91, 6, 5,14,15, 4,61, 6,12,59, 6,12,49, 3,13,50, 6,18,25,
+ /* plane 2, page 249 */
+ 0, 255, /* first, last */
+ 6,18,34, 4,10, 5, 4,13,80, 6,25,13, 6,24,84, 6,25, 1,15,16,59, 3,22,85,
+ 6,42,69, 6,42,67, 4,30,19, 6,52,41, 6,52,47,15,34,84, 6,62,30, 7, 4,47,
+ 7, 4,56,15,47,73, 7,15,34,15,53,54, 4,54,61, 7,46, 8, 7,51,64, 7,51,56,
+ 6,12,64, 6,12,61, 6,18,40, 4,24,72,15,35,15, 6,52,57,15,48,29,15,53,56,
+ 5,91,91, 3,53,37, 6,33,65, 6,33,67, 6,33,74, 6,62,62, 6,18,66, 6,43,34,
+ 7,39,85, 6, 2, 6,15, 4,88, 6,13, 4,15,12,25,15,17, 8, 6,43,39,15,35,68,
+ 4,36,78, 7,32,67,15,67, 4, 6,34, 1, 3,29,31, 6,18,89, 4,10,36, 5,19,69,
+ 6,43,54, 4,30,76, 6,34,18,15,42,15, 7,51,91, 6,13,26, 5,19,81,15,54,28,
+ 6,13,37, 6,13,29, 6,19,29, 6,19,17, 5,15, 6,15,12,55, 6,26,13, 6,26,14,
+ 6,34,40, 6,43,90,15,48,63, 7,16,42, 6, 5,31, 6,13,38, 3,35,19, 6,53,75,
+ 7, 5,91, 7,25,77,15, 8,28, 6,19,42,15,29,64, 4,43,64, 7, 6, 7, 6,26,35,
+ 0, 0, 0, 4,37,63, 4,50, 1, 7,16,70, 6,63,85, 7, 6,30, 7, 6,28, 7,16,83,
+ 15,42,91, 6,64, 3,15,49, 3, 7, 6,45, 7,33,28, 5,76,93, 7,17,13, 7,26,19,
+ 4,60,57, 7,33,36, 3,14,54, 6,19,70, 3,40,74,15,49,23, 7, 6,74, 7, 6,73,
+ 4,68, 6, 7,66,45, 6,44,82, 7,26,38,15,30,18, 7,26,41, 7,40,77, 7,63,28,
+ 6,45, 3,15,55, 7, 4,11, 6, 7, 7, 8,15,55, 8, 6,64,61, 5,40,84,15,60,13,
+ 6, 8,91, 4, 7,72, 6,13,73, 3,19,48, 5,27,48, 6,45,40,15,36,72,15,43,55,
+ 15,43,54, 4,44,54, 4,56,13, 4,20,55, 6,45,62, 3,36, 5, 6,65, 5, 3, 7,10,
+ 6, 5,50, 6, 9, 7,15, 8,60, 6, 9, 8, 0, 0, 0, 6,14, 2, 6,14, 3, 6,20,36,
+ 6,14, 4, 6,27,50,15,18,26, 4,20,83, 6,36,11, 4,20,84, 6,35,86, 6,36,27,
+ 4,26,70, 6,36,30, 6,36,28, 6,36,29, 6,46,27, 6,65,30, 6,65,47,15,49,68,
+ 4,44,89, 7, 7,65, 7, 7,77, 7,18,36,15,55,39, 7,26,79,15,64,61, 7,34,28,
+ 7,52,62, 4,71,11, 0, 0, 0, 6,20,39, 4,32,47, 7,27,24, 3,59, 6, 6,27,81,
+ 4,26,85, 6,46,38, 4,38,92, 4,45,19,15,50, 4, 7, 8,14,15,49,93, 7,34,64,
+ 7,34,63, 3,59,13, 4,68,31, 4,51,44, 6, 5,51, 5,16,30, 6,56,14, 6,56,12,
+ 15,37,29, 7,27,65,15,24,42, 5,90,24, 6,28,13, 4,21,37,15,31,27, 6,66,39,
+ 7,19,47, 7,57,33, 6, 9,10, 6,56,48, 0, 0, 0, 6,56,60, 3,64,92, 6,28,27,
+ 7,19,89, 7,19,83,15,31,51, 3,36,77, 7, 9,36, 6,20,61, 4,16,12, 7,20,17,
+ 4,52,23, 7,28,65, 6, 5,59, 4,21,82, 6,57,39, 6,57,42, 7,28,75,15,37,83,
+ 6,67,51, 6,67,47, 4,52,42,15,70,62, 7,48,75,15,76,31, 6,67,56, 7,20,90,
+ 7,20,81,15,65,42, 6,48, 2, 6,67,78, 7,21,21, 3,54,88, 5,63,62, 7,29,48,
+ 15,56,88, 7,43,63, 4,69,10, 7,43,75, 5,29,39, 5,36,21, 6,58,19, 6,68,16,
+ /* plane 2, page 250 */
+ 0, 29, /* first, last */
+ 4,57,86, 6,68,26, 6,28,87, 6,58,29, 4,53, 3, 4,62,64, 6,68,48, 7,30, 9,
+ 7,11,53,15,57,18, 7,49,90, 7,58,64, 4,58,57, 7,37,69, 4,63,23, 4,66,78,
+ 7,50,37, 5,85,22, 5,85,21,15,76,87, 7,30,60, 6,38,30, 4,72,47, 6,58,64,
+ 4, 8,20, 3,60,15, 5,51,49, 7,45, 8, 4,40,87, 7,62,45,
+ /* plane 2, page 251: --- */
+ /* plane 2, page 252: --- */
+ /* plane 2, page 253: --- */
+ /* plane 2, page 254: --- */
+ /* plane 2, page 255: --- */
+ /* plane 3: --- */
+ /* plane 4: --- */
+ /* plane 5: --- */
+ /* plane 6: --- */
+ /* plane 7: --- */
+ /* plane 8: --- */
+ /* plane 9: --- */
+ /* plane 10: --- */
+ /* plane 11: --- */
+ /* plane 12: --- */
+ /* plane 13: --- */
+ /* plane 14: --- */
+ /* plane 15: --- */
+ /* plane 16: --- */
+};
+
+static sal_Int32 const aImplUnicodeToCns116431992PageOffsets[] = {
+ 0, /* plane 0, page 0; 20/245 bytes (8.2%) */
+ -1, /* plane 0, page 1 */
+ 245, /* plane 0, page 2; 17/59 bytes (28.8%) */
+ 304, /* plane 0, page 3; 146/173 bytes (84.4%) */
+ -1, /* plane 0, page 4 */
+ -1, /* plane 0, page 5 */
+ -1, /* plane 0, page 6 */
+ -1, /* plane 0, page 7 */
+ -1, /* plane 0, page 8 */
+ -1, /* plane 0, page 9 */
+ -1, /* plane 0, page 10 */
+ -1, /* plane 0, page 11 */
+ -1, /* plane 0, page 12 */
+ -1, /* plane 0, page 13 */
+ -1, /* plane 0, page 14 */
+ -1, /* plane 0, page 15 */
+ -1, /* plane 0, page 16 */
+ -1, /* plane 0, page 17 */
+ -1, /* plane 0, page 18 */
+ -1, /* plane 0, page 19 */
+ -1, /* plane 0, page 20 */
+ -1, /* plane 0, page 21 */
+ -1, /* plane 0, page 22 */
+ -1, /* plane 0, page 23 */
+ -1, /* plane 0, page 24 */
+ -1, /* plane 0, page 25 */
+ -1, /* plane 0, page 26 */
+ -1, /* plane 0, page 27 */
+ -1, /* plane 0, page 28 */
+ -1, /* plane 0, page 29 */
+ -1, /* plane 0, page 30 */
+ -1, /* plane 0, page 31 */
+ 477, /* plane 0, page 32; 41/134 bytes (30.6%) */
+ 611, /* plane 0, page 33; 95/455 bytes (20.9%) */
+ 1066, /* plane 0, page 34; 59/515 bytes (11.5%) */
+ -1, /* plane 0, page 35 */
+ 1581, /* plane 0, page 36; 161/380 bytes (42.4%) */
+ 1961, /* plane 0, page 37; 164/692 bytes (23.7%) */
+ 2653, /* plane 0, page 38; 20/188 bytes (10.6%) */
+ -1, /* plane 0, page 39 */
+ -1, /* plane 0, page 40 */
+ -1, /* plane 0, page 41 */
+ -1, /* plane 0, page 42 */
+ -1, /* plane 0, page 43 */
+ -1, /* plane 0, page 44 */
+ -1, /* plane 0, page 45 */
+ -1, /* plane 0, page 46 */
+ -1, /* plane 0, page 47 */
+ 2841, /* plane 0, page 48; 89/758 bytes (11.7%) */
+ 3599, /* plane 0, page 49; 113/113 bytes (100.0%) */
+ 3712, /* plane 0, page 50; 5/5 bytes (100.0%) */
+ 3717, /* plane 0, page 51; 35/218 bytes (16.1%) */
+ 3935, /* plane 0, page 52; 548/767 bytes (71.4%) */
+ 4702, /* plane 0, page 53; 623/770 bytes (80.9%) */
+ 5472, /* plane 0, page 54; 653/767 bytes (85.1%) */
+ 6239, /* plane 0, page 55; 692/767 bytes (90.2%) */
+ 7006, /* plane 0, page 56; 662/770 bytes (86.0%) */
+ 7776, /* plane 0, page 57; 698/767 bytes (91.0%) */
+ 8543, /* plane 0, page 58; 662/764 bytes (86.6%) */
+ 9307, /* plane 0, page 59; 641/767 bytes (83.6%) */
+ 10074, /* plane 0, page 60; 695/770 bytes (90.3%) */
+ 10844, /* plane 0, page 61; 647/770 bytes (84.0%) */
+ 11614, /* plane 0, page 62; 674/770 bytes (87.5%) */
+ 12384, /* plane 0, page 63; 716/767 bytes (93.4%) */
+ 13151, /* plane 0, page 64; 710/770 bytes (92.2%) */
+ 13921, /* plane 0, page 65; 704/767 bytes (91.8%) */
+ 14688, /* plane 0, page 66; 740/770 bytes (96.1%) */
+ 15458, /* plane 0, page 67; 707/770 bytes (91.8%) */
+ 16228, /* plane 0, page 68; 698/770 bytes (90.6%) */
+ 16998, /* plane 0, page 69; 740/770 bytes (96.1%) */
+ 17768, /* plane 0, page 70; 725/770 bytes (94.2%) */
+ 18538, /* plane 0, page 71; 716/770 bytes (93.0%) */
+ 19308, /* plane 0, page 72; 719/770 bytes (93.4%) */
+ 20078, /* plane 0, page 73; 668/767 bytes (87.1%) */
+ 20845, /* plane 0, page 74; 755/770 bytes (98.1%) */
+ 21615, /* plane 0, page 75; 746/770 bytes (96.9%) */
+ 22385, /* plane 0, page 76; 716/770 bytes (93.0%) */
+ 23155, /* plane 0, page 77; 515/548 bytes (94.0%) */
+ 23703, /* plane 0, page 78; 599/770 bytes (77.8%) */
+ 24473, /* plane 0, page 79; 692/770 bytes (89.9%) */
+ 25243, /* plane 0, page 80; 734/770 bytes (95.3%) */
+ 26013, /* plane 0, page 81; 704/767 bytes (91.8%) */
+ 26780, /* plane 0, page 82; 716/770 bytes (93.0%) */
+ 27550, /* plane 0, page 83; 704/770 bytes (91.4%) */
+ 28320, /* plane 0, page 84; 689/770 bytes (89.5%) */
+ 29090, /* plane 0, page 85; 683/770 bytes (88.7%) */
+ 29860, /* plane 0, page 86; 710/770 bytes (92.2%) */
+ 30630, /* plane 0, page 87; 692/770 bytes (89.9%) */
+ 31400, /* plane 0, page 88; 713/770 bytes (92.6%) */
+ 32170, /* plane 0, page 89; 731/770 bytes (94.9%) */
+ 32940, /* plane 0, page 90; 731/770 bytes (94.9%) */
+ 33710, /* plane 0, page 91; 734/770 bytes (95.3%) */
+ 34480, /* plane 0, page 92; 674/770 bytes (87.5%) */
+ 35250, /* plane 0, page 93; 722/770 bytes (93.8%) */
+ 36020, /* plane 0, page 94; 716/770 bytes (93.0%) */
+ 36790, /* plane 0, page 95; 740/770 bytes (96.1%) */
+ 37560, /* plane 0, page 96; 692/770 bytes (89.9%) */
+ 38330, /* plane 0, page 97; 749/770 bytes (97.3%) */
+ 39100, /* plane 0, page 98; 707/770 bytes (91.8%) */
+ 39870, /* plane 0, page 99; 686/767 bytes (89.4%) */
+ 40637, /* plane 0, page 100; 719/761 bytes (94.5%) */
+ 41398, /* plane 0, page 101; 731/770 bytes (94.9%) */
+ 42168, /* plane 0, page 102; 734/770 bytes (95.3%) */
+ 42938, /* plane 0, page 103; 716/770 bytes (93.0%) */
+ 43708, /* plane 0, page 104; 668/770 bytes (86.8%) */
+ 44478, /* plane 0, page 105; 692/770 bytes (89.9%) */
+ 45248, /* plane 0, page 106; 728/770 bytes (94.5%) */
+ 46018, /* plane 0, page 107; 731/770 bytes (94.9%) */
+ 46788, /* plane 0, page 108; 695/770 bytes (90.3%) */
+ 47558, /* plane 0, page 109; 683/770 bytes (88.7%) */
+ 48328, /* plane 0, page 110; 704/770 bytes (91.4%) */
+ 49098, /* plane 0, page 111; 746/770 bytes (96.9%) */
+ 49868, /* plane 0, page 112; 710/770 bytes (92.2%) */
+ 50638, /* plane 0, page 113; 737/770 bytes (95.7%) */
+ 51408, /* plane 0, page 114; 719/770 bytes (93.4%) */
+ 52178, /* plane 0, page 115; 716/770 bytes (93.0%) */
+ 52948, /* plane 0, page 116; 731/770 bytes (94.9%) */
+ 53718, /* plane 0, page 117; 683/770 bytes (88.7%) */
+ 54488, /* plane 0, page 118; 704/770 bytes (91.4%) */
+ 55258, /* plane 0, page 119; 734/767 bytes (95.7%) */
+ 56025, /* plane 0, page 120; 677/764 bytes (88.6%) */
+ 56789, /* plane 0, page 121; 728/770 bytes (94.5%) */
+ 57559, /* plane 0, page 122; 713/770 bytes (92.6%) */
+ 58329, /* plane 0, page 123; 680/770 bytes (88.3%) */
+ 59099, /* plane 0, page 124; 731/770 bytes (94.9%) */
+ 59869, /* plane 0, page 125; 749/770 bytes (97.3%) */
+ 60639, /* plane 0, page 126; 455/479 bytes (95.0%) */
+ 61118, /* plane 0, page 127; 572/608 bytes (94.1%) */
+ 61726, /* plane 0, page 128; 698/770 bytes (90.6%) */
+ 62496, /* plane 0, page 129; 686/770 bytes (89.1%) */
+ 63266, /* plane 0, page 130; 695/770 bytes (90.3%) */
+ 64036, /* plane 0, page 131; 662/770 bytes (86.0%) */
+ 64806, /* plane 0, page 132; 695/770 bytes (90.3%) */
+ 65576, /* plane 0, page 133; 740/770 bytes (96.1%) */
+ 66346, /* plane 0, page 134; 710/770 bytes (92.2%) */
+ 67116, /* plane 0, page 135; 734/770 bytes (95.3%) */
+ 67886, /* plane 0, page 136; 710/770 bytes (92.2%) */
+ 68656, /* plane 0, page 137; 686/770 bytes (89.1%) */
+ 69426, /* plane 0, page 138; 746/770 bytes (96.9%) */
+ 70196, /* plane 0, page 139; 470/482 bytes (97.5%) */
+ 70678, /* plane 0, page 140; 599/605 bytes (99.0%) */
+ 71283, /* plane 0, page 141; 518/770 bytes (67.3%) */
+ 72053, /* plane 0, page 142; 713/770 bytes (92.6%) */
+ 72823, /* plane 0, page 143; 575/770 bytes (74.7%) */
+ 73593, /* plane 0, page 144; 716/770 bytes (93.0%) */
+ 74363, /* plane 0, page 145; 713/770 bytes (92.6%) */
+ 75133, /* plane 0, page 146; 755/770 bytes (98.1%) */
+ 75903, /* plane 0, page 147; 755/770 bytes (98.1%) */
+ 76673, /* plane 0, page 148; 389/401 bytes (97.0%) */
+ 77074, /* plane 0, page 149; 332/383 bytes (86.7%) */
+ 77457, /* plane 0, page 150; 632/686 bytes (92.1%) */
+ 78143, /* plane 0, page 151; 707/770 bytes (91.8%) */
+ 78913, /* plane 0, page 152; 554/770 bytes (71.9%) */
+ 79683, /* plane 0, page 153; 602/770 bytes (78.2%) */
+ 80453, /* plane 0, page 154; 572/770 bytes (74.3%) */
+ 81223, /* plane 0, page 155; 728/770 bytes (94.5%) */
+ 81993, /* plane 0, page 156; 419/770 bytes (54.4%) */
+ 82763, /* plane 0, page 157; 737/770 bytes (95.7%) */
+ 83533, /* plane 0, page 158; 485/770 bytes (63.0%) */
+ 84303, /* plane 0, page 159; 431/500 bytes (86.2%) */
+ -1, /* plane 0, page 160 */
+ -1, /* plane 0, page 161 */
+ -1, /* plane 0, page 162 */
+ -1, /* plane 0, page 163 */
+ -1, /* plane 0, page 164 */
+ -1, /* plane 0, page 165 */
+ -1, /* plane 0, page 166 */
+ -1, /* plane 0, page 167 */
+ -1, /* plane 0, page 168 */
+ -1, /* plane 0, page 169 */
+ -1, /* plane 0, page 170 */
+ -1, /* plane 0, page 171 */
+ -1, /* plane 0, page 172 */
+ -1, /* plane 0, page 173 */
+ -1, /* plane 0, page 174 */
+ -1, /* plane 0, page 175 */
+ -1, /* plane 0, page 176 */
+ -1, /* plane 0, page 177 */
+ -1, /* plane 0, page 178 */
+ -1, /* plane 0, page 179 */
+ -1, /* plane 0, page 180 */
+ -1, /* plane 0, page 181 */
+ -1, /* plane 0, page 182 */
+ -1, /* plane 0, page 183 */
+ -1, /* plane 0, page 184 */
+ -1, /* plane 0, page 185 */
+ -1, /* plane 0, page 186 */
+ -1, /* plane 0, page 187 */
+ -1, /* plane 0, page 188 */
+ -1, /* plane 0, page 189 */
+ -1, /* plane 0, page 190 */
+ -1, /* plane 0, page 191 */
+ -1, /* plane 0, page 192 */
+ -1, /* plane 0, page 193 */
+ -1, /* plane 0, page 194 */
+ -1, /* plane 0, page 195 */
+ -1, /* plane 0, page 196 */
+ -1, /* plane 0, page 197 */
+ -1, /* plane 0, page 198 */
+ -1, /* plane 0, page 199 */
+ -1, /* plane 0, page 200 */
+ -1, /* plane 0, page 201 */
+ -1, /* plane 0, page 202 */
+ -1, /* plane 0, page 203 */
+ -1, /* plane 0, page 204 */
+ -1, /* plane 0, page 205 */
+ -1, /* plane 0, page 206 */
+ -1, /* plane 0, page 207 */
+ -1, /* plane 0, page 208 */
+ -1, /* plane 0, page 209 */
+ -1, /* plane 0, page 210 */
+ -1, /* plane 0, page 211 */
+ -1, /* plane 0, page 212 */
+ -1, /* plane 0, page 213 */
+ -1, /* plane 0, page 214 */
+ -1, /* plane 0, page 215 */
+ -1, /* plane 0, page 216 */
+ -1, /* plane 0, page 217 */
+ -1, /* plane 0, page 218 */
+ -1, /* plane 0, page 219 */
+ -1, /* plane 0, page 220 */
+ -1, /* plane 0, page 221 */
+ -1, /* plane 0, page 222 */
+ -1, /* plane 0, page 223 */
+ -1, /* plane 0, page 224 */
+ -1, /* plane 0, page 225 */
+ -1, /* plane 0, page 226 */
+ -1, /* plane 0, page 227 */
+ -1, /* plane 0, page 228 */
+ -1, /* plane 0, page 229 */
+ -1, /* plane 0, page 230 */
+ -1, /* plane 0, page 231 */
+ -1, /* plane 0, page 232 */
+ -1, /* plane 0, page 233 */
+ -1, /* plane 0, page 234 */
+ -1, /* plane 0, page 235 */
+ -1, /* plane 0, page 236 */
+ -1, /* plane 0, page 237 */
+ -1, /* plane 0, page 238 */
+ -1, /* plane 0, page 239 */
+ -1, /* plane 0, page 240 */
+ -1, /* plane 0, page 241 */
+ -1, /* plane 0, page 242 */
+ -1, /* plane 0, page 243 */
+ -1, /* plane 0, page 244 */
+ -1, /* plane 0, page 245 */
+ -1, /* plane 0, page 246 */
+ -1, /* plane 0, page 247 */
+ -1, /* plane 0, page 248 */
+ -1, /* plane 0, page 249 */
+ 84803, /* plane 0, page 250; 5/5 bytes (100.0%) */
+ -1, /* plane 0, page 251 */
+ -1, /* plane 0, page 252 */
+ -1, /* plane 0, page 253 */
+ 84808, /* plane 0, page 254; 152/182 bytes (83.5%) */
+ 84990, /* plane 0, page 255; 272/689 bytes (39.5%) */
+ /* plane 1: --- */
+ 85679, /* plane 2, page 0; 431/767 bytes (56.2%) */
+ 86446, /* plane 2, page 1; 485/764 bytes (63.5%) */
+ 87210, /* plane 2, page 2; 599/770 bytes (77.8%) */
+ 87980, /* plane 2, page 3; 506/758 bytes (66.8%) */
+ 88738, /* plane 2, page 4; 500/764 bytes (65.4%) */
+ 89502, /* plane 2, page 5; 563/770 bytes (73.1%) */
+ 90272, /* plane 2, page 6; 584/770 bytes (75.8%) */
+ 91042, /* plane 2, page 7; 530/764 bytes (69.4%) */
+ 91806, /* plane 2, page 8; 578/770 bytes (75.1%) */
+ 92576, /* plane 2, page 9; 569/764 bytes (74.5%) */
+ 93340, /* plane 2, page 10; 545/770 bytes (70.8%) */
+ 94110, /* plane 2, page 11; 602/743 bytes (81.0%) */
+ 94853, /* plane 2, page 12; 521/758 bytes (68.7%) */
+ 95611, /* plane 2, page 13; 407/758 bytes (53.7%) */
+ 96369, /* plane 2, page 14; 371/770 bytes (48.2%) */
+ 97139, /* plane 2, page 15; 404/770 bytes (52.5%) */
+ 97909, /* plane 2, page 16; 353/746 bytes (47.3%) */
+ 98655, /* plane 2, page 17; 422/764 bytes (55.2%) */
+ 99419, /* plane 2, page 18; 482/749 bytes (64.4%) */
+ 100168, /* plane 2, page 19; 497/767 bytes (64.8%) */
+ 100935, /* plane 2, page 20; 464/770 bytes (60.3%) */
+ 101705, /* plane 2, page 21; 515/767 bytes (67.1%) */
+ 102472, /* plane 2, page 22; 527/767 bytes (68.7%) */
+ 103239, /* plane 2, page 23; 602/770 bytes (78.2%) */
+ 104009, /* plane 2, page 24; 545/770 bytes (70.8%) */
+ 104779, /* plane 2, page 25; 512/758 bytes (67.5%) */
+ 105537, /* plane 2, page 26; 557/770 bytes (72.3%) */
+ 106307, /* plane 2, page 27; 428/761 bytes (56.2%) */
+ 107068, /* plane 2, page 28; 539/764 bytes (70.5%) */
+ 107832, /* plane 2, page 29; 560/770 bytes (72.7%) */
+ 108602, /* plane 2, page 30; 485/761 bytes (63.7%) */
+ 109363, /* plane 2, page 31; 476/740 bytes (64.3%) */
+ 110103, /* plane 2, page 32; 563/767 bytes (73.4%) */
+ 110870, /* plane 2, page 33; 545/767 bytes (71.1%) */
+ 111637, /* plane 2, page 34; 587/770 bytes (76.2%) */
+ 112407, /* plane 2, page 35; 545/767 bytes (71.1%) */
+ 113174, /* plane 2, page 36; 608/767 bytes (79.3%) */
+ 113941, /* plane 2, page 37; 560/770 bytes (72.7%) */
+ 114711, /* plane 2, page 38; 572/770 bytes (74.3%) */
+ 115481, /* plane 2, page 39; 560/770 bytes (72.7%) */
+ 116251, /* plane 2, page 40; 491/770 bytes (63.8%) */
+ 117021, /* plane 2, page 41; 542/770 bytes (70.4%) */
+ 117791, /* plane 2, page 42; 488/758 bytes (64.4%) */
+ 118549, /* plane 2, page 43; 509/770 bytes (66.1%) */
+ 119319, /* plane 2, page 44; 533/767 bytes (69.5%) */
+ 120086, /* plane 2, page 45; 437/770 bytes (56.8%) */
+ 120856, /* plane 2, page 46; 506/767 bytes (66.0%) */
+ 121623, /* plane 2, page 47; 533/755 bytes (70.6%) */
+ 122378, /* plane 2, page 48; 536/770 bytes (69.6%) */
+ 123148, /* plane 2, page 49; 527/770 bytes (68.4%) */
+ 123918, /* plane 2, page 50; 416/770 bytes (54.0%) */
+ 124688, /* plane 2, page 51; 503/758 bytes (66.4%) */
+ 125446, /* plane 2, page 52; 593/770 bytes (77.0%) */
+ 126216, /* plane 2, page 53; 521/758 bytes (68.7%) */
+ 126974, /* plane 2, page 54; 539/770 bytes (70.0%) */
+ 127744, /* plane 2, page 55; 539/767 bytes (70.3%) */
+ 128511, /* plane 2, page 56; 584/767 bytes (76.1%) */
+ 129278, /* plane 2, page 57; 593/770 bytes (77.0%) */
+ 130048, /* plane 2, page 58; 563/770 bytes (73.1%) */
+ 130818, /* plane 2, page 59; 617/770 bytes (80.1%) */
+ 131588, /* plane 2, page 60; 533/746 bytes (71.4%) */
+ 132334, /* plane 2, page 61; 551/767 bytes (71.8%) */
+ 133101, /* plane 2, page 62; 533/770 bytes (69.2%) */
+ 133871, /* plane 2, page 63; 530/770 bytes (68.8%) */
+ 134641, /* plane 2, page 64; 533/767 bytes (69.5%) */
+ 135408, /* plane 2, page 65; 506/755 bytes (67.0%) */
+ 136163, /* plane 2, page 66; 512/755 bytes (67.8%) */
+ 136918, /* plane 2, page 67; 539/767 bytes (70.3%) */
+ 137685, /* plane 2, page 68; 491/767 bytes (64.0%) */
+ 138452, /* plane 2, page 69; 590/770 bytes (76.6%) */
+ 139222, /* plane 2, page 70; 521/770 bytes (67.7%) */
+ 139992, /* plane 2, page 71; 530/764 bytes (69.4%) */
+ 140756, /* plane 2, page 72; 521/740 bytes (70.4%) */
+ 141496, /* plane 2, page 73; 527/764 bytes (69.0%) */
+ 142260, /* plane 2, page 74; 566/767 bytes (73.8%) */
+ 143027, /* plane 2, page 75; 536/764 bytes (70.2%) */
+ 143791, /* plane 2, page 76; 506/770 bytes (65.7%) */
+ 144561, /* plane 2, page 77; 512/770 bytes (66.5%) */
+ 145331, /* plane 2, page 78; 506/755 bytes (67.0%) */
+ 146086, /* plane 2, page 79; 509/770 bytes (66.1%) */
+ 146856, /* plane 2, page 80; 590/761 bytes (77.5%) */
+ 147617, /* plane 2, page 81; 509/770 bytes (66.1%) */
+ 148387, /* plane 2, page 82; 491/770 bytes (63.8%) */
+ 149157, /* plane 2, page 83; 545/767 bytes (71.1%) */
+ 149924, /* plane 2, page 84; 494/770 bytes (64.2%) */
+ 150694, /* plane 2, page 85; 530/770 bytes (68.8%) */
+ 151464, /* plane 2, page 86; 449/767 bytes (58.5%) */
+ 152231, /* plane 2, page 87; 500/767 bytes (65.2%) */
+ 152998, /* plane 2, page 88; 461/767 bytes (60.1%) */
+ 153765, /* plane 2, page 89; 563/770 bytes (73.1%) */
+ 154535, /* plane 2, page 90; 545/770 bytes (70.8%) */
+ 155305, /* plane 2, page 91; 623/770 bytes (80.9%) */
+ 156075, /* plane 2, page 92; 647/764 bytes (84.7%) */
+ 156839, /* plane 2, page 93; 587/770 bytes (76.2%) */
+ 157609, /* plane 2, page 94; 518/770 bytes (67.3%) */
+ 158379, /* plane 2, page 95; 578/770 bytes (75.1%) */
+ 159149, /* plane 2, page 96; 545/755 bytes (72.2%) */
+ 159904, /* plane 2, page 97; 575/743 bytes (77.4%) */
+ 160647, /* plane 2, page 98; 536/770 bytes (69.6%) */
+ 161417, /* plane 2, page 99; 557/767 bytes (72.6%) */
+ 162184, /* plane 2, page 100; 602/767 bytes (78.5%) */
+ 162951, /* plane 2, page 101; 617/767 bytes (80.4%) */
+ 163718, /* plane 2, page 102; 575/752 bytes (76.5%) */
+ 164470, /* plane 2, page 103; 503/731 bytes (68.8%) */
+ 165201, /* plane 2, page 104; 524/770 bytes (68.1%) */
+ 165971, /* plane 2, page 105; 608/770 bytes (79.0%) */
+ 166741, /* plane 2, page 106; 587/770 bytes (76.2%) */
+ 167511, /* plane 2, page 107; 653/770 bytes (84.8%) */
+ 168281, /* plane 2, page 108; 662/770 bytes (86.0%) */
+ 169051, /* plane 2, page 109; 611/770 bytes (79.4%) */
+ 169821, /* plane 2, page 110; 635/770 bytes (82.5%) */
+ 170591, /* plane 2, page 111; 605/770 bytes (78.6%) */
+ 171361, /* plane 2, page 112; 611/770 bytes (79.4%) */
+ 172131, /* plane 2, page 113; 608/770 bytes (79.0%) */
+ 172901, /* plane 2, page 114; 572/734 bytes (77.9%) */
+ 173635, /* plane 2, page 115; 590/767 bytes (76.9%) */
+ 174402, /* plane 2, page 116; 602/770 bytes (78.2%) */
+ 175172, /* plane 2, page 117; 614/770 bytes (79.7%) */
+ 175942, /* plane 2, page 118; 617/770 bytes (80.1%) */
+ 176712, /* plane 2, page 119; 560/770 bytes (72.7%) */
+ 177482, /* plane 2, page 120; 596/767 bytes (77.7%) */
+ 178249, /* plane 2, page 121; 590/761 bytes (77.5%) */
+ 179010, /* plane 2, page 122; 659/770 bytes (85.6%) */
+ 179780, /* plane 2, page 123; 635/770 bytes (82.5%) */
+ 180550, /* plane 2, page 124; 659/767 bytes (85.9%) */
+ 181317, /* plane 2, page 125; 596/767 bytes (77.7%) */
+ 182084, /* plane 2, page 126; 575/770 bytes (74.7%) */
+ 182854, /* plane 2, page 127; 632/770 bytes (82.1%) */
+ 183624, /* plane 2, page 128; 461/770 bytes (59.9%) */
+ 184394, /* plane 2, page 129; 485/764 bytes (63.5%) */
+ 185158, /* plane 2, page 130; 497/752 bytes (66.1%) */
+ 185910, /* plane 2, page 131; 578/764 bytes (75.7%) */
+ 186674, /* plane 2, page 132; 557/767 bytes (72.6%) */
+ 187441, /* plane 2, page 133; 533/764 bytes (69.8%) */
+ 188205, /* plane 2, page 134; 602/770 bytes (78.2%) */
+ 188975, /* plane 2, page 135; 611/770 bytes (79.4%) */
+ 189745, /* plane 2, page 136; 551/770 bytes (71.6%) */
+ 190515, /* plane 2, page 137; 506/770 bytes (65.7%) */
+ 191285, /* plane 2, page 138; 461/764 bytes (60.3%) */
+ 192049, /* plane 2, page 139; 440/758 bytes (58.0%) */
+ 192807, /* plane 2, page 140; 485/770 bytes (63.0%) */
+ 193577, /* plane 2, page 141; 494/761 bytes (64.9%) */
+ 194338, /* plane 2, page 142; 515/725 bytes (71.0%) */
+ 195063, /* plane 2, page 143; 614/770 bytes (79.7%) */
+ 195833, /* plane 2, page 144; 617/770 bytes (80.1%) */
+ 196603, /* plane 2, page 145; 515/770 bytes (66.9%) */
+ 197373, /* plane 2, page 146; 575/761 bytes (75.6%) */
+ 198134, /* plane 2, page 147; 614/758 bytes (81.0%) */
+ 198892, /* plane 2, page 148; 662/764 bytes (86.6%) */
+ 199656, /* plane 2, page 149; 590/758 bytes (77.8%) */
+ 200414, /* plane 2, page 150; 566/767 bytes (73.8%) */
+ 201181, /* plane 2, page 151; 524/749 bytes (70.0%) */
+ 201930, /* plane 2, page 152; 536/722 bytes (74.2%) */
+ 202652, /* plane 2, page 153; 485/692 bytes (70.1%) */
+ 203344, /* plane 2, page 154; 530/719 bytes (73.7%) */
+ 204063, /* plane 2, page 155; 545/770 bytes (70.8%) */
+ 204833, /* plane 2, page 156; 647/767 bytes (84.4%) */
+ 205600, /* plane 2, page 157; 575/770 bytes (74.7%) */
+ 206370, /* plane 2, page 158; 461/749 bytes (61.5%) */
+ 207119, /* plane 2, page 159; 548/755 bytes (72.6%) */
+ 207874, /* plane 2, page 160; 581/770 bytes (75.5%) */
+ 208644, /* plane 2, page 161; 530/770 bytes (68.8%) */
+ 209414, /* plane 2, page 162; 542/767 bytes (70.7%) */
+ 210181, /* plane 2, page 163; 614/767 bytes (80.1%) */
+ 210948, /* plane 2, page 164; 560/770 bytes (72.7%) */
+ 211718, /* plane 2, page 165; 593/770 bytes (77.0%) */
+ 212488, /* plane 2, page 166; 503/647 bytes (77.7%) */
+ -1, /* plane 2, page 167 */
+ -1, /* plane 2, page 168 */
+ -1, /* plane 2, page 169 */
+ -1, /* plane 2, page 170 */
+ -1, /* plane 2, page 171 */
+ -1, /* plane 2, page 172 */
+ -1, /* plane 2, page 173 */
+ -1, /* plane 2, page 174 */
+ -1, /* plane 2, page 175 */
+ -1, /* plane 2, page 176 */
+ -1, /* plane 2, page 177 */
+ -1, /* plane 2, page 178 */
+ -1, /* plane 2, page 179 */
+ -1, /* plane 2, page 180 */
+ -1, /* plane 2, page 181 */
+ -1, /* plane 2, page 182 */
+ -1, /* plane 2, page 183 */
+ -1, /* plane 2, page 184 */
+ -1, /* plane 2, page 185 */
+ -1, /* plane 2, page 186 */
+ -1, /* plane 2, page 187 */
+ -1, /* plane 2, page 188 */
+ -1, /* plane 2, page 189 */
+ -1, /* plane 2, page 190 */
+ -1, /* plane 2, page 191 */
+ -1, /* plane 2, page 192 */
+ -1, /* plane 2, page 193 */
+ -1, /* plane 2, page 194 */
+ -1, /* plane 2, page 195 */
+ -1, /* plane 2, page 196 */
+ -1, /* plane 2, page 197 */
+ -1, /* plane 2, page 198 */
+ -1, /* plane 2, page 199 */
+ -1, /* plane 2, page 200 */
+ -1, /* plane 2, page 201 */
+ -1, /* plane 2, page 202 */
+ -1, /* plane 2, page 203 */
+ -1, /* plane 2, page 204 */
+ -1, /* plane 2, page 205 */
+ -1, /* plane 2, page 206 */
+ -1, /* plane 2, page 207 */
+ -1, /* plane 2, page 208 */
+ -1, /* plane 2, page 209 */
+ -1, /* plane 2, page 210 */
+ -1, /* plane 2, page 211 */
+ -1, /* plane 2, page 212 */
+ -1, /* plane 2, page 213 */
+ -1, /* plane 2, page 214 */
+ -1, /* plane 2, page 215 */
+ -1, /* plane 2, page 216 */
+ -1, /* plane 2, page 217 */
+ -1, /* plane 2, page 218 */
+ -1, /* plane 2, page 219 */
+ -1, /* plane 2, page 220 */
+ -1, /* plane 2, page 221 */
+ -1, /* plane 2, page 222 */
+ -1, /* plane 2, page 223 */
+ -1, /* plane 2, page 224 */
+ -1, /* plane 2, page 225 */
+ -1, /* plane 2, page 226 */
+ -1, /* plane 2, page 227 */
+ -1, /* plane 2, page 228 */
+ -1, /* plane 2, page 229 */
+ -1, /* plane 2, page 230 */
+ -1, /* plane 2, page 231 */
+ -1, /* plane 2, page 232 */
+ -1, /* plane 2, page 233 */
+ -1, /* plane 2, page 234 */
+ -1, /* plane 2, page 235 */
+ -1, /* plane 2, page 236 */
+ -1, /* plane 2, page 237 */
+ -1, /* plane 2, page 238 */
+ -1, /* plane 2, page 239 */
+ -1, /* plane 2, page 240 */
+ -1, /* plane 2, page 241 */
+ -1, /* plane 2, page 242 */
+ -1, /* plane 2, page 243 */
+ -1, /* plane 2, page 244 */
+ -1, /* plane 2, page 245 */
+ -1, /* plane 2, page 246 */
+ -1, /* plane 2, page 247 */
+ 213135, /* plane 2, page 248; 761/770 bytes (98.8%) */
+ 213905, /* plane 2, page 249; 758/770 bytes (98.4%) */
+ 214675, /* plane 2, page 250; 92/92 bytes (100.0%) */
+ -1, /* plane 2, page 251 */
+ -1, /* plane 2, page 252 */
+ -1, /* plane 2, page 253 */
+ -1, /* plane 2, page 254 */
+ -1, /* plane 2, page 255 */
+ /* plane 3: --- */
+ /* plane 4: --- */
+ /* plane 5: --- */
+ /* plane 6: --- */
+ /* plane 7: --- */
+ /* plane 8: --- */
+ /* plane 9: --- */
+ /* plane 10: --- */
+ /* plane 11: --- */
+ /* plane 12: --- */
+ /* plane 13: --- */
+ /* plane 14: --- */
+ /* plane 15: --- */
+ /* plane 16: --- */
+};
+
+static sal_Int32 const aImplUnicodeToCns116431992PlaneOffsets[] = {
+ 0 * 256, /* plane 0; 496/1024 bytes (48.4%), 74432/85679 bytes (86.9%) */
+ -1, /* plane 1 */
+ 1 * 256, /* plane 2; 680/1024 bytes (66.4%), 92476/129088 bytes (71.6%) */
+ -1, /* plane 3 */
+ -1, /* plane 4 */
+ -1, /* plane 5 */
+ -1, /* plane 6 */
+ -1, /* plane 7 */
+ -1, /* plane 8 */
+ -1, /* plane 9 */
+ -1, /* plane 10 */
+ -1, /* plane 11 */
+ -1, /* plane 12 */
+ -1, /* plane 13 */
+ -1, /* plane 14 */
+ -1, /* plane 15 */
+ -1, /* plane 16 */
+ /* 8/68 bytes (11.8%), 1176/2048 bytes (57.4%), 166908/214767 bytes (77.7%) */
+};
diff --git a/sal/textenc/generate/gb180302000.pl b/sal/textenc/generate/gb180302000.pl
new file mode 100644
index 000000000000..8ae2b6024592
--- /dev/null
+++ b/sal/textenc/generate/gb180302000.pl
@@ -0,0 +1,309 @@
+#!/usr/bin/perl
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+# The following files must be available in a ./input subdir:
+
+# <http://oss.software.ibm.com/cvs/icu/~checkout~/charset/data/xml/
+# gb-18030-2000.xml?rev=1.4&content-type=text/plain>:
+# "modified version="3" date="2001-02-21""
+
+$id = "Gb180302000";
+
+sub printUtf32
+{
+ my $utf32 = $_[0];
+ return sprintf("U+%04X", $utf32);
+}
+
+sub printGb
+{
+ if (defined($_[2]))
+ {
+ return sprintf("%02X%02X%02X%02X", $_[0], $_[1], $_[2], $_[3]);
+ }
+ elsif (defined($_[1]))
+ {
+ return sprintf("%02X%02X", $_[0], $_[1]);
+ }
+ else
+ {
+ return sprintf("%02X", $_[0]);
+ }
+}
+
+$gb_map_2_count = 0;
+$gb_map_4_count = 0;
+$gb_map_4_ranges = 0;
+$gb_map_4_max = 0;
+$uni_map_count = 0;
+
+$range_count = 0;
+
+if (1)
+{
+ $filename = "gb-18030-2000.xml";
+ open IN, ("input/" . $filename) or die "Cannot read " . $filename;
+ while (<IN>)
+ {
+ if (/^[ \t]*<a +u=\"([0-9A-F]+)\" +b=\"([0-7][0-9A-F])\"\/>$/)
+ {
+ $utf32 = oct("0x" . $1);
+ $gb1 = oct("0x" . $2);
+ ($utf32 == $gb1)
+ or die "Bad " . printUtf32($utf32) . " to " . printGb($gb1);
+ }
+ elsif (/^[ \t]*<a +u=\"([0-9A-F]+)\" +b=\"([89A-F][0-9A-F]) ([4-789A-F][0-9A-F])\"\/>$/)
+ {
+ $utf32 = oct("0x" . $1);
+ $gb1 = oct("0x" . $2);
+ $gb2 = oct("0x" . $3);
+ $gb_code = ($gb1 - 0x81) * 190
+ + ($gb2 <= 0x7E ? $gb2 - 0x40 : $gb2 - 0x80 + 63);
+ !defined($gb_map_2[$gb_code])
+ or die "Redefined " . printGb($gb1, $gb2);
+ $gb_map_2[$gb_code] = $utf32;
+ ++$gb_map_2_count;
+
+ !defined($uni_map[$utf32]) or die "Double Unicode mapping";
+ $uni_map[$utf32] = $gb1 << 8 | $gb2;
+ ++$uni_map_count;
+ }
+ elsif (/^[ \t]*<a +u=\"([0-9A-F]+)\" +b=\"([89A-F][0-9A-F]) (3[0-9]) ([89A-F][0-9A-F]) (3[0-9])\"\/>$/)
+ {
+ $utf32 = oct("0x" . $1);
+ $gb1 = oct("0x" . $2);
+ $gb2 = oct("0x" . $3);
+ $gb3 = oct("0x" . $4);
+ $gb4 = oct("0x" . $5);
+ $gb_code = ($gb1 - 0x81) * 12600
+ + ($gb2 - 0x30) * 1260
+ + ($gb3 - 0x81) * 10
+ + ($gb4 - 0x30);
+ !defined($gb_map_4[$gb_code])
+ or die "Redefined " . printGb($gb1, $gb2, $gb3, $gb4);
+ $gb_map_4[$gb_code] = $utf32;
+ ++$gb_map_4_count;
+ $gb_map_4_max = $gb_code if ($gb_code > $gb_map_4_max);
+
+ !defined($uni_map[$utf32]) or die "Double Unicode mapping";
+ $uni_map[$utf32] = $gb1 << 24 | $gb2 << 16 | $gb3 << 8 | $gb4;
+ ++$uni_map_count;
+ }
+ elsif (/<a /)
+ {
+ die "Bad format";
+ }
+ elsif (/^[ \t]*<range +uFirst=\"([0-9A-F]+)\" +uLast=\"([0-9A-F]+)\" +bFirst=\"([89A-F][0-9A-F]) (3[0-9]) ([89A-F][0-9A-F]) (3[0-9])\" +bLast=\"([89A-F][0-9A-F]) (3[0-9]) ([89A-F][0-9A-F]) (3[0-9])\" +bMin=\"81 30 81 30\" +bMax=\"FE 39 FE 39\"\/>$/)
+ {
+ $utf32_first = oct("0x" . $1);
+ $utf32_last = oct("0x" . $2);
+ $gb1_first = oct("0x" . $3);
+ $gb2_first = oct("0x" . $4);
+ $gb3_first = oct("0x" . $5);
+ $gb4_first = oct("0x" . $6);
+ $gb1_last = oct("0x" . $7);
+ $gb2_last = oct("0x" . $8);
+ $gb3_last = oct("0x" . $9);
+ $gb4_last = oct("0x" . $10);
+ $linear_first
+ = ($gb1_first - 0x81) * 12600
+ + ($gb2_first - 0x30) * 1260
+ + ($gb3_first - 0x81) * 10
+ + ($gb4_first - 0x30);
+ $linear_last
+ = ($gb1_last - 0x81) * 12600
+ + ($gb2_last - 0x30) * 1260
+ + ($gb3_last - 0x81) * 10
+ + ($gb4_last - 0x30);
+ ($utf32_last - $utf32_first == $linear_last - $linear_first)
+ or die "Bad range";
+ if ($linear_first != 189000 || $linear_last != 1237575)
+ {
+ $range_uni_first[$range_count] = $utf32_first;
+ $range_uni_last[$range_count]
+ = ($utf32_last == 0xD7FF ? 0xDFFF : $utf32_last);
+ $range_linear_first[$range_count] = $linear_first;
+ $range_linear_last[$range_count] = $linear_last;
+ ++$range_count;
+ $gb_map_4_ranges += $linear_last - $linear_first + 1;
+ $gb_map_4_max = $linear_last
+ if ($linear_last > $gb_map_4_max);
+ }
+ }
+ elsif (/<range /)
+ {
+ die "Bad format";
+ }
+ }
+ close IN;
+}
+
+print "gb_map_2_count = ", $gb_map_2_count,
+ ", gb_map_4_count = ", $gb_map_4_count,
+ ", gb_map_4_ranges = ", $gb_map_4_ranges,
+ ", gb_map_4_max = ", $gb_map_4_max,
+ ", uni_map_count = ", $uni_map_count, "\n";
+($gb_map_2_count == 23940) or die "Bad gb_map_2_count != 23940";
+($gb_map_4_max == $gb_map_4_count + $gb_map_4_ranges - 1)
+ or die "Bad gb_map_4_max != gb_map_4_count + gb_map_4_ranges";
+($uni_map_count + $gb_map_4_ranges == 0x10000 - (0xE000 - 0xD800) - 0x80)
+ or die "Bad uni_map_count";
+
+$range_index = 0;
+$gb_nonrangedataindex[$range_index] = $gb_map_2_count;
+for ($gb_code = 0; $gb_code < $gb_map_4_max; ++$gb_code)
+{
+ if (defined($gb_map_4[$gb_code]))
+ {
+ $gb_map_2[$gb_map_2_count++] = $gb_map_4[$gb_code];
+ }
+ else
+ {
+ ($gb_code == $range_linear_first[$range_index]) or die "Bad input";
+ $gb_code = $range_linear_last[$range_index];
+ ++$range_index;
+ $gb_nonrangedataindex[$range_index] = $gb_map_2_count;
+ }
+}
+($range_index == $range_count) or die "Bad input";
+
+$filename = lc($id) . ".tab";
+open OUT, ("> " . $filename) or die "Cannot write " . $filename;
+
+{
+ $filename = lc($id). ".pl";
+ open IN, $filename or die "Cannot read ". $filename;
+ $first = 1;
+ while (<IN>)
+ {
+ if (/^\#!.*$/)
+ {
+ }
+ elsif (/^\#(\*.*)$/)
+ {
+ if ($first == 1)
+ {
+ print OUT "/", $1, "\n";
+ $first = 0;
+ }
+ else
+ {
+ print OUT " ", substr($1, 0, length($1) - 1), "/\n";
+ }
+ }
+ elsif (/^\# (.*)$/)
+ {
+ print OUT " *", $1, "\n";
+ }
+ elsif (/^\#(.*)$/)
+ {
+ print OUT " *", $1, "\n";
+ }
+ else
+ {
+ goto done;
+ }
+ }
+ done:
+}
+
+print OUT "\n",
+ "#ifndef INCLUDED_RTL_TEXTENC_CONVERTGB18030_H\n",
+ "#include \"convertgb18030.h\"\n",
+ "#endif\n",
+ "\n",
+ "#ifndef _SAL_TYPES_H_\n",
+ "#include \"sal/types.h\"\n",
+ "#endif\n",
+ "\n";
+
+print OUT "static sal_Unicode const aImpl", $id, "ToUnicodeData[] = {\n ";
+for ($gb_code = 0; $gb_code < $gb_map_2_count; ++$gb_code)
+{
+ printf OUT "0x%04X,", $gb_map_2[$gb_code];
+ if ($gb_code % 8 == 7 && $gb_code != $gb_map_2_count - 1)
+ {
+ print OUT "\n ";
+ }
+}
+print OUT "\n};\n\n";
+
+print OUT "static ImplGb180302000ToUnicodeRange const\n aImpl",
+ $id,
+ "ToUnicodeRanges[] = {\n";
+for ($range_index = 0; $range_index < $range_count; ++$range_index)
+{
+ printf OUT " { %d, %d, %d, 0x%04X },\n",
+ $gb_nonrangedataindex[$range_index],
+ $range_linear_first[$range_index],
+ $range_linear_last[$range_index] + 1,
+ $range_uni_first[$range_index];
+}
+print OUT " { -1, 0, 0, 0 }\n};\n\n";
+
+print OUT "static sal_uInt32 const aImplUnicodeTo", $id, "Data[] = {\n ";
+$index = 0;
+$range_index = 0;
+$uni_nonrangedataindex[$range_index] = $index;
+for ($utf32 = 0x80; $utf32 <= 0xFFFF; ++$utf32)
+{
+ if (defined($uni_map[$utf32]))
+ {
+ if ($index > 0 && ($index - 1) % 6 == 5)
+ {
+ print OUT "\n ";
+ }
+ $bytes = $uni_map[$utf32];
+ printf OUT ($bytes <= 0xFFFF ? " 0x%04X," : "0x%08X,"), $bytes;
+ ++$index;
+ }
+ else
+ {
+ ($utf32 == $range_uni_first[$range_index]) or die "Bad input";
+ $utf32 = $range_uni_last[$range_index];
+ ++$range_index;
+ $uni_nonrangedataindex[$range_index] = $index;
+ }
+}
+($range_index == $range_count) or die "Bad input";
+print OUT "\n};\n\n";
+
+print OUT "static ImplUnicodeToGb180302000Range const\n aImplUnicodeTo",
+ $id,
+ "Ranges[] = {\n";
+for ($range_index = 0; $range_index < $range_count; ++$range_index)
+{
+ printf OUT " { %d, 0x%04X, 0x%04X, %d },\n",
+ $uni_nonrangedataindex[$range_index],
+ $range_uni_first[$range_index],
+ $range_uni_last[$range_index],
+ $range_linear_first[$range_index];
+}
+print OUT "};\n";
+
+close OUT;
diff --git a/sal/textenc/generate/gb180302000.tab b/sal/textenc/generate/gb180302000.tab
new file mode 100644
index 000000000000..00b58b3cff88
--- /dev/null
+++ b/sal/textenc/generate/gb180302000.tab
@@ -0,0 +1,9038 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONVERTGB18030_H
+#include "convertgb18030.h"
+#endif
+
+#ifndef _SAL_TYPES_H_
+#include "sal/types.h"
+#endif
+
+static sal_Unicode const aImplGb180302000ToUnicodeData[] = {
+ 0x4E02,0x4E04,0x4E05,0x4E06,0x4E0F,0x4E12,0x4E17,0x4E1F,
+ 0x4E20,0x4E21,0x4E23,0x4E26,0x4E29,0x4E2E,0x4E2F,0x4E31,
+ 0x4E33,0x4E35,0x4E37,0x4E3C,0x4E40,0x4E41,0x4E42,0x4E44,
+ 0x4E46,0x4E4A,0x4E51,0x4E55,0x4E57,0x4E5A,0x4E5B,0x4E62,
+ 0x4E63,0x4E64,0x4E65,0x4E67,0x4E68,0x4E6A,0x4E6B,0x4E6C,
+ 0x4E6D,0x4E6E,0x4E6F,0x4E72,0x4E74,0x4E75,0x4E76,0x4E77,
+ 0x4E78,0x4E79,0x4E7A,0x4E7B,0x4E7C,0x4E7D,0x4E7F,0x4E80,
+ 0x4E81,0x4E82,0x4E83,0x4E84,0x4E85,0x4E87,0x4E8A,0x4E90,
+ 0x4E96,0x4E97,0x4E99,0x4E9C,0x4E9D,0x4E9E,0x4EA3,0x4EAA,
+ 0x4EAF,0x4EB0,0x4EB1,0x4EB4,0x4EB6,0x4EB7,0x4EB8,0x4EB9,
+ 0x4EBC,0x4EBD,0x4EBE,0x4EC8,0x4ECC,0x4ECF,0x4ED0,0x4ED2,
+ 0x4EDA,0x4EDB,0x4EDC,0x4EE0,0x4EE2,0x4EE6,0x4EE7,0x4EE9,
+ 0x4EED,0x4EEE,0x4EEF,0x4EF1,0x4EF4,0x4EF8,0x4EF9,0x4EFA,
+ 0x4EFC,0x4EFE,0x4F00,0x4F02,0x4F03,0x4F04,0x4F05,0x4F06,
+ 0x4F07,0x4F08,0x4F0B,0x4F0C,0x4F12,0x4F13,0x4F14,0x4F15,
+ 0x4F16,0x4F1C,0x4F1D,0x4F21,0x4F23,0x4F28,0x4F29,0x4F2C,
+ 0x4F2D,0x4F2E,0x4F31,0x4F33,0x4F35,0x4F37,0x4F39,0x4F3B,
+ 0x4F3E,0x4F3F,0x4F40,0x4F41,0x4F42,0x4F44,0x4F45,0x4F47,
+ 0x4F48,0x4F49,0x4F4A,0x4F4B,0x4F4C,0x4F52,0x4F54,0x4F56,
+ 0x4F61,0x4F62,0x4F66,0x4F68,0x4F6A,0x4F6B,0x4F6D,0x4F6E,
+ 0x4F71,0x4F72,0x4F75,0x4F77,0x4F78,0x4F79,0x4F7A,0x4F7D,
+ 0x4F80,0x4F81,0x4F82,0x4F85,0x4F86,0x4F87,0x4F8A,0x4F8C,
+ 0x4F8E,0x4F90,0x4F92,0x4F93,0x4F95,0x4F96,0x4F98,0x4F99,
+ 0x4F9A,0x4F9C,0x4F9E,0x4F9F,0x4FA1,0x4FA2,0x4FA4,0x4FAB,
+ 0x4FAD,0x4FB0,0x4FB1,0x4FB2,0x4FB3,0x4FB4,0x4FB6,0x4FB7,
+ 0x4FB8,0x4FB9,0x4FBA,0x4FBB,0x4FBC,0x4FBD,0x4FBE,0x4FC0,
+ 0x4FC1,0x4FC2,0x4FC6,0x4FC7,0x4FC8,0x4FC9,0x4FCB,0x4FCC,
+ 0x4FCD,0x4FD2,0x4FD3,0x4FD4,0x4FD5,0x4FD6,0x4FD9,0x4FDB,
+ 0x4FE0,0x4FE2,0x4FE4,0x4FE5,0x4FE7,0x4FEB,0x4FEC,0x4FF0,
+ 0x4FF2,0x4FF4,0x4FF5,0x4FF6,0x4FF7,0x4FF9,0x4FFB,0x4FFC,
+ 0x4FFD,0x4FFF,0x5000,0x5001,0x5002,0x5003,0x5004,0x5005,
+ 0x5006,0x5007,0x5008,0x5009,0x500A,0x500B,0x500E,0x5010,
+ 0x5011,0x5013,0x5015,0x5016,0x5017,0x501B,0x501D,0x501E,
+ 0x5020,0x5022,0x5023,0x5024,0x5027,0x502B,0x502F,0x5030,
+ 0x5031,0x5032,0x5033,0x5034,0x5035,0x5036,0x5037,0x5038,
+ 0x5039,0x503B,0x503D,0x503F,0x5040,0x5041,0x5042,0x5044,
+ 0x5045,0x5046,0x5049,0x504A,0x504B,0x504D,0x5050,0x5051,
+ 0x5052,0x5053,0x5054,0x5056,0x5057,0x5058,0x5059,0x505B,
+ 0x505D,0x505E,0x505F,0x5060,0x5061,0x5062,0x5063,0x5064,
+ 0x5066,0x5067,0x5068,0x5069,0x506A,0x506B,0x506D,0x506E,
+ 0x506F,0x5070,0x5071,0x5072,0x5073,0x5074,0x5075,0x5078,
+ 0x5079,0x507A,0x507C,0x507D,0x5081,0x5082,0x5083,0x5084,
+ 0x5086,0x5087,0x5089,0x508A,0x508B,0x508C,0x508E,0x508F,
+ 0x5090,0x5091,0x5092,0x5093,0x5094,0x5095,0x5096,0x5097,
+ 0x5098,0x5099,0x509A,0x509B,0x509C,0x509D,0x509E,0x509F,
+ 0x50A0,0x50A1,0x50A2,0x50A4,0x50A6,0x50AA,0x50AB,0x50AD,
+ 0x50AE,0x50AF,0x50B0,0x50B1,0x50B3,0x50B4,0x50B5,0x50B6,
+ 0x50B7,0x50B8,0x50B9,0x50BC,0x50BD,0x50BE,0x50BF,0x50C0,
+ 0x50C1,0x50C2,0x50C3,0x50C4,0x50C5,0x50C6,0x50C7,0x50C8,
+ 0x50C9,0x50CA,0x50CB,0x50CC,0x50CD,0x50CE,0x50D0,0x50D1,
+ 0x50D2,0x50D3,0x50D4,0x50D5,0x50D7,0x50D8,0x50D9,0x50DB,
+ 0x50DC,0x50DD,0x50DE,0x50DF,0x50E0,0x50E1,0x50E2,0x50E3,
+ 0x50E4,0x50E5,0x50E8,0x50E9,0x50EA,0x50EB,0x50EF,0x50F0,
+ 0x50F1,0x50F2,0x50F4,0x50F6,0x50F7,0x50F8,0x50F9,0x50FA,
+ 0x50FC,0x50FD,0x50FE,0x50FF,0x5100,0x5101,0x5102,0x5103,
+ 0x5104,0x5105,0x5108,0x5109,0x510A,0x510C,0x510D,0x510E,
+ 0x510F,0x5110,0x5111,0x5113,0x5114,0x5115,0x5116,0x5117,
+ 0x5118,0x5119,0x511A,0x511B,0x511C,0x511D,0x511E,0x511F,
+ 0x5120,0x5122,0x5123,0x5124,0x5125,0x5126,0x5127,0x5128,
+ 0x5129,0x512A,0x512B,0x512C,0x512D,0x512E,0x512F,0x5130,
+ 0x5131,0x5132,0x5133,0x5134,0x5135,0x5136,0x5137,0x5138,
+ 0x5139,0x513A,0x513B,0x513C,0x513D,0x513E,0x5142,0x5147,
+ 0x514A,0x514C,0x514E,0x514F,0x5150,0x5152,0x5153,0x5157,
+ 0x5158,0x5159,0x515B,0x515D,0x515E,0x515F,0x5160,0x5161,
+ 0x5163,0x5164,0x5166,0x5167,0x5169,0x516A,0x516F,0x5172,
+ 0x517A,0x517E,0x517F,0x5183,0x5184,0x5186,0x5187,0x518A,
+ 0x518B,0x518E,0x518F,0x5190,0x5191,0x5193,0x5194,0x5198,
+ 0x519A,0x519D,0x519E,0x519F,0x51A1,0x51A3,0x51A6,0x51A7,
+ 0x51A8,0x51A9,0x51AA,0x51AD,0x51AE,0x51B4,0x51B8,0x51B9,
+ 0x51BA,0x51BE,0x51BF,0x51C1,0x51C2,0x51C3,0x51C5,0x51C8,
+ 0x51CA,0x51CD,0x51CE,0x51D0,0x51D2,0x51D3,0x51D4,0x51D5,
+ 0x51D6,0x51D7,0x51D8,0x51D9,0x51DA,0x51DC,0x51DE,0x51DF,
+ 0x51E2,0x51E3,0x51E5,0x51E6,0x51E7,0x51E8,0x51E9,0x51EA,
+ 0x51EC,0x51EE,0x51F1,0x51F2,0x51F4,0x51F7,0x51FE,0x5204,
+ 0x5205,0x5209,0x520B,0x520C,0x520F,0x5210,0x5213,0x5214,
+ 0x5215,0x521C,0x521E,0x521F,0x5221,0x5222,0x5223,0x5225,
+ 0x5226,0x5227,0x522A,0x522C,0x522F,0x5231,0x5232,0x5234,
+ 0x5235,0x523C,0x523E,0x5244,0x5245,0x5246,0x5247,0x5248,
+ 0x5249,0x524B,0x524E,0x524F,0x5252,0x5253,0x5255,0x5257,
+ 0x5258,0x5259,0x525A,0x525B,0x525D,0x525F,0x5260,0x5262,
+ 0x5263,0x5264,0x5266,0x5268,0x526B,0x526C,0x526D,0x526E,
+ 0x5270,0x5271,0x5273,0x5274,0x5275,0x5276,0x5277,0x5278,
+ 0x5279,0x527A,0x527B,0x527C,0x527E,0x5280,0x5283,0x5284,
+ 0x5285,0x5286,0x5287,0x5289,0x528A,0x528B,0x528C,0x528D,
+ 0x528E,0x528F,0x5291,0x5292,0x5294,0x5295,0x5296,0x5297,
+ 0x5298,0x5299,0x529A,0x529C,0x52A4,0x52A5,0x52A6,0x52A7,
+ 0x52AE,0x52AF,0x52B0,0x52B4,0x52B5,0x52B6,0x52B7,0x52B8,
+ 0x52B9,0x52BA,0x52BB,0x52BC,0x52BD,0x52C0,0x52C1,0x52C2,
+ 0x52C4,0x52C5,0x52C6,0x52C8,0x52CA,0x52CC,0x52CD,0x52CE,
+ 0x52CF,0x52D1,0x52D3,0x52D4,0x52D5,0x52D7,0x52D9,0x52DA,
+ 0x52DB,0x52DC,0x52DD,0x52DE,0x52E0,0x52E1,0x52E2,0x52E3,
+ 0x52E5,0x52E6,0x52E7,0x52E8,0x52E9,0x52EA,0x52EB,0x52EC,
+ 0x52ED,0x52EE,0x52EF,0x52F1,0x52F2,0x52F3,0x52F4,0x52F5,
+ 0x52F6,0x52F7,0x52F8,0x52FB,0x52FC,0x52FD,0x5301,0x5302,
+ 0x5303,0x5304,0x5307,0x5309,0x530A,0x530B,0x530C,0x530E,
+ 0x5311,0x5312,0x5313,0x5314,0x5318,0x531B,0x531C,0x531E,
+ 0x531F,0x5322,0x5324,0x5325,0x5327,0x5328,0x5329,0x532B,
+ 0x532C,0x532D,0x532F,0x5330,0x5331,0x5332,0x5333,0x5334,
+ 0x5335,0x5336,0x5337,0x5338,0x533C,0x533D,0x5340,0x5342,
+ 0x5344,0x5346,0x534B,0x534C,0x534D,0x5350,0x5354,0x5358,
+ 0x5359,0x535B,0x535D,0x5365,0x5368,0x536A,0x536C,0x536D,
+ 0x5372,0x5376,0x5379,0x537B,0x537C,0x537D,0x537E,0x5380,
+ 0x5381,0x5383,0x5387,0x5388,0x538A,0x538E,0x538F,0x5390,
+ 0x5391,0x5392,0x5393,0x5394,0x5396,0x5397,0x5399,0x539B,
+ 0x539C,0x539E,0x53A0,0x53A1,0x53A4,0x53A7,0x53AA,0x53AB,
+ 0x53AC,0x53AD,0x53AF,0x53B0,0x53B1,0x53B2,0x53B3,0x53B4,
+ 0x53B5,0x53B7,0x53B8,0x53B9,0x53BA,0x53BC,0x53BD,0x53BE,
+ 0x53C0,0x53C3,0x53C4,0x53C5,0x53C6,0x53C7,0x53CE,0x53CF,
+ 0x53D0,0x53D2,0x53D3,0x53D5,0x53DA,0x53DC,0x53DD,0x53DE,
+ 0x53E1,0x53E2,0x53E7,0x53F4,0x53FA,0x53FE,0x53FF,0x5400,
+ 0x5402,0x5405,0x5407,0x540B,0x5414,0x5418,0x5419,0x541A,
+ 0x541C,0x5422,0x5424,0x5425,0x542A,0x5430,0x5433,0x5436,
+ 0x5437,0x543A,0x543D,0x543F,0x5441,0x5442,0x5444,0x5445,
+ 0x5447,0x5449,0x544C,0x544D,0x544E,0x544F,0x5451,0x545A,
+ 0x545D,0x545E,0x545F,0x5460,0x5461,0x5463,0x5465,0x5467,
+ 0x5469,0x546A,0x546B,0x546C,0x546D,0x546E,0x546F,0x5470,
+ 0x5474,0x5479,0x547A,0x547E,0x547F,0x5481,0x5483,0x5485,
+ 0x5487,0x5488,0x5489,0x548A,0x548D,0x5491,0x5493,0x5497,
+ 0x5498,0x549C,0x549E,0x549F,0x54A0,0x54A1,0x54A2,0x54A5,
+ 0x54AE,0x54B0,0x54B2,0x54B5,0x54B6,0x54B7,0x54B9,0x54BA,
+ 0x54BC,0x54BE,0x54C3,0x54C5,0x54CA,0x54CB,0x54D6,0x54D8,
+ 0x54DB,0x54E0,0x54E1,0x54E2,0x54E3,0x54E4,0x54EB,0x54EC,
+ 0x54EF,0x54F0,0x54F1,0x54F4,0x54F5,0x54F6,0x54F7,0x54F8,
+ 0x54F9,0x54FB,0x54FE,0x5500,0x5502,0x5503,0x5504,0x5505,
+ 0x5508,0x550A,0x550B,0x550C,0x550D,0x550E,0x5512,0x5513,
+ 0x5515,0x5516,0x5517,0x5518,0x5519,0x551A,0x551C,0x551D,
+ 0x551E,0x551F,0x5521,0x5525,0x5526,0x5528,0x5529,0x552B,
+ 0x552D,0x5532,0x5534,0x5535,0x5536,0x5538,0x5539,0x553A,
+ 0x553B,0x553D,0x5540,0x5542,0x5545,0x5547,0x5548,0x554B,
+ 0x554C,0x554D,0x554E,0x554F,0x5551,0x5552,0x5553,0x5554,
+ 0x5557,0x5558,0x5559,0x555A,0x555B,0x555D,0x555E,0x555F,
+ 0x5560,0x5562,0x5563,0x5568,0x5569,0x556B,0x556F,0x5570,
+ 0x5571,0x5572,0x5573,0x5574,0x5579,0x557A,0x557D,0x557F,
+ 0x5585,0x5586,0x558C,0x558D,0x558E,0x5590,0x5592,0x5593,
+ 0x5595,0x5596,0x5597,0x559A,0x559B,0x559E,0x55A0,0x55A1,
+ 0x55A2,0x55A3,0x55A4,0x55A5,0x55A6,0x55A8,0x55A9,0x55AA,
+ 0x55AB,0x55AC,0x55AD,0x55AE,0x55AF,0x55B0,0x55B2,0x55B4,
+ 0x55B6,0x55B8,0x55BA,0x55BC,0x55BF,0x55C0,0x55C1,0x55C2,
+ 0x55C3,0x55C6,0x55C7,0x55C8,0x55CA,0x55CB,0x55CE,0x55CF,
+ 0x55D0,0x55D5,0x55D7,0x55D8,0x55D9,0x55DA,0x55DB,0x55DE,
+ 0x55E0,0x55E2,0x55E7,0x55E9,0x55ED,0x55EE,0x55F0,0x55F1,
+ 0x55F4,0x55F6,0x55F8,0x55F9,0x55FA,0x55FB,0x55FC,0x55FF,
+ 0x5602,0x5603,0x5604,0x5605,0x5606,0x5607,0x560A,0x560B,
+ 0x560D,0x5610,0x5611,0x5612,0x5613,0x5614,0x5615,0x5616,
+ 0x5617,0x5619,0x561A,0x561C,0x561D,0x5620,0x5621,0x5622,
+ 0x5625,0x5626,0x5628,0x5629,0x562A,0x562B,0x562E,0x562F,
+ 0x5630,0x5633,0x5635,0x5637,0x5638,0x563A,0x563C,0x563D,
+ 0x563E,0x5640,0x5641,0x5642,0x5643,0x5644,0x5645,0x5646,
+ 0x5647,0x5648,0x5649,0x564A,0x564B,0x564F,0x5650,0x5651,
+ 0x5652,0x5653,0x5655,0x5656,0x565A,0x565B,0x565D,0x565E,
+ 0x565F,0x5660,0x5661,0x5663,0x5665,0x5666,0x5667,0x566D,
+ 0x566E,0x566F,0x5670,0x5672,0x5673,0x5674,0x5675,0x5677,
+ 0x5678,0x5679,0x567A,0x567D,0x567E,0x567F,0x5680,0x5681,
+ 0x5682,0x5683,0x5684,0x5687,0x5688,0x5689,0x568A,0x568B,
+ 0x568C,0x568D,0x5690,0x5691,0x5692,0x5694,0x5695,0x5696,
+ 0x5697,0x5698,0x5699,0x569A,0x569B,0x569C,0x569D,0x569E,
+ 0x569F,0x56A0,0x56A1,0x56A2,0x56A4,0x56A5,0x56A6,0x56A7,
+ 0x56A8,0x56A9,0x56AA,0x56AB,0x56AC,0x56AD,0x56AE,0x56B0,
+ 0x56B1,0x56B2,0x56B3,0x56B4,0x56B5,0x56B6,0x56B8,0x56B9,
+ 0x56BA,0x56BB,0x56BD,0x56BE,0x56BF,0x56C0,0x56C1,0x56C2,
+ 0x56C3,0x56C4,0x56C5,0x56C6,0x56C7,0x56C8,0x56C9,0x56CB,
+ 0x56CC,0x56CD,0x56CE,0x56CF,0x56D0,0x56D1,0x56D2,0x56D3,
+ 0x56D5,0x56D6,0x56D8,0x56D9,0x56DC,0x56E3,0x56E5,0x56E6,
+ 0x56E7,0x56E8,0x56E9,0x56EA,0x56EC,0x56EE,0x56EF,0x56F2,
+ 0x56F3,0x56F6,0x56F7,0x56F8,0x56FB,0x56FC,0x5700,0x5701,
+ 0x5702,0x5705,0x5707,0x570B,0x570C,0x570D,0x570E,0x570F,
+ 0x5710,0x5711,0x5712,0x5713,0x5714,0x5715,0x5716,0x5717,
+ 0x5718,0x5719,0x571A,0x571B,0x571D,0x571E,0x5720,0x5721,
+ 0x5722,0x5724,0x5725,0x5726,0x5727,0x572B,0x5731,0x5732,
+ 0x5734,0x5735,0x5736,0x5737,0x5738,0x573C,0x573D,0x573F,
+ 0x5741,0x5743,0x5744,0x5745,0x5746,0x5748,0x5749,0x574B,
+ 0x5752,0x5753,0x5754,0x5755,0x5756,0x5758,0x5759,0x5762,
+ 0x5763,0x5765,0x5767,0x576C,0x576E,0x5770,0x5771,0x5772,
+ 0x5774,0x5775,0x5778,0x5779,0x577A,0x577D,0x577E,0x577F,
+ 0x5780,0x5781,0x5787,0x5788,0x5789,0x578A,0x578D,0x578E,
+ 0x578F,0x5790,0x5791,0x5794,0x5795,0x5796,0x5797,0x5798,
+ 0x5799,0x579A,0x579C,0x579D,0x579E,0x579F,0x57A5,0x57A8,
+ 0x57AA,0x57AC,0x57AF,0x57B0,0x57B1,0x57B3,0x57B5,0x57B6,
+ 0x57B7,0x57B9,0x57BA,0x57BB,0x57BC,0x57BD,0x57BE,0x57BF,
+ 0x57C0,0x57C1,0x57C4,0x57C5,0x57C6,0x57C7,0x57C8,0x57C9,
+ 0x57CA,0x57CC,0x57CD,0x57D0,0x57D1,0x57D3,0x57D6,0x57D7,
+ 0x57DB,0x57DC,0x57DE,0x57E1,0x57E2,0x57E3,0x57E5,0x57E6,
+ 0x57E7,0x57E8,0x57E9,0x57EA,0x57EB,0x57EC,0x57EE,0x57F0,
+ 0x57F1,0x57F2,0x57F3,0x57F5,0x57F6,0x57F7,0x57FB,0x57FC,
+ 0x57FE,0x57FF,0x5801,0x5803,0x5804,0x5805,0x5808,0x5809,
+ 0x580A,0x580C,0x580E,0x580F,0x5810,0x5812,0x5813,0x5814,
+ 0x5816,0x5817,0x5818,0x581A,0x581B,0x581C,0x581D,0x581F,
+ 0x5822,0x5823,0x5825,0x5826,0x5827,0x5828,0x5829,0x582B,
+ 0x582C,0x582D,0x582E,0x582F,0x5831,0x5832,0x5833,0x5834,
+ 0x5836,0x5837,0x5838,0x5839,0x583A,0x583B,0x583C,0x583D,
+ 0x583E,0x583F,0x5840,0x5841,0x5842,0x5843,0x5845,0x5846,
+ 0x5847,0x5848,0x5849,0x584A,0x584B,0x584E,0x584F,0x5850,
+ 0x5852,0x5853,0x5855,0x5856,0x5857,0x5859,0x585A,0x585B,
+ 0x585C,0x585D,0x585F,0x5860,0x5861,0x5862,0x5863,0x5864,
+ 0x5866,0x5867,0x5868,0x5869,0x586A,0x586D,0x586E,0x586F,
+ 0x5870,0x5871,0x5872,0x5873,0x5874,0x5875,0x5876,0x5877,
+ 0x5878,0x5879,0x587A,0x587B,0x587C,0x587D,0x587F,0x5882,
+ 0x5884,0x5886,0x5887,0x5888,0x588A,0x588B,0x588C,0x588D,
+ 0x588E,0x588F,0x5890,0x5891,0x5894,0x5895,0x5896,0x5897,
+ 0x5898,0x589B,0x589C,0x589D,0x58A0,0x58A1,0x58A2,0x58A3,
+ 0x58A4,0x58A5,0x58A6,0x58A7,0x58AA,0x58AB,0x58AC,0x58AD,
+ 0x58AE,0x58AF,0x58B0,0x58B1,0x58B2,0x58B3,0x58B4,0x58B5,
+ 0x58B6,0x58B7,0x58B8,0x58B9,0x58BA,0x58BB,0x58BD,0x58BE,
+ 0x58BF,0x58C0,0x58C2,0x58C3,0x58C4,0x58C6,0x58C7,0x58C8,
+ 0x58C9,0x58CA,0x58CB,0x58CC,0x58CD,0x58CE,0x58CF,0x58D0,
+ 0x58D2,0x58D3,0x58D4,0x58D6,0x58D7,0x58D8,0x58D9,0x58DA,
+ 0x58DB,0x58DC,0x58DD,0x58DE,0x58DF,0x58E0,0x58E1,0x58E2,
+ 0x58E3,0x58E5,0x58E6,0x58E7,0x58E8,0x58E9,0x58EA,0x58ED,
+ 0x58EF,0x58F1,0x58F2,0x58F4,0x58F5,0x58F7,0x58F8,0x58FA,
+ 0x58FB,0x58FC,0x58FD,0x58FE,0x58FF,0x5900,0x5901,0x5903,
+ 0x5905,0x5906,0x5908,0x5909,0x590A,0x590B,0x590C,0x590E,
+ 0x5910,0x5911,0x5912,0x5913,0x5917,0x5918,0x591B,0x591D,
+ 0x591E,0x5920,0x5921,0x5922,0x5923,0x5926,0x5928,0x592C,
+ 0x5930,0x5932,0x5933,0x5935,0x5936,0x593B,0x593D,0x593E,
+ 0x593F,0x5940,0x5943,0x5945,0x5946,0x594A,0x594C,0x594D,
+ 0x5950,0x5952,0x5953,0x5959,0x595B,0x595C,0x595D,0x595E,
+ 0x595F,0x5961,0x5963,0x5964,0x5966,0x5967,0x5968,0x5969,
+ 0x596A,0x596B,0x596C,0x596D,0x596E,0x596F,0x5970,0x5971,
+ 0x5972,0x5975,0x5977,0x597A,0x597B,0x597C,0x597E,0x597F,
+ 0x5980,0x5985,0x5989,0x598B,0x598C,0x598E,0x598F,0x5990,
+ 0x5991,0x5994,0x5995,0x5998,0x599A,0x599B,0x599C,0x599D,
+ 0x599F,0x59A0,0x59A1,0x59A2,0x59A6,0x59A7,0x59AC,0x59AD,
+ 0x59B0,0x59B1,0x59B3,0x59B4,0x59B5,0x59B6,0x59B7,0x59B8,
+ 0x59BA,0x59BC,0x59BD,0x59BF,0x59C0,0x59C1,0x59C2,0x59C3,
+ 0x59C4,0x59C5,0x59C7,0x59C8,0x59C9,0x59CC,0x59CD,0x59CE,
+ 0x59CF,0x59D5,0x59D6,0x59D9,0x59DB,0x59DE,0x59DF,0x59E0,
+ 0x59E1,0x59E2,0x59E4,0x59E6,0x59E7,0x59E9,0x59EA,0x59EB,
+ 0x59ED,0x59EE,0x59EF,0x59F0,0x59F1,0x59F2,0x59F3,0x59F4,
+ 0x59F5,0x59F6,0x59F7,0x59F8,0x59FA,0x59FC,0x59FD,0x59FE,
+ 0x5A00,0x5A02,0x5A0A,0x5A0B,0x5A0D,0x5A0E,0x5A0F,0x5A10,
+ 0x5A12,0x5A14,0x5A15,0x5A16,0x5A17,0x5A19,0x5A1A,0x5A1B,
+ 0x5A1D,0x5A1E,0x5A21,0x5A22,0x5A24,0x5A26,0x5A27,0x5A28,
+ 0x5A2A,0x5A2B,0x5A2C,0x5A2D,0x5A2E,0x5A2F,0x5A30,0x5A33,
+ 0x5A35,0x5A37,0x5A38,0x5A39,0x5A3A,0x5A3B,0x5A3D,0x5A3E,
+ 0x5A3F,0x5A41,0x5A42,0x5A43,0x5A44,0x5A45,0x5A47,0x5A48,
+ 0x5A4B,0x5A4C,0x5A4D,0x5A4E,0x5A4F,0x5A50,0x5A51,0x5A52,
+ 0x5A53,0x5A54,0x5A56,0x5A57,0x5A58,0x5A59,0x5A5B,0x5A5C,
+ 0x5A5D,0x5A5E,0x5A5F,0x5A60,0x5A61,0x5A63,0x5A64,0x5A65,
+ 0x5A66,0x5A68,0x5A69,0x5A6B,0x5A6C,0x5A6D,0x5A6E,0x5A6F,
+ 0x5A70,0x5A71,0x5A72,0x5A73,0x5A78,0x5A79,0x5A7B,0x5A7C,
+ 0x5A7D,0x5A7E,0x5A80,0x5A81,0x5A82,0x5A83,0x5A84,0x5A85,
+ 0x5A86,0x5A87,0x5A88,0x5A89,0x5A8A,0x5A8B,0x5A8C,0x5A8D,
+ 0x5A8E,0x5A8F,0x5A90,0x5A91,0x5A93,0x5A94,0x5A95,0x5A96,
+ 0x5A97,0x5A98,0x5A99,0x5A9C,0x5A9D,0x5A9E,0x5A9F,0x5AA0,
+ 0x5AA1,0x5AA2,0x5AA3,0x5AA4,0x5AA5,0x5AA6,0x5AA7,0x5AA8,
+ 0x5AA9,0x5AAB,0x5AAC,0x5AAD,0x5AAE,0x5AAF,0x5AB0,0x5AB1,
+ 0x5AB4,0x5AB6,0x5AB7,0x5AB9,0x5ABA,0x5ABB,0x5ABC,0x5ABD,
+ 0x5ABF,0x5AC0,0x5AC3,0x5AC4,0x5AC5,0x5AC6,0x5AC7,0x5AC8,
+ 0x5ACA,0x5ACB,0x5ACD,0x5ACE,0x5ACF,0x5AD0,0x5AD1,0x5AD3,
+ 0x5AD5,0x5AD7,0x5AD9,0x5ADA,0x5ADB,0x5ADD,0x5ADE,0x5ADF,
+ 0x5AE2,0x5AE4,0x5AE5,0x5AE7,0x5AE8,0x5AEA,0x5AEC,0x5AED,
+ 0x5AEE,0x5AEF,0x5AF0,0x5AF2,0x5AF3,0x5AF4,0x5AF5,0x5AF6,
+ 0x5AF7,0x5AF8,0x5AF9,0x5AFA,0x5AFB,0x5AFC,0x5AFD,0x5AFE,
+ 0x5AFF,0x5B00,0x5B01,0x5B02,0x5B03,0x5B04,0x5B05,0x5B06,
+ 0x5B07,0x5B08,0x5B0A,0x5B0B,0x5B0C,0x5B0D,0x5B0E,0x5B0F,
+ 0x5B10,0x5B11,0x5B12,0x5B13,0x5B14,0x5B15,0x5B18,0x5B19,
+ 0x5B1A,0x5B1B,0x5B1C,0x5B1D,0x5B1E,0x5B1F,0x5B20,0x5B21,
+ 0x5B22,0x5B23,0x5B24,0x5B25,0x5B26,0x5B27,0x5B28,0x5B29,
+ 0x5B2A,0x5B2B,0x5B2C,0x5B2D,0x5B2E,0x5B2F,0x5B30,0x5B31,
+ 0x5B33,0x5B35,0x5B36,0x5B38,0x5B39,0x5B3A,0x5B3B,0x5B3C,
+ 0x5B3D,0x5B3E,0x5B3F,0x5B41,0x5B42,0x5B43,0x5B44,0x5B45,
+ 0x5B46,0x5B47,0x5B48,0x5B49,0x5B4A,0x5B4B,0x5B4C,0x5B4D,
+ 0x5B4E,0x5B4F,0x5B52,0x5B56,0x5B5E,0x5B60,0x5B61,0x5B67,
+ 0x5B68,0x5B6B,0x5B6D,0x5B6E,0x5B6F,0x5B72,0x5B74,0x5B76,
+ 0x5B77,0x5B78,0x5B79,0x5B7B,0x5B7C,0x5B7E,0x5B7F,0x5B82,
+ 0x5B86,0x5B8A,0x5B8D,0x5B8E,0x5B90,0x5B91,0x5B92,0x5B94,
+ 0x5B96,0x5B9F,0x5BA7,0x5BA8,0x5BA9,0x5BAC,0x5BAD,0x5BAE,
+ 0x5BAF,0x5BB1,0x5BB2,0x5BB7,0x5BBA,0x5BBB,0x5BBC,0x5BC0,
+ 0x5BC1,0x5BC3,0x5BC8,0x5BC9,0x5BCA,0x5BCB,0x5BCD,0x5BCE,
+ 0x5BCF,0x5BD1,0x5BD4,0x5BD5,0x5BD6,0x5BD7,0x5BD8,0x5BD9,
+ 0x5BDA,0x5BDB,0x5BDC,0x5BE0,0x5BE2,0x5BE3,0x5BE6,0x5BE7,
+ 0x5BE9,0x5BEA,0x5BEB,0x5BEC,0x5BED,0x5BEF,0x5BF1,0x5BF2,
+ 0x5BF3,0x5BF4,0x5BF5,0x5BF6,0x5BF7,0x5BFD,0x5BFE,0x5C00,
+ 0x5C02,0x5C03,0x5C05,0x5C07,0x5C08,0x5C0B,0x5C0C,0x5C0D,
+ 0x5C0E,0x5C10,0x5C12,0x5C13,0x5C17,0x5C19,0x5C1B,0x5C1E,
+ 0x5C1F,0x5C20,0x5C21,0x5C23,0x5C26,0x5C28,0x5C29,0x5C2A,
+ 0x5C2B,0x5C2D,0x5C2E,0x5C2F,0x5C30,0x5C32,0x5C33,0x5C35,
+ 0x5C36,0x5C37,0x5C43,0x5C44,0x5C46,0x5C47,0x5C4C,0x5C4D,
+ 0x5C52,0x5C53,0x5C54,0x5C56,0x5C57,0x5C58,0x5C5A,0x5C5B,
+ 0x5C5C,0x5C5D,0x5C5F,0x5C62,0x5C64,0x5C67,0x5C68,0x5C69,
+ 0x5C6A,0x5C6B,0x5C6C,0x5C6D,0x5C70,0x5C72,0x5C73,0x5C74,
+ 0x5C75,0x5C76,0x5C77,0x5C78,0x5C7B,0x5C7C,0x5C7D,0x5C7E,
+ 0x5C80,0x5C83,0x5C84,0x5C85,0x5C86,0x5C87,0x5C89,0x5C8A,
+ 0x5C8B,0x5C8E,0x5C8F,0x5C92,0x5C93,0x5C95,0x5C9D,0x5C9E,
+ 0x5C9F,0x5CA0,0x5CA1,0x5CA4,0x5CA5,0x5CA6,0x5CA7,0x5CA8,
+ 0x5CAA,0x5CAE,0x5CAF,0x5CB0,0x5CB2,0x5CB4,0x5CB6,0x5CB9,
+ 0x5CBA,0x5CBB,0x5CBC,0x5CBE,0x5CC0,0x5CC2,0x5CC3,0x5CC5,
+ 0x5CC6,0x5CC7,0x5CC8,0x5CC9,0x5CCA,0x5CCC,0x5CCD,0x5CCE,
+ 0x5CCF,0x5CD0,0x5CD1,0x5CD3,0x5CD4,0x5CD5,0x5CD6,0x5CD7,
+ 0x5CD8,0x5CDA,0x5CDB,0x5CDC,0x5CDD,0x5CDE,0x5CDF,0x5CE0,
+ 0x5CE2,0x5CE3,0x5CE7,0x5CE9,0x5CEB,0x5CEC,0x5CEE,0x5CEF,
+ 0x5CF1,0x5CF2,0x5CF3,0x5CF4,0x5CF5,0x5CF6,0x5CF7,0x5CF8,
+ 0x5CF9,0x5CFA,0x5CFC,0x5CFD,0x5CFE,0x5CFF,0x5D00,0x5D01,
+ 0x5D04,0x5D05,0x5D08,0x5D09,0x5D0A,0x5D0B,0x5D0C,0x5D0D,
+ 0x5D0F,0x5D10,0x5D11,0x5D12,0x5D13,0x5D15,0x5D17,0x5D18,
+ 0x5D19,0x5D1A,0x5D1C,0x5D1D,0x5D1F,0x5D20,0x5D21,0x5D22,
+ 0x5D23,0x5D25,0x5D28,0x5D2A,0x5D2B,0x5D2C,0x5D2F,0x5D30,
+ 0x5D31,0x5D32,0x5D33,0x5D35,0x5D36,0x5D37,0x5D38,0x5D39,
+ 0x5D3A,0x5D3B,0x5D3C,0x5D3F,0x5D40,0x5D41,0x5D42,0x5D43,
+ 0x5D44,0x5D45,0x5D46,0x5D48,0x5D49,0x5D4D,0x5D4E,0x5D4F,
+ 0x5D50,0x5D51,0x5D52,0x5D53,0x5D54,0x5D55,0x5D56,0x5D57,
+ 0x5D59,0x5D5A,0x5D5C,0x5D5E,0x5D5F,0x5D60,0x5D61,0x5D62,
+ 0x5D63,0x5D64,0x5D65,0x5D66,0x5D67,0x5D68,0x5D6A,0x5D6D,
+ 0x5D6E,0x5D70,0x5D71,0x5D72,0x5D73,0x5D75,0x5D76,0x5D77,
+ 0x5D78,0x5D79,0x5D7A,0x5D7B,0x5D7C,0x5D7D,0x5D7E,0x5D7F,
+ 0x5D80,0x5D81,0x5D83,0x5D84,0x5D85,0x5D86,0x5D87,0x5D88,
+ 0x5D89,0x5D8A,0x5D8B,0x5D8C,0x5D8D,0x5D8E,0x5D8F,0x5D90,
+ 0x5D91,0x5D92,0x5D93,0x5D94,0x5D95,0x5D96,0x5D97,0x5D98,
+ 0x5D9A,0x5D9B,0x5D9C,0x5D9E,0x5D9F,0x5DA0,0x5DA1,0x5DA2,
+ 0x5DA3,0x5DA4,0x5DA5,0x5DA6,0x5DA7,0x5DA8,0x5DA9,0x5DAA,
+ 0x5DAB,0x5DAC,0x5DAD,0x5DAE,0x5DAF,0x5DB0,0x5DB1,0x5DB2,
+ 0x5DB3,0x5DB4,0x5DB5,0x5DB6,0x5DB8,0x5DB9,0x5DBA,0x5DBB,
+ 0x5DBC,0x5DBD,0x5DBE,0x5DBF,0x5DC0,0x5DC1,0x5DC2,0x5DC3,
+ 0x5DC4,0x5DC6,0x5DC7,0x5DC8,0x5DC9,0x5DCA,0x5DCB,0x5DCC,
+ 0x5DCE,0x5DCF,0x5DD0,0x5DD1,0x5DD2,0x5DD3,0x5DD4,0x5DD5,
+ 0x5DD6,0x5DD7,0x5DD8,0x5DD9,0x5DDA,0x5DDC,0x5DDF,0x5DE0,
+ 0x5DE3,0x5DE4,0x5DEA,0x5DEC,0x5DED,0x5DF0,0x5DF5,0x5DF6,
+ 0x5DF8,0x5DF9,0x5DFA,0x5DFB,0x5DFC,0x5DFF,0x5E00,0x5E04,
+ 0x5E07,0x5E09,0x5E0A,0x5E0B,0x5E0D,0x5E0E,0x5E12,0x5E13,
+ 0x5E17,0x5E1E,0x5E1F,0x5E20,0x5E21,0x5E22,0x5E23,0x5E24,
+ 0x5E25,0x5E28,0x5E29,0x5E2A,0x5E2B,0x5E2C,0x5E2F,0x5E30,
+ 0x5E32,0x5E33,0x5E34,0x5E35,0x5E36,0x5E39,0x5E3A,0x5E3E,
+ 0x5E3F,0x5E40,0x5E41,0x5E43,0x5E46,0x5E47,0x5E48,0x5E49,
+ 0x5E4A,0x5E4B,0x5E4D,0x5E4E,0x5E4F,0x5E50,0x5E51,0x5E52,
+ 0x5E53,0x5E56,0x5E57,0x5E58,0x5E59,0x5E5A,0x5E5C,0x5E5D,
+ 0x5E5F,0x5E60,0x5E63,0x5E64,0x5E65,0x5E66,0x5E67,0x5E68,
+ 0x5E69,0x5E6A,0x5E6B,0x5E6C,0x5E6D,0x5E6E,0x5E6F,0x5E70,
+ 0x5E71,0x5E75,0x5E77,0x5E79,0x5E7E,0x5E81,0x5E82,0x5E83,
+ 0x5E85,0x5E88,0x5E89,0x5E8C,0x5E8D,0x5E8E,0x5E92,0x5E98,
+ 0x5E9B,0x5E9D,0x5EA1,0x5EA2,0x5EA3,0x5EA4,0x5EA8,0x5EA9,
+ 0x5EAA,0x5EAB,0x5EAC,0x5EAE,0x5EAF,0x5EB0,0x5EB1,0x5EB2,
+ 0x5EB4,0x5EBA,0x5EBB,0x5EBC,0x5EBD,0x5EBF,0x5EC0,0x5EC1,
+ 0x5EC2,0x5EC3,0x5EC4,0x5EC5,0x5EC6,0x5EC7,0x5EC8,0x5ECB,
+ 0x5ECC,0x5ECD,0x5ECE,0x5ECF,0x5ED0,0x5ED4,0x5ED5,0x5ED7,
+ 0x5ED8,0x5ED9,0x5EDA,0x5EDC,0x5EDD,0x5EDE,0x5EDF,0x5EE0,
+ 0x5EE1,0x5EE2,0x5EE3,0x5EE4,0x5EE5,0x5EE6,0x5EE7,0x5EE9,
+ 0x5EEB,0x5EEC,0x5EED,0x5EEE,0x5EEF,0x5EF0,0x5EF1,0x5EF2,
+ 0x5EF3,0x5EF5,0x5EF8,0x5EF9,0x5EFB,0x5EFC,0x5EFD,0x5F05,
+ 0x5F06,0x5F07,0x5F09,0x5F0C,0x5F0D,0x5F0E,0x5F10,0x5F12,
+ 0x5F14,0x5F16,0x5F19,0x5F1A,0x5F1C,0x5F1D,0x5F1E,0x5F21,
+ 0x5F22,0x5F23,0x5F24,0x5F28,0x5F2B,0x5F2C,0x5F2E,0x5F30,
+ 0x5F32,0x5F33,0x5F34,0x5F35,0x5F36,0x5F37,0x5F38,0x5F3B,
+ 0x5F3D,0x5F3E,0x5F3F,0x5F41,0x5F42,0x5F43,0x5F44,0x5F45,
+ 0x5F46,0x5F47,0x5F48,0x5F49,0x5F4A,0x5F4B,0x5F4C,0x5F4D,
+ 0x5F4E,0x5F4F,0x5F51,0x5F54,0x5F59,0x5F5A,0x5F5B,0x5F5C,
+ 0x5F5E,0x5F5F,0x5F60,0x5F63,0x5F65,0x5F67,0x5F68,0x5F6B,
+ 0x5F6E,0x5F6F,0x5F72,0x5F74,0x5F75,0x5F76,0x5F78,0x5F7A,
+ 0x5F7D,0x5F7E,0x5F7F,0x5F83,0x5F86,0x5F8D,0x5F8E,0x5F8F,
+ 0x5F91,0x5F93,0x5F94,0x5F96,0x5F9A,0x5F9B,0x5F9D,0x5F9E,
+ 0x5F9F,0x5FA0,0x5FA2,0x5FA3,0x5FA4,0x5FA5,0x5FA6,0x5FA7,
+ 0x5FA9,0x5FAB,0x5FAC,0x5FAF,0x5FB0,0x5FB1,0x5FB2,0x5FB3,
+ 0x5FB4,0x5FB6,0x5FB8,0x5FB9,0x5FBA,0x5FBB,0x5FBE,0x5FBF,
+ 0x5FC0,0x5FC1,0x5FC2,0x5FC7,0x5FC8,0x5FCA,0x5FCB,0x5FCE,
+ 0x5FD3,0x5FD4,0x5FD5,0x5FDA,0x5FDB,0x5FDC,0x5FDE,0x5FDF,
+ 0x5FE2,0x5FE3,0x5FE5,0x5FE6,0x5FE8,0x5FE9,0x5FEC,0x5FEF,
+ 0x5FF0,0x5FF2,0x5FF3,0x5FF4,0x5FF6,0x5FF7,0x5FF9,0x5FFA,
+ 0x5FFC,0x6007,0x6008,0x6009,0x600B,0x600C,0x6010,0x6011,
+ 0x6013,0x6017,0x6018,0x601A,0x601E,0x601F,0x6022,0x6023,
+ 0x6024,0x602C,0x602D,0x602E,0x6030,0x6031,0x6032,0x6033,
+ 0x6034,0x6036,0x6037,0x6038,0x6039,0x603A,0x603D,0x603E,
+ 0x6040,0x6044,0x6045,0x6046,0x6047,0x6048,0x6049,0x604A,
+ 0x604C,0x604E,0x604F,0x6051,0x6053,0x6054,0x6056,0x6057,
+ 0x6058,0x605B,0x605C,0x605E,0x605F,0x6060,0x6061,0x6065,
+ 0x6066,0x606E,0x6071,0x6072,0x6074,0x6075,0x6077,0x607E,
+ 0x6080,0x6081,0x6082,0x6085,0x6086,0x6087,0x6088,0x608A,
+ 0x608B,0x608E,0x608F,0x6090,0x6091,0x6093,0x6095,0x6097,
+ 0x6098,0x6099,0x609C,0x609E,0x60A1,0x60A2,0x60A4,0x60A5,
+ 0x60A7,0x60A9,0x60AA,0x60AE,0x60B0,0x60B3,0x60B5,0x60B6,
+ 0x60B7,0x60B9,0x60BA,0x60BD,0x60BE,0x60BF,0x60C0,0x60C1,
+ 0x60C2,0x60C3,0x60C4,0x60C7,0x60C8,0x60C9,0x60CC,0x60CD,
+ 0x60CE,0x60CF,0x60D0,0x60D2,0x60D3,0x60D4,0x60D6,0x60D7,
+ 0x60D9,0x60DB,0x60DE,0x60E1,0x60E2,0x60E3,0x60E4,0x60E5,
+ 0x60EA,0x60F1,0x60F2,0x60F5,0x60F7,0x60F8,0x60FB,0x60FC,
+ 0x60FD,0x60FE,0x60FF,0x6102,0x6103,0x6104,0x6105,0x6107,
+ 0x610A,0x610B,0x610C,0x6110,0x6111,0x6112,0x6113,0x6114,
+ 0x6116,0x6117,0x6118,0x6119,0x611B,0x611C,0x611D,0x611E,
+ 0x6121,0x6122,0x6125,0x6128,0x6129,0x612A,0x612C,0x612D,
+ 0x612E,0x612F,0x6130,0x6131,0x6132,0x6133,0x6134,0x6135,
+ 0x6136,0x6137,0x6138,0x6139,0x613A,0x613B,0x613C,0x613D,
+ 0x613E,0x6140,0x6141,0x6142,0x6143,0x6144,0x6145,0x6146,
+ 0x6147,0x6149,0x614B,0x614D,0x614F,0x6150,0x6152,0x6153,
+ 0x6154,0x6156,0x6157,0x6158,0x6159,0x615A,0x615B,0x615C,
+ 0x615E,0x615F,0x6160,0x6161,0x6163,0x6164,0x6165,0x6166,
+ 0x6169,0x616A,0x616B,0x616C,0x616D,0x616E,0x616F,0x6171,
+ 0x6172,0x6173,0x6174,0x6176,0x6178,0x6179,0x617A,0x617B,
+ 0x617C,0x617D,0x617E,0x617F,0x6180,0x6181,0x6182,0x6183,
+ 0x6184,0x6185,0x6186,0x6187,0x6188,0x6189,0x618A,0x618C,
+ 0x618D,0x618F,0x6190,0x6191,0x6192,0x6193,0x6195,0x6196,
+ 0x6197,0x6198,0x6199,0x619A,0x619B,0x619C,0x619E,0x619F,
+ 0x61A0,0x61A1,0x61A2,0x61A3,0x61A4,0x61A5,0x61A6,0x61AA,
+ 0x61AB,0x61AD,0x61AE,0x61AF,0x61B0,0x61B1,0x61B2,0x61B3,
+ 0x61B4,0x61B5,0x61B6,0x61B8,0x61B9,0x61BA,0x61BB,0x61BC,
+ 0x61BD,0x61BF,0x61C0,0x61C1,0x61C3,0x61C4,0x61C5,0x61C6,
+ 0x61C7,0x61C9,0x61CC,0x61CD,0x61CE,0x61CF,0x61D0,0x61D3,
+ 0x61D5,0x61D6,0x61D7,0x61D8,0x61D9,0x61DA,0x61DB,0x61DC,
+ 0x61DD,0x61DE,0x61DF,0x61E0,0x61E1,0x61E2,0x61E3,0x61E4,
+ 0x61E5,0x61E7,0x61E8,0x61E9,0x61EA,0x61EB,0x61EC,0x61ED,
+ 0x61EE,0x61EF,0x61F0,0x61F1,0x61F2,0x61F3,0x61F4,0x61F6,
+ 0x61F7,0x61F8,0x61F9,0x61FA,0x61FB,0x61FC,0x61FD,0x61FE,
+ 0x6200,0x6201,0x6202,0x6203,0x6204,0x6205,0x6207,0x6209,
+ 0x6213,0x6214,0x6219,0x621C,0x621D,0x621E,0x6220,0x6223,
+ 0x6226,0x6227,0x6228,0x6229,0x622B,0x622D,0x622F,0x6230,
+ 0x6231,0x6232,0x6235,0x6236,0x6238,0x6239,0x623A,0x623B,
+ 0x623C,0x6242,0x6244,0x6245,0x6246,0x624A,0x624F,0x6250,
+ 0x6255,0x6256,0x6257,0x6259,0x625A,0x625C,0x625D,0x625E,
+ 0x625F,0x6260,0x6261,0x6262,0x6264,0x6265,0x6268,0x6271,
+ 0x6272,0x6274,0x6275,0x6277,0x6278,0x627A,0x627B,0x627D,
+ 0x6281,0x6282,0x6283,0x6285,0x6286,0x6287,0x6288,0x628B,
+ 0x628C,0x628D,0x628E,0x628F,0x6290,0x6294,0x6299,0x629C,
+ 0x629D,0x629E,0x62A3,0x62A6,0x62A7,0x62A9,0x62AA,0x62AD,
+ 0x62AE,0x62AF,0x62B0,0x62B2,0x62B3,0x62B4,0x62B6,0x62B7,
+ 0x62B8,0x62BA,0x62BE,0x62C0,0x62C1,0x62C3,0x62CB,0x62CF,
+ 0x62D1,0x62D5,0x62DD,0x62DE,0x62E0,0x62E1,0x62E4,0x62EA,
+ 0x62EB,0x62F0,0x62F2,0x62F5,0x62F8,0x62F9,0x62FA,0x62FB,
+ 0x6300,0x6303,0x6304,0x6305,0x6306,0x630A,0x630B,0x630C,
+ 0x630D,0x630F,0x6310,0x6312,0x6313,0x6314,0x6315,0x6317,
+ 0x6318,0x6319,0x631C,0x6326,0x6327,0x6329,0x632C,0x632D,
+ 0x632E,0x6330,0x6331,0x6333,0x6334,0x6335,0x6336,0x6337,
+ 0x6338,0x633B,0x633C,0x633E,0x633F,0x6340,0x6341,0x6344,
+ 0x6347,0x6348,0x634A,0x6351,0x6352,0x6353,0x6354,0x6356,
+ 0x6357,0x6358,0x6359,0x635A,0x635B,0x635C,0x635D,0x6360,
+ 0x6364,0x6365,0x6366,0x6368,0x636A,0x636B,0x636C,0x636F,
+ 0x6370,0x6372,0x6373,0x6374,0x6375,0x6378,0x6379,0x637C,
+ 0x637D,0x637E,0x637F,0x6381,0x6383,0x6384,0x6385,0x6386,
+ 0x638B,0x638D,0x6391,0x6393,0x6394,0x6395,0x6397,0x6399,
+ 0x639A,0x639B,0x639C,0x639D,0x639E,0x639F,0x63A1,0x63A4,
+ 0x63A6,0x63AB,0x63AF,0x63B1,0x63B2,0x63B5,0x63B6,0x63B9,
+ 0x63BB,0x63BD,0x63BF,0x63C0,0x63C1,0x63C2,0x63C3,0x63C5,
+ 0x63C7,0x63C8,0x63CA,0x63CB,0x63CC,0x63D1,0x63D3,0x63D4,
+ 0x63D5,0x63D7,0x63D8,0x63D9,0x63DA,0x63DB,0x63DC,0x63DD,
+ 0x63DF,0x63E2,0x63E4,0x63E5,0x63E6,0x63E7,0x63E8,0x63EB,
+ 0x63EC,0x63EE,0x63EF,0x63F0,0x63F1,0x63F3,0x63F5,0x63F7,
+ 0x63F9,0x63FA,0x63FB,0x63FC,0x63FE,0x6403,0x6404,0x6406,
+ 0x6407,0x6408,0x6409,0x640A,0x640D,0x640E,0x6411,0x6412,
+ 0x6415,0x6416,0x6417,0x6418,0x6419,0x641A,0x641D,0x641F,
+ 0x6422,0x6423,0x6424,0x6425,0x6427,0x6428,0x6429,0x642B,
+ 0x642E,0x642F,0x6430,0x6431,0x6432,0x6433,0x6435,0x6436,
+ 0x6437,0x6438,0x6439,0x643B,0x643C,0x643E,0x6440,0x6442,
+ 0x6443,0x6449,0x644B,0x644C,0x644D,0x644E,0x644F,0x6450,
+ 0x6451,0x6453,0x6455,0x6456,0x6457,0x6459,0x645A,0x645B,
+ 0x645C,0x645D,0x645F,0x6460,0x6461,0x6462,0x6463,0x6464,
+ 0x6465,0x6466,0x6468,0x646A,0x646B,0x646C,0x646E,0x646F,
+ 0x6470,0x6471,0x6472,0x6473,0x6474,0x6475,0x6476,0x6477,
+ 0x647B,0x647C,0x647D,0x647E,0x647F,0x6480,0x6481,0x6483,
+ 0x6486,0x6488,0x6489,0x648A,0x648B,0x648C,0x648D,0x648E,
+ 0x648F,0x6490,0x6493,0x6494,0x6497,0x6498,0x649A,0x649B,
+ 0x649C,0x649D,0x649F,0x64A0,0x64A1,0x64A2,0x64A3,0x64A5,
+ 0x64A6,0x64A7,0x64A8,0x64AA,0x64AB,0x64AF,0x64B1,0x64B2,
+ 0x64B3,0x64B4,0x64B6,0x64B9,0x64BB,0x64BD,0x64BE,0x64BF,
+ 0x64C1,0x64C3,0x64C4,0x64C6,0x64C7,0x64C8,0x64C9,0x64CA,
+ 0x64CB,0x64CC,0x64CF,0x64D1,0x64D3,0x64D4,0x64D5,0x64D6,
+ 0x64D9,0x64DA,0x64DB,0x64DC,0x64DD,0x64DF,0x64E0,0x64E1,
+ 0x64E3,0x64E5,0x64E7,0x64E8,0x64E9,0x64EA,0x64EB,0x64EC,
+ 0x64ED,0x64EE,0x64EF,0x64F0,0x64F1,0x64F2,0x64F3,0x64F4,
+ 0x64F5,0x64F6,0x64F7,0x64F8,0x64F9,0x64FA,0x64FB,0x64FC,
+ 0x64FD,0x64FE,0x64FF,0x6501,0x6502,0x6503,0x6504,0x6505,
+ 0x6506,0x6507,0x6508,0x650A,0x650B,0x650C,0x650D,0x650E,
+ 0x650F,0x6510,0x6511,0x6513,0x6514,0x6515,0x6516,0x6517,
+ 0x6519,0x651A,0x651B,0x651C,0x651D,0x651E,0x651F,0x6520,
+ 0x6521,0x6522,0x6523,0x6524,0x6526,0x6527,0x6528,0x6529,
+ 0x652A,0x652C,0x652D,0x6530,0x6531,0x6532,0x6533,0x6537,
+ 0x653A,0x653C,0x653D,0x6540,0x6541,0x6542,0x6543,0x6544,
+ 0x6546,0x6547,0x654A,0x654B,0x654D,0x654E,0x6550,0x6552,
+ 0x6553,0x6554,0x6557,0x6558,0x655A,0x655C,0x655F,0x6560,
+ 0x6561,0x6564,0x6565,0x6567,0x6568,0x6569,0x656A,0x656D,
+ 0x656E,0x656F,0x6571,0x6573,0x6575,0x6576,0x6578,0x6579,
+ 0x657A,0x657B,0x657C,0x657D,0x657E,0x657F,0x6580,0x6581,
+ 0x6582,0x6583,0x6584,0x6585,0x6586,0x6588,0x6589,0x658A,
+ 0x658D,0x658E,0x658F,0x6592,0x6594,0x6595,0x6596,0x6598,
+ 0x659A,0x659D,0x659E,0x65A0,0x65A2,0x65A3,0x65A6,0x65A8,
+ 0x65AA,0x65AC,0x65AE,0x65B1,0x65B2,0x65B3,0x65B4,0x65B5,
+ 0x65B6,0x65B7,0x65B8,0x65BA,0x65BB,0x65BE,0x65BF,0x65C0,
+ 0x65C2,0x65C7,0x65C8,0x65C9,0x65CA,0x65CD,0x65D0,0x65D1,
+ 0x65D3,0x65D4,0x65D5,0x65D8,0x65D9,0x65DA,0x65DB,0x65DC,
+ 0x65DD,0x65DE,0x65DF,0x65E1,0x65E3,0x65E4,0x65EA,0x65EB,
+ 0x65F2,0x65F3,0x65F4,0x65F5,0x65F8,0x65F9,0x65FB,0x65FC,
+ 0x65FD,0x65FE,0x65FF,0x6601,0x6604,0x6605,0x6607,0x6608,
+ 0x6609,0x660B,0x660D,0x6610,0x6611,0x6612,0x6616,0x6617,
+ 0x6618,0x661A,0x661B,0x661C,0x661E,0x6621,0x6622,0x6623,
+ 0x6624,0x6626,0x6629,0x662A,0x662B,0x662C,0x662E,0x6630,
+ 0x6632,0x6633,0x6637,0x6638,0x6639,0x663A,0x663B,0x663D,
+ 0x663F,0x6640,0x6642,0x6644,0x6645,0x6646,0x6647,0x6648,
+ 0x6649,0x664A,0x664D,0x664E,0x6650,0x6651,0x6658,0x6659,
+ 0x665B,0x665C,0x665D,0x665E,0x6660,0x6662,0x6663,0x6665,
+ 0x6667,0x6669,0x666A,0x666B,0x666C,0x666D,0x6671,0x6672,
+ 0x6673,0x6675,0x6678,0x6679,0x667B,0x667C,0x667D,0x667F,
+ 0x6680,0x6681,0x6683,0x6685,0x6686,0x6688,0x6689,0x668A,
+ 0x668B,0x668D,0x668E,0x668F,0x6690,0x6692,0x6693,0x6694,
+ 0x6695,0x6698,0x6699,0x669A,0x669B,0x669C,0x669E,0x669F,
+ 0x66A0,0x66A1,0x66A2,0x66A3,0x66A4,0x66A5,0x66A6,0x66A9,
+ 0x66AA,0x66AB,0x66AC,0x66AD,0x66AF,0x66B0,0x66B1,0x66B2,
+ 0x66B3,0x66B5,0x66B6,0x66B7,0x66B8,0x66BA,0x66BB,0x66BC,
+ 0x66BD,0x66BF,0x66C0,0x66C1,0x66C2,0x66C3,0x66C4,0x66C5,
+ 0x66C6,0x66C7,0x66C8,0x66C9,0x66CA,0x66CB,0x66CC,0x66CD,
+ 0x66CE,0x66CF,0x66D0,0x66D1,0x66D2,0x66D3,0x66D4,0x66D5,
+ 0x66D6,0x66D7,0x66D8,0x66DA,0x66DE,0x66DF,0x66E0,0x66E1,
+ 0x66E2,0x66E3,0x66E4,0x66E5,0x66E7,0x66E8,0x66EA,0x66EB,
+ 0x66EC,0x66ED,0x66EE,0x66EF,0x66F1,0x66F5,0x66F6,0x66F8,
+ 0x66FA,0x66FB,0x66FD,0x6701,0x6702,0x6703,0x6704,0x6705,
+ 0x6706,0x6707,0x670C,0x670E,0x670F,0x6711,0x6712,0x6713,
+ 0x6716,0x6718,0x6719,0x671A,0x671C,0x671E,0x6720,0x6721,
+ 0x6722,0x6723,0x6724,0x6725,0x6727,0x6729,0x672E,0x6730,
+ 0x6732,0x6733,0x6736,0x6737,0x6738,0x6739,0x673B,0x673C,
+ 0x673E,0x673F,0x6741,0x6744,0x6745,0x6747,0x674A,0x674B,
+ 0x674D,0x6752,0x6754,0x6755,0x6757,0x6758,0x6759,0x675A,
+ 0x675B,0x675D,0x6762,0x6763,0x6764,0x6766,0x6767,0x676B,
+ 0x676C,0x676E,0x6771,0x6774,0x6776,0x6778,0x6779,0x677A,
+ 0x677B,0x677D,0x6780,0x6782,0x6783,0x6785,0x6786,0x6788,
+ 0x678A,0x678C,0x678D,0x678E,0x678F,0x6791,0x6792,0x6793,
+ 0x6794,0x6796,0x6799,0x679B,0x679F,0x67A0,0x67A1,0x67A4,
+ 0x67A6,0x67A9,0x67AC,0x67AE,0x67B1,0x67B2,0x67B4,0x67B9,
+ 0x67BA,0x67BB,0x67BC,0x67BD,0x67BE,0x67BF,0x67C0,0x67C2,
+ 0x67C5,0x67C6,0x67C7,0x67C8,0x67C9,0x67CA,0x67CB,0x67CC,
+ 0x67CD,0x67CE,0x67D5,0x67D6,0x67D7,0x67DB,0x67DF,0x67E1,
+ 0x67E3,0x67E4,0x67E6,0x67E7,0x67E8,0x67EA,0x67EB,0x67ED,
+ 0x67EE,0x67F2,0x67F5,0x67F6,0x67F7,0x67F8,0x67F9,0x67FA,
+ 0x67FB,0x67FC,0x67FE,0x6801,0x6802,0x6803,0x6804,0x6806,
+ 0x680D,0x6810,0x6812,0x6814,0x6815,0x6818,0x6819,0x681A,
+ 0x681B,0x681C,0x681E,0x681F,0x6820,0x6822,0x6823,0x6824,
+ 0x6825,0x6826,0x6827,0x6828,0x682B,0x682C,0x682D,0x682E,
+ 0x682F,0x6830,0x6831,0x6834,0x6835,0x6836,0x683A,0x683B,
+ 0x683F,0x6847,0x684B,0x684D,0x684F,0x6852,0x6856,0x6857,
+ 0x6858,0x6859,0x685A,0x685B,0x685C,0x685D,0x685E,0x685F,
+ 0x686A,0x686C,0x686D,0x686E,0x686F,0x6870,0x6871,0x6872,
+ 0x6873,0x6875,0x6878,0x6879,0x687A,0x687B,0x687C,0x687D,
+ 0x687E,0x687F,0x6880,0x6882,0x6884,0x6887,0x6888,0x6889,
+ 0x688A,0x688B,0x688C,0x688D,0x688E,0x6890,0x6891,0x6892,
+ 0x6894,0x6895,0x6896,0x6898,0x6899,0x689A,0x689B,0x689C,
+ 0x689D,0x689E,0x689F,0x68A0,0x68A1,0x68A3,0x68A4,0x68A5,
+ 0x68A9,0x68AA,0x68AB,0x68AC,0x68AE,0x68B1,0x68B2,0x68B4,
+ 0x68B6,0x68B7,0x68B8,0x68B9,0x68BA,0x68BB,0x68BC,0x68BD,
+ 0x68BE,0x68BF,0x68C1,0x68C3,0x68C4,0x68C5,0x68C6,0x68C7,
+ 0x68C8,0x68CA,0x68CC,0x68CE,0x68CF,0x68D0,0x68D1,0x68D3,
+ 0x68D4,0x68D6,0x68D7,0x68D9,0x68DB,0x68DC,0x68DD,0x68DE,
+ 0x68DF,0x68E1,0x68E2,0x68E4,0x68E5,0x68E6,0x68E7,0x68E8,
+ 0x68E9,0x68EA,0x68EB,0x68EC,0x68ED,0x68EF,0x68F2,0x68F3,
+ 0x68F4,0x68F6,0x68F7,0x68F8,0x68FB,0x68FD,0x68FE,0x68FF,
+ 0x6900,0x6902,0x6903,0x6904,0x6906,0x6907,0x6908,0x6909,
+ 0x690A,0x690C,0x690F,0x6911,0x6913,0x6914,0x6915,0x6916,
+ 0x6917,0x6918,0x6919,0x691A,0x691B,0x691C,0x691D,0x691E,
+ 0x6921,0x6922,0x6923,0x6925,0x6926,0x6927,0x6928,0x6929,
+ 0x692A,0x692B,0x692C,0x692E,0x692F,0x6931,0x6932,0x6933,
+ 0x6935,0x6936,0x6937,0x6938,0x693A,0x693B,0x693C,0x693E,
+ 0x6940,0x6941,0x6943,0x6944,0x6945,0x6946,0x6947,0x6948,
+ 0x6949,0x694A,0x694B,0x694C,0x694D,0x694E,0x694F,0x6950,
+ 0x6951,0x6952,0x6953,0x6955,0x6956,0x6958,0x6959,0x695B,
+ 0x695C,0x695F,0x6961,0x6962,0x6964,0x6965,0x6967,0x6968,
+ 0x6969,0x696A,0x696C,0x696D,0x696F,0x6970,0x6972,0x6973,
+ 0x6974,0x6975,0x6976,0x697A,0x697B,0x697D,0x697E,0x697F,
+ 0x6981,0x6983,0x6985,0x698A,0x698B,0x698C,0x698E,0x698F,
+ 0x6990,0x6991,0x6992,0x6993,0x6996,0x6997,0x6999,0x699A,
+ 0x699D,0x699E,0x699F,0x69A0,0x69A1,0x69A2,0x69A3,0x69A4,
+ 0x69A5,0x69A6,0x69A9,0x69AA,0x69AC,0x69AE,0x69AF,0x69B0,
+ 0x69B2,0x69B3,0x69B5,0x69B6,0x69B8,0x69B9,0x69BA,0x69BC,
+ 0x69BD,0x69BE,0x69BF,0x69C0,0x69C2,0x69C3,0x69C4,0x69C5,
+ 0x69C6,0x69C7,0x69C8,0x69C9,0x69CB,0x69CD,0x69CF,0x69D1,
+ 0x69D2,0x69D3,0x69D5,0x69D6,0x69D7,0x69D8,0x69D9,0x69DA,
+ 0x69DC,0x69DD,0x69DE,0x69E1,0x69E2,0x69E3,0x69E4,0x69E5,
+ 0x69E6,0x69E7,0x69E8,0x69E9,0x69EA,0x69EB,0x69EC,0x69EE,
+ 0x69EF,0x69F0,0x69F1,0x69F3,0x69F4,0x69F5,0x69F6,0x69F7,
+ 0x69F8,0x69F9,0x69FA,0x69FB,0x69FC,0x69FE,0x6A00,0x6A01,
+ 0x6A02,0x6A03,0x6A04,0x6A05,0x6A06,0x6A07,0x6A08,0x6A09,
+ 0x6A0B,0x6A0C,0x6A0D,0x6A0E,0x6A0F,0x6A10,0x6A11,0x6A12,
+ 0x6A13,0x6A14,0x6A15,0x6A16,0x6A19,0x6A1A,0x6A1B,0x6A1C,
+ 0x6A1D,0x6A1E,0x6A20,0x6A22,0x6A23,0x6A24,0x6A25,0x6A26,
+ 0x6A27,0x6A29,0x6A2B,0x6A2C,0x6A2D,0x6A2E,0x6A30,0x6A32,
+ 0x6A33,0x6A34,0x6A36,0x6A37,0x6A38,0x6A39,0x6A3A,0x6A3B,
+ 0x6A3C,0x6A3F,0x6A40,0x6A41,0x6A42,0x6A43,0x6A45,0x6A46,
+ 0x6A48,0x6A49,0x6A4A,0x6A4B,0x6A4C,0x6A4D,0x6A4E,0x6A4F,
+ 0x6A51,0x6A52,0x6A53,0x6A54,0x6A55,0x6A56,0x6A57,0x6A5A,
+ 0x6A5C,0x6A5D,0x6A5E,0x6A5F,0x6A60,0x6A62,0x6A63,0x6A64,
+ 0x6A66,0x6A67,0x6A68,0x6A69,0x6A6A,0x6A6B,0x6A6C,0x6A6D,
+ 0x6A6E,0x6A6F,0x6A70,0x6A72,0x6A73,0x6A74,0x6A75,0x6A76,
+ 0x6A77,0x6A78,0x6A7A,0x6A7B,0x6A7D,0x6A7E,0x6A7F,0x6A81,
+ 0x6A82,0x6A83,0x6A85,0x6A86,0x6A87,0x6A88,0x6A89,0x6A8A,
+ 0x6A8B,0x6A8C,0x6A8D,0x6A8F,0x6A92,0x6A93,0x6A94,0x6A95,
+ 0x6A96,0x6A98,0x6A99,0x6A9A,0x6A9B,0x6A9C,0x6A9D,0x6A9E,
+ 0x6A9F,0x6AA1,0x6AA2,0x6AA3,0x6AA4,0x6AA5,0x6AA6,0x6AA7,
+ 0x6AA8,0x6AAA,0x6AAD,0x6AAE,0x6AAF,0x6AB0,0x6AB1,0x6AB2,
+ 0x6AB3,0x6AB4,0x6AB5,0x6AB6,0x6AB7,0x6AB8,0x6AB9,0x6ABA,
+ 0x6ABB,0x6ABC,0x6ABD,0x6ABE,0x6ABF,0x6AC0,0x6AC1,0x6AC2,
+ 0x6AC3,0x6AC4,0x6AC5,0x6AC6,0x6AC7,0x6AC8,0x6AC9,0x6ACA,
+ 0x6ACB,0x6ACC,0x6ACD,0x6ACE,0x6ACF,0x6AD0,0x6AD1,0x6AD2,
+ 0x6AD3,0x6AD4,0x6AD5,0x6AD6,0x6AD7,0x6AD8,0x6AD9,0x6ADA,
+ 0x6ADB,0x6ADC,0x6ADD,0x6ADE,0x6ADF,0x6AE0,0x6AE1,0x6AE2,
+ 0x6AE3,0x6AE4,0x6AE5,0x6AE6,0x6AE7,0x6AE8,0x6AE9,0x6AEA,
+ 0x6AEB,0x6AEC,0x6AED,0x6AEE,0x6AEF,0x6AF0,0x6AF1,0x6AF2,
+ 0x6AF3,0x6AF4,0x6AF5,0x6AF6,0x6AF7,0x6AF8,0x6AF9,0x6AFA,
+ 0x6AFB,0x6AFC,0x6AFD,0x6AFE,0x6AFF,0x6B00,0x6B01,0x6B02,
+ 0x6B03,0x6B04,0x6B05,0x6B06,0x6B07,0x6B08,0x6B09,0x6B0A,
+ 0x6B0B,0x6B0C,0x6B0D,0x6B0E,0x6B0F,0x6B10,0x6B11,0x6B12,
+ 0x6B13,0x6B14,0x6B15,0x6B16,0x6B17,0x6B18,0x6B19,0x6B1A,
+ 0x6B1B,0x6B1C,0x6B1D,0x6B1E,0x6B1F,0x6B25,0x6B26,0x6B28,
+ 0x6B29,0x6B2A,0x6B2B,0x6B2C,0x6B2D,0x6B2E,0x6B2F,0x6B30,
+ 0x6B31,0x6B33,0x6B34,0x6B35,0x6B36,0x6B38,0x6B3B,0x6B3C,
+ 0x6B3D,0x6B3F,0x6B40,0x6B41,0x6B42,0x6B44,0x6B45,0x6B48,
+ 0x6B4A,0x6B4B,0x6B4D,0x6B4E,0x6B4F,0x6B50,0x6B51,0x6B52,
+ 0x6B53,0x6B54,0x6B55,0x6B56,0x6B57,0x6B58,0x6B5A,0x6B5B,
+ 0x6B5C,0x6B5D,0x6B5E,0x6B5F,0x6B60,0x6B61,0x6B68,0x6B69,
+ 0x6B6B,0x6B6C,0x6B6D,0x6B6E,0x6B6F,0x6B70,0x6B71,0x6B72,
+ 0x6B73,0x6B74,0x6B75,0x6B76,0x6B77,0x6B78,0x6B7A,0x6B7D,
+ 0x6B7E,0x6B7F,0x6B80,0x6B85,0x6B88,0x6B8C,0x6B8E,0x6B8F,
+ 0x6B90,0x6B91,0x6B94,0x6B95,0x6B97,0x6B98,0x6B99,0x6B9C,
+ 0x6B9D,0x6B9E,0x6B9F,0x6BA0,0x6BA2,0x6BA3,0x6BA4,0x6BA5,
+ 0x6BA6,0x6BA7,0x6BA8,0x6BA9,0x6BAB,0x6BAC,0x6BAD,0x6BAE,
+ 0x6BAF,0x6BB0,0x6BB1,0x6BB2,0x6BB6,0x6BB8,0x6BB9,0x6BBA,
+ 0x6BBB,0x6BBC,0x6BBD,0x6BBE,0x6BC0,0x6BC3,0x6BC4,0x6BC6,
+ 0x6BC7,0x6BC8,0x6BC9,0x6BCA,0x6BCC,0x6BCE,0x6BD0,0x6BD1,
+ 0x6BD8,0x6BDA,0x6BDC,0x6BDD,0x6BDE,0x6BDF,0x6BE0,0x6BE2,
+ 0x6BE3,0x6BE4,0x6BE5,0x6BE6,0x6BE7,0x6BE8,0x6BE9,0x6BEC,
+ 0x6BED,0x6BEE,0x6BF0,0x6BF1,0x6BF2,0x6BF4,0x6BF6,0x6BF7,
+ 0x6BF8,0x6BFA,0x6BFB,0x6BFC,0x6BFE,0x6BFF,0x6C00,0x6C01,
+ 0x6C02,0x6C03,0x6C04,0x6C08,0x6C09,0x6C0A,0x6C0B,0x6C0C,
+ 0x6C0E,0x6C12,0x6C17,0x6C1C,0x6C1D,0x6C1E,0x6C20,0x6C23,
+ 0x6C25,0x6C2B,0x6C2C,0x6C2D,0x6C31,0x6C33,0x6C36,0x6C37,
+ 0x6C39,0x6C3A,0x6C3B,0x6C3C,0x6C3E,0x6C3F,0x6C43,0x6C44,
+ 0x6C45,0x6C48,0x6C4B,0x6C4C,0x6C4D,0x6C4E,0x6C4F,0x6C51,
+ 0x6C52,0x6C53,0x6C56,0x6C58,0x6C59,0x6C5A,0x6C62,0x6C63,
+ 0x6C65,0x6C66,0x6C67,0x6C6B,0x6C6C,0x6C6D,0x6C6E,0x6C6F,
+ 0x6C71,0x6C73,0x6C75,0x6C77,0x6C78,0x6C7A,0x6C7B,0x6C7C,
+ 0x6C7F,0x6C80,0x6C84,0x6C87,0x6C8A,0x6C8B,0x6C8D,0x6C8E,
+ 0x6C91,0x6C92,0x6C95,0x6C96,0x6C97,0x6C98,0x6C9A,0x6C9C,
+ 0x6C9D,0x6C9E,0x6CA0,0x6CA2,0x6CA8,0x6CAC,0x6CAF,0x6CB0,
+ 0x6CB4,0x6CB5,0x6CB6,0x6CB7,0x6CBA,0x6CC0,0x6CC1,0x6CC2,
+ 0x6CC3,0x6CC6,0x6CC7,0x6CC8,0x6CCB,0x6CCD,0x6CCE,0x6CCF,
+ 0x6CD1,0x6CD2,0x6CD8,0x6CD9,0x6CDA,0x6CDC,0x6CDD,0x6CDF,
+ 0x6CE4,0x6CE6,0x6CE7,0x6CE9,0x6CEC,0x6CED,0x6CF2,0x6CF4,
+ 0x6CF9,0x6CFF,0x6D00,0x6D02,0x6D03,0x6D05,0x6D06,0x6D08,
+ 0x6D09,0x6D0A,0x6D0D,0x6D0F,0x6D10,0x6D11,0x6D13,0x6D14,
+ 0x6D15,0x6D16,0x6D18,0x6D1C,0x6D1D,0x6D1F,0x6D20,0x6D21,
+ 0x6D22,0x6D23,0x6D24,0x6D26,0x6D28,0x6D29,0x6D2C,0x6D2D,
+ 0x6D2F,0x6D30,0x6D34,0x6D36,0x6D37,0x6D38,0x6D3A,0x6D3F,
+ 0x6D40,0x6D42,0x6D44,0x6D49,0x6D4C,0x6D50,0x6D55,0x6D56,
+ 0x6D57,0x6D58,0x6D5B,0x6D5D,0x6D5F,0x6D61,0x6D62,0x6D64,
+ 0x6D65,0x6D67,0x6D68,0x6D6B,0x6D6C,0x6D6D,0x6D70,0x6D71,
+ 0x6D72,0x6D73,0x6D75,0x6D76,0x6D79,0x6D7A,0x6D7B,0x6D7D,
+ 0x6D7E,0x6D7F,0x6D80,0x6D81,0x6D83,0x6D84,0x6D86,0x6D87,
+ 0x6D8A,0x6D8B,0x6D8D,0x6D8F,0x6D90,0x6D92,0x6D96,0x6D97,
+ 0x6D98,0x6D99,0x6D9A,0x6D9C,0x6DA2,0x6DA5,0x6DAC,0x6DAD,
+ 0x6DB0,0x6DB1,0x6DB3,0x6DB4,0x6DB6,0x6DB7,0x6DB9,0x6DBA,
+ 0x6DBB,0x6DBC,0x6DBD,0x6DBE,0x6DC1,0x6DC2,0x6DC3,0x6DC8,
+ 0x6DC9,0x6DCA,0x6DCD,0x6DCE,0x6DCF,0x6DD0,0x6DD2,0x6DD3,
+ 0x6DD4,0x6DD5,0x6DD7,0x6DDA,0x6DDB,0x6DDC,0x6DDF,0x6DE2,
+ 0x6DE3,0x6DE5,0x6DE7,0x6DE8,0x6DE9,0x6DEA,0x6DED,0x6DEF,
+ 0x6DF0,0x6DF2,0x6DF4,0x6DF5,0x6DF6,0x6DF8,0x6DFA,0x6DFD,
+ 0x6DFE,0x6DFF,0x6E00,0x6E01,0x6E02,0x6E03,0x6E04,0x6E06,
+ 0x6E07,0x6E08,0x6E09,0x6E0B,0x6E0F,0x6E12,0x6E13,0x6E15,
+ 0x6E18,0x6E19,0x6E1B,0x6E1C,0x6E1E,0x6E1F,0x6E22,0x6E26,
+ 0x6E27,0x6E28,0x6E2A,0x6E2C,0x6E2E,0x6E30,0x6E31,0x6E33,
+ 0x6E35,0x6E36,0x6E37,0x6E39,0x6E3B,0x6E3C,0x6E3D,0x6E3E,
+ 0x6E3F,0x6E40,0x6E41,0x6E42,0x6E45,0x6E46,0x6E47,0x6E48,
+ 0x6E49,0x6E4A,0x6E4B,0x6E4C,0x6E4F,0x6E50,0x6E51,0x6E52,
+ 0x6E55,0x6E57,0x6E59,0x6E5A,0x6E5C,0x6E5D,0x6E5E,0x6E60,
+ 0x6E61,0x6E62,0x6E63,0x6E64,0x6E65,0x6E66,0x6E67,0x6E68,
+ 0x6E69,0x6E6A,0x6E6C,0x6E6D,0x6E6F,0x6E70,0x6E71,0x6E72,
+ 0x6E73,0x6E74,0x6E75,0x6E76,0x6E77,0x6E78,0x6E79,0x6E7A,
+ 0x6E7B,0x6E7C,0x6E7D,0x6E80,0x6E81,0x6E82,0x6E84,0x6E87,
+ 0x6E88,0x6E8A,0x6E8B,0x6E8C,0x6E8D,0x6E8E,0x6E91,0x6E92,
+ 0x6E93,0x6E94,0x6E95,0x6E96,0x6E97,0x6E99,0x6E9A,0x6E9B,
+ 0x6E9D,0x6E9E,0x6EA0,0x6EA1,0x6EA3,0x6EA4,0x6EA6,0x6EA8,
+ 0x6EA9,0x6EAB,0x6EAC,0x6EAD,0x6EAE,0x6EB0,0x6EB3,0x6EB5,
+ 0x6EB8,0x6EB9,0x6EBC,0x6EBE,0x6EBF,0x6EC0,0x6EC3,0x6EC4,
+ 0x6EC5,0x6EC6,0x6EC8,0x6EC9,0x6ECA,0x6ECC,0x6ECD,0x6ECE,
+ 0x6ED0,0x6ED2,0x6ED6,0x6ED8,0x6ED9,0x6EDB,0x6EDC,0x6EDD,
+ 0x6EE3,0x6EE7,0x6EEA,0x6EEB,0x6EEC,0x6EED,0x6EEE,0x6EEF,
+ 0x6EF0,0x6EF1,0x6EF2,0x6EF3,0x6EF5,0x6EF6,0x6EF7,0x6EF8,
+ 0x6EFA,0x6EFB,0x6EFC,0x6EFD,0x6EFE,0x6EFF,0x6F00,0x6F01,
+ 0x6F03,0x6F04,0x6F05,0x6F07,0x6F08,0x6F0A,0x6F0B,0x6F0C,
+ 0x6F0D,0x6F0E,0x6F10,0x6F11,0x6F12,0x6F16,0x6F17,0x6F18,
+ 0x6F19,0x6F1A,0x6F1B,0x6F1C,0x6F1D,0x6F1E,0x6F1F,0x6F21,
+ 0x6F22,0x6F23,0x6F25,0x6F26,0x6F27,0x6F28,0x6F2C,0x6F2E,
+ 0x6F30,0x6F32,0x6F34,0x6F35,0x6F37,0x6F38,0x6F39,0x6F3A,
+ 0x6F3B,0x6F3C,0x6F3D,0x6F3F,0x6F40,0x6F41,0x6F42,0x6F43,
+ 0x6F44,0x6F45,0x6F48,0x6F49,0x6F4A,0x6F4C,0x6F4E,0x6F4F,
+ 0x6F50,0x6F51,0x6F52,0x6F53,0x6F54,0x6F55,0x6F56,0x6F57,
+ 0x6F59,0x6F5A,0x6F5B,0x6F5D,0x6F5F,0x6F60,0x6F61,0x6F63,
+ 0x6F64,0x6F65,0x6F67,0x6F68,0x6F69,0x6F6A,0x6F6B,0x6F6C,
+ 0x6F6F,0x6F70,0x6F71,0x6F73,0x6F75,0x6F76,0x6F77,0x6F79,
+ 0x6F7B,0x6F7D,0x6F7E,0x6F7F,0x6F80,0x6F81,0x6F82,0x6F83,
+ 0x6F85,0x6F86,0x6F87,0x6F8A,0x6F8B,0x6F8F,0x6F90,0x6F91,
+ 0x6F92,0x6F93,0x6F94,0x6F95,0x6F96,0x6F97,0x6F98,0x6F99,
+ 0x6F9A,0x6F9B,0x6F9D,0x6F9E,0x6F9F,0x6FA0,0x6FA2,0x6FA3,
+ 0x6FA4,0x6FA5,0x6FA6,0x6FA8,0x6FA9,0x6FAA,0x6FAB,0x6FAC,
+ 0x6FAD,0x6FAE,0x6FAF,0x6FB0,0x6FB1,0x6FB2,0x6FB4,0x6FB5,
+ 0x6FB7,0x6FB8,0x6FBA,0x6FBB,0x6FBC,0x6FBD,0x6FBE,0x6FBF,
+ 0x6FC1,0x6FC3,0x6FC4,0x6FC5,0x6FC6,0x6FC7,0x6FC8,0x6FCA,
+ 0x6FCB,0x6FCC,0x6FCD,0x6FCE,0x6FCF,0x6FD0,0x6FD3,0x6FD4,
+ 0x6FD5,0x6FD6,0x6FD7,0x6FD8,0x6FD9,0x6FDA,0x6FDB,0x6FDC,
+ 0x6FDD,0x6FDF,0x6FE2,0x6FE3,0x6FE4,0x6FE5,0x6FE6,0x6FE7,
+ 0x6FE8,0x6FE9,0x6FEA,0x6FEB,0x6FEC,0x6FED,0x6FF0,0x6FF1,
+ 0x6FF2,0x6FF3,0x6FF4,0x6FF5,0x6FF6,0x6FF7,0x6FF8,0x6FF9,
+ 0x6FFA,0x6FFB,0x6FFC,0x6FFD,0x6FFE,0x6FFF,0x7000,0x7001,
+ 0x7002,0x7003,0x7004,0x7005,0x7006,0x7007,0x7008,0x7009,
+ 0x700A,0x700B,0x700C,0x700D,0x700E,0x700F,0x7010,0x7012,
+ 0x7013,0x7014,0x7015,0x7016,0x7017,0x7018,0x7019,0x701C,
+ 0x701D,0x701E,0x701F,0x7020,0x7021,0x7022,0x7024,0x7025,
+ 0x7026,0x7027,0x7028,0x7029,0x702A,0x702B,0x702C,0x702D,
+ 0x702E,0x702F,0x7030,0x7031,0x7032,0x7033,0x7034,0x7036,
+ 0x7037,0x7038,0x703A,0x703B,0x703C,0x703D,0x703E,0x703F,
+ 0x7040,0x7041,0x7042,0x7043,0x7044,0x7045,0x7046,0x7047,
+ 0x7048,0x7049,0x704A,0x704B,0x704D,0x704E,0x7050,0x7051,
+ 0x7052,0x7053,0x7054,0x7055,0x7056,0x7057,0x7058,0x7059,
+ 0x705A,0x705B,0x705C,0x705D,0x705F,0x7060,0x7061,0x7062,
+ 0x7063,0x7064,0x7065,0x7066,0x7067,0x7068,0x7069,0x706A,
+ 0x706E,0x7071,0x7072,0x7073,0x7074,0x7077,0x7079,0x707A,
+ 0x707B,0x707D,0x7081,0x7082,0x7083,0x7084,0x7086,0x7087,
+ 0x7088,0x708B,0x708C,0x708D,0x708F,0x7090,0x7091,0x7093,
+ 0x7097,0x7098,0x709A,0x709B,0x709E,0x709F,0x70A0,0x70A1,
+ 0x70A2,0x70A3,0x70A4,0x70A5,0x70A6,0x70A7,0x70A8,0x70A9,
+ 0x70AA,0x70B0,0x70B2,0x70B4,0x70B5,0x70B6,0x70BA,0x70BE,
+ 0x70BF,0x70C4,0x70C5,0x70C6,0x70C7,0x70C9,0x70CB,0x70CC,
+ 0x70CD,0x70CE,0x70CF,0x70D0,0x70D1,0x70D2,0x70D3,0x70D4,
+ 0x70D5,0x70D6,0x70D7,0x70DA,0x70DC,0x70DD,0x70DE,0x70E0,
+ 0x70E1,0x70E2,0x70E3,0x70E5,0x70EA,0x70EE,0x70F0,0x70F1,
+ 0x70F2,0x70F3,0x70F4,0x70F5,0x70F6,0x70F8,0x70FA,0x70FB,
+ 0x70FC,0x70FE,0x70FF,0x7100,0x7101,0x7102,0x7103,0x7104,
+ 0x7105,0x7106,0x7107,0x7108,0x710B,0x710C,0x710D,0x710E,
+ 0x710F,0x7111,0x7112,0x7114,0x7117,0x711B,0x711C,0x711D,
+ 0x711E,0x711F,0x7120,0x7121,0x7122,0x7123,0x7124,0x7125,
+ 0x7127,0x7128,0x7129,0x712A,0x712B,0x712C,0x712D,0x712E,
+ 0x7132,0x7133,0x7134,0x7135,0x7137,0x7138,0x7139,0x713A,
+ 0x713B,0x713C,0x713D,0x713E,0x713F,0x7140,0x7141,0x7142,
+ 0x7143,0x7144,0x7146,0x7147,0x7148,0x7149,0x714B,0x714D,
+ 0x714F,0x7150,0x7151,0x7152,0x7153,0x7154,0x7155,0x7156,
+ 0x7157,0x7158,0x7159,0x715A,0x715B,0x715D,0x715F,0x7160,
+ 0x7161,0x7162,0x7163,0x7165,0x7169,0x716A,0x716B,0x716C,
+ 0x716D,0x716F,0x7170,0x7171,0x7174,0x7175,0x7176,0x7177,
+ 0x7179,0x717B,0x717C,0x717E,0x717F,0x7180,0x7181,0x7182,
+ 0x7183,0x7185,0x7186,0x7187,0x7188,0x7189,0x718B,0x718C,
+ 0x718D,0x718E,0x7190,0x7191,0x7192,0x7193,0x7195,0x7196,
+ 0x7197,0x719A,0x719B,0x719C,0x719D,0x719E,0x71A1,0x71A2,
+ 0x71A3,0x71A4,0x71A5,0x71A6,0x71A7,0x71A9,0x71AA,0x71AB,
+ 0x71AD,0x71AE,0x71AF,0x71B0,0x71B1,0x71B2,0x71B4,0x71B6,
+ 0x71B7,0x71B8,0x71BA,0x71BB,0x71BC,0x71BD,0x71BE,0x71BF,
+ 0x71C0,0x71C1,0x71C2,0x71C4,0x71C5,0x71C6,0x71C7,0x71C8,
+ 0x71C9,0x71CA,0x71CB,0x71CC,0x71CD,0x71CF,0x71D0,0x71D1,
+ 0x71D2,0x71D3,0x71D6,0x71D7,0x71D8,0x71D9,0x71DA,0x71DB,
+ 0x71DC,0x71DD,0x71DE,0x71DF,0x71E1,0x71E2,0x71E3,0x71E4,
+ 0x71E6,0x71E8,0x71E9,0x71EA,0x71EB,0x71EC,0x71ED,0x71EF,
+ 0x71F0,0x71F1,0x71F2,0x71F3,0x71F4,0x71F5,0x71F6,0x71F7,
+ 0x71F8,0x71FA,0x71FB,0x71FC,0x71FD,0x71FE,0x71FF,0x7200,
+ 0x7201,0x7202,0x7203,0x7204,0x7205,0x7207,0x7208,0x7209,
+ 0x720A,0x720B,0x720C,0x720D,0x720E,0x720F,0x7210,0x7211,
+ 0x7212,0x7213,0x7214,0x7215,0x7216,0x7217,0x7218,0x7219,
+ 0x721A,0x721B,0x721C,0x721E,0x721F,0x7220,0x7221,0x7222,
+ 0x7223,0x7224,0x7225,0x7226,0x7227,0x7229,0x722B,0x722D,
+ 0x722E,0x722F,0x7232,0x7233,0x7234,0x723A,0x723C,0x723E,
+ 0x7240,0x7241,0x7242,0x7243,0x7244,0x7245,0x7246,0x7249,
+ 0x724A,0x724B,0x724E,0x724F,0x7250,0x7251,0x7253,0x7254,
+ 0x7255,0x7257,0x7258,0x725A,0x725C,0x725E,0x7260,0x7263,
+ 0x7264,0x7265,0x7268,0x726A,0x726B,0x726C,0x726D,0x7270,
+ 0x7271,0x7273,0x7274,0x7276,0x7277,0x7278,0x727B,0x727C,
+ 0x727D,0x7282,0x7283,0x7285,0x7286,0x7287,0x7288,0x7289,
+ 0x728C,0x728E,0x7290,0x7291,0x7293,0x7294,0x7295,0x7296,
+ 0x7297,0x7298,0x7299,0x729A,0x729B,0x729C,0x729D,0x729E,
+ 0x72A0,0x72A1,0x72A2,0x72A3,0x72A4,0x72A5,0x72A6,0x72A7,
+ 0x72A8,0x72A9,0x72AA,0x72AB,0x72AE,0x72B1,0x72B2,0x72B3,
+ 0x72B5,0x72BA,0x72BB,0x72BC,0x72BD,0x72BE,0x72BF,0x72C0,
+ 0x72C5,0x72C6,0x72C7,0x72C9,0x72CA,0x72CB,0x72CC,0x72CF,
+ 0x72D1,0x72D3,0x72D4,0x72D5,0x72D6,0x72D8,0x72DA,0x72DB,
+ 0xE4C6,0xE4C7,0xE4C8,0xE4C9,0xE4CA,0xE4CB,0xE4CC,0xE4CD,
+ 0xE4CE,0xE4CF,0xE4D0,0xE4D1,0xE4D2,0xE4D3,0xE4D4,0xE4D5,
+ 0xE4D6,0xE4D7,0xE4D8,0xE4D9,0xE4DA,0xE4DB,0xE4DC,0xE4DD,
+ 0xE4DE,0xE4DF,0xE4E0,0xE4E1,0xE4E2,0xE4E3,0xE4E4,0xE4E5,
+ 0xE4E6,0xE4E7,0xE4E8,0xE4E9,0xE4EA,0xE4EB,0xE4EC,0xE4ED,
+ 0xE4EE,0xE4EF,0xE4F0,0xE4F1,0xE4F2,0xE4F3,0xE4F4,0xE4F5,
+ 0xE4F6,0xE4F7,0xE4F8,0xE4F9,0xE4FA,0xE4FB,0xE4FC,0xE4FD,
+ 0xE4FE,0xE4FF,0xE500,0xE501,0xE502,0xE503,0xE504,0xE505,
+ 0xE506,0xE507,0xE508,0xE509,0xE50A,0xE50B,0xE50C,0xE50D,
+ 0xE50E,0xE50F,0xE510,0xE511,0xE512,0xE513,0xE514,0xE515,
+ 0xE516,0xE517,0xE518,0xE519,0xE51A,0xE51B,0xE51C,0xE51D,
+ 0xE51E,0xE51F,0xE520,0xE521,0xE522,0xE523,0xE524,0xE525,
+ 0x3000,0x3001,0x3002,0x00B7,0x02C9,0x02C7,0x00A8,0x3003,
+ 0x3005,0x2014,0xFF5E,0x2016,0x2026,0x2018,0x2019,0x201C,
+ 0x201D,0x3014,0x3015,0x3008,0x3009,0x300A,0x300B,0x300C,
+ 0x300D,0x300E,0x300F,0x3016,0x3017,0x3010,0x3011,0x00B1,
+ 0x00D7,0x00F7,0x2236,0x2227,0x2228,0x2211,0x220F,0x222A,
+ 0x2229,0x2208,0x2237,0x221A,0x22A5,0x2225,0x2220,0x2312,
+ 0x2299,0x222B,0x222E,0x2261,0x224C,0x2248,0x223D,0x221D,
+ 0x2260,0x226E,0x226F,0x2264,0x2265,0x221E,0x2235,0x2234,
+ 0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFF04,0x00A4,
+ 0xFFE0,0xFFE1,0x2030,0x00A7,0x2116,0x2606,0x2605,0x25CB,
+ 0x25CF,0x25CE,0x25C7,0x25C6,0x25A1,0x25A0,0x25B3,0x25B2,
+ 0x203B,0x2192,0x2190,0x2191,0x2193,0x3013,0xE526,0xE527,
+ 0xE528,0xE529,0xE52A,0xE52B,0xE52C,0xE52D,0xE52E,0xE52F,
+ 0xE530,0xE531,0xE532,0xE533,0xE534,0xE535,0xE536,0xE537,
+ 0xE538,0xE539,0xE53A,0xE53B,0xE53C,0xE53D,0xE53E,0xE53F,
+ 0xE540,0xE541,0xE542,0xE543,0xE544,0xE545,0xE546,0xE547,
+ 0xE548,0xE549,0xE54A,0xE54B,0xE54C,0xE54D,0xE54E,0xE54F,
+ 0xE550,0xE551,0xE552,0xE553,0xE554,0xE555,0xE556,0xE557,
+ 0xE558,0xE559,0xE55A,0xE55B,0xE55C,0xE55D,0xE55E,0xE55F,
+ 0xE560,0xE561,0xE562,0xE563,0xE564,0xE565,0xE566,0xE567,
+ 0xE568,0xE569,0xE56A,0xE56B,0xE56C,0xE56D,0xE56E,0xE56F,
+ 0xE570,0xE571,0xE572,0xE573,0xE574,0xE575,0xE576,0xE577,
+ 0xE578,0xE579,0xE57A,0xE57B,0xE57C,0xE57D,0xE57E,0xE57F,
+ 0xE580,0xE581,0xE582,0xE583,0xE584,0xE585,0x2170,0x2171,
+ 0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,
+ 0xE766,0xE767,0xE768,0xE769,0xE76A,0xE76B,0x2488,0x2489,
+ 0x248A,0x248B,0x248C,0x248D,0x248E,0x248F,0x2490,0x2491,
+ 0x2492,0x2493,0x2494,0x2495,0x2496,0x2497,0x2498,0x2499,
+ 0x249A,0x249B,0x2474,0x2475,0x2476,0x2477,0x2478,0x2479,
+ 0x247A,0x247B,0x247C,0x247D,0x247E,0x247F,0x2480,0x2481,
+ 0x2482,0x2483,0x2484,0x2485,0x2486,0x2487,0x2460,0x2461,
+ 0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469,
+ 0x20AC,0xE76D,0x3220,0x3221,0x3222,0x3223,0x3224,0x3225,
+ 0x3226,0x3227,0x3228,0x3229,0xE76E,0xE76F,0x2160,0x2161,
+ 0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,
+ 0x216A,0x216B,0xE770,0xE771,0xE586,0xE587,0xE588,0xE589,
+ 0xE58A,0xE58B,0xE58C,0xE58D,0xE58E,0xE58F,0xE590,0xE591,
+ 0xE592,0xE593,0xE594,0xE595,0xE596,0xE597,0xE598,0xE599,
+ 0xE59A,0xE59B,0xE59C,0xE59D,0xE59E,0xE59F,0xE5A0,0xE5A1,
+ 0xE5A2,0xE5A3,0xE5A4,0xE5A5,0xE5A6,0xE5A7,0xE5A8,0xE5A9,
+ 0xE5AA,0xE5AB,0xE5AC,0xE5AD,0xE5AE,0xE5AF,0xE5B0,0xE5B1,
+ 0xE5B2,0xE5B3,0xE5B4,0xE5B5,0xE5B6,0xE5B7,0xE5B8,0xE5B9,
+ 0xE5BA,0xE5BB,0xE5BC,0xE5BD,0xE5BE,0xE5BF,0xE5C0,0xE5C1,
+ 0xE5C2,0xE5C3,0xE5C4,0xE5C5,0xE5C6,0xE5C7,0xE5C8,0xE5C9,
+ 0xE5CA,0xE5CB,0xE5CC,0xE5CD,0xE5CE,0xE5CF,0xE5D0,0xE5D1,
+ 0xE5D2,0xE5D3,0xE5D4,0xE5D5,0xE5D6,0xE5D7,0xE5D8,0xE5D9,
+ 0xE5DA,0xE5DB,0xE5DC,0xE5DD,0xE5DE,0xE5DF,0xE5E0,0xE5E1,
+ 0xE5E2,0xE5E3,0xE5E4,0xE5E5,0xFF01,0xFF02,0xFF03,0xFFE5,
+ 0xFF05,0xFF06,0xFF07,0xFF08,0xFF09,0xFF0A,0xFF0B,0xFF0C,
+ 0xFF0D,0xFF0E,0xFF0F,0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,
+ 0xFF15,0xFF16,0xFF17,0xFF18,0xFF19,0xFF1A,0xFF1B,0xFF1C,
+ 0xFF1D,0xFF1E,0xFF1F,0xFF20,0xFF21,0xFF22,0xFF23,0xFF24,
+ 0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,
+ 0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,
+ 0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A,0xFF3B,0xFF3C,
+ 0xFF3D,0xFF3E,0xFF3F,0xFF40,0xFF41,0xFF42,0xFF43,0xFF44,
+ 0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,
+ 0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,
+ 0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A,0xFF5B,0xFF5C,
+ 0xFF5D,0xFFE3,0xE5E6,0xE5E7,0xE5E8,0xE5E9,0xE5EA,0xE5EB,
+ 0xE5EC,0xE5ED,0xE5EE,0xE5EF,0xE5F0,0xE5F1,0xE5F2,0xE5F3,
+ 0xE5F4,0xE5F5,0xE5F6,0xE5F7,0xE5F8,0xE5F9,0xE5FA,0xE5FB,
+ 0xE5FC,0xE5FD,0xE5FE,0xE5FF,0xE600,0xE601,0xE602,0xE603,
+ 0xE604,0xE605,0xE606,0xE607,0xE608,0xE609,0xE60A,0xE60B,
+ 0xE60C,0xE60D,0xE60E,0xE60F,0xE610,0xE611,0xE612,0xE613,
+ 0xE614,0xE615,0xE616,0xE617,0xE618,0xE619,0xE61A,0xE61B,
+ 0xE61C,0xE61D,0xE61E,0xE61F,0xE620,0xE621,0xE622,0xE623,
+ 0xE624,0xE625,0xE626,0xE627,0xE628,0xE629,0xE62A,0xE62B,
+ 0xE62C,0xE62D,0xE62E,0xE62F,0xE630,0xE631,0xE632,0xE633,
+ 0xE634,0xE635,0xE636,0xE637,0xE638,0xE639,0xE63A,0xE63B,
+ 0xE63C,0xE63D,0xE63E,0xE63F,0xE640,0xE641,0xE642,0xE643,
+ 0xE644,0xE645,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,
+ 0x3047,0x3048,0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,
+ 0x304F,0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,
+ 0x3057,0x3058,0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,
+ 0x305F,0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,
+ 0x3067,0x3068,0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,
+ 0x306F,0x3070,0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,
+ 0x3077,0x3078,0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,
+ 0x307F,0x3080,0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,
+ 0x3087,0x3088,0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,
+ 0x308F,0x3090,0x3091,0x3092,0x3093,0xE772,0xE773,0xE774,
+ 0xE775,0xE776,0xE777,0xE778,0xE779,0xE77A,0xE77B,0xE77C,
+ 0xE646,0xE647,0xE648,0xE649,0xE64A,0xE64B,0xE64C,0xE64D,
+ 0xE64E,0xE64F,0xE650,0xE651,0xE652,0xE653,0xE654,0xE655,
+ 0xE656,0xE657,0xE658,0xE659,0xE65A,0xE65B,0xE65C,0xE65D,
+ 0xE65E,0xE65F,0xE660,0xE661,0xE662,0xE663,0xE664,0xE665,
+ 0xE666,0xE667,0xE668,0xE669,0xE66A,0xE66B,0xE66C,0xE66D,
+ 0xE66E,0xE66F,0xE670,0xE671,0xE672,0xE673,0xE674,0xE675,
+ 0xE676,0xE677,0xE678,0xE679,0xE67A,0xE67B,0xE67C,0xE67D,
+ 0xE67E,0xE67F,0xE680,0xE681,0xE682,0xE683,0xE684,0xE685,
+ 0xE686,0xE687,0xE688,0xE689,0xE68A,0xE68B,0xE68C,0xE68D,
+ 0xE68E,0xE68F,0xE690,0xE691,0xE692,0xE693,0xE694,0xE695,
+ 0xE696,0xE697,0xE698,0xE699,0xE69A,0xE69B,0xE69C,0xE69D,
+ 0xE69E,0xE69F,0xE6A0,0xE6A1,0xE6A2,0xE6A3,0xE6A4,0xE6A5,
+ 0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,0x30A8,
+ 0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF,0x30B0,
+ 0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8,
+ 0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0,
+ 0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8,
+ 0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF,0x30D0,
+ 0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7,0x30D8,
+ 0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0,
+ 0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8,
+ 0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0,
+ 0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6,0xE77D,0xE77E,
+ 0xE77F,0xE780,0xE781,0xE782,0xE783,0xE784,0xE6A6,0xE6A7,
+ 0xE6A8,0xE6A9,0xE6AA,0xE6AB,0xE6AC,0xE6AD,0xE6AE,0xE6AF,
+ 0xE6B0,0xE6B1,0xE6B2,0xE6B3,0xE6B4,0xE6B5,0xE6B6,0xE6B7,
+ 0xE6B8,0xE6B9,0xE6BA,0xE6BB,0xE6BC,0xE6BD,0xE6BE,0xE6BF,
+ 0xE6C0,0xE6C1,0xE6C2,0xE6C3,0xE6C4,0xE6C5,0xE6C6,0xE6C7,
+ 0xE6C8,0xE6C9,0xE6CA,0xE6CB,0xE6CC,0xE6CD,0xE6CE,0xE6CF,
+ 0xE6D0,0xE6D1,0xE6D2,0xE6D3,0xE6D4,0xE6D5,0xE6D6,0xE6D7,
+ 0xE6D8,0xE6D9,0xE6DA,0xE6DB,0xE6DC,0xE6DD,0xE6DE,0xE6DF,
+ 0xE6E0,0xE6E1,0xE6E2,0xE6E3,0xE6E4,0xE6E5,0xE6E6,0xE6E7,
+ 0xE6E8,0xE6E9,0xE6EA,0xE6EB,0xE6EC,0xE6ED,0xE6EE,0xE6EF,
+ 0xE6F0,0xE6F1,0xE6F2,0xE6F3,0xE6F4,0xE6F5,0xE6F6,0xE6F7,
+ 0xE6F8,0xE6F9,0xE6FA,0xE6FB,0xE6FC,0xE6FD,0xE6FE,0xE6FF,
+ 0xE700,0xE701,0xE702,0xE703,0xE704,0xE705,0x0391,0x0392,
+ 0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,
+ 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,
+ 0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9,0xE785,0xE786,
+ 0xE787,0xE788,0xE789,0xE78A,0xE78B,0xE78C,0x03B1,0x03B2,
+ 0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,
+ 0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0,0x03C1,0x03C3,
+ 0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0xE78D,0xE78E,
+ 0xE78F,0xE790,0xE791,0xE792,0xE793,0xFE35,0xFE36,0xFE39,
+ 0xFE3A,0xFE3F,0xFE40,0xFE3D,0xFE3E,0xFE41,0xFE42,0xFE43,
+ 0xFE44,0xE794,0xE795,0xFE3B,0xFE3C,0xFE37,0xFE38,0xFE31,
+ 0xE796,0xFE33,0xFE34,0xE797,0xE798,0xE799,0xE79A,0xE79B,
+ 0xE79C,0xE79D,0xE79E,0xE79F,0xE706,0xE707,0xE708,0xE709,
+ 0xE70A,0xE70B,0xE70C,0xE70D,0xE70E,0xE70F,0xE710,0xE711,
+ 0xE712,0xE713,0xE714,0xE715,0xE716,0xE717,0xE718,0xE719,
+ 0xE71A,0xE71B,0xE71C,0xE71D,0xE71E,0xE71F,0xE720,0xE721,
+ 0xE722,0xE723,0xE724,0xE725,0xE726,0xE727,0xE728,0xE729,
+ 0xE72A,0xE72B,0xE72C,0xE72D,0xE72E,0xE72F,0xE730,0xE731,
+ 0xE732,0xE733,0xE734,0xE735,0xE736,0xE737,0xE738,0xE739,
+ 0xE73A,0xE73B,0xE73C,0xE73D,0xE73E,0xE73F,0xE740,0xE741,
+ 0xE742,0xE743,0xE744,0xE745,0xE746,0xE747,0xE748,0xE749,
+ 0xE74A,0xE74B,0xE74C,0xE74D,0xE74E,0xE74F,0xE750,0xE751,
+ 0xE752,0xE753,0xE754,0xE755,0xE756,0xE757,0xE758,0xE759,
+ 0xE75A,0xE75B,0xE75C,0xE75D,0xE75E,0xE75F,0xE760,0xE761,
+ 0xE762,0xE763,0xE764,0xE765,0x0410,0x0411,0x0412,0x0413,
+ 0x0414,0x0415,0x0401,0x0416,0x0417,0x0418,0x0419,0x041A,
+ 0x041B,0x041C,0x041D,0x041E,0x041F,0x0420,0x0421,0x0422,
+ 0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042A,
+ 0x042B,0x042C,0x042D,0x042E,0x042F,0xE7A0,0xE7A1,0xE7A2,
+ 0xE7A3,0xE7A4,0xE7A5,0xE7A6,0xE7A7,0xE7A8,0xE7A9,0xE7AA,
+ 0xE7AB,0xE7AC,0xE7AD,0xE7AE,0x0430,0x0431,0x0432,0x0433,
+ 0x0434,0x0435,0x0451,0x0436,0x0437,0x0438,0x0439,0x043A,
+ 0x043B,0x043C,0x043D,0x043E,0x043F,0x0440,0x0441,0x0442,
+ 0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,
+ 0x044B,0x044C,0x044D,0x044E,0x044F,0xE7AF,0xE7B0,0xE7B1,
+ 0xE7B2,0xE7B3,0xE7B4,0xE7B5,0xE7B6,0xE7B7,0xE7B8,0xE7B9,
+ 0xE7BA,0xE7BB,0x02CA,0x02CB,0x02D9,0x2013,0x2015,0x2025,
+ 0x2035,0x2105,0x2109,0x2196,0x2197,0x2198,0x2199,0x2215,
+ 0x221F,0x2223,0x2252,0x2266,0x2267,0x22BF,0x2550,0x2551,
+ 0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,
+ 0x255A,0x255B,0x255C,0x255D,0x255E,0x255F,0x2560,0x2561,
+ 0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,
+ 0x256A,0x256B,0x256C,0x256D,0x256E,0x256F,0x2570,0x2571,
+ 0x2572,0x2573,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,
+ 0x2587,0x2588,0x2589,0x258A,0x258B,0x258C,0x258D,0x258E,
+ 0x258F,0x2593,0x2594,0x2595,0x25BC,0x25BD,0x25E2,0x25E3,
+ 0x25E4,0x25E5,0x2609,0x2295,0x3012,0x301D,0x301E,0xE7BC,
+ 0xE7BD,0xE7BE,0xE7BF,0xE7C0,0xE7C1,0xE7C2,0xE7C3,0xE7C4,
+ 0xE7C5,0xE7C6,0x0101,0x00E1,0x01CE,0x00E0,0x0113,0x00E9,
+ 0x011B,0x00E8,0x012B,0x00ED,0x01D0,0x00EC,0x014D,0x00F3,
+ 0x01D2,0x00F2,0x016B,0x00FA,0x01D4,0x00F9,0x01D6,0x01D8,
+ 0x01DA,0x01DC,0x00FC,0x00EA,0x0251,0xE7C7,0x0144,0x0148,
+ 0x01F9,0x0261,0xE7C9,0xE7CA,0xE7CB,0xE7CC,0x3105,0x3106,
+ 0x3107,0x3108,0x3109,0x310A,0x310B,0x310C,0x310D,0x310E,
+ 0x310F,0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116,
+ 0x3117,0x3118,0x3119,0x311A,0x311B,0x311C,0x311D,0x311E,
+ 0x311F,0x3120,0x3121,0x3122,0x3123,0x3124,0x3125,0x3126,
+ 0x3127,0x3128,0x3129,0xE7CD,0xE7CE,0xE7CF,0xE7D0,0xE7D1,
+ 0xE7D2,0xE7D3,0xE7D4,0xE7D5,0xE7D6,0xE7D7,0xE7D8,0xE7D9,
+ 0xE7DA,0xE7DB,0xE7DC,0xE7DD,0xE7DE,0xE7DF,0xE7E0,0xE7E1,
+ 0x3021,0x3022,0x3023,0x3024,0x3025,0x3026,0x3027,0x3028,
+ 0x3029,0x32A3,0x338E,0x338F,0x339C,0x339D,0x339E,0x33A1,
+ 0x33C4,0x33CE,0x33D1,0x33D2,0x33D5,0xFE30,0xFFE2,0xFFE4,
+ 0xE7E2,0x2121,0x3231,0xE7E3,0x2010,0xE7E4,0xE7E5,0xE7E6,
+ 0x30FC,0x309B,0x309C,0x30FD,0x30FE,0x3006,0x309D,0x309E,
+ 0xFE49,0xFE4A,0xFE4B,0xFE4C,0xFE4D,0xFE4E,0xFE4F,0xFE50,
+ 0xFE51,0xFE52,0xFE54,0xFE55,0xFE56,0xFE57,0xFE59,0xFE5A,
+ 0xFE5B,0xFE5C,0xFE5D,0xFE5E,0xFE5F,0xFE60,0xFE61,0xFE62,
+ 0xFE63,0xFE64,0xFE65,0xFE66,0xFE68,0xFE69,0xFE6A,0xFE6B,
+ 0x303E,0x2FF0,0x2FF1,0x2FF2,0x2FF3,0x2FF4,0x2FF5,0x2FF6,
+ 0x2FF7,0x2FF8,0x2FF9,0x2FFA,0x2FFB,0x3007,0xE7F4,0xE7F5,
+ 0xE7F6,0xE7F7,0xE7F8,0xE7F9,0xE7FA,0xE7FB,0xE7FC,0xE7FD,
+ 0xE7FE,0xE7FF,0xE800,0x2500,0x2501,0x2502,0x2503,0x2504,
+ 0x2505,0x2506,0x2507,0x2508,0x2509,0x250A,0x250B,0x250C,
+ 0x250D,0x250E,0x250F,0x2510,0x2511,0x2512,0x2513,0x2514,
+ 0x2515,0x2516,0x2517,0x2518,0x2519,0x251A,0x251B,0x251C,
+ 0x251D,0x251E,0x251F,0x2520,0x2521,0x2522,0x2523,0x2524,
+ 0x2525,0x2526,0x2527,0x2528,0x2529,0x252A,0x252B,0x252C,
+ 0x252D,0x252E,0x252F,0x2530,0x2531,0x2532,0x2533,0x2534,
+ 0x2535,0x2536,0x2537,0x2538,0x2539,0x253A,0x253B,0x253C,
+ 0x253D,0x253E,0x253F,0x2540,0x2541,0x2542,0x2543,0x2544,
+ 0x2545,0x2546,0x2547,0x2548,0x2549,0x254A,0x254B,0xE801,
+ 0xE802,0xE803,0xE804,0xE805,0xE806,0xE807,0xE808,0xE809,
+ 0xE80A,0xE80B,0xE80C,0xE80D,0xE80E,0xE80F,0x72DC,0x72DD,
+ 0x72DF,0x72E2,0x72E3,0x72E4,0x72E5,0x72E6,0x72E7,0x72EA,
+ 0x72EB,0x72F5,0x72F6,0x72F9,0x72FD,0x72FE,0x72FF,0x7300,
+ 0x7302,0x7304,0x7305,0x7306,0x7307,0x7308,0x7309,0x730B,
+ 0x730C,0x730D,0x730F,0x7310,0x7311,0x7312,0x7314,0x7318,
+ 0x7319,0x731A,0x731F,0x7320,0x7323,0x7324,0x7326,0x7327,
+ 0x7328,0x732D,0x732F,0x7330,0x7332,0x7333,0x7335,0x7336,
+ 0x733A,0x733B,0x733C,0x733D,0x7340,0x7341,0x7342,0x7343,
+ 0x7344,0x7345,0x7346,0x7347,0x7348,0x7349,0x734A,0x734B,
+ 0x734C,0x734E,0x734F,0x7351,0x7353,0x7354,0x7355,0x7356,
+ 0x7358,0x7359,0x735A,0x735B,0x735C,0x735D,0x735E,0x735F,
+ 0x7361,0x7362,0x7363,0x7364,0x7365,0x7366,0x7367,0x7368,
+ 0x7369,0x736A,0x736B,0x736E,0x7370,0x7371,0xE000,0xE001,
+ 0xE002,0xE003,0xE004,0xE005,0xE006,0xE007,0xE008,0xE009,
+ 0xE00A,0xE00B,0xE00C,0xE00D,0xE00E,0xE00F,0xE010,0xE011,
+ 0xE012,0xE013,0xE014,0xE015,0xE016,0xE017,0xE018,0xE019,
+ 0xE01A,0xE01B,0xE01C,0xE01D,0xE01E,0xE01F,0xE020,0xE021,
+ 0xE022,0xE023,0xE024,0xE025,0xE026,0xE027,0xE028,0xE029,
+ 0xE02A,0xE02B,0xE02C,0xE02D,0xE02E,0xE02F,0xE030,0xE031,
+ 0xE032,0xE033,0xE034,0xE035,0xE036,0xE037,0xE038,0xE039,
+ 0xE03A,0xE03B,0xE03C,0xE03D,0xE03E,0xE03F,0xE040,0xE041,
+ 0xE042,0xE043,0xE044,0xE045,0xE046,0xE047,0xE048,0xE049,
+ 0xE04A,0xE04B,0xE04C,0xE04D,0xE04E,0xE04F,0xE050,0xE051,
+ 0xE052,0xE053,0xE054,0xE055,0xE056,0xE057,0xE058,0xE059,
+ 0xE05A,0xE05B,0xE05C,0xE05D,0x7372,0x7373,0x7374,0x7375,
+ 0x7376,0x7377,0x7378,0x7379,0x737A,0x737B,0x737C,0x737D,
+ 0x737F,0x7380,0x7381,0x7382,0x7383,0x7385,0x7386,0x7388,
+ 0x738A,0x738C,0x738D,0x738F,0x7390,0x7392,0x7393,0x7394,
+ 0x7395,0x7397,0x7398,0x7399,0x739A,0x739C,0x739D,0x739E,
+ 0x73A0,0x73A1,0x73A3,0x73A4,0x73A5,0x73A6,0x73A7,0x73A8,
+ 0x73AA,0x73AC,0x73AD,0x73B1,0x73B4,0x73B5,0x73B6,0x73B8,
+ 0x73B9,0x73BC,0x73BD,0x73BE,0x73BF,0x73C1,0x73C3,0x73C4,
+ 0x73C5,0x73C6,0x73C7,0x73CB,0x73CC,0x73CE,0x73D2,0x73D3,
+ 0x73D4,0x73D5,0x73D6,0x73D7,0x73D8,0x73DA,0x73DB,0x73DC,
+ 0x73DD,0x73DF,0x73E1,0x73E2,0x73E3,0x73E4,0x73E6,0x73E8,
+ 0x73EA,0x73EB,0x73EC,0x73EE,0x73EF,0x73F0,0x73F1,0x73F3,
+ 0x73F4,0x73F5,0x73F6,0x73F7,0xE05E,0xE05F,0xE060,0xE061,
+ 0xE062,0xE063,0xE064,0xE065,0xE066,0xE067,0xE068,0xE069,
+ 0xE06A,0xE06B,0xE06C,0xE06D,0xE06E,0xE06F,0xE070,0xE071,
+ 0xE072,0xE073,0xE074,0xE075,0xE076,0xE077,0xE078,0xE079,
+ 0xE07A,0xE07B,0xE07C,0xE07D,0xE07E,0xE07F,0xE080,0xE081,
+ 0xE082,0xE083,0xE084,0xE085,0xE086,0xE087,0xE088,0xE089,
+ 0xE08A,0xE08B,0xE08C,0xE08D,0xE08E,0xE08F,0xE090,0xE091,
+ 0xE092,0xE093,0xE094,0xE095,0xE096,0xE097,0xE098,0xE099,
+ 0xE09A,0xE09B,0xE09C,0xE09D,0xE09E,0xE09F,0xE0A0,0xE0A1,
+ 0xE0A2,0xE0A3,0xE0A4,0xE0A5,0xE0A6,0xE0A7,0xE0A8,0xE0A9,
+ 0xE0AA,0xE0AB,0xE0AC,0xE0AD,0xE0AE,0xE0AF,0xE0B0,0xE0B1,
+ 0xE0B2,0xE0B3,0xE0B4,0xE0B5,0xE0B6,0xE0B7,0xE0B8,0xE0B9,
+ 0xE0BA,0xE0BB,0x73F8,0x73F9,0x73FA,0x73FB,0x73FC,0x73FD,
+ 0x73FE,0x73FF,0x7400,0x7401,0x7402,0x7404,0x7407,0x7408,
+ 0x740B,0x740C,0x740D,0x740E,0x7411,0x7412,0x7413,0x7414,
+ 0x7415,0x7416,0x7417,0x7418,0x7419,0x741C,0x741D,0x741E,
+ 0x741F,0x7420,0x7421,0x7423,0x7424,0x7427,0x7429,0x742B,
+ 0x742D,0x742F,0x7431,0x7432,0x7437,0x7438,0x7439,0x743A,
+ 0x743B,0x743D,0x743E,0x743F,0x7440,0x7442,0x7443,0x7444,
+ 0x7445,0x7446,0x7447,0x7448,0x7449,0x744A,0x744B,0x744C,
+ 0x744D,0x744E,0x744F,0x7450,0x7451,0x7452,0x7453,0x7454,
+ 0x7456,0x7458,0x745D,0x7460,0x7461,0x7462,0x7463,0x7464,
+ 0x7465,0x7466,0x7467,0x7468,0x7469,0x746A,0x746B,0x746C,
+ 0x746E,0x746F,0x7471,0x7472,0x7473,0x7474,0x7475,0x7478,
+ 0x7479,0x747A,0xE0BC,0xE0BD,0xE0BE,0xE0BF,0xE0C0,0xE0C1,
+ 0xE0C2,0xE0C3,0xE0C4,0xE0C5,0xE0C6,0xE0C7,0xE0C8,0xE0C9,
+ 0xE0CA,0xE0CB,0xE0CC,0xE0CD,0xE0CE,0xE0CF,0xE0D0,0xE0D1,
+ 0xE0D2,0xE0D3,0xE0D4,0xE0D5,0xE0D6,0xE0D7,0xE0D8,0xE0D9,
+ 0xE0DA,0xE0DB,0xE0DC,0xE0DD,0xE0DE,0xE0DF,0xE0E0,0xE0E1,
+ 0xE0E2,0xE0E3,0xE0E4,0xE0E5,0xE0E6,0xE0E7,0xE0E8,0xE0E9,
+ 0xE0EA,0xE0EB,0xE0EC,0xE0ED,0xE0EE,0xE0EF,0xE0F0,0xE0F1,
+ 0xE0F2,0xE0F3,0xE0F4,0xE0F5,0xE0F6,0xE0F7,0xE0F8,0xE0F9,
+ 0xE0FA,0xE0FB,0xE0FC,0xE0FD,0xE0FE,0xE0FF,0xE100,0xE101,
+ 0xE102,0xE103,0xE104,0xE105,0xE106,0xE107,0xE108,0xE109,
+ 0xE10A,0xE10B,0xE10C,0xE10D,0xE10E,0xE10F,0xE110,0xE111,
+ 0xE112,0xE113,0xE114,0xE115,0xE116,0xE117,0xE118,0xE119,
+ 0x747B,0x747C,0x747D,0x747F,0x7482,0x7484,0x7485,0x7486,
+ 0x7488,0x7489,0x748A,0x748C,0x748D,0x748F,0x7491,0x7492,
+ 0x7493,0x7494,0x7495,0x7496,0x7497,0x7498,0x7499,0x749A,
+ 0x749B,0x749D,0x749F,0x74A0,0x74A1,0x74A2,0x74A3,0x74A4,
+ 0x74A5,0x74A6,0x74AA,0x74AB,0x74AC,0x74AD,0x74AE,0x74AF,
+ 0x74B0,0x74B1,0x74B2,0x74B3,0x74B4,0x74B5,0x74B6,0x74B7,
+ 0x74B8,0x74B9,0x74BB,0x74BC,0x74BD,0x74BE,0x74BF,0x74C0,
+ 0x74C1,0x74C2,0x74C3,0x74C4,0x74C5,0x74C6,0x74C7,0x74C8,
+ 0x74C9,0x74CA,0x74CB,0x74CC,0x74CD,0x74CE,0x74CF,0x74D0,
+ 0x74D1,0x74D3,0x74D4,0x74D5,0x74D6,0x74D7,0x74D8,0x74D9,
+ 0x74DA,0x74DB,0x74DD,0x74DF,0x74E1,0x74E5,0x74E7,0x74E8,
+ 0x74E9,0x74EA,0x74EB,0x74EC,0x74ED,0x74F0,0x74F1,0x74F2,
+ 0xE11A,0xE11B,0xE11C,0xE11D,0xE11E,0xE11F,0xE120,0xE121,
+ 0xE122,0xE123,0xE124,0xE125,0xE126,0xE127,0xE128,0xE129,
+ 0xE12A,0xE12B,0xE12C,0xE12D,0xE12E,0xE12F,0xE130,0xE131,
+ 0xE132,0xE133,0xE134,0xE135,0xE136,0xE137,0xE138,0xE139,
+ 0xE13A,0xE13B,0xE13C,0xE13D,0xE13E,0xE13F,0xE140,0xE141,
+ 0xE142,0xE143,0xE144,0xE145,0xE146,0xE147,0xE148,0xE149,
+ 0xE14A,0xE14B,0xE14C,0xE14D,0xE14E,0xE14F,0xE150,0xE151,
+ 0xE152,0xE153,0xE154,0xE155,0xE156,0xE157,0xE158,0xE159,
+ 0xE15A,0xE15B,0xE15C,0xE15D,0xE15E,0xE15F,0xE160,0xE161,
+ 0xE162,0xE163,0xE164,0xE165,0xE166,0xE167,0xE168,0xE169,
+ 0xE16A,0xE16B,0xE16C,0xE16D,0xE16E,0xE16F,0xE170,0xE171,
+ 0xE172,0xE173,0xE174,0xE175,0xE176,0xE177,0x74F3,0x74F5,
+ 0x74F8,0x74F9,0x74FA,0x74FB,0x74FC,0x74FD,0x74FE,0x7500,
+ 0x7501,0x7502,0x7503,0x7505,0x7506,0x7507,0x7508,0x7509,
+ 0x750A,0x750B,0x750C,0x750E,0x7510,0x7512,0x7514,0x7515,
+ 0x7516,0x7517,0x751B,0x751D,0x751E,0x7520,0x7521,0x7522,
+ 0x7523,0x7524,0x7526,0x7527,0x752A,0x752E,0x7534,0x7536,
+ 0x7539,0x753C,0x753D,0x753F,0x7541,0x7542,0x7543,0x7544,
+ 0x7546,0x7547,0x7549,0x754A,0x754D,0x7550,0x7551,0x7552,
+ 0x7553,0x7555,0x7556,0x7557,0x7558,0x755D,0x755E,0x755F,
+ 0x7560,0x7561,0x7562,0x7563,0x7564,0x7567,0x7568,0x7569,
+ 0x756B,0x756C,0x756D,0x756E,0x756F,0x7570,0x7571,0x7573,
+ 0x7575,0x7576,0x7577,0x757A,0x757B,0x757C,0x757D,0x757E,
+ 0x7580,0x7581,0x7582,0x7584,0x7585,0x7587,0xE178,0xE179,
+ 0xE17A,0xE17B,0xE17C,0xE17D,0xE17E,0xE17F,0xE180,0xE181,
+ 0xE182,0xE183,0xE184,0xE185,0xE186,0xE187,0xE188,0xE189,
+ 0xE18A,0xE18B,0xE18C,0xE18D,0xE18E,0xE18F,0xE190,0xE191,
+ 0xE192,0xE193,0xE194,0xE195,0xE196,0xE197,0xE198,0xE199,
+ 0xE19A,0xE19B,0xE19C,0xE19D,0xE19E,0xE19F,0xE1A0,0xE1A1,
+ 0xE1A2,0xE1A3,0xE1A4,0xE1A5,0xE1A6,0xE1A7,0xE1A8,0xE1A9,
+ 0xE1AA,0xE1AB,0xE1AC,0xE1AD,0xE1AE,0xE1AF,0xE1B0,0xE1B1,
+ 0xE1B2,0xE1B3,0xE1B4,0xE1B5,0xE1B6,0xE1B7,0xE1B8,0xE1B9,
+ 0xE1BA,0xE1BB,0xE1BC,0xE1BD,0xE1BE,0xE1BF,0xE1C0,0xE1C1,
+ 0xE1C2,0xE1C3,0xE1C4,0xE1C5,0xE1C6,0xE1C7,0xE1C8,0xE1C9,
+ 0xE1CA,0xE1CB,0xE1CC,0xE1CD,0xE1CE,0xE1CF,0xE1D0,0xE1D1,
+ 0xE1D2,0xE1D3,0xE1D4,0xE1D5,0x7588,0x7589,0x758A,0x758C,
+ 0x758D,0x758E,0x7590,0x7593,0x7595,0x7598,0x759B,0x759C,
+ 0x759E,0x75A2,0x75A6,0x75A7,0x75A8,0x75A9,0x75AA,0x75AD,
+ 0x75B6,0x75B7,0x75BA,0x75BB,0x75BF,0x75C0,0x75C1,0x75C6,
+ 0x75CB,0x75CC,0x75CE,0x75CF,0x75D0,0x75D1,0x75D3,0x75D7,
+ 0x75D9,0x75DA,0x75DC,0x75DD,0x75DF,0x75E0,0x75E1,0x75E5,
+ 0x75E9,0x75EC,0x75ED,0x75EE,0x75EF,0x75F2,0x75F3,0x75F5,
+ 0x75F6,0x75F7,0x75F8,0x75FA,0x75FB,0x75FD,0x75FE,0x7602,
+ 0x7604,0x7606,0x7607,0x7608,0x7609,0x760B,0x760D,0x760E,
+ 0x760F,0x7611,0x7612,0x7613,0x7614,0x7616,0x761A,0x761C,
+ 0x761D,0x761E,0x7621,0x7623,0x7627,0x7628,0x762C,0x762E,
+ 0x762F,0x7631,0x7632,0x7636,0x7637,0x7639,0x763A,0x763B,
+ 0x763D,0x7641,0x7642,0x7644,0xE1D6,0xE1D7,0xE1D8,0xE1D9,
+ 0xE1DA,0xE1DB,0xE1DC,0xE1DD,0xE1DE,0xE1DF,0xE1E0,0xE1E1,
+ 0xE1E2,0xE1E3,0xE1E4,0xE1E5,0xE1E6,0xE1E7,0xE1E8,0xE1E9,
+ 0xE1EA,0xE1EB,0xE1EC,0xE1ED,0xE1EE,0xE1EF,0xE1F0,0xE1F1,
+ 0xE1F2,0xE1F3,0xE1F4,0xE1F5,0xE1F6,0xE1F7,0xE1F8,0xE1F9,
+ 0xE1FA,0xE1FB,0xE1FC,0xE1FD,0xE1FE,0xE1FF,0xE200,0xE201,
+ 0xE202,0xE203,0xE204,0xE205,0xE206,0xE207,0xE208,0xE209,
+ 0xE20A,0xE20B,0xE20C,0xE20D,0xE20E,0xE20F,0xE210,0xE211,
+ 0xE212,0xE213,0xE214,0xE215,0xE216,0xE217,0xE218,0xE219,
+ 0xE21A,0xE21B,0xE21C,0xE21D,0xE21E,0xE21F,0xE220,0xE221,
+ 0xE222,0xE223,0xE224,0xE225,0xE226,0xE227,0xE228,0xE229,
+ 0xE22A,0xE22B,0xE22C,0xE22D,0xE22E,0xE22F,0xE230,0xE231,
+ 0xE232,0xE233,0x7645,0x7646,0x7647,0x7648,0x7649,0x764A,
+ 0x764B,0x764E,0x764F,0x7650,0x7651,0x7652,0x7653,0x7655,
+ 0x7657,0x7658,0x7659,0x765A,0x765B,0x765D,0x765F,0x7660,
+ 0x7661,0x7662,0x7664,0x7665,0x7666,0x7667,0x7668,0x7669,
+ 0x766A,0x766C,0x766D,0x766E,0x7670,0x7671,0x7672,0x7673,
+ 0x7674,0x7675,0x7676,0x7677,0x7679,0x767A,0x767C,0x767F,
+ 0x7680,0x7681,0x7683,0x7685,0x7689,0x768A,0x768C,0x768D,
+ 0x768F,0x7690,0x7692,0x7694,0x7695,0x7697,0x7698,0x769A,
+ 0x769B,0x769C,0x769D,0x769E,0x769F,0x76A0,0x76A1,0x76A2,
+ 0x76A3,0x76A5,0x76A6,0x76A7,0x76A8,0x76A9,0x76AA,0x76AB,
+ 0x76AC,0x76AD,0x76AF,0x76B0,0x76B3,0x76B5,0x76B6,0x76B7,
+ 0x76B8,0x76B9,0x76BA,0x76BB,0x76BC,0x76BD,0x76BE,0x76C0,
+ 0x76C1,0x76C3,0x554A,0x963F,0x57C3,0x6328,0x54CE,0x5509,
+ 0x54C0,0x7691,0x764C,0x853C,0x77EE,0x827E,0x788D,0x7231,
+ 0x9698,0x978D,0x6C28,0x5B89,0x4FFA,0x6309,0x6697,0x5CB8,
+ 0x80FA,0x6848,0x80AE,0x6602,0x76CE,0x51F9,0x6556,0x71AC,
+ 0x7FF1,0x8884,0x50B2,0x5965,0x61CA,0x6FB3,0x82AD,0x634C,
+ 0x6252,0x53ED,0x5427,0x7B06,0x516B,0x75A4,0x5DF4,0x62D4,
+ 0x8DCB,0x9776,0x628A,0x8019,0x575D,0x9738,0x7F62,0x7238,
+ 0x767D,0x67CF,0x767E,0x6446,0x4F70,0x8D25,0x62DC,0x7A17,
+ 0x6591,0x73ED,0x642C,0x6273,0x822C,0x9881,0x677F,0x7248,
+ 0x626E,0x62CC,0x4F34,0x74E3,0x534A,0x529E,0x7ECA,0x90A6,
+ 0x5E2E,0x6886,0x699C,0x8180,0x7ED1,0x68D2,0x78C5,0x868C,
+ 0x9551,0x508D,0x8C24,0x82DE,0x80DE,0x5305,0x8912,0x5265,
+ 0x76C4,0x76C7,0x76C9,0x76CB,0x76CC,0x76D3,0x76D5,0x76D9,
+ 0x76DA,0x76DC,0x76DD,0x76DE,0x76E0,0x76E1,0x76E2,0x76E3,
+ 0x76E4,0x76E6,0x76E7,0x76E8,0x76E9,0x76EA,0x76EB,0x76EC,
+ 0x76ED,0x76F0,0x76F3,0x76F5,0x76F6,0x76F7,0x76FA,0x76FB,
+ 0x76FD,0x76FF,0x7700,0x7702,0x7703,0x7705,0x7706,0x770A,
+ 0x770C,0x770E,0x770F,0x7710,0x7711,0x7712,0x7713,0x7714,
+ 0x7715,0x7716,0x7717,0x7718,0x771B,0x771C,0x771D,0x771E,
+ 0x7721,0x7723,0x7724,0x7725,0x7727,0x772A,0x772B,0x772C,
+ 0x772E,0x7730,0x7731,0x7732,0x7733,0x7734,0x7739,0x773B,
+ 0x773D,0x773E,0x773F,0x7742,0x7744,0x7745,0x7746,0x7748,
+ 0x7749,0x774A,0x774B,0x774C,0x774D,0x774E,0x774F,0x7752,
+ 0x7753,0x7754,0x7755,0x7756,0x7757,0x7758,0x7759,0x775C,
+ 0x8584,0x96F9,0x4FDD,0x5821,0x9971,0x5B9D,0x62B1,0x62A5,
+ 0x66B4,0x8C79,0x9C8D,0x7206,0x676F,0x7891,0x60B2,0x5351,
+ 0x5317,0x8F88,0x80CC,0x8D1D,0x94A1,0x500D,0x72C8,0x5907,
+ 0x60EB,0x7119,0x88AB,0x5954,0x82EF,0x672C,0x7B28,0x5D29,
+ 0x7EF7,0x752D,0x6CF5,0x8E66,0x8FF8,0x903C,0x9F3B,0x6BD4,
+ 0x9119,0x7B14,0x5F7C,0x78A7,0x84D6,0x853D,0x6BD5,0x6BD9,
+ 0x6BD6,0x5E01,0x5E87,0x75F9,0x95ED,0x655D,0x5F0A,0x5FC5,
+ 0x8F9F,0x58C1,0x81C2,0x907F,0x965B,0x97AD,0x8FB9,0x7F16,
+ 0x8D2C,0x6241,0x4FBF,0x53D8,0x535E,0x8FA8,0x8FA9,0x8FAB,
+ 0x904D,0x6807,0x5F6A,0x8198,0x8868,0x9CD6,0x618B,0x522B,
+ 0x762A,0x5F6C,0x658C,0x6FD2,0x6EE8,0x5BBE,0x6448,0x5175,
+ 0x51B0,0x67C4,0x4E19,0x79C9,0x997C,0x70B3,0x775D,0x775E,
+ 0x775F,0x7760,0x7764,0x7767,0x7769,0x776A,0x776D,0x776E,
+ 0x776F,0x7770,0x7771,0x7772,0x7773,0x7774,0x7775,0x7776,
+ 0x7777,0x7778,0x777A,0x777B,0x777C,0x7781,0x7782,0x7783,
+ 0x7786,0x7787,0x7788,0x7789,0x778A,0x778B,0x778F,0x7790,
+ 0x7793,0x7794,0x7795,0x7796,0x7797,0x7798,0x7799,0x779A,
+ 0x779B,0x779C,0x779D,0x779E,0x77A1,0x77A3,0x77A4,0x77A6,
+ 0x77A8,0x77AB,0x77AD,0x77AE,0x77AF,0x77B1,0x77B2,0x77B4,
+ 0x77B6,0x77B7,0x77B8,0x77B9,0x77BA,0x77BC,0x77BE,0x77C0,
+ 0x77C1,0x77C2,0x77C3,0x77C4,0x77C5,0x77C6,0x77C7,0x77C8,
+ 0x77C9,0x77CA,0x77CB,0x77CC,0x77CE,0x77CF,0x77D0,0x77D1,
+ 0x77D2,0x77D3,0x77D4,0x77D5,0x77D6,0x77D8,0x77D9,0x77DA,
+ 0x77DD,0x77DE,0x77DF,0x77E0,0x77E1,0x77E4,0x75C5,0x5E76,
+ 0x73BB,0x83E0,0x64AD,0x62E8,0x94B5,0x6CE2,0x535A,0x52C3,
+ 0x640F,0x94C2,0x7B94,0x4F2F,0x5E1B,0x8236,0x8116,0x818A,
+ 0x6E24,0x6CCA,0x9A73,0x6355,0x535C,0x54FA,0x8865,0x57E0,
+ 0x4E0D,0x5E03,0x6B65,0x7C3F,0x90E8,0x6016,0x64E6,0x731C,
+ 0x88C1,0x6750,0x624D,0x8D22,0x776C,0x8E29,0x91C7,0x5F69,
+ 0x83DC,0x8521,0x9910,0x53C2,0x8695,0x6B8B,0x60ED,0x60E8,
+ 0x707F,0x82CD,0x8231,0x4ED3,0x6CA7,0x85CF,0x64CD,0x7CD9,
+ 0x69FD,0x66F9,0x8349,0x5395,0x7B56,0x4FA7,0x518C,0x6D4B,
+ 0x5C42,0x8E6D,0x63D2,0x53C9,0x832C,0x8336,0x67E5,0x78B4,
+ 0x643D,0x5BDF,0x5C94,0x5DEE,0x8BE7,0x62C6,0x67F4,0x8C7A,
+ 0x6400,0x63BA,0x8749,0x998B,0x8C17,0x7F20,0x94F2,0x4EA7,
+ 0x9610,0x98A4,0x660C,0x7316,0x77E6,0x77E8,0x77EA,0x77EF,
+ 0x77F0,0x77F1,0x77F2,0x77F4,0x77F5,0x77F7,0x77F9,0x77FA,
+ 0x77FB,0x77FC,0x7803,0x7804,0x7805,0x7806,0x7807,0x7808,
+ 0x780A,0x780B,0x780E,0x780F,0x7810,0x7813,0x7815,0x7819,
+ 0x781B,0x781E,0x7820,0x7821,0x7822,0x7824,0x7828,0x782A,
+ 0x782B,0x782E,0x782F,0x7831,0x7832,0x7833,0x7835,0x7836,
+ 0x783D,0x783F,0x7841,0x7842,0x7843,0x7844,0x7846,0x7848,
+ 0x7849,0x784A,0x784B,0x784D,0x784F,0x7851,0x7853,0x7854,
+ 0x7858,0x7859,0x785A,0x785B,0x785C,0x785E,0x785F,0x7860,
+ 0x7861,0x7862,0x7863,0x7864,0x7865,0x7866,0x7867,0x7868,
+ 0x7869,0x786F,0x7870,0x7871,0x7872,0x7873,0x7874,0x7875,
+ 0x7876,0x7878,0x7879,0x787A,0x787B,0x787D,0x787E,0x787F,
+ 0x7880,0x7881,0x7882,0x7883,0x573A,0x5C1D,0x5E38,0x957F,
+ 0x507F,0x80A0,0x5382,0x655E,0x7545,0x5531,0x5021,0x8D85,
+ 0x6284,0x949E,0x671D,0x5632,0x6F6E,0x5DE2,0x5435,0x7092,
+ 0x8F66,0x626F,0x64A4,0x63A3,0x5F7B,0x6F88,0x90F4,0x81E3,
+ 0x8FB0,0x5C18,0x6668,0x5FF1,0x6C89,0x9648,0x8D81,0x886C,
+ 0x6491,0x79F0,0x57CE,0x6A59,0x6210,0x5448,0x4E58,0x7A0B,
+ 0x60E9,0x6F84,0x8BDA,0x627F,0x901E,0x9A8B,0x79E4,0x5403,
+ 0x75F4,0x6301,0x5319,0x6C60,0x8FDF,0x5F1B,0x9A70,0x803B,
+ 0x9F7F,0x4F88,0x5C3A,0x8D64,0x7FC5,0x65A5,0x70BD,0x5145,
+ 0x51B2,0x866B,0x5D07,0x5BA0,0x62BD,0x916C,0x7574,0x8E0C,
+ 0x7A20,0x6101,0x7B79,0x4EC7,0x7EF8,0x7785,0x4E11,0x81ED,
+ 0x521D,0x51FA,0x6A71,0x53A8,0x8E87,0x9504,0x96CF,0x6EC1,
+ 0x9664,0x695A,0x7884,0x7885,0x7886,0x7888,0x788A,0x788B,
+ 0x788F,0x7890,0x7892,0x7894,0x7895,0x7896,0x7899,0x789D,
+ 0x789E,0x78A0,0x78A2,0x78A4,0x78A6,0x78A8,0x78A9,0x78AA,
+ 0x78AB,0x78AC,0x78AD,0x78AE,0x78AF,0x78B5,0x78B6,0x78B7,
+ 0x78B8,0x78BA,0x78BB,0x78BC,0x78BD,0x78BF,0x78C0,0x78C2,
+ 0x78C3,0x78C4,0x78C6,0x78C7,0x78C8,0x78CC,0x78CD,0x78CE,
+ 0x78CF,0x78D1,0x78D2,0x78D3,0x78D6,0x78D7,0x78D8,0x78DA,
+ 0x78DB,0x78DC,0x78DD,0x78DE,0x78DF,0x78E0,0x78E1,0x78E2,
+ 0x78E3,0x78E4,0x78E5,0x78E6,0x78E7,0x78E9,0x78EA,0x78EB,
+ 0x78ED,0x78EE,0x78EF,0x78F0,0x78F1,0x78F3,0x78F5,0x78F6,
+ 0x78F8,0x78F9,0x78FB,0x78FC,0x78FD,0x78FE,0x78FF,0x7900,
+ 0x7902,0x7903,0x7904,0x7906,0x7907,0x7908,0x7909,0x790A,
+ 0x790B,0x790C,0x7840,0x50A8,0x77D7,0x6410,0x89E6,0x5904,
+ 0x63E3,0x5DDD,0x7A7F,0x693D,0x4F20,0x8239,0x5598,0x4E32,
+ 0x75AE,0x7A97,0x5E62,0x5E8A,0x95EF,0x521B,0x5439,0x708A,
+ 0x6376,0x9524,0x5782,0x6625,0x693F,0x9187,0x5507,0x6DF3,
+ 0x7EAF,0x8822,0x6233,0x7EF0,0x75B5,0x8328,0x78C1,0x96CC,
+ 0x8F9E,0x6148,0x74F7,0x8BCD,0x6B64,0x523A,0x8D50,0x6B21,
+ 0x806A,0x8471,0x56F1,0x5306,0x4ECE,0x4E1B,0x51D1,0x7C97,
+ 0x918B,0x7C07,0x4FC3,0x8E7F,0x7BE1,0x7A9C,0x6467,0x5D14,
+ 0x50AC,0x8106,0x7601,0x7CB9,0x6DEC,0x7FE0,0x6751,0x5B58,
+ 0x5BF8,0x78CB,0x64AE,0x6413,0x63AA,0x632B,0x9519,0x642D,
+ 0x8FBE,0x7B54,0x7629,0x6253,0x5927,0x5446,0x6B79,0x50A3,
+ 0x6234,0x5E26,0x6B86,0x4EE3,0x8D37,0x888B,0x5F85,0x902E,
+ 0x790D,0x790E,0x790F,0x7910,0x7911,0x7912,0x7914,0x7915,
+ 0x7916,0x7917,0x7918,0x7919,0x791A,0x791B,0x791C,0x791D,
+ 0x791F,0x7920,0x7921,0x7922,0x7923,0x7925,0x7926,0x7927,
+ 0x7928,0x7929,0x792A,0x792B,0x792C,0x792D,0x792E,0x792F,
+ 0x7930,0x7931,0x7932,0x7933,0x7935,0x7936,0x7937,0x7938,
+ 0x7939,0x793D,0x793F,0x7942,0x7943,0x7944,0x7945,0x7947,
+ 0x794A,0x794B,0x794C,0x794D,0x794E,0x794F,0x7950,0x7951,
+ 0x7952,0x7954,0x7955,0x7958,0x7959,0x7961,0x7963,0x7964,
+ 0x7966,0x7969,0x796A,0x796B,0x796C,0x796E,0x7970,0x7971,
+ 0x7972,0x7973,0x7974,0x7975,0x7976,0x7979,0x797B,0x797C,
+ 0x797D,0x797E,0x797F,0x7982,0x7983,0x7986,0x7987,0x7988,
+ 0x7989,0x798B,0x798C,0x798D,0x798E,0x7990,0x7991,0x7992,
+ 0x6020,0x803D,0x62C5,0x4E39,0x5355,0x90F8,0x63B8,0x80C6,
+ 0x65E6,0x6C2E,0x4F46,0x60EE,0x6DE1,0x8BDE,0x5F39,0x86CB,
+ 0x5F53,0x6321,0x515A,0x8361,0x6863,0x5200,0x6363,0x8E48,
+ 0x5012,0x5C9B,0x7977,0x5BFC,0x5230,0x7A3B,0x60BC,0x9053,
+ 0x76D7,0x5FB7,0x5F97,0x7684,0x8E6C,0x706F,0x767B,0x7B49,
+ 0x77AA,0x51F3,0x9093,0x5824,0x4F4E,0x6EF4,0x8FEA,0x654C,
+ 0x7B1B,0x72C4,0x6DA4,0x7FDF,0x5AE1,0x62B5,0x5E95,0x5730,
+ 0x8482,0x7B2C,0x5E1D,0x5F1F,0x9012,0x7F14,0x98A0,0x6382,
+ 0x6EC7,0x7898,0x70B9,0x5178,0x975B,0x57AB,0x7535,0x4F43,
+ 0x7538,0x5E97,0x60E6,0x5960,0x6DC0,0x6BBF,0x7889,0x53FC,
+ 0x96D5,0x51CB,0x5201,0x6389,0x540A,0x9493,0x8C03,0x8DCC,
+ 0x7239,0x789F,0x8776,0x8FED,0x8C0D,0x53E0,0x7993,0x7994,
+ 0x7995,0x7996,0x7997,0x7998,0x7999,0x799B,0x799C,0x799D,
+ 0x799E,0x799F,0x79A0,0x79A1,0x79A2,0x79A3,0x79A4,0x79A5,
+ 0x79A6,0x79A8,0x79A9,0x79AA,0x79AB,0x79AC,0x79AD,0x79AE,
+ 0x79AF,0x79B0,0x79B1,0x79B2,0x79B4,0x79B5,0x79B6,0x79B7,
+ 0x79B8,0x79BC,0x79BF,0x79C2,0x79C4,0x79C5,0x79C7,0x79C8,
+ 0x79CA,0x79CC,0x79CE,0x79CF,0x79D0,0x79D3,0x79D4,0x79D6,
+ 0x79D7,0x79D9,0x79DA,0x79DB,0x79DC,0x79DD,0x79DE,0x79E0,
+ 0x79E1,0x79E2,0x79E5,0x79E8,0x79EA,0x79EC,0x79EE,0x79F1,
+ 0x79F2,0x79F3,0x79F4,0x79F5,0x79F6,0x79F7,0x79F9,0x79FA,
+ 0x79FC,0x79FE,0x79FF,0x7A01,0x7A04,0x7A05,0x7A07,0x7A08,
+ 0x7A09,0x7A0A,0x7A0C,0x7A0F,0x7A10,0x7A11,0x7A12,0x7A13,
+ 0x7A15,0x7A16,0x7A18,0x7A19,0x7A1B,0x7A1C,0x4E01,0x76EF,
+ 0x53EE,0x9489,0x9876,0x9F0E,0x952D,0x5B9A,0x8BA2,0x4E22,
+ 0x4E1C,0x51AC,0x8463,0x61C2,0x52A8,0x680B,0x4F97,0x606B,
+ 0x51BB,0x6D1E,0x515C,0x6296,0x6597,0x9661,0x8C46,0x9017,
+ 0x75D8,0x90FD,0x7763,0x6BD2,0x728A,0x72EC,0x8BFB,0x5835,
+ 0x7779,0x8D4C,0x675C,0x9540,0x809A,0x5EA6,0x6E21,0x5992,
+ 0x7AEF,0x77ED,0x953B,0x6BB5,0x65AD,0x7F0E,0x5806,0x5151,
+ 0x961F,0x5BF9,0x58A9,0x5428,0x8E72,0x6566,0x987F,0x56E4,
+ 0x949D,0x76FE,0x9041,0x6387,0x54C6,0x591A,0x593A,0x579B,
+ 0x8EB2,0x6735,0x8DFA,0x8235,0x5241,0x60F0,0x5815,0x86FE,
+ 0x5CE8,0x9E45,0x4FC4,0x989D,0x8BB9,0x5A25,0x6076,0x5384,
+ 0x627C,0x904F,0x9102,0x997F,0x6069,0x800C,0x513F,0x8033,
+ 0x5C14,0x9975,0x6D31,0x4E8C,0x7A1D,0x7A1F,0x7A21,0x7A22,
+ 0x7A24,0x7A25,0x7A26,0x7A27,0x7A28,0x7A29,0x7A2A,0x7A2B,
+ 0x7A2C,0x7A2D,0x7A2E,0x7A2F,0x7A30,0x7A31,0x7A32,0x7A34,
+ 0x7A35,0x7A36,0x7A38,0x7A3A,0x7A3E,0x7A40,0x7A41,0x7A42,
+ 0x7A43,0x7A44,0x7A45,0x7A47,0x7A48,0x7A49,0x7A4A,0x7A4B,
+ 0x7A4C,0x7A4D,0x7A4E,0x7A4F,0x7A50,0x7A52,0x7A53,0x7A54,
+ 0x7A55,0x7A56,0x7A58,0x7A59,0x7A5A,0x7A5B,0x7A5C,0x7A5D,
+ 0x7A5E,0x7A5F,0x7A60,0x7A61,0x7A62,0x7A63,0x7A64,0x7A65,
+ 0x7A66,0x7A67,0x7A68,0x7A69,0x7A6A,0x7A6B,0x7A6C,0x7A6D,
+ 0x7A6E,0x7A6F,0x7A71,0x7A72,0x7A73,0x7A75,0x7A7B,0x7A7C,
+ 0x7A7D,0x7A7E,0x7A82,0x7A85,0x7A87,0x7A89,0x7A8A,0x7A8B,
+ 0x7A8C,0x7A8E,0x7A8F,0x7A90,0x7A93,0x7A94,0x7A99,0x7A9A,
+ 0x7A9B,0x7A9E,0x7AA1,0x7AA2,0x8D30,0x53D1,0x7F5A,0x7B4F,
+ 0x4F10,0x4E4F,0x9600,0x6CD5,0x73D0,0x85E9,0x5E06,0x756A,
+ 0x7FFB,0x6A0A,0x77FE,0x9492,0x7E41,0x51E1,0x70E6,0x53CD,
+ 0x8FD4,0x8303,0x8D29,0x72AF,0x996D,0x6CDB,0x574A,0x82B3,
+ 0x65B9,0x80AA,0x623F,0x9632,0x59A8,0x4EFF,0x8BBF,0x7EBA,
+ 0x653E,0x83F2,0x975E,0x5561,0x98DE,0x80A5,0x532A,0x8BFD,
+ 0x5420,0x80BA,0x5E9F,0x6CB8,0x8D39,0x82AC,0x915A,0x5429,
+ 0x6C1B,0x5206,0x7EB7,0x575F,0x711A,0x6C7E,0x7C89,0x594B,
+ 0x4EFD,0x5FFF,0x6124,0x7CAA,0x4E30,0x5C01,0x67AB,0x8702,
+ 0x5CF0,0x950B,0x98CE,0x75AF,0x70FD,0x9022,0x51AF,0x7F1D,
+ 0x8BBD,0x5949,0x51E4,0x4F5B,0x5426,0x592B,0x6577,0x80A4,
+ 0x5B75,0x6276,0x62C2,0x8F90,0x5E45,0x6C1F,0x7B26,0x4F0F,
+ 0x4FD8,0x670D,0x7AA3,0x7AA4,0x7AA7,0x7AA9,0x7AAA,0x7AAB,
+ 0x7AAE,0x7AAF,0x7AB0,0x7AB1,0x7AB2,0x7AB4,0x7AB5,0x7AB6,
+ 0x7AB7,0x7AB8,0x7AB9,0x7ABA,0x7ABB,0x7ABC,0x7ABD,0x7ABE,
+ 0x7AC0,0x7AC1,0x7AC2,0x7AC3,0x7AC4,0x7AC5,0x7AC6,0x7AC7,
+ 0x7AC8,0x7AC9,0x7ACA,0x7ACC,0x7ACD,0x7ACE,0x7ACF,0x7AD0,
+ 0x7AD1,0x7AD2,0x7AD3,0x7AD4,0x7AD5,0x7AD7,0x7AD8,0x7ADA,
+ 0x7ADB,0x7ADC,0x7ADD,0x7AE1,0x7AE2,0x7AE4,0x7AE7,0x7AE8,
+ 0x7AE9,0x7AEA,0x7AEB,0x7AEC,0x7AEE,0x7AF0,0x7AF1,0x7AF2,
+ 0x7AF3,0x7AF4,0x7AF5,0x7AF6,0x7AF7,0x7AF8,0x7AFB,0x7AFC,
+ 0x7AFE,0x7B00,0x7B01,0x7B02,0x7B05,0x7B07,0x7B09,0x7B0C,
+ 0x7B0D,0x7B0E,0x7B10,0x7B12,0x7B13,0x7B16,0x7B17,0x7B18,
+ 0x7B1A,0x7B1C,0x7B1D,0x7B1F,0x7B21,0x7B22,0x7B23,0x7B27,
+ 0x7B29,0x7B2D,0x6D6E,0x6DAA,0x798F,0x88B1,0x5F17,0x752B,
+ 0x629A,0x8F85,0x4FEF,0x91DC,0x65A7,0x812F,0x8151,0x5E9C,
+ 0x8150,0x8D74,0x526F,0x8986,0x8D4B,0x590D,0x5085,0x4ED8,
+ 0x961C,0x7236,0x8179,0x8D1F,0x5BCC,0x8BA3,0x9644,0x5987,
+ 0x7F1A,0x5490,0x5676,0x560E,0x8BE5,0x6539,0x6982,0x9499,
+ 0x76D6,0x6E89,0x5E72,0x7518,0x6746,0x67D1,0x7AFF,0x809D,
+ 0x8D76,0x611F,0x79C6,0x6562,0x8D63,0x5188,0x521A,0x94A2,
+ 0x7F38,0x809B,0x7EB2,0x5C97,0x6E2F,0x6760,0x7BD9,0x768B,
+ 0x9AD8,0x818F,0x7F94,0x7CD5,0x641E,0x9550,0x7A3F,0x544A,
+ 0x54E5,0x6B4C,0x6401,0x6208,0x9E3D,0x80F3,0x7599,0x5272,
+ 0x9769,0x845B,0x683C,0x86E4,0x9601,0x9694,0x94EC,0x4E2A,
+ 0x5404,0x7ED9,0x6839,0x8DDF,0x8015,0x66F4,0x5E9A,0x7FB9,
+ 0x7B2F,0x7B30,0x7B32,0x7B34,0x7B35,0x7B36,0x7B37,0x7B39,
+ 0x7B3B,0x7B3D,0x7B3F,0x7B40,0x7B41,0x7B42,0x7B43,0x7B44,
+ 0x7B46,0x7B48,0x7B4A,0x7B4D,0x7B4E,0x7B53,0x7B55,0x7B57,
+ 0x7B59,0x7B5C,0x7B5E,0x7B5F,0x7B61,0x7B63,0x7B64,0x7B65,
+ 0x7B66,0x7B67,0x7B68,0x7B69,0x7B6A,0x7B6B,0x7B6C,0x7B6D,
+ 0x7B6F,0x7B70,0x7B73,0x7B74,0x7B76,0x7B78,0x7B7A,0x7B7C,
+ 0x7B7D,0x7B7F,0x7B81,0x7B82,0x7B83,0x7B84,0x7B86,0x7B87,
+ 0x7B88,0x7B89,0x7B8A,0x7B8B,0x7B8C,0x7B8E,0x7B8F,0x7B91,
+ 0x7B92,0x7B93,0x7B96,0x7B98,0x7B99,0x7B9A,0x7B9B,0x7B9E,
+ 0x7B9F,0x7BA0,0x7BA3,0x7BA4,0x7BA5,0x7BAE,0x7BAF,0x7BB0,
+ 0x7BB2,0x7BB3,0x7BB5,0x7BB6,0x7BB7,0x7BB9,0x7BBA,0x7BBB,
+ 0x7BBC,0x7BBD,0x7BBE,0x7BBF,0x7BC0,0x7BC2,0x7BC3,0x7BC4,
+ 0x57C2,0x803F,0x6897,0x5DE5,0x653B,0x529F,0x606D,0x9F9A,
+ 0x4F9B,0x8EAC,0x516C,0x5BAB,0x5F13,0x5DE9,0x6C5E,0x62F1,
+ 0x8D21,0x5171,0x94A9,0x52FE,0x6C9F,0x82DF,0x72D7,0x57A2,
+ 0x6784,0x8D2D,0x591F,0x8F9C,0x83C7,0x5495,0x7B8D,0x4F30,
+ 0x6CBD,0x5B64,0x59D1,0x9F13,0x53E4,0x86CA,0x9AA8,0x8C37,
+ 0x80A1,0x6545,0x987E,0x56FA,0x96C7,0x522E,0x74DC,0x5250,
+ 0x5BE1,0x6302,0x8902,0x4E56,0x62D0,0x602A,0x68FA,0x5173,
+ 0x5B98,0x51A0,0x89C2,0x7BA1,0x9986,0x7F50,0x60EF,0x704C,
+ 0x8D2F,0x5149,0x5E7F,0x901B,0x7470,0x89C4,0x572D,0x7845,
+ 0x5F52,0x9F9F,0x95FA,0x8F68,0x9B3C,0x8BE1,0x7678,0x6842,
+ 0x67DC,0x8DEA,0x8D35,0x523D,0x8F8A,0x6EDA,0x68CD,0x9505,
+ 0x90ED,0x56FD,0x679C,0x88F9,0x8FC7,0x54C8,0x7BC5,0x7BC8,
+ 0x7BC9,0x7BCA,0x7BCB,0x7BCD,0x7BCE,0x7BCF,0x7BD0,0x7BD2,
+ 0x7BD4,0x7BD5,0x7BD6,0x7BD7,0x7BD8,0x7BDB,0x7BDC,0x7BDE,
+ 0x7BDF,0x7BE0,0x7BE2,0x7BE3,0x7BE4,0x7BE7,0x7BE8,0x7BE9,
+ 0x7BEB,0x7BEC,0x7BED,0x7BEF,0x7BF0,0x7BF2,0x7BF3,0x7BF4,
+ 0x7BF5,0x7BF6,0x7BF8,0x7BF9,0x7BFA,0x7BFB,0x7BFD,0x7BFF,
+ 0x7C00,0x7C01,0x7C02,0x7C03,0x7C04,0x7C05,0x7C06,0x7C08,
+ 0x7C09,0x7C0A,0x7C0D,0x7C0E,0x7C10,0x7C11,0x7C12,0x7C13,
+ 0x7C14,0x7C15,0x7C17,0x7C18,0x7C19,0x7C1A,0x7C1B,0x7C1C,
+ 0x7C1D,0x7C1E,0x7C20,0x7C21,0x7C22,0x7C23,0x7C24,0x7C25,
+ 0x7C28,0x7C29,0x7C2B,0x7C2C,0x7C2D,0x7C2E,0x7C2F,0x7C30,
+ 0x7C31,0x7C32,0x7C33,0x7C34,0x7C35,0x7C36,0x7C37,0x7C39,
+ 0x7C3A,0x7C3B,0x7C3C,0x7C3D,0x7C3E,0x7C42,0x9AB8,0x5B69,
+ 0x6D77,0x6C26,0x4EA5,0x5BB3,0x9A87,0x9163,0x61A8,0x90AF,
+ 0x97E9,0x542B,0x6DB5,0x5BD2,0x51FD,0x558A,0x7F55,0x7FF0,
+ 0x64BC,0x634D,0x65F1,0x61BE,0x608D,0x710A,0x6C57,0x6C49,
+ 0x592F,0x676D,0x822A,0x58D5,0x568E,0x8C6A,0x6BEB,0x90DD,
+ 0x597D,0x8017,0x53F7,0x6D69,0x5475,0x559D,0x8377,0x83CF,
+ 0x6838,0x79BE,0x548C,0x4F55,0x5408,0x76D2,0x8C89,0x9602,
+ 0x6CB3,0x6DB8,0x8D6B,0x8910,0x9E64,0x8D3A,0x563F,0x9ED1,
+ 0x75D5,0x5F88,0x72E0,0x6068,0x54FC,0x4EA8,0x6A2A,0x8861,
+ 0x6052,0x8F70,0x54C4,0x70D8,0x8679,0x9E3F,0x6D2A,0x5B8F,
+ 0x5F18,0x7EA2,0x5589,0x4FAF,0x7334,0x543C,0x539A,0x5019,
+ 0x540E,0x547C,0x4E4E,0x5FFD,0x745A,0x58F6,0x846B,0x80E1,
+ 0x8774,0x72D0,0x7CCA,0x6E56,0x7C43,0x7C44,0x7C45,0x7C46,
+ 0x7C47,0x7C48,0x7C49,0x7C4A,0x7C4B,0x7C4C,0x7C4E,0x7C4F,
+ 0x7C50,0x7C51,0x7C52,0x7C53,0x7C54,0x7C55,0x7C56,0x7C57,
+ 0x7C58,0x7C59,0x7C5A,0x7C5B,0x7C5C,0x7C5D,0x7C5E,0x7C5F,
+ 0x7C60,0x7C61,0x7C62,0x7C63,0x7C64,0x7C65,0x7C66,0x7C67,
+ 0x7C68,0x7C69,0x7C6A,0x7C6B,0x7C6C,0x7C6D,0x7C6E,0x7C6F,
+ 0x7C70,0x7C71,0x7C72,0x7C75,0x7C76,0x7C77,0x7C78,0x7C79,
+ 0x7C7A,0x7C7E,0x7C7F,0x7C80,0x7C81,0x7C82,0x7C83,0x7C84,
+ 0x7C85,0x7C86,0x7C87,0x7C88,0x7C8A,0x7C8B,0x7C8C,0x7C8D,
+ 0x7C8E,0x7C8F,0x7C90,0x7C93,0x7C94,0x7C96,0x7C99,0x7C9A,
+ 0x7C9B,0x7CA0,0x7CA1,0x7CA3,0x7CA6,0x7CA7,0x7CA8,0x7CA9,
+ 0x7CAB,0x7CAC,0x7CAD,0x7CAF,0x7CB0,0x7CB4,0x7CB5,0x7CB6,
+ 0x7CB7,0x7CB8,0x7CBA,0x7CBB,0x5F27,0x864E,0x552C,0x62A4,
+ 0x4E92,0x6CAA,0x6237,0x82B1,0x54D7,0x534E,0x733E,0x6ED1,
+ 0x753B,0x5212,0x5316,0x8BDD,0x69D0,0x5F8A,0x6000,0x6DEE,
+ 0x574F,0x6B22,0x73AF,0x6853,0x8FD8,0x7F13,0x6362,0x60A3,
+ 0x5524,0x75EA,0x8C62,0x7115,0x6DA3,0x5BA6,0x5E7B,0x8352,
+ 0x614C,0x9EC4,0x78FA,0x8757,0x7C27,0x7687,0x51F0,0x60F6,
+ 0x714C,0x6643,0x5E4C,0x604D,0x8C0E,0x7070,0x6325,0x8F89,
+ 0x5FBD,0x6062,0x86D4,0x56DE,0x6BC1,0x6094,0x6167,0x5349,
+ 0x60E0,0x6666,0x8D3F,0x79FD,0x4F1A,0x70E9,0x6C47,0x8BB3,
+ 0x8BF2,0x7ED8,0x8364,0x660F,0x5A5A,0x9B42,0x6D51,0x6DF7,
+ 0x8C41,0x6D3B,0x4F19,0x706B,0x83B7,0x6216,0x60D1,0x970D,
+ 0x8D27,0x7978,0x51FB,0x573E,0x57FA,0x673A,0x7578,0x7A3D,
+ 0x79EF,0x7B95,0x7CBF,0x7CC0,0x7CC2,0x7CC3,0x7CC4,0x7CC6,
+ 0x7CC9,0x7CCB,0x7CCE,0x7CCF,0x7CD0,0x7CD1,0x7CD2,0x7CD3,
+ 0x7CD4,0x7CD8,0x7CDA,0x7CDB,0x7CDD,0x7CDE,0x7CE1,0x7CE2,
+ 0x7CE3,0x7CE4,0x7CE5,0x7CE6,0x7CE7,0x7CE9,0x7CEA,0x7CEB,
+ 0x7CEC,0x7CED,0x7CEE,0x7CF0,0x7CF1,0x7CF2,0x7CF3,0x7CF4,
+ 0x7CF5,0x7CF6,0x7CF7,0x7CF9,0x7CFA,0x7CFC,0x7CFD,0x7CFE,
+ 0x7CFF,0x7D00,0x7D01,0x7D02,0x7D03,0x7D04,0x7D05,0x7D06,
+ 0x7D07,0x7D08,0x7D09,0x7D0B,0x7D0C,0x7D0D,0x7D0E,0x7D0F,
+ 0x7D10,0x7D11,0x7D12,0x7D13,0x7D14,0x7D15,0x7D16,0x7D17,
+ 0x7D18,0x7D19,0x7D1A,0x7D1B,0x7D1C,0x7D1D,0x7D1E,0x7D1F,
+ 0x7D21,0x7D23,0x7D24,0x7D25,0x7D26,0x7D28,0x7D29,0x7D2A,
+ 0x7D2C,0x7D2D,0x7D2E,0x7D30,0x7D31,0x7D32,0x7D33,0x7D34,
+ 0x7D35,0x7D36,0x808C,0x9965,0x8FF9,0x6FC0,0x8BA5,0x9E21,
+ 0x59EC,0x7EE9,0x7F09,0x5409,0x6781,0x68D8,0x8F91,0x7C4D,
+ 0x96C6,0x53CA,0x6025,0x75BE,0x6C72,0x5373,0x5AC9,0x7EA7,
+ 0x6324,0x51E0,0x810A,0x5DF1,0x84DF,0x6280,0x5180,0x5B63,
+ 0x4F0E,0x796D,0x5242,0x60B8,0x6D4E,0x5BC4,0x5BC2,0x8BA1,
+ 0x8BB0,0x65E2,0x5FCC,0x9645,0x5993,0x7EE7,0x7EAA,0x5609,
+ 0x67B7,0x5939,0x4F73,0x5BB6,0x52A0,0x835A,0x988A,0x8D3E,
+ 0x7532,0x94BE,0x5047,0x7A3C,0x4EF7,0x67B6,0x9A7E,0x5AC1,
+ 0x6B7C,0x76D1,0x575A,0x5C16,0x7B3A,0x95F4,0x714E,0x517C,
+ 0x80A9,0x8270,0x5978,0x7F04,0x8327,0x68C0,0x67EC,0x78B1,
+ 0x7877,0x62E3,0x6361,0x7B80,0x4FED,0x526A,0x51CF,0x8350,
+ 0x69DB,0x9274,0x8DF5,0x8D31,0x89C1,0x952E,0x7BAD,0x4EF6,
+ 0x7D37,0x7D38,0x7D39,0x7D3A,0x7D3B,0x7D3C,0x7D3D,0x7D3E,
+ 0x7D3F,0x7D40,0x7D41,0x7D42,0x7D43,0x7D44,0x7D45,0x7D46,
+ 0x7D47,0x7D48,0x7D49,0x7D4A,0x7D4B,0x7D4C,0x7D4D,0x7D4E,
+ 0x7D4F,0x7D50,0x7D51,0x7D52,0x7D53,0x7D54,0x7D55,0x7D56,
+ 0x7D57,0x7D58,0x7D59,0x7D5A,0x7D5B,0x7D5C,0x7D5D,0x7D5E,
+ 0x7D5F,0x7D60,0x7D61,0x7D62,0x7D63,0x7D64,0x7D65,0x7D66,
+ 0x7D67,0x7D68,0x7D69,0x7D6A,0x7D6B,0x7D6C,0x7D6D,0x7D6F,
+ 0x7D70,0x7D71,0x7D72,0x7D73,0x7D74,0x7D75,0x7D76,0x7D78,
+ 0x7D79,0x7D7A,0x7D7B,0x7D7C,0x7D7D,0x7D7E,0x7D7F,0x7D80,
+ 0x7D81,0x7D82,0x7D83,0x7D84,0x7D85,0x7D86,0x7D87,0x7D88,
+ 0x7D89,0x7D8A,0x7D8B,0x7D8C,0x7D8D,0x7D8E,0x7D8F,0x7D90,
+ 0x7D91,0x7D92,0x7D93,0x7D94,0x7D95,0x7D96,0x7D97,0x7D98,
+ 0x5065,0x8230,0x5251,0x996F,0x6E10,0x6E85,0x6DA7,0x5EFA,
+ 0x50F5,0x59DC,0x5C06,0x6D46,0x6C5F,0x7586,0x848B,0x6868,
+ 0x5956,0x8BB2,0x5320,0x9171,0x964D,0x8549,0x6912,0x7901,
+ 0x7126,0x80F6,0x4EA4,0x90CA,0x6D47,0x9A84,0x5A07,0x56BC,
+ 0x6405,0x94F0,0x77EB,0x4FA5,0x811A,0x72E1,0x89D2,0x997A,
+ 0x7F34,0x7EDE,0x527F,0x6559,0x9175,0x8F7F,0x8F83,0x53EB,
+ 0x7A96,0x63ED,0x63A5,0x7686,0x79F8,0x8857,0x9636,0x622A,
+ 0x52AB,0x8282,0x6854,0x6770,0x6377,0x776B,0x7AED,0x6D01,
+ 0x7ED3,0x89E3,0x59D0,0x6212,0x85C9,0x82A5,0x754C,0x501F,
+ 0x4ECB,0x75A5,0x8BEB,0x5C4A,0x5DFE,0x7B4B,0x65A4,0x91D1,
+ 0x4ECA,0x6D25,0x895F,0x7D27,0x9526,0x4EC5,0x8C28,0x8FDB,
+ 0x9773,0x664B,0x7981,0x8FD1,0x70EC,0x6D78,0x7D99,0x7D9A,
+ 0x7D9B,0x7D9C,0x7D9D,0x7D9E,0x7D9F,0x7DA0,0x7DA1,0x7DA2,
+ 0x7DA3,0x7DA4,0x7DA5,0x7DA7,0x7DA8,0x7DA9,0x7DAA,0x7DAB,
+ 0x7DAC,0x7DAD,0x7DAF,0x7DB0,0x7DB1,0x7DB2,0x7DB3,0x7DB4,
+ 0x7DB5,0x7DB6,0x7DB7,0x7DB8,0x7DB9,0x7DBA,0x7DBB,0x7DBC,
+ 0x7DBD,0x7DBE,0x7DBF,0x7DC0,0x7DC1,0x7DC2,0x7DC3,0x7DC4,
+ 0x7DC5,0x7DC6,0x7DC7,0x7DC8,0x7DC9,0x7DCA,0x7DCB,0x7DCC,
+ 0x7DCD,0x7DCE,0x7DCF,0x7DD0,0x7DD1,0x7DD2,0x7DD3,0x7DD4,
+ 0x7DD5,0x7DD6,0x7DD7,0x7DD8,0x7DD9,0x7DDA,0x7DDB,0x7DDC,
+ 0x7DDD,0x7DDE,0x7DDF,0x7DE0,0x7DE1,0x7DE2,0x7DE3,0x7DE4,
+ 0x7DE5,0x7DE6,0x7DE7,0x7DE8,0x7DE9,0x7DEA,0x7DEB,0x7DEC,
+ 0x7DED,0x7DEE,0x7DEF,0x7DF0,0x7DF1,0x7DF2,0x7DF3,0x7DF4,
+ 0x7DF5,0x7DF6,0x7DF7,0x7DF8,0x7DF9,0x7DFA,0x5C3D,0x52B2,
+ 0x8346,0x5162,0x830E,0x775B,0x6676,0x9CB8,0x4EAC,0x60CA,
+ 0x7CBE,0x7CB3,0x7ECF,0x4E95,0x8B66,0x666F,0x9888,0x9759,
+ 0x5883,0x656C,0x955C,0x5F84,0x75C9,0x9756,0x7ADF,0x7ADE,
+ 0x51C0,0x70AF,0x7A98,0x63EA,0x7A76,0x7EA0,0x7396,0x97ED,
+ 0x4E45,0x7078,0x4E5D,0x9152,0x53A9,0x6551,0x65E7,0x81FC,
+ 0x8205,0x548E,0x5C31,0x759A,0x97A0,0x62D8,0x72D9,0x75BD,
+ 0x5C45,0x9A79,0x83CA,0x5C40,0x5480,0x77E9,0x4E3E,0x6CAE,
+ 0x805A,0x62D2,0x636E,0x5DE8,0x5177,0x8DDD,0x8E1E,0x952F,
+ 0x4FF1,0x53E5,0x60E7,0x70AC,0x5267,0x6350,0x9E43,0x5A1F,
+ 0x5026,0x7737,0x5377,0x7EE2,0x6485,0x652B,0x6289,0x6398,
+ 0x5014,0x7235,0x89C9,0x51B3,0x8BC0,0x7EDD,0x5747,0x83CC,
+ 0x94A7,0x519B,0x541B,0x5CFB,0x7DFB,0x7DFC,0x7DFD,0x7DFE,
+ 0x7DFF,0x7E00,0x7E01,0x7E02,0x7E03,0x7E04,0x7E05,0x7E06,
+ 0x7E07,0x7E08,0x7E09,0x7E0A,0x7E0B,0x7E0C,0x7E0D,0x7E0E,
+ 0x7E0F,0x7E10,0x7E11,0x7E12,0x7E13,0x7E14,0x7E15,0x7E16,
+ 0x7E17,0x7E18,0x7E19,0x7E1A,0x7E1B,0x7E1C,0x7E1D,0x7E1E,
+ 0x7E1F,0x7E20,0x7E21,0x7E22,0x7E23,0x7E24,0x7E25,0x7E26,
+ 0x7E27,0x7E28,0x7E29,0x7E2A,0x7E2B,0x7E2C,0x7E2D,0x7E2E,
+ 0x7E2F,0x7E30,0x7E31,0x7E32,0x7E33,0x7E34,0x7E35,0x7E36,
+ 0x7E37,0x7E38,0x7E39,0x7E3A,0x7E3C,0x7E3D,0x7E3E,0x7E3F,
+ 0x7E40,0x7E42,0x7E43,0x7E44,0x7E45,0x7E46,0x7E48,0x7E49,
+ 0x7E4A,0x7E4B,0x7E4C,0x7E4D,0x7E4E,0x7E4F,0x7E50,0x7E51,
+ 0x7E52,0x7E53,0x7E54,0x7E55,0x7E56,0x7E57,0x7E58,0x7E59,
+ 0x7E5A,0x7E5B,0x7E5C,0x7E5D,0x4FCA,0x7AE3,0x6D5A,0x90E1,
+ 0x9A8F,0x5580,0x5496,0x5361,0x54AF,0x5F00,0x63E9,0x6977,
+ 0x51EF,0x6168,0x520A,0x582A,0x52D8,0x574E,0x780D,0x770B,
+ 0x5EB7,0x6177,0x7CE0,0x625B,0x6297,0x4EA2,0x7095,0x8003,
+ 0x62F7,0x70E4,0x9760,0x5777,0x82DB,0x67EF,0x68F5,0x78D5,
+ 0x9897,0x79D1,0x58F3,0x54B3,0x53EF,0x6E34,0x514B,0x523B,
+ 0x5BA2,0x8BFE,0x80AF,0x5543,0x57A6,0x6073,0x5751,0x542D,
+ 0x7A7A,0x6050,0x5B54,0x63A7,0x62A0,0x53E3,0x6263,0x5BC7,
+ 0x67AF,0x54ED,0x7A9F,0x82E6,0x9177,0x5E93,0x88E4,0x5938,
+ 0x57AE,0x630E,0x8DE8,0x80EF,0x5757,0x7B77,0x4FA9,0x5FEB,
+ 0x5BBD,0x6B3E,0x5321,0x7B50,0x72C2,0x6846,0x77FF,0x7736,
+ 0x65F7,0x51B5,0x4E8F,0x76D4,0x5CBF,0x7AA5,0x8475,0x594E,
+ 0x9B41,0x5080,0x7E5E,0x7E5F,0x7E60,0x7E61,0x7E62,0x7E63,
+ 0x7E64,0x7E65,0x7E66,0x7E67,0x7E68,0x7E69,0x7E6A,0x7E6B,
+ 0x7E6C,0x7E6D,0x7E6E,0x7E6F,0x7E70,0x7E71,0x7E72,0x7E73,
+ 0x7E74,0x7E75,0x7E76,0x7E77,0x7E78,0x7E79,0x7E7A,0x7E7B,
+ 0x7E7C,0x7E7D,0x7E7E,0x7E7F,0x7E80,0x7E81,0x7E83,0x7E84,
+ 0x7E85,0x7E86,0x7E87,0x7E88,0x7E89,0x7E8A,0x7E8B,0x7E8C,
+ 0x7E8D,0x7E8E,0x7E8F,0x7E90,0x7E91,0x7E92,0x7E93,0x7E94,
+ 0x7E95,0x7E96,0x7E97,0x7E98,0x7E99,0x7E9A,0x7E9C,0x7E9D,
+ 0x7E9E,0x7EAE,0x7EB4,0x7EBB,0x7EBC,0x7ED6,0x7EE4,0x7EEC,
+ 0x7EF9,0x7F0A,0x7F10,0x7F1E,0x7F37,0x7F39,0x7F3B,0x7F3C,
+ 0x7F3D,0x7F3E,0x7F3F,0x7F40,0x7F41,0x7F43,0x7F46,0x7F47,
+ 0x7F48,0x7F49,0x7F4A,0x7F4B,0x7F4C,0x7F4D,0x7F4E,0x7F4F,
+ 0x7F52,0x7F53,0x9988,0x6127,0x6E83,0x5764,0x6606,0x6346,
+ 0x56F0,0x62EC,0x6269,0x5ED3,0x9614,0x5783,0x62C9,0x5587,
+ 0x8721,0x814A,0x8FA3,0x5566,0x83B1,0x6765,0x8D56,0x84DD,
+ 0x5A6A,0x680F,0x62E6,0x7BEE,0x9611,0x5170,0x6F9C,0x8C30,
+ 0x63FD,0x89C8,0x61D2,0x7F06,0x70C2,0x6EE5,0x7405,0x6994,
+ 0x72FC,0x5ECA,0x90CE,0x6717,0x6D6A,0x635E,0x52B3,0x7262,
+ 0x8001,0x4F6C,0x59E5,0x916A,0x70D9,0x6D9D,0x52D2,0x4E50,
+ 0x96F7,0x956D,0x857E,0x78CA,0x7D2F,0x5121,0x5792,0x64C2,
+ 0x808B,0x7C7B,0x6CEA,0x68F1,0x695E,0x51B7,0x5398,0x68A8,
+ 0x7281,0x9ECE,0x7BF1,0x72F8,0x79BB,0x6F13,0x7406,0x674E,
+ 0x91CC,0x9CA4,0x793C,0x8389,0x8354,0x540F,0x6817,0x4E3D,
+ 0x5389,0x52B1,0x783E,0x5386,0x5229,0x5088,0x4F8B,0x4FD0,
+ 0x7F56,0x7F59,0x7F5B,0x7F5C,0x7F5D,0x7F5E,0x7F60,0x7F63,
+ 0x7F64,0x7F65,0x7F66,0x7F67,0x7F6B,0x7F6C,0x7F6D,0x7F6F,
+ 0x7F70,0x7F73,0x7F75,0x7F76,0x7F77,0x7F78,0x7F7A,0x7F7B,
+ 0x7F7C,0x7F7D,0x7F7F,0x7F80,0x7F82,0x7F83,0x7F84,0x7F85,
+ 0x7F86,0x7F87,0x7F88,0x7F89,0x7F8B,0x7F8D,0x7F8F,0x7F90,
+ 0x7F91,0x7F92,0x7F93,0x7F95,0x7F96,0x7F97,0x7F98,0x7F99,
+ 0x7F9B,0x7F9C,0x7FA0,0x7FA2,0x7FA3,0x7FA5,0x7FA6,0x7FA8,
+ 0x7FA9,0x7FAA,0x7FAB,0x7FAC,0x7FAD,0x7FAE,0x7FB1,0x7FB3,
+ 0x7FB4,0x7FB5,0x7FB6,0x7FB7,0x7FBA,0x7FBB,0x7FBE,0x7FC0,
+ 0x7FC2,0x7FC3,0x7FC4,0x7FC6,0x7FC7,0x7FC8,0x7FC9,0x7FCB,
+ 0x7FCD,0x7FCF,0x7FD0,0x7FD1,0x7FD2,0x7FD3,0x7FD6,0x7FD7,
+ 0x7FD9,0x7FDA,0x7FDB,0x7FDC,0x7FDD,0x7FDE,0x7FE2,0x7FE3,
+ 0x75E2,0x7ACB,0x7C92,0x6CA5,0x96B6,0x529B,0x7483,0x54E9,
+ 0x4FE9,0x8054,0x83B2,0x8FDE,0x9570,0x5EC9,0x601C,0x6D9F,
+ 0x5E18,0x655B,0x8138,0x94FE,0x604B,0x70BC,0x7EC3,0x7CAE,
+ 0x51C9,0x6881,0x7CB1,0x826F,0x4E24,0x8F86,0x91CF,0x667E,
+ 0x4EAE,0x8C05,0x64A9,0x804A,0x50DA,0x7597,0x71CE,0x5BE5,
+ 0x8FBD,0x6F66,0x4E86,0x6482,0x9563,0x5ED6,0x6599,0x5217,
+ 0x88C2,0x70C8,0x52A3,0x730E,0x7433,0x6797,0x78F7,0x9716,
+ 0x4E34,0x90BB,0x9CDE,0x6DCB,0x51DB,0x8D41,0x541D,0x62CE,
+ 0x73B2,0x83F1,0x96F6,0x9F84,0x94C3,0x4F36,0x7F9A,0x51CC,
+ 0x7075,0x9675,0x5CAD,0x9886,0x53E6,0x4EE4,0x6E9C,0x7409,
+ 0x69B4,0x786B,0x998F,0x7559,0x5218,0x7624,0x6D41,0x67F3,
+ 0x516D,0x9F99,0x804B,0x5499,0x7B3C,0x7ABF,0x7FE4,0x7FE7,
+ 0x7FE8,0x7FEA,0x7FEB,0x7FEC,0x7FED,0x7FEF,0x7FF2,0x7FF4,
+ 0x7FF5,0x7FF6,0x7FF7,0x7FF8,0x7FF9,0x7FFA,0x7FFD,0x7FFE,
+ 0x7FFF,0x8002,0x8007,0x8008,0x8009,0x800A,0x800E,0x800F,
+ 0x8011,0x8013,0x801A,0x801B,0x801D,0x801E,0x801F,0x8021,
+ 0x8023,0x8024,0x802B,0x802C,0x802D,0x802E,0x802F,0x8030,
+ 0x8032,0x8034,0x8039,0x803A,0x803C,0x803E,0x8040,0x8041,
+ 0x8044,0x8045,0x8047,0x8048,0x8049,0x804E,0x804F,0x8050,
+ 0x8051,0x8053,0x8055,0x8056,0x8057,0x8059,0x805B,0x805C,
+ 0x805D,0x805E,0x805F,0x8060,0x8061,0x8062,0x8063,0x8064,
+ 0x8065,0x8066,0x8067,0x8068,0x806B,0x806C,0x806D,0x806E,
+ 0x806F,0x8070,0x8072,0x8073,0x8074,0x8075,0x8076,0x8077,
+ 0x8078,0x8079,0x807A,0x807B,0x807C,0x807D,0x9686,0x5784,
+ 0x62E2,0x9647,0x697C,0x5A04,0x6402,0x7BD3,0x6F0F,0x964B,
+ 0x82A6,0x5362,0x9885,0x5E90,0x7089,0x63B3,0x5364,0x864F,
+ 0x9C81,0x9E93,0x788C,0x9732,0x8DEF,0x8D42,0x9E7F,0x6F5E,
+ 0x7984,0x5F55,0x9646,0x622E,0x9A74,0x5415,0x94DD,0x4FA3,
+ 0x65C5,0x5C65,0x5C61,0x7F15,0x8651,0x6C2F,0x5F8B,0x7387,
+ 0x6EE4,0x7EFF,0x5CE6,0x631B,0x5B6A,0x6EE6,0x5375,0x4E71,
+ 0x63A0,0x7565,0x62A1,0x8F6E,0x4F26,0x4ED1,0x6CA6,0x7EB6,
+ 0x8BBA,0x841D,0x87BA,0x7F57,0x903B,0x9523,0x7BA9,0x9AA1,
+ 0x88F8,0x843D,0x6D1B,0x9A86,0x7EDC,0x5988,0x9EBB,0x739B,
+ 0x7801,0x8682,0x9A6C,0x9A82,0x561B,0x5417,0x57CB,0x4E70,
+ 0x9EA6,0x5356,0x8FC8,0x8109,0x7792,0x9992,0x86EE,0x6EE1,
+ 0x8513,0x66FC,0x6162,0x6F2B,0x807E,0x8081,0x8082,0x8085,
+ 0x8088,0x808A,0x808D,0x808E,0x808F,0x8090,0x8091,0x8092,
+ 0x8094,0x8095,0x8097,0x8099,0x809E,0x80A3,0x80A6,0x80A7,
+ 0x80A8,0x80AC,0x80B0,0x80B3,0x80B5,0x80B6,0x80B8,0x80B9,
+ 0x80BB,0x80C5,0x80C7,0x80C8,0x80C9,0x80CA,0x80CB,0x80CF,
+ 0x80D0,0x80D1,0x80D2,0x80D3,0x80D4,0x80D5,0x80D8,0x80DF,
+ 0x80E0,0x80E2,0x80E3,0x80E6,0x80EE,0x80F5,0x80F7,0x80F9,
+ 0x80FB,0x80FE,0x80FF,0x8100,0x8101,0x8103,0x8104,0x8105,
+ 0x8107,0x8108,0x810B,0x810C,0x8115,0x8117,0x8119,0x811B,
+ 0x811C,0x811D,0x811F,0x8120,0x8121,0x8122,0x8123,0x8124,
+ 0x8125,0x8126,0x8127,0x8128,0x8129,0x812A,0x812B,0x812D,
+ 0x812E,0x8130,0x8133,0x8134,0x8135,0x8137,0x8139,0x813A,
+ 0x813B,0x813C,0x813D,0x813F,0x8C29,0x8292,0x832B,0x76F2,
+ 0x6C13,0x5FD9,0x83BD,0x732B,0x8305,0x951A,0x6BDB,0x77DB,
+ 0x94C6,0x536F,0x8302,0x5192,0x5E3D,0x8C8C,0x8D38,0x4E48,
+ 0x73AB,0x679A,0x6885,0x9176,0x9709,0x7164,0x6CA1,0x7709,
+ 0x5A92,0x9541,0x6BCF,0x7F8E,0x6627,0x5BD0,0x59B9,0x5A9A,
+ 0x95E8,0x95F7,0x4EEC,0x840C,0x8499,0x6AAC,0x76DF,0x9530,
+ 0x731B,0x68A6,0x5B5F,0x772F,0x919A,0x9761,0x7CDC,0x8FF7,
+ 0x8C1C,0x5F25,0x7C73,0x79D8,0x89C5,0x6CCC,0x871C,0x5BC6,
+ 0x5E42,0x68C9,0x7720,0x7EF5,0x5195,0x514D,0x52C9,0x5A29,
+ 0x7F05,0x9762,0x82D7,0x63CF,0x7784,0x85D0,0x79D2,0x6E3A,
+ 0x5E99,0x5999,0x8511,0x706D,0x6C11,0x62BF,0x76BF,0x654F,
+ 0x60AF,0x95FD,0x660E,0x879F,0x9E23,0x94ED,0x540D,0x547D,
+ 0x8C2C,0x6478,0x8140,0x8141,0x8142,0x8143,0x8144,0x8145,
+ 0x8147,0x8149,0x814D,0x814E,0x814F,0x8152,0x8156,0x8157,
+ 0x8158,0x815B,0x815C,0x815D,0x815E,0x815F,0x8161,0x8162,
+ 0x8163,0x8164,0x8166,0x8168,0x816A,0x816B,0x816C,0x816F,
+ 0x8172,0x8173,0x8175,0x8176,0x8177,0x8178,0x8181,0x8183,
+ 0x8184,0x8185,0x8186,0x8187,0x8189,0x818B,0x818C,0x818D,
+ 0x818E,0x8190,0x8192,0x8193,0x8194,0x8195,0x8196,0x8197,
+ 0x8199,0x819A,0x819E,0x819F,0x81A0,0x81A1,0x81A2,0x81A4,
+ 0x81A5,0x81A7,0x81A9,0x81AB,0x81AC,0x81AD,0x81AE,0x81AF,
+ 0x81B0,0x81B1,0x81B2,0x81B4,0x81B5,0x81B6,0x81B7,0x81B8,
+ 0x81B9,0x81BC,0x81BD,0x81BE,0x81BF,0x81C4,0x81C5,0x81C7,
+ 0x81C8,0x81C9,0x81CB,0x81CD,0x81CE,0x81CF,0x81D0,0x81D1,
+ 0x81D2,0x81D3,0x6479,0x8611,0x6A21,0x819C,0x78E8,0x6469,
+ 0x9B54,0x62B9,0x672B,0x83AB,0x58A8,0x9ED8,0x6CAB,0x6F20,
+ 0x5BDE,0x964C,0x8C0B,0x725F,0x67D0,0x62C7,0x7261,0x4EA9,
+ 0x59C6,0x6BCD,0x5893,0x66AE,0x5E55,0x52DF,0x6155,0x6728,
+ 0x76EE,0x7766,0x7267,0x7A46,0x62FF,0x54EA,0x5450,0x94A0,
+ 0x90A3,0x5A1C,0x7EB3,0x6C16,0x4E43,0x5976,0x8010,0x5948,
+ 0x5357,0x7537,0x96BE,0x56CA,0x6320,0x8111,0x607C,0x95F9,
+ 0x6DD6,0x5462,0x9981,0x5185,0x5AE9,0x80FD,0x59AE,0x9713,
+ 0x502A,0x6CE5,0x5C3C,0x62DF,0x4F60,0x533F,0x817B,0x9006,
+ 0x6EBA,0x852B,0x62C8,0x5E74,0x78BE,0x64B5,0x637B,0x5FF5,
+ 0x5A18,0x917F,0x9E1F,0x5C3F,0x634F,0x8042,0x5B7D,0x556E,
+ 0x954A,0x954D,0x6D85,0x60A8,0x67E0,0x72DE,0x51DD,0x5B81,
+ 0x81D4,0x81D5,0x81D6,0x81D7,0x81D8,0x81D9,0x81DA,0x81DB,
+ 0x81DC,0x81DD,0x81DE,0x81DF,0x81E0,0x81E1,0x81E2,0x81E4,
+ 0x81E5,0x81E6,0x81E8,0x81E9,0x81EB,0x81EE,0x81EF,0x81F0,
+ 0x81F1,0x81F2,0x81F5,0x81F6,0x81F7,0x81F8,0x81F9,0x81FA,
+ 0x81FD,0x81FF,0x8203,0x8207,0x8208,0x8209,0x820A,0x820B,
+ 0x820E,0x820F,0x8211,0x8213,0x8215,0x8216,0x8217,0x8218,
+ 0x8219,0x821A,0x821D,0x8220,0x8224,0x8225,0x8226,0x8227,
+ 0x8229,0x822E,0x8232,0x823A,0x823C,0x823D,0x823F,0x8240,
+ 0x8241,0x8242,0x8243,0x8245,0x8246,0x8248,0x824A,0x824C,
+ 0x824D,0x824E,0x8250,0x8251,0x8252,0x8253,0x8254,0x8255,
+ 0x8256,0x8257,0x8259,0x825B,0x825C,0x825D,0x825E,0x8260,
+ 0x8261,0x8262,0x8263,0x8264,0x8265,0x8266,0x8267,0x8269,
+ 0x62E7,0x6CDE,0x725B,0x626D,0x94AE,0x7EBD,0x8113,0x6D53,
+ 0x519C,0x5F04,0x5974,0x52AA,0x6012,0x5973,0x6696,0x8650,
+ 0x759F,0x632A,0x61E6,0x7CEF,0x8BFA,0x54E6,0x6B27,0x9E25,
+ 0x6BB4,0x85D5,0x5455,0x5076,0x6CA4,0x556A,0x8DB4,0x722C,
+ 0x5E15,0x6015,0x7436,0x62CD,0x6392,0x724C,0x5F98,0x6E43,
+ 0x6D3E,0x6500,0x6F58,0x76D8,0x78D0,0x76FC,0x7554,0x5224,
+ 0x53DB,0x4E53,0x5E9E,0x65C1,0x802A,0x80D6,0x629B,0x5486,
+ 0x5228,0x70AE,0x888D,0x8DD1,0x6CE1,0x5478,0x80DA,0x57F9,
+ 0x88F4,0x8D54,0x966A,0x914D,0x4F69,0x6C9B,0x55B7,0x76C6,
+ 0x7830,0x62A8,0x70F9,0x6F8E,0x5F6D,0x84EC,0x68DA,0x787C,
+ 0x7BF7,0x81A8,0x670B,0x9E4F,0x6367,0x78B0,0x576F,0x7812,
+ 0x9739,0x6279,0x62AB,0x5288,0x7435,0x6BD7,0x826A,0x826B,
+ 0x826C,0x826D,0x8271,0x8275,0x8276,0x8277,0x8278,0x827B,
+ 0x827C,0x8280,0x8281,0x8283,0x8285,0x8286,0x8287,0x8289,
+ 0x828C,0x8290,0x8293,0x8294,0x8295,0x8296,0x829A,0x829B,
+ 0x829E,0x82A0,0x82A2,0x82A3,0x82A7,0x82B2,0x82B5,0x82B6,
+ 0x82BA,0x82BB,0x82BC,0x82BF,0x82C0,0x82C2,0x82C3,0x82C5,
+ 0x82C6,0x82C9,0x82D0,0x82D6,0x82D9,0x82DA,0x82DD,0x82E2,
+ 0x82E7,0x82E8,0x82E9,0x82EA,0x82EC,0x82ED,0x82EE,0x82F0,
+ 0x82F2,0x82F3,0x82F5,0x82F6,0x82F8,0x82FA,0x82FC,0x82FD,
+ 0x82FE,0x82FF,0x8300,0x830A,0x830B,0x830D,0x8310,0x8312,
+ 0x8313,0x8316,0x8318,0x8319,0x831D,0x831E,0x831F,0x8320,
+ 0x8321,0x8322,0x8323,0x8324,0x8325,0x8326,0x8329,0x832A,
+ 0x832E,0x8330,0x8332,0x8337,0x833B,0x833D,0x5564,0x813E,
+ 0x75B2,0x76AE,0x5339,0x75DE,0x50FB,0x5C41,0x8B6C,0x7BC7,
+ 0x504F,0x7247,0x9A97,0x98D8,0x6F02,0x74E2,0x7968,0x6487,
+ 0x77A5,0x62FC,0x9891,0x8D2B,0x54C1,0x8058,0x4E52,0x576A,
+ 0x82F9,0x840D,0x5E73,0x51ED,0x74F6,0x8BC4,0x5C4F,0x5761,
+ 0x6CFC,0x9887,0x5A46,0x7834,0x9B44,0x8FEB,0x7C95,0x5256,
+ 0x6251,0x94FA,0x4EC6,0x8386,0x8461,0x83E9,0x84B2,0x57D4,
+ 0x6734,0x5703,0x666E,0x6D66,0x8C31,0x66DD,0x7011,0x671F,
+ 0x6B3A,0x6816,0x621A,0x59BB,0x4E03,0x51C4,0x6F06,0x67D2,
+ 0x6C8F,0x5176,0x68CB,0x5947,0x6B67,0x7566,0x5D0E,0x8110,
+ 0x9F50,0x65D7,0x7948,0x7941,0x9A91,0x8D77,0x5C82,0x4E5E,
+ 0x4F01,0x542F,0x5951,0x780C,0x5668,0x6C14,0x8FC4,0x5F03,
+ 0x6C7D,0x6CE3,0x8BAB,0x6390,0x833E,0x833F,0x8341,0x8342,
+ 0x8344,0x8345,0x8348,0x834A,0x834B,0x834C,0x834D,0x834E,
+ 0x8353,0x8355,0x8356,0x8357,0x8358,0x8359,0x835D,0x8362,
+ 0x8370,0x8371,0x8372,0x8373,0x8374,0x8375,0x8376,0x8379,
+ 0x837A,0x837E,0x837F,0x8380,0x8381,0x8382,0x8383,0x8384,
+ 0x8387,0x8388,0x838A,0x838B,0x838C,0x838D,0x838F,0x8390,
+ 0x8391,0x8394,0x8395,0x8396,0x8397,0x8399,0x839A,0x839D,
+ 0x839F,0x83A1,0x83A2,0x83A3,0x83A4,0x83A5,0x83A6,0x83A7,
+ 0x83AC,0x83AD,0x83AE,0x83AF,0x83B5,0x83BB,0x83BE,0x83BF,
+ 0x83C2,0x83C3,0x83C4,0x83C6,0x83C8,0x83C9,0x83CB,0x83CD,
+ 0x83CE,0x83D0,0x83D1,0x83D2,0x83D3,0x83D5,0x83D7,0x83D9,
+ 0x83DA,0x83DB,0x83DE,0x83E2,0x83E3,0x83E4,0x83E6,0x83E7,
+ 0x83E8,0x83EB,0x83EC,0x83ED,0x6070,0x6D3D,0x7275,0x6266,
+ 0x948E,0x94C5,0x5343,0x8FC1,0x7B7E,0x4EDF,0x8C26,0x4E7E,
+ 0x9ED4,0x94B1,0x94B3,0x524D,0x6F5C,0x9063,0x6D45,0x8C34,
+ 0x5811,0x5D4C,0x6B20,0x6B49,0x67AA,0x545B,0x8154,0x7F8C,
+ 0x5899,0x8537,0x5F3A,0x62A2,0x6A47,0x9539,0x6572,0x6084,
+ 0x6865,0x77A7,0x4E54,0x4FA8,0x5DE7,0x9798,0x64AC,0x7FD8,
+ 0x5CED,0x4FCF,0x7A8D,0x5207,0x8304,0x4E14,0x602F,0x7A83,
+ 0x94A6,0x4FB5,0x4EB2,0x79E6,0x7434,0x52E4,0x82B9,0x64D2,
+ 0x79BD,0x5BDD,0x6C81,0x9752,0x8F7B,0x6C22,0x503E,0x537F,
+ 0x6E05,0x64CE,0x6674,0x6C30,0x60C5,0x9877,0x8BF7,0x5E86,
+ 0x743C,0x7A77,0x79CB,0x4E18,0x90B1,0x7403,0x6C42,0x56DA,
+ 0x914B,0x6CC5,0x8D8B,0x533A,0x86C6,0x66F2,0x8EAF,0x5C48,
+ 0x9A71,0x6E20,0x83EE,0x83EF,0x83F3,0x83F4,0x83F5,0x83F6,
+ 0x83F7,0x83FA,0x83FB,0x83FC,0x83FE,0x83FF,0x8400,0x8402,
+ 0x8405,0x8407,0x8408,0x8409,0x840A,0x8410,0x8412,0x8413,
+ 0x8414,0x8415,0x8416,0x8417,0x8419,0x841A,0x841B,0x841E,
+ 0x841F,0x8420,0x8421,0x8422,0x8423,0x8429,0x842A,0x842B,
+ 0x842C,0x842D,0x842E,0x842F,0x8430,0x8432,0x8433,0x8434,
+ 0x8435,0x8436,0x8437,0x8439,0x843A,0x843B,0x843E,0x843F,
+ 0x8440,0x8441,0x8442,0x8443,0x8444,0x8445,0x8447,0x8448,
+ 0x8449,0x844A,0x844B,0x844C,0x844D,0x844E,0x844F,0x8450,
+ 0x8452,0x8453,0x8454,0x8455,0x8456,0x8458,0x845D,0x845E,
+ 0x845F,0x8460,0x8462,0x8464,0x8465,0x8466,0x8467,0x8468,
+ 0x846A,0x846E,0x846F,0x8470,0x8472,0x8474,0x8477,0x8479,
+ 0x847B,0x847C,0x53D6,0x5A36,0x9F8B,0x8DA3,0x53BB,0x5708,
+ 0x98A7,0x6743,0x919B,0x6CC9,0x5168,0x75CA,0x62F3,0x72AC,
+ 0x5238,0x529D,0x7F3A,0x7094,0x7638,0x5374,0x9E4A,0x69B7,
+ 0x786E,0x96C0,0x88D9,0x7FA4,0x7136,0x71C3,0x5189,0x67D3,
+ 0x74E4,0x58E4,0x6518,0x56B7,0x8BA9,0x9976,0x6270,0x7ED5,
+ 0x60F9,0x70ED,0x58EC,0x4EC1,0x4EBA,0x5FCD,0x97E7,0x4EFB,
+ 0x8BA4,0x5203,0x598A,0x7EAB,0x6254,0x4ECD,0x65E5,0x620E,
+ 0x8338,0x84C9,0x8363,0x878D,0x7194,0x6EB6,0x5BB9,0x7ED2,
+ 0x5197,0x63C9,0x67D4,0x8089,0x8339,0x8815,0x5112,0x5B7A,
+ 0x5982,0x8FB1,0x4E73,0x6C5D,0x5165,0x8925,0x8F6F,0x962E,
+ 0x854A,0x745E,0x9510,0x95F0,0x6DA6,0x82E5,0x5F31,0x6492,
+ 0x6D12,0x8428,0x816E,0x9CC3,0x585E,0x8D5B,0x4E09,0x53C1,
+ 0x847D,0x847E,0x847F,0x8480,0x8481,0x8483,0x8484,0x8485,
+ 0x8486,0x848A,0x848D,0x848F,0x8490,0x8491,0x8492,0x8493,
+ 0x8494,0x8495,0x8496,0x8498,0x849A,0x849B,0x849D,0x849E,
+ 0x849F,0x84A0,0x84A2,0x84A3,0x84A4,0x84A5,0x84A6,0x84A7,
+ 0x84A8,0x84A9,0x84AA,0x84AB,0x84AC,0x84AD,0x84AE,0x84B0,
+ 0x84B1,0x84B3,0x84B5,0x84B6,0x84B7,0x84BB,0x84BC,0x84BE,
+ 0x84C0,0x84C2,0x84C3,0x84C5,0x84C6,0x84C7,0x84C8,0x84CB,
+ 0x84CC,0x84CE,0x84CF,0x84D2,0x84D4,0x84D5,0x84D7,0x84D8,
+ 0x84D9,0x84DA,0x84DB,0x84DC,0x84DE,0x84E1,0x84E2,0x84E4,
+ 0x84E7,0x84E8,0x84E9,0x84EA,0x84EB,0x84ED,0x84EE,0x84EF,
+ 0x84F1,0x84F2,0x84F3,0x84F4,0x84F5,0x84F6,0x84F7,0x84F8,
+ 0x84F9,0x84FA,0x84FB,0x84FD,0x84FE,0x8500,0x8501,0x8502,
+ 0x4F1E,0x6563,0x6851,0x55D3,0x4E27,0x6414,0x9A9A,0x626B,
+ 0x5AC2,0x745F,0x8272,0x6DA9,0x68EE,0x50E7,0x838E,0x7802,
+ 0x6740,0x5239,0x6C99,0x7EB1,0x50BB,0x5565,0x715E,0x7B5B,
+ 0x6652,0x73CA,0x82EB,0x6749,0x5C71,0x5220,0x717D,0x886B,
+ 0x95EA,0x9655,0x64C5,0x8D61,0x81B3,0x5584,0x6C55,0x6247,
+ 0x7F2E,0x5892,0x4F24,0x5546,0x8D4F,0x664C,0x4E0A,0x5C1A,
+ 0x88F3,0x68A2,0x634E,0x7A0D,0x70E7,0x828D,0x52FA,0x97F6,
+ 0x5C11,0x54E8,0x90B5,0x7ECD,0x5962,0x8D4A,0x86C7,0x820C,
+ 0x820D,0x8D66,0x6444,0x5C04,0x6151,0x6D89,0x793E,0x8BBE,
+ 0x7837,0x7533,0x547B,0x4F38,0x8EAB,0x6DF1,0x5A20,0x7EC5,
+ 0x795E,0x6C88,0x5BA1,0x5A76,0x751A,0x80BE,0x614E,0x6E17,
+ 0x58F0,0x751F,0x7525,0x7272,0x5347,0x7EF3,0x8503,0x8504,
+ 0x8505,0x8506,0x8507,0x8508,0x8509,0x850A,0x850B,0x850D,
+ 0x850E,0x850F,0x8510,0x8512,0x8514,0x8515,0x8516,0x8518,
+ 0x8519,0x851B,0x851C,0x851D,0x851E,0x8520,0x8522,0x8523,
+ 0x8524,0x8525,0x8526,0x8527,0x8528,0x8529,0x852A,0x852D,
+ 0x852E,0x852F,0x8530,0x8531,0x8532,0x8533,0x8534,0x8535,
+ 0x8536,0x853E,0x853F,0x8540,0x8541,0x8542,0x8544,0x8545,
+ 0x8546,0x8547,0x854B,0x854C,0x854D,0x854E,0x854F,0x8550,
+ 0x8551,0x8552,0x8553,0x8554,0x8555,0x8557,0x8558,0x855A,
+ 0x855B,0x855C,0x855D,0x855F,0x8560,0x8561,0x8562,0x8563,
+ 0x8565,0x8566,0x8567,0x8569,0x856A,0x856B,0x856C,0x856D,
+ 0x856E,0x856F,0x8570,0x8571,0x8573,0x8575,0x8576,0x8577,
+ 0x8578,0x857C,0x857D,0x857F,0x8580,0x8581,0x7701,0x76DB,
+ 0x5269,0x80DC,0x5723,0x5E08,0x5931,0x72EE,0x65BD,0x6E7F,
+ 0x8BD7,0x5C38,0x8671,0x5341,0x77F3,0x62FE,0x65F6,0x4EC0,
+ 0x98DF,0x8680,0x5B9E,0x8BC6,0x53F2,0x77E2,0x4F7F,0x5C4E,
+ 0x9A76,0x59CB,0x5F0F,0x793A,0x58EB,0x4E16,0x67FF,0x4E8B,
+ 0x62ED,0x8A93,0x901D,0x52BF,0x662F,0x55DC,0x566C,0x9002,
+ 0x4ED5,0x4F8D,0x91CA,0x9970,0x6C0F,0x5E02,0x6043,0x5BA4,
+ 0x89C6,0x8BD5,0x6536,0x624B,0x9996,0x5B88,0x5BFF,0x6388,
+ 0x552E,0x53D7,0x7626,0x517D,0x852C,0x67A2,0x68B3,0x6B8A,
+ 0x6292,0x8F93,0x53D4,0x8212,0x6DD1,0x758F,0x4E66,0x8D4E,
+ 0x5B70,0x719F,0x85AF,0x6691,0x66D9,0x7F72,0x8700,0x9ECD,
+ 0x9F20,0x5C5E,0x672F,0x8FF0,0x6811,0x675F,0x620D,0x7AD6,
+ 0x5885,0x5EB6,0x6570,0x6F31,0x8582,0x8583,0x8586,0x8588,
+ 0x8589,0x858A,0x858B,0x858C,0x858D,0x858E,0x8590,0x8591,
+ 0x8592,0x8593,0x8594,0x8595,0x8596,0x8597,0x8598,0x8599,
+ 0x859A,0x859D,0x859E,0x859F,0x85A0,0x85A1,0x85A2,0x85A3,
+ 0x85A5,0x85A6,0x85A7,0x85A9,0x85AB,0x85AC,0x85AD,0x85B1,
+ 0x85B2,0x85B3,0x85B4,0x85B5,0x85B6,0x85B8,0x85BA,0x85BB,
+ 0x85BC,0x85BD,0x85BE,0x85BF,0x85C0,0x85C2,0x85C3,0x85C4,
+ 0x85C5,0x85C6,0x85C7,0x85C8,0x85CA,0x85CB,0x85CC,0x85CD,
+ 0x85CE,0x85D1,0x85D2,0x85D4,0x85D6,0x85D7,0x85D8,0x85D9,
+ 0x85DA,0x85DB,0x85DD,0x85DE,0x85DF,0x85E0,0x85E1,0x85E2,
+ 0x85E3,0x85E5,0x85E6,0x85E7,0x85E8,0x85EA,0x85EB,0x85EC,
+ 0x85ED,0x85EE,0x85EF,0x85F0,0x85F1,0x85F2,0x85F3,0x85F4,
+ 0x85F5,0x85F6,0x85F7,0x85F8,0x6055,0x5237,0x800D,0x6454,
+ 0x8870,0x7529,0x5E05,0x6813,0x62F4,0x971C,0x53CC,0x723D,
+ 0x8C01,0x6C34,0x7761,0x7A0E,0x542E,0x77AC,0x987A,0x821C,
+ 0x8BF4,0x7855,0x6714,0x70C1,0x65AF,0x6495,0x5636,0x601D,
+ 0x79C1,0x53F8,0x4E1D,0x6B7B,0x8086,0x5BFA,0x55E3,0x56DB,
+ 0x4F3A,0x4F3C,0x9972,0x5DF3,0x677E,0x8038,0x6002,0x9882,
+ 0x9001,0x5B8B,0x8BBC,0x8BF5,0x641C,0x8258,0x64DE,0x55FD,
+ 0x82CF,0x9165,0x4FD7,0x7D20,0x901F,0x7C9F,0x50F3,0x5851,
+ 0x6EAF,0x5BBF,0x8BC9,0x8083,0x9178,0x849C,0x7B97,0x867D,
+ 0x968B,0x968F,0x7EE5,0x9AD3,0x788E,0x5C81,0x7A57,0x9042,
+ 0x96A7,0x795F,0x5B59,0x635F,0x7B0B,0x84D1,0x68AD,0x5506,
+ 0x7F29,0x7410,0x7D22,0x9501,0x6240,0x584C,0x4ED6,0x5B83,
+ 0x5979,0x5854,0x85F9,0x85FA,0x85FC,0x85FD,0x85FE,0x8600,
+ 0x8601,0x8602,0x8603,0x8604,0x8606,0x8607,0x8608,0x8609,
+ 0x860A,0x860B,0x860C,0x860D,0x860E,0x860F,0x8610,0x8612,
+ 0x8613,0x8614,0x8615,0x8617,0x8618,0x8619,0x861A,0x861B,
+ 0x861C,0x861D,0x861E,0x861F,0x8620,0x8621,0x8622,0x8623,
+ 0x8624,0x8625,0x8626,0x8628,0x862A,0x862B,0x862C,0x862D,
+ 0x862E,0x862F,0x8630,0x8631,0x8632,0x8633,0x8634,0x8635,
+ 0x8636,0x8637,0x8639,0x863A,0x863B,0x863D,0x863E,0x863F,
+ 0x8640,0x8641,0x8642,0x8643,0x8644,0x8645,0x8646,0x8647,
+ 0x8648,0x8649,0x864A,0x864B,0x864C,0x8652,0x8653,0x8655,
+ 0x8656,0x8657,0x8658,0x8659,0x865B,0x865C,0x865D,0x865F,
+ 0x8660,0x8661,0x8663,0x8664,0x8665,0x8666,0x8667,0x8668,
+ 0x8669,0x866A,0x736D,0x631E,0x8E4B,0x8E0F,0x80CE,0x82D4,
+ 0x62AC,0x53F0,0x6CF0,0x915E,0x592A,0x6001,0x6C70,0x574D,
+ 0x644A,0x8D2A,0x762B,0x6EE9,0x575B,0x6A80,0x75F0,0x6F6D,
+ 0x8C2D,0x8C08,0x5766,0x6BEF,0x8892,0x78B3,0x63A2,0x53F9,
+ 0x70AD,0x6C64,0x5858,0x642A,0x5802,0x68E0,0x819B,0x5510,
+ 0x7CD6,0x5018,0x8EBA,0x6DCC,0x8D9F,0x70EB,0x638F,0x6D9B,
+ 0x6ED4,0x7EE6,0x8404,0x6843,0x9003,0x6DD8,0x9676,0x8BA8,
+ 0x5957,0x7279,0x85E4,0x817E,0x75BC,0x8A8A,0x68AF,0x5254,
+ 0x8E22,0x9511,0x63D0,0x9898,0x8E44,0x557C,0x4F53,0x66FF,
+ 0x568F,0x60D5,0x6D95,0x5243,0x5C49,0x5929,0x6DFB,0x586B,
+ 0x7530,0x751C,0x606C,0x8214,0x8146,0x6311,0x6761,0x8FE2,
+ 0x773A,0x8DF3,0x8D34,0x94C1,0x5E16,0x5385,0x542C,0x70C3,
+ 0x866D,0x866F,0x8670,0x8672,0x8673,0x8674,0x8675,0x8676,
+ 0x8677,0x8678,0x8683,0x8684,0x8685,0x8686,0x8687,0x8688,
+ 0x8689,0x868E,0x868F,0x8690,0x8691,0x8692,0x8694,0x8696,
+ 0x8697,0x8698,0x8699,0x869A,0x869B,0x869E,0x869F,0x86A0,
+ 0x86A1,0x86A2,0x86A5,0x86A6,0x86AB,0x86AD,0x86AE,0x86B2,
+ 0x86B3,0x86B7,0x86B8,0x86B9,0x86BB,0x86BC,0x86BD,0x86BE,
+ 0x86BF,0x86C1,0x86C2,0x86C3,0x86C5,0x86C8,0x86CC,0x86CD,
+ 0x86D2,0x86D3,0x86D5,0x86D6,0x86D7,0x86DA,0x86DC,0x86DD,
+ 0x86E0,0x86E1,0x86E2,0x86E3,0x86E5,0x86E6,0x86E7,0x86E8,
+ 0x86EA,0x86EB,0x86EC,0x86EF,0x86F5,0x86F6,0x86F7,0x86FA,
+ 0x86FB,0x86FC,0x86FD,0x86FF,0x8701,0x8704,0x8705,0x8706,
+ 0x870B,0x870C,0x870E,0x870F,0x8710,0x8711,0x8714,0x8716,
+ 0x6C40,0x5EF7,0x505C,0x4EAD,0x5EAD,0x633A,0x8247,0x901A,
+ 0x6850,0x916E,0x77B3,0x540C,0x94DC,0x5F64,0x7AE5,0x6876,
+ 0x6345,0x7B52,0x7EDF,0x75DB,0x5077,0x6295,0x5934,0x900F,
+ 0x51F8,0x79C3,0x7A81,0x56FE,0x5F92,0x9014,0x6D82,0x5C60,
+ 0x571F,0x5410,0x5154,0x6E4D,0x56E2,0x63A8,0x9893,0x817F,
+ 0x8715,0x892A,0x9000,0x541E,0x5C6F,0x81C0,0x62D6,0x6258,
+ 0x8131,0x9E35,0x9640,0x9A6E,0x9A7C,0x692D,0x59A5,0x62D3,
+ 0x553E,0x6316,0x54C7,0x86D9,0x6D3C,0x5A03,0x74E6,0x889C,
+ 0x6B6A,0x5916,0x8C4C,0x5F2F,0x6E7E,0x73A9,0x987D,0x4E38,
+ 0x70F7,0x5B8C,0x7897,0x633D,0x665A,0x7696,0x60CB,0x5B9B,
+ 0x5A49,0x4E07,0x8155,0x6C6A,0x738B,0x4EA1,0x6789,0x7F51,
+ 0x5F80,0x65FA,0x671B,0x5FD8,0x5984,0x5A01,0x8719,0x871B,
+ 0x871D,0x871F,0x8720,0x8724,0x8726,0x8727,0x8728,0x872A,
+ 0x872B,0x872C,0x872D,0x872F,0x8730,0x8732,0x8733,0x8735,
+ 0x8736,0x8738,0x8739,0x873A,0x873C,0x873D,0x8740,0x8741,
+ 0x8742,0x8743,0x8744,0x8745,0x8746,0x874A,0x874B,0x874D,
+ 0x874F,0x8750,0x8751,0x8752,0x8754,0x8755,0x8756,0x8758,
+ 0x875A,0x875B,0x875C,0x875D,0x875E,0x875F,0x8761,0x8762,
+ 0x8766,0x8767,0x8768,0x8769,0x876A,0x876B,0x876C,0x876D,
+ 0x876F,0x8771,0x8772,0x8773,0x8775,0x8777,0x8778,0x8779,
+ 0x877A,0x877F,0x8780,0x8781,0x8784,0x8786,0x8787,0x8789,
+ 0x878A,0x878C,0x878E,0x878F,0x8790,0x8791,0x8792,0x8794,
+ 0x8795,0x8796,0x8798,0x8799,0x879A,0x879B,0x879C,0x879D,
+ 0x879E,0x87A0,0x87A1,0x87A2,0x87A3,0x87A4,0x5DCD,0x5FAE,
+ 0x5371,0x97E6,0x8FDD,0x6845,0x56F4,0x552F,0x60DF,0x4E3A,
+ 0x6F4D,0x7EF4,0x82C7,0x840E,0x59D4,0x4F1F,0x4F2A,0x5C3E,
+ 0x7EAC,0x672A,0x851A,0x5473,0x754F,0x80C3,0x5582,0x9B4F,
+ 0x4F4D,0x6E2D,0x8C13,0x5C09,0x6170,0x536B,0x761F,0x6E29,
+ 0x868A,0x6587,0x95FB,0x7EB9,0x543B,0x7A33,0x7D0A,0x95EE,
+ 0x55E1,0x7FC1,0x74EE,0x631D,0x8717,0x6DA1,0x7A9D,0x6211,
+ 0x65A1,0x5367,0x63E1,0x6C83,0x5DEB,0x545C,0x94A8,0x4E4C,
+ 0x6C61,0x8BEC,0x5C4B,0x65E0,0x829C,0x68A7,0x543E,0x5434,
+ 0x6BCB,0x6B66,0x4E94,0x6342,0x5348,0x821E,0x4F0D,0x4FAE,
+ 0x575E,0x620A,0x96FE,0x6664,0x7269,0x52FF,0x52A1,0x609F,
+ 0x8BEF,0x6614,0x7199,0x6790,0x897F,0x7852,0x77FD,0x6670,
+ 0x563B,0x5438,0x9521,0x727A,0x87A5,0x87A6,0x87A7,0x87A9,
+ 0x87AA,0x87AE,0x87B0,0x87B1,0x87B2,0x87B4,0x87B6,0x87B7,
+ 0x87B8,0x87B9,0x87BB,0x87BC,0x87BE,0x87BF,0x87C1,0x87C2,
+ 0x87C3,0x87C4,0x87C5,0x87C7,0x87C8,0x87C9,0x87CC,0x87CD,
+ 0x87CE,0x87CF,0x87D0,0x87D4,0x87D5,0x87D6,0x87D7,0x87D8,
+ 0x87D9,0x87DA,0x87DC,0x87DD,0x87DE,0x87DF,0x87E1,0x87E2,
+ 0x87E3,0x87E4,0x87E6,0x87E7,0x87E8,0x87E9,0x87EB,0x87EC,
+ 0x87ED,0x87EF,0x87F0,0x87F1,0x87F2,0x87F3,0x87F4,0x87F5,
+ 0x87F6,0x87F7,0x87F8,0x87FA,0x87FB,0x87FC,0x87FD,0x87FF,
+ 0x8800,0x8801,0x8802,0x8804,0x8805,0x8806,0x8807,0x8808,
+ 0x8809,0x880B,0x880C,0x880D,0x880E,0x880F,0x8810,0x8811,
+ 0x8812,0x8814,0x8817,0x8818,0x8819,0x881A,0x881C,0x881D,
+ 0x881E,0x881F,0x8820,0x8823,0x7A00,0x606F,0x5E0C,0x6089,
+ 0x819D,0x5915,0x60DC,0x7184,0x70EF,0x6EAA,0x6C50,0x7280,
+ 0x6A84,0x88AD,0x5E2D,0x4E60,0x5AB3,0x559C,0x94E3,0x6D17,
+ 0x7CFB,0x9699,0x620F,0x7EC6,0x778E,0x867E,0x5323,0x971E,
+ 0x8F96,0x6687,0x5CE1,0x4FA0,0x72ED,0x4E0B,0x53A6,0x590F,
+ 0x5413,0x6380,0x9528,0x5148,0x4ED9,0x9C9C,0x7EA4,0x54B8,
+ 0x8D24,0x8854,0x8237,0x95F2,0x6D8E,0x5F26,0x5ACC,0x663E,
+ 0x9669,0x73B0,0x732E,0x53BF,0x817A,0x9985,0x7FA1,0x5BAA,
+ 0x9677,0x9650,0x7EBF,0x76F8,0x53A2,0x9576,0x9999,0x7BB1,
+ 0x8944,0x6E58,0x4E61,0x7FD4,0x7965,0x8BE6,0x60F3,0x54CD,
+ 0x4EAB,0x9879,0x5DF7,0x6A61,0x50CF,0x5411,0x8C61,0x8427,
+ 0x785D,0x9704,0x524A,0x54EE,0x56A3,0x9500,0x6D88,0x5BB5,
+ 0x6DC6,0x6653,0x8824,0x8825,0x8826,0x8827,0x8828,0x8829,
+ 0x882A,0x882B,0x882C,0x882D,0x882E,0x882F,0x8830,0x8831,
+ 0x8833,0x8834,0x8835,0x8836,0x8837,0x8838,0x883A,0x883B,
+ 0x883D,0x883E,0x883F,0x8841,0x8842,0x8843,0x8846,0x8847,
+ 0x8848,0x8849,0x884A,0x884B,0x884E,0x884F,0x8850,0x8851,
+ 0x8852,0x8853,0x8855,0x8856,0x8858,0x885A,0x885B,0x885C,
+ 0x885D,0x885E,0x885F,0x8860,0x8866,0x8867,0x886A,0x886D,
+ 0x886F,0x8871,0x8873,0x8874,0x8875,0x8876,0x8878,0x8879,
+ 0x887A,0x887B,0x887C,0x8880,0x8883,0x8886,0x8887,0x8889,
+ 0x888A,0x888C,0x888E,0x888F,0x8890,0x8891,0x8893,0x8894,
+ 0x8895,0x8897,0x8898,0x8899,0x889A,0x889B,0x889D,0x889E,
+ 0x889F,0x88A0,0x88A1,0x88A3,0x88A5,0x88A6,0x88A7,0x88A8,
+ 0x88A9,0x88AA,0x5C0F,0x5B5D,0x6821,0x8096,0x5578,0x7B11,
+ 0x6548,0x6954,0x4E9B,0x6B47,0x874E,0x978B,0x534F,0x631F,
+ 0x643A,0x90AA,0x659C,0x80C1,0x8C10,0x5199,0x68B0,0x5378,
+ 0x87F9,0x61C8,0x6CC4,0x6CFB,0x8C22,0x5C51,0x85AA,0x82AF,
+ 0x950C,0x6B23,0x8F9B,0x65B0,0x5FFB,0x5FC3,0x4FE1,0x8845,
+ 0x661F,0x8165,0x7329,0x60FA,0x5174,0x5211,0x578B,0x5F62,
+ 0x90A2,0x884C,0x9192,0x5E78,0x674F,0x6027,0x59D3,0x5144,
+ 0x51F6,0x80F8,0x5308,0x6C79,0x96C4,0x718A,0x4F11,0x4FEE,
+ 0x7F9E,0x673D,0x55C5,0x9508,0x79C0,0x8896,0x7EE3,0x589F,
+ 0x620C,0x9700,0x865A,0x5618,0x987B,0x5F90,0x8BB8,0x84C4,
+ 0x9157,0x53D9,0x65ED,0x5E8F,0x755C,0x6064,0x7D6E,0x5A7F,
+ 0x7EEA,0x7EED,0x8F69,0x55A7,0x5BA3,0x60AC,0x65CB,0x7384,
+ 0x88AC,0x88AE,0x88AF,0x88B0,0x88B2,0x88B3,0x88B4,0x88B5,
+ 0x88B6,0x88B8,0x88B9,0x88BA,0x88BB,0x88BD,0x88BE,0x88BF,
+ 0x88C0,0x88C3,0x88C4,0x88C7,0x88C8,0x88CA,0x88CB,0x88CC,
+ 0x88CD,0x88CF,0x88D0,0x88D1,0x88D3,0x88D6,0x88D7,0x88DA,
+ 0x88DB,0x88DC,0x88DD,0x88DE,0x88E0,0x88E1,0x88E6,0x88E7,
+ 0x88E9,0x88EA,0x88EB,0x88EC,0x88ED,0x88EE,0x88EF,0x88F2,
+ 0x88F5,0x88F6,0x88F7,0x88FA,0x88FB,0x88FD,0x88FF,0x8900,
+ 0x8901,0x8903,0x8904,0x8905,0x8906,0x8907,0x8908,0x8909,
+ 0x890B,0x890C,0x890D,0x890E,0x890F,0x8911,0x8914,0x8915,
+ 0x8916,0x8917,0x8918,0x891C,0x891D,0x891E,0x891F,0x8920,
+ 0x8922,0x8923,0x8924,0x8926,0x8927,0x8928,0x8929,0x892C,
+ 0x892D,0x892E,0x892F,0x8931,0x8932,0x8933,0x8935,0x8937,
+ 0x9009,0x7663,0x7729,0x7EDA,0x9774,0x859B,0x5B66,0x7A74,
+ 0x96EA,0x8840,0x52CB,0x718F,0x5FAA,0x65EC,0x8BE2,0x5BFB,
+ 0x9A6F,0x5DE1,0x6B89,0x6C5B,0x8BAD,0x8BAF,0x900A,0x8FC5,
+ 0x538B,0x62BC,0x9E26,0x9E2D,0x5440,0x4E2B,0x82BD,0x7259,
+ 0x869C,0x5D16,0x8859,0x6DAF,0x96C5,0x54D1,0x4E9A,0x8BB6,
+ 0x7109,0x54BD,0x9609,0x70DF,0x6DF9,0x76D0,0x4E25,0x7814,
+ 0x8712,0x5CA9,0x5EF6,0x8A00,0x989C,0x960E,0x708E,0x6CBF,
+ 0x5944,0x63A9,0x773C,0x884D,0x6F14,0x8273,0x5830,0x71D5,
+ 0x538C,0x781A,0x96C1,0x5501,0x5F66,0x7130,0x5BB4,0x8C1A,
+ 0x9A8C,0x6B83,0x592E,0x9E2F,0x79E7,0x6768,0x626C,0x4F6F,
+ 0x75A1,0x7F8A,0x6D0B,0x9633,0x6C27,0x4EF0,0x75D2,0x517B,
+ 0x6837,0x6F3E,0x9080,0x8170,0x5996,0x7476,0x8938,0x8939,
+ 0x893A,0x893B,0x893C,0x893D,0x893E,0x893F,0x8940,0x8942,
+ 0x8943,0x8945,0x8946,0x8947,0x8948,0x8949,0x894A,0x894B,
+ 0x894C,0x894D,0x894E,0x894F,0x8950,0x8951,0x8952,0x8953,
+ 0x8954,0x8955,0x8956,0x8957,0x8958,0x8959,0x895A,0x895B,
+ 0x895C,0x895D,0x8960,0x8961,0x8962,0x8963,0x8964,0x8965,
+ 0x8967,0x8968,0x8969,0x896A,0x896B,0x896C,0x896D,0x896E,
+ 0x896F,0x8970,0x8971,0x8972,0x8973,0x8974,0x8975,0x8976,
+ 0x8977,0x8978,0x8979,0x897A,0x897C,0x897D,0x897E,0x8980,
+ 0x8982,0x8984,0x8985,0x8987,0x8988,0x8989,0x898A,0x898B,
+ 0x898C,0x898D,0x898E,0x898F,0x8990,0x8991,0x8992,0x8993,
+ 0x8994,0x8995,0x8996,0x8997,0x8998,0x8999,0x899A,0x899B,
+ 0x899C,0x899D,0x899E,0x899F,0x89A0,0x89A1,0x6447,0x5C27,
+ 0x9065,0x7A91,0x8C23,0x59DA,0x54AC,0x8200,0x836F,0x8981,
+ 0x8000,0x6930,0x564E,0x8036,0x7237,0x91CE,0x51B6,0x4E5F,
+ 0x9875,0x6396,0x4E1A,0x53F6,0x66F3,0x814B,0x591C,0x6DB2,
+ 0x4E00,0x58F9,0x533B,0x63D6,0x94F1,0x4F9D,0x4F0A,0x8863,
+ 0x9890,0x5937,0x9057,0x79FB,0x4EEA,0x80F0,0x7591,0x6C82,
+ 0x5B9C,0x59E8,0x5F5D,0x6905,0x8681,0x501A,0x5DF2,0x4E59,
+ 0x77E3,0x4EE5,0x827A,0x6291,0x6613,0x9091,0x5C79,0x4EBF,
+ 0x5F79,0x81C6,0x9038,0x8084,0x75AB,0x4EA6,0x88D4,0x610F,
+ 0x6BC5,0x5FC6,0x4E49,0x76CA,0x6EA2,0x8BE3,0x8BAE,0x8C0A,
+ 0x8BD1,0x5F02,0x7FFC,0x7FCC,0x7ECE,0x8335,0x836B,0x56E0,
+ 0x6BB7,0x97F3,0x9634,0x59FB,0x541F,0x94F6,0x6DEB,0x5BC5,
+ 0x996E,0x5C39,0x5F15,0x9690,0x89A2,0x89A3,0x89A4,0x89A5,
+ 0x89A6,0x89A7,0x89A8,0x89A9,0x89AA,0x89AB,0x89AC,0x89AD,
+ 0x89AE,0x89AF,0x89B0,0x89B1,0x89B2,0x89B3,0x89B4,0x89B5,
+ 0x89B6,0x89B7,0x89B8,0x89B9,0x89BA,0x89BB,0x89BC,0x89BD,
+ 0x89BE,0x89BF,0x89C0,0x89C3,0x89CD,0x89D3,0x89D4,0x89D5,
+ 0x89D7,0x89D8,0x89D9,0x89DB,0x89DD,0x89DF,0x89E0,0x89E1,
+ 0x89E2,0x89E4,0x89E7,0x89E8,0x89E9,0x89EA,0x89EC,0x89ED,
+ 0x89EE,0x89F0,0x89F1,0x89F2,0x89F4,0x89F5,0x89F6,0x89F7,
+ 0x89F8,0x89F9,0x89FA,0x89FB,0x89FC,0x89FD,0x89FE,0x89FF,
+ 0x8A01,0x8A02,0x8A03,0x8A04,0x8A05,0x8A06,0x8A08,0x8A09,
+ 0x8A0A,0x8A0B,0x8A0C,0x8A0D,0x8A0E,0x8A0F,0x8A10,0x8A11,
+ 0x8A12,0x8A13,0x8A14,0x8A15,0x8A16,0x8A17,0x8A18,0x8A19,
+ 0x8A1A,0x8A1B,0x8A1C,0x8A1D,0x5370,0x82F1,0x6A31,0x5A74,
+ 0x9E70,0x5E94,0x7F28,0x83B9,0x8424,0x8425,0x8367,0x8747,
+ 0x8FCE,0x8D62,0x76C8,0x5F71,0x9896,0x786C,0x6620,0x54DF,
+ 0x62E5,0x4F63,0x81C3,0x75C8,0x5EB8,0x96CD,0x8E0A,0x86F9,
+ 0x548F,0x6CF3,0x6D8C,0x6C38,0x607F,0x52C7,0x7528,0x5E7D,
+ 0x4F18,0x60A0,0x5FE7,0x5C24,0x7531,0x90AE,0x94C0,0x72B9,
+ 0x6CB9,0x6E38,0x9149,0x6709,0x53CB,0x53F3,0x4F51,0x91C9,
+ 0x8BF1,0x53C8,0x5E7C,0x8FC2,0x6DE4,0x4E8E,0x76C2,0x6986,
+ 0x865E,0x611A,0x8206,0x4F59,0x4FDE,0x903E,0x9C7C,0x6109,
+ 0x6E1D,0x6E14,0x9685,0x4E88,0x5A31,0x96E8,0x4E0E,0x5C7F,
+ 0x79B9,0x5B87,0x8BED,0x7FBD,0x7389,0x57DF,0x828B,0x90C1,
+ 0x5401,0x9047,0x55BB,0x5CEA,0x5FA1,0x6108,0x6B32,0x72F1,
+ 0x80B2,0x8A89,0x8A1E,0x8A1F,0x8A20,0x8A21,0x8A22,0x8A23,
+ 0x8A24,0x8A25,0x8A26,0x8A27,0x8A28,0x8A29,0x8A2A,0x8A2B,
+ 0x8A2C,0x8A2D,0x8A2E,0x8A2F,0x8A30,0x8A31,0x8A32,0x8A33,
+ 0x8A34,0x8A35,0x8A36,0x8A37,0x8A38,0x8A39,0x8A3A,0x8A3B,
+ 0x8A3C,0x8A3D,0x8A3F,0x8A40,0x8A41,0x8A42,0x8A43,0x8A44,
+ 0x8A45,0x8A46,0x8A47,0x8A49,0x8A4A,0x8A4B,0x8A4C,0x8A4D,
+ 0x8A4E,0x8A4F,0x8A50,0x8A51,0x8A52,0x8A53,0x8A54,0x8A55,
+ 0x8A56,0x8A57,0x8A58,0x8A59,0x8A5A,0x8A5B,0x8A5C,0x8A5D,
+ 0x8A5E,0x8A5F,0x8A60,0x8A61,0x8A62,0x8A63,0x8A64,0x8A65,
+ 0x8A66,0x8A67,0x8A68,0x8A69,0x8A6A,0x8A6B,0x8A6C,0x8A6D,
+ 0x8A6E,0x8A6F,0x8A70,0x8A71,0x8A72,0x8A73,0x8A74,0x8A75,
+ 0x8A76,0x8A77,0x8A78,0x8A7A,0x8A7B,0x8A7C,0x8A7D,0x8A7E,
+ 0x8A7F,0x8A80,0x6D74,0x5BD3,0x88D5,0x9884,0x8C6B,0x9A6D,
+ 0x9E33,0x6E0A,0x51A4,0x5143,0x57A3,0x8881,0x539F,0x63F4,
+ 0x8F95,0x56ED,0x5458,0x5706,0x733F,0x6E90,0x7F18,0x8FDC,
+ 0x82D1,0x613F,0x6028,0x9662,0x66F0,0x7EA6,0x8D8A,0x8DC3,
+ 0x94A5,0x5CB3,0x7CA4,0x6708,0x60A6,0x9605,0x8018,0x4E91,
+ 0x90E7,0x5300,0x9668,0x5141,0x8FD0,0x8574,0x915D,0x6655,
+ 0x97F5,0x5B55,0x531D,0x7838,0x6742,0x683D,0x54C9,0x707E,
+ 0x5BB0,0x8F7D,0x518D,0x5728,0x54B1,0x6512,0x6682,0x8D5E,
+ 0x8D43,0x810F,0x846C,0x906D,0x7CDF,0x51FF,0x85FB,0x67A3,
+ 0x65E9,0x6FA1,0x86A4,0x8E81,0x566A,0x9020,0x7682,0x7076,
+ 0x71E5,0x8D23,0x62E9,0x5219,0x6CFD,0x8D3C,0x600E,0x589E,
+ 0x618E,0x66FE,0x8D60,0x624E,0x55B3,0x6E23,0x672D,0x8F67,
+ 0x8A81,0x8A82,0x8A83,0x8A84,0x8A85,0x8A86,0x8A87,0x8A88,
+ 0x8A8B,0x8A8C,0x8A8D,0x8A8E,0x8A8F,0x8A90,0x8A91,0x8A92,
+ 0x8A94,0x8A95,0x8A96,0x8A97,0x8A98,0x8A99,0x8A9A,0x8A9B,
+ 0x8A9C,0x8A9D,0x8A9E,0x8A9F,0x8AA0,0x8AA1,0x8AA2,0x8AA3,
+ 0x8AA4,0x8AA5,0x8AA6,0x8AA7,0x8AA8,0x8AA9,0x8AAA,0x8AAB,
+ 0x8AAC,0x8AAD,0x8AAE,0x8AAF,0x8AB0,0x8AB1,0x8AB2,0x8AB3,
+ 0x8AB4,0x8AB5,0x8AB6,0x8AB7,0x8AB8,0x8AB9,0x8ABA,0x8ABB,
+ 0x8ABC,0x8ABD,0x8ABE,0x8ABF,0x8AC0,0x8AC1,0x8AC2,0x8AC3,
+ 0x8AC4,0x8AC5,0x8AC6,0x8AC7,0x8AC8,0x8AC9,0x8ACA,0x8ACB,
+ 0x8ACC,0x8ACD,0x8ACE,0x8ACF,0x8AD0,0x8AD1,0x8AD2,0x8AD3,
+ 0x8AD4,0x8AD5,0x8AD6,0x8AD7,0x8AD8,0x8AD9,0x8ADA,0x8ADB,
+ 0x8ADC,0x8ADD,0x8ADE,0x8ADF,0x8AE0,0x8AE1,0x8AE2,0x8AE3,
+ 0x94E1,0x95F8,0x7728,0x6805,0x69A8,0x548B,0x4E4D,0x70B8,
+ 0x8BC8,0x6458,0x658B,0x5B85,0x7A84,0x503A,0x5BE8,0x77BB,
+ 0x6BE1,0x8A79,0x7C98,0x6CBE,0x76CF,0x65A9,0x8F97,0x5D2D,
+ 0x5C55,0x8638,0x6808,0x5360,0x6218,0x7AD9,0x6E5B,0x7EFD,
+ 0x6A1F,0x7AE0,0x5F70,0x6F33,0x5F20,0x638C,0x6DA8,0x6756,
+ 0x4E08,0x5E10,0x8D26,0x4ED7,0x80C0,0x7634,0x969C,0x62DB,
+ 0x662D,0x627E,0x6CBC,0x8D75,0x7167,0x7F69,0x5146,0x8087,
+ 0x53EC,0x906E,0x6298,0x54F2,0x86F0,0x8F99,0x8005,0x9517,
+ 0x8517,0x8FD9,0x6D59,0x73CD,0x659F,0x771F,0x7504,0x7827,
+ 0x81FB,0x8D1E,0x9488,0x4FA6,0x6795,0x75B9,0x8BCA,0x9707,
+ 0x632F,0x9547,0x9635,0x84B8,0x6323,0x7741,0x5F81,0x72F0,
+ 0x4E89,0x6014,0x6574,0x62EF,0x6B63,0x653F,0x8AE4,0x8AE5,
+ 0x8AE6,0x8AE7,0x8AE8,0x8AE9,0x8AEA,0x8AEB,0x8AEC,0x8AED,
+ 0x8AEE,0x8AEF,0x8AF0,0x8AF1,0x8AF2,0x8AF3,0x8AF4,0x8AF5,
+ 0x8AF6,0x8AF7,0x8AF8,0x8AF9,0x8AFA,0x8AFB,0x8AFC,0x8AFD,
+ 0x8AFE,0x8AFF,0x8B00,0x8B01,0x8B02,0x8B03,0x8B04,0x8B05,
+ 0x8B06,0x8B08,0x8B09,0x8B0A,0x8B0B,0x8B0C,0x8B0D,0x8B0E,
+ 0x8B0F,0x8B10,0x8B11,0x8B12,0x8B13,0x8B14,0x8B15,0x8B16,
+ 0x8B17,0x8B18,0x8B19,0x8B1A,0x8B1B,0x8B1C,0x8B1D,0x8B1E,
+ 0x8B1F,0x8B20,0x8B21,0x8B22,0x8B23,0x8B24,0x8B25,0x8B27,
+ 0x8B28,0x8B29,0x8B2A,0x8B2B,0x8B2C,0x8B2D,0x8B2E,0x8B2F,
+ 0x8B30,0x8B31,0x8B32,0x8B33,0x8B34,0x8B35,0x8B36,0x8B37,
+ 0x8B38,0x8B39,0x8B3A,0x8B3B,0x8B3C,0x8B3D,0x8B3E,0x8B3F,
+ 0x8B40,0x8B41,0x8B42,0x8B43,0x8B44,0x8B45,0x5E27,0x75C7,
+ 0x90D1,0x8BC1,0x829D,0x679D,0x652F,0x5431,0x8718,0x77E5,
+ 0x80A2,0x8102,0x6C41,0x4E4B,0x7EC7,0x804C,0x76F4,0x690D,
+ 0x6B96,0x6267,0x503C,0x4F84,0x5740,0x6307,0x6B62,0x8DBE,
+ 0x53EA,0x65E8,0x7EB8,0x5FD7,0x631A,0x63B7,0x81F3,0x81F4,
+ 0x7F6E,0x5E1C,0x5CD9,0x5236,0x667A,0x79E9,0x7A1A,0x8D28,
+ 0x7099,0x75D4,0x6EDE,0x6CBB,0x7A92,0x4E2D,0x76C5,0x5FE0,
+ 0x949F,0x8877,0x7EC8,0x79CD,0x80BF,0x91CD,0x4EF2,0x4F17,
+ 0x821F,0x5468,0x5DDE,0x6D32,0x8BCC,0x7CA5,0x8F74,0x8098,
+ 0x5E1A,0x5492,0x76B1,0x5B99,0x663C,0x9AA4,0x73E0,0x682A,
+ 0x86DB,0x6731,0x732A,0x8BF8,0x8BDB,0x9010,0x7AF9,0x70DB,
+ 0x716E,0x62C4,0x77A9,0x5631,0x4E3B,0x8457,0x67F1,0x52A9,
+ 0x86C0,0x8D2E,0x94F8,0x7B51,0x8B46,0x8B47,0x8B48,0x8B49,
+ 0x8B4A,0x8B4B,0x8B4C,0x8B4D,0x8B4E,0x8B4F,0x8B50,0x8B51,
+ 0x8B52,0x8B53,0x8B54,0x8B55,0x8B56,0x8B57,0x8B58,0x8B59,
+ 0x8B5A,0x8B5B,0x8B5C,0x8B5D,0x8B5E,0x8B5F,0x8B60,0x8B61,
+ 0x8B62,0x8B63,0x8B64,0x8B65,0x8B67,0x8B68,0x8B69,0x8B6A,
+ 0x8B6B,0x8B6D,0x8B6E,0x8B6F,0x8B70,0x8B71,0x8B72,0x8B73,
+ 0x8B74,0x8B75,0x8B76,0x8B77,0x8B78,0x8B79,0x8B7A,0x8B7B,
+ 0x8B7C,0x8B7D,0x8B7E,0x8B7F,0x8B80,0x8B81,0x8B82,0x8B83,
+ 0x8B84,0x8B85,0x8B86,0x8B87,0x8B88,0x8B89,0x8B8A,0x8B8B,
+ 0x8B8C,0x8B8D,0x8B8E,0x8B8F,0x8B90,0x8B91,0x8B92,0x8B93,
+ 0x8B94,0x8B95,0x8B96,0x8B97,0x8B98,0x8B99,0x8B9A,0x8B9B,
+ 0x8B9C,0x8B9D,0x8B9E,0x8B9F,0x8BAC,0x8BB1,0x8BBB,0x8BC7,
+ 0x8BD0,0x8BEA,0x8C09,0x8C1E,0x4F4F,0x6CE8,0x795D,0x9A7B,
+ 0x6293,0x722A,0x62FD,0x4E13,0x7816,0x8F6C,0x64B0,0x8D5A,
+ 0x7BC6,0x6869,0x5E84,0x88C5,0x5986,0x649E,0x58EE,0x72B6,
+ 0x690E,0x9525,0x8FFD,0x8D58,0x5760,0x7F00,0x8C06,0x51C6,
+ 0x6349,0x62D9,0x5353,0x684C,0x7422,0x8301,0x914C,0x5544,
+ 0x7740,0x707C,0x6D4A,0x5179,0x54A8,0x8D44,0x59FF,0x6ECB,
+ 0x6DC4,0x5B5C,0x7D2B,0x4ED4,0x7C7D,0x6ED3,0x5B50,0x81EA,
+ 0x6E0D,0x5B57,0x9B03,0x68D5,0x8E2A,0x5B97,0x7EFC,0x603B,
+ 0x7EB5,0x90B9,0x8D70,0x594F,0x63CD,0x79DF,0x8DB3,0x5352,
+ 0x65CF,0x7956,0x8BC5,0x963B,0x7EC4,0x94BB,0x7E82,0x5634,
+ 0x9189,0x6700,0x7F6A,0x5C0A,0x9075,0x6628,0x5DE6,0x4F50,
+ 0x67DE,0x505A,0x4F5C,0x5750,0x5EA7,0xE810,0xE811,0xE812,
+ 0xE813,0xE814,0x8C38,0x8C39,0x8C3A,0x8C3B,0x8C3C,0x8C3D,
+ 0x8C3E,0x8C3F,0x8C40,0x8C42,0x8C43,0x8C44,0x8C45,0x8C48,
+ 0x8C4A,0x8C4B,0x8C4D,0x8C4E,0x8C4F,0x8C50,0x8C51,0x8C52,
+ 0x8C53,0x8C54,0x8C56,0x8C57,0x8C58,0x8C59,0x8C5B,0x8C5C,
+ 0x8C5D,0x8C5E,0x8C5F,0x8C60,0x8C63,0x8C64,0x8C65,0x8C66,
+ 0x8C67,0x8C68,0x8C69,0x8C6C,0x8C6D,0x8C6E,0x8C6F,0x8C70,
+ 0x8C71,0x8C72,0x8C74,0x8C75,0x8C76,0x8C77,0x8C7B,0x8C7C,
+ 0x8C7D,0x8C7E,0x8C7F,0x8C80,0x8C81,0x8C83,0x8C84,0x8C86,
+ 0x8C87,0x8C88,0x8C8B,0x8C8D,0x8C8E,0x8C8F,0x8C90,0x8C91,
+ 0x8C92,0x8C93,0x8C95,0x8C96,0x8C97,0x8C99,0x8C9A,0x8C9B,
+ 0x8C9C,0x8C9D,0x8C9E,0x8C9F,0x8CA0,0x8CA1,0x8CA2,0x8CA3,
+ 0x8CA4,0x8CA5,0x8CA6,0x8CA7,0x8CA8,0x8CA9,0x8CAA,0x8CAB,
+ 0x8CAC,0x8CAD,0x4E8D,0x4E0C,0x5140,0x4E10,0x5EFF,0x5345,
+ 0x4E15,0x4E98,0x4E1E,0x9B32,0x5B6C,0x5669,0x4E28,0x79BA,
+ 0x4E3F,0x5315,0x4E47,0x592D,0x723B,0x536E,0x6C10,0x56DF,
+ 0x80E4,0x9997,0x6BD3,0x777E,0x9F17,0x4E36,0x4E9F,0x9F10,
+ 0x4E5C,0x4E69,0x4E93,0x8288,0x5B5B,0x556C,0x560F,0x4EC4,
+ 0x538D,0x539D,0x53A3,0x53A5,0x53AE,0x9765,0x8D5D,0x531A,
+ 0x53F5,0x5326,0x532E,0x533E,0x8D5C,0x5366,0x5363,0x5202,
+ 0x5208,0x520E,0x522D,0x5233,0x523F,0x5240,0x524C,0x525E,
+ 0x5261,0x525C,0x84AF,0x527D,0x5282,0x5281,0x5290,0x5293,
+ 0x5182,0x7F54,0x4EBB,0x4EC3,0x4EC9,0x4EC2,0x4EE8,0x4EE1,
+ 0x4EEB,0x4EDE,0x4F1B,0x4EF3,0x4F22,0x4F64,0x4EF5,0x4F25,
+ 0x4F27,0x4F09,0x4F2B,0x4F5E,0x4F67,0x6538,0x4F5A,0x4F5D,
+ 0x8CAE,0x8CAF,0x8CB0,0x8CB1,0x8CB2,0x8CB3,0x8CB4,0x8CB5,
+ 0x8CB6,0x8CB7,0x8CB8,0x8CB9,0x8CBA,0x8CBB,0x8CBC,0x8CBD,
+ 0x8CBE,0x8CBF,0x8CC0,0x8CC1,0x8CC2,0x8CC3,0x8CC4,0x8CC5,
+ 0x8CC6,0x8CC7,0x8CC8,0x8CC9,0x8CCA,0x8CCB,0x8CCC,0x8CCD,
+ 0x8CCE,0x8CCF,0x8CD0,0x8CD1,0x8CD2,0x8CD3,0x8CD4,0x8CD5,
+ 0x8CD6,0x8CD7,0x8CD8,0x8CD9,0x8CDA,0x8CDB,0x8CDC,0x8CDD,
+ 0x8CDE,0x8CDF,0x8CE0,0x8CE1,0x8CE2,0x8CE3,0x8CE4,0x8CE5,
+ 0x8CE6,0x8CE7,0x8CE8,0x8CE9,0x8CEA,0x8CEB,0x8CEC,0x8CED,
+ 0x8CEE,0x8CEF,0x8CF0,0x8CF1,0x8CF2,0x8CF3,0x8CF4,0x8CF5,
+ 0x8CF6,0x8CF7,0x8CF8,0x8CF9,0x8CFA,0x8CFB,0x8CFC,0x8CFD,
+ 0x8CFE,0x8CFF,0x8D00,0x8D01,0x8D02,0x8D03,0x8D04,0x8D05,
+ 0x8D06,0x8D07,0x8D08,0x8D09,0x8D0A,0x8D0B,0x8D0C,0x8D0D,
+ 0x4F5F,0x4F57,0x4F32,0x4F3D,0x4F76,0x4F74,0x4F91,0x4F89,
+ 0x4F83,0x4F8F,0x4F7E,0x4F7B,0x4FAA,0x4F7C,0x4FAC,0x4F94,
+ 0x4FE6,0x4FE8,0x4FEA,0x4FC5,0x4FDA,0x4FE3,0x4FDC,0x4FD1,
+ 0x4FDF,0x4FF8,0x5029,0x504C,0x4FF3,0x502C,0x500F,0x502E,
+ 0x502D,0x4FFE,0x501C,0x500C,0x5025,0x5028,0x507E,0x5043,
+ 0x5055,0x5048,0x504E,0x506C,0x507B,0x50A5,0x50A7,0x50A9,
+ 0x50BA,0x50D6,0x5106,0x50ED,0x50EC,0x50E6,0x50EE,0x5107,
+ 0x510B,0x4EDD,0x6C3D,0x4F58,0x4F65,0x4FCE,0x9FA0,0x6C46,
+ 0x7C74,0x516E,0x5DFD,0x9EC9,0x9998,0x5181,0x5914,0x52F9,
+ 0x530D,0x8A07,0x5310,0x51EB,0x5919,0x5155,0x4EA0,0x5156,
+ 0x4EB3,0x886E,0x88A4,0x4EB5,0x8114,0x88D2,0x7980,0x5B34,
+ 0x8803,0x7FB8,0x51AB,0x51B1,0x51BD,0x51BC,0x8D0E,0x8D0F,
+ 0x8D10,0x8D11,0x8D12,0x8D13,0x8D14,0x8D15,0x8D16,0x8D17,
+ 0x8D18,0x8D19,0x8D1A,0x8D1B,0x8D1C,0x8D20,0x8D51,0x8D52,
+ 0x8D57,0x8D5F,0x8D65,0x8D68,0x8D69,0x8D6A,0x8D6C,0x8D6E,
+ 0x8D6F,0x8D71,0x8D72,0x8D78,0x8D79,0x8D7A,0x8D7B,0x8D7C,
+ 0x8D7D,0x8D7E,0x8D7F,0x8D80,0x8D82,0x8D83,0x8D86,0x8D87,
+ 0x8D88,0x8D89,0x8D8C,0x8D8D,0x8D8E,0x8D8F,0x8D90,0x8D92,
+ 0x8D93,0x8D95,0x8D96,0x8D97,0x8D98,0x8D99,0x8D9A,0x8D9B,
+ 0x8D9C,0x8D9D,0x8D9E,0x8DA0,0x8DA1,0x8DA2,0x8DA4,0x8DA5,
+ 0x8DA6,0x8DA7,0x8DA8,0x8DA9,0x8DAA,0x8DAB,0x8DAC,0x8DAD,
+ 0x8DAE,0x8DAF,0x8DB0,0x8DB2,0x8DB6,0x8DB7,0x8DB9,0x8DBB,
+ 0x8DBD,0x8DC0,0x8DC1,0x8DC2,0x8DC5,0x8DC7,0x8DC8,0x8DC9,
+ 0x8DCA,0x8DCD,0x8DD0,0x8DD2,0x8DD3,0x8DD4,0x51C7,0x5196,
+ 0x51A2,0x51A5,0x8BA0,0x8BA6,0x8BA7,0x8BAA,0x8BB4,0x8BB5,
+ 0x8BB7,0x8BC2,0x8BC3,0x8BCB,0x8BCF,0x8BCE,0x8BD2,0x8BD3,
+ 0x8BD4,0x8BD6,0x8BD8,0x8BD9,0x8BDC,0x8BDF,0x8BE0,0x8BE4,
+ 0x8BE8,0x8BE9,0x8BEE,0x8BF0,0x8BF3,0x8BF6,0x8BF9,0x8BFC,
+ 0x8BFF,0x8C00,0x8C02,0x8C04,0x8C07,0x8C0C,0x8C0F,0x8C11,
+ 0x8C12,0x8C14,0x8C15,0x8C16,0x8C19,0x8C1B,0x8C18,0x8C1D,
+ 0x8C1F,0x8C20,0x8C21,0x8C25,0x8C27,0x8C2A,0x8C2B,0x8C2E,
+ 0x8C2F,0x8C32,0x8C33,0x8C35,0x8C36,0x5369,0x537A,0x961D,
+ 0x9622,0x9621,0x9631,0x962A,0x963D,0x963C,0x9642,0x9649,
+ 0x9654,0x965F,0x9667,0x966C,0x9672,0x9674,0x9688,0x968D,
+ 0x9697,0x96B0,0x9097,0x909B,0x909D,0x9099,0x90AC,0x90A1,
+ 0x90B4,0x90B3,0x90B6,0x90BA,0x8DD5,0x8DD8,0x8DD9,0x8DDC,
+ 0x8DE0,0x8DE1,0x8DE2,0x8DE5,0x8DE6,0x8DE7,0x8DE9,0x8DED,
+ 0x8DEE,0x8DF0,0x8DF1,0x8DF2,0x8DF4,0x8DF6,0x8DFC,0x8DFE,
+ 0x8DFF,0x8E00,0x8E01,0x8E02,0x8E03,0x8E04,0x8E06,0x8E07,
+ 0x8E08,0x8E0B,0x8E0D,0x8E0E,0x8E10,0x8E11,0x8E12,0x8E13,
+ 0x8E15,0x8E16,0x8E17,0x8E18,0x8E19,0x8E1A,0x8E1B,0x8E1C,
+ 0x8E20,0x8E21,0x8E24,0x8E25,0x8E26,0x8E27,0x8E28,0x8E2B,
+ 0x8E2D,0x8E30,0x8E32,0x8E33,0x8E34,0x8E36,0x8E37,0x8E38,
+ 0x8E3B,0x8E3C,0x8E3E,0x8E3F,0x8E43,0x8E45,0x8E46,0x8E4C,
+ 0x8E4D,0x8E4E,0x8E4F,0x8E50,0x8E53,0x8E54,0x8E55,0x8E56,
+ 0x8E57,0x8E58,0x8E5A,0x8E5B,0x8E5C,0x8E5D,0x8E5E,0x8E5F,
+ 0x8E60,0x8E61,0x8E62,0x8E63,0x8E64,0x8E65,0x8E67,0x8E68,
+ 0x8E6A,0x8E6B,0x8E6E,0x8E71,0x90B8,0x90B0,0x90CF,0x90C5,
+ 0x90BE,0x90D0,0x90C4,0x90C7,0x90D3,0x90E6,0x90E2,0x90DC,
+ 0x90D7,0x90DB,0x90EB,0x90EF,0x90FE,0x9104,0x9122,0x911E,
+ 0x9123,0x9131,0x912F,0x9139,0x9143,0x9146,0x520D,0x5942,
+ 0x52A2,0x52AC,0x52AD,0x52BE,0x54FF,0x52D0,0x52D6,0x52F0,
+ 0x53DF,0x71EE,0x77CD,0x5EF4,0x51F5,0x51FC,0x9B2F,0x53B6,
+ 0x5F01,0x755A,0x5DEF,0x574C,0x57A9,0x57A1,0x587E,0x58BC,
+ 0x58C5,0x58D1,0x5729,0x572C,0x572A,0x5733,0x5739,0x572E,
+ 0x572F,0x575C,0x573B,0x5742,0x5769,0x5785,0x576B,0x5786,
+ 0x577C,0x577B,0x5768,0x576D,0x5776,0x5773,0x57AD,0x57A4,
+ 0x578C,0x57B2,0x57CF,0x57A7,0x57B4,0x5793,0x57A0,0x57D5,
+ 0x57D8,0x57DA,0x57D9,0x57D2,0x57B8,0x57F4,0x57EF,0x57F8,
+ 0x57E4,0x57DD,0x8E73,0x8E75,0x8E77,0x8E78,0x8E79,0x8E7A,
+ 0x8E7B,0x8E7D,0x8E7E,0x8E80,0x8E82,0x8E83,0x8E84,0x8E86,
+ 0x8E88,0x8E89,0x8E8A,0x8E8B,0x8E8C,0x8E8D,0x8E8E,0x8E91,
+ 0x8E92,0x8E93,0x8E95,0x8E96,0x8E97,0x8E98,0x8E99,0x8E9A,
+ 0x8E9B,0x8E9D,0x8E9F,0x8EA0,0x8EA1,0x8EA2,0x8EA3,0x8EA4,
+ 0x8EA5,0x8EA6,0x8EA7,0x8EA8,0x8EA9,0x8EAA,0x8EAD,0x8EAE,
+ 0x8EB0,0x8EB1,0x8EB3,0x8EB4,0x8EB5,0x8EB6,0x8EB7,0x8EB8,
+ 0x8EB9,0x8EBB,0x8EBC,0x8EBD,0x8EBE,0x8EBF,0x8EC0,0x8EC1,
+ 0x8EC2,0x8EC3,0x8EC4,0x8EC5,0x8EC6,0x8EC7,0x8EC8,0x8EC9,
+ 0x8ECA,0x8ECB,0x8ECC,0x8ECD,0x8ECF,0x8ED0,0x8ED1,0x8ED2,
+ 0x8ED3,0x8ED4,0x8ED5,0x8ED6,0x8ED7,0x8ED8,0x8ED9,0x8EDA,
+ 0x8EDB,0x8EDC,0x8EDD,0x8EDE,0x8EDF,0x8EE0,0x8EE1,0x8EE2,
+ 0x8EE3,0x8EE4,0x580B,0x580D,0x57FD,0x57ED,0x5800,0x581E,
+ 0x5819,0x5844,0x5820,0x5865,0x586C,0x5881,0x5889,0x589A,
+ 0x5880,0x99A8,0x9F19,0x61FF,0x8279,0x827D,0x827F,0x828F,
+ 0x828A,0x82A8,0x8284,0x828E,0x8291,0x8297,0x8299,0x82AB,
+ 0x82B8,0x82BE,0x82B0,0x82C8,0x82CA,0x82E3,0x8298,0x82B7,
+ 0x82AE,0x82CB,0x82CC,0x82C1,0x82A9,0x82B4,0x82A1,0x82AA,
+ 0x829F,0x82C4,0x82CE,0x82A4,0x82E1,0x8309,0x82F7,0x82E4,
+ 0x830F,0x8307,0x82DC,0x82F4,0x82D2,0x82D8,0x830C,0x82FB,
+ 0x82D3,0x8311,0x831A,0x8306,0x8314,0x8315,0x82E0,0x82D5,
+ 0x831C,0x8351,0x835B,0x835C,0x8308,0x8392,0x833C,0x8334,
+ 0x8331,0x839B,0x835E,0x832F,0x834F,0x8347,0x8343,0x835F,
+ 0x8340,0x8317,0x8360,0x832D,0x833A,0x8333,0x8366,0x8365,
+ 0x8EE5,0x8EE6,0x8EE7,0x8EE8,0x8EE9,0x8EEA,0x8EEB,0x8EEC,
+ 0x8EED,0x8EEE,0x8EEF,0x8EF0,0x8EF1,0x8EF2,0x8EF3,0x8EF4,
+ 0x8EF5,0x8EF6,0x8EF7,0x8EF8,0x8EF9,0x8EFA,0x8EFB,0x8EFC,
+ 0x8EFD,0x8EFE,0x8EFF,0x8F00,0x8F01,0x8F02,0x8F03,0x8F04,
+ 0x8F05,0x8F06,0x8F07,0x8F08,0x8F09,0x8F0A,0x8F0B,0x8F0C,
+ 0x8F0D,0x8F0E,0x8F0F,0x8F10,0x8F11,0x8F12,0x8F13,0x8F14,
+ 0x8F15,0x8F16,0x8F17,0x8F18,0x8F19,0x8F1A,0x8F1B,0x8F1C,
+ 0x8F1D,0x8F1E,0x8F1F,0x8F20,0x8F21,0x8F22,0x8F23,0x8F24,
+ 0x8F25,0x8F26,0x8F27,0x8F28,0x8F29,0x8F2A,0x8F2B,0x8F2C,
+ 0x8F2D,0x8F2E,0x8F2F,0x8F30,0x8F31,0x8F32,0x8F33,0x8F34,
+ 0x8F35,0x8F36,0x8F37,0x8F38,0x8F39,0x8F3A,0x8F3B,0x8F3C,
+ 0x8F3D,0x8F3E,0x8F3F,0x8F40,0x8F41,0x8F42,0x8F43,0x8F44,
+ 0x8368,0x831B,0x8369,0x836C,0x836A,0x836D,0x836E,0x83B0,
+ 0x8378,0x83B3,0x83B4,0x83A0,0x83AA,0x8393,0x839C,0x8385,
+ 0x837C,0x83B6,0x83A9,0x837D,0x83B8,0x837B,0x8398,0x839E,
+ 0x83A8,0x83BA,0x83BC,0x83C1,0x8401,0x83E5,0x83D8,0x5807,
+ 0x8418,0x840B,0x83DD,0x83FD,0x83D6,0x841C,0x8438,0x8411,
+ 0x8406,0x83D4,0x83DF,0x840F,0x8403,0x83F8,0x83F9,0x83EA,
+ 0x83C5,0x83C0,0x8426,0x83F0,0x83E1,0x845C,0x8451,0x845A,
+ 0x8459,0x8473,0x8487,0x8488,0x847A,0x8489,0x8478,0x843C,
+ 0x8446,0x8469,0x8476,0x848C,0x848E,0x8431,0x846D,0x84C1,
+ 0x84CD,0x84D0,0x84E6,0x84BD,0x84D3,0x84CA,0x84BF,0x84BA,
+ 0x84E0,0x84A1,0x84B9,0x84B4,0x8497,0x84E5,0x84E3,0x850C,
+ 0x750D,0x8538,0x84F0,0x8539,0x851F,0x853A,0x8F45,0x8F46,
+ 0x8F47,0x8F48,0x8F49,0x8F4A,0x8F4B,0x8F4C,0x8F4D,0x8F4E,
+ 0x8F4F,0x8F50,0x8F51,0x8F52,0x8F53,0x8F54,0x8F55,0x8F56,
+ 0x8F57,0x8F58,0x8F59,0x8F5A,0x8F5B,0x8F5C,0x8F5D,0x8F5E,
+ 0x8F5F,0x8F60,0x8F61,0x8F62,0x8F63,0x8F64,0x8F65,0x8F6A,
+ 0x8F80,0x8F8C,0x8F92,0x8F9D,0x8FA0,0x8FA1,0x8FA2,0x8FA4,
+ 0x8FA5,0x8FA6,0x8FA7,0x8FAA,0x8FAC,0x8FAD,0x8FAE,0x8FAF,
+ 0x8FB2,0x8FB3,0x8FB4,0x8FB5,0x8FB7,0x8FB8,0x8FBA,0x8FBB,
+ 0x8FBC,0x8FBF,0x8FC0,0x8FC3,0x8FC6,0x8FC9,0x8FCA,0x8FCB,
+ 0x8FCC,0x8FCD,0x8FCF,0x8FD2,0x8FD6,0x8FD7,0x8FDA,0x8FE0,
+ 0x8FE1,0x8FE3,0x8FE7,0x8FEC,0x8FEF,0x8FF1,0x8FF2,0x8FF4,
+ 0x8FF5,0x8FF6,0x8FFA,0x8FFB,0x8FFC,0x8FFE,0x8FFF,0x9007,
+ 0x9008,0x900C,0x900E,0x9013,0x9015,0x9018,0x8556,0x853B,
+ 0x84FF,0x84FC,0x8559,0x8548,0x8568,0x8564,0x855E,0x857A,
+ 0x77A2,0x8543,0x8572,0x857B,0x85A4,0x85A8,0x8587,0x858F,
+ 0x8579,0x85AE,0x859C,0x8585,0x85B9,0x85B7,0x85B0,0x85D3,
+ 0x85C1,0x85DC,0x85FF,0x8627,0x8605,0x8629,0x8616,0x863C,
+ 0x5EFE,0x5F08,0x593C,0x5941,0x8037,0x5955,0x595A,0x5958,
+ 0x530F,0x5C22,0x5C25,0x5C2C,0x5C34,0x624C,0x626A,0x629F,
+ 0x62BB,0x62CA,0x62DA,0x62D7,0x62EE,0x6322,0x62F6,0x6339,
+ 0x634B,0x6343,0x63AD,0x63F6,0x6371,0x637A,0x638E,0x63B4,
+ 0x636D,0x63AC,0x638A,0x6369,0x63AE,0x63BC,0x63F2,0x63F8,
+ 0x63E0,0x63FF,0x63C4,0x63DE,0x63CE,0x6452,0x63C6,0x63BE,
+ 0x6445,0x6441,0x640B,0x641B,0x6420,0x640C,0x6426,0x6421,
+ 0x645E,0x6484,0x646D,0x6496,0x9019,0x901C,0x9023,0x9024,
+ 0x9025,0x9027,0x9028,0x9029,0x902A,0x902B,0x902C,0x9030,
+ 0x9031,0x9032,0x9033,0x9034,0x9037,0x9039,0x903A,0x903D,
+ 0x903F,0x9040,0x9043,0x9045,0x9046,0x9048,0x9049,0x904A,
+ 0x904B,0x904C,0x904E,0x9054,0x9055,0x9056,0x9059,0x905A,
+ 0x905C,0x905D,0x905E,0x905F,0x9060,0x9061,0x9064,0x9066,
+ 0x9067,0x9069,0x906A,0x906B,0x906C,0x906F,0x9070,0x9071,
+ 0x9072,0x9073,0x9076,0x9077,0x9078,0x9079,0x907A,0x907B,
+ 0x907C,0x907E,0x9081,0x9084,0x9085,0x9086,0x9087,0x9089,
+ 0x908A,0x908C,0x908D,0x908E,0x908F,0x9090,0x9092,0x9094,
+ 0x9096,0x9098,0x909A,0x909C,0x909E,0x909F,0x90A0,0x90A4,
+ 0x90A5,0x90A7,0x90A8,0x90A9,0x90AB,0x90AD,0x90B2,0x90B7,
+ 0x90BC,0x90BD,0x90BF,0x90C0,0x647A,0x64B7,0x64B8,0x6499,
+ 0x64BA,0x64C0,0x64D0,0x64D7,0x64E4,0x64E2,0x6509,0x6525,
+ 0x652E,0x5F0B,0x5FD2,0x7519,0x5F11,0x535F,0x53F1,0x53FD,
+ 0x53E9,0x53E8,0x53FB,0x5412,0x5416,0x5406,0x544B,0x5452,
+ 0x5453,0x5454,0x5456,0x5443,0x5421,0x5457,0x5459,0x5423,
+ 0x5432,0x5482,0x5494,0x5477,0x5471,0x5464,0x549A,0x549B,
+ 0x5484,0x5476,0x5466,0x549D,0x54D0,0x54AD,0x54C2,0x54B4,
+ 0x54D2,0x54A7,0x54A6,0x54D3,0x54D4,0x5472,0x54A3,0x54D5,
+ 0x54BB,0x54BF,0x54CC,0x54D9,0x54DA,0x54DC,0x54A9,0x54AA,
+ 0x54A4,0x54DD,0x54CF,0x54DE,0x551B,0x54E7,0x5520,0x54FD,
+ 0x5514,0x54F3,0x5522,0x5523,0x550F,0x5511,0x5527,0x552A,
+ 0x5567,0x558F,0x55B5,0x5549,0x556D,0x5541,0x5555,0x553F,
+ 0x5550,0x553C,0x90C2,0x90C3,0x90C6,0x90C8,0x90C9,0x90CB,
+ 0x90CC,0x90CD,0x90D2,0x90D4,0x90D5,0x90D6,0x90D8,0x90D9,
+ 0x90DA,0x90DE,0x90DF,0x90E0,0x90E3,0x90E4,0x90E5,0x90E9,
+ 0x90EA,0x90EC,0x90EE,0x90F0,0x90F1,0x90F2,0x90F3,0x90F5,
+ 0x90F6,0x90F7,0x90F9,0x90FA,0x90FB,0x90FC,0x90FF,0x9100,
+ 0x9101,0x9103,0x9105,0x9106,0x9107,0x9108,0x9109,0x910A,
+ 0x910B,0x910C,0x910D,0x910E,0x910F,0x9110,0x9111,0x9112,
+ 0x9113,0x9114,0x9115,0x9116,0x9117,0x9118,0x911A,0x911B,
+ 0x911C,0x911D,0x911F,0x9120,0x9121,0x9124,0x9125,0x9126,
+ 0x9127,0x9128,0x9129,0x912A,0x912B,0x912C,0x912D,0x912E,
+ 0x9130,0x9132,0x9133,0x9134,0x9135,0x9136,0x9137,0x9138,
+ 0x913A,0x913B,0x913C,0x913D,0x913E,0x913F,0x9140,0x9141,
+ 0x9142,0x9144,0x5537,0x5556,0x5575,0x5576,0x5577,0x5533,
+ 0x5530,0x555C,0x558B,0x55D2,0x5583,0x55B1,0x55B9,0x5588,
+ 0x5581,0x559F,0x557E,0x55D6,0x5591,0x557B,0x55DF,0x55BD,
+ 0x55BE,0x5594,0x5599,0x55EA,0x55F7,0x55C9,0x561F,0x55D1,
+ 0x55EB,0x55EC,0x55D4,0x55E6,0x55DD,0x55C4,0x55EF,0x55E5,
+ 0x55F2,0x55F3,0x55CC,0x55CD,0x55E8,0x55F5,0x55E4,0x8F94,
+ 0x561E,0x5608,0x560C,0x5601,0x5624,0x5623,0x55FE,0x5600,
+ 0x5627,0x562D,0x5658,0x5639,0x5657,0x562C,0x564D,0x5662,
+ 0x5659,0x565C,0x564C,0x5654,0x5686,0x5664,0x5671,0x566B,
+ 0x567B,0x567C,0x5685,0x5693,0x56AF,0x56D4,0x56D7,0x56DD,
+ 0x56E1,0x56F5,0x56EB,0x56F9,0x56FF,0x5704,0x570A,0x5709,
+ 0x571C,0x5E0F,0x5E19,0x5E14,0x5E11,0x5E31,0x5E3B,0x5E3C,
+ 0x9145,0x9147,0x9148,0x9151,0x9153,0x9154,0x9155,0x9156,
+ 0x9158,0x9159,0x915B,0x915C,0x915F,0x9160,0x9166,0x9167,
+ 0x9168,0x916B,0x916D,0x9173,0x917A,0x917B,0x917C,0x9180,
+ 0x9181,0x9182,0x9183,0x9184,0x9186,0x9188,0x918A,0x918E,
+ 0x918F,0x9193,0x9194,0x9195,0x9196,0x9197,0x9198,0x9199,
+ 0x919C,0x919D,0x919E,0x919F,0x91A0,0x91A1,0x91A4,0x91A5,
+ 0x91A6,0x91A7,0x91A8,0x91A9,0x91AB,0x91AC,0x91B0,0x91B1,
+ 0x91B2,0x91B3,0x91B6,0x91B7,0x91B8,0x91B9,0x91BB,0x91BC,
+ 0x91BD,0x91BE,0x91BF,0x91C0,0x91C1,0x91C2,0x91C3,0x91C4,
+ 0x91C5,0x91C6,0x91C8,0x91CB,0x91D0,0x91D2,0x91D3,0x91D4,
+ 0x91D5,0x91D6,0x91D7,0x91D8,0x91D9,0x91DA,0x91DB,0x91DD,
+ 0x91DE,0x91DF,0x91E0,0x91E1,0x91E2,0x91E3,0x91E4,0x91E5,
+ 0x5E37,0x5E44,0x5E54,0x5E5B,0x5E5E,0x5E61,0x5C8C,0x5C7A,
+ 0x5C8D,0x5C90,0x5C96,0x5C88,0x5C98,0x5C99,0x5C91,0x5C9A,
+ 0x5C9C,0x5CB5,0x5CA2,0x5CBD,0x5CAC,0x5CAB,0x5CB1,0x5CA3,
+ 0x5CC1,0x5CB7,0x5CC4,0x5CD2,0x5CE4,0x5CCB,0x5CE5,0x5D02,
+ 0x5D03,0x5D27,0x5D26,0x5D2E,0x5D24,0x5D1E,0x5D06,0x5D1B,
+ 0x5D58,0x5D3E,0x5D34,0x5D3D,0x5D6C,0x5D5B,0x5D6F,0x5D5D,
+ 0x5D6B,0x5D4B,0x5D4A,0x5D69,0x5D74,0x5D82,0x5D99,0x5D9D,
+ 0x8C73,0x5DB7,0x5DC5,0x5F73,0x5F77,0x5F82,0x5F87,0x5F89,
+ 0x5F8C,0x5F95,0x5F99,0x5F9C,0x5FA8,0x5FAD,0x5FB5,0x5FBC,
+ 0x8862,0x5F61,0x72AD,0x72B0,0x72B4,0x72B7,0x72B8,0x72C3,
+ 0x72C1,0x72CE,0x72CD,0x72D2,0x72E8,0x72EF,0x72E9,0x72F2,
+ 0x72F4,0x72F7,0x7301,0x72F3,0x7303,0x72FA,0x91E6,0x91E7,
+ 0x91E8,0x91E9,0x91EA,0x91EB,0x91EC,0x91ED,0x91EE,0x91EF,
+ 0x91F0,0x91F1,0x91F2,0x91F3,0x91F4,0x91F5,0x91F6,0x91F7,
+ 0x91F8,0x91F9,0x91FA,0x91FB,0x91FC,0x91FD,0x91FE,0x91FF,
+ 0x9200,0x9201,0x9202,0x9203,0x9204,0x9205,0x9206,0x9207,
+ 0x9208,0x9209,0x920A,0x920B,0x920C,0x920D,0x920E,0x920F,
+ 0x9210,0x9211,0x9212,0x9213,0x9214,0x9215,0x9216,0x9217,
+ 0x9218,0x9219,0x921A,0x921B,0x921C,0x921D,0x921E,0x921F,
+ 0x9220,0x9221,0x9222,0x9223,0x9224,0x9225,0x9226,0x9227,
+ 0x9228,0x9229,0x922A,0x922B,0x922C,0x922D,0x922E,0x922F,
+ 0x9230,0x9231,0x9232,0x9233,0x9234,0x9235,0x9236,0x9237,
+ 0x9238,0x9239,0x923A,0x923B,0x923C,0x923D,0x923E,0x923F,
+ 0x9240,0x9241,0x9242,0x9243,0x9244,0x9245,0x72FB,0x7317,
+ 0x7313,0x7321,0x730A,0x731E,0x731D,0x7315,0x7322,0x7339,
+ 0x7325,0x732C,0x7338,0x7331,0x7350,0x734D,0x7357,0x7360,
+ 0x736C,0x736F,0x737E,0x821B,0x5925,0x98E7,0x5924,0x5902,
+ 0x9963,0x9967,0x9968,0x9969,0x996A,0x996B,0x996C,0x9974,
+ 0x9977,0x997D,0x9980,0x9984,0x9987,0x998A,0x998D,0x9990,
+ 0x9991,0x9993,0x9994,0x9995,0x5E80,0x5E91,0x5E8B,0x5E96,
+ 0x5EA5,0x5EA0,0x5EB9,0x5EB5,0x5EBE,0x5EB3,0x8D53,0x5ED2,
+ 0x5ED1,0x5EDB,0x5EE8,0x5EEA,0x81BA,0x5FC4,0x5FC9,0x5FD6,
+ 0x5FCF,0x6003,0x5FEE,0x6004,0x5FE1,0x5FE4,0x5FFE,0x6005,
+ 0x6006,0x5FEA,0x5FED,0x5FF8,0x6019,0x6035,0x6026,0x601B,
+ 0x600F,0x600D,0x6029,0x602B,0x600A,0x603F,0x6021,0x6078,
+ 0x6079,0x607B,0x607A,0x6042,0x9246,0x9247,0x9248,0x9249,
+ 0x924A,0x924B,0x924C,0x924D,0x924E,0x924F,0x9250,0x9251,
+ 0x9252,0x9253,0x9254,0x9255,0x9256,0x9257,0x9258,0x9259,
+ 0x925A,0x925B,0x925C,0x925D,0x925E,0x925F,0x9260,0x9261,
+ 0x9262,0x9263,0x9264,0x9265,0x9266,0x9267,0x9268,0x9269,
+ 0x926A,0x926B,0x926C,0x926D,0x926E,0x926F,0x9270,0x9271,
+ 0x9272,0x9273,0x9275,0x9276,0x9277,0x9278,0x9279,0x927A,
+ 0x927B,0x927C,0x927D,0x927E,0x927F,0x9280,0x9281,0x9282,
+ 0x9283,0x9284,0x9285,0x9286,0x9287,0x9288,0x9289,0x928A,
+ 0x928B,0x928C,0x928D,0x928F,0x9290,0x9291,0x9292,0x9293,
+ 0x9294,0x9295,0x9296,0x9297,0x9298,0x9299,0x929A,0x929B,
+ 0x929C,0x929D,0x929E,0x929F,0x92A0,0x92A1,0x92A2,0x92A3,
+ 0x92A4,0x92A5,0x92A6,0x92A7,0x606A,0x607D,0x6096,0x609A,
+ 0x60AD,0x609D,0x6083,0x6092,0x608C,0x609B,0x60EC,0x60BB,
+ 0x60B1,0x60DD,0x60D8,0x60C6,0x60DA,0x60B4,0x6120,0x6126,
+ 0x6115,0x6123,0x60F4,0x6100,0x610E,0x612B,0x614A,0x6175,
+ 0x61AC,0x6194,0x61A7,0x61B7,0x61D4,0x61F5,0x5FDD,0x96B3,
+ 0x95E9,0x95EB,0x95F1,0x95F3,0x95F5,0x95F6,0x95FC,0x95FE,
+ 0x9603,0x9604,0x9606,0x9608,0x960A,0x960B,0x960C,0x960D,
+ 0x960F,0x9612,0x9615,0x9616,0x9617,0x9619,0x961A,0x4E2C,
+ 0x723F,0x6215,0x6C35,0x6C54,0x6C5C,0x6C4A,0x6CA3,0x6C85,
+ 0x6C90,0x6C94,0x6C8C,0x6C68,0x6C69,0x6C74,0x6C76,0x6C86,
+ 0x6CA9,0x6CD0,0x6CD4,0x6CAD,0x6CF7,0x6CF8,0x6CF1,0x6CD7,
+ 0x6CB2,0x6CE0,0x6CD6,0x6CFA,0x6CEB,0x6CEE,0x6CB1,0x6CD3,
+ 0x6CEF,0x6CFE,0x92A8,0x92A9,0x92AA,0x92AB,0x92AC,0x92AD,
+ 0x92AF,0x92B0,0x92B1,0x92B2,0x92B3,0x92B4,0x92B5,0x92B6,
+ 0x92B7,0x92B8,0x92B9,0x92BA,0x92BB,0x92BC,0x92BD,0x92BE,
+ 0x92BF,0x92C0,0x92C1,0x92C2,0x92C3,0x92C4,0x92C5,0x92C6,
+ 0x92C7,0x92C9,0x92CA,0x92CB,0x92CC,0x92CD,0x92CE,0x92CF,
+ 0x92D0,0x92D1,0x92D2,0x92D3,0x92D4,0x92D5,0x92D6,0x92D7,
+ 0x92D8,0x92D9,0x92DA,0x92DB,0x92DC,0x92DD,0x92DE,0x92DF,
+ 0x92E0,0x92E1,0x92E2,0x92E3,0x92E4,0x92E5,0x92E6,0x92E7,
+ 0x92E8,0x92E9,0x92EA,0x92EB,0x92EC,0x92ED,0x92EE,0x92EF,
+ 0x92F0,0x92F1,0x92F2,0x92F3,0x92F4,0x92F5,0x92F6,0x92F7,
+ 0x92F8,0x92F9,0x92FA,0x92FB,0x92FC,0x92FD,0x92FE,0x92FF,
+ 0x9300,0x9301,0x9302,0x9303,0x9304,0x9305,0x9306,0x9307,
+ 0x9308,0x9309,0x6D39,0x6D27,0x6D0C,0x6D43,0x6D48,0x6D07,
+ 0x6D04,0x6D19,0x6D0E,0x6D2B,0x6D4D,0x6D2E,0x6D35,0x6D1A,
+ 0x6D4F,0x6D52,0x6D54,0x6D33,0x6D91,0x6D6F,0x6D9E,0x6DA0,
+ 0x6D5E,0x6D93,0x6D94,0x6D5C,0x6D60,0x6D7C,0x6D63,0x6E1A,
+ 0x6DC7,0x6DC5,0x6DDE,0x6E0E,0x6DBF,0x6DE0,0x6E11,0x6DE6,
+ 0x6DDD,0x6DD9,0x6E16,0x6DAB,0x6E0C,0x6DAE,0x6E2B,0x6E6E,
+ 0x6E4E,0x6E6B,0x6EB2,0x6E5F,0x6E86,0x6E53,0x6E54,0x6E32,
+ 0x6E25,0x6E44,0x6EDF,0x6EB1,0x6E98,0x6EE0,0x6F2D,0x6EE2,
+ 0x6EA5,0x6EA7,0x6EBD,0x6EBB,0x6EB7,0x6ED7,0x6EB4,0x6ECF,
+ 0x6E8F,0x6EC2,0x6E9F,0x6F62,0x6F46,0x6F47,0x6F24,0x6F15,
+ 0x6EF9,0x6F2F,0x6F36,0x6F4B,0x6F74,0x6F2A,0x6F09,0x6F29,
+ 0x6F89,0x6F8D,0x6F8C,0x6F78,0x6F72,0x6F7C,0x6F7A,0x6FD1,
+ 0x930A,0x930B,0x930C,0x930D,0x930E,0x930F,0x9310,0x9311,
+ 0x9312,0x9313,0x9314,0x9315,0x9316,0x9317,0x9318,0x9319,
+ 0x931A,0x931B,0x931C,0x931D,0x931E,0x931F,0x9320,0x9321,
+ 0x9322,0x9323,0x9324,0x9325,0x9326,0x9327,0x9328,0x9329,
+ 0x932A,0x932B,0x932C,0x932D,0x932E,0x932F,0x9330,0x9331,
+ 0x9332,0x9333,0x9334,0x9335,0x9336,0x9337,0x9338,0x9339,
+ 0x933A,0x933B,0x933C,0x933D,0x933F,0x9340,0x9341,0x9342,
+ 0x9343,0x9344,0x9345,0x9346,0x9347,0x9348,0x9349,0x934A,
+ 0x934B,0x934C,0x934D,0x934E,0x934F,0x9350,0x9351,0x9352,
+ 0x9353,0x9354,0x9355,0x9356,0x9357,0x9358,0x9359,0x935A,
+ 0x935B,0x935C,0x935D,0x935E,0x935F,0x9360,0x9361,0x9362,
+ 0x9363,0x9364,0x9365,0x9366,0x9367,0x9368,0x9369,0x936B,
+ 0x6FC9,0x6FA7,0x6FB9,0x6FB6,0x6FC2,0x6FE1,0x6FEE,0x6FDE,
+ 0x6FE0,0x6FEF,0x701A,0x7023,0x701B,0x7039,0x7035,0x704F,
+ 0x705E,0x5B80,0x5B84,0x5B95,0x5B93,0x5BA5,0x5BB8,0x752F,
+ 0x9A9E,0x6434,0x5BE4,0x5BEE,0x8930,0x5BF0,0x8E47,0x8B07,
+ 0x8FB6,0x8FD3,0x8FD5,0x8FE5,0x8FEE,0x8FE4,0x8FE9,0x8FE6,
+ 0x8FF3,0x8FE8,0x9005,0x9004,0x900B,0x9026,0x9011,0x900D,
+ 0x9016,0x9021,0x9035,0x9036,0x902D,0x902F,0x9044,0x9051,
+ 0x9052,0x9050,0x9068,0x9058,0x9062,0x905B,0x66B9,0x9074,
+ 0x907D,0x9082,0x9088,0x9083,0x908B,0x5F50,0x5F57,0x5F56,
+ 0x5F58,0x5C3B,0x54AB,0x5C50,0x5C59,0x5B71,0x5C63,0x5C66,
+ 0x7FBC,0x5F2A,0x5F29,0x5F2D,0x8274,0x5F3C,0x9B3B,0x5C6E,
+ 0x5981,0x5983,0x598D,0x59A9,0x59AA,0x59A3,0x936C,0x936D,
+ 0x936E,0x936F,0x9370,0x9371,0x9372,0x9373,0x9374,0x9375,
+ 0x9376,0x9377,0x9378,0x9379,0x937A,0x937B,0x937C,0x937D,
+ 0x937E,0x937F,0x9380,0x9381,0x9382,0x9383,0x9384,0x9385,
+ 0x9386,0x9387,0x9388,0x9389,0x938A,0x938B,0x938C,0x938D,
+ 0x938E,0x9390,0x9391,0x9392,0x9393,0x9394,0x9395,0x9396,
+ 0x9397,0x9398,0x9399,0x939A,0x939B,0x939C,0x939D,0x939E,
+ 0x939F,0x93A0,0x93A1,0x93A2,0x93A3,0x93A4,0x93A5,0x93A6,
+ 0x93A7,0x93A8,0x93A9,0x93AA,0x93AB,0x93AC,0x93AD,0x93AE,
+ 0x93AF,0x93B0,0x93B1,0x93B2,0x93B3,0x93B4,0x93B5,0x93B6,
+ 0x93B7,0x93B8,0x93B9,0x93BA,0x93BB,0x93BC,0x93BD,0x93BE,
+ 0x93BF,0x93C0,0x93C1,0x93C2,0x93C3,0x93C4,0x93C5,0x93C6,
+ 0x93C7,0x93C8,0x93C9,0x93CB,0x93CC,0x93CD,0x5997,0x59CA,
+ 0x59AB,0x599E,0x59A4,0x59D2,0x59B2,0x59AF,0x59D7,0x59BE,
+ 0x5A05,0x5A06,0x59DD,0x5A08,0x59E3,0x59D8,0x59F9,0x5A0C,
+ 0x5A09,0x5A32,0x5A34,0x5A11,0x5A23,0x5A13,0x5A40,0x5A67,
+ 0x5A4A,0x5A55,0x5A3C,0x5A62,0x5A75,0x80EC,0x5AAA,0x5A9B,
+ 0x5A77,0x5A7A,0x5ABE,0x5AEB,0x5AB2,0x5AD2,0x5AD4,0x5AB8,
+ 0x5AE0,0x5AE3,0x5AF1,0x5AD6,0x5AE6,0x5AD8,0x5ADC,0x5B09,
+ 0x5B17,0x5B16,0x5B32,0x5B37,0x5B40,0x5C15,0x5C1C,0x5B5A,
+ 0x5B65,0x5B73,0x5B51,0x5B53,0x5B62,0x9A75,0x9A77,0x9A78,
+ 0x9A7A,0x9A7F,0x9A7D,0x9A80,0x9A81,0x9A85,0x9A88,0x9A8A,
+ 0x9A90,0x9A92,0x9A93,0x9A96,0x9A98,0x9A9B,0x9A9C,0x9A9D,
+ 0x9A9F,0x9AA0,0x9AA2,0x9AA3,0x9AA5,0x9AA7,0x7E9F,0x7EA1,
+ 0x7EA3,0x7EA5,0x7EA8,0x7EA9,0x93CE,0x93CF,0x93D0,0x93D1,
+ 0x93D2,0x93D3,0x93D4,0x93D5,0x93D7,0x93D8,0x93D9,0x93DA,
+ 0x93DB,0x93DC,0x93DD,0x93DE,0x93DF,0x93E0,0x93E1,0x93E2,
+ 0x93E3,0x93E4,0x93E5,0x93E6,0x93E7,0x93E8,0x93E9,0x93EA,
+ 0x93EB,0x93EC,0x93ED,0x93EE,0x93EF,0x93F0,0x93F1,0x93F2,
+ 0x93F3,0x93F4,0x93F5,0x93F6,0x93F7,0x93F8,0x93F9,0x93FA,
+ 0x93FB,0x93FC,0x93FD,0x93FE,0x93FF,0x9400,0x9401,0x9402,
+ 0x9403,0x9404,0x9405,0x9406,0x9407,0x9408,0x9409,0x940A,
+ 0x940B,0x940C,0x940D,0x940E,0x940F,0x9410,0x9411,0x9412,
+ 0x9413,0x9414,0x9415,0x9416,0x9417,0x9418,0x9419,0x941A,
+ 0x941B,0x941C,0x941D,0x941E,0x941F,0x9420,0x9421,0x9422,
+ 0x9423,0x9424,0x9425,0x9426,0x9427,0x9428,0x9429,0x942A,
+ 0x942B,0x942C,0x942D,0x942E,0x7EAD,0x7EB0,0x7EBE,0x7EC0,
+ 0x7EC1,0x7EC2,0x7EC9,0x7ECB,0x7ECC,0x7ED0,0x7ED4,0x7ED7,
+ 0x7EDB,0x7EE0,0x7EE1,0x7EE8,0x7EEB,0x7EEE,0x7EEF,0x7EF1,
+ 0x7EF2,0x7F0D,0x7EF6,0x7EFA,0x7EFB,0x7EFE,0x7F01,0x7F02,
+ 0x7F03,0x7F07,0x7F08,0x7F0B,0x7F0C,0x7F0F,0x7F11,0x7F12,
+ 0x7F17,0x7F19,0x7F1C,0x7F1B,0x7F1F,0x7F21,0x7F22,0x7F23,
+ 0x7F24,0x7F25,0x7F26,0x7F27,0x7F2A,0x7F2B,0x7F2C,0x7F2D,
+ 0x7F2F,0x7F30,0x7F31,0x7F32,0x7F33,0x7F35,0x5E7A,0x757F,
+ 0x5DDB,0x753E,0x9095,0x738E,0x7391,0x73AE,0x73A2,0x739F,
+ 0x73CF,0x73C2,0x73D1,0x73B7,0x73B3,0x73C0,0x73C9,0x73C8,
+ 0x73E5,0x73D9,0x987C,0x740A,0x73E9,0x73E7,0x73DE,0x73BA,
+ 0x73F2,0x740F,0x742A,0x745B,0x7426,0x7425,0x7428,0x7430,
+ 0x742E,0x742C,0x942F,0x9430,0x9431,0x9432,0x9433,0x9434,
+ 0x9435,0x9436,0x9437,0x9438,0x9439,0x943A,0x943B,0x943C,
+ 0x943D,0x943F,0x9440,0x9441,0x9442,0x9443,0x9444,0x9445,
+ 0x9446,0x9447,0x9448,0x9449,0x944A,0x944B,0x944C,0x944D,
+ 0x944E,0x944F,0x9450,0x9451,0x9452,0x9453,0x9454,0x9455,
+ 0x9456,0x9457,0x9458,0x9459,0x945A,0x945B,0x945C,0x945D,
+ 0x945E,0x945F,0x9460,0x9461,0x9462,0x9463,0x9464,0x9465,
+ 0x9466,0x9467,0x9468,0x9469,0x946A,0x946C,0x946D,0x946E,
+ 0x946F,0x9470,0x9471,0x9472,0x9473,0x9474,0x9475,0x9476,
+ 0x9477,0x9478,0x9479,0x947A,0x947B,0x947C,0x947D,0x947E,
+ 0x947F,0x9480,0x9481,0x9482,0x9483,0x9484,0x9491,0x9496,
+ 0x9498,0x94C7,0x94CF,0x94D3,0x94D4,0x94DA,0x94E6,0x94FB,
+ 0x951C,0x9520,0x741B,0x741A,0x7441,0x745C,0x7457,0x7455,
+ 0x7459,0x7477,0x746D,0x747E,0x749C,0x748E,0x7480,0x7481,
+ 0x7487,0x748B,0x749E,0x74A8,0x74A9,0x7490,0x74A7,0x74D2,
+ 0x74BA,0x97EA,0x97EB,0x97EC,0x674C,0x6753,0x675E,0x6748,
+ 0x6769,0x67A5,0x6787,0x676A,0x6773,0x6798,0x67A7,0x6775,
+ 0x67A8,0x679E,0x67AD,0x678B,0x6777,0x677C,0x67F0,0x6809,
+ 0x67D8,0x680A,0x67E9,0x67B0,0x680C,0x67D9,0x67B5,0x67DA,
+ 0x67B3,0x67DD,0x6800,0x67C3,0x67B8,0x67E2,0x680E,0x67C1,
+ 0x67FD,0x6832,0x6833,0x6860,0x6861,0x684E,0x6862,0x6844,
+ 0x6864,0x6883,0x681D,0x6855,0x6866,0x6841,0x6867,0x6840,
+ 0x683E,0x684A,0x6849,0x6829,0x68B5,0x688F,0x6874,0x6877,
+ 0x6893,0x686B,0x68C2,0x696E,0x68FC,0x691F,0x6920,0x68F9,
+ 0x9527,0x9533,0x953D,0x9543,0x9548,0x954B,0x9555,0x955A,
+ 0x9560,0x956E,0x9574,0x9575,0x9577,0x9578,0x9579,0x957A,
+ 0x957B,0x957C,0x957D,0x957E,0x9580,0x9581,0x9582,0x9583,
+ 0x9584,0x9585,0x9586,0x9587,0x9588,0x9589,0x958A,0x958B,
+ 0x958C,0x958D,0x958E,0x958F,0x9590,0x9591,0x9592,0x9593,
+ 0x9594,0x9595,0x9596,0x9597,0x9598,0x9599,0x959A,0x959B,
+ 0x959C,0x959D,0x959E,0x959F,0x95A0,0x95A1,0x95A2,0x95A3,
+ 0x95A4,0x95A5,0x95A6,0x95A7,0x95A8,0x95A9,0x95AA,0x95AB,
+ 0x95AC,0x95AD,0x95AE,0x95AF,0x95B0,0x95B1,0x95B2,0x95B3,
+ 0x95B4,0x95B5,0x95B6,0x95B7,0x95B8,0x95B9,0x95BA,0x95BB,
+ 0x95BC,0x95BD,0x95BE,0x95BF,0x95C0,0x95C1,0x95C2,0x95C3,
+ 0x95C4,0x95C5,0x95C6,0x95C7,0x95C8,0x95C9,0x95CA,0x95CB,
+ 0x6924,0x68F0,0x690B,0x6901,0x6957,0x68E3,0x6910,0x6971,
+ 0x6939,0x6960,0x6942,0x695D,0x6984,0x696B,0x6980,0x6998,
+ 0x6978,0x6934,0x69CC,0x6987,0x6988,0x69CE,0x6989,0x6966,
+ 0x6963,0x6979,0x699B,0x69A7,0x69BB,0x69AB,0x69AD,0x69D4,
+ 0x69B1,0x69C1,0x69CA,0x69DF,0x6995,0x69E0,0x698D,0x69FF,
+ 0x6A2F,0x69ED,0x6A17,0x6A18,0x6A65,0x69F2,0x6A44,0x6A3E,
+ 0x6AA0,0x6A50,0x6A5B,0x6A35,0x6A8E,0x6A79,0x6A3D,0x6A28,
+ 0x6A58,0x6A7C,0x6A91,0x6A90,0x6AA9,0x6A97,0x6AAB,0x7337,
+ 0x7352,0x6B81,0x6B82,0x6B87,0x6B84,0x6B92,0x6B93,0x6B8D,
+ 0x6B9A,0x6B9B,0x6BA1,0x6BAA,0x8F6B,0x8F6D,0x8F71,0x8F72,
+ 0x8F73,0x8F75,0x8F76,0x8F78,0x8F77,0x8F79,0x8F7A,0x8F7C,
+ 0x8F7E,0x8F81,0x8F82,0x8F84,0x8F87,0x8F8B,0x95CC,0x95CD,
+ 0x95CE,0x95CF,0x95D0,0x95D1,0x95D2,0x95D3,0x95D4,0x95D5,
+ 0x95D6,0x95D7,0x95D8,0x95D9,0x95DA,0x95DB,0x95DC,0x95DD,
+ 0x95DE,0x95DF,0x95E0,0x95E1,0x95E2,0x95E3,0x95E4,0x95E5,
+ 0x95E6,0x95E7,0x95EC,0x95FF,0x9607,0x9613,0x9618,0x961B,
+ 0x961E,0x9620,0x9623,0x9624,0x9625,0x9626,0x9627,0x9628,
+ 0x9629,0x962B,0x962C,0x962D,0x962F,0x9630,0x9637,0x9638,
+ 0x9639,0x963A,0x963E,0x9641,0x9643,0x964A,0x964E,0x964F,
+ 0x9651,0x9652,0x9653,0x9656,0x9657,0x9658,0x9659,0x965A,
+ 0x965C,0x965D,0x965E,0x9660,0x9663,0x9665,0x9666,0x966B,
+ 0x966D,0x966E,0x966F,0x9670,0x9671,0x9673,0x9678,0x9679,
+ 0x967A,0x967B,0x967C,0x967D,0x967E,0x967F,0x9680,0x9681,
+ 0x9682,0x9683,0x9684,0x9687,0x9689,0x968A,0x8F8D,0x8F8E,
+ 0x8F8F,0x8F98,0x8F9A,0x8ECE,0x620B,0x6217,0x621B,0x621F,
+ 0x6222,0x6221,0x6225,0x6224,0x622C,0x81E7,0x74EF,0x74F4,
+ 0x74FF,0x750F,0x7511,0x7513,0x6534,0x65EE,0x65EF,0x65F0,
+ 0x660A,0x6619,0x6772,0x6603,0x6615,0x6600,0x7085,0x66F7,
+ 0x661D,0x6634,0x6631,0x6636,0x6635,0x8006,0x665F,0x6654,
+ 0x6641,0x664F,0x6656,0x6661,0x6657,0x6677,0x6684,0x668C,
+ 0x66A7,0x669D,0x66BE,0x66DB,0x66DC,0x66E6,0x66E9,0x8D32,
+ 0x8D33,0x8D36,0x8D3B,0x8D3D,0x8D40,0x8D45,0x8D46,0x8D48,
+ 0x8D49,0x8D47,0x8D4D,0x8D55,0x8D59,0x89C7,0x89CA,0x89CB,
+ 0x89CC,0x89CE,0x89CF,0x89D0,0x89D1,0x726E,0x729F,0x725D,
+ 0x7266,0x726F,0x727E,0x727F,0x7284,0x728B,0x728D,0x728F,
+ 0x7292,0x6308,0x6332,0x63B0,0x968C,0x968E,0x9691,0x9692,
+ 0x9693,0x9695,0x9696,0x969A,0x969B,0x969D,0x969E,0x969F,
+ 0x96A0,0x96A1,0x96A2,0x96A3,0x96A4,0x96A5,0x96A6,0x96A8,
+ 0x96A9,0x96AA,0x96AB,0x96AC,0x96AD,0x96AE,0x96AF,0x96B1,
+ 0x96B2,0x96B4,0x96B5,0x96B7,0x96B8,0x96BA,0x96BB,0x96BF,
+ 0x96C2,0x96C3,0x96C8,0x96CA,0x96CB,0x96D0,0x96D1,0x96D3,
+ 0x96D4,0x96D6,0x96D7,0x96D8,0x96D9,0x96DA,0x96DB,0x96DC,
+ 0x96DD,0x96DE,0x96DF,0x96E1,0x96E2,0x96E3,0x96E4,0x96E5,
+ 0x96E6,0x96E7,0x96EB,0x96EC,0x96ED,0x96EE,0x96F0,0x96F1,
+ 0x96F2,0x96F4,0x96F5,0x96F8,0x96FA,0x96FB,0x96FC,0x96FD,
+ 0x96FF,0x9702,0x9703,0x9705,0x970A,0x970B,0x970C,0x9710,
+ 0x9711,0x9712,0x9714,0x9715,0x9717,0x9718,0x9719,0x971A,
+ 0x971B,0x971D,0x971F,0x9720,0x643F,0x64D8,0x8004,0x6BEA,
+ 0x6BF3,0x6BFD,0x6BF5,0x6BF9,0x6C05,0x6C07,0x6C06,0x6C0D,
+ 0x6C15,0x6C18,0x6C19,0x6C1A,0x6C21,0x6C29,0x6C24,0x6C2A,
+ 0x6C32,0x6535,0x6555,0x656B,0x724D,0x7252,0x7256,0x7230,
+ 0x8662,0x5216,0x809F,0x809C,0x8093,0x80BC,0x670A,0x80BD,
+ 0x80B1,0x80AB,0x80AD,0x80B4,0x80B7,0x80E7,0x80E8,0x80E9,
+ 0x80EA,0x80DB,0x80C2,0x80C4,0x80D9,0x80CD,0x80D7,0x6710,
+ 0x80DD,0x80EB,0x80F1,0x80F4,0x80ED,0x810D,0x810E,0x80F2,
+ 0x80FC,0x6715,0x8112,0x8C5A,0x8136,0x811E,0x812C,0x8118,
+ 0x8132,0x8148,0x814C,0x8153,0x8174,0x8159,0x815A,0x8171,
+ 0x8160,0x8169,0x817C,0x817D,0x816D,0x8167,0x584D,0x5AB5,
+ 0x8188,0x8182,0x8191,0x6ED5,0x81A3,0x81AA,0x81CC,0x6726,
+ 0x81CA,0x81BB,0x9721,0x9722,0x9723,0x9724,0x9725,0x9726,
+ 0x9727,0x9728,0x9729,0x972B,0x972C,0x972E,0x972F,0x9731,
+ 0x9733,0x9734,0x9735,0x9736,0x9737,0x973A,0x973B,0x973C,
+ 0x973D,0x973F,0x9740,0x9741,0x9742,0x9743,0x9744,0x9745,
+ 0x9746,0x9747,0x9748,0x9749,0x974A,0x974B,0x974C,0x974D,
+ 0x974E,0x974F,0x9750,0x9751,0x9754,0x9755,0x9757,0x9758,
+ 0x975A,0x975C,0x975D,0x975F,0x9763,0x9764,0x9766,0x9767,
+ 0x9768,0x976A,0x976B,0x976C,0x976D,0x976E,0x976F,0x9770,
+ 0x9771,0x9772,0x9775,0x9777,0x9778,0x9779,0x977A,0x977B,
+ 0x977D,0x977E,0x977F,0x9780,0x9781,0x9782,0x9783,0x9784,
+ 0x9786,0x9787,0x9788,0x9789,0x978A,0x978C,0x978E,0x978F,
+ 0x9790,0x9793,0x9795,0x9796,0x9797,0x9799,0x979A,0x979B,
+ 0x979C,0x979D,0x81C1,0x81A6,0x6B24,0x6B37,0x6B39,0x6B43,
+ 0x6B46,0x6B59,0x98D1,0x98D2,0x98D3,0x98D5,0x98D9,0x98DA,
+ 0x6BB3,0x5F40,0x6BC2,0x89F3,0x6590,0x9F51,0x6593,0x65BC,
+ 0x65C6,0x65C4,0x65C3,0x65CC,0x65CE,0x65D2,0x65D6,0x7080,
+ 0x709C,0x7096,0x709D,0x70BB,0x70C0,0x70B7,0x70AB,0x70B1,
+ 0x70E8,0x70CA,0x7110,0x7113,0x7116,0x712F,0x7131,0x7173,
+ 0x715C,0x7168,0x7145,0x7172,0x714A,0x7178,0x717A,0x7198,
+ 0x71B3,0x71B5,0x71A8,0x71A0,0x71E0,0x71D4,0x71E7,0x71F9,
+ 0x721D,0x7228,0x706C,0x7118,0x7166,0x71B9,0x623E,0x623D,
+ 0x6243,0x6248,0x6249,0x793B,0x7940,0x7946,0x7949,0x795B,
+ 0x795C,0x7953,0x795A,0x7962,0x7957,0x7960,0x796F,0x7967,
+ 0x797A,0x7985,0x798A,0x799A,0x79A7,0x79B3,0x5FD1,0x5FD0,
+ 0x979E,0x979F,0x97A1,0x97A2,0x97A4,0x97A5,0x97A6,0x97A7,
+ 0x97A8,0x97A9,0x97AA,0x97AC,0x97AE,0x97B0,0x97B1,0x97B3,
+ 0x97B5,0x97B6,0x97B7,0x97B8,0x97B9,0x97BA,0x97BB,0x97BC,
+ 0x97BD,0x97BE,0x97BF,0x97C0,0x97C1,0x97C2,0x97C3,0x97C4,
+ 0x97C5,0x97C6,0x97C7,0x97C8,0x97C9,0x97CA,0x97CB,0x97CC,
+ 0x97CD,0x97CE,0x97CF,0x97D0,0x97D1,0x97D2,0x97D3,0x97D4,
+ 0x97D5,0x97D6,0x97D7,0x97D8,0x97D9,0x97DA,0x97DB,0x97DC,
+ 0x97DD,0x97DE,0x97DF,0x97E0,0x97E1,0x97E2,0x97E3,0x97E4,
+ 0x97E5,0x97E8,0x97EE,0x97EF,0x97F0,0x97F1,0x97F2,0x97F4,
+ 0x97F7,0x97F8,0x97F9,0x97FA,0x97FB,0x97FC,0x97FD,0x97FE,
+ 0x97FF,0x9800,0x9801,0x9802,0x9803,0x9804,0x9805,0x9806,
+ 0x9807,0x9808,0x9809,0x980A,0x980B,0x980C,0x980D,0x980E,
+ 0x603C,0x605D,0x605A,0x6067,0x6041,0x6059,0x6063,0x60AB,
+ 0x6106,0x610D,0x615D,0x61A9,0x619D,0x61CB,0x61D1,0x6206,
+ 0x8080,0x807F,0x6C93,0x6CF6,0x6DFC,0x77F6,0x77F8,0x7800,
+ 0x7809,0x7817,0x7818,0x7811,0x65AB,0x782D,0x781C,0x781D,
+ 0x7839,0x783A,0x783B,0x781F,0x783C,0x7825,0x782C,0x7823,
+ 0x7829,0x784E,0x786D,0x7856,0x7857,0x7826,0x7850,0x7847,
+ 0x784C,0x786A,0x789B,0x7893,0x789A,0x7887,0x789C,0x78A1,
+ 0x78A3,0x78B2,0x78B9,0x78A5,0x78D4,0x78D9,0x78C9,0x78EC,
+ 0x78F2,0x7905,0x78F4,0x7913,0x7924,0x791E,0x7934,0x9F9B,
+ 0x9EF9,0x9EFB,0x9EFC,0x76F1,0x7704,0x770D,0x76F9,0x7707,
+ 0x7708,0x771A,0x7722,0x7719,0x772D,0x7726,0x7735,0x7738,
+ 0x7750,0x7751,0x7747,0x7743,0x775A,0x7768,0x980F,0x9810,
+ 0x9811,0x9812,0x9813,0x9814,0x9815,0x9816,0x9817,0x9818,
+ 0x9819,0x981A,0x981B,0x981C,0x981D,0x981E,0x981F,0x9820,
+ 0x9821,0x9822,0x9823,0x9824,0x9825,0x9826,0x9827,0x9828,
+ 0x9829,0x982A,0x982B,0x982C,0x982D,0x982E,0x982F,0x9830,
+ 0x9831,0x9832,0x9833,0x9834,0x9835,0x9836,0x9837,0x9838,
+ 0x9839,0x983A,0x983B,0x983C,0x983D,0x983E,0x983F,0x9840,
+ 0x9841,0x9842,0x9843,0x9844,0x9845,0x9846,0x9847,0x9848,
+ 0x9849,0x984A,0x984B,0x984C,0x984D,0x984E,0x984F,0x9850,
+ 0x9851,0x9852,0x9853,0x9854,0x9855,0x9856,0x9857,0x9858,
+ 0x9859,0x985A,0x985B,0x985C,0x985D,0x985E,0x985F,0x9860,
+ 0x9861,0x9862,0x9863,0x9864,0x9865,0x9866,0x9867,0x9868,
+ 0x9869,0x986A,0x986B,0x986C,0x986D,0x986E,0x7762,0x7765,
+ 0x777F,0x778D,0x777D,0x7780,0x778C,0x7791,0x779F,0x77A0,
+ 0x77B0,0x77B5,0x77BD,0x753A,0x7540,0x754E,0x754B,0x7548,
+ 0x755B,0x7572,0x7579,0x7583,0x7F58,0x7F61,0x7F5F,0x8A48,
+ 0x7F68,0x7F74,0x7F71,0x7F79,0x7F81,0x7F7E,0x76CD,0x76E5,
+ 0x8832,0x9485,0x9486,0x9487,0x948B,0x948A,0x948C,0x948D,
+ 0x948F,0x9490,0x9494,0x9497,0x9495,0x949A,0x949B,0x949C,
+ 0x94A3,0x94A4,0x94AB,0x94AA,0x94AD,0x94AC,0x94AF,0x94B0,
+ 0x94B2,0x94B4,0x94B6,0x94B7,0x94B8,0x94B9,0x94BA,0x94BC,
+ 0x94BD,0x94BF,0x94C4,0x94C8,0x94C9,0x94CA,0x94CB,0x94CC,
+ 0x94CD,0x94CE,0x94D0,0x94D1,0x94D2,0x94D5,0x94D6,0x94D7,
+ 0x94D9,0x94D8,0x94DB,0x94DE,0x94DF,0x94E0,0x94E2,0x94E4,
+ 0x94E5,0x94E7,0x94E8,0x94EA,0x986F,0x9870,0x9871,0x9872,
+ 0x9873,0x9874,0x988B,0x988E,0x9892,0x9895,0x9899,0x98A3,
+ 0x98A8,0x98A9,0x98AA,0x98AB,0x98AC,0x98AD,0x98AE,0x98AF,
+ 0x98B0,0x98B1,0x98B2,0x98B3,0x98B4,0x98B5,0x98B6,0x98B7,
+ 0x98B8,0x98B9,0x98BA,0x98BB,0x98BC,0x98BD,0x98BE,0x98BF,
+ 0x98C0,0x98C1,0x98C2,0x98C3,0x98C4,0x98C5,0x98C6,0x98C7,
+ 0x98C8,0x98C9,0x98CA,0x98CB,0x98CC,0x98CD,0x98CF,0x98D0,
+ 0x98D4,0x98D6,0x98D7,0x98DB,0x98DC,0x98DD,0x98E0,0x98E1,
+ 0x98E2,0x98E3,0x98E4,0x98E5,0x98E6,0x98E9,0x98EA,0x98EB,
+ 0x98EC,0x98ED,0x98EE,0x98EF,0x98F0,0x98F1,0x98F2,0x98F3,
+ 0x98F4,0x98F5,0x98F6,0x98F7,0x98F8,0x98F9,0x98FA,0x98FB,
+ 0x98FC,0x98FD,0x98FE,0x98FF,0x9900,0x9901,0x9902,0x9903,
+ 0x9904,0x9905,0x9906,0x9907,0x94E9,0x94EB,0x94EE,0x94EF,
+ 0x94F3,0x94F4,0x94F5,0x94F7,0x94F9,0x94FC,0x94FD,0x94FF,
+ 0x9503,0x9502,0x9506,0x9507,0x9509,0x950A,0x950D,0x950E,
+ 0x950F,0x9512,0x9513,0x9514,0x9515,0x9516,0x9518,0x951B,
+ 0x951D,0x951E,0x951F,0x9522,0x952A,0x952B,0x9529,0x952C,
+ 0x9531,0x9532,0x9534,0x9536,0x9537,0x9538,0x953C,0x953E,
+ 0x953F,0x9542,0x9535,0x9544,0x9545,0x9546,0x9549,0x954C,
+ 0x954E,0x954F,0x9552,0x9553,0x9554,0x9556,0x9557,0x9558,
+ 0x9559,0x955B,0x955E,0x955F,0x955D,0x9561,0x9562,0x9564,
+ 0x9565,0x9566,0x9567,0x9568,0x9569,0x956A,0x956B,0x956C,
+ 0x956F,0x9571,0x9572,0x9573,0x953A,0x77E7,0x77EC,0x96C9,
+ 0x79D5,0x79ED,0x79E3,0x79EB,0x7A06,0x5D47,0x7A03,0x7A02,
+ 0x7A1E,0x7A14,0x9908,0x9909,0x990A,0x990B,0x990C,0x990E,
+ 0x990F,0x9911,0x9912,0x9913,0x9914,0x9915,0x9916,0x9917,
+ 0x9918,0x9919,0x991A,0x991B,0x991C,0x991D,0x991E,0x991F,
+ 0x9920,0x9921,0x9922,0x9923,0x9924,0x9925,0x9926,0x9927,
+ 0x9928,0x9929,0x992A,0x992B,0x992C,0x992D,0x992F,0x9930,
+ 0x9931,0x9932,0x9933,0x9934,0x9935,0x9936,0x9937,0x9938,
+ 0x9939,0x993A,0x993B,0x993C,0x993D,0x993E,0x993F,0x9940,
+ 0x9941,0x9942,0x9943,0x9944,0x9945,0x9946,0x9947,0x9948,
+ 0x9949,0x994A,0x994B,0x994C,0x994D,0x994E,0x994F,0x9950,
+ 0x9951,0x9952,0x9953,0x9956,0x9957,0x9958,0x9959,0x995A,
+ 0x995B,0x995C,0x995D,0x995E,0x995F,0x9960,0x9961,0x9962,
+ 0x9964,0x9966,0x9973,0x9978,0x9979,0x997B,0x997E,0x9982,
+ 0x9983,0x9989,0x7A39,0x7A37,0x7A51,0x9ECF,0x99A5,0x7A70,
+ 0x7688,0x768E,0x7693,0x7699,0x76A4,0x74DE,0x74E0,0x752C,
+ 0x9E20,0x9E22,0x9E28,0x9E29,0x9E2A,0x9E2B,0x9E2C,0x9E32,
+ 0x9E31,0x9E36,0x9E38,0x9E37,0x9E39,0x9E3A,0x9E3E,0x9E41,
+ 0x9E42,0x9E44,0x9E46,0x9E47,0x9E48,0x9E49,0x9E4B,0x9E4C,
+ 0x9E4E,0x9E51,0x9E55,0x9E57,0x9E5A,0x9E5B,0x9E5C,0x9E5E,
+ 0x9E63,0x9E66,0x9E67,0x9E68,0x9E69,0x9E6A,0x9E6B,0x9E6C,
+ 0x9E71,0x9E6D,0x9E73,0x7592,0x7594,0x7596,0x75A0,0x759D,
+ 0x75AC,0x75A3,0x75B3,0x75B4,0x75B8,0x75C4,0x75B1,0x75B0,
+ 0x75C3,0x75C2,0x75D6,0x75CD,0x75E3,0x75E8,0x75E6,0x75E4,
+ 0x75EB,0x75E7,0x7603,0x75F1,0x75FC,0x75FF,0x7610,0x7600,
+ 0x7605,0x760C,0x7617,0x760A,0x7625,0x7618,0x7615,0x7619,
+ 0x998C,0x998E,0x999A,0x999B,0x999C,0x999D,0x999E,0x999F,
+ 0x99A0,0x99A1,0x99A2,0x99A3,0x99A4,0x99A6,0x99A7,0x99A9,
+ 0x99AA,0x99AB,0x99AC,0x99AD,0x99AE,0x99AF,0x99B0,0x99B1,
+ 0x99B2,0x99B3,0x99B4,0x99B5,0x99B6,0x99B7,0x99B8,0x99B9,
+ 0x99BA,0x99BB,0x99BC,0x99BD,0x99BE,0x99BF,0x99C0,0x99C1,
+ 0x99C2,0x99C3,0x99C4,0x99C5,0x99C6,0x99C7,0x99C8,0x99C9,
+ 0x99CA,0x99CB,0x99CC,0x99CD,0x99CE,0x99CF,0x99D0,0x99D1,
+ 0x99D2,0x99D3,0x99D4,0x99D5,0x99D6,0x99D7,0x99D8,0x99D9,
+ 0x99DA,0x99DB,0x99DC,0x99DD,0x99DE,0x99DF,0x99E0,0x99E1,
+ 0x99E2,0x99E3,0x99E4,0x99E5,0x99E6,0x99E7,0x99E8,0x99E9,
+ 0x99EA,0x99EB,0x99EC,0x99ED,0x99EE,0x99EF,0x99F0,0x99F1,
+ 0x99F2,0x99F3,0x99F4,0x99F5,0x99F6,0x99F7,0x99F8,0x99F9,
+ 0x761B,0x763C,0x7622,0x7620,0x7640,0x762D,0x7630,0x763F,
+ 0x7635,0x7643,0x763E,0x7633,0x764D,0x765E,0x7654,0x765C,
+ 0x7656,0x766B,0x766F,0x7FCA,0x7AE6,0x7A78,0x7A79,0x7A80,
+ 0x7A86,0x7A88,0x7A95,0x7AA6,0x7AA0,0x7AAC,0x7AA8,0x7AAD,
+ 0x7AB3,0x8864,0x8869,0x8872,0x887D,0x887F,0x8882,0x88A2,
+ 0x88C6,0x88B7,0x88BC,0x88C9,0x88E2,0x88CE,0x88E3,0x88E5,
+ 0x88F1,0x891A,0x88FC,0x88E8,0x88FE,0x88F0,0x8921,0x8919,
+ 0x8913,0x891B,0x890A,0x8934,0x892B,0x8936,0x8941,0x8966,
+ 0x897B,0x758B,0x80E5,0x76B2,0x76B4,0x77DC,0x8012,0x8014,
+ 0x8016,0x801C,0x8020,0x8022,0x8025,0x8026,0x8027,0x8029,
+ 0x8028,0x8031,0x800B,0x8035,0x8043,0x8046,0x804D,0x8052,
+ 0x8069,0x8071,0x8983,0x9878,0x9880,0x9883,0x99FA,0x99FB,
+ 0x99FC,0x99FD,0x99FE,0x99FF,0x9A00,0x9A01,0x9A02,0x9A03,
+ 0x9A04,0x9A05,0x9A06,0x9A07,0x9A08,0x9A09,0x9A0A,0x9A0B,
+ 0x9A0C,0x9A0D,0x9A0E,0x9A0F,0x9A10,0x9A11,0x9A12,0x9A13,
+ 0x9A14,0x9A15,0x9A16,0x9A17,0x9A18,0x9A19,0x9A1A,0x9A1B,
+ 0x9A1C,0x9A1D,0x9A1E,0x9A1F,0x9A20,0x9A21,0x9A22,0x9A23,
+ 0x9A24,0x9A25,0x9A26,0x9A27,0x9A28,0x9A29,0x9A2A,0x9A2B,
+ 0x9A2C,0x9A2D,0x9A2E,0x9A2F,0x9A30,0x9A31,0x9A32,0x9A33,
+ 0x9A34,0x9A35,0x9A36,0x9A37,0x9A38,0x9A39,0x9A3A,0x9A3B,
+ 0x9A3C,0x9A3D,0x9A3E,0x9A3F,0x9A40,0x9A41,0x9A42,0x9A43,
+ 0x9A44,0x9A45,0x9A46,0x9A47,0x9A48,0x9A49,0x9A4A,0x9A4B,
+ 0x9A4C,0x9A4D,0x9A4E,0x9A4F,0x9A50,0x9A51,0x9A52,0x9A53,
+ 0x9A54,0x9A55,0x9A56,0x9A57,0x9A58,0x9A59,0x9889,0x988C,
+ 0x988D,0x988F,0x9894,0x989A,0x989B,0x989E,0x989F,0x98A1,
+ 0x98A2,0x98A5,0x98A6,0x864D,0x8654,0x866C,0x866E,0x867F,
+ 0x867A,0x867C,0x867B,0x86A8,0x868D,0x868B,0x86AC,0x869D,
+ 0x86A7,0x86A3,0x86AA,0x8693,0x86A9,0x86B6,0x86C4,0x86B5,
+ 0x86CE,0x86B0,0x86BA,0x86B1,0x86AF,0x86C9,0x86CF,0x86B4,
+ 0x86E9,0x86F1,0x86F2,0x86ED,0x86F3,0x86D0,0x8713,0x86DE,
+ 0x86F4,0x86DF,0x86D8,0x86D1,0x8703,0x8707,0x86F8,0x8708,
+ 0x870A,0x870D,0x8709,0x8723,0x873B,0x871E,0x8725,0x872E,
+ 0x871A,0x873E,0x8748,0x8734,0x8731,0x8729,0x8737,0x873F,
+ 0x8782,0x8722,0x877D,0x877E,0x877B,0x8760,0x8770,0x874C,
+ 0x876E,0x878B,0x8753,0x8763,0x877C,0x8764,0x8759,0x8765,
+ 0x8793,0x87AF,0x87A8,0x87D2,0x9A5A,0x9A5B,0x9A5C,0x9A5D,
+ 0x9A5E,0x9A5F,0x9A60,0x9A61,0x9A62,0x9A63,0x9A64,0x9A65,
+ 0x9A66,0x9A67,0x9A68,0x9A69,0x9A6A,0x9A6B,0x9A72,0x9A83,
+ 0x9A89,0x9A8D,0x9A8E,0x9A94,0x9A95,0x9A99,0x9AA6,0x9AA9,
+ 0x9AAA,0x9AAB,0x9AAC,0x9AAD,0x9AAE,0x9AAF,0x9AB2,0x9AB3,
+ 0x9AB4,0x9AB5,0x9AB9,0x9ABB,0x9ABD,0x9ABE,0x9ABF,0x9AC3,
+ 0x9AC4,0x9AC6,0x9AC7,0x9AC8,0x9AC9,0x9ACA,0x9ACD,0x9ACE,
+ 0x9ACF,0x9AD0,0x9AD2,0x9AD4,0x9AD5,0x9AD6,0x9AD7,0x9AD9,
+ 0x9ADA,0x9ADB,0x9ADC,0x9ADD,0x9ADE,0x9AE0,0x9AE2,0x9AE3,
+ 0x9AE4,0x9AE5,0x9AE7,0x9AE8,0x9AE9,0x9AEA,0x9AEC,0x9AEE,
+ 0x9AF0,0x9AF1,0x9AF2,0x9AF3,0x9AF4,0x9AF5,0x9AF6,0x9AF7,
+ 0x9AF8,0x9AFA,0x9AFC,0x9AFD,0x9AFE,0x9AFF,0x9B00,0x9B01,
+ 0x9B02,0x9B04,0x9B05,0x9B06,0x87C6,0x8788,0x8785,0x87AD,
+ 0x8797,0x8783,0x87AB,0x87E5,0x87AC,0x87B5,0x87B3,0x87CB,
+ 0x87D3,0x87BD,0x87D1,0x87C0,0x87CA,0x87DB,0x87EA,0x87E0,
+ 0x87EE,0x8816,0x8813,0x87FE,0x880A,0x881B,0x8821,0x8839,
+ 0x883C,0x7F36,0x7F42,0x7F44,0x7F45,0x8210,0x7AFA,0x7AFD,
+ 0x7B08,0x7B03,0x7B04,0x7B15,0x7B0A,0x7B2B,0x7B0F,0x7B47,
+ 0x7B38,0x7B2A,0x7B19,0x7B2E,0x7B31,0x7B20,0x7B25,0x7B24,
+ 0x7B33,0x7B3E,0x7B1E,0x7B58,0x7B5A,0x7B45,0x7B75,0x7B4C,
+ 0x7B5D,0x7B60,0x7B6E,0x7B7B,0x7B62,0x7B72,0x7B71,0x7B90,
+ 0x7BA6,0x7BA7,0x7BB8,0x7BAC,0x7B9D,0x7BA8,0x7B85,0x7BAA,
+ 0x7B9C,0x7BA2,0x7BAB,0x7BB4,0x7BD1,0x7BC1,0x7BCC,0x7BDD,
+ 0x7BDA,0x7BE5,0x7BE6,0x7BEA,0x7C0C,0x7BFE,0x7BFC,0x7C0F,
+ 0x7C16,0x7C0B,0x9B07,0x9B09,0x9B0A,0x9B0B,0x9B0C,0x9B0D,
+ 0x9B0E,0x9B10,0x9B11,0x9B12,0x9B14,0x9B15,0x9B16,0x9B17,
+ 0x9B18,0x9B19,0x9B1A,0x9B1B,0x9B1C,0x9B1D,0x9B1E,0x9B20,
+ 0x9B21,0x9B22,0x9B24,0x9B25,0x9B26,0x9B27,0x9B28,0x9B29,
+ 0x9B2A,0x9B2B,0x9B2C,0x9B2D,0x9B2E,0x9B30,0x9B31,0x9B33,
+ 0x9B34,0x9B35,0x9B36,0x9B37,0x9B38,0x9B39,0x9B3A,0x9B3D,
+ 0x9B3E,0x9B3F,0x9B40,0x9B46,0x9B4A,0x9B4B,0x9B4C,0x9B4E,
+ 0x9B50,0x9B52,0x9B53,0x9B55,0x9B56,0x9B57,0x9B58,0x9B59,
+ 0x9B5A,0x9B5B,0x9B5C,0x9B5D,0x9B5E,0x9B5F,0x9B60,0x9B61,
+ 0x9B62,0x9B63,0x9B64,0x9B65,0x9B66,0x9B67,0x9B68,0x9B69,
+ 0x9B6A,0x9B6B,0x9B6C,0x9B6D,0x9B6E,0x9B6F,0x9B70,0x9B71,
+ 0x9B72,0x9B73,0x9B74,0x9B75,0x9B76,0x9B77,0x9B78,0x9B79,
+ 0x9B7A,0x9B7B,0x7C1F,0x7C2A,0x7C26,0x7C38,0x7C41,0x7C40,
+ 0x81FE,0x8201,0x8202,0x8204,0x81EC,0x8844,0x8221,0x8222,
+ 0x8223,0x822D,0x822F,0x8228,0x822B,0x8238,0x823B,0x8233,
+ 0x8234,0x823E,0x8244,0x8249,0x824B,0x824F,0x825A,0x825F,
+ 0x8268,0x887E,0x8885,0x8888,0x88D8,0x88DF,0x895E,0x7F9D,
+ 0x7F9F,0x7FA7,0x7FAF,0x7FB0,0x7FB2,0x7C7C,0x6549,0x7C91,
+ 0x7C9D,0x7C9C,0x7C9E,0x7CA2,0x7CB2,0x7CBC,0x7CBD,0x7CC1,
+ 0x7CC7,0x7CCC,0x7CCD,0x7CC8,0x7CC5,0x7CD7,0x7CE8,0x826E,
+ 0x66A8,0x7FBF,0x7FCE,0x7FD5,0x7FE5,0x7FE1,0x7FE6,0x7FE9,
+ 0x7FEE,0x7FF3,0x7CF8,0x7D77,0x7DA6,0x7DAE,0x7E47,0x7E9B,
+ 0x9EB8,0x9EB4,0x8D73,0x8D84,0x8D94,0x8D91,0x8DB1,0x8D67,
+ 0x8D6D,0x8C47,0x8C49,0x914A,0x9150,0x914E,0x914F,0x9164,
+ 0x9B7C,0x9B7D,0x9B7E,0x9B7F,0x9B80,0x9B81,0x9B82,0x9B83,
+ 0x9B84,0x9B85,0x9B86,0x9B87,0x9B88,0x9B89,0x9B8A,0x9B8B,
+ 0x9B8C,0x9B8D,0x9B8E,0x9B8F,0x9B90,0x9B91,0x9B92,0x9B93,
+ 0x9B94,0x9B95,0x9B96,0x9B97,0x9B98,0x9B99,0x9B9A,0x9B9B,
+ 0x9B9C,0x9B9D,0x9B9E,0x9B9F,0x9BA0,0x9BA1,0x9BA2,0x9BA3,
+ 0x9BA4,0x9BA5,0x9BA6,0x9BA7,0x9BA8,0x9BA9,0x9BAA,0x9BAB,
+ 0x9BAC,0x9BAD,0x9BAE,0x9BAF,0x9BB0,0x9BB1,0x9BB2,0x9BB3,
+ 0x9BB4,0x9BB5,0x9BB6,0x9BB7,0x9BB8,0x9BB9,0x9BBA,0x9BBB,
+ 0x9BBC,0x9BBD,0x9BBE,0x9BBF,0x9BC0,0x9BC1,0x9BC2,0x9BC3,
+ 0x9BC4,0x9BC5,0x9BC6,0x9BC7,0x9BC8,0x9BC9,0x9BCA,0x9BCB,
+ 0x9BCC,0x9BCD,0x9BCE,0x9BCF,0x9BD0,0x9BD1,0x9BD2,0x9BD3,
+ 0x9BD4,0x9BD5,0x9BD6,0x9BD7,0x9BD8,0x9BD9,0x9BDA,0x9BDB,
+ 0x9162,0x9161,0x9170,0x9169,0x916F,0x917D,0x917E,0x9172,
+ 0x9174,0x9179,0x918C,0x9185,0x9190,0x918D,0x9191,0x91A2,
+ 0x91A3,0x91AA,0x91AD,0x91AE,0x91AF,0x91B5,0x91B4,0x91BA,
+ 0x8C55,0x9E7E,0x8DB8,0x8DEB,0x8E05,0x8E59,0x8E69,0x8DB5,
+ 0x8DBF,0x8DBC,0x8DBA,0x8DC4,0x8DD6,0x8DD7,0x8DDA,0x8DDE,
+ 0x8DCE,0x8DCF,0x8DDB,0x8DC6,0x8DEC,0x8DF7,0x8DF8,0x8DE3,
+ 0x8DF9,0x8DFB,0x8DE4,0x8E09,0x8DFD,0x8E14,0x8E1D,0x8E1F,
+ 0x8E2C,0x8E2E,0x8E23,0x8E2F,0x8E3A,0x8E40,0x8E39,0x8E35,
+ 0x8E3D,0x8E31,0x8E49,0x8E41,0x8E42,0x8E51,0x8E52,0x8E4A,
+ 0x8E70,0x8E76,0x8E7C,0x8E6F,0x8E74,0x8E85,0x8E8F,0x8E94,
+ 0x8E90,0x8E9C,0x8E9E,0x8C78,0x8C82,0x8C8A,0x8C85,0x8C98,
+ 0x8C94,0x659B,0x89D6,0x89DE,0x89DA,0x89DC,0x9BDC,0x9BDD,
+ 0x9BDE,0x9BDF,0x9BE0,0x9BE1,0x9BE2,0x9BE3,0x9BE4,0x9BE5,
+ 0x9BE6,0x9BE7,0x9BE8,0x9BE9,0x9BEA,0x9BEB,0x9BEC,0x9BED,
+ 0x9BEE,0x9BEF,0x9BF0,0x9BF1,0x9BF2,0x9BF3,0x9BF4,0x9BF5,
+ 0x9BF6,0x9BF7,0x9BF8,0x9BF9,0x9BFA,0x9BFB,0x9BFC,0x9BFD,
+ 0x9BFE,0x9BFF,0x9C00,0x9C01,0x9C02,0x9C03,0x9C04,0x9C05,
+ 0x9C06,0x9C07,0x9C08,0x9C09,0x9C0A,0x9C0B,0x9C0C,0x9C0D,
+ 0x9C0E,0x9C0F,0x9C10,0x9C11,0x9C12,0x9C13,0x9C14,0x9C15,
+ 0x9C16,0x9C17,0x9C18,0x9C19,0x9C1A,0x9C1B,0x9C1C,0x9C1D,
+ 0x9C1E,0x9C1F,0x9C20,0x9C21,0x9C22,0x9C23,0x9C24,0x9C25,
+ 0x9C26,0x9C27,0x9C28,0x9C29,0x9C2A,0x9C2B,0x9C2C,0x9C2D,
+ 0x9C2E,0x9C2F,0x9C30,0x9C31,0x9C32,0x9C33,0x9C34,0x9C35,
+ 0x9C36,0x9C37,0x9C38,0x9C39,0x9C3A,0x9C3B,0x89E5,0x89EB,
+ 0x89EF,0x8A3E,0x8B26,0x9753,0x96E9,0x96F3,0x96EF,0x9706,
+ 0x9701,0x9708,0x970F,0x970E,0x972A,0x972D,0x9730,0x973E,
+ 0x9F80,0x9F83,0x9F85,0x9F86,0x9F87,0x9F88,0x9F89,0x9F8A,
+ 0x9F8C,0x9EFE,0x9F0B,0x9F0D,0x96B9,0x96BC,0x96BD,0x96CE,
+ 0x96D2,0x77BF,0x96E0,0x928E,0x92AE,0x92C8,0x933E,0x936A,
+ 0x93CA,0x938F,0x943E,0x946B,0x9C7F,0x9C82,0x9C85,0x9C86,
+ 0x9C87,0x9C88,0x7A23,0x9C8B,0x9C8E,0x9C90,0x9C91,0x9C92,
+ 0x9C94,0x9C95,0x9C9A,0x9C9B,0x9C9E,0x9C9F,0x9CA0,0x9CA1,
+ 0x9CA2,0x9CA3,0x9CA5,0x9CA6,0x9CA7,0x9CA8,0x9CA9,0x9CAB,
+ 0x9CAD,0x9CAE,0x9CB0,0x9CB1,0x9CB2,0x9CB3,0x9CB4,0x9CB5,
+ 0x9CB6,0x9CB7,0x9CBA,0x9CBB,0x9CBC,0x9CBD,0x9CC4,0x9CC5,
+ 0x9CC6,0x9CC7,0x9CCA,0x9CCB,0x9C3C,0x9C3D,0x9C3E,0x9C3F,
+ 0x9C40,0x9C41,0x9C42,0x9C43,0x9C44,0x9C45,0x9C46,0x9C47,
+ 0x9C48,0x9C49,0x9C4A,0x9C4B,0x9C4C,0x9C4D,0x9C4E,0x9C4F,
+ 0x9C50,0x9C51,0x9C52,0x9C53,0x9C54,0x9C55,0x9C56,0x9C57,
+ 0x9C58,0x9C59,0x9C5A,0x9C5B,0x9C5C,0x9C5D,0x9C5E,0x9C5F,
+ 0x9C60,0x9C61,0x9C62,0x9C63,0x9C64,0x9C65,0x9C66,0x9C67,
+ 0x9C68,0x9C69,0x9C6A,0x9C6B,0x9C6C,0x9C6D,0x9C6E,0x9C6F,
+ 0x9C70,0x9C71,0x9C72,0x9C73,0x9C74,0x9C75,0x9C76,0x9C77,
+ 0x9C78,0x9C79,0x9C7A,0x9C7B,0x9C7D,0x9C7E,0x9C80,0x9C83,
+ 0x9C84,0x9C89,0x9C8A,0x9C8C,0x9C8F,0x9C93,0x9C96,0x9C97,
+ 0x9C98,0x9C99,0x9C9D,0x9CAA,0x9CAC,0x9CAF,0x9CB9,0x9CBE,
+ 0x9CBF,0x9CC0,0x9CC1,0x9CC2,0x9CC8,0x9CC9,0x9CD1,0x9CD2,
+ 0x9CDA,0x9CDB,0x9CE0,0x9CE1,0x9CCC,0x9CCD,0x9CCE,0x9CCF,
+ 0x9CD0,0x9CD3,0x9CD4,0x9CD5,0x9CD7,0x9CD8,0x9CD9,0x9CDC,
+ 0x9CDD,0x9CDF,0x9CE2,0x977C,0x9785,0x9791,0x9792,0x9794,
+ 0x97AF,0x97AB,0x97A3,0x97B2,0x97B4,0x9AB1,0x9AB0,0x9AB7,
+ 0x9E58,0x9AB6,0x9ABA,0x9ABC,0x9AC1,0x9AC0,0x9AC5,0x9AC2,
+ 0x9ACB,0x9ACC,0x9AD1,0x9B45,0x9B43,0x9B47,0x9B49,0x9B48,
+ 0x9B4D,0x9B51,0x98E8,0x990D,0x992E,0x9955,0x9954,0x9ADF,
+ 0x9AE1,0x9AE6,0x9AEF,0x9AEB,0x9AFB,0x9AED,0x9AF9,0x9B08,
+ 0x9B0F,0x9B13,0x9B1F,0x9B23,0x9EBD,0x9EBE,0x7E3B,0x9E82,
+ 0x9E87,0x9E88,0x9E8B,0x9E92,0x93D6,0x9E9D,0x9E9F,0x9EDB,
+ 0x9EDC,0x9EDD,0x9EE0,0x9EDF,0x9EE2,0x9EE9,0x9EE7,0x9EE5,
+ 0x9EEA,0x9EEF,0x9F22,0x9F2C,0x9F2F,0x9F39,0x9F37,0x9F3D,
+ 0x9F3E,0x9F44,0x9CE3,0x9CE4,0x9CE5,0x9CE6,0x9CE7,0x9CE8,
+ 0x9CE9,0x9CEA,0x9CEB,0x9CEC,0x9CED,0x9CEE,0x9CEF,0x9CF0,
+ 0x9CF1,0x9CF2,0x9CF3,0x9CF4,0x9CF5,0x9CF6,0x9CF7,0x9CF8,
+ 0x9CF9,0x9CFA,0x9CFB,0x9CFC,0x9CFD,0x9CFE,0x9CFF,0x9D00,
+ 0x9D01,0x9D02,0x9D03,0x9D04,0x9D05,0x9D06,0x9D07,0x9D08,
+ 0x9D09,0x9D0A,0x9D0B,0x9D0C,0x9D0D,0x9D0E,0x9D0F,0x9D10,
+ 0x9D11,0x9D12,0x9D13,0x9D14,0x9D15,0x9D16,0x9D17,0x9D18,
+ 0x9D19,0x9D1A,0x9D1B,0x9D1C,0x9D1D,0x9D1E,0x9D1F,0x9D20,
+ 0x9D21,0x9D22,0x9D23,0x9D24,0x9D25,0x9D26,0x9D27,0x9D28,
+ 0x9D29,0x9D2A,0x9D2B,0x9D2C,0x9D2D,0x9D2E,0x9D2F,0x9D30,
+ 0x9D31,0x9D32,0x9D33,0x9D34,0x9D35,0x9D36,0x9D37,0x9D38,
+ 0x9D39,0x9D3A,0x9D3B,0x9D3C,0x9D3D,0x9D3E,0x9D3F,0x9D40,
+ 0x9D41,0x9D42,0xE234,0xE235,0xE236,0xE237,0xE238,0xE239,
+ 0xE23A,0xE23B,0xE23C,0xE23D,0xE23E,0xE23F,0xE240,0xE241,
+ 0xE242,0xE243,0xE244,0xE245,0xE246,0xE247,0xE248,0xE249,
+ 0xE24A,0xE24B,0xE24C,0xE24D,0xE24E,0xE24F,0xE250,0xE251,
+ 0xE252,0xE253,0xE254,0xE255,0xE256,0xE257,0xE258,0xE259,
+ 0xE25A,0xE25B,0xE25C,0xE25D,0xE25E,0xE25F,0xE260,0xE261,
+ 0xE262,0xE263,0xE264,0xE265,0xE266,0xE267,0xE268,0xE269,
+ 0xE26A,0xE26B,0xE26C,0xE26D,0xE26E,0xE26F,0xE270,0xE271,
+ 0xE272,0xE273,0xE274,0xE275,0xE276,0xE277,0xE278,0xE279,
+ 0xE27A,0xE27B,0xE27C,0xE27D,0xE27E,0xE27F,0xE280,0xE281,
+ 0xE282,0xE283,0xE284,0xE285,0xE286,0xE287,0xE288,0xE289,
+ 0xE28A,0xE28B,0xE28C,0xE28D,0xE28E,0xE28F,0xE290,0xE291,
+ 0x9D43,0x9D44,0x9D45,0x9D46,0x9D47,0x9D48,0x9D49,0x9D4A,
+ 0x9D4B,0x9D4C,0x9D4D,0x9D4E,0x9D4F,0x9D50,0x9D51,0x9D52,
+ 0x9D53,0x9D54,0x9D55,0x9D56,0x9D57,0x9D58,0x9D59,0x9D5A,
+ 0x9D5B,0x9D5C,0x9D5D,0x9D5E,0x9D5F,0x9D60,0x9D61,0x9D62,
+ 0x9D63,0x9D64,0x9D65,0x9D66,0x9D67,0x9D68,0x9D69,0x9D6A,
+ 0x9D6B,0x9D6C,0x9D6D,0x9D6E,0x9D6F,0x9D70,0x9D71,0x9D72,
+ 0x9D73,0x9D74,0x9D75,0x9D76,0x9D77,0x9D78,0x9D79,0x9D7A,
+ 0x9D7B,0x9D7C,0x9D7D,0x9D7E,0x9D7F,0x9D80,0x9D81,0x9D82,
+ 0x9D83,0x9D84,0x9D85,0x9D86,0x9D87,0x9D88,0x9D89,0x9D8A,
+ 0x9D8B,0x9D8C,0x9D8D,0x9D8E,0x9D8F,0x9D90,0x9D91,0x9D92,
+ 0x9D93,0x9D94,0x9D95,0x9D96,0x9D97,0x9D98,0x9D99,0x9D9A,
+ 0x9D9B,0x9D9C,0x9D9D,0x9D9E,0x9D9F,0x9DA0,0x9DA1,0x9DA2,
+ 0xE292,0xE293,0xE294,0xE295,0xE296,0xE297,0xE298,0xE299,
+ 0xE29A,0xE29B,0xE29C,0xE29D,0xE29E,0xE29F,0xE2A0,0xE2A1,
+ 0xE2A2,0xE2A3,0xE2A4,0xE2A5,0xE2A6,0xE2A7,0xE2A8,0xE2A9,
+ 0xE2AA,0xE2AB,0xE2AC,0xE2AD,0xE2AE,0xE2AF,0xE2B0,0xE2B1,
+ 0xE2B2,0xE2B3,0xE2B4,0xE2B5,0xE2B6,0xE2B7,0xE2B8,0xE2B9,
+ 0xE2BA,0xE2BB,0xE2BC,0xE2BD,0xE2BE,0xE2BF,0xE2C0,0xE2C1,
+ 0xE2C2,0xE2C3,0xE2C4,0xE2C5,0xE2C6,0xE2C7,0xE2C8,0xE2C9,
+ 0xE2CA,0xE2CB,0xE2CC,0xE2CD,0xE2CE,0xE2CF,0xE2D0,0xE2D1,
+ 0xE2D2,0xE2D3,0xE2D4,0xE2D5,0xE2D6,0xE2D7,0xE2D8,0xE2D9,
+ 0xE2DA,0xE2DB,0xE2DC,0xE2DD,0xE2DE,0xE2DF,0xE2E0,0xE2E1,
+ 0xE2E2,0xE2E3,0xE2E4,0xE2E5,0xE2E6,0xE2E7,0xE2E8,0xE2E9,
+ 0xE2EA,0xE2EB,0xE2EC,0xE2ED,0xE2EE,0xE2EF,0x9DA3,0x9DA4,
+ 0x9DA5,0x9DA6,0x9DA7,0x9DA8,0x9DA9,0x9DAA,0x9DAB,0x9DAC,
+ 0x9DAD,0x9DAE,0x9DAF,0x9DB0,0x9DB1,0x9DB2,0x9DB3,0x9DB4,
+ 0x9DB5,0x9DB6,0x9DB7,0x9DB8,0x9DB9,0x9DBA,0x9DBB,0x9DBC,
+ 0x9DBD,0x9DBE,0x9DBF,0x9DC0,0x9DC1,0x9DC2,0x9DC3,0x9DC4,
+ 0x9DC5,0x9DC6,0x9DC7,0x9DC8,0x9DC9,0x9DCA,0x9DCB,0x9DCC,
+ 0x9DCD,0x9DCE,0x9DCF,0x9DD0,0x9DD1,0x9DD2,0x9DD3,0x9DD4,
+ 0x9DD5,0x9DD6,0x9DD7,0x9DD8,0x9DD9,0x9DDA,0x9DDB,0x9DDC,
+ 0x9DDD,0x9DDE,0x9DDF,0x9DE0,0x9DE1,0x9DE2,0x9DE3,0x9DE4,
+ 0x9DE5,0x9DE6,0x9DE7,0x9DE8,0x9DE9,0x9DEA,0x9DEB,0x9DEC,
+ 0x9DED,0x9DEE,0x9DEF,0x9DF0,0x9DF1,0x9DF2,0x9DF3,0x9DF4,
+ 0x9DF5,0x9DF6,0x9DF7,0x9DF8,0x9DF9,0x9DFA,0x9DFB,0x9DFC,
+ 0x9DFD,0x9DFE,0x9DFF,0x9E00,0x9E01,0x9E02,0xE2F0,0xE2F1,
+ 0xE2F2,0xE2F3,0xE2F4,0xE2F5,0xE2F6,0xE2F7,0xE2F8,0xE2F9,
+ 0xE2FA,0xE2FB,0xE2FC,0xE2FD,0xE2FE,0xE2FF,0xE300,0xE301,
+ 0xE302,0xE303,0xE304,0xE305,0xE306,0xE307,0xE308,0xE309,
+ 0xE30A,0xE30B,0xE30C,0xE30D,0xE30E,0xE30F,0xE310,0xE311,
+ 0xE312,0xE313,0xE314,0xE315,0xE316,0xE317,0xE318,0xE319,
+ 0xE31A,0xE31B,0xE31C,0xE31D,0xE31E,0xE31F,0xE320,0xE321,
+ 0xE322,0xE323,0xE324,0xE325,0xE326,0xE327,0xE328,0xE329,
+ 0xE32A,0xE32B,0xE32C,0xE32D,0xE32E,0xE32F,0xE330,0xE331,
+ 0xE332,0xE333,0xE334,0xE335,0xE336,0xE337,0xE338,0xE339,
+ 0xE33A,0xE33B,0xE33C,0xE33D,0xE33E,0xE33F,0xE340,0xE341,
+ 0xE342,0xE343,0xE344,0xE345,0xE346,0xE347,0xE348,0xE349,
+ 0xE34A,0xE34B,0xE34C,0xE34D,0x9E03,0x9E04,0x9E05,0x9E06,
+ 0x9E07,0x9E08,0x9E09,0x9E0A,0x9E0B,0x9E0C,0x9E0D,0x9E0E,
+ 0x9E0F,0x9E10,0x9E11,0x9E12,0x9E13,0x9E14,0x9E15,0x9E16,
+ 0x9E17,0x9E18,0x9E19,0x9E1A,0x9E1B,0x9E1C,0x9E1D,0x9E1E,
+ 0x9E24,0x9E27,0x9E2E,0x9E30,0x9E34,0x9E3B,0x9E3C,0x9E40,
+ 0x9E4D,0x9E50,0x9E52,0x9E53,0x9E54,0x9E56,0x9E59,0x9E5D,
+ 0x9E5F,0x9E60,0x9E61,0x9E62,0x9E65,0x9E6E,0x9E6F,0x9E72,
+ 0x9E74,0x9E75,0x9E76,0x9E77,0x9E78,0x9E79,0x9E7A,0x9E7B,
+ 0x9E7C,0x9E7D,0x9E80,0x9E81,0x9E83,0x9E84,0x9E85,0x9E86,
+ 0x9E89,0x9E8A,0x9E8C,0x9E8D,0x9E8E,0x9E8F,0x9E90,0x9E91,
+ 0x9E94,0x9E95,0x9E96,0x9E97,0x9E98,0x9E99,0x9E9A,0x9E9B,
+ 0x9E9C,0x9E9E,0x9EA0,0x9EA1,0x9EA2,0x9EA3,0x9EA4,0x9EA5,
+ 0x9EA7,0x9EA8,0x9EA9,0x9EAA,0xE34E,0xE34F,0xE350,0xE351,
+ 0xE352,0xE353,0xE354,0xE355,0xE356,0xE357,0xE358,0xE359,
+ 0xE35A,0xE35B,0xE35C,0xE35D,0xE35E,0xE35F,0xE360,0xE361,
+ 0xE362,0xE363,0xE364,0xE365,0xE366,0xE367,0xE368,0xE369,
+ 0xE36A,0xE36B,0xE36C,0xE36D,0xE36E,0xE36F,0xE370,0xE371,
+ 0xE372,0xE373,0xE374,0xE375,0xE376,0xE377,0xE378,0xE379,
+ 0xE37A,0xE37B,0xE37C,0xE37D,0xE37E,0xE37F,0xE380,0xE381,
+ 0xE382,0xE383,0xE384,0xE385,0xE386,0xE387,0xE388,0xE389,
+ 0xE38A,0xE38B,0xE38C,0xE38D,0xE38E,0xE38F,0xE390,0xE391,
+ 0xE392,0xE393,0xE394,0xE395,0xE396,0xE397,0xE398,0xE399,
+ 0xE39A,0xE39B,0xE39C,0xE39D,0xE39E,0xE39F,0xE3A0,0xE3A1,
+ 0xE3A2,0xE3A3,0xE3A4,0xE3A5,0xE3A6,0xE3A7,0xE3A8,0xE3A9,
+ 0xE3AA,0xE3AB,0x9EAB,0x9EAC,0x9EAD,0x9EAE,0x9EAF,0x9EB0,
+ 0x9EB1,0x9EB2,0x9EB3,0x9EB5,0x9EB6,0x9EB7,0x9EB9,0x9EBA,
+ 0x9EBC,0x9EBF,0x9EC0,0x9EC1,0x9EC2,0x9EC3,0x9EC5,0x9EC6,
+ 0x9EC7,0x9EC8,0x9ECA,0x9ECB,0x9ECC,0x9ED0,0x9ED2,0x9ED3,
+ 0x9ED5,0x9ED6,0x9ED7,0x9ED9,0x9EDA,0x9EDE,0x9EE1,0x9EE3,
+ 0x9EE4,0x9EE6,0x9EE8,0x9EEB,0x9EEC,0x9EED,0x9EEE,0x9EF0,
+ 0x9EF1,0x9EF2,0x9EF3,0x9EF4,0x9EF5,0x9EF6,0x9EF7,0x9EF8,
+ 0x9EFA,0x9EFD,0x9EFF,0x9F00,0x9F01,0x9F02,0x9F03,0x9F04,
+ 0x9F05,0x9F06,0x9F07,0x9F08,0x9F09,0x9F0A,0x9F0C,0x9F0F,
+ 0x9F11,0x9F12,0x9F14,0x9F15,0x9F16,0x9F18,0x9F1A,0x9F1B,
+ 0x9F1C,0x9F1D,0x9F1E,0x9F1F,0x9F21,0x9F23,0x9F24,0x9F25,
+ 0x9F26,0x9F27,0x9F28,0x9F29,0x9F2A,0x9F2B,0x9F2D,0x9F2E,
+ 0x9F30,0x9F31,0xE3AC,0xE3AD,0xE3AE,0xE3AF,0xE3B0,0xE3B1,
+ 0xE3B2,0xE3B3,0xE3B4,0xE3B5,0xE3B6,0xE3B7,0xE3B8,0xE3B9,
+ 0xE3BA,0xE3BB,0xE3BC,0xE3BD,0xE3BE,0xE3BF,0xE3C0,0xE3C1,
+ 0xE3C2,0xE3C3,0xE3C4,0xE3C5,0xE3C6,0xE3C7,0xE3C8,0xE3C9,
+ 0xE3CA,0xE3CB,0xE3CC,0xE3CD,0xE3CE,0xE3CF,0xE3D0,0xE3D1,
+ 0xE3D2,0xE3D3,0xE3D4,0xE3D5,0xE3D6,0xE3D7,0xE3D8,0xE3D9,
+ 0xE3DA,0xE3DB,0xE3DC,0xE3DD,0xE3DE,0xE3DF,0xE3E0,0xE3E1,
+ 0xE3E2,0xE3E3,0xE3E4,0xE3E5,0xE3E6,0xE3E7,0xE3E8,0xE3E9,
+ 0xE3EA,0xE3EB,0xE3EC,0xE3ED,0xE3EE,0xE3EF,0xE3F0,0xE3F1,
+ 0xE3F2,0xE3F3,0xE3F4,0xE3F5,0xE3F6,0xE3F7,0xE3F8,0xE3F9,
+ 0xE3FA,0xE3FB,0xE3FC,0xE3FD,0xE3FE,0xE3FF,0xE400,0xE401,
+ 0xE402,0xE403,0xE404,0xE405,0xE406,0xE407,0xE408,0xE409,
+ 0x9F32,0x9F33,0x9F34,0x9F35,0x9F36,0x9F38,0x9F3A,0x9F3C,
+ 0x9F3F,0x9F40,0x9F41,0x9F42,0x9F43,0x9F45,0x9F46,0x9F47,
+ 0x9F48,0x9F49,0x9F4A,0x9F4B,0x9F4C,0x9F4D,0x9F4E,0x9F4F,
+ 0x9F52,0x9F53,0x9F54,0x9F55,0x9F56,0x9F57,0x9F58,0x9F59,
+ 0x9F5A,0x9F5B,0x9F5C,0x9F5D,0x9F5E,0x9F5F,0x9F60,0x9F61,
+ 0x9F62,0x9F63,0x9F64,0x9F65,0x9F66,0x9F67,0x9F68,0x9F69,
+ 0x9F6A,0x9F6B,0x9F6C,0x9F6D,0x9F6E,0x9F6F,0x9F70,0x9F71,
+ 0x9F72,0x9F73,0x9F74,0x9F75,0x9F76,0x9F77,0x9F78,0x9F79,
+ 0x9F7A,0x9F7B,0x9F7C,0x9F7D,0x9F7E,0x9F81,0x9F82,0x9F8D,
+ 0x9F8E,0x9F8F,0x9F90,0x9F91,0x9F92,0x9F93,0x9F94,0x9F95,
+ 0x9F96,0x9F97,0x9F98,0x9F9C,0x9F9D,0x9F9E,0x9FA1,0x9FA2,
+ 0x9FA3,0x9FA4,0x9FA5,0xF92C,0xF979,0xF995,0xF9E7,0xF9F1,
+ 0xE40A,0xE40B,0xE40C,0xE40D,0xE40E,0xE40F,0xE410,0xE411,
+ 0xE412,0xE413,0xE414,0xE415,0xE416,0xE417,0xE418,0xE419,
+ 0xE41A,0xE41B,0xE41C,0xE41D,0xE41E,0xE41F,0xE420,0xE421,
+ 0xE422,0xE423,0xE424,0xE425,0xE426,0xE427,0xE428,0xE429,
+ 0xE42A,0xE42B,0xE42C,0xE42D,0xE42E,0xE42F,0xE430,0xE431,
+ 0xE432,0xE433,0xE434,0xE435,0xE436,0xE437,0xE438,0xE439,
+ 0xE43A,0xE43B,0xE43C,0xE43D,0xE43E,0xE43F,0xE440,0xE441,
+ 0xE442,0xE443,0xE444,0xE445,0xE446,0xE447,0xE448,0xE449,
+ 0xE44A,0xE44B,0xE44C,0xE44D,0xE44E,0xE44F,0xE450,0xE451,
+ 0xE452,0xE453,0xE454,0xE455,0xE456,0xE457,0xE458,0xE459,
+ 0xE45A,0xE45B,0xE45C,0xE45D,0xE45E,0xE45F,0xE460,0xE461,
+ 0xE462,0xE463,0xE464,0xE465,0xE466,0xE467,0xFA0C,0xFA0D,
+ 0xFA0E,0xFA0F,0xFA11,0xFA13,0xFA14,0xFA18,0xFA1F,0xFA20,
+ 0xFA21,0xFA23,0xFA24,0xFA27,0xFA28,0xFA29,0x2E81,0xE816,
+ 0xE817,0xE818,0x2E84,0x3473,0x3447,0x2E88,0x2E8B,0xE81E,
+ 0x359E,0x361A,0x360E,0x2E8C,0x2E97,0x396E,0x3918,0xE826,
+ 0x39CF,0x39DF,0x3A73,0x39D0,0xE82B,0xE82C,0x3B4E,0x3C6E,
+ 0x3CE0,0x2EA7,0xE831,0xE832,0x2EAA,0x4056,0x415F,0x2EAE,
+ 0x4337,0x2EB3,0x2EB6,0x2EB7,0xE83B,0x43B1,0x43AC,0x2EBB,
+ 0x43DD,0x44D6,0x4661,0x464C,0xE843,0x4723,0x4729,0x477C,
+ 0x478D,0x2ECA,0x4947,0x497A,0x497D,0x4982,0x4983,0x4985,
+ 0x4986,0x499F,0x499B,0x49B7,0x49B6,0xE854,0xE855,0x4CA3,
+ 0x4C9F,0x4CA0,0x4CA1,0x4C77,0x4CA2,0x4D13,0x4D14,0x4D15,
+ 0x4D16,0x4D17,0x4D18,0x4D19,0x4DAE,0xE864,0xE468,0xE469,
+ 0xE46A,0xE46B,0xE46C,0xE46D,0xE46E,0xE46F,0xE470,0xE471,
+ 0xE472,0xE473,0xE474,0xE475,0xE476,0xE477,0xE478,0xE479,
+ 0xE47A,0xE47B,0xE47C,0xE47D,0xE47E,0xE47F,0xE480,0xE481,
+ 0xE482,0xE483,0xE484,0xE485,0xE486,0xE487,0xE488,0xE489,
+ 0xE48A,0xE48B,0xE48C,0xE48D,0xE48E,0xE48F,0xE490,0xE491,
+ 0xE492,0xE493,0xE494,0xE495,0xE496,0xE497,0xE498,0xE499,
+ 0xE49A,0xE49B,0xE49C,0xE49D,0xE49E,0xE49F,0xE4A0,0xE4A1,
+ 0xE4A2,0xE4A3,0xE4A4,0xE4A5,0xE4A6,0xE4A7,0xE4A8,0xE4A9,
+ 0xE4AA,0xE4AB,0xE4AC,0xE4AD,0xE4AE,0xE4AF,0xE4B0,0xE4B1,
+ 0xE4B2,0xE4B3,0xE4B4,0xE4B5,0xE4B6,0xE4B7,0xE4B8,0xE4B9,
+ 0xE4BA,0xE4BB,0xE4BC,0xE4BD,0xE4BE,0xE4BF,0xE4C0,0xE4C1,
+ 0xE4C2,0xE4C3,0xE4C4,0xE4C5,0x0080,0x0081,0x0082,0x0083,
+ 0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,
+ 0x008C,0x008D,0x008E,0x008F,0x0090,0x0091,0x0092,0x0093,
+ 0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,
+ 0x009C,0x009D,0x009E,0x009F,0x00A0,0x00A1,0x00A2,0x00A3,
+ 0x00A5,0x00A6,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,
+ 0x00AF,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B8,0x00B9,
+ 0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,0x00C0,0x00C1,
+ 0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,0x00C9,
+ 0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,0x00D0,0x00D1,
+ 0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D8,0x00D9,0x00DA,
+ 0x00DB,0x00DC,0x00DD,0x00DE,0x00DF,0x00E2,0x00E3,0x00E4,
+ 0x00E5,0x00E6,0x00E7,0x00EB,0x00EE,0x00EF,0x00F0,0x00F1,
+ 0x00F4,0x00F5,0x00F6,0x00F8,0x00FB,0x00FD,0x00FE,0x00FF,
+ 0x0100,0x0102,0x0103,0x0104,0x0105,0x0106,0x0107,0x0108,
+ 0x0109,0x010A,0x010B,0x010C,0x010D,0x010E,0x010F,0x0110,
+ 0x0111,0x0112,0x0114,0x0115,0x0116,0x0117,0x0118,0x0119,
+ 0x011A,0x011C,0x011D,0x011E,0x011F,0x0120,0x0121,0x0122,
+ 0x0123,0x0124,0x0125,0x0126,0x0127,0x0128,0x0129,0x012A,
+ 0x012C,0x012D,0x012E,0x012F,0x0130,0x0131,0x0132,0x0133,
+ 0x0134,0x0135,0x0136,0x0137,0x0138,0x0139,0x013A,0x013B,
+ 0x013C,0x013D,0x013E,0x013F,0x0140,0x0141,0x0142,0x0143,
+ 0x0145,0x0146,0x0147,0x0149,0x014A,0x014B,0x014C,0x014E,
+ 0x014F,0x0150,0x0151,0x0152,0x0153,0x0154,0x0155,0x0156,
+ 0x0157,0x0158,0x0159,0x015A,0x015B,0x015C,0x015D,0x015E,
+ 0x015F,0x0160,0x0161,0x0162,0x0163,0x0164,0x0165,0x0166,
+ 0x0167,0x0168,0x0169,0x016A,0x016C,0x016D,0x016E,0x016F,
+ 0x0170,0x0171,0x0172,0x0173,0x0174,0x0175,0x0176,0x0177,
+ 0x0178,0x0179,0x017A,0x017B,0x017C,0x017D,0x017E,0x017F,
+ 0x0180,0x0181,0x0182,0x0183,0x0184,0x0185,0x0186,0x0187,
+ 0x0188,0x0189,0x018A,0x018B,0x018C,0x018D,0x018E,0x018F,
+ 0x0190,0x0191,0x0192,0x0193,0x0194,0x0195,0x0196,0x0197,
+ 0x0198,0x0199,0x019A,0x019B,0x019C,0x019D,0x019E,0x019F,
+ 0x01A0,0x01A1,0x01A2,0x01A3,0x01A4,0x01A5,0x01A6,0x01A7,
+ 0x01A8,0x01A9,0x01AA,0x01AB,0x01AC,0x01AD,0x01AE,0x01AF,
+ 0x01B0,0x01B1,0x01B2,0x01B3,0x01B4,0x01B5,0x01B6,0x01B7,
+ 0x01B8,0x01B9,0x01BA,0x01BB,0x01BC,0x01BD,0x01BE,0x01BF,
+ 0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C6,0x01C7,
+ 0x01C8,0x01C9,0x01CA,0x01CB,0x01CC,0x01CD,0x01CF,0x01D1,
+ 0x01D3,0x01D5,0x01D7,0x01D9,0x01DB,0x01DD,0x01DE,0x01DF,
+ 0x01E0,0x01E1,0x01E2,0x01E3,0x01E4,0x01E5,0x01E6,0x01E7,
+ 0x01E8,0x01E9,0x01EA,0x01EB,0x01EC,0x01ED,0x01EE,0x01EF,
+ 0x01F0,0x01F1,0x01F2,0x01F3,0x01F4,0x01F5,0x01F6,0x01F7,
+ 0x01F8,0x01FA,0x01FB,0x01FC,0x01FD,0x01FE,0x01FF,0x0200,
+ 0x0201,0x0202,0x0203,0x0204,0x0205,0x0206,0x0207,0x0208,
+ 0x0209,0x020A,0x020B,0x020C,0x020D,0x020E,0x020F,0x0210,
+ 0x0211,0x0212,0x0213,0x0214,0x0215,0x0216,0x0217,0x0218,
+ 0x0219,0x021A,0x021B,0x021C,0x021D,0x021E,0x021F,0x0220,
+ 0x0221,0x0222,0x0223,0x0224,0x0225,0x0226,0x0227,0x0228,
+ 0x0229,0x022A,0x022B,0x022C,0x022D,0x022E,0x022F,0x0230,
+ 0x0231,0x0232,0x0233,0x0234,0x0235,0x0236,0x0237,0x0238,
+ 0x0239,0x023A,0x023B,0x023C,0x023D,0x023E,0x023F,0x0240,
+ 0x0241,0x0242,0x0243,0x0244,0x0245,0x0246,0x0247,0x0248,
+ 0x0249,0x024A,0x024B,0x024C,0x024D,0x024E,0x024F,0x0250,
+ 0x0252,0x0253,0x0254,0x0255,0x0256,0x0257,0x0258,0x0259,
+ 0x025A,0x025B,0x025C,0x025D,0x025E,0x025F,0x0260,0x0262,
+ 0x0263,0x0264,0x0265,0x0266,0x0267,0x0268,0x0269,0x026A,
+ 0x026B,0x026C,0x026D,0x026E,0x026F,0x0270,0x0271,0x0272,
+ 0x0273,0x0274,0x0275,0x0276,0x0277,0x0278,0x0279,0x027A,
+ 0x027B,0x027C,0x027D,0x027E,0x027F,0x0280,0x0281,0x0282,
+ 0x0283,0x0284,0x0285,0x0286,0x0287,0x0288,0x0289,0x028A,
+ 0x028B,0x028C,0x028D,0x028E,0x028F,0x0290,0x0291,0x0292,
+ 0x0293,0x0294,0x0295,0x0296,0x0297,0x0298,0x0299,0x029A,
+ 0x029B,0x029C,0x029D,0x029E,0x029F,0x02A0,0x02A1,0x02A2,
+ 0x02A3,0x02A4,0x02A5,0x02A6,0x02A7,0x02A8,0x02A9,0x02AA,
+ 0x02AB,0x02AC,0x02AD,0x02AE,0x02AF,0x02B0,0x02B1,0x02B2,
+ 0x02B3,0x02B4,0x02B5,0x02B6,0x02B7,0x02B8,0x02B9,0x02BA,
+ 0x02BB,0x02BC,0x02BD,0x02BE,0x02BF,0x02C0,0x02C1,0x02C2,
+ 0x02C3,0x02C4,0x02C5,0x02C6,0x02C8,0x02CC,0x02CD,0x02CE,
+ 0x02CF,0x02D0,0x02D1,0x02D2,0x02D3,0x02D4,0x02D5,0x02D6,
+ 0x02D7,0x02D8,0x02DA,0x02DB,0x02DC,0x02DD,0x02DE,0x02DF,
+ 0x02E0,0x02E1,0x02E2,0x02E3,0x02E4,0x02E5,0x02E6,0x02E7,
+ 0x02E8,0x02E9,0x02EA,0x02EB,0x02EC,0x02ED,0x02EE,0x02EF,
+ 0x02F0,0x02F1,0x02F2,0x02F3,0x02F4,0x02F5,0x02F6,0x02F7,
+ 0x02F8,0x02F9,0x02FA,0x02FB,0x02FC,0x02FD,0x02FE,0x02FF,
+ 0x0300,0x0301,0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,
+ 0x0308,0x0309,0x030A,0x030B,0x030C,0x030D,0x030E,0x030F,
+ 0x0310,0x0311,0x0312,0x0313,0x0314,0x0315,0x0316,0x0317,
+ 0x0318,0x0319,0x031A,0x031B,0x031C,0x031D,0x031E,0x031F,
+ 0x0320,0x0321,0x0322,0x0323,0x0324,0x0325,0x0326,0x0327,
+ 0x0328,0x0329,0x032A,0x032B,0x032C,0x032D,0x032E,0x032F,
+ 0x0330,0x0331,0x0332,0x0333,0x0334,0x0335,0x0336,0x0337,
+ 0x0338,0x0339,0x033A,0x033B,0x033C,0x033D,0x033E,0x033F,
+ 0x0340,0x0341,0x0342,0x0343,0x0344,0x0345,0x0346,0x0347,
+ 0x0348,0x0349,0x034A,0x034B,0x034C,0x034D,0x034E,0x034F,
+ 0x0350,0x0351,0x0352,0x0353,0x0354,0x0355,0x0356,0x0357,
+ 0x0358,0x0359,0x035A,0x035B,0x035C,0x035D,0x035E,0x035F,
+ 0x0360,0x0361,0x0362,0x0363,0x0364,0x0365,0x0366,0x0367,
+ 0x0368,0x0369,0x036A,0x036B,0x036C,0x036D,0x036E,0x036F,
+ 0x0370,0x0371,0x0372,0x0373,0x0374,0x0375,0x0376,0x0377,
+ 0x0378,0x0379,0x037A,0x037B,0x037C,0x037D,0x037E,0x037F,
+ 0x0380,0x0381,0x0382,0x0383,0x0384,0x0385,0x0386,0x0387,
+ 0x0388,0x0389,0x038A,0x038B,0x038C,0x038D,0x038E,0x038F,
+ 0x0390,0x03A2,0x03AA,0x03AB,0x03AC,0x03AD,0x03AE,0x03AF,
+ 0x03B0,0x03C2,0x03CA,0x03CB,0x03CC,0x03CD,0x03CE,0x03CF,
+ 0x03D0,0x03D1,0x03D2,0x03D3,0x03D4,0x03D5,0x03D6,0x03D7,
+ 0x03D8,0x03D9,0x03DA,0x03DB,0x03DC,0x03DD,0x03DE,0x03DF,
+ 0x03E0,0x03E1,0x03E2,0x03E3,0x03E4,0x03E5,0x03E6,0x03E7,
+ 0x03E8,0x03E9,0x03EA,0x03EB,0x03EC,0x03ED,0x03EE,0x03EF,
+ 0x03F0,0x03F1,0x03F2,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,
+ 0x03F8,0x03F9,0x03FA,0x03FB,0x03FC,0x03FD,0x03FE,0x03FF,
+ 0x0400,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407,0x0408,
+ 0x0409,0x040A,0x040B,0x040C,0x040D,0x040E,0x040F,0x0450,
+ 0x2011,0x2012,0x2017,0x201A,0x201B,0x201E,0x201F,0x2020,
+ 0x2021,0x2022,0x2023,0x2024,0x2027,0x2028,0x2029,0x202A,
+ 0x202B,0x202C,0x202D,0x202E,0x202F,0x2031,0x2034,0x2036,
+ 0x2037,0x2038,0x2039,0x203A,0x203C,0x203D,0x203E,0x203F,
+ 0x2040,0x2041,0x2042,0x2043,0x2044,0x2045,0x2046,0x2047,
+ 0x2048,0x2049,0x204A,0x204B,0x204C,0x204D,0x204E,0x204F,
+ 0x2050,0x2051,0x2052,0x2053,0x2054,0x2055,0x2056,0x2057,
+ 0x2058,0x2059,0x205A,0x205B,0x205C,0x205D,0x205E,0x205F,
+ 0x2060,0x2061,0x2062,0x2063,0x2064,0x2065,0x2066,0x2067,
+ 0x2068,0x2069,0x206A,0x206B,0x206C,0x206D,0x206E,0x206F,
+ 0x2070,0x2071,0x2072,0x2073,0x2074,0x2075,0x2076,0x2077,
+ 0x2078,0x2079,0x207A,0x207B,0x207C,0x207D,0x207E,0x207F,
+ 0x2080,0x2081,0x2082,0x2083,0x2084,0x2085,0x2086,0x2087,
+ 0x2088,0x2089,0x208A,0x208B,0x208C,0x208D,0x208E,0x208F,
+ 0x2090,0x2091,0x2092,0x2093,0x2094,0x2095,0x2096,0x2097,
+ 0x2098,0x2099,0x209A,0x209B,0x209C,0x209D,0x209E,0x209F,
+ 0x20A0,0x20A1,0x20A2,0x20A3,0x20A4,0x20A5,0x20A6,0x20A7,
+ 0x20A8,0x20A9,0x20AA,0x20AB,0x20AD,0x20AE,0x20AF,0x20B0,
+ 0x20B1,0x20B2,0x20B3,0x20B4,0x20B5,0x20B6,0x20B7,0x20B8,
+ 0x20B9,0x20BA,0x20BB,0x20BC,0x20BD,0x20BE,0x20BF,0x20C0,
+ 0x20C1,0x20C2,0x20C3,0x20C4,0x20C5,0x20C6,0x20C7,0x20C8,
+ 0x20C9,0x20CA,0x20CB,0x20CC,0x20CD,0x20CE,0x20CF,0x20D0,
+ 0x20D1,0x20D2,0x20D3,0x20D4,0x20D5,0x20D6,0x20D7,0x20D8,
+ 0x20D9,0x20DA,0x20DB,0x20DC,0x20DD,0x20DE,0x20DF,0x20E0,
+ 0x20E1,0x20E2,0x20E3,0x20E4,0x20E5,0x20E6,0x20E7,0x20E8,
+ 0x20E9,0x20EA,0x20EB,0x20EC,0x20ED,0x20EE,0x20EF,0x20F0,
+ 0x20F1,0x20F2,0x20F3,0x20F4,0x20F5,0x20F6,0x20F7,0x20F8,
+ 0x20F9,0x20FA,0x20FB,0x20FC,0x20FD,0x20FE,0x20FF,0x2100,
+ 0x2101,0x2102,0x2104,0x2106,0x2107,0x2108,0x210A,0x210B,
+ 0x210C,0x210D,0x210E,0x210F,0x2110,0x2111,0x2112,0x2113,
+ 0x2114,0x2115,0x2117,0x2118,0x2119,0x211A,0x211B,0x211C,
+ 0x211D,0x211E,0x211F,0x2120,0x2122,0x2123,0x2124,0x2125,
+ 0x2126,0x2127,0x2128,0x2129,0x212A,0x212B,0x212C,0x212D,
+ 0x212E,0x212F,0x2130,0x2131,0x2132,0x2133,0x2134,0x2135,
+ 0x2136,0x2137,0x2138,0x2139,0x213A,0x213B,0x213C,0x213D,
+ 0x213E,0x213F,0x2140,0x2141,0x2142,0x2143,0x2144,0x2145,
+ 0x2146,0x2147,0x2148,0x2149,0x214A,0x214B,0x214C,0x214D,
+ 0x214E,0x214F,0x2150,0x2151,0x2152,0x2153,0x2154,0x2155,
+ 0x2156,0x2157,0x2158,0x2159,0x215A,0x215B,0x215C,0x215D,
+ 0x215E,0x215F,0x216C,0x216D,0x216E,0x216F,0x217A,0x217B,
+ 0x217C,0x217D,0x217E,0x217F,0x2180,0x2181,0x2182,0x2183,
+ 0x2184,0x2185,0x2186,0x2187,0x2188,0x2189,0x218A,0x218B,
+ 0x218C,0x218D,0x218E,0x218F,0x2194,0x2195,0x219A,0x219B,
+ 0x219C,0x219D,0x219E,0x219F,0x21A0,0x21A1,0x21A2,0x21A3,
+ 0x21A4,0x21A5,0x21A6,0x21A7,0x21A8,0x21A9,0x21AA,0x21AB,
+ 0x21AC,0x21AD,0x21AE,0x21AF,0x21B0,0x21B1,0x21B2,0x21B3,
+ 0x21B4,0x21B5,0x21B6,0x21B7,0x21B8,0x21B9,0x21BA,0x21BB,
+ 0x21BC,0x21BD,0x21BE,0x21BF,0x21C0,0x21C1,0x21C2,0x21C3,
+ 0x21C4,0x21C5,0x21C6,0x21C7,0x21C8,0x21C9,0x21CA,0x21CB,
+ 0x21CC,0x21CD,0x21CE,0x21CF,0x21D0,0x21D1,0x21D2,0x21D3,
+ 0x21D4,0x21D5,0x21D6,0x21D7,0x21D8,0x21D9,0x21DA,0x21DB,
+ 0x21DC,0x21DD,0x21DE,0x21DF,0x21E0,0x21E1,0x21E2,0x21E3,
+ 0x21E4,0x21E5,0x21E6,0x21E7,0x21E8,0x21E9,0x21EA,0x21EB,
+ 0x21EC,0x21ED,0x21EE,0x21EF,0x21F0,0x21F1,0x21F2,0x21F3,
+ 0x21F4,0x21F5,0x21F6,0x21F7,0x21F8,0x21F9,0x21FA,0x21FB,
+ 0x21FC,0x21FD,0x21FE,0x21FF,0x2200,0x2201,0x2202,0x2203,
+ 0x2204,0x2205,0x2206,0x2207,0x2209,0x220A,0x220B,0x220C,
+ 0x220D,0x220E,0x2210,0x2212,0x2213,0x2214,0x2216,0x2217,
+ 0x2218,0x2219,0x221B,0x221C,0x2221,0x2222,0x2224,0x2226,
+ 0x222C,0x222D,0x222F,0x2230,0x2231,0x2232,0x2233,0x2238,
+ 0x2239,0x223A,0x223B,0x223C,0x223E,0x223F,0x2240,0x2241,
+ 0x2242,0x2243,0x2244,0x2245,0x2246,0x2247,0x2249,0x224A,
+ 0x224B,0x224D,0x224E,0x224F,0x2250,0x2251,0x2253,0x2254,
+ 0x2255,0x2256,0x2257,0x2258,0x2259,0x225A,0x225B,0x225C,
+ 0x225D,0x225E,0x225F,0x2262,0x2263,0x2268,0x2269,0x226A,
+ 0x226B,0x226C,0x226D,0x2270,0x2271,0x2272,0x2273,0x2274,
+ 0x2275,0x2276,0x2277,0x2278,0x2279,0x227A,0x227B,0x227C,
+ 0x227D,0x227E,0x227F,0x2280,0x2281,0x2282,0x2283,0x2284,
+ 0x2285,0x2286,0x2287,0x2288,0x2289,0x228A,0x228B,0x228C,
+ 0x228D,0x228E,0x228F,0x2290,0x2291,0x2292,0x2293,0x2294,
+ 0x2296,0x2297,0x2298,0x229A,0x229B,0x229C,0x229D,0x229E,
+ 0x229F,0x22A0,0x22A1,0x22A2,0x22A3,0x22A4,0x22A6,0x22A7,
+ 0x22A8,0x22A9,0x22AA,0x22AB,0x22AC,0x22AD,0x22AE,0x22AF,
+ 0x22B0,0x22B1,0x22B2,0x22B3,0x22B4,0x22B5,0x22B6,0x22B7,
+ 0x22B8,0x22B9,0x22BA,0x22BB,0x22BC,0x22BD,0x22BE,0x22C0,
+ 0x22C1,0x22C2,0x22C3,0x22C4,0x22C5,0x22C6,0x22C7,0x22C8,
+ 0x22C9,0x22CA,0x22CB,0x22CC,0x22CD,0x22CE,0x22CF,0x22D0,
+ 0x22D1,0x22D2,0x22D3,0x22D4,0x22D5,0x22D6,0x22D7,0x22D8,
+ 0x22D9,0x22DA,0x22DB,0x22DC,0x22DD,0x22DE,0x22DF,0x22E0,
+ 0x22E1,0x22E2,0x22E3,0x22E4,0x22E5,0x22E6,0x22E7,0x22E8,
+ 0x22E9,0x22EA,0x22EB,0x22EC,0x22ED,0x22EE,0x22EF,0x22F0,
+ 0x22F1,0x22F2,0x22F3,0x22F4,0x22F5,0x22F6,0x22F7,0x22F8,
+ 0x22F9,0x22FA,0x22FB,0x22FC,0x22FD,0x22FE,0x22FF,0x2300,
+ 0x2301,0x2302,0x2303,0x2304,0x2305,0x2306,0x2307,0x2308,
+ 0x2309,0x230A,0x230B,0x230C,0x230D,0x230E,0x230F,0x2310,
+ 0x2311,0x2313,0x2314,0x2315,0x2316,0x2317,0x2318,0x2319,
+ 0x231A,0x231B,0x231C,0x231D,0x231E,0x231F,0x2320,0x2321,
+ 0x2322,0x2323,0x2324,0x2325,0x2326,0x2327,0x2328,0x2329,
+ 0x232A,0x232B,0x232C,0x232D,0x232E,0x232F,0x2330,0x2331,
+ 0x2332,0x2333,0x2334,0x2335,0x2336,0x2337,0x2338,0x2339,
+ 0x233A,0x233B,0x233C,0x233D,0x233E,0x233F,0x2340,0x2341,
+ 0x2342,0x2343,0x2344,0x2345,0x2346,0x2347,0x2348,0x2349,
+ 0x234A,0x234B,0x234C,0x234D,0x234E,0x234F,0x2350,0x2351,
+ 0x2352,0x2353,0x2354,0x2355,0x2356,0x2357,0x2358,0x2359,
+ 0x235A,0x235B,0x235C,0x235D,0x235E,0x235F,0x2360,0x2361,
+ 0x2362,0x2363,0x2364,0x2365,0x2366,0x2367,0x2368,0x2369,
+ 0x236A,0x236B,0x236C,0x236D,0x236E,0x236F,0x2370,0x2371,
+ 0x2372,0x2373,0x2374,0x2375,0x2376,0x2377,0x2378,0x2379,
+ 0x237A,0x237B,0x237C,0x237D,0x237E,0x237F,0x2380,0x2381,
+ 0x2382,0x2383,0x2384,0x2385,0x2386,0x2387,0x2388,0x2389,
+ 0x238A,0x238B,0x238C,0x238D,0x238E,0x238F,0x2390,0x2391,
+ 0x2392,0x2393,0x2394,0x2395,0x2396,0x2397,0x2398,0x2399,
+ 0x239A,0x239B,0x239C,0x239D,0x239E,0x239F,0x23A0,0x23A1,
+ 0x23A2,0x23A3,0x23A4,0x23A5,0x23A6,0x23A7,0x23A8,0x23A9,
+ 0x23AA,0x23AB,0x23AC,0x23AD,0x23AE,0x23AF,0x23B0,0x23B1,
+ 0x23B2,0x23B3,0x23B4,0x23B5,0x23B6,0x23B7,0x23B8,0x23B9,
+ 0x23BA,0x23BB,0x23BC,0x23BD,0x23BE,0x23BF,0x23C0,0x23C1,
+ 0x23C2,0x23C3,0x23C4,0x23C5,0x23C6,0x23C7,0x23C8,0x23C9,
+ 0x23CA,0x23CB,0x23CC,0x23CD,0x23CE,0x23CF,0x23D0,0x23D1,
+ 0x23D2,0x23D3,0x23D4,0x23D5,0x23D6,0x23D7,0x23D8,0x23D9,
+ 0x23DA,0x23DB,0x23DC,0x23DD,0x23DE,0x23DF,0x23E0,0x23E1,
+ 0x23E2,0x23E3,0x23E4,0x23E5,0x23E6,0x23E7,0x23E8,0x23E9,
+ 0x23EA,0x23EB,0x23EC,0x23ED,0x23EE,0x23EF,0x23F0,0x23F1,
+ 0x23F2,0x23F3,0x23F4,0x23F5,0x23F6,0x23F7,0x23F8,0x23F9,
+ 0x23FA,0x23FB,0x23FC,0x23FD,0x23FE,0x23FF,0x2400,0x2401,
+ 0x2402,0x2403,0x2404,0x2405,0x2406,0x2407,0x2408,0x2409,
+ 0x240A,0x240B,0x240C,0x240D,0x240E,0x240F,0x2410,0x2411,
+ 0x2412,0x2413,0x2414,0x2415,0x2416,0x2417,0x2418,0x2419,
+ 0x241A,0x241B,0x241C,0x241D,0x241E,0x241F,0x2420,0x2421,
+ 0x2422,0x2423,0x2424,0x2425,0x2426,0x2427,0x2428,0x2429,
+ 0x242A,0x242B,0x242C,0x242D,0x242E,0x242F,0x2430,0x2431,
+ 0x2432,0x2433,0x2434,0x2435,0x2436,0x2437,0x2438,0x2439,
+ 0x243A,0x243B,0x243C,0x243D,0x243E,0x243F,0x2440,0x2441,
+ 0x2442,0x2443,0x2444,0x2445,0x2446,0x2447,0x2448,0x2449,
+ 0x244A,0x244B,0x244C,0x244D,0x244E,0x244F,0x2450,0x2451,
+ 0x2452,0x2453,0x2454,0x2455,0x2456,0x2457,0x2458,0x2459,
+ 0x245A,0x245B,0x245C,0x245D,0x245E,0x245F,0x246A,0x246B,
+ 0x246C,0x246D,0x246E,0x246F,0x2470,0x2471,0x2472,0x2473,
+ 0x249C,0x249D,0x249E,0x249F,0x24A0,0x24A1,0x24A2,0x24A3,
+ 0x24A4,0x24A5,0x24A6,0x24A7,0x24A8,0x24A9,0x24AA,0x24AB,
+ 0x24AC,0x24AD,0x24AE,0x24AF,0x24B0,0x24B1,0x24B2,0x24B3,
+ 0x24B4,0x24B5,0x24B6,0x24B7,0x24B8,0x24B9,0x24BA,0x24BB,
+ 0x24BC,0x24BD,0x24BE,0x24BF,0x24C0,0x24C1,0x24C2,0x24C3,
+ 0x24C4,0x24C5,0x24C6,0x24C7,0x24C8,0x24C9,0x24CA,0x24CB,
+ 0x24CC,0x24CD,0x24CE,0x24CF,0x24D0,0x24D1,0x24D2,0x24D3,
+ 0x24D4,0x24D5,0x24D6,0x24D7,0x24D8,0x24D9,0x24DA,0x24DB,
+ 0x24DC,0x24DD,0x24DE,0x24DF,0x24E0,0x24E1,0x24E2,0x24E3,
+ 0x24E4,0x24E5,0x24E6,0x24E7,0x24E8,0x24E9,0x24EA,0x24EB,
+ 0x24EC,0x24ED,0x24EE,0x24EF,0x24F0,0x24F1,0x24F2,0x24F3,
+ 0x24F4,0x24F5,0x24F6,0x24F7,0x24F8,0x24F9,0x24FA,0x24FB,
+ 0x24FC,0x24FD,0x24FE,0x24FF,0x254C,0x254D,0x254E,0x254F,
+ 0x2574,0x2575,0x2576,0x2577,0x2578,0x2579,0x257A,0x257B,
+ 0x257C,0x257D,0x257E,0x257F,0x2580,0x2590,0x2591,0x2592,
+ 0x2596,0x2597,0x2598,0x2599,0x259A,0x259B,0x259C,0x259D,
+ 0x259E,0x259F,0x25A2,0x25A3,0x25A4,0x25A5,0x25A6,0x25A7,
+ 0x25A8,0x25A9,0x25AA,0x25AB,0x25AC,0x25AD,0x25AE,0x25AF,
+ 0x25B0,0x25B1,0x25B4,0x25B5,0x25B6,0x25B7,0x25B8,0x25B9,
+ 0x25BA,0x25BB,0x25BE,0x25BF,0x25C0,0x25C1,0x25C2,0x25C3,
+ 0x25C4,0x25C5,0x25C8,0x25C9,0x25CA,0x25CC,0x25CD,0x25D0,
+ 0x25D1,0x25D2,0x25D3,0x25D4,0x25D5,0x25D6,0x25D7,0x25D8,
+ 0x25D9,0x25DA,0x25DB,0x25DC,0x25DD,0x25DE,0x25DF,0x25E0,
+ 0x25E1,0x25E6,0x25E7,0x25E8,0x25E9,0x25EA,0x25EB,0x25EC,
+ 0x25ED,0x25EE,0x25EF,0x25F0,0x25F1,0x25F2,0x25F3,0x25F4,
+ 0x25F5,0x25F6,0x25F7,0x25F8,0x25F9,0x25FA,0x25FB,0x25FC,
+ 0x25FD,0x25FE,0x25FF,0x2600,0x2601,0x2602,0x2603,0x2604,
+ 0x2607,0x2608,0x260A,0x260B,0x260C,0x260D,0x260E,0x260F,
+ 0x2610,0x2611,0x2612,0x2613,0x2614,0x2615,0x2616,0x2617,
+ 0x2618,0x2619,0x261A,0x261B,0x261C,0x261D,0x261E,0x261F,
+ 0x2620,0x2621,0x2622,0x2623,0x2624,0x2625,0x2626,0x2627,
+ 0x2628,0x2629,0x262A,0x262B,0x262C,0x262D,0x262E,0x262F,
+ 0x2630,0x2631,0x2632,0x2633,0x2634,0x2635,0x2636,0x2637,
+ 0x2638,0x2639,0x263A,0x263B,0x263C,0x263D,0x263E,0x263F,
+ 0x2641,0x2E82,0x2E83,0x2E85,0x2E86,0x2E87,0x2E89,0x2E8A,
+ 0x2E8D,0x2E8E,0x2E8F,0x2E90,0x2E91,0x2E92,0x2E93,0x2E94,
+ 0x2E95,0x2E96,0x2E98,0x2E99,0x2E9A,0x2E9B,0x2E9C,0x2E9D,
+ 0x2E9E,0x2E9F,0x2EA0,0x2EA1,0x2EA2,0x2EA3,0x2EA4,0x2EA5,
+ 0x2EA6,0x2EA8,0x2EA9,0x2EAB,0x2EAC,0x2EAD,0x2EAF,0x2EB0,
+ 0x2EB1,0x2EB2,0x2EB4,0x2EB5,0x2EB8,0x2EB9,0x2EBA,0x2EBC,
+ 0x2EBD,0x2EBE,0x2EBF,0x2EC0,0x2EC1,0x2EC2,0x2EC3,0x2EC4,
+ 0x2EC5,0x2EC6,0x2EC7,0x2EC8,0x2EC9,0x2ECB,0x2ECC,0x2ECD,
+ 0x2ECE,0x2ECF,0x2ED0,0x2ED1,0x2ED2,0x2ED3,0x2ED4,0x2ED5,
+ 0x2ED6,0x2ED7,0x2ED8,0x2ED9,0x2EDA,0x2EDB,0x2EDC,0x2EDD,
+ 0x2EDE,0x2EDF,0x2EE0,0x2EE1,0x2EE2,0x2EE3,0x2EE4,0x2EE5,
+ 0x2EE6,0x2EE7,0x2EE8,0x2EE9,0x2EEA,0x2EEB,0x2EEC,0x2EED,
+ 0x2EEE,0x2EEF,0x2EF0,0x2EF1,0x2EF2,0x2EF3,0x2EF4,0x2EF5,
+ 0x2EF6,0x2EF7,0x2EF8,0x2EF9,0x2EFA,0x2EFB,0x2EFC,0x2EFD,
+ 0x2EFE,0x2EFF,0x2F00,0x2F01,0x2F02,0x2F03,0x2F04,0x2F05,
+ 0x2F06,0x2F07,0x2F08,0x2F09,0x2F0A,0x2F0B,0x2F0C,0x2F0D,
+ 0x2F0E,0x2F0F,0x2F10,0x2F11,0x2F12,0x2F13,0x2F14,0x2F15,
+ 0x2F16,0x2F17,0x2F18,0x2F19,0x2F1A,0x2F1B,0x2F1C,0x2F1D,
+ 0x2F1E,0x2F1F,0x2F20,0x2F21,0x2F22,0x2F23,0x2F24,0x2F25,
+ 0x2F26,0x2F27,0x2F28,0x2F29,0x2F2A,0x2F2B,0x2F2C,0x2F2D,
+ 0x2F2E,0x2F2F,0x2F30,0x2F31,0x2F32,0x2F33,0x2F34,0x2F35,
+ 0x2F36,0x2F37,0x2F38,0x2F39,0x2F3A,0x2F3B,0x2F3C,0x2F3D,
+ 0x2F3E,0x2F3F,0x2F40,0x2F41,0x2F42,0x2F43,0x2F44,0x2F45,
+ 0x2F46,0x2F47,0x2F48,0x2F49,0x2F4A,0x2F4B,0x2F4C,0x2F4D,
+ 0x2F4E,0x2F4F,0x2F50,0x2F51,0x2F52,0x2F53,0x2F54,0x2F55,
+ 0x2F56,0x2F57,0x2F58,0x2F59,0x2F5A,0x2F5B,0x2F5C,0x2F5D,
+ 0x2F5E,0x2F5F,0x2F60,0x2F61,0x2F62,0x2F63,0x2F64,0x2F65,
+ 0x2F66,0x2F67,0x2F68,0x2F69,0x2F6A,0x2F6B,0x2F6C,0x2F6D,
+ 0x2F6E,0x2F6F,0x2F70,0x2F71,0x2F72,0x2F73,0x2F74,0x2F75,
+ 0x2F76,0x2F77,0x2F78,0x2F79,0x2F7A,0x2F7B,0x2F7C,0x2F7D,
+ 0x2F7E,0x2F7F,0x2F80,0x2F81,0x2F82,0x2F83,0x2F84,0x2F85,
+ 0x2F86,0x2F87,0x2F88,0x2F89,0x2F8A,0x2F8B,0x2F8C,0x2F8D,
+ 0x2F8E,0x2F8F,0x2F90,0x2F91,0x2F92,0x2F93,0x2F94,0x2F95,
+ 0x2F96,0x2F97,0x2F98,0x2F99,0x2F9A,0x2F9B,0x2F9C,0x2F9D,
+ 0x2F9E,0x2F9F,0x2FA0,0x2FA1,0x2FA2,0x2FA3,0x2FA4,0x2FA5,
+ 0x2FA6,0x2FA7,0x2FA8,0x2FA9,0x2FAA,0x2FAB,0x2FAC,0x2FAD,
+ 0x2FAE,0x2FAF,0x2FB0,0x2FB1,0x2FB2,0x2FB3,0x2FB4,0x2FB5,
+ 0x2FB6,0x2FB7,0x2FB8,0x2FB9,0x2FBA,0x2FBB,0x2FBC,0x2FBD,
+ 0x2FBE,0x2FBF,0x2FC0,0x2FC1,0x2FC2,0x2FC3,0x2FC4,0x2FC5,
+ 0x2FC6,0x2FC7,0x2FC8,0x2FC9,0x2FCA,0x2FCB,0x2FCC,0x2FCD,
+ 0x2FCE,0x2FCF,0x2FD0,0x2FD1,0x2FD2,0x2FD3,0x2FD4,0x2FD5,
+ 0x2FD6,0x2FD7,0x2FD8,0x2FD9,0x2FDA,0x2FDB,0x2FDC,0x2FDD,
+ 0x2FDE,0x2FDF,0x2FE0,0x2FE1,0x2FE2,0x2FE3,0x2FE4,0x2FE5,
+ 0x2FE6,0x2FE7,0x2FE8,0x2FE9,0x2FEA,0x2FEB,0x2FEC,0x2FED,
+ 0x2FEE,0x2FEF,0x2FFC,0x2FFD,0x2FFE,0x2FFF,0x3004,0x3018,
+ 0x3019,0x301A,0x301B,0x301C,0x301F,0x3020,0x302A,0x302B,
+ 0x302C,0x302D,0x302E,0x302F,0x3030,0x3031,0x3032,0x3033,
+ 0x3034,0x3035,0x3036,0x3037,0x3038,0x3039,0x303A,0x303B,
+ 0x303C,0x303D,0x303F,0x3040,0x3094,0x3095,0x3096,0x3097,
+ 0x3098,0x3099,0x309A,0x309F,0x30A0,0x30F7,0x30F8,0x30F9,
+ 0x30FA,0x30FB,0x30FF,0x3100,0x3101,0x3102,0x3103,0x3104,
+ 0x312A,0x312B,0x312C,0x312D,0x312E,0x312F,0x3130,0x3131,
+ 0x3132,0x3133,0x3134,0x3135,0x3136,0x3137,0x3138,0x3139,
+ 0x313A,0x313B,0x313C,0x313D,0x313E,0x313F,0x3140,0x3141,
+ 0x3142,0x3143,0x3144,0x3145,0x3146,0x3147,0x3148,0x3149,
+ 0x314A,0x314B,0x314C,0x314D,0x314E,0x314F,0x3150,0x3151,
+ 0x3152,0x3153,0x3154,0x3155,0x3156,0x3157,0x3158,0x3159,
+ 0x315A,0x315B,0x315C,0x315D,0x315E,0x315F,0x3160,0x3161,
+ 0x3162,0x3163,0x3164,0x3165,0x3166,0x3167,0x3168,0x3169,
+ 0x316A,0x316B,0x316C,0x316D,0x316E,0x316F,0x3170,0x3171,
+ 0x3172,0x3173,0x3174,0x3175,0x3176,0x3177,0x3178,0x3179,
+ 0x317A,0x317B,0x317C,0x317D,0x317E,0x317F,0x3180,0x3181,
+ 0x3182,0x3183,0x3184,0x3185,0x3186,0x3187,0x3188,0x3189,
+ 0x318A,0x318B,0x318C,0x318D,0x318E,0x318F,0x3190,0x3191,
+ 0x3192,0x3193,0x3194,0x3195,0x3196,0x3197,0x3198,0x3199,
+ 0x319A,0x319B,0x319C,0x319D,0x319E,0x319F,0x31A0,0x31A1,
+ 0x31A2,0x31A3,0x31A4,0x31A5,0x31A6,0x31A7,0x31A8,0x31A9,
+ 0x31AA,0x31AB,0x31AC,0x31AD,0x31AE,0x31AF,0x31B0,0x31B1,
+ 0x31B2,0x31B3,0x31B4,0x31B5,0x31B6,0x31B7,0x31B8,0x31B9,
+ 0x31BA,0x31BB,0x31BC,0x31BD,0x31BE,0x31BF,0x31C0,0x31C1,
+ 0x31C2,0x31C3,0x31C4,0x31C5,0x31C6,0x31C7,0x31C8,0x31C9,
+ 0x31CA,0x31CB,0x31CC,0x31CD,0x31CE,0x31CF,0x31D0,0x31D1,
+ 0x31D2,0x31D3,0x31D4,0x31D5,0x31D6,0x31D7,0x31D8,0x31D9,
+ 0x31DA,0x31DB,0x31DC,0x31DD,0x31DE,0x31DF,0x31E0,0x31E1,
+ 0x31E2,0x31E3,0x31E4,0x31E5,0x31E6,0x31E7,0x31E8,0x31E9,
+ 0x31EA,0x31EB,0x31EC,0x31ED,0x31EE,0x31EF,0x31F0,0x31F1,
+ 0x31F2,0x31F3,0x31F4,0x31F5,0x31F6,0x31F7,0x31F8,0x31F9,
+ 0x31FA,0x31FB,0x31FC,0x31FD,0x31FE,0x31FF,0x3200,0x3201,
+ 0x3202,0x3203,0x3204,0x3205,0x3206,0x3207,0x3208,0x3209,
+ 0x320A,0x320B,0x320C,0x320D,0x320E,0x320F,0x3210,0x3211,
+ 0x3212,0x3213,0x3214,0x3215,0x3216,0x3217,0x3218,0x3219,
+ 0x321A,0x321B,0x321C,0x321D,0x321E,0x321F,0x322A,0x322B,
+ 0x322C,0x322D,0x322E,0x322F,0x3230,0x3232,0x3233,0x3234,
+ 0x3235,0x3236,0x3237,0x3238,0x3239,0x323A,0x323B,0x323C,
+ 0x323D,0x323E,0x323F,0x3240,0x3241,0x3242,0x3243,0x3244,
+ 0x3245,0x3246,0x3247,0x3248,0x3249,0x324A,0x324B,0x324C,
+ 0x324D,0x324E,0x324F,0x3250,0x3251,0x3252,0x3253,0x3254,
+ 0x3255,0x3256,0x3257,0x3258,0x3259,0x325A,0x325B,0x325C,
+ 0x325D,0x325E,0x325F,0x3260,0x3261,0x3262,0x3263,0x3264,
+ 0x3265,0x3266,0x3267,0x3268,0x3269,0x326A,0x326B,0x326C,
+ 0x326D,0x326E,0x326F,0x3270,0x3271,0x3272,0x3273,0x3274,
+ 0x3275,0x3276,0x3277,0x3278,0x3279,0x327A,0x327B,0x327C,
+ 0x327D,0x327E,0x327F,0x3280,0x3281,0x3282,0x3283,0x3284,
+ 0x3285,0x3286,0x3287,0x3288,0x3289,0x328A,0x328B,0x328C,
+ 0x328D,0x328E,0x328F,0x3290,0x3291,0x3292,0x3293,0x3294,
+ 0x3295,0x3296,0x3297,0x3298,0x3299,0x329A,0x329B,0x329C,
+ 0x329D,0x329E,0x329F,0x32A0,0x32A1,0x32A2,0x32A4,0x32A5,
+ 0x32A6,0x32A7,0x32A8,0x32A9,0x32AA,0x32AB,0x32AC,0x32AD,
+ 0x32AE,0x32AF,0x32B0,0x32B1,0x32B2,0x32B3,0x32B4,0x32B5,
+ 0x32B6,0x32B7,0x32B8,0x32B9,0x32BA,0x32BB,0x32BC,0x32BD,
+ 0x32BE,0x32BF,0x32C0,0x32C1,0x32C2,0x32C3,0x32C4,0x32C5,
+ 0x32C6,0x32C7,0x32C8,0x32C9,0x32CA,0x32CB,0x32CC,0x32CD,
+ 0x32CE,0x32CF,0x32D0,0x32D1,0x32D2,0x32D3,0x32D4,0x32D5,
+ 0x32D6,0x32D7,0x32D8,0x32D9,0x32DA,0x32DB,0x32DC,0x32DD,
+ 0x32DE,0x32DF,0x32E0,0x32E1,0x32E2,0x32E3,0x32E4,0x32E5,
+ 0x32E6,0x32E7,0x32E8,0x32E9,0x32EA,0x32EB,0x32EC,0x32ED,
+ 0x32EE,0x32EF,0x32F0,0x32F1,0x32F2,0x32F3,0x32F4,0x32F5,
+ 0x32F6,0x32F7,0x32F8,0x32F9,0x32FA,0x32FB,0x32FC,0x32FD,
+ 0x32FE,0x32FF,0x3300,0x3301,0x3302,0x3303,0x3304,0x3305,
+ 0x3306,0x3307,0x3308,0x3309,0x330A,0x330B,0x330C,0x330D,
+ 0x330E,0x330F,0x3310,0x3311,0x3312,0x3313,0x3314,0x3315,
+ 0x3316,0x3317,0x3318,0x3319,0x331A,0x331B,0x331C,0x331D,
+ 0x331E,0x331F,0x3320,0x3321,0x3322,0x3323,0x3324,0x3325,
+ 0x3326,0x3327,0x3328,0x3329,0x332A,0x332B,0x332C,0x332D,
+ 0x332E,0x332F,0x3330,0x3331,0x3332,0x3333,0x3334,0x3335,
+ 0x3336,0x3337,0x3338,0x3339,0x333A,0x333B,0x333C,0x333D,
+ 0x333E,0x333F,0x3340,0x3341,0x3342,0x3343,0x3344,0x3345,
+ 0x3346,0x3347,0x3348,0x3349,0x334A,0x334B,0x334C,0x334D,
+ 0x334E,0x334F,0x3350,0x3351,0x3352,0x3353,0x3354,0x3355,
+ 0x3356,0x3357,0x3358,0x3359,0x335A,0x335B,0x335C,0x335D,
+ 0x335E,0x335F,0x3360,0x3361,0x3362,0x3363,0x3364,0x3365,
+ 0x3366,0x3367,0x3368,0x3369,0x336A,0x336B,0x336C,0x336D,
+ 0x336E,0x336F,0x3370,0x3371,0x3372,0x3373,0x3374,0x3375,
+ 0x3376,0x3377,0x3378,0x3379,0x337A,0x337B,0x337C,0x337D,
+ 0x337E,0x337F,0x3380,0x3381,0x3382,0x3383,0x3384,0x3385,
+ 0x3386,0x3387,0x3388,0x3389,0x338A,0x338B,0x338C,0x338D,
+ 0x3390,0x3391,0x3392,0x3393,0x3394,0x3395,0x3396,0x3397,
+ 0x3398,0x3399,0x339A,0x339B,0x339F,0x33A0,0x33A2,0x33A3,
+ 0x33A4,0x33A5,0x33A6,0x33A7,0x33A8,0x33A9,0x33AA,0x33AB,
+ 0x33AC,0x33AD,0x33AE,0x33AF,0x33B0,0x33B1,0x33B2,0x33B3,
+ 0x33B4,0x33B5,0x33B6,0x33B7,0x33B8,0x33B9,0x33BA,0x33BB,
+ 0x33BC,0x33BD,0x33BE,0x33BF,0x33C0,0x33C1,0x33C2,0x33C3,
+ 0x33C5,0x33C6,0x33C7,0x33C8,0x33C9,0x33CA,0x33CB,0x33CC,
+ 0x33CD,0x33CF,0x33D0,0x33D3,0x33D4,0x33D6,0x33D7,0x33D8,
+ 0x33D9,0x33DA,0x33DB,0x33DC,0x33DD,0x33DE,0x33DF,0x33E0,
+ 0x33E1,0x33E2,0x33E3,0x33E4,0x33E5,0x33E6,0x33E7,0x33E8,
+ 0x33E9,0x33EA,0x33EB,0x33EC,0x33ED,0x33EE,0x33EF,0x33F0,
+ 0x33F1,0x33F2,0x33F3,0x33F4,0x33F5,0x33F6,0x33F7,0x33F8,
+ 0x33F9,0x33FA,0x33FB,0x33FC,0x33FD,0x33FE,0x33FF,0x3400,
+ 0x3401,0x3402,0x3403,0x3404,0x3405,0x3406,0x3407,0x3408,
+ 0x3409,0x340A,0x340B,0x340C,0x340D,0x340E,0x340F,0x3410,
+ 0x3411,0x3412,0x3413,0x3414,0x3415,0x3416,0x3417,0x3418,
+ 0x3419,0x341A,0x341B,0x341C,0x341D,0x341E,0x341F,0x3420,
+ 0x3421,0x3422,0x3423,0x3424,0x3425,0x3426,0x3427,0x3428,
+ 0x3429,0x342A,0x342B,0x342C,0x342D,0x342E,0x342F,0x3430,
+ 0x3431,0x3432,0x3433,0x3434,0x3435,0x3436,0x3437,0x3438,
+ 0x3439,0x343A,0x343B,0x343C,0x343D,0x343E,0x343F,0x3440,
+ 0x3441,0x3442,0x3443,0x3444,0x3445,0x3446,0x3448,0x3449,
+ 0x344A,0x344B,0x344C,0x344D,0x344E,0x344F,0x3450,0x3451,
+ 0x3452,0x3453,0x3454,0x3455,0x3456,0x3457,0x3458,0x3459,
+ 0x345A,0x345B,0x345C,0x345D,0x345E,0x345F,0x3460,0x3461,
+ 0x3462,0x3463,0x3464,0x3465,0x3466,0x3467,0x3468,0x3469,
+ 0x346A,0x346B,0x346C,0x346D,0x346E,0x346F,0x3470,0x3471,
+ 0x3472,0x3474,0x3475,0x3476,0x3477,0x3478,0x3479,0x347A,
+ 0x347B,0x347C,0x347D,0x347E,0x347F,0x3480,0x3481,0x3482,
+ 0x3483,0x3484,0x3485,0x3486,0x3487,0x3488,0x3489,0x348A,
+ 0x348B,0x348C,0x348D,0x348E,0x348F,0x3490,0x3491,0x3492,
+ 0x3493,0x3494,0x3495,0x3496,0x3497,0x3498,0x3499,0x349A,
+ 0x349B,0x349C,0x349D,0x349E,0x349F,0x34A0,0x34A1,0x34A2,
+ 0x34A3,0x34A4,0x34A5,0x34A6,0x34A7,0x34A8,0x34A9,0x34AA,
+ 0x34AB,0x34AC,0x34AD,0x34AE,0x34AF,0x34B0,0x34B1,0x34B2,
+ 0x34B3,0x34B4,0x34B5,0x34B6,0x34B7,0x34B8,0x34B9,0x34BA,
+ 0x34BB,0x34BC,0x34BD,0x34BE,0x34BF,0x34C0,0x34C1,0x34C2,
+ 0x34C3,0x34C4,0x34C5,0x34C6,0x34C7,0x34C8,0x34C9,0x34CA,
+ 0x34CB,0x34CC,0x34CD,0x34CE,0x34CF,0x34D0,0x34D1,0x34D2,
+ 0x34D3,0x34D4,0x34D5,0x34D6,0x34D7,0x34D8,0x34D9,0x34DA,
+ 0x34DB,0x34DC,0x34DD,0x34DE,0x34DF,0x34E0,0x34E1,0x34E2,
+ 0x34E3,0x34E4,0x34E5,0x34E6,0x34E7,0x34E8,0x34E9,0x34EA,
+ 0x34EB,0x34EC,0x34ED,0x34EE,0x34EF,0x34F0,0x34F1,0x34F2,
+ 0x34F3,0x34F4,0x34F5,0x34F6,0x34F7,0x34F8,0x34F9,0x34FA,
+ 0x34FB,0x34FC,0x34FD,0x34FE,0x34FF,0x3500,0x3501,0x3502,
+ 0x3503,0x3504,0x3505,0x3506,0x3507,0x3508,0x3509,0x350A,
+ 0x350B,0x350C,0x350D,0x350E,0x350F,0x3510,0x3511,0x3512,
+ 0x3513,0x3514,0x3515,0x3516,0x3517,0x3518,0x3519,0x351A,
+ 0x351B,0x351C,0x351D,0x351E,0x351F,0x3520,0x3521,0x3522,
+ 0x3523,0x3524,0x3525,0x3526,0x3527,0x3528,0x3529,0x352A,
+ 0x352B,0x352C,0x352D,0x352E,0x352F,0x3530,0x3531,0x3532,
+ 0x3533,0x3534,0x3535,0x3536,0x3537,0x3538,0x3539,0x353A,
+ 0x353B,0x353C,0x353D,0x353E,0x353F,0x3540,0x3541,0x3542,
+ 0x3543,0x3544,0x3545,0x3546,0x3547,0x3548,0x3549,0x354A,
+ 0x354B,0x354C,0x354D,0x354E,0x354F,0x3550,0x3551,0x3552,
+ 0x3553,0x3554,0x3555,0x3556,0x3557,0x3558,0x3559,0x355A,
+ 0x355B,0x355C,0x355D,0x355E,0x355F,0x3560,0x3561,0x3562,
+ 0x3563,0x3564,0x3565,0x3566,0x3567,0x3568,0x3569,0x356A,
+ 0x356B,0x356C,0x356D,0x356E,0x356F,0x3570,0x3571,0x3572,
+ 0x3573,0x3574,0x3575,0x3576,0x3577,0x3578,0x3579,0x357A,
+ 0x357B,0x357C,0x357D,0x357E,0x357F,0x3580,0x3581,0x3582,
+ 0x3583,0x3584,0x3585,0x3586,0x3587,0x3588,0x3589,0x358A,
+ 0x358B,0x358C,0x358D,0x358E,0x358F,0x3590,0x3591,0x3592,
+ 0x3593,0x3594,0x3595,0x3596,0x3597,0x3598,0x3599,0x359A,
+ 0x359B,0x359C,0x359D,0x359F,0x35A0,0x35A1,0x35A2,0x35A3,
+ 0x35A4,0x35A5,0x35A6,0x35A7,0x35A8,0x35A9,0x35AA,0x35AB,
+ 0x35AC,0x35AD,0x35AE,0x35AF,0x35B0,0x35B1,0x35B2,0x35B3,
+ 0x35B4,0x35B5,0x35B6,0x35B7,0x35B8,0x35B9,0x35BA,0x35BB,
+ 0x35BC,0x35BD,0x35BE,0x35BF,0x35C0,0x35C1,0x35C2,0x35C3,
+ 0x35C4,0x35C5,0x35C6,0x35C7,0x35C8,0x35C9,0x35CA,0x35CB,
+ 0x35CC,0x35CD,0x35CE,0x35CF,0x35D0,0x35D1,0x35D2,0x35D3,
+ 0x35D4,0x35D5,0x35D6,0x35D7,0x35D8,0x35D9,0x35DA,0x35DB,
+ 0x35DC,0x35DD,0x35DE,0x35DF,0x35E0,0x35E1,0x35E2,0x35E3,
+ 0x35E4,0x35E5,0x35E6,0x35E7,0x35E8,0x35E9,0x35EA,0x35EB,
+ 0x35EC,0x35ED,0x35EE,0x35EF,0x35F0,0x35F1,0x35F2,0x35F3,
+ 0x35F4,0x35F5,0x35F6,0x35F7,0x35F8,0x35F9,0x35FA,0x35FB,
+ 0x35FC,0x35FD,0x35FE,0x35FF,0x3600,0x3601,0x3602,0x3603,
+ 0x3604,0x3605,0x3606,0x3607,0x3608,0x3609,0x360A,0x360B,
+ 0x360C,0x360D,0x360F,0x3610,0x3611,0x3612,0x3613,0x3614,
+ 0x3615,0x3616,0x3617,0x3618,0x3619,0x3919,0x391A,0x391B,
+ 0x391C,0x391D,0x391E,0x391F,0x3920,0x3921,0x3922,0x3923,
+ 0x3924,0x3925,0x3926,0x3927,0x3928,0x3929,0x392A,0x392B,
+ 0x392C,0x392D,0x392E,0x392F,0x3930,0x3931,0x3932,0x3933,
+ 0x3934,0x3935,0x3936,0x3937,0x3938,0x3939,0x393A,0x393B,
+ 0x393C,0x393D,0x393E,0x393F,0x3940,0x3941,0x3942,0x3943,
+ 0x3944,0x3945,0x3946,0x3947,0x3948,0x3949,0x394A,0x394B,
+ 0x394C,0x394D,0x394E,0x394F,0x3950,0x3951,0x3952,0x3953,
+ 0x3954,0x3955,0x3956,0x3957,0x3958,0x3959,0x395A,0x395B,
+ 0x395C,0x395D,0x395E,0x395F,0x3960,0x3961,0x3962,0x3963,
+ 0x3964,0x3965,0x3966,0x3967,0x3968,0x3969,0x396A,0x396B,
+ 0x396C,0x396D,0x396F,0x3970,0x3971,0x3972,0x3973,0x3974,
+ 0x3975,0x3976,0x3977,0x3978,0x3979,0x397A,0x397B,0x397C,
+ 0x397D,0x397E,0x397F,0x3980,0x3981,0x3982,0x3983,0x3984,
+ 0x3985,0x3986,0x3987,0x3988,0x3989,0x398A,0x398B,0x398C,
+ 0x398D,0x398E,0x398F,0x3990,0x3991,0x3992,0x3993,0x3994,
+ 0x3995,0x3996,0x3997,0x3998,0x3999,0x399A,0x399B,0x399C,
+ 0x399D,0x399E,0x399F,0x39A0,0x39A1,0x39A2,0x39A3,0x39A4,
+ 0x39A5,0x39A6,0x39A7,0x39A8,0x39A9,0x39AA,0x39AB,0x39AC,
+ 0x39AD,0x39AE,0x39AF,0x39B0,0x39B1,0x39B2,0x39B3,0x39B4,
+ 0x39B5,0x39B6,0x39B7,0x39B8,0x39B9,0x39BA,0x39BB,0x39BC,
+ 0x39BD,0x39BE,0x39BF,0x39C0,0x39C1,0x39C2,0x39C3,0x39C4,
+ 0x39C5,0x39C6,0x39C7,0x39C8,0x39C9,0x39CA,0x39CB,0x39CC,
+ 0x39CD,0x39CE,0x39D1,0x39D2,0x39D3,0x39D4,0x39D5,0x39D6,
+ 0x39D7,0x39D8,0x39D9,0x39DA,0x39DB,0x39DC,0x39DD,0x39DE,
+ 0x39E0,0x39E1,0x39E2,0x39E3,0x39E4,0x39E5,0x39E6,0x39E7,
+ 0x39E8,0x39E9,0x39EA,0x39EB,0x39EC,0x39ED,0x39EE,0x39EF,
+ 0x39F0,0x39F1,0x39F2,0x39F3,0x39F4,0x39F5,0x39F6,0x39F7,
+ 0x39F8,0x39F9,0x39FA,0x39FB,0x39FC,0x39FD,0x39FE,0x39FF,
+ 0x3A00,0x3A01,0x3A02,0x3A03,0x3A04,0x3A05,0x3A06,0x3A07,
+ 0x3A08,0x3A09,0x3A0A,0x3A0B,0x3A0C,0x3A0D,0x3A0E,0x3A0F,
+ 0x3A10,0x3A11,0x3A12,0x3A13,0x3A14,0x3A15,0x3A16,0x3A17,
+ 0x3A18,0x3A19,0x3A1A,0x3A1B,0x3A1C,0x3A1D,0x3A1E,0x3A1F,
+ 0x3A20,0x3A21,0x3A22,0x3A23,0x3A24,0x3A25,0x3A26,0x3A27,
+ 0x3A28,0x3A29,0x3A2A,0x3A2B,0x3A2C,0x3A2D,0x3A2E,0x3A2F,
+ 0x3A30,0x3A31,0x3A32,0x3A33,0x3A34,0x3A35,0x3A36,0x3A37,
+ 0x3A38,0x3A39,0x3A3A,0x3A3B,0x3A3C,0x3A3D,0x3A3E,0x3A3F,
+ 0x3A40,0x3A41,0x3A42,0x3A43,0x3A44,0x3A45,0x3A46,0x3A47,
+ 0x3A48,0x3A49,0x3A4A,0x3A4B,0x3A4C,0x3A4D,0x3A4E,0x3A4F,
+ 0x3A50,0x3A51,0x3A52,0x3A53,0x3A54,0x3A55,0x3A56,0x3A57,
+ 0x3A58,0x3A59,0x3A5A,0x3A5B,0x3A5C,0x3A5D,0x3A5E,0x3A5F,
+ 0x3A60,0x3A61,0x3A62,0x3A63,0x3A64,0x3A65,0x3A66,0x3A67,
+ 0x3A68,0x3A69,0x3A6A,0x3A6B,0x3A6C,0x3A6D,0x3A6E,0x3A6F,
+ 0x3A70,0x3A71,0x3A72,0x3A74,0x3A75,0x3A76,0x3A77,0x3A78,
+ 0x3A79,0x3A7A,0x3A7B,0x3A7C,0x3A7D,0x3A7E,0x3A7F,0x3A80,
+ 0x3A81,0x3A82,0x3A83,0x3A84,0x3A85,0x3A86,0x3A87,0x3A88,
+ 0x3A89,0x3A8A,0x3A8B,0x3A8C,0x3A8D,0x3A8E,0x3A8F,0x3A90,
+ 0x3A91,0x3A92,0x3A93,0x3A94,0x3A95,0x3A96,0x3A97,0x3A98,
+ 0x3A99,0x3A9A,0x3A9B,0x3A9C,0x3A9D,0x3A9E,0x3A9F,0x3AA0,
+ 0x3AA1,0x3AA2,0x3AA3,0x3AA4,0x3AA5,0x3AA6,0x3AA7,0x3AA8,
+ 0x3AA9,0x3AAA,0x3AAB,0x3AAC,0x3AAD,0x3AAE,0x3AAF,0x3AB0,
+ 0x3AB1,0x3AB2,0x3AB3,0x3AB4,0x3AB5,0x3AB6,0x3AB7,0x3AB8,
+ 0x3AB9,0x3ABA,0x3ABB,0x3ABC,0x3ABD,0x3ABE,0x3ABF,0x3AC0,
+ 0x3AC1,0x3AC2,0x3AC3,0x3AC4,0x3AC5,0x3AC6,0x3AC7,0x3AC8,
+ 0x3AC9,0x3ACA,0x3ACB,0x3ACC,0x3ACD,0x3ACE,0x3ACF,0x3AD0,
+ 0x3AD1,0x3AD2,0x3AD3,0x3AD4,0x3AD5,0x3AD6,0x3AD7,0x3AD8,
+ 0x3AD9,0x3ADA,0x3ADB,0x3ADC,0x3ADD,0x3ADE,0x3ADF,0x3AE0,
+ 0x3AE1,0x3AE2,0x3AE3,0x3AE4,0x3AE5,0x3AE6,0x3AE7,0x3AE8,
+ 0x3AE9,0x3AEA,0x3AEB,0x3AEC,0x3AED,0x3AEE,0x3AEF,0x3AF0,
+ 0x3AF1,0x3AF2,0x3AF3,0x3AF4,0x3AF5,0x3AF6,0x3AF7,0x3AF8,
+ 0x3AF9,0x3AFA,0x3AFB,0x3AFC,0x3AFD,0x3AFE,0x3AFF,0x3B00,
+ 0x3B01,0x3B02,0x3B03,0x3B04,0x3B05,0x3B06,0x3B07,0x3B08,
+ 0x3B09,0x3B0A,0x3B0B,0x3B0C,0x3B0D,0x3B0E,0x3B0F,0x3B10,
+ 0x3B11,0x3B12,0x3B13,0x3B14,0x3B15,0x3B16,0x3B17,0x3B18,
+ 0x3B19,0x3B1A,0x3B1B,0x3B1C,0x3B1D,0x3B1E,0x3B1F,0x3B20,
+ 0x3B21,0x3B22,0x3B23,0x3B24,0x3B25,0x3B26,0x3B27,0x3B28,
+ 0x3B29,0x3B2A,0x3B2B,0x3B2C,0x3B2D,0x3B2E,0x3B2F,0x3B30,
+ 0x3B31,0x3B32,0x3B33,0x3B34,0x3B35,0x3B36,0x3B37,0x3B38,
+ 0x3B39,0x3B3A,0x3B3B,0x3B3C,0x3B3D,0x3B3E,0x3B3F,0x3B40,
+ 0x3B41,0x3B42,0x3B43,0x3B44,0x3B45,0x3B46,0x3B47,0x3B48,
+ 0x3B49,0x3B4A,0x3B4B,0x3B4C,0x3B4D,0x3B4F,0x3B50,0x3B51,
+ 0x3B52,0x3B53,0x3B54,0x3B55,0x3B56,0x3B57,0x3B58,0x3B59,
+ 0x3B5A,0x3B5B,0x3B5C,0x3B5D,0x3B5E,0x3B5F,0x3B60,0x3B61,
+ 0x3B62,0x3B63,0x3B64,0x3B65,0x3B66,0x3B67,0x3B68,0x3B69,
+ 0x3B6A,0x3B6B,0x3B6C,0x3B6D,0x3B6E,0x3B6F,0x3B70,0x3B71,
+ 0x3B72,0x3B73,0x3B74,0x3B75,0x3B76,0x3B77,0x3B78,0x3B79,
+ 0x3B7A,0x3B7B,0x3B7C,0x3B7D,0x3B7E,0x3B7F,0x3B80,0x3B81,
+ 0x3B82,0x3B83,0x3B84,0x3B85,0x3B86,0x3B87,0x3B88,0x3B89,
+ 0x3B8A,0x3B8B,0x3B8C,0x3B8D,0x3B8E,0x3B8F,0x3B90,0x3B91,
+ 0x3B92,0x3B93,0x3B94,0x3B95,0x3B96,0x3B97,0x3B98,0x3B99,
+ 0x3B9A,0x3B9B,0x3B9C,0x3B9D,0x3B9E,0x3B9F,0x3BA0,0x3BA1,
+ 0x3BA2,0x3BA3,0x3BA4,0x3BA5,0x3BA6,0x3BA7,0x3BA8,0x3BA9,
+ 0x3BAA,0x3BAB,0x3BAC,0x3BAD,0x3BAE,0x3BAF,0x3BB0,0x3BB1,
+ 0x3BB2,0x3BB3,0x3BB4,0x3BB5,0x3BB6,0x3BB7,0x3BB8,0x3BB9,
+ 0x3BBA,0x3BBB,0x3BBC,0x3BBD,0x3BBE,0x3BBF,0x3BC0,0x3BC1,
+ 0x3BC2,0x3BC3,0x3BC4,0x3BC5,0x3BC6,0x3BC7,0x3BC8,0x3BC9,
+ 0x3BCA,0x3BCB,0x3BCC,0x3BCD,0x3BCE,0x3BCF,0x3BD0,0x3BD1,
+ 0x3BD2,0x3BD3,0x3BD4,0x3BD5,0x3BD6,0x3BD7,0x3BD8,0x3BD9,
+ 0x3BDA,0x3BDB,0x3BDC,0x3BDD,0x3BDE,0x3BDF,0x3BE0,0x3BE1,
+ 0x3BE2,0x3BE3,0x3BE4,0x3BE5,0x3BE6,0x3BE7,0x3BE8,0x3BE9,
+ 0x3BEA,0x3BEB,0x3BEC,0x3BED,0x3BEE,0x3BEF,0x3BF0,0x3BF1,
+ 0x3BF2,0x3BF3,0x3BF4,0x3BF5,0x3BF6,0x3BF7,0x3BF8,0x3BF9,
+ 0x3BFA,0x3BFB,0x3BFC,0x3BFD,0x3BFE,0x3BFF,0x3C00,0x3C01,
+ 0x3C02,0x3C03,0x3C04,0x3C05,0x3C06,0x3C07,0x3C08,0x3C09,
+ 0x3C0A,0x3C0B,0x3C0C,0x3C0D,0x3C0E,0x3C0F,0x3C10,0x3C11,
+ 0x3C12,0x3C13,0x3C14,0x3C15,0x3C16,0x3C17,0x3C18,0x3C19,
+ 0x3C1A,0x3C1B,0x3C1C,0x3C1D,0x3C1E,0x3C1F,0x3C20,0x3C21,
+ 0x3C22,0x3C23,0x3C24,0x3C25,0x3C26,0x3C27,0x3C28,0x3C29,
+ 0x3C2A,0x3C2B,0x3C2C,0x3C2D,0x3C2E,0x3C2F,0x3C30,0x3C31,
+ 0x3C32,0x3C33,0x3C34,0x3C35,0x3C36,0x3C37,0x3C38,0x3C39,
+ 0x3C3A,0x3C3B,0x3C3C,0x3C3D,0x3C3E,0x3C3F,0x3C40,0x3C41,
+ 0x3C42,0x3C43,0x3C44,0x3C45,0x3C46,0x3C47,0x3C48,0x3C49,
+ 0x3C4A,0x3C4B,0x3C4C,0x3C4D,0x3C4E,0x3C4F,0x3C50,0x3C51,
+ 0x3C52,0x3C53,0x3C54,0x3C55,0x3C56,0x3C57,0x3C58,0x3C59,
+ 0x3C5A,0x3C5B,0x3C5C,0x3C5D,0x3C5E,0x3C5F,0x3C60,0x3C61,
+ 0x3C62,0x3C63,0x3C64,0x3C65,0x3C66,0x3C67,0x3C68,0x3C69,
+ 0x3C6A,0x3C6B,0x3C6C,0x3C6D,0x3C6F,0x3C70,0x3C71,0x3C72,
+ 0x3C73,0x3C74,0x3C75,0x3C76,0x3C77,0x3C78,0x3C79,0x3C7A,
+ 0x3C7B,0x3C7C,0x3C7D,0x3C7E,0x3C7F,0x3C80,0x3C81,0x3C82,
+ 0x3C83,0x3C84,0x3C85,0x3C86,0x3C87,0x3C88,0x3C89,0x3C8A,
+ 0x3C8B,0x3C8C,0x3C8D,0x3C8E,0x3C8F,0x3C90,0x3C91,0x3C92,
+ 0x3C93,0x3C94,0x3C95,0x3C96,0x3C97,0x3C98,0x3C99,0x3C9A,
+ 0x3C9B,0x3C9C,0x3C9D,0x3C9E,0x3C9F,0x3CA0,0x3CA1,0x3CA2,
+ 0x3CA3,0x3CA4,0x3CA5,0x3CA6,0x3CA7,0x3CA8,0x3CA9,0x3CAA,
+ 0x3CAB,0x3CAC,0x3CAD,0x3CAE,0x3CAF,0x3CB0,0x3CB1,0x3CB2,
+ 0x3CB3,0x3CB4,0x3CB5,0x3CB6,0x3CB7,0x3CB8,0x3CB9,0x3CBA,
+ 0x3CBB,0x3CBC,0x3CBD,0x3CBE,0x3CBF,0x3CC0,0x3CC1,0x3CC2,
+ 0x3CC3,0x3CC4,0x3CC5,0x3CC6,0x3CC7,0x3CC8,0x3CC9,0x3CCA,
+ 0x3CCB,0x3CCC,0x3CCD,0x3CCE,0x3CCF,0x3CD0,0x3CD1,0x3CD2,
+ 0x3CD3,0x3CD4,0x3CD5,0x3CD6,0x3CD7,0x3CD8,0x3CD9,0x3CDA,
+ 0x3CDB,0x3CDC,0x3CDD,0x3CDE,0x3CDF,0x4057,0x4058,0x4059,
+ 0x405A,0x405B,0x405C,0x405D,0x405E,0x405F,0x4060,0x4061,
+ 0x4062,0x4063,0x4064,0x4065,0x4066,0x4067,0x4068,0x4069,
+ 0x406A,0x406B,0x406C,0x406D,0x406E,0x406F,0x4070,0x4071,
+ 0x4072,0x4073,0x4074,0x4075,0x4076,0x4077,0x4078,0x4079,
+ 0x407A,0x407B,0x407C,0x407D,0x407E,0x407F,0x4080,0x4081,
+ 0x4082,0x4083,0x4084,0x4085,0x4086,0x4087,0x4088,0x4089,
+ 0x408A,0x408B,0x408C,0x408D,0x408E,0x408F,0x4090,0x4091,
+ 0x4092,0x4093,0x4094,0x4095,0x4096,0x4097,0x4098,0x4099,
+ 0x409A,0x409B,0x409C,0x409D,0x409E,0x409F,0x40A0,0x40A1,
+ 0x40A2,0x40A3,0x40A4,0x40A5,0x40A6,0x40A7,0x40A8,0x40A9,
+ 0x40AA,0x40AB,0x40AC,0x40AD,0x40AE,0x40AF,0x40B0,0x40B1,
+ 0x40B2,0x40B3,0x40B4,0x40B5,0x40B6,0x40B7,0x40B8,0x40B9,
+ 0x40BA,0x40BB,0x40BC,0x40BD,0x40BE,0x40BF,0x40C0,0x40C1,
+ 0x40C2,0x40C3,0x40C4,0x40C5,0x40C6,0x40C7,0x40C8,0x40C9,
+ 0x40CA,0x40CB,0x40CC,0x40CD,0x40CE,0x40CF,0x40D0,0x40D1,
+ 0x40D2,0x40D3,0x40D4,0x40D5,0x40D6,0x40D7,0x40D8,0x40D9,
+ 0x40DA,0x40DB,0x40DC,0x40DD,0x40DE,0x40DF,0x40E0,0x40E1,
+ 0x40E2,0x40E3,0x40E4,0x40E5,0x40E6,0x40E7,0x40E8,0x40E9,
+ 0x40EA,0x40EB,0x40EC,0x40ED,0x40EE,0x40EF,0x40F0,0x40F1,
+ 0x40F2,0x40F3,0x40F4,0x40F5,0x40F6,0x40F7,0x40F8,0x40F9,
+ 0x40FA,0x40FB,0x40FC,0x40FD,0x40FE,0x40FF,0x4100,0x4101,
+ 0x4102,0x4103,0x4104,0x4105,0x4106,0x4107,0x4108,0x4109,
+ 0x410A,0x410B,0x410C,0x410D,0x410E,0x410F,0x4110,0x4111,
+ 0x4112,0x4113,0x4114,0x4115,0x4116,0x4117,0x4118,0x4119,
+ 0x411A,0x411B,0x411C,0x411D,0x411E,0x411F,0x4120,0x4121,
+ 0x4122,0x4123,0x4124,0x4125,0x4126,0x4127,0x4128,0x4129,
+ 0x412A,0x412B,0x412C,0x412D,0x412E,0x412F,0x4130,0x4131,
+ 0x4132,0x4133,0x4134,0x4135,0x4136,0x4137,0x4138,0x4139,
+ 0x413A,0x413B,0x413C,0x413D,0x413E,0x413F,0x4140,0x4141,
+ 0x4142,0x4143,0x4144,0x4145,0x4146,0x4147,0x4148,0x4149,
+ 0x414A,0x414B,0x414C,0x414D,0x414E,0x414F,0x4150,0x4151,
+ 0x4152,0x4153,0x4154,0x4155,0x4156,0x4157,0x4158,0x4159,
+ 0x415A,0x415B,0x415C,0x415D,0x415E,0x4338,0x4339,0x433A,
+ 0x433B,0x433C,0x433D,0x433E,0x433F,0x4340,0x4341,0x4342,
+ 0x4343,0x4344,0x4345,0x4346,0x4347,0x4348,0x4349,0x434A,
+ 0x434B,0x434C,0x434D,0x434E,0x434F,0x4350,0x4351,0x4352,
+ 0x4353,0x4354,0x4355,0x4356,0x4357,0x4358,0x4359,0x435A,
+ 0x435B,0x435C,0x435D,0x435E,0x435F,0x4360,0x4361,0x4362,
+ 0x4363,0x4364,0x4365,0x4366,0x4367,0x4368,0x4369,0x436A,
+ 0x436B,0x436C,0x436D,0x436E,0x436F,0x4370,0x4371,0x4372,
+ 0x4373,0x4374,0x4375,0x4376,0x4377,0x4378,0x4379,0x437A,
+ 0x437B,0x437C,0x437D,0x437E,0x437F,0x4380,0x4381,0x4382,
+ 0x4383,0x4384,0x4385,0x4386,0x4387,0x4388,0x4389,0x438A,
+ 0x438B,0x438C,0x438D,0x438E,0x438F,0x4390,0x4391,0x4392,
+ 0x4393,0x4394,0x4395,0x4396,0x4397,0x4398,0x4399,0x439A,
+ 0x439B,0x439C,0x439D,0x439E,0x439F,0x43A0,0x43A1,0x43A2,
+ 0x43A3,0x43A4,0x43A5,0x43A6,0x43A7,0x43A8,0x43A9,0x43AA,
+ 0x43AB,0x43AD,0x43AE,0x43AF,0x43B0,0x43B2,0x43B3,0x43B4,
+ 0x43B5,0x43B6,0x43B7,0x43B8,0x43B9,0x43BA,0x43BB,0x43BC,
+ 0x43BD,0x43BE,0x43BF,0x43C0,0x43C1,0x43C2,0x43C3,0x43C4,
+ 0x43C5,0x43C6,0x43C7,0x43C8,0x43C9,0x43CA,0x43CB,0x43CC,
+ 0x43CD,0x43CE,0x43CF,0x43D0,0x43D1,0x43D2,0x43D3,0x43D4,
+ 0x43D5,0x43D6,0x43D7,0x43D8,0x43D9,0x43DA,0x43DB,0x43DC,
+ 0x43DE,0x43DF,0x43E0,0x43E1,0x43E2,0x43E3,0x43E4,0x43E5,
+ 0x43E6,0x43E7,0x43E8,0x43E9,0x43EA,0x43EB,0x43EC,0x43ED,
+ 0x43EE,0x43EF,0x43F0,0x43F1,0x43F2,0x43F3,0x43F4,0x43F5,
+ 0x43F6,0x43F7,0x43F8,0x43F9,0x43FA,0x43FB,0x43FC,0x43FD,
+ 0x43FE,0x43FF,0x4400,0x4401,0x4402,0x4403,0x4404,0x4405,
+ 0x4406,0x4407,0x4408,0x4409,0x440A,0x440B,0x440C,0x440D,
+ 0x440E,0x440F,0x4410,0x4411,0x4412,0x4413,0x4414,0x4415,
+ 0x4416,0x4417,0x4418,0x4419,0x441A,0x441B,0x441C,0x441D,
+ 0x441E,0x441F,0x4420,0x4421,0x4422,0x4423,0x4424,0x4425,
+ 0x4426,0x4427,0x4428,0x4429,0x442A,0x442B,0x442C,0x442D,
+ 0x442E,0x442F,0x4430,0x4431,0x4432,0x4433,0x4434,0x4435,
+ 0x4436,0x4437,0x4438,0x4439,0x443A,0x443B,0x443C,0x443D,
+ 0x443E,0x443F,0x4440,0x4441,0x4442,0x4443,0x4444,0x4445,
+ 0x4446,0x4447,0x4448,0x4449,0x444A,0x444B,0x444C,0x444D,
+ 0x444E,0x444F,0x4450,0x4451,0x4452,0x4453,0x4454,0x4455,
+ 0x4456,0x4457,0x4458,0x4459,0x445A,0x445B,0x445C,0x445D,
+ 0x445E,0x445F,0x4460,0x4461,0x4462,0x4463,0x4464,0x4465,
+ 0x4466,0x4467,0x4468,0x4469,0x446A,0x446B,0x446C,0x446D,
+ 0x446E,0x446F,0x4470,0x4471,0x4472,0x4473,0x4474,0x4475,
+ 0x4476,0x4477,0x4478,0x4479,0x447A,0x447B,0x447C,0x447D,
+ 0x447E,0x447F,0x4480,0x4481,0x4482,0x4483,0x4484,0x4485,
+ 0x4486,0x4487,0x4488,0x4489,0x448A,0x448B,0x448C,0x448D,
+ 0x448E,0x448F,0x4490,0x4491,0x4492,0x4493,0x4494,0x4495,
+ 0x4496,0x4497,0x4498,0x4499,0x449A,0x449B,0x449C,0x449D,
+ 0x449E,0x449F,0x44A0,0x44A1,0x44A2,0x44A3,0x44A4,0x44A5,
+ 0x44A6,0x44A7,0x44A8,0x44A9,0x44AA,0x44AB,0x44AC,0x44AD,
+ 0x44AE,0x44AF,0x44B0,0x44B1,0x44B2,0x44B3,0x44B4,0x44B5,
+ 0x44B6,0x44B7,0x44B8,0x44B9,0x44BA,0x44BB,0x44BC,0x44BD,
+ 0x44BE,0x44BF,0x44C0,0x44C1,0x44C2,0x44C3,0x44C4,0x44C5,
+ 0x44C6,0x44C7,0x44C8,0x44C9,0x44CA,0x44CB,0x44CC,0x44CD,
+ 0x44CE,0x44CF,0x44D0,0x44D1,0x44D2,0x44D3,0x44D4,0x44D5,
+ 0x464D,0x464E,0x464F,0x4650,0x4651,0x4652,0x4653,0x4654,
+ 0x4655,0x4656,0x4657,0x4658,0x4659,0x465A,0x465B,0x465C,
+ 0x465D,0x465E,0x465F,0x4660,0x4662,0x4663,0x4664,0x4665,
+ 0x4666,0x4667,0x4668,0x4669,0x466A,0x466B,0x466C,0x466D,
+ 0x466E,0x466F,0x4670,0x4671,0x4672,0x4673,0x4674,0x4675,
+ 0x4676,0x4677,0x4678,0x4679,0x467A,0x467B,0x467C,0x467D,
+ 0x467E,0x467F,0x4680,0x4681,0x4682,0x4683,0x4684,0x4685,
+ 0x4686,0x4687,0x4688,0x4689,0x468A,0x468B,0x468C,0x468D,
+ 0x468E,0x468F,0x4690,0x4691,0x4692,0x4693,0x4694,0x4695,
+ 0x4696,0x4697,0x4698,0x4699,0x469A,0x469B,0x469C,0x469D,
+ 0x469E,0x469F,0x46A0,0x46A1,0x46A2,0x46A3,0x46A4,0x46A5,
+ 0x46A6,0x46A7,0x46A8,0x46A9,0x46AA,0x46AB,0x46AC,0x46AD,
+ 0x46AE,0x46AF,0x46B0,0x46B1,0x46B2,0x46B3,0x46B4,0x46B5,
+ 0x46B6,0x46B7,0x46B8,0x46B9,0x46BA,0x46BB,0x46BC,0x46BD,
+ 0x46BE,0x46BF,0x46C0,0x46C1,0x46C2,0x46C3,0x46C4,0x46C5,
+ 0x46C6,0x46C7,0x46C8,0x46C9,0x46CA,0x46CB,0x46CC,0x46CD,
+ 0x46CE,0x46CF,0x46D0,0x46D1,0x46D2,0x46D3,0x46D4,0x46D5,
+ 0x46D6,0x46D7,0x46D8,0x46D9,0x46DA,0x46DB,0x46DC,0x46DD,
+ 0x46DE,0x46DF,0x46E0,0x46E1,0x46E2,0x46E3,0x46E4,0x46E5,
+ 0x46E6,0x46E7,0x46E8,0x46E9,0x46EA,0x46EB,0x46EC,0x46ED,
+ 0x46EE,0x46EF,0x46F0,0x46F1,0x46F2,0x46F3,0x46F4,0x46F5,
+ 0x46F6,0x46F7,0x46F8,0x46F9,0x46FA,0x46FB,0x46FC,0x46FD,
+ 0x46FE,0x46FF,0x4700,0x4701,0x4702,0x4703,0x4704,0x4705,
+ 0x4706,0x4707,0x4708,0x4709,0x470A,0x470B,0x470C,0x470D,
+ 0x470E,0x470F,0x4710,0x4711,0x4712,0x4713,0x4714,0x4715,
+ 0x4716,0x4717,0x4718,0x4719,0x471A,0x471B,0x471C,0x471D,
+ 0x471E,0x471F,0x4720,0x4721,0x4722,0x4724,0x4725,0x4726,
+ 0x4727,0x4728,0x472A,0x472B,0x472C,0x472D,0x472E,0x472F,
+ 0x4730,0x4731,0x4732,0x4733,0x4734,0x4735,0x4736,0x4737,
+ 0x4738,0x4739,0x473A,0x473B,0x473C,0x473D,0x473E,0x473F,
+ 0x4740,0x4741,0x4742,0x4743,0x4744,0x4745,0x4746,0x4747,
+ 0x4748,0x4749,0x474A,0x474B,0x474C,0x474D,0x474E,0x474F,
+ 0x4750,0x4751,0x4752,0x4753,0x4754,0x4755,0x4756,0x4757,
+ 0x4758,0x4759,0x475A,0x475B,0x475C,0x475D,0x475E,0x475F,
+ 0x4760,0x4761,0x4762,0x4763,0x4764,0x4765,0x4766,0x4767,
+ 0x4768,0x4769,0x476A,0x476B,0x476C,0x476D,0x476E,0x476F,
+ 0x4770,0x4771,0x4772,0x4773,0x4774,0x4775,0x4776,0x4777,
+ 0x4778,0x4779,0x477A,0x477B,0x477D,0x477E,0x477F,0x4780,
+ 0x4781,0x4782,0x4783,0x4784,0x4785,0x4786,0x4787,0x4788,
+ 0x4789,0x478A,0x478B,0x478C,0x4948,0x4949,0x494A,0x494B,
+ 0x494C,0x494D,0x494E,0x494F,0x4950,0x4951,0x4952,0x4953,
+ 0x4954,0x4955,0x4956,0x4957,0x4958,0x4959,0x495A,0x495B,
+ 0x495C,0x495D,0x495E,0x495F,0x4960,0x4961,0x4962,0x4963,
+ 0x4964,0x4965,0x4966,0x4967,0x4968,0x4969,0x496A,0x496B,
+ 0x496C,0x496D,0x496E,0x496F,0x4970,0x4971,0x4972,0x4973,
+ 0x4974,0x4975,0x4976,0x4977,0x4978,0x4979,0x497B,0x497C,
+ 0x497E,0x497F,0x4980,0x4981,0x4984,0x4987,0x4988,0x4989,
+ 0x498A,0x498B,0x498C,0x498D,0x498E,0x498F,0x4990,0x4991,
+ 0x4992,0x4993,0x4994,0x4995,0x4996,0x4997,0x4998,0x4999,
+ 0x499A,0x499C,0x499D,0x499E,0x49A0,0x49A1,0x49A2,0x49A3,
+ 0x49A4,0x49A5,0x49A6,0x49A7,0x49A8,0x49A9,0x49AA,0x49AB,
+ 0x49AC,0x49AD,0x49AE,0x49AF,0x49B0,0x49B1,0x49B2,0x49B3,
+ 0x49B4,0x49B5,0x4C78,0x4C79,0x4C7A,0x4C7B,0x4C7C,0x4C7D,
+ 0x4C7E,0x4C7F,0x4C80,0x4C81,0x4C82,0x4C83,0x4C84,0x4C85,
+ 0x4C86,0x4C87,0x4C88,0x4C89,0x4C8A,0x4C8B,0x4C8C,0x4C8D,
+ 0x4C8E,0x4C8F,0x4C90,0x4C91,0x4C92,0x4C93,0x4C94,0x4C95,
+ 0x4C96,0x4C97,0x4C98,0x4C99,0x4C9A,0x4C9B,0x4C9C,0x4C9D,
+ 0x4C9E,0x4CA4,0x4CA5,0x4CA6,0x4CA7,0x4CA8,0x4CA9,0x4CAA,
+ 0x4CAB,0x4CAC,0x4CAD,0x4CAE,0x4CAF,0x4CB0,0x4CB1,0x4CB2,
+ 0x4CB3,0x4CB4,0x4CB5,0x4CB6,0x4CB7,0x4CB8,0x4CB9,0x4CBA,
+ 0x4CBB,0x4CBC,0x4CBD,0x4CBE,0x4CBF,0x4CC0,0x4CC1,0x4CC2,
+ 0x4CC3,0x4CC4,0x4CC5,0x4CC6,0x4CC7,0x4CC8,0x4CC9,0x4CCA,
+ 0x4CCB,0x4CCC,0x4CCD,0x4CCE,0x4CCF,0x4CD0,0x4CD1,0x4CD2,
+ 0x4CD3,0x4CD4,0x4CD5,0x4CD6,0x4CD7,0x4CD8,0x4CD9,0x4CDA,
+ 0x4CDB,0x4CDC,0x4CDD,0x4CDE,0x4CDF,0x4CE0,0x4CE1,0x4CE2,
+ 0x4CE3,0x4CE4,0x4CE5,0x4CE6,0x4CE7,0x4CE8,0x4CE9,0x4CEA,
+ 0x4CEB,0x4CEC,0x4CED,0x4CEE,0x4CEF,0x4CF0,0x4CF1,0x4CF2,
+ 0x4CF3,0x4CF4,0x4CF5,0x4CF6,0x4CF7,0x4CF8,0x4CF9,0x4CFA,
+ 0x4CFB,0x4CFC,0x4CFD,0x4CFE,0x4CFF,0x4D00,0x4D01,0x4D02,
+ 0x4D03,0x4D04,0x4D05,0x4D06,0x4D07,0x4D08,0x4D09,0x4D0A,
+ 0x4D0B,0x4D0C,0x4D0D,0x4D0E,0x4D0F,0x4D10,0x4D11,0x4D12,
+ 0x4D1A,0x4D1B,0x4D1C,0x4D1D,0x4D1E,0x4D1F,0x4D20,0x4D21,
+ 0x4D22,0x4D23,0x4D24,0x4D25,0x4D26,0x4D27,0x4D28,0x4D29,
+ 0x4D2A,0x4D2B,0x4D2C,0x4D2D,0x4D2E,0x4D2F,0x4D30,0x4D31,
+ 0x4D32,0x4D33,0x4D34,0x4D35,0x4D36,0x4D37,0x4D38,0x4D39,
+ 0x4D3A,0x4D3B,0x4D3C,0x4D3D,0x4D3E,0x4D3F,0x4D40,0x4D41,
+ 0x4D42,0x4D43,0x4D44,0x4D45,0x4D46,0x4D47,0x4D48,0x4D49,
+ 0x4D4A,0x4D4B,0x4D4C,0x4D4D,0x4D4E,0x4D4F,0x4D50,0x4D51,
+ 0x4D52,0x4D53,0x4D54,0x4D55,0x4D56,0x4D57,0x4D58,0x4D59,
+ 0x4D5A,0x4D5B,0x4D5C,0x4D5D,0x4D5E,0x4D5F,0x4D60,0x4D61,
+ 0x4D62,0x4D63,0x4D64,0x4D65,0x4D66,0x4D67,0x4D68,0x4D69,
+ 0x4D6A,0x4D6B,0x4D6C,0x4D6D,0x4D6E,0x4D6F,0x4D70,0x4D71,
+ 0x4D72,0x4D73,0x4D74,0x4D75,0x4D76,0x4D77,0x4D78,0x4D79,
+ 0x4D7A,0x4D7B,0x4D7C,0x4D7D,0x4D7E,0x4D7F,0x4D80,0x4D81,
+ 0x4D82,0x4D83,0x4D84,0x4D85,0x4D86,0x4D87,0x4D88,0x4D89,
+ 0x4D8A,0x4D8B,0x4D8C,0x4D8D,0x4D8E,0x4D8F,0x4D90,0x4D91,
+ 0x4D92,0x4D93,0x4D94,0x4D95,0x4D96,0x4D97,0x4D98,0x4D99,
+ 0x4D9A,0x4D9B,0x4D9C,0x4D9D,0x4D9E,0x4D9F,0x4DA0,0x4DA1,
+ 0x4DA2,0x4DA3,0x4DA4,0x4DA5,0x4DA6,0x4DA7,0x4DA8,0x4DA9,
+ 0x4DAA,0x4DAB,0x4DAC,0x4DAD,0x4DAF,0x4DB0,0x4DB1,0x4DB2,
+ 0x4DB3,0x4DB4,0x4DB5,0x4DB6,0x4DB7,0x4DB8,0x4DB9,0x4DBA,
+ 0x4DBB,0x4DBC,0x4DBD,0x4DBE,0x4DBF,0x4DC0,0x4DC1,0x4DC2,
+ 0x4DC3,0x4DC4,0x4DC5,0x4DC6,0x4DC7,0x4DC8,0x4DC9,0x4DCA,
+ 0x4DCB,0x4DCC,0x4DCD,0x4DCE,0x4DCF,0x4DD0,0x4DD1,0x4DD2,
+ 0x4DD3,0x4DD4,0x4DD5,0x4DD6,0x4DD7,0x4DD8,0x4DD9,0x4DDA,
+ 0x4DDB,0x4DDC,0x4DDD,0x4DDE,0x4DDF,0x4DE0,0x4DE1,0x4DE2,
+ 0x4DE3,0x4DE4,0x4DE5,0x4DE6,0x4DE7,0x4DE8,0x4DE9,0x4DEA,
+ 0x4DEB,0x4DEC,0x4DED,0x4DEE,0x4DEF,0x4DF0,0x4DF1,0x4DF2,
+ 0x4DF3,0x4DF4,0x4DF5,0x4DF6,0x4DF7,0x4DF8,0x4DF9,0x4DFA,
+ 0x4DFB,0x4DFC,0x4DFD,0x4DFE,0x4DFF,0xE76C,0xE7C8,0xE7E7,
+ 0xE7E8,0xE7E9,0xE7EA,0xE7EB,0xE7EC,0xE7ED,0xE7EE,0xE7EF,
+ 0xE7F0,0xE7F1,0xE7F2,0xE7F3,0xE815,0xE819,0xE81A,0xE81B,
+ 0xE81C,0xE81D,0xE81F,0xE820,0xE821,0xE822,0xE823,0xE824,
+ 0xE825,0xE827,0xE828,0xE829,0xE82A,0xE82D,0xE82E,0xE82F,
+ 0xE830,0xE833,0xE834,0xE835,0xE836,0xE837,0xE838,0xE839,
+ 0xE83A,0xE83C,0xE83D,0xE83E,0xE83F,0xE840,0xE841,0xE842,
+ 0xE844,0xE845,0xE846,0xE847,0xE848,0xE849,0xE84A,0xE84B,
+ 0xE84C,0xE84D,0xE84E,0xE84F,0xE850,0xE851,0xE852,0xE853,
+ 0xE856,0xE857,0xE858,0xE859,0xE85A,0xE85B,0xE85C,0xE85D,
+ 0xE85E,0xE85F,0xE860,0xE861,0xE862,0xE863,0xF92D,0xF92E,
+ 0xF92F,0xF930,0xF931,0xF932,0xF933,0xF934,0xF935,0xF936,
+ 0xF937,0xF938,0xF939,0xF93A,0xF93B,0xF93C,0xF93D,0xF93E,
+ 0xF93F,0xF940,0xF941,0xF942,0xF943,0xF944,0xF945,0xF946,
+ 0xF947,0xF948,0xF949,0xF94A,0xF94B,0xF94C,0xF94D,0xF94E,
+ 0xF94F,0xF950,0xF951,0xF952,0xF953,0xF954,0xF955,0xF956,
+ 0xF957,0xF958,0xF959,0xF95A,0xF95B,0xF95C,0xF95D,0xF95E,
+ 0xF95F,0xF960,0xF961,0xF962,0xF963,0xF964,0xF965,0xF966,
+ 0xF967,0xF968,0xF969,0xF96A,0xF96B,0xF96C,0xF96D,0xF96E,
+ 0xF96F,0xF970,0xF971,0xF972,0xF973,0xF974,0xF975,0xF976,
+ 0xF977,0xF978,0xF97A,0xF97B,0xF97C,0xF97D,0xF97E,0xF97F,
+ 0xF980,0xF981,0xF982,0xF983,0xF984,0xF985,0xF986,0xF987,
+ 0xF988,0xF989,0xF98A,0xF98B,0xF98C,0xF98D,0xF98E,0xF98F,
+ 0xF990,0xF991,0xF992,0xF993,0xF994,0xF996,0xF997,0xF998,
+ 0xF999,0xF99A,0xF99B,0xF99C,0xF99D,0xF99E,0xF99F,0xF9A0,
+ 0xF9A1,0xF9A2,0xF9A3,0xF9A4,0xF9A5,0xF9A6,0xF9A7,0xF9A8,
+ 0xF9A9,0xF9AA,0xF9AB,0xF9AC,0xF9AD,0xF9AE,0xF9AF,0xF9B0,
+ 0xF9B1,0xF9B2,0xF9B3,0xF9B4,0xF9B5,0xF9B6,0xF9B7,0xF9B8,
+ 0xF9B9,0xF9BA,0xF9BB,0xF9BC,0xF9BD,0xF9BE,0xF9BF,0xF9C0,
+ 0xF9C1,0xF9C2,0xF9C3,0xF9C4,0xF9C5,0xF9C6,0xF9C7,0xF9C8,
+ 0xF9C9,0xF9CA,0xF9CB,0xF9CC,0xF9CD,0xF9CE,0xF9CF,0xF9D0,
+ 0xF9D1,0xF9D2,0xF9D3,0xF9D4,0xF9D5,0xF9D6,0xF9D7,0xF9D8,
+ 0xF9D9,0xF9DA,0xF9DB,0xF9DC,0xF9DD,0xF9DE,0xF9DF,0xF9E0,
+ 0xF9E1,0xF9E2,0xF9E3,0xF9E4,0xF9E5,0xF9E6,0xF9E8,0xF9E9,
+ 0xF9EA,0xF9EB,0xF9EC,0xF9ED,0xF9EE,0xF9EF,0xF9F0,0xF9F2,
+ 0xF9F3,0xF9F4,0xF9F5,0xF9F6,0xF9F7,0xF9F8,0xF9F9,0xF9FA,
+ 0xF9FB,0xF9FC,0xF9FD,0xF9FE,0xF9FF,0xFA00,0xFA01,0xFA02,
+ 0xFA03,0xFA04,0xFA05,0xFA06,0xFA07,0xFA08,0xFA09,0xFA0A,
+ 0xFA0B,0xFA10,0xFA12,0xFA15,0xFA16,0xFA17,0xFA19,0xFA1A,
+ 0xFA1B,0xFA1C,0xFA1D,0xFA1E,0xFA22,0xFA25,0xFA26,0xFE32,
+ 0xFE45,0xFE46,0xFE47,0xFE48,0xFE53,0xFE58,0xFE67,0xFE6C,
+ 0xFE6D,0xFE6E,0xFE6F,0xFE70,0xFE71,0xFE72,0xFE73,0xFE74,
+ 0xFE75,0xFE76,0xFE77,0xFE78,0xFE79,0xFE7A,0xFE7B,0xFE7C,
+ 0xFE7D,0xFE7E,0xFE7F,0xFE80,0xFE81,0xFE82,0xFE83,0xFE84,
+ 0xFE85,0xFE86,0xFE87,0xFE88,0xFE89,0xFE8A,0xFE8B,0xFE8C,
+ 0xFE8D,0xFE8E,0xFE8F,0xFE90,0xFE91,0xFE92,0xFE93,0xFE94,
+ 0xFE95,0xFE96,0xFE97,0xFE98,0xFE99,0xFE9A,0xFE9B,0xFE9C,
+ 0xFE9D,0xFE9E,0xFE9F,0xFEA0,0xFEA1,0xFEA2,0xFEA3,0xFEA4,
+ 0xFEA5,0xFEA6,0xFEA7,0xFEA8,0xFEA9,0xFEAA,0xFEAB,0xFEAC,
+ 0xFEAD,0xFEAE,0xFEAF,0xFEB0,0xFEB1,0xFEB2,0xFEB3,0xFEB4,
+ 0xFEB5,0xFEB6,0xFEB7,0xFEB8,0xFEB9,0xFEBA,0xFEBB,0xFEBC,
+ 0xFEBD,0xFEBE,0xFEBF,0xFEC0,0xFEC1,0xFEC2,0xFEC3,0xFEC4,
+ 0xFEC5,0xFEC6,0xFEC7,0xFEC8,0xFEC9,0xFECA,0xFECB,0xFECC,
+ 0xFECD,0xFECE,0xFECF,0xFED0,0xFED1,0xFED2,0xFED3,0xFED4,
+ 0xFED5,0xFED6,0xFED7,0xFED8,0xFED9,0xFEDA,0xFEDB,0xFEDC,
+ 0xFEDD,0xFEDE,0xFEDF,0xFEE0,0xFEE1,0xFEE2,0xFEE3,0xFEE4,
+ 0xFEE5,0xFEE6,0xFEE7,0xFEE8,0xFEE9,0xFEEA,0xFEEB,0xFEEC,
+ 0xFEED,0xFEEE,0xFEEF,0xFEF0,0xFEF1,0xFEF2,0xFEF3,0xFEF4,
+ 0xFEF5,0xFEF6,0xFEF7,0xFEF8,0xFEF9,0xFEFA,0xFEFB,0xFEFC,
+ 0xFEFD,0xFEFE,0xFEFF,0xFF00,0xFF5F,0xFF60,0xFF61,0xFF62,
+ 0xFF63,0xFF64,0xFF65,0xFF66,0xFF67,0xFF68,0xFF69,0xFF6A,
+ 0xFF6B,0xFF6C,0xFF6D,0xFF6E,0xFF6F,0xFF70,0xFF71,0xFF72,
+ 0xFF73,0xFF74,0xFF75,0xFF76,0xFF77,0xFF78,0xFF79,0xFF7A,
+ 0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F,0xFF80,0xFF81,0xFF82,
+ 0xFF83,0xFF84,0xFF85,0xFF86,0xFF87,0xFF88,0xFF89,0xFF8A,
+ 0xFF8B,0xFF8C,0xFF8D,0xFF8E,0xFF8F,0xFF90,0xFF91,0xFF92,
+ 0xFF93,0xFF94,0xFF95,0xFF96,0xFF97,0xFF98,0xFF99,0xFF9A,
+ 0xFF9B,0xFF9C,0xFF9D,0xFF9E,0xFF9F,0xFFA0,0xFFA1,0xFFA2,
+ 0xFFA3,0xFFA4,0xFFA5,0xFFA6,0xFFA7,0xFFA8,0xFFA9,0xFFAA,
+ 0xFFAB,0xFFAC,0xFFAD,0xFFAE,0xFFAF,0xFFB0,0xFFB1,0xFFB2,
+ 0xFFB3,0xFFB4,0xFFB5,0xFFB6,0xFFB7,0xFFB8,0xFFB9,0xFFBA,
+ 0xFFBB,0xFFBC,0xFFBD,0xFFBE,0xFFBF,0xFFC0,0xFFC1,0xFFC2,
+ 0xFFC3,0xFFC4,0xFFC5,0xFFC6,0xFFC7,0xFFC8,0xFFC9,0xFFCA,
+ 0xFFCB,0xFFCC,0xFFCD,0xFFCE,0xFFCF,0xFFD0,0xFFD1,0xFFD2,
+ 0xFFD3,0xFFD4,0xFFD5,0xFFD6,0xFFD7,0xFFD8,0xFFD9,0xFFDA,
+ 0xFFDB,0xFFDC,0xFFDD,0xFFDE,0xFFDF,
+};
+
+static ImplGb180302000ToUnicodeRange const
+ aImplGb180302000ToUnicodeRanges[] = {
+ { 23940, 820, 7922, 0x0452 },
+ { 24760, 9219, 11329, 0x2643 },
+ { 26057, 12973, 13738, 0x361B },
+ { 27701, 14698, 15583, 0x3CE1 },
+ { 28661, 15847, 16318, 0x4160 },
+ { 28925, 16729, 17102, 0x44D7 },
+ { 29336, 17418, 17859, 0x478E },
+ { 29652, 17961, 18664, 0x49B8 },
+ { 29754, 19043, 33469, 0x9FA6 },
+ { 30133, 33550, 37845, 0xE865 },
+ { 30214, 38078, 39108, 0xFA2A },
+ { 30447, 39394, 39420, 0xFFE6 },
+ { -1, 0, 0, 0 }
+};
+
+static sal_uInt32 const aImplUnicodeToGb180302000Data[] = {
+ 0x81308130,0x81308131,0x81308132,0x81308133,0x81308134,0x81308135,
+ 0x81308136,0x81308137,0x81308138,0x81308139,0x81308230,0x81308231,
+ 0x81308232,0x81308233,0x81308234,0x81308235,0x81308236,0x81308237,
+ 0x81308238,0x81308239,0x81308330,0x81308331,0x81308332,0x81308333,
+ 0x81308334,0x81308335,0x81308336,0x81308337,0x81308338,0x81308339,
+ 0x81308430,0x81308431,0x81308432,0x81308433,0x81308434,0x81308435,
+ 0xA1E8,0x81308436,0x81308437, 0xA1EC, 0xA1A7,0x81308438,
+ 0x81308439,0x81308530,0x81308531,0x81308532,0x81308533,0x81308534,
+ 0xA1E3, 0xA1C0,0x81308535,0x81308536,0x81308537,0x81308538,
+ 0x81308539, 0xA1A4,0x81308630,0x81308631,0x81308632,0x81308633,
+ 0x81308634,0x81308635,0x81308636,0x81308637,0x81308638,0x81308639,
+ 0x81308730,0x81308731,0x81308732,0x81308733,0x81308734,0x81308735,
+ 0x81308736,0x81308737,0x81308738,0x81308739,0x81308830,0x81308831,
+ 0x81308832,0x81308833,0x81308834,0x81308835,0x81308836,0x81308837,
+ 0x81308838,0x81308839,0x81308930, 0xA1C1,0x81308931,0x81308932,
+ 0x81308933,0x81308934,0x81308935,0x81308936,0x81308937,0x81308938,
+ 0xA8A4, 0xA8A2,0x81308939,0x81308A30,0x81308A31,0x81308A32,
+ 0x81308A33,0x81308A34, 0xA8A8, 0xA8A6, 0xA8BA,0x81308A35,
+ 0xA8AC, 0xA8AA,0x81308A36,0x81308A37,0x81308A38,0x81308A39,
+ 0xA8B0, 0xA8AE,0x81308B30,0x81308B31,0x81308B32, 0xA1C2,
+ 0x81308B33, 0xA8B4, 0xA8B2,0x81308B34, 0xA8B9,0x81308B35,
+ 0x81308B36,0x81308B37,0x81308B38, 0xA8A1,0x81308B39,0x81308C30,
+ 0x81308C31,0x81308C32,0x81308C33,0x81308C34,0x81308C35,0x81308C36,
+ 0x81308C37,0x81308C38,0x81308C39,0x81308D30,0x81308D31,0x81308D32,
+ 0x81308D33,0x81308D34,0x81308D35, 0xA8A5,0x81308D36,0x81308D37,
+ 0x81308D38,0x81308D39,0x81308E30,0x81308E31,0x81308E32, 0xA8A7,
+ 0x81308E33,0x81308E34,0x81308E35,0x81308E36,0x81308E37,0x81308E38,
+ 0x81308E39,0x81308F30,0x81308F31,0x81308F32,0x81308F33,0x81308F34,
+ 0x81308F35,0x81308F36,0x81308F37, 0xA8A9,0x81308F38,0x81308F39,
+ 0x81309030,0x81309031,0x81309032,0x81309033,0x81309034,0x81309035,
+ 0x81309036,0x81309037,0x81309038,0x81309039,0x81309130,0x81309131,
+ 0x81309132,0x81309133,0x81309134,0x81309135,0x81309136,0x81309137,
+ 0x81309138,0x81309139,0x81309230,0x81309231, 0xA8BD,0x81309232,
+ 0x81309233,0x81309234, 0xA8BE,0x81309235,0x81309236,0x81309237,
+ 0x81309238, 0xA8AD,0x81309239,0x81309330,0x81309331,0x81309332,
+ 0x81309333,0x81309334,0x81309335,0x81309336,0x81309337,0x81309338,
+ 0x81309339,0x81309430,0x81309431,0x81309432,0x81309433,0x81309434,
+ 0x81309435,0x81309436,0x81309437,0x81309438,0x81309439,0x81309530,
+ 0x81309531,0x81309532,0x81309533,0x81309534,0x81309535,0x81309536,
+ 0x81309537, 0xA8B1,0x81309538,0x81309539,0x81309630,0x81309631,
+ 0x81309632,0x81309633,0x81309634,0x81309635,0x81309636,0x81309637,
+ 0x81309638,0x81309639,0x81309730,0x81309731,0x81309732,0x81309733,
+ 0x81309734,0x81309735,0x81309736,0x81309737,0x81309738,0x81309739,
+ 0x81309830,0x81309831,0x81309832,0x81309833,0x81309834,0x81309835,
+ 0x81309836,0x81309837,0x81309838,0x81309839,0x81309930,0x81309931,
+ 0x81309932,0x81309933,0x81309934,0x81309935,0x81309936,0x81309937,
+ 0x81309938,0x81309939,0x81309A30,0x81309A31,0x81309A32,0x81309A33,
+ 0x81309A34,0x81309A35,0x81309A36,0x81309A37,0x81309A38,0x81309A39,
+ 0x81309B30,0x81309B31,0x81309B32,0x81309B33,0x81309B34,0x81309B35,
+ 0x81309B36,0x81309B37,0x81309B38,0x81309B39,0x81309C30,0x81309C31,
+ 0x81309C32,0x81309C33,0x81309C34,0x81309C35,0x81309C36,0x81309C37,
+ 0x81309C38,0x81309C39,0x81309D30,0x81309D31,0x81309D32,0x81309D33,
+ 0x81309D34,0x81309D35,0x81309D36,0x81309D37,0x81309D38,0x81309D39,
+ 0x81309E30,0x81309E31,0x81309E32,0x81309E33,0x81309E34,0x81309E35,
+ 0x81309E36,0x81309E37,0x81309E38,0x81309E39,0x81309F30,0x81309F31,
+ 0x81309F32,0x81309F33,0x81309F34,0x81309F35, 0xA8A3,0x81309F36,
+ 0xA8AB,0x81309F37, 0xA8AF,0x81309F38, 0xA8B3,0x81309F39,
+ 0xA8B5,0x8130A030, 0xA8B6,0x8130A031, 0xA8B7,0x8130A032,
+ 0xA8B8,0x8130A033,0x8130A034,0x8130A035,0x8130A036,0x8130A037,
+ 0x8130A038,0x8130A039,0x8130A130,0x8130A131,0x8130A132,0x8130A133,
+ 0x8130A134,0x8130A135,0x8130A136,0x8130A137,0x8130A138,0x8130A139,
+ 0x8130A230,0x8130A231,0x8130A232,0x8130A233,0x8130A234,0x8130A235,
+ 0x8130A236,0x8130A237,0x8130A238,0x8130A239,0x8130A330, 0xA8BF,
+ 0x8130A331,0x8130A332,0x8130A333,0x8130A334,0x8130A335,0x8130A336,
+ 0x8130A337,0x8130A338,0x8130A339,0x8130A430,0x8130A431,0x8130A432,
+ 0x8130A433,0x8130A434,0x8130A435,0x8130A436,0x8130A437,0x8130A438,
+ 0x8130A439,0x8130A530,0x8130A531,0x8130A532,0x8130A533,0x8130A534,
+ 0x8130A535,0x8130A536,0x8130A537,0x8130A538,0x8130A539,0x8130A630,
+ 0x8130A631,0x8130A632,0x8130A633,0x8130A634,0x8130A635,0x8130A636,
+ 0x8130A637,0x8130A638,0x8130A639,0x8130A730,0x8130A731,0x8130A732,
+ 0x8130A733,0x8130A734,0x8130A735,0x8130A736,0x8130A737,0x8130A738,
+ 0x8130A739,0x8130A830,0x8130A831,0x8130A832,0x8130A833,0x8130A834,
+ 0x8130A835,0x8130A836,0x8130A837,0x8130A838,0x8130A839,0x8130A930,
+ 0x8130A931,0x8130A932,0x8130A933,0x8130A934,0x8130A935,0x8130A936,
+ 0x8130A937,0x8130A938,0x8130A939,0x8130AA30,0x8130AA31,0x8130AA32,
+ 0x8130AA33,0x8130AA34,0x8130AA35,0x8130AA36,0x8130AA37,0x8130AA38,
+ 0x8130AA39,0x8130AB30,0x8130AB31,0x8130AB32,0x8130AB33,0x8130AB34,
+ 0x8130AB35,0x8130AB36,0x8130AB37, 0xA8BB,0x8130AB38,0x8130AB39,
+ 0x8130AC30,0x8130AC31,0x8130AC32,0x8130AC33,0x8130AC34,0x8130AC35,
+ 0x8130AC36,0x8130AC37,0x8130AC38,0x8130AC39,0x8130AD30,0x8130AD31,
+ 0x8130AD32, 0xA8C0,0x8130AD33,0x8130AD34,0x8130AD35,0x8130AD36,
+ 0x8130AD37,0x8130AD38,0x8130AD39,0x8130AE30,0x8130AE31,0x8130AE32,
+ 0x8130AE33,0x8130AE34,0x8130AE35,0x8130AE36,0x8130AE37,0x8130AE38,
+ 0x8130AE39,0x8130AF30,0x8130AF31,0x8130AF32,0x8130AF33,0x8130AF34,
+ 0x8130AF35,0x8130AF36,0x8130AF37,0x8130AF38,0x8130AF39,0x8130B030,
+ 0x8130B031,0x8130B032,0x8130B033,0x8130B034,0x8130B035,0x8130B036,
+ 0x8130B037,0x8130B038,0x8130B039,0x8130B130,0x8130B131,0x8130B132,
+ 0x8130B133,0x8130B134,0x8130B135,0x8130B136,0x8130B137,0x8130B138,
+ 0x8130B139,0x8130B230,0x8130B231,0x8130B232,0x8130B233,0x8130B234,
+ 0x8130B235,0x8130B236,0x8130B237,0x8130B238,0x8130B239,0x8130B330,
+ 0x8130B331,0x8130B332,0x8130B333,0x8130B334,0x8130B335,0x8130B336,
+ 0x8130B337,0x8130B338,0x8130B339,0x8130B430,0x8130B431,0x8130B432,
+ 0x8130B433,0x8130B434,0x8130B435,0x8130B436,0x8130B437,0x8130B438,
+ 0x8130B439,0x8130B530,0x8130B531,0x8130B532,0x8130B533,0x8130B534,
+ 0x8130B535,0x8130B536,0x8130B537,0x8130B538,0x8130B539,0x8130B630,
+ 0x8130B631,0x8130B632,0x8130B633,0x8130B634,0x8130B635,0x8130B636,
+ 0x8130B637,0x8130B638,0x8130B639,0x8130B730,0x8130B731,0x8130B732,
+ 0x8130B733, 0xA1A6,0x8130B734, 0xA1A5, 0xA840, 0xA841,
+ 0x8130B735,0x8130B736,0x8130B737,0x8130B738,0x8130B739,0x8130B830,
+ 0x8130B831,0x8130B832,0x8130B833,0x8130B834,0x8130B835,0x8130B836,
+ 0x8130B837, 0xA842,0x8130B838,0x8130B839,0x8130B930,0x8130B931,
+ 0x8130B932,0x8130B933,0x8130B934,0x8130B935,0x8130B936,0x8130B937,
+ 0x8130B938,0x8130B939,0x8130BA30,0x8130BA31,0x8130BA32,0x8130BA33,
+ 0x8130BA34,0x8130BA35,0x8130BA36,0x8130BA37,0x8130BA38,0x8130BA39,
+ 0x8130BB30,0x8130BB31,0x8130BB32,0x8130BB33,0x8130BB34,0x8130BB35,
+ 0x8130BB36,0x8130BB37,0x8130BB38,0x8130BB39,0x8130BC30,0x8130BC31,
+ 0x8130BC32,0x8130BC33,0x8130BC34,0x8130BC35,0x8130BC36,0x8130BC37,
+ 0x8130BC38,0x8130BC39,0x8130BD30,0x8130BD31,0x8130BD32,0x8130BD33,
+ 0x8130BD34,0x8130BD35,0x8130BD36,0x8130BD37,0x8130BD38,0x8130BD39,
+ 0x8130BE30,0x8130BE31,0x8130BE32,0x8130BE33,0x8130BE34,0x8130BE35,
+ 0x8130BE36,0x8130BE37,0x8130BE38,0x8130BE39,0x8130BF30,0x8130BF31,
+ 0x8130BF32,0x8130BF33,0x8130BF34,0x8130BF35,0x8130BF36,0x8130BF37,
+ 0x8130BF38,0x8130BF39,0x8130C030,0x8130C031,0x8130C032,0x8130C033,
+ 0x8130C034,0x8130C035,0x8130C036,0x8130C037,0x8130C038,0x8130C039,
+ 0x8130C130,0x8130C131,0x8130C132,0x8130C133,0x8130C134,0x8130C135,
+ 0x8130C136,0x8130C137,0x8130C138,0x8130C139,0x8130C230,0x8130C231,
+ 0x8130C232,0x8130C233,0x8130C234,0x8130C235,0x8130C236,0x8130C237,
+ 0x8130C238,0x8130C239,0x8130C330,0x8130C331,0x8130C332,0x8130C333,
+ 0x8130C334,0x8130C335,0x8130C336,0x8130C337,0x8130C338,0x8130C339,
+ 0x8130C430,0x8130C431,0x8130C432,0x8130C433,0x8130C434,0x8130C435,
+ 0x8130C436,0x8130C437,0x8130C438,0x8130C439,0x8130C530,0x8130C531,
+ 0x8130C532,0x8130C533,0x8130C534,0x8130C535,0x8130C536,0x8130C537,
+ 0x8130C538,0x8130C539,0x8130C630,0x8130C631,0x8130C632,0x8130C633,
+ 0x8130C634,0x8130C635,0x8130C636,0x8130C637,0x8130C638,0x8130C639,
+ 0x8130C730,0x8130C731,0x8130C732,0x8130C733,0x8130C734,0x8130C735,
+ 0x8130C736,0x8130C737,0x8130C738,0x8130C739,0x8130C830,0x8130C831,
+ 0x8130C832,0x8130C833,0x8130C834,0x8130C835,0x8130C836,0x8130C837,
+ 0x8130C838,0x8130C839,0x8130C930,0x8130C931,0x8130C932,0x8130C933,
+ 0x8130C934,0x8130C935,0x8130C936,0x8130C937,0x8130C938,0x8130C939,
+ 0x8130CA30,0x8130CA31,0x8130CA32,0x8130CA33,0x8130CA34,0x8130CA35,
+ 0x8130CA36,0x8130CA37,0x8130CA38,0x8130CA39,0x8130CB30, 0xA6A1,
+ 0xA6A2, 0xA6A3, 0xA6A4, 0xA6A5, 0xA6A6, 0xA6A7,
+ 0xA6A8, 0xA6A9, 0xA6AA, 0xA6AB, 0xA6AC, 0xA6AD,
+ 0xA6AE, 0xA6AF, 0xA6B0, 0xA6B1,0x8130CB31, 0xA6B2,
+ 0xA6B3, 0xA6B4, 0xA6B5, 0xA6B6, 0xA6B7, 0xA6B8,
+ 0x8130CB32,0x8130CB33,0x8130CB34,0x8130CB35,0x8130CB36,0x8130CB37,
+ 0x8130CB38, 0xA6C1, 0xA6C2, 0xA6C3, 0xA6C4, 0xA6C5,
+ 0xA6C6, 0xA6C7, 0xA6C8, 0xA6C9, 0xA6CA, 0xA6CB,
+ 0xA6CC, 0xA6CD, 0xA6CE, 0xA6CF, 0xA6D0, 0xA6D1,
+ 0x8130CB39, 0xA6D2, 0xA6D3, 0xA6D4, 0xA6D5, 0xA6D6,
+ 0xA6D7, 0xA6D8,0x8130CC30,0x8130CC31,0x8130CC32,0x8130CC33,
+ 0x8130CC34,0x8130CC35,0x8130CC36,0x8130CC37,0x8130CC38,0x8130CC39,
+ 0x8130CD30,0x8130CD31,0x8130CD32,0x8130CD33,0x8130CD34,0x8130CD35,
+ 0x8130CD36,0x8130CD37,0x8130CD38,0x8130CD39,0x8130CE30,0x8130CE31,
+ 0x8130CE32,0x8130CE33,0x8130CE34,0x8130CE35,0x8130CE36,0x8130CE37,
+ 0x8130CE38,0x8130CE39,0x8130CF30,0x8130CF31,0x8130CF32,0x8130CF33,
+ 0x8130CF34,0x8130CF35,0x8130CF36,0x8130CF37,0x8130CF38,0x8130CF39,
+ 0x8130D030,0x8130D031,0x8130D032,0x8130D033,0x8130D034,0x8130D035,
+ 0x8130D036,0x8130D037,0x8130D038,0x8130D039,0x8130D130,0x8130D131,
+ 0x8130D132,0x8130D133,0x8130D134, 0xA7A7,0x8130D135,0x8130D136,
+ 0x8130D137,0x8130D138,0x8130D139,0x8130D230,0x8130D231,0x8130D232,
+ 0x8130D233,0x8130D234,0x8130D235,0x8130D236,0x8130D237,0x8130D238,
+ 0xA7A1, 0xA7A2, 0xA7A3, 0xA7A4, 0xA7A5, 0xA7A6,
+ 0xA7A8, 0xA7A9, 0xA7AA, 0xA7AB, 0xA7AC, 0xA7AD,
+ 0xA7AE, 0xA7AF, 0xA7B0, 0xA7B1, 0xA7B2, 0xA7B3,
+ 0xA7B4, 0xA7B5, 0xA7B6, 0xA7B7, 0xA7B8, 0xA7B9,
+ 0xA7BA, 0xA7BB, 0xA7BC, 0xA7BD, 0xA7BE, 0xA7BF,
+ 0xA7C0, 0xA7C1, 0xA7D1, 0xA7D2, 0xA7D3, 0xA7D4,
+ 0xA7D5, 0xA7D6, 0xA7D8, 0xA7D9, 0xA7DA, 0xA7DB,
+ 0xA7DC, 0xA7DD, 0xA7DE, 0xA7DF, 0xA7E0, 0xA7E1,
+ 0xA7E2, 0xA7E3, 0xA7E4, 0xA7E5, 0xA7E6, 0xA7E7,
+ 0xA7E8, 0xA7E9, 0xA7EA, 0xA7EB, 0xA7EC, 0xA7ED,
+ 0xA7EE, 0xA7EF, 0xA7F0, 0xA7F1,0x8130D239, 0xA7D7,
+ 0xA95C,0x8136A532,0x8136A533, 0xA843, 0xA1AA, 0xA844,
+ 0xA1AC,0x8136A534, 0xA1AE, 0xA1AF,0x8136A535,0x8136A536,
+ 0xA1B0, 0xA1B1,0x8136A537,0x8136A538,0x8136A539,0x8136A630,
+ 0x8136A631,0x8136A632,0x8136A633, 0xA845, 0xA1AD,0x8136A634,
+ 0x8136A635,0x8136A636,0x8136A637,0x8136A638,0x8136A639,0x8136A730,
+ 0x8136A731,0x8136A732, 0xA1EB,0x8136A733, 0xA1E4, 0xA1E5,
+ 0x8136A734, 0xA846,0x8136A735,0x8136A736,0x8136A737,0x8136A738,
+ 0x8136A739, 0xA1F9,0x8136A830,0x8136A831,0x8136A832,0x8136A833,
+ 0x8136A834,0x8136A835,0x8136A836,0x8136A837,0x8136A838,0x8136A839,
+ 0x8136A930,0x8136A931,0x8136A932,0x8136A933,0x8136A934,0x8136A935,
+ 0x8136A936,0x8136A937,0x8136A938,0x8136A939,0x8136AA30,0x8136AA31,
+ 0x8136AA32,0x8136AA33,0x8136AA34,0x8136AA35,0x8136AA36,0x8136AA37,
+ 0x8136AA38,0x8136AA39,0x8136AB30,0x8136AB31,0x8136AB32,0x8136AB33,
+ 0x8136AB34,0x8136AB35,0x8136AB36,0x8136AB37,0x8136AB38,0x8136AB39,
+ 0x8136AC30,0x8136AC31,0x8136AC32,0x8136AC33,0x8136AC34,0x8136AC35,
+ 0x8136AC36,0x8136AC37,0x8136AC38,0x8136AC39,0x8136AD30,0x8136AD31,
+ 0x8136AD32,0x8136AD33,0x8136AD34,0x8136AD35,0x8136AD36,0x8136AD37,
+ 0x8136AD38,0x8136AD39,0x8136AE30,0x8136AE31,0x8136AE32,0x8136AE33,
+ 0x8136AE34,0x8136AE35,0x8136AE36,0x8136AE37,0x8136AE38,0x8136AE39,
+ 0x8136AF30,0x8136AF31,0x8136AF32,0x8136AF33,0x8136AF34,0x8136AF35,
+ 0x8136AF36,0x8136AF37,0x8136AF38,0x8136AF39,0x8136B030,0x8136B031,
+ 0x8136B032,0x8136B033,0x8136B034,0x8136B035,0x8136B036,0x8136B037,
+ 0x8136B038,0x8136B039,0x8136B130,0x8136B131,0x8136B132,0x8136B133,
+ 0x8136B134,0x8136B135,0x8136B136,0x8136B137,0x8136B138,0x8136B139,
+ 0x8136B230,0x8136B231,0x8136B232,0x8136B233,0x8136B234,0x8136B235,
+ 0x8136B236,0x8136B237,0x8136B238,0x8136B239,0x8136B330,0x8136B331,
+ 0xA2E3,0x8136B332,0x8136B333,0x8136B334,0x8136B335,0x8136B336,
+ 0x8136B337,0x8136B338,0x8136B339,0x8136B430,0x8136B431,0x8136B432,
+ 0x8136B433,0x8136B434,0x8136B435,0x8136B436,0x8136B437,0x8136B438,
+ 0x8136B439,0x8136B530,0x8136B531,0x8136B532,0x8136B533,0x8136B534,
+ 0x8136B535,0x8136B536,0x8136B537,0x8136B538,0x8136B539,0x8136B630,
+ 0x8136B631,0x8136B632,0x8136B633,0x8136B634,0x8136B635,0x8136B636,
+ 0x8136B637,0x8136B638,0x8136B639,0x8136B730,0x8136B731,0x8136B732,
+ 0x8136B733,0x8136B734,0x8136B735,0x8136B736,0x8136B737,0x8136B738,
+ 0x8136B739,0x8136B830,0x8136B831,0x8136B832,0x8136B833,0x8136B834,
+ 0x8136B835,0x8136B836,0x8136B837,0x8136B838,0x8136B839,0x8136B930,
+ 0x8136B931,0x8136B932,0x8136B933,0x8136B934,0x8136B935,0x8136B936,
+ 0x8136B937,0x8136B938,0x8136B939,0x8136BA30,0x8136BA31,0x8136BA32,
+ 0x8136BA33,0x8136BA34,0x8136BA35,0x8136BA36,0x8136BA37,0x8136BA38,
+ 0x8136BA39,0x8136BB30,0x8136BB31,0x8136BB32,0x8136BB33,0x8136BB34,
+ 0x8136BB35,0x8136BB36,0x8136BB37, 0xA1E6,0x8136BB38, 0xA847,
+ 0x8136BB39,0x8136BC30,0x8136BC31, 0xA848,0x8136BC32,0x8136BC33,
+ 0x8136BC34,0x8136BC35,0x8136BC36,0x8136BC37,0x8136BC38,0x8136BC39,
+ 0x8136BD30,0x8136BD31,0x8136BD32,0x8136BD33, 0xA1ED,0x8136BD34,
+ 0x8136BD35,0x8136BD36,0x8136BD37,0x8136BD38,0x8136BD39,0x8136BE30,
+ 0x8136BE31,0x8136BE32,0x8136BE33, 0xA959,0x8136BE34,0x8136BE35,
+ 0x8136BE36,0x8136BE37,0x8136BE38,0x8136BE39,0x8136BF30,0x8136BF31,
+ 0x8136BF32,0x8136BF33,0x8136BF34,0x8136BF35,0x8136BF36,0x8136BF37,
+ 0x8136BF38,0x8136BF39,0x8136C030,0x8136C031,0x8136C032,0x8136C033,
+ 0x8136C034,0x8136C035,0x8136C036,0x8136C037,0x8136C038,0x8136C039,
+ 0x8136C130,0x8136C131,0x8136C132,0x8136C133,0x8136C134,0x8136C135,
+ 0x8136C136,0x8136C137,0x8136C138,0x8136C139,0x8136C230,0x8136C231,
+ 0x8136C232,0x8136C233,0x8136C234,0x8136C235,0x8136C236,0x8136C237,
+ 0x8136C238,0x8136C239,0x8136C330,0x8136C331,0x8136C332,0x8136C333,
+ 0x8136C334,0x8136C335,0x8136C336,0x8136C337,0x8136C338,0x8136C339,
+ 0x8136C430,0x8136C431,0x8136C432,0x8136C433,0x8136C434,0x8136C435,
+ 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6,
+ 0xA2F7, 0xA2F8, 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC,
+ 0x8136C436,0x8136C437,0x8136C438,0x8136C439, 0xA2A1, 0xA2A2,
+ 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7, 0xA2A8,
+ 0xA2A9, 0xA2AA,0x8136C530,0x8136C531,0x8136C532,0x8136C533,
+ 0x8136C534,0x8136C535,0x8136C536,0x8136C537,0x8136C538,0x8136C539,
+ 0x8136C630,0x8136C631,0x8136C632,0x8136C633,0x8136C634,0x8136C635,
+ 0x8136C636,0x8136C637,0x8136C638,0x8136C639,0x8136C730,0x8136C731,
+ 0xA1FB, 0xA1FC, 0xA1FA, 0xA1FD,0x8136C732,0x8136C733,
+ 0xA849, 0xA84A, 0xA84B, 0xA84C,0x8136C734,0x8136C735,
+ 0x8136C736,0x8136C737,0x8136C738,0x8136C739,0x8136C830,0x8136C831,
+ 0x8136C832,0x8136C833,0x8136C834,0x8136C835,0x8136C836,0x8136C837,
+ 0x8136C838,0x8136C839,0x8136C930,0x8136C931,0x8136C932,0x8136C933,
+ 0x8136C934,0x8136C935,0x8136C936,0x8136C937,0x8136C938,0x8136C939,
+ 0x8136CA30,0x8136CA31,0x8136CA32,0x8136CA33,0x8136CA34,0x8136CA35,
+ 0x8136CA36,0x8136CA37,0x8136CA38,0x8136CA39,0x8136CB30,0x8136CB31,
+ 0x8136CB32,0x8136CB33,0x8136CB34,0x8136CB35,0x8136CB36,0x8136CB37,
+ 0x8136CB38,0x8136CB39,0x8136CC30,0x8136CC31,0x8136CC32,0x8136CC33,
+ 0x8136CC34,0x8136CC35,0x8136CC36,0x8136CC37,0x8136CC38,0x8136CC39,
+ 0x8136CD30,0x8136CD31,0x8136CD32,0x8136CD33,0x8136CD34,0x8136CD35,
+ 0x8136CD36,0x8136CD37,0x8136CD38,0x8136CD39,0x8136CE30,0x8136CE31,
+ 0x8136CE32,0x8136CE33,0x8136CE34,0x8136CE35,0x8136CE36,0x8136CE37,
+ 0x8136CE38,0x8136CE39,0x8136CF30,0x8136CF31,0x8136CF32,0x8136CF33,
+ 0x8136CF34,0x8136CF35,0x8136CF36,0x8136CF37,0x8136CF38,0x8136CF39,
+ 0x8136D030,0x8136D031,0x8136D032,0x8136D033,0x8136D034,0x8136D035,
+ 0x8136D036,0x8136D037,0x8136D038,0x8136D039,0x8136D130,0x8136D131,
+ 0x8136D132,0x8136D133,0x8136D134,0x8136D135,0x8136D136,0x8136D137,
+ 0x8136D138,0x8136D139,0x8136D230,0x8136D231,0x8136D232,0x8136D233,
+ 0xA1CA,0x8136D234,0x8136D235,0x8136D236,0x8136D237,0x8136D238,
+ 0x8136D239, 0xA1C7,0x8136D330, 0xA1C6,0x8136D331,0x8136D332,
+ 0x8136D333, 0xA84D,0x8136D334,0x8136D335,0x8136D336,0x8136D337,
+ 0xA1CC,0x8136D338,0x8136D339, 0xA1D8, 0xA1DE, 0xA84E,
+ 0xA1CF,0x8136D430,0x8136D431, 0xA84F,0x8136D432, 0xA1CE,
+ 0x8136D433, 0xA1C4, 0xA1C5, 0xA1C9, 0xA1C8, 0xA1D2,
+ 0x8136D434,0x8136D435, 0xA1D3,0x8136D436,0x8136D437,0x8136D438,
+ 0x8136D439,0x8136D530, 0xA1E0, 0xA1DF, 0xA1C3, 0xA1CB,
+ 0x8136D531,0x8136D532,0x8136D533,0x8136D534,0x8136D535, 0xA1D7,
+ 0x8136D536,0x8136D537,0x8136D538,0x8136D539,0x8136D630,0x8136D631,
+ 0x8136D632,0x8136D633,0x8136D634,0x8136D635, 0xA1D6,0x8136D636,
+ 0x8136D637,0x8136D638, 0xA1D5,0x8136D639,0x8136D730,0x8136D731,
+ 0x8136D732,0x8136D733, 0xA850,0x8136D734,0x8136D735,0x8136D736,
+ 0x8136D737,0x8136D738,0x8136D739,0x8136D830,0x8136D831,0x8136D832,
+ 0x8136D833,0x8136D834,0x8136D835,0x8136D836, 0xA1D9, 0xA1D4,
+ 0x8136D837,0x8136D838, 0xA1DC, 0xA1DD, 0xA851, 0xA852,
+ 0x8136D839,0x8136D930,0x8136D931,0x8136D932,0x8136D933,0x8136D934,
+ 0xA1DA, 0xA1DB,0x8136D935,0x8136D936,0x8136D937,0x8136D938,
+ 0x8136D939,0x8136DA30,0x8136DA31,0x8136DA32,0x8136DA33,0x8136DA34,
+ 0x8136DA35,0x8136DA36,0x8136DA37,0x8136DA38,0x8136DA39,0x8136DB30,
+ 0x8136DB31,0x8136DB32,0x8136DB33,0x8136DB34,0x8136DB35,0x8136DB36,
+ 0x8136DB37,0x8136DB38,0x8136DB39,0x8136DC30,0x8136DC31,0x8136DC32,
+ 0x8136DC33,0x8136DC34,0x8136DC35,0x8136DC36,0x8136DC37,0x8136DC38,
+ 0x8136DC39,0x8136DD30,0x8136DD31, 0xA892,0x8136DD32,0x8136DD33,
+ 0x8136DD34, 0xA1D1,0x8136DD35,0x8136DD36,0x8136DD37,0x8136DD38,
+ 0x8136DD39,0x8136DE30,0x8136DE31,0x8136DE32,0x8136DE33,0x8136DE34,
+ 0x8136DE35, 0xA1CD,0x8136DE36,0x8136DE37,0x8136DE38,0x8136DE39,
+ 0x8136DF30,0x8136DF31,0x8136DF32,0x8136DF33,0x8136DF34,0x8136DF35,
+ 0x8136DF36,0x8136DF37,0x8136DF38,0x8136DF39,0x8136E030,0x8136E031,
+ 0x8136E032,0x8136E033,0x8136E034,0x8136E035,0x8136E036,0x8136E037,
+ 0x8136E038,0x8136E039,0x8136E130, 0xA853,0x8136E131,0x8136E132,
+ 0x8136E133,0x8136E134,0x8136E135,0x8136E136,0x8136E137,0x8136E138,
+ 0x8136E139,0x8136E230,0x8136E231,0x8136E232,0x8136E233,0x8136E234,
+ 0x8136E235,0x8136E236,0x8136E237,0x8136E238,0x8136E239,0x8136E330,
+ 0x8136E331,0x8136E332,0x8136E333,0x8136E334,0x8136E335,0x8136E336,
+ 0x8136E337,0x8136E338,0x8136E339,0x8136E430,0x8136E431,0x8136E432,
+ 0x8136E433,0x8136E434,0x8136E435,0x8136E436,0x8136E437,0x8136E438,
+ 0x8136E439,0x8136E530,0x8136E531,0x8136E532,0x8136E533,0x8136E534,
+ 0x8136E535,0x8136E536,0x8136E537,0x8136E538,0x8136E539,0x8136E630,
+ 0x8136E631,0x8136E632,0x8136E633,0x8136E634,0x8136E635,0x8136E636,
+ 0x8136E637,0x8136E638,0x8136E639,0x8136E730,0x8136E731,0x8136E732,
+ 0x8136E733,0x8136E734,0x8136E735,0x8136E736,0x8136E737,0x8136E738,
+ 0x8136E739,0x8136E830,0x8136E831,0x8136E832,0x8136E833,0x8136E834,
+ 0x8136E835,0x8136E836,0x8136E837,0x8136E838,0x8136E839,0x8136E930,
+ 0x8136E931,0x8136E932, 0xA1D0,0x8136E933,0x8136E934,0x8136E935,
+ 0x8136E936,0x8136E937,0x8136E938,0x8136E939,0x8136EA30,0x8136EA31,
+ 0x8136EA32,0x8136EA33,0x8136EA34,0x8136EA35,0x8136EA36,0x8136EA37,
+ 0x8136EA38,0x8136EA39,0x8136EB30,0x8136EB31,0x8136EB32,0x8136EB33,
+ 0x8136EB34,0x8136EB35,0x8136EB36,0x8136EB37,0x8136EB38,0x8136EB39,
+ 0x8136EC30,0x8136EC31,0x8136EC32,0x8136EC33,0x8136EC34,0x8136EC35,
+ 0x8136EC36,0x8136EC37,0x8136EC38,0x8136EC39,0x8136ED30,0x8136ED31,
+ 0x8136ED32,0x8136ED33,0x8136ED34,0x8136ED35,0x8136ED36,0x8136ED37,
+ 0x8136ED38,0x8136ED39,0x8136EE30,0x8136EE31,0x8136EE32,0x8136EE33,
+ 0x8136EE34,0x8136EE35,0x8136EE36,0x8136EE37,0x8136EE38,0x8136EE39,
+ 0x8136EF30,0x8136EF31,0x8136EF32,0x8136EF33,0x8136EF34,0x8136EF35,
+ 0x8136EF36,0x8136EF37,0x8136EF38,0x8136EF39,0x8136F030,0x8136F031,
+ 0x8136F032,0x8136F033,0x8136F034,0x8136F035,0x8136F036,0x8136F037,
+ 0x8136F038,0x8136F039,0x8136F130,0x8136F131,0x8136F132,0x8136F133,
+ 0x8136F134,0x8136F135,0x8136F136,0x8136F137,0x8136F138,0x8136F139,
+ 0x8136F230,0x8136F231,0x8136F232,0x8136F233,0x8136F234,0x8136F235,
+ 0x8136F236,0x8136F237,0x8136F238,0x8136F239,0x8136F330,0x8136F331,
+ 0x8136F332,0x8136F333,0x8136F334,0x8136F335,0x8136F336,0x8136F337,
+ 0x8136F338,0x8136F339,0x8136F430,0x8136F431,0x8136F432,0x8136F433,
+ 0x8136F434,0x8136F435,0x8136F436,0x8136F437,0x8136F438,0x8136F439,
+ 0x8136F530,0x8136F531,0x8136F532,0x8136F533,0x8136F534,0x8136F535,
+ 0x8136F536,0x8136F537,0x8136F538,0x8136F539,0x8136F630,0x8136F631,
+ 0x8136F632,0x8136F633,0x8136F634,0x8136F635,0x8136F636,0x8136F637,
+ 0x8136F638,0x8136F639,0x8136F730,0x8136F731,0x8136F732,0x8136F733,
+ 0x8136F734,0x8136F735,0x8136F736,0x8136F737,0x8136F738,0x8136F739,
+ 0x8136F830,0x8136F831,0x8136F832,0x8136F833,0x8136F834,0x8136F835,
+ 0x8136F836,0x8136F837,0x8136F838,0x8136F839,0x8136F930,0x8136F931,
+ 0x8136F932,0x8136F933,0x8136F934,0x8136F935,0x8136F936,0x8136F937,
+ 0x8136F938,0x8136F939,0x8136FA30,0x8136FA31,0x8136FA32,0x8136FA33,
+ 0x8136FA34,0x8136FA35,0x8136FA36,0x8136FA37,0x8136FA38,0x8136FA39,
+ 0x8136FB30,0x8136FB31,0x8136FB32,0x8136FB33,0x8136FB34,0x8136FB35,
+ 0x8136FB36,0x8136FB37,0x8136FB38,0x8136FB39,0x8136FC30,0x8136FC31,
+ 0x8136FC32,0x8136FC33,0x8136FC34,0x8136FC35,0x8136FC36,0x8136FC37,
+ 0x8136FC38,0x8136FC39,0x8136FD30,0x8136FD31,0x8136FD32,0x8136FD33,
+ 0x8136FD34,0x8136FD35,0x8136FD36,0x8136FD37,0x8136FD38,0x8136FD39,
+ 0x8136FE30,0x8136FE31,0x8136FE32,0x8136FE33,0x8136FE34,0x8136FE35,
+ 0x8136FE36,0x8136FE37,0x8136FE38,0x8136FE39,0x81378130,0x81378131,
+ 0x81378132,0x81378133,0x81378134,0x81378135,0x81378136,0x81378137,
+ 0x81378138,0x81378139,0x81378230,0x81378231,0x81378232,0x81378233,
+ 0x81378234,0x81378235,0x81378236,0x81378237,0x81378238,0x81378239,
+ 0x81378330,0x81378331,0x81378332,0x81378333,0x81378334,0x81378335,
+ 0x81378336,0x81378337,0x81378338,0x81378339,0x81378430,0x81378431,
+ 0x81378432,0x81378433,0x81378434,0x81378435,0x81378436,0x81378437,
+ 0x81378438,0x81378439,0x81378530,0x81378531,0x81378532,0x81378533,
+ 0x81378534,0x81378535,0x81378536,0x81378537,0x81378538,0x81378539,
+ 0x81378630,0x81378631,0x81378632,0x81378633,0x81378634,0x81378635,
+ 0x81378636,0x81378637,0x81378638,0x81378639,0x81378730,0x81378731,
+ 0x81378732,0x81378733,0x81378734,0x81378735,0x81378736,0x81378737,
+ 0x81378738,0x81378739,0x81378830,0x81378831,0x81378832,0x81378833,
+ 0x81378834,0x81378835,0x81378836,0x81378837,0x81378838,0x81378839,
+ 0x81378930,0x81378931,0x81378932,0x81378933,0x81378934,0x81378935,
+ 0x81378936,0x81378937,0x81378938,0x81378939,0x81378A30,0x81378A31,
+ 0x81378A32,0x81378A33,0x81378A34,0x81378A35,0x81378A36,0x81378A37,
+ 0x81378A38,0x81378A39,0x81378B30,0x81378B31,0x81378B32,0x81378B33,
+ 0x81378B34,0x81378B35,0x81378B36,0x81378B37,0x81378B38,0x81378B39,
+ 0x81378C30,0x81378C31,0x81378C32,0x81378C33,0x81378C34,0x81378C35,
+ 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, 0xA2DE,
+ 0xA2DF, 0xA2E0, 0xA2E1, 0xA2E2,0x81378C36,0x81378C37,
+ 0x81378C38,0x81378C39,0x81378D30,0x81378D31,0x81378D32,0x81378D33,
+ 0x81378D34,0x81378D35, 0xA2C5, 0xA2C6, 0xA2C7, 0xA2C8,
+ 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, 0xA2CD, 0xA2CE,
+ 0xA2CF, 0xA2D0, 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4,
+ 0xA2D5, 0xA2D6, 0xA2D7, 0xA2D8, 0xA2B1, 0xA2B2,
+ 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7, 0xA2B8,
+ 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE,
+ 0xA2BF, 0xA2C0, 0xA2C1, 0xA2C2, 0xA2C3, 0xA2C4,
+ 0x81378D36,0x81378D37,0x81378D38,0x81378D39,0x81378E30,0x81378E31,
+ 0x81378E32,0x81378E33,0x81378E34,0x81378E35,0x81378E36,0x81378E37,
+ 0x81378E38,0x81378E39,0x81378F30,0x81378F31,0x81378F32,0x81378F33,
+ 0x81378F34,0x81378F35,0x81378F36,0x81378F37,0x81378F38,0x81378F39,
+ 0x81379030,0x81379031,0x81379032,0x81379033,0x81379034,0x81379035,
+ 0x81379036,0x81379037,0x81379038,0x81379039,0x81379130,0x81379131,
+ 0x81379132,0x81379133,0x81379134,0x81379135,0x81379136,0x81379137,
+ 0x81379138,0x81379139,0x81379230,0x81379231,0x81379232,0x81379233,
+ 0x81379234,0x81379235,0x81379236,0x81379237,0x81379238,0x81379239,
+ 0x81379330,0x81379331,0x81379332,0x81379333,0x81379334,0x81379335,
+ 0x81379336,0x81379337,0x81379338,0x81379339,0x81379430,0x81379431,
+ 0x81379432,0x81379433,0x81379434,0x81379435,0x81379436,0x81379437,
+ 0x81379438,0x81379439,0x81379530,0x81379531,0x81379532,0x81379533,
+ 0x81379534,0x81379535,0x81379536,0x81379537,0x81379538,0x81379539,
+ 0x81379630,0x81379631,0x81379632,0x81379633,0x81379634,0x81379635,
+ 0x81379636,0x81379637,0x81379638,0x81379639,0x81379730,0x81379731,
+ 0x81379732,0x81379733,0x81379734,0x81379735, 0xA9A4, 0xA9A5,
+ 0xA9A6, 0xA9A7, 0xA9A8, 0xA9A9, 0xA9AA, 0xA9AB,
+ 0xA9AC, 0xA9AD, 0xA9AE, 0xA9AF, 0xA9B0, 0xA9B1,
+ 0xA9B2, 0xA9B3, 0xA9B4, 0xA9B5, 0xA9B6, 0xA9B7,
+ 0xA9B8, 0xA9B9, 0xA9BA, 0xA9BB, 0xA9BC, 0xA9BD,
+ 0xA9BE, 0xA9BF, 0xA9C0, 0xA9C1, 0xA9C2, 0xA9C3,
+ 0xA9C4, 0xA9C5, 0xA9C6, 0xA9C7, 0xA9C8, 0xA9C9,
+ 0xA9CA, 0xA9CB, 0xA9CC, 0xA9CD, 0xA9CE, 0xA9CF,
+ 0xA9D0, 0xA9D1, 0xA9D2, 0xA9D3, 0xA9D4, 0xA9D5,
+ 0xA9D6, 0xA9D7, 0xA9D8, 0xA9D9, 0xA9DA, 0xA9DB,
+ 0xA9DC, 0xA9DD, 0xA9DE, 0xA9DF, 0xA9E0, 0xA9E1,
+ 0xA9E2, 0xA9E3, 0xA9E4, 0xA9E5, 0xA9E6, 0xA9E7,
+ 0xA9E8, 0xA9E9, 0xA9EA, 0xA9EB, 0xA9EC, 0xA9ED,
+ 0xA9EE, 0xA9EF,0x81379736,0x81379737,0x81379738,0x81379739,
+ 0xA854, 0xA855, 0xA856, 0xA857, 0xA858, 0xA859,
+ 0xA85A, 0xA85B, 0xA85C, 0xA85D, 0xA85E, 0xA85F,
+ 0xA860, 0xA861, 0xA862, 0xA863, 0xA864, 0xA865,
+ 0xA866, 0xA867, 0xA868, 0xA869, 0xA86A, 0xA86B,
+ 0xA86C, 0xA86D, 0xA86E, 0xA86F, 0xA870, 0xA871,
+ 0xA872, 0xA873, 0xA874, 0xA875, 0xA876, 0xA877,
+ 0x81379830,0x81379831,0x81379832,0x81379833,0x81379834,0x81379835,
+ 0x81379836,0x81379837,0x81379838,0x81379839,0x81379930,0x81379931,
+ 0x81379932, 0xA878, 0xA879, 0xA87A, 0xA87B, 0xA87C,
+ 0xA87D, 0xA87E, 0xA880, 0xA881, 0xA882, 0xA883,
+ 0xA884, 0xA885, 0xA886, 0xA887,0x81379933,0x81379934,
+ 0x81379935, 0xA888, 0xA889, 0xA88A,0x81379936,0x81379937,
+ 0x81379938,0x81379939,0x81379A30,0x81379A31,0x81379A32,0x81379A33,
+ 0x81379A34,0x81379A35, 0xA1F6, 0xA1F5,0x81379A36,0x81379A37,
+ 0x81379A38,0x81379A39,0x81379B30,0x81379B31,0x81379B32,0x81379B33,
+ 0x81379B34,0x81379B35,0x81379B36,0x81379B37,0x81379B38,0x81379B39,
+ 0x81379C30,0x81379C31, 0xA1F8, 0xA1F7,0x81379C32,0x81379C33,
+ 0x81379C34,0x81379C35,0x81379C36,0x81379C37,0x81379C38,0x81379C39,
+ 0xA88B, 0xA88C,0x81379D30,0x81379D31,0x81379D32,0x81379D33,
+ 0x81379D34,0x81379D35,0x81379D36,0x81379D37, 0xA1F4, 0xA1F3,
+ 0x81379D38,0x81379D39,0x81379E30, 0xA1F0,0x81379E31,0x81379E32,
+ 0xA1F2, 0xA1F1,0x81379E33,0x81379E34,0x81379E35,0x81379E36,
+ 0x81379E37,0x81379E38,0x81379E39,0x81379F30,0x81379F31,0x81379F32,
+ 0x81379F33,0x81379F34,0x81379F35,0x81379F36,0x81379F37,0x81379F38,
+ 0x81379F39,0x8137A030, 0xA88D, 0xA88E, 0xA88F, 0xA890,
+ 0x8137A031,0x8137A032,0x8137A033,0x8137A034,0x8137A035,0x8137A036,
+ 0x8137A037,0x8137A038,0x8137A039,0x8137A130,0x8137A131,0x8137A132,
+ 0x8137A133,0x8137A134,0x8137A135,0x8137A136,0x8137A137,0x8137A138,
+ 0x8137A139,0x8137A230,0x8137A231,0x8137A232,0x8137A233,0x8137A234,
+ 0x8137A235,0x8137A236,0x8137A237,0x8137A238,0x8137A239,0x8137A330,
+ 0x8137A331, 0xA1EF, 0xA1EE,0x8137A332,0x8137A333, 0xA891,
+ 0x8137A334,0x8137A335,0x8137A336,0x8137A337,0x8137A338,0x8137A339,
+ 0x8137A430,0x8137A431,0x8137A432,0x8137A433,0x8137A434,0x8137A435,
+ 0x8137A436,0x8137A437,0x8137A438,0x8137A439,0x8137A530,0x8137A531,
+ 0x8137A532,0x8137A533,0x8137A534,0x8137A535,0x8137A536,0x8137A537,
+ 0x8137A538,0x8137A539,0x8137A630,0x8137A631,0x8137A632,0x8137A633,
+ 0x8137A634,0x8137A635,0x8137A636,0x8137A637,0x8137A638,0x8137A639,
+ 0x8137A730,0x8137A731,0x8137A732,0x8137A733,0x8137A734,0x8137A735,
+ 0x8137A736,0x8137A737,0x8137A738,0x8137A739,0x8137A830,0x8137A831,
+ 0x8137A832,0x8137A833,0x8137A834,0x8137A835,0x8137A836,0x8137A837,
+ 0xA1E2,0x8137A838, 0xA1E1, 0xFE50,0x8138FD39,0x8138FE30,
+ 0xFE54,0x8138FE31,0x8138FE32,0x8138FE33, 0xFE57,0x8138FE34,
+ 0x8138FE35, 0xFE58, 0xFE5D,0x8138FE36,0x8138FE37,0x8138FE38,
+ 0x8138FE39,0x81398130,0x81398131,0x81398132,0x81398133,0x81398134,
+ 0x81398135, 0xFE5E,0x81398136,0x81398137,0x81398138,0x81398139,
+ 0x81398230,0x81398231,0x81398232,0x81398233,0x81398234,0x81398235,
+ 0x81398236,0x81398237,0x81398238,0x81398239,0x81398330, 0xFE6B,
+ 0x81398331,0x81398332, 0xFE6E,0x81398333,0x81398334,0x81398335,
+ 0xFE71,0x81398336,0x81398337,0x81398338,0x81398339, 0xFE73,
+ 0x81398430,0x81398431, 0xFE74, 0xFE75,0x81398432,0x81398433,
+ 0x81398434, 0xFE79,0x81398435,0x81398436,0x81398437,0x81398438,
+ 0x81398439,0x81398530,0x81398531,0x81398532,0x81398533,0x81398534,
+ 0x81398535,0x81398536,0x81398537,0x81398538, 0xFE84,0x81398539,
+ 0x81398630,0x81398631,0x81398632,0x81398633,0x81398634,0x81398635,
+ 0x81398636,0x81398637,0x81398638,0x81398639,0x81398730,0x81398731,
+ 0x81398732,0x81398733,0x81398734,0x81398735,0x81398736,0x81398737,
+ 0x81398738,0x81398739,0x81398830,0x81398831,0x81398832,0x81398833,
+ 0x81398834,0x81398835,0x81398836,0x81398837,0x81398838,0x81398839,
+ 0x81398930,0x81398931,0x81398932,0x81398933,0x81398934,0x81398935,
+ 0x81398936,0x81398937,0x81398938,0x81398939,0x81398A30,0x81398A31,
+ 0x81398A32,0x81398A33,0x81398A34,0x81398A35,0x81398A36,0x81398A37,
+ 0x81398A38,0x81398A39,0x81398B30,0x81398B31,0x81398B32,0x81398B33,
+ 0x81398B34,0x81398B35,0x81398B36,0x81398B37,0x81398B38,0x81398B39,
+ 0x81398C30,0x81398C31,0x81398C32,0x81398C33,0x81398C34,0x81398C35,
+ 0x81398C36,0x81398C37,0x81398C38,0x81398C39,0x81398D30,0x81398D31,
+ 0x81398D32,0x81398D33,0x81398D34,0x81398D35,0x81398D36,0x81398D37,
+ 0x81398D38,0x81398D39,0x81398E30,0x81398E31,0x81398E32,0x81398E33,
+ 0x81398E34,0x81398E35,0x81398E36,0x81398E37,0x81398E38,0x81398E39,
+ 0x81398F30,0x81398F31,0x81398F32,0x81398F33,0x81398F34,0x81398F35,
+ 0x81398F36,0x81398F37,0x81398F38,0x81398F39,0x81399030,0x81399031,
+ 0x81399032,0x81399033,0x81399034,0x81399035,0x81399036,0x81399037,
+ 0x81399038,0x81399039,0x81399130,0x81399131,0x81399132,0x81399133,
+ 0x81399134,0x81399135,0x81399136,0x81399137,0x81399138,0x81399139,
+ 0x81399230,0x81399231,0x81399232,0x81399233,0x81399234,0x81399235,
+ 0x81399236,0x81399237,0x81399238,0x81399239,0x81399330,0x81399331,
+ 0x81399332,0x81399333,0x81399334,0x81399335,0x81399336,0x81399337,
+ 0x81399338,0x81399339,0x81399430,0x81399431,0x81399432,0x81399433,
+ 0x81399434,0x81399435,0x81399436,0x81399437,0x81399438,0x81399439,
+ 0x81399530,0x81399531,0x81399532,0x81399533,0x81399534,0x81399535,
+ 0x81399536,0x81399537,0x81399538,0x81399539,0x81399630,0x81399631,
+ 0x81399632,0x81399633,0x81399634,0x81399635,0x81399636,0x81399637,
+ 0x81399638,0x81399639,0x81399730,0x81399731,0x81399732,0x81399733,
+ 0x81399734,0x81399735,0x81399736,0x81399737,0x81399738,0x81399739,
+ 0x81399830,0x81399831,0x81399832,0x81399833,0x81399834,0x81399835,
+ 0x81399836,0x81399837,0x81399838,0x81399839,0x81399930,0x81399931,
+ 0x81399932,0x81399933,0x81399934,0x81399935,0x81399936,0x81399937,
+ 0x81399938,0x81399939,0x81399A30,0x81399A31,0x81399A32,0x81399A33,
+ 0x81399A34,0x81399A35,0x81399A36,0x81399A37,0x81399A38,0x81399A39,
+ 0x81399B30,0x81399B31,0x81399B32,0x81399B33,0x81399B34,0x81399B35,
+ 0x81399B36,0x81399B37,0x81399B38,0x81399B39,0x81399C30,0x81399C31,
+ 0x81399C32,0x81399C33,0x81399C34,0x81399C35,0x81399C36,0x81399C37,
+ 0x81399C38,0x81399C39,0x81399D30,0x81399D31,0x81399D32,0x81399D33,
+ 0x81399D34,0x81399D35,0x81399D36,0x81399D37,0x81399D38,0x81399D39,
+ 0x81399E30,0x81399E31,0x81399E32,0x81399E33,0x81399E34,0x81399E35,
+ 0x81399E36,0x81399E37,0x81399E38,0x81399E39,0x81399F30,0x81399F31,
+ 0x81399F32,0x81399F33,0x81399F34,0x81399F35,0x81399F36,0x81399F37,
+ 0x81399F38,0x81399F39,0x8139A030,0x8139A031,0x8139A032,0x8139A033,
+ 0x8139A034,0x8139A035,0x8139A036,0x8139A037,0x8139A038,0x8139A039,
+ 0x8139A130,0x8139A131,0x8139A132,0x8139A133,0x8139A134,0x8139A135,
+ 0x8139A136,0x8139A137,0x8139A138,0x8139A139,0x8139A230,0x8139A231,
+ 0x8139A232,0x8139A233,0x8139A234,0x8139A235,0x8139A236,0x8139A237,
+ 0x8139A238,0x8139A239,0x8139A330,0x8139A331, 0xA98A, 0xA98B,
+ 0xA98C, 0xA98D, 0xA98E, 0xA98F, 0xA990, 0xA991,
+ 0xA992, 0xA993, 0xA994, 0xA995,0x8139A332,0x8139A333,
+ 0x8139A334,0x8139A335, 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A8,
+ 0x8139A336, 0xA1A9, 0xA965, 0xA996, 0xA1B4, 0xA1B5,
+ 0xA1B6, 0xA1B7, 0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB,
+ 0xA1BE, 0xA1BF, 0xA893, 0xA1FE, 0xA1B2, 0xA1B3,
+ 0xA1BC, 0xA1BD,0x8139A337,0x8139A338,0x8139A339,0x8139A430,
+ 0x8139A431, 0xA894, 0xA895,0x8139A432,0x8139A433, 0xA940,
+ 0xA941, 0xA942, 0xA943, 0xA944, 0xA945, 0xA946,
+ 0xA947, 0xA948,0x8139A434,0x8139A435,0x8139A436,0x8139A437,
+ 0x8139A438,0x8139A439,0x8139A530,0x8139A531,0x8139A532,0x8139A533,
+ 0x8139A534,0x8139A535,0x8139A536,0x8139A537,0x8139A538,0x8139A539,
+ 0x8139A630,0x8139A631,0x8139A632,0x8139A633, 0xA989,0x8139A634,
+ 0x8139A635, 0xA4A1, 0xA4A2, 0xA4A3, 0xA4A4, 0xA4A5,
+ 0xA4A6, 0xA4A7, 0xA4A8, 0xA4A9, 0xA4AA, 0xA4AB,
+ 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF, 0xA4B0, 0xA4B1,
+ 0xA4B2, 0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7,
+ 0xA4B8, 0xA4B9, 0xA4BA, 0xA4BB, 0xA4BC, 0xA4BD,
+ 0xA4BE, 0xA4BF, 0xA4C0, 0xA4C1, 0xA4C2, 0xA4C3,
+ 0xA4C4, 0xA4C5, 0xA4C6, 0xA4C7, 0xA4C8, 0xA4C9,
+ 0xA4CA, 0xA4CB, 0xA4CC, 0xA4CD, 0xA4CE, 0xA4CF,
+ 0xA4D0, 0xA4D1, 0xA4D2, 0xA4D3, 0xA4D4, 0xA4D5,
+ 0xA4D6, 0xA4D7, 0xA4D8, 0xA4D9, 0xA4DA, 0xA4DB,
+ 0xA4DC, 0xA4DD, 0xA4DE, 0xA4DF, 0xA4E0, 0xA4E1,
+ 0xA4E2, 0xA4E3, 0xA4E4, 0xA4E5, 0xA4E6, 0xA4E7,
+ 0xA4E8, 0xA4E9, 0xA4EA, 0xA4EB, 0xA4EC, 0xA4ED,
+ 0xA4EE, 0xA4EF, 0xA4F0, 0xA4F1, 0xA4F2, 0xA4F3,
+ 0x8139A636,0x8139A637,0x8139A638,0x8139A639,0x8139A730,0x8139A731,
+ 0x8139A732, 0xA961, 0xA962, 0xA966, 0xA967,0x8139A733,
+ 0x8139A734, 0xA5A1, 0xA5A2, 0xA5A3, 0xA5A4, 0xA5A5,
+ 0xA5A6, 0xA5A7, 0xA5A8, 0xA5A9, 0xA5AA, 0xA5AB,
+ 0xA5AC, 0xA5AD, 0xA5AE, 0xA5AF, 0xA5B0, 0xA5B1,
+ 0xA5B2, 0xA5B3, 0xA5B4, 0xA5B5, 0xA5B6, 0xA5B7,
+ 0xA5B8, 0xA5B9, 0xA5BA, 0xA5BB, 0xA5BC, 0xA5BD,
+ 0xA5BE, 0xA5BF, 0xA5C0, 0xA5C1, 0xA5C2, 0xA5C3,
+ 0xA5C4, 0xA5C5, 0xA5C6, 0xA5C7, 0xA5C8, 0xA5C9,
+ 0xA5CA, 0xA5CB, 0xA5CC, 0xA5CD, 0xA5CE, 0xA5CF,
+ 0xA5D0, 0xA5D1, 0xA5D2, 0xA5D3, 0xA5D4, 0xA5D5,
+ 0xA5D6, 0xA5D7, 0xA5D8, 0xA5D9, 0xA5DA, 0xA5DB,
+ 0xA5DC, 0xA5DD, 0xA5DE, 0xA5DF, 0xA5E0, 0xA5E1,
+ 0xA5E2, 0xA5E3, 0xA5E4, 0xA5E5, 0xA5E6, 0xA5E7,
+ 0xA5E8, 0xA5E9, 0xA5EA, 0xA5EB, 0xA5EC, 0xA5ED,
+ 0xA5EE, 0xA5EF, 0xA5F0, 0xA5F1, 0xA5F2, 0xA5F3,
+ 0xA5F4, 0xA5F5, 0xA5F6,0x8139A735,0x8139A736,0x8139A737,
+ 0x8139A738,0x8139A739, 0xA960, 0xA963, 0xA964,0x8139A830,
+ 0x8139A831,0x8139A832,0x8139A833,0x8139A834,0x8139A835, 0xA8C5,
+ 0xA8C6, 0xA8C7, 0xA8C8, 0xA8C9, 0xA8CA, 0xA8CB,
+ 0xA8CC, 0xA8CD, 0xA8CE, 0xA8CF, 0xA8D0, 0xA8D1,
+ 0xA8D2, 0xA8D3, 0xA8D4, 0xA8D5, 0xA8D6, 0xA8D7,
+ 0xA8D8, 0xA8D9, 0xA8DA, 0xA8DB, 0xA8DC, 0xA8DD,
+ 0xA8DE, 0xA8DF, 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3,
+ 0xA8E4, 0xA8E5, 0xA8E6, 0xA8E7, 0xA8E8, 0xA8E9,
+ 0x8139A836,0x8139A837,0x8139A838,0x8139A839,0x8139A930,0x8139A931,
+ 0x8139A932,0x8139A933,0x8139A934,0x8139A935,0x8139A936,0x8139A937,
+ 0x8139A938,0x8139A939,0x8139AA30,0x8139AA31,0x8139AA32,0x8139AA33,
+ 0x8139AA34,0x8139AA35,0x8139AA36,0x8139AA37,0x8139AA38,0x8139AA39,
+ 0x8139AB30,0x8139AB31,0x8139AB32,0x8139AB33,0x8139AB34,0x8139AB35,
+ 0x8139AB36,0x8139AB37,0x8139AB38,0x8139AB39,0x8139AC30,0x8139AC31,
+ 0x8139AC32,0x8139AC33,0x8139AC34,0x8139AC35,0x8139AC36,0x8139AC37,
+ 0x8139AC38,0x8139AC39,0x8139AD30,0x8139AD31,0x8139AD32,0x8139AD33,
+ 0x8139AD34,0x8139AD35,0x8139AD36,0x8139AD37,0x8139AD38,0x8139AD39,
+ 0x8139AE30,0x8139AE31,0x8139AE32,0x8139AE33,0x8139AE34,0x8139AE35,
+ 0x8139AE36,0x8139AE37,0x8139AE38,0x8139AE39,0x8139AF30,0x8139AF31,
+ 0x8139AF32,0x8139AF33,0x8139AF34,0x8139AF35,0x8139AF36,0x8139AF37,
+ 0x8139AF38,0x8139AF39,0x8139B030,0x8139B031,0x8139B032,0x8139B033,
+ 0x8139B034,0x8139B035,0x8139B036,0x8139B037,0x8139B038,0x8139B039,
+ 0x8139B130,0x8139B131,0x8139B132,0x8139B133,0x8139B134,0x8139B135,
+ 0x8139B136,0x8139B137,0x8139B138,0x8139B139,0x8139B230,0x8139B231,
+ 0x8139B232,0x8139B233,0x8139B234,0x8139B235,0x8139B236,0x8139B237,
+ 0x8139B238,0x8139B239,0x8139B330,0x8139B331,0x8139B332,0x8139B333,
+ 0x8139B334,0x8139B335,0x8139B336,0x8139B337,0x8139B338,0x8139B339,
+ 0x8139B430,0x8139B431,0x8139B432,0x8139B433,0x8139B434,0x8139B435,
+ 0x8139B436,0x8139B437,0x8139B438,0x8139B439,0x8139B530,0x8139B531,
+ 0x8139B532,0x8139B533,0x8139B534,0x8139B535,0x8139B536,0x8139B537,
+ 0x8139B538,0x8139B539,0x8139B630,0x8139B631,0x8139B632,0x8139B633,
+ 0x8139B634,0x8139B635,0x8139B636,0x8139B637,0x8139B638,0x8139B639,
+ 0x8139B730,0x8139B731,0x8139B732,0x8139B733,0x8139B734,0x8139B735,
+ 0x8139B736,0x8139B737,0x8139B738,0x8139B739,0x8139B830,0x8139B831,
+ 0x8139B832,0x8139B833,0x8139B834,0x8139B835,0x8139B836,0x8139B837,
+ 0x8139B838,0x8139B839,0x8139B930,0x8139B931,0x8139B932,0x8139B933,
+ 0x8139B934,0x8139B935,0x8139B936,0x8139B937,0x8139B938,0x8139B939,
+ 0x8139BA30,0x8139BA31,0x8139BA32,0x8139BA33,0x8139BA34,0x8139BA35,
+ 0x8139BA36,0x8139BA37,0x8139BA38,0x8139BA39,0x8139BB30,0x8139BB31,
+ 0x8139BB32,0x8139BB33,0x8139BB34,0x8139BB35,0x8139BB36,0x8139BB37,
+ 0x8139BB38,0x8139BB39,0x8139BC30,0x8139BC31,0x8139BC32,0x8139BC33,
+ 0x8139BC34,0x8139BC35,0x8139BC36,0x8139BC37,0x8139BC38,0x8139BC39,
+ 0x8139BD30,0x8139BD31,0x8139BD32,0x8139BD33,0x8139BD34,0x8139BD35,
+ 0x8139BD36,0x8139BD37,0x8139BD38,0x8139BD39,0x8139BE30,0x8139BE31,
+ 0x8139BE32,0x8139BE33,0x8139BE34,0x8139BE35,0x8139BE36,0x8139BE37,
+ 0x8139BE38,0x8139BE39,0x8139BF30,0x8139BF31,0x8139BF32,0x8139BF33,
+ 0x8139BF34,0x8139BF35,0x8139BF36,0x8139BF37,0x8139BF38,0x8139BF39,
+ 0x8139C030,0x8139C031,0x8139C032,0x8139C033,0x8139C034,0x8139C035,
+ 0x8139C036,0x8139C037,0x8139C038,0x8139C039,0x8139C130,0x8139C131,
+ 0xA2E5, 0xA2E6, 0xA2E7, 0xA2E8, 0xA2E9, 0xA2EA,
+ 0xA2EB, 0xA2EC, 0xA2ED, 0xA2EE,0x8139C132,0x8139C133,
+ 0x8139C134,0x8139C135,0x8139C136,0x8139C137,0x8139C138, 0xA95A,
+ 0x8139C139,0x8139C230,0x8139C231,0x8139C232,0x8139C233,0x8139C234,
+ 0x8139C235,0x8139C236,0x8139C237,0x8139C238,0x8139C239,0x8139C330,
+ 0x8139C331,0x8139C332,0x8139C333,0x8139C334,0x8139C335,0x8139C336,
+ 0x8139C337,0x8139C338,0x8139C339,0x8139C430,0x8139C431,0x8139C432,
+ 0x8139C433,0x8139C434,0x8139C435,0x8139C436,0x8139C437,0x8139C438,
+ 0x8139C439,0x8139C530,0x8139C531,0x8139C532,0x8139C533,0x8139C534,
+ 0x8139C535,0x8139C536,0x8139C537,0x8139C538,0x8139C539,0x8139C630,
+ 0x8139C631,0x8139C632,0x8139C633,0x8139C634,0x8139C635,0x8139C636,
+ 0x8139C637,0x8139C638,0x8139C639,0x8139C730,0x8139C731,0x8139C732,
+ 0x8139C733,0x8139C734,0x8139C735,0x8139C736,0x8139C737,0x8139C738,
+ 0x8139C739,0x8139C830,0x8139C831,0x8139C832,0x8139C833,0x8139C834,
+ 0x8139C835,0x8139C836,0x8139C837,0x8139C838,0x8139C839,0x8139C930,
+ 0x8139C931,0x8139C932,0x8139C933,0x8139C934,0x8139C935,0x8139C936,
+ 0x8139C937,0x8139C938,0x8139C939,0x8139CA30,0x8139CA31,0x8139CA32,
+ 0x8139CA33,0x8139CA34,0x8139CA35,0x8139CA36,0x8139CA37,0x8139CA38,
+ 0x8139CA39,0x8139CB30,0x8139CB31,0x8139CB32,0x8139CB33,0x8139CB34,
+ 0x8139CB35,0x8139CB36,0x8139CB37,0x8139CB38,0x8139CB39,0x8139CC30,
+ 0x8139CC31,0x8139CC32,0x8139CC33,0x8139CC34,0x8139CC35,0x8139CC36,
+ 0x8139CC37,0x8139CC38,0x8139CC39,0x8139CD30,0x8139CD31, 0xA949,
+ 0x8139CD32,0x8139CD33,0x8139CD34,0x8139CD35,0x8139CD36,0x8139CD37,
+ 0x8139CD38,0x8139CD39,0x8139CE30,0x8139CE31,0x8139CE32,0x8139CE33,
+ 0x8139CE34,0x8139CE35,0x8139CE36,0x8139CE37,0x8139CE38,0x8139CE39,
+ 0x8139CF30,0x8139CF31,0x8139CF32,0x8139CF33,0x8139CF34,0x8139CF35,
+ 0x8139CF36,0x8139CF37,0x8139CF38,0x8139CF39,0x8139D030,0x8139D031,
+ 0x8139D032,0x8139D033,0x8139D034,0x8139D035,0x8139D036,0x8139D037,
+ 0x8139D038,0x8139D039,0x8139D130,0x8139D131,0x8139D132,0x8139D133,
+ 0x8139D134,0x8139D135,0x8139D136,0x8139D137,0x8139D138,0x8139D139,
+ 0x8139D230,0x8139D231,0x8139D232,0x8139D233,0x8139D234,0x8139D235,
+ 0x8139D236,0x8139D237,0x8139D238,0x8139D239,0x8139D330,0x8139D331,
+ 0x8139D332,0x8139D333,0x8139D334,0x8139D335,0x8139D336,0x8139D337,
+ 0x8139D338,0x8139D339,0x8139D430,0x8139D431,0x8139D432,0x8139D433,
+ 0x8139D434,0x8139D435,0x8139D436,0x8139D437,0x8139D438,0x8139D439,
+ 0x8139D530,0x8139D531,0x8139D532,0x8139D533,0x8139D534,0x8139D535,
+ 0x8139D536,0x8139D537,0x8139D538,0x8139D539,0x8139D630,0x8139D631,
+ 0x8139D632,0x8139D633,0x8139D634,0x8139D635,0x8139D636,0x8139D637,
+ 0x8139D638,0x8139D639,0x8139D730,0x8139D731,0x8139D732,0x8139D733,
+ 0x8139D734,0x8139D735,0x8139D736,0x8139D737,0x8139D738,0x8139D739,
+ 0x8139D830,0x8139D831,0x8139D832,0x8139D833,0x8139D834,0x8139D835,
+ 0x8139D836,0x8139D837,0x8139D838,0x8139D839,0x8139D930,0x8139D931,
+ 0x8139D932,0x8139D933,0x8139D934,0x8139D935,0x8139D936,0x8139D937,
+ 0x8139D938,0x8139D939,0x8139DA30,0x8139DA31,0x8139DA32,0x8139DA33,
+ 0x8139DA34,0x8139DA35,0x8139DA36,0x8139DA37,0x8139DA38,0x8139DA39,
+ 0x8139DB30,0x8139DB31,0x8139DB32,0x8139DB33,0x8139DB34,0x8139DB35,
+ 0x8139DB36,0x8139DB37,0x8139DB38,0x8139DB39,0x8139DC30,0x8139DC31,
+ 0x8139DC32,0x8139DC33,0x8139DC34,0x8139DC35,0x8139DC36,0x8139DC37,
+ 0x8139DC38,0x8139DC39,0x8139DD30,0x8139DD31,0x8139DD32,0x8139DD33,
+ 0x8139DD34,0x8139DD35,0x8139DD36,0x8139DD37,0x8139DD38,0x8139DD39,
+ 0x8139DE30,0x8139DE31,0x8139DE32,0x8139DE33,0x8139DE34,0x8139DE35,
+ 0x8139DE36,0x8139DE37,0x8139DE38,0x8139DE39,0x8139DF30,0x8139DF31,
+ 0x8139DF32,0x8139DF33,0x8139DF34,0x8139DF35,0x8139DF36,0x8139DF37,
+ 0x8139DF38,0x8139DF39,0x8139E030,0x8139E031,0x8139E032,0x8139E033,
+ 0x8139E034,0x8139E035,0x8139E036,0x8139E037,0x8139E038,0x8139E039,
+ 0x8139E130,0x8139E131,0x8139E132,0x8139E133,0x8139E134,0x8139E135,
+ 0x8139E136,0x8139E137,0x8139E138,0x8139E139,0x8139E230,0x8139E231,
+ 0x8139E232,0x8139E233,0x8139E234,0x8139E235,0x8139E236,0x8139E237,
+ 0x8139E238,0x8139E239,0x8139E330,0x8139E331,0x8139E332,0x8139E333,
+ 0x8139E334,0x8139E335,0x8139E336,0x8139E337,0x8139E338,0x8139E339,
+ 0x8139E430,0x8139E431,0x8139E432,0x8139E433,0x8139E434,0x8139E435,
+ 0xA94A, 0xA94B,0x8139E436,0x8139E437,0x8139E438,0x8139E439,
+ 0x8139E530,0x8139E531,0x8139E532,0x8139E533,0x8139E534,0x8139E535,
+ 0x8139E536,0x8139E537, 0xA94C, 0xA94D, 0xA94E,0x8139E538,
+ 0x8139E539, 0xA94F,0x8139E630,0x8139E631,0x8139E632,0x8139E633,
+ 0x8139E634,0x8139E635,0x8139E636,0x8139E637,0x8139E638,0x8139E639,
+ 0x8139E730,0x8139E731,0x8139E732,0x8139E733,0x8139E734,0x8139E735,
+ 0x8139E736,0x8139E737,0x8139E738,0x8139E739,0x8139E830,0x8139E831,
+ 0x8139E832,0x8139E833,0x8139E834,0x8139E835,0x8139E836,0x8139E837,
+ 0x8139E838,0x8139E839,0x8139E930,0x8139E931,0x8139E932,0x8139E933,
+ 0xA950,0x8139E934,0x8139E935,0x8139E936,0x8139E937,0x8139E938,
+ 0x8139E939,0x8139EA30,0x8139EA31,0x8139EA32, 0xA951,0x8139EA33,
+ 0x8139EA34, 0xA952, 0xA953,0x8139EA35,0x8139EA36, 0xA954,
+ 0x8139EA37,0x8139EA38,0x8139EA39,0x8139EB30,0x8139EB31,0x8139EB32,
+ 0x8139EB33,0x8139EB34,0x8139EB35,0x8139EB36,0x8139EB37,0x8139EB38,
+ 0x8139EB39,0x8139EC30,0x8139EC31,0x8139EC32,0x8139EC33,0x8139EC34,
+ 0x8139EC35,0x8139EC36,0x8139EC37,0x8139EC38,0x8139EC39,0x8139ED30,
+ 0x8139ED31,0x8139ED32,0x8139ED33,0x8139ED34,0x8139ED35,0x8139ED36,
+ 0x8139ED37,0x8139ED38,0x8139ED39,0x8139EE30,0x8139EE31,0x8139EE32,
+ 0x8139EE33,0x8139EE34,0x8139EE35,0x8139EE36,0x8139EE37,0x8139EE38,
+ 0x8139EE39,0x8139EF30,0x8139EF31,0x8139EF32,0x8139EF33,0x8139EF34,
+ 0x8139EF35,0x8139EF36,0x8139EF37,0x8139EF38,0x8139EF39,0x8139F030,
+ 0x8139F031,0x8139F032,0x8139F033,0x8139F034,0x8139F035,0x8139F036,
+ 0x8139F037,0x8139F038,0x8139F039,0x8139F130,0x8139F131,0x8139F132,
+ 0x8139F133,0x8139F134,0x8139F135,0x8139F136,0x8139F137,0x8139F138,
+ 0x8139F139,0x8139F230,0x8139F231,0x8139F232,0x8139F233,0x8139F234,
+ 0x8139F235,0x8139F236,0x8139F237,0x8139F238,0x8139F239,0x8139F330,
+ 0x8139F331,0x8139F332,0x8139F333,0x8139F334,0x8139F335,0x8139F336,
+ 0x8139F337,0x8139F338,0x8139F339,0x8139F430,0x8139F431,0x8139F432,
+ 0x8139F433,0x8139F434,0x8139F435,0x8139F436,0x8139F437,0x8139F438,
+ 0x8139F439,0x8139F530,0x8139F531,0x8139F532,0x8139F533,0x8139F534,
+ 0x8139F535,0x8139F536,0x8139F537,0x8139F538,0x8139F539, 0xFE56,
+ 0x8139F630,0x8139F631,0x8139F632,0x8139F633,0x8139F634,0x8139F635,
+ 0x8139F636,0x8139F637,0x8139F638,0x8139F639,0x8139F730,0x8139F731,
+ 0x8139F732,0x8139F733,0x8139F734,0x8139F735,0x8139F736,0x8139F737,
+ 0x8139F738,0x8139F739,0x8139F830,0x8139F831,0x8139F832,0x8139F833,
+ 0x8139F834,0x8139F835,0x8139F836,0x8139F837,0x8139F838,0x8139F839,
+ 0x8139F930,0x8139F931,0x8139F932,0x8139F933,0x8139F934,0x8139F935,
+ 0x8139F936,0x8139F937,0x8139F938,0x8139F939,0x8139FA30,0x8139FA31,
+ 0x8139FA32, 0xFE55,0x8139FA33,0x8139FA34,0x8139FA35,0x8139FA36,
+ 0x8139FA37,0x8139FA38,0x8139FA39,0x8139FB30,0x8139FB31,0x8139FB32,
+ 0x8139FB33,0x8139FB34,0x8139FB35,0x8139FB36,0x8139FB37,0x8139FB38,
+ 0x8139FB39,0x8139FC30,0x8139FC31,0x8139FC32,0x8139FC33,0x8139FC34,
+ 0x8139FC35,0x8139FC36,0x8139FC37,0x8139FC38,0x8139FC39,0x8139FD30,
+ 0x8139FD31,0x8139FD32,0x8139FD33,0x8139FD34,0x8139FD35,0x8139FD36,
+ 0x8139FD37,0x8139FD38,0x8139FD39,0x8139FE30,0x8139FE31,0x8139FE32,
+ 0x8139FE33,0x8139FE34,0x8139FE35,0x8139FE36,0x8139FE37,0x8139FE38,
+ 0x8139FE39,0x82308130,0x82308131,0x82308132,0x82308133,0x82308134,
+ 0x82308135,0x82308136,0x82308137,0x82308138,0x82308139,0x82308230,
+ 0x82308231,0x82308232,0x82308233,0x82308234,0x82308235,0x82308236,
+ 0x82308237,0x82308238,0x82308239,0x82308330,0x82308331,0x82308332,
+ 0x82308333,0x82308334,0x82308335,0x82308336,0x82308337,0x82308338,
+ 0x82308339,0x82308430,0x82308431,0x82308432,0x82308433,0x82308434,
+ 0x82308435,0x82308436,0x82308437,0x82308438,0x82308439,0x82308530,
+ 0x82308531,0x82308532,0x82308533,0x82308534,0x82308535,0x82308536,
+ 0x82308537,0x82308538,0x82308539,0x82308630,0x82308631,0x82308632,
+ 0x82308633,0x82308634,0x82308635,0x82308636,0x82308637,0x82308638,
+ 0x82308639,0x82308730,0x82308731,0x82308732,0x82308733,0x82308734,
+ 0x82308735,0x82308736,0x82308737,0x82308738,0x82308739,0x82308830,
+ 0x82308831,0x82308832,0x82308833,0x82308834,0x82308835,0x82308836,
+ 0x82308837,0x82308838,0x82308839,0x82308930,0x82308931,0x82308932,
+ 0x82308933,0x82308934,0x82308935,0x82308936,0x82308937,0x82308938,
+ 0x82308939,0x82308A30,0x82308A31,0x82308A32,0x82308A33,0x82308A34,
+ 0x82308A35,0x82308A36,0x82308A37,0x82308A38,0x82308A39,0x82308B30,
+ 0x82308B31,0x82308B32,0x82308B33,0x82308B34,0x82308B35,0x82308B36,
+ 0x82308B37,0x82308B38,0x82308B39,0x82308C30,0x82308C31,0x82308C32,
+ 0x82308C33,0x82308C34,0x82308C35,0x82308C36,0x82308C37,0x82308C38,
+ 0x82308C39,0x82308D30,0x82308D31,0x82308D32,0x82308D33,0x82308D34,
+ 0x82308D35,0x82308D36,0x82308D37,0x82308D38,0x82308D39,0x82308E30,
+ 0x82308E31,0x82308E32,0x82308E33,0x82308E34,0x82308E35,0x82308E36,
+ 0x82308E37,0x82308E38,0x82308E39,0x82308F30,0x82308F31,0x82308F32,
+ 0x82308F33,0x82308F34,0x82308F35,0x82308F36,0x82308F37,0x82308F38,
+ 0x82308F39,0x82309030,0x82309031,0x82309032,0x82309033,0x82309034,
+ 0x82309035,0x82309036,0x82309037,0x82309038,0x82309039,0x82309130,
+ 0x82309131,0x82309132,0x82309133,0x82309134,0x82309135,0x82309136,
+ 0x82309137,0x82309138,0x82309139,0x82309230,0x82309231,0x82309232,
+ 0x82309233,0x82309234,0x82309235,0x82309236,0x82309237,0x82309238,
+ 0x82309239,0x82309330,0x82309331,0x82309332,0x82309333,0x82309334,
+ 0x82309335,0x82309336,0x82309337,0x82309338,0x82309339,0x82309430,
+ 0x82309431,0x82309432,0x82309433,0x82309434,0x82309435,0x82309436,
+ 0x82309437,0x82309438,0x82309439,0x82309530,0x82309531,0x82309532,
+ 0x82309533,0x82309534,0x82309535,0x82309536,0x82309537,0x82309538,
+ 0x82309539,0x82309630,0x82309631,0x82309632,0x82309633,0x82309634,
+ 0x82309635,0x82309636,0x82309637,0x82309638,0x82309639,0x82309730,
+ 0x82309731,0x82309732,0x82309733,0x82309734,0x82309735,0x82309736,
+ 0x82309737,0x82309738,0x82309739,0x82309830,0x82309831,0x82309832,
+ 0x82309833,0x82309834,0x82309835,0x82309836,0x82309837,0x82309838,
+ 0x82309839,0x82309930,0x82309931,0x82309932,0x82309933,0x82309934,
+ 0x82309935,0x82309936,0x82309937,0x82309938,0x82309939,0x82309A30,
+ 0xFE5A,0x82309A31,0x82309A32,0x82309A33,0x82309A34,0x82309A35,
+ 0x82309A36,0x82309A37,0x82309A38,0x82309A39,0x82309B30,0x82309B31,
+ 0x82309B32,0x82309B33,0x82309B34,0x82309B35,0x82309B36,0x82309B37,
+ 0x82309B38,0x82309B39,0x82309C30,0x82309C31,0x82309C32,0x82309C33,
+ 0x82309C34,0x82309C35,0x82309C36,0x82309C37,0x82309C38,0x82309C39,
+ 0x82309D30,0x82309D31,0x82309D32,0x82309D33,0x82309D34,0x82309D35,
+ 0x82309D36,0x82309D37,0x82309D38,0x82309D39,0x82309E30,0x82309E31,
+ 0x82309E32,0x82309E33,0x82309E34,0x82309E35,0x82309E36,0x82309E37,
+ 0x82309E38,0x82309E39,0x82309F30,0x82309F31,0x82309F32,0x82309F33,
+ 0x82309F34,0x82309F35,0x82309F36,0x82309F37,0x82309F38,0x82309F39,
+ 0x8230A030,0x8230A031,0x8230A032,0x8230A033,0x8230A034,0x8230A035,
+ 0x8230A036,0x8230A037,0x8230A038,0x8230A039,0x8230A130,0x8230A131,
+ 0x8230A132,0x8230A133,0x8230A134,0x8230A135,0x8230A136,0x8230A137,
+ 0x8230A138,0x8230A139,0x8230A230,0x8230A231,0x8230A232,0x8230A233,
+ 0x8230A234,0x8230A235,0x8230A236,0x8230A237,0x8230A238,0x8230A239,
+ 0x8230A330,0x8230A331,0x8230A332,0x8230A333,0x8230A334,0x8230A335,
+ 0x8230A336,0x8230A337,0x8230A338,0x8230A339,0x8230A430,0x8230A431,
+ 0x8230A432,0x8230A433,0x8230A434,0x8230A435,0x8230A436,0x8230A437,
+ 0x8230A438,0x8230A439,0x8230A530,0x8230A531, 0xFE5C,0x8230A532,
+ 0x8230A533,0x8230A534,0x8230A535,0x8230A536,0x8230A537,0x8230A538,
+ 0x8230A539,0x8230A630,0x8230A631,0x8230A632, 0xFE5B, 0xFE60,
+ 0x8230F238,0x8230F239,0x8230F330,0x8230F331,0x8230F332,0x8230F333,
+ 0x8230F334,0x8230F335,0x8230F336,0x8230F337,0x8230F338,0x8230F339,
+ 0x8230F430,0x8230F431,0x8230F432,0x8230F433,0x8230F434,0x8230F435,
+ 0x8230F436,0x8230F437,0x8230F438,0x8230F439,0x8230F530,0x8230F531,
+ 0x8230F532,0x8230F533,0x8230F534,0x8230F535,0x8230F536,0x8230F537,
+ 0x8230F538,0x8230F539,0x8230F630,0x8230F631,0x8230F632,0x8230F633,
+ 0x8230F634,0x8230F635,0x8230F636,0x8230F637,0x8230F638,0x8230F639,
+ 0x8230F730,0x8230F731,0x8230F732,0x8230F733,0x8230F734,0x8230F735,
+ 0x8230F736,0x8230F737,0x8230F738,0x8230F739,0x8230F830,0x8230F831,
+ 0x8230F832,0x8230F833,0x8230F834,0x8230F835,0x8230F836,0x8230F837,
+ 0x8230F838,0x8230F839,0x8230F930,0x8230F931,0x8230F932,0x8230F933,
+ 0x8230F934,0x8230F935,0x8230F936,0x8230F937,0x8230F938,0x8230F939,
+ 0x8230FA30,0x8230FA31,0x8230FA32,0x8230FA33,0x8230FA34,0x8230FA35,
+ 0x8230FA36,0x8230FA37,0x8230FA38,0x8230FA39,0x8230FB30,0x8230FB31,
+ 0x8230FB32, 0xFE5F,0x8230FB33,0x8230FB34,0x8230FB35,0x8230FB36,
+ 0x8230FB37,0x8230FB38,0x8230FB39,0x8230FC30,0x8230FC31,0x8230FC32,
+ 0x8230FC33,0x8230FC34,0x8230FC35,0x8230FC36,0x8230FC37,0x8230FC38,
+ 0x8230FC39,0x8230FD30,0x8230FD31,0x8230FD32,0x8230FD33,0x8230FD34,
+ 0x8230FD35,0x8230FD36,0x8230FD37,0x8230FD38,0x8230FD39,0x8230FE30,
+ 0x8230FE31,0x8230FE32,0x8230FE33,0x8230FE34,0x8230FE35,0x8230FE36,
+ 0x8230FE37,0x8230FE38,0x8230FE39,0x82318130,0x82318131,0x82318132,
+ 0x82318133,0x82318134,0x82318135,0x82318136,0x82318137,0x82318138,
+ 0x82318139,0x82318230,0x82318231,0x82318232,0x82318233,0x82318234,
+ 0x82318235,0x82318236,0x82318237,0x82318238,0x82318239,0x82318330,
+ 0x82318331,0x82318332,0x82318333,0x82318334,0x82318335,0x82318336,
+ 0x82318337,0x82318338,0x82318339,0x82318430,0x82318431,0x82318432,
+ 0x82318433,0x82318434,0x82318435,0x82318436,0x82318437,0x82318438,
+ 0x82318439,0x82318530,0x82318531,0x82318532,0x82318533,0x82318534,
+ 0x82318535,0x82318536,0x82318537,0x82318538,0x82318539,0x82318630,
+ 0x82318631,0x82318632,0x82318633,0x82318634,0x82318635,0x82318636,
+ 0x82318637,0x82318638, 0xFE62, 0xFE65,0x82318639,0x82318730,
+ 0x82318731,0x82318732,0x82318733,0x82318734,0x82318735,0x82318736,
+ 0x82318737,0x82318738,0x82318739,0x82318830,0x82318831,0x82318832,
+ 0xFE63,0x82318833,0x82318834,0x82318835,0x82318836,0x82318837,
+ 0x82318838,0x82318839,0x82318930,0x82318931,0x82318932,0x82318933,
+ 0x82318934,0x82318935,0x82318936,0x82318937,0x82318938,0x82318939,
+ 0x82318A30,0x82318A31,0x82318A32,0x82318A33,0x82318A34,0x82318A35,
+ 0x82318A36,0x82318A37,0x82318A38,0x82318A39,0x82318B30,0x82318B31,
+ 0x82318B32,0x82318B33,0x82318B34,0x82318B35,0x82318B36,0x82318B37,
+ 0x82318B38,0x82318B39,0x82318C30,0x82318C31,0x82318C32,0x82318C33,
+ 0x82318C34,0x82318C35,0x82318C36,0x82318C37,0x82318C38,0x82318C39,
+ 0x82318D30,0x82318D31,0x82318D32,0x82318D33,0x82318D34,0x82318D35,
+ 0x82318D36,0x82318D37,0x82318D38,0x82318D39,0x82318E30,0x82318E31,
+ 0x82318E32,0x82318E33,0x82318E34,0x82318E35,0x82318E36,0x82318E37,
+ 0x82318E38,0x82318E39,0x82318F30,0x82318F31,0x82318F32,0x82318F33,
+ 0x82318F34,0x82318F35,0x82318F36,0x82318F37,0x82318F38,0x82318F39,
+ 0x82319030,0x82319031,0x82319032,0x82319033,0x82319034,0x82319035,
+ 0x82319036,0x82319037,0x82319038,0x82319039,0x82319130,0x82319131,
+ 0x82319132,0x82319133,0x82319134,0x82319135,0x82319136,0x82319137,
+ 0x82319138,0x82319139,0x82319230,0x82319231,0x82319232,0x82319233,
+ 0x82319234,0x82319235,0x82319236,0x82319237,0x82319238,0x82319239,
+ 0x82319330,0x82319331,0x82319332,0x82319333,0x82319334,0x82319335,
+ 0x82319336,0x82319337,0x82319338,0x82319339,0x82319430,0x82319431,
+ 0x82319432,0x82319433,0x82319434,0x82319435,0x82319436,0x82319437,
+ 0x82319438,0x82319439,0x82319530,0x82319531,0x82319532,0x82319533,
+ 0x82319534,0x82319535,0x82319536,0x82319537,0x82319538,0x82319539,
+ 0x82319630,0x82319631,0x82319632,0x82319633,0x82319634,0x82319635,
+ 0x82319636,0x82319637,0x82319638,0x82319639, 0xFE64,0x82319730,
+ 0x82319731,0x82319732,0x82319733,0x82319734,0x82319735,0x82319736,
+ 0x82319737,0x82319738,0x82319739,0x82319830,0x82319831,0x82319832,
+ 0x82319833,0x82319834,0x82319835,0x82319836,0x82319837,0x82319838,
+ 0x82319839,0x82319930,0x82319931,0x82319932,0x82319933,0x82319934,
+ 0x82319935,0x82319936,0x82319937,0x82319938,0x82319939,0x82319A30,
+ 0x82319A31,0x82319A32,0x82319A33,0x82319A34,0x82319A35,0x82319A36,
+ 0x82319A37,0x82319A38,0x82319A39,0x82319B30,0x82319B31,0x82319B32,
+ 0x82319B33,0x82319B34,0x82319B35,0x82319B36,0x82319B37,0x82319B38,
+ 0x82319B39,0x82319C30,0x82319C31,0x82319C32,0x82319C33,0x82319C34,
+ 0x82319C35,0x82319C36,0x82319C37,0x82319C38,0x82319C39,0x82319D30,
+ 0x82319D31,0x82319D32,0x82319D33,0x82319D34,0x82319D35,0x82319D36,
+ 0x82319D37,0x82319D38,0x82319D39,0x82319E30,0x82319E31,0x82319E32,
+ 0x82319E33,0x82319E34,0x82319E35,0x82319E36,0x82319E37,0x82319E38,
+ 0x82319E39,0x82319F30,0x82319F31,0x82319F32,0x82319F33,0x82319F34,
+ 0x82319F35,0x82319F36,0x82319F37,0x82319F38,0x82319F39,0x8231A030,
+ 0x8231A031,0x8231A032,0x8231A033,0x8231A034,0x8231A035,0x8231A036,
+ 0x8231A037,0x8231A038,0x8231A039,0x8231A130,0x8231A131,0x8231A132,
+ 0x8231A133,0x8231A134,0x8231A135,0x8231A136,0x8231A137,0x8231A138,
+ 0x8231A139,0x8231A230,0x8231A231,0x8231A232,0x8231A233,0x8231A234,
+ 0x8231A235,0x8231A236,0x8231A237,0x8231A238,0x8231A239,0x8231A330,
+ 0x8231A331,0x8231A332,0x8231A333,0x8231A334,0x8231A335,0x8231A336,
+ 0x8231A337,0x8231A338,0x8231A339,0x8231A430,0x8231A431,0x8231A432,
+ 0x8231A433,0x8231A434,0x8231A435,0x8231A436,0x8231A437,0x8231A438,
+ 0x8231A439,0x8231A530,0x8231A531,0x8231A532,0x8231A533,0x8231A534,
+ 0x8231A535,0x8231A536,0x8231A537,0x8231A538,0x8231A539,0x8231A630,
+ 0x8231A631,0x8231A632,0x8231A633,0x8231A634,0x8231A635,0x8231A636,
+ 0x8231A637,0x8231A638,0x8231A639,0x8231A730,0x8231A731,0x8231A732,
+ 0x8231A733,0x8231A734,0x8231A735,0x8231A736,0x8231A737,0x8231A738,
+ 0x8231A739,0x8231A830,0x8231A831,0x8231A832,0x8231A833,0x8231A834,
+ 0x8231A835,0x8231A836,0x8231A837,0x8231A838,0x8231A839,0x8231A930,
+ 0x8231A931,0x8231A932,0x8231A933,0x8231A934,0x8231A935,0x8231A936,
+ 0x8231A937,0x8231A938,0x8231A939,0x8231AA30,0x8231AA31,0x8231AA32,
+ 0x8231AA33,0x8231AA34,0x8231AA35,0x8231AA36,0x8231AA37,0x8231AA38,
+ 0x8231AA39,0x8231AB30,0x8231AB31,0x8231AB32,0x8231AB33,0x8231AB34,
+ 0x8231AB35,0x8231AB36,0x8231AB37,0x8231AB38,0x8231AB39,0x8231AC30,
+ 0x8231AC31,0x8231AC32,0x8231AC33,0x8231AC34,0x8231AC35,0x8231AC36,
+ 0x8231AC37, 0xFE68,0x8231AC38,0x8231AC39,0x8231AD30,0x8231AD31,
+ 0x8231AD32,0x8231AD33,0x8231AD34,0x8231AD35,0x8231AD36,0x8231AD37,
+ 0x8231AD38,0x8231AD39,0x8231AE30,0x8231AE31,0x8231AE32,0x8231AE33,
+ 0x8231AE34,0x8231AE35,0x8231AE36,0x8231AE37,0x8231AE38,0x8231AE39,
+ 0x8231AF30,0x8231AF31,0x8231AF32,0x8231AF33,0x8231AF34,0x8231AF35,
+ 0x8231AF36,0x8231AF37,0x8231AF38,0x8231AF39,0x8231B030,0x8231B031,
+ 0x8231B032,0x8231B033,0x8231B034,0x8231B035,0x8231B036,0x8231B037,
+ 0x8231B038,0x8231B039,0x8231B130,0x8231B131,0x8231B132,0x8231B133,
+ 0x8231B134,0x8231B135,0x8231B136,0x8231B137,0x8231B138,0x8231B139,
+ 0x8231B230,0x8231B231,0x8231B232,0x8231B233,0x8231B234,0x8231B235,
+ 0x8231B236,0x8231B237,0x8231B238,0x8231B239,0x8231B330,0x8231B331,
+ 0x8231B332,0x8231B333,0x8231B334,0x8231B335,0x8231B336,0x8231B337,
+ 0x8231B338,0x8231B339,0x8231B430,0x8231B431,0x8231B432,0x8231B433,
+ 0x8231B434,0x8231B435,0x8231B436,0x8231B437,0x8231B438,0x8231B439,
+ 0x8231B530,0x8231B531,0x8231B532,0x8231B533,0x8231B534,0x8231B535,
+ 0x8231B536,0x8231B537,0x8231B538,0x8231B539,0x8231B630,0x8231B631,
+ 0x8231B632,0x8231B633,0x8231B634,0x8231B635,0x8231B636,0x8231B637,
+ 0x8231B638,0x8231B639,0x8231B730,0x8231B731,0x8231B732,0x8231B733,
+ 0x8231B734,0x8231B735,0x8231B736,0x8231B737,0x8231B738,0x8231B739,
+ 0x8231B830,0x8231B831,0x8231B832,0x8231B833,0x8231B834,0x8231B835,
+ 0x8231B836,0x8231B837,0x8231B838,0x8231B839,0x8231B930,0x8231B931,
+ 0x8231B932,0x8231B933,0x8231B934,0x8231B935,0x8231B936,0x8231B937,
+ 0x8231B938,0x8231B939,0x8231BA30,0x8231BA31,0x8231BA32,0x8231BA33,
+ 0x8231BA34,0x8231BA35,0x8231BA36,0x8231BA37,0x8231BA38,0x8231BA39,
+ 0x8231BB30,0x8231BB31,0x8231BB32,0x8231BB33,0x8231BB34,0x8231BB35,
+ 0x8231BB36,0x8231BB37,0x8231BB38,0x8231BB39,0x8231BC30,0x8231BC31,
+ 0x8231BC32,0x8231BC33,0x8231BC34,0x8231BC35,0x8231BC36,0x8231BC37,
+ 0x8231BC38,0x8231BC39,0x8231BD30,0x8231BD31,0x8231BD32,0x8231BD33,
+ 0x8231BD34,0x8231BD35,0x8231BD36,0x8231BD37,0x8231BD38,0x8231BD39,
+ 0x8231BE30,0x8231BE31,0x8231BE32,0x8231BE33,0x8231BE34,0x8231BE35,
+ 0x8231BE36,0x8231BE37,0x8231BE38,0x8231BE39,0x8231BF30,0x8231BF31,
+ 0x8231BF32,0x8231BF33,0x8231BF34,0x8231BF35,0x8231BF36,0x8231BF37,
+ 0x8231BF38,0x8231BF39,0x8231C030,0x8231C031,0x8231C032,0x8231C033,
+ 0x8231C034,0x8231C035,0x8231C036,0x8231C037,0x8231C038,0x8231C039,
+ 0x8231C130,0x8231C131,0x8231C132,0x8231C133,0x8231C134,0x8231C135,
+ 0x8231C136,0x8231C137,0x8231C138,0x8231C139,0x8231C230,0x8231C231,
+ 0x8231C232,0x8231C233,0x8231C234,0x8231C235,0x8231C236,0x8231C237,
+ 0x8231C238,0x8231C239,0x8231C330,0x8231C331,0x8231C332,0x8231C333,
+ 0x8231C334,0x8231C335,0x8231C336,0x8231C337,0x8231C338,0x8231C339,
+ 0x8231C430,0x8231C431,0x8231C432,0x8231C433,0x8231C434,0x8231C435,
+ 0x8231C436,0x8231C437,0x8231C438,0x8231C439,0x8231C530,0x8231C531,
+ 0x8231C532,0x8231C533,0x8231C534,0x8231C535,0x8231C536,0x8231C537,
+ 0x8231C538,0x8231C539,0x8231C630,0x8231C631,0x8231C632,0x8231C633,
+ 0x8231C634,0x8231C635,0x8231C636,0x8231C637,0x8231C638,0x8231C639,
+ 0x8231C730,0x8231C731,0x8231C732,0x8231C733,0x8231C734,0x8231C735,
+ 0x8231C736,0x8231C737,0x8231C738,0x8231C739,0x8231C830,0x8231C831,
+ 0x8231C832,0x8231C833,0x8231C834,0x8231C835,0x8231C836,0x8231C837,
+ 0x8231C838,0x8231C839,0x8231C930,0x8231C931,0x8231C932,0x8231C933,
+ 0x8231C934, 0xFE69,0x8231C935,0x8231C936,0x8231C937,0x8231C938,
+ 0x8231C939,0x8231CA30,0x8231CA31,0x8231CA32,0x8231CA33,0x8231CA34,
+ 0x8231CA35,0x8231CA36,0x8231CA37,0x8231CA38,0x8231CA39,0x8231CB30,
+ 0x8231CB31,0x8231CB32,0x8231CB33,0x8231CB34,0x8231CB35,0x8231CB36,
+ 0x8231CB37,0x8231CB38,0x8231CB39,0x8231CC30,0x8231CC31,0x8231CC32,
+ 0x8231CC33,0x8231CC34,0x8231CC35,0x8231CC36,0x8231CC37,0x8231CC38,
+ 0x8231CC39,0x8231CD30,0x8231CD31,0x8231CD32,0x8231CD33,0x8231CD34,
+ 0x8231CD35,0x8231CD36,0x8231CD37,0x8231CD38,0x8231CD39,0x8231CE30,
+ 0x8231CE31,0x8231CE32,0x8231CE33,0x8231CE34,0x8231CE35,0x8231CE36,
+ 0x8231CE37,0x8231CE38,0x8231CE39,0x8231CF30,0x8231CF31,0x8231CF32,
+ 0x8231CF33,0x8231CF34,0x8231CF35,0x8231CF36,0x8231CF37,0x8231CF38,
+ 0x8231CF39,0x8231D030,0x8231D031,0x8231D032,0x8231D033,0x8231D034,
+ 0x8231D035,0x8231D036,0x8231D037,0x8231D038,0x8231D039,0x8231D130,
+ 0x8231D131,0x8231D132,0x8231D133,0x8231D134,0x8231D135,0x8231D136,
+ 0x8231D137,0x8231D138,0x8231D139,0x8231D230,0x8231D231,0x8231D232,
+ 0x8231D233,0x8231D234,0x8231D235,0x8231D236,0x8231D237,0x8231D238,
+ 0x8231D239,0x8231D330,0x8231D331,0x8231D332,0x8231D333,0x8231D334,
+ 0x8231D335,0x8231D336,0x8231D337,0x8231D338,0x8231D339,0x8231D430,
+ 0x8231D431,0x8231D432,0x8231D433,0x8231D434,0x8231D435,0x8231D436,
+ 0x8231D437, 0xFE6A, 0xFE6F,0x8232AF33,0x8232AF34,0x8232AF35,
+ 0x8232AF36,0x8232AF37,0x8232AF38,0x8232AF39,0x8232B030,0x8232B031,
+ 0x8232B032,0x8232B033,0x8232B034,0x8232B035,0x8232B036,0x8232B037,
+ 0x8232B038,0x8232B039,0x8232B130,0x8232B131,0x8232B132,0x8232B133,
+ 0x8232B134,0x8232B135,0x8232B136,0x8232B137,0x8232B138,0x8232B139,
+ 0x8232B230,0x8232B231,0x8232B232,0x8232B233,0x8232B234,0x8232B235,
+ 0x8232B236,0x8232B237,0x8232B238,0x8232B239,0x8232B330,0x8232B331,
+ 0x8232B332,0x8232B333,0x8232B334,0x8232B335,0x8232B336,0x8232B337,
+ 0x8232B338,0x8232B339,0x8232B430,0x8232B431,0x8232B432,0x8232B433,
+ 0x8232B434,0x8232B435,0x8232B436,0x8232B437,0x8232B438,0x8232B439,
+ 0x8232B530,0x8232B531,0x8232B532,0x8232B533,0x8232B534,0x8232B535,
+ 0x8232B536,0x8232B537,0x8232B538,0x8232B539,0x8232B630,0x8232B631,
+ 0x8232B632,0x8232B633,0x8232B634,0x8232B635,0x8232B636,0x8232B637,
+ 0x8232B638,0x8232B639,0x8232B730,0x8232B731,0x8232B732,0x8232B733,
+ 0x8232B734,0x8232B735,0x8232B736,0x8232B737,0x8232B738,0x8232B739,
+ 0x8232B830,0x8232B831,0x8232B832,0x8232B833,0x8232B834,0x8232B835,
+ 0x8232B836,0x8232B837,0x8232B838,0x8232B839,0x8232B930,0x8232B931,
+ 0x8232B932,0x8232B933,0x8232B934,0x8232B935,0x8232B936,0x8232B937,
+ 0x8232B938,0x8232B939,0x8232BA30,0x8232BA31,0x8232BA32,0x8232BA33,
+ 0x8232BA34,0x8232BA35,0x8232BA36,0x8232BA37,0x8232BA38,0x8232BA39,
+ 0x8232BB30,0x8232BB31,0x8232BB32,0x8232BB33,0x8232BB34,0x8232BB35,
+ 0x8232BB36,0x8232BB37,0x8232BB38,0x8232BB39,0x8232BC30,0x8232BC31,
+ 0x8232BC32,0x8232BC33,0x8232BC34,0x8232BC35,0x8232BC36,0x8232BC37,
+ 0x8232BC38,0x8232BC39,0x8232BD30,0x8232BD31,0x8232BD32,0x8232BD33,
+ 0x8232BD34,0x8232BD35,0x8232BD36,0x8232BD37,0x8232BD38,0x8232BD39,
+ 0x8232BE30,0x8232BE31,0x8232BE32,0x8232BE33,0x8232BE34,0x8232BE35,
+ 0x8232BE36,0x8232BE37,0x8232BE38,0x8232BE39,0x8232BF30,0x8232BF31,
+ 0x8232BF32,0x8232BF33,0x8232BF34,0x8232BF35,0x8232BF36,0x8232BF37,
+ 0x8232BF38,0x8232BF39,0x8232C030,0x8232C031,0x8232C032,0x8232C033,
+ 0x8232C034,0x8232C035,0x8232C036,0x8232C037,0x8232C038,0x8232C039,
+ 0x8232C130,0x8232C131,0x8232C132,0x8232C133,0x8232C134,0x8232C135,
+ 0x8232C136,0x8232C137,0x8232C138,0x8232C139,0x8232C230,0x8232C231,
+ 0x8232C232,0x8232C233,0x8232C234,0x8232C235,0x8232C236,0x8232C237,
+ 0x8232C238,0x8232C239,0x8232C330,0x8232C331,0x8232C332,0x8232C333,
+ 0x8232C334,0x8232C335,0x8232C336,0x8232C337,0x8232C338,0x8232C339,
+ 0x8232C430,0x8232C431,0x8232C432,0x8232C433,0x8232C434,0x8232C435,
+ 0x8232C436,0x8232C437,0x8232C438,0x8232C439,0x8232C530,0x8232C531,
+ 0x8232C532,0x8232C533,0x8232C534,0x8232C535,0x8232C536,0x8232C537,
+ 0x8232C538,0x8232C539,0x8232C630,0x8232C631,0x8232C632,0x8232C633,
+ 0x8232C634,0x8232C635,0x8232C636,0x8232C637,0x8232C638,0x8232C639,
+ 0x8232C730,0x8232C731,0x8232C732,0x8232C733,0x8232C734,0x8232C735,
+ 0x8232C736,0x8232C737,0x8232C738,0x8232C739,0x8232C830,0x8232C831,
+ 0x8232C832,0x8232C833,0x8232C834,0x8232C835,0x8232C836,0x8232C837,
+ 0x8232C838,0x8232C839,0x8232C930,0x8232C931,0x8232C932,0x8232C933,
+ 0x8232C934,0x8232C935,0x8232C936, 0xFE70, 0xFE72,0x8232F838,
+ 0x8232F839,0x8232F930,0x8232F931,0x8232F932,0x8232F933,0x8232F934,
+ 0x8232F935,0x8232F936,0x8232F937,0x8232F938,0x8232F939,0x8232FA30,
+ 0x8232FA31,0x8232FA32,0x8232FA33,0x8232FA34,0x8232FA35,0x8232FA36,
+ 0x8232FA37,0x8232FA38,0x8232FA39,0x8232FB30,0x8232FB31,0x8232FB32,
+ 0x8232FB33,0x8232FB34,0x8232FB35,0x8232FB36,0x8232FB37,0x8232FB38,
+ 0x8232FB39,0x8232FC30,0x8232FC31,0x8232FC32,0x8232FC33,0x8232FC34,
+ 0x8232FC35,0x8232FC36,0x8232FC37,0x8232FC38,0x8232FC39,0x8232FD30,
+ 0x8232FD31,0x8232FD32,0x8232FD33,0x8232FD34,0x8232FD35,0x8232FD36,
+ 0x8232FD37,0x8232FD38,0x8232FD39,0x8232FE30,0x8232FE31,0x8232FE32,
+ 0x8232FE33,0x8232FE34,0x8232FE35,0x8232FE36,0x8232FE37,0x8232FE38,
+ 0x8232FE39,0x82338130,0x82338131,0x82338132,0x82338133,0x82338134,
+ 0x82338135,0x82338136,0x82338137,0x82338138,0x82338139,0x82338230,
+ 0x82338231,0x82338232,0x82338233,0x82338234,0x82338235,0x82338236,
+ 0x82338237,0x82338238,0x82338239,0x82338330,0x82338331,0x82338332,
+ 0x82338333,0x82338334,0x82338335,0x82338336,0x82338337,0x82338338,
+ 0x82338339,0x82338430,0x82338431,0x82338432,0x82338433,0x82338434,
+ 0x82338435,0x82338436,0x82338437,0x82338438,0x82338439,0x82338530,
+ 0x82338531,0x82338532,0x82338533,0x82338534,0x82338535,0x82338536,
+ 0x82338537,0x82338538,0x82338539,0x82338630,0x82338631,0x82338632,
+ 0x82338633, 0xFE78,0x82338634,0x82338635,0x82338636,0x82338637,
+ 0xFE77,0x82338638,0x82338639,0x82338730,0x82338731,0x82338732,
+ 0x82338733,0x82338734,0x82338735,0x82338736,0x82338737,0x82338738,
+ 0x82338739,0x82338830,0x82338831,0x82338832,0x82338833,0x82338834,
+ 0x82338835,0x82338836,0x82338837,0x82338838,0x82338839,0x82338930,
+ 0x82338931,0x82338932,0x82338933,0x82338934,0x82338935,0x82338936,
+ 0x82338937,0x82338938,0x82338939,0x82338A30,0x82338A31,0x82338A32,
+ 0x82338A33,0x82338A34,0x82338A35,0x82338A36,0x82338A37,0x82338A38,
+ 0x82338A39,0x82338B30, 0xFE7A,0x82338B31,0x82338B32,0x82338B33,
+ 0x82338B34,0x82338B35,0x82338B36,0x82338B37,0x82338B38,0x82338B39,
+ 0x82338C30,0x82338C31,0x82338C32,0x82338C33,0x82338C34,0x82338C35,
+ 0x82338C36,0x82338C37,0x82338C38,0x82338C39,0x82338D30,0x82338D31,
+ 0x82338D32,0x82338D33,0x82338D34,0x82338D35,0x82338D36,0x82338D37,
+ 0x82338D38,0x82338D39,0x82338E30,0x82338E31,0x82338E32,0x82338E33,
+ 0x82338E34,0x82338E35,0x82338E36,0x82338E37,0x82338E38,0x82338E39,
+ 0x82338F30,0x82338F31,0x82338F32,0x82338F33,0x82338F34,0x82338F35,
+ 0x82338F36,0x82338F37,0x82338F38,0x82338F39,0x82339030,0x82339031,
+ 0x82339032,0x82339033,0x82339034,0x82339035,0x82339036,0x82339037,
+ 0x82339038,0x82339039,0x82339130,0x82339131,0x82339132,0x82339133,
+ 0x82339134,0x82339135,0x82339136,0x82339137,0x82339138,0x82339139,
+ 0x82339230,0x82339231,0x82339232,0x82339233,0x82339234,0x82339235,
+ 0x82339236,0x82339237,0x82339238,0x82339239,0x82339330,0x82339331,
+ 0x82339332,0x82339333,0x82339334,0x82339335,0x82339336,0x82339337,
+ 0x82339338,0x82339339,0x82339430,0x82339431,0x82339432,0x82339433,
+ 0x82339434,0x82339435,0x82339436,0x82339437,0x82339438,0x82339439,
+ 0x82339530,0x82339531,0x82339532,0x82339533,0x82339534,0x82339535,
+ 0x82339536,0x82339537,0x82339538,0x82339539,0x82339630,0x82339631,
+ 0x82339632,0x82339633,0x82339634,0x82339635,0x82339636,0x82339637,
+ 0x82339638,0x82339639,0x82339730,0x82339731,0x82339732,0x82339733,
+ 0x82339734,0x82339735,0x82339736,0x82339737,0x82339738,0x82339739,
+ 0x82339830,0x82339831,0x82339832,0x82339833,0x82339834,0x82339835,
+ 0x82339836,0x82339837,0x82339838,0x82339839,0x82339930,0x82339931,
+ 0x82339932,0x82339933,0x82339934,0x82339935,0x82339936,0x82339937,
+ 0x82339938,0x82339939,0x82339A30,0x82339A31,0x82339A32,0x82339A33,
+ 0x82339A34,0x82339A35,0x82339A36,0x82339A37,0x82339A38,0x82339A39,
+ 0x82339B30,0x82339B31,0x82339B32,0x82339B33,0x82339B34,0x82339B35,
+ 0x82339B36,0x82339B37,0x82339B38,0x82339B39,0x82339C30,0x82339C31,
+ 0x82339C32,0x82339C33,0x82339C34,0x82339C35,0x82339C36,0x82339C37,
+ 0x82339C38,0x82339C39,0x82339D30,0x82339D31,0x82339D32,0x82339D33,
+ 0x82339D34,0x82339D35,0x82339D36,0x82339D37,0x82339D38,0x82339D39,
+ 0x82339E30,0x82339E31,0x82339E32,0x82339E33,0x82339E34,0x82339E35,
+ 0x82339E36,0x82339E37,0x82339E38,0x82339E39,0x82339F30,0x82339F31,
+ 0x82339F32,0x82339F33,0x82339F34,0x82339F35,0x82339F36,0x82339F37,
+ 0x82339F38,0x82339F39,0x8233A030,0x8233A031,0x8233A032,0x8233A033,
+ 0x8233A034,0x8233A035,0x8233A036,0x8233A037,0x8233A038,0x8233A039,
+ 0x8233A130,0x8233A131,0x8233A132,0x8233A133,0x8233A134,0x8233A135,
+ 0x8233A136,0x8233A137,0x8233A138,0x8233A139,0x8233A230,0x8233A231,
+ 0x8233A232,0x8233A233,0x8233A234,0x8233A235,0x8233A236,0x8233A237,
+ 0x8233A238,0x8233A239,0x8233A330,0x8233A331,0x8233A332,0x8233A333,
+ 0x8233A334,0x8233A335,0x8233A336,0x8233A337,0x8233A338, 0xFE7B,
+ 0xFE7D,0x8233C932,0x8233C933,0x8233C934,0x8233C935,0x8233C936,
+ 0x8233C937,0x8233C938,0x8233C939,0x8233CA30,0x8233CA31,0x8233CA32,
+ 0x8233CA33,0x8233CA34,0x8233CA35,0x8233CA36,0x8233CA37,0x8233CA38,
+ 0x8233CA39,0x8233CB30,0x8233CB31, 0xFE7C,0x8233CB32,0x8233CB33,
+ 0x8233CB34,0x8233CB35,0x8233CB36,0x8233CB37,0x8233CB38,0x8233CB39,
+ 0x8233CC30,0x8233CC31,0x8233CC32,0x8233CC33,0x8233CC34,0x8233CC35,
+ 0x8233CC36,0x8233CC37,0x8233CC38,0x8233CC39,0x8233CD30,0x8233CD31,
+ 0x8233CD32,0x8233CD33,0x8233CD34,0x8233CD35,0x8233CD36,0x8233CD37,
+ 0x8233CD38,0x8233CD39,0x8233CE30,0x8233CE31,0x8233CE32,0x8233CE33,
+ 0x8233CE34,0x8233CE35,0x8233CE36,0x8233CE37,0x8233CE38,0x8233CE39,
+ 0x8233CF30,0x8233CF31,0x8233CF32,0x8233CF33,0x8233CF34,0x8233CF35,
+ 0x8233CF36,0x8233CF37,0x8233CF38,0x8233CF39,0x8233D030,0x8233D031,
+ 0x8233D032,0x8233D033,0x8233D034,0x8233D035,0x8233D036,0x8233D037,
+ 0x8233D038,0x8233D039,0x8233D130,0x8233D131,0x8233D132,0x8233D133,
+ 0x8233D134,0x8233D135,0x8233D136,0x8233D137,0x8233D138,0x8233D139,
+ 0x8233D230,0x8233D231,0x8233D232,0x8233D233,0x8233D234,0x8233D235,
+ 0x8233D236,0x8233D237,0x8233D238,0x8233D239,0x8233D330,0x8233D331,
+ 0x8233D332,0x8233D333,0x8233D334,0x8233D335,0x8233D336,0x8233D337,
+ 0x8233D338,0x8233D339,0x8233D430,0x8233D431,0x8233D432,0x8233D433,
+ 0x8233D434,0x8233D435,0x8233D436,0x8233D437,0x8233D438,0x8233D439,
+ 0x8233D530,0x8233D531,0x8233D532,0x8233D533,0x8233D534,0x8233D535,
+ 0x8233D536,0x8233D537,0x8233D538,0x8233D539,0x8233D630,0x8233D631,
+ 0x8233D632,0x8233D633,0x8233D634,0x8233D635,0x8233D636,0x8233D637,
+ 0x8233D638,0x8233D639,0x8233D730,0x8233D731,0x8233D732,0x8233D733,
+ 0x8233D734,0x8233D735,0x8233D736,0x8233D737,0x8233D738,0x8233D739,
+ 0x8233D830,0x8233D831,0x8233D832,0x8233D833,0x8233D834,0x8233D835,
+ 0x8233D836,0x8233D837,0x8233D838,0x8233D839,0x8233D930,0x8233D931,
+ 0x8233D932,0x8233D933,0x8233D934,0x8233D935,0x8233D936,0x8233D937,
+ 0x8233D938,0x8233D939,0x8233DA30,0x8233DA31,0x8233DA32,0x8233DA33,
+ 0x8233DA34,0x8233DA35,0x8233DA36,0x8233DA37,0x8233DA38,0x8233DA39,
+ 0x8233DB30,0x8233DB31,0x8233DB32,0x8233DB33,0x8233DB34,0x8233DB35,
+ 0x8233DB36,0x8233DB37,0x8233DB38,0x8233DB39,0x8233DC30,0x8233DC31,
+ 0x8233DC32,0x8233DC33,0x8233DC34,0x8233DC35,0x8233DC36,0x8233DC37,
+ 0x8233DC38,0x8233DC39,0x8233DD30,0x8233DD31,0x8233DD32,0x8233DD33,
+ 0x8233DD34,0x8233DD35,0x8233DD36,0x8233DD37,0x8233DD38,0x8233DD39,
+ 0x8233DE30,0x8233DE31,0x8233DE32,0x8233DE33,0x8233DE34, 0xFE80,
+ 0x8233DE35,0x8233DE36,0x8233DE37,0x8233DE38,0x8233DE39, 0xFE81,
+ 0x8233DF30,0x8233DF31,0x8233DF32,0x8233DF33,0x8233DF34,0x8233DF35,
+ 0x8233DF36,0x8233DF37,0x8233DF38,0x8233DF39,0x8233E030,0x8233E031,
+ 0x8233E032,0x8233E033,0x8233E034,0x8233E035,0x8233E036,0x8233E037,
+ 0x8233E038,0x8233E039,0x8233E130,0x8233E131,0x8233E132,0x8233E133,
+ 0x8233E134,0x8233E135,0x8233E136,0x8233E137,0x8233E138,0x8233E139,
+ 0x8233E230,0x8233E231,0x8233E232,0x8233E233,0x8233E234,0x8233E235,
+ 0x8233E236,0x8233E237,0x8233E238,0x8233E239,0x8233E330,0x8233E331,
+ 0x8233E332,0x8233E333,0x8233E334,0x8233E335,0x8233E336,0x8233E337,
+ 0x8233E338,0x8233E339,0x8233E430,0x8233E431,0x8233E432,0x8233E433,
+ 0x8233E434,0x8233E435,0x8233E436,0x8233E437,0x8233E438,0x8233E439,
+ 0x8233E530,0x8233E531,0x8233E532,0x8233E533,0x8233E534,0x8233E535,
+ 0x8233E536,0x8233E537,0x8233E538,0x8233E539,0x8233E630,0x8233E631,
+ 0x8233E632,0x8233E633,0x8233E634,0x8233E635,0x8233E636,0x8233E637,
+ 0x8233E638,0x8233E639,0x8233E730,0x8233E731, 0xFE82,0x8233E732,
+ 0x8233E733,0x8233E734,0x8233E735,0x8233E736,0x8233E737,0x8233E738,
+ 0x8233E739,0x8233E830,0x8233E831,0x8233E832,0x8233E833,0x8233E834,
+ 0x8233E835,0x8233E836,0x8233E837, 0xFE83, 0xFE85,0x82349639,
+ 0x82349730,0x82349731,0x82349732,0x82349733,0x82349734,0x82349735,
+ 0x82349736,0x82349737,0x82349738,0x82349739,0x82349830,0x82349831,
+ 0x82349832,0x82349833,0x82349834,0x82349835,0x82349836,0x82349837,
+ 0x82349838,0x82349839,0x82349930,0x82349931,0x82349932,0x82349933,
+ 0x82349934,0x82349935,0x82349936,0x82349937,0x82349938,0x82349939,
+ 0x82349A30,0x82349A31,0x82349A32,0x82349A33,0x82349A34,0x82349A35,
+ 0x82349A36,0x82349A37,0x82349A38,0x82349A39,0x82349B30,0x82349B31,
+ 0x82349B32,0x82349B33,0x82349B34,0x82349B35,0x82349B36,0x82349B37,
+ 0x82349B38, 0xFE86,0x82349B39,0x82349C30, 0xFE87,0x82349C31,
+ 0x82349C32,0x82349C33,0x82349C34, 0xFE88, 0xFE89,0x82349C35,
+ 0xFE8A, 0xFE8B,0x82349C36,0x82349C37,0x82349C38,0x82349C39,
+ 0x82349D30,0x82349D31,0x82349D32,0x82349D33,0x82349D34,0x82349D35,
+ 0x82349D36,0x82349D37,0x82349D38,0x82349D39,0x82349E30,0x82349E31,
+ 0x82349E32,0x82349E33,0x82349E34,0x82349E35, 0xFE8D,0x82349E36,
+ 0x82349E37,0x82349E38, 0xFE8C,0x82349E39,0x82349F30,0x82349F31,
+ 0x82349F32,0x82349F33,0x82349F34,0x82349F35,0x82349F36,0x82349F37,
+ 0x82349F38,0x82349F39,0x8234A030,0x8234A031,0x8234A032,0x8234A033,
+ 0x8234A034,0x8234A035,0x8234A036,0x8234A037,0x8234A038,0x8234A039,
+ 0x8234A130, 0xFE8F, 0xFE8E, 0xFE96,0x8234E734,0x8234E735,
+ 0x8234E736,0x8234E737,0x8234E738,0x8234E739,0x8234E830,0x8234E831,
+ 0x8234E832,0x8234E833,0x8234E834,0x8234E835,0x8234E836,0x8234E837,
+ 0x8234E838,0x8234E839,0x8234E930,0x8234E931,0x8234E932,0x8234E933,
+ 0x8234E934,0x8234E935,0x8234E936,0x8234E937,0x8234E938,0x8234E939,
+ 0x8234EA30,0x8234EA31,0x8234EA32,0x8234EA33,0x8234EA34,0x8234EA35,
+ 0x8234EA36,0x8234EA37,0x8234EA38,0x8234EA39,0x8234EB30,0x8234EB31,
+ 0x8234EB32, 0xFE93, 0xFE94, 0xFE95, 0xFE97, 0xFE92,
+ 0x8234EB33,0x8234EB34,0x8234EB35,0x8234EB36,0x8234EB37,0x8234EB38,
+ 0x8234EB39,0x8234EC30,0x8234EC31,0x8234EC32,0x8234EC33,0x8234EC34,
+ 0x8234EC35,0x8234EC36,0x8234EC37,0x8234EC38,0x8234EC39,0x8234ED30,
+ 0x8234ED31,0x8234ED32,0x8234ED33,0x8234ED34,0x8234ED35,0x8234ED36,
+ 0x8234ED37,0x8234ED38,0x8234ED39,0x8234EE30,0x8234EE31,0x8234EE32,
+ 0x8234EE33,0x8234EE34,0x8234EE35,0x8234EE36,0x8234EE37,0x8234EE38,
+ 0x8234EE39,0x8234EF30,0x8234EF31,0x8234EF32,0x8234EF33,0x8234EF34,
+ 0x8234EF35,0x8234EF36,0x8234EF37,0x8234EF38,0x8234EF39,0x8234F030,
+ 0x8234F031,0x8234F032,0x8234F033,0x8234F034,0x8234F035,0x8234F036,
+ 0x8234F037,0x8234F038,0x8234F039,0x8234F130,0x8234F131,0x8234F132,
+ 0x8234F133,0x8234F134,0x8234F135,0x8234F136,0x8234F137,0x8234F138,
+ 0x8234F139,0x8234F230,0x8234F231,0x8234F232,0x8234F233,0x8234F234,
+ 0x8234F235,0x8234F236,0x8234F237,0x8234F238,0x8234F239,0x8234F330,
+ 0x8234F331,0x8234F332,0x8234F333,0x8234F334,0x8234F335,0x8234F336,
+ 0x8234F337,0x8234F338,0x8234F339,0x8234F430,0x8234F431,0x8234F432,
+ 0x8234F433,0x8234F434,0x8234F435,0x8234F436,0x8234F437,0x8234F438,
+ 0x8234F439,0x8234F530,0x8234F531,0x8234F532,0x8234F533,0x8234F534,
+ 0x8234F535,0x8234F536,0x8234F537,0x8234F538,0x8234F539,0x8234F630,
+ 0x8234F631,0x8234F632,0x8234F633, 0xFE98, 0xFE99, 0xFE9A,
+ 0xFE9B, 0xFE9C, 0xFE9D, 0xFE9E,0x8234F634,0x8234F635,
+ 0x8234F636,0x8234F637,0x8234F638,0x8234F639,0x8234F730,0x8234F731,
+ 0x8234F732,0x8234F733,0x8234F734,0x8234F735,0x8234F736,0x8234F737,
+ 0x8234F738,0x8234F739,0x8234F830,0x8234F831,0x8234F832,0x8234F833,
+ 0x8234F834,0x8234F835,0x8234F836,0x8234F837,0x8234F838,0x8234F839,
+ 0x8234F930,0x8234F931,0x8234F932,0x8234F933,0x8234F934,0x8234F935,
+ 0x8234F936,0x8234F937,0x8234F938,0x8234F939,0x8234FA30,0x8234FA31,
+ 0x8234FA32,0x8234FA33,0x8234FA34,0x8234FA35,0x8234FA36,0x8234FA37,
+ 0x8234FA38,0x8234FA39,0x8234FB30,0x8234FB31,0x8234FB32,0x8234FB33,
+ 0x8234FB34,0x8234FB35,0x8234FB36,0x8234FB37,0x8234FB38,0x8234FB39,
+ 0x8234FC30,0x8234FC31,0x8234FC32,0x8234FC33,0x8234FC34,0x8234FC35,
+ 0x8234FC36,0x8234FC37,0x8234FC38,0x8234FC39,0x8234FD30,0x8234FD31,
+ 0x8234FD32,0x8234FD33,0x8234FD34,0x8234FD35,0x8234FD36,0x8234FD37,
+ 0x8234FD38,0x8234FD39,0x8234FE30,0x8234FE31,0x8234FE32,0x8234FE33,
+ 0x8234FE34,0x8234FE35,0x8234FE36,0x8234FE37,0x8234FE38,0x8234FE39,
+ 0x82358130,0x82358131,0x82358132,0x82358133,0x82358134,0x82358135,
+ 0x82358136,0x82358137,0x82358138,0x82358139,0x82358230,0x82358231,
+ 0x82358232,0x82358233,0x82358234,0x82358235,0x82358236,0x82358237,
+ 0x82358238,0x82358239,0x82358330,0x82358331,0x82358332,0x82358333,
+ 0x82358334,0x82358335,0x82358336,0x82358337,0x82358338,0x82358339,
+ 0x82358430,0x82358431,0x82358432,0x82358433,0x82358434,0x82358435,
+ 0x82358436,0x82358437,0x82358438,0x82358439,0x82358530,0x82358531,
+ 0x82358532,0x82358533,0x82358534,0x82358535,0x82358536,0x82358537,
+ 0x82358538,0x82358539,0x82358630,0x82358631,0x82358632,0x82358633,
+ 0x82358634,0x82358635,0x82358636,0x82358637,0x82358638,0x82358639,
+ 0x82358730,0x82358731, 0xFE9F,0x82358732,0x82358733,0x82358734,
+ 0x82358735,0x82358736,0x82358737,0x82358738,0x82358739,0x82358830,
+ 0x82358831,0x82358832,0x82358833,0x82358834,0x82358835,0x82358836,
+ 0x82358837,0x82358838,0x82358839,0x82358930,0x82358931,0x82358932,
+ 0x82358933,0x82358934,0x82358935,0x82358936,0x82358937,0x82358938,
+ 0x82358939,0x82358A30,0x82358A31,0x82358A32,0x82358A33,0x82358A34,
+ 0x82358A35,0x82358A36,0x82358A37,0x82358A38,0x82358A39,0x82358B30,
+ 0x82358B31,0x82358B32,0x82358B33,0x82358B34,0x82358B35,0x82358B36,
+ 0x82358B37,0x82358B38,0x82358B39,0x82358C30,0x82358C31,0x82358C32,
+ 0x82358C33,0x82358C34,0x82358C35,0x82358C36,0x82358C37,0x82358C38,
+ 0x82358C39,0x82358D30,0x82358D31,0x82358D32,0x82358D33,0x82358D34,
+ 0x82358D35,0x82358D36,0x82358D37,0x82358D38,0x82358D39,0x82358E30,
+ 0x82358E31,0x82358E32,0x82358E33,0x82358E34,0x82358E35,0x82358E36,
+ 0x82358E37,0x82358E38,0x82358E39,0x82358F30,0x82358F31,0x82358F32,
+ 0xD2BB, 0xB6A1, 0x8140, 0xC6DF, 0x8141, 0x8142,
+ 0x8143, 0xCDF2, 0xD5C9, 0xC8FD, 0xC9CF, 0xCFC2,
+ 0xD8A2, 0xB2BB, 0xD3EB, 0x8144, 0xD8A4, 0xB3F3,
+ 0x8145, 0xD7A8, 0xC7D2, 0xD8A7, 0xCAC0, 0x8146,
+ 0xC7F0, 0xB1FB, 0xD2B5, 0xB4D4, 0xB6AB, 0xCBBF,
+ 0xD8A9, 0x8147, 0x8148, 0x8149, 0xB6AA, 0x814A,
+ 0xC1BD, 0xD1CF, 0x814B, 0xC9A5, 0xD8AD, 0x814C,
+ 0xB8F6, 0xD1BE, 0xE3DC, 0xD6D0, 0x814D, 0x814E,
+ 0xB7E1, 0x814F, 0xB4AE, 0x8150, 0xC1D9, 0x8151,
+ 0xD8BC, 0x8152, 0xCDE8, 0xB5A4, 0xCEAA, 0xD6F7,
+ 0x8153, 0xC0F6, 0xBED9, 0xD8AF, 0x8154, 0x8155,
+ 0x8156, 0xC4CB, 0x8157, 0xBEC3, 0x8158, 0xD8B1,
+ 0xC3B4, 0xD2E5, 0x8159, 0xD6AE, 0xCEDA, 0xD5A7,
+ 0xBAF5, 0xB7A6, 0xC0D6, 0x815A, 0xC6B9, 0xC5D2,
+ 0xC7C7, 0x815B, 0xB9D4, 0x815C, 0xB3CB, 0xD2D2,
+ 0x815D, 0x815E, 0xD8BF, 0xBEC5, 0xC6F2, 0xD2B2,
+ 0xCFB0, 0xCFE7, 0x815F, 0x8160, 0x8161, 0x8162,
+ 0xCAE9, 0x8163, 0x8164, 0xD8C0, 0x8165, 0x8166,
+ 0x8167, 0x8168, 0x8169, 0x816A, 0xC2F2, 0xC2D2,
+ 0x816B, 0xC8E9, 0x816C, 0x816D, 0x816E, 0x816F,
+ 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175,
+ 0xC7AC, 0x8176, 0x8177, 0x8178, 0x8179, 0x817A,
+ 0x817B, 0x817C, 0xC1CB, 0x817D, 0xD3E8, 0xD5F9,
+ 0x817E, 0xCAC2, 0xB6FE, 0xD8A1, 0xD3DA, 0xBFF7,
+ 0x8180, 0xD4C6, 0xBBA5, 0xD8C1, 0xCEE5, 0xBEAE,
+ 0x8181, 0x8182, 0xD8A8, 0x8183, 0xD1C7, 0xD0A9,
+ 0x8184, 0x8185, 0x8186, 0xD8BD, 0xD9EF, 0xCDF6,
+ 0xBFBA, 0x8187, 0xBDBB, 0xBAA5, 0xD2E0, 0xB2FA,
+ 0xBAE0, 0xC4B6, 0x8188, 0xCFED, 0xBEA9, 0xCDA4,
+ 0xC1C1, 0x8189, 0x818A, 0x818B, 0xC7D7, 0xD9F1,
+ 0x818C, 0xD9F4, 0x818D, 0x818E, 0x818F, 0x8190,
+ 0xC8CB, 0xD8E9, 0x8191, 0x8192, 0x8193, 0xD2DA,
+ 0xCAB2, 0xC8CA, 0xD8EC, 0xD8EA, 0xD8C6, 0xBDF6,
+ 0xC6CD, 0xB3F0, 0x8194, 0xD8EB, 0xBDF1, 0xBDE9,
+ 0x8195, 0xC8D4, 0xB4D3, 0x8196, 0x8197, 0xC2D8,
+ 0x8198, 0xB2D6, 0xD7D0, 0xCACB, 0xCBFB, 0xD5CC,
+ 0xB8B6, 0xCFC9, 0x8199, 0x819A, 0x819B, 0xD9DA,
+ 0xD8F0, 0xC7AA, 0x819C, 0xD8EE, 0x819D, 0xB4FA,
+ 0xC1EE, 0xD2D4, 0x819E, 0x819F, 0xD8ED, 0x81A0,
+ 0xD2C7, 0xD8EF, 0xC3C7, 0x81A1, 0x81A2, 0x81A3,
+ 0xD1F6, 0x81A4, 0xD6D9, 0xD8F2, 0x81A5, 0xD8F5,
+ 0xBCFE, 0xBCDB, 0x81A6, 0x81A7, 0x81A8, 0xC8CE,
+ 0x81A9, 0xB7DD, 0x81AA, 0xB7C2, 0x81AB, 0xC6F3,
+ 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1,
+ 0x81B2, 0xD8F8, 0xD2C1, 0x81B3, 0x81B4, 0xCEE9,
+ 0xBCBF, 0xB7FC, 0xB7A5, 0xD0DD, 0x81B5, 0x81B6,
+ 0x81B7, 0x81B8, 0x81B9, 0xD6DA, 0xD3C5, 0xBBEF,
+ 0xBBE1, 0xD8F1, 0x81BA, 0x81BB, 0xC9A1, 0xCEB0,
+ 0xB4AB, 0x81BC, 0xD8F3, 0x81BD, 0xC9CB, 0xD8F6,
+ 0xC2D7, 0xD8F7, 0x81BE, 0x81BF, 0xCEB1, 0xD8F9,
+ 0x81C0, 0x81C1, 0x81C2, 0xB2AE, 0xB9C0, 0x81C3,
+ 0xD9A3, 0x81C4, 0xB0E9, 0x81C5, 0xC1E6, 0x81C6,
+ 0xC9EC, 0x81C7, 0xCBC5, 0x81C8, 0xCBC6, 0xD9A4,
+ 0x81C9, 0x81CA, 0x81CB, 0x81CC, 0x81CD, 0xB5E8,
+ 0x81CE, 0x81CF, 0xB5AB, 0x81D0, 0x81D1, 0x81D2,
+ 0x81D3, 0x81D4, 0x81D5, 0xCEBB, 0xB5CD, 0xD7A1,
+ 0xD7F4, 0xD3D3, 0x81D6, 0xCCE5, 0x81D7, 0xBACE,
+ 0x81D8, 0xD9A2, 0xD9DC, 0xD3E0, 0xD8FD, 0xB7F0,
+ 0xD7F7, 0xD8FE, 0xD8FA, 0xD9A1, 0xC4E3, 0x81D9,
+ 0x81DA, 0xD3B6, 0xD8F4, 0xD9DD, 0x81DB, 0xD8FB,
+ 0x81DC, 0xC5E5, 0x81DD, 0x81DE, 0xC0D0, 0x81DF,
+ 0x81E0, 0xD1F0, 0xB0DB, 0x81E1, 0x81E2, 0xBCD1,
+ 0xD9A6, 0x81E3, 0xD9A5, 0x81E4, 0x81E5, 0x81E6,
+ 0x81E7, 0xD9AC, 0xD9AE, 0x81E8, 0xD9AB, 0xCAB9,
+ 0x81E9, 0x81EA, 0x81EB, 0xD9A9, 0xD6B6, 0x81EC,
+ 0x81ED, 0x81EE, 0xB3DE, 0xD9A8, 0x81EF, 0xC0FD,
+ 0x81F0, 0xCACC, 0x81F1, 0xD9AA, 0x81F2, 0xD9A7,
+ 0x81F3, 0x81F4, 0xD9B0, 0x81F5, 0x81F6, 0xB6B1,
+ 0x81F7, 0x81F8, 0x81F9, 0xB9A9, 0x81FA, 0xD2C0,
+ 0x81FB, 0x81FC, 0xCFC0, 0x81FD, 0x81FE, 0xC2C2,
+ 0x8240, 0xBDC4, 0xD5EC, 0xB2E0, 0xC7C8, 0xBFEB,
+ 0xD9AD, 0x8241, 0xD9AF, 0x8242, 0xCEEA, 0xBAEE,
+ 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0xC7D6,
+ 0x8248, 0x8249, 0x824A, 0x824B, 0x824C, 0x824D,
+ 0x824E, 0x824F, 0x8250, 0xB1E3, 0x8251, 0x8252,
+ 0x8253, 0xB4D9, 0xB6ED, 0xD9B4, 0x8254, 0x8255,
+ 0x8256, 0x8257, 0xBFA1, 0x8258, 0x8259, 0x825A,
+ 0xD9DE, 0xC7CE, 0xC0FE, 0xD9B8, 0x825B, 0x825C,
+ 0x825D, 0x825E, 0x825F, 0xCBD7, 0xB7FD, 0x8260,
+ 0xD9B5, 0x8261, 0xD9B7, 0xB1A3, 0xD3E1, 0xD9B9,
+ 0x8262, 0xD0C5, 0x8263, 0xD9B6, 0x8264, 0x8265,
+ 0xD9B1, 0x8266, 0xD9B2, 0xC1A9, 0xD9B3, 0x8267,
+ 0x8268, 0xBCF3, 0xD0DE, 0xB8A9, 0x8269, 0xBEE3,
+ 0x826A, 0xD9BD, 0x826B, 0x826C, 0x826D, 0x826E,
+ 0xD9BA, 0x826F, 0xB0B3, 0x8270, 0x8271, 0x8272,
+ 0xD9C2, 0x8273, 0x8274, 0x8275, 0x8276, 0x8277,
+ 0x8278, 0x8279, 0x827A, 0x827B, 0x827C, 0x827D,
+ 0x827E, 0x8280, 0xD9C4, 0xB1B6, 0x8281, 0xD9BF,
+ 0x8282, 0x8283, 0xB5B9, 0x8284, 0xBEF3, 0x8285,
+ 0x8286, 0x8287, 0xCCC8, 0xBAF2, 0xD2D0, 0x8288,
+ 0xD9C3, 0x8289, 0x828A, 0xBDE8, 0x828B, 0xB3AB,
+ 0x828C, 0x828D, 0x828E, 0xD9C5, 0xBEEB, 0x828F,
+ 0xD9C6, 0xD9BB, 0xC4DF, 0x8290, 0xD9BE, 0xD9C1,
+ 0xD9C0, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295,
+ 0x8296, 0x8297, 0x8298, 0x8299, 0x829A, 0x829B,
+ 0xD5AE, 0x829C, 0xD6B5, 0x829D, 0xC7E3, 0x829E,
+ 0x829F, 0x82A0, 0x82A1, 0xD9C8, 0x82A2, 0x82A3,
+ 0x82A4, 0xBCD9, 0xD9CA, 0x82A5, 0x82A6, 0x82A7,
+ 0xD9BC, 0x82A8, 0xD9CB, 0xC6AB, 0x82A9, 0x82AA,
+ 0x82AB, 0x82AC, 0x82AD, 0xD9C9, 0x82AE, 0x82AF,
+ 0x82B0, 0x82B1, 0xD7F6, 0x82B2, 0xCDA3, 0x82B3,
+ 0x82B4, 0x82B5, 0x82B6, 0x82B7, 0x82B8, 0x82B9,
+ 0x82BA, 0xBDA1, 0x82BB, 0x82BC, 0x82BD, 0x82BE,
+ 0x82BF, 0x82C0, 0xD9CC, 0x82C1, 0x82C2, 0x82C3,
+ 0x82C4, 0x82C5, 0x82C6, 0x82C7, 0x82C8, 0x82C9,
+ 0xC5BC, 0xCDB5, 0x82CA, 0x82CB, 0x82CC, 0xD9CD,
+ 0x82CD, 0x82CE, 0xD9C7, 0xB3A5, 0xBFFE, 0x82CF,
+ 0x82D0, 0x82D1, 0x82D2, 0xB8B5, 0x82D3, 0x82D4,
+ 0xC0FC, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0xB0F8,
+ 0x82D9, 0x82DA, 0x82DB, 0x82DC, 0x82DD, 0x82DE,
+ 0x82DF, 0x82E0, 0x82E1, 0x82E2, 0x82E3, 0x82E4,
+ 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA,
+ 0x82EB, 0x82EC, 0x82ED, 0xB4F6, 0x82EE, 0xD9CE,
+ 0x82EF, 0xD9CF, 0xB4A2, 0xD9D0, 0x82F0, 0x82F1,
+ 0xB4DF, 0x82F2, 0x82F3, 0x82F4, 0x82F5, 0x82F6,
+ 0xB0C1, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB,
+ 0x82FC, 0x82FD, 0xD9D1, 0xC9B5, 0x82FE, 0x8340,
+ 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346,
+ 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C,
+ 0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0xCFF1,
+ 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357,
+ 0xD9D2, 0x8358, 0x8359, 0x835A, 0xC1C5, 0x835B,
+ 0x835C, 0x835D, 0x835E, 0x835F, 0x8360, 0x8361,
+ 0x8362, 0x8363, 0x8364, 0x8365, 0xD9D6, 0xC9AE,
+ 0x8366, 0x8367, 0x8368, 0x8369, 0xD9D5, 0xD9D4,
+ 0xD9D7, 0x836A, 0x836B, 0x836C, 0x836D, 0xCBDB,
+ 0x836E, 0xBDA9, 0x836F, 0x8370, 0x8371, 0x8372,
+ 0x8373, 0xC6A7, 0x8374, 0x8375, 0x8376, 0x8377,
+ 0x8378, 0x8379, 0x837A, 0x837B, 0x837C, 0x837D,
+ 0xD9D3, 0xD9D8, 0x837E, 0x8380, 0x8381, 0xD9D9,
+ 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387,
+ 0xC8E5, 0x8388, 0x8389, 0x838A, 0x838B, 0x838C,
+ 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392,
+ 0x8393, 0x8394, 0x8395, 0xC0DC, 0x8396, 0x8397,
+ 0x8398, 0x8399, 0x839A, 0x839B, 0x839C, 0x839D,
+ 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3,
+ 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8, 0x83A9,
+ 0x83AA, 0x83AB, 0x83AC, 0x83AD, 0x83AE, 0x83AF,
+ 0x83B0, 0x83B1, 0x83B2, 0xB6F9, 0xD8A3, 0xD4CA,
+ 0x83B3, 0xD4AA, 0xD0D6, 0xB3E4, 0xD5D7, 0x83B4,
+ 0xCFC8, 0xB9E2, 0x83B5, 0xBFCB, 0x83B6, 0xC3E2,
+ 0x83B7, 0x83B8, 0x83B9, 0xB6D2, 0x83BA, 0x83BB,
+ 0xCDC3, 0xD9EE, 0xD9F0, 0x83BC, 0x83BD, 0x83BE,
+ 0xB5B3, 0x83BF, 0xB6B5, 0x83C0, 0x83C1, 0x83C2,
+ 0x83C3, 0x83C4, 0xBEA4, 0x83C5, 0x83C6, 0xC8EB,
+ 0x83C7, 0x83C8, 0xC8AB, 0x83C9, 0x83CA, 0xB0CB,
+ 0xB9AB, 0xC1F9, 0xD9E2, 0x83CB, 0xC0BC, 0xB9B2,
+ 0x83CC, 0xB9D8, 0xD0CB, 0xB1F8, 0xC6E4, 0xBEDF,
+ 0xB5E4, 0xD7C8, 0x83CD, 0xD1F8, 0xBCE6, 0xCADE,
+ 0x83CE, 0x83CF, 0xBCBD, 0xD9E6, 0xD8E7, 0x83D0,
+ 0x83D1, 0xC4DA, 0x83D2, 0x83D3, 0xB8D4, 0xC8BD,
+ 0x83D4, 0x83D5, 0xB2E1, 0xD4D9, 0x83D6, 0x83D7,
+ 0x83D8, 0x83D9, 0xC3B0, 0x83DA, 0x83DB, 0xC3E1,
+ 0xDAA2, 0xC8DF, 0x83DC, 0xD0B4, 0x83DD, 0xBEFC,
+ 0xC5A9, 0x83DE, 0x83DF, 0x83E0, 0xB9DA, 0x83E1,
+ 0xDAA3, 0x83E2, 0xD4A9, 0xDAA4, 0x83E3, 0x83E4,
+ 0x83E5, 0x83E6, 0x83E7, 0xD9FB, 0xB6AC, 0x83E8,
+ 0x83E9, 0xB7EB, 0xB1F9, 0xD9FC, 0xB3E5, 0xBEF6,
+ 0x83EA, 0xBFF6, 0xD2B1, 0xC0E4, 0x83EB, 0x83EC,
+ 0x83ED, 0xB6B3, 0xD9FE, 0xD9FD, 0x83EE, 0x83EF,
+ 0xBEBB, 0x83F0, 0x83F1, 0x83F2, 0xC6E0, 0x83F3,
+ 0xD7BC, 0xDAA1, 0x83F4, 0xC1B9, 0x83F5, 0xB5F2,
+ 0xC1E8, 0x83F6, 0x83F7, 0xBCF5, 0x83F8, 0xB4D5,
+ 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE,
+ 0x8440, 0x8441, 0x8442, 0xC1DD, 0x8443, 0xC4FD,
+ 0x8444, 0x8445, 0xBCB8, 0xB7B2, 0x8446, 0x8447,
+ 0xB7EF, 0x8448, 0x8449, 0x844A, 0x844B, 0x844C,
+ 0x844D, 0xD9EC, 0x844E, 0xC6BE, 0x844F, 0xBFAD,
+ 0xBBCB, 0x8450, 0x8451, 0xB5CA, 0x8452, 0xDBC9,
+ 0xD0D7, 0x8453, 0xCDB9, 0xB0BC, 0xB3F6, 0xBBF7,
+ 0xDBCA, 0xBAAF, 0x8454, 0xD4E4, 0xB5B6, 0xB5F3,
+ 0xD8D6, 0xC8D0, 0x8455, 0x8456, 0xB7D6, 0xC7D0,
+ 0xD8D7, 0x8457, 0xBFAF, 0x8458, 0x8459, 0xDBBB,
+ 0xD8D8, 0x845A, 0x845B, 0xD0CC, 0xBBAE, 0x845C,
+ 0x845D, 0x845E, 0xEBBE, 0xC1D0, 0xC1F5, 0xD4F2,
+ 0xB8D5, 0xB4B4, 0x845F, 0xB3F5, 0x8460, 0x8461,
+ 0xC9BE, 0x8462, 0x8463, 0x8464, 0xC5D0, 0x8465,
+ 0x8466, 0x8467, 0xC5D9, 0xC0FB, 0x8468, 0xB1F0,
+ 0x8469, 0xD8D9, 0xB9CE, 0x846A, 0xB5BD, 0x846B,
+ 0x846C, 0xD8DA, 0x846D, 0x846E, 0xD6C6, 0xCBA2,
+ 0xC8AF, 0xC9B2, 0xB4CC, 0xBFCC, 0x846F, 0xB9F4,
+ 0x8470, 0xD8DB, 0xD8DC, 0xB6E7, 0xBCC1, 0xCCEA,
+ 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476,
+ 0xCFF7, 0x8477, 0xD8DD, 0xC7B0, 0x8478, 0x8479,
+ 0xB9D0, 0xBDA3, 0x847A, 0x847B, 0xCCDE, 0x847C,
+ 0xC6CA, 0x847D, 0x847E, 0x8480, 0x8481, 0x8482,
+ 0xD8E0, 0x8483, 0xD8DE, 0x8484, 0x8485, 0xD8DF,
+ 0x8486, 0x8487, 0x8488, 0xB0FE, 0x8489, 0xBEE7,
+ 0x848A, 0xCAA3, 0xBCF4, 0x848B, 0x848C, 0x848D,
+ 0x848E, 0xB8B1, 0x848F, 0x8490, 0xB8EE, 0x8491,
+ 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497,
+ 0x8498, 0x8499, 0x849A, 0xD8E2, 0x849B, 0xBDCB,
+ 0x849C, 0xD8E4, 0xD8E3, 0x849D, 0x849E, 0x849F,
+ 0x84A0, 0x84A1, 0xC5FC, 0x84A2, 0x84A3, 0x84A4,
+ 0x84A5, 0x84A6, 0x84A7, 0x84A8, 0xD8E5, 0x84A9,
+ 0x84AA, 0xD8E6, 0x84AB, 0x84AC, 0x84AD, 0x84AE,
+ 0x84AF, 0x84B0, 0x84B1, 0xC1A6, 0x84B2, 0xC8B0,
+ 0xB0EC, 0xB9A6, 0xBCD3, 0xCEF1, 0xDBBD, 0xC1D3,
+ 0x84B3, 0x84B4, 0x84B5, 0x84B6, 0xB6AF, 0xD6FA,
+ 0xC5AC, 0xBDD9, 0xDBBE, 0xDBBF, 0x84B7, 0x84B8,
+ 0x84B9, 0xC0F8, 0xBEA2, 0xC0CD, 0x84BA, 0x84BB,
+ 0x84BC, 0x84BD, 0x84BE, 0x84BF, 0x84C0, 0x84C1,
+ 0x84C2, 0x84C3, 0xDBC0, 0xCAC6, 0x84C4, 0x84C5,
+ 0x84C6, 0xB2AA, 0x84C7, 0x84C8, 0x84C9, 0xD3C2,
+ 0x84CA, 0xC3E3, 0x84CB, 0xD1AB, 0x84CC, 0x84CD,
+ 0x84CE, 0x84CF, 0xDBC2, 0x84D0, 0xC0D5, 0x84D1,
+ 0x84D2, 0x84D3, 0xDBC3, 0x84D4, 0xBFB1, 0x84D5,
+ 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0xC4BC,
+ 0x84DB, 0x84DC, 0x84DD, 0x84DE, 0xC7DA, 0x84DF,
+ 0x84E0, 0x84E1, 0x84E2, 0x84E3, 0x84E4, 0x84E5,
+ 0x84E6, 0x84E7, 0x84E8, 0x84E9, 0xDBC4, 0x84EA,
+ 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x84F0,
+ 0x84F1, 0xD9E8, 0xC9D7, 0x84F2, 0x84F3, 0x84F4,
+ 0xB9B4, 0xCEF0, 0xD4C8, 0x84F5, 0x84F6, 0x84F7,
+ 0x84F8, 0xB0FC, 0xB4D2, 0x84F9, 0xD0D9, 0x84FA,
+ 0x84FB, 0x84FC, 0x84FD, 0xD9E9, 0x84FE, 0xDECB,
+ 0xD9EB, 0x8540, 0x8541, 0x8542, 0x8543, 0xD8B0,
+ 0xBBAF, 0xB1B1, 0x8544, 0xB3D7, 0xD8CE, 0x8545,
+ 0x8546, 0xD4D1, 0x8547, 0x8548, 0xBDB3, 0xBFEF,
+ 0x8549, 0xCFBB, 0x854A, 0x854B, 0xD8D0, 0x854C,
+ 0x854D, 0x854E, 0xB7CB, 0x854F, 0x8550, 0x8551,
+ 0xD8D1, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556,
+ 0x8557, 0x8558, 0x8559, 0x855A, 0x855B, 0xC6A5,
+ 0xC7F8, 0xD2BD, 0x855C, 0x855D, 0xD8D2, 0xC4E4,
+ 0x855E, 0xCAAE, 0x855F, 0xC7A7, 0x8560, 0xD8A6,
+ 0x8561, 0xC9FD, 0xCEE7, 0xBBDC, 0xB0EB, 0x8562,
+ 0x8563, 0x8564, 0xBBAA, 0xD0AD, 0x8565, 0xB1B0,
+ 0xD7E4, 0xD7BF, 0x8566, 0xB5A5, 0xC2F4, 0xC4CF,
+ 0x8567, 0x8568, 0xB2A9, 0x8569, 0xB2B7, 0x856A,
+ 0xB1E5, 0xDFB2, 0xD5BC, 0xBFA8, 0xC2AC, 0xD8D5,
+ 0xC2B1, 0x856B, 0xD8D4, 0xCED4, 0x856C, 0xDAE0,
+ 0x856D, 0xCEC0, 0x856E, 0x856F, 0xD8B4, 0xC3AE,
+ 0xD3A1, 0xCEA3, 0x8570, 0xBCB4, 0xC8B4, 0xC2D1,
+ 0x8571, 0xBEED, 0xD0B6, 0x8572, 0xDAE1, 0x8573,
+ 0x8574, 0x8575, 0x8576, 0xC7E4, 0x8577, 0x8578,
+ 0xB3A7, 0x8579, 0xB6F2, 0xCCFC, 0xC0FA, 0x857A,
+ 0x857B, 0xC0F7, 0x857C, 0xD1B9, 0xD1E1, 0xD8C7,
+ 0x857D, 0x857E, 0x8580, 0x8581, 0x8582, 0x8583,
+ 0x8584, 0xB2DE, 0x8585, 0x8586, 0xC0E5, 0x8587,
+ 0xBAF1, 0x8588, 0x8589, 0xD8C8, 0x858A, 0xD4AD,
+ 0x858B, 0x858C, 0xCFE1, 0xD8C9, 0x858D, 0xD8CA,
+ 0xCFC3, 0x858E, 0xB3F8, 0xBEC7, 0x858F, 0x8590,
+ 0x8591, 0x8592, 0xD8CB, 0x8593, 0x8594, 0x8595,
+ 0x8596, 0x8597, 0x8598, 0x8599, 0xDBCC, 0x859A,
+ 0x859B, 0x859C, 0x859D, 0xC8A5, 0x859E, 0x859F,
+ 0x85A0, 0xCFD8, 0x85A1, 0xC8FE, 0xB2CE, 0x85A2,
+ 0x85A3, 0x85A4, 0x85A5, 0x85A6, 0xD3D6, 0xB2E6,
+ 0xBCB0, 0xD3D1, 0xCBAB, 0xB7B4, 0x85A7, 0x85A8,
+ 0x85A9, 0xB7A2, 0x85AA, 0x85AB, 0xCAE5, 0x85AC,
+ 0xC8A1, 0xCADC, 0xB1E4, 0xD0F0, 0x85AD, 0xC5D1,
+ 0x85AE, 0x85AF, 0x85B0, 0xDBC5, 0xB5FE, 0x85B1,
+ 0x85B2, 0xBFDA, 0xB9C5, 0xBEE4, 0xC1ED, 0x85B3,
+ 0xDFB6, 0xDFB5, 0xD6BB, 0xBDD0, 0xD5D9, 0xB0C8,
+ 0xB6A3, 0xBFC9, 0xCCA8, 0xDFB3, 0xCAB7, 0xD3D2,
+ 0x85B4, 0xD8CF, 0xD2B6, 0xBAC5, 0xCBBE, 0xCCBE,
+ 0x85B5, 0xDFB7, 0xB5F0, 0xDFB4, 0x85B6, 0x85B7,
+ 0x85B8, 0xD3F5, 0x85B9, 0xB3D4, 0xB8F7, 0x85BA,
+ 0xDFBA, 0x85BB, 0xBACF, 0xBCAA, 0xB5F5, 0x85BC,
+ 0xCDAC, 0xC3FB, 0xBAF3, 0xC0F4, 0xCDC2, 0xCFF2,
+ 0xDFB8, 0xCFC5, 0x85BD, 0xC2C0, 0xDFB9, 0xC2F0,
+ 0x85BE, 0x85BF, 0x85C0, 0xBEFD, 0x85C1, 0xC1DF,
+ 0xCDCC, 0xD2F7, 0xB7CD, 0xDFC1, 0x85C2, 0xDFC4,
+ 0x85C3, 0x85C4, 0xB7F1, 0xB0C9, 0xB6D6, 0xB7D4,
+ 0x85C5, 0xBAAC, 0xCCFD, 0xBFD4, 0xCBB1, 0xC6F4,
+ 0x85C6, 0xD6A8, 0xDFC5, 0x85C7, 0xCEE2, 0xB3B3,
+ 0x85C8, 0x85C9, 0xCEFC, 0xB4B5, 0x85CA, 0xCEC7,
+ 0xBAF0, 0x85CB, 0xCEE1, 0x85CC, 0xD1BD, 0x85CD,
+ 0x85CE, 0xDFC0, 0x85CF, 0x85D0, 0xB4F4, 0x85D1,
+ 0xB3CA, 0x85D2, 0xB8E6, 0xDFBB, 0x85D3, 0x85D4,
+ 0x85D5, 0x85D6, 0xC4C5, 0x85D7, 0xDFBC, 0xDFBD,
+ 0xDFBE, 0xC5BB, 0xDFBF, 0xDFC2, 0xD4B1, 0xDFC3,
+ 0x85D8, 0xC7BA, 0xCED8, 0x85D9, 0x85DA, 0x85DB,
+ 0x85DC, 0x85DD, 0xC4D8, 0x85DE, 0xDFCA, 0x85DF,
+ 0xDFCF, 0x85E0, 0xD6DC, 0x85E1, 0x85E2, 0x85E3,
+ 0x85E4, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0xDFC9,
+ 0xDFDA, 0xCEB6, 0x85E9, 0xBAC7, 0xDFCE, 0xDFC8,
+ 0xC5DE, 0x85EA, 0x85EB, 0xC9EB, 0xBAF4, 0xC3FC,
+ 0x85EC, 0x85ED, 0xBED7, 0x85EE, 0xDFC6, 0x85EF,
+ 0xDFCD, 0x85F0, 0xC5D8, 0x85F1, 0x85F2, 0x85F3,
+ 0x85F4, 0xD5A6, 0xBACD, 0x85F5, 0xBECC, 0xD3BD,
+ 0xB8C0, 0x85F6, 0xD6E4, 0x85F7, 0xDFC7, 0xB9BE,
+ 0xBFA7, 0x85F8, 0x85F9, 0xC1FC, 0xDFCB, 0xDFCC,
+ 0x85FA, 0xDFD0, 0x85FB, 0x85FC, 0x85FD, 0x85FE,
+ 0x8640, 0xDFDB, 0xDFE5, 0x8641, 0xDFD7, 0xDFD6,
+ 0xD7C9, 0xDFE3, 0xDFE4, 0xE5EB, 0xD2A7, 0xDFD2,
+ 0x8642, 0xBFA9, 0x8643, 0xD4DB, 0x8644, 0xBFC8,
+ 0xDFD4, 0x8645, 0x8646, 0x8647, 0xCFCC, 0x8648,
+ 0x8649, 0xDFDD, 0x864A, 0xD1CA, 0x864B, 0xDFDE,
+ 0xB0A7, 0xC6B7, 0xDFD3, 0x864C, 0xBAE5, 0x864D,
+ 0xB6DF, 0xCDDB, 0xB9FE, 0xD4D5, 0x864E, 0x864F,
+ 0xDFDF, 0xCFEC, 0xB0A5, 0xDFE7, 0xDFD1, 0xD1C6,
+ 0xDFD5, 0xDFD8, 0xDFD9, 0xDFDC, 0x8650, 0xBBA9,
+ 0x8651, 0xDFE0, 0xDFE1, 0x8652, 0xDFE2, 0xDFE6,
+ 0xDFE8, 0xD3B4, 0x8653, 0x8654, 0x8655, 0x8656,
+ 0x8657, 0xB8E7, 0xC5B6, 0xDFEA, 0xC9DA, 0xC1A8,
+ 0xC4C4, 0x8658, 0x8659, 0xBFDE, 0xCFF8, 0x865A,
+ 0x865B, 0x865C, 0xD5DC, 0xDFEE, 0x865D, 0x865E,
+ 0x865F, 0x8660, 0x8661, 0x8662, 0xB2B8, 0x8663,
+ 0xBADF, 0xDFEC, 0x8664, 0xDBC1, 0x8665, 0xD1E4,
+ 0x8666, 0x8667, 0x8668, 0x8669, 0xCBF4, 0xB4BD,
+ 0x866A, 0xB0A6, 0x866B, 0x866C, 0x866D, 0x866E,
+ 0x866F, 0xDFF1, 0xCCC6, 0xDFF2, 0x8670, 0x8671,
+ 0xDFED, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676,
+ 0x8677, 0xDFE9, 0x8678, 0x8679, 0x867A, 0x867B,
+ 0xDFEB, 0x867C, 0xDFEF, 0xDFF0, 0xBBBD, 0x867D,
+ 0x867E, 0xDFF3, 0x8680, 0x8681, 0xDFF4, 0x8682,
+ 0xBBA3, 0x8683, 0xCADB, 0xCEA8, 0xE0A7, 0xB3AA,
+ 0x8684, 0xE0A6, 0x8685, 0x8686, 0x8687, 0xE0A1,
+ 0x8688, 0x8689, 0x868A, 0x868B, 0xDFFE, 0x868C,
+ 0xCDD9, 0xDFFC, 0x868D, 0xDFFA, 0x868E, 0xBFD0,
+ 0xD7C4, 0x868F, 0xC9CC, 0x8690, 0x8691, 0xDFF8,
+ 0xB0A1, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696,
+ 0xDFFD, 0x8697, 0x8698, 0x8699, 0x869A, 0xDFFB,
+ 0xE0A2, 0x869B, 0x869C, 0x869D, 0x869E, 0x869F,
+ 0xE0A8, 0x86A0, 0x86A1, 0x86A2, 0x86A3, 0xB7C8,
+ 0x86A4, 0x86A5, 0xC6A1, 0xC9B6, 0xC0B2, 0xDFF5,
+ 0x86A6, 0x86A7, 0xC5BE, 0x86A8, 0xD8C4, 0xDFF9,
+ 0xC4F6, 0x86A9, 0x86AA, 0x86AB, 0x86AC, 0x86AD,
+ 0x86AE, 0xE0A3, 0xE0A4, 0xE0A5, 0xD0A5, 0x86AF,
+ 0x86B0, 0xE0B4, 0xCCE4, 0x86B1, 0xE0B1, 0x86B2,
+ 0xBFA6, 0xE0AF, 0xCEB9, 0xE0AB, 0xC9C6, 0x86B3,
+ 0x86B4, 0xC0AE, 0xE0AE, 0xBAED, 0xBAB0, 0xE0A9,
+ 0x86B5, 0x86B6, 0x86B7, 0xDFF6, 0x86B8, 0xE0B3,
+ 0x86B9, 0x86BA, 0xE0B8, 0x86BB, 0x86BC, 0x86BD,
+ 0xB4AD, 0xE0B9, 0x86BE, 0x86BF, 0xCFB2, 0xBAC8,
+ 0x86C0, 0xE0B0, 0x86C1, 0x86C2, 0x86C3, 0x86C4,
+ 0x86C5, 0x86C6, 0x86C7, 0xD0FA, 0x86C8, 0x86C9,
+ 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF,
+ 0x86D0, 0xE0AC, 0x86D1, 0xD4FB, 0x86D2, 0xDFF7,
+ 0x86D3, 0xC5E7, 0x86D4, 0xE0AD, 0x86D5, 0xD3F7,
+ 0x86D6, 0xE0B6, 0xE0B7, 0x86D7, 0x86D8, 0x86D9,
+ 0x86DA, 0x86DB, 0xE0C4, 0xD0E1, 0x86DC, 0x86DD,
+ 0x86DE, 0xE0BC, 0x86DF, 0x86E0, 0xE0C9, 0xE0CA,
+ 0x86E1, 0x86E2, 0x86E3, 0xE0BE, 0xE0AA, 0xC9A4,
+ 0xE0C1, 0x86E4, 0xE0B2, 0x86E5, 0x86E6, 0x86E7,
+ 0x86E8, 0x86E9, 0xCAC8, 0xE0C3, 0x86EA, 0xE0B5,
+ 0x86EB, 0xCECB, 0x86EC, 0xCBC3, 0xE0CD, 0xE0C6,
+ 0xE0C2, 0x86ED, 0xE0CB, 0x86EE, 0xE0BA, 0xE0BF,
+ 0xE0C0, 0x86EF, 0x86F0, 0xE0C5, 0x86F1, 0x86F2,
+ 0xE0C7, 0xE0C8, 0x86F3, 0xE0CC, 0x86F4, 0xE0BB,
+ 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0xCBD4,
+ 0xE0D5, 0x86FA, 0xE0D6, 0xE0D2, 0x86FB, 0x86FC,
+ 0x86FD, 0x86FE, 0x8740, 0x8741, 0xE0D0, 0xBCCE,
+ 0x8742, 0x8743, 0xE0D1, 0x8744, 0xB8C2, 0xD8C5,
+ 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A,
+ 0x874B, 0x874C, 0xD0EA, 0x874D, 0x874E, 0xC2EF,
+ 0x874F, 0x8750, 0xE0CF, 0xE0BD, 0x8751, 0x8752,
+ 0x8753, 0xE0D4, 0xE0D3, 0x8754, 0x8755, 0xE0D7,
+ 0x8756, 0x8757, 0x8758, 0x8759, 0xE0DC, 0xE0D8,
+ 0x875A, 0x875B, 0x875C, 0xD6F6, 0xB3B0, 0x875D,
+ 0xD7EC, 0x875E, 0xCBBB, 0x875F, 0x8760, 0xE0DA,
+ 0x8761, 0xCEFB, 0x8762, 0x8763, 0x8764, 0xBAD9,
+ 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A,
+ 0x876B, 0x876C, 0x876D, 0x876E, 0x876F, 0x8770,
+ 0xE0E1, 0xE0DD, 0xD2AD, 0x8771, 0x8772, 0x8773,
+ 0x8774, 0x8775, 0xE0E2, 0x8776, 0x8777, 0xE0DB,
+ 0xE0D9, 0xE0DF, 0x8778, 0x8779, 0xE0E0, 0x877A,
+ 0x877B, 0x877C, 0x877D, 0x877E, 0xE0DE, 0x8780,
+ 0xE0E4, 0x8781, 0x8782, 0x8783, 0xC6F7, 0xD8AC,
+ 0xD4EB, 0xE0E6, 0xCAC9, 0x8784, 0x8785, 0x8786,
+ 0x8787, 0xE0E5, 0x8788, 0x8789, 0x878A, 0x878B,
+ 0xB8C1, 0x878C, 0x878D, 0x878E, 0x878F, 0xE0E7,
+ 0xE0E8, 0x8790, 0x8791, 0x8792, 0x8793, 0x8794,
+ 0x8795, 0x8796, 0x8797, 0xE0E9, 0xE0E3, 0x8798,
+ 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, 0x879E,
+ 0xBABF, 0xCCE7, 0x879F, 0x87A0, 0x87A1, 0xE0EA,
+ 0x87A2, 0x87A3, 0x87A4, 0x87A5, 0x87A6, 0x87A7,
+ 0x87A8, 0x87A9, 0x87AA, 0x87AB, 0x87AC, 0x87AD,
+ 0x87AE, 0x87AF, 0x87B0, 0xCFF9, 0x87B1, 0x87B2,
+ 0x87B3, 0x87B4, 0x87B5, 0x87B6, 0x87B7, 0x87B8,
+ 0x87B9, 0x87BA, 0x87BB, 0xE0EB, 0x87BC, 0x87BD,
+ 0x87BE, 0x87BF, 0x87C0, 0x87C1, 0x87C2, 0xC8C2,
+ 0x87C3, 0x87C4, 0x87C5, 0x87C6, 0xBDC0, 0x87C7,
+ 0x87C8, 0x87C9, 0x87CA, 0x87CB, 0x87CC, 0x87CD,
+ 0x87CE, 0x87CF, 0x87D0, 0x87D1, 0x87D2, 0x87D3,
+ 0xC4D2, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8,
+ 0x87D9, 0x87DA, 0x87DB, 0x87DC, 0xE0EC, 0x87DD,
+ 0x87DE, 0xE0ED, 0x87DF, 0x87E0, 0xC7F4, 0xCBC4,
+ 0x87E1, 0xE0EE, 0xBBD8, 0xD8B6, 0xD2F2, 0xE0EF,
+ 0xCDC5, 0x87E2, 0xB6DA, 0x87E3, 0x87E4, 0x87E5,
+ 0x87E6, 0x87E7, 0x87E8, 0xE0F1, 0x87E9, 0xD4B0,
+ 0x87EA, 0x87EB, 0xC0A7, 0xB4D1, 0x87EC, 0x87ED,
+ 0xCEA7, 0xE0F0, 0x87EE, 0x87EF, 0x87F0, 0xE0F2,
+ 0xB9CC, 0x87F1, 0x87F2, 0xB9FA, 0xCDBC, 0xE0F3,
+ 0x87F3, 0x87F4, 0x87F5, 0xC6D4, 0xE0F4, 0x87F6,
+ 0xD4B2, 0x87F7, 0xC8A6, 0xE0F6, 0xE0F5, 0x87F8,
+ 0x87F9, 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FE,
+ 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845,
+ 0x8846, 0x8847, 0x8848, 0x8849, 0xE0F7, 0x884A,
+ 0x884B, 0xCDC1, 0x884C, 0x884D, 0x884E, 0xCAA5,
+ 0x884F, 0x8850, 0x8851, 0x8852, 0xD4DA, 0xDBD7,
+ 0xDBD9, 0x8853, 0xDBD8, 0xB9E7, 0xDBDC, 0xDBDD,
+ 0xB5D8, 0x8854, 0x8855, 0xDBDA, 0x8856, 0x8857,
+ 0x8858, 0x8859, 0x885A, 0xDBDB, 0xB3A1, 0xDBDF,
+ 0x885B, 0x885C, 0xBBF8, 0x885D, 0xD6B7, 0x885E,
+ 0xDBE0, 0x885F, 0x8860, 0x8861, 0x8862, 0xBEF9,
+ 0x8863, 0x8864, 0xB7BB, 0x8865, 0xDBD0, 0xCCAE,
+ 0xBFB2, 0xBBB5, 0xD7F8, 0xBFD3, 0x8866, 0x8867,
+ 0x8868, 0x8869, 0x886A, 0xBFE9, 0x886B, 0x886C,
+ 0xBCE1, 0xCCB3, 0xDBDE, 0xB0D3, 0xCEEB, 0xB7D8,
+ 0xD7B9, 0xC6C2, 0x886D, 0x886E, 0xC0A4, 0x886F,
+ 0xCCB9, 0x8870, 0xDBE7, 0xDBE1, 0xC6BA, 0xDBE3,
+ 0x8871, 0xDBE8, 0x8872, 0xC5F7, 0x8873, 0x8874,
+ 0x8875, 0xDBEA, 0x8876, 0x8877, 0xDBE9, 0xBFC0,
+ 0x8878, 0x8879, 0x887A, 0xDBE6, 0xDBE5, 0x887B,
+ 0x887C, 0x887D, 0x887E, 0x8880, 0xB4B9, 0xC0AC,
+ 0xC2A2, 0xDBE2, 0xDBE4, 0x8881, 0x8882, 0x8883,
+ 0x8884, 0xD0CD, 0xDBED, 0x8885, 0x8886, 0x8887,
+ 0x8888, 0x8889, 0xC0DD, 0xDBF2, 0x888A, 0x888B,
+ 0x888C, 0x888D, 0x888E, 0x888F, 0x8890, 0xB6E2,
+ 0x8891, 0x8892, 0x8893, 0x8894, 0xDBF3, 0xDBD2,
+ 0xB9B8, 0xD4AB, 0xDBEC, 0x8895, 0xBFD1, 0xDBF0,
+ 0x8896, 0xDBD1, 0x8897, 0xB5E6, 0x8898, 0xDBEB,
+ 0xBFE5, 0x8899, 0x889A, 0x889B, 0xDBEE, 0x889C,
+ 0xDBF1, 0x889D, 0x889E, 0x889F, 0xDBF9, 0x88A0,
+ 0x88A1, 0x88A2, 0x88A3, 0x88A4, 0x88A5, 0x88A6,
+ 0x88A7, 0x88A8, 0xB9A1, 0xB0A3, 0x88A9, 0x88AA,
+ 0x88AB, 0x88AC, 0x88AD, 0x88AE, 0x88AF, 0xC2F1,
+ 0x88B0, 0x88B1, 0xB3C7, 0xDBEF, 0x88B2, 0x88B3,
+ 0xDBF8, 0x88B4, 0xC6D2, 0xDBF4, 0x88B5, 0x88B6,
+ 0xDBF5, 0xDBF7, 0xDBF6, 0x88B7, 0x88B8, 0xDBFE,
+ 0x88B9, 0xD3F2, 0xB2BA, 0x88BA, 0x88BB, 0x88BC,
+ 0xDBFD, 0x88BD, 0x88BE, 0x88BF, 0x88C0, 0x88C1,
+ 0x88C2, 0x88C3, 0x88C4, 0xDCA4, 0x88C5, 0xDBFB,
+ 0x88C6, 0x88C7, 0x88C8, 0x88C9, 0xDBFA, 0x88CA,
+ 0x88CB, 0x88CC, 0xDBFC, 0xC5E0, 0xBBF9, 0x88CD,
+ 0x88CE, 0xDCA3, 0x88CF, 0x88D0, 0xDCA5, 0x88D1,
+ 0xCCC3, 0x88D2, 0x88D3, 0x88D4, 0xB6D1, 0xDDC0,
+ 0x88D5, 0x88D6, 0x88D7, 0xDCA1, 0x88D8, 0xDCA2,
+ 0x88D9, 0x88DA, 0x88DB, 0xC7B5, 0x88DC, 0x88DD,
+ 0x88DE, 0xB6E9, 0x88DF, 0x88E0, 0x88E1, 0xDCA7,
+ 0x88E2, 0x88E3, 0x88E4, 0x88E5, 0xDCA6, 0x88E6,
+ 0xDCA9, 0xB1A4, 0x88E7, 0x88E8, 0xB5CC, 0x88E9,
+ 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0xBFB0, 0x88EE,
+ 0x88EF, 0x88F0, 0x88F1, 0x88F2, 0xD1DF, 0x88F3,
+ 0x88F4, 0x88F5, 0x88F6, 0xB6C2, 0x88F7, 0x88F8,
+ 0x88F9, 0x88FA, 0x88FB, 0x88FC, 0x88FD, 0x88FE,
+ 0x8940, 0x8941, 0x8942, 0x8943, 0x8944, 0x8945,
+ 0xDCA8, 0x8946, 0x8947, 0x8948, 0x8949, 0x894A,
+ 0x894B, 0x894C, 0xCBFA, 0xEBF3, 0x894D, 0x894E,
+ 0x894F, 0xCBDC, 0x8950, 0x8951, 0xCBFE, 0x8952,
+ 0x8953, 0x8954, 0xCCC1, 0x8955, 0x8956, 0x8957,
+ 0x8958, 0x8959, 0xC8FB, 0x895A, 0x895B, 0x895C,
+ 0x895D, 0x895E, 0x895F, 0xDCAA, 0x8960, 0x8961,
+ 0x8962, 0x8963, 0x8964, 0xCCEE, 0xDCAB, 0x8965,
+ 0x8966, 0x8967, 0x8968, 0x8969, 0x896A, 0x896B,
+ 0x896C, 0x896D, 0x896E, 0x896F, 0x8970, 0x8971,
+ 0x8972, 0x8973, 0x8974, 0x8975, 0xDBD3, 0x8976,
+ 0xDCAF, 0xDCAC, 0x8977, 0xBEB3, 0x8978, 0xCAFB,
+ 0x8979, 0x897A, 0x897B, 0xDCAD, 0x897C, 0x897D,
+ 0x897E, 0x8980, 0x8981, 0x8982, 0x8983, 0x8984,
+ 0xC9CA, 0xC4B9, 0x8985, 0x8986, 0x8987, 0x8988,
+ 0x8989, 0xC7BD, 0xDCAE, 0x898A, 0x898B, 0x898C,
+ 0xD4F6, 0xD0E6, 0x898D, 0x898E, 0x898F, 0x8990,
+ 0x8991, 0x8992, 0x8993, 0x8994, 0xC4AB, 0xB6D5,
+ 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899A,
+ 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0,
+ 0x89A1, 0x89A2, 0x89A3, 0x89A4, 0x89A5, 0x89A6,
+ 0xDBD4, 0x89A7, 0x89A8, 0x89A9, 0x89AA, 0xB1DA,
+ 0x89AB, 0x89AC, 0x89AD, 0xDBD5, 0x89AE, 0x89AF,
+ 0x89B0, 0x89B1, 0x89B2, 0x89B3, 0x89B4, 0x89B5,
+ 0x89B6, 0x89B7, 0x89B8, 0xDBD6, 0x89B9, 0x89BA,
+ 0x89BB, 0xBABE, 0x89BC, 0x89BD, 0x89BE, 0x89BF,
+ 0x89C0, 0x89C1, 0x89C2, 0x89C3, 0x89C4, 0x89C5,
+ 0x89C6, 0x89C7, 0x89C8, 0x89C9, 0xC8C0, 0x89CA,
+ 0x89CB, 0x89CC, 0x89CD, 0x89CE, 0x89CF, 0xCABF,
+ 0xC8C9, 0x89D0, 0xD7B3, 0x89D1, 0xC9F9, 0x89D2,
+ 0x89D3, 0xBFC7, 0x89D4, 0x89D5, 0xBAF8, 0x89D6,
+ 0x89D7, 0xD2BC, 0x89D8, 0x89D9, 0x89DA, 0x89DB,
+ 0x89DC, 0x89DD, 0x89DE, 0x89DF, 0xE2BA, 0x89E0,
+ 0xB4A6, 0x89E1, 0x89E2, 0xB1B8, 0x89E3, 0x89E4,
+ 0x89E5, 0x89E6, 0x89E7, 0xB8B4, 0x89E8, 0xCFC4,
+ 0x89E9, 0x89EA, 0x89EB, 0x89EC, 0xD9E7, 0xCFA6,
+ 0xCDE2, 0x89ED, 0x89EE, 0xD9ED, 0xB6E0, 0x89EF,
+ 0xD2B9, 0x89F0, 0x89F1, 0xB9BB, 0x89F2, 0x89F3,
+ 0x89F4, 0x89F5, 0xE2B9, 0xE2B7, 0x89F6, 0xB4F3,
+ 0x89F7, 0xCCEC, 0xCCAB, 0xB7F2, 0x89F8, 0xD8B2,
+ 0xD1EB, 0xBABB, 0x89F9, 0xCAA7, 0x89FA, 0x89FB,
+ 0xCDB7, 0x89FC, 0x89FD, 0xD2C4, 0xBFE4, 0xBCD0,
+ 0xB6E1, 0x89FE, 0xDEC5, 0x8A40, 0x8A41, 0x8A42,
+ 0x8A43, 0xDEC6, 0xDBBC, 0x8A44, 0xD1D9, 0x8A45,
+ 0x8A46, 0xC6E6, 0xC4CE, 0xB7EE, 0x8A47, 0xB7DC,
+ 0x8A48, 0x8A49, 0xBFFC, 0xD7E0, 0x8A4A, 0xC6F5,
+ 0x8A4B, 0x8A4C, 0xB1BC, 0xDEC8, 0xBDB1, 0xCCD7,
+ 0xDECA, 0x8A4D, 0xDEC9, 0x8A4E, 0x8A4F, 0x8A50,
+ 0x8A51, 0x8A52, 0xB5EC, 0x8A53, 0xC9DD, 0x8A54,
+ 0x8A55, 0xB0C2, 0x8A56, 0x8A57, 0x8A58, 0x8A59,
+ 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, 0x8A5F,
+ 0x8A60, 0x8A61, 0x8A62, 0xC5AE, 0xC5AB, 0x8A63,
+ 0xC4CC, 0x8A64, 0xBCE9, 0xCBFD, 0x8A65, 0x8A66,
+ 0x8A67, 0xBAC3, 0x8A68, 0x8A69, 0x8A6A, 0xE5F9,
+ 0xC8E7, 0xE5FA, 0xCDFD, 0x8A6B, 0xD7B1, 0xB8BE,
+ 0xC2E8, 0x8A6C, 0xC8D1, 0x8A6D, 0x8A6E, 0xE5FB,
+ 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0xB6CA, 0xBCCB,
+ 0x8A73, 0x8A74, 0xD1FD, 0xE6A1, 0x8A75, 0xC3EE,
+ 0x8A76, 0x8A77, 0x8A78, 0x8A79, 0xE6A4, 0x8A7A,
+ 0x8A7B, 0x8A7C, 0x8A7D, 0xE5FE, 0xE6A5, 0xCDD7,
+ 0x8A7E, 0x8A80, 0xB7C1, 0xE5FC, 0xE5FD, 0xE6A3,
+ 0x8A81, 0x8A82, 0xC4DD, 0xE6A8, 0x8A83, 0x8A84,
+ 0xE6A7, 0x8A85, 0x8A86, 0x8A87, 0x8A88, 0x8A89,
+ 0x8A8A, 0xC3C3, 0x8A8B, 0xC6DE, 0x8A8C, 0x8A8D,
+ 0xE6AA, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92,
+ 0x8A93, 0x8A94, 0xC4B7, 0x8A95, 0x8A96, 0x8A97,
+ 0xE6A2, 0xCABC, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B,
+ 0xBDE3, 0xB9C3, 0xE6A6, 0xD0D5, 0xCEAF, 0x8A9C,
+ 0x8A9D, 0xE6A9, 0xE6B0, 0x8A9E, 0xD2A6, 0x8A9F,
+ 0xBDAA, 0xE6AD, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3,
+ 0x8AA4, 0xE6AF, 0x8AA5, 0xC0D1, 0x8AA6, 0x8AA7,
+ 0xD2CC, 0x8AA8, 0x8AA9, 0x8AAA, 0xBCA7, 0x8AAB,
+ 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1,
+ 0x8AB2, 0x8AB3, 0x8AB4, 0x8AB5, 0x8AB6, 0xE6B1,
+ 0x8AB7, 0xD2F6, 0x8AB8, 0x8AB9, 0x8ABA, 0xD7CB,
+ 0x8ABB, 0xCDFE, 0x8ABC, 0xCDDE, 0xC2A6, 0xE6AB,
+ 0xE6AC, 0xBDBF, 0xE6AE, 0xE6B3, 0x8ABD, 0x8ABE,
+ 0xE6B2, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, 0xE6B6,
+ 0x8AC3, 0xE6B8, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7,
+ 0xC4EF, 0x8AC8, 0x8AC9, 0x8ACA, 0xC4C8, 0x8ACB,
+ 0x8ACC, 0xBEEA, 0xC9EF, 0x8ACD, 0x8ACE, 0xE6B7,
+ 0x8ACF, 0xB6F0, 0x8AD0, 0x8AD1, 0x8AD2, 0xC3E4,
+ 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8,
+ 0x8AD9, 0xD3E9, 0xE6B4, 0x8ADA, 0xE6B5, 0x8ADB,
+ 0xC8A2, 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0,
+ 0xE6BD, 0x8AE1, 0x8AE2, 0x8AE3, 0xE6B9, 0x8AE4,
+ 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0xC6C5, 0x8AE9,
+ 0x8AEA, 0xCDF1, 0xE6BB, 0x8AEB, 0x8AEC, 0x8AED,
+ 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3,
+ 0x8AF4, 0xE6BC, 0x8AF5, 0x8AF6, 0x8AF7, 0x8AF8,
+ 0xBBE9, 0x8AF9, 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD,
+ 0x8AFE, 0x8B40, 0xE6BE, 0x8B41, 0x8B42, 0x8B43,
+ 0x8B44, 0xE6BA, 0x8B45, 0x8B46, 0xC0B7, 0x8B47,
+ 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D,
+ 0x8B4E, 0x8B4F, 0xD3A4, 0xE6BF, 0xC9F4, 0xE6C3,
+ 0x8B50, 0x8B51, 0xE6C4, 0x8B52, 0x8B53, 0x8B54,
+ 0x8B55, 0xD0F6, 0x8B56, 0x8B57, 0x8B58, 0x8B59,
+ 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, 0x8B5E, 0x8B5F,
+ 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65,
+ 0x8B66, 0x8B67, 0xC3BD, 0x8B68, 0x8B69, 0x8B6A,
+ 0x8B6B, 0x8B6C, 0x8B6D, 0x8B6E, 0xC3C4, 0xE6C2,
+ 0x8B6F, 0x8B70, 0x8B71, 0x8B72, 0x8B73, 0x8B74,
+ 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, 0x8B7A,
+ 0x8B7B, 0x8B7C, 0xE6C1, 0x8B7D, 0x8B7E, 0x8B80,
+ 0x8B81, 0x8B82, 0x8B83, 0x8B84, 0xE6C7, 0xCFB1,
+ 0x8B85, 0xEBF4, 0x8B86, 0x8B87, 0xE6CA, 0x8B88,
+ 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0xE6C5, 0x8B8D,
+ 0x8B8E, 0xBCDE, 0xC9A9, 0x8B8F, 0x8B90, 0x8B91,
+ 0x8B92, 0x8B93, 0x8B94, 0xBCB5, 0x8B95, 0x8B96,
+ 0xCFD3, 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B,
+ 0xE6C8, 0x8B9C, 0xE6C9, 0x8B9D, 0xE6CE, 0x8B9E,
+ 0xE6D0, 0x8B9F, 0x8BA0, 0x8BA1, 0xE6D1, 0x8BA2,
+ 0x8BA3, 0x8BA4, 0xE6CB, 0xB5D5, 0x8BA5, 0xE6CC,
+ 0x8BA6, 0x8BA7, 0xE6CF, 0x8BA8, 0x8BA9, 0xC4DB,
+ 0x8BAA, 0xE6C6, 0x8BAB, 0x8BAC, 0x8BAD, 0x8BAE,
+ 0x8BAF, 0xE6CD, 0x8BB0, 0x8BB1, 0x8BB2, 0x8BB3,
+ 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x8BB8, 0x8BB9,
+ 0x8BBA, 0x8BBB, 0x8BBC, 0x8BBD, 0x8BBE, 0x8BBF,
+ 0x8BC0, 0x8BC1, 0x8BC2, 0x8BC3, 0x8BC4, 0x8BC5,
+ 0x8BC6, 0xE6D2, 0x8BC7, 0x8BC8, 0x8BC9, 0x8BCA,
+ 0x8BCB, 0x8BCC, 0x8BCD, 0x8BCE, 0x8BCF, 0x8BD0,
+ 0x8BD1, 0x8BD2, 0xE6D4, 0xE6D3, 0x8BD3, 0x8BD4,
+ 0x8BD5, 0x8BD6, 0x8BD7, 0x8BD8, 0x8BD9, 0x8BDA,
+ 0x8BDB, 0x8BDC, 0x8BDD, 0x8BDE, 0x8BDF, 0x8BE0,
+ 0x8BE1, 0x8BE2, 0x8BE3, 0x8BE4, 0x8BE5, 0x8BE6,
+ 0x8BE7, 0x8BE8, 0x8BE9, 0x8BEA, 0x8BEB, 0x8BEC,
+ 0xE6D5, 0x8BED, 0xD9F8, 0x8BEE, 0x8BEF, 0xE6D6,
+ 0x8BF0, 0x8BF1, 0x8BF2, 0x8BF3, 0x8BF4, 0x8BF5,
+ 0x8BF6, 0x8BF7, 0xE6D7, 0x8BF8, 0x8BF9, 0x8BFA,
+ 0x8BFB, 0x8BFC, 0x8BFD, 0x8BFE, 0x8C40, 0x8C41,
+ 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C46, 0x8C47,
+ 0xD7D3, 0xE6DD, 0x8C48, 0xE6DE, 0xBFD7, 0xD4D0,
+ 0x8C49, 0xD7D6, 0xB4E6, 0xCBEF, 0xE6DA, 0xD8C3,
+ 0xD7CE, 0xD0A2, 0x8C4A, 0xC3CF, 0x8C4B, 0x8C4C,
+ 0xE6DF, 0xBCBE, 0xB9C2, 0xE6DB, 0xD1A7, 0x8C4D,
+ 0x8C4E, 0xBAA2, 0xC2CF, 0x8C4F, 0xD8AB, 0x8C50,
+ 0x8C51, 0x8C52, 0xCAEB, 0xE5EE, 0x8C53, 0xE6DC,
+ 0x8C54, 0xB7F5, 0x8C55, 0x8C56, 0x8C57, 0x8C58,
+ 0xC8E6, 0x8C59, 0x8C5A, 0xC4F5, 0x8C5B, 0x8C5C,
+ 0xE5B2, 0xC4FE, 0x8C5D, 0xCBFC, 0xE5B3, 0xD5AC,
+ 0x8C5E, 0xD3EE, 0xCAD8, 0xB0B2, 0x8C5F, 0xCBCE,
+ 0xCDEA, 0x8C60, 0x8C61, 0xBAEA, 0x8C62, 0x8C63,
+ 0x8C64, 0xE5B5, 0x8C65, 0xE5B4, 0x8C66, 0xD7DA,
+ 0xB9D9, 0xD6E6, 0xB6A8, 0xCDF0, 0xD2CB, 0xB1A6,
+ 0xCAB5, 0x8C67, 0xB3E8, 0xC9F3, 0xBFCD, 0xD0FB,
+ 0xCAD2, 0xE5B6, 0xBBC2, 0x8C68, 0x8C69, 0x8C6A,
+ 0xCFDC, 0xB9AC, 0x8C6B, 0x8C6C, 0x8C6D, 0x8C6E,
+ 0xD4D7, 0x8C6F, 0x8C70, 0xBAA6, 0xD1E7, 0xCFFC,
+ 0xBCD2, 0x8C71, 0xE5B7, 0xC8DD, 0x8C72, 0x8C73,
+ 0x8C74, 0xBFED, 0xB1F6, 0xCBDE, 0x8C75, 0x8C76,
+ 0xBCC5, 0x8C77, 0xBCC4, 0xD2FA, 0xC3DC, 0xBFDC,
+ 0x8C78, 0x8C79, 0x8C7A, 0x8C7B, 0xB8BB, 0x8C7C,
+ 0x8C7D, 0x8C7E, 0xC3C2, 0x8C80, 0xBAAE, 0xD4A2,
+ 0x8C81, 0x8C82, 0x8C83, 0x8C84, 0x8C85, 0x8C86,
+ 0x8C87, 0x8C88, 0x8C89, 0xC7DE, 0xC4AF, 0xB2EC,
+ 0x8C8A, 0xB9D1, 0x8C8B, 0x8C8C, 0xE5BB, 0xC1C8,
+ 0x8C8D, 0x8C8E, 0xD5AF, 0x8C8F, 0x8C90, 0x8C91,
+ 0x8C92, 0x8C93, 0xE5BC, 0x8C94, 0xE5BE, 0x8C95,
+ 0x8C96, 0x8C97, 0x8C98, 0x8C99, 0x8C9A, 0x8C9B,
+ 0xB4E7, 0xB6D4, 0xCBC2, 0xD1B0, 0xB5BC, 0x8C9C,
+ 0x8C9D, 0xCAD9, 0x8C9E, 0xB7E2, 0x8C9F, 0x8CA0,
+ 0xC9E4, 0x8CA1, 0xBDAB, 0x8CA2, 0x8CA3, 0xCEBE,
+ 0xD7F0, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, 0xD0A1,
+ 0x8CA8, 0xC9D9, 0x8CA9, 0x8CAA, 0xB6FB, 0xE6D8,
+ 0xBCE2, 0x8CAB, 0xB3BE, 0x8CAC, 0xC9D0, 0x8CAD,
+ 0xE6D9, 0xB3A2, 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1,
+ 0xDECC, 0x8CB2, 0xD3C8, 0xDECD, 0x8CB3, 0xD2A2,
+ 0x8CB4, 0x8CB5, 0x8CB6, 0x8CB7, 0xDECE, 0x8CB8,
+ 0x8CB9, 0x8CBA, 0x8CBB, 0xBECD, 0x8CBC, 0x8CBD,
+ 0xDECF, 0x8CBE, 0x8CBF, 0x8CC0, 0xCAAC, 0xD2FC,
+ 0xB3DF, 0xE5EA, 0xC4E1, 0xBEA1, 0xCEB2, 0xC4F2,
+ 0xBED6, 0xC6A8, 0xB2E3, 0x8CC1, 0x8CC2, 0xBED3,
+ 0x8CC3, 0x8CC4, 0xC7FC, 0xCCEB, 0xBDEC, 0xCEDD,
+ 0x8CC5, 0x8CC6, 0xCABA, 0xC6C1, 0xE5EC, 0xD0BC,
+ 0x8CC7, 0x8CC8, 0x8CC9, 0xD5B9, 0x8CCA, 0x8CCB,
+ 0x8CCC, 0xE5ED, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0,
+ 0xCAF4, 0x8CD1, 0xCDC0, 0xC2C5, 0x8CD2, 0xE5EF,
+ 0x8CD3, 0xC2C4, 0xE5F0, 0x8CD4, 0x8CD5, 0x8CD6,
+ 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0xE5F8, 0xCDCD,
+ 0x8CDB, 0xC9BD, 0x8CDC, 0x8CDD, 0x8CDE, 0x8CDF,
+ 0x8CE0, 0x8CE1, 0x8CE2, 0xD2D9, 0xE1A8, 0x8CE3,
+ 0x8CE4, 0x8CE5, 0x8CE6, 0xD3EC, 0x8CE7, 0xCBEA,
+ 0xC6F1, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC,
+ 0xE1AC, 0x8CED, 0x8CEE, 0x8CEF, 0xE1A7, 0xE1A9,
+ 0x8CF0, 0x8CF1, 0xE1AA, 0xE1AF, 0x8CF2, 0x8CF3,
+ 0xB2ED, 0x8CF4, 0xE1AB, 0xB8DA, 0xE1AD, 0xE1AE,
+ 0xE1B0, 0xB5BA, 0xE1B1, 0x8CF5, 0x8CF6, 0x8CF7,
+ 0x8CF8, 0x8CF9, 0xE1B3, 0xE1B8, 0x8CFA, 0x8CFB,
+ 0x8CFC, 0x8CFD, 0x8CFE, 0xD1D2, 0x8D40, 0xE1B6,
+ 0xE1B5, 0xC1EB, 0x8D41, 0x8D42, 0x8D43, 0xE1B7,
+ 0x8D44, 0xD4C0, 0x8D45, 0xE1B2, 0x8D46, 0xE1BA,
+ 0xB0B6, 0x8D47, 0x8D48, 0x8D49, 0x8D4A, 0xE1B4,
+ 0x8D4B, 0xBFF9, 0x8D4C, 0xE1B9, 0x8D4D, 0x8D4E,
+ 0xE1BB, 0x8D4F, 0x8D50, 0x8D51, 0x8D52, 0x8D53,
+ 0x8D54, 0xE1BE, 0x8D55, 0x8D56, 0x8D57, 0x8D58,
+ 0x8D59, 0x8D5A, 0xE1BC, 0x8D5B, 0x8D5C, 0x8D5D,
+ 0x8D5E, 0x8D5F, 0x8D60, 0xD6C5, 0x8D61, 0x8D62,
+ 0x8D63, 0x8D64, 0x8D65, 0x8D66, 0x8D67, 0xCFBF,
+ 0x8D68, 0x8D69, 0xE1BD, 0xE1BF, 0xC2CD, 0x8D6A,
+ 0xB6EB, 0x8D6B, 0xD3F8, 0x8D6C, 0x8D6D, 0xC7CD,
+ 0x8D6E, 0x8D6F, 0xB7E5, 0x8D70, 0x8D71, 0x8D72,
+ 0x8D73, 0x8D74, 0x8D75, 0x8D76, 0x8D77, 0x8D78,
+ 0x8D79, 0xBEFE, 0x8D7A, 0x8D7B, 0x8D7C, 0x8D7D,
+ 0x8D7E, 0x8D80, 0xE1C0, 0xE1C1, 0x8D81, 0x8D82,
+ 0xE1C7, 0xB3E7, 0x8D83, 0x8D84, 0x8D85, 0x8D86,
+ 0x8D87, 0x8D88, 0xC6E9, 0x8D89, 0x8D8A, 0x8D8B,
+ 0x8D8C, 0x8D8D, 0xB4DE, 0x8D8E, 0xD1C2, 0x8D8F,
+ 0x8D90, 0x8D91, 0x8D92, 0xE1C8, 0x8D93, 0x8D94,
+ 0xE1C6, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99,
+ 0xE1C5, 0x8D9A, 0xE1C3, 0xE1C2, 0x8D9B, 0xB1C0,
+ 0x8D9C, 0x8D9D, 0x8D9E, 0xD5B8, 0xE1C4, 0x8D9F,
+ 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0xE1CB, 0x8DA4,
+ 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA,
+ 0x8DAB, 0xE1CC, 0xE1CA, 0x8DAC, 0x8DAD, 0x8DAE,
+ 0x8DAF, 0x8DB0, 0x8DB1, 0x8DB2, 0x8DB3, 0xEFFA,
+ 0x8DB4, 0x8DB5, 0xE1D3, 0xE1D2, 0xC7B6, 0x8DB6,
+ 0x8DB7, 0x8DB8, 0x8DB9, 0x8DBA, 0x8DBB, 0x8DBC,
+ 0x8DBD, 0x8DBE, 0x8DBF, 0x8DC0, 0xE1C9, 0x8DC1,
+ 0x8DC2, 0xE1CE, 0x8DC3, 0xE1D0, 0x8DC4, 0x8DC5,
+ 0x8DC6, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCB,
+ 0x8DCC, 0x8DCD, 0x8DCE, 0xE1D4, 0x8DCF, 0xE1D1,
+ 0xE1CD, 0x8DD0, 0x8DD1, 0xE1CF, 0x8DD2, 0x8DD3,
+ 0x8DD4, 0x8DD5, 0xE1D5, 0x8DD6, 0x8DD7, 0x8DD8,
+ 0x8DD9, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x8DDE,
+ 0x8DDF, 0x8DE0, 0x8DE1, 0x8DE2, 0xE1D6, 0x8DE3,
+ 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE8, 0x8DE9,
+ 0x8DEA, 0x8DEB, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF,
+ 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF3, 0x8DF4, 0x8DF5,
+ 0x8DF6, 0x8DF7, 0x8DF8, 0xE1D7, 0x8DF9, 0x8DFA,
+ 0x8DFB, 0xE1D8, 0x8DFC, 0x8DFD, 0x8DFE, 0x8E40,
+ 0x8E41, 0x8E42, 0x8E43, 0x8E44, 0x8E45, 0x8E46,
+ 0x8E47, 0x8E48, 0x8E49, 0x8E4A, 0x8E4B, 0x8E4C,
+ 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E51, 0x8E52,
+ 0x8E53, 0x8E54, 0x8E55, 0xE1DA, 0x8E56, 0x8E57,
+ 0x8E58, 0x8E59, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D,
+ 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0xE1DB,
+ 0x8E63, 0x8E64, 0x8E65, 0x8E66, 0x8E67, 0x8E68,
+ 0x8E69, 0xCEA1, 0x8E6A, 0x8E6B, 0x8E6C, 0x8E6D,
+ 0x8E6E, 0x8E6F, 0x8E70, 0x8E71, 0x8E72, 0x8E73,
+ 0x8E74, 0x8E75, 0x8E76, 0xE7DD, 0x8E77, 0xB4A8,
+ 0xD6DD, 0x8E78, 0x8E79, 0xD1B2, 0xB3B2, 0x8E7A,
+ 0x8E7B, 0xB9A4, 0xD7F3, 0xC7C9, 0xBEDE, 0xB9AE,
+ 0x8E7C, 0xCED7, 0x8E7D, 0x8E7E, 0xB2EE, 0xDBCF,
+ 0x8E80, 0xBCBA, 0xD2D1, 0xCBC8, 0xB0CD, 0x8E81,
+ 0x8E82, 0xCFEF, 0x8E83, 0x8E84, 0x8E85, 0x8E86,
+ 0x8E87, 0xD9E3, 0xBDED, 0x8E88, 0x8E89, 0xB1D2,
+ 0xCAD0, 0xB2BC, 0x8E8A, 0xCBA7, 0xB7AB, 0x8E8B,
+ 0xCAA6, 0x8E8C, 0x8E8D, 0x8E8E, 0xCFA3, 0x8E8F,
+ 0x8E90, 0xE0F8, 0xD5CA, 0xE0FB, 0x8E91, 0x8E92,
+ 0xE0FA, 0xC5C1, 0xCCFB, 0x8E93, 0xC1B1, 0xE0F9,
+ 0xD6E3, 0xB2AF, 0xD6C4, 0xB5DB, 0x8E94, 0x8E95,
+ 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B,
+ 0xB4F8, 0xD6A1, 0x8E9C, 0x8E9D, 0x8E9E, 0x8E9F,
+ 0x8EA0, 0xCFAF, 0xB0EF, 0x8EA1, 0x8EA2, 0xE0FC,
+ 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, 0x8EA7, 0xE1A1,
+ 0xB3A3, 0x8EA8, 0x8EA9, 0xE0FD, 0xE0FE, 0xC3B1,
+ 0x8EAA, 0x8EAB, 0x8EAC, 0x8EAD, 0xC3DD, 0x8EAE,
+ 0xE1A2, 0xB7F9, 0x8EAF, 0x8EB0, 0x8EB1, 0x8EB2,
+ 0x8EB3, 0x8EB4, 0xBBCF, 0x8EB5, 0x8EB6, 0x8EB7,
+ 0x8EB8, 0x8EB9, 0x8EBA, 0x8EBB, 0xE1A3, 0xC4BB,
+ 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0xE1A4,
+ 0x8EC1, 0x8EC2, 0xE1A5, 0x8EC3, 0x8EC4, 0xE1A6,
+ 0xB4B1, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9,
+ 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECE, 0x8ECF,
+ 0x8ED0, 0x8ED1, 0x8ED2, 0x8ED3, 0xB8C9, 0xC6BD,
+ 0xC4EA, 0x8ED4, 0xB2A2, 0x8ED5, 0xD0D2, 0x8ED6,
+ 0xE7DB, 0xBBC3, 0xD3D7, 0xD3C4, 0x8ED7, 0xB9E3,
+ 0xE2CF, 0x8ED8, 0x8ED9, 0x8EDA, 0xD7AF, 0x8EDB,
+ 0xC7EC, 0xB1D3, 0x8EDC, 0x8EDD, 0xB4B2, 0xE2D1,
+ 0x8EDE, 0x8EDF, 0x8EE0, 0xD0F2, 0xC2AE, 0xE2D0,
+ 0x8EE1, 0xBFE2, 0xD3A6, 0xB5D7, 0xE2D2, 0xB5EA,
+ 0x8EE2, 0xC3ED, 0xB8FD, 0x8EE3, 0xB8AE, 0x8EE4,
+ 0xC5D3, 0xB7CF, 0xE2D4, 0x8EE5, 0x8EE6, 0x8EE7,
+ 0x8EE8, 0xE2D3, 0xB6C8, 0xD7F9, 0x8EE9, 0x8EEA,
+ 0x8EEB, 0x8EEC, 0x8EED, 0xCDA5, 0x8EEE, 0x8EEF,
+ 0x8EF0, 0x8EF1, 0x8EF2, 0xE2D8, 0x8EF3, 0xE2D6,
+ 0xCAFC, 0xBFB5, 0xD3B9, 0xE2D5, 0x8EF4, 0x8EF5,
+ 0x8EF6, 0x8EF7, 0xE2D7, 0x8EF8, 0x8EF9, 0x8EFA,
+ 0x8EFB, 0x8EFC, 0x8EFD, 0x8EFE, 0x8F40, 0x8F41,
+ 0x8F42, 0xC1AE, 0xC0C8, 0x8F43, 0x8F44, 0x8F45,
+ 0x8F46, 0x8F47, 0x8F48, 0xE2DB, 0xE2DA, 0xC0AA,
+ 0x8F49, 0x8F4A, 0xC1CE, 0x8F4B, 0x8F4C, 0x8F4D,
+ 0x8F4E, 0xE2DC, 0x8F4F, 0x8F50, 0x8F51, 0x8F52,
+ 0x8F53, 0x8F54, 0x8F55, 0x8F56, 0x8F57, 0x8F58,
+ 0x8F59, 0x8F5A, 0xE2DD, 0x8F5B, 0xE2DE, 0x8F5C,
+ 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, 0x8F61, 0x8F62,
+ 0x8F63, 0x8F64, 0xDBC8, 0x8F65, 0xD1D3, 0xCDA2,
+ 0x8F66, 0x8F67, 0xBDA8, 0x8F68, 0x8F69, 0x8F6A,
+ 0xDEC3, 0xD8A5, 0xBFAA, 0xDBCD, 0xD2EC, 0xC6FA,
+ 0xC5AA, 0x8F6B, 0x8F6C, 0x8F6D, 0xDEC4, 0x8F6E,
+ 0xB1D7, 0xDFAE, 0x8F6F, 0x8F70, 0x8F71, 0xCABD,
+ 0x8F72, 0xDFB1, 0x8F73, 0xB9AD, 0x8F74, 0xD2FD,
+ 0x8F75, 0xB8A5, 0xBAEB, 0x8F76, 0x8F77, 0xB3DA,
+ 0x8F78, 0x8F79, 0x8F7A, 0xB5DC, 0xD5C5, 0x8F7B,
+ 0x8F7C, 0x8F7D, 0x8F7E, 0xC3D6, 0xCFD2, 0xBBA1,
+ 0x8F80, 0xE5F3, 0xE5F2, 0x8F81, 0x8F82, 0xE5F4,
+ 0x8F83, 0xCDE4, 0x8F84, 0xC8F5, 0x8F85, 0x8F86,
+ 0x8F87, 0x8F88, 0x8F89, 0x8F8A, 0x8F8B, 0xB5AF,
+ 0xC7BF, 0x8F8C, 0xE5F6, 0x8F8D, 0x8F8E, 0x8F8F,
+ 0xECB0, 0x8F90, 0x8F91, 0x8F92, 0x8F93, 0x8F94,
+ 0x8F95, 0x8F96, 0x8F97, 0x8F98, 0x8F99, 0x8F9A,
+ 0x8F9B, 0x8F9C, 0x8F9D, 0x8F9E, 0xE5E6, 0x8F9F,
+ 0xB9E9, 0xB5B1, 0x8FA0, 0xC2BC, 0xE5E8, 0xE5E7,
+ 0xE5E9, 0x8FA1, 0x8FA2, 0x8FA3, 0x8FA4, 0xD2CD,
+ 0x8FA5, 0x8FA6, 0x8FA7, 0xE1EA, 0xD0CE, 0x8FA8,
+ 0xCDAE, 0x8FA9, 0xD1E5, 0x8FAA, 0x8FAB, 0xB2CA,
+ 0xB1EB, 0x8FAC, 0xB1F2, 0xC5ED, 0x8FAD, 0x8FAE,
+ 0xD5C3, 0xD3B0, 0x8FAF, 0xE1DC, 0x8FB0, 0x8FB1,
+ 0x8FB2, 0xE1DD, 0x8FB3, 0xD2DB, 0x8FB4, 0xB3B9,
+ 0xB1CB, 0x8FB5, 0x8FB6, 0x8FB7, 0xCDF9, 0xD5F7,
+ 0xE1DE, 0x8FB8, 0xBEB6, 0xB4FD, 0x8FB9, 0xE1DF,
+ 0xBADC, 0xE1E0, 0xBBB2, 0xC2C9, 0xE1E1, 0x8FBA,
+ 0x8FBB, 0x8FBC, 0xD0EC, 0x8FBD, 0xCDBD, 0x8FBE,
+ 0x8FBF, 0xE1E2, 0x8FC0, 0xB5C3, 0xC5C7, 0xE1E3,
+ 0x8FC1, 0x8FC2, 0xE1E4, 0x8FC3, 0x8FC4, 0x8FC5,
+ 0x8FC6, 0xD3F9, 0x8FC7, 0x8FC8, 0x8FC9, 0x8FCA,
+ 0x8FCB, 0x8FCC, 0xE1E5, 0x8FCD, 0xD1AD, 0x8FCE,
+ 0x8FCF, 0xE1E6, 0xCEA2, 0x8FD0, 0x8FD1, 0x8FD2,
+ 0x8FD3, 0x8FD4, 0x8FD5, 0xE1E7, 0x8FD6, 0xB5C2,
+ 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA, 0xE1E8, 0xBBD5,
+ 0x8FDB, 0x8FDC, 0x8FDD, 0x8FDE, 0x8FDF, 0xD0C4,
+ 0xE2E0, 0xB1D8, 0xD2E4, 0x8FE0, 0x8FE1, 0xE2E1,
+ 0x8FE2, 0x8FE3, 0xBCC9, 0xC8CC, 0x8FE4, 0xE2E3,
+ 0xECFE, 0xECFD, 0xDFAF, 0x8FE5, 0x8FE6, 0x8FE7,
+ 0xE2E2, 0xD6BE, 0xCDFC, 0xC3A6, 0x8FE8, 0x8FE9,
+ 0x8FEA, 0xE3C3, 0x8FEB, 0x8FEC, 0xD6D2, 0xE2E7,
+ 0x8FED, 0x8FEE, 0xE2E8, 0x8FEF, 0x8FF0, 0xD3C7,
+ 0x8FF1, 0x8FF2, 0xE2EC, 0xBFEC, 0x8FF3, 0xE2ED,
+ 0xE2E5, 0x8FF4, 0x8FF5, 0xB3C0, 0x8FF6, 0x8FF7,
+ 0x8FF8, 0xC4EE, 0x8FF9, 0x8FFA, 0xE2EE, 0x8FFB,
+ 0x8FFC, 0xD0C3, 0x8FFD, 0xBAF6, 0xE2E9, 0xB7DE,
+ 0xBBB3, 0xCCAC, 0xCBCB, 0xE2E4, 0xE2E6, 0xE2EA,
+ 0xE2EB, 0x8FFE, 0x9040, 0x9041, 0xE2F7, 0x9042,
+ 0x9043, 0xE2F4, 0xD4F5, 0xE2F3, 0x9044, 0x9045,
+ 0xC5AD, 0x9046, 0xD5FA, 0xC5C2, 0xB2C0, 0x9047,
+ 0x9048, 0xE2EF, 0x9049, 0xE2F2, 0xC1AF, 0xCBBC,
+ 0x904A, 0x904B, 0xB5A1, 0xE2F9, 0x904C, 0x904D,
+ 0x904E, 0xBCB1, 0xE2F1, 0xD0D4, 0xD4B9, 0xE2F5,
+ 0xB9D6, 0xE2F6, 0x904F, 0x9050, 0x9051, 0xC7D3,
+ 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0xE2F0,
+ 0x9057, 0x9058, 0x9059, 0x905A, 0x905B, 0xD7DC,
+ 0xEDA1, 0x905C, 0x905D, 0xE2F8, 0x905E, 0xEDA5,
+ 0xE2FE, 0xCAD1, 0x905F, 0x9060, 0x9061, 0x9062,
+ 0x9063, 0x9064, 0x9065, 0xC1B5, 0x9066, 0xBBD0,
+ 0x9067, 0x9068, 0xBFD6, 0x9069, 0xBAE3, 0x906A,
+ 0x906B, 0xCBA1, 0x906C, 0x906D, 0x906E, 0xEDA6,
+ 0xEDA3, 0x906F, 0x9070, 0xEDA2, 0x9071, 0x9072,
+ 0x9073, 0x9074, 0xBBD6, 0xEDA7, 0xD0F4, 0x9075,
+ 0x9076, 0xEDA4, 0xBADE, 0xB6F7, 0xE3A1, 0xB6B2,
+ 0xCCF1, 0xB9A7, 0x9077, 0xCFA2, 0xC7A1, 0x9078,
+ 0x9079, 0xBFD2, 0x907A, 0x907B, 0xB6F1, 0x907C,
+ 0xE2FA, 0xE2FB, 0xE2FD, 0xE2FC, 0xC4D5, 0xE3A2,
+ 0x907D, 0xD3C1, 0x907E, 0x9080, 0x9081, 0xE3A7,
+ 0xC7C4, 0x9082, 0x9083, 0x9084, 0x9085, 0xCFA4,
+ 0x9086, 0x9087, 0xE3A9, 0xBAB7, 0x9088, 0x9089,
+ 0x908A, 0x908B, 0xE3A8, 0x908C, 0xBBDA, 0x908D,
+ 0xE3A3, 0x908E, 0x908F, 0x9090, 0xE3A4, 0xE3AA,
+ 0x9091, 0xE3A6, 0x9092, 0xCEF2, 0xD3C6, 0x9093,
+ 0x9094, 0xBBBC, 0x9095, 0x9096, 0xD4C3, 0x9097,
+ 0xC4FA, 0x9098, 0x9099, 0xEDA8, 0xD0FC, 0xE3A5,
+ 0x909A, 0xC3F5, 0x909B, 0xE3AD, 0xB1AF, 0x909C,
+ 0xE3B2, 0x909D, 0x909E, 0x909F, 0xBCC2, 0x90A0,
+ 0x90A1, 0xE3AC, 0xB5BF, 0x90A2, 0x90A3, 0x90A4,
+ 0x90A5, 0x90A6, 0x90A7, 0x90A8, 0x90A9, 0xC7E9,
+ 0xE3B0, 0x90AA, 0x90AB, 0x90AC, 0xBEAA, 0xCDEF,
+ 0x90AD, 0x90AE, 0x90AF, 0x90B0, 0x90B1, 0xBBF3,
+ 0x90B2, 0x90B3, 0x90B4, 0xCCE8, 0x90B5, 0x90B6,
+ 0xE3AF, 0x90B7, 0xE3B1, 0x90B8, 0xCFA7, 0xE3AE,
+ 0x90B9, 0xCEA9, 0xBBDD, 0x90BA, 0x90BB, 0x90BC,
+ 0x90BD, 0x90BE, 0xB5EB, 0xBEE5, 0xB2D2, 0xB3CD,
+ 0x90BF, 0xB1B9, 0xE3AB, 0xB2D1, 0xB5AC, 0xB9DF,
+ 0xB6E8, 0x90C0, 0x90C1, 0xCFEB, 0xE3B7, 0x90C2,
+ 0xBBCC, 0x90C3, 0x90C4, 0xC8C7, 0xD0CA, 0x90C5,
+ 0x90C6, 0x90C7, 0x90C8, 0x90C9, 0xE3B8, 0xB3EE,
+ 0x90CA, 0x90CB, 0x90CC, 0x90CD, 0xEDA9, 0x90CE,
+ 0xD3FA, 0xD3E4, 0x90CF, 0x90D0, 0x90D1, 0xEDAA,
+ 0xE3B9, 0xD2E2, 0x90D2, 0x90D3, 0x90D4, 0x90D5,
+ 0x90D6, 0xE3B5, 0x90D7, 0x90D8, 0x90D9, 0x90DA,
+ 0xD3DE, 0x90DB, 0x90DC, 0x90DD, 0x90DE, 0xB8D0,
+ 0xE3B3, 0x90DF, 0x90E0, 0xE3B6, 0xB7DF, 0x90E1,
+ 0xE3B4, 0xC0A2, 0x90E2, 0x90E3, 0x90E4, 0xE3BA,
+ 0x90E5, 0x90E6, 0x90E7, 0x90E8, 0x90E9, 0x90EA,
+ 0x90EB, 0x90EC, 0x90ED, 0x90EE, 0x90EF, 0x90F0,
+ 0x90F1, 0x90F2, 0x90F3, 0x90F4, 0x90F5, 0x90F6,
+ 0x90F7, 0xD4B8, 0x90F8, 0x90F9, 0x90FA, 0x90FB,
+ 0x90FC, 0x90FD, 0x90FE, 0x9140, 0xB4C8, 0x9141,
+ 0xE3BB, 0x9142, 0xBBC5, 0x9143, 0xC9F7, 0x9144,
+ 0x9145, 0xC9E5, 0x9146, 0x9147, 0x9148, 0xC4BD,
+ 0x9149, 0x914A, 0x914B, 0x914C, 0x914D, 0x914E,
+ 0x914F, 0xEDAB, 0x9150, 0x9151, 0x9152, 0x9153,
+ 0xC2FD, 0x9154, 0x9155, 0x9156, 0x9157, 0xBBDB,
+ 0xBFAE, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C,
+ 0x915D, 0x915E, 0xCEBF, 0x915F, 0x9160, 0x9161,
+ 0x9162, 0xE3BC, 0x9163, 0xBFB6, 0x9164, 0x9165,
+ 0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B,
+ 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171,
+ 0x9172, 0x9173, 0x9174, 0x9175, 0x9176, 0xB1EF,
+ 0x9177, 0x9178, 0xD4F7, 0x9179, 0x917A, 0x917B,
+ 0x917C, 0x917D, 0xE3BE, 0x917E, 0x9180, 0x9181,
+ 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0xEDAD,
+ 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C,
+ 0x918D, 0x918E, 0x918F, 0xE3BF, 0xBAA9, 0xEDAC,
+ 0x9190, 0x9191, 0xE3BD, 0x9192, 0x9193, 0x9194,
+ 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919A,
+ 0x919B, 0xE3C0, 0x919C, 0x919D, 0x919E, 0x919F,
+ 0x91A0, 0x91A1, 0xBAB6, 0x91A2, 0x91A3, 0x91A4,
+ 0xB6AE, 0x91A5, 0x91A6, 0x91A7, 0x91A8, 0x91A9,
+ 0xD0B8, 0x91AA, 0xB0C3, 0xEDAE, 0x91AB, 0x91AC,
+ 0x91AD, 0x91AE, 0x91AF, 0xEDAF, 0xC0C1, 0x91B0,
+ 0xE3C1, 0x91B1, 0x91B2, 0x91B3, 0x91B4, 0x91B5,
+ 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB,
+ 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1,
+ 0xC5B3, 0x91C2, 0x91C3, 0x91C4, 0x91C5, 0x91C6,
+ 0x91C7, 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC,
+ 0x91CD, 0x91CE, 0x91CF, 0xE3C2, 0x91D0, 0x91D1,
+ 0x91D2, 0x91D3, 0x91D4, 0x91D5, 0x91D6, 0x91D7,
+ 0x91D8, 0xDCB2, 0x91D9, 0x91DA, 0x91DB, 0x91DC,
+ 0x91DD, 0x91DE, 0xEDB0, 0x91DF, 0xB8EA, 0x91E0,
+ 0xCEEC, 0xEAA7, 0xD0E7, 0xCAF9, 0xC8D6, 0xCFB7,
+ 0xB3C9, 0xCED2, 0xBDE4, 0x91E1, 0x91E2, 0xE3DE,
+ 0xBBF2, 0xEAA8, 0xD5BD, 0x91E3, 0xC6DD, 0xEAA9,
+ 0x91E4, 0x91E5, 0x91E6, 0xEAAA, 0x91E7, 0xEAAC,
+ 0xEAAB, 0x91E8, 0xEAAE, 0xEAAD, 0x91E9, 0x91EA,
+ 0x91EB, 0x91EC, 0xBDD8, 0x91ED, 0xEAAF, 0x91EE,
+ 0xC2BE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0xB4C1,
+ 0xB4F7, 0x91F3, 0x91F4, 0xBBA7, 0x91F5, 0x91F6,
+ 0x91F7, 0x91F8, 0x91F9, 0xECE6, 0xECE5, 0xB7BF,
+ 0xCBF9, 0xB1E2, 0x91FA, 0xECE7, 0x91FB, 0x91FC,
+ 0x91FD, 0xC9C8, 0xECE8, 0xECE9, 0x91FE, 0xCAD6,
+ 0xDED0, 0xB2C5, 0xD4FA, 0x9240, 0x9241, 0xC6CB,
+ 0xB0C7, 0xB4F2, 0xC8D3, 0x9242, 0x9243, 0x9244,
+ 0xCDD0, 0x9245, 0x9246, 0xBFB8, 0x9247, 0x9248,
+ 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0xBFDB,
+ 0x924E, 0x924F, 0xC7A4, 0xD6B4, 0x9250, 0xC0A9,
+ 0xDED1, 0xC9A8, 0xD1EF, 0xC5A4, 0xB0E7, 0xB3B6,
+ 0xC8C5, 0x9251, 0x9252, 0xB0E2, 0x9253, 0x9254,
+ 0xB7F6, 0x9255, 0x9256, 0xC5FA, 0x9257, 0x9258,
+ 0xB6F3, 0x9259, 0xD5D2, 0xB3D0, 0xBCBC, 0x925A,
+ 0x925B, 0x925C, 0xB3AD, 0x925D, 0x925E, 0x925F,
+ 0x9260, 0xBEF1, 0xB0D1, 0x9261, 0x9262, 0x9263,
+ 0x9264, 0x9265, 0x9266, 0xD2D6, 0xCAE3, 0xD7A5,
+ 0x9267, 0xCDB6, 0xB6B6, 0xBFB9, 0xD5DB, 0x9268,
+ 0xB8A7, 0xC5D7, 0x9269, 0x926A, 0x926B, 0xDED2,
+ 0xBFD9, 0xC2D5, 0xC7C0, 0x926C, 0xBBA4, 0xB1A8,
+ 0x926D, 0x926E, 0xC5EA, 0x926F, 0x9270, 0xC5FB,
+ 0xCCA7, 0x9271, 0x9272, 0x9273, 0x9274, 0xB1A7,
+ 0x9275, 0x9276, 0x9277, 0xB5D6, 0x9278, 0x9279,
+ 0x927A, 0xC4A8, 0x927B, 0xDED3, 0xD1BA, 0xB3E9,
+ 0x927C, 0xC3F2, 0x927D, 0x927E, 0xB7F7, 0x9280,
+ 0xD6F4, 0xB5A3, 0xB2F0, 0xC4B4, 0xC4E9, 0xC0AD,
+ 0xDED4, 0x9281, 0xB0E8, 0xC5C4, 0xC1E0, 0x9282,
+ 0xB9D5, 0x9283, 0xBEDC, 0xCDD8, 0xB0CE, 0x9284,
+ 0xCDCF, 0xDED6, 0xBED0, 0xD7BE, 0xDED5, 0xD5D0,
+ 0xB0DD, 0x9285, 0x9286, 0xC4E2, 0x9287, 0x9288,
+ 0xC2A3, 0xBCF0, 0x9289, 0xD3B5, 0xC0B9, 0xC5A1,
+ 0xB2A6, 0xD4F1, 0x928A, 0x928B, 0xC0A8, 0xCAC3,
+ 0xDED7, 0xD5FC, 0x928C, 0xB9B0, 0x928D, 0xC8AD,
+ 0xCBA9, 0x928E, 0xDED9, 0xBFBD, 0x928F, 0x9290,
+ 0x9291, 0x9292, 0xC6B4, 0xD7A7, 0xCAB0, 0xC4C3,
+ 0x9293, 0xB3D6, 0xB9D2, 0x9294, 0x9295, 0x9296,
+ 0x9297, 0xD6B8, 0xEAFC, 0xB0B4, 0x9298, 0x9299,
+ 0x929A, 0x929B, 0xBFE6, 0x929C, 0x929D, 0xCCF4,
+ 0x929E, 0x929F, 0x92A0, 0x92A1, 0xCDDA, 0x92A2,
+ 0x92A3, 0x92A4, 0xD6BF, 0xC2CE, 0x92A5, 0xCECE,
+ 0xCCA2, 0xD0AE, 0xC4D3, 0xB5B2, 0xDED8, 0xD5F5,
+ 0xBCB7, 0xBBD3, 0x92A6, 0x92A7, 0xB0A4, 0x92A8,
+ 0xC5B2, 0xB4EC, 0x92A9, 0x92AA, 0x92AB, 0xD5F1,
+ 0x92AC, 0x92AD, 0xEAFD, 0x92AE, 0x92AF, 0x92B0,
+ 0x92B1, 0x92B2, 0x92B3, 0xDEDA, 0xCDA6, 0x92B4,
+ 0x92B5, 0xCDEC, 0x92B6, 0x92B7, 0x92B8, 0x92B9,
+ 0xCEE6, 0xDEDC, 0x92BA, 0xCDB1, 0xC0A6, 0x92BB,
+ 0x92BC, 0xD7BD, 0x92BD, 0xDEDB, 0xB0C6, 0xBAB4,
+ 0xC9D3, 0xC4F3, 0xBEE8, 0x92BE, 0x92BF, 0x92C0,
+ 0x92C1, 0xB2B6, 0x92C2, 0x92C3, 0x92C4, 0x92C5,
+ 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0xC0CC, 0xCBF0,
+ 0x92CA, 0xBCF1, 0xBBBB, 0xB5B7, 0x92CB, 0x92CC,
+ 0x92CD, 0xC5F5, 0x92CE, 0xDEE6, 0x92CF, 0x92D0,
+ 0x92D1, 0xDEE3, 0xBEDD, 0x92D2, 0x92D3, 0xDEDF,
+ 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0xB4B7, 0xBDDD,
+ 0x92D8, 0x92D9, 0xDEE0, 0xC4ED, 0x92DA, 0x92DB,
+ 0x92DC, 0x92DD, 0xCFC6, 0x92DE, 0xB5E0, 0x92DF,
+ 0x92E0, 0x92E1, 0x92E2, 0xB6DE, 0xCADA, 0xB5F4,
+ 0xDEE5, 0x92E3, 0xD5C6, 0x92E4, 0xDEE1, 0xCCCD,
+ 0xC6FE, 0x92E5, 0xC5C5, 0x92E6, 0x92E7, 0x92E8,
+ 0xD2B4, 0x92E9, 0xBEF2, 0x92EA, 0x92EB, 0x92EC,
+ 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0xC2D3, 0x92F1,
+ 0xCCBD, 0xB3B8, 0x92F2, 0xBDD3, 0x92F3, 0xBFD8,
+ 0xCDC6, 0xD1DA, 0xB4EB, 0x92F4, 0xDEE4, 0xDEDD,
+ 0xDEE7, 0x92F5, 0xEAFE, 0x92F6, 0x92F7, 0xC2B0,
+ 0xDEE2, 0x92F8, 0x92F9, 0xD6C0, 0xB5A7, 0x92FA,
+ 0xB2F4, 0x92FB, 0xDEE8, 0x92FC, 0xDEF2, 0x92FD,
+ 0x92FE, 0x9340, 0x9341, 0x9342, 0xDEED, 0x9343,
+ 0xDEF1, 0x9344, 0x9345, 0xC8E0, 0x9346, 0x9347,
+ 0x9348, 0xD7E1, 0xDEEF, 0xC3E8, 0xCCE1, 0x9349,
+ 0xB2E5, 0x934A, 0x934B, 0x934C, 0xD2BE, 0x934D,
+ 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, 0x9353,
+ 0xDEEE, 0x9354, 0xDEEB, 0xCED5, 0x9355, 0xB4A7,
+ 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0xBFAB,
+ 0xBEBE, 0x935B, 0x935C, 0xBDD2, 0x935D, 0x935E,
+ 0x935F, 0x9360, 0xDEE9, 0x9361, 0xD4AE, 0x9362,
+ 0xDEDE, 0x9363, 0xDEEA, 0x9364, 0x9365, 0x9366,
+ 0x9367, 0xC0BF, 0x9368, 0xDEEC, 0xB2F3, 0xB8E9,
+ 0xC2A7, 0x9369, 0x936A, 0xBDC1, 0x936B, 0x936C,
+ 0x936D, 0x936E, 0x936F, 0xDEF5, 0xDEF8, 0x9370,
+ 0x9371, 0xB2AB, 0xB4A4, 0x9372, 0x9373, 0xB4EA,
+ 0xC9A6, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378,
+ 0x9379, 0xDEF6, 0xCBD1, 0x937A, 0xB8E3, 0x937B,
+ 0xDEF7, 0xDEFA, 0x937C, 0x937D, 0x937E, 0x9380,
+ 0xDEF9, 0x9381, 0x9382, 0x9383, 0xCCC2, 0x9384,
+ 0xB0E1, 0xB4EE, 0x9385, 0x9386, 0x9387, 0x9388,
+ 0x9389, 0x938A, 0xE5BA, 0x938B, 0x938C, 0x938D,
+ 0x938E, 0x938F, 0xD0AF, 0x9390, 0x9391, 0xB2EB,
+ 0x9392, 0xEBA1, 0x9393, 0xDEF4, 0x9394, 0x9395,
+ 0xC9E3, 0xDEF3, 0xB0DA, 0xD2A1, 0xB1F7, 0x9396,
+ 0xCCAF, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B,
+ 0x939C, 0x939D, 0xDEF0, 0x939E, 0xCBA4, 0x939F,
+ 0x93A0, 0x93A1, 0xD5AA, 0x93A2, 0x93A3, 0x93A4,
+ 0x93A5, 0x93A6, 0xDEFB, 0x93A7, 0x93A8, 0x93A9,
+ 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0xB4DD,
+ 0x93AF, 0xC4A6, 0x93B0, 0x93B1, 0x93B2, 0xDEFD,
+ 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8,
+ 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0xC3FE, 0xC4A1,
+ 0xDFA1, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1,
+ 0x93C2, 0x93C3, 0xC1CC, 0x93C4, 0xDEFC, 0xBEEF,
+ 0x93C5, 0xC6B2, 0x93C6, 0x93C7, 0x93C8, 0x93C9,
+ 0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93CE, 0xB3C5,
+ 0xC8F6, 0x93CF, 0x93D0, 0xCBBA, 0xDEFE, 0x93D1,
+ 0x93D2, 0xDFA4, 0x93D3, 0x93D4, 0x93D5, 0x93D6,
+ 0xD7B2, 0x93D7, 0x93D8, 0x93D9, 0x93DA, 0x93DB,
+ 0xB3B7, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0xC1C3,
+ 0x93E0, 0x93E1, 0xC7CB, 0xB2A5, 0xB4E9, 0x93E2,
+ 0xD7AB, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0xC4EC,
+ 0x93E7, 0xDFA2, 0xDFA3, 0x93E8, 0xDFA5, 0x93E9,
+ 0xBAB3, 0x93EA, 0x93EB, 0x93EC, 0xDFA6, 0x93ED,
+ 0xC0DE, 0x93EE, 0x93EF, 0xC9C3, 0x93F0, 0x93F1,
+ 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0xB2D9,
+ 0xC7E6, 0x93F7, 0xDFA7, 0x93F8, 0xC7DC, 0x93F9,
+ 0x93FA, 0x93FB, 0x93FC, 0xDFA8, 0xEBA2, 0x93FD,
+ 0x93FE, 0x9440, 0x9441, 0x9442, 0xCBD3, 0x9443,
+ 0x9444, 0x9445, 0xDFAA, 0x9446, 0xDFA9, 0x9447,
+ 0xB2C1, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C,
+ 0x944D, 0x944E, 0x944F, 0x9450, 0x9451, 0x9452,
+ 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458,
+ 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E,
+ 0x945F, 0x9460, 0xC5CA, 0x9461, 0x9462, 0x9463,
+ 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0xDFAB,
+ 0x9469, 0x946A, 0x946B, 0x946C, 0x946D, 0x946E,
+ 0x946F, 0x9470, 0xD4DC, 0x9471, 0x9472, 0x9473,
+ 0x9474, 0x9475, 0xC8C1, 0x9476, 0x9477, 0x9478,
+ 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E,
+ 0x9480, 0x9481, 0x9482, 0xDFAC, 0x9483, 0x9484,
+ 0x9485, 0x9486, 0x9487, 0xBEF0, 0x9488, 0x9489,
+ 0xDFAD, 0xD6A7, 0x948A, 0x948B, 0x948C, 0x948D,
+ 0xEAB7, 0xEBB6, 0xCAD5, 0x948E, 0xD8FC, 0xB8C4,
+ 0x948F, 0xB9A5, 0x9490, 0x9491, 0xB7C5, 0xD5FE,
+ 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0xB9CA,
+ 0x9497, 0x9498, 0xD0A7, 0xF4CD, 0x9499, 0x949A,
+ 0xB5D0, 0x949B, 0x949C, 0xC3F4, 0x949D, 0xBEC8,
+ 0x949E, 0x949F, 0x94A0, 0xEBB7, 0xB0BD, 0x94A1,
+ 0x94A2, 0xBDCC, 0x94A3, 0xC1B2, 0x94A4, 0xB1D6,
+ 0xB3A8, 0x94A5, 0x94A6, 0x94A7, 0xB8D2, 0xC9A2,
+ 0x94A8, 0x94A9, 0xB6D8, 0x94AA, 0x94AB, 0x94AC,
+ 0x94AD, 0xEBB8, 0xBEB4, 0x94AE, 0x94AF, 0x94B0,
+ 0xCAFD, 0x94B1, 0xC7C3, 0x94B2, 0xD5FB, 0x94B3,
+ 0x94B4, 0xB7F3, 0x94B5, 0x94B6, 0x94B7, 0x94B8,
+ 0x94B9, 0x94BA, 0x94BB, 0x94BC, 0x94BD, 0x94BE,
+ 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0xCEC4,
+ 0x94C4, 0x94C5, 0x94C6, 0xD5AB, 0xB1F3, 0x94C7,
+ 0x94C8, 0x94C9, 0xECB3, 0xB0DF, 0x94CA, 0xECB5,
+ 0x94CB, 0x94CC, 0x94CD, 0xB6B7, 0x94CE, 0xC1CF,
+ 0x94CF, 0xF5FA, 0xD0B1, 0x94D0, 0x94D1, 0xD5E5,
+ 0x94D2, 0xCED3, 0x94D3, 0x94D4, 0xBDEF, 0xB3E2,
+ 0x94D5, 0xB8AB, 0x94D6, 0xD5B6, 0x94D7, 0xEDBD,
+ 0x94D8, 0xB6CF, 0x94D9, 0xCBB9, 0xD0C2, 0x94DA,
+ 0x94DB, 0x94DC, 0x94DD, 0x94DE, 0x94DF, 0x94E0,
+ 0x94E1, 0xB7BD, 0x94E2, 0x94E3, 0xECB6, 0xCAA9,
+ 0x94E4, 0x94E5, 0x94E6, 0xC5D4, 0x94E7, 0xECB9,
+ 0xECB8, 0xC2C3, 0xECB7, 0x94E8, 0x94E9, 0x94EA,
+ 0x94EB, 0xD0FD, 0xECBA, 0x94EC, 0xECBB, 0xD7E5,
+ 0x94ED, 0x94EE, 0xECBC, 0x94EF, 0x94F0, 0x94F1,
+ 0xECBD, 0xC6EC, 0x94F2, 0x94F3, 0x94F4, 0x94F5,
+ 0x94F6, 0x94F7, 0x94F8, 0x94F9, 0xCEDE, 0x94FA,
+ 0xBCC8, 0x94FB, 0x94FC, 0xC8D5, 0xB5A9, 0xBEC9,
+ 0xD6BC, 0xD4E7, 0x94FD, 0x94FE, 0xD1AE, 0xD0F1,
+ 0xEAB8, 0xEAB9, 0xEABA, 0xBAB5, 0x9540, 0x9541,
+ 0x9542, 0x9543, 0xCAB1, 0xBFF5, 0x9544, 0x9545,
+ 0xCDFA, 0x9546, 0x9547, 0x9548, 0x9549, 0x954A,
+ 0xEAC0, 0x954B, 0xB0BA, 0xEABE, 0x954C, 0x954D,
+ 0xC0A5, 0x954E, 0x954F, 0x9550, 0xEABB, 0x9551,
+ 0xB2FD, 0x9552, 0xC3F7, 0xBBE8, 0x9553, 0x9554,
+ 0x9555, 0xD2D7, 0xCEF4, 0xEABF, 0x9556, 0x9557,
+ 0x9558, 0xEABC, 0x9559, 0x955A, 0x955B, 0xEAC3,
+ 0x955C, 0xD0C7, 0xD3B3, 0x955D, 0x955E, 0x955F,
+ 0x9560, 0xB4BA, 0x9561, 0xC3C1, 0xD7F2, 0x9562,
+ 0x9563, 0x9564, 0x9565, 0xD5D1, 0x9566, 0xCAC7,
+ 0x9567, 0xEAC5, 0x9568, 0x9569, 0xEAC4, 0xEAC7,
+ 0xEAC6, 0x956A, 0x956B, 0x956C, 0x956D, 0x956E,
+ 0xD6E7, 0x956F, 0xCFD4, 0x9570, 0x9571, 0xEACB,
+ 0x9572, 0xBBCE, 0x9573, 0x9574, 0x9575, 0x9576,
+ 0x9577, 0x9578, 0x9579, 0xBDFA, 0xC9CE, 0x957A,
+ 0x957B, 0xEACC, 0x957C, 0x957D, 0xC9B9, 0xCFFE,
+ 0xEACA, 0xD4CE, 0xEACD, 0xEACF, 0x957E, 0x9580,
+ 0xCDED, 0x9581, 0x9582, 0x9583, 0x9584, 0xEAC9,
+ 0x9585, 0xEACE, 0x9586, 0x9587, 0xCEEE, 0x9588,
+ 0xBBDE, 0x9589, 0xB3BF, 0x958A, 0x958B, 0x958C,
+ 0x958D, 0x958E, 0xC6D5, 0xBEB0, 0xCEFA, 0x958F,
+ 0x9590, 0x9591, 0xC7E7, 0x9592, 0xBEA7, 0xEAD0,
+ 0x9593, 0x9594, 0xD6C7, 0x9595, 0x9596, 0x9597,
+ 0xC1C0, 0x9598, 0x9599, 0x959A, 0xD4DD, 0x959B,
+ 0xEAD1, 0x959C, 0x959D, 0xCFBE, 0x959E, 0x959F,
+ 0x95A0, 0x95A1, 0xEAD2, 0x95A2, 0x95A3, 0x95A4,
+ 0x95A5, 0xCAEE, 0x95A6, 0x95A7, 0x95A8, 0x95A9,
+ 0xC5AF, 0xB0B5, 0x95AA, 0x95AB, 0x95AC, 0x95AD,
+ 0x95AE, 0xEAD4, 0x95AF, 0x95B0, 0x95B1, 0x95B2,
+ 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0xEAD3,
+ 0xF4DF, 0x95B8, 0x95B9, 0x95BA, 0x95BB, 0x95BC,
+ 0xC4BA, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1,
+ 0xB1A9, 0x95C2, 0x95C3, 0x95C4, 0x95C5, 0xE5DF,
+ 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0xEAD5, 0x95CA,
+ 0x95CB, 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0,
+ 0x95D1, 0x95D2, 0x95D3, 0x95D4, 0x95D5, 0x95D6,
+ 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB, 0x95DC,
+ 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2,
+ 0x95E3, 0xCAEF, 0x95E4, 0xEAD6, 0xEAD7, 0xC6D8,
+ 0x95E5, 0x95E6, 0x95E7, 0x95E8, 0x95E9, 0x95EA,
+ 0x95EB, 0x95EC, 0xEAD8, 0x95ED, 0x95EE, 0xEAD9,
+ 0x95EF, 0x95F0, 0x95F1, 0x95F2, 0x95F3, 0x95F4,
+ 0xD4BB, 0x95F5, 0xC7FA, 0xD2B7, 0xB8FC, 0x95F6,
+ 0x95F7, 0xEAC2, 0x95F8, 0xB2DC, 0x95F9, 0x95FA,
+ 0xC2FC, 0x95FB, 0xD4F8, 0xCCE6, 0xD7EE, 0x95FC,
+ 0x95FD, 0x95FE, 0x9640, 0x9641, 0x9642, 0x9643,
+ 0xD4C2, 0xD3D0, 0xEBC3, 0xC5F3, 0x9644, 0xB7FE,
+ 0x9645, 0x9646, 0xEBD4, 0x9647, 0x9648, 0x9649,
+ 0xCBB7, 0xEBDE, 0x964A, 0xC0CA, 0x964B, 0x964C,
+ 0x964D, 0xCDFB, 0x964E, 0xB3AF, 0x964F, 0xC6DA,
+ 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655,
+ 0xEBFC, 0x9656, 0xC4BE, 0x9657, 0xCEB4, 0xC4A9,
+ 0xB1BE, 0xD4FD, 0x9658, 0xCAF5, 0x9659, 0xD6EC,
+ 0x965A, 0x965B, 0xC6D3, 0xB6E4, 0x965C, 0x965D,
+ 0x965E, 0x965F, 0xBBFA, 0x9660, 0x9661, 0xD0E0,
+ 0x9662, 0x9663, 0xC9B1, 0x9664, 0xD4D3, 0xC8A8,
+ 0x9665, 0x9666, 0xB8CB, 0x9667, 0xE8BE, 0xC9BC,
+ 0x9668, 0x9669, 0xE8BB, 0x966A, 0xC0EE, 0xD0D3,
+ 0xB2C4, 0xB4E5, 0x966B, 0xE8BC, 0x966C, 0x966D,
+ 0xD5C8, 0x966E, 0x966F, 0x9670, 0x9671, 0x9672,
+ 0xB6C5, 0x9673, 0xE8BD, 0xCAF8, 0xB8DC, 0xCCF5,
+ 0x9674, 0x9675, 0x9676, 0xC0B4, 0x9677, 0x9678,
+ 0xD1EE, 0xE8BF, 0xE8C2, 0x9679, 0x967A, 0xBABC,
+ 0x967B, 0xB1AD, 0xBDDC, 0x967C, 0xEABD, 0xE8C3,
+ 0x967D, 0xE8C6, 0x967E, 0xE8CB, 0x9680, 0x9681,
+ 0x9682, 0x9683, 0xE8CC, 0x9684, 0xCBC9, 0xB0E5,
+ 0x9685, 0xBCAB, 0x9686, 0x9687, 0xB9B9, 0x9688,
+ 0x9689, 0xE8C1, 0x968A, 0xCDF7, 0x968B, 0xE8CA,
+ 0x968C, 0x968D, 0x968E, 0x968F, 0xCEF6, 0x9690,
+ 0x9691, 0x9692, 0x9693, 0xD5ED, 0x9694, 0xC1D6,
+ 0xE8C4, 0x9695, 0xC3B6, 0x9696, 0xB9FB, 0xD6A6,
+ 0xE8C8, 0x9697, 0x9698, 0x9699, 0xCAE0, 0xD4E6,
+ 0x969A, 0xE8C0, 0x969B, 0xE8C5, 0xE8C7, 0x969C,
+ 0xC7B9, 0xB7E3, 0x969D, 0xE8C9, 0x969E, 0xBFDD,
+ 0xE8D2, 0x969F, 0x96A0, 0xE8D7, 0x96A1, 0xE8D5,
+ 0xBCDC, 0xBCCF, 0xE8DB, 0x96A2, 0x96A3, 0x96A4,
+ 0x96A5, 0x96A6, 0x96A7, 0x96A8, 0x96A9, 0xE8DE,
+ 0x96AA, 0xE8DA, 0xB1FA, 0x96AB, 0x96AC, 0x96AD,
+ 0x96AE, 0x96AF, 0x96B0, 0x96B1, 0x96B2, 0x96B3,
+ 0x96B4, 0xB0D8, 0xC4B3, 0xB8CC, 0xC6E2, 0xC8BE,
+ 0xC8E1, 0x96B5, 0x96B6, 0x96B7, 0xE8CF, 0xE8D4,
+ 0xE8D6, 0x96B8, 0xB9F1, 0xE8D8, 0xD7F5, 0x96B9,
+ 0xC4FB, 0x96BA, 0xE8DC, 0x96BB, 0x96BC, 0xB2E9,
+ 0x96BD, 0x96BE, 0x96BF, 0xE8D1, 0x96C0, 0x96C1,
+ 0xBCED, 0x96C2, 0x96C3, 0xBFC2, 0xE8CD, 0xD6F9,
+ 0x96C4, 0xC1F8, 0xB2F1, 0x96C5, 0x96C6, 0x96C7,
+ 0x96C8, 0x96C9, 0x96CA, 0x96CB, 0x96CC, 0xE8DF,
+ 0x96CD, 0xCAC1, 0xE8D9, 0x96CE, 0x96CF, 0x96D0,
+ 0x96D1, 0xD5A4, 0x96D2, 0xB1EA, 0xD5BB, 0xE8CE,
+ 0xE8D0, 0xB6B0, 0xE8D3, 0x96D3, 0xE8DD, 0xC0B8,
+ 0x96D4, 0xCAF7, 0x96D5, 0xCBA8, 0x96D6, 0x96D7,
+ 0xC6DC, 0xC0F5, 0x96D8, 0x96D9, 0x96DA, 0x96DB,
+ 0x96DC, 0xE8E9, 0x96DD, 0x96DE, 0x96DF, 0xD0A3,
+ 0x96E0, 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5,
+ 0x96E6, 0xE8F2, 0xD6EA, 0x96E7, 0x96E8, 0x96E9,
+ 0x96EA, 0x96EB, 0x96EC, 0x96ED, 0xE8E0, 0xE8E1,
+ 0x96EE, 0x96EF, 0x96F0, 0xD1F9, 0xBACB, 0xB8F9,
+ 0x96F1, 0x96F2, 0xB8F1, 0xD4D4, 0xE8EF, 0x96F3,
+ 0xE8EE, 0xE8EC, 0xB9F0, 0xCCD2, 0xE8E6, 0xCEA6,
+ 0xBFF2, 0x96F4, 0xB0B8, 0xE8F1, 0xE8F0, 0x96F5,
+ 0xD7C0, 0x96F6, 0xE8E4, 0x96F7, 0xCDA9, 0xC9A3,
+ 0x96F8, 0xBBB8, 0xBDDB, 0xE8EA, 0x96F9, 0x96FA,
+ 0x96FB, 0x96FC, 0x96FD, 0x96FE, 0x9740, 0x9741,
+ 0x9742, 0x9743, 0xE8E2, 0xE8E3, 0xE8E5, 0xB5B5,
+ 0xE8E7, 0xC7C5, 0xE8EB, 0xE8ED, 0xBDB0, 0xD7AE,
+ 0x9744, 0xE8F8, 0x9745, 0x9746, 0x9747, 0x9748,
+ 0x9749, 0x974A, 0x974B, 0x974C, 0xE8F5, 0x974D,
+ 0xCDB0, 0xE8F6, 0x974E, 0x974F, 0x9750, 0x9751,
+ 0x9752, 0x9753, 0x9754, 0x9755, 0x9756, 0xC1BA,
+ 0x9757, 0xE8E8, 0x9758, 0xC3B7, 0xB0F0, 0x9759,
+ 0x975A, 0x975B, 0x975C, 0x975D, 0x975E, 0x975F,
+ 0x9760, 0xE8F4, 0x9761, 0x9762, 0x9763, 0xE8F7,
+ 0x9764, 0x9765, 0x9766, 0xB9A3, 0x9767, 0x9768,
+ 0x9769, 0x976A, 0x976B, 0x976C, 0x976D, 0x976E,
+ 0x976F, 0x9770, 0xC9D2, 0x9771, 0x9772, 0x9773,
+ 0xC3CE, 0xCEE0, 0xC0E6, 0x9774, 0x9775, 0x9776,
+ 0x9777, 0xCBF3, 0x9778, 0xCCDD, 0xD0B5, 0x9779,
+ 0x977A, 0xCAE1, 0x977B, 0xE8F3, 0x977C, 0x977D,
+ 0x977E, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784,
+ 0x9785, 0x9786, 0xBCEC, 0x9787, 0xE8F9, 0x9788,
+ 0x9789, 0x978A, 0x978B, 0x978C, 0x978D, 0xC3DE,
+ 0x978E, 0xC6E5, 0x978F, 0xB9F7, 0x9790, 0x9791,
+ 0x9792, 0x9793, 0xB0F4, 0x9794, 0x9795, 0xD7D8,
+ 0x9796, 0x9797, 0xBCAC, 0x9798, 0xC5EF, 0x9799,
+ 0x979A, 0x979B, 0x979C, 0x979D, 0xCCC4, 0x979E,
+ 0x979F, 0xE9A6, 0x97A0, 0x97A1, 0x97A2, 0x97A3,
+ 0x97A4, 0x97A5, 0x97A6, 0x97A7, 0x97A8, 0x97A9,
+ 0xC9AD, 0x97AA, 0xE9A2, 0xC0E2, 0x97AB, 0x97AC,
+ 0x97AD, 0xBFC3, 0x97AE, 0x97AF, 0x97B0, 0xE8FE,
+ 0xB9D7, 0x97B1, 0xE8FB, 0x97B2, 0x97B3, 0x97B4,
+ 0x97B5, 0xE9A4, 0x97B6, 0x97B7, 0x97B8, 0xD2CE,
+ 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BD, 0xE9A3,
+ 0x97BE, 0xD6B2, 0xD7B5, 0x97BF, 0xE9A7, 0x97C0,
+ 0xBDB7, 0x97C1, 0x97C2, 0x97C3, 0x97C4, 0x97C5,
+ 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB,
+ 0x97CC, 0xE8FC, 0xE8FD, 0x97CD, 0x97CE, 0x97CF,
+ 0xE9A1, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4,
+ 0x97D5, 0x97D6, 0x97D7, 0xCDD6, 0x97D8, 0x97D9,
+ 0xD2AC, 0x97DA, 0x97DB, 0x97DC, 0xE9B2, 0x97DD,
+ 0x97DE, 0x97DF, 0x97E0, 0xE9A9, 0x97E1, 0x97E2,
+ 0x97E3, 0xB4AA, 0x97E4, 0xB4BB, 0x97E5, 0x97E6,
+ 0xE9AB, 0x97E7, 0x97E8, 0x97E9, 0x97EA, 0x97EB,
+ 0x97EC, 0x97ED, 0x97EE, 0x97EF, 0x97F0, 0x97F1,
+ 0x97F2, 0x97F3, 0x97F4, 0x97F5, 0x97F6, 0x97F7,
+ 0xD0A8, 0x97F8, 0x97F9, 0xE9A5, 0x97FA, 0x97FB,
+ 0xB3FE, 0x97FC, 0x97FD, 0xE9AC, 0xC0E3, 0x97FE,
+ 0xE9AA, 0x9840, 0x9841, 0xE9B9, 0x9842, 0x9843,
+ 0xE9B8, 0x9844, 0x9845, 0x9846, 0x9847, 0xE9AE,
+ 0x9848, 0x9849, 0xE8FA, 0x984A, 0x984B, 0xE9A8,
+ 0x984C, 0x984D, 0x984E, 0x984F, 0x9850, 0xBFAC,
+ 0xE9B1, 0xE9BA, 0x9851, 0x9852, 0xC2A5, 0x9853,
+ 0x9854, 0x9855, 0xE9AF, 0x9856, 0xB8C5, 0x9857,
+ 0xE9AD, 0x9858, 0xD3DC, 0xE9B4, 0xE9B5, 0xE9B7,
+ 0x9859, 0x985A, 0x985B, 0xE9C7, 0x985C, 0x985D,
+ 0x985E, 0x985F, 0x9860, 0x9861, 0xC0C6, 0xE9C5,
+ 0x9862, 0x9863, 0xE9B0, 0x9864, 0x9865, 0xE9BB,
+ 0xB0F1, 0x9866, 0x9867, 0x9868, 0x9869, 0x986A,
+ 0x986B, 0x986C, 0x986D, 0x986E, 0x986F, 0xE9BC,
+ 0xD5A5, 0x9870, 0x9871, 0xE9BE, 0x9872, 0xE9BF,
+ 0x9873, 0x9874, 0x9875, 0xE9C1, 0x9876, 0x9877,
+ 0xC1F1, 0x9878, 0x9879, 0xC8B6, 0x987A, 0x987B,
+ 0x987C, 0xE9BD, 0x987D, 0x987E, 0x9880, 0x9881,
+ 0x9882, 0xE9C2, 0x9883, 0x9884, 0x9885, 0x9886,
+ 0x9887, 0x9888, 0x9889, 0x988A, 0xE9C3, 0x988B,
+ 0xE9B3, 0x988C, 0xE9B6, 0x988D, 0xBBB1, 0x988E,
+ 0x988F, 0x9890, 0xE9C0, 0x9891, 0x9892, 0x9893,
+ 0x9894, 0x9895, 0x9896, 0xBCF7, 0x9897, 0x9898,
+ 0x9899, 0xE9C4, 0xE9C6, 0x989A, 0x989B, 0x989C,
+ 0x989D, 0x989E, 0x989F, 0x98A0, 0x98A1, 0x98A2,
+ 0x98A3, 0x98A4, 0x98A5, 0xE9CA, 0x98A6, 0x98A7,
+ 0x98A8, 0x98A9, 0xE9CE, 0x98AA, 0x98AB, 0x98AC,
+ 0x98AD, 0x98AE, 0x98AF, 0x98B0, 0x98B1, 0x98B2,
+ 0x98B3, 0xB2DB, 0x98B4, 0xE9C8, 0x98B5, 0x98B6,
+ 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BC,
+ 0x98BD, 0x98BE, 0xB7AE, 0x98BF, 0x98C0, 0x98C1,
+ 0x98C2, 0x98C3, 0x98C4, 0x98C5, 0x98C6, 0x98C7,
+ 0x98C8, 0x98C9, 0x98CA, 0xE9CB, 0xE9CC, 0x98CB,
+ 0x98CC, 0x98CD, 0x98CE, 0x98CF, 0x98D0, 0xD5C1,
+ 0x98D1, 0xC4A3, 0x98D2, 0x98D3, 0x98D4, 0x98D5,
+ 0x98D6, 0x98D7, 0xE9D8, 0x98D8, 0xBAE1, 0x98D9,
+ 0x98DA, 0x98DB, 0x98DC, 0xE9C9, 0x98DD, 0xD3A3,
+ 0x98DE, 0x98DF, 0x98E0, 0xE9D4, 0x98E1, 0x98E2,
+ 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98E7, 0xE9D7,
+ 0xE9D0, 0x98E8, 0x98E9, 0x98EA, 0x98EB, 0x98EC,
+ 0xE9CF, 0x98ED, 0x98EE, 0xC7C1, 0x98EF, 0x98F0,
+ 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6,
+ 0xE9D2, 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB,
+ 0x98FC, 0x98FD, 0xE9D9, 0xB3C8, 0x98FE, 0xE9D3,
+ 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0xCFF0,
+ 0x9945, 0x9946, 0x9947, 0xE9CD, 0x9948, 0x9949,
+ 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F,
+ 0x9950, 0x9951, 0x9952, 0xB3F7, 0x9953, 0x9954,
+ 0x9955, 0x9956, 0x9957, 0x9958, 0x9959, 0xE9D6,
+ 0x995A, 0x995B, 0xE9DA, 0x995C, 0x995D, 0x995E,
+ 0xCCB4, 0x995F, 0x9960, 0x9961, 0xCFAD, 0x9962,
+ 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968,
+ 0x9969, 0x996A, 0xE9D5, 0x996B, 0xE9DC, 0xE9DB,
+ 0x996C, 0x996D, 0x996E, 0x996F, 0x9970, 0xE9DE,
+ 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976,
+ 0x9977, 0x9978, 0xE9D1, 0x9979, 0x997A, 0x997B,
+ 0x997C, 0x997D, 0x997E, 0x9980, 0x9981, 0xE9DD,
+ 0x9982, 0xE9DF, 0xC3CA, 0x9983, 0x9984, 0x9985,
+ 0x9986, 0x9987, 0x9988, 0x9989, 0x998A, 0x998B,
+ 0x998C, 0x998D, 0x998E, 0x998F, 0x9990, 0x9991,
+ 0x9992, 0x9993, 0x9994, 0x9995, 0x9996, 0x9997,
+ 0x9998, 0x9999, 0x999A, 0x999B, 0x999C, 0x999D,
+ 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2, 0x99A3,
+ 0x99A4, 0x99A5, 0x99A6, 0x99A7, 0x99A8, 0x99A9,
+ 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF,
+ 0x99B0, 0x99B1, 0x99B2, 0x99B3, 0x99B4, 0x99B5,
+ 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA, 0x99BB,
+ 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1,
+ 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7,
+ 0x99C8, 0x99C9, 0x99CA, 0x99CB, 0x99CC, 0x99CD,
+ 0x99CE, 0x99CF, 0x99D0, 0x99D1, 0x99D2, 0x99D3,
+ 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, 0x99D9,
+ 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF,
+ 0x99E0, 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5,
+ 0x99E6, 0x99E7, 0x99E8, 0x99E9, 0x99EA, 0x99EB,
+ 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, 0x99F1,
+ 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0xC7B7, 0xB4CE,
+ 0xBBB6, 0xD0C0, 0xECA3, 0x99F6, 0x99F7, 0xC5B7,
+ 0x99F8, 0x99F9, 0x99FA, 0x99FB, 0x99FC, 0x99FD,
+ 0x99FE, 0x9A40, 0x9A41, 0x9A42, 0xD3FB, 0x9A43,
+ 0x9A44, 0x9A45, 0x9A46, 0xECA4, 0x9A47, 0xECA5,
+ 0xC6DB, 0x9A48, 0x9A49, 0x9A4A, 0xBFEE, 0x9A4B,
+ 0x9A4C, 0x9A4D, 0x9A4E, 0xECA6, 0x9A4F, 0x9A50,
+ 0xECA7, 0xD0AA, 0x9A51, 0xC7B8, 0x9A52, 0x9A53,
+ 0xB8E8, 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58,
+ 0x9A59, 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E,
+ 0x9A5F, 0xECA8, 0x9A60, 0x9A61, 0x9A62, 0x9A63,
+ 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0xD6B9, 0xD5FD,
+ 0xB4CB, 0xB2BD, 0xCEE4, 0xC6E7, 0x9A68, 0x9A69,
+ 0xCDE1, 0x9A6A, 0x9A6B, 0x9A6C, 0x9A6D, 0x9A6E,
+ 0x9A6F, 0x9A70, 0x9A71, 0x9A72, 0x9A73, 0x9A74,
+ 0x9A75, 0x9A76, 0x9A77, 0xB4F5, 0x9A78, 0xCBC0,
+ 0xBCDF, 0x9A79, 0x9A7A, 0x9A7B, 0x9A7C, 0xE9E2,
+ 0xE9E3, 0xD1EA, 0xE9E5, 0x9A7D, 0xB4F9, 0xE9E4,
+ 0x9A7E, 0xD1B3, 0xCAE2, 0xB2D0, 0x9A80, 0xE9E8,
+ 0x9A81, 0x9A82, 0x9A83, 0x9A84, 0xE9E6, 0xE9E7,
+ 0x9A85, 0x9A86, 0xD6B3, 0x9A87, 0x9A88, 0x9A89,
+ 0xE9E9, 0xE9EA, 0x9A8A, 0x9A8B, 0x9A8C, 0x9A8D,
+ 0x9A8E, 0xE9EB, 0x9A8F, 0x9A90, 0x9A91, 0x9A92,
+ 0x9A93, 0x9A94, 0x9A95, 0x9A96, 0xE9EC, 0x9A97,
+ 0x9A98, 0x9A99, 0x9A9A, 0x9A9B, 0x9A9C, 0x9A9D,
+ 0x9A9E, 0xECAF, 0xC5B9, 0xB6CE, 0x9A9F, 0xD2F3,
+ 0x9AA0, 0x9AA1, 0x9AA2, 0x9AA3, 0x9AA4, 0x9AA5,
+ 0x9AA6, 0xB5EE, 0x9AA7, 0xBBD9, 0xECB1, 0x9AA8,
+ 0x9AA9, 0xD2E3, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD,
+ 0x9AAE, 0xCEE3, 0x9AAF, 0xC4B8, 0x9AB0, 0xC3BF,
+ 0x9AB1, 0x9AB2, 0xB6BE, 0xD8B9, 0xB1C8, 0xB1CF,
+ 0xB1D1, 0xC5FE, 0x9AB3, 0xB1D0, 0x9AB4, 0xC3AB,
+ 0x9AB5, 0x9AB6, 0x9AB7, 0x9AB8, 0x9AB9, 0xD5B1,
+ 0x9ABA, 0x9ABB, 0x9ABC, 0x9ABD, 0x9ABE, 0x9ABF,
+ 0x9AC0, 0x9AC1, 0xEBA4, 0xBAC1, 0x9AC2, 0x9AC3,
+ 0x9AC4, 0xCCBA, 0x9AC5, 0x9AC6, 0x9AC7, 0xEBA5,
+ 0x9AC8, 0xEBA7, 0x9AC9, 0x9ACA, 0x9ACB, 0xEBA8,
+ 0x9ACC, 0x9ACD, 0x9ACE, 0xEBA6, 0x9ACF, 0x9AD0,
+ 0x9AD1, 0x9AD2, 0x9AD3, 0x9AD4, 0x9AD5, 0xEBA9,
+ 0xEBAB, 0xEBAA, 0x9AD6, 0x9AD7, 0x9AD8, 0x9AD9,
+ 0x9ADA, 0xEBAC, 0x9ADB, 0xCACF, 0xD8B5, 0xC3F1,
+ 0x9ADC, 0xC3A5, 0xC6F8, 0xEBAD, 0xC4CA, 0x9ADD,
+ 0xEBAE, 0xEBAF, 0xEBB0, 0xB7D5, 0x9ADE, 0x9ADF,
+ 0x9AE0, 0xB7FA, 0x9AE1, 0xEBB1, 0xC7E2, 0x9AE2,
+ 0xEBB3, 0x9AE3, 0xBAA4, 0xD1F5, 0xB0B1, 0xEBB2,
+ 0xEBB4, 0x9AE4, 0x9AE5, 0x9AE6, 0xB5AA, 0xC2C8,
+ 0xC7E8, 0x9AE7, 0xEBB5, 0x9AE8, 0xCBAE, 0xE3DF,
+ 0x9AE9, 0x9AEA, 0xD3C0, 0x9AEB, 0x9AEC, 0x9AED,
+ 0x9AEE, 0xD9DB, 0x9AEF, 0x9AF0, 0xCDA1, 0xD6AD,
+ 0xC7F3, 0x9AF1, 0x9AF2, 0x9AF3, 0xD9E0, 0xBBE3,
+ 0x9AF4, 0xBABA, 0xE3E2, 0x9AF5, 0x9AF6, 0x9AF7,
+ 0x9AF8, 0x9AF9, 0xCFAB, 0x9AFA, 0x9AFB, 0x9AFC,
+ 0xE3E0, 0xC9C7, 0x9AFD, 0xBAB9, 0x9AFE, 0x9B40,
+ 0x9B41, 0xD1B4, 0xE3E1, 0xC8EA, 0xB9AF, 0xBDAD,
+ 0xB3D8, 0xCEDB, 0x9B42, 0x9B43, 0xCCC0, 0x9B44,
+ 0x9B45, 0x9B46, 0xE3E8, 0xE3E9, 0xCDF4, 0x9B47,
+ 0x9B48, 0x9B49, 0x9B4A, 0x9B4B, 0xCCAD, 0x9B4C,
+ 0xBCB3, 0x9B4D, 0xE3EA, 0x9B4E, 0xE3EB, 0x9B4F,
+ 0x9B50, 0xD0DA, 0x9B51, 0x9B52, 0x9B53, 0xC6FB,
+ 0xB7DA, 0x9B54, 0x9B55, 0xC7DF, 0xD2CA, 0xCED6,
+ 0x9B56, 0xE3E4, 0xE3EC, 0x9B57, 0xC9F2, 0xB3C1,
+ 0x9B58, 0x9B59, 0xE3E7, 0x9B5A, 0x9B5B, 0xC6E3,
+ 0xE3E5, 0x9B5C, 0x9B5D, 0xEDB3, 0xE3E6, 0x9B5E,
+ 0x9B5F, 0x9B60, 0x9B61, 0xC9B3, 0x9B62, 0xC5E6,
+ 0x9B63, 0x9B64, 0x9B65, 0xB9B5, 0x9B66, 0xC3BB,
+ 0x9B67, 0xE3E3, 0xC5BD, 0xC1A4, 0xC2D9, 0xB2D7,
+ 0x9B68, 0xE3ED, 0xBBA6, 0xC4AD, 0x9B69, 0xE3F0,
+ 0xBEDA, 0x9B6A, 0x9B6B, 0xE3FB, 0xE3F5, 0xBAD3,
+ 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0xB7D0, 0xD3CD,
+ 0x9B70, 0xD6CE, 0xD5D3, 0xB9C1, 0xD5B4, 0xD1D8,
+ 0x9B71, 0x9B72, 0x9B73, 0x9B74, 0xD0B9, 0xC7F6,
+ 0x9B75, 0x9B76, 0x9B77, 0xC8AA, 0xB2B4, 0x9B78,
+ 0xC3DA, 0x9B79, 0x9B7A, 0x9B7B, 0xE3EE, 0x9B7C,
+ 0x9B7D, 0xE3FC, 0xE3EF, 0xB7A8, 0xE3F7, 0xE3F4,
+ 0x9B7E, 0x9B80, 0x9B81, 0xB7BA, 0x9B82, 0x9B83,
+ 0xC5A2, 0x9B84, 0xE3F6, 0xC5DD, 0xB2A8, 0xC6FC,
+ 0x9B85, 0xC4E0, 0x9B86, 0x9B87, 0xD7A2, 0x9B88,
+ 0xC0E1, 0xE3F9, 0x9B89, 0x9B8A, 0xE3FA, 0xE3FD,
+ 0xCCA9, 0xE3F3, 0x9B8B, 0xD3BE, 0x9B8C, 0xB1C3,
+ 0xEDB4, 0xE3F1, 0xE3F2, 0x9B8D, 0xE3F8, 0xD0BA,
+ 0xC6C3, 0xD4F3, 0xE3FE, 0x9B8E, 0x9B8F, 0xBDE0,
+ 0x9B90, 0x9B91, 0xE4A7, 0x9B92, 0x9B93, 0xE4A6,
+ 0x9B94, 0x9B95, 0x9B96, 0xD1F3, 0xE4A3, 0x9B97,
+ 0xE4A9, 0x9B98, 0x9B99, 0x9B9A, 0xC8F7, 0x9B9B,
+ 0x9B9C, 0x9B9D, 0x9B9E, 0xCFB4, 0x9B9F, 0xE4A8,
+ 0xE4AE, 0xC2E5, 0x9BA0, 0x9BA1, 0xB6B4, 0x9BA2,
+ 0x9BA3, 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0xBDF2,
+ 0x9BA8, 0xE4A2, 0x9BA9, 0x9BAA, 0xBAE9, 0xE4AA,
+ 0x9BAB, 0x9BAC, 0xE4AC, 0x9BAD, 0x9BAE, 0xB6FD,
+ 0xD6DE, 0xE4B2, 0x9BAF, 0xE4AD, 0x9BB0, 0x9BB1,
+ 0x9BB2, 0xE4A1, 0x9BB3, 0xBBEE, 0xCDDD, 0xC7A2,
+ 0xC5C9, 0x9BB4, 0x9BB5, 0xC1F7, 0x9BB6, 0xE4A4,
+ 0x9BB7, 0xC7B3, 0xBDAC, 0xBDBD, 0xE4A5, 0x9BB8,
+ 0xD7C7, 0xB2E2, 0x9BB9, 0xE4AB, 0xBCC3, 0xE4AF,
+ 0x9BBA, 0xBBEB, 0xE4B0, 0xC5A8, 0xE4B1, 0x9BBB,
+ 0x9BBC, 0x9BBD, 0x9BBE, 0xD5E3, 0xBFA3, 0x9BBF,
+ 0xE4BA, 0x9BC0, 0xE4B7, 0x9BC1, 0xE4BB, 0x9BC2,
+ 0x9BC3, 0xE4BD, 0x9BC4, 0x9BC5, 0xC6D6, 0x9BC6,
+ 0x9BC7, 0xBAC6, 0xC0CB, 0x9BC8, 0x9BC9, 0x9BCA,
+ 0xB8A1, 0xE4B4, 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE,
+ 0xD4A1, 0x9BCF, 0x9BD0, 0xBAA3, 0xBDFE, 0x9BD1,
+ 0x9BD2, 0x9BD3, 0xE4BC, 0x9BD4, 0x9BD5, 0x9BD6,
+ 0x9BD7, 0x9BD8, 0xCDBF, 0x9BD9, 0x9BDA, 0xC4F9,
+ 0x9BDB, 0x9BDC, 0xCFFB, 0xC9E6, 0x9BDD, 0x9BDE,
+ 0xD3BF, 0x9BDF, 0xCFD1, 0x9BE0, 0x9BE1, 0xE4B3,
+ 0x9BE2, 0xE4B8, 0xE4B9, 0xCCE9, 0x9BE3, 0x9BE4,
+ 0x9BE5, 0x9BE6, 0x9BE7, 0xCCCE, 0x9BE8, 0xC0D4,
+ 0xE4B5, 0xC1B0, 0xE4B6, 0xCED0, 0x9BE9, 0xBBC1,
+ 0xB5D3, 0x9BEA, 0xC8F3, 0xBDA7, 0xD5C7, 0xC9AC,
+ 0xB8A2, 0xE4CA, 0x9BEB, 0x9BEC, 0xE4CC, 0xD1C4,
+ 0x9BED, 0x9BEE, 0xD2BA, 0x9BEF, 0x9BF0, 0xBAAD,
+ 0x9BF1, 0x9BF2, 0xBAD4, 0x9BF3, 0x9BF4, 0x9BF5,
+ 0x9BF6, 0x9BF7, 0x9BF8, 0xE4C3, 0xB5ED, 0x9BF9,
+ 0x9BFA, 0x9BFB, 0xD7CD, 0xE4C0, 0xCFFD, 0xE4BF,
+ 0x9BFC, 0x9BFD, 0x9BFE, 0xC1DC, 0xCCCA, 0x9C40,
+ 0x9C41, 0x9C42, 0x9C43, 0xCAE7, 0x9C44, 0x9C45,
+ 0x9C46, 0x9C47, 0xC4D7, 0x9C48, 0xCCD4, 0xE4C8,
+ 0x9C49, 0x9C4A, 0x9C4B, 0xE4C7, 0xE4C1, 0x9C4C,
+ 0xE4C4, 0xB5AD, 0x9C4D, 0x9C4E, 0xD3D9, 0x9C4F,
+ 0xE4C6, 0x9C50, 0x9C51, 0x9C52, 0x9C53, 0xD2F9,
+ 0xB4E3, 0x9C54, 0xBBB4, 0x9C55, 0x9C56, 0xC9EE,
+ 0x9C57, 0xB4BE, 0x9C58, 0x9C59, 0x9C5A, 0xBBEC,
+ 0x9C5B, 0xD1CD, 0x9C5C, 0xCCED, 0xEDB5, 0x9C5D,
+ 0x9C5E, 0x9C5F, 0x9C60, 0x9C61, 0x9C62, 0x9C63,
+ 0x9C64, 0xC7E5, 0x9C65, 0x9C66, 0x9C67, 0x9C68,
+ 0xD4A8, 0x9C69, 0xE4CB, 0xD7D5, 0xE4C2, 0x9C6A,
+ 0xBDA5, 0xE4C5, 0x9C6B, 0x9C6C, 0xD3E6, 0x9C6D,
+ 0xE4C9, 0xC9F8, 0x9C6E, 0x9C6F, 0xE4BE, 0x9C70,
+ 0x9C71, 0xD3E5, 0x9C72, 0x9C73, 0xC7FE, 0xB6C9,
+ 0x9C74, 0xD4FC, 0xB2B3, 0xE4D7, 0x9C75, 0x9C76,
+ 0x9C77, 0xCEC2, 0x9C78, 0xE4CD, 0x9C79, 0xCEBC,
+ 0x9C7A, 0xB8DB, 0x9C7B, 0x9C7C, 0xE4D6, 0x9C7D,
+ 0xBFCA, 0x9C7E, 0x9C80, 0x9C81, 0xD3CE, 0x9C82,
+ 0xC3EC, 0x9C83, 0x9C84, 0x9C85, 0x9C86, 0x9C87,
+ 0x9C88, 0x9C89, 0x9C8A, 0xC5C8, 0xE4D8, 0x9C8B,
+ 0x9C8C, 0x9C8D, 0x9C8E, 0x9C8F, 0x9C90, 0x9C91,
+ 0x9C92, 0xCDC4, 0xE4CF, 0x9C93, 0x9C94, 0x9C95,
+ 0x9C96, 0xE4D4, 0xE4D5, 0x9C97, 0xBAFE, 0x9C98,
+ 0xCFE6, 0x9C99, 0x9C9A, 0xD5BF, 0x9C9B, 0x9C9C,
+ 0x9C9D, 0xE4D2, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1,
+ 0x9CA2, 0x9CA3, 0x9CA4, 0x9CA5, 0x9CA6, 0x9CA7,
+ 0x9CA8, 0xE4D0, 0x9CA9, 0x9CAA, 0xE4CE, 0x9CAB,
+ 0x9CAC, 0x9CAD, 0x9CAE, 0x9CAF, 0x9CB0, 0x9CB1,
+ 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7,
+ 0x9CB8, 0x9CB9, 0xCDE5, 0xCAAA, 0x9CBA, 0x9CBB,
+ 0x9CBC, 0xC0A3, 0x9CBD, 0xBDA6, 0xE4D3, 0x9CBE,
+ 0x9CBF, 0xB8C8, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC3,
+ 0x9CC4, 0xE4E7, 0xD4B4, 0x9CC5, 0x9CC6, 0x9CC7,
+ 0x9CC8, 0x9CC9, 0x9CCA, 0x9CCB, 0xE4DB, 0x9CCC,
+ 0x9CCD, 0x9CCE, 0xC1EF, 0x9CCF, 0x9CD0, 0xE4E9,
+ 0x9CD1, 0x9CD2, 0xD2E7, 0x9CD3, 0x9CD4, 0xE4DF,
+ 0x9CD5, 0xE4E0, 0x9CD6, 0x9CD7, 0xCFAA, 0x9CD8,
+ 0x9CD9, 0x9CDA, 0x9CDB, 0xCBDD, 0x9CDC, 0xE4DA,
+ 0xE4D1, 0x9CDD, 0xE4E5, 0x9CDE, 0xC8DC, 0xE4E3,
+ 0x9CDF, 0x9CE0, 0xC4E7, 0xE4E2, 0x9CE1, 0xE4E1,
+ 0x9CE2, 0x9CE3, 0x9CE4, 0xB3FC, 0xE4E8, 0x9CE5,
+ 0x9CE6, 0x9CE7, 0x9CE8, 0xB5E1, 0x9CE9, 0x9CEA,
+ 0x9CEB, 0xD7CC, 0x9CEC, 0x9CED, 0x9CEE, 0xE4E6,
+ 0x9CEF, 0xBBAC, 0x9CF0, 0xD7D2, 0xCCCF, 0xEBF8,
+ 0x9CF1, 0xE4E4, 0x9CF2, 0x9CF3, 0xB9F6, 0x9CF4,
+ 0x9CF5, 0x9CF6, 0xD6CD, 0xE4D9, 0xE4DC, 0xC2FA,
+ 0xE4DE, 0x9CF7, 0xC2CB, 0xC0C4, 0xC2D0, 0x9CF8,
+ 0xB1F5, 0xCCB2, 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC,
+ 0x9CFD, 0x9CFE, 0x9D40, 0x9D41, 0x9D42, 0x9D43,
+ 0xB5CE, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0xE4EF,
+ 0x9D48, 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D,
+ 0x9D4E, 0x9D4F, 0xC6AF, 0x9D50, 0x9D51, 0x9D52,
+ 0xC6E1, 0x9D53, 0x9D54, 0xE4F5, 0x9D55, 0x9D56,
+ 0x9D57, 0x9D58, 0x9D59, 0xC2A9, 0x9D5A, 0x9D5B,
+ 0x9D5C, 0xC0EC, 0xD1DD, 0xE4EE, 0x9D5D, 0x9D5E,
+ 0x9D5F, 0x9D60, 0x9D61, 0x9D62, 0x9D63, 0x9D64,
+ 0x9D65, 0x9D66, 0xC4AE, 0x9D67, 0x9D68, 0x9D69,
+ 0xE4ED, 0x9D6A, 0x9D6B, 0x9D6C, 0x9D6D, 0xE4F6,
+ 0xE4F4, 0xC2FE, 0x9D6E, 0xE4DD, 0x9D6F, 0xE4F0,
+ 0x9D70, 0xCAFE, 0x9D71, 0xD5C4, 0x9D72, 0x9D73,
+ 0xE4F1, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78,
+ 0x9D79, 0x9D7A, 0xD1FA, 0x9D7B, 0x9D7C, 0x9D7D,
+ 0x9D7E, 0x9D80, 0x9D81, 0x9D82, 0xE4EB, 0xE4EC,
+ 0x9D83, 0x9D84, 0x9D85, 0xE4F2, 0x9D86, 0xCEAB,
+ 0x9D87, 0x9D88, 0x9D89, 0x9D8A, 0x9D8B, 0x9D8C,
+ 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0xC5CB, 0x9D91,
+ 0x9D92, 0x9D93, 0xC7B1, 0x9D94, 0xC2BA, 0x9D95,
+ 0x9D96, 0x9D97, 0xE4EA, 0x9D98, 0x9D99, 0x9D9A,
+ 0xC1CA, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F,
+ 0x9DA0, 0xCCB6, 0xB3B1, 0x9DA1, 0x9DA2, 0x9DA3,
+ 0xE4FB, 0x9DA4, 0xE4F3, 0x9DA5, 0x9DA6, 0x9DA7,
+ 0xE4FA, 0x9DA8, 0xE4FD, 0x9DA9, 0xE4FC, 0x9DAA,
+ 0x9DAB, 0x9DAC, 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0,
+ 0xB3CE, 0x9DB1, 0x9DB2, 0x9DB3, 0xB3BA, 0xE4F7,
+ 0x9DB4, 0x9DB5, 0xE4F9, 0xE4F8, 0xC5EC, 0x9DB6,
+ 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC,
+ 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2,
+ 0xC0BD, 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0xD4E8,
+ 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0xE5A2,
+ 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1,
+ 0x9DD2, 0x9DD3, 0x9DD4, 0x9DD5, 0x9DD6, 0xB0C4,
+ 0x9DD7, 0x9DD8, 0xE5A4, 0x9DD9, 0x9DDA, 0xE5A3,
+ 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0,
+ 0xBCA4, 0x9DE1, 0xE5A5, 0x9DE2, 0x9DE3, 0x9DE4,
+ 0x9DE5, 0x9DE6, 0x9DE7, 0xE5A1, 0x9DE8, 0x9DE9,
+ 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0xE4FE,
+ 0xB1F4, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF2, 0x9DF3,
+ 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9,
+ 0xE5A8, 0x9DFA, 0xE5A9, 0xE5A6, 0x9DFB, 0x9DFC,
+ 0x9DFD, 0x9DFE, 0x9E40, 0x9E41, 0x9E42, 0x9E43,
+ 0x9E44, 0x9E45, 0x9E46, 0x9E47, 0xE5A7, 0xE5AA,
+ 0x9E48, 0x9E49, 0x9E4A, 0x9E4B, 0x9E4C, 0x9E4D,
+ 0x9E4E, 0x9E4F, 0x9E50, 0x9E51, 0x9E52, 0x9E53,
+ 0x9E54, 0x9E55, 0x9E56, 0x9E57, 0x9E58, 0x9E59,
+ 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5D, 0x9E5E, 0x9E5F,
+ 0x9E60, 0x9E61, 0x9E62, 0x9E63, 0x9E64, 0x9E65,
+ 0x9E66, 0x9E67, 0x9E68, 0xC6D9, 0x9E69, 0x9E6A,
+ 0x9E6B, 0x9E6C, 0x9E6D, 0x9E6E, 0x9E6F, 0x9E70,
+ 0xE5AB, 0xE5AD, 0x9E71, 0x9E72, 0x9E73, 0x9E74,
+ 0x9E75, 0x9E76, 0x9E77, 0xE5AC, 0x9E78, 0x9E79,
+ 0x9E7A, 0x9E7B, 0x9E7C, 0x9E7D, 0x9E7E, 0x9E80,
+ 0x9E81, 0x9E82, 0x9E83, 0x9E84, 0x9E85, 0x9E86,
+ 0x9E87, 0x9E88, 0x9E89, 0xE5AF, 0x9E8A, 0x9E8B,
+ 0x9E8C, 0xE5AE, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90,
+ 0x9E91, 0x9E92, 0x9E93, 0x9E94, 0x9E95, 0x9E96,
+ 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C,
+ 0x9E9D, 0x9E9E, 0xB9E0, 0x9E9F, 0x9EA0, 0xE5B0,
+ 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA6,
+ 0x9EA7, 0x9EA8, 0x9EA9, 0x9EAA, 0x9EAB, 0x9EAC,
+ 0x9EAD, 0x9EAE, 0xE5B1, 0x9EAF, 0x9EB0, 0x9EB1,
+ 0x9EB2, 0x9EB3, 0x9EB4, 0x9EB5, 0x9EB6, 0x9EB7,
+ 0x9EB8, 0x9EB9, 0x9EBA, 0xBBF0, 0xECE1, 0xC3F0,
+ 0x9EBB, 0xB5C6, 0xBBD2, 0x9EBC, 0x9EBD, 0x9EBE,
+ 0x9EBF, 0xC1E9, 0xD4EE, 0x9EC0, 0xBEC4, 0x9EC1,
+ 0x9EC2, 0x9EC3, 0xD7C6, 0x9EC4, 0xD4D6, 0xB2D3,
+ 0xECBE, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, 0xEAC1,
+ 0x9EC9, 0x9ECA, 0x9ECB, 0xC2AF, 0xB4B6, 0x9ECC,
+ 0x9ECD, 0x9ECE, 0xD1D7, 0x9ECF, 0x9ED0, 0x9ED1,
+ 0xB3B4, 0x9ED2, 0xC8B2, 0xBFBB, 0xECC0, 0x9ED3,
+ 0x9ED4, 0xD6CB, 0x9ED5, 0x9ED6, 0xECBF, 0xECC1,
+ 0x9ED7, 0x9ED8, 0x9ED9, 0x9EDA, 0x9EDB, 0x9EDC,
+ 0x9EDD, 0x9EDE, 0x9EDF, 0x9EE0, 0x9EE1, 0x9EE2,
+ 0x9EE3, 0xECC5, 0xBEE6, 0xCCBF, 0xC5DA, 0xBEBC,
+ 0x9EE4, 0xECC6, 0x9EE5, 0xB1FE, 0x9EE6, 0x9EE7,
+ 0x9EE8, 0xECC4, 0xD5A8, 0xB5E3, 0x9EE9, 0xECC2,
+ 0xC1B6, 0xB3E3, 0x9EEA, 0x9EEB, 0xECC3, 0xCBB8,
+ 0xC0C3, 0xCCFE, 0x9EEC, 0x9EED, 0x9EEE, 0x9EEF,
+ 0xC1D2, 0x9EF0, 0xECC8, 0x9EF1, 0x9EF2, 0x9EF3,
+ 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, 0x9EF9,
+ 0x9EFA, 0x9EFB, 0x9EFC, 0x9EFD, 0xBAE6, 0xC0D3,
+ 0x9EFE, 0xD6F2, 0x9F40, 0x9F41, 0x9F42, 0xD1CC,
+ 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0xBFBE, 0x9F47,
+ 0xB7B3, 0xC9D5, 0xECC7, 0xBBE2, 0x9F48, 0xCCCC,
+ 0xBDFD, 0xC8C8, 0x9F49, 0xCFA9, 0x9F4A, 0x9F4B,
+ 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, 0x9F50, 0xCDE9,
+ 0x9F51, 0xC5EB, 0x9F52, 0x9F53, 0x9F54, 0xB7E9,
+ 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, 0x9F5A,
+ 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0xD1C9,
+ 0xBAB8, 0x9F60, 0x9F61, 0x9F62, 0x9F63, 0x9F64,
+ 0xECC9, 0x9F65, 0x9F66, 0xECCA, 0x9F67, 0xBBC0,
+ 0xECCB, 0x9F68, 0xECE2, 0xB1BA, 0xB7D9, 0x9F69,
+ 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F,
+ 0x9F70, 0x9F71, 0x9F72, 0x9F73, 0xBDB9, 0x9F74,
+ 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0x9F79, 0x9F7A,
+ 0x9F7B, 0xECCC, 0xD1E6, 0xECCD, 0x9F7C, 0x9F7D,
+ 0x9F7E, 0x9F80, 0xC8BB, 0x9F81, 0x9F82, 0x9F83,
+ 0x9F84, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89,
+ 0x9F8A, 0x9F8B, 0x9F8C, 0x9F8D, 0x9F8E, 0xECD1,
+ 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0xECD3, 0x9F93,
+ 0xBBCD, 0x9F94, 0xBCE5, 0x9F95, 0x9F96, 0x9F97,
+ 0x9F98, 0x9F99, 0x9F9A, 0x9F9B, 0x9F9C, 0x9F9D,
+ 0x9F9E, 0x9F9F, 0x9FA0, 0x9FA1, 0xECCF, 0x9FA2,
+ 0xC9B7, 0x9FA3, 0x9FA4, 0x9FA5, 0x9FA6, 0x9FA7,
+ 0xC3BA, 0x9FA8, 0xECE3, 0xD5D5, 0xECD0, 0x9FA9,
+ 0x9FAA, 0x9FAB, 0x9FAC, 0x9FAD, 0xD6F3, 0x9FAE,
+ 0x9FAF, 0x9FB0, 0xECD2, 0xECCE, 0x9FB1, 0x9FB2,
+ 0x9FB3, 0x9FB4, 0xECD4, 0x9FB5, 0xECD5, 0x9FB6,
+ 0x9FB7, 0xC9BF, 0x9FB8, 0x9FB9, 0x9FBA, 0x9FBB,
+ 0x9FBC, 0x9FBD, 0xCFA8, 0x9FBE, 0x9FBF, 0x9FC0,
+ 0x9FC1, 0x9FC2, 0xD0DC, 0x9FC3, 0x9FC4, 0x9FC5,
+ 0x9FC6, 0xD1AC, 0x9FC7, 0x9FC8, 0x9FC9, 0x9FCA,
+ 0xC8DB, 0x9FCB, 0x9FCC, 0x9FCD, 0xECD6, 0xCEF5,
+ 0x9FCE, 0x9FCF, 0x9FD0, 0x9FD1, 0x9FD2, 0xCAEC,
+ 0xECDA, 0x9FD3, 0x9FD4, 0x9FD5, 0x9FD6, 0x9FD7,
+ 0x9FD8, 0x9FD9, 0xECD9, 0x9FDA, 0x9FDB, 0x9FDC,
+ 0xB0BE, 0x9FDD, 0x9FDE, 0x9FDF, 0x9FE0, 0x9FE1,
+ 0x9FE2, 0xECD7, 0x9FE3, 0xECD8, 0x9FE4, 0x9FE5,
+ 0x9FE6, 0xECE4, 0x9FE7, 0x9FE8, 0x9FE9, 0x9FEA,
+ 0x9FEB, 0x9FEC, 0x9FED, 0x9FEE, 0x9FEF, 0xC8BC,
+ 0x9FF0, 0x9FF1, 0x9FF2, 0x9FF3, 0x9FF4, 0x9FF5,
+ 0x9FF6, 0x9FF7, 0x9FF8, 0x9FF9, 0xC1C7, 0x9FFA,
+ 0x9FFB, 0x9FFC, 0x9FFD, 0x9FFE, 0xECDC, 0xD1E0,
+ 0xA040, 0xA041, 0xA042, 0xA043, 0xA044, 0xA045,
+ 0xA046, 0xA047, 0xA048, 0xA049, 0xECDB, 0xA04A,
+ 0xA04B, 0xA04C, 0xA04D, 0xD4EF, 0xA04E, 0xECDD,
+ 0xA04F, 0xA050, 0xA051, 0xA052, 0xA053, 0xA054,
+ 0xDBC6, 0xA055, 0xA056, 0xA057, 0xA058, 0xA059,
+ 0xA05A, 0xA05B, 0xA05C, 0xA05D, 0xA05E, 0xECDE,
+ 0xA05F, 0xA060, 0xA061, 0xA062, 0xA063, 0xA064,
+ 0xA065, 0xA066, 0xA067, 0xA068, 0xA069, 0xA06A,
+ 0xB1AC, 0xA06B, 0xA06C, 0xA06D, 0xA06E, 0xA06F,
+ 0xA070, 0xA071, 0xA072, 0xA073, 0xA074, 0xA075,
+ 0xA076, 0xA077, 0xA078, 0xA079, 0xA07A, 0xA07B,
+ 0xA07C, 0xA07D, 0xA07E, 0xA080, 0xA081, 0xECDF,
+ 0xA082, 0xA083, 0xA084, 0xA085, 0xA086, 0xA087,
+ 0xA088, 0xA089, 0xA08A, 0xA08B, 0xECE0, 0xA08C,
+ 0xD7A6, 0xA08D, 0xC5C0, 0xA08E, 0xA08F, 0xA090,
+ 0xEBBC, 0xB0AE, 0xA091, 0xA092, 0xA093, 0xBEF4,
+ 0xB8B8, 0xD2AF, 0xB0D6, 0xB5F9, 0xA094, 0xD8B3,
+ 0xA095, 0xCBAC, 0xA096, 0xE3DD, 0xA097, 0xA098,
+ 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D, 0xC6AC,
+ 0xB0E6, 0xA09E, 0xA09F, 0xA0A0, 0xC5C6, 0xEBB9,
+ 0xA0A1, 0xA0A2, 0xA0A3, 0xA0A4, 0xEBBA, 0xA0A5,
+ 0xA0A6, 0xA0A7, 0xEBBB, 0xA0A8, 0xA0A9, 0xD1C0,
+ 0xA0AA, 0xC5A3, 0xA0AB, 0xEAF2, 0xA0AC, 0xC4B2,
+ 0xA0AD, 0xC4B5, 0xC0CE, 0xA0AE, 0xA0AF, 0xA0B0,
+ 0xEAF3, 0xC4C1, 0xA0B1, 0xCEEF, 0xA0B2, 0xA0B3,
+ 0xA0B4, 0xA0B5, 0xEAF0, 0xEAF4, 0xA0B6, 0xA0B7,
+ 0xC9FC, 0xA0B8, 0xA0B9, 0xC7A3, 0xA0BA, 0xA0BB,
+ 0xA0BC, 0xCCD8, 0xCEFE, 0xA0BD, 0xA0BE, 0xA0BF,
+ 0xEAF5, 0xEAF6, 0xCFAC, 0xC0E7, 0xA0C0, 0xA0C1,
+ 0xEAF7, 0xA0C2, 0xA0C3, 0xA0C4, 0xA0C5, 0xA0C6,
+ 0xB6BF, 0xEAF8, 0xA0C7, 0xEAF9, 0xA0C8, 0xEAFA,
+ 0xA0C9, 0xA0CA, 0xEAFB, 0xA0CB, 0xA0CC, 0xA0CD,
+ 0xA0CE, 0xA0CF, 0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3,
+ 0xA0D4, 0xA0D5, 0xA0D6, 0xEAF1, 0xA0D7, 0xA0D8,
+ 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, 0xA0DE,
+ 0xA0DF, 0xA0E0, 0xA0E1, 0xA0E2, 0xC8AE, 0xE1EB,
+ 0xA0E3, 0xB7B8, 0xE1EC, 0xA0E4, 0xA0E5, 0xA0E6,
+ 0xE1ED, 0xA0E7, 0xD7B4, 0xE1EE, 0xE1EF, 0xD3CC,
+ 0xA0E8, 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED,
+ 0xA0EE, 0xE1F1, 0xBFF1, 0xE1F0, 0xB5D2, 0xA0EF,
+ 0xA0F0, 0xA0F1, 0xB1B7, 0xA0F2, 0xA0F3, 0xA0F4,
+ 0xA0F5, 0xE1F3, 0xE1F2, 0xA0F6, 0xBAFC, 0xA0F7,
+ 0xE1F4, 0xA0F8, 0xA0F9, 0xA0FA, 0xA0FB, 0xB9B7,
+ 0xA0FC, 0xBED1, 0xA0FD, 0xA0FE, 0xAA40, 0xAA41,
+ 0xC4FC, 0xAA42, 0xBADD, 0xBDC6, 0xAA43, 0xAA44,
+ 0xAA45, 0xAA46, 0xAA47, 0xAA48, 0xE1F5, 0xE1F7,
+ 0xAA49, 0xAA4A, 0xB6C0, 0xCFC1, 0xCAA8, 0xE1F6,
+ 0xD5F8, 0xD3FC, 0xE1F8, 0xE1FC, 0xE1F9, 0xAA4B,
+ 0xAA4C, 0xE1FA, 0xC0EA, 0xAA4D, 0xE1FE, 0xE2A1,
+ 0xC0C7, 0xAA4E, 0xAA4F, 0xAA50, 0xAA51, 0xE1FB,
+ 0xAA52, 0xE1FD, 0xAA53, 0xAA54, 0xAA55, 0xAA56,
+ 0xAA57, 0xAA58, 0xE2A5, 0xAA59, 0xAA5A, 0xAA5B,
+ 0xC1D4, 0xAA5C, 0xAA5D, 0xAA5E, 0xAA5F, 0xE2A3,
+ 0xAA60, 0xE2A8, 0xB2FE, 0xE2A2, 0xAA61, 0xAA62,
+ 0xAA63, 0xC3CD, 0xB2C2, 0xE2A7, 0xE2A6, 0xAA64,
+ 0xAA65, 0xE2A4, 0xE2A9, 0xAA66, 0xAA67, 0xE2AB,
+ 0xAA68, 0xAA69, 0xAA6A, 0xD0C9, 0xD6ED, 0xC3A8,
+ 0xE2AC, 0xAA6B, 0xCFD7, 0xAA6C, 0xAA6D, 0xE2AE,
+ 0xAA6E, 0xAA6F, 0xBAEF, 0xAA70, 0xAA71, 0xE9E0,
+ 0xE2AD, 0xE2AA, 0xAA72, 0xAA73, 0xAA74, 0xAA75,
+ 0xBBAB, 0xD4B3, 0xAA76, 0xAA77, 0xAA78, 0xAA79,
+ 0xAA7A, 0xAA7B, 0xAA7C, 0xAA7D, 0xAA7E, 0xAA80,
+ 0xAA81, 0xAA82, 0xAA83, 0xE2B0, 0xAA84, 0xAA85,
+ 0xE2AF, 0xAA86, 0xE9E1, 0xAA87, 0xAA88, 0xAA89,
+ 0xAA8A, 0xE2B1, 0xAA8B, 0xAA8C, 0xAA8D, 0xAA8E,
+ 0xAA8F, 0xAA90, 0xAA91, 0xAA92, 0xE2B2, 0xAA93,
+ 0xAA94, 0xAA95, 0xAA96, 0xAA97, 0xAA98, 0xAA99,
+ 0xAA9A, 0xAA9B, 0xAA9C, 0xAA9D, 0xE2B3, 0xCCA1,
+ 0xAA9E, 0xE2B4, 0xAA9F, 0xAAA0, 0xAB40, 0xAB41,
+ 0xAB42, 0xAB43, 0xAB44, 0xAB45, 0xAB46, 0xAB47,
+ 0xAB48, 0xAB49, 0xAB4A, 0xAB4B, 0xE2B5, 0xAB4C,
+ 0xAB4D, 0xAB4E, 0xAB4F, 0xAB50, 0xD0FE, 0xAB51,
+ 0xAB52, 0xC2CA, 0xAB53, 0xD3F1, 0xAB54, 0xCDF5,
+ 0xAB55, 0xAB56, 0xE7E0, 0xAB57, 0xAB58, 0xE7E1,
+ 0xAB59, 0xAB5A, 0xAB5B, 0xAB5C, 0xBEC1, 0xAB5D,
+ 0xAB5E, 0xAB5F, 0xAB60, 0xC2EA, 0xAB61, 0xAB62,
+ 0xAB63, 0xE7E4, 0xAB64, 0xAB65, 0xE7E3, 0xAB66,
+ 0xAB67, 0xAB68, 0xAB69, 0xAB6A, 0xAB6B, 0xCDE6,
+ 0xAB6C, 0xC3B5, 0xAB6D, 0xAB6E, 0xE7E2, 0xBBB7,
+ 0xCFD6, 0xAB6F, 0xC1E1, 0xE7E9, 0xAB70, 0xAB71,
+ 0xAB72, 0xE7E8, 0xAB73, 0xAB74, 0xE7F4, 0xB2A3,
+ 0xAB75, 0xAB76, 0xAB77, 0xAB78, 0xE7EA, 0xAB79,
+ 0xE7E6, 0xAB7A, 0xAB7B, 0xAB7C, 0xAB7D, 0xAB7E,
+ 0xE7EC, 0xE7EB, 0xC9BA, 0xAB80, 0xAB81, 0xD5E4,
+ 0xAB82, 0xE7E5, 0xB7A9, 0xE7E7, 0xAB83, 0xAB84,
+ 0xAB85, 0xAB86, 0xAB87, 0xAB88, 0xAB89, 0xE7EE,
+ 0xAB8A, 0xAB8B, 0xAB8C, 0xAB8D, 0xE7F3, 0xAB8E,
+ 0xD6E9, 0xAB8F, 0xAB90, 0xAB91, 0xAB92, 0xE7ED,
+ 0xAB93, 0xE7F2, 0xAB94, 0xE7F1, 0xAB95, 0xAB96,
+ 0xAB97, 0xB0E0, 0xAB98, 0xAB99, 0xAB9A, 0xAB9B,
+ 0xE7F5, 0xAB9C, 0xAB9D, 0xAB9E, 0xAB9F, 0xABA0,
+ 0xAC40, 0xAC41, 0xAC42, 0xAC43, 0xAC44, 0xAC45,
+ 0xAC46, 0xAC47, 0xAC48, 0xAC49, 0xAC4A, 0xC7F2,
+ 0xAC4B, 0xC0C5, 0xC0ED, 0xAC4C, 0xAC4D, 0xC1F0,
+ 0xE7F0, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xE7F6,
+ 0xCBF6, 0xAC52, 0xAC53, 0xAC54, 0xAC55, 0xAC56,
+ 0xAC57, 0xAC58, 0xAC59, 0xAC5A, 0xE8A2, 0xE8A1,
+ 0xAC5B, 0xAC5C, 0xAC5D, 0xAC5E, 0xAC5F, 0xAC60,
+ 0xD7C1, 0xAC61, 0xAC62, 0xE7FA, 0xE7F9, 0xAC63,
+ 0xE7FB, 0xAC64, 0xE7F7, 0xAC65, 0xE7FE, 0xAC66,
+ 0xE7FD, 0xAC67, 0xE7FC, 0xAC68, 0xAC69, 0xC1D5,
+ 0xC7D9, 0xC5FD, 0xC5C3, 0xAC6A, 0xAC6B, 0xAC6C,
+ 0xAC6D, 0xAC6E, 0xC7ED, 0xAC6F, 0xAC70, 0xAC71,
+ 0xAC72, 0xE8A3, 0xAC73, 0xAC74, 0xAC75, 0xAC76,
+ 0xAC77, 0xAC78, 0xAC79, 0xAC7A, 0xAC7B, 0xAC7C,
+ 0xAC7D, 0xAC7E, 0xAC80, 0xAC81, 0xAC82, 0xAC83,
+ 0xAC84, 0xAC85, 0xAC86, 0xE8A6, 0xAC87, 0xE8A5,
+ 0xAC88, 0xE8A7, 0xBAF7, 0xE7F8, 0xE8A4, 0xAC89,
+ 0xC8F0, 0xC9AA, 0xAC8A, 0xAC8B, 0xAC8C, 0xAC8D,
+ 0xAC8E, 0xAC8F, 0xAC90, 0xAC91, 0xAC92, 0xAC93,
+ 0xAC94, 0xAC95, 0xAC96, 0xE8A9, 0xAC97, 0xAC98,
+ 0xB9E5, 0xAC99, 0xAC9A, 0xAC9B, 0xAC9C, 0xAC9D,
+ 0xD1FE, 0xE8A8, 0xAC9E, 0xAC9F, 0xACA0, 0xAD40,
+ 0xAD41, 0xAD42, 0xE8AA, 0xAD43, 0xE8AD, 0xE8AE,
+ 0xAD44, 0xC1A7, 0xAD45, 0xAD46, 0xAD47, 0xE8AF,
+ 0xAD48, 0xAD49, 0xAD4A, 0xE8B0, 0xAD4B, 0xAD4C,
+ 0xE8AC, 0xAD4D, 0xE8B4, 0xAD4E, 0xAD4F, 0xAD50,
+ 0xAD51, 0xAD52, 0xAD53, 0xAD54, 0xAD55, 0xAD56,
+ 0xAD57, 0xAD58, 0xE8AB, 0xAD59, 0xE8B1, 0xAD5A,
+ 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E, 0xAD5F, 0xAD60,
+ 0xAD61, 0xE8B5, 0xE8B2, 0xE8B3, 0xAD62, 0xAD63,
+ 0xAD64, 0xAD65, 0xAD66, 0xAD67, 0xAD68, 0xAD69,
+ 0xAD6A, 0xAD6B, 0xAD6C, 0xAD6D, 0xAD6E, 0xAD6F,
+ 0xAD70, 0xAD71, 0xE8B7, 0xAD72, 0xAD73, 0xAD74,
+ 0xAD75, 0xAD76, 0xAD77, 0xAD78, 0xAD79, 0xAD7A,
+ 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7E, 0xAD80, 0xAD81,
+ 0xAD82, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87,
+ 0xAD88, 0xAD89, 0xE8B6, 0xAD8A, 0xAD8B, 0xAD8C,
+ 0xAD8D, 0xAD8E, 0xAD8F, 0xAD90, 0xAD91, 0xAD92,
+ 0xB9CF, 0xAD93, 0xF0AC, 0xAD94, 0xF0AD, 0xAD95,
+ 0xC6B0, 0xB0EA, 0xC8BF, 0xAD96, 0xCDDF, 0xAD97,
+ 0xAD98, 0xAD99, 0xAD9A, 0xAD9B, 0xAD9C, 0xAD9D,
+ 0xCECD, 0xEAB1, 0xAD9E, 0xAD9F, 0xADA0, 0xAE40,
+ 0xEAB2, 0xAE41, 0xC6BF, 0xB4C9, 0xAE42, 0xAE43,
+ 0xAE44, 0xAE45, 0xAE46, 0xAE47, 0xAE48, 0xEAB3,
+ 0xAE49, 0xAE4A, 0xAE4B, 0xAE4C, 0xD5E7, 0xAE4D,
+ 0xAE4E, 0xAE4F, 0xAE50, 0xAE51, 0xAE52, 0xAE53,
+ 0xAE54, 0xDDF9, 0xAE55, 0xEAB4, 0xAE56, 0xEAB5,
+ 0xAE57, 0xEAB6, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B,
+ 0xB8CA, 0xDFB0, 0xC9F5, 0xAE5C, 0xCCF0, 0xAE5D,
+ 0xAE5E, 0xC9FA, 0xAE5F, 0xAE60, 0xAE61, 0xAE62,
+ 0xAE63, 0xC9FB, 0xAE64, 0xAE65, 0xD3C3, 0xCBA6,
+ 0xAE66, 0xB8A6, 0xF0AE, 0xB1C2, 0xAE67, 0xE5B8,
+ 0xCCEF, 0xD3C9, 0xBCD7, 0xC9EA, 0xAE68, 0xB5E7,
+ 0xAE69, 0xC4D0, 0xB5E9, 0xAE6A, 0xEEAE, 0xBBAD,
+ 0xAE6B, 0xAE6C, 0xE7DE, 0xAE6D, 0xEEAF, 0xAE6E,
+ 0xAE6F, 0xAE70, 0xAE71, 0xB3A9, 0xAE72, 0xAE73,
+ 0xEEB2, 0xAE74, 0xAE75, 0xEEB1, 0xBDE7, 0xAE76,
+ 0xEEB0, 0xCEB7, 0xAE77, 0xAE78, 0xAE79, 0xAE7A,
+ 0xC5CF, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE7E, 0xC1F4,
+ 0xDBCE, 0xEEB3, 0xD0F3, 0xAE80, 0xAE81, 0xAE82,
+ 0xAE83, 0xAE84, 0xAE85, 0xAE86, 0xAE87, 0xC2D4,
+ 0xC6E8, 0xAE88, 0xAE89, 0xAE8A, 0xB7AC, 0xAE8B,
+ 0xAE8C, 0xAE8D, 0xAE8E, 0xAE8F, 0xAE90, 0xAE91,
+ 0xEEB4, 0xAE92, 0xB3EB, 0xAE93, 0xAE94, 0xAE95,
+ 0xBBFB, 0xEEB5, 0xAE96, 0xAE97, 0xAE98, 0xAE99,
+ 0xAE9A, 0xE7DC, 0xAE9B, 0xAE9C, 0xAE9D, 0xEEB6,
+ 0xAE9E, 0xAE9F, 0xBDAE, 0xAEA0, 0xAF40, 0xAF41,
+ 0xAF42, 0xF1E2, 0xAF43, 0xAF44, 0xAF45, 0xCAE8,
+ 0xAF46, 0xD2C9, 0xF0DA, 0xAF47, 0xF0DB, 0xAF48,
+ 0xF0DC, 0xC1C6, 0xAF49, 0xB8ED, 0xBECE, 0xAF4A,
+ 0xAF4B, 0xF0DE, 0xAF4C, 0xC5B1, 0xF0DD, 0xD1F1,
+ 0xAF4D, 0xF0E0, 0xB0CC, 0xBDEA, 0xAF4E, 0xAF4F,
+ 0xAF50, 0xAF51, 0xAF52, 0xD2DF, 0xF0DF, 0xAF53,
+ 0xB4AF, 0xB7E8, 0xF0E6, 0xF0E5, 0xC6A3, 0xF0E1,
+ 0xF0E2, 0xB4C3, 0xAF54, 0xAF55, 0xF0E3, 0xD5EE,
+ 0xAF56, 0xAF57, 0xCCDB, 0xBED2, 0xBCB2, 0xAF58,
+ 0xAF59, 0xAF5A, 0xF0E8, 0xF0E7, 0xF0E4, 0xB2A1,
+ 0xAF5B, 0xD6A2, 0xD3B8, 0xBEB7, 0xC8AC, 0xAF5C,
+ 0xAF5D, 0xF0EA, 0xAF5E, 0xAF5F, 0xAF60, 0xAF61,
+ 0xD1F7, 0xAF62, 0xD6CC, 0xBADB, 0xF0E9, 0xAF63,
+ 0xB6BB, 0xAF64, 0xAF65, 0xCDB4, 0xAF66, 0xAF67,
+ 0xC6A6, 0xAF68, 0xAF69, 0xAF6A, 0xC1A1, 0xF0EB,
+ 0xF0EE, 0xAF6B, 0xF0ED, 0xF0F0, 0xF0EC, 0xAF6C,
+ 0xBBBE, 0xF0EF, 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70,
+ 0xCCB5, 0xF0F2, 0xAF71, 0xAF72, 0xB3D5, 0xAF73,
+ 0xAF74, 0xAF75, 0xAF76, 0xB1D4, 0xAF77, 0xAF78,
+ 0xF0F3, 0xAF79, 0xAF7A, 0xF0F4, 0xF0F6, 0xB4E1,
+ 0xAF7B, 0xF0F1, 0xAF7C, 0xF0F7, 0xAF7D, 0xAF7E,
+ 0xAF80, 0xAF81, 0xF0FA, 0xAF82, 0xF0F8, 0xAF83,
+ 0xAF84, 0xAF85, 0xF0F5, 0xAF86, 0xAF87, 0xAF88,
+ 0xAF89, 0xF0FD, 0xAF8A, 0xF0F9, 0xF0FC, 0xF0FE,
+ 0xAF8B, 0xF1A1, 0xAF8C, 0xAF8D, 0xAF8E, 0xCEC1,
+ 0xF1A4, 0xAF8F, 0xF1A3, 0xAF90, 0xC1F6, 0xF0FB,
+ 0xCADD, 0xAF91, 0xAF92, 0xB4F1, 0xB1F1, 0xCCB1,
+ 0xAF93, 0xF1A6, 0xAF94, 0xAF95, 0xF1A7, 0xAF96,
+ 0xAF97, 0xF1AC, 0xD5CE, 0xF1A9, 0xAF98, 0xAF99,
+ 0xC8B3, 0xAF9A, 0xAF9B, 0xAF9C, 0xF1A2, 0xAF9D,
+ 0xF1AB, 0xF1A8, 0xF1A5, 0xAF9E, 0xAF9F, 0xF1AA,
+ 0xAFA0, 0xB040, 0xB041, 0xB042, 0xB043, 0xB044,
+ 0xB045, 0xB046, 0xB0A9, 0xF1AD, 0xB047, 0xB048,
+ 0xB049, 0xB04A, 0xB04B, 0xB04C, 0xF1AF, 0xB04D,
+ 0xF1B1, 0xB04E, 0xB04F, 0xB050, 0xB051, 0xB052,
+ 0xF1B0, 0xB053, 0xF1AE, 0xB054, 0xB055, 0xB056,
+ 0xB057, 0xD1A2, 0xB058, 0xB059, 0xB05A, 0xB05B,
+ 0xB05C, 0xB05D, 0xB05E, 0xF1B2, 0xB05F, 0xB060,
+ 0xB061, 0xF1B3, 0xB062, 0xB063, 0xB064, 0xB065,
+ 0xB066, 0xB067, 0xB068, 0xB069, 0xB9EF, 0xB06A,
+ 0xB06B, 0xB5C7, 0xB06C, 0xB0D7, 0xB0D9, 0xB06D,
+ 0xB06E, 0xB06F, 0xD4ED, 0xB070, 0xB5C4, 0xB071,
+ 0xBDD4, 0xBBCA, 0xF0A7, 0xB072, 0xB073, 0xB8DE,
+ 0xB074, 0xB075, 0xF0A8, 0xB076, 0xB077, 0xB0A8,
+ 0xB078, 0xF0A9, 0xB079, 0xB07A, 0xCDEE, 0xB07B,
+ 0xB07C, 0xF0AA, 0xB07D, 0xB07E, 0xB080, 0xB081,
+ 0xB082, 0xB083, 0xB084, 0xB085, 0xB086, 0xB087,
+ 0xF0AB, 0xB088, 0xB089, 0xB08A, 0xB08B, 0xB08C,
+ 0xB08D, 0xB08E, 0xB08F, 0xB090, 0xC6A4, 0xB091,
+ 0xB092, 0xD6E5, 0xF1E4, 0xB093, 0xF1E5, 0xB094,
+ 0xB095, 0xB096, 0xB097, 0xB098, 0xB099, 0xB09A,
+ 0xB09B, 0xB09C, 0xB09D, 0xC3F3, 0xB09E, 0xB09F,
+ 0xD3DB, 0xB0A0, 0xB140, 0xD6D1, 0xC5E8, 0xB141,
+ 0xD3AF, 0xB142, 0xD2E6, 0xB143, 0xB144, 0xEEC1,
+ 0xB0BB, 0xD5B5, 0xD1CE, 0xBCE0, 0xBAD0, 0xB145,
+ 0xBFF8, 0xB146, 0xB8C7, 0xB5C1, 0xC5CC, 0xB147,
+ 0xB148, 0xCAA2, 0xB149, 0xB14A, 0xB14B, 0xC3CB,
+ 0xB14C, 0xB14D, 0xB14E, 0xB14F, 0xB150, 0xEEC2,
+ 0xB151, 0xB152, 0xB153, 0xB154, 0xB155, 0xB156,
+ 0xB157, 0xB158, 0xC4BF, 0xB6A2, 0xB159, 0xEDEC,
+ 0xC3A4, 0xB15A, 0xD6B1, 0xB15B, 0xB15C, 0xB15D,
+ 0xCFE0, 0xEDEF, 0xB15E, 0xB15F, 0xC5CE, 0xB160,
+ 0xB6DC, 0xB161, 0xB162, 0xCAA1, 0xB163, 0xB164,
+ 0xEDED, 0xB165, 0xB166, 0xEDF0, 0xEDF1, 0xC3BC,
+ 0xB167, 0xBFB4, 0xB168, 0xEDEE, 0xB169, 0xB16A,
+ 0xB16B, 0xB16C, 0xB16D, 0xB16E, 0xB16F, 0xB170,
+ 0xB171, 0xB172, 0xB173, 0xEDF4, 0xEDF2, 0xB174,
+ 0xB175, 0xB176, 0xB177, 0xD5E6, 0xC3DF, 0xB178,
+ 0xEDF3, 0xB179, 0xB17A, 0xB17B, 0xEDF6, 0xB17C,
+ 0xD5A3, 0xD1A3, 0xB17D, 0xB17E, 0xB180, 0xEDF5,
+ 0xB181, 0xC3D0, 0xB182, 0xB183, 0xB184, 0xB185,
+ 0xB186, 0xEDF7, 0xBFF4, 0xBEEC, 0xEDF8, 0xB187,
+ 0xCCF7, 0xB188, 0xD1DB, 0xB189, 0xB18A, 0xB18B,
+ 0xD7C5, 0xD5F6, 0xB18C, 0xEDFC, 0xB18D, 0xB18E,
+ 0xB18F, 0xEDFB, 0xB190, 0xB191, 0xB192, 0xB193,
+ 0xB194, 0xB195, 0xB196, 0xB197, 0xEDF9, 0xEDFA,
+ 0xB198, 0xB199, 0xB19A, 0xB19B, 0xB19C, 0xB19D,
+ 0xB19E, 0xB19F, 0xEDFD, 0xBEA6, 0xB1A0, 0xB240,
+ 0xB241, 0xB242, 0xB243, 0xCBAF, 0xEEA1, 0xB6BD,
+ 0xB244, 0xEEA2, 0xC4C0, 0xB245, 0xEDFE, 0xB246,
+ 0xB247, 0xBDDE, 0xB2C7, 0xB248, 0xB249, 0xB24A,
+ 0xB24B, 0xB24C, 0xB24D, 0xB24E, 0xB24F, 0xB250,
+ 0xB251, 0xB252, 0xB253, 0xB6C3, 0xB254, 0xB255,
+ 0xB256, 0xEEA5, 0xD8BA, 0xEEA3, 0xEEA6, 0xB257,
+ 0xB258, 0xB259, 0xC3E9, 0xB3F2, 0xB25A, 0xB25B,
+ 0xB25C, 0xB25D, 0xB25E, 0xB25F, 0xEEA7, 0xEEA4,
+ 0xCFB9, 0xB260, 0xB261, 0xEEA8, 0xC2F7, 0xB262,
+ 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB268,
+ 0xB269, 0xB26A, 0xB26B, 0xB26C, 0xB26D, 0xEEA9,
+ 0xEEAA, 0xB26E, 0xDEAB, 0xB26F, 0xB270, 0xC6B3,
+ 0xB271, 0xC7C6, 0xB272, 0xD6F5, 0xB5C9, 0xB273,
+ 0xCBB2, 0xB274, 0xB275, 0xB276, 0xEEAB, 0xB277,
+ 0xB278, 0xCDAB, 0xB279, 0xEEAC, 0xB27A, 0xB27B,
+ 0xB27C, 0xB27D, 0xB27E, 0xD5B0, 0xB280, 0xEEAD,
+ 0xB281, 0xF6C4, 0xB282, 0xB283, 0xB284, 0xB285,
+ 0xB286, 0xB287, 0xB288, 0xB289, 0xB28A, 0xB28B,
+ 0xB28C, 0xB28D, 0xB28E, 0xDBC7, 0xB28F, 0xB290,
+ 0xB291, 0xB292, 0xB293, 0xB294, 0xB295, 0xB296,
+ 0xB297, 0xB4A3, 0xB298, 0xB299, 0xB29A, 0xC3AC,
+ 0xF1E6, 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F,
+ 0xCAB8, 0xD2D3, 0xB2A0, 0xD6AA, 0xB340, 0xEFF2,
+ 0xB341, 0xBED8, 0xB342, 0xBDC3, 0xEFF3, 0xB6CC,
+ 0xB0AB, 0xB343, 0xB344, 0xB345, 0xB346, 0xCAAF,
+ 0xB347, 0xB348, 0xEDB6, 0xB349, 0xEDB7, 0xB34A,
+ 0xB34B, 0xB34C, 0xB34D, 0xCEF9, 0xB7AF, 0xBFF3,
+ 0xEDB8, 0xC2EB, 0xC9B0, 0xB34E, 0xB34F, 0xB350,
+ 0xB351, 0xB352, 0xB353, 0xEDB9, 0xB354, 0xB355,
+ 0xC6F6, 0xBFB3, 0xB356, 0xB357, 0xB358, 0xEDBC,
+ 0xC5F8, 0xB359, 0xD1D0, 0xB35A, 0xD7A9, 0xEDBA,
+ 0xEDBB, 0xB35B, 0xD1E2, 0xB35C, 0xEDBF, 0xEDC0,
+ 0xB35D, 0xEDC4, 0xB35E, 0xB35F, 0xB360, 0xEDC8,
+ 0xB361, 0xEDC6, 0xEDCE, 0xD5E8, 0xB362, 0xEDC9,
+ 0xB363, 0xB364, 0xEDC7, 0xEDBE, 0xB365, 0xB366,
+ 0xC5E9, 0xB367, 0xB368, 0xB369, 0xC6C6, 0xB36A,
+ 0xB36B, 0xC9E9, 0xD4D2, 0xEDC1, 0xEDC2, 0xEDC3,
+ 0xEDC5, 0xB36C, 0xC0F9, 0xB36D, 0xB4A1, 0xB36E,
+ 0xB36F, 0xB370, 0xB371, 0xB9E8, 0xB372, 0xEDD0,
+ 0xB373, 0xB374, 0xB375, 0xB376, 0xEDD1, 0xB377,
+ 0xEDCA, 0xB378, 0xEDCF, 0xB379, 0xCEF8, 0xB37A,
+ 0xB37B, 0xCBB6, 0xEDCC, 0xEDCD, 0xB37C, 0xB37D,
+ 0xB37E, 0xB380, 0xB381, 0xCFF5, 0xB382, 0xB383,
+ 0xB384, 0xB385, 0xB386, 0xB387, 0xB388, 0xB389,
+ 0xB38A, 0xB38B, 0xB38C, 0xB38D, 0xEDD2, 0xC1F2,
+ 0xD3B2, 0xEDCB, 0xC8B7, 0xB38E, 0xB38F, 0xB390,
+ 0xB391, 0xB392, 0xB393, 0xB394, 0xB395, 0xBCEF,
+ 0xB396, 0xB397, 0xB398, 0xB399, 0xC5F0, 0xB39A,
+ 0xB39B, 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A0,
+ 0xB440, 0xB441, 0xB442, 0xEDD6, 0xB443, 0xB5EF,
+ 0xB444, 0xB445, 0xC2B5, 0xB0AD, 0xCBE9, 0xB446,
+ 0xB447, 0xB1AE, 0xB448, 0xEDD4, 0xB449, 0xB44A,
+ 0xB44B, 0xCDEB, 0xB5E2, 0xB44C, 0xEDD5, 0xEDD3,
+ 0xEDD7, 0xB44D, 0xB44E, 0xB5FA, 0xB44F, 0xEDD8,
+ 0xB450, 0xEDD9, 0xB451, 0xEDDC, 0xB452, 0xB1CC,
+ 0xB453, 0xB454, 0xB455, 0xB456, 0xB457, 0xB458,
+ 0xB459, 0xB45A, 0xC5F6, 0xBCEE, 0xEDDA, 0xCCBC,
+ 0xB2EA, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xEDDB,
+ 0xB45F, 0xB460, 0xB461, 0xB462, 0xC4EB, 0xB463,
+ 0xB464, 0xB4C5, 0xB465, 0xB466, 0xB467, 0xB0F5,
+ 0xB468, 0xB469, 0xB46A, 0xEDDF, 0xC0DA, 0xB4E8,
+ 0xB46B, 0xB46C, 0xB46D, 0xB46E, 0xC5CD, 0xB46F,
+ 0xB470, 0xB471, 0xEDDD, 0xBFC4, 0xB472, 0xB473,
+ 0xB474, 0xEDDE, 0xB475, 0xB476, 0xB477, 0xB478,
+ 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, 0xB47E,
+ 0xB480, 0xB481, 0xB482, 0xB483, 0xC4A5, 0xB484,
+ 0xB485, 0xB486, 0xEDE0, 0xB487, 0xB488, 0xB489,
+ 0xB48A, 0xB48B, 0xEDE1, 0xB48C, 0xEDE3, 0xB48D,
+ 0xB48E, 0xC1D7, 0xB48F, 0xB490, 0xBBC7, 0xB491,
+ 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, 0xBDB8,
+ 0xB497, 0xB498, 0xB499, 0xEDE2, 0xB49A, 0xB49B,
+ 0xB49C, 0xB49D, 0xB49E, 0xB49F, 0xB4A0, 0xB540,
+ 0xB541, 0xB542, 0xB543, 0xB544, 0xB545, 0xEDE4,
+ 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54B,
+ 0xB54C, 0xB54D, 0xB54E, 0xB54F, 0xEDE6, 0xB550,
+ 0xB551, 0xB552, 0xB553, 0xB554, 0xEDE5, 0xB555,
+ 0xB556, 0xB557, 0xB558, 0xB559, 0xB55A, 0xB55B,
+ 0xB55C, 0xB55D, 0xB55E, 0xB55F, 0xB560, 0xB561,
+ 0xB562, 0xB563, 0xEDE7, 0xB564, 0xB565, 0xB566,
+ 0xB567, 0xB568, 0xCABE, 0xECEA, 0xC0F1, 0xB569,
+ 0xC9E7, 0xB56A, 0xECEB, 0xC6EE, 0xB56B, 0xB56C,
+ 0xB56D, 0xB56E, 0xECEC, 0xB56F, 0xC6ED, 0xECED,
+ 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575,
+ 0xB576, 0xB577, 0xB578, 0xECF0, 0xB579, 0xB57A,
+ 0xD7E6, 0xECF3, 0xB57B, 0xB57C, 0xECF1, 0xECEE,
+ 0xECEF, 0xD7A3, 0xC9F1, 0xCBEE, 0xECF4, 0xB57D,
+ 0xECF2, 0xB57E, 0xB580, 0xCFE9, 0xB581, 0xECF6,
+ 0xC6B1, 0xB582, 0xB583, 0xB584, 0xB585, 0xBCC0,
+ 0xB586, 0xECF5, 0xB587, 0xB588, 0xB589, 0xB58A,
+ 0xB58B, 0xB58C, 0xB58D, 0xB5BB, 0xBBF6, 0xB58E,
+ 0xECF7, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593,
+ 0xD9F7, 0xBDFB, 0xB594, 0xB595, 0xC2BB, 0xECF8,
+ 0xB596, 0xB597, 0xB598, 0xB599, 0xECF9, 0xB59A,
+ 0xB59B, 0xB59C, 0xB59D, 0xB8A3, 0xB59E, 0xB59F,
+ 0xB5A0, 0xB640, 0xB641, 0xB642, 0xB643, 0xB644,
+ 0xB645, 0xB646, 0xECFA, 0xB647, 0xB648, 0xB649,
+ 0xB64A, 0xB64B, 0xB64C, 0xB64D, 0xB64E, 0xB64F,
+ 0xB650, 0xB651, 0xB652, 0xECFB, 0xB653, 0xB654,
+ 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A,
+ 0xB65B, 0xB65C, 0xB65D, 0xECFC, 0xB65E, 0xB65F,
+ 0xB660, 0xB661, 0xB662, 0xD3ED, 0xD8AE, 0xC0EB,
+ 0xB663, 0xC7DD, 0xBACC, 0xB664, 0xD0E3, 0xCBBD,
+ 0xB665, 0xCDBA, 0xB666, 0xB667, 0xB8D1, 0xB668,
+ 0xB669, 0xB1FC, 0xB66A, 0xC7EF, 0xB66B, 0xD6D6,
+ 0xB66C, 0xB66D, 0xB66E, 0xBFC6, 0xC3EB, 0xB66F,
+ 0xB670, 0xEFF5, 0xB671, 0xB672, 0xC3D8, 0xB673,
+ 0xB674, 0xB675, 0xB676, 0xB677, 0xB678, 0xD7E2,
+ 0xB679, 0xB67A, 0xB67B, 0xEFF7, 0xB3D3, 0xB67C,
+ 0xC7D8, 0xD1ED, 0xB67D, 0xD6C8, 0xB67E, 0xEFF8,
+ 0xB680, 0xEFF6, 0xB681, 0xBBFD, 0xB3C6, 0xB682,
+ 0xB683, 0xB684, 0xB685, 0xB686, 0xB687, 0xB688,
+ 0xBDD5, 0xB689, 0xB68A, 0xD2C6, 0xB68B, 0xBBE0,
+ 0xB68C, 0xB68D, 0xCFA1, 0xB68E, 0xEFFC, 0xEFFB,
+ 0xB68F, 0xB690, 0xEFF9, 0xB691, 0xB692, 0xB693,
+ 0xB694, 0xB3CC, 0xB695, 0xC9D4, 0xCBB0, 0xB696,
+ 0xB697, 0xB698, 0xB699, 0xB69A, 0xEFFE, 0xB69B,
+ 0xB69C, 0xB0DE, 0xB69D, 0xB69E, 0xD6C9, 0xB69F,
+ 0xB6A0, 0xB740, 0xEFFD, 0xB741, 0xB3ED, 0xB742,
+ 0xB743, 0xF6D5, 0xB744, 0xB745, 0xB746, 0xB747,
+ 0xB748, 0xB749, 0xB74A, 0xB74B, 0xB74C, 0xB74D,
+ 0xB74E, 0xB74F, 0xB750, 0xB751, 0xB752, 0xCEC8,
+ 0xB753, 0xB754, 0xB755, 0xF0A2, 0xB756, 0xF0A1,
+ 0xB757, 0xB5BE, 0xBCDA, 0xBBFC, 0xB758, 0xB8E5,
+ 0xB759, 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E,
+ 0xC4C2, 0xB75F, 0xB760, 0xB761, 0xB762, 0xB763,
+ 0xB764, 0xB765, 0xB766, 0xB767, 0xB768, 0xF0A3,
+ 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xCBEB,
+ 0xB76E, 0xB76F, 0xB770, 0xB771, 0xB772, 0xB773,
+ 0xB774, 0xB775, 0xB776, 0xB777, 0xB778, 0xB779,
+ 0xB77A, 0xB77B, 0xB77C, 0xB77D, 0xB77E, 0xB780,
+ 0xB781, 0xB782, 0xB783, 0xB784, 0xB785, 0xB786,
+ 0xF0A6, 0xB787, 0xB788, 0xB789, 0xD1A8, 0xB78A,
+ 0xBEBF, 0xC7EE, 0xF1B6, 0xF1B7, 0xBFD5, 0xB78B,
+ 0xB78C, 0xB78D, 0xB78E, 0xB4A9, 0xF1B8, 0xCDBB,
+ 0xB78F, 0xC7D4, 0xD5AD, 0xB790, 0xF1B9, 0xB791,
+ 0xF1BA, 0xB792, 0xB793, 0xB794, 0xB795, 0xC7CF,
+ 0xB796, 0xB797, 0xB798, 0xD2A4, 0xD6CF, 0xB799,
+ 0xB79A, 0xF1BB, 0xBDD1, 0xB4B0, 0xBEBD, 0xB79B,
+ 0xB79C, 0xB79D, 0xB4DC, 0xCED1, 0xB79E, 0xBFDF,
+ 0xF1BD, 0xB79F, 0xB7A0, 0xB840, 0xB841, 0xBFFA,
+ 0xF1BC, 0xB842, 0xF1BF, 0xB843, 0xB844, 0xB845,
+ 0xF1BE, 0xF1C0, 0xB846, 0xB847, 0xB848, 0xB849,
+ 0xB84A, 0xF1C1, 0xB84B, 0xB84C, 0xB84D, 0xB84E,
+ 0xB84F, 0xB850, 0xB851, 0xB852, 0xB853, 0xB854,
+ 0xB855, 0xC1FE, 0xB856, 0xB857, 0xB858, 0xB859,
+ 0xB85A, 0xB85B, 0xB85C, 0xB85D, 0xB85E, 0xB85F,
+ 0xB860, 0xC1A2, 0xB861, 0xB862, 0xB863, 0xB864,
+ 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A,
+ 0xCAFA, 0xB86B, 0xB86C, 0xD5BE, 0xB86D, 0xB86E,
+ 0xB86F, 0xB870, 0xBEBA, 0xBEB9, 0xD5C2, 0xB871,
+ 0xB872, 0xBFA2, 0xB873, 0xCDAF, 0xF1B5, 0xB874,
+ 0xB875, 0xB876, 0xB877, 0xB878, 0xB879, 0xBDDF,
+ 0xB87A, 0xB6CB, 0xB87B, 0xB87C, 0xB87D, 0xB87E,
+ 0xB880, 0xB881, 0xB882, 0xB883, 0xB884, 0xD6F1,
+ 0xF3C3, 0xB885, 0xB886, 0xF3C4, 0xB887, 0xB8CD,
+ 0xB888, 0xB889, 0xB88A, 0xF3C6, 0xF3C7, 0xB88B,
+ 0xB0CA, 0xB88C, 0xF3C5, 0xB88D, 0xF3C9, 0xCBF1,
+ 0xB88E, 0xB88F, 0xB890, 0xF3CB, 0xB891, 0xD0A6,
+ 0xB892, 0xB893, 0xB1CA, 0xF3C8, 0xB894, 0xB895,
+ 0xB896, 0xF3CF, 0xB897, 0xB5D1, 0xB898, 0xB899,
+ 0xF3D7, 0xB89A, 0xF3D2, 0xB89B, 0xB89C, 0xB89D,
+ 0xF3D4, 0xF3D3, 0xB7FB, 0xB89E, 0xB1BF, 0xB89F,
+ 0xF3CE, 0xF3CA, 0xB5DA, 0xB8A0, 0xF3D0, 0xB940,
+ 0xB941, 0xF3D1, 0xB942, 0xF3D5, 0xB943, 0xB944,
+ 0xB945, 0xB946, 0xF3CD, 0xB947, 0xBCE3, 0xB948,
+ 0xC1FD, 0xB949, 0xF3D6, 0xB94A, 0xB94B, 0xB94C,
+ 0xB94D, 0xB94E, 0xB94F, 0xF3DA, 0xB950, 0xF3CC,
+ 0xB951, 0xB5C8, 0xB952, 0xBDEE, 0xF3DC, 0xB953,
+ 0xB954, 0xB7A4, 0xBFF0, 0xD6FE, 0xCDB2, 0xB955,
+ 0xB4F0, 0xB956, 0xB2DF, 0xB957, 0xF3D8, 0xB958,
+ 0xF3D9, 0xC9B8, 0xB959, 0xF3DD, 0xB95A, 0xB95B,
+ 0xF3DE, 0xB95C, 0xF3E1, 0xB95D, 0xB95E, 0xB95F,
+ 0xB960, 0xB961, 0xB962, 0xB963, 0xB964, 0xB965,
+ 0xB966, 0xB967, 0xF3DF, 0xB968, 0xB969, 0xF3E3,
+ 0xF3E2, 0xB96A, 0xB96B, 0xF3DB, 0xB96C, 0xBFEA,
+ 0xB96D, 0xB3EF, 0xB96E, 0xF3E0, 0xB96F, 0xB970,
+ 0xC7A9, 0xB971, 0xBCF2, 0xB972, 0xB973, 0xB974,
+ 0xB975, 0xF3EB, 0xB976, 0xB977, 0xB978, 0xB979,
+ 0xB97A, 0xB97B, 0xB97C, 0xB9BF, 0xB97D, 0xB97E,
+ 0xF3E4, 0xB980, 0xB981, 0xB982, 0xB2AD, 0xBBFE,
+ 0xB983, 0xCBE3, 0xB984, 0xB985, 0xB986, 0xB987,
+ 0xF3ED, 0xF3E9, 0xB988, 0xB989, 0xB98A, 0xB9DC,
+ 0xF3EE, 0xB98B, 0xB98C, 0xB98D, 0xF3E5, 0xF3E6,
+ 0xF3EA, 0xC2E1, 0xF3EC, 0xF3EF, 0xF3E8, 0xBCFD,
+ 0xB98E, 0xB98F, 0xB990, 0xCFE4, 0xB991, 0xB992,
+ 0xF3F0, 0xB993, 0xB994, 0xB995, 0xF3E7, 0xB996,
+ 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C,
+ 0xB99D, 0xF3F2, 0xB99E, 0xB99F, 0xB9A0, 0xBA40,
+ 0xD7AD, 0xC6AA, 0xBA41, 0xBA42, 0xBA43, 0xBA44,
+ 0xF3F3, 0xBA45, 0xBA46, 0xBA47, 0xBA48, 0xF3F1,
+ 0xBA49, 0xC2A8, 0xBA4A, 0xBA4B, 0xBA4C, 0xBA4D,
+ 0xBA4E, 0xB8DD, 0xF3F5, 0xBA4F, 0xBA50, 0xF3F4,
+ 0xBA51, 0xBA52, 0xBA53, 0xB4DB, 0xBA54, 0xBA55,
+ 0xBA56, 0xF3F6, 0xF3F7, 0xBA57, 0xBA58, 0xBA59,
+ 0xF3F8, 0xBA5A, 0xBA5B, 0xBA5C, 0xC0BA, 0xBA5D,
+ 0xBA5E, 0xC0E9, 0xBA5F, 0xBA60, 0xBA61, 0xBA62,
+ 0xBA63, 0xC5F1, 0xBA64, 0xBA65, 0xBA66, 0xBA67,
+ 0xF3FB, 0xBA68, 0xF3FA, 0xBA69, 0xBA6A, 0xBA6B,
+ 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA70, 0xB4D8,
+ 0xBA71, 0xBA72, 0xBA73, 0xF3FE, 0xF3F9, 0xBA74,
+ 0xBA75, 0xF3FC, 0xBA76, 0xBA77, 0xBA78, 0xBA79,
+ 0xBA7A, 0xBA7B, 0xF3FD, 0xBA7C, 0xBA7D, 0xBA7E,
+ 0xBA80, 0xBA81, 0xBA82, 0xBA83, 0xBA84, 0xF4A1,
+ 0xBA85, 0xBA86, 0xBA87, 0xBA88, 0xBA89, 0xBA8A,
+ 0xF4A3, 0xBBC9, 0xBA8B, 0xBA8C, 0xF4A2, 0xBA8D,
+ 0xBA8E, 0xBA8F, 0xBA90, 0xBA91, 0xBA92, 0xBA93,
+ 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99,
+ 0xF4A4, 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E,
+ 0xBA9F, 0xB2BE, 0xF4A6, 0xF4A5, 0xBAA0, 0xBB40,
+ 0xBB41, 0xBB42, 0xBB43, 0xBB44, 0xBB45, 0xBB46,
+ 0xBB47, 0xBB48, 0xBB49, 0xBCAE, 0xBB4A, 0xBB4B,
+ 0xBB4C, 0xBB4D, 0xBB4E, 0xBB4F, 0xBB50, 0xBB51,
+ 0xBB52, 0xBB53, 0xBB54, 0xBB55, 0xBB56, 0xBB57,
+ 0xBB58, 0xBB59, 0xBB5A, 0xBB5B, 0xBB5C, 0xBB5D,
+ 0xBB5E, 0xBB5F, 0xBB60, 0xBB61, 0xBB62, 0xBB63,
+ 0xBB64, 0xBB65, 0xBB66, 0xBB67, 0xBB68, 0xBB69,
+ 0xBB6A, 0xBB6B, 0xBB6C, 0xBB6D, 0xBB6E, 0xC3D7,
+ 0xD9E1, 0xBB6F, 0xBB70, 0xBB71, 0xBB72, 0xBB73,
+ 0xBB74, 0xC0E0, 0xF4CC, 0xD7D1, 0xBB75, 0xBB76,
+ 0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C,
+ 0xBB7D, 0xBB7E, 0xBB80, 0xB7DB, 0xBB81, 0xBB82,
+ 0xBB83, 0xBB84, 0xBB85, 0xBB86, 0xBB87, 0xF4CE,
+ 0xC1A3, 0xBB88, 0xBB89, 0xC6C9, 0xBB8A, 0xB4D6,
+ 0xD5B3, 0xBB8B, 0xBB8C, 0xBB8D, 0xF4D0, 0xF4CF,
+ 0xF4D1, 0xCBDA, 0xBB8E, 0xBB8F, 0xF4D2, 0xBB90,
+ 0xD4C1, 0xD6E0, 0xBB91, 0xBB92, 0xBB93, 0xBB94,
+ 0xB7E0, 0xBB95, 0xBB96, 0xBB97, 0xC1B8, 0xBB98,
+ 0xBB99, 0xC1BB, 0xF4D3, 0xBEAC, 0xBB9A, 0xBB9B,
+ 0xBB9C, 0xBB9D, 0xBB9E, 0xB4E2, 0xBB9F, 0xBBA0,
+ 0xF4D4, 0xF4D5, 0xBEAB, 0xBC40, 0xBC41, 0xF4D6,
+ 0xBC42, 0xBC43, 0xBC44, 0xF4DB, 0xBC45, 0xF4D7,
+ 0xF4DA, 0xBC46, 0xBAFD, 0xBC47, 0xF4D8, 0xF4D9,
+ 0xBC48, 0xBC49, 0xBC4A, 0xBC4B, 0xBC4C, 0xBC4D,
+ 0xBC4E, 0xB8E2, 0xCCC7, 0xF4DC, 0xBC4F, 0xB2DA,
+ 0xBC50, 0xBC51, 0xC3D3, 0xBC52, 0xBC53, 0xD4E3,
+ 0xBFB7, 0xBC54, 0xBC55, 0xBC56, 0xBC57, 0xBC58,
+ 0xBC59, 0xBC5A, 0xF4DD, 0xBC5B, 0xBC5C, 0xBC5D,
+ 0xBC5E, 0xBC5F, 0xBC60, 0xC5B4, 0xBC61, 0xBC62,
+ 0xBC63, 0xBC64, 0xBC65, 0xBC66, 0xBC67, 0xBC68,
+ 0xF4E9, 0xBC69, 0xBC6A, 0xCFB5, 0xBC6B, 0xBC6C,
+ 0xBC6D, 0xBC6E, 0xBC6F, 0xBC70, 0xBC71, 0xBC72,
+ 0xBC73, 0xBC74, 0xBC75, 0xBC76, 0xBC77, 0xBC78,
+ 0xCEC9, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D,
+ 0xBC7E, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC84,
+ 0xBC85, 0xBC86, 0xBC87, 0xBC88, 0xBC89, 0xBC8A,
+ 0xBC8B, 0xBC8C, 0xBC8D, 0xBC8E, 0xCBD8, 0xBC8F,
+ 0xCBF7, 0xBC90, 0xBC91, 0xBC92, 0xBC93, 0xBDF4,
+ 0xBC94, 0xBC95, 0xBC96, 0xD7CF, 0xBC97, 0xBC98,
+ 0xBC99, 0xC0DB, 0xBC9A, 0xBC9B, 0xBC9C, 0xBC9D,
+ 0xBC9E, 0xBC9F, 0xBCA0, 0xBD40, 0xBD41, 0xBD42,
+ 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD48,
+ 0xBD49, 0xBD4A, 0xBD4B, 0xBD4C, 0xBD4D, 0xBD4E,
+ 0xBD4F, 0xBD50, 0xBD51, 0xBD52, 0xBD53, 0xBD54,
+ 0xBD55, 0xBD56, 0xBD57, 0xBD58, 0xBD59, 0xBD5A,
+ 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60,
+ 0xBD61, 0xBD62, 0xBD63, 0xBD64, 0xBD65, 0xBD66,
+ 0xBD67, 0xBD68, 0xBD69, 0xBD6A, 0xBD6B, 0xBD6C,
+ 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72,
+ 0xBD73, 0xBD74, 0xBD75, 0xBD76, 0xD0F5, 0xBD77,
+ 0xBD78, 0xBD79, 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D,
+ 0xBD7E, 0xF4EA, 0xBD80, 0xBD81, 0xBD82, 0xBD83,
+ 0xBD84, 0xBD85, 0xBD86, 0xBD87, 0xBD88, 0xBD89,
+ 0xBD8A, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F,
+ 0xBD90, 0xBD91, 0xBD92, 0xBD93, 0xBD94, 0xBD95,
+ 0xBD96, 0xBD97, 0xBD98, 0xBD99, 0xBD9A, 0xBD9B,
+ 0xBD9C, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBE40,
+ 0xBE41, 0xBE42, 0xBE43, 0xBE44, 0xBE45, 0xBE46,
+ 0xBE47, 0xBE48, 0xBE49, 0xBE4A, 0xBE4B, 0xBE4C,
+ 0xF4EB, 0xBE4D, 0xBE4E, 0xBE4F, 0xBE50, 0xBE51,
+ 0xBE52, 0xBE53, 0xF4EC, 0xBE54, 0xBE55, 0xBE56,
+ 0xBE57, 0xBE58, 0xBE59, 0xBE5A, 0xBE5B, 0xBE5C,
+ 0xBE5D, 0xBE5E, 0xBE5F, 0xBE60, 0xBE61, 0xBE62,
+ 0xBE63, 0xBE64, 0xBE65, 0xBE66, 0xBE67, 0xBE68,
+ 0xBE69, 0xBE6A, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E,
+ 0xBE6F, 0xBE70, 0xBE71, 0xBE72, 0xBE73, 0xBE74,
+ 0xBE75, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A,
+ 0xBE7B, 0xBE7C, 0xBE7D, 0xBE7E, 0xBE80, 0xBE81,
+ 0xBE82, 0xBE83, 0xBE84, 0xBE85, 0xBE86, 0xBE87,
+ 0xBE88, 0xBE89, 0xBE8A, 0xBE8B, 0xBE8C, 0xBE8D,
+ 0xBE8E, 0xBE8F, 0xBE90, 0xBE91, 0xBE92, 0xBE93,
+ 0xBE94, 0xBE95, 0xBE96, 0xBE97, 0xBE98, 0xBE99,
+ 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F,
+ 0xBEA0, 0xBF40, 0xBF41, 0xBF42, 0xBF43, 0xBF44,
+ 0xBF45, 0xBF46, 0xBF47, 0xBF48, 0xBF49, 0xBF4A,
+ 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E, 0xBF4F, 0xBF50,
+ 0xBF51, 0xBF52, 0xBF53, 0xBF54, 0xBF55, 0xBF56,
+ 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, 0xBF5C,
+ 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62,
+ 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68,
+ 0xBF69, 0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E,
+ 0xBF6F, 0xBF70, 0xBF71, 0xBF72, 0xBF73, 0xBF74,
+ 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79, 0xBF7A,
+ 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, 0xBF80, 0xF7E3,
+ 0xBF81, 0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xB7B1,
+ 0xBF86, 0xBF87, 0xBF88, 0xBF89, 0xBF8A, 0xF4ED,
+ 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90,
+ 0xBF91, 0xBF92, 0xBF93, 0xBF94, 0xBF95, 0xBF96,
+ 0xBF97, 0xBF98, 0xBF99, 0xBF9A, 0xBF9B, 0xBF9C,
+ 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xC040, 0xC041,
+ 0xC042, 0xC043, 0xC044, 0xC045, 0xC046, 0xC047,
+ 0xC048, 0xC049, 0xC04A, 0xC04B, 0xC04C, 0xC04D,
+ 0xC04E, 0xC04F, 0xC050, 0xC051, 0xC052, 0xC053,
+ 0xC054, 0xC055, 0xC056, 0xC057, 0xC058, 0xC059,
+ 0xC05A, 0xC05B, 0xC05C, 0xC05D, 0xC05E, 0xC05F,
+ 0xC060, 0xC061, 0xC062, 0xC063, 0xD7EB, 0xC064,
+ 0xC065, 0xC066, 0xC067, 0xC068, 0xC069, 0xC06A,
+ 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070,
+ 0xC071, 0xC072, 0xC073, 0xC074, 0xC075, 0xC076,
+ 0xC077, 0xC078, 0xC079, 0xC07A, 0xC07B, 0xF4EE,
+ 0xC07C, 0xC07D, 0xC07E, 0xE6F9, 0xBEC0, 0xE6FA,
+ 0xBAEC, 0xE6FB, 0xCFCB, 0xE6FC, 0xD4BC, 0xBCB6,
+ 0xE6FD, 0xE6FE, 0xBCCD, 0xC8D2, 0xCEB3, 0xE7A1,
+ 0xC080, 0xB4BF, 0xE7A2, 0xC9B4, 0xB8D9, 0xC4C9,
+ 0xC081, 0xD7DD, 0xC2DA, 0xB7D7, 0xD6BD, 0xCEC6,
+ 0xB7C4, 0xC082, 0xC083, 0xC5A6, 0xE7A3, 0xCFDF,
+ 0xE7A4, 0xE7A5, 0xE7A6, 0xC1B7, 0xD7E9, 0xC9F0,
+ 0xCFB8, 0xD6AF, 0xD6D5, 0xE7A7, 0xB0ED, 0xE7A8,
+ 0xE7A9, 0xC9DC, 0xD2EF, 0xBEAD, 0xE7AA, 0xB0F3,
+ 0xC8DE, 0xBDE1, 0xE7AB, 0xC8C6, 0xC084, 0xE7AC,
+ 0xBBE6, 0xB8F8, 0xD1A4, 0xE7AD, 0xC2E7, 0xBEF8,
+ 0xBDCA, 0xCDB3, 0xE7AE, 0xE7AF, 0xBEEE, 0xD0E5,
+ 0xC085, 0xCBE7, 0xCCD0, 0xBCCC, 0xE7B0, 0xBCA8,
+ 0xD0F7, 0xE7B1, 0xC086, 0xD0F8, 0xE7B2, 0xE7B3,
+ 0xB4C2, 0xE7B4, 0xE7B5, 0xC9FE, 0xCEAC, 0xC3E0,
+ 0xE7B7, 0xB1C1, 0xB3F1, 0xC087, 0xE7B8, 0xE7B9,
+ 0xD7DB, 0xD5C0, 0xE7BA, 0xC2CC, 0xD7BA, 0xE7BB,
+ 0xE7BC, 0xE7BD, 0xBCEA, 0xC3E5, 0xC0C2, 0xE7BE,
+ 0xE7BF, 0xBCA9, 0xC088, 0xE7C0, 0xE7C1, 0xE7B6,
+ 0xB6D0, 0xE7C2, 0xC089, 0xE7C3, 0xE7C4, 0xBBBA,
+ 0xB5DE, 0xC2C6, 0xB1E0, 0xE7C5, 0xD4B5, 0xE7C6,
+ 0xB8BF, 0xE7C8, 0xE7C7, 0xB7EC, 0xC08A, 0xE7C9,
+ 0xB2F8, 0xE7CA, 0xE7CB, 0xE7CC, 0xE7CD, 0xE7CE,
+ 0xE7CF, 0xE7D0, 0xD3A7, 0xCBF5, 0xE7D1, 0xE7D2,
+ 0xE7D3, 0xE7D4, 0xC9C9, 0xE7D5, 0xE7D6, 0xE7D7,
+ 0xE7D8, 0xE7D9, 0xBDC9, 0xE7DA, 0xF3BE, 0xC08B,
+ 0xB8D7, 0xC08C, 0xC8B1, 0xC08D, 0xC08E, 0xC08F,
+ 0xC090, 0xC091, 0xC092, 0xC093, 0xF3BF, 0xC094,
+ 0xF3C0, 0xF3C1, 0xC095, 0xC096, 0xC097, 0xC098,
+ 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E,
+ 0xB9DE, 0xCDF8, 0xC09F, 0xC0A0, 0xD8E8, 0xBAB1,
+ 0xC140, 0xC2DE, 0xEEB7, 0xC141, 0xB7A3, 0xC142,
+ 0xC143, 0xC144, 0xC145, 0xEEB9, 0xC146, 0xEEB8,
+ 0xB0D5, 0xC147, 0xC148, 0xC149, 0xC14A, 0xC14B,
+ 0xEEBB, 0xD5D6, 0xD7EF, 0xC14C, 0xC14D, 0xC14E,
+ 0xD6C3, 0xC14F, 0xC150, 0xEEBD, 0xCAF0, 0xC151,
+ 0xEEBC, 0xC152, 0xC153, 0xC154, 0xC155, 0xEEBE,
+ 0xC156, 0xC157, 0xC158, 0xC159, 0xEEC0, 0xC15A,
+ 0xC15B, 0xEEBF, 0xC15C, 0xC15D, 0xC15E, 0xC15F,
+ 0xC160, 0xC161, 0xC162, 0xC163, 0xD1F2, 0xC164,
+ 0xC7BC, 0xC165, 0xC3C0, 0xC166, 0xC167, 0xC168,
+ 0xC169, 0xC16A, 0xB8E1, 0xC16B, 0xC16C, 0xC16D,
+ 0xC16E, 0xC16F, 0xC1E7, 0xC170, 0xC171, 0xF4C6,
+ 0xD0DF, 0xF4C7, 0xC172, 0xCFDB, 0xC173, 0xC174,
+ 0xC8BA, 0xC175, 0xC176, 0xF4C8, 0xC177, 0xC178,
+ 0xC179, 0xC17A, 0xC17B, 0xC17C, 0xC17D, 0xF4C9,
+ 0xF4CA, 0xC17E, 0xF4CB, 0xC180, 0xC181, 0xC182,
+ 0xC183, 0xC184, 0xD9FA, 0xB8FE, 0xC185, 0xC186,
+ 0xE5F1, 0xD3F0, 0xC187, 0xF4E0, 0xC188, 0xCECC,
+ 0xC189, 0xC18A, 0xC18B, 0xB3E1, 0xC18C, 0xC18D,
+ 0xC18E, 0xC18F, 0xF1B4, 0xC190, 0xD2EE, 0xC191,
+ 0xF4E1, 0xC192, 0xC193, 0xC194, 0xC195, 0xC196,
+ 0xCFE8, 0xF4E2, 0xC197, 0xC198, 0xC7CC, 0xC199,
+ 0xC19A, 0xC19B, 0xC19C, 0xC19D, 0xC19E, 0xB5D4,
+ 0xB4E4, 0xF4E4, 0xC19F, 0xC1A0, 0xC240, 0xF4E3,
+ 0xF4E5, 0xC241, 0xC242, 0xF4E6, 0xC243, 0xC244,
+ 0xC245, 0xC246, 0xF4E7, 0xC247, 0xBAB2, 0xB0BF,
+ 0xC248, 0xF4E8, 0xC249, 0xC24A, 0xC24B, 0xC24C,
+ 0xC24D, 0xC24E, 0xC24F, 0xB7AD, 0xD2ED, 0xC250,
+ 0xC251, 0xC252, 0xD2AB, 0xC0CF, 0xC253, 0xBFBC,
+ 0xEBA3, 0xD5DF, 0xEAC8, 0xC254, 0xC255, 0xC256,
+ 0xC257, 0xF1F3, 0xB6F8, 0xCBA3, 0xC258, 0xC259,
+ 0xC4CD, 0xC25A, 0xF1E7, 0xC25B, 0xF1E8, 0xB8FB,
+ 0xF1E9, 0xBAC4, 0xD4C5, 0xB0D2, 0xC25C, 0xC25D,
+ 0xF1EA, 0xC25E, 0xC25F, 0xC260, 0xF1EB, 0xC261,
+ 0xF1EC, 0xC262, 0xC263, 0xF1ED, 0xF1EE, 0xF1EF,
+ 0xF1F1, 0xF1F0, 0xC5D5, 0xC264, 0xC265, 0xC266,
+ 0xC267, 0xC268, 0xC269, 0xF1F2, 0xC26A, 0xB6FA,
+ 0xC26B, 0xF1F4, 0xD2AE, 0xDEC7, 0xCBCA, 0xC26C,
+ 0xC26D, 0xB3DC, 0xC26E, 0xB5A2, 0xC26F, 0xB9A2,
+ 0xC270, 0xC271, 0xC4F4, 0xF1F5, 0xC272, 0xC273,
+ 0xF1F6, 0xC274, 0xC275, 0xC276, 0xC1C4, 0xC1FB,
+ 0xD6B0, 0xF1F7, 0xC277, 0xC278, 0xC279, 0xC27A,
+ 0xF1F8, 0xC27B, 0xC1AA, 0xC27C, 0xC27D, 0xC27E,
+ 0xC6B8, 0xC280, 0xBEDB, 0xC281, 0xC282, 0xC283,
+ 0xC284, 0xC285, 0xC286, 0xC287, 0xC288, 0xC289,
+ 0xC28A, 0xC28B, 0xC28C, 0xC28D, 0xC28E, 0xF1F9,
+ 0xB4CF, 0xC28F, 0xC290, 0xC291, 0xC292, 0xC293,
+ 0xC294, 0xF1FA, 0xC295, 0xC296, 0xC297, 0xC298,
+ 0xC299, 0xC29A, 0xC29B, 0xC29C, 0xC29D, 0xC29E,
+ 0xC29F, 0xC2A0, 0xC340, 0xEDB2, 0xEDB1, 0xC341,
+ 0xC342, 0xCBE0, 0xD2DE, 0xC343, 0xCBC1, 0xD5D8,
+ 0xC344, 0xC8E2, 0xC345, 0xC0DF, 0xBCA1, 0xC346,
+ 0xC347, 0xC348, 0xC349, 0xC34A, 0xC34B, 0xEBC1,
+ 0xC34C, 0xC34D, 0xD0A4, 0xC34E, 0xD6E2, 0xC34F,
+ 0xB6C7, 0xB8D8, 0xEBC0, 0xB8CE, 0xC350, 0xEBBF,
+ 0xB3A6, 0xB9C9, 0xD6AB, 0xC351, 0xB7F4, 0xB7CA,
+ 0xC352, 0xC353, 0xC354, 0xBCE7, 0xB7BE, 0xEBC6,
+ 0xC355, 0xEBC7, 0xB0B9, 0xBFCF, 0xC356, 0xEBC5,
+ 0xD3FD, 0xC357, 0xEBC8, 0xC358, 0xC359, 0xEBC9,
+ 0xC35A, 0xC35B, 0xB7CE, 0xC35C, 0xEBC2, 0xEBC4,
+ 0xC9F6, 0xD6D7, 0xD5CD, 0xD0B2, 0xEBCF, 0xCEB8,
+ 0xEBD0, 0xC35D, 0xB5A8, 0xC35E, 0xC35F, 0xC360,
+ 0xC361, 0xC362, 0xB1B3, 0xEBD2, 0xCCA5, 0xC363,
+ 0xC364, 0xC365, 0xC366, 0xC367, 0xC368, 0xC369,
+ 0xC5D6, 0xEBD3, 0xC36A, 0xEBD1, 0xC5DF, 0xEBCE,
+ 0xCAA4, 0xEBD5, 0xB0FB, 0xC36B, 0xC36C, 0xBAFA,
+ 0xC36D, 0xC36E, 0xD8B7, 0xF1E3, 0xC36F, 0xEBCA,
+ 0xEBCB, 0xEBCC, 0xEBCD, 0xEBD6, 0xE6C0, 0xEBD9,
+ 0xC370, 0xBFE8, 0xD2C8, 0xEBD7, 0xEBDC, 0xB8EC,
+ 0xEBD8, 0xC371, 0xBDBA, 0xC372, 0xD0D8, 0xC373,
+ 0xB0B7, 0xC374, 0xEBDD, 0xC4DC, 0xC375, 0xC376,
+ 0xC377, 0xC378, 0xD6AC, 0xC379, 0xC37A, 0xC37B,
+ 0xB4E0, 0xC37C, 0xC37D, 0xC2F6, 0xBCB9, 0xC37E,
+ 0xC380, 0xEBDA, 0xEBDB, 0xD4E0, 0xC6EA, 0xC4D4,
+ 0xEBDF, 0xC5A7, 0xD9F5, 0xC381, 0xB2B1, 0xC382,
+ 0xEBE4, 0xC383, 0xBDC5, 0xC384, 0xC385, 0xC386,
+ 0xEBE2, 0xC387, 0xC388, 0xC389, 0xC38A, 0xC38B,
+ 0xC38C, 0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391,
+ 0xC392, 0xC393, 0xEBE3, 0xC394, 0xC395, 0xB8AC,
+ 0xC396, 0xCDD1, 0xEBE5, 0xC397, 0xC398, 0xC399,
+ 0xEBE1, 0xC39A, 0xC1B3, 0xC39B, 0xC39C, 0xC39D,
+ 0xC39E, 0xC39F, 0xC6A2, 0xC3A0, 0xC440, 0xC441,
+ 0xC442, 0xC443, 0xC444, 0xC445, 0xCCF3, 0xC446,
+ 0xEBE6, 0xC447, 0xC0B0, 0xD2B8, 0xEBE7, 0xC448,
+ 0xC449, 0xC44A, 0xB8AF, 0xB8AD, 0xC44B, 0xEBE8,
+ 0xC7BB, 0xCDF3, 0xC44C, 0xC44D, 0xC44E, 0xEBEA,
+ 0xEBEB, 0xC44F, 0xC450, 0xC451, 0xC452, 0xC453,
+ 0xEBED, 0xC454, 0xC455, 0xC456, 0xC457, 0xD0C8,
+ 0xC458, 0xEBF2, 0xC459, 0xEBEE, 0xC45A, 0xC45B,
+ 0xC45C, 0xEBF1, 0xC8F9, 0xC45D, 0xD1FC, 0xEBEC,
+ 0xC45E, 0xC45F, 0xEBE9, 0xC460, 0xC461, 0xC462,
+ 0xC463, 0xB8B9, 0xCFD9, 0xC4E5, 0xEBEF, 0xEBF0,
+ 0xCCDA, 0xCDC8, 0xB0F2, 0xC464, 0xEBF6, 0xC465,
+ 0xC466, 0xC467, 0xC468, 0xC469, 0xEBF5, 0xC46A,
+ 0xB2B2, 0xC46B, 0xC46C, 0xC46D, 0xC46E, 0xB8E0,
+ 0xC46F, 0xEBF7, 0xC470, 0xC471, 0xC472, 0xC473,
+ 0xC474, 0xC475, 0xB1EC, 0xC476, 0xC477, 0xCCC5,
+ 0xC4A4, 0xCFA5, 0xC478, 0xC479, 0xC47A, 0xC47B,
+ 0xC47C, 0xEBF9, 0xC47D, 0xC47E, 0xECA2, 0xC480,
+ 0xC5F2, 0xC481, 0xEBFA, 0xC482, 0xC483, 0xC484,
+ 0xC485, 0xC486, 0xC487, 0xC488, 0xC489, 0xC9C5,
+ 0xC48A, 0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F,
+ 0xE2DF, 0xEBFE, 0xC490, 0xC491, 0xC492, 0xC493,
+ 0xCDCE, 0xECA1, 0xB1DB, 0xD3B7, 0xC494, 0xC495,
+ 0xD2DC, 0xC496, 0xC497, 0xC498, 0xEBFD, 0xC499,
+ 0xEBFB, 0xC49A, 0xC49B, 0xC49C, 0xC49D, 0xC49E,
+ 0xC49F, 0xC4A0, 0xC540, 0xC541, 0xC542, 0xC543,
+ 0xC544, 0xC545, 0xC546, 0xC547, 0xC548, 0xC549,
+ 0xC54A, 0xC54B, 0xC54C, 0xC54D, 0xC54E, 0xB3BC,
+ 0xC54F, 0xC550, 0xC551, 0xEAB0, 0xC552, 0xC553,
+ 0xD7D4, 0xC554, 0xF4AB, 0xB3F4, 0xC555, 0xC556,
+ 0xC557, 0xC558, 0xC559, 0xD6C1, 0xD6C2, 0xC55A,
+ 0xC55B, 0xC55C, 0xC55D, 0xC55E, 0xC55F, 0xD5E9,
+ 0xBECA, 0xC560, 0xF4A7, 0xC561, 0xD2A8, 0xF4A8,
+ 0xF4A9, 0xC562, 0xF4AA, 0xBECB, 0xD3DF, 0xC563,
+ 0xC564, 0xC565, 0xC566, 0xC567, 0xC9E0, 0xC9E1,
+ 0xC568, 0xC569, 0xF3C2, 0xC56A, 0xCAE6, 0xC56B,
+ 0xCCF2, 0xC56C, 0xC56D, 0xC56E, 0xC56F, 0xC570,
+ 0xC571, 0xE2B6, 0xCBB4, 0xC572, 0xCEE8, 0xD6DB,
+ 0xC573, 0xF4AD, 0xF4AE, 0xF4AF, 0xC574, 0xC575,
+ 0xC576, 0xC577, 0xF4B2, 0xC578, 0xBABD, 0xF4B3,
+ 0xB0E3, 0xF4B0, 0xC579, 0xF4B1, 0xBDA2, 0xB2D5,
+ 0xC57A, 0xF4B6, 0xF4B7, 0xB6E6, 0xB2B0, 0xCFCF,
+ 0xF4B4, 0xB4AC, 0xC57B, 0xF4B5, 0xC57C, 0xC57D,
+ 0xF4B8, 0xC57E, 0xC580, 0xC581, 0xC582, 0xC583,
+ 0xF4B9, 0xC584, 0xC585, 0xCDA7, 0xC586, 0xF4BA,
+ 0xC587, 0xF4BB, 0xC588, 0xC589, 0xC58A, 0xF4BC,
+ 0xC58B, 0xC58C, 0xC58D, 0xC58E, 0xC58F, 0xC590,
+ 0xC591, 0xC592, 0xCBD2, 0xC593, 0xF4BD, 0xC594,
+ 0xC595, 0xC596, 0xC597, 0xF4BE, 0xC598, 0xC599,
+ 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC59E, 0xC59F,
+ 0xF4BF, 0xC5A0, 0xC640, 0xC641, 0xC642, 0xC643,
+ 0xF4DE, 0xC1BC, 0xBCE8, 0xC644, 0xC9AB, 0xD1DE,
+ 0xE5F5, 0xC645, 0xC646, 0xC647, 0xC648, 0xDCB3,
+ 0xD2D5, 0xC649, 0xC64A, 0xDCB4, 0xB0AC, 0xDCB5,
+ 0xC64B, 0xC64C, 0xBDDA, 0xC64D, 0xDCB9, 0xC64E,
+ 0xC64F, 0xC650, 0xD8C2, 0xC651, 0xDCB7, 0xD3F3,
+ 0xC652, 0xC9D6, 0xDCBA, 0xDCB6, 0xC653, 0xDCBB,
+ 0xC3A2, 0xC654, 0xC655, 0xC656, 0xC657, 0xDCBC,
+ 0xDCC5, 0xDCBD, 0xC658, 0xC659, 0xCEDF, 0xD6A5,
+ 0xC65A, 0xDCCF, 0xC65B, 0xDCCD, 0xC65C, 0xC65D,
+ 0xDCD2, 0xBDE6, 0xC2AB, 0xC65E, 0xDCB8, 0xDCCB,
+ 0xDCCE, 0xDCBE, 0xB7D2, 0xB0C5, 0xDCC7, 0xD0BE,
+ 0xDCC1, 0xBBA8, 0xC65F, 0xB7BC, 0xDCCC, 0xC660,
+ 0xC661, 0xDCC6, 0xDCBF, 0xC7DB, 0xC662, 0xC663,
+ 0xC664, 0xD1BF, 0xDCC0, 0xC665, 0xC666, 0xDCCA,
+ 0xC667, 0xC668, 0xDCD0, 0xC669, 0xC66A, 0xCEAD,
+ 0xDCC2, 0xC66B, 0xDCC3, 0xDCC8, 0xDCC9, 0xB2D4,
+ 0xDCD1, 0xCBD5, 0xC66C, 0xD4B7, 0xDCDB, 0xDCDF,
+ 0xCCA6, 0xDCE6, 0xC66D, 0xC3E7, 0xDCDC, 0xC66E,
+ 0xC66F, 0xBFC1, 0xDCD9, 0xC670, 0xB0FA, 0xB9B6,
+ 0xDCE5, 0xDCD3, 0xC671, 0xDCC4, 0xDCD6, 0xC8F4,
+ 0xBFE0, 0xC672, 0xC673, 0xC674, 0xC675, 0xC9BB,
+ 0xC676, 0xC677, 0xC678, 0xB1BD, 0xC679, 0xD3A2,
+ 0xC67A, 0xC67B, 0xDCDA, 0xC67C, 0xC67D, 0xDCD5,
+ 0xC67E, 0xC6BB, 0xC680, 0xDCDE, 0xC681, 0xC682,
+ 0xC683, 0xC684, 0xC685, 0xD7C2, 0xC3AF, 0xB7B6,
+ 0xC7D1, 0xC3A9, 0xDCE2, 0xDCD8, 0xDCEB, 0xDCD4,
+ 0xC686, 0xC687, 0xDCDD, 0xC688, 0xBEA5, 0xDCD7,
+ 0xC689, 0xDCE0, 0xC68A, 0xC68B, 0xDCE3, 0xDCE4,
+ 0xC68C, 0xDCF8, 0xC68D, 0xC68E, 0xDCE1, 0xDDA2,
+ 0xDCE7, 0xC68F, 0xC690, 0xC691, 0xC692, 0xC693,
+ 0xC694, 0xC695, 0xC696, 0xC697, 0xC698, 0xBCEB,
+ 0xB4C4, 0xC699, 0xC69A, 0xC3A3, 0xB2E7, 0xDCFA,
+ 0xC69B, 0xDCF2, 0xC69C, 0xDCEF, 0xC69D, 0xDCFC,
+ 0xDCEE, 0xD2F0, 0xB2E8, 0xC69E, 0xC8D7, 0xC8E3,
+ 0xDCFB, 0xC69F, 0xDCED, 0xC6A0, 0xC740, 0xC741,
+ 0xDCF7, 0xC742, 0xC743, 0xDCF5, 0xC744, 0xC745,
+ 0xBEA3, 0xDCF4, 0xC746, 0xB2DD, 0xC747, 0xC748,
+ 0xC749, 0xC74A, 0xC74B, 0xDCF3, 0xBCF6, 0xDCE8,
+ 0xBBC4, 0xC74C, 0xC0F3, 0xC74D, 0xC74E, 0xC74F,
+ 0xC750, 0xC751, 0xBCD4, 0xDCE9, 0xDCEA, 0xC752,
+ 0xDCF1, 0xDCF6, 0xDCF9, 0xB5B4, 0xC753, 0xC8D9,
+ 0xBBE7, 0xDCFE, 0xDCFD, 0xD3AB, 0xDDA1, 0xDDA3,
+ 0xDDA5, 0xD2F1, 0xDDA4, 0xDDA6, 0xDDA7, 0xD2A9,
+ 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC759,
+ 0xC75A, 0xBAC9, 0xDDA9, 0xC75B, 0xC75C, 0xDDB6,
+ 0xDDB1, 0xDDB4, 0xC75D, 0xC75E, 0xC75F, 0xC760,
+ 0xC761, 0xC762, 0xC763, 0xDDB0, 0xC6CE, 0xC764,
+ 0xC765, 0xC0F2, 0xC766, 0xC767, 0xC768, 0xC769,
+ 0xC9AF, 0xC76A, 0xC76B, 0xC76C, 0xDCEC, 0xDDAE,
+ 0xC76D, 0xC76E, 0xC76F, 0xC770, 0xDDB7, 0xC771,
+ 0xC772, 0xDCF0, 0xDDAF, 0xC773, 0xDDB8, 0xC774,
+ 0xDDAC, 0xC775, 0xC776, 0xC777, 0xC778, 0xC779,
+ 0xC77A, 0xC77B, 0xDDB9, 0xDDB3, 0xDDAD, 0xC4AA,
+ 0xC77C, 0xC77D, 0xC77E, 0xC780, 0xDDA8, 0xC0B3,
+ 0xC1AB, 0xDDAA, 0xDDAB, 0xC781, 0xDDB2, 0xBBF1,
+ 0xDDB5, 0xD3A8, 0xDDBA, 0xC782, 0xDDBB, 0xC3A7,
+ 0xC783, 0xC784, 0xDDD2, 0xDDBC, 0xC785, 0xC786,
+ 0xC787, 0xDDD1, 0xC788, 0xB9BD, 0xC789, 0xC78A,
+ 0xBED5, 0xC78B, 0xBEFA, 0xC78C, 0xC78D, 0xBACA,
+ 0xC78E, 0xC78F, 0xC790, 0xC791, 0xDDCA, 0xC792,
+ 0xDDC5, 0xC793, 0xDDBF, 0xC794, 0xC795, 0xC796,
+ 0xB2CB, 0xDDC3, 0xC797, 0xDDCB, 0xB2A4, 0xDDD5,
+ 0xC798, 0xC799, 0xC79A, 0xDDBE, 0xC79B, 0xC79C,
+ 0xC79D, 0xC6D0, 0xDDD0, 0xC79E, 0xC79F, 0xC7A0,
+ 0xC840, 0xC841, 0xDDD4, 0xC1E2, 0xB7C6, 0xC842,
+ 0xC843, 0xC844, 0xC845, 0xC846, 0xDDCE, 0xDDCF,
+ 0xC847, 0xC848, 0xC849, 0xDDC4, 0xC84A, 0xC84B,
+ 0xC84C, 0xDDBD, 0xC84D, 0xDDCD, 0xCCD1, 0xC84E,
+ 0xDDC9, 0xC84F, 0xC850, 0xC851, 0xC852, 0xDDC2,
+ 0xC3C8, 0xC6BC, 0xCEAE, 0xDDCC, 0xC853, 0xDDC8,
+ 0xC854, 0xC855, 0xC856, 0xC857, 0xC858, 0xC859,
+ 0xDDC1, 0xC85A, 0xC85B, 0xC85C, 0xDDC6, 0xC2DC,
+ 0xC85D, 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862,
+ 0xD3A9, 0xD3AA, 0xDDD3, 0xCFF4, 0xC8F8, 0xC863,
+ 0xC864, 0xC865, 0xC866, 0xC867, 0xC868, 0xC869,
+ 0xC86A, 0xDDE6, 0xC86B, 0xC86C, 0xC86D, 0xC86E,
+ 0xC86F, 0xC870, 0xDDC7, 0xC871, 0xC872, 0xC873,
+ 0xDDE0, 0xC2E4, 0xC874, 0xC875, 0xC876, 0xC877,
+ 0xC878, 0xC879, 0xC87A, 0xC87B, 0xDDE1, 0xC87C,
+ 0xC87D, 0xC87E, 0xC880, 0xC881, 0xC882, 0xC883,
+ 0xC884, 0xC885, 0xC886, 0xDDD7, 0xC887, 0xC888,
+ 0xC889, 0xC88A, 0xC88B, 0xD6F8, 0xC88C, 0xDDD9,
+ 0xDDD8, 0xB8F0, 0xDDD6, 0xC88D, 0xC88E, 0xC88F,
+ 0xC890, 0xC6CF, 0xC891, 0xB6AD, 0xC892, 0xC893,
+ 0xC894, 0xC895, 0xC896, 0xDDE2, 0xC897, 0xBAF9,
+ 0xD4E1, 0xDDE7, 0xC898, 0xC899, 0xC89A, 0xB4D0,
+ 0xC89B, 0xDDDA, 0xC89C, 0xBFFB, 0xDDE3, 0xC89D,
+ 0xDDDF, 0xC89E, 0xDDDD, 0xC89F, 0xC8A0, 0xC940,
+ 0xC941, 0xC942, 0xC943, 0xC944, 0xB5D9, 0xC945,
+ 0xC946, 0xC947, 0xC948, 0xDDDB, 0xDDDC, 0xDDDE,
+ 0xC949, 0xBDAF, 0xDDE4, 0xC94A, 0xDDE5, 0xC94B,
+ 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC950, 0xC951,
+ 0xC952, 0xDDF5, 0xC953, 0xC3C9, 0xC954, 0xC955,
+ 0xCBE2, 0xC956, 0xC957, 0xC958, 0xC959, 0xDDF2,
+ 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E, 0xC95F,
+ 0xC960, 0xC961, 0xC962, 0xC963, 0xC964, 0xC965,
+ 0xC966, 0xD8E1, 0xC967, 0xC968, 0xC6D1, 0xC969,
+ 0xDDF4, 0xC96A, 0xC96B, 0xC96C, 0xD5F4, 0xDDF3,
+ 0xDDF0, 0xC96D, 0xC96E, 0xDDEC, 0xC96F, 0xDDEF,
+ 0xC970, 0xDDE8, 0xC971, 0xC972, 0xD0EE, 0xC973,
+ 0xC974, 0xC975, 0xC976, 0xC8D8, 0xDDEE, 0xC977,
+ 0xC978, 0xDDE9, 0xC979, 0xC97A, 0xDDEA, 0xCBF2,
+ 0xC97B, 0xDDED, 0xC97C, 0xC97D, 0xB1CD, 0xC97E,
+ 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC0B6,
+ 0xC985, 0xBCBB, 0xDDF1, 0xC986, 0xC987, 0xDDF7,
+ 0xC988, 0xDDF6, 0xDDEB, 0xC989, 0xC98A, 0xC98B,
+ 0xC98C, 0xC98D, 0xC5EE, 0xC98E, 0xC98F, 0xC990,
+ 0xDDFB, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995,
+ 0xC996, 0xC997, 0xC998, 0xC999, 0xC99A, 0xC99B,
+ 0xDEA4, 0xC99C, 0xC99D, 0xDEA3, 0xC99E, 0xC99F,
+ 0xC9A0, 0xCA40, 0xCA41, 0xCA42, 0xCA43, 0xCA44,
+ 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xDDF8, 0xCA49,
+ 0xCA4A, 0xCA4B, 0xCA4C, 0xC3EF, 0xCA4D, 0xC2FB,
+ 0xCA4E, 0xCA4F, 0xCA50, 0xD5E1, 0xCA51, 0xCA52,
+ 0xCEB5, 0xCA53, 0xCA54, 0xCA55, 0xCA56, 0xDDFD,
+ 0xCA57, 0xB2CC, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B,
+ 0xCA5C, 0xCA5D, 0xCA5E, 0xCA5F, 0xCA60, 0xC4E8,
+ 0xCADF, 0xCA61, 0xCA62, 0xCA63, 0xCA64, 0xCA65,
+ 0xCA66, 0xCA67, 0xCA68, 0xCA69, 0xCA6A, 0xC7BE,
+ 0xDDFA, 0xDDFC, 0xDDFE, 0xDEA2, 0xB0AA, 0xB1CE,
+ 0xCA6B, 0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xDEAC,
+ 0xCA70, 0xCA71, 0xCA72, 0xCA73, 0xDEA6, 0xBDB6,
+ 0xC8EF, 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78,
+ 0xCA79, 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7D, 0xCA7E,
+ 0xDEA1, 0xCA80, 0xCA81, 0xDEA5, 0xCA82, 0xCA83,
+ 0xCA84, 0xCA85, 0xDEA9, 0xCA86, 0xCA87, 0xCA88,
+ 0xCA89, 0xCA8A, 0xDEA8, 0xCA8B, 0xCA8C, 0xCA8D,
+ 0xDEA7, 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92,
+ 0xCA93, 0xCA94, 0xCA95, 0xCA96, 0xDEAD, 0xCA97,
+ 0xD4CC, 0xCA98, 0xCA99, 0xCA9A, 0xCA9B, 0xDEB3,
+ 0xDEAA, 0xDEAE, 0xCA9C, 0xCA9D, 0xC0D9, 0xCA9E,
+ 0xCA9F, 0xCAA0, 0xCB40, 0xCB41, 0xB1A1, 0xDEB6,
+ 0xCB42, 0xDEB1, 0xCB43, 0xCB44, 0xCB45, 0xCB46,
+ 0xCB47, 0xCB48, 0xCB49, 0xDEB2, 0xCB4A, 0xCB4B,
+ 0xCB4C, 0xCB4D, 0xCB4E, 0xCB4F, 0xCB50, 0xCB51,
+ 0xCB52, 0xCB53, 0xCB54, 0xD1A6, 0xDEB5, 0xCB55,
+ 0xCB56, 0xCB57, 0xCB58, 0xCB59, 0xCB5A, 0xCB5B,
+ 0xDEAF, 0xCB5C, 0xCB5D, 0xCB5E, 0xDEB0, 0xCB5F,
+ 0xD0BD, 0xCB60, 0xCB61, 0xCB62, 0xDEB4, 0xCAED,
+ 0xDEB9, 0xCB63, 0xCB64, 0xCB65, 0xCB66, 0xCB67,
+ 0xCB68, 0xDEB8, 0xCB69, 0xDEB7, 0xCB6A, 0xCB6B,
+ 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xDEBB,
+ 0xCB71, 0xCB72, 0xCB73, 0xCB74, 0xCB75, 0xCB76,
+ 0xCB77, 0xBDE5, 0xCB78, 0xCB79, 0xCB7A, 0xCB7B,
+ 0xCB7C, 0xB2D8, 0xC3EA, 0xCB7D, 0xCB7E, 0xDEBA,
+ 0xCB80, 0xC5BA, 0xCB81, 0xCB82, 0xCB83, 0xCB84,
+ 0xCB85, 0xCB86, 0xDEBC, 0xCB87, 0xCB88, 0xCB89,
+ 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCCD9, 0xCB8E,
+ 0xCB8F, 0xCB90, 0xCB91, 0xB7AA, 0xCB92, 0xCB93,
+ 0xCB94, 0xCB95, 0xCB96, 0xCB97, 0xCB98, 0xCB99,
+ 0xCB9A, 0xCB9B, 0xCB9C, 0xCB9D, 0xCB9E, 0xCB9F,
+ 0xCBA0, 0xCC40, 0xCC41, 0xD4E5, 0xCC42, 0xCC43,
+ 0xCC44, 0xDEBD, 0xCC45, 0xCC46, 0xCC47, 0xCC48,
+ 0xCC49, 0xDEBF, 0xCC4A, 0xCC4B, 0xCC4C, 0xCC4D,
+ 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53,
+ 0xCC54, 0xC4A2, 0xCC55, 0xCC56, 0xCC57, 0xCC58,
+ 0xDEC1, 0xCC59, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D,
+ 0xCC5E, 0xCC5F, 0xCC60, 0xCC61, 0xCC62, 0xCC63,
+ 0xCC64, 0xCC65, 0xCC66, 0xCC67, 0xCC68, 0xDEBE,
+ 0xCC69, 0xDEC0, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D,
+ 0xCC6E, 0xCC6F, 0xCC70, 0xCC71, 0xCC72, 0xCC73,
+ 0xCC74, 0xCC75, 0xCC76, 0xCC77, 0xD5BA, 0xCC78,
+ 0xCC79, 0xCC7A, 0xDEC2, 0xCC7B, 0xCC7C, 0xCC7D,
+ 0xCC7E, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84,
+ 0xCC85, 0xCC86, 0xCC87, 0xCC88, 0xCC89, 0xCC8A,
+ 0xCC8B, 0xF2AE, 0xBBA2, 0xC2B2, 0xC5B0, 0xC2C7,
+ 0xCC8C, 0xCC8D, 0xF2AF, 0xCC8E, 0xCC8F, 0xCC90,
+ 0xCC91, 0xCC92, 0xD0E9, 0xCC93, 0xCC94, 0xCC95,
+ 0xD3DD, 0xCC96, 0xCC97, 0xCC98, 0xEBBD, 0xCC99,
+ 0xCC9A, 0xCC9B, 0xCC9C, 0xCC9D, 0xCC9E, 0xCC9F,
+ 0xCCA0, 0xB3E6, 0xF2B0, 0xCD40, 0xF2B1, 0xCD41,
+ 0xCD42, 0xCAAD, 0xCD43, 0xCD44, 0xCD45, 0xCD46,
+ 0xCD47, 0xCD48, 0xCD49, 0xBAE7, 0xF2B3, 0xF2B5,
+ 0xF2B4, 0xCBE4, 0xCFBA, 0xF2B2, 0xCAB4, 0xD2CF,
+ 0xC2EC, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E,
+ 0xCD4F, 0xCD50, 0xCEC3, 0xF2B8, 0xB0F6, 0xF2B7,
+ 0xCD51, 0xCD52, 0xCD53, 0xCD54, 0xCD55, 0xF2BE,
+ 0xCD56, 0xB2CF, 0xCD57, 0xCD58, 0xCD59, 0xCD5A,
+ 0xCD5B, 0xCD5C, 0xD1C1, 0xF2BA, 0xCD5D, 0xCD5E,
+ 0xCD5F, 0xCD60, 0xCD61, 0xF2BC, 0xD4E9, 0xCD62,
+ 0xCD63, 0xF2BB, 0xF2B6, 0xF2BF, 0xF2BD, 0xCD64,
+ 0xF2B9, 0xCD65, 0xCD66, 0xF2C7, 0xF2C4, 0xF2C6,
+ 0xCD67, 0xCD68, 0xF2CA, 0xF2C2, 0xF2C0, 0xCD69,
+ 0xCD6A, 0xCD6B, 0xF2C5, 0xCD6C, 0xCD6D, 0xCD6E,
+ 0xCD6F, 0xCD70, 0xD6FB, 0xCD71, 0xCD72, 0xCD73,
+ 0xF2C1, 0xCD74, 0xC7F9, 0xC9DF, 0xCD75, 0xF2C8,
+ 0xB9C6, 0xB5B0, 0xCD76, 0xCD77, 0xF2C3, 0xF2C9,
+ 0xF2D0, 0xF2D6, 0xCD78, 0xCD79, 0xBBD7, 0xCD7A,
+ 0xCD7B, 0xCD7C, 0xF2D5, 0xCDDC, 0xCD7D, 0xD6EB,
+ 0xCD7E, 0xCD80, 0xF2D2, 0xF2D4, 0xCD81, 0xCD82,
+ 0xCD83, 0xCD84, 0xB8F2, 0xCD85, 0xCD86, 0xCD87,
+ 0xCD88, 0xF2CB, 0xCD89, 0xCD8A, 0xCD8B, 0xF2CE,
+ 0xC2F9, 0xCD8C, 0xD5DD, 0xF2CC, 0xF2CD, 0xF2CF,
+ 0xF2D3, 0xCD8D, 0xCD8E, 0xCD8F, 0xF2D9, 0xD3BC,
+ 0xCD90, 0xCD91, 0xCD92, 0xCD93, 0xB6EA, 0xCD94,
+ 0xCAF1, 0xCD95, 0xB7E4, 0xF2D7, 0xCD96, 0xCD97,
+ 0xCD98, 0xF2D8, 0xF2DA, 0xF2DD, 0xF2DB, 0xCD99,
+ 0xCD9A, 0xF2DC, 0xCD9B, 0xCD9C, 0xCD9D, 0xCD9E,
+ 0xD1D1, 0xF2D1, 0xCD9F, 0xCDC9, 0xCDA0, 0xCECF,
+ 0xD6A9, 0xCE40, 0xF2E3, 0xCE41, 0xC3DB, 0xCE42,
+ 0xF2E0, 0xCE43, 0xCE44, 0xC0AF, 0xF2EC, 0xF2DE,
+ 0xCE45, 0xF2E1, 0xCE46, 0xCE47, 0xCE48, 0xF2E8,
+ 0xCE49, 0xCE4A, 0xCE4B, 0xCE4C, 0xF2E2, 0xCE4D,
+ 0xCE4E, 0xF2E7, 0xCE4F, 0xCE50, 0xF2E6, 0xCE51,
+ 0xCE52, 0xF2E9, 0xCE53, 0xCE54, 0xCE55, 0xF2DF,
+ 0xCE56, 0xCE57, 0xF2E4, 0xF2EA, 0xCE58, 0xCE59,
+ 0xCE5A, 0xCE5B, 0xCE5C, 0xCE5D, 0xCE5E, 0xD3AC,
+ 0xF2E5, 0xB2F5, 0xCE5F, 0xCE60, 0xF2F2, 0xCE61,
+ 0xD0AB, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xF2F5,
+ 0xCE66, 0xCE67, 0xCE68, 0xBBC8, 0xCE69, 0xF2F9,
+ 0xCE6A, 0xCE6B, 0xCE6C, 0xCE6D, 0xCE6E, 0xCE6F,
+ 0xF2F0, 0xCE70, 0xCE71, 0xF2F6, 0xF2F8, 0xF2FA,
+ 0xCE72, 0xCE73, 0xCE74, 0xCE75, 0xCE76, 0xCE77,
+ 0xCE78, 0xCE79, 0xF2F3, 0xCE7A, 0xF2F1, 0xCE7B,
+ 0xCE7C, 0xCE7D, 0xBAFB, 0xCE7E, 0xB5FB, 0xCE80,
+ 0xCE81, 0xCE82, 0xCE83, 0xF2EF, 0xF2F7, 0xF2ED,
+ 0xF2EE, 0xCE84, 0xCE85, 0xCE86, 0xF2EB, 0xF3A6,
+ 0xCE87, 0xF3A3, 0xCE88, 0xCE89, 0xF3A2, 0xCE8A,
+ 0xCE8B, 0xF2F4, 0xCE8C, 0xC8DA, 0xCE8D, 0xCE8E,
+ 0xCE8F, 0xCE90, 0xCE91, 0xF2FB, 0xCE92, 0xCE93,
+ 0xCE94, 0xF3A5, 0xCE95, 0xCE96, 0xCE97, 0xCE98,
+ 0xCE99, 0xCE9A, 0xCE9B, 0xC3F8, 0xCE9C, 0xCE9D,
+ 0xCE9E, 0xCE9F, 0xCEA0, 0xCF40, 0xCF41, 0xCF42,
+ 0xF2FD, 0xCF43, 0xCF44, 0xF3A7, 0xF3A9, 0xF3A4,
+ 0xCF45, 0xF2FC, 0xCF46, 0xCF47, 0xCF48, 0xF3AB,
+ 0xCF49, 0xF3AA, 0xCF4A, 0xCF4B, 0xCF4C, 0xCF4D,
+ 0xC2DD, 0xCF4E, 0xCF4F, 0xF3AE, 0xCF50, 0xCF51,
+ 0xF3B0, 0xCF52, 0xCF53, 0xCF54, 0xCF55, 0xCF56,
+ 0xF3A1, 0xCF57, 0xCF58, 0xCF59, 0xF3B1, 0xF3AC,
+ 0xCF5A, 0xCF5B, 0xCF5C, 0xCF5D, 0xCF5E, 0xF3AF,
+ 0xF2FE, 0xF3AD, 0xCF5F, 0xCF60, 0xCF61, 0xCF62,
+ 0xCF63, 0xCF64, 0xCF65, 0xF3B2, 0xCF66, 0xCF67,
+ 0xCF68, 0xCF69, 0xF3B4, 0xCF6A, 0xCF6B, 0xCF6C,
+ 0xCF6D, 0xF3A8, 0xCF6E, 0xCF6F, 0xCF70, 0xCF71,
+ 0xF3B3, 0xCF72, 0xCF73, 0xCF74, 0xF3B5, 0xCF75,
+ 0xCF76, 0xCF77, 0xCF78, 0xCF79, 0xCF7A, 0xCF7B,
+ 0xCF7C, 0xCF7D, 0xCF7E, 0xD0B7, 0xCF80, 0xCF81,
+ 0xCF82, 0xCF83, 0xF3B8, 0xCF84, 0xCF85, 0xCF86,
+ 0xCF87, 0xD9F9, 0xCF88, 0xCF89, 0xCF8A, 0xCF8B,
+ 0xCF8C, 0xCF8D, 0xF3B9, 0xCF8E, 0xCF8F, 0xCF90,
+ 0xCF91, 0xCF92, 0xCF93, 0xCF94, 0xCF95, 0xF3B7,
+ 0xCF96, 0xC8E4, 0xF3B6, 0xCF97, 0xCF98, 0xCF99,
+ 0xCF9A, 0xF3BA, 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E,
+ 0xCF9F, 0xF3BB, 0xB4C0, 0xCFA0, 0xD040, 0xD041,
+ 0xD042, 0xD043, 0xD044, 0xD045, 0xD046, 0xD047,
+ 0xD048, 0xD049, 0xD04A, 0xD04B, 0xD04C, 0xD04D,
+ 0xEEC3, 0xD04E, 0xD04F, 0xD050, 0xD051, 0xD052,
+ 0xD053, 0xF3BC, 0xD054, 0xD055, 0xF3BD, 0xD056,
+ 0xD057, 0xD058, 0xD1AA, 0xD059, 0xD05A, 0xD05B,
+ 0xF4AC, 0xD0C6, 0xD05C, 0xD05D, 0xD05E, 0xD05F,
+ 0xD060, 0xD061, 0xD0D0, 0xD1DC, 0xD062, 0xD063,
+ 0xD064, 0xD065, 0xD066, 0xD067, 0xCFCE, 0xD068,
+ 0xD069, 0xBDD6, 0xD06A, 0xD1C3, 0xD06B, 0xD06C,
+ 0xD06D, 0xD06E, 0xD06F, 0xD070, 0xD071, 0xBAE2,
+ 0xE1E9, 0xD2C2, 0xF1C2, 0xB2B9, 0xD072, 0xD073,
+ 0xB1ED, 0xF1C3, 0xD074, 0xC9C0, 0xB3C4, 0xD075,
+ 0xD9F2, 0xD076, 0xCBA5, 0xD077, 0xF1C4, 0xD078,
+ 0xD079, 0xD07A, 0xD07B, 0xD6D4, 0xD07C, 0xD07D,
+ 0xD07E, 0xD080, 0xD081, 0xF1C5, 0xF4C0, 0xF1C6,
+ 0xD082, 0xD4AC, 0xF1C7, 0xD083, 0xB0C0, 0xF4C1,
+ 0xD084, 0xD085, 0xF4C2, 0xD086, 0xD087, 0xB4FC,
+ 0xD088, 0xC5DB, 0xD089, 0xD08A, 0xD08B, 0xD08C,
+ 0xCCBB, 0xD08D, 0xD08E, 0xD08F, 0xD0E4, 0xD090,
+ 0xD091, 0xD092, 0xD093, 0xD094, 0xCDE0, 0xD095,
+ 0xD096, 0xD097, 0xD098, 0xD099, 0xF1C8, 0xD09A,
+ 0xD9F3, 0xD09B, 0xD09C, 0xD09D, 0xD09E, 0xD09F,
+ 0xD0A0, 0xB1BB, 0xD140, 0xCFAE, 0xD141, 0xD142,
+ 0xD143, 0xB8A4, 0xD144, 0xD145, 0xD146, 0xD147,
+ 0xD148, 0xF1CA, 0xD149, 0xD14A, 0xD14B, 0xD14C,
+ 0xF1CB, 0xD14D, 0xD14E, 0xD14F, 0xD150, 0xB2C3,
+ 0xC1D1, 0xD151, 0xD152, 0xD7B0, 0xF1C9, 0xD153,
+ 0xD154, 0xF1CC, 0xD155, 0xD156, 0xD157, 0xD158,
+ 0xF1CE, 0xD159, 0xD15A, 0xD15B, 0xD9F6, 0xD15C,
+ 0xD2E1, 0xD4A3, 0xD15D, 0xD15E, 0xF4C3, 0xC8B9,
+ 0xD15F, 0xD160, 0xD161, 0xD162, 0xD163, 0xF4C4,
+ 0xD164, 0xD165, 0xF1CD, 0xF1CF, 0xBFE3, 0xF1D0,
+ 0xD166, 0xD167, 0xF1D4, 0xD168, 0xD169, 0xD16A,
+ 0xD16B, 0xD16C, 0xD16D, 0xD16E, 0xF1D6, 0xF1D1,
+ 0xD16F, 0xC9D1, 0xC5E1, 0xD170, 0xD171, 0xD172,
+ 0xC2E3, 0xB9FC, 0xD173, 0xD174, 0xF1D3, 0xD175,
+ 0xF1D5, 0xD176, 0xD177, 0xD178, 0xB9D3, 0xD179,
+ 0xD17A, 0xD17B, 0xD17C, 0xD17D, 0xD17E, 0xD180,
+ 0xF1DB, 0xD181, 0xD182, 0xD183, 0xD184, 0xD185,
+ 0xBAD6, 0xD186, 0xB0FD, 0xF1D9, 0xD187, 0xD188,
+ 0xD189, 0xD18A, 0xD18B, 0xF1D8, 0xF1D2, 0xF1DA,
+ 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xF1D7,
+ 0xD191, 0xD192, 0xD193, 0xC8EC, 0xD194, 0xD195,
+ 0xD196, 0xD197, 0xCDCA, 0xF1DD, 0xD198, 0xD199,
+ 0xD19A, 0xD19B, 0xE5BD, 0xD19C, 0xD19D, 0xD19E,
+ 0xF1DC, 0xD19F, 0xF1DE, 0xD1A0, 0xD240, 0xD241,
+ 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247,
+ 0xD248, 0xF1DF, 0xD249, 0xD24A, 0xCFE5, 0xD24B,
+ 0xD24C, 0xD24D, 0xD24E, 0xD24F, 0xD250, 0xD251,
+ 0xD252, 0xD253, 0xD254, 0xD255, 0xD256, 0xD257,
+ 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25C, 0xD25D,
+ 0xD25E, 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263,
+ 0xF4C5, 0xBDF3, 0xD264, 0xD265, 0xD266, 0xD267,
+ 0xD268, 0xD269, 0xF1E0, 0xD26A, 0xD26B, 0xD26C,
+ 0xD26D, 0xD26E, 0xD26F, 0xD270, 0xD271, 0xD272,
+ 0xD273, 0xD274, 0xD275, 0xD276, 0xD277, 0xD278,
+ 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xF1E1,
+ 0xD27E, 0xD280, 0xD281, 0xCEF7, 0xD282, 0xD2AA,
+ 0xD283, 0xF1FB, 0xD284, 0xD285, 0xB8B2, 0xD286,
+ 0xD287, 0xD288, 0xD289, 0xD28A, 0xD28B, 0xD28C,
+ 0xD28D, 0xD28E, 0xD28F, 0xD290, 0xD291, 0xD292,
+ 0xD293, 0xD294, 0xD295, 0xD296, 0xD297, 0xD298,
+ 0xD299, 0xD29A, 0xD29B, 0xD29C, 0xD29D, 0xD29E,
+ 0xD29F, 0xD2A0, 0xD340, 0xD341, 0xD342, 0xD343,
+ 0xD344, 0xD345, 0xD346, 0xD347, 0xD348, 0xD349,
+ 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F,
+ 0xD350, 0xD351, 0xD352, 0xD353, 0xD354, 0xD355,
+ 0xD356, 0xD357, 0xD358, 0xD359, 0xD35A, 0xD35B,
+ 0xD35C, 0xD35D, 0xD35E, 0xBCFB, 0xB9DB, 0xD35F,
+ 0xB9E6, 0xC3D9, 0xCAD3, 0xEAE8, 0xC0C0, 0xBEF5,
+ 0xEAE9, 0xEAEA, 0xEAEB, 0xD360, 0xEAEC, 0xEAED,
+ 0xEAEE, 0xEAEF, 0xBDC7, 0xD361, 0xD362, 0xD363,
+ 0xF5FB, 0xD364, 0xD365, 0xD366, 0xF5FD, 0xD367,
+ 0xF5FE, 0xD368, 0xF5FC, 0xD369, 0xD36A, 0xD36B,
+ 0xD36C, 0xBDE2, 0xD36D, 0xF6A1, 0xB4A5, 0xD36E,
+ 0xD36F, 0xD370, 0xD371, 0xF6A2, 0xD372, 0xD373,
+ 0xD374, 0xF6A3, 0xD375, 0xD376, 0xD377, 0xECB2,
+ 0xD378, 0xD379, 0xD37A, 0xD37B, 0xD37C, 0xD37D,
+ 0xD37E, 0xD380, 0xD381, 0xD382, 0xD383, 0xD384,
+ 0xD1D4, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389,
+ 0xD38A, 0xD9EA, 0xD38B, 0xD38C, 0xD38D, 0xD38E,
+ 0xD38F, 0xD390, 0xD391, 0xD392, 0xD393, 0xD394,
+ 0xD395, 0xD396, 0xD397, 0xD398, 0xD399, 0xD39A,
+ 0xD39B, 0xD39C, 0xD39D, 0xD39E, 0xD39F, 0xD3A0,
+ 0xD440, 0xD441, 0xD442, 0xD443, 0xD444, 0xD445,
+ 0xD446, 0xD447, 0xD448, 0xD449, 0xD44A, 0xD44B,
+ 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450, 0xD451,
+ 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457,
+ 0xD458, 0xD459, 0xD45A, 0xD45B, 0xD45C, 0xD45D,
+ 0xD45E, 0xD45F, 0xF6A4, 0xD460, 0xD461, 0xD462,
+ 0xD463, 0xD464, 0xD465, 0xD466, 0xD467, 0xD468,
+ 0xEEBA, 0xD469, 0xD46A, 0xD46B, 0xD46C, 0xD46D,
+ 0xD46E, 0xD46F, 0xD470, 0xD471, 0xD472, 0xD473,
+ 0xD474, 0xD475, 0xD476, 0xD477, 0xD478, 0xD479,
+ 0xD47A, 0xD47B, 0xD47C, 0xD47D, 0xD47E, 0xD480,
+ 0xD481, 0xD482, 0xD483, 0xD484, 0xD485, 0xD486,
+ 0xD487, 0xD488, 0xD489, 0xD48A, 0xD48B, 0xD48C,
+ 0xD48D, 0xD48E, 0xD48F, 0xD490, 0xD491, 0xD492,
+ 0xD493, 0xD494, 0xD495, 0xD496, 0xD497, 0xD498,
+ 0xD499, 0xD5B2, 0xD49A, 0xD49B, 0xD49C, 0xD49D,
+ 0xD49E, 0xD49F, 0xD4A0, 0xD540, 0xD541, 0xD542,
+ 0xD543, 0xD544, 0xD545, 0xD546, 0xD547, 0xD3FE,
+ 0xCCDC, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54C,
+ 0xD54D, 0xD54E, 0xD54F, 0xCAC4, 0xD550, 0xD551,
+ 0xD552, 0xD553, 0xD554, 0xD555, 0xD556, 0xD557,
+ 0xD558, 0xD559, 0xD55A, 0xD55B, 0xD55C, 0xD55D,
+ 0xD55E, 0xD55F, 0xD560, 0xD561, 0xD562, 0xD563,
+ 0xD564, 0xD565, 0xD566, 0xD567, 0xD568, 0xD569,
+ 0xD56A, 0xD56B, 0xD56C, 0xD56D, 0xD56E, 0xD56F,
+ 0xD570, 0xD571, 0xD572, 0xD573, 0xD574, 0xD575,
+ 0xD576, 0xD577, 0xD578, 0xD579, 0xD57A, 0xD57B,
+ 0xD57C, 0xD57D, 0xD57E, 0xD580, 0xD581, 0xD582,
+ 0xD583, 0xD584, 0xD585, 0xD586, 0xD587, 0xD588,
+ 0xD589, 0xD58A, 0xD58B, 0xD58C, 0xD58D, 0xD58E,
+ 0xD58F, 0xD590, 0xD591, 0xD592, 0xD593, 0xD594,
+ 0xD595, 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A,
+ 0xD59B, 0xD59C, 0xD59D, 0xD59E, 0xD59F, 0xD5A0,
+ 0xD640, 0xD641, 0xD642, 0xD643, 0xD644, 0xD645,
+ 0xD646, 0xD647, 0xD648, 0xD649, 0xD64A, 0xD64B,
+ 0xD64C, 0xD64D, 0xD64E, 0xD64F, 0xD650, 0xD651,
+ 0xD652, 0xD653, 0xD654, 0xD655, 0xD656, 0xD657,
+ 0xD658, 0xD659, 0xD65A, 0xD65B, 0xD65C, 0xD65D,
+ 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662, 0xE5C0,
+ 0xD663, 0xD664, 0xD665, 0xD666, 0xD667, 0xD668,
+ 0xD669, 0xD66A, 0xD66B, 0xD66C, 0xD66D, 0xD66E,
+ 0xD66F, 0xD670, 0xD671, 0xD672, 0xD673, 0xD674,
+ 0xD675, 0xD676, 0xD677, 0xD678, 0xD679, 0xD67A,
+ 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD680, 0xD681,
+ 0xF6A5, 0xD682, 0xD683, 0xD684, 0xD685, 0xD686,
+ 0xD687, 0xD688, 0xD689, 0xD68A, 0xD68B, 0xD68C,
+ 0xD68D, 0xD68E, 0xD68F, 0xD690, 0xD691, 0xD692,
+ 0xD693, 0xD694, 0xD695, 0xD696, 0xD697, 0xD698,
+ 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69D, 0xD69E,
+ 0xD69F, 0xD6A0, 0xD740, 0xD741, 0xD742, 0xD743,
+ 0xD744, 0xD745, 0xD746, 0xD747, 0xD748, 0xD749,
+ 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F,
+ 0xD750, 0xD751, 0xD752, 0xD753, 0xD754, 0xD755,
+ 0xD756, 0xD757, 0xD758, 0xD759, 0xD75A, 0xD75B,
+ 0xD75C, 0xD75D, 0xD75E, 0xD75F, 0xBEAF, 0xD760,
+ 0xD761, 0xD762, 0xD763, 0xD764, 0xC6A9, 0xD765,
+ 0xD766, 0xD767, 0xD768, 0xD769, 0xD76A, 0xD76B,
+ 0xD76C, 0xD76D, 0xD76E, 0xD76F, 0xD770, 0xD771,
+ 0xD772, 0xD773, 0xD774, 0xD775, 0xD776, 0xD777,
+ 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77C, 0xD77D,
+ 0xD77E, 0xD780, 0xD781, 0xD782, 0xD783, 0xD784,
+ 0xD785, 0xD786, 0xD787, 0xD788, 0xD789, 0xD78A,
+ 0xD78B, 0xD78C, 0xD78D, 0xD78E, 0xD78F, 0xD790,
+ 0xD791, 0xD792, 0xD793, 0xD794, 0xD795, 0xD796,
+ 0xD797, 0xD798, 0xDAA5, 0xBCC6, 0xB6A9, 0xB8BC,
+ 0xC8CF, 0xBCA5, 0xDAA6, 0xDAA7, 0xCCD6, 0xC8C3,
+ 0xDAA8, 0xC6FD, 0xD799, 0xD1B5, 0xD2E9, 0xD1B6,
+ 0xBCC7, 0xD79A, 0xBDB2, 0xBBE4, 0xDAA9, 0xDAAA,
+ 0xD1C8, 0xDAAB, 0xD0ED, 0xB6EF, 0xC2DB, 0xD79B,
+ 0xCBCF, 0xB7ED, 0xC9E8, 0xB7C3, 0xBEF7, 0xD6A4,
+ 0xDAAC, 0xDAAD, 0xC6C0, 0xD7E7, 0xCAB6, 0xD79C,
+ 0xD5A9, 0xCBDF, 0xD5EF, 0xDAAE, 0xD6DF, 0xB4CA,
+ 0xDAB0, 0xDAAF, 0xD79D, 0xD2EB, 0xDAB1, 0xDAB2,
+ 0xDAB3, 0xCAD4, 0xDAB4, 0xCAAB, 0xDAB5, 0xDAB6,
+ 0xB3CF, 0xD6EF, 0xDAB7, 0xBBB0, 0xB5AE, 0xDAB8,
+ 0xDAB9, 0xB9EE, 0xD1AF, 0xD2E8, 0xDABA, 0xB8C3,
+ 0xCFEA, 0xB2EF, 0xDABB, 0xDABC, 0xD79E, 0xBDEB,
+ 0xCEDC, 0xD3EF, 0xDABD, 0xCEF3, 0xDABE, 0xD3D5,
+ 0xBBE5, 0xDABF, 0xCBB5, 0xCBD0, 0xDAC0, 0xC7EB,
+ 0xD6EE, 0xDAC1, 0xC5B5, 0xB6C1, 0xDAC2, 0xB7CC,
+ 0xBFCE, 0xDAC3, 0xDAC4, 0xCBAD, 0xDAC5, 0xB5F7,
+ 0xDAC6, 0xC1C2, 0xD7BB, 0xDAC7, 0xCCB8, 0xD79F,
+ 0xD2EA, 0xC4B1, 0xDAC8, 0xB5FD, 0xBBD1, 0xDAC9,
+ 0xD0B3, 0xDACA, 0xDACB, 0xCEBD, 0xDACC, 0xDACD,
+ 0xDACE, 0xB2F7, 0xDAD1, 0xDACF, 0xD1E8, 0xDAD0,
+ 0xC3D5, 0xDAD2, 0xD7A0, 0xDAD3, 0xDAD4, 0xDAD5,
+ 0xD0BB, 0xD2A5, 0xB0F9, 0xDAD6, 0xC7AB, 0xDAD7,
+ 0xBDF7, 0xC3A1, 0xDAD8, 0xDAD9, 0xC3FD, 0xCCB7,
+ 0xDADA, 0xDADB, 0xC0BE, 0xC6D7, 0xDADC, 0xDADD,
+ 0xC7B4, 0xDADE, 0xDADF, 0xB9C8, 0xD840, 0xD841,
+ 0xD842, 0xD843, 0xD844, 0xD845, 0xD846, 0xD847,
+ 0xD848, 0xBBED, 0xD849, 0xD84A, 0xD84B, 0xD84C,
+ 0xB6B9, 0xF4F8, 0xD84D, 0xF4F9, 0xD84E, 0xD84F,
+ 0xCDE3, 0xD850, 0xD851, 0xD852, 0xD853, 0xD854,
+ 0xD855, 0xD856, 0xD857, 0xF5B9, 0xD858, 0xD859,
+ 0xD85A, 0xD85B, 0xEBE0, 0xD85C, 0xD85D, 0xD85E,
+ 0xD85F, 0xD860, 0xD861, 0xCFF3, 0xBBBF, 0xD862,
+ 0xD863, 0xD864, 0xD865, 0xD866, 0xD867, 0xD868,
+ 0xBAC0, 0xD4A5, 0xD869, 0xD86A, 0xD86B, 0xD86C,
+ 0xD86D, 0xD86E, 0xD86F, 0xE1D9, 0xD870, 0xD871,
+ 0xD872, 0xD873, 0xF5F4, 0xB1AA, 0xB2F2, 0xD874,
+ 0xD875, 0xD876, 0xD877, 0xD878, 0xD879, 0xD87A,
+ 0xF5F5, 0xD87B, 0xD87C, 0xF5F7, 0xD87D, 0xD87E,
+ 0xD880, 0xBAD1, 0xF5F6, 0xD881, 0xC3B2, 0xD882,
+ 0xD883, 0xD884, 0xD885, 0xD886, 0xD887, 0xD888,
+ 0xF5F9, 0xD889, 0xD88A, 0xD88B, 0xF5F8, 0xD88C,
+ 0xD88D, 0xD88E, 0xD88F, 0xD890, 0xD891, 0xD892,
+ 0xD893, 0xD894, 0xD895, 0xD896, 0xD897, 0xD898,
+ 0xD899, 0xD89A, 0xD89B, 0xD89C, 0xD89D, 0xD89E,
+ 0xD89F, 0xD8A0, 0xD940, 0xD941, 0xD942, 0xD943,
+ 0xD944, 0xD945, 0xD946, 0xD947, 0xD948, 0xD949,
+ 0xD94A, 0xD94B, 0xD94C, 0xD94D, 0xD94E, 0xD94F,
+ 0xD950, 0xD951, 0xD952, 0xD953, 0xD954, 0xD955,
+ 0xD956, 0xD957, 0xD958, 0xD959, 0xD95A, 0xD95B,
+ 0xD95C, 0xD95D, 0xD95E, 0xD95F, 0xD960, 0xD961,
+ 0xD962, 0xD963, 0xD964, 0xD965, 0xD966, 0xD967,
+ 0xD968, 0xD969, 0xD96A, 0xD96B, 0xD96C, 0xD96D,
+ 0xD96E, 0xD96F, 0xD970, 0xD971, 0xD972, 0xD973,
+ 0xD974, 0xD975, 0xD976, 0xD977, 0xD978, 0xD979,
+ 0xD97A, 0xD97B, 0xD97C, 0xD97D, 0xD97E, 0xD980,
+ 0xD981, 0xD982, 0xD983, 0xD984, 0xD985, 0xD986,
+ 0xD987, 0xD988, 0xD989, 0xD98A, 0xD98B, 0xD98C,
+ 0xD98D, 0xD98E, 0xD98F, 0xD990, 0xD991, 0xD992,
+ 0xD993, 0xD994, 0xD995, 0xD996, 0xD997, 0xD998,
+ 0xD999, 0xD99A, 0xD99B, 0xD99C, 0xD99D, 0xD99E,
+ 0xD99F, 0xD9A0, 0xDA40, 0xDA41, 0xDA42, 0xDA43,
+ 0xDA44, 0xDA45, 0xDA46, 0xDA47, 0xDA48, 0xDA49,
+ 0xDA4A, 0xDA4B, 0xDA4C, 0xDA4D, 0xDA4E, 0xB1B4,
+ 0xD5EA, 0xB8BA, 0xDA4F, 0xB9B1, 0xB2C6, 0xD4F0,
+ 0xCFCD, 0xB0DC, 0xD5CB, 0xBBF5, 0xD6CA, 0xB7B7,
+ 0xCCB0, 0xC6B6, 0xB1E1, 0xB9BA, 0xD6FC, 0xB9E1,
+ 0xB7A1, 0xBCFA, 0xEADA, 0xEADB, 0xCCF9, 0xB9F3,
+ 0xEADC, 0xB4FB, 0xC3B3, 0xB7D1, 0xBAD8, 0xEADD,
+ 0xD4F4, 0xEADE, 0xBCD6, 0xBBDF, 0xEADF, 0xC1DE,
+ 0xC2B8, 0xD4DF, 0xD7CA, 0xEAE0, 0xEAE1, 0xEAE4,
+ 0xEAE2, 0xEAE3, 0xC9DE, 0xB8B3, 0xB6C4, 0xEAE5,
+ 0xCAEA, 0xC9CD, 0xB4CD, 0xDA50, 0xDA51, 0xE2D9,
+ 0xC5E2, 0xEAE6, 0xC0B5, 0xDA52, 0xD7B8, 0xEAE7,
+ 0xD7AC, 0xC8FC, 0xD8D3, 0xD8CD, 0xD4DE, 0xDA53,
+ 0xD4F9, 0xC9C4, 0xD3AE, 0xB8D3, 0xB3E0, 0xDA54,
+ 0xC9E2, 0xF4F6, 0xDA55, 0xDA56, 0xDA57, 0xBAD5,
+ 0xDA58, 0xF4F7, 0xDA59, 0xDA5A, 0xD7DF, 0xDA5B,
+ 0xDA5C, 0xF4F1, 0xB8B0, 0xD5D4, 0xB8CF, 0xC6F0,
+ 0xDA5D, 0xDA5E, 0xDA5F, 0xDA60, 0xDA61, 0xDA62,
+ 0xDA63, 0xDA64, 0xDA65, 0xB3C3, 0xDA66, 0xDA67,
+ 0xF4F2, 0xB3AC, 0xDA68, 0xDA69, 0xDA6A, 0xDA6B,
+ 0xD4BD, 0xC7F7, 0xDA6C, 0xDA6D, 0xDA6E, 0xDA6F,
+ 0xDA70, 0xF4F4, 0xDA71, 0xDA72, 0xF4F3, 0xDA73,
+ 0xDA74, 0xDA75, 0xDA76, 0xDA77, 0xDA78, 0xDA79,
+ 0xDA7A, 0xDA7B, 0xDA7C, 0xCCCB, 0xDA7D, 0xDA7E,
+ 0xDA80, 0xC8A4, 0xDA81, 0xDA82, 0xDA83, 0xDA84,
+ 0xDA85, 0xDA86, 0xDA87, 0xDA88, 0xDA89, 0xDA8A,
+ 0xDA8B, 0xDA8C, 0xDA8D, 0xF4F5, 0xDA8E, 0xD7E3,
+ 0xC5BF, 0xF5C0, 0xDA8F, 0xDA90, 0xF5BB, 0xDA91,
+ 0xF5C3, 0xDA92, 0xF5C2, 0xDA93, 0xD6BA, 0xF5C1,
+ 0xDA94, 0xDA95, 0xDA96, 0xD4BE, 0xF5C4, 0xDA97,
+ 0xF5CC, 0xDA98, 0xDA99, 0xDA9A, 0xDA9B, 0xB0CF,
+ 0xB5F8, 0xDA9C, 0xF5C9, 0xF5CA, 0xDA9D, 0xC5DC,
+ 0xDA9E, 0xDA9F, 0xDAA0, 0xDB40, 0xF5C5, 0xF5C6,
+ 0xDB41, 0xDB42, 0xF5C7, 0xF5CB, 0xDB43, 0xBEE0,
+ 0xF5C8, 0xB8FA, 0xDB44, 0xDB45, 0xDB46, 0xF5D0,
+ 0xF5D3, 0xDB47, 0xDB48, 0xDB49, 0xBFE7, 0xDB4A,
+ 0xB9F2, 0xF5BC, 0xF5CD, 0xDB4B, 0xDB4C, 0xC2B7,
+ 0xDB4D, 0xDB4E, 0xDB4F, 0xCCF8, 0xDB50, 0xBCF9,
+ 0xDB51, 0xF5CE, 0xF5CF, 0xF5D1, 0xB6E5, 0xF5D2,
+ 0xDB52, 0xF5D5, 0xDB53, 0xDB54, 0xDB55, 0xDB56,
+ 0xDB57, 0xDB58, 0xDB59, 0xF5BD, 0xDB5A, 0xDB5B,
+ 0xDB5C, 0xF5D4, 0xD3BB, 0xDB5D, 0xB3EC, 0xDB5E,
+ 0xDB5F, 0xCCA4, 0xDB60, 0xDB61, 0xDB62, 0xDB63,
+ 0xF5D6, 0xDB64, 0xDB65, 0xDB66, 0xDB67, 0xDB68,
+ 0xDB69, 0xDB6A, 0xDB6B, 0xF5D7, 0xBEE1, 0xF5D8,
+ 0xDB6C, 0xDB6D, 0xCCDF, 0xF5DB, 0xDB6E, 0xDB6F,
+ 0xDB70, 0xDB71, 0xDB72, 0xB2C8, 0xD7D9, 0xDB73,
+ 0xF5D9, 0xDB74, 0xF5DA, 0xF5DC, 0xDB75, 0xF5E2,
+ 0xDB76, 0xDB77, 0xDB78, 0xF5E0, 0xDB79, 0xDB7A,
+ 0xDB7B, 0xF5DF, 0xF5DD, 0xDB7C, 0xDB7D, 0xF5E1,
+ 0xDB7E, 0xDB80, 0xF5DE, 0xF5E4, 0xF5E5, 0xDB81,
+ 0xCCE3, 0xDB82, 0xDB83, 0xE5BF, 0xB5B8, 0xF5E3,
+ 0xF5E8, 0xCCA3, 0xDB84, 0xDB85, 0xDB86, 0xDB87,
+ 0xDB88, 0xF5E6, 0xF5E7, 0xDB89, 0xDB8A, 0xDB8B,
+ 0xDB8C, 0xDB8D, 0xDB8E, 0xF5BE, 0xDB8F, 0xDB90,
+ 0xDB91, 0xDB92, 0xDB93, 0xDB94, 0xDB95, 0xDB96,
+ 0xDB97, 0xDB98, 0xDB99, 0xDB9A, 0xB1C4, 0xDB9B,
+ 0xDB9C, 0xF5BF, 0xDB9D, 0xDB9E, 0xB5C5, 0xB2E4,
+ 0xDB9F, 0xF5EC, 0xF5E9, 0xDBA0, 0xB6D7, 0xDC40,
+ 0xF5ED, 0xDC41, 0xF5EA, 0xDC42, 0xDC43, 0xDC44,
+ 0xDC45, 0xDC46, 0xF5EB, 0xDC47, 0xDC48, 0xB4DA,
+ 0xDC49, 0xD4EA, 0xDC4A, 0xDC4B, 0xDC4C, 0xF5EE,
+ 0xDC4D, 0xB3F9, 0xDC4E, 0xDC4F, 0xDC50, 0xDC51,
+ 0xDC52, 0xDC53, 0xDC54, 0xF5EF, 0xF5F1, 0xDC55,
+ 0xDC56, 0xDC57, 0xF5F0, 0xDC58, 0xDC59, 0xDC5A,
+ 0xDC5B, 0xDC5C, 0xDC5D, 0xDC5E, 0xF5F2, 0xDC5F,
+ 0xF5F3, 0xDC60, 0xDC61, 0xDC62, 0xDC63, 0xDC64,
+ 0xDC65, 0xDC66, 0xDC67, 0xDC68, 0xDC69, 0xDC6A,
+ 0xDC6B, 0xC9ED, 0xB9AA, 0xDC6C, 0xDC6D, 0xC7FB,
+ 0xDC6E, 0xDC6F, 0xB6E3, 0xDC70, 0xDC71, 0xDC72,
+ 0xDC73, 0xDC74, 0xDC75, 0xDC76, 0xCCC9, 0xDC77,
+ 0xDC78, 0xDC79, 0xDC7A, 0xDC7B, 0xDC7C, 0xDC7D,
+ 0xDC7E, 0xDC80, 0xDC81, 0xDC82, 0xDC83, 0xDC84,
+ 0xDC85, 0xDC86, 0xDC87, 0xDC88, 0xDC89, 0xDC8A,
+ 0xEAA6, 0xDC8B, 0xDC8C, 0xDC8D, 0xDC8E, 0xDC8F,
+ 0xDC90, 0xDC91, 0xDC92, 0xDC93, 0xDC94, 0xDC95,
+ 0xDC96, 0xDC97, 0xDC98, 0xDC99, 0xDC9A, 0xDC9B,
+ 0xDC9C, 0xDC9D, 0xDC9E, 0xDC9F, 0xDCA0, 0xDD40,
+ 0xDD41, 0xDD42, 0xDD43, 0xDD44, 0xDD45, 0xDD46,
+ 0xDD47, 0xDD48, 0xDD49, 0xDD4A, 0xDD4B, 0xDD4C,
+ 0xDD4D, 0xDD4E, 0xDD4F, 0xDD50, 0xDD51, 0xDD52,
+ 0xDD53, 0xDD54, 0xDD55, 0xDD56, 0xDD57, 0xDD58,
+ 0xDD59, 0xDD5A, 0xDD5B, 0xDD5C, 0xDD5D, 0xDD5E,
+ 0xDD5F, 0xDD60, 0xDD61, 0xDD62, 0xDD63, 0xDD64,
+ 0xDD65, 0xDD66, 0xDD67, 0xDD68, 0xDD69, 0xDD6A,
+ 0xDD6B, 0xDD6C, 0xDD6D, 0xDD6E, 0xDD6F, 0xDD70,
+ 0xDD71, 0xDD72, 0xDD73, 0xDD74, 0xDD75, 0xDD76,
+ 0xDD77, 0xDD78, 0xDD79, 0xDD7A, 0xDD7B, 0xDD7C,
+ 0xDD7D, 0xDD7E, 0xDD80, 0xDD81, 0xDD82, 0xDD83,
+ 0xDD84, 0xDD85, 0xDD86, 0xDD87, 0xDD88, 0xDD89,
+ 0xDD8A, 0xDD8B, 0xDD8C, 0xDD8D, 0xDD8E, 0xDD8F,
+ 0xDD90, 0xDD91, 0xDD92, 0xDD93, 0xDD94, 0xDD95,
+ 0xDD96, 0xDD97, 0xDD98, 0xDD99, 0xDD9A, 0xDD9B,
+ 0xDD9C, 0xDD9D, 0xDD9E, 0xDD9F, 0xDDA0, 0xDE40,
+ 0xDE41, 0xDE42, 0xDE43, 0xDE44, 0xDE45, 0xDE46,
+ 0xDE47, 0xDE48, 0xDE49, 0xDE4A, 0xDE4B, 0xDE4C,
+ 0xDE4D, 0xDE4E, 0xDE4F, 0xDE50, 0xDE51, 0xDE52,
+ 0xDE53, 0xDE54, 0xDE55, 0xDE56, 0xDE57, 0xDE58,
+ 0xDE59, 0xDE5A, 0xDE5B, 0xDE5C, 0xDE5D, 0xDE5E,
+ 0xDE5F, 0xDE60, 0xB3B5, 0xD4FE, 0xB9EC, 0xD0F9,
+ 0xDE61, 0xE9ED, 0xD7AA, 0xE9EE, 0xC2D6, 0xC8ED,
+ 0xBAE4, 0xE9EF, 0xE9F0, 0xE9F1, 0xD6E1, 0xE9F2,
+ 0xE9F3, 0xE9F5, 0xE9F4, 0xE9F6, 0xE9F7, 0xC7E1,
+ 0xE9F8, 0xD4D8, 0xE9F9, 0xBDCE, 0xDE62, 0xE9FA,
+ 0xE9FB, 0xBDCF, 0xE9FC, 0xB8A8, 0xC1BE, 0xE9FD,
+ 0xB1B2, 0xBBD4, 0xB9F5, 0xE9FE, 0xDE63, 0xEAA1,
+ 0xEAA2, 0xEAA3, 0xB7F8, 0xBCAD, 0xDE64, 0xCAE4,
+ 0xE0CE, 0xD4AF, 0xCFBD, 0xD5B7, 0xEAA4, 0xD5DE,
+ 0xEAA5, 0xD0C1, 0xB9BC, 0xDE65, 0xB4C7, 0xB1D9,
+ 0xDE66, 0xDE67, 0xDE68, 0xC0B1, 0xDE69, 0xDE6A,
+ 0xDE6B, 0xDE6C, 0xB1E6, 0xB1E7, 0xDE6D, 0xB1E8,
+ 0xDE6E, 0xDE6F, 0xDE70, 0xDE71, 0xB3BD, 0xC8E8,
+ 0xDE72, 0xDE73, 0xDE74, 0xDE75, 0xE5C1, 0xDE76,
+ 0xDE77, 0xB1DF, 0xDE78, 0xDE79, 0xDE7A, 0xC1C9,
+ 0xB4EF, 0xDE7B, 0xDE7C, 0xC7A8, 0xD3D8, 0xDE7D,
+ 0xC6F9, 0xD1B8, 0xDE7E, 0xB9FD, 0xC2F5, 0xDE80,
+ 0xDE81, 0xDE82, 0xDE83, 0xDE84, 0xD3AD, 0xDE85,
+ 0xD4CB, 0xBDFC, 0xDE86, 0xE5C2, 0xB7B5, 0xE5C3,
+ 0xDE87, 0xDE88, 0xBBB9, 0xD5E2, 0xDE89, 0xBDF8,
+ 0xD4B6, 0xCEA5, 0xC1AC, 0xB3D9, 0xDE8A, 0xDE8B,
+ 0xCCF6, 0xDE8C, 0xE5C6, 0xE5C4, 0xE5C8, 0xDE8D,
+ 0xE5CA, 0xE5C7, 0xB5CF, 0xC6C8, 0xDE8E, 0xB5FC,
+ 0xE5C5, 0xDE8F, 0xCAF6, 0xDE90, 0xDE91, 0xE5C9,
+ 0xDE92, 0xDE93, 0xDE94, 0xC3D4, 0xB1C5, 0xBCA3,
+ 0xDE95, 0xDE96, 0xDE97, 0xD7B7, 0xDE98, 0xDE99,
+ 0xCDCB, 0xCBCD, 0xCACA, 0xCCD3, 0xE5CC, 0xE5CB,
+ 0xC4E6, 0xDE9A, 0xDE9B, 0xD1A1, 0xD1B7, 0xE5CD,
+ 0xDE9C, 0xE5D0, 0xDE9D, 0xCDB8, 0xD6F0, 0xE5CF,
+ 0xB5DD, 0xDE9E, 0xCDBE, 0xDE9F, 0xE5D1, 0xB6BA,
+ 0xDEA0, 0xDF40, 0xCDA8, 0xB9E4, 0xDF41, 0xCAC5,
+ 0xB3D1, 0xCBD9, 0xD4EC, 0xE5D2, 0xB7EA, 0xDF42,
+ 0xDF43, 0xDF44, 0xE5CE, 0xDF45, 0xDF46, 0xDF47,
+ 0xDF48, 0xDF49, 0xDF4A, 0xE5D5, 0xB4FE, 0xE5D6,
+ 0xDF4B, 0xDF4C, 0xDF4D, 0xDF4E, 0xDF4F, 0xE5D3,
+ 0xE5D4, 0xDF50, 0xD2DD, 0xDF51, 0xDF52, 0xC2DF,
+ 0xB1C6, 0xDF53, 0xD3E2, 0xDF54, 0xDF55, 0xB6DD,
+ 0xCBEC, 0xDF56, 0xE5D7, 0xDF57, 0xDF58, 0xD3F6,
+ 0xDF59, 0xDF5A, 0xDF5B, 0xDF5C, 0xDF5D, 0xB1E9,
+ 0xDF5E, 0xB6F4, 0xE5DA, 0xE5D8, 0xE5D9, 0xB5C0,
+ 0xDF5F, 0xDF60, 0xDF61, 0xD2C5, 0xE5DC, 0xDF62,
+ 0xDF63, 0xE5DE, 0xDF64, 0xDF65, 0xDF66, 0xDF67,
+ 0xDF68, 0xDF69, 0xE5DD, 0xC7B2, 0xDF6A, 0xD2A3,
+ 0xDF6B, 0xDF6C, 0xE5DB, 0xDF6D, 0xDF6E, 0xDF6F,
+ 0xDF70, 0xD4E2, 0xD5DA, 0xDF71, 0xDF72, 0xDF73,
+ 0xDF74, 0xDF75, 0xE5E0, 0xD7F1, 0xDF76, 0xDF77,
+ 0xDF78, 0xDF79, 0xDF7A, 0xDF7B, 0xDF7C, 0xE5E1,
+ 0xDF7D, 0xB1DC, 0xD1FB, 0xDF7E, 0xE5E2, 0xE5E4,
+ 0xDF80, 0xDF81, 0xDF82, 0xDF83, 0xE5E3, 0xDF84,
+ 0xDF85, 0xE5E5, 0xDF86, 0xDF87, 0xDF88, 0xDF89,
+ 0xDF8A, 0xD2D8, 0xDF8B, 0xB5CB, 0xDF8C, 0xE7DF,
+ 0xDF8D, 0xDAF5, 0xDF8E, 0xDAF8, 0xDF8F, 0xDAF6,
+ 0xDF90, 0xDAF7, 0xDF91, 0xDF92, 0xDF93, 0xDAFA,
+ 0xD0CF, 0xC4C7, 0xDF94, 0xDF95, 0xB0EE, 0xDF96,
+ 0xDF97, 0xDF98, 0xD0B0, 0xDF99, 0xDAF9, 0xDF9A,
+ 0xD3CA, 0xBAAA, 0xDBA2, 0xC7F1, 0xDF9B, 0xDAFC,
+ 0xDAFB, 0xC9DB, 0xDAFD, 0xDF9C, 0xDBA1, 0xD7DE,
+ 0xDAFE, 0xC1DA, 0xDF9D, 0xDF9E, 0xDBA5, 0xDF9F,
+ 0xDFA0, 0xD3F4, 0xE040, 0xE041, 0xDBA7, 0xDBA4,
+ 0xE042, 0xDBA8, 0xE043, 0xE044, 0xBDBC, 0xE045,
+ 0xE046, 0xE047, 0xC0C9, 0xDBA3, 0xDBA6, 0xD6A3,
+ 0xE048, 0xDBA9, 0xE049, 0xE04A, 0xE04B, 0xDBAD,
+ 0xE04C, 0xE04D, 0xE04E, 0xDBAE, 0xDBAC, 0xBAC2,
+ 0xE04F, 0xE050, 0xE051, 0xBFA4, 0xDBAB, 0xE052,
+ 0xE053, 0xE054, 0xDBAA, 0xD4C7, 0xB2BF, 0xE055,
+ 0xE056, 0xDBAF, 0xE057, 0xB9F9, 0xE058, 0xDBB0,
+ 0xE059, 0xE05A, 0xE05B, 0xE05C, 0xB3BB, 0xE05D,
+ 0xE05E, 0xE05F, 0xB5A6, 0xE060, 0xE061, 0xE062,
+ 0xE063, 0xB6BC, 0xDBB1, 0xE064, 0xE065, 0xE066,
+ 0xB6F5, 0xE067, 0xDBB2, 0xE068, 0xE069, 0xE06A,
+ 0xE06B, 0xE06C, 0xE06D, 0xE06E, 0xE06F, 0xE070,
+ 0xE071, 0xE072, 0xE073, 0xE074, 0xE075, 0xE076,
+ 0xE077, 0xE078, 0xE079, 0xE07A, 0xE07B, 0xB1C9,
+ 0xE07C, 0xE07D, 0xE07E, 0xE080, 0xDBB4, 0xE081,
+ 0xE082, 0xE083, 0xDBB3, 0xDBB5, 0xE084, 0xE085,
+ 0xE086, 0xE087, 0xE088, 0xE089, 0xE08A, 0xE08B,
+ 0xE08C, 0xE08D, 0xE08E, 0xDBB7, 0xE08F, 0xDBB6,
+ 0xE090, 0xE091, 0xE092, 0xE093, 0xE094, 0xE095,
+ 0xE096, 0xDBB8, 0xE097, 0xE098, 0xE099, 0xE09A,
+ 0xE09B, 0xE09C, 0xE09D, 0xE09E, 0xE09F, 0xDBB9,
+ 0xE0A0, 0xE140, 0xDBBA, 0xE141, 0xE142, 0xD3CF,
+ 0xF4FA, 0xC7F5, 0xD7C3, 0xC5E4, 0xF4FC, 0xF4FD,
+ 0xF4FB, 0xE143, 0xBEC6, 0xE144, 0xE145, 0xE146,
+ 0xE147, 0xD0EF, 0xE148, 0xE149, 0xB7D3, 0xE14A,
+ 0xE14B, 0xD4CD, 0xCCAA, 0xE14C, 0xE14D, 0xF5A2,
+ 0xF5A1, 0xBAA8, 0xF4FE, 0xCBD6, 0xE14E, 0xE14F,
+ 0xE150, 0xF5A4, 0xC0D2, 0xE151, 0xB3EA, 0xE152,
+ 0xCDAA, 0xF5A5, 0xF5A3, 0xBDB4, 0xF5A8, 0xE153,
+ 0xF5A9, 0xBDCD, 0xC3B8, 0xBFE1, 0xCBE1, 0xF5AA,
+ 0xE154, 0xE155, 0xE156, 0xF5A6, 0xF5A7, 0xC4F0,
+ 0xE157, 0xE158, 0xE159, 0xE15A, 0xE15B, 0xF5AC,
+ 0xE15C, 0xB4BC, 0xE15D, 0xD7ED, 0xE15E, 0xB4D7,
+ 0xF5AB, 0xF5AE, 0xE15F, 0xE160, 0xF5AD, 0xF5AF,
+ 0xD0D1, 0xE161, 0xE162, 0xE163, 0xE164, 0xE165,
+ 0xE166, 0xE167, 0xC3D1, 0xC8A9, 0xE168, 0xE169,
+ 0xE16A, 0xE16B, 0xE16C, 0xE16D, 0xF5B0, 0xF5B1,
+ 0xE16E, 0xE16F, 0xE170, 0xE171, 0xE172, 0xE173,
+ 0xF5B2, 0xE174, 0xE175, 0xF5B3, 0xF5B4, 0xF5B5,
+ 0xE176, 0xE177, 0xE178, 0xE179, 0xF5B7, 0xF5B6,
+ 0xE17A, 0xE17B, 0xE17C, 0xE17D, 0xF5B8, 0xE17E,
+ 0xE180, 0xE181, 0xE182, 0xE183, 0xE184, 0xE185,
+ 0xE186, 0xE187, 0xE188, 0xE189, 0xE18A, 0xB2C9,
+ 0xE18B, 0xD3D4, 0xCACD, 0xE18C, 0xC0EF, 0xD6D8,
+ 0xD2B0, 0xC1BF, 0xE18D, 0xBDF0, 0xE18E, 0xE18F,
+ 0xE190, 0xE191, 0xE192, 0xE193, 0xE194, 0xE195,
+ 0xE196, 0xE197, 0xB8AA, 0xE198, 0xE199, 0xE19A,
+ 0xE19B, 0xE19C, 0xE19D, 0xE19E, 0xE19F, 0xE1A0,
+ 0xE240, 0xE241, 0xE242, 0xE243, 0xE244, 0xE245,
+ 0xE246, 0xE247, 0xE248, 0xE249, 0xE24A, 0xE24B,
+ 0xE24C, 0xE24D, 0xE24E, 0xE24F, 0xE250, 0xE251,
+ 0xE252, 0xE253, 0xE254, 0xE255, 0xE256, 0xE257,
+ 0xE258, 0xE259, 0xE25A, 0xE25B, 0xE25C, 0xE25D,
+ 0xE25E, 0xE25F, 0xE260, 0xE261, 0xE262, 0xE263,
+ 0xE264, 0xE265, 0xE266, 0xE267, 0xE268, 0xE269,
+ 0xE26A, 0xE26B, 0xE26C, 0xE26D, 0xE26E, 0xE26F,
+ 0xE270, 0xE271, 0xE272, 0xE273, 0xE274, 0xE275,
+ 0xE276, 0xE277, 0xE278, 0xE279, 0xE27A, 0xE27B,
+ 0xE27C, 0xE27D, 0xE27E, 0xE280, 0xE281, 0xE282,
+ 0xE283, 0xE284, 0xE285, 0xE286, 0xE287, 0xE288,
+ 0xE289, 0xE28A, 0xE28B, 0xE28C, 0xE28D, 0xE28E,
+ 0xE28F, 0xE290, 0xE291, 0xE292, 0xE293, 0xE294,
+ 0xE295, 0xE296, 0xE297, 0xE298, 0xE299, 0xE29A,
+ 0xE29B, 0xE29C, 0xE29D, 0xE29E, 0xE29F, 0xE2A0,
+ 0xE340, 0xE341, 0xE342, 0xE343, 0xE344, 0xE345,
+ 0xE346, 0xE347, 0xE348, 0xE349, 0xE34A, 0xE34B,
+ 0xE34C, 0xE34D, 0xE34E, 0xE34F, 0xE350, 0xE351,
+ 0xE352, 0xE353, 0xE354, 0xE355, 0xE356, 0xE357,
+ 0xE358, 0xE359, 0xE35A, 0xE35B, 0xE35C, 0xE35D,
+ 0xE35E, 0xE35F, 0xE360, 0xE361, 0xE362, 0xE363,
+ 0xE364, 0xE365, 0xE366, 0xE367, 0xE368, 0xE369,
+ 0xE36A, 0xE36B, 0xE36C, 0xE36D, 0xBCF8, 0xE36E,
+ 0xE36F, 0xE370, 0xE371, 0xE372, 0xE373, 0xE374,
+ 0xE375, 0xE376, 0xE377, 0xE378, 0xE379, 0xE37A,
+ 0xE37B, 0xE37C, 0xE37D, 0xE37E, 0xE380, 0xE381,
+ 0xE382, 0xE383, 0xE384, 0xE385, 0xE386, 0xE387,
+ 0xF6C6, 0xE388, 0xE389, 0xE38A, 0xE38B, 0xE38C,
+ 0xE38D, 0xE38E, 0xE38F, 0xE390, 0xE391, 0xE392,
+ 0xE393, 0xE394, 0xE395, 0xE396, 0xE397, 0xE398,
+ 0xE399, 0xE39A, 0xE39B, 0xE39C, 0xE39D, 0xE39E,
+ 0xE39F, 0xE3A0, 0xE440, 0xE441, 0xE442, 0xE443,
+ 0xE444, 0xE445, 0xF6C7, 0xE446, 0xE447, 0xE448,
+ 0xE449, 0xE44A, 0xE44B, 0xE44C, 0xE44D, 0xE44E,
+ 0xE44F, 0xE450, 0xE451, 0xE452, 0xE453, 0xE454,
+ 0xE455, 0xE456, 0xE457, 0xE458, 0xE459, 0xE45A,
+ 0xE45B, 0xE45C, 0xE45D, 0xE45E, 0xF6C8, 0xE45F,
+ 0xE460, 0xE461, 0xE462, 0xE463, 0xE464, 0xE465,
+ 0xE466, 0xE467, 0xE468, 0xE469, 0xE46A, 0xE46B,
+ 0xE46C, 0xE46D, 0xE46E, 0xE46F, 0xE470, 0xE471,
+ 0xE472, 0xE473, 0xE474, 0xE475, 0xE476, 0xE477,
+ 0xE478, 0xE479, 0xE47A, 0xE47B, 0xE47C, 0xE47D,
+ 0xE47E, 0xE480, 0xE481, 0xE482, 0xE483, 0xE484,
+ 0xE485, 0xE486, 0xE487, 0xE488, 0xE489, 0xE48A,
+ 0xE48B, 0xE48C, 0xE48D, 0xE48E, 0xE48F, 0xE490,
+ 0xE491, 0xE492, 0xE493, 0xE494, 0xE495, 0xE496,
+ 0xE497, 0xE498, 0xE499, 0xE49A, 0xE49B, 0xE49C,
+ 0xE49D, 0xE49E, 0xE49F, 0xE4A0, 0xE540, 0xE541,
+ 0xE542, 0xE543, 0xE544, 0xE545, 0xE546, 0xE547,
+ 0xE548, 0xE549, 0xE54A, 0xE54B, 0xE54C, 0xE54D,
+ 0xE54E, 0xE54F, 0xE550, 0xE551, 0xE552, 0xE553,
+ 0xE554, 0xE555, 0xE556, 0xE557, 0xE558, 0xE559,
+ 0xE55A, 0xE55B, 0xE55C, 0xE55D, 0xE55E, 0xE55F,
+ 0xE560, 0xE561, 0xE562, 0xE563, 0xE564, 0xE565,
+ 0xE566, 0xE567, 0xE568, 0xE569, 0xE56A, 0xE56B,
+ 0xE56C, 0xE56D, 0xE56E, 0xE56F, 0xE570, 0xE571,
+ 0xE572, 0xE573, 0xF6C9, 0xE574, 0xE575, 0xE576,
+ 0xE577, 0xE578, 0xE579, 0xE57A, 0xE57B, 0xE57C,
+ 0xE57D, 0xE57E, 0xE580, 0xE581, 0xE582, 0xE583,
+ 0xE584, 0xE585, 0xE586, 0xE587, 0xE588, 0xE589,
+ 0xE58A, 0xE58B, 0xE58C, 0xE58D, 0xE58E, 0xE58F,
+ 0xE590, 0xE591, 0xE592, 0xE593, 0xE594, 0xE595,
+ 0xE596, 0xE597, 0xE598, 0xE599, 0xE59A, 0xE59B,
+ 0xE59C, 0xE59D, 0xE59E, 0xE59F, 0xF6CA, 0xE5A0,
+ 0xE640, 0xE641, 0xE642, 0xE643, 0xE644, 0xE645,
+ 0xE646, 0xE647, 0xE648, 0xE649, 0xE64A, 0xE64B,
+ 0xE64C, 0xE64D, 0xE64E, 0xE64F, 0xE650, 0xE651,
+ 0xE652, 0xE653, 0xE654, 0xE655, 0xE656, 0xE657,
+ 0xE658, 0xE659, 0xE65A, 0xE65B, 0xE65C, 0xE65D,
+ 0xE65E, 0xE65F, 0xE660, 0xE661, 0xE662, 0xF6CC,
+ 0xE663, 0xE664, 0xE665, 0xE666, 0xE667, 0xE668,
+ 0xE669, 0xE66A, 0xE66B, 0xE66C, 0xE66D, 0xE66E,
+ 0xE66F, 0xE670, 0xE671, 0xE672, 0xE673, 0xE674,
+ 0xE675, 0xE676, 0xE677, 0xE678, 0xE679, 0xE67A,
+ 0xE67B, 0xE67C, 0xE67D, 0xE67E, 0xE680, 0xE681,
+ 0xE682, 0xE683, 0xE684, 0xE685, 0xE686, 0xE687,
+ 0xE688, 0xE689, 0xE68A, 0xE68B, 0xE68C, 0xE68D,
+ 0xE68E, 0xE68F, 0xE690, 0xE691, 0xE692, 0xE693,
+ 0xE694, 0xE695, 0xE696, 0xE697, 0xE698, 0xE699,
+ 0xE69A, 0xE69B, 0xE69C, 0xE69D, 0xF6CB, 0xE69E,
+ 0xE69F, 0xE6A0, 0xE740, 0xE741, 0xE742, 0xE743,
+ 0xE744, 0xE745, 0xE746, 0xE747, 0xF7E9, 0xE748,
+ 0xE749, 0xE74A, 0xE74B, 0xE74C, 0xE74D, 0xE74E,
+ 0xE74F, 0xE750, 0xE751, 0xE752, 0xE753, 0xE754,
+ 0xE755, 0xE756, 0xE757, 0xE758, 0xE759, 0xE75A,
+ 0xE75B, 0xE75C, 0xE75D, 0xE75E, 0xE75F, 0xE760,
+ 0xE761, 0xE762, 0xE763, 0xE764, 0xE765, 0xE766,
+ 0xE767, 0xE768, 0xE769, 0xE76A, 0xE76B, 0xE76C,
+ 0xE76D, 0xE76E, 0xE76F, 0xE770, 0xE771, 0xE772,
+ 0xE773, 0xE774, 0xE775, 0xE776, 0xE777, 0xE778,
+ 0xE779, 0xE77A, 0xE77B, 0xE77C, 0xE77D, 0xE77E,
+ 0xE780, 0xE781, 0xE782, 0xE783, 0xE784, 0xE785,
+ 0xE786, 0xE787, 0xE788, 0xE789, 0xE78A, 0xE78B,
+ 0xE78C, 0xE78D, 0xE78E, 0xE78F, 0xE790, 0xE791,
+ 0xE792, 0xE793, 0xE794, 0xE795, 0xE796, 0xE797,
+ 0xE798, 0xE799, 0xE79A, 0xE79B, 0xE79C, 0xE79D,
+ 0xE79E, 0xE79F, 0xE7A0, 0xE840, 0xE841, 0xE842,
+ 0xE843, 0xE844, 0xE845, 0xE846, 0xE847, 0xE848,
+ 0xE849, 0xE84A, 0xE84B, 0xE84C, 0xE84D, 0xE84E,
+ 0xF6CD, 0xE84F, 0xE850, 0xE851, 0xE852, 0xE853,
+ 0xE854, 0xE855, 0xE856, 0xE857, 0xE858, 0xE859,
+ 0xE85A, 0xE85B, 0xE85C, 0xE85D, 0xE85E, 0xE85F,
+ 0xE860, 0xE861, 0xE862, 0xE863, 0xE864, 0xE865,
+ 0xE866, 0xE867, 0xE868, 0xE869, 0xE86A, 0xE86B,
+ 0xE86C, 0xE86D, 0xE86E, 0xE86F, 0xE870, 0xE871,
+ 0xE872, 0xE873, 0xE874, 0xE875, 0xE876, 0xE877,
+ 0xE878, 0xE879, 0xE87A, 0xF6CE, 0xE87B, 0xE87C,
+ 0xE87D, 0xE87E, 0xE880, 0xE881, 0xE882, 0xE883,
+ 0xE884, 0xE885, 0xE886, 0xE887, 0xE888, 0xE889,
+ 0xE88A, 0xE88B, 0xE88C, 0xE88D, 0xE88E, 0xE88F,
+ 0xE890, 0xE891, 0xE892, 0xE893, 0xE894, 0xEEC4,
+ 0xEEC5, 0xEEC6, 0xD5EB, 0xB6A4, 0xEEC8, 0xEEC7,
+ 0xEEC9, 0xEECA, 0xC7A5, 0xEECB, 0xEECC, 0xE895,
+ 0xB7B0, 0xB5F6, 0xEECD, 0xEECF, 0xE896, 0xEECE,
+ 0xE897, 0xB8C6, 0xEED0, 0xEED1, 0xEED2, 0xB6DB,
+ 0xB3AE, 0xD6D3, 0xC4C6, 0xB1B5, 0xB8D6, 0xEED3,
+ 0xEED4, 0xD4BF, 0xC7D5, 0xBEFB, 0xCED9, 0xB9B3,
+ 0xEED6, 0xEED5, 0xEED8, 0xEED7, 0xC5A5, 0xEED9,
+ 0xEEDA, 0xC7AE, 0xEEDB, 0xC7AF, 0xEEDC, 0xB2A7,
+ 0xEEDD, 0xEEDE, 0xEEDF, 0xEEE0, 0xEEE1, 0xD7EA,
+ 0xEEE2, 0xEEE3, 0xBCD8, 0xEEE4, 0xD3CB, 0xCCFA,
+ 0xB2AC, 0xC1E5, 0xEEE5, 0xC7A6, 0xC3AD, 0xE898,
+ 0xEEE6, 0xEEE7, 0xEEE8, 0xEEE9, 0xEEEA, 0xEEEB,
+ 0xEEEC, 0xE899, 0xEEED, 0xEEEE, 0xEEEF, 0xE89A,
+ 0xE89B, 0xEEF0, 0xEEF1, 0xEEF2, 0xEEF4, 0xEEF3,
+ 0xE89C, 0xEEF5, 0xCDAD, 0xC2C1, 0xEEF6, 0xEEF7,
+ 0xEEF8, 0xD5A1, 0xEEF9, 0xCFB3, 0xEEFA, 0xEEFB,
+ 0xE89D, 0xEEFC, 0xEEFD, 0xEFA1, 0xEEFE, 0xEFA2,
+ 0xB8F5, 0xC3FA, 0xEFA3, 0xEFA4, 0xBDC2, 0xD2BF,
+ 0xB2F9, 0xEFA5, 0xEFA6, 0xEFA7, 0xD2F8, 0xEFA8,
+ 0xD6FD, 0xEFA9, 0xC6CC, 0xE89E, 0xEFAA, 0xEFAB,
+ 0xC1B4, 0xEFAC, 0xCFFA, 0xCBF8, 0xEFAE, 0xEFAD,
+ 0xB3FA, 0xB9F8, 0xEFAF, 0xEFB0, 0xD0E2, 0xEFB1,
+ 0xEFB2, 0xB7E6, 0xD0BF, 0xEFB3, 0xEFB4, 0xEFB5,
+ 0xC8F1, 0xCCE0, 0xEFB6, 0xEFB7, 0xEFB8, 0xEFB9,
+ 0xEFBA, 0xD5E0, 0xEFBB, 0xB4ED, 0xC3AA, 0xEFBC,
+ 0xE89F, 0xEFBD, 0xEFBE, 0xEFBF, 0xE8A0, 0xCEFD,
+ 0xEFC0, 0xC2E0, 0xB4B8, 0xD7B6, 0xBDF5, 0xE940,
+ 0xCFC7, 0xEFC3, 0xEFC1, 0xEFC2, 0xEFC4, 0xB6A7,
+ 0xBCFC, 0xBEE2, 0xC3CC, 0xEFC5, 0xEFC6, 0xE941,
+ 0xEFC7, 0xEFCF, 0xEFC8, 0xEFC9, 0xEFCA, 0xC7C2,
+ 0xEFF1, 0xB6CD, 0xEFCB, 0xE942, 0xEFCC, 0xEFCD,
+ 0xB6C6, 0xC3BE, 0xEFCE, 0xE943, 0xEFD0, 0xEFD1,
+ 0xEFD2, 0xD5F2, 0xE944, 0xEFD3, 0xC4F7, 0xE945,
+ 0xEFD4, 0xC4F8, 0xEFD5, 0xEFD6, 0xB8E4, 0xB0F7,
+ 0xEFD7, 0xEFD8, 0xEFD9, 0xE946, 0xEFDA, 0xEFDB,
+ 0xEFDC, 0xEFDD, 0xE947, 0xEFDE, 0xBEB5, 0xEFE1,
+ 0xEFDF, 0xEFE0, 0xE948, 0xEFE2, 0xEFE3, 0xC1CD,
+ 0xEFE4, 0xEFE5, 0xEFE6, 0xEFE7, 0xEFE8, 0xEFE9,
+ 0xEFEA, 0xEFEB, 0xEFEC, 0xC0D8, 0xE949, 0xEFED,
+ 0xC1AD, 0xEFEE, 0xEFEF, 0xEFF0, 0xE94A, 0xE94B,
+ 0xCFE2, 0xE94C, 0xE94D, 0xE94E, 0xE94F, 0xE950,
+ 0xE951, 0xE952, 0xE953, 0xB3A4, 0xE954, 0xE955,
+ 0xE956, 0xE957, 0xE958, 0xE959, 0xE95A, 0xE95B,
+ 0xE95C, 0xE95D, 0xE95E, 0xE95F, 0xE960, 0xE961,
+ 0xE962, 0xE963, 0xE964, 0xE965, 0xE966, 0xE967,
+ 0xE968, 0xE969, 0xE96A, 0xE96B, 0xE96C, 0xE96D,
+ 0xE96E, 0xE96F, 0xE970, 0xE971, 0xE972, 0xE973,
+ 0xE974, 0xE975, 0xE976, 0xE977, 0xE978, 0xE979,
+ 0xE97A, 0xE97B, 0xE97C, 0xE97D, 0xE97E, 0xE980,
+ 0xE981, 0xE982, 0xE983, 0xE984, 0xE985, 0xE986,
+ 0xE987, 0xE988, 0xE989, 0xE98A, 0xE98B, 0xE98C,
+ 0xE98D, 0xE98E, 0xE98F, 0xE990, 0xE991, 0xE992,
+ 0xE993, 0xE994, 0xE995, 0xE996, 0xE997, 0xE998,
+ 0xE999, 0xE99A, 0xE99B, 0xE99C, 0xE99D, 0xE99E,
+ 0xE99F, 0xE9A0, 0xEA40, 0xEA41, 0xEA42, 0xEA43,
+ 0xEA44, 0xEA45, 0xEA46, 0xEA47, 0xEA48, 0xEA49,
+ 0xEA4A, 0xEA4B, 0xEA4C, 0xEA4D, 0xEA4E, 0xEA4F,
+ 0xEA50, 0xEA51, 0xEA52, 0xEA53, 0xEA54, 0xEA55,
+ 0xEA56, 0xEA57, 0xEA58, 0xEA59, 0xEA5A, 0xEA5B,
+ 0xC3C5, 0xE3C5, 0xC9C1, 0xE3C6, 0xEA5C, 0xB1D5,
+ 0xCECA, 0xB4B3, 0xC8F2, 0xE3C7, 0xCFD0, 0xE3C8,
+ 0xBCE4, 0xE3C9, 0xE3CA, 0xC3C6, 0xD5A2, 0xC4D6,
+ 0xB9EB, 0xCEC5, 0xE3CB, 0xC3F6, 0xE3CC, 0xEA5D,
+ 0xB7A7, 0xB8F3, 0xBAD2, 0xE3CD, 0xE3CE, 0xD4C4,
+ 0xE3CF, 0xEA5E, 0xE3D0, 0xD1CB, 0xE3D1, 0xE3D2,
+ 0xE3D3, 0xE3D4, 0xD1D6, 0xE3D5, 0xB2FB, 0xC0BB,
+ 0xE3D6, 0xEA5F, 0xC0AB, 0xE3D7, 0xE3D8, 0xE3D9,
+ 0xEA60, 0xE3DA, 0xE3DB, 0xEA61, 0xB8B7, 0xDAE2,
+ 0xEA62, 0xB6D3, 0xEA63, 0xDAE4, 0xDAE3, 0xEA64,
+ 0xEA65, 0xEA66, 0xEA67, 0xEA68, 0xEA69, 0xEA6A,
+ 0xDAE6, 0xEA6B, 0xEA6C, 0xEA6D, 0xC8EE, 0xEA6E,
+ 0xEA6F, 0xDAE5, 0xB7C0, 0xD1F4, 0xD2F5, 0xD5F3,
+ 0xBDD7, 0xEA70, 0xEA71, 0xEA72, 0xEA73, 0xD7E8,
+ 0xDAE8, 0xDAE7, 0xEA74, 0xB0A2, 0xCDD3, 0xEA75,
+ 0xDAE9, 0xEA76, 0xB8BD, 0xBCCA, 0xC2BD, 0xC2A4,
+ 0xB3C2, 0xDAEA, 0xEA77, 0xC2AA, 0xC4B0, 0xBDB5,
+ 0xEA78, 0xEA79, 0xCFDE, 0xEA7A, 0xEA7B, 0xEA7C,
+ 0xDAEB, 0xC9C2, 0xEA7D, 0xEA7E, 0xEA80, 0xEA81,
+ 0xEA82, 0xB1DD, 0xEA83, 0xEA84, 0xEA85, 0xDAEC,
+ 0xEA86, 0xB6B8, 0xD4BA, 0xEA87, 0xB3FD, 0xEA88,
+ 0xEA89, 0xDAED, 0xD4C9, 0xCFD5, 0xC5E3, 0xEA8A,
+ 0xDAEE, 0xEA8B, 0xEA8C, 0xEA8D, 0xEA8E, 0xEA8F,
+ 0xDAEF, 0xEA90, 0xDAF0, 0xC1EA, 0xCCD5, 0xCFDD,
+ 0xEA91, 0xEA92, 0xEA93, 0xEA94, 0xEA95, 0xEA96,
+ 0xEA97, 0xEA98, 0xEA99, 0xEA9A, 0xEA9B, 0xEA9C,
+ 0xEA9D, 0xD3E7, 0xC2A1, 0xEA9E, 0xDAF1, 0xEA9F,
+ 0xEAA0, 0xCBE5, 0xEB40, 0xDAF2, 0xEB41, 0xCBE6,
+ 0xD2FE, 0xEB42, 0xEB43, 0xEB44, 0xB8F4, 0xEB45,
+ 0xEB46, 0xDAF3, 0xB0AF, 0xCFB6, 0xEB47, 0xEB48,
+ 0xD5CF, 0xEB49, 0xEB4A, 0xEB4B, 0xEB4C, 0xEB4D,
+ 0xEB4E, 0xEB4F, 0xEB50, 0xEB51, 0xEB52, 0xCBED,
+ 0xEB53, 0xEB54, 0xEB55, 0xEB56, 0xEB57, 0xEB58,
+ 0xEB59, 0xEB5A, 0xDAF4, 0xEB5B, 0xEB5C, 0xE3C4,
+ 0xEB5D, 0xEB5E, 0xC1A5, 0xEB5F, 0xEB60, 0xF6BF,
+ 0xEB61, 0xEB62, 0xF6C0, 0xF6C1, 0xC4D1, 0xEB63,
+ 0xC8B8, 0xD1E3, 0xEB64, 0xEB65, 0xD0DB, 0xD1C5,
+ 0xBCAF, 0xB9CD, 0xEB66, 0xEFF4, 0xEB67, 0xEB68,
+ 0xB4C6, 0xD3BA, 0xF6C2, 0xB3FB, 0xEB69, 0xEB6A,
+ 0xF6C3, 0xEB6B, 0xEB6C, 0xB5F1, 0xEB6D, 0xEB6E,
+ 0xEB6F, 0xEB70, 0xEB71, 0xEB72, 0xEB73, 0xEB74,
+ 0xEB75, 0xEB76, 0xF6C5, 0xEB77, 0xEB78, 0xEB79,
+ 0xEB7A, 0xEB7B, 0xEB7C, 0xEB7D, 0xD3EA, 0xF6A7,
+ 0xD1A9, 0xEB7E, 0xEB80, 0xEB81, 0xEB82, 0xF6A9,
+ 0xEB83, 0xEB84, 0xEB85, 0xF6A8, 0xEB86, 0xEB87,
+ 0xC1E3, 0xC0D7, 0xEB88, 0xB1A2, 0xEB89, 0xEB8A,
+ 0xEB8B, 0xEB8C, 0xCEED, 0xEB8D, 0xD0E8, 0xF6AB,
+ 0xEB8E, 0xEB8F, 0xCFF6, 0xEB90, 0xF6AA, 0xD5F0,
+ 0xF6AC, 0xC3B9, 0xEB91, 0xEB92, 0xEB93, 0xBBF4,
+ 0xF6AE, 0xF6AD, 0xEB94, 0xEB95, 0xEB96, 0xC4DE,
+ 0xEB97, 0xEB98, 0xC1D8, 0xEB99, 0xEB9A, 0xEB9B,
+ 0xEB9C, 0xEB9D, 0xCBAA, 0xEB9E, 0xCFBC, 0xEB9F,
+ 0xEBA0, 0xEC40, 0xEC41, 0xEC42, 0xEC43, 0xEC44,
+ 0xEC45, 0xEC46, 0xEC47, 0xEC48, 0xF6AF, 0xEC49,
+ 0xEC4A, 0xF6B0, 0xEC4B, 0xEC4C, 0xF6B1, 0xEC4D,
+ 0xC2B6, 0xEC4E, 0xEC4F, 0xEC50, 0xEC51, 0xEC52,
+ 0xB0D4, 0xC5F9, 0xEC53, 0xEC54, 0xEC55, 0xEC56,
+ 0xF6B2, 0xEC57, 0xEC58, 0xEC59, 0xEC5A, 0xEC5B,
+ 0xEC5C, 0xEC5D, 0xEC5E, 0xEC5F, 0xEC60, 0xEC61,
+ 0xEC62, 0xEC63, 0xEC64, 0xEC65, 0xEC66, 0xEC67,
+ 0xEC68, 0xEC69, 0xC7E0, 0xF6A6, 0xEC6A, 0xEC6B,
+ 0xBEB8, 0xEC6C, 0xEC6D, 0xBEB2, 0xEC6E, 0xB5E5,
+ 0xEC6F, 0xEC70, 0xB7C7, 0xEC71, 0xBFBF, 0xC3D2,
+ 0xC3E6, 0xEC72, 0xEC73, 0xD8CC, 0xEC74, 0xEC75,
+ 0xEC76, 0xB8EF, 0xEC77, 0xEC78, 0xEC79, 0xEC7A,
+ 0xEC7B, 0xEC7C, 0xEC7D, 0xEC7E, 0xEC80, 0xBDF9,
+ 0xD1A5, 0xEC81, 0xB0D0, 0xEC82, 0xEC83, 0xEC84,
+ 0xEC85, 0xEC86, 0xF7B0, 0xEC87, 0xEC88, 0xEC89,
+ 0xEC8A, 0xEC8B, 0xEC8C, 0xEC8D, 0xEC8E, 0xF7B1,
+ 0xEC8F, 0xEC90, 0xEC91, 0xEC92, 0xEC93, 0xD0AC,
+ 0xEC94, 0xB0B0, 0xEC95, 0xEC96, 0xEC97, 0xF7B2,
+ 0xF7B3, 0xEC98, 0xF7B4, 0xEC99, 0xEC9A, 0xEC9B,
+ 0xC7CA, 0xEC9C, 0xEC9D, 0xEC9E, 0xEC9F, 0xECA0,
+ 0xED40, 0xED41, 0xBECF, 0xED42, 0xED43, 0xF7B7,
+ 0xED44, 0xED45, 0xED46, 0xED47, 0xED48, 0xED49,
+ 0xED4A, 0xF7B6, 0xED4B, 0xB1DE, 0xED4C, 0xF7B5,
+ 0xED4D, 0xED4E, 0xF7B8, 0xED4F, 0xF7B9, 0xED50,
+ 0xED51, 0xED52, 0xED53, 0xED54, 0xED55, 0xED56,
+ 0xED57, 0xED58, 0xED59, 0xED5A, 0xED5B, 0xED5C,
+ 0xED5D, 0xED5E, 0xED5F, 0xED60, 0xED61, 0xED62,
+ 0xED63, 0xED64, 0xED65, 0xED66, 0xED67, 0xED68,
+ 0xED69, 0xED6A, 0xED6B, 0xED6C, 0xED6D, 0xED6E,
+ 0xED6F, 0xED70, 0xED71, 0xED72, 0xED73, 0xED74,
+ 0xED75, 0xED76, 0xED77, 0xED78, 0xED79, 0xED7A,
+ 0xED7B, 0xED7C, 0xED7D, 0xED7E, 0xED80, 0xED81,
+ 0xCEA4, 0xC8CD, 0xED82, 0xBAAB, 0xE8B8, 0xE8B9,
+ 0xE8BA, 0xBEC2, 0xED83, 0xED84, 0xED85, 0xED86,
+ 0xED87, 0xD2F4, 0xED88, 0xD4CF, 0xC9D8, 0xED89,
+ 0xED8A, 0xED8B, 0xED8C, 0xED8D, 0xED8E, 0xED8F,
+ 0xED90, 0xED91, 0xED92, 0xED93, 0xED94, 0xED95,
+ 0xED96, 0xED97, 0xED98, 0xED99, 0xED9A, 0xED9B,
+ 0xED9C, 0xED9D, 0xED9E, 0xED9F, 0xEDA0, 0xEE40,
+ 0xEE41, 0xEE42, 0xEE43, 0xEE44, 0xEE45, 0xEE46,
+ 0xEE47, 0xEE48, 0xEE49, 0xEE4A, 0xEE4B, 0xEE4C,
+ 0xEE4D, 0xEE4E, 0xEE4F, 0xEE50, 0xEE51, 0xEE52,
+ 0xEE53, 0xEE54, 0xEE55, 0xEE56, 0xEE57, 0xEE58,
+ 0xEE59, 0xEE5A, 0xEE5B, 0xEE5C, 0xEE5D, 0xEE5E,
+ 0xEE5F, 0xEE60, 0xEE61, 0xEE62, 0xEE63, 0xEE64,
+ 0xEE65, 0xEE66, 0xEE67, 0xEE68, 0xEE69, 0xEE6A,
+ 0xEE6B, 0xEE6C, 0xEE6D, 0xEE6E, 0xEE6F, 0xEE70,
+ 0xEE71, 0xEE72, 0xEE73, 0xEE74, 0xEE75, 0xEE76,
+ 0xEE77, 0xEE78, 0xEE79, 0xEE7A, 0xEE7B, 0xEE7C,
+ 0xEE7D, 0xEE7E, 0xEE80, 0xEE81, 0xEE82, 0xEE83,
+ 0xEE84, 0xEE85, 0xEE86, 0xEE87, 0xEE88, 0xEE89,
+ 0xEE8A, 0xEE8B, 0xEE8C, 0xEE8D, 0xEE8E, 0xEE8F,
+ 0xEE90, 0xEE91, 0xEE92, 0xEE93, 0xEE94, 0xEE95,
+ 0xEE96, 0xEE97, 0xEE98, 0xEE99, 0xEE9A, 0xEE9B,
+ 0xEE9C, 0xEE9D, 0xEE9E, 0xEE9F, 0xEEA0, 0xEF40,
+ 0xEF41, 0xEF42, 0xEF43, 0xEF44, 0xEF45, 0xD2B3,
+ 0xB6A5, 0xC7EA, 0xF1FC, 0xCFEE, 0xCBB3, 0xD0EB,
+ 0xE7EF, 0xCDE7, 0xB9CB, 0xB6D9, 0xF1FD, 0xB0E4,
+ 0xCBCC, 0xF1FE, 0xD4A4, 0xC2AD, 0xC1EC, 0xC6C4,
+ 0xBEB1, 0xF2A1, 0xBCD5, 0xEF46, 0xF2A2, 0xF2A3,
+ 0xEF47, 0xF2A4, 0xD2C3, 0xC6B5, 0xEF48, 0xCDC7,
+ 0xF2A5, 0xEF49, 0xD3B1, 0xBFC5, 0xCCE2, 0xEF4A,
+ 0xF2A6, 0xF2A7, 0xD1D5, 0xB6EE, 0xF2A8, 0xF2A9,
+ 0xB5DF, 0xF2AA, 0xF2AB, 0xEF4B, 0xB2FC, 0xF2AC,
+ 0xF2AD, 0xC8A7, 0xEF4C, 0xEF4D, 0xEF4E, 0xEF4F,
+ 0xEF50, 0xEF51, 0xEF52, 0xEF53, 0xEF54, 0xEF55,
+ 0xEF56, 0xEF57, 0xEF58, 0xEF59, 0xEF5A, 0xEF5B,
+ 0xEF5C, 0xEF5D, 0xEF5E, 0xEF5F, 0xEF60, 0xEF61,
+ 0xEF62, 0xEF63, 0xEF64, 0xEF65, 0xEF66, 0xEF67,
+ 0xEF68, 0xEF69, 0xEF6A, 0xEF6B, 0xEF6C, 0xEF6D,
+ 0xEF6E, 0xEF6F, 0xEF70, 0xEF71, 0xB7E7, 0xEF72,
+ 0xEF73, 0xECA9, 0xECAA, 0xECAB, 0xEF74, 0xECAC,
+ 0xEF75, 0xEF76, 0xC6AE, 0xECAD, 0xECAE, 0xEF77,
+ 0xEF78, 0xEF79, 0xB7C9, 0xCAB3, 0xEF7A, 0xEF7B,
+ 0xEF7C, 0xEF7D, 0xEF7E, 0xEF80, 0xEF81, 0xE2B8,
+ 0xF7CF, 0xEF82, 0xEF83, 0xEF84, 0xEF85, 0xEF86,
+ 0xEF87, 0xEF88, 0xEF89, 0xEF8A, 0xEF8B, 0xEF8C,
+ 0xEF8D, 0xEF8E, 0xEF8F, 0xEF90, 0xEF91, 0xEF92,
+ 0xEF93, 0xEF94, 0xEF95, 0xEF96, 0xEF97, 0xEF98,
+ 0xEF99, 0xEF9A, 0xEF9B, 0xEF9C, 0xEF9D, 0xEF9E,
+ 0xEF9F, 0xEFA0, 0xF040, 0xF041, 0xF042, 0xF043,
+ 0xF044, 0xF7D0, 0xF045, 0xF046, 0xB2CD, 0xF047,
+ 0xF048, 0xF049, 0xF04A, 0xF04B, 0xF04C, 0xF04D,
+ 0xF04E, 0xF04F, 0xF050, 0xF051, 0xF052, 0xF053,
+ 0xF054, 0xF055, 0xF056, 0xF057, 0xF058, 0xF059,
+ 0xF05A, 0xF05B, 0xF05C, 0xF05D, 0xF05E, 0xF05F,
+ 0xF060, 0xF061, 0xF062, 0xF063, 0xF7D1, 0xF064,
+ 0xF065, 0xF066, 0xF067, 0xF068, 0xF069, 0xF06A,
+ 0xF06B, 0xF06C, 0xF06D, 0xF06E, 0xF06F, 0xF070,
+ 0xF071, 0xF072, 0xF073, 0xF074, 0xF075, 0xF076,
+ 0xF077, 0xF078, 0xF079, 0xF07A, 0xF07B, 0xF07C,
+ 0xF07D, 0xF07E, 0xF080, 0xF081, 0xF082, 0xF083,
+ 0xF084, 0xF085, 0xF086, 0xF087, 0xF088, 0xF089,
+ 0xF7D3, 0xF7D2, 0xF08A, 0xF08B, 0xF08C, 0xF08D,
+ 0xF08E, 0xF08F, 0xF090, 0xF091, 0xF092, 0xF093,
+ 0xF094, 0xF095, 0xF096, 0xE2BB, 0xF097, 0xBCA2,
+ 0xF098, 0xE2BC, 0xE2BD, 0xE2BE, 0xE2BF, 0xE2C0,
+ 0xE2C1, 0xB7B9, 0xD2FB, 0xBDA4, 0xCACE, 0xB1A5,
+ 0xCBC7, 0xF099, 0xE2C2, 0xB6FC, 0xC8C4, 0xE2C3,
+ 0xF09A, 0xF09B, 0xBDC8, 0xF09C, 0xB1FD, 0xE2C4,
+ 0xF09D, 0xB6F6, 0xE2C5, 0xC4D9, 0xF09E, 0xF09F,
+ 0xE2C6, 0xCFDA, 0xB9DD, 0xE2C7, 0xC0A1, 0xF0A0,
+ 0xE2C8, 0xB2F6, 0xF140, 0xE2C9, 0xF141, 0xC1F3,
+ 0xE2CA, 0xE2CB, 0xC2F8, 0xE2CC, 0xE2CD, 0xE2CE,
+ 0xCAD7, 0xD8B8, 0xD9E5, 0xCFE3, 0xF142, 0xF143,
+ 0xF144, 0xF145, 0xF146, 0xF147, 0xF148, 0xF149,
+ 0xF14A, 0xF14B, 0xF14C, 0xF0A5, 0xF14D, 0xF14E,
+ 0xDCB0, 0xF14F, 0xF150, 0xF151, 0xF152, 0xF153,
+ 0xF154, 0xF155, 0xF156, 0xF157, 0xF158, 0xF159,
+ 0xF15A, 0xF15B, 0xF15C, 0xF15D, 0xF15E, 0xF15F,
+ 0xF160, 0xF161, 0xF162, 0xF163, 0xF164, 0xF165,
+ 0xF166, 0xF167, 0xF168, 0xF169, 0xF16A, 0xF16B,
+ 0xF16C, 0xF16D, 0xF16E, 0xF16F, 0xF170, 0xF171,
+ 0xF172, 0xF173, 0xF174, 0xF175, 0xF176, 0xF177,
+ 0xF178, 0xF179, 0xF17A, 0xF17B, 0xF17C, 0xF17D,
+ 0xF17E, 0xF180, 0xF181, 0xF182, 0xF183, 0xF184,
+ 0xF185, 0xF186, 0xF187, 0xF188, 0xF189, 0xF18A,
+ 0xF18B, 0xF18C, 0xF18D, 0xF18E, 0xF18F, 0xF190,
+ 0xF191, 0xF192, 0xF193, 0xF194, 0xF195, 0xF196,
+ 0xF197, 0xF198, 0xF199, 0xF19A, 0xF19B, 0xF19C,
+ 0xF19D, 0xF19E, 0xF19F, 0xF1A0, 0xF240, 0xF241,
+ 0xF242, 0xF243, 0xF244, 0xF245, 0xF246, 0xF247,
+ 0xF248, 0xF249, 0xF24A, 0xF24B, 0xF24C, 0xF24D,
+ 0xF24E, 0xF24F, 0xF250, 0xF251, 0xF252, 0xF253,
+ 0xF254, 0xF255, 0xF256, 0xF257, 0xF258, 0xF259,
+ 0xF25A, 0xF25B, 0xF25C, 0xF25D, 0xF25E, 0xF25F,
+ 0xF260, 0xF261, 0xF262, 0xF263, 0xF264, 0xF265,
+ 0xF266, 0xF267, 0xF268, 0xF269, 0xF26A, 0xF26B,
+ 0xF26C, 0xF26D, 0xF26E, 0xF26F, 0xF270, 0xF271,
+ 0xF272, 0xF273, 0xF274, 0xF275, 0xF276, 0xF277,
+ 0xF278, 0xF279, 0xF27A, 0xF27B, 0xF27C, 0xF27D,
+ 0xF27E, 0xF280, 0xF281, 0xF282, 0xF283, 0xF284,
+ 0xF285, 0xF286, 0xF287, 0xF288, 0xF289, 0xF28A,
+ 0xF28B, 0xF28C, 0xF28D, 0xF28E, 0xF28F, 0xF290,
+ 0xF291, 0xF292, 0xF293, 0xF294, 0xF295, 0xF296,
+ 0xF297, 0xF298, 0xF299, 0xF29A, 0xF29B, 0xF29C,
+ 0xF29D, 0xF29E, 0xF29F, 0xF2A0, 0xF340, 0xF341,
+ 0xF342, 0xF343, 0xF344, 0xF345, 0xF346, 0xF347,
+ 0xF348, 0xF349, 0xF34A, 0xF34B, 0xF34C, 0xF34D,
+ 0xF34E, 0xF34F, 0xF350, 0xF351, 0xC2ED, 0xD4A6,
+ 0xCDD4, 0xD1B1, 0xB3DB, 0xC7FD, 0xF352, 0xB2B5,
+ 0xC2BF, 0xE6E0, 0xCABB, 0xE6E1, 0xE6E2, 0xBED4,
+ 0xE6E3, 0xD7A4, 0xCDD5, 0xE6E5, 0xBCDD, 0xE6E4,
+ 0xE6E6, 0xE6E7, 0xC2EE, 0xF353, 0xBDBE, 0xE6E8,
+ 0xC2E6, 0xBAA7, 0xE6E9, 0xF354, 0xE6EA, 0xB3D2,
+ 0xD1E9, 0xF355, 0xF356, 0xBFA5, 0xE6EB, 0xC6EF,
+ 0xE6EC, 0xE6ED, 0xF357, 0xF358, 0xE6EE, 0xC6AD,
+ 0xE6EF, 0xF359, 0xC9A7, 0xE6F0, 0xE6F1, 0xE6F2,
+ 0xE5B9, 0xE6F3, 0xE6F4, 0xC2E2, 0xE6F5, 0xE6F6,
+ 0xD6E8, 0xE6F7, 0xF35A, 0xE6F8, 0xB9C7, 0xF35B,
+ 0xF35C, 0xF35D, 0xF35E, 0xF35F, 0xF360, 0xF361,
+ 0xF7BB, 0xF7BA, 0xF362, 0xF363, 0xF364, 0xF365,
+ 0xF7BE, 0xF7BC, 0xBAA1, 0xF366, 0xF7BF, 0xF367,
+ 0xF7C0, 0xF368, 0xF369, 0xF36A, 0xF7C2, 0xF7C1,
+ 0xF7C4, 0xF36B, 0xF36C, 0xF7C3, 0xF36D, 0xF36E,
+ 0xF36F, 0xF370, 0xF371, 0xF7C5, 0xF7C6, 0xF372,
+ 0xF373, 0xF374, 0xF375, 0xF7C7, 0xF376, 0xCBE8,
+ 0xF377, 0xF378, 0xF379, 0xF37A, 0xB8DF, 0xF37B,
+ 0xF37C, 0xF37D, 0xF37E, 0xF380, 0xF381, 0xF7D4,
+ 0xF382, 0xF7D5, 0xF383, 0xF384, 0xF385, 0xF386,
+ 0xF7D6, 0xF387, 0xF388, 0xF389, 0xF38A, 0xF7D8,
+ 0xF38B, 0xF7DA, 0xF38C, 0xF7D7, 0xF38D, 0xF38E,
+ 0xF38F, 0xF390, 0xF391, 0xF392, 0xF393, 0xF394,
+ 0xF395, 0xF7DB, 0xF396, 0xF7D9, 0xF397, 0xF398,
+ 0xF399, 0xF39A, 0xF39B, 0xF39C, 0xF39D, 0xD7D7,
+ 0xF39E, 0xF39F, 0xF3A0, 0xF440, 0xF7DC, 0xF441,
+ 0xF442, 0xF443, 0xF444, 0xF445, 0xF446, 0xF7DD,
+ 0xF447, 0xF448, 0xF449, 0xF7DE, 0xF44A, 0xF44B,
+ 0xF44C, 0xF44D, 0xF44E, 0xF44F, 0xF450, 0xF451,
+ 0xF452, 0xF453, 0xF454, 0xF7DF, 0xF455, 0xF456,
+ 0xF457, 0xF7E0, 0xF458, 0xF459, 0xF45A, 0xF45B,
+ 0xF45C, 0xF45D, 0xF45E, 0xF45F, 0xF460, 0xF461,
+ 0xF462, 0xDBCB, 0xF463, 0xF464, 0xD8AA, 0xF465,
+ 0xF466, 0xF467, 0xF468, 0xF469, 0xF46A, 0xF46B,
+ 0xF46C, 0xE5F7, 0xB9ED, 0xF46D, 0xF46E, 0xF46F,
+ 0xF470, 0xBFFD, 0xBBEA, 0xF7C9, 0xC6C7, 0xF7C8,
+ 0xF471, 0xF7CA, 0xF7CC, 0xF7CB, 0xF472, 0xF473,
+ 0xF474, 0xF7CD, 0xF475, 0xCEBA, 0xF476, 0xF7CE,
+ 0xF477, 0xF478, 0xC4A7, 0xF479, 0xF47A, 0xF47B,
+ 0xF47C, 0xF47D, 0xF47E, 0xF480, 0xF481, 0xF482,
+ 0xF483, 0xF484, 0xF485, 0xF486, 0xF487, 0xF488,
+ 0xF489, 0xF48A, 0xF48B, 0xF48C, 0xF48D, 0xF48E,
+ 0xF48F, 0xF490, 0xF491, 0xF492, 0xF493, 0xF494,
+ 0xF495, 0xF496, 0xF497, 0xF498, 0xF499, 0xF49A,
+ 0xF49B, 0xF49C, 0xF49D, 0xF49E, 0xF49F, 0xF4A0,
+ 0xF540, 0xF541, 0xF542, 0xF543, 0xF544, 0xF545,
+ 0xF546, 0xF547, 0xF548, 0xF549, 0xF54A, 0xF54B,
+ 0xF54C, 0xF54D, 0xF54E, 0xF54F, 0xF550, 0xF551,
+ 0xF552, 0xF553, 0xF554, 0xF555, 0xF556, 0xF557,
+ 0xF558, 0xF559, 0xF55A, 0xF55B, 0xF55C, 0xF55D,
+ 0xF55E, 0xF55F, 0xF560, 0xF561, 0xF562, 0xF563,
+ 0xF564, 0xF565, 0xF566, 0xF567, 0xF568, 0xF569,
+ 0xF56A, 0xF56B, 0xF56C, 0xF56D, 0xF56E, 0xF56F,
+ 0xF570, 0xF571, 0xF572, 0xF573, 0xF574, 0xF575,
+ 0xF576, 0xF577, 0xF578, 0xF579, 0xF57A, 0xF57B,
+ 0xF57C, 0xF57D, 0xF57E, 0xF580, 0xF581, 0xF582,
+ 0xF583, 0xF584, 0xF585, 0xF586, 0xF587, 0xF588,
+ 0xF589, 0xF58A, 0xF58B, 0xF58C, 0xF58D, 0xF58E,
+ 0xF58F, 0xF590, 0xF591, 0xF592, 0xF593, 0xF594,
+ 0xF595, 0xF596, 0xF597, 0xF598, 0xF599, 0xF59A,
+ 0xF59B, 0xF59C, 0xF59D, 0xF59E, 0xF59F, 0xF5A0,
+ 0xF640, 0xF641, 0xF642, 0xF643, 0xF644, 0xF645,
+ 0xF646, 0xF647, 0xF648, 0xF649, 0xF64A, 0xF64B,
+ 0xF64C, 0xF64D, 0xF64E, 0xF64F, 0xF650, 0xF651,
+ 0xF652, 0xF653, 0xF654, 0xF655, 0xF656, 0xF657,
+ 0xF658, 0xF659, 0xF65A, 0xF65B, 0xF65C, 0xF65D,
+ 0xF65E, 0xF65F, 0xF660, 0xF661, 0xF662, 0xF663,
+ 0xF664, 0xF665, 0xF666, 0xF667, 0xF668, 0xF669,
+ 0xF66A, 0xF66B, 0xF66C, 0xF66D, 0xF66E, 0xF66F,
+ 0xF670, 0xF671, 0xF672, 0xF673, 0xF674, 0xF675,
+ 0xF676, 0xF677, 0xF678, 0xF679, 0xF67A, 0xF67B,
+ 0xF67C, 0xF67D, 0xF67E, 0xF680, 0xF681, 0xF682,
+ 0xF683, 0xF684, 0xF685, 0xF686, 0xF687, 0xF688,
+ 0xF689, 0xF68A, 0xF68B, 0xF68C, 0xF68D, 0xF68E,
+ 0xF68F, 0xF690, 0xF691, 0xF692, 0xF693, 0xF694,
+ 0xF695, 0xF696, 0xF697, 0xF698, 0xF699, 0xF69A,
+ 0xF69B, 0xF69C, 0xF69D, 0xF69E, 0xF69F, 0xF6A0,
+ 0xF740, 0xF741, 0xF742, 0xF743, 0xF744, 0xF745,
+ 0xF746, 0xF747, 0xF748, 0xF749, 0xF74A, 0xF74B,
+ 0xF74C, 0xF74D, 0xF74E, 0xF74F, 0xF750, 0xF751,
+ 0xF752, 0xF753, 0xF754, 0xF755, 0xF756, 0xF757,
+ 0xF758, 0xF759, 0xF75A, 0xF75B, 0xF75C, 0xF75D,
+ 0xF75E, 0xF75F, 0xF760, 0xF761, 0xF762, 0xF763,
+ 0xF764, 0xF765, 0xF766, 0xF767, 0xF768, 0xF769,
+ 0xF76A, 0xF76B, 0xF76C, 0xF76D, 0xF76E, 0xF76F,
+ 0xF770, 0xF771, 0xF772, 0xF773, 0xF774, 0xF775,
+ 0xF776, 0xF777, 0xF778, 0xF779, 0xF77A, 0xF77B,
+ 0xF77C, 0xF77D, 0xF77E, 0xF780, 0xD3E3, 0xF781,
+ 0xF782, 0xF6CF, 0xF783, 0xC2B3, 0xF6D0, 0xF784,
+ 0xF785, 0xF6D1, 0xF6D2, 0xF6D3, 0xF6D4, 0xF786,
+ 0xF787, 0xF6D6, 0xF788, 0xB1AB, 0xF6D7, 0xF789,
+ 0xF6D8, 0xF6D9, 0xF6DA, 0xF78A, 0xF6DB, 0xF6DC,
+ 0xF78B, 0xF78C, 0xF78D, 0xF78E, 0xF6DD, 0xF6DE,
+ 0xCFCA, 0xF78F, 0xF6DF, 0xF6E0, 0xF6E1, 0xF6E2,
+ 0xF6E3, 0xF6E4, 0xC0F0, 0xF6E5, 0xF6E6, 0xF6E7,
+ 0xF6E8, 0xF6E9, 0xF790, 0xF6EA, 0xF791, 0xF6EB,
+ 0xF6EC, 0xF792, 0xF6ED, 0xF6EE, 0xF6EF, 0xF6F0,
+ 0xF6F1, 0xF6F2, 0xF6F3, 0xF6F4, 0xBEA8, 0xF793,
+ 0xF6F5, 0xF6F6, 0xF6F7, 0xF6F8, 0xF794, 0xF795,
+ 0xF796, 0xF797, 0xF798, 0xC8FA, 0xF6F9, 0xF6FA,
+ 0xF6FB, 0xF6FC, 0xF799, 0xF79A, 0xF6FD, 0xF6FE,
+ 0xF7A1, 0xF7A2, 0xF7A3, 0xF7A4, 0xF7A5, 0xF79B,
+ 0xF79C, 0xF7A6, 0xF7A7, 0xF7A8, 0xB1EE, 0xF7A9,
+ 0xF7AA, 0xF7AB, 0xF79D, 0xF79E, 0xF7AC, 0xF7AD,
+ 0xC1DB, 0xF7AE, 0xF79F, 0xF7A0, 0xF7AF, 0xF840,
+ 0xF841, 0xF842, 0xF843, 0xF844, 0xF845, 0xF846,
+ 0xF847, 0xF848, 0xF849, 0xF84A, 0xF84B, 0xF84C,
+ 0xF84D, 0xF84E, 0xF84F, 0xF850, 0xF851, 0xF852,
+ 0xF853, 0xF854, 0xF855, 0xF856, 0xF857, 0xF858,
+ 0xF859, 0xF85A, 0xF85B, 0xF85C, 0xF85D, 0xF85E,
+ 0xF85F, 0xF860, 0xF861, 0xF862, 0xF863, 0xF864,
+ 0xF865, 0xF866, 0xF867, 0xF868, 0xF869, 0xF86A,
+ 0xF86B, 0xF86C, 0xF86D, 0xF86E, 0xF86F, 0xF870,
+ 0xF871, 0xF872, 0xF873, 0xF874, 0xF875, 0xF876,
+ 0xF877, 0xF878, 0xF879, 0xF87A, 0xF87B, 0xF87C,
+ 0xF87D, 0xF87E, 0xF880, 0xF881, 0xF882, 0xF883,
+ 0xF884, 0xF885, 0xF886, 0xF887, 0xF888, 0xF889,
+ 0xF88A, 0xF88B, 0xF88C, 0xF88D, 0xF88E, 0xF88F,
+ 0xF890, 0xF891, 0xF892, 0xF893, 0xF894, 0xF895,
+ 0xF896, 0xF897, 0xF898, 0xF899, 0xF89A, 0xF89B,
+ 0xF89C, 0xF89D, 0xF89E, 0xF89F, 0xF8A0, 0xF940,
+ 0xF941, 0xF942, 0xF943, 0xF944, 0xF945, 0xF946,
+ 0xF947, 0xF948, 0xF949, 0xF94A, 0xF94B, 0xF94C,
+ 0xF94D, 0xF94E, 0xF94F, 0xF950, 0xF951, 0xF952,
+ 0xF953, 0xF954, 0xF955, 0xF956, 0xF957, 0xF958,
+ 0xF959, 0xF95A, 0xF95B, 0xF95C, 0xF95D, 0xF95E,
+ 0xF95F, 0xF960, 0xF961, 0xF962, 0xF963, 0xF964,
+ 0xF965, 0xF966, 0xF967, 0xF968, 0xF969, 0xF96A,
+ 0xF96B, 0xF96C, 0xF96D, 0xF96E, 0xF96F, 0xF970,
+ 0xF971, 0xF972, 0xF973, 0xF974, 0xF975, 0xF976,
+ 0xF977, 0xF978, 0xF979, 0xF97A, 0xF97B, 0xF97C,
+ 0xF97D, 0xF97E, 0xF980, 0xF981, 0xF982, 0xF983,
+ 0xF984, 0xF985, 0xF986, 0xF987, 0xF988, 0xF989,
+ 0xF98A, 0xF98B, 0xF98C, 0xF98D, 0xF98E, 0xF98F,
+ 0xF990, 0xF991, 0xF992, 0xF993, 0xF994, 0xF995,
+ 0xF996, 0xF997, 0xF998, 0xF999, 0xF99A, 0xF99B,
+ 0xF99C, 0xF99D, 0xF99E, 0xF99F, 0xF9A0, 0xFA40,
+ 0xFA41, 0xFA42, 0xFA43, 0xFA44, 0xFA45, 0xFA46,
+ 0xFA47, 0xFA48, 0xFA49, 0xFA4A, 0xFA4B, 0xFA4C,
+ 0xFA4D, 0xFA4E, 0xFA4F, 0xFA50, 0xFA51, 0xFA52,
+ 0xFA53, 0xFA54, 0xFA55, 0xFA56, 0xFA57, 0xFA58,
+ 0xFA59, 0xFA5A, 0xFA5B, 0xFA5C, 0xFA5D, 0xFA5E,
+ 0xFA5F, 0xFA60, 0xFA61, 0xFA62, 0xFA63, 0xFA64,
+ 0xFA65, 0xFA66, 0xFA67, 0xFA68, 0xFA69, 0xFA6A,
+ 0xFA6B, 0xFA6C, 0xFA6D, 0xFA6E, 0xFA6F, 0xFA70,
+ 0xFA71, 0xFA72, 0xFA73, 0xFA74, 0xFA75, 0xFA76,
+ 0xFA77, 0xFA78, 0xFA79, 0xFA7A, 0xFA7B, 0xFA7C,
+ 0xFA7D, 0xFA7E, 0xFA80, 0xFA81, 0xFA82, 0xFA83,
+ 0xFA84, 0xFA85, 0xFA86, 0xFA87, 0xFA88, 0xFA89,
+ 0xFA8A, 0xFA8B, 0xFA8C, 0xFA8D, 0xFA8E, 0xFA8F,
+ 0xFA90, 0xFA91, 0xFA92, 0xFA93, 0xFA94, 0xFA95,
+ 0xFA96, 0xFA97, 0xFA98, 0xFA99, 0xFA9A, 0xFA9B,
+ 0xFA9C, 0xFA9D, 0xFA9E, 0xFA9F, 0xFAA0, 0xFB40,
+ 0xFB41, 0xFB42, 0xFB43, 0xFB44, 0xFB45, 0xFB46,
+ 0xFB47, 0xFB48, 0xFB49, 0xFB4A, 0xFB4B, 0xFB4C,
+ 0xFB4D, 0xFB4E, 0xFB4F, 0xFB50, 0xFB51, 0xFB52,
+ 0xFB53, 0xFB54, 0xFB55, 0xFB56, 0xFB57, 0xFB58,
+ 0xFB59, 0xFB5A, 0xFB5B, 0xC4F1, 0xF0AF, 0xBCA6,
+ 0xF0B0, 0xC3F9, 0xFB5C, 0xC5B8, 0xD1BB, 0xFB5D,
+ 0xF0B1, 0xF0B2, 0xF0B3, 0xF0B4, 0xF0B5, 0xD1BC,
+ 0xFB5E, 0xD1EC, 0xFB5F, 0xF0B7, 0xF0B6, 0xD4A7,
+ 0xFB60, 0xCDD2, 0xF0B8, 0xF0BA, 0xF0B9, 0xF0BB,
+ 0xF0BC, 0xFB61, 0xFB62, 0xB8EB, 0xF0BD, 0xBAE8,
+ 0xFB63, 0xF0BE, 0xF0BF, 0xBEE9, 0xF0C0, 0xB6EC,
+ 0xF0C1, 0xF0C2, 0xF0C3, 0xF0C4, 0xC8B5, 0xF0C5,
+ 0xF0C6, 0xFB64, 0xF0C7, 0xC5F4, 0xFB65, 0xF0C8,
+ 0xFB66, 0xFB67, 0xFB68, 0xF0C9, 0xFB69, 0xF0CA,
+ 0xF7BD, 0xFB6A, 0xF0CB, 0xF0CC, 0xF0CD, 0xFB6B,
+ 0xF0CE, 0xFB6C, 0xFB6D, 0xFB6E, 0xFB6F, 0xF0CF,
+ 0xBAD7, 0xFB70, 0xF0D0, 0xF0D1, 0xF0D2, 0xF0D3,
+ 0xF0D4, 0xF0D5, 0xF0D6, 0xF0D8, 0xFB71, 0xFB72,
+ 0xD3A5, 0xF0D7, 0xFB73, 0xF0D9, 0xFB74, 0xFB75,
+ 0xFB76, 0xFB77, 0xFB78, 0xFB79, 0xFB7A, 0xFB7B,
+ 0xFB7C, 0xFB7D, 0xF5BA, 0xC2B9, 0xFB7E, 0xFB80,
+ 0xF7E4, 0xFB81, 0xFB82, 0xFB83, 0xFB84, 0xF7E5,
+ 0xF7E6, 0xFB85, 0xFB86, 0xF7E7, 0xFB87, 0xFB88,
+ 0xFB89, 0xFB8A, 0xFB8B, 0xFB8C, 0xF7E8, 0xC2B4,
+ 0xFB8D, 0xFB8E, 0xFB8F, 0xFB90, 0xFB91, 0xFB92,
+ 0xFB93, 0xFB94, 0xFB95, 0xF7EA, 0xFB96, 0xF7EB,
+ 0xFB97, 0xFB98, 0xFB99, 0xFB9A, 0xFB9B, 0xFB9C,
+ 0xC2F3, 0xFB9D, 0xFB9E, 0xFB9F, 0xFBA0, 0xFC40,
+ 0xFC41, 0xFC42, 0xFC43, 0xFC44, 0xFC45, 0xFC46,
+ 0xFC47, 0xFC48, 0xF4F0, 0xFC49, 0xFC4A, 0xFC4B,
+ 0xF4EF, 0xFC4C, 0xFC4D, 0xC2E9, 0xFC4E, 0xF7E1,
+ 0xF7E2, 0xFC4F, 0xFC50, 0xFC51, 0xFC52, 0xFC53,
+ 0xBBC6, 0xFC54, 0xFC55, 0xFC56, 0xFC57, 0xD9E4,
+ 0xFC58, 0xFC59, 0xFC5A, 0xCAF2, 0xC0E8, 0xF0A4,
+ 0xFC5B, 0xBADA, 0xFC5C, 0xFC5D, 0xC7AD, 0xFC5E,
+ 0xFC5F, 0xFC60, 0xC4AC, 0xFC61, 0xFC62, 0xF7EC,
+ 0xF7ED, 0xF7EE, 0xFC63, 0xF7F0, 0xF7EF, 0xFC64,
+ 0xF7F1, 0xFC65, 0xFC66, 0xF7F4, 0xFC67, 0xF7F3,
+ 0xFC68, 0xF7F2, 0xF7F5, 0xFC69, 0xFC6A, 0xFC6B,
+ 0xFC6C, 0xF7F6, 0xFC6D, 0xFC6E, 0xFC6F, 0xFC70,
+ 0xFC71, 0xFC72, 0xFC73, 0xFC74, 0xFC75, 0xEDE9,
+ 0xFC76, 0xEDEA, 0xEDEB, 0xFC77, 0xF6BC, 0xFC78,
+ 0xFC79, 0xFC7A, 0xFC7B, 0xFC7C, 0xFC7D, 0xFC7E,
+ 0xFC80, 0xFC81, 0xFC82, 0xFC83, 0xFC84, 0xF6BD,
+ 0xFC85, 0xF6BE, 0xB6A6, 0xFC86, 0xD8BE, 0xFC87,
+ 0xFC88, 0xB9C4, 0xFC89, 0xFC8A, 0xFC8B, 0xD8BB,
+ 0xFC8C, 0xDCB1, 0xFC8D, 0xFC8E, 0xFC8F, 0xFC90,
+ 0xFC91, 0xFC92, 0xCAF3, 0xFC93, 0xF7F7, 0xFC94,
+ 0xFC95, 0xFC96, 0xFC97, 0xFC98, 0xFC99, 0xFC9A,
+ 0xFC9B, 0xFC9C, 0xF7F8, 0xFC9D, 0xFC9E, 0xF7F9,
+ 0xFC9F, 0xFCA0, 0xFD40, 0xFD41, 0xFD42, 0xFD43,
+ 0xFD44, 0xF7FB, 0xFD45, 0xF7FA, 0xFD46, 0xB1C7,
+ 0xFD47, 0xF7FC, 0xF7FD, 0xFD48, 0xFD49, 0xFD4A,
+ 0xFD4B, 0xFD4C, 0xF7FE, 0xFD4D, 0xFD4E, 0xFD4F,
+ 0xFD50, 0xFD51, 0xFD52, 0xFD53, 0xFD54, 0xFD55,
+ 0xFD56, 0xFD57, 0xC6EB, 0xECB4, 0xFD58, 0xFD59,
+ 0xFD5A, 0xFD5B, 0xFD5C, 0xFD5D, 0xFD5E, 0xFD5F,
+ 0xFD60, 0xFD61, 0xFD62, 0xFD63, 0xFD64, 0xFD65,
+ 0xFD66, 0xFD67, 0xFD68, 0xFD69, 0xFD6A, 0xFD6B,
+ 0xFD6C, 0xFD6D, 0xFD6E, 0xFD6F, 0xFD70, 0xFD71,
+ 0xFD72, 0xFD73, 0xFD74, 0xFD75, 0xFD76, 0xFD77,
+ 0xFD78, 0xFD79, 0xFD7A, 0xFD7B, 0xFD7C, 0xFD7D,
+ 0xFD7E, 0xFD80, 0xFD81, 0xFD82, 0xFD83, 0xFD84,
+ 0xFD85, 0xB3DD, 0xF6B3, 0xFD86, 0xFD87, 0xF6B4,
+ 0xC1E4, 0xF6B5, 0xF6B6, 0xF6B7, 0xF6B8, 0xF6B9,
+ 0xF6BA, 0xC8A3, 0xF6BB, 0xFD88, 0xFD89, 0xFD8A,
+ 0xFD8B, 0xFD8C, 0xFD8D, 0xFD8E, 0xFD8F, 0xFD90,
+ 0xFD91, 0xFD92, 0xFD93, 0xC1FA, 0xB9A8, 0xEDE8,
+ 0xFD94, 0xFD95, 0xFD96, 0xB9EA, 0xD9DF, 0xFD97,
+ 0xFD98, 0xFD99, 0xFD9A, 0xFD9B, 0xAAA1, 0xAAA2,
+ 0xAAA3, 0xAAA4, 0xAAA5, 0xAAA6, 0xAAA7, 0xAAA8,
+ 0xAAA9, 0xAAAA, 0xAAAB, 0xAAAC, 0xAAAD, 0xAAAE,
+ 0xAAAF, 0xAAB0, 0xAAB1, 0xAAB2, 0xAAB3, 0xAAB4,
+ 0xAAB5, 0xAAB6, 0xAAB7, 0xAAB8, 0xAAB9, 0xAABA,
+ 0xAABB, 0xAABC, 0xAABD, 0xAABE, 0xAABF, 0xAAC0,
+ 0xAAC1, 0xAAC2, 0xAAC3, 0xAAC4, 0xAAC5, 0xAAC6,
+ 0xAAC7, 0xAAC8, 0xAAC9, 0xAACA, 0xAACB, 0xAACC,
+ 0xAACD, 0xAACE, 0xAACF, 0xAAD0, 0xAAD1, 0xAAD2,
+ 0xAAD3, 0xAAD4, 0xAAD5, 0xAAD6, 0xAAD7, 0xAAD8,
+ 0xAAD9, 0xAADA, 0xAADB, 0xAADC, 0xAADD, 0xAADE,
+ 0xAADF, 0xAAE0, 0xAAE1, 0xAAE2, 0xAAE3, 0xAAE4,
+ 0xAAE5, 0xAAE6, 0xAAE7, 0xAAE8, 0xAAE9, 0xAAEA,
+ 0xAAEB, 0xAAEC, 0xAAED, 0xAAEE, 0xAAEF, 0xAAF0,
+ 0xAAF1, 0xAAF2, 0xAAF3, 0xAAF4, 0xAAF5, 0xAAF6,
+ 0xAAF7, 0xAAF8, 0xAAF9, 0xAAFA, 0xAAFB, 0xAAFC,
+ 0xAAFD, 0xAAFE, 0xABA1, 0xABA2, 0xABA3, 0xABA4,
+ 0xABA5, 0xABA6, 0xABA7, 0xABA8, 0xABA9, 0xABAA,
+ 0xABAB, 0xABAC, 0xABAD, 0xABAE, 0xABAF, 0xABB0,
+ 0xABB1, 0xABB2, 0xABB3, 0xABB4, 0xABB5, 0xABB6,
+ 0xABB7, 0xABB8, 0xABB9, 0xABBA, 0xABBB, 0xABBC,
+ 0xABBD, 0xABBE, 0xABBF, 0xABC0, 0xABC1, 0xABC2,
+ 0xABC3, 0xABC4, 0xABC5, 0xABC6, 0xABC7, 0xABC8,
+ 0xABC9, 0xABCA, 0xABCB, 0xABCC, 0xABCD, 0xABCE,
+ 0xABCF, 0xABD0, 0xABD1, 0xABD2, 0xABD3, 0xABD4,
+ 0xABD5, 0xABD6, 0xABD7, 0xABD8, 0xABD9, 0xABDA,
+ 0xABDB, 0xABDC, 0xABDD, 0xABDE, 0xABDF, 0xABE0,
+ 0xABE1, 0xABE2, 0xABE3, 0xABE4, 0xABE5, 0xABE6,
+ 0xABE7, 0xABE8, 0xABE9, 0xABEA, 0xABEB, 0xABEC,
+ 0xABED, 0xABEE, 0xABEF, 0xABF0, 0xABF1, 0xABF2,
+ 0xABF3, 0xABF4, 0xABF5, 0xABF6, 0xABF7, 0xABF8,
+ 0xABF9, 0xABFA, 0xABFB, 0xABFC, 0xABFD, 0xABFE,
+ 0xACA1, 0xACA2, 0xACA3, 0xACA4, 0xACA5, 0xACA6,
+ 0xACA7, 0xACA8, 0xACA9, 0xACAA, 0xACAB, 0xACAC,
+ 0xACAD, 0xACAE, 0xACAF, 0xACB0, 0xACB1, 0xACB2,
+ 0xACB3, 0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACB8,
+ 0xACB9, 0xACBA, 0xACBB, 0xACBC, 0xACBD, 0xACBE,
+ 0xACBF, 0xACC0, 0xACC1, 0xACC2, 0xACC3, 0xACC4,
+ 0xACC5, 0xACC6, 0xACC7, 0xACC8, 0xACC9, 0xACCA,
+ 0xACCB, 0xACCC, 0xACCD, 0xACCE, 0xACCF, 0xACD0,
+ 0xACD1, 0xACD2, 0xACD3, 0xACD4, 0xACD5, 0xACD6,
+ 0xACD7, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC,
+ 0xACDD, 0xACDE, 0xACDF, 0xACE0, 0xACE1, 0xACE2,
+ 0xACE3, 0xACE4, 0xACE5, 0xACE6, 0xACE7, 0xACE8,
+ 0xACE9, 0xACEA, 0xACEB, 0xACEC, 0xACED, 0xACEE,
+ 0xACEF, 0xACF0, 0xACF1, 0xACF2, 0xACF3, 0xACF4,
+ 0xACF5, 0xACF6, 0xACF7, 0xACF8, 0xACF9, 0xACFA,
+ 0xACFB, 0xACFC, 0xACFD, 0xACFE, 0xADA1, 0xADA2,
+ 0xADA3, 0xADA4, 0xADA5, 0xADA6, 0xADA7, 0xADA8,
+ 0xADA9, 0xADAA, 0xADAB, 0xADAC, 0xADAD, 0xADAE,
+ 0xADAF, 0xADB0, 0xADB1, 0xADB2, 0xADB3, 0xADB4,
+ 0xADB5, 0xADB6, 0xADB7, 0xADB8, 0xADB9, 0xADBA,
+ 0xADBB, 0xADBC, 0xADBD, 0xADBE, 0xADBF, 0xADC0,
+ 0xADC1, 0xADC2, 0xADC3, 0xADC4, 0xADC5, 0xADC6,
+ 0xADC7, 0xADC8, 0xADC9, 0xADCA, 0xADCB, 0xADCC,
+ 0xADCD, 0xADCE, 0xADCF, 0xADD0, 0xADD1, 0xADD2,
+ 0xADD3, 0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8,
+ 0xADD9, 0xADDA, 0xADDB, 0xADDC, 0xADDD, 0xADDE,
+ 0xADDF, 0xADE0, 0xADE1, 0xADE2, 0xADE3, 0xADE4,
+ 0xADE5, 0xADE6, 0xADE7, 0xADE8, 0xADE9, 0xADEA,
+ 0xADEB, 0xADEC, 0xADED, 0xADEE, 0xADEF, 0xADF0,
+ 0xADF1, 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6,
+ 0xADF7, 0xADF8, 0xADF9, 0xADFA, 0xADFB, 0xADFC,
+ 0xADFD, 0xADFE, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4,
+ 0xAEA5, 0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA,
+ 0xAEAB, 0xAEAC, 0xAEAD, 0xAEAE, 0xAEAF, 0xAEB0,
+ 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5, 0xAEB6,
+ 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0xAEBC,
+ 0xAEBD, 0xAEBE, 0xAEBF, 0xAEC0, 0xAEC1, 0xAEC2,
+ 0xAEC3, 0xAEC4, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8,
+ 0xAEC9, 0xAECA, 0xAECB, 0xAECC, 0xAECD, 0xAECE,
+ 0xAECF, 0xAED0, 0xAED1, 0xAED2, 0xAED3, 0xAED4,
+ 0xAED5, 0xAED6, 0xAED7, 0xAED8, 0xAED9, 0xAEDA,
+ 0xAEDB, 0xAEDC, 0xAEDD, 0xAEDE, 0xAEDF, 0xAEE0,
+ 0xAEE1, 0xAEE2, 0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6,
+ 0xAEE7, 0xAEE8, 0xAEE9, 0xAEEA, 0xAEEB, 0xAEEC,
+ 0xAEED, 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2,
+ 0xAEF3, 0xAEF4, 0xAEF5, 0xAEF6, 0xAEF7, 0xAEF8,
+ 0xAEF9, 0xAEFA, 0xAEFB, 0xAEFC, 0xAEFD, 0xAEFE,
+ 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6,
+ 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC,
+ 0xAFAD, 0xAFAE, 0xAFAF, 0xAFB0, 0xAFB1, 0xAFB2,
+ 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6, 0xAFB7, 0xAFB8,
+ 0xAFB9, 0xAFBA, 0xAFBB, 0xAFBC, 0xAFBD, 0xAFBE,
+ 0xAFBF, 0xAFC0, 0xAFC1, 0xAFC2, 0xAFC3, 0xAFC4,
+ 0xAFC5, 0xAFC6, 0xAFC7, 0xAFC8, 0xAFC9, 0xAFCA,
+ 0xAFCB, 0xAFCC, 0xAFCD, 0xAFCE, 0xAFCF, 0xAFD0,
+ 0xAFD1, 0xAFD2, 0xAFD3, 0xAFD4, 0xAFD5, 0xAFD6,
+ 0xAFD7, 0xAFD8, 0xAFD9, 0xAFDA, 0xAFDB, 0xAFDC,
+ 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, 0xAFE2,
+ 0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFE8,
+ 0xAFE9, 0xAFEA, 0xAFEB, 0xAFEC, 0xAFED, 0xAFEE,
+ 0xAFEF, 0xAFF0, 0xAFF1, 0xAFF2, 0xAFF3, 0xAFF4,
+ 0xAFF5, 0xAFF6, 0xAFF7, 0xAFF8, 0xAFF9, 0xAFFA,
+ 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xF8A1, 0xF8A2,
+ 0xF8A3, 0xF8A4, 0xF8A5, 0xF8A6, 0xF8A7, 0xF8A8,
+ 0xF8A9, 0xF8AA, 0xF8AB, 0xF8AC, 0xF8AD, 0xF8AE,
+ 0xF8AF, 0xF8B0, 0xF8B1, 0xF8B2, 0xF8B3, 0xF8B4,
+ 0xF8B5, 0xF8B6, 0xF8B7, 0xF8B8, 0xF8B9, 0xF8BA,
+ 0xF8BB, 0xF8BC, 0xF8BD, 0xF8BE, 0xF8BF, 0xF8C0,
+ 0xF8C1, 0xF8C2, 0xF8C3, 0xF8C4, 0xF8C5, 0xF8C6,
+ 0xF8C7, 0xF8C8, 0xF8C9, 0xF8CA, 0xF8CB, 0xF8CC,
+ 0xF8CD, 0xF8CE, 0xF8CF, 0xF8D0, 0xF8D1, 0xF8D2,
+ 0xF8D3, 0xF8D4, 0xF8D5, 0xF8D6, 0xF8D7, 0xF8D8,
+ 0xF8D9, 0xF8DA, 0xF8DB, 0xF8DC, 0xF8DD, 0xF8DE,
+ 0xF8DF, 0xF8E0, 0xF8E1, 0xF8E2, 0xF8E3, 0xF8E4,
+ 0xF8E5, 0xF8E6, 0xF8E7, 0xF8E8, 0xF8E9, 0xF8EA,
+ 0xF8EB, 0xF8EC, 0xF8ED, 0xF8EE, 0xF8EF, 0xF8F0,
+ 0xF8F1, 0xF8F2, 0xF8F3, 0xF8F4, 0xF8F5, 0xF8F6,
+ 0xF8F7, 0xF8F8, 0xF8F9, 0xF8FA, 0xF8FB, 0xF8FC,
+ 0xF8FD, 0xF8FE, 0xF9A1, 0xF9A2, 0xF9A3, 0xF9A4,
+ 0xF9A5, 0xF9A6, 0xF9A7, 0xF9A8, 0xF9A9, 0xF9AA,
+ 0xF9AB, 0xF9AC, 0xF9AD, 0xF9AE, 0xF9AF, 0xF9B0,
+ 0xF9B1, 0xF9B2, 0xF9B3, 0xF9B4, 0xF9B5, 0xF9B6,
+ 0xF9B7, 0xF9B8, 0xF9B9, 0xF9BA, 0xF9BB, 0xF9BC,
+ 0xF9BD, 0xF9BE, 0xF9BF, 0xF9C0, 0xF9C1, 0xF9C2,
+ 0xF9C3, 0xF9C4, 0xF9C5, 0xF9C6, 0xF9C7, 0xF9C8,
+ 0xF9C9, 0xF9CA, 0xF9CB, 0xF9CC, 0xF9CD, 0xF9CE,
+ 0xF9CF, 0xF9D0, 0xF9D1, 0xF9D2, 0xF9D3, 0xF9D4,
+ 0xF9D5, 0xF9D6, 0xF9D7, 0xF9D8, 0xF9D9, 0xF9DA,
+ 0xF9DB, 0xF9DC, 0xF9DD, 0xF9DE, 0xF9DF, 0xF9E0,
+ 0xF9E1, 0xF9E2, 0xF9E3, 0xF9E4, 0xF9E5, 0xF9E6,
+ 0xF9E7, 0xF9E8, 0xF9E9, 0xF9EA, 0xF9EB, 0xF9EC,
+ 0xF9ED, 0xF9EE, 0xF9EF, 0xF9F0, 0xF9F1, 0xF9F2,
+ 0xF9F3, 0xF9F4, 0xF9F5, 0xF9F6, 0xF9F7, 0xF9F8,
+ 0xF9F9, 0xF9FA, 0xF9FB, 0xF9FC, 0xF9FD, 0xF9FE,
+ 0xFAA1, 0xFAA2, 0xFAA3, 0xFAA4, 0xFAA5, 0xFAA6,
+ 0xFAA7, 0xFAA8, 0xFAA9, 0xFAAA, 0xFAAB, 0xFAAC,
+ 0xFAAD, 0xFAAE, 0xFAAF, 0xFAB0, 0xFAB1, 0xFAB2,
+ 0xFAB3, 0xFAB4, 0xFAB5, 0xFAB6, 0xFAB7, 0xFAB8,
+ 0xFAB9, 0xFABA, 0xFABB, 0xFABC, 0xFABD, 0xFABE,
+ 0xFABF, 0xFAC0, 0xFAC1, 0xFAC2, 0xFAC3, 0xFAC4,
+ 0xFAC5, 0xFAC6, 0xFAC7, 0xFAC8, 0xFAC9, 0xFACA,
+ 0xFACB, 0xFACC, 0xFACD, 0xFACE, 0xFACF, 0xFAD0,
+ 0xFAD1, 0xFAD2, 0xFAD3, 0xFAD4, 0xFAD5, 0xFAD6,
+ 0xFAD7, 0xFAD8, 0xFAD9, 0xFADA, 0xFADB, 0xFADC,
+ 0xFADD, 0xFADE, 0xFADF, 0xFAE0, 0xFAE1, 0xFAE2,
+ 0xFAE3, 0xFAE4, 0xFAE5, 0xFAE6, 0xFAE7, 0xFAE8,
+ 0xFAE9, 0xFAEA, 0xFAEB, 0xFAEC, 0xFAED, 0xFAEE,
+ 0xFAEF, 0xFAF0, 0xFAF1, 0xFAF2, 0xFAF3, 0xFAF4,
+ 0xFAF5, 0xFAF6, 0xFAF7, 0xFAF8, 0xFAF9, 0xFAFA,
+ 0xFAFB, 0xFAFC, 0xFAFD, 0xFAFE, 0xFBA1, 0xFBA2,
+ 0xFBA3, 0xFBA4, 0xFBA5, 0xFBA6, 0xFBA7, 0xFBA8,
+ 0xFBA9, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD, 0xFBAE,
+ 0xFBAF, 0xFBB0, 0xFBB1, 0xFBB2, 0xFBB3, 0xFBB4,
+ 0xFBB5, 0xFBB6, 0xFBB7, 0xFBB8, 0xFBB9, 0xFBBA,
+ 0xFBBB, 0xFBBC, 0xFBBD, 0xFBBE, 0xFBBF, 0xFBC0,
+ 0xFBC1, 0xFBC2, 0xFBC3, 0xFBC4, 0xFBC5, 0xFBC6,
+ 0xFBC7, 0xFBC8, 0xFBC9, 0xFBCA, 0xFBCB, 0xFBCC,
+ 0xFBCD, 0xFBCE, 0xFBCF, 0xFBD0, 0xFBD1, 0xFBD2,
+ 0xFBD3, 0xFBD4, 0xFBD5, 0xFBD6, 0xFBD7, 0xFBD8,
+ 0xFBD9, 0xFBDA, 0xFBDB, 0xFBDC, 0xFBDD, 0xFBDE,
+ 0xFBDF, 0xFBE0, 0xFBE1, 0xFBE2, 0xFBE3, 0xFBE4,
+ 0xFBE5, 0xFBE6, 0xFBE7, 0xFBE8, 0xFBE9, 0xFBEA,
+ 0xFBEB, 0xFBEC, 0xFBED, 0xFBEE, 0xFBEF, 0xFBF0,
+ 0xFBF1, 0xFBF2, 0xFBF3, 0xFBF4, 0xFBF5, 0xFBF6,
+ 0xFBF7, 0xFBF8, 0xFBF9, 0xFBFA, 0xFBFB, 0xFBFC,
+ 0xFBFD, 0xFBFE, 0xFCA1, 0xFCA2, 0xFCA3, 0xFCA4,
+ 0xFCA5, 0xFCA6, 0xFCA7, 0xFCA8, 0xFCA9, 0xFCAA,
+ 0xFCAB, 0xFCAC, 0xFCAD, 0xFCAE, 0xFCAF, 0xFCB0,
+ 0xFCB1, 0xFCB2, 0xFCB3, 0xFCB4, 0xFCB5, 0xFCB6,
+ 0xFCB7, 0xFCB8, 0xFCB9, 0xFCBA, 0xFCBB, 0xFCBC,
+ 0xFCBD, 0xFCBE, 0xFCBF, 0xFCC0, 0xFCC1, 0xFCC2,
+ 0xFCC3, 0xFCC4, 0xFCC5, 0xFCC6, 0xFCC7, 0xFCC8,
+ 0xFCC9, 0xFCCA, 0xFCCB, 0xFCCC, 0xFCCD, 0xFCCE,
+ 0xFCCF, 0xFCD0, 0xFCD1, 0xFCD2, 0xFCD3, 0xFCD4,
+ 0xFCD5, 0xFCD6, 0xFCD7, 0xFCD8, 0xFCD9, 0xFCDA,
+ 0xFCDB, 0xFCDC, 0xFCDD, 0xFCDE, 0xFCDF, 0xFCE0,
+ 0xFCE1, 0xFCE2, 0xFCE3, 0xFCE4, 0xFCE5, 0xFCE6,
+ 0xFCE7, 0xFCE8, 0xFCE9, 0xFCEA, 0xFCEB, 0xFCEC,
+ 0xFCED, 0xFCEE, 0xFCEF, 0xFCF0, 0xFCF1, 0xFCF2,
+ 0xFCF3, 0xFCF4, 0xFCF5, 0xFCF6, 0xFCF7, 0xFCF8,
+ 0xFCF9, 0xFCFA, 0xFCFB, 0xFCFC, 0xFCFD, 0xFCFE,
+ 0xFDA1, 0xFDA2, 0xFDA3, 0xFDA4, 0xFDA5, 0xFDA6,
+ 0xFDA7, 0xFDA8, 0xFDA9, 0xFDAA, 0xFDAB, 0xFDAC,
+ 0xFDAD, 0xFDAE, 0xFDAF, 0xFDB0, 0xFDB1, 0xFDB2,
+ 0xFDB3, 0xFDB4, 0xFDB5, 0xFDB6, 0xFDB7, 0xFDB8,
+ 0xFDB9, 0xFDBA, 0xFDBB, 0xFDBC, 0xFDBD, 0xFDBE,
+ 0xFDBF, 0xFDC0, 0xFDC1, 0xFDC2, 0xFDC3, 0xFDC4,
+ 0xFDC5, 0xFDC6, 0xFDC7, 0xFDC8, 0xFDC9, 0xFDCA,
+ 0xFDCB, 0xFDCC, 0xFDCD, 0xFDCE, 0xFDCF, 0xFDD0,
+ 0xFDD1, 0xFDD2, 0xFDD3, 0xFDD4, 0xFDD5, 0xFDD6,
+ 0xFDD7, 0xFDD8, 0xFDD9, 0xFDDA, 0xFDDB, 0xFDDC,
+ 0xFDDD, 0xFDDE, 0xFDDF, 0xFDE0, 0xFDE1, 0xFDE2,
+ 0xFDE3, 0xFDE4, 0xFDE5, 0xFDE6, 0xFDE7, 0xFDE8,
+ 0xFDE9, 0xFDEA, 0xFDEB, 0xFDEC, 0xFDED, 0xFDEE,
+ 0xFDEF, 0xFDF0, 0xFDF1, 0xFDF2, 0xFDF3, 0xFDF4,
+ 0xFDF5, 0xFDF6, 0xFDF7, 0xFDF8, 0xFDF9, 0xFDFA,
+ 0xFDFB, 0xFDFC, 0xFDFD, 0xFDFE, 0xFEA1, 0xFEA2,
+ 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8,
+ 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE,
+ 0xFEAF, 0xFEB0, 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4,
+ 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8, 0xFEB9, 0xFEBA,
+ 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0,
+ 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4, 0xFEC5, 0xFEC6,
+ 0xFEC7, 0xFEC8, 0xFEC9, 0xFECA, 0xFECB, 0xFECC,
+ 0xFECD, 0xFECE, 0xFECF, 0xFED0, 0xFED1, 0xFED2,
+ 0xFED3, 0xFED4, 0xFED5, 0xFED6, 0xFED7, 0xFED8,
+ 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD, 0xFEDE,
+ 0xFEDF, 0xFEE0, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4,
+ 0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8, 0xFEE9, 0xFEEA,
+ 0xFEEB, 0xFEEC, 0xFEED, 0xFEEE, 0xFEEF, 0xFEF0,
+ 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6,
+ 0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC,
+ 0xFEFD, 0xFEFE, 0xA140, 0xA141, 0xA142, 0xA143,
+ 0xA144, 0xA145, 0xA146, 0xA147, 0xA148, 0xA149,
+ 0xA14A, 0xA14B, 0xA14C, 0xA14D, 0xA14E, 0xA14F,
+ 0xA150, 0xA151, 0xA152, 0xA153, 0xA154, 0xA155,
+ 0xA156, 0xA157, 0xA158, 0xA159, 0xA15A, 0xA15B,
+ 0xA15C, 0xA15D, 0xA15E, 0xA15F, 0xA160, 0xA161,
+ 0xA162, 0xA163, 0xA164, 0xA165, 0xA166, 0xA167,
+ 0xA168, 0xA169, 0xA16A, 0xA16B, 0xA16C, 0xA16D,
+ 0xA16E, 0xA16F, 0xA170, 0xA171, 0xA172, 0xA173,
+ 0xA174, 0xA175, 0xA176, 0xA177, 0xA178, 0xA179,
+ 0xA17A, 0xA17B, 0xA17C, 0xA17D, 0xA17E, 0xA180,
+ 0xA181, 0xA182, 0xA183, 0xA184, 0xA185, 0xA186,
+ 0xA187, 0xA188, 0xA189, 0xA18A, 0xA18B, 0xA18C,
+ 0xA18D, 0xA18E, 0xA18F, 0xA190, 0xA191, 0xA192,
+ 0xA193, 0xA194, 0xA195, 0xA196, 0xA197, 0xA198,
+ 0xA199, 0xA19A, 0xA19B, 0xA19C, 0xA19D, 0xA19E,
+ 0xA19F, 0xA1A0, 0xA240, 0xA241, 0xA242, 0xA243,
+ 0xA244, 0xA245, 0xA246, 0xA247, 0xA248, 0xA249,
+ 0xA24A, 0xA24B, 0xA24C, 0xA24D, 0xA24E, 0xA24F,
+ 0xA250, 0xA251, 0xA252, 0xA253, 0xA254, 0xA255,
+ 0xA256, 0xA257, 0xA258, 0xA259, 0xA25A, 0xA25B,
+ 0xA25C, 0xA25D, 0xA25E, 0xA25F, 0xA260, 0xA261,
+ 0xA262, 0xA263, 0xA264, 0xA265, 0xA266, 0xA267,
+ 0xA268, 0xA269, 0xA26A, 0xA26B, 0xA26C, 0xA26D,
+ 0xA26E, 0xA26F, 0xA270, 0xA271, 0xA272, 0xA273,
+ 0xA274, 0xA275, 0xA276, 0xA277, 0xA278, 0xA279,
+ 0xA27A, 0xA27B, 0xA27C, 0xA27D, 0xA27E, 0xA280,
+ 0xA281, 0xA282, 0xA283, 0xA284, 0xA285, 0xA286,
+ 0xA287, 0xA288, 0xA289, 0xA28A, 0xA28B, 0xA28C,
+ 0xA28D, 0xA28E, 0xA28F, 0xA290, 0xA291, 0xA292,
+ 0xA293, 0xA294, 0xA295, 0xA296, 0xA297, 0xA298,
+ 0xA299, 0xA29A, 0xA29B, 0xA29C, 0xA29D, 0xA29E,
+ 0xA29F, 0xA2A0, 0xA340, 0xA341, 0xA342, 0xA343,
+ 0xA344, 0xA345, 0xA346, 0xA347, 0xA348, 0xA349,
+ 0xA34A, 0xA34B, 0xA34C, 0xA34D, 0xA34E, 0xA34F,
+ 0xA350, 0xA351, 0xA352, 0xA353, 0xA354, 0xA355,
+ 0xA356, 0xA357, 0xA358, 0xA359, 0xA35A, 0xA35B,
+ 0xA35C, 0xA35D, 0xA35E, 0xA35F, 0xA360, 0xA361,
+ 0xA362, 0xA363, 0xA364, 0xA365, 0xA366, 0xA367,
+ 0xA368, 0xA369, 0xA36A, 0xA36B, 0xA36C, 0xA36D,
+ 0xA36E, 0xA36F, 0xA370, 0xA371, 0xA372, 0xA373,
+ 0xA374, 0xA375, 0xA376, 0xA377, 0xA378, 0xA379,
+ 0xA37A, 0xA37B, 0xA37C, 0xA37D, 0xA37E, 0xA380,
+ 0xA381, 0xA382, 0xA383, 0xA384, 0xA385, 0xA386,
+ 0xA387, 0xA388, 0xA389, 0xA38A, 0xA38B, 0xA38C,
+ 0xA38D, 0xA38E, 0xA38F, 0xA390, 0xA391, 0xA392,
+ 0xA393, 0xA394, 0xA395, 0xA396, 0xA397, 0xA398,
+ 0xA399, 0xA39A, 0xA39B, 0xA39C, 0xA39D, 0xA39E,
+ 0xA39F, 0xA3A0, 0xA440, 0xA441, 0xA442, 0xA443,
+ 0xA444, 0xA445, 0xA446, 0xA447, 0xA448, 0xA449,
+ 0xA44A, 0xA44B, 0xA44C, 0xA44D, 0xA44E, 0xA44F,
+ 0xA450, 0xA451, 0xA452, 0xA453, 0xA454, 0xA455,
+ 0xA456, 0xA457, 0xA458, 0xA459, 0xA45A, 0xA45B,
+ 0xA45C, 0xA45D, 0xA45E, 0xA45F, 0xA460, 0xA461,
+ 0xA462, 0xA463, 0xA464, 0xA465, 0xA466, 0xA467,
+ 0xA468, 0xA469, 0xA46A, 0xA46B, 0xA46C, 0xA46D,
+ 0xA46E, 0xA46F, 0xA470, 0xA471, 0xA472, 0xA473,
+ 0xA474, 0xA475, 0xA476, 0xA477, 0xA478, 0xA479,
+ 0xA47A, 0xA47B, 0xA47C, 0xA47D, 0xA47E, 0xA480,
+ 0xA481, 0xA482, 0xA483, 0xA484, 0xA485, 0xA486,
+ 0xA487, 0xA488, 0xA489, 0xA48A, 0xA48B, 0xA48C,
+ 0xA48D, 0xA48E, 0xA48F, 0xA490, 0xA491, 0xA492,
+ 0xA493, 0xA494, 0xA495, 0xA496, 0xA497, 0xA498,
+ 0xA499, 0xA49A, 0xA49B, 0xA49C, 0xA49D, 0xA49E,
+ 0xA49F, 0xA4A0, 0xA540, 0xA541, 0xA542, 0xA543,
+ 0xA544, 0xA545, 0xA546, 0xA547, 0xA548, 0xA549,
+ 0xA54A, 0xA54B, 0xA54C, 0xA54D, 0xA54E, 0xA54F,
+ 0xA550, 0xA551, 0xA552, 0xA553, 0xA554, 0xA555,
+ 0xA556, 0xA557, 0xA558, 0xA559, 0xA55A, 0xA55B,
+ 0xA55C, 0xA55D, 0xA55E, 0xA55F, 0xA560, 0xA561,
+ 0xA562, 0xA563, 0xA564, 0xA565, 0xA566, 0xA567,
+ 0xA568, 0xA569, 0xA56A, 0xA56B, 0xA56C, 0xA56D,
+ 0xA56E, 0xA56F, 0xA570, 0xA571, 0xA572, 0xA573,
+ 0xA574, 0xA575, 0xA576, 0xA577, 0xA578, 0xA579,
+ 0xA57A, 0xA57B, 0xA57C, 0xA57D, 0xA57E, 0xA580,
+ 0xA581, 0xA582, 0xA583, 0xA584, 0xA585, 0xA586,
+ 0xA587, 0xA588, 0xA589, 0xA58A, 0xA58B, 0xA58C,
+ 0xA58D, 0xA58E, 0xA58F, 0xA590, 0xA591, 0xA592,
+ 0xA593, 0xA594, 0xA595, 0xA596, 0xA597, 0xA598,
+ 0xA599, 0xA59A, 0xA59B, 0xA59C, 0xA59D, 0xA59E,
+ 0xA59F, 0xA5A0, 0xA640, 0xA641, 0xA642, 0xA643,
+ 0xA644, 0xA645, 0xA646, 0xA647, 0xA648, 0xA649,
+ 0xA64A, 0xA64B, 0xA64C, 0xA64D, 0xA64E, 0xA64F,
+ 0xA650, 0xA651, 0xA652, 0xA653, 0xA654, 0xA655,
+ 0xA656, 0xA657, 0xA658, 0xA659, 0xA65A, 0xA65B,
+ 0xA65C, 0xA65D, 0xA65E, 0xA65F, 0xA660, 0xA661,
+ 0xA662, 0xA663, 0xA664, 0xA665, 0xA666, 0xA667,
+ 0xA668, 0xA669, 0xA66A, 0xA66B, 0xA66C, 0xA66D,
+ 0xA66E, 0xA66F, 0xA670, 0xA671, 0xA672, 0xA673,
+ 0xA674, 0xA675, 0xA676, 0xA677, 0xA678, 0xA679,
+ 0xA67A, 0xA67B, 0xA67C, 0xA67D, 0xA67E, 0xA680,
+ 0xA681, 0xA682, 0xA683, 0xA684, 0xA685, 0xA686,
+ 0xA687, 0xA688, 0xA689, 0xA68A, 0xA68B, 0xA68C,
+ 0xA68D, 0xA68E, 0xA68F, 0xA690, 0xA691, 0xA692,
+ 0xA693, 0xA694, 0xA695, 0xA696, 0xA697, 0xA698,
+ 0xA699, 0xA69A, 0xA69B, 0xA69C, 0xA69D, 0xA69E,
+ 0xA69F, 0xA6A0, 0xA740, 0xA741, 0xA742, 0xA743,
+ 0xA744, 0xA745, 0xA746, 0xA747, 0xA748, 0xA749,
+ 0xA74A, 0xA74B, 0xA74C, 0xA74D, 0xA74E, 0xA74F,
+ 0xA750, 0xA751, 0xA752, 0xA753, 0xA754, 0xA755,
+ 0xA756, 0xA757, 0xA758, 0xA759, 0xA75A, 0xA75B,
+ 0xA75C, 0xA75D, 0xA75E, 0xA75F, 0xA760, 0xA761,
+ 0xA762, 0xA763, 0xA764, 0xA765, 0xA766, 0xA767,
+ 0xA768, 0xA769, 0xA76A, 0xA76B, 0xA76C, 0xA76D,
+ 0xA76E, 0xA76F, 0xA770, 0xA771, 0xA772, 0xA773,
+ 0xA774, 0xA775, 0xA776, 0xA777, 0xA778, 0xA779,
+ 0xA77A, 0xA77B, 0xA77C, 0xA77D, 0xA77E, 0xA780,
+ 0xA781, 0xA782, 0xA783, 0xA784, 0xA785, 0xA786,
+ 0xA787, 0xA788, 0xA789, 0xA78A, 0xA78B, 0xA78C,
+ 0xA78D, 0xA78E, 0xA78F, 0xA790, 0xA791, 0xA792,
+ 0xA793, 0xA794, 0xA795, 0xA796, 0xA797, 0xA798,
+ 0xA799, 0xA79A, 0xA79B, 0xA79C, 0xA79D, 0xA79E,
+ 0xA79F, 0xA7A0, 0xA2AB, 0xA2AC, 0xA2AD, 0xA2AE,
+ 0xA2AF, 0xA2B0,0x8336C739, 0xA2E4, 0xA2EF, 0xA2F0,
+ 0xA2FD, 0xA2FE, 0xA4F4, 0xA4F5, 0xA4F6, 0xA4F7,
+ 0xA4F8, 0xA4F9, 0xA4FA, 0xA4FB, 0xA4FC, 0xA4FD,
+ 0xA4FE, 0xA5F7, 0xA5F8, 0xA5F9, 0xA5FA, 0xA5FB,
+ 0xA5FC, 0xA5FD, 0xA5FE, 0xA6B9, 0xA6BA, 0xA6BB,
+ 0xA6BC, 0xA6BD, 0xA6BE, 0xA6BF, 0xA6C0, 0xA6D9,
+ 0xA6DA, 0xA6DB, 0xA6DC, 0xA6DD, 0xA6DE, 0xA6DF,
+ 0xA6EC, 0xA6ED, 0xA6F3, 0xA6F6, 0xA6F7, 0xA6F8,
+ 0xA6F9, 0xA6FA, 0xA6FB, 0xA6FC, 0xA6FD, 0xA6FE,
+ 0xA7C2, 0xA7C3, 0xA7C4, 0xA7C5, 0xA7C6, 0xA7C7,
+ 0xA7C8, 0xA7C9, 0xA7CA, 0xA7CB, 0xA7CC, 0xA7CD,
+ 0xA7CE, 0xA7CF, 0xA7D0, 0xA7F2, 0xA7F3, 0xA7F4,
+ 0xA7F5, 0xA7F6, 0xA7F7, 0xA7F8, 0xA7F9, 0xA7FA,
+ 0xA7FB, 0xA7FC, 0xA7FD, 0xA7FE, 0xA896, 0xA897,
+ 0xA898, 0xA899, 0xA89A, 0xA89B, 0xA89C, 0xA89D,
+ 0xA89E, 0xA89F, 0xA8A0, 0xA8BC,0x8336C830, 0xA8C1,
+ 0xA8C2, 0xA8C3, 0xA8C4, 0xA8EA, 0xA8EB, 0xA8EC,
+ 0xA8ED, 0xA8EE, 0xA8EF, 0xA8F0, 0xA8F1, 0xA8F2,
+ 0xA8F3, 0xA8F4, 0xA8F5, 0xA8F6, 0xA8F7, 0xA8F8,
+ 0xA8F9, 0xA8FA, 0xA8FB, 0xA8FC, 0xA8FD, 0xA8FE,
+ 0xA958, 0xA95B, 0xA95D, 0xA95E, 0xA95F,0x8336C831,
+ 0x8336C832,0x8336C833,0x8336C834,0x8336C835,0x8336C836,0x8336C837,
+ 0x8336C838,0x8336C839,0x8336C930,0x8336C931,0x8336C932,0x8336C933,
+ 0xA997, 0xA998, 0xA999, 0xA99A, 0xA99B, 0xA99C,
+ 0xA99D, 0xA99E, 0xA99F, 0xA9A0, 0xA9A1, 0xA9A2,
+ 0xA9A3, 0xA9F0, 0xA9F1, 0xA9F2, 0xA9F3, 0xA9F4,
+ 0xA9F5, 0xA9F6, 0xA9F7, 0xA9F8, 0xA9F9, 0xA9FA,
+ 0xA9FB, 0xA9FC, 0xA9FD, 0xA9FE, 0xD7FA, 0xD7FB,
+ 0xD7FC, 0xD7FD, 0xD7FE,0x8336C934, 0xFE51, 0xFE52,
+ 0xFE53,0x8336C935,0x8336C936,0x8336C937,0x8336C938,0x8336C939,
+ 0xFE59,0x8336CA30,0x8336CA31,0x8336CA32,0x8336CA33,0x8336CA34,
+ 0x8336CA35,0x8336CA36, 0xFE61,0x8336CA37,0x8336CA38,0x8336CA39,
+ 0x8336CB30, 0xFE66, 0xFE67,0x8336CB31,0x8336CB32,0x8336CB33,
+ 0x8336CB34, 0xFE6C, 0xFE6D,0x8336CB35,0x8336CB36,0x8336CB37,
+ 0x8336CB38,0x8336CB39,0x8336CC30,0x8336CC31,0x8336CC32, 0xFE76,
+ 0x8336CC33,0x8336CC34,0x8336CC35,0x8336CC36,0x8336CC37,0x8336CC38,
+ 0x8336CC39, 0xFE7E,0x8336CD30,0x8336CD31,0x8336CD32,0x8336CD33,
+ 0x8336CD34,0x8336CD35,0x8336CD36,0x8336CD37,0x8336CD38,0x8336CD39,
+ 0x8336CE30,0x8336CE31,0x8336CE32,0x8336CE33,0x8336CE34,0x8336CE35,
+ 0xFE90, 0xFE91,0x8336CE36,0x8336CE37,0x8336CE38,0x8336CE39,
+ 0x8336CF30,0x8336CF31,0x8336CF32,0x8336CF33,0x8336CF34,0x8336CF35,
+ 0x8336CF36,0x8336CF37,0x8336CF38,0x8336CF39, 0xFEA0, 0xFD9C,
+ 0x84308535,0x84308536,0x84308537,0x84308538,0x84308539,0x84308630,
+ 0x84308631,0x84308632,0x84308633,0x84308634,0x84308635,0x84308636,
+ 0x84308637,0x84308638,0x84308639,0x84308730,0x84308731,0x84308732,
+ 0x84308733,0x84308734,0x84308735,0x84308736,0x84308737,0x84308738,
+ 0x84308739,0x84308830,0x84308831,0x84308832,0x84308833,0x84308834,
+ 0x84308835,0x84308836,0x84308837,0x84308838,0x84308839,0x84308930,
+ 0x84308931,0x84308932,0x84308933,0x84308934,0x84308935,0x84308936,
+ 0x84308937,0x84308938,0x84308939,0x84308A30,0x84308A31,0x84308A32,
+ 0x84308A33,0x84308A34,0x84308A35,0x84308A36,0x84308A37,0x84308A38,
+ 0x84308A39,0x84308B30,0x84308B31,0x84308B32,0x84308B33,0x84308B34,
+ 0x84308B35,0x84308B36,0x84308B37,0x84308B38,0x84308B39,0x84308C30,
+ 0x84308C31,0x84308C32,0x84308C33,0x84308C34,0x84308C35,0x84308C36,
+ 0x84308C37,0x84308C38,0x84308C39,0x84308D30, 0xFD9D,0x84308D31,
+ 0x84308D32,0x84308D33,0x84308D34,0x84308D35,0x84308D36,0x84308D37,
+ 0x84308D38,0x84308D39,0x84308E30,0x84308E31,0x84308E32,0x84308E33,
+ 0x84308E34,0x84308E35,0x84308E36,0x84308E37,0x84308E38,0x84308E39,
+ 0x84308F30,0x84308F31,0x84308F32,0x84308F33,0x84308F34,0x84308F35,
+ 0x84308F36,0x84308F37, 0xFD9E,0x84308F38,0x84308F39,0x84309030,
+ 0x84309031,0x84309032,0x84309033,0x84309034,0x84309035,0x84309036,
+ 0x84309037,0x84309038,0x84309039,0x84309130,0x84309131,0x84309132,
+ 0x84309133,0x84309134,0x84309135,0x84309136,0x84309137,0x84309138,
+ 0x84309139,0x84309230,0x84309231,0x84309232,0x84309233,0x84309234,
+ 0x84309235,0x84309236,0x84309237,0x84309238,0x84309239,0x84309330,
+ 0x84309331,0x84309332,0x84309333,0x84309334,0x84309335,0x84309336,
+ 0x84309337,0x84309338,0x84309339,0x84309430,0x84309431,0x84309432,
+ 0x84309433,0x84309434,0x84309435,0x84309436,0x84309437,0x84309438,
+ 0x84309439,0x84309530,0x84309531,0x84309532,0x84309533,0x84309534,
+ 0x84309535,0x84309536,0x84309537,0x84309538,0x84309539,0x84309630,
+ 0x84309631,0x84309632,0x84309633,0x84309634,0x84309635,0x84309636,
+ 0x84309637,0x84309638,0x84309639,0x84309730,0x84309731,0x84309732,
+ 0x84309733,0x84309734,0x84309735,0x84309736,0x84309737,0x84309738,
+ 0xFD9F,0x84309739,0x84309830,0x84309831,0x84309832,0x84309833,
+ 0x84309834,0x84309835,0x84309836,0x84309837, 0xFDA0,0x84309838,
+ 0x84309839,0x84309930,0x84309931,0x84309932,0x84309933,0x84309934,
+ 0x84309935,0x84309936,0x84309937,0x84309938,0x84309939,0x84309A30,
+ 0x84309A31,0x84309A32,0x84309A33,0x84309A34,0x84309A35,0x84309A36,
+ 0x84309A37,0x84309A38,0x84309A39,0x84309B30,0x84309B31,0x84309B32,
+ 0x84309B33, 0xFE40, 0xFE41, 0xFE42, 0xFE43,0x84309B34,
+ 0xFE44,0x84309B35, 0xFE45, 0xFE46,0x84309B36,0x84309B37,
+ 0x84309B38, 0xFE47,0x84309B39,0x84309C30,0x84309C31,0x84309C32,
+ 0x84309C33,0x84309C34, 0xFE48, 0xFE49, 0xFE4A,0x84309C35,
+ 0xFE4B, 0xFE4C,0x84309C36,0x84309C37, 0xFE4D, 0xFE4E,
+ 0xFE4F, 0xA955, 0xA6F2,0x84318538, 0xA6F4, 0xA6F5,
+ 0xA6E0, 0xA6E1, 0xA6F0, 0xA6F1, 0xA6E2, 0xA6E3,
+ 0xA6EE, 0xA6EF, 0xA6E6, 0xA6E7, 0xA6E4, 0xA6E5,
+ 0xA6E8, 0xA6E9, 0xA6EA, 0xA6EB,0x84318539,0x84318630,
+ 0x84318631,0x84318632, 0xA968, 0xA969, 0xA96A, 0xA96B,
+ 0xA96C, 0xA96D, 0xA96E, 0xA96F, 0xA970, 0xA971,
+ 0x84318633, 0xA972, 0xA973, 0xA974, 0xA975,0x84318634,
+ 0xA976, 0xA977, 0xA978, 0xA979, 0xA97A, 0xA97B,
+ 0xA97C, 0xA97D, 0xA97E, 0xA980, 0xA981, 0xA982,
+ 0xA983, 0xA984,0x84318635, 0xA985, 0xA986, 0xA987,
+ 0xA988,0x84318636,0x84318637,0x84318638,0x84318639,0x84318730,
+ 0x84318731,0x84318732,0x84318733,0x84318734,0x84318735,0x84318736,
+ 0x84318737,0x84318738,0x84318739,0x84318830,0x84318831,0x84318832,
+ 0x84318833,0x84318834,0x84318835,0x84318836,0x84318837,0x84318838,
+ 0x84318839,0x84318930,0x84318931,0x84318932,0x84318933,0x84318934,
+ 0x84318935,0x84318936,0x84318937,0x84318938,0x84318939,0x84318A30,
+ 0x84318A31,0x84318A32,0x84318A33,0x84318A34,0x84318A35,0x84318A36,
+ 0x84318A37,0x84318A38,0x84318A39,0x84318B30,0x84318B31,0x84318B32,
+ 0x84318B33,0x84318B34,0x84318B35,0x84318B36,0x84318B37,0x84318B38,
+ 0x84318B39,0x84318C30,0x84318C31,0x84318C32,0x84318C33,0x84318C34,
+ 0x84318C35,0x84318C36,0x84318C37,0x84318C38,0x84318C39,0x84318D30,
+ 0x84318D31,0x84318D32,0x84318D33,0x84318D34,0x84318D35,0x84318D36,
+ 0x84318D37,0x84318D38,0x84318D39,0x84318E30,0x84318E31,0x84318E32,
+ 0x84318E33,0x84318E34,0x84318E35,0x84318E36,0x84318E37,0x84318E38,
+ 0x84318E39,0x84318F30,0x84318F31,0x84318F32,0x84318F33,0x84318F34,
+ 0x84318F35,0x84318F36,0x84318F37,0x84318F38,0x84318F39,0x84319030,
+ 0x84319031,0x84319032,0x84319033,0x84319034,0x84319035,0x84319036,
+ 0x84319037,0x84319038,0x84319039,0x84319130,0x84319131,0x84319132,
+ 0x84319133,0x84319134,0x84319135,0x84319136,0x84319137,0x84319138,
+ 0x84319139,0x84319230,0x84319231,0x84319232,0x84319233,0x84319234,
+ 0x84319235,0x84319236,0x84319237,0x84319238,0x84319239,0x84319330,
+ 0x84319331,0x84319332,0x84319333,0x84319334,0x84319335,0x84319336,
+ 0x84319337,0x84319338,0x84319339,0x84319430,0x84319431,0x84319432,
+ 0x84319433,0x84319434,0x84319435,0x84319436,0x84319437,0x84319438,
+ 0x84319439,0x84319530,0x84319531,0x84319532,0x84319533,0x84319534,
+ 0xA3A1, 0xA3A2, 0xA3A3, 0xA1E7, 0xA3A5, 0xA3A6,
+ 0xA3A7, 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC,
+ 0xA3AD, 0xA3AE, 0xA3AF, 0xA3B0, 0xA3B1, 0xA3B2,
+ 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7, 0xA3B8,
+ 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE,
+ 0xA3BF, 0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4,
+ 0xA3C5, 0xA3C6, 0xA3C7, 0xA3C8, 0xA3C9, 0xA3CA,
+ 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF, 0xA3D0,
+ 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6,
+ 0xA3D7, 0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA3DC,
+ 0xA3DD, 0xA3DE, 0xA3DF, 0xA3E0, 0xA3E1, 0xA3E2,
+ 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7, 0xA3E8,
+ 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE,
+ 0xA3EF, 0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4,
+ 0xA3F5, 0xA3F6, 0xA3F7, 0xA3F8, 0xA3F9, 0xA3FA,
+ 0xA3FB, 0xA3FC, 0xA3FD, 0xA1AB,0x84319535,0x84319536,
+ 0x84319537,0x84319538,0x84319539,0x84319630,0x84319631,0x84319632,
+ 0x84319633,0x84319634,0x84319635,0x84319636,0x84319637,0x84319638,
+ 0x84319639,0x84319730,0x84319731,0x84319732,0x84319733,0x84319734,
+ 0x84319735,0x84319736,0x84319737,0x84319738,0x84319739,0x84319830,
+ 0x84319831,0x84319832,0x84319833,0x84319834,0x84319835,0x84319836,
+ 0x84319837,0x84319838,0x84319839,0x84319930,0x84319931,0x84319932,
+ 0x84319933,0x84319934,0x84319935,0x84319936,0x84319937,0x84319938,
+ 0x84319939,0x84319A30,0x84319A31,0x84319A32,0x84319A33,0x84319A34,
+ 0x84319A35,0x84319A36,0x84319A37,0x84319A38,0x84319A39,0x84319B30,
+ 0x84319B31,0x84319B32,0x84319B33,0x84319B34,0x84319B35,0x84319B36,
+ 0x84319B37,0x84319B38,0x84319B39,0x84319C30,0x84319C31,0x84319C32,
+ 0x84319C33,0x84319C34,0x84319C35,0x84319C36,0x84319C37,0x84319C38,
+ 0x84319C39,0x84319D30,0x84319D31,0x84319D32,0x84319D33,0x84319D34,
+ 0x84319D35,0x84319D36,0x84319D37,0x84319D38,0x84319D39,0x84319E30,
+ 0x84319E31,0x84319E32,0x84319E33,0x84319E34,0x84319E35,0x84319E36,
+ 0x84319E37,0x84319E38,0x84319E39,0x84319F30,0x84319F31,0x84319F32,
+ 0x84319F33,0x84319F34,0x84319F35,0x84319F36,0x84319F37,0x84319F38,
+ 0x84319F39,0x8431A030,0x8431A031,0x8431A032,0x8431A033,0x8431A034,
+ 0x8431A035,0x8431A036,0x8431A037,0x8431A038,0x8431A039,0x8431A130,
+ 0x8431A131,0x8431A132,0x8431A133,0x8431A134,0x8431A135,0x8431A136,
+ 0x8431A137,0x8431A138,0x8431A139,0x8431A230,0x8431A231,0x8431A232,
+ 0x8431A233, 0xA1E9, 0xA1EA, 0xA956, 0xA3FE, 0xA957,
+ 0xA3A4,
+};
+
+static ImplUnicodeToGb180302000Range const
+ aImplUnicodeToGb180302000Ranges[] = {
+ { 0, 0x0452, 0x200F, 820 },
+ { 978, 0x2643, 0x2E80, 9219 },
+ { 2565, 0x361B, 0x3917, 12973 },
+ { 4511, 0x3CE1, 0x4055, 14698 },
+ { 5480, 0x4160, 0x4336, 15847 },
+ { 5746, 0x44D7, 0x464B, 16729 },
+ { 6162, 0x478E, 0x4946, 17418 },
+ { 6484, 0x49B8, 0x4C76, 17961 },
+ { 6597, 0x9FA6, 0xDFFF, 19043 },
+ { 27892, 0xE865, 0xF92B, 33550 },
+ { 30041, 0xFA2A, 0xFE2F, 38078 },
+ { 30295, 0xFFE6, 0xFFFF, 39394 },
+};
diff --git a/sal/textenc/gettextencodingdata.h b/sal/textenc/gettextencodingdata.h
new file mode 100644
index 000000000000..9307074f6cff
--- /dev/null
+++ b/sal/textenc/gettextencodingdata.h
@@ -0,0 +1,46 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_GETTEXTENCODINGDATA_H
+#define INCLUDED_RTL_TEXTENC_GETTEXTENCODINGDATA_H
+
+#include "tenchelp.h"
+#include "rtl/textenc.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+ImplTextEncodingData const *
+Impl_getTextEncodingData(rtl_TextEncoding nEncoding) SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_GETTEXTENCODINGDATA_H */
diff --git a/sal/textenc/makefile.mk b/sal/textenc/makefile.mk
new file mode 100644
index 000000000000..260559366ffd
--- /dev/null
+++ b/sal/textenc/makefile.mk
@@ -0,0 +1,87 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ = ..
+PRJNAME = sal
+TARGET = textenc
+
+.INCLUDE: settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+SLOFILES = \
+ $(SLO)$/context.obj \
+ $(SLO)$/convertbig5hkscs.obj \
+ $(SLO)$/converter.obj \
+ $(SLO)$/converteuctw.obj \
+ $(SLO)$/convertgb18030.obj \
+ $(SLO)$/convertiso2022cn.obj \
+ $(SLO)$/convertiso2022jp.obj \
+ $(SLO)$/convertiso2022kr.obj \
+ $(SLO)$/convertsinglebytetobmpunicode.obj \
+ $(SLO)$/tcvtbyte.obj \
+ $(SLO)$/tcvtmb.obj \
+ $(SLO)$/tcvtutf7.obj \
+ $(SLO)$/tcvtutf8.obj \
+ $(SLO)$/tenchelp.obj \
+ $(SLO)$/tencinfo.obj \
+ $(SLO)$/textcvt.obj \
+ $(SLO)$/textenc.obj \
+ $(SLO)$/unichars.obj
+
+OBJFILES = \
+ $(OBJ)$/context.obj \
+ $(OBJ)$/convertbig5hkscs.obj \
+ $(OBJ)$/converter.obj \
+ $(OBJ)$/converteuctw.obj \
+ $(OBJ)$/convertgb18030.obj \
+ $(OBJ)$/convertiso2022cn.obj \
+ $(OBJ)$/convertiso2022jp.obj \
+ $(OBJ)$/convertiso2022kr.obj \
+ $(OBJ)$/convertsinglebytetobmpunicode.obj \
+ $(OBJ)$/tcvtbyte.obj \
+ $(OBJ)$/tcvtmb.obj \
+ $(OBJ)$/tcvtutf7.obj \
+ $(OBJ)$/tcvtutf8.obj \
+ $(OBJ)$/tenchelp.obj \
+ $(OBJ)$/tencinfo.obj \
+ $(OBJ)$/textcvt.obj \
+ $(OBJ)$/textenc.obj \
+ $(OBJ)$/unichars.obj
+
+# Optimization off on Solaris Intel due to internal compiler error; to be
+# reevaluated after compiler upgrade:
+.IF "$(OS)$(CPU)" == "SOLARISI"
+
+NOOPTFILES = \
+ $(OBJ)$/textenc.obj \
+ $(SLO)$/textenc.obj
+
+.ENDIF # OS, CPU, SOLARISI
+
+.INCLUDE: target.mk
diff --git a/sal/textenc/tcvtarb1.tab b/sal/textenc/tcvtarb1.tab
new file mode 100644
index 000000000000..9d748371a108
--- /dev/null
+++ b/sal/textenc/tcvtarb1.tab
@@ -0,0 +1,936 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the tables for all 1 byte charsets, for the */
+/* following scripts: arabic, hebrew and other scripts in the arabic region */
+
+/* ======================================================================= */
+
+/* IBM-862 */
+/* Dos Standard CharSet for Hebrew */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp862.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM862UNI_START 0x80
+#define IBM862UNI_END 0xFF
+static sal_uInt16 const aImplIBM862ToUniTab[IBM862UNI_END - IBM862UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, /* 0x80 */
+ 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, /* 0x80 */
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, /* 0x90 */
+ 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, /* 0x90 */
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, /* 0xA0 */
+ 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* 0xB0 */
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, /* 0xC0 */
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, /* 0xD0 */
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, /* 0xE0 */
+ 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, /* 0xE0 */
+ 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM862CHAR_START 0x05D0
+#define IBM862CHAR_END 0x05EA
+static sal_uChar const aImplIBM862ToCharTab[IBM862CHAR_END - IBM862CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x05D0 */
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, /* 0x05D0 */
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x05E0 */
+ 0x98, 0x99, 0x9A /* 0x05E0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM862TOCHARTABEX_COUNT 101
+static ImplUniCharTabData const aImplIBM862ToCharTabEx[IBM862TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xFF, 0 },
+ { 0x00A1, 0xAD, 0 },
+ { 0x00A2, 0x9B, 0 },
+ { 0x00A3, 0x9C, 0 },
+ { 0x00A5, 0x9D, 0 },
+ { 0x00AA, 0xA6, 0 },
+ { 0x00AB, 0xAE, 0 },
+ { 0x00AC, 0xAA, 0 },
+ { 0x00B0, 0xF8, 0 },
+ { 0x00B1, 0xF1, 0 },
+ { 0x00B2, 0xFD, 0 },
+ { 0x00B5, 0xE6, 0 },
+ { 0x00B7, 0xFA, 0 },
+ { 0x00BA, 0xA7, 0 },
+ { 0x00BB, 0xAF, 0 },
+ { 0x00BC, 0xAC, 0 },
+ { 0x00BD, 0xAB, 0 },
+ { 0x00BF, 0xA8, 0 },
+ { 0x00D1, 0xA5, 0 },
+ { 0x00DF, 0xE1, 0 },
+ { 0x00E1, 0xA0, 0 },
+ { 0x00ED, 0xA1, 0 },
+ { 0x00F1, 0xA4, 0 },
+ { 0x00F3, 0xA2, 0 },
+ { 0x00F7, 0xF6, 0 },
+ { 0x00FA, 0xA3, 0 },
+ { 0x0192, 0x9F, 0 },
+ { 0x0393, 0xE2, 0 },
+ { 0x0398, 0xE9, 0 },
+ { 0x03A3, 0xE4, 0 },
+ { 0x03A6, 0xE8, 0 },
+ { 0x03A9, 0xEA, 0 },
+ { 0x03B1, 0xE0, 0 },
+ { 0x03B4, 0xEB, 0 },
+ { 0x03B5, 0xEE, 0 },
+ { 0x03C0, 0xE3, 0 },
+ { 0x03C3, 0xE5, 0 },
+ { 0x03C4, 0xE7, 0 },
+ { 0x03C6, 0xED, 0 },
+ { 0x207F, 0xFC, 0 },
+ { 0x20A7, 0x9E, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x221A, 0xFB, 0 },
+ { 0x221E, 0xEC, 0 },
+ { 0x2229, 0xEF, 0 },
+ { 0x2248, 0xF7, 0 },
+ { 0x2261, 0xF0, 0 },
+ { 0x2264, 0xF3, 0 },
+ { 0x2265, 0xF2, 0 },
+ { 0x2310, 0xA9, 0 },
+ { 0x2320, 0xF4, 0 },
+ { 0x2321, 0xF5, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2552, 0xD5, 0 },
+ { 0x2553, 0xD6, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2555, 0xB8, 0 },
+ { 0x2556, 0xB7, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x2558, 0xD4, 0 },
+ { 0x2559, 0xD3, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255B, 0xBE, 0 },
+ { 0x255C, 0xBD, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x255E, 0xC6, 0 },
+ { 0x255F, 0xC7, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2561, 0xB5, 0 },
+ { 0x2562, 0xB6, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2564, 0xD1, 0 },
+ { 0x2565, 0xD2, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2567, 0xCF, 0 },
+ { 0x2568, 0xD0, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256A, 0xD8, 0 },
+ { 0x256B, 0xD7, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM862ByteCvtData =
+{
+ aImplIBM862ToUniTab,
+ NULL,
+ IBM862UNI_START, IBM862UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM862ToCharTab,
+ NULL,
+ aImplIBM862ToCharTabEx,
+ IBM862CHAR_START, IBM862CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM862TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM862TextEncodingData
+ = { { &aImplIBM862ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 177,
+ "iso8859-8",
+ "IBM862",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_MIME
+ | RTL_TEXTENCODING_INFO_R2L };
+ /* DOS/OS2, SCRIPT_HEBREW, pc code page 862, mac encoding 5 */
+
+/* ======================================================================= */
+
+/* IBM-864 */
+/* Dos Standard CharSet for Arabic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp864.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM864UNI_START 0x80
+#define IBM864UNI_END 0xFE
+static sal_uInt16 const aImplIBM864ToUniTab[IBM864UNI_END - IBM864UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, /* 0x80 */
+ 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, /* 0x80 */
+ 0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, /* 0x90 */
+ 0x00BB, 0xFEF7, 0xFEF8, 0, 0, 0xFEFB, 0xFEFC, 0, /* 0x90 */
+ 0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0, 0, /* 0xA0 */
+ 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, /* 0xA0 */
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, /* 0xB0 */
+ 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, /* 0xB0 */
+ 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, /* 0xC0 */
+ 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, /* 0xC0 */
+ 0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, /* 0xD0 */
+ 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, /* 0xD0 */
+ 0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, /* 0xE0 */
+ 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, /* 0xE0 */
+ 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, /* 0xF0 */
+ 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM864CHAR_START 0xFE7D
+#define IBM864CHAR_END 0xFEFC
+static sal_uChar const aImplIBM864ToCharTab[IBM864CHAR_END - IBM864CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0, 0, 0, /* 0xFE70 */
+ 0xC1, 0xC2, 0xA2, 0xC3, 0xA5, 0xC4, 0, 0, /* 0xFE80 */
+ 0, 0, 0, 0xC6, 0, 0xC7, 0xA8, 0xA9, /* 0xFE80 */
+ 0, 0xC8, 0, 0xC9, 0, 0xAA, 0, 0xCA, /* 0xFE90 */
+ 0, 0xAB, 0, 0xCB, 0, 0xAD, 0, 0xCC, /* 0xFE90 */
+ 0, 0xAE, 0, 0xCD, 0, 0xAF, 0, 0xCE, /* 0xFEA0 */
+ 0, 0xCF, 0, 0xD0, 0, 0xD1, 0, 0xD2, /* 0xFEA0 */
+ 0, 0xBC, 0, 0xD3, 0, 0xBD, 0, 0xD4, /* 0xFEB0 */
+ 0, 0xBE, 0, 0xD5, 0, 0xEB, 0, 0xD6, /* 0xFEB0 */
+ 0, 0xD7, 0, 0, 0, 0xD8, 0, 0, /* 0xFEC0 */
+ 0, 0xDF, 0xC5, 0xD9, 0xEC, 0xEE, 0xED, 0xDA, /* 0xFEC0 */
+ 0xF7, 0xBA, 0, 0xE1, 0, 0xF8, 0, 0xE2, /* 0xFED0 */
+ 0, 0xFC, 0, 0xE3, 0, 0xFB, 0, 0xE4, /* 0xFED0 */
+ 0, 0xEF, 0, 0xE5, 0, 0xF2, 0, 0xE6, /* 0xFEE0 */
+ 0, 0xF3, 0, 0xE7, 0xF4, 0xE8, 0, 0xE9, /* 0xFEE0 */
+ 0xF5, 0xFD, 0xF6, 0xEA, 0, 0xF9, 0xFA, 0x99, /* 0xFEF0 */
+ 0x9A, 0, 0, 0x9D, 0x9E /* 0xFEF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM864TOCHARTABEX_COUNT 51
+static ImplUniCharTabData const aImplIBM864ToCharTabEx[IBM864TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A2, 0xC0, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A6, 0xDB, 0 },
+ { 0x00AB, 0x97, 0 },
+ { 0x00AC, 0xDC, 0 },
+ { 0x00AD, 0xA1, 0 },
+ { 0x00B0, 0x80, 0 },
+ { 0x00B1, 0x93, 0 },
+ { 0x00B7, 0x81, 0 },
+ { 0x00BB, 0x98, 0 },
+ { 0x00BC, 0x95, 0 },
+ { 0x00BD, 0x94, 0 },
+ { 0x00D7, 0xDE, 0 },
+ { 0x00F7, 0xDD, 0 },
+ { 0x03B2, 0x90, 0 },
+ { 0x03C6, 0x92, 0 },
+ { 0x060C, 0xAC, 0 },
+ { 0x061B, 0xBB, 0 },
+ { 0x061F, 0xBF, 0 },
+ { 0x0640, 0xE0, 0 },
+ { 0x0651, 0xF1, 0 },
+ { 0x0660, 0xB0, 0 },
+ { 0x0661, 0xB1, 0 },
+ { 0x0662, 0xB2, 0 },
+ { 0x0663, 0xB3, 0 },
+ { 0x0664, 0xB4, 0 },
+ { 0x0665, 0xB5, 0 },
+ { 0x0666, 0xB6, 0 },
+ { 0x0667, 0xB7, 0 },
+ { 0x0668, 0xB8, 0 },
+ { 0x0669, 0xB9, 0 },
+ { 0x066A, 0x25, 0 },
+ { 0x2219, 0x82, 0 },
+ { 0x221A, 0x83, 0 },
+ { 0x221E, 0x91, 0 },
+ { 0x2248, 0x96, 0 },
+ { 0x2500, 0x85, 0 },
+ { 0x2502, 0x86, 0 },
+ { 0x250C, 0x8D, 0 },
+ { 0x2510, 0x8C, 0 },
+ { 0x2514, 0x8E, 0 },
+ { 0x2518, 0x8F, 0 },
+ { 0x251C, 0x8A, 0 },
+ { 0x2524, 0x88, 0 },
+ { 0x252C, 0x89, 0 },
+ { 0x2534, 0x8B, 0 },
+ { 0x253C, 0x87, 0 },
+ { 0x2592, 0x84, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM864ByteCvtData =
+{
+ aImplIBM864ToUniTab,
+ NULL,
+ IBM864UNI_START, IBM864UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM864ToCharTab,
+ NULL,
+ aImplIBM864ToCharTabEx,
+ IBM864CHAR_START, IBM864CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM864TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM864TextEncodingData
+ = { { &aImplIBM864ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 178,
+ "iso8859-6",
+ "IBM864",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_MIME
+ | RTL_TEXTENCODING_INFO_R2L };
+ /* DOS/OS2, SCRIPT_ARABIC, pc code page 864, mac encoding 4 */
+
+/* ======================================================================= */
+
+/* MS-1255 */
+/* Windows Standard CharSet for Hebrew */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1255.txt from 04/15/98 Version 2.01 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1255UNI_START 0x80
+#define MS1255UNI_END 0xFF
+static sal_uInt16 const aImplMS1255ToUniTab[MS1255UNI_END - MS1255UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0x02C6, 0x2030, 0, 0x2039, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0x02DC, 0x2122, 0, 0x203A, 0, 0, 0, 0, /* 0x90 */
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* 0xB0 */
+ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, /* 0xC0 */
+ 0x05B8, 0x05B9, 0, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, /* 0xC0 */
+ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, /* 0xD0 */
+ 0x05F4, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, /* 0xE0 */
+ 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, /* 0xE0 */
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, /* 0xF0 */
+ 0x05E8, 0x05E9, 0x05EA, 0, 0, 0x200E, 0x200F, 0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1255CHAR_START 0x05B0
+#define MS1255CHAR_END 0x05F4
+static sal_uChar const aImplMS1255ToCharTab[MS1255CHAR_END - MS1255CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x05B0 */
+ 0xC8, 0xC9, 0, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x05B0 */
+ 0xD0, 0xD1, 0xD2, 0xD3, 0, 0, 0, 0, /* 0x05C0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x05C0 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x05D0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x05D0 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x05E0 */
+ 0xF8, 0xF9, 0xFA, 0, 0, 0, 0, 0, /* 0x05E0 */
+ 0xD4, 0xD5, 0xD6, 0xD7, 0xD8 /* 0x05F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1255TOCHARTABEX_COUNT 54
+static ImplUniCharTabData const aImplMS1255ToCharTabEx[MS1255TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A1, 0xA1, 0 },
+ { 0x00A2, 0xA2, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A5, 0xA5, 0 },
+ { 0x00A6, 0xA6, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xAB, 0 },
+ { 0x00AC, 0xAC, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AE, 0xAE, 0 },
+ { 0x00AF, 0xAF, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B2, 0xB2, 0 },
+ { 0x00B3, 0xB3, 0 },
+ { 0x00B4, 0xB4, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xB6, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00B8, 0xB8, 0 },
+ { 0x00B9, 0xB9, 0 },
+ { 0x00BB, 0xBB, 0 },
+ { 0x00BC, 0xBC, 0 },
+ { 0x00BD, 0xBD, 0 },
+ { 0x00BE, 0xBE, 0 },
+ { 0x00BF, 0xBF, 0 },
+ { 0x00D7, 0xAA, 0 },
+ { 0x00F7, 0xBA, 0 },
+ { 0x0192, 0x83, 0 },
+ { 0x02C6, 0x88, 0 },
+ { 0x02DC, 0x98, 0 },
+ { 0x200E, 0xFD, 0 },
+ { 0x200F, 0xFE, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AA, 0xA4, 0 },
+ { 0x20AC, 0x80, 0 },
+ { 0x2122, 0x99, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1255ByteCvtData =
+{
+ aImplMS1255ToUniTab,
+ NULL,
+ MS1255UNI_START, MS1255UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplMS1255ToCharTab,
+ NULL,
+ aImplMS1255ToCharTabEx,
+ MS1255CHAR_START, MS1255CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1255TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1255TextEncodingData
+ = { { &aImplMS1255ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 177,
+ "iso8859-8",
+ "windows-1255",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_MIME
+ | RTL_TEXTENCODING_INFO_R2L };
+ /* WIN, SCRIPT_HEBREW, pc code page 862, mac encoding 5 */
+
+/* ======================================================================= */
+
+/* MS-1256 */
+/* Windows Standard CharSet for Arabic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1256.txt from 01/5/99 Version 2.01 */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1256UNI_START 0x80
+#define MS1256UNI_END 0xFF
+static sal_uInt16 const aImplMS1256ToUniTab[MS1256UNI_END - MS1256UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, /* 0x80 */
+ 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, /* 0x90 */
+ 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, /* 0xB0 */
+ 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, /* 0xC0 */
+ 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, /* 0xC0 */
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, /* 0xD0 */
+ 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, /* 0xD0 */
+ 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, /* 0xF0 */
+ 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1256CHAR_START 0x061B
+#define MS1256CHAR_END 0x0652
+static sal_uChar const aImplMS1256ToCharTab[MS1256CHAR_END - MS1256CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBA, 0, 0, 0, 0xBF, /* 0x0610 */
+ 0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x0620 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x0620 */
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, /* 0x0630 */
+ 0xD9, 0xDA, 0xDB, 0, 0, 0, 0, 0, /* 0x0630 */
+ 0xDC, 0xDD, 0xDE, 0xDF, 0xE1, 0xE3, 0xE4, 0xE5, /* 0x0640 */
+ 0xE6, 0xEC, 0xED, 0xF0, 0xF1, 0xF2, 0xF3, 0xF5, /* 0x0640 */
+ 0xF6, 0xF8, 0xFA /* 0x0650 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1256TOCHARTABEX_COUNT 81
+static ImplUniCharTabData const aImplMS1256ToCharTabEx[MS1256TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A2, 0xA2, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A5, 0xA5, 0 },
+ { 0x00A6, 0xA6, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xAB, 0 },
+ { 0x00AC, 0xAC, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AE, 0xAE, 0 },
+ { 0x00AF, 0xAF, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B2, 0xB2, 0 },
+ { 0x00B3, 0xB3, 0 },
+ { 0x00B4, 0xB4, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xB6, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00B8, 0xB8, 0 },
+ { 0x00B9, 0xB9, 0 },
+ { 0x00BB, 0xBB, 0 },
+ { 0x00BC, 0xBC, 0 },
+ { 0x00BD, 0xBD, 0 },
+ { 0x00BE, 0xBE, 0 },
+ { 0x00D7, 0xD7, 0 },
+ { 0x00E0, 0xE0, 0 },
+ { 0x00E2, 0xE2, 0 },
+ { 0x00E7, 0xE7, 0 },
+ { 0x00E8, 0xE8, 0 },
+ { 0x00E9, 0xE9, 0 },
+ { 0x00EA, 0xEA, 0 },
+ { 0x00EB, 0xEB, 0 },
+ { 0x00EE, 0xEE, 0 },
+ { 0x00EF, 0xEF, 0 },
+ { 0x00F4, 0xF4, 0 },
+ { 0x00F7, 0xF7, 0 },
+ { 0x00F9, 0xF9, 0 },
+ { 0x00FB, 0xFB, 0 },
+ { 0x00FC, 0xFC, 0 },
+ { 0x0152, 0x8C, 0 },
+ { 0x0153, 0x9C, 0 },
+ { 0x0192, 0x83, 0 },
+ { 0x02C6, 0x88, 0 },
+ { 0x060C, 0xA1, 0 },
+ { 0x0679, 0x8A, 0 },
+ { 0x067E, 0x81, 0 },
+ { 0x0686, 0x8D, 0 },
+ { 0x0688, 0x8F, 0 },
+ { 0x0691, 0x9A, 0 },
+ { 0x0698, 0x8E, 0 },
+ { 0x06A9, 0x98, 0 },
+ { 0x06AF, 0x90, 0 },
+ { 0x06BA, 0x9F, 0 },
+ { 0x06BE, 0xAA, 0 },
+ { 0x06C1, 0xC0, 0 },
+ { 0x06D2, 0xFF, 0 },
+ { 0x200C, 0x9D, 0 },
+ { 0x200D, 0x9E, 0 },
+ { 0x200E, 0xFD, 0 },
+ { 0x200F, 0xFE, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AC, 0x80, 0 },
+ { 0x2122, 0x99, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1256ByteCvtData =
+{
+ aImplMS1256ToUniTab,
+ NULL,
+ MS1256UNI_START, MS1256UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplMS1256ToCharTab,
+ NULL,
+ aImplMS1256ToCharTabEx,
+ MS1256CHAR_START, MS1256CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1256TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1256TextEncodingData
+ = { { &aImplMS1256ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 178,
+ "iso8859-6",
+ "windows-1256",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_MIME
+ | RTL_TEXTENCODING_INFO_R2L };
+ /* WIN, SCRIPT_ARABIC, pc code page 864, mac encoding 4 */
+
+/* ======================================================================= */
+
+/* ISO-8859-6 */
+/* Unix Standard for Arabic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-6.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+/* !!! 0x30-0x39 sind Arabische Zahlen und muessten eigentlich nach 0x0660-0x0669 gemappt werden !!! */
+
+#define ISO88596UNI_START 0xA0
+#define ISO88596UNI_END 0xF2
+static sal_uInt16 const aImplISO88596ToUniTab[ISO88596UNI_END - ISO88596UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0, 0, 0, 0x00A4, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x060C, 0x00AD, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x061B, 0, 0, 0, 0x061F, /* 0xB0 */
+ 0, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, /* 0xC0 */
+ 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, /* 0xC0 */
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, /* 0xD0 */
+ 0x0638, 0x0639, 0x063A, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, /* 0xE0 */
+ 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, /* 0xE0 */
+ 0x0650, 0x0651, 0x0652 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88596CHAR_START 0x061B
+#define ISO88596CHAR_END 0x0669
+static sal_uChar const aImplISO88596ToCharTab[ISO88596CHAR_END - ISO88596CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBB, 0, 0, 0, 0xBF, /* 0x0610 */
+ 0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x0620 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x0620 */
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x0630 */
+ 0xD8, 0xD9, 0xDA, 0, 0, 0, 0, 0, /* 0x0630 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x0640 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x0640 */
+ 0xF0, 0xF1, 0xF2, 0, 0, 0, 0, 0, /* 0x0650 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0650 */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x0660 */
+ 0x38, 0x39 /* 0x0660 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88596TOCHARTABEX_COUNT 4
+static ImplUniCharTabData const aImplISO88596ToCharTabEx[ISO88596TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x060C, 0xAC, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88596ByteCvtData =
+{
+ aImplISO88596ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88596UNI_START, ISO88596UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplISO88596ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplISO88596ToCharTabEx,
+ ISO88596CHAR_START, ISO88596CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ ISO88596TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88596TextEncodingData
+ = { { &aImplISO88596ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 178,
+ "iso8859-6",
+ "ISO-8859-6",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_R2L
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_ARABIC, pc code page 864, mac encoding 4 */
+
+
+/* ======================================================================= */
+
+/* ISO-8859-8 */
+/* Unix Standard for Hebrew */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-8.txt from 2000-Jan-03 Version 1.1 (based on Unicode 3.0) */
+
+#define ISO88598UNI_START 0xA0
+#define ISO88598UNI_END 0xFE
+static sal_uInt16 const aImplISO88598ToUniTab[ISO88598UNI_END - ISO88598UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x2017, /* 0xD0 */
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, /* 0xE0 */
+ 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, /* 0xE0 */
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, /* 0xF0 */
+ 0x05E8, 0x05E9, 0x05EA, 0, 0, 0x200E, 0x200F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88598CHAR_START 0x05D0
+#define ISO88598CHAR_END 0x05EA
+static sal_uChar const aImplISO88598ToCharTab[ISO88598CHAR_END - ISO88598CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x05D0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x05D0 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x05E0 */
+ 0xF8, 0xF9, 0xFA /* 0x05E0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88598TOCHARTABEX_COUNT 33
+static ImplUniCharTabData const aImplISO88598ToCharTabEx[ISO88598TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A2, 0xA2, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A5, 0xA5, 0 },
+ { 0x00A6, 0xA6, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xAB, 0 },
+ { 0x00AC, 0xAC, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AE, 0xAE, 0 },
+ { 0x00AF, 0xAF, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B2, 0xB2, 0 },
+ { 0x00B3, 0xB3, 0 },
+ { 0x00B4, 0xB4, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xB6, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00B8, 0xB8, 0 },
+ { 0x00B9, 0xB9, 0 },
+ { 0x00BB, 0xBB, 0 },
+ { 0x00BC, 0xBC, 0 },
+ { 0x00BD, 0xBD, 0 },
+ { 0x00BE, 0xBE, 0 },
+ { 0x00D7, 0xAA, 0 },
+ { 0x00F7, 0xBA, 0 },
+ { 0x200E, 0xFD, 0 },
+ { 0x200F, 0xFE, 0 },
+ { 0x2017, 0xDF, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88598ByteCvtData =
+{
+ aImplISO88598ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88598UNI_START, ISO88598UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplISO88598ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplISO88598ToCharTabEx,
+ ISO88598CHAR_START, ISO88598CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ ISO88598TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88598TextEncodingData
+ = { { &aImplISO88598ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 177,
+ "iso8859-8",
+ "ISO-8859-8",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_R2L
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_HEBREW, pc code page 862, mac encoding 5 */
diff --git a/sal/textenc/tcvtbyte.c b/sal/textenc/tcvtbyte.c
new file mode 100644
index 000000000000..238c51fba223
--- /dev/null
+++ b/sal/textenc/tcvtbyte.c
@@ -0,0 +1,810 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "tenchelp.h"
+#include "rtl/textcvt.h"
+
+/* ======================================================================= */
+
+#define IMPL_MAX_REPLACECHAR 5
+
+sal_uInt16 ImplGetReplaceChar(sal_Unicode c);
+
+sal_uInt16 const * ImplGetReplaceString(sal_Unicode c);
+
+/* ----------------------------------------------------------------------- */
+
+typedef struct
+{
+ sal_uInt16 mnUniChar;
+ sal_uInt16 mnReplaceChar;
+} ImplReplaceCharData;
+
+static ImplReplaceCharData const aImplRepCharTab[] =
+{
+ { 0x00A0, 0x0020 }, /* NO-BREAK-SPACE */
+ { 0x00A1, 0x0021 }, /* INVERTED EXCLAMATION MARK */
+ { 0x00B7, 0x0045 }, /* MIDDLE DOT */
+ { 0x00BF, 0x003F }, /* INVERTED QUESTION MARK */
+ { 0x00D7, 0x002A }, /* MULTIPLIKATION SIGN */
+ { 0x00F7, 0x002F }, /* DIVISION SIGN */
+ { 0x2000, 0x0020 }, /* EN QUAD */
+ { 0x2001, 0x0020 }, /* EM QUAD */
+ { 0x2002, 0x0020 }, /* EN SPACE */
+ { 0x2003, 0x0020 }, /* EM SPACE */
+ { 0x2004, 0x0020 }, /* THREE-PER-EM SPACE */
+ { 0x2005, 0x0020 }, /* FOUR-PER-EM SPACE */
+ { 0x2006, 0x0020 }, /* SIX-PER-EM SPACE */
+ { 0x2007, 0x0020 }, /* FIGURE SPACE */
+ { 0x2008, 0x0020 }, /* PUNCTATION SPACE */
+ { 0x2009, 0x0020 }, /* THIN SPACE */
+ { 0x200A, 0x0020 }, /* HAIR SPACE */
+ { 0x2010, 0x002D }, /* HYPHEN */
+ { 0x2011, 0x002D }, /* NON-BREAKING HYPHEN */
+ { 0x2012, 0x002D }, /* FIGURE DASH */
+ { 0x2013, 0x002D }, /* EN DASH */
+ { 0x2014, 0x002D }, /* EM DASH */
+ { 0x2015, 0x002D }, /* HORIZONTAL BAR */
+ { 0x2018, 0x0027 }, /* LEFT SINGLE QUOTATION MARK */
+ { 0x2019, 0x0027 }, /* RIGHT SINGLE QUOTATION MARK */
+ { 0x201A, 0x002C }, /* SINGLE LOW-9 QUOTATION MARK */
+ { 0x201B, 0x0027 }, /* SINGLE HIGH-RESERVED-9 QUOTATION MARK */
+ { 0x201C, 0x0022 }, /* LEFT DOUBLE QUOTATION MARK */
+ { 0x201D, 0x0022 }, /* RIGHT DOUBLE QUOTATION MARK */
+ { 0x201E, 0x0022 }, /* DOUBLE LOW-9 QUOTATION MARK */
+ { 0x201F, 0x0022 }, /* DOUBLE HIGH-RESERVED-9 QUOTATION MARK */
+ { 0x2022, 0x002D }, /* BULLET */
+ { 0x2023, 0x002D }, /* TRIANGULAR BULLET */
+ { 0x2024, 0x002D }, /* ONE DOT LEADER */
+ { 0x2027, 0x002D }, /* HYPHENATION POINT */
+ { 0x2028, 0x000A }, /* LINE SEPARATOR */
+ { 0x2029, 0x000D }, /* PARAGRAPH SEPARATOR */
+ { 0x2032, 0x0027 }, /* PRIME */
+ { 0x2033, 0x0022 }, /* DOUBLE PRIME */
+ { 0x2035, 0x0027 }, /* RESERVED PRIME */
+ { 0x2036, 0x0022 }, /* RESERVED DOUBLE PRIME */
+ { 0x2039, 0x003C }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
+ { 0x203A, 0x003E }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
+ { 0x2043, 0x002D }, /* HYPHEN BULLET */
+ { 0x2044, 0x002F }, /* FRACTION SLASH */
+ { 0x2160, 0x0049 }, /* ROMAN NUMERAL ONE */
+ { 0x2164, 0x0056 }, /* ROMAN NUMERAL FIVE */
+ { 0x2169, 0x0058 }, /* ROMAN NUMERAL TEN */
+ { 0x216C, 0x004C }, /* ROMAN NUMERAL FIFTY */
+ { 0x216D, 0x0043 }, /* ROMAN NUMERAL ONE HUNDRED */
+ { 0x216E, 0x0044 }, /* ROMAN NUMERAL FIVE HUNDRED */
+ { 0x216F, 0x004D }, /* ROMAN NUMERAL ONE THOUSAND */
+ { 0x2170, 0x0069 }, /* SMALL ROMAN NUMERAL ONE */
+ { 0x2174, 0x0076 }, /* SMALL ROMAN NUMERAL FIVE */
+ { 0x2179, 0x0078 }, /* SMALL ROMAN NUMERAL TEN */
+ { 0x217C, 0x006C }, /* SMALL ROMAN NUMERAL FIFTY */
+ { 0x217D, 0x0063 }, /* SMALL ROMAN NUMERAL ONE HUNDRED */
+ { 0x217E, 0x0064 }, /* SMALL ROMAN NUMERAL FIVE HUNDRED */
+ { 0x217F, 0x006D }, /* SMALL ROMAN NUMERAL ONE THOUSAND */
+ { 0x2215, 0x002F }, /* DIVISION SLASH */
+ { 0x2217, 0x002A }, /* ASTERIX OPERATOR */
+ { 0xFF00, 0x0020 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF01, 0x0021 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF02, 0x0022 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF03, 0x0023 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF04, 0x0024 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF05, 0x0025 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF06, 0x0026 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF07, 0x0027 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF08, 0x0028 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF09, 0x0029 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF0A, 0x002A }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF0B, 0x002B }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF0C, 0x002C }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF0D, 0x002D }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF0E, 0x002E }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF0F, 0x002F }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF10, 0x0030 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF11, 0x0031 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF12, 0x0032 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF13, 0x0033 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF14, 0x0034 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF15, 0x0035 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF16, 0x0036 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF17, 0x0037 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF18, 0x0038 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF19, 0x0039 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF1A, 0x003A }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF1B, 0x003B }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF1C, 0x003C }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF1D, 0x003D }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF1E, 0x003E }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF1F, 0x003F }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF20, 0x0040 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF21, 0x0041 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF22, 0x0042 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF23, 0x0043 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF24, 0x0044 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF25, 0x0045 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF26, 0x0046 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF27, 0x0047 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF28, 0x0048 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF29, 0x0049 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF2A, 0x004A }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF2B, 0x004B }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF2C, 0x004C }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF2D, 0x004D }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF2E, 0x004E }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF2F, 0x004F }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF30, 0x0050 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF31, 0x0051 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF32, 0x0052 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF33, 0x0053 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF34, 0x0054 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF35, 0x0055 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF36, 0x0056 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF37, 0x0057 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF38, 0x0058 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF39, 0x0059 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF3A, 0x005A }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF3B, 0x005B }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF3C, 0x005C }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF3D, 0x005D }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF3E, 0x005E }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF3F, 0x005F }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF40, 0x0060 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF41, 0x0061 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF42, 0x0062 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF43, 0x0063 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF44, 0x0064 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF45, 0x0065 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF46, 0x0066 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF47, 0x0067 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF48, 0x0068 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF49, 0x0069 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF4A, 0x006A }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF4B, 0x006B }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF4C, 0x006C }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF4D, 0x006D }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF4E, 0x006E }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF4F, 0x006F }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF50, 0x0070 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF51, 0x0071 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF52, 0x0072 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF53, 0x0073 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF54, 0x0074 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF55, 0x0075 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF56, 0x0076 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF57, 0x0077 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF58, 0x0078 }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF59, 0x0079 }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF5A, 0x007A }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF5B, 0x007B }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF5C, 0x007C }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF5D, 0x007D }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF5E, 0x007E }, /* FULLWIDTH ASCII FORMS*/
+ { 0xFF5F, 0x007F }, /* FULLWIDTH ASCII FORMS */
+ { 0xFF61, 0x3002 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF62, 0x300C }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF63, 0x300D }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF64, 0x3001 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF65, 0x30FB }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF66, 0x30F2 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF67, 0x30A1 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF68, 0x30A3 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF69, 0x30A5 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF6A, 0x30A7 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF6B, 0x30A9 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF6C, 0x30E3 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF6D, 0x30E5 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF6E, 0x30E7 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF6F, 0x30C3 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF70, 0x30FC }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF71, 0x30A2 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF72, 0x30A4 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF73, 0x30A6 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF74, 0x30A8 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF75, 0x30AA }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF76, 0x30AB }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF77, 0x30AD }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF78, 0x30AF }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF79, 0x30B1 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF7A, 0x30B3 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF7B, 0x30B5 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF7C, 0x30B7 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF7D, 0x30B9 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF7E, 0x30BB }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF7F, 0x30BD }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF80, 0x30BF }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF81, 0x30C1 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF82, 0x30C4 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF83, 0x30C6 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF84, 0x30C8 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF85, 0x30CA }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF86, 0x30CB }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF87, 0x30CC }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF88, 0x30CD }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF89, 0x30CE }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF8A, 0x30CF }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF8B, 0x30D2 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF8C, 0x30D5 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF8D, 0x30D8 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF8E, 0x30DB }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF8F, 0x30DE }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF90, 0x30DF }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF91, 0x30E0 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF92, 0x30E1 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF93, 0x30E2 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF94, 0x30E4 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF95, 0x30E6 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF96, 0x30E8 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF97, 0x30E9 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF98, 0x30EA }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF99, 0x30EB }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF9A, 0x30EC }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF9B, 0x30ED }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF9C, 0x30EF }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF9D, 0x30F3 }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF9E, 0x309B }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFF9F, 0x309C }, /* HALFWIDTH KATAKANA FORMS */
+ { 0xFFA0, 0x3164 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA1, 0x3131 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA2, 0x3132 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA3, 0x3133 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA4, 0x3134 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA5, 0x3135 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA6, 0x3136 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA7, 0x3137 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA8, 0x3138 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFA9, 0x3139 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFAA, 0x313A }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFAB, 0x313B }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFAC, 0x313C }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFAD, 0x313D }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFAE, 0x313E }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFAF, 0x313F }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB0, 0x3140 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB1, 0x3141 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB2, 0x3142 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB3, 0x3143 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB4, 0x3144 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB5, 0x3145 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB6, 0x3146 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB7, 0x3147 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB8, 0x3148 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFB9, 0x3149 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFBA, 0x314A }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFBB, 0x314B }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFBC, 0x314C }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFBD, 0x314D }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFBE, 0x314E }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFC2, 0x314F }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFC3, 0x3150 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFC4, 0x3151 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFC5, 0x3152 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFC6, 0x3153 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFC7, 0x3154 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFCA, 0x3155 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFCB, 0x3156 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFCC, 0x3157 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFCD, 0x3158 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFCE, 0x3159 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFCF, 0x315A }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFD2, 0x315B }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFD3, 0x315C }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFD4, 0x315D }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFD5, 0x315E }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFD6, 0x315F }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFD7, 0x3160 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFDA, 0x3161 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFDB, 0x3162 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFDC, 0x3163 }, /* HALFWIDTH HANGUL FORMS */
+ { 0xFFE0, 0x00A2 }, /* FULLWIDTH CENT SIGN */
+ { 0xFFE1, 0x00A3 }, /* FULLWIDTH POUND SIGN */
+ { 0xFFE2, 0x00AC }, /* FULLWIDTH NOT SIGN */
+ { 0xFFE3, 0x00AF }, /* FULLWIDTH MACRON */
+ { 0xFFE4, 0x00A6 }, /* FULLWIDTH BROKEN BAR */
+ { 0xFFE5, 0x00A5 }, /* FULLWIDTH YEN SIGN */
+ { 0xFFE6, 0x20A9 }, /* FULLWIDTH WON SIGN */
+ { 0xFFE8, 0x2502 }, /* HALFWIDTH FORMS LIGHT VERTICAL */
+ { 0xFFE9, 0x2190 }, /* HALFWIDTH LEFTWARDS ARROW */
+ { 0xFFEA, 0x2191 }, /* HALFWIDTH UPWARDS ARROW */
+ { 0xFFEB, 0x2192 }, /* HALFWIDTH RIGHTWARDS ARROW */
+ { 0xFFEC, 0x2193 }, /* HALFWIDTH DOWNWARDS ARROW */
+ { 0xFFED, 0x25A0 }, /* HALFWIDTH BLACK SQUARE */
+ { 0xFFEE, 0x25CB }, /* HALFWIDTH WHITE CIRCLE */
+ { 0xFFFD, 0x003F } /* REPLACEMENT CHARACTER */
+};
+
+sal_uInt16 ImplGetReplaceChar( sal_Unicode c )
+{
+ sal_uInt16 nLow;
+ sal_uInt16 nHigh;
+ sal_uInt16 nMid;
+ sal_uInt16 nCompareChar;
+ const ImplReplaceCharData* pCharData;
+
+ nLow = 0;
+ nHigh = (sizeof( aImplRepCharTab )/sizeof( ImplReplaceCharData ))-1;
+ do
+ {
+ nMid = (nLow+nHigh)/2;
+ pCharData = aImplRepCharTab+nMid;
+ nCompareChar = pCharData->mnUniChar;
+ if ( c < nCompareChar )
+ {
+ if ( !nMid )
+ break;
+ nHigh = nMid-1;
+ }
+ else
+ {
+ if ( c > nCompareChar )
+ nLow = nMid+1;
+ else
+ return pCharData->mnReplaceChar;
+ }
+ }
+ while ( nLow <= nHigh );
+
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+typedef struct
+{
+ sal_uInt16 mnUniChar;
+ sal_uInt16 maReplaceChars[IMPL_MAX_REPLACECHAR];
+} ImplReplaceCharStrData;
+
+static ImplReplaceCharStrData const aImplRepCharStrTab[] =
+{
+ { 0x00A9, { 0x0028, 0x0063, 0x0029, 0x0000, 0x0000 } }, /* COPYRIGHT SIGN */
+ { 0x00AB, { 0x003C, 0x003C, 0x0000, 0x0000, 0x0000 } }, /* LEFT-POINTING-DOUBLE ANGLE QUOTATION MARK */
+ { 0x0AE0, { 0x0028, 0x0072, 0x0029, 0x0000, 0x0000 } }, /* REGISTERED SIGN */
+ { 0x00BB, { 0x003E, 0x003E, 0x0000, 0x0000, 0x0000 } }, /* RIGHT-POINTING-DOUBLE ANGLE QUOTATION MARK */
+ { 0x00BC, { 0x0031, 0x002F, 0x0034, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE QUARTER */
+ { 0x00BD, { 0x0031, 0x002F, 0x0032, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE HALF */
+ { 0x00BE, { 0x0033, 0x002F, 0x0034, 0x0000, 0x0000 } }, /* VULGAR FRACTION THREE QUARTERS */
+ { 0x00C6, { 0x0041, 0x0045, 0x0000, 0x0000, 0x0000 } }, /* LATIN CAPITAL LETTER AE */
+ { 0x00E6, { 0x0061, 0x0065, 0x0000, 0x0000, 0x0000 } }, /* LATIN SMALL LETTER AE */
+ { 0x0152, { 0x004F, 0x0045, 0x0000, 0x0000, 0x0000 } }, /* LATIN CAPITAL LIGATURE OE */
+ { 0x0153, { 0x006F, 0x0065, 0x0000, 0x0000, 0x0000 } }, /* LATIN SMALL LIGATURE OE */
+ { 0x2025, { 0x002E, 0x002E, 0x0000, 0x0000, 0x0000 } }, /* TWO DOT LEADER */
+ { 0x2026, { 0x002E, 0x002E, 0x002E, 0x0000, 0x0000 } }, /* HORIZONTAL ELLIPSES */
+ { 0x2034, { 0x0027, 0x0027, 0x0027, 0x0000, 0x0000 } }, /* TRIPPLE PRIME */
+ { 0x2037, { 0x0027, 0x0027, 0x0027, 0x0000, 0x0000 } }, /* RESERVED TRIPPLE PRIME */
+ { 0x20AC, { 0x0045, 0x0055, 0x0052, 0x0000, 0x0000 } }, /* EURO SIGN */
+ { 0x2122, { 0x0028, 0x0074, 0x006D, 0x0029, 0x0000 } }, /* TRADE MARK SIGN */
+ { 0x2153, { 0x0031, 0x002F, 0x0033, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE THIRD */
+ { 0x2154, { 0x0032, 0x002F, 0x0033, 0x0000, 0x0000 } }, /* VULGAR FRACTION TWO THIRD */
+ { 0x2155, { 0x0031, 0x002F, 0x0035, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE FIFTH */
+ { 0x2156, { 0x0032, 0x002F, 0x0035, 0x0000, 0x0000 } }, /* VULGAR FRACTION TWO FIFTH */
+ { 0x2157, { 0x0033, 0x002F, 0x0035, 0x0000, 0x0000 } }, /* VULGAR FRACTION THREE FIFTH */
+ { 0x2158, { 0x0034, 0x002F, 0x0035, 0x0000, 0x0000 } }, /* VULGAR FRACTION FOUR FIFTH */
+ { 0x2159, { 0x0031, 0x002F, 0x0036, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE SIXTH */
+ { 0x215A, { 0x0035, 0x002F, 0x0036, 0x0000, 0x0000 } }, /* VULGAR FRACTION FIVE SIXTH */
+ { 0x215B, { 0x0031, 0x002F, 0x0038, 0x0000, 0x0000 } }, /* VULGAR FRACTION ONE EIGHTH */
+ { 0x215C, { 0x0033, 0x002F, 0x0038, 0x0000, 0x0000 } }, /* VULGAR FRACTION THREE EIGHTH */
+ { 0x215D, { 0x0035, 0x002F, 0x0038, 0x0000, 0x0000 } }, /* VULGAR FRACTION FIVE EIGHTH */
+ { 0x215E, { 0x0037, 0x002F, 0x0038, 0x0000, 0x0000 } }, /* VULGAR FRACTION SEVEN EIGHTH */
+ { 0x215F, { 0x0031, 0x002F, 0x0000, 0x0000, 0x0000 } }, /* FRACTION NUMERATOR ONE */
+ { 0x2161, { 0x0049, 0x0049, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL TWO */
+ { 0x2162, { 0x0049, 0x0049, 0x0049, 0x0000, 0x0000 } }, /* ROMAN NUMERAL THREE */
+ { 0x2163, { 0x0049, 0x0056, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL FOUR */
+ { 0x2165, { 0x0056, 0x0049, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL SIX */
+ { 0x2166, { 0x0056, 0x0049, 0x0049, 0x0000, 0x0000 } }, /* ROMAN NUMERAL SEVEN */
+ { 0x2168, { 0x0056, 0x0049, 0x0049, 0x0049, 0x0000 } }, /* ROMAN NUMERAL EIGHT */
+ { 0x2169, { 0x0049, 0x0058, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL NINE */
+ { 0x216A, { 0x0058, 0x0049, 0x0000, 0x0000, 0x0000 } }, /* ROMAN NUMERAL ELEVEN */
+ { 0x216B, { 0x0058, 0x0049, 0x0049, 0x0000, 0x0000 } }, /* ROMAN NUMERAL TWELVE */
+ { 0x2171, { 0x0069, 0x0069, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL TWO */
+ { 0x2172, { 0x0069, 0x0069, 0x0069, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL THREE */
+ { 0x2173, { 0x0069, 0x0076, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL FOUR */
+ { 0x2175, { 0x0076, 0x0069, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL SIX */
+ { 0x2176, { 0x0076, 0x0069, 0x0069, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL SEVEN */
+ { 0x2178, { 0x0076, 0x0069, 0x0069, 0x0069, 0x0000 } }, /* SMALL ROMAN NUMERAL EIGHT */
+ { 0x2179, { 0x0069, 0x0078, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL NINE */
+ { 0x217A, { 0x0078, 0x0069, 0x0000, 0x0000, 0x0000 } }, /* SMALL ROMAN NUMERAL ELEVEN */
+ { 0x217B, { 0x0058, 0x0069, 0x0069, 0x0000, 0x0000 } } /* SMALL ROMAN NUMERAL TWELVE */
+};
+
+const sal_uInt16* ImplGetReplaceString( sal_Unicode c )
+{
+ sal_uInt16 nLow;
+ sal_uInt16 nHigh;
+ sal_uInt16 nMid;
+ sal_uInt16 nCompareChar;
+ const ImplReplaceCharStrData* pCharData;
+
+ nLow = 0;
+ nHigh = (sizeof( aImplRepCharStrTab )/sizeof( ImplReplaceCharStrData ))-1;
+ do
+ {
+ nMid = (nLow+nHigh)/2;
+ pCharData = aImplRepCharStrTab+nMid;
+ nCompareChar = pCharData->mnUniChar;
+ if ( c < nCompareChar )
+ {
+ if ( !nMid )
+ break;
+ nHigh = nMid-1;
+ }
+ else
+ {
+ if ( c > nCompareChar )
+ nLow = nMid+1;
+ else
+ return pCharData->maReplaceChars;
+ }
+ }
+ while ( nLow <= nHigh );
+
+ return 0;
+}
+
+/* ======================================================================= */
+
+sal_Size ImplSymbolToUnicode( const ImplTextConverterData* pData,
+ void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes )
+{
+ sal_uChar c;
+ sal_Unicode* pEndDestBuf;
+ const sal_Char* pEndSrcBuf;
+
+ (void) pData; /* unused */
+ (void) pContext; /* unused */
+ (void) nFlags; /* unused */
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestChars;
+ pEndSrcBuf = pSrcBuf+nSrcBytes;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ /* 0-31 (all Control-Character get the same Unicode value) */
+ c = (sal_uChar)*pSrcBuf;
+ if ( c <= 0x1F )
+ *pDestBuf = (sal_Unicode)c;
+ else
+ *pDestBuf = ((sal_Unicode)c)+0xF000;
+ pDestBuf++;
+ pSrcBuf++;
+ }
+
+ *pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf);
+ return (nDestChars - (pEndDestBuf-pDestBuf));
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size ImplUnicodeToSymbol( const ImplTextConverterData* pData,
+ void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars )
+{
+ sal_Unicode c;
+ sal_Char* pEndDestBuf;
+ const sal_Unicode* pEndSrcBuf;
+
+ (void) pContext; /* unused */
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestBytes;
+ pEndSrcBuf = pSrcBuf+nSrcChars;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ c = *pSrcBuf;
+ if ( (c >= 0xF000) && (c <= 0xF0FF) )
+ {
+ *pDestBuf = (sal_Char)(sal_uChar)(c-0xF000);
+ pDestBuf++;
+ pSrcBuf++;
+ }
+ // Normally 0x001F, but in many cases also symbol characters
+ // are stored in the first 256 bytes, so that we don't change
+ // these values
+ else if ( c <= 0x00FF )
+ {
+ *pDestBuf = (sal_Char)(sal_uChar)c;
+ pDestBuf++;
+ pSrcBuf++;
+ }
+ else
+ {
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE )
+ {
+ /* !!! */
+ /* Only ascii characters < 0x1F */
+ }
+
+ /* Handle undefined and surrogates characters */
+ /* (all surrogates characters are undefined) */
+ if (!ImplHandleUndefinedUnicodeToTextChar(pData,
+ &pSrcBuf,
+ pEndSrcBuf,
+ &pDestBuf,
+ pEndDestBuf,
+ nFlags,
+ pInfo))
+ break;
+ }
+ }
+
+ *pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf);
+ return (nDestBytes - (pEndDestBuf-pDestBuf));
+}
+
+/* ======================================================================= */
+
+sal_Size ImplCharToUnicode( const ImplTextConverterData* pData,
+ void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes )
+{
+ sal_uChar c;
+ sal_Unicode cConv;
+ const ImplByteConvertData* pConvertData = (const ImplByteConvertData*)pData;
+ sal_Unicode* pEndDestBuf;
+ const sal_Char* pEndSrcBuf;
+
+ (void) pContext; /* unused */
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestChars;
+ pEndSrcBuf = pSrcBuf+nSrcBytes;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ c = (sal_uChar)*pSrcBuf;
+ if ( c < 0x80 )
+ cConv = c;
+ else
+ {
+ if ( (c >= pConvertData->mnToUniStart1) && (c <= pConvertData->mnToUniEnd1) )
+ cConv = pConvertData->mpToUniTab1[c-pConvertData->mnToUniStart1];
+ else if ( (c >= pConvertData->mnToUniStart2) && (c <= pConvertData->mnToUniEnd2) )
+ cConv = pConvertData->mpToUniTab2[c-pConvertData->mnToUniStart2];
+ else
+ cConv = 0;
+ if ( !cConv )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_UNDEFINED;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_IGNORE )
+ {
+ pSrcBuf++;
+ continue;
+ }
+ else
+ cConv = ImplGetUndefinedUnicodeChar(c, nFlags);
+ }
+ }
+
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = cConv;
+ pDestBuf++;
+ pSrcBuf++;
+ }
+
+ *pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf);
+ return (nDestChars - (pEndDestBuf-pDestBuf));
+}
+
+/* ----------------------------------------------------------------------- */
+
+// Writes 0--2 characters to dest:
+static int ImplConvertUnicodeCharToChar(
+ const ImplByteConvertData* pConvertData, sal_Unicode c, sal_Char * dest )
+{
+ const ImplUniCharTabData* pToCharExTab;
+
+ if ( c < 0x80 )
+ {
+ dest[0] = (sal_Char)c;
+ return 1;
+ }
+ if ( (c >= pConvertData->mnToCharStart1) && (c <= pConvertData->mnToCharEnd1) )
+ {
+ dest[0] = (sal_Char)pConvertData->mpToCharTab1[c-pConvertData->mnToCharStart1];
+ if ( dest[0] != 0 )
+ return 1;
+ }
+ else if ( (c >= pConvertData->mnToCharStart2) && (c <= pConvertData->mnToCharEnd2) )
+ {
+ dest[0] = (sal_Char)pConvertData->mpToCharTab2[c-pConvertData->mnToCharStart2];
+ if ( dest[0] != 0 )
+ return 1;
+ }
+ pToCharExTab = pConvertData->mpToCharExTab;
+ if ( pToCharExTab )
+ {
+ sal_uInt16 nLow;
+ sal_uInt16 nHigh;
+ sal_uInt16 nMid;
+ sal_uInt16 nCompareChar;
+ const ImplUniCharTabData* pCharExData;
+
+ nLow = 0;
+ nHigh = pConvertData->mnToCharExCount-1;
+ do
+ {
+ nMid = (nLow+nHigh)/2;
+ pCharExData = pToCharExTab+nMid;
+ nCompareChar = pCharExData->mnUniChar;
+ if ( c < nCompareChar )
+ {
+ if ( !nMid )
+ break;
+ nHigh = nMid-1;
+ }
+ else
+ {
+ if ( c > nCompareChar )
+ nLow = nMid+1;
+ else
+ {
+ dest[0] = (sal_Char)pCharExData->mnChar;
+ if ( pCharExData->mnChar2 == 0 )
+ return 1;
+ else
+ {
+ dest[1] = (sal_Char)pCharExData->mnChar2;
+ return 2;
+ }
+ }
+ }
+ }
+ while ( nLow <= nHigh );
+ }
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size ImplUnicodeToChar( const ImplTextConverterData* pData,
+ void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars )
+{
+ sal_Unicode c;
+ const ImplByteConvertData* pConvertData = (const ImplByteConvertData*)pData;
+ sal_Char* pEndDestBuf;
+ const sal_Unicode* pEndSrcBuf;
+ int i;
+ int n;
+ sal_uInt16 cTemp;
+ sal_Char aTempBuf[IMPL_MAX_REPLACECHAR+2];
+ const sal_uInt16* pReplace;
+
+ (void) pContext; /* unused */
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestBytes;
+ pEndSrcBuf = pSrcBuf+nSrcChars;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ c = *pSrcBuf;
+ if ( c < 0x80 )
+ {
+ aTempBuf[0] = (sal_Char)c;
+ n = 1;
+ }
+ else
+ {
+ n = ImplConvertUnicodeCharToChar( pConvertData, c, aTempBuf );
+
+ if ( n == 0 )
+ {
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE )
+ {
+ cTemp = ImplGetReplaceChar( c );
+ if ( cTemp )
+ n = ImplConvertUnicodeCharToChar(
+ pConvertData, cTemp, aTempBuf );
+ }
+
+ if ( n == 0 )
+ {
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR )
+ {
+ pReplace = ImplGetReplaceString( c );
+ if ( pReplace )
+ {
+ while ( *pReplace && (n < IMPL_MAX_REPLACECHAR) )
+ {
+ i = ImplConvertUnicodeCharToChar(
+ pConvertData, *pReplace, aTempBuf + n );
+ if ( i == 0 )
+ {
+ n = 0;
+ break;
+ }
+ pReplace++;
+ n += i;
+ }
+ }
+ }
+
+ /* Handle undefined and surrogates characters */
+ /* (all surrogates characters are undefined) */
+ if ( n == 0 )
+ {
+ if (ImplHandleUndefinedUnicodeToTextChar(pData,
+ &pSrcBuf,
+ pEndSrcBuf,
+ &pDestBuf,
+ pEndDestBuf,
+ nFlags,
+ pInfo))
+ continue;
+ else
+ break;
+ }
+ }
+ }
+ }
+
+ if ( pEndDestBuf - pDestBuf < n )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ for ( i = 0; i < n; ++i )
+ *pDestBuf++ = aTempBuf[i];
+ pSrcBuf++;
+ }
+
+ *pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf);
+ return (nDestBytes - (pEndDestBuf-pDestBuf));
+}
diff --git a/sal/textenc/tcvteas1.tab b/sal/textenc/tcvteas1.tab
new file mode 100644
index 000000000000..252411b74c08
--- /dev/null
+++ b/sal/textenc/tcvteas1.tab
@@ -0,0 +1,436 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the tables for all 1 byte charsets, for the */
+/* following scripts: asia (Thai, Vietnamese) and other exotic scripts */
+
+/* ======================================================================= */
+
+/* MS-874 */
+/* Windows/Dos Standard CharSet for Thai */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp874.txt from 04/15/98 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS874UNI_START 0x80
+#define MS874UNI_END 0xFB
+static sal_uInt16 const aImplMS874ToUniTab[MS874UNI_END - MS874UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0, 0, 0, 0, 0x2026, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, /* 0xA0 */
+ 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, /* 0xA0 */
+ 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, /* 0xB0 */
+ 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, /* 0xB0 */
+ 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, /* 0xC0 */
+ 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, /* 0xC0 */
+ 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, /* 0xD0 */
+ 0x0E38, 0x0E39, 0x0E3A, 0, 0, 0, 0, 0x0E3F, /* 0xD0 */
+ 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, /* 0xE0 */
+ 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, /* 0xE0 */
+ 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, /* 0xF0 */
+ 0x0E58, 0x0E59, 0x0E5A, 0x0E5B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS874CHAR_START 0x0E01
+#define MS874CHAR_END 0x0E5B
+static sal_uChar const aImplMS874ToCharTab[MS874CHAR_END - MS874CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, /* 0x0E00 */
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, /* 0x0E00 */
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, /* 0x0E10 */
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, /* 0x0E10 */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x0E20 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x0E20 */
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x0E30 */
+ 0xD8, 0xD9, 0xDA, 0, 0, 0, 0, 0xDF, /* 0x0E30 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x0E40 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x0E40 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x0E50 */
+ 0xF8, 0xF9, 0xFA, 0xFB /* 0x0E50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS874TOCHARTABEX_COUNT 10
+static ImplUniCharTabData const aImplMS874ToCharTabEx[MS874TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x20AC, 0x80, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS874ByteCvtData =
+{
+ aImplMS874ToUniTab,
+ NULL,
+ MS874UNI_START, MS874UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplMS874ToCharTab,
+ NULL,
+ aImplMS874ToCharTabEx,
+ MS874CHAR_START, MS874CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS874TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS874TextEncodingData
+ = { { &aImplMS874ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 222,
+ "iso8859-1", /* TODO! correct? */
+ "windows-874",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* WIN/DOS/OS2, SCRIPT_THAI, pc code page 874, mac encoding 21 */
+
+/* ======================================================================= */
+
+/* TIS 620-2533
+ *
+ * A good source of information is <http://www.inet.co.th/cyberclub/trin/
+ * thairef/index.html> as of 18 Mar 2002.
+ *
+ * Single byte encoding, from which MS874 is derived (although it is the other
+ * way around in this implementation):
+ *
+ * 0x00--9F map to U+0000--009F
+ * 0xA0 is questionable (unassigned or U+00A0 NO BREAK SPACE), to ease
+ * implementation, it maps to U+00A0
+ * 0xA1--DA map to U+0E01--0E3A (TIS 620, same for MS874)
+ * 0xDB--DE are unassigned (TIS 620, same for MS874)
+ * 0xDF--FB map to U+0E3F--0E5B (TIS 620, same for MS874)
+ * 0xFC--FF are unassigned (TIS 620, same for MS874)
+ */
+
+static ImplByteConvertData const aImplTis620ByteCvtData =
+{
+ aImplMS874ToUniTab + (0xA0 - MS874UNI_START),
+ aImpl8090SameToUniTab,
+ 0xA0, MS874UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplMS874ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplMS874ToCharTabEx,
+ MS874CHAR_START, MS874CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ 1
+};
+
+static ImplTextEncodingData const aImplTis620TextEncodingData
+ = { { &aImplTis620ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 222,
+ "iso8859-1", /* TODO! correct? */
+ "TIS-620",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+
+/* ======================================================================= */
+
+/* MS-1258 */
+/* Windows Standard CharSet for Vietnamease */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1258.txt from 04/15/98 Version 2.01 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1258UNI_START 0x80
+#define MS1258UNI_END 0xFF
+static sal_uInt16 const aImplMS1258ToUniTab[MS1258UNI_END - MS1258UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0x02C6, 0x2030, 0, 0x2039, 0x0152, 0, 0, 0, /* 0x80 */
+ 0, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0x02DC, 0x2122, 0, 0x203A, 0x0153, 0, 0, 0x0178, /* 0x90 */
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* 0xB0 */
+ 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, /* 0xC0 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, /* 0xD0 */
+ 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1258CHAR_START 0x00A0
+#define MS1258CHAR_END 0x00FF
+static sal_uChar const aImplMS1258ToCharTab[MS1258CHAR_END - MS1258CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, /* 0x00A0 */
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, /* 0x00A0 */
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, /* 0x00B0 */
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, /* 0x00B0 */
+ 0xC0, 0xC1, 0xC2, 0, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x00C0 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0, 0xCD, 0xCE, 0xCF, /* 0x00C0 */
+ 0, 0xD1, 0, 0xD3, 0xD4, 0, 0xD6, 0xD7, /* 0x00D0 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0, 0, 0xDF, /* 0x00D0 */
+ 0xE0, 0xE1, 0xE2, 0, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x00E0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0, 0xED, 0xEE, 0xEF, /* 0x00E0 */
+ 0, 0xF1, 0, 0xF3, 0xF4, 0, 0xF6, 0xF7, /* 0x00F0 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0, 0, 0xFF /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* The list of Vietnamese-relevant precomposed Unicode characters that map to
+ MS1258 base + combining modifier are derived from the information present at
+ <http://vietunicode.sourceforge.net/charset/>: */
+#define MS1258TOCHARTABEX_COUNT 141
+static ImplUniCharTabData const aImplMS1258ToCharTabEx[MS1258TOCHARTABEX_COUNT] =
+{
+ { 0x00C3, 0x41, 0xDE },
+ { 0x00CC, 0x49, 0xCC },
+ { 0x00D2, 0x4F, 0xCC },
+ { 0x00D5, 0x4F, 0xDE },
+ { 0x00DD, 0x59, 0xEC },
+ { 0x00E3, 0x61, 0xDE },
+ { 0x00EC, 0x69, 0xCC },
+ { 0x00F2, 0x6F, 0xCC },
+ { 0x00F5, 0x6F, 0xDE },
+ { 0x00FD, 0x79, 0xCC },
+ { 0x0102, 0xC3, 0 },
+ { 0x0103, 0xE3, 0 },
+ { 0x0110, 0xD0, 0 },
+ { 0x0111, 0xF0, 0 },
+ { 0x0128, 0x49, 0xDE },
+ { 0x0129, 0x69, 0xDE },
+ { 0x0152, 0x8C, 0 },
+ { 0x0153, 0x9C, 0 },
+ { 0x0168, 0x55, 0xDE },
+ { 0x0169, 0x75, 0xDE },
+ { 0x0178, 0x9F, 0 },
+ { 0x0192, 0x83, 0 },
+ { 0x01A0, 0xD5, 0 },
+ { 0x01A1, 0xF5, 0 },
+ { 0x01AF, 0xDD, 0 },
+ { 0x01B0, 0xFD, 0 },
+ { 0x02C6, 0x88, 0 },
+ { 0x02DC, 0x98, 0 },
+ { 0x0300, 0xCC, 0 },
+ { 0x0301, 0xEC, 0 },
+ { 0x0303, 0xDE, 0 },
+ { 0x0309, 0xD2, 0 },
+ { 0x0323, 0xF2, 0 },
+ { 0x1EA0, 0x41, 0xF2 },
+ { 0x1EA1, 0x61, 0xF2 },
+ { 0x1EA2, 0x41, 0xD2 },
+ { 0x1EA3, 0x61, 0xD2 },
+ { 0x1EA4, 0xC2, 0xEC },
+ { 0x1EA5, 0xE2, 0xEC },
+ { 0x1EA6, 0xC2, 0xCC },
+ { 0x1EA7, 0xE2, 0xCC },
+ { 0x1EA8, 0xC2, 0xD2 },
+ { 0x1EA9, 0xE2, 0xD2 },
+ { 0x1EAA, 0xC2, 0xDE },
+ { 0x1EAB, 0xE2, 0xDE },
+ { 0x1EAC, 0xC2, 0xF2 },
+ { 0x1EAD, 0xE2, 0xF2 },
+ { 0x1EAE, 0xC3, 0xEC },
+ { 0x1EAF, 0xE3, 0xEC },
+ { 0x1EB0, 0xC3, 0xCC },
+ { 0x1EB1, 0xE3, 0xCC },
+ { 0x1EB2, 0xC3, 0xD2 },
+ { 0x1EB3, 0xE3, 0xD2 },
+ { 0x1EB4, 0xC3, 0xDE },
+ { 0x1EB5, 0xE3, 0xDE },
+ { 0x1EB6, 0xC3, 0xF2 },
+ { 0x1EB7, 0xE3, 0xF2 },
+ { 0x1EB8, 0x45, 0xF2 },
+ { 0x1EB9, 0x65, 0xF2 },
+ { 0x1EBA, 0x45, 0xD2 },
+ { 0x1EBB, 0x65, 0xD2 },
+ { 0x1EBC, 0x45, 0xDE },
+ { 0x1EBD, 0x65, 0xDE },
+ { 0x1EBE, 0xCA, 0xEC },
+ { 0x1EBF, 0xEA, 0xEC },
+ { 0x1EC0, 0xCA, 0xCC },
+ { 0x1EC1, 0xEA, 0xCC },
+ { 0x1EC2, 0xCA, 0xD2 },
+ { 0x1EC3, 0xEA, 0xD2 },
+ { 0x1EC4, 0xCA, 0xDE },
+ { 0x1EC5, 0xEA, 0xDE },
+ { 0x1EC6, 0xCA, 0xF2 },
+ { 0x1EC7, 0xEA, 0xF2 },
+ { 0x1EC8, 0x49, 0xD2 },
+ { 0x1EC9, 0x69, 0xD2 },
+ { 0x1ECA, 0x49, 0xF2 },
+ { 0x1ECB, 0x69, 0xF2 },
+ { 0x1ECC, 0x4F, 0xF2 },
+ { 0x1ECD, 0x6F, 0xF2 },
+ { 0x1ECE, 0x4F, 0xD2 },
+ { 0x1ECF, 0x6F, 0xD2 },
+ { 0x1ED0, 0xD4, 0xEC },
+ { 0x1ED1, 0xF4, 0xEC },
+ { 0x1ED2, 0xD4, 0xCC },
+ { 0x1ED3, 0xF4, 0xCC },
+ { 0x1ED4, 0xD4, 0xD2 },
+ { 0x1ED5, 0xF4, 0xD2 },
+ { 0x1ED6, 0xD4, 0xDE },
+ { 0x1ED7, 0xF4, 0xDE },
+ { 0x1ED8, 0xD4, 0xF2 },
+ { 0x1ED9, 0xF4, 0xF2 },
+ { 0x1EDA, 0xD5, 0xEC },
+ { 0x1EDB, 0xF5, 0xEC },
+ { 0x1EDC, 0xD5, 0xCC },
+ { 0x1EDD, 0xF5, 0xCC },
+ { 0x1EDE, 0xD5, 0xD2 },
+ { 0x1EDF, 0xF5, 0xD2 },
+ { 0x1EE0, 0xD5, 0xDE },
+ { 0x1EE1, 0xF5, 0xDE },
+ { 0x1EE2, 0xD5, 0xF2 },
+ { 0x1EE3, 0xF5, 0xF2 },
+ { 0x1EE4, 0x55, 0xF2 },
+ { 0x1EE5, 0x75, 0xF2 },
+ { 0x1EE6, 0x55, 0xD2 },
+ { 0x1EE7, 0x75, 0xD2 },
+ { 0x1EE8, 0xDD, 0xEC },
+ { 0x1EE9, 0xFD, 0xEC },
+ { 0x1EEA, 0xDD, 0xCC },
+ { 0x1EEB, 0xFD, 0xCC },
+ { 0x1EEC, 0xDD, 0xD2 },
+ { 0x1EED, 0xFD, 0xD2 },
+ { 0x1EEE, 0xDD, 0xDE },
+ { 0x1EEF, 0xFD, 0xDE },
+ { 0x1EF0, 0xDD, 0xF2 },
+ { 0x1EF1, 0xFD, 0xF2 },
+ { 0x1EF2, 0x59, 0xCC },
+ { 0x1EF3, 0x79, 0xCC },
+ { 0x1EF4, 0x59, 0xF2 },
+ { 0x1EF5, 0x79, 0xF2 },
+ { 0x1EF6, 0x59, 0xD2 },
+ { 0x1EF7, 0x79, 0xD2 },
+ { 0x1EF8, 0x59, 0xDE },
+ { 0x1EF9, 0x79, 0xDE },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AB, 0xFE, 0 },
+ { 0x20AC, 0x80, 0 },
+ { 0x2122, 0x99, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1258ByteCvtData =
+{
+ aImplMS1258ToUniTab,
+ NULL,
+ MS1258UNI_START, MS1258UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplMS1258ToCharTab,
+ NULL,
+ aImplMS1258ToCharTabEx,
+ MS1258CHAR_START, MS1258CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1258TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1258TextEncodingData
+ = { { &aImplMS1258ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 1,
+ 163,
+ "iso8859-1", /* TODO! correct? */
+ "windows-1258",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* WIN, SCRIPT_VIETNAMESE, mac encoding 30 */
diff --git a/sal/textenc/tcvtest1.tab b/sal/textenc/tcvtest1.tab
new file mode 100644
index 000000000000..b8424da74c44
--- /dev/null
+++ b/sal/textenc/tcvtest1.tab
@@ -0,0 +1,4584 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the tables for all 1 byte charsets, for the */
+/* following scripts: easteurope, cyrillic, greek, turkish */
+
+/* ======================================================================= */
+
+/* IBM-737 */
+/* Dos Standard CharSet for Greek */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp737.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM737UNI_START 0x80
+#define IBM737UNI_END 0xFF
+static sal_uInt16 const aImplIBM737ToUniTab[IBM737UNI_END - IBM737UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, /* 0x80 */
+ 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, /* 0x80 */
+ 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, /* 0x90 */
+ 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, /* 0x90 */
+ 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, /* 0xA0 */
+ 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* 0xB0 */
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, /* 0xC0 */
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, /* 0xD0 */
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, /* 0xE0 */
+ 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, /* 0xE0 */
+ 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM737CHAR_START 0x0386
+#define IBM737CHAR_END 0x03CE
+static sal_uChar const aImplIBM737ToCharTab[IBM737CHAR_END - IBM737CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEA, 0, /* 0x0380 */
+ 0xEB, 0xEC, 0xED, 0, 0xEE, 0, 0xEF, 0xF0, /* 0x0380 */
+ 0, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, /* 0x0390 */
+ 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, /* 0x0390 */
+ 0x8F, 0x90, 0, 0x91, 0x92, 0x93, 0x94, 0x95, /* 0x03A0 */
+ 0x96, 0x97, 0xF4, 0xF5, 0xE1, 0xE2, 0xE3, 0xE5, /* 0x03A0 */
+ 0, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, /* 0x03B0 */
+ 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, /* 0x03B0 */
+ 0xA7, 0xA8, 0xAA, 0xA9, 0xAB, 0xAC, 0xAD, 0xAE, /* 0x03C0 */
+ 0xAF, 0xE0, 0xE4, 0xE8, 0xE6, 0xE7, 0xE9 /* 0x03C0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM737TOCHARTABEX_COUNT 61
+static ImplUniCharTabData const aImplIBM737ToCharTabEx[IBM737TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xFF, 0 },
+ { 0x00B0, 0xF8, 0 },
+ { 0x00B1, 0xF1, 0 },
+ { 0x00B2, 0xFD, 0 },
+ { 0x00B7, 0xFA, 0 },
+ { 0x00F7, 0xF6, 0 },
+ { 0x207F, 0xFC, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x221A, 0xFB, 0 },
+ { 0x2248, 0xF7, 0 },
+ { 0x2264, 0xF3, 0 },
+ { 0x2265, 0xF2, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2552, 0xD5, 0 },
+ { 0x2553, 0xD6, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2555, 0xB8, 0 },
+ { 0x2556, 0xB7, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x2558, 0xD4, 0 },
+ { 0x2559, 0xD3, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255B, 0xBE, 0 },
+ { 0x255C, 0xBD, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x255E, 0xC6, 0 },
+ { 0x255F, 0xC7, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2561, 0xB5, 0 },
+ { 0x2562, 0xB6, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2564, 0xD1, 0 },
+ { 0x2565, 0xD2, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2567, 0xCF, 0 },
+ { 0x2568, 0xD0, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256A, 0xD8, 0 },
+ { 0x256B, 0xD7, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM737ByteCvtData =
+{
+ aImplIBM737ToUniTab,
+ NULL,
+ IBM737UNI_START, IBM737UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM737ToCharTab,
+ NULL,
+ aImplIBM737ToCharTabEx,
+ IBM737CHAR_START, IBM737CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM737TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM737TextEncodingData
+ = { { &aImplIBM737ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 161,
+ "iso8859-7",
+ "iso-8859-7",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* DOS/OS2, SCRIPT_GREEK, pc code page 737, mac encoding 6 */
+
+/* ======================================================================= */
+
+/* IBM-775 */
+/* Dos Standard CharSet for BalticRim */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp775.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM775UNI_START 0x80
+#define IBM775UNI_END 0xFF
+static sal_uInt16 const aImplIBM775ToUniTab[IBM775UNI_END - IBM775UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, /* 0x80 */
+ 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, /* 0x80 */
+ 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, /* 0x90 */
+ 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, /* 0x90 */
+ 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, /* 0xA0 */
+ 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, /* 0xB0 */
+ 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, /* 0xC0 */
+ 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, /* 0xD0 */
+ 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, /* 0xE0 */
+ 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, /* 0xE0 */
+ 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM775TOCHARTABEX_COUNT 128
+static ImplUniCharTabData const aImplIBM775ToCharTabEx[IBM775TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xFF, 0 },
+ { 0x00A2, 0x96, 0 },
+ { 0x00A3, 0x9C, 0 },
+ { 0x00A4, 0x9F, 0 },
+ { 0x00A6, 0xA7, 0 },
+ { 0x00A7, 0xF5, 0 },
+ { 0x00A9, 0xA8, 0 },
+ { 0x00AB, 0xAE, 0 },
+ { 0x00AC, 0xAA, 0 },
+ { 0x00AD, 0xF0, 0 },
+ { 0x00AE, 0xA9, 0 },
+ { 0x00B0, 0xF8, 0 },
+ { 0x00B1, 0xF1, 0 },
+ { 0x00B2, 0xFD, 0 },
+ { 0x00B3, 0xFC, 0 },
+ { 0x00B5, 0xE6, 0 },
+ { 0x00B6, 0xF4, 0 },
+ { 0x00B7, 0xFA, 0 },
+ { 0x00B9, 0xFB, 0 },
+ { 0x00BB, 0xAF, 0 },
+ { 0x00BC, 0xAC, 0 },
+ { 0x00BD, 0xAB, 0 },
+ { 0x00BE, 0xF3, 0 },
+ { 0x00C4, 0x8E, 0 },
+ { 0x00C5, 0x8F, 0 },
+ { 0x00C6, 0x92, 0 },
+ { 0x00C9, 0x90, 0 },
+ { 0x00D3, 0xE0, 0 },
+ { 0x00D5, 0xE5, 0 },
+ { 0x00D6, 0x99, 0 },
+ { 0x00D7, 0x9E, 0 },
+ { 0x00D8, 0x9D, 0 },
+ { 0x00DC, 0x9A, 0 },
+ { 0x00DF, 0xE1, 0 },
+ { 0x00E4, 0x84, 0 },
+ { 0x00E5, 0x86, 0 },
+ { 0x00E6, 0x91, 0 },
+ { 0x00E9, 0x82, 0 },
+ { 0x00F3, 0xA2, 0 },
+ { 0x00F5, 0xE4, 0 },
+ { 0x00F6, 0x94, 0 },
+ { 0x00F7, 0xF6, 0 },
+ { 0x00F8, 0x9B, 0 },
+ { 0x00FC, 0x81, 0 },
+ { 0x0100, 0xA0, 0 },
+ { 0x0101, 0x83, 0 },
+ { 0x0104, 0xB5, 0 },
+ { 0x0105, 0xD0, 0 },
+ { 0x0106, 0x80, 0 },
+ { 0x0107, 0x87, 0 },
+ { 0x010C, 0xB6, 0 },
+ { 0x010D, 0xD1, 0 },
+ { 0x0112, 0xED, 0 },
+ { 0x0113, 0x89, 0 },
+ { 0x0116, 0xB8, 0 },
+ { 0x0117, 0xD3, 0 },
+ { 0x0118, 0xB7, 0 },
+ { 0x0119, 0xD2, 0 },
+ { 0x0122, 0x95, 0 },
+ { 0x0123, 0x85, 0 },
+ { 0x012A, 0xA1, 0 },
+ { 0x012B, 0x8C, 0 },
+ { 0x012E, 0xBD, 0 },
+ { 0x012F, 0xD4, 0 },
+ { 0x0136, 0xE8, 0 },
+ { 0x0137, 0xE9, 0 },
+ { 0x013B, 0xEA, 0 },
+ { 0x013C, 0xEB, 0 },
+ { 0x0141, 0xAD, 0 },
+ { 0x0142, 0x88, 0 },
+ { 0x0143, 0xE3, 0 },
+ { 0x0144, 0xE7, 0 },
+ { 0x0145, 0xEE, 0 },
+ { 0x0146, 0xEC, 0 },
+ { 0x014C, 0xE2, 0 },
+ { 0x014D, 0x93, 0 },
+ { 0x0156, 0x8A, 0 },
+ { 0x0157, 0x8B, 0 },
+ { 0x015A, 0x97, 0 },
+ { 0x015B, 0x98, 0 },
+ { 0x0160, 0xBE, 0 },
+ { 0x0161, 0xD5, 0 },
+ { 0x016A, 0xC7, 0 },
+ { 0x016B, 0xD7, 0 },
+ { 0x0172, 0xC6, 0 },
+ { 0x0173, 0xD6, 0 },
+ { 0x0179, 0x8D, 0 },
+ { 0x017A, 0xA5, 0 },
+ { 0x017B, 0xA3, 0 },
+ { 0x017C, 0xA4, 0 },
+ { 0x017D, 0xCF, 0 },
+ { 0x017E, 0xD8, 0 },
+ { 0x2019, 0xEF, 0 },
+ { 0x201C, 0xF2, 0 },
+ { 0x201D, 0xA6, 0 },
+ { 0x201E, 0xF7, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM775ByteCvtData =
+{
+ aImplIBM775ToUniTab,
+ NULL,
+ IBM775UNI_START, IBM775UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ NULL,
+ NULL,
+ aImplIBM775ToCharTabEx,
+ NOTABCHAR_START, NOTABCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM775TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM775TextEncodingData
+ = { { &aImplIBM775ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 186,
+ "iso8859-4",
+ "iso-8859-4",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* DOS/OS2, SCRIPT_BALTIC, pc code page 775, mac encoding 29 (?) */
+
+/* ======================================================================= */
+
+/* IBM-852 */
+/* Dos Standard CharSet for Central Europa (Jug., Pol., Tsch., Ung., ...) */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp852.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM852UNI_START 0x80
+#define IBM852UNI_END 0xFF
+static sal_uInt16 const aImplIBM852ToUniTab[IBM852UNI_END - IBM852UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, /* 0x80 */
+ 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, /* 0x80 */
+ 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, /* 0x90 */
+ 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, /* 0x90 */
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, /* 0xA0 */
+ 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, /* 0xB0 */
+ 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, /* 0xC0 */
+ 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, /* 0xD0 */
+ 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, /* 0xD0 */
+ 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, /* 0xE0 */
+ 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, /* 0xE0 */
+ 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, /* 0xF0 */
+ 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM852TOCHARTABEX_COUNT 128
+static ImplUniCharTabData const aImplIBM852ToCharTabEx[IBM852TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xFF, 0 },
+ { 0x00A4, 0xCF, 0 },
+ { 0x00A7, 0xF5, 0 },
+ { 0x00A8, 0xF9, 0 },
+ { 0x00AB, 0xAE, 0 },
+ { 0x00AC, 0xAA, 0 },
+ { 0x00AD, 0xF0, 0 },
+ { 0x00B0, 0xF8, 0 },
+ { 0x00B4, 0xEF, 0 },
+ { 0x00B8, 0xF7, 0 },
+ { 0x00BB, 0xAF, 0 },
+ { 0x00C1, 0xB5, 0 },
+ { 0x00C2, 0xB6, 0 },
+ { 0x00C4, 0x8E, 0 },
+ { 0x00C7, 0x80, 0 },
+ { 0x00C9, 0x90, 0 },
+ { 0x00CB, 0xD3, 0 },
+ { 0x00CD, 0xD6, 0 },
+ { 0x00CE, 0xD7, 0 },
+ { 0x00D3, 0xE0, 0 },
+ { 0x00D4, 0xE2, 0 },
+ { 0x00D6, 0x99, 0 },
+ { 0x00D7, 0x9E, 0 },
+ { 0x00DA, 0xE9, 0 },
+ { 0x00DC, 0x9A, 0 },
+ { 0x00DD, 0xED, 0 },
+ { 0x00DF, 0xE1, 0 },
+ { 0x00E1, 0xA0, 0 },
+ { 0x00E2, 0x83, 0 },
+ { 0x00E4, 0x84, 0 },
+ { 0x00E7, 0x87, 0 },
+ { 0x00E9, 0x82, 0 },
+ { 0x00EB, 0x89, 0 },
+ { 0x00ED, 0xA1, 0 },
+ { 0x00EE, 0x8C, 0 },
+ { 0x00F3, 0xA2, 0 },
+ { 0x00F4, 0x93, 0 },
+ { 0x00F6, 0x94, 0 },
+ { 0x00F7, 0xF6, 0 },
+ { 0x00FA, 0xA3, 0 },
+ { 0x00FC, 0x81, 0 },
+ { 0x00FD, 0xEC, 0 },
+ { 0x0102, 0xC6, 0 },
+ { 0x0103, 0xC7, 0 },
+ { 0x0104, 0xA4, 0 },
+ { 0x0105, 0xA5, 0 },
+ { 0x0106, 0x8F, 0 },
+ { 0x0107, 0x86, 0 },
+ { 0x010C, 0xAC, 0 },
+ { 0x010D, 0x9F, 0 },
+ { 0x010E, 0xD2, 0 },
+ { 0x010F, 0xD4, 0 },
+ { 0x0110, 0xD1, 0 },
+ { 0x0111, 0xD0, 0 },
+ { 0x0118, 0xA8, 0 },
+ { 0x0119, 0xA9, 0 },
+ { 0x011A, 0xB7, 0 },
+ { 0x011B, 0xD8, 0 },
+ { 0x0139, 0x91, 0 },
+ { 0x013A, 0x92, 0 },
+ { 0x013D, 0x95, 0 },
+ { 0x013E, 0x96, 0 },
+ { 0x0141, 0x9D, 0 },
+ { 0x0142, 0x88, 0 },
+ { 0x0143, 0xE3, 0 },
+ { 0x0144, 0xE4, 0 },
+ { 0x0147, 0xD5, 0 },
+ { 0x0148, 0xE5, 0 },
+ { 0x0150, 0x8A, 0 },
+ { 0x0151, 0x8B, 0 },
+ { 0x0154, 0xE8, 0 },
+ { 0x0155, 0xEA, 0 },
+ { 0x0158, 0xFC, 0 },
+ { 0x0159, 0xFD, 0 },
+ { 0x015A, 0x97, 0 },
+ { 0x015B, 0x98, 0 },
+ { 0x015E, 0xB8, 0 },
+ { 0x015F, 0xAD, 0 },
+ { 0x0160, 0xE6, 0 },
+ { 0x0161, 0xE7, 0 },
+ { 0x0162, 0xDD, 0 },
+ { 0x0163, 0xEE, 0 },
+ { 0x0164, 0x9B, 0 },
+ { 0x0165, 0x9C, 0 },
+ { 0x016E, 0xDE, 0 },
+ { 0x016F, 0x85, 0 },
+ { 0x0170, 0xEB, 0 },
+ { 0x0171, 0xFB, 0 },
+ { 0x0179, 0x8D, 0 },
+ { 0x017A, 0xAB, 0 },
+ { 0x017B, 0xBD, 0 },
+ { 0x017C, 0xBE, 0 },
+ { 0x017D, 0xA6, 0 },
+ { 0x017E, 0xA7, 0 },
+ { 0x02C7, 0xF3, 0 },
+ { 0x02D8, 0xF4, 0 },
+ { 0x02D9, 0xFA, 0 },
+ { 0x02DB, 0xF2, 0 },
+ { 0x02DD, 0xF1, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM852ByteCvtData =
+{
+ aImplIBM852ToUniTab,
+ NULL,
+ IBM852UNI_START, IBM852UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ NULL,
+ NULL,
+ aImplIBM852ToCharTabEx,
+ NOTABCHAR_START, NOTABCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM852TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM852TextEncodingData
+ = { { &aImplIBM852ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 238,
+ "iso8859-2",
+ "ibm852",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* DOS/OS2, SCRIPT_EASTEUROPE, pc code page 852, mac encoding 29 */
+
+/* ======================================================================= */
+
+/* IBM-855 */
+/* Dos Standard CharSet for Cyrillic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp855.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM855UNI_START 0x80
+#define IBM855UNI_END 0xFF
+static sal_uInt16 const aImplIBM855ToUniTab[IBM855UNI_END - IBM855UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, /* 0x80 */
+ 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, /* 0x80 */
+ 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, /* 0x90 */
+ 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, /* 0x90 */
+ 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, /* 0xA0 */
+ 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, /* 0xB0 */
+ 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, /* 0xC0 */
+ 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, /* 0xD0 */
+ 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, /* 0xD0 */
+ 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, /* 0xE0 */
+ 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, /* 0xE0 */
+ 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, /* 0xF0 */
+ 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM855CHAR_START 0x0401
+#define IBM855CHAR_END 0x045F
+static sal_uChar const aImplIBM855ToCharTab[IBM855CHAR_END - IBM855CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x85, 0x81, 0x83, 0x87, 0x89, 0x8B, 0x8D, /* 0x0400 */
+ 0x8F, 0x91, 0x93, 0x95, 0x97, 0, 0x99, 0x9B, /* 0x0400 */
+ 0xA1, 0xA3, 0xEC, 0xAD, 0xA7, 0xA9, 0xEA, 0xF4, /* 0x0410 */
+ 0xB8, 0xBE, 0xC7, 0xD1, 0xD3, 0xD5, 0xD7, 0xDD, /* 0x0410 */
+ 0xE2, 0xE4, 0xE6, 0xE8, 0xAB, 0xB6, 0xA5, 0xFC, /* 0x0420 */
+ 0xF6, 0xFA, 0x9F, 0xF2, 0xEE, 0xF8, 0x9D, 0xE0, /* 0x0420 */
+ 0xA0, 0xA2, 0xEB, 0xAC, 0xA6, 0xA8, 0xE9, 0xF3, /* 0x0430 */
+ 0xB7, 0xBD, 0xC6, 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, /* 0x0430 */
+ 0xE1, 0xE3, 0xE5, 0xE7, 0xAA, 0xB5, 0xA4, 0xFB, /* 0x0440 */
+ 0xF5, 0xF9, 0x9E, 0xF1, 0xED, 0xF7, 0x9C, 0xDE, /* 0x0440 */
+ 0, 0x84, 0x80, 0x82, 0x86, 0x88, 0x8A, 0x8C, /* 0x0450 */
+ 0x8E, 0x90, 0x92, 0x94, 0x96, 0, 0x98, 0x9A, /* 0x0450 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM855TOCHARTABEX_COUNT 36
+static ImplUniCharTabData const aImplIBM855ToCharTabEx[IBM855TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xFF, 0 },
+ { 0x00A4, 0xCF, 0 },
+ { 0x00A7, 0xFD, 0 },
+ { 0x00AB, 0xAE, 0 },
+ { 0x00AD, 0xF0, 0 },
+ { 0x00BB, 0xAF, 0 },
+ { 0x2116, 0xEF, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM855ByteCvtData =
+{
+ aImplIBM855ToUniTab,
+ NULL,
+ IBM855UNI_START, IBM855UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM855ToCharTab,
+ NULL,
+ aImplIBM855ToCharTabEx,
+ IBM855CHAR_START, IBM855CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM855TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM855TextEncodingData
+ = { { &aImplIBM855ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "iso8859-5",
+ "iso-8859-5",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* DOS/OS2, SCRIPT_CYRILLIC, pc code page 855, mac encoding 7 */
+
+/* ======================================================================= */
+
+/* IBM-857 */
+/* Dos Standard CharSet for Turkish */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp857.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM857UNI_START 0x80
+#define IBM857UNI_END 0xFF
+static sal_uInt16 const aImplIBM857ToUniTab[IBM857UNI_END - IBM857UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, /* 0x80 */
+ 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, /* 0x90 */
+ 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, /* 0x90 */
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, /* 0xA0 */
+ 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, /* 0xB0 */
+ 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, /* 0xC0 */
+ 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0, 0x00CD, 0x00CE, /* 0xD0 */
+ 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, /* 0xD0 */
+ 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0, /* 0xE0 */
+ 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, /* 0xE0 */
+ 0x00AD, 0x00B1, 0, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, /* 0xF0 */
+ 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM857CHAR_START 0x00A0
+#define IBM857CHAR_END 0x00FF
+static sal_uChar const aImplIBM857ToCharTab[IBM857CHAR_END - IBM857CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF, 0xAD, 0xBD, 0x9C, 0xCF, 0xBE, 0xDD, 0xF5, /* 0x00A0 */
+ 0xF9, 0xB8, 0xD1, 0xAE, 0xAA, 0xF0, 0xA9, 0xEE, /* 0x00A0 */
+ 0xF8, 0xF1, 0xFD, 0xFC, 0xEF, 0xE6, 0xF4, 0xFA, /* 0x00B0 */
+ 0xF7, 0xFB, 0xD0, 0xAF, 0xAC, 0xAB, 0xF3, 0xA8, /* 0x00B0 */
+ 0xB7, 0xB5, 0xB6, 0xC7, 0x8E, 0x8F, 0x92, 0x80, /* 0x00C0 */
+ 0xD4, 0x90, 0xD2, 0xD3, 0xDE, 0xD6, 0xD7, 0xD8, /* 0x00C0 */
+ 0, 0xA5, 0xE3, 0xE0, 0xE2, 0xE5, 0x99, 0xE8, /* 0x00D0 */
+ 0x9D, 0xEB, 0xE9, 0xEA, 0x9A, 0, 0, 0xE1, /* 0x00D0 */
+ 0x85, 0xA0, 0x83, 0xC6, 0x84, 0x86, 0x91, 0x87, /* 0x00E0 */
+ 0x8A, 0x82, 0x88, 0x89, 0xEC, 0xA1, 0x8C, 0x8B, /* 0x00E0 */
+ 0, 0xA4, 0x95, 0xA2, 0x93, 0xE4, 0x94, 0xF6, /* 0x00F0 */
+ 0x9B, 0x97, 0xA3, 0x96, 0x81, 0, 0, 0xED /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM857TOCHARTABEX_COUNT 35
+static ImplUniCharTabData const aImplIBM857ToCharTabEx[IBM857TOCHARTABEX_COUNT] =
+{
+ { 0x011E, 0xA6, 0 },
+ { 0x011F, 0xA7, 0 },
+ { 0x0130, 0x98, 0 },
+ { 0x0131, 0x8D, 0 },
+ { 0x015E, 0x9E, 0 },
+ { 0x015F, 0x9F, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM857ByteCvtData =
+{
+ aImplIBM857ToUniTab,
+ NULL,
+ IBM857UNI_START, IBM857UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM857ToCharTab,
+ NULL,
+ aImplIBM857ToCharTabEx,
+ IBM857CHAR_START, IBM857CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM857TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM857TextEncodingData
+ = { { &aImplIBM857ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 162,
+ "iso8859-9",
+ "iso-8859-9",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* DOS/OS2, SCRIPT_TURKISH, pc code page 857, mac encoding 35 */
+
+/* ======================================================================= */
+
+/* IBM-866 */
+/* Dos Standard CharSet for CyrillicRussian */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp866.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM866UNI_START 0x80
+#define IBM866UNI_END 0xFF
+static sal_uInt16 const aImplIBM866ToUniTab[IBM866UNI_END - IBM866UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, /* 0x80 */
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, /* 0x80 */
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* 0x90 */
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, /* 0x90 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, /* 0xA0 */
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* 0xB0 */
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, /* 0xC0 */
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, /* 0xD0 */
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, /* 0xE0 */
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, /* 0xE0 */
+ 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM866CHAR_START 0x0401
+#define IBM866CHAR_END 0x045E
+static sal_uChar const aImplIBM866ToCharTab[IBM866CHAR_END - IBM866CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0, 0, 0, 0xF2, 0, 0, 0xF4, /* 0x0400 */
+ 0, 0, 0, 0, 0, 0, 0xF6, 0, /* 0x0400 */
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x0410 */
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, /* 0x0410 */
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x0420 */
+ 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, /* 0x0420 */
+ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, /* 0x0430 */
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, /* 0x0430 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x0440 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x0440 */
+ 0, 0xF1, 0, 0, 0xF3, 0, 0, 0xF5, /* 0x0450 */
+ 0, 0, 0, 0, 0, 0, 0xF7 /* 0x0450 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM866TOCHARTABEX_COUNT 56
+static ImplUniCharTabData const aImplIBM866ToCharTabEx[IBM866TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xFF, 0 },
+ { 0x00A4, 0xFD, 0 },
+ { 0x00B0, 0xF8, 0 },
+ { 0x00B7, 0xFA, 0 },
+ { 0x2116, 0xFC, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x221A, 0xFB, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2552, 0xD5, 0 },
+ { 0x2553, 0xD6, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2555, 0xB8, 0 },
+ { 0x2556, 0xB7, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x2558, 0xD4, 0 },
+ { 0x2559, 0xD3, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255B, 0xBE, 0 },
+ { 0x255C, 0xBD, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x255E, 0xC6, 0 },
+ { 0x255F, 0xC7, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2561, 0xB5, 0 },
+ { 0x2562, 0xB6, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2564, 0xD1, 0 },
+ { 0x2565, 0xD2, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2567, 0xCF, 0 },
+ { 0x2568, 0xD0, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256A, 0xD8, 0 },
+ { 0x256B, 0xD7, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM866ByteCvtData =
+{
+ aImplIBM866ToUniTab,
+ NULL,
+ IBM866UNI_START, IBM866UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM866ToCharTab,
+ NULL,
+ aImplIBM866ToCharTabEx,
+ IBM866CHAR_START, IBM866CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM866TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM866TextEncodingData
+ = { { &aImplIBM866ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "iso8859-5",
+ "cp866",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* DOS/OS2, SCRIPT_LATIN, pc code page 866, mac encoding 7 */
+
+/* ======================================================================= */
+
+/* IBM-869 */
+/* Dos Standard CharSet for Greek2 */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp869.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM869UNI_START 0x86
+#define IBM869UNI_END 0xFF
+static sal_uInt16 const aImplIBM869ToUniTab[IBM869UNI_END - IBM869UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0386, 0, /* 0x80 */
+ 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, /* 0x80 */
+ 0x038A, 0x03AA, 0x038C, 0, 0, 0x038E, 0x03AB, 0x00A9, /* 0x90 */
+ 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, /* 0x90 */
+ 0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, /* 0xA0 */
+ 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, /* 0xB0 */
+ 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x03A0, 0x03A1, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, /* 0xC0 */
+ 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, /* 0xD0 */
+ 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, /* 0xD0 */
+ 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, /* 0xE0 */
+ 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, /* 0xE0 */
+ 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, /* 0xF0 */
+ 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM869CHAR_START 0x0384
+#define IBM869CHAR_END 0x03CE
+static sal_uChar const aImplIBM869ToCharTab[IBM869CHAR_END - IBM869CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEF, 0xF7, 0x86, 0, /* 0x0380 */
+ 0x8D, 0x8F, 0x90, 0, 0x92, 0, 0x95, 0x98, /* 0x0380 */
+ 0xA1, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, /* 0x0390 */
+ 0xAC, 0xAD, 0xB5, 0xB6, 0xB7, 0xB8, 0xBD, 0xBE, /* 0x0390 */
+ 0xC6, 0xC7, 0, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, /* 0x03A0 */
+ 0xD4, 0xD5, 0x91, 0x96, 0x9B, 0x9D, 0x9E, 0x9F, /* 0x03A0 */
+ 0xFC, 0xD6, 0xD7, 0xD8, 0xDD, 0xDE, 0xE0, 0xE1, /* 0x03B0 */
+ 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, /* 0x03B0 */
+ 0xEA, 0xEB, 0xED, 0xEC, 0xEE, 0xF2, 0xF3, 0xF4, /* 0x03C0 */
+ 0xF6, 0xFA, 0xA0, 0xFB, 0xA2, 0xA3, 0xFD /* 0x03C0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM869TOCHARTABEX_COUNT 48
+static ImplUniCharTabData const aImplIBM869ToCharTabEx[IBM869TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xFF, 0 },
+ { 0x00A3, 0x9C, 0 },
+ { 0x00A6, 0x8A, 0 },
+ { 0x00A7, 0xF5, 0 },
+ { 0x00A8, 0xF9, 0 },
+ { 0x00A9, 0x97, 0 },
+ { 0x00AB, 0xAE, 0 },
+ { 0x00AC, 0x89, 0 },
+ { 0x00AD, 0xF0, 0 },
+ { 0x00B0, 0xF8, 0 },
+ { 0x00B1, 0xF1, 0 },
+ { 0x00B2, 0x99, 0 },
+ { 0x00B3, 0x9A, 0 },
+ { 0x00B7, 0x88, 0 },
+ { 0x00BB, 0xAF, 0 },
+ { 0x00BD, 0xAB, 0 },
+ { 0x2015, 0x8E, 0 },
+ { 0x2018, 0x8B, 0 },
+ { 0x2019, 0x8C, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM869ByteCvtData =
+{
+ aImplIBM869ToUniTab,
+ NULL,
+ IBM869UNI_START, IBM869UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM869ToCharTab,
+ NULL,
+ aImplIBM869ToCharTabEx,
+ IBM869CHAR_START, IBM869CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM869TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM869TextEncodingData
+ = { { &aImplIBM869ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 161,
+ "iso8859-7",
+ "iso-8859-7",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* DOS/OS2, SCRIPT_LATIN, pc code page 869, mac encoding 6 */
+
+/* ======================================================================= */
+
+/* MS-1250 */
+/* Windows CodePage for Eastern European (WinLatin2) */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1250.txt from 04/15/98 Version 2.01 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1250UNI_START 0x80
+#define MS1250UNI_END 0xFF
+static sal_uInt16 const aImplMS1250ToUniTab[MS1250UNI_END - MS1250UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0, 0x201A, 0, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, /* 0x80 */
+ 0, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, /* 0x90 */
+ 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, /* 0xB0 */
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, /* 0xC0 */
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, /* 0xC0 */
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, /* 0xD0 */
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, /* 0xE0 */
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, /* 0xE0 */
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1250TOCHARTABEX_COUNT 123
+static ImplUniCharTabData const aImplMS1250ToCharTabEx[MS1250TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A6, 0xA6, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xAB, 0 },
+ { 0x00AC, 0xAC, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AE, 0xAE, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B4, 0xB4, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xB6, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00B8, 0xB8, 0 },
+ { 0x00BB, 0xBB, 0 },
+ { 0x00C1, 0xC1, 0 },
+ { 0x00C2, 0xC2, 0 },
+ { 0x00C4, 0xC4, 0 },
+ { 0x00C7, 0xC7, 0 },
+ { 0x00C9, 0xC9, 0 },
+ { 0x00CB, 0xCB, 0 },
+ { 0x00CD, 0xCD, 0 },
+ { 0x00CE, 0xCE, 0 },
+ { 0x00D3, 0xD3, 0 },
+ { 0x00D4, 0xD4, 0 },
+ { 0x00D6, 0xD6, 0 },
+ { 0x00D7, 0xD7, 0 },
+ { 0x00DA, 0xDA, 0 },
+ { 0x00DC, 0xDC, 0 },
+ { 0x00DD, 0xDD, 0 },
+ { 0x00DF, 0xDF, 0 },
+ { 0x00E1, 0xE1, 0 },
+ { 0x00E2, 0xE2, 0 },
+ { 0x00E4, 0xE4, 0 },
+ { 0x00E7, 0xE7, 0 },
+ { 0x00E9, 0xE9, 0 },
+ { 0x00EB, 0xEB, 0 },
+ { 0x00ED, 0xED, 0 },
+ { 0x00EE, 0xEE, 0 },
+ { 0x00F3, 0xF3, 0 },
+ { 0x00F4, 0xF4, 0 },
+ { 0x00F6, 0xF6, 0 },
+ { 0x00F7, 0xF7, 0 },
+ { 0x00FA, 0xFA, 0 },
+ { 0x00FC, 0xFC, 0 },
+ { 0x00FD, 0xFD, 0 },
+ { 0x0102, 0xC3, 0 },
+ { 0x0103, 0xE3, 0 },
+ { 0x0104, 0xA5, 0 },
+ { 0x0105, 0xB9, 0 },
+ { 0x0106, 0xC6, 0 },
+ { 0x0107, 0xE6, 0 },
+ { 0x010C, 0xC8, 0 },
+ { 0x010D, 0xE8, 0 },
+ { 0x010E, 0xCF, 0 },
+ { 0x010F, 0xEF, 0 },
+ { 0x0110, 0xD0, 0 },
+ { 0x0111, 0xF0, 0 },
+ { 0x0118, 0xCA, 0 },
+ { 0x0119, 0xEA, 0 },
+ { 0x011A, 0xCC, 0 },
+ { 0x011B, 0xEC, 0 },
+ { 0x0139, 0xC5, 0 },
+ { 0x013A, 0xE5, 0 },
+ { 0x013D, 0xBC, 0 },
+ { 0x013E, 0xBE, 0 },
+ { 0x0141, 0xA3, 0 },
+ { 0x0142, 0xB3, 0 },
+ { 0x0143, 0xD1, 0 },
+ { 0x0144, 0xF1, 0 },
+ { 0x0147, 0xD2, 0 },
+ { 0x0148, 0xF2, 0 },
+ { 0x0150, 0xD5, 0 },
+ { 0x0151, 0xF5, 0 },
+ { 0x0154, 0xC0, 0 },
+ { 0x0155, 0xE0, 0 },
+ { 0x0158, 0xD8, 0 },
+ { 0x0159, 0xF8, 0 },
+ { 0x015A, 0x8C, 0 },
+ { 0x015B, 0x9C, 0 },
+ { 0x015E, 0xAA, 0 },
+ { 0x015F, 0xBA, 0 },
+ { 0x0160, 0x8A, 0 },
+ { 0x0161, 0x9A, 0 },
+ { 0x0162, 0xDE, 0 },
+ { 0x0163, 0xFE, 0 },
+ { 0x0164, 0x8D, 0 },
+ { 0x0165, 0x9D, 0 },
+ { 0x016E, 0xD9, 0 },
+ { 0x016F, 0xF9, 0 },
+ { 0x0170, 0xDB, 0 },
+ { 0x0171, 0xFB, 0 },
+ { 0x0179, 0x8F, 0 },
+ { 0x017A, 0x9F, 0 },
+ { 0x017B, 0xAF, 0 },
+ { 0x017C, 0xBF, 0 },
+ { 0x017D, 0x8E, 0 },
+ { 0x017E, 0x9E, 0 },
+ { 0x02C7, 0xA1, 0 },
+ { 0x02D8, 0xA2, 0 },
+ { 0x02D9, 0xFF, 0 },
+ { 0x02DB, 0xB2, 0 },
+ { 0x02DD, 0xBD, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AC, 0x80, 0 },
+ { 0x2122, 0x99, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1250ByteCvtData =
+{
+ aImplMS1250ToUniTab,
+ NULL,
+ MS1250UNI_START, MS1250UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ NULL,
+ NULL,
+ aImplMS1250ToCharTabEx,
+ NOTABCHAR_START, NOTABCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1250TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1250TextEncodingData
+ = { { &aImplMS1250ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 238,
+ "iso8859-2",
+ "windows-1250",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* WIN, SCRIPT_EASTEUROPE, pc code page 852, mac encoding 29 */
+
+/* ======================================================================= */
+
+/* MS-1251 */
+/* Windows CodePage for Cyrillic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1251.txt from 04/15/98 Version 2.01 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1251UNI_START 0x80
+#define MS1251UNI_END 0xFF
+static sal_uInt16 const aImplMS1251ToUniTab[MS1251UNI_END - MS1251UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, /* 0x80 */
+ 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, /* 0x90 */
+ 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, /* 0xB0 */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, /* 0xC0 */
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, /* 0xC0 */
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* 0xD0 */
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, /* 0xD0 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, /* 0xE0 */
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 0xE0 */
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, /* 0xF0 */
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1251CHAR_START 0x0401
+#define MS1251CHAR_END 0x045F
+static sal_uChar const aImplMS1251ToCharTab[MS1251CHAR_END - MS1251CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA8, 0x80, 0x81, 0xAA, 0xBD, 0xB2, 0xAF, /* 0x0400 */
+ 0xA3, 0x8A, 0x8C, 0x8E, 0x8D, 0, 0xA1, 0x8F, /* 0x0400 */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x0410 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x0410 */
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x0420 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, /* 0x0420 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x0430 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x0430 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x0440 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, /* 0x0440 */
+ 0, 0xB8, 0x90, 0x83, 0xBA, 0xBE, 0xB3, 0xBF, /* 0x0450 */
+ 0xBC, 0x9A, 0x9C, 0x9E, 0x9D, 0, 0xA2, 0x9F /* 0x0450 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1251TOCHARTABEX_COUNT 35
+static ImplUniCharTabData const aImplMS1251ToCharTabEx[MS1251TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A6, 0xA6, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xAB, 0 },
+ { 0x00AC, 0xAC, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AE, 0xAE, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xB6, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00BB, 0xBB, 0 },
+ { 0x0490, 0xA5, 0 },
+ { 0x0491, 0xB4, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AC, 0x88, 0 },
+ { 0x2116, 0xB9, 0 },
+ { 0x2122, 0x99, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1251ByteCvtData =
+{
+ aImplMS1251ToUniTab,
+ NULL,
+ MS1251UNI_START, MS1251UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplMS1251ToCharTab,
+ NULL,
+ aImplMS1251ToCharTabEx,
+ MS1251CHAR_START, MS1251CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1251TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1251TextEncodingData
+ = { { &aImplMS1251ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "iso8859-5",
+ "windows-1251",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* WIN, SCRIPT_CYRILLIC, pc code page 866 (855?), mac encoding 7 */
+
+/* ======================================================================= */
+
+/* MS-1253 */
+/* Windows Standard CharSet for Greek */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1253.txt from 04/15/98 Version 2.01 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1253UNI_START 0x80
+#define MS1253UNI_END 0xFF
+static sal_uInt16 const aImplMS1253ToUniTab[MS1253UNI_END - MS1253UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0, 0x2030, 0, 0x2039, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0, 0x2122, 0, 0x203A, 0, 0, 0, 0, /* 0x90 */
+ 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, /* 0xB0 */
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0xC0 */
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, /* 0xC0 */
+ 0x03A0, 0x03A1, 0, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, /* 0xD0 */
+ 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, /* 0xD0 */
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, /* 0xE0 */
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* 0xE0 */
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, /* 0xF0 */
+ 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1253CHAR_START 0x0384
+#define MS1253CHAR_END 0x03CE
+static sal_uChar const aImplMS1253ToCharTab[MS1253CHAR_END - MS1253CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB4, 0xA1, 0xA2, 0, /* 0x0380 */
+ 0xB8, 0xB9, 0xBA, 0, 0xBC, 0, 0xBE, 0xBF, /* 0x0380 */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x0390 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x0390 */
+ 0xD0, 0xD1, 0, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x03A0 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, /* 0x03A0 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x03B0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x03B0 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x03C0 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE /* 0x03C0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1253TOCHARTABEX_COUNT 40
+static ImplUniCharTabData const aImplMS1253ToCharTabEx[MS1253TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A5, 0xA5, 0 },
+ { 0x00A6, 0xA6, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xAB, 0 },
+ { 0x00AC, 0xAC, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AE, 0xAE, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B2, 0xB2, 0 },
+ { 0x00B3, 0xB3, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xB6, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00BB, 0xBB, 0 },
+ { 0x00BD, 0xBD, 0 },
+ { 0x0192, 0x83, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2015, 0xAF, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AC, 0x80, 0 },
+ { 0x2122, 0x99, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1253ByteCvtData =
+{
+ aImplMS1253ToUniTab,
+ NULL,
+ MS1253UNI_START, MS1253UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplMS1253ToCharTab,
+ NULL,
+ aImplMS1253ToCharTabEx,
+ MS1253CHAR_START, MS1253CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1253TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1253TextEncodingData
+ = { { &aImplMS1253ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 161,
+ "iso8859-7",
+ "windows-1253",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* WIN, SCRIPT_GREEK, pc code page 869, mac encoding 6 */
+
+/* ======================================================================= */
+
+/* MS-1254 */
+/* Windows Standard CharSet for Turkish */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1254.txt from 04/15/98 Version 2.01 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1254UNI_START 0x80
+#define MS1254UNI_END 0xFF
+static sal_uInt16 const aImplMS1254ToUniTab[MS1254UNI_END - MS1254UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0, 0, 0, /* 0x80 */
+ 0, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0, 0, 0x0178, /* 0x90 */
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* 0xB0 */
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, /* 0xC0 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, /* 0xD0 */
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1254CHAR_START 0x00A0
+#define MS1254CHAR_END 0x00FF
+static sal_uChar const aImplMS1254ToCharTab[MS1254CHAR_END - MS1254CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, /* 0x00A0 */
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, /* 0x00A0 */
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, /* 0x00B0 */
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, /* 0x00B0 */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x00C0 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x00C0 */
+ 0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x00D0 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0, 0, 0xDF, /* 0x00D0 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x00E0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x00E0 */
+ 0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x00F0 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0, 0, 0xFF /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1254TOCHARTABEX_COUNT 31
+static ImplUniCharTabData const aImplMS1254ToCharTabEx[MS1254TOCHARTABEX_COUNT] =
+{
+ { 0x011E, 0xD0, 0 },
+ { 0x011F, 0xF0, 0 },
+ { 0x0130, 0xDD, 0 },
+ { 0x0131, 0xFD, 0 },
+ { 0x0152, 0x8C, 0 },
+ { 0x0153, 0x9C, 0 },
+ { 0x015E, 0xDE, 0 },
+ { 0x015F, 0xFE, 0 },
+ { 0x0160, 0x8A, 0 },
+ { 0x0161, 0x9A, 0 },
+ { 0x0178, 0x9F, 0 },
+ { 0x0192, 0x83, 0 },
+ { 0x02C6, 0x88, 0 },
+ { 0x02DC, 0x98, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AC, 0x80, 0 },
+ { 0x2122, 0x99, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1254ByteCvtData =
+{
+ aImplMS1254ToUniTab,
+ NULL,
+ MS1254UNI_START, MS1254UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplMS1254ToCharTab,
+ NULL,
+ aImplMS1254ToCharTabEx,
+ MS1254CHAR_START, MS1254CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1254TOCHARTABEX_COUNT,
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1254TextEncodingData
+ = { { &aImplMS1254ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 162,
+ "iso8859-9",
+ "windows-1254",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* WIN, SCRIPT_TURKISH, pc code page 857, mac encoding 35 */
+
+/* ======================================================================= */
+
+/* MS-1257 */
+/* Windows Standard CharSet for Baltic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1257.txt from 04/15/98 Version 2.01 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1257UNI_START 0x80
+#define MS1257UNI_END 0xFF
+static sal_uInt16 const aImplMS1257ToUniTab[MS1257UNI_END - MS1257UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0, 0x201A, 0, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0, 0x2030, 0, 0x2039, 0, 0x00A8, 0x02C7, 0x00B8, /* 0x80 */
+ 0, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0, 0x2122, 0, 0x203A, 0, 0x00AF, 0x02DB, 0, /* 0x90 */
+ 0x00A0, 0, 0x00A2, 0x00A3, 0x00A4, 0, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, /* 0xB0 */
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, /* 0xC0 */
+ 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, /* 0xC0 */
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, /* 0xD0 */
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, /* 0xE0 */
+ 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, /* 0xE0 */
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1257CHAR_START 0x00A0
+#define MS1257CHAR_END 0x017E
+static sal_uChar const aImplMS1257ToCharTab[MS1257CHAR_END - MS1257CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA0, 0, 0xA2, 0xA3, 0xA4, 0, 0xA6, 0xA7, /* 0x00A0 */
+ 0x8D, 0xA9, 0, 0xAB, 0xAC, 0xAD, 0xAE, 0x9D, /* 0x00A0 */
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, /* 0x00B0 */
+ 0x8F, 0xB9, 0, 0xBB, 0xBC, 0xBD, 0xBE, 0, /* 0x00B0 */
+ 0, 0, 0, 0, 0xC4, 0xC5, 0xAF, 0, /* 0x00C0 */
+ 0, 0xC9, 0, 0, 0, 0, 0, 0, /* 0x00C0 */
+ 0, 0, 0, 0xD3, 0, 0xD5, 0xD6, 0xD7, /* 0x00D0 */
+ 0xA8, 0, 0, 0, 0xDC, 0, 0, 0xDF, /* 0x00D0 */
+ 0, 0, 0, 0, 0xE4, 0xE5, 0xBF, 0, /* 0x00E0 */
+ 0, 0xE9, 0, 0, 0, 0, 0, 0, /* 0x00E0 */
+ 0, 0, 0, 0xF3, 0, 0xF5, 0xF6, 0xF7, /* 0x00F0 */
+ 0xB8, 0, 0, 0, 0xFC, 0, 0, 0, /* 0x00F0 */
+ 0xC2, 0xE2, 0, 0, 0xC0, 0xE0, 0xC3, 0xE3, /* 0x0100 */
+ 0, 0, 0, 0, 0xC8, 0xE8, 0, 0, /* 0x0100 */
+ 0, 0, 0xC7, 0xE7, 0, 0, 0xCB, 0xEB, /* 0x0110 */
+ 0xC6, 0xE6, 0, 0, 0, 0, 0, 0, /* 0x0110 */
+ 0, 0, 0xCC, 0xEC, 0, 0, 0, 0, /* 0x0120 */
+ 0, 0, 0xCE, 0xEE, 0, 0, 0xC1, 0xE1, /* 0x0120 */
+ 0, 0, 0, 0, 0, 0, 0xCD, 0xED, /* 0x0130 */
+ 0, 0, 0, 0xCF, 0xEF, 0, 0, 0, /* 0x0130 */
+ 0, 0xD9, 0xF9, 0xD1, 0xF1, 0xD2, 0xF2, 0, /* 0x0140 */
+ 0, 0, 0, 0, 0xD4, 0xF4, 0, 0, /* 0x0140 */
+ 0, 0, 0, 0, 0, 0, 0xAA, 0xBA, /* 0x0150 */
+ 0, 0, 0xDA, 0xFA, 0, 0, 0, 0, /* 0x0150 */
+ 0xD0, 0xF0, 0, 0, 0, 0, 0, 0, /* 0x0160 */
+ 0, 0, 0xDB, 0xFB, 0, 0, 0, 0, /* 0x0160 */
+ 0, 0, 0xD8, 0xF8, 0, 0, 0, 0, /* 0x0170 */
+ 0, 0xCA, 0xEA, 0xDD, 0xFD, 0xDE, 0xFE /* 0x0170 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1257TOCHARTABEX_COUNT 20
+static ImplUniCharTabData const aImplMS1257ToCharTabEx[MS1257TOCHARTABEX_COUNT] =
+{
+ { 0x02C7, 0x8E, 0 },
+ { 0x02D9, 0xFF, 0 },
+ { 0x02DB, 0x9E, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AC, 0x80, 0 },
+ { 0x2122, 0x99, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1257ByteCvtData =
+{
+ aImplMS1257ToUniTab,
+ NULL,
+ MS1257UNI_START, MS1257UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplMS1257ToCharTab,
+ NULL,
+ aImplMS1257ToCharTabEx,
+ MS1257CHAR_START, MS1257CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1257TOCHARTABEX_COUNT,
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1257TextEncodingData
+ = { { &aImplMS1257ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 186,
+ "iso8859-4",
+ "windows-1257",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* WIN, SCRIPT_BALTIC, pc code page 775, mac encoding 29 */
+
+/* ======================================================================= */
+
+/* ISO-8859-2 */
+/* Unix Standard for Eastern European (Latin2) */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-2.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO88592UNI_START 0xA0
+#define ISO88592UNI_END 0xFF
+static sal_uInt16 const aImplISO88592ToUniTab[ISO88592UNI_END - ISO88592UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, /* 0xA0 */
+ 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, /* 0xB0 */
+ 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, /* 0xB0 */
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, /* 0xC0 */
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, /* 0xC0 */
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, /* 0xD0 */
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, /* 0xE0 */
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, /* 0xE0 */
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88592TOCHARTABEX_COUNT 96
+static ImplUniCharTabData const aImplISO88592ToCharTabEx[ISO88592TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B4, 0xB4, 0 },
+ { 0x00B8, 0xB8, 0 },
+ { 0x00C1, 0xC1, 0 },
+ { 0x00C2, 0xC2, 0 },
+ { 0x00C4, 0xC4, 0 },
+ { 0x00C7, 0xC7, 0 },
+ { 0x00C9, 0xC9, 0 },
+ { 0x00CB, 0xCB, 0 },
+ { 0x00CD, 0xCD, 0 },
+ { 0x00CE, 0xCE, 0 },
+ { 0x00D3, 0xD3, 0 },
+ { 0x00D4, 0xD4, 0 },
+ { 0x00D6, 0xD6, 0 },
+ { 0x00D7, 0xD7, 0 },
+ { 0x00DA, 0xDA, 0 },
+ { 0x00DC, 0xDC, 0 },
+ { 0x00DD, 0xDD, 0 },
+ { 0x00DF, 0xDF, 0 },
+ { 0x00E1, 0xE1, 0 },
+ { 0x00E2, 0xE2, 0 },
+ { 0x00E4, 0xE4, 0 },
+ { 0x00E7, 0xE7, 0 },
+ { 0x00E9, 0xE9, 0 },
+ { 0x00EB, 0xEB, 0 },
+ { 0x00ED, 0xED, 0 },
+ { 0x00EE, 0xEE, 0 },
+ { 0x00F3, 0xF3, 0 },
+ { 0x00F4, 0xF4, 0 },
+ { 0x00F6, 0xF6, 0 },
+ { 0x00F7, 0xF7, 0 },
+ { 0x00FA, 0xFA, 0 },
+ { 0x00FC, 0xFC, 0 },
+ { 0x00FD, 0xFD, 0 },
+ { 0x0102, 0xC3, 0 },
+ { 0x0103, 0xE3, 0 },
+ { 0x0104, 0xA1, 0 },
+ { 0x0105, 0xB1, 0 },
+ { 0x0106, 0xC6, 0 },
+ { 0x0107, 0xE6, 0 },
+ { 0x010C, 0xC8, 0 },
+ { 0x010D, 0xE8, 0 },
+ { 0x010E, 0xCF, 0 },
+ { 0x010F, 0xEF, 0 },
+ { 0x0110, 0xD0, 0 },
+ { 0x0111, 0xF0, 0 },
+ { 0x0118, 0xCA, 0 },
+ { 0x0119, 0xEA, 0 },
+ { 0x011A, 0xCC, 0 },
+ { 0x011B, 0xEC, 0 },
+ { 0x0139, 0xC5, 0 },
+ { 0x013A, 0xE5, 0 },
+ { 0x013D, 0xA5, 0 },
+ { 0x013E, 0xB5, 0 },
+ { 0x0141, 0xA3, 0 },
+ { 0x0142, 0xB3, 0 },
+ { 0x0143, 0xD1, 0 },
+ { 0x0144, 0xF1, 0 },
+ { 0x0147, 0xD2, 0 },
+ { 0x0148, 0xF2, 0 },
+ { 0x0150, 0xD5, 0 },
+ { 0x0151, 0xF5, 0 },
+ { 0x0154, 0xC0, 0 },
+ { 0x0155, 0xE0, 0 },
+ { 0x0158, 0xD8, 0 },
+ { 0x0159, 0xF8, 0 },
+ { 0x015A, 0xA6, 0 },
+ { 0x015B, 0xB6, 0 },
+ { 0x015E, 0xAA, 0 },
+ { 0x015F, 0xBA, 0 },
+ { 0x0160, 0xA9, 0 },
+ { 0x0161, 0xB9, 0 },
+ { 0x0162, 0xDE, 0 },
+ { 0x0163, 0xFE, 0 },
+ { 0x0164, 0xAB, 0 },
+ { 0x0165, 0xBB, 0 },
+ { 0x016E, 0xD9, 0 },
+ { 0x016F, 0xF9, 0 },
+ { 0x0170, 0xDB, 0 },
+ { 0x0171, 0xFB, 0 },
+ { 0x0179, 0xAC, 0 },
+ { 0x017A, 0xBC, 0 },
+ { 0x017B, 0xAF, 0 },
+ { 0x017C, 0xBF, 0 },
+ { 0x017D, 0xAE, 0 },
+ { 0x017E, 0xBE, 0 },
+ { 0x02C7, 0xB7, 0 },
+ { 0x02D8, 0xA2, 0 },
+ { 0x02D9, 0xFF, 0 },
+ { 0x02DB, 0xB2, 0 },
+ { 0x02DD, 0xBD, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88592ByteCvtData =
+{
+ aImplISO88592ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88592UNI_START, ISO88592UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImpl8090SameToCharTab,
+ NULL,
+ aImplISO88592ToCharTabEx,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ ISO88592TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88592TextEncodingData
+ = { { &aImplISO88592ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 238,
+ "iso8859-2",
+ "iso-8859-2",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_EASTEUROPE, pc code page 852, mac encoding 29 */
+
+/* ======================================================================= */
+
+/* ISO-8859-3 */
+/* Latin3 (Esperanto, Maltese, Turkish) */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-3.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO88593UNI_START 0xA0
+#define ISO88593UNI_END 0xFF
+static sal_uInt16 const aImplISO88593ToUniTab[ISO88593UNI_END - ISO88593UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0, 0x0124, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0, 0x017B, /* 0xA0 */
+ 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0, 0x017C, /* 0xB0 */
+ 0x00C0, 0x00C1, 0x00C2, 0, 0x00C4, 0x010A, 0x0108, 0x00C7, /* 0xC0 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, /* 0xD0 */
+ 0x00E0, 0x00E1, 0x00E2, 0, 0x00E4, 0x010B, 0x0109, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88593TOCHARTABEX_COUNT 89
+static ImplUniCharTabData const aImplISO88593ToCharTabEx[ISO88593TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B2, 0xB2, 0 },
+ { 0x00B3, 0xB3, 0 },
+ { 0x00B4, 0xB4, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00B8, 0xB8, 0 },
+ { 0x00BD, 0xBD, 0 },
+ { 0x00C0, 0xC0, 0 },
+ { 0x00C1, 0xC1, 0 },
+ { 0x00C2, 0xC2, 0 },
+ { 0x00C4, 0xC4, 0 },
+ { 0x00C7, 0xC7, 0 },
+ { 0x00C8, 0xC8, 0 },
+ { 0x00C9, 0xC9, 0 },
+ { 0x00CA, 0xCA, 0 },
+ { 0x00CB, 0xCB, 0 },
+ { 0x00CC, 0xCC, 0 },
+ { 0x00CD, 0xCD, 0 },
+ { 0x00CE, 0xCE, 0 },
+ { 0x00CF, 0xCF, 0 },
+ { 0x00D1, 0xD1, 0 },
+ { 0x00D2, 0xD2, 0 },
+ { 0x00D3, 0xD3, 0 },
+ { 0x00D4, 0xD4, 0 },
+ { 0x00D6, 0xD6, 0 },
+ { 0x00D7, 0xD7, 0 },
+ { 0x00D9, 0xD9, 0 },
+ { 0x00DA, 0xDA, 0 },
+ { 0x00DB, 0xDB, 0 },
+ { 0x00DC, 0xDC, 0 },
+ { 0x00DF, 0xDF, 0 },
+ { 0x00E0, 0xE0, 0 },
+ { 0x00E1, 0xE1, 0 },
+ { 0x00E2, 0xE2, 0 },
+ { 0x00E4, 0xE4, 0 },
+ { 0x00E7, 0xE7, 0 },
+ { 0x00E8, 0xE8, 0 },
+ { 0x00E9, 0xE9, 0 },
+ { 0x00EA, 0xEA, 0 },
+ { 0x00EB, 0xEB, 0 },
+ { 0x00EC, 0xEC, 0 },
+ { 0x00ED, 0xED, 0 },
+ { 0x00EE, 0xEE, 0 },
+ { 0x00EF, 0xEF, 0 },
+ { 0x00F1, 0xF1, 0 },
+ { 0x00F2, 0xF2, 0 },
+ { 0x00F3, 0xF3, 0 },
+ { 0x00F4, 0xF4, 0 },
+ { 0x00F6, 0xF6, 0 },
+ { 0x00F7, 0xF7, 0 },
+ { 0x00F9, 0xF9, 0 },
+ { 0x00FA, 0xFA, 0 },
+ { 0x00FB, 0xFB, 0 },
+ { 0x00FC, 0xFC, 0 },
+ { 0x0108, 0xC6, 0 },
+ { 0x0109, 0xE6, 0 },
+ { 0x010A, 0xC5, 0 },
+ { 0x010B, 0xE5, 0 },
+ { 0x011C, 0xD8, 0 },
+ { 0x011D, 0xF8, 0 },
+ { 0x011E, 0xAB, 0 },
+ { 0x011F, 0xBB, 0 },
+ { 0x0120, 0xD5, 0 },
+ { 0x0121, 0xF5, 0 },
+ { 0x0124, 0xA6, 0 },
+ { 0x0125, 0xB6, 0 },
+ { 0x0126, 0xA1, 0 },
+ { 0x0127, 0xB1, 0 },
+ { 0x0130, 0xA9, 0 },
+ { 0x0131, 0xB9, 0 },
+ { 0x0134, 0xAC, 0 },
+ { 0x0135, 0xBC, 0 },
+ { 0x015C, 0xDE, 0 },
+ { 0x015D, 0xFE, 0 },
+ { 0x015E, 0xAA, 0 },
+ { 0x015F, 0xBA, 0 },
+ { 0x016C, 0xDD, 0 },
+ { 0x016D, 0xFD, 0 },
+ { 0x017B, 0xAF, 0 },
+ { 0x017C, 0xBF, 0 },
+ { 0x02D8, 0xA2, 0 },
+ { 0x02D9, 0xFF, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88593ByteCvtData =
+{
+ aImplISO88593ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88593UNI_START, ISO88593UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImpl8090SameToCharTab,
+ NULL,
+ aImplISO88593ToCharTabEx,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ ISO88593TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88593TextEncodingData
+ = { { &aImplISO88593ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-3",
+ "iso-8859-3",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_LATIN, pc code page 850 */
+
+/* ======================================================================= */
+
+/* ISO-8859-4 */
+/* Latin4 (Estonian, Latvian, Lithuanian) */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-4.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO88594UNI_START 0xA0
+#define ISO88594UNI_END 0xFF
+static sal_uInt16 const aImplISO88594ToUniTab[ISO88594UNI_END - ISO88594UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, /* 0xB0 */
+ 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, /* 0xB0 */
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, /* 0xC0 */
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, /* 0xC0 */
+ 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, /* 0xD0 */
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, /* 0xE0 */
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, /* 0xE0 */
+ 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88594TOCHARTABEX_COUNT 96
+static ImplUniCharTabData const aImplISO88594ToCharTabEx[ISO88594TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AF, 0xAF, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B4, 0xB4, 0 },
+ { 0x00B8, 0xB8, 0 },
+ { 0x00C1, 0xC1, 0 },
+ { 0x00C2, 0xC2, 0 },
+ { 0x00C3, 0xC3, 0 },
+ { 0x00C4, 0xC4, 0 },
+ { 0x00C5, 0xC5, 0 },
+ { 0x00C6, 0xC6, 0 },
+ { 0x00C9, 0xC9, 0 },
+ { 0x00CB, 0xCB, 0 },
+ { 0x00CD, 0xCD, 0 },
+ { 0x00CE, 0xCE, 0 },
+ { 0x00D4, 0xD4, 0 },
+ { 0x00D5, 0xD5, 0 },
+ { 0x00D6, 0xD6, 0 },
+ { 0x00D7, 0xD7, 0 },
+ { 0x00D8, 0xD8, 0 },
+ { 0x00DA, 0xDA, 0 },
+ { 0x00DB, 0xDB, 0 },
+ { 0x00DC, 0xDC, 0 },
+ { 0x00DF, 0xDF, 0 },
+ { 0x00E1, 0xE1, 0 },
+ { 0x00E2, 0xE2, 0 },
+ { 0x00E3, 0xE3, 0 },
+ { 0x00E4, 0xE4, 0 },
+ { 0x00E5, 0xE5, 0 },
+ { 0x00E6, 0xE6, 0 },
+ { 0x00E9, 0xE9, 0 },
+ { 0x00EB, 0xEB, 0 },
+ { 0x00ED, 0xED, 0 },
+ { 0x00EE, 0xEE, 0 },
+ { 0x00F4, 0xF4, 0 },
+ { 0x00F5, 0xF5, 0 },
+ { 0x00F6, 0xF6, 0 },
+ { 0x00F7, 0xF7, 0 },
+ { 0x00F8, 0xF8, 0 },
+ { 0x00FA, 0xFA, 0 },
+ { 0x00FB, 0xFB, 0 },
+ { 0x00FC, 0xFC, 0 },
+ { 0x0100, 0xC0, 0 },
+ { 0x0101, 0xE0, 0 },
+ { 0x0104, 0xA1, 0 },
+ { 0x0105, 0xB1, 0 },
+ { 0x010C, 0xC8, 0 },
+ { 0x010D, 0xE8, 0 },
+ { 0x0110, 0xD0, 0 },
+ { 0x0111, 0xF0, 0 },
+ { 0x0112, 0xAA, 0 },
+ { 0x0113, 0xBA, 0 },
+ { 0x0116, 0xCC, 0 },
+ { 0x0117, 0xEC, 0 },
+ { 0x0118, 0xCA, 0 },
+ { 0x0119, 0xEA, 0 },
+ { 0x0122, 0xAB, 0 },
+ { 0x0123, 0xBB, 0 },
+ { 0x0128, 0xA5, 0 },
+ { 0x0129, 0xB5, 0 },
+ { 0x012A, 0xCF, 0 },
+ { 0x012B, 0xEF, 0 },
+ { 0x012E, 0xC7, 0 },
+ { 0x012F, 0xE7, 0 },
+ { 0x0136, 0xD3, 0 },
+ { 0x0137, 0xF3, 0 },
+ { 0x0138, 0xA2, 0 },
+ { 0x013B, 0xA6, 0 },
+ { 0x013C, 0xB6, 0 },
+ { 0x0145, 0xD1, 0 },
+ { 0x0146, 0xF1, 0 },
+ { 0x014A, 0xBD, 0 },
+ { 0x014B, 0xBF, 0 },
+ { 0x014C, 0xD2, 0 },
+ { 0x014D, 0xF2, 0 },
+ { 0x0156, 0xA3, 0 },
+ { 0x0157, 0xB3, 0 },
+ { 0x0160, 0xA9, 0 },
+ { 0x0161, 0xB9, 0 },
+ { 0x0166, 0xAC, 0 },
+ { 0x0167, 0xBC, 0 },
+ { 0x0168, 0xDD, 0 },
+ { 0x0169, 0xFD, 0 },
+ { 0x016A, 0xDE, 0 },
+ { 0x016B, 0xFE, 0 },
+ { 0x0172, 0xD9, 0 },
+ { 0x0173, 0xF9, 0 },
+ { 0x017D, 0xAE, 0 },
+ { 0x017E, 0xBE, 0 },
+ { 0x02C7, 0xB7, 0 },
+ { 0x02D9, 0xFF, 0 },
+ { 0x02DB, 0xB2, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88594ByteCvtData =
+{
+ aImplISO88594ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88594UNI_START, ISO88594UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImpl8090SameToCharTab,
+ NULL,
+ aImplISO88594ToCharTabEx,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ ISO88594TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88594TextEncodingData
+ = { { &aImplISO88594ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 186,
+ "iso8859-4",
+ "iso-8859-4",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_BALTIC, pc code page 775, mac encoding 29 (?) */
+
+/* ======================================================================= */
+
+/* ISO-8859-5 */
+/* Unix Standard for Cyrillic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-5.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO88595UNI_START 0xA0
+#define ISO88595UNI_END 0xFF
+static sal_uInt16 const aImplISO88595ToUniTab[ISO88595UNI_END - ISO88595UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, /* 0xA0 */
+ 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, /* 0xA0 */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, /* 0xB0 */
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, /* 0xB0 */
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* 0xC0 */
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, /* 0xC0 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, /* 0xD0 */
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 0xD0 */
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, /* 0xE0 */
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, /* 0xE0 */
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, /* 0xF0 */
+ 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88595CHAR_START 0x0401
+#define ISO88595CHAR_END 0x045F
+static sal_uChar const aImplISO88595ToCharTab[ISO88595CHAR_END - ISO88595CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, /* 0x0400 */
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0, 0xAE, 0xAF, /* 0x0400 */
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, /* 0x0410 */
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, /* 0x0410 */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x0420 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x0420 */
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x0430 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, /* 0x0430 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x0440 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x0440 */
+ 0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x0450 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0, 0xFE, 0xFF, /* 0x0450 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88595TOCHARTABEX_COUNT 4
+static ImplUniCharTabData const aImplISO88595ToCharTabEx[ISO88595TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A7, 0xFD, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x2116, 0xF0, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88595ByteCvtData =
+{
+ aImplISO88595ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88595UNI_START, ISO88595UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplISO88595ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplISO88595ToCharTabEx,
+ ISO88595CHAR_START, ISO88595CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ ISO88595TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88595TextEncodingData
+ = { { &aImplISO88595ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "iso8859-5",
+ "iso-8859-5",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CYRILLIC, pc code page 866 (855?), mac encoding 7 */
+
+/* ======================================================================= */
+
+/* ISO-8859-7 */
+/* Unix Standard for Greek */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-7.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO88597UNI_START 0xA0
+#define ISO88597UNI_END 0xFF
+static sal_uInt16 const aImplISO88597ToUniTab[ISO88597UNI_END - ISO88597UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x2018, 0x2019, 0x00A3, 0, 0, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0, 0x00AB, 0x00AC, 0x00AD, 0, 0x2015, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, /* 0xB0 */
+ 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, /* 0xB0 */
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0xC0 */
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, /* 0xC0 */
+ 0x03A0, 0x03A1, 0, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, /* 0xD0 */
+ 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, /* 0xD0 */
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, /* 0xE0 */
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* 0xE0 */
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, /* 0xF0 */
+ 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88597CHAR_START 0x0384
+#define ISO88597CHAR_END 0x03CE
+static sal_uChar const aImplISO88597ToCharTab[ISO88597CHAR_END - ISO88597CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB4, 0xB5, 0xB6, 0, /* 0x0380 */
+ 0xB8, 0xB9, 0xBA, 0, 0xBC, 0, 0xBE, 0xBF, /* 0x0380 */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x0390 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x0390 */
+ 0xD0, 0xD1, 0, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x03A0 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, /* 0x03A0 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x03B0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x03B0 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x03C0 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE /* 0x03C0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88597TOCHARTABEX_COUNT 19
+static ImplUniCharTabData const aImplISO88597ToCharTabEx[ISO88597TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A6, 0xA6, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A8, 0xA8, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xAB, 0 },
+ { 0x00AC, 0xAC, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B2, 0xB2, 0 },
+ { 0x00B3, 0xB3, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00BB, 0xBB, 0 },
+ { 0x00BD, 0xBD, 0 },
+ { 0x2015, 0xAF, 0 },
+ { 0x2018, 0xA1, 0 },
+ { 0x2019, 0xA2, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88597ByteCvtData =
+{
+ aImplISO88597ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88597UNI_START, ISO88597UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplISO88597ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplISO88597ToCharTabEx,
+ ISO88597CHAR_START, ISO88597CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ ISO88597TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88597TextEncodingData
+ = { { &aImplISO88597ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 161,
+ "iso8859-7",
+ "iso-8859-7",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_GREEK, pc code page 869, mac encoding 6 */
+
+/* ======================================================================= */
+
+/* ISO-8859-9 */
+/* Latin5 (Turkish) */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-9.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO88599UNI_START 0xA0
+#define ISO88599UNI_END 0xFF
+static sal_uInt16 const aImplISO88599ToUniTab[ISO88599UNI_END - ISO88599UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* 0xB0 */
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, /* 0xC0 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, /* 0xD0 */
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88599CHAR_START 0x00A0
+#define ISO88599CHAR_END 0x00FF
+static sal_uChar const aImplISO88599ToCharTab[ISO88599CHAR_END - ISO88599CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, /* 0x00A0 */
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, /* 0x00A0 */
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, /* 0x00B0 */
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, /* 0x00B0 */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x00C0 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x00C0 */
+ 0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x00D0 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0, 0, 0xDF, /* 0x00D0 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x00E0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x00E0 */
+ 0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x00F0 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0, 0, 0xFF /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO88599TOCHARTABEX_COUNT 6
+static ImplUniCharTabData const aImplISO88599ToCharTabEx[ISO88599TOCHARTABEX_COUNT] =
+{
+ { 0x011E, 0xD0, 0 },
+ { 0x011F, 0xF0, 0 },
+ { 0x0130, 0xDD, 0 },
+ { 0x0131, 0xFD, 0 },
+ { 0x015E, 0xDE, 0 },
+ { 0x015F, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88599ByteCvtData =
+{
+ aImplISO88599ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88599UNI_START, ISO88599UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplISO88599ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplISO88599ToCharTabEx,
+ ISO88599CHAR_START, ISO88599CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ ISO88599TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88599TextEncodingData
+ = { { &aImplISO88599ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 162,
+ "iso8859-9",
+ "iso-8859-9",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_TURKISH, pc code page 857, mac encoding 35 */
+
+/* ======================================================================= */
+
+/* ISO-8859-10 */
+/* East European */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-10.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO885910UNI_START 0xA0
+#define ISO885910UNI_END 0xFF
+static sal_uInt16 const aImplISO885910ToUniTab[ISO885910UNI_END - ISO885910UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, /* 0xA0 */
+ 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A, /* 0xA0 */
+ 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, /* 0xB0 */
+ 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B, /* 0xB0 */
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, /* 0xC0 */
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, /* 0xD0 */
+ 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, /* 0xD0 */
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, /* 0xE0 */
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, /* 0xF0 */
+ 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO885910CHAR_START 0x00C1
+#define ISO885910CHAR_END 0x00FE
+static sal_uChar const aImplISO885910ToCharTab[ISO885910CHAR_END - ISO885910CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0, /* 0x00C0 */
+ 0, 0xC9, 0, 0xCB, 0, 0xCD, 0xCE, 0xCF, /* 0x00C0 */
+ 0xD0, 0, 0, 0xD3, 0xD4, 0xD5, 0xD6, 0, /* 0x00D0 */
+ 0xD8, 0, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, /* 0x00D0 */
+ 0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0, /* 0x00E0 */
+ 0, 0xE9, 0, 0xEB, 0, 0xED, 0xEE, 0xEF, /* 0x00E0 */
+ 0xF0, 0, 0, 0xF3, 0xF4, 0xF5, 0xF6, 0, /* 0x00F0 */
+ 0xF8, 0, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO885910TOCHARTABEX_COUNT 51
+static ImplUniCharTabData const aImplISO885910ToCharTabEx[ISO885910TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x0100, 0xC0, 0 },
+ { 0x0101, 0xE0, 0 },
+ { 0x0104, 0xA1, 0 },
+ { 0x0105, 0xB1, 0 },
+ { 0x010C, 0xC8, 0 },
+ { 0x010D, 0xE8, 0 },
+ { 0x0110, 0xA9, 0 },
+ { 0x0111, 0xB9, 0 },
+ { 0x0112, 0xA2, 0 },
+ { 0x0113, 0xB2, 0 },
+ { 0x0116, 0xCC, 0 },
+ { 0x0117, 0xEC, 0 },
+ { 0x0118, 0xCA, 0 },
+ { 0x0119, 0xEA, 0 },
+ { 0x0122, 0xA3, 0 },
+ { 0x0123, 0xB3, 0 },
+ { 0x0128, 0xA5, 0 },
+ { 0x0129, 0xB5, 0 },
+ { 0x012A, 0xA4, 0 },
+ { 0x012B, 0xB4, 0 },
+ { 0x012E, 0xC7, 0 },
+ { 0x012F, 0xE7, 0 },
+ { 0x0136, 0xA6, 0 },
+ { 0x0137, 0xB6, 0 },
+ { 0x0138, 0xFF, 0 },
+ { 0x013B, 0xA8, 0 },
+ { 0x013C, 0xB8, 0 },
+ { 0x0145, 0xD1, 0 },
+ { 0x0146, 0xF1, 0 },
+ { 0x014A, 0xAF, 0 },
+ { 0x014B, 0xBF, 0 },
+ { 0x014C, 0xD2, 0 },
+ { 0x014D, 0xF2, 0 },
+ { 0x0160, 0xAA, 0 },
+ { 0x0161, 0xBA, 0 },
+ { 0x0166, 0xAB, 0 },
+ { 0x0167, 0xBB, 0 },
+ { 0x0168, 0xD7, 0 },
+ { 0x0169, 0xF7, 0 },
+ { 0x016A, 0xAE, 0 },
+ { 0x016B, 0xBE, 0 },
+ { 0x0172, 0xD9, 0 },
+ { 0x0173, 0xF9, 0 },
+ { 0x017D, 0xAC, 0 },
+ { 0x017E, 0xBC, 0 },
+ { 0x2015, 0xBD, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO885910ByteCvtData =
+{
+ aImplISO885910ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO885910UNI_START, ISO885910UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplISO885910ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplISO885910ToCharTabEx,
+ ISO885910CHAR_START, ISO885910CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ ISO885910TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO885910TextEncodingData
+ = { { &aImplISO885910ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 238,
+ "iso8859-10",
+ "iso-8859-10",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_EASTEUROPE, pc code page 852, mac encoding 29 */
+
+/* ======================================================================= */
+
+/* ISO-8859-13 */
+/* East European */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-13.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO885913UNI_START 0xA0
+#define ISO885913UNI_END 0xFF
+static sal_uInt16 const aImplISO885913ToUniTab[ISO885913UNI_END - ISO885913UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, /* 0xB0 */
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, /* 0xC0 */
+ 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, /* 0xC0 */
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, /* 0xD0 */
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, /* 0xE0 */
+ 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, /* 0xE0 */
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO885913TOCHARTABEX_COUNT 96
+static ImplUniCharTabData const aImplISO885913ToCharTabEx[ISO885913TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A2, 0xA2, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A4, 0xA4, 0 },
+ { 0x00A6, 0xA6, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xAB, 0 },
+ { 0x00AC, 0xAC, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AE, 0xAE, 0 },
+ { 0x00B0, 0xB0, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B2, 0xB2, 0 },
+ { 0x00B3, 0xB3, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xB6, 0 },
+ { 0x00B7, 0xB7, 0 },
+ { 0x00B9, 0xB9, 0 },
+ { 0x00BB, 0xBB, 0 },
+ { 0x00BC, 0xBC, 0 },
+ { 0x00BD, 0xBD, 0 },
+ { 0x00BE, 0xBE, 0 },
+ { 0x00C4, 0xC4, 0 },
+ { 0x00C5, 0xC5, 0 },
+ { 0x00C6, 0xAF, 0 },
+ { 0x00C9, 0xC9, 0 },
+ { 0x00D3, 0xD3, 0 },
+ { 0x00D5, 0xD5, 0 },
+ { 0x00D6, 0xD6, 0 },
+ { 0x00D7, 0xD7, 0 },
+ { 0x00D8, 0xA8, 0 },
+ { 0x00DC, 0xDC, 0 },
+ { 0x00DF, 0xDF, 0 },
+ { 0x00E4, 0xE4, 0 },
+ { 0x00E5, 0xE5, 0 },
+ { 0x00E6, 0xBF, 0 },
+ { 0x00E9, 0xE9, 0 },
+ { 0x00F3, 0xF3, 0 },
+ { 0x00F5, 0xF5, 0 },
+ { 0x00F6, 0xF6, 0 },
+ { 0x00F7, 0xF7, 0 },
+ { 0x00F8, 0xB8, 0 },
+ { 0x00FC, 0xFC, 0 },
+ { 0x0100, 0xC2, 0 },
+ { 0x0101, 0xE2, 0 },
+ { 0x0104, 0xC0, 0 },
+ { 0x0105, 0xE0, 0 },
+ { 0x0106, 0xC3, 0 },
+ { 0x0107, 0xE3, 0 },
+ { 0x010C, 0xC8, 0 },
+ { 0x010D, 0xE8, 0 },
+ { 0x0112, 0xC7, 0 },
+ { 0x0113, 0xE7, 0 },
+ { 0x0116, 0xCB, 0 },
+ { 0x0117, 0xEB, 0 },
+ { 0x0118, 0xC6, 0 },
+ { 0x0119, 0xE6, 0 },
+ { 0x0122, 0xCC, 0 },
+ { 0x0123, 0xEC, 0 },
+ { 0x012A, 0xCE, 0 },
+ { 0x012B, 0xEE, 0 },
+ { 0x012E, 0xC1, 0 },
+ { 0x012F, 0xE1, 0 },
+ { 0x0136, 0xCD, 0 },
+ { 0x0137, 0xED, 0 },
+ { 0x013B, 0xCF, 0 },
+ { 0x013C, 0xEF, 0 },
+ { 0x0141, 0xD9, 0 },
+ { 0x0142, 0xF9, 0 },
+ { 0x0143, 0xD1, 0 },
+ { 0x0144, 0xF1, 0 },
+ { 0x0145, 0xD2, 0 },
+ { 0x0146, 0xF2, 0 },
+ { 0x014C, 0xD4, 0 },
+ { 0x014D, 0xF4, 0 },
+ { 0x0156, 0xAA, 0 },
+ { 0x0157, 0xBA, 0 },
+ { 0x015A, 0xDA, 0 },
+ { 0x015B, 0xFA, 0 },
+ { 0x0160, 0xD0, 0 },
+ { 0x0161, 0xF0, 0 },
+ { 0x016A, 0xDB, 0 },
+ { 0x016B, 0xFB, 0 },
+ { 0x0172, 0xD8, 0 },
+ { 0x0173, 0xF8, 0 },
+ { 0x0179, 0xCA, 0 },
+ { 0x017A, 0xEA, 0 },
+ { 0x017B, 0xDD, 0 },
+ { 0x017C, 0xFD, 0 },
+ { 0x017D, 0xDE, 0 },
+ { 0x017E, 0xFE, 0 },
+ { 0x2019, 0xFF, 0 },
+ { 0x201C, 0xB4, 0 },
+ { 0x201D, 0xA1, 0 },
+ { 0x201E, 0xA5, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO885913ByteCvtData =
+{
+ aImplISO885913ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO885913UNI_START, ISO885913UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImpl8090SameToCharTab,
+ NULL,
+ aImplISO885913ToCharTabEx,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ ISO885913TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO885913TextEncodingData
+ = { { &aImplISO885913ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 238,
+ "iso8859-13",
+ "iso-8859-13",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_EASTEUROPE, pc code page 852, mac encoding 29 */
+
+/* ======================================================================= */
+
+/* APPLE-CentEuro */
+/* Apple CharSet for Eastern Europa (Polish, Czech, Slovak, Hungarian, Estonian, Latvian, Lithuanian) */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/centeuro.txt from 02/05/98 */
+/* Last-Changes from us: */
+
+#define APPLECENTEUROUNI_START 0x80
+#define APPLECENTEUROUNI_END 0xFF
+static sal_uInt16 const aImplAPPLECENTEUROToUniTab[APPLECENTEUROUNI_END - APPLECENTEUROUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C4, 0x0100, 0x0101, 0x00C9, 0x0104, 0x00D6, 0x00DC, 0x00E1, /* 0x80 */
+ 0x0105, 0x010C, 0x00E4, 0x010D, 0x0106, 0x0107, 0x00E9, 0x0179, /* 0x80 */
+ 0x017A, 0x010E, 0x00ED, 0x010F, 0x0112, 0x0113, 0x0116, 0x00F3, /* 0x90 */
+ 0x0117, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x011A, 0x011B, 0x00FC, /* 0x90 */
+ 0x2020, 0x00B0, 0x0118, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, /* 0xA0 */
+ 0x00AE, 0x00A9, 0x2122, 0x0119, 0x00A8, 0x2260, 0x0123, 0x012E, /* 0xA0 */
+ 0x012F, 0x012A, 0x2264, 0x2265, 0x012B, 0x0136, 0x2202, 0x2211, /* 0xB0 */
+ 0x0142, 0x013B, 0x013C, 0x013D, 0x013E, 0x0139, 0x013A, 0x0145, /* 0xB0 */
+ 0x0146, 0x0143, 0x00AC, 0x221A, 0x0144, 0x0147, 0x2206, 0x00AB, /* 0xC0 */
+ 0x00BB, 0x2026, 0x00A0, 0x0148, 0x0150, 0x00D5, 0x0151, 0x014C, /* 0xC0 */
+ 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, /* 0xD0 */
+ 0x014D, 0x0154, 0x0155, 0x0158, 0x2039, 0x203A, 0x0159, 0x0156, /* 0xD0 */
+ 0x0157, 0x0160, 0x201A, 0x201E, 0x0161, 0x015A, 0x015B, 0x00C1, /* 0xE0 */
+ 0x0164, 0x0165, 0x00CD, 0x017D, 0x017E, 0x016A, 0x00D3, 0x00D4, /* 0xE0 */
+ 0x016B, 0x016E, 0x00DA, 0x016F, 0x0170, 0x0171, 0x0172, 0x0173, /* 0xF0 */
+ 0x00DD, 0x00FD, 0x0137, 0x017B, 0x0141, 0x017C, 0x0122, 0x02C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLECENTEUROTOCHARTABEX_COUNT 128
+static ImplUniCharTabData const aImplAPPLECENTEUROToCharTabEx[APPLECENTEUROTOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xCA, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A7, 0xA4, 0 },
+ { 0x00A8, 0xAC, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xC7, 0 },
+ { 0x00AC, 0xC2, 0 },
+ { 0x00AE, 0xA8, 0 },
+ { 0x00B0, 0xA1, 0 },
+ { 0x00B6, 0xA6, 0 },
+ { 0x00BB, 0xC8, 0 },
+ { 0x00C1, 0xE7, 0 },
+ { 0x00C4, 0x80, 0 },
+ { 0x00C9, 0x83, 0 },
+ { 0x00CD, 0xEA, 0 },
+ { 0x00D3, 0xEE, 0 },
+ { 0x00D4, 0xEF, 0 },
+ { 0x00D5, 0xCD, 0 },
+ { 0x00D6, 0x85, 0 },
+ { 0x00DA, 0xF2, 0 },
+ { 0x00DC, 0x86, 0 },
+ { 0x00DD, 0xF8, 0 },
+ { 0x00DF, 0xA7, 0 },
+ { 0x00E1, 0x87, 0 },
+ { 0x00E4, 0x8A, 0 },
+ { 0x00E9, 0x8E, 0 },
+ { 0x00ED, 0x92, 0 },
+ { 0x00F3, 0x97, 0 },
+ { 0x00F4, 0x99, 0 },
+ { 0x00F5, 0x9B, 0 },
+ { 0x00F6, 0x9A, 0 },
+ { 0x00F7, 0xD6, 0 },
+ { 0x00FA, 0x9C, 0 },
+ { 0x00FC, 0x9F, 0 },
+ { 0x00FD, 0xF9, 0 },
+ { 0x0100, 0x81, 0 },
+ { 0x0101, 0x82, 0 },
+ { 0x0104, 0x84, 0 },
+ { 0x0105, 0x88, 0 },
+ { 0x0106, 0x8C, 0 },
+ { 0x0107, 0x8D, 0 },
+ { 0x010C, 0x89, 0 },
+ { 0x010D, 0x8B, 0 },
+ { 0x010E, 0x91, 0 },
+ { 0x010F, 0x93, 0 },
+ { 0x0112, 0x94, 0 },
+ { 0x0113, 0x95, 0 },
+ { 0x0116, 0x96, 0 },
+ { 0x0117, 0x98, 0 },
+ { 0x0118, 0xA2, 0 },
+ { 0x0119, 0xAB, 0 },
+ { 0x011A, 0x9D, 0 },
+ { 0x011B, 0x9E, 0 },
+ { 0x0122, 0xFE, 0 },
+ { 0x0123, 0xAE, 0 },
+ { 0x012A, 0xB1, 0 },
+ { 0x012B, 0xB4, 0 },
+ { 0x012E, 0xAF, 0 },
+ { 0x012F, 0xB0, 0 },
+ { 0x0136, 0xB5, 0 },
+ { 0x0137, 0xFA, 0 },
+ { 0x0139, 0xBD, 0 },
+ { 0x013A, 0xBE, 0 },
+ { 0x013B, 0xB9, 0 },
+ { 0x013C, 0xBA, 0 },
+ { 0x013D, 0xBB, 0 },
+ { 0x013E, 0xBC, 0 },
+ { 0x0141, 0xFC, 0 },
+ { 0x0142, 0xB8, 0 },
+ { 0x0143, 0xC1, 0 },
+ { 0x0144, 0xC4, 0 },
+ { 0x0145, 0xBF, 0 },
+ { 0x0146, 0xC0, 0 },
+ { 0x0147, 0xC5, 0 },
+ { 0x0148, 0xCB, 0 },
+ { 0x014C, 0xCF, 0 },
+ { 0x014D, 0xD8, 0 },
+ { 0x0150, 0xCC, 0 },
+ { 0x0151, 0xCE, 0 },
+ { 0x0154, 0xD9, 0 },
+ { 0x0155, 0xDA, 0 },
+ { 0x0156, 0xDF, 0 },
+ { 0x0157, 0xE0, 0 },
+ { 0x0158, 0xDB, 0 },
+ { 0x0159, 0xDE, 0 },
+ { 0x015A, 0xE5, 0 },
+ { 0x015B, 0xE6, 0 },
+ { 0x0160, 0xE1, 0 },
+ { 0x0161, 0xE4, 0 },
+ { 0x0164, 0xE8, 0 },
+ { 0x0165, 0xE9, 0 },
+ { 0x016A, 0xED, 0 },
+ { 0x016B, 0xF0, 0 },
+ { 0x016E, 0xF1, 0 },
+ { 0x016F, 0xF3, 0 },
+ { 0x0170, 0xF4, 0 },
+ { 0x0171, 0xF5, 0 },
+ { 0x0172, 0xF6, 0 },
+ { 0x0173, 0xF7, 0 },
+ { 0x0179, 0x8F, 0 },
+ { 0x017A, 0x90, 0 },
+ { 0x017B, 0xFB, 0 },
+ { 0x017C, 0xFD, 0 },
+ { 0x017D, 0xEB, 0 },
+ { 0x017E, 0xEC, 0 },
+ { 0x02C7, 0xFF, 0 },
+ { 0x2013, 0xD0, 0 },
+ { 0x2014, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201A, 0xE2, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x201E, 0xE3, 0 },
+ { 0x2020, 0xA0, 0 },
+ { 0x2022, 0xA5, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2039, 0xDC, 0 },
+ { 0x203A, 0xDD, 0 },
+ { 0x2122, 0xAA, 0 },
+ { 0x2202, 0xB6, 0 },
+ { 0x2206, 0xC6, 0 },
+ { 0x2211, 0xB7, 0 },
+ { 0x221A, 0xC3, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 },
+ { 0x25CA, 0xD7, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLECENTEUROByteCvtData =
+{
+ aImplAPPLECENTEUROToUniTab,
+ NULL,
+ APPLECENTEUROUNI_START, APPLECENTEUROUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ NULL,
+ NULL,
+ aImplAPPLECENTEUROToCharTabEx,
+ NOTABCHAR_START, NOTABCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLECENTEUROTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLECENTEUROTextEncodingData
+ = { { &aImplAPPLECENTEUROByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 238,
+ "iso8859-2",
+ "iso-8859-2",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* MAC, SCRIPT_EASTEUROPE, pc code page 852, mac encoding 29 */
+
+/* ======================================================================= */
+
+/* APPLE-Croatian */
+/* Standard Apple CharSet for Croatian */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/croatien.txt from 02/05/98 */
+/* Last-Changes from us: */
+
+#define APPLECROATIANUNI_START 0x80
+#define APPLECROATIANUNI_END 0xFF
+static sal_uInt16 const aImplAPPLECROATIANToUniTab[APPLECROATIANUNI_END - APPLECROATIANUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, /* 0x80 */
+ 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, /* 0x90 */
+ 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, /* 0x90 */
+ 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, /* 0xA0 */
+ 0x00AE, 0x0160, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x017D, 0x00D8, /* 0xA0 */
+ 0x221E, 0x00B1, 0x2264, 0x2265, 0x2206, 0x00B5, 0x2202, 0x2211, /* 0xB0 */
+ 0x220F, 0x0161, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x017E, 0x00F8, /* 0xB0 */
+ 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x0106, 0x00AB, /* 0xC0 */
+ 0x010C, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, /* 0xC0 */
+ 0x0110, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, /* 0xD0 */
+ 0xF8FF, 0x00A9, 0x2044, 0x00A4, 0x2039, 0x203A, 0x00C6, 0x00BB, /* 0xD0 */
+ 0x2013, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x0107, 0x00C1, /* 0xE0 */
+ 0x010D, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, /* 0xE0 */
+ 0x0111, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, /* 0xF0 */
+ 0x00AF, 0x03C0, 0x00CB, 0x02DA, 0x00B8, 0x00CA, 0x00E6, 0x02C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLECROATIANCHAR_START 0x00A0
+#define APPLECROATIANCHAR_END 0x00FC
+static sal_uChar const aImplAPPLECROATIANToCharTab[APPLECROATIANCHAR_END - APPLECROATIANCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCA, 0xC1, 0xA2, 0xA3, 0xDB, 0, 0, 0xA4, /* 0x00A0 */
+ 0xAC, 0xD9, 0xBB, 0xC7, 0xC2, 0, 0xA8, 0xF8, /* 0x00A0 */
+ 0xA1, 0xB1, 0, 0, 0xAB, 0xB5, 0xA6, 0xE1, /* 0x00B0 */
+ 0xFC, 0, 0xBC, 0xDF, 0, 0, 0, 0xC0, /* 0x00B0 */
+ 0xCB, 0xE7, 0xE5, 0xCC, 0x80, 0x81, 0xDE, 0x82, /* 0x00C0 */
+ 0xE9, 0x83, 0xFD, 0xFA, 0xED, 0xEA, 0xEB, 0xEC, /* 0x00C0 */
+ 0, 0x84, 0xF1, 0xEE, 0xEF, 0xCD, 0x85, 0, /* 0x00D0 */
+ 0xAF, 0xF4, 0xF2, 0xF3, 0x86, 0, 0, 0xA7, /* 0x00D0 */
+ 0x88, 0x87, 0x89, 0x8B, 0x8A, 0x8C, 0xFE, 0x8D, /* 0x00E0 */
+ 0x8F, 0x8E, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0x00E0 */
+ 0, 0x96, 0x98, 0x97, 0x99, 0x9B, 0x9A, 0xD6, /* 0x00F0 */
+ 0xBF, 0x9D, 0x9C, 0x9E, 0x9F /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLECROATIANTOCHARTABEX_COUNT 49
+static ImplUniCharTabData const aImplAPPLECROATIANToCharTabEx[APPLECROATIANTOCHARTABEX_COUNT] =
+{
+ { 0x0106, 0xC6, 0 },
+ { 0x0107, 0xE6, 0 },
+ { 0x010C, 0xC8, 0 },
+ { 0x010D, 0xE8, 0 },
+ { 0x0110, 0xD0, 0 },
+ { 0x0111, 0xF0, 0 },
+ { 0x0131, 0xF5, 0 },
+ { 0x0152, 0xCE, 0 },
+ { 0x0153, 0xCF, 0 },
+ { 0x0160, 0xA9, 0 },
+ { 0x0161, 0xB9, 0 },
+ { 0x017D, 0xAE, 0 },
+ { 0x017E, 0xBE, 0 },
+ { 0x0192, 0xC4, 0 },
+ { 0x02C6, 0xF6, 0 },
+ { 0x02C7, 0xFF, 0 },
+ { 0x02DA, 0xFB, 0 },
+ { 0x02DC, 0xF7, 0 },
+ { 0x03A9, 0xBD, 0 },
+ { 0x03C0, 0xF9, 0 },
+ { 0x2013, 0xE0, 0 },
+ { 0x2014, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201A, 0xE2, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x201E, 0xE3, 0 },
+ { 0x2020, 0xA0, 0 },
+ { 0x2022, 0xA5, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2030, 0xE4, 0 },
+ { 0x2039, 0xDC, 0 },
+ { 0x203A, 0xDD, 0 },
+ { 0x2044, 0xDA, 0 },
+ { 0x2122, 0xAA, 0 },
+ { 0x2202, 0xB6, 0 },
+ { 0x2206, 0xB4, 0 },
+ { 0x220F, 0xB8, 0 },
+ { 0x2211, 0xB7, 0 },
+ { 0x221A, 0xC3, 0 },
+ { 0x221E, 0xB0, 0 },
+ { 0x222B, 0xBA, 0 },
+ { 0x2248, 0xC5, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 },
+ { 0x25CA, 0xD7, 0 },
+ { 0xF8FF, 0xD8, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLECROATIANByteCvtData =
+{
+ aImplAPPLECROATIANToUniTab,
+ NULL,
+ APPLECROATIANUNI_START, APPLECROATIANUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplAPPLECROATIANToCharTab,
+ NULL,
+ aImplAPPLECROATIANToCharTabEx,
+ APPLECROATIANCHAR_START, APPLECROATIANCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLECROATIANTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLECROATIANTextEncodingData
+ = { { &aImplAPPLECROATIANByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 238,
+ "iso8859-2",
+ "iso-8859-2",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* MAC, SCRIPT_EASTEUROPE, pc code page 852, mac encoding 36 */
+
+/* ======================================================================= */
+
+/* APPLE-Cyrillic */
+/* Apple CharSet for Cyrillic */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/cyrillic.txt from 02/15/98 */
+/* Last-Changes from us: */
+
+#define APPLECYRILLICUNI_START 0x80
+#define APPLECYRILLICUNI_END 0xFF
+static sal_uInt16 const aImplAPPLECYRILLICToUniTab[APPLECYRILLICUNI_END - APPLECYRILLICUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, /* 0x80 */
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, /* 0x80 */
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* 0x90 */
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, /* 0x90 */
+ 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x0406, /* 0xA0 */
+ 0x00AE, 0x00A9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, /* 0xA0 */
+ 0x221E, 0x00B1, 0x2264, 0x2265, 0x0456, 0x00B5, 0x2202, 0x0408, /* 0xB0 */
+ 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040A, 0x045A, /* 0xB0 */
+ 0x0458, 0x0405, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, /* 0xC0 */
+ 0x00BB, 0x2026, 0x00A0, 0x040B, 0x045B, 0x040C, 0x045C, 0x0455, /* 0xC0 */
+ 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x201E, /* 0xD0 */
+ 0x040E, 0x045E, 0x040F, 0x045F, 0x2116, 0x0401, 0x0451, 0x044F, /* 0xD0 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, /* 0xE0 */
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 0xE0 */
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, /* 0xF0 */
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x00A4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLECYRILLICCHAR_START 0x0401
+#define APPLECYRILLICCHAR_END 0x045F
+static sal_uChar const aImplAPPLECYRILLICToCharTab[APPLECYRILLICCHAR_END - APPLECYRILLICCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDD, 0xAB, 0xAE, 0xB8, 0xC1, 0xA7, 0xBA, /* 0x0400 */
+ 0xB7, 0xBC, 0xBE, 0xCB, 0xCD, 0, 0xD8, 0xDA, /* 0x0400 */
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x0410 */
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, /* 0x0410 */
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x0420 */
+ 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, /* 0x0420 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x0430 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x0430 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x0440 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF, /* 0x0440 */
+ 0, 0xDE, 0xAC, 0xAF, 0xB9, 0xCF, 0xB4, 0xBB, /* 0x0450 */
+ 0xC0, 0xBD, 0xBF, 0xCC, 0xCE, 0, 0xD9, 0xDB, /* 0x0450 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLECYRILLICTOCHARTABEX_COUNT 36
+static ImplUniCharTabData const aImplAPPLECYRILLICToCharTabEx[APPLECYRILLICTOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xCA, 0 },
+ { 0x00A2, 0xA2, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A4, 0xFF, 0 },
+ { 0x00A7, 0xA4, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xC7, 0 },
+ { 0x00AC, 0xC2, 0 },
+ { 0x00AE, 0xA8, 0 },
+ { 0x00B0, 0xA1, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xA6, 0 },
+ { 0x00BB, 0xC8, 0 },
+ { 0x00F7, 0xD6, 0 },
+ { 0x0192, 0xC4, 0 },
+ { 0x2013, 0xD0, 0 },
+ { 0x2014, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x201E, 0xD7, 0 },
+ { 0x2020, 0xA0, 0 },
+ { 0x2022, 0xA5, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2116, 0xDC, 0 },
+ { 0x2122, 0xAA, 0 },
+ { 0x2202, 0xB6, 0 },
+ { 0x2206, 0xC6, 0 },
+ { 0x221A, 0xC3, 0 },
+ { 0x221E, 0xB0, 0 },
+ { 0x2248, 0xC5, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLECYRILLICByteCvtData =
+{
+ aImplAPPLECYRILLICToUniTab,
+ NULL,
+ APPLECYRILLICUNI_START, APPLECYRILLICUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplAPPLECYRILLICToCharTab,
+ NULL,
+ aImplAPPLECYRILLICToCharTabEx,
+ APPLECYRILLICCHAR_START, APPLECYRILLICCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLECYRILLICTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLECYRILLICTextEncodingData
+ = { { &aImplAPPLECYRILLICByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "iso8859-5",
+ "iso-8859-5",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* MAC, SCRIPT_CYRILLIC, pc code page 866 (855?), mac encoding 7 */
+
+/* ======================================================================= */
+
+/* APPLE-Greek */
+/* Apple CharSet for Greek */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/roman.txt from 08/18/98 */
+/* Last-Changes from us: */
+
+#define APPLEGREEKUNI_START 0x80
+#define APPLEGREEKUNI_END 0xFF
+static sal_uInt16 const aImplAPPLEGREEKToUniTab[APPLEGREEKUNI_END - APPLEGREEKUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C4, 0x00B9, 0x00B2, 0x00C9, 0x00B3, 0x00D6, 0x00DC, 0x0385, /* 0x80 */
+ 0x00E0, 0x00E2, 0x00E4, 0x0384, 0x00A8, 0x00E7, 0x00E9, 0x00E8, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00A3, 0x2122, 0x00EE, 0x00EF, 0x2022, 0x00BD, /* 0x90 */
+ 0x2030, 0x00F4, 0x00F6, 0x00A6, 0x00AD, 0x00F9, 0x00FB, 0x00FC, /* 0x90 */
+ 0x2020, 0x0393, 0x0394, 0x0398, 0x039B, 0x039E, 0x03A0, 0x00DF, /* 0xA0 */
+ 0x00AE, 0x00A9, 0x03A3, 0x03AA, 0x00A7, 0x2260, 0x00B0, 0x00B7, /* 0xA0 */
+ 0x0391, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x0392, 0x0395, 0x0396, /* 0xB0 */
+ 0x0397, 0x0399, 0x039A, 0x039C, 0x03A6, 0x03AB, 0x03A8, 0x03A9, /* 0xB0 */
+ 0x03AC, 0x039D, 0x00AC, 0x039F, 0x03A1, 0x2248, 0x03A4, 0x00AB, /* 0xC0 */
+ 0x00BB, 0x2026, 0x00A0, 0x03A5, 0x03A7, 0x0386, 0x0388, 0x0153, /* 0xC0 */
+ 0x2013, 0x2015, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x0389, /* 0xD0 */
+ 0x038A, 0x038C, 0x038E, 0x03AD, 0x03AE, 0x03AF, 0x03CC, 0x038F, /* 0xD0 */
+ 0x03CD, 0x03B1, 0x03B2, 0x03C8, 0x03B4, 0x03B5, 0x03C6, 0x03B3, /* 0xE0 */
+ 0x03B7, 0x03B9, 0x03BE, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF, /* 0xE0 */
+ 0x03C0, 0x03CE, 0x03C1, 0x03C3, 0x03C4, 0x03B8, 0x03C9, 0x03C2, /* 0xF0 */
+ 0x03C7, 0x03C5, 0x03B6, 0x03CA, 0x03CB, 0x0390, 0x03B0, 0xF8A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEGREEKCHAR_START 0x0384
+#define APPLEGREEKCHAR_END 0x03CE
+static sal_uChar const aImplAPPLEGREEKToCharTab[APPLEGREEKCHAR_END - APPLEGREEKCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B, 0x87, 0xCD, 0, /* 0x0380 */
+ 0xCE, 0xD7, 0xD8, 0, 0xD9, 0, 0xDA, 0xDF, /* 0x0380 */
+ 0xFD, 0xB0, 0xB5, 0xA1, 0xA2, 0xB6, 0xB7, 0xB8, /* 0x0390 */
+ 0xA3, 0xB9, 0xBA, 0xA4, 0xBB, 0xC1, 0xA5, 0xC3, /* 0x0390 */
+ 0xA6, 0xC4, 0, 0xAA, 0xC6, 0xCB, 0xBC, 0xCC, /* 0x03A0 */
+ 0xBE, 0xBF, 0xAB, 0xBD, 0xC0, 0xDB, 0xDC, 0xDD, /* 0x03A0 */
+ 0xFE, 0xE1, 0xE2, 0xE7, 0xE4, 0xE5, 0xFA, 0xE8, /* 0x03B0 */
+ 0xF5, 0xE9, 0xEB, 0xEC, 0xED, 0xEE, 0xEA, 0xEF, /* 0x03B0 */
+ 0xF0, 0xF2, 0xF7, 0xF3, 0xF4, 0xF9, 0xE6, 0xF8, /* 0x03C0 */
+ 0xE3, 0xF6, 0xFB, 0xFC, 0xDE, 0xE0, 0xF1 /* 0x03C0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEGREEKTOCHARTABEX_COUNT 57
+static ImplUniCharTabData const aImplAPPLEGREEKToCharTabEx[APPLEGREEKTOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xCA, 0 },
+ { 0x00A3, 0x92, 0 },
+ { 0x00A5, 0xB4, 0 },
+ { 0x00A6, 0x9B, 0 },
+ { 0x00A7, 0xAC, 0 },
+ { 0x00A8, 0x8C, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xC7, 0 },
+ { 0x00AC, 0xC2, 0 },
+ { 0x00AD, 0x9C, 0 },
+ { 0x00AE, 0xA8, 0 },
+ { 0x00B0, 0xAE, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B2, 0x82, 0 },
+ { 0x00B3, 0x84, 0 },
+ { 0x00B7, 0xAF, 0 },
+ { 0x00B9, 0x81, 0 },
+ { 0x00BB, 0xC8, 0 },
+ { 0x00BD, 0x97, 0 },
+ { 0x00C4, 0x80, 0 },
+ { 0x00C9, 0x83, 0 },
+ { 0x00D6, 0x85, 0 },
+ { 0x00DC, 0x86, 0 },
+ { 0x00DF, 0xA7, 0 },
+ { 0x00E0, 0x88, 0 },
+ { 0x00E2, 0x89, 0 },
+ { 0x00E4, 0x8A, 0 },
+ { 0x00E7, 0x8D, 0 },
+ { 0x00E8, 0x8F, 0 },
+ { 0x00E9, 0x8E, 0 },
+ { 0x00EA, 0x90, 0 },
+ { 0x00EB, 0x91, 0 },
+ { 0x00EE, 0x94, 0 },
+ { 0x00EF, 0x95, 0 },
+ { 0x00F4, 0x99, 0 },
+ { 0x00F6, 0x9A, 0 },
+ { 0x00F7, 0xD6, 0 },
+ { 0x00F9, 0x9D, 0 },
+ { 0x00FB, 0x9E, 0 },
+ { 0x00FC, 0x9F, 0 },
+ { 0x0153, 0xCF, 0 },
+ { 0x2013, 0xD0, 0 },
+ { 0x2015, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x2020, 0xA0, 0 },
+ { 0x2022, 0x96, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2030, 0x98, 0 },
+ { 0x2122, 0x93, 0 },
+ { 0x2248, 0xC5, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 },
+ { 0xF8A0, 0xFF, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLEGREEKByteCvtData =
+{
+ aImplAPPLEGREEKToUniTab,
+ NULL,
+ APPLEGREEKUNI_START, APPLEGREEKUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplAPPLEGREEKToCharTab,
+ NULL,
+ aImplAPPLEGREEKToCharTabEx,
+ APPLEGREEKCHAR_START, APPLEGREEKCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLEGREEKTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLEGREEKTextEncodingData
+ = { { &aImplAPPLEGREEKByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 161,
+ "iso8859-7",
+ "iso-8859-7",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* MAC, SCRIPT_GREEK, pc code page 869, mac encoding 6 */
+
+/* ======================================================================= */
+
+/* APPLE-Romanian */
+/* Standard Apple CharSet for Romanien */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/romanian.txt from 02/05/98 */
+/* Last-Changes from us: */
+/* 0xAF --> 0x015E (like Java), Apple Definition: 0x0053+0x0326 # LATIN CAPITAL LETTER S + COMBINING COMMA BELOW */
+/* 0xBF --> 0x015F (like Java), Apple Definition: 0x0073+0x0326 # LATIN SMALL LETTER S + COMBINING COMMA BELOW */
+/* 0xDE --> 0x0162 (like Java), Apple Definition: 0x0054+0x0326 # LATIN CAPITAL LETTER T + COMBINING COMMA BELOW */
+/* 0xDF --> 0x0163 (like Java), Apple Definition: 0x0074+0x0326 # LATIN SMALL LETTER T + COMBINING COMMA BELOW */
+
+#define APPLEROMANIANUNI_START 0x80
+#define APPLEROMANIANUNI_END 0xFF
+static sal_uInt16 const aImplAPPLEROMANIANToUniTab[APPLEROMANIANUNI_END - APPLEROMANIANUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, /* 0x80 */
+ 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, /* 0x90 */
+ 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, /* 0x90 */
+ 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, /* 0xA0 */
+ 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x0102, 0x015E, /* 0xA0 */
+ 0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211, /* 0xB0 */
+ 0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x0103, 0x015F, /* 0xB0 */
+ 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, /* 0xC0 */
+ 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, /* 0xC0 */
+ 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, /* 0xD0 */
+ 0x00FF, 0x0178, 0x2044, 0x00A4, 0x2039, 0x203A, 0x0162, 0x0163, /* 0xD0 */
+ 0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, /* 0xE0 */
+ 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, /* 0xE0 */
+ 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, /* 0xF0 */
+ 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEROMANIANCHAR_START 0x00A0
+#define APPLEROMANIANCHAR_END 0x00FF
+static sal_uChar const aImplAPPLEROMANIANToCharTab[APPLEROMANIANCHAR_END - APPLEROMANIANCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCA, 0xC1, 0xA2, 0xA3, 0xDB, 0xB4, 0, 0xA4, /* 0x00A0 */
+ 0xAC, 0xA9, 0xBB, 0xC7, 0xC2, 0, 0xA8, 0xF8, /* 0x00A0 */
+ 0xA1, 0xB1, 0, 0, 0xAB, 0xB5, 0xA6, 0xE1, /* 0x00B0 */
+ 0xFC, 0, 0xBC, 0xC8, 0, 0, 0, 0xC0, /* 0x00B0 */
+ 0xCB, 0xE7, 0xE5, 0xCC, 0x80, 0x81, 0, 0x82, /* 0x00C0 */
+ 0xE9, 0x83, 0xE6, 0xE8, 0xED, 0xEA, 0xEB, 0xEC, /* 0x00C0 */
+ 0, 0x84, 0xF1, 0xEE, 0xEF, 0xCD, 0x85, 0, /* 0x00D0 */
+ 0, 0xF4, 0xF2, 0xF3, 0x86, 0, 0, 0xA7, /* 0x00D0 */
+ 0x88, 0x87, 0x89, 0x8B, 0x8A, 0x8C, 0, 0x8D, /* 0x00E0 */
+ 0x8F, 0x8E, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0x00E0 */
+ 0, 0x96, 0x98, 0x97, 0x99, 0x9B, 0x9A, 0xD6, /* 0x00F0 */
+ 0, 0x9D, 0x9C, 0x9E, 0x9F, 0, 0, 0xD8 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEROMANIANTOCHARTABEX_COUNT 51
+static ImplUniCharTabData const aImplAPPLEROMANIANToCharTabEx[APPLEROMANIANTOCHARTABEX_COUNT] =
+{
+ { 0x0102, 0xAE, 0 },
+ { 0x0103, 0xBE, 0 },
+ { 0x0131, 0xF5, 0 },
+ { 0x0152, 0xCE, 0 },
+ { 0x0153, 0xCF, 0 },
+ { 0x015E, 0xAF, 0 },
+ { 0x015F, 0xBF, 0 },
+ { 0x0162, 0xDE, 0 },
+ { 0x0163, 0xDF, 0 },
+ { 0x0178, 0xD9, 0 },
+ { 0x0192, 0xC4, 0 },
+ { 0x02C6, 0xF6, 0 },
+ { 0x02C7, 0xFF, 0 },
+ { 0x02D8, 0xF9, 0 },
+ { 0x02D9, 0xFA, 0 },
+ { 0x02DA, 0xFB, 0 },
+ { 0x02DB, 0xFE, 0 },
+ { 0x02DC, 0xF7, 0 },
+ { 0x02DD, 0xFD, 0 },
+ { 0x03A9, 0xBD, 0 },
+ { 0x03C0, 0xB9, 0 },
+ { 0x2013, 0xD0, 0 },
+ { 0x2014, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201A, 0xE2, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x201E, 0xE3, 0 },
+ { 0x2020, 0xA0, 0 },
+ { 0x2021, 0xE0, 0 },
+ { 0x2022, 0xA5, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2030, 0xE4, 0 },
+ { 0x2039, 0xDC, 0 },
+ { 0x203A, 0xDD, 0 },
+ { 0x2044, 0xDA, 0 },
+ { 0x2122, 0xAA, 0 },
+ { 0x2202, 0xB6, 0 },
+ { 0x2206, 0xC6, 0 },
+ { 0x220F, 0xB8, 0 },
+ { 0x2211, 0xB7, 0 },
+ { 0x221A, 0xC3, 0 },
+ { 0x221E, 0xB0, 0 },
+ { 0x222B, 0xBA, 0 },
+ { 0x2248, 0xC5, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 },
+ { 0x25CA, 0xD7, 0 },
+ { 0xF8FF, 0xF0, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLEROMANIANByteCvtData =
+{
+ aImplAPPLEROMANIANToUniTab,
+ NULL,
+ APPLEROMANIANUNI_START, APPLEROMANIANUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplAPPLEROMANIANToCharTab,
+ NULL,
+ aImplAPPLEROMANIANToCharTabEx,
+ APPLEROMANIANCHAR_START, APPLEROMANIANCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLEROMANIANTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLEROMANIANTextEncodingData
+ = { { &aImplAPPLEROMANIANByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 238,
+ "iso8859-2",
+ "iso-8859-2",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* MAC, SCRIPT_EASTEUROPE, pc code page 852, mac encoding 38 */
+
+/* ======================================================================= */
+
+/* APPLE-Turkish */
+/* Apple CharSet for Turkish */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/turkish.txt from 02/05/98 */
+/* Last-Changes from us: */
+
+#define APPLETURKISHUNI_START 0x80
+#define APPLETURKISHUNI_END 0xFF
+static sal_uInt16 const aImplAPPLETURKISHToUniTab[APPLETURKISHUNI_END - APPLETURKISHUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, /* 0x80 */
+ 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, /* 0x90 */
+ 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, /* 0x90 */
+ 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, /* 0xA0 */
+ 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8, /* 0xA0 */
+ 0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211, /* 0xB0 */
+ 0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x00E6, 0x00F8, /* 0xB0 */
+ 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, /* 0xC0 */
+ 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, /* 0xC0 */
+ 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, /* 0xD0 */
+ 0x00FF, 0x0178, 0x011E, 0x011F, 0x0130, 0x0131, 0x015E, 0x015F, /* 0xD0 */
+ 0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, /* 0xE0 */
+ 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, /* 0xE0 */
+ 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0xF8A0, 0x02C6, 0x02DC, /* 0xF0 */
+ 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLETURKISHCHAR_START 0x00A0
+#define APPLETURKISHCHAR_END 0x00FF
+static sal_uChar const aImplAPPLETURKISHToCharTab[APPLETURKISHCHAR_END - APPLETURKISHCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCA, 0xC1, 0xA2, 0xA3, 0, 0xB4, 0, 0xA4, /* 0x00A0 */
+ 0xAC, 0xA9, 0xBB, 0xC7, 0xC2, 0, 0xA8, 0xF8, /* 0x00A0 */
+ 0xA1, 0xB1, 0, 0, 0xAB, 0xB5, 0xA6, 0xE1, /* 0x00B0 */
+ 0xFC, 0, 0xBC, 0xC8, 0, 0, 0, 0xC0, /* 0x00B0 */
+ 0xCB, 0xE7, 0xE5, 0xCC, 0x80, 0x81, 0xAE, 0x82, /* 0x00C0 */
+ 0xE9, 0x83, 0xE6, 0xE8, 0xED, 0xEA, 0xEB, 0xEC, /* 0x00C0 */
+ 0, 0x84, 0xF1, 0xEE, 0xEF, 0xCD, 0x85, 0, /* 0x00D0 */
+ 0xAF, 0xF4, 0xF2, 0xF3, 0x86, 0, 0, 0xA7, /* 0x00D0 */
+ 0x88, 0x87, 0x89, 0x8B, 0x8A, 0x8C, 0xBE, 0x8D, /* 0x00E0 */
+ 0x8F, 0x8E, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0x00E0 */
+ 0, 0x96, 0x98, 0x97, 0x99, 0x9B, 0x9A, 0xD6, /* 0x00F0 */
+ 0xBF, 0x9D, 0x9C, 0x9E, 0x9F, 0, 0, 0xD8 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLETURKISHTOCHARTABEX_COUNT 48
+static ImplUniCharTabData const aImplAPPLETURKISHToCharTabEx[APPLETURKISHTOCHARTABEX_COUNT] =
+{
+ { 0x011E, 0xDA, 0 },
+ { 0x011F, 0xDB, 0 },
+ { 0x0130, 0xDC, 0 },
+ { 0x0131, 0xDD, 0 },
+ { 0x0152, 0xCE, 0 },
+ { 0x0153, 0xCF, 0 },
+ { 0x015E, 0xDE, 0 },
+ { 0x015F, 0xDF, 0 },
+ { 0x0178, 0xD9, 0 },
+ { 0x0192, 0xC4, 0 },
+ { 0x02C6, 0xF6, 0 },
+ { 0x02C7, 0xFF, 0 },
+ { 0x02D8, 0xF9, 0 },
+ { 0x02D9, 0xFA, 0 },
+ { 0x02DA, 0xFB, 0 },
+ { 0x02DB, 0xFE, 0 },
+ { 0x02DC, 0xF7, 0 },
+ { 0x02DD, 0xFD, 0 },
+ { 0x03A9, 0xBD, 0 },
+ { 0x03C0, 0xB9, 0 },
+ { 0x2013, 0xD0, 0 },
+ { 0x2014, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201A, 0xE2, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x201E, 0xE3, 0 },
+ { 0x2020, 0xA0, 0 },
+ { 0x2021, 0xE0, 0 },
+ { 0x2022, 0xA5, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2030, 0xE4, 0 },
+ { 0x2122, 0xAA, 0 },
+ { 0x2202, 0xB6, 0 },
+ { 0x2206, 0xC6, 0 },
+ { 0x220F, 0xB8, 0 },
+ { 0x2211, 0xB7, 0 },
+ { 0x221A, 0xC3, 0 },
+ { 0x221E, 0xB0, 0 },
+ { 0x222B, 0xBA, 0 },
+ { 0x2248, 0xC5, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 },
+ { 0x25CA, 0xD7, 0 },
+ { 0xF8A0, 0xF5, 0 },
+ { 0xF8FF, 0xF0, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLETURKISHByteCvtData =
+{
+ aImplAPPLETURKISHToUniTab,
+ NULL,
+ APPLETURKISHUNI_START, APPLETURKISHUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplAPPLETURKISHToCharTab,
+ NULL,
+ aImplAPPLETURKISHToCharTabEx,
+ APPLETURKISHCHAR_START, APPLETURKISHCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLETURKISHTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLETURKISHTextEncodingData
+ = { { &aImplAPPLETURKISHByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 162,
+ "iso8859-9",
+ "iso-8859-9",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* MAC, SCRIPT_TURKISH, pc code page 857, mac encoding 35 */
+
+/* ======================================================================= */
+
+/* APPLE-Ukrainian */
+/* Apple CharSet for Ukrainian */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/ukraine.txt from 02/05/98 */
+/* Last-Changes from us: */
+
+#define APPLEUKRAINIANUNI_START 0x80
+#define APPLEUKRAINIANUNI_END 0xFF
+static sal_uInt16 const aImplAPPLEUKRAINIANToUniTab[APPLEUKRAINIANUNI_END - APPLEUKRAINIANUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, /* 0x80 */
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, /* 0x80 */
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* 0x90 */
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, /* 0x90 */
+ 0x2020, 0x00B0, 0x0490, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x0406, /* 0xA0 */
+ 0x00AE, 0x00A9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, /* 0xA0 */
+ 0x221E, 0x00B1, 0x2264, 0x2265, 0x0456, 0x00B5, 0x0491, 0x0408, /* 0xB0 */
+ 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040A, 0x045A, /* 0xB0 */
+ 0x0458, 0x0405, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, /* 0xC0 */
+ 0x00BB, 0x2026, 0x00A0, 0x040B, 0x045B, 0x040C, 0x045C, 0x0455, /* 0xC0 */
+ 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x201E, /* 0xD0 */
+ 0x040E, 0x045E, 0x040F, 0x045F, 0x2116, 0x0401, 0x0451, 0x044F, /* 0xD0 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, /* 0xE0 */
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 0xE0 */
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, /* 0xF0 */
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x00A4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEUKRAINIANCHAR_START 0x0401
+#define APPLEUKRAINIANCHAR_END 0x045F
+static sal_uChar const aImplAPPLEUKRAINIANToCharTab[APPLEUKRAINIANCHAR_END - APPLEUKRAINIANCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDD, 0xAB, 0xAE, 0xB8, 0xC1, 0xA7, 0xBA, /* 0x0400 */
+ 0xB7, 0xBC, 0xBE, 0xCB, 0xCD, 0, 0xD8, 0xDA, /* 0x0400 */
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x0410 */
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, /* 0x0410 */
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x0420 */
+ 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, /* 0x0420 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x0430 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x0430 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x0440 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF, /* 0x0440 */
+ 0, 0xDE, 0xAC, 0xAF, 0xB9, 0xCF, 0xB4, 0xBB, /* 0x0450 */
+ 0xC0, 0xBD, 0xBF, 0xCC, 0xCE, 0, 0xD9, 0xDB, /* 0x0450 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEUKRAINIANTOCHARTABEX_COUNT 36
+static ImplUniCharTabData const aImplAPPLEUKRAINIANToCharTabEx[APPLEUKRAINIANTOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xCA, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A4, 0xFF, 0 },
+ { 0x00A7, 0xA4, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AB, 0xC7, 0 },
+ { 0x00AC, 0xC2, 0 },
+ { 0x00AE, 0xA8, 0 },
+ { 0x00B0, 0xA1, 0 },
+ { 0x00B1, 0xB1, 0 },
+ { 0x00B5, 0xB5, 0 },
+ { 0x00B6, 0xA6, 0 },
+ { 0x00BB, 0xC8, 0 },
+ { 0x00F7, 0xD6, 0 },
+ { 0x0192, 0xC4, 0 },
+ { 0x0490, 0xA2, 0 },
+ { 0x0491, 0xB6, 0 },
+ { 0x2013, 0xD0, 0 },
+ { 0x2014, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x201E, 0xD7, 0 },
+ { 0x2020, 0xA0, 0 },
+ { 0x2022, 0xA5, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2116, 0xDC, 0 },
+ { 0x2122, 0xAA, 0 },
+ { 0x2206, 0xC6, 0 },
+ { 0x221A, 0xC3, 0 },
+ { 0x221E, 0xB0, 0 },
+ { 0x2248, 0xC5, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLEUKRAINIANByteCvtData =
+{
+ aImplAPPLEUKRAINIANToUniTab,
+ NULL,
+ APPLEUKRAINIANUNI_START, APPLEUKRAINIANUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplAPPLEUKRAINIANToCharTab,
+ NULL,
+ aImplAPPLEUKRAINIANToCharTabEx,
+ APPLEUKRAINIANCHAR_START, APPLEUKRAINIANCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLEUKRAINIANTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLEUKRAINIANTextEncodingData
+ = { { &aImplAPPLEUKRAINIANByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "iso8859-5",
+ "iso-8859-5",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* MAC, SCRIPT_CYRILLIC, pc code page 866 (855?), mac encoding 0x98
+ (MAC 8.5 and above) */
+
+/* ======================================================================= */
+
+/* KOI8_R */
+/* Standard Charset for Cyrillic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: typed per hand */
+/* Last-Changes from us: */
+
+#define KOI8RUNI_START 0x80
+#define KOI8RUNI_END 0xFF
+static sal_uInt16 const aImplKOI8RToUniTab[KOI8RUNI_END - KOI8RUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, /* 0x80 */
+ 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, /* 0x80 */
+ 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, /* 0x90 */
+ 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, /* 0x90 */
+ 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, /* 0xA0 */
+ 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, /* 0xA0 */
+ 0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, /* 0xB0 */
+ 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9, /* 0xB0 */
+ 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, /* 0xC0 */
+ 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, /* 0xC0 */
+ 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, /* 0xD0 */
+ 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, /* 0xD0 */
+ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, /* 0xE0 */
+ 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, /* 0xE0 */
+ 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, /* 0xF0 */
+ 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define KOI8RCHAR_START 0x0410
+#define KOI8RCHAR_END 0x044F
+static sal_uChar const aImplKOI8RToCharTab[KOI8RCHAR_END - KOI8RCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA, /* 0x0410 */
+ 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, /* 0x0410 */
+ 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE, /* 0x0420 */
+ 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1, /* 0x0420 */
+ 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA, /* 0x0430 */
+ 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, /* 0x0430 */
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE, /* 0x0440 */
+ 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1 /* 0x0440 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define KOI8RTOCHARTABEX_COUNT 64
+static ImplUniCharTabData const aImplKOI8RToCharTabEx[KOI8RTOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0x9A, 0 },
+ { 0x00A9, 0xBF, 0 },
+ { 0x00B0, 0x9C, 0 },
+ { 0x00B2, 0x9D, 0 },
+ { 0x00B7, 0x9E, 0 },
+ { 0x00F7, 0x9F, 0 },
+ { 0x0401, 0xB3, 0 },
+ { 0x0451, 0xA3, 0 },
+ { 0x2219, 0x95, 0 },
+ { 0x221A, 0x96, 0 },
+ { 0x2248, 0x97, 0 },
+ { 0x2264, 0x98, 0 },
+ { 0x2265, 0x99, 0 },
+ { 0x2320, 0x93, 0 },
+ { 0x2321, 0x9B, 0 },
+ { 0x2500, 0x80, 0 },
+ { 0x2502, 0x81, 0 },
+ { 0x250C, 0x82, 0 },
+ { 0x2510, 0x83, 0 },
+ { 0x2514, 0x84, 0 },
+ { 0x2518, 0x85, 0 },
+ { 0x251C, 0x86, 0 },
+ { 0x2524, 0x87, 0 },
+ { 0x252C, 0x88, 0 },
+ { 0x2534, 0x89, 0 },
+ { 0x253C, 0x8A, 0 },
+ { 0x2550, 0xA0, 0 },
+ { 0x2551, 0xA1, 0 },
+ { 0x2552, 0xA2, 0 },
+ { 0x2553, 0xA4, 0 },
+ { 0x2554, 0xA5, 0 },
+ { 0x2555, 0xA6, 0 },
+ { 0x2556, 0xA7, 0 },
+ { 0x2557, 0xA8, 0 },
+ { 0x2558, 0xA9, 0 },
+ { 0x2559, 0xAA, 0 },
+ { 0x255A, 0xAB, 0 },
+ { 0x255B, 0xAC, 0 },
+ { 0x255C, 0xAD, 0 },
+ { 0x255D, 0xAE, 0 },
+ { 0x255E, 0xAF, 0 },
+ { 0x255F, 0xB0, 0 },
+ { 0x2560, 0xB1, 0 },
+ { 0x2561, 0xB2, 0 },
+ { 0x2562, 0xB4, 0 },
+ { 0x2563, 0xB5, 0 },
+ { 0x2564, 0xB6, 0 },
+ { 0x2565, 0xB7, 0 },
+ { 0x2566, 0xB8, 0 },
+ { 0x2567, 0xB9, 0 },
+ { 0x2568, 0xBA, 0 },
+ { 0x2569, 0xBB, 0 },
+ { 0x256A, 0xBC, 0 },
+ { 0x256B, 0xBD, 0 },
+ { 0x256C, 0xBE, 0 },
+ { 0x2580, 0x8B, 0 },
+ { 0x2584, 0x8C, 0 },
+ { 0x2588, 0x8D, 0 },
+ { 0x258C, 0x8E, 0 },
+ { 0x2590, 0x8F, 0 },
+ { 0x2591, 0x90, 0 },
+ { 0x2592, 0x91, 0 },
+ { 0x2593, 0x92, 0 },
+ { 0x25A0, 0x94, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplKOI8RByteCvtData =
+{
+ aImplKOI8RToUniTab,
+ NULL,
+ KOI8RUNI_START, KOI8RUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplKOI8RToCharTab,
+ NULL,
+ aImplKOI8RToCharTabEx,
+ KOI8RCHAR_START, KOI8RCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ KOI8RTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplKOI8RTextEncodingData
+ = { { &aImplKOI8RByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "koi8-r",
+ "koi8-r",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CYRILLIC, pc code page 866 (855?), mac encoding 7 */
+
+/* ======================================================================= */
+
+/* KOI8_U */
+/* Standard Charset for Ukrainian Cyrillic */
+/* Single Byte, 0x00-0x7F equals ASCII */
+/* Conversion Tables: hand made */
+
+#define KOI8UUNI_START 0x80
+#define KOI8UUNI_END 0xFF
+static sal_uInt16 const aImplKOI8UToUniTab[KOI8UUNI_END - KOI8UUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, /* 0x80 */
+ 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, /* 0x80 */
+ 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248, /* 0x90 */
+ 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7, /* 0x90 */
+ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, /* 0xA0 */
+ 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E, /* 0xA0 */
+ 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, /* 0xB0 */
+ 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9, /* 0xB0 */
+ 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, /* 0xC0 */
+ 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, /* 0xC0 */
+ 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, /* 0xD0 */
+ 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A, /* 0xD0 */
+ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, /* 0xE0 */
+ 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, /* 0xE0 */
+ 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, /* 0xF0 */
+ 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A /* 0xF0 */
+};
+
+#define KOI8UCHAR_START 0x0410
+#define KOI8UCHAR_END 0x044F
+static sal_uChar const
+aImplKOI8UToCharTab[KOI8UCHAR_END - KOI8UCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA, /* 0x0410 */
+ 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, /* 0x0410 */
+ 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE, /* 0x0420 */
+ 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1, /* 0x0420 */
+ 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA, /* 0x0430 */
+ 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, /* 0x0430 */
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE, /* 0x0440 */
+ 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1 /* 0x0440 */
+};
+
+#define KOI8UTOCHARTABEX_COUNT 72
+static ImplUniCharTabData const aImplKOI8UToCharTabEx[KOI8UTOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0x9A, 0 },
+ { 0x00A9, 0xBF, 0 },
+ { 0x00B0, 0x9C, 0 },
+ { 0x00B2, 0x9D, 0 },
+ { 0x00B7, 0x9E, 0 },
+ { 0x00F7, 0x9F, 0 },
+ { 0x0401, 0xB3, 0 },
+ { 0x0404, 0xB4, 0 },
+ { 0x0406, 0xB6, 0 },
+ { 0x0407, 0xB7, 0 },
+ { 0x0451, 0xA3, 0 },
+ { 0x0454, 0xA4, 0 },
+ { 0x0456, 0xA6, 0 },
+ { 0x0457, 0xA7, 0 },
+ { 0x0490, 0xBD, 0 },
+ { 0x0491, 0xAD, 0 },
+ { 0x2219, 0x95, 0 },
+ { 0x221A, 0x96, 0 },
+ { 0x2248, 0x97, 0 },
+ { 0x2264, 0x98, 0 },
+ { 0x2265, 0x99, 0 },
+ { 0x2320, 0x93, 0 },
+ { 0x2321, 0x9B, 0 },
+ { 0x2500, 0x80, 0 },
+ { 0x2502, 0x81, 0 },
+ { 0x250C, 0x82, 0 },
+ { 0x2510, 0x83, 0 },
+ { 0x2514, 0x84, 0 },
+ { 0x2518, 0x85, 0 },
+ { 0x251C, 0x86, 0 },
+ { 0x2524, 0x87, 0 },
+ { 0x252C, 0x88, 0 },
+ { 0x2534, 0x89, 0 },
+ { 0x253C, 0x8A, 0 },
+ { 0x2550, 0xA0, 0 },
+ { 0x2551, 0xA1, 0 },
+ { 0x2552, 0xA2, 0 },
+ { 0x2553, 0xA4, 0 },
+ { 0x2554, 0xA5, 0 },
+ { 0x2555, 0xA6, 0 },
+ { 0x2556, 0xA7, 0 },
+ { 0x2557, 0xA8, 0 },
+ { 0x2558, 0xA9, 0 },
+ { 0x2559, 0xAA, 0 },
+ { 0x255A, 0xAB, 0 },
+ { 0x255B, 0xAC, 0 },
+ { 0x255C, 0xAD, 0 },
+ { 0x255D, 0xAE, 0 },
+ { 0x255E, 0xAF, 0 },
+ { 0x255F, 0xB0, 0 },
+ { 0x2560, 0xB1, 0 },
+ { 0x2561, 0xB2, 0 },
+ { 0x2562, 0xB4, 0 },
+ { 0x2563, 0xB5, 0 },
+ { 0x2564, 0xB6, 0 },
+ { 0x2565, 0xB7, 0 },
+ { 0x2566, 0xB8, 0 },
+ { 0x2567, 0xB9, 0 },
+ { 0x2568, 0xBA, 0 },
+ { 0x2569, 0xBB, 0 },
+ { 0x256A, 0xBC, 0 },
+ { 0x256B, 0xBD, 0 },
+ { 0x256C, 0xBE, 0 },
+ { 0x2580, 0x8B, 0 },
+ { 0x2584, 0x8C, 0 },
+ { 0x2588, 0x8D, 0 },
+ { 0x258C, 0x8E, 0 },
+ { 0x2590, 0x8F, 0 },
+ { 0x2591, 0x90, 0 },
+ { 0x2592, 0x91, 0 },
+ { 0x2593, 0x92, 0 },
+ { 0x25A0, 0x94, 0 }
+};
+
+static ImplByteConvertData const aImplKOI8UByteCvtData =
+{
+ aImplKOI8UToUniTab,
+ NULL,
+ KOI8UUNI_START, KOI8UUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplKOI8UToCharTab,
+ NULL,
+ aImplKOI8UToCharTabEx,
+ KOI8UCHAR_START, KOI8UCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ KOI8UTOCHARTABEX_COUNT
+};
+
+static ImplTextEncodingData const aImplKoi8UTextEncodingData
+ = { { &aImplKOI8UByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "koi8-u",
+ "KOI8-U",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CYRILLIC */
+
+/* ======================================================================= */
+
+/* PT154 */
+/* Asian Cyrillic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: typed per hand */
+/* Last-Changes from us: */
+
+#define PT154UNI_START 0x80
+#define PT154UNI_END 0xFF
+static sal_uInt16 const aImplPT154ToUniTab[PT154UNI_END - PT154UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0496, 0x0492, 0x04EE, 0x0493, 0x201E, 0x2026, 0x04B6, 0x04AE, /* 0x80 */
+ 0x04B2, 0x04AF, 0x04A0, 0x04E2, 0x04A2, 0x049A, 0x04BA, 0x04B8, /* 0x80 */
+ 0x0497, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0x04B3, 0x04B7, 0x04A1, 0x04E3, 0x04A3, 0x049B, 0x04BB, 0x04B9, /* 0x90 */
+ 0x00A0, 0x040E, 0x045E, 0x0408, 0x04E8, 0x0498, 0x04B0, 0x00A7, /* 0xA0 */
+ 0x0401, 0x00A9, 0x04D8, 0x00AB, 0x00AC, 0x04EF, 0x00AE, 0x049C, /* 0xA0 */
+ 0x00B0, 0x04B1, 0x0406, 0x0456, 0x0499, 0x04E9, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x0451, 0x2116, 0x04D9, 0x00BB, 0x0458, 0x04AA, 0x04AB, 0x049D, /* 0xB0 */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, /* 0xC0 */
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, /* 0xC0 */
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* 0xD0 */
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, /* 0xD0 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, /* 0xE0 */
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, /* 0xE0 */
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, /* 0xF0 */
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define PT154CHAR_START 0x0410
+#define PT154CHAR_END 0x044F
+static sal_uChar const aImplPT154ToCharTab[PT154CHAR_END - PT154CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x0410 */
+ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x0410 */
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x0420 */
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x0420 */
+ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x0430 */
+ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x0430 */
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x0440 */
+ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff /* 0x0440 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define PT154TOCHARTABEX_COUNT 64
+static ImplUniCharTabData const aImplPT154ToCharTabEx[PT154TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xa0, 0 },
+ { 0x00A7, 0xa7, 0 },
+ { 0x00A9, 0xa9, 0 },
+ { 0x00AB, 0xab, 0 },
+ { 0x00AC, 0xac, 0 },
+ { 0x00AE, 0xae, 0 },
+ { 0x00B0, 0xb0, 0 },
+ { 0x00B6, 0xb6, 0 },
+ { 0x00B7, 0xb7, 0 },
+ { 0x00BB, 0xbb, 0 },
+ { 0x0401, 0xa8, 0 },
+ { 0x0406, 0xb2, 0 },
+ { 0x0408, 0xa3, 0 },
+ { 0x040E, 0xa1, 0 },
+ { 0x0451, 0xb8, 0 },
+ { 0x0456, 0xb3, 0 },
+ { 0x0458, 0xbc, 0 },
+ { 0x045E, 0xa2, 0 },
+ { 0x0492, 0x81, 0 },
+ { 0x0493, 0x83, 0 },
+ { 0x0496, 0x80, 0 },
+ { 0x0497, 0x90, 0 },
+ { 0x0498, 0xa5, 0 },
+ { 0x0499, 0xb4, 0 },
+ { 0x049A, 0x8d, 0 },
+ { 0x049B, 0x9d, 0 },
+ { 0x049C, 0xaf, 0 },
+ { 0x049D, 0xbf, 0 },
+ { 0x04A0, 0x8a, 0 },
+ { 0x04A1, 0x9a, 0 },
+ { 0x04A2, 0x8c, 0 },
+ { 0x04A3, 0x9c, 0 },
+ { 0x04AA, 0xbd, 0 },
+ { 0x04AB, 0xbe, 0 },
+ { 0x04AE, 0x87, 0 },
+ { 0x04AF, 0x89, 0 },
+ { 0x04B0, 0xa6, 0 },
+ { 0x04B1, 0xb1, 0 },
+ { 0x04B2, 0x88, 0 },
+ { 0x04B3, 0x98, 0 },
+ { 0x04B6, 0x86, 0 },
+ { 0x04B7, 0x99, 0 },
+ { 0x04B8, 0x8f, 0 },
+ { 0x04B9, 0x9f, 0 },
+ { 0x04BA, 0x8e, 0 },
+ { 0x04BB, 0x9e, 0 },
+ { 0x04D8, 0xaa, 0 },
+ { 0x04D9, 0xba, 0 },
+ { 0x04E2, 0x8b, 0 },
+ { 0x04E3, 0x9b, 0 },
+ { 0x04E8, 0xa4, 0 },
+ { 0x04E9, 0xb5, 0 },
+ { 0x04EE, 0x82, 0 },
+ { 0x04EF, 0xad, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2116, 0xb9, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplPT154ByteCvtData =
+{
+ aImplPT154ToUniTab,
+ NULL,
+ PT154UNI_START, PT154UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplPT154ToCharTab,
+ NULL,
+ aImplPT154ToCharTabEx,
+ PT154CHAR_START, PT154CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ PT154TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplPT154TextEncodingData
+ = { { &aImplPT154ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 204,
+ "iso8859-5",
+ "PTCP154",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CYRILLIC */
diff --git a/sal/textenc/tcvtjp1.tab b/sal/textenc/tcvtjp1.tab
new file mode 100644
index 000000000000..592b070b79db
--- /dev/null
+++ b/sal/textenc/tcvtjp1.tab
@@ -0,0 +1,1556 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the DBCS to UniCode tables for the following */
+/* japanese charsets: SJIS, MS932, APPLE_JAPANESE */
+
+/* ======================================================================= */
+
+/* Changes: */
+/* 81_50: SJIS == 0xFFE3, MS932 == 0xFFE3, APPLE_JAPANESE == 0x0203 - we use in all systems 0xFFE3 for better MS compatibility */
+/* 81_5C: SJIS == 0x2015, MS932 == 0x2015, APPLE_JAPANESE == 0x2014 - we use in all systems 0x2015 for better MS compatibility */
+/* 81_5F: SJIS == 0x005C, MS932 == 0xFF3C, APPLE_JAPANESE == 0xFF3C - we use in all systems 0xFF3C for better MS compatibility */
+/* 81_60: SJIS == 0x301C, MS932 == 0xFF5E, APPLE_JAPANESE == 0x301C - we use in all systems 0xFF5E for better MS compatibility */
+/* 81_61: SJIS == 0x2016, MS932 == 0x2225, APPLE_JAPANESE == 0x2016 - we use in all systems 0x2225 for better MS compatibility */
+/* 81_63: SJIS == 0x2026, MS932 == 0x2026, APPLE_JAPANESE == 0x22EF - we use in all systems 0x2026 for better MS compatibility */
+/* 81_7C: SJIS == 0x2212, MS932 == 0xFF0D, APPLE_JAPANESE == 0x2212 - we use in all systems 0xFF0D for better MS compatibility */
+/* 81_91: SJIS == 0x00A2, MS932 == 0xFFE0, APPLE_JAPANESE == 0x00A2 - we use in all systems 0xFFE0 for better MS compatibility */
+/* 81_92: SJIS == 0x00A3, MS932 == 0xFFE1, APPLE_JAPANESE == 0x00A3 - we use in all systems 0xFFE1 for better MS compatibility */
+/* 81_CA: SJIS == 0x00AC, MS932 == 0xFFE2, APPLE_JAPANESE == 0x00AC - we use in all systems 0xFFE1 for better MS compatibility */
+
+static sal_uInt16 const aImplDBCSToUniTab_MS932_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, /* 0x40 */
+ 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8, 0xFF3E, /* 0x40 */
+ 0xFFE3, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, /* 0x50 */
+ 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, 0xFF3C, /* 0x50 */
+ 0xFF5E, 0x2225, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019, 0x201C, /* 0x60 */
+ 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D, 0xFF5B, /* 0x60 */
+ 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, /* 0x70 */
+ 0x300F, 0x3010, 0x3011, 0xFF0B, 0xFF0D, 0x00B1, 0x00D7, 0, /* 0x70 */
+ 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E, /* 0x80 */
+ 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5, /* 0x80 */
+ 0xFF04, 0xFFE0, 0xFFE1, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20, /* 0x90 */
+ 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, /* 0x90 */
+ 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012, /* 0xA0 */
+ 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, /* 0xD0 */
+ 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, /* 0xE0 */
+ 0x222C, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x212B, 0x2030, 0x266F, 0x266D, 0x266A, 0x2020, 0x2021, 0x00B6, /* 0xF0 */
+ 0, 0, 0, 0, 0x25EF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x40 */
+ 0xFF10, /* 0x40 */
+ 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, /* 0x50 */
+ 0xFF19, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, /* 0x60 */
+ 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, /* 0x60 */
+ 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, /* 0x70 */
+ 0xFF39, 0xFF3A, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, /* 0x80 */
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 0x80 */
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, /* 0x90 */
+ 0xFF58, 0xFF59, 0xFF5A, 0, 0, 0, 0, 0x3041, /* 0x90 */
+ 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, /* 0xA0 */
+ 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, /* 0xA0 */
+ 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, /* 0xB0 */
+ 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, /* 0xB0 */
+ 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, /* 0xC0 */
+ 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, /* 0xC0 */
+ 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, /* 0xD0 */
+ 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, /* 0xD0 */
+ 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, /* 0xE0 */
+ 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, /* 0xE0 */
+ 0x3092, 0x3093 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, /* 0x40 */
+ 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, /* 0x40 */
+ 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, /* 0x50 */
+ 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, /* 0x50 */
+ 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, /* 0x60 */
+ 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, /* 0x60 */
+ 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, /* 0x70 */
+ 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0, /* 0x70 */
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, /* 0x80 */
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, /* 0x80 */
+ 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x0391, /* 0x90 */
+ 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, /* 0xA0 */
+ 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, /* 0xA0 */
+ 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x03B1, /* 0xB0 */
+ 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, /* 0xC0 */
+ 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, /* 0xC0 */
+ 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9 /* 0xD0 */
+ /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, /* 0x40 */
+ 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, /* 0x40 */
+ 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, /* 0x50 */
+ 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, /* 0x50 */
+ 0x042F, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, /* 0x70 */
+ 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0, /* 0x70 */
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, /* 0x80 */
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, /* 0x80 */
+ 0x044E, 0x044F, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x2500, /* 0x90 */
+ 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524, /* 0xA0 */
+ 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517, /* 0xA0 */
+ 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528, /* 0xB0 */
+ 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_APPLEJAPANESE_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, /* 0x40 */
+ 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x246F, /* 0x40 */
+ 0x2470, 0x2471, 0x2472, 0x2473, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x2474, 0x2475, /* 0x50 */
+ 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, /* 0x60 */
+ 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, /* 0x60 */
+ 0x2486, 0x2487, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x2776, 0x2777, 0x2778, 0, /* 0x70 */
+ 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, /* 0x90 */
+ 0x248E, 0x248F, 0x2490, 0, 0, 0, 0, 0x2160, /* 0x90 */
+ 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, /* 0xA0 */
+ 0x2169, 0x216A, 0x216B, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, /* 0xB0 */
+ 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, /* 0xD0 */
+ 0x24A1, 0x24A2, 0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, /* 0xE0 */
+ 0x24A9, 0x24AA, 0x24AB, 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, /* 0xE0 */
+ 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_APPLEJAPANESE_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x339C, 0x339F, 0x339D, 0x33A0, 0x33A4, 0, 0x33A1, 0x33A5, /* 0x40 */
+ 0x339E, 0x33A2, 0x338E, 0, 0x338F, 0x33C4, 0x3396, 0x3397, /* 0x40 */
+ 0x2113, 0x3398, 0x33B3, 0x33B2, 0x33B1, 0x33B0, 0x2109, 0x33D4, /* 0x50 */
+ 0x33CB, 0x3390, 0x3385, 0x3386, 0x3387, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x2116, 0x33CD, 0x2121, 0, 0x2664, /* 0x90 */
+ 0x2667, 0x2661, 0x2662, 0x2660, 0x2663, 0x2665, 0x2666, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x3020, 0x260E, 0x3004, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x261E, /* 0xC0 */
+ 0x261C, 0x261D, 0x261F, 0x21C6, 0x21C4, 0x21C5, 0, 0x21E8, /* 0xC0 */
+ 0x21E6, 0x21E7, 0x21E9 /* 0xD0 */
+ /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_MS932_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, /* 0x40 */
+ 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x246F, /* 0x40 */
+ 0x2470, 0x2471, 0x2472, 0x2473, 0x2160, 0x2161, 0x2162, 0x2163, /* 0x50 */
+ 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0, 0x3349, /* 0x50 */
+ 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, /* 0x60 */
+ 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A, 0x333B, 0x339C, /* 0x60 */
+ 0x339D, 0x339E, 0x338E, 0x338F, 0x33C4, 0x33A1, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x337B, 0, /* 0x70 */
+ 0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, 0x32A5, 0x32A6, /* 0x80 */
+ 0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, 0x337C, /* 0x80 */
+ 0x2252, 0x2261, 0x222B, 0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, /* 0x90 */
+ 0x221F, 0x22BF, 0x2235, 0x2229, 0x222A /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_APPLEJAPANESE_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3230, 0x322A, 0x322B, 0x322C, 0x322D, 0x322E, 0x322F, 0x3240, /* 0x40 */
+ 0x3237, 0x3242, 0x3243, 0x3239, 0x323A, 0x3231, 0x323E, 0x3234, /* 0x40 */
+ 0x3232, 0x323B, 0x3236, 0x3233, 0x3235, 0x323C, 0x323D, 0x323F, /* 0x50 */
+ 0x3238, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x32A4, 0x32A5, 0x32A6, 0x32A7, 0x32A8, /* 0x90 */
+ 0x32A9, 0x3296, 0x329D, 0x3298, 0x329E, 0, 0x3299, 0x3349, /* 0x90 */
+ 0x3322, 0x334D, 0x3314, 0x3316, 0x3305, 0x3333, 0x334E, 0x3303, /* 0xA0 */
+ 0x3336, 0x3318, 0x3315, 0x3327, 0x3351, 0x334A, 0x3339, 0x3357, /* 0xA0 */
+ 0x330D, 0x3342, 0x3323, 0x3326, 0x333B, 0x332B, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x3300, 0x331E, 0x332A, /* 0xB0 */
+ 0x3331, 0x3347, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x337E, 0x337D, 0x337C, /* 0xE0 */
+ 0x337B, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x337F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x90 */
+ 0x4E9C, /* 0x90 */
+ 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, /* 0xA0 */
+ 0x8475, 0x831C, 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, /* 0xA0 */
+ 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, /* 0xB0 */
+ 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, /* 0xB0 */
+ 0x5B89, 0x5EB5, 0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, /* 0xC0 */
+ 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, /* 0xC0 */
+ 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, /* 0xD0 */
+ 0x754F, 0x7570, 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, /* 0xD0 */
+ 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, /* 0xE0 */
+ 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, /* 0xE0 */
+ 0x828B, 0x9C2F, 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, /* 0xF0 */
+ 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_APPLEJAPANESE_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x222E, 0x221F, 0x22BF, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x301D, 0x301F, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x3094, 0, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4E9C, /* 0x90 */
+ 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, /* 0xA0 */
+ 0x8475, 0x831C, 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, /* 0xA0 */
+ 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, /* 0xB0 */
+ 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, /* 0xB0 */
+ 0x5B89, 0x5EB5, 0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, /* 0xC0 */
+ 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, /* 0xC0 */
+ 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, /* 0xD0 */
+ 0x754F, 0x7570, 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, /* 0xD0 */
+ 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, /* 0xE0 */
+ 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, /* 0xE0 */
+ 0x828B, 0x9C2F, 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, /* 0xF0 */
+ 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, 0x53F3, 0x5B87, 0x70CF, /* 0x40 */
+ 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C, 0x7ABA, 0x4E11, 0x7893, /* 0x40 */
+ 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B, 0x59E5, /* 0x50 */
+ 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B, 0x96F2, /* 0x50 */
+ 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30, 0x5F71, 0x6620, 0x66F3, /* 0x60 */
+ 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E, 0x9834, /* 0x60 */
+ 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA, 0x99C5, /* 0x70 */
+ 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E, 0x53AD, 0x5186, 0, /* 0x70 */
+ 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028, 0x63A9, 0x63F4, /* 0x80 */
+ 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, 0x733F, 0x7E01, /* 0x80 */
+ 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B, 0x5869, 0x65BC, /* 0x90 */
+ 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC, 0x62BC, /* 0x90 */
+ 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1, 0x8956, 0x9D2C, /* 0xA0 */
+ 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, 0x5C4B, 0x61B6, /* 0xA0 */
+ 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, 0x6069, 0x6E29, /* 0xB0 */
+ 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55, 0x4F3D, 0x4FA1, /* 0xB0 */
+ 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1, 0x5BB6, 0x5BE1, /* 0xC0 */
+ 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3, 0x706B, 0x73C2, /* 0xC0 */
+ 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB, 0x8304, 0x8377, /* 0xD0 */
+ 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8, 0x8FE6, 0x904E, /* 0xD0 */
+ 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259, 0x753B, 0x81E5, /* 0xE0 */
+ 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5, 0x4ECB, 0x4F1A, /* 0xE0 */
+ 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB, 0x602A, 0x6094, /* 0xF0 */
+ 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, /* 0x40 */
+ 0x82A5, 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, /* 0x40 */
+ 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, /* 0x50 */
+ 0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, /* 0x50 */
+ 0x67FF, 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, /* 0x60 */
+ 0x64B9, 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, /* 0x60 */
+ 0x89D2, 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, /* 0x70 */
+ 0x5CB3, 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0, /* 0x70 */
+ 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, /* 0x80 */
+ 0x6D3B, 0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, /* 0x80 */
+ 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, /* 0x90 */
+ 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, /* 0x90 */
+ 0x5208, 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, /* 0xA0 */
+ 0x52D8, 0x52E7, 0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, /* 0xA0 */
+ 0x5BDB, 0x5E72, 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, /* 0xB0 */
+ 0x6562, 0x67D1, 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, /* 0xB0 */
+ 0x6F97, 0x6F45, 0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, /* 0xC0 */
+ 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, /* 0xC0 */
+ 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, /* 0xD0 */
+ 0x97D3, 0x9928, 0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, /* 0xD0 */
+ 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, /* 0xE0 */
+ 0x9858, 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, /* 0xE0 */
+ 0x5B09, 0x5BC4, 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, /* 0xF0 */
+ 0x65D7, 0x65E2, 0x671F, 0x68CB, 0x68C4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948, 0x5B63, /* 0x40 */
+ 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18, 0x8CB4, 0x8D77, 0x8ECC, /* 0x40 */
+ 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100, 0x5993, /* 0x50 */
+ 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591, 0x7947, /* 0x50 */
+ 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC, 0x83CA, 0x97A0, 0x5409, /* 0x60 */
+ 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70, 0x7827, 0x6775, 0x9ECD, /* 0x60 */
+ 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006, 0x4E18, 0x4E45, 0x4EC7, /* 0x70 */
+ 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13, 0x6025, 0x6551, 0, /* 0x70 */
+ 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, 0x7AAE, /* 0x80 */
+ 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45, /* 0x80 */
+ 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A, 0x8A31, 0x8DDD, /* 0x90 */
+ 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC, 0x4F9B, /* 0x90 */
+ 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6, 0x5354, 0x5321, /* 0xA0 */
+ 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37, 0x5F4A, 0x602F, /* 0xA0 */
+ 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1, 0x72C2, 0x72ED, /* 0xB0 */
+ 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7, 0x93E1, 0x97FF, /* 0xB0 */
+ 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681, 0x696D, 0x5C40, /* 0xC0 */
+ 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5, 0x52E4, 0x5747, /* 0xC0 */
+ 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434, 0x7981, 0x79BD, /* 0xD0 */
+ 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F, 0x8B39, 0x8FD1, /* 0xD0 */
+ 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5, 0x533A, 0x72D7, /* 0xE0 */
+ 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8, 0x99D2, 0x5177, /* 0xE0 */
+ 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3, 0x9047, 0x9685, /* 0xF0 */
+ 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, /* 0x40 */
+ 0x7C82, 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, /* 0x40 */
+ 0x8A13, 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, /* 0x50 */
+ 0x50BE, 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, /* 0x50 */
+ 0x5F62, 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, /* 0x60 */
+ 0x656C, 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, /* 0x60 */
+ 0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, /* 0x70 */
+ 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0, /* 0x70 */
+ 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, /* 0x80 */
+ 0x6C7A, 0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, /* 0x80 */
+ 0x5039, 0x5026, 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, /* 0x90 */
+ 0x5805, 0x5ACC, 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, /* 0x90 */
+ 0x6A29, 0x727D, 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, /* 0xA0 */
+ 0x80A9, 0x898B, 0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, /* 0xA0 */
+ 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, /* 0xB0 */
+ 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, /* 0xB0 */
+ 0x9650, 0x4E4E, 0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, /* 0xC0 */
+ 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, /* 0xC0 */
+ 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, /* 0xD0 */
+ 0x9237, 0x96C7, 0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, /* 0xD0 */
+ 0x5449, 0x543E, 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, /* 0xE0 */
+ 0x745A, 0x7881, 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, /* 0xE0 */
+ 0x4EA4, 0x4F7C, 0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, /* 0xF0 */
+ 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D, 0x5B8F, /* 0x40 */
+ 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83, 0x5E9A, 0x5EB7, 0x5F18, /* 0x40 */
+ 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602, 0x6643, /* 0x50 */
+ 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB, 0x6C5F, 0x6D2A, 0x6D69, /* 0x50 */
+ 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C, 0x7A3F, 0x7CE0, 0x7D05, /* 0x60 */
+ 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, 0x80AF, 0x80B1, 0x8154, /* 0x60 */
+ 0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, 0x8CA2, 0x8CFC, /* 0x70 */
+ 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC, 0x95A4, 0x964D, 0, /* 0x70 */
+ 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408, /* 0x80 */
+ 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B, /* 0x80 */
+ 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2, 0x7344, 0x6F09, /* 0x90 */
+ 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB, 0x8FBC, 0x6B64, /* 0x90 */
+ 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A, 0x6068, 0x61C7, /* 0xA0 */
+ 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5, 0x7D3A, 0x826E, /* 0xA0 */
+ 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F, 0x5DE6, 0x5DEE, /* 0xB0 */
+ 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396, 0x88DF, 0x5750, /* 0xB0 */
+ 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700, 0x54C9, 0x585E, /* 0xC0 */
+ 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D, 0x6B73, 0x6E08, /* 0xC0 */
+ 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D, 0x658E, 0x7D30, /* 0xD0 */
+ 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728, 0x6750, 0x7F6A, /* 0xD0 */
+ 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A, 0x80B4, 0x54B2, /* 0xE0 */
+ 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A, 0x548B, 0x643E, /* 0xE0 */
+ 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22, 0x932F, 0x685C, /* 0xF0 */
+ 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5BDF, 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, /* 0x40 */
+ 0x7690, 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, /* 0x40 */
+ 0x5098, 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, /* 0x50 */
+ 0x73CA, 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, /* 0x50 */
+ 0x9910, 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, /* 0x60 */
+ 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, /* 0x60 */
+ 0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, /* 0x70 */
+ 0x652F, 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0, /* 0x70 */
+ 0x6B7B, 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, /* 0x80 */
+ 0x80A2, 0x8102, 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, /* 0x80 */
+ 0x8AEE, 0x8CC7, 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, /* 0x90 */
+ 0x4F8D, 0x5150, 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 0x6B21, /* 0x90 */
+ 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, /* 0xA0 */
+ 0x8033, 0x81EA, 0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, /* 0xA0 */
+ 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, /* 0xB0 */
+ 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, /* 0xB0 */
+ 0x5B9F, 0x8500, 0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, /* 0xC0 */
+ 0x7E1E, 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, /* 0xC0 */
+ 0x793E, 0x7D17, 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, /* 0xD0 */
+ 0x501F, 0x52FA, 0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, /* 0xD0 */
+ 0x932B, 0x82E5, 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, /* 0xE0 */
+ 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, /* 0xE0 */
+ 0x9152, 0x9996, 0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, /* 0xF0 */
+ 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32, 0x79C0, /* 0x40 */
+ 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED, 0x821F, 0x8490, 0x8846, /* 0x40 */
+ 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031, 0x914B, 0x916C, 0x96C6, /* 0x50 */
+ 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, 0x5F93, 0x620E, 0x67D4, /* 0x50 */
+ 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD, 0x9283, 0x53D4, 0x5919, /* 0x60 */
+ 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F, 0x51FA, /* 0x60 */
+ 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3, 0x821C, /* 0x70 */
+ 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F, 0x6B89, 0x6DF3, 0, /* 0x70 */
+ 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806, /* 0x80 */
+ 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2, /* 0x80 */
+ 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9, 0x53D9, 0x5973, /* 0x90 */
+ 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7, 0x511F, 0x52DD, /* 0x90 */
+ 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531, 0x5617, 0x5968, /* 0xA0 */
+ 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11, 0x5C1A, 0x5E84, /* 0xA0 */
+ 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB, 0x638C, 0x6377, /* 0xB0 */
+ 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2, 0x6A1F, 0x6A35, /* 0xB0 */
+ 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126, 0x7167, 0x75C7, /* 0xC0 */
+ 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0, 0x7B11, 0x7CA7, /* 0xC0 */
+ 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D, 0x88F3, 0x8A1F, /* 0xD0 */
+ 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4, 0x9266, 0x937E, /* 0xD0 */
+ 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, 0x4E57, 0x5197, /* 0xE0 */
+ 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, 0x60C5, 0x64FE, /* 0xE0 */
+ 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63, 0x84B8, 0x8B72, /* 0xF0 */
+ 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, /* 0x40 */
+ 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, /* 0x40 */
+ 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, /* 0x50 */
+ 0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, /* 0x50 */
+ 0x79E6, 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, /* 0x60 */
+ 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, /* 0x60 */
+ 0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, /* 0x70 */
+ 0x976D, 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0, /* 0x70 */
+ 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, /* 0x80 */
+ 0x7C8B, 0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, /* 0x80 */
+ 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, /* 0x90 */
+ 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, /* 0x90 */
+ 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, /* 0xA0 */
+ 0x52E2, 0x59D3, 0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, /* 0xA0 */
+ 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, /* 0xB0 */
+ 0x7CBE, 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, /* 0xB0 */
+ 0x901D, 0x9192, 0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, /* 0xC0 */
+ 0x5E2D, 0x60DC, 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, /* 0xC0 */
+ 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, /* 0xD0 */
+ 0x5207, 0x62D9, 0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, /* 0xD0 */
+ 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, /* 0xE0 */
+ 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, /* 0xE0 */
+ 0x6813, 0x6834, 0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, /* 0xF0 */
+ 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239, 0x85A6, 0x8A6E, 0x8CCE, /* 0x40 */
+ 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291, 0x9583, 0x9BAE, 0x524D, /* 0x40 */
+ 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, 0x81B3, 0x7CCE, /* 0x50 */
+ 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A, 0x72D9, /* 0x50 */
+ 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF, 0x7C97, 0x7D20, 0x7D44, /* 0x60 */
+ 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275, 0x53CC, /* 0x60 */
+ 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B, 0x5C64, /* 0x70 */
+ 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383, 0x633F, 0x63BB, 0, /* 0x70 */
+ 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD, 0x6F15, 0x71E5, /* 0x80 */
+ 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF, 0x7D9C, 0x8061, /* 0x80 */
+ 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5, 0x8D70, 0x9001, /* 0x90 */
+ 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E, 0x81D3, /* 0x90 */
+ 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247, 0x5373, 0x606F, /* 0xA0 */
+ 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7, 0x5C5E, 0x8CCA, /* 0xA0 */
+ 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3, 0x5B58, 0x5B6B, /* 0xB0 */
+ 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A, 0x592A, 0x6C70, /* 0xB0 */
+ 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253, 0x67C1, 0x8235, /* 0xC0 */
+ 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806, 0x5BFE, 0x8010, /* 0xC0 */
+ 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234, 0x66FF, 0x6CF0, /* 0xD0 */
+ 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8, 0x9000, 0x902E, /* 0xD0 */
+ 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927, 0x7B2C, 0x918D, /* 0xE0 */
+ 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544, 0x5B85, 0x6258, /* 0xE0 */
+ 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17, 0x9438, 0x6FC1, /* 0xF0 */
+ 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, /* 0x40 */
+ 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, /* 0x40 */
+ 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, /* 0x50 */
+ 0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, /* 0x50 */
+ 0x86CB, 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, /* 0x60 */
+ 0x6A80, 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, /* 0x60 */
+ 0x6065, 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, /* 0x70 */
+ 0x9045, 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0, /* 0x70 */
+ 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, /* 0x80 */
+ 0x5B99, 0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, /* 0x80 */
+ 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, /* 0x90 */
+ 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, /* 0x90 */
+ 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, /* 0xA0 */
+ 0x66A2, 0x671D, 0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, /* 0xA0 */
+ 0x8178, 0x8776, 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, /* 0xB0 */
+ 0x9802, 0x9CE5, 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, /* 0xB0 */
+ 0x8CC3, 0x93AE, 0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, /* 0xC0 */
+ 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, /* 0xC0 */
+ 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, /* 0xD0 */
+ 0x576A, 0x58F7, 0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, /* 0xD0 */
+ 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, /* 0xE0 */
+ 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, /* 0xE0 */
+ 0x633A, 0x63D0, 0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, /* 0xF0 */
+ 0x8247, 0x8A02, 0x8AE6, 0x8E44, 0x9013 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, 0x64E2, 0x6575, /* 0x40 */
+ 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1, 0x6EBA, 0x54F2, 0x5FB9, /* 0x40 */
+ 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929, 0x5C55, /* 0x50 */
+ 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B, 0x70B9, /* 0x50 */
+ 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB, 0x514E, 0x5410, 0x5835, /* 0x60 */
+ 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21, 0x767B, /* 0x60 */
+ 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D, 0x7825, 0x783A, 0x52AA, /* 0x70 */
+ 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012, 0x515A, 0x51AC, 0, /* 0x70 */
+ 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5B95, 0x5CF6, /* 0x80 */
+ 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, 0x68DF, /* 0x80 */
+ 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8, 0x5F53, 0x75D8, /* 0x90 */
+ 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230, 0x8463, /* 0x90 */
+ 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F, 0x9003, 0x900F, /* 0xA0 */
+ 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD, 0x52D5, 0x540C, /* 0xA0 */
+ 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3, 0x7AE5, 0x80F4, /* 0xB0 */
+ 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F, 0x5F97, 0x5FB3, /* 0xB0 */
+ 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2, 0x72EC, 0x8AAD, /* 0xC0 */
+ 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A, 0x9CF6, 0x82EB, /* 0xC0 */
+ 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7, 0x6566, 0x6C8C, /* 0xD0 */
+ 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D, 0x5948, 0x90A3, /* 0xD0 */
+ 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058, 0x637A, 0x934B, /* 0xE0 */
+ 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960, 0x8EDF, 0x96E3, /* 0xE0 */
+ 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302, 0x8CD1, 0x8089, /* 0xF0 */
+ 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, /* 0x40 */
+ 0x79B0, 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, /* 0x40 */
+ 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, /* 0x50 */
+ 0x56A2, 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, /* 0x50 */
+ 0x8997, 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, /* 0x60 */
+ 0x6D3E, 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, /* 0x60 */
+ 0x5EC3, 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, /* 0x70 */
+ 0x80BA, 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0, /* 0x70 */
+ 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, /* 0x80 */
+ 0x877F, 0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, /* 0x80 */
+ 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, /* 0x90 */
+ 0x66DD, 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, /* 0x90 */
+ 0x7BB1, 0x7872, 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, /* 0xA0 */
+ 0x7551, 0x7560, 0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, /* 0xA0 */
+ 0x4F10, 0x7F70, 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, /* 0xB0 */
+ 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, /* 0xB0 */
+ 0x642C, 0x6591, 0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, /* 0xC0 */
+ 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, /* 0xC0 */
+ 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, /* 0xD0 */
+ 0x86EE, 0x532A, 0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, /* 0xD0 */
+ 0x6249, 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, /* 0xE0 */
+ 0x7891, 0x79D8, 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, /* 0xE0 */
+ 0x907F, 0x975E, 0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, /* 0xF0 */
+ 0x6787, 0x6BD8, 0x7435, 0x7709, 0x7F8E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66, 0x819D, /* 0x40 */
+ 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562, 0x7B46, 0x903C, 0x6867, /* 0x40 */
+ 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A, 0x6A19, /* 0x50 */
+ 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79, 0x5EDF, /* 0x50 */
+ 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328, 0x92F2, 0x849C, 0x86ED, /* 0x60 */
+ 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C, 0x7015, 0x8CA7, 0x8CD3, /* 0x60 */
+ 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, 0x57E0, 0x592B, 0x5A66, /* 0x70 */
+ 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016, 0x6276, 0x6577, 0, /* 0x70 */
+ 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299, /* 0x80 */
+ 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB, /* 0x80 */
+ 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01, 0x6953, 0x98A8, /* 0x90 */
+ 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D, 0x798F, /* 0x90 */
+ 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255, 0x6CB8, 0x4ECF, /* 0xA0 */
+ 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3, 0x61A4, 0x626E, /* 0xA0 */
+ 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0, 0x6587, 0x805E, /* 0xB0 */
+ 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73, 0x5F0A, 0x67C4, /* 0xB0 */
+ 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801, 0x50FB, 0x58C1, /* 0xC0 */
+ 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86, 0x504F, 0x5909, /* 0xC0 */
+ 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D, 0x4FBF, 0x52C9, /* 0xD0 */
+ 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA, 0x5703, 0x6355, /* 0xD0 */
+ 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF, 0x5893, 0x6155, /* 0xE0 */
+ 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023, 0x4FF8, 0x5305, /* 0xE0 */
+ 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF, 0x5D29, 0x5E96, /* 0xF0 */
+ 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, /* 0x40 */
+ 0x84EC, 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, /* 0x40 */
+ 0x9CF3, 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, /* 0x50 */
+ 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, /* 0x50 */
+ 0x5192, 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, /* 0x60 */
+ 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, /* 0x60 */
+ 0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, /* 0x70 */
+ 0x5800, 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0, /* 0x70 */
+ 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, /* 0x80 */
+ 0x6BCE, 0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, /* 0x80 */
+ 0x9C52, 0x685D, 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, /* 0x90 */
+ 0x8FC4, 0x4FAD, 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, /* 0x90 */
+ 0x8513, 0x5473, 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, /* 0xA0 */
+ 0x871C, 0x6E4A, 0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, /* 0xA0 */
+ 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, /* 0xB0 */
+ 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, /* 0xB0 */
+ 0x8FF7, 0x9298, 0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, /* 0xC0 */
+ 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, /* 0xC0 */
+ 0x5B5F, 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, /* 0xD0 */
+ 0x6728, 0x9ED9, 0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, /* 0xD0 */
+ 0x7C7E, 0x8CB0, 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, /* 0xE0 */
+ 0x51B6, 0x591C, 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, /* 0xE0 */
+ 0x5F79, 0x7D04, 0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, /* 0xF0 */
+ 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB, 0x5BA5, /* 0x40 */
+ 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709, 0x67DA, 0x6E67, 0x6D8C, /* 0x40 */
+ 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5, 0x8A98, 0x904A, 0x9091, /* 0x50 */
+ 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88, 0x4F59, 0x4E0E, 0x8A89, /* 0x50 */
+ 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996, 0x5BB9, 0x5EB8, 0x63DA, /* 0x60 */
+ 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, 0x6EB6, 0x7194, /* 0x60 */
+ 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981, 0x8B21, /* 0x70 */
+ 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E, 0x6291, 0x6B32, 0, /* 0x70 */
+ 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8, /* 0x80 */
+ 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A, /* 0x80 */
+ 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD, 0x862D, 0x89A7, /* 0x90 */
+ 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406, 0x7483, 0x75E2, /* 0x90 */
+ 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B, 0x7387, 0x7ACB, /* 0xA0 */
+ 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C, 0x7409, 0x7559, /* 0xA0 */
+ 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6, 0x616E, 0x65C5, /* 0xB0 */
+ 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC, 0x5BEE, 0x6599, /* 0xB0 */
+ 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C, 0x7CE7, 0x826F, /* 0xC0 */
+ 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B, 0x7DD1, 0x502B, /* 0xC0 */
+ 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8, 0x8F2A, 0x96A3, /* 0xD0 */
+ 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F, 0x985E, 0x4EE4, /* 0xD0 */
+ 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C, 0x73B2, 0x793C, /* 0xE0 */
+ 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97, 0x9F62, 0x66A6, /* 0xE0 */
+ 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9, 0x604B, 0x6190, /* 0xF0 */
+ 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x84EE, 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, /* 0x40 */
+ 0x8DEF, 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, /* 0x40 */
+ 0x6994, 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, /* 0x50 */
+ 0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, /* 0x50 */
+ 0x502D, 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, /* 0x60 */
+ 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, /* 0x60 */
+ 0x6E7E, 0x7897, 0x8155, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5F0C, /* 0x90 */
+ 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36, 0x4E3C, 0x4E3F, 0x4E42, /* 0xA0 */
+ 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B, 0x4E8A, 0x8212, 0x5F0D, /* 0xA0 */
+ 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0, 0x4EB3, 0x4EB6, /* 0xB0 */
+ 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7, 0x4EDE, 0x4EED, /* 0xB0 */
+ 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30, 0x4F5B, 0x4F5D, 0x4F57, /* 0xC0 */
+ 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B, 0x4F69, 0x4F70, /* 0xC0 */
+ 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4, 0x4FDF, 0x4FCE, /* 0xD0 */
+ 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0, 0x4FE4, 0x4FE5, 0x501A, /* 0xD0 */
+ 0x5028, 0x5014, 0x502A, 0x5025, 0x5005, 0x4F1C, 0x4FF6, 0x5021, /* 0xE0 */
+ 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011, 0x5006, 0x5043, 0x5047, /* 0xE0 */
+ 0x6703, 0x5055, 0x5050, 0x5048, 0x505A, 0x5056, 0x506C, 0x5078, /* 0xF0 */
+ 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED, /* 0x40 */
+ 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116, /* 0x40 */
+ 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B, /* 0x50 */
+ 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169, /* 0x50 */
+ 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F, /* 0x60 */
+ 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9, /* 0x60 */
+ 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD, /* 0x70 */
+ 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0, /* 0x70 */
+ 0x51F0, 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, /* 0x80 */
+ 0x522A, 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, /* 0x80 */
+ 0x525E, 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, /* 0x90 */
+ 0x528D, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 0x8FA7, /* 0x90 */
+ 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, /* 0xA0 */
+ 0x52E3, 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, /* 0xA0 */
+ 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, /* 0xB0 */
+ 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, /* 0xB0 */
+ 0x4E17, 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, /* 0xC0 */
+ 0x537B, 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, /* 0xC0 */
+ 0x53B0, 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, /* 0xD0 */
+ 0x53EE, 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, /* 0xD0 */
+ 0x542D, 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, /* 0xE0 */
+ 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, /* 0xE0 */
+ 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, /* 0xF0 */
+ 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x54AB, 0x54C2, 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5, 0x54E6, /* 0x40 */
+ 0x550F, 0x5514, 0x54FD, 0x54EE, 0x54ED, 0x54FA, 0x54E2, 0x5539, /* 0x40 */
+ 0x5540, 0x5563, 0x554C, 0x552E, 0x555C, 0x5545, 0x5556, 0x5557, /* 0x50 */
+ 0x5538, 0x5533, 0x555D, 0x5599, 0x5580, 0x54AF, 0x558A, 0x559F, /* 0x50 */
+ 0x557B, 0x557E, 0x5598, 0x559E, 0x55AE, 0x557C, 0x5583, 0x55A9, /* 0x60 */
+ 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC, 0x55E4, /* 0x60 */
+ 0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B, 0x55F9, /* 0x70 */
+ 0x564E, 0x5650, 0x71DF, 0x5634, 0x5636, 0x5632, 0x5638, 0, /* 0x70 */
+ 0x566B, 0x5664, 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A, /* 0x80 */
+ 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2, /* 0x80 */
+ 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8, 0x56CE, 0x56D1, 0x56D3, /* 0x90 */
+ 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, 0x5704, 0x5709, 0x5708, /* 0x90 */
+ 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7, 0x571C, 0x5726, /* 0xA0 */
+ 0x5737, 0x5738, 0x574E, 0x573B, 0x5740, 0x574F, 0x5769, 0x57C0, /* 0xA0 */
+ 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0, 0x57B3, 0x57A4, /* 0xB0 */
+ 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2, 0x57D3, 0x580A, /* 0xB0 */
+ 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D, 0x5872, 0x5821, 0x5862, /* 0xC0 */
+ 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D, 0x5879, 0x5885, 0x58B9, /* 0xC0 */
+ 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB, 0x58B8, 0x58AE, 0x58C5, /* 0xD0 */
+ 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8, 0x58E5, 0x58DC, 0x58E4, /* 0xD0 */
+ 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, 0x58FC, 0x58FD, 0x5902, /* 0xE0 */
+ 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C, 0x592D, 0x5932, /* 0xE0 */
+ 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950, 0x594E, 0x595A, 0x5958, /* 0xF0 */
+ 0x5962, 0x5960, 0x5967, 0x596C, 0x5969 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6, /* 0x40 */
+ 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11, /* 0x40 */
+ 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36, /* 0x50 */
+ 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD, /* 0x50 */
+ 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C, /* 0x60 */
+ 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43, /* 0x60 */
+ 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69, /* 0x70 */
+ 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0, /* 0x70 */
+ 0x5B83, 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, /* 0x80 */
+ 0x5BE4, 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, /* 0x80 */
+ 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, /* 0x90 */
+ 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 0x5C50, /* 0x90 */
+ 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, /* 0xA0 */
+ 0x5C91, 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, /* 0xA0 */
+ 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, /* 0xB0 */
+ 0x5D8C, 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, /* 0xB0 */
+ 0x5D11, 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, /* 0xC0 */
+ 0x5D4E, 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, /* 0xC0 */
+ 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, /* 0xD0 */
+ 0x5DC9, 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, /* 0xD0 */
+ 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, /* 0xE0 */
+ 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, /* 0xE0 */
+ 0x5E64, 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, /* 0xF0 */
+ 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, /* 0x40 */
+ 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, /* 0x40 */
+ 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, 0x5F16, 0x5F29, /* 0x50 */
+ 0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, /* 0x50 */
+ 0x5F56, 0x5F57, 0x5F59, 0x5F61, 0x5F6D, 0x5F73, 0x5F77, 0x5F83, /* 0x60 */
+ 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E, 0x5F99, /* 0x60 */
+ 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, /* 0x70 */
+ 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3, 0x5FFF, 0x6021, 0x6060, 0, /* 0x70 */
+ 0x6019, 0x6010, 0x6029, 0x600E, 0x6031, 0x601B, 0x6015, 0x602B, /* 0x80 */
+ 0x6026, 0x600F, 0x603A, 0x605A, 0x6041, 0x606A, 0x6077, 0x605F, /* 0x80 */
+ 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 0x6064, 0x6042, 0x606C, /* 0x90 */
+ 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A, 0x6084, /* 0x90 */
+ 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B, 0x60E1, 0x60B8, /* 0xA0 */
+ 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD, 0x60C6, 0x60B5, 0x60D8, /* 0xA0 */
+ 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100, 0x60F4, 0x60FA, /* 0xB0 */
+ 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D, 0x610E, 0x6147, 0x613E, /* 0xB0 */
+ 0x6128, 0x6127, 0x614A, 0x613F, 0x613C, 0x612C, 0x6134, 0x613D, /* 0xC0 */
+ 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615A, 0x616B, /* 0xC0 */
+ 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, 0x615D, 0x6153, 0x6175, /* 0xD0 */
+ 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194, 0x619A, 0x618A, 0x6191, /* 0xD0 */
+ 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7, 0x61C8, 0x61C3, /* 0xE0 */
+ 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6, 0x61E3, 0x61F6, /* 0xE0 */
+ 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC, 0x61FE, 0x6200, 0x6208, /* 0xF0 */
+ 0x6209, 0x620D, 0x620C, 0x6214, 0x621B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241, /* 0x40 */
+ 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282, /* 0x40 */
+ 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294, /* 0x50 */
+ 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8, /* 0x50 */
+ 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C, /* 0x60 */
+ 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350, /* 0x60 */
+ 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB, /* 0x70 */
+ 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0, /* 0x70 */
+ 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, /* 0x80 */
+ 0x63F6, 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, /* 0x80 */
+ 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, /* 0x90 */
+ 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, /* 0x90 */
+ 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, /* 0xA0 */
+ 0x8209, 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, /* 0xA0 */
+ 0x64F4, 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, /* 0xB0 */
+ 0x6524, 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, /* 0xB0 */
+ 0x754B, 0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, /* 0xC0 */
+ 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, /* 0xC0 */
+ 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, /* 0xD0 */
+ 0x65D9, 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, /* 0xD0 */
+ 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, /* 0xE0 */
+ 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, /* 0xE0 */
+ 0x6670, 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, /* 0xF0 */
+ 0x66C1, 0x66B9, 0x66C9, 0x66BE, 0x66BC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, 0x66E6, 0x66E9, /* 0x40 */
+ 0x66F0, 0x66F5, 0x66F7, 0x670F, 0x6716, 0x671E, 0x6726, 0x6727, /* 0x40 */
+ 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, /* 0x50 */
+ 0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67A9, /* 0x50 */
+ 0x677C, 0x676A, 0x678C, 0x678B, 0x67A6, 0x67A1, 0x6785, 0x67B7, /* 0x60 */
+ 0x67EF, 0x67B4, 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4, 0x67DE, /* 0x60 */
+ 0x67DD, 0x67E2, 0x67EE, 0x67B9, 0x67CE, 0x67C6, 0x67E7, 0x6A9C, /* 0x70 */
+ 0x681E, 0x6846, 0x6829, 0x6840, 0x684D, 0x6832, 0x684E, 0, /* 0x70 */
+ 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, 0x689F, 0x688F, /* 0x80 */
+ 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, 0x6874, /* 0x80 */
+ 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 0x687E, 0x6901, 0x68CA, /* 0x90 */
+ 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD, 0x68D4, /* 0x90 */
+ 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7, 0x68E3, 0x6925, /* 0xA0 */
+ 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A, 0x691A, 0x6923, 0x6921, /* 0xA0 */
+ 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978, 0x696B, 0x6954, 0x697E, /* 0xB0 */
+ 0x696E, 0x6939, 0x6974, 0x693D, 0x6959, 0x6930, 0x6961, 0x695E, /* 0xB0 */
+ 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE, 0x69D0, 0x69BF, 0x69C1, /* 0xC0 */
+ 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD, 0x69BB, 0x69C3, /* 0xC0 */
+ 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995, 0x69B4, 0x69DE, /* 0xD0 */
+ 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A, 0x69F9, 0x69F2, 0x69E7, /* 0xD0 */
+ 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB, 0x6A0A, 0x6A12, /* 0xE0 */
+ 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72, 0x6A36, 0x6A78, /* 0xE0 */
+ 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48, 0x6A38, 0x6A22, 0x6A90, /* 0xF0 */
+ 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC, /* 0x40 */
+ 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05, /* 0x40 */
+ 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37, /* 0x50 */
+ 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59, /* 0x50 */
+ 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80, /* 0x60 */
+ 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA, /* 0x60 */
+ 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6, /* 0x70 */
+ 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0, /* 0x70 */
+ 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, /* 0x80 */
+ 0x6C55, 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, /* 0x80 */
+ 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, /* 0x90 */
+ 0x6CBD, 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, /* 0x90 */
+ 0x6CDB, 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, /* 0xA0 */
+ 0x6D3D, 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, /* 0xA0 */
+ 0x6D93, 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, /* 0xB0 */
+ 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, /* 0xB0 */
+ 0x6DC6, 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, /* 0xC0 */
+ 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, /* 0xC0 */
+ 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, /* 0xD0 */
+ 0x6E4D, 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, /* 0xD0 */
+ 0x6E38, 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, /* 0xE0 */
+ 0x6EAF, 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, /* 0xE0 */
+ 0x6E9F, 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, /* 0xF0 */
+ 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, 0x6ECC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81, 0x6F80, /* 0x40 */
+ 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 0x6F82, 0x6F7C, 0x6F58, 0x6F8E, /* 0x40 */
+ 0x6F91, 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, /* 0x50 */
+ 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, /* 0x50 */
+ 0x6FEE, 0x6FDB, 0x7009, 0x700B, 0x6FFA, 0x7011, 0x7001, 0x700F, /* 0x60 */
+ 0x6FFE, 0x701B, 0x701A, 0x6F74, 0x701D, 0x7018, 0x701F, 0x7030, /* 0x60 */
+ 0x703E, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70AF, 0x70F1, /* 0x70 */
+ 0x70AC, 0x70B8, 0x70B3, 0x70AE, 0x70DF, 0x70CB, 0x70DD, 0, /* 0x70 */
+ 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188, /* 0x80 */
+ 0x7166, 0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184, /* 0x80 */
+ 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9, 0x71BE, 0x71D2, 0x71C9, /* 0x90 */
+ 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC, 0x71F9, /* 0x90 */
+ 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228, 0x722D, 0x722C, 0x7230, /* 0xA0 */
+ 0x7232, 0x723B, 0x723C, 0x723F, 0x7240, 0x7246, 0x724B, 0x7258, /* 0xA0 */
+ 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 0x72A2, /* 0xB0 */
+ 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4, 0x72CE, 0x72D2, /* 0xB0 */
+ 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7, 0x500F, 0x7317, 0x730A, /* 0xC0 */
+ 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329, 0x7325, 0x733E, /* 0xC0 */
+ 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368, 0x7370, 0x7378, /* 0xD0 */
+ 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3, 0x73CE, 0x73BB, 0x73C0, /* 0xD0 */
+ 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405, 0x746F, 0x7425, 0x73F8, /* 0xE0 */
+ 0x7432, 0x743A, 0x7455, 0x743F, 0x745F, 0x7459, 0x7441, 0x745C, /* 0xE0 */
+ 0x7469, 0x7470, 0x7463, 0x746A, 0x7476, 0x747E, 0x748B, 0x749E, /* 0xF0 */
+ 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1, /* 0x40 */
+ 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D, /* 0x40 */
+ 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D, /* 0x50 */
+ 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567, /* 0x50 */
+ 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A, /* 0x60 */
+ 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2, /* 0x60 */
+ 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD, /* 0x70 */
+ 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0, /* 0x70 */
+ 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, /* 0x80 */
+ 0x7609, 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, /* 0x80 */
+ 0x7630, 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, /* 0x90 */
+ 0x7662, 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, /* 0x90 */
+ 0x7676, 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, /* 0xA0 */
+ 0x7696, 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, /* 0xA0 */
+ 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, /* 0xB0 */
+ 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, /* 0xB0 */
+ 0x7724, 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, /* 0xC0 */
+ 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, /* 0xC0 */
+ 0x778E, 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, /* 0xD0 */
+ 0x77BF, 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, /* 0xD0 */
+ 0x77DC, 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, /* 0xE0 */
+ 0x792A, 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, /* 0xE0 */
+ 0x78A3, 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, /* 0xF0 */
+ 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x78E7, 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911, 0x7919, /* 0x40 */
+ 0x792C, 0x792B, 0x7940, 0x7960, 0x7957, 0x795F, 0x795A, 0x7955, /* 0x40 */
+ 0x7953, 0x797A, 0x797F, 0x798A, 0x799D, 0x79A7, 0x9F4B, 0x79AA, /* 0x50 */
+ 0x79AE, 0x79B3, 0x79B9, 0x79BA, 0x79C9, 0x79D5, 0x79E7, 0x79EC, /* 0x50 */
+ 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 0x7A18, 0x7A19, 0x7A20, 0x7A1F, /* 0x60 */
+ 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, 0x7A57, 0x7A49, /* 0x60 */
+ 0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D, 0x7A88, /* 0x70 */
+ 0x7A97, 0x7A95, 0x7A98, 0x7A96, 0x7AA9, 0x7AC8, 0x7AB0, 0, /* 0x70 */
+ 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD, /* 0x80 */
+ 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2, /* 0x80 */
+ 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F, 0x7B0A, 0x7B06, 0x7B33, /* 0x90 */
+ 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28, 0x7B36, 0x7B50, 0x7B7A, /* 0x90 */
+ 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, 0x7B75, 0x7B65, 0x7B74, /* 0xA0 */
+ 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E, 0x7B9D, 0x7B98, 0x7B9F, /* 0xA0 */
+ 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F, 0x7B5D, 0x7B99, /* 0xB0 */
+ 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6, 0x7BDD, 0x7BE9, /* 0xB0 */
+ 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60, 0x7C00, 0x7C07, 0x7C13, /* 0xC0 */
+ 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23, 0x7C27, 0x7C2A, /* 0xC0 */
+ 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43, 0x7C54, 0x7C4F, /* 0xD0 */
+ 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64, 0x7C56, 0x7C65, 0x7C6C, /* 0xD0 */
+ 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD, 0x7CA2, 0x7CAB, 0x7CA1, /* 0xE0 */
+ 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, 0x7CB9, 0x7CBD, 0x7CC0, /* 0xE0 */
+ 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC, 0x7CE2, 0x9B3B, 0x7CEF, /* 0xF0 */
+ 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32, /* 0x40 */
+ 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68, /* 0x40 */
+ 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D, /* 0x50 */
+ 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB, /* 0x50 */
+ 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8, /* 0x60 */
+ 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A, /* 0x60 */
+ 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22, /* 0x70 */
+ 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0, /* 0x70 */
+ 0x7E32, 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, /* 0x80 */
+ 0x7E79, 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, /* 0x80 */
+ 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, /* 0x90 */
+ 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 0x7F45, /* 0x90 */
+ 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, /* 0xA0 */
+ 0x7F5F, 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, /* 0xA0 */
+ 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, /* 0xB0 */
+ 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, /* 0xB0 */
+ 0x7FC5, 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, /* 0xC0 */
+ 0x7FF3, 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, /* 0xC0 */
+ 0x8019, 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, /* 0xD0 */
+ 0x8052, 0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, /* 0xD0 */
+ 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, /* 0xE0 */
+ 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, /* 0xE0 */
+ 0x80D9, 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, /* 0xF0 */
+ 0x811B, 0x8129, 0x8123, 0x812F, 0x814B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x968B, 0x8146, 0x813E, 0x8153, 0x8151, 0x80FC, 0x8171, 0x816E, /* 0x40 */
+ 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818A, 0x8180, 0x8182, /* 0x40 */
+ 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, 0x8193, 0x81A9, 0x81B0, /* 0x50 */
+ 0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, 0x81BA, 0x81C9, /* 0x50 */
+ 0x81CD, 0x81D1, 0x81D9, 0x81D8, 0x81C8, 0x81DA, 0x81DF, 0x81E0, /* 0x60 */
+ 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205, 0x8207, /* 0x60 */
+ 0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238, 0x8233, /* 0x70 */
+ 0x8240, 0x8259, 0x8258, 0x825D, 0x825A, 0x825F, 0x8264, 0, /* 0x70 */
+ 0x8262, 0x8268, 0x826A, 0x826B, 0x822E, 0x8271, 0x8277, 0x8278, /* 0x80 */
+ 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F, 0x82BB, 0x82AC, 0x82E1, /* 0x80 */
+ 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, 0x82FA, 0x8393, 0x8303, /* 0x90 */
+ 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, 0x82D9, 0x8335, /* 0x90 */
+ 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, /* 0xA0 */
+ 0x832F, 0x832B, 0x8317, 0x8318, 0x8385, 0x839A, 0x83AA, 0x839F, /* 0xA0 */
+ 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A, 0x837C, 0x83B5, /* 0xB0 */
+ 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4, 0x8413, 0x83EB, /* 0xB0 */
+ 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B, 0x83C1, 0x83F7, 0x8407, /* 0xC0 */
+ 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420, 0x83BD, 0x8438, 0x8506, /* 0xC0 */
+ 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A, 0x8484, 0x8477, 0x846B, /* 0xD0 */
+ 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446, 0x842C, 0x846F, 0x8479, /* 0xD0 */
+ 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F, 0x84D9, 0x84CD, /* 0xE0 */
+ 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6, 0x84A1, 0x8521, /* 0xE0 */
+ 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C, 0x851F, 0x8515, 0x8514, /* 0xF0 */
+ 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591, /* 0x40 */
+ 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C, /* 0x40 */
+ 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0, /* 0x50 */
+ 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B, /* 0x50 */
+ 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D, /* 0x60 */
+ 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9, /* 0x60 */
+ 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0, /* 0x70 */
+ 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0, /* 0x70 */
+ 0x86DF, 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, /* 0x80 */
+ 0x86FB, 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, /* 0x80 */
+ 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, /* 0x90 */
+ 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 0x8753, /* 0x90 */
+ 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, /* 0xA0 */
+ 0x87BD, 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, /* 0xA0 */
+ 0x87C6, 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, /* 0xB0 */
+ 0x87F6, 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, /* 0xB0 */
+ 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, /* 0xC0 */
+ 0x8852, 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, /* 0xC0 */
+ 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, /* 0xD0 */
+ 0x8899, 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, /* 0xD0 */
+ 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, /* 0xE0 */
+ 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, /* 0xE0 */
+ 0x891E, 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, /* 0xF0 */
+ 0x8938, 0x894C, 0x891D, 0x8960, 0x895E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8966, 0x8964, 0x896D, 0x896A, 0x896F, 0x8974, 0x8977, 0x897E, /* 0x40 */
+ 0x8983, 0x8988, 0x898A, 0x8993, 0x8998, 0x89A1, 0x89A9, 0x89A6, /* 0x40 */
+ 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0, 0x89DA, /* 0x50 */
+ 0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16, 0x8A10, /* 0x50 */
+ 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 0x8A36, 0x8A41, 0x8A5B, 0x8A52, /* 0x60 */
+ 0x8A46, 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85, 0x8A82, /* 0x60 */
+ 0x8A84, 0x8AA8, 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, /* 0x70 */
+ 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA, 0x8AEB, 0x8AF3, 0x8AE7, 0, /* 0x70 */
+ 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, 0x8AF7, 0x8ADE, 0x8ADB, /* 0x80 */
+ 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, 0x8B17, 0x8B20, /* 0x80 */
+ 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 0x8B28, 0x8B41, 0x8B4C, /* 0x90 */
+ 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B, 0x8B5F, /* 0x90 */
+ 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C, 0x8B8E, 0x8B92, /* 0xA0 */
+ 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A, 0x8C41, 0x8C3F, 0x8C48, /* 0xA0 */
+ 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62, 0x8C6C, 0x8C78, 0x8C7A, /* 0xB0 */
+ 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D, 0x8C8E, 0x8C94, 0x8C7C, /* 0xB0 */
+ 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD, 0x8CB2, 0x8CB3, 0x8CAE, /* 0xC0 */
+ 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, 0x8CDA, 0x8CFD, 0x8CFA, /* 0xC0 */
+ 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F, 0x8D0D, 0x8D10, /* 0xD0 */
+ 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16, 0x8D67, 0x8D6D, 0x8D71, /* 0xD0 */
+ 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA, 0x8DCF, 0x8DDA, /* 0xE0 */
+ 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB, 0x8DDF, 0x8DE3, /* 0xE0 */
+ 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D, 0x8E1E, 0x8E10, 0x8E1F, /* 0xF0 */
+ 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60, /* 0x40 */
+ 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87, /* 0x40 */
+ 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99, /* 0x50 */
+ 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5, /* 0x50 */
+ 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE, /* 0x60 */
+ 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F, /* 0x60 */
+ 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42, /* 0x70 */
+ 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0, /* 0x70 */
+ 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, /* 0x80 */
+ 0x8FB7, 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, /* 0x80 */
+ 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, /* 0x90 */
+ 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, /* 0x90 */
+ 0x9050, 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, /* 0xA0 */
+ 0x905E, 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, /* 0xA0 */
+ 0x9081, 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, /* 0xB0 */
+ 0x90B5, 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, /* 0xB0 */
+ 0x9132, 0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, /* 0xC0 */
+ 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, /* 0xC0 */
+ 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, /* 0xD0 */
+ 0x91D0, 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, /* 0xD0 */
+ 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, /* 0xE0 */
+ 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, /* 0xE0 */
+ 0x929C, 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, /* 0xF0 */
+ 0x92E9, 0x930F, 0x92FA, 0x9344, 0x932E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B, 0x935C, /* 0x40 */
+ 0x9360, 0x937C, 0x936E, 0x9356, 0x93B0, 0x93AC, 0x93AD, 0x9394, /* 0x40 */
+ 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3, 0x93DD, /* 0x50 */
+ 0x93D0, 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403, 0x9407, /* 0x50 */
+ 0x9410, 0x9436, 0x942B, 0x9435, 0x9421, 0x943A, 0x9441, 0x9452, /* 0x60 */
+ 0x9444, 0x945B, 0x9460, 0x9462, 0x945E, 0x946A, 0x9229, 0x9470, /* 0x60 */
+ 0x9475, 0x9477, 0x947D, 0x945A, 0x947C, 0x947E, 0x9481, 0x947F, /* 0x70 */
+ 0x9582, 0x9587, 0x958A, 0x9594, 0x9596, 0x9598, 0x9599, 0, /* 0x70 */
+ 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, 0x95BE, /* 0x80 */
+ 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6, /* 0x80 */
+ 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 0x9628, 0x962E, 0x962F, /* 0x90 */
+ 0x9642, 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E, 0x965D, /* 0x90 */
+ 0x965F, 0x9666, 0x9672, 0x966C, 0x968D, 0x9698, 0x9695, 0x9697, /* 0xA0 */
+ 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0, 0x96B4, 0x96B6, 0x96B8, /* 0xA0 */
+ 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD, 0x894D, 0x96DC, 0x970D, /* 0xB0 */
+ 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970E, 0x9711, /* 0xB0 */
+ 0x970F, 0x9716, 0x9719, 0x9724, 0x972A, 0x9730, 0x9739, 0x973D, /* 0xC0 */
+ 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975C, 0x9760, /* 0xC0 */
+ 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771, 0x9779, 0x9785, /* 0xD0 */
+ 0x977C, 0x9781, 0x977A, 0x9786, 0x978B, 0x978F, 0x9790, 0x979C, /* 0xD0 */
+ 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3, 0x97C6, 0x97C8, /* 0xE0 */
+ 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2, 0x7ADF, 0x97F6, 0x97F5, /* 0xE0 */
+ 0x980F, 0x980C, 0x9838, 0x9824, 0x9821, 0x9837, 0x983D, 0x9846, /* 0xF0 */
+ 0x984F, 0x984B, 0x986B, 0x986F, 0x9870 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_E9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4, /* 0x40 */
+ 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914, /* 0x40 */
+ 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E, /* 0x50 */
+ 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951, /* 0x50 */
+ 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE, /* 0x60 */
+ 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE, /* 0x60 */
+ 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2, /* 0x70 */
+ 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0, /* 0x70 */
+ 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, /* 0x80 */
+ 0x9A64, 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, /* 0x80 */
+ 0x9ACF, 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, /* 0x90 */
+ 0x9AE6, 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, /* 0x90 */
+ 0x9B06, 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, /* 0xA0 */
+ 0x9B28, 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, /* 0xA0 */
+ 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, /* 0xB0 */
+ 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, /* 0xB0 */
+ 0x9BCA, 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, /* 0xC0 */
+ 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, /* 0xC0 */
+ 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, /* 0xD0 */
+ 0x9C04, 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, /* 0xD0 */
+ 0x9C32, 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, /* 0xE0 */
+ 0x9CE7, 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, /* 0xE0 */
+ 0x9D2A, 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, /* 0xF0 */
+ 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_SJIS_EA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72, 0x9D89, /* 0x40 */
+ 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A, 0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, /* 0x40 */
+ 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, /* 0x50 */
+ 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, /* 0x50 */
+ 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, 0x9E7D, 0x9E81, 0x9E88, 0x9E8B, /* 0x60 */
+ 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, /* 0x60 */
+ 0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, /* 0x70 */
+ 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 0x9EE5, 0x9EE8, 0x9EEF, 0, /* 0x70 */
+ 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07, /* 0x80 */
+ 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52, /* 0x80 */
+ 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61, 0x9F66, 0x9F67, 0x9F6C, /* 0x90 */
+ 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95, 0x9F9C, 0x9FA0, 0x582F, /* 0x90 */
+ 0x69C7, 0x9059, 0x7464, 0x51DC, 0x7199 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_APPLEJAPANESE_EB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE33, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xFE31, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xFE30, 0, 0, 0, /* 0x60 */
+ 0, 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0, 0, 0xFE37, /* 0x60 */
+ 0xFE38, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, /* 0x70 */
+ 0xFE44, 0xFE3B, 0xFE3C /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_MS932_ED[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7E8A, 0x891C, 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, /* 0x40 */
+ 0x68C8, 0x92F9, 0x66FB, 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, /* 0x40 */
+ 0x4F03, 0x4F39, 0x4F56, 0x4F92, 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, /* 0x50 */
+ 0x5040, 0x5022, 0x4FFF, 0x501E, 0x5046, 0x5070, 0x5042, 0x5094, /* 0x50 */
+ 0x50F4, 0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, /* 0x60 */
+ 0x529C, 0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, /* 0x60 */
+ 0x5393, 0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, /* 0x70 */
+ 0x5586, 0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0, /* 0x70 */
+ 0xFA10, 0x589E, 0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, /* 0x80 */
+ 0x59A4, 0x59BA, 0x5B56, 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, /* 0x80 */
+ 0x5CA6, 0x5CBA, 0x5CF5, 0x5D27, 0x5D53, 0xFA11, 0x5D42, 0x5D6D, /* 0x90 */
+ 0x5DB8, 0x5DB9, 0x5DD0, 0x5F21, 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, /* 0x90 */
+ 0x605D, 0x6085, 0x608A, 0x60DE, 0x60D5, 0x6120, 0x60F2, 0x6111, /* 0xA0 */
+ 0x6137, 0x6130, 0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, 0x649D, /* 0xA0 */
+ 0x64CE, 0x654E, 0x6600, 0x6615, 0x663B, 0x6609, 0x662E, 0x661E, /* 0xB0 */
+ 0x6624, 0x6665, 0x6657, 0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, /* 0xB0 */
+ 0x66B2, 0x66BF, 0x66FA, 0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, /* 0xC0 */
+ 0x67C0, 0x6801, 0x6844, 0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, /* 0xC0 */
+ 0x69E2, 0x6A30, 0x6A6B, 0x6A46, 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, /* 0xD0 */
+ 0x6BD6, 0x6C3F, 0x6C5C, 0x6C86, 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, /* 0xD0 */
+ 0x6D6F, 0x6D96, 0x6DAC, 0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, /* 0xE0 */
+ 0x6E5C, 0x6E27, 0x6E3C, 0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, /* 0xE0 */
+ 0x7007, 0x7028, 0x7085, 0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, /* 0xF0 */
+ 0x7147, 0xFA15, 0x71C1, 0x71FE, 0x72B1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_MS932_EE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x72BE, 0x7324, 0xFA16, 0x7377, 0x73BD, 0x73C9, 0x73D6, 0x73E3, /* 0x40 */
+ 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, 0x7429, 0x742E, 0x7462, /* 0x40 */
+ 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C, 0x769E, 0x769B, /* 0x50 */
+ 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E, 0x7864, 0x787A, /* 0x50 */
+ 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B, 0x799B, 0x7AD1, /* 0x60 */
+ 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48, 0x7D5C, 0x7DB7, /* 0x60 */
+ 0x7DA0, 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E, 0x8301, 0x8362, /* 0x70 */
+ 0x837F, 0x83C7, 0x83F6, 0x8448, 0x84B4, 0x8553, 0x8559, 0, /* 0x70 */
+ 0x856B, 0xFA1F, 0x85B0, 0xFA20, 0xFA21, 0x8807, 0x88F5, 0x8A12, /* 0x80 */
+ 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, 0xFA22, 0x8AF6, 0x8B53, /* 0x80 */
+ 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, 0x8ECF, 0xFA24, /* 0x90 */
+ 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA, 0x91D7, /* 0x90 */
+ 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210, 0x920A, /* 0xA0 */
+ 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239, 0x9267, /* 0xA0 */
+ 0x92A7, 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0, 0xFA27, /* 0xB0 */
+ 0x92D5, 0x92E0, 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28, 0x931E, /* 0xB0 */
+ 0x92FF, 0x931D, 0x9302, 0x9370, 0x9357, 0x93A4, 0x93C6, 0x93DE, /* 0xC0 */
+ 0x93F8, 0x9431, 0x9445, 0x9448, 0x9592, 0xF9DC, 0xFA29, 0x969D, /* 0xC0 */
+ 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, 0x974F, 0x9751, 0x9755, /* 0xD0 */
+ 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, 0x999E, 0x9A4E, /* 0xD0 */
+ 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB, 0x9C00, /* 0xE0 */
+ 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, 0, 0, 0x2170, /* 0xE0 */
+ 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, /* 0xF0 */
+ 0x2179, 0xFFE2, 0xFFE4, 0xFF07, 0xFF02 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_MS932_FA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, /* 0x40 */
+ 0x2178, 0x2179, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, /* 0x40 */
+ 0x2166, 0x2167, 0x2168, 0x2169, 0xFFE2, 0xFFE4, 0xFF07, 0xFF02, /* 0x50 */
+ 0x3231, 0x2116, 0x2121, 0x2235, 0x7E8A, 0x891C, 0x9348, 0x9288, /* 0x50 */
+ 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8, 0x92F9, 0x66FB, 0x5F45, /* 0x60 */
+ 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03, 0x4F39, 0x4F56, 0x4F92, /* 0x60 */
+ 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040, 0x5022, 0x4FFF, 0x501E, /* 0x70 */
+ 0x5046, 0x5070, 0x5042, 0x5094, 0x50F4, 0x50D8, 0x514A, 0, /* 0x70 */
+ 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, 0x529C, 0x52A6, 0x52C0, /* 0x80 */
+ 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393, 0x53B2, 0x53DD, /* 0x80 */
+ 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, 0x5586, 0x5759, 0x5765, /* 0x90 */
+ 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E, 0x58B2, 0x590B, /* 0x90 */
+ 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA, 0x5B56, 0x5BC0, /* 0xA0 */
+ 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA, 0x5CF5, 0x5D27, /* 0xA0 */
+ 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9, 0x5DD0, 0x5F21, /* 0xB0 */
+ 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085, 0x608A, 0x60DE, /* 0xB0 */
+ 0x60D5, 0x6120, 0x60F2, 0x6111, 0x6137, 0x6130, 0x6198, 0x6213, /* 0xC0 */
+ 0x62A6, 0x63F5, 0x6460, 0x649D, 0x64CE, 0x654E, 0x6600, 0x6615, /* 0xC0 */
+ 0x663B, 0x6609, 0x662E, 0x661E, 0x6624, 0x6665, 0x6657, 0x6659, /* 0xD0 */
+ 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, 0x66FA, 0x670E, /* 0xD0 */
+ 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844, 0x68CF, /* 0xE0 */
+ 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B, 0x6A46, /* 0xE0 */
+ 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C, 0x6C86, /* 0xF0 */
+ 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, 0x6D6F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_MS932_FB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6D96, 0x6DAC, 0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, 0x6E5C, /* 0x40 */
+ 0x6E27, 0x6E3C, 0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, 0x7007, /* 0x40 */
+ 0x7028, 0x7085, 0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, 0x7147, /* 0x50 */
+ 0xFA15, 0x71C1, 0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, /* 0x50 */
+ 0x73BD, 0x73C9, 0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, /* 0x60 */
+ 0x742A, 0x7429, 0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, /* 0x60 */
+ 0x7682, 0x769C, 0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, /* 0x70 */
+ 0x7821, 0x784E, 0x7864, 0x787A, 0x7930, 0xFA18, 0xFA19, 0, /* 0x70 */
+ 0xFA1A, 0x7994, 0xFA1B, 0x799B, 0x7AD1, 0x7AE7, 0xFA1C, 0x7AEB, /* 0x80 */
+ 0x7B9E, 0xFA1D, 0x7D48, 0x7D5C, 0x7DB7, 0x7DA0, 0x7DD6, 0x7E52, /* 0x80 */
+ 0x7F47, 0x7FA1, 0xFA1E, 0x8301, 0x8362, 0x837F, 0x83C7, 0x83F6, /* 0x90 */
+ 0x8448, 0x84B4, 0x8553, 0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, /* 0x90 */
+ 0xFA21, 0x8807, 0x88F5, 0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, /* 0xA0 */
+ 0x8ADF, 0xFA22, 0x8AF6, 0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, /* 0xA0 */
+ 0x8D76, 0xFA23, 0x8ECF, 0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, /* 0xB0 */
+ 0x9115, 0x9127, 0x91DA, 0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, /* 0xB0 */
+ 0x91E5, 0x9206, 0x9210, 0x920A, 0x923A, 0x9240, 0x923C, 0x924E, /* 0xC0 */
+ 0x9259, 0x9251, 0x9239, 0x9267, 0x92A7, 0x9277, 0x9278, 0x92E7, /* 0xC0 */
+ 0x92D7, 0x92D9, 0x92D0, 0xFA27, 0x92D5, 0x92E0, 0x92D3, 0x9325, /* 0xD0 */
+ 0x9321, 0x92FB, 0xFA28, 0x931E, 0x92FF, 0x931D, 0x9302, 0x9370, /* 0xD0 */
+ 0x9357, 0x93A4, 0x93C6, 0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, /* 0xE0 */
+ 0x9592, 0xF9DC, 0xFA29, 0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, /* 0xE0 */
+ 0x974D, 0x974F, 0x9751, 0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, /* 0xF0 */
+ 0x9927, 0xFA2C, 0x999E, 0x9A4E, 0x9AD9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_MS932_FC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB, 0x9C00, 0x9D70, /* 0x40 */
+ 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1 /* 0x40 */
+};
+
diff --git a/sal/textenc/tcvtjp2.tab b/sal/textenc/tcvtjp2.tab
new file mode 100644
index 000000000000..7b1fe10947bb
--- /dev/null
+++ b/sal/textenc/tcvtjp2.tab
@@ -0,0 +1,3964 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the UniCode to DBCS tables for the following */
+/* japanese charsets: SJIS, MS932, APPLE_JAPANESE */
+
+/* ======================================================================= */
+
+/* 0x00A2 --> 0x8191 - APPLE_JAPANESE, but I think, this extension is better than the replacment char */
+/* 0x00A3 --> 0x8192 - APPLE_JAPANESE, but I think, this extension is better than the replacment char */
+/* 0x00A5 --> 0x005C - APPLE_JAPANESE, but I think, this extension is better than the replacment char */
+/* 0x00AC --> 0x81CA - APPLE_JAPANESE/SJIS, but I think, this extension is better than the replacment char */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x00 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 0x00 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 0x10 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 0x10 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 0x20 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 0x20 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0x30 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 0x30 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0x40 */
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, /* 0x40 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* 0x50 */
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 0x50 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x60 */
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0x60 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, /* 0x70 */
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x8191, 0x8192, 0, 0x005C, 0, 0x8198, /* 0xA0 */
+ 0x814E, 0, 0, 0, 0x81CA, 0, 0, 0, /* 0xA0 */
+ 0x818B, 0x817D, 0, 0, 0x814C, 0, 0x81F7, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x817E, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x8180 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x00 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 0x00 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 0x10 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 0x10 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 0x20 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 0x20 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0x30 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 0x30 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0x40 */
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, /* 0x40 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* 0x50 */
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 0x50 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x60 */
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0x60 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, /* 0x70 */
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x00A0, 0, 0x8191, 0x8192, 0, 0x005C, 0, 0x8198, /* 0xA0 */
+ 0x814E, 0x00FD, 0, 0, 0x81CA, 0, 0, 0, /* 0xA0 */
+ 0x818B, 0x817D, 0, 0, 0x814C, 0, 0x81F7, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x817E, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x8180 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_03[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, /* 0x90 */
+ 0x83A6, 0x83A7, 0x83A8, 0x83A9, 0x83AA, 0x83AB, 0x83AC, 0x83AD, /* 0x90 */
+ 0x83AE, 0x83AF, 0, 0x83B0, 0x83B1, 0x83B2, 0x83B3, 0x83B4, /* 0xA0 */
+ 0x83B5, 0x83B6, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x83BF, 0x83C0, 0x83C1, 0x83C2, 0x83C3, 0x83C4, 0x83C5, /* 0xB0 */
+ 0x83C6, 0x83C7, 0x83C8, 0x83C9, 0x83CA, 0x83CB, 0x83CC, 0x83CD, /* 0xB0 */
+ 0x83CE, 0x83CF, 0, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D4, /* 0xC0 */
+ 0x83D5, 0x83D6 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_04[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8446, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, /* 0x10 */
+ 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, /* 0x10 */
+ 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, 0x8458, /* 0x20 */
+ 0x8459, 0x845A, 0x845B, 0x845C, 0x845D, 0x845E, 0x845F, 0x8460, /* 0x20 */
+ 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8477, 0x8478, /* 0x30 */
+ 0x8479, 0x847A, 0x847B, 0x847C, 0x847D, 0x847E, 0x8480, 0x8481, /* 0x30 */
+ 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, /* 0x40 */
+ 0x848A, 0x848B, 0x848C, 0x848D, 0x848E, 0x848F, 0x8490, 0x8491, /* 0x40 */
+ 0, 0x8476 /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* 0x2014 --> 0x815C - APPLE_JAPANESE/SJIS, but I think, this extension is better than the replacment char */
+/* 0x2015 --> 0x815C - MS932, but I think, this extension is better than the replacment char */
+/* 0x2016 --> 0x8161 - APPLE_JAPANESE/SJIS, but I think, this extension is better than the replacment char */
+/* 0x2026 --> 0x8163 - APPLE_JAPANESE is normaly 0x00FF (HORIZONTAL ELLIPSIS), because in the APPLE import table 0x8183 is this 0x22EF (MIDLINE HORIZONTAL ELLIPSIS) */
+/* but we import this code as 0x2026 */
+/* 0x203E --> 0x8150 - APPLE_JAPANESE, but I think, this extension is better than the replacment char */
+/* in SJIS this is 0x7E, but we import 0x7E as 0x7E, so this would be the better way */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_20[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x815D, 0, 0, 0, 0x815C, 0x815C, 0x8161, 0, /* 0x10 */
+ 0x8165, 0x8166, 0, 0, 0x8167, 0x8168, 0, 0, /* 0x10 */
+ 0x81F5, 0x81F6, 0, 0, 0, 0x8164, 0x8163, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x81F1, 0, 0x818C, 0x818D, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x81A6, 0, 0, 0x8150 /* 0x30 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* In this table we have some MS932 extensions, but we use this table also for SJIS, for better MS compatibility */
+
+static sal_uInt16 const aImplUniToDBCSTab_MS932_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x818E, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x8782, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x8784, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x81F0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875A, 0x875B, /* 0x60 */
+ 0x875C, 0x875D, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xFA40, 0xFA41, 0xFA42, 0xFa43, 0xFA44, 0xFA45, 0xFA46, 0xFA47, /* 0x70 */
+ 0xFA48, 0xFA49, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x81A9, 0x81AA, 0x81A8, 0x81AB, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x81CB, 0, 0x81CC /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x818E, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x8656, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x8650, 0, 0, 0x869B, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x869D, 0x00FE, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x81F0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x85A6, /* 0x60 */
+ 0x85A7, 0x85A8, 0x85A9, 0x85AA, 0, 0, 0, 0, /* 0x60 */
+ 0x85B3, 0x85B4, 0x85B5, 0x85B6, 0x85B7, 0x85B8, 0x85B9, 0x85BA, /* 0x70 */
+ 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x81A9, 0x81AA, 0x81A8, 0x81AB, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x86CC, 0x86CD, 0x86CB, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x81CB, 0, 0x81CC, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0x86D0, 0x86D1, /* 0xE0 */
+ 0x86CF, 0x86D2 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* In this table we have some MS932 extensions, but we use this table also for SJIS, for better MS compatibility */
+/* 0x2210 --> 0x817C - come from SJIS */
+
+static sal_uInt16 const aImplUniToDBCSTab_MS932_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x81CD, 0, 0x81DD, 0x81CE, 0, 0, 0, 0x81DE, /* 0x00 */
+ 0x81B8, 0, 0, 0x81B9, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x8794, 0x817C, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x81E3, 0, 0, 0x81E5, 0x8187, 0x8798, /* 0x10 */
+ 0x81DA, 0, 0, 0, 0, 0x8161, 0, 0x81C8, /* 0x20 */
+ 0x81C9, 0x81BF, 0x81BE, 0x81E7, 0x81E8, 0, 0x8793, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x8188, 0x81E6, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x81E4, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x81E0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x8182, 0x81DF, 0, 0, 0, 0, 0x8185, 0x8186, /* 0x60 */
+ 0, 0, 0x81E1, 0x81E2, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x81BC, 0x81BD, 0, 0, 0x81BA, 0x81BB, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x81DB, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x8799 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x81CD, 0, 0x81DD, 0x81CE, 0, 0, 0, 0x81DE, /* 0x00 */
+ 0x81B8, 0, 0, 0x81B9, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x817C, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x81E3, 0, 0, 0x81E5, 0x8187, 0x8841, /* 0x10 */
+ 0x81DA, 0, 0, 0, 0, 0, 0, 0x81C8, /* 0x20 */
+ 0x81C9, 0x81BF, 0x81BE, 0x81E7, 0x81E8, 0, 0x8840, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x8188, 0x81E6, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x81E4, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x81E0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x8182, 0x81DF, 0, 0, 0, 0, 0x8185, 0x8186, /* 0x60 */
+ 0, 0, 0x81E1, 0x81E2, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x81BC, 0x81BD, 0, 0, 0x81BA, 0x81BB, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x81DB, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x8842, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x8163 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_23[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x81DC /* 0x10 */
+ /* 0x10 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_MS932_24[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, /* 0x60 */
+ 0x8748, 0x8749, 0x874A, 0x874B, 0x874C, 0x874D, 0x874E, 0x874F, /* 0x60 */
+ 0x8750, 0x8751, 0x8752, 0x8753 /* 0x70 */
+ /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_24[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, /* 0x60 */
+ 0x8548, 0x8549, 0x854A, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, /* 0x60 */
+ 0x8550, 0x8551, 0x8552, 0x8553, 0x855E, 0x855F, 0x8560, 0x8561, /* 0x70 */
+ 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569, /* 0x70 */
+ 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, /* 0x80 */
+ 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, /* 0x80 */
+ 0x859A, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x85DB, 0x85DC, 0x85DD, 0x85DE, /* 0x90 */
+ 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, /* 0xA0 */
+ 0x85E7, 0x85E8, 0x85E9, 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, /* 0xA0 */
+ 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4 /* 0xB0 */
+ /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_25[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x849F, 0x84AA, 0x84A0, 0x84AB, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x84A1, 0, 0, 0x84AC, /* 0x00 */
+ 0x84A2, 0, 0, 0x84AD, 0x84A4, 0, 0, 0x84AF, /* 0x10 */
+ 0x84A3, 0, 0, 0x84AE, 0x84A5, 0x84BA, 0, 0, /* 0x10 */
+ 0x84B5, 0, 0, 0x84B0, 0x84A7, 0x84BC, 0, 0, /* 0x20 */
+ 0x84B7, 0, 0, 0x84B2, 0x84A6, 0, 0, 0x84B6, /* 0x20 */
+ 0x84BB, 0, 0, 0x84B1, 0x84A8, 0, 0, 0x84B8, /* 0x30 */
+ 0x84BD, 0, 0, 0x84B3, 0x84A9, 0, 0, 0x84B9, /* 0x30 */
+ 0, 0, 0x84BE, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x84B4, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x81A1, 0x81A0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x81A3, 0x81A2, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x81A5, 0x81A4, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x819F, 0x819E, /* 0xC0 */
+ 0, 0, 0, 0x819B, 0, 0, 0x819D, 0x819C, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x81FC /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x819A, 0x8199, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x818A, 0, 0x8189, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x81F4, 0, 0, 0x81F3, 0, 0x81F2 /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x819A, 0x8199, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x86B4, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x86C8, 0x86C9, 0x86C7, 0x86CA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x818A, 0, 0x8189, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x86A3, 0x86A1, 0x86A2, 0x86A4, 0x869F, 0x86A5, 0x86A6, 0x86A0, /* 0x60 */
+ 0, 0, 0x81F4, 0, 0, 0x81F3, 0, 0x81F2 /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_27[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x857C, 0x857D, /* 0x70 */
+ 0x857E, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* 0x3014 --> 0x8160 - come from SJIS */
+/* 0x301D --> 0x8780 - MS932, but I think, this extension is better than the replacment char */
+/* 0x301F --> 0x8781 - MS932, but I think, this extension is better than the replacment char */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8140, 0x8141, 0x8142, 0x8156, 0, 0x8158, 0x8159, 0x815A, /* 0x00 */
+ 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, /* 0x00 */
+ 0x8179, 0x817A, 0x81A7, 0x81AC, 0x816B, 0x816C, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x8160, 0x8780, 0, 0x8781, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x829F, 0x82A0, 0x82A1, 0x82A2, 0x82A3, 0x82A4, 0x82A5, /* 0x40 */
+ 0x82A6, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AB, 0x82AC, 0x82AD, /* 0x40 */
+ 0x82AE, 0x82AF, 0x82B0, 0x82B1, 0x82B2, 0x82B3, 0x82B4, 0x82B5, /* 0x50 */
+ 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0x82BB, 0x82BC, 0x82BD, /* 0x50 */
+ 0x82BE, 0x82BF, 0x82C0, 0x82C1, 0x82C2, 0x82C3, 0x82C4, 0x82C5, /* 0x60 */
+ 0x82C6, 0x82C7, 0x82C8, 0x82C9, 0x82CA, 0x82CB, 0x82CC, 0x82CD, /* 0x60 */
+ 0x82CE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0x82D3, 0x82D4, 0x82D5, /* 0x70 */
+ 0x82D6, 0x82D7, 0x82D8, 0x82D9, 0x82DA, 0x82DB, 0x82DC, 0x82DD, /* 0x70 */
+ 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, 0x82E3, 0x82E4, 0x82E5, /* 0x80 */
+ 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EB, 0x82EC, 0x82ED, /* 0x80 */
+ 0x82EE, 0x82EF, 0x82F0, 0x82F1, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x814A, 0x814B, 0x8154, 0x8155, 0, /* 0x90 */
+ 0, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, /* 0xA0 */
+ 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C, 0x834D, 0x834E, /* 0xA0 */
+ 0x834F, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, /* 0xB0 */
+ 0x8357, 0x8358, 0x8359, 0x835A, 0x835B, 0x835C, 0x835D, 0x835E, /* 0xB0 */
+ 0x835F, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, /* 0xC0 */
+ 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C, 0x836D, 0x836E, /* 0xC0 */
+ 0x836F, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, /* 0xD0 */
+ 0x8377, 0x8378, 0x8379, 0x837A, 0x837B, 0x837C, 0x837D, 0x837E, /* 0xD0 */
+ 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, /* 0xE0 */
+ 0x8388, 0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838E, 0x838F, /* 0xE0 */
+ 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0, /* 0xF0 */
+ 0, 0, 0, 0x8145, 0x815B, 0x8152, 0x8153 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8140, 0x8141, 0x8142, 0x8156, 0x86B5, 0x8158, 0x8159, 0x815A, /* 0x00 */
+ 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, /* 0x00 */
+ 0x8179, 0x817A, 0x81A7, 0x81AC, 0x816B, 0x816C, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x8160, 0x8854, 0, 0x8855, /* 0x10 */
+ 0x86B3, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x829F, 0x82A0, 0x82A1, 0x82A2, 0x82A3, 0x82A4, 0x82A5, /* 0x40 */
+ 0x82A6, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AB, 0x82AC, 0x82AD, /* 0x40 */
+ 0x82AE, 0x82AF, 0x82B0, 0x82B1, 0x82B2, 0x82B3, 0x82B4, 0x82B5, /* 0x50 */
+ 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0x82BB, 0x82BC, 0x82BD, /* 0x50 */
+ 0x82BE, 0x82BF, 0x82C0, 0x82C1, 0x82C2, 0x82C3, 0x82C4, 0x82C5, /* 0x60 */
+ 0x82C6, 0x82C7, 0x82C8, 0x82C9, 0x82CA, 0x82CB, 0x82CC, 0x82CD, /* 0x60 */
+ 0x82CE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0x82D3, 0x82D4, 0x82D5, /* 0x70 */
+ 0x82D6, 0x82D7, 0x82D8, 0x82D9, 0x82DA, 0x82DB, 0x82DC, 0x82DD, /* 0x70 */
+ 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, 0x82E3, 0x82E4, 0x82E5, /* 0x80 */
+ 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EB, 0x82EC, 0x82ED, /* 0x80 */
+ 0x82EE, 0x82EF, 0x82F0, 0x82F1, 0x8868, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x814A, 0x814B, 0x8154, 0x8155, 0, /* 0x90 */
+ 0, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, /* 0xA0 */
+ 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C, 0x834D, 0x834E, /* 0xA0 */
+ 0x834F, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, /* 0xB0 */
+ 0x8357, 0x8358, 0x8359, 0x835A, 0x835B, 0x835C, 0x835D, 0x835E, /* 0xB0 */
+ 0x835F, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, /* 0xC0 */
+ 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C, 0x836D, 0x836E, /* 0xC0 */
+ 0x836F, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, /* 0xD0 */
+ 0x8377, 0x8378, 0x8379, 0x837A, 0x837B, 0x837C, 0x837D, 0x837E, /* 0xD0 */
+ 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, /* 0xE0 */
+ 0x8388, 0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838E, 0x838F, /* 0xE0 */
+ 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x886A, /* 0xF0 */
+ 0x886B, 0x886C, 0x886D, 0x8145, 0x815B, 0x8152, 0x8153 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_MS932_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x878A, 0x878B, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x878C, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x8785, 0x8786, 0x8787, 0x8788, /* 0xA0 */
+ 0x8789 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x20 */
+ 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, /* 0x20 */
+ 0x8740, 0x874D, 0x8750, 0x8753, 0x874F, 0x8754, 0x8752, 0x8748, /* 0x30 */
+ 0x8758, 0x874B, 0x874C, 0x8751, 0x8755, 0x8756, 0x874E, 0x8757, /* 0x30 */
+ 0x8747, 0, 0x8749, 0x874A, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x8799, 0, /* 0x90 */
+ 0x879B, 0x879E, 0, 0, 0, 0x879A, 0x879C, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x8793, 0x8794, 0x8795, 0x8796, /* 0xA0 */
+ 0x8797, 0x8798 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_MS932_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8765, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x8769, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x8760, 0, 0, 0, /* 0x10 */
+ 0x8763, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x8761, 0x876B, 0, 0, 0x876A, 0x8764, /* 0x20 */
+ 0, 0, 0, 0x876C, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x8766, 0, /* 0x30 */
+ 0, 0, 0, 0x876E, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x875F, 0x876D, 0, 0, 0x8762, 0, 0, /* 0x40 */
+ 0, 0x8767, 0, 0, 0, 0, 0, 0x8768, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x877E, 0x878F, 0x878E, 0x878D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x8772, 0x8773, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x876F, 0x8770, 0x8771, 0, /* 0x90 */
+ 0, 0x8775, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x8774, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x8783 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x87BD, 0, 0, 0x87A7, 0, 0x87A4, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x87B0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x87A2, 0x87AA, 0x87A3, 0, /* 0x10 */
+ 0x87A9, 0, 0, 0, 0, 0, 0x87BE, 0, /* 0x10 */
+ 0, 0, 0x87A0, 0x87B2, 0, 0, 0x87B3, 0x87AB, /* 0x20 */
+ 0, 0, 0x87BF, 0x87B5, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x87C0, 0, 0x87A5, 0, 0, 0x87A8, 0, /* 0x30 */
+ 0, 0x87AE, 0, 0x87B4, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x87B1, 0, 0, 0, 0, 0x87C1, /* 0x40 */
+ 0, 0x879F, 0x87AD, 0, 0, 0x87A1, 0x87A6, 0, /* 0x40 */
+ 0, 0x87AC, 0, 0, 0, 0, 0, 0x87AF, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x87E8, 0x87E7, 0x87E6, 0x87E5, 0x87FA, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x865A, 0x865B, 0x865C, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x864A, 0x864C, /* 0x80 */
+ 0x8659, 0, 0, 0, 0, 0, 0x864E, 0x864F, /* 0x90 */
+ 0x8651, 0, 0, 0, 0x8640, 0x8642, 0x8648, 0x8641, /* 0x90 */
+ 0x8643, 0x8646, 0x8649, 0, 0x8644, 0x8647, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x8655, 0x8654, 0x8653, 0x8652, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x864D, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x8658, 0, 0x869C, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x8657 /* 0xD0 */
+ /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* Table _4E to _9F includes the 360 IBM Kanji's we export to all */
+/* formats (SJIS/APPLE_JAPANESE) for better compatibility. These */
+/* characters are also imported from us in all formats. So this */
+/* extension should give better results than the export to the */
+/* replacement character. */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x88EA, 0x929A, 0, 0x8EB5, 0, 0, 0, 0x969C, /* 0x00 */
+ 0x8FE4, 0x8E4F, 0x8FE3, 0x89BA, 0, 0x9573, 0x975E, 0, /* 0x00 */
+ 0x98A0, 0x894E, 0, 0, 0x8A8E, 0x98A1, 0x90A2, 0x99C0, /* 0x10 */
+ 0x8B75, 0x95B8, 0, 0, 0, 0, 0x8FE5, 0, /* 0x10 */
+ 0, 0x97BC, 0, 0, 0, 0, 0x95C0, 0, /* 0x20 */
+ 0xFA68, 0, 0x98A2, 0, 0, 0x9286, 0, 0, /* 0x20 */
+ 0, 0x98A3, 0x8BF8, 0, 0, 0, 0x98A4, 0, /* 0x30 */
+ 0x8ADB, 0x924F, 0, 0x8EE5, 0x98A5, 0, 0, 0x98A6, /* 0x30 */
+ 0, 0, 0x98A7, 0x9454, 0, 0x8B76, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x9456, 0, 0x93E1, 0x8CC1, 0x9652, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE568, 0x98A8, 0x8FE6, /* 0x50 */
+ 0x98A9, 0x89B3, 0, 0, 0, 0x8BE3, 0x8CEE, 0x96E7, /* 0x50 */
+ 0, 0, 0x9BA4, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x9790, 0, 0x93FB, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x8AA3, 0, /* 0x70 */
+ 0x8B54, 0, 0x98AA, 0, 0, 0x98AB, 0x97B9, 0, /* 0x80 */
+ 0x975C, 0x9188, 0x98AD, 0x8E96, 0x93F1, 0, 0x98B0, 0, /* 0x80 */
+ 0, 0x895D, 0x8CDD, 0, 0x8CDC, 0x88E4, 0, 0, /* 0x90 */
+ 0x986A, 0x9869, 0, 0x8DB1, 0x889F, 0, 0x98B1, 0x98B2, /* 0x90 */
+ 0x98B3, 0x9653, 0x98B4, 0, 0x8CF0, 0x88E5, 0x9692, 0, /* 0xA0 */
+ 0x8B9C, 0, 0, 0x8B9D, 0x8B9E, 0x92E0, 0x97BA, 0, /* 0xA0 */
+ 0x98B5, 0, 0, 0x98B6, 0, 0, 0x98B7, 0, /* 0xB0 */
+ 0, 0, 0x906C, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x8F59, 0x906D, 0x98BC, 0, 0x98BA, 0, 0x98BB, 0x8B77, /* 0xC0 */
+ 0, 0, 0x8DA1, 0x89EE, 0, 0x98B9, 0x98B8, 0x95A7, /* 0xC0 */
+ 0, 0, 0, 0, 0x8E65, 0x8E64, 0x91BC, 0x98BD, /* 0xD0 */
+ 0x9574, 0x90E5, 0, 0, 0, 0x8157, 0x98BE, 0x98C0, /* 0xD0 */
+ 0, 0xFA69, 0, 0x91E3, 0x97DF, 0x88C8, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x98BF, 0x89BC, 0, /* 0xE0 */
+ 0x8BC2, 0, 0x9287, 0, 0, 0, 0x8C8F, 0x98C1, /* 0xF0 */
+ 0, 0, 0, 0x9443, 0xFA6A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFA6B, 0x8AE9, 0, 0xFA6C, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x98C2, 0x88C9, 0, 0, 0x8CDE, 0x8AEA, 0x959A, /* 0x00 */
+ 0x94B0, 0x8B78, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x89EF, 0, 0x98E5, 0x9360, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0x948C, /* 0x20 */
+ 0x98C4, 0, 0, 0, 0x94BA, 0, 0x97E0, 0, /* 0x30 */
+ 0x904C, 0xFA6D, 0x8E66, 0, 0x8E97, 0x89BE, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x92CF, 0, 0, 0x9241, 0x98C8, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x88CA, 0x92E1, 0x8F5A, /* 0x40 */
+ 0x8DB2, 0x9743, 0, 0x91CC, 0, 0x89BD, 0xFA6E, 0x98C7, /* 0x50 */
+ 0, 0x975D, 0x98C3, 0x98C5, 0x8DEC, 0x98C6, 0x9B43, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x98CE, 0, 0, 0, 0, 0, 0x98D1, /* 0x60 */
+ 0x98CF, 0, 0, 0x89C0, 0, 0x95B9, 0x98C9, 0, /* 0x70 */
+ 0, 0, 0, 0x98CD, 0x8CF1, 0, 0, 0x8E67, /* 0x70 */
+ 0, 0, 0, 0x8AA4, 0, 0, 0x98D2, 0, /* 0x80 */
+ 0x98CA, 0, 0xFA70, 0x97E1, 0, 0x8E98, 0, 0x98CB, /* 0x80 */
+ 0, 0x98D0, 0xFA71, 0, 0xFA72, 0, 0x98D3, 0, /* 0x90 */
+ 0x98CC, 0, 0xFA6F, 0x8B9F, 0, 0x88CB, 0, 0, /* 0x90 */
+ 0x8BA0, 0x89BF, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x9B44, 0, 0x9699, 0x958E, 0x8CF2, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x904E, 0x97B5, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x95D6, /* 0xB0 */
+ 0, 0, 0x8C57, 0x91A3, 0x89E2, 0, 0, 0, /* 0xC0 */
+ 0, 0xFA61, 0x8F72, 0, 0, 0xFA73, 0x98D7, 0, /* 0xC0 */
+ 0x98DC, 0x98DA, 0, 0, 0x98D5, 0, 0, 0x91AD, /* 0xD0 */
+ 0x98D8, 0, 0x98DB, 0x98D9, 0, 0x95DB, 0, 0x98D6, /* 0xD0 */
+ 0, 0x904D, 0, 0x9693, 0x98DD, 0x98DE, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x8F43, 0x98EB, /* 0xE0 */
+ 0, 0, 0, 0x946F, 0, 0x9555, 0x98E6, 0, /* 0xF0 */
+ 0x95EE, 0, 0x89B4, 0, 0, 0, 0x98EA, 0xFA76 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x98E4, 0x98ED, 0, /* 0x00 */
+ 0, 0x9171, 0, 0x8CC2, 0, 0x947B, 0, 0xE0C5, /* 0x00 */
+ 0, 0x98EC, 0x937C, 0, 0x98E1, 0, 0x8CF4, 0, /* 0x10 */
+ 0, 0x8CF3, 0x98DF, 0, 0, 0, 0xFA77, 0x8ED8, /* 0x10 */
+ 0, 0x98E7, 0xFA75, 0x95ED, 0x926C, 0x98E3, 0x8C91, 0, /* 0x20 */
+ 0x98E0, 0x98E8, 0x98E2, 0x97CF, 0x98E9, 0x9860, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x8BE4, 0, /* 0x30 */
+ 0, 0x8C90, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xFA74, 0, 0xFA7A, 0x98EE, 0, 0, 0xFA78, 0x98EF, /* 0x40 */
+ 0x98F3, 0x88CC, 0, 0, 0, 0, 0, 0x95CE, /* 0x40 */
+ 0x98F2, 0, 0, 0, 0, 0x98F1, 0x98F5, 0, /* 0x50 */
+ 0, 0, 0x98F4, 0, 0x92E2, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x8C92, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x98F6, 0, 0, 0, /* 0x60 */
+ 0xFA79, 0, 0x8EC3, 0, 0x91A4, 0x92E3, 0x8BF4, 0, /* 0x70 */
+ 0x98F7, 0, 0, 0, 0, 0x8B55, 0, 0, /* 0x70 */
+ 0x98F8, 0, 0, 0, 0, 0x98FA, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x9654, 0, 0, /* 0x80 */
+ 0, 0x8C86, 0, 0, 0xFA7B, 0, 0, 0, /* 0x90 */
+ 0x8E50, 0x94F5, 0x98F9, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x8DC3, 0x9762, 0, 0, /* 0xA0 */
+ 0, 0, 0x98FC, 0x9942, 0x98FB, 0x8DC2, 0, 0x8F9D, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x8C58, 0, /* 0xB0 */
+ 0, 0, 0x9943, 0, 0, 0x8BCD, 0, 0, /* 0xC0 */
+ 0, 0x9940, 0x9941, 0, 0, 0x93AD, 0, 0x919C, /* 0xC0 */
+ 0, 0x8BA1, 0, 0, 0, 0x966C, 0x9944, 0, /* 0xD0 */
+ 0xFA7D, 0, 0x97BB, 0, 0, 0, 0x9945, 0, /* 0xD0 */
+ 0, 0, 0, 0x9948, 0, 0x9946, 0, 0x916D, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x9947, 0x9949, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xFA7C, 0x994B, 0, 0, /* 0xF0 */
+ 0, 0x994A, 0, 0x95C6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B56, 0x994D, 0x994E, 0, 0x89AD, 0, 0, 0, /* 0x00 */
+ 0, 0x994C, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x8EF2, 0, 0x9951, 0x9950, 0x994F, 0, /* 0x10 */
+ 0x98D4, 0, 0x9952, 0, 0, 0, 0, 0x8F9E, /* 0x10 */
+ 0, 0x9953, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x9744, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x96D7, 0, 0, 0, 0, 0x9955, /* 0x30 */
+ 0, 0, 0x9954, 0x9957, 0x9956, 0, 0, 0x9958, /* 0x30 */
+ 0x9959, 0x88F2, 0, 0x8CB3, 0x8C5A, 0x8F5B, 0x929B, 0x8BA2, /* 0x40 */
+ 0x90E6, 0x8CF5, 0xFA7E, 0x8D8E, 0x995B, 0x96C6, 0x9365, 0, /* 0x40 */
+ 0x8E99, 0, 0x995A, 0, 0x995C, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x937D, 0, 0x8A95, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x995D, 0, 0xFA80, 0x93FC, 0, 0, /* 0x60 */
+ 0x9153, 0x995F, 0x9960, 0x94AA, 0x8CF6, 0x985A, 0x9961, 0, /* 0x60 */
+ 0, 0x8BA4, 0, 0, 0, 0x95BA, 0x91B4, 0x8BEF, /* 0x70 */
+ 0x9354, 0, 0, 0, 0x8C93, 0, 0, 0, /* 0x70 */
+ 0x9962, 0, 0x9963, 0, 0, 0x93E0, 0x897E, 0, /* 0x80 */
+ 0, 0x9966, 0x8DFB, 0, 0x9965, 0x8DC4, 0, 0x9967, /* 0x80 */
+ 0xE3EC, 0x9968, 0x9660, 0x9969, 0, 0x996A, 0x996B, 0x8FE7, /* 0x90 */
+ 0, 0x8ECA, 0, 0, 0, 0xFA81, 0, 0, /* 0x90 */
+ 0x8AA5, 0, 0x996E, 0, 0x996C, 0x96BB, 0x996D, 0, /* 0xA0 */
+ 0x9579, 0x996F, 0x9970, 0x9971, 0x937E, 0, 0, 0, /* 0xA0 */
+ 0x9975, 0x9973, 0x9974, 0x9972, 0x8DE1, 0x9976, 0x96E8, 0x97E2, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x9977, 0xFA82, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x90A6, 0x9978, 0x8F79, 0, /* 0xC0 */
+ 0, 0x9979, 0, 0x929C, 0x97BD, 0x9380, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x99C3, 0, /* 0xD0 */
+ 0, 0, 0, 0x997A, 0xEAA3, 0x8BC3, 0, 0, /* 0xD0 */
+ 0x997B, 0x967D, 0, 0, 0, 0, 0x8F88, 0x91FA, /* 0xE0 */
+ 0, 0x997D, 0x93E2, 0, 0xFA83, 0x997E, 0, 0, /* 0xE0 */
+ 0x9980, 0x8A4D, 0, 0, 0, 0x9981, 0x8BA5, 0, /* 0xF0 */
+ 0x93CA, 0x899A, 0x8F6F, 0, 0, 0x949F, 0x9982 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9381, 0, 0, 0x906E, 0x9983, 0, 0x95AA, 0x90D8, /* 0x00 */
+ 0x8AA0, 0, 0x8AA7, 0x9984, 0, 0, 0x9986, 0, /* 0x00 */
+ 0, 0x8C59, 0, 0, 0x9985, 0xFA84, 0, 0x97F1, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x8F89, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x94BB, 0x95CA, 0, 0x9987, /* 0x20 */
+ 0, 0x9798, 0x9988, 0, 0, 0, 0x9989, 0, /* 0x20 */
+ 0x939E, 0, 0, 0x998A, 0, 0, 0x90A7, 0x8DFC, /* 0x30 */
+ 0x8C94, 0x998B, 0x8E68, 0x8D8F, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x92E4, 0x998D, 0, 0, 0x91A5, /* 0x40 */
+ 0, 0, 0x8DED, 0x998E, 0x998F, 0x914F, 0, 0x998C, /* 0x40 */
+ 0, 0, 0, 0, 0x9991, 0, 0x9655, 0, /* 0x50 */
+ 0, 0, 0, 0x8D84, 0, 0, 0x9990, 0, /* 0x50 */
+ 0, 0, 0, 0x8C95, 0x8DDC, 0x948D, 0, 0, /* 0x60 */
+ 0, 0x9994, 0x9992, 0, 0, 0, 0, 0x959B, /* 0x60 */
+ 0x8FE8, 0x999B, 0x8A84, 0x9995, 0x9993, 0x916E, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x9997, 0, 0x9996, /* 0x70 */
+ 0, 0, 0, 0x8A63, 0, 0, 0, 0x8C80, /* 0x80 */
+ 0x999C, 0x97AB, 0, 0, 0, 0x9998, 0, 0, /* 0x80 */
+ 0, 0x999D, 0x999A, 0, 0x9999, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x97CD, 0xFA85, 0, 0, 0x8CF7, /* 0x90 */
+ 0x89C1, 0, 0, 0x97F2, 0, 0, 0xFA86, 0, /* 0xA0 */
+ 0, 0x8F95, 0x9377, 0x8D85, 0x99A0, 0x99A1, 0, 0xFB77, /* 0xA0 */
+ 0, 0x97E3, 0, 0, 0x984A, 0x99A3, 0, 0, /* 0xB0 */
+ 0, 0x8CF8, 0, 0, 0x99A2, 0, 0x8A4E, 0, /* 0xB0 */
+ 0xFA87, 0x99A4, 0, 0x9675, 0, 0x92BA, 0, 0x9745, /* 0xC0 */
+ 0, 0x95D7, 0, 0, 0, 0x99A5, 0, 0, /* 0xC0 */
+ 0, 0, 0xE8D3, 0, 0, 0x93AE, 0, 0x99A6, /* 0xD0 */
+ 0x8AA8, 0x96B1, 0, 0xFA88, 0, 0x8F9F, 0x99A7, 0x95E5, /* 0xD0 */
+ 0x99AB, 0, 0x90A8, 0x99A8, 0x8BCE, 0, 0x99A9, 0x8AA9, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x8C4D, 0x99AC, 0, 0x99AD, 0, 0, /* 0xF0 */
+ 0x99AE, 0x99AF, 0x8ED9, 0, 0, 0, 0x8CF9, 0x96DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFA89, 0x96E6, 0x93F5, 0, 0, 0x95EF, 0x99B0, 0xFA8A, /* 0x00 */
+ 0x99B1, 0, 0, 0, 0, 0x99B3, 0, 0x99B5, /* 0x00 */
+ 0x99B4, 0, 0, 0, 0, 0x99B6, 0x89BB, 0x966B, /* 0x10 */
+ 0, 0x8DFA, 0x99B7, 0, 0, 0x9178, 0, 0, /* 0x10 */
+ 0x8FA0, 0x8BA7, 0, 0x99B8, 0xFA8B, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x94D9, 0, 0, 0, 0, 0x99B9, /* 0x20 */
+ 0, 0x99BA, 0, 0x99BB, 0, 0, 0, 0, /* 0x30 */
+ 0x99BC, 0x9543, 0x8BE6, 0x88E3, 0, 0, 0, 0x93BD, /* 0x30 */
+ 0x99BD, 0x8F5C, 0, 0x90E7, 0, 0x99BF, 0x99BE, 0x8FA1, /* 0x40 */
+ 0x8CDF, 0x99C1, 0x94BC, 0, 0, 0x99C2, 0, 0, /* 0x40 */
+ 0, 0x94DA, 0x91B2, 0x91EC, 0x8BA6, 0, 0, 0x93EC, /* 0x50 */
+ 0x9250, 0, 0x948E, 0, 0x966D, 0, 0x99C4, 0, /* 0x50 */
+ 0x90E8, 0, 0, 0, 0, 0, 0x8C54, 0, /* 0x60 */
+ 0, 0x99C5, 0, 0, 0, 0, 0x99C6, 0x894B, /* 0x60 */
+ 0x88F3, 0x8AEB, 0xFA8C, 0x91A6, 0x8B70, 0x9791, 0, 0x99C9, /* 0x70 */
+ 0x89B5, 0, 0, 0x99C8, 0, 0, 0, 0x8BA8, /* 0x70 */
+ 0, 0, 0x99CA, 0, 0x96EF, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xFA8D, 0, 0, 0x99CB, 0, /* 0x90 */
+ 0x97D0, 0, 0x8CFA, 0, 0, 0, 0, 0x8CB4, /* 0x90 */
+ 0x99CC, 0, 0, 0, 0, 0x99CE, 0x99CD, 0, /* 0xA0 */
+ 0x907E, 0x8958, 0, 0, 0, 0x897D, 0x99CF, 0, /* 0xA0 */
+ 0x99D0, 0, 0xFA8E, 0x8CB5, 0, 0, 0x99D1, 0, /* 0xB0 */
+ 0, 0, 0, 0x8B8E, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x8E51, 0x99D2, 0, 0, 0, 0, /* 0xC0 */
+ 0x9694, 0x8DB3, 0x8B79, 0x9746, 0x916F, 0x94BD, 0x8EFB, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x8F66, 0, 0x8EE6, 0x8EF3, /* 0xD0 */
+ 0, 0x8F96, 0, 0x94BE, 0, 0xFA8F, 0, 0x99D5, /* 0xD0 */
+ 0, 0x8962, 0x9170, 0x8CFB, 0x8CC3, 0x8BE5, 0, 0, /* 0xE0 */
+ 0x99D9, 0x9240, 0x91FC, 0x8BA9, 0x8FA2, 0x99DA, 0x99D8, 0x89C2, /* 0xE0 */
+ 0x91E4, 0x8EB6, 0x8E6A, 0x8945, 0, 0, 0x8A90, 0x8D86, /* 0xF0 */
+ 0x8E69, 0, 0x99DB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x99DC, 0, 0x8B68, 0x8A65, 0, 0, 0, /* 0x00 */
+ 0x8D87, 0x8B67, 0x92DD, 0x8944, 0x93AF, 0x96BC, 0x8D40, 0x9799, /* 0x00 */
+ 0x9366, 0x8CFC, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x8C4E, 0, 0x99E5, 0, 0x8BE1, /* 0x10 */
+ 0x9669, 0, 0, 0, 0, 0, 0x94DB, 0, /* 0x20 */
+ 0, 0x99E4, 0, 0x8ADC, 0x99DF, 0x99E0, 0x99E2, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x99E3, 0, /* 0x30 */
+ 0x8B7A, 0x9081, 0, 0x95AB, 0x99E1, 0x99DD, 0x8CE1, 0, /* 0x30 */
+ 0x99DE, 0, 0x9843, 0, 0, 0, 0x95F0, 0, /* 0x40 */
+ 0x92E6, 0x8CE0, 0x8D90, 0, 0, 0, 0x99E6, 0, /* 0x40 */
+ 0, 0x93DB, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x99EA, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x8EFC, 0, 0x8EF4, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x99ED, 0x99EB, 0, 0x96A1, 0, 0x99E8, 0x99F1, 0x99EC, /* 0x70 */
+ 0, 0, 0, 0x99EF, 0x8CC4, 0x96BD, 0, 0, /* 0x70 */
+ 0x99F0, 0, 0, 0, 0x99F2, 0, 0x99F4, 0, /* 0x80 */
+ 0, 0, 0xFA92, 0x8DEE, 0x9861, 0, 0x99E9, 0x99E7, /* 0x80 */
+ 0x99F3, 0, 0x99EE, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xFA91, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x99F6, 0, 0x9A42, 0x99F8, 0, 0, /* 0xA0 */
+ 0x99FC, 0xFA93, 0, 0x9A40, 0x99F9, 0, 0, 0x9A5D, /* 0xA0 */
+ 0, 0, 0x8DE7, 0x8A50, 0, 0, 0, 0, /* 0xB0 */
+ 0x99F7, 0, 0, 0, 0x9A44, 0x88F4, 0x9A43, 0, /* 0xB0 */
+ 0x88A3, 0x9569, 0x9A41, 0, 0x99FA, 0, 0, 0x99F5, /* 0xC0 */
+ 0x99FB, 0x8DC6, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x9A45, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x88F5, 0x9A4E, 0, 0, 0x9A46, 0x9A47, 0, /* 0xE0 */
+ 0x8FA3, 0x9689, 0, 0, 0, 0x9A4C, 0x9A4B, 0, /* 0xE0 */
+ 0, 0, 0x934E, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x9A4D, 0, 0, 0x9A4A, 0, 0xFA94 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8953, 0, 0x8DB4, 0x904F, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9A48, /* 0x00 */
+ 0x9382, 0, 0, 0, 0x9A49, 0, 0x88A0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x9A53, 0x9742, /* 0x20 */
+ 0, 0x8FA5, 0, 0x9A59, 0, 0, 0, 0, /* 0x30 */
+ 0x9A58, 0x9A4F, 0, 0, 0, 0, 0x91C1, 0, /* 0x30 */
+ 0x9A50, 0, 0, 0, 0x91ED, 0x9A55, 0x8FA4, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x9A52, 0, 0, 0x96E2, /* 0x40 */
+ 0, 0, 0, 0x8C5B, 0, 0, 0x9A56, 0x9A57, /* 0x50 */
+ 0, 0, 0, 0, 0x9A54, 0x9A5A, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x9A51, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x9A60, 0x9A65, 0, 0x9A61, 0, /* 0x70 */
+ 0x9A5C, 0, 0, 0x9A66, 0x9150, 0, 0xFA95, 0x9A68, /* 0x80 */
+ 0, 0x8D41, 0x9A5E, 0x929D, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x9A62, 0x9A5B, 0x8AAB, 0, 0x8AEC, 0x8A85, 0x9A63, 0x9A5F, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x8C96, /* 0xA0 */
+ 0x9A69, 0x9A67, 0x9172, 0x8B69, 0x8BAA, 0, 0x9A64, 0, /* 0xA0 */
+ 0x8BF2, 0, 0, 0, 0, 0, 0x8963, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x9A6D, 0x9A6B, 0, 0x9AA5, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x9A70, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x9A6A, 0, 0x9A6E, 0, 0, 0x9A6C, /* 0xD0 */
+ 0, 0, 0, 0x8E6B, 0x9A6F, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9A72, /* 0xF0 */
+ 0, 0x9A77, 0, 0, 0, 0x9A75, 0x9A74 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9251, 0, /* 0x00 */
+ 0, 0x89C3, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x9A71, 0, 0x9A73, 0x8FA6, /* 0x10 */
+ 0x8952, 0, 0, 0x9A76, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x89DC, 0, 0, 0, 0, 0, 0x9A82, /* 0x20 */
+ 0, 0x8FFA, 0x9A7D, 0, 0x9A7B, 0, 0x9A7C, 0, /* 0x30 */
+ 0x9A7E, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x895C, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x9158, 0, 0x9A78, 0, /* 0x40 */
+ 0x9A79, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x8A9A, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x9A81, 0, 0, 0, /* 0x60 */
+ 0x8AED, 0, 0x9A84, 0x9A80, 0x9A83, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x95AC, 0, 0, 0, /* 0x70 */
+ 0x93D3, 0, 0x94B6, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x9A86, 0, 0, 0, 0, 0, 0x9A85, 0x8A64, /* 0x80 */
+ 0, 0, 0x9A87, 0, 0, 0, 0, 0x9A8A, /* 0x80 */
+ 0, 0, 0, 0, 0x9A89, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x9A88, 0, 0x9458, 0, 0, 0x9A8B, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x9A8C, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x9A8E, 0, 0x9A8D, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x9A90, 0, 0, 0, /* 0xB0 */
+ 0x9A93, 0x9A91, 0x9A8F, 0x9A92, 0, 0, 0, 0, /* 0xC0 */
+ 0x9A94, 0, 0, 0, 0, 0, 0x9A95, 0, /* 0xC0 */
+ 0, 0x9A96, 0, 0x9A97, 0, 0, 0, 0x9A98, /* 0xD0 */
+ 0x9964, 0, 0x8EFA, 0x8E6C, 0, 0, 0x89F1, 0, /* 0xD0 */
+ 0x88F6, 0, 0, 0x9263, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x9A99, 0, /* 0xE0 */
+ 0x8DA2, 0, 0x88CD, 0x907D, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x9A9A, 0x8CC5, 0, 0, 0x8D91, 0, 0x9A9C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9A9B, 0, 0, 0x95DE, 0x9A9D, 0, 0, 0, /* 0x00 */
+ 0x9A9F, 0x9A9E, 0, 0x9AA0, 0, 0x9AA1, 0, 0x8C97, /* 0x00 */
+ 0, 0, 0x8980, 0x9AA2, 0, 0, 0x9AA4, 0, /* 0x10 */
+ 0x9AA3, 0, 0, 0, 0x9AA6, 0, 0, 0x9379, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x9AA7, 0x88B3, /* 0x20 */
+ 0x8DDD, 0, 0, 0, 0, 0x8C5C, 0, 0, /* 0x20 */
+ 0x926E, 0, 0, 0, 0, 0, 0, 0x9AA8, /* 0x30 */
+ 0x9AA9, 0, 0, 0x9AAB, 0, 0, 0, 0, /* 0x30 */
+ 0x9AAC, 0, 0x8DE2, 0, 0, 0, 0, 0x8BCF, /* 0x40 */
+ 0, 0, 0x9656, 0, 0, 0, 0x9AAA, 0x9AAD, /* 0x40 */
+ 0x8DBF, 0x8D42, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xFA96, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x9AB1, 0, 0, 0x8DA3, 0xFA97, 0x9252, 0, /* 0x60 */
+ 0, 0x9AAE, 0x92D8, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9AB2, /* 0x70 */
+ 0, 0, 0x9082, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x9AB0, 0x9AB3, 0, 0x8C5E, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x9AB4, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x9AB5, 0, 0x8D43, 0x8A5F, 0x9AB7, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x9AB8, 0, 0xFA98, 0, 0, 0, /* 0xA0 */
+ 0x9AB9, 0, 0, 0x9AB6, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x9AAF, 0, 0, 0x9ABA, 0, 0, 0x9ABB, 0xFA9A, /* 0xC0 */
+ 0xFA99, 0, 0, 0x9684, 0, 0, 0x8FE9, 0, /* 0xC0 */
+ 0, 0, 0x9ABD, 0x9ABE, 0x9ABC, 0, 0x9AC0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x9457, 0, 0, 0x88E6, /* 0xD0 */
+ 0x9575, 0, 0, 0x9AC1, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x8FFB, 0, 0, 0x8EB7, /* 0xF0 */
+ 0, 0x947C, 0x8AEE, 0, 0x8DE9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9678, 0, 0x93B0, 0, 0, 0x8C98, 0x91CD, 0, /* 0x00 */
+ 0, 0, 0x9ABF, 0x9AC2, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x91C2, 0, 0, /* 0x10 */
+ 0, 0x9AC3, 0, 0, 0, 0x9AC4, 0, 0, /* 0x10 */
+ 0, 0x9AC6, 0, 0, 0x92E7, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x8AAC, 0, 0, 0, 0, 0xEA9F, /* 0x20 */
+ 0x8981, 0x95F1, 0, 0, 0x8FEA, 0x9367, 0, 0, /* 0x30 */
+ 0, 0, 0x8DE4, 0, 0, 0x9ACC, 0, 0, /* 0x30 */
+ 0x95BB, 0x97DB, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x89F2, 0x9AC8, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x9159, 0x9ACB, 0, 0x9383, 0, 0, 0x9368, /* 0x50 */
+ 0x9384, 0x94B7, 0x92CB, 0, 0, 0, 0x8DC7, 0, /* 0x50 */
+ 0, 0, 0x9AC7, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x8996, 0, 0x9355, 0, 0, 0, 0, /* 0x60 */
+ 0x9AC9, 0, 0x9AC5, 0, 0, 0x906F, 0, 0, /* 0x70 */
+ 0, 0x9ACD, 0, 0, 0, 0, 0x8F6D, 0, /* 0x70 */
+ 0, 0, 0, 0x8BAB, 0, 0x9ACE, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x95E6, 0, 0, 0, 0x919D, /* 0x90 */
+ 0, 0, 0, 0, 0x92C4, 0, 0xFA9D, 0x9AD0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x966E, 0, 0, 0x9AD1, 0, 0, 0x9AD6, 0, /* 0xA0 */
+ 0, 0, 0xFA9E, 0x95AD, 0, 0, 0, 0, /* 0xB0 */
+ 0x9AD5, 0x9ACF, 0x9AD2, 0x9AD4, 0, 0, 0x8DA4, 0, /* 0xB0 */
+ 0, 0x95C7, 0, 0, 0, 0x9AD7, 0, 0x9264, /* 0xC0 */
+ 0, 0, 0x89F3, 0, 0x8FEB, 0, 0, 0, /* 0xC0 */
+ 0, 0x9AD9, 0, 0x9AD8, 0, 0x8D88, 0, 0x9ADA, /* 0xD0 */
+ 0x9ADC, 0x9ADB, 0, 0, 0x9ADE, 0, 0x9AD3, 0x9AE0, /* 0xD0 */
+ 0, 0, 0, 0, 0x9ADF, 0x9ADD, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x8E6D, 0x9070, 0, 0x9173, 0x9AE1, /* 0xE0 */
+ 0x90BA, 0x88EB, 0x9484, 0, 0, 0, 0, 0x92D9, /* 0xF0 */
+ 0, 0x9AE3, 0x9AE2, 0x9AE4, 0x9AE5, 0x9AE6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9AE7, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x95CF, 0x9AE8, 0xFA9F, 0, 0, 0, 0x89C4, /* 0x00 */
+ 0x9AE9, 0, 0, 0, 0, 0x975B, 0x8A4F, 0, /* 0x10 */
+ 0x99C7, 0x8F67, 0x91BD, 0x9AEA, 0x96E9, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x96B2, 0, 0, 0x9AEC, 0, 0x91E5, /* 0x20 */
+ 0, 0x9356, 0x91BE, 0x9576, 0x9AED, 0x9AEE, 0x899B, 0, /* 0x20 */
+ 0, 0x8EB8, 0x9AEF, 0, 0, 0, 0, 0x88CE, /* 0x30 */
+ 0x9AF0, 0, 0, 0, 0, 0, 0x9AF1, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x8982, 0, 0, 0x8AEF, /* 0x40 */
+ 0x93DE, 0x95F2, 0, 0, 0, 0, 0x9AF5, 0x9174, /* 0x40 */
+ 0x9AF4, 0x8C5F, 0, 0xFAA0, 0x967A, 0x9AF3, 0, 0x9385, /* 0x50 */
+ 0x9AF7, 0, 0x9AF6, 0xFAA1, 0, 0xFAA2, 0, 0, /* 0x50 */
+ 0x9AF9, 0, 0x9AF8, 0xFAA3, 0, 0x899C, 0, 0x9AFA, /* 0x60 */
+ 0x8FA7, 0x9AFC, 0x9244, 0, 0x9AFB, 0, 0x95B1, 0, /* 0x60 */
+ 0, 0, 0, 0x8F97, 0x937A, 0, 0, 0, /* 0x70 */
+ 0x9B40, 0, 0, 0, 0, 0x8D44, 0, 0, /* 0x70 */
+ 0, 0x9B41, 0x9440, 0x94DC, 0x96CF, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x9444, 0, 0, 0x9B4A, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x8B57, 0, 0, 0x9764, 0, /* 0x90 */
+ 0, 0x96AD, 0, 0x9BAA, 0, 0x9B42, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x9B45, 0xFAA4, 0x91C3, 0, 0, /* 0xA0 */
+ 0x9657, 0, 0, 0, 0x9369, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x9B46, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x9685, 0xFAA5, 0x8DC8, 0, 0, 0x8FA8, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x9B47, 0, /* 0xC0 */
+ 0, 0x8E6F, 0, 0x8E6E, 0, 0, 0, 0, /* 0xC0 */
+ 0x88B7, 0x8CC6, 0, 0x90A9, 0x88CF, 0, 0, 0, /* 0xD0 */
+ 0, 0x9B4B, 0x9B4C, 0, 0x9B49, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x8957, 0x8AAD, 0, /* 0xE0 */
+ 0x9B48, 0, 0x96C3, 0x9550, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x88A6, 0, /* 0xF0 */
+ 0, 0, 0, 0x88F7, 0, 0, 0, 0x8E70 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x88D0, 0, 0x88A1, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x9B51, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x9B4F, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x96BA, 0, 0x9B52, 0, 0x9B50, 0, 0, 0x9B4E, /* 0x10 */
+ 0x9050, 0, 0, 0, 0, 0x9B4D, 0, 0, /* 0x20 */
+ 0, 0x95D8, 0, 0, 0, 0, 0, 0x8CE2, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x9B56, 0x9B57, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x8FA9, 0, 0, 0, /* 0x30 */
+ 0x9B53, 0x984B, 0, 0, 0, 0, 0x946B, 0, /* 0x40 */
+ 0, 0x9B55, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x8DA5, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x9B58, 0, 0, 0, 0x9577, 0, /* 0x60 */
+ 0, 0, 0x9B59, 0, 0x9B54, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x96B9, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x947D, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x9B5A, 0x9551, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x9B5B, 0x9B5F, 0x9B5C, 0, /* 0xB0 */
+ 0, 0x89C5, 0x9B5E, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x8EB9, 0, 0x9B5D, 0x8C99, 0, 0, 0, /* 0xC0 */
+ 0x9B6B, 0, 0, 0, 0, 0, 0x9B64, 0x9B61, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x9284, 0, 0x9B60, 0, 0, 0x9B62, 0, /* 0xE0 */
+ 0, 0x9B63, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x9B65, 0x9B66 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x8AF0, 0, 0x9B68, 0x9B67, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x9B69, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x8FEC, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x9B6C, 0, 0x92DA, 0, 0, 0, /* 0x20 */
+ 0x8964, 0, 0x9B6A, 0, 0, 0, 0x9B6D, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x9B6E, 0, /* 0x30 */
+ 0x9B71, 0, 0, 0x9B6F, 0, 0x9B70, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x8E71, 0x9B72, 0, 0, 0x8D45, 0x9B73, 0xFAA6, 0x8E9A, /* 0x50 */
+ 0x91B6, 0, 0x9B74, 0x9B75, 0x8E79, 0x8D46, 0, 0x96D0, /* 0x50 */
+ 0, 0, 0, 0x8B47, 0x8CC7, 0x9B76, 0x8A77, 0, /* 0x60 */
+ 0, 0x9B77, 0, 0x91B7, 0, 0, 0, 0, /* 0x60 */
+ 0x9B78, 0x9BA1, 0, 0x9B79, 0, 0x9B7A, 0, 0, /* 0x70 */
+ 0x9B7B, 0, 0x9B7D, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x9B7E, 0, 0, 0x9B80, 0, 0x91EE, 0, 0x8946, /* 0x80 */
+ 0x8EE7, 0x88C0, 0, 0x9176, 0x8AAE, 0x8EB3, 0, 0x8D47, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x9386, 0, 0x8F40, /* 0x90 */
+ 0x8AAF, 0x9288, 0x92E8, 0x88B6, 0x8B58, 0x95F3, 0, 0x8EC0, /* 0x90 */
+ 0, 0, 0x8B71, 0x90E9, 0x8EBA, 0x9747, 0x9B81, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x8B7B, 0, /* 0xA0 */
+ 0x8DC9, 0, 0, 0x8A51, 0x8983, 0x8FAA, 0x89C6, 0, /* 0xB0 */
+ 0x9B82, 0x9765, 0, 0, 0, 0, 0, 0x8F68, /* 0xB0 */
+ 0xFAA7, 0, 0x8EE2, 0x9B83, 0x8AF1, 0x93D0, 0x96A7, 0x9B84, /* 0xC0 */
+ 0, 0x9B85, 0, 0, 0x9578, 0, 0, 0, /* 0xC0 */
+ 0x9B87, 0, 0x8AA6, 0x8BF5, 0x9B86, 0, 0, 0, /* 0xD0 */
+ 0xFAA9, 0, 0, 0x8AB0, 0, 0x9051, 0x9B8B, 0x8E40, /* 0xD0 */
+ 0, 0x89C7, 0x9B8A, 0, 0x9B88, 0x9B8C, 0x9B89, 0x944A, /* 0xE0 */
+ 0x9ECB, 0x9052, 0, 0x9B8D, 0xFAAA, 0, 0x97BE, 0, /* 0xE0 */
+ 0x9B8E, 0, 0, 0x9B90, 0, 0x929E, 0x9B8F, 0, /* 0xF0 */
+ 0x90A1, 0, 0x8E9B, 0, 0, 0, 0x91CE, 0x8EF5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9595, 0x90EA, 0, 0x8ECB, 0x9B91, 0x8FAB, 0x9B92, /* 0x00 */
+ 0x9B93, 0x88D1, 0x91B8, 0x9071, 0, 0x9B94, 0x93B1, 0x8FAC, /* 0x00 */
+ 0, 0x8FAD, 0, 0x9B95, 0, 0, 0x90EB, 0, /* 0x10 */
+ 0, 0, 0x8FAE, 0, 0, 0, 0xFAAB, 0, /* 0x10 */
+ 0x9B96, 0, 0x9B97, 0, 0x96DE, 0, 0, 0, /* 0x20 */
+ 0x9B98, 0, 0, 0, 0, 0x8BC4, 0, 0, /* 0x20 */
+ 0, 0x8F41, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x9B99, 0x9B9A, 0x8EDA, 0x904B, 0x93F2, 0x9073, 0x94F6, 0x9441, /* 0x30 */
+ 0x8BC7, 0x9B9B, 0, 0, 0, 0x8B8F, 0x9B9C, 0, /* 0x40 */
+ 0x8BFC, 0, 0x93CD, 0x89AE, 0, 0x8E72, 0x9B9D, 0x9BA0, /* 0x40 */
+ 0x9B9F, 0x8BFB, 0, 0x9B9E, 0, 0x9357, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x91AE, 0, /* 0x50 */
+ 0x936A, 0x8EC6, 0, 0, 0x9177, 0x979A, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x9BA2, 0, 0x9BA3, 0x93D4, /* 0x60 */
+ 0, 0x8E52, 0, 0, 0, 0, 0x9BA5, 0, /* 0x70 */
+ 0, 0x9BA6, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x9BA7, 0, 0, 0, /* 0x80 */
+ 0x8AF2, 0x9BA8, 0, 0, 0x9BA9, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x89AA, 0, 0, 0, 0, 0xFAAC, 0, /* 0xA0 */
+ 0x915A, 0x8AE2, 0, 0x9BAB, 0x96A6, 0, 0, 0, /* 0xA0 */
+ 0, 0x91D0, 0, 0x8A78, 0, 0, 0x9BAD, 0x9BAF, /* 0xB0 */
+ 0x8ADD, 0, 0xFAAD, 0x9BAC, 0x9BAE, 0, 0x9BB1, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x9BB0, 0, 0x9BB2, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x9BB3, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x93BB, 0x8BAC, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x89E3, 0x9BB4, 0x9BB9, 0, 0, 0x9BB7, 0, 0x95F5, /* 0xE0 */
+ 0x95F4, 0, 0, 0, 0, 0xFAAE, 0x9387, 0, /* 0xF0 */
+ 0, 0, 0x9BB6, 0x8F73, 0, 0x9BB5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9092, /* 0x00 */
+ 0, 0, 0, 0x9BBA, 0, 0, 0x8DE8, 0, /* 0x00 */
+ 0, 0x9BC0, 0, 0, 0x9BC1, 0x9BBB, 0x8A52, 0x9BBC, /* 0x10 */
+ 0x9BC5, 0x9BC4, 0x9BC3, 0x9BBF, 0, 0, 0, 0x9BBE, /* 0x10 */
+ 0, 0, 0x9BC2, 0, 0, 0, 0, 0xFAAF, /* 0x20 */
+ 0, 0x95F6, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xFAB2, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x9BC9, 0x9BC6, 0, 0x9BC8, 0, /* 0x40 */
+ 0x9792, 0, 0x9BC7, 0xFAB0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x9BBD, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x9093, 0, 0, 0x9BCA, 0xFAB3, 0, 0x8DB5, /* 0x60 */
+ 0, 0, 0, 0x9BCB, 0, 0, 0x9BCC, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x9BCF, 0, 0x9BCE, 0, 0, 0x9BCD, /* 0x80 */
+ 0, 0, 0, 0x9388, 0x9BB8, 0, 0, 0, /* 0x80 */
+ 0x9BD5, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x9BD1, 0, 0, /* 0x90 */
+ 0, 0, 0x9BD0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x9BD2, 0, 0x9BD3, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9BD6, /* 0xB0 */
+ 0xFAB4, 0xFAB5, 0x97E4, 0, 0x9BD7, 0x9BD4, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x9BD8, 0, 0, 0x8ADE, 0x9BD9, 0, 0, /* 0xC0 */
+ 0xFAB6, 0, 0x9BDB, 0x9BDA, 0, 0, 0x9BDC, 0, /* 0xD0 */
+ 0, 0, 0, 0x9BDD, 0, 0x90EC, 0x8F42, 0, /* 0xD0 */
+ 0, 0x8F84, 0, 0x9183, 0, 0x8D48, 0x8DB6, 0x8D49, /* 0xE0 */
+ 0x8B90, 0, 0, 0x9BDE, 0, 0, 0x8DB7, 0, /* 0xE0 */
+ 0, 0x8CC8, 0x9BDF, 0x96A4, 0x9462, 0x9BE0, 0, 0x8D4A, /* 0xF0 */
+ 0, 0, 0, 0x8AAA, 0, 0x9246, 0x8BD0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E73, 0x957A, 0, 0, 0x94BF, 0, /* 0x00 */
+ 0, 0, 0, 0x9BE1, 0x8AF3, 0, 0, 0, /* 0x00 */
+ 0, 0x9BE4, 0, 0, 0, 0, 0x929F, 0, /* 0x10 */
+ 0, 0x9BE3, 0x9BE2, 0x9BE5, 0, 0x92E9, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x9083, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x8E74, 0, 0x90C8, 0, 0x91D1, /* 0x20 */
+ 0x8B41, 0, 0, 0x92A0, 0, 0, 0x9BE6, 0x9BE7, /* 0x30 */
+ 0x8FED, 0, 0, 0, 0, 0x9658, 0, 0, /* 0x30 */
+ 0x9BEA, 0, 0, 0x9BE9, 0x9BE8, 0x959D, 0, 0x9BF1, /* 0x40 */
+ 0, 0, 0, 0, 0x9679, 0, 0x9BEB, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x9BED, 0x968B, 0, 0x9BEC, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9BEE, /* 0x50 */
+ 0, 0x94A6, 0x9BEF, 0x95BC, 0x9BF0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x8AB1, 0x95BD, 0x944E, 0x9BF2, 0x9BF3, 0, /* 0x70 */
+ 0x8D4B, 0x8AB2, 0x9BF4, 0x8CB6, 0x9763, 0x9748, 0x8AF4, 0x9BF6, /* 0x70 */
+ 0, 0x92A1, 0, 0x8D4C, 0x8FAF, 0, 0, 0x94DD, /* 0x80 */
+ 0, 0, 0x8FB0, 0, 0, 0, 0, 0x8F98, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x92EA, 0x95F7, 0x9358, /* 0x90 */
+ 0, 0, 0x8D4D, 0, 0x957B, 0, 0, 0, /* 0x90 */
+ 0x9BF7, 0, 0, 0, 0, 0, 0x9378, 0x8DC0, /* 0xA0 */
+ 0, 0, 0, 0x8CC9, 0, 0x92EB, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x88C1, 0x8F8E, 0x8D4E, /* 0xB0 */
+ 0x9766, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x9BF8, 0x9BF9, 0x9470, 0, 0, 0, 0, /* 0xC0 */
+ 0x9BFA, 0x97F5, 0x984C, 0, 0, 0, 0, 0x9BFC, /* 0xC0 */
+ 0x9BFB, 0, 0, 0x8A66, 0, 0, 0x9C40, 0, /* 0xD0 */
+ 0, 0, 0x9C43, 0x9C44, 0, 0x9C42, 0, 0x955F, /* 0xD0 */
+ 0x8FB1, 0x9C46, 0x9C45, 0x9C41, 0, 0, 0, 0, /* 0xE0 */
+ 0x9C47, 0x9C48, 0, 0, 0x9C49, 0, 0, 0, /* 0xE0 */
+ 0x9C4C, 0x9C4A, 0, 0x9C4B, 0x9C4D, 0, 0x8984, 0x92EC, /* 0xF0 */
+ 0x9C4E, 0, 0x8C9A, 0x89F4, 0x9455, 0, 0x9C4F, 0x93F9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x95D9, 0, 0x9C50, 0x984D, 0, 0, 0, /* 0x00 */
+ 0, 0x9C51, 0x95BE, 0x9C54, 0x989F, 0x98AF, 0, 0x8EAE, /* 0x00 */
+ 0x93F3, 0x9C55, 0, 0x8B7C, 0x92A2, 0x88F8, 0x9C56, 0x95A4, /* 0x10 */
+ 0x8D4F, 0, 0, 0x926F, 0, 0, 0, 0x92ED, /* 0x10 */
+ 0, 0xFAB7, 0, 0, 0, 0x96ED, 0x8CB7, 0x8CCA, /* 0x20 */
+ 0, 0x9C57, 0, 0, 0, 0x9C58, 0, 0x9C5E, /* 0x20 */
+ 0, 0x8EE3, 0, 0, 0xFAB8, 0x92A3, 0, 0x8BAD, /* 0x30 */
+ 0x9C59, 0, 0, 0, 0x954A, 0, 0x9265, 0, /* 0x30 */
+ 0, 0x9C5A, 0, 0, 0, 0xFA67, 0, 0, /* 0x40 */
+ 0x9C5B, 0, 0x8BAE, 0, 0x9C5C, 0, 0x9C5D, 0, /* 0x40 */
+ 0, 0x9C5F, 0, 0x9396, 0, 0, 0x9C60, 0x9C61, /* 0x50 */
+ 0, 0x9C62, 0, 0, 0x9C53, 0x9C52, 0, 0, /* 0x50 */
+ 0, 0x9C63, 0x8C60, 0, 0, 0, 0x9546, 0xFAB9, /* 0x60 */
+ 0, 0x8DCA, 0x9556, 0x92A4, 0x956A, 0x9C64, 0, 0, /* 0x60 */
+ 0x8FB2, 0x8965, 0, 0x9C65, 0, 0, 0, 0x9C66, /* 0x70 */
+ 0, 0x96F0, 0, 0, 0x94DE, 0, 0, 0x9C69, /* 0x70 */
+ 0x899D, 0x90AA, 0x9C68, 0x9C67, 0x8C61, 0x91D2, 0, 0x9C6D, /* 0x80 */
+ 0x9C6B, 0, 0x9C6A, 0x97A5, 0x8CE3, 0, 0, 0, /* 0x80 */
+ 0x8F99, 0x9C6C, 0x936B, 0x8F5D, 0, 0, 0, 0x93BE, /* 0x90 */
+ 0x9C70, 0x9C6F, 0, 0, 0, 0, 0x9C6E, 0, /* 0x90 */
+ 0x9C71, 0x8CE4, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x9C72, 0x959C, 0x8F7A, 0, 0, 0x9C73, 0x94F7, 0, /* 0xA0 */
+ 0, 0, 0, 0x93BF, 0x92A5, 0, 0, 0xFABA, /* 0xB0 */
+ 0, 0x934F, 0, 0, 0x9C74, 0x8B4A, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x9053, 0, 0x954B, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x8AF5, 0x9445, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x9C75, 0x8E75, /* 0xD0 */
+ 0x9659, 0x965A, 0, 0, 0x899E, 0x9C7A, 0xFABB, 0, /* 0xD0 */
+ 0x9289, 0, 0, 0, 0x9C77, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x89F5, 0, 0, 0, 0, /* 0xE0 */
+ 0x9CAB, 0x9C79, 0, 0, 0, 0x944F, 0, 0, /* 0xF0 */
+ 0x9C78, 0, 0, 0x9C76, 0, 0x8D9A, 0, 0x9C7C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x9C83, 0x9C89, /* 0x00 */
+ 0x9C81, 0, 0x937B, 0, 0, 0x9C86, 0x957C, 0, /* 0x10 */
+ 0, 0x9C80, 0, 0x9C85, 0x97E5, 0x8E76, 0, 0, /* 0x10 */
+ 0x91D3, 0x9C7D, 0, 0, 0, 0x8B7D, 0x9C88, 0x90AB, /* 0x20 */
+ 0x8985, 0x9C82, 0x89F6, 0x9C87, 0, 0, 0, 0x8BAF, /* 0x20 */
+ 0, 0x9C84, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x9C8A, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x9C8C, 0x9C96, 0x9C94, 0, 0, 0x9C91, 0, /* 0x40 */
+ 0, 0, 0x9C90, 0x97F6, 0, 0x9C92, 0, 0, /* 0x40 */
+ 0x8BB0, 0, 0x8D50, 0, 0, 0x8F9A, 0, 0, /* 0x50 */
+ 0, 0x9C99, 0x9C8B, 0, 0, 0xFABC, 0, 0x9C8F, /* 0x50 */
+ 0x9C7E, 0, 0x89F8, 0x9C93, 0x9C95, 0x9270, 0, 0, /* 0x60 */
+ 0x8DA6, 0x89B6, 0x9C8D, 0x9C98, 0x9C97, 0x8BB1, 0, 0x91A7, /* 0x60 */
+ 0x8A86, 0, 0, 0, 0, 0x8C62, 0, 0x9C8E, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x9C9A, 0, 0x9C9D, 0x9C9F, 0xFABD, 0, 0, /* 0x80 */
+ 0, 0x8EBB, 0xFABE, 0x9CA5, 0x92EE, 0x9C9B, 0, 0, /* 0x80 */
+ 0, 0, 0x9CA3, 0, 0x89F7, 0, 0x9CA1, 0x9CA2, /* 0x90 */
+ 0, 0, 0x9C9E, 0x9CA0, 0, 0, 0, 0x8CE5, /* 0x90 */
+ 0x9749, 0, 0, 0x8AB3, 0, 0, 0x8978, 0x9CA4, /* 0xA0 */
+ 0, 0x9459, 0x88AB, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x94DF, 0x9C7B, 0x9CAA, 0x9CAE, 0x96E3, 0, /* 0xB0 */
+ 0x9CA7, 0, 0, 0, 0x9389, 0x9CAC, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x8FEE, 0x9CAD, 0x93D5, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x9866, 0, 0x9CA9, 0, 0xFAC0, 0, 0, /* 0xD0 */
+ 0x9CAF, 0, 0x8D9B, 0, 0x90C9, 0, 0xFABF, 0x88D2, /* 0xD0 */
+ 0x9CA8, 0x9CA6, 0, 0x9179, 0, 0, 0, 0x9C9C, /* 0xE0 */
+ 0x8E53, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x91C4, 0x9CBB, 0xFAC2, 0x917A, 0x9CB6, 0, 0x9CB3, 0x9CB4, /* 0xF0 */
+ 0, 0x8EE4, 0x9CB7, 0x9CBA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9CB5, 0x8F44, 0, 0x9CB8, 0, 0, 0x9CB2, 0, /* 0x00 */
+ 0x96FA, 0x96F9, 0, 0, 0, 0x9CBC, 0x9CBD, 0x88D3, /* 0x00 */
+ 0, 0xFAC3, 0, 0, 0, 0x9CB1, 0, 0, /* 0x10 */
+ 0, 0, 0x8BF0, 0x88A4, 0, 0, 0, 0x8AB4, /* 0x10 */
+ 0xFAC1, 0x9CB9, 0, 0, 0, 0, 0, 0x9CC1, /* 0x20 */
+ 0x9CC0, 0, 0, 0, 0x9CC5, 0, 0, 0, /* 0x20 */
+ 0xFAC5, 0, 0, 0, 0x9CC6, 0, 0, 0xFAC4, /* 0x30 */
+ 0, 0, 0, 0, 0x9CC4, 0x9CC7, 0x9CBF, 0x9CC3, /* 0x30 */
+ 0, 0, 0x9CC8, 0, 0x9CC9, 0, 0, 0x9CBE, /* 0x40 */
+ 0x8E9C, 0, 0x9CC2, 0x91D4, 0x8D51, 0x9CB0, 0x9054, 0, /* 0x40 */
+ 0, 0, 0, 0x9CD6, 0, 0x95E7, 0, 0, /* 0x50 */
+ 0x9CCC, 0x9CCD, 0x9CCE, 0, 0, 0x9CD5, 0, 0x9CD4, /* 0x50 */
+ 0, 0, 0x969D, 0x8AB5, 0, 0x9CD2, 0, 0x8C64, /* 0x60 */
+ 0x8A53, 0, 0, 0x9CCF, 0, 0, 0x97B6, 0x9CD1, /* 0x60 */
+ 0x88D4, 0x9CD3, 0, 0x9CCA, 0x9CD0, 0x9CD7, 0x8C63, 0x9CCB, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x977C, 0, /* 0x70 */
+ 0, 0, 0x974A, 0, 0, 0, 0, 0x9CDA, /* 0x80 */
+ 0, 0, 0x9CDE, 0, 0, 0, 0x919E, 0, /* 0x80 */
+ 0x97F7, 0x9CDF, 0, 0, 0x9CDC, 0, 0x9CD9, 0, /* 0x90 */
+ 0xFAC6, 0x9CD8, 0x9CDD, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x95AE, 0, 0, 0x93B2, /* 0xA0 */
+ 0, 0x8C65, 0, 0x9CE0, 0x9CDB, 0, 0x9CE1, 0, /* 0xA0 */
+ 0, 0, 0x8C9B, 0, 0, 0, 0x89AF, 0, /* 0xB0 */
+ 0, 0, 0x9CE9, 0, 0, 0, 0x8AB6, 0, /* 0xB0 */
+ 0, 0, 0, 0x9CE7, 0, 0, 0x9CE8, 0x8DA7, /* 0xC0 */
+ 0x9CE6, 0x9CE4, 0x9CE3, 0x9CEA, 0x9CE2, 0x9CEC, 0, 0, /* 0xC0 */
+ 0x89F9, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x9CEE, 0, 0, 0x9CED, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x92A6, 0, 0x9CF1, 0, 0x9CEF, 0x9CE5, /* 0xF0 */
+ 0x8C9C, 0, 0x9CF0, 0, 0x9CF4, 0x9CF3, 0x9CF5, 0x9CF2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9CF6, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x9CF7, 0x9CF8, 0x95E8, 0, 0x9CFA, 0x9CF9, 0x8F5E, 0, /* 0x00 */
+ 0x90AC, 0x89E4, 0x89FA, 0xFAC7, 0x9CFB, 0, 0x88BD, 0, /* 0x10 */
+ 0, 0, 0x90CA, 0x9CFC, 0, 0xE6C1, 0x9D40, 0x8C81, /* 0x10 */
+ 0, 0x9D41, 0, 0, 0, 0, 0x90ED, 0, /* 0x20 */
+ 0, 0, 0x9D42, 0, 0, 0, 0x9D43, 0x8B59, /* 0x20 */
+ 0x9D44, 0, 0x9D45, 0x9D46, 0x91D5, 0, 0, 0, /* 0x30 */
+ 0x8CCB, 0, 0, 0x96DF, 0, 0, 0, 0x965B, /* 0x30 */
+ 0x8F8A, 0x9D47, 0, 0, 0, 0, 0, 0x90EE, /* 0x40 */
+ 0xE7BB, 0x94E0, 0, 0x8EE8, 0, 0x8DCB, 0x9D48, 0, /* 0x40 */
+ 0, 0, 0, 0x91C5, 0, 0x95A5, 0, 0, /* 0x50 */
+ 0x91EF, 0, 0, 0x9D4B, 0, 0, 0x9D49, 0, /* 0x50 */
+ 0x9D4C, 0, 0, 0x9D4A, 0, 0, 0, 0, /* 0x60 */
+ 0x9D4D, 0, 0, 0, 0, 0, 0x95AF, 0, /* 0x60 */
+ 0, 0x88B5, 0, 0, 0, 0, 0x957D, 0, /* 0x70 */
+ 0, 0x94E1, 0, 0, 0x9D4E, 0, 0x9D51, 0x8FB3, /* 0x70 */
+ 0x8B5A, 0, 0x9D4F, 0x9D56, 0x8FB4, 0, 0, 0, /* 0x80 */
+ 0, 0x9D50, 0x9463, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x977D, 0x9D52, 0x9D53, 0x9D57, 0x938A, 0x9D54, 0x8D52, /* 0x90 */
+ 0x90DC, 0, 0, 0x9D65, 0x94B2, 0, 0x91F0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xFAC8, 0, /* 0xA0 */
+ 0, 0, 0, 0x94E2, 0x9DAB, 0, 0, 0, /* 0xA0 */
+ 0, 0x95F8, 0, 0, 0, 0x92EF, 0, 0, /* 0xB0 */
+ 0, 0x9695, 0, 0x9D5A, 0x899F, 0x928A, 0, 0, /* 0xB0 */
+ 0, 0, 0x9D63, 0, 0, 0x9253, 0x9D5D, 0x9D64, /* 0xC0 */
+ 0x9D5F, 0x9D66, 0x9D62, 0, 0x9D61, 0x948F, 0, 0x9D5B, /* 0xC0 */
+ 0x89FB, 0x9D59, 0x8B91, 0x91F1, 0x9D55, 0, 0, 0x9D58, /* 0xD0 */
+ 0x8D53, 0x90D9, 0, 0x8FB5, 0x9D60, 0x9471, 0, 0, /* 0xD0 */
+ 0x8B92, 0x8A67, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x8A87, 0x9040, 0x9D68, 0x9D6D, /* 0xE0 */
+ 0, 0x9D69, 0, 0x8C9D, 0, 0x9D6E, 0x8E41, 0x8D89, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0x8F45, 0x9D5C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E9D, 0x9D6B, 0, 0, 0, 0, 0x8E77, /* 0x00 */
+ 0x9D6C, 0x88C2, 0, 0, 0x9D67, 0, 0, 0, /* 0x00 */
+ 0, 0x92A7, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x8B93, 0, 0, 0, 0, 0, 0x8BB2, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9D6A, /* 0x20 */
+ 0x88A5, 0, 0, 0x8DC1, 0, 0, 0, 0x9055, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x92F0, 0, 0, 0x94D2, 0x9D70, 0x917D, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x91A8, 0, 0, 0x8E4A, 0x9D71, 0, 0x9D73, /* 0x40 */
+ 0x9D6F, 0, 0, 0, 0, 0x95DF, 0, 0x92BB, /* 0x50 */
+ 0, 0, 0, 0, 0x917B, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x95F9, /* 0x60 */
+ 0x8ECC, 0x9D80, 0, 0x9D7E, 0, 0, 0x9098, 0, /* 0x60 */
+ 0, 0, 0x8C9E, 0, 0, 0, 0x9D78, 0x8FB7, /* 0x70 */
+ 0, 0, 0x93E6, 0x9450, 0, 0, 0, 0, /* 0x70 */
+ 0x9D76, 0, 0, 0x917C, 0, 0, 0, 0, /* 0x80 */
+ 0x8EF6, 0x9D7B, 0, 0, 0x8FB6, 0, 0x9D75, 0x9D7A, /* 0x80 */
+ 0, 0, 0x9472, 0, 0, 0, 0x9D74, 0, /* 0x90 */
+ 0x8C40, 0, 0, 0x8A7C, 0, 0, 0, 0x9D7C, /* 0x90 */
+ 0x97A9, 0x8DCC, 0x9254, 0x9D79, 0, 0x90DA, 0, 0x8D54, /* 0xA0 */
+ 0x9084, 0x8986, 0x915B, 0x9D77, 0x8B64, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x8C66, 0, 0x92CD, 0x9D7D, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x917E, 0, 0, 0x9D81, 0, /* 0xB0 */
+ 0x9D83, 0, 0, 0x91B5, 0x9D89, 0, 0x9D84, 0, /* 0xC0 */
+ 0, 0x9D86, 0, 0, 0, 0, 0, 0x9560, /* 0xC0 */
+ 0x92F1, 0, 0x9D87, 0, 0, 0, 0x974B, 0, /* 0xD0 */
+ 0, 0, 0x9767, 0x8AB7, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x88AC, 0, 0x9D85, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x9D82, 0, 0, 0, 0, 0x8AF6, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x8987, 0xFAC9, 0x9D88, 0, /* 0xF0 */
+ 0, 0, 0x9768 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9D8C, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x91B9, 0, 0x9D93, /* 0x00 */
+ 0, 0, 0, 0x9D8D, 0, 0, 0x9D8A, 0x9D91, /* 0x10 */
+ 0, 0, 0, 0, 0x9D72, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x9D8E, 0, /* 0x20 */
+ 0x9D92, 0, 0, 0, 0x94C0, 0x938B, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x9D8B, 0, 0x9D8F, 0, /* 0x30 */
+ 0, 0, 0x8C67, 0, 0, 0, 0x8DEF, 0, /* 0x30 */
+ 0, 0, 0x90DB, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x9D97, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x9345, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xFACA, 0, 0, 0, 0, 0, 0, 0x9D94, /* 0x60 */
+ 0, 0x9680, 0, 0, 0, 0, 0, 0x9D95, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0x9D96, 0, /* 0x70 */
+ 0x96CC, 0, 0x90A0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x8C82, 0, 0, 0, 0, /* 0x80 */
+ 0x9D9D, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x8E54, 0x9D9A, 0, 0x9D99, 0, 0, /* 0x90 */
+ 0, 0, 0x9451, 0, 0, 0xFACB, 0x93B3, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x9350, 0x9D9B, 0, 0, /* 0xA0 */
+ 0, 0x9D9C, 0, 0x958F, 0, 0x9464, 0x8E42, 0, /* 0xA0 */
+ 0x90EF, 0, 0x966F, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x8A68, 0, 0x9DA3, 0x9D9E, 0, 0, 0, /* 0xB0 */
+ 0, 0x9769, 0x9DA5, 0, 0, 0x9DA1, 0, 0x9DA2, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x9180, 0xFACC, 0, /* 0xC0 */
+ 0, 0, 0x9DA0, 0, 0x9D5E, 0, 0, 0, /* 0xD0 */
+ 0x9DA4, 0, 0x9D9F, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x9DA9, 0x9DAA, 0x9346, 0x9DAC, 0, 0, 0x8E43, 0x9DA7, /* 0xE0 */
+ 0, 0, 0, 0, 0x8B5B, 0, 0, 0x9DAD, /* 0xE0 */
+ 0, 0x9DA6, 0x9DB1, 0, 0x9DB0, 0, 0x9DAF, 0, /* 0xF0 */
+ 0, 0, 0x9DB2, 0, 0, 0x9DB4, 0x8FEF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9DB3, 0, 0, 0, 0, 0x9DB7, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x9DB5, 0, 0, 0, 0x9DB6, 0x9D90, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x9DB9, 0x9DB8, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x9D98, 0x9DBA, 0x9DAE, 0, 0, 0x8E78, /* 0x20 */
+ 0, 0, 0, 0, 0x9DBB, 0x9DBC, 0x9DBE, 0x9DBD, /* 0x30 */
+ 0x9DBF, 0x89FC, 0, 0x8D55, 0, 0, 0x95FA, 0x90AD, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x8CCC, 0, 0, /* 0x40 */
+ 0x9DC1, 0, 0, 0, 0, 0x9DC4, 0xFACD, 0x9571, /* 0x40 */
+ 0, 0x8B7E, 0, 0, 0, 0x9DC3, 0x9DC2, 0x9473, /* 0x50 */
+ 0x9DC5, 0x8BB3, 0, 0, 0, 0x9DC7, 0x9DC6, 0, /* 0x50 */
+ 0, 0, 0x8AB8, 0x8E55, 0, 0, 0x93D6, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x8C68, 0, 0, 0, /* 0x60 */
+ 0x9094, 0, 0x9DC8, 0, 0x90AE, 0x9347, 0, 0x957E, /* 0x70 */
+ 0x9DC9, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x9DCA, 0x9DCB, 0, 0, 0, 0x95B6, /* 0x80 */
+ 0x9B7C, 0x90C4, 0, 0, 0x956B, 0, 0x8DD6, 0, /* 0x80 */
+ 0x94E3, 0x94C1, 0, 0, 0, 0, 0, 0x936C, /* 0x90 */
+ 0, 0x97BF, 0, 0x9DCD, 0x8ECE, 0, 0, 0x9DCE, /* 0x90 */
+ 0, 0x88B4, 0, 0, 0x8BD2, 0x90CB, 0, 0x9580, /* 0xA0 */
+ 0, 0, 0, 0x9DCF, 0x8E61, 0x9266, 0, 0x8E7A, /* 0xA0 */
+ 0x9056, 0, 0, 0, 0, 0, 0, 0x9DD0, /* 0xB0 */
+ 0, 0x95FB, 0, 0, 0x8997, 0x8E7B, 0, 0, /* 0xB0 */
+ 0, 0x9DD3, 0, 0x9DD1, 0x9DD4, 0x97B7, 0x9DD2, 0, /* 0xC0 */
+ 0, 0, 0, 0x90F9, 0x9DD5, 0, 0, 0x91B0, /* 0xC0 */
+ 0, 0, 0x9DD6, 0, 0, 0, 0, 0x8AF8, /* 0xD0 */
+ 0, 0x9DD8, 0, 0x9DD7, 0, 0, 0, 0, /* 0xD0 */
+ 0x9DD9, 0x9DDA, 0x8AF9, 0, 0, 0x93FA, 0x9255, 0x8B8C, /* 0xE0 */
+ 0x8E7C, 0x9181, 0, 0, 0x8F7B, 0x88AE, 0, 0, /* 0xE0 */
+ 0, 0x9DDB, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x89A0, 0x9DDF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFACE, 0, 0x8D56, 0x9DDE, 0, 0, 0x8DA9, 0x8FB8, /* 0x00 */
+ 0, 0xFAD1, 0x9DDD, 0, 0x8FB9, 0, 0x96BE, 0x8DA8, /* 0x00 */
+ 0, 0, 0, 0x88D5, 0x90CC, 0xFACF, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x9DE4, 0, 0xFAD3, 0x90AF, /* 0x10 */
+ 0x8966, 0, 0, 0, 0xFAD4, 0x8F74, 0, 0x9686, /* 0x20 */
+ 0x8DF0, 0, 0, 0, 0, 0x8FBA, 0xFAD2, 0x90A5, /* 0x20 */
+ 0, 0xFA63, 0, 0, 0x9DE3, 0x9DE1, 0x9DE2, 0, /* 0x30 */
+ 0, 0, 0, 0xFAD0, 0x928B, 0, 0, 0x9E45, /* 0x30 */
+ 0, 0x9DE8, 0x8E9E, 0x8D57, 0x9DE6, 0, 0, 0, /* 0x40 */
+ 0, 0x9DE7, 0, 0x9057, 0, 0, 0, 0x9DE5, /* 0x40 */
+ 0, 0, 0x8E4E, 0, 0, 0, 0, 0xFAD6, /* 0x50 */
+ 0, 0xFAD7, 0, 0, 0, 0x9DEA, 0x9DE9, 0x9DEE, /* 0x50 */
+ 0, 0, 0x9DEF, 0, 0x9DEB, 0xFAD5, 0x8A41, 0x9DEC, /* 0x60 */
+ 0x9DED, 0x94D3, 0, 0, 0, 0, 0x9581, 0x8C69, /* 0x60 */
+ 0x9DF0, 0, 0, 0xFAD9, 0x90B0, 0, 0x8FBB, 0, /* 0x70 */
+ 0, 0, 0x9271, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x8BC5, 0, 0x9DF1, 0x9DF5, 0, 0, 0x89C9, /* 0x80 */
+ 0x9DF2, 0x9DF4, 0, 0, 0, 0, 0x9DF3, 0, /* 0x80 */
+ 0, 0x8F8B, 0, 0, 0, 0, 0x9267, 0x88C3, /* 0x90 */
+ 0x9DF6, 0xFADA, 0, 0, 0, 0x9DF7, 0, 0, /* 0x90 */
+ 0xFADB, 0, 0x92A8, 0, 0, 0, 0x97EF, 0, /* 0xA0 */
+ 0, 0, 0, 0x8E62, 0, 0, 0x95E9, 0, /* 0xA0 */
+ 0, 0, 0xFADC, 0, 0x965C, 0, 0, 0, /* 0xB0 */
+ 0x9E41, 0x9DF9, 0, 0, 0x9DFC, 0, 0x9DFB, 0xFADD, /* 0xB0 */
+ 0, 0x9DF8, 0, 0, 0x9E40, 0, 0, 0x93DC, /* 0xC0 */
+ 0, 0x9DFA, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x9E42, 0, /* 0xD0 */
+ 0, 0x8F8C, 0x9E43, 0, 0x976A, 0x9498, 0, 0, /* 0xD0 */
+ 0x9E44, 0, 0, 0, 0, 0, 0x9E46, 0, /* 0xE0 */
+ 0, 0x9E47, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x9E48, 0, 0x8BC8, 0x8967, 0x8D58, 0x9E49, 0, 0x9E4A, /* 0xF0 */
+ 0x8F91, 0x9182, 0xFADE, 0xFA66, 0x99D6, 0x915D, 0x915C, 0x91D6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8DC5, 0, 0, 0x98F0, 0, 0, 0, 0, /* 0x00 */
+ 0x8C8E, 0x974C, 0, 0x95FC, 0, 0x959E, 0xFADF, 0x9E4B, /* 0x00 */
+ 0, 0, 0, 0, 0x8DF1, 0x92BD, 0x9E4C, 0x984E, /* 0x10 */
+ 0, 0, 0, 0x965D, 0, 0x92A9, 0x9E4D, 0x8AFA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x9E4E, 0x9E4F, /* 0x20 */
+ 0x96D8, 0, 0x96A2, 0x9696, 0x967B, 0x8E44, 0x9E51, 0, /* 0x20 */
+ 0, 0x8EE9, 0, 0, 0x9670, 0, 0x9E53, 0x9E56, /* 0x30 */
+ 0x9E55, 0, 0x8AF7, 0, 0, 0x8B80, 0, 0x9E52, /* 0x30 */
+ 0, 0x9E54, 0, 0, 0, 0, 0x9E57, 0, /* 0x40 */
+ 0, 0x9099, 0, 0, 0, 0, 0x979B, 0x88C7, /* 0x40 */
+ 0x8DDE, 0x91BA, 0, 0x8EDB, 0, 0, 0x8FF1, 0, /* 0x50 */
+ 0, 0x9E5A, 0, 0, 0x936D, 0, 0x9E58, 0x91A9, /* 0x50 */
+ 0x9E59, 0x8FF0, 0x96DB, 0x9E5B, 0x9E5C, 0x9788, 0xFAE1, 0, /* 0x60 */
+ 0, 0, 0x9E61, 0, 0, 0x8D59, 0, 0x9474, /* 0x60 */
+ 0x9E5E, 0x938C, 0x9DDC, 0x9DE0, 0, 0x8B6E, 0, 0x9466, /* 0x70 */
+ 0, 0, 0, 0, 0x9E60, 0, 0x8FBC, 0x94C2, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x9E66, 0, 0x94F8, /* 0x80 */
+ 0, 0x9E5D, 0, 0x9E63, 0x9E62, 0, 0, 0, /* 0x80 */
+ 0x90CD, 0, 0, 0, 0, 0x968D, 0, 0x97D1, /* 0x90 */
+ 0, 0, 0x9687, 0, 0x89CA, 0x8E7D, 0, 0, /* 0x90 */
+ 0x9867, 0x9E65, 0x9095, 0, 0, 0, 0x9E64, 0, /* 0xA0 */
+ 0, 0x9E5F, 0, 0, 0, 0, 0, 0x8CCD, /* 0xA0 */
+ 0, 0, 0, 0x9E6B, 0x9E69, 0, 0x89CB, 0x9E67, /* 0xB0 */
+ 0x9E6D, 0x9E73, 0, 0xFAE2, 0, 0, 0, 0, /* 0xB0 */
+ 0xFAE4, 0x91C6, 0, 0, 0x95BF, 0, 0x9E75, 0, /* 0xC0 */
+ 0, 0, 0x9541, 0, 0, 0, 0x9E74, 0x9490, /* 0xC0 */
+ 0x965E, 0x8AB9, 0, 0x90F5, 0x8F5F, 0, 0, 0, /* 0xD0 */
+ 0x92D1, 0, 0x974D, 0, 0, 0x9E70, 0x9E6F, 0, /* 0xD0 */
+ 0, 0, 0x9E71, 0, 0x9E6E, 0, 0, 0x9E76, /* 0xE0 */
+ 0, 0x9E6C, 0, 0, 0x9E6A, 0, 0x9E72, 0x9E68, /* 0xE0 */
+ 0, 0x928C, 0, 0x96F6, 0x8EC4, 0x8DF2, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0x8DB8, 0, 0, 0x968F, 0x8A60 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFAE5, 0x92CC, 0x93C8, 0x8968, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x90F0, 0, 0, 0x90B2, 0x8C49, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x9E78, 0, /* 0x10 */
+ 0, 0x8D5A, 0x8A9C, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x9E7A, 0x8A94, 0x9E81, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x9E7D, 0, 0x90F1, 0, 0, 0, /* 0x30 */
+ 0x8A6A, 0x8DAA, 0, 0, 0x8A69, 0x8DCD, 0, 0, /* 0x30 */
+ 0x9E7B, 0x8C85, 0x8C6A, 0x938D, 0xFAE6, 0, 0x9E79, 0, /* 0x40 */
+ 0x88C4, 0, 0, 0, 0, 0x9E7C, 0x9E7E, 0, /* 0x40 */
+ 0x8BCB, 0x8C4B, 0xFAE3, 0x8ABA, 0x8B6A, 0, 0, 0, /* 0x50 */
+ 0, 0x9E82, 0, 0, 0x8DF7, 0x9691, 0, 0x8E56, /* 0x50 */
+ 0, 0, 0, 0x9E83, 0, 0, 0, 0x954F, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x9E8F, 0, 0x89B1, 0x9E84, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x9E95, 0x9E85, /* 0x70 */
+ 0, 0x97C0, 0, 0x9E8C, 0, 0x947E, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x9E94, 0, 0x9E87, /* 0x80 */
+ 0, 0, 0, 0x88B2, 0x9E89, 0, 0, 0x8D5B, /* 0x90 */
+ 0, 0, 0, 0x9E8B, 0, 0x9E8A, 0, 0x9E86, /* 0x90 */
+ 0x9E91, 0, 0x8FBD, 0, 0, 0, 0x9AEB, 0x8CE6, /* 0xA0 */
+ 0x979C, 0, 0, 0, 0, 0x9E88, 0, 0x92F2, /* 0xA0 */
+ 0x8A42, 0x8DAB, 0, 0x9E80, 0, 0x9E90, 0x8A81, 0, /* 0xB0 */
+ 0, 0x9E8E, 0x9E92, 0, 0x938E, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x8AFC, 0, 0x9EB0, 0, /* 0xC0 */
+ 0xFA64, 0x96C7, 0x9E97, 0x8AFB, 0, 0x9E9E, 0, 0xFAE7, /* 0xC0 */
+ 0, 0, 0x965F, 0, 0x9E9F, 0x9EA1, 0, 0x9EA5, /* 0xD0 */
+ 0x9E99, 0, 0x9249, 0, 0, 0, 0, 0x938F, /* 0xD0 */
+ 0x9EA9, 0x9E9C, 0, 0x9EA6, 0, 0, 0, 0x9EA0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x9058, 0x9EAA, /* 0xE0 */
+ 0, 0, 0x90B1, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x9EA8, 0x8ABB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x986F, 0x9E96, 0, 0, 0x9EA4, 0x88D6, 0, 0, /* 0x00 */
+ 0x9E98, 0, 0, 0x96B8, 0x9E9D, 0x9041, 0x92C5, 0x9E93, /* 0x00 */
+ 0, 0, 0x9EA3, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x909A, 0x9EAD, 0x8A91, 0x8C9F, 0, 0, 0, /* 0x10 */
+ 0, 0x9EAF, 0x9E9A, 0x9EAE, 0, 0x9EA7, 0x9E9B, 0, /* 0x20 */
+ 0x9EAB, 0, 0x9EAC, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x9EBD, 0, 0, 0, 0x93CC, 0, 0x9EA2, 0, /* 0x30 */
+ 0, 0x9EB9, 0, 0, 0, 0x9EBB, 0, 0x92D6, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x976B, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x9596, 0x9EB6, 0x91C8, 0, 0, /* 0x50 */
+ 0, 0x9EBC, 0x915E, 0, 0x9EB3, 0x9EC0, 0x9EBF, 0, /* 0x50 */
+ 0x93ED, 0x9EBE, 0x93E8, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xFAE9, 0, 0x9EC2, 0x9EB5, 0, 0x8BC6, 0x9EB8, 0x8F7C, /* 0x60 */
+ 0, 0, 0, 0x9480, 0x9EBA, 0x8BC9, 0, 0x9EB2, /* 0x70 */
+ 0x9EB4, 0x9EB1, 0, 0, 0x984F, 0x8A79, 0x9EB7, 0, /* 0x70 */
+ 0, 0x9EC1, 0x8A54, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x8DE5, 0, 0, 0, 0x897C, 0, /* 0x80 */
+ 0, 0x9ED2, 0, 0, 0x9850, 0x9ED5, 0, 0, /* 0x90 */
+ 0xFAEB, 0, 0, 0x9059, 0x9ED4, 0, 0, 0, /* 0x90 */
+ 0x9ED3, 0, 0, 0, 0, 0, 0, 0x9ED0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x9EC4, 0, /* 0xA0 */
+ 0, 0x9EE1, 0x9EC3, 0, 0x9ED6, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x9ECE, 0, 0, 0x9EC9, 0x9EC6, /* 0xB0 */
+ 0, 0x9EC7, 0, 0x9ECF, 0, 0, 0, 0xEAA0, /* 0xC0 */
+ 0, 0, 0x9ECC, 0x8D5C, 0x92C6, 0x9184, 0x9ECA, 0, /* 0xC0 */
+ 0x9EC5, 0, 0, 0x9EC8, 0, 0, 0, 0, /* 0xD0 */
+ 0x976C, 0x968A, 0, 0, 0, 0x9ECD, 0x9ED7, 0, /* 0xD0 */
+ 0, 0, 0xFAEC, 0, 0, 0, 0, 0x9EDF, /* 0xE0 */
+ 0x9ED8, 0, 0, 0x9EE5, 0, 0x9EE3, 0, 0, /* 0xE0 */
+ 0, 0, 0x9EDE, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x9EDD, 0, 0x92CE, 0, 0x9185, 0, 0x9EDB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9ED9, 0, 0, 0x9EE0, 0, 0, /* 0x00 */
+ 0, 0, 0x9EE6, 0x94F3, 0x9EEC, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x9EE7, 0x9EEA, 0x9EE4, 0, 0, 0x9294, /* 0x10 */
+ 0, 0x9557, 0, 0x9EDA, 0, 0, 0x9EE2, 0x8FBE, /* 0x10 */
+ 0, 0x96CD, 0x9EF6, 0x9EE9, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x8CA0, 0x89A1, 0x8A7E, 0, 0, 0x9ED1, 0, /* 0x20 */
+ 0xFAED, 0, 0, 0, 0, 0x8FBF, 0x9EEE, 0, /* 0x30 */
+ 0x9EF5, 0x8EF7, 0x8A92, 0, 0, 0x924D, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x9EEB, 0, 0xFAEF, 0x9EF0, /* 0x40 */
+ 0x9EF4, 0, 0, 0x8BB4, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x8B6B, 0x9EF2, 0, 0, 0, 0, 0, 0x8B40, /* 0x50 */
+ 0, 0x93C9, 0x9EF1, 0, 0, 0, 0x9EF3, 0, /* 0x60 */
+ 0, 0, 0, 0xFAEE, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x9EED, 0xFAF0, 0, 0, 0, 0, /* 0x70 */
+ 0x9EEF, 0, 0, 0, 0, 0, 0xFAF1, 0x8A80, /* 0x70 */
+ 0x9268, 0, 0, 0, 0x9EFA, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x9EF8, 0x8CE7, 0, /* 0x80 */
+ 0x9EF7, 0, 0, 0, 0, 0, 0, 0x9F40, /* 0x90 */
+ 0, 0, 0, 0, 0x9E77, 0, 0, 0, /* 0x90 */
+ 0x9EF9, 0, 0x9EFB, 0x9EFC, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x9F4B, 0, 0x9F47, 0, 0x9E8D, 0, /* 0xA0 */
+ 0, 0, 0, 0x9F46, 0, 0, 0, 0, /* 0xB0 */
+ 0x9F45, 0, 0, 0x9F42, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x9EE8, 0x9F44, 0x9F43, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x9F49, 0, 0x9845, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x9F4C, 0x8BF9, 0, 0, 0x9F48, 0x9F4A, /* 0xD0 */
+ 0, 0, 0xFAF2, 0, 0xFAF3, 0, 0, 0, /* 0xE0 */
+ 0x94A5, 0, 0x9F4D, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x9F51, 0x9F4E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9793, 0x9F4F, 0, 0, /* 0x00 */
+ 0, 0, 0x9EDC, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x9F52, 0, 0, 0, 0x9F53, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x8954, 0, 0x9F55, /* 0x10 */
+ 0x8C87, 0x8E9F, 0, 0x8BD3, 0, 0, 0, 0x89A2, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x977E, 0, 0, 0, 0, 0x9F57, /* 0x30 */
+ 0x9F56, 0x9F59, 0x8B5C, 0, 0, 0x8BD4, 0x8ABC, 0, /* 0x30 */
+ 0, 0, 0, 0x9F5C, 0, 0, 0, 0x9F5B, /* 0x40 */
+ 0, 0x9F5D, 0, 0, 0x89CC, 0, 0x9256, 0, /* 0x40 */
+ 0x9F5E, 0, 0, 0x8ABD, 0x9F60, 0, 0, 0, /* 0x50 */
+ 0, 0x9F5F, 0, 0x9F61, 0, 0, 0, 0x9F62, /* 0x50 */
+ 0, 0x9F63, 0x8E7E, 0x90B3, 0x8D9F, 0, 0x9590, 0, /* 0x60 */
+ 0, 0x95E0, 0x9863, 0, 0, 0, 0, 0x8E95, /* 0x60 */
+ 0, 0, 0, 0x8DCE, 0x97F0, 0, 0, 0, /* 0x70 */
+ 0x9F64, 0x9F65, 0, 0x8E80, 0, 0, 0, 0x9F66, /* 0x70 */
+ 0x9F67, 0, 0, 0x9F69, 0x9F68, 0, 0x9677, 0, /* 0x80 */
+ 0, 0x8F7D, 0x8EEA, 0x8E63, 0, 0x9F6A, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x9F6C, 0x9042, 0, /* 0x90 */
+ 0x9F6B, 0, 0, 0, 0, 0, 0x9F6D, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x9F6E, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x9F6F, 0x9F70, 0, 0, 0, 0x9F71, /* 0xA0 */
+ 0, 0x9F73, 0x9F72, 0x9F74, 0x89A3, 0x9269, 0, 0x9F75, /* 0xB0 */
+ 0, 0, 0x8E45, 0x8A6B, 0x9F76, 0, 0, 0x9361, /* 0xB0 */
+ 0x9ACA, 0, 0, 0, 0, 0x8B42, 0x9F77, 0, /* 0xC0 */
+ 0, 0, 0, 0x9F78, 0, 0x95EA, 0x9688, 0, /* 0xC0 */
+ 0, 0, 0x93C5, 0x9F79, 0x94E4, 0, 0xFAF4, 0, /* 0xD0 */
+ 0x94F9, 0, 0, 0x96D1, 0, 0, 0, 0x9F7A, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x9F7C, 0x9F7B, 0, 0, 0x9F7E, /* 0xE0 */
+ 0, 0, 0, 0x9F7D /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x9F81, 0, 0, 0, 0, 0, 0, 0x8E81, /* 0x00 */
+ 0, 0x96AF, 0, 0x9F82, 0x9F83, 0, 0, 0x8B43, /* 0x10 */
+ 0, 0, 0, 0x9F84, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x9F86, 0x9F85, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x9085, 0, 0, 0x9558, /* 0x30 */
+ 0x8969, 0, 0, 0, 0, 0, 0x94C3, 0xFAF5, /* 0x30 */
+ 0x92F3, 0x8F60, 0x8B81, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x94C4, 0, /* 0x40 */
+ 0x8EAC, 0, 0, 0, 0, 0x9F88, 0, 0x8ABE, /* 0x50 */
+ 0, 0, 0x8998, 0, 0xFAF6, 0x93F0, 0x9F87, 0x8D5D, /* 0x50 */
+ 0x9272, 0, 0x9F89, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x9F91, 0, 0x9F8A, 0, 0, 0, 0, 0xFAF8, /* 0x60 */
+ 0x91BF, 0, 0x8B82, 0x9F92, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x8C88, 0, 0, 0x8B44, 0x9F90, 0, /* 0x70 */
+ 0, 0x9F8E, 0x9F8B, 0x9780, 0, 0, 0xFAF7, 0, /* 0x80 */
+ 0x92BE, 0, 0, 0, 0x93D7, 0x9F8C, 0, 0, /* 0x80 */
+ 0x9F94, 0, 0x9F93, 0x8C42, 0, 0, 0x89AB, 0, /* 0x90 */
+ 0, 0x8DB9, 0x9F8D, 0x9F8F, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9676, 0x91F2, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x9697, 0, 0, 0x9F9C, 0, /* 0xA0 */
+ 0, 0x9F9D, 0, 0x89CD, 0, 0, 0, 0, /* 0xB0 */
+ 0x95A6, 0x96FB, 0x9F9F, 0x8EA1, 0x8FC0, 0x9F98, 0x9F9E, 0x8988, /* 0xB0 */
+ 0, 0x8BB5, 0, 0, 0x9F95, 0x9F9A, 0, 0, /* 0xC0 */
+ 0, 0x90F2, 0x9491, 0, 0x94E5, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x9F97, 0, 0x9640, 0, 0x9F99, /* 0xD0 */
+ 0, 0x9FA2, 0xFAF9, 0x9FA0, 0, 0x9F9B, 0, 0, /* 0xD0 */
+ 0, 0x9641, 0x9467, 0x8B83, 0, 0x9344, 0, 0, /* 0xE0 */
+ 0x928D, 0, 0x9FA3, 0, 0, 0, 0, 0x9FA1, /* 0xE0 */
+ 0x91D7, 0x9F96, 0, 0x896A /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFAFA, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x976D, 0x9FAE, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x9FAD, 0, 0, 0, 0, 0x90F4, /* 0x10 */
+ 0, 0x9FAA, 0, 0x978C, 0, 0, 0x93B4, 0x9FA4, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x92C3, 0, 0, /* 0x20 */
+ 0, 0x896B, 0x8D5E, 0x9FA7, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x8F46, 0x9FAC, 0, 0x9FAB, 0x9FA6, 0, /* 0x30 */
+ 0x9FA9, 0, 0, 0x8A88, 0, 0x9FA8, 0x9468, 0, /* 0x30 */
+ 0, 0x97AC, 0, 0, 0x8FF2, 0x90F3, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x9FB4, 0x9FB2, 0, 0x956C, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x9FAF, 0x9FB1, 0, 0x8959, 0, /* 0x60 */
+ 0, 0x8D5F, 0x9851, 0, 0x8A5C, 0, 0x9582, 0xFAFC, /* 0x60 */
+ 0, 0, 0, 0, 0x9781, 0, 0, 0x8A43, /* 0x70 */
+ 0x905A, 0x9FB3, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x9FB8, 0, 0xFAFB, /* 0x80 */
+ 0x8FC1, 0, 0, 0, 0x974F, 0, 0x9FB5, 0, /* 0x80 */
+ 0, 0, 0, 0x9FB0, 0, 0x9FB6, 0xFB40, 0, /* 0x90 */
+ 0, 0x97DC, 0, 0x9393, 0x93C0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xFB41, 0, 0, 0x8A55, /* 0xA0 */
+ 0, 0, 0x8974, 0, 0, 0x9FBC, 0, 0, /* 0xB0 */
+ 0x9FBF, 0, 0, 0, 0x97C1, 0, 0, 0, /* 0xB0 */
+ 0x9784, 0, 0, 0, 0, 0x9FC6, 0x9FC0, 0x9FBD, /* 0xC0 */
+ 0, 0, 0, 0x97D2, 0x9FC3, 0, 0, 0xFB42, /* 0xC0 */
+ 0, 0x8F69, 0x9FC5, 0, 0, 0x9FCA, 0, 0, /* 0xD0 */
+ 0x9391, 0x9FC8, 0, 0, 0, 0, 0x9FC2, 0, /* 0xD0 */
+ 0, 0x9257, 0, 0, 0x9FC9, 0, 0x9FBE, 0, /* 0xE0 */
+ 0x9FC4, 0, 0x9FCB, 0x88FA, 0x9FC1, 0, 0x9FCC, 0, /* 0xE0 */
+ 0, 0x905B, 0xFB44, 0x8F7E, 0, 0x95A3, 0, 0x8DAC, /* 0xF0 */
+ 0xFB43, 0x9FB9, 0x9FC7, 0x9359, 0xFB45 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x90B4, 0, 0x8A89, /* 0x00 */
+ 0x8DCF, 0x8FC2, 0x9FBB, 0x8F61, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x8C6B, 0, 0x9FBA, 0, 0, /* 0x10 */
+ 0, 0x9FD0, 0x8F8D, 0x8CB8, 0, 0x9FDF, 0, 0x9FD9, /* 0x10 */
+ 0x8B94, 0x936E, 0, 0x9FD4, 0x9FDD, 0x88AD, 0x8951, 0xFB48, /* 0x20 */
+ 0, 0x89B7, 0, 0x9FD6, 0x91AA, 0x9FCD, 0x9FCF, 0x8D60, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x9FE0, 0xFB46, 0x9FDB, 0, 0xFB49, 0, 0x9FD3, 0, /* 0x30 */
+ 0, 0, 0, 0x9FDA, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x96A9, 0, 0, 0x9FD8, 0x9FDC, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x8CCE, 0, /* 0x50 */
+ 0x8FC3, 0, 0, 0x9258, 0xFB47, 0, 0, 0x9FD2, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x974E, /* 0x60 */
+ 0, 0, 0, 0x9FD5, 0, 0, 0x9FCE, 0x9392, /* 0x60 */
+ 0, 0, 0x9FD1, 0, 0, 0, 0x9FD7, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x9870, 0x8EBC, /* 0x70 */
+ 0x969E, 0, 0x9FE1, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x94AC, 0, 0, 0x9FED, /* 0x80 */
+ 0x8CB9, 0, 0, 0, 0, 0, 0x8F80, 0, /* 0x90 */
+ 0x9FE3, 0, 0, 0, 0x97AD, 0x8D61, 0, 0x9FF0, /* 0x90 */
+ 0, 0, 0x88EC, 0, 0, 0x9FEE, 0, 0, /* 0xA0 */
+ 0, 0, 0x9FE2, 0, 0, 0, 0, 0x9FE8, /* 0xA0 */
+ 0, 0, 0x9FEA, 0, 0, 0, 0x976E, 0x9FE5, /* 0xB0 */
+ 0, 0, 0x934D, 0, 0, 0x9FE7, 0, 0xFB4A, /* 0xB0 */
+ 0, 0, 0x9FEF, 0, 0x9FE9, 0x96C5, 0, 0, /* 0xC0 */
+ 0, 0x9FE4, 0, 0x8EA0, 0x9FFC, 0, 0, 0, /* 0xC0 */
+ 0, 0x8A8A, 0, 0x9FE6, 0x9FEB, 0x9FEC, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x91EA, 0x91D8, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x9FF4, 0, 0, 0x9FFA, /* 0xE0 */
+ 0, 0, 0x9FF8, 0, 0x9348, 0, 0, 0xE042, /* 0xF0 */
+ 0x9FF5, 0, 0, 0, 0, 0, 0x9FF6, 0x9FDE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B99, 0x9559, 0, 0, 0, 0x8EBD, 0, /* 0x00 */
+ 0, 0x8D97, 0, 0, 0, 0, 0, 0x9852, /* 0x00 */
+ 0, 0x9FF2, 0, 0xE041, 0x8989, 0x9186, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x9499, 0, 0x8ABF, 0x97F8, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x969F, 0x92D0, 0, 0, 0, /* 0x20 */
+ 0, 0x9FF9, 0x9FFB, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x9151, 0, 0, 0, 0, 0, 0xE040, 0x9FF7, /* 0x30 */
+ 0, 0x9FF1, 0, 0, 0, 0x8AC1, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x8C89, 0, 0, 0, /* 0x50 */
+ 0xE04E, 0, 0, 0xE049, 0x90F6, 0, 0, 0x8A83, /* 0x50 */
+ 0, 0, 0, 0, 0x8F81, 0, 0xE052, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE04B, 0x92AA, 0xE048, /* 0x60 */
+ 0x92D7, 0, 0, 0, 0xE06B, 0, 0, 0, /* 0x70 */
+ 0xE045, 0, 0xE044, 0, 0xE04D, 0, 0, 0, /* 0x70 */
+ 0xE047, 0xE046, 0xE04C, 0, 0x909F, 0, 0xE043, 0, /* 0x80 */
+ 0xFB4B, 0, 0, 0, 0, 0, 0xE04F, 0, /* 0x80 */
+ 0, 0xE050, 0, 0, 0, 0, 0, 0x8AC0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE055, 0, 0xE054, 0xE056, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE059, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x9362, 0, 0xE053, 0, 0xFB4C, 0, 0, /* 0xB0 */
+ 0, 0xE057, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x8C83, 0x91F7, 0xE051, 0x945A, 0, 0, 0xE058, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE05D, 0xE05B, 0, 0, /* 0xD0 */
+ 0xE05E, 0, 0, 0xE061, 0, 0, 0, 0xE05A, /* 0xD0 */
+ 0x8D8A, 0x9447, 0, 0, 0x9FB7, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x9794, 0xE05C, 0, 0xE060, 0x91F3, /* 0xE0 */
+ 0, 0xE05F, 0, 0xE04A, 0, 0xFB4D, 0xE889, 0, /* 0xF0 */
+ 0, 0, 0xE064, 0, 0, 0, 0xE068 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE066, 0, 0, 0, 0xFB4E, 0, 0xFB4F, /* 0x00 */
+ 0, 0xE062, 0, 0xE063, 0, 0, 0, 0xE067, /* 0x00 */
+ 0, 0xE065, 0, 0, 0, 0x956D, 0, 0, /* 0x10 */
+ 0xE06D, 0, 0xE06A, 0xE069, 0, 0xE06C, 0x93D2, 0xE06E, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x9295, 0x91EB, /* 0x20 */
+ 0xFB50, 0, 0, 0, 0x90A3, 0, 0, 0, /* 0x20 */
+ 0xE06F, 0, 0xE071, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE070, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x9FF3, 0, 0, 0, /* 0x40 */
+ 0, 0xE072, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x93E5, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE073, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x89CE, 0, 0, 0, 0x9394, /* 0x60 */
+ 0x8A44, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x8B84, 0, 0, 0, 0x8EDC, 0x8DD0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xFB51, 0, 0, /* 0x80 */
+ 0, 0x9846, 0x9086, 0, 0, 0, 0x898A, 0, /* 0x80 */
+ 0, 0, 0xE075, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE074, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xFB52, 0xE078, 0x9259, 0xE07B, 0xE076, /* 0xA0 */
+ 0, 0, 0, 0xE07A, 0, 0, 0, 0, /* 0xB0 */
+ 0xE079, 0x935F, 0x88D7, 0xFA62, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x97F3, 0, 0, 0xE07D, 0, 0, 0, 0x8947, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE080, 0, 0, 0, 0xE07E, 0, 0xE07C, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE077, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x9642, 0, 0, 0, 0xE082 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFB54, 0, 0, 0, /* 0x00 */
+ 0, 0xE081, 0, 0, 0, 0, 0, 0xFB53, /* 0x00 */
+ 0, 0, 0, 0, 0x898B, 0, 0, 0, /* 0x10 */
+ 0, 0xE084, 0x95B0, 0, 0xE083, 0, 0, 0, /* 0x10 */
+ 0, 0x96B3, 0, 0, 0, 0, 0x8FC5, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x9152, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x8FC4, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xFB56, 0xFB57, /* 0x40 */
+ 0, 0x97F9, 0, 0, 0xE08A, 0, 0x90F7, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE086, 0xE08B, 0, /* 0x50 */
+ 0, 0x898C, 0, 0, 0xFB55, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE089, 0, 0x9481, 0xE085, 0xE088, 0x8FC6, /* 0x60 */
+ 0, 0x94CF, 0, 0, 0xE08C, 0, 0x8ECF, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x90F8, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xE08F, 0, 0, 0, /* 0x80 */
+ 0xE087, 0, 0x8C46, 0, 0, 0, 0, 0xE08D, /* 0x80 */
+ 0, 0, 0, 0, 0x976F, 0xE090, 0, 0, /* 0x90 */
+ 0, 0xEAA4, 0, 0, 0, 0, 0, 0x8F6E, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE091, 0, 0, 0, 0xE092, 0, 0, 0, /* 0xA0 */
+ 0, 0x944D, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE094, 0, 0, 0, 0, 0xE095, 0, /* 0xB0 */
+ 0, 0xFB59, 0, 0x9452, 0, 0, 0, 0, /* 0xC0 */
+ 0x9395, 0xE097, 0, 0, 0, 0, 0xE099, 0, /* 0xC0 */
+ 0x97D3, 0, 0xE096, 0, 0xE098, 0x898D, 0, 0xE093, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9A7A, /* 0xD0 */
+ 0xE09A, 0, 0, 0, 0, 0x9187, 0x8E57, 0xE09C, /* 0xE0 */
+ 0, 0, 0, 0, 0xE09B, 0x9043, 0x99D7, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE09D, 0, 0, /* 0xF0 */
+ 0, 0xE09F, 0, 0xE08E, 0xE09E, 0, 0xFB5A, 0xE0A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x949A, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE0A1, 0, 0, /* 0x00 */
+ 0xE0A2, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE0A3, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE0A4, 0, 0x92DC, 0, 0xE0A6, 0xE0A5, 0, 0, /* 0x20 */
+ 0xE0A7, 0, 0xE0A8, 0, 0, 0x8EDD, 0x9583, 0, /* 0x30 */
+ 0, 0, 0x96EA, 0xE0A9, 0xE0AA, 0x9175, 0x8EA2, 0xE0AB, /* 0x30 */
+ 0xE0AC, 0, 0, 0, 0, 0, 0xE0AD, 0x95D0, /* 0x40 */
+ 0x94C5, 0, 0, 0xE0AE, 0x9476, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x92AB, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE0AF, 0x89E5, 0, 0x8B8D, 0, 0x96C4, 0, 0x96B4, /* 0x50 */
+ 0, 0x89B2, 0x9853, 0, 0, 0, 0, 0x9671, /* 0x60 */
+ 0, 0x95A8, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x90B5, 0, 0xE0B0, 0, 0, 0, /* 0x70 */
+ 0, 0x93C1, 0, 0, 0, 0x8CA1, 0xE0B1, 0, /* 0x70 */
+ 0x8DD2, 0xE0B3, 0xE0B2, 0, 0, 0, 0, 0xE0B4, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE0B5, 0, 0, 0, 0xE0B6, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x8B5D, 0, 0xE0B7, 0, 0, 0, 0, 0xE0B8, /* 0xA0 */
+ 0, 0, 0, 0, 0x8CA2, 0, 0, 0x94C6, /* 0xA0 */
+ 0, 0xFB5B, 0xE0BA, 0, 0, 0, 0x8FF3, 0, /* 0xB0 */
+ 0, 0xE0B9, 0, 0, 0, 0, 0xFB5C, 0, /* 0xB0 */
+ 0, 0, 0x8BB6, 0xE0BB, 0xE0BD, 0, 0xE0BC, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE0BE, 0, /* 0xC0 */
+ 0x8CCF, 0, 0xE0BF, 0, 0, 0, 0, 0x8BE7, /* 0xD0 */
+ 0, 0x915F, 0, 0x8D9D, 0, 0, 0, 0, /* 0xD0 */
+ 0xE0C1, 0xE0C2, 0xE0C0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x8EEB, 0, 0, 0x93C6, 0x8BB7, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE0C4, /* 0xF0 */
+ 0x924B, 0xE0C3, 0, 0, 0x9854, 0x9482 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xE0C7, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE0C9, 0xE0C6, /* 0x10 */
+ 0, 0, 0, 0x96D2, 0xE0C8, 0xE0CA, 0, 0x97C2, /* 0x10 */
+ 0, 0, 0, 0, 0xFB5D, 0xE0CE, 0, 0, /* 0x20 */
+ 0, 0xE0CD, 0x9296, 0x944C, 0, 0, 0x8CA3, 0xE0CC, /* 0x20 */
+ 0, 0, 0, 0, 0xE0CB, 0, 0x9750, 0x9751, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE0CF, 0x898E, /* 0x30 */
+ 0, 0, 0, 0, 0x8D96, 0x8E82, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xE0D0, 0xE0D1, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE0D3, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x8F62, 0, 0, 0, 0, /* 0x60 */
+ 0xE0D5, 0, 0xE0D4, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xE0D6, 0, 0x8A6C, 0, 0, 0xE0D8, 0, 0xFB5F, /* 0x70 */
+ 0xE0D7, 0, 0xE0DA, 0xE0D9, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x8CBA, 0, 0, 0x97A6, /* 0x80 */
+ 0, 0x8BCA, 0, 0x89A4, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x8BE8, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x8ADF, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x97E6, 0xE0DC, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE0DE, 0, 0xFB60, 0, 0, /* 0xB0 */
+ 0xE0DF, 0, 0x89CF, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xE0DB, 0xFB61, 0x8E58, 0, 0, 0x92BF, 0xE0DD, 0, /* 0xC0 */
+ 0, 0, 0xFB64, 0, 0, 0, 0xFB62, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE0E2, 0, /* 0xD0 */
+ 0x8EEC, 0, 0, 0xFB63, 0, 0xE0E0, 0, 0, /* 0xE0 */
+ 0, 0, 0x8C5D, 0, 0, 0x94C7, 0xE0E1, 0, /* 0xE0 */
+ 0, 0xE0FC, 0, 0, 0, 0xFB66, 0, 0, /* 0xF0 */
+ 0xE0E7, 0, 0, 0, 0, 0, 0x8CBB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B85, 0, 0xE0E4, 0x979D, 0xFB65, /* 0x00 */
+ 0, 0x97AE, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x91F4, 0, 0, 0xE0E6, 0xFB67, 0, /* 0x20 */
+ 0, 0xFB69, 0xFB68, 0, 0, 0, 0xFB6A, 0, /* 0x20 */
+ 0, 0, 0xE0E8, 0x97D4, 0x8BD5, 0x94FA, 0x9469, 0, /* 0x30 */
+ 0, 0, 0xE0E9, 0, 0, 0, 0, 0xE0EB, /* 0x30 */
+ 0, 0xE0EE, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE0EA, 0, 0, /* 0x50 */
+ 0, 0xE0ED, 0x8CE8, 0x896C, 0xE0EF, 0, 0x9090, 0xE0EC, /* 0x50 */
+ 0x97DA, 0, 0xFB6B, 0xE0F2, 0xEAA2, 0, 0, 0, /* 0x60 */
+ 0, 0xE0F0, 0xE0F3, 0, 0, 0, 0, 0xE0E5, /* 0x60 */
+ 0xE0F1, 0, 0, 0x8DBA, 0, 0, 0xE0F4, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE0F5, 0, /* 0x70 */
+ 0, 0, 0, 0x979E, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xFB6C, 0, 0xE0F6, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xE0F7, 0xFB6D, /* 0x90 */
+ 0, 0, 0xE0E3, 0, 0, 0, 0, 0xE0F8, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x8AC2, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x8EA3, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE0F9, 0, 0, 0, 0, 0xE0FA, /* 0xC0 */
+ 0, 0, 0, 0, 0xE0FB, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x895A, 0, 0, 0, /* 0xD0 */
+ 0xE140, 0, 0x955A, 0xE141, 0, 0, 0x8AA2, 0xE142, /* 0xE0 */
+ 0, 0xE143, 0, 0, 0, 0, 0xE144, 0, /* 0xE0 */
+ 0xE146, 0xE147, 0xE145, 0, 0, 0, 0x9572, 0xE149, /* 0xF0 */
+ 0xE148 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFB6E, 0, 0xE14B, 0xE14A, 0xE14C, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xE14D, 0xE14F, 0xE14E, 0, /* 0x00 */
+ 0, 0x8D99, 0, 0xE151, 0, 0xE150, 0, 0, /* 0x10 */
+ 0x8AC3, 0, 0x9072, 0, 0x935B, 0, 0xE152, 0x90B6, /* 0x10 */
+ 0, 0, 0, 0x8E59, 0, 0x8999, 0xE153, 0, /* 0x20 */
+ 0x9770, 0, 0, 0x95E1, 0xE154, 0, 0, 0xFAA8, /* 0x20 */
+ 0x9363, 0x9752, 0x8D62, 0x905C, 0, 0, 0, 0x926A, /* 0x30 */
+ 0x99B2, 0, 0x92AC, 0x89E6, 0xE155, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE156, 0, 0xE15B, 0, /* 0x40 */
+ 0, 0xE159, 0xE158, 0x9DC0, 0x8A45, 0xE157, 0, 0x88D8, /* 0x40 */
+ 0, 0x94A8, 0, 0, 0x94C8, 0, 0, 0, /* 0x50 */
+ 0, 0x97AF, 0xE15C, 0xE15A, 0x927B, 0x90A4, 0, 0, /* 0x50 */
+ 0x94A9, 0, 0x954C, 0, 0xE15E, 0x97AA, 0x8C6C, 0xE15F, /* 0x60 */
+ 0, 0xE15D, 0x94D4, 0xE160, 0, 0xE161, 0, 0xFB6F, /* 0x60 */
+ 0x88D9, 0, 0, 0x8FF4, 0xE166, 0, 0xE163, 0x93EB, /* 0x70 */
+ 0xE162, 0, 0, 0, 0, 0, 0, 0x8B45, /* 0x70 */
+ 0, 0, 0xE169, 0, 0, 0, 0xE164, 0xE165, /* 0x80 */
+ 0, 0xE168, 0xE167, 0x9544, 0, 0, 0x9161, 0x9160, /* 0x80 */
+ 0, 0x8B5E, 0, 0, 0xE16A, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE16B, 0, 0, 0xE16C, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE16E, 0, 0xE16D, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x8975, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE176, 0x94E6, 0xE170, 0, 0xE172, 0, 0, /* 0xB0 */
+ 0xE174, 0x905D, 0, 0, 0xE175, 0xE173, 0x8EBE, 0, /* 0xB0 */
+ 0, 0, 0xE16F, 0xE171, 0, 0x9561, 0, 0x8FC7, /* 0xC0 */
+ 0, 0, 0xE178, 0, 0, 0xE177, 0, 0, /* 0xC0 */
+ 0, 0, 0xE179, 0, 0x8EA4, 0x8DAD, 0, 0, /* 0xD0 */
+ 0x9397, 0xE17A, 0, 0x92C9, 0, 0, 0xE17C, 0, /* 0xD0 */
+ 0, 0, 0x979F, 0xE17B, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x9189, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE182, 0, 0xE184, 0xE185, 0x9273, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xE183, 0, 0xE180, 0, 0xE17D, 0xE17E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE181, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xE188, 0, 0xE186, 0, 0xE187, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE189, /* 0x10 */
+ 0xE18B, 0xE18C, 0xE18D, 0, 0xE18E, 0, 0, 0xE18A, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE190, 0, 0, 0, 0xE18F, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE191, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x97C3, 0, 0, 0, 0xE194, 0xE192, /* 0x40 */
+ 0xE193, 0, 0, 0, 0x8AE0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x96FC, 0, 0, 0, 0x95C8, 0, /* 0x50 */
+ 0xE196, 0, 0, 0, 0xE195, 0, 0, 0, /* 0x50 */
+ 0, 0xE197, 0xE198, 0, 0, 0, 0, 0xE19C, /* 0x60 */
+ 0xE199, 0xE19A, 0xE19B, 0, 0xE19D, 0, 0, 0, /* 0x60 */
+ 0xE19E, 0, 0xE19F, 0, 0, 0, 0xE1A0, 0, /* 0x70 */
+ 0xE1A1, 0, 0x94AD, 0x936F, 0xE1A2, 0x9492, 0x9553, 0, /* 0x70 */
+ 0xE1A3, 0, 0xFB70, 0xE1A4, 0x9349, 0, 0x8A46, 0x8D63, /* 0x80 */
+ 0xE1A5, 0, 0, 0xE1A6, 0, 0, 0xE1A7, 0, /* 0x80 */
+ 0x8E48, 0, 0, 0xE1A9, 0, 0, 0xE1A8, 0, /* 0x90 */
+ 0, 0xE1AA, 0xE1AB, 0xFB73, 0xFB71, 0, 0xFB72, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xFB74, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x94E7, 0, /* 0xA0 */
+ 0xE1AC, 0, 0, 0, 0xE1AD, 0, 0, 0xEA89, /* 0xB0 */
+ 0xE1AE, 0xE1AF, 0xE1B0, 0, 0, 0, 0, 0x8E4D, /* 0xB0 */
+ 0, 0, 0xE1B1, 0x9475, 0, 0, 0x967E, 0, /* 0xC0 */
+ 0x896D, 0, 0x8976, 0, 0, 0xE1B2, 0, 0, /* 0xC0 */
+ 0, 0, 0xE1B4, 0, 0, 0, 0xE1B3, 0x9390, /* 0xD0 */
+ 0, 0, 0, 0x90B7, 0x9F58, 0, 0xE1B5, 0x96BF, /* 0xD0 */
+ 0, 0xE1B6, 0, 0x8AC4, 0x94D5, 0xE1B7, 0, 0xE1B8, /* 0xE0 */
+ 0, 0, 0xE1B9, 0, 0, 0, 0x96DA, 0, /* 0xE0 */
+ 0, 0, 0x96D3, 0, 0x92BC, 0, 0, 0, /* 0xF0 */
+ 0x918A, 0, 0, 0xE1BB, 0, 0, 0x8F82 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8FC8, 0, 0, 0xE1BE, 0, 0, 0xE1BD, /* 0x00 */
+ 0xE1BC, 0x94FB, 0, 0x8AC5, 0x8CA7, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE1C4, 0, 0, 0xE1C1, 0x905E, /* 0x10 */
+ 0x96B0, 0, 0, 0, 0xE1C0, 0xE1C2, 0xE1C3, 0, /* 0x20 */
+ 0, 0xE1BF, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1C5, /* 0x30 */
+ 0xE1C6, 0, 0x92AD, 0, 0x8AE1, 0, 0, 0, /* 0x30 */
+ 0x9285, 0, 0, 0, 0, 0, 0xFB76, 0xE1C7, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE1C8, 0xE1CB, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x9087, 0, 0x93C2, 0, 0xE1CC, 0x9672, 0, /* 0x60 */
+ 0xE1C9, 0, 0, 0xE1CA, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xE1CF, 0, 0, 0, 0, 0xE1CE, 0xE1CD, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xE1D1, 0, 0, 0xE1D0, 0, /* 0x80 */
+ 0, 0xE1D2, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xE1D4, 0, /* 0x90 */
+ 0xE1D3, 0, 0, 0, 0, 0x95CB, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x8F75, 0x97C4, 0, 0, /* 0xA0 */
+ 0xE1D5, 0, 0, 0x93B5, 0, 0, 0xE1D6, 0, /* 0xB0 */
+ 0, 0xE1D7, 0, 0xE1DB, 0xE1D9, 0xE1DA, 0, 0xE1D8, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1DC, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xE1DD, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1DE, /* 0xD0 */
+ 0, 0, 0xE1DF, 0x96B5, 0xE1E0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x96EE, 0xE1E1, 0, 0x926D, 0, 0x948A, /* 0xE0 */
+ 0, 0x8BE9, 0, 0, 0, 0x925A, 0xE1E2, 0x8BB8, /* 0xE0 */
+ 0, 0, 0, 0x90CE, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xE1E3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8DBB, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xE1E4, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE1E5, 0, 0x8CA4, 0x8DD3, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE1E7, 0xFB78, 0, 0, 0, 0x9375, 0x8DD4, 0x8B6D, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x9643, 0, 0x946A, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x9376, 0, 0, 0, 0, 0x8D7B, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE1E9, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xFB79, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x8FC9, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xFB7A, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x97B0, 0x8D64, 0, 0, 0x8CA5, /* 0x60 */
+ 0, 0, 0x94A1, 0, 0xE1EB, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xFB7B, 0, 0xE1ED, 0, 0, 0, /* 0x70 */
+ 0, 0x8CE9, 0, 0, 0, 0, 0xE1EC, 0x92F4, /* 0x80 */
+ 0, 0, 0, 0, 0xE1EF, 0x8A56, 0xE1EA, 0, /* 0x80 */
+ 0, 0x94E8, 0, 0x894F, 0, 0x8DEA, 0, 0x9871, /* 0x90 */
+ 0, 0, 0xE1EE, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE1F0, 0, 0, 0, 0x95C9, /* 0xA0 */
+ 0, 0x90D7, 0xE1F2, 0, 0, 0, 0, 0xE1F3, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xE1F1, 0, 0, /* 0xB0 */
+ 0, 0, 0x8A6D, 0, 0xE1F9, 0, 0xE1F8, 0, /* 0xB0 */
+ 0, 0x8EA5, 0, 0, 0, 0xE1FA, 0xE1F5, 0, /* 0xC0 */
+ 0, 0, 0xE1FB, 0xE1F6, 0, 0, 0, 0, /* 0xC0 */
+ 0x94D6, 0xE1F4, 0, 0, 0xE1F7, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE241, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE240, /* 0xE0 */
+ 0x9681, 0, 0, 0, 0xE1FC, 0, 0, 0x88E9, /* 0xE0 */
+ 0, 0, 0, 0, 0xE243, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xE242 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8FCA, 0, 0, 0, 0, 0, 0xE244, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x9162, 0, /* 0x00 */
+ 0, 0xE246, 0xE245, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE247, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE1E6, 0, /* 0x20 */
+ 0, 0, 0xE1E8, 0xE249, 0xE248, 0, 0, 0, /* 0x20 */
+ 0xFB7C, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x8EA6, 0, 0x97E7, 0, 0x8ED0, 0, /* 0x30 */
+ 0xE24A, 0x8C56, 0, 0, 0, 0, 0, 0x8B5F, /* 0x40 */
+ 0x8B46, 0x8E83, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x9753, 0, 0, 0xE250, 0, 0xE24F, 0x9163, 0xE24C, /* 0x50 */
+ 0, 0, 0xE24E, 0, 0, 0x8F6A, 0x905F, 0xE24D, /* 0x50 */
+ 0xE24B, 0, 0x9449, 0, 0, 0x8FCB, 0, 0, /* 0x60 */
+ 0x955B, 0, 0, 0, 0, 0x8DD5, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9398, /* 0x70 */
+ 0, 0, 0xE251, 0, 0, 0, 0, 0xE252, /* 0x70 */
+ 0xE268, 0x8BD6, 0, 0, 0x985C, 0x9154, 0, 0, /* 0x80 */
+ 0, 0, 0xE253, 0, 0, 0x89D0, 0x92F5, 0x959F, /* 0x80 */
+ 0, 0, 0, 0, 0xFB81, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xFB83, 0, 0xE254, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x8B9A, 0xE255, /* 0xA0 */
+ 0, 0, 0xE257, 0, 0, 0, 0xE258, 0, /* 0xA0 */
+ 0x9448, 0, 0, 0xE259, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE25A, 0xE25B, 0, 0, 0x8BD7, 0x89D1, 0x93C3, /* 0xB0 */
+ 0x8F47, 0x8E84, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE25C, 0, 0x8F48, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x89C8, 0x9562, 0, 0, 0xE25D, 0, 0, /* 0xD0 */
+ 0x94E9, 0, 0, 0, 0, 0, 0, 0x9164, /* 0xD0 */
+ 0, 0xE260, 0, 0xE261, 0x9489, 0, 0x9060, 0xE25E, /* 0xE0 */
+ 0, 0x9281, 0, 0, 0xE25F, 0, 0, 0, /* 0xE0 */
+ 0x8FCC, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0x88DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B48, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xE262, 0, 0, 0x92F6, 0, 0xE263, 0x90C5, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x96AB, 0, 0, 0x9542, /* 0x10 */
+ 0xE264, 0xE265, 0x9274, 0, 0x97C5, 0, 0, 0xE267, /* 0x10 */
+ 0xE266, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x8EED, 0, /* 0x20 */
+ 0, 0xE269, 0x88EE, 0, 0, 0, 0, 0xE26C, /* 0x30 */
+ 0, 0, 0, 0xE26A, 0x89D2, 0x8C6D, 0xE26B, 0x8D65, /* 0x30 */
+ 0x8D92, 0, 0x95E4, 0xE26D, 0, 0, 0x9673, 0, /* 0x40 */
+ 0, 0xE26F, 0, 0, 0, 0x90CF, 0x896E, 0x89B8, /* 0x40 */
+ 0x88AA, 0, 0, 0, 0, 0, 0, 0xE26E, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xE270, 0xE271, 0x8FF5, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE272, 0, 0x8A6E, 0, 0, 0, 0, /* 0x60 */
+ 0xE274, 0, 0, 0, 0x8C8A, 0, 0x8B86, 0, /* 0x70 */
+ 0, 0xE275, 0x8BF3, 0, 0, 0xE276, 0, 0x90FA, /* 0x70 */
+ 0, 0x93CB, 0, 0x90DE, 0x8DF3, 0, 0, 0, /* 0x80 */
+ 0xE277, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x9282, 0x918B, 0, 0xE279, 0xE27B, 0xE278, /* 0x90 */
+ 0xE27A, 0, 0, 0, 0, 0, 0, 0x8C41, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE27C, 0x8C45, 0, 0, 0, 0x8B87, 0x9771, /* 0xA0 */
+ 0xE27E, 0, 0, 0, 0, 0, 0xE280, 0, /* 0xB0 */
+ 0, 0, 0x894D, 0, 0, 0, 0, 0xE283, /* 0xB0 */
+ 0, 0, 0, 0x8A96, 0xE282, 0xE281, 0, 0xE285, /* 0xC0 */
+ 0xE27D, 0, 0xE286, 0x97A7, 0, 0xE287, 0, 0xE288, /* 0xC0 */
+ 0, 0xFB84, 0x9AF2, 0xE28A, 0, 0xE289, 0, 0, /* 0xD0 */
+ 0, 0xE28B, 0xE28C, 0, 0x97B3, 0xE28D, 0, 0xE8ED, /* 0xD0 */
+ 0x8FCD, 0xE28E, 0xE28F, 0x8F76, 0, 0x93B6, 0xE290, 0xFB85, /* 0xE0 */
+ 0, 0, 0x9247, 0xFB87, 0, 0xE291, 0, 0x925B, /* 0xE0 */
+ 0xE292, 0, 0, 0, 0, 0, 0x8BA3, 0, /* 0xF0 */
+ 0x995E, 0x927C, 0x8EB1, 0, 0, 0, 0, 0x8AC6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE293, 0, 0xE2A0, 0, 0xE296, 0, /* 0x00 */
+ 0x8B88, 0, 0xE295, 0xE2A2, 0, 0, 0, 0xE294, /* 0x00 */
+ 0, 0x8FCE, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE298, 0xE299, 0, 0x934A, 0, 0, 0xE29A, 0, /* 0x10 */
+ 0x8A7D, 0, 0, 0, 0, 0x9079, 0x9584, 0, /* 0x20 */
+ 0xE29C, 0, 0, 0, 0x91E6, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE297, 0, 0xE29B, 0xE29D, 0, /* 0x30 */
+ 0, 0x8DF9, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE2A4, 0x954D, 0, /* 0x40 */
+ 0x94A4, 0x9399, 0, 0x8BD8, 0xE2A3, 0xE2A1, 0, 0x94B3, /* 0x40 */
+ 0xE29E, 0x927D, 0x939B, 0, 0x939A, 0, 0x8DF4, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xE2B6, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xE2A6, 0, 0xE2A8, /* 0x60 */
+ 0, 0, 0, 0, 0xE2AB, 0, 0xE2AC, 0, /* 0x60 */
+ 0xE2A9, 0xE2AA, 0, 0, 0xE2A7, 0xE2A5, 0, 0, /* 0x70 */
+ 0, 0, 0xE29F, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x95CD, 0x89D3, /* 0x80 */
+ 0, 0, 0, 0xE2B3, 0, 0xE2B0, 0, 0xE2B5, /* 0x80 */
+ 0, 0, 0xE2B4, 0, 0x9493, 0x96A5, 0, 0x8E5A, /* 0x90 */
+ 0xE2AE, 0xE2B7, 0xE2B2, 0, 0xE2B1, 0xE2AD, 0xFB88, 0xE2AF, /* 0x90 */
+ 0, 0x8AC7, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x925C, 0, 0, 0x90FB, 0, 0, /* 0xA0 */
+ 0, 0x94A0, 0, 0, 0xE2BC, 0, 0, 0, /* 0xB0 */
+ 0x94A2, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x90DF, 0xE2B9, 0, 0, 0x94CD, 0, 0xE2BD, 0x95D1, /* 0xC0 */
+ 0, 0x927A, 0, 0xE2B8, 0xE2BA, 0, 0, 0xE2BB, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xE2BE, 0, 0, /* 0xD0 */
+ 0x8EC2, 0, 0, 0, 0x93C4, 0xE2C3, 0xE2C2, 0, /* 0xE0 */
+ 0, 0xE2BF, 0, 0, 0, 0x9855, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE2C8, 0, 0, 0xE2CC, 0xE2C9, /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2C5, 0, 0, 0, 0, 0, 0, 0xE2C6, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE2CB, 0, 0, /* 0x00 */
+ 0, 0xE2C0, 0x99D3, 0xE2C7, 0xE2C1, 0, 0, 0xE2CA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2D0, /* 0x10 */
+ 0, 0x8AC8, 0, 0xE2CD, 0, 0, 0, 0xE2CE, /* 0x20 */
+ 0, 0, 0xE2CF, 0xE2D2, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2D1, /* 0x30 */
+ 0x94F4, 0, 0, 0, 0, 0xE2D3, 0x97FA, 0x95EB, /* 0x30 */
+ 0xE2D8, 0, 0, 0xE2D5, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE2D4, 0x90D0, 0, 0xE2D7, /* 0x40 */
+ 0xE2D9, 0, 0, 0, 0xE2D6, 0, 0xE2DD, 0, /* 0x50 */
+ 0xE2DA, 0, 0, 0, 0, 0, 0, 0xE2DB, /* 0x50 */
+ 0xE2C4, 0, 0, 0, 0xE2DC, 0xE2DE, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE2DF, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x95C4, 0, 0xE2E0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x96E0, 0, /* 0x70 */
+ 0, 0x8BCC, 0x8C48, 0xE2E1, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x95B2, 0, 0x9088, 0, 0x96AE, 0, 0, /* 0x80 */
+ 0xE2E2, 0, 0x97B1, 0, 0, 0x9494, 0, 0x9165, /* 0x90 */
+ 0x9453, 0, 0, 0x8F6C, 0, 0, 0, 0x88BE, /* 0x90 */
+ 0, 0xE2E7, 0xE2E5, 0, 0xE2E3, 0x8A9F, 0, 0x8FCF, /* 0xA0 */
+ 0xE2E8, 0, 0, 0xE2E6, 0, 0xE2E4, 0xE2EC, 0, /* 0xA0 */
+ 0, 0xE2EB, 0xE2EA, 0xE2E9, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE2ED, 0, 0, 0, 0xE2EE, 0x90B8, 0, /* 0xB0 */
+ 0xE2EF, 0, 0xE2F1, 0, 0, 0xE2F0, 0, 0, /* 0xC0 */
+ 0, 0, 0x8CD0, 0, 0, 0, 0x9157, 0, /* 0xC0 */
+ 0, 0, 0xE2F3, 0, 0, 0, 0x939C, 0, /* 0xD0 */
+ 0xE2F2, 0, 0, 0, 0xE2F4, 0, 0x95B3, 0x918C, /* 0xD0 */
+ 0x8D66, 0, 0xE2F5, 0, 0, 0, 0, 0x97C6, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2F7, /* 0xE0 */
+ 0, 0, 0xE2F8, 0, 0xE2F9, 0, 0xE2FA, 0, /* 0xF0 */
+ 0x8E85, 0, 0xE2FB, 0x8C6E, 0, 0, 0x8B8A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B49, 0, 0xE340, 0, 0x96F1, 0x8D67, 0xE2FC, 0, /* 0x00 */
+ 0, 0, 0xE343, 0x96E4, 0, 0x945B, 0, 0, /* 0x00 */
+ 0x9552, 0, 0, 0, 0x8F83, 0xE342, 0, 0x8ED1, /* 0x10 */
+ 0x8D68, 0x8E86, 0x8B89, 0x95B4, 0xE341, 0, 0, 0, /* 0x10 */
+ 0x9166, 0x9661, 0x8DF5, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x8E87, 0x92DB, 0, 0xE346, 0x97DD, /* 0x20 */
+ 0x8DD7, 0, 0xE347, 0x9061, 0, 0xE349, 0, 0, /* 0x30 */
+ 0, 0x8FD0, 0x8DAE, 0, 0, 0, 0, 0xE348, /* 0x30 */
+ 0, 0, 0x8F49, 0x8CBC, 0x9167, 0xE344, 0xE34A, 0, /* 0x40 */
+ 0xFB8A, 0, 0, 0xE345, 0x8C6F, 0, 0xE34D, 0xE351, /* 0x40 */
+ 0x8C8B, 0, 0, 0, 0, 0, 0xE34C, 0, /* 0x50 */
+ 0, 0, 0, 0xE355, 0xFB8B, 0, 0x8D69, 0, /* 0x50 */
+ 0, 0x978D, 0x88BA, 0xE352, 0, 0, 0x8B8B, 0, /* 0x60 */
+ 0xE34F, 0, 0, 0, 0, 0, 0xE350, 0, /* 0x60 */
+ 0, 0x939D, 0xE34E, 0xE34B, 0, 0x8A47, 0x90E2, 0, /* 0x70 */
+ 0, 0x8CA6, 0, 0, 0, 0xE357, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xE354, 0, 0, 0, 0, 0, 0xE356, /* 0x80 */
+ 0, 0, 0, 0xE353, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8C70, 0x91B1, 0xE358, 0x918E, 0, 0, 0xE365, /* 0x90 */
+ 0xFB8D, 0, 0xE361, 0xE35B, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE35F, 0x8EF8, 0x88DB, 0xE35A, 0xE362, /* 0xA0 */
+ 0xE366, 0x8D6A, 0x96D4, 0, 0x92D4, 0xE35C, 0, 0xFB8C, /* 0xB0 */
+ 0xE364, 0, 0xE359, 0x925D, 0, 0xE35E, 0x88BB, 0x96C8, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE35D, /* 0xC0 */
+ 0, 0, 0x8BD9, 0x94EA, 0, 0, 0, 0x918D, /* 0xC0 */
+ 0, 0x97CE, 0x8F8F, 0, 0, 0xE38E, 0xFB8E, 0, /* 0xD0 */
+ 0xE367, 0, 0x90FC, 0, 0xE363, 0xE368, 0xE36A, 0, /* 0xD0 */
+ 0x92F7, 0xE36D, 0, 0, 0xE369, 0, 0, 0, /* 0xE0 */
+ 0x95D2, 0x8AC9, 0, 0, 0x96C9, 0, 0, 0x88DC, /* 0xE0 */
+ 0, 0, 0xE36C, 0, 0x97FB, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xE36B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x898F, 0, 0, 0x93EA, 0xE36E, 0, 0, /* 0x00 */
+ 0, 0xE375, 0xE36F, 0xE376, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE372, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x949B, 0, 0, 0x8EC8, 0xE374, /* 0x10 */
+ 0, 0xE371, 0xE377, 0xE370, 0, 0, 0x8F63, 0, /* 0x20 */
+ 0, 0, 0, 0x9644, 0, 0, 0x8F6B, 0, /* 0x20 */
+ 0, 0xE373, 0xE380, 0, 0, 0xE37B, 0, 0xE37E, /* 0x30 */
+ 0, 0xE37C, 0xE381, 0xE37A, 0, 0xE360, 0x90D1, 0, /* 0x30 */
+ 0, 0x94C9, 0, 0xE37D, 0, 0, 0xE378, 0, /* 0x40 */
+ 0, 0, 0x9140, 0x8C71, 0, 0x8F4A, 0, 0, /* 0x40 */
+ 0, 0, 0xFB8F, 0, 0x9044, 0x9155, 0xE384, 0, /* 0x50 */
+ 0, 0xE386, 0xE387, 0, 0, 0xE383, 0xE385, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xE379, 0xE382, /* 0x60 */
+ 0, 0xE38A, 0xE389, 0, 0, 0x969A, 0, 0, /* 0x60 */
+ 0x8C4A, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xE388, 0, 0xE38C, 0xE38B, 0xE38F, 0, 0xE391, /* 0x70 */
+ 0, 0, 0x8E5B, 0xE38D, 0, 0, 0, 0, /* 0x80 */
+ 0xE392, 0xE393, 0xFA5C, 0, 0xE394, 0, 0xE39A, 0x935A, /* 0x80 */
+ 0xE396, 0, 0xE395, 0xE397, 0xE398, 0, 0xE399, 0, /* 0x90 */
+ 0, 0, 0, 0xE39B, 0xE39C /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8ACA, 0, /* 0x30 */
+ 0xE39D, 0, 0xE39E, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE39F, 0, 0xFB90, /* 0x40 */
+ 0, 0, 0, 0, 0xE3A0, 0xE3A1, 0xE3A2, 0, /* 0x40 */
+ 0xE3A3, 0xE3A4, 0, 0, 0xE3A6, 0xE3A5, 0, 0, /* 0x50 */
+ 0xE3A7, 0, 0, 0, 0, 0, 0, 0xE3A8, /* 0x50 */
+ 0xE3A9, 0, 0, 0, 0, 0, 0, 0xE3AC, /* 0x60 */
+ 0xE3AA, 0xE3AB, 0x8DDF, 0x8C72, 0, 0, 0x9275, 0, /* 0x60 */
+ 0x94B1, 0, 0x8F90, 0, 0, 0x946C, 0, 0x94EB, /* 0x70 */
+ 0xE3AD, 0x9CEB, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE3AE, 0xE3B0, 0, 0x9785, 0xE3AF, 0xE3B2, /* 0x80 */
+ 0xE3B1, 0, 0x9772, 0, 0xE3B3, 0, 0x94FC, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE3B4, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE3B7, 0, 0, 0xE3B6, 0xE3B5, 0, /* 0x90 */
+ 0, 0xFB91, 0, 0xE3B8, 0x8C51, 0, 0, 0, /* 0xA0 */
+ 0x9141, 0x8B60, 0, 0, 0, 0, 0xE3BC, 0xE3B9, /* 0xA0 */
+ 0, 0, 0xE3BA, 0, 0, 0, 0xE3BD, 0, /* 0xB0 */
+ 0xE3BE, 0xE3BB, 0, 0, 0, 0x8948, 0, 0, /* 0xB0 */
+ 0, 0x89A5, 0, 0, 0, 0xE3C0, 0xE3C1, 0, /* 0xC0 */
+ 0, 0, 0xE3C2, 0, 0x9782, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x8F4B, 0, 0xE3C4, 0xE3C3, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x9089, 0xE3C5, 0, 0, 0, 0, 0xE3C6, 0, /* 0xE0 */
+ 0, 0xE3C7, 0, 0x8AE3, 0, 0, 0, 0, /* 0xE0 */
+ 0x8ACB, 0, 0, 0xE3C8, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xE3C9, 0, 0x967C, 0x9783 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9773, 0x9856, 0, 0x8D6C, 0xE3CC, 0x8ED2, 0xE3CB, 0, /* 0x00 */
+ 0, 0, 0, 0xE3CD, 0x8EA7, 0, 0, 0, /* 0x00 */
+ 0x91CF, 0, 0xE3CE, 0, 0, 0x8D6B, 0, 0x96D5, /* 0x10 */
+ 0xE3CF, 0xE3D0, 0, 0, 0xE3D1, 0, 0, 0, /* 0x10 */
+ 0, 0xE3D2, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE3D3, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x8EA8, 0, 0, 0x96EB, 0, /* 0x30 */
+ 0, 0, 0, 0xE3D5, 0, 0x925E, 0, 0xE3D4, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE3D7, 0, /* 0x40 */
+ 0, 0, 0xE3D6, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xE3D8, 0, 0, 0, 0x90B9, 0, /* 0x50 */
+ 0xE3D9, 0, 0xE3DA, 0, 0, 0, 0x95B7, 0xE3DB, /* 0x50 */
+ 0, 0x918F, 0xE3DC, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xE3DD, 0, 0, 0, 0, 0, 0, 0x97FC, /* 0x60 */
+ 0xE3E0, 0, 0xE3DF, 0xE3DE, 0x92AE, 0, 0xE3E1, 0x9045, /* 0x70 */
+ 0, 0xE3E2, 0, 0, 0, 0xE3E3, 0x9857, 0xE3E4, /* 0x70 */
+ 0, 0, 0, 0, 0xE3E5, 0xE3E7, 0xE3E6, 0x94A3, /* 0x80 */
+ 0, 0x93F7, 0, 0x985D, 0x94A7, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xE3E9, 0, 0, 0x8FD1, 0, /* 0x90 */
+ 0x9549, 0, 0xE3EA, 0xE3E8, 0, 0x8ACC, 0, 0, /* 0x90 */
+ 0, 0x8CD2, 0x8E88, 0, 0, 0x94EC, 0, 0, /* 0xA0 */
+ 0, 0x8CA8, 0x9662, 0, 0xE3ED, 0xE3EB, 0, 0x8D6D, /* 0xA0 */
+ 0, 0x8D6E, 0x88E7, 0, 0x8DE6, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x9478, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x88DD, 0xE3F2, 0, 0x925F, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x9477, 0, 0x91D9, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE3F4, 0, /* 0xD0 */
+ 0, 0xE3F0, 0xE3F3, 0xE3EE, 0, 0xE3F1, 0x9645, 0, /* 0xD0 */
+ 0, 0x8CD3, 0, 0, 0x88FB, 0xE3EF, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE3F6, /* 0xE0 */
+ 0, 0xE3F7, 0, 0, 0x93B7, 0, 0, 0, /* 0xF0 */
+ 0x8BB9, 0, 0, 0, 0xE445, 0x945C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E89, 0, 0, 0x8BBA, 0x90C6, 0x9865, /* 0x00 */
+ 0x96AC, 0xE3F5, 0x90D2, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x8B72, 0xE3F8, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE3FA, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE3F9, 0, 0, 0, 0, 0, 0xE3FB, /* 0x20 */
+ 0, 0x9245, 0, 0x945D, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x92AF, 0, 0, 0, 0, 0xE442, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE441, 0, /* 0x40 */
+ 0, 0, 0, 0xE3FC, 0, 0, 0x9074, 0, /* 0x40 */
+ 0x9585, 0xE444, 0, 0xE443, 0x8D6F, 0x9872, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE454, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xE448, 0xE449, 0, /* 0x60 */
+ 0, 0, 0, 0x8EEE, 0, 0, 0xE447, 0, /* 0x60 */
+ 0x8D98, 0xE446, 0, 0, 0xE44A, 0, 0, 0, /* 0x70 */
+ 0x92B0, 0x95A0, 0x9142, 0, 0, 0, 0, 0x91DA, /* 0x70 */
+ 0xE44E, 0, 0xE44F, 0xE44B, 0, 0, 0, 0, /* 0x80 */
+ 0xE44C, 0, 0xE44D, 0, 0, 0, 0, 0x8D70, /* 0x80 */
+ 0, 0, 0, 0xE455, 0, 0xE451, 0, 0, /* 0x90 */
+ 0, 0, 0x9586, 0, 0x968C, 0x9547, 0, 0, /* 0x90 */
+ 0xE450, 0, 0, 0xE453, 0xE452, 0, 0, 0, /* 0xA0 */
+ 0x9663, 0xE456, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE457, 0, 0, 0x9156, 0, 0xE458, 0, 0, /* 0xB0 */
+ 0xE45A, 0, 0xE45E, 0, 0, 0xE45B, 0xE459, 0x945E, /* 0xB0 */
+ 0xE45C, 0, 0xE45D, 0, 0, 0, 0x89B0, 0, /* 0xC0 */
+ 0xE464, 0xE45F, 0, 0, 0, 0xE460, 0, 0, /* 0xC0 */
+ 0, 0xE461, 0, 0x919F, 0, 0, 0, 0, /* 0xD0 */
+ 0xE463, 0xE462, 0xE465, 0, 0, 0, 0, 0xE466, /* 0xD0 */
+ 0xE467, 0, 0, 0x9062, 0, 0x89E7, 0, 0xE468, /* 0xE0 */
+ 0x97D5, 0, 0x8EA9, 0, 0, 0x8F4C, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x8E8A, 0x9276, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xE469, 0xE46A, 0x8950, 0, 0xE46B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE46C, 0xE46D, 0, 0, 0xE46E, 0, 0xE46F, /* 0x00 */
+ 0x8BBB, 0x9DA8, 0xE470, 0, 0x90E3, 0xE471, 0x8EC9, 0, /* 0x00 */
+ 0xE472, 0, 0x98AE, 0, 0, 0, 0xE473, 0x95DC, /* 0x10 */
+ 0x8ADA, 0, 0, 0x9143, 0x8F77, 0, 0x9591, 0x8F4D, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE474, 0x8D71, 0xE475, 0x94CA, 0, 0xE484, 0, /* 0x20 */
+ 0, 0, 0, 0xE477, 0, 0x91C7, 0x9495, 0x8CBD, /* 0x30 */
+ 0xE476, 0x9144, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE478, 0, 0, 0, 0, 0, 0, 0x92F8, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE47A, 0xE479, 0xE47C, 0, 0, 0xE47B, 0, 0xE47D, /* 0x50 */
+ 0, 0, 0xE480, 0, 0xE47E, 0, 0x8ACD, 0, /* 0x60 */
+ 0xE481, 0, 0xE482, 0xE483, 0, 0, 0x8DAF, 0x97C7, /* 0x60 */
+ 0, 0xE485, 0x9046, 0, 0, 0, 0x8990, 0xE486, /* 0x70 */
+ 0xE487, 0, 0, 0, 0, 0, 0xE488, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x88F0, 0, 0xE489, 0, 0, /* 0x80 */
+ 0, 0, 0xE48A, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9587, 0, 0, 0, 0x8EC5, 0, 0xE48C, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x8A48, 0x88B0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE48B, 0xE48E, 0x946D, 0, 0x9063, /* 0xA0 */
+ 0, 0x89D4, 0, 0x9646, 0, 0, 0, 0, /* 0xB0 */
+ 0x8C7C, 0x8BDA, 0, 0xE48D, 0, 0x89E8, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x8AA1, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x8991, 0xE492, 0x97E8, 0x91DB, 0, 0, 0x9563, /* 0xD0 */
+ 0, 0xE49E, 0, 0x89D5, 0xE49C, 0, 0xE49A, 0xE491, /* 0xD0 */
+ 0, 0xE48F, 0, 0xE490, 0, 0x8EE1, 0x8BEA, 0x9297, /* 0xE0 */
+ 0, 0, 0, 0x93CF, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x8970, 0, 0xE494, 0xE493, 0, 0, 0, /* 0xF0 */
+ 0, 0xE499, 0xE495, 0xE498 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFB93, 0x96CE, 0xE497, 0x89D6, 0x8A9D, 0xE49B, 0, /* 0x00 */
+ 0, 0xE49D, 0, 0, 0, 0, 0x8C73, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE4A1, 0xE4AA, /* 0x10 */
+ 0xE4AB, 0, 0, 0, 0x88A9, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE4B2, 0, 0, 0, 0, /* 0x20 */
+ 0x88EF, 0, 0, 0xE4A9, 0, 0, 0, 0xE4A8, /* 0x20 */
+ 0, 0xE4A3, 0xE4A2, 0, 0xE4A0, 0xE49F, 0x9283, 0, /* 0x30 */
+ 0x91F9, 0xE4A5, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE4A4, 0, 0, 0, 0, 0xE4A7, 0, 0, /* 0x40 */
+ 0, 0x9190, 0x8C74, 0, 0, 0, 0, 0x8960, /* 0x40 */
+ 0xE4A6, 0, 0x8D72, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x9191, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xFB94, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE4B8, 0, 0xE4B9, 0, 0x89D7, /* 0x70 */
+ 0, 0, 0, 0x89AC, 0xE4B6, 0, 0, 0xFB95, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE4AC, 0, 0xE4B4, /* 0x80 */
+ 0, 0xE4BB, 0xE4B5, 0, 0, 0, 0xE4B3, 0, /* 0x80 */
+ 0, 0, 0, 0xE496, 0, 0, 0xE4B1, 0, /* 0x90 */
+ 0, 0, 0xE4AD, 0, 0, 0, 0x8ACE, 0xE4AF, /* 0x90 */
+ 0xE4BA, 0, 0xE4B0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE4BC, 0, 0xE4AE, 0x949C, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x9789, 0, 0, 0, 0xE4B7, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xE4CD, 0, 0, /* 0xB0 */
+ 0, 0xE4C5, 0, 0, 0, 0x909B, 0, 0xFB96, /* 0xC0 */
+ 0, 0, 0x8B65, 0, 0x8BDB, 0, 0xE4C0, 0, /* 0xC0 */
+ 0, 0, 0, 0x89D9, 0, 0, 0x8FD2, 0, /* 0xD0 */
+ 0xE4C3, 0, 0, 0, 0x8DD8, 0, 0, 0x9370, /* 0xD0 */
+ 0xE4C8, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x95EC, 0, 0xE4BF, 0, 0, 0, 0x89D8, /* 0xE0 */
+ 0x8CD4, 0x9548, 0xE4C9, 0, 0xE4BD, 0, 0xFB97, 0xE4C6, /* 0xF0 */
+ 0, 0, 0, 0xE4D0, 0, 0xE4C1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4C2, 0x93B8, 0, 0, 0xE4C7, /* 0x00 */
+ 0, 0, 0, 0xE4C4, 0x9647, 0xE4CA, 0x88DE, 0, /* 0x00 */
+ 0, 0, 0, 0xE4BE, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE4CC, 0, 0xE4CB, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x948B, 0xE4D2, 0, 0xE4DD, 0, 0, 0, /* 0x20 */
+ 0, 0x8A9E, 0, 0, 0, 0xE4E0, 0, 0, /* 0x30 */
+ 0xE4CE, 0, 0, 0, 0xE4D3, 0x978E, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE4DC, 0, /* 0x40 */
+ 0xFB98, 0x9774, 0, 0, 0, 0, 0x97A8, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9298, /* 0x50 */
+ 0, 0, 0, 0x8A8B, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x9592, 0xE4E2, 0x939F, 0, 0, 0x88AF, 0, /* 0x60 */
+ 0, 0xE4DB, 0, 0xE4D7, 0x9192, 0xE4D1, 0xE4D9, 0xE4DE, /* 0x60 */
+ 0, 0x944B, 0, 0, 0, 0x88A8, 0, 0xE4D6, /* 0x70 */
+ 0, 0xE4DF, 0x9598, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE4DA, 0, 0xE4D5, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x8FD3, 0, 0, 0, 0, /* 0x80 */
+ 0x8F4E, 0, 0, 0, 0x8EAA, 0, 0, 0, /* 0x90 */
+ 0, 0x96D6, 0, 0, 0x9566, 0, 0, 0xE4E5, /* 0x90 */
+ 0, 0xE4EE, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xE4D8, 0, 0, /* 0xA0 */
+ 0, 0, 0x8A97, 0, 0xFB99, 0, 0, 0, /* 0xB0 */
+ 0x8FF6, 0xE4E3, 0, 0xE4E8, 0x9193, 0, 0, 0xE4E4, /* 0xB0 */
+ 0, 0xE4EB, 0, 0, 0x927E, 0, 0xE4EC, 0, /* 0xC0 */
+ 0, 0x9775, 0xE4E1, 0x8A57, 0, 0xE4E7, 0, 0, /* 0xC0 */
+ 0xE4EA, 0x96AA, 0, 0, 0, 0, 0xE4ED, 0, /* 0xD0 */
+ 0, 0xE4E6, 0xE4E9, 0, 0xFA60, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x9648, 0, 0x9840, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE4F1, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xE4F8, 0, 0, 0xE4F0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8EC1, 0, 0, 0, 0, 0, 0xE4CF, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x95CC, 0, 0x96A0, 0xE4F7, 0xE4F6, 0, 0xE4F2, /* 0x10 */
+ 0xE4F3, 0, 0x8955, 0, 0, 0, 0, 0xE4F5, /* 0x10 */
+ 0, 0xE4EF, 0, 0, 0, 0, 0x92D3, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE4F4, 0x88FC, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x91A0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x95C1, 0, 0, /* 0x30 */
+ 0xE4F9, 0xE540, 0, 0x94D7, 0, 0, 0, 0, /* 0x40 */
+ 0xE4FC, 0x8FD4, 0x8EC7, 0xE542, 0, 0, 0x8BBC, 0, /* 0x40 */
+ 0, 0, 0, 0xFB9A, 0, 0xE543, 0, 0x9599, /* 0x50 */
+ 0xE4FB, 0xFB9B, 0xE4D4, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE4FA, 0, 0, 0, 0, /* 0x60 */
+ 0x986E, 0x93A0, 0x9593, 0xFB9C, 0, 0xE54A, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE550, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE551, 0, /* 0x70 */
+ 0xE544, 0, 0, 0, 0x9496, 0, 0, 0xE54E, /* 0x80 */
+ 0xE546, 0, 0xE548, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE552, 0xE547, 0, 0, 0xE54B, 0, 0, 0x8992, /* 0x90 */
+ 0, 0x93E3, 0, 0xE54C, 0xE54F, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE545, 0, 0x9145, 0, /* 0xA0 */
+ 0xE549, 0x8E46, 0x9064, 0x8C4F, 0x96F2, 0, 0x96F7, 0x8F92, /* 0xA0 */
+ 0xFB9E, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE556, 0xE554, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x986D, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE553, 0, 0, 0, 0x9795, 0, 0xE555, /* 0xC0 */
+ 0xE557, 0, 0, 0, 0, 0xE558, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE55B, 0xE559, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x93A1, 0xE55A, 0, 0, /* 0xE0 */
+ 0, 0x94CB, 0xE54D, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x8F93, /* 0xF0 */
+ 0, 0xE55C, 0xE561, 0x9194, 0, 0, 0xE560 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE541, 0, 0, 0, 0xE562, 0x9168, /* 0x00 */
+ 0, 0, 0xE55D, 0xE55F, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xE55E, 0, 0, 0x9F50, 0x9F41, /* 0x10 */
+ 0, 0, 0xE564, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xE563, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x9796, 0, 0xE1BA, /* 0x20 */
+ 0xE565, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE566, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE567, 0x8CD5, 0, /* 0x40 */
+ 0x8B73, 0, 0, 0, 0xE569, 0x997C, 0, 0, /* 0x50 */
+ 0, 0, 0x8B95, 0, 0x97B8, 0, 0x8BF1, 0xE56A, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE56B, /* 0x60 */
+ 0, 0, 0, 0x928E, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE56C, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x93F8, 0, 0x88B8, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x89E1, 0xE571, 0xE572, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xE56D, 0, 0x8E5C, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE56E, 0x9461, 0, 0, 0, /* 0xA0 */
+ 0, 0xE56F, 0xE570, 0xE57A, 0, 0, 0, 0xE574, /* 0xA0 */
+ 0xE577, 0, 0, 0, 0, 0, 0xE573, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE575, 0, 0xE576, 0x8ED6, /* 0xC0 */
+ 0, 0xE578, 0, 0x9260, 0, 0x8C75, 0x8A61, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE57B, 0, 0, 0, /* 0xD0 */
+ 0, 0x8A5E, 0, 0xE581, 0, 0, 0xE57C, 0xE580, /* 0xD0 */
+ 0, 0, 0, 0, 0x94B8, 0, 0, 0, /* 0xE0 */
+ 0, 0xE57D, 0, 0, 0xE57E, 0x9567, 0x94D8, 0xE582, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x91FB, 0xE58C, 0, 0xE588, 0, 0, 0x89E9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE586, 0, 0x9649, 0xE587, 0, 0, 0xE584, 0, /* 0x00 */
+ 0xE585, 0xE58A, 0xE58D, 0, 0, 0xE58B, 0, 0, /* 0x00 */
+ 0, 0xE589, 0xE583, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x9277, 0, 0xE594, 0, 0x96A8, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE592, 0, 0, /* 0x20 */
+ 0, 0xE593, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE58E, 0, 0, 0xE590, /* 0x30 */
+ 0, 0, 0, 0xE591, 0, 0, 0, 0xE58F, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x90E4, 0, 0x9858, 0xE598, 0, 0xE599, 0, /* 0x40 */
+ 0, 0, 0, 0xE59F, 0, 0x9049, 0, 0xE59B, /* 0x50 */
+ 0, 0xE59E, 0, 0, 0, 0, 0, 0xE596, /* 0x50 */
+ 0xE595, 0, 0, 0xE5A0, 0, 0, 0x89DA, 0, /* 0x60 */
+ 0xE59C, 0, 0xE5A1, 0, 0, 0, 0xE59D, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE59A, 0, 0x92B1, 0, /* 0x70 */
+ 0xE597, 0, 0, 0, 0, 0, 0, 0x9488, /* 0x70 */
+ 0, 0, 0xE5A5, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x975A, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE5A4, /* 0x90 */
+ 0, 0, 0xE5A3, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE5AC, 0, 0, 0, 0xE5A6, /* 0xA0 */
+ 0, 0, 0, 0xE5AE, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x9786, 0xE5B1, 0, 0xE5A8, 0, 0, /* 0xB0 */
+ 0xE5A9, 0, 0, 0, 0xE5AD, 0, 0xE5B0, 0xE5AF, /* 0xC0 */
+ 0, 0, 0, 0xE5A7, 0, 0, 0, 0, /* 0xC0 */
+ 0xE5AA, 0, 0xE5BB, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xE5B4, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE5B2, /* 0xE0 */
+ 0, 0, 0xE5B3, 0, 0, 0, 0xE5B8, 0xE5B9, /* 0xF0 */
+ 0, 0x8A49, 0, 0x8B61, 0, 0, 0xE5B7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5A2, 0, 0xFBA1, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE5B6, 0xE5BA, 0xE5B5, /* 0x00 */
+ 0, 0xE5BC, 0, 0, 0, 0xE5BE, 0xE5BD, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE5C0, 0xE5BF, 0xE579, 0, 0, 0, 0xE5C4, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE5C1, 0, 0, 0, 0, 0xE5C2, 0, /* 0x30 */
+ 0, 0xE5C3, 0, 0xE5C5, 0, 0, 0, 0, /* 0x30 */
+ 0x8C8C, 0, 0xE5C7, 0, 0xE5C6, 0, 0x8F4F, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x8D73, 0x9FA5, 0, 0, /* 0x40 */
+ 0, 0, 0xE5C8, 0x8F70, 0, 0, 0, 0x8A58, /* 0x50 */
+ 0, 0xE5C9, 0, 0x8971, 0, 0x8FD5, 0xE5CA, 0, /* 0x50 */
+ 0, 0x8D74, 0xE5CB, 0x88DF, 0, 0, 0, 0, /* 0x60 */
+ 0x955C, 0, 0, 0xE5CC, 0, 0, 0, 0, /* 0x60 */
+ 0x908A, 0, 0xE5D3, 0, 0, 0xE5D0, 0, 0x928F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE5D1, 0xE5CE, 0x8BDC, /* 0x70 */
+ 0, 0xE5CD, 0xE5D4, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x8C55, 0, 0, 0x91DC, 0, 0xE5DA, 0, 0, /* 0x80 */
+ 0, 0, 0xE5D6, 0, 0, 0, 0x91B3, 0xE5D5, /* 0x90 */
+ 0, 0xE5D8, 0, 0, 0, 0, 0xE5CF, 0, /* 0x90 */
+ 0, 0, 0xE5D9, 0, 0xE5DB, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x94ED, 0, 0, 0xE5D7, 0, /* 0xA0 */
+ 0xE5DC, 0xE5DE, 0, 0, 0x8CD1, 0xE5D2, 0, 0x88BF, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE5DD, /* 0xB0 */
+ 0, 0x8DD9, 0x97F4, 0xE5DF, 0xE5E0, 0x9195, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x97A0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE5E1, 0x9754, 0, 0, /* 0xD0 */
+ 0xE5E2, 0xE5E3, 0, 0, 0x95E2, 0xE5E4, 0, 0x8DBE, /* 0xD0 */
+ 0, 0x97A1, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE5E9, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xE5EA, 0x8FD6, 0xE5E8, 0xFBA2, 0, 0, /* 0xF0 */
+ 0x9787, 0xE5E5, 0, 0, 0xE5E7, 0x90BB, 0x909E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5E6, 0, 0xE5EB, 0, 0, 0x95A1, /* 0x00 */
+ 0, 0, 0xE5ED, 0, 0xE5EC, 0, 0, 0, /* 0x00 */
+ 0x8A8C, 0, 0x964A, 0xE5EE, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xFA5D, 0xE5FA, 0xE5F0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE5F1, 0, 0, /* 0x20 */
+ 0, 0, 0xE5F2, 0xE5F3, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xE5F7, 0, /* 0x30 */
+ 0xE5F8, 0, 0, 0xE5F6, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xE5F4, 0, 0xE5EF, 0xE5F5, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE5F9, 0xE8B5, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x89A6, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xE5FC, 0x8BDD, /* 0x50 */
+ 0xE5FB, 0, 0, 0, 0xE641, 0, 0xE640, 0, /* 0x60 */
+ 0, 0, 0xE643, 0, 0, 0xE642, 0, 0xE644, /* 0x60 */
+ 0, 0, 0x8F50, 0, 0xE645, 0, 0, 0xE646, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE647, 0x90BC, /* 0x70 */
+ 0, 0x9776, 0, 0xE648, 0, 0, 0x95A2, 0x9465, /* 0x80 */
+ 0xE649, 0, 0xE64A, 0x8CA9, 0, 0, 0, 0x8B4B, /* 0x80 */
+ 0, 0, 0, 0xE64B, 0, 0, 0x8E8B, 0x9460, /* 0x90 */
+ 0xE64C, 0, 0x8A6F, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE64D, 0, 0, 0, 0, 0xE64F, 0x9797, /* 0xA0 */
+ 0, 0xE64E, 0x9065, 0, 0xE650, 0, 0, 0xE651, /* 0xA0 */
+ 0, 0, 0xE652, 0x8ACF, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE653, 0, 0, 0xE654, 0, 0xE655, /* 0xB0 */
+ 0xE656, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x8A70, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE657, 0, 0xE658, 0xE659, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x89F0, 0, 0, 0x9047, 0xE65A, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE65B, 0, 0, 0, /* 0xF0 */
+ 0xE65C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8CBE, 0, 0x92F9, 0xE65D, 0, 0, 0, 0, /* 0x00 */
+ 0x8C76, 0, 0x9075, 0, 0xE660, 0, 0x93A2, 0, /* 0x00 */
+ 0xE65F, 0, 0xFBA3, 0x8C50, 0, 0, 0xE65E, 0x91F5, /* 0x10 */
+ 0x8B4C, 0, 0, 0xE661, 0, 0xE662, 0, 0x8FD7, /* 0x10 */
+ 0, 0, 0, 0x8C8D, 0, 0xE663, 0, 0, /* 0x20 */
+ 0, 0, 0x964B, 0, 0, 0x90DD, 0, 0, /* 0x20 */
+ 0, 0x8B96, 0, 0x96F3, 0x9169, 0, 0xE664, 0xFBA4, /* 0x30 */
+ 0, 0, 0x9066, 0x9290, 0x8FD8, 0, 0, 0, /* 0x30 */
+ 0, 0xE665, 0, 0, 0, 0, 0xE668, 0, /* 0x40 */
+ 0xE669, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x8DBC, 0x91C0, 0xE667, 0, 0x8FD9, 0x955D, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE666, 0, 0, 0x8E8C, 0, /* 0x50 */
+ 0x8972, 0, 0xE66D, 0x8C77, 0, 0, 0x8E8E, 0, /* 0x60 */
+ 0, 0x8E8D, 0, 0x986C, 0xE66C, 0xE66B, 0x9146, 0, /* 0x60 */
+ 0x8B6C, 0x9862, 0x8A59, 0x8FDA, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xFBA5, 0, 0, 0xE66A, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE66F, 0, 0xE670, 0xE66E, 0, 0x8CD6, /* 0x80 */
+ 0, 0x975F, 0, 0, 0x8E8F, 0x9446, 0, 0, /* 0x80 */
+ 0, 0xE673, 0, 0x90BE, 0, 0x9261, 0, 0, /* 0x90 */
+ 0x9755, 0, 0xE676, 0, 0, 0, 0x8CEA, 0, /* 0x90 */
+ 0x90BD, 0xE672, 0, 0xE677, 0x8CEB, 0xE674, 0xE675, 0xFBA6, /* 0xA0 */
+ 0xE671, 0, 0, 0, 0x90E0, 0x93C7, 0, 0, /* 0xA0 */
+ 0x924E, 0, 0x89DB, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x94EE, 0, 0, 0x8B62, 0, 0xFBA7, 0x92B2, /* 0xB0 */
+ 0, 0, 0xE67A, 0, 0xE678, 0, 0, 0x926B, /* 0xC0 */
+ 0, 0, 0, 0x90BF, 0x8AD0, 0xE679, 0, 0x907A, /* 0xC0 */
+ 0, 0, 0x97C8, 0, 0, 0, 0x985F, 0, /* 0xD0 */
+ 0, 0, 0xE67B, 0xE687, 0x92B3, 0, 0xE686, 0xFBA8, /* 0xD0 */
+ 0xE683, 0xE68B, 0xE684, 0, 0xE680, 0, 0x92FA, 0xE67E, /* 0xE0 */
+ 0, 0, 0, 0xE67C, 0, 0x9740, 0x8E90, 0, /* 0xE0 */
+ 0, 0xE681, 0, 0xE67D, 0, 0, 0xFBAA, 0xE685, /* 0xF0 */
+ 0x8F94, 0, 0x8CBF, 0, 0, 0, 0x91F8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9664, 0x8979, 0x88E0, 0, 0x93A3, 0, 0, 0xE689, /* 0x00 */
+ 0, 0, 0, 0, 0xE688, 0, 0x93E4, 0, /* 0x00 */
+ 0xE68D, 0, 0, 0, 0xE682, 0, 0xE68C, 0xE68E, /* 0x10 */
+ 0, 0x8CAA, 0xE68A, 0x8D75, 0, 0x8ED3, 0, 0, /* 0x10 */
+ 0xE68F, 0x9777, 0, 0, 0, 0, 0xE692, 0, /* 0x20 */
+ 0xE695, 0, 0, 0xE693, 0x9554, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE690, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x8BDE, 0, 0, 0, 0, 0xE694, 0, /* 0x30 */
+ 0, 0xE696, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xE69A, 0, 0, 0xE697, 0, 0xE699, 0xE698, /* 0x40 */
+ 0, 0, 0, 0xFBAB, 0, 0, 0xE69B, 0, /* 0x50 */
+ 0x8EAF, 0, 0xE69D, 0xE69C, 0x9588, 0, 0, 0xE69F, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x8C78, 0, /* 0x60 */
+ 0, 0, 0, 0xE69E, 0xE6A0, 0, 0, 0xE6A1, /* 0x60 */
+ 0x8B63, 0xE3BF, 0x8FF7, 0, 0xE6A2, 0, 0, 0x8CEC, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE6A3, 0, 0xFBAC, /* 0x70 */
+ 0xE6A4, 0, 0, 0x8E5D, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x9DCC, 0, 0xE6A5, 0, 0xE6A6, 0, /* 0x80 */
+ 0x8F51, 0, 0xE6A7, 0xE6A8, 0, 0, 0xE6A9, 0, /* 0x90 */
+ 0, 0xE6AA, 0xE6AB /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x924A, /* 0x30 */
+ 0, 0, 0xE6AC, 0, 0, 0, 0, 0xE6AE, /* 0x30 */
+ 0, 0xE6AD, 0, 0, 0, 0, 0x93A4, 0, /* 0x40 */
+ 0xE6AF, 0, 0x964C, 0, 0xE6B0, 0, 0xE6B1, 0, /* 0x40 */
+ 0xE6B2, 0, 0, 0, 0, 0xE6B3, 0, 0, /* 0x50 */
+ 0, 0, 0x93D8, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x8FDB, 0xE6B4, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x8D8B, 0x98AC, 0xE6B5, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE6B6, 0x955E, 0xE6B7, 0, 0xE6BF, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE6B8, 0, 0, 0xE6BA, 0, 0, /* 0x80 */
+ 0, 0xE6B9, 0xE6BB, 0, 0x9665, 0xE6BC, 0xE6BD, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE6BE, 0, 0, 0, /* 0x90 */
+ 0xE6C0, 0, 0, 0, 0, 0x8A4C, 0x92E5, 0, /* 0x90 */
+ 0x9589, 0x8DE0, 0x8D76, 0, 0, 0, 0, 0x956E, /* 0xA0 */
+ 0x89DD, 0x94CC, 0xE6C3, 0x8AD1, 0x90D3, 0xE6C2, 0xE6C7, 0x9299, /* 0xA0 */
+ 0x96E1, 0, 0xE6C5, 0xE6C6, 0x8B4D, 0, 0xE6C8, 0x9483, /* 0xB0 */
+ 0x91DD, 0, 0, 0x94EF, 0x935C, 0xE6C4, 0, 0x9666, /* 0xB0 */
+ 0x89EA, 0xE6CA, 0x9847, 0x92C0, 0x9864, 0, 0, 0x8E91, /* 0xC0 */
+ 0xE6C9, 0, 0x91AF, 0, 0, 0xE6DA, 0x9147, 0, /* 0xC0 */
+ 0, 0x93F6, 0, 0x956F, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE6CD, 0x8E5E, 0x8E92, 0, 0x8FDC, 0, /* 0xD0 */
+ 0x9485, 0, 0x8CAB, 0xE6CC, 0xE6CB, 0, 0x958A, 0, /* 0xE0 */
+ 0, 0, 0x8EBF, 0, 0, 0x9371, 0, 0, /* 0xE0 */
+ 0xFBAD, 0, 0, 0, 0xFBAE, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xE6CF, 0xE6D0, 0x8D77, 0xE6CE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE6D1, 0xE6D2, 0, 0xE6D4, /* 0x00 */
+ 0x91A1, 0, 0xE6D3, 0x8AE4, 0, 0xE6D6, 0, 0xE6D5, /* 0x00 */
+ 0xE6D7, 0, 0xFBAF, 0xE6D9, 0xE6DB, 0, 0xE6DC, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x90D4, 0, 0x8ECD, 0xE6DD, /* 0x60 */
+ 0, 0, 0, 0x8A71, 0, 0xE6DE, 0, 0, /* 0x60 */
+ 0x9196, 0xE6DF, 0, 0xE6E0, 0x958B, 0, 0xFBB0, 0x8B4E, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xE6E1, 0, 0, 0, 0x92B4, 0, 0, /* 0x80 */
+ 0, 0, 0x897A, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE6E2, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x8EEF, 0, 0, 0, 0, /* 0xA0 */
+ 0x9096, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x91AB, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE6E5, 0, 0, 0, 0xE6E4, 0, /* 0xB0 */
+ 0, 0, 0xE6E3, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE6EB, 0xE6E9, 0, 0, 0xE6E6, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE6E8, 0, /* 0xD0 */
+ 0, 0, 0xE6E7, 0xE6EA, 0, 0x8B97, 0, 0xE6EE, /* 0xD0 */
+ 0, 0x90D5, 0, 0xE6EF, 0, 0, 0, 0, /* 0xE0 */
+ 0x8CD7, 0, 0xE6EC, 0xE6ED, 0, 0, 0, 0x9848, /* 0xE0 */
+ 0, 0, 0, 0x92B5, 0, 0x9148, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xE6F0, 0, 0, 0xE6F3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xE6F1, 0xE6F2, 0x9778, 0, 0, 0, 0, 0x93A5, /* 0x00 */
+ 0xE6F6, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE6F4, 0xE6F5, 0xE6F7, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE748, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE6FA, 0, 0, 0, 0xE6FB, 0xE6F9, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xE6F8, 0, 0x92FB, 0, 0, 0xE740, /* 0x40 */
+ 0xE744, 0xE741, 0xE6FC, 0, 0xE742, 0, 0, 0, /* 0x40 */
+ 0xE743, 0, 0, 0, 0, 0xE74A, 0, 0, /* 0x50 */
+ 0, 0xE745, 0, 0, 0, 0, 0, 0x90D6, /* 0x50 */
+ 0xE747, 0, 0, 0xE749, 0xE746, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE74C, 0, 0x8F52, 0, 0xE74B, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xE74D, 0, 0, 0, /* 0x70 */
+ 0, 0xE74E, 0, 0, 0xE751, 0xE750, 0, 0xE74F, /* 0x80 */
+ 0, 0, 0xE753, 0xE752, 0, 0x96F4, 0, 0, /* 0x80 */
+ 0, 0xE755, 0, 0xE754, 0xE756, 0, 0, 0, /* 0x90 */
+ 0, 0xE757, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE759, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE758, 0x9067, 0xE75A, 0, 0, 0x8BEB, /* 0xA0 */
+ 0xE75B, 0xE75D, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xE75E, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xE75F, 0xE75C, 0, /* 0xC0 */
+ 0xE760, 0, 0x8ED4, 0xE761, 0x8B4F, 0x8C52, 0, 0xFBB2, /* 0xC0 */
+ 0, 0, 0x8CAC, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xE762, 0, 0, 0, 0x93EE, /* 0xD0 */
+ 0, 0, 0x935D, 0xE763, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE766, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x8EB2, 0, 0, 0xE765, 0xE764, 0x8C79, 0xE767 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8A72, 0, 0xE769, 0, 0, /* 0x00 */
+ 0, 0x8DDA, 0xE768, 0, 0xE771, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE76B, 0xE76D, 0x95E3, 0xE76A, 0, 0, /* 0x10 */
+ 0, 0xE76C, 0, 0xE770, 0xE76E, 0x8B50, 0, 0xE76F, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE772, 0, /* 0x20 */
+ 0, 0x9479, 0x97D6, 0, 0, 0, 0, 0x8F53, /* 0x20 */
+ 0, 0, 0, 0xE773, 0, 0, 0, 0, /* 0x30 */
+ 0x9741, 0xE775, 0, 0xE774, 0, 0, 0xE778, 0x9760, /* 0x30 */
+ 0, 0, 0xE777, 0, 0x8A8D, 0xE776, 0xE77B, 0, /* 0x40 */
+ 0, 0xE77A, 0, 0, 0xE779, 0x9351, 0xE77C, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE77D, /* 0x50 */
+ 0, 0, 0, 0, 0xE77E, 0, 0, 0x8D8C, /* 0x50 */
+ 0, 0x8C44, 0xE780, 0xE781, 0xE782, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x9068, 0xE783, 0, 0x8EAB, 0xE784, /* 0x90 */
+ 0, 0, 0, 0xE785, 0, 0, 0, 0x999F, /* 0xA0 */
+ 0x999E, 0, 0, 0, 0, 0xE786, 0xE390, 0xE787, /* 0xA0 */
+ 0x9243, 0x904A, 0x945F, 0, 0, 0, 0, 0xE788, /* 0xB0 */
+ 0, 0, 0x95D3, 0x92D2, 0x8D9E, 0, 0, 0x9248, /* 0xB0 */
+ 0, 0, 0x8949, 0, 0x9698, 0x9076, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x8C7D, 0, /* 0xC0 */
+ 0, 0x8BDF, 0, 0, 0x95D4, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE789, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE78B, 0, 0, 0xE78A, 0x89DE, 0, /* 0xE0 */
+ 0, 0x93F4, 0xE78C, 0x9497, 0, 0x9352, 0, 0xE78D, /* 0xE0 */
+ 0x8F71, 0, 0, 0, 0xE78F, 0, 0, 0x96C0, /* 0xF0 */
+ 0xE79E, 0xE791, 0xE792, 0, 0, 0x92C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x91DE, 0x9197, 0, 0x93A6, 0, 0xE790, 0x8B74, 0, /* 0x00 */
+ 0, 0, 0, 0xE799, 0, 0xE796, 0xE7A3, 0x93A7, /* 0x00 */
+ 0x9280, 0xE793, 0, 0x92FC, 0x9372, 0xE794, 0xE798, 0x9080, /* 0x10 */
+ 0, 0x9487, 0x92CA, 0, 0, 0x90C0, 0xE797, 0x91AC, /* 0x10 */
+ 0x91A2, 0xE795, 0x88A7, 0x9841, 0, 0, 0, 0xE79A, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x91DF, 0, /* 0x20 */
+ 0, 0x8F54, 0x9069, 0, 0, 0xE79C, 0xE79B, 0, /* 0x30 */
+ 0x88ED, 0xE79D, 0, 0, 0x954E, 0, 0xE7A5, 0, /* 0x30 */
+ 0, 0x93D9, 0x908B, 0, 0, 0x9278, 0, 0x8BF6, /* 0x40 */
+ 0, 0xE7A4, 0x9756, 0x895E, 0, 0x95D5, 0x89DF, 0xE79F, /* 0x40 */
+ 0xE7A0, 0xE7A1, 0xE7A2, 0x93B9, 0x9242, 0x88E1, 0xE7A6, 0, /* 0x50 */
+ 0xE7A7, 0xEAA1, 0, 0, 0x91BB, 0, 0xE7A8, 0, /* 0x50 */
+ 0x8993, 0x916B, 0, 0x8CAD, 0, 0x9779, 0, 0xFBB5, /* 0x60 */
+ 0xE7A9, 0x934B, 0, 0, 0, 0x9198, 0x8ED5, 0xE7AA, /* 0x60 */
+ 0, 0, 0xE7AD, 0, 0, 0x8F85, 0xE7AB, 0x914A, /* 0x70 */
+ 0x9149, 0, 0x88E2, 0, 0x97C9, 0xE7AF, 0, 0x94F0, /* 0x70 */
+ 0xE7B1, 0xE7B0, 0xE7AE, 0xE284, 0x8AD2, 0, 0, 0xE78E, /* 0x80 */
+ 0, 0xE7B3, 0xE7B2, 0, 0, 0, 0, 0xE7B4, /* 0x80 */
+ 0, 0x9757, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x93DF, 0, 0, 0x964D, 0, /* 0xA0 */
+ 0xE7B5, 0, 0x8ED7, 0, 0, 0, 0, 0xE7B6, /* 0xA0 */
+ 0, 0xE7B7, 0, 0, 0, 0xE7B8, 0, 0, /* 0xB0 */
+ 0x9340, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x88E8, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x8D78, 0, 0, 0, 0x9859, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xE7BC, 0, 0, 0xFBB6, 0, /* 0xD0 */
+ 0, 0x8C53, 0xE7B9, 0, 0xE7BA, 0, 0, 0, /* 0xE0 */
+ 0x9594, 0, 0, 0, 0, 0x8A73, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x9758, 0, 0x8BBD, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0x9373 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE7BD, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE7BE, 0, 0, 0xFBB8, 0, 0, /* 0x10 */
+ 0, 0xE7BF, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFBB9, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x9341, 0, 0, /* 0x20 */
+ 0xE7C1, 0, 0xE7C0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x93D1, 0xE7C2, 0x8F55, 0x8EDE, 0x947A, 0x9291, 0, /* 0x40 */
+ 0, 0, 0x8EF0, 0, 0x908C, 0, 0xE7C3, 0, /* 0x50 */
+ 0xE7C4, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x907C, 0xE7C5, 0, 0xE7C6, 0, 0, /* 0x60 */
+ 0, 0xE7C7, 0x978F, 0, 0x8F56, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE7C9, 0xE7C8, 0, 0x8D79, 0, 0x8D93, /* 0x70 */
+ 0x8E5F, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE7CC, 0, 0, 0, 0, 0x8F86, /* 0x80 */
+ 0, 0xE7CB, 0, 0xE7CA, 0, 0x91E7, 0, 0, /* 0x80 */
+ 0x8CED, 0, 0x90C1, 0, 0, 0, 0, 0x94AE, /* 0x90 */
+ 0, 0, 0, 0, 0x8F58, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE7CD, 0, 0x8FDD, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE7D0, 0xE7CE, 0, 0, 0, 0xE7CF, /* 0xA0 */
+ 0, 0, 0, 0, 0xE7D2, 0xE7D1, 0, 0, /* 0xB0 */
+ 0x8FF8, 0, 0xE7D3, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xE7D4, 0xE7D5, 0, 0, 0, 0, 0x94CE, 0x8DD1, /* 0xC0 */
+ 0x8EDF, 0xE7D6, 0, 0xE7D7, 0x97A2, 0x8F64, 0x96EC, 0x97CA, /* 0xC0 */
+ 0xE7D8, 0x8BE0, 0, 0, 0, 0, 0xE7D9, 0xFBBB, /* 0xD0 */
+ 0x9342, 0, 0xFBBA, 0xE7DC, 0x8A98, 0x906A, 0xFBBC, 0xE7DA, /* 0xD0 */
+ 0, 0xE7DB, 0, 0x92DE, 0xFBBF, 0xFBC0, 0x9674, 0x8BFA, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xFBBD, 0xFBBE, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE7DE, 0xE7DF, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xE7DD, 0, 0, 0xE7E1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFBC1, 0, /* 0x00 */
+ 0, 0, 0xFBC3, 0, 0, 0x93DD, 0x8A62, 0, /* 0x00 */
+ 0xFBC2, 0xE7E5, 0, 0, 0xE7E2, 0xE7E4, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE7E0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE86E, 0, 0, 0xE7E3, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x97E9, 0, 0, 0x8CD8, /* 0x30 */
+ 0, 0xFBCA, 0xFBC4, 0, 0xFBC6, 0, 0, 0xE7ED, /* 0x30 */
+ 0xFBC5, 0, 0, 0, 0x9353, 0xE7E8, 0, 0, /* 0x40 */
+ 0xE7EB, 0xE7E9, 0, 0xE7EE, 0, 0, 0xFBC7, 0, /* 0x40 */
+ 0xE7EF, 0xFBC9, 0, 0, 0, 0, 0, 0xE7E7, /* 0x50 */
+ 0, 0xFBC8, 0xE7F4, 0x8994, 0, 0, 0xE7E6, 0, /* 0x50 */
+ 0, 0, 0x94AB, 0, 0xE7EA, 0, 0x8FDE, 0xFBCB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x8D7A, 0, 0, 0, 0, 0, 0xFBCD, /* 0x70 */
+ 0xFBCE, 0, 0, 0, 0, 0, 0x9667, 0, /* 0x70 */
+ 0x8BE2, 0, 0, 0x8F65, 0, 0x93BA, 0, 0, /* 0x80 */
+ 0xFA5F, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x914C, 0, 0xE7F2, 0, 0xE7EC, 0xE7F1, 0, /* 0x90 */
+ 0x96C1, 0, 0x92B6, 0xE7F3, 0xE7F0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFBCC, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x914B, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7F7, /* 0xB0 */
+ 0, 0xE7F6, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7F5, /* 0xC0 */
+ 0xFBD2, 0, 0x964E, 0xFBD6, 0, 0xFBD4, 0, 0xFBD0, /* 0xD0 */
+ 0, 0xFBD1, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xFBD5, 0, 0, 0, 0x8F9B, 0, 0, 0xFBCF, /* 0xE0 */
+ 0, 0xE7F8, 0x95DD, 0, 0, 0x8973, 0, 0, /* 0xE0 */
+ 0, 0, 0x9565, 0x9292, 0, 0, 0, 0, /* 0xF0 */
+ 0x8B98, 0xFA65, 0xE7FA, 0xFBD9, 0x8D7C, 0, 0, 0xFBDC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFBDE, 0, 0, 0, 0x8E4B, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7F9, /* 0x00 */
+ 0x908D, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x908E, 0xE840, 0xE842, 0, 0, 0xFBDD, 0xFBDB, 0, /* 0x10 */
+ 0x8FF9, 0xFBD8, 0xE841, 0xE843, 0, 0xFBD7, 0x8BD1, 0, /* 0x20 */
+ 0x9564, 0, 0, 0x8EE0, 0x9842, 0, 0xE7FC, 0x8DF6, /* 0x20 */
+ 0, 0, 0x985E, 0, 0, 0xE845, 0, 0, /* 0x30 */
+ 0, 0, 0xE844, 0xE846, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE7FB, 0, 0, 0, /* 0x40 */
+ 0xFA5E, 0, 0, 0x93E7, 0, 0x9374, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x92D5, 0, 0xE84B, 0xFBE0, /* 0x50 */
+ 0, 0, 0, 0x9262, 0xE847, 0, 0, 0, /* 0x50 */
+ 0xE848, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x8C4C, 0, 0xE84A, 0, /* 0x60 */
+ 0xFBDF, 0, 0, 0, 0, 0x8CAE, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xE849, 0, 0x8FDF, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x8A99, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE84F, 0, 0x8DBD, 0x9199, /* 0x90 */
+ 0, 0, 0x92C8, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xFBE1, 0, 0, 0x8A5A, /* 0xA0 */
+ 0, 0, 0, 0, 0xE84D, 0xE84E, 0x92C1, 0, /* 0xA0 */
+ 0xE84C, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE850, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE856, 0, 0, 0xFBE2, 0, /* 0xC0 */
+ 0xE859, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xE858, 0x934C, 0, 0, 0, 0, 0xE851, 0xE852, /* 0xD0 */
+ 0xE855, 0, 0, 0, 0, 0xE857, 0xFBE3, 0, /* 0xD0 */
+ 0, 0x8BBE, 0, 0, 0xE85A, 0xE854, 0, 0, /* 0xE0 */
+ 0xE853, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xFBE4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE85E, 0, 0, 0, 0xE85F, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xE860, 0, 0, 0xE85D, 0xE85C, 0, 0, 0, /* 0x10 */
+ 0x8FE0, 0x93A8, 0xE85B, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE864, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE862, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xFBE5, 0, 0, 0, 0xE863, 0xE861, 0, /* 0x30 */
+ 0x91F6, 0, 0xE865, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xE866, 0, 0, 0xE868, 0xFBE6, 0, 0, /* 0x40 */
+ 0xFBE7, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x8AD3, 0xE867, 0x96F8, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE873, 0xE869, 0, 0, 0xE86C, 0, /* 0x50 */
+ 0xE86A, 0, 0xE86B, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE86D, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xE86F, 0, 0, 0, 0, 0xE870, 0, 0xE871, /* 0x70 */
+ 0, 0, 0, 0, 0xE874, 0xE872, 0xE875, 0xE877, /* 0x70 */
+ 0, 0xE876 /* 0x80 */
+ /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x92B7, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x96E5, 0, 0xE878, 0x914D, 0, 0, 0, 0xE879, /* 0x80 */
+ 0, 0x95C2, 0xE87A, 0x8A4A, 0, 0, 0, 0x895B, /* 0x80 */
+ 0, 0x8AD5, 0xFBE8, 0x8AD4, 0xE87B, 0, 0xE87C, 0, /* 0x90 */
+ 0xE87D, 0xE87E, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xE880, 0, 0x8AD6, 0x8A74, 0x8D7D, 0x94B4, 0, 0xE882, /* 0xA0 */
+ 0xE881, 0, 0, 0, 0, 0xE883, 0, 0, /* 0xA0 */
+ 0, 0, 0x897B, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE886, 0, 0xE885, 0xE884, 0, 0xE887, 0, /* 0xB0 */
+ 0, 0, 0, 0xE88A, 0, 0, 0, 0x88C5, /* 0xC0 */
+ 0, 0, 0xE888, 0, 0xE88C, 0xE88B, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE88E, 0xE88D, 0xE88F, 0, /* 0xD0 */
+ 0x93AC, 0, 0, 0, 0xE890, 0, 0, 0, /* 0xD0 */
+ 0, 0xE891, 0xE893, 0, 0, 0xE892 /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0x958C, 0, 0, 0, /* 0x10 */
+ 0, 0xE894, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE895, 0, 0x8DE3, 0, 0, 0, 0xE896, 0xE897, /* 0x20 */
+ 0, 0, 0x9668, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x916A, 0, 0, 0, 0x88A2, /* 0x30 */
+ 0x91C9, 0, 0xE898, 0, 0x958D, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xE89B, 0xE899, 0x8D7E, 0, 0xE89A, /* 0x40 */
+ 0x8CC0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x95C3, 0xE89D, 0xE89F, 0xE89E, 0xE8A0, /* 0x50 */
+ 0, 0, 0x8940, 0x9077, 0x8F9C, 0x8AD7, 0xE8A1, 0, /* 0x60 */
+ 0, 0, 0x9486, 0, 0xE8A3, 0, 0, 0, /* 0x60 */
+ 0x8941, 0, 0xE8A2, 0x92C2, 0, 0x97CB, 0x93A9, 0xE89C, /* 0x70 */
+ 0x97A4, 0, 0x8CAF, 0, 0, 0x977A, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x8BF7, 0x97B2, 0, /* 0x80 */
+ 0x8C47, 0, 0x91E0, 0xE440, 0, 0xE8A4, 0x8A4B, 0x908F, /* 0x80 */
+ 0, 0, 0, 0, 0x8A75, 0xE8A6, 0, 0xE8A7, /* 0x90 */
+ 0xE8A5, 0x8C84, 0, 0x8DDB, 0x8FE1, 0xFBEB, 0, 0, /* 0x90 */
+ 0x8942, 0, 0, 0x97D7, 0, 0, 0, 0xE8A9, /* 0xA0 */
+ 0xE7AC, 0, 0xE8A8, 0, 0, 0, 0, 0xFBEC, /* 0xA0 */
+ 0xE8AC, 0xE8AA, 0xE8AB, 0, 0xE8AD, 0, 0xE8AE, 0x97EA, /* 0xB0 */
+ 0xE8AF, 0xE8B0, 0, 0x90C7, 0x94B9, 0, 0, 0, /* 0xB0 */
+ 0x909D, 0x8AE5, 0, 0, 0x9759, 0x89EB, 0x8F57, 0x8CD9, /* 0xC0 */
+ 0, 0xE8B3, 0, 0xE8B2, 0x8E93, 0xE8B4, 0xE8B1, 0, /* 0xC0 */
+ 0, 0x8E47, 0, 0, 0, 0xE8B8, 0xE5AB, 0, /* 0xD0 */
+ 0, 0x99D4, 0, 0x9097, 0xE8B6, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x97A3, 0x93EF, 0, 0, 0, 0, /* 0xE0 */
+ 0x894A, 0, 0x90E1, 0x8EB4, 0, 0, 0, 0, /* 0xE0 */
+ 0x95B5, 0, 0x895F, 0, 0, 0, 0x97EB, 0x978B, /* 0xF0 */
+ 0, 0xE8B9, 0, 0x9364 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8EF9, 0, 0, 0, 0xE8BA, 0, 0xE8BB, 0x906B, /* 0x00 */
+ 0xE8BC, 0, 0x97EC, 0, 0, 0xE8B7, 0xE8BE, 0xE8C0, /* 0x00 */
+ 0, 0xE8BF, 0, 0xE8BD, 0, 0, 0xE8C1, 0, /* 0x10 */
+ 0, 0xE8C2, 0, 0, 0x919A, 0, 0x89E0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xE8C3, 0, 0, 0x96B6, /* 0x20 */
+ 0, 0, 0xE8C4, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE8C5, 0, 0x9849, 0xFBED, 0, 0, 0, 0, /* 0x30 */
+ 0x9E50, 0xE8C6, 0, 0xFBEE, 0, 0xE8C7, 0xE8C8, 0, /* 0x30 */
+ 0, 0, 0xE8CC, 0xFBEF, 0xE8C9, 0, 0xE8CA, 0, /* 0x40 */
+ 0xE8CB, 0xE8CD, 0, 0, 0, 0xFBF0, 0, 0xFBF1, /* 0x40 */
+ 0, 0xFBF2, 0x90C2, 0, 0, 0xFBF3, 0x96F5, 0, /* 0x50 */
+ 0, 0x90C3, 0, 0, 0xE8CE, 0, 0x94F1, 0, /* 0x50 */
+ 0xE8CF, 0xEA72, 0x96CA, 0, 0xE8D0, 0, 0xE8D1, 0, /* 0x60 */
+ 0xE8D2, 0x8A76, 0, 0xE8D4, 0, 0x9078, 0, 0, /* 0x60 */
+ 0, 0xE8D5, 0, 0, 0x8C43, 0, 0, 0, /* 0x70 */
+ 0, 0xE8D6, 0xE8DA, 0, 0xE8D8, 0, 0, 0, /* 0x70 */
+ 0, 0xE8D9, 0, 0, 0x8A93, 0xE8D7, 0xE8DB, 0, /* 0x80 */
+ 0, 0, 0, 0xE8DC, 0, 0x88C6, 0, 0xE8DD, /* 0x80 */
+ 0xE8DE, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x8FE2, 0, 0, 0, 0xE8DF, 0, 0, 0, /* 0x90 */
+ 0x8B66, 0, 0, 0xE8E2, 0, 0, 0xE8E1, 0, /* 0xA0 */
+ 0xE8E0, 0, 0, 0xE691, 0, 0x95DA, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE8E3, 0xE8E4, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE8E5, 0, 0, 0xE8E6, 0, /* 0xC0 */
+ 0xE8E7, 0, 0, 0xE8E8, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x8AD8, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE8E9, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE8EA, 0x9442, 0, /* 0xE0 */
+ 0, 0, 0xE8EC, 0x89B9, 0, 0xE8EF, 0xE8EE, 0, /* 0xF0 */
+ 0, 0, 0, 0x8943, 0, 0, 0, 0x8BBF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x95C5, 0x92B8, 0x8DA0, 0, 0x8D80, 0x8F87, 0, /* 0x00 */
+ 0x907B, 0, 0, 0, 0xE8F1, 0, 0, 0xE8F0, /* 0x00 */
+ 0x9761, 0x8AE6, 0x94D0, 0x93DA, 0, 0, 0, 0x909C, /* 0x10 */
+ 0x97CC, 0, 0x8C7A, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE8F4, 0, 0, 0xE8F3, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x966A, 0x93AA, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x896F, 0, 0, 0xE8F5, /* 0x30 */
+ 0xE8F2, 0, 0, 0x9570, 0x978A, 0xE8F6, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE8F7, 0, /* 0x40 */
+ 0, 0, 0, 0xE8F9, 0x91E8, 0x8A7A, 0x8A7B, 0xE8F8, /* 0x40 */
+ 0, 0, 0, 0, 0x8AE7, 0x8CB0, 0, 0xFBF4, /* 0x50 */
+ 0x8AE8, 0, 0, 0x935E, 0, 0, 0x97DE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xFBF5, 0, 0x8CDA, /* 0x60 */
+ 0, 0, 0, 0xE8FA, 0, 0, 0, 0xE8FB, /* 0x60 */
+ 0xE8FC, 0xE940, 0, 0xE942, 0xE941, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x9597, 0, 0xE943, 0, 0, 0, 0, 0xE944, /* 0xA0 */
+ 0, 0xE945, 0, 0, 0, 0, 0xE946, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE948, 0xE947, 0, 0xE949, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x94F2, 0xE3CA, 0, 0, 0x9048, /* 0xD0 */
+ 0, 0, 0x8B51, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE94A, 0, 0xE94B, 0, 0x99AA, 0x9F5A, 0x94D1, /* 0xE0 */
+ 0, 0, 0x88F9, 0, 0x88B9, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x8E94, 0x964F, 0x8FFC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE94C, 0, 0x96DD, 0, 0, /* 0x00 */
+ 0, 0xE94D, 0x977B, 0, 0x8961, 0, 0, 0, /* 0x00 */
+ 0x8E60, 0, 0xE94E, 0x89EC, 0xE94F, 0, 0, 0, /* 0x10 */
+ 0xE950, 0, 0, 0, 0, 0xE952, 0xE953, 0, /* 0x10 */
+ 0xE955, 0xE951, 0, 0, 0xE954, 0, 0, 0xFBF8, /* 0x20 */
+ 0x8AD9, 0, 0, 0, 0xE956, 0, 0xE957, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE958, 0xE959, 0, /* 0x30 */
+ 0, 0, 0xE95A, 0, 0, 0xE95C, 0, 0, /* 0x40 */
+ 0, 0xE95B, 0, 0xE95E, 0xE961, 0, 0, 0, /* 0x40 */
+ 0xE95D, 0xE95F, 0xE960, 0, 0, 0xE962, 0, 0x8BC0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x8EF1, 0xE963, /* 0x90 */
+ 0xE964, 0x8D81, 0, 0, 0, 0, 0xFBFA, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xE965, 0, 0, /* 0xA0 */
+ 0x8A5D, 0, 0, 0, 0x946E, 0xE966, 0xE967, 0, /* 0xA0 */
+ 0, 0, 0, 0x9279, 0x93E9, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE968, 0, 0, 0, /* 0xB0 */
+ 0, 0x949D, 0, 0, 0x91CA, 0x8977, 0x8BEC, 0, /* 0xC0 */
+ 0x8BED, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x9293, 0xE96D, 0x8BEE, 0, 0, 0x89ED, 0, 0, /* 0xD0 */
+ 0xE96C, 0, 0, 0xE96A, 0, 0xE96B, 0, 0xE969, /* 0xD0 */
+ 0, 0, 0xE977, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE96E, 0xE96F, 0, /* 0xE0 */
+ 0, 0xE970, 0xE971, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xE973, 0, 0, 0xE972, 0, 0, 0, 0x8F78 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE974, 0, 0, 0, 0xE976, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x8B52, 0xE975, /* 0x00 */
+ 0, 0, 0x919B, 0x8CB1, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE978, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x91CB, 0, 0, 0xE979, 0, 0, 0, 0, /* 0x20 */
+ 0x93AB, 0, 0, 0, 0, 0, 0, 0xE97A, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE980, 0, /* 0x30 */
+ 0xE97D, 0, 0xE97C, 0xE97E, 0, 0xE97B, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE982, 0xFBFB, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE981, 0, 0xE984, /* 0x50 */
+ 0, 0, 0x8BC1, 0xE983, 0, 0, 0, 0xE985, /* 0x50 */
+ 0, 0, 0xE986, 0, 0xE988, 0xE987, 0, 0, /* 0x60 */
+ 0, 0xE989, 0xE98B, 0xE98A, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x8D9C, 0, 0, 0, 0, 0xE98C, 0, 0, /* 0xA0 */
+ 0xE98D, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x8A5B, 0, 0, 0, 0xE98E, 0, 0, 0, /* 0xB0 */
+ 0xE98F, 0, 0, 0, 0x9091, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE990, /* 0xC0 */
+ 0, 0xE991, 0, 0xE992, 0xE993, 0, 0, 0, /* 0xD0 */
+ 0x8D82, 0xFBFC, 0, 0, 0xFC40, 0, 0xE994, 0xE995, /* 0xD0 */
+ 0, 0, 0xE996, 0xE997, 0, 0, 0xE998, 0, /* 0xE0 */
+ 0, 0, 0x94AF, 0xE99A, 0, 0x9545, 0xE99B, 0xE999, /* 0xE0 */
+ 0, 0xE99D, 0, 0, 0xE99C, 0, 0, 0xE99E, /* 0xF0 */
+ 0, 0, 0, 0xE99F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE9A0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE9A1, 0, 0xE9A2, 0, 0, 0, 0, 0xE9A3, /* 0x10 */
+ 0, 0, 0xE9A4, 0xE9A5, 0, 0xE9A6, 0, 0xE9A7, /* 0x20 */
+ 0xE9A8, 0xE9A9, 0xE9AA, 0, 0, 0, 0xE9AB, 0xE9AC, /* 0x20 */
+ 0, 0x9F54, 0xE9AD, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE2F6, 0x8B53, 0, 0, 0, /* 0x30 */
+ 0, 0x8A40, 0x8DB0, 0xE9AF, 0xE9AE, 0x96A3, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE9B1, 0xE9B2, 0xE9B0, /* 0x40 */
+ 0, 0xE9B3, 0, 0, 0x9682, 0, 0, 0, /* 0x50 */
+ 0xE9B4, 0, 0x8B9B, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x9844, /* 0x60 */
+ 0, 0, 0xFC42, 0, 0xE9B5, 0xFC41, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0xE9B7, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x88BC, 0xFC43, /* 0x80 */
+ 0, 0xE9B8, 0x95A9, 0xE9B6, 0, 0, 0xE9B9, 0xE9BA, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE9BB, /* 0x90 */
+ 0xE9BC, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE9BD, 0, 0x968E, 0x8E4C, 0, 0x8DF8, 0x914E, 0, /* 0xA0 */
+ 0, 0xFC44, 0, 0, 0xE9BE, 0, 0, 0, /* 0xB0 */
+ 0, 0xE9C1, 0, 0xFC45, 0, 0, 0, 0, /* 0xB0 */
+ 0xE9BF, 0, 0, 0, 0, 0, 0xE9C2, 0, /* 0xC0 */
+ 0, 0x8CEF, 0xE9C0, 0, 0, 0, 0, 0xE9C3, /* 0xC0 */
+ 0, 0xE9C4, 0xE9C5, 0, 0xE9C9, 0, 0x8E49, 0, /* 0xD0 */
+ 0, 0, 0, 0x91E2, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE9CA, 0xE9C7, 0xE9C6, 0xE9C8, 0, 0, 0, /* 0xE0 */
+ 0x8C7E, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE9CE, 0xE9CD, 0xE9CC, 0, 0, 0x88B1 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFC46, 0, 0, 0, 0xE9D8, 0, 0xE9D4, 0, /* 0x00 */
+ 0xE9D5, 0xE9D1, 0xE9D7, 0, 0xE9D3, 0x8A82, 0, 0, /* 0x00 */
+ 0x986B, 0, 0xE9D6, 0xE9D2, 0xE9D0, 0xE9CF, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE9DA, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE9DD, 0, 0, 0xE9DC, 0xE9DB, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x9568, 0xE9D9, 0x88F1, /* 0x20 */
+ 0xE9DE, 0, 0xE9E0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x8A8F, 0xE9CB, 0x8956, 0, 0, 0xE9E2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE9E1, 0xE9DF, /* 0x40 */
+ 0x924C, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x9690, 0, 0, 0, 0, 0x97D8, /* 0x50 */
+ 0, 0, 0xE9E3, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE9E4, 0, 0, 0, 0, 0, 0, 0xE9E5, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xE9E6, 0, /* 0x70 */
+ 0xE9E7, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x92B9, 0, 0xE9E8, /* 0xE0 */
+ 0, 0x94B5, 0, 0xE9ED, 0xE9E9, 0, 0, 0, /* 0xE0 */
+ 0xE9EA, 0, 0, 0x9650, 0x96C2, 0, 0x93CE /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE9EE, 0, 0, 0xE9EF, 0x93BC, /* 0x00 */
+ 0xE9EC, 0xE9EB, 0, 0, 0, 0, 0x89A8, 0, /* 0x00 */
+ 0, 0, 0xE9F7, 0, 0, 0xE9F6, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x8995, 0, 0, 0, 0xE9F4, /* 0x10 */
+ 0, 0, 0, 0xE9F3, 0, 0, 0xE9F1, 0, /* 0x20 */
+ 0x8A9B, 0, 0xE9F0, 0x8EB0, 0x89A7, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x8D83, 0, 0, 0xE9FA, 0xE9F9, /* 0x30 */
+ 0, 0xE9F8, 0, 0, 0xE9F5, 0, 0xE9FB, 0, /* 0x40 */
+ 0xE9FC, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEA44, 0xEA43, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xEA45, 0, 0, 0x894C, 0xEA40, 0xEA41, 0, /* 0x50 */
+ 0x8D94, 0x96B7, 0, 0, 0xEA42, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xFC48, 0x9651, 0, 0, 0xEA4A, /* 0x60 */
+ 0xFC47, 0, 0xEA46, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xEA4B, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEA48, /* 0x80 */
+ 0, 0xEA47, 0, 0, 0, 0, 0, 0x8C7B, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xEA4C, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xEA4D, 0, 0, 0, /* 0xA0 */
+ 0, 0xEA4E, 0, 0xEA49, 0, 0, 0, 0xE9F2, /* 0xA0 */
+ 0, 0, 0xEA4F, 0, 0x92DF, 0, 0, 0, /* 0xB0 */
+ 0xEA53, 0, 0xEA54, 0xEA52, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xEA51, 0xEA57, 0, 0xEA50, 0, 0xEA55, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEA56, /* 0xC0 */
+ 0, 0, 0, 0xEA59, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xEA58, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xEA5B, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xEA5C, 0, 0xEA5D, /* 0xE0 */
+ 0, 0, 0x9868, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xEA5A, 0x91E9, 0x8DEB, 0, 0, 0xEA5E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0xFC4A, 0xEA5F, 0xEA60, 0, 0, 0xEA61, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xEA62, 0, 0, /* 0x70 */
+ 0x8CB2, 0xEA63, 0, 0, 0, 0xEA64, 0, 0x8EAD, /* 0x70 */
+ 0, 0xEA65, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xEA66, 0, 0, 0xEA67, 0xEA68, 0, 0, 0, /* 0x80 */
+ 0, 0xEA6B, 0xEA69, 0x985B, 0, 0xEA6A, 0, 0x97ED, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xEA6C, 0, 0x97D9, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xEA6D, 0x949E, 0, /* 0xA0 */
+ 0, 0xEA6E, 0xEA70, 0, 0, 0xEA71, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xEA6F, 0x8D8D, 0x96CB, 0x9683, 0x9BF5, 0, 0x9F80, 0x969B, /* 0xB0 */
+ 0, 0, 0, 0, 0x89A9, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xEA73, 0x8B6F, 0xEA74, 0xEA75, /* 0xC0 */
+ 0xEA76, 0xFC4B, 0x8D95, 0, 0xEA77, 0, 0, 0, /* 0xD0 */
+ 0xE0D2, 0x96D9, 0, 0x91E1, 0xEA78, 0xEA7A, 0xEA79, 0, /* 0xD0 */
+ 0xEA7B, 0, 0, 0, 0, 0xEA7C, 0, 0, /* 0xE0 */
+ 0xEA7D, 0, 0, 0, 0, 0, 0, 0xEA7E, /* 0xE0 */
+ 0, 0, 0, 0, 0xEA80, 0, 0xEA81, 0xEA82, /* 0xF0 */
+ 0, 0xEA83, 0, 0xEA84, 0xEA85, 0xEA86 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEA87, /* 0x00 */
+ 0xEA88, 0, 0, 0, 0, 0, 0x9343, 0, /* 0x00 */
+ 0, 0, 0, 0x8CDB, 0, 0xEA8A, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x916C, 0xEA8B, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xEA8C, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x9540, 0, 0, 0xEA8D, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xEA8E, 0xE256, 0, 0, 0xE6D8, 0xE8EB, /* 0x40 */
+ 0, 0, 0xEA8F, 0, 0xEA90, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEA92, /* 0x50 */
+ 0xEA93, 0xEA94, 0x97EE, 0xEA91, 0, 0, 0xEA95, 0xEA96, /* 0x60 */
+ 0, 0, 0xEA98, 0, 0xEA97, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xEA9A, 0, 0, 0, 0xEA9B, 0xEA99, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x97B4, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xEA9C, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xEA9D, 0xE273, 0, 0, /* 0x90 */
+ 0xEA9E /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* this table includes some IBM Kanji's */
+
+static sal_uInt16 const aImplUniToDBCSTab_MS932_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x20 */
+ 0xFAE0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xFBE9 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* this table includes some IBM Kanji's */
+
+static sal_uInt16 const aImplUniToDBCSTab_MS932_FA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xFA90, 0xFA9B, /* 0x00 */
+ 0xFA9C, 0xFAB1, 0xFAD8, 0xFAE8, 0xFAEA, 0xFB58, 0xFB5E, 0xFB75, /* 0x10 */
+ 0xFB7D, 0xFB7E, 0xFB80, 0xFB82, 0xFB86, 0xFB89, 0xFB92, 0xFB9D, /* 0x10 */
+ 0xFB9F, 0xFBA0, 0xFBA9, 0xFBB1, 0xFBB3, 0xFBB4, 0xFBB7, 0xFBD3, /* 0x20 */
+ 0xFBDA, 0xFBEA, 0xFBF6, 0xFBF7, 0xFBF9, 0xFC49 /* 0x20 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLEJAPANESE_FE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEB64, 0xEB5C, 0, 0xEB51, 0, 0xEB69, 0xEB6A, 0xEB6F, /* 0x30 */
+ 0xEB70, 0xEB6B, 0xEB6C, 0xEB79, 0xEB7A, 0xEB73, 0xEB74, 0xEB71, /* 0x30 */
+ 0xEB72, 0xEB75, 0xEB76, 0xEB77, 0xEB78 /* 0x40 */
+ /* 0x40 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_SJIS_FF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8149, 0xFA57, 0x8194, 0x8190, 0x8193, 0x8195, 0xFA56, /* 0x00 */
+ 0x8169, 0x816A, 0x8196, 0x817B, 0x8143, 0x817C, 0x8144, 0x815E, /* 0x00 */
+ 0x824F, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, /* 0x10 */
+ 0x8257, 0x8258, 0x8146, 0x8147, 0x8183, 0x8181, 0x8184, 0x8148, /* 0x10 */
+ 0x8197, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, /* 0x20 */
+ 0x8267, 0x8268, 0x8269, 0x826A, 0x826B, 0x826C, 0x826D, 0x826E, /* 0x20 */
+ 0x826F, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, /* 0x30 */
+ 0x8277, 0x8278, 0x8279, 0x816D, 0x815F, 0x816E, 0x814F, 0x8151, /* 0x30 */
+ 0x814D, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, /* 0x40 */
+ 0x8288, 0x8289, 0x828A, 0x828B, 0x828C, 0x828D, 0x828E, 0x828F, /* 0x40 */
+ 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, /* 0x50 */
+ 0x8298, 0x8299, 0x829A, 0x816F, 0x8162, 0x8170, 0x8160, 0, /* 0x50 */
+ 0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0x60 */
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0x60 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0x70 */
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* 0x70 */
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, /* 0x80 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* 0x80 */
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, /* 0x90 */
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x8191, 0x8192, 0x81CA, 0x8150, 0xFA55, 0x818F /* 0xE0 */
+ /* 0xE0 */
+};
+
diff --git a/sal/textenc/tcvtjp3.tab b/sal/textenc/tcvtjp3.tab
new file mode 100644
index 000000000000..1dde04e1aafb
--- /dev/null
+++ b/sal/textenc/tcvtjp3.tab
@@ -0,0 +1,2914 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the DBCS to UniCode tables for the following */
+/* japanese charsets: JIS201, JIS208, JIS212 */
+
+/* For compatibility reasons, the Shift-JIS row 8740--879E as defined in
+ http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
+ ("Table version: 2.01," "Date: 04/15/98") is used as the 13th row (i.e.,
+ ISO-2022-JP 2D21--2D7E) of JIS X 0208 (officially, that 13th row contains no
+ characters).
+ */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, /* 0x20 */
+ 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8, /* 0x20 */
+ 0xFF3E, 0xFFE3, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, /* 0x30 */
+ 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F, /* 0x30 */
+ 0x005C, 0x301C, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019, /* 0x40 */
+ 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D, /* 0x40 */
+ 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, /* 0x50 */
+ 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0x2212, 0x00B1, 0x00D7, /* 0x50 */
+ 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E, /* 0x60 */
+ 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5, /* 0x60 */
+ 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20, /* 0x70 */
+ 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, /* 0x20 */
+ 0x203B, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, /* 0x30 */
+ 0x222A, 0x2229, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x2227, 0x2228, 0x00AC, 0x21D2, 0x21D4, 0x2200, /* 0x40 */
+ 0x2203, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x2220, 0x22A5, 0x2312, 0x2202, /* 0x50 */
+ 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, /* 0x60 */
+ 0x2235, 0x222B, 0x222C, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A, 0x2020, /* 0x70 */
+ 0x2021, 0x00B6, 0, 0, 0, 0, 0x25EF /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_23[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, /* 0x30 */
+ 0xFF18, 0xFF19, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, /* 0x40 */
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, /* 0x40 */
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, /* 0x50 */
+ 0xFF38, 0xFF39, 0xFF3A, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, /* 0x60 */
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 0x60 */
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, /* 0x70 */
+ 0xFF58, 0xFF59, 0xFF5A /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_24[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, /* 0x20 */
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, /* 0x20 */
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, /* 0x30 */
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, /* 0x30 */
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, /* 0x40 */
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, /* 0x40 */
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, /* 0x50 */
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, /* 0x50 */
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, /* 0x60 */
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, /* 0x60 */
+ 0x3090, 0x3091, 0x3092, 0x3093 /* 0x70 */
+ /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_25[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, /* 0x20 */
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, /* 0x20 */
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, /* 0x30 */
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, /* 0x30 */
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, /* 0x40 */
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, /* 0x40 */
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, /* 0x50 */
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, /* 0x50 */
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, /* 0x60 */
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, /* 0x60 */
+ 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6 /* 0x70 */
+ /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0x20 */
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, /* 0x20 */
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, /* 0x30 */
+ 0x03A9, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, /* 0x40 */
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* 0x40 */
+ 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, /* 0x50 */
+ 0x03C9 /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_27[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, /* 0x20 */
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, /* 0x20 */
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, /* 0x30 */
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, /* 0x30 */
+ 0x042E, 0x042F, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, /* 0x50 */
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, /* 0x50 */
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, /* 0x60 */
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, /* 0x60 */
+ 0x044E, 0x044F /* 0x70 */
+ /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_28[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, /* 0x20 */
+ 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, /* 0x20 */
+ 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, /* 0x30 */
+ 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, /* 0x30 */
+ 0x2542 /* 0x40 */
+ /* 0x40 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_2D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, /* 0x20 */
+ 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, /* 0x20 */
+ 0x246F, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160, 0x2161, 0x2162, /* 0x30 */
+ 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0, /* 0x30 */
+ 0x3349, 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303, 0x3336, /* 0x40 */
+ 0x3351, 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A, 0x333B, /* 0x40 */
+ 0x339C, 0x339D, 0x339E, 0x338E, 0x338F, 0x33C4, 0x33A1, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x337B, /* 0x50 */
+ 0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, 0x32A5, 0x32A6, /* 0x60 */
+ 0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, 0x337C, /* 0x60 */
+ 0x2252, 0x2261, 0x222B, 0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, /* 0x70 */
+ 0x221F, 0x22BF, 0x2235, 0x2229, 0x222A /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E9C, 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328, /* 0x20 */
+ 0x59F6, 0x9022, 0x8475, 0x831C, 0x7A50, 0x60AA, 0x63E1, 0x6E25, /* 0x20 */
+ 0x65ED, 0x8466, 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271, /* 0x30 */
+ 0x5B9B, 0x59D0, 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216, /* 0x30 */
+ 0x7C9F, 0x88B7, 0x5B89, 0x5EB5, 0x6309, 0x6697, 0x6848, 0x95C7, /* 0x40 */
+ 0x978D, 0x674F, 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2, /* 0x40 */
+ 0x5937, 0x59D4, 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613, /* 0x50 */
+ 0x6905, 0x70BA, 0x754F, 0x7570, 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, /* 0x50 */
+ 0x840E, 0x8863, 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5, /* 0x60 */
+ 0x57DF, 0x80B2, 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038, /* 0x60 */
+ 0x7A32, 0x8328, 0x828B, 0x9C2F, 0x5141, 0x5370, 0x54BD, 0x54E1, /* 0x70 */
+ 0x56E0, 0x59FB, 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_31[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, 0x53F3, 0x5B87, /* 0x20 */
+ 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C, 0x7ABA, 0x4E11, /* 0x20 */
+ 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B, /* 0x30 */
+ 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B, /* 0x30 */
+ 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30, 0x5F71, 0x6620, /* 0x40 */
+ 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E, /* 0x40 */
+ 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA, /* 0x50 */
+ 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E, 0x53AD, 0x5186, /* 0x50 */
+ 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028, 0x63A9, 0x63F4, /* 0x60 */
+ 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, 0x733F, 0x7E01, /* 0x60 */
+ 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B, 0x5869, 0x65BC, /* 0x70 */
+ 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1, /* 0x20 */
+ 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104, /* 0x20 */
+ 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378, /* 0x30 */
+ 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55, /* 0x30 */
+ 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1, /* 0x40 */
+ 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3, /* 0x40 */
+ 0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB, /* 0x50 */
+ 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8, /* 0x50 */
+ 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259, /* 0x60 */
+ 0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5, /* 0x60 */
+ 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB, /* 0x70 */
+ 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, /* 0x20 */
+ 0x7D75, 0x82A5, 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, /* 0x20 */
+ 0x5916, 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, /* 0x30 */
+ 0x84CB, 0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, /* 0x30 */
+ 0x57A3, 0x67FF, 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, /* 0x40 */
+ 0x62E1, 0x64B9, 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, /* 0x40 */
+ 0x899A, 0x89D2, 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, /* 0x50 */
+ 0x5B66, 0x5CB3, 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, /* 0x50 */
+ 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, /* 0x60 */
+ 0x6D3B, 0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, /* 0x60 */
+ 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, /* 0x70 */
+ 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_34[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7CA5, 0x5208, 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0, /* 0x20 */
+ 0x5BD2, 0x520A, 0x52D8, 0x52E7, 0x5DFB, 0x559A, 0x582A, 0x59E6, /* 0x20 */
+ 0x5B8C, 0x5B98, 0x5BDB, 0x5E72, 0x5E79, 0x60A3, 0x611F, 0x6163, /* 0x30 */
+ 0x61BE, 0x63DB, 0x6562, 0x67D1, 0x6853, 0x68FA, 0x6B3E, 0x6B53, /* 0x30 */
+ 0x6C57, 0x6F22, 0x6F97, 0x6F45, 0x74B0, 0x7518, 0x76E3, 0x770B, /* 0x40 */
+ 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266, /* 0x40 */
+ 0x839E, 0x89B3, 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591, /* 0x50 */
+ 0x95A2, 0x9665, 0x97D3, 0x9928, 0x8218, 0x4E38, 0x542B, 0x5CB8, /* 0x50 */
+ 0x5DCC, 0x73A9, 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, /* 0x60 */
+ 0x9811, 0x9854, 0x9858, 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668, /* 0x60 */
+ 0x57FA, 0x5947, 0x5B09, 0x5BC4, 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, /* 0x70 */
+ 0x63EE, 0x673A, 0x65D7, 0x65E2, 0x671F, 0x68CB, 0x68C4 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_35[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948, /* 0x20 */
+ 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18, 0x8CB4, 0x8D77, /* 0x20 */
+ 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100, /* 0x30 */
+ 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591, /* 0x30 */
+ 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC, 0x83CA, 0x97A0, /* 0x40 */
+ 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70, 0x7827, 0x6775, /* 0x40 */
+ 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006, 0x4E18, 0x4E45, /* 0x50 */
+ 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13, 0x6025, 0x6551, /* 0x50 */
+ 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, 0x7AAE, /* 0x60 */
+ 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45, /* 0x60 */
+ 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A, 0x8A31, 0x8DDD, /* 0x70 */
+ 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_36[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6, /* 0x20 */
+ 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37, /* 0x20 */
+ 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1, /* 0x30 */
+ 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7, /* 0x30 */
+ 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681, /* 0x40 */
+ 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5, /* 0x40 */
+ 0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434, /* 0x50 */
+ 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F, /* 0x50 */
+ 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5, /* 0x60 */
+ 0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8, /* 0x60 */
+ 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3, /* 0x70 */
+ 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_37[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, /* 0x20 */
+ 0x9688, 0x7C82, 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, /* 0x20 */
+ 0x85AB, 0x8A13, 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, /* 0x30 */
+ 0x4FC2, 0x50BE, 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, /* 0x30 */
+ 0x5951, 0x5F62, 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, /* 0x40 */
+ 0x643A, 0x656C, 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, /* 0x40 */
+ 0x7D4C, 0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, /* 0x50 */
+ 0x8A63, 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, /* 0x50 */
+ 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, /* 0x60 */
+ 0x6C7A, 0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, /* 0x60 */
+ 0x5039, 0x5026, 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, /* 0x70 */
+ 0x5805, 0x5ACC, 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_38[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x691C, 0x6A29, 0x727D, 0x72AC, 0x732E, 0x7814, 0x786F, /* 0x20 */
+ 0x7D79, 0x770C, 0x80A9, 0x898B, 0x8B19, 0x8CE2, 0x8ED2, 0x9063, /* 0x20 */
+ 0x9375, 0x967A, 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, 0x53B3, /* 0x30 */
+ 0x5E7B, 0x5F26, 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237, /* 0x30 */
+ 0x8A00, 0x8AFA, 0x9650, 0x4E4E, 0x500B, 0x53E4, 0x547C, 0x56FA, /* 0x40 */
+ 0x59D1, 0x5B64, 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF, /* 0x40 */
+ 0x6E56, 0x72D0, 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E, /* 0x50 */
+ 0x8A87, 0x8DE8, 0x9237, 0x96C7, 0x9867, 0x9F13, 0x4E94, 0x4E92, /* 0x50 */
+ 0x4F0D, 0x5348, 0x5449, 0x543E, 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, /* 0x60 */
+ 0x68A7, 0x6A8E, 0x745A, 0x7881, 0x8A9E, 0x8AA4, 0x8B77, 0x9190, /* 0x60 */
+ 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C, 0x4FAF, 0x5019, 0x5016, 0x5149, /* 0x70 */
+ 0x516C, 0x529F, 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_39[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D, /* 0x20 */
+ 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83, 0x5E9A, 0x5EB7, /* 0x20 */
+ 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602, /* 0x30 */
+ 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB, 0x6C5F, 0x6D2A, /* 0x30 */
+ 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C, 0x7A3F, 0x7CE0, /* 0x40 */
+ 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, 0x80AF, 0x80B1, /* 0x40 */
+ 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, 0x8CA2, /* 0x50 */
+ 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC, 0x95A4, 0x964D, /* 0x50 */
+ 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408, /* 0x60 */
+ 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B, /* 0x60 */
+ 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2, 0x7344, 0x6F09, /* 0x70 */
+ 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB, 0x8FBC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_3A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A, /* 0x20 */
+ 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5, /* 0x20 */
+ 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F, /* 0x30 */
+ 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396, /* 0x30 */
+ 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700, /* 0x40 */
+ 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D, /* 0x40 */
+ 0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D, /* 0x50 */
+ 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728, /* 0x50 */
+ 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A, /* 0x60 */
+ 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A, /* 0x60 */
+ 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22, /* 0x70 */
+ 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_3B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5BDF, 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, /* 0x20 */
+ 0x96D1, 0x7690, 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, /* 0x20 */
+ 0x4E09, 0x5098, 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, /* 0x30 */
+ 0x71E6, 0x73CA, 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, /* 0x30 */
+ 0x9178, 0x9910, 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, /* 0x40 */
+ 0x4F7F, 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, /* 0x40 */
+ 0x59C9, 0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, /* 0x50 */
+ 0x6307, 0x652F, 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, /* 0x50 */
+ 0x6B7B, 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, /* 0x60 */
+ 0x80A2, 0x8102, 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, /* 0x60 */
+ 0x8AEE, 0x8CC7, 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, /* 0x70 */
+ 0x4F8D, 0x5150, 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_3C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6B21, 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, 0x78C1, /* 0x20 */
+ 0x793A, 0x800C, 0x8033, 0x81EA, 0x8494, 0x8F9E, 0x6C50, 0x9E7F, /* 0x20 */
+ 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, /* 0x30 */
+ 0x53F1, 0x57F7, 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06, /* 0x30 */
+ 0x75BE, 0x8CEA, 0x5B9F, 0x8500, 0x7BE0, 0x5072, 0x67F4, 0x829D, /* 0x40 */
+ 0x5C61, 0x854A, 0x7E1E, 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66, /* 0x40 */
+ 0x659C, 0x716E, 0x793E, 0x7D17, 0x8005, 0x8B1D, 0x8ECA, 0x906E, /* 0x50 */
+ 0x86C7, 0x90AA, 0x501F, 0x52FA, 0x5C3A, 0x6753, 0x707C, 0x7235, /* 0x50 */
+ 0x914C, 0x91C8, 0x932B, 0x82E5, 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, /* 0x60 */
+ 0x53D6, 0x5B88, 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, /* 0x60 */
+ 0x816B, 0x8DA3, 0x9152, 0x9996, 0x5112, 0x53D7, 0x546A, 0x5BFF, /* 0x70 */
+ 0x6388, 0x6A39, 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_3D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32, /* 0x20 */
+ 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED, 0x821F, 0x8490, /* 0x20 */
+ 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031, 0x914B, 0x916C, /* 0x30 */
+ 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, 0x5F93, 0x620E, /* 0x30 */
+ 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD, 0x9283, 0x53D4, /* 0x40 */
+ 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F, /* 0x40 */
+ 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3, /* 0x50 */
+ 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F, 0x6B89, 0x6DF3, /* 0x50 */
+ 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806, /* 0x60 */
+ 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2, /* 0x60 */
+ 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9, 0x53D9, 0x5973, /* 0x70 */
+ 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7, 0x511F /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_3E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531, /* 0x20 */
+ 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11, /* 0x20 */
+ 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB, /* 0x30 */
+ 0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2, /* 0x30 */
+ 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126, /* 0x40 */
+ 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0, /* 0x40 */
+ 0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D, /* 0x50 */
+ 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4, /* 0x50 */
+ 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, /* 0x60 */
+ 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, /* 0x60 */
+ 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63, /* 0x70 */
+ 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_3F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, /* 0x20 */
+ 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, /* 0x20 */
+ 0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, /* 0x30 */
+ 0x664B, 0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, /* 0x30 */
+ 0x795E, 0x79E6, 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, /* 0x40 */
+ 0x8EAB, 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, /* 0x40 */
+ 0x5875, 0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, /* 0x50 */
+ 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, /* 0x50 */
+ 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, /* 0x60 */
+ 0x7C8B, 0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, /* 0x60 */
+ 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, /* 0x70 */
+ 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_40[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6F84, 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, /* 0x20 */
+ 0x51C4, 0x5236, 0x52E2, 0x59D3, 0x5F81, 0x6027, 0x6210, 0x653F, /* 0x20 */
+ 0x6574, 0x661F, 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272, /* 0x30 */
+ 0x751F, 0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0, /* 0x30 */
+ 0x8A93, 0x8ACB, 0x901D, 0x9192, 0x9752, 0x9759, 0x6589, 0x7A0E, /* 0x40 */
+ 0x8106, 0x96BB, 0x5E2D, 0x60DC, 0x621A, 0x65A5, 0x6614, 0x6790, /* 0x40 */
+ 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, 0x8D64, 0x8DE1, /* 0x50 */
+ 0x8E5F, 0x78A9, 0x5207, 0x62D9, 0x63A5, 0x6442, 0x6298, 0x8A2D, /* 0x50 */
+ 0x7A83, 0x7BC0, 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9, /* 0x60 */
+ 0x5148, 0x5343, 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226, /* 0x60 */
+ 0x6247, 0x64B0, 0x6813, 0x6834, 0x6CC9, 0x6D45, 0x6D17, 0x67D3, /* 0x70 */
+ 0x6F5C, 0x714E, 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_41[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239, 0x85A6, 0x8A6E, /* 0x20 */
+ 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291, 0x9583, 0x9BAE, /* 0x20 */
+ 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, 0x81B3, /* 0x30 */
+ 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A, /* 0x30 */
+ 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF, 0x7C97, 0x7D20, /* 0x40 */
+ 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275, /* 0x40 */
+ 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B, /* 0x50 */
+ 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383, 0x633F, 0x63BB, /* 0x50 */
+ 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD, 0x6F15, 0x71E5, /* 0x60 */
+ 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF, 0x7D9C, 0x8061, /* 0x60 */
+ 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5, 0x8D70, 0x9001, /* 0x70 */
+ 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_42[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247, /* 0x20 */
+ 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7, /* 0x20 */
+ 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3, /* 0x30 */
+ 0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A, /* 0x30 */
+ 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253, /* 0x40 */
+ 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806, /* 0x40 */
+ 0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234, /* 0x50 */
+ 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8, /* 0x50 */
+ 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927, /* 0x60 */
+ 0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544, /* 0x60 */
+ 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17, /* 0x70 */
+ 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_43[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, /* 0x20 */
+ 0x7AEA, 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, /* 0x20 */
+ 0x4E39, 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, /* 0x30 */
+ 0x6DE1, 0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, /* 0x30 */
+ 0x80C6, 0x86CB, 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, /* 0x40 */
+ 0x6696, 0x6A80, 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, /* 0x40 */
+ 0x5F1B, 0x6065, 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, /* 0x50 */
+ 0x8718, 0x9045, 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, /* 0x50 */
+ 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, /* 0x60 */
+ 0x5B99, 0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, /* 0x60 */
+ 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, /* 0x70 */
+ 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_44[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5E16, 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, /* 0x20 */
+ 0x61F2, 0x6311, 0x66A2, 0x671D, 0x6F6E, 0x7252, 0x753A, 0x773A, /* 0x20 */
+ 0x8074, 0x8139, 0x8178, 0x8776, 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, /* 0x30 */
+ 0x929A, 0x9577, 0x9802, 0x9CE5, 0x52C5, 0x6357, 0x76F4, 0x6715, /* 0x30 */
+ 0x6C88, 0x73CD, 0x8CC3, 0x93AE, 0x9673, 0x6D25, 0x589C, 0x690E, /* 0x40 */
+ 0x69CC, 0x8FFD, 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, 0x63B4, /* 0x40 */
+ 0x69FB, 0x4F43, 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354, /* 0x50 */
+ 0x693F, 0x6F70, 0x576A, 0x58F7, 0x5B2C, 0x7D2C, 0x722A, 0x540A, /* 0x50 */
+ 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E, /* 0x60 */
+ 0x5448, 0x5824, 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, /* 0x60 */
+ 0x608C, 0x62B5, 0x633A, 0x63D0, 0x68AF, 0x6C40, 0x7887, 0x798E, /* 0x70 */
+ 0x7A0B, 0x7DE0, 0x8247, 0x8A02, 0x8AE6, 0x8E44, 0x9013 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_45[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, 0x64E2, /* 0x20 */
+ 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1, 0x6EBA, 0x54F2, /* 0x20 */
+ 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929, /* 0x30 */
+ 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B, /* 0x30 */
+ 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB, 0x514E, 0x5410, /* 0x40 */
+ 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21, /* 0x40 */
+ 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D, 0x7825, 0x783A, /* 0x50 */
+ 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012, 0x515A, 0x51AC, /* 0x50 */
+ 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5B95, 0x5CF6, /* 0x60 */
+ 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, 0x68DF, /* 0x60 */
+ 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8, 0x5F53, 0x75D8, /* 0x70 */
+ 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_46[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F, /* 0x20 */
+ 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD, /* 0x20 */
+ 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3, /* 0x30 */
+ 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F, /* 0x30 */
+ 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2, /* 0x40 */
+ 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A, /* 0x40 */
+ 0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7, /* 0x50 */
+ 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D, /* 0x50 */
+ 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058, /* 0x60 */
+ 0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960, /* 0x60 */
+ 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302, /* 0x70 */
+ 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_47[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, /* 0x20 */
+ 0x6FE1, 0x79B0, 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, /* 0x20 */
+ 0x5FF5, 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, /* 0x30 */
+ 0x57DC, 0x56A2, 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, /* 0x30 */
+ 0x8FB2, 0x8997, 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, /* 0x40 */
+ 0x6CE2, 0x6D3E, 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, /* 0x40 */
+ 0x4FF3, 0x5EC3, 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, /* 0x50 */
+ 0x80CC, 0x80BA, 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, /* 0x50 */
+ 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, /* 0x60 */
+ 0x877F, 0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, /* 0x60 */
+ 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, /* 0x70 */
+ 0x66DD, 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_48[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x51FD, 0x7BB1, 0x7872, 0x7BB8, 0x8087, 0x7B48, 0x6AE8, /* 0x20 */
+ 0x5E61, 0x808C, 0x7551, 0x7560, 0x516B, 0x9262, 0x6E8C, 0x767A, /* 0x20 */
+ 0x9197, 0x9AEA, 0x4F10, 0x7F70, 0x629C, 0x7B4F, 0x95A5, 0x9CE9, /* 0x30 */
+ 0x567A, 0x5859, 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, 0x53CD, /* 0x30 */
+ 0x53DB, 0x5E06, 0x642C, 0x6591, 0x677F, 0x6C3E, 0x6C4E, 0x7248, /* 0x40 */
+ 0x72AF, 0x73ED, 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4, /* 0x40 */
+ 0x91C6, 0x7169, 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4, /* 0x50 */
+ 0x78D0, 0x8543, 0x86EE, 0x532A, 0x5351, 0x5426, 0x5983, 0x5E87, /* 0x50 */
+ 0x5F7C, 0x60B2, 0x6249, 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC, /* 0x60 */
+ 0x75B2, 0x76AE, 0x7891, 0x79D8, 0x7DCB, 0x7F77, 0x80A5, 0x88AB, /* 0x60 */
+ 0x8AB9, 0x8CBB, 0x907F, 0x975E, 0x98DB, 0x6A0B, 0x7C38, 0x5099, /* 0x70 */
+ 0x5C3E, 0x5FAE, 0x6787, 0x6BD8, 0x7435, 0x7709, 0x7F8E /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_49[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66, /* 0x20 */
+ 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562, 0x7B46, 0x903C, /* 0x20 */
+ 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A, /* 0x30 */
+ 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79, /* 0x30 */
+ 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328, 0x92F2, 0x849C, /* 0x40 */
+ 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C, 0x7015, 0x8CA7, /* 0x40 */
+ 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, 0x57E0, 0x592B, /* 0x50 */
+ 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016, 0x6276, 0x6577, /* 0x50 */
+ 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299, /* 0x60 */
+ 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB, /* 0x60 */
+ 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01, 0x6953, 0x98A8, /* 0x70 */
+ 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_4A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255, /* 0x20 */
+ 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3, /* 0x20 */
+ 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0, /* 0x30 */
+ 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73, /* 0x30 */
+ 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801, /* 0x40 */
+ 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86, /* 0x40 */
+ 0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D, /* 0x50 */
+ 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA, /* 0x50 */
+ 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF, /* 0x60 */
+ 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023, /* 0x60 */
+ 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF, /* 0x70 */
+ 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_4B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, /* 0x20 */
+ 0x840C, 0x84EC, 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, /* 0x20 */
+ 0x98FD, 0x9CF3, 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, /* 0x30 */
+ 0x59A8, 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, /* 0x30 */
+ 0x68D2, 0x5192, 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, /* 0x40 */
+ 0x927E, 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, /* 0x40 */
+ 0x64B2, 0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, /* 0x50 */
+ 0x6B86, 0x5800, 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, /* 0x50 */
+ 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, /* 0x60 */
+ 0x6BCE, 0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, /* 0x60 */
+ 0x9C52, 0x685D, 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, /* 0x70 */
+ 0x8FC4, 0x4FAD, 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_4C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6F2B, 0x8513, 0x5473, 0x672A, 0x9B45, 0x5DF3, 0x7B95, /* 0x20 */
+ 0x5CAC, 0x5BC6, 0x871C, 0x6E4A, 0x84D1, 0x7A14, 0x8108, 0x5999, /* 0x20 */
+ 0x7C8D, 0x6C11, 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB, /* 0x30 */
+ 0x9727, 0x9D61, 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D, /* 0x30 */
+ 0x660E, 0x76DF, 0x8FF7, 0x9298, 0x9CF4, 0x59EA, 0x725D, 0x6EC5, /* 0x40 */
+ 0x514D, 0x68C9, 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21, /* 0x40 */
+ 0x8302, 0x5984, 0x5B5F, 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017, /* 0x50 */
+ 0x8499, 0x5132, 0x6728, 0x9ED9, 0x76EE, 0x6762, 0x52FF, 0x9905, /* 0x50 */
+ 0x5C24, 0x623B, 0x7C7E, 0x8CB0, 0x554F, 0x60B6, 0x7D0B, 0x9580, /* 0x60 */
+ 0x5301, 0x4E5F, 0x51B6, 0x591C, 0x723A, 0x8036, 0x91CE, 0x5F25, /* 0x60 */
+ 0x77E2, 0x5384, 0x5F79, 0x7D04, 0x85AC, 0x8A33, 0x8E8D, 0x9756, /* 0x70 */
+ 0x67F3, 0x85AE, 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_4D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB, /* 0x20 */
+ 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709, 0x67DA, 0x6E67, /* 0x20 */
+ 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5, 0x8A98, 0x904A, /* 0x30 */
+ 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88, 0x4F59, 0x4E0E, /* 0x30 */
+ 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996, 0x5BB9, 0x5EB8, /* 0x40 */
+ 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, 0x6EB6, /* 0x40 */
+ 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981, /* 0x50 */
+ 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E, 0x6291, 0x6B32, /* 0x50 */
+ 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8, /* 0x60 */
+ 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A, /* 0x60 */
+ 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD, 0x862D, 0x89A7, /* 0x70 */
+ 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406, 0x7483 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B, /* 0x20 */
+ 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C, /* 0x20 */
+ 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6, /* 0x30 */
+ 0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC, /* 0x30 */
+ 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C, /* 0x40 */
+ 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B, /* 0x40 */
+ 0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8, /* 0x50 */
+ 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F, /* 0x50 */
+ 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C, /* 0x60 */
+ 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97, /* 0x60 */
+ 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9, /* 0x70 */
+ 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x84EE, 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, /* 0x20 */
+ 0x8CC2, 0x8DEF, 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, /* 0x20 */
+ 0x697C, 0x6994, 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, /* 0x30 */
+ 0x807E, 0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, /* 0x30 */
+ 0x8AD6, 0x502D, 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, /* 0x40 */
+ 0x67A0, 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, /* 0x40 */
+ 0x6900, 0x6E7E, 0x7897, 0x8155 /* 0x50 */
+ /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36, 0x4E3C, /* 0x20 */
+ 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B, 0x4E8A, /* 0x20 */
+ 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0, /* 0x30 */
+ 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7, /* 0x30 */
+ 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30, 0x4F5B, /* 0x40 */
+ 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B, /* 0x40 */
+ 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4, /* 0x50 */
+ 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0, 0x4FE4, /* 0x50 */
+ 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005, 0x4F1C, /* 0x60 */
+ 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011, 0x5006, /* 0x60 */
+ 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A, 0x5056, /* 0x70 */
+ 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, /* 0x20 */
+ 0x50ED, 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, /* 0x20 */
+ 0x5116, 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, /* 0x30 */
+ 0x513B, 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, /* 0x30 */
+ 0x5169, 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, /* 0x40 */
+ 0x518F, 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, /* 0x40 */
+ 0x51A9, 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, /* 0x50 */
+ 0x51BD, 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, /* 0x50 */
+ 0x51F0, 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, /* 0x60 */
+ 0x522A, 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, /* 0x60 */
+ 0x525E, 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, /* 0x70 */
+ 0x528D, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8FA7, 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, /* 0x20 */
+ 0x52D7, 0x52DE, 0x52E3, 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, /* 0x20 */
+ 0x52F8, 0x52F9, 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, /* 0x30 */
+ 0x5315, 0x531A, 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, /* 0x30 */
+ 0x5346, 0x5345, 0x4E17, 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, /* 0x40 */
+ 0x536E, 0x5918, 0x537B, 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, /* 0x40 */
+ 0x53A5, 0x53AE, 0x53B0, 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, /* 0x50 */
+ 0x66FC, 0x71EE, 0x53EE, 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, /* 0x50 */
+ 0x5440, 0x542C, 0x542D, 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, /* 0x60 */
+ 0x544E, 0x548F, 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, /* 0x60 */
+ 0x5492, 0x547B, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, /* 0x70 */
+ 0x54A2, 0x54B8, 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x54AB, 0x54C2, 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5, /* 0x20 */
+ 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE, 0x54ED, 0x54FA, 0x54E2, /* 0x20 */
+ 0x5539, 0x5540, 0x5563, 0x554C, 0x552E, 0x555C, 0x5545, 0x5556, /* 0x30 */
+ 0x5557, 0x5538, 0x5533, 0x555D, 0x5599, 0x5580, 0x54AF, 0x558A, /* 0x30 */
+ 0x559F, 0x557B, 0x557E, 0x5598, 0x559E, 0x55AE, 0x557C, 0x5583, /* 0x40 */
+ 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC, /* 0x40 */
+ 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B, /* 0x50 */
+ 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634, 0x5636, 0x5632, 0x5638, /* 0x50 */
+ 0x566B, 0x5664, 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A, /* 0x60 */
+ 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2, /* 0x60 */
+ 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8, 0x56CE, 0x56D1, 0x56D3, /* 0x70 */
+ 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, 0x5704, 0x5709 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7, /* 0x20 */
+ 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740, 0x574F, /* 0x20 */
+ 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0, /* 0x30 */
+ 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2, /* 0x30 */
+ 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D, 0x5872, /* 0x40 */
+ 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D, 0x5879, /* 0x40 */
+ 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB, 0x58B8, /* 0x50 */
+ 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8, 0x58E5, /* 0x50 */
+ 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, 0x58FC, /* 0x60 */
+ 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C, /* 0x60 */
+ 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950, 0x594E, /* 0x70 */
+ 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, /* 0x20 */
+ 0x59C6, 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, /* 0x20 */
+ 0x5A11, 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, /* 0x30 */
+ 0x5A36, 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, /* 0x30 */
+ 0x5ABD, 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, /* 0x40 */
+ 0x5B0C, 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, /* 0x40 */
+ 0x5B43, 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, /* 0x50 */
+ 0x5B69, 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, /* 0x50 */
+ 0x5B83, 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, /* 0x60 */
+ 0x5BE4, 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, /* 0x60 */
+ 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, /* 0x70 */
+ 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5C50, 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, /* 0x20 */
+ 0x5C79, 0x5C8C, 0x5C91, 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, /* 0x20 */
+ 0x5CBC, 0x5CB7, 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, /* 0x30 */
+ 0x5CFA, 0x5CED, 0x5D8C, 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, /* 0x30 */
+ 0x5D1F, 0x5D1B, 0x5D11, 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, /* 0x40 */
+ 0x5D4C, 0x5D52, 0x5D4E, 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, /* 0x40 */
+ 0x5D84, 0x5D82, 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, /* 0x50 */
+ 0x5DB7, 0x5DBC, 0x5DC9, 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, /* 0x50 */
+ 0x5DEB, 0x5DF2, 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, /* 0x60 */
+ 0x5E36, 0x5E37, 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, /* 0x60 */
+ 0x5E5F, 0x5E62, 0x5E64, 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, /* 0x70 */
+ 0x5E7F, 0x5EA0, 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, 0x5EDB, 0x5EE2, 0x5EE1, /* 0x20 */
+ 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 0x5EF0, 0x5EF4, 0x5EF8, /* 0x20 */
+ 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, 0x5F16, /* 0x30 */
+ 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F, /* 0x30 */
+ 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61, 0x5F6D, 0x5F73, 0x5F77, /* 0x40 */
+ 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E, /* 0x40 */
+ 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB, /* 0x50 */
+ 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3, 0x5FFF, 0x6021, 0x6060, /* 0x50 */
+ 0x6019, 0x6010, 0x6029, 0x600E, 0x6031, 0x601B, 0x6015, 0x602B, /* 0x60 */
+ 0x6026, 0x600F, 0x603A, 0x605A, 0x6041, 0x606A, 0x6077, 0x605F, /* 0x60 */
+ 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 0x6064, 0x6042, 0x606C, /* 0x70 */
+ 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B, /* 0x20 */
+ 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD, 0x60C6, /* 0x20 */
+ 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100, /* 0x30 */
+ 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D, 0x610E, /* 0x30 */
+ 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C, 0x612C, /* 0x40 */
+ 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, /* 0x40 */
+ 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, 0x615D, /* 0x50 */
+ 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194, 0x619A, /* 0x50 */
+ 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7, /* 0x60 */
+ 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6, /* 0x60 */
+ 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC, 0x61FE, /* 0x70 */
+ 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, /* 0x20 */
+ 0x6241, 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, /* 0x20 */
+ 0x6282, 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, /* 0x30 */
+ 0x6294, 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, /* 0x30 */
+ 0x62C8, 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, /* 0x40 */
+ 0x630C, 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, /* 0x40 */
+ 0x6350, 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, /* 0x50 */
+ 0x63AB, 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, /* 0x50 */
+ 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, /* 0x60 */
+ 0x63F6, 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, /* 0x60 */
+ 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, /* 0x70 */
+ 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x64DA, 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, /* 0x20 */
+ 0x64F1, 0x64E7, 0x8209, 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, /* 0x20 */
+ 0x652C, 0x64F6, 0x64F4, 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, /* 0x30 */
+ 0x651C, 0x6505, 0x6524, 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, /* 0x30 */
+ 0x6536, 0x6538, 0x754B, 0x6548, 0x6556, 0x6555, 0x654D, 0x6558, /* 0x40 */
+ 0x655E, 0x655D, 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, /* 0x40 */
+ 0x659F, 0x65AB, 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, /* 0x50 */
+ 0x65D2, 0x65DB, 0x65D9, 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, /* 0x50 */
+ 0x6603, 0x65FB, 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, /* 0x60 */
+ 0x6644, 0x6649, 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, /* 0x60 */
+ 0x665F, 0x6662, 0x6670, 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, /* 0x70 */
+ 0x6698, 0x669D, 0x66C1, 0x66B9, 0x66C9, 0x66BE, 0x66BC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, 0x66E6, /* 0x20 */
+ 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F, 0x6716, 0x671E, 0x6726, /* 0x20 */
+ 0x6727, 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737, /* 0x30 */
+ 0x6746, 0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, /* 0x30 */
+ 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B, 0x67A6, 0x67A1, 0x6785, /* 0x40 */
+ 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4, /* 0x40 */
+ 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9, 0x67CE, 0x67C6, 0x67E7, /* 0x50 */
+ 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840, 0x684D, 0x6832, 0x684E, /* 0x50 */
+ 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, 0x689F, 0x688F, /* 0x60 */
+ 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, 0x6874, /* 0x60 */
+ 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 0x687E, 0x6901, 0x68CA, /* 0x70 */
+ 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7, /* 0x20 */
+ 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A, 0x691A, /* 0x20 */
+ 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978, 0x696B, /* 0x30 */
+ 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959, 0x6930, /* 0x30 */
+ 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE, 0x69D0, /* 0x40 */
+ 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD, /* 0x40 */
+ 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995, /* 0x50 */
+ 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A, 0x69F9, /* 0x50 */
+ 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB, /* 0x60 */
+ 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72, /* 0x60 */
+ 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48, 0x6A38, /* 0x70 */
+ 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, /* 0x20 */
+ 0x6AAC, 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, /* 0x20 */
+ 0x6B05, 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, /* 0x30 */
+ 0x6B37, 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, /* 0x30 */
+ 0x6B59, 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, /* 0x40 */
+ 0x6B80, 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, /* 0x40 */
+ 0x6BAA, 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, /* 0x50 */
+ 0x6BC6, 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, /* 0x50 */
+ 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, /* 0x60 */
+ 0x6C55, 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, /* 0x60 */
+ 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, /* 0x70 */
+ 0x6CBD, 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6CBA, 0x6CDB, 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, /* 0x20 */
+ 0x6D36, 0x6D2B, 0x6D3D, 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, /* 0x20 */
+ 0x6D0C, 0x6D63, 0x6D93, 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, /* 0x30 */
+ 0x6D95, 0x6FE4, 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, /* 0x30 */
+ 0x6DE6, 0x6DB8, 0x6DC6, 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, /* 0x40 */
+ 0x6DC5, 0x6DFA, 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, /* 0x40 */
+ 0x6E6E, 0x6E2E, 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, /* 0x50 */
+ 0x6E2B, 0x6E76, 0x6E4D, 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, /* 0x50 */
+ 0x6EFF, 0x6E1D, 0x6E38, 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, /* 0x60 */
+ 0x6ED3, 0x6EBD, 0x6EAF, 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, /* 0x60 */
+ 0x6EA5, 0x6EC2, 0x6E9F, 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, /* 0x70 */
+ 0x6EFE, 0x6F3F, 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, 0x6ECC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81, /* 0x20 */
+ 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 0x6F82, 0x6F7C, 0x6F58, /* 0x20 */
+ 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4, /* 0x30 */
+ 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8, /* 0x30 */
+ 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B, 0x6FFA, 0x7011, 0x7001, /* 0x40 */
+ 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74, 0x701D, 0x7018, 0x701F, /* 0x40 */
+ 0x7030, 0x703E, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70AF, /* 0x50 */
+ 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE, 0x70DF, 0x70CB, 0x70DD, /* 0x50 */
+ 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188, /* 0x60 */
+ 0x7166, 0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184, /* 0x60 */
+ 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9, 0x71BE, 0x71D2, 0x71C9, /* 0x70 */
+ 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228, 0x722D, /* 0x20 */
+ 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240, 0x7246, /* 0x20 */
+ 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, 0x7292, /* 0x30 */
+ 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4, /* 0x30 */
+ 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7, 0x500F, /* 0x40 */
+ 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329, /* 0x40 */
+ 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368, /* 0x50 */
+ 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3, 0x73CE, /* 0x50 */
+ 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405, 0x746F, /* 0x60 */
+ 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F, 0x7459, /* 0x60 */
+ 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476, 0x747E, /* 0x70 */
+ 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, /* 0x20 */
+ 0x74F1, 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, /* 0x20 */
+ 0x750D, 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, /* 0x30 */
+ 0x754D, 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, /* 0x30 */
+ 0x7567, 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, /* 0x40 */
+ 0x758A, 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, /* 0x40 */
+ 0x75C2, 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, /* 0x50 */
+ 0x75CD, 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, /* 0x50 */
+ 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, /* 0x60 */
+ 0x7609, 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, /* 0x60 */
+ 0x7630, 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, /* 0x70 */
+ 0x7662, 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7672, 0x7676, 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, /* 0x20 */
+ 0x768B, 0x768E, 0x7696, 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, /* 0x20 */
+ 0x76B8, 0x76B9, 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, /* 0x30 */
+ 0x76E1, 0x76E5, 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, /* 0x30 */
+ 0x7704, 0x7729, 0x7724, 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, /* 0x40 */
+ 0x7738, 0x7747, 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, /* 0x40 */
+ 0x777E, 0x7779, 0x778E, 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, /* 0x50 */
+ 0x77B6, 0x77B9, 0x77BF, 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, /* 0x50 */
+ 0x77D7, 0x77DA, 0x77DC, 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, /* 0x60 */
+ 0x7926, 0x7820, 0x792A, 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, /* 0x60 */
+ 0x789A, 0x788C, 0x78A3, 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, /* 0x70 */
+ 0x78CB, 0x78D4, 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x78E7, 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911, /* 0x20 */
+ 0x7919, 0x792C, 0x792B, 0x7940, 0x7960, 0x7957, 0x795F, 0x795A, /* 0x20 */
+ 0x7955, 0x7953, 0x797A, 0x797F, 0x798A, 0x799D, 0x79A7, 0x9F4B, /* 0x30 */
+ 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA, 0x79C9, 0x79D5, 0x79E7, /* 0x30 */
+ 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 0x7A18, 0x7A19, 0x7A20, /* 0x40 */
+ 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, 0x7A57, /* 0x40 */
+ 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D, /* 0x50 */
+ 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96, 0x7AA9, 0x7AC8, 0x7AB0, /* 0x50 */
+ 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD, /* 0x60 */
+ 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2, /* 0x60 */
+ 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F, 0x7B0A, 0x7B06, 0x7B33, /* 0x70 */
+ 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28, 0x7B36, 0x7B50 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, 0x7B75, /* 0x20 */
+ 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E, 0x7B9D, /* 0x20 */
+ 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F, /* 0x30 */
+ 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6, /* 0x30 */
+ 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60, 0x7C00, /* 0x40 */
+ 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23, /* 0x40 */
+ 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43, /* 0x50 */
+ 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64, 0x7C56, /* 0x50 */
+ 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD, 0x7CA2, /* 0x60 */
+ 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, 0x7CB9, /* 0x60 */
+ 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC, 0x7CE2, /* 0x70 */
+ 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, /* 0x20 */
+ 0x7D32, 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, /* 0x20 */
+ 0x7D68, 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, /* 0x30 */
+ 0x7D7D, 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, /* 0x30 */
+ 0x7DAB, 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, /* 0x40 */
+ 0x7DD8, 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, /* 0x40 */
+ 0x7E0A, 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, /* 0x50 */
+ 0x7E22, 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, /* 0x50 */
+ 0x7E32, 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, /* 0x60 */
+ 0x7E79, 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, /* 0x60 */
+ 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, /* 0x70 */
+ 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7F45, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, /* 0x20 */
+ 0x7F54, 0x7F58, 0x7F5F, 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, /* 0x20 */
+ 0x7F82, 0x7F86, 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, /* 0x30 */
+ 0x7F9D, 0x7F9A, 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, /* 0x30 */
+ 0x7FB8, 0x8B71, 0x7FC5, 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, /* 0x40 */
+ 0x7FE6, 0x7FE9, 0x7FF3, 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, /* 0x40 */
+ 0x8012, 0x8018, 0x8019, 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, /* 0x50 */
+ 0x804A, 0x8046, 0x8052, 0x8058, 0x805A, 0x805F, 0x8062, 0x8068, /* 0x50 */
+ 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, /* 0x60 */
+ 0x8086, 0x8085, 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, /* 0x60 */
+ 0x80DB, 0x80E5, 0x80D9, 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, /* 0x70 */
+ 0x80EF, 0x80F1, 0x811B, 0x8129, 0x8123, 0x812F, 0x814B /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x968B, 0x8146, 0x813E, 0x8153, 0x8151, 0x80FC, 0x8171, /* 0x20 */
+ 0x816E, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818A, 0x8180, /* 0x20 */
+ 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, 0x8193, 0x81A9, /* 0x30 */
+ 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, 0x81BA, /* 0x30 */
+ 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8, 0x81C8, 0x81DA, 0x81DF, /* 0x40 */
+ 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205, /* 0x40 */
+ 0x8207, 0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238, /* 0x50 */
+ 0x8233, 0x8240, 0x8259, 0x8258, 0x825D, 0x825A, 0x825F, 0x8264, /* 0x50 */
+ 0x8262, 0x8268, 0x826A, 0x826B, 0x822E, 0x8271, 0x8277, 0x8278, /* 0x60 */
+ 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F, 0x82BB, 0x82AC, 0x82E1, /* 0x60 */
+ 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, 0x82FA, 0x8393, 0x8303, /* 0x70 */
+ 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, 0x82D9 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, /* 0x20 */
+ 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385, 0x839A, /* 0x20 */
+ 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A, /* 0x30 */
+ 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4, /* 0x30 */
+ 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B, 0x83C1, /* 0x40 */
+ 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420, 0x83BD, /* 0x40 */
+ 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A, 0x8484, /* 0x50 */
+ 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446, 0x842C, /* 0x50 */
+ 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F, /* 0x60 */
+ 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6, /* 0x60 */
+ 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C, 0x851F, /* 0x70 */
+ 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, /* 0x20 */
+ 0x8591, 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, /* 0x20 */
+ 0x859C, 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, /* 0x30 */
+ 0x85D0, 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, /* 0x30 */
+ 0x860B, 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, /* 0x40 */
+ 0x864D, 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, /* 0x40 */
+ 0x86A9, 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, /* 0x50 */
+ 0x86B0, 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, /* 0x50 */
+ 0x86DF, 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, /* 0x60 */
+ 0x86FB, 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, /* 0x60 */
+ 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, /* 0x70 */
+ 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8753, 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, /* 0x20 */
+ 0x87AF, 0x87CB, 0x87BD, 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, /* 0x20 */
+ 0x87B3, 0x87C7, 0x87C6, 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, /* 0x30 */
+ 0x880D, 0x87FE, 0x87F6, 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, /* 0x30 */
+ 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883B, /* 0x40 */
+ 0x8844, 0x8842, 0x8852, 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, /* 0x40 */
+ 0x887E, 0x889E, 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, /* 0x50 */
+ 0x8892, 0x88AE, 0x8899, 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, /* 0x50 */
+ 0x88B1, 0x88C3, 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, /* 0x60 */
+ 0x8902, 0x88FC, 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, /* 0x60 */
+ 0x8913, 0x8943, 0x891E, 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, /* 0x70 */
+ 0x893B, 0x8936, 0x8938, 0x894C, 0x891D, 0x8960, 0x895E /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8966, 0x8964, 0x896D, 0x896A, 0x896F, 0x8974, 0x8977, /* 0x20 */
+ 0x897E, 0x8983, 0x8988, 0x898A, 0x8993, 0x8998, 0x89A1, 0x89A9, /* 0x20 */
+ 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0, /* 0x30 */
+ 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16, /* 0x30 */
+ 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 0x8A36, 0x8A41, 0x8A5B, /* 0x40 */
+ 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85, /* 0x40 */
+ 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A, /* 0x50 */
+ 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA, 0x8AEB, 0x8AF3, 0x8AE7, /* 0x50 */
+ 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, 0x8AF7, 0x8ADE, 0x8ADB, /* 0x60 */
+ 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, 0x8B17, 0x8B20, /* 0x60 */
+ 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 0x8B28, 0x8B41, 0x8B4C, /* 0x70 */
+ 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C, /* 0x20 */
+ 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A, 0x8C41, /* 0x20 */
+ 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62, 0x8C6C, /* 0x30 */
+ 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D, 0x8C8E, /* 0x30 */
+ 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD, 0x8CB2, /* 0x40 */
+ 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, 0x8CDA, /* 0x40 */
+ 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F, /* 0x50 */
+ 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16, 0x8D67, /* 0x50 */
+ 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA, /* 0x60 */
+ 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB, /* 0x60 */
+ 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D, 0x8E1E, /* 0x70 */
+ 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, /* 0x20 */
+ 0x8E60, 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, /* 0x20 */
+ 0x8E87, 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, /* 0x30 */
+ 0x8E99, 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, /* 0x30 */
+ 0x8EC5, 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, /* 0x40 */
+ 0x8EFE, 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, /* 0x40 */
+ 0x8F1F, 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, /* 0x50 */
+ 0x8F42, 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, /* 0x50 */
+ 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, /* 0x60 */
+ 0x8FB7, 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, /* 0x60 */
+ 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, /* 0x70 */
+ 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x904F, 0x9050, 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, /* 0x20 */
+ 0x9056, 0x9058, 0x905E, 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, /* 0x20 */
+ 0x9082, 0x907D, 0x9081, 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, /* 0x30 */
+ 0x90AF, 0x90B1, 0x90B5, 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, /* 0x30 */
+ 0x9112, 0x9119, 0x9132, 0x9130, 0x914A, 0x9156, 0x9158, 0x9163, /* 0x40 */
+ 0x9165, 0x9169, 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, /* 0x40 */
+ 0x91AB, 0x91AF, 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, /* 0x50 */
+ 0x91C9, 0x91CB, 0x91D0, 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, /* 0x50 */
+ 0x91F5, 0x91F6, 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, /* 0x60 */
+ 0x925E, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, /* 0x60 */
+ 0x924B, 0x9250, 0x929C, 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, /* 0x70 */
+ 0x92B9, 0x92B7, 0x92E9, 0x930F, 0x92FA, 0x9344, 0x932E /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B, /* 0x20 */
+ 0x935C, 0x9360, 0x937C, 0x936E, 0x9356, 0x93B0, 0x93AC, 0x93AD, /* 0x20 */
+ 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3, /* 0x30 */
+ 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403, /* 0x30 */
+ 0x9407, 0x9410, 0x9436, 0x942B, 0x9435, 0x9421, 0x943A, 0x9441, /* 0x40 */
+ 0x9452, 0x9444, 0x945B, 0x9460, 0x9462, 0x945E, 0x946A, 0x9229, /* 0x40 */
+ 0x9470, 0x9475, 0x9477, 0x947D, 0x945A, 0x947C, 0x947E, 0x9481, /* 0x50 */
+ 0x947F, 0x9582, 0x9587, 0x958A, 0x9594, 0x9596, 0x9598, 0x9599, /* 0x50 */
+ 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, 0x95BE, /* 0x60 */
+ 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6, /* 0x60 */
+ 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 0x9628, 0x962E, 0x962F, /* 0x70 */
+ 0x9642, 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D, 0x9698, /* 0x20 */
+ 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0, 0x96B4, /* 0x20 */
+ 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD, 0x894D, /* 0x30 */
+ 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, 0x9713, /* 0x30 */
+ 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A, 0x9730, /* 0x40 */
+ 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, /* 0x40 */
+ 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771, /* 0x50 */
+ 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B, 0x978F, /* 0x50 */
+ 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3, /* 0x60 */
+ 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2, 0x7ADF, /* 0x60 */
+ 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821, 0x9837, /* 0x70 */
+ 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, /* 0x20 */
+ 0x98C4, 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, /* 0x20 */
+ 0x9914, 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, /* 0x30 */
+ 0x992E, 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, /* 0x30 */
+ 0x9951, 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, /* 0x40 */
+ 0x99AE, 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, /* 0x40 */
+ 0x99EE, 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, /* 0x50 */
+ 0x99E2, 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, /* 0x50 */
+ 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, /* 0x60 */
+ 0x9A64, 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, /* 0x60 */
+ 0x9ACF, 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, /* 0x70 */
+ 0x9AE6, 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9AFB, 0x9B06, 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, /* 0x20 */
+ 0x9B25, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, /* 0x20 */
+ 0x9B44, 0x9B43, 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, /* 0x30 */
+ 0x9B93, 0x9B83, 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, /* 0x30 */
+ 0x9BB4, 0x9BC0, 0x9BCA, 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, /* 0x40 */
+ 0x9BE3, 0x9BE2, 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, /* 0x40 */
+ 0x9BF0, 0x9C15, 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, /* 0x50 */
+ 0x9C12, 0x9C0A, 0x9C04, 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, /* 0x50 */
+ 0x9C30, 0x9C47, 0x9C32, 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, /* 0x60 */
+ 0x9C76, 0x9C78, 0x9CE7, 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, /* 0x60 */
+ 0x9D03, 0x9D06, 0x9D2A, 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, /* 0x70 */
+ 0x9D15, 0x9D12, 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72, /* 0x20 */
+ 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A, 0x9D9A, 0x9DA4, 0x9DA9, /* 0x20 */
+ 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF, /* 0x30 */
+ 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD, /* 0x30 */
+ 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, 0x9E7D, 0x9E81, 0x9E88, /* 0x40 */
+ 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, 0x9EA5, 0x9EA9, /* 0x40 */
+ 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, 0x9ED0, /* 0x50 */
+ 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 0x9EE5, 0x9EE8, 0x9EEF, /* 0x50 */
+ 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07, /* 0x60 */
+ 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52, /* 0x60 */
+ 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61, 0x9F66, 0x9F67, 0x9F6C, /* 0x70 */
+ 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95, 0x9F9C, 0x9FA0 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0208_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x582F, 0x69C7, 0x9059, 0x7464, 0x51DC, 0x7199 /* 0x20 */
+ /* 0x20 */
+};
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x20 */
+ 0x02D8, /* 0x20 */
+ 0x02C7, 0x00B8, 0x02D9, 0x02DD, 0x00AF, 0x02DB, 0x02DA, 0x007E, /* 0x30 */
+ 0x0384, 0x0385, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x00A1, 0x00A6, 0x00BF, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x00BA, 0x00AA, 0x00A9, 0x00AE, 0x2122, /* 0x60 */
+ 0x00A4, 0x2116 /* 0x70 */
+ /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0386, 0x0388, 0x0389, 0x038A, 0x03AA, 0, 0x038C, /* 0x60 */
+ 0, 0x038E, 0x03AB, 0, 0x038F, 0, 0, 0, /* 0x60 */
+ 0, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03CA, 0x0390, 0x03CC, /* 0x70 */
+ 0x03C2, 0x03CD, 0x03CB, 0x03B0, 0x03CE /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_27[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, /* 0x40 */
+ 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x040E, 0x040F, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, /* 0x70 */
+ 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x045E, 0x045F /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_29[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C6, 0x0110, 0, 0x0126, 0, 0x0132, 0, /* 0x20 */
+ 0x0141, 0x013F, 0, 0x014A, 0x00D8, 0x0152, 0, 0x0166, /* 0x20 */
+ 0x00DE, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138, /* 0x40 */
+ 0x0142, 0x0140, 0x0149, 0x014B, 0x00F8, 0x0153, 0x00DF, 0x0167, /* 0x40 */
+ 0x00FE /* 0x50 */
+ /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_2A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C1, 0x00C0, 0x00C4, 0x00C2, 0x0102, 0x01CD, 0x0100, /* 0x20 */
+ 0x0104, 0x00C5, 0x00C3, 0x0106, 0x0108, 0x010C, 0x00C7, 0x010A, /* 0x20 */
+ 0x010E, 0x00C9, 0x00C8, 0x00CB, 0x00CA, 0x011A, 0x0116, 0x0112, /* 0x30 */
+ 0x0118, 0, 0x011C, 0x011E, 0x0122, 0x0120, 0x0124, 0x00CD, /* 0x30 */
+ 0x00CC, 0x00CF, 0x00CE, 0x01CF, 0x0130, 0x012A, 0x012E, 0x0128, /* 0x40 */
+ 0x0134, 0x0136, 0x0139, 0x013D, 0x013B, 0x0143, 0x0147, 0x0145, /* 0x40 */
+ 0x00D1, 0x00D3, 0x00D2, 0x00D6, 0x00D4, 0x01D1, 0x0150, 0x014C, /* 0x50 */
+ 0x00D5, 0x0154, 0x0158, 0x0156, 0x015A, 0x015C, 0x0160, 0x015E, /* 0x50 */
+ 0x0164, 0x0162, 0x00DA, 0x00D9, 0x00DC, 0x00DB, 0x016C, 0x01D3, /* 0x60 */
+ 0x0170, 0x016A, 0x0172, 0x016E, 0x0168, 0x01D7, 0x01DB, 0x01D9, /* 0x60 */
+ 0x01D5, 0x0174, 0x00DD, 0x0178, 0x0176, 0x0179, 0x017D, 0x017B, /* 0x70 */
+ /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_2B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00E1, 0x00E0, 0x00E4, 0x00E2, 0x0103, 0x01CE, 0x0101, /* 0x20 */
+ 0x0105, 0x00E5, 0x00E3, 0x0107, 0x0109, 0x010D, 0x00E7, 0x010B, /* 0x20 */
+ 0x010F, 0x00E9, 0x00E8, 0x00EB, 0x00EA, 0x011B, 0x0117, 0x0113, /* 0x30 */
+ 0x0119, 0x01F5, 0x011D, 0x011F, 0, 0x0121, 0x0125, 0x00ED, /* 0x30 */
+ 0x00EC, 0x00EF, 0x00EE, 0x01D0, 0, 0x012B, 0x012F, 0x0129, /* 0x40 */
+ 0x0135, 0x0137, 0x013A, 0x013E, 0x013C, 0x0144, 0x0148, 0x0146, /* 0x40 */
+ 0x00F1, 0x00F3, 0x00F2, 0x00F6, 0x00F4, 0x01D2, 0x0151, 0x014D, /* 0x50 */
+ 0x00F5, 0x0155, 0x0159, 0x0157, 0x015B, 0x015D, 0x0161, 0x015F, /* 0x50 */
+ 0x0165, 0x0163, 0x00FA, 0x00F9, 0x00FC, 0x00FB, 0x016D, 0x01D4, /* 0x60 */
+ 0x0171, 0x016B, 0x0173, 0x016F, 0x0169, 0x01D8, 0x01DC, 0x01DA, /* 0x60 */
+ 0x01D6, 0x0175, 0x00FD, 0x00FF, 0x0177, 0x017A, 0x017E, 0x017C /* 0x70 */
+ /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E02, 0x4E04, 0x4E05, 0x4E0C, 0x4E12, 0x4E1F, 0x4E23, /* 0x20 */
+ 0x4E24, 0x4E28, 0x4E2B, 0x4E2E, 0x4E2F, 0x4E30, 0x4E35, 0x4E40, /* 0x20 */
+ 0x4E41, 0x4E44, 0x4E47, 0x4E51, 0x4E5A, 0x4E5C, 0x4E63, 0x4E68, /* 0x30 */
+ 0x4E69, 0x4E74, 0x4E75, 0x4E79, 0x4E7F, 0x4E8D, 0x4E96, 0x4E97, /* 0x30 */
+ 0x4E9D, 0x4EAF, 0x4EB9, 0x4EC3, 0x4ED0, 0x4EDA, 0x4EDB, 0x4EE0, /* 0x40 */
+ 0x4EE1, 0x4EE2, 0x4EE8, 0x4EEF, 0x4EF1, 0x4EF3, 0x4EF5, 0x4EFD, /* 0x40 */
+ 0x4EFE, 0x4EFF, 0x4F00, 0x4F02, 0x4F03, 0x4F08, 0x4F0B, 0x4F0C, /* 0x50 */
+ 0x4F12, 0x4F15, 0x4F16, 0x4F17, 0x4F19, 0x4F2E, 0x4F31, 0x4F60, /* 0x50 */
+ 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F40, 0x4F42, /* 0x60 */
+ 0x4F48, 0x4F49, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F58, /* 0x60 */
+ 0x4F5F, 0x4F63, 0x4F6A, 0x4F6C, 0x4F6E, 0x4F71, 0x4F77, 0x4F78, /* 0x70 */
+ 0x4F79, 0x4F7A, 0x4F7D, 0x4F7E, 0x4F81, 0x4F82, 0x4F84 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_31[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F85, 0x4F89, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, /* 0x20 */
+ 0x4F93, 0x4F94, 0x4F97, 0x4F99, 0x4F9A, 0x4F9E, 0x4F9F, 0x4FB2, /* 0x20 */
+ 0x4FB7, 0x4FB9, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, /* 0x30 */
+ 0x4FC5, 0x4FC6, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FCF, /* 0x30 */
+ 0x4FD2, 0x4FDC, 0x4FE0, 0x4FE2, 0x4FF0, 0x4FF2, 0x4FFC, 0x4FFD, /* 0x40 */
+ 0x4FFF, 0x5000, 0x5001, 0x5004, 0x5007, 0x500A, 0x500C, 0x500E, /* 0x40 */
+ 0x5010, 0x5013, 0x5017, 0x5018, 0x501B, 0x501C, 0x501D, 0x501E, /* 0x50 */
+ 0x5022, 0x5027, 0x502E, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040, /* 0x50 */
+ 0x5041, 0x5042, 0x5045, 0x5046, 0x504A, 0x504C, 0x504E, 0x5051, /* 0x60 */
+ 0x5052, 0x5053, 0x5057, 0x5059, 0x505F, 0x5060, 0x5062, 0x5063, /* 0x60 */
+ 0x5066, 0x5067, 0x506A, 0x506D, 0x5070, 0x5071, 0x503B, 0x5081, /* 0x70 */
+ 0x5083, 0x5084, 0x5086, 0x508A, 0x508E, 0x508F, 0x5090 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5092, 0x5093, 0x5094, 0x5096, 0x509B, 0x509C, 0x509E, /* 0x20 */
+ 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50AA, 0x50AF, 0x50B0, 0x50B9, /* 0x20 */
+ 0x50BA, 0x50BD, 0x50C0, 0x50C3, 0x50C4, 0x50C7, 0x50CC, 0x50CE, /* 0x30 */
+ 0x50D0, 0x50D3, 0x50D4, 0x50D8, 0x50DC, 0x50DD, 0x50DF, 0x50E2, /* 0x30 */
+ 0x50E4, 0x50E6, 0x50E8, 0x50E9, 0x50EF, 0x50F1, 0x50F6, 0x50FA, /* 0x40 */
+ 0x50FE, 0x5103, 0x5106, 0x5107, 0x5108, 0x510B, 0x510C, 0x510D, /* 0x40 */
+ 0x510E, 0x50F2, 0x5110, 0x5117, 0x5119, 0x511B, 0x511C, 0x511D, /* 0x50 */
+ 0x511E, 0x5123, 0x5127, 0x5128, 0x512C, 0x512D, 0x512F, 0x5131, /* 0x50 */
+ 0x5133, 0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514A, 0x514F, /* 0x60 */
+ 0x5153, 0x5155, 0x5157, 0x5158, 0x515F, 0x5164, 0x5166, 0x517E, /* 0x60 */
+ 0x5183, 0x5184, 0x518B, 0x518E, 0x5198, 0x519D, 0x51A1, 0x51A3, /* 0x70 */
+ 0x51AD, 0x51B8, 0x51BA, 0x51BC, 0x51BE, 0x51BF, 0x51C2 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x51C8, 0x51CF, 0x51D1, 0x51D2, 0x51D3, 0x51D5, 0x51D8, /* 0x20 */
+ 0x51DE, 0x51E2, 0x51E5, 0x51EE, 0x51F2, 0x51F3, 0x51F4, 0x51F7, /* 0x20 */
+ 0x5201, 0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218, /* 0x30 */
+ 0x5222, 0x5228, 0x5231, 0x5232, 0x5235, 0x523C, 0x5245, 0x5249, /* 0x30 */
+ 0x5255, 0x5257, 0x5258, 0x525A, 0x525C, 0x525F, 0x5260, 0x5261, /* 0x40 */
+ 0x5266, 0x526E, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285, /* 0x40 */
+ 0x528A, 0x528C, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529A, /* 0x50 */
+ 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AF, 0x52B0, 0x52B6, /* 0x50 */
+ 0x52B7, 0x52B8, 0x52BA, 0x52BB, 0x52BD, 0x52C0, 0x52C4, 0x52C6, /* 0x60 */
+ 0x52C8, 0x52CC, 0x52CF, 0x52D1, 0x52D4, 0x52D6, 0x52DB, 0x52DC, /* 0x60 */
+ 0x52E1, 0x52E5, 0x52E8, 0x52E9, 0x52EA, 0x52EC, 0x52F0, 0x52F1, /* 0x70 */
+ 0x52F4, 0x52F6, 0x52F7, 0x5300, 0x5303, 0x530A, 0x530B /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_34[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x530C, 0x5311, 0x5313, 0x5318, 0x531B, 0x531C, 0x531E, /* 0x20 */
+ 0x531F, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, 0x532C, 0x532D, /* 0x20 */
+ 0x5330, 0x5332, 0x5335, 0x533C, 0x533D, 0x533E, 0x5342, 0x534C, /* 0x30 */
+ 0x534B, 0x5359, 0x535B, 0x5361, 0x5363, 0x5365, 0x536C, 0x536D, /* 0x30 */
+ 0x5372, 0x5379, 0x537E, 0x5383, 0x5387, 0x5388, 0x538E, 0x5393, /* 0x40 */
+ 0x5394, 0x5399, 0x539D, 0x53A1, 0x53A4, 0x53AA, 0x53AB, 0x53AF, /* 0x40 */
+ 0x53B2, 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53BA, 0x53BD, 0x53C0, /* 0x50 */
+ 0x53C5, 0x53CF, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DD, 0x53DE, /* 0x50 */
+ 0x53E0, 0x53E6, 0x53E7, 0x53F5, 0x5402, 0x5413, 0x541A, 0x5421, /* 0x60 */
+ 0x5427, 0x5428, 0x542A, 0x542F, 0x5431, 0x5434, 0x5435, 0x5443, /* 0x60 */
+ 0x5444, 0x5447, 0x544D, 0x544F, 0x545E, 0x5462, 0x5464, 0x5466, /* 0x70 */
+ 0x5467, 0x5469, 0x546B, 0x546D, 0x546E, 0x5474, 0x547F /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_35[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548D, 0x5491, /* 0x20 */
+ 0x5495, 0x5496, 0x549C, 0x549F, 0x54A1, 0x54A6, 0x54A7, 0x54A9, /* 0x20 */
+ 0x54AA, 0x54AD, 0x54AE, 0x54B1, 0x54B7, 0x54B9, 0x54BA, 0x54BB, /* 0x30 */
+ 0x54BF, 0x54C6, 0x54CA, 0x54CD, 0x54CE, 0x54E0, 0x54EA, 0x54EC, /* 0x30 */
+ 0x54EF, 0x54F6, 0x54FC, 0x54FE, 0x54FF, 0x5500, 0x5501, 0x5505, /* 0x40 */
+ 0x5508, 0x5509, 0x550C, 0x550D, 0x550E, 0x5515, 0x552A, 0x552B, /* 0x40 */
+ 0x5532, 0x5535, 0x5536, 0x553B, 0x553C, 0x553D, 0x5541, 0x5547, /* 0x50 */
+ 0x5549, 0x554A, 0x554D, 0x5550, 0x5551, 0x5558, 0x555A, 0x555B, /* 0x50 */
+ 0x555E, 0x5560, 0x5561, 0x5564, 0x5566, 0x557F, 0x5581, 0x5582, /* 0x60 */
+ 0x5586, 0x5588, 0x558E, 0x558F, 0x5591, 0x5592, 0x5593, 0x5594, /* 0x60 */
+ 0x5597, 0x55A3, 0x55A4, 0x55AD, 0x55B2, 0x55BF, 0x55C1, 0x55C3, /* 0x70 */
+ 0x55C6, 0x55C9, 0x55CB, 0x55CC, 0x55CE, 0x55D1, 0x55D2 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_36[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x55D3, 0x55D7, 0x55D8, 0x55DB, 0x55DE, 0x55E2, 0x55E9, /* 0x20 */
+ 0x55F6, 0x55FF, 0x5605, 0x5608, 0x560A, 0x560D, 0x560E, 0x560F, /* 0x20 */
+ 0x5610, 0x5611, 0x5612, 0x5619, 0x562C, 0x5630, 0x5633, 0x5635, /* 0x30 */
+ 0x5637, 0x5639, 0x563B, 0x563C, 0x563D, 0x563F, 0x5640, 0x5641, /* 0x30 */
+ 0x5643, 0x5644, 0x5646, 0x5649, 0x564B, 0x564D, 0x564F, 0x5654, /* 0x40 */
+ 0x565E, 0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566D, /* 0x40 */
+ 0x566F, 0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568B, /* 0x50 */
+ 0x568C, 0x5695, 0x5699, 0x569A, 0x569D, 0x569E, 0x569F, 0x56A6, /* 0x50 */
+ 0x56A7, 0x56A8, 0x56A9, 0x56AB, 0x56AC, 0x56AD, 0x56B1, 0x56B3, /* 0x60 */
+ 0x56B7, 0x56BE, 0x56C5, 0x56C9, 0x56CA, 0x56CB, 0x56CF, 0x56D0, /* 0x60 */
+ 0x56CC, 0x56CD, 0x56D9, 0x56DC, 0x56DD, 0x56DF, 0x56E1, 0x56E4, /* 0x70 */
+ 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56F1, 0x56EB, 0x56ED /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_37[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x56F6, 0x56F7, 0x5701, 0x5702, 0x5707, 0x570A, 0x570C, /* 0x20 */
+ 0x5711, 0x5715, 0x571A, 0x571B, 0x571D, 0x5720, 0x5722, 0x5723, /* 0x20 */
+ 0x5724, 0x5725, 0x5729, 0x572A, 0x572C, 0x572E, 0x572F, 0x5733, /* 0x30 */
+ 0x5734, 0x573D, 0x573E, 0x573F, 0x5745, 0x5746, 0x574C, 0x574D, /* 0x30 */
+ 0x5752, 0x5762, 0x5765, 0x5767, 0x5768, 0x576B, 0x576D, 0x576E, /* 0x40 */
+ 0x576F, 0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779, /* 0x40 */
+ 0x577A, 0x577B, 0x577C, 0x577E, 0x5781, 0x5783, 0x578C, 0x5794, /* 0x50 */
+ 0x5797, 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A1, /* 0x50 */
+ 0x5795, 0x57A7, 0x57A8, 0x57A9, 0x57AC, 0x57B8, 0x57BD, 0x57C7, /* 0x60 */
+ 0x57C8, 0x57CC, 0x57CF, 0x57D5, 0x57DD, 0x57DE, 0x57E4, 0x57E6, /* 0x60 */
+ 0x57E7, 0x57E9, 0x57ED, 0x57F0, 0x57F5, 0x57F6, 0x57F8, 0x57FD, /* 0x70 */
+ 0x57FE, 0x57FF, 0x5803, 0x5804, 0x5808, 0x5809, 0x57E1 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_38[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x580C, 0x580D, 0x581B, 0x581E, 0x581F, 0x5820, 0x5826, /* 0x20 */
+ 0x5827, 0x582D, 0x5832, 0x5839, 0x583F, 0x5849, 0x584C, 0x584D, /* 0x20 */
+ 0x584F, 0x5850, 0x5855, 0x585F, 0x5861, 0x5864, 0x5867, 0x5868, /* 0x30 */
+ 0x5878, 0x587C, 0x587F, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889, /* 0x30 */
+ 0x588A, 0x588C, 0x588D, 0x588F, 0x5890, 0x5894, 0x5896, 0x589D, /* 0x40 */
+ 0x58A0, 0x58A1, 0x58A2, 0x58A6, 0x58A9, 0x58B1, 0x58B2, 0x58C4, /* 0x40 */
+ 0x58BC, 0x58C2, 0x58C8, 0x58CD, 0x58CE, 0x58D0, 0x58D2, 0x58D4, /* 0x50 */
+ 0x58D6, 0x58DA, 0x58DD, 0x58E1, 0x58E2, 0x58E9, 0x58F3, 0x5905, /* 0x50 */
+ 0x5906, 0x590B, 0x590C, 0x5912, 0x5913, 0x5914, 0x8641, 0x591D, /* 0x60 */
+ 0x5921, 0x5923, 0x5924, 0x5928, 0x592F, 0x5930, 0x5933, 0x5935, /* 0x60 */
+ 0x5936, 0x593F, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595B, /* 0x70 */
+ 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x596B, 0x596D /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_39[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x596F, 0x5972, 0x5975, 0x5976, 0x5979, 0x597B, 0x597C, /* 0x20 */
+ 0x598B, 0x598C, 0x598E, 0x5992, 0x5995, 0x5997, 0x599F, 0x59A4, /* 0x20 */
+ 0x59A7, 0x59AD, 0x59AE, 0x59AF, 0x59B0, 0x59B3, 0x59B7, 0x59BA, /* 0x30 */
+ 0x59BC, 0x59C1, 0x59C3, 0x59C4, 0x59C8, 0x59CA, 0x59CD, 0x59D2, /* 0x30 */
+ 0x59DD, 0x59DE, 0x59DF, 0x59E3, 0x59E4, 0x59E7, 0x59EE, 0x59EF, /* 0x40 */
+ 0x59F1, 0x59F2, 0x59F4, 0x59F7, 0x5A00, 0x5A04, 0x5A0C, 0x5A0D, /* 0x40 */
+ 0x5A0E, 0x5A12, 0x5A13, 0x5A1E, 0x5A23, 0x5A24, 0x5A27, 0x5A28, /* 0x50 */
+ 0x5A2A, 0x5A2D, 0x5A30, 0x5A44, 0x5A45, 0x5A47, 0x5A48, 0x5A4C, /* 0x50 */
+ 0x5A50, 0x5A55, 0x5A5E, 0x5A63, 0x5A65, 0x5A67, 0x5A6D, 0x5A77, /* 0x60 */
+ 0x5A7A, 0x5A7B, 0x5A7E, 0x5A8B, 0x5A90, 0x5A93, 0x5A96, 0x5A99, /* 0x60 */
+ 0x5A9C, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA2, 0x5AA7, 0x5AAC, 0x5AB1, /* 0x70 */
+ 0x5AB2, 0x5AB3, 0x5AB5, 0x5AB8, 0x5ABA, 0x5ABB, 0x5ABF /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_3A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5AC4, 0x5AC6, 0x5AC8, 0x5ACF, 0x5ADA, 0x5ADC, 0x5AE0, /* 0x20 */
+ 0x5AE5, 0x5AEA, 0x5AEE, 0x5AF5, 0x5AF6, 0x5AFD, 0x5B00, 0x5B01, /* 0x20 */
+ 0x5B08, 0x5B17, 0x5B34, 0x5B19, 0x5B1B, 0x5B1D, 0x5B21, 0x5B25, /* 0x30 */
+ 0x5B2D, 0x5B38, 0x5B41, 0x5B4B, 0x5B4C, 0x5B52, 0x5B56, 0x5B5E, /* 0x30 */
+ 0x5B68, 0x5B6E, 0x5B6F, 0x5B7C, 0x5B7D, 0x5B7E, 0x5B7F, 0x5B81, /* 0x40 */
+ 0x5B84, 0x5B86, 0x5B8A, 0x5B8E, 0x5B90, 0x5B91, 0x5B93, 0x5B94, /* 0x40 */
+ 0x5B96, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAF, 0x5BB1, 0x5BB2, /* 0x50 */
+ 0x5BB7, 0x5BBA, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BCD, 0x5BCF, 0x5BD6, /* 0x50 */
+ 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BE0, 0x5BEF, 0x5BF1, 0x5BF4, /* 0x60 */
+ 0x5BFD, 0x5C0C, 0x5C17, 0x5C1E, 0x5C1F, 0x5C23, 0x5C26, 0x5C29, /* 0x60 */
+ 0x5C2B, 0x5C2C, 0x5C2E, 0x5C30, 0x5C32, 0x5C35, 0x5C36, 0x5C59, /* 0x70 */
+ 0x5C5A, 0x5C5C, 0x5C62, 0x5C63, 0x5C67, 0x5C68, 0x5C69 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_3B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5C6D, 0x5C70, 0x5C74, 0x5C75, 0x5C7A, 0x5C7B, 0x5C7C, /* 0x20 */
+ 0x5C7D, 0x5C87, 0x5C88, 0x5C8A, 0x5C8F, 0x5C92, 0x5C9D, 0x5C9F, /* 0x20 */
+ 0x5CA0, 0x5CA2, 0x5CA3, 0x5CA6, 0x5CAA, 0x5CB2, 0x5CB4, 0x5CB5, /* 0x30 */
+ 0x5CBA, 0x5CC9, 0x5CCB, 0x5CD2, 0x5CDD, 0x5CD7, 0x5CEE, 0x5CF1, /* 0x30 */
+ 0x5CF2, 0x5CF4, 0x5D01, 0x5D06, 0x5D0D, 0x5D12, 0x5D2B, 0x5D23, /* 0x40 */
+ 0x5D24, 0x5D26, 0x5D27, 0x5D31, 0x5D34, 0x5D39, 0x5D3D, 0x5D3F, /* 0x40 */
+ 0x5D42, 0x5D43, 0x5D46, 0x5D48, 0x5D55, 0x5D51, 0x5D59, 0x5D4A, /* 0x50 */
+ 0x5D5F, 0x5D60, 0x5D61, 0x5D62, 0x5D64, 0x5D6A, 0x5D6D, 0x5D70, /* 0x50 */
+ 0x5D79, 0x5D7A, 0x5D7E, 0x5D7F, 0x5D81, 0x5D83, 0x5D88, 0x5D8A, /* 0x60 */
+ 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D99, 0x5D9B, 0x5D9F, 0x5DA0, /* 0x60 */
+ 0x5DA7, 0x5DAB, 0x5DB0, 0x5DB4, 0x5DB8, 0x5DB9, 0x5DC3, 0x5DC7, /* 0x70 */
+ 0x5DCB, 0x5DD0, 0x5DCE, 0x5DD8, 0x5DD9, 0x5DE0, 0x5DE4 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_3C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5DE9, 0x5DF8, 0x5DF9, 0x5E00, 0x5E07, 0x5E0D, 0x5E12, /* 0x20 */
+ 0x5E14, 0x5E15, 0x5E18, 0x5E1F, 0x5E20, 0x5E2E, 0x5E28, 0x5E32, /* 0x20 */
+ 0x5E35, 0x5E3E, 0x5E4B, 0x5E50, 0x5E49, 0x5E51, 0x5E56, 0x5E58, /* 0x30 */
+ 0x5E5B, 0x5E5C, 0x5E5E, 0x5E68, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, /* 0x30 */
+ 0x5E6E, 0x5E70, 0x5E80, 0x5E8B, 0x5E8E, 0x5EA2, 0x5EA4, 0x5EA5, /* 0x40 */
+ 0x5EA8, 0x5EAA, 0x5EAC, 0x5EB1, 0x5EB3, 0x5EBD, 0x5EBE, 0x5EBF, /* 0x40 */
+ 0x5EC6, 0x5ECC, 0x5ECB, 0x5ECE, 0x5ED1, 0x5ED2, 0x5ED4, 0x5ED5, /* 0x50 */
+ 0x5EDC, 0x5EDE, 0x5EE5, 0x5EEB, 0x5F02, 0x5F06, 0x5F07, 0x5F08, /* 0x50 */
+ 0x5F0E, 0x5F19, 0x5F1C, 0x5F1D, 0x5F21, 0x5F22, 0x5F23, 0x5F24, /* 0x60 */
+ 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F34, 0x5F36, 0x5F3B, /* 0x60 */
+ 0x5F3D, 0x5F3F, 0x5F40, 0x5F44, 0x5F45, 0x5F47, 0x5F4D, 0x5F50, /* 0x70 */
+ 0x5F54, 0x5F58, 0x5F5B, 0x5F60, 0x5F63, 0x5F64, 0x5F67 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_3D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F78, 0x5F7A, 0x5F7D, /* 0x20 */
+ 0x5F7E, 0x5F89, 0x5F8D, 0x5F8F, 0x5F96, 0x5F9C, 0x5F9D, 0x5FA2, /* 0x20 */
+ 0x5FA7, 0x5FAB, 0x5FA4, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB8, /* 0x30 */
+ 0x5FC4, 0x5FC7, 0x5FC8, 0x5FC9, 0x5FCB, 0x5FD0, 0x5FD1, 0x5FD2, /* 0x30 */
+ 0x5FD3, 0x5FD4, 0x5FDE, 0x5FE1, 0x5FE2, 0x5FE8, 0x5FE9, 0x5FEA, /* 0x40 */
+ 0x5FEC, 0x5FED, 0x5FEE, 0x5FEF, 0x5FF2, 0x5FF3, 0x5FF6, 0x5FFA, /* 0x40 */
+ 0x5FFC, 0x6007, 0x600A, 0x600D, 0x6013, 0x6014, 0x6017, 0x6018, /* 0x50 */
+ 0x601A, 0x601F, 0x6024, 0x602D, 0x6033, 0x6035, 0x6040, 0x6047, /* 0x50 */
+ 0x6048, 0x6049, 0x604C, 0x6051, 0x6054, 0x6056, 0x6057, 0x605D, /* 0x60 */
+ 0x6061, 0x6067, 0x6071, 0x607E, 0x607F, 0x6082, 0x6086, 0x6088, /* 0x60 */
+ 0x608A, 0x608E, 0x6091, 0x6093, 0x6095, 0x6098, 0x609D, 0x609E, /* 0x70 */
+ 0x60A2, 0x60A4, 0x60A5, 0x60A8, 0x60B0, 0x60B1, 0x60B7 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_3E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x60BB, 0x60BE, 0x60C2, 0x60C4, 0x60C8, 0x60C9, 0x60CA, /* 0x20 */
+ 0x60CB, 0x60CE, 0x60CF, 0x60D4, 0x60D5, 0x60D9, 0x60DB, 0x60DD, /* 0x20 */
+ 0x60DE, 0x60E2, 0x60E5, 0x60F2, 0x60F5, 0x60F8, 0x60FC, 0x60FD, /* 0x30 */
+ 0x6102, 0x6107, 0x610A, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, /* 0x30 */
+ 0x6114, 0x6116, 0x6117, 0x6119, 0x611C, 0x611E, 0x6122, 0x612A, /* 0x40 */
+ 0x612B, 0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141, /* 0x40 */
+ 0x6145, 0x6146, 0x6149, 0x615E, 0x6160, 0x616C, 0x6172, 0x6178, /* 0x50 */
+ 0x617B, 0x617C, 0x617F, 0x6180, 0x6181, 0x6183, 0x6184, 0x618B, /* 0x50 */
+ 0x618D, 0x6192, 0x6193, 0x6197, 0x6198, 0x619C, 0x619D, 0x619F, /* 0x60 */
+ 0x61A0, 0x61A5, 0x61A8, 0x61AA, 0x61AD, 0x61B8, 0x61B9, 0x61BC, /* 0x60 */
+ 0x61C0, 0x61C1, 0x61C2, 0x61CE, 0x61CF, 0x61D5, 0x61DC, 0x61DD, /* 0x70 */
+ 0x61DE, 0x61DF, 0x61E1, 0x61E2, 0x61E7, 0x61E9, 0x61E5 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_3F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x61EC, 0x61ED, 0x61EF, 0x6201, 0x6203, 0x6204, 0x6207, /* 0x20 */
+ 0x6213, 0x6215, 0x621C, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229, /* 0x20 */
+ 0x622B, 0x6239, 0x623D, 0x6242, 0x6243, 0x6244, 0x6246, 0x624C, /* 0x30 */
+ 0x6250, 0x6251, 0x6252, 0x6254, 0x6256, 0x625A, 0x625C, 0x6264, /* 0x30 */
+ 0x626D, 0x626F, 0x6273, 0x627A, 0x627D, 0x628D, 0x628E, 0x628F, /* 0x40 */
+ 0x6290, 0x62A6, 0x62A8, 0x62B3, 0x62B6, 0x62B7, 0x62BA, 0x62BE, /* 0x40 */
+ 0x62BF, 0x62C4, 0x62CE, 0x62D5, 0x62D6, 0x62DA, 0x62EA, 0x62F2, /* 0x50 */
+ 0x62F4, 0x62FC, 0x62FD, 0x6303, 0x6304, 0x630A, 0x630B, 0x630D, /* 0x50 */
+ 0x6310, 0x6313, 0x6316, 0x6318, 0x6329, 0x632A, 0x632D, 0x6335, /* 0x60 */
+ 0x6336, 0x6339, 0x633C, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346, /* 0x60 */
+ 0x634A, 0x634B, 0x634E, 0x6352, 0x6353, 0x6354, 0x6358, 0x635B, /* 0x70 */
+ 0x6365, 0x6366, 0x636C, 0x636D, 0x6371, 0x6374, 0x6375 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_40[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6378, 0x637C, 0x637D, 0x637F, 0x6382, 0x6384, 0x6387, /* 0x20 */
+ 0x638A, 0x6390, 0x6394, 0x6395, 0x6399, 0x639A, 0x639E, 0x63A4, /* 0x20 */
+ 0x63A6, 0x63AD, 0x63AE, 0x63AF, 0x63BD, 0x63C1, 0x63C5, 0x63C8, /* 0x30 */
+ 0x63CE, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63DC, 0x63E0, 0x63E5, /* 0x30 */
+ 0x63EA, 0x63EC, 0x63F2, 0x63F3, 0x63F5, 0x63F8, 0x63F9, 0x6409, /* 0x40 */
+ 0x640A, 0x6410, 0x6412, 0x6414, 0x6418, 0x641E, 0x6420, 0x6422, /* 0x40 */
+ 0x6424, 0x6425, 0x6429, 0x642A, 0x642F, 0x6430, 0x6435, 0x643D, /* 0x50 */
+ 0x643F, 0x644B, 0x644F, 0x6451, 0x6452, 0x6453, 0x6454, 0x645A, /* 0x50 */
+ 0x645B, 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6463, 0x646D, /* 0x60 */
+ 0x6473, 0x6474, 0x647B, 0x647D, 0x6485, 0x6487, 0x648F, 0x6490, /* 0x60 */
+ 0x6491, 0x6498, 0x6499, 0x649B, 0x649D, 0x649F, 0x64A1, 0x64A3, /* 0x70 */
+ 0x64A6, 0x64A8, 0x64AC, 0x64B3, 0x64BD, 0x64BE, 0x64BF /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_41[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x64C4, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CE, 0x64D0, /* 0x20 */
+ 0x64D1, 0x64D5, 0x64D7, 0x64E4, 0x64E5, 0x64E9, 0x64EA, 0x64ED, /* 0x20 */
+ 0x64F0, 0x64F5, 0x64F7, 0x64FB, 0x64FF, 0x6501, 0x6504, 0x6508, /* 0x30 */
+ 0x6509, 0x650A, 0x650F, 0x6513, 0x6514, 0x6516, 0x6519, 0x651B, /* 0x30 */
+ 0x651E, 0x651F, 0x6522, 0x6526, 0x6529, 0x652E, 0x6531, 0x653A, /* 0x40 */
+ 0x653C, 0x653D, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554, /* 0x40 */
+ 0x655F, 0x6560, 0x6567, 0x656B, 0x657A, 0x657D, 0x6581, 0x6585, /* 0x50 */
+ 0x658A, 0x6592, 0x6595, 0x6598, 0x659D, 0x65A0, 0x65A3, 0x65A6, /* 0x50 */
+ 0x65AE, 0x65B2, 0x65B3, 0x65B4, 0x65BF, 0x65C2, 0x65C8, 0x65C9, /* 0x60 */
+ 0x65CE, 0x65D0, 0x65D4, 0x65D6, 0x65D8, 0x65DF, 0x65F0, 0x65F2, /* 0x60 */
+ 0x65F4, 0x65F5, 0x65F9, 0x65FE, 0x65FF, 0x6600, 0x6604, 0x6608, /* 0x70 */
+ 0x6609, 0x660D, 0x6611, 0x6612, 0x6615, 0x6616, 0x661D /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_42[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x661E, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, /* 0x20 */
+ 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, 0x6631, 0x6633, 0x6639, /* 0x20 */
+ 0x6637, 0x6640, 0x6645, 0x6646, 0x664A, 0x664C, 0x6651, 0x664E, /* 0x30 */
+ 0x6657, 0x6658, 0x6659, 0x665B, 0x665C, 0x6660, 0x6661, 0x66FB, /* 0x30 */
+ 0x666A, 0x666B, 0x666C, 0x667E, 0x6673, 0x6675, 0x667F, 0x6677, /* 0x40 */
+ 0x6678, 0x6679, 0x667B, 0x6680, 0x667C, 0x668B, 0x668C, 0x668D, /* 0x40 */
+ 0x6690, 0x6692, 0x6699, 0x669A, 0x669B, 0x669C, 0x669F, 0x66A0, /* 0x50 */
+ 0x66A4, 0x66AD, 0x66B1, 0x66B2, 0x66B5, 0x66BB, 0x66BF, 0x66C0, /* 0x50 */
+ 0x66C2, 0x66C3, 0x66C8, 0x66CC, 0x66CE, 0x66CF, 0x66D4, 0x66DB, /* 0x60 */
+ 0x66DF, 0x66E8, 0x66EB, 0x66EC, 0x66EE, 0x66FA, 0x6705, 0x6707, /* 0x60 */
+ 0x670E, 0x6713, 0x6719, 0x671C, 0x6720, 0x6722, 0x6733, 0x673E, /* 0x70 */
+ 0x6745, 0x6747, 0x6748, 0x674C, 0x6754, 0x6755, 0x675D /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_43[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6766, 0x676C, 0x676E, 0x6774, 0x6776, 0x677B, 0x6781, /* 0x20 */
+ 0x6784, 0x678E, 0x678F, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799, /* 0x20 */
+ 0x679B, 0x67B0, 0x67B1, 0x67B2, 0x67B5, 0x67BB, 0x67BC, 0x67BD, /* 0x30 */
+ 0x67F9, 0x67C0, 0x67C2, 0x67C3, 0x67C5, 0x67C8, 0x67C9, 0x67D2, /* 0x30 */
+ 0x67D7, 0x67D9, 0x67DC, 0x67E1, 0x67E6, 0x67F0, 0x67F2, 0x67F6, /* 0x40 */
+ 0x67F7, 0x6852, 0x6814, 0x6819, 0x681D, 0x681F, 0x6828, 0x6827, /* 0x40 */
+ 0x682C, 0x682D, 0x682F, 0x6830, 0x6831, 0x6833, 0x683B, 0x683F, /* 0x50 */
+ 0x6844, 0x6845, 0x684A, 0x684C, 0x6855, 0x6857, 0x6858, 0x685B, /* 0x50 */
+ 0x686B, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879, /* 0x60 */
+ 0x687A, 0x687B, 0x687C, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896, /* 0x60 */
+ 0x6898, 0x689A, 0x689C, 0x68A1, 0x68A3, 0x68A5, 0x68A9, 0x68AA, /* 0x70 */
+ 0x68AE, 0x68B2, 0x68BB, 0x68C5, 0x68C8, 0x68CC, 0x68CF /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_44[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x68D0, 0x68D1, 0x68D3, 0x68D6, 0x68D9, 0x68DC, 0x68DD, /* 0x20 */
+ 0x68E5, 0x68E8, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68F0, 0x68F1, /* 0x20 */
+ 0x68F5, 0x68F6, 0x68FB, 0x68FC, 0x68FD, 0x6906, 0x6909, 0x690A, /* 0x30 */
+ 0x6910, 0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935, /* 0x30 */
+ 0x6938, 0x693B, 0x6942, 0x6945, 0x6949, 0x694E, 0x6957, 0x695B, /* 0x40 */
+ 0x6963, 0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696C, 0x6970, /* 0x40 */
+ 0x6971, 0x6972, 0x697A, 0x697B, 0x697F, 0x6980, 0x698D, 0x6992, /* 0x50 */
+ 0x6996, 0x6998, 0x69A1, 0x69A5, 0x69A6, 0x69A8, 0x69AB, 0x69AD, /* 0x50 */
+ 0x69AF, 0x69B7, 0x69B8, 0x69BA, 0x69BC, 0x69C5, 0x69C8, 0x69D1, /* 0x60 */
+ 0x69D6, 0x69D7, 0x69E2, 0x69E5, 0x69EE, 0x69EF, 0x69F1, 0x69F3, /* 0x60 */
+ 0x69F5, 0x69FE, 0x6A00, 0x6A01, 0x6A03, 0x6A0F, 0x6A11, 0x6A15, /* 0x70 */
+ 0x6A1A, 0x6A1D, 0x6A20, 0x6A24, 0x6A28, 0x6A30, 0x6A32 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_45[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A34, 0x6A37, 0x6A3B, 0x6A3E, 0x6A3F, 0x6A45, 0x6A46, /* 0x20 */
+ 0x6A49, 0x6A4A, 0x6A4E, 0x6A50, 0x6A51, 0x6A52, 0x6A55, 0x6A56, /* 0x20 */
+ 0x6A5B, 0x6A64, 0x6A67, 0x6A6A, 0x6A71, 0x6A73, 0x6A7E, 0x6A81, /* 0x30 */
+ 0x6A83, 0x6A86, 0x6A87, 0x6A89, 0x6A8B, 0x6A91, 0x6A9B, 0x6A9D, /* 0x30 */
+ 0x6A9E, 0x6A9F, 0x6AA5, 0x6AAB, 0x6AAF, 0x6AB0, 0x6AB1, 0x6AB4, /* 0x40 */
+ 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC6, 0x6AC9, 0x6AC8, 0x6ACC, 0x6AD0, /* 0x40 */
+ 0x6AD4, 0x6AD5, 0x6AD6, 0x6ADC, 0x6ADD, 0x6AE4, 0x6AE7, 0x6AEC, /* 0x50 */
+ 0x6AF0, 0x6AF1, 0x6AF2, 0x6AFC, 0x6AFD, 0x6B02, 0x6B03, 0x6B06, /* 0x50 */
+ 0x6B07, 0x6B09, 0x6B0F, 0x6B10, 0x6B11, 0x6B17, 0x6B1B, 0x6B1E, /* 0x60 */
+ 0x6B24, 0x6B28, 0x6B2B, 0x6B2C, 0x6B2F, 0x6B35, 0x6B36, 0x6B3B, /* 0x60 */
+ 0x6B3F, 0x6B46, 0x6B4A, 0x6B4D, 0x6B52, 0x6B56, 0x6B58, 0x6B5D, /* 0x70 */
+ 0x6B60, 0x6B67, 0x6B6B, 0x6B6E, 0x6B70, 0x6B75, 0x6B7D /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_46[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6B7E, 0x6B82, 0x6B85, 0x6B97, 0x6B9B, 0x6B9F, 0x6BA0, /* 0x20 */
+ 0x6BA2, 0x6BA3, 0x6BA8, 0x6BA9, 0x6BAC, 0x6BAD, 0x6BAE, 0x6BB0, /* 0x20 */
+ 0x6BB8, 0x6BB9, 0x6BBD, 0x6BBE, 0x6BC3, 0x6BC4, 0x6BC9, 0x6BCC, /* 0x30 */
+ 0x6BD6, 0x6BDA, 0x6BE1, 0x6BE3, 0x6BE6, 0x6BE7, 0x6BEE, 0x6BF1, /* 0x30 */
+ 0x6BF7, 0x6BF9, 0x6BFF, 0x6C02, 0x6C04, 0x6C05, 0x6C09, 0x6C0D, /* 0x40 */
+ 0x6C0E, 0x6C10, 0x6C12, 0x6C19, 0x6C1F, 0x6C26, 0x6C27, 0x6C28, /* 0x40 */
+ 0x6C2C, 0x6C2E, 0x6C33, 0x6C35, 0x6C36, 0x6C3A, 0x6C3B, 0x6C3F, /* 0x50 */
+ 0x6C4A, 0x6C4B, 0x6C4D, 0x6C4F, 0x6C52, 0x6C54, 0x6C59, 0x6C5B, /* 0x50 */
+ 0x6C5C, 0x6C6B, 0x6C6D, 0x6C6F, 0x6C74, 0x6C76, 0x6C78, 0x6C79, /* 0x60 */
+ 0x6C7B, 0x6C85, 0x6C86, 0x6C87, 0x6C89, 0x6C94, 0x6C95, 0x6C97, /* 0x60 */
+ 0x6C98, 0x6C9C, 0x6C9F, 0x6CB0, 0x6CB2, 0x6CB4, 0x6CC2, 0x6CC6, /* 0x70 */
+ 0x6CCD, 0x6CCF, 0x6CD0, 0x6CD1, 0x6CD2, 0x6CD4, 0x6CD6 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_47[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6CDA, 0x6CDC, 0x6CE0, 0x6CE7, 0x6CE9, 0x6CEB, 0x6CEC, /* 0x20 */
+ 0x6CEE, 0x6CF2, 0x6CF4, 0x6D04, 0x6D07, 0x6D0A, 0x6D0E, 0x6D0F, /* 0x20 */
+ 0x6D11, 0x6D13, 0x6D1A, 0x6D26, 0x6D27, 0x6D28, 0x6C67, 0x6D2E, /* 0x30 */
+ 0x6D2F, 0x6D31, 0x6D39, 0x6D3C, 0x6D3F, 0x6D57, 0x6D5E, 0x6D5F, /* 0x30 */
+ 0x6D61, 0x6D65, 0x6D67, 0x6D6F, 0x6D70, 0x6D7C, 0x6D82, 0x6D87, /* 0x40 */
+ 0x6D91, 0x6D92, 0x6D94, 0x6D96, 0x6D97, 0x6D98, 0x6DAA, 0x6DAC, /* 0x40 */
+ 0x6DB4, 0x6DB7, 0x6DB9, 0x6DBD, 0x6DBF, 0x6DC4, 0x6DC8, 0x6DCA, /* 0x50 */
+ 0x6DCE, 0x6DCF, 0x6DD6, 0x6DDB, 0x6DDD, 0x6DDF, 0x6DE0, 0x6DE2, /* 0x50 */
+ 0x6DE5, 0x6DE9, 0x6DEF, 0x6DF0, 0x6DF4, 0x6DF6, 0x6DFC, 0x6E00, /* 0x60 */
+ 0x6E04, 0x6E1E, 0x6E22, 0x6E27, 0x6E32, 0x6E36, 0x6E39, 0x6E3B, /* 0x60 */
+ 0x6E3C, 0x6E44, 0x6E45, 0x6E48, 0x6E49, 0x6E4B, 0x6E4F, 0x6E51, /* 0x70 */
+ 0x6E52, 0x6E53, 0x6E54, 0x6E57, 0x6E5C, 0x6E5D, 0x6E5E /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_48[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6E62, 0x6E63, 0x6E68, 0x6E73, 0x6E7B, 0x6E7D, 0x6E8D, /* 0x20 */
+ 0x6E93, 0x6E99, 0x6EA0, 0x6EA7, 0x6EAD, 0x6EAE, 0x6EB1, 0x6EB3, /* 0x20 */
+ 0x6EBB, 0x6EBF, 0x6EC0, 0x6EC1, 0x6EC3, 0x6EC7, 0x6EC8, 0x6ECA, /* 0x30 */
+ 0x6ECD, 0x6ECE, 0x6ECF, 0x6EEB, 0x6EED, 0x6EEE, 0x6EF9, 0x6EFB, /* 0x30 */
+ 0x6EFD, 0x6F04, 0x6F08, 0x6F0A, 0x6F0C, 0x6F0D, 0x6F16, 0x6F18, /* 0x40 */
+ 0x6F1A, 0x6F1B, 0x6F26, 0x6F29, 0x6F2A, 0x6F2F, 0x6F30, 0x6F33, /* 0x40 */
+ 0x6F36, 0x6F3B, 0x6F3C, 0x6F2D, 0x6F4F, 0x6F51, 0x6F52, 0x6F53, /* 0x50 */
+ 0x6F57, 0x6F59, 0x6F5A, 0x6F5D, 0x6F5E, 0x6F61, 0x6F62, 0x6F68, /* 0x50 */
+ 0x6F6C, 0x6F7D, 0x6F7E, 0x6F83, 0x6F87, 0x6F88, 0x6F8B, 0x6F8C, /* 0x60 */
+ 0x6F8D, 0x6F90, 0x6F92, 0x6F93, 0x6F94, 0x6F96, 0x6F9A, 0x6F9F, /* 0x60 */
+ 0x6FA0, 0x6FA5, 0x6FA6, 0x6FA7, 0x6FA8, 0x6FAE, 0x6FAF, 0x6FB0, /* 0x70 */
+ 0x6FB5, 0x6FB6, 0x6FBC, 0x6FC5, 0x6FC7, 0x6FC8, 0x6FCA /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_49[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6FDA, 0x6FDE, 0x6FE8, 0x6FE9, 0x6FF0, 0x6FF5, 0x6FF9, /* 0x20 */
+ 0x6FFC, 0x6FFD, 0x7000, 0x7005, 0x7006, 0x7007, 0x700D, 0x7017, /* 0x20 */
+ 0x7020, 0x7023, 0x702F, 0x7034, 0x7037, 0x7039, 0x703C, 0x7043, /* 0x30 */
+ 0x7044, 0x7048, 0x7049, 0x704A, 0x704B, 0x7054, 0x7055, 0x705D, /* 0x30 */
+ 0x705E, 0x704E, 0x7064, 0x7065, 0x706C, 0x706E, 0x7075, 0x7076, /* 0x40 */
+ 0x707E, 0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097, /* 0x40 */
+ 0x7098, 0x709B, 0x70A4, 0x70AB, 0x70B0, 0x70B1, 0x70B4, 0x70B7, /* 0x50 */
+ 0x70CA, 0x70D1, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D8, 0x70DC, /* 0x50 */
+ 0x70E4, 0x70FA, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710B, /* 0x60 */
+ 0x710C, 0x710F, 0x711E, 0x7120, 0x712B, 0x712D, 0x712F, 0x7130, /* 0x60 */
+ 0x7131, 0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714A, 0x714B, /* 0x70 */
+ 0x7150, 0x7152, 0x7157, 0x715A, 0x715C, 0x715E, 0x7160 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_4A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718C, 0x7192, /* 0x20 */
+ 0x719A, 0x719B, 0x71A0, 0x71A2, 0x71AF, 0x71B0, 0x71B2, 0x71B3, /* 0x20 */
+ 0x71BA, 0x71BF, 0x71C0, 0x71C1, 0x71C4, 0x71CB, 0x71CC, 0x71D3, /* 0x30 */
+ 0x71D6, 0x71D9, 0x71DA, 0x71DC, 0x71F8, 0x71FE, 0x7200, 0x7207, /* 0x30 */
+ 0x7208, 0x7209, 0x7213, 0x7217, 0x721A, 0x721D, 0x721F, 0x7224, /* 0x40 */
+ 0x722B, 0x722F, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243, /* 0x40 */
+ 0x7245, 0x724E, 0x724F, 0x7250, 0x7253, 0x7255, 0x7256, 0x725A, /* 0x50 */
+ 0x725C, 0x725E, 0x7260, 0x7263, 0x7268, 0x726B, 0x726E, 0x726F, /* 0x50 */
+ 0x7271, 0x7277, 0x7278, 0x727B, 0x727C, 0x727F, 0x7284, 0x7289, /* 0x60 */
+ 0x728D, 0x728E, 0x7293, 0x729B, 0x72A8, 0x72AD, 0x72AE, 0x72B1, /* 0x60 */
+ 0x72B4, 0x72BE, 0x72C1, 0x72C7, 0x72C9, 0x72CC, 0x72D5, 0x72D6, /* 0x70 */
+ 0x72D8, 0x72DF, 0x72E5, 0x72F3, 0x72F4, 0x72FA, 0x72FB /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_4B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x72FE, 0x7302, 0x7304, 0x7305, 0x7307, 0x730B, 0x730D, /* 0x20 */
+ 0x7312, 0x7313, 0x7318, 0x7319, 0x731E, 0x7322, 0x7324, 0x7327, /* 0x20 */
+ 0x7328, 0x732C, 0x7331, 0x7332, 0x7335, 0x733A, 0x733B, 0x733D, /* 0x30 */
+ 0x7343, 0x734D, 0x7350, 0x7352, 0x7356, 0x7358, 0x735D, 0x735E, /* 0x30 */
+ 0x735F, 0x7360, 0x7366, 0x7367, 0x7369, 0x736B, 0x736C, 0x736E, /* 0x40 */
+ 0x736F, 0x7371, 0x7377, 0x7379, 0x737C, 0x7380, 0x7381, 0x7383, /* 0x40 */
+ 0x7385, 0x7386, 0x738E, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398, /* 0x50 */
+ 0x739C, 0x739E, 0x739F, 0x73A0, 0x73A2, 0x73A5, 0x73A6, 0x73AA, /* 0x50 */
+ 0x73AB, 0x73AD, 0x73B5, 0x73B7, 0x73B9, 0x73BC, 0x73BD, 0x73BF, /* 0x60 */
+ 0x73C5, 0x73C6, 0x73C9, 0x73CB, 0x73CC, 0x73CF, 0x73D2, 0x73D3, /* 0x60 */
+ 0x73D6, 0x73D9, 0x73DD, 0x73E1, 0x73E3, 0x73E6, 0x73E7, 0x73E9, /* 0x70 */
+ 0x73F4, 0x73F5, 0x73F7, 0x73F9, 0x73FA, 0x73FB, 0x73FD /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_4C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x73FF, 0x7400, 0x7401, 0x7404, 0x7407, 0x740A, 0x7411, /* 0x20 */
+ 0x741A, 0x741B, 0x7424, 0x7426, 0x7428, 0x7429, 0x742A, 0x742B, /* 0x20 */
+ 0x742C, 0x742D, 0x742E, 0x742F, 0x7430, 0x7431, 0x7439, 0x7440, /* 0x30 */
+ 0x7443, 0x7444, 0x7446, 0x7447, 0x744B, 0x744D, 0x7451, 0x7452, /* 0x30 */
+ 0x7457, 0x745D, 0x7462, 0x7466, 0x7467, 0x7468, 0x746B, 0x746D, /* 0x40 */
+ 0x746E, 0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487, /* 0x40 */
+ 0x7489, 0x748F, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749A, /* 0x50 */
+ 0x749C, 0x749F, 0x74A0, 0x74A1, 0x74A3, 0x74A6, 0x74A8, 0x74A9, /* 0x50 */
+ 0x74AA, 0x74AB, 0x74AE, 0x74AF, 0x74B1, 0x74B2, 0x74B5, 0x74B9, /* 0x60 */
+ 0x74BB, 0x74BF, 0x74C8, 0x74C9, 0x74CC, 0x74D0, 0x74D3, 0x74D8, /* 0x60 */
+ 0x74DA, 0x74DB, 0x74DE, 0x74DF, 0x74E4, 0x74E8, 0x74EA, 0x74EB, /* 0x70 */
+ 0x74EF, 0x74F4, 0x74FA, 0x74FB, 0x74FC, 0x74FF, 0x7506 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_4D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527, /* 0x20 */
+ 0x7529, 0x752A, 0x752F, 0x7536, 0x7539, 0x753D, 0x753E, 0x753F, /* 0x20 */
+ 0x7540, 0x7543, 0x7547, 0x7548, 0x754E, 0x7550, 0x7552, 0x7557, /* 0x30 */
+ 0x755E, 0x755F, 0x7561, 0x756F, 0x7571, 0x7579, 0x757A, 0x757B, /* 0x30 */
+ 0x757C, 0x757D, 0x757E, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593, /* 0x40 */
+ 0x7595, 0x7599, 0x759C, 0x75A2, 0x75A4, 0x75B4, 0x75BA, 0x75BF, /* 0x40 */
+ 0x75C0, 0x75C1, 0x75C4, 0x75C6, 0x75CC, 0x75CE, 0x75CF, 0x75D7, /* 0x50 */
+ 0x75DC, 0x75DF, 0x75E0, 0x75E1, 0x75E4, 0x75E7, 0x75EC, 0x75EE, /* 0x50 */
+ 0x75EF, 0x75F1, 0x75F9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607, /* 0x60 */
+ 0x7608, 0x760A, 0x760C, 0x760F, 0x7612, 0x7613, 0x7615, 0x7616, /* 0x60 */
+ 0x7619, 0x761B, 0x761C, 0x761D, 0x761E, 0x7623, 0x7625, 0x7626, /* 0x70 */
+ 0x7629, 0x762D, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x763A, 0x763C, 0x764A, 0x7640, 0x7641, 0x7643, 0x7644, /* 0x20 */
+ 0x7645, 0x7649, 0x764B, 0x7655, 0x7659, 0x765F, 0x7664, 0x7665, /* 0x20 */
+ 0x766D, 0x766E, 0x766F, 0x7671, 0x7674, 0x7681, 0x7685, 0x768C, /* 0x30 */
+ 0x768D, 0x7695, 0x769B, 0x769C, 0x769D, 0x769F, 0x76A0, 0x76A2, /* 0x30 */
+ 0x76A3, 0x76A4, 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76AA, 0x76AD, /* 0x40 */
+ 0x76BD, 0x76C1, 0x76C5, 0x76C9, 0x76CB, 0x76CC, 0x76CE, 0x76D4, /* 0x40 */
+ 0x76D9, 0x76E0, 0x76E6, 0x76E8, 0x76EC, 0x76F0, 0x76F1, 0x76F6, /* 0x50 */
+ 0x76F9, 0x76FC, 0x7700, 0x7706, 0x770A, 0x770E, 0x7712, 0x7714, /* 0x50 */
+ 0x7715, 0x7717, 0x7719, 0x771A, 0x771C, 0x7722, 0x7728, 0x772D, /* 0x60 */
+ 0x772E, 0x772F, 0x7734, 0x7735, 0x7736, 0x7739, 0x773D, 0x773E, /* 0x60 */
+ 0x7742, 0x7745, 0x7746, 0x774A, 0x774D, 0x774E, 0x774F, 0x7752, /* 0x70 */
+ 0x7756, 0x7757, 0x775C, 0x775E, 0x775F, 0x7760, 0x7762 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7764, 0x7767, 0x776A, 0x776C, 0x7770, 0x7772, 0x7773, /* 0x20 */
+ 0x7774, 0x777A, 0x777D, 0x7780, 0x7784, 0x778C, 0x778D, 0x7794, /* 0x20 */
+ 0x7795, 0x7796, 0x779A, 0x779F, 0x77A2, 0x77A7, 0x77AA, 0x77AE, /* 0x30 */
+ 0x77AF, 0x77B1, 0x77B5, 0x77BE, 0x77C3, 0x77C9, 0x77D1, 0x77D2, /* 0x30 */
+ 0x77D5, 0x77D9, 0x77DE, 0x77DF, 0x77E0, 0x77E4, 0x77E6, 0x77EA, /* 0x40 */
+ 0x77EC, 0x77F0, 0x77F1, 0x77F4, 0x77F8, 0x77FB, 0x7805, 0x7806, /* 0x40 */
+ 0x7809, 0x780D, 0x780E, 0x7811, 0x781D, 0x7821, 0x7822, 0x7823, /* 0x50 */
+ 0x782D, 0x782E, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847, /* 0x50 */
+ 0x7848, 0x784C, 0x784E, 0x7852, 0x785C, 0x785E, 0x7860, 0x7861, /* 0x60 */
+ 0x7863, 0x7864, 0x7868, 0x786A, 0x786E, 0x787A, 0x787E, 0x788A, /* 0x60 */
+ 0x788F, 0x7894, 0x7898, 0x78A1, 0x789D, 0x789E, 0x789F, 0x78A4, /* 0x70 */
+ 0x78A8, 0x78AC, 0x78AD, 0x78B0, 0x78B1, 0x78B2, 0x78B3 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x78BB, 0x78BD, 0x78BF, 0x78C7, 0x78C8, 0x78C9, 0x78CC, /* 0x20 */
+ 0x78CE, 0x78D2, 0x78D3, 0x78D5, 0x78D6, 0x78E4, 0x78DB, 0x78DF, /* 0x20 */
+ 0x78E0, 0x78E1, 0x78E6, 0x78EA, 0x78F2, 0x78F3, 0x7900, 0x78F6, /* 0x30 */
+ 0x78F7, 0x78FA, 0x78FB, 0x78FF, 0x7906, 0x790C, 0x7910, 0x791A, /* 0x30 */
+ 0x791C, 0x791E, 0x791F, 0x7920, 0x7925, 0x7927, 0x7929, 0x792D, /* 0x40 */
+ 0x7931, 0x7934, 0x7935, 0x793B, 0x793D, 0x793F, 0x7944, 0x7945, /* 0x40 */
+ 0x7946, 0x794A, 0x794B, 0x794F, 0x7951, 0x7954, 0x7958, 0x795B, /* 0x50 */
+ 0x795C, 0x7967, 0x7969, 0x796B, 0x7972, 0x7979, 0x797B, 0x797C, /* 0x50 */
+ 0x797E, 0x798B, 0x798C, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996, /* 0x60 */
+ 0x7998, 0x799B, 0x799C, 0x79A1, 0x79A8, 0x79A9, 0x79AB, 0x79AF, /* 0x60 */
+ 0x79B1, 0x79B4, 0x79B8, 0x79BB, 0x79C2, 0x79C4, 0x79C7, 0x79C8, /* 0x70 */
+ 0x79CA, 0x79CF, 0x79D4, 0x79D6, 0x79DA, 0x79DD, 0x79DE /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x79E0, 0x79E2, 0x79E5, 0x79EA, 0x79EB, 0x79ED, 0x79F1, /* 0x20 */
+ 0x79F8, 0x79FC, 0x7A02, 0x7A03, 0x7A07, 0x7A09, 0x7A0A, 0x7A0C, /* 0x20 */
+ 0x7A11, 0x7A15, 0x7A1B, 0x7A1E, 0x7A21, 0x7A27, 0x7A2B, 0x7A2D, /* 0x30 */
+ 0x7A2F, 0x7A30, 0x7A34, 0x7A35, 0x7A38, 0x7A39, 0x7A3A, 0x7A44, /* 0x30 */
+ 0x7A45, 0x7A47, 0x7A48, 0x7A4C, 0x7A55, 0x7A56, 0x7A59, 0x7A5C, /* 0x40 */
+ 0x7A5D, 0x7A5F, 0x7A60, 0x7A65, 0x7A67, 0x7A6A, 0x7A6D, 0x7A75, /* 0x40 */
+ 0x7A78, 0x7A7E, 0x7A80, 0x7A82, 0x7A85, 0x7A86, 0x7A8A, 0x7A8B, /* 0x50 */
+ 0x7A90, 0x7A91, 0x7A94, 0x7A9E, 0x7AA0, 0x7AA3, 0x7AAC, 0x7AB3, /* 0x50 */
+ 0x7AB5, 0x7AB9, 0x7ABB, 0x7ABC, 0x7AC6, 0x7AC9, 0x7ACC, 0x7ACE, /* 0x60 */
+ 0x7AD1, 0x7ADB, 0x7AE8, 0x7AE9, 0x7AEB, 0x7AEC, 0x7AF1, 0x7AF4, /* 0x60 */
+ 0x7AFB, 0x7AFD, 0x7AFE, 0x7B07, 0x7B14, 0x7B1F, 0x7B23, 0x7B27, /* 0x70 */
+ 0x7B29, 0x7B2A, 0x7B2B, 0x7B2D, 0x7B2E, 0x7B2F, 0x7B30 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7B31, 0x7B34, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B47, /* 0x20 */
+ 0x7B4E, 0x7B55, 0x7B60, 0x7B64, 0x7B66, 0x7B69, 0x7B6A, 0x7B6D, /* 0x20 */
+ 0x7B6F, 0x7B72, 0x7B73, 0x7B77, 0x7B84, 0x7B89, 0x7B8E, 0x7B90, /* 0x30 */
+ 0x7B91, 0x7B96, 0x7B9B, 0x7B9E, 0x7BA0, 0x7BA5, 0x7BAC, 0x7BAF, /* 0x30 */
+ 0x7BB0, 0x7BB2, 0x7BB5, 0x7BB6, 0x7BBA, 0x7BBB, 0x7BBC, 0x7BBD, /* 0x40 */
+ 0x7BC2, 0x7BC5, 0x7BC8, 0x7BCA, 0x7BD4, 0x7BD6, 0x7BD7, 0x7BD9, /* 0x40 */
+ 0x7BDA, 0x7BDB, 0x7BE8, 0x7BEA, 0x7BF2, 0x7BF4, 0x7BF5, 0x7BF8, /* 0x50 */
+ 0x7BF9, 0x7BFA, 0x7BFC, 0x7BFE, 0x7C01, 0x7C02, 0x7C03, 0x7C04, /* 0x50 */
+ 0x7C06, 0x7C09, 0x7C0B, 0x7C0C, 0x7C0E, 0x7C0F, 0x7C19, 0x7C1B, /* 0x60 */
+ 0x7C20, 0x7C25, 0x7C26, 0x7C28, 0x7C2C, 0x7C31, 0x7C33, 0x7C34, /* 0x60 */
+ 0x7C36, 0x7C39, 0x7C3A, 0x7C46, 0x7C4A, 0x7C55, 0x7C51, 0x7C52, /* 0x70 */
+ 0x7C53, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5C, 0x7C5D, 0x7C5E /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7C61, 0x7C63, 0x7C67, 0x7C69, 0x7C6D, 0x7C6E, 0x7C70, /* 0x20 */
+ 0x7C72, 0x7C79, 0x7C7C, 0x7C7D, 0x7C86, 0x7C87, 0x7C8F, 0x7C94, /* 0x20 */
+ 0x7C9E, 0x7CA0, 0x7CA6, 0x7CB0, 0x7CB6, 0x7CB7, 0x7CBA, 0x7CBB, /* 0x30 */
+ 0x7CBC, 0x7CBF, 0x7CC4, 0x7CC7, 0x7CC8, 0x7CC9, 0x7CCD, 0x7CCF, /* 0x30 */
+ 0x7CD3, 0x7CD4, 0x7CD5, 0x7CD7, 0x7CD9, 0x7CDA, 0x7CDD, 0x7CE6, /* 0x40 */
+ 0x7CE9, 0x7CEB, 0x7CF5, 0x7D03, 0x7D07, 0x7D08, 0x7D09, 0x7D0F, /* 0x40 */
+ 0x7D11, 0x7D12, 0x7D13, 0x7D16, 0x7D1D, 0x7D1E, 0x7D23, 0x7D26, /* 0x50 */
+ 0x7D2A, 0x7D2D, 0x7D31, 0x7D3C, 0x7D3D, 0x7D3E, 0x7D40, 0x7D41, /* 0x50 */
+ 0x7D47, 0x7D48, 0x7D4D, 0x7D51, 0x7D53, 0x7D57, 0x7D59, 0x7D5A, /* 0x60 */
+ 0x7D5C, 0x7D5D, 0x7D65, 0x7D67, 0x7D6A, 0x7D70, 0x7D78, 0x7D7A, /* 0x60 */
+ 0x7D7B, 0x7D7F, 0x7D81, 0x7D82, 0x7D83, 0x7D85, 0x7D86, 0x7D88, /* 0x70 */
+ 0x7D8B, 0x7D8C, 0x7D8D, 0x7D91, 0x7D96, 0x7D97, 0x7D9D /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7D9E, 0x7DA6, 0x7DA7, 0x7DAA, 0x7DB3, 0x7DB6, 0x7DB7, /* 0x20 */
+ 0x7DB9, 0x7DC2, 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DCC, 0x7DCD, /* 0x20 */
+ 0x7DCE, 0x7DD7, 0x7DD9, 0x7E00, 0x7DE2, 0x7DE5, 0x7DE6, 0x7DEA, /* 0x30 */
+ 0x7DEB, 0x7DED, 0x7DF1, 0x7DF5, 0x7DF6, 0x7DF9, 0x7DFA, 0x7E08, /* 0x30 */
+ 0x7E10, 0x7E11, 0x7E15, 0x7E17, 0x7E1C, 0x7E1D, 0x7E20, 0x7E27, /* 0x40 */
+ 0x7E28, 0x7E2C, 0x7E2D, 0x7E2F, 0x7E33, 0x7E36, 0x7E3F, 0x7E44, /* 0x40 */
+ 0x7E45, 0x7E47, 0x7E4E, 0x7E50, 0x7E52, 0x7E58, 0x7E5F, 0x7E61, /* 0x50 */
+ 0x7E62, 0x7E65, 0x7E6B, 0x7E6E, 0x7E6F, 0x7E73, 0x7E78, 0x7E7E, /* 0x50 */
+ 0x7E81, 0x7E86, 0x7E87, 0x7E8A, 0x7E8D, 0x7E91, 0x7E95, 0x7E98, /* 0x60 */
+ 0x7E9A, 0x7E9D, 0x7E9E, 0x7F3C, 0x7F3B, 0x7F3D, 0x7F3E, 0x7F3F, /* 0x60 */
+ 0x7F43, 0x7F44, 0x7F47, 0x7F4F, 0x7F52, 0x7F53, 0x7F5B, 0x7F5C, /* 0x70 */
+ 0x7F5D, 0x7F61, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F6D /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7F71, 0x7F7D, 0x7F7E, 0x7F7F, 0x7F80, 0x7F8B, 0x7F8D, /* 0x20 */
+ 0x7F8F, 0x7F90, 0x7F91, 0x7F96, 0x7F97, 0x7F9C, 0x7FA1, 0x7FA2, /* 0x20 */
+ 0x7FA6, 0x7FAA, 0x7FAD, 0x7FB4, 0x7FBC, 0x7FBF, 0x7FC0, 0x7FC3, /* 0x30 */
+ 0x7FC8, 0x7FCE, 0x7FCF, 0x7FDB, 0x7FDF, 0x7FE3, 0x7FE5, 0x7FE8, /* 0x30 */
+ 0x7FEC, 0x7FEE, 0x7FEF, 0x7FF2, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, /* 0x40 */
+ 0x8007, 0x8008, 0x800A, 0x800D, 0x800E, 0x800F, 0x8011, 0x8013, /* 0x40 */
+ 0x8014, 0x8016, 0x801D, 0x801E, 0x801F, 0x8020, 0x8024, 0x8026, /* 0x50 */
+ 0x802C, 0x802E, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803A, /* 0x50 */
+ 0x803C, 0x803E, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806D, /* 0x60 */
+ 0x8071, 0x8075, 0x8081, 0x8088, 0x808E, 0x809C, 0x809E, 0x80A6, /* 0x60 */
+ 0x80A7, 0x80AB, 0x80B8, 0x80B9, 0x80C8, 0x80CD, 0x80CF, 0x80D2, /* 0x70 */
+ 0x80D4, 0x80D5, 0x80D7, 0x80D8, 0x80E0, 0x80ED, 0x80EE /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x80F0, 0x80F2, 0x80F3, 0x80F6, 0x80F9, 0x80FA, 0x80FE, /* 0x20 */
+ 0x8103, 0x810B, 0x8116, 0x8117, 0x8118, 0x811C, 0x811E, 0x8120, /* 0x20 */
+ 0x8124, 0x8127, 0x812C, 0x8130, 0x8135, 0x813A, 0x813C, 0x8145, /* 0x30 */
+ 0x8147, 0x814A, 0x814C, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167, /* 0x30 */
+ 0x8168, 0x8169, 0x816D, 0x816F, 0x8177, 0x8181, 0x8190, 0x8184, /* 0x40 */
+ 0x8185, 0x8186, 0x818B, 0x818E, 0x8196, 0x8198, 0x819B, 0x819E, /* 0x40 */
+ 0x81A2, 0x81AE, 0x81B2, 0x81B4, 0x81BB, 0x81CB, 0x81C3, 0x81C5, /* 0x50 */
+ 0x81CA, 0x81CE, 0x81CF, 0x81D5, 0x81D7, 0x81DB, 0x81DD, 0x81DE, /* 0x50 */
+ 0x81E1, 0x81E4, 0x81EB, 0x81EC, 0x81F0, 0x81F1, 0x81F2, 0x81F5, /* 0x60 */
+ 0x81F6, 0x81F8, 0x81F9, 0x81FD, 0x81FF, 0x8200, 0x8203, 0x820F, /* 0x60 */
+ 0x8213, 0x8214, 0x8219, 0x821A, 0x821D, 0x8221, 0x8222, 0x8228, /* 0x70 */
+ 0x8232, 0x8234, 0x823A, 0x8243, 0x8244, 0x8245, 0x8246 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x824B, 0x824E, 0x824F, 0x8251, 0x8256, 0x825C, 0x8260, /* 0x20 */
+ 0x8263, 0x8267, 0x826D, 0x8274, 0x827B, 0x827D, 0x827F, 0x8280, /* 0x20 */
+ 0x8281, 0x8283, 0x8284, 0x8287, 0x8289, 0x828A, 0x828E, 0x8291, /* 0x30 */
+ 0x8294, 0x8296, 0x8298, 0x829A, 0x829B, 0x82A0, 0x82A1, 0x82A3, /* 0x30 */
+ 0x82A4, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AE, 0x82B0, 0x82B2, /* 0x40 */
+ 0x82B4, 0x82B7, 0x82BA, 0x82BC, 0x82BE, 0x82BF, 0x82C6, 0x82D0, /* 0x40 */
+ 0x82D5, 0x82DA, 0x82E0, 0x82E2, 0x82E4, 0x82E8, 0x82EA, 0x82ED, /* 0x50 */
+ 0x82EF, 0x82F6, 0x82F7, 0x82FD, 0x82FE, 0x8300, 0x8301, 0x8307, /* 0x50 */
+ 0x8308, 0x830A, 0x830B, 0x8354, 0x831B, 0x831D, 0x831E, 0x831F, /* 0x60 */
+ 0x8321, 0x8322, 0x832C, 0x832D, 0x832E, 0x8330, 0x8333, 0x8337, /* 0x60 */
+ 0x833A, 0x833C, 0x833D, 0x8342, 0x8343, 0x8344, 0x8347, 0x834D, /* 0x70 */
+ 0x834E, 0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x837D, 0x837F, 0x8380, 0x8382, 0x8384, 0x8386, 0x838D, /* 0x20 */
+ 0x8392, 0x8394, 0x8395, 0x8398, 0x8399, 0x839B, 0x839C, 0x839D, /* 0x20 */
+ 0x83A6, 0x83A7, 0x83A9, 0x83AC, 0x83BE, 0x83BF, 0x83C0, 0x83C7, /* 0x30 */
+ 0x83C9, 0x83CF, 0x83D0, 0x83D1, 0x83D4, 0x83DD, 0x8353, 0x83E8, /* 0x30 */
+ 0x83EA, 0x83F6, 0x83F8, 0x83F9, 0x83FC, 0x8401, 0x8406, 0x840A, /* 0x40 */
+ 0x840F, 0x8411, 0x8415, 0x8419, 0x83AD, 0x842F, 0x8439, 0x8445, /* 0x40 */
+ 0x8447, 0x8448, 0x844A, 0x844D, 0x844F, 0x8451, 0x8452, 0x8456, /* 0x50 */
+ 0x8458, 0x8459, 0x845A, 0x845C, 0x8460, 0x8464, 0x8465, 0x8467, /* 0x50 */
+ 0x846A, 0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847C, 0x847D, /* 0x60 */
+ 0x8481, 0x8485, 0x8492, 0x8493, 0x8495, 0x849E, 0x84A6, 0x84A8, /* 0x60 */
+ 0x84A9, 0x84AA, 0x84AF, 0x84B1, 0x84B4, 0x84BA, 0x84BD, 0x84BE, /* 0x70 */
+ 0x84C0, 0x84C2, 0x84C7, 0x84C8, 0x84CC, 0x84CF, 0x84D3 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x84DC, 0x84E7, 0x84EA, 0x84EF, 0x84F0, 0x84F1, 0x84F2, /* 0x20 */
+ 0x84F7, 0x8532, 0x84FA, 0x84FB, 0x84FD, 0x8502, 0x8503, 0x8507, /* 0x20 */
+ 0x850C, 0x850E, 0x8510, 0x851C, 0x851E, 0x8522, 0x8523, 0x8524, /* 0x30 */
+ 0x8525, 0x8527, 0x852A, 0x852B, 0x852F, 0x8533, 0x8534, 0x8536, /* 0x30 */
+ 0x853F, 0x8546, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556, /* 0x40 */
+ 0x8559, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562, /* 0x40 */
+ 0x8564, 0x856B, 0x856F, 0x8579, 0x857A, 0x857B, 0x857D, 0x857F, /* 0x50 */
+ 0x8581, 0x8585, 0x8586, 0x8589, 0x858B, 0x858C, 0x858F, 0x8593, /* 0x50 */
+ 0x8598, 0x859D, 0x859F, 0x85A0, 0x85A2, 0x85A5, 0x85A7, 0x85B4, /* 0x60 */
+ 0x85B6, 0x85B7, 0x85B8, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C2, /* 0x60 */
+ 0x85C7, 0x85CA, 0x85CB, 0x85CE, 0x85AD, 0x85D8, 0x85DA, 0x85DF, /* 0x70 */
+ 0x85E0, 0x85E6, 0x85E8, 0x85ED, 0x85F3, 0x85F6, 0x85FC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x85FF, 0x8600, 0x8604, 0x8605, 0x860D, 0x860E, 0x8610, /* 0x20 */
+ 0x8611, 0x8612, 0x8618, 0x8619, 0x861B, 0x861E, 0x8621, 0x8627, /* 0x20 */
+ 0x8629, 0x8636, 0x8638, 0x863A, 0x863C, 0x863D, 0x8640, 0x8642, /* 0x30 */
+ 0x8646, 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865D, /* 0x30 */
+ 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866C, 0x866F, /* 0x40 */
+ 0x8675, 0x8676, 0x8677, 0x867A, 0x868D, 0x8691, 0x8696, 0x8698, /* 0x40 */
+ 0x869A, 0x869C, 0x86A1, 0x86A6, 0x86A7, 0x86A8, 0x86AD, 0x86B1, /* 0x50 */
+ 0x86B3, 0x86B4, 0x86B5, 0x86B7, 0x86B8, 0x86B9, 0x86BF, 0x86C0, /* 0x50 */
+ 0x86C1, 0x86C3, 0x86C5, 0x86D1, 0x86D2, 0x86D5, 0x86D7, 0x86DA, /* 0x60 */
+ 0x86DC, 0x86E0, 0x86E3, 0x86E5, 0x86E7, 0x8688, 0x86FA, 0x86FC, /* 0x60 */
+ 0x86FD, 0x8704, 0x8705, 0x8707, 0x870B, 0x870E, 0x870F, 0x8710, /* 0x70 */
+ 0x8713, 0x8714, 0x8719, 0x871E, 0x871F, 0x8721, 0x8723 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8728, 0x872E, 0x872F, 0x8731, 0x8732, 0x8739, 0x873A, /* 0x20 */
+ 0x873C, 0x873D, 0x873E, 0x8740, 0x8743, 0x8745, 0x874D, 0x8758, /* 0x20 */
+ 0x875D, 0x8761, 0x8764, 0x8765, 0x876F, 0x8771, 0x8772, 0x877B, /* 0x30 */
+ 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878B, /* 0x30 */
+ 0x878C, 0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879E, /* 0x40 */
+ 0x87A0, 0x87A3, 0x87A7, 0x87AC, 0x87AD, 0x87AE, 0x87B1, 0x87B5, /* 0x40 */
+ 0x87BE, 0x87BF, 0x87C1, 0x87C8, 0x87C9, 0x87CA, 0x87CE, 0x87D5, /* 0x50 */
+ 0x87D6, 0x87D9, 0x87DA, 0x87DC, 0x87DF, 0x87E2, 0x87E3, 0x87E4, /* 0x50 */
+ 0x87EA, 0x87EB, 0x87ED, 0x87F1, 0x87F3, 0x87F8, 0x87FA, 0x87FF, /* 0x60 */
+ 0x8801, 0x8803, 0x8806, 0x8809, 0x880A, 0x880B, 0x8810, 0x8819, /* 0x60 */
+ 0x8812, 0x8813, 0x8814, 0x8818, 0x881A, 0x881B, 0x881C, 0x881E, /* 0x70 */
+ 0x881F, 0x8828, 0x882D, 0x882E, 0x8830, 0x8832, 0x8835 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x883A, 0x883C, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849, /* 0x20 */
+ 0x884A, 0x884B, 0x884E, 0x8851, 0x8855, 0x8856, 0x8858, 0x885A, /* 0x20 */
+ 0x885C, 0x885F, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887B, /* 0x30 */
+ 0x8880, 0x8898, 0x889A, 0x889B, 0x889C, 0x889F, 0x88A0, 0x88A8, /* 0x30 */
+ 0x88AA, 0x88BA, 0x88BD, 0x88BE, 0x88C0, 0x88CA, 0x88CB, 0x88CC, /* 0x40 */
+ 0x88CD, 0x88CE, 0x88D1, 0x88D2, 0x88D3, 0x88DB, 0x88DE, 0x88E7, /* 0x40 */
+ 0x88EF, 0x88F0, 0x88F1, 0x88F5, 0x88F7, 0x8901, 0x8906, 0x890D, /* 0x50 */
+ 0x890E, 0x890F, 0x8915, 0x8916, 0x8918, 0x8919, 0x891A, 0x891C, /* 0x50 */
+ 0x8920, 0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935, /* 0x60 */
+ 0x8939, 0x893A, 0x893E, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949, /* 0x60 */
+ 0x894F, 0x8952, 0x8957, 0x895A, 0x895B, 0x895C, 0x8961, 0x8962, /* 0x70 */
+ 0x8963, 0x896B, 0x896E, 0x8970, 0x8973, 0x8975, 0x897A /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x897B, 0x897C, 0x897D, 0x8989, 0x898D, 0x8990, 0x8994, /* 0x20 */
+ 0x8995, 0x899B, 0x899C, 0x899F, 0x89A0, 0x89A5, 0x89B0, 0x89B4, /* 0x20 */
+ 0x89B5, 0x89B6, 0x89B7, 0x89BC, 0x89D4, 0x89D5, 0x89D6, 0x89D7, /* 0x30 */
+ 0x89D8, 0x89E5, 0x89E9, 0x89EB, 0x89ED, 0x89F1, 0x89F3, 0x89F6, /* 0x30 */
+ 0x89F9, 0x89FD, 0x89FF, 0x8A04, 0x8A05, 0x8A07, 0x8A0F, 0x8A11, /* 0x40 */
+ 0x8A12, 0x8A14, 0x8A15, 0x8A1E, 0x8A20, 0x8A22, 0x8A24, 0x8A26, /* 0x40 */
+ 0x8A2B, 0x8A2C, 0x8A2F, 0x8A35, 0x8A37, 0x8A3D, 0x8A3E, 0x8A40, /* 0x50 */
+ 0x8A43, 0x8A45, 0x8A47, 0x8A49, 0x8A4D, 0x8A4E, 0x8A53, 0x8A56, /* 0x50 */
+ 0x8A57, 0x8A58, 0x8A5C, 0x8A5D, 0x8A61, 0x8A65, 0x8A67, 0x8A75, /* 0x60 */
+ 0x8A76, 0x8A77, 0x8A79, 0x8A7A, 0x8A7B, 0x8A7E, 0x8A7F, 0x8A80, /* 0x60 */
+ 0x8A83, 0x8A86, 0x8A8B, 0x8A8F, 0x8A90, 0x8A92, 0x8A96, 0x8A97, /* 0x70 */
+ 0x8A99, 0x8A9F, 0x8AA7, 0x8AA9, 0x8AAE, 0x8AAF, 0x8AB3 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8AB6, 0x8AB7, 0x8ABB, 0x8ABE, 0x8AC3, 0x8AC6, 0x8AC8, /* 0x20 */
+ 0x8AC9, 0x8ACA, 0x8AD1, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD7, 0x8ADD, /* 0x20 */
+ 0x8ADF, 0x8AEC, 0x8AF0, 0x8AF4, 0x8AF5, 0x8AF6, 0x8AFC, 0x8AFF, /* 0x30 */
+ 0x8B05, 0x8B06, 0x8B0B, 0x8B11, 0x8B1C, 0x8B1E, 0x8B1F, 0x8B0A, /* 0x30 */
+ 0x8B2D, 0x8B30, 0x8B37, 0x8B3C, 0x8B42, 0x8B43, 0x8B44, 0x8B45, /* 0x40 */
+ 0x8B46, 0x8B48, 0x8B52, 0x8B53, 0x8B54, 0x8B59, 0x8B4D, 0x8B5E, /* 0x40 */
+ 0x8B63, 0x8B6D, 0x8B76, 0x8B78, 0x8B79, 0x8B7C, 0x8B7E, 0x8B81, /* 0x50 */
+ 0x8B84, 0x8B85, 0x8B8B, 0x8B8D, 0x8B8F, 0x8B94, 0x8B95, 0x8B9C, /* 0x50 */
+ 0x8B9E, 0x8B9F, 0x8C38, 0x8C39, 0x8C3D, 0x8C3E, 0x8C45, 0x8C47, /* 0x60 */
+ 0x8C49, 0x8C4B, 0x8C4F, 0x8C51, 0x8C53, 0x8C54, 0x8C57, 0x8C58, /* 0x60 */
+ 0x8C5B, 0x8C5D, 0x8C59, 0x8C63, 0x8C64, 0x8C66, 0x8C68, 0x8C69, /* 0x70 */
+ 0x8C6D, 0x8C73, 0x8C75, 0x8C76, 0x8C7B, 0x8C7E, 0x8C86 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8C87, 0x8C8B, 0x8C90, 0x8C92, 0x8C93, 0x8C99, 0x8C9B, /* 0x20 */
+ 0x8C9C, 0x8CA4, 0x8CB9, 0x8CBA, 0x8CC5, 0x8CC6, 0x8CC9, 0x8CCB, /* 0x20 */
+ 0x8CCF, 0x8CD6, 0x8CD5, 0x8CD9, 0x8CDD, 0x8CE1, 0x8CE8, 0x8CEC, /* 0x30 */
+ 0x8CEF, 0x8CF0, 0x8CF2, 0x8CF5, 0x8CF7, 0x8CF8, 0x8CFE, 0x8CFF, /* 0x30 */
+ 0x8D01, 0x8D03, 0x8D09, 0x8D12, 0x8D17, 0x8D1B, 0x8D65, 0x8D69, /* 0x40 */
+ 0x8D6C, 0x8D6E, 0x8D7F, 0x8D82, 0x8D84, 0x8D88, 0x8D8D, 0x8D90, /* 0x40 */
+ 0x8D91, 0x8D95, 0x8D9E, 0x8D9F, 0x8DA0, 0x8DA6, 0x8DAB, 0x8DAC, /* 0x50 */
+ 0x8DAF, 0x8DB2, 0x8DB5, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DC0, 0x8DC5, /* 0x50 */
+ 0x8DC6, 0x8DC7, 0x8DC8, 0x8DCA, 0x8DCE, 0x8DD1, 0x8DD4, 0x8DD5, /* 0x60 */
+ 0x8DD7, 0x8DD9, 0x8DE4, 0x8DE5, 0x8DE7, 0x8DEC, 0x8DF0, 0x8DBC, /* 0x60 */
+ 0x8DF1, 0x8DF2, 0x8DF4, 0x8DFD, 0x8E01, 0x8E04, 0x8E05, 0x8E06, /* 0x70 */
+ 0x8E0B, 0x8E11, 0x8E14, 0x8E16, 0x8E20, 0x8E21, 0x8E22 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E23, 0x8E26, 0x8E27, 0x8E31, 0x8E33, 0x8E36, 0x8E37, /* 0x20 */
+ 0x8E38, 0x8E39, 0x8E3D, 0x8E40, 0x8E41, 0x8E4B, 0x8E4D, 0x8E4E, /* 0x20 */
+ 0x8E4F, 0x8E54, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E61, 0x8E62, /* 0x30 */
+ 0x8E69, 0x8E6C, 0x8E6D, 0x8E6F, 0x8E70, 0x8E71, 0x8E79, 0x8E7A, /* 0x30 */
+ 0x8E7B, 0x8E82, 0x8E83, 0x8E89, 0x8E90, 0x8E92, 0x8E95, 0x8E9A, /* 0x40 */
+ 0x8E9B, 0x8E9D, 0x8E9E, 0x8EA2, 0x8EA7, 0x8EA9, 0x8EAD, 0x8EAE, /* 0x40 */
+ 0x8EB3, 0x8EB5, 0x8EBA, 0x8EBB, 0x8EC0, 0x8EC1, 0x8EC3, 0x8EC4, /* 0x50 */
+ 0x8EC7, 0x8ECF, 0x8ED1, 0x8ED4, 0x8EDC, 0x8EE8, 0x8EEE, 0x8EF0, /* 0x50 */
+ 0x8EF1, 0x8EF7, 0x8EF9, 0x8EFA, 0x8EED, 0x8F00, 0x8F02, 0x8F07, /* 0x60 */
+ 0x8F08, 0x8F0F, 0x8F10, 0x8F16, 0x8F17, 0x8F18, 0x8F1E, 0x8F20, /* 0x60 */
+ 0x8F21, 0x8F23, 0x8F25, 0x8F27, 0x8F28, 0x8F2C, 0x8F2D, 0x8F2E, /* 0x70 */
+ 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F3A, 0x8F40, 0x8F41 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8F43, 0x8F47, 0x8F4F, 0x8F51, 0x8F52, 0x8F53, 0x8F54, /* 0x20 */
+ 0x8F55, 0x8F58, 0x8F5D, 0x8F5E, 0x8F65, 0x8F9D, 0x8FA0, 0x8FA1, /* 0x20 */
+ 0x8FA4, 0x8FA5, 0x8FA6, 0x8FB5, 0x8FB6, 0x8FB8, 0x8FBE, 0x8FC0, /* 0x30 */
+ 0x8FC1, 0x8FC6, 0x8FCA, 0x8FCB, 0x8FCD, 0x8FD0, 0x8FD2, 0x8FD3, /* 0x30 */
+ 0x8FD5, 0x8FE0, 0x8FE3, 0x8FE4, 0x8FE8, 0x8FEE, 0x8FF1, 0x8FF5, /* 0x40 */
+ 0x8FF6, 0x8FFB, 0x8FFE, 0x9002, 0x9004, 0x9008, 0x900C, 0x9018, /* 0x40 */
+ 0x901B, 0x9028, 0x9029, 0x902F, 0x902A, 0x902C, 0x902D, 0x9033, /* 0x50 */
+ 0x9034, 0x9037, 0x903F, 0x9043, 0x9044, 0x904C, 0x905B, 0x905D, /* 0x50 */
+ 0x9062, 0x9066, 0x9067, 0x906C, 0x9070, 0x9074, 0x9079, 0x9085, /* 0x60 */
+ 0x9088, 0x908B, 0x908C, 0x908E, 0x9090, 0x9095, 0x9097, 0x9098, /* 0x60 */
+ 0x9099, 0x909B, 0x90A0, 0x90A1, 0x90A2, 0x90A5, 0x90B0, 0x90B2, /* 0x70 */
+ 0x90B3, 0x90B4, 0x90B6, 0x90BD, 0x90CC, 0x90BE, 0x90C3 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x90C4, 0x90C5, 0x90C7, 0x90C8, 0x90D5, 0x90D7, 0x90D8, /* 0x20 */
+ 0x90D9, 0x90DC, 0x90DD, 0x90DF, 0x90E5, 0x90D2, 0x90F6, 0x90EB, /* 0x20 */
+ 0x90EF, 0x90F0, 0x90F4, 0x90FE, 0x90FF, 0x9100, 0x9104, 0x9105, /* 0x30 */
+ 0x9106, 0x9108, 0x910D, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118, /* 0x30 */
+ 0x911A, 0x911C, 0x911E, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127, /* 0x40 */
+ 0x9129, 0x912E, 0x912F, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139, /* 0x40 */
+ 0x913A, 0x913C, 0x913D, 0x9143, 0x9147, 0x9148, 0x914F, 0x9153, /* 0x50 */
+ 0x9157, 0x9159, 0x915A, 0x915B, 0x9161, 0x9164, 0x9167, 0x916D, /* 0x50 */
+ 0x9174, 0x9179, 0x917A, 0x917B, 0x9181, 0x9183, 0x9185, 0x9186, /* 0x60 */
+ 0x918A, 0x918E, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919E, /* 0x60 */
+ 0x91A1, 0x91A6, 0x91A8, 0x91AC, 0x91AD, 0x91AE, 0x91B0, 0x91B1, /* 0x70 */
+ 0x91B2, 0x91B3, 0x91B6, 0x91BB, 0x91BC, 0x91BD, 0x91BF /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x91C2, 0x91C3, 0x91C5, 0x91D3, 0x91D4, 0x91D7, 0x91D9, /* 0x20 */
+ 0x91DA, 0x91DE, 0x91E4, 0x91E5, 0x91E9, 0x91EA, 0x91EC, 0x91ED, /* 0x20 */
+ 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F7, 0x91F9, 0x91FB, 0x91FD, /* 0x30 */
+ 0x9200, 0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920A, /* 0x30 */
+ 0x920C, 0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921C, 0x921D, /* 0x40 */
+ 0x9223, 0x9224, 0x9225, 0x9226, 0x9228, 0x922E, 0x922F, 0x9230, /* 0x40 */
+ 0x9233, 0x9235, 0x9236, 0x9238, 0x9239, 0x923A, 0x923C, 0x923E, /* 0x50 */
+ 0x9240, 0x9242, 0x9243, 0x9246, 0x9247, 0x924A, 0x924D, 0x924E, /* 0x50 */
+ 0x924F, 0x9251, 0x9258, 0x9259, 0x925C, 0x925D, 0x9260, 0x9261, /* 0x60 */
+ 0x9265, 0x9267, 0x9268, 0x9269, 0x926E, 0x926F, 0x9270, 0x9275, /* 0x60 */
+ 0x9276, 0x9277, 0x9278, 0x9279, 0x927B, 0x927C, 0x927D, 0x927F, /* 0x70 */
+ 0x9288, 0x9289, 0x928A, 0x928D, 0x928E, 0x9292, 0x9297 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9299, 0x929F, 0x92A0, 0x92A4, 0x92A5, 0x92A7, 0x92A8, /* 0x20 */
+ 0x92AB, 0x92AF, 0x92B2, 0x92B6, 0x92B8, 0x92BA, 0x92BB, 0x92BC, /* 0x20 */
+ 0x92BD, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C5, 0x92C6, /* 0x30 */
+ 0x92C7, 0x92C8, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92D0, 0x92D3, /* 0x30 */
+ 0x92D5, 0x92D7, 0x92D8, 0x92D9, 0x92DC, 0x92DD, 0x92DF, 0x92E0, /* 0x40 */
+ 0x92E1, 0x92E3, 0x92E5, 0x92E7, 0x92E8, 0x92EC, 0x92EE, 0x92F0, /* 0x40 */
+ 0x92F9, 0x92FB, 0x92FF, 0x9300, 0x9302, 0x9308, 0x930D, 0x9311, /* 0x50 */
+ 0x9314, 0x9315, 0x931C, 0x931D, 0x931E, 0x931F, 0x9321, 0x9324, /* 0x50 */
+ 0x9325, 0x9327, 0x9329, 0x932A, 0x9333, 0x9334, 0x9336, 0x9337, /* 0x60 */
+ 0x9347, 0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357, /* 0x60 */
+ 0x9358, 0x935A, 0x935E, 0x9364, 0x9365, 0x9367, 0x9369, 0x936A, /* 0x70 */
+ 0x936D, 0x936F, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x937A, 0x937D, 0x937F, 0x9380, 0x9381, 0x9382, 0x9388, /* 0x20 */
+ 0x938A, 0x938B, 0x938D, 0x938F, 0x9392, 0x9395, 0x9398, 0x939B, /* 0x20 */
+ 0x939E, 0x93A1, 0x93A3, 0x93A4, 0x93A6, 0x93A8, 0x93AB, 0x93B4, /* 0x30 */
+ 0x93B5, 0x93B6, 0x93BA, 0x93A9, 0x93C1, 0x93C4, 0x93C5, 0x93C6, /* 0x30 */
+ 0x93C7, 0x93C9, 0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93D3, 0x93D9, /* 0x40 */
+ 0x93DC, 0x93DE, 0x93DF, 0x93E2, 0x93E6, 0x93E7, 0x93F9, 0x93F7, /* 0x40 */
+ 0x93F8, 0x93FA, 0x93FB, 0x93FD, 0x9401, 0x9402, 0x9404, 0x9408, /* 0x50 */
+ 0x9409, 0x940D, 0x940E, 0x940F, 0x9415, 0x9416, 0x9417, 0x941F, /* 0x50 */
+ 0x942E, 0x942F, 0x9431, 0x9432, 0x9433, 0x9434, 0x943B, 0x943F, /* 0x60 */
+ 0x943D, 0x9443, 0x9445, 0x9448, 0x944A, 0x944C, 0x9455, 0x9459, /* 0x60 */
+ 0x945C, 0x945F, 0x9461, 0x9463, 0x9468, 0x946B, 0x946D, 0x946E, /* 0x70 */
+ 0x946F, 0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x957E, 0x9584, 0x9588, 0x958C, 0x958D, 0x958E, 0x959D, /* 0x20 */
+ 0x959E, 0x959F, 0x95A1, 0x95A6, 0x95A9, 0x95AB, 0x95AC, 0x95B4, /* 0x20 */
+ 0x95B6, 0x95BA, 0x95BD, 0x95BF, 0x95C6, 0x95C8, 0x95C9, 0x95CB, /* 0x30 */
+ 0x95D0, 0x95D1, 0x95D2, 0x95D3, 0x95D9, 0x95DA, 0x95DD, 0x95DE, /* 0x30 */
+ 0x95DF, 0x95E0, 0x95E4, 0x95E6, 0x961D, 0x961E, 0x9622, 0x9624, /* 0x40 */
+ 0x9625, 0x9626, 0x962C, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639, /* 0x40 */
+ 0x963A, 0x963C, 0x963D, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657, /* 0x50 */
+ 0x9658, 0x9661, 0x966E, 0x9674, 0x967B, 0x967C, 0x967E, 0x967F, /* 0x50 */
+ 0x9681, 0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969A, /* 0x60 */
+ 0x969D, 0x969F, 0x96A4, 0x96A5, 0x96A6, 0x96A9, 0x96AE, 0x96AF, /* 0x60 */
+ 0x96B3, 0x96BA, 0x96CA, 0x96D2, 0x5DB2, 0x96D8, 0x96DA, 0x96DD, /* 0x70 */
+ 0x96DE, 0x96DF, 0x96E9, 0x96EF, 0x96F1, 0x96FA, 0x9702 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9703, 0x9705, 0x9709, 0x971A, 0x971B, 0x971D, 0x9721, /* 0x20 */
+ 0x9722, 0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974A, /* 0x20 */
+ 0x974E, 0x974F, 0x9755, 0x9757, 0x9758, 0x975A, 0x975B, 0x9763, /* 0x30 */
+ 0x9767, 0x976A, 0x976E, 0x9773, 0x9776, 0x9777, 0x9778, 0x977B, /* 0x30 */
+ 0x977D, 0x977F, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799, /* 0x40 */
+ 0x979A, 0x979E, 0x979F, 0x97A2, 0x97AC, 0x97AE, 0x97B1, 0x97B2, /* 0x40 */
+ 0x97B5, 0x97B6, 0x97B8, 0x97B9, 0x97BA, 0x97BC, 0x97BE, 0x97BF, /* 0x50 */
+ 0x97C1, 0x97C4, 0x97C5, 0x97C7, 0x97C9, 0x97CA, 0x97CC, 0x97CD, /* 0x50 */
+ 0x97CE, 0x97D0, 0x97D1, 0x97D4, 0x97D7, 0x97D8, 0x97D9, 0x97DD, /* 0x60 */
+ 0x97DE, 0x97E0, 0x97DB, 0x97E1, 0x97E4, 0x97EF, 0x97F1, 0x97F4, /* 0x60 */
+ 0x97F7, 0x97F8, 0x97FA, 0x9807, 0x980A, 0x9819, 0x980D, 0x980E, /* 0x70 */
+ 0x9814, 0x9816, 0x981C, 0x981E, 0x9820, 0x9823, 0x9826 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x982B, 0x982E, 0x982F, 0x9830, 0x9832, 0x9833, 0x9835, /* 0x20 */
+ 0x9825, 0x983E, 0x9844, 0x9847, 0x984A, 0x9851, 0x9852, 0x9853, /* 0x20 */
+ 0x9856, 0x9857, 0x9859, 0x985A, 0x9862, 0x9863, 0x9865, 0x9866, /* 0x30 */
+ 0x986A, 0x986C, 0x98AB, 0x98AD, 0x98AE, 0x98B0, 0x98B4, 0x98B7, /* 0x30 */
+ 0x98B8, 0x98BA, 0x98BB, 0x98BF, 0x98C2, 0x98C5, 0x98C8, 0x98CC, /* 0x40 */
+ 0x98E1, 0x98E3, 0x98E5, 0x98E6, 0x98E7, 0x98EA, 0x98F3, 0x98F6, /* 0x40 */
+ 0x9902, 0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991A, /* 0x50 */
+ 0x991B, 0x991C, 0x991F, 0x9922, 0x9926, 0x9927, 0x992B, 0x9931, /* 0x50 */
+ 0x9932, 0x9933, 0x9934, 0x9935, 0x9939, 0x993A, 0x993B, 0x993C, /* 0x60 */
+ 0x9940, 0x9941, 0x9946, 0x9947, 0x9948, 0x994D, 0x994E, 0x9954, /* 0x60 */
+ 0x9958, 0x9959, 0x995B, 0x995C, 0x995E, 0x995F, 0x9960, 0x999B, /* 0x70 */
+ 0x999D, 0x999F, 0x99A6, 0x99B0, 0x99B1, 0x99B2, 0x99B5 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x99B9, 0x99BA, 0x99BD, 0x99BF, 0x99C3, 0x99C9, 0x99D3, /* 0x20 */
+ 0x99D4, 0x99D9, 0x99DA, 0x99DC, 0x99DE, 0x99E7, 0x99EA, 0x99EB, /* 0x20 */
+ 0x99EC, 0x99F0, 0x99F4, 0x99F5, 0x99F9, 0x99FD, 0x99FE, 0x9A02, /* 0x30 */
+ 0x9A03, 0x9A04, 0x9A0B, 0x9A0C, 0x9A10, 0x9A11, 0x9A16, 0x9A1E, /* 0x30 */
+ 0x9A20, 0x9A22, 0x9A23, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A33, /* 0x40 */
+ 0x9A35, 0x9A36, 0x9A38, 0x9A47, 0x9A41, 0x9A44, 0x9A4A, 0x9A4B, /* 0x40 */
+ 0x9A4C, 0x9A4E, 0x9A51, 0x9A54, 0x9A56, 0x9A5D, 0x9AAA, 0x9AAC, /* 0x50 */
+ 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB4, 0x9AB5, 0x9AB6, 0x9AB9, 0x9ABB, /* 0x50 */
+ 0x9ABE, 0x9ABF, 0x9AC1, 0x9AC3, 0x9AC6, 0x9AC8, 0x9ACE, 0x9AD0, /* 0x60 */
+ 0x9AD2, 0x9AD5, 0x9AD6, 0x9AD7, 0x9ADB, 0x9ADC, 0x9AE0, 0x9AE4, /* 0x60 */
+ 0x9AE5, 0x9AE7, 0x9AE9, 0x9AEC, 0x9AF2, 0x9AF3, 0x9AF5, 0x9AF9, /* 0x70 */
+ 0x9AFA, 0x9AFD, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B03 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9B04, 0x9B05, 0x9B08, 0x9B09, 0x9B0B, 0x9B0C, 0x9B0D, /* 0x20 */
+ 0x9B0E, 0x9B10, 0x9B12, 0x9B16, 0x9B19, 0x9B1B, 0x9B1C, 0x9B20, /* 0x20 */
+ 0x9B26, 0x9B2B, 0x9B2D, 0x9B33, 0x9B34, 0x9B35, 0x9B37, 0x9B39, /* 0x30 */
+ 0x9B3A, 0x9B3D, 0x9B48, 0x9B4B, 0x9B4C, 0x9B55, 0x9B56, 0x9B57, /* 0x30 */
+ 0x9B5B, 0x9B5E, 0x9B61, 0x9B63, 0x9B65, 0x9B66, 0x9B68, 0x9B6A, /* 0x40 */
+ 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B73, 0x9B75, 0x9B77, 0x9B78, /* 0x40 */
+ 0x9B79, 0x9B7F, 0x9B80, 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B89, /* 0x50 */
+ 0x9B8A, 0x9B8B, 0x9B8D, 0x9B8F, 0x9B90, 0x9B94, 0x9B9A, 0x9B9D, /* 0x50 */
+ 0x9B9E, 0x9BA6, 0x9BA7, 0x9BA9, 0x9BAC, 0x9BB0, 0x9BB1, 0x9BB2, /* 0x60 */
+ 0x9BB7, 0x9BB8, 0x9BBB, 0x9BBC, 0x9BBE, 0x9BBF, 0x9BC1, 0x9BC7, /* 0x60 */
+ 0x9BC8, 0x9BCE, 0x9BD0, 0x9BD7, 0x9BD8, 0x9BDD, 0x9BDF, 0x9BE5, /* 0x70 */
+ 0x9BE7, 0x9BEA, 0x9BEB, 0x9BEF, 0x9BF3, 0x9BF7, 0x9BF8 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9BF9, 0x9BFA, 0x9BFD, 0x9BFF, 0x9C00, 0x9C02, 0x9C0B, /* 0x20 */
+ 0x9C0F, 0x9C11, 0x9C16, 0x9C18, 0x9C19, 0x9C1A, 0x9C1C, 0x9C1E, /* 0x20 */
+ 0x9C22, 0x9C23, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, 0x9C31, /* 0x30 */
+ 0x9C35, 0x9C36, 0x9C37, 0x9C3D, 0x9C41, 0x9C43, 0x9C44, 0x9C45, /* 0x30 */
+ 0x9C49, 0x9C4A, 0x9C4E, 0x9C4F, 0x9C50, 0x9C53, 0x9C54, 0x9C56, /* 0x40 */
+ 0x9C58, 0x9C5B, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C63, 0x9C69, 0x9C6A, /* 0x40 */
+ 0x9C5C, 0x9C6B, 0x9C68, 0x9C6E, 0x9C70, 0x9C72, 0x9C75, 0x9C77, /* 0x50 */
+ 0x9C7B, 0x9CE6, 0x9CF2, 0x9CF7, 0x9CF9, 0x9D0B, 0x9D02, 0x9D11, /* 0x50 */
+ 0x9D17, 0x9D18, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D2F, 0x9D30, 0x9D32, /* 0x60 */
+ 0x9D33, 0x9D34, 0x9D3A, 0x9D3C, 0x9D45, 0x9D3D, 0x9D42, 0x9D43, /* 0x60 */
+ 0x9D47, 0x9D4A, 0x9D53, 0x9D54, 0x9D5F, 0x9D63, 0x9D62, 0x9D65, /* 0x70 */
+ 0x9D69, 0x9D6A, 0x9D6B, 0x9D70, 0x9D76, 0x9D77, 0x9D7B /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9D7C, 0x9D7E, 0x9D83, 0x9D84, 0x9D86, 0x9D8A, 0x9D8D, /* 0x20 */
+ 0x9D8E, 0x9D92, 0x9D93, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9DA1, /* 0x20 */
+ 0x9DAA, 0x9DAC, 0x9DAE, 0x9DB1, 0x9DB5, 0x9DB9, 0x9DBC, 0x9DBF, /* 0x30 */
+ 0x9DC3, 0x9DC7, 0x9DC9, 0x9DCA, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, /* 0x30 */
+ 0x9DDA, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE5, 0x9DE7, 0x9DE9, 0x9DEB, /* 0x40 */
+ 0x9DEE, 0x9DF0, 0x9DF3, 0x9DF4, 0x9DFE, 0x9E0A, 0x9E02, 0x9E07, /* 0x40 */
+ 0x9E0E, 0x9E10, 0x9E11, 0x9E12, 0x9E15, 0x9E16, 0x9E19, 0x9E1C, /* 0x50 */
+ 0x9E1D, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E80, 0x9E82, 0x9E83, 0x9E84, /* 0x50 */
+ 0x9E85, 0x9E87, 0x9E8E, 0x9E8F, 0x9E96, 0x9E98, 0x9E9B, 0x9E9E, /* 0x60 */
+ 0x9EA4, 0x9EA8, 0x9EAC, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB3, 0x9EB4, /* 0x60 */
+ 0x9EB5, 0x9EC6, 0x9EC8, 0x9ECB, 0x9ED5, 0x9EDF, 0x9EE4, 0x9EE7, /* 0x70 */
+ 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, 0x9EF5 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JIS0212_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9EF8, 0x9EFF, 0x9F02, 0x9F03, 0x9F09, 0x9F0F, 0x9F10, /* 0x20 */
+ 0x9F11, 0x9F12, 0x9F14, 0x9F16, 0x9F17, 0x9F19, 0x9F1A, 0x9F1B, /* 0x20 */
+ 0x9F1F, 0x9F22, 0x9F26, 0x9F2A, 0x9F2B, 0x9F2F, 0x9F31, 0x9F32, /* 0x30 */
+ 0x9F34, 0x9F37, 0x9F39, 0x9F3A, 0x9F3C, 0x9F3D, 0x9F3F, 0x9F41, /* 0x30 */
+ 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0x9F47, 0x9F53, 0x9F55, 0x9F56, /* 0x40 */
+ 0x9F57, 0x9F58, 0x9F5A, 0x9F5D, 0x9F5E, 0x9F68, 0x9F69, 0x9F6D, /* 0x40 */
+ 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F75, 0x9F7A, 0x9F7D, /* 0x50 */
+ 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F94, 0x9F96, 0x9F97, 0x9F9E, /* 0x50 */
+ 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA5 /* 0x60 */
+ /* 0x60 */
+};
diff --git a/sal/textenc/tcvtjp4.tab b/sal/textenc/tcvtjp4.tab
new file mode 100644
index 000000000000..93165e0c99d2
--- /dev/null
+++ b/sal/textenc/tcvtjp4.tab
@@ -0,0 +1,3585 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the UniCode to DBCS tables for the following */
+/* japanese charsets: JIS201, JIS208 */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2171, 0x2172, 0, 0, 0, 0x2178, /* 0xA0 */
+ 0x212F, 0, 0, 0, 0x224C, 0, 0, 0, /* 0xA0 */
+ 0x216B, 0x215E, 0, 0, 0x212D, 0, 0x2279, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x215F, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x2160, /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_03[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, /* 0x90 */
+ 0x2628, 0x2629, 0x262A, 0x262B, 0x262C, 0x262D, 0x262E, 0x262F, /* 0x90 */
+ 0x2630, 0x2631, 0, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, /* 0xA0 */
+ 0x2637, 0x2638, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, /* 0xB0 */
+ 0x2648, 0x2649, 0x264A, 0x264B, 0x264C, 0x264D, 0x264E, 0x264F, /* 0xB0 */
+ 0x2650, 0x2651, 0, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, /* 0xC0 */
+ 0x2657, 0x2658 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_04[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2727, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729, /* 0x10 */
+ 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F, 0x2730, 0x2731, /* 0x10 */
+ 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, /* 0x20 */
+ 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F, 0x2740, 0x2741, /* 0x20 */
+ 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759, /* 0x30 */
+ 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0x275F, 0x2760, 0x2761, /* 0x30 */
+ 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, /* 0x40 */
+ 0x276A, 0x276B, 0x276C, 0x276D, 0x276E, 0x276F, 0x2770, 0x2771, /* 0x40 */
+ 0, 0x2757 /* 0x50 */
+ /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_20[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x213E, 0, 0, 0, 0, 0x213D, 0x2142, 0, /* 0x10 */
+ 0x2146, 0x2147, 0, 0, 0x2148, 0x2149, 0, 0, /* 0x10 */
+ 0x2277, 0x2278, 0, 0, 0, 0x2145, 0x2144, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x2273, 0, 0x216C, 0x216D, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x2228 /* 0x30 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x216E, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x2D62, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x2D64, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x2272, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x2D35, 0x2D36, 0x2D37, 0x2D38, 0x2D39, 0x2D3A, 0x2D3B, 0x2D3C, /* 0x60 */
+ 0x2D3D, 0x2D3E, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x222B, 0x222C, 0x222A, 0x222D, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x224D, 0, 0x224E /* 0xD0 */
+ /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x224F, 0, 0x225F, 0x2250, 0, 0, 0, 0x2260, /* 0x00 */
+ 0x223A, 0, 0, 0x223B, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x2D74, 0x215D, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x2265, 0, 0, 0x2267, 0x2167, 0x2D78, /* 0x10 */
+ 0x225C, 0, 0, 0, 0, 0, 0, 0x224A, /* 0x20 */
+ 0x224B, 0x2241, 0x2240, 0x2269, 0x226A, 0, 0x2D73, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x2168, 0x2268, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x2266, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x2262, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x2162, 0x2261, 0, 0, 0, 0, 0x2165, 0x2166, /* 0x60 */
+ 0, 0, 0x2263, 0x2264, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x223E, 0x223F, 0, 0, 0x223C, 0x223D, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x225D, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x2D79 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_23[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x225E /* 0x10 */
+ /* 0x10 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_24[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2D21, 0x2D22, 0x2D23, 0x2D24, 0x2D25, 0x2D26, 0x2D27, 0x2D28, /* 0x60 */
+ 0x2D29, 0x2D2A, 0x2D2B, 0x2D2C, 0x2D2D, 0x2D2E, 0x2D2F, 0x2D30, /* 0x60 */
+ 0x2D31, 0x2D32, 0x2D33, 0x2D34 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_25[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2821, 0x282C, 0x2822, 0x282D, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x2823, 0, 0, 0x282E, /* 0x00 */
+ 0x2824, 0, 0, 0x282F, 0x2826, 0, 0, 0x2831, /* 0x10 */
+ 0x2825, 0, 0, 0x2830, 0x2827, 0x283C, 0, 0, /* 0x10 */
+ 0x2837, 0, 0, 0x2832, 0x2829, 0x283E, 0, 0, /* 0x20 */
+ 0x2839, 0, 0, 0x2834, 0x2828, 0, 0, 0x2838, /* 0x20 */
+ 0x283D, 0, 0, 0x2833, 0x282A, 0, 0, 0x283A, /* 0x30 */
+ 0x283F, 0, 0, 0x2835, 0x282B, 0, 0, 0x283B, /* 0x30 */
+ 0, 0, 0x2840, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x2836, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x2223, 0x2222, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x2225, 0x2224, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x2227, 0x2226, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x2221, 0x217E, /* 0xC0 */
+ 0, 0, 0, 0x217B, 0, 0, 0x217D, 0x217C, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x227E /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x217A, 0x2179, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x216A, 0, 0x2169, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x2276, 0, 0, 0x2275, 0, 0x2274 /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2121, 0x2122, 0x2123, 0x2137, 0, 0x2139, 0x213A, 0x213B, /* 0x00 */
+ 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, /* 0x00 */
+ 0x215A, 0x215B, 0x2229, 0x222E, 0x214C, 0x214D, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x2141, 0x2D60, 0, 0x2D61, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, /* 0x40 */
+ 0x2428, 0x2429, 0x242A, 0x242B, 0x242C, 0x242D, 0x242E, 0x242F, /* 0x40 */
+ 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, /* 0x50 */
+ 0x2438, 0x2439, 0x243A, 0x243B, 0x243C, 0x243D, 0x243E, 0x243F, /* 0x50 */
+ 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, /* 0x60 */
+ 0x2448, 0x2449, 0x244A, 0x244B, 0x244C, 0x244D, 0x244E, 0x244F, /* 0x60 */
+ 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, /* 0x70 */
+ 0x2458, 0x2459, 0x245A, 0x245B, 0x245C, 0x245D, 0x245E, 0x245F, /* 0x70 */
+ 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, /* 0x80 */
+ 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x246F, /* 0x80 */
+ 0x2470, 0x2471, 0x2472, 0x2473, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x212B, 0x212C, 0x2135, 0x2136, 0, /* 0x90 */
+ 0, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, /* 0xA0 */
+ 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, /* 0xA0 */
+ 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, /* 0xB0 */
+ 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, /* 0xB0 */
+ 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, /* 0xC0 */
+ 0x2548, 0x2549, 0x254A, 0x254B, 0x254C, 0x254D, 0x254E, 0x254F, /* 0xC0 */
+ 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, /* 0xD0 */
+ 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, /* 0xD0 */
+ 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, /* 0xE0 */
+ 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, /* 0xE0 */
+ 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0, /* 0xF0 */
+ 0, 0, 0, 0x2126, 0x213C, 0x2133, 0x2134 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2D6A, 0x2D6B, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x2D6C, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x2D65, 0x2D66, 0x2D67, 0x2D68, /* 0xA0 */
+ 0x2D69 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2D46, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x2D4A, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x2D41, 0, 0, 0, /* 0x10 */
+ 0x2D44, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x2D42, 0x2D4C, 0, 0, 0x2D4B, 0x2D45, /* 0x20 */
+ 0, 0, 0, 0x2D4D, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x2D47, 0, /* 0x30 */
+ 0, 0, 0, 0x2D4F, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x2D40, 0x2D4E, 0, 0, 0x2D43, 0, 0, /* 0x40 */
+ 0, 0x2D48, 0, 0, 0, 0, 0, 0x2D49, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x2D5F, 0x2D6F, 0x2D6E, 0x2D6D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x2D53, 0x2D54, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x2D50, 0x2D51, 0x2D52, 0, /* 0x90 */
+ 0, 0x2D56, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x2D55, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x2D63 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x306C, 0x437A, 0, 0x3C37, 0, 0, 0, 0x4B7C, /* 0x00 */
+ 0x3E66, 0x3B30, 0x3E65, 0x323C, 0, 0x4954, 0x4D3F, 0, /* 0x00 */
+ 0x5022, 0x312F, 0, 0, 0x336E, 0x5023, 0x4024, 0x5242, /* 0x10 */
+ 0x3556, 0x4A3A, 0, 0, 0, 0, 0x3E67, 0, /* 0x10 */
+ 0, 0x4E3E, 0, 0, 0, 0, 0x4A42, 0, /* 0x20 */
+ 0, 0, 0x5024, 0, 0, 0x4366, 0, 0, /* 0x20 */
+ 0, 0x5025, 0x367A, 0, 0, 0, 0x5026, 0, /* 0x30 */
+ 0x345D, 0x4330, 0, 0x3C67, 0x5027, 0, 0, 0x5028, /* 0x30 */
+ 0, 0, 0x5029, 0x4735, 0, 0x3557, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x4737, 0, 0x4663, 0x3843, 0x4B33, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x6949, 0x502A, 0x3E68, /* 0x50 */
+ 0x502B, 0x3235, 0, 0, 0, 0x3665, 0x3870, 0x4C69, /* 0x50 */
+ 0, 0, 0x5626, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x4D70, 0, 0x467D, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x3425, 0, /* 0x70 */
+ 0x3535, 0, 0x502C, 0, 0, 0x502D, 0x4E3B, 0, /* 0x80 */
+ 0x4D3D, 0x4168, 0x502F, 0x3B76, 0x4673, 0, 0x5032, 0, /* 0x80 */
+ 0, 0x313E, 0x385F, 0, 0x385E, 0x3066, 0, 0, /* 0x90 */
+ 0x4F4B, 0x4F4A, 0, 0x3A33, 0x3021, 0, 0x5033, 0x5034, /* 0x90 */
+ 0x5035, 0x4B34, 0x5036, 0, 0x3872, 0x3067, 0x4B72, 0, /* 0xA0 */
+ 0x357C, 0, 0, 0x357D, 0x357E, 0x4462, 0x4E3C, 0, /* 0xA0 */
+ 0x5037, 0, 0, 0x5038, 0, 0, 0x5039, 0, /* 0xB0 */
+ 0, 0, 0x3F4D, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x3D3A, 0x3F4E, 0x503E, 0, 0x503C, 0, 0x503D, 0x3558, /* 0xC0 */
+ 0, 0, 0x3A23, 0x3270, 0, 0x503B, 0x503A, 0x4A29, /* 0xC0 */
+ 0, 0, 0, 0, 0x3B46, 0x3B45, 0x423E, 0x503F, /* 0xD0 */
+ 0x4955, 0x4067, 0, 0, 0, 0x2138, 0x5040, 0x5042, /* 0xD0 */
+ 0, 0, 0, 0x4265, 0x4E61, 0x304A, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x5041, 0x323E, 0, /* 0xE0 */
+ 0x3644, 0, 0x4367, 0, 0, 0, 0x376F, 0x5043, /* 0xF0 */
+ 0, 0, 0, 0x4724 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x346B, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x5044, 0x304B, 0, 0, 0x3860, 0x346C, 0x497A, /* 0x00 */
+ 0x4832, 0x3559, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x3271, 0, 0x5067, 0x4541, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0x476C, /* 0x20 */
+ 0x5046, 0, 0, 0, 0x483C, 0, 0x4E62, 0, /* 0x30 */
+ 0x3F2D, 0, 0x3B47, 0, 0x3B77, 0x3240, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x4451, 0, 0, 0x4322, 0x504A, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x304C, 0x4463, 0x3D3B, /* 0x40 */
+ 0x3A34, 0x4D24, 0, 0x424E, 0, 0x323F, 0, 0x5049, /* 0x50 */
+ 0, 0x4D3E, 0x5045, 0x5047, 0x3A6E, 0x5048, 0x5524, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x5050, 0, 0, 0, 0, 0, 0x5053, /* 0x60 */
+ 0x5051, 0, 0, 0x3242, 0, 0x4A3B, 0x504B, 0, /* 0x70 */
+ 0, 0, 0, 0x504F, 0x3873, 0, 0, 0x3B48, /* 0x70 */
+ 0, 0, 0, 0x3426, 0, 0, 0x5054, 0, /* 0x80 */
+ 0x504C, 0, 0, 0x4E63, 0, 0x3B78, 0, 0x504D, /* 0x80 */
+ 0, 0x5052, 0, 0, 0, 0, 0x5055, 0, /* 0x90 */
+ 0x504E, 0, 0, 0x3621, 0, 0x304D, 0, 0, /* 0x90 */
+ 0x3622, 0x3241, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x5525, 0, 0x4B79, 0x496E, 0x3874, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x3F2F, 0x4E37, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4A58, /* 0xB0 */
+ 0, 0, 0x3738, 0x4225, 0x3264, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x3D53, 0, 0, 0, 0x5059, 0, /* 0xC0 */
+ 0x505E, 0x505C, 0, 0, 0x5057, 0, 0, 0x422F, /* 0xD0 */
+ 0x505A, 0, 0x505D, 0x505B, 0, 0x4A5D, 0, 0x5058, /* 0xD0 */
+ 0, 0x3F2E, 0, 0x4B73, 0x505F, 0x5060, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x3D24, 0x506D, /* 0xE0 */
+ 0, 0, 0, 0x4750, 0, 0x4936, 0x5068, 0, /* 0xF0 */
+ 0x4A70, 0, 0x3236, 0, 0, 0, 0x506C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5066, 0x506F, 0, /* 0x00 */
+ 0, 0x4152, 0, 0x3844, 0, 0x475C, 0, 0x6047, /* 0x00 */
+ 0, 0x506E, 0x455D, 0, 0x5063, 0, 0x3876, 0, /* 0x10 */
+ 0, 0x3875, 0x5061, 0, 0, 0, 0, 0x3C5A, /* 0x10 */
+ 0, 0x5069, 0, 0x4A6F, 0x434D, 0x5065, 0x3771, 0, /* 0x20 */
+ 0x5062, 0x506A, 0x5064, 0x4E51, 0x506B, 0x4F41, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x3666, 0, /* 0x30 */
+ 0, 0x3770, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x5070, 0, 0, 0, 0x5071, /* 0x40 */
+ 0x5075, 0x304E, 0, 0, 0, 0, 0, 0x4A50, /* 0x40 */
+ 0x5074, 0, 0, 0, 0, 0x5073, 0x5077, 0, /* 0x50 */
+ 0, 0, 0x5076, 0, 0x4464, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x3772, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x5078, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x3C45, 0, 0x4226, 0x4465, 0x3676, 0, /* 0x70 */
+ 0x5079, 0, 0, 0, 0, 0x3536, 0, 0, /* 0x70 */
+ 0x507A, 0, 0, 0, 0, 0x507C, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x4B35, 0, 0, /* 0x80 */
+ 0, 0x3766, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x3B31, 0x4877, 0x507B, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x3A45, 0x4D43, 0, 0, /* 0xA0 */
+ 0, 0, 0x507E, 0x5123, 0x507D, 0x3A44, 0, 0x3D7D, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x3739, 0, /* 0xB0 */
+ 0, 0, 0x5124, 0, 0, 0x364F, 0, 0, /* 0xC0 */
+ 0, 0x5121, 0x5122, 0, 0, 0x462F, 0, 0x417C, /* 0xC0 */
+ 0, 0x3623, 0, 0, 0, 0x4B4D, 0x5125, 0, /* 0xD0 */
+ 0, 0, 0x4E3D, 0, 0, 0, 0x5126, 0, /* 0xD0 */
+ 0, 0, 0, 0x5129, 0, 0x5127, 0, 0x414E, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x5128, 0x512A, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x512C, 0, 0, /* 0xF0 */
+ 0, 0x512B, 0, 0x4A48 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3537, 0x512E, 0x512F, 0, 0x322F, 0, 0, 0, /* 0x00 */
+ 0, 0x512D, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x3C74, 0, 0x5132, 0x5131, 0x5130, 0, /* 0x10 */
+ 0x5056, 0, 0x5133, 0, 0, 0, 0, 0x3D7E, /* 0x10 */
+ 0, 0x5134, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x4D25, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x4C59, 0, 0, 0, 0, 0x5136, /* 0x30 */
+ 0, 0, 0x5135, 0x5138, 0x5137, 0, 0, 0x5139, /* 0x30 */
+ 0x513A, 0x3074, 0, 0x3835, 0x373B, 0x3D3C, 0x437B, 0x3624, /* 0x40 */
+ 0x4068, 0x3877, 0, 0x396E, 0x513C, 0x4C48, 0x4546, 0, /* 0x40 */
+ 0x3B79, 0, 0x513B, 0, 0x513D, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x455E, 0, 0x3375, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x513E, 0, 0, 0x467E, 0, 0, /* 0x60 */
+ 0x4134, 0x5140, 0x5141, 0x482C, 0x3878, 0x4F3B, 0x5142, 0, /* 0x60 */
+ 0, 0x3626, 0, 0, 0, 0x4A3C, 0x4236, 0x3671, /* 0x70 */
+ 0x4535, 0, 0, 0, 0x3773, 0, 0, 0, /* 0x70 */
+ 0x5143, 0, 0x5144, 0, 0, 0x4662, 0x315F, 0, /* 0x80 */
+ 0, 0x5147, 0x3A7D, 0, 0x5146, 0x3A46, 0, 0x5148, /* 0x80 */
+ 0x666E, 0x5149, 0x4B41, 0x514A, 0, 0x514B, 0x514C, 0x3E69, /* 0x90 */
+ 0, 0x3C4C, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x3427, 0, 0x514F, 0, 0x514D, 0x4C3D, 0x514E, 0, /* 0xA0 */
+ 0x495A, 0x5150, 0x5151, 0x5152, 0x455F, 0, 0, 0, /* 0xA0 */
+ 0x5156, 0x5154, 0x5155, 0x5153, 0x3A63, 0x5157, 0x4C6A, 0x4E64, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x5158, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x4028, 0x5159, 0x3D5A, 0, /* 0xC0 */
+ 0, 0x515A, 0, 0x437C, 0x4E3F, 0x4560, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x5245, 0, /* 0xD0 */
+ 0, 0, 0, 0x515B, 0x7425, 0x3645, 0, 0, /* 0xD0 */
+ 0x515C, 0x4B5E, 0, 0, 0, 0, 0x3D68, 0x427C, /* 0xE0 */
+ 0, 0x515E, 0x4664, 0, 0, 0x515F, 0, 0, /* 0xE0 */
+ 0x5160, 0x332E, 0, 0, 0, 0x5161, 0x3627, 0, /* 0xF0 */
+ 0x464C, 0x317A, 0x3D50, 0, 0, 0x4821, 0x5162 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4561, 0, 0, 0x3F4F, 0x5163, 0, 0x4A2C, 0x405A, /* 0x00 */
+ 0x3422, 0, 0x3429, 0x5164, 0, 0, 0x5166, 0, /* 0x00 */
+ 0, 0x373A, 0, 0, 0x5165, 0, 0, 0x4E73, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x3D69, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x483D, 0x4A4C, 0, 0x5167, /* 0x20 */
+ 0, 0x4D78, 0x5168, 0, 0, 0, 0x5169, 0, /* 0x20 */
+ 0x457E, 0, 0, 0x516A, 0, 0, 0x4029, 0x3A7E, /* 0x30 */
+ 0x3774, 0x516B, 0x3B49, 0x396F, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x4466, 0x516D, 0, 0, 0x4227, /* 0x40 */
+ 0, 0, 0x3A6F, 0x516E, 0x516F, 0x4130, 0, 0x516C, /* 0x40 */
+ 0, 0, 0, 0, 0x5171, 0, 0x4B36, 0, /* 0x50 */
+ 0, 0, 0, 0x3964, 0, 0, 0x5170, 0, /* 0x50 */
+ 0, 0, 0, 0x3775, 0x3A5E, 0x476D, 0, 0, /* 0x60 */
+ 0, 0x5174, 0x5172, 0, 0, 0, 0, 0x497B, /* 0x60 */
+ 0x3E6A, 0x517B, 0x3364, 0x5175, 0x5173, 0x414F, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x5177, 0, 0x5176, /* 0x70 */
+ 0, 0, 0, 0x3344, 0, 0, 0, 0x3760, /* 0x80 */
+ 0x517C, 0x4E2D, 0, 0, 0, 0x5178, 0, 0, /* 0x80 */
+ 0, 0x517D, 0x517A, 0, 0x5179, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x4E4F, 0, 0, 0, 0x3879, /* 0x90 */
+ 0x3243, 0, 0, 0x4E74, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x3D75, 0x4558, 0x3965, 0x5222, 0x5223, 0, 0, /* 0xA0 */
+ 0, 0x4E65, 0, 0, 0x4F2B, 0x5225, 0, 0, /* 0xB0 */
+ 0, 0x387A, 0, 0, 0x5224, 0, 0x332F, 0, /* 0xB0 */
+ 0, 0x5226, 0, 0x4B56, 0, 0x443C, 0, 0x4D26, /* 0xC0 */
+ 0, 0x4A59, 0, 0, 0, 0x5227, 0, 0, /* 0xC0 */
+ 0, 0, 0x7055, 0, 0, 0x4630, 0, 0x5228, /* 0xD0 */
+ 0x342A, 0x4C33, 0, 0, 0, 0x3E21, 0x5229, 0x4A67, /* 0xD0 */
+ 0x522D, 0, 0x402A, 0x522A, 0x3650, 0, 0x522B, 0x342B, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x372E, 0x522E, 0, 0x522F, 0, 0, /* 0xF0 */
+ 0x5230, 0x5231, 0x3C5B, 0, 0, 0, 0x387B, 0x4C5E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4C68, 0x4677, 0, 0, 0x4A71, 0x5232, 0, /* 0x00 */
+ 0x5233, 0, 0, 0, 0, 0x5235, 0, 0x5237, /* 0x00 */
+ 0x5236, 0, 0, 0, 0, 0x5238, 0x323D, 0x4B4C, /* 0x10 */
+ 0, 0x3A7C, 0x5239, 0, 0, 0x4159, 0, 0, /* 0x10 */
+ 0x3E22, 0x3629, 0, 0x523A, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x485B, 0, 0, 0, 0, 0x523B, /* 0x20 */
+ 0, 0x523C, 0, 0x523D, 0, 0, 0, 0, /* 0x30 */
+ 0x523E, 0x4924, 0x3668, 0x3065, 0, 0, 0, 0x463F, /* 0x30 */
+ 0x523F, 0x3D3D, 0, 0x4069, 0, 0x5241, 0x5240, 0x3E23, /* 0x40 */
+ 0x3861, 0x5243, 0x483E, 0, 0, 0x5244, 0, 0, /* 0x40 */
+ 0, 0x485C, 0x4234, 0x426E, 0x3628, 0, 0, 0x466E, /* 0x50 */
+ 0x4331, 0, 0x476E, 0, 0x4B4E, 0, 0x5246, 0, /* 0x50 */
+ 0x406A, 0, 0, 0, 0, 0, 0x3735, 0, /* 0x60 */
+ 0, 0x5247, 0, 0, 0, 0, 0x5248, 0x312C, /* 0x60 */
+ 0x3075, 0x346D, 0, 0x4228, 0x3551, 0x4D71, 0, 0x524B, /* 0x70 */
+ 0x3237, 0, 0, 0x524A, 0, 0, 0, 0x362A, /* 0x70 */
+ 0, 0, 0x524C, 0, 0x4C71, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x524D, 0, /* 0x90 */
+ 0x4E52, 0, 0x387C, 0, 0, 0, 0, 0x3836, /* 0x90 */
+ 0x524E, 0, 0, 0, 0, 0x5250, 0x524F, 0, /* 0xA0 */
+ 0x3F5F, 0x3139, 0, 0, 0, 0x315E, 0x5251, 0, /* 0xA0 */
+ 0x5252, 0, 0, 0x3837, 0, 0, 0x5253, 0, /* 0xB0 */
+ 0, 0, 0, 0x356E, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x3B32, 0x5254, 0, 0, 0, 0, /* 0xC0 */
+ 0x4B74, 0x3A35, 0x355A, 0x4D27, 0x4150, 0x483F, 0x3C7D, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x3D47, 0, 0x3C68, 0x3C75, /* 0xD0 */
+ 0, 0x3D76, 0, 0x4840, 0, 0, 0, 0x5257, /* 0xD0 */
+ 0, 0x3143, 0x4151, 0x387D, 0x3845, 0x3667, 0, 0, /* 0xE0 */
+ 0x525B, 0x4321, 0x427E, 0x362B, 0x3E24, 0x525C, 0x525A, 0x3244, /* 0xE0 */
+ 0x4266, 0x3C38, 0x3B4B, 0x3126, 0, 0, 0x3370, 0x3966, /* 0xF0 */
+ 0x3B4A, 0, 0x525D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x525E, 0, 0x3549, 0x3346, 0, 0, 0, /* 0x00 */
+ 0x3967, 0x3548, 0x445F, 0x3125, 0x4631, 0x4C3E, 0x3921, 0x4D79, /* 0x00 */
+ 0x4547, 0x387E, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x372F, 0, 0x5267, 0, 0x3663, /* 0x10 */
+ 0x4B4A, 0, 0, 0, 0, 0, 0x485D, 0, /* 0x20 */
+ 0, 0x5266, 0, 0x345E, 0x5261, 0x5262, 0x5264, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x5265, 0, /* 0x30 */
+ 0x355B, 0x3F61, 0, 0x4A2D, 0x5263, 0x525F, 0x3863, 0, /* 0x30 */
+ 0x5260, 0, 0x4F24, 0, 0, 0, 0x4A72, 0, /* 0x40 */
+ 0x4468, 0x3862, 0x3970, 0, 0, 0, 0x5268, 0, /* 0x40 */
+ 0, 0x465D, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x526C, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x3C7E, 0, 0x3C76, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x526F, 0x526D, 0, 0x4C23, 0, 0x526A, 0x5273, 0x526E, /* 0x70 */
+ 0, 0, 0, 0x5271, 0x3846, 0x4C3F, 0, 0, /* 0x70 */
+ 0x5272, 0, 0, 0, 0x5274, 0, 0x5276, 0, /* 0x80 */
+ 0, 0, 0, 0x3A70, 0x4F42, 0, 0x526B, 0x5269, /* 0x80 */
+ 0x5275, 0, 0x5270, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x5278, 0, 0x5323, 0x527A, 0, 0, /* 0xA0 */
+ 0x527E, 0, 0, 0x5321, 0x527B, 0, 0, 0x533E, /* 0xA0 */
+ 0, 0, 0x3A69, 0x3331, 0, 0, 0, 0, /* 0xB0 */
+ 0x5279, 0, 0, 0, 0x5325, 0x3076, 0x5324, 0, /* 0xB0 */
+ 0x3025, 0x494A, 0x5322, 0, 0x527C, 0, 0, 0x5277, /* 0xC0 */
+ 0x527D, 0x3A48, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x5326, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x3077, 0x532F, 0, 0, 0x5327, 0x5328, 0, /* 0xE0 */
+ 0x3E25, 0x4B69, 0, 0, 0, 0x532D, 0x532C, 0, /* 0xE0 */
+ 0, 0, 0x452F, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x532E, 0, 0, 0x532B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3134, 0, 0x3A36, 0x3F30, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5329, /* 0x00 */
+ 0x4562, 0, 0, 0, 0x532A, 0, 0x3022, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x5334, 0x4D23, /* 0x20 */
+ 0, 0x3E27, 0, 0x533A, 0, 0, 0, 0, /* 0x30 */
+ 0x5339, 0x5330, 0, 0, 0, 0, 0x4243, 0, /* 0x30 */
+ 0x5331, 0, 0, 0, 0x426F, 0x5336, 0x3E26, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x5333, 0, 0, 0x4C64, /* 0x40 */
+ 0, 0, 0, 0x373C, 0, 0, 0x5337, 0x5338, /* 0x50 */
+ 0, 0, 0, 0, 0x5335, 0x533B, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x5332, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x5341, 0x5346, 0, 0x5342, 0, /* 0x70 */
+ 0x533D, 0, 0, 0x5347, 0x4131, 0, 0, 0x5349, /* 0x80 */
+ 0, 0x3922, 0x533F, 0x437D, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x5343, 0x533C, 0x342D, 0, 0x346E, 0x3365, 0x5344, 0x5340, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3776, /* 0xA0 */
+ 0x534A, 0x5348, 0x4153, 0x354A, 0x362C, 0, 0x5345, 0, /* 0xA0 */
+ 0x3674, 0, 0, 0, 0, 0, 0x3144, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x534E, 0x534C, 0, 0x5427, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x5351, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x534B, 0, 0x534F, 0, 0, 0x534D, /* 0xD0 */
+ 0, 0, 0, 0x3B4C, 0x5350, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5353, /* 0xF0 */
+ 0, 0x5358, 0, 0, 0, 0x5356, 0x5355 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4332, 0, /* 0x00 */
+ 0, 0x3245, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x5352, 0, 0x5354, 0x3E28, /* 0x10 */
+ 0x3133, 0, 0, 0x5357, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x325E, 0, 0, 0, 0, 0, 0x5362, /* 0x20 */
+ 0, 0x3E7C, 0x535E, 0, 0x535C, 0, 0x535D, 0, /* 0x30 */
+ 0x535F, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x313D, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x4139, 0, 0x5359, 0, /* 0x40 */
+ 0x535A, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x337A, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x5361, 0, 0, 0, /* 0x60 */
+ 0x346F, 0, 0x5364, 0x5360, 0x5363, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x4A2E, 0, 0, 0, /* 0x70 */
+ 0x4655, 0, 0x4838, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x5366, 0, 0, 0, 0, 0, 0x5365, 0x3345, /* 0x80 */
+ 0, 0, 0x5367, 0, 0, 0, 0, 0x536A, /* 0x80 */
+ 0, 0, 0, 0, 0x5369, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x5368, 0, 0x4739, 0, 0, 0x536B, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x536C, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x536E, 0, 0x536D, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x5370, 0, 0, 0, /* 0xB0 */
+ 0x5373, 0x5371, 0x536F, 0x5372, 0, 0, 0, 0, /* 0xC0 */
+ 0x5374, 0, 0, 0, 0, 0, 0x5375, 0, /* 0xC0 */
+ 0, 0x5376, 0, 0x5377, 0, 0, 0, 0x5378, /* 0xD0 */
+ 0x5145, 0, 0x3C7C, 0x3B4D, 0, 0, 0x3273, 0, /* 0xD0 */
+ 0x3078, 0, 0, 0x4344, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x5379, 0, /* 0xE0 */
+ 0x3A24, 0, 0x304F, 0x3F5E, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x537A, 0x3847, 0, 0, 0x3971, 0, 0x537C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x537B, 0, 0, 0x4A60, 0x537D, 0, 0, 0, /* 0x00 */
+ 0x5421, 0x537E, 0, 0x5422, 0, 0x5423, 0, 0x3777, /* 0x00 */
+ 0, 0, 0x3160, 0x5424, 0, 0, 0x5426, 0, /* 0x10 */
+ 0x5425, 0, 0, 0, 0x5428, 0, 0, 0x455A, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x5429, 0x3035, /* 0x20 */
+ 0x3A5F, 0, 0, 0, 0, 0x373D, 0, 0, /* 0x20 */
+ 0x434F, 0, 0, 0, 0, 0, 0, 0x542A, /* 0x30 */
+ 0x542B, 0, 0, 0x542D, 0, 0, 0, 0, /* 0x30 */
+ 0x542E, 0, 0x3A64, 0, 0, 0, 0, 0x3651, /* 0x40 */
+ 0, 0, 0x4B37, 0, 0, 0, 0x542C, 0x542F, /* 0x40 */
+ 0x3A41, 0x3923, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x5433, 0, 0, 0x3A25, 0, 0x4333, 0, /* 0x60 */
+ 0, 0x5430, 0x445A, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5434, /* 0x70 */
+ 0, 0, 0x3F62, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x5432, 0x5435, 0, 0x373F, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x5436, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x5437, 0, 0x3924, 0x3340, 0x5439, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x543A, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x543B, 0, 0, 0x5438, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x5431, 0, 0, 0x543C, 0, 0, 0x543D, 0, /* 0xC0 */
+ 0, 0, 0, 0x4B64, 0, 0, 0x3E6B, 0, /* 0xC0 */
+ 0, 0, 0x543F, 0x5440, 0x543E, 0, 0x5442, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x4738, 0, 0, 0x3068, /* 0xD0 */
+ 0x4956, 0, 0, 0x5443, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x3E7D, 0, 0, 0x3C39, /* 0xF0 */
+ 0, 0x475D, 0x3470, 0, 0x3A6B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4B59, 0, 0x4632, 0, 0, 0x3778, 0x424F, 0, /* 0x00 */
+ 0, 0, 0x5441, 0x5444, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x4244, 0, 0, /* 0x10 */
+ 0, 0x5445, 0, 0, 0, 0x5446, 0, 0, /* 0x10 */
+ 0, 0x5448, 0, 0, 0x4469, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x342E, 0, 0, 0, 0, 0x7421, /* 0x20 */
+ 0x3161, 0x4A73, 0, 0, 0x3E6C, 0x4548, 0, 0, /* 0x30 */
+ 0, 0, 0x3A66, 0, 0, 0x544E, 0, 0, /* 0x30 */
+ 0x4A3D, 0x4E5D, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x3274, 0x544A, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x413A, 0x544D, 0, 0x4563, 0, 0, 0x4549, /* 0x50 */
+ 0x4564, 0x4839, 0x444D, 0, 0, 0, 0x3A49, 0, /* 0x50 */
+ 0, 0, 0x5449, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x3176, 0, 0x4536, 0, 0, 0, 0, /* 0x60 */
+ 0x544B, 0, 0x5447, 0, 0, 0x3F50, 0, 0, /* 0x70 */
+ 0, 0x544F, 0, 0, 0, 0, 0x3D4E, 0, /* 0x70 */
+ 0, 0, 0, 0x362D, 0, 0x5450, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x4A68, 0, 0, 0, 0x417D, /* 0x90 */
+ 0, 0, 0, 0, 0x4446, 0, 0, 0x5452, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x4B4F, 0, 0, 0x5453, 0, 0, 0x5458, 0, /* 0xA0 */
+ 0, 0, 0, 0x4A2F, 0, 0, 0, 0, /* 0xB0 */
+ 0x5457, 0x5451, 0x5454, 0x5456, 0, 0, 0x3A26, 0, /* 0xB0 */
+ 0, 0x4A49, 0, 0, 0, 0x5459, 0, 0x4345, /* 0xC0 */
+ 0, 0, 0x3275, 0, 0x3E6D, 0, 0, 0, /* 0xC0 */
+ 0, 0x545B, 0, 0x545A, 0, 0x3968, 0, 0x545C, /* 0xD0 */
+ 0x545E, 0x545D, 0, 0, 0x5460, 0, 0x5455, 0x5462, /* 0xD0 */
+ 0, 0, 0, 0, 0x5461, 0x545F, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x3B4E, 0x3F51, 0, 0x4154, 0x5463, /* 0xE0 */
+ 0x403C, 0x306D, 0x4764, 0, 0, 0, 0, 0x445B, /* 0xF0 */
+ 0, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5469, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x4A51, 0x546A, 0, 0, 0, 0, 0x3246, /* 0x00 */
+ 0x546B, 0, 0, 0, 0, 0x4D3C, 0x3330, 0, /* 0x10 */
+ 0x5249, 0x3D48, 0x423F, 0x546C, 0x4C6B, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x4C34, 0, 0, 0x546E, 0, 0x4267, /* 0x20 */
+ 0, 0x4537, 0x4240, 0x4957, 0x546F, 0x5470, 0x317B, 0, /* 0x20 */
+ 0, 0x3C3A, 0x5471, 0, 0, 0, 0, 0x3050, /* 0x30 */
+ 0x5472, 0, 0, 0, 0, 0, 0x5473, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x3162, 0, 0, 0x3471, /* 0x40 */
+ 0x4660, 0x4A74, 0, 0, 0, 0, 0x5477, 0x4155, /* 0x40 */
+ 0x5476, 0x3740, 0, 0, 0x4B5B, 0x5475, 0, 0x4565, /* 0x50 */
+ 0x5479, 0, 0x5478, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x547B, 0, 0x547A, 0, 0, 0x317C, 0, 0x547C, /* 0x60 */
+ 0x3E29, 0x547E, 0x4325, 0, 0x547D, 0, 0x4A33, 0, /* 0x60 */
+ 0, 0, 0, 0x3D77, 0x455B, 0, 0, 0, /* 0x70 */
+ 0x5521, 0, 0, 0, 0, 0x3925, 0, 0, /* 0x70 */
+ 0, 0x5522, 0x4721, 0x485E, 0x4C51, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x4725, 0, 0, 0x552B, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x3538, 0, 0, 0x4D45, 0, /* 0x90 */
+ 0, 0x4C2F, 0, 0x562C, 0, 0x5523, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x5526, 0, 0x4245, 0, 0, /* 0xA0 */
+ 0x4B38, 0, 0, 0, 0x454A, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x5527, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x4B65, 0, 0x3A4A, 0, 0, 0x3E2A, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x5528, 0, /* 0xC0 */
+ 0, 0x3B50, 0, 0x3B4F, 0, 0, 0, 0, /* 0xC0 */
+ 0x3039, 0x3848, 0, 0x402B, 0x3051, 0, 0, 0, /* 0xD0 */
+ 0, 0x552C, 0x552D, 0, 0x552A, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x3138, 0x342F, 0, /* 0xE0 */
+ 0x5529, 0, 0x4C45, 0x4931, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x3028, 0, /* 0xF0 */
+ 0, 0, 0, 0x3079, 0, 0, 0, 0x3B51 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3052, 0, 0x3023, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x5532, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x5530, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x4C3C, 0, 0x5533, 0, 0x5531, 0, 0, 0x552F, /* 0x10 */
+ 0x3F31, 0, 0, 0, 0, 0x552E, 0, 0, /* 0x20 */
+ 0, 0x4A5A, 0, 0, 0, 0, 0, 0x3864, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x5537, 0x5538, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x3E2B, 0, 0, 0, /* 0x30 */
+ 0x5534, 0x4F2C, 0, 0, 0, 0, 0x474C, 0, /* 0x40 */
+ 0, 0x5536, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x3A27, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x5539, 0, 0, 0, 0x4958, 0, /* 0x60 */
+ 0, 0, 0x553A, 0, 0x5535, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4C3B, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x475E, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x553B, 0x4932, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x553C, 0x5540, 0x553D, 0, /* 0xB0 */
+ 0, 0x3247, 0x553F, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x3C3B, 0, 0x553E, 0x3779, 0, 0, 0, /* 0xC0 */
+ 0x554C, 0, 0, 0, 0, 0, 0x5545, 0x5542, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x4364, 0, 0x5541, 0, 0, 0x5543, 0, /* 0xE0 */
+ 0, 0x5544, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x5546, 0x5547 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x3472, 0, 0x5549, 0x5548, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x554A, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x3E6E, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x554D, 0, 0x445C, 0, 0, 0, /* 0x20 */
+ 0x3145, 0, 0x554B, 0, 0, 0, 0x554E, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x554F, 0, /* 0x30 */
+ 0x5552, 0, 0, 0x5550, 0, 0x5551, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x3B52, 0x5553, 0, 0, 0x3926, 0x5554, 0, 0x3B7A, /* 0x50 */
+ 0x4238, 0, 0x5555, 0x5556, 0x3B5A, 0x3927, 0, 0x4C52, /* 0x50 */
+ 0, 0, 0, 0x3528, 0x3849, 0x5557, 0x3358, 0, /* 0x60 */
+ 0, 0x5558, 0, 0x4239, 0, 0, 0, 0, /* 0x60 */
+ 0x5559, 0x5623, 0, 0x555A, 0, 0x555B, 0, 0, /* 0x70 */
+ 0x555C, 0, 0x555E, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x555F, 0, 0, 0x5560, 0, 0x4270, 0, 0x3127, /* 0x80 */
+ 0x3C69, 0x3042, 0, 0x4157, 0x3430, 0x3C35, 0, 0x3928, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x4566, 0, 0x3D21, /* 0x90 */
+ 0x3431, 0x4368, 0x446A, 0x3038, 0x3539, 0x4A75, 0, 0x3C42, /* 0x90 */
+ 0, 0, 0x3552, 0x406B, 0x3C3C, 0x4D28, 0x5561, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x355C, 0, /* 0xA0 */
+ 0x3A4B, 0, 0, 0x3332, 0x3163, 0x3E2C, 0x3248, 0, /* 0xB0 */
+ 0x5562, 0x4D46, 0, 0, 0, 0, 0, 0x3D49, /* 0xB0 */
+ 0, 0, 0x3C64, 0x5563, 0x3473, 0x4652, 0x4C29, 0x5564, /* 0xC0 */
+ 0, 0x5565, 0, 0, 0x4959, 0, 0, 0, /* 0xC0 */
+ 0x5567, 0, 0x3428, 0x3677, 0x5566, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x3432, 0, 0x3F32, 0x556B, 0x3B21, /* 0xD0 */
+ 0, 0x3249, 0x556A, 0, 0x5568, 0x556C, 0x5569, 0x472B, /* 0xE0 */
+ 0x5C4D, 0x3F33, 0, 0x556D, 0, 0, 0x4E40, 0, /* 0xE0 */
+ 0x556E, 0, 0, 0x5570, 0, 0x437E, 0x556F, 0, /* 0xF0 */
+ 0x4023, 0, 0x3B7B, 0, 0, 0, 0x4250, 0x3C77 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4975, 0x406C, 0, 0x3C4D, 0x5571, 0x3E2D, 0x5572, /* 0x00 */
+ 0x5573, 0x3053, 0x423A, 0x3F52, 0, 0x5574, 0x4633, 0x3E2E, /* 0x00 */
+ 0, 0x3E2F, 0, 0x5575, 0, 0, 0x406D, 0, /* 0x10 */
+ 0, 0, 0x3E30, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x5576, 0, 0x5577, 0, 0x4C60, 0, 0, 0, /* 0x20 */
+ 0x5578, 0, 0, 0, 0, 0x3646, 0, 0, /* 0x20 */
+ 0, 0x3D22, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x5579, 0x557A, 0x3C5C, 0x3F2C, 0x4674, 0x3F54, 0x4878, 0x4722, /* 0x30 */
+ 0x3649, 0x557B, 0, 0, 0, 0x356F, 0x557C, 0, /* 0x40 */
+ 0x367E, 0, 0x464F, 0x3230, 0, 0x3B53, 0x557D, 0x5622, /* 0x40 */
+ 0x5621, 0x367D, 0, 0x557E, 0, 0x4538, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x4230, 0, /* 0x50 */
+ 0x454B, 0x3C48, 0, 0, 0x4158, 0x4D7A, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x5624, 0, 0x5625, 0x4656, /* 0x60 */
+ 0, 0x3B33, 0, 0, 0, 0, 0x5627, 0, /* 0x70 */
+ 0, 0x5628, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x5629, 0, 0, 0, /* 0x80 */
+ 0x3474, 0x562A, 0, 0, 0x562B, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x322C, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x413B, 0x3464, 0, 0x562D, 0x4C28, 0, 0, 0, /* 0xA0 */
+ 0, 0x4252, 0, 0x3359, 0, 0, 0x562F, 0x5631, /* 0xB0 */
+ 0x345F, 0, 0, 0x562E, 0x5630, 0, 0x5633, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x5632, 0, 0x5634, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x5635, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x463D, 0x362E, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x3265, 0x5636, 0x563B, 0, 0, 0x5639, 0, 0x4A77, /* 0xE0 */
+ 0x4A76, 0, 0, 0, 0, 0, 0x4567, 0, /* 0xF0 */
+ 0, 0, 0x5638, 0x3D54, 0, 0x5637 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3F72, /* 0x00 */
+ 0, 0, 0, 0x563C, 0, 0, 0x3A6A, 0, /* 0x00 */
+ 0, 0x5642, 0, 0, 0x5643, 0x563D, 0x3333, 0x563E, /* 0x10 */
+ 0x5647, 0x5646, 0x5645, 0x5641, 0, 0, 0, 0x5640, /* 0x10 */
+ 0, 0, 0x5644, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x4A78, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x564B, 0x5648, 0, 0x564A, 0, /* 0x40 */
+ 0x4D72, 0, 0x5649, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x563F, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x3F73, 0, 0, 0x564C, 0, 0, 0x3A37, /* 0x60 */
+ 0, 0, 0, 0x564D, 0, 0, 0x564E, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x5651, 0, 0x5650, 0, 0, 0x564F, /* 0x80 */
+ 0, 0, 0, 0x4568, 0x563A, 0, 0, 0, /* 0x80 */
+ 0x5657, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x5653, 0, 0, /* 0x90 */
+ 0, 0, 0x5652, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x5654, 0, 0x5655, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5658, /* 0xB0 */
+ 0, 0, 0x4E66, 0, 0x5659, 0x5656, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x565A, 0, 0, 0x3460, 0x565B, 0, 0, /* 0xC0 */
+ 0, 0, 0x565D, 0x565C, 0, 0, 0x565E, 0, /* 0xD0 */
+ 0, 0, 0, 0x565F, 0, 0x406E, 0x3D23, 0, /* 0xD0 */
+ 0, 0x3D64, 0, 0x4163, 0, 0x3929, 0x3A38, 0x392A, /* 0xE0 */
+ 0x3570, 0, 0, 0x5660, 0, 0, 0x3A39, 0, /* 0xE0 */
+ 0, 0x384A, 0x5661, 0x4C26, 0x4743, 0x5662, 0, 0x392B, /* 0xF0 */
+ 0, 0, 0, 0x342C, 0, 0x4327, 0x3652 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3B54, 0x495B, 0, 0, 0x4841, 0, /* 0x00 */
+ 0, 0, 0, 0x5663, 0x3475, 0, 0, 0, /* 0x00 */
+ 0, 0x5666, 0, 0, 0, 0, 0x4421, 0, /* 0x10 */
+ 0, 0x5665, 0x5664, 0x5667, 0, 0x446B, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x3F63, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x3B55, 0, 0x404A, 0, 0x4253, /* 0x20 */
+ 0x3522, 0, 0, 0x4422, 0, 0, 0x5668, 0x5669, /* 0x30 */
+ 0x3E6F, 0, 0, 0, 0, 0x4B39, 0, 0, /* 0x30 */
+ 0x566C, 0, 0, 0x566B, 0x566A, 0x497D, 0, 0x5673, /* 0x40 */
+ 0, 0, 0, 0, 0x4B5A, 0, 0x566D, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x566F, 0x4B6B, 0, 0x566E, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5670, /* 0x50 */
+ 0, 0x4828, 0x5671, 0x4A3E, 0x5672, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x3433, 0x4A3F, 0x472F, 0x5674, 0x5675, 0, /* 0x70 */
+ 0x392C, 0x3434, 0x5676, 0x3838, 0x4D44, 0x4D29, 0x3476, 0x5678, /* 0x70 */
+ 0, 0x4423, 0, 0x392D, 0x3E31, 0, 0, 0x485F, /* 0x80 */
+ 0, 0, 0x3E32, 0, 0, 0, 0, 0x3D78, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x446C, 0x4A79, 0x4539, /* 0x90 */
+ 0, 0, 0x392E, 0, 0x495C, 0, 0, 0, /* 0x90 */
+ 0x5679, 0, 0, 0, 0, 0, 0x4559, 0x3A42, /* 0xA0 */
+ 0, 0, 0, 0x384B, 0, 0x446D, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x3043, 0x3D6E, 0x392F, /* 0xB0 */
+ 0x4D47, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x567A, 0x567B, 0x4751, 0, 0, 0, 0, /* 0xC0 */
+ 0x567C, 0x4E77, 0x4F2D, 0, 0, 0, 0, 0x567E, /* 0xC0 */
+ 0x567D, 0, 0, 0x3347, 0, 0, 0x5721, 0, /* 0xD0 */
+ 0, 0, 0x5724, 0x5725, 0, 0x5723, 0, 0x4940, /* 0xD0 */
+ 0x3E33, 0x5727, 0x5726, 0x5722, 0, 0, 0, 0, /* 0xE0 */
+ 0x5728, 0x5729, 0, 0, 0x572A, 0, 0, 0, /* 0xE0 */
+ 0x572D, 0x572B, 0, 0x572C, 0x572E, 0, 0x3164, 0x446E, /* 0xF0 */
+ 0x572F, 0, 0x377A, 0x3276, 0x4736, 0, 0x5730, 0x467B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4A5B, 0, 0x5731, 0x4F2E, 0, 0, 0, /* 0x00 */
+ 0, 0x5732, 0x4A40, 0x5735, 0x5021, 0x5031, 0, 0x3C30, /* 0x00 */
+ 0x4675, 0x5736, 0, 0x355D, 0x4424, 0x307A, 0x5737, 0x4A26, /* 0x10 */
+ 0x3930, 0, 0, 0x4350, 0, 0, 0, 0x446F, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x4C6F, 0x3839, 0x384C, /* 0x20 */
+ 0, 0x5738, 0, 0, 0, 0x5739, 0, 0x573F, /* 0x20 */
+ 0, 0x3C65, 0, 0, 0, 0x4425, 0, 0x362F, /* 0x30 */
+ 0x573A, 0, 0, 0, 0x492B, 0, 0x4346, 0, /* 0x30 */
+ 0, 0x573B, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x573C, 0, 0x3630, 0, 0x573D, 0, 0x573E, 0, /* 0x40 */
+ 0, 0x5740, 0, 0x4576, 0, 0, 0x5741, 0x5742, /* 0x50 */
+ 0, 0x5743, 0, 0, 0x5734, 0x5733, 0, 0, /* 0x50 */
+ 0, 0x5744, 0x3741, 0, 0, 0, 0x4927, 0, /* 0x60 */
+ 0, 0x3A4C, 0x4937, 0x4426, 0x494B, 0x5745, 0, 0, /* 0x60 */
+ 0x3E34, 0x3146, 0, 0x5746, 0, 0, 0, 0x5747, /* 0x70 */
+ 0, 0x4C72, 0, 0, 0x4860, 0, 0, 0x574A, /* 0x70 */
+ 0x317D, 0x402C, 0x5749, 0x5748, 0x3742, 0x4254, 0, 0x574E, /* 0x80 */
+ 0x574C, 0, 0x574B, 0x4E27, 0x3865, 0, 0, 0, /* 0x80 */
+ 0x3D79, 0x574D, 0x454C, 0x3D3E, 0, 0, 0, 0x4640, /* 0x90 */
+ 0x5751, 0x5750, 0, 0, 0, 0, 0x574F, 0, /* 0x90 */
+ 0x5752, 0x3866, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x5753, 0x497C, 0x3D5B, 0, 0, 0x5754, 0x4879, 0, /* 0xA0 */
+ 0, 0, 0, 0x4641, 0x4427, 0, 0, 0, /* 0xB0 */
+ 0, 0x4530, 0, 0, 0x5755, 0x352B, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x3F34, 0, 0x492C, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x3477, 0x4726, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x5756, 0x3B56, /* 0xD0 */
+ 0x4B3A, 0x4B3B, 0, 0, 0x317E, 0x575B, 0, 0, /* 0xD0 */
+ 0x4369, 0, 0, 0, 0x5758, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x3277, 0, 0, 0, 0, /* 0xE0 */
+ 0x582D, 0x575A, 0, 0, 0, 0x4730, 0, 0, /* 0xF0 */
+ 0x5759, 0, 0, 0x5757, 0, 0x397A, 0, 0x575D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x5763, 0x5769, /* 0x00 */
+ 0x5761, 0, 0x455C, 0, 0, 0x5766, 0x495D, 0, /* 0x10 */
+ 0, 0x5760, 0, 0x5765, 0x4E67, 0x3B57, 0, 0, /* 0x10 */
+ 0x4255, 0x575E, 0, 0, 0, 0x355E, 0x5768, 0x402D, /* 0x20 */
+ 0x3165, 0x5762, 0x3278, 0x5767, 0, 0, 0, 0x3631, /* 0x20 */
+ 0, 0x5764, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x576A, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x576C, 0x5776, 0x5774, 0, 0, 0x5771, 0, /* 0x40 */
+ 0, 0, 0x5770, 0x4E78, 0, 0x5772, 0, 0, /* 0x40 */
+ 0x3632, 0, 0x3931, 0, 0, 0x3D7A, 0, 0, /* 0x50 */
+ 0, 0x5779, 0x576B, 0, 0, 0, 0, 0x576F, /* 0x50 */
+ 0x575F, 0, 0x327A, 0x5773, 0x5775, 0x4351, 0, 0, /* 0x60 */
+ 0x3A28, 0x3238, 0x576D, 0x5778, 0x5777, 0x3633, 0, 0x4229, /* 0x60 */
+ 0x3366, 0, 0, 0, 0, 0x3743, 0, 0x576E, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x577A, 0, 0x577D, 0x5821, 0, 0, 0, /* 0x80 */
+ 0, 0x3C3D, 0, 0x5827, 0x4470, 0x577B, 0, 0, /* 0x80 */
+ 0, 0, 0x5825, 0, 0x3279, 0, 0x5823, 0x5824, /* 0x90 */
+ 0, 0, 0x577E, 0x5822, 0, 0, 0, 0x3867, /* 0x90 */
+ 0x4D2A, 0, 0, 0x3435, 0, 0, 0x3159, 0x5826, /* 0xA0 */
+ 0, 0x473A, 0x302D, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x4861, 0x575C, 0x582C, 0x5830, 0x4C65, 0, /* 0xB0 */
+ 0x5829, 0, 0, 0, 0x4569, 0x582E, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x3E70, 0x582F, 0x4657, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x4F47, 0, 0x582B, 0, 0, 0, 0, /* 0xD0 */
+ 0x5831, 0, 0x397B, 0, 0x404B, 0, 0, 0x3054, /* 0xD0 */
+ 0x582A, 0x5828, 0, 0x415A, 0, 0, 0, 0x577C, /* 0xE0 */
+ 0x3B34, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x4246, 0x583D, 0, 0x415B, 0x5838, 0, 0x5835, 0x5836, /* 0xF0 */
+ 0, 0x3C66, 0x5839, 0x583C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5837, 0x3D25, 0, 0x583A, 0, 0, 0x5834, 0, /* 0x00 */
+ 0x4C7C, 0x4C7B, 0, 0, 0, 0x583E, 0x583F, 0x3055, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x5833, 0, 0, /* 0x10 */
+ 0, 0, 0x3672, 0x3026, 0, 0, 0, 0x3436, /* 0x10 */
+ 0, 0x583B, 0, 0, 0, 0, 0, 0x5843, /* 0x20 */
+ 0x5842, 0, 0, 0, 0x5847, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x5848, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x5846, 0x5849, 0x5841, 0x5845, /* 0x30 */
+ 0, 0, 0x584A, 0, 0x584B, 0, 0, 0x5840, /* 0x40 */
+ 0x3B7C, 0, 0x5844, 0x4256, 0x3932, 0x5832, 0x3F35, 0, /* 0x40 */
+ 0, 0, 0, 0x5858, 0, 0x4A69, 0, 0, /* 0x50 */
+ 0x584E, 0x584F, 0x5850, 0, 0, 0x5857, 0, 0x5856, /* 0x50 */
+ 0, 0, 0x4B7D, 0x3437, 0, 0x5854, 0, 0x3745, /* 0x60 */
+ 0x3334, 0, 0, 0x5851, 0, 0, 0x4E38, 0x5853, /* 0x60 */
+ 0x3056, 0x5855, 0, 0x584C, 0x5852, 0x5859, 0x3744, 0x584D, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x4D5D, 0, /* 0x70 */
+ 0, 0, 0x4D2B, 0, 0, 0, 0, 0x585C, /* 0x80 */
+ 0, 0, 0x5860, 0, 0, 0, 0x417E, 0, /* 0x80 */
+ 0x4E79, 0x5861, 0, 0, 0x585E, 0, 0x585B, 0, /* 0x90 */
+ 0, 0x585A, 0x585F, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x4A30, 0, 0, 0x4634, /* 0xA0 */
+ 0, 0x3746, 0, 0x5862, 0x585D, 0, 0x5863, 0, /* 0xA0 */
+ 0, 0, 0x377B, 0, 0, 0, 0x3231, 0, /* 0xB0 */
+ 0, 0, 0x586B, 0, 0, 0, 0x3438, 0, /* 0xB0 */
+ 0, 0, 0, 0x5869, 0, 0, 0x586A, 0x3A29, /* 0xC0 */
+ 0x5868, 0x5866, 0x5865, 0x586C, 0x5864, 0x586E, 0, 0, /* 0xC0 */
+ 0x327B, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x5870, 0, 0, 0x586F, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x4428, 0, 0x5873, 0, 0x5871, 0x5867, /* 0xF0 */
+ 0x377C, 0, 0x5872, 0, 0x5876, 0x5875, 0x5877, 0x5874 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5878, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x5879, 0x587A, 0x4A6A, 0, 0x587C, 0x587B, 0x3D3F, 0, /* 0x00 */
+ 0x402E, 0x3266, 0x327C, 0, 0x587D, 0, 0x303F, 0, /* 0x10 */
+ 0, 0, 0x404C, 0x587E, 0, 0x6C43, 0x5921, 0x3761, /* 0x10 */
+ 0, 0x5922, 0, 0, 0, 0, 0x406F, 0, /* 0x20 */
+ 0, 0, 0x5923, 0, 0, 0, 0x5924, 0x353A, /* 0x20 */
+ 0x5925, 0, 0x5926, 0x5927, 0x4257, 0, 0, 0, /* 0x30 */
+ 0x384D, 0, 0, 0x4C61, 0, 0, 0, 0x4B3C, /* 0x30 */
+ 0x3D6A, 0x5928, 0, 0, 0, 0, 0, 0x4070, /* 0x40 */
+ 0x6E3D, 0x4862, 0, 0x3C6A, 0, 0x3A4D, 0x5929, 0, /* 0x40 */
+ 0, 0, 0, 0x4247, 0, 0x4A27, 0, 0, /* 0x50 */
+ 0x4271, 0, 0, 0x592C, 0, 0, 0x592A, 0, /* 0x50 */
+ 0x592D, 0, 0, 0x592B, 0, 0, 0, 0, /* 0x60 */
+ 0x592E, 0, 0, 0, 0, 0, 0x4A31, 0, /* 0x60 */
+ 0, 0x3037, 0, 0, 0, 0, 0x495E, 0, /* 0x70 */
+ 0, 0x4863, 0, 0, 0x592F, 0, 0x5932, 0x3E35, /* 0x70 */
+ 0x353B, 0, 0x5930, 0x5937, 0x3E36, 0, 0, 0, /* 0x80 */
+ 0, 0x5931, 0x4744, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x4D5E, 0x5933, 0x5934, 0x5938, 0x456A, 0x5935, 0x3933, /* 0x90 */
+ 0x405E, 0, 0, 0x5946, 0x4834, 0, 0x4272, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x4864, 0x5A2D, 0, 0, 0, /* 0xA0 */
+ 0, 0x4A7A, 0, 0, 0, 0x4471, 0, 0, /* 0xB0 */
+ 0, 0x4B75, 0, 0x593B, 0x3221, 0x436A, 0, 0, /* 0xB0 */
+ 0, 0, 0x5944, 0, 0, 0x4334, 0x593E, 0x5945, /* 0xC0 */
+ 0x5940, 0x5947, 0x5943, 0, 0x5942, 0x476F, 0, 0x593C, /* 0xC0 */
+ 0x327D, 0x593A, 0x3571, 0x4273, 0x5936, 0, 0, 0x5939, /* 0xD0 */
+ 0x3934, 0x405B, 0, 0x3E37, 0x5941, 0x4752, 0, 0, /* 0xD0 */
+ 0x3572, 0x3348, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x3367, 0x3F21, 0x5949, 0x594E, /* 0xE0 */
+ 0, 0x594A, 0, 0x377D, 0, 0x594F, 0x3B22, 0x3969, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0x3D26, 0x593D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3B7D, 0x594C, 0, 0, 0, 0, 0x3B58, /* 0x00 */
+ 0x594D, 0x3044, 0, 0, 0x5948, 0, 0, 0, /* 0x00 */
+ 0, 0x4429, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x3573, 0, 0, 0, 0, 0, 0x3634, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0x594B, /* 0x20 */
+ 0x3027, 0, 0, 0x3A43, 0, 0, 0, 0x3F36, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x4472, 0, 0, 0x4854, 0x5951, 0x415E, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x422A, 0, 0, 0x3B2B, 0x5952, 0, 0x5954, /* 0x40 */
+ 0x5950, 0, 0, 0, 0, 0x4A61, 0, 0x443D, /* 0x50 */
+ 0, 0, 0, 0, 0x415C, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4A7B, /* 0x60 */
+ 0x3C4E, 0x5960, 0, 0x595F, 0, 0, 0x3F78, 0, /* 0x60 */
+ 0, 0, 0x377E, 0, 0, 0, 0x5959, 0x3E39, /* 0x70 */
+ 0, 0, 0x4668, 0x4731, 0, 0, 0, 0, /* 0x70 */
+ 0x5957, 0, 0, 0x415D, 0, 0, 0, 0, /* 0x80 */
+ 0x3C78, 0x595C, 0, 0, 0x3E38, 0, 0x5956, 0x595B, /* 0x80 */
+ 0, 0, 0x4753, 0, 0, 0, 0x5955, 0, /* 0x90 */
+ 0x3721, 0, 0, 0x335D, 0, 0, 0, 0x595D, /* 0x90 */
+ 0x4E2B, 0x3A4E, 0x4335, 0x595A, 0, 0x405C, 0, 0x3935, /* 0xA0 */
+ 0x3F64, 0x3166, 0x413C, 0x5958, 0x3545, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x3747, 0, 0x444F, 0x595E, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x415F, 0, 0, 0x5961, 0, /* 0xB0 */
+ 0x5963, 0, 0, 0x4237, 0x5969, 0, 0x5964, 0, /* 0xC0 */
+ 0, 0x5966, 0, 0, 0, 0, 0, 0x4941, /* 0xC0 */
+ 0x4473, 0, 0x5967, 0, 0, 0, 0x4D2C, 0, /* 0xD0 */
+ 0, 0, 0x4D48, 0x3439, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x302E, 0, 0x5965, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x5962, 0, 0, 0, 0, 0x3478, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x3167, 0, 0x5968, 0, /* 0xF0 */
+ 0, 0, 0x4D49 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x596C, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x423B, 0, 0x5973, /* 0x00 */
+ 0, 0, 0, 0x596D, 0, 0, 0x596A, 0x5971, /* 0x10 */
+ 0, 0, 0, 0, 0x5953, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x596E, 0, /* 0x20 */
+ 0x5972, 0, 0, 0, 0x4842, 0x456B, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x596B, 0, 0x596F, 0, /* 0x30 */
+ 0, 0, 0x3748, 0, 0, 0, 0x3A71, 0, /* 0x30 */
+ 0, 0, 0x405D, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x5977, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x4526, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5974, /* 0x60 */
+ 0, 0x4B60, 0, 0, 0, 0, 0, 0x5975, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0x5976, 0, /* 0x70 */
+ 0x4C4E, 0, 0x4022, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x3762, 0, 0, 0, 0, /* 0x80 */
+ 0x597D, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x3B35, 0x597A, 0, 0x5979, 0, 0, /* 0x90 */
+ 0, 0, 0x4732, 0, 0, 0, 0x4635, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x4531, 0x597B, 0, 0, /* 0xA0 */
+ 0, 0x597C, 0, 0x496F, 0, 0x4745, 0x3B23, 0, /* 0xA0 */
+ 0x4071, 0, 0x4B50, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x3349, 0, 0x5A25, 0x597E, 0, 0, 0, /* 0xB0 */
+ 0, 0x4D4A, 0x5A27, 0, 0, 0x5A23, 0, 0x5A24, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x4160, 0, 0, /* 0xC0 */
+ 0, 0, 0x5A22, 0, 0x593F, 0, 0, 0, /* 0xD0 */
+ 0x5A26, 0, 0x5A21, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x5A2B, 0x5A2C, 0x4527, 0x5A2E, 0, 0, 0x3B24, 0x5A29, /* 0xE0 */
+ 0, 0, 0, 0, 0x353C, 0, 0, 0x5A2F, /* 0xE0 */
+ 0, 0x5A28, 0x5A33, 0, 0x5A32, 0, 0x5A31, 0, /* 0xF0 */
+ 0, 0, 0x5A34, 0, 0, 0x5A36, 0x3E71 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5A35, 0, 0, 0, 0, 0x5A39, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x5A37, 0, 0, 0, 0x5A38, 0x5970, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x5A3B, 0x5A3A, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x5978, 0x5A3C, 0x5A30, 0, 0, 0x3B59, /* 0x20 */
+ 0, 0, 0, 0, 0x5A3D, 0x5A3E, 0x5A40, 0x5A3F, /* 0x30 */
+ 0x5A41, 0x327E, 0, 0x3936, 0, 0, 0x4A7C, 0x402F, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x384E, 0, 0, /* 0x40 */
+ 0x5A43, 0, 0, 0, 0, 0x5A46, 0, 0x4952, /* 0x40 */
+ 0, 0x355F, 0, 0, 0, 0x5A45, 0x5A44, 0x4754, /* 0x50 */
+ 0x5A47, 0x3635, 0, 0, 0, 0x5A49, 0x5A48, 0, /* 0x50 */
+ 0, 0, 0x343A, 0x3B36, 0, 0, 0x4658, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x3749, 0, 0, 0, /* 0x60 */
+ 0x3F74, 0, 0x5A4A, 0, 0x4030, 0x4528, 0, 0x495F, /* 0x70 */
+ 0x5A4B, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x5A4C, 0x5A4D, 0, 0, 0, 0x4A38, /* 0x80 */
+ 0x555D, 0x4046, 0, 0, 0x494C, 0, 0x3A58, 0, /* 0x80 */
+ 0x4865, 0x4843, 0, 0, 0, 0, 0, 0x454D, /* 0x90 */
+ 0, 0x4E41, 0, 0x5A4F, 0x3C50, 0, 0, 0x5A50, /* 0x90 */
+ 0, 0x3036, 0, 0, 0x3654, 0x404D, 0, 0x4960, /* 0xA0 */
+ 0, 0, 0, 0x5A51, 0x3B42, 0x4347, 0, 0x3B5B, /* 0xA0 */
+ 0x3F37, 0, 0, 0, 0, 0, 0, 0x5A52, /* 0xB0 */
+ 0, 0x4A7D, 0, 0, 0x3177, 0x3B5C, 0, 0, /* 0xB0 */
+ 0, 0x5A55, 0, 0x5A53, 0x5A56, 0x4E39, 0x5A54, 0, /* 0xC0 */
+ 0, 0, 0, 0x407B, 0x5A57, 0, 0, 0x4232, /* 0xC0 */
+ 0, 0, 0x5A58, 0, 0, 0, 0, 0x347A, /* 0xD0 */
+ 0, 0x5A5A, 0, 0x5A59, 0, 0, 0, 0, /* 0xD0 */
+ 0x5A5B, 0x5A5C, 0x347B, 0, 0, 0x467C, 0x4336, 0x356C, /* 0xE0 */
+ 0x3B5D, 0x4161, 0, 0, 0x3D5C, 0x3030, 0, 0, /* 0xE0 */
+ 0, 0x5A5D, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x3222, 0x5A61 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3937, 0x5A60, 0, 0, 0x3A2B, 0x3E3A, /* 0x00 */
+ 0, 0, 0x5A5F, 0, 0x3E3B, 0, 0x4C40, 0x3A2A, /* 0x00 */
+ 0, 0, 0, 0x3057, 0x404E, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x5A66, 0, 0, 0x4031, /* 0x10 */
+ 0x3147, 0, 0, 0, 0, 0x3D55, 0, 0x4B66, /* 0x20 */
+ 0x3A72, 0, 0, 0, 0, 0x3E3C, 0, 0x4027, /* 0x20 */
+ 0, 0, 0, 0, 0x5A65, 0x5A63, 0x5A64, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x436B, 0, 0, 0x5B26, /* 0x30 */
+ 0, 0x5A6A, 0x3B7E, 0x3938, 0x5A68, 0, 0, 0, /* 0x40 */
+ 0, 0x5A69, 0, 0x3F38, 0, 0, 0, 0x5A67, /* 0x40 */
+ 0, 0, 0x3B2F, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x5A6C, 0x5A6B, 0x5A70, /* 0x50 */
+ 0, 0, 0x5A71, 0, 0x5A6D, 0, 0x3322, 0x5A6E, /* 0x60 */
+ 0x5A6F, 0x4855, 0, 0, 0, 0, 0x4961, 0x374A, /* 0x60 */
+ 0x5A72, 0, 0, 0, 0x4032, 0, 0x3E3D, 0, /* 0x70 */
+ 0, 0, 0x4352, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x3647, 0, 0x5A73, 0x5A77, 0, 0, 0x324B, /* 0x80 */
+ 0x5A74, 0x5A76, 0, 0, 0, 0, 0x5A75, 0, /* 0x80 */
+ 0, 0x3D6B, 0, 0, 0, 0, 0x4348, 0x3045, /* 0x90 */
+ 0x5A78, 0, 0, 0, 0, 0x5A79, 0, 0, /* 0x90 */
+ 0, 0, 0x442A, 0, 0, 0, 0x4E71, 0, /* 0xA0 */
+ 0, 0, 0, 0x3B43, 0, 0, 0x4A6B, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x4B3D, 0, 0, 0, /* 0xB0 */
+ 0x5B22, 0x5A7B, 0, 0, 0x5A7E, 0, 0x5A7D, 0, /* 0xB0 */
+ 0, 0x5A7A, 0, 0, 0x5B21, 0, 0, 0x465E, /* 0xC0 */
+ 0, 0x5A7C, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x5B23, 0, /* 0xD0 */
+ 0, 0x3D6C, 0x5B24, 0, 0x4D4B, 0x4778, 0, 0, /* 0xD0 */
+ 0x5B25, 0, 0, 0, 0, 0, 0x5B27, 0, /* 0xE0 */
+ 0, 0x5B28, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x5B29, 0, 0x364A, 0x3148, 0x3939, 0x5B2A, 0, 0x5B2B, /* 0xF0 */
+ 0x3D71, 0x4162, 0, 0, 0x5258, 0x413E, 0x413D, 0x4258 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3A47, 0, 0, 0x5072, 0, 0, 0, 0, /* 0x00 */
+ 0x376E, 0x4D2D, 0, 0x4A7E, 0, 0x497E, 0, 0x5B2C, /* 0x00 */
+ 0, 0, 0, 0, 0x3A73, 0x443F, 0x5B2D, 0x4F2F, /* 0x10 */
+ 0, 0, 0, 0x4B3E, 0, 0x442B, 0x5B2E, 0x347C, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x5B2F, 0x5B30, /* 0x20 */
+ 0x4C5A, 0, 0x4C24, 0x4B76, 0x4B5C, 0x3B25, 0x5B32, 0, /* 0x20 */
+ 0, 0x3C6B, 0, 0, 0x4B51, 0, 0x5B34, 0x5B37, /* 0x30 */
+ 0x5B36, 0, 0x3479, 0, 0, 0x3560, 0, 0x5B33, /* 0x30 */
+ 0, 0x5B35, 0, 0, 0, 0, 0x5B38, 0, /* 0x40 */
+ 0, 0x3F79, 0, 0, 0, 0, 0x4D7B, 0x3049, /* 0x40 */
+ 0x3A60, 0x423C, 0, 0x3C5D, 0, 0, 0x3E73, 0, /* 0x50 */
+ 0, 0x5B3B, 0, 0, 0x454E, 0, 0x5B39, 0x422B, /* 0x50 */
+ 0x5B3A, 0x3E72, 0x4C5D, 0x5B3C, 0x5B3D, 0x4D68, 0, 0, /* 0x60 */
+ 0, 0, 0x5B42, 0, 0, 0x393A, 0, 0x4755, /* 0x60 */
+ 0x5B3F, 0x456C, 0x5A5E, 0x5A62, 0, 0x354F, 0, 0x4747, /* 0x70 */
+ 0, 0, 0, 0, 0x5B41, 0, 0x3E3E, 0x4844, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x5B47, 0, 0x487A, /* 0x80 */
+ 0, 0x5B3E, 0, 0x5B44, 0x5B43, 0, 0, 0, /* 0x80 */
+ 0x404F, 0, 0, 0, 0, 0x4B6D, 0, 0x4E53, /* 0x90 */
+ 0, 0, 0x4B67, 0, 0x324C, 0x3B5E, 0, 0, /* 0x90 */
+ 0x4F48, 0x5B46, 0x3F75, 0, 0, 0, 0x5B45, 0, /* 0xA0 */
+ 0, 0x5B40, 0, 0, 0, 0, 0, 0x384F, /* 0xA0 */
+ 0, 0, 0, 0x5B4C, 0x5B4A, 0, 0x324D, 0x5B48, /* 0xB0 */
+ 0x5B4E, 0x5B54, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x4248, 0, 0, 0x4A41, 0, 0x5B56, 0, /* 0xC0 */
+ 0, 0, 0x4922, 0, 0, 0, 0x5B55, 0x4770, /* 0xC0 */
+ 0x4B3F, 0x343B, 0, 0x4077, 0x3D40, 0, 0, 0, /* 0xD0 */
+ 0x4453, 0, 0x4D2E, 0, 0, 0x5B51, 0x5B50, 0, /* 0xD0 */
+ 0, 0, 0x5B52, 0, 0x5B4F, 0, 0, 0x5B57, /* 0xE0 */
+ 0, 0x5B4D, 0, 0, 0x5B4B, 0, 0x5B53, 0x5B49, /* 0xE0 */
+ 0, 0x436C, 0, 0x4C78, 0x3C46, 0x3A74, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0x3A3A, 0, 0, 0x4B6F, 0x3341 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x444E, 0x464A, 0x3149, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x4072, 0, 0, 0x4034, 0x372A, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x5B59, 0, /* 0x10 */
+ 0, 0x393B, 0x337C, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x5B5B, 0x3374, 0x5B61, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x5B5E, 0, 0x4073, 0, 0, 0, /* 0x30 */
+ 0x334B, 0x3A2C, 0, 0, 0x334A, 0x3A4F, 0, 0, /* 0x30 */
+ 0x5B5C, 0x3765, 0x374B, 0x456D, 0, 0, 0x5B5A, 0, /* 0x40 */
+ 0x3046, 0, 0, 0, 0, 0x5B5D, 0x5B5F, 0, /* 0x40 */
+ 0x364D, 0x372C, 0, 0x343C, 0x354B, 0, 0, 0, /* 0x50 */
+ 0, 0x5B62, 0, 0, 0x3A79, 0x4B71, 0, 0x3B37, /* 0x50 */
+ 0, 0, 0, 0x5B63, 0, 0, 0, 0x4930, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x5B6F, 0, 0x3233, 0x5B64, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x5B75, 0x5B65, /* 0x70 */
+ 0, 0x4E42, 0, 0x5B6C, 0, 0x475F, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x5B74, 0, 0x5B67, /* 0x80 */
+ 0, 0, 0, 0x3034, 0x5B69, 0, 0, 0x393C, /* 0x90 */
+ 0, 0, 0, 0x5B6B, 0, 0x5B6A, 0, 0x5B66, /* 0x90 */
+ 0x5B71, 0, 0x3E3F, 0, 0, 0, 0x546D, 0x3868, /* 0xA0 */
+ 0x4D7C, 0, 0, 0, 0, 0x5B68, 0, 0x4474, /* 0xA0 */
+ 0x3323, 0x3A2D, 0, 0x5B60, 0, 0x5B70, 0x3361, 0, /* 0xB0 */
+ 0, 0x5B6E, 0x5B72, 0, 0x456E, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x347E, 0, 0x5C32, 0, /* 0xC0 */
+ 0, 0x4C49, 0x5B77, 0x347D, 0, 0x5B7E, 0, 0, /* 0xC0 */
+ 0, 0, 0x4B40, 0, 0x5C21, 0x5C23, 0, 0x5C27, /* 0xD0 */
+ 0x5B79, 0, 0x432A, 0, 0, 0, 0, 0x456F, /* 0xD0 */
+ 0x5C2B, 0x5B7C, 0, 0x5C28, 0, 0, 0, 0x5C22, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x3F39, 0x5C2C, /* 0xE0 */
+ 0, 0, 0x4033, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x5C2A, 0x343D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F50, 0x5B76, 0, 0, 0x5C26, 0x3058, 0, 0, /* 0x00 */
+ 0x5B78, 0, 0, 0x4C3A, 0x5B7D, 0x3F22, 0x4447, 0x5B73, /* 0x00 */
+ 0, 0, 0x5C25, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x3F7A, 0x5C2F, 0x3371, 0x3821, 0, 0, 0, /* 0x10 */
+ 0, 0x5C31, 0x5B7A, 0x5C30, 0, 0x5C29, 0x5B7B, 0, /* 0x20 */
+ 0x5C2D, 0, 0x5C2E, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x5C3F, 0, 0, 0, 0x464E, 0, 0x5C24, 0, /* 0x30 */
+ 0, 0x5C3B, 0, 0, 0, 0x5C3D, 0, 0x4458, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x4D4C, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x4976, 0x5C38, 0x424A, 0, 0, /* 0x50 */
+ 0, 0x5C3E, 0x413F, 0, 0x5C35, 0x5C42, 0x5C41, 0, /* 0x50 */
+ 0x466F, 0x5C40, 0x466A, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x5C44, 0x5C37, 0, 0x3648, 0x5C3A, 0x3D5D, /* 0x60 */
+ 0, 0, 0, 0x4760, 0x5C3C, 0x364B, 0, 0x5C34, /* 0x70 */
+ 0x5C36, 0x5C33, 0, 0, 0x4F30, 0x335A, 0x5C39, 0, /* 0x70 */
+ 0, 0x5C43, 0x3335, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x3A67, 0, 0, 0, 0x315D, 0, /* 0x80 */
+ 0, 0x5C54, 0, 0, 0x4F31, 0x5C57, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x3F3A, 0x5C56, 0, 0, 0, /* 0x90 */
+ 0x5C55, 0, 0, 0, 0, 0, 0, 0x5C52, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x5C46, 0, /* 0xA0 */
+ 0, 0x5C63, 0x5C45, 0, 0x5C58, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x5C50, 0, 0, 0x5C4B, 0x5C48, /* 0xB0 */
+ 0, 0x5C49, 0, 0x5C51, 0, 0, 0, 0x7422, /* 0xC0 */
+ 0, 0, 0x5C4E, 0x393D, 0x4448, 0x4164, 0x5C4C, 0, /* 0xC0 */
+ 0x5C47, 0, 0, 0x5C4A, 0, 0, 0, 0, /* 0xD0 */
+ 0x4D4D, 0x4B6A, 0, 0, 0, 0x5C4F, 0x5C59, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5C61, /* 0xE0 */
+ 0x5C5A, 0, 0, 0x5C67, 0, 0x5C65, 0, 0, /* 0xE0 */
+ 0, 0, 0x5C60, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x5C5F, 0, 0x4450, 0, 0x4165, 0, 0x5C5D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5C5B, 0, 0, 0x5C62, 0, 0, /* 0x00 */
+ 0, 0, 0x5C68, 0x4875, 0x5C6E, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x5C69, 0x5C6C, 0x5C66, 0, 0, 0x4374, /* 0x10 */
+ 0, 0x4938, 0, 0x5C5C, 0, 0, 0x5C64, 0x3E40, /* 0x10 */
+ 0, 0x4C4F, 0x5C78, 0x5C6B, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x3822, 0x3223, 0x335F, 0, 0, 0x5C53, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x3E41, 0x5C70, 0, /* 0x30 */
+ 0x5C77, 0x3C79, 0x3372, 0, 0, 0x432E, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x5C6D, 0, 0, 0x5C72, /* 0x40 */
+ 0x5C76, 0, 0, 0x3636, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x354C, 0x5C74, 0, 0, 0, 0, 0, 0x3521, /* 0x50 */
+ 0, 0x464B, 0x5C73, 0, 0, 0, 0x5C75, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x5C6F, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x5C71, 0, 0, 0, 0, 0, 0, 0x3360, /* 0x70 */
+ 0x4349, 0, 0, 0, 0x5C7C, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x5C7A, 0x3869, 0, /* 0x80 */
+ 0x5C79, 0, 0, 0, 0, 0, 0, 0x5D21, /* 0x90 */
+ 0, 0, 0, 0, 0x5B58, 0, 0, 0, /* 0x90 */
+ 0x5C7B, 0, 0x5C7D, 0x5C7E, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x5D2C, 0, 0x5D28, 0, 0x5B6D, 0, /* 0xA0 */
+ 0, 0, 0, 0x5D27, 0, 0, 0, 0, /* 0xB0 */
+ 0x5D26, 0, 0, 0x5D23, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x5C6A, 0x5D25, 0x5D24, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x5D2A, 0, 0x4F26, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x5D2D, 0x367B, 0, 0, 0x5D29, 0x5D2B, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x4827, 0, 0x5D2E, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x5D32, 0x5D2F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4D73, 0x5D30, 0, 0, /* 0x00 */
+ 0, 0, 0x5C5E, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x5D33, 0, 0, 0, 0x5D34, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x3135, 0, 0x5D36, /* 0x10 */
+ 0x3767, 0x3C21, 0, 0x3655, 0, 0, 0, 0x3224, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x4D5F, 0, 0, 0, 0, 0x5D38, /* 0x30 */
+ 0x5D37, 0x5D3A, 0x353D, 0, 0, 0x3656, 0x343E, 0, /* 0x30 */
+ 0, 0, 0, 0x5D3D, 0, 0, 0, 0x5D3C, /* 0x40 */
+ 0, 0x5D3E, 0, 0, 0x324E, 0, 0x4337, 0, /* 0x40 */
+ 0x5D3F, 0, 0, 0x343F, 0x5D41, 0, 0, 0, /* 0x50 */
+ 0, 0x5D40, 0, 0x5D42, 0, 0, 0, 0x5D43, /* 0x50 */
+ 0, 0x5D44, 0x3B5F, 0x4035, 0x3A21, 0, 0x4970, 0, /* 0x60 */
+ 0, 0x4A62, 0x4F44, 0, 0, 0, 0, 0x3B75, /* 0x60 */
+ 0, 0, 0, 0x3A50, 0x4E72, 0, 0, 0, /* 0x70 */
+ 0x5D45, 0x5D46, 0, 0x3B60, 0, 0, 0, 0x5D47, /* 0x70 */
+ 0x5D48, 0, 0, 0x5D4A, 0x5D49, 0, 0x4B58, 0, /* 0x80 */
+ 0, 0x3D5E, 0x3C6C, 0x3B44, 0, 0x5D4B, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x5D4D, 0x3F23, 0, /* 0x90 */
+ 0x5D4C, 0, 0, 0, 0, 0, 0x5D4E, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x5D4F, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x5D50, 0x5D51, 0, 0, 0, 0x5D52, /* 0xA0 */
+ 0, 0x5D54, 0x5D53, 0x5D55, 0x3225, 0x434A, 0, 0x5D56, /* 0xB0 */
+ 0, 0, 0x3B26, 0x334C, 0x5D57, 0, 0, 0x4542, /* 0xB0 */
+ 0x544C, 0, 0, 0, 0, 0x3523, 0x5D58, 0, /* 0xC0 */
+ 0, 0, 0, 0x5D59, 0, 0x4A6C, 0x4B68, 0, /* 0xC0 */
+ 0, 0, 0x4647, 0x5D5A, 0x4866, 0, 0, 0, /* 0xD0 */
+ 0x487B, 0, 0, 0x4C53, 0, 0, 0, 0x5D5B, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x5D5D, 0x5D5C, 0, 0, 0x5D5F, /* 0xE0 */
+ 0, 0, 0, 0x5D5E /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x5D61, 0, 0, 0, 0, 0, 0, 0x3B61, /* 0x00 */
+ 0, 0x4C31, 0, 0x5D62, 0x5D63, 0, 0, 0x3524, /* 0x10 */
+ 0, 0, 0, 0x5D64, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x5D66, 0x5D65, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x3F65, 0, 0, 0x4939, /* 0x30 */
+ 0x314A, 0, 0, 0, 0, 0, 0x4845, 0, /* 0x30 */
+ 0x4475, 0x3D41, 0x3561, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x4846, 0, /* 0x40 */
+ 0x3C2E, 0, 0, 0, 0, 0x5D68, 0, 0x3440, /* 0x50 */
+ 0, 0, 0x3178, 0, 0, 0x4672, 0x5D67, 0x393E, /* 0x50 */
+ 0x4353, 0, 0x5D69, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x5D71, 0, 0x5D6A, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x4241, 0, 0x3562, 0x5D72, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x3768, 0, 0, 0x3525, 0x5D70, 0, /* 0x70 */
+ 0, 0x5D6E, 0x5D6B, 0x4D60, 0, 0, 0, 0, /* 0x80 */
+ 0x4440, 0, 0, 0, 0x4659, 0x5D6C, 0, 0, /* 0x80 */
+ 0x5D74, 0, 0x5D73, 0x3723, 0, 0, 0x322D, 0, /* 0x90 */
+ 0, 0x3A3B, 0x5D6D, 0x5D6F, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x4B57, 0x4274, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x4B77, 0, 0, 0x5D7C, 0, /* 0xA0 */
+ 0, 0x5D7D, 0, 0x324F, 0, 0, 0, 0, /* 0xB0 */
+ 0x4A28, 0x4C7D, 0x5E21, 0x3C23, 0x3E42, 0x5D78, 0x5D7E, 0x3168, /* 0xB0 */
+ 0, 0x3637, 0, 0, 0x5D75, 0x5D7A, 0, 0, /* 0xC0 */
+ 0, 0x4074, 0x4771, 0, 0x4867, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x5D77, 0, 0x4B21, 0, 0x5D79, /* 0xD0 */
+ 0, 0x5E24, 0, 0x5E22, 0, 0x5D7B, 0, 0, /* 0xD0 */
+ 0, 0x4B22, 0x4748, 0x3563, 0, 0x4525, 0, 0, /* 0xE0 */
+ 0x436D, 0, 0x5E25, 0, 0, 0, 0, 0x5E23, /* 0xE0 */
+ 0x4259, 0x5D76, 0, 0x314B /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x4D4E, 0x5E30, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x5E2F, 0, 0, 0, 0, 0x4076, /* 0x10 */
+ 0, 0x5E2C, 0, 0x4D6C, 0, 0, 0x4636, 0x5E26, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x4445, 0, 0, /* 0x20 */
+ 0, 0x314C, 0x393F, 0x5E29, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x3D27, 0x5E2E, 0, 0x5E2D, 0x5E28, 0, /* 0x30 */
+ 0x5E2B, 0, 0, 0x3368, 0, 0x5E2A, 0x4749, 0, /* 0x30 */
+ 0, 0x4E2E, 0, 0, 0x3E74, 0x4075, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x5E36, 0x5E34, 0, 0x494D, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x5E31, 0x5E33, 0, 0x313A, 0, /* 0x60 */
+ 0, 0x3940, 0x4F32, 0, 0x333D, 0, 0x4962, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x4D61, 0, 0, 0x3324, /* 0x70 */
+ 0x3F3B, 0x5E35, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x5E3A, 0, 0, /* 0x80 */
+ 0x3E43, 0, 0, 0, 0x4D30, 0, 0x5E37, 0, /* 0x80 */
+ 0, 0, 0, 0x5E32, 0, 0x5E38, 0, 0, /* 0x90 */
+ 0, 0x4E5E, 0, 0x4573, 0x4642, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3336, /* 0xA0 */
+ 0, 0, 0x3155, 0, 0, 0x5E3E, 0, 0, /* 0xB0 */
+ 0x5E41, 0, 0, 0, 0x4E43, 0, 0, 0, /* 0xB0 */
+ 0x4D64, 0, 0, 0, 0, 0x5E48, 0x5E42, 0x5E3F, /* 0xC0 */
+ 0, 0, 0, 0x4E54, 0x5E45, 0, 0, 0, /* 0xC0 */
+ 0, 0x3D4A, 0x5E47, 0, 0, 0x5E4C, 0, 0, /* 0xD0 */
+ 0x4571, 0x5E4A, 0, 0, 0, 0, 0x5E44, 0, /* 0xD0 */
+ 0, 0x4338, 0, 0, 0x5E4B, 0, 0x5E40, 0, /* 0xE0 */
+ 0x5E46, 0, 0x5E4D, 0x307C, 0x5E43, 0, 0x5E4E, 0, /* 0xE0 */
+ 0, 0x3F3C, 0, 0x3D5F, 0, 0x4A25, 0, 0x3A2E, /* 0xF0 */
+ 0, 0x5E3B, 0x5E49, 0x453A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4036, 0, 0x3369, /* 0x00 */
+ 0x3A51, 0x3E44, 0x5E3D, 0x3D42, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x374C, 0, 0x5E3C, 0, 0, /* 0x10 */
+ 0, 0x5E52, 0x3D6D, 0x383A, 0, 0x5E61, 0, 0x5E5B, /* 0x10 */
+ 0x3574, 0x454F, 0, 0x5E56, 0x5E5F, 0x302F, 0x3132, 0, /* 0x20 */
+ 0, 0x3239, 0, 0x5E58, 0x422C, 0x5E4F, 0x5E51, 0x3941, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x5E62, 0, 0x5E5D, 0, 0, 0, 0x5E55, 0, /* 0x30 */
+ 0, 0, 0, 0x5E5C, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x4C2B, 0, 0, 0x5E5A, 0x5E5E, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x3850, 0, /* 0x50 */
+ 0x3E45, 0, 0, 0x4339, 0, 0, 0, 0x5E54, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4D2F, /* 0x60 */
+ 0, 0, 0, 0x5E57, 0, 0, 0x5E50, 0x4572, /* 0x60 */
+ 0, 0, 0x5E53, 0, 0, 0, 0x5E59, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x4F51, 0x3C3E, /* 0x70 */
+ 0x4B7E, 0, 0x5E63, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x482E, 0, 0, 0x5E6F, /* 0x80 */
+ 0x383B, 0, 0, 0, 0, 0, 0x3D60, 0, /* 0x90 */
+ 0x5E65, 0, 0, 0, 0x4E2F, 0x3942, 0, 0x5E72, /* 0x90 */
+ 0, 0, 0x306E, 0, 0, 0x5E70, 0, 0, /* 0xA0 */
+ 0, 0, 0x5E64, 0, 0, 0, 0, 0x5E6A, /* 0xA0 */
+ 0, 0, 0x5E6C, 0, 0, 0, 0x4D4F, 0x5E67, /* 0xB0 */
+ 0, 0, 0x452E, 0, 0, 0x5E69, 0, 0, /* 0xB0 */
+ 0, 0, 0x5E71, 0, 0x5E6B, 0x4C47, 0, 0, /* 0xC0 */
+ 0, 0x5E66, 0, 0x3C22, 0x5E7E, 0, 0, 0, /* 0xC0 */
+ 0, 0x336A, 0, 0x5E68, 0x5E6D, 0x5E6E, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x426C, 0x425A, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x5E76, 0, 0, 0x5E7C, /* 0xE0 */
+ 0, 0, 0x5E7A, 0, 0x4529, 0, 0, 0x5F23, /* 0xF0 */
+ 0x5E77, 0, 0, 0, 0, 0, 0x5E78, 0x5E60 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3579, 0x493A, 0, 0, 0, 0x3C3F, 0, /* 0x00 */
+ 0, 0x3977, 0, 0, 0, 0, 0, 0x4F33, /* 0x00 */
+ 0, 0x5E74, 0, 0x5F22, 0x3169, 0x4166, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x4779, 0, 0x3441, 0x4E7A, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x4C21, 0x4452, 0, 0, 0, /* 0x20 */
+ 0, 0x5E7B, 0x5E7D, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x4132, 0, 0, 0, 0, 0, 0x5F21, 0x5E79, /* 0x30 */
+ 0, 0x5E73, 0, 0, 0, 0x3443, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x3769, 0, 0, 0, /* 0x50 */
+ 0x5F2F, 0, 0, 0x5F2A, 0x4078, 0, 0, 0x3363, /* 0x50 */
+ 0, 0, 0, 0, 0x3D61, 0, 0x5F33, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x5F2C, 0x442C, 0x5F29, /* 0x60 */
+ 0x4459, 0, 0, 0, 0x5F4C, 0, 0, 0, /* 0x70 */
+ 0x5F26, 0, 0x5F25, 0, 0x5F2E, 0, 0, 0, /* 0x70 */
+ 0x5F28, 0x5F27, 0x5F2D, 0, 0x4021, 0, 0x5F24, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x5F30, 0, /* 0x80 */
+ 0, 0x5F31, 0, 0, 0, 0, 0, 0x3442, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5F36, 0, 0x5F35, 0x5F37, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x5F3A, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x4543, 0, 0x5F34, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x5F38, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x3763, 0x4279, 0x5F32, 0x473B, 0, 0, 0x5F39, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x5F3E, 0x5F3C, 0, 0, /* 0xD0 */
+ 0x5F3F, 0, 0, 0x5F42, 0, 0, 0, 0x5F3B, /* 0xD0 */
+ 0x396A, 0x4728, 0, 0, 0x5E39, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x4D74, 0x5F3D, 0, 0x5F41, 0x4275, /* 0xE0 */
+ 0, 0x5F40, 0, 0x5F2B, 0, 0, 0x6F69, 0, /* 0xF0 */
+ 0, 0, 0x5F45, 0, 0, 0, 0x5F49 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5F47, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x5F43, 0, 0x5F44, 0, 0, 0, 0x5F48, /* 0x00 */
+ 0, 0x5F46, 0, 0, 0, 0x494E, 0, 0, /* 0x10 */
+ 0x5F4E, 0, 0x5F4B, 0x5F4A, 0, 0x5F4D, 0x4654, 0x5F4F, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x4375, 0x426D, /* 0x20 */
+ 0, 0, 0, 0, 0x4025, 0, 0, 0, /* 0x20 */
+ 0x5F50, 0, 0x5F52, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x5F51, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x5E75, 0, 0, 0, /* 0x40 */
+ 0, 0x5F53, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x4667, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x5F54, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x3250, 0, 0, 0, 0x4574, /* 0x60 */
+ 0x3325, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x3564, 0, 0, 0, 0x3C5E, 0x3A52, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x4F27, 0x3F66, 0, 0, 0, 0x316A, 0, /* 0x80 */
+ 0, 0, 0x5F56, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5F55, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x5F59, 0x433A, 0x5F5C, 0x5F57, /* 0xA0 */
+ 0, 0, 0, 0x5F5B, 0, 0, 0, 0, /* 0xB0 */
+ 0x5F5A, 0x4540, 0x3059, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x4E75, 0, 0, 0x5F5E, 0, 0, 0, 0x3128, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x5F60, 0, 0, 0, 0x5F5F, 0, 0x5F5D, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x5F58, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x4B23, 0, 0, 0, 0x5F62 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x5F61, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x316B, 0, 0, 0, /* 0x10 */
+ 0, 0x5F64, 0x4A32, 0, 0x5F63, 0, 0, 0, /* 0x10 */
+ 0, 0x4C35, 0, 0, 0, 0, 0x3E47, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x4133, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x3E46, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x4E7B, 0, 0, 0x5F6A, 0, 0x4079, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x5F66, 0x5F6B, 0, /* 0x50 */
+ 0, 0x316C, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x5F69, 0, 0x4761, 0x5F65, 0x5F68, 0x3E48, /* 0x60 */
+ 0, 0x4851, 0, 0, 0x5F6C, 0, 0x3C51, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x407A, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x5F6F, 0, 0, 0, /* 0x80 */
+ 0x5F67, 0, 0x3727, 0, 0, 0, 0, 0x5F6D, /* 0x80 */
+ 0, 0, 0, 0, 0x4D50, 0x5F70, 0, 0, /* 0x90 */
+ 0, 0x7426, 0, 0, 0, 0, 0, 0x3D4F, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x5F71, 0, 0, 0, 0x5F72, 0, 0, 0, /* 0xA0 */
+ 0, 0x472E, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x5F74, 0, 0, 0, 0, 0x5F75, 0, /* 0xB0 */
+ 0, 0, 0, 0x4733, 0, 0, 0, 0, /* 0xC0 */
+ 0x4575, 0x5F77, 0, 0, 0, 0, 0x5F79, 0, /* 0xC0 */
+ 0x4E55, 0, 0x5F76, 0, 0x5F78, 0x316D, 0, 0x5F73, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x535B, /* 0xD0 */
+ 0x5F7A, 0, 0, 0, 0, 0x4167, 0x3B38, 0x5F7C, /* 0xE0 */
+ 0, 0, 0, 0, 0x5F7B, 0x3F24, 0x5259, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x5F7D, 0, 0, /* 0xF0 */
+ 0, 0x6021, 0, 0x5F6E, 0x5F7E, 0, 0, 0x6022 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x477A, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x6023, 0, 0, /* 0x00 */
+ 0x6024, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x6025, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x6026, 0, 0x445E, 0, 0x6028, 0x6027, 0, 0, /* 0x20 */
+ 0x6029, 0, 0x602A, 0, 0, 0x3C5F, 0x4963, 0, /* 0x30 */
+ 0, 0, 0x4C6C, 0x602B, 0x602C, 0x4156, 0x3C24, 0x602D, /* 0x30 */
+ 0x602E, 0, 0, 0, 0, 0, 0x602F, 0x4A52, /* 0x40 */
+ 0x4847, 0, 0, 0x6030, 0x4757, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x442D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x6031, 0x3267, 0, 0x356D, 0, 0x4C46, 0, 0x4C36, /* 0x50 */
+ 0, 0x3234, 0x4F34, 0, 0, 0, 0, 0x4B52, /* 0x60 */
+ 0, 0x4A2A, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x4037, 0, 0x6032, 0, 0, 0, /* 0x70 */
+ 0, 0x4643, 0, 0, 0, 0x3823, 0x6033, 0, /* 0x70 */
+ 0x3A54, 0x6035, 0x6034, 0, 0, 0, 0, 0x6036, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x6037, 0, 0, 0, 0x6038, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x353E, 0, 0x6039, 0, 0, 0, 0, 0x603A, /* 0xA0 */
+ 0, 0, 0, 0, 0x3824, 0, 0, 0x4848, /* 0xA0 */
+ 0, 0, 0x603C, 0, 0, 0, 0x3E75, 0, /* 0xB0 */
+ 0, 0x603B, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x3638, 0x603D, 0x603F, 0, 0x603E, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x6040, 0, /* 0xC0 */
+ 0x3851, 0, 0x6041, 0, 0, 0, 0, 0x3669, /* 0xD0 */
+ 0, 0x4140, 0, 0x397D, 0, 0, 0, 0, /* 0xD0 */
+ 0x6043, 0x6044, 0x6042, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x3C6D, 0, 0, 0x4648, 0x3639, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6046, /* 0xF0 */
+ 0x432C, 0x6045, 0, 0, 0x4F35, 0x4762 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x6049, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x604B, 0x6048, /* 0x10 */
+ 0, 0, 0, 0x4C54, 0x604A, 0x604C, 0, 0x4E44, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x6050, 0, 0, /* 0x20 */
+ 0, 0x604F, 0x4376, 0x472D, 0, 0, 0x3825, 0x604E, /* 0x20 */
+ 0, 0, 0, 0, 0x604D, 0, 0x4D31, 0x4D32, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x6051, 0x316E, /* 0x30 */
+ 0, 0, 0, 0, 0x3976, 0x3B62, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x6052, 0x6053, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6055, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x3D43, 0, 0, 0, 0, /* 0x60 */
+ 0x6057, 0, 0x6056, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x6058, 0, 0x334D, 0, 0, 0x605A, 0, 0, /* 0x70 */
+ 0x6059, 0, 0x605C, 0x605B, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x383C, 0, 0, 0x4E28, /* 0x80 */
+ 0, 0x364C, 0, 0x3226, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x366A, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x3461, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x4E68, 0x605E, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x6060, 0, 0, 0, 0, /* 0xB0 */
+ 0x6061, 0, 0x3251, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x605D, 0, 0x3B39, 0, 0, 0x4441, 0x605F, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0x6064, 0, /* 0xD0 */
+ 0x3C6E, 0, 0, 0, 0, 0x6062, 0, 0, /* 0xE0 */
+ 0, 0, 0x373E, 0, 0, 0x4849, 0x6063, 0, /* 0xE0 */
+ 0, 0x607E, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x6069, 0, 0, 0, 0, 0, 0x383D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3565, 0, 0x6066, 0x4D7D, 0, /* 0x00 */
+ 0, 0x4E30, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x4276, 0, 0, 0x6068, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x606A, 0x4E56, 0x3657, 0x487C, 0x474A, 0, /* 0x30 */
+ 0, 0, 0x606B, 0, 0, 0, 0, 0x606D, /* 0x30 */
+ 0, 0x6070, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x606C, 0, 0, /* 0x50 */
+ 0, 0x606F, 0x386A, 0x314D, 0x6071, 0, 0x3F70, 0x606E, /* 0x50 */
+ 0x4E5C, 0, 0, 0x6074, 0x7424, 0, 0, 0, /* 0x60 */
+ 0, 0x6072, 0x6075, 0, 0, 0, 0, 0x6067, /* 0x60 */
+ 0x6073, 0, 0, 0x3A3C, 0, 0, 0x6076, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x6077, 0, /* 0x70 */
+ 0, 0, 0, 0x4D7E, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x6078, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x6079, 0, /* 0x90 */
+ 0, 0, 0x6065, 0, 0, 0, 0, 0x607A, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x3444, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x3C25, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x607B, 0, 0, 0, 0, 0x607C, /* 0xC0 */
+ 0, 0, 0, 0, 0x607D, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x313B, 0, 0, 0, /* 0xD0 */
+ 0x6121, 0, 0x493B, 0x6122, 0, 0, 0x3424, 0x6123, /* 0xE0 */
+ 0, 0x6124, 0, 0, 0, 0, 0x6125, 0, /* 0xE0 */
+ 0x6127, 0x6128, 0x6126, 0, 0, 0, 0x4953, 0x612A, /* 0xF0 */
+ 0x6129 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x612C, 0x612B, 0x612D, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x612E, 0x6130, 0x612F, 0, /* 0x00 */
+ 0, 0x3979, 0, 0x6132, 0, 0x6131, 0, 0, /* 0x10 */
+ 0x3445, 0, 0x3F53, 0, 0x453C, 0, 0x6133, 0x4038, /* 0x10 */
+ 0, 0, 0, 0x3B3A, 0, 0x3179, 0x6134, 0, /* 0x20 */
+ 0x4D51, 0, 0, 0x4A63, 0x6135, 0, 0, 0, /* 0x20 */
+ 0x4544, 0x4D33, 0x3943, 0x3F3D, 0, 0, 0, 0x434B, /* 0x30 */
+ 0x5234, 0, 0x442E, 0x3268, 0x6136, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x6137, 0, 0x613C, 0, /* 0x40 */
+ 0, 0x613A, 0x6139, 0x5A42, 0x3326, 0x6138, 0, 0x305A, /* 0x40 */
+ 0, 0x482A, 0, 0, 0x484A, 0, 0, 0, /* 0x50 */
+ 0, 0x4E31, 0x613D, 0x613B, 0x435C, 0x4026, 0, 0, /* 0x50 */
+ 0x482B, 0, 0x492D, 0, 0x613F, 0x4E2C, 0x374D, 0x6140, /* 0x60 */
+ 0, 0x613E, 0x4856, 0x6141, 0, 0x6142, 0, 0, /* 0x60 */
+ 0x305B, 0, 0, 0x3E76, 0x6147, 0, 0x6144, 0x466D, /* 0x70 */
+ 0x6143, 0, 0, 0, 0, 0, 0, 0x3526, /* 0x70 */
+ 0, 0, 0x614A, 0, 0, 0, 0x6145, 0x6146, /* 0x80 */
+ 0, 0x6149, 0x6148, 0x4925, 0, 0, 0x4142, 0x4141, /* 0x80 */
+ 0, 0x353F, 0, 0, 0x614B, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x614C, 0, 0, 0x614D, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x614F, 0, 0x614E, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x3156, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x6157, 0x4868, 0x6151, 0, 0x6153, 0, 0, /* 0xB0 */
+ 0x6155, 0x3F3E, 0, 0, 0x6156, 0x6154, 0x3C40, 0, /* 0xB0 */
+ 0, 0, 0x6150, 0x6152, 0, 0x4942, 0, 0x3E49, /* 0xC0 */
+ 0, 0, 0x6159, 0, 0, 0x6158, 0, 0, /* 0xC0 */
+ 0, 0, 0x615A, 0, 0x3C26, 0x3A2F, 0, 0, /* 0xD0 */
+ 0x4577, 0x615B, 0, 0x444B, 0, 0, 0x615D, 0, /* 0xD0 */
+ 0, 0, 0x4E21, 0x615C, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x4169, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x6162, 0, 0x6164, 0x6165, 0x4354, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x6163, 0, 0x6160, 0, 0x615E, 0x615F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6161, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x6168, 0, 0x6166, 0, 0x6167, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6169, /* 0x10 */
+ 0x616B, 0x616C, 0x616D, 0, 0x616E, 0, 0, 0x616A, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x6170, 0, 0, 0, 0x616F, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x6171, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x4E45, 0, 0, 0, 0x6174, 0x6172, /* 0x40 */
+ 0x6173, 0, 0, 0, 0x3462, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x4C7E, 0, 0, 0, 0x4A4A, 0, /* 0x50 */
+ 0x6176, 0, 0, 0, 0x6175, 0, 0, 0, /* 0x50 */
+ 0, 0x6177, 0x6178, 0, 0, 0, 0, 0x617C, /* 0x60 */
+ 0x6179, 0x617A, 0x617B, 0, 0x617D, 0, 0, 0, /* 0x60 */
+ 0x617E, 0, 0x6221, 0, 0, 0, 0x6222, 0, /* 0x70 */
+ 0x6223, 0, 0x482F, 0x4550, 0x6224, 0x4772, 0x4934, 0, /* 0x70 */
+ 0x6225, 0, 0, 0x6226, 0x452A, 0, 0x3327, 0x3944, /* 0x80 */
+ 0x6227, 0, 0, 0x6228, 0, 0, 0x6229, 0, /* 0x80 */
+ 0x3B29, 0, 0, 0x622B, 0, 0, 0x622A, 0, /* 0x90 */
+ 0, 0x622C, 0x622D, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x4869, 0, /* 0xA0 */
+ 0x622E, 0, 0, 0, 0x622F, 0, 0, 0x7369, /* 0xB0 */
+ 0x6230, 0x6231, 0x6232, 0, 0, 0, 0, 0x3B2E, /* 0xB0 */
+ 0, 0, 0x6233, 0x4756, 0, 0, 0x4B5F, 0, /* 0xC0 */
+ 0x314E, 0, 0x3157, 0, 0, 0x6234, 0, 0, /* 0xC0 */
+ 0, 0, 0x6236, 0, 0, 0, 0x6235, 0x4570, /* 0xD0 */
+ 0, 0, 0, 0x4039, 0x5D39, 0, 0x6237, 0x4C41, /* 0xD0 */
+ 0, 0x6238, 0, 0x3446, 0x4857, 0x6239, 0, 0x623A, /* 0xE0 */
+ 0, 0, 0x623B, 0, 0, 0, 0x4C5C, 0, /* 0xE0 */
+ 0, 0, 0x4C55, 0, 0x443E, 0, 0, 0, /* 0xF0 */
+ 0x416A, 0, 0, 0x623D, 0, 0, 0x3D62 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3E4A, 0, 0, 0x6240, 0, 0, 0x623F, /* 0x00 */
+ 0x623E, 0x487D, 0, 0x3447, 0x3829, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x6246, 0, 0, 0x6243, 0x3F3F, /* 0x10 */
+ 0x4C32, 0, 0, 0, 0x6242, 0x6244, 0x6245, 0, /* 0x20 */
+ 0, 0x6241, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6247, /* 0x30 */
+ 0x6248, 0, 0x442F, 0, 0x3463, 0, 0, 0, /* 0x30 */
+ 0x4365, 0, 0, 0, 0, 0, 0, 0x6249, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x624A, 0x624D, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x3F67, 0, 0x4644, 0, 0x624E, 0x4B53, 0, /* 0x60 */
+ 0x624B, 0, 0, 0x624C, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x6251, 0, 0, 0, 0, 0x6250, 0x624F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x6253, 0, 0, 0x6252, 0, /* 0x80 */
+ 0, 0x6254, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x6256, 0, /* 0x90 */
+ 0x6255, 0, 0, 0, 0, 0x4A4D, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x3D56, 0x4E46, 0, 0, /* 0xA0 */
+ 0x6257, 0, 0, 0x4637, 0, 0, 0x6258, 0, /* 0xB0 */
+ 0, 0x6259, 0, 0x625D, 0x625B, 0x625C, 0, 0x625A, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x625E, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x625F, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6260, /* 0xD0 */
+ 0, 0, 0x6261, 0x4C37, 0x6262, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x4C70, 0x6263, 0, 0x434E, 0, 0x476A, /* 0xE0 */
+ 0, 0x366B, 0, 0, 0, 0x433B, 0x6264, 0x363A, /* 0xE0 */
+ 0, 0, 0, 0x4050, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x6265 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3A3D, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x6266, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x6267, 0, 0x3826, 0x3A55, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x6269, 0, 0, 0, 0, 0x4556, 0x3A56, 0x354E, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x4B24, 0, 0x474B, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x4557, 0, 0, 0, 0, 0x395C, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x626B, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x3E4B, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x4E32, 0x3945, 0, 0, 0x3827, /* 0x60 */
+ 0, 0, 0x4823, 0, 0x626D, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x626F, 0, 0, 0, /* 0x70 */
+ 0, 0x386B, 0, 0, 0, 0, 0x626E, 0x4476, /* 0x80 */
+ 0, 0, 0, 0, 0x6271, 0x3337, 0x626C, 0, /* 0x80 */
+ 0, 0x486A, 0, 0x3130, 0, 0x3A6C, 0, 0x4F52, /* 0x90 */
+ 0, 0, 0x6270, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x6272, 0, 0, 0, 0x4A4B, /* 0xA0 */
+ 0, 0x4059, 0x6274, 0, 0, 0, 0, 0x6275, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x6273, 0, 0, /* 0xB0 */
+ 0, 0, 0x334E, 0, 0x627B, 0, 0x627A, 0, /* 0xB0 */
+ 0, 0x3C27, 0, 0, 0, 0x627C, 0x6277, 0, /* 0xC0 */
+ 0, 0, 0x627D, 0x6278, 0, 0, 0, 0, /* 0xC0 */
+ 0x4858, 0x6276, 0, 0, 0x6279, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x6322, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6321, /* 0xE0 */
+ 0x4B61, 0, 0, 0, 0x627E, 0, 0, 0x306B, /* 0xE0 */
+ 0, 0, 0, 0, 0x6324, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0x6323 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3E4C, 0, 0, 0, 0, 0, 0x6325, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x4143, 0, /* 0x00 */
+ 0, 0x6327, 0x6326, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x6328, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x6268, 0, /* 0x20 */
+ 0, 0, 0x626A, 0x632A, 0x6329, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x3C28, 0, 0x4E69, 0, 0x3C52, 0, /* 0x30 */
+ 0x632B, 0x3737, 0, 0, 0, 0, 0, 0x3540, /* 0x40 */
+ 0x3527, 0x3B63, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x4D34, 0, 0, 0x6331, 0, 0x6330, 0x4144, 0x632D, /* 0x50 */
+ 0, 0, 0x632F, 0, 0, 0x3D4B, 0x3F40, 0x632E, /* 0x50 */
+ 0x632C, 0, 0x472A, 0, 0, 0x3E4D, 0, 0, /* 0x60 */
+ 0x493C, 0, 0, 0, 0, 0x3A57, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4578, /* 0x70 */
+ 0, 0, 0x6332, 0, 0, 0, 0, 0x6333, /* 0x70 */
+ 0x6349, 0x3658, 0, 0, 0x4F3D, 0x4135, 0, 0, /* 0x80 */
+ 0, 0, 0x6334, 0, 0, 0x3252, 0x4477, 0x4A21, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x6335, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x357A, 0x6336, /* 0xA0 */
+ 0, 0, 0x6338, 0, 0, 0, 0x6339, 0, /* 0xA0 */
+ 0x4729, 0, 0, 0x633A, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x633B, 0x633C, 0, 0, 0x3659, 0x3253, 0x4645, /* 0xB0 */
+ 0x3D28, 0x3B64, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x633D, 0, 0x3D29, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x324A, 0x4943, 0, 0, 0x633E, 0, 0, /* 0xD0 */
+ 0x486B, 0, 0, 0, 0, 0, 0, 0x4145, /* 0xD0 */
+ 0, 0x6341, 0, 0x6342, 0x4769, 0, 0x3F41, 0x633F, /* 0xE0 */
+ 0, 0x4361, 0, 0, 0x6340, 0, 0, 0, /* 0xE0 */
+ 0x3E4E, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0x305C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3529, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x6343, 0, 0, 0x4478, 0, 0x6344, 0x4047, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x4C2D, 0, 0, 0x4923, /* 0x10 */
+ 0x6345, 0x6346, 0x4355, 0, 0x4E47, 0, 0, 0x6348, /* 0x10 */
+ 0x6347, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x3C6F, 0, /* 0x20 */
+ 0, 0x634A, 0x3070, 0, 0, 0, 0, 0x634D, /* 0x30 */
+ 0, 0, 0, 0x634B, 0x3254, 0x374E, 0x634C, 0x3946, /* 0x30 */
+ 0x3972, 0, 0x4A66, 0x634E, 0, 0, 0x4B54, 0, /* 0x40 */
+ 0, 0x6350, 0, 0, 0, 0x4051, 0x314F, 0x323A, /* 0x40 */
+ 0x302C, 0, 0, 0, 0, 0, 0, 0x634F, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x6351, 0x6352, 0x3E77, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x6353, 0, 0x334F, 0, 0, 0, 0, /* 0x60 */
+ 0x6355, 0, 0, 0, 0x376A, 0, 0x3566, 0, /* 0x70 */
+ 0, 0x6356, 0x3675, 0, 0, 0x6357, 0, 0x407C, /* 0x70 */
+ 0, 0x464D, 0, 0x4060, 0x3A75, 0, 0, 0, /* 0x80 */
+ 0x6358, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x4362, 0x416B, 0, 0x635A, 0x635C, 0x6359, /* 0x90 */
+ 0x635B, 0, 0, 0, 0, 0, 0, 0x3722, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x635D, 0x3726, 0, 0, 0, 0x3567, 0x4D52, /* 0xA0 */
+ 0x635F, 0, 0, 0, 0, 0, 0x6360, 0, /* 0xB0 */
+ 0, 0, 0x312E, 0, 0, 0, 0, 0x6363, /* 0xB0 */
+ 0, 0, 0, 0x3376, 0x6362, 0x6361, 0, 0x6365, /* 0xC0 */
+ 0x635E, 0, 0x6366, 0x4E29, 0, 0x6367, 0, 0x6368, /* 0xC0 */
+ 0, 0, 0x5474, 0x636A, 0, 0x6369, 0, 0, /* 0xD0 */
+ 0, 0x636B, 0x636C, 0, 0x4E35, 0x636D, 0, 0x706F, /* 0xD0 */
+ 0x3E4F, 0x636E, 0x636F, 0x3D57, 0, 0x4638, 0x6370, 0, /* 0xE0 */
+ 0, 0, 0x4328, 0, 0, 0x6371, 0, 0x433C, /* 0xE0 */
+ 0x6372, 0, 0, 0, 0, 0, 0x3625, 0, /* 0xF0 */
+ 0x513F, 0x435D, 0x3C33, 0, 0, 0, 0, 0x3448 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6373, 0, 0x6422, 0, 0x6376, 0, /* 0x00 */
+ 0x3568, 0, 0x6375, 0x6424, 0, 0, 0, 0x6374, /* 0x00 */
+ 0, 0x3E50, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x6378, 0x6379, 0, 0x452B, 0, 0, 0x637A, 0, /* 0x10 */
+ 0x335E, 0, 0, 0, 0, 0x3F5A, 0x4964, 0, /* 0x20 */
+ 0x637C, 0, 0, 0, 0x4268, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x6377, 0, 0x637B, 0x637D, 0, /* 0x30 */
+ 0, 0x3A7B, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x6426, 0x492E, 0, /* 0x40 */
+ 0x4826, 0x4579, 0, 0x365A, 0x6425, 0x6423, 0, 0x4835, /* 0x40 */
+ 0x637E, 0x435E, 0x457B, 0, 0x457A, 0, 0x3A76, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x6438, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x6428, 0, 0x642A, /* 0x60 */
+ 0, 0, 0, 0, 0x642D, 0, 0x642E, 0, /* 0x60 */
+ 0x642B, 0x642C, 0, 0, 0x6429, 0x6427, 0, 0, /* 0x70 */
+ 0, 0, 0x6421, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x4A4F, 0x3255, /* 0x80 */
+ 0, 0, 0, 0x6435, 0, 0x6432, 0, 0x6437, /* 0x80 */
+ 0, 0, 0x6436, 0, 0x4773, 0x4C27, 0, 0x3B3B, /* 0x90 */
+ 0x6430, 0x6439, 0x6434, 0, 0x6433, 0x642F, 0, 0x6431, /* 0x90 */
+ 0, 0x3449, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x433D, 0, 0, 0x407D, 0, 0, /* 0xA0 */
+ 0, 0x4822, 0, 0, 0x643E, 0, 0, 0, /* 0xB0 */
+ 0x4824, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x4061, 0x643B, 0, 0, 0x484F, 0, 0x643F, 0x4A53, /* 0xC0 */
+ 0, 0x435B, 0, 0x643A, 0x643C, 0, 0, 0x643D, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x6440, 0, 0, /* 0xD0 */
+ 0x3C44, 0, 0, 0, 0x4646, 0x6445, 0x6444, 0, /* 0xE0 */
+ 0, 0x6441, 0, 0, 0, 0x4F36, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x644A, 0, 0, 0x644E, 0x644B /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6447, 0, 0, 0, 0, 0, 0, 0x6448, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x644D, 0, 0, /* 0x00 */
+ 0, 0x6442, 0x5255, 0x6449, 0x6443, 0, 0, 0x644C, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6452, /* 0x10 */
+ 0, 0x344A, 0, 0x644F, 0, 0, 0, 0x6450, /* 0x20 */
+ 0, 0, 0x6451, 0x6454, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6453, /* 0x30 */
+ 0x4876, 0, 0, 0, 0, 0x6455, 0x4E7C, 0x4A6D, /* 0x30 */
+ 0x645A, 0, 0, 0x6457, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x6456, 0x4052, 0, 0x6459, /* 0x40 */
+ 0x645B, 0, 0, 0, 0x6458, 0, 0x645F, 0, /* 0x50 */
+ 0x645C, 0, 0, 0, 0, 0, 0, 0x645D, /* 0x50 */
+ 0x6446, 0, 0, 0, 0x645E, 0x6460, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x6461, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x4A46, 0, 0x6462, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x4C62, 0, /* 0x70 */
+ 0, 0x364E, 0x3729, 0x6463, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x4A34, 0, 0x3F68, 0, 0x4C30, 0, 0, /* 0x80 */
+ 0x6464, 0, 0x4E33, 0, 0, 0x4774, 0, 0x4146, /* 0x90 */
+ 0x4734, 0, 0, 0x3D4D, 0, 0, 0, 0x3040, /* 0x90 */
+ 0, 0x6469, 0x6467, 0, 0x6465, 0x3421, 0, 0x3E51, /* 0xA0 */
+ 0x646A, 0, 0, 0x6468, 0, 0x6466, 0x646E, 0, /* 0xA0 */
+ 0, 0x646D, 0x646C, 0x646B, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x646F, 0, 0, 0, 0x6470, 0x403A, 0, /* 0xB0 */
+ 0x6471, 0, 0x6473, 0, 0, 0x6472, 0, 0, /* 0xC0 */
+ 0, 0, 0x3852, 0, 0, 0, 0x4138, 0, /* 0xC0 */
+ 0, 0, 0x6475, 0, 0, 0, 0x457C, 0, /* 0xD0 */
+ 0x6474, 0, 0, 0, 0x6476, 0, 0x4A35, 0x416C, /* 0xD0 */
+ 0x3947, 0, 0x6477, 0, 0, 0, 0, 0x4E48, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6479, /* 0xE0 */
+ 0, 0, 0x647A, 0, 0x647B, 0, 0x647C, 0, /* 0xF0 */
+ 0x3B65, 0, 0x647D, 0x374F, 0, 0, 0x356A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x352A, 0, 0x6521, 0, 0x4C73, 0x3948, 0x647E, 0, /* 0x00 */
+ 0, 0, 0x6524, 0x4C66, 0, 0x473C, 0, 0, /* 0x00 */
+ 0x4933, 0, 0, 0, 0x3D63, 0x6523, 0, 0x3C53, /* 0x10 */
+ 0x3949, 0x3B66, 0x3569, 0x4A36, 0x6522, 0, 0, 0, /* 0x10 */
+ 0x4147, 0x4B42, 0x3A77, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x3B67, 0x445D, 0, 0x6527, 0x4E5F, /* 0x20 */
+ 0x3A59, 0, 0x6528, 0x3F42, 0, 0x652A, 0, 0, /* 0x30 */
+ 0, 0x3E52, 0x3A30, 0, 0, 0, 0, 0x6529, /* 0x30 */
+ 0, 0, 0x3D2A, 0x383E, 0x4148, 0x6525, 0x652B, 0, /* 0x40 */
+ 0, 0, 0, 0x6526, 0x3750, 0, 0x652E, 0x6532, /* 0x40 */
+ 0x376B, 0, 0, 0, 0, 0, 0x652D, 0, /* 0x50 */
+ 0, 0, 0, 0x6536, 0, 0, 0x394A, 0, /* 0x50 */
+ 0, 0x4D6D, 0x303C, 0x6533, 0, 0, 0x356B, 0, /* 0x60 */
+ 0x6530, 0, 0, 0, 0, 0, 0x6531, 0, /* 0x60 */
+ 0, 0x457D, 0x652F, 0x652C, 0, 0x3328, 0x4064, 0, /* 0x70 */
+ 0, 0x3828, 0, 0, 0, 0x6538, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x6535, 0, 0, 0, 0, 0, 0x6537, /* 0x80 */
+ 0, 0, 0, 0x6534, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x3751, 0x4233, 0x6539, 0x416E, 0, 0, 0x6546, /* 0x90 */
+ 0, 0, 0x6542, 0x653C, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x6540, 0x3C7A, 0x305D, 0x653B, 0x6543, /* 0xA0 */
+ 0x6547, 0x394B, 0x4C56, 0, 0x4456, 0x653D, 0, 0, /* 0xB0 */
+ 0x6545, 0, 0x653A, 0x433E, 0, 0x653F, 0x303D, 0x4C4A, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x653E, /* 0xC0 */
+ 0, 0, 0x365B, 0x486C, 0, 0, 0, 0x416D, /* 0xC0 */
+ 0, 0x4E50, 0x3D6F, 0, 0, 0x656E, 0, 0, /* 0xD0 */
+ 0x6548, 0, 0x407E, 0, 0x6544, 0x6549, 0x654B, 0, /* 0xD0 */
+ 0x4479, 0x654E, 0, 0, 0x654A, 0, 0, 0, /* 0xE0 */
+ 0x4A54, 0x344B, 0, 0, 0x4C4B, 0, 0, 0x305E, /* 0xE0 */
+ 0, 0, 0x654D, 0, 0x4E7D, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0x654C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x316F, 0, 0, 0x466C, 0x654F, 0, 0, /* 0x00 */
+ 0, 0x6556, 0x6550, 0x6557, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x6553, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x477B, 0, 0, 0x3C4A, 0x6555, /* 0x10 */
+ 0, 0x6552, 0x6558, 0x6551, 0, 0, 0x3D44, 0, /* 0x20 */
+ 0, 0, 0, 0x4B25, 0, 0, 0x3D4C, 0, /* 0x20 */
+ 0, 0x6554, 0x6560, 0, 0, 0x655C, 0, 0x655F, /* 0x30 */
+ 0, 0x655D, 0x6561, 0x655B, 0, 0x6541, 0x4053, 0, /* 0x30 */
+ 0, 0x484B, 0, 0x655E, 0, 0, 0x6559, 0, /* 0x40 */
+ 0, 0, 0x4121, 0x3752, 0, 0x3D2B, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x3F25, 0x4136, 0x6564, 0, /* 0x50 */
+ 0, 0x6566, 0x6567, 0, 0, 0x6563, 0x6565, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x655A, 0x6562, /* 0x60 */
+ 0, 0x656A, 0x6569, 0, 0, 0x4B7A, 0, 0, /* 0x60 */
+ 0x372B, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x6568, 0, 0x656C, 0x656B, 0x656F, 0, 0x6571, /* 0x70 */
+ 0, 0, 0x3B3C, 0x656D, 0, 0, 0, 0, /* 0x80 */
+ 0x6572, 0x6573, 0, 0, 0x6574, 0, 0x657A, 0x453B, /* 0x80 */
+ 0x6576, 0, 0x6575, 0x6577, 0x6578, 0, 0x6579, 0, /* 0x90 */
+ 0, 0, 0, 0x657B, 0x657C /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x344C, 0, /* 0x30 */
+ 0x657D, 0, 0x657E, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x6621, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x6622, 0x6623, 0x6624, 0, /* 0x40 */
+ 0x6625, 0x6626, 0, 0, 0x6628, 0x6627, 0, 0, /* 0x50 */
+ 0x6629, 0, 0, 0, 0, 0, 0, 0x662A, /* 0x50 */
+ 0x662B, 0, 0, 0, 0, 0, 0, 0x662E, /* 0x60 */
+ 0x662C, 0x662D, 0x3A61, 0x3753, 0, 0, 0x4356, 0, /* 0x60 */
+ 0x4833, 0, 0x3D70, 0, 0, 0x474D, 0, 0x486D, /* 0x70 */
+ 0x662F, 0x586D, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x6630, 0x6632, 0, 0x4D65, 0x6631, 0x6634, /* 0x80 */
+ 0x6633, 0, 0x4D53, 0, 0x6635, 0, 0x487E, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x6636, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x6639, 0, 0, 0x6638, 0x6637, 0, /* 0x90 */
+ 0, 0, 0, 0x663A, 0x3732, 0, 0, 0, /* 0xA0 */
+ 0x4122, 0x3541, 0, 0, 0, 0, 0x663E, 0x663B, /* 0xA0 */
+ 0, 0, 0x663C, 0, 0, 0, 0x663F, 0, /* 0xB0 */
+ 0x6640, 0x663D, 0, 0, 0, 0x3129, 0, 0, /* 0xB0 */
+ 0, 0x3227, 0, 0, 0, 0x6642, 0x6643, 0, /* 0xC0 */
+ 0, 0, 0x6644, 0, 0x4D62, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x3D2C, 0, 0x6646, 0x6645, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x3F69, 0x6647, 0, 0, 0, 0, 0x6648, 0, /* 0xE0 */
+ 0, 0x6649, 0, 0x3465, 0, 0, 0, 0, /* 0xE0 */
+ 0x344D, 0, 0, 0x664A, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x664B, 0, 0x4B5D, 0x4D63 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4D54, 0x4F37, 0, 0x394D, 0x664E, 0x3C54, 0x664D, 0, /* 0x00 */
+ 0, 0, 0, 0x664F, 0x3C29, 0, 0, 0, /* 0x00 */
+ 0x4251, 0, 0x6650, 0, 0, 0x394C, 0, 0x4C57, /* 0x10 */
+ 0x6651, 0x6652, 0, 0, 0x6653, 0, 0, 0, /* 0x10 */
+ 0, 0x6654, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x6655, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x3C2A, 0, 0, 0x4C6D, 0, /* 0x30 */
+ 0, 0, 0, 0x6657, 0, 0x433F, 0, 0x6656, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x6659, 0, /* 0x40 */
+ 0, 0, 0x6658, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x665A, 0, 0, 0, 0x403B, 0, /* 0x50 */
+ 0x665B, 0, 0x665C, 0, 0, 0, 0x4A39, 0x665D, /* 0x50 */
+ 0, 0x416F, 0x665E, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x665F, 0, 0, 0, 0, 0, 0, 0x4E7E, /* 0x60 */
+ 0x6662, 0, 0x6661, 0x6660, 0x4430, 0, 0x6663, 0x3F26, /* 0x70 */
+ 0, 0x6664, 0, 0, 0, 0x6665, 0x4F38, 0x6666, /* 0x70 */
+ 0, 0, 0, 0, 0x6667, 0x6669, 0x6668, 0x4825, /* 0x80 */
+ 0, 0x4679, 0, 0x4F3E, 0x4829, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x666B, 0, 0, 0x3E53, 0, /* 0x90 */
+ 0x492A, 0, 0x666C, 0x666A, 0, 0x344E, 0, 0, /* 0x90 */
+ 0, 0x3854, 0x3B68, 0, 0, 0x486E, 0, 0, /* 0xA0 */
+ 0, 0x382A, 0x4B43, 0, 0x666F, 0x666D, 0, 0x394E, /* 0xA0 */
+ 0, 0x394F, 0x3069, 0, 0x3A68, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x4759, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x305F, 0x6674, 0, 0x4340, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x4758, 0, 0x425B, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x6676, 0, /* 0xD0 */
+ 0, 0x6672, 0x6675, 0x6670, 0, 0x6673, 0x4B26, 0, /* 0xD0 */
+ 0, 0x3855, 0, 0, 0x307D, 0x6671, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6678, /* 0xE0 */
+ 0, 0x6679, 0, 0, 0x4639, 0, 0, 0, /* 0xF0 */
+ 0x363B, 0, 0, 0, 0x6726, 0x473D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3B69, 0, 0, 0x363C, 0x4048, 0x4F46, /* 0x00 */
+ 0x4C2E, 0x6677, 0x4054, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x3553, 0x667A, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x667C, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x667B, 0, 0, 0, 0, 0, 0x667D, /* 0x20 */
+ 0, 0x4326, 0, 0x473E, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x4431, 0, 0, 0, 0, 0x6723, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x6722, 0, /* 0x40 */
+ 0, 0, 0, 0x667E, 0, 0, 0x3F55, 0, /* 0x40 */
+ 0x4965, 0x6725, 0, 0x6724, 0x3950, 0x4F53, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6735, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x6729, 0x672A, 0, /* 0x60 */
+ 0, 0, 0, 0x3C70, 0, 0, 0x6728, 0, /* 0x60 */
+ 0x3978, 0x6727, 0, 0, 0x672B, 0, 0, 0, /* 0x70 */
+ 0x4432, 0x4A22, 0x4123, 0, 0, 0, 0, 0x425C, /* 0x70 */
+ 0x672F, 0, 0x6730, 0x672C, 0, 0, 0, 0, /* 0x80 */
+ 0x672D, 0, 0x672E, 0, 0, 0, 0, 0x3951, /* 0x80 */
+ 0, 0, 0, 0x6736, 0, 0x6732, 0, 0, /* 0x90 */
+ 0, 0, 0x4966, 0, 0x4B6C, 0x4928, 0, 0, /* 0x90 */
+ 0x6731, 0, 0, 0x6734, 0x6733, 0, 0, 0, /* 0xA0 */
+ 0x4B44, 0x6737, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x6738, 0, 0, 0x4137, 0, 0x6739, 0, 0, /* 0xB0 */
+ 0x673B, 0, 0x673F, 0, 0, 0x673C, 0x673A, 0x473F, /* 0xB0 */
+ 0x673D, 0, 0x673E, 0, 0, 0, 0x3232, 0, /* 0xC0 */
+ 0x6745, 0x6740, 0, 0, 0, 0x6741, 0, 0, /* 0xC0 */
+ 0, 0x6742, 0, 0x4221, 0, 0, 0, 0, /* 0xD0 */
+ 0x6744, 0x6743, 0x6746, 0, 0, 0, 0, 0x6747, /* 0xD0 */
+ 0x6748, 0, 0, 0x3F43, 0, 0x3269, 0, 0x6749, /* 0xE0 */
+ 0x4E57, 0, 0x3C2B, 0, 0, 0x3D2D, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x3B6A, 0x4357, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x674A, 0x674B, 0x3131, 0, 0x674C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x674D, 0x674E, 0, 0, 0x674F, 0, 0x6750, /* 0x00 */
+ 0x363D, 0x5A2A, 0x6751, 0, 0x4065, 0x6752, 0x3C4B, 0, /* 0x00 */
+ 0x6753, 0, 0x5030, 0, 0, 0, 0x6754, 0x4A5E, /* 0x10 */
+ 0x345C, 0, 0, 0x4124, 0x3D58, 0, 0x4971, 0x3D2E, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x6755, 0x3952, 0x6756, 0x484C, 0, 0x6764, 0, /* 0x20 */
+ 0, 0, 0, 0x6758, 0, 0x4249, 0x4775, 0x383F, /* 0x30 */
+ 0x6757, 0x4125, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x6759, 0, 0, 0, 0, 0, 0, 0x447A, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x675B, 0x675A, 0x675D, 0, 0, 0x675C, 0, 0x675E, /* 0x50 */
+ 0, 0, 0x6760, 0, 0x675F, 0, 0x344F, 0, /* 0x60 */
+ 0x6761, 0, 0x6762, 0x6763, 0, 0, 0x3A31, 0x4E49, /* 0x60 */
+ 0, 0x6765, 0x3F27, 0, 0, 0, 0x3170, 0x6766, /* 0x70 */
+ 0x6767, 0, 0, 0, 0, 0, 0x6768, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x3072, 0, 0x6769, 0, 0, /* 0x80 */
+ 0, 0, 0x676A, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x4967, 0, 0, 0, 0x3C47, 0, 0x676C, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x3329, 0x3032, 0, /* 0xA0 */
+ 0, 0, 0, 0x676B, 0x676E, 0x474E, 0, 0x3F44, /* 0xA0 */
+ 0, 0x3256, 0, 0x4B27, 0, 0, 0, 0, /* 0xB0 */
+ 0x375D, 0x365C, 0, 0x676D, 0, 0x326A, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x3423, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x3171, 0x6772, 0x4E6A, 0x425D, 0, 0, 0x4944, /* 0xD0 */
+ 0, 0x677E, 0, 0x3257, 0x677C, 0, 0x677A, 0x6771, /* 0xD0 */
+ 0, 0x676F, 0, 0x6770, 0, 0x3C63, 0x366C, 0x4377, /* 0xE0 */
+ 0, 0, 0, 0x4651, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x3151, 0, 0x6774, 0x6773, 0, 0, 0, /* 0xF0 */
+ 0, 0x6779, 0x6775, 0x6778 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4C50, 0x6777, 0x3258, 0x337D, 0x677B, 0, /* 0x00 */
+ 0, 0x677D, 0, 0, 0, 0, 0x3754, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x6823, 0x682C, /* 0x10 */
+ 0x682D, 0, 0, 0, 0x302B, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x6834, 0, 0, 0, 0, /* 0x20 */
+ 0x3071, 0, 0, 0x682B, 0, 0, 0, 0x682A, /* 0x20 */
+ 0, 0x6825, 0x6824, 0, 0x6822, 0x6821, 0x4363, 0, /* 0x30 */
+ 0x427B, 0x6827, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x6826, 0, 0, 0, 0, 0x6829, 0, 0, /* 0x40 */
+ 0, 0x4170, 0x3755, 0, 0, 0, 0, 0x3141, /* 0x40 */
+ 0x6828, 0, 0x3953, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x4171, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x683A, 0, 0x683B, 0, 0x3259, /* 0x70 */
+ 0, 0, 0, 0x322E, 0x6838, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x682E, 0, 0x6836, /* 0x80 */
+ 0, 0x683D, 0x6837, 0, 0, 0, 0x6835, 0, /* 0x80 */
+ 0, 0, 0, 0x6776, 0, 0, 0x6833, 0, /* 0x90 */
+ 0, 0, 0x682F, 0, 0, 0, 0x3450, 0x6831, /* 0x90 */
+ 0x683C, 0, 0x6832, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x683E, 0, 0x6830, 0x477C, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x4D69, 0, 0, 0, 0x6839, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x684F, 0, 0, /* 0xB0 */
+ 0, 0x6847, 0, 0, 0, 0x3F7B, 0, 0, /* 0xC0 */
+ 0, 0, 0x3546, 0, 0x365D, 0, 0x6842, 0, /* 0xC0 */
+ 0, 0, 0, 0x325B, 0, 0, 0x3E54, 0, /* 0xD0 */
+ 0x6845, 0, 0, 0, 0x3A5A, 0, 0, 0x4551, /* 0xD0 */
+ 0x684A, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x4A6E, 0, 0x6841, 0, 0, 0, 0x325A, /* 0xE0 */
+ 0x3856, 0x4929, 0x684B, 0, 0x683F, 0, 0, 0x6848, /* 0xF0 */
+ 0, 0, 0, 0x6852, 0, 0x6843 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6844, 0x463A, 0, 0, 0x6849, /* 0x00 */
+ 0, 0, 0, 0x6846, 0x4B28, 0x684C, 0x3060, 0, /* 0x00 */
+ 0, 0, 0, 0x6840, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x684E, 0, 0x684D, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x476B, 0x6854, 0, 0x685F, 0, 0, 0, /* 0x20 */
+ 0, 0x337E, 0, 0, 0, 0x6862, 0, 0, /* 0x30 */
+ 0x6850, 0, 0, 0, 0x6855, 0x4D6E, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x685E, 0, /* 0x40 */
+ 0, 0x4D55, 0, 0, 0, 0, 0x4E2A, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4378, /* 0x50 */
+ 0, 0, 0, 0x336B, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x4972, 0x6864, 0x4621, 0, 0, 0x3031, 0, /* 0x60 */
+ 0, 0x685D, 0, 0x6859, 0x4172, 0x6853, 0x685B, 0x6860, /* 0x60 */
+ 0, 0x472C, 0, 0, 0, 0x302A, 0, 0x6858, /* 0x70 */
+ 0, 0x6861, 0x4978, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x685C, 0, 0x6857, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x3E55, 0, 0, 0, 0, /* 0x80 */
+ 0x3D2F, 0, 0, 0, 0x3C2C, 0, 0, 0, /* 0x90 */
+ 0, 0x4C58, 0, 0, 0x4947, 0, 0, 0x6867, /* 0x90 */
+ 0, 0x6870, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x685A, 0, 0, /* 0xA0 */
+ 0, 0, 0x3377, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x3E78, 0x6865, 0, 0x686A, 0x4173, 0, 0, 0x6866, /* 0xB0 */
+ 0, 0x686D, 0, 0, 0x435F, 0, 0x686E, 0, /* 0xC0 */
+ 0, 0x4D56, 0x6863, 0x3338, 0, 0x6869, 0, 0, /* 0xC0 */
+ 0x686C, 0x4C2C, 0, 0, 0, 0, 0x686F, 0, /* 0xD0 */
+ 0, 0x6868, 0x686B, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x4B29, 0, 0x4F21, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x6873, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x687A, 0, 0, 0x6872 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3C43, 0, 0, 0, 0, 0, 0x6851, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x4A4E, 0, 0x4C22, 0x6879, 0x6878, 0, 0x6874, /* 0x10 */
+ 0x6875, 0, 0x3136, 0, 0, 0, 0, 0x6877, /* 0x10 */
+ 0, 0x6871, 0, 0, 0, 0, 0x4455, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x6876, 0x307E, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x4222, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x4A43, 0, 0, /* 0x30 */
+ 0x687B, 0x6921, 0, 0x4859, 0, 0, 0, 0, /* 0x40 */
+ 0x687E, 0x3E56, 0x3C49, 0x6923, 0, 0, 0x363E, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x6924, 0, 0x4979, /* 0x50 */
+ 0x687D, 0, 0x6856, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x687C, 0, 0, 0, 0, /* 0x60 */
+ 0x4F4F, 0x4622, 0x4973, 0, 0, 0x692B, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6931, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x6932, 0, /* 0x70 */
+ 0x6925, 0, 0, 0, 0x4776, 0, 0, 0x692F, /* 0x80 */
+ 0x6927, 0, 0x6929, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x6933, 0x6928, 0, 0, 0x692C, 0, 0, 0x3172, /* 0x90 */
+ 0, 0x4665, 0, 0x692D, 0x6930, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x6926, 0, 0x4126, 0, /* 0xA0 */
+ 0x692A, 0x3B27, 0x3F45, 0x3730, 0x4C74, 0, 0x4C79, 0x3D72, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x6937, 0x6935, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x4F4E, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x6934, 0, 0, 0, 0x4D75, 0, 0x6936, /* 0xC0 */
+ 0x6938, 0, 0, 0, 0, 0x6939, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x693C, 0x693A, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x4623, 0x693B, 0, 0, /* 0xE0 */
+ 0, 0x484D, 0x692E, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3D73, /* 0xF0 */
+ 0, 0x693D, 0x6942, 0x4174, 0, 0, 0x6941 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6922, 0, 0, 0, 0x6943, 0x4149, /* 0x00 */
+ 0, 0, 0x693E, 0x6940, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x693F, 0, 0, 0x5D31, 0x5D22, /* 0x10 */
+ 0, 0, 0x6945, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x6944, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x4D76, 0, 0x623C, /* 0x20 */
+ 0x6946, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6947, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x6948, 0x3857, 0, /* 0x40 */
+ 0x3554, 0, 0, 0, 0x694A, 0x515D, 0, 0, /* 0x50 */
+ 0, 0, 0x3575, 0, 0x4E3A, 0, 0x3673, 0x694B, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x694C, /* 0x60 */
+ 0, 0, 0, 0x436E, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x694D, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x467A, 0, 0x303A, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x3263, 0x6952, 0x6953, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x694E, 0, 0x3B3D, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x694F, 0x4742, 0, 0, 0, /* 0xA0 */
+ 0, 0x6950, 0x6951, 0x695B, 0, 0, 0, 0x6955, /* 0xA0 */
+ 0x6958, 0, 0, 0, 0, 0, 0x6954, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x6956, 0, 0x6957, 0x3C58, /* 0xC0 */
+ 0, 0x6959, 0, 0x4341, 0, 0x3756, 0x3342, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x695C, 0, 0, 0, /* 0xD0 */
+ 0, 0x333F, 0, 0x6961, 0, 0, 0x695D, 0x6960, /* 0xD0 */
+ 0, 0, 0, 0, 0x483A, 0, 0, 0, /* 0xE0 */
+ 0, 0x695E, 0, 0, 0x695F, 0x4948, 0x485A, 0x6962, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x427D, 0x696C, 0, 0x6968, 0, 0, 0x326B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6966, 0, 0x4B2A, 0x6967, 0, 0, 0x6964, 0, /* 0x00 */
+ 0x6965, 0x696A, 0x696D, 0, 0, 0x696B, 0, 0, /* 0x00 */
+ 0, 0x6969, 0x6963, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x4358, 0, 0x6974, 0, 0x4C2A, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x6972, 0, 0, /* 0x20 */
+ 0, 0x6973, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x696E, 0, 0, 0x6970, /* 0x30 */
+ 0, 0, 0, 0x6971, 0, 0, 0, 0x696F, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x4066, 0, 0x4F39, 0x6978, 0, 0x6979, 0, /* 0x40 */
+ 0, 0, 0, 0x6A21, 0, 0x3F2A, 0, 0x697B, /* 0x50 */
+ 0, 0x697E, 0, 0, 0, 0, 0, 0x6976, /* 0x50 */
+ 0x6975, 0, 0, 0x6A22, 0, 0, 0x325C, 0, /* 0x60 */
+ 0x697C, 0, 0x6A23, 0, 0, 0, 0x697D, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x697A, 0, 0x4433, 0, /* 0x70 */
+ 0x6977, 0, 0, 0, 0, 0, 0, 0x4768, /* 0x70 */
+ 0, 0, 0x6A27, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x4D3B, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6A26, /* 0x90 */
+ 0, 0, 0x6A25, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x6A2E, 0, 0, 0, 0x6A28, /* 0xA0 */
+ 0, 0, 0, 0x6A30, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x4D66, 0x6A33, 0, 0x6A2A, 0, 0, /* 0xB0 */
+ 0x6A2B, 0, 0, 0, 0x6A2F, 0, 0x6A32, 0x6A31, /* 0xC0 */
+ 0, 0, 0, 0x6A29, 0, 0, 0, 0, /* 0xC0 */
+ 0x6A2C, 0, 0x6A3D, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x6A36, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6A34, /* 0xE0 */
+ 0, 0, 0x6A35, 0, 0, 0, 0x6A3A, 0x6A3B, /* 0xF0 */
+ 0, 0x332A, 0, 0x3542, 0, 0, 0x6A39 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A24, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x6A38, 0x6A3C, 0x6A37, /* 0x00 */
+ 0, 0x6A3E, 0, 0, 0, 0x6A40, 0x6A3F, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x6A42, 0x6A41, 0x695A, 0, 0, 0, 0x6A46, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x6A43, 0, 0, 0, 0, 0x6A44, 0, /* 0x30 */
+ 0, 0x6A45, 0, 0x6A47, 0, 0, 0, 0, /* 0x30 */
+ 0x376C, 0, 0x6A49, 0, 0x6A48, 0, 0x3D30, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x3954, 0x5E27, 0, 0, /* 0x40 */
+ 0, 0, 0x6A4A, 0x3D51, 0, 0, 0, 0x3339, /* 0x50 */
+ 0, 0x6A4B, 0, 0x3152, 0, 0x3E57, 0x6A4C, 0, /* 0x50 */
+ 0, 0x3955, 0x6A4D, 0x3061, 0, 0, 0, 0, /* 0x60 */
+ 0x493D, 0, 0, 0x6A4E, 0, 0, 0, 0, /* 0x60 */
+ 0x3F6A, 0, 0x6A55, 0, 0, 0x6A52, 0, 0x436F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x6A53, 0x6A50, 0x365E, /* 0x70 */
+ 0, 0x6A4F, 0x6A56, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x3736, 0, 0, 0x425E, 0, 0x6A5C, 0, 0, /* 0x80 */
+ 0, 0, 0x6A58, 0, 0, 0, 0x4235, 0x6A57, /* 0x90 */
+ 0, 0x6A5A, 0, 0, 0, 0, 0x6A51, 0, /* 0x90 */
+ 0, 0, 0x6A5B, 0, 0x6A5D, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x486F, 0, 0, 0x6A59, 0, /* 0xA0 */
+ 0x6A5E, 0x6A60, 0, 0, 0x3853, 0x6A54, 0, 0x3041, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6A5F, /* 0xB0 */
+ 0, 0x3A5B, 0x4E76, 0x6A61, 0x6A62, 0x4175, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4E22, /* 0xC0 */
+ 0, 0, 0, 0, 0x6A63, 0x4D35, 0, 0, /* 0xD0 */
+ 0x6A64, 0x6A65, 0, 0, 0x4A64, 0x6A66, 0, 0x3A40, /* 0xD0 */
+ 0, 0x4E23, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x6A6B, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x6A6C, 0x3E58, 0x6A6A, 0, 0, 0, /* 0xF0 */
+ 0x4D67, 0x6A67, 0, 0, 0x6A69, 0x403D, 0x3F7E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A68, 0, 0x6A6D, 0, 0, 0x4A23, /* 0x00 */
+ 0, 0, 0x6A6F, 0, 0x6A6E, 0, 0, 0, /* 0x00 */
+ 0x336C, 0, 0x4B2B, 0x6A70, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x6A7C, 0x6A72, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x6A73, 0, 0, /* 0x20 */
+ 0, 0, 0x6A74, 0x6A75, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x6A79, 0, /* 0x30 */
+ 0x6A7A, 0, 0, 0x6A78, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x6A76, 0, 0x6A71, 0x6A77, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x6A7B, 0x7037, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x3228, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x6A7E, 0x365F, /* 0x50 */
+ 0x6A7D, 0, 0, 0, 0x6B22, 0, 0x6B21, 0, /* 0x60 */
+ 0, 0, 0x6B24, 0, 0, 0x6B23, 0, 0x6B25, /* 0x60 */
+ 0, 0, 0x3D31, 0, 0x6B26, 0, 0, 0x6B27, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x6B28, 0x403E, /* 0x70 */
+ 0, 0x4D57, 0, 0x6B29, 0, 0, 0x4A24, 0x4746, /* 0x80 */
+ 0x6B2A, 0, 0x6B2B, 0x382B, 0, 0, 0, 0x352C, /* 0x80 */
+ 0, 0, 0, 0x6B2C, 0, 0, 0x3B6B, 0x4741, /* 0x90 */
+ 0x6B2D, 0, 0x3350, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6B2E, 0, 0, 0, 0, 0x6B30, 0x4D77, /* 0xA0 */
+ 0, 0x6B2F, 0x3F46, 0, 0x6B31, 0, 0, 0x6B32, /* 0xA0 */
+ 0, 0, 0x6B33, 0x3451, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x6B34, 0, 0, 0x6B35, 0, 0x6B36, /* 0xB0 */
+ 0x6B37, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x3351, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x6B38, 0, 0x6B39, 0x6B3A, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x3272, 0, 0, 0x3F28, 0x6B3B, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x6B3C, 0, 0, 0, /* 0xF0 */
+ 0x6B3D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3840, 0, 0x447B, 0x6B3E, 0, 0, 0, 0, /* 0x00 */
+ 0x3757, 0, 0x3F56, 0, 0x6B41, 0, 0x4624, 0, /* 0x00 */
+ 0x6B40, 0, 0, 0x3731, 0, 0, 0x6B3F, 0x4277, /* 0x10 */
+ 0x352D, 0, 0, 0x6B42, 0, 0x6B43, 0, 0x3E59, /* 0x10 */
+ 0, 0, 0, 0x376D, 0, 0x6B44, 0, 0, /* 0x20 */
+ 0, 0, 0x4B2C, 0, 0, 0x405F, 0, 0, /* 0x20 */
+ 0, 0x3576, 0, 0x4C75, 0x414A, 0, 0x6B45, 0, /* 0x30 */
+ 0, 0, 0x3F47, 0x4370, 0x3E5A, 0, 0, 0, /* 0x30 */
+ 0, 0x6B46, 0, 0, 0, 0, 0x6B49, 0, /* 0x40 */
+ 0x6B4A, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x3A3E, 0x4242, 0x6B48, 0, 0x3E5B, 0x493E, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x6B47, 0, 0, 0x3B6C, 0, /* 0x50 */
+ 0x3153, 0, 0x6B4E, 0x3758, 0, 0, 0x3B6E, 0, /* 0x60 */
+ 0, 0x3B6D, 0, 0x4F4D, 0x6B4D, 0x6B4C, 0x4127, 0, /* 0x60 */
+ 0x354D, 0x4F43, 0x333A, 0x3E5C, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x6B4B, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x6B50, 0, 0x6B51, 0x6B4F, 0, 0x3858, /* 0x80 */
+ 0, 0x4D40, 0, 0, 0x3B6F, 0x4727, 0, 0, /* 0x80 */
+ 0, 0x6B54, 0, 0x4040, 0, 0x4342, 0, 0, /* 0x90 */
+ 0x4D36, 0, 0x6B57, 0, 0, 0, 0x386C, 0, /* 0x90 */
+ 0x403F, 0x6B53, 0, 0x6B58, 0x386D, 0x6B55, 0x6B56, 0, /* 0xA0 */
+ 0x6B52, 0, 0, 0, 0x4062, 0x4649, 0, 0, /* 0xA0 */
+ 0x432F, 0, 0x325D, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x4870, 0, 0, 0x3543, 0, 0, 0x4434, /* 0xB0 */
+ 0, 0, 0x6B5B, 0, 0x6B59, 0, 0, 0x434C, /* 0xC0 */
+ 0, 0, 0, 0x4041, 0x3452, 0x6B5A, 0, 0x3F5B, /* 0xC0 */
+ 0, 0, 0x4E4A, 0, 0, 0, 0x4F40, 0, /* 0xD0 */
+ 0, 0, 0x6B5C, 0x6B67, 0x4435, 0, 0x6B66, 0, /* 0xD0 */
+ 0x6B63, 0x6B6B, 0x6B64, 0, 0x6B60, 0, 0x447C, 0x6B5F, /* 0xE0 */
+ 0, 0, 0, 0x6B5D, 0, 0x4D21, 0x3B70, 0, /* 0xE0 */
+ 0, 0x6B61, 0, 0x6B5E, 0, 0, 0, 0x6B65, /* 0xF0 */
+ 0x3D74, 0, 0x3841, 0, 0, 0, 0x427A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4B45, 0x315A, 0x3062, 0, 0x4625, 0, 0, 0x6B69, /* 0x00 */
+ 0, 0, 0, 0, 0x6B68, 0, 0x4666, 0, /* 0x00 */
+ 0x6B6D, 0, 0, 0, 0x6B62, 0, 0x6B6C, 0x6B6E, /* 0x10 */
+ 0, 0x382C, 0x6B6A, 0x3956, 0, 0x3C55, 0, 0, /* 0x10 */
+ 0x6B6F, 0x4D58, 0, 0, 0, 0, 0x6B72, 0, /* 0x20 */
+ 0x6B75, 0, 0, 0x6B73, 0x4935, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x6B70, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x3660, 0, 0, 0, 0, 0x6B74, 0, /* 0x30 */
+ 0, 0x6B76, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x6B7A, 0, 0, 0x6B77, 0, 0x6B79, 0x6B78, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x6B7B, 0, /* 0x50 */
+ 0x3C31, 0, 0x6B7D, 0x6B7C, 0x4968, 0, 0, 0x6C21, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x3759, 0, /* 0x60 */
+ 0, 0, 0, 0x6B7E, 0x6C22, 0, 0, 0x6C23, /* 0x60 */
+ 0x3544, 0x6641, 0x3E79, 0, 0x6C24, 0, 0, 0x386E, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x6C25, 0, 0, /* 0x70 */
+ 0x6C26, 0, 0, 0x3B3E, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x5A4E, 0, 0x6C27, 0, 0x6C28, 0, /* 0x80 */
+ 0x3D32, 0, 0x6C29, 0x6C2A, 0, 0, 0x6C2B, 0, /* 0x90 */
+ 0, 0x6C2C, 0x6C2D /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x432B, /* 0x30 */
+ 0, 0, 0x6C2E, 0, 0, 0, 0, 0x6C30, /* 0x30 */
+ 0, 0x6C2F, 0, 0, 0, 0, 0x4626, 0, /* 0x40 */
+ 0x6C31, 0, 0x4B2D, 0, 0x6C32, 0, 0x6C33, 0, /* 0x40 */
+ 0x6C34, 0, 0, 0, 0, 0x6C35, 0, 0, /* 0x50 */
+ 0, 0, 0x465A, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x3E5D, 0x6C36, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x396B, 0x502E, 0x6C37, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x6C38, 0x493F, 0x6C39, 0, 0x6C41, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x6C3A, 0, 0, 0x6C3C, 0, 0, /* 0x80 */
+ 0, 0x6C3B, 0x6C3D, 0, 0x4B46, 0x6C3E, 0x6C3F, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x6C40, 0, 0, 0, /* 0x90 */
+ 0x6C42, 0, 0, 0, 0, 0x332D, 0x4467, 0, /* 0x90 */
+ 0x4969, 0x3A62, 0x3957, 0, 0, 0, 0, 0x494F, /* 0xA0 */
+ 0x325F, 0x484E, 0x6C45, 0x3453, 0x4055, 0x6C44, 0x6C49, 0x4379, /* 0xA0 */
+ 0x4C63, 0, 0x6C47, 0x6C48, 0x352E, 0, 0x6C4A, 0x4763, /* 0xB0 */
+ 0x425F, 0, 0, 0x4871, 0x453D, 0x6C46, 0, 0x4B47, /* 0xB0 */
+ 0x326C, 0x6C4C, 0x4F28, 0x4442, 0x4F45, 0, 0, 0x3B71, /* 0xC0 */
+ 0x6C4B, 0, 0x4231, 0, 0, 0x6C5C, 0x4128, 0, /* 0xC0 */
+ 0, 0x4678, 0, 0x4950, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x6C4F, 0x3B3F, 0x3B72, 0, 0x3E5E, 0, /* 0xD0 */
+ 0x4765, 0, 0x382D, 0x6C4E, 0x6C4D, 0, 0x496A, 0, /* 0xE0 */
+ 0, 0, 0x3C41, 0, 0, 0x4552, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x6C51, 0x6C52, 0x3958, 0x6C50 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6C53, 0x6C54, 0, 0x6C56, /* 0x00 */
+ 0x4223, 0, 0x6C55, 0x3466, 0, 0x6C58, 0, 0x6C57, /* 0x00 */
+ 0x6C59, 0, 0, 0x6C5B, 0x6C5D, 0, 0x6C5E, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x4056, 0, 0x3C4F, 0x6C5F, /* 0x60 */
+ 0, 0, 0, 0x3352, 0, 0x6C60, 0, 0, /* 0x60 */
+ 0x4176, 0x6C61, 0, 0x6C62, 0x496B, 0, 0, 0x352F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x6C63, 0, 0, 0, 0x4436, 0, 0, /* 0x80 */
+ 0, 0, 0x315B, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6C64, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x3C71, 0, 0, 0, 0, /* 0xA0 */
+ 0x3F76, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x422D, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x6C67, 0, 0, 0, 0x6C66, 0, /* 0xB0 */
+ 0, 0, 0x6C65, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x6C6D, 0x6C6B, 0, 0, 0x6C68, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x6C6A, 0, /* 0xD0 */
+ 0, 0, 0x6C69, 0x6C6C, 0, 0x3577, 0, 0x6C70, /* 0xD0 */
+ 0, 0x4057, 0, 0x6C71, 0, 0, 0, 0, /* 0xE0 */
+ 0x3859, 0, 0x6C6E, 0x6C6F, 0, 0, 0, 0x4F29, /* 0xE0 */
+ 0, 0, 0, 0x4437, 0, 0x4129, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x6C72, 0, 0, 0x6C75 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x6C73, 0x6C74, 0x4D59, 0, 0, 0, 0, 0x4627, /* 0x00 */
+ 0x6C78, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x6C76, 0x6C77, 0x6C79, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x6D29, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x6C7C, 0, 0, 0, 0x6C7D, 0x6C7B, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x6C7A, 0, 0x447D, 0, 0, 0x6D21, /* 0x40 */
+ 0x6D25, 0x6D22, 0x6C7E, 0, 0x6D23, 0, 0, 0, /* 0x40 */
+ 0x6D24, 0, 0, 0, 0, 0x6D2B, 0, 0, /* 0x50 */
+ 0, 0x6D26, 0, 0, 0, 0, 0, 0x4058, /* 0x50 */
+ 0x6D28, 0, 0, 0x6D2A, 0x6D27, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x6D2D, 0, 0x3D33, 0, 0x6D2C, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x6D2E, 0, 0, 0, /* 0x70 */
+ 0, 0x6D2F, 0, 0, 0x6D32, 0x6D31, 0, 0x6D30, /* 0x80 */
+ 0, 0, 0x6D34, 0x6D33, 0, 0x4C76, 0, 0, /* 0x80 */
+ 0, 0x6D36, 0, 0x6D35, 0x6D37, 0, 0, 0, /* 0x90 */
+ 0, 0x6D38, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6D3A, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x6D39, 0x3F48, 0x6D3B, 0, 0, 0x366D, /* 0xA0 */
+ 0x6D3C, 0x6D3E, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x6D3F, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x6D40, 0x6D3D, 0, /* 0xC0 */
+ 0x6D41, 0, 0x3C56, 0x6D42, 0x3530, 0x3733, 0, 0, /* 0xC0 */
+ 0, 0, 0x382E, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x6D43, 0, 0, 0, 0x4670, /* 0xD0 */
+ 0, 0, 0x453E, 0x6D44, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x6D47, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x3C34, 0, 0, 0x6D46, 0x6D45, 0x375A, 0x6D48 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3353, 0, 0x6D4A, 0, 0, /* 0x00 */
+ 0, 0x3A5C, 0x6D49, 0, 0x6D52, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x6D4C, 0x6D4E, 0x4A65, 0x6D4B, 0, 0, /* 0x10 */
+ 0, 0x6D4D, 0, 0x6D51, 0x6D4F, 0x3531, 0, 0x6D50, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x6D53, 0, /* 0x20 */
+ 0, 0x475A, 0x4E58, 0, 0, 0, 0, 0x3D34, /* 0x20 */
+ 0, 0, 0, 0x6D54, 0, 0, 0, 0, /* 0x30 */
+ 0x4D22, 0x6D56, 0, 0x6D55, 0, 0, 0x6D59, 0x4D41, /* 0x30 */
+ 0, 0, 0x6D58, 0, 0x336D, 0x6D57, 0x6D5C, 0, /* 0x40 */
+ 0, 0x6D5B, 0, 0, 0x6D5A, 0x4532, 0x6D5D, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6D5E, /* 0x50 */
+ 0, 0, 0, 0, 0x6D5F, 0, 0, 0x396C, /* 0x50 */
+ 0, 0x3725, 0x6D60, 0x6D61, 0x6D62, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x3F49, 0x6D63, 0, 0x3C2D, 0x6D64, /* 0x90 */
+ 0, 0, 0, 0x6D65, 0, 0, 0, 0x5221, /* 0xA0 */
+ 0x517E, 0, 0, 0, 0, 0x6D66, 0x6570, 0x6D67, /* 0xA0 */
+ 0x4324, 0x3F2B, 0x4740, 0, 0, 0, 0, 0x6D68, /* 0xB0 */
+ 0, 0, 0x4A55, 0x4454, 0x397E, 0, 0, 0x4329, /* 0xB0 */
+ 0, 0, 0x312A, 0, 0x4B78, 0x3F57, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x375E, 0, /* 0xC0 */
+ 0, 0x3661, 0, 0, 0x4A56, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x6D69, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x6D6B, 0, 0, 0x6D6A, 0x3260, 0, /* 0xE0 */
+ 0, 0x4676, 0x6D6C, 0x4777, 0, 0x4533, 0, 0x6D6D, /* 0xE0 */
+ 0x3D52, 0, 0, 0, 0x6D6F, 0, 0, 0x4C42, /* 0xF0 */
+ 0x6D7E, 0x6D71, 0x6D72, 0, 0, 0x4449 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4260, 0x4177, 0, 0x4628, 0, 0x6D70, 0x3555, 0, /* 0x00 */
+ 0, 0, 0, 0x6D79, 0, 0x6D76, 0x6E25, 0x4629, /* 0x00 */
+ 0x4360, 0x6D73, 0, 0x447E, 0x4553, 0x6D74, 0x6D78, 0x3F60, /* 0x10 */
+ 0, 0x4767, 0x444C, 0, 0, 0x4042, 0x6D77, 0x422E, /* 0x10 */
+ 0x4224, 0x6D75, 0x3029, 0x4F22, 0, 0, 0, 0x6D7A, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x4261, 0, /* 0x20 */
+ 0, 0x3D35, 0x3F4A, 0, 0, 0x6D7C, 0x6D7B, 0, /* 0x30 */
+ 0x306F, 0x6D7D, 0, 0, 0x492F, 0, 0x6E27, 0, /* 0x30 */
+ 0, 0x465B, 0x3F6B, 0, 0, 0x4359, 0, 0x3678, /* 0x40 */
+ 0, 0x6E26, 0x4D37, 0x313F, 0, 0x4A57, 0x3261, 0x6E21, /* 0x40 */
+ 0x6E22, 0x6E23, 0x6E24, 0x463B, 0x4323, 0x3063, 0x6E28, 0, /* 0x50 */
+ 0x6E29, 0x7423, 0, 0, 0x423D, 0, 0x6E2A, 0, /* 0x50 */
+ 0x3173, 0x414C, 0, 0x382F, 0, 0x4D5A, 0, 0, /* 0x60 */
+ 0x6E2B, 0x452C, 0, 0, 0, 0x4178, 0x3C57, 0x6E2C, /* 0x60 */
+ 0, 0, 0x6E2F, 0, 0, 0x3D65, 0x6E2D, 0x412B, /* 0x70 */
+ 0x412A, 0, 0x3064, 0, 0x4E4B, 0x6E31, 0, 0x4872, /* 0x70 */
+ 0x6E33, 0x6E32, 0x6E30, 0x6364, 0x3454, 0, 0, 0x6D6E, /* 0x80 */
+ 0, 0x6E35, 0x6E34, 0, 0, 0, 0, 0x6E36, /* 0x80 */
+ 0, 0x4D38, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x4661, 0, 0, 0x4B2E, 0, /* 0xA0 */
+ 0x6E37, 0, 0x3C59, 0, 0, 0, 0, 0x6E38, /* 0xA0 */
+ 0, 0x6E39, 0, 0, 0, 0x6E3A, 0, 0, /* 0xB0 */
+ 0x4521, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x306A, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x3959, 0, 0, 0, 0x4F3A, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x6E3E, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x3734, 0x6E3B, 0, 0x6E3C, 0, 0, 0, /* 0xE0 */
+ 0x4974, 0, 0, 0, 0, 0x3354, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x4D39, 0, 0x363F, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0x4554 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6E3F, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x6E40, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x6E41, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x4522, 0, 0, /* 0x20 */
+ 0x6E43, 0, 0x6E42, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x4653, 0x6E44, 0x3D36, 0x3C60, 0x475B, 0x4371, 0, /* 0x40 */
+ 0, 0, 0x3C72, 0, 0x3F6C, 0, 0x6E45, 0, /* 0x50 */
+ 0x6E46, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x3F5D, 0x6E47, 0, 0x6E48, 0, 0, /* 0x60 */
+ 0, 0x6E49, 0x4D6F, 0, 0x3D37, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x6E4B, 0x6E4A, 0, 0x395A, 0, 0x3973, /* 0x70 */
+ 0x3B40, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x6E4E, 0, 0, 0, 0, 0x3D66, /* 0x80 */
+ 0, 0x6E4D, 0, 0x6E4C, 0, 0x4269, 0, 0, /* 0x80 */
+ 0x386F, 0, 0x4043, 0, 0, 0, 0, 0x4830, /* 0x90 */
+ 0, 0, 0, 0, 0x3D39, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x6E4F, 0, 0x3E5F, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x6E52, 0x6E50, 0, 0, 0, 0x6E51, /* 0xA0 */
+ 0, 0, 0, 0, 0x6E54, 0x6E53, 0, 0, /* 0xB0 */
+ 0x3E7A, 0, 0x6E55, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x6E56, 0x6E57, 0, 0, 0, 0, 0x4850, 0x3A53, /* 0xC0 */
+ 0x3C61, 0x6E58, 0, 0x6E59, 0x4E24, 0x3D45, 0x4C6E, 0x4E4C, /* 0xC0 */
+ 0x6E5A, 0x3662, 0, 0, 0, 0, 0x6E5B, 0, /* 0xD0 */
+ 0x4523, 0, 0, 0x6E5E, 0x3378, 0x3F4B, 0, 0x6E5C, /* 0xD0 */
+ 0, 0x6E5D, 0, 0x4460, 0, 0, 0x4B55, 0x367C, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x6E60, 0x6E61, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x6E5F, 0, 0, 0x6E63 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x465F, 0x3343, 0, /* 0x00 */
+ 0, 0x6E67, 0, 0, 0x6E64, 0x6E66, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x6E62, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x6F4F, 0, 0, 0x6E65, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x4E6B, 0, 0, 0x385A, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6E6F, /* 0x30 */
+ 0, 0, 0, 0, 0x4534, 0x6E6A, 0, 0, /* 0x40 */
+ 0x6E6D, 0x6E6B, 0, 0x6E70, 0, 0, 0, 0, /* 0x40 */
+ 0x6E71, 0, 0, 0, 0, 0, 0, 0x6E69, /* 0x50 */
+ 0, 0, 0x6E76, 0x3174, 0, 0, 0x6E68, 0, /* 0x50 */
+ 0, 0, 0x482D, 0, 0x6E6C, 0, 0x3E60, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x395B, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x4B48, 0, /* 0x70 */
+ 0x3664, 0, 0, 0x3D46, 0, 0x463C, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x412D, 0, 0x6E74, 0, 0x6E6E, 0x6E73, 0, /* 0x90 */
+ 0x4C43, 0, 0x4438, 0x6E75, 0x6E72, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x412C, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6E79, /* 0xB0 */
+ 0, 0x6E78, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6E77, /* 0xC0 */
+ 0, 0, 0x4B2F, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x3D7B, 0, 0, 0, /* 0xE0 */
+ 0, 0x6E7A, 0x4A5F, 0, 0, 0x3154, 0, 0, /* 0xE0 */
+ 0, 0, 0x4946, 0x4372, 0, 0, 0, 0, /* 0xF0 */
+ 0x3578, 0, 0x6E7C, 0, 0x395D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3B2C, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6E7B, /* 0x00 */
+ 0x3F6D, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x3F6E, 0x6F21, 0x6F23, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x3E7B, 0, 0x6F22, 0x6F24, 0, 0, 0x3653, 0, /* 0x20 */
+ 0x4945, 0, 0, 0x3C62, 0x4F23, 0, 0x6E7E, 0x3A78, /* 0x20 */
+ 0, 0, 0x4F3F, 0, 0, 0x6F26, 0, 0, /* 0x30 */
+ 0, 0, 0x6F25, 0x6F27, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x6E7D, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x4669, 0, 0x4555, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x4457, 0, 0x6F2C, 0, /* 0x50 */
+ 0, 0, 0, 0x4343, 0x6F28, 0, 0, 0, /* 0x50 */
+ 0x6F29, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x372D, 0, 0x6F2B, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x3830, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x6F2A, 0, 0x3E61, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x3379, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x6F30, 0, 0x3A3F, 0x4179, /* 0x90 */
+ 0, 0, 0x444A, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x333B, /* 0xA0 */
+ 0, 0, 0, 0, 0x6F2E, 0x6F2F, 0x4443, 0, /* 0xA0 */
+ 0x6F2D, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x6F31, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x6F37, 0, 0, 0, 0, /* 0xC0 */
+ 0x6F3A, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x6F39, 0x452D, 0, 0, 0, 0, 0x6F32, 0x6F33, /* 0xD0 */
+ 0x6F36, 0, 0, 0, 0, 0x6F38, 0, 0, /* 0xD0 */
+ 0, 0x3640, 0, 0, 0x6F3B, 0x6F35, 0, 0, /* 0xE0 */
+ 0x6F34 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6F3F, 0, 0, 0, 0x6F40, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x6F41, 0, 0, 0x6F3E, 0x6F3D, 0, 0, 0, /* 0x10 */
+ 0x3E62, 0x462A, 0x6F3C, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x6F45, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x6F43, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x6F44, 0x6F42, 0, /* 0x30 */
+ 0x4278, 0, 0x6F46, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x6F47, 0, 0, 0x6F49, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x3455, 0x6F48, 0x4C7A, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x6F54, 0x6F4A, 0, 0, 0x6F4D, 0, /* 0x50 */
+ 0x6F4B, 0, 0x6F4C, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x6F4E, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x6F50, 0, 0, 0, 0, 0x6F51, 0, 0x6F52, /* 0x70 */
+ 0, 0, 0, 0, 0x6F55, 0x6F53, 0x6F56, 0x6F58, /* 0x70 */
+ 0, 0x6F57 /* 0x80 */
+ /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4439, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x4C67, 0, 0x6F59, 0x412E, 0, 0, 0, 0x6F5A, /* 0x80 */
+ 0, 0x4A44, 0x6F5B, 0x332B, 0, 0, 0, 0x313C, /* 0x80 */
+ 0, 0x3457, 0, 0x3456, 0x6F5C, 0, 0x6F5D, 0, /* 0x90 */
+ 0x6F5E, 0x6F5F, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x6F60, 0, 0x3458, 0x3355, 0x395E, 0x4836, 0, 0x6F62, /* 0xA0 */
+ 0x6F61, 0, 0, 0, 0, 0x6F63, 0, 0, /* 0xA0 */
+ 0, 0, 0x315C, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x6F66, 0, 0x6F65, 0x6F64, 0, 0x6F67, 0, /* 0xB0 */
+ 0, 0, 0, 0x6F6A, 0, 0, 0, 0x3047, /* 0xC0 */
+ 0, 0, 0x6F68, 0, 0x6F6C, 0x6F6B, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x6F6E, 0x6F6D, 0x6F6F, 0, /* 0xD0 */
+ 0x462E, 0, 0, 0, 0x6F70, 0, 0, 0, /* 0xD0 */
+ 0, 0x6F71, 0x6F73, 0, 0, 0x6F72 /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0x496C, 0, 0, 0, /* 0x10 */
+ 0, 0x6F74, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x6F75, 0, 0x3A65, 0, 0, 0, 0x6F76, 0x6F77, /* 0x20 */
+ 0, 0, 0x4B49, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x414B, 0, 0, 0, 0x3024, /* 0x30 */
+ 0x424B, 0, 0x6F78, 0, 0x496D, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x6F7B, 0x6F79, 0x395F, 0, 0x6F7A, /* 0x40 */
+ 0x3842, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x4A45, 0x6F7D, 0x7021, 0x6F7E, 0x7022, /* 0x50 */
+ 0, 0, 0x3121, 0x3F58, 0x3D7C, 0x3459, 0x7023, 0, /* 0x60 */
+ 0, 0, 0x4766, 0, 0x7025, 0, 0, 0, /* 0x60 */
+ 0x3122, 0, 0x7024, 0x4444, 0, 0x4E4D, 0x462B, 0x6F7C, /* 0x70 */
+ 0x4E26, 0, 0x3831, 0, 0, 0x4D5B, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x3679, 0x4E34, 0, /* 0x80 */
+ 0x3728, 0, 0x4262, 0x6721, 0, 0x7026, 0x332C, 0x3F6F, /* 0x80 */
+ 0, 0, 0, 0, 0x3356, 0x7028, 0, 0x7029, /* 0x90 */
+ 0x7027, 0x3764, 0, 0x3A5D, 0x3E63, 0, 0, 0, /* 0x90 */
+ 0x3123, 0, 0, 0x4E59, 0, 0, 0, 0x702B, /* 0xA0 */
+ 0x6E2E, 0, 0x702A, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x702E, 0x702C, 0x702D, 0, 0x702F, 0, 0x7030, 0x4E6C, /* 0xB0 */
+ 0x7031, 0x7032, 0, 0x4049, 0x483B, 0, 0, 0, /* 0xB0 */
+ 0x3F7D, 0x3467, 0, 0, 0x4D3A, 0x326D, 0x3D38, 0x385B, /* 0xC0 */
+ 0, 0x7035, 0, 0x7034, 0x3B73, 0x7036, 0x7033, 0, /* 0xC0 */
+ 0, 0x3B28, 0, 0, 0, 0x703A, 0x6A2D, 0, /* 0xD0 */
+ 0, 0x5256, 0, 0x3F77, 0x7038, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x4E25, 0x4671, 0, 0, 0, 0, /* 0xE0 */
+ 0x312B, 0, 0x4063, 0x3C36, 0, 0, 0, 0, /* 0xE0 */
+ 0x4A37, 0, 0x3140, 0, 0, 0, 0x4E6D, 0x4D6B, /* 0xF0 */
+ 0, 0x703B, 0, 0x4545 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3C7B, 0, 0, 0, 0x703C, 0, 0x703D, 0x3F4C, /* 0x00 */
+ 0x703E, 0, 0x4E6E, 0, 0, 0x7039, 0x7040, 0x7042, /* 0x00 */
+ 0, 0x7041, 0, 0x703F, 0, 0, 0x7043, 0, /* 0x10 */
+ 0, 0x7044, 0, 0, 0x417A, 0, 0x3262, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x7045, 0, 0, 0x4C38, /* 0x20 */
+ 0, 0, 0x7046, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x7047, 0, 0x4F2A, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x5B31, 0x7048, 0, 0, 0, 0x7049, 0x704A, 0, /* 0x30 */
+ 0, 0, 0x704E, 0, 0x704B, 0, 0x704C, 0, /* 0x40 */
+ 0x704D, 0x704F, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x4044, 0, 0, 0, 0x4C77, 0, /* 0x50 */
+ 0, 0x4045, 0, 0, 0x7050, 0, 0x4873, 0, /* 0x50 */
+ 0x7051, 0x7353, 0x4C4C, 0, 0x7052, 0, 0x7053, 0, /* 0x60 */
+ 0x7054, 0x3357, 0, 0x7056, 0, 0x3F59, 0, 0, /* 0x60 */
+ 0, 0x7057, 0, 0, 0x3724, 0, 0, 0, /* 0x70 */
+ 0, 0x7058, 0x705C, 0, 0x705A, 0, 0, 0, /* 0x70 */
+ 0, 0x705B, 0, 0, 0x3373, 0x7059, 0x705D, 0, /* 0x80 */
+ 0, 0, 0, 0x705E, 0, 0x3048, 0, 0x705F, /* 0x80 */
+ 0x7060, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x3E64, 0, 0, 0, 0x7061, 0, 0, 0, /* 0x90 */
+ 0x3547, 0, 0, 0x7064, 0, 0, 0x7063, 0, /* 0xA0 */
+ 0x7062, 0, 0, 0x6B71, 0, 0x4A5C, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x7065, 0x7066, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x7067, 0, 0, 0x7068, 0, /* 0xC0 */
+ 0x7069, 0, 0, 0x706A, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x345A, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x706B, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x706C, 0x4723, 0, /* 0xE0 */
+ 0, 0, 0x706E, 0x323B, 0, 0x7071, 0x7070, 0, /* 0xF0 */
+ 0, 0, 0, 0x3124, 0, 0, 0, 0x3641 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4A47, 0x443A, 0x3A22, 0, 0x3960, 0x3D67, 0, /* 0x00 */
+ 0x3F5C, 0, 0, 0, 0x7073, 0, 0, 0x7072, /* 0x00 */
+ 0x4D42, 0x3468, 0x4852, 0x465C, 0, 0, 0, 0x3F7C, /* 0x10 */
+ 0x4E4E, 0, 0x375B, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x7076, 0, 0, 0x7075, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x4B4B, 0x462C, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x3150, 0, 0, 0x7077, /* 0x30 */
+ 0x7074, 0, 0, 0x4951, 0x4D6A, 0x7078, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x7079, 0, /* 0x40 */
+ 0, 0, 0, 0x707B, 0x426A, 0x335B, 0x335C, 0x707A, /* 0x40 */
+ 0, 0, 0, 0, 0x3469, 0x3832, 0, 0, /* 0x50 */
+ 0x346A, 0, 0, 0x453F, 0, 0, 0x4E60, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x385C, /* 0x60 */
+ 0, 0, 0, 0x707C, 0, 0, 0, 0x707D, /* 0x60 */
+ 0x707E, 0x7121, 0, 0x7123, 0x7122, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x4977, 0, 0x7124, 0, 0, 0, 0, 0x7125, /* 0xA0 */
+ 0, 0x7126, 0, 0, 0, 0, 0x7127, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x7129, 0x7128, 0, 0x712A, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x4874, 0x664C, 0, 0, 0x3F29, /* 0xD0 */
+ 0, 0, 0x3532, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x712B, 0, 0x712C, 0, 0x522C, 0x5D3B, 0x4853, /* 0xE0 */
+ 0, 0, 0x307B, 0, 0x303B, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x3B74, 0x4B30, 0x3E7E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x712D, 0, 0x4C5F, 0, 0, /* 0x00 */
+ 0, 0x712E, 0x4D5C, 0, 0x3142, 0, 0, 0, /* 0x00 */
+ 0x3B41, 0, 0x712F, 0x326E, 0x7130, 0, 0, 0, /* 0x10 */
+ 0x7131, 0, 0, 0, 0, 0x7133, 0x7134, 0, /* 0x10 */
+ 0x7136, 0x7132, 0, 0, 0x7135, 0, 0, 0, /* 0x20 */
+ 0x345B, 0, 0, 0, 0x7137, 0, 0x7138, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x7139, 0x713A, 0, /* 0x30 */
+ 0, 0, 0x713B, 0, 0, 0x713D, 0, 0, /* 0x40 */
+ 0, 0x713C, 0, 0x713F, 0x7142, 0, 0, 0, /* 0x40 */
+ 0x713E, 0x7140, 0x7141, 0, 0, 0x7143, 0, 0x3642, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x3C73, 0x7144, /* 0x90 */
+ 0x7145, 0x3961, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x7146, 0, 0, /* 0xA0 */
+ 0x333E, 0, 0, 0, 0x474F, 0x7147, 0x7148, 0, /* 0xA0 */
+ 0, 0, 0, 0x435A, 0x466B, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x7149, 0, 0, 0, /* 0xB0 */
+ 0, 0x477D, 0, 0, 0x424C, 0x3158, 0x366E, 0, /* 0xC0 */
+ 0x366F, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x4373, 0x714E, 0x3670, 0, 0, 0x326F, 0, 0, /* 0xD0 */
+ 0x714D, 0, 0, 0x714B, 0, 0x714C, 0, 0x714A, /* 0xD0 */
+ 0, 0, 0x7158, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x714F, 0x7150, 0, /* 0xE0 */
+ 0, 0x7151, 0x7152, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x7154, 0, 0, 0x7153, 0, 0, 0, 0x3D59 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7155, 0, 0, 0, 0x7157, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x3533, 0x7156, /* 0x00 */
+ 0, 0, 0x417B, 0x3833, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x7159, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x424D, 0, 0, 0x715A, 0, 0, 0, 0, /* 0x20 */
+ 0x462D, 0, 0, 0, 0, 0, 0, 0x715B, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x7160, 0, /* 0x30 */
+ 0x715E, 0, 0x715D, 0x715F, 0, 0x715C, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x7162, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x7161, 0, 0x7164, /* 0x50 */
+ 0, 0, 0x3643, 0x7163, 0, 0, 0, 0x7165, /* 0x50 */
+ 0, 0, 0x7166, 0, 0x7168, 0x7167, 0, 0, /* 0x60 */
+ 0, 0x7169, 0x716B, 0x716A, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x397C, 0, 0, 0, 0, 0x716C, 0, 0, /* 0xA0 */
+ 0x716D, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x333C, 0, 0, 0, 0x716E, 0, 0, 0, /* 0xB0 */
+ 0x716F, 0, 0, 0, 0x3F71, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x7170, /* 0xC0 */
+ 0, 0x7171, 0, 0x7172, 0x7173, 0, 0, 0, /* 0xD0 */
+ 0x3962, 0, 0, 0, 0, 0, 0x7174, 0x7175, /* 0xD0 */
+ 0, 0, 0x7176, 0x7177, 0, 0, 0x7178, 0, /* 0xE0 */
+ 0, 0, 0x4831, 0x717A, 0, 0x4926, 0x717B, 0x7179, /* 0xE0 */
+ 0, 0x717D, 0, 0, 0x717C, 0, 0, 0x717E, /* 0xF0 */
+ 0, 0, 0, 0x7221 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7222, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x7223, 0, 0x7224, 0, 0, 0, 0, 0x7225, /* 0x10 */
+ 0, 0, 0x7226, 0x7227, 0, 0x7228, 0, 0x7229, /* 0x20 */
+ 0x722A, 0x722B, 0x722C, 0, 0, 0, 0x722D, 0x722E, /* 0x20 */
+ 0, 0x5D35, 0x722F, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x6478, 0x3534, 0, 0, 0, /* 0x30 */
+ 0, 0x3321, 0x3A32, 0x7231, 0x7230, 0x4C25, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x7233, 0x7234, 0x7232, /* 0x40 */
+ 0, 0x7235, 0, 0, 0x4B62, 0, 0, 0, /* 0x50 */
+ 0x7236, 0, 0x357B, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4F25, /* 0x60 */
+ 0, 0, 0, 0, 0x7237, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x7239, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x303E, 0, /* 0x80 */
+ 0, 0x723A, 0x4A2B, 0x7238, 0, 0, 0x723B, 0x723C, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x723D, /* 0x90 */
+ 0x723E, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x723F, 0, 0x4B6E, 0x3B2D, 0, 0x3A7A, 0x412F, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x7240, 0, 0, 0, /* 0xB0 */
+ 0, 0x7243, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x7241, 0, 0, 0, 0, 0, 0x7244, 0, /* 0xC0 */
+ 0, 0x3871, 0x7242, 0, 0, 0, 0, 0x7245, /* 0xC0 */
+ 0, 0x7246, 0x7247, 0, 0x724B, 0, 0x3B2A, 0, /* 0xD0 */
+ 0, 0, 0, 0x4264, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x724C, 0x7249, 0x7248, 0x724A, 0, 0, 0, /* 0xE0 */
+ 0x375F, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x7250, 0x724F, 0x724E, 0, 0, 0x3033 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x725A, 0, 0x7256, 0, /* 0x00 */
+ 0x7257, 0x7253, 0x7259, 0, 0x7255, 0x3362, 0, 0, /* 0x00 */
+ 0x4F4C, 0, 0x7258, 0x7254, 0x7252, 0x7251, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x725C, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x725F, 0, 0, 0x725E, 0x725D, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x4949, 0x725B, 0x3073, /* 0x20 */
+ 0x7260, 0, 0x7262, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x336F, 0x724D, 0x3137, 0, 0, 0x7264, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x7263, 0x7261, /* 0x40 */
+ 0x432D, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x4B70, 0, 0, 0, 0, 0x4E5A, /* 0x50 */
+ 0, 0, 0x7265, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x7266, 0, 0, 0, 0, 0, 0, 0x7267, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0x7268, 0, /* 0x70 */
+ 0x7269, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x443B, 0, 0x726A, /* 0xE0 */
+ 0, 0x4837, 0, 0x726F, 0x726B, 0, 0, 0, /* 0xE0 */
+ 0x726C, 0, 0, 0x4B31, 0x4C44, 0, 0x4650 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7270, 0, 0, 0x7271, 0x463E, /* 0x00 */
+ 0x726E, 0x726D, 0, 0, 0, 0, 0x322A, 0, /* 0x00 */
+ 0, 0, 0x7279, 0, 0, 0x7278, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x3175, 0, 0, 0, 0x7276, /* 0x10 */
+ 0, 0, 0, 0x7275, 0, 0, 0x7273, 0, /* 0x20 */
+ 0x337B, 0, 0x7272, 0x3C32, 0x3229, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x3963, 0, 0, 0x727C, 0x727B, /* 0x30 */
+ 0, 0x727A, 0, 0, 0x7277, 0, 0x727D, 0, /* 0x40 */
+ 0x727E, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x7325, 0x7324, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x7326, 0, 0, 0x312D, 0x7321, 0x7322, 0, /* 0x50 */
+ 0x3974, 0x4C39, 0, 0, 0x7323, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x4B32, 0, 0, 0x732B, /* 0x60 */
+ 0, 0, 0x7327, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x732C, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x7329, /* 0x80 */
+ 0, 0x7328, 0, 0, 0, 0, 0, 0x375C, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x732D, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x732E, 0, 0, 0, /* 0xA0 */
+ 0, 0x732F, 0, 0x732A, 0, 0, 0, 0x7274, /* 0xA0 */
+ 0, 0, 0x7330, 0, 0x4461, 0, 0, 0, /* 0xB0 */
+ 0x7334, 0, 0x7335, 0x7333, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x7332, 0x7338, 0, 0x7331, 0, 0x7336, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x7337, /* 0xC0 */
+ 0, 0, 0, 0x733A, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x7339, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0x733C, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x733D, 0, 0x733E, /* 0xE0 */
+ 0, 0, 0x4F49, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x733B, 0x426B, 0x3A6D, 0, 0, 0x733F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0x7340, 0x7341, 0, 0, 0x7342, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x7343, 0, 0, /* 0x70 */
+ 0x3834, 0x7344, 0, 0, 0, 0x7345, 0, 0x3C2F, /* 0x70 */
+ 0, 0x7346, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x7347, 0, 0, 0x7348, 0x7349, 0, 0, 0, /* 0x80 */
+ 0, 0x734C, 0x734A, 0x4F3C, 0, 0x734B, 0, 0x4E6F, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x734D, 0, 0x4E5B, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x734E, 0x477E, 0, /* 0xA0 */
+ 0, 0x734F, 0x7351, 0, 0, 0x7352, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x7350, 0x396D, 0x4C4D, 0x4B63, 0x5677, 0, 0x5D60, 0x4B7B, /* 0xB0 */
+ 0, 0, 0, 0, 0x322B, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x7354, 0x3550, 0x7355, 0x7356, /* 0xC0 */
+ 0x7357, 0, 0x3975, 0, 0x7358, 0, 0, 0, /* 0xD0 */
+ 0x6054, 0x4C5B, 0, 0x4263, 0x7359, 0x735B, 0x735A, 0, /* 0xD0 */
+ 0x735C, 0, 0, 0, 0, 0x735D, 0, 0, /* 0xE0 */
+ 0x735E, 0, 0, 0, 0, 0, 0, 0x735F, /* 0xE0 */
+ 0, 0, 0, 0, 0x7360, 0, 0x7361, 0x7362, /* 0xF0 */
+ 0, 0x7363, 0, 0x7364, 0x7365, 0x7366 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7367, /* 0x00 */
+ 0x7368, 0, 0, 0, 0, 0, 0x4524, 0, /* 0x00 */
+ 0, 0, 0, 0x385D, 0, 0x736A, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x414D, 0x736B, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x736C, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x4921, 0, 0, 0x736D, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x736E, 0x6337, 0, 0, 0x6C5A, 0x706D, /* 0x40 */
+ 0, 0, 0x736F, 0, 0x7370, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x7372, /* 0x50 */
+ 0x7373, 0x7374, 0x4E70, 0x7371, 0, 0, 0x7375, 0x7376, /* 0x60 */
+ 0, 0, 0x7378, 0, 0x7377, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x737A, 0, 0, 0, 0x737B, 0x7379, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x4E36, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x737C, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x737D, 0x6354, 0, 0, /* 0x90 */
+ 0x737E /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0208_FF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x212A, 0, 0x2174, 0x2170, 0x2173, 0x2175, 0, /* 0x00 */
+ 0x214A, 0x214B, 0x2176, 0x215C, 0x2124, 0, 0x2125, 0x213F, /* 0x00 */
+ 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, /* 0x10 */
+ 0x2338, 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129, /* 0x10 */
+ 0x2177, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, /* 0x20 */
+ 0x2348, 0x2349, 0x234A, 0x234B, 0x234C, 0x234D, 0x234E, 0x234F, /* 0x20 */
+ 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, /* 0x30 */
+ 0x2358, 0x2359, 0x235A, 0x214E, 0, 0x214F, 0x2130, 0x2132, /* 0x30 */
+ 0x212E, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, /* 0x40 */
+ 0x2368, 0x2369, 0x236A, 0x236B, 0x236C, 0x236D, 0x236E, 0x236F, /* 0x40 */
+ 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, /* 0x50 */
+ 0x2378, 0x2379, 0x237A, 0x2150, 0x2143, 0x2151, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x2131, 0, 0x216F /* 0xE0 */
+ /* 0xE0 */
+};
+
diff --git a/sal/textenc/tcvtjp5.tab b/sal/textenc/tcvtjp5.tab
new file mode 100644
index 000000000000..4437ecaa49db
--- /dev/null
+++ b/sal/textenc/tcvtjp5.tab
@@ -0,0 +1,3350 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the UniCode to DBCS tables for the following */
+/* japanese charsets: JIS212 */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2242, 0, 0, 0x2270, 0, 0x2243, 0, /* 0xA0 */
+ 0, 0x226D, 0x226C, 0, 0, 0, 0x226E, 0x2234, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x2231, 0, 0x226B, 0, 0, 0, 0, 0x2244, /* 0xB0 */
+ 0x2A22, 0x2A21, 0x2A24, 0x2A2A, 0x2A23, 0x2A29, 0x2921, 0x2A2E, /* 0xC0 */
+ 0x2A32, 0x2A31, 0x2A34, 0x2A33, 0x2A40, 0x2A3F, 0x2A42, 0x2A41, /* 0xC0 */
+ 0, 0x2A50, 0x2A52, 0x2A51, 0x2A54, 0x2A58, 0x2A53, 0, /* 0xD0 */
+ 0x292C, 0x2A63, 0x2A62, 0x2A65, 0x2A64, 0x2A72, 0x2930, 0x294E, /* 0xD0 */
+ 0x2B22, 0x2B21, 0x2B24, 0x2B2A, 0x2B23, 0x2B29, 0x2941, 0x2B2E, /* 0xE0 */
+ 0x2B32, 0x2B31, 0x2B34, 0x2B33, 0x2B40, 0x2B3F, 0x2B42, 0x2B41, /* 0xE0 */
+ 0x2943, 0x2B50, 0x2B52, 0x2B51, 0x2B54, 0x2B58, 0x2B53, 0, /* 0xF0 */
+ 0x294C, 0x2B63, 0x2B62, 0x2B65, 0x2B64, 0x2B72, 0x2950, 0x2B73 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_01[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2A27, 0x2B27, 0x2A25, 0x2B25, 0x2A28, 0x2B28, 0x2A2B, 0x2B2B, /* 0x00 */
+ 0x2A2C, 0x2B2C, 0x2A2F, 0x2B2F, 0x2A2D, 0x2B2D, 0x2A30, 0x2B30, /* 0x00 */
+ 0x2922, 0x2942, 0x2A37, 0x2B37, 0, 0, 0x2A36, 0x2B36, /* 0x10 */
+ 0x2A38, 0x2B38, 0x2A35, 0x2B35, 0x2A3A, 0x2B3A, 0x2A3B, 0x2B3B, /* 0x10 */
+ 0x2A3D, 0x2B3D, 0x2A3C, 0, 0x2A3E, 0x2B3E, 0x2924, 0x2944, /* 0x20 */
+ 0x2A47, 0x2B47, 0x2A45, 0x2B45, 0, 0, 0x2A46, 0x2B46, /* 0x20 */
+ 0x2A44, 0x2945, 0x2926, 0x2946, 0x2A48, 0x2B48, 0x2A49, 0x2B49, /* 0x30 */
+ 0x2947, 0x2A4A, 0x2B4A, 0x2A4C, 0x2B4C, 0x2A4B, 0x2B4B, 0x2929, /* 0x30 */
+ 0x2949, 0x2928, 0x2948, 0x2A4D, 0x2B4D, 0x2A4F, 0x2B4F, 0x2A4E, /* 0x40 */
+ 0x2B4E, 0x294A, 0x292B, 0x294B, 0x2A57, 0x2B57, 0, 0, /* 0x40 */
+ 0x2A56, 0x2B56, 0x292D, 0x294D, 0x2A59, 0x2B59, 0x2A5B, 0x2B5B, /* 0x50 */
+ 0x2A5A, 0x2B5A, 0x2A5C, 0x2B5C, 0x2A5D, 0x2B5D, 0x2A5F, 0x2B5F, /* 0x50 */
+ 0x2A5E, 0x2B5E, 0x2A61, 0x2B61, 0x2A60, 0x2B60, 0x292F, 0x294F, /* 0x60 */
+ 0x2A6C, 0x2B6C, 0x2A69, 0x2B69, 0x2A66, 0x2B66, 0x2A6B, 0x2B6B, /* 0x60 */
+ 0x2A68, 0x2B68, 0x2A6A, 0x2B6A, 0x2A71, 0x2B71, 0x2A74, 0x2B74, /* 0x70 */
+ 0x2A73, 0x2A75, 0x2B75, 0x2A77, 0x2B77, 0x2A76, 0x2B76, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x2A26, 0x2B26, 0x2A43, /* 0xC0 */
+ 0x2B43, 0x2A55, 0x2B55, 0x2A67, 0x2B67, 0x2A70, 0x2B70, 0x2A6D, /* 0xD0 */
+ 0x2B6D, 0x2A6F, 0x2B6F, 0x2A6E, 0x2B6E, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x2B39 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_02[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2230, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x222F, 0x2232, 0x2236, 0x2235, 0, 0x2233 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_03[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2238, 0x2239, 0x2661, 0, /* 0x80 */
+ 0x2662, 0x2663, 0x2664, 0, 0x2667, 0, 0x2669, 0x266C, /* 0x80 */
+ 0x2676, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x2665, 0x266A, 0x2671, 0x2672, 0x2673, 0x2674, /* 0xA0 */
+ 0x267B, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x2678, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x2675, 0x267A, 0x2677, 0x2679, 0x267C /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_04[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747, /* 0x00 */
+ 0x2748, 0x2749, 0x274A, 0x274B, 0x274C, 0, 0x274D, 0x274E, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x2772, 0x2773, 0x2774, 0x2775, 0x2776, 0x2777, /* 0x50 */
+ 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0, 0x277D, 0x277E /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2271, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x226F /* 0x20 */
+ /* 0x20 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3021, 0, 0x3022, 0x3023, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x3024, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x3025, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3026, /* 0x10 */
+ 0, 0, 0, 0x3027, 0x3028, 0, 0, 0, /* 0x20 */
+ 0x3029, 0, 0, 0x302A, 0, 0, 0x302B, 0x302C, /* 0x20 */
+ 0x302D, 0, 0, 0, 0, 0x302E, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x302F, 0x3030, 0, 0, 0x3031, 0, 0, 0x3032, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x3033, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x3034, 0, 0x3035, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x3036, 0, 0, 0, 0, /* 0x60 */
+ 0x3037, 0x3038, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x3039, 0x303A, 0, 0, /* 0x70 */
+ 0, 0x303B, 0, 0, 0, 0, 0, 0x303C, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x303D, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x303E, 0x303F, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x3040, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3041, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x3042, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x3043, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x3044, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x3045, 0x3046, 0, 0, 0, 0, /* 0xD0 */
+ 0x3047, 0x3048, 0x3049, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x304A, 0, 0, 0, 0, 0, 0, 0x304B, /* 0xE0 */
+ 0, 0x304C, 0, 0x304D, 0, 0x304E, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0x304F, 0x3050, 0x3051 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3052, 0, 0x3053, 0x3054, 0, 0, 0, 0, /* 0x00 */
+ 0x3055, 0, 0, 0x3056, 0x3057, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x3058, 0, 0, 0x3059, 0x305A, 0x305B, /* 0x10 */
+ 0, 0x305C, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x305D, 0, /* 0x20 */
+ 0, 0x305E, 0, 0x3060, 0, 0x3061, 0, 0x3062, /* 0x30 */
+ 0, 0x3063, 0, 0x3064, 0, 0, 0x3065, 0, /* 0x30 */
+ 0x3066, 0, 0x3067, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x3068, 0x3069, 0, 0x306A, 0x306B, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x306C, 0, 0x306D, 0, 0x306E, 0, /* 0x50 */
+ 0x306F, 0, 0, 0, 0, 0, 0, 0x3070, /* 0x50 */
+ 0x305F, 0, 0, 0x3071, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x3072, 0, 0x3073, 0, 0x3074, 0, /* 0x60 */
+ 0, 0x3075, 0, 0, 0, 0, 0, 0x3076, /* 0x70 */
+ 0x3077, 0x3078, 0x3079, 0, 0, 0x307A, 0x307B, 0, /* 0x70 */
+ 0, 0x307C, 0x307D, 0, 0x307E, 0x3121, 0, 0, /* 0x80 */
+ 0, 0x3122, 0x3123, 0, 0x3124, 0, 0x3125, 0, /* 0x80 */
+ 0x3126, 0, 0x3127, 0x3128, 0x3129, 0, 0, 0x312A, /* 0x90 */
+ 0, 0x312B, 0x312C, 0, 0, 0, 0x312D, 0x312E, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x312F, 0, 0, 0, 0, 0x3130, /* 0xB0 */
+ 0, 0x3131, 0, 0x3132, 0x3133, 0x3134, 0x3135, 0, /* 0xB0 */
+ 0x3136, 0x3137, 0, 0, 0, 0x3138, 0x3139, 0, /* 0xC0 */
+ 0x313A, 0x313B, 0, 0x313C, 0x313D, 0x313E, 0, 0x313F, /* 0xC0 */
+ 0, 0, 0x3140, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x3141, 0, 0, 0, /* 0xD0 */
+ 0x3142, 0, 0x3143, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x3144, 0, 0x3145, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x3146, 0x3147, 0, 0x3148 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3149, 0x314A, 0, 0, 0x314B, 0, 0, 0x314C, /* 0x00 */
+ 0, 0, 0x314D, 0, 0x314E, 0, 0x314F, 0, /* 0x00 */
+ 0x3150, 0, 0, 0x3151, 0, 0, 0, 0x3152, /* 0x10 */
+ 0x3153, 0, 0, 0x3154, 0x3155, 0x3156, 0x3157, 0, /* 0x10 */
+ 0, 0, 0x3158, 0, 0, 0, 0, 0x3159, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x315A, 0, /* 0x20 */
+ 0x315B, 0, 0x315C, 0x315D, 0, 0x315E, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x3176, 0, 0, 0, 0, /* 0x30 */
+ 0x315F, 0x3160, 0x3161, 0, 0, 0x3162, 0x3163, 0, /* 0x40 */
+ 0, 0, 0x3164, 0, 0x3165, 0, 0x3166, 0, /* 0x40 */
+ 0, 0x3167, 0x3168, 0x3169, 0, 0, 0, 0x316A, /* 0x50 */
+ 0, 0x316B, 0, 0, 0, 0, 0, 0x316C, /* 0x50 */
+ 0x316D, 0, 0x316E, 0x316F, 0, 0, 0x3170, 0x3171, /* 0x60 */
+ 0, 0, 0x3172, 0, 0, 0x3173, 0, 0, /* 0x60 */
+ 0x3174, 0x3175, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x3177, 0, 0x3178, 0x3179, 0, 0x317A, 0, /* 0x80 */
+ 0, 0, 0x317B, 0, 0, 0, 0x317C, 0x317D, /* 0x80 */
+ 0x317E, 0, 0x3221, 0x3222, 0x3223, 0, 0x3224, 0, /* 0x90 */
+ 0, 0, 0, 0x3225, 0x3226, 0, 0x3227, 0x3228, /* 0x90 */
+ 0x3229, 0x322A, 0x322B, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x322C, 0, 0, 0, 0, 0x322D, /* 0xA0 */
+ 0x322E, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x322F, 0x3230, 0, 0, 0x3231, 0, 0, /* 0xB0 */
+ 0x3232, 0, 0, 0x3233, 0x3234, 0, 0, 0x3235, /* 0xC0 */
+ 0, 0, 0, 0, 0x3236, 0, 0x3237, 0, /* 0xC0 */
+ 0x3238, 0, 0, 0x3239, 0x323A, 0, 0, 0, /* 0xD0 */
+ 0x323B, 0, 0, 0, 0x323C, 0x323D, 0, 0x323E, /* 0xD0 */
+ 0, 0, 0x323F, 0, 0x3240, 0, 0x3241, 0, /* 0xE0 */
+ 0x3242, 0x3243, 0, 0, 0, 0, 0, 0x3244, /* 0xE0 */
+ 0, 0x3245, 0x3251, 0, 0, 0, 0x3246, 0, /* 0xF0 */
+ 0, 0, 0x3247, 0, 0, 0, 0x3248 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3249, 0, 0, 0x324A, 0x324B, /* 0x00 */
+ 0x324C, 0, 0, 0x324D, 0x324E, 0x324F, 0x3250, 0, /* 0x00 */
+ 0x3252, 0, 0, 0, 0, 0, 0, 0x3253, /* 0x10 */
+ 0, 0x3254, 0, 0x3255, 0x3256, 0x3257, 0x3258, 0, /* 0x10 */
+ 0, 0, 0, 0x3259, 0, 0, 0, 0x325A, /* 0x20 */
+ 0x325B, 0, 0, 0, 0x325C, 0x325D, 0, 0x325E, /* 0x20 */
+ 0, 0x325F, 0, 0x3260, 0x3261, 0x3262, 0, 0, /* 0x30 */
+ 0x3263, 0x3264, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x3265, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x3266, 0, 0, 0, 0, 0x3267, /* 0x40 */
+ 0, 0, 0, 0x3268, 0, 0x3269, 0, 0x326A, /* 0x50 */
+ 0x326B, 0, 0, 0, 0, 0, 0, 0x326C, /* 0x50 */
+ 0, 0, 0, 0, 0x326D, 0, 0x326E, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x326F, 0, /* 0x70 */
+ 0, 0, 0, 0x3270, 0x3271, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x3272, 0, 0, 0x3273, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x3274, 0, 0, 0, 0, 0x3275, 0, 0, /* 0x90 */
+ 0, 0x3276, 0, 0x3277, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x3278, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x3279, 0, 0x327A, 0, 0x327B, 0, 0x327C, 0x327D, /* 0xB0 */
+ 0, 0, 0x327E, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x3321, 0, 0, 0, 0, 0, 0, 0x3322, /* 0xC0 */
+ 0, 0x3323, 0x3324, 0x3325, 0, 0x3326, 0, 0, /* 0xD0 */
+ 0x3327, 0, 0, 0, 0, 0, 0x3328, 0, /* 0xD0 */
+ 0, 0, 0x3329, 0, 0, 0x332A, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x332B, 0, /* 0xE0 */
+ 0, 0, 0x332C, 0x332D, 0x332E, 0, 0, 0x332F /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3330, 0x3331, 0, 0, 0x3332, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x3333, 0x3334, 0, 0x3335, 0x3336, 0, /* 0x10 */
+ 0x3337, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x3338, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x3339, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x333A, 0x333B, 0, 0, 0x333C, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x333D, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x333E, 0, 0, /* 0x40 */
+ 0, 0x333F, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x3340, 0, 0x3341, /* 0x50 */
+ 0x3342, 0, 0x3343, 0, 0x3344, 0, 0, 0x3345, /* 0x50 */
+ 0x3346, 0x3347, 0, 0, 0, 0, 0x3348, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0x3349, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x334A, /* 0x70 */
+ 0x334B, 0x334C, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x334D, 0, 0x334E, 0, 0, 0x334F, 0, 0, /* 0x80 */
+ 0, 0, 0x3350, 0, 0x3351, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x3352, 0, 0x3353, 0x3354, 0x3355, /* 0x90 */
+ 0x3356, 0, 0x3357, 0, 0x3358, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x3359, 0x335A, 0x335B, 0x335C, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x335D, /* 0xA0 */
+ 0x335E, 0, 0, 0, 0, 0, 0x335F, 0x3360, /* 0xB0 */
+ 0x3361, 0, 0x3362, 0x3363, 0, 0x3364, 0, 0, /* 0xB0 */
+ 0x3365, 0, 0, 0, 0x3366, 0, 0x3367, 0, /* 0xC0 */
+ 0x3368, 0, 0, 0, 0x3369, 0, 0, 0x336A, /* 0xC0 */
+ 0, 0x336B, 0, 0, 0x336C, 0, 0x336D, 0, /* 0xD0 */
+ 0, 0, 0, 0x336E, 0x336F, 0, 0, 0, /* 0xD0 */
+ 0, 0x3370, 0, 0, 0, 0x3371, 0, 0, /* 0xE0 */
+ 0x3372, 0x3373, 0x3374, 0, 0x3375, 0, 0, 0, /* 0xE0 */
+ 0x3376, 0x3377, 0, 0, 0x3378, 0, 0x3379, 0x337A /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x337B, 0, 0, 0x337C, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x337D, 0x337E, 0x3421, 0, 0, 0, /* 0x00 */
+ 0, 0x3422, 0, 0x3423, 0, 0, 0, 0, /* 0x10 */
+ 0x3424, 0, 0, 0x3425, 0x3426, 0, 0x3427, 0x3428, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x3429, 0, 0x342A, /* 0x20 */
+ 0x342B, 0x342C, 0, 0x342D, 0x342E, 0x342F, 0, 0, /* 0x20 */
+ 0x3430, 0, 0x3431, 0, 0, 0x3432, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x3433, 0x3434, 0x3435, 0, /* 0x30 */
+ 0, 0, 0x3436, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x3438, 0x3437, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x3439, 0, 0x343A, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x343B, 0, 0x343C, 0, 0x343D, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x343E, 0x343F, 0, 0, /* 0x60 */
+ 0, 0, 0x3440, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x3441, 0, 0, 0, 0, 0x3442, 0, /* 0x70 */
+ 0, 0, 0, 0x3443, 0, 0, 0, 0x3444, /* 0x80 */
+ 0x3445, 0, 0, 0, 0, 0, 0x3446, 0, /* 0x80 */
+ 0, 0, 0, 0x3447, 0x3448, 0, 0, 0, /* 0x90 */
+ 0, 0x3449, 0, 0, 0, 0x344A, 0, 0, /* 0x90 */
+ 0, 0x344B, 0, 0, 0x344C, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x344D, 0x344E, 0, 0, 0, 0x344F, /* 0xA0 */
+ 0, 0, 0x3450, 0, 0x3451, 0x3452, 0, 0x3453, /* 0xB0 */
+ 0x3454, 0, 0x3455, 0, 0, 0x3456, 0, 0, /* 0xB0 */
+ 0x3457, 0, 0, 0, 0, 0x3458, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3459, /* 0xC0 */
+ 0, 0, 0x345A, 0x345B, 0, 0x345C, 0, 0, /* 0xD0 */
+ 0, 0, 0x345D, 0, 0, 0x345E, 0x345F, 0, /* 0xD0 */
+ 0x3460, 0, 0, 0, 0, 0, 0x3461, 0x3462, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x3463 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3464, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x3465, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x3466, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x3467, 0, 0, 0, 0, 0, 0x3468, /* 0x20 */
+ 0x3469, 0, 0x346A, 0, 0, 0, 0, 0x346B, /* 0x20 */
+ 0, 0x346C, 0, 0, 0x346D, 0x346E, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x346F, 0x3470, 0, 0, 0x3471, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x3472, 0, 0x3473, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x3474, 0, /* 0x50 */
+ 0, 0, 0x3475, 0, 0x3476, 0, 0x3477, 0x3478, /* 0x60 */
+ 0, 0x3479, 0, 0x347A, 0, 0x347B, 0x347C, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x347D, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x347E, /* 0x70 */
+ 0, 0x3521, 0, 0x3522, 0, 0x3523, 0, 0, /* 0x80 */
+ 0x3524, 0x3525, 0, 0, 0, 0x3526, 0, 0, /* 0x80 */
+ 0, 0x3527, 0, 0, 0, 0x3528, 0x3529, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x352A, 0, 0, 0x352B, /* 0x90 */
+ 0, 0x352C, 0, 0, 0, 0, 0x352D, 0x352E, /* 0xA0 */
+ 0, 0x352F, 0x3530, 0, 0, 0x3531, 0x3532, 0, /* 0xA0 */
+ 0, 0x3533, 0, 0, 0, 0, 0, 0x3534, /* 0xB0 */
+ 0, 0x3535, 0x3536, 0x3537, 0, 0, 0, 0x3538, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x3539, 0, /* 0xC0 */
+ 0, 0, 0x353A, 0, 0, 0x353B, 0x353C, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x353D, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x353E, 0, 0x353F, 0, 0, 0x3540, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x3541, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x3542, 0, 0x3543, 0x3544 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3545, 0x3546, 0, 0, 0, 0x3547, 0, 0, /* 0x00 */
+ 0x3548, 0x3549, 0, 0, 0x354A, 0x354B, 0x354C, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x354D, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x354E, 0x354F, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x3550, 0, 0, 0x3551, 0x3552, 0, /* 0x30 */
+ 0, 0, 0, 0x3553, 0x3554, 0x3555, 0, 0, /* 0x30 */
+ 0, 0x3556, 0, 0, 0, 0, 0, 0x3557, /* 0x40 */
+ 0, 0x3558, 0x3559, 0, 0, 0x355A, 0, 0, /* 0x40 */
+ 0x355B, 0x355C, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x355D, 0, 0x355E, 0x355F, 0, 0, 0x3560, 0, /* 0x50 */
+ 0x3561, 0x3562, 0, 0, 0x3563, 0, 0x3564, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3565, /* 0x70 */
+ 0, 0x3566, 0x3567, 0, 0, 0, 0x3568, 0, /* 0x80 */
+ 0x3569, 0, 0, 0, 0, 0, 0x356A, 0x356B, /* 0x80 */
+ 0, 0x356C, 0x356D, 0x356E, 0x356F, 0, 0, 0x3570, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x3571, 0x3572, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x3573, 0, 0, /* 0xA0 */
+ 0, 0, 0x3574, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3575, /* 0xB0 */
+ 0, 0x3576, 0, 0x3577, 0, 0, 0x3578, 0, /* 0xC0 */
+ 0, 0x3579, 0, 0x357A, 0x357B, 0, 0x357C, 0, /* 0xC0 */
+ 0, 0x357D, 0x357E, 0x3621, 0, 0, 0, 0x3622, /* 0xD0 */
+ 0x3623, 0, 0, 0x3624, 0, 0, 0x3625, 0, /* 0xD0 */
+ 0, 0, 0x3626, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x3627, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x3628, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3629 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x362A, 0, 0, /* 0x00 */
+ 0x362B, 0, 0x362C, 0, 0, 0x362D, 0x362E, 0x362F, /* 0x00 */
+ 0x3630, 0x3631, 0x3632, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x3633, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x3634, 0, 0, 0, /* 0x20 */
+ 0x3635, 0, 0, 0x3636, 0, 0x3637, 0, 0x3638, /* 0x30 */
+ 0, 0x3639, 0, 0x363A, 0x363B, 0x363C, 0, 0x363D, /* 0x30 */
+ 0x363E, 0x363F, 0, 0x3640, 0x3641, 0, 0x3642, 0, /* 0x40 */
+ 0, 0x3643, 0, 0x3644, 0, 0x3645, 0, 0x3646, /* 0x40 */
+ 0, 0, 0, 0, 0x3647, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x3648, 0, /* 0x50 */
+ 0x3649, 0x364A, 0x364B, 0x364C, 0, 0, 0x364D, 0, /* 0x60 */
+ 0, 0x364E, 0, 0, 0, 0x364F, 0, 0x3650, /* 0x60 */
+ 0, 0x3651, 0x3652, 0, 0, 0x3653, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x3654, 0x3655, 0, 0, /* 0x80 */
+ 0x3656, 0, 0, 0x3657, 0x3658, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x3659, 0, 0, /* 0x90 */
+ 0, 0x365A, 0x365B, 0, 0, 0x365C, 0x365D, 0x365E, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x365F, 0x3660, /* 0xA0 */
+ 0x3661, 0x3662, 0, 0x3663, 0x3664, 0x3665, 0, 0, /* 0xA0 */
+ 0, 0x3666, 0, 0x3667, 0, 0, 0, 0x3668, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x3669, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x366A, 0, 0, /* 0xC0 */
+ 0, 0x366B, 0x366C, 0x366D, 0x3670, 0x3671, 0, 0x366E, /* 0xC0 */
+ 0x366F, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x3672, 0, 0, 0x3673, 0x3674, 0, 0x3675, /* 0xD0 */
+ 0, 0x3676, 0, 0, 0x3677, 0x3678, 0x3679, 0x367A, /* 0xE0 */
+ 0x367B, 0, 0, 0x367D, 0, 0x367E, 0, 0, /* 0xE0 */
+ 0, 0x367C, 0, 0, 0, 0, 0x3721, 0x3722 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3723, 0x3724, 0, 0, 0, 0, 0x3725, /* 0x00 */
+ 0, 0, 0x3726, 0, 0x3727, 0, 0, 0, /* 0x00 */
+ 0, 0x3728, 0, 0, 0, 0x3729, 0, 0, /* 0x10 */
+ 0, 0, 0x372A, 0x372B, 0, 0x372C, 0, 0, /* 0x10 */
+ 0x372D, 0, 0x372E, 0x372F, 0x3730, 0x3731, 0, 0, /* 0x20 */
+ 0, 0x3732, 0x3733, 0, 0x3734, 0, 0x3735, 0x3736, /* 0x20 */
+ 0, 0, 0, 0x3737, 0x3738, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x3739, 0x373A, 0x373B, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x373C, 0x373D, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x373E, 0x373F, 0, 0, /* 0x40 */
+ 0, 0, 0x3740, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x3741, 0, 0, 0x3742, 0, 0x3743, /* 0x60 */
+ 0x3744, 0, 0, 0x3745, 0, 0x3746, 0x3747, 0x3748, /* 0x60 */
+ 0x3749, 0x374A, 0, 0x374B, 0x374C, 0x374D, 0, 0x374E, /* 0x70 */
+ 0, 0x374F, 0x3750, 0x3751, 0x3752, 0, 0x3753, 0, /* 0x70 */
+ 0, 0x3754, 0, 0x3755, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x3756, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x3757, 0x3760, 0, 0x3758, /* 0x90 */
+ 0, 0x3759, 0x375A, 0, 0x375B, 0x375C, 0x375D, 0x375E, /* 0x90 */
+ 0, 0x375F, 0, 0, 0, 0, 0, 0x3761, /* 0xA0 */
+ 0x3762, 0x3763, 0, 0, 0x3764, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x3765, 0, 0, 0, 0, 0x3766, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3767, /* 0xC0 */
+ 0x3768, 0, 0, 0, 0x3769, 0, 0, 0x376A, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x376B, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x376C, 0x376D, 0, /* 0xD0 */
+ 0, 0x377E, 0, 0, 0x376E, 0, 0x376F, 0x3770, /* 0xE0 */
+ 0, 0x3771, 0, 0, 0, 0x3772, 0, 0, /* 0xE0 */
+ 0x3773, 0, 0, 0, 0, 0x3774, 0x3775, 0, /* 0xF0 */
+ 0x3776, 0, 0, 0, 0, 0x3777, 0x3778, 0x3779 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x377A, 0x377B, 0, 0, 0, /* 0x00 */
+ 0x377C, 0x377D, 0, 0, 0x3821, 0x3822, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x3823, 0, 0, 0x3824, 0x3825, /* 0x10 */
+ 0x3826, 0, 0, 0, 0, 0, 0x3827, 0x3828, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x3829, 0, 0, /* 0x20 */
+ 0, 0, 0x382A, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x382B, 0, 0, 0, 0, 0, 0x382C, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x382D, 0, 0, 0x382E, 0x382F, 0, 0x3830, /* 0x40 */
+ 0x3831, 0, 0, 0, 0, 0x3832, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3833, /* 0x50 */
+ 0, 0x3834, 0, 0, 0x3835, 0, 0, 0x3836, /* 0x60 */
+ 0x3837, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x3838, 0, 0, 0, 0x3839, 0, 0, 0x383A, /* 0x70 */
+ 0x383B, 0x383C, 0, 0, 0, 0, 0, 0x383D, /* 0x80 */
+ 0x383E, 0x383F, 0x3840, 0, 0x3841, 0x3842, 0, 0x3843, /* 0x80 */
+ 0x3844, 0, 0, 0, 0x3845, 0, 0x3846, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x3847, 0, 0, /* 0x90 */
+ 0x3848, 0x3849, 0x384A, 0, 0, 0, 0x384B, 0, /* 0xA0 */
+ 0, 0x384C, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x384D, 0x384E, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x3850, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x3851, 0, 0x384F, 0, 0, 0, /* 0xC0 */
+ 0x3852, 0, 0, 0, 0, 0x3853, 0x3854, 0, /* 0xC0 */
+ 0x3855, 0, 0x3856, 0, 0x3857, 0, 0x3858, 0, /* 0xD0 */
+ 0, 0, 0x3859, 0, 0, 0x385A, 0, 0, /* 0xD0 */
+ 0, 0x385B, 0x385C, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x385D, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x385E /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x385F, 0x3860, 0, /* 0x00 */
+ 0, 0, 0, 0x3861, 0x3862, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x3863, 0x3864, 0x3865, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x3867, 0, 0, /* 0x10 */
+ 0, 0x3868, 0, 0x3869, 0x386A, 0, 0, 0, /* 0x20 */
+ 0x386B, 0, 0, 0, 0, 0, 0, 0x386C, /* 0x20 */
+ 0x386D, 0, 0, 0x386E, 0, 0x386F, 0x3870, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3871, /* 0x30 */
+ 0, 0, 0, 0x3872, 0, 0, 0x3873, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x3874, 0x3875, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x3876, 0, 0x3877, 0, 0x3878, 0x3879, 0x387A, /* 0x50 */
+ 0, 0x387B, 0, 0x387C, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x387D, 0, 0x387E, 0, 0x3921, /* 0x60 */
+ 0, 0, 0x3922, 0, 0, 0x3923, 0x3924, 0, /* 0x70 */
+ 0, 0x3925, 0, 0x3926, 0x3927, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x3928, 0x3929, 0, 0x392A, 0, /* 0x80 */
+ 0, 0, 0x392B, 0, 0, 0x392C, 0, 0x392D, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x392E, /* 0x90 */
+ 0, 0, 0, 0, 0x392F, 0, 0, 0x3930, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x3931, 0x3932, 0x3933, /* 0xA0 */
+ 0x3934, 0, 0, 0x3935, 0, 0, 0, 0x3936, /* 0xB0 */
+ 0, 0, 0x3937, 0, 0x3938, 0, 0, 0, /* 0xB0 */
+ 0, 0x3939, 0, 0x393A, 0x393B, 0, 0, 0, /* 0xC0 */
+ 0x393C, 0, 0x393D, 0, 0, 0x393E, 0, 0, /* 0xC0 */
+ 0, 0, 0x393F, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x3940, 0x3941, 0x3942, /* 0xD0 */
+ 0, 0, 0, 0x3943, 0x3944, 0, 0, 0x3945, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x3946, 0x3947, /* 0xE0 */
+ 0, 0x3948, 0x3949, 0, 0x394A, 0, 0, 0x394B /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x394C, 0, 0, 0, 0x394D, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x394E, 0x394F, 0x3950, 0, /* 0x00 */
+ 0, 0, 0x3951, 0x3952, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x3953, 0, /* 0x10 */
+ 0, 0, 0, 0x3954, 0x3955, 0, 0, 0x3956, /* 0x20 */
+ 0x3957, 0, 0x3958, 0, 0, 0x3959, 0, 0, /* 0x20 */
+ 0x395A, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x395B, 0x395C, 0, 0x395D, /* 0x40 */
+ 0x395E, 0, 0, 0, 0x395F, 0, 0, 0, /* 0x40 */
+ 0x3960, 0, 0, 0, 0, 0x3961, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x3962, 0, /* 0x50 */
+ 0, 0, 0, 0x3963, 0, 0x3964, 0, 0x3965, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x3966, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3967, /* 0x70 */
+ 0, 0, 0x3968, 0x3969, 0, 0, 0x396A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x396B, 0, 0, 0, 0, /* 0x80 */
+ 0x396C, 0, 0, 0x396D, 0, 0, 0x396E, 0, /* 0x90 */
+ 0, 0x396F, 0, 0, 0x3970, 0, 0x3971, 0x3972, /* 0x90 */
+ 0x3973, 0, 0x3974, 0, 0, 0, 0, 0x3975, /* 0xA0 */
+ 0, 0, 0, 0, 0x3976, 0, 0, 0, /* 0xA0 */
+ 0, 0x3977, 0x3978, 0x3979, 0, 0x397A, 0, 0, /* 0xB0 */
+ 0x397B, 0, 0x397C, 0x397D, 0, 0, 0, 0x397E, /* 0xB0 */
+ 0, 0, 0, 0, 0x3A21, 0, 0x3A22, 0, /* 0xC0 */
+ 0x3A23, 0, 0, 0, 0, 0, 0, 0x3A24, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x3A25, 0, 0x3A26, 0, 0, 0, /* 0xD0 */
+ 0x3A27, 0, 0, 0, 0, 0x3A28, 0, 0, /* 0xE0 */
+ 0, 0, 0x3A29, 0, 0, 0, 0x3A2A, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x3A2B, 0x3A2C, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0x3A2D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3A2E, 0x3A2F, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x3A30, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3A31, /* 0x10 */
+ 0, 0x3A33, 0, 0x3A34, 0, 0x3A35, 0, 0, /* 0x10 */
+ 0, 0x3A36, 0, 0, 0, 0x3A37, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x3A38, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x3A32, 0, 0, 0, /* 0x30 */
+ 0x3A39, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x3A3A, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x3A3B, 0x3A3C, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x3A3D, 0, 0, 0, 0x3A3E, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x3A3F, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x3A40, 0, 0, 0, 0, 0, 0x3A41, 0x3A42, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x3A43, 0x3A44, 0x3A45, 0x3A46, /* 0x70 */
+ 0, 0x3A47, 0, 0, 0x3A48, 0, 0x3A49, 0, /* 0x80 */
+ 0, 0, 0x3A4A, 0, 0, 0, 0x3A4B, 0, /* 0x80 */
+ 0x3A4C, 0x3A4D, 0, 0x3A4E, 0x3A4F, 0, 0x3A50, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x3A51, 0x3A52, 0, 0, 0x3A53, 0x3A54, 0, 0x3A55, /* 0xA0 */
+ 0, 0x3A56, 0x3A57, 0, 0, 0, 0, 0x3A58, /* 0xB0 */
+ 0, 0, 0x3A59, 0, 0x3A5A, 0, 0, 0, /* 0xB0 */
+ 0x3A5B, 0x3A5C, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x3A5D, 0, 0x3A5E, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x3A5F, 0x3A60, /* 0xD0 */
+ 0x3A61, 0x3A62, 0x3A63, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x3A64, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3A65, /* 0xE0 */
+ 0, 0x3A66, 0, 0, 0x3A67, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0x3A68 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x3A69, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3A6A, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x3A6B, 0x3A6C, /* 0x10 */
+ 0, 0, 0, 0x3A6D, 0, 0, 0x3A6E, 0, /* 0x20 */
+ 0, 0x3A6F, 0, 0x3A70, 0x3A71, 0, 0x3A72, 0, /* 0x20 */
+ 0x3A73, 0, 0x3A74, 0, 0, 0x3A75, 0x3A76, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x3A77, 0x3A78, 0, 0x3A79, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x3A7A, 0x3A7B, 0, 0, 0, 0x3A7C, /* 0x60 */
+ 0x3A7D, 0x3A7E, 0, 0, 0, 0x3B21, 0, 0, /* 0x60 */
+ 0x3B22, 0, 0, 0, 0x3B23, 0x3B24, 0, 0, /* 0x70 */
+ 0, 0, 0x3B25, 0x3B26, 0x3B27, 0x3B28, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3B29, /* 0x80 */
+ 0x3B2A, 0, 0x3B2B, 0, 0, 0, 0, 0x3B2C, /* 0x80 */
+ 0, 0, 0x3B2D, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x3B2E, 0, 0x3B2F, /* 0x90 */
+ 0x3B30, 0, 0x3B31, 0x3B32, 0, 0, 0x3B33, 0, /* 0xA0 */
+ 0, 0, 0x3B34, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x3B35, 0, 0x3B36, 0x3B37, 0, 0, /* 0xB0 */
+ 0, 0, 0x3B38, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x3B39, 0, 0x3B3A, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x3B3B, 0, 0, 0, 0, 0x3B3D, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x3B3C, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x3B3E, 0, /* 0xE0 */
+ 0, 0x3B3F, 0x3B40, 0, 0x3B41 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3B42, 0, 0, 0, 0, 0x3B43, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x3B44, 0, 0, /* 0x00 */
+ 0, 0, 0x3B45, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x3B47, 0x3B48, 0, 0x3B49, 0x3B4A, /* 0x20 */
+ 0, 0, 0, 0x3B46, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x3B4B, 0, 0, 0x3B4C, 0, 0, 0, /* 0x30 */
+ 0, 0x3B4D, 0, 0, 0, 0x3B4E, 0, 0x3B4F, /* 0x30 */
+ 0, 0, 0x3B50, 0x3B51, 0, 0, 0x3B52, 0, /* 0x40 */
+ 0x3B53, 0, 0x3B57, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x3B55, 0, 0, 0, 0x3B54, 0, 0, /* 0x50 */
+ 0, 0x3B56, 0, 0, 0, 0, 0, 0x3B58, /* 0x50 */
+ 0x3B59, 0x3B5A, 0x3B5B, 0, 0x3B5C, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x3B5D, 0, 0, 0x3B5E, 0, 0, /* 0x60 */
+ 0x3B5F, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x3B60, 0x3B61, 0, 0, 0, 0x3B62, 0x3B63, /* 0x70 */
+ 0, 0x3B64, 0, 0x3B65, 0, 0, 0, 0, /* 0x80 */
+ 0x3B66, 0, 0x3B67, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x3B68, 0x3B69, 0x3B6A, 0x3B6B, 0, 0, /* 0x90 */
+ 0, 0x3B6C, 0, 0x3B6D, 0, 0, 0, 0x3B6E, /* 0x90 */
+ 0x3B6F, 0, 0, 0, 0, 0, 0, 0x3B70, /* 0xA0 */
+ 0, 0, 0, 0x3B71, 0, 0, 0, 0, /* 0xA0 */
+ 0x3B72, 0, 0x6674, 0, 0x3B73, 0, 0, 0, /* 0xB0 */
+ 0x3B74, 0x3B75, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x3B76, 0, 0, 0, 0x3B77, /* 0xC0 */
+ 0, 0, 0, 0x3B78, 0, 0, 0x3B7A, 0, /* 0xC0 */
+ 0x3B79, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x3B7B, 0x3B7C, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x3B7D, 0, 0, 0, 0x3B7E, 0, 0, 0, /* 0xE0 */
+ 0, 0x3C21, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x3C22, 0x3C23 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3C24, 0, 0, 0, 0, 0, 0, 0x3C25, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x3C26, 0, 0, /* 0x00 */
+ 0, 0, 0x3C27, 0, 0x3C28, 0x3C29, 0, 0, /* 0x10 */
+ 0x3C2A, 0, 0, 0, 0, 0, 0, 0x3C2B, /* 0x10 */
+ 0x3C2C, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x3C2E, 0, 0, 0, 0, 0, 0x3C2D, 0, /* 0x20 */
+ 0, 0, 0x3C2F, 0, 0, 0x3C30, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x3C31, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x3C34, 0, 0x3C32, 0, 0, 0, 0, /* 0x40 */
+ 0x3C33, 0x3C35, 0, 0, 0, 0, 0x3C36, 0, /* 0x50 */
+ 0x3C37, 0, 0, 0x3C38, 0x3C39, 0, 0x3C3A, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x3C3B, 0, 0x3C3C, 0x3C3D, 0x3C3E, 0x3C3F, 0x3C40, 0, /* 0x60 */
+ 0x3C41, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x3C42, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x3C43, 0, 0, 0x3C44, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x3C45, 0, 0x3C46, 0x3C47, 0, 0, /* 0xA0 */
+ 0x3C48, 0, 0x3C49, 0, 0x3C4A, 0, 0, 0, /* 0xA0 */
+ 0, 0x3C4B, 0, 0x3C4C, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x3C4D, 0x3C4E, 0x3C4F, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x3C50, 0, /* 0xC0 */
+ 0, 0, 0, 0x3C52, 0x3C51, 0, 0x3C53, 0, /* 0xC0 */
+ 0, 0x3C54, 0x3C55, 0, 0x3C56, 0x3C57, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x3C58, 0, 0x3C59, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x3C5A, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x3C5B /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3C5C, 0, 0, 0, 0x3C5D, 0x3C5E, /* 0x00 */
+ 0x3C5F, 0, 0, 0, 0, 0, 0x3C60, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x3C61, 0, 0, 0x3C62, 0x3C63, 0, 0, /* 0x10 */
+ 0, 0x3C64, 0x3C65, 0x3C66, 0x3C67, 0, 0, 0, /* 0x20 */
+ 0x3C68, 0, 0, 0x3C69, 0x3C6A, 0, 0x3C6B, 0, /* 0x20 */
+ 0x3C6C, 0, 0, 0, 0x3C6D, 0, 0x3C6E, 0, /* 0x30 */
+ 0, 0, 0, 0x3C6F, 0, 0x3C70, 0, 0x3C71, /* 0x30 */
+ 0x3C72, 0, 0, 0, 0x3C73, 0x3C74, 0, 0x3C75, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x3C76, 0, 0, /* 0x40 */
+ 0x3C77, 0, 0, 0, 0x3C78, 0, 0, 0, /* 0x50 */
+ 0x3C79, 0, 0, 0x3C7A, 0, 0, 0, 0, /* 0x50 */
+ 0x3C7B, 0, 0, 0x3C7C, 0x3C7D, 0, 0, 0x3C7E, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x3D21, /* 0x60 */
+ 0, 0, 0x3D22, 0, 0x3D23, 0x3D24, 0, 0, /* 0x70 */
+ 0x3D25, 0, 0x3D26, 0, 0, 0x3D27, 0x3D28, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x3D29, 0, 0, 0, 0x3D2A, 0, 0x3D2B, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x3D2C, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x3D2D, 0x3D2E, 0, 0, /* 0x90 */
+ 0, 0, 0x3D2F, 0, 0x3D32, 0, 0, 0x3D30, /* 0xA0 */
+ 0, 0, 0, 0x3D31, 0x3D33, 0, 0, 0x3D34, /* 0xA0 */
+ 0x3D35, 0x3D36, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x3D37, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x3D38, 0, 0, 0x3D39, /* 0xC0 */
+ 0x3D3A, 0x3D3B, 0, 0x3D3C, 0, 0, 0, 0, /* 0xC0 */
+ 0x3D3D, 0x3D3E, 0x3D3F, 0x3D40, 0x3D41, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0x3D42, 0, /* 0xD0 */
+ 0, 0x3D43, 0x3D44, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x3D45, 0x3D46, 0x3D47, 0, 0x3D48, 0x3D49, 0x3D4A, 0x3D4B, /* 0xE0 */
+ 0, 0, 0x3D4C, 0x3D4D, 0, 0, 0x3D4E, 0, /* 0xF0 */
+ 0, 0, 0x3D4F, 0, 0x3D50 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3D51, /* 0x00 */
+ 0, 0, 0x3D52, 0, 0, 0x3D53, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x3D54, 0x3D55, 0, 0, 0x3D56, /* 0x10 */
+ 0x3D57, 0, 0x3D58, 0, 0, 0, 0, 0x3D59, /* 0x10 */
+ 0, 0, 0, 0, 0x3D5A, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x3D5B, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x3D5C, 0, 0x3D5D, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x3D5E, 0, 0, 0, 0, 0, 0, 0x3D5F, /* 0x40 */
+ 0x3D60, 0x3D61, 0, 0, 0x3D62, 0, 0, 0, /* 0x40 */
+ 0, 0x3D63, 0, 0, 0x3D64, 0, 0x3D65, 0x3D66, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x3D67, 0, 0, /* 0x50 */
+ 0, 0x3D68, 0, 0, 0, 0, 0, 0x3D69, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x3D6A, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x3D6B, 0x3D6C, /* 0x70 */
+ 0, 0, 0x3D6D, 0, 0, 0, 0x3D6E, 0, /* 0x80 */
+ 0x3D6F, 0, 0x3D70, 0, 0, 0, 0x3D71, 0, /* 0x80 */
+ 0, 0x3D72, 0, 0x3D73, 0, 0x3D74, 0, 0, /* 0x90 */
+ 0x3D75, 0, 0, 0, 0, 0x3D76, 0x3D77, 0, /* 0x90 */
+ 0, 0, 0x3D78, 0, 0x3D79, 0x3D7A, 0, 0, /* 0xA0 */
+ 0x3D7B, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x3D7C, 0x3D7D, 0, 0, 0, 0, 0, 0x3D7E, /* 0xB0 */
+ 0, 0, 0, 0x3E21, 0, 0, 0x3E22, 0, /* 0xB0 */
+ 0, 0, 0x3E23, 0, 0x3E24, 0, 0, 0, /* 0xC0 */
+ 0x3E25, 0x3E26, 0x3E27, 0x3E28, 0, 0, 0x3E29, 0x3E2A, /* 0xC0 */
+ 0, 0, 0, 0, 0x3E2B, 0x3E2C, 0, 0, /* 0xD0 */
+ 0, 0x3E2D, 0, 0x3E2E, 0, 0x3E2F, 0x3E30, 0, /* 0xD0 */
+ 0, 0, 0x3E31, 0, 0, 0x3E32, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x3E33, 0, 0, 0x3E34, 0, 0, /* 0xF0 */
+ 0x3E35, 0, 0, 0, 0x3E36, 0x3E37 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3E38, 0, 0, 0, 0, 0x3E39, /* 0x00 */
+ 0, 0, 0x3E3A, 0, 0x3E3B, 0, 0, 0, /* 0x00 */
+ 0x3E3C, 0x3E3D, 0x3E3E, 0x3E3F, 0x3E40, 0, 0x3E41, 0x3E42, /* 0x10 */
+ 0, 0x3E43, 0, 0, 0x3E44, 0, 0x3E45, 0, /* 0x10 */
+ 0, 0, 0x3E46, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x3E47, 0x3E48, 0, 0, 0, 0, /* 0x20 */
+ 0x3E49, 0x3E4A, 0, 0, 0, 0x3E4B, 0x3E4C, 0x3E4D, /* 0x30 */
+ 0, 0x3E4E, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x3E4F, 0, 0, 0, 0x3E50, 0x3E51, 0, /* 0x40 */
+ 0, 0x3E52, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x3E53, 0, /* 0x50 */
+ 0x3E54, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x3E55, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x3E56, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x3E57, 0, 0, 0x3E58, 0x3E59, 0, 0, 0x3E5A, /* 0x70 */
+ 0x3E5B, 0x3E5C, 0, 0x3E5D, 0x3E5E, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x3E5F, 0, 0x3E60, 0, 0, /* 0x80 */
+ 0, 0, 0x3E61, 0x3E62, 0, 0, 0, 0x3E63, /* 0x90 */
+ 0x3E64, 0, 0, 0, 0x3E65, 0x3E66, 0, 0x3E67, /* 0x90 */
+ 0x3E68, 0, 0, 0, 0, 0x3E69, 0, 0, /* 0xA0 */
+ 0x3E6A, 0, 0x3E6B, 0, 0, 0x3E6C, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x3E6D, 0x3E6E, 0, 0, 0x3E6F, 0, 0, 0, /* 0xB0 */
+ 0x3E70, 0x3E71, 0x3E72, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x3E73, 0x3E74, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x3E75, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x3E76, 0x3E77, 0x3E78, 0x3E79, /* 0xD0 */
+ 0, 0x3E7A, 0x3E7B, 0, 0, 0x3E7E, 0, 0x3E7C, /* 0xE0 */
+ 0, 0x3E7D, 0, 0, 0x3F21, 0x3F22, 0, 0x3F23 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3F24, 0, 0x3F25, 0x3F26, 0, 0, 0x3F27, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x3F28, 0, 0x3F29, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x3F2A, 0, 0, 0, /* 0x10 */
+ 0x3F2B, 0, 0x3F2C, 0x3F2D, 0, 0, 0, 0x3F2E, /* 0x20 */
+ 0, 0x3F2F, 0, 0x3F30, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x3F31, 0, 0, 0, 0x3F32, 0, 0, /* 0x30 */
+ 0, 0, 0x3F33, 0x3F34, 0x3F35, 0, 0x3F36, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x3F37, 0, 0, 0, /* 0x40 */
+ 0x3F38, 0x3F39, 0x3F3A, 0, 0x3F3B, 0, 0x3F3C, 0, /* 0x50 */
+ 0, 0, 0x3F3D, 0, 0x3F3E, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x3F3F, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x3F40, 0, 0x3F41, /* 0x60 */
+ 0, 0, 0, 0x3F42, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x3F43, 0, 0, 0x3F44, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x3F45, 0x3F46, 0x3F47, /* 0x80 */
+ 0x3F48, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x3F49, 0, /* 0xA0 */
+ 0x3F4A, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x3F4B, 0, 0, 0x3F4C, 0x3F4D, /* 0xB0 */
+ 0, 0, 0x3F4E, 0, 0, 0, 0x3F4F, 0x3F50, /* 0xB0 */
+ 0, 0, 0, 0, 0x3F51, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x3F52, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x3F53, 0x3F54, 0, /* 0xD0 */
+ 0, 0, 0x3F55, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x3F56, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x3F57, 0, 0x3F58, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x3F59, 0x3F5A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3F5B, 0x3F5C, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x3F5D, 0x3F5E, 0, 0x3F5F, 0, 0, /* 0x00 */
+ 0x3F60, 0, 0, 0x3F61, 0, 0, 0x3F62, 0, /* 0x10 */
+ 0x3F63, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x3F64, 0x3F65, 0, 0, 0x3F66, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x3F67, 0x3F68, 0, /* 0x30 */
+ 0, 0x3F69, 0, 0, 0x3F6A, 0, 0, 0, /* 0x30 */
+ 0, 0x3F6B, 0x3F6C, 0x3F6D, 0x3F6E, 0, 0x3F6F, 0, /* 0x40 */
+ 0, 0, 0x3F70, 0x3F71, 0, 0, 0x3F72, 0, /* 0x40 */
+ 0, 0, 0x3F73, 0x3F74, 0x3F75, 0, 0, 0, /* 0x50 */
+ 0x3F76, 0, 0, 0x3F77, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x3F78, 0x3F79, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x3F7A, 0x3F7B, 0, 0, /* 0x60 */
+ 0, 0x3F7C, 0, 0, 0x3F7D, 0x3F7E, 0, 0, /* 0x70 */
+ 0x4021, 0, 0, 0, 0x4022, 0x4023, 0, 0x4024, /* 0x70 */
+ 0, 0, 0x4025, 0, 0x4026, 0, 0, 0x4027, /* 0x80 */
+ 0, 0, 0x4028, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x4029, 0, 0, 0, 0x402A, 0x402B, 0, 0, /* 0x90 */
+ 0, 0x402C, 0x402D, 0, 0, 0, 0x402E, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x402F, 0, 0x4030, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x4031, 0x4032, 0x4033, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x4034, 0, 0, /* 0xB0 */
+ 0, 0x4035, 0, 0, 0, 0x4036, 0, 0, /* 0xC0 */
+ 0x4037, 0, 0, 0, 0, 0, 0x4038, 0, /* 0xC0 */
+ 0, 0x4039, 0, 0x403A, 0x403B, 0x403C, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x403D, 0, 0, 0, /* 0xD0 */
+ 0x403E, 0, 0, 0, 0, 0x403F, 0, 0, /* 0xE0 */
+ 0, 0, 0x4040, 0, 0x4041, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x4042, 0x4043, 0, 0x4044, 0, 0, /* 0xF0 */
+ 0x4045, 0x4046 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0x4047, 0x4048, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x4049, 0, 0x404A, 0, 0x404B, 0, 0, 0, /* 0x10 */
+ 0x404C, 0, 0, 0, 0, 0, 0x404D, 0, /* 0x10 */
+ 0x404E, 0, 0x404F, 0, 0x4050, 0x4051, 0, 0, /* 0x20 */
+ 0, 0x4052, 0x4053, 0, 0, 0, 0, 0x4054, /* 0x20 */
+ 0x4055, 0, 0, 0, 0, 0x4056, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x4057, 0, 0x4058, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x4059, 0, 0, 0, 0x405A, /* 0x40 */
+ 0, 0x405B, 0x405C, 0x405D, 0x405E, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x405F, 0x4060, 0x4061, 0x4062, 0, 0x4063, /* 0x50 */
+ 0x4064, 0x4065, 0, 0x4066, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x4067, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x4068, 0x4069, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x406A, 0, 0x406B, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x406C, 0, 0x406D, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0x406E, /* 0x80 */
+ 0x406F, 0x4070, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x4071, 0x4072, 0, 0x4073, 0, 0x4074, 0, 0x4075, /* 0x90 */
+ 0, 0x4076, 0, 0x4077, 0, 0, 0x4078, 0, /* 0xA0 */
+ 0x4079, 0, 0, 0, 0x407A, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x407B, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x407C, 0x407D, 0x407E, /* 0xB0 */
+ 0, 0, 0, 0, 0x4121, 0, 0, 0, /* 0xC0 */
+ 0, 0x4122, 0x4123, 0x4124, 0x4125, 0, 0x4126, 0, /* 0xC0 */
+ 0x4127, 0x4128, 0, 0, 0, 0x4129, 0, 0x412A, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x412B, 0x412C, 0, 0, /* 0xE0 */
+ 0, 0x412D, 0x412E, 0, 0, 0x412F, 0, 0, /* 0xE0 */
+ 0x4130, 0, 0, 0, 0, 0x4131, 0, 0x4132, /* 0xF0 */
+ 0, 0, 0, 0x4133, 0, 0, 0, 0x4134 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4135, 0, 0, 0x4136, 0, 0, 0, /* 0x00 */
+ 0x4137, 0x4138, 0x4139, 0, 0, 0, 0, 0x413A, /* 0x00 */
+ 0, 0, 0, 0x413B, 0x413C, 0, 0x413D, 0, /* 0x10 */
+ 0, 0x413E, 0, 0x413F, 0, 0, 0x4140, 0x4141, /* 0x10 */
+ 0, 0, 0x4142, 0, 0, 0, 0x4143, 0, /* 0x20 */
+ 0, 0x4144, 0, 0, 0, 0, 0x4145, 0, /* 0x20 */
+ 0, 0x4146, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x4147, 0, 0x4148, 0x4149, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x414A, 0, 0, 0, 0x414B, /* 0x40 */
+ 0, 0x414C, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x414D, 0, 0x414E, 0, 0x414F, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4150, /* 0x50 */
+ 0x4151, 0, 0, 0, 0, 0, 0, 0x4152, /* 0x60 */
+ 0, 0, 0, 0x4153, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x4154, 0, 0, 0x4155, 0, 0, /* 0x70 */
+ 0, 0x4156, 0, 0, 0, 0x4157, 0, 0, /* 0x80 */
+ 0, 0, 0x4158, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x4159, 0, 0, 0x415A, 0, 0, /* 0x90 */
+ 0x415B, 0, 0, 0, 0, 0x415C, 0, 0, /* 0x90 */
+ 0x415D, 0, 0, 0x415E, 0, 0, 0x415F, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x4160, 0, /* 0xA0 */
+ 0, 0, 0x4161, 0x4162, 0x4163, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4164, /* 0xB0 */
+ 0, 0, 0x4165, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x4166, 0x4167, 0, 0, 0, 0, 0x4168, 0, /* 0xC0 */
+ 0x4169, 0, 0, 0, 0x416A, 0, 0x416B, 0, /* 0xD0 */
+ 0x416C, 0, 0, 0, 0, 0, 0, 0x416D, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x416E, 0, 0x416F, 0, 0x4170, 0x4171, 0, 0, /* 0xF0 */
+ 0, 0x4172, 0, 0, 0, 0, 0x4173, 0x4174 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4175, 0, 0, 0, 0x4176, 0, 0, 0, /* 0x00 */
+ 0x4177, 0x4178, 0, 0, 0, 0x4179, 0, 0, /* 0x00 */
+ 0, 0x417A, 0x417B, 0, 0, 0x417C, 0x417D, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x417E, 0x4221, 0, /* 0x10 */
+ 0, 0x4222, 0x4223, 0x4224, 0x4225, 0, 0x4226, 0, /* 0x20 */
+ 0, 0x4227, 0x4228, 0x4229, 0x422A, 0, 0x422B, 0, /* 0x20 */
+ 0x422C, 0x422D, 0, 0x422E, 0, 0, 0, 0x4230, /* 0x30 */
+ 0, 0x422F, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x4231, 0, 0, 0, 0, 0x4232, 0x4233, 0, /* 0x40 */
+ 0, 0, 0x4234, 0, 0x4235, 0, 0x4237, 0, /* 0x40 */
+ 0, 0x4236, 0, 0, 0, 0, 0, 0x4238, /* 0x50 */
+ 0x4239, 0x423A, 0, 0x423B, 0x423C, 0, 0, 0, /* 0x50 */
+ 0x423D, 0x423E, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x4240, 0x4241, 0x4242, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x4244, 0, 0x4245, 0, 0x4247, /* 0x70 */
+ 0x4248, 0x4249, 0, 0x424A, 0x424C, 0, 0x4243, 0x4246, /* 0x70 */
+ 0x424B, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x424D, 0x424E, 0x424F, 0, 0, /* 0x80 */
+ 0x4250, 0, 0x4251, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x4252, 0x4253, 0x4254, 0x4255, 0, 0, 0x4256, /* 0x90 */
+ 0x4257, 0, 0, 0, 0x4258, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x4259, 0, 0, /* 0xA0 */
+ 0, 0x425A, 0x425B, 0, 0, 0x425C, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x425D, 0, 0, 0, 0x425E, /* 0xB0 */
+ 0x425F, 0, 0x4260, 0x4261, 0, 0, 0, 0, /* 0xC0 */
+ 0x4262, 0, 0, 0, 0x4263, 0, 0x4264, 0x4265, /* 0xC0 */
+ 0, 0, 0, 0, 0x4266, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x4267, 0, 0, 0, 0x4268, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x4269, 0, 0, 0x426A, 0x426B, 0, 0x426C, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x426D, 0x423F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x426E, 0, 0x426F, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x4270, 0, /* 0x00 */
+ 0, 0, 0, 0x4271, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x4272, 0, 0, 0x4273, 0, 0, 0, /* 0x10 */
+ 0x4274, 0, 0x4275, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x4276, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x4277, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x4278, 0, 0x4279, /* 0x40 */
+ 0x427A, 0, 0, 0, 0x427B, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x427C, 0x427D, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x427E, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x4321, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x4322, 0, 0x4323, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x4324, 0, 0x4325, 0, /* 0x70 */
+ 0, 0, 0, 0x4326, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x4327, 0, 0, 0x4328, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x4329, 0x432A, /* 0x80 */
+ 0, 0x432B, 0, 0x432C, 0, 0, 0x432D, 0, /* 0x90 */
+ 0x432E, 0x432F, 0, 0x4330, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x4331, 0x4332, 0x4333, 0, 0, 0x4334, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x4335, 0x4336, 0x4337, 0, 0, /* 0xB0 */
+ 0x4339, 0, 0x433A, 0x433B, 0, 0x433C, 0, 0, /* 0xC0 */
+ 0x433D, 0x433E, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x433F, 0, 0, 0, 0, 0x4340, /* 0xD0 */
+ 0, 0x4341, 0, 0, 0x4342, 0, 0, 0, /* 0xD0 */
+ 0, 0x4343, 0, 0, 0, 0, 0x4344, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x4345, 0, 0x4346, 0, 0, 0, 0x4347, 0x4348, /* 0xF0 */
+ 0, 0x4338 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x434A, 0, 0, 0, /* 0x10 */
+ 0, 0x434B, 0, 0, 0, 0x434C, 0, 0x434D, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0x434F, /* 0x20 */
+ 0x434E, 0, 0, 0, 0x4350, 0x4351, 0, 0x4352, /* 0x20 */
+ 0x4353, 0x4354, 0, 0x4355, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x4356, 0, 0, 0, 0x4357, /* 0x30 */
+ 0, 0, 0, 0, 0x4358, 0x4359, 0, 0, /* 0x40 */
+ 0, 0, 0x435A, 0, 0x435B, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x4349, 0, 0, 0x435C, 0, 0x435D, /* 0x50 */
+ 0x435E, 0, 0, 0x435F, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x4360, 0, 0, 0x4361, 0x4362, /* 0x60 */
+ 0x4363, 0x4364, 0x4365, 0, 0, 0x4366, 0, 0, /* 0x70 */
+ 0, 0x4367, 0x4368, 0x4369, 0x436A, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x436B, 0, 0x436C, 0, 0x436D, 0, /* 0x80 */
+ 0x436E, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x436F, 0, /* 0x90 */
+ 0x4370, 0, 0x4371, 0, 0x4372, 0, 0, 0, /* 0x90 */
+ 0, 0x4373, 0, 0x4374, 0, 0x4375, 0, 0, /* 0xA0 */
+ 0, 0x4376, 0x4377, 0, 0, 0, 0x4378, 0, /* 0xA0 */
+ 0, 0, 0x4379, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x437A, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x437B, 0, 0, /* 0xC0 */
+ 0x437C, 0, 0, 0, 0x437D, 0, 0, 0x437E, /* 0xC0 */
+ 0x4421, 0x4422, 0, 0x4423, 0, 0, 0x4424, 0, /* 0xD0 */
+ 0, 0x4425, 0, 0, 0x4426, 0x4427, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x4428, 0, 0, /* 0xE0 */
+ 0x4429, 0, 0x442A, 0x442B, 0x442C, 0x442D, 0, 0, /* 0xE0 */
+ 0x442E, 0x442F, 0, 0, 0, 0x4430, 0x4431, 0, /* 0xF0 */
+ 0, 0, 0, 0x4432, 0x4433, 0x4434 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4435, 0, /* 0x00 */
+ 0, 0x4436, 0x4437, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x4438, 0x4439, 0, 0x443A, 0, 0, 0x443B, 0x443C, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x443D, 0, 0x443E, 0, 0x443F, 0, 0, /* 0x30 */
+ 0x4440, 0, 0, 0x4441, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x4442, 0, 0, 0x4443, 0, 0, /* 0x40 */
+ 0, 0x4444, 0, 0, 0, 0, 0x4445, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4446, /* 0x50 */
+ 0, 0, 0, 0x4447, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x4448, 0x4449, 0x444A, 0x444B, 0, /* 0x60 */
+ 0x444C, 0x444D, 0, 0, 0x444E, 0, 0, 0, /* 0x60 */
+ 0x444F, 0x4450, 0x4451, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x4452, 0x4453, 0, 0, 0, 0x4454, /* 0x70 */
+ 0x4455, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x4456, 0, 0, /* 0x80 */
+ 0, 0, 0x4457, 0, 0, 0, 0x4458, 0, /* 0x90 */
+ 0x4459, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x445A, 0, 0, 0, 0x445B, 0x445C, 0, /* 0xA0 */
+ 0x445D, 0, 0, 0x445E, 0, 0x445F, 0, 0x4460, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4461, /* 0xB0 */
+ 0x4462, 0, 0x4463, 0, 0x4464, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x4465, 0, 0, /* 0xC0 */
+ 0x4466, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x4467, 0, 0, 0, 0, 0x4468, 0x4469, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x446A, 0, 0, 0x446B, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x446C, 0x446D, /* 0xE0 */
+ 0, 0x446E, 0, 0x446F, 0, 0x4470, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0x4471 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4472, 0x4473, 0, 0x4474, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4475, /* 0x00 */
+ 0, 0x4476, 0, 0, 0, 0x4477, 0, 0, /* 0x10 */
+ 0, 0, 0x4478, 0, 0, 0x4479, 0, 0, /* 0x10 */
+ 0x447A, 0, 0, 0, 0x447B, 0, 0, 0, /* 0x20 */
+ 0x447C, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x447D, 0, 0x447E, 0, 0x4521, 0, 0, 0x4522, /* 0x30 */
+ 0, 0, 0, 0x4523, 0, 0, 0x4524, 0x4525, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x4526, 0x4527, 0, /* 0x40 */
+ 0, 0x4528, 0x4529, 0, 0, 0, 0x452A, 0, /* 0x40 */
+ 0x452B, 0x452C, 0x452D, 0, 0, 0x452E, 0x452F, 0, /* 0x50 */
+ 0, 0, 0, 0x4530, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x4531, 0, 0, 0x4532, /* 0x60 */
+ 0, 0, 0x4533, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x4534, 0, 0x4535, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x4536, 0, /* 0x70 */
+ 0, 0x4537, 0, 0x4538, 0, 0, 0x4539, 0x453A, /* 0x80 */
+ 0, 0x453B, 0, 0x453C, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x453D, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x453E, 0, 0x453F, 0x4540, 0x4541, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x4542, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x4543, 0, 0, 0, 0x4544, /* 0xA0 */
+ 0x4545, 0x4546, 0, 0, 0x4547, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x4548, 0x4549, 0x454A, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x454B, 0, /* 0xC0 */
+ 0x454D, 0x454C, 0, 0, 0x454E, 0, 0, 0, /* 0xC0 */
+ 0x454F, 0, 0, 0, 0x4550, 0x4551, 0x4552, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x4553, 0x4554, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x4555, 0, 0, 0x4556, /* 0xE0 */
+ 0, 0, 0, 0, 0x4557, 0, 0, 0, /* 0xE0 */
+ 0x4558, 0x4559, 0x455A, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x455B, 0x455C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x455D, 0x455E, 0, 0, 0x455F, 0x4560, /* 0x00 */
+ 0, 0x4561, 0, 0, 0, 0, 0, 0x4562, /* 0x00 */
+ 0x4563, 0x4564, 0, 0, 0, 0, 0, 0x4565, /* 0x10 */
+ 0, 0, 0, 0x4566, 0, 0, 0x4567, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x4568, 0, 0, 0, /* 0x20 */
+ 0x4569, 0, 0, 0x456A, 0x456B, 0, 0, 0x456C, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x456D, 0x456E, 0, /* 0x30 */
+ 0, 0, 0, 0x456F, 0, 0, 0, 0x4570, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x4571, 0, /* 0x40 */
+ 0, 0, 0x4572, 0, 0, 0x4573, 0, 0, /* 0x40 */
+ 0, 0, 0x4574, 0, 0, 0, 0x4575, 0, /* 0x50 */
+ 0x4576, 0, 0, 0, 0, 0x4577, 0, 0, /* 0x50 */
+ 0x4578, 0, 0, 0, 0, 0, 0, 0x4579, /* 0x60 */
+ 0, 0, 0, 0x457A, 0, 0, 0x457B, 0, /* 0x60 */
+ 0x457C, 0, 0, 0, 0, 0x457D, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x457E, 0x4621, 0, /* 0x70 */
+ 0, 0, 0x4622, 0, 0, 0x4623, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4624, /* 0x90 */
+ 0, 0, 0, 0x4625, 0, 0, 0, 0x4626, /* 0x90 */
+ 0x4627, 0, 0x4628, 0x4629, 0, 0, 0, 0, /* 0xA0 */
+ 0x462A, 0x462B, 0, 0, 0x462C, 0x462D, 0x462E, 0, /* 0xA0 */
+ 0x462F, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x4630, 0x4631, 0, 0, 0, 0x4632, 0x4633, 0, /* 0xB0 */
+ 0, 0, 0, 0x4634, 0x4635, 0, 0, 0, /* 0xC0 */
+ 0, 0x4636, 0, 0, 0x4637, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x4638, 0, /* 0xD0 */
+ 0, 0, 0x4639, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x463A, 0, 0x463B, 0, 0, 0x463C, 0x463D, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x463E, 0, /* 0xE0 */
+ 0, 0x463F, 0, 0, 0, 0, 0, 0x4640, /* 0xF0 */
+ 0, 0x4641, 0, 0, 0, 0, 0, 0x4642 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4643, 0, 0x4644, 0x4645, 0, 0, /* 0x00 */
+ 0, 0x4646, 0, 0, 0, 0x4647, 0x4648, 0, /* 0x00 */
+ 0x4649, 0, 0x464A, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x464B, 0, 0, 0, 0, 0, 0x464C, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x464D, 0x464E, /* 0x20 */
+ 0x464F, 0, 0, 0, 0x4650, 0, 0x4651, 0, /* 0x20 */
+ 0, 0, 0, 0x4652, 0, 0x4653, 0x4654, 0, /* 0x30 */
+ 0, 0, 0x4655, 0x4656, 0, 0, 0, 0x4657, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x4658, 0x4659, 0, 0x465A, 0, 0x465B, /* 0x40 */
+ 0, 0, 0x465C, 0, 0x465D, 0, 0, 0, /* 0x50 */
+ 0, 0x465E, 0, 0x465F, 0x4660, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4736, /* 0x60 */
+ 0, 0, 0, 0x4661, 0, 0x4662, 0, 0x4663, /* 0x60 */
+ 0, 0, 0, 0, 0x4664, 0, 0x4665, 0, /* 0x70 */
+ 0x4666, 0x4667, 0, 0x4668, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x4669, 0x466A, 0x466B, /* 0x80 */
+ 0, 0x466C, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x466D, 0x466E, 0, 0x466F, /* 0x90 */
+ 0x4670, 0, 0, 0, 0x4671, 0, 0, 0x4672, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x4673, 0, 0x4674, 0, 0x4675, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x4676, 0, 0, 0, 0x4677, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x4678, 0, 0x4679, /* 0xC0 */
+ 0x467A, 0x467B, 0x467C, 0, 0x467D, 0, 0x467E, 0, /* 0xD0 */
+ 0, 0, 0x4721, 0, 0x4722, 0, 0, 0, /* 0xD0 */
+ 0x4723, 0, 0, 0, 0, 0, 0, 0x4724, /* 0xE0 */
+ 0, 0x4725, 0, 0x4726, 0x4727, 0, 0x4728, 0, /* 0xE0 */
+ 0, 0, 0x4729, 0, 0x472A /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x472B, 0, 0, 0x472C, /* 0x00 */
+ 0, 0, 0x472D, 0, 0, 0, 0x472E, 0x472F, /* 0x00 */
+ 0, 0x4730, 0, 0x4731, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x4732, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x4733, 0x4734, /* 0x20 */
+ 0x4735, 0, 0, 0, 0, 0, 0x4737, 0x4738, /* 0x20 */
+ 0, 0x4739, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x473A, 0, 0, 0x473B, 0, 0, 0x473C, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x473D, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x473E, 0x473F, /* 0x50 */
+ 0, 0x4740, 0, 0, 0, 0x4741, 0, 0x4742, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4743, /* 0x60 */
+ 0x4744, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x4745, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x4746, 0, 0, 0, 0, 0x4747, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x4748, 0x4749, 0, 0x474A, 0, 0x474B, 0x474C, /* 0x90 */
+ 0x474D, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x474E, 0, 0x474F, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x4750, 0, 0, 0x4751, /* 0xB0 */
+ 0, 0x4752, 0, 0, 0, 0x4753, 0, 0x4754, /* 0xB0 */
+ 0, 0, 0, 0, 0x4755, 0, 0, 0, /* 0xC0 */
+ 0x4756, 0, 0x4757, 0, 0, 0, 0x4758, 0x4759, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0x475A, 0, /* 0xD0 */
+ 0, 0, 0, 0x475B, 0, 0x475C, 0, 0x475D, /* 0xD0 */
+ 0x475E, 0, 0x475F, 0, 0, 0x4760, 0, 0, /* 0xE0 */
+ 0, 0x4761, 0, 0, 0, 0, 0, 0x4762, /* 0xE0 */
+ 0x4763, 0, 0, 0, 0x4764, 0, 0x4765, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x4766 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4767, 0, 0, 0, 0x4768, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x4769, 0, /* 0x10 */
+ 0, 0, 0x476A, 0, 0, 0, 0, 0x476B, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x476C, 0, 0, 0, 0x476D, 0, /* 0x30 */
+ 0, 0x476E, 0, 0x476F, 0x4770, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x4771, 0x4772, 0, 0, /* 0x40 */
+ 0x4773, 0x4774, 0, 0x4775, 0, 0, 0, 0x4776, /* 0x40 */
+ 0, 0x4777, 0x4778, 0x4779, 0x477A, 0, 0, 0x477B, /* 0x50 */
+ 0, 0, 0, 0, 0x477C, 0x477D, 0x477E, 0, /* 0x50 */
+ 0, 0, 0x4821, 0x4822, 0, 0, 0, 0, /* 0x60 */
+ 0x4823, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x4824, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x4825, 0, 0x4826, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x4827, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x4828, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x4829, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x482A, 0, 0, 0, 0, 0, 0, 0x482B, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x482C, 0x482D, 0, /* 0xA0 */
+ 0, 0x482E, 0, 0x482F, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x4830, 0, 0, 0, 0x4831, /* 0xB0 */
+ 0x4832, 0x4833, 0, 0x4834, 0, 0, 0, 0x4835, /* 0xC0 */
+ 0x4836, 0, 0x4837, 0, 0, 0x4838, 0x4839, 0x483A, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x483B, 0, 0x483C, 0x483D, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x483E, 0, 0x483F, 0, 0x4840 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4841, 0, 0, 0, /* 0x00 */
+ 0x4842, 0, 0x4843, 0, 0x4844, 0x4845, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x4846, 0, /* 0x10 */
+ 0x4847, 0, 0x4848, 0x4849, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x484A, 0, /* 0x20 */
+ 0, 0x484B, 0x484C, 0, 0, 0x4853, 0, 0x484D, /* 0x20 */
+ 0x484E, 0, 0, 0x484F, 0, 0, 0x4850, 0, /* 0x30 */
+ 0, 0, 0, 0x4851, 0x4852, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4854, /* 0x40 */
+ 0, 0x4855, 0x4856, 0x4857, 0, 0, 0, 0x4858, /* 0x50 */
+ 0, 0x4859, 0x485A, 0, 0, 0x485B, 0x485C, 0, /* 0x50 */
+ 0, 0x485D, 0x485E, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x485F, 0, 0, 0, 0x4860, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x4861, 0x4862, 0, /* 0x70 */
+ 0, 0, 0, 0x4863, 0, 0, 0, 0x4864, /* 0x80 */
+ 0x4865, 0, 0, 0x4866, 0x4867, 0x4868, 0, 0, /* 0x80 */
+ 0x4869, 0, 0x486A, 0x486B, 0x486C, 0, 0x486D, 0, /* 0x90 */
+ 0, 0, 0x486E, 0, 0, 0, 0, 0x486F, /* 0x90 */
+ 0x4870, 0, 0, 0, 0, 0x4871, 0x4872, 0x4873, /* 0xA0 */
+ 0x4874, 0, 0, 0, 0, 0, 0x4875, 0x4876, /* 0xA0 */
+ 0x4877, 0, 0, 0, 0, 0x4878, 0x4879, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x487A, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x487B, 0, 0x487C, /* 0xC0 */
+ 0x487D, 0, 0x487E, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x4921, 0, 0, 0, 0x4922, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x4923, 0x4924, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x4925, 0, 0, 0, 0, 0x4926, 0, 0, /* 0xF0 */
+ 0, 0x4927, 0, 0, 0x4928, 0x4929 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x492A, 0, 0, 0, 0, 0x492B, 0x492C, 0x492D, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x492E, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x492F, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x4930, 0, 0, 0x4931, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4932, /* 0x20 */
+ 0, 0, 0, 0, 0x4933, 0, 0, 0x4934, /* 0x30 */
+ 0, 0x4935, 0, 0, 0x4936, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x4937, 0x4938, 0, 0, 0, /* 0x40 */
+ 0x4939, 0x493A, 0x493B, 0x493C, 0, 0, 0x4941, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x493D, 0x493E, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x493F, 0x4940, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x4942, 0x4943, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x4944, 0, 0x4945, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x4946, 0x4947, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x4948, 0, /* 0x70 */
+ 0, 0x4949, 0, 0, 0, 0x494A, 0x494B, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x494C, 0x494D, 0x494E, 0x494F, /* 0x90 */
+ 0x4950, 0, 0, 0x4951, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x4952, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x4953, 0, 0, 0, 0, /* 0xA0 */
+ 0x4954, 0x4955, 0, 0, 0x4956, 0, 0, 0x4957, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x4958, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x4959, 0, 0x495A, 0x495B, 0x495C, 0x495D, 0, /* 0xD0 */
+ 0x495E, 0, 0, 0, 0x495F, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x4960, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x4961 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4962, 0x4963, 0x4964, 0x4965, 0x4966, /* 0x00 */
+ 0, 0, 0, 0x4967, 0x4968, 0, 0, 0x4969, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x496A, 0, /* 0x10 */
+ 0x496B, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x496C, 0, 0x496D, 0, 0x496E, /* 0x20 */
+ 0x496F, 0x4970, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x4971, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x4972, 0, 0, 0, 0x4973, 0x4974, 0x4975, /* 0x40 */
+ 0, 0, 0x4976, 0x4977, 0, 0, 0, 0, /* 0x40 */
+ 0x4978, 0, 0x4979, 0, 0, 0, 0, 0x497A, /* 0x50 */
+ 0, 0, 0x497B, 0, 0x497C, 0, 0x497D, 0, /* 0x50 */
+ 0x497E, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x4A21, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x4A22, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x4A23, 0, 0, 0, 0, 0x4A24, 0, 0x4A25, /* 0x80 */
+ 0, 0, 0, 0, 0x4A26, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x4A27, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x4A28, 0x4A29, 0, 0, 0, 0, /* 0x90 */
+ 0x4A2A, 0, 0x4A2B, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4A2C, /* 0xA0 */
+ 0x4A2D, 0, 0x4A2E, 0x4A2F, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x4A30, 0, 0, 0, 0, 0x4A31, /* 0xB0 */
+ 0x4A32, 0x4A33, 0, 0, 0x4A34, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x4A35, 0x4A36, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x4A37, 0, 0, 0x4A38, 0, /* 0xD0 */
+ 0, 0x4A39, 0x4A3A, 0, 0x4A3B, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x4A3C, 0, 0, 0, 0, 0, 0x4A3D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4A3E, 0, 0, 0, 0, 0, 0, 0x4A3F, /* 0x00 */
+ 0x4A40, 0x4A41, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x4A42, 0, 0, 0, 0x4A43, /* 0x10 */
+ 0, 0, 0x4A44, 0, 0, 0x4A45, 0, 0x4A46, /* 0x10 */
+ 0, 0, 0, 0, 0x4A47, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x4A48, 0, 0, 0, 0x4A49, /* 0x20 */
+ 0, 0, 0, 0, 0x4A4A, 0, 0, 0, /* 0x30 */
+ 0x4A4B, 0x4A4C, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x4A4D, 0x4A4E, 0x4A4F, 0, 0x4A50, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x4A51, 0x4A52, /* 0x40 */
+ 0x4A53, 0, 0, 0x4A54, 0, 0x4A55, 0x4A56, 0, /* 0x50 */
+ 0, 0, 0x4A57, 0, 0x4A58, 0, 0x4A59, 0, /* 0x50 */
+ 0x4A5A, 0, 0, 0x4A5B, 0, 0, 0, 0, /* 0x60 */
+ 0x4A5C, 0, 0, 0x4A5D, 0, 0, 0x4A5E, 0x4A5F, /* 0x60 */
+ 0, 0x4A60, 0, 0, 0, 0, 0, 0x4A61, /* 0x70 */
+ 0x4A62, 0, 0, 0x4A63, 0x4A64, 0, 0, 0x4A65, /* 0x70 */
+ 0, 0, 0, 0, 0x4A66, 0, 0, 0, /* 0x80 */
+ 0, 0x4A67, 0, 0, 0, 0x4A68, 0x4A69, 0, /* 0x80 */
+ 0, 0, 0, 0x4A6A, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x4A6B, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x4A6C, 0, 0, 0, 0, 0x4A6D, 0x4A6E, 0, /* 0xA0 */
+ 0, 0x4A6F, 0, 0, 0x4A70, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x4A71, 0, /* 0xB0 */
+ 0, 0x4A72, 0, 0, 0, 0, 0, 0x4A73, /* 0xC0 */
+ 0, 0x4A74, 0, 0, 0x4A75, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x4A76, 0x4A77, 0, /* 0xD0 */
+ 0x4A78, 0, 0, 0, 0, 0, 0, 0x4A79, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x4A7A, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x4A7B, 0x4A7C, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x4A7D, 0x4A7E, 0, 0, 0x4B21 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4B22, 0, 0x4B23, 0x4B24, 0, 0x4B25, /* 0x00 */
+ 0, 0, 0, 0x4B26, 0, 0x4B27, 0, 0, /* 0x00 */
+ 0, 0, 0x4B28, 0x4B29, 0, 0, 0, 0, /* 0x10 */
+ 0x4B2A, 0x4B2B, 0, 0, 0, 0, 0x4B2C, 0, /* 0x10 */
+ 0, 0, 0x4B2D, 0, 0x4B2E, 0, 0, 0x4B2F, /* 0x20 */
+ 0x4B30, 0, 0, 0, 0x4B31, 0, 0, 0, /* 0x20 */
+ 0, 0x4B32, 0x4B33, 0, 0, 0x4B34, 0, 0, /* 0x30 */
+ 0, 0, 0x4B35, 0x4B36, 0, 0x4B37, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x4B38, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x4B39, 0, 0, /* 0x40 */
+ 0x4B3A, 0, 0x4B3B, 0, 0, 0, 0x4B3C, 0, /* 0x50 */
+ 0x4B3D, 0, 0, 0, 0, 0x4B3E, 0x4B3F, 0x4B40, /* 0x50 */
+ 0x4B41, 0, 0, 0, 0, 0, 0x4B42, 0x4B43, /* 0x60 */
+ 0, 0x4B44, 0, 0x4B45, 0x4B46, 0, 0x4B47, 0x4B48, /* 0x60 */
+ 0, 0x4B49, 0, 0, 0, 0, 0, 0x4B4A, /* 0x70 */
+ 0, 0x4B4B, 0, 0, 0x4B4C, 0, 0, 0, /* 0x70 */
+ 0x4B4D, 0x4B4E, 0, 0x4B4F, 0, 0x4B50, 0x4B51, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x4B52, 0, /* 0x80 */
+ 0x4B53, 0, 0, 0x4B54, 0, 0x4B55, 0, 0x4B56, /* 0x90 */
+ 0x4B57, 0, 0, 0, 0x4B58, 0, 0x4B59, 0x4B5A, /* 0x90 */
+ 0x4B5B, 0, 0x4B5C, 0, 0, 0x4B5D, 0x4B5E, 0, /* 0xA0 */
+ 0, 0, 0x4B5F, 0x4B60, 0, 0x4B61, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x4B62, 0, 0x4B63, /* 0xB0 */
+ 0, 0x4B64, 0, 0, 0x4B65, 0x4B66, 0, 0x4B67, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x4B68, 0x4B69, 0, /* 0xC0 */
+ 0, 0x4B6A, 0, 0x4B6B, 0x4B6C, 0, 0, 0x4B6D, /* 0xC0 */
+ 0, 0, 0x4B6E, 0x4B6F, 0, 0, 0x4B70, 0, /* 0xD0 */
+ 0, 0x4B71, 0, 0, 0, 0x4B72, 0, 0, /* 0xD0 */
+ 0, 0x4B73, 0, 0x4B74, 0, 0, 0x4B75, 0x4B76, /* 0xE0 */
+ 0, 0x4B77, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x4B78, 0x4B79, 0, 0x4B7A, /* 0xF0 */
+ 0, 0x4B7B, 0x4B7C, 0x4B7D, 0, 0x4B7E, 0, 0x4C21 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4C22, 0x4C23, 0, 0, 0x4C24, 0, 0, 0x4C25, /* 0x00 */
+ 0, 0, 0x4C26, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x4C27, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x4C28, 0x4C29, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x4C2A, 0, 0x4C2B, 0, /* 0x20 */
+ 0x4C2C, 0x4C2D, 0x4C2E, 0x4C2F, 0x4C30, 0x4C31, 0x4C32, 0x4C33, /* 0x20 */
+ 0x4C34, 0x4C35, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x4C36, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x4C37, 0, 0, 0x4C38, 0x4C39, 0, 0x4C3A, 0x4C3B, /* 0x40 */
+ 0, 0, 0, 0x4C3C, 0, 0x4C3D, 0, 0, /* 0x40 */
+ 0, 0x4C3E, 0x4C3F, 0, 0, 0, 0, 0x4C40, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x4C41, 0, 0, /* 0x50 */
+ 0, 0, 0x4C42, 0, 0, 0, 0x4C43, 0x4C44, /* 0x60 */
+ 0x4C45, 0, 0, 0x4C46, 0, 0x4C47, 0x4C48, 0, /* 0x60 */
+ 0, 0x4C49, 0x4C4A, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x4C4B, 0x4C4C, 0, 0, 0, 0x4C4D, 0x4C4E, 0x4C4F, /* 0x80 */
+ 0, 0x4C50, 0, 0, 0, 0, 0, 0x4C51, /* 0x80 */
+ 0x4C52, 0x4C53, 0x4C54, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x4C55, 0x4C56, 0x4C57, 0, 0x4C58, 0, 0, 0x4C59, /* 0x90 */
+ 0x4C5A, 0x4C5B, 0, 0x4C5C, 0, 0, 0x4C5D, 0, /* 0xA0 */
+ 0x4C5E, 0x4C5F, 0x4C60, 0x4C61, 0, 0, 0x4C62, 0x4C63, /* 0xA0 */
+ 0, 0x4C64, 0x4C65, 0, 0, 0x4C66, 0, 0, /* 0xB0 */
+ 0, 0x4C67, 0, 0x4C68, 0, 0, 0, 0x4C69, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x4C6A, 0x4C6B, 0, 0, 0x4C6C, 0, 0, 0, /* 0xC0 */
+ 0x4C6D, 0, 0, 0x4C6E, 0, 0, 0, 0, /* 0xD0 */
+ 0x4C6F, 0, 0x4C70, 0x4C71, 0, 0, 0x4C72, 0x4C73, /* 0xD0 */
+ 0, 0, 0, 0, 0x4C74, 0, 0, 0, /* 0xE0 */
+ 0x4C75, 0, 0x4C76, 0x4C77, 0, 0, 0, 0x4C78, /* 0xE0 */
+ 0, 0, 0, 0, 0x4C79, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x4C7A, 0x4C7B, 0x4C7C, 0, 0, 0x4C7D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4C7E, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x4D21, 0, 0, 0, 0x4D22, 0x4D23, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x4D24, 0x4D25, 0, 0, 0x4D26, 0, 0, 0x4D27, /* 0x20 */
+ 0, 0x4D28, 0x4D29, 0, 0, 0, 0, 0x4D2A, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x4D2B, 0, /* 0x30 */
+ 0, 0x4D2C, 0, 0, 0, 0x4D2D, 0x4D2E, 0x4D2F, /* 0x30 */
+ 0x4D30, 0, 0, 0x4D31, 0, 0, 0, 0x4D32, /* 0x40 */
+ 0x4D33, 0, 0, 0, 0, 0, 0x4D34, 0, /* 0x40 */
+ 0x4D35, 0, 0x4D36, 0, 0, 0, 0, 0x4D37, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0x4D38, 0x4D39, /* 0x50 */
+ 0, 0x4D3A, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4D3B, /* 0x60 */
+ 0, 0x4D3C, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x4D3D, 0x4D3E, 0x4D3F, 0x4D40, 0x4D41, 0x4D42, 0, /* 0x70 */
+ 0, 0x4D43, 0, 0, 0, 0x4D44, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x4D45, 0, 0x4D46, 0x4D47, 0, 0x4D48, 0, 0, /* 0x90 */
+ 0, 0x4D49, 0, 0, 0x4D4A, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x4D4B, 0, 0x4D4C, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x4D4D, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x4D4E, 0, 0, 0, 0, 0x4D4F, /* 0xB0 */
+ 0x4D50, 0x4D51, 0, 0, 0x4D52, 0, 0x4D53, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x4D54, 0, 0x4D55, 0x4D56, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x4D57, /* 0xD0 */
+ 0, 0, 0, 0, 0x4D58, 0, 0, 0x4D59, /* 0xD0 */
+ 0x4D5A, 0x4D5B, 0, 0, 0x4D5C, 0, 0, 0x4D5D, /* 0xE0 */
+ 0, 0, 0, 0, 0x4D5E, 0, 0x4D5F, 0x4D60, /* 0xE0 */
+ 0, 0x4D61, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x4D62 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4D63, 0, 0x4D64, 0x4D65, 0x4D66, 0, 0, 0x4D67, /* 0x00 */
+ 0x4D68, 0, 0x4D69, 0, 0x4D6A, 0, 0, 0x4D6B, /* 0x00 */
+ 0, 0, 0x4D6C, 0x4D6D, 0, 0x4D6E, 0x4D6F, 0, /* 0x10 */
+ 0, 0x4D70, 0, 0x4D71, 0x4D72, 0x4D73, 0x4D74, 0, /* 0x10 */
+ 0, 0, 0, 0x4D75, 0, 0x4D76, 0x4D77, 0, /* 0x20 */
+ 0, 0x4D78, 0, 0, 0, 0x4D79, 0, 0, /* 0x20 */
+ 0, 0, 0x4D7A, 0x4D7B, 0, 0x4D7C, 0, 0, /* 0x30 */
+ 0x4D7D, 0x4D7E, 0x4E21, 0, 0x4E22, 0, 0, 0, /* 0x30 */
+ 0x4E24, 0x4E25, 0, 0x4E26, 0x4E27, 0x4E28, 0, 0, /* 0x40 */
+ 0, 0x4E29, 0x4E23, 0x4E2A, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x4E2B, 0, 0, /* 0x50 */
+ 0, 0x4E2C, 0, 0, 0, 0, 0, 0x4E2D, /* 0x50 */
+ 0, 0, 0, 0, 0x4E2E, 0x4E2F, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x4E30, 0x4E31, 0x4E32, /* 0x60 */
+ 0, 0x4E33, 0, 0, 0x4E34, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x4E35, 0, 0, 0, 0x4E36, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x4E37, 0x4E38, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x4E39, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x4E3A, 0x4E3B, 0x4E3C, 0, 0x4E3D, /* 0x90 */
+ 0x4E3E, 0, 0x4E3F, 0x4E40, 0x4E41, 0x4E42, 0x4E43, 0x4E44, /* 0xA0 */
+ 0x4E45, 0, 0x4E46, 0, 0, 0x4E47, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x4E48, 0, 0, /* 0xB0 */
+ 0, 0x4E49, 0, 0, 0, 0x4E4A, 0, 0, /* 0xC0 */
+ 0, 0x4E4B, 0, 0x4E4C, 0x4E4D, 0, 0x4E4E, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x4E4F, 0, 0, 0, /* 0xD0 */
+ 0, 0x4E50, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x4E51, 0, 0, 0, 0, 0, 0x4E52, 0, /* 0xE0 */
+ 0x4E53, 0, 0, 0, 0x4E54, 0, 0, 0, /* 0xE0 */
+ 0x4E55, 0x4E56, 0, 0, 0, 0, 0x4E57, 0, /* 0xF0 */
+ 0, 0x4E58, 0, 0, 0x4E59 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E5A, 0, 0, 0, 0, 0, 0x4E5B, 0, /* 0x00 */
+ 0, 0, 0x4E5C, 0, 0, 0, 0x4E5D, 0, /* 0x00 */
+ 0, 0, 0x4E5E, 0, 0x4E5F, 0x4E60, 0, 0x4E61, /* 0x10 */
+ 0, 0x4E62, 0x4E63, 0, 0x4E64, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x4E65, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x4E66, 0, 0, 0, 0, 0x4E67, 0x4E68, 0x4E69, /* 0x20 */
+ 0, 0, 0, 0, 0x4E6A, 0x4E6B, 0x4E6C, 0, /* 0x30 */
+ 0, 0x4E6D, 0, 0, 0, 0x4E6E, 0x4E6F, 0, /* 0x30 */
+ 0, 0, 0x4E70, 0, 0, 0x4E71, 0x4E72, 0, /* 0x40 */
+ 0, 0, 0x4E73, 0, 0, 0x4E74, 0x4E75, 0x4E76, /* 0x40 */
+ 0, 0, 0x4E77, 0, 0, 0, 0x4E78, 0x4E79, /* 0x50 */
+ 0, 0, 0, 0, 0x4E7A, 0, 0x4E7B, 0x4E7C, /* 0x50 */
+ 0x4E7D, 0, 0x4E7E, 0, 0x4F21, 0, 0, 0x4F22, /* 0x60 */
+ 0, 0, 0x4F23, 0, 0x4F24, 0, 0, 0, /* 0x60 */
+ 0x4F25, 0, 0x4F26, 0x4F27, 0x4F28, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x4F29, 0, 0, 0x4F2A, 0, 0, /* 0x70 */
+ 0x4F2B, 0, 0, 0, 0x4F2C, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x4F2D, 0x4F2E, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0x4F2F, 0x4F30, 0x4F31, 0, /* 0x90 */
+ 0, 0, 0x4F32, 0, 0, 0, 0, 0x4F33, /* 0x90 */
+ 0, 0, 0x4F34, 0, 0, 0, 0, 0x4F35, /* 0xA0 */
+ 0, 0, 0x4F36, 0, 0, 0, 0x4F37, 0x4F38, /* 0xA0 */
+ 0, 0x4F39, 0, 0, 0, 0x4F3A, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x4F3B, 0, /* 0xB0 */
+ 0, 0, 0, 0x4F3C, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x4F3D, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x4F3E, 0x4F3F, 0, 0, 0x4F40, 0, 0, /* 0xD0 */
+ 0, 0x4F41, 0, 0, 0, 0, 0x4F42, 0x4F43, /* 0xD0 */
+ 0x4F44, 0, 0, 0, 0x4F45, 0, 0x4F46, 0, /* 0xE0 */
+ 0, 0, 0x4F47, 0, 0x4F48, 0, 0, 0, /* 0xE0 */
+ 0x4F49, 0x4F4A, 0, 0, 0x4F4B, 0, 0, 0, /* 0xF0 */
+ 0x4F4C, 0, 0, 0x4F4D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F4E, 0x4F4F, 0, /* 0x00 */
+ 0, 0x4F50, 0, 0, 0, 0x4F51, 0x4F52, 0, /* 0x00 */
+ 0, 0x4F53, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x4F54, 0, 0, /* 0x10 */
+ 0, 0x4F55, 0x4F56, 0x4F57, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x4F58, 0x4F59, 0, /* 0x20 */
+ 0x4F5A, 0, 0, 0, 0, 0x4F5B, 0, 0x4F5C, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x4F5D, 0x4F5E, 0, 0, 0x4F5F, /* 0x40 */
+ 0x4F60, 0, 0, 0, 0x4F61, 0, 0x4F62, 0, /* 0x40 */
+ 0, 0, 0x4F63, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x4F64, 0, 0x4F65, 0, /* 0x50 */
+ 0x4F66, 0x4F67, 0, 0x4F68, 0x4F69, 0, 0, 0, /* 0x60 */
+ 0x4F6A, 0, 0x4F6B, 0, 0, 0, 0x4F6C, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x4F6D, 0, 0, 0, 0x4F6E, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x4F6F, 0, 0, 0, 0, 0x4F70, /* 0x80 */
+ 0, 0, 0, 0, 0x4F71, 0, 0, 0, /* 0x90 */
+ 0x4F72, 0, 0, 0, 0, 0x4F74, 0x4F75, 0x4F76, /* 0x90 */
+ 0, 0x4F73, 0, 0, 0x4F77, 0, 0, 0, /* 0xA0 */
+ 0x4F78, 0, 0, 0, 0x4F79, 0x4F7A, 0, 0, /* 0xA0 */
+ 0x4F7B, 0x4F7C, 0x4F7D, 0x4F7E, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x5021, 0, 0x5022, 0, 0x5023, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5024, /* 0xC0 */
+ 0x5025, 0x5026, 0, 0, 0x5027, 0, 0x5028, 0, /* 0xC0 */
+ 0, 0, 0x5029, 0x502A, 0, 0x502B, 0x502C, 0, /* 0xD0 */
+ 0, 0, 0, 0x502E, 0, 0, 0, 0x502F, /* 0xD0 */
+ 0x5030, 0x5031, 0, 0, 0x502D, 0, 0x5032, 0, /* 0xE0 */
+ 0, 0, 0x5033, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x5034, 0x5035, 0, 0, 0x5037, 0x5038, /* 0xF0 */
+ 0, 0, 0x5039, 0x503A, 0, 0, 0, 0x503B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5036, 0, 0, 0, 0, 0, 0x503C, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x503D, 0, 0, 0, /* 0x00 */
+ 0x503E, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x503F, 0, 0x5040, 0, 0x5041, 0x5042, /* 0x10 */
+ 0x5043, 0, 0, 0, 0, 0x5044, 0, 0x5045, /* 0x20 */
+ 0, 0x5046, 0, 0, 0, 0x5047, 0, 0, /* 0x20 */
+ 0, 0x5048, 0, 0, 0x5049, 0x504A, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x504B, 0, 0x504C, 0, 0x504D, /* 0x30 */
+ 0, 0, 0, 0, 0x504E, 0x504F, 0x5050, 0, /* 0x40 */
+ 0, 0, 0x5051, 0x5052, 0, 0, 0, 0x5053, /* 0x40 */
+ 0, 0x5054, 0, 0, 0x5055, 0, 0, 0, /* 0x50 */
+ 0x5056, 0, 0, 0x5057, 0x5058, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5059, /* 0x60 */
+ 0, 0x505A, 0, 0x505B, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0x505C, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x505D, 0, 0x505E, 0x505F, 0, 0x5060, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x5061, 0x5062, 0, 0, 0, /* 0x80 */
+ 0, 0x5063, 0, 0x5064, 0x5065, 0x5066, 0x5067, 0, /* 0x90 */
+ 0x5068, 0, 0, 0x5069, 0x506A, 0, 0, 0, /* 0x90 */
+ 0, 0x506B, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x506C, 0x506D, 0, 0x506E, 0, 0, 0, 0x506F, /* 0xA0 */
+ 0, 0x5070, 0, 0, 0x5071, 0, 0, 0, /* 0xB0 */
+ 0x5072, 0, 0, 0x5073, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x5074, 0, 0x5075, 0, 0, 0x5076, /* 0xC0 */
+ 0x5077, 0, 0x5078, 0, 0, 0, 0, 0x5079, /* 0xC0 */
+ 0, 0, 0, 0, 0x507A, 0, 0x507B, 0, /* 0xD0 */
+ 0, 0, 0x507C, 0, 0, 0x507D, 0x507E, 0, /* 0xD0 */
+ 0x5121, 0, 0x5122, 0, 0, 0x5123, 0, 0, /* 0xE0 */
+ 0, 0, 0x5124, 0x5125, 0, 0x5126, 0, 0, /* 0xE0 */
+ 0, 0x5127, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0x5128, 0, 0, 0, 0x5129 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x512A, 0x512B, 0, 0, 0, 0x512C, /* 0x00 */
+ 0, 0x512D, 0x512E, 0, 0x512F, 0, 0, 0, /* 0x00 */
+ 0, 0x5130, 0, 0, 0, 0x5131, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x5132, 0, 0, 0x5133, 0, /* 0x10 */
+ 0, 0x5134, 0, 0, 0, 0, 0, 0x5135, /* 0x20 */
+ 0, 0, 0, 0x5136, 0, 0x5137, 0, 0x5138, /* 0x20 */
+ 0x5139, 0, 0, 0, 0x513A, 0x513B, 0, 0, /* 0x30 */
+ 0x513C, 0x513D, 0x513E, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x513F, 0x5140, 0, 0x5141, /* 0x40 */
+ 0x5142, 0, 0, 0, 0x5143, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x5144, 0x5145, 0, /* 0x50 */
+ 0, 0x5146, 0, 0, 0x5147, 0x5148, 0, 0x5149, /* 0x50 */
+ 0x514A, 0, 0, 0, 0, 0x514B, 0, 0x514C, /* 0x60 */
+ 0, 0, 0x514D, 0, 0, 0x514E, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x514F, 0, 0, /* 0x70 */
+ 0x5150, 0, 0, 0, 0, 0, 0x5151, 0, /* 0x70 */
+ 0x5152, 0, 0x5153, 0, 0, 0x5154, 0x5155, 0, /* 0x80 */
+ 0, 0, 0x5156, 0x5157, 0, 0, 0, 0, /* 0x80 */
+ 0x5158, 0x5159, 0, 0, 0x515A, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x515B, 0, /* 0x90 */
+ 0x515C, 0, 0, 0x515D, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x515E, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x515F, 0, 0x5160, 0, 0, /* 0xB0 */
+ 0, 0x5161, 0, 0x5162, 0x5163, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x5164, 0, /* 0xC0 */
+ 0, 0x5165, 0, 0, 0x5166, 0, 0x5167, 0, /* 0xC0 */
+ 0, 0x5168, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x5169, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x516A, 0x516B, 0, 0x516C, 0x516D, 0, 0, 0, /* 0xE0 */
+ 0, 0x516E, 0, 0, 0x516F, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0x5170, 0, 0x5171, 0x5172 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5173, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x5174, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5175, /* 0x10 */
+ 0, 0, 0, 0x5176, 0, 0, 0, 0x5177, /* 0x20 */
+ 0, 0x5178, 0x5179, 0x517A, 0, 0x517B, 0x517C, 0x517D, /* 0x20 */
+ 0x517E, 0x5221, 0, 0, 0x5222, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x5223, 0, 0x5224, /* 0x30 */
+ 0x5225, 0x5226, 0, 0, 0, 0, 0, 0x5227, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x5228, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x5229, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x522A, 0, 0, 0, 0x522B, 0, 0x522C, 0, /* 0x60 */
+ 0, 0x522D, 0x522E, 0, 0, 0x522F, 0, 0x5230, /* 0x60 */
+ 0, 0, 0x5231, 0x5232, 0, 0, 0, 0x5233, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x5234, 0, 0, 0, /* 0x80 */
+ 0, 0x5235, 0, 0, 0, 0, 0x5236, 0, /* 0x80 */
+ 0x5237, 0x5238, 0, 0, 0, 0, 0x5239, 0, /* 0x90 */
+ 0, 0, 0, 0x523A, 0, 0, 0x523B, 0, /* 0x90 */
+ 0x523C, 0, 0, 0, 0, 0x523D, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x523E, 0, 0, 0x523F, /* 0xA0 */
+ 0x5240, 0, 0x5241, 0, 0, 0x5242, 0x5243, 0, /* 0xB0 */
+ 0, 0, 0x5244, 0x5245, 0x5246, 0x5247, 0, 0, /* 0xB0 */
+ 0, 0, 0x5248, 0, 0, 0x5249, 0, 0, /* 0xC0 */
+ 0x524A, 0, 0x524B, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x524C, 0, 0x524D, 0x524E, /* 0xD0 */
+ 0, 0x524F, 0x5250, 0x5251, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x5252, 0, 0x5253, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x5254, 0, 0x5255, 0x5256, 0, 0, /* 0xF0 */
+ 0x5257, 0x5258, 0x5259, 0, 0x525A, 0, 0x525B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x525C, 0x525D, 0x525E, 0x525F, 0, 0x5260, 0, /* 0x00 */
+ 0, 0x5261, 0, 0x5262, 0x5263, 0, 0x5264, 0x5265, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0x5266, 0, 0x5267, 0, 0, 0, 0, /* 0x10 */
+ 0x5268, 0, 0, 0, 0, 0x5269, 0x526A, 0, /* 0x20 */
+ 0x526B, 0, 0, 0, 0x526C, 0, 0, 0, /* 0x20 */
+ 0, 0x526D, 0, 0x526E, 0x526F, 0, 0x5270, 0, /* 0x30 */
+ 0, 0x5271, 0x5272, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x5273, 0, /* 0x40 */
+ 0, 0, 0x5274, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x5276, 0x5277, 0x5278, 0, 0x5275, 0, 0, /* 0x50 */
+ 0, 0x5279, 0x527A, 0x527B, 0x527C, 0x527D, 0x527E, 0, /* 0x50 */
+ 0, 0x5321, 0, 0x5322, 0, 0, 0, 0x5323, /* 0x60 */
+ 0, 0x5324, 0, 0, 0, 0x5325, 0x5326, 0, /* 0x60 */
+ 0x5327, 0, 0x5328, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x5329, 0, 0, 0x532A, 0x532B, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x532C, 0x532D, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0x532E, /* 0x80 */
+ 0, 0, 0, 0, 0x532F, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x5330, 0, /* 0x90 */
+ 0x5331, 0, 0, 0, 0, 0, 0x5332, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x5333, 0, 0, 0, 0, 0, 0x5334, 0x5335, /* 0xB0 */
+ 0, 0, 0x5336, 0x5337, 0x5338, 0, 0, 0x5339, /* 0xB0 */
+ 0, 0, 0, 0, 0x533A, 0, 0, 0x533B, /* 0xC0 */
+ 0x533C, 0x533D, 0, 0, 0, 0x533E, 0, 0x533F, /* 0xC0 */
+ 0, 0, 0, 0x5340, 0x5341, 0x5342, 0, 0x5343, /* 0xD0 */
+ 0, 0x5344, 0x5345, 0, 0, 0x5346, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0x5347, 0, /* 0xE0 */
+ 0, 0x5348, 0, 0x5349, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x534A /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x534B, 0, 0, 0, 0x534C, /* 0x00 */
+ 0x534D, 0x534E, 0, 0, 0, 0, 0, 0x534F, /* 0x00 */
+ 0, 0x5350, 0x5351, 0x5352, 0, 0, 0x5353, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x5354, 0x5355, 0, /* 0x10 */
+ 0, 0, 0, 0x5356, 0, 0, 0x5357, 0, /* 0x20 */
+ 0, 0, 0x5358, 0, 0, 0x5359, 0, 0, /* 0x20 */
+ 0, 0x535A, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x535B, 0x535C, 0x535D, 0, /* 0x30 */
+ 0x535E, 0x535F, 0, 0, 0, 0, 0, 0x5360, /* 0x40 */
+ 0x5361, 0, 0, 0, 0, 0x5362, 0, 0, /* 0x40 */
+ 0, 0x5363, 0, 0x5364, 0, 0, 0, 0x5365, /* 0x50 */
+ 0, 0x5366, 0x5367, 0, 0x5368, 0x5369, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x536A, 0, 0x536B, /* 0x60 */
+ 0, 0, 0x536C, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x536D, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x536E, 0, 0x536F, 0x5370, 0, 0, 0, 0x5371, /* 0x70 */
+ 0, 0x5372, 0x5373, 0x5374, 0, 0x5375, 0x5376, 0, /* 0x80 */
+ 0x5377, 0, 0, 0x5378, 0x5379, 0x537A, 0, 0, /* 0x80 */
+ 0, 0x537B, 0, 0, 0, 0, 0x537C, 0x537D, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x537E, 0x5421, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x5422, 0x5423, /* 0xA0 */
+ 0, 0, 0x5424, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x5425, 0, 0, 0x5426, 0x5427, /* 0xB0 */
+ 0, 0x5428, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x5429, 0x542A, 0x542B, 0x542C, 0x542D, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x542E, 0x542F, 0x5430, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5431, /* 0xD0 */
+ 0, 0x5432, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0x5434, 0, 0, 0x5435, 0x5436, 0, /* 0xE0 */
+ 0, 0, 0x5437, 0x5438, 0, 0x5439, 0, 0, /* 0xE0 */
+ 0, 0x543A, 0, 0, 0, 0x543B, 0x543C, 0, /* 0xF0 */
+ 0, 0x543D, 0x543E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5433, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x543F, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x5440, 0x5441, 0, 0, 0, 0x5442, 0, 0x5443, /* 0x10 */
+ 0, 0, 0, 0, 0x5444, 0x5445, 0, 0, /* 0x10 */
+ 0x5446, 0, 0, 0, 0, 0, 0, 0x5447, /* 0x20 */
+ 0x5448, 0, 0, 0, 0x5449, 0x544A, 0, 0x544B, /* 0x20 */
+ 0, 0, 0, 0x544C, 0, 0, 0x544D, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0x544E, /* 0x30 */
+ 0, 0, 0, 0, 0x544F, 0x5450, 0, 0x5451, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0x5452, 0, /* 0x40 */
+ 0x5453, 0, 0x5454, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x5455, 0, 0, 0, 0, 0, 0, 0x5456, /* 0x50 */
+ 0, 0x5457, 0x5458, 0, 0, 0x5459, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x545A, 0, 0, 0x545B, 0x545C, /* 0x60 */
+ 0, 0, 0, 0x545D, 0, 0, 0, 0, /* 0x70 */
+ 0x545E, 0, 0, 0, 0, 0, 0x545F, 0, /* 0x70 */
+ 0, 0x5460, 0, 0, 0, 0, 0x5461, 0x5462, /* 0x80 */
+ 0, 0, 0x5463, 0, 0, 0x5464, 0, 0, /* 0x80 */
+ 0, 0x5465, 0, 0, 0, 0x5466, 0, 0, /* 0x90 */
+ 0x5467, 0, 0x5468, 0, 0, 0x5469, 0x546A /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x30 */
+ 0x546C, 0x546B, 0x546D, 0x546E, 0x546F, /* 0x30 */
+ 0, 0, 0, 0x5470, 0x5471, 0, 0, 0x5472, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5473, /* 0x40 */
+ 0, 0, 0x5474, 0x5475, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x5476, 0x5477, 0x5478, 0, 0, /* 0x50 */
+ 0, 0x5479, 0, 0x547A, 0x547B, 0x547C, 0x547D, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x547E, 0, 0, /* 0x60 */
+ 0, 0x5521, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x5522, 0x5523, 0x5524, /* 0x70 */
+ 0x5525, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x5526, 0, 0x5527, 0, 0x5528, /* 0x80 */
+ 0x5529, 0x552A, 0, 0, 0, 0, 0x552B, 0x552C, /* 0x90 */
+ 0, 0, 0, 0, 0x552D, 0, 0, 0, /* 0x90 */
+ 0, 0x552E, 0x552F, 0, 0, 0, 0x5530, 0, /* 0xA0 */
+ 0, 0, 0x5531, 0, 0, 0x5532, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x5533, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0x5534, 0, 0, 0x5535, /* 0xB0 */
+ 0x5536, 0, 0, 0x5537, 0, 0, 0, 0, /* 0xC0 */
+ 0x5538, 0, 0, 0, 0, 0, 0x5539, 0x553A, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x553B, 0, 0, 0, 0x553C, /* 0xD0 */
+ 0, 0, 0, 0x553D, 0, 0x553E, 0, 0, /* 0xE0 */
+ 0x553F, 0, 0, 0, 0x5540, 0, 0x5541, 0x5542, /* 0xE0 */
+ 0, 0, 0x5543, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x5544, 0, 0, 0x5545, 0x5546, 0x5547 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5548, /* 0x00 */
+ 0x5549, 0, 0x554A, 0, 0, 0x554B, 0x554C, 0x554D, /* 0x00 */
+ 0, 0x554E, 0, 0x554F, 0x5550, 0, 0x5551, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0x5552, 0x5553, 0x5554, /* 0x10 */
+ 0x5555, 0, 0, 0, 0x5556, 0, 0x5557, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x5558, 0, 0x5559, 0, /* 0x20 */
+ 0x555A, 0, 0, 0, 0x555B, 0x555C, 0, 0x555D, /* 0x30 */
+ 0, 0x555E, 0x555F, 0, 0x5560, 0, 0x5561, 0, /* 0x30 */
+ 0x5562, 0, 0, 0, 0x5563, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x5564, 0, 0, 0, 0x5565, 0, 0x5566, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x5567, 0, 0, /* 0x60 */
+ 0, 0x5568, 0, 0, 0, 0x5569, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x556A, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x556B, 0, 0, 0, 0, 0, 0x556C, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x556D, 0, 0x556E, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x556F, 0x5570, /* 0xA0 */
+ 0, 0, 0, 0x5571, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0x5572, 0x5573, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x5574, 0, 0, 0, 0, 0x5575, 0, 0x5576, /* 0xC0 */
+ 0, 0, 0x5577, 0, 0x5578, 0x5579, 0, 0x557A, /* 0xD0 */
+ 0x557B, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x557C, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0x557D, 0x557E, 0, /* 0xE0 */
+ 0x5621, 0, 0x5622, 0x5623, 0, 0, 0x5624, 0, /* 0xF0 */
+ 0, 0x5625, 0x5626, 0, 0, 0, 0x5627 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5628, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x5629, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0x562A, 0x562B, /* 0x10 */
+ 0x562C, 0, 0, 0, 0x562D, 0, 0x562E, 0, /* 0x10 */
+ 0x562F, 0, 0, 0, 0x5630, 0, 0, 0x5631, /* 0x20 */
+ 0, 0, 0, 0, 0x5632, 0, 0, 0, /* 0x20 */
+ 0x5633, 0, 0, 0, 0, 0x5634, 0, 0, /* 0x30 */
+ 0, 0, 0x5635, 0, 0x5636, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x5637, 0, 0x5638, /* 0x40 */
+ 0, 0, 0x5639, 0, 0x563A, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x563B, 0, 0, 0, 0, 0x563C, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x563D, 0x563E, 0, 0, 0, 0, 0, 0x563F, /* 0x60 */
+ 0x5640, 0x5641, 0, 0, 0, 0x5642, 0, 0x5643, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5644, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x5645, 0, 0, 0x5647, 0x5648, 0x5649, 0, /* 0x80 */
+ 0, 0, 0, 0x564A, 0, 0, 0x564B, 0, /* 0x80 */
+ 0x5646, 0, 0, 0, 0, 0, 0x564C, 0, /* 0x90 */
+ 0x564D, 0, 0, 0x564E, 0, 0, 0x564F, 0, /* 0x90 */
+ 0, 0, 0x5650, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0x5651, 0, /* 0xA0 */
+ 0, 0, 0x5652, 0, 0x5653, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x5654, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0x5656, 0, 0x5657, 0, 0, /* 0xC0 */
+ 0, 0, 0x5658, 0x5655, 0, 0, 0x5659, 0x565A, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x565B, 0, 0x565C, /* 0xD0 */
+ 0, 0, 0, 0x565D, 0, 0x565E, 0x565F, 0, /* 0xD0 */
+ 0, 0x5660, 0, 0, 0x5661, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x5662, 0x5663, 0, 0, 0, /* 0xE0 */
+ 0x5664, 0x5665, 0x5666, 0, 0, 0x5667, 0x5668, 0, /* 0xF0 */
+ 0x5669, 0x566A, 0, 0, 0, 0x566B, 0, 0x566C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x566D, 0, 0, 0x566E, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x566F, /* 0x00 */
+ 0, 0, 0, 0x5670, 0x5671, 0, 0, 0, /* 0x10 */
+ 0, 0x5672, 0x5673, 0, 0, 0x5674, 0, 0, /* 0x10 */
+ 0, 0x5675, 0x5676, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x5677, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0x5678, 0, 0x5679, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x567A, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x567B, 0x567C, 0x567D, 0x567E, 0, /* 0x40 */
+ 0, 0, 0, 0x5721, 0, 0, 0x5722, 0x5723, /* 0x40 */
+ 0, 0x5724, 0, 0, 0, 0, 0x5725, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x5726, 0, 0, 0, /* 0x50 */
+ 0x5727, 0, 0, 0x5728, 0, 0, 0, 0x5729, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x572A, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x572B, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x572C, 0, 0x572D, 0, 0x572E, /* 0x70 */
+ 0x572F, 0x5730, 0, 0x5731, 0x5732, 0, 0, 0x5733, /* 0x80 */
+ 0, 0x5734, 0x5735, 0, 0, 0, 0x5736, 0, /* 0x80 */
+ 0, 0x5737, 0, 0, 0x5738, 0, 0x5739, 0, /* 0x90 */
+ 0x573A, 0, 0x573B, 0x573C, 0, 0, 0, 0, /* 0x90 */
+ 0x573D, 0x573E, 0, 0x573F, 0x5740, 0, 0, 0x5741, /* 0xA0 */
+ 0x5742, 0x5743, 0x5744, 0, 0, 0, 0x5745, 0, /* 0xA0 */
+ 0x5746, 0, 0x5747, 0, 0x5748, 0, 0, 0x5749, /* 0xB0 */
+ 0, 0, 0x574A, 0, 0x574B, 0, 0x574C, 0x574D, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x574E, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x574F, 0, 0, 0, 0, 0x5750, 0, 0, /* 0xD0 */
+ 0, 0, 0x5751, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x5752, 0, 0x5753, 0, 0x5754, 0, 0, 0, /* 0xE0 */
+ 0x5755, 0, 0x5756, 0, 0, 0x5757, 0, 0x5758, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x5759, 0x575A, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0x575B, 0x575C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x575D, 0x575E, 0, 0, 0, 0, 0, 0x575F, /* 0x00 */
+ 0x5760, 0, 0x5761, 0x5762, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x5764, 0, 0x5765, 0x5766, 0x5767, /* 0x10 */
+ 0, 0x5768, 0x5769, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x576A, 0x576B, 0x576C, 0, /* 0x20 */
+ 0x576D, 0, 0, 0x576E, 0, 0, 0, 0x576F, /* 0x30 */
+ 0, 0, 0x5770, 0, 0x5771, 0x5772, 0, 0, /* 0x30 */
+ 0, 0, 0x5773, 0x5774, 0x5775, 0, 0, 0x5776, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x5777, 0x5778, 0, /* 0x40 */
+ 0, 0x5779, 0, 0x583E, 0x5763, 0x577A, 0x577B, 0x577C, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x577D, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0x577E, 0, 0, 0, 0, 0x5821, 0, 0x5822, /* 0x70 */
+ 0x5823, 0, 0x5824, 0, 0x5825, 0, 0x5826, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x5827, 0, 0, /* 0x80 */
+ 0, 0, 0x5828, 0, 0x5829, 0x582A, 0, 0, /* 0x90 */
+ 0x582B, 0x582C, 0, 0x582D, 0x582E, 0x582F, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x5830, 0x5831, /* 0xA0 */
+ 0, 0x5832, 0, 0, 0x5833, 0x584C, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x5834, 0x5835, /* 0xB0 */
+ 0x5836, 0, 0, 0, 0, 0, 0, 0x5837, /* 0xC0 */
+ 0, 0x5838, 0, 0, 0, 0, 0, 0x5839, /* 0xC0 */
+ 0x583A, 0x583B, 0, 0, 0x583C, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x583D, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x583F, 0, 0x5840, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0x5841, 0, /* 0xF0 */
+ 0x5842, 0x5843, 0, 0, 0x5844 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5845, 0, 0, 0, 0, 0x5846, 0, /* 0x00 */
+ 0, 0, 0x5847, 0, 0, 0, 0, 0x5848, /* 0x00 */
+ 0, 0x5849, 0, 0, 0, 0x584A, 0, 0, /* 0x10 */
+ 0, 0x584B, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0x584D, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x584E, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x584F, 0, 0x5850, /* 0x40 */
+ 0x5851, 0, 0x5852, 0, 0, 0x5853, 0, 0x5854, /* 0x40 */
+ 0, 0x5855, 0x5856, 0, 0, 0, 0x5857, 0, /* 0x50 */
+ 0x5858, 0x5859, 0x585A, 0, 0x585B, 0, 0, 0, /* 0x50 */
+ 0x585C, 0, 0, 0, 0x585D, 0x585E, 0, 0x585F, /* 0x60 */
+ 0, 0, 0x5860, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x5861, 0, 0, 0x5862, 0x5863, 0, 0x5864, 0, /* 0x70 */
+ 0x5865, 0, 0, 0, 0x5866, 0x5867, 0, 0, /* 0x70 */
+ 0, 0x5868, 0, 0, 0, 0x5869, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0x586A, 0x586B, 0, 0x586C, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x586D, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x586E, 0, /* 0xA0 */
+ 0x586F, 0x5870, 0x5871, 0, 0, 0, 0, 0x5872, /* 0xA0 */
+ 0, 0x5873, 0, 0, 0x5874, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x5875, 0, 0, 0x5876, 0x5877, 0, /* 0xB0 */
+ 0x5878, 0, 0x5879, 0, 0, 0, 0, 0x587A, /* 0xC0 */
+ 0x587B, 0, 0, 0, 0x587C, 0, 0, 0x587D, /* 0xC0 */
+ 0, 0, 0, 0x587E, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x5921, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5922, /* 0xE0 */
+ 0, 0, 0x5923, 0, 0, 0, 0, 0x5924, /* 0xE0 */
+ 0x5925, 0x5926, 0x5927, 0, 0, 0, 0, 0x5928, /* 0xF0 */
+ 0, 0, 0x592A, 0x592B, 0, 0x592C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x592D, 0x592E, 0, 0, 0, 0x592F, /* 0x00 */
+ 0, 0, 0, 0, 0x5930, 0, 0x5931, 0, /* 0x00 */
+ 0x5932, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x5933, 0, 0x5934, 0, /* 0x10 */
+ 0, 0, 0x5935, 0x5936, 0x5937, 0x5938, 0, 0x5939, /* 0x20 */
+ 0, 0, 0x593A, 0x593B, 0, 0, 0, 0x593C, /* 0x20 */
+ 0, 0, 0x5929, 0x593D, 0x593E, 0, 0x593F, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5940, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x5941, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5942, /* 0x40 */
+ 0x5943, 0x5944, 0x5945, 0x5946, 0, 0, 0x5947, 0, /* 0x50 */
+ 0, 0x5948, 0, 0, 0x5949, 0x594A, 0x594B, 0x594C, /* 0x50 */
+ 0x594D, 0x594E, 0x594F, 0, 0x5950, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x5951, 0, 0, 0, 0x5952, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x5953, 0x5954, 0x5955, 0, 0x5956, 0, 0x5957, /* 0x70 */
+ 0, 0x5958, 0, 0, 0, 0x5959, 0x595A, 0, /* 0x80 */
+ 0, 0x595B, 0, 0x595C, 0x595D, 0, 0, 0x595E, /* 0x80 */
+ 0, 0, 0, 0x595F, 0, 0, 0, 0, /* 0x90 */
+ 0x5960, 0, 0, 0, 0, 0x5961, 0, 0x5962, /* 0x90 */
+ 0x5963, 0, 0x5964, 0, 0, 0x5965, 0, 0x5966, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x5974, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x5967, 0, 0x5968, 0x5969, /* 0xB0 */
+ 0x596A, 0, 0, 0, 0x596B, 0x596C, 0x596D, 0x596E, /* 0xB0 */
+ 0, 0, 0x596F, 0, 0, 0, 0, 0x5970, /* 0xC0 */
+ 0, 0, 0x5971, 0x5972, 0, 0, 0x5973, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x5975, 0, 0x5976, 0, 0, 0, 0, 0x5977, /* 0xD0 */
+ 0x5978, 0, 0, 0, 0, 0, 0x5979, 0, /* 0xE0 */
+ 0x597A, 0, 0, 0, 0, 0x597B, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x597C, 0, 0, 0x597D, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x597E, 0, 0, 0x5A21 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5A22, 0, 0, 0, 0x5A23, 0x5A24, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x5A25, 0x5A26, 0, /* 0x00 */
+ 0x5A27, 0x5A28, 0x5A29, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x5A2A, 0x5A2B, 0, 0x5A2C, 0, 0, 0x5A2D, 0, /* 0x10 */
+ 0, 0x5A2E, 0, 0, 0, 0, 0, 0x5A2F, /* 0x20 */
+ 0, 0x5A30, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x5A31, 0, /* 0x30 */
+ 0x5A32, 0, 0x5A33, 0, 0x5A34, 0x5A35, 0, 0, /* 0x30 */
+ 0x5A36, 0x3866, 0x5A37, 0, 0, 0, 0x5A38, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x5A39, 0x5A3A, 0, 0, 0x5A3B, 0x5A3C, /* 0x50 */
+ 0x5A3D, 0x5A3E, 0, 0, 0, 0x5A3F, 0, 0, /* 0x50 */
+ 0x5A40, 0x5A41, 0x5A42, 0x5A43, 0x5A44, 0, 0, 0, /* 0x60 */
+ 0, 0x5A45, 0, 0, 0x5A46, 0, 0, 0x5A47, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x5A48, 0x5A49, 0x5A4A, /* 0x70 */
+ 0, 0, 0x5A4B, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x5A6D, 0, 0, 0, 0, 0x5A4C, 0, 0, /* 0x80 */
+ 0, 0x5A4D, 0, 0, 0, 0, 0x5A4E, 0, /* 0x90 */
+ 0x5A4F, 0, 0x5A50, 0, 0x5A51, 0, 0, 0, /* 0x90 */
+ 0, 0x5A52, 0, 0, 0, 0, 0x5A53, 0x5A54, /* 0xA0 */
+ 0x5A55, 0, 0, 0, 0, 0x5A56, 0, 0, /* 0xA0 */
+ 0, 0x5A57, 0, 0x5A58, 0x5A59, 0x5A5A, 0, 0x5A5B, /* 0xB0 */
+ 0x5A5C, 0x5A5D, 0, 0, 0, 0, 0, 0x5A5E, /* 0xB0 */
+ 0x5A5F, 0x5A60, 0, 0x5A61, 0, 0x5A62, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x5A63, 0x5A64, 0, 0, 0x5A65, 0, 0x5A66, /* 0xD0 */
+ 0, 0, 0x5A67, 0, 0x5A68, 0, 0, 0, /* 0xD0 */
+ 0x5A69, 0, 0, 0x5A6A, 0, 0x5A6B, 0, 0x5A6C, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x5A6E, 0, 0x5A6F, 0x5A70 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5A71, 0x5A72, 0, 0x5A73, /* 0x00 */
+ 0, 0, 0, 0x5A74, 0, 0, 0x5A75, 0x5A76, /* 0x00 */
+ 0x5A77, 0, 0, 0x5A78, 0x5A79, 0, 0, 0, /* 0x10 */
+ 0, 0x5A7A, 0, 0, 0, 0, 0x5A7B, 0x5A7C, /* 0x10 */
+ 0, 0x5A7D, 0, 0x5A7E, 0, 0, 0, 0, /* 0x20 */
+ 0x5B21, 0, 0, 0, 0, 0, 0x5B22, 0x5B23, /* 0x20 */
+ 0, 0x5B24, 0x5B25, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x5B26, 0x5B27, 0, 0x5B28, 0x5B29, 0x5B2A, 0, /* 0x30 */
+ 0x5B2B, 0, 0, 0x5B2C, 0, 0x5B2D, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x5B2E, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x5B2F, 0, 0, 0, 0, 0x5B30, 0, 0, /* 0x50 */
+ 0, 0x5B31, 0, 0, 0x5B32, 0x5B33, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5B34, /* 0x60 */
+ 0, 0x5B35, 0x5B36, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x5B37, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, /* 0x80 */
+ 0x5B3D, 0x5B3E, 0, 0x5B3F, 0x5B40, 0, 0, 0, /* 0x80 */
+ 0x5B41, 0, 0, 0x5B42, 0, 0x5B43, 0, 0x5B44, /* 0x90 */
+ 0x5B45, 0x5B46, 0, 0, 0, 0, 0x5B47, 0, /* 0x90 */
+ 0x5B48, 0, 0, 0x5B49, 0, 0, 0, 0x5B4A, /* 0xA0 */
+ 0, 0, 0, 0, 0x5B4B, 0x5B4C, 0x5B4D, 0, /* 0xA0 */
+ 0, 0x5B4E, 0, 0, 0, 0x5B4F, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x5B50, 0x5B51, /* 0xB0 */
+ 0, 0x5B52, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0x5B53, 0x5B54, 0x5B55, 0, 0, 0, 0x5B56, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x5B57, 0x5B58, 0, /* 0xD0 */
+ 0, 0x5B59, 0x5B5A, 0, 0x5B5B, 0, 0, 0x5B5C, /* 0xD0 */
+ 0, 0, 0x5B5D, 0x5B5E, 0x5B5F, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x5B60, 0x5B61, 0, 0x5B62, 0, 0, /* 0xE0 */
+ 0, 0x5B63, 0, 0x5B64, 0, 0, 0, 0, /* 0xF0 */
+ 0x5B65, 0, 0x5B66, 0, 0, 0, 0, 0x5B67 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5B68, 0, 0x5B69, 0, 0, 0x5B6A, 0, /* 0x00 */
+ 0, 0x5B6B, 0x5B6C, 0x5B6D, 0, 0, 0, 0, /* 0x00 */
+ 0x5B6E, 0, 0x5B70, 0x5B71, 0x5B72, 0, 0, 0, /* 0x10 */
+ 0x5B73, 0x5B6F, 0x5B74, 0x5B75, 0x5B76, 0, 0x5B77, 0x5B78, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x5B79, 0, 0, 0, 0, 0x5B7A, 0x5B7B, 0, /* 0x20 */
+ 0x5B7C, 0, 0x5B7D, 0, 0, 0x5B7E, 0, 0, /* 0x30 */
+ 0, 0, 0x5C21, 0, 0x5C22, 0, 0, 0, /* 0x30 */
+ 0, 0x5C23, 0, 0x5C24, 0, 0x5C25, 0, 0, /* 0x40 */
+ 0x5C26, 0x5C27, 0x5C28, 0x5C29, 0, 0, 0x5C2A, 0, /* 0x40 */
+ 0, 0x5C2B, 0, 0, 0, 0x5C2C, 0x5C2D, 0, /* 0x50 */
+ 0x5C2E, 0, 0x5C2F, 0, 0x5C30, 0, 0, 0x5C31, /* 0x50 */
+ 0x5C32, 0, 0, 0, 0x5C33, 0, 0, 0, /* 0x60 */
+ 0, 0x5C34, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x5C35, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x5C36, 0, 0x5C37, 0, 0, 0, 0, /* 0x70 */
+ 0x5C38, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x5C39, 0, 0x5C3A, 0x5C3B, 0x5C3C, 0, 0, 0x5C3D, /* 0x90 */
+ 0x5C3E, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x5C3F, 0, 0x5C40, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x5C41, 0, 0, 0x5C42, 0x5C43, 0, /* 0xB0 */
+ 0x5C44, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x5C45, 0x5C46, 0x5C47, 0x5C48, 0x5C49, 0, /* 0xC0 */
+ 0, 0x5C4A, 0x5C4B, 0x5C4C, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0x5C4D, 0, 0, 0x5C4E, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5C4F, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5C50, /* 0xE0 */
+ 0x5C51, 0x5C52, 0, 0, 0, 0x5C53, 0, 0x5C54 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5C55, 0, 0, 0, 0, 0x5C56, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x5C57, 0x5C58, 0x5C59, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x5C5A, 0x5C5B, 0, /* 0x10 */
+ 0x5C5C, 0x5C5D, 0x5C5E, 0, 0x5C5F, 0, 0, 0, /* 0x10 */
+ 0x5C60, 0, 0, 0, 0, 0, 0x5C61, 0x5C62, /* 0x20 */
+ 0x5C63, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x5C64, 0x5C65, 0x5C66, 0, 0, 0x5C67, 0, 0, /* 0x30 */
+ 0, 0x5C68, 0x5C69, 0, 0, 0, 0x5C6A, 0, /* 0x30 */
+ 0x5C6B, 0, 0x5C6C, 0, 0, 0x5C6D, 0x5C6E, 0, /* 0x40 */
+ 0, 0x5C6F, 0, 0, 0, 0, 0, 0x5C70, /* 0x40 */
+ 0, 0, 0x5C71, 0, 0, 0, 0, 0x5C72, /* 0x50 */
+ 0, 0, 0x5C73, 0x5C74, 0x5C75, 0, 0, 0, /* 0x50 */
+ 0, 0x5C76, 0x5C77, 0x5C78, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x5C79, 0, 0, 0x5C7A, 0, /* 0x60 */
+ 0x5C7B, 0, 0, 0x5C7C, 0, 0x5C7D, 0, 0, /* 0x70 */
+ 0, 0, 0x5C7E, 0x5D21, 0x5D22, 0x5D23, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x5D24, 0, 0, 0, 0x5D25, 0, 0, /* 0x80 */
+ 0x5D26, 0, 0, 0, 0x5D27, 0x5D28, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x5D29, 0x5D2A, 0, 0, 0x5D2B, /* 0x90 */
+ 0x5D2C, 0, 0, 0, 0, 0x5D2D, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x5D2E, 0, 0, 0, 0x5D2F, 0x5D30, 0x5D31, 0x5D32, /* 0xB0 */
+ 0, 0, 0, 0, 0x5D33, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x5D34, 0x5D35, 0x5D36, 0x5D37, /* 0xD0 */
+ 0x5D38, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x5D39, 0, 0, /* 0xE0 */
+ 0, 0x5D3A, 0, 0x5D3B, 0, 0x5D3C, 0, 0, /* 0xE0 */
+ 0, 0x5D3D, 0, 0x5D3E, 0, 0, 0x5D3F, 0, /* 0xF0 */
+ 0, 0x5D40, 0, 0, 0, 0x5D41, 0, 0x5D42 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5D43, 0x5D44, 0, 0x5D45, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5D46, /* 0x00 */
+ 0, 0x5D47, 0x5D48, 0, 0x5D49, 0x5D4A, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x5D4B, 0, /* 0x10 */
+ 0x5D4C, 0, 0x5D4D, 0, 0x5D4E, 0, 0x5D4F, 0, /* 0x20 */
+ 0, 0, 0, 0x5D50, 0x5D51, 0, 0, 0x5D52, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x5D53, 0, 0x5D54, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x5D55, 0x5D56, 0, /* 0x30 */
+ 0x5D57, 0, 0, 0x5D58, 0, 0x5D59, 0, 0x5D5A, /* 0x40 */
+ 0, 0x5D5B, 0, 0, 0, 0x5D5C, 0x5D5D, 0, /* 0x40 */
+ 0, 0, 0, 0x5D5E, 0, 0, 0x5D5F, 0x5D60, /* 0x50 */
+ 0x5D61, 0, 0, 0, 0x5D62, 0x5D63, 0, 0, /* 0x50 */
+ 0, 0x5D64, 0, 0, 0, 0x5D65, 0, 0x5D66, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x5D67, 0x5D68, 0x5D69, /* 0x70 */
+ 0, 0x5D6A, 0x5D6B, 0x5D6C, 0, 0, 0x5D6D, 0x5D6E, /* 0x70 */
+ 0x5D6F, 0, 0, 0x5D70, 0, 0, 0x5D71, 0, /* 0x80 */
+ 0, 0, 0, 0x5D72, 0, 0, 0, 0x5D73, /* 0x80 */
+ 0x5D74, 0, 0x5D75, 0, 0, 0, 0x5D76, 0x5D77, /* 0x90 */
+ 0, 0x5D78, 0, 0, 0, 0, 0, 0x5D79, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5D7A, /* 0xA0 */
+ 0, 0x5D7B, 0, 0, 0, 0, 0x5D7C, 0x5D7D, /* 0xA0 */
+ 0, 0, 0, 0x5D7E, 0, 0, 0x5E21, 0x5E22, /* 0xB0 */
+ 0, 0, 0, 0x5E23, 0, 0, 0x5E24, 0, /* 0xB0 */
+ 0, 0, 0, 0x5E25, 0, 0, 0x5E26, 0, /* 0xC0 */
+ 0x5E27, 0x5E28, 0x5E29, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x5E2A, 0, 0x5E2B, 0x5E2C, 0x5E2D, 0, 0x5E2E, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x5E2F, 0, 0x5E30, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0x5E31, 0, 0, 0, /* 0xE0 */
+ 0x5E32, 0, 0, 0, 0x5E33, 0x5E34, 0x5E35, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0x5E36, 0, 0, 0x5E37 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5E38, 0x5E39, 0, /* 0x00 */
+ 0, 0, 0x5E3F, 0x5E3A, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x5E3B, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x5E3C, 0, 0x5E3D, 0x5E3E, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x5E40, 0, 0, /* 0x20 */
+ 0x5E41, 0, 0, 0, 0, 0, 0, 0x5E42, /* 0x30 */
+ 0, 0, 0, 0, 0x5E43, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x5E44, 0x5E45, 0x5E46, 0x5E47, 0x5E48, 0, /* 0x40 */
+ 0x5E49, 0, 0, 0, 0, 0x5E4E, 0, 0, /* 0x40 */
+ 0, 0, 0x5E4A, 0x5E4B, 0x5E4C, 0, 0, 0, /* 0x50 */
+ 0, 0x5E4D, 0, 0, 0, 0, 0x5E4F, 0, /* 0x50 */
+ 0, 0, 0, 0x5E50, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x5E51, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0x5E52, 0, /* 0x70 */
+ 0x5E53, 0x5E54, 0, 0, 0x5E55, 0, 0x5E56, 0, /* 0x70 */
+ 0, 0x5E57, 0, 0, 0x5E58, 0x5E59, 0, 0, /* 0x80 */
+ 0, 0, 0, 0x5E5A, 0, 0x5E5B, 0, 0x5E5C, /* 0x80 */
+ 0, 0, 0, 0, 0x5E5D, 0x5E5E, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x5E5F, 0, 0x5E60, 0x5E61 /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x30 */
+ 0x5E62, 0x5E63, 0, 0, 0, 0x5E64, 0x5E65, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x5E66, 0, 0x5E67, /* 0x40 */
+ 0, 0x5E68, 0, 0x5E69, 0, 0, 0, 0x5E6A, /* 0x40 */
+ 0, 0x5E6B, 0, 0x5E6C, 0x5E6D, 0, 0, 0x5E6E, /* 0x50 */
+ 0x5E6F, 0x5E72, 0, 0x5E70, 0, 0x5E71, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x5E73, 0x5E74, 0, 0x5E75, 0, /* 0x60 */
+ 0x5E76, 0x5E77, 0, 0, 0, 0x5E78, 0, 0, /* 0x60 */
+ 0, 0, 0, 0x5E79, 0, 0x5E7A, 0x5E7B, 0, /* 0x70 */
+ 0, 0, 0, 0x5E7C, 0, 0, 0x5E7D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0x5E7E, 0x5F21, /* 0x80 */
+ 0, 0, 0, 0x5F22, 0, 0, 0, 0, /* 0x80 */
+ 0x5F23, 0, 0x5F24, 0x5F25, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5F26, 0, 0x5F27, 0x5F28, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x5F29, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x5F2A, 0x5F2B, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x5F2C, 0x5F2D, 0, /* 0xC0 */
+ 0, 0x5F2E, 0, 0x5F2F, 0, 0, 0, 0x5F30, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x5F32, 0x5F31, 0, /* 0xD0 */
+ 0, 0x5F33, 0, 0, 0, 0x5F34, 0, 0, /* 0xD0 */
+ 0, 0x5F35, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x5F36, 0, 0, 0, 0x5F37, 0, 0, 0x5F38, /* 0xE0 */
+ 0x5F39, 0, 0x5F3A, 0, 0, 0x5F3B, 0, 0x5F3C, /* 0xF0 */
+ 0x5F3D, 0, 0, 0, 0, 0, 0x5F3E, 0x5F3F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5F40, 0, 0x5F41, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x5F42, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0x5F43, 0, 0, 0, 0, 0x5F44, /* 0x10 */
+ 0, 0, 0, 0x5F45, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x5F46, 0, 0, /* 0x60 */
+ 0, 0x5F47, 0, 0, 0x5F48, 0, 0x5F49, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0x5F4A, /* 0x70 */
+ 0, 0, 0x5F4B, 0, 0x5F4C, 0, 0, 0, /* 0x80 */
+ 0x5F4D, 0, 0, 0, 0, 0x5F4E, 0, 0, /* 0x80 */
+ 0x5F4F, 0x5F50, 0, 0, 0, 0x5F51, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x5F52, 0x5F53, /* 0x90 */
+ 0x5F54, 0, 0, 0, 0, 0, 0x5F55, 0, /* 0xA0 */
+ 0, 0, 0, 0x5F56, 0x5F57, 0, 0, 0x5F58, /* 0xA0 */
+ 0, 0, 0x5F59, 0, 0, 0x5F5A, 0, 0x5F5B, /* 0xB0 */
+ 0, 0x5F5C, 0, 0x5F5D, 0x5F6F, 0, 0, 0, /* 0xB0 */
+ 0x5F5E, 0, 0, 0, 0, 0x5F5F, 0x5F60, 0x5F61, /* 0xC0 */
+ 0x5F62, 0, 0x5F63, 0, 0, 0, 0x5F64, 0, /* 0xC0 */
+ 0, 0x5F65, 0, 0, 0x5F66, 0x5F67, 0, 0x5F68, /* 0xD0 */
+ 0, 0x5F69, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x5F6A, 0x5F6B, 0, 0x5F6C, /* 0xE0 */
+ 0, 0, 0, 0, 0x5F6D, 0, 0, 0, /* 0xE0 */
+ 0x5F6E, 0x5F70, 0x5F71, 0, 0x5F72, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0x5F73 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5F74, 0, 0, 0x5F75, 0x5F76, 0x5F77, 0, /* 0x00 */
+ 0, 0, 0, 0x5F78, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x5F79, 0, 0, 0x5F7A, 0, 0x5F7B, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x5F7C, 0x5F7D, 0x5F7E, 0x6021, 0, 0, 0x6022, 0x6023, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x6024, 0, 0x6025, 0, 0, 0x6026, 0x6027, /* 0x30 */
+ 0x6028, 0x6029, 0, 0, 0, 0x602A, 0, 0, /* 0x30 */
+ 0x602B, 0x602C, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x602D, 0, 0x602E, 0x602F, 0x6030, /* 0x40 */
+ 0, 0, 0, 0, 0x6031, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x6032, 0x6033, 0x6034, 0x6035, 0, /* 0x50 */
+ 0, 0x6036, 0x6037, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x6038, 0, 0, 0x6039, 0x603A, 0, 0x603B, /* 0x60 */
+ 0x603C, 0x603D, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x603E, 0x603F, 0x6040, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x6041, 0x6042, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x6043, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x6044, 0, 0x6045, 0, 0, 0x6046, 0, 0, /* 0x90 */
+ 0, 0, 0x6047, 0x6048, 0, 0x6049, 0x604A, 0, /* 0x90 */
+ 0, 0, 0x604B, 0, 0, 0, 0, 0x604C, /* 0xA0 */
+ 0, 0x604D, 0, 0, 0, 0x604E, 0x604F, 0, /* 0xA0 */
+ 0, 0, 0, 0x6050, 0, 0x6051, 0, 0, /* 0xB0 */
+ 0, 0, 0x6052, 0x6053, 0, 0, 0, 0, /* 0xB0 */
+ 0x6054, 0x6055, 0, 0x6056, 0x6057, 0, 0, 0x6058, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6059, /* 0xC0 */
+ 0, 0x605A, 0, 0, 0x605B, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x605C, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0x605D, 0, 0, 0, 0, 0x6064, 0x605E, 0, /* 0xE0 */
+ 0x605F, 0x6060, 0, 0, 0, 0, 0, 0x6061, /* 0xF0 */
+ 0, 0x6062, 0x6063 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6065, 0, 0x6066, 0, 0, 0, 0, 0x6067, /* 0x00 */
+ 0x6068, 0, 0, 0, 0, 0, 0, 0x6069, /* 0x00 */
+ 0x606A, 0, 0, 0, 0, 0, 0x606B, 0x606C, /* 0x10 */
+ 0x606D, 0, 0, 0, 0, 0, 0x606E, 0, /* 0x10 */
+ 0x606F, 0x6070, 0, 0x6071, 0, 0x6072, 0, 0x6073, /* 0x20 */
+ 0x6074, 0, 0, 0, 0x6075, 0x6076, 0x6077, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x6078, 0x6079, 0x607A, 0x607B, /* 0x30 */
+ 0, 0, 0x607C, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x607D, 0x607E, 0, 0x6121, 0, 0, 0, 0x6122, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6123, /* 0x40 */
+ 0, 0x6124, 0x6125, 0x6126, 0x6127, 0x6128, 0, 0, /* 0x50 */
+ 0x6129, 0, 0, 0, 0, 0x612A, 0x612B, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x612C, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x612D, 0, 0, /* 0x90 */
+ 0x612E, 0x612F, 0, 0, 0x6130, 0x6131, 0x6132, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0x6133, 0x6134, 0, /* 0xB0 */
+ 0x6135, 0, 0, 0, 0, 0, 0x6136, 0, /* 0xB0 */
+ 0x6137, 0x6138, 0, 0, 0, 0, 0x6139, 0, /* 0xC0 */
+ 0, 0, 0x613A, 0x613B, 0, 0x613C, 0, 0, /* 0xC0 */
+ 0x613D, 0, 0x613E, 0x613F, 0, 0x6140, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x6141, 0, 0, 0x6142, 0x6143, 0, 0, 0, /* 0xE0 */
+ 0x6144, 0, 0, 0, 0, 0, 0x6145, 0, /* 0xE0 */
+ 0, 0x6146, 0, 0, 0, 0x6147, 0x6148, 0, /* 0xF0 */
+ 0, 0, 0, 0x6149, 0, 0, 0x614A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x614B, 0, 0x614C, 0, 0, 0, /* 0x00 */
+ 0x614D, 0, 0, 0, 0x614E, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0x614F, 0, 0, 0x6150, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0x6151, 0x6152, 0x6154, 0, 0x6155, 0x6156, 0, 0x6153, /* 0x20 */
+ 0, 0, 0, 0x6157, 0x6158, 0, 0, 0x6159, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0x615A, /* 0x30 */
+ 0, 0, 0, 0x615B, 0x615C, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x615D, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x615E, 0, 0x615F, 0, 0, /* 0x50 */
+ 0, 0, 0x6160, 0, 0, 0, 0x6161, 0x6162, /* 0x60 */
+ 0, 0, 0, 0, 0x6163, 0, 0, 0, /* 0x60 */
+ 0x6164, 0, 0, 0, 0x6165, 0, 0, 0, /* 0x70 */
+ 0, 0x6166, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0x6167, 0, 0, /* 0x80 */
+ 0x6168, 0, 0, 0x6169, 0x616A, 0, 0x616B, 0, /* 0x80 */
+ 0x616C, 0, 0, 0, 0, 0x616D, 0, 0x616E, /* 0x90 */
+ 0x616F, 0x6170, 0, 0x6171, 0, 0, 0, 0, /* 0x90 */
+ 0x6172, 0x6173, 0x6174, 0, 0, 0x6175, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x6176, 0, 0x6177, 0x6178, 0x6179, 0, 0x617A, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0x617B, 0x617D, 0, /* 0xB0 */
+ 0, 0, 0, 0x617E, 0x6221, 0x6222, 0, 0x6223, /* 0xC0 */
+ 0x6224, 0, 0, 0, 0x617C, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x622D, 0, 0, 0x6225, 0, 0x6226, /* 0xD0 */
+ 0x6227, 0x6228, 0, 0, 0x6229, 0x622A, 0, 0x622B, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x622C, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x622F, 0, 0, 0, 0x6230, /* 0xE0 */
+ 0x6231, 0, 0, 0, 0x6232, 0, 0x622E, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0x6233, 0x6234 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6235, 0, 0, 0, 0x6236, 0x6237, 0x6238, 0, /* 0x00 */
+ 0x6239, 0, 0, 0, 0, 0x623A, 0, 0, /* 0x00 */
+ 0x623B, 0, 0, 0, 0x623C, 0, 0x623D, 0x623E, /* 0x10 */
+ 0x623F, 0, 0x6240, 0, 0x6241, 0, 0x6242, 0, /* 0x10 */
+ 0x6243, 0, 0x6245, 0x6246, 0, 0x6244, 0, 0x6247, /* 0x20 */
+ 0, 0x6248, 0, 0, 0, 0, 0x6249, 0x624A, /* 0x20 */
+ 0, 0x624B, 0, 0, 0x624C, 0, 0x624D, 0x624E, /* 0x30 */
+ 0, 0x624F, 0x6250, 0, 0x6251, 0x6252, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x6253, 0, 0, 0, 0x6254, /* 0x40 */
+ 0x6255, 0, 0, 0, 0, 0, 0, 0x6256, /* 0x40 */
+ 0, 0, 0, 0x6257, 0, 0, 0, 0x6258, /* 0x50 */
+ 0, 0x6259, 0x625A, 0x625B, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x625C, 0, 0, 0x625D, 0, 0, 0x625E, /* 0x60 */
+ 0, 0, 0, 0, 0, 0x625F, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x6260, 0, 0, 0, /* 0x70 */
+ 0, 0x6261, 0x6262, 0x6263, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x6264, 0, 0x6265, 0, 0x6266, 0x6267, 0, /* 0x80 */
+ 0, 0, 0x6268, 0, 0, 0, 0x6269, 0, /* 0x80 */
+ 0, 0x626A, 0, 0x626B, 0x626C, 0x626D, 0, 0, /* 0x90 */
+ 0x626E, 0, 0, 0, 0, 0, 0x626F, 0, /* 0x90 */
+ 0, 0x6270, 0, 0, 0, 0, 0x6271, 0, /* 0xA0 */
+ 0x6272, 0, 0, 0, 0x6273, 0x6274, 0x6275, 0, /* 0xA0 */
+ 0x6276, 0x6277, 0x6278, 0x6279, 0, 0, 0x627A, 0, /* 0xB0 */
+ 0, 0, 0, 0x627B, 0x627C, 0x627D, 0, 0x627E, /* 0xB0 */
+ 0, 0, 0x6321, 0x6322, 0, 0x6323, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x6324, 0x6325, 0, 0, 0x6326, /* 0xD0 */
+ 0, 0x6327, 0x6328, 0, 0, 0, 0x6329, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0x632A, 0x632B, 0, 0, /* 0xE0 */
+ 0, 0x632C, 0x632D, 0, 0x632E, 0x632F, 0x6330, 0x6331, /* 0xE0 */
+ 0x6332, 0x6333, 0, 0, 0, 0, 0, 0x6334, /* 0xF0 */
+ 0, 0x6335, 0, 0x6336, 0, 0x6337 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6338, 0x6339, 0, 0, 0x633A, 0x633B, 0x633C, 0x633D, /* 0x00 */
+ 0, 0x633E, 0x633F, 0, 0x6340, 0, 0, 0, /* 0x00 */
+ 0x6341, 0, 0x6342, 0x6343, 0, 0, 0x6344, 0, /* 0x10 */
+ 0x6345, 0, 0, 0, 0x6346, 0x6347, 0, 0, /* 0x10 */
+ 0, 0, 0, 0x6348, 0x6349, 0x634A, 0x634B, 0, /* 0x20 */
+ 0x634C, 0, 0, 0, 0, 0, 0x634D, 0x634E, /* 0x20 */
+ 0x634F, 0, 0, 0x6350, 0, 0x6351, 0x6352, 0, /* 0x30 */
+ 0x6353, 0x6354, 0x6355, 0, 0x6356, 0, 0x6357, 0, /* 0x30 */
+ 0x6358, 0, 0x6359, 0x635A, 0, 0, 0x635B, 0x635C, /* 0x40 */
+ 0, 0, 0x635D, 0, 0, 0x635E, 0x635F, 0x6360, /* 0x40 */
+ 0, 0x6361, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0x6362, 0x6363, 0, 0, 0x6364, 0x6365, 0, 0, /* 0x50 */
+ 0x6366, 0x6367, 0, 0, 0, 0x6368, 0, 0x6369, /* 0x60 */
+ 0x636A, 0x636B, 0, 0, 0, 0, 0x636C, 0x636D, /* 0x60 */
+ 0x636E, 0, 0, 0, 0, 0x636F, 0x6370, 0x6371, /* 0x70 */
+ 0x6372, 0x6373, 0, 0x6374, 0x6375, 0x6376, 0, 0x6377, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x6378, 0x6379, 0x637A, 0, 0, 0x637B, 0x637C, 0, /* 0x80 */
+ 0, 0, 0x637D, 0, 0, 0, 0, 0x637E, /* 0x90 */
+ 0, 0x6421, 0, 0, 0, 0, 0, 0x6422, /* 0x90 */
+ 0x6423, 0, 0, 0, 0x6424, 0x6425, 0, 0x6426, /* 0xA0 */
+ 0x6427, 0, 0, 0x6428, 0, 0, 0, 0x6429, /* 0xA0 */
+ 0, 0, 0x642A, 0, 0, 0, 0x642B, 0, /* 0xB0 */
+ 0x642C, 0, 0x642D, 0x642E, 0x642F, 0x6430, 0, 0x6431, /* 0xB0 */
+ 0x6432, 0x6433, 0x6434, 0x6435, 0, 0x6436, 0x6437, 0x6438, /* 0xC0 */
+ 0x6439, 0, 0, 0x643A, 0x643B, 0x643C, 0x643D, 0, /* 0xC0 */
+ 0x643E, 0, 0, 0x643F, 0, 0x6440, 0, 0x6441, /* 0xD0 */
+ 0x6442, 0x6443, 0, 0, 0x6444, 0x6445, 0, 0x6446, /* 0xD0 */
+ 0x6447, 0x6448, 0, 0x6449, 0, 0x644A, 0, 0x644B, /* 0xE0 */
+ 0x644C, 0, 0, 0, 0x644D, 0, 0x644E, 0, /* 0xE0 */
+ 0x644F, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0x6450, 0, 0x6451, 0, 0, 0, 0x6452 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6453, 0, 0x6454, 0, 0, 0, 0, 0, /* 0x00 */
+ 0x6455, 0, 0, 0, 0, 0x6456, 0, 0, /* 0x00 */
+ 0, 0x6457, 0, 0, 0x6458, 0x6459, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0x645A, 0x645B, 0x645C, 0x645D, /* 0x10 */
+ 0, 0x645E, 0, 0, 0x645F, 0x6460, 0, 0x6461, /* 0x20 */
+ 0, 0x6462, 0x6463, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x6464, 0x6465, 0, 0x6466, 0x6467, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6468, /* 0x40 */
+ 0x6469, 0x646A, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x646B, 0x646C, 0x646D, 0, 0, 0x646E, 0, 0x646F, /* 0x50 */
+ 0x6470, 0, 0x6471, 0, 0, 0, 0x6472, 0, /* 0x50 */
+ 0, 0, 0, 0, 0x6473, 0x6474, 0, 0x6475, /* 0x60 */
+ 0, 0x6476, 0x6477, 0, 0, 0x6478, 0, 0x6479, /* 0x60 */
+ 0x647A, 0x647B, 0, 0x647C, 0x647D, 0, 0x647E, 0, /* 0x70 */
+ 0, 0, 0x6521, 0, 0, 0x6522, 0, 0x6523, /* 0x70 */
+ 0x6524, 0x6525, 0x6526, 0, 0, 0, 0, 0, /* 0x80 */
+ 0x6527, 0, 0x6528, 0x6529, 0, 0x652A, 0, 0x652B, /* 0x80 */
+ 0, 0, 0x652C, 0, 0, 0x652D, 0, 0, /* 0x90 */
+ 0x652E, 0, 0, 0x652F, 0, 0, 0x6530, 0, /* 0x90 */
+ 0, 0x6531, 0, 0x6532, 0x6533, 0, 0x6534, 0, /* 0xA0 */
+ 0x6535, 0x653B, 0, 0x6536, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x6537, 0x6538, 0x6539, 0, /* 0xB0 */
+ 0, 0, 0x653A, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x653C, 0, 0, 0x653D, 0x653E, 0x653F, 0x6540, /* 0xC0 */
+ 0, 0x6541, 0x6542, 0x6543, 0x6544, 0x6545, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x6546, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x6547, 0, 0, 0x6548, 0, 0x6549, 0x654A, /* 0xD0 */
+ 0, 0, 0x654B, 0, 0, 0, 0x654C, 0x654D, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x654F, /* 0xF0 */
+ 0x6550, 0x654E, 0x6551, 0x6552, 0, 0x6553 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6554, 0x6555, 0, 0x6556, 0, 0, 0, /* 0x00 */
+ 0x6557, 0x6558, 0, 0, 0, 0x6559, 0x655A, 0x655B, /* 0x00 */
+ 0, 0, 0, 0, 0, 0x655C, 0x655D, 0x655E, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0x655F, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0x6560, 0x6561, /* 0x20 */
+ 0, 0x6562, 0x6563, 0x6564, 0x6565, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0x6566, 0, 0x6568, 0, 0x6567, /* 0x30 */
+ 0, 0, 0, 0x6569, 0, 0x656A, 0, 0, /* 0x40 */
+ 0x656B, 0, 0x656C, 0, 0x656D, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x656E, 0, 0, /* 0x50 */
+ 0, 0x656F, 0, 0, 0x6570, 0, 0, 0x6571, /* 0x50 */
+ 0, 0x6572, 0, 0x6573, 0, 0, 0, 0, /* 0x60 */
+ 0x6574, 0, 0, 0x6575, 0, 0x6576, 0x6577, 0x6578, /* 0x60 */
+ 0, 0x6579, 0x657A, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x657C, 0x657B /* 0x80 */
+ /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x70 */
+ 0x657D, 0x657E, 0, 0, 0, 0, 0x6621, 0, /* 0x70 */
+ 0, 0, 0, 0, 0x6622, 0, 0, 0, /* 0x80 */
+ 0x6623, 0, 0, 0, 0x6624, 0x6625, 0x6626, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0x6627, 0x6628, 0x6629, /* 0x90 */
+ 0, 0x662A, 0, 0, 0, 0, 0x662B, 0, /* 0xA0 */
+ 0, 0x662C, 0, 0x662D, 0x662E, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x662F, 0, 0x6630, 0, /* 0xB0 */
+ 0, 0, 0x6631, 0, 0, 0x6632, 0, 0x6633, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x6634, 0, /* 0xC0 */
+ 0x6635, 0x6636, 0, 0x6637, 0, 0, 0, 0, /* 0xC0 */
+ 0x6638, 0x6639, 0x663A, 0x663B, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x663C, 0x663D, 0, 0, 0x663E, 0x663F, 0x6640, /* 0xD0 */
+ 0x6641, 0, 0, 0, 0x6642, 0, 0x6643 /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0x6644, 0x6645, 0, /* 0x10 */
+ 0, 0, 0x6646, 0, 0x6647, 0x6648, 0x6649, 0, /* 0x20 */
+ 0, 0, 0, 0, 0x664A, 0, 0, 0, /* 0x20 */
+ 0, 0x664B, 0, 0x664C, 0, 0, 0, 0x664D, /* 0x30 */
+ 0x664E, 0x664F, 0x6650, 0, 0x6651, 0x6652, 0, 0, /* 0x30 */
+ 0, 0x6653, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x6654, 0, 0x6655, 0, 0x6656, 0x6657, /* 0x50 */
+ 0x6658, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x6659, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0x665A, 0, /* 0x60 */
+ 0, 0, 0, 0, 0x665B, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0x665C, 0x665D, 0, 0x665E, 0x665F, /* 0x70 */
+ 0, 0x6660, 0x6661, 0x6662, 0x6663, 0, 0, 0, /* 0x80 */
+ 0, 0x6664, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x6665, 0, 0, 0, 0, 0x6666, 0, /* 0x90 */
+ 0, 0, 0x6667, 0, 0, 0x6668, 0, 0x6669, /* 0x90 */
+ 0, 0, 0, 0, 0x666A, 0x666B, 0x666C, 0, /* 0xA0 */
+ 0, 0x666D, 0, 0, 0, 0, 0x666E, 0x666F, /* 0xA0 */
+ 0, 0, 0, 0x6670, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0x6671, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x6672, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0x6673, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0x6675, 0, 0x6676, 0, 0, 0x6677, 0x6678, 0x6679, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0x667A, 0, 0, 0, 0, 0, 0x667B, /* 0xE0 */
+ 0, 0x667C, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0x667D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x667E, 0x6721, 0, 0x6722, 0, 0, /* 0x00 */
+ 0, 0x6723, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x6724, 0x6725, 0, 0x6726, 0, 0, /* 0x10 */
+ 0, 0x6727, 0x6728, 0x6729, 0, 0, 0, 0, /* 0x20 */
+ 0x672A, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x672B, 0, 0x672C, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x672D, 0, 0x672E, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0x672F, 0, 0, 0, 0x6730, 0x6731, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x6732, 0, 0x6733, /* 0x50 */
+ 0x6734, 0, 0x6735, 0x6736, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0x6737, 0, 0, 0, 0x6738, /* 0x60 */
+ 0, 0, 0x6739, 0, 0, 0, 0x673A, 0, /* 0x60 */
+ 0, 0, 0, 0x673B, 0, 0, 0x673C, 0x673D, /* 0x70 */
+ 0x673E, 0, 0, 0x673F, 0, 0x6740, 0, 0x6741, /* 0x70 */
+ 0x6742, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x6743, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0x6744, 0x6745, 0x6746, /* 0x90 */
+ 0, 0x6747, 0x6748, 0, 0, 0, 0x6749, 0x674A, /* 0x90 */
+ 0, 0, 0x674B, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x674C, 0, 0x674D, 0, /* 0xA0 */
+ 0, 0x674E, 0x674F, 0, 0, 0x6750, 0x6751, 0, /* 0xB0 */
+ 0x6752, 0x6753, 0x6754, 0, 0x6755, 0, 0x6756, 0x6757, /* 0xB0 */
+ 0, 0x6758, 0, 0, 0x6759, 0x675A, 0, 0x675B, /* 0xC0 */
+ 0, 0x675C, 0x675D, 0, 0x675E, 0x675F, 0x6760, 0, /* 0xC0 */
+ 0x6761, 0x6762, 0, 0, 0x6763, 0, 0, 0x6764, /* 0xD0 */
+ 0x6765, 0x6766, 0, 0x676A, 0, 0x6767, 0x6768, 0, /* 0xD0 */
+ 0x6769, 0x676B, 0, 0, 0x676C, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x676D, /* 0xE0 */
+ 0, 0x676E, 0, 0, 0x676F, 0, 0, 0x6770, /* 0xF0 */
+ 0x6771, 0, 0x6772 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6773, /* 0x00 */
+ 0, 0, 0x6774, 0, 0, 0x6776, 0x6777, 0, /* 0x00 */
+ 0, 0, 0, 0, 0x6778, 0, 0x6779, 0, /* 0x10 */
+ 0, 0x6775, 0, 0, 0x677A, 0, 0x677B, 0, /* 0x10 */
+ 0x677C, 0, 0, 0x677D, 0, 0x6828, 0x677E, 0, /* 0x20 */
+ 0, 0, 0, 0x6821, 0, 0, 0x6822, 0x6823, /* 0x20 */
+ 0x6824, 0, 0x6825, 0x6826, 0, 0x6827, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0x6829, 0, /* 0x30 */
+ 0, 0, 0, 0, 0x682A, 0, 0, 0x682B, /* 0x40 */
+ 0, 0, 0x682C, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x682D, 0x682E, 0x682F, 0, 0, 0x6830, 0x6831, /* 0x50 */
+ 0, 0x6832, 0x6833, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0x6834, 0x6835, 0, 0x6836, 0x6837, 0, /* 0x60 */
+ 0, 0, 0x6838, 0, 0x6839, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0x683A, 0, 0x683B, 0x683C, 0, /* 0xA0 */
+ 0x683D, 0, 0, 0, 0x683E, 0, 0, 0x683F, /* 0xB0 */
+ 0x6840, 0, 0x6841, 0x6842, 0, 0, 0, 0x6843, /* 0xB0 */
+ 0, 0, 0x6844, 0, 0, 0x6845, 0, 0, /* 0xC0 */
+ 0x6846, 0, 0, 0, 0x6847, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x6848, 0, 0x6849, 0, 0x684A, 0x684B, 0x684C, /* 0xE0 */
+ 0, 0, 0x684D, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0x684E, 0, 0, 0x684F /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6850, 0, 0, 0, 0, 0x6851, /* 0x00 */
+ 0x6852, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x6853, 0, 0, 0, 0x6854, 0x6855, 0x6856, /* 0x10 */
+ 0, 0, 0x6857, 0x6858, 0x6859, 0, 0, 0x685A, /* 0x10 */
+ 0, 0, 0x685B, 0, 0, 0, 0x685C, 0x685D, /* 0x20 */
+ 0, 0, 0, 0x685E, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x685F, 0x6860, 0x6861, 0x6862, 0x6863, 0, 0, /* 0x30 */
+ 0, 0x6864, 0x6865, 0x6866, 0x6867, 0, 0, 0, /* 0x30 */
+ 0x6868, 0x6869, 0, 0, 0, 0, 0x686A, 0x686B, /* 0x40 */
+ 0x686C, 0, 0, 0, 0, 0x686D, 0x686E, 0, /* 0x40 */
+ 0, 0, 0, 0, 0x686F, 0, 0, 0, /* 0x50 */
+ 0x6870, 0x6871, 0, 0x6872, 0x6873, 0, 0x6874, 0x6875, /* 0x50 */
+ 0x6876, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0x6877, 0, 0x6878, 0, 0x6879, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x687A, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x687B, 0x687C, 0x687D, 0, 0, 0x687E, 0, 0, /* 0xB0 */
+ 0, 0x6921, 0x6922, 0, 0, 0x6923, 0, 0x6924, /* 0xB0 */
+ 0, 0, 0, 0x6925, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x6926, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0x6927, 0x6928, 0, 0, 0, /* 0xD0 */
+ 0, 0x6929, 0x692A, 0, 0x692B, 0, 0x692C, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x692D, /* 0xE0 */
+ 0, 0, 0x692E, 0x692F, 0x6930, 0, 0, 0, /* 0xE0 */
+ 0x6931, 0, 0, 0, 0x6932, 0x6933, 0, 0, /* 0xF0 */
+ 0, 0x6934, 0, 0, 0, 0x6935, 0x6936 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6937, 0x6938, 0x6939, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x693A, 0x693B, 0, 0, 0, /* 0x00 */
+ 0x693C, 0x693D, 0, 0, 0, 0, 0x693E, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0x693F, 0, /* 0x10 */
+ 0x6940, 0, 0x6941, 0x6942, 0x6943, 0, 0, 0x6944, /* 0x20 */
+ 0, 0, 0, 0, 0, 0x6945, 0x6946, 0, /* 0x20 */
+ 0, 0, 0, 0x6947, 0, 0x6948, 0x6949, 0, /* 0x30 */
+ 0x694A, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0x694C, 0, 0, 0x694D, 0, 0, 0x694B, /* 0x40 */
+ 0, 0, 0x694E, 0x694F, 0x6950, 0, 0x6951, 0, /* 0x40 */
+ 0, 0x6952, 0, 0, 0x6953, 0, 0x6954, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0x6955, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x6956, 0, 0x6957, 0, 0x6958, 0x6959, /* 0xA0 */
+ 0, 0, 0x695A, 0, 0x695B, 0x695C, 0x695D, 0, /* 0xB0 */
+ 0, 0x695E, 0, 0x695F, 0, 0, 0x6960, 0x6961, /* 0xB0 */
+ 0, 0x6962, 0, 0x6963, 0, 0, 0x6964, 0, /* 0xC0 */
+ 0x6965, 0, 0, 0, 0, 0, 0x6966, 0, /* 0xC0 */
+ 0x6967, 0, 0x6968, 0, 0, 0x6969, 0x696A, 0x696B, /* 0xD0 */
+ 0, 0, 0, 0x696C, 0x696D, 0, 0, 0, /* 0xD0 */
+ 0x696E, 0, 0, 0, 0x696F, 0x6970, 0, 0x6971, /* 0xE0 */
+ 0, 0x6972, 0, 0, 0x6973, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x6974, 0x6975, 0, 0x6976, 0, 0, /* 0xF0 */
+ 0, 0x6977, 0x6978, 0, 0, 0x6979, 0, 0x697A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x697B, 0x697C, 0x697D, 0x697E, 0x6A21, 0x6A22, 0, 0, /* 0x00 */
+ 0x6A23, 0x6A24, 0, 0x6A25, 0x6A26, 0x6A27, 0x6A28, 0, /* 0x00 */
+ 0x6A29, 0, 0x6A2A, 0, 0, 0, 0x6A2B, 0, /* 0x10 */
+ 0, 0x6A2C, 0, 0x6A2D, 0x6A2E, 0, 0, 0, /* 0x10 */
+ 0x6A2F, 0, 0, 0, 0, 0, 0x6A30, 0, /* 0x20 */
+ 0, 0, 0, 0x6A31, 0, 0x6A32, 0, 0, /* 0x20 */
+ 0, 0, 0, 0x6A33, 0x6A34, 0x6A35, 0, 0x6A36, /* 0x30 */
+ 0, 0x6A37, 0x6A38, 0, 0, 0x6A39, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0x6A3A, 0, 0, 0x6A3B, 0x6A3C, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0x6A3D, 0x6A3E, 0x6A3F, /* 0x50 */
+ 0, 0, 0, 0x6A40, 0, 0, 0x6A41, 0, /* 0x50 */
+ 0, 0x6A42, 0, 0x6A43, 0, 0x6A44, 0x6A45, 0, /* 0x60 */
+ 0x6A46, 0, 0x6A47, 0x6A48, 0x6A49, 0x6A4A, 0x6A4B, 0, /* 0x60 */
+ 0, 0, 0, 0x6A4C, 0, 0x6A4D, 0, 0x6A4E, /* 0x70 */
+ 0x6A4F, 0x6A50, 0, 0, 0, 0, 0, 0x6A51, /* 0x70 */
+ 0x6A52, 0, 0, 0, 0x6A53, 0x6A54, 0x6A55, 0x6A56, /* 0x80 */
+ 0, 0x6A57, 0x6A58, 0x6A59, 0, 0x6A5A, 0, 0x6A5B, /* 0x80 */
+ 0x6A5C, 0, 0, 0, 0x6A5D, 0, 0, 0, /* 0x90 */
+ 0, 0, 0x6A5E, 0, 0, 0x6A5F, 0x6A60, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x6A61, 0x6A62, /* 0xA0 */
+ 0, 0x6A63, 0, 0, 0x6A64, 0, 0, 0, /* 0xA0 */
+ 0x6A65, 0x6A66, 0x6A67, 0, 0, 0, 0, 0x6A68, /* 0xB0 */
+ 0x6A69, 0, 0, 0x6A6A, 0x6A6B, 0, 0x6A6C, 0x6A6D, /* 0xB0 */
+ 0, 0x6A6E, 0, 0, 0, 0, 0, 0x6A6F, /* 0xC0 */
+ 0x6A70, 0, 0, 0, 0, 0, 0x6A71, 0, /* 0xC0 */
+ 0x6A72, 0, 0, 0, 0, 0, 0, 0x6A73, /* 0xD0 */
+ 0x6A74, 0, 0, 0, 0, 0x6A75, 0, 0x6A76, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0x6A77, 0, 0x6A78, /* 0xE0 */
+ 0, 0, 0x6A79, 0x6A7A, 0, 0, 0, 0x6A7B, /* 0xE0 */
+ 0, 0, 0, 0x6A7C, 0, 0, 0, 0x6A7D, /* 0xF0 */
+ 0x6A7E, 0x6B21, 0x6B22, 0, 0, 0x6B23, 0, 0x6B24 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6B25, 0, 0x6B26, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x6B27, 0, 0, 0, 0x6B28, /* 0x00 */
+ 0, 0x6B29, 0, 0, 0, 0, 0x6B2A, 0, /* 0x10 */
+ 0x6B2B, 0x6B2C, 0x6B2D, 0, 0x6B2E, 0, 0x6B2F, 0, /* 0x10 */
+ 0, 0, 0x6B30, 0x6B31, 0, 0, 0x6B32, 0x6B33, /* 0x20 */
+ 0x6B34, 0x6B35, 0x6B36, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0x6B37, 0, 0, 0, 0x6B38, 0x6B39, 0x6B3A, /* 0x30 */
+ 0, 0, 0, 0, 0, 0x6B3B, 0, 0, /* 0x30 */
+ 0, 0x6B3C, 0, 0x6B3D, 0x6B3E, 0x6B3F, 0, 0, /* 0x40 */
+ 0, 0x6B40, 0x6B41, 0, 0, 0, 0x6B42, 0x6B43, /* 0x40 */
+ 0x6B44, 0, 0, 0x6B45, 0x6B46, 0, 0x6B47, 0, /* 0x50 */
+ 0x6B48, 0, 0, 0x6B49, 0x6B50, 0x6B4A, 0x6B4B, 0x6B4C, /* 0x50 */
+ 0, 0, 0, 0x6B4D, 0, 0, 0, 0, /* 0x60 */
+ 0x6B52, 0x6B4E, 0x6B4F, 0x6B51, 0, 0, 0x6B53, 0, /* 0x60 */
+ 0x6B54, 0, 0x6B55, 0, 0, 0x6B56, 0, 0x6B57, /* 0x70 */
+ 0, 0, 0, 0x6B58, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0x6B59, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0x6B5A, 0, 0, 0, 0, 0x6B5B, /* 0xF0 */
+ 0, 0x6B5C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6B5E, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0x6B5D, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x6B5F, 0, 0, 0, 0, 0, 0x6B60, /* 0x10 */
+ 0x6B61, 0, 0, 0, 0x6B62, 0x6B63, 0x6B64, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6B65, /* 0x20 */
+ 0x6B66, 0, 0x6B67, 0x6B68, 0x6B69, 0, 0, 0, /* 0x30 */
+ 0, 0, 0x6B6A, 0, 0x6B6B, 0x6B6D, 0, 0, /* 0x30 */
+ 0, 0, 0x6B6E, 0x6B6F, 0, 0x6B6C, 0, 0x6B70, /* 0x40 */
+ 0, 0, 0x6B71, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x6B72, 0x6B73, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6B74, /* 0x50 */
+ 0, 0, 0x6B76, 0x6B75, 0, 0x6B77, 0, 0, /* 0x60 */
+ 0, 0x6B78, 0x6B79, 0x6B7A, 0, 0, 0, 0, /* 0x60 */
+ 0x6B7B, 0, 0, 0, 0, 0, 0x6B7C, 0x6B7D, /* 0x70 */
+ 0, 0, 0, 0x6B7E, 0x6C21, 0, 0x6C22, 0, /* 0x70 */
+ 0, 0, 0, 0x6C23, 0x6C24, 0, 0x6C25, 0, /* 0x80 */
+ 0, 0, 0x6C26, 0, 0, 0x6C27, 0x6C28, 0, /* 0x80 */
+ 0, 0, 0x6C29, 0x6C2A, 0, 0x6C2B, 0x6C2C, 0x6C2D, /* 0x90 */
+ 0x6C2E, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6C2F, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0x6C30, 0, 0x6C31, 0, 0x6C32, 0, /* 0xA0 */
+ 0, 0x6C33, 0, 0, 0, 0x6C34, 0, 0, /* 0xB0 */
+ 0, 0x6C35, 0, 0, 0x6C36, 0, 0, 0x6C37, /* 0xB0 */
+ 0, 0, 0, 0x6C38, 0, 0, 0, 0x6C39, /* 0xC0 */
+ 0, 0x6C3A, 0x6C3B, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0x6C3C, 0x6C3D, 0x6C3E, 0x6C3F, /* 0xD0 */
+ 0, 0, 0x6C40, 0, 0, 0, 0x6C41, 0x6C42, /* 0xD0 */
+ 0x6C43, 0, 0, 0, 0, 0x6C44, 0, 0x6C45, /* 0xE0 */
+ 0, 0x6C46, 0, 0x6C47, 0, 0, 0x6C48, 0, /* 0xE0 */
+ 0x6C49, 0, 0, 0x6C4A, 0x6C4B, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0x6C4C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6C4E, 0, 0, 0, 0, 0x6C4F, /* 0x00 */
+ 0, 0, 0x6C4D, 0, 0, 0, 0x6C50, 0, /* 0x00 */
+ 0x6C51, 0x6C52, 0x6C53, 0, 0, 0x6C54, 0x6C55, 0, /* 0x10 */
+ 0, 0x6C56, 0, 0, 0x6C57, 0x6C58, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0x6C59, 0x6C5A, 0x6C5B, 0, 0, 0, /* 0x70 */
+ 0x6C5C, 0, 0x6C5D, 0x6C5E, 0x6C5F, 0x6C60, 0, 0x6C61, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x6C62, 0x6C63, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x6C64, 0, /* 0x90 */
+ 0x6C65, 0, 0, 0x6C66, 0, 0, 0x6C67, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x6C68, 0, 0, 0, /* 0xA0 */
+ 0x6C69, 0, 0, 0, 0x6C6A, 0, 0x6C6B, 0x6C6C, /* 0xA0 */
+ 0x6C6D, 0, 0, 0x6C6E, 0x6C6F, 0x6C70, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0x6C71, 0, /* 0xC0 */
+ 0x6C72, 0, 0, 0x6C73, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0x6C74, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6C75, /* 0xD0 */
+ 0, 0, 0, 0, 0x6C76, 0, 0, 0x6C77, /* 0xE0 */
+ 0, 0, 0, 0, 0x6C78, 0x6C79, 0x6C7A, 0, /* 0xE0 */
+ 0x6C7B, 0x6C7C, 0x6C7D, 0, 0, 0x6C7E, 0, 0, /* 0xF0 */
+ 0x6D21, 0, 0, 0, 0, 0, 0, 0x6D22 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JIS0212_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6D23, 0x6D24, 0, 0, 0, 0, /* 0x00 */
+ 0, 0x6D25, 0, 0, 0, 0, 0, 0x6D26, /* 0x00 */
+ 0x6D27, 0x6D28, 0x6D29, 0, 0x6D2A, 0, 0x6D2B, 0x6D2C, /* 0x10 */
+ 0, 0x6D2D, 0x6D2E, 0x6D2F, 0, 0, 0, 0x6D30, /* 0x10 */
+ 0, 0, 0x6D31, 0, 0, 0, 0x6D32, 0, /* 0x20 */
+ 0, 0, 0x6D33, 0x6D34, 0, 0, 0, 0x6D35, /* 0x20 */
+ 0, 0x6D36, 0x6D37, 0, 0x6D38, 0, 0, 0x6D39, /* 0x30 */
+ 0, 0x6D3A, 0x6D3B, 0, 0x6D3C, 0x6D3D, 0, 0x6D3E, /* 0x30 */
+ 0, 0x6D3F, 0, 0x6D40, 0x6D41, 0x6D42, 0x6D43, 0x6D44, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0x6D45, 0, 0x6D46, 0x6D47, 0x6D48, /* 0x50 */
+ 0x6D49, 0, 0x6D4A, 0, 0, 0x6D4B, 0x6D4C, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0x6D4D, 0x6D4E, 0, 0, 0, 0x6D4F, 0x6D50, 0x6D51, /* 0x60 */
+ 0x6D52, 0x6D53, 0, 0x6D54, 0, 0x6D55, 0, 0, /* 0x70 */
+ 0, 0, 0x6D56, 0, 0, 0x6D57, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0x6D58, /* 0x80 */
+ 0x6D59, 0x6D5A, 0x6D5B, 0, 0x6D5C, 0, 0x6D5D, 0x6D5E, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0x6D5F, 0, /* 0x90 */
+ 0, 0x6D60, 0x6D61, 0x6D62, 0, 0x6D63 /* 0xA0 */
+ /* 0xA0 */
+};
+
diff --git a/sal/textenc/tcvtjp6.tab b/sal/textenc/tcvtjp6.tab
new file mode 100644
index 000000000000..54ac2915d1bf
--- /dev/null
+++ b/sal/textenc/tcvtjp6.tab
@@ -0,0 +1,2660 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the information tables for all japanese charsets: */
+/* SJIS, MS932, APPLE_JAPANESE, EUC_JP, JIS-X-201, JIS-X-208, JIS-X-212 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aSJISUniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */ /* is A5 (YEN SIGN), but for compatibiliy with ascii, we use 0x5C (SLASH) like MS CP392 */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */ /* is 0x0203E (SPACING OVERSCORE), but for compatibiliy with ascii, we use 0x7E (TILDE) like MS CP392 */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0x005C, 0, 0, NULL }, /* 0x80 */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_81 }, /* 0x81 */
+ { 0, 0x4F, 0xF1, aImplDBCSToUniTab_SJIS_82 }, /* 0x82 */
+ { 0, 0x40, 0xD6, aImplDBCSToUniTab_SJIS_83 }, /* 0x83 */
+ { 0, 0x40, 0xBF, aImplDBCSToUniTab_SJIS_84 }, /* 0x84 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x85 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x86 */ /* We convert this as double byte */
+ { 0, 0x40, 0x9C, aImplDBCSToUniTab_MS932_87 }, /* 0x87 */ /* We use the MS table for better MS compatibility */
+ { 0, 0x9F, 0xFC, aImplDBCSToUniTab_SJIS_88 }, /* 0x88 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_89 }, /* 0x89 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8A }, /* 0x8A */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8B }, /* 0x8B */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8C }, /* 0x8C */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8D }, /* 0x8D */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8E }, /* 0x8E */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8F }, /* 0x8F */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_90 }, /* 0x90 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_91 }, /* 0x91 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_92 }, /* 0x92 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_93 }, /* 0x93 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_94 }, /* 0x94 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_95 }, /* 0x95 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_96 }, /* 0x96 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_97 }, /* 0x97 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_98 }, /* 0x98 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_99 }, /* 0x99 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9A }, /* 0x9A */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9B }, /* 0x9B */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9C }, /* 0x9C */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9D }, /* 0x9D */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9E }, /* 0x9E */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9F }, /* 0x9F */
+ { 0x00A0, 0, 0, NULL }, /* 0xA0 */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+ { 0xFF61, 0, 0, NULL }, /* 0xA1 */
+ { 0xFF62, 0, 0, NULL }, /* 0xA2 */
+ { 0xFF63, 0, 0, NULL }, /* 0xA3 */
+ { 0xFF64, 0, 0, NULL }, /* 0xA4 */
+ { 0xFF65, 0, 0, NULL }, /* 0xA5 */
+ { 0xFF66, 0, 0, NULL }, /* 0xA6 */
+ { 0xFF67, 0, 0, NULL }, /* 0xA7 */
+ { 0xFF68, 0, 0, NULL }, /* 0xA8 */
+ { 0xFF69, 0, 0, NULL }, /* 0xA9 */
+ { 0xFF6A, 0, 0, NULL }, /* 0xAA */
+ { 0xFF6B, 0, 0, NULL }, /* 0xAB */
+ { 0xFF6C, 0, 0, NULL }, /* 0xAC */
+ { 0xFF6D, 0, 0, NULL }, /* 0xAD */
+ { 0xFF6E, 0, 0, NULL }, /* 0xAE */
+ { 0xFF6F, 0, 0, NULL }, /* 0xAF */
+ { 0xFF70, 0, 0, NULL }, /* 0xB0 */
+ { 0xFF71, 0, 0, NULL }, /* 0xB1 */
+ { 0xFF72, 0, 0, NULL }, /* 0xB2 */
+ { 0xFF73, 0, 0, NULL }, /* 0xB3 */
+ { 0xFF74, 0, 0, NULL }, /* 0xB4 */
+ { 0xFF75, 0, 0, NULL }, /* 0xB5 */
+ { 0xFF76, 0, 0, NULL }, /* 0xB6 */
+ { 0xFF77, 0, 0, NULL }, /* 0xB7 */
+ { 0xFF78, 0, 0, NULL }, /* 0xB8 */
+ { 0xFF79, 0, 0, NULL }, /* 0xB9 */
+ { 0xFF7A, 0, 0, NULL }, /* 0xBA */
+ { 0xFF7B, 0, 0, NULL }, /* 0xBB */
+ { 0xFF7C, 0, 0, NULL }, /* 0xBC */
+ { 0xFF7D, 0, 0, NULL }, /* 0xBD */
+ { 0xFF7E, 0, 0, NULL }, /* 0xBE */
+ { 0xFF7F, 0, 0, NULL }, /* 0xBF */
+ { 0xFF80, 0, 0, NULL }, /* 0xC0 */
+ { 0xFF81, 0, 0, NULL }, /* 0xC1 */
+ { 0xFF82, 0, 0, NULL }, /* 0xC2 */
+ { 0xFF83, 0, 0, NULL }, /* 0xC3 */
+ { 0xFF84, 0, 0, NULL }, /* 0xC4 */
+ { 0xFF85, 0, 0, NULL }, /* 0xC5 */
+ { 0xFF86, 0, 0, NULL }, /* 0xC6 */
+ { 0xFF87, 0, 0, NULL }, /* 0xC7 */
+ { 0xFF88, 0, 0, NULL }, /* 0xC8 */
+ { 0xFF89, 0, 0, NULL }, /* 0xC9 */
+ { 0xFF8A, 0, 0, NULL }, /* 0xCA */
+ { 0xFF8B, 0, 0, NULL }, /* 0xCB */
+ { 0xFF8C, 0, 0, NULL }, /* 0xCC */
+ { 0xFF8D, 0, 0, NULL }, /* 0xCD */
+ { 0xFF8E, 0, 0, NULL }, /* 0xCE */
+ { 0xFF8F, 0, 0, NULL }, /* 0xCF */
+ { 0xFF90, 0, 0, NULL }, /* 0xD0 */
+ { 0xFF91, 0, 0, NULL }, /* 0xD1 */
+ { 0xFF92, 0, 0, NULL }, /* 0xD2 */
+ { 0xFF93, 0, 0, NULL }, /* 0xD3 */
+ { 0xFF94, 0, 0, NULL }, /* 0xD4 */
+ { 0xFF95, 0, 0, NULL }, /* 0xD5 */
+ { 0xFF96, 0, 0, NULL }, /* 0xD6 */
+ { 0xFF97, 0, 0, NULL }, /* 0xD7 */
+ { 0xFF98, 0, 0, NULL }, /* 0xD8 */
+ { 0xFF99, 0, 0, NULL }, /* 0xD9 */
+ { 0xFF9A, 0, 0, NULL }, /* 0xDA */
+ { 0xFF9B, 0, 0, NULL }, /* 0xDB */
+ { 0xFF9C, 0, 0, NULL }, /* 0xDC */
+ { 0xFF9D, 0, 0, NULL }, /* 0xDD */
+ { 0xFF9E, 0, 0, NULL }, /* 0xDE */
+ { 0xFF9F, 0, 0, NULL }, /* 0xDF */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E0 }, /* 0xE0 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E1 }, /* 0xE1 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E2 }, /* 0xE2 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E3 }, /* 0xE3 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E4 }, /* 0xE4 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E5 }, /* 0xE5 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E6 }, /* 0xE6 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E7 }, /* 0xE7 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E8 }, /* 0xE8 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E9 }, /* 0xE9 */
+ { 0, 0x40, 0xA4, aImplDBCSToUniTab_SJIS_EA }, /* 0xEA */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEC */ /* We convert this as double byte */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_ED }, /* 0xED */ /* We use the MS table for better MS compatibility */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_EE }, /* 0xEE */ /* We use the MS table for better MS compatibility */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEF */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF0 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF1 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF2 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF3 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF4 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF5 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF6 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF7 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF8 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF9 */ /* EUDC Range */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_FA }, /* 0xFA */ /* We use the MS table for better MS compatibility */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_FB }, /* 0xFB */ /* We use the MS table for better MS compatibility */
+ { 0, 0x40, 0x4B, aImplDBCSToUniTab_MS932_FC }, /* 0xFC */ /* We use the MS table for better MS compatibility */
+ { 0x00A9, 0, 0, NULL }, /* 0xFD */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+ { 0x2122, 0, 0, NULL }, /* 0xFE */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+ { 0x2026, 0, 0, NULL } /* 0xFF */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* MS932-Tables are used for better microsoft compatibility */
+
+static ImplUniToDBCSHighTab const aSJISDBCSHighTab[256] =
+{
+ { 0x00, 0xF7, aImplUniToDBCSTab_SJIS_00 }, /* 0x00 */
+ { 1, 0, NULL }, /* 0x01 */
+ { 1, 0, NULL }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_SJIS_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_SJIS_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x10, 0x3E, aImplUniToDBCSTab_SJIS_20 }, /* 0x20 */
+ { 0x03, 0xD4, aImplUniToDBCSTab_MS932_21 }, /* 0x21 */
+ { 0x00, 0xBF, aImplUniToDBCSTab_MS932_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_SJIS_23 }, /* 0x23 */
+ { 0x60, 0x73, aImplUniToDBCSTab_MS932_24 }, /* 0x24 */
+ { 0x00, 0xEF, aImplUniToDBCSTab_SJIS_25 }, /* 0x25 */
+ { 0x05, 0x6F, aImplUniToDBCSTab_SJIS_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_30 }, /* 0x30 */
+ { 1, 0, NULL }, /* 0x31 */
+ { 0x31, 0xA8, aImplUniToDBCSTab_MS932_32 }, /* 0x32 */
+ { 0x03, 0xCD, aImplUniToDBCSTab_MS932_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFC, aImplUniToDBCSTab_SJIS_4E }, /* 0x4E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_4F }, /* 0x4F */
+ { 0x05, 0xFB, aImplUniToDBCSTab_SJIS_50 }, /* 0x50 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_52 }, /* 0x52 */
+ { 0x00, 0xFA, aImplUniToDBCSTab_SJIS_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_54 }, /* 0x54 */
+ { 0x04, 0xFE, aImplUniToDBCSTab_SJIS_55 }, /* 0x55 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_SJIS_56 }, /* 0x56 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_SJIS_57 }, /* 0x57 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_58 }, /* 0x58 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_59 }, /* 0x59 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_5A }, /* 0x5A */
+ { 0x09, 0xFF, aImplUniToDBCSTab_SJIS_5B }, /* 0x5B */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_5C }, /* 0x5C */
+ { 0x07, 0xFE, aImplUniToDBCSTab_SJIS_5D }, /* 0x5D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_5F }, /* 0x5F */
+ { 0x0E, 0xFB, aImplUniToDBCSTab_SJIS_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_62 }, /* 0x62 */
+ { 0x01, 0xFA, aImplUniToDBCSTab_SJIS_63 }, /* 0x63 */
+ { 0x06, 0xFE, aImplUniToDBCSTab_SJIS_64 }, /* 0x64 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_SJIS_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_67 }, /* 0x67 */
+ { 0x01, 0xFA, aImplUniToDBCSTab_SJIS_68 }, /* 0x68 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_69 }, /* 0x69 */
+ { 0x02, 0xFB, aImplUniToDBCSTab_SJIS_6A }, /* 0x6A */
+ { 0x04, 0xF3, aImplUniToDBCSTab_SJIS_6B }, /* 0x6B */
+ { 0x08, 0xF3, aImplUniToDBCSTab_SJIS_6C }, /* 0x6C */
+ { 0x04, 0xFC, aImplUniToDBCSTab_SJIS_6D }, /* 0x6D */
+ { 0x05, 0xFF, aImplUniToDBCSTab_SJIS_6E }, /* 0x6E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_6F }, /* 0x6F */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_70 }, /* 0x70 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_SJIS_71 }, /* 0x71 */
+ { 0x06, 0xFD, aImplUniToDBCSTab_SJIS_72 }, /* 0x72 */
+ { 0x0A, 0xFE, aImplUniToDBCSTab_SJIS_73 }, /* 0x73 */
+ { 0x03, 0xF8, aImplUniToDBCSTab_SJIS_74 }, /* 0x74 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_75 }, /* 0x75 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_76 }, /* 0x76 */
+ { 0x01, 0xFC, aImplUniToDBCSTab_SJIS_77 }, /* 0x77 */
+ { 0x02, 0xFD, aImplUniToDBCSTab_SJIS_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_7A }, /* 0x7A */
+ { 0x02, 0xF7, aImplUniToDBCSTab_SJIS_7B }, /* 0x7B */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_SJIS_7D }, /* 0x7D */
+ { 0x01, 0x9C, aImplUniToDBCSTab_SJIS_7E }, /* 0x7E */
+ { 0x36, 0xFC, aImplUniToDBCSTab_SJIS_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_SJIS_81 }, /* 0x81 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_82 }, /* 0x82 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_83 }, /* 0x83 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_SJIS_84 }, /* 0x84 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_85 }, /* 0x85 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_SJIS_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_87 }, /* 0x87 */
+ { 0x05, 0xFE, aImplUniToDBCSTab_SJIS_88 }, /* 0x88 */
+ { 0x02, 0xF8, aImplUniToDBCSTab_SJIS_89 }, /* 0x89 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_8A }, /* 0x8A */
+ { 0x00, 0x9A, aImplUniToDBCSTab_SJIS_8B }, /* 0x8B */
+ { 0x37, 0xFD, aImplUniToDBCSTab_SJIS_8C }, /* 0x8C */
+ { 0x04, 0xFF, aImplUniToDBCSTab_SJIS_8D }, /* 0x8D */
+ { 0x08, 0xFE, aImplUniToDBCSTab_SJIS_8E }, /* 0x8E */
+ { 0x03, 0xFD, aImplUniToDBCSTab_SJIS_8F }, /* 0x8F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_90 }, /* 0x90 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_91 }, /* 0x91 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_SJIS_92 }, /* 0x92 */
+ { 0x02, 0xF8, aImplUniToDBCSTab_SJIS_93 }, /* 0x93 */
+ { 0x03, 0x81, aImplUniToDBCSTab_SJIS_94 }, /* 0x94 */
+ { 0x77, 0xE5, aImplUniToDBCSTab_SJIS_95 }, /* 0x95 */
+ { 0x1C, 0xFB, aImplUniToDBCSTab_SJIS_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_97 }, /* 0x97 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_98 }, /* 0x98 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_SJIS_99 }, /* 0x99 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_9A }, /* 0x9A */
+ { 0x06, 0xF5, aImplUniToDBCSTab_SJIS_9B }, /* 0x9B */
+ { 0x00, 0xF6, aImplUniToDBCSTab_SJIS_9C }, /* 0x9C */
+ { 0x03, 0xFD, aImplUniToDBCSTab_SJIS_9D }, /* 0x9D */
+ { 0x19, 0xFD, aImplUniToDBCSTab_SJIS_9E }, /* 0x9E */
+ { 0x07, 0xA0, aImplUniToDBCSTab_SJIS_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 0x29, 0xDC, aImplUniToDBCSTab_MS932_F9 }, /* 0xF9 */
+ { 0x0E, 0x2D, aImplUniToDBCSTab_MS932_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 1, 0, NULL }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_SJIS_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* F040-F9FC --> E000-E757 */
+
+#define DBCS_EUDC_SJIS_COUNT 1
+static ImplDBCSEUDCData const aImplSJISDBCSEUDCTab[DBCS_EUDC_SJIS_COUNT] =
+{
+ /* EUDC-Range */
+ /* Lead: F0-F9 */
+ /* Trail: 40-7E, 80-FC */
+ { 0xF0, 0xF9, 0x40, 0x7E, 0x80, 0xFC, 0, 0, 2, 0xBC, 0xE000, 0xE757 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplSJISDBCSCvtData =
+{
+ aSJISUniLeadTab,
+ aSJISDBCSHighTab,
+ 0x00, 0xFF,
+ 0x40, 0xFC,
+ aImplSJISDBCSEUDCTab,
+ DBCS_EUDC_SJIS_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplSJISTextEncodingData
+ = { { &aImplSJISDBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 128,
+ "euc-jp",
+ "shift_jis",
+ RTL_TEXTENCODING_INFO_MULTIBYTE | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_JAPANESE, pc code page 932, mac encoding 1 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aMS932UniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */ /* in SJIS this is A5 (YEN SIGN), but for compatibiliy with ascii, we use 0x5C like MS CP392 */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */ /* in SJIS this is 0x0203E (SPACING OVERSCORE), but for compatibiliy with ascii, we use 0x7E (TILDE) like MS CP392 */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0x005C, 0, 0, NULL }, /* 0x80 */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_81 }, /* 0x81 */
+ { 0, 0x4F, 0xF1, aImplDBCSToUniTab_SJIS_82 }, /* 0x82 */
+ { 0, 0x40, 0xD6, aImplDBCSToUniTab_SJIS_83 }, /* 0x83 */
+ { 0, 0x40, 0xBF, aImplDBCSToUniTab_SJIS_84 }, /* 0x84 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x85 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x86 */ /* We convert this as double byte */
+ { 0, 0x40, 0x9C, aImplDBCSToUniTab_MS932_87 }, /* 0x87 */
+ { 0, 0x9F, 0xFC, aImplDBCSToUniTab_SJIS_88 }, /* 0x88 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_89 }, /* 0x89 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8A }, /* 0x8A */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8B }, /* 0x8B */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8C }, /* 0x8C */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8D }, /* 0x8D */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8E }, /* 0x8E */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8F }, /* 0x8F */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_90 }, /* 0x90 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_91 }, /* 0x91 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_92 }, /* 0x92 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_93 }, /* 0x93 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_94 }, /* 0x94 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_95 }, /* 0x95 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_96 }, /* 0x96 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_97 }, /* 0x97 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_98 }, /* 0x98 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_99 }, /* 0x99 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9A }, /* 0x9A */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9B }, /* 0x9B */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9C }, /* 0x9C */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9D }, /* 0x9D */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9E }, /* 0x9E */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9F }, /* 0x9F */
+ { 0x00A0, 0, 0, NULL }, /* 0xA0 */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+ { 0xFF61, 0, 0, NULL }, /* 0xA1 */
+ { 0xFF62, 0, 0, NULL }, /* 0xA2 */
+ { 0xFF63, 0, 0, NULL }, /* 0xA3 */
+ { 0xFF64, 0, 0, NULL }, /* 0xA4 */
+ { 0xFF65, 0, 0, NULL }, /* 0xA5 */
+ { 0xFF66, 0, 0, NULL }, /* 0xA6 */
+ { 0xFF67, 0, 0, NULL }, /* 0xA7 */
+ { 0xFF68, 0, 0, NULL }, /* 0xA8 */
+ { 0xFF69, 0, 0, NULL }, /* 0xA9 */
+ { 0xFF6A, 0, 0, NULL }, /* 0xAA */
+ { 0xFF6B, 0, 0, NULL }, /* 0xAB */
+ { 0xFF6C, 0, 0, NULL }, /* 0xAC */
+ { 0xFF6D, 0, 0, NULL }, /* 0xAD */
+ { 0xFF6E, 0, 0, NULL }, /* 0xAE */
+ { 0xFF6F, 0, 0, NULL }, /* 0xAF */
+ { 0xFF70, 0, 0, NULL }, /* 0xB0 */
+ { 0xFF71, 0, 0, NULL }, /* 0xB1 */
+ { 0xFF72, 0, 0, NULL }, /* 0xB2 */
+ { 0xFF73, 0, 0, NULL }, /* 0xB3 */
+ { 0xFF74, 0, 0, NULL }, /* 0xB4 */
+ { 0xFF75, 0, 0, NULL }, /* 0xB5 */
+ { 0xFF76, 0, 0, NULL }, /* 0xB6 */
+ { 0xFF77, 0, 0, NULL }, /* 0xB7 */
+ { 0xFF78, 0, 0, NULL }, /* 0xB8 */
+ { 0xFF79, 0, 0, NULL }, /* 0xB9 */
+ { 0xFF7A, 0, 0, NULL }, /* 0xBA */
+ { 0xFF7B, 0, 0, NULL }, /* 0xBB */
+ { 0xFF7C, 0, 0, NULL }, /* 0xBC */
+ { 0xFF7D, 0, 0, NULL }, /* 0xBD */
+ { 0xFF7E, 0, 0, NULL }, /* 0xBE */
+ { 0xFF7F, 0, 0, NULL }, /* 0xBF */
+ { 0xFF80, 0, 0, NULL }, /* 0xC0 */
+ { 0xFF81, 0, 0, NULL }, /* 0xC1 */
+ { 0xFF82, 0, 0, NULL }, /* 0xC2 */
+ { 0xFF83, 0, 0, NULL }, /* 0xC3 */
+ { 0xFF84, 0, 0, NULL }, /* 0xC4 */
+ { 0xFF85, 0, 0, NULL }, /* 0xC5 */
+ { 0xFF86, 0, 0, NULL }, /* 0xC6 */
+ { 0xFF87, 0, 0, NULL }, /* 0xC7 */
+ { 0xFF88, 0, 0, NULL }, /* 0xC8 */
+ { 0xFF89, 0, 0, NULL }, /* 0xC9 */
+ { 0xFF8A, 0, 0, NULL }, /* 0xCA */
+ { 0xFF8B, 0, 0, NULL }, /* 0xCB */
+ { 0xFF8C, 0, 0, NULL }, /* 0xCC */
+ { 0xFF8D, 0, 0, NULL }, /* 0xCD */
+ { 0xFF8E, 0, 0, NULL }, /* 0xCE */
+ { 0xFF8F, 0, 0, NULL }, /* 0xCF */
+ { 0xFF90, 0, 0, NULL }, /* 0xD0 */
+ { 0xFF91, 0, 0, NULL }, /* 0xD1 */
+ { 0xFF92, 0, 0, NULL }, /* 0xD2 */
+ { 0xFF93, 0, 0, NULL }, /* 0xD3 */
+ { 0xFF94, 0, 0, NULL }, /* 0xD4 */
+ { 0xFF95, 0, 0, NULL }, /* 0xD5 */
+ { 0xFF96, 0, 0, NULL }, /* 0xD6 */
+ { 0xFF97, 0, 0, NULL }, /* 0xD7 */
+ { 0xFF98, 0, 0, NULL }, /* 0xD8 */
+ { 0xFF99, 0, 0, NULL }, /* 0xD9 */
+ { 0xFF9A, 0, 0, NULL }, /* 0xDA */
+ { 0xFF9B, 0, 0, NULL }, /* 0xDB */
+ { 0xFF9C, 0, 0, NULL }, /* 0xDC */
+ { 0xFF9D, 0, 0, NULL }, /* 0xDD */
+ { 0xFF9E, 0, 0, NULL }, /* 0xDE */
+ { 0xFF9F, 0, 0, NULL }, /* 0xDF */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E0 }, /* 0xE0 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E1 }, /* 0xE1 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E2 }, /* 0xE2 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E3 }, /* 0xE3 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E4 }, /* 0xE4 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E5 }, /* 0xE5 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E6 }, /* 0xE6 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E7 }, /* 0xE7 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E8 }, /* 0xE8 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E9 }, /* 0xE9 */
+ { 0, 0x40, 0xA4, aImplDBCSToUniTab_SJIS_EA }, /* 0xEA */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEC */ /* We convert this as double byte */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_ED }, /* 0xED */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_EE }, /* 0xEE */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEF */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF0 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF1 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF2 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF3 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF4 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF5 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF6 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF7 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF8 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF9 */ /* EUDC Range */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_FA }, /* 0xFA */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_FB }, /* 0xFB */
+ { 0, 0x40, 0x4B, aImplDBCSToUniTab_MS932_FC }, /* 0xFC */
+ { 0x00A9, 0, 0, NULL }, /* 0xFD */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+ { 0x2122, 0, 0, NULL }, /* 0xFE */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+ { 0x2026, 0, 0, NULL } /* 0xFF */ /* APPLE additons over SJIS, we convert this like apple, because I think, this gives better result, than we take a replacement char */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aMS932DBCSHighTab[256] =
+{
+ { 0x00, 0xF7, aImplUniToDBCSTab_SJIS_00 }, /* 0x00 */
+ { 1, 0, NULL }, /* 0x01 */
+ { 1, 0, NULL }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_SJIS_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_SJIS_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x10, 0x3E, aImplUniToDBCSTab_SJIS_20 }, /* 0x20 */
+ { 0x03, 0xD4, aImplUniToDBCSTab_MS932_21 }, /* 0x21 */
+ { 0x00, 0xBF, aImplUniToDBCSTab_MS932_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_SJIS_23 }, /* 0x23 */
+ { 0x60, 0x73, aImplUniToDBCSTab_MS932_24 }, /* 0x24 */
+ { 0x00, 0xEF, aImplUniToDBCSTab_SJIS_25 }, /* 0x25 */
+ { 0x05, 0x6F, aImplUniToDBCSTab_SJIS_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_30 }, /* 0x30 */
+ { 1, 0, NULL }, /* 0x31 */
+ { 0x31, 0xA8, aImplUniToDBCSTab_MS932_32 }, /* 0x32 */
+ { 0x03, 0xCD, aImplUniToDBCSTab_MS932_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFC, aImplUniToDBCSTab_SJIS_4E }, /* 0x4E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_4F }, /* 0x4F */
+ { 0x05, 0xFB, aImplUniToDBCSTab_SJIS_50 }, /* 0x50 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_52 }, /* 0x52 */
+ { 0x00, 0xFA, aImplUniToDBCSTab_SJIS_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_54 }, /* 0x54 */
+ { 0x04, 0xFE, aImplUniToDBCSTab_SJIS_55 }, /* 0x55 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_SJIS_56 }, /* 0x56 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_SJIS_57 }, /* 0x57 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_58 }, /* 0x58 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_59 }, /* 0x59 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_5A }, /* 0x5A */
+ { 0x09, 0xFF, aImplUniToDBCSTab_SJIS_5B }, /* 0x5B */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_5C }, /* 0x5C */
+ { 0x07, 0xFE, aImplUniToDBCSTab_SJIS_5D }, /* 0x5D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_5F }, /* 0x5F */
+ { 0x0E, 0xFB, aImplUniToDBCSTab_SJIS_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_62 }, /* 0x62 */
+ { 0x01, 0xFA, aImplUniToDBCSTab_SJIS_63 }, /* 0x63 */
+ { 0x06, 0xFE, aImplUniToDBCSTab_SJIS_64 }, /* 0x64 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_SJIS_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_67 }, /* 0x67 */
+ { 0x01, 0xFA, aImplUniToDBCSTab_SJIS_68 }, /* 0x68 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_69 }, /* 0x69 */
+ { 0x02, 0xFB, aImplUniToDBCSTab_SJIS_6A }, /* 0x6A */
+ { 0x04, 0xF3, aImplUniToDBCSTab_SJIS_6B }, /* 0x6B */
+ { 0x08, 0xF3, aImplUniToDBCSTab_SJIS_6C }, /* 0x6C */
+ { 0x04, 0xFC, aImplUniToDBCSTab_SJIS_6D }, /* 0x6D */
+ { 0x05, 0xFF, aImplUniToDBCSTab_SJIS_6E }, /* 0x6E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_6F }, /* 0x6F */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_70 }, /* 0x70 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_SJIS_71 }, /* 0x71 */
+ { 0x06, 0xFD, aImplUniToDBCSTab_SJIS_72 }, /* 0x72 */
+ { 0x0A, 0xFE, aImplUniToDBCSTab_SJIS_73 }, /* 0x73 */
+ { 0x03, 0xF8, aImplUniToDBCSTab_SJIS_74 }, /* 0x74 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_75 }, /* 0x75 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_76 }, /* 0x76 */
+ { 0x01, 0xFC, aImplUniToDBCSTab_SJIS_77 }, /* 0x77 */
+ { 0x02, 0xFD, aImplUniToDBCSTab_SJIS_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_7A }, /* 0x7A */
+ { 0x02, 0xF7, aImplUniToDBCSTab_SJIS_7B }, /* 0x7B */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_SJIS_7D }, /* 0x7D */
+ { 0x01, 0x9C, aImplUniToDBCSTab_SJIS_7E }, /* 0x7E */
+ { 0x36, 0xFC, aImplUniToDBCSTab_SJIS_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_SJIS_81 }, /* 0x81 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_82 }, /* 0x82 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_83 }, /* 0x83 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_SJIS_84 }, /* 0x84 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_85 }, /* 0x85 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_SJIS_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_87 }, /* 0x87 */
+ { 0x05, 0xFE, aImplUniToDBCSTab_SJIS_88 }, /* 0x88 */
+ { 0x02, 0xF8, aImplUniToDBCSTab_SJIS_89 }, /* 0x89 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_8A }, /* 0x8A */
+ { 0x00, 0x9A, aImplUniToDBCSTab_SJIS_8B }, /* 0x8B */
+ { 0x37, 0xFD, aImplUniToDBCSTab_SJIS_8C }, /* 0x8C */
+ { 0x04, 0xFF, aImplUniToDBCSTab_SJIS_8D }, /* 0x8D */
+ { 0x08, 0xFE, aImplUniToDBCSTab_SJIS_8E }, /* 0x8E */
+ { 0x03, 0xFD, aImplUniToDBCSTab_SJIS_8F }, /* 0x8F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_90 }, /* 0x90 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_91 }, /* 0x91 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_SJIS_92 }, /* 0x92 */
+ { 0x02, 0xF8, aImplUniToDBCSTab_SJIS_93 }, /* 0x93 */
+ { 0x03, 0x81, aImplUniToDBCSTab_SJIS_94 }, /* 0x94 */
+ { 0x77, 0xE5, aImplUniToDBCSTab_SJIS_95 }, /* 0x95 */
+ { 0x1C, 0xFB, aImplUniToDBCSTab_SJIS_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_97 }, /* 0x97 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_98 }, /* 0x98 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_SJIS_99 }, /* 0x99 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_9A }, /* 0x9A */
+ { 0x06, 0xF5, aImplUniToDBCSTab_SJIS_9B }, /* 0x9B */
+ { 0x00, 0xF6, aImplUniToDBCSTab_SJIS_9C }, /* 0x9C */
+ { 0x03, 0xFD, aImplUniToDBCSTab_SJIS_9D }, /* 0x9D */
+ { 0x19, 0xFD, aImplUniToDBCSTab_SJIS_9E }, /* 0x9E */
+ { 0x07, 0xA0, aImplUniToDBCSTab_SJIS_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 0x29, 0xDC, aImplUniToDBCSTab_MS932_F9 }, /* 0xF9 */
+ { 0x0E, 0x2D, aImplUniToDBCSTab_MS932_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 1, 0, NULL }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_SJIS_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplMS932DBCSCvtData =
+{
+ aMS932UniLeadTab,
+ aMS932DBCSHighTab,
+ 0x00, 0xFF,
+ 0x40, 0xFC,
+ aImplSJISDBCSEUDCTab,
+ DBCS_EUDC_SJIS_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS932TextEncodingData
+ = { { &aImplMS932DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 128,
+ "euc-jp",
+ "shift_jis",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* WIN/DOS/OS2, SCRIPT_JAPANESE, pc code page 932, mac encoding 1 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aAPPLEJAPANESEUniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */ /* is A5 (YEN SIGN), but for compatibiliy with ascii, we use 0x5C like MS CP392 */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */ /* in SJIS this is 0x0203E (SPACING OVERSCORE), but for compatibiliy with ascii, we use 0x7E (TILDE) like MS CP392 */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0x005C, 0, 0, NULL }, /* 0x80 */ /* APPLE additons over SJIS */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_81 }, /* 0x81 */
+ { 0, 0x4F, 0xF1, aImplDBCSToUniTab_SJIS_82 }, /* 0x82 */
+ { 0, 0x40, 0xD6, aImplDBCSToUniTab_SJIS_83 }, /* 0x83 */
+ { 0, 0x40, 0xBF, aImplDBCSToUniTab_SJIS_84 }, /* 0x84 */
+ { 0, 0x40, 0xF4, aImplDBCSToUniTab_APPLEJAPANESE_85 }, /* 0x85 */
+ { 0, 0x40, 0xD2, aImplDBCSToUniTab_APPLEJAPANESE_86 }, /* 0x86 */
+ { 0, 0x40, 0xFA, aImplDBCSToUniTab_APPLEJAPANESE_87 }, /* 0x87 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_APPLEJAPANESE_88 }, /* 0x88 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_89 }, /* 0x89 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8A }, /* 0x8A */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8B }, /* 0x8B */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8C }, /* 0x8C */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8D }, /* 0x8D */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8E }, /* 0x8E */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_8F }, /* 0x8F */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_90 }, /* 0x90 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_91 }, /* 0x91 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_92 }, /* 0x92 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_93 }, /* 0x93 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_94 }, /* 0x94 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_95 }, /* 0x95 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_96 }, /* 0x96 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_97 }, /* 0x97 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_98 }, /* 0x98 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_99 }, /* 0x99 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9A }, /* 0x9A */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9B }, /* 0x9B */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9C }, /* 0x9C */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9D }, /* 0x9D */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9E }, /* 0x9E */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_9F }, /* 0x9F */
+ { 0x00A0, 0, 0, NULL }, /* 0xA0 */ /* APPLE additons over SJIS */
+ { 0xFF61, 0, 0, NULL }, /* 0xA1 */
+ { 0xFF62, 0, 0, NULL }, /* 0xA2 */
+ { 0xFF63, 0, 0, NULL }, /* 0xA3 */
+ { 0xFF64, 0, 0, NULL }, /* 0xA4 */
+ { 0xFF65, 0, 0, NULL }, /* 0xA5 */
+ { 0xFF66, 0, 0, NULL }, /* 0xA6 */
+ { 0xFF67, 0, 0, NULL }, /* 0xA7 */
+ { 0xFF68, 0, 0, NULL }, /* 0xA8 */
+ { 0xFF69, 0, 0, NULL }, /* 0xA9 */
+ { 0xFF6A, 0, 0, NULL }, /* 0xAA */
+ { 0xFF6B, 0, 0, NULL }, /* 0xAB */
+ { 0xFF6C, 0, 0, NULL }, /* 0xAC */
+ { 0xFF6D, 0, 0, NULL }, /* 0xAD */
+ { 0xFF6E, 0, 0, NULL }, /* 0xAE */
+ { 0xFF6F, 0, 0, NULL }, /* 0xAF */
+ { 0xFF70, 0, 0, NULL }, /* 0xB0 */
+ { 0xFF71, 0, 0, NULL }, /* 0xB1 */
+ { 0xFF72, 0, 0, NULL }, /* 0xB2 */
+ { 0xFF73, 0, 0, NULL }, /* 0xB3 */
+ { 0xFF74, 0, 0, NULL }, /* 0xB4 */
+ { 0xFF75, 0, 0, NULL }, /* 0xB5 */
+ { 0xFF76, 0, 0, NULL }, /* 0xB6 */
+ { 0xFF77, 0, 0, NULL }, /* 0xB7 */
+ { 0xFF78, 0, 0, NULL }, /* 0xB8 */
+ { 0xFF79, 0, 0, NULL }, /* 0xB9 */
+ { 0xFF7A, 0, 0, NULL }, /* 0xBA */
+ { 0xFF7B, 0, 0, NULL }, /* 0xBB */
+ { 0xFF7C, 0, 0, NULL }, /* 0xBC */
+ { 0xFF7D, 0, 0, NULL }, /* 0xBD */
+ { 0xFF7E, 0, 0, NULL }, /* 0xBE */
+ { 0xFF7F, 0, 0, NULL }, /* 0xBF */
+ { 0xFF80, 0, 0, NULL }, /* 0xC0 */
+ { 0xFF81, 0, 0, NULL }, /* 0xC1 */
+ { 0xFF82, 0, 0, NULL }, /* 0xC2 */
+ { 0xFF83, 0, 0, NULL }, /* 0xC3 */
+ { 0xFF84, 0, 0, NULL }, /* 0xC4 */
+ { 0xFF85, 0, 0, NULL }, /* 0xC5 */
+ { 0xFF86, 0, 0, NULL }, /* 0xC6 */
+ { 0xFF87, 0, 0, NULL }, /* 0xC7 */
+ { 0xFF88, 0, 0, NULL }, /* 0xC8 */
+ { 0xFF89, 0, 0, NULL }, /* 0xC9 */
+ { 0xFF8A, 0, 0, NULL }, /* 0xCA */
+ { 0xFF8B, 0, 0, NULL }, /* 0xCB */
+ { 0xFF8C, 0, 0, NULL }, /* 0xCC */
+ { 0xFF8D, 0, 0, NULL }, /* 0xCD */
+ { 0xFF8E, 0, 0, NULL }, /* 0xCE */
+ { 0xFF8F, 0, 0, NULL }, /* 0xCF */
+ { 0xFF90, 0, 0, NULL }, /* 0xD0 */
+ { 0xFF91, 0, 0, NULL }, /* 0xD1 */
+ { 0xFF92, 0, 0, NULL }, /* 0xD2 */
+ { 0xFF93, 0, 0, NULL }, /* 0xD3 */
+ { 0xFF94, 0, 0, NULL }, /* 0xD4 */
+ { 0xFF95, 0, 0, NULL }, /* 0xD5 */
+ { 0xFF96, 0, 0, NULL }, /* 0xD6 */
+ { 0xFF97, 0, 0, NULL }, /* 0xD7 */
+ { 0xFF98, 0, 0, NULL }, /* 0xD8 */
+ { 0xFF99, 0, 0, NULL }, /* 0xD9 */
+ { 0xFF9A, 0, 0, NULL }, /* 0xDA */
+ { 0xFF9B, 0, 0, NULL }, /* 0xDB */
+ { 0xFF9C, 0, 0, NULL }, /* 0xDC */
+ { 0xFF9D, 0, 0, NULL }, /* 0xDD */
+ { 0xFF9E, 0, 0, NULL }, /* 0xDE */
+ { 0xFF9F, 0, 0, NULL }, /* 0xDF */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E0 }, /* 0xE0 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E1 }, /* 0xE1 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E2 }, /* 0xE2 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E3 }, /* 0xE3 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E4 }, /* 0xE4 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E5 }, /* 0xE5 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E6 }, /* 0xE6 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E7 }, /* 0xE7 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E8 }, /* 0xE8 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_SJIS_E9 }, /* 0xE9 */
+ { 0, 0x40, 0xA4, aImplDBCSToUniTab_SJIS_EA }, /* 0xEA */
+ { 0, 0x51, 0x7A, aImplDBCSToUniTab_APPLEJAPANESE_EB }, /* 0xEB */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEC */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xED */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEE */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xEF */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF0 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF1 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF2 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF3 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF4 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF5 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF6 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF7 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF8 */ /* EUDC Range */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF9 */ /* EUDC Range */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_FA }, /* 0xFA */ /* We use the MS table for better MS compatibility */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_MS932_FB }, /* 0xFB */ /* We use the MS table for better MS compatibility */
+ { 0, 0x40, 0x4B, aImplDBCSToUniTab_MS932_FC }, /* 0xFC */ /* We use the MS table for better MS compatibility */
+ { 0x00A9, 0, 0, NULL }, /* 0xFD */ /* APPLE additons over SJIS */
+ { 0x2122, 0, 0, NULL }, /* 0xFE */ /* APPLE additons over SJIS */
+ { 0x2026, 0, 0, NULL } /* 0xFF */ /* APPLE additons over SJIS */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aAPPLEJAPANESEDBCSHighTab[256] =
+{
+ { 0x00, 0xF7, aImplUniToDBCSTab_APPLEJAPANESE_00 }, /* 0x00 */
+ { 1, 0, NULL }, /* 0x01 */
+ { 1, 0, NULL }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_SJIS_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_SJIS_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x10, 0x3E, aImplUniToDBCSTab_SJIS_20 }, /* 0x20 */
+ { 0x03, 0xE9, aImplUniToDBCSTab_APPLEJAPANESE_21 }, /* 0x21 */
+ { 0x00, 0xEF, aImplUniToDBCSTab_APPLEJAPANESE_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_SJIS_23 }, /* 0x23 */
+ { 0x60, 0xB5, aImplUniToDBCSTab_APPLEJAPANESE_24 }, /* 0x24 */
+ { 0x00, 0xEF, aImplUniToDBCSTab_SJIS_25 }, /* 0x25 */
+ { 0x05, 0x6F, aImplUniToDBCSTab_APPLEJAPANESE_26 }, /* 0x26 */
+ { 0x76, 0x7E, aImplUniToDBCSTab_APPLEJAPANESE_27 }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_APPLEJAPANESE_30 }, /* 0x30 */
+ { 1, 0, NULL }, /* 0x31 */
+ { 0x2A, 0xA9, aImplUniToDBCSTab_APPLEJAPANESE_32 }, /* 0x32 */
+ { 0x00, 0xD4, aImplUniToDBCSTab_APPLEJAPANESE_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFC, aImplUniToDBCSTab_SJIS_4E }, /* 0x4E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_4F }, /* 0x4F */
+ { 0x05, 0xFB, aImplUniToDBCSTab_SJIS_50 }, /* 0x50 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_52 }, /* 0x52 */
+ { 0x00, 0xFA, aImplUniToDBCSTab_SJIS_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_54 }, /* 0x54 */
+ { 0x04, 0xFE, aImplUniToDBCSTab_SJIS_55 }, /* 0x55 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_SJIS_56 }, /* 0x56 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_SJIS_57 }, /* 0x57 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_58 }, /* 0x58 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_59 }, /* 0x59 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_5A }, /* 0x5A */
+ { 0x09, 0xFF, aImplUniToDBCSTab_SJIS_5B }, /* 0x5B */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_5C }, /* 0x5C */
+ { 0x07, 0xFE, aImplUniToDBCSTab_SJIS_5D }, /* 0x5D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_5F }, /* 0x5F */
+ { 0x0E, 0xFB, aImplUniToDBCSTab_SJIS_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_62 }, /* 0x62 */
+ { 0x01, 0xFA, aImplUniToDBCSTab_SJIS_63 }, /* 0x63 */
+ { 0x06, 0xFE, aImplUniToDBCSTab_SJIS_64 }, /* 0x64 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_SJIS_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_67 }, /* 0x67 */
+ { 0x01, 0xFA, aImplUniToDBCSTab_SJIS_68 }, /* 0x68 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_69 }, /* 0x69 */
+ { 0x02, 0xFB, aImplUniToDBCSTab_SJIS_6A }, /* 0x6A */
+ { 0x04, 0xF3, aImplUniToDBCSTab_SJIS_6B }, /* 0x6B */
+ { 0x08, 0xF3, aImplUniToDBCSTab_SJIS_6C }, /* 0x6C */
+ { 0x04, 0xFC, aImplUniToDBCSTab_SJIS_6D }, /* 0x6D */
+ { 0x05, 0xFF, aImplUniToDBCSTab_SJIS_6E }, /* 0x6E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_6F }, /* 0x6F */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_70 }, /* 0x70 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_SJIS_71 }, /* 0x71 */
+ { 0x06, 0xFD, aImplUniToDBCSTab_SJIS_72 }, /* 0x72 */
+ { 0x0A, 0xFE, aImplUniToDBCSTab_SJIS_73 }, /* 0x73 */
+ { 0x03, 0xF8, aImplUniToDBCSTab_SJIS_74 }, /* 0x74 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_SJIS_75 }, /* 0x75 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_76 }, /* 0x76 */
+ { 0x01, 0xFC, aImplUniToDBCSTab_SJIS_77 }, /* 0x77 */
+ { 0x02, 0xFD, aImplUniToDBCSTab_SJIS_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_7A }, /* 0x7A */
+ { 0x02, 0xF7, aImplUniToDBCSTab_SJIS_7B }, /* 0x7B */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_SJIS_7D }, /* 0x7D */
+ { 0x01, 0x9C, aImplUniToDBCSTab_SJIS_7E }, /* 0x7E */
+ { 0x36, 0xFC, aImplUniToDBCSTab_SJIS_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_SJIS_81 }, /* 0x81 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_82 }, /* 0x82 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_SJIS_83 }, /* 0x83 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_SJIS_84 }, /* 0x84 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_85 }, /* 0x85 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_SJIS_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_87 }, /* 0x87 */
+ { 0x05, 0xFE, aImplUniToDBCSTab_SJIS_88 }, /* 0x88 */
+ { 0x02, 0xF8, aImplUniToDBCSTab_SJIS_89 }, /* 0x89 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_SJIS_8A }, /* 0x8A */
+ { 0x00, 0x9A, aImplUniToDBCSTab_SJIS_8B }, /* 0x8B */
+ { 0x37, 0xFD, aImplUniToDBCSTab_SJIS_8C }, /* 0x8C */
+ { 0x04, 0xFF, aImplUniToDBCSTab_SJIS_8D }, /* 0x8D */
+ { 0x08, 0xFE, aImplUniToDBCSTab_SJIS_8E }, /* 0x8E */
+ { 0x03, 0xFD, aImplUniToDBCSTab_SJIS_8F }, /* 0x8F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_SJIS_90 }, /* 0x90 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_SJIS_91 }, /* 0x91 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_SJIS_92 }, /* 0x92 */
+ { 0x02, 0xF8, aImplUniToDBCSTab_SJIS_93 }, /* 0x93 */
+ { 0x03, 0x81, aImplUniToDBCSTab_SJIS_94 }, /* 0x94 */
+ { 0x77, 0xE5, aImplUniToDBCSTab_SJIS_95 }, /* 0x95 */
+ { 0x1C, 0xFB, aImplUniToDBCSTab_SJIS_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_SJIS_97 }, /* 0x97 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_SJIS_98 }, /* 0x98 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_SJIS_99 }, /* 0x99 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_SJIS_9A }, /* 0x9A */
+ { 0x06, 0xF5, aImplUniToDBCSTab_SJIS_9B }, /* 0x9B */
+ { 0x00, 0xF6, aImplUniToDBCSTab_SJIS_9C }, /* 0x9C */
+ { 0x03, 0xFD, aImplUniToDBCSTab_SJIS_9D }, /* 0x9D */
+ { 0x19, 0xFD, aImplUniToDBCSTab_SJIS_9E }, /* 0x9E */
+ { 0x07, 0xA0, aImplUniToDBCSTab_SJIS_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 0x29, 0xDC, aImplUniToDBCSTab_MS932_F9 }, /* 0xF9 */
+ { 0x0E, 0x2D, aImplUniToDBCSTab_MS932_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x30, 0x44, aImplUniToDBCSTab_APPLEJAPANESE_FE }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_SJIS_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplAPPLEJAPANESEDBCSCvtData =
+{
+ aAPPLEJAPANESEUniLeadTab,
+ aAPPLEJAPANESEDBCSHighTab,
+ 0x00, 0xFF,
+ 0x40, 0xFC,
+ aImplSJISDBCSEUDCTab,
+ DBCS_EUDC_SJIS_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLEJAPANESETextEncodingData
+ = { { &aImplAPPLEJAPANESEDBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 128,
+ "euc-jp",
+ "shift_jis",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* MAC, SCRIPT_JAPANESE, pc code page 932, mac encoding 1 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aJIS0208UniLeadTab[128] =
+{
+ { 0, 1, 0, NULL }, /* 0x00 */
+ { 0, 1, 0, NULL }, /* 0x01 */
+ { 0, 1, 0, NULL }, /* 0x02 */
+ { 0, 1, 0, NULL }, /* 0x03 */
+ { 0, 1, 0, NULL }, /* 0x04 */
+ { 0, 1, 0, NULL }, /* 0x05 */
+ { 0, 1, 0, NULL }, /* 0x06 */
+ { 0, 1, 0, NULL }, /* 0x07 */
+ { 0, 1, 0, NULL }, /* 0x08 */
+ { 0, 1, 0, NULL }, /* 0x09 */
+ { 0, 1, 0, NULL }, /* 0x0A */
+ { 0, 1, 0, NULL }, /* 0x0B */
+ { 0, 1, 0, NULL }, /* 0x0C */
+ { 0, 1, 0, NULL }, /* 0x0D */
+ { 0, 1, 0, NULL }, /* 0x0E */
+ { 0, 1, 0, NULL }, /* 0x0F */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x10 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x11 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x12 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x13 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x14 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x15 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x16 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x17 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x18 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x19 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x20 */ /* We convert this as double byte */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_21 }, /* 0x21 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_22 }, /* 0x22 */
+ { 0, 0x30, 0x7A, aImplDBCSToUniTab_JIS0208_23 }, /* 0x23 */
+ { 0, 0x21, 0x73, aImplDBCSToUniTab_JIS0208_24 }, /* 0x24 */
+ { 0, 0x21, 0x76, aImplDBCSToUniTab_JIS0208_25 }, /* 0x25 */
+ { 0, 0x21, 0x58, aImplDBCSToUniTab_JIS0208_26 }, /* 0x26 */
+ { 0, 0x21, 0x71, aImplDBCSToUniTab_JIS0208_27 }, /* 0x27 */
+ { 0, 0x21, 0x40, aImplDBCSToUniTab_JIS0208_28 }, /* 0x28 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x29 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2C */ /* We convert this as double byte */
+ { 0, 0x21, 0x7C, aImplDBCSToUniTab_JIS0208_2D }, /* 0x2D */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2F */ /* We convert this as double byte */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_30 }, /* 0x30 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_31 }, /* 0x31 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_32 }, /* 0x32 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_33 }, /* 0x33 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_34 }, /* 0x34 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_35 }, /* 0x35 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_36 }, /* 0x36 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_37 }, /* 0x37 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_38 }, /* 0x38 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_39 }, /* 0x39 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_3A }, /* 0x3A */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_3B }, /* 0x3B */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_3C }, /* 0x3C */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_3D }, /* 0x3D */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_3E }, /* 0x3E */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_3F }, /* 0x3F */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_40 }, /* 0x40 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_41 }, /* 0x41 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_42 }, /* 0x42 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_43 }, /* 0x43 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_44 }, /* 0x44 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_45 }, /* 0x45 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_46 }, /* 0x46 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_47 }, /* 0x47 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_48 }, /* 0x48 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_49 }, /* 0x49 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_4A }, /* 0x4A */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_4B }, /* 0x4B */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_4C }, /* 0x4C */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_4D }, /* 0x4D */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_4E }, /* 0x4E */
+ { 0, 0x21, 0x53, aImplDBCSToUniTab_JIS0208_4F }, /* 0x4F */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_50 }, /* 0x50 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_51 }, /* 0x51 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_52 }, /* 0x52 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_53 }, /* 0x53 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_54 }, /* 0x54 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_55 }, /* 0x55 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_56 }, /* 0x56 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_57 }, /* 0x57 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_58 }, /* 0x58 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_59 }, /* 0x59 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_5A }, /* 0x5A */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_5B }, /* 0x5B */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_5C }, /* 0x5C */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_5D }, /* 0x5D */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_5E }, /* 0x5E */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_5F }, /* 0x5F */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_60 }, /* 0x60 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_61 }, /* 0x61 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_62 }, /* 0x62 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_63 }, /* 0x63 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_64 }, /* 0x64 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_65 }, /* 0x65 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_66 }, /* 0x66 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_67 }, /* 0x67 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_68 }, /* 0x68 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_69 }, /* 0x69 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_6A }, /* 0x6A */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_6B }, /* 0x6B */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_6C }, /* 0x6C */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_6D }, /* 0x6D */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_6E }, /* 0x6E */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_6F }, /* 0x6F */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_70 }, /* 0x70 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_71 }, /* 0x71 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_72 }, /* 0x72 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0208_73 }, /* 0x73 */
+ { 0, 0x21, 0x26, aImplDBCSToUniTab_JIS0208_74 }, /* 0x74 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x75 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x76 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x77 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x78 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x79 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7E */ /* We convert this as double byte */
+ { 0, 1, 0, NULL } /* 0x7F */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aJIS0208DBCSHighTab[256] =
+{
+ { 0xA2, 0xF7, aImplUniToDBCSTab_JIS0208_00 }, /* 0x00 */
+ { 1, 0, NULL }, /* 0x01 */
+ { 1, 0, NULL }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_JIS0208_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_JIS0208_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x10, 0x3B, aImplUniToDBCSTab_JIS0208_20 }, /* 0x20 */
+ { 0x03, 0xD4, aImplUniToDBCSTab_JIS0208_21 }, /* 0x21 */
+ { 0x00, 0xBF, aImplUniToDBCSTab_JIS0208_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_JIS0208_23 }, /* 0x23 */
+ { 0x60, 0x73, aImplUniToDBCSTab_JIS0208_24 }, /* 0x24 */
+ { 0x00, 0xEF, aImplUniToDBCSTab_JIS0208_25 }, /* 0x25 */
+ { 0x05, 0x6F, aImplUniToDBCSTab_JIS0208_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0208_30 }, /* 0x30 */
+ { 1, 0, NULL }, /* 0x31 */
+ { 0x31, 0xA8, aImplUniToDBCSTab_JIS0208_32 }, /* 0x32 */
+ { 0x03, 0xCD, aImplUniToDBCSTab_JIS0208_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFB, aImplUniToDBCSTab_JIS0208_4E }, /* 0x4E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_JIS0208_4F }, /* 0x4F */
+ { 0x05, 0xFB, aImplUniToDBCSTab_JIS0208_50 }, /* 0x50 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0208_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0208_52 }, /* 0x52 */
+ { 0x01, 0xFA, aImplUniToDBCSTab_JIS0208_53 }, /* 0x53 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JIS0208_54 }, /* 0x54 */
+ { 0x04, 0xFE, aImplUniToDBCSTab_JIS0208_55 }, /* 0x55 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_JIS0208_56 }, /* 0x56 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_JIS0208_57 }, /* 0x57 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0208_58 }, /* 0x58 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0208_59 }, /* 0x59 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_JIS0208_5A }, /* 0x5A */
+ { 0x09, 0xFF, aImplUniToDBCSTab_JIS0208_5B }, /* 0x5B */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JIS0208_5C }, /* 0x5C */
+ { 0x07, 0xFE, aImplUniToDBCSTab_JIS0208_5D }, /* 0x5D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0208_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_JIS0208_5F }, /* 0x5F */
+ { 0x0E, 0xFB, aImplUniToDBCSTab_JIS0208_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0208_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0208_62 }, /* 0x62 */
+ { 0x01, 0xFA, aImplUniToDBCSTab_JIS0208_63 }, /* 0x63 */
+ { 0x06, 0xFE, aImplUniToDBCSTab_JIS0208_64 }, /* 0x64 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_JIS0208_65 }, /* 0x65 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0208_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0208_67 }, /* 0x67 */
+ { 0x02, 0xFA, aImplUniToDBCSTab_JIS0208_68 }, /* 0x68 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0208_69 }, /* 0x69 */
+ { 0x02, 0xFB, aImplUniToDBCSTab_JIS0208_6A }, /* 0x6A */
+ { 0x04, 0xF3, aImplUniToDBCSTab_JIS0208_6B }, /* 0x6B */
+ { 0x08, 0xF3, aImplUniToDBCSTab_JIS0208_6C }, /* 0x6C */
+ { 0x0B, 0xFB, aImplUniToDBCSTab_JIS0208_6D }, /* 0x6D */
+ { 0x05, 0xFF, aImplUniToDBCSTab_JIS0208_6E }, /* 0x6E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_JIS0208_6F }, /* 0x6F */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JIS0208_70 }, /* 0x70 */
+ { 0x09, 0xFF, aImplUniToDBCSTab_JIS0208_71 }, /* 0x71 */
+ { 0x06, 0xFD, aImplUniToDBCSTab_JIS0208_72 }, /* 0x72 */
+ { 0x0A, 0xFE, aImplUniToDBCSTab_JIS0208_73 }, /* 0x73 */
+ { 0x03, 0xF8, aImplUniToDBCSTab_JIS0208_74 }, /* 0x74 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_JIS0208_75 }, /* 0x75 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_JIS0208_76 }, /* 0x76 */
+ { 0x01, 0xFC, aImplUniToDBCSTab_JIS0208_77 }, /* 0x77 */
+ { 0x02, 0xFD, aImplUniToDBCSTab_JIS0208_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_JIS0208_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0208_7A }, /* 0x7A */
+ { 0x02, 0xF7, aImplUniToDBCSTab_JIS0208_7B }, /* 0x7B */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0208_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_JIS0208_7D }, /* 0x7D */
+ { 0x01, 0x9C, aImplUniToDBCSTab_JIS0208_7E }, /* 0x7E */
+ { 0x36, 0xFC, aImplUniToDBCSTab_JIS0208_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0208_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_JIS0208_81 }, /* 0x81 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_JIS0208_82 }, /* 0x82 */
+ { 0x02, 0xFD, aImplUniToDBCSTab_JIS0208_83 }, /* 0x83 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_JIS0208_84 }, /* 0x84 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0208_85 }, /* 0x85 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_JIS0208_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0208_87 }, /* 0x87 */
+ { 0x05, 0xFE, aImplUniToDBCSTab_JIS0208_88 }, /* 0x88 */
+ { 0x02, 0xF8, aImplUniToDBCSTab_JIS0208_89 }, /* 0x89 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0208_8A }, /* 0x8A */
+ { 0x00, 0x9A, aImplUniToDBCSTab_JIS0208_8B }, /* 0x8B */
+ { 0x37, 0xFD, aImplUniToDBCSTab_JIS0208_8C }, /* 0x8C */
+ { 0x04, 0xFF, aImplUniToDBCSTab_JIS0208_8D }, /* 0x8D */
+ { 0x08, 0xFE, aImplUniToDBCSTab_JIS0208_8E }, /* 0x8E */
+ { 0x03, 0xFD, aImplUniToDBCSTab_JIS0208_8F }, /* 0x8F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0208_90 }, /* 0x90 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0208_91 }, /* 0x91 */
+ { 0x0D, 0xFC, aImplUniToDBCSTab_JIS0208_92 }, /* 0x92 */
+ { 0x06, 0xE8, aImplUniToDBCSTab_JIS0208_93 }, /* 0x93 */
+ { 0x03, 0x81, aImplUniToDBCSTab_JIS0208_94 }, /* 0x94 */
+ { 0x77, 0xE5, aImplUniToDBCSTab_JIS0208_95 }, /* 0x95 */
+ { 0x1C, 0xFB, aImplUniToDBCSTab_JIS0208_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0208_97 }, /* 0x97 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_JIS0208_98 }, /* 0x98 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_JIS0208_99 }, /* 0x99 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_JIS0208_9A }, /* 0x9A */
+ { 0x06, 0xF5, aImplUniToDBCSTab_JIS0208_9B }, /* 0x9B */
+ { 0x04, 0xF6, aImplUniToDBCSTab_JIS0208_9C }, /* 0x9C */
+ { 0x03, 0xFD, aImplUniToDBCSTab_JIS0208_9D }, /* 0x9D */
+ { 0x1A, 0xFD, aImplUniToDBCSTab_JIS0208_9E }, /* 0x9E */
+ { 0x07, 0xA0, aImplUniToDBCSTab_JIS0208_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 1, 0, NULL }, /* 0xF9 */
+ { 1, 0, NULL }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 1, 0, NULL }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_JIS0208_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSToUniLeadTab const aJIS0212UniLeadTab[128] =
+{
+ { 0, 1, 0, NULL }, /* 0x00 */
+ { 0, 1, 0, NULL }, /* 0x01 */
+ { 0, 1, 0, NULL }, /* 0x02 */
+ { 0, 1, 0, NULL }, /* 0x03 */
+ { 0, 1, 0, NULL }, /* 0x04 */
+ { 0, 1, 0, NULL }, /* 0x05 */
+ { 0, 1, 0, NULL }, /* 0x06 */
+ { 0, 1, 0, NULL }, /* 0x07 */
+ { 0, 1, 0, NULL }, /* 0x08 */
+ { 0, 1, 0, NULL }, /* 0x09 */
+ { 0, 1, 0, NULL }, /* 0x0A */
+ { 0, 1, 0, NULL }, /* 0x0B */
+ { 0, 1, 0, NULL }, /* 0x0C */
+ { 0, 1, 0, NULL }, /* 0x0D */
+ { 0, 1, 0, NULL }, /* 0x0E */
+ { 0, 1, 0, NULL }, /* 0x0F */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x10 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x11 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x12 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x13 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x14 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x15 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x16 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x17 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x18 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x19 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x1F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x20 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x21 */ /* We convert this as double byte */
+ { 0, 0x2F, 0x71, aImplDBCSToUniTab_JIS0212_22 }, /* 0x22 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x23 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x24 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x25 */ /* We convert this as double byte */
+ { 0, 0x61, 0x7C, aImplDBCSToUniTab_JIS0212_26 }, /* 0x26 */
+ { 0, 0x42, 0x7E, aImplDBCSToUniTab_JIS0212_27 }, /* 0x27 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x28 */ /* We convert this as double byte */
+ { 0, 0x21, 0x50, aImplDBCSToUniTab_JIS0212_29 }, /* 0x29 */
+ { 0, 0x21, 0x77, aImplDBCSToUniTab_JIS0212_2A }, /* 0x2A */
+ { 0, 0x21, 0x77, aImplDBCSToUniTab_JIS0212_2B }, /* 0x2B */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x2F */ /* We convert this as double byte */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_30 }, /* 0x30 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_31 }, /* 0x31 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_32 }, /* 0x32 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_33 }, /* 0x33 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_34 }, /* 0x34 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_35 }, /* 0x35 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_36 }, /* 0x36 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_37 }, /* 0x37 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_38 }, /* 0x38 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_39 }, /* 0x39 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_3A }, /* 0x3A */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_3B }, /* 0x3B */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_3C }, /* 0x3C */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_3D }, /* 0x3D */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_3E }, /* 0x3E */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_3F }, /* 0x3F */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_40 }, /* 0x40 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_41 }, /* 0x41 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_42 }, /* 0x42 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_43 }, /* 0x43 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_44 }, /* 0x44 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_45 }, /* 0x45 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_46 }, /* 0x46 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_47 }, /* 0x47 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_48 }, /* 0x48 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_49 }, /* 0x49 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_4A }, /* 0x4A */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_4B }, /* 0x4B */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_4C }, /* 0x4C */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_4D }, /* 0x4D */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_4E }, /* 0x4E */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_4F }, /* 0x4F */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_50 }, /* 0x50 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_51 }, /* 0x51 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_52 }, /* 0x52 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_53 }, /* 0x53 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_54 }, /* 0x54 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_55 }, /* 0x55 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_56 }, /* 0x56 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_57 }, /* 0x57 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_58 }, /* 0x58 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_59 }, /* 0x59 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_5A }, /* 0x5A */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_5B }, /* 0x5B */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_5C }, /* 0x5C */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_5D }, /* 0x5D */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_5E }, /* 0x5E */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_5F }, /* 0x5F */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_60 }, /* 0x60 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_61 }, /* 0x61 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_62 }, /* 0x62 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_63 }, /* 0x63 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_64 }, /* 0x64 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_65 }, /* 0x65 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_66 }, /* 0x66 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_67 }, /* 0x67 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_68 }, /* 0x68 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_69 }, /* 0x69 */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_6A }, /* 0x6A */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_6B }, /* 0x6B */
+ { 0, 0x21, 0x7E, aImplDBCSToUniTab_JIS0212_6C }, /* 0x6C */
+ { 0, 0x21, 0x63, aImplDBCSToUniTab_JIS0212_6D }, /* 0x6D */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x6E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x6F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x70 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x71 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x72 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x73 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x74 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x75 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x76 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x77 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x78 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x79 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x7E */ /* We convert this as double byte */
+ { 0, 1, 0, NULL } /* 0x7F */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aJIS0212DBCSHighTab[256] =
+{
+ { 0xA1, 0xFF, aImplUniToDBCSTab_JIS0212_00 }, /* 0x00 */
+ { 0x00, 0xF5, aImplUniToDBCSTab_JIS0212_01 }, /* 0x01 */
+ { 0xC7, 0xDD, aImplUniToDBCSTab_JIS0212_02 }, /* 0x02 */
+ { 0x84, 0xCE, aImplUniToDBCSTab_JIS0212_03 }, /* 0x03 */
+ { 0x02, 0x5F, aImplUniToDBCSTab_JIS0212_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 1, 0, NULL }, /* 0x20 */
+ { 0x16, 0x22, aImplUniToDBCSTab_JIS0212_21 }, /* 0x21 */
+ { 1, 0, NULL }, /* 0x22 */
+ { 1, 0, NULL }, /* 0x23 */
+ { 1, 0, NULL }, /* 0x24 */
+ { 1, 0, NULL }, /* 0x25 */
+ { 1, 0, NULL }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 1, 0, NULL }, /* 0x30 */
+ { 1, 0, NULL }, /* 0x31 */
+ { 1, 0, NULL }, /* 0x32 */
+ { 1, 0, NULL }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0212_4E }, /* 0x4E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0212_4F }, /* 0x4F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0212_50 }, /* 0x50 */
+ { 0x03, 0xF7, aImplUniToDBCSTab_JIS0212_51 }, /* 0x51 */
+ { 0x01, 0xF7, aImplUniToDBCSTab_JIS0212_52 }, /* 0x52 */
+ { 0x00, 0xF5, aImplUniToDBCSTab_JIS0212_53 }, /* 0x53 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0212_54 }, /* 0x54 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0212_55 }, /* 0x55 */
+ { 0x05, 0xF7, aImplUniToDBCSTab_JIS0212_56 }, /* 0x56 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_JIS0212_57 }, /* 0x57 */
+ { 0x03, 0xF3, aImplUniToDBCSTab_JIS0212_58 }, /* 0x58 */
+ { 0x05, 0xF7, aImplUniToDBCSTab_JIS0212_59 }, /* 0x59 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0212_5A }, /* 0x5A */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0212_5B }, /* 0x5B */
+ { 0x0C, 0xF4, aImplUniToDBCSTab_JIS0212_5C }, /* 0x5C */
+ { 0x01, 0xF9, aImplUniToDBCSTab_JIS0212_5D }, /* 0x5D */
+ { 0x00, 0xEB, aImplUniToDBCSTab_JIS0212_5E }, /* 0x5E */
+ { 0x02, 0xFC, aImplUniToDBCSTab_JIS0212_5F }, /* 0x5F */
+ { 0x07, 0xFD, aImplUniToDBCSTab_JIS0212_60 }, /* 0x60 */
+ { 0x02, 0xEF, aImplUniToDBCSTab_JIS0212_61 }, /* 0x61 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JIS0212_62 }, /* 0x62 */
+ { 0x03, 0xF9, aImplUniToDBCSTab_JIS0212_63 }, /* 0x63 */
+ { 0x09, 0xFF, aImplUniToDBCSTab_JIS0212_64 }, /* 0x64 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_JIS0212_65 }, /* 0x65 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_JIS0212_66 }, /* 0x66 */
+ { 0x05, 0xF9, aImplUniToDBCSTab_JIS0212_67 }, /* 0x67 */
+ { 0x04, 0xFD, aImplUniToDBCSTab_JIS0212_68 }, /* 0x68 */
+ { 0x06, 0xFE, aImplUniToDBCSTab_JIS0212_69 }, /* 0x69 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0212_6A }, /* 0x6A */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0212_6B }, /* 0x6B */
+ { 0x02, 0xF4, aImplUniToDBCSTab_JIS0212_6C }, /* 0x6C */
+ { 0x04, 0xFC, aImplUniToDBCSTab_JIS0212_6D }, /* 0x6D */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0212_6E }, /* 0x6E */
+ { 0x04, 0xFD, aImplUniToDBCSTab_JIS0212_6F }, /* 0x6F */
+ { 0x00, 0xFA, aImplUniToDBCSTab_JIS0212_70 }, /* 0x70 */
+ { 0x03, 0xFE, aImplUniToDBCSTab_JIS0212_71 }, /* 0x71 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0212_72 }, /* 0x72 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0212_73 }, /* 0x73 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0212_74 }, /* 0x74 */
+ { 0x06, 0xF9, aImplUniToDBCSTab_JIS0212_75 }, /* 0x75 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_JIS0212_76 }, /* 0x76 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_JIS0212_77 }, /* 0x77 */
+ { 0x05, 0xFF, aImplUniToDBCSTab_JIS0212_78 }, /* 0x78 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_JIS0212_79 }, /* 0x79 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_JIS0212_7A }, /* 0x7A */
+ { 0x07, 0xFE, aImplUniToDBCSTab_JIS0212_7B }, /* 0x7B */
+ { 0x01, 0xF5, aImplUniToDBCSTab_JIS0212_7C }, /* 0x7C */
+ { 0x03, 0xFA, aImplUniToDBCSTab_JIS0212_7D }, /* 0x7D */
+ { 0x00, 0x9E, aImplUniToDBCSTab_JIS0212_7E }, /* 0x7E */
+ { 0x3B, 0xFF, aImplUniToDBCSTab_JIS0212_7F }, /* 0x7F */
+ { 0x07, 0xFE, aImplUniToDBCSTab_JIS0212_80 }, /* 0x80 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_JIS0212_81 }, /* 0x81 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0212_82 }, /* 0x82 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_JIS0212_83 }, /* 0x83 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JIS0212_84 }, /* 0x84 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0212_85 }, /* 0x85 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0212_86 }, /* 0x86 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_JIS0212_87 }, /* 0x87 */
+ { 0x01, 0xF7, aImplUniToDBCSTab_JIS0212_88 }, /* 0x88 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_JIS0212_89 }, /* 0x89 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_JIS0212_8A }, /* 0x8A */
+ { 0x05, 0x9F, aImplUniToDBCSTab_JIS0212_8B }, /* 0x8B */
+ { 0x38, 0xFF, aImplUniToDBCSTab_JIS0212_8C }, /* 0x8C */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JIS0212_8D }, /* 0x8D */
+ { 0x01, 0xFA, aImplUniToDBCSTab_JIS0212_8E }, /* 0x8E */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JIS0212_8F }, /* 0x8F */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0212_90 }, /* 0x90 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0212_91 }, /* 0x91 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0212_92 }, /* 0x92 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JIS0212_93 }, /* 0x93 */
+ { 0x01, 0x84, aImplUniToDBCSTab_JIS0212_94 }, /* 0x94 */
+ { 0x78, 0xE6, aImplUniToDBCSTab_JIS0212_95 }, /* 0x95 */
+ { 0x1D, 0xFA, aImplUniToDBCSTab_JIS0212_96 }, /* 0x96 */
+ { 0x02, 0xFA, aImplUniToDBCSTab_JIS0212_97 }, /* 0x97 */
+ { 0x07, 0xF6, aImplUniToDBCSTab_JIS0212_98 }, /* 0x98 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_JIS0212_99 }, /* 0x99 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0212_9A }, /* 0x9A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JIS0212_9B }, /* 0x9B */
+ { 0x00, 0xF9, aImplUniToDBCSTab_JIS0212_9C }, /* 0x9C */
+ { 0x02, 0xFE, aImplUniToDBCSTab_JIS0212_9D }, /* 0x9D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JIS0212_9E }, /* 0x9E */
+ { 0x02, 0xA5, aImplUniToDBCSTab_JIS0212_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 1, 0, NULL }, /* 0xF9 */
+ { 1, 0, NULL }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 1, 0, NULL }, /* 0xFE */
+ { 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplEUCJPConvertData const aImplEUCJPCvtData =
+{
+ aJIS0208UniLeadTab,
+ aJIS0212UniLeadTab,
+ aJIS0208DBCSHighTab,
+ aJIS0212DBCSHighTab
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplEUCJPTextEncodingData
+ = { { &aImplEUCJPCvtData,
+ ImplEUCJPToUnicode,
+ ImplUnicodeToEUCJP,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 3,
+ 2,
+ 128,
+ "euc-jp",
+ "euc-jp",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_JAPANESE, pc code page 932, mac encoding 1 */
+
+/* ======================================================================= */
+
+/* !!! JIS - X Encodings not complete !!! */
+
+#define HALFWIDTHKANA_START 0xFF61
+#define HALFWIDTHKANA_END 0xFF9F
+
+static sal_uChar const aImplJISX0201Tab[HALFWIDTHKANA_END - HALFWIDTHKANA_START + 1] =
+{
+ 0xA1, 0xA2, 0xA3, 0xA4, 0x5A, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplJISX0201ByteCvtData =
+{
+ NULL,
+ NULL,
+ 0, 0,
+ 0, 0,
+ aImplJISX0201Tab,
+ NULL,
+ NULL,
+ HALFWIDTHKANA_START, HALFWIDTHKANA_END,
+ 0, 0,
+ 0
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplJISX0201TextEncodingData
+ = { { &aImplJISX0201ByteCvtData,
+ NULL,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 128,
+ "euc-jp",
+ "euc-jp",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* SCRIPT_JAPANESE, pc code page 932, mac encoding 1 */
+
+/* ======================================================================= */
+
+static ImplDBCSConvertData const aImplJISX0208DBCSCvtData =
+{
+ NULL,
+ aJIS0208DBCSHighTab,
+ 0x00, 0xFF,
+ 0x21, 0x7E,
+ NULL,
+ 0
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplJISX0208TextEncodingData
+ = { { &aImplJISX0208DBCSCvtData,
+ NULL,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 2,
+ 2,
+ 2,
+ 128,
+ "euc-jp",
+ "euc-jp",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* SCRIPT_JAPANESE, pc code page 932, mac encoding 1 */
+
+/* ======================================================================= */
+
+static ImplDBCSConvertData const aImplJISX0212DBCSCvtData =
+{
+ NULL,
+ aJIS0212DBCSHighTab,
+ 0x00, 0xFF,
+ 0x21, 0x7E,
+ NULL,
+ 0
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplJISX0212TextEncodingData
+ = { { &aImplJISX0212DBCSCvtData,
+ NULL,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 2,
+ 2,
+ 2,
+ 128,
+ "euc-jp",
+ "euc-jp",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* SCRIPT_JAPANESE, pc code page 932, mac encoding 1 */
diff --git a/sal/textenc/tcvtkr1.tab b/sal/textenc/tcvtkr1.tab
new file mode 100644
index 000000000000..b7aacdf69abf
--- /dev/null
+++ b/sal/textenc/tcvtkr1.tab
@@ -0,0 +1,3323 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* Mapping tables from KS X 1001:1992 (formerly known as KS C 5601-1992) to
+ Unicode.
+
+ The mappings are suitable for the EUC-KR encoding (first and second byte
+ each ranging from 0xA1 to 0xFE), and for ISO-2022-KR if you subtract
+ accordingly. But note that the tables are too "large" for both EUC-KR and
+ ISO-2022-KR (and map undefined input to Unicode code points), because they
+ also support UHC.
+
+ The mappings also include UHC encoding (Unified Hangul Code, also known as
+ Microsoft Code Page 949), which is a superset of EUC-KR (extra first byte
+ range 0x81 to 0xA0, extra second byte ranges 0x41 to 0x5A, 0x61 to 0x7A,
+ and 0x81 to 0xA0, even within the original EUC-KR area).
+
+ The mappings are also used for the HangulTalk encoding (Macintosh), altough
+ this contains some other EUC-KR extensions (that are thus not supported):
+ special single byte characters 0x81, 0x82, 0x83, 0xFE, and 0xFF; extra
+ double byte characters within first byte range 0xA1 to 0xAD and second byte
+ range 0x41 to 0xFE, even within the original EUC-KR area).
+ */
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAC02, 0xAC03, 0xAC05, 0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, /* 0x40 */
+ 0xAC0E, 0xAC0F, 0xAC18, 0xAC1E, 0xAC1F, 0xAC21, 0xAC22, 0xAC23, /* 0x40 */
+ 0xAC25, 0xAC26, 0xAC27, 0xAC28, 0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, /* 0x50 */
+ 0xAC32, 0xAC33, 0xAC34, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xAC35, 0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, /* 0x60 */
+ 0xAC3F, 0xAC41, 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, /* 0x60 */
+ 0xAC48, 0xAC49, 0xAC4A, 0xAC4C, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, /* 0x70 */
+ 0xAC52, 0xAC53, 0xAC55, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xAC56, 0xAC57, 0xAC59, 0xAC5A, 0xAC5B, 0xAC5D, 0xAC5E, /* 0x80 */
+ 0xAC5F, 0xAC60, 0xAC61, 0xAC62, 0xAC63, 0xAC64, 0xAC65, 0xAC66, /* 0x80 */
+ 0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E, /* 0x90 */
+ 0xAC6F, 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, 0xAC7B, 0xAC7C, /* 0x90 */
+ 0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, 0xAC8E, /* 0xA0 */
+ 0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98, /* 0xA0 */
+ 0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5, /* 0xB0 */
+ 0xACA6, 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3, /* 0xB0 */
+ 0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0, /* 0xC0 */
+ 0xACC2, 0xACC3, 0xACC5, 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB, /* 0xC0 */
+ 0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, 0xACD3, 0xACD4, /* 0xD0 */
+ 0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE, /* 0xD0 */
+ 0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, 0xACEB, 0xACED, /* 0xE0 */
+ 0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB, /* 0xE0 */
+ 0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08, /* 0xF0 */
+ 0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAD14, 0xAD15, 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, /* 0x40 */
+ 0xAD1D, 0xAD1E, 0xAD1F, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, /* 0x40 */
+ 0xAD26, 0xAD27, 0xAD28, 0xAD2A, 0xAD2B, 0xAD2E, 0xAD2F, 0xAD30, /* 0x50 */
+ 0xAD31, 0xAD32, 0xAD33, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xAD36, 0xAD37, 0xAD39, 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E, /* 0x60 */
+ 0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, 0xAD46, 0xAD48, 0xAD4A, /* 0x60 */
+ 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, 0xAD52, 0xAD53, /* 0x70 */
+ 0xAD55, 0xAD56, 0xAD57, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E, 0xAD5F, /* 0x80 */
+ 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67, 0xAD68, 0xAD69, /* 0x80 */
+ 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72, 0xAD77, 0xAD78, /* 0x90 */
+ 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84, 0xAD85, 0xAD86, /* 0x90 */
+ 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F, 0xAD91, 0xAD92, /* 0xA0 */
+ 0xAD93, 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98, 0xAD99, 0xAD9A, /* 0xA0 */
+ 0xAD9B, 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2, 0xADA3, 0xADA5, /* 0xB0 */
+ 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, 0xADAB, 0xADAC, 0xADAD, /* 0xB0 */
+ 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2, 0xADB3, 0xADB4, 0xADB5, /* 0xC0 */
+ 0xADB6, 0xADB8, 0xADB9, 0xADBA, 0xADBB, 0xADBC, 0xADBD, 0xADBE, /* 0xC0 */
+ 0xADBF, 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7, 0xADC9, 0xADCA, /* 0xD0 */
+ 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2, 0xADD4, 0xADD5, /* 0xD0 */
+ 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB, 0xADDD, 0xADDE, /* 0xE0 */
+ 0xADDF, 0xADE1, 0xADE2, 0xADE3, 0xADE5, 0xADE6, 0xADE7, 0xADE8, /* 0xE0 */
+ 0xADE9, 0xADEA, 0xADEB, 0xADEC, 0xADED, 0xADEE, 0xADEF, 0xADF0, /* 0xF0 */
+ 0xADF1, 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6, 0xADF7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xADFA, 0xADFB, 0xADFD, 0xADFE, 0xAE02, 0xAE03, 0xAE04, /* 0x40 */
+ 0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, 0xAE0F, 0xAE10, /* 0x40 */
+ 0xAE11, 0xAE12, 0xAE13, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19, /* 0x50 */
+ 0xAE1A, 0xAE1B, 0xAE1C, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21, 0xAE22, 0xAE23, /* 0x60 */
+ 0xAE24, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29, 0xAE2A, 0xAE2B, /* 0x60 */
+ 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0xAE32, 0xAE33, 0xAE35, 0xAE36, /* 0x70 */
+ 0xAE39, 0xAE3B, 0xAE3C, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xAE3D, 0xAE3E, 0xAE3F, 0xAE42, 0xAE44, 0xAE47, 0xAE48, /* 0x80 */
+ 0xAE49, 0xAE4B, 0xAE4F, 0xAE51, 0xAE52, 0xAE53, 0xAE55, 0xAE57, /* 0x80 */
+ 0xAE58, 0xAE59, 0xAE5A, 0xAE5B, 0xAE5E, 0xAE62, 0xAE63, 0xAE64, /* 0x90 */
+ 0xAE66, 0xAE67, 0xAE6A, 0xAE6B, 0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, /* 0x90 */
+ 0xAE72, 0xAE73, 0xAE74, 0xAE75, 0xAE76, 0xAE77, 0xAE7A, 0xAE7E, /* 0xA0 */
+ 0xAE7F, 0xAE80, 0xAE81, 0xAE82, 0xAE83, 0xAE86, 0xAE87, 0xAE88, /* 0xA0 */
+ 0xAE89, 0xAE8A, 0xAE8B, 0xAE8D, 0xAE8E, 0xAE8F, 0xAE90, 0xAE91, /* 0xB0 */
+ 0xAE92, 0xAE93, 0xAE94, 0xAE95, 0xAE96, 0xAE97, 0xAE98, 0xAE99, /* 0xB0 */
+ 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D, 0xAE9E, 0xAE9F, 0xAEA0, 0xAEA1, /* 0xC0 */
+ 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5, 0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, /* 0xC0 */
+ 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD, 0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, /* 0xD0 */
+ 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5, 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, /* 0xD0 */
+ 0xAEBA, 0xAEBB, 0xAEBF, 0xAEC1, 0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, /* 0xE0 */
+ 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA, 0xAECB, 0xAECE, 0xAED2, 0xAED3, /* 0xE0 */
+ 0xAED4, 0xAED5, 0xAED6, 0xAED7, 0xAEDA, 0xAEDB, 0xAEDD, 0xAEDE, /* 0xF0 */
+ 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2, 0xAEE3, 0xAEE4, 0xAEE5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAEE6, 0xAEE7, 0xAEE9, 0xAEEA, 0xAEEC, 0xAEEE, 0xAEEF, /* 0x40 */
+ 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6, 0xAEF7, 0xAEF9, /* 0x40 */
+ 0xAEFA, 0xAEFB, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00, 0xAF01, 0xAF02, /* 0x50 */
+ 0xAF03, 0xAF04, 0xAF05, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xAF06, 0xAF09, 0xAF0A, 0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, /* 0x60 */
+ 0xAF11, 0xAF12, 0xAF13, 0xAF14, 0xAF15, 0xAF16, 0xAF17, 0xAF18, /* 0x60 */
+ 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C, 0xAF1D, 0xAF1E, 0xAF1F, 0xAF20, /* 0x70 */
+ 0xAF21, 0xAF22, 0xAF23, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xAF24, 0xAF25, 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, /* 0x80 */
+ 0xAF2B, 0xAF2E, 0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, /* 0x80 */
+ 0xAF38, 0xAF39, 0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, /* 0x90 */
+ 0xAF46, 0xAF47, 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, /* 0x90 */
+ 0xAF51, 0xAF52, 0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, /* 0xA0 */
+ 0xAF59, 0xAF5A, 0xAF5B, 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, /* 0xA0 */
+ 0xAF63, 0xAF66, 0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, /* 0xB0 */
+ 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70, 0xAF71, 0xAF72, 0xAF73, 0xAF74, /* 0xB0 */
+ 0xAF75, 0xAF76, 0xAF77, 0xAF78, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, /* 0xC0 */
+ 0xAF7E, 0xAF7F, 0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, /* 0xC0 */
+ 0xAF89, 0xAF8A, 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, /* 0xD0 */
+ 0xAF93, 0xAF94, 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, /* 0xD0 */
+ 0xAF9D, 0xAF9E, 0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, /* 0xE0 */
+ 0xAFA5, 0xAFA6, 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, /* 0xE0 */
+ 0xAFAD, 0xAFAE, 0xAFAF, 0xAFB0, 0xAFB1, 0xAFB2, 0xAFB3, 0xAFB4, /* 0xF0 */
+ 0xAFB5, 0xAFB6, 0xAFB7, 0xAFBA, 0xAFBB, 0xAFBD, 0xAFBE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAFBF, 0xAFC1, 0xAFC2, 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, /* 0x40 */
+ 0xAFCA, 0xAFCC, 0xAFCF, 0xAFD0, 0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, /* 0x40 */
+ 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9, 0xAFDA, 0xAFDB, 0xAFDD, 0xAFDE, /* 0x50 */
+ 0xAFDF, 0xAFE0, 0xAFE1, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xAFE2, 0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFEA, /* 0x60 */
+ 0xAFEB, 0xAFEC, 0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, /* 0x60 */
+ 0xAFF6, 0xAFF7, 0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, /* 0x70 */
+ 0xAFFF, 0xB002, 0xB003, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB005, 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B, /* 0x80 */
+ 0xB00D, 0xB00E, 0xB00F, 0xB011, 0xB012, 0xB013, 0xB015, 0xB016, /* 0x80 */
+ 0xB017, 0xB018, 0xB019, 0xB01A, 0xB01B, 0xB01E, 0xB01F, 0xB020, /* 0x90 */
+ 0xB021, 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027, 0xB029, /* 0x90 */
+ 0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, 0xB02F, 0xB030, 0xB031, /* 0xA0 */
+ 0xB032, 0xB033, 0xB034, 0xB035, 0xB036, 0xB037, 0xB038, 0xB039, /* 0xA0 */
+ 0xB03A, 0xB03B, 0xB03C, 0xB03D, 0xB03E, 0xB03F, 0xB040, 0xB041, /* 0xB0 */
+ 0xB042, 0xB043, 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F, /* 0xB0 */
+ 0xB050, 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C, /* 0xC0 */
+ 0xB05E, 0xB05F, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065, /* 0xC0 */
+ 0xB066, 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D, /* 0xD0 */
+ 0xB06E, 0xB06F, 0xB070, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075, /* 0xD0 */
+ 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, 0xB07E, 0xB07F, /* 0xE0 */
+ 0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089, /* 0xE0 */
+ 0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, 0xB095, /* 0xF0 */
+ 0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB0A5, 0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, /* 0x40 */
+ 0xB0B7, 0xB0B9, 0xB0BA, 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, /* 0x40 */
+ 0xB0C1, 0xB0C2, 0xB0C3, 0xB0C6, 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, /* 0x50 */
+ 0xB0CE, 0xB0CF, 0xB0D2, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB0D3, 0xB0D5, 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB, /* 0x60 */
+ 0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4, /* 0x60 */
+ 0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, 0xB0EC, 0xB0ED, /* 0x70 */
+ 0xB0EE, 0xB0EF, 0xB0F0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB0F1, 0xB0F2, 0xB0F3, 0xB0F4, 0xB0F5, 0xB0F6, 0xB0F7, /* 0x80 */
+ 0xB0F8, 0xB0F9, 0xB0FA, 0xB0FB, 0xB0FC, 0xB0FD, 0xB0FE, 0xB0FF, /* 0x80 */
+ 0xB100, 0xB101, 0xB102, 0xB103, 0xB104, 0xB105, 0xB106, 0xB107, /* 0x90 */
+ 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114, 0xB115, 0xB116, /* 0x90 */
+ 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121, 0xB122, 0xB126, /* 0xA0 */
+ 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E, 0xB12F, 0xB130, /* 0xA0 */
+ 0xB131, 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B, 0xB13C, 0xB13D, /* 0xB0 */
+ 0xB13E, 0xB13F, 0xB142, 0xB143, 0xB145, 0xB146, 0xB147, 0xB149, /* 0xB0 */
+ 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, 0xB14F, 0xB152, 0xB153, /* 0xC0 */
+ 0xB156, 0xB157, 0xB159, 0xB15A, 0xB15B, 0xB15D, 0xB15E, 0xB15F, /* 0xC0 */
+ 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, 0xB166, 0xB167, 0xB168, /* 0xD0 */
+ 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E, 0xB16F, 0xB170, /* 0xD0 */
+ 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, 0xB176, 0xB177, 0xB17A, /* 0xE0 */
+ 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183, 0xB184, 0xB185, /* 0xE0 */
+ 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F, 0xB190, 0xB191, /* 0xF0 */
+ 0xB195, 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B, 0xB19D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4, /* 0x40 */
+ 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A9, 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD, /* 0x40 */
+ 0xB1AE, 0xB1AF, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5, /* 0x50 */
+ 0xB1B6, 0xB1B7, 0xB1B8, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD, 0xB1BE, 0xB1BF, /* 0x60 */
+ 0xB1C0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5, 0xB1C6, 0xB1C7, /* 0x60 */
+ 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CD, 0xB1CE, 0xB1CF, 0xB1D1, /* 0x70 */
+ 0xB1D2, 0xB1D3, 0xB1D5, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB1D6, 0xB1D7, 0xB1D8, 0xB1D9, 0xB1DA, 0xB1DB, 0xB1DE, /* 0x80 */
+ 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3, 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, /* 0x80 */
+ 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE, 0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, /* 0x90 */
+ 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7, 0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, /* 0x90 */
+ 0xB1FF, 0xB200, 0xB201, 0xB202, 0xB203, 0xB206, 0xB207, 0xB209, /* 0xA0 */
+ 0xB20A, 0xB20D, 0xB20E, 0xB20F, 0xB210, 0xB211, 0xB212, 0xB213, /* 0xA0 */
+ 0xB216, 0xB218, 0xB21A, 0xB21B, 0xB21C, 0xB21D, 0xB21E, 0xB21F, /* 0xB0 */
+ 0xB221, 0xB222, 0xB223, 0xB224, 0xB225, 0xB226, 0xB227, 0xB228, /* 0xB0 */
+ 0xB229, 0xB22A, 0xB22B, 0xB22C, 0xB22D, 0xB22E, 0xB22F, 0xB230, /* 0xC0 */
+ 0xB231, 0xB232, 0xB233, 0xB235, 0xB236, 0xB237, 0xB238, 0xB239, /* 0xC0 */
+ 0xB23A, 0xB23B, 0xB23D, 0xB23E, 0xB23F, 0xB240, 0xB241, 0xB242, /* 0xD0 */
+ 0xB243, 0xB244, 0xB245, 0xB246, 0xB247, 0xB248, 0xB249, 0xB24A, /* 0xD0 */
+ 0xB24B, 0xB24C, 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251, 0xB252, /* 0xE0 */
+ 0xB253, 0xB254, 0xB255, 0xB256, 0xB257, 0xB259, 0xB25A, 0xB25B, /* 0xE0 */
+ 0xB25D, 0xB25E, 0xB25F, 0xB261, 0xB262, 0xB263, 0xB264, 0xB265, /* 0xF0 */
+ 0xB266, 0xB267, 0xB26A, 0xB26B, 0xB26C, 0xB26D, 0xB26E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273, 0xB276, 0xB277, /* 0x40 */
+ 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E, 0xB27F, 0xB280, /* 0x40 */
+ 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288, 0xB28A, 0xB28B, /* 0x50 */
+ 0xB28C, 0xB28D, 0xB28E, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB28F, 0xB292, 0xB293, 0xB295, 0xB296, 0xB297, 0xB29B, /* 0x60 */
+ 0xB29C, 0xB29D, 0xB29E, 0xB29F, 0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, /* 0x60 */
+ 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE, 0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, /* 0x70 */
+ 0xB2B5, 0xB2B6, 0xB2B7, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB2B8, 0xB2B9, 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2BE, /* 0x80 */
+ 0xB2BF, 0xB2C0, 0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, /* 0x80 */
+ 0xB2C7, 0xB2CA, 0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, /* 0x90 */
+ 0xB2D4, 0xB2D5, 0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, /* 0x90 */
+ 0xB2E0, 0xB2E1, 0xB2E3, 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, /* 0xA0 */
+ 0xB2F2, 0xB2F6, 0xB2FC, 0xB2FD, 0xB2FE, 0xB302, 0xB303, 0xB305, /* 0xA0 */
+ 0xB306, 0xB307, 0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, /* 0xB0 */
+ 0xB30F, 0xB312, 0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, /* 0xB0 */
+ 0xB31D, 0xB31E, 0xB31F, 0xB320, 0xB321, 0xB322, 0xB323, 0xB324, /* 0xC0 */
+ 0xB325, 0xB326, 0xB327, 0xB328, 0xB329, 0xB32A, 0xB32B, 0xB32C, /* 0xC0 */
+ 0xB32D, 0xB32E, 0xB32F, 0xB330, 0xB331, 0xB332, 0xB333, 0xB334, /* 0xD0 */
+ 0xB335, 0xB336, 0xB337, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, /* 0xD0 */
+ 0xB33D, 0xB33E, 0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, /* 0xE0 */
+ 0xB345, 0xB346, 0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, /* 0xE0 */
+ 0xB34D, 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0xB357, /* 0xF0 */
+ 0xB359, 0xB35A, 0xB35D, 0xB360, 0xB361, 0xB362, 0xB363 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB366, 0xB368, 0xB36A, 0xB36C, 0xB36D, 0xB36F, 0xB372, /* 0x40 */
+ 0xB373, 0xB375, 0xB376, 0xB377, 0xB379, 0xB37A, 0xB37B, 0xB37C, /* 0x40 */
+ 0xB37D, 0xB37E, 0xB37F, 0xB382, 0xB386, 0xB387, 0xB388, 0xB389, /* 0x50 */
+ 0xB38A, 0xB38B, 0xB38D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB38E, 0xB38F, 0xB391, 0xB392, 0xB393, 0xB395, 0xB396, /* 0x60 */
+ 0xB397, 0xB398, 0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, 0xB39E, /* 0x60 */
+ 0xB39F, 0xB3A2, 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, /* 0x70 */
+ 0xB3AA, 0xB3AB, 0xB3AD, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB3AE, 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4, /* 0x80 */
+ 0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC, /* 0x80 */
+ 0xB3BD, 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0xB3C6, /* 0x90 */
+ 0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3, /* 0x90 */
+ 0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, 0xB3DF, 0xB3E1, 0xB3E2, /* 0xA0 */
+ 0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC, /* 0xA0 */
+ 0xB3ED, 0xB3EE, 0xB3EF, 0xB3F0, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4, /* 0xB0 */
+ 0xB3F5, 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0xB3FD, /* 0xB0 */
+ 0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405, /* 0xC0 */
+ 0xB406, 0xB407, 0xB408, 0xB409, 0xB40A, 0xB40B, 0xB40C, 0xB40D, /* 0xC0 */
+ 0xB40E, 0xB40F, 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416, /* 0xD0 */
+ 0xB417, 0xB419, 0xB41A, 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421, /* 0xD0 */
+ 0xB422, 0xB423, 0xB424, 0xB425, 0xB426, 0xB427, 0xB42A, 0xB42C, /* 0xE0 */
+ 0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, 0xB435, /* 0xE0 */
+ 0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, 0xB43B, 0xB43C, 0xB43D, /* 0xF0 */
+ 0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, 0xB443, 0xB444 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB445, 0xB446, 0xB447, 0xB448, 0xB449, 0xB44A, 0xB44B, /* 0x40 */
+ 0xB44C, 0xB44D, 0xB44E, 0xB44F, 0xB452, 0xB453, 0xB455, 0xB456, /* 0x40 */
+ 0xB457, 0xB459, 0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, /* 0x50 */
+ 0xB462, 0xB464, 0xB466, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46D, 0xB46E, /* 0x60 */
+ 0xB46F, 0xB470, 0xB471, 0xB472, 0xB473, 0xB474, 0xB475, 0xB476, /* 0x60 */
+ 0xB477, 0xB478, 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, 0xB47E, /* 0x70 */
+ 0xB47F, 0xB481, 0xB482, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487, 0xB489, 0xB48A, /* 0x80 */
+ 0xB48B, 0xB48C, 0xB48D, 0xB48E, 0xB48F, 0xB490, 0xB491, 0xB492, /* 0x80 */
+ 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, 0xB498, 0xB499, 0xB49A, /* 0x90 */
+ 0xB49B, 0xB49C, 0xB49E, 0xB49F, 0xB4A0, 0xB4A1, 0xB4A2, 0xB4A3, /* 0x90 */
+ 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB, 0xB4AD, 0xB4AE, /* 0xA0 */
+ 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4, 0xB4B6, 0xB4B8, /* 0xA0 */
+ 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF, 0xB4C1, 0xB4C2, /* 0xB0 */
+ 0xB4C3, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA, 0xB4CB, 0xB4CC, /* 0xB0 */
+ 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3, 0xB4D4, 0xB4D6, /* 0xC0 */
+ 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0xB4DE, 0xB4DF, 0xB4E1, /* 0xC0 */
+ 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA, 0xB4EB, 0xB4EE, /* 0xD0 */
+ 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6, 0xB4F7, 0xB4F9, /* 0xD0 */
+ 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, 0xB4FF, 0xB500, 0xB501, /* 0xE0 */
+ 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, 0xB507, 0xB508, 0xB509, /* 0xE0 */
+ 0xB50A, 0xB50B, 0xB50C, 0xB50D, 0xB50E, 0xB50F, 0xB510, 0xB511, /* 0xF0 */
+ 0xB512, 0xB513, 0xB516, 0xB517, 0xB519, 0xB51A, 0xB51D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, 0xB523, 0xB526, /* 0x40 */
+ 0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, 0xB532, 0xB533, 0xB535, /* 0x40 */
+ 0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E, /* 0x50 */
+ 0xB53F, 0xB542, 0xB546, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54E, 0xB54F, 0xB551, /* 0x60 */
+ 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, 0xB558, 0xB559, 0xB55A, /* 0x60 */
+ 0xB55B, 0xB55E, 0xB562, 0xB563, 0xB564, 0xB565, 0xB566, 0xB567, /* 0x70 */
+ 0xB568, 0xB569, 0xB56A, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB56B, 0xB56C, 0xB56D, 0xB56E, 0xB56F, 0xB570, 0xB571, /* 0x80 */
+ 0xB572, 0xB573, 0xB574, 0xB575, 0xB576, 0xB577, 0xB578, 0xB579, /* 0x80 */
+ 0xB57A, 0xB57B, 0xB57C, 0xB57D, 0xB57E, 0xB57F, 0xB580, 0xB581, /* 0x90 */
+ 0xB582, 0xB583, 0xB584, 0xB585, 0xB586, 0xB587, 0xB588, 0xB589, /* 0x90 */
+ 0xB58A, 0xB58B, 0xB58C, 0xB58D, 0xB58E, 0xB58F, 0xB590, 0xB591, /* 0xA0 */
+ 0xB592, 0xB593, 0xB594, 0xB595, 0xB596, 0xB597, 0xB598, 0xB599, /* 0xA0 */
+ 0xB59A, 0xB59B, 0xB59C, 0xB59D, 0xB59E, 0xB59F, 0xB5A2, 0xB5A3, /* 0xB0 */
+ 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A9, 0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, /* 0xB0 */
+ 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8, 0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, /* 0xC0 */
+ 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5, 0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, /* 0xC0 */
+ 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2, 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, /* 0xD0 */
+ 0xB5D7, 0xB5D9, 0xB5DA, 0xB5DB, 0xB5DC, 0xB5DD, 0xB5DE, 0xB5DF, /* 0xD0 */
+ 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3, 0xB5E4, 0xB5E5, 0xB5E6, 0xB5E7, /* 0xE0 */
+ 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB, 0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, /* 0xE0 */
+ 0xB5F1, 0xB5F2, 0xB5F3, 0xB5F4, 0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, /* 0xF0 */
+ 0xB5F9, 0xB5FA, 0xB5FB, 0xB5FC, 0xB5FD, 0xB5FE, 0xB5FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB600, 0xB601, 0xB602, 0xB603, 0xB604, 0xB605, 0xB606, /* 0x40 */
+ 0xB607, 0xB608, 0xB609, 0xB60A, 0xB60B, 0xB60C, 0xB60D, 0xB60E, /* 0x40 */
+ 0xB60F, 0xB612, 0xB613, 0xB615, 0xB616, 0xB617, 0xB619, 0xB61A, /* 0x50 */
+ 0xB61B, 0xB61C, 0xB61D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB61E, 0xB61F, 0xB620, 0xB621, 0xB622, 0xB623, 0xB624, /* 0x60 */
+ 0xB626, 0xB627, 0xB628, 0xB629, 0xB62A, 0xB62B, 0xB62D, 0xB62E, /* 0x60 */
+ 0xB62F, 0xB630, 0xB631, 0xB632, 0xB633, 0xB635, 0xB636, 0xB637, /* 0x70 */
+ 0xB638, 0xB639, 0xB63A, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB63B, 0xB63C, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641, /* 0x80 */
+ 0xB642, 0xB643, 0xB644, 0xB645, 0xB646, 0xB647, 0xB649, 0xB64A, /* 0x80 */
+ 0xB64B, 0xB64C, 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, /* 0x90 */
+ 0xB653, 0xB654, 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, /* 0x90 */
+ 0xB65B, 0xB65C, 0xB65D, 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, /* 0xA0 */
+ 0xB663, 0xB665, 0xB666, 0xB667, 0xB669, 0xB66A, 0xB66B, 0xB66C, /* 0xA0 */
+ 0xB66D, 0xB66E, 0xB66F, 0xB670, 0xB671, 0xB672, 0xB673, 0xB674, /* 0xB0 */
+ 0xB675, 0xB676, 0xB677, 0xB678, 0xB679, 0xB67A, 0xB67B, 0xB67C, /* 0xB0 */
+ 0xB67D, 0xB67E, 0xB67F, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, /* 0xC0 */
+ 0xB685, 0xB686, 0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, /* 0xC0 */
+ 0xB68D, 0xB68E, 0xB68F, 0xB690, 0xB691, 0xB692, 0xB693, 0xB694, /* 0xD0 */
+ 0xB695, 0xB696, 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69E, /* 0xD0 */
+ 0xB69F, 0xB6A1, 0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, /* 0xE0 */
+ 0xB6A9, 0xB6AA, 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B2, 0xB6B3, /* 0xE0 */
+ 0xB6B4, 0xB6B5, 0xB6B6, 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, /* 0xF0 */
+ 0xB6BC, 0xB6BD, 0xB6BE, 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB6C3, 0xB6C4, 0xB6C5, 0xB6C6, 0xB6C7, 0xB6C8, 0xB6C9, /* 0x40 */
+ 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD, 0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, /* 0x40 */
+ 0xB6D2, 0xB6D3, 0xB6D5, 0xB6D6, 0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, /* 0x50 */
+ 0xB6DB, 0xB6DC, 0xB6DD, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB6DE, 0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, /* 0x60 */
+ 0xB6E5, 0xB6E6, 0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, /* 0x60 */
+ 0xB6ED, 0xB6EE, 0xB6EF, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, /* 0x70 */
+ 0xB6F7, 0xB6F9, 0xB6FA, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703, /* 0x80 */
+ 0xB704, 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, 0xB70C, /* 0x80 */
+ 0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712, 0xB713, 0xB714, /* 0x90 */
+ 0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A, 0xB71B, 0xB71C, /* 0x90 */
+ 0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721, 0xB722, 0xB723, 0xB724, /* 0xA0 */
+ 0xB725, 0xB726, 0xB727, 0xB72A, 0xB72B, 0xB72D, 0xB72E, 0xB731, /* 0xA0 */
+ 0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, 0xB73A, 0xB73C, /* 0xB0 */
+ 0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0xB745, /* 0xB0 */
+ 0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F, /* 0xC0 */
+ 0xB750, 0xB751, 0xB752, 0xB753, 0xB756, 0xB757, 0xB758, 0xB759, /* 0xC0 */
+ 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0xB761, 0xB762, /* 0xD0 */
+ 0xB763, 0xB765, 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C, /* 0xD0 */
+ 0xB76D, 0xB76E, 0xB76F, 0xB772, 0xB774, 0xB776, 0xB777, 0xB778, /* 0xE0 */
+ 0xB779, 0xB77A, 0xB77B, 0xB77E, 0xB77F, 0xB781, 0xB782, 0xB783, /* 0xE0 */
+ 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, 0xB78B, 0xB78E, /* 0xF0 */
+ 0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, 0xB79E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB79F, 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, /* 0x40 */
+ 0xB7A7, 0xB7AA, 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, /* 0x40 */
+ 0xB7B6, 0xB7B7, 0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, /* 0x50 */
+ 0xB7BF, 0xB7C0, 0xB7C1, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB7C2, 0xB7C3, 0xB7C4, 0xB7C5, 0xB7C6, 0xB7C8, 0xB7CA, /* 0x60 */
+ 0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, 0xB7D0, 0xB7D1, 0xB7D2, /* 0x60 */
+ 0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6, 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA, /* 0x70 */
+ 0xB7DB, 0xB7DC, 0xB7DD, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB7DE, 0xB7DF, 0xB7E0, 0xB7E1, 0xB7E2, 0xB7E3, 0xB7E4, /* 0x80 */
+ 0xB7E5, 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA, 0xB7EB, 0xB7EE, /* 0x80 */
+ 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, 0xB7F5, 0xB7F6, 0xB7F7, 0xB7F8, /* 0x90 */
+ 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, 0xB803, 0xB804, 0xB805, /* 0x90 */
+ 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F, 0xB811, 0xB812, /* 0xA0 */
+ 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A, 0xB81C, 0xB81E, /* 0xA0 */
+ 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826, 0xB827, 0xB829, /* 0xB0 */
+ 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830, 0xB831, 0xB832, /* 0xB0 */
+ 0xB833, 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D, 0xB83E, 0xB83F, /* 0xC0 */
+ 0xB841, 0xB842, 0xB843, 0xB845, 0xB846, 0xB847, 0xB848, 0xB849, /* 0xC0 */
+ 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, 0xB84F, 0xB850, 0xB852, /* 0xD0 */
+ 0xB854, 0xB855, 0xB856, 0xB857, 0xB858, 0xB859, 0xB85A, 0xB85B, /* 0xD0 */
+ 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, 0xB865, 0xB866, 0xB867, /* 0xE0 */
+ 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870, 0xB872, 0xB873, /* 0xE0 */
+ 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A, 0xB87B, 0xB87D, /* 0xF0 */
+ 0xB87E, 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883, 0xB884 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB885, 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B, /* 0x40 */
+ 0xB88C, 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0xB894, /* 0x40 */
+ 0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C, /* 0x50 */
+ 0xB89D, 0xB89E, 0xB89F, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB8A0, 0xB8A1, 0xB8A2, 0xB8A3, 0xB8A4, 0xB8A5, 0xB8A6, /* 0x60 */
+ 0xB8A7, 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD, 0xB8AE, 0xB8AF, /* 0x60 */
+ 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, 0xB8B7, 0xB8B9, 0xB8BA, /* 0x70 */
+ 0xB8BB, 0xB8BC, 0xB8BD, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB8BE, 0xB8BF, 0xB8C2, 0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, /* 0x80 */
+ 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD, 0xB8CE, 0xB8CF, 0xB8D1, 0xB8D2, /* 0x80 */
+ 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7, 0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, /* 0x90 */
+ 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2, 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, /* 0x90 */
+ 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED, 0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, /* 0xA0 */
+ 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6, 0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, /* 0xA0 */
+ 0xB8FF, 0xB900, 0xB901, 0xB902, 0xB903, 0xB905, 0xB906, 0xB907, /* 0xB0 */
+ 0xB908, 0xB909, 0xB90A, 0xB90B, 0xB90C, 0xB90D, 0xB90E, 0xB90F, /* 0xB0 */
+ 0xB910, 0xB911, 0xB912, 0xB913, 0xB914, 0xB915, 0xB916, 0xB917, /* 0xC0 */
+ 0xB919, 0xB91A, 0xB91B, 0xB91C, 0xB91D, 0xB91E, 0xB91F, 0xB921, /* 0xC0 */
+ 0xB922, 0xB923, 0xB924, 0xB925, 0xB926, 0xB927, 0xB928, 0xB929, /* 0xD0 */
+ 0xB92A, 0xB92B, 0xB92C, 0xB92D, 0xB92E, 0xB92F, 0xB930, 0xB931, /* 0xD0 */
+ 0xB932, 0xB933, 0xB934, 0xB935, 0xB936, 0xB937, 0xB938, 0xB939, /* 0xE0 */
+ 0xB93A, 0xB93B, 0xB93E, 0xB93F, 0xB941, 0xB942, 0xB943, 0xB945, /* 0xE0 */
+ 0xB946, 0xB947, 0xB948, 0xB949, 0xB94A, 0xB94B, 0xB94D, 0xB94E, /* 0xF0 */
+ 0xB950, 0xB952, 0xB953, 0xB954, 0xB955, 0xB956, 0xB957 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB95A, 0xB95B, 0xB95D, 0xB95E, 0xB95F, 0xB961, 0xB962, /* 0x40 */
+ 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB96A, 0xB96C, 0xB96E, /* 0x40 */
+ 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976, 0xB977, 0xB979, /* 0x50 */
+ 0xB97A, 0xB97B, 0xB97D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB97E, 0xB97F, 0xB980, 0xB981, 0xB982, 0xB983, 0xB986, /* 0x60 */
+ 0xB988, 0xB98B, 0xB98C, 0xB98F, 0xB990, 0xB991, 0xB992, 0xB993, /* 0x60 */
+ 0xB994, 0xB995, 0xB996, 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, /* 0x70 */
+ 0xB99C, 0xB99D, 0xB99E, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB99F, 0xB9A0, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, /* 0x80 */
+ 0xB9A6, 0xB9A7, 0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AE, 0xB9AF, /* 0x80 */
+ 0xB9B1, 0xB9B2, 0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, /* 0x90 */
+ 0xB9BA, 0xB9BB, 0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, /* 0x90 */
+ 0xB9C6, 0xB9C7, 0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, /* 0xA0 */
+ 0xB9D6, 0xB9D7, 0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, /* 0xA0 */
+ 0xB9E7, 0xB9E9, 0xB9EA, 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, /* 0xB0 */
+ 0xB9F1, 0xB9F2, 0xB9F3, 0xB9F6, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, /* 0xB0 */
+ 0xB9FF, 0xBA02, 0xBA03, 0xBA04, 0xBA05, 0xBA06, 0xBA07, 0xBA09, /* 0xC0 */
+ 0xBA0A, 0xBA0B, 0xBA0C, 0xBA0D, 0xBA0E, 0xBA0F, 0xBA10, 0xBA11, /* 0xC0 */
+ 0xBA12, 0xBA13, 0xBA14, 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, /* 0xD0 */
+ 0xBA1B, 0xBA1C, 0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, /* 0xD0 */
+ 0xBA23, 0xBA24, 0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, /* 0xE0 */
+ 0xBA2B, 0xBA2C, 0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, 0xBA32, /* 0xE0 */
+ 0xBA33, 0xBA34, 0xBA35, 0xBA36, 0xBA37, 0xBA3A, 0xBA3B, 0xBA3D, /* 0xF0 */
+ 0xBA3E, 0xBA3F, 0xBA41, 0xBA43, 0xBA44, 0xBA45, 0xBA46 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBA47, 0xBA4A, 0xBA4C, 0xBA4F, 0xBA50, 0xBA51, 0xBA52, /* 0x40 */
+ 0xBA56, 0xBA57, 0xBA59, 0xBA5A, 0xBA5B, 0xBA5D, 0xBA5E, 0xBA5F, /* 0x40 */
+ 0xBA60, 0xBA61, 0xBA62, 0xBA63, 0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, /* 0x50 */
+ 0xBA6D, 0xBA6E, 0xBA6F, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBA72, 0xBA73, 0xBA75, 0xBA76, 0xBA77, 0xBA79, 0xBA7A, /* 0x60 */
+ 0xBA7B, 0xBA7C, 0xBA7D, 0xBA7E, 0xBA7F, 0xBA80, 0xBA81, 0xBA82, /* 0x60 */
+ 0xBA86, 0xBA88, 0xBA89, 0xBA8A, 0xBA8B, 0xBA8D, 0xBA8E, 0xBA8F, /* 0x70 */
+ 0xBA90, 0xBA91, 0xBA92, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99, /* 0x80 */
+ 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1, /* 0x80 */
+ 0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAAA, 0xBAAD, /* 0x90 */
+ 0xBAAE, 0xBAAF, 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7, /* 0x90 */
+ 0xBABA, 0xBABC, 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3, /* 0xA0 */
+ 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC9, 0xBACA, 0xBACB, 0xBACC, 0xBACD, /* 0xA0 */
+ 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, 0xBAD3, 0xBAD4, 0xBAD5, /* 0xB0 */
+ 0xBAD6, 0xBAD7, 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF, /* 0xB0 */
+ 0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, 0xBAE7, /* 0xC0 */
+ 0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF, /* 0xC0 */
+ 0xBAF0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7, /* 0xD0 */
+ 0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01, /* 0xD0 */
+ 0xBB02, 0xBB03, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A, /* 0xE0 */
+ 0xBB0B, 0xBB0C, 0xBB0E, 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15, /* 0xE0 */
+ 0xBB16, 0xBB17, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F, /* 0xF0 */
+ 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, 0xBB27 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBB28, 0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, /* 0x40 */
+ 0xBB31, 0xBB32, 0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, /* 0x40 */
+ 0xBB41, 0xBB42, 0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, /* 0x50 */
+ 0xBB4E, 0xBB51, 0xBB52, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B, /* 0x60 */
+ 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65, /* 0x60 */
+ 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6D, 0xBB6E, /* 0x70 */
+ 0xBB6F, 0xBB70, 0xBB71, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBB72, 0xBB73, 0xBB74, 0xBB75, 0xBB76, 0xBB77, 0xBB78, /* 0x80 */
+ 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E, 0xBB7F, 0xBB80, /* 0x80 */
+ 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86, 0xBB87, 0xBB89, /* 0x90 */
+ 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, 0xBB8F, 0xBB91, 0xBB92, 0xBB93, /* 0x90 */
+ 0xBB94, 0xBB95, 0xBB96, 0xBB97, 0xBB98, 0xBB99, 0xBB9A, 0xBB9B, /* 0xA0 */
+ 0xBB9C, 0xBB9D, 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1, 0xBBA2, 0xBBA3, /* 0xA0 */
+ 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB, 0xBBAD, 0xBBAE, /* 0xB0 */
+ 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5, 0xBBB6, 0xBBB8, /* 0xB0 */
+ 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE, 0xBBBF, 0xBBC1, /* 0xC0 */
+ 0xBBC2, 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9, 0xBBCA, 0xBBCB, /* 0xC0 */
+ 0xBBCC, 0xBBCD, 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2, 0xBBD4, 0xBBD5, /* 0xD0 */
+ 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB, 0xBBDC, 0xBBDD, /* 0xD0 */
+ 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2, 0xBBE3, 0xBBE4, 0xBBE5, /* 0xE0 */
+ 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, 0xBBEB, 0xBBEC, 0xBBED, /* 0xE0 */
+ 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, 0xBBF2, 0xBBF3, 0xBBF4, 0xBBF5, /* 0xF0 */
+ 0xBBF6, 0xBBF7, 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE, 0xBC01 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E, /* 0x40 */
+ 0xBC10, 0xBC12, 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22, /* 0x40 */
+ 0xBC23, 0xBC26, 0xBC28, 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F, /* 0x50 */
+ 0xBC32, 0xBC33, 0xBC35, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBC36, 0xBC37, 0xBC39, 0xBC3A, 0xBC3B, 0xBC3C, 0xBC3D, /* 0x60 */
+ 0xBC3E, 0xBC3F, 0xBC42, 0xBC46, 0xBC47, 0xBC48, 0xBC4A, 0xBC4B, /* 0x60 */
+ 0xBC4E, 0xBC4F, 0xBC51, 0xBC52, 0xBC53, 0xBC54, 0xBC55, 0xBC56, /* 0x70 */
+ 0xBC57, 0xBC58, 0xBC59, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBC5A, 0xBC5B, 0xBC5C, 0xBC5E, 0xBC5F, 0xBC60, 0xBC61, /* 0x80 */
+ 0xBC62, 0xBC63, 0xBC64, 0xBC65, 0xBC66, 0xBC67, 0xBC68, 0xBC69, /* 0x80 */
+ 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D, 0xBC6E, 0xBC6F, 0xBC70, 0xBC71, /* 0x90 */
+ 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76, 0xBC77, 0xBC78, 0xBC79, /* 0x90 */
+ 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D, 0xBC7E, 0xBC7F, 0xBC80, 0xBC81, /* 0xA0 */
+ 0xBC82, 0xBC83, 0xBC86, 0xBC87, 0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, /* 0xA0 */
+ 0xBC90, 0xBC91, 0xBC92, 0xBC93, 0xBC96, 0xBC98, 0xBC9B, 0xBC9C, /* 0xB0 */
+ 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA2, 0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, /* 0xB0 */
+ 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD, 0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, /* 0xC0 */
+ 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA, 0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, /* 0xC0 */
+ 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6, 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, /* 0xD0 */
+ 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2, 0xBCD3, 0xBCD4, 0xBCD6, 0xBCD7, /* 0xD0 */
+ 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDD, 0xBCDE, 0xBCDF, 0xBCE0, 0xBCE1, /* 0xE0 */
+ 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5, 0xBCE6, 0xBCE7, 0xBCE8, 0xBCE9, /* 0xE0 */
+ 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED, 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, /* 0xF0 */
+ 0xBCF2, 0xBCF3, 0xBCF7, 0xBCF9, 0xBCFA, 0xBCFB, 0xBCFD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02, 0xBD03, 0xBD06, /* 0x40 */
+ 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E, 0xBD0F, 0xBD11, /* 0x40 */
+ 0xBD12, 0xBD13, 0xBD15, 0xBD16, 0xBD17, 0xBD18, 0xBD19, 0xBD1A, /* 0x50 */
+ 0xBD1B, 0xBD1C, 0xBD1D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBD1E, 0xBD1F, 0xBD20, 0xBD21, 0xBD22, 0xBD23, 0xBD25, /* 0x60 */
+ 0xBD26, 0xBD27, 0xBD28, 0xBD29, 0xBD2A, 0xBD2B, 0xBD2D, 0xBD2E, /* 0x60 */
+ 0xBD2F, 0xBD30, 0xBD31, 0xBD32, 0xBD33, 0xBD34, 0xBD35, 0xBD36, /* 0x70 */
+ 0xBD37, 0xBD38, 0xBD39, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBD3A, 0xBD3B, 0xBD3C, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD41, /* 0x80 */
+ 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD4A, 0xBD4B, /* 0x80 */
+ 0xBD4D, 0xBD4E, 0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, /* 0x90 */
+ 0xBD56, 0xBD57, 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, /* 0x90 */
+ 0xBD60, 0xBD61, 0xBD62, 0xBD63, 0xBD65, 0xBD66, 0xBD67, 0xBD69, /* 0xA0 */
+ 0xBD6A, 0xBD6B, 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, /* 0xA0 */
+ 0xBD72, 0xBD73, 0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, /* 0xB0 */
+ 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, 0xBD82, 0xBD83, /* 0xB0 */
+ 0xBD85, 0xBD86, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, /* 0xC0 */
+ 0xBD94, 0xBD96, 0xBD97, 0xBD98, 0xBD9B, 0xBD9D, 0xBD9E, 0xBD9F, /* 0xC0 */
+ 0xBDA0, 0xBDA1, 0xBDA2, 0xBDA3, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, /* 0xD0 */
+ 0xBDA9, 0xBDAA, 0xBDAB, 0xBDAC, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB1, /* 0xD0 */
+ 0xBDB2, 0xBDB3, 0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0xBDB9, 0xBDBA, /* 0xE0 */
+ 0xBDBB, 0xBDBC, 0xBDBD, 0xBDBE, 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, /* 0xE0 */
+ 0xBDC3, 0xBDC4, 0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, 0xBDC9, 0xBDCA, /* 0xF0 */
+ 0xBDCB, 0xBDCC, 0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDD2, 0xBDD3, 0xBDD6, 0xBDD7, 0xBDD9, 0xBDDA, 0xBDDB, /* 0x40 */
+ 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0, 0xBDE1, 0xBDE2, 0xBDE3, 0xBDE4, /* 0x40 */
+ 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8, 0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, /* 0x50 */
+ 0xBDEE, 0xBDEF, 0xBDF1, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBDF2, 0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, 0xBDF9, 0xBDFA, /* 0x60 */
+ 0xBDFB, 0xBDFC, 0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, 0xBE04, /* 0x60 */
+ 0xBE06, 0xBE07, 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, /* 0x70 */
+ 0xBE11, 0xBE12, 0xBE13, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, 0xBE1B, /* 0x80 */
+ 0xBE1E, 0xBE20, 0xBE21, 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26, /* 0x80 */
+ 0xBE27, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E, /* 0x90 */
+ 0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36, /* 0x90 */
+ 0xBE37, 0xBE38, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, 0xBE3E, /* 0xA0 */
+ 0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE46, 0xBE47, 0xBE49, /* 0xA0 */
+ 0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53, /* 0xB0 */
+ 0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, 0xBE62, 0xBE63, /* 0xB0 */
+ 0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E, /* 0xC0 */
+ 0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7E, /* 0xC0 */
+ 0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88, /* 0xD0 */
+ 0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95, /* 0xD0 */
+ 0xBE96, 0xBE97, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F, /* 0xE0 */
+ 0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, 0xBEA7, /* 0xE0 */
+ 0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0, /* 0xF0 */
+ 0xBEB1, 0xBEB2, 0xBEB3, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBEB8, 0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, /* 0x40 */
+ 0xBEBF, 0xBEC0, 0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, /* 0x40 */
+ 0xBEC7, 0xBEC8, 0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, /* 0x50 */
+ 0xBECF, 0xBED2, 0xBED3, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD, /* 0x60 */
+ 0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9, /* 0x60 */
+ 0xBEEA, 0xBEEB, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2, /* 0x70 */
+ 0xBEF3, 0xBEF4, 0xBEF5, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA, 0xBEFB, 0xBEFC, /* 0x80 */
+ 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF02, 0xBF03, 0xBF04, 0xBF05, /* 0x80 */
+ 0xBF06, 0xBF07, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D, 0xBF0E, 0xBF0F, /* 0x90 */
+ 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15, 0xBF16, 0xBF17, /* 0x90 */
+ 0xBF1A, 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22, 0xBF23, 0xBF24, /* 0xA0 */
+ 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A, 0xBF2B, 0xBF2C, /* 0xA0 */
+ 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32, 0xBF33, 0xBF34, /* 0xB0 */
+ 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, 0xBF3A, 0xBF3B, 0xBF3C, /* 0xB0 */
+ 0xBF3D, 0xBF3E, 0xBF3F, 0xBF42, 0xBF43, 0xBF45, 0xBF46, 0xBF47, /* 0xC0 */
+ 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E, 0xBF4F, 0xBF52, /* 0xC0 */
+ 0xBF53, 0xBF54, 0xBF56, 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, /* 0xD0 */
+ 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62, 0xBF63, /* 0xD0 */
+ 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69, 0xBF6A, 0xBF6B, /* 0xE0 */
+ 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71, 0xBF72, 0xBF73, /* 0xE0 */
+ 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79, 0xBF7A, 0xBF7B, /* 0xF0 */
+ 0xBF7C, 0xBF7D, 0xBF7E, 0xBF7F, 0xBF80, 0xBF81, 0xBF82 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, 0xBF89, /* 0x40 */
+ 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91, /* 0x40 */
+ 0xBF92, 0xBF93, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A, /* 0x50 */
+ 0xBF9B, 0xBF9C, 0xBF9D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2, 0xBFA3, 0xBFA4, /* 0x60 */
+ 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA, 0xBFAB, 0xBFAC, /* 0x60 */
+ 0xBFAD, 0xBFAE, 0xBFAF, 0xBFB1, 0xBFB2, 0xBFB3, 0xBFB4, 0xBFB5, /* 0x70 */
+ 0xBFB6, 0xBFB7, 0xBFB8, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBFB9, 0xBFBA, 0xBFBB, 0xBFBC, 0xBFBD, 0xBFBE, 0xBFBF, /* 0x80 */
+ 0xBFC0, 0xBFC1, 0xBFC2, 0xBFC3, 0xBFC4, 0xBFC6, 0xBFC7, 0xBFC8, /* 0x80 */
+ 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE, 0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, /* 0x90 */
+ 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8, 0xBFD9, 0xBFDA, 0xBFDB, 0xBFDD, /* 0x90 */
+ 0xBFDE, 0xBFE0, 0xBFE2, 0xBFE3, 0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, /* 0xA0 */
+ 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB, 0xBFEC, 0xBFED, 0xBFEE, 0xBFEF, /* 0xA0 */
+ 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3, 0xBFF4, 0xBFF5, 0xBFF6, 0xBFF7, /* 0xB0 */
+ 0xBFF8, 0xBFF9, 0xBFFA, 0xBFFB, 0xBFFC, 0xBFFD, 0xBFFE, 0xBFFF, /* 0xB0 */
+ 0xC000, 0xC001, 0xC002, 0xC003, 0xC004, 0xC005, 0xC006, 0xC007, /* 0xC0 */
+ 0xC008, 0xC009, 0xC00A, 0xC00B, 0xC00C, 0xC00D, 0xC00E, 0xC00F, /* 0xC0 */
+ 0xC010, 0xC011, 0xC012, 0xC013, 0xC014, 0xC015, 0xC016, 0xC017, /* 0xD0 */
+ 0xC018, 0xC019, 0xC01A, 0xC01B, 0xC01C, 0xC01D, 0xC01E, 0xC01F, /* 0xD0 */
+ 0xC020, 0xC021, 0xC022, 0xC023, 0xC024, 0xC025, 0xC026, 0xC027, /* 0xE0 */
+ 0xC028, 0xC029, 0xC02A, 0xC02B, 0xC02C, 0xC02D, 0xC02E, 0xC02F, /* 0xE0 */
+ 0xC030, 0xC031, 0xC032, 0xC033, 0xC034, 0xC035, 0xC036, 0xC037, /* 0xF0 */
+ 0xC038, 0xC039, 0xC03A, 0xC03B, 0xC03D, 0xC03E, 0xC03F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC040, 0xC041, 0xC042, 0xC043, 0xC044, 0xC045, 0xC046, /* 0x40 */
+ 0xC047, 0xC048, 0xC049, 0xC04A, 0xC04B, 0xC04C, 0xC04D, 0xC04E, /* 0x40 */
+ 0xC04F, 0xC050, 0xC052, 0xC053, 0xC054, 0xC055, 0xC056, 0xC057, /* 0x50 */
+ 0xC059, 0xC05A, 0xC05B, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC05D, 0xC05E, 0xC05F, 0xC061, 0xC062, 0xC063, 0xC064, /* 0x60 */
+ 0xC065, 0xC066, 0xC067, 0xC06A, 0xC06B, 0xC06C, 0xC06D, 0xC06E, /* 0x60 */
+ 0xC06F, 0xC070, 0xC071, 0xC072, 0xC073, 0xC074, 0xC075, 0xC076, /* 0x70 */
+ 0xC077, 0xC078, 0xC079, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC07A, 0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, /* 0x80 */
+ 0xC081, 0xC082, 0xC083, 0xC084, 0xC085, 0xC086, 0xC087, 0xC088, /* 0x80 */
+ 0xC089, 0xC08A, 0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, 0xC092, /* 0x90 */
+ 0xC093, 0xC095, 0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, 0xC09C, /* 0x90 */
+ 0xC09D, 0xC09E, 0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, /* 0xA0 */
+ 0xC0A9, 0xC0AA, 0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, /* 0xA0 */
+ 0xC0B9, 0xC0BA, 0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, /* 0xB0 */
+ 0xC0C7, 0xC0CA, 0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, /* 0xB0 */
+ 0xC0D3, 0xC0D4, 0xC0D5, 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, /* 0xC0 */
+ 0xC0E0, 0xC0E1, 0xC0E2, 0xC0E3, 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, /* 0xC0 */
+ 0xC0EB, 0xC0ED, 0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, 0xC0F3, /* 0xD0 */
+ 0xC0F6, 0xC0F8, 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, /* 0xD0 */
+ 0xC101, 0xC102, 0xC103, 0xC105, 0xC106, 0xC107, 0xC109, 0xC10A, /* 0xE0 */
+ 0xC10B, 0xC10C, 0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, /* 0xE0 */
+ 0xC114, 0xC116, 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, /* 0xF0 */
+ 0xC122, 0xC125, 0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC132, 0xC133, 0xC134, 0xC135, 0xC137, 0xC13A, 0xC13B, /* 0x40 */
+ 0xC13D, 0xC13E, 0xC13F, 0xC141, 0xC142, 0xC143, 0xC144, 0xC145, /* 0x40 */
+ 0xC146, 0xC147, 0xC14A, 0xC14E, 0xC14F, 0xC150, 0xC151, 0xC152, /* 0x50 */
+ 0xC153, 0xC156, 0xC157, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC159, 0xC15A, 0xC15B, 0xC15D, 0xC15E, 0xC15F, 0xC160, /* 0x60 */
+ 0xC161, 0xC162, 0xC163, 0xC166, 0xC16A, 0xC16B, 0xC16C, 0xC16D, /* 0x60 */
+ 0xC16E, 0xC16F, 0xC171, 0xC172, 0xC173, 0xC175, 0xC176, 0xC177, /* 0x70 */
+ 0xC179, 0xC17A, 0xC17B, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC17C, 0xC17D, 0xC17E, 0xC17F, 0xC180, 0xC181, 0xC182, /* 0x80 */
+ 0xC183, 0xC184, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B, /* 0x80 */
+ 0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199, /* 0x90 */
+ 0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6, /* 0x90 */
+ 0xC1A7, 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B1, 0xC1B2, /* 0xA0 */
+ 0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, 0xC1BA, /* 0xA0 */
+ 0xC1BB, 0xC1BC, 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3, /* 0xB0 */
+ 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE, /* 0xB0 */
+ 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, 0xC1D5, 0xC1D6, 0xC1D9, /* 0xC0 */
+ 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, 0xC1E1, 0xC1E2, /* 0xC0 */
+ 0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC, /* 0xD0 */
+ 0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7, /* 0xD0 */
+ 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202, /* 0xE0 */
+ 0xC203, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B, /* 0xE0 */
+ 0xC20E, 0xC210, 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217, /* 0xF0 */
+ 0xC21A, 0xC21B, 0xC21D, 0xC21E, 0xC221, 0xC222, 0xC223 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC224, 0xC225, 0xC226, 0xC227, 0xC22A, 0xC22C, 0xC22E, /* 0x40 */
+ 0xC230, 0xC233, 0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A, /* 0x40 */
+ 0xC23B, 0xC23C, 0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, /* 0x50 */
+ 0xC243, 0xC244, 0xC245, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC246, 0xC247, 0xC249, 0xC24A, 0xC24B, 0xC24C, 0xC24D, /* 0x60 */
+ 0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259, /* 0x60 */
+ 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262, /* 0x70 */
+ 0xC263, 0xC264, 0xC266, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B, 0xC26E, 0xC26F, /* 0x80 */
+ 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277, 0xC278, 0xC279, /* 0x80 */
+ 0xC27A, 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283, 0xC284, 0xC285, /* 0x90 */
+ 0xC286, 0xC287, 0xC28A, 0xC28B, 0xC28C, 0xC28D, 0xC28E, 0xC28F, /* 0x90 */
+ 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296, 0xC297, 0xC299, /* 0xA0 */
+ 0xC29A, 0xC29C, 0xC29E, 0xC29F, 0xC2A0, 0xC2A1, 0xC2A2, 0xC2A3, /* 0xA0 */
+ 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AE, 0xC2AF, 0xC2B0, /* 0xB0 */
+ 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, 0xC2BA, 0xC2BB, 0xC2BC, /* 0xB0 */
+ 0xC2BD, 0xC2BE, 0xC2BF, 0xC2C0, 0xC2C1, 0xC2C2, 0xC2C3, 0xC2C4, /* 0xC0 */
+ 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA, 0xC2CB, 0xC2CC, /* 0xC0 */
+ 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D2, 0xC2D3, 0xC2D4, /* 0xD0 */
+ 0xC2D5, 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA, 0xC2DB, 0xC2DE, /* 0xD0 */
+ 0xC2DF, 0xC2E1, 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7, 0xC2E8, 0xC2E9, /* 0xE0 */
+ 0xC2EA, 0xC2EE, 0xC2F0, 0xC2F2, 0xC2F3, 0xC2F4, 0xC2F5, 0xC2F7, /* 0xE0 */
+ 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, 0xC301, 0xC302, 0xC303, 0xC304, /* 0xF0 */
+ 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, 0xC30E, 0xC30F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A, /* 0x40 */
+ 0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323, /* 0x40 */
+ 0xC326, 0xC327, 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F, /* 0x50 */
+ 0xC330, 0xC331, 0xC332, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC333, 0xC334, 0xC335, 0xC336, 0xC337, 0xC338, 0xC339, /* 0x60 */
+ 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E, 0xC33F, 0xC340, 0xC341, /* 0x60 */
+ 0xC342, 0xC343, 0xC344, 0xC346, 0xC347, 0xC348, 0xC349, 0xC34A, /* 0x70 */
+ 0xC34B, 0xC34C, 0xC34D, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC34E, 0xC34F, 0xC350, 0xC351, 0xC352, 0xC353, 0xC354, /* 0x80 */
+ 0xC355, 0xC356, 0xC357, 0xC358, 0xC359, 0xC35A, 0xC35B, 0xC35C, /* 0x80 */
+ 0xC35D, 0xC35E, 0xC35F, 0xC360, 0xC361, 0xC362, 0xC363, 0xC364, /* 0x90 */
+ 0xC365, 0xC366, 0xC367, 0xC36A, 0xC36B, 0xC36D, 0xC36E, 0xC36F, /* 0x90 */
+ 0xC371, 0xC373, 0xC374, 0xC375, 0xC376, 0xC377, 0xC37A, 0xC37B, /* 0xA0 */
+ 0xC37E, 0xC37F, 0xC380, 0xC381, 0xC382, 0xC383, 0xC385, 0xC386, /* 0xA0 */
+ 0xC387, 0xC389, 0xC38A, 0xC38B, 0xC38D, 0xC38E, 0xC38F, 0xC390, /* 0xB0 */
+ 0xC391, 0xC392, 0xC393, 0xC394, 0xC395, 0xC396, 0xC397, 0xC398, /* 0xB0 */
+ 0xC399, 0xC39A, 0xC39B, 0xC39C, 0xC39D, 0xC39E, 0xC39F, 0xC3A0, /* 0xC0 */
+ 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4, 0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, /* 0xC0 */
+ 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC, 0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, /* 0xD0 */
+ 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4, 0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, /* 0xD0 */
+ 0xC3B9, 0xC3BA, 0xC3BB, 0xC3BC, 0xC3BD, 0xC3BE, 0xC3BF, 0xC3C1, /* 0xE0 */
+ 0xC3C2, 0xC3C3, 0xC3C4, 0xC3C5, 0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, /* 0xE0 */
+ 0xC3CA, 0xC3CB, 0xC3CC, 0xC3CD, 0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1, /* 0xF0 */
+ 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5, 0xC3D6, 0xC3D7, 0xC3DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3, 0xC3E4, 0xC3E5, /* 0x40 */
+ 0xC3E6, 0xC3E7, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE, 0xC3EF, 0xC3F0, /* 0x40 */
+ 0xC3F1, 0xC3F2, 0xC3F3, 0xC3F6, 0xC3F7, 0xC3F9, 0xC3FA, 0xC3FB, /* 0x50 */
+ 0xC3FC, 0xC3FD, 0xC3FE, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC3FF, 0xC400, 0xC401, 0xC402, 0xC403, 0xC404, 0xC405, /* 0x60 */
+ 0xC406, 0xC407, 0xC409, 0xC40A, 0xC40B, 0xC40C, 0xC40D, 0xC40E, /* 0x60 */
+ 0xC40F, 0xC411, 0xC412, 0xC413, 0xC414, 0xC415, 0xC416, 0xC417, /* 0x70 */
+ 0xC418, 0xC419, 0xC41A, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC41B, 0xC41C, 0xC41D, 0xC41E, 0xC41F, 0xC420, 0xC421, /* 0x80 */
+ 0xC422, 0xC423, 0xC425, 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, /* 0x80 */
+ 0xC42B, 0xC42D, 0xC42E, 0xC42F, 0xC431, 0xC432, 0xC433, 0xC435, /* 0x90 */
+ 0xC436, 0xC437, 0xC438, 0xC439, 0xC43A, 0xC43B, 0xC43E, 0xC43F, /* 0x90 */
+ 0xC440, 0xC441, 0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, /* 0xA0 */
+ 0xC449, 0xC44A, 0xC44B, 0xC44C, 0xC44D, 0xC44E, 0xC44F, 0xC450, /* 0xA0 */
+ 0xC451, 0xC452, 0xC453, 0xC454, 0xC455, 0xC456, 0xC457, 0xC458, /* 0xB0 */
+ 0xC459, 0xC45A, 0xC45B, 0xC45C, 0xC45D, 0xC45E, 0xC45F, 0xC460, /* 0xB0 */
+ 0xC461, 0xC462, 0xC463, 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, /* 0xC0 */
+ 0xC46D, 0xC46E, 0xC46F, 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, /* 0xC0 */
+ 0xC477, 0xC478, 0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, /* 0xD0 */
+ 0xC481, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, /* 0xD0 */
+ 0xC489, 0xC48A, 0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490, /* 0xE0 */
+ 0xC491, 0xC492, 0xC493, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, /* 0xE0 */
+ 0xC49A, 0xC49B, 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, /* 0xF0 */
+ 0xC4A3, 0xC4A4, 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC4AA, 0xC4AB, 0xC4AC, 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, /* 0x40 */
+ 0xC4B1, 0xC4B2, 0xC4B3, 0xC4B4, 0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, /* 0x40 */
+ 0xC4BA, 0xC4BB, 0xC4BD, 0xC4BE, 0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, /* 0x50 */
+ 0xC4C3, 0xC4C4, 0xC4C5, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC4C6, 0xC4C7, 0xC4C8, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, /* 0x60 */
+ 0xC4CD, 0xC4CE, 0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3, 0xC4D4, /* 0x60 */
+ 0xC4D5, 0xC4D6, 0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, 0xC4DB, 0xC4DC, /* 0x70 */
+ 0xC4DD, 0xC4DE, 0xC4DF, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC4E0, 0xC4E1, 0xC4E2, 0xC4E3, 0xC4E4, 0xC4E5, 0xC4E6, /* 0x80 */
+ 0xC4E7, 0xC4E8, 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF, /* 0x80 */
+ 0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, 0xC4FC, /* 0x90 */
+ 0xC4FD, 0xC4FE, 0xC502, 0xC503, 0xC504, 0xC505, 0xC506, 0xC507, /* 0x90 */
+ 0xC508, 0xC509, 0xC50A, 0xC50B, 0xC50D, 0xC50E, 0xC50F, 0xC511, /* 0xA0 */
+ 0xC512, 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A, /* 0xA0 */
+ 0xC51B, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521, 0xC522, 0xC523, /* 0xB0 */
+ 0xC524, 0xC525, 0xC526, 0xC527, 0xC52A, 0xC52B, 0xC52D, 0xC52E, /* 0xB0 */
+ 0xC52F, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, 0xC537, /* 0xC0 */
+ 0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543, /* 0xC0 */
+ 0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, 0xC552, 0xC556, /* 0xD0 */
+ 0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, 0xC566, /* 0xD0 */
+ 0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F, /* 0xE0 */
+ 0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E, /* 0xE0 */
+ 0xC57F, 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589, /* 0xF0 */
+ 0xC58A, 0xC58B, 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC596, 0xC599, 0xC59A, 0xC59B, 0xC59D, 0xC59E, 0xC59F, /* 0x40 */
+ 0xC5A1, 0xC5A2, 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, /* 0x40 */
+ 0xC5AA, 0xC5AB, 0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, /* 0x50 */
+ 0xC5B2, 0xC5B3, 0xC5B6, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, 0xC5C3, /* 0x60 */
+ 0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, 0xC5D7, /* 0x60 */
+ 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2, /* 0x70 */
+ 0xC5E4, 0xC5E6, 0xC5E7, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF, 0xC5F1, 0xC5F2, /* 0x80 */
+ 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB, 0xC602, 0xC603, /* 0x80 */
+ 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E, 0xC60F, 0xC611, /* 0x90 */
+ 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, 0xC617, 0xC61A, 0xC61D, /* 0x90 */
+ 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623, 0xC626, 0xC627, /* 0xA0 */
+ 0xC629, 0xC62A, 0xC62B, 0xC62F, 0xC631, 0xC632, 0xC636, 0xC638, /* 0xA0 */
+ 0xC63A, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0xC642, 0xC643, 0xC645, /* 0xB0 */
+ 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, 0xC64C, 0xC64D, 0xC64E, /* 0xB0 */
+ 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659, 0xC65A, 0xC65B, /* 0xC0 */
+ 0xC65E, 0xC65F, 0xC661, 0xC662, 0xC663, 0xC664, 0xC665, 0xC666, /* 0xC0 */
+ 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66D, 0xC66E, 0xC670, /* 0xD0 */
+ 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677, 0xC67A, 0xC67B, /* 0xD0 */
+ 0xC67D, 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683, 0xC684, 0xC685, /* 0xE0 */
+ 0xC686, 0xC687, 0xC68A, 0xC68C, 0xC68E, 0xC68F, 0xC690, 0xC691, /* 0xE0 */
+ 0xC692, 0xC693, 0xC696, 0xC697, 0xC699, 0xC69A, 0xC69B, 0xC69D, /* 0xF0 */
+ 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3, 0xC6A6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF, /* 0x40 */
+ 0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD, /* 0x40 */
+ 0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9, /* 0x50 */
+ 0xC6CA, 0xC6CB, 0xC6CE, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5, 0xC6D6, 0xC6D7, /* 0x60 */
+ 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF, 0xC6E2, 0xC6E3, /* 0x60 */
+ 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB, 0xC6ED, 0xC6EE, /* 0x70 */
+ 0xC6EF, 0xC6F1, 0xC6F2, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC6F3, 0xC6F4, 0xC6F5, 0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, /* 0x80 */
+ 0xC6FC, 0xC6FE, 0xC6FF, 0xC700, 0xC701, 0xC702, 0xC703, 0xC706, /* 0x80 */
+ 0xC707, 0xC709, 0xC70A, 0xC70B, 0xC70D, 0xC70E, 0xC70F, 0xC710, /* 0x90 */
+ 0xC711, 0xC712, 0xC713, 0xC716, 0xC718, 0xC71A, 0xC71B, 0xC71C, /* 0x90 */
+ 0xC71D, 0xC71E, 0xC71F, 0xC722, 0xC723, 0xC725, 0xC726, 0xC727, /* 0xA0 */
+ 0xC729, 0xC72A, 0xC72B, 0xC72C, 0xC72D, 0xC72E, 0xC72F, 0xC732, /* 0xA0 */
+ 0xC734, 0xC736, 0xC738, 0xC739, 0xC73A, 0xC73B, 0xC73E, 0xC73F, /* 0xB0 */
+ 0xC741, 0xC742, 0xC743, 0xC745, 0xC746, 0xC747, 0xC748, 0xC749, /* 0xB0 */
+ 0xC74B, 0xC74E, 0xC750, 0xC759, 0xC75A, 0xC75B, 0xC75D, 0xC75E, /* 0xC0 */
+ 0xC75F, 0xC761, 0xC762, 0xC763, 0xC764, 0xC765, 0xC766, 0xC767, /* 0xC0 */
+ 0xC769, 0xC76A, 0xC76C, 0xC76D, 0xC76E, 0xC76F, 0xC770, 0xC771, /* 0xD0 */
+ 0xC772, 0xC773, 0xC776, 0xC777, 0xC779, 0xC77A, 0xC77B, 0xC77F, /* 0xD0 */
+ 0xC780, 0xC781, 0xC782, 0xC786, 0xC78B, 0xC78C, 0xC78D, 0xC78F, /* 0xE0 */
+ 0xC792, 0xC793, 0xC795, 0xC799, 0xC79B, 0xC79C, 0xC79D, 0xC79E, /* 0xE0 */
+ 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8, 0xC7A9, 0xC7AA, 0xC7AB, 0xC7AE, /* 0xF0 */
+ 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3, 0xC7B5, 0xC7B6, 0xC7B7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE, 0xC7C2, 0xC7C3, /* 0x40 */
+ 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB, 0xC7CD, 0xC7CF, /* 0x40 */
+ 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6, 0xC7D7, 0xC7D9, /* 0x50 */
+ 0xC7DA, 0xC7DB, 0xC7DC, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC7DE, 0xC7DF, 0xC7E0, 0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, /* 0x60 */
+ 0xC7E6, 0xC7E7, 0xC7E9, 0xC7EA, 0xC7EB, 0xC7ED, 0xC7EE, 0xC7EF, /* 0x60 */
+ 0xC7F0, 0xC7F1, 0xC7F2, 0xC7F3, 0xC7F4, 0xC7F5, 0xC7F6, 0xC7F7, /* 0x70 */
+ 0xC7F8, 0xC7F9, 0xC7FA, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC7FB, 0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0xC802, 0xC803, /* 0x80 */
+ 0xC805, 0xC806, 0xC807, 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, /* 0x80 */
+ 0xC80F, 0xC812, 0xC814, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, /* 0x90 */
+ 0xC81E, 0xC81F, 0xC821, 0xC822, 0xC823, 0xC825, 0xC826, 0xC827, /* 0x90 */
+ 0xC828, 0xC829, 0xC82A, 0xC82B, 0xC82E, 0xC830, 0xC832, 0xC833, /* 0xA0 */
+ 0xC834, 0xC835, 0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, 0xC83D, /* 0xA0 */
+ 0xC83E, 0xC83F, 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, /* 0xB0 */
+ 0xC847, 0xC84A, 0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, /* 0xB0 */
+ 0xC853, 0xC855, 0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, 0xC85B, /* 0xC0 */
+ 0xC85C, 0xC85D, 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, 0xC863, /* 0xC0 */
+ 0xC864, 0xC865, 0xC866, 0xC867, 0xC868, 0xC869, 0xC86A, 0xC86B, /* 0xD0 */
+ 0xC86C, 0xC86D, 0xC86E, 0xC86F, 0xC872, 0xC873, 0xC875, 0xC876, /* 0xD0 */
+ 0xC877, 0xC879, 0xC87B, 0xC87C, 0xC87D, 0xC87E, 0xC87F, 0xC882, /* 0xE0 */
+ 0xC884, 0xC888, 0xC889, 0xC88A, 0xC88E, 0xC88F, 0xC890, 0xC891, /* 0xE0 */
+ 0xC892, 0xC893, 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, /* 0xF0 */
+ 0xC89B, 0xC89C, 0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC8A5, 0xC8A6, 0xC8A7, 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, /* 0x40 */
+ 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0, 0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, /* 0x40 */
+ 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8, 0xC8B9, 0xC8BA, 0xC8BB, 0xC8BE, /* 0x50 */
+ 0xC8BF, 0xC8C0, 0xC8C1, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC8C2, 0xC8C3, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, /* 0x60 */
+ 0xC8CB, 0xC8CD, 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, /* 0x60 */
+ 0xC8D6, 0xC8D8, 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, /* 0x70 */
+ 0xC8E2, 0xC8E3, 0xC8E5, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC8E6, 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC, /* 0x80 */
+ 0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4, /* 0x80 */
+ 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0xC8FE, 0xC8FF, /* 0x90 */
+ 0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, 0xC90B, /* 0x90 */
+ 0xC90E, 0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8, /* 0xA0 */
+ 0x3003, 0x00AD, 0x2015, 0x2225, 0xFF3C, 0x223C, 0x2018, 0x2019, /* 0xA0 */
+ 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, /* 0xB0 */
+ 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0x00B1, 0x00D7, /* 0xB0 */
+ 0x00F7, 0x2260, 0x2264, 0x2265, 0x221E, 0x2234, 0x00B0, 0x2032, /* 0xC0 */
+ 0x2033, 0x2103, 0x212B, 0xFFE0, 0xFFE1, 0xFFE5, 0x2642, 0x2640, /* 0xC0 */
+ 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00A7, /* 0xD0 */
+ 0x203B, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, /* 0xD0 */
+ 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x2192, 0x2190, /* 0xE0 */
+ 0x2191, 0x2193, 0x2194, 0x3013, 0x226A, 0x226B, 0x221A, 0x223D, /* 0xE0 */
+ 0x221D, 0x2235, 0x222B, 0x222C, 0x2208, 0x220B, 0x2286, 0x2287, /* 0xF0 */
+ 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0xFFE2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917, /* 0x40 */
+ 0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, 0xC91F, 0xC920, /* 0x40 */
+ 0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, 0xC927, 0xC928, /* 0x50 */
+ 0xC929, 0xC92A, 0xC92B, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC92D, 0xC92E, 0xC92F, 0xC930, 0xC931, 0xC932, 0xC933, /* 0x60 */
+ 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A, 0xC93B, 0xC93C, /* 0x60 */
+ 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942, 0xC943, 0xC944, /* 0x70 */
+ 0xC945, 0xC946, 0xC947, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC948, 0xC949, 0xC94A, 0xC94B, 0xC94C, 0xC94D, 0xC94E, /* 0x80 */
+ 0xC94F, 0xC952, 0xC953, 0xC955, 0xC956, 0xC957, 0xC959, 0xC95A, /* 0x80 */
+ 0xC95B, 0xC95C, 0xC95D, 0xC95E, 0xC95F, 0xC962, 0xC964, 0xC965, /* 0x90 */
+ 0xC966, 0xC967, 0xC968, 0xC969, 0xC96A, 0xC96B, 0xC96D, 0xC96E, /* 0x90 */
+ 0xC96F, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4, 0xFF5E, 0x02C7, /* 0xA0 */
+ 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB, 0x00A1, 0x00BF, /* 0xA0 */
+ 0x02D0, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109, 0x2030, 0x25C1, /* 0xB0 */
+ 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, /* 0xB0 */
+ 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1, 0x2592, 0x25A4, /* 0xC0 */
+ 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E, /* 0xC0 */
+ 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, /* 0xD0 */
+ 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C, 0x327F, 0x321C, /* 0xD0 */
+ 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121, 0x20AC, 0x00AE /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC971, 0xC972, 0xC973, 0xC975, 0xC976, 0xC977, 0xC978, /* 0x40 */
+ 0xC979, 0xC97A, 0xC97B, 0xC97D, 0xC97E, 0xC97F, 0xC980, 0xC981, /* 0x40 */
+ 0xC982, 0xC983, 0xC984, 0xC985, 0xC986, 0xC987, 0xC98A, 0xC98B, /* 0x50 */
+ 0xC98D, 0xC98E, 0xC98F, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, /* 0x60 */
+ 0xC99A, 0xC99C, 0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, /* 0x60 */
+ 0xC9A4, 0xC9A5, 0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, 0xC9AB, /* 0x70 */
+ 0xC9AC, 0xC9AD, 0xC9AE, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, 0xC9B3, 0xC9B4, 0xC9B5, /* 0x80 */
+ 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD, /* 0x80 */
+ 0xC9BE, 0xC9BF, 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB, /* 0x90 */
+ 0xC9CC, 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8, /* 0x90 */
+ 0xC9DB, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, /* 0xA0 */
+ 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, /* 0xA0 */
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, /* 0xB0 */
+ 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, /* 0xB0 */
+ 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, /* 0xC0 */
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, /* 0xC0 */
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, /* 0xD0 */
+ 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F, /* 0xD0 */
+ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, /* 0xE0 */
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 0xE0 */
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, /* 0xF0 */
+ 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC9DE, 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8, /* 0x40 */
+ 0xC9E9, 0xC9EA, 0xC9EB, 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5, /* 0x40 */
+ 0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01, /* 0x50 */
+ 0xCA02, 0xCA03, 0xCA04, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCA05, 0xCA06, 0xCA07, 0xCA0A, 0xCA0E, 0xCA0F, 0xCA10, /* 0x60 */
+ 0xCA11, 0xCA12, 0xCA13, 0xCA15, 0xCA16, 0xCA17, 0xCA19, 0xCA1A, /* 0x60 */
+ 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20, 0xCA21, 0xCA22, /* 0x70 */
+ 0xCA23, 0xCA24, 0xCA25, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCA26, 0xCA27, 0xCA28, 0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, /* 0x80 */
+ 0xCA2E, 0xCA2F, 0xCA30, 0xCA31, 0xCA32, 0xCA33, 0xCA34, 0xCA35, /* 0x80 */
+ 0xCA36, 0xCA37, 0xCA38, 0xCA39, 0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, /* 0x90 */
+ 0xCA3E, 0xCA3F, 0xCA40, 0xCA41, 0xCA42, 0xCA43, 0xCA44, 0xCA45, /* 0x90 */
+ 0xCA46, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, /* 0xA0 */
+ 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, /* 0xA0 */
+ 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, /* 0xB0 */
+ 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, /* 0xB0 */
+ 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, /* 0xC0 */
+ 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, /* 0xC0 */
+ 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, /* 0xD0 */
+ 0x3168, 0x3169, 0x316A, 0x316B, 0x316C, 0x316D, 0x316E, 0x316F, /* 0xD0 */
+ 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, /* 0xE0 */
+ 0x3178, 0x3179, 0x317A, 0x317B, 0x317C, 0x317D, 0x317E, 0x317F, /* 0xE0 */
+ 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, /* 0xF0 */
+ 0x3188, 0x3189, 0x318A, 0x318B, 0x318C, 0x318D, 0x318E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCA47, 0xCA48, 0xCA49, 0xCA4A, 0xCA4B, 0xCA4E, 0xCA4F, /* 0x40 */
+ 0xCA51, 0xCA52, 0xCA53, 0xCA55, 0xCA56, 0xCA57, 0xCA58, 0xCA59, /* 0x40 */
+ 0xCA5A, 0xCA5B, 0xCA5E, 0xCA62, 0xCA63, 0xCA64, 0xCA65, 0xCA66, /* 0x50 */
+ 0xCA67, 0xCA69, 0xCA6A, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCA6B, 0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, 0xCA71, /* 0x60 */
+ 0xCA72, 0xCA73, 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, /* 0x60 */
+ 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, /* 0x70 */
+ 0xCA83, 0xCA85, 0xCA86, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, 0xCA8D, /* 0x80 */
+ 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, 0xCA95, /* 0x80 */
+ 0xCA96, 0xCA97, 0xCA99, 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E, /* 0x90 */
+ 0xCA9F, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6, /* 0x90 */
+ 0xCAA7, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, /* 0xA0 */
+ 0x2177, 0x2178, 0x2179, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, /* 0xB0 */
+ 0x2168, 0x2169, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0xC0 */
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, /* 0xC0 */
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, /* 0xD0 */
+ 0x03A9, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, /* 0xE0 */
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* 0xE0 */
+ 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, /* 0xF0 */
+ 0x03C9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE, /* 0x40 */
+ 0xCAAF, 0xCAB0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5, 0xCAB6, /* 0x40 */
+ 0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0xCABE, 0xCABF, 0xCAC1, /* 0x50 */
+ 0xCAC2, 0xCAC3, 0xCAC5, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA, 0xCACB, 0xCACE, /* 0x60 */
+ 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7, 0xCADA, 0xCADB, /* 0x60 */
+ 0xCADC, 0xCADD, 0xCADE, 0xCADF, 0xCAE1, 0xCAE2, 0xCAE3, 0xCAE4, /* 0x70 */
+ 0xCAE5, 0xCAE6, 0xCAE7, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCAE8, 0xCAE9, 0xCAEA, 0xCAEB, 0xCAED, 0xCAEE, 0xCAEF, /* 0x80 */
+ 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3, 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, /* 0x80 */
+ 0xCAF9, 0xCAFA, 0xCAFB, 0xCAFC, 0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, /* 0x90 */
+ 0xCB01, 0xCB02, 0xCB03, 0xCB04, 0xCB05, 0xCB06, 0xCB07, 0xCB09, /* 0x90 */
+ 0xCB0A, 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, /* 0xA0 */
+ 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, /* 0xA0 */
+ 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, /* 0xB0 */
+ 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, /* 0xB0 */
+ 0x2542, 0x2512, 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, /* 0xC0 */
+ 0x250D, 0x251E, 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, /* 0xC0 */
+ 0x252A, 0x252D, 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, /* 0xD0 */
+ 0x253A, 0x253D, 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, /* 0xD0 */
+ 0x2546, 0x2547, 0x2548, 0x2549, 0x254A /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCB0B, 0xCB0C, 0xCB0D, 0xCB0E, 0xCB0F, 0xCB11, 0xCB12, /* 0x40 */
+ 0xCB13, 0xCB15, 0xCB16, 0xCB17, 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, /* 0x40 */
+ 0xCB1D, 0xCB1E, 0xCB1F, 0xCB22, 0xCB23, 0xCB24, 0xCB25, 0xCB26, /* 0x50 */
+ 0xCB27, 0xCB28, 0xCB29, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCB2A, 0xCB2B, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, /* 0x60 */
+ 0xCB31, 0xCB32, 0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, /* 0x60 */
+ 0xCB39, 0xCB3A, 0xCB3B, 0xCB3C, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, /* 0x70 */
+ 0xCB42, 0xCB43, 0xCB44, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCB45, 0xCB46, 0xCB47, 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E, /* 0x80 */
+ 0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, 0xCB57, /* 0x80 */
+ 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62, /* 0x90 */
+ 0xCB63, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, 0xCB6B, /* 0x90 */
+ 0xCB6C, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33C4, 0x33A3, /* 0xA0 */
+ 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B, 0x339C, 0x339D, /* 0xA0 */
+ 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA, 0x338D, 0x338E, /* 0xB0 */
+ 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7, 0x33A8, 0x33B0, /* 0xB0 */
+ 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6, 0x33B7, 0x33B8, /* 0xC0 */
+ 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33BA, 0x33BB, /* 0xC0 */
+ 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391, 0x3392, 0x3393, /* 0xD0 */
+ 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B, 0x338C, 0x33D6, /* 0xD0 */
+ 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9, 0x33AA, 0x33AB, /* 0xE0 */
+ 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9, 0x33DC, 0x33C6 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, 0xCB73, /* 0x40 */
+ 0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D, /* 0x40 */
+ 0xCB7E, 0xCB7F, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85, /* 0x50 */
+ 0xCB86, 0xCB87, 0xCB88, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCB8E, 0xCB8F, /* 0x60 */
+ 0xCB90, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95, 0xCB96, 0xCB97, /* 0x60 */
+ 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9D, 0xCB9E, 0xCB9F, 0xCBA0, /* 0x70 */
+ 0xCBA1, 0xCBA2, 0xCBA3, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCBA4, 0xCBA5, 0xCBA6, 0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, /* 0x80 */
+ 0xCBAB, 0xCBAC, 0xCBAD, 0xCBAE, 0xCBAF, 0xCBB0, 0xCBB1, 0xCBB2, /* 0x80 */
+ 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6, 0xCBB7, 0xCBB9, 0xCBBA, 0xCBBB, /* 0x90 */
+ 0xCBBC, 0xCBBD, 0xCBBE, 0xCBBF, 0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, /* 0x90 */
+ 0xCBC4, 0x00C6, 0x00D0, 0x00AA, 0x0126, 0, 0x0132, 0, /* 0xA0 */
+ 0x013F, 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, /* 0xA0 */
+ 0, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, /* 0xB0 */
+ 0x3267, 0x3268, 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, /* 0xB0 */
+ 0x326F, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, /* 0xC0 */
+ 0x3277, 0x3278, 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, /* 0xC0 */
+ 0x24D3, 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, /* 0xD0 */
+ 0x24DB, 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, /* 0xD0 */
+ 0x24E3, 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, /* 0xE0 */
+ 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, /* 0xE0 */
+ 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153, /* 0xF0 */
+ 0x2154, 0x00BC, 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_A9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCBC5, 0xCBC6, 0xCBC7, 0xCBC8, 0xCBC9, 0xCBCA, 0xCBCB, /* 0x40 */
+ 0xCBCC, 0xCBCD, 0xCBCE, 0xCBCF, 0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, /* 0x40 */
+ 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8, 0xCBD9, 0xCBDA, 0xCBDB, 0xCBDC, /* 0x50 */
+ 0xCBDD, 0xCBDE, 0xCBDF, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCBE0, 0xCBE1, 0xCBE2, 0xCBE3, 0xCBE5, 0xCBE6, 0xCBE8, /* 0x60 */
+ 0xCBEA, 0xCBEB, 0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0xCBF0, 0xCBF1, /* 0x60 */
+ 0xCBF2, 0xCBF3, 0xCBF4, 0xCBF5, 0xCBF6, 0xCBF7, 0xCBF8, 0xCBF9, /* 0x70 */
+ 0xCBFA, 0xCBFB, 0xCBFC, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCBFD, 0xCBFE, 0xCBFF, 0xCC00, 0xCC01, 0xCC02, 0xCC03, /* 0x80 */
+ 0xCC04, 0xCC05, 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B, /* 0x80 */
+ 0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17, /* 0x90 */
+ 0xCC18, 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23, /* 0x90 */
+ 0xCC24, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138, /* 0xA0 */
+ 0x0140, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x0167, 0x014B, /* 0xA0 */
+ 0x0149, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, /* 0xB0 */
+ 0x3207, 0x3208, 0x3209, 0x320A, 0x320B, 0x320C, 0x320D, 0x320E, /* 0xB0 */
+ 0x320F, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, /* 0xC0 */
+ 0x3217, 0x3218, 0x3219, 0x321A, 0x321B, 0x249C, 0x249D, 0x249E, /* 0xC0 */
+ 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3, 0x24A4, 0x24A5, 0x24A6, /* 0xD0 */
+ 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB, 0x24AC, 0x24AD, 0x24AE, /* 0xD0 */
+ 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5, 0x2474, /* 0xE0 */
+ 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, /* 0xE0 */
+ 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x00B9, 0x00B2, /* 0xF0 */
+ 0x00B3, 0x2074, 0x207F, 0x2081, 0x2082, 0x2083, 0x2084 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_AA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCC25, 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31, /* 0x40 */
+ 0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F, /* 0x40 */
+ 0xCC40, 0xCC41, 0xCC42, 0xCC43, 0xCC46, 0xCC47, 0xCC49, 0xCC4A, /* 0x50 */
+ 0xCC4B, 0xCC4D, 0xCC4E, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53, 0xCC56, 0xCC5A, /* 0x60 */
+ 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC61, 0xCC62, 0xCC63, /* 0x60 */
+ 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D, 0xCC6E, /* 0x70 */
+ 0xCC6F, 0xCC71, 0xCC72, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCC73, 0xCC74, 0xCC76, 0xCC77, 0xCC78, 0xCC79, 0xCC7A, /* 0x80 */
+ 0xCC7B, 0xCC7C, 0xCC7D, 0xCC7E, 0xCC7F, 0xCC80, 0xCC81, 0xCC82, /* 0x80 */
+ 0xCC83, 0xCC84, 0xCC85, 0xCC86, 0xCC87, 0xCC88, 0xCC89, 0xCC8A, /* 0x90 */
+ 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E, 0xCC8F, 0xCC90, 0xCC91, 0xCC92, /* 0x90 */
+ 0xCC93, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, /* 0xA0 */
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, /* 0xA0 */
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, /* 0xB0 */
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, /* 0xB0 */
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, /* 0xC0 */
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, /* 0xC0 */
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, /* 0xD0 */
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, /* 0xD0 */
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, /* 0xE0 */
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, /* 0xE0 */
+ 0x3090, 0x3091, 0x3092, 0x3093 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_AB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCC94, 0xCC95, 0xCC96, 0xCC97, 0xCC9A, 0xCC9B, 0xCC9D, /* 0x40 */
+ 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2, 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, /* 0x40 */
+ 0xCCA7, 0xCCAA, 0xCCAE, 0xCCAF, 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, /* 0x50 */
+ 0xCCB6, 0xCCB7, 0xCCB9, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCCBA, 0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, /* 0x60 */
+ 0xCCC2, 0xCCC3, 0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, /* 0x60 */
+ 0xCCCE, 0xCCCF, 0xCCD1, 0xCCD2, 0xCCD3, 0xCCD5, 0xCCD6, 0xCCD7, /* 0x70 */
+ 0xCCD8, 0xCCD9, 0xCCDA, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, 0xCCDF, 0xCCE0, 0xCCE1, /* 0x80 */
+ 0xCCE2, 0xCCE3, 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA, /* 0x80 */
+ 0xCCEB, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF1, 0xCCF2, 0xCCF3, 0xCCF4, /* 0x90 */
+ 0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC, /* 0x90 */
+ 0xCCFD, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, /* 0xA0 */
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, /* 0xA0 */
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, /* 0xB0 */
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, /* 0xB0 */
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, /* 0xC0 */
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, /* 0xC0 */
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, /* 0xD0 */
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, /* 0xD0 */
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, /* 0xE0 */
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, /* 0xE0 */
+ 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_AC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCCFE, 0xCCFF, 0xCD00, 0xCD02, 0xCD03, 0xCD04, 0xCD05, /* 0x40 */
+ 0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, 0xCD0F, 0xCD11, /* 0x40 */
+ 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, 0xCD1C, /* 0x50 */
+ 0xCD1E, 0xCD1F, 0xCD20, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26, 0xCD27, 0xCD29, /* 0x60 */
+ 0xCD2A, 0xCD2B, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30, 0xCD31, 0xCD32, /* 0x60 */
+ 0xCD33, 0xCD34, 0xCD35, 0xCD36, 0xCD37, 0xCD38, 0xCD3A, 0xCD3B, /* 0x70 */
+ 0xCD3C, 0xCD3D, 0xCD3E, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCD3F, 0xCD40, 0xCD41, 0xCD42, 0xCD43, 0xCD44, 0xCD45, /* 0x80 */
+ 0xCD46, 0xCD47, 0xCD48, 0xCD49, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, /* 0x80 */
+ 0xCD4E, 0xCD4F, 0xCD50, 0xCD51, 0xCD52, 0xCD53, 0xCD54, 0xCD55, /* 0x90 */
+ 0xCD56, 0xCD57, 0xCD58, 0xCD59, 0xCD5A, 0xCD5B, 0xCD5D, 0xCD5E, /* 0x90 */
+ 0xCD5F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, /* 0xA0 */
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, /* 0xA0 */
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, /* 0xB0 */
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, /* 0xB0 */
+ 0x042E, 0x042F, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, /* 0xD0 */
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, /* 0xD0 */
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, /* 0xE0 */
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, /* 0xE0 */
+ 0x044E, 0x044F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_AD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCD61, 0xCD62, 0xCD63, 0xCD65, 0xCD66, 0xCD67, 0xCD68, /* 0x40 */
+ 0xCD69, 0xCD6A, 0xCD6B, 0xCD6E, 0xCD70, 0xCD72, 0xCD73, 0xCD74, /* 0x40 */
+ 0xCD75, 0xCD76, 0xCD77, 0xCD79, 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, /* 0x50 */
+ 0xCD7E, 0xCD7F, 0xCD80, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCD81, 0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, /* 0x60 */
+ 0xCD89, 0xCD8A, 0xCD8B, 0xCD8C, 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, /* 0x60 */
+ 0xCD91, 0xCD92, 0xCD93, 0xCD96, 0xCD97, 0xCD99, 0xCD9A, 0xCD9B, /* 0x70 */
+ 0xCD9D, 0xCD9E, 0xCD9F, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCDA0, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA, /* 0x80 */
+ 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, 0xCDB1, 0xCDB2, 0xCDB3, /* 0x80 */
+ 0xCDB4, 0xCDB5, 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB, /* 0x90 */
+ 0xCDBC, 0xCDBD, 0xCDBE, 0xCDBF, 0xCDC0, 0xCDC1, 0xCDC2, 0xCDC3, /* 0x90 */
+ 0xCDC5 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_AE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD, /* 0x40 */
+ 0xCDCE, 0xCDCF, 0xCDD1, 0xCDD2, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6, /* 0x40 */
+ 0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDDE, /* 0x50 */
+ 0xCDDF, 0xCDE0, 0xCDE1, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6, 0xCDE7, 0xCDE9, /* 0x60 */
+ 0xCDEA, 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1, 0xCDF2, 0xCDF3, /* 0x60 */
+ 0xCDF4, 0xCDF5, 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC, 0xCDFE, 0xCDFF, /* 0x70 */
+ 0xCE00, 0xCE01, 0xCE02, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCE03, 0xCE05, 0xCE06, 0xCE07, 0xCE09, 0xCE0A, 0xCE0B, /* 0x80 */
+ 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10, 0xCE11, 0xCE12, 0xCE13, 0xCE15, /* 0x80 */
+ 0xCE16, 0xCE17, 0xCE18, 0xCE1A, 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, /* 0x90 */
+ 0xCE1F, 0xCE22, 0xCE23, 0xCE25, 0xCE26, 0xCE27, 0xCE29, 0xCE2A, /* 0x90 */
+ 0xCE2B /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_AF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCE2C, 0xCE2D, 0xCE2E, 0xCE2F, 0xCE32, 0xCE34, 0xCE36, /* 0x40 */
+ 0xCE37, 0xCE38, 0xCE39, 0xCE3A, 0xCE3B, 0xCE3C, 0xCE3D, 0xCE3E, /* 0x40 */
+ 0xCE3F, 0xCE40, 0xCE41, 0xCE42, 0xCE43, 0xCE44, 0xCE45, 0xCE46, /* 0x50 */
+ 0xCE47, 0xCE48, 0xCE49, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCE4A, 0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, /* 0x60 */
+ 0xCE51, 0xCE52, 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0xCE5A, /* 0x60 */
+ 0xCE5B, 0xCE5D, 0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, /* 0x70 */
+ 0xCE67, 0xCE6A, 0xCE6C, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, 0xCE76, /* 0x80 */
+ 0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80, /* 0x80 */
+ 0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C, /* 0x90 */
+ 0xCE8D, 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97, /* 0x90 */
+ 0xCE99 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2, /* 0x40 */
+ 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAE, 0xCEAF, /* 0x40 */
+ 0xCEB0, 0xCEB1, 0xCEB2, 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7, /* 0x50 */
+ 0xCEB8, 0xCEB9, 0xCEBA, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCEBB, 0xCEBC, 0xCEBD, 0xCEBE, 0xCEBF, 0xCEC0, 0xCEC2, /* 0x60 */
+ 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0xCEC8, 0xCEC9, 0xCECA, /* 0x60 */
+ 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, 0xCED0, 0xCED1, 0xCED2, /* 0x70 */
+ 0xCED3, 0xCED4, 0xCED5, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCED6, 0xCED7, 0xCED8, 0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, /* 0x80 */
+ 0xCEDD, 0xCEDE, 0xCEDF, 0xCEE0, 0xCEE1, 0xCEE2, 0xCEE3, 0xCEE6, /* 0x80 */
+ 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED, 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, /* 0x90 */
+ 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA, 0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, /* 0x90 */
+ 0xCEFF, 0xAC00, 0xAC01, 0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A, /* 0xA0 */
+ 0xAC10, 0xAC11, 0xAC12, 0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17, /* 0xA0 */
+ 0xAC19, 0xAC1A, 0xAC1B, 0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C, /* 0xB0 */
+ 0xAC2D, 0xAC2F, 0xAC30, 0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40, /* 0xB0 */
+ 0xAC4B, 0xAC4D, 0xAC54, 0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, /* 0xC0 */
+ 0xAC77, 0xAC78, 0xAC7A, 0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, /* 0xC0 */
+ 0xAC86, 0xAC89, 0xAC8A, 0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, /* 0xD0 */
+ 0xAC9D, 0xAC9F, 0xACA0, 0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, /* 0xD0 */
+ 0xACAF, 0xACB0, 0xACB8, 0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, /* 0xE0 */
+ 0xACC4, 0xACC8, 0xACCC, 0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4, /* 0xE0 */
+ 0xACE7, 0xACE8, 0xACEA, 0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3, /* 0xF0 */
+ 0xACF5, 0xACF6, 0xACFC, 0xACFD, 0xAD00, 0xAD04, 0xAD06 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCF02, 0xCF03, 0xCF05, 0xCF06, 0xCF07, 0xCF09, 0xCF0A, /* 0x40 */
+ 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E, 0xCF0F, 0xCF12, 0xCF14, 0xCF16, /* 0x40 */
+ 0xCF17, 0xCF18, 0xCF19, 0xCF1A, 0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, /* 0x50 */
+ 0xCF21, 0xCF22, 0xCF23, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCF25, 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, /* 0x60 */
+ 0xCF2E, 0xCF32, 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0xCF39, /* 0x60 */
+ 0xCF3A, 0xCF3B, 0xCF3C, 0xCF3D, 0xCF3E, 0xCF3F, 0xCF40, 0xCF41, /* 0x70 */
+ 0xCF42, 0xCF43, 0xCF44, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCF45, 0xCF46, 0xCF47, 0xCF48, 0xCF49, 0xCF4A, 0xCF4B, /* 0x80 */
+ 0xCF4C, 0xCF4D, 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53, /* 0x80 */
+ 0xCF56, 0xCF57, 0xCF59, 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F, /* 0x90 */
+ 0xCF60, 0xCF61, 0xCF62, 0xCF63, 0xCF66, 0xCF68, 0xCF6A, 0xCF6B, /* 0x90 */
+ 0xCF6C, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11, 0xAD18, 0xAD1C, 0xAD20, /* 0xA0 */
+ 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35, 0xAD38, 0xAD3C, 0xAD44, /* 0xA0 */
+ 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54, 0xAD58, 0xAD61, 0xAD63, /* 0xB0 */
+ 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74, 0xAD75, 0xAD76, 0xAD7B, /* 0xB0 */
+ 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82, 0xAD88, 0xAD89, 0xAD8C, /* 0xC0 */
+ 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7, 0xADC0, 0xADC1, 0xADC4, /* 0xC0 */
+ 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC, 0xADE0, 0xADE4, 0xADF8, /* 0xD0 */
+ 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01, 0xAE08, 0xAE09, 0xAE0B, /* 0xD0 */
+ 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34, 0xAE37, 0xAE38, 0xAE3A, /* 0xE0 */
+ 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46, 0xAE4A, 0xAE4C, 0xAE4D, /* 0xE0 */
+ 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C, 0xAE5D, 0xAE5F, 0xAE60, /* 0xF0 */
+ 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C, 0xAE70, 0xAE78 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, 0xCF73, 0xCF75, 0xCF76, /* 0x40 */
+ 0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, 0xCF7F, /* 0x40 */
+ 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, 0xCF89, /* 0x50 */
+ 0xCF8A, 0xCF8B, 0xCF8D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92, 0xCF93, 0xCF94, /* 0x60 */
+ 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A, 0xCF9B, 0xCF9C, /* 0x60 */
+ 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA2, 0xCFA3, 0xCFA4, 0xCFA5, /* 0x70 */
+ 0xCFA6, 0xCFA7, 0xCFA9, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCFAA, 0xCFAB, 0xCFAC, 0xCFAD, 0xCFAE, 0xCFAF, 0xCFB1, /* 0x80 */
+ 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5, 0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, /* 0x80 */
+ 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD, 0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, /* 0x90 */
+ 0xCFC2, 0xCFC3, 0xCFC5, 0xCFC6, 0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, /* 0x90 */
+ 0xCFCB, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85, 0xAE8C, /* 0xA0 */
+ 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD, 0xAECF, /* 0xA0 */
+ 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB, 0xAEED, /* 0xB0 */
+ 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10, 0xAF2C, /* 0xB0 */
+ 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F, 0xAF41, /* 0xC0 */
+ 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D, 0xAF64, /* 0xC0 */
+ 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91, 0xAF95, /* 0xD0 */
+ 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8, 0xAFC9, /* 0xD0 */
+ 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9, 0xAFF0, /* 0xE0 */
+ 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C, 0xB010, /* 0xE0 */
+ 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048, 0xB04A, /* 0xF0 */
+ 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFCC, 0xCFCD, 0xCFCE, 0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, /* 0x40 */
+ 0xCFD3, 0xCFD4, 0xCFD5, 0xCFD6, 0xCFD7, 0xCFD8, 0xCFD9, 0xCFDA, /* 0x40 */
+ 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE, 0xCFDF, 0xCFE2, 0xCFE3, 0xCFE5, /* 0x50 */
+ 0xCFE6, 0xCFE7, 0xCFE9, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCFEA, 0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, /* 0x60 */
+ 0xCFF4, 0xCFF6, 0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, /* 0x60 */
+ 0xCFFE, 0xCFFF, 0xD001, 0xD002, 0xD003, 0xD005, 0xD006, 0xD007, /* 0x70 */
+ 0xD008, 0xD009, 0xD00A, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD00B, 0xD00C, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD012, /* 0x80 */
+ 0xD013, 0xD014, 0xD015, 0xD016, 0xD017, 0xD019, 0xD01A, 0xD01B, /* 0x80 */
+ 0xD01C, 0xD01D, 0xD01E, 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023, /* 0x90 */
+ 0xD024, 0xD025, 0xD026, 0xD027, 0xD028, 0xD029, 0xD02A, 0xD02B, /* 0x90 */
+ 0xD02C, 0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, /* 0xA0 */
+ 0xB08F, 0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, /* 0xA0 */
+ 0xB0A1, 0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, /* 0xB0 */
+ 0xB0AF, 0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, /* 0xB0 */
+ 0xB0C5, 0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8, /* 0xC0 */
+ 0xB0E0, 0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112, /* 0xC0 */
+ 0xB113, 0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124, /* 0xD0 */
+ 0xB125, 0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, /* 0xD0 */
+ 0xB140, 0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, /* 0xE0 */
+ 0xB158, 0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, /* 0xE0 */
+ 0xB188, 0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, /* 0xF0 */
+ 0xB19C, 0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036, /* 0x40 */
+ 0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040, /* 0x40 */
+ 0xD041, 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C, /* 0x50 */
+ 0xD04D, 0xD04E, 0xD04F, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056, 0xD057, 0xD059, /* 0x60 */
+ 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F, 0xD061, 0xD062, /* 0x60 */
+ 0xD063, 0xD064, 0xD065, 0xD066, 0xD067, 0xD068, 0xD069, 0xD06A, /* 0x70 */
+ 0xD06B, 0xD06E, 0xD06F, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD071, 0xD072, 0xD073, 0xD075, 0xD076, 0xD077, 0xD078, /* 0x80 */
+ 0xD079, 0xD07A, 0xD07B, 0xD07E, 0xD07F, 0xD080, 0xD082, 0xD083, /* 0x80 */
+ 0xD084, 0xD085, 0xD086, 0xD087, 0xD088, 0xD089, 0xD08A, 0xD08B, /* 0x90 */
+ 0xD08C, 0xD08D, 0xD08E, 0xD08F, 0xD090, 0xD091, 0xD092, 0xD093, /* 0x90 */
+ 0xD094, 0xB1DF, 0xB1E8, 0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB, /* 0xA0 */
+ 0xB1FD, 0xB204, 0xB205, 0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215, /* 0xA0 */
+ 0xB217, 0xB219, 0xB220, 0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, /* 0xB0 */
+ 0xB268, 0xB269, 0xB274, 0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, /* 0xB0 */
+ 0xB290, 0xB291, 0xB294, 0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, /* 0xC0 */
+ 0xB2A3, 0xB2A5, 0xB2A6, 0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, /* 0xC0 */
+ 0xB2C9, 0xB2CC, 0xB2D0, 0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, /* 0xD0 */
+ 0xB2E2, 0xB2E4, 0xB2E5, 0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, /* 0xD0 */
+ 0xB2EE, 0xB2EF, 0xB2F3, 0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9, /* 0xE0 */
+ 0xB2FA, 0xB2FB, 0xB2FF, 0xB300, 0xB301, 0xB304, 0xB308, 0xB310, /* 0xE0 */
+ 0xB311, 0xB313, 0xB314, 0xB315, 0xB31C, 0xB354, 0xB355, 0xB356, /* 0xF0 */
+ 0xB358, 0xB35B, 0xB35C, 0xB35E, 0xB35F, 0xB364, 0xB365 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD095, 0xD096, 0xD097, 0xD098, 0xD099, 0xD09A, 0xD09B, /* 0x40 */
+ 0xD09C, 0xD09D, 0xD09E, 0xD09F, 0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, /* 0x40 */
+ 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA, 0xD0AB, 0xD0AD, 0xD0AE, 0xD0AF, /* 0x50 */
+ 0xD0B0, 0xD0B1, 0xD0B2, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD0B3, 0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, /* 0x60 */
+ 0xD0BE, 0xD0BF, 0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, 0xD0CA, /* 0x60 */
+ 0xD0CB, 0xD0CC, 0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, /* 0x70 */
+ 0xD0D8, 0xD0D9, 0xD0DA, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E5, /* 0x80 */
+ 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2, /* 0x80 */
+ 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F9, 0xD0FA, 0xD0FB, /* 0x90 */
+ 0xD0FC, 0xD0FD, 0xD0FE, 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103, /* 0x90 */
+ 0xD104, 0xB367, 0xB369, 0xB36B, 0xB36E, 0xB370, 0xB371, 0xB374, /* 0xA0 */
+ 0xB378, 0xB380, 0xB381, 0xB383, 0xB384, 0xB385, 0xB38C, 0xB390, /* 0xA0 */
+ 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC, 0xB3C4, 0xB3C5, 0xB3C8, /* 0xB0 */
+ 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4, 0xB3D5, 0xB3D7, 0xB3D9, /* 0xB0 */
+ 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8, 0xB3FC, 0xB410, 0xB418, /* 0xC0 */
+ 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B, 0xB434, 0xB450, 0xB451, /* 0xC0 */
+ 0xB454, 0xB458, 0xB460, 0xB461, 0xB463, 0xB465, 0xB46C, 0xB480, /* 0xD0 */
+ 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC, 0xB4B5, 0xB4B7, 0xB4B9, /* 0xD0 */
+ 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5, 0xB4DC, 0xB4DD, 0xB4E0, /* 0xE0 */
+ 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED, 0xB4EF, 0xB4F1, 0xB4F8, /* 0xE0 */
+ 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C, 0xB524, 0xB525, 0xB527, /* 0xF0 */
+ 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531, 0xB534, 0xB538 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD105, 0xD106, 0xD107, 0xD108, 0xD109, 0xD10A, 0xD10B, /* 0x40 */
+ 0xD10C, 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, 0xD114, /* 0x40 */
+ 0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A, 0xD11B, 0xD11C, /* 0x50 */
+ 0xD11D, 0xD11E, 0xD11F, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD120, 0xD121, 0xD122, 0xD123, 0xD124, 0xD125, 0xD126, /* 0x60 */
+ 0xD127, 0xD128, 0xD129, 0xD12A, 0xD12B, 0xD12C, 0xD12D, 0xD12E, /* 0x60 */
+ 0xD12F, 0xD132, 0xD133, 0xD135, 0xD136, 0xD137, 0xD139, 0xD13B, /* 0x70 */
+ 0xD13C, 0xD13D, 0xD13E, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD13F, 0xD142, 0xD146, 0xD147, 0xD148, 0xD149, 0xD14A, /* 0x80 */
+ 0xD14B, 0xD14E, 0xD14F, 0xD151, 0xD152, 0xD153, 0xD155, 0xD156, /* 0x80 */
+ 0xD157, 0xD158, 0xD159, 0xD15A, 0xD15B, 0xD15E, 0xD160, 0xD162, /* 0x90 */
+ 0xD163, 0xD164, 0xD165, 0xD166, 0xD167, 0xD169, 0xD16A, 0xD16B, /* 0x90 */
+ 0xD16D, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B, 0xB54C, /* 0xA0 */
+ 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560, 0xB561, /* 0xA0 */
+ 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0, 0xB5B1, /* 0xB0 */
+ 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0, 0xB5C4, /* 0xB0 */
+ 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC, 0xB610, /* 0xC0 */
+ 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648, 0xB664, /* 0xC0 */
+ 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC, 0xB6B1, /* 0xD0 */
+ 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705, 0xB728, /* 0xD0 */
+ 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B, 0xB744, /* 0xE0 */
+ 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768, 0xB770, /* 0xE0 */
+ 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784, 0xB78C, /* 0xF0 */
+ 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD16E, 0xD16F, 0xD170, 0xD171, 0xD172, 0xD173, 0xD174, /* 0x40 */
+ 0xD175, 0xD176, 0xD177, 0xD178, 0xD179, 0xD17A, 0xD17B, 0xD17D, /* 0x40 */
+ 0xD17E, 0xD17F, 0xD180, 0xD181, 0xD182, 0xD183, 0xD185, 0xD186, /* 0x50 */
+ 0xD187, 0xD189, 0xD18A, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD18B, 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, /* 0x60 */
+ 0xD192, 0xD193, 0xD194, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, /* 0x60 */
+ 0xD19A, 0xD19B, 0xD19C, 0xD19D, 0xD19E, 0xD19F, 0xD1A2, 0xD1A3, /* 0x70 */
+ 0xD1A5, 0xD1A6, 0xD1A7, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF, /* 0x80 */
+ 0xD1B2, 0xD1B4, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD, /* 0x80 */
+ 0xD1BE, 0xD1BF, 0xD1C1, 0xD1C2, 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6, /* 0x90 */
+ 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, 0xD1CB, 0xD1CC, 0xD1CD, 0xD1CE, /* 0x90 */
+ 0xD1CF, 0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, /* 0xA0 */
+ 0xB7AC, 0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, /* 0xA0 */
+ 0xB7ED, 0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801, /* 0xB0 */
+ 0xB807, 0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B, /* 0xB0 */
+ 0xB81D, 0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837, /* 0xC0 */
+ 0xB838, 0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, /* 0xC0 */
+ 0xB860, 0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, /* 0xD0 */
+ 0xB88D, 0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, /* 0xD0 */
+ 0xB8C5, 0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, /* 0xE0 */
+ 0xB8E9, 0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, /* 0xE0 */
+ 0xB918, 0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F, /* 0xF0 */
+ 0xB951, 0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1D0, 0xD1D1, 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6, /* 0x40 */
+ 0xD1D7, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE, 0xD1DF, /* 0x40 */
+ 0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, 0xD1E7, /* 0x50 */
+ 0xD1E8, 0xD1E9, 0xD1EA, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF, 0xD1F0, 0xD1F1, /* 0x60 */
+ 0xD1F2, 0xD1F3, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F9, 0xD1FA, 0xD1FB, /* 0x60 */
+ 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201, 0xD202, 0xD203, /* 0x70 */
+ 0xD204, 0xD205, 0xD206, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD208, 0xD20A, 0xD20B, 0xD20C, 0xD20D, 0xD20E, 0xD20F, /* 0x80 */
+ 0xD211, 0xD212, 0xD213, 0xD214, 0xD215, 0xD216, 0xD217, 0xD218, /* 0x80 */
+ 0xD219, 0xD21A, 0xD21B, 0xD21C, 0xD21D, 0xD21E, 0xD21F, 0xD220, /* 0x90 */
+ 0xD221, 0xD222, 0xD223, 0xD224, 0xD225, 0xD226, 0xD227, 0xD228, /* 0x90 */
+ 0xD229, 0xB96B, 0xB96D, 0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, /* 0xA0 */
+ 0xB985, 0xB987, 0xB989, 0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, /* 0xA0 */
+ 0xB9B0, 0xB9B4, 0xB9BC, 0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, /* 0xB0 */
+ 0xB9CC, 0xB9CE, 0xB9CF, 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, /* 0xB0 */
+ 0xB9DB, 0xB9DD, 0xB9DE, 0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, /* 0xC0 */
+ 0xB9EC, 0xB9F4, 0xB9F5, 0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, /* 0xC0 */
+ 0xBA01, 0xBA08, 0xBA15, 0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42, /* 0xD0 */
+ 0xBA48, 0xBA49, 0xBA4B, 0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55, /* 0xD0 */
+ 0xBA58, 0xBA5C, 0xBA64, 0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70, /* 0xE0 */
+ 0xBA71, 0xBA74, 0xBA78, 0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, /* 0xE0 */
+ 0xBAA8, 0xBAA9, 0xBAAB, 0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, /* 0xF0 */
+ 0xBABB, 0xBABD, 0xBAC4, 0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_B9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD22A, 0xD22B, 0xD22E, 0xD22F, 0xD231, 0xD232, 0xD233, /* 0x40 */
+ 0xD235, 0xD236, 0xD237, 0xD238, 0xD239, 0xD23A, 0xD23B, 0xD23E, /* 0x40 */
+ 0xD240, 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247, 0xD249, /* 0x50 */
+ 0xD24A, 0xD24B, 0xD24C, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD24D, 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, /* 0x60 */
+ 0xD254, 0xD255, 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, /* 0x60 */
+ 0xD25D, 0xD25E, 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xD265, /* 0x70 */
+ 0xD266, 0xD267, 0xD268, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD269, 0xD26A, 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F, /* 0x80 */
+ 0xD270, 0xD271, 0xD272, 0xD273, 0xD274, 0xD275, 0xD276, 0xD277, /* 0x80 */
+ 0xD278, 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F, /* 0x90 */
+ 0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, 0xD28B, /* 0x90 */
+ 0xD28C, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F, 0xBB11, 0xBB18, 0xBB1C, /* 0xA0 */
+ 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35, 0xBB36, 0xBB38, 0xBB3B, /* 0xA0 */
+ 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45, 0xBB47, 0xBB49, 0xBB4D, /* 0xB0 */
+ 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61, 0xBB63, 0xBB6C, 0xBB88, /* 0xB0 */
+ 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC, 0xBBB4, 0xBBB7, 0xBBC0, /* 0xC0 */
+ 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8, 0xBBF9, 0xBBFC, 0xBBFF, /* 0xC0 */
+ 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B, 0xBC0C, 0xBC0D, 0xBC0F, /* 0xD0 */
+ 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17, 0xBC18, 0xBC1B, 0xBC1C, /* 0xD0 */
+ 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25, 0xBC27, 0xBC29, 0xBC2D, /* 0xE0 */
+ 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40, 0xBC41, 0xBC43, 0xBC44, /* 0xE0 */
+ 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50, 0xBC5D, 0xBC84, 0xBC85, /* 0xF0 */
+ 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94, 0xBC95, 0xBC97 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_BA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296, /* 0x40 */
+ 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F, /* 0x40 */
+ 0xD2A1, 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9, /* 0x50 */
+ 0xD2AA, 0xD2AB, 0xD2AD, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3, 0xD2B4, 0xD2B5, /* 0x60 */
+ 0xD2B6, 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE, 0xD2C1, 0xD2C3, /* 0x60 */
+ 0xD2C4, 0xD2C5, 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC, 0xD2CD, 0xD2CE, /* 0x70 */
+ 0xD2CF, 0xD2D0, 0xD2D1, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD2D2, 0xD2D3, 0xD2D5, 0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, /* 0x80 */
+ 0xD2DB, 0xD2DD, 0xD2DE, 0xD2DF, 0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, /* 0x80 */
+ 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9, 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, /* 0x90 */
+ 0xD2EE, 0xD2EF, 0xD2F2, 0xD2F3, 0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, /* 0x90 */
+ 0xD2FA, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7, 0xBCA8, /* 0xA0 */
+ 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD, 0xBCC0, /* 0xA0 */
+ 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8, 0xBCDC, /* 0xB0 */
+ 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05, 0xBD07, /* 0xB0 */
+ 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48, 0xBD49, /* 0xC0 */
+ 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80, 0xBD81, /* 0xC0 */
+ 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91, 0xBD93, /* 0xD0 */
+ 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8, 0xBDD4, /* 0xD0 */
+ 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8, 0xBE00, /* 0xE0 */
+ 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C, 0xBE1D, /* 0xE0 */
+ 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54, 0xBE55, /* 0xF0 */
+ 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_BB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2FB, 0xD2FC, 0xD2FD, 0xD2FE, 0xD2FF, 0xD302, 0xD304, /* 0x40 */
+ 0xD306, 0xD307, 0xD308, 0xD309, 0xD30A, 0xD30B, 0xD30F, 0xD311, /* 0x40 */
+ 0xD312, 0xD313, 0xD315, 0xD317, 0xD318, 0xD319, 0xD31A, 0xD31B, /* 0x50 */
+ 0xD31E, 0xD322, 0xD323, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD324, 0xD326, 0xD327, 0xD32A, 0xD32B, 0xD32D, 0xD32E, /* 0x60 */
+ 0xD32F, 0xD331, 0xD332, 0xD333, 0xD334, 0xD335, 0xD336, 0xD337, /* 0x60 */
+ 0xD33A, 0xD33E, 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0xD346, /* 0x70 */
+ 0xD347, 0xD348, 0xD349, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350, /* 0x80 */
+ 0xD351, 0xD352, 0xD353, 0xD354, 0xD355, 0xD356, 0xD357, 0xD358, /* 0x80 */
+ 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0xD360, /* 0x90 */
+ 0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368, /* 0x90 */
+ 0xD369, 0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, /* 0xA0 */
+ 0xBE7B, 0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F, /* 0xA0 */
+ 0xBE90, 0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4, /* 0xB0 */
+ 0xBED7, 0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, /* 0xB0 */
+ 0xBF08, 0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, /* 0xC0 */
+ 0xBF41, 0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, /* 0xC0 */
+ 0xBFC5, 0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, /* 0xD0 */
+ 0xC03C, 0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, /* 0xD0 */
+ 0xC091, 0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, /* 0xE0 */
+ 0xC0AD, 0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC, /* 0xE0 */
+ 0xC0BD, 0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC, /* 0xF0 */
+ 0xC0D0, 0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_BC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370, /* 0x40 */
+ 0xD371, 0xD372, 0xD373, 0xD374, 0xD375, 0xD376, 0xD377, 0xD378, /* 0x40 */
+ 0xD379, 0xD37A, 0xD37B, 0xD37E, 0xD37F, 0xD381, 0xD382, 0xD383, /* 0x50 */
+ 0xD385, 0xD386, 0xD387, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38E, 0xD392, 0xD393, /* 0x60 */
+ 0xD394, 0xD395, 0xD396, 0xD397, 0xD39A, 0xD39B, 0xD39D, 0xD39E, /* 0x60 */
+ 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5, 0xD3A6, 0xD3A7, /* 0x70 */
+ 0xD3AA, 0xD3AC, 0xD3AE, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD3AF, 0xD3B0, 0xD3B1, 0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, /* 0x80 */
+ 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB, 0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, /* 0x80 */
+ 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6, 0xD3C7, 0xD3CA, 0xD3CB, 0xD3CC, /* 0x90 */
+ 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1, 0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, /* 0x90 */
+ 0xD3D6, 0xC0E5, 0xC0E8, 0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, /* 0xA0 */
+ 0xC100, 0xC104, 0xC108, 0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, /* 0xA0 */
+ 0xC11F, 0xC120, 0xC123, 0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, /* 0xB0 */
+ 0xC12F, 0xC130, 0xC131, 0xC136, 0xC138, 0xC139, 0xC13C, 0xC140, /* 0xB0 */
+ 0xC148, 0xC149, 0xC14B, 0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158, /* 0xC0 */
+ 0xC15C, 0xC164, 0xC165, 0xC167, 0xC168, 0xC169, 0xC170, 0xC174, /* 0xC0 */
+ 0xC178, 0xC185, 0xC18C, 0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196, /* 0xD0 */
+ 0xC19C, 0xC19D, 0xC19F, 0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, /* 0xD0 */
+ 0xC1B0, 0xC1BD, 0xC1C4, 0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, /* 0xE0 */
+ 0xC1E0, 0xC1E4, 0xC1E8, 0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, /* 0xE0 */
+ 0xC200, 0xC204, 0xC20C, 0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, /* 0xF0 */
+ 0xC21C, 0xC21F, 0xC220, 0xC228, 0xC229, 0xC22B, 0xC22D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_BD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD3D7, 0xD3D9, 0xD3DA, 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, /* 0x40 */
+ 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4, 0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, /* 0x40 */
+ 0xD3E9, 0xD3EA, 0xD3EB, 0xD3EE, 0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, /* 0x50 */
+ 0xD3F5, 0xD3F6, 0xD3F7, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD3F8, 0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, /* 0x60 */
+ 0xD403, 0xD404, 0xD405, 0xD406, 0xD407, 0xD409, 0xD40A, 0xD40B, /* 0x60 */
+ 0xD40C, 0xD40D, 0xD40E, 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, /* 0x70 */
+ 0xD414, 0xD415, 0xD416, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD417, 0xD418, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41E, /* 0x80 */
+ 0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, 0xD424, 0xD425, 0xD426, /* 0x80 */
+ 0xD427, 0xD428, 0xD429, 0xD42A, 0xD42B, 0xD42C, 0xD42D, 0xD42E, /* 0x90 */
+ 0xD42F, 0xD430, 0xD431, 0xD432, 0xD433, 0xD434, 0xD435, 0xD436, /* 0x90 */
+ 0xD437, 0xC22F, 0xC231, 0xC232, 0xC234, 0xC248, 0xC250, 0xC251, /* 0xA0 */
+ 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C, 0xC26D, 0xC270, 0xC274, /* 0xA0 */
+ 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288, 0xC289, 0xC290, 0xC298, /* 0xB0 */
+ 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8, 0xC2AC, 0xC2AD, 0xC2B4, /* 0xB0 */
+ 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD, 0xC2E0, 0xC2E3, 0xC2E4, /* 0xC0 */
+ 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1, 0xC2F6, 0xC2F8, 0xC2F9, /* 0xC0 */
+ 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309, 0xC30C, 0xC30D, 0xC313, /* 0xD0 */
+ 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324, 0xC325, 0xC328, 0xC329, /* 0xD0 */
+ 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370, 0xC372, 0xC378, 0xC379, /* 0xE0 */
+ 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C, 0xC3C0, 0xC3D8, 0xC3D9, /* 0xE0 */
+ 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8, 0xC3E9, 0xC3ED, 0xC3F4, /* 0xF0 */
+ 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424, 0xC42C, 0xC430 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_BE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD438, 0xD439, 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E, /* 0x40 */
+ 0xD43F, 0xD441, 0xD442, 0xD443, 0xD445, 0xD446, 0xD447, 0xD448, /* 0x40 */
+ 0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450, /* 0x50 */
+ 0xD451, 0xD452, 0xD453, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458, 0xD459, 0xD45A, /* 0x60 */
+ 0xD45B, 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462, 0xD463, 0xD465, /* 0x60 */
+ 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B, 0xD46C, 0xD46E, /* 0x70 */
+ 0xD470, 0xD471, 0xD472, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477, 0xD47A, 0xD47B, /* 0x80 */
+ 0xD47D, 0xD47E, 0xD481, 0xD483, 0xD484, 0xD485, 0xD486, 0xD487, /* 0x80 */
+ 0xD48A, 0xD48C, 0xD48E, 0xD48F, 0xD490, 0xD491, 0xD492, 0xD493, /* 0x90 */
+ 0xD495, 0xD496, 0xD497, 0xD498, 0xD499, 0xD49A, 0xD49B, 0xD49C, /* 0x90 */
+ 0xD49D, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465, 0xC468, /* 0xA0 */
+ 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C, 0xC4B8, /* 0xA0 */
+ 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA, 0xC4FF, /* 0xB0 */
+ 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528, 0xC529, /* 0xB0 */
+ 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544, 0xC545, /* 0xC0 */
+ 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553, 0xC554, /* 0xC0 */
+ 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560, 0xC561, /* 0xD0 */
+ 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575, 0xC57C, /* 0xD0 */
+ 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F, 0xC591, /* 0xE0 */
+ 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4, 0xC5B5, /* 0xE0 */
+ 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4, 0xC5C5, /* 0xF0 */
+ 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_BF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD49E, 0xD49F, 0xD4A0, 0xD4A1, 0xD4A2, 0xD4A3, 0xD4A4, /* 0x40 */
+ 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8, 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, /* 0x40 */
+ 0xD4AE, 0xD4AF, 0xD4B0, 0xD4B1, 0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, /* 0x50 */
+ 0xD4B6, 0xD4B7, 0xD4B8, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD4B9, 0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, 0xD4BF, /* 0x60 */
+ 0xD4C0, 0xD4C1, 0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5, 0xD4C6, 0xD4C7, /* 0x60 */
+ 0xD4C8, 0xD4C9, 0xD4CA, 0xD4CB, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D1, /* 0x70 */
+ 0xD4D2, 0xD4D3, 0xD4D5, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD, /* 0x80 */
+ 0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6, /* 0x80 */
+ 0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, 0xD4EF, 0xD4F1, /* 0x90 */
+ 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, 0xD4FA, /* 0x90 */
+ 0xD4FC, 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3, /* 0xA0 */
+ 0xC5E5, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, /* 0xA0 */
+ 0xC5FC, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, /* 0xB0 */
+ 0xC607, 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, /* 0xB0 */
+ 0xC624, 0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, /* 0xC0 */
+ 0xC634, 0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, /* 0xC0 */
+ 0xC648, 0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D, /* 0xD0 */
+ 0xC660, 0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680, /* 0xD0 */
+ 0xC688, 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C, /* 0xE0 */
+ 0xC6A4, 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8, /* 0xE0 */
+ 0xC6B9, 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, /* 0xF0 */
+ 0xC6D0, 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505, /* 0x40 */
+ 0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F, /* 0x40 */
+ 0xD510, 0xD511, 0xD512, 0xD513, 0xD516, 0xD518, 0xD519, 0xD51A, /* 0x50 */
+ 0xD51B, 0xD51C, 0xD51D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD51E, 0xD51F, 0xD520, 0xD521, 0xD522, 0xD523, 0xD524, /* 0x60 */
+ 0xD525, 0xD526, 0xD527, 0xD528, 0xD529, 0xD52A, 0xD52B, 0xD52C, /* 0x60 */
+ 0xD52D, 0xD52E, 0xD52F, 0xD530, 0xD531, 0xD532, 0xD533, 0xD534, /* 0x70 */
+ 0xD535, 0xD536, 0xD537, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD538, 0xD539, 0xD53A, 0xD53B, 0xD53E, 0xD53F, 0xD541, /* 0x80 */
+ 0xD542, 0xD543, 0xD545, 0xD546, 0xD547, 0xD548, 0xD549, 0xD54A, /* 0x80 */
+ 0xD54B, 0xD54E, 0xD550, 0xD552, 0xD553, 0xD554, 0xD555, 0xD556, /* 0x90 */
+ 0xD557, 0xD55A, 0xD55B, 0xD55D, 0xD55E, 0xD55F, 0xD561, 0xD562, /* 0x90 */
+ 0xD563, 0xC6E9, 0xC6EC, 0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, /* 0xA0 */
+ 0xC705, 0xC708, 0xC70C, 0xC714, 0xC715, 0xC717, 0xC719, 0xC720, /* 0xA0 */
+ 0xC721, 0xC724, 0xC728, 0xC730, 0xC731, 0xC733, 0xC735, 0xC737, /* 0xB0 */
+ 0xC73C, 0xC73D, 0xC740, 0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F, /* 0xB0 */
+ 0xC751, 0xC752, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, /* 0xC0 */
+ 0xC75C, 0xC760, 0xC768, 0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, /* 0xC0 */
+ 0xC77D, 0xC77E, 0xC783, 0xC784, 0xC785, 0xC787, 0xC788, 0xC789, /* 0xD0 */
+ 0xC78A, 0xC78E, 0xC790, 0xC791, 0xC794, 0xC796, 0xC797, 0xC798, /* 0xD0 */
+ 0xC79A, 0xC7A0, 0xC7A1, 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, /* 0xE0 */
+ 0xC7AD, 0xC7B0, 0xC7B4, 0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, /* 0xE0 */
+ 0xC7C8, 0xC7C9, 0xC7CC, 0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, /* 0xF0 */
+ 0xC7E8, 0xC7EC, 0xC800, 0xC801, 0xC804, 0xC808, 0xC80A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD564, 0xD566, 0xD567, 0xD56A, 0xD56C, 0xD56E, 0xD56F, /* 0x40 */
+ 0xD570, 0xD571, 0xD572, 0xD573, 0xD576, 0xD577, 0xD579, 0xD57A, /* 0x40 */
+ 0xD57B, 0xD57D, 0xD57E, 0xD57F, 0xD580, 0xD581, 0xD582, 0xD583, /* 0x50 */
+ 0xD586, 0xD58A, 0xD58B, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD58C, 0xD58D, 0xD58E, 0xD58F, 0xD591, 0xD592, 0xD593, /* 0x60 */
+ 0xD594, 0xD595, 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, /* 0x60 */
+ 0xD59C, 0xD59D, 0xD59E, 0xD59F, 0xD5A0, 0xD5A1, 0xD5A2, 0xD5A3, /* 0x70 */
+ 0xD5A4, 0xD5A6, 0xD5A7, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0xD5AC, 0xD5AD, 0xD5AE, /* 0x80 */
+ 0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6, /* 0x80 */
+ 0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, 0xD5BB, 0xD5BC, 0xD5BD, 0xD5BE, /* 0x90 */
+ 0xD5BF, 0xD5C0, 0xD5C1, 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6, /* 0x90 */
+ 0xD5C7, 0xC810, 0xC811, 0xC813, 0xC815, 0xC816, 0xC81C, 0xC81D, /* 0xA0 */
+ 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F, 0xC831, 0xC838, 0xC83C, /* 0xA0 */
+ 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D, 0xC854, 0xC870, 0xC871, /* 0xB0 */
+ 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881, 0xC883, 0xC885, 0xC886, /* 0xB0 */
+ 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894, 0xC89D, 0xC89F, 0xC8A1, /* 0xC0 */
+ 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8, 0xC8CC, 0xC8D4, 0xC8D5, /* 0xC0 */
+ 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4, 0xC8F5, 0xC8FC, 0xC8FD, /* 0xD0 */
+ 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C, 0xC90D, 0xC90F, 0xC911, /* 0xD0 */
+ 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951, 0xC954, 0xC958, 0xC960, /* 0xE0 */
+ 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974, 0xC97C, 0xC988, 0xC989, /* 0xE0 */
+ 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B, 0xC99D, 0xC9C0, 0xC9C1, /* 0xF0 */
+ 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0, 0xC9D1, 0xC9D3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD5CA, 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3, /* 0x40 */
+ 0xD5D4, 0xD5D5, 0xD5D6, 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF, /* 0x40 */
+ 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA, /* 0x50 */
+ 0xD5EB, 0xD5ED, 0xD5EE, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, 0xD5F3, 0xD5F6, 0xD5F8, /* 0x60 */
+ 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF, 0xD602, 0xD603, /* 0x60 */
+ 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, 0xD60B, 0xD60C, 0xD60D, /* 0x70 */
+ 0xD60E, 0xD60F, 0xD612, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD616, 0xD617, 0xD618, 0xD619, 0xD61A, 0xD61B, 0xD61D, /* 0x80 */
+ 0xD61E, 0xD61F, 0xD621, 0xD622, 0xD623, 0xD625, 0xD626, 0xD627, /* 0x80 */
+ 0xD628, 0xD629, 0xD62A, 0xD62B, 0xD62C, 0xD62E, 0xD62F, 0xD630, /* 0x90 */
+ 0xD631, 0xD632, 0xD633, 0xD634, 0xD635, 0xD636, 0xD637, 0xD63A, /* 0x90 */
+ 0xD63B, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD, 0xC9E0, /* 0xA0 */
+ 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0, 0xC9F1, /* 0xA0 */
+ 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B, 0xCA0C, /* 0xB0 */
+ 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50, 0xCA54, /* 0xB0 */
+ 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D, 0xCA84, /* 0xC0 */
+ 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD, 0xCACF, /* 0xC0 */
+ 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4, 0xCB08, /* 0xD0 */
+ 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48, 0xCB49, /* 0xD0 */
+ 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78, 0xCB79, /* 0xE0 */
+ 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C, 0xCC0D, /* 0xE0 */
+ 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27, 0xCC28, /* 0xF0 */
+ 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD63D, 0xD63E, 0xD63F, 0xD641, 0xD642, 0xD643, 0xD644, /* 0x40 */
+ 0xD646, 0xD647, 0xD64A, 0xD64C, 0xD64E, 0xD64F, 0xD650, 0xD652, /* 0x40 */
+ 0xD653, 0xD656, 0xD657, 0xD659, 0xD65A, 0xD65B, 0xD65D, 0xD65E, /* 0x50 */
+ 0xD65F, 0xD660, 0xD661, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD662, 0xD663, 0xD664, 0xD665, 0xD666, 0xD668, 0xD66A, /* 0x60 */
+ 0xD66B, 0xD66C, 0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, 0xD675, /* 0x60 */
+ 0xD676, 0xD677, 0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, /* 0x70 */
+ 0xD67E, 0xD67F, 0xD680, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD681, 0xD682, 0xD684, 0xD686, 0xD687, 0xD688, 0xD689, /* 0x80 */
+ 0xD68A, 0xD68B, 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695, /* 0x80 */
+ 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E, /* 0x90 */
+ 0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9, /* 0x90 */
+ 0xD6AA, 0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, /* 0xA0 */
+ 0xCC54, 0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, /* 0xA0 */
+ 0xCC68, 0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, /* 0xB0 */
+ 0xCCA9, 0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, /* 0xB0 */
+ 0xCCC4, 0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, /* 0xC0 */
+ 0xCCF0, 0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19, /* 0xC0 */
+ 0xCD1B, 0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60, /* 0xD0 */
+ 0xCD64, 0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94, /* 0xD0 */
+ 0xCD95, 0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, /* 0xE0 */
+ 0xCDC4, 0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, /* 0xE0 */
+ 0xCDFB, 0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, /* 0xF0 */
+ 0xCE21, 0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, 0xD6B1, 0xD6B2, 0xD6B3, /* 0x40 */
+ 0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, 0xD6BC, 0xD6BD, /* 0x40 */
+ 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, 0xD6C7, /* 0x50 */
+ 0xD6C9, 0xD6CA, 0xD6CB, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2, 0xD6D3, 0xD6D5, /* 0x60 */
+ 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD, 0xD6DE, 0xD6DF, /* 0x60 */
+ 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7, 0xD6E9, 0xD6EA, /* 0x70 */
+ 0xD6EB, 0xD6EC, 0xD6ED, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD6EE, 0xD6EF, 0xD6F1, 0xD6F2, 0xD6F3, 0xD6F4, 0xD6F6, /* 0x80 */
+ 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA, 0xD6FB, 0xD6FE, 0xD6FF, 0xD701, /* 0x80 */
+ 0xD702, 0xD703, 0xD705, 0xD706, 0xD707, 0xD708, 0xD709, 0xD70A, /* 0x90 */
+ 0xD70B, 0xD70C, 0xD70D, 0xD70E, 0xD70F, 0xD710, 0xD712, 0xD713, /* 0x90 */
+ 0xD714, 0xCE58, 0xCE59, 0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68, /* 0xA0 */
+ 0xCE69, 0xCE6B, 0xCE6D, 0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84, /* 0xA0 */
+ 0xCE85, 0xCE87, 0xCE89, 0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0, /* 0xB0 */
+ 0xCEA1, 0xCEA3, 0xCEA4, 0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, /* 0xB0 */
+ 0xCEE5, 0xCEE8, 0xCEEB, 0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, /* 0xC0 */
+ 0xCEF9, 0xCF00, 0xCF01, 0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, /* 0xC0 */
+ 0xCF15, 0xCF1C, 0xCF20, 0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, /* 0xD0 */
+ 0xCF31, 0xCF38, 0xCF54, 0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, /* 0xD0 */
+ 0xCF67, 0xCF69, 0xCF70, 0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85, /* 0xE0 */
+ 0xCF8C, 0xCFA1, 0xCFA8, 0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4, /* 0xE0 */
+ 0xCFE8, 0xCFF0, 0xCFF1, 0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004, /* 0xF0 */
+ 0xD011, 0xD018, 0xD02D, 0xD034, 0xD035, 0xD038, 0xD03C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD715, 0xD716, 0xD717, 0xD71A, 0xD71B, 0xD71D, 0xD71E, /* 0x40 */
+ 0xD71F, 0xD721, 0xD722, 0xD723, 0xD724, 0xD725, 0xD726, 0xD727, /* 0x40 */
+ 0xD72A, 0xD72C, 0xD72E, 0xD72F, 0xD730, 0xD731, 0xD732, 0xD733, /* 0x50 */
+ 0xD736, 0xD737, 0xD739, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD73A, 0xD73B, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, /* 0x60 */
+ 0xD742, 0xD743, 0xD745, 0xD746, 0xD748, 0xD74A, 0xD74B, 0xD74C, /* 0x60 */
+ 0xD74D, 0xD74E, 0xD74F, 0xD752, 0xD753, 0xD755, 0xD75A, 0xD75B, /* 0x70 */
+ 0xD75C, 0xD75D, 0xD75E, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD75F, 0xD762, 0xD764, 0xD766, 0xD767, 0xD768, 0xD76A, /* 0x80 */
+ 0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, 0xD772, 0xD773, 0xD775, /* 0x80 */
+ 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77E, 0xD77F, /* 0x90 */
+ 0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD78A, /* 0x90 */
+ 0xD78B, 0xD044, 0xD045, 0xD047, 0xD049, 0xD050, 0xD054, 0xD058, /* 0xA0 */
+ 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074, 0xD07C, 0xD07D, 0xD081, /* 0xA0 */
+ 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4, 0xD0B5, 0xD0B7, 0xD0B9, /* 0xB0 */
+ 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9, 0xD0D0, 0xD0D1, 0xD0D3, /* 0xB0 */
+ 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0, 0xD0E4, 0xD0EC, 0xD0ED, /* 0xC0 */
+ 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D, 0xD130, 0xD131, 0xD134, /* 0xC0 */
+ 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143, 0xD144, 0xD145, 0xD14C, /* 0xD0 */
+ 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D, 0xD15F, 0xD161, 0xD168, /* 0xD0 */
+ 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0, 0xD1A1, 0xD1A4, 0xD1A8, /* 0xE0 */
+ 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA, 0xD1BC, 0xD1C0, 0xD1D8, /* 0xE0 */
+ 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210, 0xD22C, 0xD22D, 0xD230, /* 0xF0 */
+ 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241, 0xD248, 0xD25C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794, /* 0x40 */
+ 0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0, /* 0x40 */
+ 0xD7A1, 0xD7A2, 0xD7A3, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290, 0xD291, /* 0xA0 */
+ 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8, 0xD2B9, /* 0xA0 */
+ 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB, 0xD2D4, /* 0xB0 */
+ 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4, 0xD2F8, /* 0xB0 */
+ 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E, 0xD310, /* 0xC0 */
+ 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321, 0xD325, /* 0xC0 */
+ 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B, 0xD33C, /* 0xD0 */
+ 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384, 0xD38C, /* 0xD0 */
+ 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C, 0xD3A0, /* 0xE0 */
+ 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC, 0xD3C4, /* 0xE0 */
+ 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3, 0xD3EC, /* 0xF0 */
+ 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, /* 0xA0 */
+ 0xD46D, 0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, /* 0xA0 */
+ 0xD488, 0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, /* 0xB0 */
+ 0xD4D4, 0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB, /* 0xB0 */
+ 0xD4FD, 0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C, /* 0xC0 */
+ 0xD53D, 0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558, /* 0xC0 */
+ 0xD559, 0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, /* 0xD0 */
+ 0xD574, 0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, /* 0xD0 */
+ 0xD589, 0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, /* 0xE0 */
+ 0xD5D8, 0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, /* 0xE0 */
+ 0xD5F4, 0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, /* 0xF0 */
+ 0xD610, 0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_C8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD624, 0xD62D, 0xD638, 0xD639, 0xD63C, 0xD640, 0xD645, /* 0xA0 */
+ 0xD648, 0xD649, 0xD64B, 0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, /* 0xA0 */
+ 0xD65C, 0xD667, 0xD669, 0xD670, 0xD671, 0xD674, 0xD683, 0xD685, /* 0xB0 */
+ 0xD68C, 0xD68D, 0xD690, 0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, /* 0xB0 */
+ 0xD6AC, 0xD6B0, 0xD6B9, 0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, /* 0xC0 */
+ 0xD6D1, 0xD6D4, 0xD6D7, 0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, /* 0xC0 */
+ 0xD6F5, 0xD6FC, 0xD6FD, 0xD700, 0xD704, 0xD711, 0xD718, 0xD719, /* 0xD0 */
+ 0xD71C, 0xD720, 0xD728, 0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735, /* 0xD0 */
+ 0xD738, 0xD73C, 0xD744, 0xD747, 0xD749, 0xD750, 0xD751, 0xD754, /* 0xE0 */
+ 0xD756, 0xD757, 0xD758, 0xD759, 0xD760, 0xD761, 0xD763, 0xD765, /* 0xE0 */
+ 0xD769, 0xD76C, 0xD770, 0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, /* 0xF0 */
+ 0xD789, 0xD78C, 0xD790, 0xD798, 0xD799, 0xD79B, 0xD79D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_CA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F3D, 0x4F73, 0x5047, 0x50F9, 0x52A0, 0x53EF, 0x5475, /* 0xA0 */
+ 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687, 0x67B6, 0x67B7, 0x67EF, /* 0xA0 */
+ 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB, 0x8304, 0x8857, 0x8888, /* 0xB0 */
+ 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6, 0x99D5, 0x523B, 0x5374, /* 0xB0 */
+ 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF, 0x811A, 0x89BA, 0x89D2, /* 0xC0 */
+ 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978, 0x59E6, 0x5E72, 0x5E79, /* 0xC0 */
+ 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F, 0x6F97, 0x764E, 0x770B, /* 0xD0 */
+ 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D, 0x826E, 0x8271, 0x8AEB, /* 0xD0 */
+ 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34, 0x78A3, 0x7AED, 0x845B, /* 0xE0 */
+ 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E, 0x582A, 0x5D4C, 0x611F, /* 0xE0 */
+ 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44, 0x6E1B, 0x7518, 0x75B3, /* 0xF0 */
+ 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451, 0x9452, 0x9F95 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_CB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598, 0x525B, /* 0xA0 */
+ 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A, 0x6177, /* 0xA0 */
+ 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C, 0x8154, /* 0xB0 */
+ 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47, 0x4ECB, /* 0xB0 */
+ 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168, 0x6539, /* 0xC0 */
+ 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5, 0x84CB, /* 0xC0 */
+ 0xF900, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0xF901, 0x7CB3, /* 0xD0 */
+ 0x7FB9, 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, /* 0xD0 */
+ 0x64DA, 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0xF902, /* 0xE0 */
+ 0x907D, 0x9245, 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, /* 0xE0 */
+ 0x6106, 0x6957, 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, /* 0xF0 */
+ 0x5091, 0x6770, 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_CC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x77BC, 0x9210, 0x9ED4, 0x52AB, 0x602F, 0x8FF2, 0x5048, /* 0xA0 */
+ 0x61A9, 0x63ED, 0x64CA, 0x683C, 0x6A84, 0x6FC0, 0x8188, 0x89A1, /* 0xA0 */
+ 0x9694, 0x5805, 0x727D, 0x72AC, 0x7504, 0x7D79, 0x7E6D, 0x80A9, /* 0xB0 */
+ 0x898B, 0x8B74, 0x9063, 0x9D51, 0x6289, 0x6C7A, 0x6F54, 0x7D50, /* 0xB0 */
+ 0x7F3A, 0x8A23, 0x517C, 0x614A, 0x7B9D, 0x8B19, 0x9257, 0x938C, /* 0xC0 */
+ 0x4EAC, 0x4FD3, 0x501E, 0x50BE, 0x5106, 0x52C1, 0x52CD, 0x537F, /* 0xC0 */
+ 0x5770, 0x5883, 0x5E9A, 0x5F91, 0x6176, 0x61AC, 0x64CE, 0x656C, /* 0xD0 */
+ 0x666F, 0x66BB, 0x66F4, 0x6897, 0x6D87, 0x7085, 0x70F1, 0x749F, /* 0xD0 */
+ 0x74A5, 0x74CA, 0x75D9, 0x786C, 0x78EC, 0x7ADF, 0x7AF6, 0x7D45, /* 0xE0 */
+ 0x7D93, 0x8015, 0x803F, 0x811B, 0x8396, 0x8B66, 0x8F15, 0x9015, /* 0xE0 */
+ 0x93E1, 0x9803, 0x9838, 0x9A5A, 0x9BE8, 0x4FC2, 0x5553, 0x583A, /* 0xF0 */
+ 0x5951, 0x5B63, 0x5C46, 0x60B8, 0x6212, 0x6842, 0x68B0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_CD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE, 0x7A3D, 0x7CFB, /* 0xA0 */
+ 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E, 0x9DC4, 0x53E4, /* 0xA0 */
+ 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64, 0x5C3B, 0x5EAB, /* 0xB0 */
+ 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF, 0x69C1, 0x6CBD, /* 0xB0 */
+ 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003, 0x80A1, 0x818F, /* 0xC0 */
+ 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4, 0x8AA5, 0xF903, /* 0xC0 */
+ 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED, 0x659B, /* 0xD0 */
+ 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764, 0x5D11, /* 0xD0 */
+ 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4, 0x6C68, /* 0xE0 */
+ 0xF904, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5, /* 0xE0 */
+ 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3, /* 0xF0 */
+ 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_CE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x79D1, 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, /* 0xA0 */
+ 0x9846, 0x5ED3, 0x69E8, 0x85FF, 0x90ED, 0xF905, 0x51A0, 0x5B98, /* 0xA0 */
+ 0x5BEC, 0x6163, 0x68FA, 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, /* 0xB0 */
+ 0x7F50, 0x83C5, 0x89C0, 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, /* 0xB0 */
+ 0x62EC, 0x9002, 0x4F8A, 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, /* 0xC0 */
+ 0x6D38, 0x709A, 0x72C2, 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, /* 0xC0 */
+ 0x639B, 0x7F6B, 0x4E56, 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, /* 0xD0 */
+ 0x62D0, 0x69D0, 0x9B41, 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, /* 0xD0 */
+ 0x50D1, 0x54AC, 0x55AC, 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, /* 0xE0 */
+ 0x6821, 0x6A4B, 0x72E1, 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, /* 0xE0 */
+ 0x854E, 0x86DF, 0x8F03, 0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, /* 0xF0 */
+ 0x4E18, 0x4E45, 0x4E5D, 0x4EC7, 0x4FF1, 0x5177, 0x52FE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_CF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5340, 0x53E3, 0x53E5, 0x548E, 0x5614, 0x5775, 0x57A2, /* 0xA0 */
+ 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8, 0x6551, 0x67B8, 0x67E9, /* 0xA0 */
+ 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42, 0x6E9D, 0x7078, 0x72D7, /* 0xB0 */
+ 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76, 0x7D7F, 0x8009, 0x81FC, /* 0xB0 */
+ 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33, 0x8CFC, 0x8EC0, 0x9011, /* 0xC0 */
+ 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45, 0x9CE9, 0x9DD7, 0x9F9C, /* 0xC0 */
+ 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB, 0x9EB4, 0x541B, 0x7A98, /* 0xD0 */
+ 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800, 0x5C48, 0x6398, 0x7A9F, /* 0xD0 */
+ 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E, 0x8EAC, 0x5026, 0x5238, /* 0xE0 */
+ 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372, 0x6B0A, 0x6DC3, 0x7737, /* 0xE0 */
+ 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5, 0x673A, 0x6AC3, 0x6F70, /* 0xF0 */
+ 0x8A6D, 0x8ECC, 0x994B, 0xF906, 0x6677, 0x6B78, 0x8CB4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9B3C, 0xF907, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, /* 0xA0 */
+ 0x73EA, 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, /* 0xA0 */
+ 0x9035, 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, /* 0xB0 */
+ 0xF908, 0x6A58, 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, /* 0xB0 */
+ 0x9699, 0x50C5, 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, /* 0xC0 */
+ 0x747E, 0x7B4B, 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, /* 0xC0 */
+ 0xF909, 0x4ECA, 0x5997, 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, /* 0xD0 */
+ 0x79BD, 0x82A9, 0x887E, 0x887F, 0x895F, 0xF90A, 0x9326, 0x4F0B, /* 0xD0 */
+ 0x53CA, 0x6025, 0x6271, 0x6C72, 0x7D1A, 0x7D66, 0x4E98, 0x5162, /* 0xE0 */
+ 0x77DC, 0x80AF, 0x4F01, 0x4F0E, 0x5176, 0x5180, 0x55DC, 0x5668, /* 0xE0 */
+ 0x573B, 0x57FA, 0x57FC, 0x5914, 0x5947, 0x5993, 0x5BC4, 0x5C90, /* 0xF0 */
+ 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC, 0x6280, 0x65D7, 0x65E3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4, 0x6A5F, 0x6B3A, /* 0xA0 */
+ 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426, 0x742A, 0x7482, /* 0xA0 */
+ 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941, 0x7947, 0x7948, /* 0xB0 */
+ 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006, 0x802D, 0x808C, /* 0xB0 */
+ 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324, 0x98E2, 0x9951, /* 0xC0 */
+ 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76, 0x5409, 0x62EE, /* 0xC0 */
+ 0x6854, 0x91D1, 0x55AB, 0x513A, 0xF90B, 0xF90C, 0x5A1C, 0x61E6, /* 0xD0 */
+ 0xF90D, 0x62CF, 0x62FF, 0xF90E, 0xF90F, 0xF910, 0xF911, 0xF912, /* 0xD0 */
+ 0xF913, 0x90A3, 0xF914, 0xF915, 0xF916, 0xF917, 0xF918, 0x8AFE, /* 0xE0 */
+ 0xF919, 0xF91A, 0xF91B, 0xF91C, 0x6696, 0xF91D, 0x7156, 0xF91E, /* 0xE0 */
+ 0xF91F, 0x96E3, 0xF920, 0x634F, 0x637A, 0x5357, 0xF921, 0x678F, /* 0xF0 */
+ 0x6960, 0x6E73, 0xF922, 0x7537, 0xF923, 0xF924, 0xF925 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7D0D, 0xF926, 0xF927, 0x8872, 0x56CA, 0x5A18, 0xF928, /* 0xA0 */
+ 0xF929, 0xF92A, 0xF92B, 0xF92C, 0x4E43, 0xF92D, 0x5167, 0x5948, /* 0xA0 */
+ 0x67F0, 0x8010, 0xF92E, 0x5973, 0x5E74, 0x649A, 0x79CA, 0x5FF5, /* 0xB0 */
+ 0x606C, 0x62C8, 0x637B, 0x5BE7, 0x5BD7, 0x52AA, 0xF92F, 0x5974, /* 0xB0 */
+ 0x5F29, 0x6012, 0xF930, 0xF931, 0xF932, 0x7459, 0xF933, 0xF934, /* 0xC0 */
+ 0xF935, 0xF936, 0xF937, 0xF938, 0x99D1, 0xF939, 0xF93A, 0xF93B, /* 0xC0 */
+ 0xF93C, 0xF93D, 0xF93E, 0xF93F, 0xF940, 0xF941, 0xF942, 0xF943, /* 0xD0 */
+ 0x6FC3, 0xF944, 0xF945, 0x81BF, 0x8FB2, 0x60F1, 0xF946, 0xF947, /* 0xD0 */
+ 0x8166, 0xF948, 0xF949, 0x5C3F, 0xF94A, 0xF94B, 0xF94C, 0xF94D, /* 0xE0 */
+ 0xF94E, 0xF94F, 0xF950, 0xF951, 0x5AE9, 0x8A25, 0x677B, 0x7D10, /* 0xE0 */
+ 0xF952, 0xF953, 0xF954, 0xF955, 0xF956, 0xF957, 0x80FD, 0xF958, /* 0xF0 */
+ 0xF959, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, /* 0xA0 */
+ 0x65B7, 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, /* 0xA0 */
+ 0x7DDE, 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, /* 0xB0 */
+ 0x75B8, 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, /* 0xB0 */
+ 0x6E5B, 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, /* 0xC0 */
+ 0x8AC7, 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, /* 0xC0 */
+ 0x5510, 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, /* 0xD0 */
+ 0x7CD6, 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, /* 0xD0 */
+ 0x5CB1, 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, /* 0xE0 */
+ 0x8CB8, 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, /* 0xE0 */
+ 0x5230, 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, /* 0xF0 */
+ 0x5EA6, 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x68F9, 0x6AC2, 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, /* 0xA0 */
+ 0x76DC, 0x7779, 0x79B1, 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, /* 0xA0 */
+ 0x8E48, 0x9003, 0x9014, 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, /* 0xB0 */
+ 0x6BD2, 0x7006, 0x7258, 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, /* 0xB0 */
+ 0x7E9B, 0x8B80, 0x58A9, 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, /* 0xC0 */
+ 0x711E, 0x71C9, 0x8C5A, 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, /* 0xC0 */
+ 0x51CD, 0x52D5, 0x540C, 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, /* 0xD0 */
+ 0x6F7C, 0x75BC, 0x77B3, 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, /* 0xD0 */
+ 0x6597, 0x675C, 0x6793, 0x75D8, 0x7AC7, 0x8373, 0xF95A, 0x8C46, /* 0xE0 */
+ 0x9017, 0x982D, 0x5C6F, 0x81C0, 0x829A, 0x9041, 0x906F, 0x920D, /* 0xE0 */
+ 0x5F97, 0x5D9D, 0x6A59, 0x71C8, 0x767B, 0x7B49, 0x85E4, 0x8B04, /* 0xF0 */
+ 0x9127, 0x9A30, 0x5587, 0x61F6, 0xF95B, 0x7669, 0x7F85 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x863F, 0x87BA, 0x88F8, 0x908F, 0xF95C, 0x6D1B, 0x70D9, /* 0xA0 */
+ 0x73DE, 0x7D61, 0x843D, 0xF95D, 0x916A, 0x99F1, 0xF95E, 0x4E82, /* 0xA0 */
+ 0x5375, 0x6B04, 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, /* 0xB0 */
+ 0x8FA3, 0x5D50, 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, /* 0xB0 */
+ 0x85CD, 0x8964, 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, /* 0xC0 */
+ 0x6D6A, 0x72FC, 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, /* 0xC0 */
+ 0x5FA0, 0x840A, 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, /* 0xD0 */
+ 0x51C9, 0x6881, 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, /* 0xD0 */
+ 0x8F1B, 0x91CF, 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, /* 0xE0 */
+ 0x623E, 0x65C5, 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, /* 0xE0 */
+ 0x9A62, 0x9A6A, 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, /* 0xF0 */
+ 0x792B, 0x8F62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7149, 0x7489, 0x7DF4, 0x806F, 0x84EE, 0x8F26, 0x9023, /* 0xA0 */
+ 0x934A, 0x51BD, 0x5217, 0x52A3, 0x6D0C, 0x70C8, 0x88C2, 0x5EC9, /* 0xA0 */
+ 0x6582, 0x6BAE, 0x6FC2, 0x7C3E, 0x7375, 0x4EE4, 0x4F36, 0x56F9, /* 0xB0 */
+ 0xF95F, 0x5CBA, 0x5DBA, 0x601C, 0x73B2, 0x7B2D, 0x7F9A, 0x7FCE, /* 0xB0 */
+ 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748, 0x9818, 0x9F61, 0x4F8B, /* 0xC0 */
+ 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE, 0xF960, 0x6488, 0x64C4, /* 0xC0 */
+ 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, /* 0xD0 */
+ 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75, 0x788C, 0x797F, /* 0xD0 */
+ 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6, 0x58DF, 0x5F04, /* 0xE0 */
+ 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121, 0x7028, 0x7262, /* 0xE0 */
+ 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86, 0x50DA, 0x5BEE, /* 0xF0 */
+ 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A, 0x84FC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13, /* 0xA0 */
+ 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4, /* 0xA0 */
+ 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F, /* 0xB0 */
+ 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D, /* 0xB0 */
+ 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A, /* 0xC0 */
+ 0x5F8B, 0x6144, 0x6817, 0xF961, 0x9686, 0x52D2, 0x808B, 0x51DC, /* 0xC0 */
+ 0x51CC, 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, /* 0xD0 */
+ 0x5398, 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, /* 0xD0 */
+ 0x7281, 0x72F8, 0x7406, 0x7483, 0xF962, 0x75E2, 0x7C6C, 0x7F79, /* 0xE0 */
+ 0x7FB8, 0x8389, 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, /* 0xE0 */
+ 0x541D, 0x6F7E, 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, /* 0xF0 */
+ 0x9E9F, 0x6797, 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7ACB, 0x7B20, 0x7C92, 0x6469, 0x746A, 0x75F2, 0x78BC, /* 0xA0 */
+ 0x78E8, 0x99AC, 0x9B54, 0x9EBB, 0x5BDE, 0x5E55, 0x6F20, 0x819C, /* 0xA0 */
+ 0x83AB, 0x9088, 0x4E07, 0x534D, 0x5A29, 0x5DD2, 0x5F4E, 0x6162, /* 0xB0 */
+ 0x633D, 0x6669, 0x66FC, 0x6EFF, 0x6F2B, 0x7063, 0x779E, 0x842C, /* 0xB0 */
+ 0x8513, 0x883B, 0x8F13, 0x9945, 0x9C3B, 0x551C, 0x62B9, 0x672B, /* 0xC0 */
+ 0x6CAB, 0x8309, 0x896A, 0x977A, 0x4EA1, 0x5984, 0x5FD8, 0x5FD9, /* 0xC0 */
+ 0x671B, 0x7DB2, 0x7F54, 0x8292, 0x832B, 0x83BD, 0x8F1E, 0x9099, /* 0xD0 */
+ 0x57CB, 0x59B9, 0x5A92, 0x5BD0, 0x6627, 0x679A, 0x6885, 0x6BCF, /* 0xD0 */
+ 0x7164, 0x7F75, 0x8CB7, 0x8CE3, 0x9081, 0x9B45, 0x8108, 0x8C8A, /* 0xE0 */
+ 0x964C, 0x9A40, 0x9EA5, 0x5B5F, 0x6C13, 0x731B, 0x76F2, 0x76DF, /* 0xE0 */
+ 0x840C, 0x51AA, 0x8993, 0x514D, 0x5195, 0x52C9, 0x68C9, 0x6C94, /* 0xF0 */
+ 0x7704, 0x7720, 0x7DBF, 0x7DEC, 0x9762, 0x9EB5, 0x6EC5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_D9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E, 0x669D, 0x6927, /* 0xA0 */
+ 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F, 0x9169, 0x9298, /* 0xA0 */
+ 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6, 0x5E3D, 0x6155, /* 0xB0 */
+ 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD, 0x6BDB, 0x725F, /* 0xB0 */
+ 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC, 0x8305, 0x8B00, /* 0xC0 */
+ 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE, 0x7766, 0x7A46, /* 0xC0 */
+ 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499, 0x536F, 0x5893, /* 0xD0 */
+ 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A, 0x732B, 0x7AD7, /* 0xD0 */
+ 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB, 0x620A, 0x62C7, /* 0xE0 */
+ 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121, 0x73F7, 0x755D, /* 0xE0 */
+ 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF, 0x9727, 0x9D61, /* 0xF0 */
+ 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F, 0x6587 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_DA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF, /* 0xA0 */
+ 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C, /* 0xA0 */
+ 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73, /* 0xB0 */
+ 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6, /* 0xB0 */
+ 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F, /* 0xC0 */
+ 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A, /* 0xC0 */
+ 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E, /* 0xD0 */
+ 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9, /* 0xD0 */
+ 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500, /* 0xE0 */
+ 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4, /* 0xE0 */
+ 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4, /* 0xF0 */
+ 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_DB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x767C, 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, /* 0xA0 */
+ 0x508D, 0x574A, 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, /* 0xA0 */
+ 0x65B9, 0x65C1, 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, /* 0xB0 */
+ 0x80AA, 0x8180, 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, /* 0xB0 */
+ 0x90A6, 0x9632, 0x9F90, 0x500D, 0x4FF3, 0xF963, 0x57F9, 0x5F98, /* 0xC0 */
+ 0x62DC, 0x6392, 0x676F, 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, /* 0xC0 */
+ 0x88F4, 0x88F5, 0x8919, 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, /* 0xD0 */
+ 0x4F70, 0x5E1B, 0x67CF, 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, /* 0xD0 */
+ 0x6A0A, 0x7169, 0x71D4, 0x756A, 0xF964, 0x7E41, 0x8543, 0x85E9, /* 0xE0 */
+ 0x98DC, 0x4F10, 0x7B4F, 0x7F70, 0x95A5, 0x51E1, 0x5E06, 0x68B5, /* 0xE0 */
+ 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF, 0x7BC4, 0x8303, 0x6CD5, 0x743A, /* 0xF0 */
+ 0x50FB, 0x5288, 0x58C1, 0x64D8, 0x6A97, 0x74A7, 0x7656 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_DC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x78A7, 0x8617, 0x95E2, 0x9739, 0xF965, 0x535E, 0x5F01, /* 0xA0 */
+ 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49, 0x9F08, /* 0xA0 */
+ 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A, 0x67C4, /* 0xB0 */
+ 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27, 0x9920, /* 0xB0 */
+ 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65, 0x6D11, /* 0xC0 */
+ 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913, 0x8B5C, /* 0xC0 */
+ 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9, 0x670D, /* 0xD0 */
+ 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39, 0x8F3B, /* 0xD0 */
+ 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01, 0x5CEF, /* 0xE0 */
+ 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B, 0x84EC, /* 0xE0 */
+ 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF, 0x5085, /* 0xF0 */
+ 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_DD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0xF966, 0x6276, 0x6577, /* 0xA0 */
+ 0x65A7, 0x6D6E, 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, /* 0xA0 */
+ 0x8151, 0x819A, 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, /* 0xB0 */
+ 0x8CFB, 0x8D74, 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, /* 0xB0 */
+ 0x9CE7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, /* 0xC0 */
+ 0x5FFF, 0x61A4, 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, /* 0xC0 */
+ 0x7CDE, 0x7D1B, 0x82AC, 0x8CC1, 0x96F0, 0xF967, 0x4F5B, 0x5F17, /* 0xD0 */
+ 0x5F7F, 0x62C2, 0x5D29, 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, /* 0xD0 */
+ 0x4E15, 0x5099, 0x5315, 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, /* 0xE0 */
+ 0x60B2, 0x618A, 0x6249, 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, /* 0xE0 */
+ 0x6BD6, 0x6BD7, 0x6BD8, 0x6CB8, 0xF968, 0x7435, 0x75FA, 0x7812, /* 0xF0 */
+ 0x7891, 0x79D5, 0x79D8, 0x7C83, 0x7DCB, 0x7FE1, 0x80A5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_DE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8, 0x8AB9, 0x8B6C, /* 0xA0 */
+ 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC, 0x5B2A, 0x5F6C, /* 0xA0 */
+ 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015, 0x725D, 0x73AD, /* 0xB0 */
+ 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058, 0x9A01, 0x4E4D, /* 0xB0 */
+ 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F, 0x4FDF, 0x50FF, /* 0xC0 */
+ 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB, 0x5962, 0x5A11, /* 0xC0 */
+ 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99, 0x601D, 0x6368, /* 0xD0 */
+ 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B, 0x6C99, 0x6CD7, /* 0xD0 */
+ 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940, 0x7960, 0x79C1, /* 0xE0 */
+ 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E, 0x84D1, 0x86C7, /* 0xE0 */
+ 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66, 0x8FAD, 0x90AA, /* 0xF0 */
+ 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0xF969, 0x6714, 0xF96A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_DF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5098, 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, /* 0xA0 */
+ 0x759D, 0x7B97, 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, /* 0xA0 */
+ 0x715E, 0x85A9, 0x4E09, 0xF96B, 0x6749, 0x68EE, 0x6E17, 0x829F, /* 0xB0 */
+ 0x8518, 0x886B, 0x63F7, 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, /* 0xB0 */
+ 0x50CF, 0x511F, 0x5546, 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, /* 0xC0 */
+ 0x5E38, 0x5E8A, 0x5EA0, 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, /* 0xC0 */
+ 0x723D, 0x7240, 0x72C0, 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, /* 0xD0 */
+ 0x89F4, 0x8A73, 0x8C61, 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, /* 0xD0 */
+ 0x55C7, 0xF96C, 0x7A61, 0x7D22, 0x8272, 0x7272, 0x751F, 0x7525, /* 0xE0 */
+ 0xF96D, 0x7B19, 0x5885, 0x58FB, 0x5DBC, 0x5E8F, 0x5EB6, 0x5F90, /* 0xE0 */
+ 0x6055, 0x6292, 0x637F, 0x654D, 0x6691, 0x66D9, 0x66F8, 0x6816, /* 0xF0 */
+ 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E, 0x7DD6, 0x7F72 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D, 0x92E4, /* 0xA0 */
+ 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614, 0x6673, /* 0xA0 */
+ 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6, 0x91CB, /* 0xB0 */
+ 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3, 0x6247, /* 0xB0 */
+ 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487, 0x74BF, /* 0xC0 */
+ 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3, 0x8239, /* 0xC0 */
+ 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425, 0x994D, /* 0xD0 */
+ 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B, 0x820C, /* 0xD0 */
+ 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261, 0x66B9, /* 0xE0 */
+ 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D, 0x6D89, /* 0xE0 */
+ 0x71EE, 0xF96E, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210, /* 0xF0 */
+ 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8056, 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, /* 0xA0 */
+ 0x6B72, 0x6D17, 0x7A05, 0x7B39, 0x7D30, 0xF96F, 0x8CB0, 0x53EC, /* 0xA0 */
+ 0x562F, 0x5851, 0x5BB5, 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, /* 0xB0 */
+ 0x6414, 0x662D, 0x68B3, 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, /* 0xB0 */
+ 0x71D2, 0x7526, 0x758F, 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, /* 0xC0 */
+ 0x7D20, 0x7D39, 0x852C, 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, /* 0xC0 */
+ 0x90B5, 0x92B7, 0x97F6, 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, /* 0xD0 */
+ 0x7C9F, 0x7E8C, 0x8B16, 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, /* 0xD0 */
+ 0x84C0, 0x905C, 0x98E1, 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, /* 0xE0 */
+ 0x8A1F, 0x8AA6, 0x9001, 0x980C, 0x5237, 0xF970, 0x7051, 0x788E, /* 0xE0 */
+ 0x9396, 0x8870, 0x91D7, 0x4FEE, 0x53D7, 0x55FD, 0x56DA, 0x5782, /* 0xF0 */
+ 0x58FD, 0x5AC2, 0x5B88, 0x5CAB, 0x5CC0, 0x5E25, 0x6101 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x620D, 0x624B, 0x6388, 0x641C, 0x6536, 0x6578, 0x6A39, /* 0xA0 */
+ 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9, 0x7378, 0x7407, /* 0xA0 */
+ 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA, 0x7CB9, 0x7D8F, /* 0xB0 */
+ 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490, 0x84DA, 0x85EA, /* 0xB0 */
+ 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083, 0x916C, 0x9296, /* 0xC0 */
+ 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700, 0x9808, 0x9996, /* 0xC0 */
+ 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70, 0x5BBF, 0x6DD1, /* 0xD0 */
+ 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD, 0x5DE1, 0x5F87, /* 0xD0 */
+ 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53, 0x6B89, 0x6D35, /* 0xE0 */
+ 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14, 0x8123, 0x821C, /* 0xE0 */
+ 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187, 0x931E, 0x9806, /* 0xF0 */
+ 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07, 0x5D27 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2, /* 0xA0 */
+ 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F, /* 0xA0 */
+ 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB, /* 0xB0 */
+ 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD, /* 0xB0 */
+ 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5, /* 0xC0 */
+ 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A, /* 0xC0 */
+ 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C, /* 0xD0 */
+ 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38, /* 0xD0 */
+ 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668, /* 0xE0 */
+ 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA, /* 0xE0 */
+ 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0xF971, 0x8FC5, 0x5931, /* 0xF0 */
+ 0x5BA4, 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF972, 0x6DF1, 0x700B, 0x751A, 0x82AF, 0x8AF6, 0x4EC0, /* 0xA0 */
+ 0x5341, 0xF973, 0x96D9, 0x6C0F, 0x4E9E, 0x4FC4, 0x5152, 0x555E, /* 0xA0 */
+ 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD, 0x83AA, 0x86FE, 0x8859, /* 0xB0 */
+ 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09, 0x9D5D, 0x580A, 0x5CB3, /* 0xB0 */
+ 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1, 0x6A02, 0x6E25, 0x9102, /* 0xC0 */
+ 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89, 0x5CB8, 0x6309, 0x664F, /* 0xC0 */
+ 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854, 0x9B9F, 0x65A1, 0x8B01, /* 0xD0 */
+ 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6, 0x5EB5, 0x6697, 0x764C, /* 0xD0 */
+ 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE, 0x9D28, 0x4EF0, 0x592E, /* 0xE0 */
+ 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26, 0x5393, 0x54C0, 0x57C3, /* 0xE0 */
+ 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D, 0x827E, 0x9698, 0x9744, /* 0xF0 */
+ 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A, 0x814B, 0x984D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B, 0x51B6, /* 0xA0 */
+ 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0xF974, 0x91CE, /* 0xA0 */
+ 0x5F31, 0xF975, 0xF976, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, /* 0xB0 */
+ 0x8E8D, 0xF977, 0x4F6F, 0xF978, 0xF979, 0x58E4, 0x5B43, 0x6059, /* 0xB0 */
+ 0x63DA, 0x6518, 0x656D, 0x6698, 0xF97A, 0x694A, 0x6A23, 0x6D0B, /* 0xC0 */
+ 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70, 0xF97B, 0x7F8A, /* 0xC0 */
+ 0xF97C, 0x8944, 0xF97D, 0x8B93, 0x91C0, 0x967D, 0xF97E, 0x990A, /* 0xD0 */
+ 0x5704, 0x5FA1, 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, /* 0xD0 */
+ 0x9B5A, 0x9F6C, 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, /* 0xE0 */
+ 0x5830, 0x5F66, 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, /* 0xE0 */
+ 0x513C, 0x56B4, 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, /* 0xF0 */
+ 0x4E88, 0x4F59, 0xF97F, 0xF980, 0xF981, 0x5982, 0xF982 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF983, 0x6B5F, 0x6C5D, 0xF984, 0x74B5, 0x7916, 0xF985, /* 0xA0 */
+ 0x8207, 0x8245, 0x8339, 0x8F3F, 0x8F5D, 0xF986, 0x9918, 0xF987, /* 0xA0 */
+ 0xF988, 0xF989, 0x4EA6, 0xF98A, 0x57DF, 0x5F79, 0x6613, 0xF98B, /* 0xB0 */
+ 0xF98C, 0x75AB, 0x7E79, 0x8B6F, 0xF98D, 0x9006, 0x9A5B, 0x56A5, /* 0xB0 */
+ 0x5827, 0x59F8, 0x5A1F, 0x5BB4, 0xF98E, 0x5EF6, 0xF98F, 0xF990, /* 0xC0 */
+ 0x6350, 0x633B, 0xF991, 0x693D, 0x6C87, 0x6CBF, 0x6D8E, 0x6D93, /* 0xC0 */
+ 0x6DF5, 0x6F14, 0xF992, 0x70DF, 0x7136, 0x7159, 0xF993, 0x71C3, /* 0xD0 */
+ 0x71D5, 0xF994, 0x784F, 0x786F, 0xF995, 0x7B75, 0x7DE3, 0xF996, /* 0xD0 */
+ 0x7E2F, 0xF997, 0x884D, 0x8EDF, 0xF998, 0xF999, 0xF99A, 0x925B, /* 0xE0 */
+ 0xF99B, 0x9CF6, 0xF99C, 0xF99D, 0xF99E, 0x6085, 0x6D85, 0xF99F, /* 0xE0 */
+ 0x71B1, 0xF9A0, 0xF9A1, 0x95B1, 0x53AD, 0xF9A2, 0xF9A3, 0xF9A4, /* 0xF0 */
+ 0x67D3, 0xF9A5, 0x708E, 0x7130, 0x7430, 0x8276, 0x82D2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF9A6, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4, 0xF9A7, 0x71C1, /* 0xA0 */
+ 0x8449, 0xF9A8, 0xF9A9, 0x584B, 0xF9AA, 0xF9AB, 0x5DB8, 0x5F71, /* 0xA0 */
+ 0xF9AC, 0x6620, 0x668E, 0x6979, 0x69AE, 0x6C38, 0x6CF3, 0x6E36, /* 0xB0 */
+ 0x6F41, 0x6FDA, 0x701B, 0x702F, 0x7150, 0x71DF, 0x7370, 0xF9AD, /* 0xB0 */
+ 0x745B, 0xF9AE, 0x74D4, 0x76C8, 0x7A4E, 0x7E93, 0xF9AF, 0xF9B0, /* 0xC0 */
+ 0x82F1, 0x8A60, 0x8FCE, 0xF9B1, 0x9348, 0xF9B2, 0x9719, 0xF9B3, /* 0xC0 */
+ 0xF9B4, 0x4E42, 0x502A, 0xF9B5, 0x5208, 0x53E1, 0x66F3, 0x6C6D, /* 0xD0 */
+ 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE, 0x85DD, 0x8602, 0xF9B6, /* 0xD0 */
+ 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0xF9B7, 0x92B3, 0xF9B8, 0x9713, /* 0xE0 */
+ 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433, /* 0xE0 */
+ 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0xF9B9, /* 0xF0 */
+ 0x61CA, 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x70CF, 0x71AC, 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, /* 0xA0 */
+ 0x9F07, 0x5C4B, 0x6C83, 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, /* 0xA0 */
+ 0x761F, 0x7A69, 0x7E15, 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, /* 0xB0 */
+ 0x7515, 0x7670, 0x7FC1, 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, /* 0xB0 */
+ 0x7AA9, 0x7AAA, 0x81E5, 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, /* 0xC0 */
+ 0x5B9B, 0x68A1, 0x6900, 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, /* 0xC0 */
+ 0x7DE9, 0x7FEB, 0x8118, 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, /* 0xD0 */
+ 0x66F0, 0x5F80, 0x65FA, 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, /* 0xD0 */
+ 0x6B6A, 0x77EE, 0x5916, 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0xF9BA, /* 0xE0 */
+ 0xF9BB, 0x50E5, 0x51F9, 0x582F, 0x592D, 0x5996, 0x59DA, 0x5BE5, /* 0xE0 */
+ 0xF9BC, 0xF9BD, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE, 0xF9BE, /* 0xF0 */
+ 0x66DC, 0xF9BF, 0x6A48, 0xF9C0, 0x71FF, 0x7464, 0xF9C1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_E9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7A88, 0x7AAF, 0x7E47, 0x7E5E, 0x8000, 0x8170, 0xF9C2, /* 0xA0 */
+ 0x87EF, 0x8981, 0x8B20, 0x9059, 0xF9C3, 0x9080, 0x9952, 0x617E, /* 0xA0 */
+ 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD, 0x5197, /* 0xB0 */
+ 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995, 0x6D8C, /* 0xB0 */
+ 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073, 0x8338, /* 0xC0 */
+ 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0xF9C4, 0x4E8E, 0x4F51, 0x5076, /* 0xC0 */
+ 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A, /* 0xD0 */
+ 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991, /* 0xD0 */
+ 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047, /* 0xE0 */
+ 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED, /* 0xE0 */
+ 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0xF9C5, /* 0xF0 */
+ 0x6A52, 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_EA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x904B, 0x9695, 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, /* 0xA0 */
+ 0x718A, 0x96C4, 0x5143, 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, /* 0xA0 */
+ 0x5A9B, 0x5AC4, 0x5BC3, 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, /* 0xB0 */
+ 0x6E72, 0x6E90, 0x7230, 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, /* 0xB0 */
+ 0x9060, 0xF9C6, 0x9662, 0x9858, 0x9D1B, 0x6708, 0x8D8A, 0x925E, /* 0xC0 */
+ 0x4F4D, 0x5049, 0x50DE, 0x5371, 0x570D, 0x59D4, 0x5A01, 0x5C09, /* 0xC0 */
+ 0x6170, 0x6690, 0x6E2D, 0x7232, 0x744B, 0x7DEF, 0x80C3, 0x840E, /* 0xD0 */
+ 0x8466, 0x853F, 0x875F, 0x885B, 0x8918, 0x8B02, 0x9055, 0x97CB, /* 0xD0 */
+ 0x9B4F, 0x4E73, 0x4F91, 0x5112, 0x516A, 0xF9C7, 0x552F, 0x55A9, /* 0xE0 */
+ 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE, 0x60A0, 0x60DF, 0x6108, /* 0xE0 */
+ 0x6109, 0x63C4, 0x6538, 0x6709, 0xF9C8, 0x67D4, 0x67DA, 0xF9C9, /* 0xF0 */
+ 0x6961, 0x6962, 0x6CB9, 0x6D27, 0xF9CA, 0x6E38, 0xF9CB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_EB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6FE1, 0x7336, 0x7337, 0xF9CC, 0x745C, 0x7531, 0xF9CD, /* 0xA0 */
+ 0x7652, 0xF9CE, 0xF9CF, 0x7DAD, 0x81FE, 0x8438, 0x88D5, 0x8A98, /* 0xA0 */
+ 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A, 0x9149, /* 0xB0 */
+ 0x91C9, 0x936E, 0xF9D0, 0xF9D1, 0x5809, 0xF9D2, 0x6BD3, 0x8089, /* 0xB0 */
+ 0x80B2, 0xF9D3, 0xF9D4, 0x5141, 0x596B, 0x5C39, 0xF9D5, 0xF9D6, /* 0xC0 */
+ 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0xF9D7, 0x9217, 0x958F, 0xF9D8, /* 0xC0 */
+ 0xF9D9, 0xF9DA, 0xF9DB, 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, /* 0xD0 */
+ 0xF9DC, 0x57A0, 0x6069, 0x6147, 0x6BB7, 0x8ABE, 0x9280, 0x96B1, /* 0xD0 */
+ 0x4E59, 0x541F, 0x6DEB, 0x852D, 0x9670, 0x97F3, 0x98EE, 0x63D6, /* 0xE0 */
+ 0x6CE3, 0x9091, 0x51DD, 0x61C9, 0x81BA, 0x9DF9, 0x4F9D, 0x501A, /* 0xE0 */
+ 0x5100, 0x5B9C, 0x610F, 0x61FF, 0x64EC, 0x6905, 0x6BC5, 0x7591, /* 0xF0 */
+ 0x77E3, 0x7FA9, 0x8264, 0x858F, 0x87FB, 0x8863, 0x8ABC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_EC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A, 0xF9DD, 0xF9DE, /* 0xA0 */
+ 0x5937, 0x59E8, 0xF9DF, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0xF9E0, /* 0xA0 */
+ 0xF9E1, 0xF9E2, 0xF9E3, 0x723E, 0x73E5, 0xF9E4, 0x7570, 0x75CD, /* 0xB0 */
+ 0xF9E5, 0x79FB, 0xF9E6, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351, /* 0xB0 */
+ 0xF9E7, 0xF9E8, 0x8CBD, 0x8CB3, 0x9087, 0xF9E9, 0xF9EA, 0x98F4, /* 0xC0 */
+ 0x990C, 0xF9EB, 0xF9EC, 0x7037, 0x76CA, 0x7FCA, 0x7FCC, 0x7FFC, /* 0xC0 */
+ 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0xF9ED, 0x54BD, 0x56E0, /* 0xD0 */
+ 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0xF9EE, 0xF9EF, 0x7D6A, /* 0xD0 */
+ 0x8335, 0xF9F0, 0x8693, 0x8A8D, 0xF9F1, 0x976D, 0x9777, 0xF9F2, /* 0xE0 */
+ 0xF9F3, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9, 0x65E5, 0x6EA2, 0x9038, /* 0xE0 */
+ 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A, 0x59D9, 0x6041, 0xF9F4, /* 0xF0 */
+ 0xF9F5, 0x7A14, 0xF9F6, 0x834F, 0x8CC3, 0x5165, 0x5344 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_ED[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF9F7, 0xF9F8, 0xF9F9, 0x4ECD, 0x5269, 0x5B55, 0x82BF, /* 0xA0 */
+ 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF, 0x5B50, 0x5B57, 0x5B5C, /* 0xA0 */
+ 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E, 0x7386, 0x74F7, 0x75B5, /* 0xB0 */
+ 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328, 0x8517, 0x85C9, 0x8AEE, /* 0xB0 */
+ 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC, 0x65AB, 0x6628, 0x707C, /* 0xC0 */
+ 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C, 0x96C0, 0x9D72, 0x5B71, /* 0xC0 */
+ 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91, 0x66AB, 0x6F5B, 0x7BB4, /* 0xD0 */
+ 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7, 0x5320, 0x5834, 0x58BB, /* 0xD0 */
+ 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84, 0x5F35, 0x638C, 0x66B2, /* 0xE0 */
+ 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F, 0x7246, 0xF9FA, 0x7350, /* 0xE0 */
+ 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7, 0x838A, 0x846C, /* 0xF0 */
+ 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC, 0x9577 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_EE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750, /* 0xA0 */
+ 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1, /* 0xA0 */
+ 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47, /* 0xB0 */
+ 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E, /* 0xB0 */
+ 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35, /* 0xC0 */
+ 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019, /* 0xC0 */
+ 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458, /* 0xD0 */
+ 0x6575, 0x6EF4, 0x72C4, 0xF9FB, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, /* 0xD0 */
+ 0x7E3E, 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, /* 0xE0 */
+ 0x8FEA, 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, /* 0xE0 */
+ 0x5178, 0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55, /* 0xF0 */
+ 0x5EDB, 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_EF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x714E, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, /* 0xA0 */
+ 0x7B8B, 0x7BAD, 0x7BC6, 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, /* 0xA0 */
+ 0x9293, 0x9322, 0x942B, 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, /* 0xB0 */
+ 0x622A, 0x6298, 0x6D59, 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, /* 0xB0 */
+ 0x5CBE, 0x5E97, 0x6F38, 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, /* 0xC0 */
+ 0x63A5, 0x647A, 0x8776, 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, /* 0xC0 */
+ 0x5448, 0x59C3, 0x5B9A, 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, /* 0xD0 */
+ 0x633A, 0x653F, 0x6574, 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, /* 0xD0 */
+ 0x6A89, 0x6B63, 0x6C40, 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, /* 0xE0 */
+ 0x70A1, 0x738E, 0x73FD, 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, /* 0xE0 */
+ 0x7A7D, 0x7CBE, 0x7D8E, 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, /* 0xF0 */
+ 0x914A, 0x91D8, 0x9266, 0x92CC, 0x9320, 0x9706, 0x9756 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x975C, 0x9802, 0x9F0E, 0x5236, 0x5291, 0x557C, 0x5824, /* 0xA0 */
+ 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF, 0x6FDF, 0x796D, 0x7B2C, /* 0xA0 */
+ 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44, 0x918D, 0x9664, 0x969B, /* 0xB0 */
+ 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146, 0x51CB, 0x52A9, 0x5632, /* 0xB0 */
+ 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9, 0x6641, 0x66FA, 0x66F9, /* 0xC0 */
+ 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15, 0x6F6E, 0x7167, 0x71E5, /* 0xC0 */
+ 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A, 0x79DF, 0x7A20, 0x7A95, /* 0xD0 */
+ 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087, 0x85FB, 0x86A4, 0x8A54, /* 0xD0 */
+ 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D, 0x91E3, 0x963B, 0x96D5, /* 0xE0 */
+ 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3, 0x5B58, 0x5C0A, 0x5352, /* 0xE0 */
+ 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E, 0x60B0, 0x616B, 0x68D5, /* 0xF0 */
+ 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C, 0x7E31, 0x816B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750, 0x5DE6, /* 0xA0 */
+ 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A, 0x59DD, /* 0xA0 */
+ 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE, 0x5EDA, /* 0xB0 */
+ 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A, 0x6F8D, /* 0xB0 */
+ 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2, 0x821F, /* 0xC0 */
+ 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031, 0x914E, /* 0xC0 */
+ 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101, 0x51C6, /* 0xD0 */
+ 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96, 0x6FEC, /* 0xD0 */
+ 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB, 0x99FF, /* 0xE0 */
+ 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB, 0x696B, /* 0xE0 */
+ 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD, 0x7511, /* 0xF0 */
+ 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, /* 0xA0 */
+ 0x652F, 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, /* 0xA0 */
+ 0x6F2C, 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, /* 0xB0 */
+ 0x81F3, 0x829D, 0x82B7, 0x8718, 0x8A8C, 0xF9FC, 0x8D04, 0x8DBE, /* 0xB0 */
+ 0x9072, 0x76F4, 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, /* 0xC0 */
+ 0x5875, 0x632F, 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, /* 0xC0 */
+ 0x6D25, 0x6EB1, 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, /* 0xD0 */
+ 0x771E, 0x778B, 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, /* 0xD0 */
+ 0x8A3A, 0x8CD1, 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, /* 0xE0 */
+ 0x9707, 0x4F84, 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6, /* 0xE0 */
+ 0x75BE, 0x79E9, 0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED, /* 0xF0 */
+ 0x659F, 0x6715, 0xF9FD, 0x57F7, 0x6F57, 0x7DDD, 0x8F2F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x93F6, 0x96C6, 0x5FB5, 0x61F2, 0x6F84, 0x4E14, 0x4F98, /* 0xA0 */
+ 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE, 0x6B21, 0x6B64, 0x78CB, /* 0xA0 */
+ 0x7B9A, 0xF9FE, 0x8E49, 0x8ECA, 0x906E, 0x6349, 0x643E, 0x7740, /* 0xB0 */
+ 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF, 0x71E6, 0x74A8, /* 0xB0 */
+ 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98, 0x8B9A, 0x8D0A, /* 0xC0 */
+ 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6, 0x672D, 0x7D2E, /* 0xC0 */
+ 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA, 0x65AC, 0x7AD9, /* 0xD0 */
+ 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5A3C, 0x5EE0, /* 0xD0 */
+ 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2, 0x69CD, 0x6EC4, /* 0xE0 */
+ 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259, 0x83D6, 0x84BC, /* 0xE0 */
+ 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1, 0x7826, 0x7DB5, /* 0xF0 */
+ 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5, 0x7B56 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0xF9FF, /* 0xA0 */
+ 0x5254, 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, /* 0xA0 */
+ 0x7620, 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, /* 0xB0 */
+ 0x5929, 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, /* 0xB0 */
+ 0x85A6, 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, /* 0xC0 */
+ 0x51F8, 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, /* 0xC0 */
+ 0x8F4D, 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, /* 0xD0 */
+ 0x7C3D, 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, /* 0xD0 */
+ 0x7252, 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, /* 0xE0 */
+ 0x6DF8, 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0xFA00, 0x5243, /* 0xE0 */
+ 0x66FF, 0x6D95, 0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, /* 0xF0 */
+ 0x521D, 0x527F, 0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6912, 0x695A, 0x6A35, 0x7092, 0x7126, 0x785D, 0x7901, /* 0xA0 */
+ 0x790E, 0x79D2, 0x7A0D, 0x8096, 0x8278, 0x82D5, 0x8349, 0x8549, /* 0xA0 */
+ 0x8C82, 0x8D85, 0x9162, 0x918B, 0x91AE, 0x4FC3, 0x56D1, 0x71ED, /* 0xB0 */
+ 0x77D7, 0x8700, 0x89F8, 0x5BF8, 0x5FD6, 0x6751, 0x90A8, 0x53E2, /* 0xB0 */
+ 0x585A, 0x5BF5, 0x60A4, 0x6181, 0x6460, 0x7E3D, 0x8070, 0x8525, /* 0xC0 */
+ 0x9283, 0x64AE, 0x50AC, 0x5D14, 0x6700, 0x589C, 0x62BD, 0x63A8, /* 0xC0 */
+ 0x690E, 0x6978, 0x6A1E, 0x6E6B, 0x76BA, 0x79CB, 0x82BB, 0x8429, /* 0xD0 */
+ 0x8ACF, 0x8DA8, 0x8FFD, 0x9112, 0x914B, 0x919C, 0x9310, 0x9318, /* 0xD0 */
+ 0x939A, 0x96DB, 0x9A36, 0x9C0D, 0x4E11, 0x755C, 0x795D, 0x7AFA, /* 0xE0 */
+ 0x7B51, 0x7BC9, 0x7E2E, 0x84C4, 0x8E59, 0x8E74, 0x8EF8, 0x9010, /* 0xE0 */
+ 0x6625, 0x693F, 0x7443, 0x51FA, 0x672E, 0x9EDC, 0x5145, 0x5FE0, /* 0xF0 */
+ 0x6C96, 0x87F2, 0x885D, 0x8877, 0x60B4, 0x81B5, 0x8403 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36, 0x5C31, 0x708A, /* 0xA0 */
+ 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189, 0x9A5F, 0x9DF2, /* 0xA0 */
+ 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64, 0x4F88, 0x5024, /* 0xB0 */
+ 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB, 0x6DC4, 0x71BE, /* 0xB0 */
+ 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7, 0x7DFB, 0x7F6E, /* 0xC0 */
+ 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52, 0x5247, 0x52C5, /* 0xC0 */
+ 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5, 0x5BE2, 0x6795, /* 0xD0 */
+ 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C, 0x87C4, 0x79E4, /* 0xD0 */
+ 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE, 0x59A5, 0x60F0, /* 0xE0 */
+ 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99B1, 0x99DD, /* 0xE0 */
+ 0x502C, 0x5353, 0x5544, 0x577C, 0xFA01, 0x6258, 0xFA02, 0x64E2, /* 0xF0 */
+ 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9438, 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, /* 0xA0 */
+ 0x7058, 0x70AD, 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, /* 0xA0 */
+ 0x803D, 0x8CAA, 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, /* 0xB0 */
+ 0xFA03, 0x8569, 0x514C, 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, /* 0xB0 */
+ 0x6C70, 0x6CF0, 0x7B1E, 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, /* 0xC0 */
+ 0xFA04, 0x64C7, 0x6FA4, 0x6491, 0x6504, 0x514E, 0x5410, 0x571F, /* 0xC0 */
+ 0x8A0E, 0x615F, 0x6876, 0xFA05, 0x75DB, 0x7B52, 0x7D71, 0x901A, /* 0xD0 */
+ 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000, 0x9839, 0x5078, 0x5957, /* 0xD0 */
+ 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D, 0x7279, 0x95D6, 0x5761, /* 0xE0 */
+ 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA, 0x6777, 0x6CE2, 0x6D3E, /* 0xE0 */
+ 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD, 0x8DDB, 0x9817, 0x5224, /* 0xF0 */
+ 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9, 0x8FA6, 0x9211 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504, 0x6096, /* 0xA0 */
+ 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987, 0x8C9D, /* 0xA0 */
+ 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F, 0x6241, /* 0xB0 */
+ 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19, 0x8CB6, /* 0xB0 */
+ 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16, 0x5E63, /* 0xC0 */
+ 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B, 0x4F48, /* 0xC0 */
+ 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03, 0x6016, /* 0xD0 */
+ 0x629B, 0x62B1, 0x6355, 0xFA06, 0x6CE1, 0x6D66, 0x75B1, 0x7832, /* 0xD0 */
+ 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B, /* 0xE0 */
+ 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206, /* 0xE0 */
+ 0xFA07, 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, /* 0xF0 */
+ 0x74E2, 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x54C1, 0x7A1F, 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, /* 0xA0 */
+ 0x5F7C, 0x62AB, 0x75B2, 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, /* 0xA0 */
+ 0x5F3C, 0x5FC5, 0x6CCC, 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, /* 0xB0 */
+ 0x999D, 0x4E4F, 0x903C, 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, /* 0xB0 */
+ 0x6630, 0x6CB3, 0x7455, 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, /* 0xC0 */
+ 0x9C15, 0x58D1, 0x5B78, 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, /* 0xC0 */
+ 0x608D, 0x65F1, 0x6C57, 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, /* 0xD0 */
+ 0x9591, 0x9592, 0x9650, 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, /* 0xD0 */
+ 0x54B8, 0x5563, 0x558A, 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, /* 0xE0 */
+ 0x9677, 0x9E79, 0x5408, 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, /* 0xE0 */
+ 0x965C, 0x4EA2, 0x4F09, 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, /* 0xF0 */
+ 0x676D, 0x6841, 0x6C86, 0x6E2F, 0x7F38, 0x809B, 0x822A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_FA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFA08, 0xFA09, 0x9805, 0x4EA5, 0x5055, 0x54B3, 0x5793, /* 0xA0 */
+ 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023, 0x87F9, /* 0xA0 */
+ 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE, 0x6838, /* 0xB0 */
+ 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411, 0x56AE, /* 0xB0 */
+ 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653, 0x589F, /* 0xC0 */
+ 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47, 0x96AA, /* 0xC0 */
+ 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4, 0x5F26, /* 0xD0 */
+ 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE, 0x7729, /* 0xD0 */
+ 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0xFA0A, 0x8CE2, /* 0xE0 */
+ 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0, /* 0xE0 */
+ 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107, /* 0xF0 */
+ 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_FB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5F62, 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, /* 0xA0 */
+ 0x73E9, 0x7469, 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, /* 0xA0 */
+ 0x99A8, 0x516E, 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, /* 0xB0 */
+ 0x91AF, 0x978B, 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, /* 0xB0 */
+ 0x5CB5, 0x5F27, 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, /* 0xC0 */
+ 0x6DCF, 0x6E56, 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, /* 0xC0 */
+ 0x7425, 0x745A, 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, /* 0xD0 */
+ 0x82A6, 0x846B, 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, /* 0xD0 */
+ 0x93AC, 0x9800, 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, /* 0xE0 */
+ 0x6DF7, 0x6E3E, 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, /* 0xE0 */
+ 0x5F18, 0x6C5E, 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, /* 0xF0 */
+ 0x9D3B, 0x5316, 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_FC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x798D, 0x79BE, 0x82B1, 0x83EF, 0x8A71, 0x8B41, 0x8CA8, /* 0xA0 */
+ 0x9774, 0xFA0B, 0x64F4, 0x652B, 0x78BA, 0x78BB, 0x7A6B, 0x4E38, /* 0xA0 */
+ 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3, 0x63DB, 0x6B61, 0x6665, /* 0xB0 */
+ 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08, 0x9084, 0x9A69, 0x9C25, /* 0xB0 */
+ 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA, 0x51F0, 0x5E4C, 0x5FA8, /* 0xC0 */
+ 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643, 0x6644, 0x69A5, 0x6CC1, /* 0xC0 */
+ 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C, 0x7687, 0x7BC1, 0x7C27, /* 0xD0 */
+ 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3, 0x532F, 0x56DE, 0x5EFB, /* 0xD0 */
+ 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666, 0x6703, 0x6A9C, 0x6DEE, /* 0xE0 */
+ 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE, 0x8334, 0x86D4, 0x8AA8, /* 0xE0 */
+ 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B, 0x9404, 0x54EE, 0x5686, /* 0xF0 */
+ 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F, 0x6D8D, 0x6DC6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_KSC5601_FD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019, 0x539A, /* 0xA0 */
+ 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D, 0x7166, /* 0xA0 */
+ 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104, 0x718F, /* 0xB0 */
+ 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684, 0x714A, /* 0xB0 */
+ 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE, 0x6689, /* 0xC0 */
+ 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB, 0x7566, /* 0xC0 */
+ 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308, 0x6D36, /* 0xD0 */
+ 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403, 0x5C79, /* 0xD0 */
+ 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070, 0x6D3D, /* 0xE0 */
+ 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD, 0x59EC, /* 0xE0 */
+ 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6, 0x7199, /* 0xF0 */
+ 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70 /* 0xF0 */
+};
diff --git a/sal/textenc/tcvtkr2.tab b/sal/textenc/tcvtkr2.tab
new file mode 100644
index 000000000000..4022bef83283
--- /dev/null
+++ b/sal/textenc/tcvtkr2.tab
@@ -0,0 +1,5415 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the DBCS to UniCode tables for the following */
+/* korean charsets: */
+/* KSC_5601, EUC-KR, MS_949, APPLE_KOREAN */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x00 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 0x00 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 0x10 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 0x10 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 0x20 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 0x20 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0x30 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 0x30 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0x40 */
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, /* 0x40 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* 0x50 */
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 0x50 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x60 */
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0x60 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, /* 0x70 */
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xA2AE, 0, 0, 0xA2B4, 0, 0, 0xA1D7, /* 0xA0 */
+ 0xA1A7, 0, 0xA8A3, 0, 0, 0xA1A9, 0xA2E7, 0, /* 0xA0 */
+ 0xA1C6, 0xA1BE, 0xA9F7, 0xA9F8, 0xA2A5, 0, 0xA2D2, 0xA1A4, /* 0xB0 */
+ 0xA2AC, 0xA9F6, 0xA8AC, 0, 0xA8F9, 0xA8F6, 0xA8FA, 0xA2AF, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xA8A1, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xA8A2, 0, 0, 0, 0, 0, 0, 0xA1BF, /* 0xD0 */
+ 0xA8AA, 0, 0, 0, 0, 0, 0xA8AD, 0xA9AC, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xA9A1, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xA9A3, 0, 0, 0, 0, 0, 0, 0xA1C0, /* 0xF0 */
+ 0xA9AA, 0, 0, 0, 0, 0, 0xA9AD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_01[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA9A2, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xA8A4, 0xA9A4, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xA9A5, 0xA8A6, 0xA9A6, 0, 0, 0, 0, /* 0x30 */
+ 0xA9A7, 0, 0, 0, 0, 0, 0, 0xA8A8, /* 0x30 */
+ 0xA9A8, 0xA8A9, 0xA9A9, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xA9B0, 0xA8AF, 0xA9AF, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xA8AB, 0xA9AB, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xA8AE, 0xA9AE /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_02[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA2A7, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xA2B0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xA2A8, 0xA2AB, 0xA2AA, 0xA2AD, 0, 0xA2A9 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_03[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA5C1, 0xA5C2, 0xA5C3, 0xA5C4, 0xA5C5, 0xA5C6, 0xA5C7, /* 0x90 */
+ 0xA5C8, 0xA5C9, 0xA5CA, 0xA5CB, 0xA5CC, 0xA5CD, 0xA5CE, 0xA5CF, /* 0x90 */
+ 0xA5D0, 0xA5D1, 0, 0xA5D2, 0xA5D3, 0xA5D4, 0xA5D5, 0xA5D6, /* 0xA0 */
+ 0xA5D7, 0xA5D8, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xA5E1, 0xA5E2, 0xA5E3, 0xA5E4, 0xA5E5, 0xA5E6, 0xA5E7, /* 0xB0 */
+ 0xA5E8, 0xA5E9, 0xA5EA, 0xA5EB, 0xA5EC, 0xA5ED, 0xA5EE, 0xA5EF, /* 0xB0 */
+ 0xA5F0, 0xA5F1, 0, 0xA5F2, 0xA5F3, 0xA5F4, 0xA5F5, 0xA5F6, /* 0xC0 */
+ 0xA5F7, 0xA5F8 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_04[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xACA7, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xACA1, 0xACA2, 0xACA3, 0xACA4, 0xACA5, 0xACA6, 0xACA8, 0xACA9, /* 0x10 */
+ 0xACAA, 0xACAB, 0xACAC, 0xACAD, 0xACAE, 0xACAF, 0xACB0, 0xACB1, /* 0x10 */
+ 0xACB2, 0xACB3, 0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACB8, 0xACB9, /* 0x20 */
+ 0xACBA, 0xACBB, 0xACBC, 0xACBD, 0xACBE, 0xACBF, 0xACC0, 0xACC1, /* 0x20 */
+ 0xACD1, 0xACD2, 0xACD3, 0xACD4, 0xACD5, 0xACD6, 0xACD8, 0xACD9, /* 0x30 */
+ 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE, 0xACDF, 0xACE0, 0xACE1, /* 0x30 */
+ 0xACE2, 0xACE3, 0xACE4, 0xACE5, 0xACE6, 0xACE7, 0xACE8, 0xACE9, /* 0x40 */
+ 0xACEA, 0xACEB, 0xACEC, 0xACED, 0xACEE, 0xACEF, 0xACF0, 0xACF1, /* 0x40 */
+ 0, 0xACD7 /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_20[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1AA, 0, 0, /* 0x10 */
+ 0xA1AE, 0xA1AF, 0, 0, 0xA1B0, 0xA1B1, 0, 0, /* 0x10 */
+ 0xA2D3, 0xA2D4, 0, 0, 0, 0xA1A5, 0xA1A6, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xA2B6, 0, 0xA1C7, 0xA1C8, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xA1D8, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xA9F9, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA9FA, /* 0x70 */
+ 0, 0xA9FB, 0xA9FC, 0xA9FD, 0xA9FE, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xA2E6 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1C9, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xA2B5, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xA7A4, 0, 0, 0xA2E0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xA2E5, 0xA2E2, 0, 0, 0, 0xA7D9, 0, /* 0x20 */
+ 0, 0, 0, 0xA1CA, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xA8F7, 0xA8F8, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xA8FB, 0xA8FC, 0xA8FD, 0xA8FE, 0, /* 0x50 */
+ 0xA5B0, 0xA5B1, 0xA5B2, 0xA5B3, 0xA5B4, 0xA5B5, 0xA5B6, 0xA5B7, /* 0x60 */
+ 0xA5B8, 0xA5B9, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xA5A1, 0xA5A2, 0xA5A3, 0xA5A4, 0xA5A5, 0xA5A6, 0xA5A7, 0xA5A8, /* 0x70 */
+ 0xA5A9, 0xA5AA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xA1E7, 0xA1E8, 0xA1E6, 0xA1E9, 0xA1EA, 0xA2D5, 0xA2D8, 0xA2D6, /* 0x90 */
+ 0xA2D9, 0xA2D7, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xA2A1, 0, 0xA2A2 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA2A3, 0, 0xA1D3, 0xA2A4, 0, 0, 0, 0xA1D4, /* 0x00 */
+ 0xA1F4, 0, 0, 0xA1F5, 0, 0, 0, 0xA2B3, /* 0x00 */
+ 0, 0xA2B2, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xA1EE, 0, 0, 0xA1F0, 0xA1C4, 0, /* 0x10 */
+ 0xA1D0, 0, 0, 0, 0, 0xA1AB, 0, 0xA1FC, /* 0x20 */
+ 0xA1FD, 0xA1FB, 0xA1FA, 0xA1F2, 0xA1F3, 0, 0xA2B1, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xA1C5, 0xA1F1, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xA1AD, 0xA1EF, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xA1D6, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA1C1, 0xA1D5, 0, 0, 0xA1C2, 0xA1C3, 0, 0, /* 0x60 */
+ 0, 0, 0xA1EC, 0xA1ED, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xA1F8, 0xA1F9, 0, 0, 0xA1F6, 0xA1F7, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xA2C1, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xA1D1 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_23[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1D2 /* 0x10 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_24[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA8E7, 0xA8E8, 0xA8E9, 0xA8EA, 0xA8EB, 0xA8EC, 0xA8ED, 0xA8EE, /* 0x60 */
+ 0xA8EF, 0xA8F0, 0xA8F1, 0xA8F2, 0xA8F3, 0xA8F4, 0xA8F5, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xA9E7, 0xA9E8, 0xA9E9, 0xA9EA, /* 0x70 */
+ 0xA9EB, 0xA9EC, 0xA9ED, 0xA9EE, 0xA9EF, 0xA9F0, 0xA9F1, 0xA9F2, /* 0x70 */
+ 0xA9F3, 0xA9F4, 0xA9F5, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xA9CD, 0xA9CE, 0xA9CF, 0xA9D0, /* 0x90 */
+ 0xA9D1, 0xA9D2, 0xA9D3, 0xA9D4, 0xA9D5, 0xA9D6, 0xA9D7, 0xA9D8, /* 0xA0 */
+ 0xA9D9, 0xA9DA, 0xA9DB, 0xA9DC, 0xA9DD, 0xA9DE, 0xA9DF, 0xA9E0, /* 0xA0 */
+ 0xA9E1, 0xA9E2, 0xA9E3, 0xA9E4, 0xA9E5, 0xA9E6, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xA8CD, 0xA8CE, 0xA8CF, 0xA8D0, 0xA8D1, 0xA8D2, 0xA8D3, 0xA8D4, /* 0xD0 */
+ 0xA8D5, 0xA8D6, 0xA8D7, 0xA8D8, 0xA8D9, 0xA8DA, 0xA8DB, 0xA8DC, /* 0xD0 */
+ 0xA8DD, 0xA8DE, 0xA8DF, 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, /* 0xE0 */
+ 0xA8E5, 0xA8E6 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_25[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA6A1, 0xA6AC, 0xA6A2, 0xA6AD, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xA6A3, 0xA6C8, 0xA6C7, 0xA6AE, /* 0x00 */
+ 0xA6A4, 0xA6C2, 0xA6C1, 0xA6AF, 0xA6A6, 0xA6C6, 0xA6C5, 0xA6B1, /* 0x10 */
+ 0xA6A5, 0xA6C4, 0xA6C3, 0xA6B0, 0xA6A7, 0xA6BC, 0xA6C9, 0xA6CA, /* 0x10 */
+ 0xA6B7, 0xA6CB, 0xA6CC, 0xA6B2, 0xA6A9, 0xA6BE, 0xA6CD, 0xA6CE, /* 0x20 */
+ 0xA6B9, 0xA6CF, 0xA6D0, 0xA6B4, 0xA6A8, 0xA6D1, 0xA6D2, 0xA6B8, /* 0x20 */
+ 0xA6BD, 0xA6D3, 0xA6D4, 0xA6B3, 0xA6AA, 0xA6D5, 0xA6D6, 0xA6BA, /* 0x30 */
+ 0xA6BF, 0xA6D7, 0xA6D8, 0xA6B5, 0xA6AB, 0xA6D9, 0xA6DA, 0xA6BB, /* 0x30 */
+ 0xA6DB, 0xA6DC, 0xA6C0, 0xA6DD, 0xA6DE, 0xA6DF, 0xA6E0, 0xA6E1, /* 0x40 */
+ 0xA6E2, 0xA6E3, 0xA6E4, 0xA6B6, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xA2C6, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xA1E1, 0xA1E0, 0, 0xA2C3, 0xA2C7, 0xA2C8, 0xA2CB, 0xA2CA, /* 0xA0 */
+ 0xA2C9, 0xA2CC, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xA1E3, 0xA1E2, 0, 0, 0xA2BA, 0xA2B9, /* 0xB0 */
+ 0, 0, 0, 0, 0xA1E5, 0xA1E4, 0, 0, /* 0xB0 */
+ 0xA2B8, 0xA2B7, 0, 0, 0, 0, 0xA1DF, 0xA1DE, /* 0xC0 */
+ 0xA2C2, 0, 0, 0xA1DB, 0, 0, 0xA1DD, 0xA1DC, /* 0xC0 */
+ 0xA2C4, 0xA2C5 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1DA, 0xA1D9, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xA2CF, 0xA2CE, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xA2D0, 0, 0xA2D1, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xA1CF, 0, 0xA1CE, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA2BC, 0xA2BD, 0, 0xA2C0, 0xA2BB, 0xA2BE, 0, 0xA2BF, /* 0x60 */
+ 0xA2CD, 0xA2DB, 0xA2DC, 0, 0xA2DD, 0xA2DA /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A8, 0, 0, 0, 0, /* 0x00 */
+ 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7, 0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB, /* 0x00 */
+ 0xA1BC, 0xA1BD, 0, 0xA1EB, 0xA1B2, 0xA1B3, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xAAA1, 0xAAA2, 0xAAA3, 0xAAA4, 0xAAA5, 0xAAA6, 0xAAA7, /* 0x40 */
+ 0xAAA8, 0xAAA9, 0xAAAA, 0xAAAB, 0xAAAC, 0xAAAD, 0xAAAE, 0xAAAF, /* 0x40 */
+ 0xAAB0, 0xAAB1, 0xAAB2, 0xAAB3, 0xAAB4, 0xAAB5, 0xAAB6, 0xAAB7, /* 0x50 */
+ 0xAAB8, 0xAAB9, 0xAABA, 0xAABB, 0xAABC, 0xAABD, 0xAABE, 0xAABF, /* 0x50 */
+ 0xAAC0, 0xAAC1, 0xAAC2, 0xAAC3, 0xAAC4, 0xAAC5, 0xAAC6, 0xAAC7, /* 0x60 */
+ 0xAAC8, 0xAAC9, 0xAACA, 0xAACB, 0xAACC, 0xAACD, 0xAACE, 0xAACF, /* 0x60 */
+ 0xAAD0, 0xAAD1, 0xAAD2, 0xAAD3, 0xAAD4, 0xAAD5, 0xAAD6, 0xAAD7, /* 0x70 */
+ 0xAAD8, 0xAAD9, 0xAADA, 0xAADB, 0xAADC, 0xAADD, 0xAADE, 0xAADF, /* 0x70 */
+ 0xAAE0, 0xAAE1, 0xAAE2, 0xAAE3, 0xAAE4, 0xAAE5, 0xAAE6, 0xAAE7, /* 0x80 */
+ 0xAAE8, 0xAAE9, 0xAAEA, 0xAAEB, 0xAAEC, 0xAAED, 0xAAEE, 0xAAEF, /* 0x80 */
+ 0xAAF0, 0xAAF1, 0xAAF2, 0xAAF3, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xABA1, 0xABA2, 0xABA3, 0xABA4, 0xABA5, 0xABA6, 0xABA7, /* 0xA0 */
+ 0xABA8, 0xABA9, 0xABAA, 0xABAB, 0xABAC, 0xABAD, 0xABAE, 0xABAF, /* 0xA0 */
+ 0xABB0, 0xABB1, 0xABB2, 0xABB3, 0xABB4, 0xABB5, 0xABB6, 0xABB7, /* 0xB0 */
+ 0xABB8, 0xABB9, 0xABBA, 0xABBB, 0xABBC, 0xABBD, 0xABBE, 0xABBF, /* 0xB0 */
+ 0xABC0, 0xABC1, 0xABC2, 0xABC3, 0xABC4, 0xABC5, 0xABC6, 0xABC7, /* 0xC0 */
+ 0xABC8, 0xABC9, 0xABCA, 0xABCB, 0xABCC, 0xABCD, 0xABCE, 0xABCF, /* 0xC0 */
+ 0xABD0, 0xABD1, 0xABD2, 0xABD3, 0xABD4, 0xABD5, 0xABD6, 0xABD7, /* 0xD0 */
+ 0xABD8, 0xABD9, 0xABDA, 0xABDB, 0xABDC, 0xABDD, 0xABDE, 0xABDF, /* 0xD0 */
+ 0xABE0, 0xABE1, 0xABE2, 0xABE3, 0xABE4, 0xABE5, 0xABE6, 0xABE7, /* 0xE0 */
+ 0xABE8, 0xABE9, 0xABEA, 0xABEB, 0xABEC, 0xABED, 0xABEE, 0xABEF, /* 0xE0 */
+ 0xABF0, 0xABF1, 0xABF2, 0xABF3, 0xABF4, 0xABF5, 0xABF6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_31[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA4A1, 0xA4A2, 0xA4A3, 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7, /* 0x30 */
+ 0xA4A8, 0xA4A9, 0xA4AA, 0xA4AB, 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF, /* 0x30 */
+ 0xA4B0, 0xA4B1, 0xA4B2, 0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7, /* 0x40 */
+ 0xA4B8, 0xA4B9, 0xA4BA, 0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, 0xA4BF, /* 0x40 */
+ 0xA4C0, 0xA4C1, 0xA4C2, 0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6, 0xA4C7, /* 0x50 */
+ 0xA4C8, 0xA4C9, 0xA4CA, 0xA4CB, 0xA4CC, 0xA4CD, 0xA4CE, 0xA4CF, /* 0x50 */
+ 0xA4D0, 0xA4D1, 0xA4D2, 0xA4D3, 0xA4D4, 0xA4D5, 0xA4D6, 0xA4D7, /* 0x60 */
+ 0xA4D8, 0xA4D9, 0xA4DA, 0xA4DB, 0xA4DC, 0xA4DD, 0xA4DE, 0xA4DF, /* 0x60 */
+ 0xA4E0, 0xA4E1, 0xA4E2, 0xA4E3, 0xA4E4, 0xA4E5, 0xA4E6, 0xA4E7, /* 0x70 */
+ 0xA4E8, 0xA4E9, 0xA4EA, 0xA4EB, 0xA4EC, 0xA4ED, 0xA4EE, 0xA4EF, /* 0x70 */
+ 0xA4F0, 0xA4F1, 0xA4F2, 0xA4F3, 0xA4F4, 0xA4F5, 0xA4F6, 0xA4F7, /* 0x80 */
+ 0xA4F8, 0xA4F9, 0xA4FA, 0xA4FB, 0xA4FC, 0xA4FD, 0xA4FE /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA9B1, 0xA9B2, 0xA9B3, 0xA9B4, 0xA9B5, 0xA9B6, 0xA9B7, 0xA9B8, /* 0x00 */
+ 0xA9B9, 0xA9BA, 0xA9BB, 0xA9BC, 0xA9BD, 0xA9BE, 0xA9BF, 0xA9C0, /* 0x00 */
+ 0xA9C1, 0xA9C2, 0xA9C3, 0xA9C4, 0xA9C5, 0xA9C6, 0xA9C7, 0xA9C8, /* 0x10 */
+ 0xA9C9, 0xA9CA, 0xA9CB, 0xA9CC, 0xA2DF, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA8B1, 0xA8B2, 0xA8B3, 0xA8B4, 0xA8B5, 0xA8B6, 0xA8B7, 0xA8B8, /* 0x60 */
+ 0xA8B9, 0xA8BA, 0xA8BB, 0xA8BC, 0xA8BD, 0xA8BE, 0xA8BF, 0xA8C0, /* 0x60 */
+ 0xA8C1, 0xA8C2, 0xA8C3, 0xA8C4, 0xA8C5, 0xA8C6, 0xA8C7, 0xA8C8, /* 0x70 */
+ 0xA8C9, 0xA8CA, 0xA8CB, 0xA8CC, 0, 0, 0, 0xA2DE /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA7C9, 0xA7CA, 0xA7CB, 0xA7CC, 0xA7CD, 0, 0, 0, /* 0x80 */
+ 0xA7BA, 0xA7BB, 0xA7DC, 0xA7DD, 0xA7DE, 0xA7B6, 0xA7B7, 0xA7B8, /* 0x80 */
+ 0xA7D4, 0xA7D5, 0xA7D6, 0xA7D7, 0xA7D8, 0xA7A1, 0xA7A2, 0xA7A3, /* 0x90 */
+ 0xA7A5, 0xA7AB, 0xA7AC, 0xA7AD, 0xA7AE, 0xA7AF, 0xA7B0, 0xA7B1, /* 0x90 */
+ 0xA7B2, 0xA7B3, 0xA7B4, 0xA7A7, 0xA7A8, 0xA7A9, 0xA7AA, 0xA7BD, /* 0xA0 */
+ 0xA7BE, 0xA7E5, 0xA7E6, 0xA7E7, 0xA7E8, 0xA7E1, 0xA7E2, 0xA7E3, /* 0xA0 */
+ 0xA7BF, 0xA7C0, 0xA7C1, 0xA7C2, 0xA7C3, 0xA7C4, 0xA7C5, 0xA7C6, /* 0xB0 */
+ 0xA7C7, 0xA7C8, 0xA7CE, 0xA7CF, 0xA7D0, 0xA7D1, 0xA7D2, 0xA7D3, /* 0xB0 */
+ 0xA7DA, 0xA7DB, 0xA2E3, 0xA7EC, 0xA7A6, 0xA7E0, 0xA7EF, 0xA2E1, /* 0xC0 */
+ 0xA7BC, 0xA7ED, 0xA7B5, 0, 0, 0, 0, 0xA7B9, /* 0xC0 */
+ 0xA7EA, 0, 0, 0xA7EB, 0, 0, 0xA7DF, 0, /* 0xD0 */
+ 0xA2E4, 0, 0, 0xA7E4, 0xA7EE, 0xA7E9 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xECE9, 0xEFCB, 0, 0xF6D2, 0, 0, 0, 0xD8B2, /* 0x00 */
+ 0xEDDB, 0xDFB2, 0xDFBE, 0xF9BB, 0, 0xDCF4, 0, 0, /* 0x00 */
+ 0, 0xF5E4, 0, 0, 0xF3A6, 0xDDE0, 0xE1A6, 0, /* 0x10 */
+ 0xCEF8, 0xDCB0, 0, 0, 0, 0, 0xE3AA, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF1E9, 0, 0, /* 0x20 */
+ 0, 0, 0xCDFA, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xFCAF, 0xD3A1, 0, 0xF1AB, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xE7D1, 0xD2AC, 0, 0xCEF9, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF1FD, 0, 0xDEBF, 0xFBBA, 0xF9B9, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xCED2, 0, /* 0x50 */
+ 0xE3AB, 0xEBE0, 0, 0, 0, 0xCEFA, 0xCBF7, 0xE5A5, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xCAE1, 0, 0xD4CC, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xEAE1, 0, 0, 0xDCE3, 0xDFAD, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xCBEB, 0, /* 0x70 */
+ 0, 0, 0xD5AF, 0, 0, 0, 0xD6F5, 0, /* 0x80 */
+ 0xE5F8, 0, 0, 0xDEC0, 0xECA3, 0, 0xE9CD, 0, /* 0x80 */
+ 0xEAA7, 0xE9F6, 0xFBBB, 0, 0xE7E9, 0xEFCC, 0, 0, /* 0x90 */
+ 0xD0E6, 0, 0, 0xDEC1, 0, 0, 0xE4AC, 0, /* 0x90 */
+ 0, 0xD8CC, 0xF9F1, 0, 0xCEDF, 0xFAA4, 0xE6B2, 0, /* 0xA0 */
+ 0xFAFB, 0, 0, 0xFABD, 0xCCC8, 0xEFCD, 0xD5D5, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xD3A2, 0, /* 0xB0 */
+ 0, 0, 0xECD1, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xE4A7, 0xECD2, 0, 0, 0xF6B1, 0, 0, 0xCEFB, /* 0xC0 */
+ 0, 0, 0xD0D1, 0xCBBF, 0, 0xEDA4, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xEDA8, 0xDEC2, 0xF6E2, 0xEDDC, /* 0xD0 */
+ 0xDCF5, 0xE0B9, 0, 0, 0, 0xD4CE, 0, 0xF4B5, /* 0xD0 */
+ 0, 0, 0, 0xD3DB, 0xD6B5, 0xECA4, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE4E6, 0, 0xF1EA, 0, 0, 0, 0xCBEC, 0xCBC0, /* 0xF0 */
+ 0, 0, 0, 0xECF2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD0EA, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xF9F2, 0xECA5, 0xD0DF, 0, 0xE7EA, 0xD0EB, 0xDCD1, /* 0x00 */
+ 0xDBE9, 0xFDCC, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDBD7, /* 0x20 */
+ 0, 0, 0, 0, 0xDAE1, 0, 0xD6B6, 0, /* 0x30 */
+ 0xE3DF, 0, 0xDEC3, 0, 0xDEC4, 0xCAA1, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xEEEC, 0, 0, 0xD3A3, 0xEEB7, /* 0x40 */
+ 0xF8CF, 0, 0, 0, 0, 0xEAC8, 0xEEB8, 0xF1AC, /* 0x40 */
+ 0xF1A5, 0xE9CE, 0, 0, 0, 0xF9BC, 0, 0, /* 0x50 */
+ 0, 0xE5F9, 0xECEA, 0xDDD6, 0xEDC2, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xF8A5, 0, 0, 0, 0, 0, 0xE5BA, /* 0x60 */
+ 0xDBD8, 0, 0, 0xCAA2, 0, 0, 0xD1CD, 0, /* 0x70 */
+ 0, 0, 0xEEED, 0, 0, 0, 0xECEB, 0xDEC5, /* 0x70 */
+ 0, 0xE3E0, 0, 0xCAC9, 0xF2E9, 0, 0xD5CE, 0, /* 0x80 */
+ 0xF6B6, 0, 0xCEC2, 0xD6C7, 0, 0xE3B4, 0, 0xF1AD, /* 0x80 */
+ 0, 0xEAE2, 0, 0, 0, 0, 0xD7C2, 0, /* 0x90 */
+ 0xF3A7, 0, 0, 0xCDEA, 0, 0xEBEE, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xD9B2, 0xFDA5, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xF6D5, 0xD5E2, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF8B5, /* 0xB0 */
+ 0, 0, 0xCCF5, 0xF5B5, 0xE4AD, 0, 0, 0, /* 0xC0 */
+ 0, 0xE7EB, 0xF1D5, 0, 0, 0, 0xF0BB, 0, /* 0xC0 */
+ 0, 0xE9B5, 0, 0xCCC9, 0xFAD5, 0, 0, 0xE1D4, /* 0xD0 */
+ 0, 0, 0xD7D6, 0, 0, 0xDCC1, 0, 0xDEC6, /* 0xD0 */
+ 0xFAEF, 0xE3E1, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xE1F3, 0xDCF6, /* 0xE0 */
+ 0, 0xCEFC, 0, 0xDBC4, 0, 0xF8F1, 0, 0, /* 0xF0 */
+ 0xDCE4, 0, 0xE5EF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCB1, 0, 0, 0, 0xD5D6, 0, /* 0x00 */
+ 0, 0xF3DA, 0, 0xCBC1, 0, 0xDBC3, 0, 0, /* 0x00 */
+ 0, 0xD9FA, 0xD3EE, 0, 0, 0, 0xFAB8, 0, /* 0x10 */
+ 0, 0xFDA6, 0xEBEF, 0, 0xF4A6, 0, 0xCCCA, 0xF3A8, /* 0x10 */
+ 0, 0xF3DB, 0, 0xDBA7, 0xF6B7, 0, 0xCFE6, 0xF0F2, /* 0x20 */
+ 0xCBDA, 0, 0xE7D2, 0xD7C3, 0xF6F0, 0xE8DE, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE5A6, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE5E7, 0, 0, 0, 0xCAA3, /* 0x40 */
+ 0xCCA7, 0xEAC9, 0, 0, 0, 0, 0, 0xF8B6, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xFAA5, 0, 0, /* 0x50 */
+ 0, 0, 0xF1AE, 0, 0xEFCE, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xCBED, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xF6B0, 0xEFCF, 0xE9CF, 0, /* 0x70 */
+ 0xF7DE, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xCED3, 0, 0, 0, 0, 0xDCF7, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xDBA8, 0, 0, /* 0x80 */
+ 0, 0xCBF8, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xDFA1, 0xDDE1, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xF5CA, 0xE9B6, 0, 0, /* 0xA0 */
+ 0, 0, 0xE7EC, 0xEEEE, 0, 0xF3F0, 0, 0xDFBF, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xCCCB, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xD0C1, 0, 0, /* 0xC0 */
+ 0, 0xF4D2, 0xE0BA, 0, 0, 0, 0, 0xDFC0, /* 0xC0 */
+ 0, 0xCEE0, 0, 0, 0, 0xDCD2, 0xFDEA, 0, /* 0xD0 */
+ 0, 0, 0xD6F6, 0, 0, 0, 0xEACA, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xE8E9, 0, 0xE3AC, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF3D0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xCAA4, 0, 0xDBF8, 0, 0, 0, 0xDEC7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEBF0, 0xF1D6, 0, 0, 0xE5E2, 0, 0xCCCC, 0, /* 0x00 */
+ 0, 0xCBFB, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xEAE3, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDFC1, /* 0x10 */
+ 0, 0xD6ED, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE9D0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xEEB9, 0, 0, 0, 0, 0xD5E3, /* 0x30 */
+ 0, 0, 0xD1D3, 0, 0xE5F0, 0, 0, 0, /* 0x30 */
+ 0xE8B4, 0xEBC3, 0, 0xEAAA, 0xFAFC, 0xF5F6, 0xF0BC, 0xFDD4, /* 0x40 */
+ 0xE0BB, 0xCEC3, 0, 0xD0BA, 0xF7BA, 0xD8F3, 0xF7CD, 0, /* 0x40 */
+ 0, 0, 0xE4AE, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xD4DF, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xD0E7, 0, 0, 0xECFD, 0, 0xD2AE, /* 0x60 */
+ 0xEEEF, 0xD5D7, 0xEAE4, 0xF8A2, 0xCDEB, 0xD7BF, 0xFBB1, 0, /* 0x60 */
+ 0, 0xCDEC, 0, 0, 0, 0xDCB2, 0xD0EC, 0xCEFD, /* 0x70 */
+ 0xEEF0, 0, 0, 0, 0xCCC2, 0, 0, 0, /* 0x70 */
+ 0xD0ED, 0, 0, 0, 0, 0, 0xE5F7, 0, /* 0x80 */
+ 0, 0, 0xF3FC, 0, 0, 0xEEA2, 0, 0, /* 0x80 */
+ 0, 0, 0xD9B3, 0, 0, 0xD8F4, 0, 0xE9B7, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xCEAE, 0, 0, 0, 0, 0xD9A2, 0, 0, /* 0xA0 */
+ 0, 0, 0xD8F1, 0, 0xD4CF, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xE5A7, 0xD5D2, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xD6A9, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF4A2, 0, 0xF1D7, 0, /* 0xC0 */
+ 0, 0xD5D8, 0, 0xF0BD, 0xD7D0, 0xD4D0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xD7CF, 0xEBEA, 0xFDEB, 0, /* 0xD0 */
+ 0, 0xDBED, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xFCC5, 0xCBC2, 0, 0, 0, 0, 0xFDD5, 0, /* 0xF0 */
+ 0xF4C8, 0xE8EA, 0xF5F3, 0, 0, 0xF9DE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD3EF, 0, 0, 0xECD3, 0, 0, 0xDDC2, 0xEFB7, /* 0x00 */
+ 0xE7D4, 0, 0xCACA, 0, 0, 0, 0xD9FB, 0, /* 0x00 */
+ 0, 0xFAFD, 0, 0, 0, 0, 0, 0xD6AA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF4F8, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xF7F7, 0xDCAC, 0, 0, /* 0x20 */
+ 0, 0xD7D7, 0xDFA2, 0, 0, 0, 0xCEBE, 0, /* 0x20 */
+ 0xD3F0, 0, 0, 0, 0, 0, 0xF0A4, 0xE1EC, /* 0x30 */
+ 0xCFE7, 0xF3CB, 0xEDA9, 0xCABE, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xF4EF, 0, 0, 0, 0xF6CE, /* 0x40 */
+ 0, 0, 0xDEFB, 0xD0BB, 0xD5B7, 0xEEF1, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF4A8, 0, 0xDCF8, 0, /* 0x50 */
+ 0, 0, 0, 0xCBA7, 0, 0xDACE, 0, 0, /* 0x50 */
+ 0, 0xE0E6, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xEDA5, 0xEEF2, 0, 0, 0, 0, 0xDCF9, /* 0x60 */
+ 0, 0, 0xF9DC, 0, 0, 0xF3DC, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF8F2, 0, 0xF4F9, /* 0x70 */
+ 0, 0, 0, 0xFCF1, 0, 0, 0, 0xD0BC, /* 0x80 */
+ 0xDBF9, 0xD7B1, 0, 0, 0, 0xCBFC, 0, 0, /* 0x80 */
+ 0, 0xF0A5, 0xCBFD, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xD5F4, 0, 0, 0, 0xCDED, /* 0x90 */
+ 0xCAA5, 0, 0, 0xD6AB, 0xD0C2, 0, 0, 0, /* 0xA0 */
+ 0, 0xF0BE, 0xD2BD, 0xCCA4, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xFAB6, 0, /* 0xB0 */
+ 0, 0xCCCD, 0, 0xDAFA, 0, 0xF6CF, 0, 0xE9B8, /* 0xC0 */
+ 0, 0xD8F5, 0, 0, 0, 0xCCCE, 0, 0, /* 0xC0 */
+ 0, 0, 0xD7CD, 0, 0, 0xD4D1, 0xE9ED, 0, /* 0xD0 */
+ 0xCAEB, 0xD9E2, 0, 0xFDB2, 0, 0xE3AD, 0xD6CC, 0xD9B4, /* 0xD0 */
+ 0, 0, 0xE1A7, 0xEED3, 0xD0C3, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xFDB3, 0, 0xD5E4, 0, 0, /* 0xF0 */
+ 0xCFE8, 0, 0xEDC3, 0xD0B2, 0, 0, 0xCEFE, 0xDAA8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF8D0, 0, 0, /* 0x00 */
+ 0xFDD6, 0, 0, 0, 0, 0xF8D1, 0, 0xF8D2, /* 0x00 */
+ 0xDCD3, 0, 0, 0, 0, 0xDDE2, 0xFBF9, 0xDDC1, /* 0x10 */
+ 0, 0xE3B5, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xEDDD, 0xCEC4, 0, 0xCBA1, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xDDE3, 0, 0, 0, 0, 0xFCDD, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF9AF, 0, 0, 0, 0, 0, 0xD2FB, /* 0x30 */
+ 0xCFA1, 0xE4A8, 0, 0xF4B6, 0xECFE, 0, 0, 0xE3AE, /* 0x40 */
+ 0xE7ED, 0xFDC1, 0xDAE2, 0, 0, 0xD8B3, 0, 0, /* 0x40 */
+ 0, 0xDDE4, 0xF0EF, 0xF6F1, 0xFAF0, 0, 0, 0xD1F5, /* 0x50 */
+ 0, 0, 0xDACF, 0, 0xDCD4, 0, 0xDCA6, 0, /* 0x50 */
+ 0xEFBF, 0, 0, 0, 0, 0, 0xCECF, 0, /* 0x60 */
+ 0xE0D9, 0, 0, 0, 0, 0, 0, 0xD9D6, /* 0x60 */
+ 0xECD4, 0xEACB, 0, 0, 0xCABF, 0xD5B0, 0, 0xCFE9, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF1ED, 0, 0xCCCF, /* 0x70 */
+ 0, 0, 0, 0, 0xE4F8, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xE4ED, 0, 0, 0, 0, /* 0x90 */
+ 0xD7D8, 0, 0xFDA7, 0, 0, 0, 0, 0xEAAB, /* 0x90 */
+ 0xF6B2, 0, 0, 0, 0, 0xCFF0, 0xF9BD, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xE6F4, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xCBDB, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF3D1, 0, 0, 0, 0, /* 0xC0 */
+ 0xE9D1, 0xF3A9, 0xD0E0, 0xE9D2, 0, 0xDAE3, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE2D2, 0, 0xF6A2, 0xE1F4, /* 0xD0 */
+ 0, 0, 0, 0xDAE4, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE7D5, 0xF5BF, 0xCFA2, 0xCDAF, 0xCFA3, 0, 0, /* 0xE0 */
+ 0, 0xCDB0, 0xF1FE, 0xD0A3, 0xE1AF, 0xF8A3, 0, 0xCAA6, /* 0xE0 */
+ 0xF7BB, 0xF2EA, 0xDEC8, 0xE9D3, 0, 0, 0, 0, /* 0xF0 */
+ 0xDEC9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFDDE, 0xCAC0, 0, 0, 0, /* 0x00 */
+ 0xF9EA, 0xD1CE, 0xEED4, 0, 0xD4D2, 0xD9A3, 0xFDA8, 0xD7D9, /* 0x00 */
+ 0xF7CE, 0xFABE, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xCFD6, 0, 0xD7F0, 0, 0xEBE1, /* 0x10 */
+ 0xF8C5, 0, 0, 0, 0, 0, 0xDCFA, 0, /* 0x20 */
+ 0, 0xDDC3, 0, 0xF9DF, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE7EF, 0, 0, 0, 0, /* 0x30 */
+ 0xFDE5, 0xF6A3, 0, 0xD9FC, 0xFDA9, 0, 0xE7EE, 0, /* 0x30 */
+ 0, 0, 0xD5E5, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEFD0, 0, 0xCDB1, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF7A2, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xF1B2, 0, 0xF1B1, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xCDB2, 0, 0xDAAB, 0, 0xCAA7, 0, 0, /* 0x70 */
+ 0, 0, 0, 0xE3E2, 0xFBBC, 0xD9A4, 0, 0, /* 0x70 */
+ 0xEEBA, 0, 0, 0, 0, 0, 0xF8D3, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xFBFA, 0, 0xCFA4, 0, /* 0x80 */
+ 0xDCFB, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF6E3, 0, 0, 0, /* 0xA0 */
+ 0xEDAA, 0, 0, 0xF2A1, 0xCEE1, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xFAA6, 0, 0, 0, 0, /* 0xB0 */
+ 0xF9E0, 0, 0, 0, 0, 0xECD6, 0, 0, /* 0xB0 */
+ 0xE4EE, 0xF9A1, 0, 0, 0xFBEF, 0, 0, 0, /* 0xC0 */
+ 0xF9EB, 0xEEA3, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xEAAC, 0, 0, 0, 0xCAA8, 0, 0, /* 0xE0 */
+ 0xF4FA, 0, 0, 0, 0, 0xCDD6, 0xFCF6, 0, /* 0xE0 */
+ 0, 0, 0xF4C9, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xF8D4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF8A6, 0, 0xDECA, 0xF2C6, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xD7DA, 0, /* 0x00 */
+ 0xD3D0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xD8C5, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEAE6, /* 0x20 */
+ 0, 0xF3DD, 0, 0, 0, 0xE4DA, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xF6E4, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF6F2, 0, 0xDFC2, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD9FD, /* 0x40 */
+ 0, 0, 0, 0xCCF6, 0, 0, 0xD3BA, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xE4AF, 0, /* 0x50 */
+ 0, 0, 0, 0xF9E1, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF0A6, 0, 0, 0, /* 0x70 */
+ 0xCBD3, 0, 0, 0, 0xE0BC, 0, 0xF4CA, 0xD4FA, /* 0x80 */
+ 0, 0xFDAA, 0xF9E2, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xF4B7, 0xFDC2, 0xFCB0, 0, 0xFDEC, 0xCAE2, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFDBD, /* 0xA0 */
+ 0, 0xEAE7, 0xDFC3, 0xD1D2, 0xCEE2, 0, 0xD3A4, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xFDAB, 0, 0xDFE0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xF2C7, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE7F0, 0, 0xD0EE, 0, 0, 0xF3AA, /* 0xD0 */
+ 0, 0, 0, 0xDECB, 0xF6B8, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xE1F5, 0xF1B3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF7A3, 0, /* 0x00 */
+ 0, 0xCAA9, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xCFA5, 0, 0, 0xDFC4, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1B0, /* 0x20 */
+ 0, 0, 0xF0BF, 0, 0xF6A4, 0, 0xE3B6, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xFAC6, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xD0EF, 0, 0, 0xFDED, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xDDC4, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xFCF7, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xE6BF, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xDEAD, 0, 0xFABF, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE5F1, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xEDC4, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xD2A5, 0, 0, 0xFDEE, 0, 0, /* 0xC0 */
+ 0, 0xF5B6, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE1F6, 0xDECC, 0, 0, 0xFCDE, 0, /* 0xD0 */
+ 0xECD7, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xCDDD, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xD6B7, 0xCDB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF8D5, 0xE5D8, 0, 0, 0, /* 0x00 */
+ 0xCFEA, 0, 0, 0xCFD0, 0, 0xEACC, 0, 0, /* 0x00 */
+ 0, 0, 0xEAAE, 0xEAAD, 0, 0, 0xD3F1, 0, /* 0x10 */
+ 0xD3A5, 0, 0, 0, 0, 0, 0, 0xF7CF, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xEEA4, 0, 0, 0, 0, 0xD0A4, 0, 0, /* 0x20 */
+ 0xF2A2, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xD0F0, 0, 0, 0, 0, /* 0x30 */
+ 0xF2A3, 0, 0xF7F8, 0, 0, 0, 0, 0xD0B3, /* 0x40 */
+ 0, 0, 0xDBA9, 0, 0, 0xD3BB, 0xCAEC, 0, /* 0x40 */
+ 0xF1A6, 0xCBD5, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF7E7, 0, 0, 0xCDDE, 0, 0xF7A4, 0, /* 0x60 */
+ 0, 0, 0xF8C0, 0, 0, 0, 0xD3DD, 0, /* 0x60 */
+ 0xCCD0, 0, 0, 0, 0, 0xCFA6, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF6F3, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE1F7, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xD3DC, 0, 0, 0xFAFE, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xFAA7, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xEBD9, 0, 0xCFA7, 0xEAAF, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE4EF, 0, 0, 0, 0xE9B9, /* 0xC0 */
+ 0xF1D8, 0, 0, 0xD8D8, 0, 0, 0xE0F2, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6B4, /* 0xD0 */
+ 0xDCFC, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF3F1, 0, 0, 0, 0xE3D0, 0, 0, 0xF2FB, /* 0xF0 */
+ 0, 0xDBC6, 0xD0F1, 0, 0xD0F2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFDC, 0, 0xD3D1, 0, 0, 0xCCB1, 0xF7D8, 0, /* 0x00 */
+ 0xCBA8, 0xEBBC, 0xE4BE, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xF4DC, 0, /* 0x10 */
+ 0, 0xDCC2, 0, 0, 0xF0A7, 0, 0, 0xE6C0, /* 0x20 */
+ 0, 0, 0xCAED, 0, 0, 0, 0, 0xE8EB, /* 0x20 */
+ 0xE5E8, 0xDCC3, 0, 0, 0xEDDE, 0xD3F2, 0, 0, /* 0x30 */
+ 0, 0, 0xCCF7, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xCED4, 0xE7AB, 0, 0, 0, 0xCBC3, /* 0x40 */
+ 0, 0xE1B1, 0, 0, 0xF7B2, 0, 0, 0xD3F3, /* 0x50 */
+ 0xD3D2, 0, 0xF5C0, 0, 0, 0, 0xDFDD, 0, /* 0x50 */
+ 0, 0xEEF3, 0xE7F1, 0, 0xFDB4, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF2C8, 0, 0, /* 0x70 */
+ 0, 0xF3D2, 0, 0, 0xEEF4, 0, 0xE2D3, 0, /* 0x70 */
+ 0, 0, 0, 0xCCD1, 0, 0xDFEA, 0, 0, /* 0x80 */
+ 0, 0xE9BA, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xD9D7, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF5CD, 0, 0xF1F2, 0xFAC7, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xD9F8, 0xD4C2, 0, 0, 0, 0, 0xF6E5, 0, /* 0xA0 */
+ 0, 0, 0, 0xDDC5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE7F2, 0xEDDF, 0, 0, 0xCACB, 0, /* 0xB0 */
+ 0, 0xDBFA, 0, 0, 0, 0xE8B5, 0, 0xD3A6, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xFDB5, 0, /* 0xC0 */
+ 0, 0xF9C9, 0, 0xE4E2, 0, 0xFBBD, 0, 0, /* 0xD0 */
+ 0xD7A4, 0xCEC5, 0, 0, 0, 0, 0xCED5, 0xD6E6, /* 0xD0 */
+ 0, 0, 0, 0, 0xE5BD, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xDECD, 0xECF3, 0, 0, 0xEDE0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xECEC, 0xFBBE, 0xDFEB, 0, 0xE1F8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF9BE, /* 0x00 */
+ 0, 0, 0, 0, 0xD0F3, 0xE0AA, 0xE8E2, 0, /* 0x10 */
+ 0, 0xE2D4, 0xD2FD, 0, 0xE5A8, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xD9D3, 0, 0, 0, 0, 0xD3DE, /* 0x20 */
+ 0, 0xF4B8, 0xF7BC, 0xDCFD, 0, 0xE8EC, 0xE4E7, 0, /* 0x20 */
+ 0, 0xE3F7, 0, 0, 0, 0, 0, 0xECA8, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xFAF1, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE5F2, 0, 0, 0xD0F4, /* 0x40 */
+ 0xD2AF, 0xDCE5, 0, 0, 0, 0, 0xD0A5, 0xF1B4, /* 0x40 */
+ 0xFCB1, 0xCCF8, 0, 0, 0xDDC6, 0xFAD1, 0, 0xF7DF, /* 0x50 */
+ 0, 0, 0xFAA8, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xEEF5, 0, 0xDECE, 0, 0, 0, 0, 0xE7F3, /* 0x60 */
+ 0, 0, 0xF7AC, 0xEBC4, 0xEDE1, 0xE0AB, 0xDDC7, 0, /* 0x60 */
+ 0, 0, 0, 0xD2B3, 0xD2BF, 0, 0, 0, /* 0x70 */
+ 0xCACC, 0, 0, 0, 0, 0xFBBF, 0, 0, /* 0x70 */
+ 0, 0, 0xE5FD, 0xDDE5, 0xD8CD, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xECF4, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xD0F5, 0, 0, 0xE8ED, 0xD0D2, /* 0x90 */
+ 0, 0xD9D8, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF6E6, 0, 0, /* 0xA0 */
+ 0xDBAA, 0, 0, 0, 0xF7E0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xD8D9, 0, 0xF4A3, 0, 0, 0xF4DD, 0, /* 0xB0 */
+ 0, 0, 0, 0xEFD1, 0, 0, 0xD9B5, 0, /* 0xC0 */
+ 0, 0xEDAB, 0, 0xE3B7, 0, 0, 0, 0, /* 0xC0 */
+ 0xEEBB, 0xCDB4, 0, 0xE0F3, 0xEACD, 0, 0, 0, /* 0xD0 */
+ 0, 0xECF5, 0xE8EE, 0, 0xCBA9, 0xF1AF, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xCACD, 0, /* 0xE0 */
+ 0xECA9, 0, 0xF2EB, 0, 0xFDEF, 0, 0xF9F3, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xE6C1, 0, 0, 0xECD8, 0, 0, 0, 0xEDAC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEACE, 0, 0xE8DF, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xDECF, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xD2A6, 0, 0, 0xE7F4, 0xD1D6, 0, 0, 0xE6C2, /* 0x10 */
+ 0xE3E3, 0, 0, 0, 0, 0xE4B0, 0, 0, /* 0x20 */
+ 0, 0xD8B4, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xF6A5, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF3DE, 0, 0, 0, /* 0x30 */
+ 0, 0xD7A5, 0, 0, 0, 0, 0xF7E8, 0, /* 0x40 */
+ 0, 0xE8C6, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xFBE6, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xDDE6, 0, 0, 0, 0xDCFE, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD8DA, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xDAAC, 0xEAB0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE3B8, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xCAAA, 0xE1F9, 0, 0xEAB1, 0, 0, 0, /* 0xC0 */
+ 0, 0xF2EC, 0, 0, 0xFAEE, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xEED5, 0, 0, 0, 0, 0xF9F4, 0, /* 0xE0 */
+ 0, 0xD2EC /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFBFB, 0, 0, /* 0x00 */
+ 0, 0xFDF0, 0, 0xE0BD, 0xCEE3, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xF8C6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xDEAE, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xDFC5, 0, 0, 0xE5BE, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEDAD, 0xFAEA, 0, 0, 0xCDEE, 0xEDA6, 0, 0xEDAE, /* 0x50 */
+ 0xF0ED, 0, 0xDDA1, 0, 0xEDAF, 0xFCF8, 0, 0xD8EB, /* 0x50 */
+ 0, 0, 0, 0xCCF9, 0xCDB5, 0, 0, 0, /* 0x60 */
+ 0, 0xFAA9, 0, 0xE1DD, 0, 0, 0, 0, /* 0x60 */
+ 0xE2D5, 0xEDCF, 0, 0, 0, 0xDDA2, 0, 0, /* 0x70 */
+ 0xF9CA, 0, 0xEAE8, 0, 0xE5ED, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xD3EB, 0, 0xE9D4, /* 0x80 */
+ 0xE1FA, 0xE4CC, 0, 0xE1E4, 0xE8C7, 0, 0, 0xCEDB, /* 0x80 */
+ 0, 0, 0, 0xDCD5, 0, 0xF7B5, 0xFCF3, 0xF0F3, /* 0x90 */
+ 0xCEAF, 0xF1B5, 0xEFD2, 0xE8C8, 0xEBF1, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xCBD4, 0xE0BE, 0xE3F8, 0xEAE9, 0xFCB2, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE0F4, 0, 0xCFE0, 0, /* 0xA0 */
+ 0xEEA5, 0, 0, 0xFAAA, 0xE6C3, 0xE1B2, 0xCAAB, 0, /* 0xB0 */
+ 0xE3E4, 0xE9BB, 0, 0, 0, 0, 0, 0xE2D6, /* 0xB0 */
+ 0xF3F2, 0, 0xEED6, 0xEAB2, 0xD0F6, 0xECD9, 0xDACB, 0xCFA8, /* 0xC0 */
+ 0, 0, 0, 0, 0xDDA3, 0, 0, 0, /* 0xC0 */
+ 0xD8DB, 0, 0xF9CE, 0xE9D5, 0xE3D1, 0, 0, 0xD2BC, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xD8AC, 0xF3CC, /* 0xD0 */
+ 0, 0xCDFB, 0xF6D6, 0, 0xE7F5, 0xE8EF, 0xE3F9, 0xD2BB, /* 0xE0 */
+ 0xF3F3, 0xE3FB, 0, 0xDED0, 0xCEB0, 0, 0xD6F7, 0xF1D9, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF5C1, 0xDCC4, 0, /* 0xF0 */
+ 0xF5BB, 0, 0xDED1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCE6, 0, 0, 0xDED2, 0, 0, 0xEDE2, /* 0x00 */
+ 0xEEF6, 0xEACF, 0xF0EE, 0xE3FC, 0, 0xD3DF, 0xD3F4, 0xE1B3, /* 0x00 */
+ 0, 0xE1B4, 0, 0, 0, 0, 0xF4D3, 0, /* 0x10 */
+ 0, 0xDFC6, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xE9D6, 0, 0, 0, /* 0x20 */
+ 0xDBAB, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xF6A6, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE3B9, 0xEBC5, 0xF4A9, 0xCDB6, 0xD2F9, 0, 0xDAAD, 0xD2E3, /* 0x30 */
+ 0xCFD1, 0, 0, 0, 0, 0xCBDC, 0xCCFA, 0, /* 0x40 */
+ 0xCFDD, 0, 0, 0xE8A9, 0, 0xE3BB, 0xE3BA, 0, /* 0x40 */
+ 0, 0xE0DA, 0, 0, 0, 0xEEF7, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xDCB3, 0, 0, 0, 0, /* 0x50 */
+ 0xD3F5, 0, 0xD7A6, 0, 0xF6B5, 0xD7DB, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE1D5, 0, 0, 0xD4EA, /* 0x60 */
+ 0, 0xDFA3, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xFDDF, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xD0F7, 0xEDD4, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xCBAA, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE4DB, 0, 0xE1FB, 0xCBA2, 0, 0, 0, /* 0xA0 */
+ 0, 0xD3E0, 0, 0xE4BF, 0, 0xFBC0, 0, 0xDABE, /* 0xB0 */
+ 0xE4CD, 0, 0xD6B9, 0, 0, 0, 0xEFC0, 0, /* 0xB0 */
+ 0xE1FC, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xF6B9, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xDFC7, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE4B1, 0, 0, 0, 0, 0, 0, 0xDCE7, /* 0xE0 */
+ 0xDCE8, 0, 0, 0, 0xFAD6, 0, 0xD3F6, 0, /* 0xF0 */
+ 0, 0, 0, 0xF1DA, 0, 0xFAF2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2FD, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xD5CF, 0xD0F8, 0, /* 0x00 */
+ 0, 0xCDDF, 0, 0, 0xF5CB, 0, 0xE4F0, 0xCBAB, /* 0x10 */
+ 0, 0xD7C4, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2FE, /* 0x20 */
+ 0, 0xDDDA, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xDAAE, 0xCAEE, 0, 0, 0, /* 0x40 */
+ 0xD5B9, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE3A1, 0, 0, 0xE8E3, 0, 0, 0xF3AB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCFA9, /* 0x80 */
+ 0, 0, 0, 0xD3F7, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xD4F1, 0, 0, /* 0x90 */
+ 0xCEE4, 0, 0xE8F2, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE5F5, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xE7AE, 0, 0xD6BA, 0, 0xDFEC, 0xE4C0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xE8E4, 0, 0, /* 0xC0 */
+ 0, 0, 0xD8B5, 0, 0, 0, 0xE4DC, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xF4B9, 0xF1B6, 0, /* 0xD0 */
+ 0, 0xE2DE, 0xE1B5, 0, 0, 0xCDEF, 0xF1A7, 0xCEE5, /* 0xE0 */
+ 0xCBDD, 0, 0, 0xD9E3, 0, 0, 0xF3AC, 0, /* 0xE0 */
+ 0, 0xD0F9, 0xECAB, 0xDED3, 0xF7E9, 0, 0, 0xF9F5, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xE1DE, 0xCBEE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE3BC, 0xF8D6, 0, 0, 0xDBEE, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xFDF1, 0, 0, 0, /* 0x00 */
+ 0, 0xF7B6, 0, 0, 0, 0, 0xF4DE, 0, /* 0x10 */
+ 0, 0xF2ED, 0, 0xDBD9, 0, 0xF0A8, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE1FD, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xDED4, 0, 0xE0AC, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xEDE3, 0, 0, 0xD3E1, 0, /* 0x30 */
+ 0xDFC8, 0, 0, 0, 0, 0xD9B6, 0, 0xFDAC, /* 0x30 */
+ 0xEFD3, 0, 0, 0, 0xE4C1, 0xF8EB, 0, 0xDBAC, /* 0x40 */
+ 0, 0, 0, 0, 0xFCC6, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xD8AD, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF6BA, /* 0x50 */
+ 0, 0xDBDF, 0xD3D3, 0xF8C7, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xCACE, 0xF8C1, 0xD2B4, 0, 0, 0xDCB4, /* 0x70 */
+ 0xFAB9, 0xCACF, 0, 0xFCB3, 0xEAEA, 0xEAEB, 0xD0FA, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xEDE4, 0, 0, 0xDDE7, /* 0x80 */
+ 0, 0, 0xDFC9, 0, 0, 0, 0, 0xDFED, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xEEBC, 0, 0xEFC1, /* 0x90 */
+ 0, 0, 0xCCD2, 0, 0xDDA4, 0, 0, 0, /* 0x90 */
+ 0xDFCA, 0, 0, 0, 0, 0, 0xD3F8, 0xF1A8, /* 0xA0 */
+ 0, 0, 0, 0xCDB7, 0, 0xEFD4, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xE4DD, 0xDFEE, 0xCBAC, /* 0xB0 */
+ 0xE9BC, 0, 0, 0, 0, 0, 0xEAEC, 0, /* 0xB0 */
+ 0, 0, 0xDFCB, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xF9BF, 0xD6AF, 0xD5C6, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xCFAA, 0, 0, 0xCEA9, 0, 0, 0xD6F8, 0, /* 0xD0 */
+ 0, 0, 0xF1B7, 0xEEF8, 0, 0, 0, 0xD9D9, /* 0xD0 */
+ 0xF3DF, 0, 0xF8C8, 0xCEC6, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xD5E6, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF4E6, 0, 0, 0xE6C5, 0xEFD5, /* 0xF0 */
+ 0, 0, 0xCBEF, 0xFCDF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCA7, 0, 0, 0xD6E7, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF8C9, 0, 0, 0, 0, 0xE3D2, /* 0x00 */
+ 0, 0xE3BD, 0, 0xCFE1, 0xF0C0, 0xECDA, 0, 0xDDD7, /* 0x10 */
+ 0xFBF0, 0, 0, 0xECAC, 0, 0, 0, 0xF0A9, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xFAD7, 0xFBC1, /* 0x20 */
+ 0, 0xD2C0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE5B0, 0, 0, 0, 0xEDE5, 0, 0, /* 0x30 */
+ 0, 0, 0xCBAD, 0, 0xF9B0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xF7A5, 0, 0xCBAE, 0, 0xDAAF, 0, 0xD8B6, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xD3A7, 0xFBB2, /* 0x50 */
+ 0, 0xFDC4, 0, 0xECAD, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xFBA1, 0, 0, 0, 0xE5E9, 0xE9EE, /* 0x60 */
+ 0, 0xF3F4, 0xF8F3, 0xF0C1, 0xDEAF, 0xF8B0, 0, 0, /* 0x60 */
+ 0xF3E0, 0xE7AF, 0, 0, 0, 0, 0, 0xDBAD, /* 0x70 */
+ 0, 0xE6B5, 0, 0, 0xF9A8, 0, 0, 0xDDD8, /* 0x70 */
+ 0xE8D9, 0xEFD6, 0, 0, 0, 0xD3E2, 0, 0xE2DF, /* 0x80 */
+ 0, 0, 0xFCE0, 0xD7C8, 0xFDAD, 0, 0, 0, /* 0x80 */
+ 0xDFEF, 0xCCD3, 0xD3F9, 0, 0, 0, 0, 0xD4F0, /* 0x90 */
+ 0xDBC7, 0xDED5, 0, 0, 0, 0, 0xF0F4, 0, /* 0x90 */
+ 0xD5D0, 0xE5D9, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xFCC7, 0xDCD6, 0xE2E0, 0, 0, 0, 0xDAB0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xF3A3, 0, 0xD3EC, /* 0xB0 */
+ 0, 0xF4CB, 0, 0, 0, 0xFDC5, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE3FD, 0, 0xF9B1, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xD0FB, 0xECDB, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xF5BC, 0xF2A4, /* 0xD0 */
+ 0xD8CE, 0xD8CF, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xF5F7, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF6E1, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xD2B7, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xFBEC, 0, 0xDDC8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4E8, /* 0x00 */
+ 0, 0, 0xD2C1, 0, 0, 0, 0xF8D7, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xD6BB, 0xDED6, 0, 0, /* 0x10 */
+ 0xF7BD, 0xECAE, 0, 0, 0, 0xD0E1, 0, 0xE0F5, /* 0x20 */
+ 0xEAB3, 0, 0xCED6, 0, 0, 0, 0, 0xCCA5, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xECF6, 0xE2E1, 0xE3BE, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xFCC8, 0, 0, /* 0x40 */
+ 0xCDF0, 0, 0xF9F6, 0, 0, 0xDFF0, 0, 0, /* 0x50 */
+ 0, 0xE5BF, 0, 0, 0, 0xCEBF, 0, 0, /* 0x50 */
+ 0, 0, 0xFCE1, 0xEDB0, 0xFDD1, 0xF6BB, 0, 0, /* 0x60 */
+ 0xF9CF, 0xEBDA, 0xCAC1, 0, 0xD2B8, 0xCDF1, 0, 0xE3D3, /* 0x60 */
+ 0xFDE6, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE6ED, 0, 0, /* 0x80 */
+ 0, 0xE3FA, 0, 0, 0xF0AA, 0xF9D0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xFCE2, 0, 0xF8A7, 0, /* 0x90 */
+ 0, 0, 0xE1E5, 0xEEF9, 0, 0, 0, 0xE7F6, /* 0x90 */
+ 0xEAED, 0, 0, 0xFCB4, 0xF5C2, 0, 0, 0xD7DC, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF0F5, 0, 0xDDE8, 0xD3ED, 0xF5FC, 0, 0xDABF, 0, /* 0xB0 */
+ 0xCCFB, 0, 0, 0, 0xD3FA, 0xF4A4, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xEFD7, 0, 0xD4C3, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xFBE3, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xFBED, 0, 0xE0AD, 0, 0, 0xEAEE, /* 0xD0 */
+ 0xFBB3, 0xE4C2, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF6E7, 0xD2DD, 0, 0xDFCC, 0, 0, 0xFCC9, 0, /* 0xF0 */
+ 0, 0xE5A9, 0xE0F6, 0xF6B3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1FE, 0, 0, 0, 0, 0xCBF0, 0, /* 0x00 */
+ 0xEAEF, 0xEAF0, 0, 0, 0, 0xDAC0, 0xF8B4, 0xEBF2, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE4C3, 0, 0, /* 0x10 */
+ 0, 0, 0xE9D7, 0xE4F1, 0, 0, 0, 0xCAEF, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCED7, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xFCCA, 0, 0, 0, 0xF3E1, 0, 0, 0xCBC4, /* 0x30 */
+ 0, 0, 0, 0, 0xE3E5, 0, 0xCBC5, 0xEAB4, /* 0x30 */
+ 0, 0, 0xE9BD, 0, 0xD7C9, 0, 0, 0xEBDB, /* 0x40 */
+ 0xEDB1, 0, 0xCCC3, 0xF7BE, 0xFCCB, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF8F4, 0, 0xD9B7, 0, 0, /* 0x50 */
+ 0xF3D3, 0xF3D4, 0, 0, 0, 0xF7E4, 0, 0xF7D1, /* 0x50 */
+ 0, 0, 0xD8B7, 0xCEB1, 0xCAC2, 0, 0, 0xFBB4, /* 0x60 */
+ 0xCBC6, 0, 0, 0xF0F6, 0, 0, 0xD5E7, 0, /* 0x60 */
+ 0xEAD0, 0, 0, 0, 0, 0, 0xCCD4, 0xCBAF, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF4AA, 0xE9AF, 0, /* 0x70 */
+ 0, 0xF5C3, 0xE9D8, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xDDE9, 0, 0, 0, 0xF1F3, 0, /* 0x80 */
+ 0xD5FB, 0xDEBB, 0, 0, 0xF4FB, 0, 0, 0, /* 0x90 */
+ 0xFDF3, 0xFDF2, 0xF7A6, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xDDC9, 0, 0, 0xD4D3, /* 0xA0 */
+ 0, 0xCCA8, 0, 0xDAC1, 0xCCD5, 0, 0xD9E4, 0, /* 0xA0 */
+ 0, 0, 0xFACA, 0, 0, 0, 0xE5E3, 0, /* 0xB0 */
+ 0, 0, 0xD3BC, 0, 0, 0, 0xCAF0, 0, /* 0xB0 */
+ 0, 0, 0, 0xD0C4, 0, 0, 0, 0xCAD0, /* 0xC0 */
+ 0xFAAB, 0xEBEB, 0xE7F8, 0xD9E5, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xD1D7, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xF3A4, 0, 0, 0, 0xD4FB, 0xFCE3, /* 0xF0 */
+ 0xFAD8, 0, 0xF3D5, 0, 0xCFAB, 0, 0, 0xEBF3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD5FC, 0, 0, 0, 0, 0, 0, 0xD3D4, /* 0x00 */
+ 0xCDFC, 0, 0xD9E6, 0, 0xE2F9, 0xE2A1, 0xEBD4, 0, /* 0x00 */
+ 0xE0F7, 0xE4B2, 0xCCFC, 0, 0, 0, 0xFBE4, 0, /* 0x10 */
+ 0, 0, 0xF4AB, 0, 0, 0, 0, 0xD0BD, /* 0x10 */
+ 0, 0xCAF1, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xEFB8, 0, 0, 0, 0xD7C0, 0, /* 0x20 */
+ 0xEEFA, 0xFDF4, 0, 0, 0xD3E3, 0, 0xFBC2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xD5E8, 0xDBAE, /* 0x30 */
+ 0xE1B6, 0xF8B7, 0, 0, 0, 0, 0, 0xE0BF, /* 0x40 */
+ 0xFBC3, 0xDDEA, 0, 0xE2A2, 0, 0xEEA6, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF6E8, 0, 0, 0, 0, /* 0x50 */
+ 0xF6F5, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xDDCA, 0, /* 0x60 */
+ 0, 0xD0E2, 0, 0, 0, 0, 0xDDA6, 0, /* 0x70 */
+ 0, 0xDDEB, 0, 0, 0xE4F9, 0, 0, 0xE3AF, /* 0x70 */
+ 0xD0FC, 0, 0, 0, 0xF4FC, 0, 0, 0, /* 0x80 */
+ 0, 0xCCBC, 0xF7EA, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xE5E4, 0xDFF1, 0, 0, 0xF7E1, 0, 0xF9F7, /* 0x90 */
+ 0xEFB9, 0, 0, 0xF8D8, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF9A9, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xF8D9, 0, 0, 0, 0xEEBD, 0, 0, /* 0xB0 */
+ 0, 0xD8C6, 0, 0, 0xE4E3, 0xF5CE, 0, 0, /* 0xB0 */
+ 0, 0, 0xDDD9, 0, 0, 0, 0, 0xD9E7, /* 0xC0 */
+ 0xD2B9, 0xD5C3, 0, 0, 0xDAE5, 0xDAD0, 0, 0xD1D9, /* 0xC0 */
+ 0xCED8, 0, 0xCBDE, 0xF4AC, 0xDAFB, 0, 0xF6E9, 0xE8F3, /* 0xD0 */
+ 0xCFAC, 0xF0F0, 0, 0xF4FD, 0xDBC8, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xCEC0, 0xE3D4, 0xD1CF, 0xF1F5, /* 0xE0 */
+ 0, 0xCDF2, 0, 0xCFEB, 0, 0, 0, 0xCDB8, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0xE3A6, 0xD1DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF2A5, 0, 0, 0, 0, 0, 0xF2A6, /* 0x00 */
+ 0, 0xE4CE, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xD3FB, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xF1A9, 0, 0, 0, 0xF2C9, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xEFD8, 0xE6C9, 0, 0xD8B8, 0xFAF3, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF3B5, 0, 0, 0xF8A4, 0, 0, 0xD1F3, /* 0x40 */
+ 0xE6C8, 0, 0, 0, 0, 0xF8DA, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDCE9, /* 0x60 */
+ 0xDED7, 0, 0, 0, 0, 0, 0xCBDF, 0, /* 0x60 */
+ 0, 0, 0xCFEC, 0, 0, 0, 0, 0xF4DF, /* 0x70 */
+ 0, 0, 0xD1F4, 0xD2BA, 0, 0, 0, 0xDFF2, /* 0x70 */
+ 0, 0, 0, 0xE1B7, 0, 0, 0, 0, /* 0x80 */
+ 0xE2A3, 0xD3FC, 0, 0, 0xEDE6, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xDBC9, 0, 0, 0, 0xE4FA, 0, /* 0x90 */
+ 0xCFDE, 0, 0, 0xCED0, 0, 0, 0, 0, /* 0x90 */
+ 0xD5D3, 0xF3F5, 0xF7AE, 0, 0, 0xEFC8, 0, 0xCDF3, /* 0xA0 */
+ 0xF5CF, 0xE5F3, 0xF0C2, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xCAD1, 0, 0, 0, 0xEAF1, 0, 0xD0A6, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD9DA, /* 0xC0 */
+ 0xF0AB, 0, 0, 0, 0, 0, 0xEBE7, 0, /* 0xD0 */
+ 0, 0, 0xE5C0, 0xFCB5, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE4C4, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xCCA9, 0xFDC6, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xEAB5, 0, 0xE5AA, 0xDFBA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1DF, 0, 0xDAD1, /* 0x00 */
+ 0, 0, 0, 0, 0xE1B8, 0, 0xE8F4, 0xD3FD, /* 0x10 */
+ 0, 0, 0, 0, 0xE2A4, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xF2CA, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xDAE6, 0xF7B3, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xFDCD, 0, 0, 0, 0xF3B6, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xEED7, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF5C4, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xD8A4, 0, 0, 0, 0, 0, 0xF2A7, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xD9B8, 0xD9B9, 0xEFC9, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xD6CE, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF7CB, 0xDFAE, 0xE8F5, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xD2B5, 0, 0, 0, 0xD3D5, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF4CC, 0xDAFC, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xD9E8, 0, 0xF7EB, 0xF5C9, 0, /* 0xA0 */
+ 0xF3BC, 0, 0xDAD2, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xD3B5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE8B6, 0, 0, 0xD6CF, 0xF4BA, 0, 0xF7C9, /* 0xC0 */
+ 0, 0, 0xCCAA, 0, 0, 0xF0C3, 0xCCD6, 0, /* 0xC0 */
+ 0, 0, 0xD0D3, 0, 0xD3BD, 0, 0, 0, /* 0xD0 */
+ 0xDBFB, 0, 0xCBE0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xD3E4, 0xF6F7, 0, 0, 0xD5BA, 0xF3CD, 0xCBE1, /* 0xE0 */
+ 0, 0, 0, 0, 0xEBF4, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xF4AD, 0, 0xFCAA, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xF7EC, 0, 0, 0, 0xE8F6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDAE7, 0, 0, 0, 0xF7CC, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE5C1, 0, 0, 0, 0, 0xE0EE, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xD5FD, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xCEE6, 0xFCAB, 0xD5BB, 0, 0, 0xF2A8, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xE2A5, 0xCDB9, /* 0x30 */
+ 0xEAF2, 0xCBC7, 0, 0xCDF4, 0, 0, 0xDBAF, 0xEFD9, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xCDBA, 0, 0, /* 0x40 */
+ 0xFCF9, 0, 0, 0, 0, 0xDFF3, 0xCEE7, 0xDAC2, /* 0x40 */
+ 0, 0xCFAD, 0, 0, 0, 0, 0xE7F9, 0xF8A8, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xF3E2, 0, /* 0x50 */
+ 0, 0, 0xCAF2, 0xDFA4, 0, 0, 0xD4C4, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xCCD7, 0xE5C2, 0, 0, /* 0x60 */
+ 0, 0, 0xCDBB, 0, 0xEFDA, 0xEED8, 0, 0xDDA7, /* 0x70 */
+ 0xE2A6, 0, 0, 0, 0, 0, 0xE0C0, 0, /* 0x70 */
+ 0, 0, 0xD6B0, 0xF8CA, 0, 0xFCFA, 0, 0xD9FE, /* 0x80 */
+ 0, 0, 0, 0, 0xDEB0, 0, 0, 0, /* 0x80 */
+ 0xDDEC, 0xDAE8, 0, 0, 0, 0, 0, 0xD4E0, /* 0x90 */
+ 0, 0xD6F9, 0, 0xCDD7, 0xDED8, 0, 0, 0xF2F8, /* 0x90 */
+ 0, 0xE4D6, 0, 0, 0xD0C5, 0xF4AE, 0, 0xDDA8, /* 0xA0 */
+ 0, 0, 0, 0xEDC5, 0xF3D6, 0, 0, 0xDED9, /* 0xA0 */
+ 0xE3E6, 0, 0, 0, 0, 0, 0, 0xD3A8, /* 0xB0 */
+ 0, 0xDBB0, 0, 0, 0xE5DA, 0xE3BF, 0, 0, /* 0xB0 */
+ 0, 0xDBB1, 0, 0, 0, 0xD5E9, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE0C1, 0xEFDB, 0, 0, 0xF0E9, /* 0xC0 */
+ 0, 0, 0xD7B2, 0, 0, 0, 0, 0xD0FD, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xD9E9, 0, 0, 0xD0FE, 0, 0xECED, 0xD3A9, 0, /* 0xE0 */
+ 0xF2A9, 0xF0C4, 0, 0, 0xE2E2, 0xE9EF, 0, 0, /* 0xE0 */
+ 0, 0xF9D1, 0, 0, 0xE9D9, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xE8DA, 0xDAC3, 0xDAC4, 0xD4C5, 0, 0xE7FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDE0, 0xE3B0, /* 0x00 */
+ 0, 0xDBB2, 0xFBC4, 0, 0xF3E3, 0, 0xD9A5, 0xFBE7, /* 0x00 */
+ 0xDDCB, 0xD0D4, 0, 0xE6B6, 0xE0AE, 0xFDDA, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xDCB5, 0xE0F8, /* 0x10 */
+ 0xE7B1, 0, 0, 0, 0, 0xF5F0, 0, 0xD8DC, /* 0x20 */
+ 0xEDC6, 0, 0, 0, 0, 0xE1B9, 0, 0xE3C0, /* 0x20 */
+ 0xF9C0, 0xE9F0, 0, 0, 0xD9DB, 0, 0xF3E4, 0, /* 0x30 */
+ 0, 0, 0xDCB6, 0xE4E9, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF0C5, 0xE3C1, 0xFCCC, 0xFCCD, 0, 0, 0, /* 0x40 */
+ 0, 0xF2CB, 0, 0xF2CC, 0, 0, 0, 0xE4CF, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF1DB, 0, 0xFAD9, 0, 0xF1B8, 0xFDF5, 0xE0F9, /* 0x50 */
+ 0, 0, 0, 0, 0xE7FB, 0xFCB7, 0xFCE4, 0xFBC5, /* 0x60 */
+ 0xE3E7, 0xD8B9, 0, 0xF6F8, 0, 0, 0xDCC5, 0xCCD8, /* 0x60 */
+ 0, 0, 0, 0xE0AF, 0xF4E7, 0, 0xEFDC, 0xCFFC, /* 0x70 */
+ 0xEFDD, 0, 0xF2AA, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xFDBE, 0, 0, 0xCAAC, /* 0x80 */
+ 0xFDBB, 0xFDC7, 0, 0, 0, 0, 0xE7B2, 0, /* 0x80 */
+ 0xEAD1, 0xDFF4, 0, 0, 0, 0, 0xD1EC, 0xE4DE, /* 0x90 */
+ 0xE5C3, 0, 0, 0, 0, 0xD9A6, 0, 0, /* 0x90 */
+ 0xCDBC, 0, 0xF3E5, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xEDD5, 0, 0, 0xD9BA, 0, /* 0xA0 */
+ 0, 0, 0xEDE7, 0xFBB5, 0xF8EC, 0, 0, 0, /* 0xB0 */
+ 0, 0xE0E7, 0, 0xCCD9, 0, 0, 0xD4C6, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE7A5, 0, 0xD5F5, 0xD3BE, /* 0xC0 */
+ 0, 0xFCFB, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE4F2, 0, /* 0xD0 */
+ 0, 0xDFF5, 0, 0, 0xE8F8, 0xF8ED, 0, 0, /* 0xD0 */
+ 0xCEC7, 0, 0, 0, 0, 0, 0xFDF6, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE8D8, 0, 0xCDD8, 0xE7D6, 0xCCDA, 0, 0, 0xCAE3, /* 0xF0 */
+ 0xDFF6, 0xF0C7, 0xF0C6, 0, 0xD8BA, 0, 0xF1F4, 0xF4F0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5CC, 0, 0, 0xFCE5, 0, 0, 0, 0, /* 0x00 */
+ 0xEAC5, 0xEAF3, 0, 0xDDDB, 0, 0xDCD7, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xDEFD, 0xF2F9, 0, 0xD5C7, /* 0x10 */
+ 0, 0, 0, 0xD8D0, 0, 0xF0C8, 0xD1A1, 0xD1A2, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xD9D4, 0xD6E8, /* 0x20 */
+ 0xD9CA, 0, 0xDAB1, 0xD8C7, 0xDCE2, 0xF3CE, 0xF5F4, 0, /* 0x20 */
+ 0, 0xF1B9, 0, 0, 0xDAD3, 0, 0xF6EA, 0, /* 0x30 */
+ 0, 0, 0xCFF5, 0, 0, 0xFDAE, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xCAD2, 0, /* 0x40 */
+ 0, 0xDFB4, 0, 0, 0, 0, 0xD7DD, 0xFABA, /* 0x40 */
+ 0xEEA7, 0xF5BD, 0, 0xF8F5, 0, 0, 0xEDE8, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xD4E1, 0, 0xD1A3, 0xE1D6, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF9F8, 0, 0xDBCA, /* 0x60 */
+ 0xCBF9, 0xD4D4, 0, 0xD9DC, 0, 0xEEBE, 0, 0xF7ED, /* 0x70 */
+ 0, 0, 0, 0xD2EE, 0, 0, 0xE1E6, 0xF7F9, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDDED, /* 0x80 */
+ 0, 0xE8DB, 0, 0xDBB3, 0, 0, 0, 0xD1F7, /* 0x80 */
+ 0xE0B0, 0, 0, 0xD4E2, 0, 0xF6D7, 0, 0xD7F9, /* 0x90 */
+ 0, 0, 0xD8DD, 0, 0xCDFD, 0xF2AB, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCDBD, /* 0xA0 */
+ 0xF8C2, 0, 0, 0xF2AC, 0, 0, 0xCAAD, 0xCAAE, /* 0xB0 */
+ 0xCFAE, 0, 0, 0, 0, 0, 0xE3C2, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xDCB7, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDBDA, /* 0xC0 */
+ 0xD9BB, 0xCAF3, 0xF6D3, 0xE6F8, 0xEAF5, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xEAF6, 0, 0, 0xF6F9, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xCFAF, 0, 0, 0xCAD3, 0, 0, 0xCAAF, /* 0xE0 */
+ 0xD2B0, 0xF1BA, 0, 0xD7B3, 0xE3C3, 0xF3FD, 0xDEDA, 0, /* 0xF0 */
+ 0, 0, 0, 0xDEDB, 0, 0, 0xEFDE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2E3, 0xEEFB, 0, 0, 0xDFF7, 0xD7CA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xCEE8, 0xDBDB, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF1BB, 0, 0, 0, 0, 0xE9F1, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xFAB7, 0xD0C6, 0, 0, 0xCCAB, 0xEEA8, 0, 0, /* 0x30 */
+ 0xCBFA, 0xF9F9, 0xCCFD, 0xD3FE, 0, 0, 0, 0, /* 0x40 */
+ 0xE4D0, 0, 0, 0, 0, 0, 0xF2EE, 0, /* 0x40 */
+ 0xD4D5, 0xDFCD, 0, 0xFCB8, 0xD1D0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF2CD, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xF7D2, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCAD4, /* 0x70 */
+ 0, 0xD5D9, 0, 0, 0, 0xD8DE, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCDD9, /* 0x80 */
+ 0, 0, 0, 0xEEA9, 0xF6BC, 0, 0, 0xCCDB, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF0C9, 0, 0xFCFC, /* 0x90 */
+ 0, 0xE8C9, 0xF4FE, 0, 0, 0, 0, 0xE7FC, /* 0xA0 */
+ 0xD7DE, 0, 0, 0, 0, 0xDEDC, 0, 0xF0AC, /* 0xA0 */
+ 0xCCFE, 0xCDE1, 0, 0xE1BA, 0, 0xDBEF, 0xDAB2, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xD1A5, 0xDCB8, 0, 0, /* 0xC0 */
+ 0, 0xD8F6, 0, 0xD1A4, 0, 0xCDE2, 0, 0, /* 0xC0 */
+ 0, 0, 0xDCEA, 0, 0, 0xF0F7, 0, 0xF0CA, /* 0xD0 */
+ 0xD0BE, 0, 0xDDDC, 0, 0, 0, 0, 0xD4D6, /* 0xD0 */
+ 0xD3D6, 0, 0, 0, 0, 0, 0, 0xEDD0, /* 0xE0 */
+ 0xCDA1, 0, 0, 0, 0, 0, 0xDFB5, 0, /* 0xE0 */
+ 0, 0, 0xDFF8, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xD4A1, 0xCEB2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE8CA, 0, 0, 0, 0, 0xEBF5, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE3D5, 0xF5D0, 0, /* 0x00 */
+ 0, 0, 0xF5A1, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD9A7, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE5AB, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE6CB, 0, 0xF5F1, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xE5C5, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF9A3, 0xE0DB, 0xF6EB, 0, 0xCBF1, /* 0x50 */
+ 0, 0xD9EA, 0xF5A2, 0, 0, 0, 0xD7D1, 0, /* 0x50 */
+ 0xD1F8, 0xEAF8, 0xEAF9, 0xDAB3, 0, 0, 0, 0, /* 0x60 */
+ 0xEFDF, 0, 0, 0xF1EF, 0, 0xE5F6, 0xEEBF, 0xE2E4, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xD0BF, 0, 0xFAAC, /* 0x70 */
+ 0xF5D1, 0xE7B3, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xE9BE, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF2CE, 0xDBB4, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xFCCE, 0, 0xDDEE, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xE7B4, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xD7B4, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF7B4, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xCDBE, 0, 0xDAE9, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xCFB0, 0xF7D9, 0xF3E6, 0, 0, /* 0xC0 */
+ 0xCED9, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xCEAA, 0, 0xCBC8, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xD0A7, 0, 0xF0CB, 0, 0xD0C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4C5, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xDBE0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xD5DA, 0, 0xD7A7, 0, 0, 0, 0xEEC0, /* 0x10 */
+ 0, 0xF8F6, 0, 0, 0, 0, 0xF5D2, 0xEDE9, /* 0x10 */
+ 0, 0xD9BC, 0, 0xE5C6, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF5A3, 0, 0, /* 0x30 */
+ 0xDAD4, 0xE2A7, 0xFBFC, 0, 0, 0xF1DC, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xCAF4, 0, 0, 0, /* 0x40 */
+ 0xE8FA, 0, 0, 0xCEE9, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xE9F8, 0xE2E5, 0, 0, 0, 0, /* 0x50 */
+ 0xD0B9, 0xD4F2, 0, 0, 0, 0, 0, 0xD1A6, /* 0x50 */
+ 0, 0xDFCE, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xFCF4, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xD3AA, 0, 0, 0, 0xCCAC, 0, 0, 0, /* 0x80 */
+ 0, 0xEFE0, 0, 0, 0, 0xE5E5, 0xD0D5, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDBFC, /* 0x90 */
+ 0, 0, 0, 0, 0xFCE6, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xCBFE, 0xEDEA, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xDEB1, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF9E3, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xD4A2, 0xCFF6, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xD6D0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xD5EA, 0xF1EE, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xFACB, 0, /* 0xF0 */
+ 0, 0, 0, 0xE5A1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD5B1, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xCFED, 0, 0xEDEB, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xD5B2, 0, 0, 0, 0xD5BC, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xFDE2, 0xF3AD, 0, 0xFDDB, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE9B0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xD1A7, 0, 0, 0xFDE3, 0xCEB3, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xFDE4, 0xFACE, /* 0x40 */
+ 0, 0, 0, 0, 0xCAB0, 0, 0xF7A7, 0, /* 0x40 */
+ 0xCFB1, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6A2, /* 0x50 */
+ 0, 0xFCB6, 0xF2AD, 0xEFE1, 0xF3AE, 0xDCC6, 0xD9EB, 0, /* 0x60 */
+ 0, 0, 0xE8E0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE1A8, 0, 0, 0, 0, 0xD5F6, /* 0x70 */
+ 0xCFFD, 0, 0, 0xDEDD, 0, 0, 0, 0xD9D1, /* 0x70 */
+ 0, 0, 0, 0xE4EA, 0xF2CF, 0, 0xF7BF, 0, /* 0x80 */
+ 0, 0xE2E6, 0xE2A8, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xE3D6, 0, /* 0x90 */
+ 0xEDD1, 0, 0, 0, 0, 0, 0xE9F9, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xD6B1, 0xDEB2, /* 0xA0 */
+ 0, 0, 0xE0E8, 0, 0, 0xD3AB, 0, 0xEBDC, /* 0xB0 */
+ 0, 0, 0xDFAF, 0, 0xCAC3, 0, 0, 0xEEFC, /* 0xB0 */
+ 0, 0xFDC3, 0, 0, 0, 0xEBF6, 0xCFB2, 0, /* 0xC0 */
+ 0, 0, 0, 0xD9EC, 0, 0xD9BD, 0, 0xD8DF, /* 0xC0 */
+ 0, 0, 0xD4B8, 0xEBBE, 0xDDEF, 0, 0xDDF0, 0xDDF1, /* 0xD0 */
+ 0xDDF2, 0, 0, 0xD9BE, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xFBC6, 0xCFB3 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEEFD, 0, 0, 0, 0, 0, 0, 0xE4AB, /* 0x00 */
+ 0, 0xDAC5, 0, 0xD8EC, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xD1A8, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE2A9, 0, 0, 0xDEBC, /* 0x30 */
+ 0xE7B5, 0, 0, 0, 0, 0, 0xDBF0, 0, /* 0x30 */
+ 0xEFE2, 0xF1F0, 0xCFB4, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xDBF1, 0, /* 0x40 */
+ 0xE0B1, 0, 0, 0, 0, 0xDFA5, 0, 0xF9D2, /* 0x50 */
+ 0, 0, 0xE7FD, 0, 0, 0xE6A3, 0xFBF1, 0xCBB0, /* 0x50 */
+ 0xF2AE, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xCDE7, 0, 0xE8DC, 0, 0, 0xE7D7, 0, 0, /* 0x60 */
+ 0xF7C0, 0, 0xD0E3, 0, 0, 0, 0xDAA1, 0, /* 0x70 */
+ 0, 0, 0xCCBD, 0, 0, 0xD1A9, 0xDDCC, 0, /* 0x70 */
+ 0, 0xE3FE, 0xD1AA, 0xE8AA, 0, 0xEAB6, 0xF9FA, 0xE6CC, /* 0x80 */
+ 0xF6D8, 0, 0, 0, 0xD4C7, 0, 0, 0, /* 0x80 */
+ 0xD9CB, 0, 0xD9D2, 0xD3CB, 0xD8F7, 0xDAA9, 0xF5F8, 0, /* 0x90 */
+ 0, 0xDEDE, 0xF2AF, 0xF8A9, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xD8C8, 0, 0, 0xEEC1, 0, /* 0xA0 */
+ 0, 0, 0, 0xF9C1, 0, 0, 0, 0, /* 0xB0 */
+ 0xDDF3, 0xEAFA, 0, 0xF6BD, 0xE1BB, 0xCDBF, 0xF4D4, 0xE6CD, /* 0xB0 */
+ 0, 0xFCCF, 0xFBA2, 0, 0xE0DC, 0, 0, 0, /* 0xC0 */
+ 0, 0xF4BB, 0xDAD5, 0, 0xF9B2, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xFBF2, 0, 0xDBF6, 0, 0xDEDF, /* 0xD0 */
+ 0, 0, 0, 0xDBF2, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xF8DC, 0xF7EE, 0xEBE8, 0, 0xD2FA, 0, 0, /* 0xE0 */
+ 0xF1BC, 0, 0, 0xFADA, 0, 0, 0xDAEA, 0xDAC6, /* 0xE0 */
+ 0xF7C1, 0, 0, 0xE7B6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5C7, 0xD6AC, 0, 0, 0, /* 0x00 */
+ 0, 0xDCC7, 0, 0, 0, 0, 0, 0xE1A9, /* 0x10 */
+ 0, 0xE2AA, 0, 0xD5A6, 0, 0, 0xD4D7, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF2D0, 0, 0xEAFB, /* 0x20 */
+ 0, 0xE0DD, 0xFBF3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF1BD, 0, 0, 0xE2E7, 0xFDD7, 0, /* 0x30 */
+ 0xCEC8, 0xEAB7, 0, 0xFCC0, 0, 0xFDE7, 0xF7EF, 0, /* 0x30 */
+ 0, 0xD7B5, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xEFBA, 0xF1DD, 0, 0xDEB3, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE8CB, 0, 0, 0xF8DD, 0, /* 0x60 */
+ 0, 0xFBC7, 0xD5C8, 0, 0xD7DF, 0, 0xDDA9, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE9B1, 0, 0, 0xFAAD, /* 0x70 */
+ 0xF6D9, 0xFAF4, 0, 0, 0, 0, 0, 0xF8AA, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE6EE, 0, 0xCCDC, /* 0x80 */
+ 0xE1BC, 0xE0EF, 0, 0, 0xE9BF, 0xFCFD, 0xE6CE, 0, /* 0x80 */
+ 0, 0xE1D7, 0, 0xE6CF, 0, 0xF4F1, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE4F3, /* 0xA0 */
+ 0, 0, 0xE4FB, 0, 0, 0xF9E4, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xEFE3, 0, 0, 0xCFEE, 0xF6BE, 0xE0B2, 0xFCFE, 0xD1AB, /* 0xC0 */
+ 0, 0, 0, 0xD7FA, 0, 0, 0, 0xFBC8, /* 0xC0 */
+ 0, 0xE2D7, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xD4A3, 0xF0F8, 0xD7A8, 0, 0, 0, 0xE1E7, 0, /* 0xD0 */
+ 0, 0xD3BF, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xEFE4, 0, 0xD7C5, 0xEBE2, 0, 0, 0xFCE7, 0, /* 0xE0 */
+ 0, 0xE4A2, 0, 0xE2E8, 0, 0xE6D0, 0, 0xFBE8, /* 0xF0 */
+ 0xF4E8, 0xE5F4, 0xF4BC, 0xF4D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDFB6, /* 0x10 */
+ 0, 0xFCB9, 0xEEC2, 0xCAF5, 0, 0, 0, 0xEFE5, /* 0x10 */
+ 0xCBE2, 0xD4A4, 0, 0xDEE0, 0xDAFD, 0xE4C6, 0xE8BE, 0, /* 0x20 */
+ 0, 0, 0, 0xE0DE, 0xF6B4, 0xEAD2, 0, 0xF9FB, /* 0x20 */
+ 0, 0, 0xE0C2, 0, 0xCAE4, 0, 0xE7B7, 0, /* 0x30 */
+ 0xEAFD, 0, 0xD9DD, 0, 0xDAB4, 0xEEAA, 0xFBE9, 0, /* 0x30 */
+ 0, 0, 0, 0xDBCB, 0xDAB5, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF1BE, 0, 0, 0xD3AC, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xFBC9, 0, /* 0x50 */
+ 0xDFCF, 0, 0, 0xD3C0, 0xE3D7, 0, 0xEFE6, 0xFCD0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE9C0, /* 0x60 */
+ 0, 0, 0, 0xF5D3, 0, 0, 0xECDC, 0xF7B7, /* 0x60 */
+ 0, 0, 0xEAB8, 0xD1F9, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xDCC8, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xEAB9, 0, 0, 0, 0, 0, 0xF1DE, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xD7B6, 0xCFB5, 0, 0xD9A8, /* 0x90 */
+ 0, 0, 0xECEE, 0, 0, 0xDDAA, 0, 0, /* 0xA0 */
+ 0, 0, 0xCDA2, 0xE8AE, 0, 0, 0, 0xE1BD, /* 0xA0 */
+ 0, 0xF2D1, 0, 0, 0, 0, 0xE9C1, 0, /* 0xB0 */
+ 0, 0, 0xD2FC, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xDBB5, 0, 0xF3E7, 0xD8FE, 0, 0, /* 0xC0 */
+ 0, 0xFCD1, 0, 0xEDB2, 0xF4AF, 0, 0xFBA3, 0, /* 0xC0 */
+ 0, 0xFCC1, 0, 0xEEAB, 0xD4A5, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF4F2, /* 0xE0 */
+ 0, 0, 0, 0, 0xEED9, 0, 0, 0, /* 0xF0 */
+ 0xFBCA, 0, 0, 0, 0, 0, 0xCDE3, 0xD8BB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5DB, 0xF8F7, 0, 0, 0, 0xF6D4, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD7A9, /* 0x00 */
+ 0, 0xCBC9, 0, 0, 0xE6D1, 0xF0CC, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xD8AE, 0, 0xF9D3, 0xD5FE, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xD8BC, 0xF2B0, 0, 0, 0, /* 0x20 */
+ 0, 0xE2AB, 0xF3E8, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xEFC2, 0, 0, 0, 0, 0, 0, 0xEDEC, /* 0x30 */
+ 0, 0xE7B8, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xDAFE, 0, 0, 0xCCBE, 0, 0, 0xF2FC, /* 0x50 */
+ 0xDAEB, 0, 0xE2D8, 0xEDD6, 0, 0, 0xD6D1, 0xE0B3, /* 0x50 */
+ 0, 0, 0xFCD2, 0, 0xEBC8, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xD3C1, 0xF0CD, 0, /* 0x60 */
+ 0xCFF7, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xEDD2, 0, 0xD4D8, 0xDCC9, 0xD7F1, 0, /* 0x70 */
+ 0, 0xDFBB, 0, 0, 0xF3A5, 0, 0, 0, /* 0x80 */
+ 0xF4CD, 0, 0, 0, 0, 0xF1BF, 0xF8B1, 0, /* 0x80 */
+ 0xE9FA, 0, 0, 0, 0xFBCB, 0, 0, 0xCAD5, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF9D4, 0xF7CA, 0, 0, 0xD6C8, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xFCE8, 0xF3BD, /* 0xA0 */
+ 0, 0xEEFE, 0, 0xE7FE, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xD3C2, 0, 0, 0, 0, 0xD3B6, 0, /* 0xB0 */
+ 0xCCAD, 0xF6FA, 0xD6B2, 0xD2D8, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE7D8, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xE3A5, 0, 0, /* 0xD0 */
+ 0, 0, 0xE7B9, 0, 0, 0, 0, 0xF0AD, /* 0xD0 */
+ 0xFBCC, 0xEBA1, 0, 0, 0xD4A6, 0, 0, 0, /* 0xE0 */
+ 0, 0xFBCD, 0, 0xD5BD, 0xF1DF, 0, 0, 0xF6FB, /* 0xE0 */
+ 0, 0xDEB4, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0xD5EB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5C8, 0, 0, 0, 0xFBA4, 0xD4B9, 0, /* 0x00 */
+ 0, 0xDEE1, 0, 0xE4A3, 0, 0, 0, 0xD7B7, /* 0x00 */
+ 0, 0xF8EE, 0, 0, 0, 0xDEB5, 0, 0, /* 0x10 */
+ 0xD6D2, 0, 0xF9D5, 0xE7BA, 0xEBD5, 0xD5F7, 0xEFE7, 0xE1BE, /* 0x10 */
+ 0, 0, 0, 0xFAAE, 0, 0, 0, 0xD6E9, /* 0x20 */
+ 0xD6EE, 0, 0, 0, 0, 0, 0, 0xE7BB, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xECCB, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xD5B3, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xCEB4, 0, 0, 0, /* 0x40 */
+ 0xFBA5, 0xE1EE, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF7A8, 0, 0, 0, 0, 0xFBCE, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xD8BD, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xFBFD, 0, 0, 0, 0, /* 0x60 */
+ 0xFCE9, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xCFB6, 0, 0, 0, 0xEDC7, 0xEEAC, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xCCDD, 0, 0, /* 0x80 */
+ 0, 0, 0xF6A7, 0, 0, 0, 0xE6FA, 0, /* 0x80 */
+ 0, 0, 0xF5A4, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xFDDC, 0xEDB3, 0xCEC9, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xEFE8, 0, 0, 0xE1BF, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xFADB, 0xCBE3, 0xF7A9, 0, 0xFBA6, /* 0xA0 */
+ 0, 0, 0, 0xDCB9, 0, 0, 0, 0xF1C0, /* 0xB0 */
+ 0xEDC8, 0xEFC3, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xD6AD, 0, 0, 0xFDCE, 0, 0, 0, 0xE8A1, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xFBF4, 0xD5A7, 0, 0, 0, 0xF1F6, 0, 0xE6D3, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xCCDE, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xF8B2, 0, 0, 0, 0xDCEB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFDB6, 0, 0, 0, /* 0x00 */
+ 0, 0xE5EA, 0, 0, 0xF1E0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xDBCC, 0xDDCD, 0, 0, 0, 0xD4C8, 0, /* 0x10 */
+ 0, 0xD9ED, 0, 0, 0, 0, 0xF5A5, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE6FB, 0, 0, 0, 0, 0, 0xE6D4, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFDC8, /* 0x40 */
+ 0, 0xD6A1, 0xFDBF, 0, 0xFCD3, 0, 0xEFA1, 0, /* 0x40 */
+ 0xE7BC, 0, 0, 0, 0, 0, 0xD1EE, 0, /* 0x50 */
+ 0, 0xE6D5, 0, 0, 0xE9F2, 0, 0xDFB0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xD8E0, 0xFCBA, 0xFDAF, 0xF0CE, /* 0x60 */
+ 0, 0xDBE1, 0, 0, 0xE5C9, 0, 0xEDB4, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE0C3, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xE3D8, 0, 0, 0, /* 0x80 */
+ 0, 0xE9FB, 0xEAA8, 0, 0, 0, 0, 0xFDB7, /* 0x80 */
+ 0, 0, 0xFBA7, 0, 0xE9C2, 0, 0, 0, /* 0x90 */
+ 0, 0xFDF7, 0, 0, 0, 0, 0, 0xE2D9, /* 0x90 */
+ 0, 0, 0xDCEC, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE8A2, 0, 0, 0, /* 0xA0 */
+ 0, 0xE6F0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xFDF8, 0xFDF9, 0, 0, 0, 0xF6BF, 0, /* 0xB0 */
+ 0, 0xE7A7, 0, 0xE6D7, 0, 0, 0, 0, /* 0xC0 */
+ 0xD4F3, 0xD4C9, 0, 0, 0, 0, 0xD6FA, 0, /* 0xC0 */
+ 0xD7F2, 0, 0xE1C0, 0, 0xDBE2, 0xE6D8, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7BD, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xF0CF, 0xF3BE, 0xE2AC, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF5B7, 0xE0F0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xFDB8, 0xE3E8, 0, 0xD4A7, 0xE8FC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFAD2, 0, 0, 0, 0, 0, 0xF8EF, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xD6D3, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xD5B4, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF0D0, 0, 0xF7F0, 0xEEB3, 0, 0, /* 0x20 */
+ 0xEABA, 0, 0xEAD3, 0, 0, 0xEDC9, 0xDDAB, 0, /* 0x30 */
+ 0, 0, 0xE5AC, 0xFDA1, 0, 0xDFD0, 0xECB3, 0, /* 0x30 */
+ 0xDFD1, 0, 0, 0, 0, 0, 0xEDED, 0xF8B8, /* 0x40 */
+ 0xF7FA, 0, 0, 0, 0xF8AB, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF4E0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xD4BA, 0xE4B3, 0, 0xE9DA, 0, 0xDEB6, 0, 0xD9BF, /* 0x50 */
+ 0, 0xD9C0, 0xD6EF, 0, 0, 0, 0, 0xD9CC, /* 0x60 */
+ 0, 0xDAAA, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xDFE5, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF7E5, 0, 0, 0, 0xCCB2, 0, 0, /* 0x70 */
+ 0xDFF9, 0xD7E0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xD4BB, 0, 0, 0, 0, 0xFDFA, /* 0xA0 */
+ 0, 0, 0, 0, 0xCCB3, 0, 0, 0xDBF3, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xDFD2, 0, 0xCECA, 0, 0xEEDA, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE4E4, 0, /* 0xC0 */
+ 0xFBCF, 0, 0, 0, 0, 0, 0, 0xCFB7, /* 0xD0 */
+ 0, 0xEEC3, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xCEEA, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE2AD, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xD7E1, 0xFAF5, 0, 0, 0xD5C9, 0xF8AC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE7D9, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xF3E9, 0, /* 0x10 */
+ 0, 0, 0, 0xD8ED, 0xE3C4, 0xF0F1, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE8E5, 0, 0, /* 0x20 */
+ 0, 0xE0FA, 0xEEC4, 0xD9DE, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xEBA2, 0xEBA3, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xFCC2, 0xEABB, /* 0x30 */
+ 0, 0, 0, 0, 0xE8AB, 0xDEE2, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEDEF, 0, 0xE8A3, 0, 0, 0, 0, 0xCFF1, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xD4BC, 0, 0xFCEA, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xE7BE, 0, 0xFCF2, 0, 0, 0xD6B4, 0, 0, /* 0x70 */
+ 0xE2AE, 0, 0xD3B7, 0xFACC, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xFADC, 0, 0xEDB5, 0xE1E3, /* 0x80 */
+ 0, 0xE8AC, 0, 0xE8DD, 0, 0, 0xEFE9, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xF4BD, 0, 0xCFB8, 0xE9DB, /* 0x90 */
+ 0xD1AC, 0, 0, 0, 0, 0, 0, 0xDAC7, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEBC9, /* 0xA0 */
+ 0, 0xE8CC, 0, 0, 0, 0xDEB7, 0, 0, /* 0xA0 */
+ 0, 0, 0xD6BC, 0xD3E5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xFADD, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xDAD6, 0, 0xCAB1, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xDAC8, 0xDFA6, 0, 0xF9B3, 0xF2D2, 0, 0xCAC4, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xCECB, 0, /* 0xD0 */
+ 0, 0xCDF5, 0, 0, 0, 0xFDB0, 0xD5A8, 0, /* 0xD0 */
+ 0xF1C1, 0, 0, 0xE2E9, 0xDCCA, 0xECB4, 0xFAC0, 0, /* 0xE0 */
+ 0, 0xFBA8, 0xD0A8, 0, 0, 0xDAEC, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD9EE, /* 0xF0 */
+ 0, 0xE0FB, 0, 0, 0, 0xEFEA, 0xFADE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE0C4, 0, 0xCFB9, 0, 0xD5CA, 0xD7E2, 0xE2AF, /* 0x00 */
+ 0, 0xD7B8, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xE8CD, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xF6DA, 0, 0, 0, 0, /* 0x10 */
+ 0xEFA2, 0xE2DA, 0xF6FC, 0, 0, 0xFBD0, 0xD1AD, 0, /* 0x20 */
+ 0xCDE4, 0, 0xD1AE, 0xDCED, 0xE8CE, 0, 0xF0F9, 0xCEB5, /* 0x20 */
+ 0xE6FC, 0, 0, 0xD7FB, 0xD0D6, 0xDDF5, 0xF7F1, 0, /* 0x30 */
+ 0xF6FD, 0, 0xDBF7, 0, 0, 0, 0, 0xFBEA, /* 0x30 */
+ 0xE9DC, 0xD9C1, 0, 0xF5F2, 0xE0C5, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xEAD4, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF9C2, 0, 0xEABC, /* 0x50 */
+ 0, 0xD2C5, 0xFBD1, 0xE7C0, 0xEBA5, 0, 0xDFFA, 0xE3A2, /* 0x50 */
+ 0xD7B9, 0, 0xE9C3, 0, 0xE8FD, 0xE8AF, 0, 0, /* 0x60 */
+ 0xF2D3, 0xFBA9, 0xD8A5, 0, 0, 0, 0, 0xD5CB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xD0C8, 0, /* 0x70 */
+ 0, 0, 0xD1AF, 0xD7E3, 0, 0, 0, 0xE0C6, /* 0x80 */
+ 0, 0xD6A2, 0, 0xEDF0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xD7F3, 0, 0, 0, 0xFCD4, 0, 0xDAD7, 0xCCDF, /* 0x90 */
+ 0, 0xF2D4, 0, 0xD1B0, 0, 0xCCE0, 0, 0xDBFD, /* 0xA0 */
+ 0xF3BF, 0, 0xF0D1, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xFCBB, 0, 0xE2B0, 0, 0, 0xE6A5, 0, 0, /* 0xB0 */
+ 0, 0xE2DB, 0, 0, 0, 0xDFDE, 0, 0xE0C7, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xF2EF, 0, /* 0xC0 */
+ 0, 0, 0xCCE1, 0, 0, 0, 0, 0xD6EA, /* 0xC0 */
+ 0, 0, 0, 0, 0xE7C2, 0, 0, 0, /* 0xD0 */
+ 0xCEB6, 0, 0xF3C0, 0, 0xCDFE, 0, 0, 0, /* 0xD0 */
+ 0xFBD2, 0, 0xF8F8, 0xF7FB, 0, 0, 0xE8BF, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xE8B7, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEDB6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCBA, 0, 0, 0xCCB4, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xF1F7, 0, 0, 0, 0xE8B8, 0, 0, /* 0x10 */
+ 0xCAF6, 0, 0xE4A4, 0xF4D6, 0, 0, 0, 0xDFE6, /* 0x10 */
+ 0, 0, 0, 0xDFA7, 0, 0xDFE7, 0xE1C1, 0, /* 0x20 */
+ 0xE9C4, 0, 0, 0xDCCB, 0xE9C5, 0, 0, 0, /* 0x20 */
+ 0xEFA3, 0xEBA6, 0xCBA3, 0xE3E9, 0, 0, 0, 0xD1FB, /* 0x30 */
+ 0xEFA4, 0, 0xEFEB, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD0B4, /* 0x40 */
+ 0, 0, 0, 0, 0xCDA3, 0, 0, 0xE8E6, /* 0x40 */
+ 0, 0xEFA5, 0, 0xD3CC, 0xDAED, 0, 0, 0, /* 0x50 */
+ 0, 0xD7BA, 0, 0xF2D5, 0xF5E5, 0xD9EF, 0, 0, /* 0x50 */
+ 0, 0, 0xF9B4, 0, 0, 0xD5D4, 0xFDCF, 0, /* 0x60 */
+ 0, 0, 0xDBE3, 0, 0, 0, 0, 0xF1E1, /* 0x60 */
+ 0xECB6, 0, 0, 0, 0, 0xFBFE, 0xD3D7, 0, /* 0x70 */
+ 0xD1B1, 0, 0xCBB1, 0, 0, 0, 0, 0xD1B2, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xCBB2, 0xF1C2, /* 0x80 */
+ 0, 0, 0xF4E1, 0xF9B5, 0, 0, 0xE1C3, 0xE1C2, /* 0x80 */
+ 0, 0xEBF7, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xDFA8, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xCBCA, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE6B9, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xF8DE, 0xF9AA, 0xCAF7, 0, 0xEDB7, 0, 0, /* 0xB0 */
+ 0xD3B8, 0xF2D6, 0, 0, 0xD4D9, 0xEEC5, 0xF2F0, 0, /* 0xB0 */
+ 0, 0, 0xCAB2, 0, 0, 0xDCBB, 0, 0xF1F8, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xECB7, 0, 0, /* 0xC0 */
+ 0, 0, 0xE5CA, 0, 0xF6C0, 0xFDDD, 0, 0, /* 0xD0 */
+ 0xD4E3, 0xCCE2, 0, 0xF7D4, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xD7E5, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xD3C3, 0, 0xD8A6, 0, 0xF6C1, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xDDF6, 0, 0xCDC0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5DC, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE5CB, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE1C4, 0, 0, 0, 0, 0, 0xE8B0, /* 0x10 */
+ 0xF4B0, 0xF3EA, 0xDAEE, 0, 0xD7BB, 0, 0xE2B1, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xD7AA, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xD6FB, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE4DF, 0, 0xCAD6, 0, /* 0x40 */
+ 0, 0, 0xEBA8, 0, 0, 0, 0xDBFE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF6C2, 0, 0, 0xEFBB, 0, 0, 0, /* 0x60 */
+ 0, 0xD4FD, 0, 0, 0xE0C8, 0, 0, 0, /* 0x60 */
+ 0xE8B9, 0, 0xEFA6, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xCDA4, 0, 0, 0xD4F4, 0xDBA1, 0xDBDC, 0xDBDD, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xEEDC, 0, 0xCBCB, 0xFCD5, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xCEEB, 0, /* 0x80 */
+ 0xCDC1, 0, 0, 0xFBD3, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xF9AB, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xF5D4, 0, 0, 0, 0, 0xD9A9, /* 0xB0 */
+ 0, 0, 0xE9DD, 0xDBCD, 0, 0, 0xDDCE, 0, /* 0xC0 */
+ 0xE7C3, 0, 0xECCC, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xF9EC, 0, 0, 0, 0xCBCC, 0, /* 0xD0 */
+ 0, 0, 0, 0xE0FC, 0xD4A8, 0, 0xEDD3, 0xD8EF, /* 0xD0 */
+ 0, 0xF2D7, 0, 0xCAF8, 0xDAEF, 0, 0, 0xD6D4, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xD9CD, 0, /* 0xE0 */
+ 0, 0, 0xD8EE, 0, 0xF2C1, 0, 0, 0, /* 0xF0 */
+ 0xDFD3, 0, 0, 0, 0xDAF0, 0, 0xE2EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE0FD, 0, 0, 0xD8F8, 0, 0, 0, /* 0x00 */
+ 0xF7AF, 0xDAB6, 0, 0xCAD7, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xF2D8, 0, /* 0x10 */
+ 0xD8F9, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xFADF, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCFEF, /* 0x30 */
+ 0xD9C2, 0, 0xF0D2, 0, 0xE4D1, 0, 0, 0, /* 0x30 */
+ 0xF3B7, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xFAE0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xEFEC, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xE2B2, 0, 0xD4BD, 0, 0, 0xD9CE, 0, /* 0x60 */
+ 0, 0, 0, 0xF4E2, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD4A9, 0, 0, 0, 0, 0xCDC2, 0xE7DA, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF2D9, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xD9AA, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xD8BE, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xDCAD, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE2EB, 0xD6FC, 0, 0, /* 0xA0 */
+ 0xCAF9, 0, 0, 0xD4DA, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF4D7, 0xCCA1, 0, 0, 0xCFBA, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF5B8, /* 0xD0 */
+ 0, 0, 0, 0xD9C3, 0xD0E8, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE3C5, 0xEBF8, 0, 0xF2B1, 0, 0, /* 0xE0 */
+ 0, 0xCFBB, 0, 0, 0, 0xD3AD, 0xE8E1, 0xCEEC, /* 0xE0 */
+ 0, 0, 0, 0xE0B4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDEE3, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xDDF7, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF2B2, 0xF3F6, 0xF6DB, /* 0x20 */
+ 0, 0, 0, 0, 0xD7FE, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF8DF, 0, 0xF7F2, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xD0A9, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6DA, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xF5A6, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xD7BC, 0xCCE3, 0, 0, 0xE6DB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xDDDD, 0, 0, 0, /* 0x70 */
+ 0, 0xD1B3, 0, 0, 0, 0, 0, 0xEFED, /* 0x80 */
+ 0, 0, 0, 0, 0xD6DE, 0xE4F4, 0xE1EF, 0, /* 0x80 */
+ 0, 0xDDF8, 0, 0, 0, 0, 0, 0xE8CF, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xCAE5, 0, 0, 0, 0xDCA1, /* 0xA0 */
+ 0, 0xE0B5, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xFCAC, 0xFCAD, 0xD8A7, 0, 0, 0, /* 0xB0 */
+ 0, 0xEDB8, 0, 0, 0, 0xDBB6, 0, 0, /* 0xC0 */
+ 0, 0, 0xD6F0, 0xF3AF, 0, 0, 0xCDA5, 0, /* 0xC0 */
+ 0xDAF1, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xD8A8, 0, 0, 0, 0xCCE4, 0, 0, 0xD1B4, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xCAD8, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xDAF2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5A7, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xF5A8, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE6A6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xD5EC, 0xD5F8, 0xDAF3, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xE3C6, 0, 0, 0, 0xDEE4, 0, /* 0x30 */
+ 0xDEE5, 0xD1B5, 0, 0, 0, 0, 0, 0xD1B6, /* 0x40 */
+ 0xD1B7, 0xF2B3, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xE9DE, 0, 0, 0, 0, 0, 0xF0D3, 0xF2B4, /* 0x50 */
+ 0, 0, 0xF0D4, 0xCBE4, 0xFBD4, 0xF5E6, 0xE3EA, 0, /* 0x50 */
+ 0xDEE6, 0, 0, 0, 0, 0xDFD4, 0, 0, /* 0x60 */
+ 0xF8F9, 0, 0, 0, 0, 0xF0AE, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xD1B8, 0, 0, 0, 0, 0xD6DF, /* 0x70 */
+ 0, 0xD0D7, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xFCA1, 0xEFEE, 0xDCD8, /* 0x80 */
+ 0, 0xE9DF, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xE5DD, 0xFDFB, /* 0xA0 */
+ 0, 0, 0xE0C9, 0, 0, 0, 0xD6C9, 0, /* 0xA0 */
+ 0, 0xD4AA, 0, 0xE5CC, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE9E0, 0, 0, 0, 0xD0D8, 0xFCA2, 0xD4BE, /* 0xB0 */
+ 0xE2B3, 0xDEE7, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xDCBC, 0xD2B6, 0xF5D5, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xCEA1, 0xF5A9, 0, 0, 0xDDF9, 0, 0, /* 0xD0 */
+ 0xDDFA, 0, 0, 0, 0, 0, 0, 0xF0D5, /* 0xD0 */
+ 0, 0, 0, 0, 0xF6DF, 0, 0xF2DA, 0xE4EB, /* 0xE0 */
+ 0, 0xF2F1, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xECB9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFDFC, 0, 0, 0, 0, 0xE1AA, 0, 0, /* 0x00 */
+ 0xCAD9, 0, 0, 0xEFEF, 0, 0xF5AA, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xECF9, 0, 0, 0xF8AD, /* 0x10 */
+ 0, 0xF2C2, 0xF6C3, 0, 0xD7D2, 0, 0, 0xF9A2, /* 0x10 */
+ 0xF0D6, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xF0FA, 0, /* 0x20 */
+ 0, 0xF6E0, 0, 0, 0, 0, 0xE9F3, 0xF2C3, /* 0x30 */
+ 0, 0, 0, 0xD4AB, 0xCAB3, 0xCDA6, 0, 0xCDC3, /* 0x30 */
+ 0xCDDA, 0, 0, 0, 0, 0, 0xD9CF, 0, /* 0x40 */
+ 0, 0xF6C4, 0, 0, 0, 0xEEDD, 0xE7C4, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2B4, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xDFE2, 0xE7DB, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE8B1, 0, 0xFCAE, 0, 0, 0, 0, /* 0x60 */
+ 0xE5CD, 0, 0, 0, 0xFAEB, 0, 0xCFBC, 0, /* 0x70 */
+ 0, 0xCFE2, 0xCDF6, 0, 0, 0xEFF0, 0, 0xF4BE, /* 0x70 */
+ 0, 0xD4CD, 0, 0, 0xF3B8, 0, 0, 0, /* 0x80 */
+ 0xE9A1, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xF2F2, 0xF3EB, 0, 0xF0D7, 0, 0, /* 0x90 */
+ 0xCFD7, 0, 0, 0, 0, 0, 0, 0xCFDF, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE8C0, 0xE8C1, 0, 0, 0, 0xCFE3, 0xE9A2, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xD0AA, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF3C1, 0xD0AB, 0, 0xD4E4, /* 0xC0 */
+ 0, 0, 0xEFBC, 0xD8A1, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD9DF, /* 0xD0 */
+ 0, 0xF3D7, 0, 0, 0, 0xDCBD, 0, 0xCCE5, /* 0xD0 */
+ 0xEDF1, 0, 0, 0xF1E2, 0, 0xD4DB, 0, 0, /* 0xE0 */
+ 0, 0, 0xE2B5, 0, 0, 0xCAE6, 0, 0xD3AE, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xCCE6, 0, /* 0xF0 */
+ 0, 0xF1D3, 0xF5E7, 0, 0, 0, 0, 0xCADA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFBEE, /* 0x00 */
+ 0, 0xE1C5, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xDFE9, 0, 0xEEDE, 0, 0, 0xF7C2, 0, /* 0x10 */
+ 0xD8A2, 0, 0, 0, 0, 0, 0xDDAC, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xF0AF, 0xD6BD, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xE1AB, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xF9B6, 0, /* 0x40 */
+ 0, 0xD4F5, 0, 0xD0C9, 0xEFA7, 0xE2EC, 0, 0xDBEA, /* 0x40 */
+ 0xCECC, 0xF5E8, 0xF7D5, 0, 0xD3CD, 0, 0xF3FE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xD0B5, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE0FE, 0, 0xDFFB, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE6DD, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE8A4, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCBCD, /* 0x80 */
+ 0, 0, 0, 0xEFA8, 0, 0, 0, 0xEEB4, /* 0x80 */
+ 0, 0, 0, 0, 0xDAD8, 0xD1B9, 0, 0xDFA9, /* 0x90 */
+ 0, 0, 0xF3B0, 0, 0, 0xCCC4, 0, 0, /* 0x90 */
+ 0, 0xCEB7, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xEFA9, 0, 0, /* 0xA0 */
+ 0, 0xDFD5, 0, 0, 0xEDD7, 0, 0, 0, /* 0xB0 */
+ 0xEEC6, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xEFBD, 0xFCD6, 0, 0, 0xDBF4, 0, 0xEFAA, 0xF8B9, /* 0xC0 */
+ 0, 0xF5E9, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE3D9, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xE1C6, 0, 0, 0, 0xD4BF, 0, 0, 0, /* 0xE0 */
+ 0, 0xDEE8 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0EA, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF3C2, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xD3AF, 0, /* 0x10 */
+ 0, 0xCADB, 0, 0, 0, 0, 0, 0xFCD7, /* 0x20 */
+ 0, 0, 0xEDD8, 0xE1C7, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF4D8, 0xD6B3, 0xDDAD, /* 0x30 */
+ 0, 0, 0, 0xD5BE, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF1C3, 0xEEDF, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xD6EB, 0, 0, 0, 0xF4D9, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xD7E6, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xDAB7, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0xDDFB, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xDDCF, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD8A3, 0, 0, 0xDAD9, 0, 0xF0D8, /* 0x90 */
+ 0xEFC4, 0, 0, 0, 0, 0, 0, 0xE1D8, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF1D4, 0, 0xEDF2, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xD5DB, 0, /* 0xA0 */
+ 0, 0xD5DC, 0xF3C4, 0xCBD7, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE2B6, 0, 0, 0, 0, 0xEFF1, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xFBD5, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xD3D8, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xDDD0, 0xF0D9, /* 0xD0 */
+ 0xCBB3, 0, 0, 0, 0, 0, 0, 0xD5DD, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xCDA7, 0, 0, 0xD0AC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1BA, 0, 0xF1C4, 0, 0xE5B3, 0xFBF5, 0xE9E1, 0xFDE0, /* 0x00 */
+ 0xFCBC, 0, 0xDAA2, 0xDAA3, 0, 0xD2A1, 0, 0, /* 0x00 */
+ 0xD2EF, 0, 0, 0, 0xE2ED, 0, 0, 0xDEE9, /* 0x10 */
+ 0xCEDC, 0xF2B5, 0xD0E4, 0xDDD1, 0, 0, 0, 0, /* 0x10 */
+ 0xE1C8, 0xDBB7, 0xDFE3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xEDB9, 0xF1C5, 0, 0xF3CF, 0xD7AB, /* 0x20 */
+ 0xE1AC, 0, 0, 0xE3EB, 0, 0xEEC7, 0, 0, /* 0x30 */
+ 0, 0xE1C9, 0xCAFA, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xF0FB, 0xFAE1, 0xF0DA, 0xCCE7, 0xDAF4, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xCCBF, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xCEED, 0, /* 0x50 */
+ 0, 0xD5A9, 0xFAE2, 0, 0, 0, 0xD0E5, 0, /* 0x60 */
+ 0xEBD6, 0, 0xECDF, 0, 0, 0, 0xDFFC, 0, /* 0x60 */
+ 0, 0xF7D6, 0xDEEA, 0xCBB4, 0, 0, 0xEFBE, 0, /* 0x70 */
+ 0, 0xCCB5, 0, 0, 0, 0, 0, 0xCFBD, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xEFF2, 0xE2B7, /* 0x80 */
+ 0, 0, 0, 0xCCE8, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF0FC, 0, 0, 0, /* 0x90 */
+ 0xD6E0, 0, 0xF1C6, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE2B8, 0xEBAB, 0, 0, /* 0xA0 */
+ 0, 0xCBB5, 0xD8D1, 0, 0xF4CE, 0xF3F7, 0, 0, /* 0xB0 */
+ 0xD7C6, 0, 0xD1BB, 0xF7AA, 0, 0xEDCA, 0xD7D3, 0xD8FA, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF6C5, /* 0xC0 */
+ 0, 0, 0xD1CC, 0xDDFC, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xDFFD, 0, /* 0xD0 */
+ 0xF9E5, 0, 0xE0CA, 0, 0, 0xF2FD, 0xD3B0, 0, /* 0xD0 */
+ 0xF4F3, 0xDAC9, 0, 0xE6DE, 0, 0, 0, 0, /* 0xE0 */
+ 0xF8BA, 0xE8D0, 0, 0, 0xD8FB, 0, 0, 0xEAD5, /* 0xE0 */
+ 0, 0, 0, 0, 0xD6A3, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xF6C6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF2DB, 0xE4FC, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE8B2, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xDADA, 0, 0xF2DC, 0xFBD6, 0xE9B2, /* 0x10 */
+ 0, 0xEEAD, 0, 0xFAE3, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xDCEE, 0, 0, 0xF5EA, 0xE6E0, /* 0x20 */
+ 0, 0xF0FD, 0, 0, 0, 0, 0, 0xD7AC, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF5C5, 0xEEE0, 0, /* 0x30 */
+ 0, 0xDBE5, 0, 0xDDDE, 0, 0, 0xD9F0, 0xE9A3, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF1F9, 0, 0xF2C4, 0xE0CB, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xE9A4, 0, /* 0x50 */
+ 0, 0xE2B9, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE3B1, 0xFCEB, 0xCDA8, 0, 0xCCB6, 0, 0, /* 0x60 */
+ 0xF0DB, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xE6BA, 0, 0, 0xCDA9, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xF3C3, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE1D9, 0, 0, 0xEFAB, /* 0x80 */
+ 0, 0, 0, 0xE7C5, 0, 0, 0xE0E9, 0, /* 0x90 */
+ 0xF3C5, 0, 0, 0xD4C0, 0xD5BF /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDDAE, 0, /* 0x30 */
+ 0xF9FC, 0, 0xCCC0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE5A2, 0, 0, 0, /* 0x40 */
+ 0xCEB8, 0, 0, 0, 0xD8D2, 0xF9D6, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xF1AA, 0xCED1, 0, 0, 0xF6C7, 0, /* 0x60 */
+ 0xDBEB, 0, 0xDFFE, 0, 0, 0xD8E1, 0, 0xF7F3, /* 0x70 */
+ 0, 0xD7E7, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xD4FE, 0, 0, /* 0x80 */
+ 0xD1BC, 0, 0xE5CF, 0, 0xCBB6, 0, 0xDAB8, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xCDC4, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xD6BE, 0, 0, 0, 0xE2BA, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xCFD8, 0, 0, 0, /* 0xA0 */
+ 0xE0CC, 0xEBF9, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xFDFD, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xD7E8, 0xCBD8, 0, 0, 0, 0xE9E2, 0, 0, /* 0xB0 */
+ 0, 0xE8BA, 0, 0, 0, 0xE3C7, 0, 0, /* 0xC0 */
+ 0, 0, 0xECCD, 0, 0xECCE, 0, 0xD6BF, 0, /* 0xC0 */
+ 0, 0, 0xE3A7, 0, 0xDFD6, 0xFDE8, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEEE1, /* 0xD0 */
+ 0xF6A8, 0xDDFD, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xF8BB, 0, 0xE8D1, 0, 0, 0, 0, /* 0xE0 */
+ 0xF9D7, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xCEEE, 0, 0, 0xECCF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE9A5, 0xD6D5, 0, 0xCDC5, 0, 0xEDBA, 0xD1BD, 0, /* 0x00 */
+ 0, 0xCFBE, 0, 0, 0xECBB, 0, 0, 0, /* 0x00 */
+ 0xD2B1, 0, 0, 0, 0, 0xCCE9, 0, 0xD9C4, /* 0x10 */
+ 0xE9FC, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xD1BE, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xECBC, 0, 0, 0xE5AD, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF7B0, 0, 0xCCEA, /* 0x30 */
+ 0, 0, 0, 0xD3C4, 0, 0, 0xD6C0, 0, /* 0x40 */
+ 0, 0, 0xD6FD, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xE1A1, 0, /* 0x50 */
+ 0xDEBD, 0, 0xF6A9, 0, 0, 0, 0xDAA4, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD6A4, /* 0x60 */
+ 0xF5C6, 0, 0xE1A2, 0xE9C6, 0, 0, 0, 0xF2C5, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF4E9, 0xD6EC, 0xEBD3, /* 0x70 */
+ 0, 0, 0, 0, 0xECBD, 0xE2DC, 0xDEEB, 0xF0DC, /* 0x80 */
+ 0, 0xEBBF, 0, 0xD7CE, 0xD1BF, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xF5AB, 0, /* 0x90 */
+ 0, 0, 0, 0xF9FD, 0, 0xCADC, 0, 0, /* 0x90 */
+ 0, 0xCDC6, 0xF2B6, 0, 0, 0xDDFE, 0, 0, /* 0xA0 */
+ 0, 0xCCB7, 0xDBB8, 0, 0, 0, 0, 0xD0E9, /* 0xA0 */
+ 0, 0xCEDD, 0xEBC0, 0, 0xFDA2, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xF8CB, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xEAD6, 0xF1B0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xDBCE, 0, 0xF7C3, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xDBCF, 0xCBA4, 0, 0, 0xF8E0, 0, /* 0xD0 */
+ 0, 0xFBD7, 0, 0, 0xEBCA, 0xE0A1, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xCECD, 0, 0, 0xD4DC, 0, 0, 0, /* 0xF0 */
+ 0xFDD8, 0, 0, 0, 0, 0xD2F6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF2B7, 0, 0, 0xFAF6, 0xF6AA, 0xFAF7, /* 0x00 */
+ 0xD8E6, 0, 0xF4B1, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE8D2, 0, 0xCAC5, 0xCCEB, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE2EE, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE2BB, 0, 0xF7AD, 0, 0, 0, 0xF8E1, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF3EC, 0, 0, 0, 0, 0xDEA1, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xE4FD, 0, 0, 0xE3EC, 0, /* 0x40 */
+ 0xDDAF, 0xDDB0, 0, 0, 0xCBB7, 0xE8D3, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xE1A3, 0xD2E0, 0, /* 0x60 */
+ 0, 0, 0, 0xF0FE, 0, 0, 0, 0, /* 0x60 */
+ 0xE9A6, 0xCBF2, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xEDF3, 0xDCD9, 0xE0CD, 0, 0, 0, 0, 0xF7DA, /* 0x70 */
+ 0xDBB9, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xCCAE, 0, 0xDADB, 0, 0, 0, 0, 0xCDC7, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xDDB1, 0, 0xD8AF, 0xE3A3, 0, 0, /* 0x90 */
+ 0xCEEF, 0, 0, 0xF2F3, 0, 0, 0, 0, /* 0xA0 */
+ 0xF8B3, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE0CE, 0, 0xF5FD, 0, 0, /* 0xB0 */
+ 0, 0, 0xEBEC, 0, 0, 0xD3C5, 0xFCEC, 0xD2DB, /* 0xB0 */
+ 0xD4EB, 0, 0xDEA2, 0, 0, 0, 0xE5E6, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xF0B0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xD5C4, 0, 0, 0, 0, 0, 0, 0xEDF4, /* 0xD0 */
+ 0, 0, 0, 0xE3ED, 0, 0xE8C2, 0, 0xEDF5, /* 0xE0 */
+ 0xD7FC, 0, 0xEDBB, 0, 0, 0xF6AB, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF2B8, 0xF6C8, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xD3E6, 0xF2DD, 0xCFBF, 0, 0xEBAC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFC0, 0, 0xE6A8, /* 0x00 */
+ 0xFDE9, 0, 0xCFC1, 0, 0xE0DF, 0xDEEC, 0, 0, /* 0x00 */
+ 0, 0, 0xE0A2, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xF4BF, 0xE2EF, 0, 0xD9F1, 0xF1C7, /* 0x10 */
+ 0, 0xCBB8, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF9FE, 0xDBBA, 0xDAF5, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF6EC, 0xDADC, 0xFAE4, /* 0x30 */
+ 0, 0xE0CF, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xDDB2, 0, 0, 0, 0, 0xE6A9, 0, 0xEFF3, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF3ED, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xEBFA, 0, 0xF9E6, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xCADD, 0xD5DE, /* 0x60 */
+ 0, 0xCADE, 0xDFE4, 0, 0, 0, 0xE6FD, 0, /* 0x70 */
+ 0xF5AC, 0, 0, 0, 0, 0, 0xE4F5, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xE9E3, 0, 0xEDCB, 0xCFE4, 0, /* 0x80 */
+ 0, 0, 0xD8D3, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xDDB3, 0xD4EC, 0, 0, 0xF2B9, 0, 0xDFB7, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xCBCE, 0xFBD8, 0, /* 0xA0 */
+ 0, 0xD0D9, 0, 0, 0xDDD2, 0xF7F4, 0xE7DC, 0xE4A5, /* 0xA0 */
+ 0, 0xFCA3, 0, 0xDBBB, 0, 0, 0, 0xF2BA, /* 0xB0 */
+ 0xE9FD, 0xD0CA, 0, 0xF5D6, 0xD9C5, 0xE4B4, 0, 0xEDA7, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xEABD, 0xE6FE, 0, 0xF7C4, 0xF5AD, 0, 0xD9E0, /* 0xD0 */
+ 0, 0, 0, 0xCAB4, 0, 0, 0xF8E2, 0xCFC2, /* 0xD0 */
+ 0, 0xECBE, 0, 0, 0, 0xE5B4, 0xCDC8, 0xEEC8, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE7C8, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xCDC9, 0xF9B7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF1E8, 0xD9F2, 0xDBF5, 0xCAB5, 0xD9C6, 0, 0, /* 0x00 */
+ 0, 0xD8C9, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD9AB, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xEDBC, 0, 0, 0xD8D4, 0, 0, 0, 0xDCDA, /* 0x20 */
+ 0, 0xE2BC, 0, 0, 0xFCED, 0xECE0, 0xD2FE, 0, /* 0x30 */
+ 0xE9C7, 0xE6AA, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE2F0, 0, 0, 0, 0, 0, 0, 0xFABB, /* 0x40 */
+ 0, 0xF5AE, 0xFBAA, 0, 0, 0, 0, 0xECFB, /* 0x40 */
+ 0, 0xECBF, 0xFCD8, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xD4E5, 0, 0, 0, 0xF9C3, /* 0x70 */
+ 0, 0, 0, 0xEEE2, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xD7E9, 0xEDF6, 0, 0, 0, 0xDEED, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xCCEC, 0, /* 0x90 */
+ 0xE3EE, 0, 0, 0, 0, 0, 0xE8D4, 0, /* 0x90 */
+ 0, 0, 0xFAF8, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xDDB4, 0xE4B5, 0xD8B0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xD8D5, 0, 0, /* 0xB0 */
+ 0, 0xF4EA, 0, 0, 0, 0xCEB9, 0, 0, /* 0xC0 */
+ 0, 0xD6E1, 0xCFD2, 0, 0xD0B6, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xCEA2, 0, 0, 0xF3EE, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xF3F8, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xDCCC, 0, 0xD0CB, 0, 0, 0, 0xFCA4, /* 0xE0 */
+ 0xCDCA, 0xD7D4, 0xDEA3, 0, 0xE4E0, 0, 0, 0, /* 0xF0 */
+ 0, 0xEEC9, 0, 0, 0, 0xE2DD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5FE, 0xD4AC, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xD5D1, 0, 0xD8F0, 0xF8C3, 0xEAD7, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xF5D7, 0, 0, 0xD8BF, 0, 0, 0, /* 0x20 */
+ 0, 0xFDC0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xEBAD, 0, 0, 0, 0, 0xD5AA, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xE7A8, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEECA, /* 0x50 */
+ 0, 0, 0, 0xCAE7, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF8E3, 0, 0xD4DD, 0, 0, 0xEAD8, 0, /* 0x60 */
+ 0, 0, 0, 0xFBD9, 0xEDF7, 0, 0, 0xE5B5, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xD0AD, 0, 0, /* 0x70 */
+ 0, 0, 0xF1F1, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE2BD, 0, 0, 0, 0xE3C8, 0, 0, 0, /* 0x90 */
+ 0, 0xD9D5, 0, 0, 0xDFAA, 0, 0, 0, /* 0x90 */
+ 0, 0xDBBC, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xF8E4, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xF1FA, 0, 0, 0xE5B6, 0xF3EF, 0, 0, 0xFBDA, /* 0xB0 */
+ 0xE1E0, 0, 0xD9AC, 0, 0xF5EB, 0, 0xE0B6, 0, /* 0xC0 */
+ 0, 0xE9C8, 0, 0xCBCF, 0, 0xE3C9, 0, 0, /* 0xC0 */
+ 0, 0xDEEE, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE2BE, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xDCEF, 0, 0xD6A5, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE2F1, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xD6FE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD9A1, 0, 0xD8C0, 0xDCDB, 0, 0, 0xEDBD, /* 0x10 */
+ 0xDFB8, 0, 0xEAA5, 0, 0, 0, 0xD7AD, 0, /* 0x10 */
+ 0, 0xF3F9, 0, 0xEDF8, 0, 0xF5C7, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE1CA, 0xEBE3, 0, 0xF2DE, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF8CC, 0, 0xEAD9, /* 0x30 */
+ 0, 0xD3C6, 0, 0xDBE6, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF5AF, 0, 0, 0, 0, 0xCEF0, 0, /* 0x40 */
+ 0, 0, 0, 0xE9FE, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xFBB6, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE2F2, 0, 0, 0, 0, /* 0x60 */
+ 0xCFF2, 0xF7B9, 0xD9F3, 0, 0, 0xE1CB, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xDADD, 0, 0, 0xDAB9, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEBFB, /* 0x80 */
+ 0, 0xCBB9, 0, 0, 0xEDF9, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE0E0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xF4C0, 0, /* 0xA0 */
+ 0xFDBC, 0xDFB1, 0xE3EF, 0, 0, 0, 0, 0xE0A3, /* 0xA0 */
+ 0xFDB9, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xF0B1, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xCDCB, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xEDBE, 0, 0, 0, 0xD5C0, 0xE3F0, 0xEDFA, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xE9E4, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xD5ED, 0xE7DD, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xD4F6, 0xE5B7, 0, 0, /* 0xE0 */
+ 0, 0xDBE7, 0xE2BF, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEECB, /* 0xF0 */
+ 0, 0, 0xD7F4, 0xF0DD, 0, 0, 0, 0xCEAB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE7DE, 0, 0, 0, 0xD6D6, 0xE1CC, /* 0x00 */
+ 0, 0, 0xE8B3, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE5EE, 0xDCA2, /* 0x10 */
+ 0, 0, 0xE0D0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xD5B5, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD5A1, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xFBDB, 0, /* 0x40 */
+ 0xF9CB, 0, 0, 0, 0xCBF3, 0xF4A5, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xFAC8, 0xD6D7, 0, 0xE9E5, 0xFBDC, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFDD0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xFBF6, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xDAA5, 0, 0xDBBD, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xECE2, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xCDF7, 0xF0DE, 0, 0, 0, /* 0xA0 */
+ 0, 0xF6C9, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDEEF, /* 0xC0 */
+ 0, 0, 0, 0xD3B1, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xFCEE, 0, 0, 0, /* 0xD0 */
+ 0, 0xE8C3, 0, 0xF1C8, 0, 0, 0, 0xCEF1, /* 0xD0 */
+ 0, 0, 0, 0, 0xF9ED, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF2F4, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0xE4B6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5B9, 0, 0xDCF0, 0xE3F1, 0, 0, 0, 0, /* 0x00 */
+ 0xE8A5, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF2BB, 0, 0xDEA4, 0, 0xDACC, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xCAE9, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE3DA, 0, 0xFCD9, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEADA, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xF9C4, 0, /* 0x60 */
+ 0xE3A4, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xFBDD, 0, 0xEFCA, 0, /* 0x70 */
+ 0xE8C4, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xD5CC, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xEBD7, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD9AD, /* 0x90 */
+ 0, 0, 0xFBAB, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xD3D9, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xD5A2, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF6DE, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xDAF6, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE0D1, 0, 0, 0xE9A8, /* 0xE0 */
+ 0, 0, 0xF5F9, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xFAAF, 0, 0xEBFC, 0, 0, 0xE0EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE3B2, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD5C5, /* 0x10 */
+ 0, 0, 0xF1E3, 0xD5EE, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xCDCC, 0, 0, 0, 0, 0xEDD9, 0, /* 0x30 */
+ 0, 0, 0, 0xD8C1, 0, 0, 0, 0, /* 0x30 */
+ 0xFAEC, 0, 0, 0, 0, 0, 0xF1EB, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xFABC, 0xE6E2, 0, 0, /* 0x40 */
+ 0, 0, 0xFAE5, 0xE2FA, 0, 0, 0, 0xCAB6, /* 0x50 */
+ 0, 0xE4B7, 0, 0xEADB, 0, 0xF5FA, 0, 0, /* 0x50 */
+ 0, 0xFBAC, 0xCFC3, 0xEBFD, 0, 0, 0, 0, /* 0x60 */
+ 0xF8FA, 0, 0, 0xDFB9, 0, 0, 0, 0, /* 0x60 */
+ 0xE1F1, 0, 0xD2A4, 0, 0, 0, 0, 0xF5FB, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xD0DA, 0xD0DB, /* 0x70 */
+ 0, 0xEABE, 0xD9B1, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xCAB7, 0, 0, 0xD3E7, 0, 0xF8E5, 0, 0, /* 0x80 */
+ 0, 0, 0xD3B2, 0, 0, 0, 0xE2C0, 0xF2DF, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xCDE5, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF9AC, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xCDCD, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xEEAE, 0xD6AE, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD7EA, /* 0xC0 */
+ 0, 0, 0, 0, 0xE7E0, 0xEBAE, 0, 0, /* 0xD0 */
+ 0, 0xCFD9, 0, 0, 0xDCCD, 0xEDFB, 0, 0xDEF0, /* 0xD0 */
+ 0, 0xD7EB, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xDEA5, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xDFD7, 0xDBD0, 0xDBD1, 0, 0, /* 0xF0 */
+ 0xD5A3, 0, 0, 0, 0, 0xF0B2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCDC, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xCAE8, 0, 0xF8E6, 0xDCCE, 0, 0, 0, 0, /* 0x10 */
+ 0xEADC, 0xDBD2, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE9B3, 0, 0, /* 0x20 */
+ 0, 0, 0xF7DB, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xE3A8, 0, /* 0x30 */
+ 0xD7AE, 0, 0, 0xE0E1, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xCBBA, 0, 0, 0xE5D1, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD0DC, /* 0x50 */
+ 0, 0, 0, 0, 0xD5C1, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xD8CA, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE3A9, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE0A4, /* 0x70 */
+ 0, 0xE9A9, 0, 0xD3C7, 0, 0, 0xDCDD, 0xF8AE, /* 0x80 */
+ 0, 0, 0, 0xCCB8, 0, 0, 0, 0xD0AE, /* 0x80 */
+ 0, 0, 0, 0xD8F2, 0, 0, 0xE3CA, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xCCAF, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xD4AD, 0xF6D1, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xD0CC, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xCAC6, 0, 0, 0xD5C2, 0, 0, /* 0xB0 */
+ 0xCEBA, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xCAC7, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xFAB0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xDFD8, 0, 0, 0, /* 0xF0 */
+ 0xF5BA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5EB, 0, 0xEFF4, 0xDDB5, 0, 0, 0, 0, /* 0x00 */
+ 0xCDAA, 0, 0xE3F2, 0, 0xFBF7, 0, 0xF7D0, 0, /* 0x00 */
+ 0, 0, 0, 0xFDBA, 0, 0, 0xFDE1, 0xF6FE, /* 0x10 */
+ 0xD1C0, 0, 0, 0xE8C5, 0, 0xE4B8, 0, 0xE1E8, /* 0x10 */
+ 0, 0, 0, 0xCCC1, 0, 0xD2ED, 0, 0, /* 0x20 */
+ 0, 0, 0xDBBE, 0, 0, 0xE0E2, 0, 0, /* 0x20 */
+ 0, 0xFAC9, 0, 0, 0xE1CD, 0, 0xCAB8, 0, /* 0x30 */
+ 0, 0, 0xF2E0, 0xF1C9, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xDEF1, 0, 0, 0, 0xF0DF, 0xF8C4, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xEECC, 0, 0, 0xDEF2, 0, /* 0x50 */
+ 0xE7C9, 0, 0xE2F3, 0xE7E1, 0, 0, 0xE3CB, 0, /* 0x60 */
+ 0, 0xE3CC, 0, 0, 0, 0xCFF8, 0xEFAC, 0, /* 0x60 */
+ 0xFDFE, 0xFCA5, 0xFAB1, 0xDFD9, 0, 0xE0D2, 0, 0, /* 0x70 */
+ 0, 0xF4DA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF1CA, 0, 0xCEA3, /* 0x80 */
+ 0, 0, 0, 0, 0xF2BC, 0xECE3, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xE0A5, 0, 0xF7AB, 0, 0, /* 0x90 */
+ 0xEBAF, 0, 0, 0, 0, 0, 0xE5DE, 0, /* 0x90 */
+ 0xE1A4, 0xCDAB, 0, 0xD9F4, 0xE8A6, 0xCDCE, 0xE1E9, 0, /* 0xA0 */
+ 0xFCEF, 0, 0xE0E3, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE2C1, 0, 0xCEA4, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xDEA6, 0, 0, 0xEBFE, 0, 0xEBDD, 0xF0E0, /* 0xB0 */
+ 0, 0, 0xF4DB, 0, 0xE2F4, 0, 0, 0xD3C8, /* 0xC0 */
+ 0, 0, 0, 0xF4EB, 0, 0xEEB5, 0, 0xF5D8, /* 0xC0 */
+ 0, 0, 0xD5DF, 0, 0, 0, 0xD6E5, 0, /* 0xD0 */
+ 0, 0, 0, 0xEBB0, 0xF4E3, 0, 0, 0, /* 0xD0 */
+ 0, 0xE3CD, 0, 0, 0, 0, 0xF4F4, 0xFAB2, /* 0xE0 */
+ 0, 0, 0xEFF5, 0xCADF, 0, 0xEBB1, 0xEDBF, 0, /* 0xE0 */
+ 0, 0xFDC9, 0, 0, 0, 0, 0xE4A6, 0xF9A4, /* 0xF0 */
+ 0xF0B3, 0, 0xE5EC, 0, 0, 0, 0xD1E7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD9C7, 0xE4D7, 0xEADD, 0, 0xD4F7, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xDABA, 0, /* 0x00 */
+ 0xDACD, 0, 0, 0, 0xF9CC, 0, 0xE1DA, 0xDBBF, /* 0x10 */
+ 0, 0xCCC5, 0xECD0, 0xCBBB, 0, 0xDEF3, 0, 0, /* 0x10 */
+ 0xE9AA, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xD9C8, 0, 0, 0xEEE3, 0xD7BD, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xCFC4, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xD0CD, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xFCA6, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF1FB, 0, 0, 0, 0, 0xFDD2, 0xD1C1, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE3DB, 0, 0xD3C9, 0, 0xDCCF, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xCCED, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xDEA7, 0, 0, 0xE6BB, /* 0x60 */
+ 0xECA1, 0, 0, 0, 0xCCB9, 0, 0, 0xFBDE, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE7E2, 0, 0, /* 0x70 */
+ 0xD4C1, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xDCA8, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE2C2, 0, 0xF3D8, 0xE5D3, 0, 0, 0xF3D9, 0, /* 0x90 */
+ 0, 0, 0xF3C6 /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDDB, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCDAC, /* 0x30 */
+ 0, 0xFCC3, 0, 0, 0, 0, 0xD4E7, 0, /* 0x40 */
+ 0xD1C2, 0, 0xF9A5, 0, 0xE8D5, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE3CE, 0, 0, /* 0x50 */
+ 0, 0, 0xD4CA, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xDFDA, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xFBDF, 0xE7E3, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF8FB, 0xE3CF, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xF5B0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD8E7, 0, 0xD9C9, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF8AF, 0xEFF6, 0, /* 0x90 */
+ 0xDDB6, 0xEEAF, 0xCDF8, 0, 0, 0, 0, 0xDEB8, /* 0xA0 */
+ 0xFCA7, 0xF7FC, 0xF7B1, 0xCEBB, 0xF4A1, 0, 0, 0xEECD, /* 0xA0 */
+ 0xE1AE, 0, 0, 0xECC3, 0xCFFE, 0, 0xF8BF, 0xD8E2, /* 0xB0 */
+ 0xD3E8, 0, 0, 0xDEA8, 0xF4E4, 0xECC2, 0, 0xD9F5, /* 0xB0 */
+ 0xF9C5, 0xDDD3, 0xD6F1, 0xECFC, 0xFCF0, 0, 0, 0xEDC0, /* 0xC0 */
+ 0xCAB9, 0, 0xEEE4, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF2E1, 0, 0xDEB9, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xD6F2, 0, 0xDEF4, 0, 0xDFDB, 0, /* 0xD0 */
+ 0xDBD3, 0, 0xFAE7, 0xD8E3, 0xF4C1, 0, 0xDDB7, 0, /* 0xE0 */
+ 0, 0, 0xF2F5, 0, 0, 0xD4AE, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xD6F3, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xDDB8, 0xCFC5, 0xDFDF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF2BE, 0xF6A1, 0, 0xEBCB, /* 0x00 */
+ 0xF1FC, 0, 0xF3C7, 0, 0, 0xE0EB, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xEDFC, 0, 0, 0xE1DB, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xEEE5, 0, 0xDEF5, 0, /* 0x60 */
+ 0, 0, 0, 0xFAD3, 0, 0, 0, 0, /* 0x60 */
+ 0xF1CB, 0, 0, 0xD0AF, 0xDDB9, 0, 0, 0xD1C3, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF5B1, 0, 0, /* 0x80 */
+ 0, 0, 0xEAC6, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xF0E1, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF6AC, 0, 0, 0, 0, /* 0xA0 */
+ 0xF5D9, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF0EB, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xDDBA, 0, 0, 0, 0xF2BF, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xF7C5, 0, /* 0xC0 */
+ 0, 0, 0, 0xDBA2, 0xF2F6, 0, 0, 0xCABA, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xF7F5, 0, 0xCBE5, 0, 0, /* 0xD0 */
+ 0, 0xEEE6, 0, 0xE0D3, 0, 0, 0, 0, /* 0xE0 */
+ 0xCEA5, 0, 0, 0, 0, 0, 0, 0xD6D8, /* 0xE0 */
+ 0, 0, 0, 0xD4AF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE9C9, 0, 0, 0, 0, 0xD3CE, /* 0x00 */
+ 0xF4C2, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xCBE6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF1A1, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xEBB2, 0, 0, 0, 0, 0xF1A2, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xEBB3, 0, 0xF0B4, 0, 0, 0xCBF4, /* 0x40 */
+ 0xD4B0, 0xF3B2, 0xFBB7, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF5EC, 0, 0, 0, 0, 0, 0xEEE7, /* 0x50 */
+ 0xF4B2, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xF5ED, 0, 0xCFF3, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF0E2, 0, 0, 0, 0, 0, 0xEECE, /* 0x80 */
+ 0, 0, 0xF1CC, 0, 0, 0xE5B8, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xD7F5, 0xE3F3, 0xCFE5, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xCFC6, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xF3B3, 0xE4D8, 0xCFF9, 0xCFDA, 0, 0, /* 0xC0 */
+ 0, 0, 0xFACD, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6E3, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF2E2, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xF5EE, 0, 0, 0xCABB, 0, 0, 0xE3DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCEF2, 0, 0xD6D9, 0, 0, /* 0x00 */
+ 0, 0xEEB0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF4E5, 0xD8C2, 0xDCD0, 0xCCEE, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xD5E0, 0xF6CA, 0xFDCA, 0xD8D6, 0xF4CF, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xD6A6, 0xDCBE, /* 0x20 */
+ 0, 0xDBD4, 0xD7C7, 0, 0, 0, 0, 0xF2FE, /* 0x20 */
+ 0, 0, 0, 0xF1CD, 0, 0, 0, 0, /* 0x30 */
+ 0xE2C3, 0xDCDE, 0, 0xDCDF, 0, 0, 0xEFAD, 0xE6AB, /* 0x30 */
+ 0, 0, 0, 0, 0xF9DD, 0xEABF, 0, 0, /* 0x40 */
+ 0, 0xEFAE, 0, 0, 0, 0xF4D0, 0xCEF3, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xE6AC, 0, 0xCEDE, /* 0x50 */
+ 0, 0, 0xD5F9, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE3F4, 0xCDD0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xD5B8, 0, 0, 0xF7FD, 0, /* 0xA0 */
+ 0xDCA9, 0, 0, 0, 0, 0xDEF6, 0, 0xDCAA, /* 0xA0 */
+ 0xF2E3, 0xE9B4, 0xD2DC, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE9E6, 0, 0, 0xE3F6, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE7CA, 0, /* 0xC0 */
+ 0, 0xD0CE, 0, 0, 0xDAF7, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xCABC, 0, /* 0xE0 */
+ 0, 0, 0xEEE8, 0xDADE, 0, 0xF2F7, 0, 0, /* 0xE0 */
+ 0xE2FB, 0, 0xCCA6, 0, 0, 0, 0, 0xDABB, /* 0xF0 */
+ 0, 0xEEE9, 0, 0, 0, 0xF5DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF7DC, 0xE1EA, 0xCEC1, 0xD4B1, 0, 0xFDB1, 0xE6BD, 0, /* 0x00 */
+ 0xFBAD, 0, 0, 0xF8E7, 0, 0xE1CE, 0, 0xF7E2, /* 0x00 */
+ 0xF5EF, 0xCFC7, 0, 0, 0xD4B2, 0xCCEF, 0, 0xD4E8, /* 0x10 */
+ 0, 0xEECF, 0xF7D7, 0, 0, 0xE0A6, 0xD6C1, 0xE1DC, /* 0x10 */
+ 0xF0E3, 0xF1E4, 0xDCF1, 0xD6A7, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xF4F5, 0, /* 0x20 */
+ 0, 0xF1CE, 0xF2E4, 0, 0, 0xD0B0, 0, 0, /* 0x30 */
+ 0xECEF, 0, 0, 0, 0xF9BA, 0, 0xEBB5, 0, /* 0x30 */
+ 0, 0xD4ED, 0xE2C4, 0, 0, 0, 0, 0xE9E7, /* 0x40 */
+ 0, 0, 0xEBB4, 0xEAA1, 0, 0xF8BC, 0xCEA6, 0, /* 0x40 */
+ 0xF9C6, 0xFCDA, 0, 0xD4B3, 0xD3B9, 0xEADE, 0, 0, /* 0x50 */
+ 0, 0xE9AB, 0, 0, 0xE1E1, 0xD3CF, 0xF4F6, 0, /* 0x50 */
+ 0xEAC0, 0xE1CF, 0, 0xCCBA, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xEEEA, 0, 0, 0, 0xF0E4, 0xF3B4, 0xD4EE, /* 0x60 */
+ 0, 0, 0xF2C0, 0, 0, 0xF1E5, 0, 0xF4C3, /* 0x70 */
+ 0xE0D4, 0, 0xEBB6, 0, 0xD7A1, 0xCBE8, 0, 0xF9AD, /* 0x70 */
+ 0xE9AD, 0xD8E4, 0xFAB3, 0xE2C5, 0xFCBD, 0, 0, 0xECC4, /* 0x80 */
+ 0xD8B1, 0, 0xDCAB, 0, 0, 0, 0, 0xD5A4, /* 0x80 */
+ 0, 0xEBE9, 0, 0, 0, 0xE8BB, 0, 0, /* 0x90 */
+ 0, 0xD8D7, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xFBAE, 0xD1E1, 0, 0, 0xDBC0, 0, /* 0xA0 */
+ 0xF5BE, 0, 0xDEF7, 0, 0, 0, 0, 0xCAFB, /* 0xA0 */
+ 0xF7C6, 0xCFC8, 0, 0, 0, 0xE1D0, 0, 0, /* 0xB0 */
+ 0xEED0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE9F4, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xCEF4, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xD5CD, 0, /* 0xD0 */
+ 0, 0xCFDB, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xDDBB, 0, 0, 0, 0, 0xCEAC, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE9E8, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xD4B4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4C7, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF5DB, 0, 0, 0xFAC1, 0, 0, /* 0x10 */
+ 0, 0xDEA9, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD4F8, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xEFF7, 0, 0, /* 0x20 */
+ 0, 0, 0xD3B3, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xEBB7, 0xEFF8, 0xF5DC, 0xEDCC, 0xDBD5, 0xF1CF, 0, /* 0x40 */
+ 0, 0, 0xF1D0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xF5B2, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xD9AE, 0xD5AC, 0, 0xE2C6, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xFDA3, 0, 0xFBE5, /* 0x70 */
+ 0xDFAB, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2F5, /* 0x80 */
+ 0, 0xF6AD, 0, 0xF5B3, 0, 0xF0B5, 0, 0, /* 0x80 */
+ 0, 0, 0xE1A5, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF5DD, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xECA2, 0xEDFD, 0, 0xF5B4, 0xFBB8, /* 0xA0 */
+ 0, 0xDBA3, 0, 0, 0xD6CA, 0xCBD9, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xE5D4, 0, 0, 0, 0, 0, 0, 0xF3FA, /* 0xC0 */
+ 0, 0xEBB8, 0, 0xE0B7, 0xD7EC, 0xF1EC, 0xE5AF, 0xD5E1, /* 0xC0 */
+ 0xD7ED, 0xD1D1, 0, 0, 0, 0, 0, 0xE1F2, /* 0xD0 */
+ 0xEFF9, 0, 0, 0, 0xDDBC, 0xF6DC, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xF0E5, 0, 0, 0, 0xF4C4, /* 0xE0 */
+ 0, 0, 0xE9E9, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF3FB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD4EF, 0, 0, /* 0x00 */
+ 0xCCA2, 0xF7FE, 0xDFBC, 0, 0, 0, 0, 0xEBCD, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xD0B7, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xD6C2, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xE8AD, 0, 0, 0, 0, 0xEFAF, /* 0x30 */
+ 0xCBA5, 0, 0, 0, 0, 0xCBE9, 0, 0, /* 0x40 */
+ 0, 0xFAE8, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCCC6, /* 0x50 */
+ 0, 0, 0, 0xE6E7, 0, 0, 0xEAC7, 0, /* 0x50 */
+ 0, 0, 0xDBA4, 0, 0xCFC9, 0xE2FC, 0xEFFA, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xEBDE, 0, 0, 0xF5C8, 0, 0xD4DE, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xE0D5, 0, 0xEFB0, 0, 0, 0xE2C7, 0, /* 0x90 */
+ 0xD9AF, 0, 0, 0, 0xF9E7, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE7E5, 0, 0, 0xCFCA, 0xE1D1, /* 0xB0 */
+ 0, 0xE2C8, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xEFFB, 0, 0, 0xFAF9, /* 0xC0 */
+ 0, 0, 0xDCF2, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE0A7, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xF8E8, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xCBEA, 0, 0, 0, 0xCBBC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD6E2, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xF5DE, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF5DF, 0, 0xEEB6, 0, 0, 0, 0xE2F6, 0xD3CA, /* 0x10 */
+ 0xEFFC, 0xD1C4, 0xEFB1, 0, 0xD1C5, 0, 0xD0DE, 0, /* 0x20 */
+ 0xD9E1, 0, 0, 0xE0B8, 0, 0, 0xCDD1, 0xF3B9, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xE7CC, 0, 0xD6A8, 0xCEA7, 0, 0xD4B5, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE4C8, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xD3B4, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xEBB9, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xCBF5, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF6DD, 0, 0xF1A3, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xCCC7, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE9CA, 0, 0xE1F0, 0, /* 0x90 */
+ 0, 0, 0xF5E0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xFBAF, 0, 0, 0, 0xCBD1, /* 0xA0 */
+ 0, 0, 0, 0, 0xFBE0, 0xF2E5, 0, 0, /* 0xA0 */
+ 0xECF0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF0EC, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xEEEB, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE9CB, 0, /* 0xD0 */
+ 0, 0xCCF0, 0, 0, 0xD7AF, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xF3A1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFCF5, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF1A4, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE0D6, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xEFB2, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF4D1, 0, 0, /* 0x30 */
+ 0xF7A1, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF1D1, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xCAFC, 0xCAFD, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xCECE, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF3C8, 0, 0xF3BA /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDFE, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xDAA6, 0, 0, 0xE0EC, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF8CD, 0, 0xCBD2, 0, 0, 0, 0xEBCE, /* 0x80 */
+ 0, 0xF9D8, 0xF9D9, 0xCAE0, 0xDACA, 0, 0, 0, /* 0x90 */
+ 0xCBA6, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xCAC8, 0xF9EE, 0xDBEC, 0, 0, /* 0xA0 */
+ 0xD0B1, 0, 0, 0, 0, 0xD5EF, 0, 0, /* 0xA0 */
+ 0, 0xE6F3, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE7A2, 0xE4D9, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE4E1, /* 0xC0 */
+ 0, 0, 0xFCC4, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xF9EF, 0xCFF4, 0xF7E6, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xCEBC, 0, 0, 0, /* 0xD0 */
+ 0, 0xF4C5, 0xDCA3 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDDBD, 0, 0, 0, /* 0x10 */
+ 0, 0xF4C6, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF8A1, 0, 0, 0, 0xE8D6, 0, /* 0x20 */
+ 0, 0, 0xDBC1, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xF0E6, 0, 0, 0, 0xE4B9, /* 0x30 */
+ 0xF6ED, 0, 0xF9AE, 0, 0xDDBE, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xD7B0, 0xD8E8, 0xCBBD, 0, 0, /* 0x40 */
+ 0xF9DA, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xF8CE, 0xF9F0, 0xE0ED, 0xE3B3, 0xF4B3, /* 0x50 */
+ 0, 0, 0xEAC2, 0xF2E6, 0xF0B6, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xDBD6, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xEBE4, 0, 0, 0xF2E7, 0, 0xD7D5, 0xD4B6, 0xF9E8, /* 0x70 */
+ 0xD7C1, 0, 0, 0, 0, 0xE5D5, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE9EA, 0xD7CC, 0, /* 0x80 */
+ 0, 0, 0xD3E9, 0xE2C9, 0, 0xFCDB, 0xCDAD, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xCCB0, 0xEAA2, 0, 0, /* 0x90 */
+ 0xE4F6, 0xD0C0, 0, 0xF0B7, 0xEEA1, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xD7F6, 0, 0, 0, 0xE2CA, /* 0xA0 */
+ 0xE2CB, 0, 0xFACF, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xEBDF, 0, 0, 0, 0, 0, 0xD6CB, /* 0xB0 */
+ 0, 0, 0, 0xF4B4, 0, 0, 0, 0, /* 0xB0 */
+ 0xEDCD, 0xE4D2, 0, 0, 0xEAA9, 0xE4BA, 0xF3A2, 0xCDD2, /* 0xC0 */
+ 0, 0xF6CB, 0, 0xF1E6, 0xEDC1, 0xE8BC, 0xEED1, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xF0E7, 0xE2CC, 0, /* 0xD0 */
+ 0, 0xE4AA, 0, 0xF5E1, 0xEDDA, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xD7EE, 0xD1F1, 0, 0, 0, 0, /* 0xE0 */
+ 0xE9EB, 0xE9EC, 0xE0E4, 0, 0, 0, 0, 0xDAA7, /* 0xE0 */
+ 0xDDD4, 0, 0xEAA3, 0, 0, 0, 0xD6C3, 0xD6F4, /* 0xF0 */
+ 0, 0xDADF, 0, 0xEFB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2CD, 0, 0, 0, 0, 0, 0xEFFD, 0xF2E8, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xEFC5, 0, 0xE7E7, 0, 0, 0xD7FD, 0, /* 0x10 */
+ 0, 0xE7CE, 0, 0, 0xDFDC, 0, 0xF9C7, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD9F6, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xDFAC, 0, 0xD6DA, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xDCA4, 0, 0, 0, 0xF0B8, 0, 0, /* 0x30 */
+ 0, 0, 0xD5FA, 0, 0xE4F7, 0, 0, 0, /* 0x40 */
+ 0xD6C4, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF4EC, 0, 0, 0, 0, 0xEFFE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xF0A1, 0, 0xDEAA, 0, /* 0x50 */
+ 0, 0xDABC, 0xD8FC, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xFAD4, 0, 0, 0, 0xECE5, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xFCA8, 0, 0, 0xECE6, /* 0x70 */
+ 0, 0, 0xD8CB, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xFBB9, 0, 0xE4D3, 0, 0xCDF9, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xCFD3, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xCAEA, 0, 0, 0xCFD4, 0, 0xF8BD, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xF4C7, 0, /* 0xC0 */
+ 0, 0, 0, 0xEADF, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xF9DB, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xD4B7, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xEBE5, 0, 0, 0xE1D2, 0, /* 0xF0 */
+ 0, 0, 0, 0xEAA4, 0, 0, 0, 0xFAC2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFBE1, 0xFAED, 0xF0A2, 0xCCF1, 0, 0xFAA3, 0xE2F7, 0, /* 0x00 */
+ 0xE2CE, 0, 0xE9F5, 0, 0xE1EB, 0, 0, 0, /* 0x00 */
+ 0xE7E8, 0xE8D7, 0xDAF8, 0xD4CB, 0, 0, 0, 0xF7F6, /* 0x10 */
+ 0xD6C5, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xD4E9, 0, 0, /* 0x20 */
+ 0xFAFA, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xCCF2, 0xF7DD, 0, 0xDEBA, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xCEA8, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF0B9, 0xE4FE, 0xE4C9, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE4D4, 0, 0, 0, /* 0x50 */
+ 0xEAC3, 0, 0xEFB4, 0, 0, 0, 0xD7BE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xFBE2, 0, 0xCDD3, /* 0x60 */
+ 0, 0, 0, 0xEFB5, 0, 0, 0, 0xFAE9, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF9A6, 0, 0, 0, 0, 0, 0, 0xDFBD, /* 0xA0 */
+ 0, 0xF7C7, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF8FD, 0, 0, 0xF8FC, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xDEAB, 0xDBE8, 0, 0, 0xE3DD, /* 0xD0 */
+ 0, 0xE1E2, 0xD1C6, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF6D0, 0xEBE6, 0xDAF9, /* 0xE0 */
+ 0, 0, 0, 0, 0xECC7, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xDEF8, 0xF8E9, 0xE3DE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCEF5, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xFAC3, 0xE5D7, 0, 0xECC8, 0, 0, 0, /* 0x00 */
+ 0xF3C9, 0, 0, 0xE4BB, 0, 0, 0, 0, /* 0x10 */
+ 0xE6AE, 0, 0, 0, 0, 0, 0xEFB6, 0, /* 0x10 */
+ 0xDCBF, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xCEBD, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xD8C3, 0, 0, /* 0x40 */
+ 0, 0xD0CF, 0, 0xCFFA, 0xF3CA, 0xE0D7, 0, 0, /* 0x40 */
+ 0, 0xD1C7, 0xE9AE, 0, 0xE8BD, 0, 0, 0xFAC4, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xE2CF, 0, /* 0x90 */
+ 0, 0xFAC5, 0, 0, 0, 0xF9B8, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xDCE0, 0, 0, /* 0xA0 */
+ 0xFBB0, 0, 0, 0, 0xD8A9, 0xE5DF, 0xF9A7, 0, /* 0xA0 */
+ 0, 0xF6EE, 0, 0xF6CC, 0xE2F8, 0, 0, 0, /* 0xB0 */
+ 0, 0xECF1, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xDAE0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xF1D2, 0xD2CC, 0xCFCB, 0, 0, 0xCABD, 0, 0, /* 0xD0 */
+ 0, 0xDDBF, 0, 0, 0, 0xF6EF, 0, 0xDEF9, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xFAB4, 0, 0, /* 0xE0 */
+ 0, 0xD5AD, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF1E7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDEBE, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xDCC0, 0, 0, 0, 0, 0, 0xD1C8, 0xD1C9, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF8BE, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xCBF6, 0, 0, 0, 0, /* 0x20 */
+ 0xD4F9, 0, 0, 0, 0, 0, 0xF5E2, 0xE1D3, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xD8E9, 0, 0, 0xF8FE, 0, 0xCFCC, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xFDA4, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xCEF6, 0, 0xFAD0, /* 0x50 */
+ 0, 0, 0xCCF3, 0xE6BE, 0, 0, 0, 0xF6AE, /* 0x50 */
+ 0, 0, 0xD5F0, 0, 0, 0xD1CA, 0, 0, /* 0x60 */
+ 0, 0xFCBE, 0xD5F1, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xCDE9, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xFAB5, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE2D0, 0xF4F7, 0, 0, 0, /* 0xD0 */
+ 0xCDD4, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xE7A3, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xDBA5 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2D1, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD7A2, /* 0x20 */
+ 0, 0, 0xF7E3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xEAA6, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xD0A1, 0, 0, 0, /* 0x30 */
+ 0, 0xCEDA, 0xFBEB, 0xDBA6, 0xDBDE, 0xD8E5, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEAE0, /* 0x40 */
+ 0, 0, 0, 0, 0xD8AA, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE5E0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD6DB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xEFC6, 0, /* 0x80 */
+ 0, 0xF8EA, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE4D5, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xCEF7, 0, 0, 0xE0D8, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xD7EF, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xF4ED, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xCDE6, 0, 0, 0, /* 0xE0 */
+ 0xCCF4 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5E3, 0, 0, /* 0x00 */
+ 0xE4CA, 0, 0xDCE1, 0, 0, 0xF9C8, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xFCBF, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE8A7, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xD8C4, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCBBE, /* 0x40 */
+ 0, 0xDCAE, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD7F7, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xF0E8, 0, 0xDDC0, /* 0xE0 */
+ 0, 0xCFCD, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xDCF3, 0xD9B0, 0, 0xE6E9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4BC, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xEAC4, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE4EC, 0, /* 0x20 */
+ 0xE4E5, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xFBF8, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xCCBB, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xE4BD, 0, 0, /* 0x50 */
+ 0xCDDC, 0xD9F7, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xDDDF, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xEDCE, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xD9D0, 0, 0, 0, 0, 0, 0xE5A3, /* 0xA0 */
+ 0, 0, 0, 0, 0xF9CD, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xCDAE, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCFCE, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xF6AF, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xFDD3, 0xEBED, 0xD6DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5A4, 0, 0, 0, 0xD5B6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xD6DD, 0, 0, /* 0x70 */
+ 0, 0xF9E9, 0, 0, 0, 0xE7A4, 0, 0xD6E3, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD1CB, 0xD6E4, 0, 0, 0, 0xD5F2, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xDEFA, 0, 0xD7F8, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xD8EA, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xCFD5, 0xD8FD, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xD8AB, 0, 0, 0xFDCB, 0, /* 0xB0 */
+ 0, 0, 0, 0xFCDC, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xE0A8, 0xD5F3, 0, /* 0xC0 */
+ 0, 0xFDD9, 0, 0, 0xCCA3, 0, 0, 0, /* 0xD0 */
+ 0xD9F9, 0, 0, 0xD3EA, 0xF5F5, 0, 0xEFC7, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xD3DA, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xDABD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE8A8, /* 0x00 */
+ 0xDCAF, 0, 0, 0, 0, 0, 0xF0A3, 0, /* 0x00 */
+ 0, 0, 0, 0xCDD5, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE0A9, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xDEAC, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF0BA, 0xEEB1, 0, 0, 0xEEB2, 0, /* 0x40 */
+ 0, 0, 0xF6CD, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEED2, /* 0x50 */
+ 0, 0xD6C6, 0, 0, 0, 0, 0, 0xE0E5, /* 0x60 */
+ 0, 0, 0xF3BB, 0, 0xE5E1, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE4CB, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xD7A3, 0, 0, /* 0x80 */
+ 0xDBC2, 0, 0, 0, 0, 0xCAFE, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xCFCF /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_AC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB0A1, 0xB0A2, 0x8141, 0x8142, 0xB0A3, 0x8143, 0x8144, 0xB0A4, /* 0x00 */
+ 0xB0A5, 0xB0A6, 0xB0A7, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, /* 0x00 */
+ 0xB0A8, 0xB0A9, 0xB0AA, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF, /* 0x10 */
+ 0x814A, 0xB0B0, 0xB0B1, 0xB0B2, 0xB0B3, 0xB0B4, 0x814B, 0x814C, /* 0x10 */
+ 0xB0B5, 0x814D, 0x814E, 0x814F, 0xB0B6, 0x8150, 0x8151, 0x8152, /* 0x20 */
+ 0x8153, 0x8154, 0x8155, 0x8156, 0xB0B7, 0xB0B8, 0x8157, 0xB0B9, /* 0x20 */
+ 0xB0BA, 0xB0BB, 0x8158, 0x8159, 0x815A, 0x8161, 0x8162, 0x8163, /* 0x30 */
+ 0xB0BC, 0xB0BD, 0x8164, 0x8165, 0xB0BE, 0x8166, 0x8167, 0x8168, /* 0x30 */
+ 0xB0BF, 0x8169, 0x816A, 0x816B, 0x816C, 0x816D, 0x816E, 0x816F, /* 0x40 */
+ 0x8170, 0x8171, 0x8172, 0xB0C0, 0x8173, 0xB0C1, 0x8174, 0x8175, /* 0x40 */
+ 0x8176, 0x8177, 0x8178, 0x8179, 0xB0C2, 0x817A, 0x8181, 0x8182, /* 0x50 */
+ 0xB0C3, 0x8183, 0x8184, 0x8185, 0xB0C4, 0x8186, 0x8187, 0x8188, /* 0x50 */
+ 0x8189, 0x818A, 0x818B, 0x818C, 0x818D, 0x818E, 0x818F, 0x8190, /* 0x60 */
+ 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198, /* 0x60 */
+ 0xB0C5, 0xB0C6, 0x8199, 0x819A, 0xB0C7, 0x819B, 0x819C, 0xB0C8, /* 0x70 */
+ 0xB0C9, 0x819D, 0xB0CA, 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, /* 0x70 */
+ 0xB0CB, 0xB0CC, 0x81A3, 0xB0CD, 0xB0CE, 0xB0CF, 0xB0D0, 0x81A4, /* 0x80 */
+ 0x81A5, 0xB0D1, 0xB0D2, 0xB0D3, 0xB0D4, 0x81A6, 0x81A7, 0x81A8, /* 0x80 */
+ 0xB0D5, 0x81A9, 0x81AA, 0x81AB, 0xB0D6, 0x81AC, 0x81AD, 0x81AE, /* 0x90 */
+ 0x81AF, 0x81B0, 0x81B1, 0x81B2, 0xB0D7, 0xB0D8, 0x81B3, 0xB0D9, /* 0x90 */
+ 0xB0DA, 0xB0DB, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, /* 0xA0 */
+ 0xB0DC, 0xB0DD, 0xB0DE, 0x81BA, 0xB0DF, 0x81BB, 0x81BC, 0xB0E0, /* 0xA0 */
+ 0xB0E1, 0x81BD, 0x81BE, 0x81BF, 0x81C0, 0x81C1, 0x81C2, 0x81C3, /* 0xB0 */
+ 0xB0E2, 0xB0E3, 0x81C4, 0xB0E4, 0xB0E5, 0xB0E6, 0x81C5, 0x81C6, /* 0xB0 */
+ 0x81C7, 0xB0E7, 0x81C8, 0x81C9, 0xB0E8, 0x81CA, 0x81CB, 0x81CC, /* 0xC0 */
+ 0xB0E9, 0x81CD, 0x81CE, 0x81CF, 0xB0EA, 0x81D0, 0x81D1, 0x81D2, /* 0xC0 */
+ 0x81D3, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0xB0EB, 0x81D8, 0xB0EC, /* 0xD0 */
+ 0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, /* 0xD0 */
+ 0xB0ED, 0xB0EE, 0x81E1, 0x81E2, 0xB0EF, 0x81E3, 0x81E4, 0xB0F0, /* 0xE0 */
+ 0xB0F1, 0x81E5, 0xB0F2, 0x81E6, 0xB0F3, 0x81E7, 0x81E8, 0xB0F4, /* 0xE0 */
+ 0xB0F5, 0xB0F6, 0x81E9, 0xB0F7, 0x81EA, 0xB0F8, 0xB0F9, 0x81EB, /* 0xF0 */
+ 0x81EC, 0x81ED, 0x81EE, 0x81EF, 0xB0FA, 0xB0FB, 0x81F0, 0x81F1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_AD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB0FC, 0x81F2, 0x81F3, 0x81F4, 0xB0FD, 0x81F5, 0xB0FE, 0x81F6, /* 0x00 */
+ 0x81F7, 0x81F8, 0x81F9, 0x81FA, 0xB1A1, 0xB1A2, 0x81FB, 0xB1A3, /* 0x00 */
+ 0x81FC, 0xB1A4, 0x81FD, 0x81FE, 0x8241, 0x8242, 0x8243, 0x8244, /* 0x10 */
+ 0xB1A5, 0x8245, 0x8246, 0x8247, 0xB1A6, 0x8248, 0x8249, 0x824A, /* 0x10 */
+ 0xB1A7, 0x824B, 0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0x8251, /* 0x20 */
+ 0x8252, 0xB1A8, 0x8253, 0x8254, 0xB1A9, 0xB1AA, 0x8255, 0x8256, /* 0x20 */
+ 0x8257, 0x8258, 0x8259, 0x825A, 0xB1AB, 0xB1AC, 0x8261, 0x8262, /* 0x30 */
+ 0xB1AD, 0x8263, 0x8264, 0x8265, 0xB1AE, 0x8266, 0x8267, 0x8268, /* 0x30 */
+ 0x8269, 0x826A, 0x826B, 0x826C, 0xB1AF, 0xB1B0, 0x826D, 0xB1B1, /* 0x40 */
+ 0x826E, 0xB1B2, 0x826F, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, /* 0x40 */
+ 0xB1B3, 0x8275, 0x8276, 0x8277, 0xB1B4, 0x8278, 0x8279, 0x827A, /* 0x50 */
+ 0xB1B5, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, /* 0x50 */
+ 0x8288, 0xB1B6, 0x8289, 0xB1B7, 0x828A, 0x828B, 0x828C, 0x828D, /* 0x60 */
+ 0x828E, 0x828F, 0x8290, 0x8291, 0xB1B8, 0xB1B9, 0x8292, 0x8293, /* 0x60 */
+ 0xB1BA, 0x8294, 0x8295, 0xB1BB, 0xB1BC, 0xB1BD, 0xB1BE, 0x8296, /* 0x70 */
+ 0x8297, 0x8298, 0x8299, 0xB1BF, 0xB1C0, 0xB1C1, 0x829A, 0xB1C2, /* 0x70 */
+ 0x829B, 0xB1C3, 0xB1C4, 0x829C, 0x829D, 0x829E, 0x829F, 0x82A0, /* 0x80 */
+ 0xB1C5, 0xB1C6, 0x82A1, 0x82A2, 0xB1C7, 0x82A3, 0x82A4, 0x82A5, /* 0x80 */
+ 0xB1C8, 0x82A6, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AB, 0x82AC, /* 0x90 */
+ 0x82AD, 0x82AE, 0x82AF, 0x82B0, 0xB1C9, 0xB1CA, 0x82B1, 0x82B2, /* 0x90 */
+ 0x82B3, 0x82B4, 0x82B5, 0x82B6, 0xB1CB, 0x82B7, 0x82B8, 0x82B9, /* 0xA0 */
+ 0x82BA, 0x82BB, 0x82BC, 0x82BD, 0x82BE, 0x82BF, 0x82C0, 0x82C1, /* 0xA0 */
+ 0x82C2, 0x82C3, 0x82C4, 0x82C5, 0x82C6, 0x82C7, 0x82C8, 0xB1CC, /* 0xB0 */
+ 0x82C9, 0x82CA, 0x82CB, 0x82CC, 0x82CD, 0x82CE, 0x82CF, 0x82D0, /* 0xB0 */
+ 0xB1CD, 0xB1CE, 0x82D1, 0x82D2, 0xB1CF, 0x82D3, 0x82D4, 0x82D5, /* 0xC0 */
+ 0xB1D0, 0x82D6, 0x82D7, 0x82D8, 0x82D9, 0x82DA, 0x82DB, 0x82DC, /* 0xC0 */
+ 0xB1D1, 0xB1D2, 0x82DD, 0xB1D3, 0x82DE, 0x82DF, 0x82E0, 0x82E1, /* 0xD0 */
+ 0x82E2, 0x82E3, 0x82E4, 0x82E5, 0xB1D4, 0x82E6, 0x82E7, 0x82E8, /* 0xD0 */
+ 0xB1D5, 0x82E9, 0x82EA, 0x82EB, 0xB1D6, 0x82EC, 0x82ED, 0x82EE, /* 0xE0 */
+ 0x82EF, 0x82F0, 0x82F1, 0x82F2, 0x82F3, 0x82F4, 0x82F5, 0x82F6, /* 0xE0 */
+ 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, 0x82FC, 0x82FD, 0x82FE, /* 0xF0 */
+ 0xB1D7, 0xB1D8, 0x8341, 0x8342, 0xB1D9, 0x8343, 0x8344, 0xB1DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_AE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB1DB, 0xB1DC, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, /* 0x00 */
+ 0xB1DD, 0xB1DE, 0x834B, 0xB1DF, 0x834C, 0xB1E0, 0x834D, 0x834E, /* 0x00 */
+ 0x834F, 0x8350, 0x8351, 0x8352, 0xB1E1, 0x8353, 0x8354, 0x8355, /* 0x10 */
+ 0x8356, 0x8357, 0x8358, 0x8359, 0x835A, 0x8361, 0x8362, 0x8363, /* 0x10 */
+ 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, /* 0x20 */
+ 0x836C, 0x836D, 0x836E, 0x836F, 0x8370, 0x8371, 0x8372, 0x8373, /* 0x20 */
+ 0xB1E2, 0xB1E3, 0x8374, 0x8375, 0xB1E4, 0x8376, 0x8377, 0xB1E5, /* 0x30 */
+ 0xB1E6, 0x8378, 0xB1E7, 0x8379, 0x837A, 0x8381, 0x8382, 0x8383, /* 0x30 */
+ 0xB1E8, 0xB1E9, 0x8384, 0xB1EA, 0x8385, 0xB1EB, 0xB1EC, 0x8386, /* 0x40 */
+ 0x8387, 0x8388, 0xB1ED, 0x8389, 0xB1EE, 0xB1EF, 0xB1F0, 0x838A, /* 0x40 */
+ 0xB1F1, 0x838B, 0x838C, 0x838D, 0xB1F2, 0x838E, 0xB1F3, 0x838F, /* 0x50 */
+ 0x8390, 0x8391, 0x8392, 0x8393, 0xB1F4, 0xB1F5, 0x8394, 0xB1F6, /* 0x50 */
+ 0xB1F7, 0xB1F8, 0x8395, 0x8396, 0x8397, 0xB1F9, 0x8398, 0x8399, /* 0x60 */
+ 0xB1FA, 0xB1FB, 0x839A, 0x839B, 0xB1FC, 0x839C, 0x839D, 0x839E, /* 0x60 */
+ 0xB1FD, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, /* 0x70 */
+ 0xB1FE, 0xB2A1, 0x83A6, 0xB2A2, 0xB2A3, 0xB2A4, 0x83A7, 0x83A8, /* 0x70 */
+ 0x83A9, 0x83AA, 0x83AB, 0x83AC, 0xB2A5, 0xB2A6, 0x83AD, 0x83AE, /* 0x80 */
+ 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0xB2A7, 0x83B3, 0x83B4, 0x83B5, /* 0x80 */
+ 0x83B6, 0x83B7, 0x83B8, 0x83B9, 0x83BA, 0x83BB, 0x83BC, 0x83BD, /* 0x90 */
+ 0x83BE, 0x83BF, 0x83C0, 0x83C1, 0x83C2, 0x83C3, 0x83C4, 0x83C5, /* 0x90 */
+ 0x83C6, 0x83C7, 0x83C8, 0x83C9, 0x83CA, 0x83CB, 0x83CC, 0x83CD, /* 0xA0 */
+ 0x83CE, 0x83CF, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D4, 0x83D5, /* 0xA0 */
+ 0x83D6, 0x83D7, 0x83D8, 0x83D9, 0x83DA, 0x83DB, 0x83DC, 0x83DD, /* 0xB0 */
+ 0x83DE, 0x83DF, 0x83E0, 0x83E1, 0xB2A8, 0xB2A9, 0xB2AA, 0x83E2, /* 0xB0 */
+ 0xB2AB, 0x83E3, 0x83E4, 0x83E5, 0xB2AC, 0x83E6, 0x83E7, 0x83E8, /* 0xC0 */
+ 0x83E9, 0x83EA, 0x83EB, 0x83EC, 0xB2AD, 0xB2AE, 0x83ED, 0xB2AF, /* 0xC0 */
+ 0xB2B0, 0xB2B1, 0x83EE, 0x83EF, 0x83F0, 0x83F1, 0x83F2, 0x83F3, /* 0xD0 */
+ 0xB2B2, 0xB2B3, 0x83F4, 0x83F5, 0xB2B4, 0x83F6, 0x83F7, 0x83F8, /* 0xD0 */
+ 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE, 0x8441, 0x8442, /* 0xE0 */
+ 0xB2B5, 0x8443, 0x8444, 0xB2B6, 0x8445, 0xB2B7, 0x8446, 0x8447, /* 0xE0 */
+ 0x8448, 0x8449, 0x844A, 0x844B, 0xB2B8, 0x844C, 0x844D, 0x844E, /* 0xF0 */
+ 0xB2B9, 0x844F, 0x8450, 0x8451, 0xB2BA, 0x8452, 0x8453, 0x8454 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_AF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845A, 0x8461, 0xB2BB, /* 0x00 */
+ 0xB2BC, 0x8462, 0x8463, 0x8464, 0x8465, 0xB2BD, 0x8466, 0x8467, /* 0x00 */
+ 0xB2BE, 0x8468, 0x8469, 0x846A, 0x846B, 0x846C, 0x846D, 0x846E, /* 0x10 */
+ 0x846F, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, /* 0x10 */
+ 0x8477, 0x8478, 0x8479, 0x847A, 0x8481, 0x8482, 0x8483, 0x8484, /* 0x20 */
+ 0x8485, 0x8486, 0x8487, 0x8488, 0xB2BF, 0xB2C0, 0x8489, 0x848A, /* 0x20 */
+ 0xB2C1, 0x848B, 0xB2C2, 0x848C, 0xB2C3, 0x848D, 0x848E, 0x848F, /* 0x30 */
+ 0x8490, 0x8491, 0x8492, 0x8493, 0xB2C4, 0xB2C5, 0x8494, 0xB2C6, /* 0x30 */
+ 0x8495, 0xB2C7, 0xB2C8, 0xB2C9, 0x8496, 0x8497, 0x8498, 0x8499, /* 0x40 */
+ 0xB2CA, 0xB2CB, 0x849A, 0x849B, 0x849C, 0x849D, 0x849E, 0x849F, /* 0x40 */
+ 0xB2CC, 0x84A0, 0x84A1, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, /* 0x50 */
+ 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0xB2CD, 0xB2CE, 0x84AB, 0x84AC, /* 0x50 */
+ 0x84AD, 0x84AE, 0x84AF, 0x84B0, 0xB2CF, 0xB2D0, 0x84B1, 0x84B2, /* 0x60 */
+ 0x84B3, 0x84B4, 0x84B5, 0x84B6, 0x84B7, 0x84B8, 0x84B9, 0x84BA, /* 0x60 */
+ 0x84BB, 0x84BC, 0x84BD, 0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, /* 0x70 */
+ 0x84C3, 0xB2D1, 0x84C4, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84C9, /* 0x70 */
+ 0xB2D2, 0x84CA, 0x84CB, 0x84CC, 0xB2D3, 0x84CD, 0x84CE, 0x84CF, /* 0x80 */
+ 0xB2D4, 0x84D0, 0x84D1, 0x84D2, 0x84D3, 0x84D4, 0x84D5, 0x84D6, /* 0x80 */
+ 0xB2D5, 0xB2D6, 0x84D7, 0x84D8, 0x84D9, 0xB2D7, 0x84DA, 0x84DB, /* 0x90 */
+ 0x84DC, 0x84DD, 0x84DE, 0x84DF, 0xB2D8, 0x84E0, 0x84E1, 0x84E2, /* 0x90 */
+ 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, 0x84EA, /* 0xA0 */
+ 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x84F0, 0x84F1, 0x84F2, /* 0xA0 */
+ 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, 0x84F8, 0x84F9, 0x84FA, /* 0xB0 */
+ 0xB2D9, 0xB2DA, 0x84FB, 0x84FC, 0xB2DB, 0x84FD, 0x84FE, 0x8541, /* 0xB0 */
+ 0xB2DC, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0xB2DD, /* 0xC0 */
+ 0xB2DE, 0xB2DF, 0x8548, 0xB2E0, 0x8549, 0xB2E1, 0xB2E2, 0x854A, /* 0xC0 */
+ 0x854B, 0x854C, 0x854D, 0x854E, 0xB2E3, 0x854F, 0x8550, 0x8551, /* 0xD0 */
+ 0x8552, 0x8553, 0x8554, 0x8555, 0xB2E4, 0x8556, 0x8557, 0x8558, /* 0xD0 */
+ 0x8559, 0x855A, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, /* 0xE0 */
+ 0xB2E5, 0xB2E6, 0x8567, 0x8568, 0x8569, 0x856A, 0x856B, 0x856C, /* 0xE0 */
+ 0xB2E7, 0xB2E8, 0x856D, 0x856E, 0xB2E9, 0x856F, 0x8570, 0x8571, /* 0xF0 */
+ 0xB2EA, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB2EB, 0xB2EC, 0x8579, 0x857A, 0xB2ED, 0x8581, 0x8582, 0x8583, /* 0x00 */
+ 0x8584, 0x8585, 0x8586, 0x8587, 0xB2EE, 0x8588, 0x8589, 0x858A, /* 0x00 */
+ 0xB2EF, 0x858B, 0x858C, 0x858D, 0xB2F0, 0x858E, 0x858F, 0x8590, /* 0x10 */
+ 0x8591, 0x8592, 0x8593, 0x8594, 0xB2F1, 0xB2F2, 0x8595, 0x8596, /* 0x10 */
+ 0x8597, 0x8598, 0x8599, 0x859A, 0x859B, 0x859C, 0x859D, 0x859E, /* 0x20 */
+ 0xB2F3, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A4, 0x85A5, /* 0x20 */
+ 0x85A6, 0x85A7, 0x85A8, 0x85A9, 0x85AA, 0x85AB, 0x85AC, 0x85AD, /* 0x30 */
+ 0x85AE, 0x85AF, 0x85B0, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5, /* 0x30 */
+ 0x85B6, 0x85B7, 0x85B8, 0x85B9, 0xB2F4, 0xB2F5, 0x85BA, 0x85BB, /* 0x40 */
+ 0xB2F6, 0x85BC, 0xB2F7, 0x85BD, 0xB2F8, 0x85BE, 0xB2F9, 0x85BF, /* 0x40 */
+ 0x85C0, 0x85C1, 0x85C2, 0xB2FA, 0xB2FB, 0xB2FC, 0x85C3, 0xB2FD, /* 0x50 */
+ 0x85C4, 0xB2FE, 0x85C5, 0x85C6, 0x85C7, 0xB3A1, 0x85C8, 0x85C9, /* 0x50 */
+ 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85CF, 0x85D0, 0x85D1, /* 0x60 */
+ 0x85D2, 0x85D3, 0x85D4, 0x85D5, 0x85D6, 0x85D7, 0x85D8, 0x85D9, /* 0x60 */
+ 0x85DA, 0x85DB, 0x85DC, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, /* 0x70 */
+ 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0xB3A2, 0xB3A3, 0x85E6, 0x85E7, /* 0x70 */
+ 0xB3A4, 0x85E8, 0x85E9, 0x85EA, 0xB3A5, 0x85EB, 0x85EC, 0x85ED, /* 0x80 */
+ 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0xB3A6, 0xB3A7, 0x85F2, 0xB3A8, /* 0x80 */
+ 0x85F3, 0xB3A9, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x85F9, /* 0x90 */
+ 0xB3AA, 0xB3AB, 0xB3AC, 0x85FA, 0xB3AD, 0x85FB, 0x85FC, 0xB3AE, /* 0x90 */
+ 0xB3AF, 0xB3B0, 0xB3B1, 0x85FD, 0x85FE, 0x8641, 0x8642, 0x8643, /* 0xA0 */
+ 0xB3B2, 0xB3B3, 0x8644, 0xB3B4, 0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, /* 0xA0 */
+ 0x8645, 0xB3B9, 0x8646, 0xB3BA, 0xB3BB, 0xB3BC, 0x8647, 0x8648, /* 0xB0 */
+ 0xB3BD, 0x8649, 0x864A, 0x864B, 0xB3BE, 0x864C, 0x864D, 0x864E, /* 0xB0 */
+ 0x864F, 0x8650, 0x8651, 0x8652, 0xB3BF, 0xB3C0, 0x8653, 0xB3C1, /* 0xC0 */
+ 0xB3C2, 0xB3C3, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, /* 0xC0 */
+ 0xB3C4, 0xB3C5, 0x865A, 0x8661, 0xB3C6, 0x8662, 0x8663, 0x8664, /* 0xD0 */
+ 0xB3C7, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866A, 0x866B, /* 0xD0 */
+ 0xB3C8, 0x866C, 0x866D, 0x866E, 0x866F, 0xB3C9, 0x8670, 0x8671, /* 0xE0 */
+ 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, /* 0xE0 */
+ 0x867A, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, /* 0xF0 */
+ 0x8688, 0x8689, 0x868A, 0x868B, 0x868C, 0x868D, 0x868E, 0x868F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, 0x8697, /* 0x00 */
+ 0xB3CA, 0xB3CB, 0x8698, 0xB3CC, 0xB3CD, 0x8699, 0x869A, 0x869B, /* 0x00 */
+ 0xB3CE, 0x869C, 0xB3CF, 0xB3D0, 0x869D, 0x869E, 0x869F, 0x86A0, /* 0x10 */
+ 0xB3D1, 0xB3D2, 0x86A1, 0xB3D3, 0xB3D4, 0xB3D5, 0x86A2, 0x86A3, /* 0x10 */
+ 0x86A4, 0x86A5, 0x86A6, 0xB3D6, 0xB3D7, 0xB3D8, 0x86A7, 0x86A8, /* 0x20 */
+ 0xB3D9, 0x86A9, 0x86AA, 0x86AB, 0xB3DA, 0x86AC, 0x86AD, 0x86AE, /* 0x20 */
+ 0x86AF, 0x86B0, 0x86B1, 0x86B2, 0xB3DB, 0xB3DC, 0x86B3, 0xB3DD, /* 0x30 */
+ 0xB3DE, 0xB3DF, 0x86B4, 0x86B5, 0x86B6, 0x86B7, 0x86B8, 0x86B9, /* 0x30 */
+ 0xB3E0, 0xB3E1, 0x86BA, 0x86BB, 0xB3E2, 0x86BC, 0x86BD, 0x86BE, /* 0x40 */
+ 0xB3E3, 0x86BF, 0x86C0, 0x86C1, 0x86C2, 0x86C3, 0x86C4, 0x86C5, /* 0x40 */
+ 0xB3E4, 0xB3E5, 0x86C6, 0x86C7, 0xB3E6, 0xB3E7, 0x86C8, 0x86C9, /* 0x50 */
+ 0xB3E8, 0x86CA, 0x86CB, 0x86CC, 0xB3E9, 0x86CD, 0x86CE, 0x86CF, /* 0x50 */
+ 0xB3EA, 0x86D0, 0x86D1, 0x86D2, 0x86D3, 0x86D4, 0x86D5, 0x86D6, /* 0x60 */
+ 0x86D7, 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0x86DC, 0x86DD, 0x86DE, /* 0x60 */
+ 0x86DF, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E4, 0x86E5, 0x86E6, /* 0x70 */
+ 0xB3EB, 0xB3EC, 0x86E7, 0x86E8, 0xB3ED, 0x86E9, 0x86EA, 0x86EB, /* 0x70 */
+ 0xB3EE, 0x86EC, 0xB3EF, 0x86ED, 0x86EE, 0x86EF, 0x86F0, 0x86F1, /* 0x80 */
+ 0xB3F0, 0xB3F1, 0x86F2, 0xB3F2, 0x86F3, 0xB3F3, 0x86F4, 0x86F5, /* 0x80 */
+ 0x86F6, 0x86F7, 0xB3F4, 0xB3F5, 0xB3F6, 0x86F8, 0x86F9, 0x86FA, /* 0x90 */
+ 0xB3F7, 0x86FB, 0x86FC, 0x86FD, 0xB3F8, 0x86FE, 0x8741, 0x8742, /* 0x90 */
+ 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, /* 0xA0 */
+ 0xB3F9, 0x874B, 0x874C, 0x874D, 0x874E, 0x874F, 0x8750, 0x8751, /* 0xA0 */
+ 0x8752, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, /* 0xB0 */
+ 0x875A, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, 0x8766, 0x8767, /* 0xB0 */
+ 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876E, 0x876F, /* 0xC0 */
+ 0x8770, 0x8771, 0x8772, 0x8773, 0xB3FA, 0x8774, 0x8775, 0x8776, /* 0xC0 */
+ 0xB3FB, 0x8777, 0x8778, 0x8779, 0xB3FC, 0x877A, 0x8781, 0x8782, /* 0xD0 */
+ 0x8783, 0x8784, 0x8785, 0x8786, 0xB3FD, 0xB3FE, 0x8787, 0xB4A1, /* 0xD0 */
+ 0x8788, 0x8789, 0x878A, 0x878B, 0x878C, 0x878D, 0x878E, 0x878F, /* 0xE0 */
+ 0xB4A2, 0xB4A3, 0x8790, 0x8791, 0xB4A4, 0x8792, 0x8793, 0x8794, /* 0xE0 */
+ 0xB4A5, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x879A, 0x879B, /* 0xF0 */
+ 0x879C, 0xB4A6, 0x879D, 0xB4A7, 0x879E, 0xB4A8, 0x879F, 0x87A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x87A1, 0x87A2, 0x87A3, 0x87A4, 0xB4A9, 0xB4AA, 0x87A5, 0x87A6, /* 0x00 */
+ 0xB4AB, 0x87A7, 0x87A8, 0xB4AC, 0xB4AD, 0x87A9, 0x87AA, 0x87AB, /* 0x00 */
+ 0x87AC, 0x87AD, 0x87AE, 0x87AF, 0xB4AE, 0xB4AF, 0x87B0, 0xB4B0, /* 0x10 */
+ 0x87B1, 0xB4B1, 0x87B2, 0x87B3, 0x87B4, 0x87B5, 0x87B6, 0x87B7, /* 0x10 */
+ 0xB4B2, 0x87B8, 0x87B9, 0x87BA, 0x87BB, 0x87BC, 0x87BD, 0x87BE, /* 0x20 */
+ 0x87BF, 0x87C0, 0x87C1, 0x87C2, 0x87C3, 0x87C4, 0x87C5, 0x87C6, /* 0x20 */
+ 0x87C7, 0x87C8, 0x87C9, 0x87CA, 0xB4B3, 0x87CB, 0x87CC, 0x87CD, /* 0x30 */
+ 0x87CE, 0x87CF, 0x87D0, 0x87D1, 0xB4B4, 0x87D2, 0x87D3, 0x87D4, /* 0x30 */
+ 0x87D5, 0x87D6, 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DB, 0x87DC, /* 0x40 */
+ 0x87DD, 0x87DE, 0x87DF, 0x87E0, 0x87E1, 0x87E2, 0x87E3, 0x87E4, /* 0x40 */
+ 0x87E5, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EA, 0x87EB, 0x87EC, /* 0x50 */
+ 0xB4B5, 0x87ED, 0x87EE, 0x87EF, 0xB4B6, 0x87F0, 0x87F1, 0x87F2, /* 0x50 */
+ 0xB4B7, 0x87F3, 0x87F4, 0x87F5, 0x87F6, 0x87F7, 0x87F8, 0x87F9, /* 0x60 */
+ 0xB4B8, 0xB4B9, 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FE, 0x8841, /* 0x60 */
+ 0x8842, 0x8843, 0x8844, 0x8845, 0xB4BA, 0xB4BB, 0x8846, 0x8847, /* 0x70 */
+ 0x8848, 0x8849, 0x884A, 0x884B, 0xB4BC, 0x884C, 0x884D, 0x884E, /* 0x70 */
+ 0x884F, 0x8850, 0x8851, 0x8852, 0xB4BD, 0xB4BE, 0x8853, 0x8854, /* 0x80 */
+ 0x8855, 0xB4BF, 0x8856, 0x8857, 0x8858, 0x8859, 0x885A, 0x8861, /* 0x80 */
+ 0xB4C0, 0xB4C1, 0x8862, 0x8863, 0xB4C2, 0x8864, 0x8865, 0x8866, /* 0x90 */
+ 0xB4C3, 0xB4C4, 0xB4C5, 0x8867, 0x8868, 0x8869, 0x886A, 0x886B, /* 0x90 */
+ 0xB4C6, 0xB4C7, 0x886C, 0xB4C8, 0x886D, 0xB4C9, 0xB4CA, 0x886E, /* 0xA0 */
+ 0x886F, 0x8870, 0xB4CB, 0x8871, 0xB4CC, 0x8872, 0x8873, 0x8874, /* 0xA0 */
+ 0xB4CD, 0x8875, 0x8876, 0x8877, 0xB4CE, 0x8878, 0x8879, 0x887A, /* 0xB0 */
+ 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, 0x8888, /* 0xB0 */
+ 0x8889, 0x888A, 0x888B, 0x888C, 0x888D, 0x888E, 0x888F, 0x8890, /* 0xC0 */
+ 0xB4CF, 0xB4D0, 0x8891, 0x8892, 0xB4D1, 0x8893, 0x8894, 0x8895, /* 0xC0 */
+ 0xB4D2, 0x8896, 0xB4D3, 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, /* 0xD0 */
+ 0xB4D4, 0xB4D5, 0x889C, 0xB4D6, 0x889D, 0xB4D7, 0x889E, 0x889F, /* 0xD0 */
+ 0x88A0, 0x88A1, 0xB4D8, 0x88A2, 0xB4D9, 0xB4DA, 0xB4DB, 0x88A3, /* 0xE0 */
+ 0xB4DC, 0x88A4, 0x88A5, 0xB4DD, 0xB4DE, 0xB4DF, 0xB4E0, 0xB4E1, /* 0xE0 */
+ 0x88A6, 0x88A7, 0x88A8, 0xB4E2, 0xB4E3, 0xB4E4, 0x88A9, 0xB4E5, /* 0xF0 */
+ 0xB4E6, 0xB4E7, 0xB4E8, 0xB4E9, 0x88AA, 0x88AB, 0x88AC, 0xB4EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB4EB, 0xB4EC, 0x88AD, 0x88AE, 0xB4ED, 0x88AF, 0x88B0, 0x88B1, /* 0x00 */
+ 0xB4EE, 0x88B2, 0x88B3, 0x88B4, 0x88B5, 0x88B6, 0x88B7, 0x88B8, /* 0x00 */
+ 0xB4EF, 0xB4F0, 0x88B9, 0xB4F1, 0xB4F2, 0xB4F3, 0x88BA, 0x88BB, /* 0x10 */
+ 0x88BC, 0x88BD, 0x88BE, 0x88BF, 0xB4F4, 0x88C0, 0x88C1, 0x88C2, /* 0x10 */
+ 0x88C3, 0x88C4, 0x88C5, 0x88C6, 0x88C7, 0x88C8, 0x88C9, 0x88CA, /* 0x20 */
+ 0x88CB, 0x88CC, 0x88CD, 0x88CE, 0x88CF, 0x88D0, 0x88D1, 0x88D2, /* 0x20 */
+ 0x88D3, 0x88D4, 0x88D5, 0x88D6, 0x88D7, 0x88D8, 0x88D9, 0x88DA, /* 0x30 */
+ 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88DF, 0x88E0, 0x88E1, 0x88E2, /* 0x30 */
+ 0x88E3, 0x88E4, 0x88E5, 0x88E6, 0x88E7, 0x88E8, 0x88E9, 0x88EA, /* 0x40 */
+ 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F0, 0x88F1, 0x88F2, /* 0x40 */
+ 0x88F3, 0x88F4, 0x88F5, 0x88F6, 0xB4F5, 0xB4F6, 0xB4F7, 0x88F7, /* 0x50 */
+ 0xB4F8, 0x88F8, 0x88F9, 0xB4F9, 0xB4FA, 0x88FA, 0xB4FB, 0xB4FC, /* 0x50 */
+ 0x88FB, 0x88FC, 0x88FD, 0x88FE, 0xB4FD, 0xB4FE, 0x8941, 0xB5A1, /* 0x60 */
+ 0x8942, 0xB5A2, 0x8943, 0xB5A3, 0x8944, 0x8945, 0xB5A4, 0x8946, /* 0x60 */
+ 0xB5A5, 0xB5A6, 0x8947, 0x8948, 0xB5A7, 0x8949, 0x894A, 0x894B, /* 0x70 */
+ 0xB5A8, 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, 0x8952, /* 0x70 */
+ 0xB5A9, 0xB5AA, 0x8953, 0xB5AB, 0xB5AC, 0xB5AD, 0x8954, 0x8955, /* 0x80 */
+ 0x8956, 0x8957, 0x8958, 0x8959, 0xB5AE, 0x895A, 0x8961, 0x8962, /* 0x80 */
+ 0xB5AF, 0x8963, 0x8964, 0x8965, 0xB5B0, 0x8966, 0x8967, 0x8968, /* 0x90 */
+ 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, 0x896F, 0x8970, /* 0x90 */
+ 0xB5B1, 0xB5B2, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, /* 0xA0 */
+ 0xB5B3, 0x8977, 0x8978, 0x8979, 0xB5B4, 0x897A, 0x8981, 0x8982, /* 0xA0 */
+ 0x8983, 0x8984, 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898A, /* 0xB0 */
+ 0x898B, 0x898C, 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8992, /* 0xB0 */
+ 0x8993, 0x8994, 0x8995, 0x8996, 0xB5B5, 0xB5B6, 0x8997, 0x8998, /* 0xC0 */
+ 0xB5B7, 0x8999, 0x899A, 0xB5B8, 0xB5B9, 0x899B, 0xB5BA, 0x899C, /* 0xC0 */
+ 0xB5BB, 0x899D, 0x899E, 0x899F, 0xB5BC, 0xB5BD, 0x89A0, 0xB5BE, /* 0xD0 */
+ 0x89A1, 0xB5BF, 0x89A2, 0xB5C0, 0x89A3, 0xB5C1, 0x89A4, 0x89A5, /* 0xD0 */
+ 0xB5C2, 0x89A6, 0x89A7, 0x89A8, 0xB5C3, 0x89A9, 0x89AA, 0x89AB, /* 0xE0 */
+ 0xB5C4, 0x89AC, 0x89AD, 0x89AE, 0x89AF, 0x89B0, 0x89B1, 0x89B2, /* 0xE0 */
+ 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89B8, 0x89B9, 0x89BA, /* 0xF0 */
+ 0x89BB, 0x89BC, 0x89BD, 0x89BE, 0xB5C5, 0x89BF, 0x89C0, 0x89C1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x89C2, 0x89C3, 0x89C4, 0x89C5, 0x89C6, 0x89C7, 0x89C8, 0x89C9, /* 0x00 */
+ 0x89CA, 0x89CB, 0x89CC, 0x89CD, 0x89CE, 0x89CF, 0x89D0, 0x89D1, /* 0x00 */
+ 0xB5C6, 0x89D2, 0x89D3, 0x89D4, 0x89D5, 0x89D6, 0x89D7, 0x89D8, /* 0x10 */
+ 0xB5C7, 0x89D9, 0x89DA, 0x89DB, 0xB5C8, 0x89DC, 0x89DD, 0x89DE, /* 0x10 */
+ 0xB5C9, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E3, 0x89E4, 0x89E5, /* 0x20 */
+ 0xB5CA, 0xB5CB, 0x89E6, 0xB5CC, 0x89E7, 0x89E8, 0x89E9, 0x89EA, /* 0x20 */
+ 0x89EB, 0x89EC, 0x89ED, 0x89EE, 0xB5CD, 0x89EF, 0x89F0, 0x89F1, /* 0x30 */
+ 0x89F2, 0x89F3, 0x89F4, 0x89F5, 0x89F6, 0x89F7, 0x89F8, 0x89F9, /* 0x30 */
+ 0x89FA, 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x8A41, 0x8A42, 0x8A43, /* 0x40 */
+ 0x8A44, 0x8A45, 0x8A46, 0x8A47, 0x8A48, 0x8A49, 0x8A4A, 0x8A4B, /* 0x40 */
+ 0xB5CE, 0xB5CF, 0x8A4C, 0x8A4D, 0xB5D0, 0x8A4E, 0x8A4F, 0x8A50, /* 0x50 */
+ 0xB5D1, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, 0x8A56, 0x8A57, /* 0x50 */
+ 0xB5D2, 0xB5D3, 0x8A58, 0xB5D4, 0x8A59, 0xB5D5, 0x8A5A, 0x8A61, /* 0x60 */
+ 0x8A62, 0x8A63, 0x8A64, 0x8A65, 0xB5D6, 0x8A66, 0x8A67, 0x8A68, /* 0x60 */
+ 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, 0x8A6E, 0x8A6F, 0x8A70, /* 0x70 */
+ 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, 0x8A76, 0x8A77, 0x8A78, /* 0x70 */
+ 0xB5D7, 0x8A79, 0x8A7A, 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, /* 0x80 */
+ 0xB5D8, 0x8A86, 0x8A87, 0x8A88, 0x8A89, 0x8A8A, 0x8A8B, 0x8A8C, /* 0x80 */
+ 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92, 0x8A93, 0x8A94, /* 0x90 */
+ 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0xB5D9, 0x8A9A, 0x8A9B, /* 0x90 */
+ 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0xB5DA, 0x8AA0, 0x8AA1, 0x8AA2, /* 0xA0 */
+ 0xB5DB, 0x8AA3, 0x8AA4, 0x8AA5, 0xB5DC, 0x8AA6, 0x8AA7, 0x8AA8, /* 0xA0 */
+ 0x8AA9, 0x8AAA, 0x8AAB, 0x8AAC, 0x8AAD, 0xB5DD, 0x8AAE, 0xB5DE, /* 0xB0 */
+ 0x8AAF, 0xB5DF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, 0x8AB4, 0x8AB5, /* 0xB0 */
+ 0xB5E0, 0x8AB6, 0x8AB7, 0x8AB8, 0xB5E1, 0x8AB9, 0x8ABA, 0x8ABB, /* 0xC0 */
+ 0xB5E2, 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, /* 0xC0 */
+ 0xB5E3, 0x8AC3, 0x8AC4, 0x8AC5, 0x8AC6, 0xB5E4, 0x8AC7, 0x8AC8, /* 0xD0 */
+ 0x8AC9, 0x8ACA, 0x8ACB, 0x8ACC, 0xB5E5, 0xB5E6, 0x8ACD, 0x8ACE, /* 0xD0 */
+ 0xB5E7, 0x8ACF, 0x8AD0, 0xB5E8, 0xB5E9, 0x8AD1, 0xB5EA, 0x8AD2, /* 0xE0 */
+ 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0xB5EB, 0xB5EC, 0x8AD7, 0xB5ED, /* 0xE0 */
+ 0x8AD8, 0xB5EE, 0x8AD9, 0x8ADA, 0x8ADB, 0x8ADC, 0x8ADD, 0x8ADE, /* 0xF0 */
+ 0xB5EF, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2, 0x8AE3, 0x8AE4, 0x8AE5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB, 0x8AEC, 0x8AED, /* 0x00 */
+ 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, 0x8AF4, 0x8AF5, /* 0x00 */
+ 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0xB5F0, 0xB5F1, 0x8AFA, 0x8AFB, /* 0x10 */
+ 0xB5F2, 0x8AFC, 0x8AFD, 0xB5F3, 0xB5F4, 0x8AFE, 0x8B41, 0x8B42, /* 0x10 */
+ 0x8B43, 0x8B44, 0x8B45, 0x8B46, 0xB5F5, 0xB5F6, 0x8B47, 0xB5F7, /* 0x20 */
+ 0xB5F8, 0xB5F9, 0xB5FA, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, /* 0x20 */
+ 0xB5FB, 0xB5FC, 0x8B4D, 0x8B4E, 0xB5FD, 0x8B4F, 0x8B50, 0x8B51, /* 0x30 */
+ 0xB5FE, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x8B57, 0x8B58, /* 0x30 */
+ 0xB6A1, 0xB6A2, 0x8B59, 0xB6A3, 0xB6A4, 0xB6A5, 0x8B5A, 0x8B61, /* 0x40 */
+ 0x8B62, 0x8B63, 0x8B64, 0xB6A6, 0xB6A7, 0xB6A8, 0x8B65, 0x8B66, /* 0x40 */
+ 0xB6A9, 0x8B67, 0x8B68, 0x8B69, 0xB6AA, 0x8B6A, 0x8B6B, 0x8B6C, /* 0x50 */
+ 0x8B6D, 0x8B6E, 0x8B6F, 0x8B70, 0xB6AB, 0xB6AC, 0x8B71, 0xB6AD, /* 0x50 */
+ 0xB6AE, 0xB6AF, 0x8B72, 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, /* 0x60 */
+ 0x8B78, 0x8B79, 0x8B7A, 0x8B81, 0x8B82, 0x8B83, 0x8B84, 0x8B85, /* 0x60 */
+ 0x8B86, 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0x8B8D, /* 0x70 */
+ 0x8B8E, 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, 0x8B94, 0x8B95, /* 0x70 */
+ 0x8B96, 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, 0x8B9C, 0x8B9D, /* 0x80 */
+ 0x8B9E, 0x8B9F, 0x8BA0, 0x8BA1, 0x8BA2, 0x8BA3, 0x8BA4, 0x8BA5, /* 0x80 */
+ 0x8BA6, 0x8BA7, 0x8BA8, 0x8BA9, 0x8BAA, 0x8BAB, 0x8BAC, 0x8BAD, /* 0x90 */
+ 0x8BAE, 0x8BAF, 0x8BB0, 0x8BB1, 0x8BB2, 0x8BB3, 0x8BB4, 0x8BB5, /* 0x90 */
+ 0xB6B0, 0xB6B1, 0x8BB6, 0x8BB7, 0xB6B2, 0x8BB8, 0x8BB9, 0x8BBA, /* 0xA0 */
+ 0xB6B3, 0x8BBB, 0xB6B4, 0xB6B5, 0x8BBC, 0x8BBD, 0x8BBE, 0x8BBF, /* 0xA0 */
+ 0xB6B6, 0xB6B7, 0x8BC0, 0xB6B8, 0xB6B9, 0xB6BA, 0x8BC1, 0x8BC2, /* 0xB0 */
+ 0x8BC3, 0x8BC4, 0x8BC5, 0xB6BB, 0xB6BC, 0xB6BD, 0x8BC6, 0x8BC7, /* 0xB0 */
+ 0xB6BE, 0x8BC8, 0x8BC9, 0x8BCA, 0xB6BF, 0x8BCB, 0x8BCC, 0x8BCD, /* 0xC0 */
+ 0x8BCE, 0x8BCF, 0x8BD0, 0x8BD1, 0xB6C0, 0xB6C1, 0x8BD2, 0xB6C2, /* 0xC0 */
+ 0xB6C3, 0xB6C4, 0x8BD3, 0x8BD4, 0x8BD5, 0x8BD6, 0x8BD7, 0x8BD8, /* 0xD0 */
+ 0xB6C5, 0x8BD9, 0x8BDA, 0x8BDB, 0x8BDC, 0x8BDD, 0x8BDE, 0x8BDF, /* 0xD0 */
+ 0x8BE0, 0x8BE1, 0x8BE2, 0x8BE3, 0x8BE4, 0x8BE5, 0x8BE6, 0x8BE7, /* 0xE0 */
+ 0x8BE8, 0x8BE9, 0x8BEA, 0x8BEB, 0xB6C6, 0x8BEC, 0x8BED, 0x8BEE, /* 0xE0 */
+ 0x8BEF, 0x8BF0, 0x8BF1, 0x8BF2, 0x8BF3, 0x8BF4, 0x8BF5, 0x8BF6, /* 0xF0 */
+ 0x8BF7, 0x8BF8, 0x8BF9, 0x8BFA, 0x8BFB, 0x8BFC, 0x8BFD, 0x8BFE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8C41, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C46, 0x8C47, 0x8C48, /* 0x00 */
+ 0x8C49, 0x8C4A, 0x8C4B, 0x8C4C, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, /* 0x00 */
+ 0xB6C7, 0xB6C8, 0x8C51, 0x8C52, 0xB6C9, 0x8C53, 0x8C54, 0x8C55, /* 0x10 */
+ 0xB6CA, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5A, 0x8C61, 0x8C62, /* 0x10 */
+ 0x8C63, 0x8C64, 0x8C65, 0x8C66, 0x8C67, 0xB6CB, 0x8C68, 0x8C69, /* 0x20 */
+ 0x8C6A, 0x8C6B, 0x8C6C, 0x8C6D, 0xB6CC, 0x8C6E, 0x8C6F, 0x8C70, /* 0x20 */
+ 0x8C71, 0x8C72, 0x8C73, 0x8C74, 0xB6CD, 0x8C75, 0x8C76, 0x8C77, /* 0x30 */
+ 0x8C78, 0x8C79, 0x8C7A, 0x8C81, 0x8C82, 0x8C83, 0x8C84, 0x8C85, /* 0x30 */
+ 0x8C86, 0x8C87, 0x8C88, 0x8C89, 0x8C8A, 0x8C8B, 0x8C8C, 0x8C8D, /* 0x40 */
+ 0xB6CE, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, 0x8C93, 0x8C94, /* 0x40 */
+ 0x8C95, 0x8C96, 0x8C97, 0x8C98, 0x8C99, 0x8C9A, 0x8C9B, 0x8C9C, /* 0x50 */
+ 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, 0x8CA4, /* 0x50 */
+ 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0xB6CF, 0x8CA9, 0x8CAA, 0x8CAB, /* 0x60 */
+ 0xB6D0, 0x8CAC, 0x8CAD, 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, /* 0x60 */
+ 0x8CB3, 0x8CB4, 0x8CB5, 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, /* 0x70 */
+ 0x8CBB, 0x8CBC, 0x8CBD, 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, /* 0x70 */
+ 0x8CC3, 0x8CC4, 0x8CC5, 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, /* 0x80 */
+ 0x8CCB, 0x8CCC, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, /* 0x80 */
+ 0x8CD3, 0x8CD4, 0x8CD5, 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, /* 0x90 */
+ 0x8CDB, 0x8CDC, 0x8CDD, 0x8CDE, 0xB6D1, 0xB6D2, 0x8CDF, 0x8CE0, /* 0x90 */
+ 0xB6D3, 0x8CE1, 0x8CE2, 0x8CE3, 0xB6D4, 0x8CE4, 0x8CE5, 0x8CE6, /* 0xA0 */
+ 0x8CE7, 0x8CE8, 0x8CE9, 0xB6D5, 0xB6D6, 0x8CEA, 0x8CEB, 0x8CEC, /* 0xA0 */
+ 0x8CED, 0xB6D7, 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, /* 0xB0 */
+ 0x8CF4, 0x8CF5, 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, /* 0xB0 */
+ 0x8CFC, 0x8CFD, 0x8CFE, 0x8D41, 0x8D42, 0x8D43, 0x8D44, 0x8D45, /* 0xC0 */
+ 0x8D46, 0x8D47, 0x8D48, 0x8D49, 0x8D4A, 0x8D4B, 0x8D4C, 0x8D4D, /* 0xC0 */
+ 0x8D4E, 0x8D4F, 0x8D50, 0x8D51, 0xB6D8, 0x8D52, 0x8D53, 0x8D54, /* 0xD0 */
+ 0x8D55, 0x8D56, 0x8D57, 0x8D58, 0x8D59, 0x8D5A, 0x8D61, 0x8D62, /* 0xD0 */
+ 0x8D63, 0x8D64, 0x8D65, 0x8D66, 0x8D67, 0x8D68, 0x8D69, 0x8D6A, /* 0xE0 */
+ 0x8D6B, 0x8D6C, 0x8D6D, 0x8D6E, 0x8D6F, 0x8D70, 0x8D71, 0x8D72, /* 0xE0 */
+ 0xB6D9, 0x8D73, 0x8D74, 0x8D75, 0xB6DA, 0x8D76, 0x8D77, 0x8D78, /* 0xF0 */
+ 0xB6DB, 0x8D79, 0x8D7A, 0x8D81, 0x8D82, 0x8D83, 0x8D84, 0x8D85 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB6DC, 0xB6DD, 0x8D86, 0x8D87, 0x8D88, 0xB6DE, 0x8D89, 0x8D8A, /* 0x00 */
+ 0x8D8B, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D91, 0x8D92, /* 0x00 */
+ 0x8D93, 0x8D94, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, 0x8D9A, /* 0x10 */
+ 0x8D9B, 0x8D9C, 0x8D9D, 0x8D9E, 0x8D9F, 0x8DA0, 0x8DA1, 0x8DA2, /* 0x10 */
+ 0x8DA3, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, /* 0x20 */
+ 0xB6DF, 0xB6E0, 0x8DAB, 0x8DAC, 0xB6E1, 0x8DAD, 0x8DAE, 0xB6E2, /* 0x20 */
+ 0xB6E3, 0x8DAF, 0x8DB0, 0x8DB1, 0x8DB2, 0x8DB3, 0x8DB4, 0x8DB5, /* 0x30 */
+ 0xB6E4, 0xB6E5, 0x8DB6, 0xB6E6, 0x8DB7, 0x8DB8, 0x8DB9, 0x8DBA, /* 0x30 */
+ 0x8DBB, 0x8DBC, 0x8DBD, 0x8DBE, 0xB6E7, 0x8DBF, 0x8DC0, 0x8DC1, /* 0x40 */
+ 0xB6E8, 0x8DC2, 0x8DC3, 0x8DC4, 0xB6E9, 0x8DC5, 0x8DC6, 0x8DC7, /* 0x40 */
+ 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCB, 0xB6EA, 0xB6EB, 0x8DCC, 0x8DCD, /* 0x50 */
+ 0x8DCE, 0x8DCF, 0x8DD0, 0x8DD1, 0x8DD2, 0x8DD3, 0x8DD4, 0x8DD5, /* 0x50 */
+ 0xB6EC, 0x8DD6, 0x8DD7, 0x8DD8, 0xB6ED, 0x8DD9, 0x8DDA, 0x8DDB, /* 0x60 */
+ 0xB6EE, 0x8DDC, 0x8DDD, 0x8DDE, 0x8DDF, 0x8DE0, 0x8DE1, 0x8DE2, /* 0x60 */
+ 0xB6EF, 0xB6F0, 0x8DE3, 0xB6F1, 0x8DE4, 0xB6F2, 0x8DE5, 0x8DE6, /* 0x70 */
+ 0x8DE7, 0x8DE8, 0x8DE9, 0x8DEA, 0xB6F3, 0xB6F4, 0x8DEB, 0x8DEC, /* 0x70 */
+ 0xB6F5, 0x8DED, 0x8DEE, 0x8DEF, 0xB6F6, 0x8DF0, 0x8DF1, 0x8DF2, /* 0x80 */
+ 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0xB6F7, 0xB6F8, 0x8DF7, 0xB6F9, /* 0x80 */
+ 0xB6FA, 0xB6FB, 0xB6FC, 0x8DF8, 0x8DF9, 0x8DFA, 0xB6FD, 0xB6FE, /* 0x90 */
+ 0xB7A1, 0xB7A2, 0x8DFB, 0x8DFC, 0xB7A3, 0x8DFD, 0x8DFE, 0x8E41, /* 0x90 */
+ 0xB7A4, 0x8E42, 0x8E43, 0x8E44, 0x8E45, 0x8E46, 0x8E47, 0x8E48, /* 0xA0 */
+ 0xB7A5, 0xB7A6, 0x8E49, 0xB7A7, 0xB7A8, 0xB7A9, 0x8E4A, 0x8E4B, /* 0xA0 */
+ 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F, 0xB7AA, 0xB7AB, 0x8E50, 0x8E51, /* 0xB0 */
+ 0xB7AC, 0x8E52, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, /* 0xB0 */
+ 0x8E59, 0x8E5A, 0x8E61, 0x8E62, 0x8E63, 0x8E64, 0x8E65, 0xB7AD, /* 0xC0 */
+ 0x8E66, 0xB7AE, 0x8E67, 0x8E68, 0x8E69, 0x8E6A, 0x8E6B, 0x8E6C, /* 0xC0 */
+ 0x8E6D, 0x8E6E, 0x8E6F, 0x8E70, 0x8E71, 0x8E72, 0x8E73, 0x8E74, /* 0xD0 */
+ 0x8E75, 0x8E76, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E81, 0x8E82, /* 0xD0 */
+ 0x8E83, 0x8E84, 0x8E85, 0x8E86, 0x8E87, 0x8E88, 0x8E89, 0x8E8A, /* 0xE0 */
+ 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0xB7AF, 0xB7B0, 0x8E8F, 0x8E90, /* 0xE0 */
+ 0xB7B1, 0x8E91, 0x8E92, 0x8E93, 0xB7B2, 0x8E94, 0x8E95, 0x8E96, /* 0xF0 */
+ 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0xB7B3, 0xB7B4, 0x8E9B, 0xB7B5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB7B6, 0xB7B7, 0x8E9C, 0x8E9D, 0x8E9E, 0x8E9F, 0x8EA0, 0xB7B8, /* 0x00 */
+ 0xB7B9, 0xB7BA, 0x8EA1, 0x8EA2, 0xB7BB, 0x8EA3, 0x8EA4, 0x8EA5, /* 0x00 */
+ 0xB7BC, 0x8EA6, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAB, 0x8EAC, /* 0x10 */
+ 0xB7BD, 0xB7BE, 0x8EAD, 0xB7BF, 0x8EAE, 0xB7C0, 0x8EAF, 0x8EB0, /* 0x10 */
+ 0x8EB1, 0x8EB2, 0x8EB3, 0x8EB4, 0xB7C1, 0xB7C2, 0x8EB5, 0x8EB6, /* 0x20 */
+ 0xB7C3, 0x8EB7, 0x8EB8, 0x8EB9, 0xB7C4, 0x8EBA, 0x8EBB, 0x8EBC, /* 0x20 */
+ 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0xB7C5, 0xB7C6, 0x8EC1, 0xB7C7, /* 0x30 */
+ 0xB7C8, 0xB7C9, 0x8EC2, 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, /* 0x30 */
+ 0xB7CA, 0x8EC8, 0x8EC9, 0x8ECA, 0xB7CB, 0x8ECB, 0x8ECC, 0x8ECD, /* 0x40 */
+ 0x8ECE, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, 0x8ED3, 0x8ED4, 0x8ED5, /* 0x40 */
+ 0x8ED6, 0xB7CC, 0x8ED7, 0xB7CD, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDB, /* 0x50 */
+ 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0xB7CE, 0xB7CF, 0x8EE0, 0x8EE1, /* 0x50 */
+ 0xB7D0, 0x8EE2, 0x8EE3, 0x8EE4, 0xB7D1, 0x8EE5, 0x8EE6, 0x8EE7, /* 0x60 */
+ 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0xB7D2, 0xB7D3, 0x8EEC, 0xB7D4, /* 0x60 */
+ 0x8EED, 0xB7D5, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, /* 0x70 */
+ 0xB7D6, 0x8EF4, 0x8EF5, 0x8EF6, 0xB7D7, 0x8EF7, 0x8EF8, 0x8EF9, /* 0x70 */
+ 0x8EFA, 0x8EFB, 0x8EFC, 0x8EFD, 0x8EFE, 0x8F41, 0x8F42, 0x8F43, /* 0x80 */
+ 0x8F44, 0x8F45, 0x8F46, 0x8F47, 0x8F48, 0xB7D8, 0x8F49, 0x8F4A, /* 0x80 */
+ 0x8F4B, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, /* 0x90 */
+ 0x8F53, 0x8F54, 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, /* 0x90 */
+ 0x8F61, 0x8F62, 0x8F63, 0x8F64, 0x8F65, 0x8F66, 0x8F67, 0x8F68, /* 0xA0 */
+ 0xB7D9, 0x8F69, 0x8F6A, 0x8F6B, 0x8F6C, 0x8F6D, 0x8F6E, 0x8F6F, /* 0xA0 */
+ 0xB7DA, 0x8F70, 0x8F71, 0x8F72, 0xB7DB, 0x8F73, 0x8F74, 0x8F75, /* 0xB0 */
+ 0xB7DC, 0x8F76, 0x8F77, 0x8F78, 0x8F79, 0x8F7A, 0x8F81, 0x8F82, /* 0xB0 */
+ 0xB7DD, 0xB7DE, 0x8F83, 0xB7DF, 0x8F84, 0xB7E0, 0x8F85, 0x8F86, /* 0xC0 */
+ 0x8F87, 0x8F88, 0x8F89, 0x8F8A, 0xB7E1, 0x8F8B, 0x8F8C, 0x8F8D, /* 0xC0 */
+ 0xB7E2, 0x8F8E, 0x8F8F, 0x8F90, 0xB7E3, 0x8F91, 0x8F92, 0x8F93, /* 0xD0 */
+ 0x8F94, 0x8F95, 0x8F96, 0x8F97, 0x8F98, 0xB7E4, 0x8F99, 0xB7E5, /* 0xD0 */
+ 0x8F9A, 0xB7E6, 0x8F9B, 0x8F9C, 0x8F9D, 0x8F9E, 0x8F9F, 0x8FA0, /* 0xE0 */
+ 0xB7E7, 0xB7E8, 0x8FA1, 0x8FA2, 0xB7E9, 0x8FA3, 0x8FA4, 0x8FA5, /* 0xE0 */
+ 0xB7EA, 0x8FA6, 0x8FA7, 0x8FA8, 0x8FA9, 0x8FAA, 0x8FAB, 0x8FAC, /* 0xF0 */
+ 0xB7EB, 0xB7EC, 0x8FAD, 0xB7ED, 0x8FAE, 0xB7EE, 0x8FAF, 0x8FB0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_B9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8FB1, 0x8FB2, 0x8FB3, 0x8FB4, 0xB7EF, 0x8FB5, 0x8FB6, 0x8FB7, /* 0x00 */
+ 0x8FB8, 0x8FB9, 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBD, 0x8FBE, 0x8FBF, /* 0x00 */
+ 0x8FC0, 0x8FC1, 0x8FC2, 0x8FC3, 0x8FC4, 0x8FC5, 0x8FC6, 0x8FC7, /* 0x10 */
+ 0xB7F0, 0x8FC8, 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, 0x8FCE, /* 0x10 */
+ 0xB7F1, 0x8FCF, 0x8FD0, 0x8FD1, 0x8FD2, 0x8FD3, 0x8FD4, 0x8FD5, /* 0x20 */
+ 0x8FD6, 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA, 0x8FDB, 0x8FDC, 0x8FDD, /* 0x20 */
+ 0x8FDE, 0x8FDF, 0x8FE0, 0x8FE1, 0x8FE2, 0x8FE3, 0x8FE4, 0x8FE5, /* 0x30 */
+ 0x8FE6, 0x8FE7, 0x8FE8, 0x8FE9, 0xB7F2, 0xB7F3, 0x8FEA, 0x8FEB, /* 0x30 */
+ 0xB7F4, 0x8FEC, 0x8FED, 0x8FEE, 0xB7F5, 0x8FEF, 0x8FF0, 0x8FF1, /* 0x40 */
+ 0x8FF2, 0x8FF3, 0x8FF4, 0x8FF5, 0xB7F6, 0x8FF6, 0x8FF7, 0xB7F7, /* 0x40 */
+ 0x8FF8, 0xB7F8, 0x8FF9, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFD, 0x8FFE, /* 0x50 */
+ 0xB7F9, 0xB7FA, 0x9041, 0x9042, 0xB7FB, 0x9043, 0x9044, 0x9045, /* 0x50 */
+ 0xB7FC, 0x9046, 0x9047, 0x9048, 0x9049, 0x904A, 0x904B, 0x904C, /* 0x60 */
+ 0xB7FD, 0xB7FE, 0x904D, 0xB8A1, 0x904E, 0xB8A2, 0x904F, 0x9050, /* 0x60 */
+ 0x9051, 0x9052, 0x9053, 0x9054, 0xB8A3, 0xB8A4, 0x9055, 0x9056, /* 0x70 */
+ 0xB8A5, 0x9057, 0x9058, 0x9059, 0xB8A6, 0x905A, 0x9061, 0x9062, /* 0x70 */
+ 0x9063, 0x9064, 0x9065, 0x9066, 0xB8A7, 0xB8A8, 0x9067, 0xB8A9, /* 0x80 */
+ 0x9068, 0xB8AA, 0xB8AB, 0x9069, 0x906A, 0xB8AC, 0xB8AD, 0x906B, /* 0x80 */
+ 0x906C, 0x906D, 0x906E, 0x906F, 0x9070, 0x9071, 0x9072, 0x9073, /* 0x90 */
+ 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079, 0x907A, 0x9081, /* 0x90 */
+ 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, 0x9088, 0x9089, /* 0xA0 */
+ 0x908A, 0x908B, 0x908C, 0x908D, 0xB8AE, 0xB8AF, 0x908E, 0x908F, /* 0xA0 */
+ 0xB8B0, 0x9090, 0x9091, 0x9092, 0xB8B1, 0x9093, 0x9094, 0x9095, /* 0xB0 */
+ 0x9096, 0x9097, 0x9098, 0x9099, 0xB8B2, 0xB8B3, 0x909A, 0xB8B4, /* 0xB0 */
+ 0x909B, 0xB8B5, 0x909C, 0x909D, 0x909E, 0x909F, 0x90A0, 0x90A1, /* 0xC0 */
+ 0xB8B6, 0xB8B7, 0x90A2, 0x90A3, 0xB8B8, 0x90A4, 0xB8B9, 0xB8BA, /* 0xC0 */
+ 0xB8BB, 0xB8BC, 0xB8BD, 0x90A5, 0x90A6, 0x90A7, 0x90A8, 0x90A9, /* 0xD0 */
+ 0xB8BE, 0xB8BF, 0x90AA, 0xB8C0, 0x90AB, 0xB8C1, 0xB8C2, 0x90AC, /* 0xD0 */
+ 0x90AD, 0xB8C3, 0x90AE, 0xB8C4, 0xB8C5, 0xB8C6, 0x90AF, 0x90B0, /* 0xE0 */
+ 0xB8C7, 0x90B1, 0x90B2, 0x90B3, 0xB8C8, 0x90B4, 0x90B5, 0x90B6, /* 0xE0 */
+ 0x90B7, 0x90B8, 0x90B9, 0x90BA, 0xB8C9, 0xB8CA, 0x90BB, 0xB8CB, /* 0xF0 */
+ 0xB8CC, 0xB8CD, 0xB8CE, 0x90BC, 0x90BD, 0x90BE, 0x90BF, 0x90C0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_BA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB8CF, 0xB8D0, 0x90C1, 0x90C2, 0x90C3, 0x90C4, 0x90C5, 0x90C6, /* 0x00 */
+ 0xB8D1, 0x90C7, 0x90C8, 0x90C9, 0x90CA, 0x90CB, 0x90CC, 0x90CD, /* 0x00 */
+ 0x90CE, 0x90CF, 0x90D0, 0x90D1, 0x90D2, 0xB8D2, 0x90D3, 0x90D4, /* 0x10 */
+ 0x90D5, 0x90D6, 0x90D7, 0x90D8, 0x90D9, 0x90DA, 0x90DB, 0x90DC, /* 0x10 */
+ 0x90DD, 0x90DE, 0x90DF, 0x90E0, 0x90E1, 0x90E2, 0x90E3, 0x90E4, /* 0x20 */
+ 0x90E5, 0x90E6, 0x90E7, 0x90E8, 0x90E9, 0x90EA, 0x90EB, 0x90EC, /* 0x20 */
+ 0x90ED, 0x90EE, 0x90EF, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F4, /* 0x30 */
+ 0xB8D3, 0xB8D4, 0x90F5, 0x90F6, 0xB8D5, 0x90F7, 0x90F8, 0x90F9, /* 0x30 */
+ 0xB8D6, 0x90FA, 0xB8D7, 0x90FB, 0x90FC, 0x90FD, 0x90FE, 0x9141, /* 0x40 */
+ 0xB8D8, 0xB8D9, 0x9142, 0xB8DA, 0x9143, 0xB8DB, 0xB8DC, 0x9144, /* 0x40 */
+ 0x9145, 0x9146, 0x9147, 0xB8DD, 0xB8DE, 0xB8DF, 0x9148, 0x9149, /* 0x50 */
+ 0xB8E0, 0x914A, 0x914B, 0x914C, 0xB8E1, 0x914D, 0x914E, 0x914F, /* 0x50 */
+ 0x9150, 0x9151, 0x9152, 0x9153, 0xB8E2, 0xB8E3, 0x9154, 0xB8E4, /* 0x60 */
+ 0xB8E5, 0xB8E6, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, 0x915A, /* 0x60 */
+ 0xB8E7, 0xB8E8, 0x9161, 0x9162, 0xB8E9, 0x9163, 0x9164, 0x9165, /* 0x70 */
+ 0xB8EA, 0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B, 0x916C, /* 0x70 */
+ 0x916D, 0x916E, 0x916F, 0xB8EB, 0xB8EC, 0xB8ED, 0x9170, 0xB8EE, /* 0x80 */
+ 0x9171, 0x9172, 0x9173, 0x9174, 0xB8EF, 0x9175, 0x9176, 0x9177, /* 0x80 */
+ 0x9178, 0x9179, 0x917A, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185, /* 0x90 */
+ 0x9186, 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, /* 0x90 */
+ 0x918E, 0x918F, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195, /* 0xA0 */
+ 0xB8F0, 0xB8F1, 0x9196, 0xB8F2, 0xB8F3, 0x9197, 0x9198, 0x9199, /* 0xA0 */
+ 0xB8F4, 0x919A, 0xB8F5, 0x919B, 0x919C, 0x919D, 0x919E, 0x919F, /* 0xB0 */
+ 0xB8F6, 0xB8F7, 0x91A0, 0xB8F8, 0x91A1, 0xB8F9, 0x91A2, 0x91A3, /* 0xB0 */
+ 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0xB8FA, 0x91A8, 0x91A9, 0x91AA, /* 0xC0 */
+ 0xB8FB, 0x91AB, 0x91AC, 0x91AD, 0x91AE, 0x91AF, 0x91B0, 0x91B1, /* 0xC0 */
+ 0x91B2, 0x91B3, 0x91B4, 0x91B5, 0x91B6, 0x91B7, 0x91B8, 0x91B9, /* 0xD0 */
+ 0xB8FC, 0xB8FD, 0x91BA, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, /* 0xD0 */
+ 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, 0x91C5, 0x91C6, 0x91C7, /* 0xE0 */
+ 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, /* 0xE0 */
+ 0x91D0, 0x91D1, 0x91D2, 0x91D3, 0x91D4, 0x91D5, 0x91D6, 0x91D7, /* 0xF0 */
+ 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0xB8FE, 0x91DC, 0x91DD, 0x91DE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_BB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB9A1, 0x91DF, 0x91E0, 0x91E1, 0xB9A2, 0x91E2, 0x91E3, 0x91E4, /* 0x00 */
+ 0x91E5, 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0xB9A3, 0x91EA, 0xB9A4, /* 0x00 */
+ 0x91EB, 0xB9A5, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, /* 0x10 */
+ 0xB9A6, 0x91F2, 0x91F3, 0x91F4, 0xB9A7, 0x91F5, 0x91F6, 0x91F7, /* 0x10 */
+ 0xB9A8, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, /* 0x20 */
+ 0x9241, 0xB9A9, 0x9242, 0xB9AA, 0x9243, 0x9244, 0x9245, 0x9246, /* 0x20 */
+ 0x9247, 0x9248, 0x9249, 0x924A, 0xB9AB, 0xB9AC, 0xB9AD, 0x924B, /* 0x30 */
+ 0xB9AE, 0x924C, 0x924D, 0xB9AF, 0xB9B0, 0xB9B1, 0xB9B2, 0x924E, /* 0x30 */
+ 0x924F, 0x9250, 0x9251, 0x9252, 0xB9B3, 0xB9B4, 0x9253, 0xB9B5, /* 0x40 */
+ 0x9254, 0xB9B6, 0x9255, 0x9256, 0x9257, 0xB9B7, 0x9258, 0xB9B8, /* 0x40 */
+ 0xB9B9, 0x9259, 0x925A, 0x9261, 0xB9BA, 0x9262, 0x9263, 0x9264, /* 0x50 */
+ 0xB9BB, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926A, 0x926B, /* 0x50 */
+ 0x926C, 0xB9BC, 0x926D, 0xB9BD, 0x926E, 0x926F, 0x9270, 0x9271, /* 0x60 */
+ 0x9272, 0x9273, 0x9274, 0x9275, 0xB9BE, 0x9276, 0x9277, 0x9278, /* 0x60 */
+ 0x9279, 0x927A, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, /* 0x70 */
+ 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, 0x928E, /* 0x70 */
+ 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, /* 0x80 */
+ 0xB9BF, 0x9297, 0x9298, 0x9299, 0xB9C0, 0x929A, 0x929B, 0x929C, /* 0x80 */
+ 0xB9C1, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, /* 0x90 */
+ 0x92A4, 0x92A5, 0x92A6, 0x92A7, 0x92A8, 0x92A9, 0x92AA, 0x92AB, /* 0x90 */
+ 0x92AC, 0x92AD, 0x92AE, 0x92AF, 0xB9C2, 0x92B0, 0x92B1, 0x92B2, /* 0xA0 */
+ 0xB9C3, 0x92B3, 0x92B4, 0x92B5, 0xB9C4, 0x92B6, 0x92B7, 0x92B8, /* 0xA0 */
+ 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0xB9C5, 0x92BD, 0x92BE, 0xB9C6, /* 0xB0 */
+ 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, /* 0xB0 */
+ 0xB9C7, 0x92C7, 0x92C8, 0x92C9, 0xB9C8, 0x92CA, 0x92CB, 0x92CC, /* 0xC0 */
+ 0xB9C9, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, 0x92D3, /* 0xC0 */
+ 0xB9CA, 0x92D4, 0x92D5, 0xB9CB, 0x92D6, 0x92D7, 0x92D8, 0x92D9, /* 0xD0 */
+ 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, /* 0xD0 */
+ 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0x92E9, /* 0xE0 */
+ 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0x92F1, /* 0xE0 */
+ 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, /* 0xF0 */
+ 0xB9CC, 0xB9CD, 0x92FA, 0x92FB, 0xB9CE, 0x92FC, 0x92FD, 0xB9CF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_BC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB9D0, 0x92FE, 0xB9D1, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, /* 0x00 */
+ 0xB9D2, 0xB9D3, 0x9346, 0xB9D4, 0xB9D5, 0xB9D6, 0x9347, 0xB9D7, /* 0x00 */
+ 0x9348, 0xB9D8, 0x9349, 0x934A, 0xB9D9, 0xB9DA, 0xB9DB, 0xB9DC, /* 0x10 */
+ 0xB9DD, 0x934B, 0x934C, 0xB9DE, 0xB9DF, 0xB9E0, 0xB9E1, 0xB9E2, /* 0x10 */
+ 0x934D, 0x934E, 0x934F, 0x9350, 0xB9E3, 0xB9E4, 0x9351, 0xB9E5, /* 0x20 */
+ 0x9352, 0xB9E6, 0x9353, 0x9354, 0x9355, 0xB9E7, 0x9356, 0x9357, /* 0x20 */
+ 0xB9E8, 0xB9E9, 0x9358, 0x9359, 0xB9EA, 0x935A, 0x9361, 0x9362, /* 0x30 */
+ 0xB9EB, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, /* 0x30 */
+ 0xB9EC, 0xB9ED, 0x936A, 0xB9EE, 0xB9EF, 0xB9F0, 0x936B, 0x936C, /* 0x40 */
+ 0x936D, 0xB9F1, 0x936E, 0x936F, 0xB9F2, 0xB9F3, 0x9370, 0x9371, /* 0x40 */
+ 0xB9F4, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, /* 0x50 */
+ 0x9379, 0x937A, 0x9381, 0x9382, 0x9383, 0xB9F5, 0x9384, 0x9385, /* 0x50 */
+ 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, 0x938C, 0x938D, /* 0x60 */
+ 0x938E, 0x938F, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, /* 0x60 */
+ 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, /* 0x70 */
+ 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4, 0x93A5, /* 0x70 */
+ 0x93A6, 0x93A7, 0x93A8, 0x93A9, 0xB9F6, 0xB9F7, 0x93AA, 0x93AB, /* 0x80 */
+ 0xB9F8, 0x93AC, 0x93AD, 0xB9F9, 0xB9FA, 0x93AE, 0xB9FB, 0x93AF, /* 0x80 */
+ 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0xB9FC, 0xB9FD, 0x93B4, 0xB9FE, /* 0x90 */
+ 0x93B5, 0xBAA1, 0xBAA2, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, /* 0x90 */
+ 0xBAA3, 0xBAA4, 0x93BB, 0x93BC, 0xBAA5, 0x93BD, 0x93BE, 0xBAA6, /* 0xA0 */
+ 0xBAA7, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, /* 0xA0 */
+ 0xBAA8, 0xBAA9, 0x93C6, 0xBAAA, 0xBAAB, 0xBAAC, 0x93C7, 0x93C8, /* 0xB0 */
+ 0x93C9, 0x93CA, 0x93CB, 0x93CC, 0xBAAD, 0xBAAE, 0x93CD, 0x93CE, /* 0xB0 */
+ 0xBAAF, 0x93CF, 0x93D0, 0x93D1, 0xBAB0, 0x93D2, 0x93D3, 0x93D4, /* 0xC0 */
+ 0x93D5, 0x93D6, 0x93D7, 0x93D8, 0x93D9, 0xBAB1, 0x93DA, 0xBAB2, /* 0xC0 */
+ 0xBAB3, 0xBAB4, 0x93DB, 0x93DC, 0x93DD, 0xBAB5, 0x93DE, 0x93DF, /* 0xD0 */
+ 0xBAB6, 0x93E0, 0x93E1, 0x93E2, 0xBAB7, 0x93E3, 0x93E4, 0x93E5, /* 0xD0 */
+ 0x93E6, 0x93E7, 0x93E8, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, /* 0xE0 */
+ 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, /* 0xE0 */
+ 0x93F6, 0x93F7, 0x93F8, 0x93F9, 0xBAB8, 0xBAB9, 0xBABA, 0x93FA, /* 0xF0 */
+ 0xBABB, 0x93FB, 0x93FC, 0x93FD, 0xBABC, 0x93FE, 0x9441, 0x9442 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_BD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9443, 0x9444, 0x9445, 0x9446, 0xBABD, 0xBABE, 0x9447, 0xBABF, /* 0x00 */
+ 0x9448, 0xBAC0, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, /* 0x00 */
+ 0xBAC1, 0x944F, 0x9450, 0x9451, 0xBAC2, 0x9452, 0x9453, 0x9454, /* 0x10 */
+ 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x9461, 0x9462, /* 0x10 */
+ 0x9463, 0x9464, 0x9465, 0x9466, 0xBAC3, 0x9467, 0x9468, 0x9469, /* 0x20 */
+ 0x946A, 0x946B, 0x946C, 0x946D, 0xBAC4, 0x946E, 0x946F, 0x9470, /* 0x20 */
+ 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, /* 0x30 */
+ 0x9479, 0x947A, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, /* 0x30 */
+ 0xBAC5, 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, 0x948D, /* 0x40 */
+ 0xBAC6, 0xBAC7, 0x948E, 0x948F, 0xBAC8, 0x9490, 0x9491, 0x9492, /* 0x40 */
+ 0xBAC9, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, /* 0x50 */
+ 0xBACA, 0xBACB, 0x949A, 0x949B, 0x949C, 0x949D, 0x949E, 0x949F, /* 0x50 */
+ 0x94A0, 0x94A1, 0x94A2, 0x94A3, 0xBACC, 0x94A4, 0x94A5, 0x94A6, /* 0x60 */
+ 0xBACD, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, 0x94AD, /* 0x60 */
+ 0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, 0x94B4, 0x94B5, /* 0x70 */
+ 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, 0x94BD, /* 0x70 */
+ 0xBACE, 0xBACF, 0x94BE, 0x94BF, 0xBAD0, 0x94C0, 0x94C1, 0xBAD1, /* 0x80 */
+ 0xBAD2, 0xBAD3, 0xBAD4, 0x94C2, 0x94C3, 0x94C4, 0x94C5, 0x94C6, /* 0x80 */
+ 0xBAD5, 0xBAD6, 0x94C7, 0xBAD7, 0x94C8, 0xBAD8, 0x94C9, 0x94CA, /* 0x90 */
+ 0x94CB, 0xBAD9, 0xBADA, 0x94CC, 0xBADB, 0x94CD, 0x94CE, 0x94CF, /* 0x90 */
+ 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0xBADC, 0x94D4, 0x94D5, 0x94D6, /* 0xA0 */
+ 0x94D7, 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, 0x94DD, 0x94DE, /* 0xA0 */
+ 0xBADD, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x94E3, 0x94E4, 0x94E5, /* 0xB0 */
+ 0xBADE, 0x94E6, 0x94E7, 0x94E8, 0x94E9, 0x94EA, 0x94EB, 0x94EC, /* 0xB0 */
+ 0x94ED, 0x94EE, 0x94EF, 0x94F0, 0x94F1, 0x94F2, 0x94F3, 0x94F4, /* 0xC0 */
+ 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x94F9, 0x94FA, 0x94FB, 0x94FC, /* 0xC0 */
+ 0x94FD, 0x94FE, 0x9541, 0x9542, 0xBADF, 0xBAE0, 0x9543, 0x9544, /* 0xD0 */
+ 0xBAE1, 0x9545, 0x9546, 0x9547, 0xBAE2, 0x9548, 0x9549, 0x954A, /* 0xD0 */
+ 0x954B, 0x954C, 0x954D, 0x954E, 0x954F, 0x9550, 0x9551, 0x9552, /* 0xE0 */
+ 0x9553, 0xBAE3, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, /* 0xE0 */
+ 0xBAE4, 0x955A, 0x9561, 0x9562, 0xBAE5, 0x9563, 0x9564, 0x9565, /* 0xF0 */
+ 0xBAE6, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_BE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBAE7, 0x956D, 0x956E, 0xBAE8, 0x956F, 0xBAE9, 0x9570, 0x9571, /* 0x00 */
+ 0x9572, 0x9573, 0x9574, 0x9575, 0xBAEA, 0xBAEB, 0x9576, 0x9577, /* 0x00 */
+ 0xBAEC, 0x9578, 0x9579, 0x957A, 0xBAED, 0x9581, 0x9582, 0x9583, /* 0x10 */
+ 0x9584, 0x9585, 0x9586, 0x9587, 0xBAEE, 0xBAEF, 0x9588, 0xBAF0, /* 0x10 */
+ 0x9589, 0x958A, 0x958B, 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, /* 0x20 */
+ 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, /* 0x20 */
+ 0x9599, 0x959A, 0x959B, 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, /* 0x30 */
+ 0x95A1, 0x95A2, 0x95A3, 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, /* 0x30 */
+ 0x95A9, 0x95AA, 0x95AB, 0x95AC, 0xBAF1, 0xBAF2, 0x95AD, 0x95AE, /* 0x40 */
+ 0xBAF3, 0x95AF, 0x95B0, 0x95B1, 0xBAF4, 0x95B2, 0xBAF5, 0x95B3, /* 0x40 */
+ 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0xBAF6, 0xBAF7, 0x95B8, 0xBAF8, /* 0x50 */
+ 0x95B9, 0xBAF9, 0xBAFA, 0xBAFB, 0x95BA, 0x95BB, 0x95BC, 0x95BD, /* 0x50 */
+ 0xBAFC, 0xBAFD, 0x95BE, 0x95BF, 0xBAFE, 0x95C0, 0x95C1, 0x95C2, /* 0x60 */
+ 0xBBA1, 0x95C3, 0xBBA2, 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, /* 0x60 */
+ 0xBBA3, 0xBBA4, 0x95C9, 0xBBA5, 0xBBA6, 0xBBA7, 0x95CA, 0x95CB, /* 0x70 */
+ 0x95CC, 0x95CD, 0x95CE, 0xBBA8, 0xBBA9, 0xBBAA, 0x95CF, 0x95D0, /* 0x70 */
+ 0xBBAB, 0x95D1, 0x95D2, 0x95D3, 0xBBAC, 0x95D4, 0x95D5, 0x95D6, /* 0x80 */
+ 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0xBBAD, 0xBBAE, 0x95DB, 0xBBAF, /* 0x80 */
+ 0xBBB0, 0xBBB1, 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, /* 0x90 */
+ 0xBBB2, 0xBBB3, 0x95E2, 0x95E3, 0x95E4, 0x95E5, 0x95E6, 0x95E7, /* 0x90 */
+ 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0x95ED, 0x95EE, 0x95EF, /* 0xA0 */
+ 0xBBB4, 0x95F0, 0x95F1, 0x95F2, 0x95F3, 0x95F4, 0x95F5, 0x95F6, /* 0xA0 */
+ 0x95F7, 0x95F8, 0x95F9, 0x95FA, 0x95FB, 0x95FC, 0x95FD, 0x95FE, /* 0xB0 */
+ 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, 0x9648, /* 0xB0 */
+ 0x9649, 0x964A, 0x964B, 0x964C, 0x964D, 0x964E, 0x964F, 0x9650, /* 0xC0 */
+ 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, /* 0xC0 */
+ 0xBBB5, 0xBBB6, 0x9659, 0x965A, 0xBBB7, 0x9661, 0x9662, 0xBBB8, /* 0xD0 */
+ 0xBBB9, 0x9663, 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, /* 0xD0 */
+ 0xBBBA, 0x966A, 0x966B, 0xBBBB, 0xBBBC, 0xBBBD, 0x966C, 0x966D, /* 0xE0 */
+ 0x966E, 0x966F, 0x9670, 0x9671, 0xBBBE, 0x9672, 0x9673, 0x9674, /* 0xE0 */
+ 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967A, 0x9681, 0x9682, /* 0xF0 */
+ 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, 0x9688, 0x9689, 0x968A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_BF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x968B, 0xBBBF, 0x968C, 0x968D, 0x968E, 0x968F, 0x9690, 0x9691, /* 0x00 */
+ 0xBBC0, 0xBBC1, 0x9692, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, /* 0x00 */
+ 0x9698, 0x9699, 0x969A, 0x969B, 0x969C, 0x969D, 0x969E, 0x969F, /* 0x10 */
+ 0xBBC2, 0xBBC3, 0x96A0, 0xBBC4, 0xBBC5, 0xBBC6, 0x96A1, 0x96A2, /* 0x10 */
+ 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A7, 0x96A8, 0x96A9, 0x96AA, /* 0x20 */
+ 0x96AB, 0x96AC, 0x96AD, 0x96AE, 0x96AF, 0x96B0, 0x96B1, 0x96B2, /* 0x20 */
+ 0x96B3, 0x96B4, 0x96B5, 0x96B6, 0x96B7, 0x96B8, 0x96B9, 0x96BA, /* 0x30 */
+ 0x96BB, 0x96BC, 0x96BD, 0x96BE, 0x96BF, 0x96C0, 0x96C1, 0x96C2, /* 0x30 */
+ 0xBBC7, 0xBBC8, 0x96C3, 0x96C4, 0xBBC9, 0x96C5, 0x96C6, 0x96C7, /* 0x40 */
+ 0xBBCA, 0x96C8, 0x96C9, 0x96CA, 0x96CB, 0x96CC, 0x96CD, 0x96CE, /* 0x40 */
+ 0xBBCB, 0xBBCC, 0x96CF, 0x96D0, 0x96D1, 0xBBCD, 0x96D2, 0x96D3, /* 0x50 */
+ 0x96D4, 0x96D5, 0x96D6, 0x96D7, 0x96D8, 0x96D9, 0x96DA, 0x96DB, /* 0x50 */
+ 0x96DC, 0x96DD, 0x96DE, 0x96DF, 0x96E0, 0x96E1, 0x96E2, 0x96E3, /* 0x60 */
+ 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96E8, 0x96E9, 0x96EA, 0x96EB, /* 0x60 */
+ 0x96EC, 0x96ED, 0x96EE, 0x96EF, 0x96F0, 0x96F1, 0x96F2, 0x96F3, /* 0x70 */
+ 0x96F4, 0x96F5, 0x96F6, 0x96F7, 0x96F8, 0x96F9, 0x96FA, 0x96FB, /* 0x70 */
+ 0x96FC, 0x96FD, 0x96FE, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, /* 0x80 */
+ 0x9746, 0x9747, 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, /* 0x80 */
+ 0x974E, 0x974F, 0x9750, 0x9751, 0xBBCE, 0x9752, 0x9753, 0x9754, /* 0x90 */
+ 0x9755, 0x9756, 0x9757, 0x9758, 0x9759, 0x975A, 0x9761, 0x9762, /* 0x90 */
+ 0x9763, 0x9764, 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976A, /* 0xA0 */
+ 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0x9772, /* 0xA0 */
+ 0xBBCF, 0x9773, 0x9774, 0x9775, 0x9776, 0x9777, 0x9778, 0x9779, /* 0xB0 */
+ 0x977A, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, /* 0xB0 */
+ 0x9788, 0x9789, 0x978A, 0x978B, 0x978C, 0xBBD0, 0x978D, 0x978E, /* 0xC0 */
+ 0x978F, 0x9790, 0x9791, 0x9792, 0xBBD1, 0xBBD2, 0x9793, 0x9794, /* 0xC0 */
+ 0xBBD3, 0x9795, 0x9796, 0x9797, 0xBBD4, 0x9798, 0x9799, 0x979A, /* 0xD0 */
+ 0x979B, 0x979C, 0x979D, 0x979E, 0xBBD5, 0x979F, 0x97A0, 0xBBD6, /* 0xD0 */
+ 0x97A1, 0xBBD7, 0x97A2, 0x97A3, 0x97A4, 0x97A5, 0x97A6, 0x97A7, /* 0xE0 */
+ 0x97A8, 0x97A9, 0x97AA, 0x97AB, 0x97AC, 0x97AD, 0x97AE, 0x97AF, /* 0xE0 */
+ 0x97B0, 0x97B1, 0x97B2, 0x97B3, 0x97B4, 0x97B5, 0x97B6, 0x97B7, /* 0xF0 */
+ 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BD, 0x97BE, 0x97BF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4, 0x97C5, 0x97C6, 0x97C7, /* 0x00 */
+ 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, 0x97CD, 0x97CE, 0x97CF, /* 0x00 */
+ 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4, 0x97D5, 0x97D6, 0x97D7, /* 0x10 */
+ 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC, 0x97DD, 0x97DE, 0x97DF, /* 0x10 */
+ 0x97E0, 0x97E1, 0x97E2, 0x97E3, 0x97E4, 0x97E5, 0x97E6, 0x97E7, /* 0x20 */
+ 0x97E8, 0x97E9, 0x97EA, 0x97EB, 0x97EC, 0x97ED, 0x97EE, 0x97EF, /* 0x20 */
+ 0x97F0, 0x97F1, 0x97F2, 0x97F3, 0x97F4, 0x97F5, 0x97F6, 0x97F7, /* 0x30 */
+ 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0xBBD8, 0x97FC, 0x97FD, 0x97FE, /* 0x30 */
+ 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, /* 0x40 */
+ 0x9849, 0x984A, 0x984B, 0x984C, 0x984D, 0x984E, 0x984F, 0x9850, /* 0x40 */
+ 0x9851, 0xBBD9, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, /* 0x50 */
+ 0xBBDA, 0x9858, 0x9859, 0x985A, 0xBBDB, 0x9861, 0x9862, 0x9863, /* 0x50 */
+ 0xBBDC, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986A, /* 0x60 */
+ 0xBBDD, 0xBBDE, 0x986B, 0x986C, 0x986D, 0x986E, 0x986F, 0x9870, /* 0x60 */
+ 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878, /* 0x70 */
+ 0x9879, 0x987A, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, /* 0x70 */
+ 0x9887, 0x9888, 0x9889, 0x988A, 0x988B, 0x988C, 0x988D, 0x988E, /* 0x80 */
+ 0x988F, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, /* 0x80 */
+ 0xBBDF, 0xBBE0, 0x9897, 0x9898, 0xBBE1, 0x9899, 0x989A, 0x989B, /* 0x90 */
+ 0xBBE2, 0x989C, 0x989D, 0x989E, 0x989F, 0x98A0, 0x98A1, 0x98A2, /* 0x90 */
+ 0xBBE3, 0xBBE4, 0x98A3, 0xBBE5, 0x98A4, 0xBBE6, 0x98A5, 0x98A6, /* 0xA0 */
+ 0x98A7, 0x98A8, 0x98A9, 0x98AA, 0xBBE7, 0xBBE8, 0x98AB, 0xBBE9, /* 0xA0 */
+ 0xBBEA, 0x98AC, 0x98AD, 0xBBEB, 0xBBEC, 0xBBED, 0xBBEE, 0x98AE, /* 0xB0 */
+ 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0xBBEF, 0xBBF0, 0x98B3, 0xBBF1, /* 0xB0 */
+ 0xBBF2, 0xBBF3, 0x98B4, 0x98B5, 0x98B6, 0xBBF4, 0x98B7, 0x98B8, /* 0xC0 */
+ 0xBBF5, 0xBBF6, 0x98B9, 0x98BA, 0xBBF7, 0x98BB, 0x98BC, 0x98BD, /* 0xC0 */
+ 0xBBF8, 0x98BE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C4, /* 0xD0 */
+ 0xBBF9, 0xBBFA, 0x98C5, 0xBBFB, 0xBBFC, 0xBBFD, 0x98C6, 0x98C7, /* 0xD0 */
+ 0x98C8, 0x98C9, 0x98CA, 0x98CB, 0xBBFE, 0xBCA1, 0x98CC, 0x98CD, /* 0xE0 */
+ 0xBCA2, 0x98CE, 0x98CF, 0x98D0, 0xBCA3, 0x98D1, 0x98D2, 0x98D3, /* 0xE0 */
+ 0x98D4, 0x98D5, 0x98D6, 0x98D7, 0xBCA4, 0xBCA5, 0x98D8, 0xBCA6, /* 0xF0 */
+ 0x98D9, 0xBCA7, 0x98DA, 0x98DB, 0x98DC, 0x98DD, 0x98DE, 0x98DF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBCA8, 0x98E0, 0x98E1, 0x98E2, 0xBCA9, 0x98E3, 0x98E4, 0x98E5, /* 0x00 */
+ 0xBCAA, 0x98E6, 0x98E7, 0x98E8, 0x98E9, 0x98EA, 0x98EB, 0x98EC, /* 0x00 */
+ 0xBCAB, 0x98ED, 0x98EE, 0x98EF, 0x98F0, 0xBCAC, 0x98F1, 0x98F2, /* 0x10 */
+ 0x98F3, 0x98F4, 0x98F5, 0x98F6, 0xBCAD, 0xBCAE, 0xBCAF, 0xBCB0, /* 0x10 */
+ 0xBCB1, 0x98F7, 0x98F8, 0xBCB2, 0xBCB3, 0x98F9, 0xBCB4, 0xBCB5, /* 0x20 */
+ 0x98FA, 0x98FB, 0x98FC, 0x98FD, 0xBCB6, 0xBCB7, 0x98FE, 0xBCB8, /* 0x20 */
+ 0xBCB9, 0xBCBA, 0x9941, 0x9942, 0x9943, 0x9944, 0xBCBB, 0x9945, /* 0x30 */
+ 0xBCBC, 0xBCBD, 0x9946, 0x9947, 0xBCBE, 0x9948, 0x9949, 0x994A, /* 0x30 */
+ 0xBCBF, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, /* 0x40 */
+ 0xBCC0, 0xBCC1, 0x9952, 0xBCC2, 0xBCC3, 0xBCC4, 0x9953, 0x9954, /* 0x40 */
+ 0x9955, 0x9956, 0x9957, 0x9958, 0xBCC5, 0xBCC6, 0x9959, 0x995A, /* 0x50 */
+ 0xBCC7, 0x9961, 0x9962, 0x9963, 0xBCC8, 0x9964, 0x9965, 0x9966, /* 0x50 */
+ 0x9967, 0x9968, 0x9969, 0x996A, 0xBCC9, 0xBCCA, 0x996B, 0xBCCB, /* 0x60 */
+ 0xBCCC, 0xBCCD, 0x996C, 0x996D, 0x996E, 0x996F, 0x9970, 0x9971, /* 0x60 */
+ 0xBCCE, 0x9972, 0x9973, 0x9974, 0xBCCF, 0x9975, 0x9976, 0x9977, /* 0x70 */
+ 0xBCD0, 0x9978, 0x9979, 0x997A, 0x9981, 0x9982, 0x9983, 0x9984, /* 0x70 */
+ 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0xBCD1, 0x998A, 0x998B, /* 0x80 */
+ 0x998C, 0x998D, 0x998E, 0x998F, 0xBCD2, 0xBCD3, 0xBCD4, 0x9990, /* 0x80 */
+ 0xBCD5, 0x9991, 0x9992, 0x9993, 0xBCD6, 0x9994, 0xBCD7, 0x9995, /* 0x90 */
+ 0x9996, 0x9997, 0x9998, 0x9999, 0xBCD8, 0xBCD9, 0x999A, 0xBCDA, /* 0x90 */
+ 0x999B, 0xBCDB, 0x999C, 0x999D, 0x999E, 0xBCDC, 0x999F, 0x99A0, /* 0xA0 */
+ 0xBCDD, 0xBCDE, 0x99A1, 0x99A2, 0xBCDF, 0x99A3, 0x99A4, 0x99A5, /* 0xA0 */
+ 0xBCE0, 0x99A6, 0x99A7, 0x99A8, 0x99A9, 0x99AA, 0x99AB, 0x99AC, /* 0xB0 */
+ 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1, 0xBCE1, 0x99B2, 0x99B3, /* 0xB0 */
+ 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0xBCE2, 0x99B8, 0x99B9, 0x99BA, /* 0xC0 */
+ 0xBCE3, 0x99BB, 0x99BC, 0x99BD, 0xBCE4, 0x99BE, 0x99BF, 0x99C0, /* 0xC0 */
+ 0x99C1, 0x99C2, 0x99C3, 0x99C4, 0xBCE5, 0x99C5, 0x99C6, 0xBCE6, /* 0xD0 */
+ 0xBCE7, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB, 0x99CC, 0x99CD, /* 0xD0 */
+ 0xBCE8, 0x99CE, 0x99CF, 0x99D0, 0xBCE9, 0x99D1, 0x99D2, 0x99D3, /* 0xE0 */
+ 0xBCEA, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, 0x99D9, 0x99DA, /* 0xE0 */
+ 0xBCEB, 0xBCEC, 0x99DB, 0xBCED, 0x99DC, 0x99DD, 0x99DE, 0x99DF, /* 0xF0 */
+ 0x99E0, 0x99E1, 0x99E2, 0x99E3, 0xBCEE, 0xBCEF, 0x99E4, 0x99E5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBCF0, 0x99E6, 0x99E7, 0x99E8, 0xBCF1, 0x99E9, 0x99EA, 0x99EB, /* 0x00 */
+ 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0xBCF2, 0xBCF3, 0x99F0, 0xBCF4, /* 0x00 */
+ 0x99F1, 0xBCF5, 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, /* 0x10 */
+ 0xBCF6, 0xBCF7, 0x99F8, 0x99F9, 0xBCF8, 0x99FA, 0x99FB, 0xBCF9, /* 0x10 */
+ 0xBCFA, 0x99FC, 0x99FD, 0x99FE, 0x9A41, 0x9A42, 0x9A43, 0x9A44, /* 0x20 */
+ 0xBCFB, 0xBCFC, 0x9A45, 0xBCFD, 0x9A46, 0xBCFE, 0x9A47, 0xBDA1, /* 0x20 */
+ 0x9A48, 0xBDA2, 0xBDA3, 0x9A49, 0xBDA4, 0x9A4A, 0x9A4B, 0x9A4C, /* 0x30 */
+ 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, 0x9A51, 0x9A52, 0x9A53, 0x9A54, /* 0x30 */
+ 0x9A55, 0x9A56, 0x9A57, 0x9A58, 0x9A59, 0x9A5A, 0x9A61, 0x9A62, /* 0x40 */
+ 0xBDA5, 0x9A63, 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0x9A68, 0x9A69, /* 0x40 */
+ 0xBDA6, 0xBDA7, 0x9A6A, 0x9A6B, 0xBDA8, 0x9A6C, 0x9A6D, 0x9A6E, /* 0x50 */
+ 0xBDA9, 0x9A6F, 0x9A70, 0x9A71, 0x9A72, 0x9A73, 0x9A74, 0x9A75, /* 0x50 */
+ 0xBDAA, 0x9A76, 0x9A77, 0x9A78, 0x9A79, 0xBDAB, 0x9A7A, 0x9A81, /* 0x60 */
+ 0x9A82, 0x9A83, 0x9A84, 0x9A85, 0xBDAC, 0xBDAD, 0x9A86, 0x9A87, /* 0x60 */
+ 0xBDAE, 0x9A88, 0x9A89, 0x9A8A, 0xBDAF, 0x9A8B, 0x9A8C, 0x9A8D, /* 0x70 */
+ 0x9A8E, 0x9A8F, 0x9A90, 0x9A91, 0xBDB0, 0xBDB1, 0x9A92, 0xBDB2, /* 0x70 */
+ 0x9A93, 0xBDB3, 0x9A94, 0x9A95, 0x9A96, 0x9A97, 0x9A98, 0x9A99, /* 0x80 */
+ 0xBDB4, 0xBDB5, 0x9A9A, 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9E, 0x9A9F, /* 0x80 */
+ 0xBDB6, 0x9AA0, 0x9AA1, 0x9AA2, 0x9AA3, 0x9AA4, 0x9AA5, 0x9AA6, /* 0x90 */
+ 0xBDB7, 0x9AA7, 0x9AA8, 0xBDB8, 0x9AA9, 0xBDB9, 0x9AAA, 0x9AAB, /* 0x90 */
+ 0x9AAC, 0x9AAD, 0x9AAE, 0x9AAF, 0xBDBA, 0xBDBB, 0x9AB0, 0x9AB1, /* 0xA0 */
+ 0xBDBC, 0x9AB2, 0x9AB3, 0x9AB4, 0xBDBD, 0xBDBE, 0x9AB5, 0x9AB6, /* 0xA0 */
+ 0x9AB7, 0x9AB8, 0x9AB9, 0x9ABA, 0xBDBF, 0xBDC0, 0x9ABB, 0xBDC1, /* 0xB0 */
+ 0x9ABC, 0xBDC2, 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC0, 0x9AC1, 0x9AC2, /* 0xB0 */
+ 0x9AC3, 0x9AC4, 0x9AC5, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, /* 0xC0 */
+ 0x9ACB, 0x9ACC, 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD1, 0x9AD2, /* 0xC0 */
+ 0x9AD3, 0x9AD4, 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD8, 0x9AD9, 0x9ADA, /* 0xD0 */
+ 0x9ADB, 0x9ADC, 0x9ADD, 0x9ADE, 0xBDC3, 0xBDC4, 0x9ADF, 0x9AE0, /* 0xD0 */
+ 0xBDC5, 0x9AE1, 0x9AE2, 0xBDC6, 0xBDC7, 0x9AE3, 0x9AE4, 0x9AE5, /* 0xE0 */
+ 0x9AE6, 0x9AE7, 0x9AE8, 0xBDC8, 0xBDC9, 0xBDCA, 0x9AE9, 0xBDCB, /* 0xE0 */
+ 0x9AEA, 0xBDCC, 0x9AEB, 0x9AEC, 0x9AED, 0x9AEE, 0xBDCD, 0x9AEF, /* 0xF0 */
+ 0xBDCE, 0xBDCF, 0x9AF0, 0xBDD0, 0xBDD1, 0x9AF1, 0x9AF2, 0x9AF3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDD2, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AF9, 0x9AFA, /* 0x00 */
+ 0xBDD3, 0xBDD4, 0x9AFB, 0x9AFC, 0xBDD5, 0xBDD6, 0x9AFD, 0x9AFE, /* 0x00 */
+ 0x9B41, 0x9B42, 0x9B43, 0xBDD7, 0xBDD8, 0xBDD9, 0x9B44, 0x9B45, /* 0x10 */
+ 0xBDDA, 0x9B46, 0x9B47, 0x9B48, 0xBDDB, 0x9B49, 0x9B4A, 0x9B4B, /* 0x10 */
+ 0x9B4C, 0x9B4D, 0x9B4E, 0x9B4F, 0xBDDC, 0xBDDD, 0x9B50, 0x9B51, /* 0x20 */
+ 0xBDDE, 0xBDDF, 0x9B52, 0x9B53, 0x9B54, 0x9B55, 0x9B56, 0x9B57, /* 0x20 */
+ 0x9B58, 0x9B59, 0x9B5A, 0x9B61, 0x9B62, 0x9B63, 0x9B64, 0x9B65, /* 0x30 */
+ 0x9B66, 0x9B67, 0x9B68, 0x9B69, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, /* 0x30 */
+ 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, 0x9B72, 0xBDE0, 0x9B73, 0x9B74, /* 0x40 */
+ 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, 0x9B7A, 0x9B81, 0x9B82, /* 0x40 */
+ 0x9B83, 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, /* 0x50 */
+ 0x9B8B, 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, /* 0x50 */
+ 0x9B93, 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, /* 0x60 */
+ 0xBDE1, 0xBDE2, 0x9B9B, 0x9B9C, 0xBDE3, 0x9B9D, 0x9B9E, 0x9B9F, /* 0x60 */
+ 0xBDE4, 0x9BA0, 0xBDE5, 0x9BA1, 0x9BA2, 0x9BA3, 0x9BA4, 0x9BA5, /* 0x70 */
+ 0xBDE6, 0xBDE7, 0x9BA6, 0x9BA7, 0xBDE8, 0xBDE9, 0x9BA8, 0x9BA9, /* 0x70 */
+ 0x9BAA, 0x9BAB, 0x9BAC, 0x9BAD, 0xBDEA, 0x9BAE, 0x9BAF, 0x9BB0, /* 0x80 */
+ 0xBDEB, 0x9BB1, 0x9BB2, 0x9BB3, 0xBDEC, 0x9BB4, 0x9BB5, 0x9BB6, /* 0x80 */
+ 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA, 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, /* 0x90 */
+ 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2, 0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, /* 0x90 */
+ 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA, 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, /* 0xA0 */
+ 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, 0x9BD4, 0x9BD5, 0x9BD6, /* 0xA0 */
+ 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, 0x9BDB, 0x9BDC, 0x9BDD, 0x9BDE, /* 0xB0 */
+ 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3, 0x9BE4, 0x9BE5, 0x9BE6, /* 0xB0 */
+ 0xBDED, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB, 0x9BEC, 0x9BED, /* 0xC0 */
+ 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3, 0x9BF4, 0x9BF5, /* 0xC0 */
+ 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB, 0x9BFC, 0x9BFD, /* 0xD0 */
+ 0xBDEE, 0xBDEF, 0x9BFE, 0x9C41, 0xBDF0, 0x9C42, 0x9C43, 0xBDF1, /* 0xD0 */
+ 0xBDF2, 0x9C44, 0xBDF3, 0x9C45, 0x9C46, 0x9C47, 0x9C48, 0x9C49, /* 0xE0 */
+ 0xBDF4, 0xBDF5, 0x9C4A, 0x9C4B, 0x9C4C, 0xBDF6, 0x9C4D, 0x9C4E, /* 0xE0 */
+ 0x9C4F, 0x9C50, 0x9C51, 0x9C52, 0xBDF7, 0xBDF8, 0x9C53, 0x9C54, /* 0xF0 */
+ 0xBDF9, 0x9C55, 0x9C56, 0x9C57, 0x9C58, 0x9C59, 0x9C5A, 0x9C61 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9C62, 0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C67, 0x9C68, 0x9C69, /* 0x00 */
+ 0xBDFA, 0x9C6A, 0x9C6B, 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, 0x9C70, /* 0x00 */
+ 0xBDFB, 0x9C71, 0x9C72, 0x9C73, 0x9C74, 0x9C75, 0x9C76, 0x9C77, /* 0x10 */
+ 0x9C78, 0x9C79, 0x9C7A, 0x9C81, 0x9C82, 0x9C83, 0x9C84, 0x9C85, /* 0x10 */
+ 0x9C86, 0x9C87, 0x9C88, 0x9C89, 0xBDFC, 0x9C8A, 0x9C8B, 0x9C8C, /* 0x20 */
+ 0x9C8D, 0x9C8E, 0x9C8F, 0x9C90, 0xBDFD, 0x9C91, 0x9C92, 0x9C93, /* 0x20 */
+ 0xBDFE, 0x9C94, 0x9C95, 0x9C96, 0xBEA1, 0x9C97, 0x9C98, 0x9C99, /* 0x30 */
+ 0x9C9A, 0x9C9B, 0x9C9C, 0x9C9D, 0xBEA2, 0xBEA3, 0x9C9E, 0x9C9F, /* 0x30 */
+ 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA4, 0x9CA5, 0x9CA6, 0x9CA7, /* 0x40 */
+ 0xBEA4, 0x9CA8, 0x9CA9, 0x9CAA, 0x9CAB, 0x9CAC, 0x9CAD, 0x9CAE, /* 0x40 */
+ 0x9CAF, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, /* 0x50 */
+ 0x9CB7, 0x9CB8, 0x9CB9, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, 0x9CBE, /* 0x50 */
+ 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0xBEA5, 0xBEA6, 0x9CC3, 0x9CC4, /* 0x60 */
+ 0xBEA7, 0x9CC5, 0x9CC6, 0x9CC7, 0xBEA8, 0x9CC8, 0x9CC9, 0x9CCA, /* 0x60 */
+ 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0xBEA9, 0xBEAA, 0x9CCF, 0x9CD0, /* 0x70 */
+ 0x9CD1, 0xBEAB, 0x9CD2, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD6, 0x9CD7, /* 0x70 */
+ 0xBEAC, 0x9CD8, 0x9CD9, 0x9CDA, 0x9CDB, 0x9CDC, 0x9CDD, 0x9CDE, /* 0x80 */
+ 0x9CDF, 0x9CE0, 0x9CE1, 0x9CE2, 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, /* 0x80 */
+ 0x9CE7, 0x9CE8, 0x9CE9, 0x9CEA, 0xBEAD, 0x9CEB, 0x9CEC, 0x9CED, /* 0x90 */
+ 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0xBEAE, 0x9CF2, 0x9CF3, 0x9CF4, /* 0x90 */
+ 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, /* 0xA0 */
+ 0x9CFD, 0x9CFE, 0x9D41, 0x9D42, 0x9D43, 0x9D44, 0x9D45, 0x9D46, /* 0xA0 */
+ 0x9D47, 0x9D48, 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, /* 0xB0 */
+ 0xBEAF, 0x9D4F, 0x9D50, 0x9D51, 0xBEB0, 0x9D52, 0x9D53, 0x9D54, /* 0xB0 */
+ 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, 0x9D61, 0x9D62, /* 0xC0 */
+ 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, /* 0xC0 */
+ 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72, /* 0xD0 */
+ 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, /* 0xD0 */
+ 0x9D81, 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, /* 0xE0 */
+ 0x9D89, 0xBEB1, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, /* 0xE0 */
+ 0xBEB2, 0xBEB3, 0x9D90, 0x9D91, 0xBEB4, 0x9D92, 0x9D93, 0x9D94, /* 0xF0 */
+ 0xBEB5, 0x9D95, 0xBEB6, 0x9D96, 0x9D97, 0x9D98, 0x9D99, 0xBEB7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBEB8, 0xBEB9, 0x9D9A, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, /* 0x00 */
+ 0x9DA0, 0x9DA1, 0x9DA2, 0x9DA3, 0xBEBA, 0x9DA4, 0x9DA5, 0x9DA6, /* 0x00 */
+ 0xBEBB, 0x9DA7, 0x9DA8, 0x9DA9, 0xBEBC, 0x9DAA, 0x9DAB, 0x9DAC, /* 0x10 */
+ 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0xBEBD, 0x9DB1, 0x9DB2, 0x9DB3, /* 0x10 */
+ 0x9DB4, 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, /* 0x20 */
+ 0xBEBE, 0xBEBF, 0x9DBC, 0x9DBD, 0xBEC0, 0x9DBE, 0x9DBF, 0x9DC0, /* 0x20 */
+ 0xBEC1, 0x9DC1, 0x9DC2, 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0x9DC7, /* 0x30 */
+ 0xBEC2, 0xBEC3, 0x9DC8, 0xBEC4, 0x9DC9, 0xBEC5, 0x9DCA, 0x9DCB, /* 0x30 */
+ 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0xBEC6, 0xBEC7, 0x9DD0, 0x9DD1, /* 0x40 */
+ 0xBEC8, 0xBEC9, 0xBECA, 0x9DD2, 0xBECB, 0xBECC, 0xBECD, 0x9DD3, /* 0x40 */
+ 0x9DD4, 0x9DD5, 0x9DD6, 0xBECE, 0xBECF, 0xBED0, 0x9DD7, 0xBED1, /* 0x50 */
+ 0xBED2, 0xBED3, 0x9DD8, 0x9DD9, 0x9DDA, 0xBED4, 0xBED5, 0x9DDB, /* 0x50 */
+ 0xBED6, 0xBED7, 0x9DDC, 0x9DDD, 0xBED8, 0x9DDE, 0x9DDF, 0x9DE0, /* 0x60 */
+ 0xBED9, 0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, 0x9DE7, /* 0x60 */
+ 0xBEDA, 0xBEDB, 0x9DE8, 0xBEDC, 0xBEDD, 0xBEDE, 0x9DE9, 0x9DEA, /* 0x70 */
+ 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0xBEDF, 0xBEE0, 0x9DEF, 0x9DF0, /* 0x70 */
+ 0xBEE1, 0x9DF1, 0x9DF2, 0x9DF3, 0xBEE2, 0x9DF4, 0x9DF5, 0xBEE3, /* 0x80 */
+ 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0xBEE4, 0xBEE5, 0x9DFA, 0xBEE6, /* 0x80 */
+ 0x9DFB, 0xBEE7, 0x9DFC, 0x9DFD, 0x9DFE, 0xBEE8, 0x9E41, 0xBEE9, /* 0x90 */
+ 0xBEEA, 0x9E42, 0x9E43, 0x9E44, 0xBEEB, 0x9E45, 0x9E46, 0x9E47, /* 0x90 */
+ 0xBEEC, 0x9E48, 0x9E49, 0x9E4A, 0x9E4B, 0x9E4C, 0x9E4D, 0x9E4E, /* 0xA0 */
+ 0x9E4F, 0xBEED, 0x9E50, 0x9E51, 0x9E52, 0x9E53, 0x9E54, 0x9E55, /* 0xA0 */
+ 0x9E56, 0x9E57, 0x9E58, 0x9E59, 0xBEEE, 0xBEEF, 0x9E5A, 0x9E61, /* 0xB0 */
+ 0xBEF0, 0xBEF1, 0x9E62, 0xBEF2, 0xBEF3, 0xBEF4, 0xBEF5, 0x9E63, /* 0xB0 */
+ 0x9E64, 0x9E65, 0x9E66, 0x9E67, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, /* 0xC0 */
+ 0xBEFA, 0xBEFB, 0xBEFC, 0x9E68, 0xBEFD, 0x9E69, 0xBEFE, 0x9E6A, /* 0xC0 */
+ 0xBFA1, 0xBFA2, 0x9E6B, 0x9E6C, 0xBFA3, 0x9E6D, 0x9E6E, 0x9E6F, /* 0xD0 */
+ 0xBFA4, 0x9E70, 0x9E71, 0x9E72, 0x9E73, 0x9E74, 0x9E75, 0x9E76, /* 0xD0 */
+ 0xBFA5, 0xBFA6, 0x9E77, 0xBFA7, 0x9E78, 0xBFA8, 0x9E79, 0x9E7A, /* 0xE0 */
+ 0x9E81, 0x9E82, 0x9E83, 0x9E84, 0xBFA9, 0xBFAA, 0xBFAB, 0x9E85, /* 0xE0 */
+ 0xBFAC, 0x9E86, 0x9E87, 0x9E88, 0xBFAD, 0x9E89, 0xBFAE, 0xBFAF, /* 0xF0 */
+ 0x9E8A, 0x9E8B, 0x9E8C, 0x9E8D, 0xBFB0, 0xBFB1, 0xBFB2, 0xBFB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBFB4, 0xBFB5, 0x9E8E, 0x9E8F, 0x9E90, 0xBFB6, 0xBFB7, 0xBFB8, /* 0x00 */
+ 0xBFB9, 0x9E91, 0x9E92, 0x9E93, 0xBFBA, 0x9E94, 0x9E95, 0x9E96, /* 0x00 */
+ 0xBFBB, 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9D, /* 0x10 */
+ 0xBFBC, 0xBFBD, 0x9E9E, 0xBFBE, 0xBFBF, 0x9E9F, 0x9EA0, 0x9EA1, /* 0x10 */
+ 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0xBFC0, 0xBFC1, 0x9EA6, 0x9EA7, /* 0x20 */
+ 0xBFC2, 0x9EA8, 0x9EA9, 0x9EAA, 0xBFC3, 0xBFC4, 0xBFC5, 0x9EAB, /* 0x20 */
+ 0xBFC6, 0x9EAC, 0x9EAD, 0xBFC7, 0xBFC8, 0xBFC9, 0x9EAE, 0xBFCA, /* 0x30 */
+ 0x9EAF, 0xBFCB, 0x9EB0, 0xBFCC, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB4, /* 0x30 */
+ 0xBFCD, 0xBFCE, 0x9EB5, 0x9EB6, 0xBFCF, 0x9EB7, 0x9EB8, 0x9EB9, /* 0x40 */
+ 0xBFD0, 0x9EBA, 0x9EBB, 0x9EBC, 0x9EBD, 0x9EBE, 0x9EBF, 0x9EC0, /* 0x40 */
+ 0xBFD1, 0xBFD2, 0x9EC1, 0xBFD3, 0xBFD4, 0xBFD5, 0x9EC2, 0x9EC3, /* 0x50 */
+ 0x9EC4, 0x9EC5, 0x9EC6, 0x9EC7, 0xBFD6, 0xBFD7, 0x9EC8, 0x9EC9, /* 0x50 */
+ 0xBFD8, 0x9ECA, 0x9ECB, 0x9ECC, 0x9ECD, 0x9ECE, 0x9ECF, 0x9ED0, /* 0x60 */
+ 0x9ED1, 0x9ED2, 0x9ED3, 0x9ED4, 0xBFD9, 0x9ED5, 0x9ED6, 0xBFDA, /* 0x60 */
+ 0x9ED7, 0xBFDB, 0x9ED8, 0x9ED9, 0x9EDA, 0x9EDB, 0x9EDC, 0x9EDD, /* 0x70 */
+ 0xBFDC, 0xBFDD, 0x9EDE, 0x9EDF, 0xBFDE, 0x9EE0, 0x9EE1, 0x9EE2, /* 0x70 */
+ 0xBFDF, 0x9EE3, 0x9EE4, 0x9EE5, 0x9EE6, 0x9EE7, 0x9EE8, 0x9EE9, /* 0x80 */
+ 0xBFE0, 0xBFE1, 0x9EEA, 0xBFE2, 0x9EEB, 0xBFE3, 0x9EEC, 0x9EED, /* 0x80 */
+ 0x9EEE, 0x9EEF, 0x9EF0, 0x9EF1, 0xBFE4, 0xBFE5, 0x9EF2, 0x9EF3, /* 0x90 */
+ 0xBFE6, 0x9EF4, 0x9EF5, 0x9EF6, 0xBFE7, 0x9EF7, 0x9EF8, 0x9EF9, /* 0x90 */
+ 0x9EFA, 0x9EFB, 0x9EFC, 0x9EFD, 0xBFE8, 0xBFE9, 0x9EFE, 0xBFEA, /* 0xA0 */
+ 0x9F41, 0xBFEB, 0x9F42, 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0x9F47, /* 0xA0 */
+ 0xBFEC, 0xBFED, 0x9F48, 0x9F49, 0xBFEE, 0x9F4A, 0x9F4B, 0x9F4C, /* 0xB0 */
+ 0xBFEF, 0xBFF0, 0xBFF1, 0x9F4D, 0x9F4E, 0x9F4F, 0x9F50, 0x9F51, /* 0xB0 */
+ 0xBFF2, 0xBFF3, 0x9F52, 0xBFF4, 0x9F53, 0xBFF5, 0x9F54, 0x9F55, /* 0xC0 */
+ 0x9F56, 0x9F57, 0x9F58, 0x9F59, 0xBFF6, 0xBFF7, 0x9F5A, 0x9F61, /* 0xC0 */
+ 0xBFF8, 0x9F62, 0x9F63, 0x9F64, 0xBFF9, 0x9F65, 0x9F66, 0x9F67, /* 0xD0 */
+ 0x9F68, 0x9F69, 0x9F6A, 0x9F6B, 0xBFFA, 0xBFFB, 0x9F6C, 0x9F6D, /* 0xD0 */
+ 0xBFFC, 0xBFFD, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F72, 0x9F73, /* 0xE0 */
+ 0xBFFE, 0xC0A1, 0x9F74, 0x9F75, 0xC0A2, 0x9F76, 0x9F77, 0x9F78, /* 0xE0 */
+ 0xC0A3, 0x9F79, 0x9F7A, 0x9F81, 0x9F82, 0x9F83, 0x9F84, 0x9F85, /* 0xF0 */
+ 0xC0A4, 0xC0A5, 0x9F86, 0x9F87, 0x9F88, 0xC0A6, 0x9F89, 0x9F8A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9F8B, 0x9F8C, 0x9F8D, 0x9F8E, 0xC0A7, 0xC0A8, 0x9F8F, 0x9F90, /* 0x00 */
+ 0xC0A9, 0x9F91, 0x9F92, 0x9F93, 0xC0AA, 0x9F94, 0x9F95, 0x9F96, /* 0x00 */
+ 0x9F97, 0x9F98, 0x9F99, 0x9F9A, 0xC0AB, 0xC0AC, 0x9F9B, 0xC0AD, /* 0x10 */
+ 0x9F9C, 0xC0AE, 0x9F9D, 0x9F9E, 0x9F9F, 0x9FA0, 0x9FA1, 0x9FA2, /* 0x10 */
+ 0xC0AF, 0xC0B0, 0x9FA3, 0x9FA4, 0xC0B1, 0x9FA5, 0x9FA6, 0x9FA7, /* 0x20 */
+ 0xC0B2, 0x9FA8, 0x9FA9, 0x9FAA, 0x9FAB, 0x9FAC, 0x9FAD, 0x9FAE, /* 0x20 */
+ 0xC0B3, 0xC0B4, 0x9FAF, 0xC0B5, 0x9FB0, 0xC0B6, 0x9FB1, 0xC0B7, /* 0x30 */
+ 0x9FB2, 0x9FB3, 0x9FB4, 0x9FB5, 0xC0B8, 0xC0B9, 0x9FB6, 0x9FB7, /* 0x30 */
+ 0xC0BA, 0x9FB8, 0x9FB9, 0x9FBA, 0xC0BB, 0x9FBB, 0x9FBC, 0x9FBD, /* 0x40 */
+ 0x9FBE, 0x9FBF, 0xC0BC, 0x9FC0, 0xC0BD, 0xC0BE, 0x9FC1, 0xC0BF, /* 0x40 */
+ 0x9FC2, 0xC0C0, 0xC0C1, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C5, 0xC0C6, /* 0x50 */
+ 0xC0C7, 0x9FC3, 0x9FC4, 0x9FC5, 0xC0C8, 0x9FC6, 0x9FC7, 0x9FC8, /* 0x50 */
+ 0xC0C9, 0x9FC9, 0x9FCA, 0x9FCB, 0x9FCC, 0x9FCD, 0x9FCE, 0x9FCF, /* 0x60 */
+ 0xC0CA, 0x9FD0, 0x9FD1, 0xC0CB, 0x9FD2, 0x9FD3, 0x9FD4, 0x9FD5, /* 0x60 */
+ 0x9FD6, 0x9FD7, 0x9FD8, 0x9FD9, 0xC0CC, 0xC0CD, 0x9FDA, 0x9FDB, /* 0x70 */
+ 0xC0CE, 0x9FDC, 0x9FDD, 0x9FDE, 0xC0CF, 0xC0D0, 0xC0D1, 0x9FDF, /* 0x70 */
+ 0x9FE0, 0x9FE1, 0x9FE2, 0xC0D2, 0xC0D3, 0xC0D4, 0x9FE3, 0xC0D5, /* 0x80 */
+ 0xC0D6, 0xC0D7, 0xC0D8, 0x9FE4, 0x9FE5, 0x9FE6, 0xC0D9, 0x9FE7, /* 0x80 */
+ 0xC0DA, 0xC0DB, 0x9FE8, 0x9FE9, 0xC0DC, 0x9FEA, 0xC0DD, 0xC0DE, /* 0x90 */
+ 0xC0DF, 0x9FEB, 0xC0E0, 0x9FEC, 0x9FED, 0x9FEE, 0x9FEF, 0x9FF0, /* 0x90 */
+ 0xC0E1, 0xC0E2, 0x9FF1, 0xC0E3, 0xC0E4, 0xC0E5, 0xC0E6, 0x9FF2, /* 0xA0 */
+ 0x9FF3, 0x9FF4, 0x9FF5, 0x9FF6, 0xC0E7, 0xC0E8, 0x9FF7, 0x9FF8, /* 0xA0 */
+ 0xC0E9, 0x9FF9, 0x9FFA, 0x9FFB, 0xC0EA, 0x9FFC, 0x9FFD, 0x9FFE, /* 0xB0 */
+ 0xA041, 0xA042, 0xA043, 0xA044, 0xC0EB, 0xC0EC, 0xA045, 0xC0ED, /* 0xB0 */
+ 0xC0EE, 0xC0EF, 0xA046, 0xA047, 0xA048, 0xA049, 0xA04A, 0xA04B, /* 0xC0 */
+ 0xC0F0, 0xC0F1, 0xA04C, 0xA04D, 0xC0F2, 0xA04E, 0xC0F3, 0xA04F, /* 0xC0 */
+ 0xC0F4, 0xA050, 0xA051, 0xA052, 0xA053, 0xA054, 0xA055, 0xA056, /* 0xD0 */
+ 0xC0F5, 0xA057, 0xA058, 0xA059, 0xA05A, 0xC0F6, 0xA061, 0xA062, /* 0xD0 */
+ 0xA063, 0xA064, 0xA065, 0xA066, 0xC0F7, 0xA067, 0xA068, 0xA069, /* 0xE0 */
+ 0xC0F8, 0xA06A, 0xA06B, 0xA06C, 0xC0F9, 0xA06D, 0xA06E, 0xA06F, /* 0xE0 */
+ 0xA070, 0xA071, 0xA072, 0xA073, 0xA074, 0xA075, 0xA076, 0xA077, /* 0xF0 */
+ 0xA078, 0xA079, 0xA07A, 0xA081, 0xA082, 0xA083, 0xA084, 0xA085 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC0FA, 0xC0FB, 0xA086, 0xA087, 0xC0FC, 0xA088, 0xA089, 0xA08A, /* 0x00 */
+ 0xC0FD, 0xA08B, 0xC0FE, 0xA08C, 0xA08D, 0xA08E, 0xA08F, 0xA090, /* 0x00 */
+ 0xC1A1, 0xC1A2, 0xA091, 0xC1A3, 0xA092, 0xC1A4, 0xC1A5, 0xA093, /* 0x10 */
+ 0xA094, 0xA095, 0xA096, 0xA097, 0xC1A6, 0xC1A7, 0xA098, 0xA099, /* 0x10 */
+ 0xC1A8, 0xA09A, 0xA09B, 0xA09C, 0xC1A9, 0xA09D, 0xA09E, 0xA09F, /* 0x20 */
+ 0xA0A0, 0xA0A1, 0xA0A2, 0xA0A3, 0xC1AA, 0xC1AB, 0xA0A4, 0xC1AC, /* 0x20 */
+ 0xA0A5, 0xC1AD, 0xA0A6, 0xA0A7, 0xA0A8, 0xA0A9, 0xA0AA, 0xA0AB, /* 0x30 */
+ 0xC1AE, 0xA0AC, 0xA0AD, 0xA0AE, 0xC1AF, 0xA0AF, 0xA0B0, 0xA0B1, /* 0x30 */
+ 0xC1B0, 0xA0B2, 0xA0B3, 0xA0B4, 0xA0B5, 0xA0B6, 0xA0B7, 0xA0B8, /* 0x40 */
+ 0xC1B1, 0xC1B2, 0xA0B9, 0xA0BA, 0xC1B3, 0xC1B4, 0xA0BB, 0xA0BC, /* 0x40 */
+ 0xA0BD, 0xA0BE, 0xA0BF, 0xA0C0, 0xC1B5, 0xA0C1, 0xA0C2, 0xA0C3, /* 0x50 */
+ 0xA0C4, 0xA0C5, 0xA0C6, 0xA0C7, 0xA0C8, 0xA0C9, 0xA0CA, 0xA0CB, /* 0x50 */
+ 0xA0CC, 0xA0CD, 0xA0CE, 0xA0CF, 0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3, /* 0x60 */
+ 0xA0D4, 0xA0D5, 0xA0D6, 0xA0D7, 0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, /* 0x60 */
+ 0xC1B6, 0xC1B7, 0xA0DC, 0xA0DD, 0xC1B8, 0xA0DE, 0xA0DF, 0xA0E0, /* 0x70 */
+ 0xC1B9, 0xA0E1, 0xC1BA, 0xA0E2, 0xA0E3, 0xA0E4, 0xA0E5, 0xA0E6, /* 0x70 */
+ 0xC1BB, 0xC1BC, 0xA0E7, 0xC1BD, 0xA0E8, 0xC1BE, 0xC1BF, 0xC1C0, /* 0x80 */
+ 0xA0E9, 0xA0EA, 0xA0EB, 0xC1C1, 0xC1C2, 0xC1C3, 0xA0EC, 0xA0ED, /* 0x80 */
+ 0xA0EE, 0xA0EF, 0xA0F0, 0xA0F1, 0xC1C4, 0xA0F2, 0xA0F3, 0xA0F4, /* 0x90 */
+ 0xA0F5, 0xA0F6, 0xA0F7, 0xA0F8, 0xA0F9, 0xC1C5, 0xA0FA, 0xC1C6, /* 0x90 */
+ 0xA0FB, 0xC1C7, 0xA0FC, 0xA0FD, 0xA0FE, 0xA141, 0xA142, 0xA143, /* 0xA0 */
+ 0xC1C8, 0xA144, 0xA145, 0xA146, 0xA147, 0xA148, 0xA149, 0xA14A, /* 0xA0 */
+ 0xA14B, 0xA14C, 0xA14D, 0xA14E, 0xA14F, 0xA150, 0xA151, 0xA152, /* 0xB0 */
+ 0xA153, 0xA154, 0xA155, 0xA156, 0xC1C9, 0xC1CA, 0xA157, 0xA158, /* 0xB0 */
+ 0xA159, 0xA15A, 0xA161, 0xA162, 0xC1CB, 0xA163, 0xA164, 0xA165, /* 0xC0 */
+ 0xC1CC, 0xA166, 0xA167, 0xA168, 0xC1CD, 0xA169, 0xA16A, 0xA16B, /* 0xC0 */
+ 0xA16C, 0xA16D, 0xA16E, 0xA16F, 0xC1CE, 0xC1CF, 0xA170, 0xC1D0, /* 0xD0 */
+ 0xA171, 0xC1D1, 0xA172, 0xA173, 0xA174, 0xA175, 0xA176, 0xA177, /* 0xD0 */
+ 0xC1D2, 0xC1D3, 0xA178, 0xA179, 0xC1D4, 0xA17A, 0xA181, 0xA182, /* 0xE0 */
+ 0xA183, 0xA184, 0xA185, 0xA186, 0xA187, 0xA188, 0xA189, 0xA18A, /* 0xE0 */
+ 0xA18B, 0xA18C, 0xA18D, 0xA18E, 0xA18F, 0xC1D5, 0xA190, 0xA191, /* 0xF0 */
+ 0xA192, 0xA193, 0xA194, 0xA195, 0xC1D6, 0xC1D7, 0xA196, 0xA197 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_C9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC1D8, 0xA198, 0xA199, 0xA19A, 0xC1D9, 0xC1DA, 0xC1DB, 0xA19B, /* 0x00 */
+ 0xA19C, 0xA19D, 0xA19E, 0xA19F, 0xC1DC, 0xC1DD, 0xA1A0, 0xC1DE, /* 0x00 */
+ 0xA241, 0xC1DF, 0xA242, 0xA243, 0xA244, 0xA245, 0xA246, 0xA247, /* 0x10 */
+ 0xC1E0, 0xA248, 0xA249, 0xA24A, 0xA24B, 0xA24C, 0xA24D, 0xA24E, /* 0x10 */
+ 0xA24F, 0xA250, 0xA251, 0xA252, 0xA253, 0xA254, 0xA255, 0xA256, /* 0x20 */
+ 0xA257, 0xA258, 0xA259, 0xA25A, 0xC1E1, 0xA261, 0xA262, 0xA263, /* 0x20 */
+ 0xA264, 0xA265, 0xA266, 0xA267, 0xC1E2, 0xA268, 0xA269, 0xA26A, /* 0x30 */
+ 0xA26B, 0xA26C, 0xA26D, 0xA26E, 0xA26F, 0xA270, 0xA271, 0xA272, /* 0x30 */
+ 0xA273, 0xA274, 0xA275, 0xA276, 0xA277, 0xA278, 0xA279, 0xA27A, /* 0x40 */
+ 0xA281, 0xA282, 0xA283, 0xA284, 0xA285, 0xA286, 0xA287, 0xA288, /* 0x40 */
+ 0xC1E3, 0xC1E4, 0xA289, 0xA28A, 0xC1E5, 0xA28B, 0xA28C, 0xA28D, /* 0x50 */
+ 0xC1E6, 0xA28E, 0xA28F, 0xA290, 0xA291, 0xA292, 0xA293, 0xA294, /* 0x50 */
+ 0xC1E7, 0xC1E8, 0xA295, 0xC1E9, 0xA296, 0xA297, 0xA298, 0xA299, /* 0x60 */
+ 0xA29A, 0xA29B, 0xA29C, 0xA29D, 0xC1EA, 0xA29E, 0xA29F, 0xA2A0, /* 0x60 */
+ 0xC1EB, 0xA341, 0xA342, 0xA343, 0xC1EC, 0xA344, 0xA345, 0xA346, /* 0x70 */
+ 0xA347, 0xA348, 0xA349, 0xA34A, 0xC1ED, 0xA34B, 0xA34C, 0xA34D, /* 0x70 */
+ 0xA34E, 0xA34F, 0xA350, 0xA351, 0xA352, 0xA353, 0xA354, 0xA355, /* 0x80 */
+ 0xC1EE, 0xC1EF, 0xA356, 0xA357, 0xC1F0, 0xA358, 0xA359, 0xA35A, /* 0x80 */
+ 0xC1F1, 0xA361, 0xA362, 0xA363, 0xA364, 0xA365, 0xA366, 0xA367, /* 0x90 */
+ 0xC1F2, 0xC1F3, 0xA368, 0xC1F4, 0xA369, 0xC1F5, 0xA36A, 0xA36B, /* 0x90 */
+ 0xA36C, 0xA36D, 0xA36E, 0xA36F, 0xA370, 0xA371, 0xA372, 0xA373, /* 0xA0 */
+ 0xA374, 0xA375, 0xA376, 0xA377, 0xA378, 0xA379, 0xA37A, 0xA381, /* 0xA0 */
+ 0xA382, 0xA383, 0xA384, 0xA385, 0xA386, 0xA387, 0xA388, 0xA389, /* 0xB0 */
+ 0xA38A, 0xA38B, 0xA38C, 0xA38D, 0xA38E, 0xA38F, 0xA390, 0xA391, /* 0xB0 */
+ 0xC1F6, 0xC1F7, 0xA392, 0xA393, 0xC1F8, 0xA394, 0xA395, 0xC1F9, /* 0xC0 */
+ 0xC1FA, 0xA396, 0xC1FB, 0xA397, 0xA398, 0xA399, 0xA39A, 0xA39B, /* 0xC0 */
+ 0xC1FC, 0xC1FD, 0xA39C, 0xC1FE, 0xA39D, 0xC2A1, 0xC2A2, 0xA39E, /* 0xD0 */
+ 0xA39F, 0xC2A3, 0xC2A4, 0xA3A0, 0xC2A5, 0xC2A6, 0xA441, 0xA442, /* 0xD0 */
+ 0xC2A7, 0xA443, 0xC2A8, 0xA444, 0xC2A9, 0xA445, 0xA446, 0xC2AA, /* 0xE0 */
+ 0xA447, 0xA448, 0xA449, 0xA44A, 0xC2AB, 0xC2AC, 0xA44B, 0xC2AD, /* 0xE0 */
+ 0xC2AE, 0xC2AF, 0xA44C, 0xA44D, 0xA44E, 0xA44F, 0xA450, 0xA451, /* 0xF0 */
+ 0xC2B0, 0xC2B1, 0xA452, 0xA453, 0xC2B2, 0xA454, 0xA455, 0xA456 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_CA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC2B3, 0xA457, 0xA458, 0xA459, 0xA45A, 0xA461, 0xA462, 0xA463, /* 0x00 */
+ 0xC2B4, 0xC2B5, 0xA464, 0xC2B6, 0xC2B7, 0xC2B8, 0xA465, 0xA466, /* 0x00 */
+ 0xA467, 0xA468, 0xA469, 0xA46A, 0xC2B9, 0xA46B, 0xA46C, 0xA46D, /* 0x10 */
+ 0xC2BA, 0xA46E, 0xA46F, 0xA470, 0xA471, 0xA472, 0xA473, 0xA474, /* 0x10 */
+ 0xA475, 0xA476, 0xA477, 0xA478, 0xA479, 0xA47A, 0xA481, 0xA482, /* 0x20 */
+ 0xA483, 0xC2BB, 0xA484, 0xA485, 0xA486, 0xA487, 0xA488, 0xA489, /* 0x20 */
+ 0xA48A, 0xA48B, 0xA48C, 0xA48D, 0xA48E, 0xA48F, 0xA490, 0xA491, /* 0x30 */
+ 0xA492, 0xA493, 0xA494, 0xA495, 0xA496, 0xA497, 0xA498, 0xA499, /* 0x30 */
+ 0xA49A, 0xA49B, 0xA49C, 0xA49D, 0xA49E, 0xA49F, 0xA4A0, 0xA541, /* 0x40 */
+ 0xA542, 0xA543, 0xA544, 0xA545, 0xC2BC, 0xC2BD, 0xA546, 0xA547, /* 0x40 */
+ 0xC2BE, 0xA548, 0xA549, 0xA54A, 0xC2BF, 0xA54B, 0xA54C, 0xA54D, /* 0x50 */
+ 0xA54E, 0xA54F, 0xA550, 0xA551, 0xC2C0, 0xC2C1, 0xA552, 0xC2C2, /* 0x50 */
+ 0xC2C3, 0xC2C4, 0xA553, 0xA554, 0xA555, 0xA556, 0xA557, 0xA558, /* 0x60 */
+ 0xC2C5, 0xA559, 0xA55A, 0xA561, 0xA562, 0xA563, 0xA564, 0xA565, /* 0x60 */
+ 0xA566, 0xA567, 0xA568, 0xA569, 0xA56A, 0xA56B, 0xA56C, 0xA56D, /* 0x70 */
+ 0xA56E, 0xA56F, 0xA570, 0xA571, 0xA572, 0xC2C6, 0xA573, 0xA574, /* 0x70 */
+ 0xA575, 0xA576, 0xA577, 0xA578, 0xC2C7, 0xA579, 0xA57A, 0xA581, /* 0x80 */
+ 0xA582, 0xA583, 0xA584, 0xA585, 0xA586, 0xA587, 0xA588, 0xA589, /* 0x80 */
+ 0xA58A, 0xA58B, 0xA58C, 0xA58D, 0xA58E, 0xA58F, 0xA590, 0xA591, /* 0x90 */
+ 0xC2C8, 0xA592, 0xA593, 0xA594, 0xA595, 0xA596, 0xA597, 0xA598, /* 0x90 */
+ 0xA599, 0xA59A, 0xA59B, 0xA59C, 0xA59D, 0xA59E, 0xA59F, 0xA5A0, /* 0xA0 */
+ 0xA641, 0xA642, 0xA643, 0xA644, 0xA645, 0xA646, 0xA647, 0xA648, /* 0xA0 */
+ 0xA649, 0xA64A, 0xA64B, 0xA64C, 0xA64D, 0xA64E, 0xA64F, 0xA650, /* 0xB0 */
+ 0xA651, 0xA652, 0xA653, 0xA654, 0xC2C9, 0xC2CA, 0xA655, 0xA656, /* 0xB0 */
+ 0xC2CB, 0xA657, 0xA658, 0xA659, 0xC2CC, 0xA65A, 0xA661, 0xA662, /* 0xC0 */
+ 0xA663, 0xA664, 0xA665, 0xA666, 0xC2CD, 0xC2CE, 0xA667, 0xC2CF, /* 0xC0 */
+ 0xA668, 0xC2D0, 0xA669, 0xC2D1, 0xA66A, 0xA66B, 0xA66C, 0xA66D, /* 0xD0 */
+ 0xC2D2, 0xC2D3, 0xA66E, 0xA66F, 0xA670, 0xA671, 0xA672, 0xA673, /* 0xD0 */
+ 0xC2D4, 0xA674, 0xA675, 0xA676, 0xA677, 0xA678, 0xA679, 0xA67A, /* 0xE0 */
+ 0xA681, 0xA682, 0xA683, 0xA684, 0xC2D5, 0xA685, 0xA686, 0xA687, /* 0xE0 */
+ 0xA688, 0xA689, 0xA68A, 0xA68B, 0xC2D6, 0xA68C, 0xA68D, 0xA68E, /* 0xF0 */
+ 0xA68F, 0xA690, 0xA691, 0xA692, 0xA693, 0xA694, 0xA695, 0xA696 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_CB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA697, 0xA698, 0xA699, 0xA69A, 0xA69B, 0xA69C, 0xA69D, 0xA69E, /* 0x00 */
+ 0xC2D7, 0xA69F, 0xA6A0, 0xA741, 0xA742, 0xA743, 0xA744, 0xA745, /* 0x00 */
+ 0xC2D8, 0xA746, 0xA747, 0xA748, 0xC2D9, 0xA749, 0xA74A, 0xA74B, /* 0x10 */
+ 0xC2DA, 0xA74C, 0xA74D, 0xA74E, 0xA74F, 0xA750, 0xA751, 0xA752, /* 0x10 */
+ 0xC2DB, 0xC2DC, 0xA753, 0xA754, 0xA755, 0xA756, 0xA757, 0xA758, /* 0x20 */
+ 0xA759, 0xA75A, 0xA761, 0xA762, 0xA763, 0xA764, 0xA765, 0xA766, /* 0x20 */
+ 0xA767, 0xA768, 0xA769, 0xA76A, 0xA76B, 0xA76C, 0xA76D, 0xA76E, /* 0x30 */
+ 0xA76F, 0xA770, 0xA771, 0xA772, 0xA773, 0xA774, 0xA775, 0xA776, /* 0x30 */
+ 0xA777, 0xC2DD, 0xA778, 0xA779, 0xA77A, 0xA781, 0xA782, 0xA783, /* 0x40 */
+ 0xC2DE, 0xC2DF, 0xA784, 0xA785, 0xC2E0, 0xA786, 0xA787, 0xA788, /* 0x40 */
+ 0xC2E1, 0xA789, 0xA78A, 0xA78B, 0xA78C, 0xA78D, 0xA78E, 0xA78F, /* 0x50 */
+ 0xC2E2, 0xC2E3, 0xA790, 0xA791, 0xA792, 0xC2E4, 0xA793, 0xA794, /* 0x50 */
+ 0xA795, 0xA796, 0xA797, 0xA798, 0xC2E5, 0xA799, 0xA79A, 0xA79B, /* 0x60 */
+ 0xA79C, 0xA79D, 0xA79E, 0xA79F, 0xA7A0, 0xA841, 0xA842, 0xA843, /* 0x60 */
+ 0xA844, 0xA845, 0xA846, 0xA847, 0xA848, 0xA849, 0xA84A, 0xA84B, /* 0x70 */
+ 0xC2E6, 0xC2E7, 0xA84C, 0xA84D, 0xA84E, 0xA84F, 0xA850, 0xA851, /* 0x70 */
+ 0xA852, 0xA853, 0xA854, 0xA855, 0xA856, 0xA857, 0xA858, 0xA859, /* 0x80 */
+ 0xA85A, 0xA861, 0xA862, 0xA863, 0xA864, 0xA865, 0xA866, 0xA867, /* 0x80 */
+ 0xA868, 0xA869, 0xA86A, 0xA86B, 0xA86C, 0xA86D, 0xA86E, 0xA86F, /* 0x90 */
+ 0xA870, 0xA871, 0xA872, 0xA873, 0xC2E8, 0xA874, 0xA875, 0xA876, /* 0x90 */
+ 0xA877, 0xA878, 0xA879, 0xA87A, 0xA881, 0xA882, 0xA883, 0xA884, /* 0xA0 */
+ 0xA885, 0xA886, 0xA887, 0xA888, 0xA889, 0xA88A, 0xA88B, 0xA88C, /* 0xA0 */
+ 0xA88D, 0xA88E, 0xA88F, 0xA890, 0xA891, 0xA892, 0xA893, 0xA894, /* 0xB0 */
+ 0xC2E9, 0xA895, 0xA896, 0xA897, 0xA898, 0xA899, 0xA89A, 0xA89B, /* 0xB0 */
+ 0xA89C, 0xA89D, 0xA89E, 0xA89F, 0xA8A0, 0xA941, 0xA942, 0xA943, /* 0xC0 */
+ 0xA944, 0xA945, 0xA946, 0xA947, 0xA948, 0xA949, 0xA94A, 0xA94B, /* 0xC0 */
+ 0xA94C, 0xA94D, 0xA94E, 0xA94F, 0xC2EA, 0xA950, 0xA951, 0xA952, /* 0xD0 */
+ 0xA953, 0xA954, 0xA955, 0xA956, 0xA957, 0xA958, 0xA959, 0xA95A, /* 0xD0 */
+ 0xA961, 0xA962, 0xA963, 0xA964, 0xC2EB, 0xA965, 0xA966, 0xC2EC, /* 0xE0 */
+ 0xA967, 0xC2ED, 0xA968, 0xA969, 0xA96A, 0xA96B, 0xA96C, 0xA96D, /* 0xE0 */
+ 0xA96E, 0xA96F, 0xA970, 0xA971, 0xA972, 0xA973, 0xA974, 0xA975, /* 0xF0 */
+ 0xA976, 0xA977, 0xA978, 0xA979, 0xA97A, 0xA981, 0xA982, 0xA983 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_CC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA984, 0xA985, 0xA986, 0xA987, 0xA988, 0xA989, 0xA98A, 0xA98B, /* 0x00 */
+ 0xA98C, 0xA98D, 0xA98E, 0xA98F, 0xC2EE, 0xC2EF, 0xA990, 0xA991, /* 0x00 */
+ 0xC2F0, 0xA992, 0xA993, 0xA994, 0xC2F1, 0xA995, 0xA996, 0xA997, /* 0x10 */
+ 0xA998, 0xA999, 0xA99A, 0xA99B, 0xC2F2, 0xC2F3, 0xA99C, 0xA99D, /* 0x10 */
+ 0xA99E, 0xC2F4, 0xC2F5, 0xA99F, 0xA9A0, 0xAA41, 0xAA42, 0xC2F6, /* 0x20 */
+ 0xC2F7, 0xC2F8, 0xAA43, 0xAA44, 0xC2F9, 0xAA45, 0xC2FA, 0xAA46, /* 0x20 */
+ 0xC2FB, 0xAA47, 0xAA48, 0xAA49, 0xAA4A, 0xAA4B, 0xAA4C, 0xAA4D, /* 0x30 */
+ 0xC2FC, 0xC2FD, 0xAA4E, 0xC2FE, 0xC3A1, 0xC3A2, 0xC3A3, 0xAA4F, /* 0x30 */
+ 0xAA50, 0xAA51, 0xAA52, 0xAA53, 0xC3A4, 0xC3A5, 0xAA54, 0xAA55, /* 0x40 */
+ 0xC3A6, 0xAA56, 0xAA57, 0xAA58, 0xC3A7, 0xAA59, 0xAA5A, 0xAA61, /* 0x40 */
+ 0xAA62, 0xAA63, 0xAA64, 0xAA65, 0xC3A8, 0xC3A9, 0xAA66, 0xC3AA, /* 0x50 */
+ 0xC3AB, 0xC3AC, 0xAA67, 0xAA68, 0xAA69, 0xAA6A, 0xAA6B, 0xAA6C, /* 0x50 */
+ 0xC3AD, 0xAA6D, 0xAA6E, 0xAA6F, 0xC3AE, 0xAA70, 0xC3AF, 0xAA71, /* 0x60 */
+ 0xC3B0, 0xAA72, 0xAA73, 0xAA74, 0xAA75, 0xAA76, 0xAA77, 0xAA78, /* 0x60 */
+ 0xC3B1, 0xAA79, 0xAA7A, 0xAA81, 0xAA82, 0xC3B2, 0xAA83, 0xAA84, /* 0x70 */
+ 0xAA85, 0xAA86, 0xAA87, 0xAA88, 0xAA89, 0xAA8A, 0xAA8B, 0xAA8C, /* 0x70 */
+ 0xAA8D, 0xAA8E, 0xAA8F, 0xAA90, 0xAA91, 0xAA92, 0xAA93, 0xAA94, /* 0x80 */
+ 0xAA95, 0xAA96, 0xAA97, 0xAA98, 0xAA99, 0xAA9A, 0xAA9B, 0xAA9C, /* 0x80 */
+ 0xAA9D, 0xAA9E, 0xAA9F, 0xAAA0, 0xAB41, 0xAB42, 0xAB43, 0xAB44, /* 0x90 */
+ 0xC3B3, 0xC3B4, 0xAB45, 0xAB46, 0xC3B5, 0xAB47, 0xAB48, 0xAB49, /* 0x90 */
+ 0xC3B6, 0xAB4A, 0xAB4B, 0xAB4C, 0xAB4D, 0xAB4E, 0xAB4F, 0xAB50, /* 0xA0 */
+ 0xC3B7, 0xC3B8, 0xAB51, 0xC3B9, 0xC3BA, 0xC3BB, 0xAB52, 0xAB53, /* 0xA0 */
+ 0xAB54, 0xAB55, 0xAB56, 0xAB57, 0xC3BC, 0xC3BD, 0xAB58, 0xAB59, /* 0xB0 */
+ 0xC3BE, 0xAB5A, 0xAB61, 0xAB62, 0xC3BF, 0xAB63, 0xAB64, 0xAB65, /* 0xB0 */
+ 0xAB66, 0xAB67, 0xAB68, 0xAB69, 0xC3C0, 0xC3C1, 0xAB6A, 0xC3C2, /* 0xC0 */
+ 0xAB6B, 0xC3C3, 0xAB6C, 0xAB6D, 0xAB6E, 0xAB6F, 0xAB70, 0xAB71, /* 0xC0 */
+ 0xC3C4, 0xAB72, 0xAB73, 0xAB74, 0xC3C5, 0xAB75, 0xAB76, 0xAB77, /* 0xD0 */
+ 0xAB78, 0xAB79, 0xAB7A, 0xAB81, 0xAB82, 0xAB83, 0xAB84, 0xAB85, /* 0xD0 */
+ 0xAB86, 0xAB87, 0xAB88, 0xAB89, 0xC3C6, 0xAB8A, 0xAB8B, 0xAB8C, /* 0xE0 */
+ 0xAB8D, 0xAB8E, 0xAB8F, 0xAB90, 0xC3C7, 0xAB91, 0xAB92, 0xAB93, /* 0xE0 */
+ 0xC3C8, 0xAB94, 0xAB95, 0xAB96, 0xAB97, 0xAB98, 0xAB99, 0xAB9A, /* 0xF0 */
+ 0xAB9B, 0xAB9C, 0xAB9D, 0xAB9E, 0xAB9F, 0xABA0, 0xAC41, 0xAC42 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_CD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAC43, 0xC3C9, 0xAC44, 0xAC45, 0xAC46, 0xAC47, 0xAC48, 0xAC49, /* 0x00 */
+ 0xC3CA, 0xC3CB, 0xAC4A, 0xAC4B, 0xC3CC, 0xAC4C, 0xAC4D, 0xAC4E, /* 0x00 */
+ 0xC3CD, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53, 0xAC54, 0xAC55, /* 0x10 */
+ 0xC3CE, 0xC3CF, 0xAC56, 0xC3D0, 0xAC57, 0xC3D1, 0xAC58, 0xAC59, /* 0x10 */
+ 0xAC5A, 0xAC61, 0xAC62, 0xAC63, 0xC3D2, 0xAC64, 0xAC65, 0xAC66, /* 0x20 */
+ 0xC3D3, 0xAC67, 0xAC68, 0xAC69, 0xC3D4, 0xAC6A, 0xAC6B, 0xAC6C, /* 0x20 */
+ 0xAC6D, 0xAC6E, 0xAC6F, 0xAC70, 0xAC71, 0xAC72, 0xAC73, 0xAC74, /* 0x30 */
+ 0xAC75, 0xC3D5, 0xAC76, 0xAC77, 0xAC78, 0xAC79, 0xAC7A, 0xAC81, /* 0x30 */
+ 0xAC82, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC87, 0xAC88, 0xAC89, /* 0x40 */
+ 0xAC8A, 0xAC8B, 0xAC8C, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC90, 0xAC91, /* 0x40 */
+ 0xAC92, 0xAC93, 0xAC94, 0xAC95, 0xAC96, 0xAC97, 0xAC98, 0xAC99, /* 0x50 */
+ 0xAC9A, 0xAC9B, 0xAC9C, 0xAC9D, 0xC3D6, 0xAC9E, 0xAC9F, 0xACA0, /* 0x50 */
+ 0xC3D7, 0xAD41, 0xAD42, 0xAD43, 0xC3D8, 0xAD44, 0xAD45, 0xAD46, /* 0x60 */
+ 0xAD47, 0xAD48, 0xAD49, 0xAD4A, 0xC3D9, 0xC3DA, 0xAD4B, 0xC3DB, /* 0x60 */
+ 0xAD4C, 0xC3DC, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD50, 0xAD51, 0xAD52, /* 0x70 */
+ 0xC3DD, 0xAD53, 0xAD54, 0xAD55, 0xAD56, 0xAD57, 0xAD58, 0xAD59, /* 0x70 */
+ 0xAD5A, 0xAD61, 0xAD62, 0xAD63, 0xAD64, 0xAD65, 0xAD66, 0xAD67, /* 0x80 */
+ 0xC3DE, 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6C, 0xAD6D, 0xAD6E, /* 0x80 */
+ 0xAD6F, 0xAD70, 0xAD71, 0xAD72, 0xC3DF, 0xC3E0, 0xAD73, 0xAD74, /* 0x90 */
+ 0xC3E1, 0xAD75, 0xAD76, 0xAD77, 0xC3E2, 0xAD78, 0xAD79, 0xAD7A, /* 0x90 */
+ 0xAD81, 0xAD82, 0xAD83, 0xAD84, 0xC3E3, 0xC3E4, 0xAD85, 0xC3E5, /* 0xA0 */
+ 0xAD86, 0xC3E6, 0xAD87, 0xAD88, 0xAD89, 0xAD8A, 0xAD8B, 0xAD8C, /* 0xA0 */
+ 0xC3E7, 0xAD8D, 0xAD8E, 0xAD8F, 0xAD90, 0xAD91, 0xAD92, 0xAD93, /* 0xB0 */
+ 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98, 0xAD99, 0xAD9A, 0xAD9B, /* 0xB0 */
+ 0xAD9C, 0xAD9D, 0xAD9E, 0xAD9F, 0xC3E8, 0xADA0, 0xAE41, 0xAE42, /* 0xC0 */
+ 0xAE43, 0xAE44, 0xAE45, 0xAE46, 0xC3E9, 0xAE47, 0xAE48, 0xAE49, /* 0xC0 */
+ 0xC3EA, 0xAE4A, 0xAE4B, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE4F, 0xAE50, /* 0xD0 */
+ 0xAE51, 0xAE52, 0xAE53, 0xAE54, 0xAE55, 0xAE56, 0xAE57, 0xAE58, /* 0xD0 */
+ 0xAE59, 0xAE5A, 0xAE61, 0xAE62, 0xAE63, 0xAE64, 0xAE65, 0xAE66, /* 0xE0 */
+ 0xC3EB, 0xAE67, 0xAE68, 0xAE69, 0xC3EC, 0xAE6A, 0xAE6B, 0xAE6C, /* 0xE0 */
+ 0xC3ED, 0xAE6D, 0xAE6E, 0xAE6F, 0xAE70, 0xAE71, 0xAE72, 0xAE73, /* 0xF0 */
+ 0xC3EE, 0xC3EF, 0xAE74, 0xC3F0, 0xAE75, 0xC3F1, 0xAE76, 0xAE77 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_CE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAE78, 0xAE79, 0xAE7A, 0xAE81, 0xC3F2, 0xAE82, 0xAE83, 0xAE84, /* 0x00 */
+ 0xC3F3, 0xAE85, 0xAE86, 0xAE87, 0xC3F4, 0xAE88, 0xAE89, 0xAE8A, /* 0x00 */
+ 0xAE8B, 0xAE8C, 0xAE8D, 0xAE8E, 0xC3F5, 0xAE8F, 0xAE90, 0xAE91, /* 0x10 */
+ 0xAE92, 0xC3F6, 0xAE93, 0xAE94, 0xAE95, 0xAE96, 0xAE97, 0xAE98, /* 0x10 */
+ 0xC3F7, 0xC3F8, 0xAE99, 0xAE9A, 0xC3F9, 0xAE9B, 0xAE9C, 0xAE9D, /* 0x20 */
+ 0xC3FA, 0xAE9E, 0xAE9F, 0xAEA0, 0xAF41, 0xAF42, 0xAF43, 0xAF44, /* 0x20 */
+ 0xC3FB, 0xC3FC, 0xAF45, 0xC3FD, 0xAF46, 0xC3FE, 0xAF47, 0xAF48, /* 0x30 */
+ 0xAF49, 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF50, /* 0x30 */
+ 0xAF51, 0xAF52, 0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, /* 0x40 */
+ 0xAF59, 0xAF5A, 0xAF61, 0xAF62, 0xAF63, 0xAF64, 0xAF65, 0xAF66, /* 0x40 */
+ 0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E, /* 0x50 */
+ 0xC4A1, 0xC4A2, 0xAF6F, 0xAF70, 0xC4A3, 0xAF71, 0xAF72, 0xC4A4, /* 0x50 */
+ 0xC4A5, 0xC4A6, 0xAF73, 0xAF74, 0xAF75, 0xAF76, 0xAF77, 0xAF78, /* 0x60 */
+ 0xC4A7, 0xC4A8, 0xAF79, 0xC4A9, 0xAF7A, 0xC4AA, 0xAF81, 0xAF82, /* 0x60 */
+ 0xAF83, 0xAF84, 0xAF85, 0xAF86, 0xC4AB, 0xC4AC, 0xAF87, 0xAF88, /* 0x70 */
+ 0xC4AD, 0xAF89, 0xAF8A, 0xAF8B, 0xC4AE, 0xAF8C, 0xAF8D, 0xAF8E, /* 0x70 */
+ 0xAF8F, 0xAF90, 0xAF91, 0xAF92, 0xC4AF, 0xC4B0, 0xAF93, 0xC4B1, /* 0x80 */
+ 0xAF94, 0xC4B2, 0xAF95, 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, /* 0x80 */
+ 0xC4B3, 0xC4B4, 0xAF9B, 0xAF9C, 0xC4B5, 0xAF9D, 0xAF9E, 0xAF9F, /* 0x90 */
+ 0xC4B6, 0xAFA0, 0xB041, 0xB042, 0xB043, 0xB044, 0xB045, 0xB046, /* 0x90 */
+ 0xC4B7, 0xC4B8, 0xB047, 0xC4B9, 0xC4BA, 0xC4BB, 0xB048, 0xB049, /* 0xA0 */
+ 0xB04A, 0xB04B, 0xB04C, 0xB04D, 0xC4BC, 0xC4BD, 0xB04E, 0xB04F, /* 0xA0 */
+ 0xB050, 0xB051, 0xB052, 0xB053, 0xB054, 0xB055, 0xB056, 0xB057, /* 0xB0 */
+ 0xB058, 0xB059, 0xB05A, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065, /* 0xB0 */
+ 0xB066, 0xC4BE, 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, /* 0xC0 */
+ 0xB06D, 0xB06E, 0xB06F, 0xB070, 0xB071, 0xB072, 0xB073, 0xB074, /* 0xC0 */
+ 0xB075, 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB081, 0xB082, /* 0xD0 */
+ 0xB083, 0xB084, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089, 0xB08A, /* 0xD0 */
+ 0xB08B, 0xB08C, 0xB08D, 0xB08E, 0xC4BF, 0xC4C0, 0xB08F, 0xB090, /* 0xE0 */
+ 0xC4C1, 0xB091, 0xB092, 0xC4C2, 0xC4C3, 0xB093, 0xB094, 0xB095, /* 0xE0 */
+ 0xB096, 0xB097, 0xB098, 0xB099, 0xC4C4, 0xC4C5, 0xB09A, 0xC4C6, /* 0xF0 */
+ 0xC4C7, 0xC4C8, 0xB09B, 0xB09C, 0xB09D, 0xB09E, 0xB09F, 0xB0A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_CF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC4C9, 0xC4CA, 0xB141, 0xB142, 0xC4CB, 0xB143, 0xB144, 0xB145, /* 0x00 */
+ 0xC4CC, 0xB146, 0xB147, 0xB148, 0xB149, 0xB14A, 0xB14B, 0xB14C, /* 0x00 */
+ 0xC4CD, 0xC4CE, 0xB14D, 0xC4CF, 0xB14E, 0xC4D0, 0xB14F, 0xB150, /* 0x10 */
+ 0xB151, 0xB152, 0xB153, 0xB154, 0xC4D1, 0xB155, 0xB156, 0xB157, /* 0x10 */
+ 0xC4D2, 0xB158, 0xB159, 0xB15A, 0xC4D3, 0xB161, 0xB162, 0xB163, /* 0x20 */
+ 0xB164, 0xB165, 0xB166, 0xB167, 0xC4D4, 0xC4D5, 0xB168, 0xC4D6, /* 0x20 */
+ 0xC4D7, 0xC4D8, 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E, /* 0x30 */
+ 0xC4D9, 0xB16F, 0xB170, 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, /* 0x30 */
+ 0xB176, 0xB177, 0xB178, 0xB179, 0xB17A, 0xB181, 0xB182, 0xB183, /* 0x40 */
+ 0xB184, 0xB185, 0xB186, 0xB187, 0xB188, 0xB189, 0xB18A, 0xB18B, /* 0x40 */
+ 0xB18C, 0xB18D, 0xB18E, 0xB18F, 0xC4DA, 0xC4DB, 0xB190, 0xB191, /* 0x50 */
+ 0xC4DC, 0xB192, 0xB193, 0xB194, 0xC4DD, 0xB195, 0xB196, 0xB197, /* 0x50 */
+ 0xB198, 0xB199, 0xB19A, 0xB19B, 0xC4DE, 0xC4DF, 0xB19C, 0xC4E0, /* 0x60 */
+ 0xB19D, 0xC4E1, 0xB19E, 0xB19F, 0xB1A0, 0xB241, 0xB242, 0xB243, /* 0x60 */
+ 0xC4E2, 0xC4E3, 0xB244, 0xB245, 0xC4E4, 0xB246, 0xB247, 0xB248, /* 0x70 */
+ 0xC4E5, 0xB249, 0xB24A, 0xB24B, 0xB24C, 0xB24D, 0xB24E, 0xB24F, /* 0x70 */
+ 0xC4E6, 0xB250, 0xB251, 0xB252, 0xB253, 0xC4E7, 0xB254, 0xB255, /* 0x80 */
+ 0xB256, 0xB257, 0xB258, 0xB259, 0xC4E8, 0xB25A, 0xB261, 0xB262, /* 0x80 */
+ 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB268, 0xB269, 0xB26A, /* 0x90 */
+ 0xB26B, 0xB26C, 0xB26D, 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, /* 0x90 */
+ 0xB273, 0xC4E9, 0xB274, 0xB275, 0xB276, 0xB277, 0xB278, 0xB279, /* 0xA0 */
+ 0xC4EA, 0xB27A, 0xB281, 0xB282, 0xB283, 0xB284, 0xB285, 0xB286, /* 0xA0 */
+ 0xC4EB, 0xB287, 0xB288, 0xB289, 0xB28A, 0xB28B, 0xB28C, 0xB28D, /* 0xB0 */
+ 0xB28E, 0xB28F, 0xB290, 0xB291, 0xB292, 0xB293, 0xB294, 0xB295, /* 0xB0 */
+ 0xB296, 0xB297, 0xB298, 0xB299, 0xC4EC, 0xB29A, 0xB29B, 0xB29C, /* 0xC0 */
+ 0xB29D, 0xB29E, 0xB29F, 0xB2A0, 0xB341, 0xB342, 0xB343, 0xB344, /* 0xC0 */
+ 0xB345, 0xB346, 0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, /* 0xD0 */
+ 0xB34D, 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0xB354, /* 0xD0 */
+ 0xC4ED, 0xC4EE, 0xB355, 0xB356, 0xC4EF, 0xB357, 0xB358, 0xB359, /* 0xE0 */
+ 0xC4F0, 0xB35A, 0xB361, 0xB362, 0xB363, 0xB364, 0xB365, 0xB366, /* 0xE0 */
+ 0xC4F1, 0xC4F2, 0xB367, 0xC4F3, 0xB368, 0xC4F4, 0xB369, 0xB36A, /* 0xF0 */
+ 0xB36B, 0xB36C, 0xB36D, 0xB36E, 0xC4F5, 0xB36F, 0xB370, 0xB371 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_D0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC4F6, 0xB372, 0xB373, 0xB374, 0xC4F7, 0xB375, 0xB376, 0xB377, /* 0x00 */
+ 0xB378, 0xB379, 0xB37A, 0xB381, 0xB382, 0xB383, 0xB384, 0xB385, /* 0x00 */
+ 0xB386, 0xC4F8, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38C, /* 0x10 */
+ 0xC4F9, 0xB38D, 0xB38E, 0xB38F, 0xB390, 0xB391, 0xB392, 0xB393, /* 0x10 */
+ 0xB394, 0xB395, 0xB396, 0xB397, 0xB398, 0xB399, 0xB39A, 0xB39B, /* 0x20 */
+ 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A0, 0xC4FA, 0xB441, 0xB442, /* 0x20 */
+ 0xB443, 0xB444, 0xB445, 0xB446, 0xC4FB, 0xC4FC, 0xB447, 0xB448, /* 0x30 */
+ 0xC4FD, 0xB449, 0xB44A, 0xB44B, 0xC4FE, 0xB44C, 0xB44D, 0xB44E, /* 0x30 */
+ 0xB44F, 0xB450, 0xB451, 0xB452, 0xC5A1, 0xC5A2, 0xB453, 0xC5A3, /* 0x40 */
+ 0xB454, 0xC5A4, 0xB455, 0xB456, 0xB457, 0xB458, 0xB459, 0xB45A, /* 0x40 */
+ 0xC5A5, 0xB461, 0xB462, 0xB463, 0xC5A6, 0xB464, 0xB465, 0xB466, /* 0x50 */
+ 0xC5A7, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46C, 0xB46D, /* 0x50 */
+ 0xC5A8, 0xB46E, 0xB46F, 0xB470, 0xB471, 0xB472, 0xB473, 0xB474, /* 0x60 */
+ 0xB475, 0xB476, 0xB477, 0xB478, 0xC5A9, 0xC5AA, 0xB479, 0xB47A, /* 0x60 */
+ 0xC5AB, 0xB481, 0xB482, 0xB483, 0xC5AC, 0xB484, 0xB485, 0xB486, /* 0x70 */
+ 0xB487, 0xB488, 0xB489, 0xB48A, 0xC5AD, 0xC5AE, 0xB48B, 0xB48C, /* 0x70 */
+ 0xB48D, 0xC5AF, 0xB48E, 0xB48F, 0xB490, 0xB491, 0xB492, 0xB493, /* 0x80 */
+ 0xB494, 0xB495, 0xB496, 0xB497, 0xB498, 0xB499, 0xB49A, 0xB49B, /* 0x80 */
+ 0xB49C, 0xB49D, 0xB49E, 0xB49F, 0xB4A0, 0xB541, 0xB542, 0xB543, /* 0x90 */
+ 0xB544, 0xB545, 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54B, /* 0x90 */
+ 0xB54C, 0xB54D, 0xB54E, 0xB54F, 0xC5B0, 0xC5B1, 0xB550, 0xB551, /* 0xA0 */
+ 0xC5B2, 0xB552, 0xB553, 0xB554, 0xC5B3, 0xB555, 0xB556, 0xB557, /* 0xA0 */
+ 0xB558, 0xB559, 0xB55A, 0xB561, 0xC5B4, 0xC5B5, 0xB562, 0xC5B6, /* 0xB0 */
+ 0xB563, 0xC5B7, 0xB564, 0xB565, 0xB566, 0xB567, 0xB568, 0xB569, /* 0xB0 */
+ 0xC5B8, 0xC5B9, 0xB56A, 0xB56B, 0xC5BA, 0xB56C, 0xB56D, 0xB56E, /* 0xC0 */
+ 0xC5BB, 0xC5BC, 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, /* 0xC0 */
+ 0xC5BD, 0xC5BE, 0xB575, 0xC5BF, 0xC5C0, 0xC5C1, 0xB576, 0xB577, /* 0xD0 */
+ 0xB578, 0xB579, 0xB57A, 0xB581, 0xC5C2, 0xC5C3, 0xB582, 0xB583, /* 0xD0 */
+ 0xC5C4, 0xB584, 0xB585, 0xB586, 0xC5C5, 0xB587, 0xB588, 0xB589, /* 0xE0 */
+ 0xB58A, 0xB58B, 0xB58C, 0xB58D, 0xC5C6, 0xC5C7, 0xB58E, 0xC5C8, /* 0xE0 */
+ 0xC5C9, 0xC5CA, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, 0xB594, /* 0xF0 */
+ 0xC5CB, 0xB595, 0xB596, 0xB597, 0xB598, 0xB599, 0xB59A, 0xB59B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_D1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB59C, 0xB59D, 0xB59E, 0xB59F, 0xB5A0, 0xB641, 0xB642, 0xB643, /* 0x00 */
+ 0xB644, 0xB645, 0xB646, 0xB647, 0xB648, 0xC5CC, 0xB649, 0xB64A, /* 0x00 */
+ 0xB64B, 0xB64C, 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, /* 0x10 */
+ 0xB653, 0xB654, 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, /* 0x10 */
+ 0xB661, 0xB662, 0xB663, 0xB664, 0xB665, 0xB666, 0xB667, 0xB668, /* 0x20 */
+ 0xB669, 0xB66A, 0xB66B, 0xB66C, 0xB66D, 0xB66E, 0xB66F, 0xB670, /* 0x20 */
+ 0xC5CD, 0xC5CE, 0xB671, 0xB672, 0xC5CF, 0xB673, 0xB674, 0xB675, /* 0x30 */
+ 0xC5D0, 0xB676, 0xC5D1, 0xB677, 0xB678, 0xB679, 0xB67A, 0xB681, /* 0x30 */
+ 0xC5D2, 0xC5D3, 0xB682, 0xC5D4, 0xC5D5, 0xC5D6, 0xB683, 0xB684, /* 0x40 */
+ 0xB685, 0xB686, 0xB687, 0xB688, 0xC5D7, 0xC5D8, 0xB689, 0xB68A, /* 0x40 */
+ 0xC5D9, 0xB68B, 0xB68C, 0xB68D, 0xC5DA, 0xB68E, 0xB68F, 0xB690, /* 0x50 */
+ 0xB691, 0xB692, 0xB693, 0xB694, 0xC5DB, 0xC5DC, 0xB695, 0xC5DD, /* 0x50 */
+ 0xB696, 0xC5DE, 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69C, /* 0x60 */
+ 0xC5DF, 0xB69D, 0xB69E, 0xB69F, 0xC5E0, 0xB6A0, 0xB741, 0xB742, /* 0x60 */
+ 0xB743, 0xB744, 0xB745, 0xB746, 0xB747, 0xB748, 0xB749, 0xB74A, /* 0x70 */
+ 0xB74B, 0xB74C, 0xB74D, 0xB74E, 0xC5E1, 0xB74F, 0xB750, 0xB751, /* 0x70 */
+ 0xB752, 0xB753, 0xB754, 0xB755, 0xC5E2, 0xB756, 0xB757, 0xB758, /* 0x80 */
+ 0xC5E3, 0xB759, 0xB75A, 0xB761, 0xB762, 0xB763, 0xB764, 0xB765, /* 0x80 */
+ 0xB766, 0xB767, 0xB768, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, /* 0x90 */
+ 0xB76E, 0xB76F, 0xB770, 0xB771, 0xB772, 0xB773, 0xB774, 0xB775, /* 0x90 */
+ 0xC5E4, 0xC5E5, 0xB776, 0xB777, 0xC5E6, 0xB778, 0xB779, 0xB77A, /* 0xA0 */
+ 0xC5E7, 0xB781, 0xB782, 0xB783, 0xB784, 0xB785, 0xB786, 0xB787, /* 0xA0 */
+ 0xC5E8, 0xC5E9, 0xB788, 0xC5EA, 0xB789, 0xC5EB, 0xB78A, 0xB78B, /* 0xB0 */
+ 0xB78C, 0xB78D, 0xC5EC, 0xB78E, 0xC5ED, 0xB78F, 0xB790, 0xB791, /* 0xB0 */
+ 0xC5EE, 0xB792, 0xB793, 0xB794, 0xB795, 0xB796, 0xB797, 0xB798, /* 0xC0 */
+ 0xB799, 0xB79A, 0xB79B, 0xB79C, 0xB79D, 0xB79E, 0xB79F, 0xB7A0, /* 0xC0 */
+ 0xB841, 0xB842, 0xB843, 0xB844, 0xB845, 0xB846, 0xB847, 0xB848, /* 0xD0 */
+ 0xC5EF, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, 0xB84F, /* 0xD0 */
+ 0xB850, 0xB851, 0xB852, 0xB853, 0xB854, 0xB855, 0xB856, 0xB857, /* 0xE0 */
+ 0xB858, 0xB859, 0xB85A, 0xB861, 0xB862, 0xB863, 0xB864, 0xB865, /* 0xE0 */
+ 0xB866, 0xB867, 0xB868, 0xB869, 0xC5F0, 0xB86A, 0xB86B, 0xB86C, /* 0xF0 */
+ 0xC5F1, 0xB86D, 0xB86E, 0xB86F, 0xB870, 0xB871, 0xB872, 0xB873 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_D2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB874, 0xB875, 0xB876, 0xB877, 0xB878, 0xB879, 0xB87A, 0xC5F2, /* 0x00 */
+ 0xB881, 0xC5F3, 0xB882, 0xB883, 0xB884, 0xB885, 0xB886, 0xB887, /* 0x00 */
+ 0xC5F4, 0xB888, 0xB889, 0xB88A, 0xB88B, 0xB88C, 0xB88D, 0xB88E, /* 0x10 */
+ 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0xB894, 0xB895, 0xB896, /* 0x10 */
+ 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C, 0xB89D, 0xB89E, /* 0x20 */
+ 0xB89F, 0xB8A0, 0xB941, 0xB942, 0xC5F5, 0xC5F6, 0xB943, 0xB944, /* 0x20 */
+ 0xC5F7, 0xB945, 0xB946, 0xB947, 0xC5F8, 0xB948, 0xB949, 0xB94A, /* 0x30 */
+ 0xB94B, 0xB94C, 0xB94D, 0xB94E, 0xC5F9, 0xC5FA, 0xB94F, 0xC5FB, /* 0x30 */
+ 0xB950, 0xC5FC, 0xB951, 0xB952, 0xB953, 0xB954, 0xB955, 0xB956, /* 0x40 */
+ 0xC5FD, 0xB957, 0xB958, 0xB959, 0xB95A, 0xB961, 0xB962, 0xB963, /* 0x40 */
+ 0xB964, 0xB965, 0xB966, 0xB967, 0xB968, 0xB969, 0xB96A, 0xB96B, /* 0x50 */
+ 0xB96C, 0xB96D, 0xB96E, 0xB96F, 0xC5FE, 0xB970, 0xB971, 0xB972, /* 0x50 */
+ 0xB973, 0xB974, 0xB975, 0xB976, 0xC6A1, 0xB977, 0xB978, 0xB979, /* 0x60 */
+ 0xB97A, 0xB981, 0xB982, 0xB983, 0xB984, 0xB985, 0xB986, 0xB987, /* 0x60 */
+ 0xB988, 0xB989, 0xB98A, 0xB98B, 0xB98C, 0xB98D, 0xB98E, 0xB98F, /* 0x70 */
+ 0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, 0xB997, /* 0x70 */
+ 0xC6A2, 0xC6A3, 0xB998, 0xB999, 0xC6A4, 0xB99A, 0xB99B, 0xB99C, /* 0x80 */
+ 0xC6A5, 0xB99D, 0xB99E, 0xB99F, 0xB9A0, 0xBA41, 0xBA42, 0xBA43, /* 0x80 */
+ 0xC6A6, 0xC6A7, 0xBA44, 0xBA45, 0xBA46, 0xC6A8, 0xBA47, 0xBA48, /* 0x90 */
+ 0xBA49, 0xBA4A, 0xBA4B, 0xBA4C, 0xC6A9, 0xBA4D, 0xBA4E, 0xBA4F, /* 0x90 */
+ 0xC6AA, 0xBA50, 0xBA51, 0xBA52, 0xC6AB, 0xBA53, 0xBA54, 0xBA55, /* 0xA0 */
+ 0xBA56, 0xBA57, 0xBA58, 0xBA59, 0xC6AC, 0xBA5A, 0xBA61, 0xBA62, /* 0xA0 */
+ 0xBA63, 0xC6AD, 0xBA64, 0xBA65, 0xBA66, 0xBA67, 0xBA68, 0xBA69, /* 0xB0 */
+ 0xC6AE, 0xC6AF, 0xBA6A, 0xBA6B, 0xC6B0, 0xBA6C, 0xBA6D, 0xC6B1, /* 0xB0 */
+ 0xC6B2, 0xBA6E, 0xC6B3, 0xBA6F, 0xBA70, 0xBA71, 0xBA72, 0xBA73, /* 0xC0 */
+ 0xC6B4, 0xC6B5, 0xBA74, 0xC6B6, 0xBA75, 0xBA76, 0xBA77, 0xBA78, /* 0xC0 */
+ 0xBA79, 0xBA7A, 0xBA81, 0xBA82, 0xC6B7, 0xBA83, 0xBA84, 0xBA85, /* 0xD0 */
+ 0xC6B8, 0xBA86, 0xBA87, 0xBA88, 0xC6B9, 0xBA89, 0xBA8A, 0xBA8B, /* 0xD0 */
+ 0xBA8C, 0xBA8D, 0xBA8E, 0xBA8F, 0xC6BA, 0xC6BB, 0xBA90, 0xBA91, /* 0xE0 */
+ 0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99, /* 0xE0 */
+ 0xC6BC, 0xC6BD, 0xBA9A, 0xBA9B, 0xC6BE, 0xBA9C, 0xBA9D, 0xBA9E, /* 0xF0 */
+ 0xC6BF, 0xBA9F, 0xBAA0, 0xBB41, 0xBB42, 0xBB43, 0xBB44, 0xBB45 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_D3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6C0, 0xC6C1, 0xBB46, 0xC6C2, 0xBB47, 0xC6C3, 0xBB48, 0xBB49, /* 0x00 */
+ 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4D, 0xC6C4, 0xC6C5, 0xC6C6, 0xBB4E, /* 0x00 */
+ 0xC6C7, 0xBB4F, 0xBB50, 0xBB51, 0xC6C8, 0xBB52, 0xC6C9, 0xBB53, /* 0x10 */
+ 0xBB54, 0xBB55, 0xBB56, 0xBB57, 0xC6CA, 0xC6CB, 0xBB58, 0xC6CC, /* 0x10 */
+ 0xC6CD, 0xC6CE, 0xBB59, 0xBB5A, 0xBB61, 0xC6CF, 0xBB62, 0xBB63, /* 0x20 */
+ 0xC6D0, 0xC6D1, 0xBB64, 0xBB65, 0xC6D2, 0xBB66, 0xBB67, 0xBB68, /* 0x20 */
+ 0xC6D3, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6C, 0xBB6D, 0xBB6E, 0xBB6F, /* 0x30 */
+ 0xC6D4, 0xC6D5, 0xBB70, 0xC6D6, 0xC6D7, 0xC6D8, 0xBB71, 0xBB72, /* 0x30 */
+ 0xBB73, 0xBB74, 0xBB75, 0xBB76, 0xC6D9, 0xC6DA, 0xBB77, 0xBB78, /* 0x40 */
+ 0xBB79, 0xBB7A, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86, /* 0x40 */
+ 0xBB87, 0xBB88, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8C, 0xBB8D, 0xBB8E, /* 0x50 */
+ 0xBB8F, 0xBB90, 0xBB91, 0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, /* 0x50 */
+ 0xBB97, 0xBB98, 0xBB99, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, 0xBB9E, /* 0x60 */
+ 0xBB9F, 0xBBA0, 0xBC41, 0xBC42, 0xBC43, 0xBC44, 0xBC45, 0xBC46, /* 0x60 */
+ 0xBC47, 0xBC48, 0xBC49, 0xBC4A, 0xBC4B, 0xBC4C, 0xBC4D, 0xBC4E, /* 0x70 */
+ 0xBC4F, 0xBC50, 0xBC51, 0xBC52, 0xC6DB, 0xC6DC, 0xBC53, 0xBC54, /* 0x70 */
+ 0xC6DD, 0xBC55, 0xBC56, 0xBC57, 0xC6DE, 0xBC58, 0xBC59, 0xBC5A, /* 0x80 */
+ 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xC6DF, 0xC6E0, 0xBC65, 0xC6E1, /* 0x80 */
+ 0xC6E2, 0xC6E3, 0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, /* 0x90 */
+ 0xC6E4, 0xC6E5, 0xBC6C, 0xBC6D, 0xC6E6, 0xBC6E, 0xBC6F, 0xBC70, /* 0x90 */
+ 0xC6E7, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76, 0xBC77, /* 0xA0 */
+ 0xC6E8, 0xC6E9, 0xBC78, 0xC6EA, 0xBC79, 0xC6EB, 0xBC7A, 0xBC81, /* 0xA0 */
+ 0xBC82, 0xBC83, 0xBC84, 0xBC85, 0xC6EC, 0xBC86, 0xBC87, 0xBC88, /* 0xB0 */
+ 0xC6ED, 0xBC89, 0xBC8A, 0xBC8B, 0xC6EE, 0xBC8C, 0xBC8D, 0xBC8E, /* 0xB0 */
+ 0xBC8F, 0xBC90, 0xBC91, 0xBC92, 0xC6EF, 0xC6F0, 0xBC93, 0xBC94, /* 0xC0 */
+ 0xC6F1, 0xC6F2, 0xBC95, 0xBC96, 0xBC97, 0xBC98, 0xBC99, 0xBC9A, /* 0xC0 */
+ 0xC6F3, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA0, 0xBD41, /* 0xD0 */
+ 0xC6F4, 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD48, /* 0xD0 */
+ 0xBD49, 0xC6F5, 0xBD4A, 0xC6F6, 0xBD4B, 0xBD4C, 0xBD4D, 0xBD4E, /* 0xE0 */
+ 0xBD4F, 0xBD50, 0xBD51, 0xBD52, 0xC6F7, 0xC6F8, 0xBD53, 0xBD54, /* 0xE0 */
+ 0xC6F9, 0xBD55, 0xBD56, 0xBD57, 0xC6FA, 0xBD58, 0xBD59, 0xBD5A, /* 0xF0 */
+ 0xBD61, 0xBD62, 0xBD63, 0xBD64, 0xC6FB, 0xC6FC, 0xBD65, 0xC6FD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_D4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBD66, 0xC6FE, 0xBD67, 0xBD68, 0xBD69, 0xBD6A, 0xBD6B, 0xBD6C, /* 0x00 */
+ 0xC7A1, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, 0xBD73, /* 0x00 */
+ 0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD81, /* 0x10 */
+ 0xBD82, 0xBD83, 0xBD84, 0xBD85, 0xBD86, 0xC7A2, 0xBD87, 0xBD88, /* 0x10 */
+ 0xBD89, 0xBD8A, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD90, /* 0x20 */
+ 0xBD91, 0xBD92, 0xBD93, 0xBD94, 0xBD95, 0xBD96, 0xBD97, 0xBD98, /* 0x20 */
+ 0xBD99, 0xBD9A, 0xBD9B, 0xBD9C, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, /* 0x30 */
+ 0xBE41, 0xBE42, 0xBE43, 0xBE44, 0xBE45, 0xBE46, 0xBE47, 0xBE48, /* 0x30 */
+ 0xC7A3, 0xBE49, 0xBE4A, 0xBE4B, 0xC7A4, 0xBE4C, 0xBE4D, 0xBE4E, /* 0x40 */
+ 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53, 0xBE54, 0xBE55, 0xBE56, /* 0x40 */
+ 0xBE57, 0xBE58, 0xBE59, 0xBE5A, 0xBE61, 0xBE62, 0xBE63, 0xBE64, /* 0x50 */
+ 0xBE65, 0xBE66, 0xBE67, 0xBE68, 0xC7A5, 0xBE69, 0xBE6A, 0xBE6B, /* 0x50 */
+ 0xC7A6, 0xBE6C, 0xBE6D, 0xBE6E, 0xC7A7, 0xBE6F, 0xBE70, 0xBE71, /* 0x60 */
+ 0xBE72, 0xBE73, 0xBE74, 0xBE75, 0xBE76, 0xC7A8, 0xBE77, 0xC7A9, /* 0x60 */
+ 0xBE78, 0xBE79, 0xBE7A, 0xBE81, 0xBE82, 0xBE83, 0xBE84, 0xBE85, /* 0x70 */
+ 0xC7AA, 0xC7AB, 0xBE86, 0xBE87, 0xC7AC, 0xBE88, 0xBE89, 0xC7AD, /* 0x70 */
+ 0xC7AE, 0xBE8A, 0xC7AF, 0xBE8B, 0xBE8C, 0xBE8D, 0xBE8E, 0xBE8F, /* 0x80 */
+ 0xC7B0, 0xC7B1, 0xBE90, 0xC7B2, 0xBE91, 0xC7B3, 0xBE92, 0xBE93, /* 0x80 */
+ 0xBE94, 0xBE95, 0xBE96, 0xBE97, 0xC7B4, 0xBE98, 0xBE99, 0xBE9A, /* 0x90 */
+ 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F, 0xBEA0, 0xBF41, 0xBF42, /* 0x90 */
+ 0xBF43, 0xBF44, 0xBF45, 0xBF46, 0xBF47, 0xBF48, 0xBF49, 0xBF4A, /* 0xA0 */
+ 0xBF4B, 0xC7B5, 0xBF4C, 0xBF4D, 0xBF4E, 0xBF4F, 0xBF50, 0xBF51, /* 0xA0 */
+ 0xBF52, 0xBF53, 0xBF54, 0xBF55, 0xBF56, 0xBF57, 0xBF58, 0xBF59, /* 0xB0 */
+ 0xBF5A, 0xBF61, 0xBF62, 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, /* 0xB0 */
+ 0xBF68, 0xBF69, 0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, /* 0xC0 */
+ 0xBF70, 0xBF71, 0xBF72, 0xBF73, 0xC7B6, 0xBF74, 0xBF75, 0xBF76, /* 0xC0 */
+ 0xC7B7, 0xBF77, 0xBF78, 0xBF79, 0xC7B8, 0xBF7A, 0xBF81, 0xBF82, /* 0xD0 */
+ 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xC7B9, 0xBF87, 0xBF88, 0xC7BA, /* 0xD0 */
+ 0xBF89, 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, /* 0xE0 */
+ 0xC7BB, 0xBF91, 0xBF92, 0xBF93, 0xC7BC, 0xBF94, 0xBF95, 0xBF96, /* 0xE0 */
+ 0xC7BD, 0xBF97, 0xBF98, 0xBF99, 0xBF9A, 0xBF9B, 0xBF9C, 0xBF9D, /* 0xF0 */
+ 0xC7BE, 0xBF9E, 0xBF9F, 0xC7BF, 0xBFA0, 0xC7C0, 0xC041, 0xC042 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_D5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC043, 0xC044, 0xC045, 0xC046, 0xC7C1, 0xC047, 0xC048, 0xC049, /* 0x00 */
+ 0xC7C2, 0xC04A, 0xC04B, 0xC04C, 0xC7C3, 0xC04D, 0xC04E, 0xC04F, /* 0x00 */
+ 0xC050, 0xC051, 0xC052, 0xC053, 0xC7C4, 0xC7C5, 0xC054, 0xC7C6, /* 0x10 */
+ 0xC055, 0xC056, 0xC057, 0xC058, 0xC059, 0xC05A, 0xC061, 0xC062, /* 0x10 */
+ 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC068, 0xC069, 0xC06A, /* 0x20 */
+ 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072, /* 0x20 */
+ 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A, /* 0x30 */
+ 0xC081, 0xC082, 0xC083, 0xC084, 0xC7C7, 0xC7C8, 0xC085, 0xC086, /* 0x30 */
+ 0xC7C9, 0xC087, 0xC088, 0xC089, 0xC7CA, 0xC08A, 0xC08B, 0xC08C, /* 0x40 */
+ 0xC08D, 0xC08E, 0xC08F, 0xC090, 0xC7CB, 0xC7CC, 0xC091, 0xC7CD, /* 0x40 */
+ 0xC092, 0xC7CE, 0xC093, 0xC094, 0xC095, 0xC096, 0xC097, 0xC098, /* 0x50 */
+ 0xC7CF, 0xC7D0, 0xC099, 0xC09A, 0xC7D1, 0xC09B, 0xC09C, 0xC09D, /* 0x50 */
+ 0xC7D2, 0xC09E, 0xC09F, 0xC0A0, 0xC141, 0xC7D3, 0xC142, 0xC143, /* 0x60 */
+ 0xC7D4, 0xC7D5, 0xC144, 0xC7D6, 0xC145, 0xC7D7, 0xC146, 0xC147, /* 0x60 */
+ 0xC148, 0xC149, 0xC14A, 0xC14B, 0xC7D8, 0xC7D9, 0xC14C, 0xC14D, /* 0x70 */
+ 0xC7DA, 0xC14E, 0xC14F, 0xC150, 0xC7DB, 0xC151, 0xC152, 0xC153, /* 0x70 */
+ 0xC154, 0xC155, 0xC156, 0xC157, 0xC7DC, 0xC7DD, 0xC158, 0xC7DE, /* 0x80 */
+ 0xC7DF, 0xC7E0, 0xC159, 0xC15A, 0xC161, 0xC162, 0xC163, 0xC164, /* 0x80 */
+ 0xC7E1, 0xC165, 0xC166, 0xC167, 0xC168, 0xC169, 0xC16A, 0xC16B, /* 0x90 */
+ 0xC16C, 0xC16D, 0xC16E, 0xC16F, 0xC170, 0xC171, 0xC172, 0xC173, /* 0x90 */
+ 0xC174, 0xC175, 0xC176, 0xC177, 0xC178, 0xC7E2, 0xC179, 0xC17A, /* 0xA0 */
+ 0xC181, 0xC182, 0xC183, 0xC184, 0xC185, 0xC186, 0xC187, 0xC188, /* 0xA0 */
+ 0xC189, 0xC18A, 0xC18B, 0xC18C, 0xC18D, 0xC18E, 0xC18F, 0xC190, /* 0xB0 */
+ 0xC191, 0xC192, 0xC193, 0xC194, 0xC195, 0xC196, 0xC197, 0xC198, /* 0xB0 */
+ 0xC199, 0xC19A, 0xC19B, 0xC19C, 0xC19D, 0xC19E, 0xC19F, 0xC1A0, /* 0xC0 */
+ 0xC7E3, 0xC7E4, 0xC241, 0xC242, 0xC7E5, 0xC243, 0xC244, 0xC245, /* 0xC0 */
+ 0xC7E6, 0xC246, 0xC7E7, 0xC247, 0xC248, 0xC249, 0xC24A, 0xC24B, /* 0xD0 */
+ 0xC7E8, 0xC7E9, 0xC24C, 0xC7EA, 0xC24D, 0xC7EB, 0xC24E, 0xC24F, /* 0xD0 */
+ 0xC250, 0xC251, 0xC252, 0xC253, 0xC7EC, 0xC7ED, 0xC254, 0xC255, /* 0xE0 */
+ 0xC7EE, 0xC256, 0xC257, 0xC258, 0xC7EF, 0xC259, 0xC25A, 0xC261, /* 0xE0 */
+ 0xC262, 0xC263, 0xC264, 0xC265, 0xC7F0, 0xC7F1, 0xC266, 0xC7F2, /* 0xF0 */
+ 0xC267, 0xC7F3, 0xC268, 0xC269, 0xC26A, 0xC26B, 0xC26C, 0xC26D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_D6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7F4, 0xC7F5, 0xC26E, 0xC26F, 0xC7F6, 0xC270, 0xC271, 0xC272, /* 0x00 */
+ 0xC7F7, 0xC273, 0xC274, 0xC275, 0xC276, 0xC277, 0xC278, 0xC279, /* 0x00 */
+ 0xC7F8, 0xC7F9, 0xC27A, 0xC7FA, 0xC7FB, 0xC7FC, 0xC281, 0xC282, /* 0x10 */
+ 0xC283, 0xC284, 0xC285, 0xC286, 0xC7FD, 0xC287, 0xC288, 0xC289, /* 0x10 */
+ 0xC7FE, 0xC28A, 0xC28B, 0xC28C, 0xC8A1, 0xC28D, 0xC28E, 0xC28F, /* 0x20 */
+ 0xC290, 0xC291, 0xC292, 0xC293, 0xC294, 0xC8A2, 0xC295, 0xC296, /* 0x20 */
+ 0xC297, 0xC298, 0xC299, 0xC29A, 0xC29B, 0xC29C, 0xC29D, 0xC29E, /* 0x30 */
+ 0xC8A3, 0xC8A4, 0xC29F, 0xC2A0, 0xC8A5, 0xC341, 0xC342, 0xC343, /* 0x30 */
+ 0xC8A6, 0xC344, 0xC345, 0xC346, 0xC347, 0xC8A7, 0xC348, 0xC349, /* 0x40 */
+ 0xC8A8, 0xC8A9, 0xC34A, 0xC8AA, 0xC34B, 0xC8AB, 0xC34C, 0xC34D, /* 0x40 */
+ 0xC34E, 0xC8AC, 0xC34F, 0xC350, 0xC8AD, 0xC8AE, 0xC351, 0xC352, /* 0x50 */
+ 0xC8AF, 0xC353, 0xC354, 0xC355, 0xC8B0, 0xC356, 0xC357, 0xC358, /* 0x50 */
+ 0xC359, 0xC35A, 0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC8B1, /* 0x60 */
+ 0xC366, 0xC8B2, 0xC367, 0xC368, 0xC369, 0xC36A, 0xC36B, 0xC36C, /* 0x60 */
+ 0xC8B3, 0xC8B4, 0xC36D, 0xC36E, 0xC8B5, 0xC36F, 0xC370, 0xC371, /* 0x70 */
+ 0xC372, 0xC373, 0xC374, 0xC375, 0xC376, 0xC377, 0xC378, 0xC379, /* 0x70 */
+ 0xC37A, 0xC381, 0xC382, 0xC8B6, 0xC383, 0xC8B7, 0xC384, 0xC385, /* 0x80 */
+ 0xC386, 0xC387, 0xC388, 0xC389, 0xC8B8, 0xC8B9, 0xC38A, 0xC38B, /* 0x80 */
+ 0xC8BA, 0xC38C, 0xC38D, 0xC38E, 0xC8BB, 0xC38F, 0xC390, 0xC391, /* 0x90 */
+ 0xC392, 0xC393, 0xC394, 0xC395, 0xC396, 0xC8BC, 0xC397, 0xC8BD, /* 0x90 */
+ 0xC398, 0xC8BE, 0xC399, 0xC39A, 0xC39B, 0xC39C, 0xC39D, 0xC39E, /* 0xA0 */
+ 0xC8BF, 0xC39F, 0xC3A0, 0xC441, 0xC8C0, 0xC442, 0xC443, 0xC444, /* 0xA0 */
+ 0xC8C1, 0xC445, 0xC446, 0xC447, 0xC448, 0xC449, 0xC44A, 0xC44B, /* 0xB0 */
+ 0xC44C, 0xC8C2, 0xC44D, 0xC8C3, 0xC44E, 0xC44F, 0xC450, 0xC451, /* 0xB0 */
+ 0xC452, 0xC453, 0xC454, 0xC455, 0xC8C4, 0xC8C5, 0xC456, 0xC457, /* 0xC0 */
+ 0xC8C6, 0xC458, 0xC459, 0xC45A, 0xC8C7, 0xC461, 0xC462, 0xC463, /* 0xC0 */
+ 0xC464, 0xC8C8, 0xC465, 0xC466, 0xC8C9, 0xC467, 0xC468, 0xC8CA, /* 0xD0 */
+ 0xC469, 0xC8CB, 0xC46A, 0xC46B, 0xC46C, 0xC46D, 0xC46E, 0xC46F, /* 0xD0 */
+ 0xC8CC, 0xC470, 0xC471, 0xC472, 0xC8CD, 0xC473, 0xC474, 0xC475, /* 0xE0 */
+ 0xC8CE, 0xC476, 0xC477, 0xC478, 0xC479, 0xC47A, 0xC481, 0xC482, /* 0xE0 */
+ 0xC8CF, 0xC483, 0xC484, 0xC485, 0xC486, 0xC8D0, 0xC487, 0xC488, /* 0xF0 */
+ 0xC489, 0xC48A, 0xC48B, 0xC48C, 0xC8D1, 0xC8D2, 0xC48D, 0xC48E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_D7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC8D3, 0xC48F, 0xC490, 0xC491, 0xC8D4, 0xC492, 0xC493, 0xC494, /* 0x00 */
+ 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B, 0xC49C, /* 0x00 */
+ 0xC49D, 0xC8D5, 0xC49E, 0xC49F, 0xC4A0, 0xC541, 0xC542, 0xC543, /* 0x10 */
+ 0xC8D6, 0xC8D7, 0xC544, 0xC545, 0xC8D8, 0xC546, 0xC547, 0xC548, /* 0x10 */
+ 0xC8D9, 0xC549, 0xC54A, 0xC54B, 0xC54C, 0xC54D, 0xC54E, 0xC54F, /* 0x20 */
+ 0xC8DA, 0xC8DB, 0xC550, 0xC8DC, 0xC551, 0xC8DD, 0xC552, 0xC553, /* 0x20 */
+ 0xC554, 0xC555, 0xC556, 0xC557, 0xC8DE, 0xC8DF, 0xC558, 0xC559, /* 0x30 */
+ 0xC8E0, 0xC55A, 0xC561, 0xC562, 0xC8E1, 0xC563, 0xC564, 0xC565, /* 0x30 */
+ 0xC566, 0xC567, 0xC568, 0xC569, 0xC8E2, 0xC56A, 0xC56B, 0xC8E3, /* 0x40 */
+ 0xC56C, 0xC8E4, 0xC56D, 0xC56E, 0xC56F, 0xC570, 0xC571, 0xC572, /* 0x40 */
+ 0xC8E5, 0xC8E6, 0xC573, 0xC574, 0xC8E7, 0xC575, 0xC8E8, 0xC8E9, /* 0x50 */
+ 0xC8EA, 0xC8EB, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC581, /* 0x50 */
+ 0xC8EC, 0xC8ED, 0xC582, 0xC8EE, 0xC583, 0xC8EF, 0xC584, 0xC585, /* 0x60 */
+ 0xC586, 0xC8F0, 0xC587, 0xC588, 0xC8F1, 0xC589, 0xC58A, 0xC58B, /* 0x60 */
+ 0xC8F2, 0xC58C, 0xC58D, 0xC58E, 0xC8F3, 0xC58F, 0xC590, 0xC591, /* 0x70 */
+ 0xC592, 0xC593, 0xC594, 0xC595, 0xC8F4, 0xC8F5, 0xC596, 0xC597, /* 0x70 */
+ 0xC598, 0xC8F6, 0xC599, 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC59E, /* 0x80 */
+ 0xC8F7, 0xC8F8, 0xC59F, 0xC5A0, 0xC8F9, 0xC641, 0xC642, 0xC643, /* 0x80 */
+ 0xC8FA, 0xC644, 0xC645, 0xC646, 0xC647, 0xC648, 0xC649, 0xC64A, /* 0x90 */
+ 0xC8FB, 0xC8FC, 0xC64B, 0xC8FD, 0xC64C, 0xC8FE, 0xC64D, 0xC64E, /* 0x90 */
+ 0xC64F, 0xC650, 0xC651, 0xC652 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCBD0, 0xCBD6, 0xCBE7, 0xCDCF, 0xCDE8, 0xCEAD, 0xCFFB, 0xD0A2, /* 0x00 */
+ 0xD0B8, 0xD0D0, 0xD0DD, 0xD1D4, 0xD1D5, 0xD1D8, 0xD1DB, 0xD1DC, /* 0x00 */
+ 0xD1DD, 0xD1DE, 0xD1DF, 0xD1E0, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, /* 0x10 */
+ 0xD1E6, 0xD1E8, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1ED, 0xD1EF, 0xD1F0, /* 0x10 */
+ 0xD1F2, 0xD1F6, 0xD1FA, 0xD1FC, 0xD1FD, 0xD1FE, 0xD2A2, 0xD2A3, /* 0x20 */
+ 0xD2A7, 0xD2A8, 0xD2A9, 0xD2AA, 0xD2AB, 0xD2AD, 0xD2B2, 0xD2BE, /* 0x20 */
+ 0xD2C2, 0xD2C3, 0xD2C4, 0xD2C6, 0xD2C7, 0xD2C8, 0xD2C9, 0xD2CA, /* 0x30 */
+ 0xD2CB, 0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, /* 0x30 */
+ 0xD2D4, 0xD2D5, 0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DE, 0xD2DF, /* 0x40 */
+ 0xD2E1, 0xD2E2, 0xD2E4, 0xD2E5, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9, /* 0x40 */
+ 0xD2EA, 0xD2EB, 0xD2F0, 0xD2F1, 0xD2F2, 0xD2F3, 0xD2F4, 0xD2F5, /* 0x50 */
+ 0xD2F7, 0xD2F8, 0xD4E6, 0xD4FC, 0xD5A5, 0xD5AB, 0xD5AE, 0xD6B8, /* 0x50 */
+ 0xD6CD, 0xD7CB, 0xD7E4, 0xDBC5, 0xDBE4, 0xDCA5, 0xDDA5, 0xDDD5, /* 0x60 */
+ 0xDDF4, 0xDEFC, 0xDEFE, 0xDFB3, 0xDFE1, 0xDFE8, 0xE0F1, 0xE1AD, /* 0x60 */
+ 0xE1ED, 0xE3F5, 0xE4A1, 0xE4A9, 0xE5AE, 0xE5B1, 0xE5B2, 0xE5B9, /* 0x70 */
+ 0xE5BB, 0xE5BC, 0xE5C4, 0xE5CE, 0xE5D0, 0xE5D2, 0xE5D6, 0xE5FA, /* 0x70 */
+ 0xE5FB, 0xE5FC, 0xE5FE, 0xE6A1, 0xE6A4, 0xE6A7, 0xE6AD, 0xE6AF, /* 0x80 */
+ 0xE6B0, 0xE6B1, 0xE6B3, 0xE6B7, 0xE6B8, 0xE6BC, 0xE6C4, 0xE6C6, /* 0x80 */
+ 0xE6C7, 0xE6CA, 0xE6D2, 0xE6D6, 0xE6D9, 0xE6DC, 0xE6DF, 0xE6E1, /* 0x90 */
+ 0xE6E4, 0xE6E5, 0xE6E6, 0xE6E8, 0xE6EA, 0xE6EB, 0xE6EC, 0xE6EF, /* 0x90 */
+ 0xE6F1, 0xE6F2, 0xE6F5, 0xE6F6, 0xE6F7, 0xE6F9, 0xE7A1, 0xE7A6, /* 0xA0 */
+ 0xE7A9, 0xE7AA, 0xE7AC, 0xE7AD, 0xE7B0, 0xE7BF, 0xE7C1, 0xE7C6, /* 0xA0 */
+ 0xE7C7, 0xE7CB, 0xE7CD, 0xE7CF, 0xE7D0, 0xE7D3, 0xE7DF, 0xE7E4, /* 0xB0 */
+ 0xE7E6, 0xE7F7, 0xE8E7, 0xE8E8, 0xE8F0, 0xE8F1, 0xE8F7, 0xE8F9, /* 0xB0 */
+ 0xE8FB, 0xE8FE, 0xE9A7, 0xE9AC, 0xE9CC, 0xE9F7, 0xEAC1, 0xEAE5, /* 0xC0 */
+ 0xEAF4, 0xEAF7, 0xEAFC, 0xEAFE, 0xEBA4, 0xEBA7, 0xEBA9, 0xEBAA, /* 0xC0 */
+ 0xEBBA, 0xEBBB, 0xEBBD, 0xEBC1, 0xEBC2, 0xEBC6, 0xEBC7, 0xEBCC, /* 0xD0 */
+ 0xEBCF, 0xEBD0, 0xEBD1, 0xEBD2, 0xEBD8, 0xECA6, 0xECA7, 0xECAA, /* 0xD0 */
+ 0xECAF, 0xECB0, 0xECB1, 0xECB2, 0xECB5, 0xECB8, 0xECBA, 0xECC0, /* 0xE0 */
+ 0xECC1, 0xECC5, 0xECC6, 0xECC9, 0xECCA, 0xECD5, 0xECDD, 0xECDE, /* 0xE0 */
+ 0xECE1, 0xECE4, 0xECE7, 0xECE8, 0xECF7, 0xECF8, 0xECFA, 0xEDA1, /* 0xF0 */
+ 0xEDA2, 0xEDA3, 0xEDEE, 0xEEDB, 0xF2BD, 0xF2FA, 0xF3B1, 0xF4A7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_FA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF4EE, 0xF6F4, 0xF6F6, 0xF7B8, 0xF7C8, 0xF7D3, 0xF8DB, 0xF8F0, /* 0x00 */
+ 0xFAA1, 0xFAA2, 0xFAE6, 0xFCA9 /* 0x00 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_KSC5601_FF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA3A1, 0xA3A2, 0xA3A3, 0xA3A4, 0xA3A5, 0xA3A6, 0xA3A7, /* 0x00 */
+ 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF, /* 0x00 */
+ 0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7, /* 0x10 */
+ 0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF, /* 0x10 */
+ 0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7, /* 0x20 */
+ 0xA3C8, 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF, /* 0x20 */
+ 0xA3D0, 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7, /* 0x30 */
+ 0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA1AC, 0xA3DD, 0xA3DE, 0xA3DF, /* 0x30 */
+ 0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7, /* 0x40 */
+ 0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE, 0xA3EF, /* 0x40 */
+ 0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, 0xA3F6, 0xA3F7, /* 0x50 */
+ 0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA2A6, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xA1CB, 0xA1CC, 0xA1FE, 0xA3FE, 0, 0xA1CD, 0xA3DC /* 0xE0 */
+};
+
diff --git a/sal/textenc/tcvtkr4.tab b/sal/textenc/tcvtkr4.tab
new file mode 100644
index 000000000000..937d9c338d8d
--- /dev/null
+++ b/sal/textenc/tcvtkr4.tab
@@ -0,0 +1,3503 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the DBCS to UniCode tables for the following */
+/* korean charsets: */
+/* JOHAB */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3133, 0, 0x3135, 0x3136, /* 0x40 */
+ 0, 0, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, /* 0x40 */
+ 0x3140, 0, 0, 0, 0x3144, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x314F, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x3150, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x3151, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x3152, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x3153 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3154, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x3155, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x3156, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x3157, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x3158, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x3159 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x315A, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x315B, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x315C, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x315D, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x315E, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x315F /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3160, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0x3161, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0x3162, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x3163 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3131, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xAC00, 0xAC01, 0xAC02, 0xAC03, 0xAC04, 0xAC05, 0xAC06, /* 0x60 */
+ 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, /* 0x60 */
+ 0xAC0F, 0xAC10, 0, 0xAC11, 0xAC12, 0xAC13, 0xAC14, 0xAC15, /* 0x70 */
+ 0xAC16, 0xAC17, 0xAC18, 0xAC19, 0xAC1A, 0xAC1B, 0, 0, /* 0x70 */
+ 0, 0xAC1C, 0xAC1D, 0xAC1E, 0xAC1F, 0xAC20, 0xAC21, 0xAC22, /* 0x80 */
+ 0xAC23, 0xAC24, 0xAC25, 0xAC26, 0xAC27, 0xAC28, 0xAC29, 0xAC2A, /* 0x80 */
+ 0xAC2B, 0xAC2C, 0, 0xAC2D, 0xAC2E, 0xAC2F, 0xAC30, 0xAC31, /* 0x90 */
+ 0xAC32, 0xAC33, 0xAC34, 0xAC35, 0xAC36, 0xAC37, 0, 0, /* 0x90 */
+ 0, 0xAC38, 0xAC39, 0xAC3A, 0xAC3B, 0xAC3C, 0xAC3D, 0xAC3E, /* 0xA0 */
+ 0xAC3F, 0xAC40, 0xAC41, 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, /* 0xA0 */
+ 0xAC47, 0xAC48, 0, 0xAC49, 0xAC4A, 0xAC4B, 0xAC4C, 0xAC4D, /* 0xB0 */
+ 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53, 0, 0, /* 0xB0 */
+ 0, 0xAC54, 0xAC55, 0xAC56, 0xAC57, 0xAC58, 0xAC59, 0xAC5A, /* 0xC0 */
+ 0xAC5B, 0xAC5C, 0xAC5D, 0xAC5E, 0xAC5F, 0xAC60, 0xAC61, 0xAC62, /* 0xC0 */
+ 0xAC63, 0xAC64, 0, 0xAC65, 0xAC66, 0xAC67, 0xAC68, 0xAC69, /* 0xD0 */
+ 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E, 0xAC6F, 0, 0, /* 0xD0 */
+ 0, 0xAC70, 0xAC71, 0xAC72, 0xAC73, 0xAC74, 0xAC75, 0xAC76, /* 0xE0 */
+ 0xAC77, 0xAC78, 0xAC79, 0xAC7A, 0xAC7B, 0xAC7C, 0xAC7D, 0xAC7E, /* 0xE0 */
+ 0xAC7F, 0xAC80, 0, 0xAC81, 0xAC82, 0xAC83, 0xAC84, 0xAC85, /* 0xF0 */
+ 0xAC86, 0xAC87, 0xAC88, 0xAC89, 0xAC8A, 0xAC8B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAC8C, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC90, 0xAC91, 0xAC92, /* 0x40 */
+ 0xAC93, 0xAC94, 0xAC95, 0xAC96, 0xAC97, 0xAC98, 0xAC99, 0xAC9A, /* 0x40 */
+ 0xAC9B, 0xAC9C, 0, 0xAC9D, 0xAC9E, 0xAC9F, 0xACA0, 0xACA1, /* 0x50 */
+ 0xACA2, 0xACA3, 0xACA4, 0xACA5, 0xACA6, 0xACA7, 0, 0, /* 0x50 */
+ 0, 0xACA8, 0xACA9, 0xACAA, 0xACAB, 0xACAC, 0xACAD, 0xACAE, /* 0x60 */
+ 0xACAF, 0xACB0, 0xACB1, 0xACB2, 0xACB3, 0xACB4, 0xACB5, 0xACB6, /* 0x60 */
+ 0xACB7, 0xACB8, 0, 0xACB9, 0xACBA, 0xACBB, 0xACBC, 0xACBD, /* 0x70 */
+ 0xACBE, 0xACBF, 0xACC0, 0xACC1, 0xACC2, 0xACC3, 0, 0, /* 0x70 */
+ 0, 0xACC4, 0xACC5, 0xACC6, 0xACC7, 0xACC8, 0xACC9, 0xACCA, /* 0x80 */
+ 0xACCB, 0xACCC, 0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, /* 0x80 */
+ 0xACD3, 0xACD4, 0, 0xACD5, 0xACD6, 0xACD7, 0xACD8, 0xACD9, /* 0x90 */
+ 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE, 0xACDF, 0, 0, /* 0x90 */
+ 0, 0xACE0, 0xACE1, 0xACE2, 0xACE3, 0xACE4, 0xACE5, 0xACE6, /* 0xA0 */
+ 0xACE7, 0xACE8, 0xACE9, 0xACEA, 0xACEB, 0xACEC, 0xACED, 0xACEE, /* 0xA0 */
+ 0xACEF, 0xACF0, 0, 0xACF1, 0xACF2, 0xACF3, 0xACF4, 0xACF5, /* 0xB0 */
+ 0xACF6, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB, 0, 0, /* 0xB0 */
+ 0, 0xACFC, 0xACFD, 0xACFE, 0xACFF, 0xAD00, 0xAD01, 0xAD02, /* 0xC0 */
+ 0xAD03, 0xAD04, 0xAD05, 0xAD06, 0xAD07, 0xAD08, 0xAD09, 0xAD0A, /* 0xC0 */
+ 0xAD0B, 0xAD0C, 0, 0xAD0D, 0xAD0E, 0xAD0F, 0xAD10, 0xAD11, /* 0xD0 */
+ 0xAD12, 0xAD13, 0xAD14, 0xAD15, 0xAD16, 0xAD17, 0, 0, /* 0xD0 */
+ 0, 0xAD18, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1C, 0xAD1D, 0xAD1E, /* 0xE0 */
+ 0xAD1F, 0xAD20, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, /* 0xE0 */
+ 0xAD27, 0xAD28, 0, 0xAD29, 0xAD2A, 0xAD2B, 0xAD2C, 0xAD2D, /* 0xF0 */
+ 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32, 0xAD33 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAD34, 0xAD35, 0xAD36, 0xAD37, 0xAD38, 0xAD39, 0xAD3A, /* 0x40 */
+ 0xAD3B, 0xAD3C, 0xAD3D, 0xAD3E, 0xAD3F, 0xAD40, 0xAD41, 0xAD42, /* 0x40 */
+ 0xAD43, 0xAD44, 0, 0xAD45, 0xAD46, 0xAD47, 0xAD48, 0xAD49, /* 0x50 */
+ 0xAD4A, 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0, 0, /* 0x50 */
+ 0, 0xAD50, 0xAD51, 0xAD52, 0xAD53, 0xAD54, 0xAD55, 0xAD56, /* 0x60 */
+ 0xAD57, 0xAD58, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E, /* 0x60 */
+ 0xAD5F, 0xAD60, 0, 0xAD61, 0xAD62, 0xAD63, 0xAD64, 0xAD65, /* 0x70 */
+ 0xAD66, 0xAD67, 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0, 0, /* 0x70 */
+ 0, 0xAD6C, 0xAD6D, 0xAD6E, 0xAD6F, 0xAD70, 0xAD71, 0xAD72, /* 0x80 */
+ 0xAD73, 0xAD74, 0xAD75, 0xAD76, 0xAD77, 0xAD78, 0xAD79, 0xAD7A, /* 0x80 */
+ 0xAD7B, 0xAD7C, 0, 0xAD7D, 0xAD7E, 0xAD7F, 0xAD80, 0xAD81, /* 0x90 */
+ 0xAD82, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87, 0, 0, /* 0x90 */
+ 0, 0xAD88, 0xAD89, 0xAD8A, 0xAD8B, 0xAD8C, 0xAD8D, 0xAD8E, /* 0xA0 */
+ 0xAD8F, 0xAD90, 0xAD91, 0xAD92, 0xAD93, 0xAD94, 0xAD95, 0xAD96, /* 0xA0 */
+ 0xAD97, 0xAD98, 0, 0xAD99, 0xAD9A, 0xAD9B, 0xAD9C, 0xAD9D, /* 0xB0 */
+ 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2, 0xADA3, 0, 0, /* 0xB0 */
+ 0, 0xADA4, 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, /* 0xC0 */
+ 0xADAB, 0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2, /* 0xC0 */
+ 0xADB3, 0xADB4, 0, 0xADB5, 0xADB6, 0xADB7, 0xADB8, 0xADB9, /* 0xD0 */
+ 0xADBA, 0xADBB, 0xADBC, 0xADBD, 0xADBE, 0xADBF, 0, 0, /* 0xD0 */
+ 0, 0xADC0, 0xADC1, 0xADC2, 0xADC3, 0xADC4, 0xADC5, 0xADC6, /* 0xE0 */
+ 0xADC7, 0xADC8, 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, /* 0xE0 */
+ 0xADCF, 0xADD0, 0, 0xADD1, 0xADD2, 0xADD3, 0xADD4, 0xADD5, /* 0xF0 */
+ 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xADDC, 0xADDD, 0xADDE, 0xADDF, 0xADE0, 0xADE1, 0xADE2, /* 0x40 */
+ 0xADE3, 0xADE4, 0xADE5, 0xADE6, 0xADE7, 0xADE8, 0xADE9, 0xADEA, /* 0x40 */
+ 0xADEB, 0xADEC, 0, 0xADED, 0xADEE, 0xADEF, 0xADF0, 0xADF1, /* 0x50 */
+ 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6, 0xADF7, 0, 0, /* 0x50 */
+ 0, 0xADF8, 0xADF9, 0xADFA, 0xADFB, 0xADFC, 0xADFD, 0xADFE, /* 0x60 */
+ 0xADFF, 0xAE00, 0xAE01, 0xAE02, 0xAE03, 0xAE04, 0xAE05, 0xAE06, /* 0x60 */
+ 0xAE07, 0xAE08, 0, 0xAE09, 0xAE0A, 0xAE0B, 0xAE0C, 0xAE0D, /* 0x70 */
+ 0xAE0E, 0xAE0F, 0xAE10, 0xAE11, 0xAE12, 0xAE13, 0, 0, /* 0x70 */
+ 0, 0xAE14, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19, 0xAE1A, /* 0x80 */
+ 0xAE1B, 0xAE1C, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21, 0xAE22, /* 0x80 */
+ 0xAE23, 0xAE24, 0, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29, /* 0x90 */
+ 0xAE2A, 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0, 0, /* 0x90 */
+ 0, 0xAE30, 0xAE31, 0xAE32, 0xAE33, 0xAE34, 0xAE35, 0xAE36, /* 0xA0 */
+ 0xAE37, 0xAE38, 0xAE39, 0xAE3A, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E, /* 0xA0 */
+ 0xAE3F, 0xAE40, 0, 0xAE41, 0xAE42, 0xAE43, 0xAE44, 0xAE45, /* 0xB0 */
+ 0xAE46, 0xAE47, 0xAE48, 0xAE49, 0xAE4A, 0xAE4B /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3132, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE4F, 0xAE50, 0xAE51, 0xAE52, /* 0x60 */
+ 0xAE53, 0xAE54, 0xAE55, 0xAE56, 0xAE57, 0xAE58, 0xAE59, 0xAE5A, /* 0x60 */
+ 0xAE5B, 0xAE5C, 0, 0xAE5D, 0xAE5E, 0xAE5F, 0xAE60, 0xAE61, /* 0x70 */
+ 0xAE62, 0xAE63, 0xAE64, 0xAE65, 0xAE66, 0xAE67, 0, 0, /* 0x70 */
+ 0, 0xAE68, 0xAE69, 0xAE6A, 0xAE6B, 0xAE6C, 0xAE6D, 0xAE6E, /* 0x80 */
+ 0xAE6F, 0xAE70, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75, 0xAE76, /* 0x80 */
+ 0xAE77, 0xAE78, 0, 0xAE79, 0xAE7A, 0xAE7B, 0xAE7C, 0xAE7D, /* 0x90 */
+ 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82, 0xAE83, 0, 0, /* 0x90 */
+ 0, 0xAE84, 0xAE85, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, /* 0xA0 */
+ 0xAE8B, 0xAE8C, 0xAE8D, 0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92, /* 0xA0 */
+ 0xAE93, 0xAE94, 0, 0xAE95, 0xAE96, 0xAE97, 0xAE98, 0xAE99, /* 0xB0 */
+ 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D, 0xAE9E, 0xAE9F, 0, 0, /* 0xB0 */
+ 0, 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5, 0xAEA6, /* 0xC0 */
+ 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD, 0xAEAE, /* 0xC0 */
+ 0xAEAF, 0xAEB0, 0, 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5, /* 0xD0 */
+ 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0, 0, /* 0xD0 */
+ 0, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEBF, 0xAEC0, 0xAEC1, 0xAEC2, /* 0xE0 */
+ 0xAEC3, 0xAEC4, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA, /* 0xE0 */
+ 0xAECB, 0xAECC, 0, 0xAECD, 0xAECE, 0xAECF, 0xAED0, 0xAED1, /* 0xF0 */
+ 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAED8, 0xAED9, 0xAEDA, 0xAEDB, 0xAEDC, 0xAEDD, 0xAEDE, /* 0x40 */
+ 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2, 0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6, /* 0x40 */
+ 0xAEE7, 0xAEE8, 0, 0xAEE9, 0xAEEA, 0xAEEB, 0xAEEC, 0xAEED, /* 0x50 */
+ 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0, 0, /* 0x50 */
+ 0, 0xAEF4, 0xAEF5, 0xAEF6, 0xAEF7, 0xAEF8, 0xAEF9, 0xAEFA, /* 0x60 */
+ 0xAEFB, 0xAEFC, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00, 0xAF01, 0xAF02, /* 0x60 */
+ 0xAF03, 0xAF04, 0, 0xAF05, 0xAF06, 0xAF07, 0xAF08, 0xAF09, /* 0x70 */
+ 0xAF0A, 0xAF0B, 0xAF0C, 0xAF0D, 0xAF0E, 0xAF0F, 0, 0, /* 0x70 */
+ 0, 0xAF10, 0xAF11, 0xAF12, 0xAF13, 0xAF14, 0xAF15, 0xAF16, /* 0x80 */
+ 0xAF17, 0xAF18, 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C, 0xAF1D, 0xAF1E, /* 0x80 */
+ 0xAF1F, 0xAF20, 0, 0xAF21, 0xAF22, 0xAF23, 0xAF24, 0xAF25, /* 0x90 */
+ 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, 0, 0, /* 0x90 */
+ 0, 0xAF2C, 0xAF2D, 0xAF2E, 0xAF2F, 0xAF30, 0xAF31, 0xAF32, /* 0xA0 */
+ 0xAF33, 0xAF34, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39, 0xAF3A, /* 0xA0 */
+ 0xAF3B, 0xAF3C, 0, 0xAF3D, 0xAF3E, 0xAF3F, 0xAF40, 0xAF41, /* 0xB0 */
+ 0xAF42, 0xAF43, 0xAF44, 0xAF45, 0xAF46, 0xAF47, 0, 0, /* 0xB0 */
+ 0, 0xAF48, 0xAF49, 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, /* 0xC0 */
+ 0xAF4F, 0xAF50, 0xAF51, 0xAF52, 0xAF53, 0xAF54, 0xAF55, 0xAF56, /* 0xC0 */
+ 0xAF57, 0xAF58, 0, 0xAF59, 0xAF5A, 0xAF5B, 0xAF5C, 0xAF5D, /* 0xD0 */
+ 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, 0xAF63, 0, 0, /* 0xD0 */
+ 0, 0xAF64, 0xAF65, 0xAF66, 0xAF67, 0xAF68, 0xAF69, 0xAF6A, /* 0xE0 */
+ 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70, 0xAF71, 0xAF72, /* 0xE0 */
+ 0xAF73, 0xAF74, 0, 0xAF75, 0xAF76, 0xAF77, 0xAF78, 0xAF79, /* 0xF0 */
+ 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAF80, 0xAF81, 0xAF82, 0xAF83, 0xAF84, 0xAF85, 0xAF86, /* 0x40 */
+ 0xAF87, 0xAF88, 0xAF89, 0xAF8A, 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, /* 0x40 */
+ 0xAF8F, 0xAF90, 0, 0xAF91, 0xAF92, 0xAF93, 0xAF94, 0xAF95, /* 0x50 */
+ 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, 0, 0, /* 0x50 */
+ 0, 0xAF9C, 0xAF9D, 0xAF9E, 0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2, /* 0x60 */
+ 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6, 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, /* 0x60 */
+ 0xAFAB, 0xAFAC, 0, 0xAFAD, 0xAFAE, 0xAFAF, 0xAFB0, 0xAFB1, /* 0x70 */
+ 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6, 0xAFB7, 0, 0, /* 0x70 */
+ 0, 0xAFB8, 0xAFB9, 0xAFBA, 0xAFBB, 0xAFBC, 0xAFBD, 0xAFBE, /* 0x80 */
+ 0xAFBF, 0xAFC0, 0xAFC1, 0xAFC2, 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, /* 0x80 */
+ 0xAFC7, 0xAFC8, 0, 0xAFC9, 0xAFCA, 0xAFCB, 0xAFCC, 0xAFCD, /* 0x90 */
+ 0xAFCE, 0xAFCF, 0xAFD0, 0xAFD1, 0xAFD2, 0xAFD3, 0, 0, /* 0x90 */
+ 0, 0xAFD4, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9, 0xAFDA, /* 0xA0 */
+ 0xAFDB, 0xAFDC, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, 0xAFE2, /* 0xA0 */
+ 0xAFE3, 0xAFE4, 0, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFE8, 0xAFE9, /* 0xB0 */
+ 0xAFEA, 0xAFEB, 0xAFEC, 0xAFED, 0xAFEE, 0xAFEF, 0, 0, /* 0xB0 */
+ 0, 0xAFF0, 0xAFF1, 0xAFF2, 0xAFF3, 0xAFF4, 0xAFF5, 0xAFF6, /* 0xC0 */
+ 0xAFF7, 0xAFF8, 0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, /* 0xC0 */
+ 0xAFFF, 0xB000, 0, 0xB001, 0xB002, 0xB003, 0xB004, 0xB005, /* 0xD0 */
+ 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B, 0, 0, /* 0xD0 */
+ 0, 0xB00C, 0xB00D, 0xB00E, 0xB00F, 0xB010, 0xB011, 0xB012, /* 0xE0 */
+ 0xB013, 0xB014, 0xB015, 0xB016, 0xB017, 0xB018, 0xB019, 0xB01A, /* 0xE0 */
+ 0xB01B, 0xB01C, 0, 0xB01D, 0xB01E, 0xB01F, 0xB020, 0xB021, /* 0xF0 */
+ 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB028, 0xB029, 0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, /* 0x40 */
+ 0xB02F, 0xB030, 0xB031, 0xB032, 0xB033, 0xB034, 0xB035, 0xB036, /* 0x40 */
+ 0xB037, 0xB038, 0, 0xB039, 0xB03A, 0xB03B, 0xB03C, 0xB03D, /* 0x50 */
+ 0xB03E, 0xB03F, 0xB040, 0xB041, 0xB042, 0xB043, 0, 0, /* 0x50 */
+ 0, 0xB044, 0xB045, 0xB046, 0xB047, 0xB048, 0xB049, 0xB04A, /* 0x60 */
+ 0xB04B, 0xB04C, 0xB04D, 0xB04E, 0xB04F, 0xB050, 0xB051, 0xB052, /* 0x60 */
+ 0xB053, 0xB054, 0, 0xB055, 0xB056, 0xB057, 0xB058, 0xB059, /* 0x70 */
+ 0xB05A, 0xB05B, 0xB05C, 0xB05D, 0xB05E, 0xB05F, 0, 0, /* 0x70 */
+ 0, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065, 0xB066, /* 0x80 */
+ 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D, 0xB06E, /* 0x80 */
+ 0xB06F, 0xB070, 0, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075, /* 0x90 */
+ 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, 0, 0, /* 0x90 */
+ 0, 0xB07C, 0xB07D, 0xB07E, 0xB07F, 0xB080, 0xB081, 0xB082, /* 0xA0 */
+ 0xB083, 0xB084, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089, 0xB08A, /* 0xA0 */
+ 0xB08B, 0xB08C, 0, 0xB08D, 0xB08E, 0xB08F, 0xB090, 0xB091, /* 0xB0 */
+ 0xB092, 0xB093, 0xB094, 0xB095, 0xB096, 0xB097 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3134, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB098, 0xB099, 0xB09A, 0xB09B, 0xB09C, 0xB09D, 0xB09E, /* 0x60 */
+ 0xB09F, 0xB0A0, 0xB0A1, 0xB0A2, 0xB0A3, 0xB0A4, 0xB0A5, 0xB0A6, /* 0x60 */
+ 0xB0A7, 0xB0A8, 0, 0xB0A9, 0xB0AA, 0xB0AB, 0xB0AC, 0xB0AD, /* 0x70 */
+ 0xB0AE, 0xB0AF, 0xB0B0, 0xB0B1, 0xB0B2, 0xB0B3, 0, 0, /* 0x70 */
+ 0, 0xB0B4, 0xB0B5, 0xB0B6, 0xB0B7, 0xB0B8, 0xB0B9, 0xB0BA, /* 0x80 */
+ 0xB0BB, 0xB0BC, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2, /* 0x80 */
+ 0xB0C3, 0xB0C4, 0, 0xB0C5, 0xB0C6, 0xB0C7, 0xB0C8, 0xB0C9, /* 0x90 */
+ 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF, 0, 0, /* 0x90 */
+ 0, 0xB0D0, 0xB0D1, 0xB0D2, 0xB0D3, 0xB0D4, 0xB0D5, 0xB0D6, /* 0xA0 */
+ 0xB0D7, 0xB0D8, 0xB0D9, 0xB0DA, 0xB0DB, 0xB0DC, 0xB0DD, 0xB0DE, /* 0xA0 */
+ 0xB0DF, 0xB0E0, 0, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4, 0xB0E5, /* 0xB0 */
+ 0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, 0, 0, /* 0xB0 */
+ 0, 0xB0EC, 0xB0ED, 0xB0EE, 0xB0EF, 0xB0F0, 0xB0F1, 0xB0F2, /* 0xC0 */
+ 0xB0F3, 0xB0F4, 0xB0F5, 0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA, /* 0xC0 */
+ 0xB0FB, 0xB0FC, 0, 0xB0FD, 0xB0FE, 0xB0FF, 0xB100, 0xB101, /* 0xD0 */
+ 0xB102, 0xB103, 0xB104, 0xB105, 0xB106, 0xB107, 0, 0, /* 0xD0 */
+ 0, 0xB108, 0xB109, 0xB10A, 0xB10B, 0xB10C, 0xB10D, 0xB10E, /* 0xE0 */
+ 0xB10F, 0xB110, 0xB111, 0xB112, 0xB113, 0xB114, 0xB115, 0xB116, /* 0xE0 */
+ 0xB117, 0xB118, 0, 0xB119, 0xB11A, 0xB11B, 0xB11C, 0xB11D, /* 0xF0 */
+ 0xB11E, 0xB11F, 0xB120, 0xB121, 0xB122, 0xB123 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB124, 0xB125, 0xB126, 0xB127, 0xB128, 0xB129, 0xB12A, /* 0x40 */
+ 0xB12B, 0xB12C, 0xB12D, 0xB12E, 0xB12F, 0xB130, 0xB131, 0xB132, /* 0x40 */
+ 0xB133, 0xB134, 0, 0xB135, 0xB136, 0xB137, 0xB138, 0xB139, /* 0x50 */
+ 0xB13A, 0xB13B, 0xB13C, 0xB13D, 0xB13E, 0xB13F, 0, 0, /* 0x50 */
+ 0, 0xB140, 0xB141, 0xB142, 0xB143, 0xB144, 0xB145, 0xB146, /* 0x60 */
+ 0xB147, 0xB148, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, /* 0x60 */
+ 0xB14F, 0xB150, 0, 0xB151, 0xB152, 0xB153, 0xB154, 0xB155, /* 0x70 */
+ 0xB156, 0xB157, 0xB158, 0xB159, 0xB15A, 0xB15B, 0, 0, /* 0x70 */
+ 0, 0xB15C, 0xB15D, 0xB15E, 0xB15F, 0xB160, 0xB161, 0xB162, /* 0x80 */
+ 0xB163, 0xB164, 0xB165, 0xB166, 0xB167, 0xB168, 0xB169, 0xB16A, /* 0x80 */
+ 0xB16B, 0xB16C, 0, 0xB16D, 0xB16E, 0xB16F, 0xB170, 0xB171, /* 0x90 */
+ 0xB172, 0xB173, 0xB174, 0xB175, 0xB176, 0xB177, 0, 0, /* 0x90 */
+ 0, 0xB178, 0xB179, 0xB17A, 0xB17B, 0xB17C, 0xB17D, 0xB17E, /* 0xA0 */
+ 0xB17F, 0xB180, 0xB181, 0xB182, 0xB183, 0xB184, 0xB185, 0xB186, /* 0xA0 */
+ 0xB187, 0xB188, 0, 0xB189, 0xB18A, 0xB18B, 0xB18C, 0xB18D, /* 0xB0 */
+ 0xB18E, 0xB18F, 0xB190, 0xB191, 0xB192, 0xB193, 0, 0, /* 0xB0 */
+ 0, 0xB194, 0xB195, 0xB196, 0xB197, 0xB198, 0xB199, 0xB19A, /* 0xC0 */
+ 0xB19B, 0xB19C, 0xB19D, 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2, /* 0xC0 */
+ 0xB1A3, 0xB1A4, 0, 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A8, 0xB1A9, /* 0xD0 */
+ 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD, 0xB1AE, 0xB1AF, 0, 0, /* 0xD0 */
+ 0, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5, 0xB1B6, /* 0xE0 */
+ 0xB1B7, 0xB1B8, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD, 0xB1BE, /* 0xE0 */
+ 0xB1BF, 0xB1C0, 0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5, /* 0xF0 */
+ 0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB1CC, 0xB1CD, 0xB1CE, 0xB1CF, 0xB1D0, 0xB1D1, 0xB1D2, /* 0x40 */
+ 0xB1D3, 0xB1D4, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8, 0xB1D9, 0xB1DA, /* 0x40 */
+ 0xB1DB, 0xB1DC, 0, 0xB1DD, 0xB1DE, 0xB1DF, 0xB1E0, 0xB1E1, /* 0x50 */
+ 0xB1E2, 0xB1E3, 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0, 0, /* 0x50 */
+ 0, 0xB1E8, 0xB1E9, 0xB1EA, 0xB1EB, 0xB1EC, 0xB1ED, 0xB1EE, /* 0x60 */
+ 0xB1EF, 0xB1F0, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, /* 0x60 */
+ 0xB1F7, 0xB1F8, 0, 0xB1F9, 0xB1FA, 0xB1FB, 0xB1FC, 0xB1FD, /* 0x70 */
+ 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202, 0xB203, 0, 0, /* 0x70 */
+ 0, 0xB204, 0xB205, 0xB206, 0xB207, 0xB208, 0xB209, 0xB20A, /* 0x80 */
+ 0xB20B, 0xB20C, 0xB20D, 0xB20E, 0xB20F, 0xB210, 0xB211, 0xB212, /* 0x80 */
+ 0xB213, 0xB214, 0, 0xB215, 0xB216, 0xB217, 0xB218, 0xB219, /* 0x90 */
+ 0xB21A, 0xB21B, 0xB21C, 0xB21D, 0xB21E, 0xB21F, 0, 0, /* 0x90 */
+ 0, 0xB220, 0xB221, 0xB222, 0xB223, 0xB224, 0xB225, 0xB226, /* 0xA0 */
+ 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C, 0xB22D, 0xB22E, /* 0xA0 */
+ 0xB22F, 0xB230, 0, 0xB231, 0xB232, 0xB233, 0xB234, 0xB235, /* 0xB0 */
+ 0xB236, 0xB237, 0xB238, 0xB239, 0xB23A, 0xB23B, 0, 0, /* 0xB0 */
+ 0, 0xB23C, 0xB23D, 0xB23E, 0xB23F, 0xB240, 0xB241, 0xB242, /* 0xC0 */
+ 0xB243, 0xB244, 0xB245, 0xB246, 0xB247, 0xB248, 0xB249, 0xB24A, /* 0xC0 */
+ 0xB24B, 0xB24C, 0, 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251, /* 0xD0 */
+ 0xB252, 0xB253, 0xB254, 0xB255, 0xB256, 0xB257, 0, 0, /* 0xD0 */
+ 0, 0xB258, 0xB259, 0xB25A, 0xB25B, 0xB25C, 0xB25D, 0xB25E, /* 0xE0 */
+ 0xB25F, 0xB260, 0xB261, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, /* 0xE0 */
+ 0xB267, 0xB268, 0, 0xB269, 0xB26A, 0xB26B, 0xB26C, 0xB26D, /* 0xF0 */
+ 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB274, 0xB275, 0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, /* 0x40 */
+ 0xB27B, 0xB27C, 0xB27D, 0xB27E, 0xB27F, 0xB280, 0xB281, 0xB282, /* 0x40 */
+ 0xB283, 0xB284, 0, 0xB285, 0xB286, 0xB287, 0xB288, 0xB289, /* 0x50 */
+ 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xB28F, 0, 0, /* 0x50 */
+ 0, 0xB290, 0xB291, 0xB292, 0xB293, 0xB294, 0xB295, 0xB296, /* 0x60 */
+ 0xB297, 0xB298, 0xB299, 0xB29A, 0xB29B, 0xB29C, 0xB29D, 0xB29E, /* 0x60 */
+ 0xB29F, 0xB2A0, 0, 0xB2A1, 0xB2A2, 0xB2A3, 0xB2A4, 0xB2A5, /* 0x70 */
+ 0xB2A6, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AA, 0xB2AB, 0, 0, /* 0x70 */
+ 0, 0xB2AC, 0xB2AD, 0xB2AE, 0xB2AF, 0xB2B0, 0xB2B1, 0xB2B2, /* 0x80 */
+ 0xB2B3, 0xB2B4, 0xB2B5, 0xB2B6, 0xB2B7, 0xB2B8, 0xB2B9, 0xB2BA, /* 0x80 */
+ 0xB2BB, 0xB2BC, 0, 0xB2BD, 0xB2BE, 0xB2BF, 0xB2C0, 0xB2C1, /* 0x90 */
+ 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, 0, 0, /* 0x90 */
+ 0, 0xB2C8, 0xB2C9, 0xB2CA, 0xB2CB, 0xB2CC, 0xB2CD, 0xB2CE, /* 0xA0 */
+ 0xB2CF, 0xB2D0, 0xB2D1, 0xB2D2, 0xB2D3, 0xB2D4, 0xB2D5, 0xB2D6, /* 0xA0 */
+ 0xB2D7, 0xB2D8, 0, 0xB2D9, 0xB2DA, 0xB2DB, 0xB2DC, 0xB2DD, /* 0xB0 */
+ 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1, 0xB2E2, 0xB2E3 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3137, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB2E4, 0xB2E5, 0xB2E6, 0xB2E7, 0xB2E8, 0xB2E9, 0xB2EA, /* 0x60 */
+ 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F0, 0xB2F1, 0xB2F2, /* 0x60 */
+ 0xB2F3, 0xB2F4, 0, 0xB2F5, 0xB2F6, 0xB2F7, 0xB2F8, 0xB2F9, /* 0x70 */
+ 0xB2FA, 0xB2FB, 0xB2FC, 0xB2FD, 0xB2FE, 0xB2FF, 0, 0, /* 0x70 */
+ 0, 0xB300, 0xB301, 0xB302, 0xB303, 0xB304, 0xB305, 0xB306, /* 0x80 */
+ 0xB307, 0xB308, 0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, /* 0x80 */
+ 0xB30F, 0xB310, 0, 0xB311, 0xB312, 0xB313, 0xB314, 0xB315, /* 0x90 */
+ 0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, 0, 0, /* 0x90 */
+ 0, 0xB31C, 0xB31D, 0xB31E, 0xB31F, 0xB320, 0xB321, 0xB322, /* 0xA0 */
+ 0xB323, 0xB324, 0xB325, 0xB326, 0xB327, 0xB328, 0xB329, 0xB32A, /* 0xA0 */
+ 0xB32B, 0xB32C, 0, 0xB32D, 0xB32E, 0xB32F, 0xB330, 0xB331, /* 0xB0 */
+ 0xB332, 0xB333, 0xB334, 0xB335, 0xB336, 0xB337, 0, 0, /* 0xB0 */
+ 0, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E, /* 0xC0 */
+ 0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346, /* 0xC0 */
+ 0xB347, 0xB348, 0, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D, /* 0xD0 */
+ 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0, 0, /* 0xD0 */
+ 0, 0xB354, 0xB355, 0xB356, 0xB357, 0xB358, 0xB359, 0xB35A, /* 0xE0 */
+ 0xB35B, 0xB35C, 0xB35D, 0xB35E, 0xB35F, 0xB360, 0xB361, 0xB362, /* 0xE0 */
+ 0xB363, 0xB364, 0, 0xB365, 0xB366, 0xB367, 0xB368, 0xB369, /* 0xF0 */
+ 0xB36A, 0xB36B, 0xB36C, 0xB36D, 0xB36E, 0xB36F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB370, 0xB371, 0xB372, 0xB373, 0xB374, 0xB375, 0xB376, /* 0x40 */
+ 0xB377, 0xB378, 0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E, /* 0x40 */
+ 0xB37F, 0xB380, 0, 0xB381, 0xB382, 0xB383, 0xB384, 0xB385, /* 0x50 */
+ 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0, 0, /* 0x50 */
+ 0, 0xB38C, 0xB38D, 0xB38E, 0xB38F, 0xB390, 0xB391, 0xB392, /* 0x60 */
+ 0xB393, 0xB394, 0xB395, 0xB396, 0xB397, 0xB398, 0xB399, 0xB39A, /* 0x60 */
+ 0xB39B, 0xB39C, 0, 0xB39D, 0xB39E, 0xB39F, 0xB3A0, 0xB3A1, /* 0x70 */
+ 0xB3A2, 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0, 0, /* 0x70 */
+ 0, 0xB3A8, 0xB3A9, 0xB3AA, 0xB3AB, 0xB3AC, 0xB3AD, 0xB3AE, /* 0x80 */
+ 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4, 0xB3B5, 0xB3B6, /* 0x80 */
+ 0xB3B7, 0xB3B8, 0, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC, 0xB3BD, /* 0x90 */
+ 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0, 0, /* 0x90 */
+ 0, 0xB3C4, 0xB3C5, 0xB3C6, 0xB3C7, 0xB3C8, 0xB3C9, 0xB3CA, /* 0xA0 */
+ 0xB3CB, 0xB3CC, 0xB3CD, 0xB3CE, 0xB3CF, 0xB3D0, 0xB3D1, 0xB3D2, /* 0xA0 */
+ 0xB3D3, 0xB3D4, 0, 0xB3D5, 0xB3D6, 0xB3D7, 0xB3D8, 0xB3D9, /* 0xB0 */
+ 0xB3DA, 0xB3DB, 0xB3DC, 0xB3DD, 0xB3DE, 0xB3DF, 0, 0, /* 0xB0 */
+ 0, 0xB3E0, 0xB3E1, 0xB3E2, 0xB3E3, 0xB3E4, 0xB3E5, 0xB3E6, /* 0xC0 */
+ 0xB3E7, 0xB3E8, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC, 0xB3ED, 0xB3EE, /* 0xC0 */
+ 0xB3EF, 0xB3F0, 0, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4, 0xB3F5, /* 0xD0 */
+ 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0, 0, /* 0xD0 */
+ 0, 0xB3FC, 0xB3FD, 0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, /* 0xE0 */
+ 0xB403, 0xB404, 0xB405, 0xB406, 0xB407, 0xB408, 0xB409, 0xB40A, /* 0xE0 */
+ 0xB40B, 0xB40C, 0, 0xB40D, 0xB40E, 0xB40F, 0xB410, 0xB411, /* 0xF0 */
+ 0xB412, 0xB413, 0xB414, 0xB415, 0xB416, 0xB417 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB418, 0xB419, 0xB41A, 0xB41B, 0xB41C, 0xB41D, 0xB41E, /* 0x40 */
+ 0xB41F, 0xB420, 0xB421, 0xB422, 0xB423, 0xB424, 0xB425, 0xB426, /* 0x40 */
+ 0xB427, 0xB428, 0, 0xB429, 0xB42A, 0xB42B, 0xB42C, 0xB42D, /* 0x50 */
+ 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, 0, 0, /* 0x50 */
+ 0, 0xB434, 0xB435, 0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, /* 0x60 */
+ 0xB43B, 0xB43C, 0xB43D, 0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, /* 0x60 */
+ 0xB443, 0xB444, 0, 0xB445, 0xB446, 0xB447, 0xB448, 0xB449, /* 0x70 */
+ 0xB44A, 0xB44B, 0xB44C, 0xB44D, 0xB44E, 0xB44F, 0, 0, /* 0x70 */
+ 0, 0xB450, 0xB451, 0xB452, 0xB453, 0xB454, 0xB455, 0xB456, /* 0x80 */
+ 0xB457, 0xB458, 0xB459, 0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, /* 0x80 */
+ 0xB45F, 0xB460, 0, 0xB461, 0xB462, 0xB463, 0xB464, 0xB465, /* 0x90 */
+ 0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0, 0, /* 0x90 */
+ 0, 0xB46C, 0xB46D, 0xB46E, 0xB46F, 0xB470, 0xB471, 0xB472, /* 0xA0 */
+ 0xB473, 0xB474, 0xB475, 0xB476, 0xB477, 0xB478, 0xB479, 0xB47A, /* 0xA0 */
+ 0xB47B, 0xB47C, 0, 0xB47D, 0xB47E, 0xB47F, 0xB480, 0xB481, /* 0xB0 */
+ 0xB482, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487, 0, 0, /* 0xB0 */
+ 0, 0xB488, 0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, /* 0xC0 */
+ 0xB48F, 0xB490, 0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, /* 0xC0 */
+ 0xB497, 0xB498, 0, 0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49D, /* 0xD0 */
+ 0xB49E, 0xB49F, 0xB4A0, 0xB4A1, 0xB4A2, 0xB4A3, 0, 0, /* 0xD0 */
+ 0, 0xB4A4, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A8, 0xB4A9, 0xB4AA, /* 0xE0 */
+ 0xB4AB, 0xB4AC, 0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, /* 0xE0 */
+ 0xB4B3, 0xB4B4, 0, 0xB4B5, 0xB4B6, 0xB4B7, 0xB4B8, 0xB4B9, /* 0xF0 */
+ 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB4C0, 0xB4C1, 0xB4C2, 0xB4C3, 0xB4C4, 0xB4C5, 0xB4C6, /* 0x40 */
+ 0xB4C7, 0xB4C8, 0xB4C9, 0xB4CA, 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, /* 0x40 */
+ 0xB4CF, 0xB4D0, 0, 0xB4D1, 0xB4D2, 0xB4D3, 0xB4D4, 0xB4D5, /* 0x50 */
+ 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0, 0, /* 0x50 */
+ 0, 0xB4DC, 0xB4DD, 0xB4DE, 0xB4DF, 0xB4E0, 0xB4E1, 0xB4E2, /* 0x60 */
+ 0xB4E3, 0xB4E4, 0xB4E5, 0xB4E6, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA, /* 0x60 */
+ 0xB4EB, 0xB4EC, 0, 0xB4ED, 0xB4EE, 0xB4EF, 0xB4F0, 0xB4F1, /* 0x70 */
+ 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6, 0xB4F7, 0, 0, /* 0x70 */
+ 0, 0xB4F8, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, /* 0x80 */
+ 0xB4FF, 0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, /* 0x80 */
+ 0xB507, 0xB508, 0, 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D, /* 0x90 */
+ 0xB50E, 0xB50F, 0xB510, 0xB511, 0xB512, 0xB513, 0, 0, /* 0x90 */
+ 0, 0xB514, 0xB515, 0xB516, 0xB517, 0xB518, 0xB519, 0xB51A, /* 0xA0 */
+ 0xB51B, 0xB51C, 0xB51D, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, /* 0xA0 */
+ 0xB523, 0xB524, 0, 0xB525, 0xB526, 0xB527, 0xB528, 0xB529, /* 0xB0 */
+ 0xB52A, 0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3138, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB530, 0xB531, 0xB532, 0xB533, 0xB534, 0xB535, 0xB536, /* 0x60 */
+ 0xB537, 0xB538, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E, /* 0x60 */
+ 0xB53F, 0xB540, 0, 0xB541, 0xB542, 0xB543, 0xB544, 0xB545, /* 0x70 */
+ 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54B, 0, 0, /* 0x70 */
+ 0, 0xB54C, 0xB54D, 0xB54E, 0xB54F, 0xB550, 0xB551, 0xB552, /* 0x80 */
+ 0xB553, 0xB554, 0xB555, 0xB556, 0xB557, 0xB558, 0xB559, 0xB55A, /* 0x80 */
+ 0xB55B, 0xB55C, 0, 0xB55D, 0xB55E, 0xB55F, 0xB560, 0xB561, /* 0x90 */
+ 0xB562, 0xB563, 0xB564, 0xB565, 0xB566, 0xB567, 0, 0, /* 0x90 */
+ 0, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, 0xB56D, 0xB56E, /* 0xA0 */
+ 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575, 0xB576, /* 0xA0 */
+ 0xB577, 0xB578, 0, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D, /* 0xB0 */
+ 0xB57E, 0xB57F, 0xB580, 0xB581, 0xB582, 0xB583, 0, 0, /* 0xB0 */
+ 0, 0xB584, 0xB585, 0xB586, 0xB587, 0xB588, 0xB589, 0xB58A, /* 0xC0 */
+ 0xB58B, 0xB58C, 0xB58D, 0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592, /* 0xC0 */
+ 0xB593, 0xB594, 0, 0xB595, 0xB596, 0xB597, 0xB598, 0xB599, /* 0xD0 */
+ 0xB59A, 0xB59B, 0xB59C, 0xB59D, 0xB59E, 0xB59F, 0, 0, /* 0xD0 */
+ 0, 0xB5A0, 0xB5A1, 0xB5A2, 0xB5A3, 0xB5A4, 0xB5A5, 0xB5A6, /* 0xE0 */
+ 0xB5A7, 0xB5A8, 0xB5A9, 0xB5AA, 0xB5AB, 0xB5AC, 0xB5AD, 0xB5AE, /* 0xE0 */
+ 0xB5AF, 0xB5B0, 0, 0xB5B1, 0xB5B2, 0xB5B3, 0xB5B4, 0xB5B5, /* 0xF0 */
+ 0xB5B6, 0xB5B7, 0xB5B8, 0xB5B9, 0xB5BA, 0xB5BB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB5BC, 0xB5BD, 0xB5BE, 0xB5BF, 0xB5C0, 0xB5C1, 0xB5C2, /* 0x40 */
+ 0xB5C3, 0xB5C4, 0xB5C5, 0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, /* 0x40 */
+ 0xB5CB, 0xB5CC, 0, 0xB5CD, 0xB5CE, 0xB5CF, 0xB5D0, 0xB5D1, /* 0x50 */
+ 0xB5D2, 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, 0, 0, /* 0x50 */
+ 0, 0xB5D8, 0xB5D9, 0xB5DA, 0xB5DB, 0xB5DC, 0xB5DD, 0xB5DE, /* 0x60 */
+ 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3, 0xB5E4, 0xB5E5, 0xB5E6, /* 0x60 */
+ 0xB5E7, 0xB5E8, 0, 0xB5E9, 0xB5EA, 0xB5EB, 0xB5EC, 0xB5ED, /* 0x70 */
+ 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F2, 0xB5F3, 0, 0, /* 0x70 */
+ 0, 0xB5F4, 0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, /* 0x80 */
+ 0xB5FB, 0xB5FC, 0xB5FD, 0xB5FE, 0xB5FF, 0xB600, 0xB601, 0xB602, /* 0x80 */
+ 0xB603, 0xB604, 0, 0xB605, 0xB606, 0xB607, 0xB608, 0xB609, /* 0x90 */
+ 0xB60A, 0xB60B, 0xB60C, 0xB60D, 0xB60E, 0xB60F, 0, 0, /* 0x90 */
+ 0, 0xB610, 0xB611, 0xB612, 0xB613, 0xB614, 0xB615, 0xB616, /* 0xA0 */
+ 0xB617, 0xB618, 0xB619, 0xB61A, 0xB61B, 0xB61C, 0xB61D, 0xB61E, /* 0xA0 */
+ 0xB61F, 0xB620, 0, 0xB621, 0xB622, 0xB623, 0xB624, 0xB625, /* 0xB0 */
+ 0xB626, 0xB627, 0xB628, 0xB629, 0xB62A, 0xB62B, 0, 0, /* 0xB0 */
+ 0, 0xB62C, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632, /* 0xC0 */
+ 0xB633, 0xB634, 0xB635, 0xB636, 0xB637, 0xB638, 0xB639, 0xB63A, /* 0xC0 */
+ 0xB63B, 0xB63C, 0, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641, /* 0xD0 */
+ 0xB642, 0xB643, 0xB644, 0xB645, 0xB646, 0xB647, 0, 0, /* 0xD0 */
+ 0, 0xB648, 0xB649, 0xB64A, 0xB64B, 0xB64C, 0xB64D, 0xB64E, /* 0xE0 */
+ 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, 0xB654, 0xB655, 0xB656, /* 0xE0 */
+ 0xB657, 0xB658, 0, 0xB659, 0xB65A, 0xB65B, 0xB65C, 0xB65D, /* 0xF0 */
+ 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB664, 0xB665, 0xB666, 0xB667, 0xB668, 0xB669, 0xB66A, /* 0x40 */
+ 0xB66B, 0xB66C, 0xB66D, 0xB66E, 0xB66F, 0xB670, 0xB671, 0xB672, /* 0x40 */
+ 0xB673, 0xB674, 0, 0xB675, 0xB676, 0xB677, 0xB678, 0xB679, /* 0x50 */
+ 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E, 0xB67F, 0, 0, /* 0x50 */
+ 0, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686, /* 0x60 */
+ 0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E, /* 0x60 */
+ 0xB68F, 0xB690, 0, 0xB691, 0xB692, 0xB693, 0xB694, 0xB695, /* 0x70 */
+ 0xB696, 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0, 0, /* 0x70 */
+ 0, 0xB69C, 0xB69D, 0xB69E, 0xB69F, 0xB6A0, 0xB6A1, 0xB6A2, /* 0x80 */
+ 0xB6A3, 0xB6A4, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA, /* 0x80 */
+ 0xB6AB, 0xB6AC, 0, 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B1, /* 0x90 */
+ 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5, 0xB6B6, 0xB6B7, 0, 0, /* 0x90 */
+ 0, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD, 0xB6BE, /* 0xA0 */
+ 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5, 0xB6C6, /* 0xA0 */
+ 0xB6C7, 0xB6C8, 0, 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD, /* 0xB0 */
+ 0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, 0xB6D2, 0xB6D3, 0, 0, /* 0xB0 */
+ 0, 0xB6D4, 0xB6D5, 0xB6D6, 0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, /* 0xC0 */
+ 0xB6DB, 0xB6DC, 0xB6DD, 0xB6DE, 0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, /* 0xC0 */
+ 0xB6E3, 0xB6E4, 0, 0xB6E5, 0xB6E6, 0xB6E7, 0xB6E8, 0xB6E9, /* 0xD0 */
+ 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, 0xB6EE, 0xB6EF, 0, 0, /* 0xD0 */
+ 0, 0xB6F0, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F4, 0xB6F5, 0xB6F6, /* 0xE0 */
+ 0xB6F7, 0xB6F8, 0xB6F9, 0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, /* 0xE0 */
+ 0xB6FF, 0xB700, 0, 0xB701, 0xB702, 0xB703, 0xB704, 0xB705, /* 0xF0 */
+ 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB70C, 0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712, /* 0x40 */
+ 0xB713, 0xB714, 0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A, /* 0x40 */
+ 0xB71B, 0xB71C, 0, 0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721, /* 0x50 */
+ 0xB722, 0xB723, 0xB724, 0xB725, 0xB726, 0xB727, 0, 0, /* 0x50 */
+ 0, 0xB728, 0xB729, 0xB72A, 0xB72B, 0xB72C, 0xB72D, 0xB72E, /* 0x60 */
+ 0xB72F, 0xB730, 0xB731, 0xB732, 0xB733, 0xB734, 0xB735, 0xB736, /* 0x60 */
+ 0xB737, 0xB738, 0, 0xB739, 0xB73A, 0xB73B, 0xB73C, 0xB73D, /* 0x70 */
+ 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0, 0, /* 0x70 */
+ 0, 0xB744, 0xB745, 0xB746, 0xB747, 0xB748, 0xB749, 0xB74A, /* 0x80 */
+ 0xB74B, 0xB74C, 0xB74D, 0xB74E, 0xB74F, 0xB750, 0xB751, 0xB752, /* 0x80 */
+ 0xB753, 0xB754, 0, 0xB755, 0xB756, 0xB757, 0xB758, 0xB759, /* 0x90 */
+ 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0, 0, /* 0x90 */
+ 0, 0xB760, 0xB761, 0xB762, 0xB763, 0xB764, 0xB765, 0xB766, /* 0xA0 */
+ 0xB767, 0xB768, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xB76E, /* 0xA0 */
+ 0xB76F, 0xB770, 0, 0xB771, 0xB772, 0xB773, 0xB774, 0xB775, /* 0xB0 */
+ 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3139, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB77C, 0xB77D, 0xB77E, 0xB77F, 0xB780, 0xB781, 0xB782, /* 0x60 */
+ 0xB783, 0xB784, 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, /* 0x60 */
+ 0xB78B, 0xB78C, 0, 0xB78D, 0xB78E, 0xB78F, 0xB790, 0xB791, /* 0x70 */
+ 0xB792, 0xB793, 0xB794, 0xB795, 0xB796, 0xB797, 0, 0, /* 0x70 */
+ 0, 0xB798, 0xB799, 0xB79A, 0xB79B, 0xB79C, 0xB79D, 0xB79E, /* 0x80 */
+ 0xB79F, 0xB7A0, 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, /* 0x80 */
+ 0xB7A7, 0xB7A8, 0, 0xB7A9, 0xB7AA, 0xB7AB, 0xB7AC, 0xB7AD, /* 0x90 */
+ 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0, 0, /* 0x90 */
+ 0, 0xB7B4, 0xB7B5, 0xB7B6, 0xB7B7, 0xB7B8, 0xB7B9, 0xB7BA, /* 0xA0 */
+ 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0, 0xB7C1, 0xB7C2, /* 0xA0 */
+ 0xB7C3, 0xB7C4, 0, 0xB7C5, 0xB7C6, 0xB7C7, 0xB7C8, 0xB7C9, /* 0xB0 */
+ 0xB7CA, 0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, 0, 0, /* 0xB0 */
+ 0, 0xB7D0, 0xB7D1, 0xB7D2, 0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6, /* 0xC0 */
+ 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA, 0xB7DB, 0xB7DC, 0xB7DD, 0xB7DE, /* 0xC0 */
+ 0xB7DF, 0xB7E0, 0, 0xB7E1, 0xB7E2, 0xB7E3, 0xB7E4, 0xB7E5, /* 0xD0 */
+ 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA, 0xB7EB, 0, 0, /* 0xD0 */
+ 0, 0xB7EC, 0xB7ED, 0xB7EE, 0xB7EF, 0xB7F0, 0xB7F1, 0xB7F2, /* 0xE0 */
+ 0xB7F3, 0xB7F4, 0xB7F5, 0xB7F6, 0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, /* 0xE0 */
+ 0xB7FB, 0xB7FC, 0, 0xB7FD, 0xB7FE, 0xB7FF, 0xB800, 0xB801, /* 0xF0 */
+ 0xB802, 0xB803, 0xB804, 0xB805, 0xB806, 0xB807 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB808, 0xB809, 0xB80A, 0xB80B, 0xB80C, 0xB80D, 0xB80E, /* 0x40 */
+ 0xB80F, 0xB810, 0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, /* 0x40 */
+ 0xB817, 0xB818, 0, 0xB819, 0xB81A, 0xB81B, 0xB81C, 0xB81D, /* 0x50 */
+ 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0, 0, /* 0x50 */
+ 0, 0xB824, 0xB825, 0xB826, 0xB827, 0xB828, 0xB829, 0xB82A, /* 0x60 */
+ 0xB82B, 0xB82C, 0xB82D, 0xB82E, 0xB82F, 0xB830, 0xB831, 0xB832, /* 0x60 */
+ 0xB833, 0xB834, 0, 0xB835, 0xB836, 0xB837, 0xB838, 0xB839, /* 0x70 */
+ 0xB83A, 0xB83B, 0xB83C, 0xB83D, 0xB83E, 0xB83F, 0, 0, /* 0x70 */
+ 0, 0xB840, 0xB841, 0xB842, 0xB843, 0xB844, 0xB845, 0xB846, /* 0x80 */
+ 0xB847, 0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, /* 0x80 */
+ 0xB84F, 0xB850, 0, 0xB851, 0xB852, 0xB853, 0xB854, 0xB855, /* 0x90 */
+ 0xB856, 0xB857, 0xB858, 0xB859, 0xB85A, 0xB85B, 0, 0, /* 0x90 */
+ 0, 0xB85C, 0xB85D, 0xB85E, 0xB85F, 0xB860, 0xB861, 0xB862, /* 0xA0 */
+ 0xB863, 0xB864, 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, /* 0xA0 */
+ 0xB86B, 0xB86C, 0, 0xB86D, 0xB86E, 0xB86F, 0xB870, 0xB871, /* 0xB0 */
+ 0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0, 0, /* 0xB0 */
+ 0, 0xB878, 0xB879, 0xB87A, 0xB87B, 0xB87C, 0xB87D, 0xB87E, /* 0xC0 */
+ 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883, 0xB884, 0xB885, 0xB886, /* 0xC0 */
+ 0xB887, 0xB888, 0, 0xB889, 0xB88A, 0xB88B, 0xB88C, 0xB88D, /* 0xD0 */
+ 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0, 0, /* 0xD0 */
+ 0, 0xB894, 0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, /* 0xE0 */
+ 0xB89B, 0xB89C, 0xB89D, 0xB89E, 0xB89F, 0xB8A0, 0xB8A1, 0xB8A2, /* 0xE0 */
+ 0xB8A3, 0xB8A4, 0, 0xB8A5, 0xB8A6, 0xB8A7, 0xB8A8, 0xB8A9, /* 0xF0 */
+ 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD, 0xB8AE, 0xB8AF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB8B0, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B4, 0xB8B5, 0xB8B6, /* 0x40 */
+ 0xB8B7, 0xB8B8, 0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE, /* 0x40 */
+ 0xB8BF, 0xB8C0, 0, 0xB8C1, 0xB8C2, 0xB8C3, 0xB8C4, 0xB8C5, /* 0x50 */
+ 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0, 0, /* 0x50 */
+ 0, 0xB8CC, 0xB8CD, 0xB8CE, 0xB8CF, 0xB8D0, 0xB8D1, 0xB8D2, /* 0x60 */
+ 0xB8D3, 0xB8D4, 0xB8D5, 0xB8D6, 0xB8D7, 0xB8D8, 0xB8D9, 0xB8DA, /* 0x60 */
+ 0xB8DB, 0xB8DC, 0, 0xB8DD, 0xB8DE, 0xB8DF, 0xB8E0, 0xB8E1, /* 0x70 */
+ 0xB8E2, 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0, 0, /* 0x70 */
+ 0, 0xB8E8, 0xB8E9, 0xB8EA, 0xB8EB, 0xB8EC, 0xB8ED, 0xB8EE, /* 0x80 */
+ 0xB8EF, 0xB8F0, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6, /* 0x80 */
+ 0xB8F7, 0xB8F8, 0, 0xB8F9, 0xB8FA, 0xB8FB, 0xB8FC, 0xB8FD, /* 0x90 */
+ 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902, 0xB903, 0, 0, /* 0x90 */
+ 0, 0xB904, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, 0xB90A, /* 0xA0 */
+ 0xB90B, 0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912, /* 0xA0 */
+ 0xB913, 0xB914, 0, 0xB915, 0xB916, 0xB917, 0xB918, 0xB919, /* 0xB0 */
+ 0xB91A, 0xB91B, 0xB91C, 0xB91D, 0xB91E, 0xB91F, 0, 0, /* 0xB0 */
+ 0, 0xB920, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925, 0xB926, /* 0xC0 */
+ 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D, 0xB92E, /* 0xC0 */
+ 0xB92F, 0xB930, 0, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935, /* 0xD0 */
+ 0xB936, 0xB937, 0xB938, 0xB939, 0xB93A, 0xB93B, 0, 0, /* 0xD0 */
+ 0, 0xB93C, 0xB93D, 0xB93E, 0xB93F, 0xB940, 0xB941, 0xB942, /* 0xE0 */
+ 0xB943, 0xB944, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949, 0xB94A, /* 0xE0 */
+ 0xB94B, 0xB94C, 0, 0xB94D, 0xB94E, 0xB94F, 0xB950, 0xB951, /* 0xF0 */
+ 0xB952, 0xB953, 0xB954, 0xB955, 0xB956, 0xB957 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB958, 0xB959, 0xB95A, 0xB95B, 0xB95C, 0xB95D, 0xB95E, /* 0x40 */
+ 0xB95F, 0xB960, 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, /* 0x40 */
+ 0xB967, 0xB968, 0, 0xB969, 0xB96A, 0xB96B, 0xB96C, 0xB96D, /* 0x50 */
+ 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0, 0, /* 0x50 */
+ 0, 0xB974, 0xB975, 0xB976, 0xB977, 0xB978, 0xB979, 0xB97A, /* 0x60 */
+ 0xB97B, 0xB97C, 0xB97D, 0xB97E, 0xB97F, 0xB980, 0xB981, 0xB982, /* 0x60 */
+ 0xB983, 0xB984, 0, 0xB985, 0xB986, 0xB987, 0xB988, 0xB989, /* 0x70 */
+ 0xB98A, 0xB98B, 0xB98C, 0xB98D, 0xB98E, 0xB98F, 0, 0, /* 0x70 */
+ 0, 0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, /* 0x80 */
+ 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, 0xB99E, /* 0x80 */
+ 0xB99F, 0xB9A0, 0, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, /* 0x90 */
+ 0xB9A6, 0xB9A7, 0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0, 0, /* 0x90 */
+ 0, 0xB9AC, 0xB9AD, 0xB9AE, 0xB9AF, 0xB9B0, 0xB9B1, 0xB9B2, /* 0xA0 */
+ 0xB9B3, 0xB9B4, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA, /* 0xA0 */
+ 0xB9BB, 0xB9BC, 0, 0xB9BD, 0xB9BE, 0xB9BF, 0xB9C0, 0xB9C1, /* 0xB0 */
+ 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3141, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xB9C8, 0xB9C9, 0xB9CA, 0xB9CB, 0xB9CC, 0xB9CD, 0xB9CE, /* 0x60 */
+ 0xB9CF, 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, /* 0x60 */
+ 0xB9D7, 0xB9D8, 0, 0xB9D9, 0xB9DA, 0xB9DB, 0xB9DC, 0xB9DD, /* 0x70 */
+ 0xB9DE, 0xB9DF, 0xB9E0, 0xB9E1, 0xB9E2, 0xB9E3, 0, 0, /* 0x70 */
+ 0, 0xB9E4, 0xB9E5, 0xB9E6, 0xB9E7, 0xB9E8, 0xB9E9, 0xB9EA, /* 0x80 */
+ 0xB9EB, 0xB9EC, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2, /* 0x80 */
+ 0xB9F3, 0xB9F4, 0, 0xB9F5, 0xB9F6, 0xB9F7, 0xB9F8, 0xB9F9, /* 0x90 */
+ 0xB9FA, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0, 0, /* 0x90 */
+ 0, 0xBA00, 0xBA01, 0xBA02, 0xBA03, 0xBA04, 0xBA05, 0xBA06, /* 0xA0 */
+ 0xBA07, 0xBA08, 0xBA09, 0xBA0A, 0xBA0B, 0xBA0C, 0xBA0D, 0xBA0E, /* 0xA0 */
+ 0xBA0F, 0xBA10, 0, 0xBA11, 0xBA12, 0xBA13, 0xBA14, 0xBA15, /* 0xB0 */
+ 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, 0xBA1B, 0, 0, /* 0xB0 */
+ 0, 0xBA1C, 0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, /* 0xC0 */
+ 0xBA23, 0xBA24, 0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, /* 0xC0 */
+ 0xBA2B, 0xBA2C, 0, 0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, /* 0xD0 */
+ 0xBA32, 0xBA33, 0xBA34, 0xBA35, 0xBA36, 0xBA37, 0, 0, /* 0xD0 */
+ 0, 0xBA38, 0xBA39, 0xBA3A, 0xBA3B, 0xBA3C, 0xBA3D, 0xBA3E, /* 0xE0 */
+ 0xBA3F, 0xBA40, 0xBA41, 0xBA42, 0xBA43, 0xBA44, 0xBA45, 0xBA46, /* 0xE0 */
+ 0xBA47, 0xBA48, 0, 0xBA49, 0xBA4A, 0xBA4B, 0xBA4C, 0xBA4D, /* 0xF0 */
+ 0xBA4E, 0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA53 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBA54, 0xBA55, 0xBA56, 0xBA57, 0xBA58, 0xBA59, 0xBA5A, /* 0x40 */
+ 0xBA5B, 0xBA5C, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, /* 0x40 */
+ 0xBA63, 0xBA64, 0, 0xBA65, 0xBA66, 0xBA67, 0xBA68, 0xBA69, /* 0x50 */
+ 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0, 0, /* 0x50 */
+ 0, 0xBA70, 0xBA71, 0xBA72, 0xBA73, 0xBA74, 0xBA75, 0xBA76, /* 0x60 */
+ 0xBA77, 0xBA78, 0xBA79, 0xBA7A, 0xBA7B, 0xBA7C, 0xBA7D, 0xBA7E, /* 0x60 */
+ 0xBA7F, 0xBA80, 0, 0xBA81, 0xBA82, 0xBA83, 0xBA84, 0xBA85, /* 0x70 */
+ 0xBA86, 0xBA87, 0xBA88, 0xBA89, 0xBA8A, 0xBA8B, 0, 0, /* 0x70 */
+ 0, 0xBA8C, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91, 0xBA92, /* 0x80 */
+ 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99, 0xBA9A, /* 0x80 */
+ 0xBA9B, 0xBA9C, 0, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1, /* 0x90 */
+ 0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0, 0, /* 0x90 */
+ 0, 0xBAA8, 0xBAA9, 0xBAAA, 0xBAAB, 0xBAAC, 0xBAAD, 0xBAAE, /* 0xA0 */
+ 0xBAAF, 0xBAB0, 0xBAB1, 0xBAB2, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, /* 0xA0 */
+ 0xBAB7, 0xBAB8, 0, 0xBAB9, 0xBABA, 0xBABB, 0xBABC, 0xBABD, /* 0xB0 */
+ 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3, 0, 0, /* 0xB0 */
+ 0, 0xBAC4, 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC8, 0xBAC9, 0xBACA, /* 0xC0 */
+ 0xBACB, 0xBACC, 0xBACD, 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, /* 0xC0 */
+ 0xBAD3, 0xBAD4, 0, 0xBAD5, 0xBAD6, 0xBAD7, 0xBAD8, 0xBAD9, /* 0xD0 */
+ 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF, 0, 0, /* 0xD0 */
+ 0, 0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, /* 0xE0 */
+ 0xBAE7, 0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, /* 0xE0 */
+ 0xBAEF, 0xBAF0, 0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, /* 0xF0 */
+ 0xBAF6, 0xBAF7, 0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBAFC, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB00, 0xBB01, 0xBB02, /* 0x40 */
+ 0xBB03, 0xBB04, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A, /* 0x40 */
+ 0xBB0B, 0xBB0C, 0, 0xBB0D, 0xBB0E, 0xBB0F, 0xBB10, 0xBB11, /* 0x50 */
+ 0xBB12, 0xBB13, 0xBB14, 0xBB15, 0xBB16, 0xBB17, 0, 0, /* 0x50 */
+ 0, 0xBB18, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1C, 0xBB1D, 0xBB1E, /* 0x60 */
+ 0xBB1F, 0xBB20, 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, /* 0x60 */
+ 0xBB27, 0xBB28, 0, 0xBB29, 0xBB2A, 0xBB2B, 0xBB2C, 0xBB2D, /* 0x70 */
+ 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32, 0xBB33, 0, 0, /* 0x70 */
+ 0, 0xBB34, 0xBB35, 0xBB36, 0xBB37, 0xBB38, 0xBB39, 0xBB3A, /* 0x80 */
+ 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB3F, 0xBB40, 0xBB41, 0xBB42, /* 0x80 */
+ 0xBB43, 0xBB44, 0, 0xBB45, 0xBB46, 0xBB47, 0xBB48, 0xBB49, /* 0x90 */
+ 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4D, 0xBB4E, 0xBB4F, 0, 0, /* 0x90 */
+ 0, 0xBB50, 0xBB51, 0xBB52, 0xBB53, 0xBB54, 0xBB55, 0xBB56, /* 0xA0 */
+ 0xBB57, 0xBB58, 0xBB59, 0xBB5A, 0xBB5B, 0xBB5C, 0xBB5D, 0xBB5E, /* 0xA0 */
+ 0xBB5F, 0xBB60, 0, 0xBB61, 0xBB62, 0xBB63, 0xBB64, 0xBB65, /* 0xB0 */
+ 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0, 0, /* 0xB0 */
+ 0, 0xBB6C, 0xBB6D, 0xBB6E, 0xBB6F, 0xBB70, 0xBB71, 0xBB72, /* 0xC0 */
+ 0xBB73, 0xBB74, 0xBB75, 0xBB76, 0xBB77, 0xBB78, 0xBB79, 0xBB7A, /* 0xC0 */
+ 0xBB7B, 0xBB7C, 0, 0xBB7D, 0xBB7E, 0xBB7F, 0xBB80, 0xBB81, /* 0xD0 */
+ 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86, 0xBB87, 0, 0, /* 0xD0 */
+ 0, 0xBB88, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8C, 0xBB8D, 0xBB8E, /* 0xE0 */
+ 0xBB8F, 0xBB90, 0xBB91, 0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, /* 0xE0 */
+ 0xBB97, 0xBB98, 0, 0xBB99, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, /* 0xF0 */
+ 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1, 0xBBA2, 0xBBA3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBBA4, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA8, 0xBBA9, 0xBBAA, /* 0x40 */
+ 0xBBAB, 0xBBAC, 0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, /* 0x40 */
+ 0xBBB3, 0xBBB4, 0, 0xBBB5, 0xBBB6, 0xBBB7, 0xBBB8, 0xBBB9, /* 0x50 */
+ 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE, 0xBBBF, 0, 0, /* 0x50 */
+ 0, 0xBBC0, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC4, 0xBBC5, 0xBBC6, /* 0x60 */
+ 0xBBC7, 0xBBC8, 0xBBC9, 0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE, /* 0x60 */
+ 0xBBCF, 0xBBD0, 0, 0xBBD1, 0xBBD2, 0xBBD3, 0xBBD4, 0xBBD5, /* 0x70 */
+ 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB, 0, 0, /* 0x70 */
+ 0, 0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2, /* 0x80 */
+ 0xBBE3, 0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, /* 0x80 */
+ 0xBBEB, 0xBBEC, 0, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, /* 0x90 */
+ 0xBBF2, 0xBBF3, 0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, 0, 0, /* 0x90 */
+ 0, 0xBBF8, 0xBBF9, 0xBBFA, 0xBBFB, 0xBBFC, 0xBBFD, 0xBBFE, /* 0xA0 */
+ 0xBBFF, 0xBC00, 0xBC01, 0xBC02, 0xBC03, 0xBC04, 0xBC05, 0xBC06, /* 0xA0 */
+ 0xBC07, 0xBC08, 0, 0xBC09, 0xBC0A, 0xBC0B, 0xBC0C, 0xBC0D, /* 0xB0 */
+ 0xBC0E, 0xBC0F, 0xBC10, 0xBC11, 0xBC12, 0xBC13 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3142, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBC14, 0xBC15, 0xBC16, 0xBC17, 0xBC18, 0xBC19, 0xBC1A, /* 0x60 */
+ 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC20, 0xBC21, 0xBC22, /* 0x60 */
+ 0xBC23, 0xBC24, 0, 0xBC25, 0xBC26, 0xBC27, 0xBC28, 0xBC29, /* 0x70 */
+ 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2D, 0xBC2E, 0xBC2F, 0, 0, /* 0x70 */
+ 0, 0xBC30, 0xBC31, 0xBC32, 0xBC33, 0xBC34, 0xBC35, 0xBC36, /* 0x80 */
+ 0xBC37, 0xBC38, 0xBC39, 0xBC3A, 0xBC3B, 0xBC3C, 0xBC3D, 0xBC3E, /* 0x80 */
+ 0xBC3F, 0xBC40, 0, 0xBC41, 0xBC42, 0xBC43, 0xBC44, 0xBC45, /* 0x90 */
+ 0xBC46, 0xBC47, 0xBC48, 0xBC49, 0xBC4A, 0xBC4B, 0, 0, /* 0x90 */
+ 0, 0xBC4C, 0xBC4D, 0xBC4E, 0xBC4F, 0xBC50, 0xBC51, 0xBC52, /* 0xA0 */
+ 0xBC53, 0xBC54, 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, /* 0xA0 */
+ 0xBC5B, 0xBC5C, 0, 0xBC5D, 0xBC5E, 0xBC5F, 0xBC60, 0xBC61, /* 0xB0 */
+ 0xBC62, 0xBC63, 0xBC64, 0xBC65, 0xBC66, 0xBC67, 0, 0, /* 0xB0 */
+ 0, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D, 0xBC6E, /* 0xC0 */
+ 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76, /* 0xC0 */
+ 0xBC77, 0xBC78, 0, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D, /* 0xD0 */
+ 0xBC7E, 0xBC7F, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0, 0, /* 0xD0 */
+ 0, 0xBC84, 0xBC85, 0xBC86, 0xBC87, 0xBC88, 0xBC89, 0xBC8A, /* 0xE0 */
+ 0xBC8B, 0xBC8C, 0xBC8D, 0xBC8E, 0xBC8F, 0xBC90, 0xBC91, 0xBC92, /* 0xE0 */
+ 0xBC93, 0xBC94, 0, 0xBC95, 0xBC96, 0xBC97, 0xBC98, 0xBC99, /* 0xF0 */
+ 0xBC9A, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBCA0, 0xBCA1, 0xBCA2, 0xBCA3, 0xBCA4, 0xBCA5, 0xBCA6, /* 0x40 */
+ 0xBCA7, 0xBCA8, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD, 0xBCAE, /* 0x40 */
+ 0xBCAF, 0xBCB0, 0, 0xBCB1, 0xBCB2, 0xBCB3, 0xBCB4, 0xBCB5, /* 0x50 */
+ 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA, 0xBCBB, 0, 0, /* 0x50 */
+ 0, 0xBCBC, 0xBCBD, 0xBCBE, 0xBCBF, 0xBCC0, 0xBCC1, 0xBCC2, /* 0x60 */
+ 0xBCC3, 0xBCC4, 0xBCC5, 0xBCC6, 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, /* 0x60 */
+ 0xBCCB, 0xBCCC, 0, 0xBCCD, 0xBCCE, 0xBCCF, 0xBCD0, 0xBCD1, /* 0x70 */
+ 0xBCD2, 0xBCD3, 0xBCD4, 0xBCD5, 0xBCD6, 0xBCD7, 0, 0, /* 0x70 */
+ 0, 0xBCD8, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDC, 0xBCDD, 0xBCDE, /* 0x80 */
+ 0xBCDF, 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5, 0xBCE6, /* 0x80 */
+ 0xBCE7, 0xBCE8, 0, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED, /* 0x90 */
+ 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF2, 0xBCF3, 0, 0, /* 0x90 */
+ 0, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF7, 0xBCF8, 0xBCF9, 0xBCFA, /* 0xA0 */
+ 0xBCFB, 0xBCFC, 0xBCFD, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02, /* 0xA0 */
+ 0xBD03, 0xBD04, 0, 0xBD05, 0xBD06, 0xBD07, 0xBD08, 0xBD09, /* 0xB0 */
+ 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E, 0xBD0F, 0, 0, /* 0xB0 */
+ 0, 0xBD10, 0xBD11, 0xBD12, 0xBD13, 0xBD14, 0xBD15, 0xBD16, /* 0xC0 */
+ 0xBD17, 0xBD18, 0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, 0xBD1E, /* 0xC0 */
+ 0xBD1F, 0xBD20, 0, 0xBD21, 0xBD22, 0xBD23, 0xBD24, 0xBD25, /* 0xD0 */
+ 0xBD26, 0xBD27, 0xBD28, 0xBD29, 0xBD2A, 0xBD2B, 0, 0, /* 0xD0 */
+ 0, 0xBD2C, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32, /* 0xE0 */
+ 0xBD33, 0xBD34, 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, 0xBD3A, /* 0xE0 */
+ 0xBD3B, 0xBD3C, 0, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD40, 0xBD41, /* 0xF0 */
+ 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBD48, 0xBD49, 0xBD4A, 0xBD4B, 0xBD4C, 0xBD4D, 0xBD4E, /* 0x40 */
+ 0xBD4F, 0xBD50, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, /* 0x40 */
+ 0xBD57, 0xBD58, 0, 0xBD59, 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, /* 0x50 */
+ 0xBD5E, 0xBD5F, 0xBD60, 0xBD61, 0xBD62, 0xBD63, 0, 0, /* 0x50 */
+ 0, 0xBD64, 0xBD65, 0xBD66, 0xBD67, 0xBD68, 0xBD69, 0xBD6A, /* 0x60 */
+ 0xBD6B, 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, /* 0x60 */
+ 0xBD73, 0xBD74, 0, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, /* 0x70 */
+ 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, 0, 0, /* 0x70 */
+ 0, 0xBD80, 0xBD81, 0xBD82, 0xBD83, 0xBD84, 0xBD85, 0xBD86, /* 0x80 */
+ 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, /* 0x80 */
+ 0xBD8F, 0xBD90, 0, 0xBD91, 0xBD92, 0xBD93, 0xBD94, 0xBD95, /* 0x90 */
+ 0xBD96, 0xBD97, 0xBD98, 0xBD99, 0xBD9A, 0xBD9B, 0, 0, /* 0x90 */
+ 0, 0xBD9C, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1, 0xBDA2, /* 0xA0 */
+ 0xBDA3, 0xBDA4, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA, /* 0xA0 */
+ 0xBDAB, 0xBDAC, 0, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB0, 0xBDB1, /* 0xB0 */
+ 0xBDB2, 0xBDB3, 0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0, 0, /* 0xB0 */
+ 0, 0xBDB8, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC, 0xBDBD, 0xBDBE, /* 0xC0 */
+ 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4, 0xBDC5, 0xBDC6, /* 0xC0 */
+ 0xBDC7, 0xBDC8, 0, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC, 0xBDCD, /* 0xD0 */
+ 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, 0xBDD2, 0xBDD3, 0, 0, /* 0xD0 */
+ 0, 0xBDD4, 0xBDD5, 0xBDD6, 0xBDD7, 0xBDD8, 0xBDD9, 0xBDDA, /* 0xE0 */
+ 0xBDDB, 0xBDDC, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0, 0xBDE1, 0xBDE2, /* 0xE0 */
+ 0xBDE3, 0xBDE4, 0, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8, 0xBDE9, /* 0xF0 */
+ 0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDF0, 0xBDF1, 0xBDF2, 0xBDF3, 0xBDF4, 0xBDF5, 0xBDF6, /* 0x40 */
+ 0xBDF7, 0xBDF8, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC, 0xBDFD, 0xBDFE, /* 0x40 */
+ 0xBDFF, 0xBE00, 0, 0xBE01, 0xBE02, 0xBE03, 0xBE04, 0xBE05, /* 0x50 */
+ 0xBE06, 0xBE07, 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0, 0, /* 0x50 */
+ 0, 0xBE0C, 0xBE0D, 0xBE0E, 0xBE0F, 0xBE10, 0xBE11, 0xBE12, /* 0x60 */
+ 0xBE13, 0xBE14, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, /* 0x60 */
+ 0xBE1B, 0xBE1C, 0, 0xBE1D, 0xBE1E, 0xBE1F, 0xBE20, 0xBE21, /* 0x70 */
+ 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26, 0xBE27, 0, 0, /* 0x70 */
+ 0, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E, /* 0x80 */
+ 0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36, /* 0x80 */
+ 0xBE37, 0xBE38, 0, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, /* 0x90 */
+ 0xBE3E, 0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0, 0, /* 0x90 */
+ 0, 0xBE44, 0xBE45, 0xBE46, 0xBE47, 0xBE48, 0xBE49, 0xBE4A, /* 0xA0 */
+ 0xBE4B, 0xBE4C, 0xBE4D, 0xBE4E, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, /* 0xA0 */
+ 0xBE53, 0xBE54, 0, 0xBE55, 0xBE56, 0xBE57, 0xBE58, 0xBE59, /* 0xB0 */
+ 0xBE5A, 0xBE5B, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3143, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBE60, 0xBE61, 0xBE62, 0xBE63, 0xBE64, 0xBE65, 0xBE66, /* 0x60 */
+ 0xBE67, 0xBE68, 0xBE69, 0xBE6A, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E, /* 0x60 */
+ 0xBE6F, 0xBE70, 0, 0xBE71, 0xBE72, 0xBE73, 0xBE74, 0xBE75, /* 0x70 */
+ 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7B, 0, 0, /* 0x70 */
+ 0, 0xBE7C, 0xBE7D, 0xBE7E, 0xBE7F, 0xBE80, 0xBE81, 0xBE82, /* 0x80 */
+ 0xBE83, 0xBE84, 0xBE85, 0xBE86, 0xBE87, 0xBE88, 0xBE89, 0xBE8A, /* 0x80 */
+ 0xBE8B, 0xBE8C, 0, 0xBE8D, 0xBE8E, 0xBE8F, 0xBE90, 0xBE91, /* 0x90 */
+ 0xBE92, 0xBE93, 0xBE94, 0xBE95, 0xBE96, 0xBE97, 0, 0, /* 0x90 */
+ 0, 0xBE98, 0xBE99, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, /* 0xA0 */
+ 0xBE9F, 0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, /* 0xA0 */
+ 0xBEA7, 0xBEA8, 0, 0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD, /* 0xB0 */
+ 0xBEAE, 0xBEAF, 0xBEB0, 0xBEB1, 0xBEB2, 0xBEB3, 0, 0, /* 0xB0 */
+ 0, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7, 0xBEB8, 0xBEB9, 0xBEBA, /* 0xC0 */
+ 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, 0xBEBF, 0xBEC0, 0xBEC1, 0xBEC2, /* 0xC0 */
+ 0xBEC3, 0xBEC4, 0, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8, 0xBEC9, /* 0xD0 */
+ 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, 0, 0, /* 0xD0 */
+ 0, 0xBED0, 0xBED1, 0xBED2, 0xBED3, 0xBED4, 0xBED5, 0xBED6, /* 0xE0 */
+ 0xBED7, 0xBED8, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD, 0xBEDE, /* 0xE0 */
+ 0xBEDF, 0xBEE0, 0, 0xBEE1, 0xBEE2, 0xBEE3, 0xBEE4, 0xBEE5, /* 0xF0 */
+ 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9, 0xBEEA, 0xBEEB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_A9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBEEC, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2, /* 0x40 */
+ 0xBEF3, 0xBEF4, 0xBEF5, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA, /* 0x40 */
+ 0xBEFB, 0xBEFC, 0, 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF01, /* 0x50 */
+ 0xBF02, 0xBF03, 0xBF04, 0xBF05, 0xBF06, 0xBF07, 0, 0, /* 0x50 */
+ 0, 0xBF08, 0xBF09, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D, 0xBF0E, /* 0x60 */
+ 0xBF0F, 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15, 0xBF16, /* 0x60 */
+ 0xBF17, 0xBF18, 0, 0xBF19, 0xBF1A, 0xBF1B, 0xBF1C, 0xBF1D, /* 0x70 */
+ 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22, 0xBF23, 0, 0, /* 0x70 */
+ 0, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A, /* 0x80 */
+ 0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32, /* 0x80 */
+ 0xBF33, 0xBF34, 0, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, /* 0x90 */
+ 0xBF3A, 0xBF3B, 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, 0, 0, /* 0x90 */
+ 0, 0xBF40, 0xBF41, 0xBF42, 0xBF43, 0xBF44, 0xBF45, 0xBF46, /* 0xA0 */
+ 0xBF47, 0xBF48, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E, /* 0xA0 */
+ 0xBF4F, 0xBF50, 0, 0xBF51, 0xBF52, 0xBF53, 0xBF54, 0xBF55, /* 0xB0 */
+ 0xBF56, 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, 0, 0, /* 0xB0 */
+ 0, 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62, /* 0xC0 */
+ 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69, 0xBF6A, /* 0xC0 */
+ 0xBF6B, 0xBF6C, 0, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71, /* 0xD0 */
+ 0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0, 0, /* 0xD0 */
+ 0, 0xBF78, 0xBF79, 0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, /* 0xE0 */
+ 0xBF7F, 0xBF80, 0xBF81, 0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86, /* 0xE0 */
+ 0xBF87, 0xBF88, 0, 0xBF89, 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, /* 0xF0 */
+ 0xBF8E, 0xBF8F, 0xBF90, 0xBF91, 0xBF92, 0xBF93 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_AA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBF94, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A, /* 0x40 */
+ 0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2, /* 0x40 */
+ 0xBFA3, 0xBFA4, 0, 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, /* 0x50 */
+ 0xBFAA, 0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, 0, 0, /* 0x50 */
+ 0, 0xBFB0, 0xBFB1, 0xBFB2, 0xBFB3, 0xBFB4, 0xBFB5, 0xBFB6, /* 0x60 */
+ 0xBFB7, 0xBFB8, 0xBFB9, 0xBFBA, 0xBFBB, 0xBFBC, 0xBFBD, 0xBFBE, /* 0x60 */
+ 0xBFBF, 0xBFC0, 0, 0xBFC1, 0xBFC2, 0xBFC3, 0xBFC4, 0xBFC5, /* 0x70 */
+ 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0, 0, /* 0x70 */
+ 0, 0xBFCC, 0xBFCD, 0xBFCE, 0xBFCF, 0xBFD0, 0xBFD1, 0xBFD2, /* 0x80 */
+ 0xBFD3, 0xBFD4, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8, 0xBFD9, 0xBFDA, /* 0x80 */
+ 0xBFDB, 0xBFDC, 0, 0xBFDD, 0xBFDE, 0xBFDF, 0xBFE0, 0xBFE1, /* 0x90 */
+ 0xBFE2, 0xBFE3, 0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, 0, 0, /* 0x90 */
+ 0, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB, 0xBFEC, 0xBFED, 0xBFEE, /* 0xA0 */
+ 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3, 0xBFF4, 0xBFF5, 0xBFF6, /* 0xA0 */
+ 0xBFF7, 0xBFF8, 0, 0xBFF9, 0xBFFA, 0xBFFB, 0xBFFC, 0xBFFD, /* 0xB0 */
+ 0xBFFE, 0xBFFF, 0xC000, 0xC001, 0xC002, 0xC003, 0, 0, /* 0xB0 */
+ 0, 0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, 0xC00A, /* 0xC0 */
+ 0xC00B, 0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012, /* 0xC0 */
+ 0xC013, 0xC014, 0, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019, /* 0xD0 */
+ 0xC01A, 0xC01B, 0xC01C, 0xC01D, 0xC01E, 0xC01F, 0, 0, /* 0xD0 */
+ 0, 0xC020, 0xC021, 0xC022, 0xC023, 0xC024, 0xC025, 0xC026, /* 0xE0 */
+ 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B, 0xC02C, 0xC02D, 0xC02E, /* 0xE0 */
+ 0xC02F, 0xC030, 0, 0xC031, 0xC032, 0xC033, 0xC034, 0xC035, /* 0xF0 */
+ 0xC036, 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_AB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC03C, 0xC03D, 0xC03E, 0xC03F, 0xC040, 0xC041, 0xC042, /* 0x40 */
+ 0xC043, 0xC044, 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, 0xC04A, /* 0x40 */
+ 0xC04B, 0xC04C, 0, 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC051, /* 0x50 */
+ 0xC052, 0xC053, 0xC054, 0xC055, 0xC056, 0xC057, 0, 0, /* 0x50 */
+ 0, 0xC058, 0xC059, 0xC05A, 0xC05B, 0xC05C, 0xC05D, 0xC05E, /* 0x60 */
+ 0xC05F, 0xC060, 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, /* 0x60 */
+ 0xC067, 0xC068, 0, 0xC069, 0xC06A, 0xC06B, 0xC06C, 0xC06D, /* 0x70 */
+ 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072, 0xC073, 0, 0, /* 0x70 */
+ 0, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A, /* 0x80 */
+ 0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082, /* 0x80 */
+ 0xC083, 0xC084, 0, 0xC085, 0xC086, 0xC087, 0xC088, 0xC089, /* 0x90 */
+ 0xC08A, 0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, 0, 0, /* 0x90 */
+ 0, 0xC090, 0xC091, 0xC092, 0xC093, 0xC094, 0xC095, 0xC096, /* 0xA0 */
+ 0xC097, 0xC098, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E, /* 0xA0 */
+ 0xC09F, 0xC0A0, 0, 0xC0A1, 0xC0A2, 0xC0A3, 0xC0A4, 0xC0A5, /* 0xB0 */
+ 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA, 0xC0AB /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_AC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3145, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC0AC, 0xC0AD, 0xC0AE, 0xC0AF, 0xC0B0, 0xC0B1, 0xC0B2, /* 0x60 */
+ 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA, /* 0x60 */
+ 0xC0BB, 0xC0BC, 0, 0xC0BD, 0xC0BE, 0xC0BF, 0xC0C0, 0xC0C1, /* 0x70 */
+ 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C5, 0xC0C6, 0xC0C7, 0, 0, /* 0x70 */
+ 0, 0xC0C8, 0xC0C9, 0xC0CA, 0xC0CB, 0xC0CC, 0xC0CD, 0xC0CE, /* 0x80 */
+ 0xC0CF, 0xC0D0, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4, 0xC0D5, 0xC0D6, /* 0x80 */
+ 0xC0D7, 0xC0D8, 0, 0xC0D9, 0xC0DA, 0xC0DB, 0xC0DC, 0xC0DD, /* 0x90 */
+ 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1, 0xC0E2, 0xC0E3, 0, 0, /* 0x90 */
+ 0, 0xC0E4, 0xC0E5, 0xC0E6, 0xC0E7, 0xC0E8, 0xC0E9, 0xC0EA, /* 0xA0 */
+ 0xC0EB, 0xC0EC, 0xC0ED, 0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, /* 0xA0 */
+ 0xC0F3, 0xC0F4, 0, 0xC0F5, 0xC0F6, 0xC0F7, 0xC0F8, 0xC0F9, /* 0xB0 */
+ 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, 0, 0, /* 0xB0 */
+ 0, 0xC100, 0xC101, 0xC102, 0xC103, 0xC104, 0xC105, 0xC106, /* 0xC0 */
+ 0xC107, 0xC108, 0xC109, 0xC10A, 0xC10B, 0xC10C, 0xC10D, 0xC10E, /* 0xC0 */
+ 0xC10F, 0xC110, 0, 0xC111, 0xC112, 0xC113, 0xC114, 0xC115, /* 0xD0 */
+ 0xC116, 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0, 0, /* 0xD0 */
+ 0, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC121, 0xC122, /* 0xE0 */
+ 0xC123, 0xC124, 0xC125, 0xC126, 0xC127, 0xC128, 0xC129, 0xC12A, /* 0xE0 */
+ 0xC12B, 0xC12C, 0, 0xC12D, 0xC12E, 0xC12F, 0xC130, 0xC131, /* 0xF0 */
+ 0xC132, 0xC133, 0xC134, 0xC135, 0xC136, 0xC137 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_AD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC138, 0xC139, 0xC13A, 0xC13B, 0xC13C, 0xC13D, 0xC13E, /* 0x40 */
+ 0xC13F, 0xC140, 0xC141, 0xC142, 0xC143, 0xC144, 0xC145, 0xC146, /* 0x40 */
+ 0xC147, 0xC148, 0, 0xC149, 0xC14A, 0xC14B, 0xC14C, 0xC14D, /* 0x50 */
+ 0xC14E, 0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, 0, 0, /* 0x50 */
+ 0, 0xC154, 0xC155, 0xC156, 0xC157, 0xC158, 0xC159, 0xC15A, /* 0x60 */
+ 0xC15B, 0xC15C, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162, /* 0x60 */
+ 0xC163, 0xC164, 0, 0xC165, 0xC166, 0xC167, 0xC168, 0xC169, /* 0x70 */
+ 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F, 0, 0, /* 0x70 */
+ 0, 0xC170, 0xC171, 0xC172, 0xC173, 0xC174, 0xC175, 0xC176, /* 0x80 */
+ 0xC177, 0xC178, 0xC179, 0xC17A, 0xC17B, 0xC17C, 0xC17D, 0xC17E, /* 0x80 */
+ 0xC17F, 0xC180, 0, 0xC181, 0xC182, 0xC183, 0xC184, 0xC185, /* 0x90 */
+ 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B, 0, 0, /* 0x90 */
+ 0, 0xC18C, 0xC18D, 0xC18E, 0xC18F, 0xC190, 0xC191, 0xC192, /* 0xA0 */
+ 0xC193, 0xC194, 0xC195, 0xC196, 0xC197, 0xC198, 0xC199, 0xC19A, /* 0xA0 */
+ 0xC19B, 0xC19C, 0, 0xC19D, 0xC19E, 0xC19F, 0xC1A0, 0xC1A1, /* 0xB0 */
+ 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A5, 0xC1A6, 0xC1A7, 0, 0, /* 0xB0 */
+ 0, 0xC1A8, 0xC1A9, 0xC1AA, 0xC1AB, 0xC1AC, 0xC1AD, 0xC1AE, /* 0xC0 */
+ 0xC1AF, 0xC1B0, 0xC1B1, 0xC1B2, 0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, /* 0xC0 */
+ 0xC1B7, 0xC1B8, 0, 0xC1B9, 0xC1BA, 0xC1BB, 0xC1BC, 0xC1BD, /* 0xD0 */
+ 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3, 0, 0, /* 0xD0 */
+ 0, 0xC1C4, 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C8, 0xC1C9, 0xC1CA, /* 0xE0 */
+ 0xC1CB, 0xC1CC, 0xC1CD, 0xC1CE, 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, /* 0xE0 */
+ 0xC1D3, 0xC1D4, 0, 0xC1D5, 0xC1D6, 0xC1D7, 0xC1D8, 0xC1D9, /* 0xF0 */
+ 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_AE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC1E0, 0xC1E1, 0xC1E2, 0xC1E3, 0xC1E4, 0xC1E5, 0xC1E6, /* 0x40 */
+ 0xC1E7, 0xC1E8, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC, 0xC1ED, 0xC1EE, /* 0x40 */
+ 0xC1EF, 0xC1F0, 0, 0xC1F1, 0xC1F2, 0xC1F3, 0xC1F4, 0xC1F5, /* 0x50 */
+ 0xC1F6, 0xC1F7, 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0, 0, /* 0x50 */
+ 0, 0xC1FC, 0xC1FD, 0xC1FE, 0xC1FF, 0xC200, 0xC201, 0xC202, /* 0x60 */
+ 0xC203, 0xC204, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, /* 0x60 */
+ 0xC20B, 0xC20C, 0, 0xC20D, 0xC20E, 0xC20F, 0xC210, 0xC211, /* 0x70 */
+ 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217, 0, 0, /* 0x70 */
+ 0, 0xC218, 0xC219, 0xC21A, 0xC21B, 0xC21C, 0xC21D, 0xC21E, /* 0x80 */
+ 0xC21F, 0xC220, 0xC221, 0xC222, 0xC223, 0xC224, 0xC225, 0xC226, /* 0x80 */
+ 0xC227, 0xC228, 0, 0xC229, 0xC22A, 0xC22B, 0xC22C, 0xC22D, /* 0x90 */
+ 0xC22E, 0xC22F, 0xC230, 0xC231, 0xC232, 0xC233, 0, 0, /* 0x90 */
+ 0, 0xC234, 0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A, /* 0xA0 */
+ 0xC23B, 0xC23C, 0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, /* 0xA0 */
+ 0xC243, 0xC244, 0, 0xC245, 0xC246, 0xC247, 0xC248, 0xC249, /* 0xB0 */
+ 0xC24A, 0xC24B, 0xC24C, 0xC24D, 0xC24E, 0xC24F, 0, 0, /* 0xB0 */
+ 0, 0xC250, 0xC251, 0xC252, 0xC253, 0xC254, 0xC255, 0xC256, /* 0xC0 */
+ 0xC257, 0xC258, 0xC259, 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, /* 0xC0 */
+ 0xC25F, 0xC260, 0, 0xC261, 0xC262, 0xC263, 0xC264, 0xC265, /* 0xD0 */
+ 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B, 0, 0, /* 0xD0 */
+ 0, 0xC26C, 0xC26D, 0xC26E, 0xC26F, 0xC270, 0xC271, 0xC272, /* 0xE0 */
+ 0xC273, 0xC274, 0xC275, 0xC276, 0xC277, 0xC278, 0xC279, 0xC27A, /* 0xE0 */
+ 0xC27B, 0xC27C, 0, 0xC27D, 0xC27E, 0xC27F, 0xC280, 0xC281, /* 0xF0 */
+ 0xC282, 0xC283, 0xC284, 0xC285, 0xC286, 0xC287 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_AF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC288, 0xC289, 0xC28A, 0xC28B, 0xC28C, 0xC28D, 0xC28E, /* 0x40 */
+ 0xC28F, 0xC290, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296, /* 0x40 */
+ 0xC297, 0xC298, 0, 0xC299, 0xC29A, 0xC29B, 0xC29C, 0xC29D, /* 0x50 */
+ 0xC29E, 0xC29F, 0xC2A0, 0xC2A1, 0xC2A2, 0xC2A3, 0, 0, /* 0x50 */
+ 0, 0xC2A4, 0xC2A5, 0xC2A6, 0xC2A7, 0xC2A8, 0xC2A9, 0xC2AA, /* 0x60 */
+ 0xC2AB, 0xC2AC, 0xC2AD, 0xC2AE, 0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, /* 0x60 */
+ 0xC2B3, 0xC2B4, 0, 0xC2B5, 0xC2B6, 0xC2B7, 0xC2B8, 0xC2B9, /* 0x70 */
+ 0xC2BA, 0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, 0, 0, /* 0x70 */
+ 0, 0xC2C0, 0xC2C1, 0xC2C2, 0xC2C3, 0xC2C4, 0xC2C5, 0xC2C6, /* 0x80 */
+ 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA, 0xC2CB, 0xC2CC, 0xC2CD, 0xC2CE, /* 0x80 */
+ 0xC2CF, 0xC2D0, 0, 0xC2D1, 0xC2D2, 0xC2D3, 0xC2D4, 0xC2D5, /* 0x90 */
+ 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA, 0xC2DB, 0, 0, /* 0x90 */
+ 0, 0xC2DC, 0xC2DD, 0xC2DE, 0xC2DF, 0xC2E0, 0xC2E1, 0xC2E2, /* 0xA0 */
+ 0xC2E3, 0xC2E4, 0xC2E5, 0xC2E6, 0xC2E7, 0xC2E8, 0xC2E9, 0xC2EA, /* 0xA0 */
+ 0xC2EB, 0xC2EC, 0, 0xC2ED, 0xC2EE, 0xC2EF, 0xC2F0, 0xC2F1, /* 0xB0 */
+ 0xC2F2, 0xC2F3, 0xC2F4, 0xC2F5, 0xC2F6, 0xC2F7 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3146, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC2F8, 0xC2F9, 0xC2FA, 0xC2FB, 0xC2FC, 0xC2FD, 0xC2FE, /* 0x60 */
+ 0xC2FF, 0xC300, 0xC301, 0xC302, 0xC303, 0xC304, 0xC305, 0xC306, /* 0x60 */
+ 0xC307, 0xC308, 0, 0xC309, 0xC30A, 0xC30B, 0xC30C, 0xC30D, /* 0x70 */
+ 0xC30E, 0xC30F, 0xC310, 0xC311, 0xC312, 0xC313, 0, 0, /* 0x70 */
+ 0, 0xC314, 0xC315, 0xC316, 0xC317, 0xC318, 0xC319, 0xC31A, /* 0x80 */
+ 0xC31B, 0xC31C, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, /* 0x80 */
+ 0xC323, 0xC324, 0, 0xC325, 0xC326, 0xC327, 0xC328, 0xC329, /* 0x90 */
+ 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F, 0, 0, /* 0x90 */
+ 0, 0xC330, 0xC331, 0xC332, 0xC333, 0xC334, 0xC335, 0xC336, /* 0xA0 */
+ 0xC337, 0xC338, 0xC339, 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E, /* 0xA0 */
+ 0xC33F, 0xC340, 0, 0xC341, 0xC342, 0xC343, 0xC344, 0xC345, /* 0xB0 */
+ 0xC346, 0xC347, 0xC348, 0xC349, 0xC34A, 0xC34B, 0, 0, /* 0xB0 */
+ 0, 0xC34C, 0xC34D, 0xC34E, 0xC34F, 0xC350, 0xC351, 0xC352, /* 0xC0 */
+ 0xC353, 0xC354, 0xC355, 0xC356, 0xC357, 0xC358, 0xC359, 0xC35A, /* 0xC0 */
+ 0xC35B, 0xC35C, 0, 0xC35D, 0xC35E, 0xC35F, 0xC360, 0xC361, /* 0xD0 */
+ 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0, 0, /* 0xD0 */
+ 0, 0xC368, 0xC369, 0xC36A, 0xC36B, 0xC36C, 0xC36D, 0xC36E, /* 0xE0 */
+ 0xC36F, 0xC370, 0xC371, 0xC372, 0xC373, 0xC374, 0xC375, 0xC376, /* 0xE0 */
+ 0xC377, 0xC378, 0, 0xC379, 0xC37A, 0xC37B, 0xC37C, 0xC37D, /* 0xF0 */
+ 0xC37E, 0xC37F, 0xC380, 0xC381, 0xC382, 0xC383 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC384, 0xC385, 0xC386, 0xC387, 0xC388, 0xC389, 0xC38A, /* 0x40 */
+ 0xC38B, 0xC38C, 0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC392, /* 0x40 */
+ 0xC393, 0xC394, 0, 0xC395, 0xC396, 0xC397, 0xC398, 0xC399, /* 0x50 */
+ 0xC39A, 0xC39B, 0xC39C, 0xC39D, 0xC39E, 0xC39F, 0, 0, /* 0x50 */
+ 0, 0xC3A0, 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4, 0xC3A5, 0xC3A6, /* 0x60 */
+ 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC, 0xC3AD, 0xC3AE, /* 0x60 */
+ 0xC3AF, 0xC3B0, 0, 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4, 0xC3B5, /* 0x70 */
+ 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, 0, 0, /* 0x70 */
+ 0, 0xC3BC, 0xC3BD, 0xC3BE, 0xC3BF, 0xC3C0, 0xC3C1, 0xC3C2, /* 0x80 */
+ 0xC3C3, 0xC3C4, 0xC3C5, 0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA, /* 0x80 */
+ 0xC3CB, 0xC3CC, 0, 0xC3CD, 0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1, /* 0x90 */
+ 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5, 0xC3D6, 0xC3D7, 0, 0, /* 0x90 */
+ 0, 0xC3D8, 0xC3D9, 0xC3DA, 0xC3DB, 0xC3DC, 0xC3DD, 0xC3DE, /* 0xA0 */
+ 0xC3DF, 0xC3E0, 0xC3E1, 0xC3E2, 0xC3E3, 0xC3E4, 0xC3E5, 0xC3E6, /* 0xA0 */
+ 0xC3E7, 0xC3E8, 0, 0xC3E9, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3ED, /* 0xB0 */
+ 0xC3EE, 0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, 0, 0, /* 0xB0 */
+ 0, 0xC3F4, 0xC3F5, 0xC3F6, 0xC3F7, 0xC3F8, 0xC3F9, 0xC3FA, /* 0xC0 */
+ 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, 0xC3FF, 0xC400, 0xC401, 0xC402, /* 0xC0 */
+ 0xC403, 0xC404, 0, 0xC405, 0xC406, 0xC407, 0xC408, 0xC409, /* 0xD0 */
+ 0xC40A, 0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, 0, 0, /* 0xD0 */
+ 0, 0xC410, 0xC411, 0xC412, 0xC413, 0xC414, 0xC415, 0xC416, /* 0xE0 */
+ 0xC417, 0xC418, 0xC419, 0xC41A, 0xC41B, 0xC41C, 0xC41D, 0xC41E, /* 0xE0 */
+ 0xC41F, 0xC420, 0, 0xC421, 0xC422, 0xC423, 0xC424, 0xC425, /* 0xF0 */
+ 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC42C, 0xC42D, 0xC42E, 0xC42F, 0xC430, 0xC431, 0xC432, /* 0x40 */
+ 0xC433, 0xC434, 0xC435, 0xC436, 0xC437, 0xC438, 0xC439, 0xC43A, /* 0x40 */
+ 0xC43B, 0xC43C, 0, 0xC43D, 0xC43E, 0xC43F, 0xC440, 0xC441, /* 0x50 */
+ 0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, 0, 0, /* 0x50 */
+ 0, 0xC448, 0xC449, 0xC44A, 0xC44B, 0xC44C, 0xC44D, 0xC44E, /* 0x60 */
+ 0xC44F, 0xC450, 0xC451, 0xC452, 0xC453, 0xC454, 0xC455, 0xC456, /* 0x60 */
+ 0xC457, 0xC458, 0, 0xC459, 0xC45A, 0xC45B, 0xC45C, 0xC45D, /* 0x70 */
+ 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462, 0xC463, 0, 0, /* 0x70 */
+ 0, 0xC464, 0xC465, 0xC466, 0xC467, 0xC468, 0xC469, 0xC46A, /* 0x80 */
+ 0xC46B, 0xC46C, 0xC46D, 0xC46E, 0xC46F, 0xC470, 0xC471, 0xC472, /* 0x80 */
+ 0xC473, 0xC474, 0, 0xC475, 0xC476, 0xC477, 0xC478, 0xC479, /* 0x90 */
+ 0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, 0, 0, /* 0x90 */
+ 0, 0xC480, 0xC481, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486, /* 0xA0 */
+ 0xC487, 0xC488, 0xC489, 0xC48A, 0xC48B, 0xC48C, 0xC48D, 0xC48E, /* 0xA0 */
+ 0xC48F, 0xC490, 0, 0xC491, 0xC492, 0xC493, 0xC494, 0xC495, /* 0xB0 */
+ 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B, 0, 0, /* 0xB0 */
+ 0, 0xC49C, 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, /* 0xC0 */
+ 0xC4A3, 0xC4A4, 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, /* 0xC0 */
+ 0xC4AB, 0xC4AC, 0, 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, /* 0xD0 */
+ 0xC4B2, 0xC4B3, 0xC4B4, 0xC4B5, 0xC4B6, 0xC4B7, 0, 0, /* 0xD0 */
+ 0, 0xC4B8, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BC, 0xC4BD, 0xC4BE, /* 0xE0 */
+ 0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6, /* 0xE0 */
+ 0xC4C7, 0xC4C8, 0, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, /* 0xF0 */
+ 0xC4CE, 0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC4D4, 0xC4D5, 0xC4D6, 0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, /* 0x40 */
+ 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE, 0xC4DF, 0xC4E0, 0xC4E1, 0xC4E2, /* 0x40 */
+ 0xC4E3, 0xC4E4, 0, 0xC4E5, 0xC4E6, 0xC4E7, 0xC4E8, 0xC4E9, /* 0x50 */
+ 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF, 0, 0, /* 0x50 */
+ 0, 0xC4F0, 0xC4F1, 0xC4F2, 0xC4F3, 0xC4F4, 0xC4F5, 0xC4F6, /* 0x60 */
+ 0xC4F7, 0xC4F8, 0xC4F9, 0xC4FA, 0xC4FB, 0xC4FC, 0xC4FD, 0xC4FE, /* 0x60 */
+ 0xC4FF, 0xC500, 0, 0xC501, 0xC502, 0xC503, 0xC504, 0xC505, /* 0x70 */
+ 0xC506, 0xC507, 0xC508, 0xC509, 0xC50A, 0xC50B, 0, 0, /* 0x70 */
+ 0, 0xC50C, 0xC50D, 0xC50E, 0xC50F, 0xC510, 0xC511, 0xC512, /* 0x80 */
+ 0xC513, 0xC514, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A, /* 0x80 */
+ 0xC51B, 0xC51C, 0, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521, /* 0x90 */
+ 0xC522, 0xC523, 0xC524, 0xC525, 0xC526, 0xC527, 0, 0, /* 0x90 */
+ 0, 0xC528, 0xC529, 0xC52A, 0xC52B, 0xC52C, 0xC52D, 0xC52E, /* 0xA0 */
+ 0xC52F, 0xC530, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, /* 0xA0 */
+ 0xC537, 0xC538, 0, 0xC539, 0xC53A, 0xC53B, 0xC53C, 0xC53D, /* 0xB0 */
+ 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3147, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC544, 0xC545, 0xC546, 0xC547, 0xC548, 0xC549, 0xC54A, /* 0x60 */
+ 0xC54B, 0xC54C, 0xC54D, 0xC54E, 0xC54F, 0xC550, 0xC551, 0xC552, /* 0x60 */
+ 0xC553, 0xC554, 0, 0xC555, 0xC556, 0xC557, 0xC558, 0xC559, /* 0x70 */
+ 0xC55A, 0xC55B, 0xC55C, 0xC55D, 0xC55E, 0xC55F, 0, 0, /* 0x70 */
+ 0, 0xC560, 0xC561, 0xC562, 0xC563, 0xC564, 0xC565, 0xC566, /* 0x80 */
+ 0xC567, 0xC568, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, /* 0x80 */
+ 0xC56F, 0xC570, 0, 0xC571, 0xC572, 0xC573, 0xC574, 0xC575, /* 0x90 */
+ 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0, 0, /* 0x90 */
+ 0, 0xC57C, 0xC57D, 0xC57E, 0xC57F, 0xC580, 0xC581, 0xC582, /* 0xA0 */
+ 0xC583, 0xC584, 0xC585, 0xC586, 0xC587, 0xC588, 0xC589, 0xC58A, /* 0xA0 */
+ 0xC58B, 0xC58C, 0, 0xC58D, 0xC58E, 0xC58F, 0xC590, 0xC591, /* 0xB0 */
+ 0xC592, 0xC593, 0xC594, 0xC595, 0xC596, 0xC597, 0, 0, /* 0xB0 */
+ 0, 0xC598, 0xC599, 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC59E, /* 0xC0 */
+ 0xC59F, 0xC5A0, 0xC5A1, 0xC5A2, 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, /* 0xC0 */
+ 0xC5A7, 0xC5A8, 0, 0xC5A9, 0xC5AA, 0xC5AB, 0xC5AC, 0xC5AD, /* 0xD0 */
+ 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3, 0, 0, /* 0xD0 */
+ 0, 0xC5B4, 0xC5B5, 0xC5B6, 0xC5B7, 0xC5B8, 0xC5B9, 0xC5BA, /* 0xE0 */
+ 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, /* 0xE0 */
+ 0xC5C3, 0xC5C4, 0, 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, /* 0xF0 */
+ 0xC5CA, 0xC5CB, 0xC5CC, 0xC5CD, 0xC5CE, 0xC5CF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC5D0, 0xC5D1, 0xC5D2, 0xC5D3, 0xC5D4, 0xC5D5, 0xC5D6, /* 0x40 */
+ 0xC5D7, 0xC5D8, 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, /* 0x40 */
+ 0xC5DF, 0xC5E0, 0, 0xC5E1, 0xC5E2, 0xC5E3, 0xC5E4, 0xC5E5, /* 0x50 */
+ 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0, 0, /* 0x50 */
+ 0, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5EF, 0xC5F0, 0xC5F1, 0xC5F2, /* 0x60 */
+ 0xC5F3, 0xC5F4, 0xC5F5, 0xC5F6, 0xC5F7, 0xC5F8, 0xC5F9, 0xC5FA, /* 0x60 */
+ 0xC5FB, 0xC5FC, 0, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, /* 0x70 */
+ 0xC602, 0xC603, 0xC604, 0xC605, 0xC606, 0xC607, 0, 0, /* 0x70 */
+ 0, 0xC608, 0xC609, 0xC60A, 0xC60B, 0xC60C, 0xC60D, 0xC60E, /* 0x80 */
+ 0xC60F, 0xC610, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, /* 0x80 */
+ 0xC617, 0xC618, 0, 0xC619, 0xC61A, 0xC61B, 0xC61C, 0xC61D, /* 0x90 */
+ 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623, 0, 0, /* 0x90 */
+ 0, 0xC624, 0xC625, 0xC626, 0xC627, 0xC628, 0xC629, 0xC62A, /* 0xA0 */
+ 0xC62B, 0xC62C, 0xC62D, 0xC62E, 0xC62F, 0xC630, 0xC631, 0xC632, /* 0xA0 */
+ 0xC633, 0xC634, 0, 0xC635, 0xC636, 0xC637, 0xC638, 0xC639, /* 0xB0 */
+ 0xC63A, 0xC63B, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0, 0, /* 0xB0 */
+ 0, 0xC640, 0xC641, 0xC642, 0xC643, 0xC644, 0xC645, 0xC646, /* 0xC0 */
+ 0xC647, 0xC648, 0xC649, 0xC64A, 0xC64B, 0xC64C, 0xC64D, 0xC64E, /* 0xC0 */
+ 0xC64F, 0xC650, 0, 0xC651, 0xC652, 0xC653, 0xC654, 0xC655, /* 0xD0 */
+ 0xC656, 0xC657, 0xC658, 0xC659, 0xC65A, 0xC65B, 0, 0, /* 0xD0 */
+ 0, 0xC65C, 0xC65D, 0xC65E, 0xC65F, 0xC660, 0xC661, 0xC662, /* 0xE0 */
+ 0xC663, 0xC664, 0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, /* 0xE0 */
+ 0xC66B, 0xC66C, 0, 0xC66D, 0xC66E, 0xC66F, 0xC670, 0xC671, /* 0xF0 */
+ 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC678, 0xC679, 0xC67A, 0xC67B, 0xC67C, 0xC67D, 0xC67E, /* 0x40 */
+ 0xC67F, 0xC680, 0xC681, 0xC682, 0xC683, 0xC684, 0xC685, 0xC686, /* 0x40 */
+ 0xC687, 0xC688, 0, 0xC689, 0xC68A, 0xC68B, 0xC68C, 0xC68D, /* 0x50 */
+ 0xC68E, 0xC68F, 0xC690, 0xC691, 0xC692, 0xC693, 0, 0, /* 0x50 */
+ 0, 0xC694, 0xC695, 0xC696, 0xC697, 0xC698, 0xC699, 0xC69A, /* 0x60 */
+ 0xC69B, 0xC69C, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, /* 0x60 */
+ 0xC6A3, 0xC6A4, 0, 0xC6A5, 0xC6A6, 0xC6A7, 0xC6A8, 0xC6A9, /* 0x70 */
+ 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF, 0, 0, /* 0x70 */
+ 0, 0xC6B0, 0xC6B1, 0xC6B2, 0xC6B3, 0xC6B4, 0xC6B5, 0xC6B6, /* 0x80 */
+ 0xC6B7, 0xC6B8, 0xC6B9, 0xC6BA, 0xC6BB, 0xC6BC, 0xC6BD, 0xC6BE, /* 0x80 */
+ 0xC6BF, 0xC6C0, 0, 0xC6C1, 0xC6C2, 0xC6C3, 0xC6C4, 0xC6C5, /* 0x90 */
+ 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9, 0xC6CA, 0xC6CB, 0, 0, /* 0x90 */
+ 0, 0xC6CC, 0xC6CD, 0xC6CE, 0xC6CF, 0xC6D0, 0xC6D1, 0xC6D2, /* 0xA0 */
+ 0xC6D3, 0xC6D4, 0xC6D5, 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, /* 0xA0 */
+ 0xC6DB, 0xC6DC, 0, 0xC6DD, 0xC6DE, 0xC6DF, 0xC6E0, 0xC6E1, /* 0xB0 */
+ 0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0, 0, /* 0xB0 */
+ 0, 0xC6E8, 0xC6E9, 0xC6EA, 0xC6EB, 0xC6EC, 0xC6ED, 0xC6EE, /* 0xC0 */
+ 0xC6EF, 0xC6F0, 0xC6F1, 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5, 0xC6F6, /* 0xC0 */
+ 0xC6F7, 0xC6F8, 0, 0xC6F9, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FD, /* 0xD0 */
+ 0xC6FE, 0xC6FF, 0xC700, 0xC701, 0xC702, 0xC703, 0, 0, /* 0xD0 */
+ 0, 0xC704, 0xC705, 0xC706, 0xC707, 0xC708, 0xC709, 0xC70A, /* 0xE0 */
+ 0xC70B, 0xC70C, 0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, /* 0xE0 */
+ 0xC713, 0xC714, 0, 0xC715, 0xC716, 0xC717, 0xC718, 0xC719, /* 0xF0 */
+ 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC720, 0xC721, 0xC722, 0xC723, 0xC724, 0xC725, 0xC726, /* 0x40 */
+ 0xC727, 0xC728, 0xC729, 0xC72A, 0xC72B, 0xC72C, 0xC72D, 0xC72E, /* 0x40 */
+ 0xC72F, 0xC730, 0, 0xC731, 0xC732, 0xC733, 0xC734, 0xC735, /* 0x50 */
+ 0xC736, 0xC737, 0xC738, 0xC739, 0xC73A, 0xC73B, 0, 0, /* 0x50 */
+ 0, 0xC73C, 0xC73D, 0xC73E, 0xC73F, 0xC740, 0xC741, 0xC742, /* 0x60 */
+ 0xC743, 0xC744, 0xC745, 0xC746, 0xC747, 0xC748, 0xC749, 0xC74A, /* 0x60 */
+ 0xC74B, 0xC74C, 0, 0xC74D, 0xC74E, 0xC74F, 0xC750, 0xC751, /* 0x70 */
+ 0xC752, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, 0, 0, /* 0x70 */
+ 0, 0xC758, 0xC759, 0xC75A, 0xC75B, 0xC75C, 0xC75D, 0xC75E, /* 0x80 */
+ 0xC75F, 0xC760, 0xC761, 0xC762, 0xC763, 0xC764, 0xC765, 0xC766, /* 0x80 */
+ 0xC767, 0xC768, 0, 0xC769, 0xC76A, 0xC76B, 0xC76C, 0xC76D, /* 0x90 */
+ 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, 0, 0, /* 0x90 */
+ 0, 0xC774, 0xC775, 0xC776, 0xC777, 0xC778, 0xC779, 0xC77A, /* 0xA0 */
+ 0xC77B, 0xC77C, 0xC77D, 0xC77E, 0xC77F, 0xC780, 0xC781, 0xC782, /* 0xA0 */
+ 0xC783, 0xC784, 0, 0xC785, 0xC786, 0xC787, 0xC788, 0xC789, /* 0xB0 */
+ 0xC78A, 0xC78B, 0xC78C, 0xC78D, 0xC78E, 0xC78F /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3148, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC790, 0xC791, 0xC792, 0xC793, 0xC794, 0xC795, 0xC796, /* 0x60 */
+ 0xC797, 0xC798, 0xC799, 0xC79A, 0xC79B, 0xC79C, 0xC79D, 0xC79E, /* 0x60 */
+ 0xC79F, 0xC7A0, 0, 0xC7A1, 0xC7A2, 0xC7A3, 0xC7A4, 0xC7A5, /* 0x70 */
+ 0xC7A6, 0xC7A7, 0xC7A8, 0xC7A9, 0xC7AA, 0xC7AB, 0, 0, /* 0x70 */
+ 0, 0xC7AC, 0xC7AD, 0xC7AE, 0xC7AF, 0xC7B0, 0xC7B1, 0xC7B2, /* 0x80 */
+ 0xC7B3, 0xC7B4, 0xC7B5, 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, /* 0x80 */
+ 0xC7BB, 0xC7BC, 0, 0xC7BD, 0xC7BE, 0xC7BF, 0xC7C0, 0xC7C1, /* 0x90 */
+ 0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0, 0, /* 0x90 */
+ 0, 0xC7C8, 0xC7C9, 0xC7CA, 0xC7CB, 0xC7CC, 0xC7CD, 0xC7CE, /* 0xA0 */
+ 0xC7CF, 0xC7D0, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6, /* 0xA0 */
+ 0xC7D7, 0xC7D8, 0, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DD, /* 0xB0 */
+ 0xC7DE, 0xC7DF, 0xC7E0, 0xC7E1, 0xC7E2, 0xC7E3, 0, 0, /* 0xB0 */
+ 0, 0xC7E4, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E8, 0xC7E9, 0xC7EA, /* 0xC0 */
+ 0xC7EB, 0xC7EC, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2, /* 0xC0 */
+ 0xC7F3, 0xC7F4, 0, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9, /* 0xD0 */
+ 0xC7FA, 0xC7FB, 0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0, 0, /* 0xD0 */
+ 0, 0xC800, 0xC801, 0xC802, 0xC803, 0xC804, 0xC805, 0xC806, /* 0xE0 */
+ 0xC807, 0xC808, 0xC809, 0xC80A, 0xC80B, 0xC80C, 0xC80D, 0xC80E, /* 0xE0 */
+ 0xC80F, 0xC810, 0, 0xC811, 0xC812, 0xC813, 0xC814, 0xC815, /* 0xF0 */
+ 0xC816, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_B9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC81C, 0xC81D, 0xC81E, 0xC81F, 0xC820, 0xC821, 0xC822, /* 0x40 */
+ 0xC823, 0xC824, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829, 0xC82A, /* 0x40 */
+ 0xC82B, 0xC82C, 0, 0xC82D, 0xC82E, 0xC82F, 0xC830, 0xC831, /* 0x50 */
+ 0xC832, 0xC833, 0xC834, 0xC835, 0xC836, 0xC837, 0, 0, /* 0x50 */
+ 0, 0xC838, 0xC839, 0xC83A, 0xC83B, 0xC83C, 0xC83D, 0xC83E, /* 0x60 */
+ 0xC83F, 0xC840, 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, /* 0x60 */
+ 0xC847, 0xC848, 0, 0xC849, 0xC84A, 0xC84B, 0xC84C, 0xC84D, /* 0x70 */
+ 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, 0, 0, /* 0x70 */
+ 0, 0xC854, 0xC855, 0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, /* 0x80 */
+ 0xC85B, 0xC85C, 0xC85D, 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, /* 0x80 */
+ 0xC863, 0xC864, 0, 0xC865, 0xC866, 0xC867, 0xC868, 0xC869, /* 0x90 */
+ 0xC86A, 0xC86B, 0xC86C, 0xC86D, 0xC86E, 0xC86F, 0, 0, /* 0x90 */
+ 0, 0xC870, 0xC871, 0xC872, 0xC873, 0xC874, 0xC875, 0xC876, /* 0xA0 */
+ 0xC877, 0xC878, 0xC879, 0xC87A, 0xC87B, 0xC87C, 0xC87D, 0xC87E, /* 0xA0 */
+ 0xC87F, 0xC880, 0, 0xC881, 0xC882, 0xC883, 0xC884, 0xC885, /* 0xB0 */
+ 0xC886, 0xC887, 0xC888, 0xC889, 0xC88A, 0xC88B, 0, 0, /* 0xB0 */
+ 0, 0xC88C, 0xC88D, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892, /* 0xC0 */
+ 0xC893, 0xC894, 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, /* 0xC0 */
+ 0xC89B, 0xC89C, 0, 0xC89D, 0xC89E, 0xC89F, 0xC8A0, 0xC8A1, /* 0xD0 */
+ 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7, 0, 0, /* 0xD0 */
+ 0, 0xC8A8, 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, /* 0xE0 */
+ 0xC8AF, 0xC8B0, 0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, /* 0xE0 */
+ 0xC8B7, 0xC8B8, 0, 0xC8B9, 0xC8BA, 0xC8BB, 0xC8BC, 0xC8BD, /* 0xF0 */
+ 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2, 0xC8C3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_BA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC8C4, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C8, 0xC8C9, 0xC8CA, /* 0x40 */
+ 0xC8CB, 0xC8CC, 0xC8CD, 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, /* 0x40 */
+ 0xC8D3, 0xC8D4, 0, 0xC8D5, 0xC8D6, 0xC8D7, 0xC8D8, 0xC8D9, /* 0x50 */
+ 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, 0, 0, /* 0x50 */
+ 0, 0xC8E0, 0xC8E1, 0xC8E2, 0xC8E3, 0xC8E4, 0xC8E5, 0xC8E6, /* 0x60 */
+ 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC, 0xC8ED, 0xC8EE, /* 0x60 */
+ 0xC8EF, 0xC8F0, 0, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4, 0xC8F5, /* 0x70 */
+ 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0, 0, /* 0x70 */
+ 0, 0xC8FC, 0xC8FD, 0xC8FE, 0xC8FF, 0xC900, 0xC901, 0xC902, /* 0x80 */
+ 0xC903, 0xC904, 0xC905, 0xC906, 0xC907, 0xC908, 0xC909, 0xC90A, /* 0x80 */
+ 0xC90B, 0xC90C, 0, 0xC90D, 0xC90E, 0xC90F, 0xC910, 0xC911, /* 0x90 */
+ 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917, 0, 0, /* 0x90 */
+ 0, 0xC918, 0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, /* 0xA0 */
+ 0xC91F, 0xC920, 0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, /* 0xA0 */
+ 0xC927, 0xC928, 0, 0xC929, 0xC92A, 0xC92B, 0xC92C, 0xC92D, /* 0xB0 */
+ 0xC92E, 0xC92F, 0xC930, 0xC931, 0xC932, 0xC933, 0, 0, /* 0xB0 */
+ 0, 0xC934, 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A, /* 0xC0 */
+ 0xC93B, 0xC93C, 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942, /* 0xC0 */
+ 0xC943, 0xC944, 0, 0xC945, 0xC946, 0xC947, 0xC948, 0xC949, /* 0xD0 */
+ 0xC94A, 0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0, 0, /* 0xD0 */
+ 0, 0xC950, 0xC951, 0xC952, 0xC953, 0xC954, 0xC955, 0xC956, /* 0xE0 */
+ 0xC957, 0xC958, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E, /* 0xE0 */
+ 0xC95F, 0xC960, 0, 0xC961, 0xC962, 0xC963, 0xC964, 0xC965, /* 0xF0 */
+ 0xC966, 0xC967, 0xC968, 0xC969, 0xC96A, 0xC96B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_BB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC96C, 0xC96D, 0xC96E, 0xC96F, 0xC970, 0xC971, 0xC972, /* 0x40 */
+ 0xC973, 0xC974, 0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, /* 0x40 */
+ 0xC97B, 0xC97C, 0, 0xC97D, 0xC97E, 0xC97F, 0xC980, 0xC981, /* 0x50 */
+ 0xC982, 0xC983, 0xC984, 0xC985, 0xC986, 0xC987, 0, 0, /* 0x50 */
+ 0, 0xC988, 0xC989, 0xC98A, 0xC98B, 0xC98C, 0xC98D, 0xC98E, /* 0x60 */
+ 0xC98F, 0xC990, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, /* 0x60 */
+ 0xC997, 0xC998, 0, 0xC999, 0xC99A, 0xC99B, 0xC99C, 0xC99D, /* 0x70 */
+ 0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, 0, 0, /* 0x70 */
+ 0, 0xC9A4, 0xC9A5, 0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, /* 0x80 */
+ 0xC9AB, 0xC9AC, 0xC9AD, 0xC9AE, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, /* 0x80 */
+ 0xC9B3, 0xC9B4, 0, 0xC9B5, 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, /* 0x90 */
+ 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD, 0xC9BE, 0xC9BF, 0, 0, /* 0x90 */
+ 0, 0xC9C0, 0xC9C1, 0xC9C2, 0xC9C3, 0xC9C4, 0xC9C5, 0xC9C6, /* 0xA0 */
+ 0xC9C7, 0xC9C8, 0xC9C9, 0xC9CA, 0xC9CB, 0xC9CC, 0xC9CD, 0xC9CE, /* 0xA0 */
+ 0xC9CF, 0xC9D0, 0, 0xC9D1, 0xC9D2, 0xC9D3, 0xC9D4, 0xC9D5, /* 0xB0 */
+ 0xC9D6, 0xC9D7, 0xC9D8, 0xC9D9, 0xC9DA, 0xC9DB /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_BC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3149, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC9DC, 0xC9DD, 0xC9DE, 0xC9DF, 0xC9E0, 0xC9E1, 0xC9E2, /* 0x60 */
+ 0xC9E3, 0xC9E4, 0xC9E5, 0xC9E6, 0xC9E7, 0xC9E8, 0xC9E9, 0xC9EA, /* 0x60 */
+ 0xC9EB, 0xC9EC, 0, 0xC9ED, 0xC9EE, 0xC9EF, 0xC9F0, 0xC9F1, /* 0x70 */
+ 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5, 0xC9F6, 0xC9F7, 0, 0, /* 0x70 */
+ 0, 0xC9F8, 0xC9F9, 0xC9FA, 0xC9FB, 0xC9FC, 0xC9FD, 0xC9FE, /* 0x80 */
+ 0xC9FF, 0xCA00, 0xCA01, 0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06, /* 0x80 */
+ 0xCA07, 0xCA08, 0, 0xCA09, 0xCA0A, 0xCA0B, 0xCA0C, 0xCA0D, /* 0x90 */
+ 0xCA0E, 0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0, 0, /* 0x90 */
+ 0, 0xCA14, 0xCA15, 0xCA16, 0xCA17, 0xCA18, 0xCA19, 0xCA1A, /* 0xA0 */
+ 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20, 0xCA21, 0xCA22, /* 0xA0 */
+ 0xCA23, 0xCA24, 0, 0xCA25, 0xCA26, 0xCA27, 0xCA28, 0xCA29, /* 0xB0 */
+ 0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, 0, 0, /* 0xB0 */
+ 0, 0xCA30, 0xCA31, 0xCA32, 0xCA33, 0xCA34, 0xCA35, 0xCA36, /* 0xC0 */
+ 0xCA37, 0xCA38, 0xCA39, 0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, 0xCA3E, /* 0xC0 */
+ 0xCA3F, 0xCA40, 0, 0xCA41, 0xCA42, 0xCA43, 0xCA44, 0xCA45, /* 0xD0 */
+ 0xCA46, 0xCA47, 0xCA48, 0xCA49, 0xCA4A, 0xCA4B, 0, 0, /* 0xD0 */
+ 0, 0xCA4C, 0xCA4D, 0xCA4E, 0xCA4F, 0xCA50, 0xCA51, 0xCA52, /* 0xE0 */
+ 0xCA53, 0xCA54, 0xCA55, 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, /* 0xE0 */
+ 0xCA5B, 0xCA5C, 0, 0xCA5D, 0xCA5E, 0xCA5F, 0xCA60, 0xCA61, /* 0xF0 */
+ 0xCA62, 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_BD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCA68, 0xCA69, 0xCA6A, 0xCA6B, 0xCA6C, 0xCA6D, 0xCA6E, /* 0x40 */
+ 0xCA6F, 0xCA70, 0xCA71, 0xCA72, 0xCA73, 0xCA74, 0xCA75, 0xCA76, /* 0x40 */
+ 0xCA77, 0xCA78, 0, 0xCA79, 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7D, /* 0x50 */
+ 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, 0, 0, /* 0x50 */
+ 0, 0xCA84, 0xCA85, 0xCA86, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, /* 0x60 */
+ 0xCA8B, 0xCA8C, 0xCA8D, 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, /* 0x60 */
+ 0xCA93, 0xCA94, 0, 0xCA95, 0xCA96, 0xCA97, 0xCA98, 0xCA99, /* 0x70 */
+ 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E, 0xCA9F, 0, 0, /* 0x70 */
+ 0, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6, /* 0x80 */
+ 0xCAA7, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE, /* 0x80 */
+ 0xCAAF, 0xCAB0, 0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5, /* 0x90 */
+ 0xCAB6, 0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0, 0, /* 0x90 */
+ 0, 0xCABC, 0xCABD, 0xCABE, 0xCABF, 0xCAC0, 0xCAC1, 0xCAC2, /* 0xA0 */
+ 0xCAC3, 0xCAC4, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA, /* 0xA0 */
+ 0xCACB, 0xCACC, 0, 0xCACD, 0xCACE, 0xCACF, 0xCAD0, 0xCAD1, /* 0xB0 */
+ 0xCAD2, 0xCAD3, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7, 0, 0, /* 0xB0 */
+ 0, 0xCAD8, 0xCAD9, 0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE, /* 0xC0 */
+ 0xCADF, 0xCAE0, 0xCAE1, 0xCAE2, 0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6, /* 0xC0 */
+ 0xCAE7, 0xCAE8, 0, 0xCAE9, 0xCAEA, 0xCAEB, 0xCAEC, 0xCAED, /* 0xD0 */
+ 0xCAEE, 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3, 0, 0, /* 0xD0 */
+ 0, 0xCAF4, 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, 0xCAFA, /* 0xE0 */
+ 0xCAFB, 0xCAFC, 0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, 0xCB02, /* 0xE0 */
+ 0xCB03, 0xCB04, 0, 0xCB05, 0xCB06, 0xCB07, 0xCB08, 0xCB09, /* 0xF0 */
+ 0xCB0A, 0xCB0B, 0xCB0C, 0xCB0D, 0xCB0E, 0xCB0F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_BE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCB10, 0xCB11, 0xCB12, 0xCB13, 0xCB14, 0xCB15, 0xCB16, /* 0x40 */
+ 0xCB17, 0xCB18, 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, /* 0x40 */
+ 0xCB1F, 0xCB20, 0, 0xCB21, 0xCB22, 0xCB23, 0xCB24, 0xCB25, /* 0x50 */
+ 0xCB26, 0xCB27, 0xCB28, 0xCB29, 0xCB2A, 0xCB2B, 0, 0, /* 0x50 */
+ 0, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32, /* 0x60 */
+ 0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A, /* 0x60 */
+ 0xCB3B, 0xCB3C, 0, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, 0xCB41, /* 0x70 */
+ 0xCB42, 0xCB43, 0xCB44, 0xCB45, 0xCB46, 0xCB47, 0, 0, /* 0x70 */
+ 0, 0xCB48, 0xCB49, 0xCB4A, 0xCB4B, 0xCB4C, 0xCB4D, 0xCB4E, /* 0x80 */
+ 0xCB4F, 0xCB50, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, /* 0x80 */
+ 0xCB57, 0xCB58, 0, 0xCB59, 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5D, /* 0x90 */
+ 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62, 0xCB63, 0, 0, /* 0x90 */
+ 0, 0xCB64, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, /* 0xA0 */
+ 0xCB6B, 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, /* 0xA0 */
+ 0xCB73, 0xCB74, 0, 0xCB75, 0xCB76, 0xCB77, 0xCB78, 0xCB79, /* 0xB0 */
+ 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D, 0xCB7E, 0xCB7F, 0, 0, /* 0xB0 */
+ 0, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85, 0xCB86, /* 0xC0 */
+ 0xCB87, 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCB8E, /* 0xC0 */
+ 0xCB8F, 0xCB90, 0, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95, /* 0xD0 */
+ 0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0, 0, /* 0xD0 */
+ 0, 0xCB9C, 0xCB9D, 0xCB9E, 0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2, /* 0xE0 */
+ 0xCBA3, 0xCBA4, 0xCBA5, 0xCBA6, 0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, /* 0xE0 */
+ 0xCBAB, 0xCBAC, 0, 0xCBAD, 0xCBAE, 0xCBAF, 0xCBB0, 0xCBB1, /* 0xF0 */
+ 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6, 0xCBB7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_BF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCBB8, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE, /* 0x40 */
+ 0xCBBF, 0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0xCBC5, 0xCBC6, /* 0x40 */
+ 0xCBC7, 0xCBC8, 0, 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD, /* 0x50 */
+ 0xCBCE, 0xCBCF, 0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, 0, 0, /* 0x50 */
+ 0, 0xCBD4, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8, 0xCBD9, 0xCBDA, /* 0x60 */
+ 0xCBDB, 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, 0xCBE0, 0xCBE1, 0xCBE2, /* 0x60 */
+ 0xCBE3, 0xCBE4, 0, 0xCBE5, 0xCBE6, 0xCBE7, 0xCBE8, 0xCBE9, /* 0x70 */
+ 0xCBEA, 0xCBEB, 0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0, 0, /* 0x70 */
+ 0, 0xCBF0, 0xCBF1, 0xCBF2, 0xCBF3, 0xCBF4, 0xCBF5, 0xCBF6, /* 0x80 */
+ 0xCBF7, 0xCBF8, 0xCBF9, 0xCBFA, 0xCBFB, 0xCBFC, 0xCBFD, 0xCBFE, /* 0x80 */
+ 0xCBFF, 0xCC00, 0, 0xCC01, 0xCC02, 0xCC03, 0xCC04, 0xCC05, /* 0x90 */
+ 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B, 0, 0, /* 0x90 */
+ 0, 0xCC0C, 0xCC0D, 0xCC0E, 0xCC0F, 0xCC10, 0xCC11, 0xCC12, /* 0xA0 */
+ 0xCC13, 0xCC14, 0xCC15, 0xCC16, 0xCC17, 0xCC18, 0xCC19, 0xCC1A, /* 0xA0 */
+ 0xCC1B, 0xCC1C, 0, 0xCC1D, 0xCC1E, 0xCC1F, 0xCC20, 0xCC21, /* 0xB0 */
+ 0xCC22, 0xCC23, 0xCC24, 0xCC25, 0xCC26, 0xCC27 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x314A, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCC28, 0xCC29, 0xCC2A, 0xCC2B, 0xCC2C, 0xCC2D, 0xCC2E, /* 0x60 */
+ 0xCC2F, 0xCC30, 0xCC31, 0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, /* 0x60 */
+ 0xCC37, 0xCC38, 0, 0xCC39, 0xCC3A, 0xCC3B, 0xCC3C, 0xCC3D, /* 0x70 */
+ 0xCC3E, 0xCC3F, 0xCC40, 0xCC41, 0xCC42, 0xCC43, 0, 0, /* 0x70 */
+ 0, 0xCC44, 0xCC45, 0xCC46, 0xCC47, 0xCC48, 0xCC49, 0xCC4A, /* 0x80 */
+ 0xCC4B, 0xCC4C, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, /* 0x80 */
+ 0xCC53, 0xCC54, 0, 0xCC55, 0xCC56, 0xCC57, 0xCC58, 0xCC59, /* 0x90 */
+ 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0, 0, /* 0x90 */
+ 0, 0xCC60, 0xCC61, 0xCC62, 0xCC63, 0xCC64, 0xCC65, 0xCC66, /* 0xA0 */
+ 0xCC67, 0xCC68, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D, 0xCC6E, /* 0xA0 */
+ 0xCC6F, 0xCC70, 0, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC75, /* 0xB0 */
+ 0xCC76, 0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0, 0, /* 0xB0 */
+ 0, 0xCC7C, 0xCC7D, 0xCC7E, 0xCC7F, 0xCC80, 0xCC81, 0xCC82, /* 0xC0 */
+ 0xCC83, 0xCC84, 0xCC85, 0xCC86, 0xCC87, 0xCC88, 0xCC89, 0xCC8A, /* 0xC0 */
+ 0xCC8B, 0xCC8C, 0, 0xCC8D, 0xCC8E, 0xCC8F, 0xCC90, 0xCC91, /* 0xD0 */
+ 0xCC92, 0xCC93, 0xCC94, 0xCC95, 0xCC96, 0xCC97, 0, 0, /* 0xD0 */
+ 0, 0xCC98, 0xCC99, 0xCC9A, 0xCC9B, 0xCC9C, 0xCC9D, 0xCC9E, /* 0xE0 */
+ 0xCC9F, 0xCCA0, 0xCCA1, 0xCCA2, 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, /* 0xE0 */
+ 0xCCA7, 0xCCA8, 0, 0xCCA9, 0xCCAA, 0xCCAB, 0xCCAC, 0xCCAD, /* 0xF0 */
+ 0xCCAE, 0xCCAF, 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCCB4, 0xCCB5, 0xCCB6, 0xCCB7, 0xCCB8, 0xCCB9, 0xCCBA, /* 0x40 */
+ 0xCCBB, 0xCCBC, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, /* 0x40 */
+ 0xCCC3, 0xCCC4, 0, 0xCCC5, 0xCCC6, 0xCCC7, 0xCCC8, 0xCCC9, /* 0x50 */
+ 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF, 0, 0, /* 0x50 */
+ 0, 0xCCD0, 0xCCD1, 0xCCD2, 0xCCD3, 0xCCD4, 0xCCD5, 0xCCD6, /* 0x60 */
+ 0xCCD7, 0xCCD8, 0xCCD9, 0xCCDA, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, /* 0x60 */
+ 0xCCDF, 0xCCE0, 0, 0xCCE1, 0xCCE2, 0xCCE3, 0xCCE4, 0xCCE5, /* 0x70 */
+ 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA, 0xCCEB, 0, 0, /* 0x70 */
+ 0, 0xCCEC, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF0, 0xCCF1, 0xCCF2, /* 0x80 */
+ 0xCCF3, 0xCCF4, 0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, /* 0x80 */
+ 0xCCFB, 0xCCFC, 0, 0xCCFD, 0xCCFE, 0xCCFF, 0xCD00, 0xCD01, /* 0x90 */
+ 0xCD02, 0xCD03, 0xCD04, 0xCD05, 0xCD06, 0xCD07, 0, 0, /* 0x90 */
+ 0, 0xCD08, 0xCD09, 0xCD0A, 0xCD0B, 0xCD0C, 0xCD0D, 0xCD0E, /* 0xA0 */
+ 0xCD0F, 0xCD10, 0xCD11, 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, /* 0xA0 */
+ 0xCD17, 0xCD18, 0, 0xCD19, 0xCD1A, 0xCD1B, 0xCD1C, 0xCD1D, /* 0xB0 */
+ 0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, 0, 0, /* 0xB0 */
+ 0, 0xCD24, 0xCD25, 0xCD26, 0xCD27, 0xCD28, 0xCD29, 0xCD2A, /* 0xC0 */
+ 0xCD2B, 0xCD2C, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30, 0xCD31, 0xCD32, /* 0xC0 */
+ 0xCD33, 0xCD34, 0, 0xCD35, 0xCD36, 0xCD37, 0xCD38, 0xCD39, /* 0xD0 */
+ 0xCD3A, 0xCD3B, 0xCD3C, 0xCD3D, 0xCD3E, 0xCD3F, 0, 0, /* 0xD0 */
+ 0, 0xCD40, 0xCD41, 0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46, /* 0xE0 */
+ 0xCD47, 0xCD48, 0xCD49, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, /* 0xE0 */
+ 0xCD4F, 0xCD50, 0, 0xCD51, 0xCD52, 0xCD53, 0xCD54, 0xCD55, /* 0xF0 */
+ 0xCD56, 0xCD57, 0xCD58, 0xCD59, 0xCD5A, 0xCD5B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCD5C, 0xCD5D, 0xCD5E, 0xCD5F, 0xCD60, 0xCD61, 0xCD62, /* 0x40 */
+ 0xCD63, 0xCD64, 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, /* 0x40 */
+ 0xCD6B, 0xCD6C, 0, 0xCD6D, 0xCD6E, 0xCD6F, 0xCD70, 0xCD71, /* 0x50 */
+ 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, 0, 0, /* 0x50 */
+ 0, 0xCD78, 0xCD79, 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E, /* 0x60 */
+ 0xCD7F, 0xCD80, 0xCD81, 0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, /* 0x60 */
+ 0xCD87, 0xCD88, 0, 0xCD89, 0xCD8A, 0xCD8B, 0xCD8C, 0xCD8D, /* 0x70 */
+ 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92, 0xCD93, 0, 0, /* 0x70 */
+ 0, 0xCD94, 0xCD95, 0xCD96, 0xCD97, 0xCD98, 0xCD99, 0xCD9A, /* 0x80 */
+ 0xCD9B, 0xCD9C, 0xCD9D, 0xCD9E, 0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2, /* 0x80 */
+ 0xCDA3, 0xCDA4, 0, 0xCDA5, 0xCDA6, 0xCDA7, 0xCDA8, 0xCDA9, /* 0x90 */
+ 0xCDAA, 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, 0, 0, /* 0x90 */
+ 0, 0xCDB0, 0xCDB1, 0xCDB2, 0xCDB3, 0xCDB4, 0xCDB5, 0xCDB6, /* 0xA0 */
+ 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB, 0xCDBC, 0xCDBD, 0xCDBE, /* 0xA0 */
+ 0xCDBF, 0xCDC0, 0, 0xCDC1, 0xCDC2, 0xCDC3, 0xCDC4, 0xCDC5, /* 0xB0 */
+ 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0, 0, /* 0xB0 */
+ 0, 0xCDCC, 0xCDCD, 0xCDCE, 0xCDCF, 0xCDD0, 0xCDD1, 0xCDD2, /* 0xC0 */
+ 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6, 0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA, /* 0xC0 */
+ 0xCDDB, 0xCDDC, 0, 0xCDDD, 0xCDDE, 0xCDDF, 0xCDE0, 0xCDE1, /* 0xD0 */
+ 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6, 0xCDE7, 0, 0, /* 0xD0 */
+ 0, 0xCDE8, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDEC, 0xCDED, 0xCDEE, /* 0xE0 */
+ 0xCDEF, 0xCDF0, 0xCDF1, 0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6, /* 0xE0 */
+ 0xCDF7, 0xCDF8, 0, 0xCDF9, 0xCDFA, 0xCDFB, 0xCDFC, 0xCDFD, /* 0xF0 */
+ 0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, 0xCE03 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCE04, 0xCE05, 0xCE06, 0xCE07, 0xCE08, 0xCE09, 0xCE0A, /* 0x40 */
+ 0xCE0B, 0xCE0C, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10, 0xCE11, 0xCE12, /* 0x40 */
+ 0xCE13, 0xCE14, 0, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE19, /* 0x50 */
+ 0xCE1A, 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0, 0, /* 0x50 */
+ 0, 0xCE20, 0xCE21, 0xCE22, 0xCE23, 0xCE24, 0xCE25, 0xCE26, /* 0x60 */
+ 0xCE27, 0xCE28, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E, /* 0x60 */
+ 0xCE2F, 0xCE30, 0, 0xCE31, 0xCE32, 0xCE33, 0xCE34, 0xCE35, /* 0x70 */
+ 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A, 0xCE3B, 0, 0, /* 0x70 */
+ 0, 0xCE3C, 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42, /* 0x80 */
+ 0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, 0xCE49, 0xCE4A, /* 0x80 */
+ 0xCE4B, 0xCE4C, 0, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, 0xCE51, /* 0x90 */
+ 0xCE52, 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0, 0, /* 0x90 */
+ 0, 0xCE58, 0xCE59, 0xCE5A, 0xCE5B, 0xCE5C, 0xCE5D, 0xCE5E, /* 0xA0 */
+ 0xCE5F, 0xCE60, 0xCE61, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, /* 0xA0 */
+ 0xCE67, 0xCE68, 0, 0xCE69, 0xCE6A, 0xCE6B, 0xCE6C, 0xCE6D, /* 0xB0 */
+ 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x314B, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCE74, 0xCE75, 0xCE76, 0xCE77, 0xCE78, 0xCE79, 0xCE7A, /* 0x60 */
+ 0xCE7B, 0xCE7C, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80, 0xCE81, 0xCE82, /* 0x60 */
+ 0xCE83, 0xCE84, 0, 0xCE85, 0xCE86, 0xCE87, 0xCE88, 0xCE89, /* 0x70 */
+ 0xCE8A, 0xCE8B, 0xCE8C, 0xCE8D, 0xCE8E, 0xCE8F, 0, 0, /* 0x70 */
+ 0, 0xCE90, 0xCE91, 0xCE92, 0xCE93, 0xCE94, 0xCE95, 0xCE96, /* 0x80 */
+ 0xCE97, 0xCE98, 0xCE99, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, /* 0x80 */
+ 0xCE9F, 0xCEA0, 0, 0xCEA1, 0xCEA2, 0xCEA3, 0xCEA4, 0xCEA5, /* 0x90 */
+ 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0, 0, /* 0x90 */
+ 0, 0xCEAC, 0xCEAD, 0xCEAE, 0xCEAF, 0xCEB0, 0xCEB1, 0xCEB2, /* 0xA0 */
+ 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7, 0xCEB8, 0xCEB9, 0xCEBA, /* 0xA0 */
+ 0xCEBB, 0xCEBC, 0, 0xCEBD, 0xCEBE, 0xCEBF, 0xCEC0, 0xCEC1, /* 0xB0 */
+ 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0, 0, /* 0xB0 */
+ 0, 0xCEC8, 0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, /* 0xC0 */
+ 0xCECF, 0xCED0, 0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, 0xCED6, /* 0xC0 */
+ 0xCED7, 0xCED8, 0, 0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, /* 0xD0 */
+ 0xCEDE, 0xCEDF, 0xCEE0, 0xCEE1, 0xCEE2, 0xCEE3, 0, 0, /* 0xD0 */
+ 0, 0xCEE4, 0xCEE5, 0xCEE6, 0xCEE7, 0xCEE8, 0xCEE9, 0xCEEA, /* 0xE0 */
+ 0xCEEB, 0xCEEC, 0xCEED, 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2, /* 0xE0 */
+ 0xCEF3, 0xCEF4, 0, 0xCEF5, 0xCEF6, 0xCEF7, 0xCEF8, 0xCEF9, /* 0xF0 */
+ 0xCEFA, 0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCF00, 0xCF01, 0xCF02, 0xCF03, 0xCF04, 0xCF05, 0xCF06, /* 0x40 */
+ 0xCF07, 0xCF08, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E, /* 0x40 */
+ 0xCF0F, 0xCF10, 0, 0xCF11, 0xCF12, 0xCF13, 0xCF14, 0xCF15, /* 0x50 */
+ 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A, 0xCF1B, 0, 0, /* 0x50 */
+ 0, 0xCF1C, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF20, 0xCF21, 0xCF22, /* 0x60 */
+ 0xCF23, 0xCF24, 0xCF25, 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, /* 0x60 */
+ 0xCF2B, 0xCF2C, 0, 0xCF2D, 0xCF2E, 0xCF2F, 0xCF30, 0xCF31, /* 0x70 */
+ 0xCF32, 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0, 0, /* 0x70 */
+ 0, 0xCF38, 0xCF39, 0xCF3A, 0xCF3B, 0xCF3C, 0xCF3D, 0xCF3E, /* 0x80 */
+ 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43, 0xCF44, 0xCF45, 0xCF46, /* 0x80 */
+ 0xCF47, 0xCF48, 0, 0xCF49, 0xCF4A, 0xCF4B, 0xCF4C, 0xCF4D, /* 0x90 */
+ 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53, 0, 0, /* 0x90 */
+ 0, 0xCF54, 0xCF55, 0xCF56, 0xCF57, 0xCF58, 0xCF59, 0xCF5A, /* 0xA0 */
+ 0xCF5B, 0xCF5C, 0xCF5D, 0xCF5E, 0xCF5F, 0xCF60, 0xCF61, 0xCF62, /* 0xA0 */
+ 0xCF63, 0xCF64, 0, 0xCF65, 0xCF66, 0xCF67, 0xCF68, 0xCF69, /* 0xB0 */
+ 0xCF6A, 0xCF6B, 0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, 0, 0, /* 0xB0 */
+ 0, 0xCF70, 0xCF71, 0xCF72, 0xCF73, 0xCF74, 0xCF75, 0xCF76, /* 0xC0 */
+ 0xCF77, 0xCF78, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, /* 0xC0 */
+ 0xCF7F, 0xCF80, 0, 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF85, /* 0xD0 */
+ 0xCF86, 0xCF87, 0xCF88, 0xCF89, 0xCF8A, 0xCF8B, 0, 0, /* 0xD0 */
+ 0, 0xCF8C, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92, /* 0xE0 */
+ 0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A, /* 0xE0 */
+ 0xCF9B, 0xCF9C, 0, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA1, /* 0xF0 */
+ 0xCFA2, 0xCFA3, 0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFA8, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC, 0xCFAD, 0xCFAE, /* 0x40 */
+ 0xCFAF, 0xCFB0, 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5, 0xCFB6, /* 0x40 */
+ 0xCFB7, 0xCFB8, 0, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD, /* 0x50 */
+ 0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, 0xCFC3, 0, 0, /* 0x50 */
+ 0, 0xCFC4, 0xCFC5, 0xCFC6, 0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, /* 0x60 */
+ 0xCFCB, 0xCFCC, 0xCFCD, 0xCFCE, 0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, /* 0x60 */
+ 0xCFD3, 0xCFD4, 0, 0xCFD5, 0xCFD6, 0xCFD7, 0xCFD8, 0xCFD9, /* 0x70 */
+ 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE, 0xCFDF, 0, 0, /* 0x70 */
+ 0, 0xCFE0, 0xCFE1, 0xCFE2, 0xCFE3, 0xCFE4, 0xCFE5, 0xCFE6, /* 0x80 */
+ 0xCFE7, 0xCFE8, 0xCFE9, 0xCFEA, 0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, /* 0x80 */
+ 0xCFEF, 0xCFF0, 0, 0xCFF1, 0xCFF2, 0xCFF3, 0xCFF4, 0xCFF5, /* 0x90 */
+ 0xCFF6, 0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0, 0, /* 0x90 */
+ 0, 0xCFFC, 0xCFFD, 0xCFFE, 0xCFFF, 0xD000, 0xD001, 0xD002, /* 0xA0 */
+ 0xD003, 0xD004, 0xD005, 0xD006, 0xD007, 0xD008, 0xD009, 0xD00A, /* 0xA0 */
+ 0xD00B, 0xD00C, 0, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD011, /* 0xB0 */
+ 0xD012, 0xD013, 0xD014, 0xD015, 0xD016, 0xD017, 0, 0, /* 0xB0 */
+ 0, 0xD018, 0xD019, 0xD01A, 0xD01B, 0xD01C, 0xD01D, 0xD01E, /* 0xC0 */
+ 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023, 0xD024, 0xD025, 0xD026, /* 0xC0 */
+ 0xD027, 0xD028, 0, 0xD029, 0xD02A, 0xD02B, 0xD02C, 0xD02D, /* 0xD0 */
+ 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0, 0, /* 0xD0 */
+ 0, 0xD034, 0xD035, 0xD036, 0xD037, 0xD038, 0xD039, 0xD03A, /* 0xE0 */
+ 0xD03B, 0xD03C, 0xD03D, 0xD03E, 0xD03F, 0xD040, 0xD041, 0xD042, /* 0xE0 */
+ 0xD043, 0xD044, 0, 0xD045, 0xD046, 0xD047, 0xD048, 0xD049, /* 0xF0 */
+ 0xD04A, 0xD04B, 0xD04C, 0xD04D, 0xD04E, 0xD04F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD050, 0xD051, 0xD052, 0xD053, 0xD054, 0xD055, 0xD056, /* 0x40 */
+ 0xD057, 0xD058, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, /* 0x40 */
+ 0xD05F, 0xD060, 0, 0xD061, 0xD062, 0xD063, 0xD064, 0xD065, /* 0x50 */
+ 0xD066, 0xD067, 0xD068, 0xD069, 0xD06A, 0xD06B, 0, 0, /* 0x50 */
+ 0, 0xD06C, 0xD06D, 0xD06E, 0xD06F, 0xD070, 0xD071, 0xD072, /* 0x60 */
+ 0xD073, 0xD074, 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, /* 0x60 */
+ 0xD07B, 0xD07C, 0, 0xD07D, 0xD07E, 0xD07F, 0xD080, 0xD081, /* 0x70 */
+ 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, 0xD087, 0, 0, /* 0x70 */
+ 0, 0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E, /* 0x80 */
+ 0xD08F, 0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xD095, 0xD096, /* 0x80 */
+ 0xD097, 0xD098, 0, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, /* 0x90 */
+ 0xD09E, 0xD09F, 0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, 0, 0, /* 0x90 */
+ 0, 0xD0A4, 0xD0A5, 0xD0A6, 0xD0A7, 0xD0A8, 0xD0A9, 0xD0AA, /* 0xA0 */
+ 0xD0AB, 0xD0AC, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, /* 0xA0 */
+ 0xD0B3, 0xD0B4, 0, 0xD0B5, 0xD0B6, 0xD0B7, 0xD0B8, 0xD0B9, /* 0xB0 */
+ 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x314C, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD0C0, 0xD0C1, 0xD0C2, 0xD0C3, 0xD0C4, 0xD0C5, 0xD0C6, /* 0x60 */
+ 0xD0C7, 0xD0C8, 0xD0C9, 0xD0CA, 0xD0CB, 0xD0CC, 0xD0CD, 0xD0CE, /* 0x60 */
+ 0xD0CF, 0xD0D0, 0, 0xD0D1, 0xD0D2, 0xD0D3, 0xD0D4, 0xD0D5, /* 0x70 */
+ 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9, 0xD0DA, 0xD0DB, 0, 0, /* 0x70 */
+ 0, 0xD0DC, 0xD0DD, 0xD0DE, 0xD0DF, 0xD0E0, 0xD0E1, 0xD0E2, /* 0x80 */
+ 0xD0E3, 0xD0E4, 0xD0E5, 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, /* 0x80 */
+ 0xD0EB, 0xD0EC, 0, 0xD0ED, 0xD0EE, 0xD0EF, 0xD0F0, 0xD0F1, /* 0x90 */
+ 0xD0F2, 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0, 0, /* 0x90 */
+ 0, 0xD0F8, 0xD0F9, 0xD0FA, 0xD0FB, 0xD0FC, 0xD0FD, 0xD0FE, /* 0xA0 */
+ 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103, 0xD104, 0xD105, 0xD106, /* 0xA0 */
+ 0xD107, 0xD108, 0, 0xD109, 0xD10A, 0xD10B, 0xD10C, 0xD10D, /* 0xB0 */
+ 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, 0, 0, /* 0xB0 */
+ 0, 0xD114, 0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A, /* 0xC0 */
+ 0xD11B, 0xD11C, 0xD11D, 0xD11E, 0xD11F, 0xD120, 0xD121, 0xD122, /* 0xC0 */
+ 0xD123, 0xD124, 0, 0xD125, 0xD126, 0xD127, 0xD128, 0xD129, /* 0xD0 */
+ 0xD12A, 0xD12B, 0xD12C, 0xD12D, 0xD12E, 0xD12F, 0, 0, /* 0xD0 */
+ 0, 0xD130, 0xD131, 0xD132, 0xD133, 0xD134, 0xD135, 0xD136, /* 0xE0 */
+ 0xD137, 0xD138, 0xD139, 0xD13A, 0xD13B, 0xD13C, 0xD13D, 0xD13E, /* 0xE0 */
+ 0xD13F, 0xD140, 0, 0xD141, 0xD142, 0xD143, 0xD144, 0xD145, /* 0xF0 */
+ 0xD146, 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_C9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD14C, 0xD14D, 0xD14E, 0xD14F, 0xD150, 0xD151, 0xD152, /* 0x40 */
+ 0xD153, 0xD154, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A, /* 0x40 */
+ 0xD15B, 0xD15C, 0, 0xD15D, 0xD15E, 0xD15F, 0xD160, 0xD161, /* 0x50 */
+ 0xD162, 0xD163, 0xD164, 0xD165, 0xD166, 0xD167, 0, 0, /* 0x50 */
+ 0, 0xD168, 0xD169, 0xD16A, 0xD16B, 0xD16C, 0xD16D, 0xD16E, /* 0x60 */
+ 0xD16F, 0xD170, 0xD171, 0xD172, 0xD173, 0xD174, 0xD175, 0xD176, /* 0x60 */
+ 0xD177, 0xD178, 0, 0xD179, 0xD17A, 0xD17B, 0xD17C, 0xD17D, /* 0x70 */
+ 0xD17E, 0xD17F, 0xD180, 0xD181, 0xD182, 0xD183, 0, 0, /* 0x70 */
+ 0, 0xD184, 0xD185, 0xD186, 0xD187, 0xD188, 0xD189, 0xD18A, /* 0x80 */
+ 0xD18B, 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192, /* 0x80 */
+ 0xD193, 0xD194, 0, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, /* 0x90 */
+ 0xD19A, 0xD19B, 0xD19C, 0xD19D, 0xD19E, 0xD19F, 0, 0, /* 0x90 */
+ 0, 0xD1A0, 0xD1A1, 0xD1A2, 0xD1A3, 0xD1A4, 0xD1A5, 0xD1A6, /* 0xA0 */
+ 0xD1A7, 0xD1A8, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, /* 0xA0 */
+ 0xD1AF, 0xD1B0, 0, 0xD1B1, 0xD1B2, 0xD1B3, 0xD1B4, 0xD1B5, /* 0xB0 */
+ 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BA, 0xD1BB, 0, 0, /* 0xB0 */
+ 0, 0xD1BC, 0xD1BD, 0xD1BE, 0xD1BF, 0xD1C0, 0xD1C1, 0xD1C2, /* 0xC0 */
+ 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6, 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, /* 0xC0 */
+ 0xD1CB, 0xD1CC, 0, 0xD1CD, 0xD1CE, 0xD1CF, 0xD1D0, 0xD1D1, /* 0xD0 */
+ 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6, 0xD1D7, 0, 0, /* 0xD0 */
+ 0, 0xD1D8, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE, /* 0xE0 */
+ 0xD1DF, 0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, /* 0xE0 */
+ 0xD1E7, 0xD1E8, 0, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED, /* 0xF0 */
+ 0xD1EE, 0xD1EF, 0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_CA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1F4, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F8, 0xD1F9, 0xD1FA, /* 0x40 */
+ 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201, 0xD202, /* 0x40 */
+ 0xD203, 0xD204, 0, 0xD205, 0xD206, 0xD207, 0xD208, 0xD209, /* 0x50 */
+ 0xD20A, 0xD20B, 0xD20C, 0xD20D, 0xD20E, 0xD20F, 0, 0, /* 0x50 */
+ 0, 0xD210, 0xD211, 0xD212, 0xD213, 0xD214, 0xD215, 0xD216, /* 0x60 */
+ 0xD217, 0xD218, 0xD219, 0xD21A, 0xD21B, 0xD21C, 0xD21D, 0xD21E, /* 0x60 */
+ 0xD21F, 0xD220, 0, 0xD221, 0xD222, 0xD223, 0xD224, 0xD225, /* 0x70 */
+ 0xD226, 0xD227, 0xD228, 0xD229, 0xD22A, 0xD22B, 0, 0, /* 0x70 */
+ 0, 0xD22C, 0xD22D, 0xD22E, 0xD22F, 0xD230, 0xD231, 0xD232, /* 0x80 */
+ 0xD233, 0xD234, 0xD235, 0xD236, 0xD237, 0xD238, 0xD239, 0xD23A, /* 0x80 */
+ 0xD23B, 0xD23C, 0, 0xD23D, 0xD23E, 0xD23F, 0xD240, 0xD241, /* 0x90 */
+ 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247, 0, 0, /* 0x90 */
+ 0, 0xD248, 0xD249, 0xD24A, 0xD24B, 0xD24C, 0xD24D, 0xD24E, /* 0xA0 */
+ 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255, 0xD256, /* 0xA0 */
+ 0xD257, 0xD258, 0, 0xD259, 0xD25A, 0xD25B, 0xD25C, 0xD25D, /* 0xB0 */
+ 0xD25E, 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0, 0, /* 0xB0 */
+ 0, 0xD264, 0xD265, 0xD266, 0xD267, 0xD268, 0xD269, 0xD26A, /* 0xC0 */
+ 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F, 0xD270, 0xD271, 0xD272, /* 0xC0 */
+ 0xD273, 0xD274, 0, 0xD275, 0xD276, 0xD277, 0xD278, 0xD279, /* 0xD0 */
+ 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F, 0, 0, /* 0xD0 */
+ 0, 0xD280, 0xD281, 0xD282, 0xD283, 0xD284, 0xD285, 0xD286, /* 0xE0 */
+ 0xD287, 0xD288, 0xD289, 0xD28A, 0xD28B, 0xD28C, 0xD28D, 0xD28E, /* 0xE0 */
+ 0xD28F, 0xD290, 0, 0xD291, 0xD292, 0xD293, 0xD294, 0xD295, /* 0xF0 */
+ 0xD296, 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_CB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD29C, 0xD29D, 0xD29E, 0xD29F, 0xD2A0, 0xD2A1, 0xD2A2, /* 0x40 */
+ 0xD2A3, 0xD2A4, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9, 0xD2AA, /* 0x40 */
+ 0xD2AB, 0xD2AC, 0, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B1, /* 0x50 */
+ 0xD2B2, 0xD2B3, 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0, 0, /* 0x50 */
+ 0, 0xD2B8, 0xD2B9, 0xD2BA, 0xD2BB, 0xD2BC, 0xD2BD, 0xD2BE, /* 0x60 */
+ 0xD2BF, 0xD2C0, 0xD2C1, 0xD2C2, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6, /* 0x60 */
+ 0xD2C7, 0xD2C8, 0, 0xD2C9, 0xD2CA, 0xD2CB, 0xD2CC, 0xD2CD, /* 0x70 */
+ 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, 0, 0, /* 0x70 */
+ 0, 0xD2D4, 0xD2D5, 0xD2D6, 0xD2D7, 0xD2D8, 0xD2D9, 0xD2DA, /* 0x80 */
+ 0xD2DB, 0xD2DC, 0xD2DD, 0xD2DE, 0xD2DF, 0xD2E0, 0xD2E1, 0xD2E2, /* 0x80 */
+ 0xD2E3, 0xD2E4, 0, 0xD2E5, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9, /* 0x90 */
+ 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0, 0, /* 0x90 */
+ 0, 0xD2F0, 0xD2F1, 0xD2F2, 0xD2F3, 0xD2F4, 0xD2F5, 0xD2F6, /* 0xA0 */
+ 0xD2F7, 0xD2F8, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD, 0xD2FE, /* 0xA0 */
+ 0xD2FF, 0xD300, 0, 0xD301, 0xD302, 0xD303, 0xD304, 0xD305, /* 0xB0 */
+ 0xD306, 0xD307, 0xD308, 0xD309, 0xD30A, 0xD30B /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_CC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x314D, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD30C, 0xD30D, 0xD30E, 0xD30F, 0xD310, 0xD311, 0xD312, /* 0x60 */
+ 0xD313, 0xD314, 0xD315, 0xD316, 0xD317, 0xD318, 0xD319, 0xD31A, /* 0x60 */
+ 0xD31B, 0xD31C, 0, 0xD31D, 0xD31E, 0xD31F, 0xD320, 0xD321, /* 0x70 */
+ 0xD322, 0xD323, 0xD324, 0xD325, 0xD326, 0xD327, 0, 0, /* 0x70 */
+ 0, 0xD328, 0xD329, 0xD32A, 0xD32B, 0xD32C, 0xD32D, 0xD32E, /* 0x80 */
+ 0xD32F, 0xD330, 0xD331, 0xD332, 0xD333, 0xD334, 0xD335, 0xD336, /* 0x80 */
+ 0xD337, 0xD338, 0, 0xD339, 0xD33A, 0xD33B, 0xD33C, 0xD33D, /* 0x90 */
+ 0xD33E, 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0, 0, /* 0x90 */
+ 0, 0xD344, 0xD345, 0xD346, 0xD347, 0xD348, 0xD349, 0xD34A, /* 0xA0 */
+ 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350, 0xD351, 0xD352, /* 0xA0 */
+ 0xD353, 0xD354, 0, 0xD355, 0xD356, 0xD357, 0xD358, 0xD359, /* 0xB0 */
+ 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0, 0, /* 0xB0 */
+ 0, 0xD360, 0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, /* 0xC0 */
+ 0xD367, 0xD368, 0xD369, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, /* 0xC0 */
+ 0xD36F, 0xD370, 0, 0xD371, 0xD372, 0xD373, 0xD374, 0xD375, /* 0xD0 */
+ 0xD376, 0xD377, 0xD378, 0xD379, 0xD37A, 0xD37B, 0, 0, /* 0xD0 */
+ 0, 0xD37C, 0xD37D, 0xD37E, 0xD37F, 0xD380, 0xD381, 0xD382, /* 0xE0 */
+ 0xD383, 0xD384, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, /* 0xE0 */
+ 0xD38B, 0xD38C, 0, 0xD38D, 0xD38E, 0xD38F, 0xD390, 0xD391, /* 0xF0 */
+ 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_CD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD398, 0xD399, 0xD39A, 0xD39B, 0xD39C, 0xD39D, 0xD39E, /* 0x40 */
+ 0xD39F, 0xD3A0, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5, 0xD3A6, /* 0x40 */
+ 0xD3A7, 0xD3A8, 0, 0xD3A9, 0xD3AA, 0xD3AB, 0xD3AC, 0xD3AD, /* 0x50 */
+ 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1, 0xD3B2, 0xD3B3, 0, 0, /* 0x50 */
+ 0, 0xD3B4, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B8, 0xD3B9, 0xD3BA, /* 0x60 */
+ 0xD3BB, 0xD3BC, 0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, /* 0x60 */
+ 0xD3C3, 0xD3C4, 0, 0xD3C5, 0xD3C6, 0xD3C7, 0xD3C8, 0xD3C9, /* 0x70 */
+ 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0, 0, /* 0x70 */
+ 0, 0xD3D0, 0xD3D1, 0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6, /* 0x80 */
+ 0xD3D7, 0xD3D8, 0xD3D9, 0xD3DA, 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, /* 0x80 */
+ 0xD3DF, 0xD3E0, 0, 0xD3E1, 0xD3E2, 0xD3E3, 0xD3E4, 0xD3E5, /* 0x90 */
+ 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, 0, 0, /* 0x90 */
+ 0, 0xD3EC, 0xD3ED, 0xD3EE, 0xD3EF, 0xD3F0, 0xD3F1, 0xD3F2, /* 0xA0 */
+ 0xD3F3, 0xD3F4, 0xD3F5, 0xD3F6, 0xD3F7, 0xD3F8, 0xD3F9, 0xD3FA, /* 0xA0 */
+ 0xD3FB, 0xD3FC, 0, 0xD3FD, 0xD3FE, 0xD3FF, 0xD400, 0xD401, /* 0xB0 */
+ 0xD402, 0xD403, 0xD404, 0xD405, 0xD406, 0xD407, 0, 0, /* 0xB0 */
+ 0, 0xD408, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D, 0xD40E, /* 0xC0 */
+ 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415, 0xD416, /* 0xC0 */
+ 0xD417, 0xD418, 0, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41D, /* 0xD0 */
+ 0xD41E, 0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, 0, 0, /* 0xD0 */
+ 0, 0xD424, 0xD425, 0xD426, 0xD427, 0xD428, 0xD429, 0xD42A, /* 0xE0 */
+ 0xD42B, 0xD42C, 0xD42D, 0xD42E, 0xD42F, 0xD430, 0xD431, 0xD432, /* 0xE0 */
+ 0xD433, 0xD434, 0, 0xD435, 0xD436, 0xD437, 0xD438, 0xD439, /* 0xF0 */
+ 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E, 0xD43F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_CE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD440, 0xD441, 0xD442, 0xD443, 0xD444, 0xD445, 0xD446, /* 0x40 */
+ 0xD447, 0xD448, 0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, /* 0x40 */
+ 0xD44F, 0xD450, 0, 0xD451, 0xD452, 0xD453, 0xD454, 0xD455, /* 0x50 */
+ 0xD456, 0xD457, 0xD458, 0xD459, 0xD45A, 0xD45B, 0, 0, /* 0x50 */
+ 0, 0xD45C, 0xD45D, 0xD45E, 0xD45F, 0xD460, 0xD461, 0xD462, /* 0x60 */
+ 0xD463, 0xD464, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, /* 0x60 */
+ 0xD46B, 0xD46C, 0, 0xD46D, 0xD46E, 0xD46F, 0xD470, 0xD471, /* 0x70 */
+ 0xD472, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477, 0, 0, /* 0x70 */
+ 0, 0xD478, 0xD479, 0xD47A, 0xD47B, 0xD47C, 0xD47D, 0xD47E, /* 0x80 */
+ 0xD47F, 0xD480, 0xD481, 0xD482, 0xD483, 0xD484, 0xD485, 0xD486, /* 0x80 */
+ 0xD487, 0xD488, 0, 0xD489, 0xD48A, 0xD48B, 0xD48C, 0xD48D, /* 0x90 */
+ 0xD48E, 0xD48F, 0xD490, 0xD491, 0xD492, 0xD493, 0, 0, /* 0x90 */
+ 0, 0xD494, 0xD495, 0xD496, 0xD497, 0xD498, 0xD499, 0xD49A, /* 0xA0 */
+ 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, 0xD4A0, 0xD4A1, 0xD4A2, /* 0xA0 */
+ 0xD4A3, 0xD4A4, 0, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8, 0xD4A9, /* 0xB0 */
+ 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0, 0, /* 0xB0 */
+ 0, 0xD4B0, 0xD4B1, 0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6, /* 0xC0 */
+ 0xD4B7, 0xD4B8, 0xD4B9, 0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, /* 0xC0 */
+ 0xD4BF, 0xD4C0, 0, 0xD4C1, 0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5, /* 0xD0 */
+ 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9, 0xD4CA, 0xD4CB, 0, 0, /* 0xD0 */
+ 0, 0xD4CC, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D0, 0xD4D1, 0xD4D2, /* 0xE0 */
+ 0xD4D3, 0xD4D4, 0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, /* 0xE0 */
+ 0xD4DB, 0xD4DC, 0, 0xD4DD, 0xD4DE, 0xD4DF, 0xD4E0, 0xD4E1, /* 0xF0 */
+ 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6, 0xD4E7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_CF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD4E8, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4EC, 0xD4ED, 0xD4EE, /* 0x40 */
+ 0xD4EF, 0xD4F0, 0xD4F1, 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, /* 0x40 */
+ 0xD4F7, 0xD4F8, 0, 0xD4F9, 0xD4FA, 0xD4FB, 0xD4FC, 0xD4FD, /* 0x50 */
+ 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0, 0, /* 0x50 */
+ 0, 0xD504, 0xD505, 0xD506, 0xD507, 0xD508, 0xD509, 0xD50A, /* 0x60 */
+ 0xD50B, 0xD50C, 0xD50D, 0xD50E, 0xD50F, 0xD510, 0xD511, 0xD512, /* 0x60 */
+ 0xD513, 0xD514, 0, 0xD515, 0xD516, 0xD517, 0xD518, 0xD519, /* 0x70 */
+ 0xD51A, 0xD51B, 0xD51C, 0xD51D, 0xD51E, 0xD51F, 0, 0, /* 0x70 */
+ 0, 0xD520, 0xD521, 0xD522, 0xD523, 0xD524, 0xD525, 0xD526, /* 0x80 */
+ 0xD527, 0xD528, 0xD529, 0xD52A, 0xD52B, 0xD52C, 0xD52D, 0xD52E, /* 0x80 */
+ 0xD52F, 0xD530, 0, 0xD531, 0xD532, 0xD533, 0xD534, 0xD535, /* 0x90 */
+ 0xD536, 0xD537, 0xD538, 0xD539, 0xD53A, 0xD53B, 0, 0, /* 0x90 */
+ 0, 0xD53C, 0xD53D, 0xD53E, 0xD53F, 0xD540, 0xD541, 0xD542, /* 0xA0 */
+ 0xD543, 0xD544, 0xD545, 0xD546, 0xD547, 0xD548, 0xD549, 0xD54A, /* 0xA0 */
+ 0xD54B, 0xD54C, 0, 0xD54D, 0xD54E, 0xD54F, 0xD550, 0xD551, /* 0xB0 */
+ 0xD552, 0xD553, 0xD554, 0xD555, 0xD556, 0xD557 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_D0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x314E, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD558, 0xD559, 0xD55A, 0xD55B, 0xD55C, 0xD55D, 0xD55E, /* 0x60 */
+ 0xD55F, 0xD560, 0xD561, 0xD562, 0xD563, 0xD564, 0xD565, 0xD566, /* 0x60 */
+ 0xD567, 0xD568, 0, 0xD569, 0xD56A, 0xD56B, 0xD56C, 0xD56D, /* 0x70 */
+ 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573, 0, 0, /* 0x70 */
+ 0, 0xD574, 0xD575, 0xD576, 0xD577, 0xD578, 0xD579, 0xD57A, /* 0x80 */
+ 0xD57B, 0xD57C, 0xD57D, 0xD57E, 0xD57F, 0xD580, 0xD581, 0xD582, /* 0x80 */
+ 0xD583, 0xD584, 0, 0xD585, 0xD586, 0xD587, 0xD588, 0xD589, /* 0x90 */
+ 0xD58A, 0xD58B, 0xD58C, 0xD58D, 0xD58E, 0xD58F, 0, 0, /* 0x90 */
+ 0, 0xD590, 0xD591, 0xD592, 0xD593, 0xD594, 0xD595, 0xD596, /* 0xA0 */
+ 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, 0xD59D, 0xD59E, /* 0xA0 */
+ 0xD59F, 0xD5A0, 0, 0xD5A1, 0xD5A2, 0xD5A3, 0xD5A4, 0xD5A5, /* 0xB0 */
+ 0xD5A6, 0xD5A7, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0, 0, /* 0xB0 */
+ 0, 0xD5AC, 0xD5AD, 0xD5AE, 0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, /* 0xC0 */
+ 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6, 0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, /* 0xC0 */
+ 0xD5BB, 0xD5BC, 0, 0xD5BD, 0xD5BE, 0xD5BF, 0xD5C0, 0xD5C1, /* 0xD0 */
+ 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6, 0xD5C7, 0, 0, /* 0xD0 */
+ 0, 0xD5C8, 0xD5C9, 0xD5CA, 0xD5CB, 0xD5CC, 0xD5CD, 0xD5CE, /* 0xE0 */
+ 0xD5CF, 0xD5D0, 0xD5D1, 0xD5D2, 0xD5D3, 0xD5D4, 0xD5D5, 0xD5D6, /* 0xE0 */
+ 0xD5D7, 0xD5D8, 0, 0xD5D9, 0xD5DA, 0xD5DB, 0xD5DC, 0xD5DD, /* 0xF0 */
+ 0xD5DE, 0xD5DF, 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_D1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD5E4, 0xD5E5, 0xD5E6, 0xD5E7, 0xD5E8, 0xD5E9, 0xD5EA, /* 0x40 */
+ 0xD5EB, 0xD5EC, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, /* 0x40 */
+ 0xD5F3, 0xD5F4, 0, 0xD5F5, 0xD5F6, 0xD5F7, 0xD5F8, 0xD5F9, /* 0x50 */
+ 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF, 0, 0, /* 0x50 */
+ 0, 0xD600, 0xD601, 0xD602, 0xD603, 0xD604, 0xD605, 0xD606, /* 0x60 */
+ 0xD607, 0xD608, 0xD609, 0xD60A, 0xD60B, 0xD60C, 0xD60D, 0xD60E, /* 0x60 */
+ 0xD60F, 0xD610, 0, 0xD611, 0xD612, 0xD613, 0xD614, 0xD615, /* 0x70 */
+ 0xD616, 0xD617, 0xD618, 0xD619, 0xD61A, 0xD61B, 0, 0, /* 0x70 */
+ 0, 0xD61C, 0xD61D, 0xD61E, 0xD61F, 0xD620, 0xD621, 0xD622, /* 0x80 */
+ 0xD623, 0xD624, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, /* 0x80 */
+ 0xD62B, 0xD62C, 0, 0xD62D, 0xD62E, 0xD62F, 0xD630, 0xD631, /* 0x90 */
+ 0xD632, 0xD633, 0xD634, 0xD635, 0xD636, 0xD637, 0, 0, /* 0x90 */
+ 0, 0xD638, 0xD639, 0xD63A, 0xD63B, 0xD63C, 0xD63D, 0xD63E, /* 0xA0 */
+ 0xD63F, 0xD640, 0xD641, 0xD642, 0xD643, 0xD644, 0xD645, 0xD646, /* 0xA0 */
+ 0xD647, 0xD648, 0, 0xD649, 0xD64A, 0xD64B, 0xD64C, 0xD64D, /* 0xB0 */
+ 0xD64E, 0xD64F, 0xD650, 0xD651, 0xD652, 0xD653, 0, 0, /* 0xB0 */
+ 0, 0xD654, 0xD655, 0xD656, 0xD657, 0xD658, 0xD659, 0xD65A, /* 0xC0 */
+ 0xD65B, 0xD65C, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662, /* 0xC0 */
+ 0xD663, 0xD664, 0, 0xD665, 0xD666, 0xD667, 0xD668, 0xD669, /* 0xD0 */
+ 0xD66A, 0xD66B, 0xD66C, 0xD66D, 0xD66E, 0xD66F, 0, 0, /* 0xD0 */
+ 0, 0xD670, 0xD671, 0xD672, 0xD673, 0xD674, 0xD675, 0xD676, /* 0xE0 */
+ 0xD677, 0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E, /* 0xE0 */
+ 0xD67F, 0xD680, 0, 0xD681, 0xD682, 0xD683, 0xD684, 0xD685, /* 0xF0 */
+ 0xD686, 0xD687, 0xD688, 0xD689, 0xD68A, 0xD68B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_D2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD68C, 0xD68D, 0xD68E, 0xD68F, 0xD690, 0xD691, 0xD692, /* 0x40 */
+ 0xD693, 0xD694, 0xD695, 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, /* 0x40 */
+ 0xD69B, 0xD69C, 0, 0xD69D, 0xD69E, 0xD69F, 0xD6A0, 0xD6A1, /* 0x50 */
+ 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0, 0, /* 0x50 */
+ 0, 0xD6A8, 0xD6A9, 0xD6AA, 0xD6AB, 0xD6AC, 0xD6AD, 0xD6AE, /* 0x60 */
+ 0xD6AF, 0xD6B0, 0xD6B1, 0xD6B2, 0xD6B3, 0xD6B4, 0xD6B5, 0xD6B6, /* 0x60 */
+ 0xD6B7, 0xD6B8, 0, 0xD6B9, 0xD6BA, 0xD6BB, 0xD6BC, 0xD6BD, /* 0x70 */
+ 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0, 0, /* 0x70 */
+ 0, 0xD6C4, 0xD6C5, 0xD6C6, 0xD6C7, 0xD6C8, 0xD6C9, 0xD6CA, /* 0x80 */
+ 0xD6CB, 0xD6CC, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D1, 0xD6D2, /* 0x80 */
+ 0xD6D3, 0xD6D4, 0, 0xD6D5, 0xD6D6, 0xD6D7, 0xD6D8, 0xD6D9, /* 0x90 */
+ 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD, 0xD6DE, 0xD6DF, 0, 0, /* 0x90 */
+ 0, 0xD6E0, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E4, 0xD6E5, 0xD6E6, /* 0xA0 */
+ 0xD6E7, 0xD6E8, 0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE, /* 0xA0 */
+ 0xD6EF, 0xD6F0, 0, 0xD6F1, 0xD6F2, 0xD6F3, 0xD6F4, 0xD6F5, /* 0xB0 */
+ 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA, 0xD6FB, 0, 0, /* 0xB0 */
+ 0, 0xD6FC, 0xD6FD, 0xD6FE, 0xD6FF, 0xD700, 0xD701, 0xD702, /* 0xC0 */
+ 0xD703, 0xD704, 0xD705, 0xD706, 0xD707, 0xD708, 0xD709, 0xD70A, /* 0xC0 */
+ 0xD70B, 0xD70C, 0, 0xD70D, 0xD70E, 0xD70F, 0xD710, 0xD711, /* 0xD0 */
+ 0xD712, 0xD713, 0xD714, 0xD715, 0xD716, 0xD717, 0, 0, /* 0xD0 */
+ 0, 0xD718, 0xD719, 0xD71A, 0xD71B, 0xD71C, 0xD71D, 0xD71E, /* 0xE0 */
+ 0xD71F, 0xD720, 0xD721, 0xD722, 0xD723, 0xD724, 0xD725, 0xD726, /* 0xE0 */
+ 0xD727, 0xD728, 0, 0xD729, 0xD72A, 0xD72B, 0xD72C, 0xD72D, /* 0xF0 */
+ 0xD72E, 0xD72F, 0xD730, 0xD731, 0xD732, 0xD733 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_D3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD734, 0xD735, 0xD736, 0xD737, 0xD738, 0xD739, 0xD73A, /* 0x40 */
+ 0xD73B, 0xD73C, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, /* 0x40 */
+ 0xD743, 0xD744, 0, 0xD745, 0xD746, 0xD747, 0xD748, 0xD749, /* 0x50 */
+ 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F, 0, 0, /* 0x50 */
+ 0, 0xD750, 0xD751, 0xD752, 0xD753, 0xD754, 0xD755, 0xD756, /* 0x60 */
+ 0xD757, 0xD758, 0xD759, 0xD75A, 0xD75B, 0xD75C, 0xD75D, 0xD75E, /* 0x60 */
+ 0xD75F, 0xD760, 0, 0xD761, 0xD762, 0xD763, 0xD764, 0xD765, /* 0x70 */
+ 0xD766, 0xD767, 0xD768, 0xD769, 0xD76A, 0xD76B, 0, 0, /* 0x70 */
+ 0, 0xD76C, 0xD76D, 0xD76E, 0xD76F, 0xD770, 0xD771, 0xD772, /* 0x80 */
+ 0xD773, 0xD774, 0xD775, 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, /* 0x80 */
+ 0xD77B, 0xD77C, 0, 0xD77D, 0xD77E, 0xD77F, 0xD780, 0xD781, /* 0x90 */
+ 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0, 0, /* 0x90 */
+ 0, 0xD788, 0xD789, 0xD78A, 0xD78B, 0xD78C, 0xD78D, 0xD78E, /* 0xA0 */
+ 0xD78F, 0xD790, 0xD791, 0xD792, 0xD793, 0xD794, 0xD795, 0xD796, /* 0xA0 */
+ 0xD797, 0xD798, 0, 0xD799, 0xD79A, 0xD79B, 0xD79C, 0xD79D, /* 0xB0 */
+ 0xD79E, 0xD79F, 0xD7A0, 0xD7A1, 0xD7A2, 0xD7A3 /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_D9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8, /* 0x30 */
+ 0x3003, 0x00AD, 0x2015, 0x2225, 0xFF3C, 0x223C, 0x2018, 0x2019, /* 0x30 */
+ 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, /* 0x40 */
+ 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0x00B1, 0x00D7, /* 0x40 */
+ 0x00F7, 0x2260, 0x2264, 0x2265, 0x221E, 0x2234, 0x00B0, 0x2032, /* 0x50 */
+ 0x2033, 0x2103, 0x212B, 0xFFE0, 0xFFE1, 0xFFE5, 0x2642, 0x2640, /* 0x50 */
+ 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00A7, /* 0x60 */
+ 0x203B, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, /* 0x60 */
+ 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x2192, 0x2190, /* 0x70 */
+ 0x2191, 0x2193, 0x2194, 0x3013, 0x226A, 0x226B, 0x221A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C, 0x2208, 0x220B, /* 0x90 */
+ 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, /* 0x90 */
+ 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4, 0xFF5E, 0x02C7, /* 0xA0 */
+ 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB, 0x00A1, 0x00BF, /* 0xA0 */
+ 0x02D0, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109, 0x2030, 0x25C1, /* 0xB0 */
+ 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, /* 0xB0 */
+ 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1, 0x2592, 0x25A4, /* 0xC0 */
+ 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E, /* 0xC0 */
+ 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, /* 0xD0 */
+ 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C, 0x327F, 0x321C, /* 0xD0 */
+ 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* Add some additional characters, which are different defined on Solaris */
+/* DAA1-DAD3 --> 3131-3163 */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_DA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, /* 0x30 */
+ 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, /* 0x30 */
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, /* 0x40 */
+ 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, /* 0x40 */
+ 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, /* 0x50 */
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, /* 0x50 */
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, /* 0x60 */
+ 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F, /* 0x60 */
+ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, /* 0x70 */
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, /* 0x90 */
+ 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, /* 0x90 */
+ 0xFFE3, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, /* 0xA0 */
+ 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, /* 0xA0 */
+ 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, /* 0xB0 */
+ 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, /* 0xB0 */
+ 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, /* 0xC0 */
+ 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, /* 0xC0 */
+ 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, /* 0xD0 */
+ 0x3168, 0x3169, 0x316A, 0x316B, 0x316C, 0x316D, 0x316E, 0x316F, /* 0xD0 */
+ 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, /* 0xE0 */
+ 0x3178, 0x3179, 0x317A, 0x317B, 0x317C, 0x317D, 0x317E, 0x317F, /* 0xE0 */
+ 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, /* 0xF0 */
+ 0x3188, 0x3189, 0x318A, 0x318B, 0x318C, 0x318D, 0x318E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_DB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, /* 0x30 */
+ 0x2177, 0x2178, 0x2179, 0, 0, 0, 0, 0, /* 0x30 */
+ 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, /* 0x40 */
+ 0x2168, 0x2169, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0x50 */
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, /* 0x50 */
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, /* 0x60 */
+ 0x03A9, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, /* 0x70 */
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, /* 0x90 */
+ 0x03C7, 0x03C8, 0x03C9, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, /* 0xA0 */
+ 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, /* 0xA0 */
+ 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, /* 0xB0 */
+ 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, /* 0xB0 */
+ 0x2542, 0x2512, 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, /* 0xC0 */
+ 0x250D, 0x251E, 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, /* 0xC0 */
+ 0x252A, 0x252D, 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, /* 0xD0 */
+ 0x253A, 0x253D, 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, /* 0xD0 */
+ 0x2546, 0x2547, 0x2548, 0x2549, 0x254A /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_DC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33C4, 0x33A3, /* 0x30 */
+ 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B, 0x339C, 0x339D, /* 0x30 */
+ 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA, 0x338D, 0x338E, /* 0x40 */
+ 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7, 0x33A8, 0x33B0, /* 0x40 */
+ 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6, 0x33B7, 0x33B8, /* 0x50 */
+ 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33BA, 0x33BB, /* 0x50 */
+ 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391, 0x3392, 0x3393, /* 0x60 */
+ 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B, 0x338C, 0x33D6, /* 0x60 */
+ 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9, 0x33AA, 0x33AB, /* 0x70 */
+ 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9, 0x33DC, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x33C6, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x00C6, 0x00D0, 0x00AA, 0x0126, 0, 0x0132, 0, /* 0xA0 */
+ 0x013F, 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, /* 0xA0 */
+ 0, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, /* 0xB0 */
+ 0x3267, 0x3268, 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, /* 0xB0 */
+ 0x326F, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, /* 0xC0 */
+ 0x3277, 0x3278, 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, /* 0xC0 */
+ 0x24D3, 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, /* 0xD0 */
+ 0x24DB, 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, /* 0xD0 */
+ 0x24E3, 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, /* 0xE0 */
+ 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, /* 0xE0 */
+ 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153, /* 0xF0 */
+ 0x2154, 0x00BC, 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_DD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138, /* 0x30 */
+ 0x0140, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x0167, 0x014B, /* 0x30 */
+ 0x0149, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, /* 0x40 */
+ 0x3207, 0x3208, 0x3209, 0x320A, 0x320B, 0x320C, 0x320D, 0x320E, /* 0x40 */
+ 0x320F, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, /* 0x50 */
+ 0x3217, 0x3218, 0x3219, 0x321A, 0x321B, 0x249C, 0x249D, 0x249E, /* 0x50 */
+ 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3, 0x24A4, 0x24A5, 0x24A6, /* 0x60 */
+ 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB, 0x24AC, 0x24AD, 0x24AE, /* 0x60 */
+ 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5, 0x2474, /* 0x70 */
+ 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, /* 0x90 */
+ 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081, 0x2082, 0x2083, /* 0x90 */
+ 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, /* 0xA0 */
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, /* 0xA0 */
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, /* 0xB0 */
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, /* 0xB0 */
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, /* 0xC0 */
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, /* 0xC0 */
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, /* 0xD0 */
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, /* 0xD0 */
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, /* 0xE0 */
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, /* 0xE0 */
+ 0x3090, 0x3091, 0x3092, 0x3093 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_DE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, /* 0x30 */
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, /* 0x30 */
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, /* 0x40 */
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, /* 0x40 */
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, /* 0x50 */
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, /* 0x50 */
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, /* 0x60 */
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, /* 0x60 */
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, /* 0x70 */
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, /* 0x90 */
+ 0x30F6, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, /* 0xA0 */
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, /* 0xA0 */
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, /* 0xB0 */
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, /* 0xB0 */
+ 0x042E, 0x042F, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, /* 0xD0 */
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, /* 0xD0 */
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, /* 0xE0 */
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, /* 0xE0 */
+ 0x044E, 0x044F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F3D, 0x4F73, 0x5047, 0x50F9, 0x52A0, 0x53EF, 0x5475, /* 0x30 */
+ 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687, 0x67B6, 0x67B7, 0x67EF, /* 0x30 */
+ 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB, 0x8304, 0x8857, 0x8888, /* 0x40 */
+ 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6, 0x99D5, 0x523B, 0x5374, /* 0x40 */
+ 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF, 0x811A, 0x89BA, 0x89D2, /* 0x50 */
+ 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978, 0x59E6, 0x5E72, 0x5E79, /* 0x50 */
+ 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F, 0x6F97, 0x764E, 0x770B, /* 0x60 */
+ 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D, 0x826E, 0x8271, 0x8AEB, /* 0x60 */
+ 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34, 0x78A3, 0x7AED, 0x845B, /* 0x70 */
+ 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E, 0x582A, 0x5D4C, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44, 0x6E1B, /* 0x90 */
+ 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451, 0x9452, /* 0x90 */
+ 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598, 0x525B, /* 0xA0 */
+ 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A, 0x6177, /* 0xA0 */
+ 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C, 0x8154, /* 0xB0 */
+ 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47, 0x4ECB, /* 0xB0 */
+ 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168, 0x6539, /* 0xC0 */
+ 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5, 0x84CB, /* 0xC0 */
+ 0xF900, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0xF901, 0x7CB3, /* 0xD0 */
+ 0x7FB9, 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, /* 0xD0 */
+ 0x64DA, 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0xF902, /* 0xE0 */
+ 0x907D, 0x9245, 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, /* 0xE0 */
+ 0x6106, 0x6957, 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, /* 0xF0 */
+ 0x5091, 0x6770, 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x77BC, 0x9210, 0x9ED4, 0x52AB, 0x602F, 0x8FF2, 0x5048, /* 0x30 */
+ 0x61A9, 0x63ED, 0x64CA, 0x683C, 0x6A84, 0x6FC0, 0x8188, 0x89A1, /* 0x30 */
+ 0x9694, 0x5805, 0x727D, 0x72AC, 0x7504, 0x7D79, 0x7E6D, 0x80A9, /* 0x40 */
+ 0x898B, 0x8B74, 0x9063, 0x9D51, 0x6289, 0x6C7A, 0x6F54, 0x7D50, /* 0x40 */
+ 0x7F3A, 0x8A23, 0x517C, 0x614A, 0x7B9D, 0x8B19, 0x9257, 0x938C, /* 0x50 */
+ 0x4EAC, 0x4FD3, 0x501E, 0x50BE, 0x5106, 0x52C1, 0x52CD, 0x537F, /* 0x50 */
+ 0x5770, 0x5883, 0x5E9A, 0x5F91, 0x6176, 0x61AC, 0x64CE, 0x656C, /* 0x60 */
+ 0x666F, 0x66BB, 0x66F4, 0x6897, 0x6D87, 0x7085, 0x70F1, 0x749F, /* 0x60 */
+ 0x74A5, 0x74CA, 0x75D9, 0x786C, 0x78EC, 0x7ADF, 0x7AF6, 0x7D45, /* 0x70 */
+ 0x7D93, 0x8015, 0x803F, 0x811B, 0x8396, 0x8B66, 0x8F15, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A, 0x9BE8, 0x4FC2, /* 0x90 */
+ 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8, 0x6212, 0x6842, /* 0x90 */
+ 0x68B0, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE, 0x7A3D, 0x7CFB, /* 0xA0 */
+ 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E, 0x9DC4, 0x53E4, /* 0xA0 */
+ 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64, 0x5C3B, 0x5EAB, /* 0xB0 */
+ 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF, 0x69C1, 0x6CBD, /* 0xB0 */
+ 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003, 0x80A1, 0x818F, /* 0xC0 */
+ 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4, 0x8AA5, 0xF903, /* 0xC0 */
+ 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED, 0x659B, /* 0xD0 */
+ 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764, 0x5D11, /* 0xD0 */
+ 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4, 0x6C68, /* 0xE0 */
+ 0xF904, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5, /* 0xE0 */
+ 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3, /* 0xF0 */
+ 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x79D1, 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, /* 0x30 */
+ 0x9846, 0x5ED3, 0x69E8, 0x85FF, 0x90ED, 0xF905, 0x51A0, 0x5B98, /* 0x30 */
+ 0x5BEC, 0x6163, 0x68FA, 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, /* 0x40 */
+ 0x7F50, 0x83C5, 0x89C0, 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, /* 0x40 */
+ 0x62EC, 0x9002, 0x4F8A, 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, /* 0x50 */
+ 0x6D38, 0x709A, 0x72C2, 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, /* 0x50 */
+ 0x639B, 0x7F6B, 0x4E56, 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, /* 0x60 */
+ 0x62D0, 0x69D0, 0x9B41, 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, /* 0x60 */
+ 0x50D1, 0x54AC, 0x55AC, 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, /* 0x70 */
+ 0x6821, 0x6A4B, 0x72E1, 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x81A0, 0x854E, 0x86DF, 0x8F03, 0x8F4E, 0x90CA, 0x9903, /* 0x90 */
+ 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D, 0x4EC7, 0x4FF1, 0x5177, /* 0x90 */
+ 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E, 0x5614, 0x5775, 0x57A2, /* 0xA0 */
+ 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8, 0x6551, 0x67B8, 0x67E9, /* 0xA0 */
+ 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42, 0x6E9D, 0x7078, 0x72D7, /* 0xB0 */
+ 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76, 0x7D7F, 0x8009, 0x81FC, /* 0xB0 */
+ 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33, 0x8CFC, 0x8EC0, 0x9011, /* 0xC0 */
+ 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45, 0x9CE9, 0x9DD7, 0x9F9C, /* 0xC0 */
+ 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB, 0x9EB4, 0x541B, 0x7A98, /* 0xD0 */
+ 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800, 0x5C48, 0x6398, 0x7A9F, /* 0xD0 */
+ 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E, 0x8EAC, 0x5026, 0x5238, /* 0xE0 */
+ 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372, 0x6B0A, 0x6DC3, 0x7737, /* 0xE0 */
+ 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5, 0x673A, 0x6AC3, 0x6F70, /* 0xF0 */
+ 0x8A6D, 0x8ECC, 0x994B, 0xF906, 0x6677, 0x6B78, 0x8CB4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9B3C, 0xF907, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, /* 0x30 */
+ 0x73EA, 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, /* 0x30 */
+ 0x9035, 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, /* 0x40 */
+ 0xF908, 0x6A58, 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, /* 0x40 */
+ 0x9699, 0x50C5, 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, /* 0x50 */
+ 0x747E, 0x7B4B, 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, /* 0x50 */
+ 0xF909, 0x4ECA, 0x5997, 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, /* 0x60 */
+ 0x79BD, 0x82A9, 0x887E, 0x887F, 0x895F, 0xF90A, 0x9326, 0x4F0B, /* 0x60 */
+ 0x53CA, 0x6025, 0x6271, 0x6C72, 0x7D1A, 0x7D66, 0x4E98, 0x5162, /* 0x70 */
+ 0x77DC, 0x80AF, 0x4F01, 0x4F0E, 0x5176, 0x5180, 0x55DC, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914, 0x5947, 0x5993, /* 0x90 */
+ 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC, 0x6280, 0x65D7, /* 0x90 */
+ 0x65E3, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4, 0x6A5F, 0x6B3A, /* 0xA0 */
+ 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426, 0x742A, 0x7482, /* 0xA0 */
+ 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941, 0x7947, 0x7948, /* 0xB0 */
+ 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006, 0x802D, 0x808C, /* 0xB0 */
+ 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324, 0x98E2, 0x9951, /* 0xC0 */
+ 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76, 0x5409, 0x62EE, /* 0xC0 */
+ 0x6854, 0x91D1, 0x55AB, 0x513A, 0xF90B, 0xF90C, 0x5A1C, 0x61E6, /* 0xD0 */
+ 0xF90D, 0x62CF, 0x62FF, 0xF90E, 0xF90F, 0xF910, 0xF911, 0xF912, /* 0xD0 */
+ 0xF913, 0x90A3, 0xF914, 0xF915, 0xF916, 0xF917, 0xF918, 0x8AFE, /* 0xE0 */
+ 0xF919, 0xF91A, 0xF91B, 0xF91C, 0x6696, 0xF91D, 0x7156, 0xF91E, /* 0xE0 */
+ 0xF91F, 0x96E3, 0xF920, 0x634F, 0x637A, 0x5357, 0xF921, 0x678F, /* 0xF0 */
+ 0x6960, 0x6E73, 0xF922, 0x7537, 0xF923, 0xF924, 0xF925 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7D0D, 0xF926, 0xF927, 0x8872, 0x56CA, 0x5A18, 0xF928, /* 0x30 */
+ 0xF929, 0xF92A, 0xF92B, 0xF92C, 0x4E43, 0xF92D, 0x5167, 0x5948, /* 0x30 */
+ 0x67F0, 0x8010, 0xF92E, 0x5973, 0x5E74, 0x649A, 0x79CA, 0x5FF5, /* 0x40 */
+ 0x606C, 0x62C8, 0x637B, 0x5BE7, 0x5BD7, 0x52AA, 0xF92F, 0x5974, /* 0x40 */
+ 0x5F29, 0x6012, 0xF930, 0xF931, 0xF932, 0x7459, 0xF933, 0xF934, /* 0x50 */
+ 0xF935, 0xF936, 0xF937, 0xF938, 0x99D1, 0xF939, 0xF93A, 0xF93B, /* 0x50 */
+ 0xF93C, 0xF93D, 0xF93E, 0xF93F, 0xF940, 0xF941, 0xF942, 0xF943, /* 0x60 */
+ 0x6FC3, 0xF944, 0xF945, 0x81BF, 0x8FB2, 0x60F1, 0xF946, 0xF947, /* 0x60 */
+ 0x8166, 0xF948, 0xF949, 0x5C3F, 0xF94A, 0xF94B, 0xF94C, 0xF94D, /* 0x70 */
+ 0xF94E, 0xF94F, 0xF950, 0xF951, 0x5AE9, 0x8A25, 0x677B, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x7D10, 0xF952, 0xF953, 0xF954, 0xF955, 0xF956, 0xF957, /* 0x90 */
+ 0x80FD, 0xF958, 0xF959, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, /* 0x90 */
+ 0x8336, 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, /* 0xA0 */
+ 0x65B7, 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, /* 0xA0 */
+ 0x7DDE, 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, /* 0xB0 */
+ 0x75B8, 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, /* 0xB0 */
+ 0x6E5B, 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, /* 0xC0 */
+ 0x8AC7, 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, /* 0xC0 */
+ 0x5510, 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, /* 0xD0 */
+ 0x7CD6, 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, /* 0xD0 */
+ 0x5CB1, 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, /* 0xE0 */
+ 0x8CB8, 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, /* 0xE0 */
+ 0x5230, 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, /* 0xF0 */
+ 0x5EA6, 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x68F9, 0x6AC2, 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, /* 0x30 */
+ 0x76DC, 0x7779, 0x79B1, 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, /* 0x30 */
+ 0x8E48, 0x9003, 0x9014, 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, /* 0x40 */
+ 0x6BD2, 0x7006, 0x7258, 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, /* 0x40 */
+ 0x7E9B, 0x8B80, 0x58A9, 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, /* 0x50 */
+ 0x711E, 0x71C9, 0x8C5A, 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, /* 0x50 */
+ 0x51CD, 0x52D5, 0x540C, 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, /* 0x60 */
+ 0x6F7C, 0x75BC, 0x77B3, 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, /* 0x60 */
+ 0x6597, 0x675C, 0x6793, 0x75D8, 0x7AC7, 0x8373, 0xF95A, 0x8C46, /* 0x70 */
+ 0x9017, 0x982D, 0x5C6F, 0x81C0, 0x829A, 0x9041, 0x906F, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8, 0x767B, 0x7B49, /* 0x90 */
+ 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6, 0xF95B, 0x7669, /* 0x90 */
+ 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0xF95C, 0x6D1B, 0x70D9, /* 0xA0 */
+ 0x73DE, 0x7D61, 0x843D, 0xF95D, 0x916A, 0x99F1, 0xF95E, 0x4E82, /* 0xA0 */
+ 0x5375, 0x6B04, 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, /* 0xB0 */
+ 0x8FA3, 0x5D50, 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, /* 0xB0 */
+ 0x85CD, 0x8964, 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, /* 0xC0 */
+ 0x6D6A, 0x72FC, 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, /* 0xC0 */
+ 0x5FA0, 0x840A, 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, /* 0xD0 */
+ 0x51C9, 0x6881, 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, /* 0xD0 */
+ 0x8F1B, 0x91CF, 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, /* 0xE0 */
+ 0x623E, 0x65C5, 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, /* 0xE0 */
+ 0x9A62, 0x9A6A, 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, /* 0xF0 */
+ 0x792B, 0x8F62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7149, 0x7489, 0x7DF4, 0x806F, 0x84EE, 0x8F26, 0x9023, /* 0x30 */
+ 0x934A, 0x51BD, 0x5217, 0x52A3, 0x6D0C, 0x70C8, 0x88C2, 0x5EC9, /* 0x30 */
+ 0x6582, 0x6BAE, 0x6FC2, 0x7C3E, 0x7375, 0x4EE4, 0x4F36, 0x56F9, /* 0x40 */
+ 0xF95F, 0x5CBA, 0x5DBA, 0x601C, 0x73B2, 0x7B2D, 0x7F9A, 0x7FCE, /* 0x40 */
+ 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748, 0x9818, 0x9F61, 0x4F8B, /* 0x50 */
+ 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE, 0xF960, 0x6488, 0x64C4, /* 0x50 */
+ 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, /* 0x60 */
+ 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75, 0x788C, 0x797F, /* 0x60 */
+ 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6, 0x58DF, 0x5F04, /* 0x70 */
+ 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121, 0x7028, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86, /* 0x90 */
+ 0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A, /* 0x90 */
+ 0x84FC, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13, /* 0xA0 */
+ 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4, /* 0xA0 */
+ 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F, /* 0xB0 */
+ 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D, /* 0xB0 */
+ 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A, /* 0xC0 */
+ 0x5F8B, 0x6144, 0x6817, 0xF961, 0x9686, 0x52D2, 0x808B, 0x51DC, /* 0xC0 */
+ 0x51CC, 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, /* 0xD0 */
+ 0x5398, 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, /* 0xD0 */
+ 0x7281, 0x72F8, 0x7406, 0x7483, 0xF962, 0x75E2, 0x7C6C, 0x7F79, /* 0xE0 */
+ 0x7FB8, 0x8389, 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, /* 0xE0 */
+ 0x541D, 0x6F7E, 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, /* 0xF0 */
+ 0x9E9F, 0x6797, 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7ACB, 0x7B20, 0x7C92, 0x6469, 0x746A, 0x75F2, 0x78BC, /* 0x30 */
+ 0x78E8, 0x99AC, 0x9B54, 0x9EBB, 0x5BDE, 0x5E55, 0x6F20, 0x819C, /* 0x30 */
+ 0x83AB, 0x9088, 0x4E07, 0x534D, 0x5A29, 0x5DD2, 0x5F4E, 0x6162, /* 0x40 */
+ 0x633D, 0x6669, 0x66FC, 0x6EFF, 0x6F2B, 0x7063, 0x779E, 0x842C, /* 0x40 */
+ 0x8513, 0x883B, 0x8F13, 0x9945, 0x9C3B, 0x551C, 0x62B9, 0x672B, /* 0x50 */
+ 0x6CAB, 0x8309, 0x896A, 0x977A, 0x4EA1, 0x5984, 0x5FD8, 0x5FD9, /* 0x50 */
+ 0x671B, 0x7DB2, 0x7F54, 0x8292, 0x832B, 0x83BD, 0x8F1E, 0x9099, /* 0x60 */
+ 0x57CB, 0x59B9, 0x5A92, 0x5BD0, 0x6627, 0x679A, 0x6885, 0x6BCF, /* 0x60 */
+ 0x7164, 0x7F75, 0x8CB7, 0x8CE3, 0x9081, 0x9B45, 0x8108, 0x8C8A, /* 0x70 */
+ 0x964C, 0x9A40, 0x9EA5, 0x5B5F, 0x6C13, 0x731B, 0x76F2, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D, 0x5195, 0x52C9, /* 0x90 */
+ 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC, 0x9762, 0x9EB5, /* 0x90 */
+ 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E, 0x669D, 0x6927, /* 0xA0 */
+ 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F, 0x9169, 0x9298, /* 0xA0 */
+ 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6, 0x5E3D, 0x6155, /* 0xB0 */
+ 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD, 0x6BDB, 0x725F, /* 0xB0 */
+ 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC, 0x8305, 0x8B00, /* 0xC0 */
+ 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE, 0x7766, 0x7A46, /* 0xC0 */
+ 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499, 0x536F, 0x5893, /* 0xD0 */
+ 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A, 0x732B, 0x7AD7, /* 0xD0 */
+ 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB, 0x620A, 0x62C7, /* 0xE0 */
+ 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121, 0x73F7, 0x755D, /* 0xE0 */
+ 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF, 0x9727, 0x9D61, /* 0xF0 */
+ 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F, 0x6587 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF, /* 0x30 */
+ 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C, /* 0x30 */
+ 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73, /* 0x40 */
+ 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6, /* 0x40 */
+ 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F, /* 0x50 */
+ 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A, /* 0x50 */
+ 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E, /* 0x60 */
+ 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9, /* 0x60 */
+ 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500, /* 0x70 */
+ 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x76E4, 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, /* 0x90 */
+ 0x87E0, 0x8FD4, 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, /* 0x90 */
+ 0x6F51, 0x767C, 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, /* 0xA0 */
+ 0x508D, 0x574A, 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, /* 0xA0 */
+ 0x65B9, 0x65C1, 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, /* 0xB0 */
+ 0x80AA, 0x8180, 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, /* 0xB0 */
+ 0x90A6, 0x9632, 0x9F90, 0x500D, 0x4FF3, 0xF963, 0x57F9, 0x5F98, /* 0xC0 */
+ 0x62DC, 0x6392, 0x676F, 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, /* 0xC0 */
+ 0x88F4, 0x88F5, 0x8919, 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, /* 0xD0 */
+ 0x4F70, 0x5E1B, 0x67CF, 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, /* 0xD0 */
+ 0x6A0A, 0x7169, 0x71D4, 0x756A, 0xF964, 0x7E41, 0x8543, 0x85E9, /* 0xE0 */
+ 0x98DC, 0x4F10, 0x7B4F, 0x7F70, 0x95A5, 0x51E1, 0x5E06, 0x68B5, /* 0xE0 */
+ 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF, 0x7BC4, 0x8303, 0x6CD5, 0x743A, /* 0xF0 */
+ 0x50FB, 0x5288, 0x58C1, 0x64D8, 0x6A97, 0x74A7, 0x7656 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_E9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x78A7, 0x8617, 0x95E2, 0x9739, 0xF965, 0x535E, 0x5F01, /* 0x30 */
+ 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49, 0x9F08, /* 0x30 */
+ 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A, 0x67C4, /* 0x40 */
+ 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27, 0x9920, /* 0x40 */
+ 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65, 0x6D11, /* 0x50 */
+ 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913, 0x8B5C, /* 0x50 */
+ 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9, 0x670D, /* 0x60 */
+ 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39, 0x8F3B, /* 0x60 */
+ 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01, 0x5CEF, /* 0x70 */
+ 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, /* 0x90 */
+ 0x4FEF, 0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, /* 0x90 */
+ 0x5A66, 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0xF966, 0x6276, 0x6577, /* 0xA0 */
+ 0x65A7, 0x6D6E, 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, /* 0xA0 */
+ 0x8151, 0x819A, 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, /* 0xB0 */
+ 0x8CFB, 0x8D74, 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, /* 0xB0 */
+ 0x9CE7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, /* 0xC0 */
+ 0x5FFF, 0x61A4, 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, /* 0xC0 */
+ 0x7CDE, 0x7D1B, 0x82AC, 0x8CC1, 0x96F0, 0xF967, 0x4F5B, 0x5F17, /* 0xD0 */
+ 0x5F7F, 0x62C2, 0x5D29, 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, /* 0xD0 */
+ 0x4E15, 0x5099, 0x5315, 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, /* 0xE0 */
+ 0x60B2, 0x618A, 0x6249, 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, /* 0xE0 */
+ 0x6BD6, 0x6BD7, 0x6BD8, 0x6CB8, 0xF968, 0x7435, 0x75FA, 0x7812, /* 0xF0 */
+ 0x7891, 0x79D5, 0x79D8, 0x7C83, 0x7DCB, 0x7FE1, 0x80A5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_EA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8, 0x8AB9, 0x8B6C, /* 0x30 */
+ 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC, 0x5B2A, 0x5F6C, /* 0x30 */
+ 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015, 0x725D, 0x73AD, /* 0x40 */
+ 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058, 0x9A01, 0x4E4D, /* 0x40 */
+ 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F, 0x4FDF, 0x50FF, /* 0x50 */
+ 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB, 0x5962, 0x5A11, /* 0x50 */
+ 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99, 0x601D, 0x6368, /* 0x60 */
+ 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B, 0x6C99, 0x6CD7, /* 0x60 */
+ 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940, 0x7960, 0x79C1, /* 0x70 */
+ 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E, 0x84D1, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66, /* 0x90 */
+ 0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0xF969, 0x6714, /* 0x90 */
+ 0xF96A, 0x5098, 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, /* 0xA0 */
+ 0x759D, 0x7B97, 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, /* 0xA0 */
+ 0x715E, 0x85A9, 0x4E09, 0xF96B, 0x6749, 0x68EE, 0x6E17, 0x829F, /* 0xB0 */
+ 0x8518, 0x886B, 0x63F7, 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, /* 0xB0 */
+ 0x50CF, 0x511F, 0x5546, 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, /* 0xC0 */
+ 0x5E38, 0x5E8A, 0x5EA0, 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, /* 0xC0 */
+ 0x723D, 0x7240, 0x72C0, 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, /* 0xD0 */
+ 0x89F4, 0x8A73, 0x8C61, 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, /* 0xD0 */
+ 0x55C7, 0xF96C, 0x7A61, 0x7D22, 0x8272, 0x7272, 0x751F, 0x7525, /* 0xE0 */
+ 0xF96D, 0x7B19, 0x5885, 0x58FB, 0x5DBC, 0x5E8F, 0x5EB6, 0x5F90, /* 0xE0 */
+ 0x6055, 0x6292, 0x637F, 0x654D, 0x6691, 0x66D9, 0x66F8, 0x6816, /* 0xF0 */
+ 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E, 0x7DD6, 0x7F72 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_EB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D, 0x92E4, /* 0x30 */
+ 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614, 0x6673, /* 0x30 */
+ 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6, 0x91CB, /* 0x40 */
+ 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3, 0x6247, /* 0x40 */
+ 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487, 0x74BF, /* 0x50 */
+ 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3, 0x8239, /* 0x50 */
+ 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425, 0x994D, /* 0x60 */
+ 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B, 0x820C, /* 0x60 */
+ 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261, 0x66B9, /* 0x70 */
+ 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x6D89, 0x71EE, 0xF96E, 0x57CE, 0x59D3, 0x5BAC, 0x6027, /* 0x90 */
+ 0x60FA, 0x6210, 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, /* 0x90 */
+ 0x7B6C, 0x8056, 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, /* 0xA0 */
+ 0x6B72, 0x6D17, 0x7A05, 0x7B39, 0x7D30, 0xF96F, 0x8CB0, 0x53EC, /* 0xA0 */
+ 0x562F, 0x5851, 0x5BB5, 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, /* 0xB0 */
+ 0x6414, 0x662D, 0x68B3, 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, /* 0xB0 */
+ 0x71D2, 0x7526, 0x758F, 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, /* 0xC0 */
+ 0x7D20, 0x7D39, 0x852C, 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, /* 0xC0 */
+ 0x90B5, 0x92B7, 0x97F6, 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, /* 0xD0 */
+ 0x7C9F, 0x7E8C, 0x8B16, 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, /* 0xD0 */
+ 0x84C0, 0x905C, 0x98E1, 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, /* 0xE0 */
+ 0x8A1F, 0x8AA6, 0x9001, 0x980C, 0x5237, 0xF970, 0x7051, 0x788E, /* 0xE0 */
+ 0x9396, 0x8870, 0x91D7, 0x4FEE, 0x53D7, 0x55FD, 0x56DA, 0x5782, /* 0xF0 */
+ 0x58FD, 0x5AC2, 0x5B88, 0x5CAB, 0x5CC0, 0x5E25, 0x6101 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_EC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x620D, 0x624B, 0x6388, 0x641C, 0x6536, 0x6578, 0x6A39, /* 0x30 */
+ 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9, 0x7378, 0x7407, /* 0x30 */
+ 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA, 0x7CB9, 0x7D8F, /* 0x40 */
+ 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490, 0x84DA, 0x85EA, /* 0x40 */
+ 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083, 0x916C, 0x9296, /* 0x50 */
+ 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700, 0x9808, 0x9996, /* 0x50 */
+ 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70, 0x5BBF, 0x6DD1, /* 0x60 */
+ 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD, 0x5DE1, 0x5F87, /* 0x60 */
+ 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53, 0x6B89, 0x6D35, /* 0x70 */
+ 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14, 0x8123, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187, /* 0x90 */
+ 0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07, /* 0x90 */
+ 0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2, /* 0xA0 */
+ 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F, /* 0xA0 */
+ 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB, /* 0xB0 */
+ 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD, /* 0xB0 */
+ 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5, /* 0xC0 */
+ 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A, /* 0xC0 */
+ 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C, /* 0xD0 */
+ 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38, /* 0xD0 */
+ 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668, /* 0xE0 */
+ 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA, /* 0xE0 */
+ 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0xF971, 0x8FC5, 0x5931, /* 0xF0 */
+ 0x5BA4, 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_ED[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF972, 0x6DF1, 0x700B, 0x751A, 0x82AF, 0x8AF6, 0x4EC0, /* 0x30 */
+ 0x5341, 0xF973, 0x96D9, 0x6C0F, 0x4E9E, 0x4FC4, 0x5152, 0x555E, /* 0x30 */
+ 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD, 0x83AA, 0x86FE, 0x8859, /* 0x40 */
+ 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09, 0x9D5D, 0x580A, 0x5CB3, /* 0x40 */
+ 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1, 0x6A02, 0x6E25, 0x9102, /* 0x50 */
+ 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89, 0x5CB8, 0x6309, 0x664F, /* 0x50 */
+ 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854, 0x9B9F, 0x65A1, 0x8B01, /* 0x60 */
+ 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6, 0x5EB5, 0x6697, 0x764C, /* 0x60 */
+ 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE, 0x9D28, 0x4EF0, 0x592E, /* 0x70 */
+ 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26, 0x5393, 0x54C0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D, 0x827E, /* 0x90 */
+ 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A, 0x814B, /* 0x90 */
+ 0x984D, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B, 0x51B6, /* 0xA0 */
+ 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0xF974, 0x91CE, /* 0xA0 */
+ 0x5F31, 0xF975, 0xF976, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, /* 0xB0 */
+ 0x8E8D, 0xF977, 0x4F6F, 0xF978, 0xF979, 0x58E4, 0x5B43, 0x6059, /* 0xB0 */
+ 0x63DA, 0x6518, 0x656D, 0x6698, 0xF97A, 0x694A, 0x6A23, 0x6D0B, /* 0xC0 */
+ 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70, 0xF97B, 0x7F8A, /* 0xC0 */
+ 0xF97C, 0x8944, 0xF97D, 0x8B93, 0x91C0, 0x967D, 0xF97E, 0x990A, /* 0xD0 */
+ 0x5704, 0x5FA1, 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, /* 0xD0 */
+ 0x9B5A, 0x9F6C, 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, /* 0xE0 */
+ 0x5830, 0x5F66, 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, /* 0xE0 */
+ 0x513C, 0x56B4, 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, /* 0xF0 */
+ 0x4E88, 0x4F59, 0xF97F, 0xF980, 0xF981, 0x5982, 0xF982 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_EE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF983, 0x6B5F, 0x6C5D, 0xF984, 0x74B5, 0x7916, 0xF985, /* 0x30 */
+ 0x8207, 0x8245, 0x8339, 0x8F3F, 0x8F5D, 0xF986, 0x9918, 0xF987, /* 0x30 */
+ 0xF988, 0xF989, 0x4EA6, 0xF98A, 0x57DF, 0x5F79, 0x6613, 0xF98B, /* 0x40 */
+ 0xF98C, 0x75AB, 0x7E79, 0x8B6F, 0xF98D, 0x9006, 0x9A5B, 0x56A5, /* 0x40 */
+ 0x5827, 0x59F8, 0x5A1F, 0x5BB4, 0xF98E, 0x5EF6, 0xF98F, 0xF990, /* 0x50 */
+ 0x6350, 0x633B, 0xF991, 0x693D, 0x6C87, 0x6CBF, 0x6D8E, 0x6D93, /* 0x50 */
+ 0x6DF5, 0x6F14, 0xF992, 0x70DF, 0x7136, 0x7159, 0xF993, 0x71C3, /* 0x60 */
+ 0x71D5, 0xF994, 0x784F, 0x786F, 0xF995, 0x7B75, 0x7DE3, 0xF996, /* 0x60 */
+ 0x7E2F, 0xF997, 0x884D, 0x8EDF, 0xF998, 0xF999, 0xF99A, 0x925B, /* 0x70 */
+ 0xF99B, 0x9CF6, 0xF99C, 0xF99D, 0xF99E, 0x6085, 0x6D85, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF99F, 0x71B1, 0xF9A0, 0xF9A1, 0x95B1, 0x53AD, 0xF9A2, /* 0x90 */
+ 0xF9A3, 0xF9A4, 0x67D3, 0xF9A5, 0x708E, 0x7130, 0x7430, 0x8276, /* 0x90 */
+ 0x82D2, 0xF9A6, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4, 0xF9A7, 0x71C1, /* 0xA0 */
+ 0x8449, 0xF9A8, 0xF9A9, 0x584B, 0xF9AA, 0xF9AB, 0x5DB8, 0x5F71, /* 0xA0 */
+ 0xF9AC, 0x6620, 0x668E, 0x6979, 0x69AE, 0x6C38, 0x6CF3, 0x6E36, /* 0xB0 */
+ 0x6F41, 0x6FDA, 0x701B, 0x702F, 0x7150, 0x71DF, 0x7370, 0xF9AD, /* 0xB0 */
+ 0x745B, 0xF9AE, 0x74D4, 0x76C8, 0x7A4E, 0x7E93, 0xF9AF, 0xF9B0, /* 0xC0 */
+ 0x82F1, 0x8A60, 0x8FCE, 0xF9B1, 0x9348, 0xF9B2, 0x9719, 0xF9B3, /* 0xC0 */
+ 0xF9B4, 0x4E42, 0x502A, 0xF9B5, 0x5208, 0x53E1, 0x66F3, 0x6C6D, /* 0xD0 */
+ 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE, 0x85DD, 0x8602, 0xF9B6, /* 0xD0 */
+ 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0xF9B7, 0x92B3, 0xF9B8, 0x9713, /* 0xE0 */
+ 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433, /* 0xE0 */
+ 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0xF9B9, /* 0xF0 */
+ 0x61CA, 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_EF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x70CF, 0x71AC, 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, /* 0x30 */
+ 0x9F07, 0x5C4B, 0x6C83, 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, /* 0x30 */
+ 0x761F, 0x7A69, 0x7E15, 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, /* 0x40 */
+ 0x7515, 0x7670, 0x7FC1, 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, /* 0x40 */
+ 0x7AA9, 0x7AAA, 0x81E5, 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, /* 0x50 */
+ 0x5B9B, 0x68A1, 0x6900, 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, /* 0x50 */
+ 0x7DE9, 0x7FEB, 0x8118, 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, /* 0x60 */
+ 0x66F0, 0x5F80, 0x65FA, 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, /* 0x60 */
+ 0x6B6A, 0x77EE, 0x5916, 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0xF9BA, /* 0x70 */
+ 0xF9BB, 0x50E5, 0x51F9, 0x582F, 0x592D, 0x5996, 0x59DA, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x5BE5, 0xF9BC, 0xF9BD, 0x5DA2, 0x62D7, 0x6416, 0x6493, /* 0x90 */
+ 0x64FE, 0xF9BE, 0x66DC, 0xF9BF, 0x6A48, 0xF9C0, 0x71FF, 0x7464, /* 0x90 */
+ 0xF9C1, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E, 0x8000, 0x8170, 0xF9C2, /* 0xA0 */
+ 0x87EF, 0x8981, 0x8B20, 0x9059, 0xF9C3, 0x9080, 0x9952, 0x617E, /* 0xA0 */
+ 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD, 0x5197, /* 0xB0 */
+ 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995, 0x6D8C, /* 0xB0 */
+ 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073, 0x8338, /* 0xC0 */
+ 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0xF9C4, 0x4E8E, 0x4F51, 0x5076, /* 0xC0 */
+ 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A, /* 0xD0 */
+ 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991, /* 0xD0 */
+ 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047, /* 0xE0 */
+ 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED, /* 0xE0 */
+ 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0xF9C5, /* 0xF0 */
+ 0x6A52, 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x904B, 0x9695, 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, /* 0x30 */
+ 0x718A, 0x96C4, 0x5143, 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, /* 0x30 */
+ 0x5A9B, 0x5AC4, 0x5BC3, 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, /* 0x40 */
+ 0x6E72, 0x6E90, 0x7230, 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, /* 0x40 */
+ 0x9060, 0xF9C6, 0x9662, 0x9858, 0x9D1B, 0x6708, 0x8D8A, 0x925E, /* 0x50 */
+ 0x4F4D, 0x5049, 0x50DE, 0x5371, 0x570D, 0x59D4, 0x5A01, 0x5C09, /* 0x50 */
+ 0x6170, 0x6690, 0x6E2D, 0x7232, 0x744B, 0x7DEF, 0x80C3, 0x840E, /* 0x60 */
+ 0x8466, 0x853F, 0x875F, 0x885B, 0x8918, 0x8B02, 0x9055, 0x97CB, /* 0x60 */
+ 0x9B4F, 0x4E73, 0x4F91, 0x5112, 0x516A, 0xF9C7, 0x552F, 0x55A9, /* 0x70 */
+ 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE, 0x60A0, 0x60DF, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0xF9C8, 0x67D4, /* 0x90 */
+ 0x67DA, 0xF9C9, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0xF9CA, 0x6E38, /* 0x90 */
+ 0xF9CB, 0x6FE1, 0x7336, 0x7337, 0xF9CC, 0x745C, 0x7531, 0xF9CD, /* 0xA0 */
+ 0x7652, 0xF9CE, 0xF9CF, 0x7DAD, 0x81FE, 0x8438, 0x88D5, 0x8A98, /* 0xA0 */
+ 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A, 0x9149, /* 0xB0 */
+ 0x91C9, 0x936E, 0xF9D0, 0xF9D1, 0x5809, 0xF9D2, 0x6BD3, 0x8089, /* 0xB0 */
+ 0x80B2, 0xF9D3, 0xF9D4, 0x5141, 0x596B, 0x5C39, 0xF9D5, 0xF9D6, /* 0xC0 */
+ 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0xF9D7, 0x9217, 0x958F, 0xF9D8, /* 0xC0 */
+ 0xF9D9, 0xF9DA, 0xF9DB, 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, /* 0xD0 */
+ 0xF9DC, 0x57A0, 0x6069, 0x6147, 0x6BB7, 0x8ABE, 0x9280, 0x96B1, /* 0xD0 */
+ 0x4E59, 0x541F, 0x6DEB, 0x852D, 0x9670, 0x97F3, 0x98EE, 0x63D6, /* 0xE0 */
+ 0x6CE3, 0x9091, 0x51DD, 0x61C9, 0x81BA, 0x9DF9, 0x4F9D, 0x501A, /* 0xE0 */
+ 0x5100, 0x5B9C, 0x610F, 0x61FF, 0x64EC, 0x6905, 0x6BC5, 0x7591, /* 0xF0 */
+ 0x77E3, 0x7FA9, 0x8264, 0x858F, 0x87FB, 0x8863, 0x8ABC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A, 0xF9DD, 0xF9DE, /* 0x30 */
+ 0x5937, 0x59E8, 0xF9DF, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0xF9E0, /* 0x30 */
+ 0xF9E1, 0xF9E2, 0xF9E3, 0x723E, 0x73E5, 0xF9E4, 0x7570, 0x75CD, /* 0x40 */
+ 0xF9E5, 0x79FB, 0xF9E6, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351, /* 0x40 */
+ 0xF9E7, 0xF9E8, 0x8CBD, 0x8CB3, 0x9087, 0xF9E9, 0xF9EA, 0x98F4, /* 0x50 */
+ 0x990C, 0xF9EB, 0xF9EC, 0x7037, 0x76CA, 0x7FCA, 0x7FCC, 0x7FFC, /* 0x50 */
+ 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0xF9ED, 0x54BD, 0x56E0, /* 0x60 */
+ 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0xF9EE, 0xF9EF, 0x7D6A, /* 0x60 */
+ 0x8335, 0xF9F0, 0x8693, 0x8A8D, 0xF9F1, 0x976D, 0x9777, 0xF9F2, /* 0x70 */
+ 0xF9F3, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9, 0x65E5, 0x6EA2, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A, 0x59D9, /* 0x90 */
+ 0x6041, 0xF9F4, 0xF9F5, 0x7A14, 0xF9F6, 0x834F, 0x8CC3, 0x5165, /* 0x90 */
+ 0x5344, 0xF9F7, 0xF9F8, 0xF9F9, 0x4ECD, 0x5269, 0x5B55, 0x82BF, /* 0xA0 */
+ 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF, 0x5B50, 0x5B57, 0x5B5C, /* 0xA0 */
+ 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E, 0x7386, 0x74F7, 0x75B5, /* 0xB0 */
+ 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328, 0x8517, 0x85C9, 0x8AEE, /* 0xB0 */
+ 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC, 0x65AB, 0x6628, 0x707C, /* 0xC0 */
+ 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C, 0x96C0, 0x9D72, 0x5B71, /* 0xC0 */
+ 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91, 0x66AB, 0x6F5B, 0x7BB4, /* 0xD0 */
+ 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7, 0x5320, 0x5834, 0x58BB, /* 0xD0 */
+ 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84, 0x5F35, 0x638C, 0x66B2, /* 0xE0 */
+ 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F, 0x7246, 0xF9FA, 0x7350, /* 0xE0 */
+ 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7, 0x838A, 0x846C, /* 0xF0 */
+ 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC, 0x9577 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750, /* 0x30 */
+ 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1, /* 0x30 */
+ 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47, /* 0x40 */
+ 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E, /* 0x40 */
+ 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35, /* 0x50 */
+ 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019, /* 0x50 */
+ 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458, /* 0x60 */
+ 0x6575, 0x6EF4, 0x72C4, 0xF9FB, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, /* 0x60 */
+ 0x7E3E, 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, /* 0x70 */
+ 0x8FEA, 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x5168, 0x5178, 0x524D, 0x526A, 0x5861, 0x587C, 0x5960, /* 0x90 */
+ 0x5C08, 0x5C55, 0x5EDB, 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, /* 0x90 */
+ 0x6FB1, 0x714E, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, /* 0xA0 */
+ 0x7B8B, 0x7BAD, 0x7BC6, 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, /* 0xA0 */
+ 0x9293, 0x9322, 0x942B, 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, /* 0xB0 */
+ 0x622A, 0x6298, 0x6D59, 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, /* 0xB0 */
+ 0x5CBE, 0x5E97, 0x6F38, 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, /* 0xC0 */
+ 0x63A5, 0x647A, 0x8776, 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, /* 0xC0 */
+ 0x5448, 0x59C3, 0x5B9A, 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, /* 0xD0 */
+ 0x633A, 0x653F, 0x6574, 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, /* 0xD0 */
+ 0x6A89, 0x6B63, 0x6C40, 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, /* 0xE0 */
+ 0x70A1, 0x738E, 0x73FD, 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, /* 0xE0 */
+ 0x7A7D, 0x7CBE, 0x7D8E, 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, /* 0xF0 */
+ 0x914A, 0x91D8, 0x9266, 0x92CC, 0x9320, 0x9706, 0x9756 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x975C, 0x9802, 0x9F0E, 0x5236, 0x5291, 0x557C, 0x5824, /* 0x30 */
+ 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF, 0x6FDF, 0x796D, 0x7B2C, /* 0x30 */
+ 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44, 0x918D, 0x9664, 0x969B, /* 0x40 */
+ 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146, 0x51CB, 0x52A9, 0x5632, /* 0x40 */
+ 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9, 0x6641, 0x66FA, 0x66F9, /* 0x50 */
+ 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15, 0x6F6E, 0x7167, 0x71E5, /* 0x50 */
+ 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A, 0x79DF, 0x7A20, 0x7A95, /* 0x60 */
+ 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087, 0x85FB, 0x86A4, 0x8A54, /* 0x60 */
+ 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D, 0x91E3, 0x963B, 0x96D5, /* 0x70 */
+ 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3, 0x5B58, 0x5C0A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E, 0x60B0, /* 0x90 */
+ 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C, 0x7E31, /* 0x90 */
+ 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750, 0x5DE6, /* 0xA0 */
+ 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A, 0x59DD, /* 0xA0 */
+ 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE, 0x5EDA, /* 0xB0 */
+ 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A, 0x6F8D, /* 0xB0 */
+ 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2, 0x821F, /* 0xC0 */
+ 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031, 0x914E, /* 0xC0 */
+ 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101, 0x51C6, /* 0xD0 */
+ 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96, 0x6FEC, /* 0xD0 */
+ 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB, 0x99FF, /* 0xE0 */
+ 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB, 0x696B, /* 0xE0 */
+ 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD, 0x7511, /* 0xF0 */
+ 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, /* 0x30 */
+ 0x652F, 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, /* 0x30 */
+ 0x6F2C, 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, /* 0x40 */
+ 0x81F3, 0x829D, 0x82B7, 0x8718, 0x8A8C, 0xF9FC, 0x8D04, 0x8DBE, /* 0x40 */
+ 0x9072, 0x76F4, 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, /* 0x50 */
+ 0x5875, 0x632F, 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, /* 0x50 */
+ 0x6D25, 0x6EB1, 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, /* 0x60 */
+ 0x771E, 0x778B, 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, /* 0x60 */
+ 0x8A3A, 0x8CD1, 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, /* 0x70 */
+ 0x9707, 0x4F84, 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x74C6, 0x75BE, 0x79E9, 0x7A92, 0x81A3, 0x86ED, 0x8CEA, /* 0x90 */
+ 0x8DCC, 0x8FED, 0x659F, 0x6715, 0xF9FD, 0x57F7, 0x6F57, 0x7DDD, /* 0x90 */
+ 0x8F2F, 0x93F6, 0x96C6, 0x5FB5, 0x61F2, 0x6F84, 0x4E14, 0x4F98, /* 0xA0 */
+ 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE, 0x6B21, 0x6B64, 0x78CB, /* 0xA0 */
+ 0x7B9A, 0xF9FE, 0x8E49, 0x8ECA, 0x906E, 0x6349, 0x643E, 0x7740, /* 0xB0 */
+ 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF, 0x71E6, 0x74A8, /* 0xB0 */
+ 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98, 0x8B9A, 0x8D0A, /* 0xC0 */
+ 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6, 0x672D, 0x7D2E, /* 0xC0 */
+ 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA, 0x65AC, 0x7AD9, /* 0xD0 */
+ 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5A3C, 0x5EE0, /* 0xD0 */
+ 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2, 0x69CD, 0x6EC4, /* 0xE0 */
+ 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259, 0x83D6, 0x84BC, /* 0xE0 */
+ 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1, 0x7826, 0x7DB5, /* 0xF0 */
+ 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5, 0x7B56 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0xF9FF, /* 0x30 */
+ 0x5254, 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, /* 0x30 */
+ 0x7620, 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, /* 0x40 */
+ 0x5929, 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, /* 0x40 */
+ 0x85A6, 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, /* 0x50 */
+ 0x51F8, 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, /* 0x50 */
+ 0x8F4D, 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, /* 0x60 */
+ 0x7C3D, 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, /* 0x60 */
+ 0x7252, 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, /* 0x70 */
+ 0x6DF8, 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0xFA00, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x5243, 0x66FF, 0x6D95, 0x6EEF, 0x7DE0, 0x8AE6, 0x902E, /* 0x90 */
+ 0x905E, 0x9AD4, 0x521D, 0x527F, 0x54E8, 0x6194, 0x6284, 0x62DB, /* 0x90 */
+ 0x68A2, 0x6912, 0x695A, 0x6A35, 0x7092, 0x7126, 0x785D, 0x7901, /* 0xA0 */
+ 0x790E, 0x79D2, 0x7A0D, 0x8096, 0x8278, 0x82D5, 0x8349, 0x8549, /* 0xA0 */
+ 0x8C82, 0x8D85, 0x9162, 0x918B, 0x91AE, 0x4FC3, 0x56D1, 0x71ED, /* 0xB0 */
+ 0x77D7, 0x8700, 0x89F8, 0x5BF8, 0x5FD6, 0x6751, 0x90A8, 0x53E2, /* 0xB0 */
+ 0x585A, 0x5BF5, 0x60A4, 0x6181, 0x6460, 0x7E3D, 0x8070, 0x8525, /* 0xC0 */
+ 0x9283, 0x64AE, 0x50AC, 0x5D14, 0x6700, 0x589C, 0x62BD, 0x63A8, /* 0xC0 */
+ 0x690E, 0x6978, 0x6A1E, 0x6E6B, 0x76BA, 0x79CB, 0x82BB, 0x8429, /* 0xD0 */
+ 0x8ACF, 0x8DA8, 0x8FFD, 0x9112, 0x914B, 0x919C, 0x9310, 0x9318, /* 0xD0 */
+ 0x939A, 0x96DB, 0x9A36, 0x9C0D, 0x4E11, 0x755C, 0x795D, 0x7AFA, /* 0xE0 */
+ 0x7B51, 0x7BC9, 0x7E2E, 0x84C4, 0x8E59, 0x8E74, 0x8EF8, 0x9010, /* 0xE0 */
+ 0x6625, 0x693F, 0x7443, 0x51FA, 0x672E, 0x9EDC, 0x5145, 0x5FE0, /* 0xF0 */
+ 0x6C96, 0x87F2, 0x885D, 0x8877, 0x60B4, 0x81B5, 0x8403 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36, 0x5C31, 0x708A, /* 0x30 */
+ 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189, 0x9A5F, 0x9DF2, /* 0x30 */
+ 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64, 0x4F88, 0x5024, /* 0x40 */
+ 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB, 0x6DC4, 0x71BE, /* 0x40 */
+ 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7, 0x7DFB, 0x7F6E, /* 0x50 */
+ 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52, 0x5247, 0x52C5, /* 0x50 */
+ 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5, 0x5BE2, 0x6795, /* 0x60 */
+ 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C, 0x87C4, 0x79E4, /* 0x60 */
+ 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE, 0x59A5, 0x60F0, /* 0x70 */
+ 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99B1, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0xFA01, 0x6258, /* 0x90 */
+ 0xFA02, 0x64E2, 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, /* 0x90 */
+ 0x8A17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, /* 0xA0 */
+ 0x7058, 0x70AD, 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, /* 0xA0 */
+ 0x803D, 0x8CAA, 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, /* 0xB0 */
+ 0xFA03, 0x8569, 0x514C, 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, /* 0xB0 */
+ 0x6C70, 0x6CF0, 0x7B1E, 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, /* 0xC0 */
+ 0xFA04, 0x64C7, 0x6FA4, 0x6491, 0x6504, 0x514E, 0x5410, 0x571F, /* 0xC0 */
+ 0x8A0E, 0x615F, 0x6876, 0xFA05, 0x75DB, 0x7B52, 0x7D71, 0x901A, /* 0xD0 */
+ 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000, 0x9839, 0x5078, 0x5957, /* 0xD0 */
+ 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D, 0x7279, 0x95D6, 0x5761, /* 0xE0 */
+ 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA, 0x6777, 0x6CE2, 0x6D3E, /* 0xE0 */
+ 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD, 0x8DDB, 0x9817, 0x5224, /* 0xF0 */
+ 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9, 0x8FA6, 0x9211 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504, 0x6096, /* 0x30 */
+ 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987, 0x8C9D, /* 0x30 */
+ 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F, 0x6241, /* 0x40 */
+ 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19, 0x8CB6, /* 0x40 */
+ 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16, 0x5E63, /* 0x50 */
+ 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B, 0x4F48, /* 0x50 */
+ 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03, 0x6016, /* 0x60 */
+ 0x629B, 0x62B1, 0x6355, 0xFA06, 0x6CE1, 0x6D66, 0x75B1, 0x7832, /* 0x60 */
+ 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B, /* 0x70 */
+ 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x7206, 0xFA07, 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, /* 0x90 */
+ 0x6A19, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, /* 0x90 */
+ 0x9A43, 0x54C1, 0x7A1F, 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, /* 0xA0 */
+ 0x5F7C, 0x62AB, 0x75B2, 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, /* 0xA0 */
+ 0x5F3C, 0x5FC5, 0x6CCC, 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, /* 0xB0 */
+ 0x999D, 0x4E4F, 0x903C, 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, /* 0xB0 */
+ 0x6630, 0x6CB3, 0x7455, 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, /* 0xC0 */
+ 0x9C15, 0x58D1, 0x5B78, 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, /* 0xC0 */
+ 0x608D, 0x65F1, 0x6C57, 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, /* 0xD0 */
+ 0x9591, 0x9592, 0x9650, 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, /* 0xD0 */
+ 0x54B8, 0x5563, 0x558A, 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, /* 0xE0 */
+ 0x9677, 0x9E79, 0x5408, 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, /* 0xE0 */
+ 0x965C, 0x4EA2, 0x4F09, 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, /* 0xF0 */
+ 0x676D, 0x6841, 0x6C86, 0x6E2F, 0x7F38, 0x809B, 0x822A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFA08, 0xFA09, 0x9805, 0x4EA5, 0x5055, 0x54B3, 0x5793, /* 0x30 */
+ 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023, 0x87F9, /* 0x30 */
+ 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE, 0x6838, /* 0x40 */
+ 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411, 0x56AE, /* 0x40 */
+ 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653, 0x589F, /* 0x50 */
+ 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47, 0x96AA, /* 0x50 */
+ 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4, 0x5F26, /* 0x60 */
+ 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE, 0x7729, /* 0x60 */
+ 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0xFA0A, 0x8CE2, /* 0x70 */
+ 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x4FE0, 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, /* 0x90 */
+ 0x8105, 0x8107, 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, /* 0x90 */
+ 0x578B, 0x5F62, 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, /* 0xA0 */
+ 0x73E9, 0x7469, 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, /* 0xA0 */
+ 0x99A8, 0x516E, 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, /* 0xB0 */
+ 0x91AF, 0x978B, 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, /* 0xB0 */
+ 0x5CB5, 0x5F27, 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, /* 0xC0 */
+ 0x6DCF, 0x6E56, 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, /* 0xC0 */
+ 0x7425, 0x745A, 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, /* 0xD0 */
+ 0x82A6, 0x846B, 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, /* 0xD0 */
+ 0x93AC, 0x9800, 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, /* 0xE0 */
+ 0x6DF7, 0x6E3E, 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, /* 0xE0 */
+ 0x5F18, 0x6C5E, 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, /* 0xF0 */
+ 0x9D3B, 0x5316, 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_JOHAB_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x798D, 0x79BE, 0x82B1, 0x83EF, 0x8A71, 0x8B41, 0x8CA8, /* 0x30 */
+ 0x9774, 0xFA0B, 0x64F4, 0x652B, 0x78BA, 0x78BB, 0x7A6B, 0x4E38, /* 0x30 */
+ 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3, 0x63DB, 0x6B61, 0x6665, /* 0x40 */
+ 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08, 0x9084, 0x9A69, 0x9C25, /* 0x40 */
+ 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA, 0x51F0, 0x5E4C, 0x5FA8, /* 0x50 */
+ 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643, 0x6644, 0x69A5, 0x6CC1, /* 0x50 */
+ 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C, 0x7687, 0x7BC1, 0x7C27, /* 0x60 */
+ 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3, 0x532F, 0x56DE, 0x5EFB, /* 0x60 */
+ 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666, 0x6703, 0x6A9C, 0x6DEE, /* 0x70 */
+ 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE, 0x8334, 0x86D4, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B, 0x9404, /* 0x90 */
+ 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F, 0x6D8D, /* 0x90 */
+ 0x6DC6, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019, 0x539A, /* 0xA0 */
+ 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D, 0x7166, /* 0xA0 */
+ 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104, 0x718F, /* 0xB0 */
+ 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684, 0x714A, /* 0xB0 */
+ 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE, 0x6689, /* 0xC0 */
+ 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB, 0x7566, /* 0xC0 */
+ 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308, 0x6D36, /* 0xD0 */
+ 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403, 0x5C79, /* 0xD0 */
+ 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070, 0x6D3D, /* 0xE0 */
+ 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD, 0x59EC, /* 0xE0 */
+ 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6, 0x7199, /* 0xF0 */
+ 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70 /* 0xF0 */
+};
diff --git a/sal/textenc/tcvtkr5.tab b/sal/textenc/tcvtkr5.tab
new file mode 100644
index 000000000000..edd0810fa194
--- /dev/null
+++ b/sal/textenc/tcvtkr5.tab
@@ -0,0 +1,5415 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the DBCS to UniCode tables for the following */
+/* korean charsets: */
+/* JOHAB */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x00 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 0x00 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 0x10 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 0x10 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 0x20 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 0x20 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0x30 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 0x30 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0x40 */
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, /* 0x40 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* 0x50 */
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 0x50 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x60 */
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0x60 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, /* 0x70 */
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xD9AE, 0, 0, 0xD9B4, 0, 0, 0xD967, /* 0xA0 */
+ 0xD937, 0, 0xDCA3, 0, 0, 0xD939, 0, 0, /* 0xA0 */
+ 0xD956, 0xD94E, 0xDD99, 0xDD9A, 0xD9A5, 0, 0xD9D2, 0xD934, /* 0xB0 */
+ 0xD9AC, 0xDD98, 0xDCAC, 0, 0xDCF9, 0xDCF6, 0xDCFA, 0xD9AF, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xDCA1, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xDCA2, 0, 0, 0, 0, 0, 0, 0xD94F, /* 0xD0 */
+ 0xDCAA, 0, 0, 0, 0, 0, 0xDCAD, 0xDD3C, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xDD31, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xDD33, 0, 0, 0, 0, 0, 0, 0xD950, /* 0xF0 */
+ 0xDD3A, 0, 0, 0, 0, 0, 0xDD3D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_01[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDD32, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xDCA4, 0xDD34, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xDD35, 0xDCA6, 0xDD36, 0, 0, 0, 0, /* 0x30 */
+ 0xDD37, 0, 0, 0, 0, 0, 0, 0xDCA8, /* 0x30 */
+ 0xDD38, 0xDCA9, 0xDD39, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xDD40, 0xDCAF, 0xDD3F, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xDCAB, 0xDD3B, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xDCAE, 0xDD3E /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_02[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD9A7, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xD9B0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xD9A8, 0xD9AB, 0xD9AA, 0xD9AD, 0, 0xD9A9 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_03[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDB51, 0xDB52, 0xDB53, 0xDB54, 0xDB55, 0xDB56, 0xDB57, /* 0x90 */
+ 0xDB58, 0xDB59, 0xDB5A, 0xDB5B, 0xDB5C, 0xDB5D, 0xDB5E, 0xDB5F, /* 0x90 */
+ 0xDB60, 0xDB61, 0, 0xDB62, 0xDB63, 0xDB64, 0xDB65, 0xDB66, /* 0xA0 */
+ 0xDB67, 0xDB68, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xDB71, 0xDB72, 0xDB73, 0xDB74, 0xDB75, 0xDB76, 0xDB77, /* 0xB0 */
+ 0xDB78, 0xDB79, 0xDB7A, 0xDB7B, 0xDB7C, 0xDB7D, 0xDB7E, 0xDB91, /* 0xB0 */
+ 0xDB92, 0xDB93, 0, 0xDB94, 0xDB95, 0xDB96, 0xDB97, 0xDB98, /* 0xC0 */
+ 0xDB99, 0xDB9A /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_04[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDEA7, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xDEA1, 0xDEA2, 0xDEA3, 0xDEA4, 0xDEA5, 0xDEA6, 0xDEA8, 0xDEA9, /* 0x10 */
+ 0xDEAA, 0xDEAB, 0xDEAC, 0xDEAD, 0xDEAE, 0xDEAF, 0xDEB0, 0xDEB1, /* 0x10 */
+ 0xDEB2, 0xDEB3, 0xDEB4, 0xDEB5, 0xDEB6, 0xDEB7, 0xDEB8, 0xDEB9, /* 0x20 */
+ 0xDEBA, 0xDEBB, 0xDEBC, 0xDEBD, 0xDEBE, 0xDEBF, 0xDEC0, 0xDEC1, /* 0x20 */
+ 0xDED1, 0xDED2, 0xDED3, 0xDED4, 0xDED5, 0xDED6, 0xDED8, 0xDED9, /* 0x30 */
+ 0xDEDA, 0xDEDB, 0xDEDC, 0xDEDD, 0xDEDE, 0xDEDF, 0xDEE0, 0xDEE1, /* 0x30 */
+ 0xDEE2, 0xDEE3, 0xDEE4, 0xDEE5, 0xDEE6, 0xDEE7, 0xDEE8, 0xDEE9, /* 0x40 */
+ 0xDEEA, 0xDEEB, 0xDEEC, 0xDEED, 0xDEEE, 0xDEEF, 0xDEF0, 0xDEF1, /* 0x40 */
+ 0, 0xDED7 /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_20[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD93A, 0, 0, /* 0x10 */
+ 0xD93E, 0xD93F, 0, 0, 0xD940, 0xD941, 0, 0, /* 0x10 */
+ 0xD9D3, 0xD9D4, 0, 0, 0, 0xD935, 0xD936, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xD9B6, 0, 0xD957, 0xD958, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xD968, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xDD9B, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDD9C, /* 0x70 */
+ 0, 0xDD9D, 0xDD9E, 0xDD9F, 0xDDA0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x005C /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD959, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xD9B5, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xDC34, 0, 0, 0xD9E0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xD9E5, 0xD9E2, 0, 0, 0, 0xDC69, 0, /* 0x20 */
+ 0, 0, 0, 0xD95A, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xDCF7, 0xDCF8, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xDCFB, 0xDCFC, 0xDCFD, 0xDCFE, 0, /* 0x50 */
+ 0xDB40, 0xDB41, 0xDB42, 0xDB43, 0xDB44, 0xDB45, 0xDB46, 0xDB47, /* 0x60 */
+ 0xDB48, 0xDB49, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xDB31, 0xDB32, 0xDB33, 0xDB34, 0xDB35, 0xDB36, 0xDB37, 0xDB38, /* 0x70 */
+ 0xDB39, 0xDB3A, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xD977, 0xD978, 0xD976, 0xD979, 0xD97A, 0xD9D5, 0xD9D8, 0xD9D6, /* 0x90 */
+ 0xD9D9, 0xD9D7, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xD9A1, 0, 0xD9A2 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD9A3, 0, 0xD963, 0xD9A4, 0, 0, 0, 0xD964, /* 0x00 */
+ 0xD996, 0, 0, 0xD997, 0, 0, 0, 0xD9B3, /* 0x00 */
+ 0, 0xD9B2, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xD97E, 0, 0, 0xD992, 0xD954, 0, /* 0x10 */
+ 0xD960, 0, 0, 0, 0, 0xD93B, 0, 0xD99E, /* 0x20 */
+ 0xD99F, 0xD99D, 0xD99C, 0xD994, 0xD995, 0, 0xD9B1, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xD955, 0xD993, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xD93D, 0xD991, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xD966, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xD951, 0xD965, 0, 0, 0xD952, 0xD953, 0, 0, /* 0x60 */
+ 0, 0, 0xD97C, 0xD97D, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xD99A, 0xD99B, 0, 0, 0xD998, 0xD999, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xD9C1, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xD961 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_23[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD962 /* 0x10 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_24[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCE7, 0xDCE8, 0xDCE9, 0xDCEA, 0xDCEB, 0xDCEC, 0xDCED, 0xDCEE, /* 0x60 */
+ 0xDCEF, 0xDCF0, 0xDCF1, 0xDCF2, 0xDCF3, 0xDCF4, 0xDCF5, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xDD77, 0xDD78, 0xDD79, 0xDD7A, /* 0x70 */
+ 0xDD7B, 0xDD7C, 0xDD7D, 0xDD7E, 0xDD91, 0xDD92, 0xDD93, 0xDD94, /* 0x70 */
+ 0xDD95, 0xDD96, 0xDD97, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xDD5D, 0xDD5E, 0xDD5F, 0xDD60, /* 0x90 */
+ 0xDD61, 0xDD62, 0xDD63, 0xDD64, 0xDD65, 0xDD66, 0xDD67, 0xDD68, /* 0xA0 */
+ 0xDD69, 0xDD6A, 0xDD6B, 0xDD6C, 0xDD6D, 0xDD6E, 0xDD6F, 0xDD70, /* 0xA0 */
+ 0xDD71, 0xDD72, 0xDD73, 0xDD74, 0xDD75, 0xDD76, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xDCCD, 0xDCCE, 0xDCCF, 0xDCD0, 0xDCD1, 0xDCD2, 0xDCD3, 0xDCD4, /* 0xD0 */
+ 0xDCD5, 0xDCD6, 0xDCD7, 0xDCD8, 0xDCD9, 0xDCDA, 0xDCDB, 0xDCDC, /* 0xD0 */
+ 0xDCDD, 0xDCDE, 0xDCDF, 0xDCE0, 0xDCE1, 0xDCE2, 0xDCE3, 0xDCE4, /* 0xE0 */
+ 0xDCE5, 0xDCE6 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_25[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDBA1, 0xDBAC, 0xDBA2, 0xDBAD, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xDBA3, 0xDBC8, 0xDBC7, 0xDBAE, /* 0x00 */
+ 0xDBA4, 0xDBC2, 0xDBC1, 0xDBAF, 0xDBA6, 0xDBC6, 0xDBC5, 0xDBB1, /* 0x10 */
+ 0xDBA5, 0xDBC4, 0xDBC3, 0xDBB0, 0xDBA7, 0xDBBC, 0xDBC9, 0xDBCA, /* 0x10 */
+ 0xDBB7, 0xDBCB, 0xDBCC, 0xDBB2, 0xDBA9, 0xDBBE, 0xDBCD, 0xDBCE, /* 0x20 */
+ 0xDBB9, 0xDBCF, 0xDBD0, 0xDBB4, 0xDBA8, 0xDBD1, 0xDBD2, 0xDBB8, /* 0x20 */
+ 0xDBBD, 0xDBD3, 0xDBD4, 0xDBB3, 0xDBAA, 0xDBD5, 0xDBD6, 0xDBBA, /* 0x30 */
+ 0xDBBF, 0xDBD7, 0xDBD8, 0xDBB5, 0xDBAB, 0xDBD9, 0xDBDA, 0xDBBB, /* 0x30 */
+ 0xDBDB, 0xDBDC, 0xDBC0, 0xDBDD, 0xDBDE, 0xDBDF, 0xDBE0, 0xDBE1, /* 0x40 */
+ 0xDBE2, 0xDBE3, 0xDBE4, 0xDBB6, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD9C6, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xD971, 0xD970, 0, 0xD9C3, 0xD9C7, 0xD9C8, 0xD9CB, 0xD9CA, /* 0xA0 */
+ 0xD9C9, 0xD9CC, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xD973, 0xD972, 0, 0, 0xD9BA, 0xD9B9, /* 0xB0 */
+ 0, 0, 0, 0, 0xD975, 0xD974, 0, 0, /* 0xB0 */
+ 0xD9B8, 0xD9B7, 0, 0, 0, 0, 0xD96F, 0xD96E, /* 0xC0 */
+ 0xD9C2, 0, 0, 0xD96B, 0, 0, 0xD96D, 0xD96C, /* 0xC0 */
+ 0xD9C4, 0xD9C5 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD96A, 0xD969, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xD9CF, 0xD9CE, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xD9D0, 0, 0xD9D1, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xD95F, 0, 0xD95E, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xD9BC, 0xD9BD, 0, 0xD9C0, 0xD9BB, 0xD9BE, 0, 0xD9BF, /* 0x60 */
+ 0xD9CD, 0xD9DB, 0xD9DC, 0, 0xD9DD, 0xD9DA /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD931, 0xD932, 0xD933, 0xD938, 0, 0, 0, 0, /* 0x00 */
+ 0xD944, 0xD945, 0xD946, 0xD947, 0xD948, 0xD949, 0xD94A, 0xD94B, /* 0x00 */
+ 0xD94C, 0xD94D, 0, 0xD97B, 0xD942, 0xD943, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xDDA1, 0xDDA2, 0xDDA3, 0xDDA4, 0xDDA5, 0xDDA6, 0xDDA7, /* 0x40 */
+ 0xDDA8, 0xDDA9, 0xDDAA, 0xDDAB, 0xDDAC, 0xDDAD, 0xDDAE, 0xDDAF, /* 0x40 */
+ 0xDDB0, 0xDDB1, 0xDDB2, 0xDDB3, 0xDDB4, 0xDDB5, 0xDDB6, 0xDDB7, /* 0x50 */
+ 0xDDB8, 0xDDB9, 0xDDBA, 0xDDBB, 0xDDBC, 0xDDBD, 0xDDBE, 0xDDBF, /* 0x50 */
+ 0xDDC0, 0xDDC1, 0xDDC2, 0xDDC3, 0xDDC4, 0xDDC5, 0xDDC6, 0xDDC7, /* 0x60 */
+ 0xDDC8, 0xDDC9, 0xDDCA, 0xDDCB, 0xDDCC, 0xDDCD, 0xDDCE, 0xDDCF, /* 0x60 */
+ 0xDDD0, 0xDDD1, 0xDDD2, 0xDDD3, 0xDDD4, 0xDDD5, 0xDDD6, 0xDDD7, /* 0x70 */
+ 0xDDD8, 0xDDD9, 0xDDDA, 0xDDDB, 0xDDDC, 0xDDDD, 0xDDDE, 0xDDDF, /* 0x70 */
+ 0xDDE0, 0xDDE1, 0xDDE2, 0xDDE3, 0xDDE4, 0xDDE5, 0xDDE6, 0xDDE7, /* 0x80 */
+ 0xDDE8, 0xDDE9, 0xDDEA, 0xDDEB, 0xDDEC, 0xDDED, 0xDDEE, 0xDDEF, /* 0x80 */
+ 0xDDF0, 0xDDF1, 0xDDF2, 0xDDF3, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xDE31, 0xDE32, 0xDE33, 0xDE34, 0xDE35, 0xDE36, 0xDE37, /* 0xA0 */
+ 0xDE38, 0xDE39, 0xDE3A, 0xDE3B, 0xDE3C, 0xDE3D, 0xDE3E, 0xDE3F, /* 0xA0 */
+ 0xDE40, 0xDE41, 0xDE42, 0xDE43, 0xDE44, 0xDE45, 0xDE46, 0xDE47, /* 0xB0 */
+ 0xDE48, 0xDE49, 0xDE4A, 0xDE4B, 0xDE4C, 0xDE4D, 0xDE4E, 0xDE4F, /* 0xB0 */
+ 0xDE50, 0xDE51, 0xDE52, 0xDE53, 0xDE54, 0xDE55, 0xDE56, 0xDE57, /* 0xC0 */
+ 0xDE58, 0xDE59, 0xDE5A, 0xDE5B, 0xDE5C, 0xDE5D, 0xDE5E, 0xDE5F, /* 0xC0 */
+ 0xDE60, 0xDE61, 0xDE62, 0xDE63, 0xDE64, 0xDE65, 0xDE66, 0xDE67, /* 0xD0 */
+ 0xDE68, 0xDE69, 0xDE6A, 0xDE6B, 0xDE6C, 0xDE6D, 0xDE6E, 0xDE6F, /* 0xD0 */
+ 0xDE70, 0xDE71, 0xDE72, 0xDE73, 0xDE74, 0xDE75, 0xDE76, 0xDE77, /* 0xE0 */
+ 0xDE78, 0xDE79, 0xDE7A, 0xDE7B, 0xDE7C, 0xDE7D, 0xDE7E, 0xDE91, /* 0xE0 */
+ 0xDE92, 0xDE93, 0xDE94, 0xDE95, 0xDE96, 0xDE97, 0xDE98 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_31[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8841, 0x8C41, 0x8444, 0x9041, 0x8446, 0x8447, 0x9441, /* 0x30 */
+ 0x9841, 0x9C41, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, /* 0x30 */
+ 0x8450, 0xA041, 0xA441, 0xA841, 0x8454, 0xAC41, 0xB041, 0xB441, /* 0x40 */
+ 0xB841, 0xBC41, 0xC041, 0xC441, 0xC841, 0xCC41, 0xD041, 0x8461, /* 0x40 */
+ 0x8481, 0x84A1, 0x84C1, 0x84E1, 0x8541, 0x8561, 0x8581, 0x85A1, /* 0x50 */
+ 0x85C1, 0x85E1, 0x8641, 0x8661, 0x8681, 0x86A1, 0x86C1, 0x86E1, /* 0x50 */
+ 0x8741, 0x8761, 0x8781, 0x87A1, 0xDAD4, 0xDAD5, 0xDAD6, 0xDAD7, /* 0x60 */
+ 0xDAD8, 0xDAD9, 0xDADA, 0xDADB, 0xDADC, 0xDADD, 0xDADE, 0xDADF, /* 0x60 */
+ 0xDAE0, 0xDAE1, 0xDAE2, 0xDAE3, 0xDAE4, 0xDAE5, 0xDAE6, 0xDAE7, /* 0x70 */
+ 0xDAE8, 0xDAE9, 0xDAEA, 0xDAEB, 0xDAEC, 0xDAED, 0xDAEE, 0xDAEF, /* 0x70 */
+ 0xDAF0, 0xDAF1, 0xDAF2, 0xDAF3, 0xDAF4, 0xDAF5, 0xDAF6, 0xDAF7, /* 0x80 */
+ 0xDAF8, 0xDAF9, 0xDAFA, 0xDAFB, 0xDAFC, 0xDAFD, 0xDAFE /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDD41, 0xDD42, 0xDD43, 0xDD44, 0xDD45, 0xDD46, 0xDD47, 0xDD48, /* 0x00 */
+ 0xDD49, 0xDD4A, 0xDD4B, 0xDD4C, 0xDD4D, 0xDD4E, 0xDD4F, 0xDD50, /* 0x00 */
+ 0xDD51, 0xDD52, 0xDD53, 0xDD54, 0xDD55, 0xDD56, 0xDD57, 0xDD58, /* 0x10 */
+ 0xDD59, 0xDD5A, 0xDD5B, 0xDD5C, 0xD9DF, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xDCB1, 0xDCB2, 0xDCB3, 0xDCB4, 0xDCB5, 0xDCB6, 0xDCB7, 0xDCB8, /* 0x60 */
+ 0xDCB9, 0xDCBA, 0xDCBB, 0xDCBC, 0xDCBD, 0xDCBE, 0xDCBF, 0xDCC0, /* 0x60 */
+ 0xDCC1, 0xDCC2, 0xDCC3, 0xDCC4, 0xDCC5, 0xDCC6, 0xDCC7, 0xDCC8, /* 0x70 */
+ 0xDCC9, 0xDCCA, 0xDCCB, 0xDCCC, 0, 0, 0, 0xD9DE /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDC59, 0xDC5A, 0xDC5B, 0xDC5C, 0xDC5D, 0, 0, 0, /* 0x80 */
+ 0xDC4A, 0xDC4B, 0xDC6C, 0xDC6D, 0xDC6E, 0xDC46, 0xDC47, 0xDC48, /* 0x80 */
+ 0xDC64, 0xDC65, 0xDC66, 0xDC67, 0xDC68, 0xDC31, 0xDC32, 0xDC33, /* 0x90 */
+ 0xDC35, 0xDC3B, 0xDC3C, 0xDC3D, 0xDC3E, 0xDC3F, 0xDC40, 0xDC41, /* 0x90 */
+ 0xDC42, 0xDC43, 0xDC44, 0xDC37, 0xDC38, 0xDC39, 0xDC3A, 0xDC4D, /* 0xA0 */
+ 0xDC4E, 0xDC75, 0xDC76, 0xDC77, 0xDC78, 0xDC71, 0xDC72, 0xDC73, /* 0xA0 */
+ 0xDC4F, 0xDC50, 0xDC51, 0xDC52, 0xDC53, 0xDC54, 0xDC55, 0xDC56, /* 0xB0 */
+ 0xDC57, 0xDC58, 0xDC5E, 0xDC5F, 0xDC60, 0xDC61, 0xDC62, 0xDC63, /* 0xB0 */
+ 0xDC6A, 0xDC6B, 0xD9E3, 0xDC7C, 0xDC36, 0xDC70, 0xDC91, 0xD9E1, /* 0xC0 */
+ 0xDC4C, 0xDC7D, 0xDC45, 0, 0, 0, 0, 0xDC49, /* 0xC0 */
+ 0xDC7A, 0, 0, 0xDC7B, 0, 0, 0xDC6F, 0, /* 0xD0 */
+ 0xD9E4, 0, 0, 0xDC74, 0xDC7E, 0xDC79 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF179, 0xF2CB, 0, 0xF662, 0, 0, 0, 0xE742, /* 0x00 */
+ 0xF1DB, 0xEAB2, 0xEABE, 0xF7BB, 0, 0xE996, 0, 0, /* 0x00 */
+ 0, 0xF5E4, 0, 0, 0xF4A6, 0xE9E0, 0xEBA6, 0, /* 0x10 */
+ 0xE29A, 0xE940, 0, 0, 0, 0, 0xECAA, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF3E9, 0, 0, /* 0x20 */
+ 0, 0, 0xE1FA, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xF93F, 0xE4A1, 0, 0xF3AB, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xEED1, 0xE43C, 0, 0xE29B, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF3FD, 0, 0xEA4F, 0xF8BA, 0xF7B9, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xE262, 0, /* 0x50 */
+ 0xECAB, 0xF0E0, 0, 0, 0, 0xE29C, 0xE0F7, 0xEDA5, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE071, 0, 0xE55C, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xF071, 0, 0, 0xE973, 0xEAAD, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE0EB, 0, /* 0x70 */
+ 0, 0, 0xE5AF, 0, 0, 0, 0xE697, 0, /* 0x80 */
+ 0xEDF8, 0, 0, 0xEA50, 0xF133, 0, 0xEFCD, 0, /* 0x80 */
+ 0xF037, 0xEFF6, 0xF8BB, 0, 0xEEE9, 0xF2CC, 0, 0, /* 0x90 */
+ 0xE376, 0, 0, 0xEA51, 0, 0, 0xED3C, 0, /* 0x90 */
+ 0, 0xE75C, 0xF7F1, 0, 0xE26F, 0xF834, 0xEE42, 0, /* 0xA0 */
+ 0xF89D, 0, 0, 0xF84D, 0xE158, 0xF2CD, 0xE5D5, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xE4A2, 0, /* 0xB0 */
+ 0, 0, 0xF161, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xED37, 0xF162, 0, 0, 0xF641, 0, 0, 0xE29D, /* 0xC0 */
+ 0, 0, 0xE361, 0xE0BF, 0, 0xF1A4, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xF1A8, 0xEA52, 0xF672, 0xF1DC, /* 0xD0 */
+ 0xE997, 0xEB49, 0, 0, 0, 0xE55E, 0, 0xF545, /* 0xD0 */
+ 0, 0, 0, 0xE4DB, 0xE645, 0xF134, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xED76, 0, 0xF3EA, 0, 0, 0, 0xE0EC, 0xE0C0, /* 0xF0 */
+ 0, 0, 0, 0xF194 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE37A, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xF7F2, 0xF135, 0xE36F, 0, 0xEEEA, 0xE37B, 0xE961, /* 0x00 */
+ 0xE8E9, 0xF9CC, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8D7, /* 0x20 */
+ 0, 0, 0, 0, 0xE871, 0, 0xE646, 0, /* 0x30 */
+ 0xECDF, 0, 0xEA53, 0, 0xEA54, 0xE031, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xF27C, 0, 0, 0xE4A3, 0xF247, /* 0x40 */
+ 0xF75F, 0, 0, 0, 0, 0xF058, 0xF248, 0xF3AC, /* 0x40 */
+ 0xF3A5, 0xEFCE, 0, 0, 0, 0xF7BC, 0, 0, /* 0x50 */
+ 0, 0xEDF9, 0xF17A, 0xE9D6, 0xF1C2, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xF735, 0, 0, 0, 0, 0, 0xEDBA, /* 0x60 */
+ 0xE8D8, 0, 0, 0xE032, 0, 0, 0xE3CD, 0, /* 0x70 */
+ 0, 0, 0xF27D, 0, 0, 0, 0xF17B, 0xEA55, /* 0x70 */
+ 0, 0xECE0, 0, 0xE059, 0xF479, 0, 0xE5CE, 0, /* 0x80 */
+ 0xF646, 0, 0xE252, 0xE657, 0, 0xECB4, 0, 0xF3AD, /* 0x80 */
+ 0, 0xF072, 0, 0, 0, 0, 0xE6C2, 0, /* 0x90 */
+ 0xF4A7, 0, 0, 0xE1EA, 0, 0xF0EE, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xE7B2, 0xF9A5, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xF665, 0xE5E2, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF745, /* 0xB0 */
+ 0, 0, 0xE197, 0xF5B5, 0xED3D, 0, 0, 0, /* 0xC0 */
+ 0, 0xEEEB, 0xF3D5, 0, 0, 0, 0xF34B, 0, /* 0xC0 */
+ 0, 0xEFB5, 0, 0xE159, 0xF865, 0, 0, 0xEBD4, /* 0xD0 */
+ 0, 0, 0xE6D6, 0, 0, 0xE951, 0, 0xEA56, /* 0xD0 */
+ 0xF891, 0xECE1, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xEBF3, 0xE998, /* 0xE0 */
+ 0, 0xE29E, 0, 0xE8C4, 0, 0xF793, 0, 0, /* 0xF0 */
+ 0xE974, 0, 0xEDEF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE941, 0, 0, 0, 0xE5D6, 0, /* 0x00 */
+ 0, 0xF4DA, 0, 0xE0C1, 0, 0xE8C3, 0, 0, /* 0x00 */
+ 0, 0xE7FA, 0xE4EE, 0, 0, 0, 0xF848, 0, /* 0x10 */
+ 0, 0xF9A6, 0xF0EF, 0, 0xF536, 0, 0xE15A, 0xF4A8, /* 0x10 */
+ 0, 0xF4DB, 0, 0xE8A7, 0xF647, 0, 0xE2E6, 0xF394, /* 0x20 */
+ 0xE0DA, 0, 0xEED2, 0xE6C3, 0xF692, 0xEF6E, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xEDA6, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xEDE7, 0, 0, 0, 0xE033, /* 0x40 */
+ 0xE137, 0xF059, 0, 0, 0, 0, 0, 0xF746, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF835, 0, 0, /* 0x50 */
+ 0, 0, 0xF3AE, 0, 0xF2CE, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xE0ED, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xF640, 0xF2CF, 0xEFCF, 0, /* 0x70 */
+ 0xF6DE, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE263, 0, 0, 0, 0, 0xE999, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xE8A8, 0, 0, /* 0x80 */
+ 0, 0xE0F8, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xEAA1, 0xE9E1, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xF5CA, 0xEFB6, 0, 0, /* 0xA0 */
+ 0, 0, 0xEEEC, 0xF27E, 0, 0xF4F0, 0, 0xEABF, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xE15B, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xE351, 0, 0, /* 0xC0 */
+ 0, 0xF562, 0xEB4A, 0, 0, 0, 0, 0xEAC0, /* 0xC0 */
+ 0, 0xE270, 0, 0, 0, 0xE962, 0xF9EA, 0, /* 0xD0 */
+ 0, 0, 0xE698, 0, 0, 0, 0xF05A, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xEF79, 0, 0xECAC, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF4D0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xE034, 0, 0xE8F8, 0, 0, 0, 0xEA57 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0F0, 0xF3D6, 0, 0, 0xEDE2, 0, 0xE15C, 0, /* 0x00 */
+ 0, 0xE0FB, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF073, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEAC1, /* 0x10 */
+ 0, 0xE67D, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xEFD0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF249, 0, 0, 0, 0, 0xE5E3, /* 0x30 */
+ 0, 0, 0xE3D3, 0, 0xEDF0, 0, 0, 0, /* 0x30 */
+ 0xEF44, 0xF0C3, 0, 0xF03A, 0xF89E, 0xF5F6, 0xF34C, 0xF9D4, /* 0x40 */
+ 0xEB4B, 0xE253, 0, 0xE34A, 0xF6BA, 0xE795, 0xF6CD, 0, /* 0x40 */
+ 0, 0, 0xED3E, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xE56F, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE377, 0, 0, 0xF19F, 0, 0xE43E, /* 0x60 */
+ 0xF291, 0xE5D7, 0xF074, 0xF732, 0xE1EB, 0xE6BF, 0xF8B1, 0, /* 0x60 */
+ 0, 0xE1EC, 0, 0, 0, 0xE942, 0xE37C, 0xE29F, /* 0x70 */
+ 0xF292, 0, 0, 0, 0xE152, 0, 0, 0, /* 0x70 */
+ 0xE37D, 0, 0, 0, 0, 0, 0xEDF7, 0, /* 0x80 */
+ 0, 0, 0xF4FC, 0, 0, 0xF232, 0, 0, /* 0x80 */
+ 0, 0, 0xE7B3, 0, 0, 0xE796, 0, 0xEFB7, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xE23E, 0, 0, 0, 0, 0xE7A2, 0, 0, /* 0xA0 */
+ 0, 0, 0xE793, 0, 0xE55F, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xEDA7, 0xE5D2, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xE639, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF532, 0, 0xF3D7, 0, /* 0xC0 */
+ 0, 0xE5D8, 0, 0xF34D, 0xE6D0, 0xE560, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE6CF, 0xF0EA, 0xF9EB, 0, /* 0xD0 */
+ 0, 0xE8ED, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF955, 0xE0C2, 0, 0, 0, 0, 0xF9D5, 0, /* 0xF0 */
+ 0xF558, 0xEF7A, 0xF5F3, 0, 0, 0xF7DE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4EF, 0, 0, 0xF163, 0, 0, 0xE9C2, 0xF2B7, /* 0x00 */
+ 0xEED4, 0, 0xE05A, 0, 0, 0, 0xE7FB, 0, /* 0x00 */
+ 0, 0xF89F, 0, 0, 0, 0, 0, 0xE63A, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF59A, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xF6F7, 0xE93C, 0, 0, /* 0x20 */
+ 0, 0xE6D7, 0xEAA2, 0, 0, 0, 0xE24E, 0, /* 0x20 */
+ 0xE4F0, 0, 0, 0, 0, 0, 0xF334, 0xEBEC, /* 0x30 */
+ 0xE2E7, 0xF4CB, 0xF1A9, 0xE04E, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xF591, 0, 0, 0, 0xF65E, /* 0x40 */
+ 0, 0, 0xEA9D, 0xE34B, 0xE5B7, 0xF293, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF538, 0, 0xE99A, 0, /* 0x50 */
+ 0, 0, 0, 0xE0A7, 0, 0xE85E, 0, 0, /* 0x50 */
+ 0, 0xEB76, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xF1A5, 0xF294, 0, 0, 0, 0, 0xE99B, /* 0x60 */
+ 0, 0, 0xF7DC, 0, 0, 0xF4DC, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF794, 0, 0xF59B, /* 0x70 */
+ 0, 0, 0, 0xF993, 0, 0, 0, 0xE34C, /* 0x80 */
+ 0xE8F9, 0xE6B1, 0, 0, 0, 0xE0FC, 0, 0, /* 0x80 */
+ 0, 0xF335, 0xE0FD, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE5F4, 0, 0, 0, 0xE1ED, /* 0x90 */
+ 0xE035, 0, 0, 0xE63B, 0xE352, 0, 0, 0, /* 0xA0 */
+ 0, 0xF34E, 0xE44D, 0xE134, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xF846, 0, /* 0xB0 */
+ 0, 0xE15D, 0, 0xE89C, 0, 0xF65F, 0, 0xEFB8, /* 0xC0 */
+ 0, 0xE797, 0, 0, 0, 0xE15E, 0, 0, /* 0xC0 */
+ 0, 0, 0xE6CD, 0, 0, 0xE561, 0xEFED, 0, /* 0xD0 */
+ 0xE07B, 0xE7E2, 0, 0xF9B2, 0, 0xECAD, 0xE65C, 0xE7B4, /* 0xD0 */
+ 0, 0, 0xEBA7, 0xF263, 0xE353, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF9B3, 0, 0xE5E4, 0, 0, /* 0xF0 */
+ 0xE2E8, 0, 0xF1C3, 0xE342, 0, 0, 0xE2A0, 0xE838 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF760, 0, 0, /* 0x00 */
+ 0xF9D6, 0, 0, 0, 0, 0xF761, 0, 0xF762, /* 0x00 */
+ 0xE963, 0, 0, 0, 0, 0xE9E2, 0xF8F9, 0xE9C1, /* 0x10 */
+ 0, 0xECB5, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF1DD, 0xE254, 0, 0xE0A1, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE9E3, 0, 0, 0, 0, 0xF96D, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF7AF, 0, 0, 0, 0, 0, 0xE49D, /* 0x30 */
+ 0xE2A1, 0xED38, 0, 0xF546, 0xF1A0, 0, 0, 0xECAE, /* 0x40 */
+ 0xEEED, 0xF9C1, 0xE872, 0, 0, 0xE743, 0, 0, /* 0x40 */
+ 0, 0xE9E4, 0xF391, 0xF693, 0xF892, 0, 0, 0xE3F5, /* 0x50 */
+ 0, 0, 0xE85F, 0, 0xE964, 0, 0xE936, 0, /* 0x50 */
+ 0xF2BF, 0, 0, 0, 0, 0, 0xE25F, 0, /* 0x60 */
+ 0xEB69, 0, 0, 0, 0, 0, 0, 0xE7D6, /* 0x60 */
+ 0xF164, 0xF05B, 0, 0, 0xE04F, 0xE5B0, 0, 0xE2E9, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF3ED, 0, 0xE15F, /* 0x70 */
+ 0, 0, 0, 0, 0xED9A, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xED7D, 0, 0, 0, 0, /* 0x90 */
+ 0xE6D8, 0, 0xF9A7, 0, 0, 0, 0, 0xF03B, /* 0x90 */
+ 0xF642, 0, 0, 0, 0, 0xE2F0, 0xF7BD, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xEE96, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE0DB, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF4D1, 0, 0, 0, 0, /* 0xC0 */
+ 0xEFD1, 0xF4A9, 0xE370, 0xEFD2, 0, 0xE873, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xEC62, 0, 0xF632, 0xEBF4, /* 0xD0 */
+ 0, 0, 0, 0xE874, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xEED5, 0xF5BF, 0xE2A2, 0xE1AF, 0xE2A3, 0, 0, /* 0xE0 */
+ 0, 0xE1B0, 0xF3FE, 0xE333, 0xEBAF, 0xF733, 0, 0xE036, /* 0xE0 */
+ 0xF6BB, 0xF47A, 0xEA58, 0xEFD3, 0, 0, 0, 0, /* 0xF0 */
+ 0xEA59 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF9DE, 0xE050, 0, 0, 0, /* 0x00 */
+ 0xF7EA, 0xE3CE, 0xF264, 0, 0xE562, 0xE7A3, 0xF9A8, 0xE6D9, /* 0x00 */
+ 0xF6CE, 0xF84E, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE2D6, 0, 0xE6F0, 0, 0xF0E1, /* 0x10 */
+ 0xF755, 0, 0, 0, 0, 0, 0xE99C, 0, /* 0x20 */
+ 0, 0xE9C3, 0, 0xF7DF, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xEEEF, 0, 0, 0, 0, /* 0x30 */
+ 0xF9E5, 0xF633, 0, 0xE7FC, 0xF9A9, 0, 0xEEEE, 0, /* 0x30 */
+ 0, 0, 0xE5E5, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xF2D0, 0, 0xE1B1, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF6A2, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xF3B2, 0, 0xF3B1, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE1B2, 0, 0xE83B, 0, 0xE037, 0, 0, /* 0x70 */
+ 0, 0, 0, 0xECE2, 0xF8BC, 0xE7A4, 0, 0, /* 0x70 */
+ 0xF24A, 0, 0, 0, 0, 0, 0xF763, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xF8FA, 0, 0xE2A4, 0, /* 0x80 */
+ 0xE99D, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF673, 0, 0, 0, /* 0xA0 */
+ 0xF1AA, 0, 0, 0xF431, 0xE271, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF836, 0, 0, 0, 0, /* 0xB0 */
+ 0xF7E0, 0, 0, 0, 0, 0xF166, 0, 0, /* 0xB0 */
+ 0xED7E, 0xF7A1, 0, 0, 0xF8EF, 0, 0, 0, /* 0xC0 */
+ 0xF7EB, 0xF233, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xF03C, 0, 0, 0, 0xE038, 0, 0, /* 0xE0 */
+ 0xF59C, 0, 0, 0, 0, 0xE1D6, 0xF998, 0, /* 0xE0 */
+ 0, 0, 0xF559, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xF764 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF736, 0, 0xEA5A, 0xF456, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE6DA, 0, /* 0x00 */
+ 0xE4D0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xE755, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF076, /* 0x20 */
+ 0, 0xF4DD, 0, 0, 0, 0xED6A, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xF674, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF694, 0, 0xEAC2, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7FD, /* 0x40 */
+ 0, 0, 0, 0xE198, 0, 0, 0xE4BA, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xED3F, 0, /* 0x50 */
+ 0, 0, 0, 0xF7E1, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF336, 0, 0, 0, /* 0x70 */
+ 0xE0D3, 0, 0, 0, 0xEB4C, 0, 0xF55A, 0xE59C, /* 0x80 */
+ 0, 0xF9AA, 0xF7E2, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xF547, 0xF9C2, 0xF940, 0, 0xF9EC, 0xE072, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF9BD, /* 0xA0 */
+ 0, 0xF077, 0xEAC3, 0xE3D2, 0xE272, 0, 0xE4A4, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xF9AB, 0, 0xEAE0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xF457, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xEEF0, 0, 0xE37E, 0, 0, 0xF4AA, /* 0xD0 */
+ 0, 0, 0, 0xEA5B, 0xF648, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xEBF5, 0xF3B3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF6A3, 0, /* 0x00 */
+ 0, 0xE039, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xE2A5, 0, 0, 0xEAC4, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEBB0, /* 0x20 */
+ 0, 0, 0xF34F, 0, 0xF634, 0, 0xECB6, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF856, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xE391, 0, 0, 0xF9ED, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE9C4, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xF999, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xEE4F, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xEA3D, 0, 0xF84F, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xEDF1, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF1C4, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE435, 0, 0, 0xF9EE, 0, 0, /* 0xC0 */
+ 0, 0xF5B6, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xEBF6, 0xEA5C, 0, 0, 0xF96E, 0, /* 0xD0 */
+ 0xF167, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE1DD, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xE647, 0xE1B3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF765, 0xEDD8, 0, 0, 0, /* 0x00 */
+ 0xE2EA, 0, 0, 0xE2D0, 0, 0xF05C, 0, 0, /* 0x00 */
+ 0, 0, 0xF03E, 0xF03D, 0, 0, 0xE4F1, 0, /* 0x10 */
+ 0xE4A5, 0, 0, 0, 0, 0, 0, 0xF6CF, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xF234, 0, 0, 0, 0, 0xE334, 0, 0, /* 0x20 */
+ 0xF432, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE392, 0, 0, 0, 0, /* 0x30 */
+ 0xF433, 0, 0xF6F8, 0, 0, 0, 0, 0xE343, /* 0x40 */
+ 0, 0, 0xE8A9, 0, 0, 0xE4BB, 0xE07C, 0, /* 0x40 */
+ 0xF3A6, 0xE0D5, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF6E7, 0, 0, 0xE1DE, 0, 0xF6A4, 0, /* 0x60 */
+ 0, 0, 0xF750, 0, 0, 0, 0xE4DD, 0, /* 0x60 */
+ 0xE160, 0, 0, 0, 0, 0xE2A6, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF695, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xEBF7, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE4DC, 0, 0, 0xF8A0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF837, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xF0D9, 0, 0xE2A7, 0xF03F, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xED91, 0, 0, 0, 0xEFB9, /* 0xC0 */
+ 0xF3D8, 0, 0, 0xE768, 0, 0, 0xEB94, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEE44, /* 0xD0 */
+ 0xE99E, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF4F1, 0, 0, 0, 0xECD0, 0, 0, 0xF49D, /* 0xF0 */
+ 0, 0xE8C6, 0xE393, 0, 0xE394 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2DC, 0, 0xE4D1, 0, 0, 0xE141, 0xF6D8, 0, /* 0x00 */
+ 0xE0A8, 0xF0BC, 0xED4E, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xF56C, 0, /* 0x10 */
+ 0, 0xE952, 0, 0, 0xF337, 0, 0, 0xEE50, /* 0x20 */
+ 0, 0, 0xE07D, 0, 0, 0, 0, 0xEF7B, /* 0x20 */
+ 0xEDE8, 0xE953, 0, 0, 0xF1DE, 0xE4F2, 0, 0, /* 0x30 */
+ 0, 0, 0xE199, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xE264, 0xEEAB, 0, 0, 0, 0xE0C3, /* 0x40 */
+ 0, 0xEBB1, 0, 0, 0xF6B2, 0, 0, 0xE4F3, /* 0x50 */
+ 0xE4D2, 0, 0xF5C0, 0, 0, 0, 0xEADD, 0, /* 0x50 */
+ 0, 0xF295, 0xEEF1, 0, 0xF9B4, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF458, 0, 0, /* 0x70 */
+ 0, 0xF4D2, 0, 0, 0xF296, 0, 0xEC63, 0, /* 0x70 */
+ 0, 0, 0, 0xE161, 0, 0xEAEA, 0, 0, /* 0x80 */
+ 0, 0xEFBA, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xE7D7, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF5CD, 0, 0xF3F2, 0xF857, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE7F8, 0xE552, 0, 0, 0, 0, 0xF675, 0, /* 0xA0 */
+ 0, 0, 0, 0xE9C5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xEEF2, 0xF1DF, 0, 0, 0xE05B, 0, /* 0xB0 */
+ 0, 0xE8FA, 0, 0, 0, 0xEF45, 0, 0xE4A6, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xF9B5, 0, /* 0xC0 */
+ 0, 0xF7C9, 0, 0xED72, 0, 0xF8BD, 0, 0, /* 0xD0 */
+ 0xE6A4, 0xE255, 0, 0, 0, 0, 0xE265, 0xE676, /* 0xD0 */
+ 0, 0, 0, 0, 0xEDBD, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xEA5D, 0xF195, 0, 0, 0xF1E0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xF17C, 0xF8BE, 0xEAEB, 0, 0xEBF8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF7BE, /* 0x00 */
+ 0, 0, 0, 0, 0xE395, 0xEB3A, 0xEF72, 0, /* 0x10 */
+ 0, 0xEC64, 0xE49F, 0, 0xEDA8, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xE7D3, 0, 0, 0, 0, 0xE4DE, /* 0x20 */
+ 0, 0xF548, 0xF6BC, 0xE99F, 0, 0xEF7C, 0xED77, 0, /* 0x20 */
+ 0, 0xECF7, 0, 0, 0, 0, 0, 0xF138, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xF893, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xEDF2, 0, 0, 0xE396, /* 0x40 */
+ 0xE43F, 0xE975, 0, 0, 0, 0, 0xE335, 0xF3B4, /* 0x40 */
+ 0xF941, 0xE19A, 0, 0, 0xE9C6, 0xF861, 0, 0xF6DF, /* 0x50 */
+ 0, 0, 0xF838, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF297, 0, 0xEA5E, 0, 0, 0, 0, 0xEEF3, /* 0x60 */
+ 0, 0, 0xF6AC, 0xF0C4, 0xF1E1, 0xEB3B, 0xE9C7, 0, /* 0x60 */
+ 0, 0, 0, 0xE443, 0xE44F, 0, 0, 0, /* 0x70 */
+ 0xE05C, 0, 0, 0, 0, 0xF8BF, 0, 0, /* 0x70 */
+ 0, 0, 0xEDFD, 0xE9E5, 0xE75D, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xF196, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xE397, 0, 0, 0xEF7D, 0xE362, /* 0x90 */
+ 0, 0xE7D8, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF676, 0, 0, /* 0xA0 */
+ 0xE8AA, 0, 0, 0, 0xF6E0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE769, 0, 0xF533, 0, 0, 0xF56D, 0, /* 0xB0 */
+ 0, 0, 0, 0xF2D1, 0, 0, 0xE7B5, 0, /* 0xC0 */
+ 0, 0xF1AB, 0, 0xECB7, 0, 0, 0, 0, /* 0xC0 */
+ 0xF24B, 0xE1B4, 0, 0xEB95, 0xF05D, 0, 0, 0, /* 0xD0 */
+ 0, 0xF197, 0xEF7E, 0, 0xE0A9, 0xF3AF, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE05D, 0, /* 0xE0 */
+ 0xF139, 0, 0xF47B, 0, 0xF9EF, 0, 0xF7F3, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xEE51, 0, 0, 0xF168, 0, 0, 0, 0xF1AC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF05E, 0, 0xEF6F, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xEA5F, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE436, 0, 0, 0xEEF4, 0xE3D6, 0, 0, 0xEE52, /* 0x10 */
+ 0xECE3, 0, 0, 0, 0, 0xED40, 0, 0, /* 0x20 */
+ 0, 0xE744, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xF635, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF4DE, 0, 0, 0, /* 0x30 */
+ 0, 0xE6A5, 0, 0, 0, 0, 0xF6E8, 0, /* 0x40 */
+ 0, 0xEF56, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xF8E6, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE9E6, 0, 0, 0, 0xE9A0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE76A, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE83C, 0xF040, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xECB8, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE03A, 0xEBF9, 0, 0xF041, 0, 0, 0, /* 0xC0 */
+ 0, 0xF47C, 0, 0, 0xF87E, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xF265, 0, 0, 0, 0, 0xF7F4, 0, /* 0xE0 */
+ 0, 0xE47C /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF8FB, 0, 0, /* 0x00 */
+ 0, 0xF9F0, 0, 0xEB4D, 0xE273, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xF756, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xEA3E, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xEAC5, 0, 0, 0xEDBE, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xF1AD, 0xF87A, 0, 0, 0xE1EE, 0xF1A6, 0, 0xF1AE, /* 0x50 */
+ 0xF37D, 0, 0xE9A1, 0, 0xF1AF, 0xF99A, 0, 0xE77B, /* 0x50 */
+ 0, 0, 0, 0xE19B, 0xE1B5, 0, 0, 0, /* 0x60 */
+ 0, 0xF839, 0, 0xEBDD, 0, 0, 0, 0, /* 0x60 */
+ 0xEC65, 0xF1CF, 0, 0, 0, 0xE9A2, 0, 0, /* 0x70 */
+ 0xF7CA, 0, 0xF078, 0, 0xEDED, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE4EB, 0, 0xEFD4, /* 0x80 */
+ 0xEBFA, 0xED5C, 0, 0xEBE4, 0xEF57, 0, 0, 0xE26B, /* 0x80 */
+ 0, 0, 0, 0xE965, 0, 0xF6B5, 0xF995, 0xF395, /* 0x90 */
+ 0xE23F, 0xF3B5, 0xF2D2, 0xEF58, 0xF0F1, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE0D4, 0xEB4E, 0xECF8, 0xF079, 0xF942, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xEB96, 0, 0xE2E0, 0, /* 0xA0 */
+ 0xF235, 0, 0, 0xF83A, 0xEE53, 0xEBB2, 0xE03B, 0, /* 0xB0 */
+ 0xECE4, 0xEFBB, 0, 0, 0, 0, 0, 0xEC66, /* 0xB0 */
+ 0xF4F2, 0, 0xF266, 0xF042, 0xE398, 0xF169, 0xE85B, 0xE2A8, /* 0xC0 */
+ 0, 0, 0, 0, 0xE9A3, 0, 0, 0, /* 0xC0 */
+ 0xE76B, 0, 0xF7CE, 0xEFD5, 0xECD1, 0, 0, 0xE44C, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE73C, 0xF4CC, /* 0xD0 */
+ 0, 0xE1FB, 0xF666, 0, 0xEEF5, 0xEF91, 0xECF9, 0xE44B, /* 0xE0 */
+ 0xF4F3, 0xECFB, 0, 0xEA60, 0xE240, 0, 0xE699, 0xF3D9, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF5C1, 0xE954, 0, /* 0xF0 */
+ 0xF5BB, 0, 0xEA61 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE976, 0, 0, 0xEA62, 0, 0, 0xF1E2, /* 0x00 */
+ 0xF298, 0xF05F, 0xF37E, 0xECFC, 0, 0xE4DF, 0xE4F4, 0xEBB3, /* 0x00 */
+ 0, 0xEBB4, 0, 0, 0, 0, 0xF563, 0, /* 0x10 */
+ 0, 0xEAC6, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xEFD6, 0, 0, 0, /* 0x20 */
+ 0xE8AB, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xF636, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xECB9, 0xF0C5, 0xF539, 0xE1B6, 0xE49B, 0, 0xE83D, 0xE473, /* 0x30 */
+ 0xE2D1, 0, 0, 0, 0, 0xE0DC, 0xE19C, 0, /* 0x40 */
+ 0xE2DD, 0, 0, 0xEF39, 0, 0xECBB, 0xECBA, 0, /* 0x40 */
+ 0, 0xEB6A, 0, 0, 0, 0xF299, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE943, 0, 0, 0, 0, /* 0x50 */
+ 0xE4F5, 0, 0xE6A6, 0, 0xF645, 0xE6DB, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xEBD5, 0, 0, 0xE57A, /* 0x60 */
+ 0, 0xEAA3, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF9DF, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE399, 0xF1D4, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE0AA, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xED6B, 0, 0xEBFB, 0xE0A2, 0, 0, 0, /* 0xA0 */
+ 0, 0xE4E0, 0, 0xED4F, 0, 0xF8C0, 0, 0xE84E, /* 0xB0 */
+ 0xED5D, 0, 0xE649, 0, 0, 0, 0xF2C0, 0, /* 0xB0 */
+ 0xEBFC, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xF649, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xEAC7, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xED41, 0, 0, 0, 0, 0, 0, 0xE977, /* 0xE0 */
+ 0xE978, 0, 0, 0, 0xF866, 0, 0xE4F6, 0, /* 0xF0 */
+ 0, 0, 0, 0xF3DA, 0, 0xF894 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEC9F, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE5CF, 0xE39A, 0, /* 0x00 */
+ 0, 0xE1DF, 0, 0, 0xF5CB, 0, 0xED92, 0xE0AB, /* 0x10 */
+ 0, 0xE6C4, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xECA0, /* 0x20 */
+ 0, 0xE9DA, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xE83E, 0xE07E, 0, 0, 0, /* 0x40 */
+ 0xE5B9, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xECA1, 0, 0, 0xEF73, 0, 0, 0xF4AB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2A9, /* 0x80 */
+ 0, 0, 0, 0xE4F7, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xE593, 0, 0, /* 0x90 */
+ 0xE274, 0, 0xEF94, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xEDF5, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xEEAE, 0, 0xE64A, 0, 0xEAEC, 0xED50, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xEF74, 0, 0, /* 0xC0 */
+ 0, 0, 0xE745, 0, 0, 0, 0xED6C, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xF549, 0xF3B6, 0, /* 0xD0 */
+ 0, 0xEC6E, 0xEBB5, 0, 0, 0xE1EF, 0xF3A7, 0xE275, /* 0xE0 */
+ 0xE0DD, 0, 0, 0xE7E3, 0, 0, 0xF4AC, 0, /* 0xE0 */
+ 0, 0xE39B, 0xF13B, 0xEA63, 0xF6E9, 0, 0, 0xF7F5, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xEBDE, 0xE0EE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xECBC, 0xF766, 0, 0, 0xE8EE, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xF9F1, 0, 0, 0, /* 0x00 */
+ 0, 0xF6B6, 0, 0, 0, 0, 0xF56E, 0, /* 0x10 */
+ 0, 0xF47D, 0, 0xE8D9, 0, 0xF338, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xEBFD, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xEA64, 0, 0xEB3C, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xF1E3, 0, 0, 0xE4E1, 0, /* 0x30 */
+ 0xEAC8, 0, 0, 0, 0, 0xE7B6, 0, 0xF9AC, /* 0x30 */
+ 0xF2D3, 0, 0, 0, 0xED51, 0xF77B, 0, 0xE8AC, /* 0x40 */
+ 0, 0, 0, 0, 0xF956, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE73D, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF64A, /* 0x50 */
+ 0, 0xE8DF, 0xE4D3, 0xF757, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE05E, 0xF751, 0xE444, 0, 0, 0xE944, /* 0x70 */
+ 0xF849, 0xE05F, 0, 0xF943, 0xF07A, 0xF07B, 0xE39C, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF1E4, 0, 0, 0xE9E7, /* 0x80 */
+ 0, 0, 0xEAC9, 0, 0, 0, 0, 0xEAED, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xF24C, 0, 0xF2C1, /* 0x90 */
+ 0, 0, 0xE162, 0, 0xE9A4, 0, 0, 0, /* 0x90 */
+ 0xEACA, 0, 0, 0, 0, 0, 0xE4F8, 0xF3A8, /* 0xA0 */
+ 0, 0, 0, 0xE1B7, 0, 0xF2D4, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xED6D, 0xEAEE, 0xE0AC, /* 0xB0 */
+ 0xEFBC, 0, 0, 0, 0, 0, 0xF07C, 0, /* 0xB0 */
+ 0, 0, 0xEACB, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xF7BF, 0xE63F, 0xE5C6, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xE2AA, 0, 0, 0xE239, 0, 0, 0xE69A, 0, /* 0xD0 */
+ 0, 0, 0xF3B7, 0xF29A, 0, 0, 0, 0xE7D9, /* 0xD0 */
+ 0xF4DF, 0, 0xF758, 0xE256, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE5E6, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF576, 0, 0, 0xEE55, 0xF2D5, /* 0xF0 */
+ 0, 0, 0xE0EF, 0xF96F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE937, 0, 0, 0xE677, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF759, 0, 0, 0, 0, 0xECD2, /* 0x00 */
+ 0, 0xECBD, 0, 0xE2E1, 0xF350, 0xF16A, 0, 0xE9D7, /* 0x10 */
+ 0xF8F0, 0, 0, 0xF13C, 0, 0, 0, 0xF339, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xF867, 0xF8C1, /* 0x20 */
+ 0, 0xE450, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xEDB0, 0, 0, 0, 0xF1E5, 0, 0, /* 0x30 */
+ 0, 0, 0xE0AD, 0, 0xF7B0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xF6A5, 0, 0xE0AE, 0, 0xE83F, 0, 0xE746, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xE4A7, 0xF8B2, /* 0x50 */
+ 0, 0xF9C4, 0, 0xF13D, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xF8A1, 0, 0, 0, 0xEDE9, 0xEFEE, /* 0x60 */
+ 0, 0xF4F4, 0xF795, 0xF351, 0xEA3F, 0xF740, 0, 0, /* 0x60 */
+ 0xF4E0, 0xEEAF, 0, 0, 0, 0, 0, 0xE8AD, /* 0x70 */
+ 0, 0xEE45, 0, 0, 0xF7A8, 0, 0, 0xE9D8, /* 0x70 */
+ 0xEF69, 0xF2D6, 0, 0, 0, 0xE4E2, 0, 0xEC6F, /* 0x80 */
+ 0, 0, 0xF970, 0xE6C8, 0xF9AD, 0, 0, 0, /* 0x80 */
+ 0xEAEF, 0xE163, 0xE4F9, 0, 0, 0, 0, 0xE592, /* 0x90 */
+ 0xE8C7, 0xEA65, 0, 0, 0, 0, 0xF396, 0, /* 0x90 */
+ 0xE5D0, 0xEDD9, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF957, 0xE966, 0xEC70, 0, 0, 0, 0xE840, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xF4A3, 0, 0xE4EC, /* 0xB0 */
+ 0, 0xF55B, 0, 0, 0, 0xF9C5, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xECFD, 0, 0xF7B1, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE39D, 0xF16B, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xF5BC, 0xF434, /* 0xD0 */
+ 0xE75E, 0xE75F, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xF5F7, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF671, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE447, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xF8EC, 0, 0xE9C8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xED78, /* 0x00 */
+ 0, 0, 0xE451, 0, 0, 0, 0xF767, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xE64B, 0xEA66, 0, 0, /* 0x10 */
+ 0xF6BD, 0xF13E, 0, 0, 0, 0xE371, 0, 0xEB97, /* 0x20 */
+ 0xF043, 0, 0xE266, 0, 0, 0, 0, 0xE135, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF198, 0xEC71, 0xECBE, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF958, 0, 0, /* 0x40 */
+ 0xE1F0, 0, 0xF7F6, 0, 0, 0xEAF0, 0, 0, /* 0x50 */
+ 0, 0xEDBF, 0, 0, 0, 0xE24F, 0, 0, /* 0x50 */
+ 0, 0, 0xF971, 0xF1B0, 0xF9D1, 0xF64B, 0, 0, /* 0x60 */
+ 0xF7CF, 0xF0DA, 0xE051, 0, 0xE448, 0xE1F1, 0, 0xECD3, /* 0x60 */
+ 0xF9E6, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xEE7D, 0, 0, /* 0x80 */
+ 0, 0xECFA, 0, 0, 0xF33A, 0xF7D0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xF972, 0, 0xF737, 0, /* 0x90 */
+ 0, 0, 0xEBE5, 0xF29B, 0, 0, 0, 0xEEF6, /* 0x90 */
+ 0xF07D, 0, 0, 0xF944, 0xF5C2, 0, 0, 0xE6DC, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF397, 0, 0xE9E8, 0xE4ED, 0xF5FC, 0, 0xE84F, 0, /* 0xB0 */
+ 0xE19D, 0, 0, 0, 0xE4FA, 0xF534, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xF2D7, 0, 0xE553, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF8E3, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xF8ED, 0, 0xEB3D, 0, 0, 0xF07E, /* 0xD0 */
+ 0xF8B3, 0xED52, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF677, 0xE46D, 0, 0xEACC, 0, 0, 0xF959, 0, /* 0xF0 */
+ 0, 0xEDA9, 0xEB98, 0xF643 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEBFE, 0, 0, 0, 0, 0xE0F0, 0, /* 0x00 */
+ 0xF091, 0xF092, 0, 0, 0, 0xE850, 0xF744, 0xF0F2, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xED53, 0, 0, /* 0x10 */
+ 0, 0, 0xEFD7, 0xED93, 0, 0, 0, 0xE091, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE267, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xF95A, 0, 0, 0, 0xF4E1, 0, 0, 0xE0C4, /* 0x30 */
+ 0, 0, 0, 0, 0xECE5, 0, 0xE0C5, 0xF044, /* 0x30 */
+ 0, 0, 0xEFBD, 0, 0xE6C9, 0, 0, 0xF0DB, /* 0x40 */
+ 0xF1B1, 0, 0xE153, 0xF6BE, 0xF95B, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF796, 0, 0xE7B7, 0, 0, /* 0x50 */
+ 0xF4D3, 0xF4D4, 0, 0, 0, 0xF6E4, 0, 0xF6D1, /* 0x50 */
+ 0, 0, 0xE747, 0xE241, 0xE052, 0, 0, 0xF8B4, /* 0x60 */
+ 0xE0C6, 0, 0, 0xF398, 0, 0, 0xE5E7, 0, /* 0x60 */
+ 0xF060, 0, 0, 0, 0, 0, 0xE164, 0xE0AF, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF53A, 0xEFAF, 0, /* 0x70 */
+ 0, 0xF5C3, 0xEFD8, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE9E9, 0, 0, 0, 0xF3F3, 0, /* 0x80 */
+ 0xE5FB, 0xEA4B, 0, 0, 0xF59D, 0, 0, 0, /* 0x90 */
+ 0xF9F3, 0xF9F2, 0xF6A6, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE9C9, 0, 0, 0xE563, /* 0xA0 */
+ 0, 0xE138, 0, 0xE851, 0xE165, 0, 0xE7E4, 0, /* 0xA0 */
+ 0, 0, 0xF85A, 0, 0, 0, 0xEDE3, 0, /* 0xB0 */
+ 0, 0, 0xE4BC, 0, 0, 0, 0xE092, 0, /* 0xB0 */
+ 0, 0, 0, 0xE354, 0, 0, 0, 0xE060, /* 0xC0 */
+ 0xF83B, 0xF0EB, 0xEEF8, 0xE7E5, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE3D7, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xF4A4, 0, 0, 0, 0xE59D, 0xF973, /* 0xF0 */
+ 0xF868, 0, 0xF4D5, 0, 0xE2AB, 0, 0, 0xF0F3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5FC, 0, 0, 0, 0, 0, 0, 0xE4D4, /* 0x00 */
+ 0xE1FC, 0, 0xE7E6, 0, 0xEC9B, 0xEC31, 0xF0D4, 0, /* 0x00 */
+ 0xEB99, 0xED42, 0xE19E, 0, 0, 0, 0xF8E4, 0, /* 0x10 */
+ 0, 0, 0xF53B, 0, 0, 0, 0, 0xE34D, /* 0x10 */
+ 0, 0xE093, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF2B8, 0, 0, 0, 0xE6C0, 0, /* 0x20 */
+ 0xF29C, 0xF9F4, 0, 0, 0xE4E3, 0, 0xF8C2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE5E8, 0xE8AE, /* 0x30 */
+ 0xEBB6, 0xF747, 0, 0, 0, 0, 0, 0xEB4F, /* 0x40 */
+ 0xF8C3, 0xE9EA, 0, 0xEC32, 0, 0xF236, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF678, 0, 0, 0, 0, /* 0x50 */
+ 0xF697, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xE9CA, 0, /* 0x60 */
+ 0, 0xE372, 0, 0, 0, 0, 0xE9A6, 0, /* 0x70 */
+ 0, 0xE9EB, 0, 0, 0xED9B, 0, 0, 0xECAF, /* 0x70 */
+ 0xE39E, 0, 0, 0, 0xF59E, 0, 0, 0, /* 0x80 */
+ 0, 0xE14C, 0xF6EA, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xEDE4, 0xEAF1, 0, 0, 0xF6E1, 0, 0xF7F7, /* 0x90 */
+ 0xF2B9, 0, 0, 0xF768, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF7A9, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xF769, 0, 0, 0, 0xF24D, 0, 0, /* 0xB0 */
+ 0, 0xE756, 0, 0, 0xED73, 0xF5CE, 0, 0, /* 0xB0 */
+ 0, 0, 0xE9D9, 0, 0, 0, 0, 0xE7E7, /* 0xC0 */
+ 0xE449, 0xE5C3, 0, 0, 0xE875, 0xE860, 0, 0xE3D9, /* 0xC0 */
+ 0xE268, 0, 0xE0DE, 0xF53C, 0xE89D, 0, 0xF679, 0xEF95, /* 0xD0 */
+ 0xE2AC, 0xF392, 0, 0xF59F, 0xE8C8, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE250, 0xECD4, 0xE3CF, 0xF3F5, /* 0xE0 */
+ 0, 0xE1F2, 0, 0xE2EB, 0, 0, 0, 0xE1B8, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0xECA6, 0xE3DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF435, 0, 0, 0, 0, 0, 0xF436, /* 0x00 */
+ 0, 0xED5E, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xE4FB, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xF3A9, 0, 0, 0, 0xF459, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xF2D8, 0xEE59, 0, 0xE748, 0xF895, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF4B5, 0, 0, 0xF734, 0, 0, 0xE3F3, /* 0x40 */
+ 0xEE58, 0, 0, 0, 0, 0xF76A, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE979, /* 0x60 */
+ 0xEA67, 0, 0, 0, 0, 0, 0xE0DF, 0, /* 0x60 */
+ 0, 0, 0xE2EC, 0, 0, 0, 0, 0xF56F, /* 0x70 */
+ 0, 0, 0xE3F4, 0xE44A, 0, 0, 0, 0xEAF2, /* 0x70 */
+ 0, 0, 0, 0xEBB7, 0, 0, 0, 0, /* 0x80 */
+ 0xEC33, 0xE4FC, 0, 0, 0xF1E6, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE8C9, 0, 0, 0, 0xED9C, 0, /* 0x90 */
+ 0xE2DE, 0, 0, 0xE260, 0, 0, 0, 0, /* 0x90 */
+ 0xE5D3, 0xF4F5, 0xF6AE, 0, 0, 0xF2C8, 0, 0xE1F3, /* 0xA0 */
+ 0xF5CF, 0xEDF3, 0xF352, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xE061, 0, 0, 0, 0xF093, 0, 0xE336, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7DA, /* 0xC0 */
+ 0xF33B, 0, 0, 0, 0, 0, 0xF0E7, 0, /* 0xD0 */
+ 0, 0, 0xEDC0, 0xF945, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xED54, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE139, 0xF9C6, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xF045, 0, 0xEDAA, 0xEABA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEBDF, 0, 0xE861, /* 0x00 */
+ 0, 0, 0, 0, 0xEBB8, 0, 0xEF96, 0xE4FD, /* 0x10 */
+ 0, 0, 0, 0, 0xEC34, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xF45A, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE876, 0xF6B3, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xF9CD, 0, 0, 0, 0xF4B6, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF267, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF5C4, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE734, 0, 0, 0, 0, 0, 0xF437, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE7B8, 0xE7B9, 0xF2C9, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE65E, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF6CB, 0xEAAE, 0xEF97, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE445, 0, 0, 0, 0xE4D5, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF55C, 0xE89E, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE7E8, 0, 0xF6EB, 0xF5C9, 0, /* 0xA0 */
+ 0xF4BC, 0, 0xE862, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE4B5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xEF46, 0, 0, 0xE65F, 0xF54A, 0, 0xF6C9, /* 0xC0 */
+ 0, 0, 0xE13A, 0, 0, 0xF353, 0xE166, 0, /* 0xC0 */
+ 0, 0, 0xE363, 0, 0xE4BD, 0, 0, 0, /* 0xD0 */
+ 0xE8FB, 0, 0xE0E0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE4E4, 0xF699, 0, 0, 0xE5BA, 0xF4CD, 0xE0E1, /* 0xE0 */
+ 0, 0, 0, 0, 0xF0F4, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xF53D, 0, 0xF93A, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xF6EC, 0, 0, 0, 0xEF98 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE877, 0, 0, 0, 0xF6CC, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xEDC1, 0, 0, 0, 0, 0xEB7E, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE5FD, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE276, 0xF93B, 0xE5BB, 0, 0, 0xF438, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xEC35, 0xE1B9, /* 0x30 */
+ 0xF094, 0xE0C7, 0, 0xE1F4, 0, 0, 0xE8AF, 0xF2D9, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE1BA, 0, 0, /* 0x40 */
+ 0xF99B, 0, 0, 0, 0, 0xEAF3, 0xE277, 0xE852, /* 0x40 */
+ 0, 0xE2AD, 0, 0, 0, 0, 0xEEF9, 0xF738, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xF4E2, 0, /* 0x50 */
+ 0, 0, 0xE094, 0xEAA4, 0, 0, 0xE554, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE167, 0xEDC2, 0, 0, /* 0x60 */
+ 0, 0, 0xE1BB, 0, 0xF2DA, 0xF268, 0, 0xE9A7, /* 0x70 */
+ 0xEC36, 0, 0, 0, 0, 0, 0xEB50, 0, /* 0x70 */
+ 0, 0, 0xE640, 0xF75A, 0, 0xF99C, 0, 0xE7FE, /* 0x80 */
+ 0, 0, 0, 0, 0xEA40, 0, 0, 0, /* 0x80 */
+ 0xE9EC, 0xE878, 0, 0, 0, 0, 0, 0xE570, /* 0x90 */
+ 0, 0xE69B, 0, 0xE1D7, 0xEA68, 0, 0, 0xF49A, /* 0x90 */
+ 0, 0xED66, 0, 0, 0xE355, 0xF53E, 0, 0xE9A8, /* 0xA0 */
+ 0, 0, 0, 0xF1C5, 0xF4D6, 0, 0, 0xEA69, /* 0xA0 */
+ 0xECE6, 0, 0, 0, 0, 0, 0, 0xE4A8, /* 0xB0 */
+ 0, 0xE8B0, 0, 0, 0xEDDA, 0xECBF, 0, 0, /* 0xB0 */
+ 0, 0xE8B1, 0, 0, 0, 0xE5E9, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xEB51, 0xF2DB, 0, 0, 0xF379, /* 0xC0 */
+ 0, 0, 0xE6B2, 0, 0, 0, 0, 0xE39F, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xE7E9, 0, 0, 0xE3A0, 0, 0xF17D, 0xE4A9, 0, /* 0xE0 */
+ 0xF439, 0xF354, 0, 0, 0xEC72, 0xEFEF, 0, 0, /* 0xE0 */
+ 0, 0xF7D1, 0, 0, 0xEFD9, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xEF6A, 0xE853, 0xE854, 0xE555, 0, 0xEEFA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1E0, 0xECB0, /* 0x00 */
+ 0, 0xE8B2, 0xF8C4, 0, 0xF4E3, 0, 0xE7A5, 0xF8E7, /* 0x00 */
+ 0xE9CB, 0xE364, 0, 0xEE46, 0xEB3E, 0xF9DA, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE945, 0xEB9A, /* 0x10 */
+ 0xEEB1, 0, 0, 0, 0, 0xF5F0, 0, 0xE76C, /* 0x20 */
+ 0xF1C6, 0, 0, 0, 0, 0xEBB9, 0, 0xECC0, /* 0x20 */
+ 0xF7C0, 0xEFF0, 0, 0, 0xE7DB, 0, 0xF4E4, 0, /* 0x30 */
+ 0, 0, 0xE946, 0xED79, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF355, 0xECC1, 0xF95C, 0xF95D, 0, 0, 0, /* 0x40 */
+ 0, 0xF45B, 0, 0xF45C, 0, 0, 0, 0xED5F, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF3DB, 0, 0xF869, 0, 0xF3B8, 0xF9F5, 0xEB9B, /* 0x50 */
+ 0, 0, 0, 0, 0xEEFB, 0xF947, 0xF974, 0xF8C5, /* 0x60 */
+ 0xECE7, 0xE749, 0, 0xF69A, 0, 0, 0xE955, 0xE168, /* 0x60 */
+ 0, 0, 0, 0xEB3F, 0xF577, 0, 0xF2DC, 0xE2FC, /* 0x70 */
+ 0xF2DD, 0, 0xF43A, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF9BE, 0, 0, 0xE03C, /* 0x80 */
+ 0xF9BB, 0xF9C7, 0, 0, 0, 0, 0xEEB2, 0, /* 0x80 */
+ 0xF061, 0xEAF4, 0, 0, 0, 0, 0xE3EC, 0xED6E, /* 0x90 */
+ 0xEDC3, 0, 0, 0, 0, 0xE7A6, 0, 0, /* 0x90 */
+ 0xE1BC, 0, 0xF4E5, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF1D5, 0, 0, 0xE7BA, 0, /* 0xA0 */
+ 0, 0, 0xF1E7, 0xF8B5, 0xF77C, 0, 0, 0, /* 0xB0 */
+ 0, 0xEB77, 0, 0xE169, 0, 0, 0xE556, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xEEA5, 0, 0xE5F5, 0xE4BE, /* 0xC0 */
+ 0, 0xF99D, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xED94, 0, /* 0xD0 */
+ 0, 0xEAF5, 0, 0, 0xEF9A, 0xF77D, 0, 0, /* 0xD0 */
+ 0xE257, 0, 0, 0, 0, 0, 0xF9F6, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xEF68, 0, 0xE1D8, 0xEED6, 0xE16A, 0, 0, 0xE073, /* 0xF0 */
+ 0xEAF6, 0xF357, 0xF356, 0, 0xE74A, 0, 0xF3F4, 0xF592 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5CC, 0, 0, 0xF975, 0, 0, 0, 0, /* 0x00 */
+ 0xF055, 0xF095, 0, 0xE9DB, 0, 0xE967, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xEA9F, 0xF49B, 0, 0xE5C7, /* 0x10 */
+ 0, 0, 0, 0xE760, 0, 0xF358, 0xE3A1, 0xE3A2, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE7D4, 0xE678, /* 0x20 */
+ 0xE7CA, 0, 0xE841, 0xE757, 0xE972, 0xF4CE, 0xF5F4, 0, /* 0x20 */
+ 0, 0xF3B9, 0, 0, 0xE863, 0, 0xF67A, 0, /* 0x30 */
+ 0, 0, 0xE2F5, 0, 0, 0xF9AE, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE062, 0, /* 0x40 */
+ 0, 0xEAB4, 0, 0, 0, 0, 0xE6DD, 0xF84A, /* 0x40 */
+ 0xF237, 0xF5BD, 0, 0xF797, 0, 0, 0xF1E8, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xE571, 0, 0xE3A3, 0xEBD6, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF7F8, 0, 0xE8CA, /* 0x60 */
+ 0xE0F9, 0xE564, 0, 0xE7DC, 0, 0xF24E, 0, 0xF6ED, /* 0x70 */
+ 0, 0, 0, 0xE47E, 0, 0, 0xEBE6, 0xF6F9, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE9ED, /* 0x80 */
+ 0, 0xEF6B, 0, 0xE8B3, 0, 0, 0, 0xE3F7, /* 0x80 */
+ 0xEB40, 0, 0, 0xE572, 0, 0xF667, 0, 0xE6F9, /* 0x90 */
+ 0, 0, 0xE76D, 0, 0xE1FD, 0xF43B, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1BD, /* 0xA0 */
+ 0xF752, 0, 0, 0xF43C, 0, 0, 0xE03D, 0xE03E, /* 0xB0 */
+ 0xE2AE, 0, 0, 0, 0, 0, 0xECC2, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE947, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8DA, /* 0xC0 */
+ 0xE7BB, 0xE095, 0xF663, 0xEE9A, 0xF097, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xF098, 0, 0, 0xF69B, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE2AF, 0, 0, 0xE063, 0, 0, 0xE03F, /* 0xE0 */
+ 0xE440, 0xF3BA, 0, 0xE6B3, 0xECC3, 0xF4FD, 0xEA6A, 0, /* 0xF0 */
+ 0, 0, 0, 0xEA6B, 0, 0, 0xF2DE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEC73, 0xF29D, 0, 0, 0xEAF7, 0xE6CA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE278, 0xE8DB, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF3BB, 0, 0, 0, 0, 0xEFF1, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xF847, 0xE356, 0, 0, 0xE13B, 0xF238, 0, 0, /* 0x30 */
+ 0xE0FA, 0xF7F9, 0xE19F, 0xE4FE, 0, 0, 0, 0, /* 0x40 */
+ 0xED60, 0, 0, 0, 0, 0, 0xF47E, 0, /* 0x40 */
+ 0xE565, 0xEACD, 0, 0xF948, 0xE3D0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF45D, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xF6D2, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE064, /* 0x70 */
+ 0, 0xE5D9, 0, 0, 0, 0xE76E, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1D9, /* 0x80 */
+ 0, 0, 0, 0xF239, 0xF64C, 0, 0, 0xE16B, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF359, 0, 0xF99E, /* 0x90 */
+ 0, 0xEF59, 0xF5A0, 0, 0, 0, 0, 0xEEFC, /* 0xA0 */
+ 0xE6DE, 0, 0, 0, 0, 0xEA6C, 0, 0xF33C, /* 0xA0 */
+ 0xE1A0, 0xE1E1, 0, 0xEBBA, 0, 0xE8EF, 0xE842, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE3A5, 0xE948, 0, 0, /* 0xC0 */
+ 0, 0xE798, 0, 0xE3A4, 0, 0xE1E2, 0, 0, /* 0xC0 */
+ 0, 0, 0xE97A, 0, 0, 0xF399, 0, 0xF35A, /* 0xD0 */
+ 0xE34E, 0, 0xE9DC, 0, 0, 0, 0, 0xE566, /* 0xD0 */
+ 0xE4D6, 0, 0, 0, 0, 0, 0, 0xF1D0, /* 0xE0 */
+ 0xE1A1, 0, 0, 0, 0, 0, 0xEAB5, 0, /* 0xE0 */
+ 0, 0, 0xEAF8, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xE531, 0xE242 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEF5A, 0, 0, 0, 0, 0xF0F5, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xECD5, 0xF5D0, 0, /* 0x00 */
+ 0, 0, 0xF5A1, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7A7, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xEDAB, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xEE5B, 0, 0xF5F1, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xEDC5, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF7A3, 0xEB6B, 0xF67B, 0, 0xE0F1, /* 0x50 */
+ 0, 0xE7EA, 0xF5A2, 0, 0, 0, 0xE6D1, 0, /* 0x50 */
+ 0xE3F8, 0xF09A, 0xF09B, 0xE843, 0, 0, 0, 0, /* 0x60 */
+ 0xF2DF, 0, 0, 0xF3EF, 0, 0xEDF6, 0xF24F, 0xEC74, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE34F, 0, 0xF83C, /* 0x70 */
+ 0xF5D1, 0xEEB3, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xEFBE, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF45E, 0xE8B4, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF95E, 0, 0xE9EE, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xEEB4, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE6B4, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF6B4, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE1BE, 0, 0xE879, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE2B0, 0xF6D9, 0xF4E6, 0, 0, /* 0xC0 */
+ 0xE269, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE23A, 0, 0xE0C8, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xE337, 0, 0xF35B, 0, 0xE357 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xED55, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE8E0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xE5DA, 0, 0xE6A7, 0, 0, 0, 0xF250, /* 0x10 */
+ 0, 0xF798, 0, 0, 0, 0, 0xF5D2, 0xF1E9, /* 0x10 */
+ 0, 0xE7BC, 0, 0xEDC6, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF5A3, 0, 0, /* 0x30 */
+ 0xE864, 0xEC37, 0xF8FC, 0, 0, 0xF3DC, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE096, 0, 0, 0, /* 0x40 */
+ 0xEF9C, 0, 0, 0xE279, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xEFF8, 0xEC75, 0, 0, 0, 0, /* 0x50 */
+ 0xE349, 0xE594, 0, 0, 0, 0, 0, 0xE3A6, /* 0x50 */
+ 0, 0xEACE, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xF996, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE4AA, 0, 0, 0, 0xE13C, 0, 0, 0, /* 0x80 */
+ 0, 0xF2E0, 0, 0, 0, 0xEDE5, 0xE365, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8FC, /* 0x90 */
+ 0, 0, 0, 0, 0xF976, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE0FE, 0xF1EA, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xEA41, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF7E3, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE532, 0xE2F6, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE660, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE5EA, 0xF3EE, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xF85B, 0, /* 0xF0 */
+ 0, 0, 0, 0xEDA1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5B1, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE2ED, 0, 0xF1EB, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE5B2, 0, 0, 0, 0xE5BC, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF9E2, 0xF4AD, 0, 0xF9DB, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xEFB0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xE3A7, 0, 0, 0xF9E3, 0xE243, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xF9E4, 0xF85E, /* 0x40 */
+ 0, 0, 0, 0, 0xE040, 0, 0xF6A7, 0, /* 0x40 */
+ 0xE2B1, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEE32, /* 0x50 */
+ 0, 0xF946, 0xF43D, 0xF2E1, 0xF4AE, 0xE956, 0xE7EB, 0, /* 0x60 */
+ 0, 0, 0xEF70, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xEBA8, 0, 0, 0, 0, 0xE5F6, /* 0x70 */
+ 0xE2FD, 0, 0, 0xEA6D, 0, 0, 0, 0xE7D1, /* 0x70 */
+ 0, 0, 0, 0xED7A, 0xF45F, 0, 0xF6BF, 0, /* 0x80 */
+ 0, 0xEC76, 0xEC38, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xECD6, 0, /* 0x90 */
+ 0xF1D1, 0, 0, 0, 0, 0, 0xEFF9, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xE641, 0xEA42, /* 0xA0 */
+ 0, 0, 0xEB78, 0, 0, 0xE4AB, 0, 0xF0DC, /* 0xB0 */
+ 0, 0, 0xEAAF, 0, 0xE053, 0, 0, 0xF29E, /* 0xB0 */
+ 0, 0xF9C3, 0, 0, 0, 0xF0F6, 0xE2B2, 0, /* 0xC0 */
+ 0, 0, 0, 0xE7EC, 0, 0xE7BD, 0, 0xE76F, /* 0xC0 */
+ 0, 0, 0xE548, 0xF0BE, 0xE9EF, 0, 0xE9F0, 0xE9F1, /* 0xD0 */
+ 0xE9F2, 0, 0, 0xE7BE, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF8C6, 0xE2B3 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF29F, 0, 0, 0, 0, 0, 0, 0xED3B, /* 0x00 */
+ 0, 0xE855, 0, 0xE77C, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE3A8, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xEC39, 0, 0, 0xEA4C, /* 0x30 */
+ 0xEEB5, 0, 0, 0, 0, 0, 0xE8F0, 0, /* 0x30 */
+ 0xF2E2, 0xF3F0, 0xE2B4, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xE8F1, 0, /* 0x40 */
+ 0xEB41, 0, 0, 0, 0, 0xEAA5, 0, 0xF7D2, /* 0x50 */
+ 0, 0, 0xEEFD, 0, 0, 0xEE33, 0xF8F1, 0xE0B0, /* 0x50 */
+ 0xF43E, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xE1E7, 0, 0xEF6C, 0, 0, 0xEED7, 0, 0, /* 0x60 */
+ 0xF6C0, 0, 0xE373, 0, 0, 0, 0xE831, 0, /* 0x70 */
+ 0, 0, 0xE14D, 0, 0, 0xE3A9, 0xE9CC, 0, /* 0x70 */
+ 0, 0xECFE, 0xE3AA, 0xEF3A, 0, 0xF046, 0xF7FA, 0xEE5C, /* 0x80 */
+ 0xF668, 0, 0, 0, 0xE557, 0, 0, 0, /* 0x80 */
+ 0xE7CB, 0, 0xE7D2, 0xE4CB, 0xE799, 0xE839, 0xF5F8, 0, /* 0x90 */
+ 0, 0xEA6E, 0xF43F, 0xF739, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE758, 0, 0, 0xF251, 0, /* 0xA0 */
+ 0, 0, 0, 0xF7C1, 0, 0, 0, 0, /* 0xB0 */
+ 0xE9F3, 0xF09C, 0, 0xF64D, 0xEBBB, 0xE1BF, 0xF564, 0xEE5D, /* 0xB0 */
+ 0, 0xF95F, 0xF8A2, 0, 0xEB6C, 0, 0, 0, /* 0xC0 */
+ 0, 0xF54B, 0xE865, 0, 0xF7B2, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xF8F2, 0, 0xE8F6, 0, 0xEA6F, /* 0xD0 */
+ 0, 0, 0, 0xE8F2, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xF76C, 0xF6EE, 0xF0E8, 0, 0xE49C, 0, 0, /* 0xE0 */
+ 0xF3BC, 0, 0, 0xF86A, 0, 0, 0xE87A, 0xE856, /* 0xE0 */
+ 0xF6C1, 0, 0, 0xEEB6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDC7, 0xE63C, 0, 0, 0, /* 0x00 */
+ 0, 0xE957, 0, 0, 0, 0, 0, 0xEBA9, /* 0x10 */
+ 0, 0xEC3A, 0, 0xE5A6, 0, 0, 0xE567, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF460, 0, 0xF09D, /* 0x20 */
+ 0, 0xEB6D, 0xF8F3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF3BD, 0, 0, 0xEC77, 0xF9D7, 0, /* 0x30 */
+ 0xE258, 0xF047, 0, 0xF950, 0, 0xF9E7, 0xF6EF, 0, /* 0x30 */
+ 0, 0xE6B5, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF2BA, 0xF3DD, 0, 0xEA43, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xEF5B, 0, 0, 0xF76D, 0, /* 0x60 */
+ 0, 0xF8C7, 0xE5C8, 0, 0xE6DF, 0, 0xE9A9, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xEFB1, 0, 0, 0xF83D, /* 0x70 */
+ 0xF669, 0xF896, 0, 0, 0, 0, 0, 0xF73A, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xEE7E, 0, 0xE16C, /* 0x80 */
+ 0xEBBC, 0xEB91, 0, 0, 0xEFBF, 0xF99F, 0xEE5E, 0, /* 0x80 */
+ 0, 0xEBD7, 0, 0xEE5F, 0, 0xF593, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xED95, /* 0xA0 */
+ 0, 0, 0xED9D, 0, 0, 0xF7E4, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xF2E3, 0, 0, 0xE2EE, 0xF64E, 0xEB42, 0xF9A0, 0xE3AB, /* 0xC0 */
+ 0, 0, 0, 0xE6FA, 0, 0, 0, 0xF8C8, /* 0xC0 */
+ 0, 0xEC67, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xE533, 0xF39A, 0xE6A8, 0, 0, 0, 0xEBE7, 0, /* 0xD0 */
+ 0, 0xE4BF, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF2E4, 0, 0xE6C5, 0xF0E2, 0, 0, 0xF977, 0, /* 0xE0 */
+ 0, 0xED32, 0, 0xEC78, 0, 0xEE60, 0, 0xF8E8, /* 0xF0 */
+ 0xF578, 0xEDF4, 0xF54C, 0xF565 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEAB6, /* 0x10 */
+ 0, 0xF949, 0xF252, 0xE097, 0, 0, 0, 0xF2E5, /* 0x10 */
+ 0xE0E2, 0xE534, 0, 0xEA70, 0xE89F, 0xED56, 0xEF4E, 0, /* 0x20 */
+ 0, 0, 0, 0xEB6E, 0xF644, 0xF062, 0, 0xF7FB, /* 0x20 */
+ 0, 0, 0xEB52, 0, 0xE074, 0, 0xEEB7, 0, /* 0x30 */
+ 0xF09F, 0, 0xE7DD, 0, 0xE844, 0xF23A, 0xF8E9, 0, /* 0x30 */
+ 0, 0, 0, 0xE8CB, 0xE845, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF3BE, 0, 0, 0xE4AC, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xF8C9, 0, /* 0x50 */
+ 0xEACF, 0, 0, 0xE4C0, 0xECD7, 0, 0xF2E6, 0xF960, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEFC0, /* 0x60 */
+ 0, 0, 0, 0xF5D3, 0, 0, 0xF16C, 0xF6B7, /* 0x60 */
+ 0, 0, 0xF048, 0xE3F9, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE958, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xF049, 0, 0, 0, 0, 0, 0xF3DE, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE6B6, 0xE2B5, 0, 0xE7A8, /* 0x90 */
+ 0, 0, 0xF17E, 0, 0, 0xE9AA, 0, 0, /* 0xA0 */
+ 0, 0, 0xE1A2, 0xEF3E, 0, 0, 0, 0xEBBD, /* 0xA0 */
+ 0, 0xF461, 0, 0, 0, 0, 0xEFC1, 0, /* 0xB0 */
+ 0, 0, 0xE49E, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE8B5, 0, 0xF4E7, 0xE7A0, 0, 0, /* 0xC0 */
+ 0, 0xF961, 0, 0xF1B2, 0xF53F, 0, 0xF8A3, 0, /* 0xC0 */
+ 0, 0xF951, 0, 0xF23B, 0xE535, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF594, /* 0xE0 */
+ 0, 0, 0, 0, 0xF269, 0, 0, 0, /* 0xF0 */
+ 0xF8CA, 0, 0, 0, 0, 0, 0xE1E3, 0xE74B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDDB, 0xF799, 0, 0, 0, 0xF664, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6A9, /* 0x00 */
+ 0, 0xE0C9, 0, 0, 0xEE61, 0xF35C, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xE73E, 0, 0xF7D3, 0xE5FE, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE74C, 0xF440, 0, 0, 0, /* 0x20 */
+ 0, 0xEC3B, 0xF4E8, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xF2C2, 0, 0, 0, 0, 0, 0, 0xF1EC, /* 0x30 */
+ 0, 0xEEB8, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xE8A0, 0, 0, 0xE14E, 0, 0, 0xF49E, /* 0x50 */
+ 0xE87B, 0, 0xEC68, 0xF1D6, 0, 0, 0xE661, 0xEB43, /* 0x50 */
+ 0, 0, 0xF962, 0, 0xF0C8, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE4C1, 0xF35D, 0, /* 0x60 */
+ 0xE2F7, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xF1D2, 0, 0xE568, 0xE959, 0xE6F1, 0, /* 0x70 */
+ 0, 0xEABB, 0, 0, 0xF4A5, 0, 0, 0, /* 0x80 */
+ 0xF55D, 0, 0, 0, 0, 0xF3BF, 0xF741, 0, /* 0x80 */
+ 0xEFFA, 0, 0, 0, 0xF8CB, 0, 0, 0xE065, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF7D4, 0xF6CA, 0, 0, 0xE658, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xF978, 0xF4BD, /* 0xA0 */
+ 0, 0xF2A0, 0, 0xEEFE, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE4C2, 0, 0, 0, 0, 0xE4B6, 0, /* 0xB0 */
+ 0xE13D, 0xF69C, 0xE642, 0xE468, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xEED8, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xECA5, 0, 0, /* 0xD0 */
+ 0, 0, 0xEEB9, 0, 0, 0, 0, 0xF33D, /* 0xD0 */
+ 0xF8CC, 0xF0A1, 0, 0, 0xE536, 0, 0, 0, /* 0xE0 */
+ 0, 0xF8CD, 0, 0xE5BD, 0xF3DF, 0, 0, 0xF69D, /* 0xE0 */
+ 0, 0xEA44, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0xE5EB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDC8, 0, 0, 0, 0xF8A4, 0xE549, 0, /* 0x00 */
+ 0, 0xEA71, 0, 0xED33, 0, 0, 0, 0xE6B7, /* 0x00 */
+ 0, 0xF77E, 0, 0, 0, 0xEA45, 0, 0, /* 0x10 */
+ 0xE662, 0, 0xF7D5, 0xEEBA, 0xF0D5, 0xE5F7, 0xF2E7, 0xEBBE, /* 0x10 */
+ 0, 0, 0, 0xF83E, 0, 0, 0, 0xE679, /* 0x20 */
+ 0xE67E, 0, 0, 0, 0, 0, 0, 0xEEBB, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF15B, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE5B3, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE244, 0, 0, 0, /* 0x40 */
+ 0xF8A5, 0xEBEE, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF6A8, 0, 0, 0, 0, 0xF8CE, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE74D, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xF8FD, 0, 0, 0, 0, /* 0x60 */
+ 0xF979, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE2B6, 0, 0, 0, 0xF1C7, 0xF23C, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE16D, 0, 0, /* 0x80 */
+ 0, 0, 0xF637, 0, 0, 0, 0xEE9C, 0, /* 0x80 */
+ 0, 0, 0xF5A4, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xF9DC, 0xF1B3, 0xE259, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xF2E8, 0, 0, 0xEBBF, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF86B, 0xE0E3, 0xF6A9, 0, 0xF8A6, /* 0xA0 */
+ 0, 0, 0, 0xE949, 0, 0, 0, 0xF3C0, /* 0xB0 */
+ 0xF1C8, 0xF2C3, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xE63D, 0, 0, 0xF9CE, 0, 0, 0, 0xEF31, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xF8F4, 0xE5A7, 0, 0, 0, 0xF3F6, 0, 0xEE63, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE16E, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xF742, 0, 0, 0, 0xE97B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF9B6, 0, 0, 0, /* 0x00 */
+ 0, 0xEDEA, 0, 0, 0xF3E0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE8CC, 0xE9CD, 0, 0, 0, 0xE558, 0, /* 0x10 */
+ 0, 0xE7ED, 0, 0, 0, 0, 0xF5A5, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xEE9D, 0, 0, 0, 0, 0, 0xEE64, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF9C8, /* 0x40 */
+ 0, 0xE631, 0xF9BF, 0, 0xF963, 0, 0xF2A1, 0, /* 0x40 */
+ 0xEEBC, 0, 0, 0, 0, 0, 0xE3EE, 0, /* 0x50 */
+ 0, 0xEE65, 0, 0, 0xEFF2, 0, 0xEAB0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xE770, 0xF94A, 0xF9AF, 0xF35E, /* 0x60 */
+ 0, 0xE8E1, 0, 0, 0xEDC9, 0, 0xF1B4, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xEB53, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xECD8, 0, 0, 0, /* 0x80 */
+ 0, 0xEFFB, 0xF038, 0, 0, 0, 0, 0xF9B7, /* 0x80 */
+ 0, 0, 0xF8A7, 0, 0xEFC2, 0, 0, 0, /* 0x90 */
+ 0, 0xF9F7, 0, 0, 0, 0, 0, 0xEC69, /* 0x90 */
+ 0, 0, 0xE97C, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xEF32, 0, 0, 0, /* 0xA0 */
+ 0, 0xEE92, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xF9F8, 0xF9F9, 0, 0, 0, 0xF64F, 0, /* 0xB0 */
+ 0, 0xEEA7, 0, 0xEE67, 0, 0, 0, 0, /* 0xC0 */
+ 0xE595, 0xE559, 0, 0, 0, 0, 0xE69C, 0, /* 0xC0 */
+ 0xE6F2, 0, 0xEBC0, 0, 0xE8E2, 0xEE68, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEEBD, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xF35F, 0xF4BE, 0xEC3C, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF5B7, 0xEB92, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xF9B8, 0xECE8, 0, 0xE537, 0xEF9E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF862, 0, 0, 0, 0, 0, 0xF791, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xE663, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE5B4, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF360, 0, 0xF6F0, 0xF243, 0, 0, /* 0x20 */
+ 0xF04A, 0, 0xF063, 0, 0, 0xF1C9, 0xE9AB, 0, /* 0x30 */
+ 0, 0, 0xEDAC, 0xF9A1, 0, 0xEAD0, 0xF143, 0, /* 0x30 */
+ 0xEAD1, 0, 0, 0, 0, 0, 0xF1ED, 0xF748, /* 0x40 */
+ 0xF6FA, 0, 0, 0, 0xF73B, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF570, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE54A, 0xED43, 0, 0xEFDA, 0, 0xEA46, 0, 0xE7BF, /* 0x50 */
+ 0, 0xE7C0, 0xE691, 0, 0, 0, 0, 0xE7CC, /* 0x60 */
+ 0, 0xE83A, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xEAE5, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF6E5, 0, 0, 0, 0xE142, 0, 0, /* 0x70 */
+ 0xEAF9, 0xE6E0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE54B, 0, 0, 0, 0, 0xF9FA, /* 0xA0 */
+ 0, 0, 0, 0, 0xE143, 0, 0, 0xE8F3, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xEAD2, 0, 0xE25A, 0, 0xF26A, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xED74, 0, /* 0xC0 */
+ 0xF8CF, 0, 0, 0, 0, 0, 0, 0xE2B7, /* 0xD0 */
+ 0, 0xF253, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE27A, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xEC3D, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xE6E1, 0xF897, 0, 0, 0xE5C9, 0xF73C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEED9, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xF4E9, 0, /* 0x10 */
+ 0, 0, 0, 0xE77D, 0xECC4, 0xF393, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xEF75, 0, 0, /* 0x20 */
+ 0, 0xEB9C, 0xF254, 0xE7DE, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xF0A2, 0xF0A3, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xF952, 0xF04B, /* 0x30 */
+ 0, 0, 0, 0, 0xEF3B, 0xEA72, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xF1EF, 0, 0xEF33, 0, 0, 0, 0, 0xE2F1, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xE54C, 0, 0xF97A, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xEEBE, 0, 0xF994, 0, 0, 0xE644, 0, 0, /* 0x70 */
+ 0xEC3E, 0, 0xE4B7, 0xF85C, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF86C, 0, 0xF1B5, 0xEBE3, /* 0x80 */
+ 0, 0xEF3C, 0, 0xEF6D, 0, 0, 0xF2E9, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xF54D, 0, 0xE2B8, 0xEFDB, /* 0x90 */
+ 0xE3AC, 0, 0, 0, 0, 0, 0, 0xE857, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF0C9, /* 0xA0 */
+ 0, 0xEF5C, 0, 0, 0, 0xEA47, 0, 0, /* 0xA0 */
+ 0, 0, 0xE64C, 0xE4E5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xF86D, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xE866, 0, 0xE041, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE858, 0xEAA6, 0, 0xF7B3, 0xF462, 0, 0xE054, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE25B, 0, /* 0xD0 */
+ 0, 0xE1F5, 0, 0, 0, 0xF9B0, 0xE5A8, 0, /* 0xD0 */
+ 0xF3C1, 0, 0, 0xEC79, 0xE95A, 0xF144, 0xF850, 0, /* 0xE0 */
+ 0, 0xF8A8, 0xE338, 0, 0, 0xE87C, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7EE, /* 0xF0 */
+ 0, 0xEB9D, 0, 0, 0, 0xF2EA, 0xF86E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEB54, 0, 0xE2B9, 0, 0xE5CA, 0xE6E2, 0xEC3F, /* 0x00 */
+ 0, 0xE6B8, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xEF5D, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xF66A, 0, 0, 0, 0, /* 0x10 */
+ 0xF2A2, 0xEC6A, 0xF69E, 0, 0, 0xF8D0, 0xE3AD, 0, /* 0x20 */
+ 0xE1E4, 0, 0xE3AE, 0xE97D, 0xEF5E, 0, 0xF39B, 0xE245, /* 0x20 */
+ 0xEE9E, 0, 0, 0xE6FB, 0xE366, 0xE9F5, 0xF6F1, 0, /* 0x30 */
+ 0xF69F, 0, 0xE8F7, 0, 0, 0, 0, 0xF8EA, /* 0x30 */
+ 0xEFDC, 0xE7C1, 0, 0xF5F2, 0xEB55, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xF064, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF7C2, 0, 0xF04C, /* 0x50 */
+ 0, 0xE455, 0xF8D1, 0xEEC0, 0xF0A5, 0, 0xEAFA, 0xECA2, /* 0x50 */
+ 0xE6B9, 0, 0xEFC3, 0, 0xEF9F, 0xEF3F, 0, 0, /* 0x60 */
+ 0xF463, 0xF8A9, 0xE735, 0, 0, 0, 0, 0xE5CB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE358, 0, /* 0x70 */
+ 0, 0, 0xE3AF, 0xE6E3, 0, 0, 0, 0xEB56, /* 0x80 */
+ 0, 0xE632, 0, 0xF1F0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xE6F3, 0, 0, 0, 0xF964, 0, 0xE867, 0xE16F, /* 0x90 */
+ 0, 0xF464, 0, 0xE3B0, 0, 0xE170, 0, 0xE8FD, /* 0xA0 */
+ 0xF4BF, 0, 0xF361, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF94B, 0, 0xEC40, 0, 0, 0xEE35, 0, 0, /* 0xB0 */
+ 0, 0xEC6B, 0, 0, 0, 0xEADE, 0, 0xEB57, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xF491, 0, /* 0xC0 */
+ 0, 0, 0xE171, 0, 0, 0, 0, 0xE67A, /* 0xC0 */
+ 0, 0, 0, 0, 0xEEC2, 0, 0, 0, /* 0xD0 */
+ 0xE246, 0, 0xF4C0, 0, 0xE1FE, 0, 0, 0, /* 0xD0 */
+ 0xF8D2, 0, 0xF79A, 0xF6FB, 0, 0, 0xEF4F, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xEF47, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF1B6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE94A, 0, 0, 0xE144, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xF3F7, 0, 0, 0, 0xEF48, 0, 0, /* 0x10 */
+ 0xE098, 0, 0xED34, 0xF566, 0, 0, 0, 0xEAE6, /* 0x10 */
+ 0, 0, 0, 0xEAA7, 0, 0xEAE7, 0xEBC1, 0, /* 0x20 */
+ 0xEFC4, 0, 0, 0xE95B, 0xEFC5, 0, 0, 0, /* 0x20 */
+ 0xF2A3, 0xF0A6, 0xE0A3, 0xECE9, 0, 0, 0, 0xE3FB, /* 0x30 */
+ 0xF2A4, 0, 0xF2EB, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE344, /* 0x40 */
+ 0, 0, 0, 0, 0xE1A3, 0, 0, 0xEF76, /* 0x40 */
+ 0, 0xF2A5, 0, 0xE4CC, 0xE87D, 0, 0, 0, /* 0x50 */
+ 0, 0xE6BA, 0, 0xF465, 0xF5E5, 0xE7EF, 0, 0, /* 0x50 */
+ 0, 0, 0xF7B4, 0, 0, 0xE5D4, 0xF9CF, 0, /* 0x60 */
+ 0, 0, 0xE8E3, 0, 0, 0, 0, 0xF3E1, /* 0x60 */
+ 0xF146, 0, 0, 0, 0, 0xF8FE, 0xE4D7, 0, /* 0x70 */
+ 0xE3B1, 0, 0xE0B1, 0, 0, 0, 0, 0xE3B2, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE0B2, 0xF3C2, /* 0x80 */
+ 0, 0, 0xF571, 0xF7B5, 0, 0, 0xEBC3, 0xEBC2, /* 0x80 */
+ 0, 0xF0F7, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xEAA8, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xE0CA, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xEE49, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xF76E, 0xF7AA, 0xE099, 0, 0xF1B7, 0, 0, /* 0xB0 */
+ 0xE4B8, 0xF466, 0, 0, 0xE569, 0xF255, 0xF492, 0, /* 0xB0 */
+ 0, 0, 0xE042, 0, 0, 0xE94B, 0, 0xF3F8, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xF147, 0, 0, /* 0xC0 */
+ 0, 0, 0xEDCA, 0, 0xF650, 0xF9DD, 0, 0, /* 0xD0 */
+ 0xE573, 0xE172, 0, 0xF6D4, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE6E5, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE4C3, 0, 0xE736, 0, 0xF651, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xE9F6, 0, 0xE1C0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDDC, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xEDCB, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xEBC4, 0, 0, 0, 0, 0, 0xEF40, /* 0x10 */
+ 0xF540, 0xF4EA, 0xE87E, 0, 0xE6BB, 0, 0xEC41, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE6AA, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xE69D, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xED6F, 0, 0xE066, 0, /* 0x40 */
+ 0, 0, 0xF0A8, 0, 0, 0, 0xE8FE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF652, 0, 0, 0xF2BB, 0, 0, 0, /* 0x60 */
+ 0, 0xE59F, 0, 0, 0xEB58, 0, 0, 0, /* 0x60 */
+ 0xEF49, 0, 0xF2A6, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE1A4, 0, 0, 0xE596, 0xE8A1, 0xE8DC, 0xE8DD, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF26C, 0, 0xE0CB, 0xF965, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xE27B, 0, /* 0x80 */
+ 0xE1C1, 0, 0, 0xF8D3, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xF7AB, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xF5D4, 0, 0, 0, 0, 0xE7A9, /* 0xB0 */
+ 0, 0, 0xEFDD, 0xE8CD, 0, 0, 0xE9CE, 0, /* 0xC0 */
+ 0xEEC3, 0, 0xF15C, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xF7EC, 0, 0, 0, 0xE0CC, 0, /* 0xD0 */
+ 0, 0, 0, 0xEB9E, 0xE538, 0, 0xF1D3, 0xE791, /* 0xD0 */
+ 0, 0xF467, 0, 0xE09A, 0xE891, 0, 0, 0xE664, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xE7CD, 0, /* 0xE0 */
+ 0, 0, 0xE77E, 0, 0xF451, 0, 0, 0, /* 0xF0 */
+ 0xEAD3, 0, 0, 0, 0xE892, 0, 0xEC7A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEB9F, 0, 0, 0xE79A, 0, 0, 0, /* 0x00 */
+ 0xF6AF, 0xE846, 0, 0xE067, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xF468, 0, /* 0x10 */
+ 0xE79B, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xF86F, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2EF, /* 0x30 */
+ 0xE7C2, 0, 0xF362, 0, 0xED61, 0, 0, 0, /* 0x30 */
+ 0xF4B7, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF870, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xF2EC, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xEC42, 0, 0xE54D, 0, 0, 0xE7CE, 0, /* 0x60 */
+ 0, 0, 0, 0xF572, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xE539, 0, 0, 0, 0, 0xE1C2, 0xEEDA, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF469, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xE7AA, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xE74E, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xE93D, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xEC7B, 0xE69E, 0, 0, /* 0xA0 */
+ 0xE09B, 0, 0, 0xE56A, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF567, 0xE131, 0, 0, 0xE2BA, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF5B8, /* 0xD0 */
+ 0, 0, 0, 0xE7C3, 0xE378, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xECC5, 0xF0F8, 0, 0xF441, 0, 0, /* 0xE0 */
+ 0, 0xE2BB, 0, 0, 0, 0xE4AD, 0xEF71, 0xE27C, /* 0xE0 */
+ 0, 0, 0, 0xEB44 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEA73, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE9F7, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF442, 0xF4F6, 0xF66B, /* 0x20 */
+ 0, 0, 0, 0, 0xE6FE, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF76F, 0, 0xF6F2, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE339, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEE6A, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xF5A6, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE6BC, 0xE173, 0, 0, 0xEE6B, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xE9DD, 0, 0, 0, /* 0x70 */
+ 0, 0xE3B3, 0, 0, 0, 0, 0, 0xF2ED, /* 0x80 */
+ 0, 0, 0, 0, 0xE66E, 0xED96, 0xEBEF, 0, /* 0x80 */
+ 0, 0xE9F8, 0, 0, 0, 0, 0, 0xEF5F, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE075, 0, 0, 0, 0xE931, /* 0xA0 */
+ 0, 0xEB45, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xF93C, 0xF93D, 0xE737, 0, 0, 0, /* 0xB0 */
+ 0, 0xF1B8, 0, 0, 0, 0xE8B6, 0, 0, /* 0xC0 */
+ 0, 0, 0xE692, 0xF4AF, 0, 0, 0xE1A5, 0, /* 0xC0 */
+ 0xE893, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE738, 0, 0, 0, 0xE174, 0, 0, 0xE3B4, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE068, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xE894 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5A7, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xF5A8, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xEE36, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE5EC, 0xE5F8, 0xE895, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xECC6, 0, 0, 0, 0xEA74, 0, /* 0x30 */
+ 0xEA75, 0xE3B5, 0, 0, 0, 0, 0, 0xE3B6, /* 0x40 */
+ 0xE3B7, 0xF443, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEFDE, 0, 0, 0, 0, 0, 0xF363, 0xF444, /* 0x50 */
+ 0, 0, 0xF364, 0xE0E4, 0xF8D4, 0xF5E6, 0xECEA, 0, /* 0x50 */
+ 0xEA76, 0, 0, 0, 0, 0xEAD4, 0, 0, /* 0x60 */
+ 0xF79B, 0, 0, 0, 0, 0xF33E, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE3B8, 0, 0, 0, 0, 0xE66F, /* 0x70 */
+ 0, 0xE367, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xF931, 0xF2EE, 0xE968, /* 0x80 */
+ 0, 0xEFDF, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xEDDD, 0xF9FB, /* 0xA0 */
+ 0, 0, 0xEB59, 0, 0, 0, 0xE659, 0, /* 0xA0 */
+ 0, 0xE53A, 0, 0xEDCC, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xEFE0, 0, 0, 0, 0xE368, 0xF932, 0xE54E, /* 0xB0 */
+ 0xEC43, 0xEA77, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE94C, 0xE446, 0xF5D5, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE231, 0xF5A9, 0, 0, 0xE9F9, 0, 0, /* 0xD0 */
+ 0xE9FA, 0, 0, 0, 0, 0, 0, 0xF365, /* 0xD0 */
+ 0, 0, 0, 0, 0xF66F, 0, 0xF46A, 0xED7B, /* 0xE0 */
+ 0, 0xF493, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xF149 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF9FC, 0, 0, 0, 0, 0xEBAA, 0, 0, /* 0x00 */
+ 0xE069, 0, 0, 0xF2EF, 0, 0xF5AA, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xF19B, 0, 0, 0xF73D, /* 0x10 */
+ 0, 0xF452, 0xF653, 0, 0xE6D2, 0, 0, 0xF7A2, /* 0x10 */
+ 0xF366, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xF39C, 0, /* 0x20 */
+ 0, 0xF670, 0, 0, 0, 0, 0xEFF3, 0xF453, /* 0x30 */
+ 0, 0, 0, 0xE53B, 0xE043, 0xE1A6, 0, 0xE1C3, /* 0x30 */
+ 0xE1DA, 0, 0, 0, 0, 0, 0xE7CF, 0, /* 0x40 */
+ 0, 0xF654, 0, 0, 0, 0xF26D, 0xEEC4, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEC44, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xEAE2, 0xEEDB, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xEF41, 0, 0xF93E, 0, 0, 0, 0, /* 0x60 */
+ 0xEDCD, 0, 0, 0, 0xF87B, 0, 0xE2BC, 0, /* 0x70 */
+ 0, 0xE2E2, 0xE1F6, 0, 0, 0xF2F0, 0, 0xF54E, /* 0x70 */
+ 0, 0xE55D, 0, 0, 0xF4B8, 0, 0, 0, /* 0x80 */
+ 0xEFA1, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xF494, 0xF4EB, 0, 0xF367, 0, 0, /* 0x90 */
+ 0xE2D7, 0, 0, 0, 0, 0, 0, 0xE2DF, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xEF50, 0xEF51, 0, 0, 0, 0xE2E3, 0xEFA2, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE33A, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF4C1, 0xE33B, 0, 0xE574, /* 0xC0 */
+ 0, 0, 0xF2BC, 0xE731, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7DF, /* 0xD0 */
+ 0, 0xF4D7, 0, 0, 0, 0xE94D, 0, 0xE175, /* 0xD0 */
+ 0xF1F1, 0, 0, 0xF3E2, 0, 0xE56B, 0, 0, /* 0xE0 */
+ 0, 0, 0xEC45, 0, 0, 0xE076, 0, 0xE4AE, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xE176, 0, /* 0xF0 */
+ 0, 0xF3D3, 0xF5E7, 0, 0, 0, 0, 0xE06A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF8EE, /* 0x00 */
+ 0, 0xEBC5, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xEAE9, 0, 0xF26E, 0, 0, 0xF6C2, 0, /* 0x10 */
+ 0xE732, 0, 0, 0, 0, 0, 0xE9AC, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xF33F, 0xE64D, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xEBAB, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xF7B6, 0, /* 0x40 */
+ 0, 0xE597, 0, 0xE359, 0xF2A7, 0xEC7C, 0, 0xE8EA, /* 0x40 */
+ 0xE25C, 0xF5E8, 0xF6D5, 0, 0xE4CD, 0, 0xF4FE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE345, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xEBA0, 0, 0xEAFB, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xEE6D, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xEF34, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE0CD, /* 0x80 */
+ 0, 0, 0, 0xF2A8, 0, 0, 0, 0xF244, /* 0x80 */
+ 0, 0, 0, 0, 0xE868, 0xE3B9, 0, 0xEAA9, /* 0x90 */
+ 0, 0, 0xF4B0, 0, 0, 0xE154, 0, 0, /* 0x90 */
+ 0, 0xE247, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xF2A9, 0, 0, /* 0xA0 */
+ 0, 0xEAD5, 0, 0, 0xF1D7, 0, 0, 0, /* 0xB0 */
+ 0xF256, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xF2BD, 0xF966, 0, 0, 0xE8F4, 0, 0xF2AA, 0xF749, /* 0xC0 */
+ 0, 0xF5E9, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xECD9, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xEBC6, 0, 0, 0, 0xE54F, 0, 0, 0, /* 0xE0 */
+ 0, 0xEA78 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF37A, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF4C2, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE4AF, 0, /* 0x10 */
+ 0, 0xE06B, 0, 0, 0, 0, 0, 0xF967, /* 0x20 */
+ 0, 0, 0xF1D8, 0xEBC7, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF568, 0xE643, 0xE9AD, /* 0x30 */
+ 0, 0, 0, 0xE5BE, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF3C3, 0xF26F, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE67B, 0, 0, 0, 0xF569, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE6E6, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE847, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0xE9FB, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xE9CF, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE733, 0, 0, 0xE869, 0, 0xF368, /* 0x90 */
+ 0xF2C4, 0, 0, 0, 0, 0, 0, 0xEBD8, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF3D4, 0, 0xF1F2, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xE5DB, 0, /* 0xA0 */
+ 0, 0xE5DC, 0xF4C4, 0xE0D7, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xEC46, 0, 0, 0, 0, 0xF2F1, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xF8D5, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE4D8, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE9D0, 0xF369, /* 0xD0 */
+ 0xE0B3, 0, 0, 0, 0, 0, 0, 0xE5DD, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xE1A7, 0, 0, 0xE33C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE3BA, 0, 0xF3C4, 0, 0xEDB3, 0xF8F5, 0xEFE1, 0xF9E0, /* 0x00 */
+ 0xF94C, 0, 0xE832, 0xE833, 0, 0xE431, 0, 0, /* 0x00 */
+ 0xE491, 0, 0, 0, 0xEC7D, 0, 0, 0xEA79, /* 0x10 */
+ 0xE26C, 0xF445, 0xE374, 0xE9D1, 0, 0, 0, 0, /* 0x10 */
+ 0xEBC8, 0xE8B7, 0xEAE3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xF1B9, 0xF3C5, 0, 0xF4CF, 0xE6AB, /* 0x20 */
+ 0xEBAC, 0, 0, 0xECEB, 0, 0xF257, 0, 0, /* 0x30 */
+ 0, 0xEBC9, 0xE09C, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xF39D, 0xF871, 0xF36A, 0xE177, 0xE896, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xE14F, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xE27D, 0, /* 0x50 */
+ 0, 0xE5A9, 0xF872, 0, 0, 0, 0xE375, 0, /* 0x60 */
+ 0xF0D6, 0, 0xF16F, 0, 0, 0, 0xEAFC, 0, /* 0x60 */
+ 0, 0xF6D6, 0xEA7A, 0xE0B4, 0, 0, 0xF2BE, 0, /* 0x70 */
+ 0, 0xE145, 0, 0, 0, 0, 0, 0xE2BD, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xF2F2, 0xEC47, /* 0x80 */
+ 0, 0, 0, 0xE178, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF39E, 0, 0, 0, /* 0x90 */
+ 0xE670, 0, 0xF3C6, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xEC48, 0xF0AB, 0, 0, /* 0xA0 */
+ 0, 0xE0B5, 0xE761, 0, 0xF55E, 0xF4F7, 0, 0, /* 0xB0 */
+ 0xE6C6, 0, 0xE3BB, 0xF6AA, 0, 0xF1CA, 0xE6D3, 0xE79C, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF655, /* 0xC0 */
+ 0, 0, 0xE3CC, 0xE9FC, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xEAFD, 0, /* 0xD0 */
+ 0xF7E5, 0, 0xEB5A, 0, 0, 0xF49F, 0xE4B0, 0, /* 0xD0 */
+ 0xF595, 0xE859, 0, 0xEE6E, 0, 0, 0, 0, /* 0xE0 */
+ 0xF74A, 0xEF60, 0, 0, 0xE79D, 0, 0, 0xF065, /* 0xE0 */
+ 0, 0, 0, 0, 0xE633, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xF656 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF46B, 0xED9E, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xEF42, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE86A, 0, 0xF46C, 0xF8D6, 0xEFB2, /* 0x10 */
+ 0, 0xF23D, 0, 0xF873, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE97E, 0, 0, 0xF5EA, 0xEE70, /* 0x20 */
+ 0, 0xF39F, 0, 0, 0, 0, 0, 0xE6AC, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF5C5, 0xF270, 0, /* 0x30 */
+ 0, 0xE8E5, 0, 0xE9DE, 0, 0, 0xE7F0, 0xEFA3, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF3F9, 0, 0xF454, 0xEB5B, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xEFA4, 0, /* 0x50 */
+ 0, 0xEC49, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xECB1, 0xF97B, 0xE1A8, 0, 0xE146, 0, 0, /* 0x60 */
+ 0xF36B, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xEE4A, 0, 0, 0xE1A9, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xF4C3, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xEBD9, 0, 0, 0xF2AB, /* 0x80 */
+ 0, 0, 0, 0xEEC5, 0, 0, 0xEB79, 0, /* 0x90 */
+ 0xF4C5, 0, 0, 0xE550, 0xE5BF /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE9AE, 0, /* 0x30 */
+ 0xF7FC, 0, 0xE150, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xEDA2, 0, 0, 0, /* 0x40 */
+ 0xE248, 0, 0, 0, 0xE762, 0xF7D6, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xF3AA, 0xE261, 0, 0, 0xF657, 0, /* 0x60 */
+ 0xE8EB, 0, 0xEAFE, 0, 0, 0xE771, 0, 0xF6F3, /* 0x70 */
+ 0, 0xE6E7, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE5A0, 0, 0, /* 0x80 */
+ 0xE3BC, 0, 0xEDCF, 0, 0xE0B6, 0, 0xE848, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE1C4, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE64E, 0, 0, 0, 0xEC4A, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE2D8, 0, 0, 0, /* 0xA0 */
+ 0xEB5C, 0xF0F9, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xF9FD, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xE6E8, 0xE0D8, 0, 0, 0, 0xEFE2, 0, 0, /* 0xB0 */
+ 0, 0xEF4A, 0, 0, 0, 0xECC7, 0, 0, /* 0xC0 */
+ 0, 0, 0xF15D, 0, 0xF15E, 0, 0xE64F, 0, /* 0xC0 */
+ 0, 0, 0xECA7, 0, 0xEAD6, 0xF9E8, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF271, /* 0xD0 */
+ 0xF638, 0xE9FD, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xF74B, 0, 0xEF61, 0, 0, 0, 0, /* 0xE0 */
+ 0xF7D7, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xE27E, 0, 0, 0xF15F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEFA5, 0xE665, 0, 0xE1C5, 0, 0xF1BA, 0xE3BD, 0, /* 0x00 */
+ 0, 0xE2BE, 0, 0, 0xF14B, 0, 0, 0, /* 0x00 */
+ 0xE441, 0, 0, 0, 0, 0xE179, 0, 0xE7C4, /* 0x10 */
+ 0xEFFC, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE3BE, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xF14C, 0, 0, 0xEDAD, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF6B0, 0, 0xE17A, /* 0x30 */
+ 0, 0, 0, 0xE4C4, 0, 0, 0xE650, 0, /* 0x40 */
+ 0, 0, 0xE69F, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xEBA1, 0, /* 0x50 */
+ 0xEA4D, 0, 0xF639, 0, 0, 0, 0xE834, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE634, /* 0x60 */
+ 0xF5C6, 0, 0xEBA2, 0xEFC6, 0, 0, 0, 0xF455, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF579, 0xE67C, 0xF0D3, /* 0x70 */
+ 0, 0, 0, 0, 0xF14D, 0xEC6C, 0xEA7B, 0xF36C, /* 0x80 */
+ 0, 0xF0BF, 0, 0xE6CE, 0xE3BF, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xF5AB, 0, /* 0x90 */
+ 0, 0, 0, 0xF7FD, 0, 0xE06C, 0, 0, /* 0x90 */
+ 0, 0xE1C6, 0xF446, 0, 0, 0xE9FE, 0, 0, /* 0xA0 */
+ 0, 0xE147, 0xE8B8, 0, 0, 0, 0, 0xE379, /* 0xA0 */
+ 0, 0xE26D, 0xF0C0, 0, 0xF9A2, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xF75B, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF066, 0xF3B0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE8CE, 0, 0xF6C3, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE8CF, 0xE0A4, 0, 0, 0xF770, 0, /* 0xD0 */
+ 0, 0xF8D7, 0, 0, 0xF0CA, 0xEB31, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE25D, 0, 0, 0xE56C, 0, 0, 0, /* 0xF0 */
+ 0xF9D8, 0, 0, 0, 0, 0xE498 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF447, 0, 0, 0xF898, 0xF63A, 0xF899, /* 0x00 */
+ 0xE776, 0, 0xF541, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xEF62, 0, 0xE055, 0xE17B, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xEC7E, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xEC4B, 0, 0xF6AD, 0, 0, 0, 0xF771, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF4EC, 0, 0, 0, 0, 0xEA31, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xED9F, 0, 0, 0xECEC, 0, /* 0x40 */
+ 0xE9AF, 0xE9B0, 0, 0, 0xE0B7, 0xEF63, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xEBA3, 0xE470, 0, /* 0x60 */
+ 0, 0, 0, 0xF3A0, 0, 0, 0, 0, /* 0x60 */
+ 0xEFA6, 0xE0F2, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xF1F3, 0xE969, 0xEB5D, 0, 0, 0, 0, 0xF6DA, /* 0x70 */
+ 0xE8B9, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE13E, 0, 0xE86B, 0, 0, 0, 0, 0xE1C7, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE9B1, 0, 0xE73F, 0xECA3, 0, 0, /* 0x90 */
+ 0xE291, 0, 0, 0xF495, 0, 0, 0, 0, /* 0xA0 */
+ 0xF743, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xEB5E, 0, 0xF5FD, 0, 0, /* 0xB0 */
+ 0, 0, 0xF0EC, 0, 0, 0xE4C5, 0xF97C, 0xE46B, /* 0xB0 */
+ 0xE57B, 0, 0xEA32, 0, 0, 0, 0xEDE6, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xF340, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xE5C4, 0, 0, 0, 0, 0, 0, 0xF1F4, /* 0xD0 */
+ 0, 0, 0, 0xECED, 0, 0xEF52, 0, 0xF1F5, /* 0xE0 */
+ 0xE6FC, 0, 0xF1BB, 0, 0, 0xF63B, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF448, 0xF658, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xE4E6, 0xF46D, 0xE2BF, 0, 0xF0AC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2C0, 0, 0xEE38, /* 0x00 */
+ 0xF9E9, 0, 0xE2C1, 0, 0xEB6F, 0xEA7C, 0, 0, /* 0x00 */
+ 0, 0, 0xEB32, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xF54F, 0xEC91, 0, 0xE7F1, 0xF3C7, /* 0x10 */
+ 0, 0xE0B8, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF7FE, 0xE8BA, 0xE897, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF67C, 0xE86C, 0xF874, /* 0x30 */
+ 0, 0xEB5F, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE9B2, 0, 0, 0, 0, 0xEE39, 0, 0xF2F3, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF4ED, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xF0FA, 0, 0xF7E6, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xE06D, 0xE5DE, /* 0x60 */
+ 0, 0xE06E, 0xEAE4, 0, 0, 0, 0xEE9F, 0, /* 0x70 */
+ 0xF5AC, 0, 0, 0, 0, 0, 0xED97, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xEFE3, 0, 0xF1CB, 0xE2E4, 0, /* 0x80 */
+ 0, 0, 0xE763, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE9B3, 0xE57C, 0, 0, 0xF449, 0, 0xEAB7, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xE0CE, 0xF8D8, 0, /* 0xA0 */
+ 0, 0xE369, 0, 0, 0xE9D2, 0xF6F4, 0xEEDC, 0xED35, /* 0xA0 */
+ 0, 0xF933, 0, 0xE8BB, 0, 0, 0, 0xF44A, /* 0xB0 */
+ 0xEFFD, 0xE35A, 0, 0xF5D6, 0xE7C5, 0xED44, 0, 0xF1A7, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF04D, 0xEEA0, 0, 0xF6C4, 0xF5AD, 0, 0xE7E0, /* 0xD0 */
+ 0, 0, 0, 0xE044, 0, 0, 0xF772, 0xE2C2, /* 0xD0 */
+ 0, 0xF14E, 0, 0, 0, 0xEDB4, 0xE1C8, 0xF258, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xEEC8, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xE1C9, 0xF7B7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF3E8, 0xE7F2, 0xE8F5, 0xE045, 0xE7C6, 0, 0, /* 0x00 */
+ 0, 0xE759, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7AB, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xF1BC, 0, 0, 0xE764, 0, 0, 0, 0xE96A, /* 0x20 */
+ 0, 0xEC4C, 0, 0, 0xF97D, 0xF170, 0xE4A0, 0, /* 0x30 */
+ 0xEFC7, 0xEE3A, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xEC92, 0, 0, 0, 0, 0, 0, 0xF84B, /* 0x40 */
+ 0, 0xF5AE, 0xF8AA, 0, 0, 0, 0, 0xF19D, /* 0x40 */
+ 0, 0xF14F, 0xF968, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE575, 0, 0, 0, 0xF7C3, /* 0x70 */
+ 0, 0, 0, 0xF272, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xE6E9, 0xF1F6, 0, 0, 0, 0xEA7D, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xE17C, 0, /* 0x90 */
+ 0xECEE, 0, 0, 0, 0, 0, 0xEF64, 0, /* 0x90 */
+ 0, 0, 0xF89A, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE9B4, 0xED45, 0xE740, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xE765, 0, 0, /* 0xB0 */
+ 0, 0xF57A, 0, 0, 0, 0xE249, 0, 0, /* 0xC0 */
+ 0, 0xE671, 0xE2D2, 0, 0xE346, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE232, 0, 0, 0xF4EE, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xF4F8, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE95C, 0, 0xE35B, 0, 0, 0, 0xF934, /* 0xE0 */
+ 0xE1CA, 0xE6D4, 0xEA33, 0, 0xED70, 0, 0, 0, /* 0xF0 */
+ 0, 0xF259, 0, 0, 0, 0xEC6D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5FE, 0xE53C, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE5D1, 0, 0xE792, 0xF753, 0xF067, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xF5D7, 0, 0, 0xE74F, 0, 0, 0, /* 0x20 */
+ 0, 0xF9C0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xF0AD, 0, 0, 0, 0, 0xE5AA, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xEEA8, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF25A, /* 0x50 */
+ 0, 0, 0, 0xE077, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF773, 0, 0xE56D, 0, 0, 0xF068, 0, /* 0x60 */
+ 0, 0, 0, 0xF8D9, 0xF1F7, 0, 0, 0xEDB5, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE33D, 0, 0, /* 0x70 */
+ 0, 0, 0xF3F1, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xEC4D, 0, 0, 0, 0xECC8, 0, 0, 0, /* 0x90 */
+ 0, 0xE7D5, 0, 0, 0xEAAA, 0, 0, 0, /* 0x90 */
+ 0, 0xE8BC, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xF774, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xF3FA, 0, 0, 0xEDB6, 0xF4EF, 0, 0, 0xF8DA, /* 0xB0 */
+ 0xEBE0, 0, 0xE7AC, 0, 0xF5EB, 0, 0xEB46, 0, /* 0xC0 */
+ 0, 0xEFC8, 0, 0xE0CF, 0, 0xECC9, 0, 0, /* 0xC0 */
+ 0, 0xEA7E, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xEC4E, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE991, 0, 0xE635, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xEC93, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xE6A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE7A1, 0, 0xE750, 0xE96B, 0, 0, 0xF1BD, /* 0x10 */
+ 0xEAB8, 0, 0xF035, 0, 0, 0, 0xE6AD, 0, /* 0x10 */
+ 0, 0xF4F9, 0, 0xF1F8, 0, 0xF5C7, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xEBCA, 0xF0E3, 0, 0xF46E, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF75C, 0, 0xF069, /* 0x30 */
+ 0, 0xE4C6, 0, 0xE8E6, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF5AF, 0, 0, 0, 0, 0xE292, 0, /* 0x40 */
+ 0, 0, 0, 0xEFFE, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF8B6, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xEC94, 0, 0, 0, 0, /* 0x60 */
+ 0xE2F2, 0xF6B9, 0xE7F3, 0, 0, 0xEBCB, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xE86D, 0, 0, 0xE849, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF0FB, /* 0x80 */
+ 0, 0xE0B9, 0, 0, 0xF1F9, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xEB70, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xF550, 0, /* 0xA0 */
+ 0xF9BC, 0xEAB1, 0xECEF, 0, 0, 0, 0, 0xEB33, /* 0xA0 */
+ 0xF9B9, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xF341, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE1CB, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF1BE, 0, 0, 0, 0xE5C0, 0xECF0, 0xF1FA, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xEFE4, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE5ED, 0xEEDD, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE598, 0xEDB7, 0, 0, /* 0xE0 */
+ 0, 0xE8E7, 0xEC4F, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF25B, /* 0xF0 */
+ 0, 0, 0xE6F4, 0xF36D, 0, 0, 0, 0xE23B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEEDE, 0, 0, 0, 0xE666, 0xEBCC, /* 0x00 */
+ 0, 0, 0xEF43, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xEDEE, 0xE932, /* 0x10 */
+ 0, 0, 0xEB60, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE5B5, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE5A1, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xF8DB, 0, /* 0x40 */
+ 0xF7CB, 0, 0, 0, 0xE0F3, 0xF535, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xF858, 0xE667, 0, 0xEFE5, 0xF8DC, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF9D0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF8F6, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE835, 0, 0xE8BD, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF172, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE1F7, 0xF36E, 0, 0, 0, /* 0xA0 */
+ 0, 0xF659, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEA91, /* 0xC0 */
+ 0, 0, 0, 0xE4B1, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xF97E, 0, 0, 0, /* 0xD0 */
+ 0, 0xEF53, 0, 0xF3C8, 0, 0, 0, 0xE293, /* 0xD0 */
+ 0, 0, 0, 0, 0xF7ED, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF496, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0xED46 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5B9, 0, 0xE992, 0xECF1, 0, 0, 0, 0, /* 0x00 */
+ 0xEF35, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF44B, 0, 0xEA34, 0, 0xE85C, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xE079, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xECDA, 0, 0xF969, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF06A, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xF7C4, 0, /* 0x60 */
+ 0xECA4, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xF8DD, 0, 0xF2CA, 0, /* 0x70 */
+ 0xEF54, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE5CC, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xF0D7, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7AD, /* 0x90 */
+ 0, 0, 0xF8AB, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE4D9, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE5A2, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF66E, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xE898, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xEB61, 0, 0, 0xEFA8, /* 0xE0 */
+ 0, 0, 0xF5F9, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xF83F, 0, 0xF0FC, 0, 0, 0xEB7A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xECB2, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE5C5, /* 0x10 */
+ 0, 0, 0xF3E3, 0xE5EE, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE1CC, 0, 0, 0, 0, 0xF1D9, 0, /* 0x30 */
+ 0, 0, 0, 0xE751, 0, 0, 0, 0, /* 0x30 */
+ 0xF87C, 0, 0, 0, 0, 0, 0xF3EB, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF84C, 0xEE72, 0, 0, /* 0x40 */
+ 0, 0, 0xF875, 0xEC9C, 0, 0, 0, 0xE046, /* 0x50 */
+ 0, 0xED47, 0, 0xF06B, 0, 0xF5FA, 0, 0, /* 0x50 */
+ 0, 0xF8AC, 0xE2C3, 0xF0FD, 0, 0, 0, 0, /* 0x60 */
+ 0xF79C, 0, 0, 0xEAB9, 0, 0, 0, 0, /* 0x60 */
+ 0xEBF1, 0, 0xE434, 0, 0, 0, 0, 0xF5FB, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE36A, 0xE36B, /* 0x70 */
+ 0, 0xF04E, 0xE7B1, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE047, 0, 0, 0xE4E7, 0, 0xF775, 0, 0, /* 0x80 */
+ 0, 0, 0xE4B2, 0, 0, 0, 0xEC50, 0xF46F, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xE1E5, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF7AC, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE1CD, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xF23E, 0xE63E, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6EA, /* 0xC0 */
+ 0, 0, 0, 0, 0xEEE0, 0xF0AE, 0, 0, /* 0xD0 */
+ 0, 0xE2D9, 0, 0, 0xE95D, 0xF1FB, 0, 0xEA92, /* 0xD0 */
+ 0, 0xE6EB, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xEA35, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xEAD7, 0xE8D0, 0xE8D1, 0, 0, /* 0xF0 */
+ 0xE5A3, 0, 0, 0, 0, 0xF342 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE96C, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xE078, 0, 0xF776, 0xE95E, 0, 0, 0, 0, /* 0x10 */
+ 0xF06C, 0xE8D2, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xEFB3, 0, 0, /* 0x20 */
+ 0, 0, 0xF6DB, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xECA8, 0, /* 0x30 */
+ 0xE6AE, 0, 0, 0xEB71, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xE0BA, 0, 0, 0xEDD1, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE36C, /* 0x50 */
+ 0, 0, 0, 0, 0xE5C1, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE75A, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xECA9, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEB34, /* 0x70 */
+ 0, 0xEFA9, 0, 0xE4C7, 0, 0, 0xE96D, 0xF73E, /* 0x80 */
+ 0, 0, 0, 0xE148, 0, 0, 0, 0xE33E, /* 0x80 */
+ 0, 0, 0, 0xE794, 0, 0, 0xECCA, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE13F, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE53D, 0xF661, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE35C, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE056, 0, 0, 0xE5C2, 0, 0, /* 0xB0 */
+ 0xE24A, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE057, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xF840, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xEAD8, 0, 0, 0, /* 0xF0 */
+ 0xF5BA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDEB, 0, 0xF2F4, 0xE9B5, 0, 0, 0, 0, /* 0x00 */
+ 0xE1AA, 0, 0xECF2, 0, 0xF8F7, 0, 0xF6D0, 0, /* 0x00 */
+ 0, 0, 0, 0xF9BA, 0, 0, 0xF9E1, 0xF6A0, /* 0x10 */
+ 0xE3C0, 0, 0, 0xEF55, 0, 0xED48, 0, 0xEBE8, /* 0x10 */
+ 0, 0, 0, 0xE151, 0, 0xE47D, 0, 0, /* 0x20 */
+ 0, 0, 0xE8BE, 0, 0, 0xEB72, 0, 0, /* 0x20 */
+ 0, 0xF859, 0, 0, 0xEBCD, 0, 0xE048, 0, /* 0x30 */
+ 0, 0, 0xF470, 0xF3C9, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEA93, 0, 0, 0, 0xF36F, 0xF754, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xF25C, 0, 0, 0xEA94, 0, /* 0x50 */
+ 0xEEC9, 0, 0xEC95, 0xEEE1, 0, 0, 0xECCB, 0, /* 0x60 */
+ 0, 0xECCC, 0, 0, 0, 0xE2F8, 0xF2AC, 0, /* 0x60 */
+ 0xF9FE, 0xF935, 0xF841, 0xEAD9, 0, 0xEB62, 0, 0, /* 0x70 */
+ 0, 0xF56A, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF3CA, 0, 0xE233, /* 0x80 */
+ 0, 0, 0, 0, 0xF44C, 0xF173, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xEB35, 0, 0xF6AB, 0, 0, /* 0x90 */
+ 0xF0AF, 0, 0, 0, 0, 0, 0xEDDE, 0, /* 0x90 */
+ 0xEBA4, 0xE1AB, 0, 0xE7F4, 0xEF36, 0xE1CE, 0xEBE9, 0, /* 0xA0 */
+ 0xF991, 0, 0xEB73, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xEC51, 0, 0xE234, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xEA36, 0, 0, 0xF0FE, 0, 0xF0DD, 0xF370, /* 0xB0 */
+ 0, 0, 0xF56B, 0, 0xEC96, 0, 0, 0xE4C8, /* 0xC0 */
+ 0, 0, 0, 0xF57B, 0, 0xF245, 0, 0xF5D8, /* 0xC0 */
+ 0, 0, 0xE5DF, 0, 0, 0, 0xE675, 0, /* 0xD0 */
+ 0, 0, 0, 0xF0B0, 0xF573, 0, 0, 0, /* 0xD0 */
+ 0, 0xECCD, 0, 0, 0, 0, 0xF596, 0xF842, /* 0xE0 */
+ 0, 0, 0xF2F5, 0xE06F, 0, 0xF0B1, 0xF1BF, 0, /* 0xE0 */
+ 0, 0xF9C9, 0, 0, 0, 0, 0xED36, 0xF7A4, /* 0xF0 */
+ 0xF343, 0, 0xEDEC, 0, 0, 0, 0xE3E7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE7C7, 0xED67, 0xF06D, 0, 0xE599, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE84A, 0, /* 0x00 */
+ 0xE85D, 0, 0, 0, 0xF7CC, 0, 0xEBDA, 0xE8BF, /* 0x10 */
+ 0, 0xE155, 0xF160, 0xE0BB, 0, 0xEA95, 0, 0, /* 0x10 */
+ 0xEFAA, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE7C8, 0, 0, 0xF273, 0xE6BD, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE2C4, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xE35D, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF936, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF3FB, 0, 0, 0, 0, 0xF9D2, 0xE3C1, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xECDB, 0, 0xE4C9, 0, 0xE95F, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xE17D, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xEA37, 0, 0, 0xEE4B, /* 0x60 */
+ 0xF131, 0, 0, 0, 0xE149, 0, 0, 0xF8DE, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xEEE2, 0, 0, /* 0x70 */
+ 0xE551, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE938, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xEC52, 0, 0xF4D8, 0xEDD3, 0, 0, 0xF4D9, 0, /* 0x90 */
+ 0, 0, 0xF4C6 /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1DB, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1AC, /* 0x30 */
+ 0, 0xF953, 0, 0, 0, 0, 0xE577, 0, /* 0x40 */
+ 0xE3C2, 0, 0xF7A5, 0, 0xEF65, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xECCE, 0, 0, /* 0x50 */
+ 0, 0, 0xE55A, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xEADA, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xF8DF, 0xEEE3, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF79D, 0xECCF, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xF5B0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE777, 0, 0xE7C9, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF73F, 0xF2F6, 0, /* 0x90 */
+ 0xE9B6, 0xF23F, 0xE1F8, 0, 0, 0, 0, 0xEA48, /* 0xA0 */
+ 0xF937, 0xF6FC, 0xF6B1, 0xE24B, 0xF531, 0, 0, 0xF25D, /* 0xA0 */
+ 0xEBAE, 0, 0, 0xF153, 0xE2FE, 0, 0xF74F, 0xE772, /* 0xB0 */
+ 0xE4E8, 0, 0, 0xEA38, 0xF574, 0xF152, 0, 0xE7F5, /* 0xB0 */
+ 0xF7C5, 0xE9D3, 0xE693, 0xF19E, 0xF992, 0, 0, 0xF1C0, /* 0xC0 */
+ 0xE049, 0, 0xF274, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF471, 0, 0xEA49, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE694, 0, 0xEA96, 0, 0xEADB, 0, /* 0xD0 */
+ 0xE8D3, 0, 0xF877, 0xE773, 0xF551, 0, 0xE9B7, 0, /* 0xE0 */
+ 0, 0, 0xF497, 0, 0, 0xE53E, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE695, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xE9B8, 0xE2C5, 0xEADF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF44E, 0xF631, 0, 0xF0CB, /* 0x00 */
+ 0xF3FC, 0, 0xF4C7, 0, 0, 0xEB7B, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xF1FC, 0, 0, 0xEBDB, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xF275, 0, 0xEA97, 0, /* 0x60 */
+ 0, 0, 0, 0xF863, 0, 0, 0, 0, /* 0x60 */
+ 0xF3CB, 0, 0, 0xE33F, 0xE9B9, 0, 0, 0xE3C3, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF5B1, 0, 0, /* 0x80 */
+ 0, 0, 0xF056, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xF371, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF63C, 0, 0, 0, 0, /* 0xA0 */
+ 0xF5D9, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF37B, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE9BA, 0, 0, 0, 0xF44F, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xF6C5, 0, /* 0xC0 */
+ 0, 0, 0, 0xE8A2, 0xF498, 0, 0, 0xE04A, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xF6F5, 0, 0xE0E5, 0, 0, /* 0xD0 */
+ 0, 0xF276, 0, 0xEB63, 0, 0, 0, 0, /* 0xE0 */
+ 0xE235, 0, 0, 0, 0, 0, 0, 0xE668, /* 0xE0 */
+ 0, 0, 0, 0xE53F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEFC9, 0, 0, 0, 0, 0xE4CE, /* 0x00 */
+ 0xF552, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE0E6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF3A1, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xF0B2, 0, 0, 0, 0, 0xF3A2, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xF0B3, 0, 0xF344, 0, 0, 0xE0F4, /* 0x40 */
+ 0xE540, 0xF4B2, 0xF8B7, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF5EC, 0, 0, 0, 0, 0, 0xF277, /* 0x50 */
+ 0xF542, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xF5ED, 0, 0xE2F3, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF372, 0, 0, 0, 0, 0, 0xF25E, /* 0x80 */
+ 0, 0, 0xF3CC, 0, 0, 0xEDB8, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE6F5, 0xECF3, 0xE2E5, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xE2C6, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xF4B3, 0xED68, 0xE2F9, 0xE2DA, 0, 0, /* 0xC0 */
+ 0, 0, 0xF85D, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEE73, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF472, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xF5EE, 0, 0, 0xE04B, 0, 0, 0xECDC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE294, 0, 0xE669, 0, 0, /* 0x00 */
+ 0, 0xF240, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF575, 0xE752, 0xE960, 0xE17E, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE5E0, 0xF65A, 0xF9CA, 0xE766, 0xF55F, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE636, 0xE94E, /* 0x20 */
+ 0, 0xE8D4, 0xE6C7, 0, 0, 0, 0, 0xF4A0, /* 0x20 */
+ 0, 0, 0, 0xF3CD, 0, 0, 0, 0, /* 0x30 */
+ 0xEC53, 0xE96E, 0, 0xE96F, 0, 0, 0xF2AD, 0xEE3B, /* 0x30 */
+ 0, 0, 0, 0, 0xF7DD, 0xF04F, 0, 0, /* 0x40 */
+ 0, 0xF2AE, 0, 0, 0, 0xF560, 0xE295, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xEE3C, 0, 0xE26E, /* 0x50 */
+ 0, 0, 0xE5F9, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xECF4, 0xE1D0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE5B8, 0, 0, 0xF6FD, 0, /* 0xA0 */
+ 0xE939, 0, 0, 0, 0, 0xEA98, 0, 0xE93A, /* 0xA0 */
+ 0xF473, 0xEFB4, 0xE46C, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xEFE6, 0, 0, 0xECF6, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xEECA, 0, /* 0xC0 */
+ 0, 0xE35E, 0, 0, 0xE899, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE04C, 0, /* 0xE0 */
+ 0, 0, 0xF278, 0xE86E, 0, 0xF499, 0, 0, /* 0xE0 */
+ 0xEC9D, 0, 0xE136, 0, 0, 0, 0, 0xE84B, /* 0xF0 */
+ 0, 0xF279, 0, 0, 0, 0xF5DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF6DC, 0xEBEA, 0xE251, 0xE541, 0, 0xF9B1, 0xEE4D, 0, /* 0x00 */
+ 0xF8AD, 0, 0, 0xF777, 0, 0xEBCE, 0, 0xF6E2, /* 0x00 */
+ 0xF5EF, 0xE2C7, 0, 0, 0xE542, 0xE191, 0, 0xE578, /* 0x10 */
+ 0, 0xF25F, 0xF6D7, 0, 0, 0xEB36, 0xE651, 0xEBDC, /* 0x10 */
+ 0xF373, 0xF3E4, 0xE993, 0xE637, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xF597, 0, /* 0x20 */
+ 0, 0xF3CE, 0xF474, 0, 0, 0xE340, 0, 0, /* 0x30 */
+ 0xF191, 0, 0, 0, 0xF7BA, 0, 0xF0B5, 0, /* 0x30 */
+ 0, 0xE57D, 0xEC54, 0, 0, 0, 0, 0xEFE7, /* 0x40 */
+ 0, 0, 0xF0B4, 0xF031, 0, 0xF74C, 0xE236, 0, /* 0x40 */
+ 0xF7C6, 0xF96A, 0, 0xE543, 0xE4B9, 0xF06E, 0, 0, /* 0x50 */
+ 0, 0xEFAB, 0, 0, 0xEBE1, 0xE4CF, 0xF598, 0, /* 0x50 */
+ 0xF050, 0xEBCF, 0, 0xE14A, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xF27A, 0, 0, 0, 0xF374, 0xF4B4, 0xE57E, /* 0x60 */
+ 0, 0, 0xF450, 0, 0, 0xF3E5, 0, 0xF553, /* 0x70 */
+ 0xEB64, 0, 0xF0B6, 0, 0xE6A1, 0xE0E8, 0, 0xF7AD, /* 0x70 */
+ 0xEFAD, 0xE774, 0xF843, 0xEC55, 0xF94D, 0, 0, 0xF154, /* 0x80 */
+ 0xE741, 0, 0xE93B, 0, 0, 0, 0, 0xE5A4, /* 0x80 */
+ 0, 0xF0E9, 0, 0, 0, 0xEF4B, 0, 0, /* 0x90 */
+ 0, 0xE767, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xF8AE, 0xE3E1, 0, 0, 0xE8C0, 0, /* 0xA0 */
+ 0xF5BE, 0, 0xEA99, 0, 0, 0, 0, 0xE09D, /* 0xA0 */
+ 0xF6C6, 0xE2C8, 0, 0, 0, 0xEBD0, 0, 0, /* 0xB0 */
+ 0xF260, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xEFF4, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE296, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE5CD, 0, /* 0xD0 */
+ 0, 0xE2DB, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE9BB, 0, 0, 0, 0, 0xE23C, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xEFE8, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xE544 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xED57, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF5DB, 0, 0, 0xF851, 0, 0, /* 0x10 */
+ 0, 0xEA39, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE59A, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF2F7, 0, 0, /* 0x20 */
+ 0, 0, 0xE4B3, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF0B7, 0xF2F8, 0xF5DC, 0xF1CC, 0xE8D5, 0xF3CF, 0, /* 0x40 */
+ 0, 0, 0xF3D0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xF5B2, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE7AE, 0xE5AC, 0, 0xEC56, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF9A3, 0, 0xF8E5, /* 0x70 */
+ 0xEAAB, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEC97, /* 0x80 */
+ 0, 0xF63D, 0, 0xF5B3, 0, 0xF345, 0, 0, /* 0x80 */
+ 0, 0, 0xEBA5, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF5DD, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF132, 0xF1FD, 0, 0xF5B4, 0xF8B8, /* 0xA0 */
+ 0, 0xE8A3, 0, 0, 0xE65A, 0xE0D9, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xEDD4, 0, 0, 0, 0, 0, 0, 0xF4FA, /* 0xC0 */
+ 0, 0xF0B8, 0, 0xEB47, 0xE6EC, 0xF3EC, 0xEDAF, 0xE5E1, /* 0xC0 */
+ 0xE6ED, 0xE3D1, 0, 0, 0, 0, 0, 0xEBF2, /* 0xD0 */
+ 0xF2F9, 0, 0, 0, 0xE9BC, 0xF66C, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xF375, 0, 0, 0, 0xF554, /* 0xE0 */
+ 0, 0, 0xEFE9, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF4FB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE591, 0, 0, /* 0x00 */
+ 0xE132, 0xF6FE, 0xEABC, 0, 0, 0, 0, 0xF0CD, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE347, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE652, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xEF3D, 0, 0, 0, 0, 0xF2AF, /* 0x30 */
+ 0xE0A5, 0, 0, 0, 0, 0xE0E9, 0, 0, /* 0x40 */
+ 0, 0xF878, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE156, /* 0x50 */
+ 0, 0, 0, 0xEE77, 0, 0, 0xF057, 0, /* 0x50 */
+ 0, 0, 0xE8A4, 0, 0xE2C9, 0xEC9E, 0xF2FA, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xF0DE, 0, 0, 0xF5C8, 0, 0xE56E, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xEB65, 0, 0xF2B0, 0, 0, 0xEC57, 0, /* 0x90 */
+ 0xE7AF, 0, 0, 0, 0xF7E7, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xEEE5, 0, 0, 0xE2CA, 0xEBD1, /* 0xB0 */
+ 0, 0xEC58, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xF2FB, 0, 0, 0xF89B, /* 0xC0 */
+ 0, 0, 0xE994, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xEB37, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xF778, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xE0EA, 0, 0, 0, 0xE0BC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE672, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xF5DE, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF5DF, 0, 0xF246, 0, 0, 0, 0xEC98, 0xE4CA, /* 0x10 */
+ 0xF2FC, 0xE3C4, 0xF2B1, 0, 0xE3C5, 0, 0xE36E, 0, /* 0x20 */
+ 0xE7E1, 0, 0, 0xEB48, 0, 0, 0xE1D1, 0xF4B9, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEECC, 0, 0xE638, 0xE237, 0, 0xE545, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xED58, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE4B4, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xF0B9, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE0F5, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF66D, 0, 0xF3A3, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE157, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xEFCA, 0, 0xEBF0, 0, /* 0x90 */
+ 0, 0, 0xF5E0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF8AF, 0, 0, 0, 0xE0D1, /* 0xA0 */
+ 0, 0, 0, 0, 0xF8E0, 0xF475, 0, 0, /* 0xA0 */
+ 0xF192, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF37C, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF27B, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xEFCB, 0, /* 0xD0 */
+ 0, 0xE192, 0, 0, 0xE6AF, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xF4A1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF997, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF3A4, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xEB66, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xF2B2, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xF561, 0, 0, /* 0x30 */
+ 0xF6A1, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF3D1, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xE09E, 0xE09F, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE25E, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF4C8, 0, 0xF4BA /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF1FE, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE836, 0, 0, 0xEB7C, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF75D, 0, 0xE0D2, 0, 0, 0, 0xF0CE, /* 0x80 */
+ 0, 0xF7D8, 0xF7D9, 0xE070, 0xE85A, 0, 0, 0, /* 0x90 */
+ 0xE0A6, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE058, 0xF7EE, 0xE8EC, 0, 0, /* 0xA0 */
+ 0xE341, 0, 0, 0, 0, 0xE5EF, 0, 0, /* 0xA0 */
+ 0, 0xEE95, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xEEA2, 0xED69, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xED71, /* 0xC0 */
+ 0, 0, 0xF954, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xF7EF, 0xE2F4, 0xF6E6, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE24C, 0, 0, 0, /* 0xD0 */
+ 0, 0xF555, 0xE933 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE9BD, 0, 0, 0, /* 0x10 */
+ 0, 0xF556, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF731, 0, 0, 0, 0xEF66, 0, /* 0x20 */
+ 0, 0, 0xE8C1, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xF376, 0, 0, 0, 0xED49, /* 0x30 */
+ 0xF67D, 0, 0xF7AE, 0, 0xE9BE, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xE6B0, 0xE778, 0xE0BD, 0, 0, /* 0x40 */
+ 0xF7DA, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xF75E, 0xF7F0, 0xEB7D, 0xECB3, 0xF543, /* 0x50 */
+ 0, 0, 0xF052, 0xF476, 0xF346, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE8D6, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xF0E4, 0, 0, 0xF477, 0, 0xE6D5, 0xE546, 0xF7E8, /* 0x70 */
+ 0xE6C1, 0, 0, 0, 0, 0xEDD5, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xEFEA, 0xE6CC, 0, /* 0x80 */
+ 0, 0, 0xE4E9, 0xEC59, 0, 0xF96B, 0xE1AD, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE140, 0xF032, 0, 0, /* 0x90 */
+ 0xED98, 0xE350, 0, 0xF347, 0xF231, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xE6F6, 0, 0, 0, 0xEC5A, /* 0xA0 */
+ 0xEC5B, 0, 0xF85F, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xF0DF, 0, 0, 0, 0, 0, 0xE65B, /* 0xB0 */
+ 0, 0, 0, 0xF544, 0, 0, 0, 0, /* 0xB0 */
+ 0xF1CD, 0xED62, 0, 0, 0xF039, 0xED4A, 0xF4A2, 0xE1D2, /* 0xC0 */
+ 0, 0xF65B, 0, 0xF3E6, 0xF1C1, 0xEF4C, 0xF261, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xF377, 0xEC5C, 0, /* 0xD0 */
+ 0, 0xED3A, 0, 0xF5E1, 0xF1DA, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE6EE, 0xE3F1, 0, 0, 0, 0, /* 0xE0 */
+ 0xEFEB, 0xEFEC, 0xEB74, 0, 0, 0, 0, 0xE837, /* 0xE0 */
+ 0xE9D4, 0, 0xF033, 0, 0, 0, 0xE653, 0xE696, /* 0xF0 */
+ 0, 0xE86F, 0, 0xF2B3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEC5D, 0, 0, 0, 0, 0, 0xF2FD, 0xF478, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xF2C5, 0, 0xEEE7, 0, 0, 0xE6FD, 0, /* 0x10 */
+ 0, 0xEECE, 0, 0, 0xEADC, 0, 0xF7C7, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7F6, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xEAAC, 0, 0xE66A, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xE934, 0, 0, 0, 0xF348, 0, 0, /* 0x30 */
+ 0, 0, 0xE5FA, 0, 0xED99, 0, 0, 0, /* 0x40 */
+ 0xE654, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF57C, 0, 0, 0, 0, 0xF2FE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xF331, 0, 0xEA3A, 0, /* 0x50 */
+ 0, 0xE84C, 0xE79E, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xF864, 0, 0, 0, 0xF175, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xF938, 0, 0, 0xF176, /* 0x70 */
+ 0, 0, 0xE75B, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF8B9, 0, 0xED63, 0, 0xE1F9, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xE2D3, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE07A, 0, 0, 0xE2D4, 0, 0xF74D, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xF557, 0, /* 0xC0 */
+ 0, 0, 0, 0xF06F, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xF7DB, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE547, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF0E5, 0, 0, 0xEBD2, 0, /* 0xF0 */
+ 0, 0, 0, 0xF034, 0, 0, 0, 0xF852 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF8E1, 0xF87D, 0xF332, 0xE193, 0, 0xF833, 0xEC99, 0, /* 0x00 */
+ 0xEC5E, 0, 0xEFF5, 0, 0xEBEB, 0, 0, 0, /* 0x00 */
+ 0xEEE8, 0xEF67, 0xE89A, 0xE55B, 0, 0, 0, 0xF6F6, /* 0x10 */
+ 0xE655, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE579, 0, 0, /* 0x20 */
+ 0xF89C, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE194, 0xF6DD, 0, 0xEA4A, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE238, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF349, 0xEDA0, 0xED59, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xED64, 0, 0, 0, /* 0x50 */
+ 0xF053, 0, 0xF2B4, 0, 0, 0, 0xE6BE, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xF8E2, 0, 0xE1D3, /* 0x60 */
+ 0, 0, 0, 0xF2B5, 0, 0, 0, 0xF879, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF7A6, 0, 0, 0, 0, 0, 0, 0xEABD, /* 0xA0 */
+ 0, 0xF6C7, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xF79F, 0, 0, 0xF79E, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xEA3B, 0xE8E8, 0, 0, 0xECDD, /* 0xD0 */
+ 0, 0xEBE2, 0xE3C6, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF660, 0xF0E6, 0xE89B, /* 0xE0 */
+ 0, 0, 0, 0, 0xF157, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xEA9A, 0xF779, 0xECDE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE297, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xF853, 0xEDD7, 0, 0xF158, 0, 0, 0, /* 0x00 */
+ 0xF4C9, 0, 0, 0xED4B, 0, 0, 0, 0, /* 0x10 */
+ 0xEE3E, 0, 0, 0, 0, 0, 0xF2B6, 0, /* 0x10 */
+ 0xE94F, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE24D, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE753, 0, 0, /* 0x40 */
+ 0, 0xE35F, 0, 0xE2FA, 0xF4CA, 0xEB67, 0, 0, /* 0x40 */
+ 0, 0xE3C7, 0xEFAE, 0, 0xEF4D, 0, 0, 0xF854, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xEC5F, 0, /* 0x90 */
+ 0, 0xF855, 0, 0, 0, 0xF7B8, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xE970, 0, 0, /* 0xA0 */
+ 0xF8B0, 0, 0, 0, 0xE739, 0xEDDF, 0xF7A7, 0, /* 0xA0 */
+ 0, 0xF67E, 0, 0xF65C, 0xEC9A, 0, 0, 0, /* 0xB0 */
+ 0, 0xF193, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE870, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xF3D2, 0xE45C, 0xE2CB, 0, 0, 0xE04D, 0, 0, /* 0xD0 */
+ 0, 0xE9BF, 0, 0, 0, 0xF691, 0, 0xEA9B, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF844, 0, 0, /* 0xE0 */
+ 0, 0xE5AD, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF3E7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEA4E, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xE950, 0, 0, 0, 0, 0, 0xE3C8, 0xE3C9, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF74E, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE0F6, 0, 0, 0, 0, /* 0x20 */
+ 0xE59B, 0, 0, 0, 0, 0, 0xF5E2, 0xEBD3, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE779, 0, 0, 0xF7A0, 0, 0xE2CC, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF9A4, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE298, 0, 0xF860, /* 0x50 */
+ 0, 0, 0xE195, 0xEE4E, 0, 0, 0, 0xF63E, /* 0x50 */
+ 0, 0, 0xE5F0, 0, 0, 0xE3CA, 0, 0, /* 0x60 */
+ 0, 0xF94E, 0xE5F1, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE1E9, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xF845, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xEC60, 0xF599, 0, 0, 0, /* 0xD0 */
+ 0xE1D4, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xEEA3, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xE8A5 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEC61, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6A2, /* 0x20 */
+ 0, 0, 0xF6E3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xF036, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE331, 0, 0, 0, /* 0x30 */
+ 0, 0xE26A, 0xF8EB, 0xE8A6, 0xE8DE, 0xE775, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF070, /* 0x40 */
+ 0, 0, 0, 0, 0xE73A, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xEDE0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE66B, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xF2C6, 0, /* 0x80 */
+ 0, 0xF77A, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xED65, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE299, 0, 0, 0xEB68, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE6EF, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xF57D, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xE1E6, 0, 0, 0, /* 0xE0 */
+ 0xE196 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5E3, 0, 0, /* 0x00 */
+ 0xED5A, 0, 0xE971, 0, 0, 0xF7C8, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF94F, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xEF37, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE754, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE0BE, /* 0x40 */
+ 0, 0xE93E, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6F7, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xF378, 0, 0xE9C0, /* 0xE0 */
+ 0, 0xE2CD, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE995, 0xE7B0, 0, 0xEE79 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xED4C, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xF054, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xED7C, 0, /* 0x20 */
+ 0xED75, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xF8F8, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xE14B, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xED4D, 0, 0, /* 0x50 */
+ 0xE1DC, 0xE7F7, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE9DF, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xF1CE, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE7D0, 0, 0, 0, 0, 0, 0xEDA3, /* 0xA0 */
+ 0, 0, 0, 0, 0xF7CD, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE1AE, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2CE, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xF63F, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xF9D3, 0xF0ED, 0xE66C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDA4, 0, 0, 0, 0xE5B6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE66D, 0, 0, /* 0x70 */
+ 0, 0xF7E9, 0, 0, 0, 0xEEA4, 0, 0xE673, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xE3CB, 0xE674, 0, 0, 0, 0xE5F2, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xEA9C, 0, 0xE6F8, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xE77A, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE2D5, 0xE79F, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xE73B, 0, 0, 0xF9CB, 0, /* 0xB0 */
+ 0, 0, 0, 0xF96C, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xEB38, 0xE5F3, 0, /* 0xC0 */
+ 0, 0xF9D9, 0, 0, 0xE133, 0, 0, 0, /* 0xD0 */
+ 0xE7F9, 0, 0, 0xE4EA, 0xF5F5, 0, 0xF2C7, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE4DA, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xE84D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEF38, /* 0x00 */
+ 0xE93F, 0, 0, 0, 0, 0, 0xF333, 0, /* 0x00 */
+ 0, 0, 0, 0xE1D5, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xEB39, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xEA3C, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF34A, 0xF241, 0, 0, 0xF242, 0, /* 0x40 */
+ 0, 0, 0xF65D, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF262, /* 0x50 */
+ 0, 0xE656, 0, 0, 0, 0, 0, 0xEB75, /* 0x60 */
+ 0, 0, 0xF4BB, 0, 0xEDE1, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xED5B, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xE6A3, 0, 0, /* 0x80 */
+ 0xE8C2, 0, 0, 0, 0, 0xE0A0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE2CF /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_AC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, 0x8868, /* 0x00 */
+ 0x8869, 0x886A, 0x886B, 0x886C, 0x886D, 0x886E, 0x886F, 0x8870, /* 0x00 */
+ 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879, /* 0x10 */
+ 0x887A, 0x887B, 0x887C, 0x887D, 0x8881, 0x8882, 0x8883, 0x8884, /* 0x10 */
+ 0x8885, 0x8886, 0x8887, 0x8888, 0x8889, 0x888A, 0x888B, 0x888C, /* 0x20 */
+ 0x888D, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, /* 0x20 */
+ 0x8896, 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889C, 0x889D, /* 0x30 */
+ 0x88A1, 0x88A2, 0x88A3, 0x88A4, 0x88A5, 0x88A6, 0x88A7, 0x88A8, /* 0x30 */
+ 0x88A9, 0x88AA, 0x88AB, 0x88AC, 0x88AD, 0x88AE, 0x88AF, 0x88B0, /* 0x40 */
+ 0x88B1, 0x88B3, 0x88B4, 0x88B5, 0x88B6, 0x88B7, 0x88B8, 0x88B9, /* 0x40 */
+ 0x88BA, 0x88BB, 0x88BC, 0x88BD, 0x88C1, 0x88C2, 0x88C3, 0x88C4, /* 0x50 */
+ 0x88C5, 0x88C6, 0x88C7, 0x88C8, 0x88C9, 0x88CA, 0x88CB, 0x88CC, /* 0x50 */
+ 0x88CD, 0x88CE, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D4, 0x88D5, /* 0x60 */
+ 0x88D6, 0x88D7, 0x88D8, 0x88D9, 0x88DA, 0x88DB, 0x88DC, 0x88DD, /* 0x60 */
+ 0x88E1, 0x88E2, 0x88E3, 0x88E4, 0x88E5, 0x88E6, 0x88E7, 0x88E8, /* 0x70 */
+ 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F0, /* 0x70 */
+ 0x88F1, 0x88F3, 0x88F4, 0x88F5, 0x88F6, 0x88F7, 0x88F8, 0x88F9, /* 0x80 */
+ 0x88FA, 0x88FB, 0x88FC, 0x88FD, 0x8941, 0x8942, 0x8943, 0x8944, /* 0x80 */
+ 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894A, 0x894B, 0x894C, /* 0x90 */
+ 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, 0x8953, 0x8954, 0x8955, /* 0x90 */
+ 0x8956, 0x8957, 0x8958, 0x8959, 0x895A, 0x895B, 0x895C, 0x895D, /* 0xA0 */
+ 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968, /* 0xA0 */
+ 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, 0x896F, 0x8970, /* 0xB0 */
+ 0x8971, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, /* 0xB0 */
+ 0x897A, 0x897B, 0x897C, 0x897D, 0x8981, 0x8982, 0x8983, 0x8984, /* 0xC0 */
+ 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898A, 0x898B, 0x898C, /* 0xC0 */
+ 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8993, 0x8994, 0x8995, /* 0xD0 */
+ 0x8996, 0x8997, 0x8998, 0x8999, 0x899A, 0x899B, 0x899C, 0x899D, /* 0xD0 */
+ 0x89A1, 0x89A2, 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0x89A7, 0x89A8, /* 0xE0 */
+ 0x89A9, 0x89AA, 0x89AB, 0x89AC, 0x89AD, 0x89AE, 0x89AF, 0x89B0, /* 0xE0 */
+ 0x89B1, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89B8, 0x89B9, /* 0xF0 */
+ 0x89BA, 0x89BB, 0x89BC, 0x89BD, 0x89C1, 0x89C2, 0x89C3, 0x89C4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_AD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x89C5, 0x89C6, 0x89C7, 0x89C8, 0x89C9, 0x89CA, 0x89CB, 0x89CC, /* 0x00 */
+ 0x89CD, 0x89CE, 0x89CF, 0x89D0, 0x89D1, 0x89D3, 0x89D4, 0x89D5, /* 0x00 */
+ 0x89D6, 0x89D7, 0x89D8, 0x89D9, 0x89DA, 0x89DB, 0x89DC, 0x89DD, /* 0x10 */
+ 0x89E1, 0x89E2, 0x89E3, 0x89E4, 0x89E5, 0x89E6, 0x89E7, 0x89E8, /* 0x10 */
+ 0x89E9, 0x89EA, 0x89EB, 0x89EC, 0x89ED, 0x89EE, 0x89EF, 0x89F0, /* 0x20 */
+ 0x89F1, 0x89F3, 0x89F4, 0x89F5, 0x89F6, 0x89F7, 0x89F8, 0x89F9, /* 0x20 */
+ 0x89FA, 0x89FB, 0x89FC, 0x89FD, 0x8A41, 0x8A42, 0x8A43, 0x8A44, /* 0x30 */
+ 0x8A45, 0x8A46, 0x8A47, 0x8A48, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, /* 0x30 */
+ 0x8A4D, 0x8A4E, 0x8A4F, 0x8A50, 0x8A51, 0x8A53, 0x8A54, 0x8A55, /* 0x40 */
+ 0x8A56, 0x8A57, 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, /* 0x40 */
+ 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, 0x8A66, 0x8A67, 0x8A68, /* 0x50 */
+ 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, 0x8A6E, 0x8A6F, 0x8A70, /* 0x50 */
+ 0x8A71, 0x8A73, 0x8A74, 0x8A75, 0x8A76, 0x8A77, 0x8A78, 0x8A79, /* 0x60 */
+ 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A81, 0x8A82, 0x8A83, 0x8A84, /* 0x60 */
+ 0x8A85, 0x8A86, 0x8A87, 0x8A88, 0x8A89, 0x8A8A, 0x8A8B, 0x8A8C, /* 0x70 */
+ 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A93, 0x8A94, 0x8A95, /* 0x70 */
+ 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, 0x8A9C, 0x8A9D, /* 0x80 */
+ 0x8AA1, 0x8AA2, 0x8AA3, 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, /* 0x80 */
+ 0x8AA9, 0x8AAA, 0x8AAB, 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, /* 0x90 */
+ 0x8AB1, 0x8AB3, 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, /* 0x90 */
+ 0x8ABA, 0x8ABB, 0x8ABC, 0x8ABD, 0x8AC1, 0x8AC2, 0x8AC3, 0x8AC4, /* 0xA0 */
+ 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA, 0x8ACB, 0x8ACC, /* 0xA0 */
+ 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD3, 0x8AD4, 0x8AD5, /* 0xB0 */
+ 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA, 0x8ADB, 0x8ADC, 0x8ADD, /* 0xB0 */
+ 0x8AE1, 0x8AE2, 0x8AE3, 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, /* 0xC0 */
+ 0x8AE9, 0x8AEA, 0x8AEB, 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, 0x8AF0, /* 0xC0 */
+ 0x8AF1, 0x8AF3, 0x8AF4, 0x8AF5, 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, /* 0xD0 */
+ 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, 0x8B41, 0x8B42, 0x8B43, 0x8B44, /* 0xD0 */
+ 0x8B45, 0x8B46, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, /* 0xE0 */
+ 0x8B4D, 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, 0x8B53, 0x8B54, 0x8B55, /* 0xE0 */
+ 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, /* 0xF0 */
+ 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, 0x8B66, 0x8B67, 0x8B68 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_AE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B69, 0x8B6A, 0x8B6B, 0x8B6C, 0x8B6D, 0x8B6E, 0x8B6F, 0x8B70, /* 0x00 */
+ 0x8B71, 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, /* 0x00 */
+ 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7D, 0x8B81, 0x8B82, 0x8B83, 0x8B84, /* 0x10 */
+ 0x8B85, 0x8B86, 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, /* 0x10 */
+ 0x8B8D, 0x8B8E, 0x8B8F, 0x8B90, 0x8B91, 0x8B93, 0x8B94, 0x8B95, /* 0x20 */
+ 0x8B96, 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, 0x8B9C, 0x8B9D, /* 0x20 */
+ 0x8BA1, 0x8BA2, 0x8BA3, 0x8BA4, 0x8BA5, 0x8BA6, 0x8BA7, 0x8BA8, /* 0x30 */
+ 0x8BA9, 0x8BAA, 0x8BAB, 0x8BAC, 0x8BAD, 0x8BAE, 0x8BAF, 0x8BB0, /* 0x30 */
+ 0x8BB1, 0x8BB3, 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x8BB8, 0x8BB9, /* 0x40 */
+ 0x8BBA, 0x8BBB, 0x8BBC, 0x8BBD, 0x8C61, 0x8C62, 0x8C63, 0x8C64, /* 0x40 */
+ 0x8C65, 0x8C66, 0x8C67, 0x8C68, 0x8C69, 0x8C6A, 0x8C6B, 0x8C6C, /* 0x50 */
+ 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, 0x8C71, 0x8C73, 0x8C74, 0x8C75, /* 0x50 */
+ 0x8C76, 0x8C77, 0x8C78, 0x8C79, 0x8C7A, 0x8C7B, 0x8C7C, 0x8C7D, /* 0x60 */
+ 0x8C81, 0x8C82, 0x8C83, 0x8C84, 0x8C85, 0x8C86, 0x8C87, 0x8C88, /* 0x60 */
+ 0x8C89, 0x8C8A, 0x8C8B, 0x8C8C, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, /* 0x70 */
+ 0x8C91, 0x8C93, 0x8C94, 0x8C95, 0x8C96, 0x8C97, 0x8C98, 0x8C99, /* 0x70 */
+ 0x8C9A, 0x8C9B, 0x8C9C, 0x8C9D, 0x8CA1, 0x8CA2, 0x8CA3, 0x8CA4, /* 0x80 */
+ 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, 0x8CAC, /* 0x80 */
+ 0x8CAD, 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB3, 0x8CB4, 0x8CB5, /* 0x90 */
+ 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, /* 0x90 */
+ 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, 0x8CC6, 0x8CC7, 0x8CC8, /* 0xA0 */
+ 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, /* 0xA0 */
+ 0x8CD1, 0x8CD3, 0x8CD4, 0x8CD5, 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, /* 0xB0 */
+ 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, /* 0xB0 */
+ 0x8CE5, 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, /* 0xC0 */
+ 0x8CED, 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF3, 0x8CF4, 0x8CF5, /* 0xC0 */
+ 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, /* 0xD0 */
+ 0x8D41, 0x8D42, 0x8D43, 0x8D44, 0x8D45, 0x8D46, 0x8D47, 0x8D48, /* 0xD0 */
+ 0x8D49, 0x8D4A, 0x8D4B, 0x8D4C, 0x8D4D, 0x8D4E, 0x8D4F, 0x8D50, /* 0xE0 */
+ 0x8D51, 0x8D53, 0x8D54, 0x8D55, 0x8D56, 0x8D57, 0x8D58, 0x8D59, /* 0xE0 */
+ 0x8D5A, 0x8D5B, 0x8D5C, 0x8D5D, 0x8D61, 0x8D62, 0x8D63, 0x8D64, /* 0xF0 */
+ 0x8D65, 0x8D66, 0x8D67, 0x8D68, 0x8D69, 0x8D6A, 0x8D6B, 0x8D6C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_AF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8D6D, 0x8D6E, 0x8D6F, 0x8D70, 0x8D71, 0x8D73, 0x8D74, 0x8D75, /* 0x00 */
+ 0x8D76, 0x8D77, 0x8D78, 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C, 0x8D7D, /* 0x00 */
+ 0x8D81, 0x8D82, 0x8D83, 0x8D84, 0x8D85, 0x8D86, 0x8D87, 0x8D88, /* 0x10 */
+ 0x8D89, 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, /* 0x10 */
+ 0x8D91, 0x8D93, 0x8D94, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, /* 0x20 */
+ 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D, 0x8DA1, 0x8DA2, 0x8DA3, 0x8DA4, /* 0x20 */
+ 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, /* 0x30 */
+ 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB1, 0x8DB3, 0x8DB4, 0x8DB5, /* 0x30 */
+ 0x8DB6, 0x8DB7, 0x8DB8, 0x8DB9, 0x8DBA, 0x8DBB, 0x8DBC, 0x8DBD, /* 0x40 */
+ 0x8DC1, 0x8DC2, 0x8DC3, 0x8DC4, 0x8DC5, 0x8DC6, 0x8DC7, 0x8DC8, /* 0x40 */
+ 0x8DC9, 0x8DCA, 0x8DCB, 0x8DCC, 0x8DCD, 0x8DCE, 0x8DCF, 0x8DD0, /* 0x50 */
+ 0x8DD1, 0x8DD3, 0x8DD4, 0x8DD5, 0x8DD6, 0x8DD7, 0x8DD8, 0x8DD9, /* 0x50 */
+ 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x8DE1, 0x8DE2, 0x8DE3, 0x8DE4, /* 0x60 */
+ 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE8, 0x8DE9, 0x8DEA, 0x8DEB, 0x8DEC, /* 0x60 */
+ 0x8DED, 0x8DEE, 0x8DEF, 0x8DF0, 0x8DF1, 0x8DF3, 0x8DF4, 0x8DF5, /* 0x70 */
+ 0x8DF6, 0x8DF7, 0x8DF8, 0x8DF9, 0x8DFA, 0x8DFB, 0x8DFC, 0x8DFD, /* 0x70 */
+ 0x8E41, 0x8E42, 0x8E43, 0x8E44, 0x8E45, 0x8E46, 0x8E47, 0x8E48, /* 0x80 */
+ 0x8E49, 0x8E4A, 0x8E4B, 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, /* 0x80 */
+ 0x8E51, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, 0x8E59, /* 0x90 */
+ 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E61, 0x8E62, 0x8E63, 0x8E64, /* 0x90 */
+ 0x8E65, 0x8E66, 0x8E67, 0x8E68, 0x8E69, 0x8E6A, 0x8E6B, 0x8E6C, /* 0xA0 */
+ 0x8E6D, 0x8E6E, 0x8E6F, 0x8E70, 0x8E71, 0x8E73, 0x8E74, 0x8E75, /* 0xA0 */
+ 0x8E76, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E7B, 0x8E7C, 0x8E7D, /* 0xB0 */
+ 0x8E81, 0x8E82, 0x8E83, 0x8E84, 0x8E85, 0x8E86, 0x8E87, 0x8E88, /* 0xB0 */
+ 0x8E89, 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E8F, 0x8E90, /* 0xC0 */
+ 0x8E91, 0x8E93, 0x8E94, 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, /* 0xC0 */
+ 0x8E9A, 0x8E9B, 0x8E9C, 0x8E9D, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, /* 0xD0 */
+ 0x8EA5, 0x8EA6, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAB, 0x8EAC, /* 0xD0 */
+ 0x8EAD, 0x8EAE, 0x8EAF, 0x8EB0, 0x8EB1, 0x8EB3, 0x8EB4, 0x8EB5, /* 0xE0 */
+ 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBA, 0x8EBB, 0x8EBC, 0x8EBD, /* 0xE0 */
+ 0x8EC1, 0x8EC2, 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, /* 0xF0 */
+ 0x8EC9, 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECE, 0x8ECF, 0x8ED0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8ED1, 0x8ED3, 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, /* 0x00 */
+ 0x8EDA, 0x8EDB, 0x8EDC, 0x8EDD, 0x8EE1, 0x8EE2, 0x8EE3, 0x8EE4, /* 0x00 */
+ 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, /* 0x10 */
+ 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF3, 0x8EF4, 0x8EF5, /* 0x10 */
+ 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, 0x8EFD, /* 0x20 */
+ 0x8F41, 0x8F42, 0x8F43, 0x8F44, 0x8F45, 0x8F46, 0x8F47, 0x8F48, /* 0x20 */
+ 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, /* 0x30 */
+ 0x8F51, 0x8F53, 0x8F54, 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, /* 0x30 */
+ 0x8F5A, 0x8F5B, 0x8F5C, 0x8F5D, 0x8F61, 0x8F62, 0x8F63, 0x8F64, /* 0x40 */
+ 0x8F65, 0x8F66, 0x8F67, 0x8F68, 0x8F69, 0x8F6A, 0x8F6B, 0x8F6C, /* 0x40 */
+ 0x8F6D, 0x8F6E, 0x8F6F, 0x8F70, 0x8F71, 0x8F73, 0x8F74, 0x8F75, /* 0x50 */
+ 0x8F76, 0x8F77, 0x8F78, 0x8F79, 0x8F7A, 0x8F7B, 0x8F7C, 0x8F7D, /* 0x50 */
+ 0x8F81, 0x8F82, 0x8F83, 0x8F84, 0x8F85, 0x8F86, 0x8F87, 0x8F88, /* 0x60 */
+ 0x8F89, 0x8F8A, 0x8F8B, 0x8F8C, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F90, /* 0x60 */
+ 0x8F91, 0x8F93, 0x8F94, 0x8F95, 0x8F96, 0x8F97, 0x8F98, 0x8F99, /* 0x70 */
+ 0x8F9A, 0x8F9B, 0x8F9C, 0x8F9D, 0x8FA1, 0x8FA2, 0x8FA3, 0x8FA4, /* 0x70 */
+ 0x8FA5, 0x8FA6, 0x8FA7, 0x8FA8, 0x8FA9, 0x8FAA, 0x8FAB, 0x8FAC, /* 0x80 */
+ 0x8FAD, 0x8FAE, 0x8FAF, 0x8FB0, 0x8FB1, 0x8FB3, 0x8FB4, 0x8FB5, /* 0x80 */
+ 0x8FB6, 0x8FB7, 0x8FB8, 0x8FB9, 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBD, /* 0x90 */
+ 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, 0x9068, /* 0x90 */
+ 0x9069, 0x906A, 0x906B, 0x906C, 0x906D, 0x906E, 0x906F, 0x9070, /* 0xA0 */
+ 0x9071, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079, /* 0xA0 */
+ 0x907A, 0x907B, 0x907C, 0x907D, 0x9081, 0x9082, 0x9083, 0x9084, /* 0xB0 */
+ 0x9085, 0x9086, 0x9087, 0x9088, 0x9089, 0x908A, 0x908B, 0x908C, /* 0xB0 */
+ 0x908D, 0x908E, 0x908F, 0x9090, 0x9091, 0x9093, 0x9094, 0x9095, /* 0xC0 */
+ 0x9096, 0x9097, 0x9098, 0x9099, 0x909A, 0x909B, 0x909C, 0x909D, /* 0xC0 */
+ 0x90A1, 0x90A2, 0x90A3, 0x90A4, 0x90A5, 0x90A6, 0x90A7, 0x90A8, /* 0xD0 */
+ 0x90A9, 0x90AA, 0x90AB, 0x90AC, 0x90AD, 0x90AE, 0x90AF, 0x90B0, /* 0xD0 */
+ 0x90B1, 0x90B3, 0x90B4, 0x90B5, 0x90B6, 0x90B7, 0x90B8, 0x90B9, /* 0xE0 */
+ 0x90BA, 0x90BB, 0x90BC, 0x90BD, 0x90C1, 0x90C2, 0x90C3, 0x90C4, /* 0xE0 */
+ 0x90C5, 0x90C6, 0x90C7, 0x90C8, 0x90C9, 0x90CA, 0x90CB, 0x90CC, /* 0xF0 */
+ 0x90CD, 0x90CE, 0x90CF, 0x90D0, 0x90D1, 0x90D3, 0x90D4, 0x90D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x90D6, 0x90D7, 0x90D8, 0x90D9, 0x90DA, 0x90DB, 0x90DC, 0x90DD, /* 0x00 */
+ 0x90E1, 0x90E2, 0x90E3, 0x90E4, 0x90E5, 0x90E6, 0x90E7, 0x90E8, /* 0x00 */
+ 0x90E9, 0x90EA, 0x90EB, 0x90EC, 0x90ED, 0x90EE, 0x90EF, 0x90F0, /* 0x10 */
+ 0x90F1, 0x90F3, 0x90F4, 0x90F5, 0x90F6, 0x90F7, 0x90F8, 0x90F9, /* 0x10 */
+ 0x90FA, 0x90FB, 0x90FC, 0x90FD, 0x9141, 0x9142, 0x9143, 0x9144, /* 0x20 */
+ 0x9145, 0x9146, 0x9147, 0x9148, 0x9149, 0x914A, 0x914B, 0x914C, /* 0x20 */
+ 0x914D, 0x914E, 0x914F, 0x9150, 0x9151, 0x9153, 0x9154, 0x9155, /* 0x30 */
+ 0x9156, 0x9157, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, /* 0x30 */
+ 0x9161, 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, /* 0x40 */
+ 0x9169, 0x916A, 0x916B, 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, /* 0x40 */
+ 0x9171, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, /* 0x50 */
+ 0x917A, 0x917B, 0x917C, 0x917D, 0x9181, 0x9182, 0x9183, 0x9184, /* 0x50 */
+ 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C, /* 0x60 */
+ 0x918D, 0x918E, 0x918F, 0x9190, 0x9191, 0x9193, 0x9194, 0x9195, /* 0x60 */
+ 0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0x919C, 0x919D, /* 0x70 */
+ 0x91A1, 0x91A2, 0x91A3, 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8, /* 0x70 */
+ 0x91A9, 0x91AA, 0x91AB, 0x91AC, 0x91AD, 0x91AE, 0x91AF, 0x91B0, /* 0x80 */
+ 0x91B1, 0x91B3, 0x91B4, 0x91B5, 0x91B6, 0x91B7, 0x91B8, 0x91B9, /* 0x80 */
+ 0x91BA, 0x91BB, 0x91BC, 0x91BD, 0x91C1, 0x91C2, 0x91C3, 0x91C4, /* 0x90 */
+ 0x91C5, 0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC, /* 0x90 */
+ 0x91CD, 0x91CE, 0x91CF, 0x91D0, 0x91D1, 0x91D3, 0x91D4, 0x91D5, /* 0xA0 */
+ 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, /* 0xA0 */
+ 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5, 0x91E6, 0x91E7, 0x91E8, /* 0xB0 */
+ 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, /* 0xB0 */
+ 0x91F1, 0x91F3, 0x91F4, 0x91F5, 0x91F6, 0x91F7, 0x91F8, 0x91F9, /* 0xC0 */
+ 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x9241, 0x9242, 0x9243, 0x9244, /* 0xC0 */
+ 0x9245, 0x9246, 0x9247, 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, /* 0xD0 */
+ 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, 0x9253, 0x9254, 0x9255, /* 0xD0 */
+ 0x9256, 0x9257, 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, /* 0xE0 */
+ 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, /* 0xE0 */
+ 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, /* 0xF0 */
+ 0x9271, 0x9273, 0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x927A, 0x927B, 0x927C, 0x927D, 0x9281, 0x9282, 0x9283, 0x9284, /* 0x00 */
+ 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, /* 0x00 */
+ 0x928D, 0x928E, 0x928F, 0x9290, 0x9291, 0x9293, 0x9294, 0x9295, /* 0x10 */
+ 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, /* 0x10 */
+ 0x92A1, 0x92A2, 0x92A3, 0x92A4, 0x92A5, 0x92A6, 0x92A7, 0x92A8, /* 0x20 */
+ 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AE, 0x92AF, 0x92B0, /* 0x20 */
+ 0x92B1, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B7, 0x92B8, 0x92B9, /* 0x30 */
+ 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92C1, 0x92C2, 0x92C3, 0x92C4, /* 0x30 */
+ 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0x92CA, 0x92CB, 0x92CC, /* 0x40 */
+ 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D3, 0x92D4, 0x92D5, /* 0x40 */
+ 0x92D6, 0x92D7, 0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, /* 0x50 */
+ 0x92E1, 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, /* 0x50 */
+ 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, /* 0x60 */
+ 0x92F1, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, /* 0x60 */
+ 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x9341, 0x9342, 0x9343, 0x9344, /* 0x70 */
+ 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, 0x934B, 0x934C, /* 0x70 */
+ 0x934D, 0x934E, 0x934F, 0x9350, 0x9351, 0x9353, 0x9354, 0x9355, /* 0x80 */
+ 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x935C, 0x935D, /* 0x80 */
+ 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, /* 0x90 */
+ 0x9369, 0x936A, 0x936B, 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, /* 0x90 */
+ 0x9371, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, /* 0xA0 */
+ 0x937A, 0x937B, 0x937C, 0x937D, 0x9381, 0x9382, 0x9383, 0x9384, /* 0xA0 */
+ 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, 0x938C, /* 0xB0 */
+ 0x938D, 0x938E, 0x938F, 0x9390, 0x9391, 0x9393, 0x9394, 0x9395, /* 0xB0 */
+ 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, /* 0xC0 */
+ 0x93A1, 0x93A2, 0x93A3, 0x93A4, 0x93A5, 0x93A6, 0x93A7, 0x93A8, /* 0xC0 */
+ 0x93A9, 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, /* 0xD0 */
+ 0x93B1, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, /* 0xD0 */
+ 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x9461, 0x9462, 0x9463, 0x9464, /* 0xE0 */
+ 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946B, 0x946C, /* 0xE0 */
+ 0x946D, 0x946E, 0x946F, 0x9470, 0x9471, 0x9473, 0x9474, 0x9475, /* 0xF0 */
+ 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, /* 0x00 */
+ 0x9489, 0x948A, 0x948B, 0x948C, 0x948D, 0x948E, 0x948F, 0x9490, /* 0x00 */
+ 0x9491, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, /* 0x10 */
+ 0x949A, 0x949B, 0x949C, 0x949D, 0x94A1, 0x94A2, 0x94A3, 0x94A4, /* 0x10 */
+ 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, /* 0x20 */
+ 0x94AD, 0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B3, 0x94B4, 0x94B5, /* 0x20 */
+ 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, 0x94BD, /* 0x30 */
+ 0x94C1, 0x94C2, 0x94C3, 0x94C4, 0x94C5, 0x94C6, 0x94C7, 0x94C8, /* 0x30 */
+ 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94CF, 0x94D0, /* 0x40 */
+ 0x94D1, 0x94D3, 0x94D4, 0x94D5, 0x94D6, 0x94D7, 0x94D8, 0x94D9, /* 0x40 */
+ 0x94DA, 0x94DB, 0x94DC, 0x94DD, 0x94E1, 0x94E2, 0x94E3, 0x94E4, /* 0x50 */
+ 0x94E5, 0x94E6, 0x94E7, 0x94E8, 0x94E9, 0x94EA, 0x94EB, 0x94EC, /* 0x50 */
+ 0x94ED, 0x94EE, 0x94EF, 0x94F0, 0x94F1, 0x94F3, 0x94F4, 0x94F5, /* 0x60 */
+ 0x94F6, 0x94F7, 0x94F8, 0x94F9, 0x94FA, 0x94FB, 0x94FC, 0x94FD, /* 0x60 */
+ 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, /* 0x70 */
+ 0x9549, 0x954A, 0x954B, 0x954C, 0x954D, 0x954E, 0x954F, 0x9550, /* 0x70 */
+ 0x9551, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, /* 0x80 */
+ 0x955A, 0x955B, 0x955C, 0x955D, 0x9561, 0x9562, 0x9563, 0x9564, /* 0x80 */
+ 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, /* 0x90 */
+ 0x956D, 0x956E, 0x956F, 0x9570, 0x9571, 0x9573, 0x9574, 0x9575, /* 0x90 */
+ 0x9576, 0x9577, 0x9578, 0x9579, 0x957A, 0x957B, 0x957C, 0x957D, /* 0xA0 */
+ 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, /* 0xA0 */
+ 0x9589, 0x958A, 0x958B, 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, /* 0xB0 */
+ 0x9591, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, /* 0xB0 */
+ 0x959A, 0x959B, 0x959C, 0x959D, 0x95A1, 0x95A2, 0x95A3, 0x95A4, /* 0xC0 */
+ 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA, 0x95AB, 0x95AC, /* 0xC0 */
+ 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B3, 0x95B4, 0x95B5, /* 0xD0 */
+ 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA, 0x95BB, 0x95BC, 0x95BD, /* 0xD0 */
+ 0x95C1, 0x95C2, 0x95C3, 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, /* 0xE0 */
+ 0x95C9, 0x95CA, 0x95CB, 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, /* 0xE0 */
+ 0x95D1, 0x95D3, 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, /* 0xF0 */
+ 0x95DA, 0x95DB, 0x95DC, 0x95DD, 0x95E1, 0x95E2, 0x95E3, 0x95E4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x95E5, 0x95E6, 0x95E7, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, /* 0x00 */
+ 0x95ED, 0x95EE, 0x95EF, 0x95F0, 0x95F1, 0x95F3, 0x95F4, 0x95F5, /* 0x00 */
+ 0x95F6, 0x95F7, 0x95F8, 0x95F9, 0x95FA, 0x95FB, 0x95FC, 0x95FD, /* 0x10 */
+ 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, 0x9648, /* 0x10 */
+ 0x9649, 0x964A, 0x964B, 0x964C, 0x964D, 0x964E, 0x964F, 0x9650, /* 0x20 */
+ 0x9651, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, /* 0x20 */
+ 0x965A, 0x965B, 0x965C, 0x965D, 0x9661, 0x9662, 0x9663, 0x9664, /* 0x30 */
+ 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966A, 0x966B, 0x966C, /* 0x30 */
+ 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, 0x9673, 0x9674, 0x9675, /* 0x40 */
+ 0x9676, 0x9677, 0x9678, 0x9679, 0x967A, 0x967B, 0x967C, 0x967D, /* 0x40 */
+ 0x9681, 0x9682, 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, 0x9688, /* 0x50 */
+ 0x9689, 0x968A, 0x968B, 0x968C, 0x968D, 0x968E, 0x968F, 0x9690, /* 0x50 */
+ 0x9691, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, 0x9698, 0x9699, /* 0x60 */
+ 0x969A, 0x969B, 0x969C, 0x969D, 0x96A1, 0x96A2, 0x96A3, 0x96A4, /* 0x60 */
+ 0x96A5, 0x96A6, 0x96A7, 0x96A8, 0x96A9, 0x96AA, 0x96AB, 0x96AC, /* 0x70 */
+ 0x96AD, 0x96AE, 0x96AF, 0x96B0, 0x96B1, 0x96B3, 0x96B4, 0x96B5, /* 0x70 */
+ 0x96B6, 0x96B7, 0x96B8, 0x96B9, 0x96BA, 0x96BB, 0x96BC, 0x96BD, /* 0x80 */
+ 0x96C1, 0x96C2, 0x96C3, 0x96C4, 0x96C5, 0x96C6, 0x96C7, 0x96C8, /* 0x80 */
+ 0x96C9, 0x96CA, 0x96CB, 0x96CC, 0x96CD, 0x96CE, 0x96CF, 0x96D0, /* 0x90 */
+ 0x96D1, 0x96D3, 0x96D4, 0x96D5, 0x96D6, 0x96D7, 0x96D8, 0x96D9, /* 0x90 */
+ 0x96DA, 0x96DB, 0x96DC, 0x96DD, 0x96E1, 0x96E2, 0x96E3, 0x96E4, /* 0xA0 */
+ 0x96E5, 0x96E6, 0x96E7, 0x96E8, 0x96E9, 0x96EA, 0x96EB, 0x96EC, /* 0xA0 */
+ 0x96ED, 0x96EE, 0x96EF, 0x96F0, 0x96F1, 0x96F3, 0x96F4, 0x96F5, /* 0xB0 */
+ 0x96F6, 0x96F7, 0x96F8, 0x96F9, 0x96FA, 0x96FB, 0x96FC, 0x96FD, /* 0xB0 */
+ 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, /* 0xC0 */
+ 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E, 0x974F, 0x9750, /* 0xC0 */
+ 0x9751, 0x9753, 0x9754, 0x9755, 0x9756, 0x9757, 0x9758, 0x9759, /* 0xD0 */
+ 0x975A, 0x975B, 0x975C, 0x975D, 0x9761, 0x9762, 0x9763, 0x9764, /* 0xD0 */
+ 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976A, 0x976B, 0x976C, /* 0xE0 */
+ 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0x9773, 0x9774, 0x9775, /* 0xE0 */
+ 0x9776, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977C, 0x977D, /* 0xF0 */
+ 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, 0x9788 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9789, 0x978A, 0x978B, 0x978C, 0x978D, 0x978E, 0x978F, 0x9790, /* 0x00 */
+ 0x9791, 0x9793, 0x9794, 0x9795, 0x9796, 0x9797, 0x9798, 0x9799, /* 0x00 */
+ 0x979A, 0x979B, 0x979C, 0x979D, 0x97A1, 0x97A2, 0x97A3, 0x97A4, /* 0x10 */
+ 0x97A5, 0x97A6, 0x97A7, 0x97A8, 0x97A9, 0x97AA, 0x97AB, 0x97AC, /* 0x10 */
+ 0x97AD, 0x97AE, 0x97AF, 0x97B0, 0x97B1, 0x97B3, 0x97B4, 0x97B5, /* 0x20 */
+ 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BD, /* 0x20 */
+ 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, /* 0x30 */
+ 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, 0x986E, 0x986F, 0x9870, /* 0x30 */
+ 0x9871, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878, 0x9879, /* 0x40 */
+ 0x987A, 0x987B, 0x987C, 0x987D, 0x9881, 0x9882, 0x9883, 0x9884, /* 0x40 */
+ 0x9885, 0x9886, 0x9887, 0x9888, 0x9889, 0x988A, 0x988B, 0x988C, /* 0x50 */
+ 0x988D, 0x988E, 0x988F, 0x9890, 0x9891, 0x9893, 0x9894, 0x9895, /* 0x50 */
+ 0x9896, 0x9897, 0x9898, 0x9899, 0x989A, 0x989B, 0x989C, 0x989D, /* 0x60 */
+ 0x98A1, 0x98A2, 0x98A3, 0x98A4, 0x98A5, 0x98A6, 0x98A7, 0x98A8, /* 0x60 */
+ 0x98A9, 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98AE, 0x98AF, 0x98B0, /* 0x70 */
+ 0x98B1, 0x98B3, 0x98B4, 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, /* 0x70 */
+ 0x98BA, 0x98BB, 0x98BC, 0x98BD, 0x98C1, 0x98C2, 0x98C3, 0x98C4, /* 0x80 */
+ 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0x98CB, 0x98CC, /* 0x80 */
+ 0x98CD, 0x98CE, 0x98CF, 0x98D0, 0x98D1, 0x98D3, 0x98D4, 0x98D5, /* 0x90 */
+ 0x98D6, 0x98D7, 0x98D8, 0x98D9, 0x98DA, 0x98DB, 0x98DC, 0x98DD, /* 0x90 */
+ 0x98E1, 0x98E2, 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98E7, 0x98E8, /* 0xA0 */
+ 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0x98ED, 0x98EE, 0x98EF, 0x98F0, /* 0xA0 */
+ 0x98F1, 0x98F3, 0x98F4, 0x98F5, 0x98F6, 0x98F7, 0x98F8, 0x98F9, /* 0xB0 */
+ 0x98FA, 0x98FB, 0x98FC, 0x98FD, 0x9941, 0x9942, 0x9943, 0x9944, /* 0xB0 */
+ 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994A, 0x994B, 0x994C, /* 0xC0 */
+ 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, 0x9953, 0x9954, 0x9955, /* 0xC0 */
+ 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, 0x995B, 0x995C, 0x995D, /* 0xD0 */
+ 0x9961, 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968, /* 0xD0 */
+ 0x9969, 0x996A, 0x996B, 0x996C, 0x996D, 0x996E, 0x996F, 0x9970, /* 0xE0 */
+ 0x9971, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979, /* 0xE0 */
+ 0x997A, 0x997B, 0x997C, 0x997D, 0x9981, 0x9982, 0x9983, 0x9984, /* 0xF0 */
+ 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0x998A, 0x998B, 0x998C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x998D, 0x998E, 0x998F, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, /* 0x00 */
+ 0x9996, 0x9997, 0x9998, 0x9999, 0x999A, 0x999B, 0x999C, 0x999D, /* 0x00 */
+ 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A5, 0x99A6, 0x99A7, 0x99A8, /* 0x10 */
+ 0x99A9, 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, /* 0x10 */
+ 0x99B1, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, /* 0x20 */
+ 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99C1, 0x99C2, 0x99C3, 0x99C4, /* 0x20 */
+ 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB, 0x99CC, /* 0x30 */
+ 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1, 0x99D3, 0x99D4, 0x99D5, /* 0x30 */
+ 0x99D6, 0x99D7, 0x99D8, 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, /* 0x40 */
+ 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8, /* 0x40 */
+ 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, /* 0x50 */
+ 0x99F1, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9, /* 0x50 */
+ 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x9A41, 0x9A42, 0x9A43, 0x9A44, /* 0x60 */
+ 0x9A45, 0x9A46, 0x9A47, 0x9A48, 0x9A49, 0x9A4A, 0x9A4B, 0x9A4C, /* 0x60 */
+ 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, 0x9A51, 0x9A53, 0x9A54, 0x9A55, /* 0x70 */
+ 0x9A56, 0x9A57, 0x9A58, 0x9A59, 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, /* 0x70 */
+ 0x9A61, 0x9A62, 0x9A63, 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0x9A68, /* 0x80 */
+ 0x9A69, 0x9A6A, 0x9A6B, 0x9A6C, 0x9A6D, 0x9A6E, 0x9A6F, 0x9A70, /* 0x80 */
+ 0x9A71, 0x9A73, 0x9A74, 0x9A75, 0x9A76, 0x9A77, 0x9A78, 0x9A79, /* 0x90 */
+ 0x9A7A, 0x9A7B, 0x9A7C, 0x9A7D, 0x9A81, 0x9A82, 0x9A83, 0x9A84, /* 0x90 */
+ 0x9A85, 0x9A86, 0x9A87, 0x9A88, 0x9A89, 0x9A8A, 0x9A8B, 0x9A8C, /* 0xA0 */
+ 0x9A8D, 0x9A8E, 0x9A8F, 0x9A90, 0x9A91, 0x9A93, 0x9A94, 0x9A95, /* 0xA0 */
+ 0x9A96, 0x9A97, 0x9A98, 0x9A99, 0x9A9A, 0x9A9B, 0x9A9C, 0x9A9D, /* 0xB0 */
+ 0x9AA1, 0x9AA2, 0x9AA3, 0x9AA4, 0x9AA5, 0x9AA6, 0x9AA7, 0x9AA8, /* 0xB0 */
+ 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AAF, 0x9AB0, /* 0xC0 */
+ 0x9AB1, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB6, 0x9AB7, 0x9AB8, 0x9AB9, /* 0xC0 */
+ 0x9ABA, 0x9ABB, 0x9ABC, 0x9ABD, 0x9AC1, 0x9AC2, 0x9AC3, 0x9AC4, /* 0xD0 */
+ 0x9AC5, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACB, 0x9ACC, /* 0xD0 */
+ 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD1, 0x9AD3, 0x9AD4, 0x9AD5, /* 0xE0 */
+ 0x9AD6, 0x9AD7, 0x9AD8, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD, /* 0xE0 */
+ 0x9AE1, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE6, 0x9AE7, 0x9AE8, /* 0xF0 */
+ 0x9AE9, 0x9AEA, 0x9AEB, 0x9AEC, 0x9AED, 0x9AEE, 0x9AEF, 0x9AF0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9AF1, 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AF9, /* 0x00 */
+ 0x9AFA, 0x9AFB, 0x9AFC, 0x9AFD, 0x9B41, 0x9B42, 0x9B43, 0x9B44, /* 0x00 */
+ 0x9B45, 0x9B46, 0x9B47, 0x9B48, 0x9B49, 0x9B4A, 0x9B4B, 0x9B4C, /* 0x10 */
+ 0x9B4D, 0x9B4E, 0x9B4F, 0x9B50, 0x9B51, 0x9B53, 0x9B54, 0x9B55, /* 0x10 */
+ 0x9B56, 0x9B57, 0x9B58, 0x9B59, 0x9B5A, 0x9B5B, 0x9B5C, 0x9B5D, /* 0x20 */
+ 0x9B61, 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, /* 0x20 */
+ 0x9B69, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, /* 0x30 */
+ 0x9B71, 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, /* 0x30 */
+ 0x9B7A, 0x9B7B, 0x9B7C, 0x9B7D, 0x9B81, 0x9B82, 0x9B83, 0x9B84, /* 0x40 */
+ 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, 0x9B8C, /* 0x40 */
+ 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B93, 0x9B94, 0x9B95, /* 0x50 */
+ 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B, 0x9B9C, 0x9B9D, /* 0x50 */
+ 0x9BA1, 0x9BA2, 0x9BA3, 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, /* 0x60 */
+ 0x9BA9, 0x9BAA, 0x9BAB, 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, /* 0x60 */
+ 0x9BB1, 0x9BB3, 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, /* 0x70 */
+ 0x9BBA, 0x9BBB, 0x9BBC, 0x9BBD, 0x9C61, 0x9C62, 0x9C63, 0x9C64, /* 0x70 */
+ 0x9C65, 0x9C66, 0x9C67, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B, 0x9C6C, /* 0x80 */
+ 0x9C6D, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C73, 0x9C74, 0x9C75, /* 0x80 */
+ 0x9C76, 0x9C77, 0x9C78, 0x9C79, 0x9C7A, 0x9C7B, 0x9C7C, 0x9C7D, /* 0x90 */
+ 0x9C81, 0x9C82, 0x9C83, 0x9C84, 0x9C85, 0x9C86, 0x9C87, 0x9C88, /* 0x90 */
+ 0x9C89, 0x9C8A, 0x9C8B, 0x9C8C, 0x9C8D, 0x9C8E, 0x9C8F, 0x9C90, /* 0xA0 */
+ 0x9C91, 0x9C93, 0x9C94, 0x9C95, 0x9C96, 0x9C97, 0x9C98, 0x9C99, /* 0xA0 */
+ 0x9C9A, 0x9C9B, 0x9C9C, 0x9C9D, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA4, /* 0xB0 */
+ 0x9CA5, 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAA, 0x9CAB, 0x9CAC, /* 0xB0 */
+ 0x9CAD, 0x9CAE, 0x9CAF, 0x9CB0, 0x9CB1, 0x9CB3, 0x9CB4, 0x9CB5, /* 0xC0 */
+ 0x9CB6, 0x9CB7, 0x9CB8, 0x9CB9, 0x9CBA, 0x9CBB, 0x9CBC, 0x9CBD, /* 0xC0 */
+ 0x9CC1, 0x9CC2, 0x9CC3, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CC8, /* 0xD0 */
+ 0x9CC9, 0x9CCA, 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, /* 0xD0 */
+ 0x9CD1, 0x9CD3, 0x9CD4, 0x9CD5, 0x9CD6, 0x9CD7, 0x9CD8, 0x9CD9, /* 0xE0 */
+ 0x9CDA, 0x9CDB, 0x9CDC, 0x9CDD, 0x9CE1, 0x9CE2, 0x9CE3, 0x9CE4, /* 0xE0 */
+ 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0x9CE9, 0x9CEA, 0x9CEB, 0x9CEC, /* 0xF0 */
+ 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0x9CF3, 0x9CF4, 0x9CF5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9CF6, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, /* 0x00 */
+ 0x9D41, 0x9D42, 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, /* 0x00 */
+ 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, /* 0x10 */
+ 0x9D51, 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, /* 0x10 */
+ 0x9D5A, 0x9D5B, 0x9D5C, 0x9D5D, 0x9D61, 0x9D62, 0x9D63, 0x9D64, /* 0x20 */
+ 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, 0x9D6B, 0x9D6C, /* 0x20 */
+ 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D73, 0x9D74, 0x9D75, /* 0x30 */
+ 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0x9D7B, 0x9D7C, 0x9D7D, /* 0x30 */
+ 0x9D81, 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, /* 0x40 */
+ 0x9D89, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, /* 0x40 */
+ 0x9D91, 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99, /* 0x50 */
+ 0x9D9A, 0x9D9B, 0x9D9C, 0x9D9D, 0x9DA1, 0x9DA2, 0x9DA3, 0x9DA4, /* 0x50 */
+ 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA, 0x9DAB, 0x9DAC, /* 0x60 */
+ 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB3, 0x9DB4, 0x9DB5, /* 0x60 */
+ 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, 0x9DBD, /* 0x70 */
+ 0x9DC1, 0x9DC2, 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, /* 0x70 */
+ 0x9DC9, 0x9DCA, 0x9DCB, 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, /* 0x80 */
+ 0x9DD1, 0x9DD3, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, /* 0x80 */
+ 0x9DDA, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, /* 0x90 */
+ 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, /* 0x90 */
+ 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF3, 0x9DF4, 0x9DF5, /* 0xA0 */
+ 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0x9DFA, 0x9DFB, 0x9DFC, 0x9DFD, /* 0xA0 */
+ 0x9E41, 0x9E42, 0x9E43, 0x9E44, 0x9E45, 0x9E46, 0x9E47, 0x9E48, /* 0xB0 */
+ 0x9E49, 0x9E4A, 0x9E4B, 0x9E4C, 0x9E4D, 0x9E4E, 0x9E4F, 0x9E50, /* 0xB0 */
+ 0x9E51, 0x9E53, 0x9E54, 0x9E55, 0x9E56, 0x9E57, 0x9E58, 0x9E59, /* 0xC0 */
+ 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5D, 0x9E61, 0x9E62, 0x9E63, 0x9E64, /* 0xC0 */
+ 0x9E65, 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, /* 0xD0 */
+ 0x9E6D, 0x9E6E, 0x9E6F, 0x9E70, 0x9E71, 0x9E73, 0x9E74, 0x9E75, /* 0xD0 */
+ 0x9E76, 0x9E77, 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E7D, /* 0xE0 */
+ 0x9E81, 0x9E82, 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E87, 0x9E88, /* 0xE0 */
+ 0x9E89, 0x9E8A, 0x9E8B, 0x9E8C, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, /* 0xF0 */
+ 0x9E91, 0x9E93, 0x9E94, 0x9E95, 0x9E96, 0x9E97, 0x9E98, 0x9E99 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_B9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9D, 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, /* 0x00 */
+ 0x9EA5, 0x9EA6, 0x9EA7, 0x9EA8, 0x9EA9, 0x9EAA, 0x9EAB, 0x9EAC, /* 0x00 */
+ 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB1, 0x9EB3, 0x9EB4, 0x9EB5, /* 0x10 */
+ 0x9EB6, 0x9EB7, 0x9EB8, 0x9EB9, 0x9EBA, 0x9EBB, 0x9EBC, 0x9EBD, /* 0x10 */
+ 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC4, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, /* 0x20 */
+ 0x9EC9, 0x9ECA, 0x9ECB, 0x9ECC, 0x9ECD, 0x9ECE, 0x9ECF, 0x9ED0, /* 0x20 */
+ 0x9ED1, 0x9ED3, 0x9ED4, 0x9ED5, 0x9ED6, 0x9ED7, 0x9ED8, 0x9ED9, /* 0x30 */
+ 0x9EDA, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE1, 0x9EE2, 0x9EE3, 0x9EE4, /* 0x30 */
+ 0x9EE5, 0x9EE6, 0x9EE7, 0x9EE8, 0x9EE9, 0x9EEA, 0x9EEB, 0x9EEC, /* 0x40 */
+ 0x9EED, 0x9EEE, 0x9EEF, 0x9EF0, 0x9EF1, 0x9EF3, 0x9EF4, 0x9EF5, /* 0x40 */
+ 0x9EF6, 0x9EF7, 0x9EF8, 0x9EF9, 0x9EFA, 0x9EFB, 0x9EFC, 0x9EFD, /* 0x50 */
+ 0x9F41, 0x9F42, 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0x9F47, 0x9F48, /* 0x50 */
+ 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, 0x9F50, /* 0x60 */
+ 0x9F51, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, /* 0x60 */
+ 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F61, 0x9F62, 0x9F63, 0x9F64, /* 0x70 */
+ 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69, 0x9F6A, 0x9F6B, 0x9F6C, /* 0x70 */
+ 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F74, 0x9F75, /* 0x80 */
+ 0x9F76, 0x9F77, 0x9F78, 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, /* 0x80 */
+ 0x9F81, 0x9F82, 0x9F83, 0x9F84, 0x9F85, 0x9F86, 0x9F87, 0x9F88, /* 0x90 */
+ 0x9F89, 0x9F8A, 0x9F8B, 0x9F8C, 0x9F8D, 0x9F8E, 0x9F8F, 0x9F90, /* 0x90 */
+ 0x9F91, 0x9F93, 0x9F94, 0x9F95, 0x9F96, 0x9F97, 0x9F98, 0x9F99, /* 0xA0 */
+ 0x9F9A, 0x9F9B, 0x9F9C, 0x9F9D, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA4, /* 0xA0 */
+ 0x9FA5, 0x9FA6, 0x9FA7, 0x9FA8, 0x9FA9, 0x9FAA, 0x9FAB, 0x9FAC, /* 0xB0 */
+ 0x9FAD, 0x9FAE, 0x9FAF, 0x9FB0, 0x9FB1, 0x9FB3, 0x9FB4, 0x9FB5, /* 0xB0 */
+ 0x9FB6, 0x9FB7, 0x9FB8, 0x9FB9, 0x9FBA, 0x9FBB, 0x9FBC, 0x9FBD, /* 0xC0 */
+ 0xA061, 0xA062, 0xA063, 0xA064, 0xA065, 0xA066, 0xA067, 0xA068, /* 0xC0 */
+ 0xA069, 0xA06A, 0xA06B, 0xA06C, 0xA06D, 0xA06E, 0xA06F, 0xA070, /* 0xD0 */
+ 0xA071, 0xA073, 0xA074, 0xA075, 0xA076, 0xA077, 0xA078, 0xA079, /* 0xD0 */
+ 0xA07A, 0xA07B, 0xA07C, 0xA07D, 0xA081, 0xA082, 0xA083, 0xA084, /* 0xE0 */
+ 0xA085, 0xA086, 0xA087, 0xA088, 0xA089, 0xA08A, 0xA08B, 0xA08C, /* 0xE0 */
+ 0xA08D, 0xA08E, 0xA08F, 0xA090, 0xA091, 0xA093, 0xA094, 0xA095, /* 0xF0 */
+ 0xA096, 0xA097, 0xA098, 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_BA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA0A1, 0xA0A2, 0xA0A3, 0xA0A4, 0xA0A5, 0xA0A6, 0xA0A7, 0xA0A8, /* 0x00 */
+ 0xA0A9, 0xA0AA, 0xA0AB, 0xA0AC, 0xA0AD, 0xA0AE, 0xA0AF, 0xA0B0, /* 0x00 */
+ 0xA0B1, 0xA0B3, 0xA0B4, 0xA0B5, 0xA0B6, 0xA0B7, 0xA0B8, 0xA0B9, /* 0x10 */
+ 0xA0BA, 0xA0BB, 0xA0BC, 0xA0BD, 0xA0C1, 0xA0C2, 0xA0C3, 0xA0C4, /* 0x10 */
+ 0xA0C5, 0xA0C6, 0xA0C7, 0xA0C8, 0xA0C9, 0xA0CA, 0xA0CB, 0xA0CC, /* 0x20 */
+ 0xA0CD, 0xA0CE, 0xA0CF, 0xA0D0, 0xA0D1, 0xA0D3, 0xA0D4, 0xA0D5, /* 0x20 */
+ 0xA0D6, 0xA0D7, 0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, /* 0x30 */
+ 0xA0E1, 0xA0E2, 0xA0E3, 0xA0E4, 0xA0E5, 0xA0E6, 0xA0E7, 0xA0E8, /* 0x30 */
+ 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED, 0xA0EE, 0xA0EF, 0xA0F0, /* 0x40 */
+ 0xA0F1, 0xA0F3, 0xA0F4, 0xA0F5, 0xA0F6, 0xA0F7, 0xA0F8, 0xA0F9, /* 0x40 */
+ 0xA0FA, 0xA0FB, 0xA0FC, 0xA0FD, 0xA141, 0xA142, 0xA143, 0xA144, /* 0x50 */
+ 0xA145, 0xA146, 0xA147, 0xA148, 0xA149, 0xA14A, 0xA14B, 0xA14C, /* 0x50 */
+ 0xA14D, 0xA14E, 0xA14F, 0xA150, 0xA151, 0xA153, 0xA154, 0xA155, /* 0x60 */
+ 0xA156, 0xA157, 0xA158, 0xA159, 0xA15A, 0xA15B, 0xA15C, 0xA15D, /* 0x60 */
+ 0xA161, 0xA162, 0xA163, 0xA164, 0xA165, 0xA166, 0xA167, 0xA168, /* 0x70 */
+ 0xA169, 0xA16A, 0xA16B, 0xA16C, 0xA16D, 0xA16E, 0xA16F, 0xA170, /* 0x70 */
+ 0xA171, 0xA173, 0xA174, 0xA175, 0xA176, 0xA177, 0xA178, 0xA179, /* 0x80 */
+ 0xA17A, 0xA17B, 0xA17C, 0xA17D, 0xA181, 0xA182, 0xA183, 0xA184, /* 0x80 */
+ 0xA185, 0xA186, 0xA187, 0xA188, 0xA189, 0xA18A, 0xA18B, 0xA18C, /* 0x90 */
+ 0xA18D, 0xA18E, 0xA18F, 0xA190, 0xA191, 0xA193, 0xA194, 0xA195, /* 0x90 */
+ 0xA196, 0xA197, 0xA198, 0xA199, 0xA19A, 0xA19B, 0xA19C, 0xA19D, /* 0xA0 */
+ 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A4, 0xA1A5, 0xA1A6, 0xA1A7, 0xA1A8, /* 0xA0 */
+ 0xA1A9, 0xA1AA, 0xA1AB, 0xA1AC, 0xA1AD, 0xA1AE, 0xA1AF, 0xA1B0, /* 0xB0 */
+ 0xA1B1, 0xA1B3, 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7, 0xA1B8, 0xA1B9, /* 0xB0 */
+ 0xA1BA, 0xA1BB, 0xA1BC, 0xA1BD, 0xA1C1, 0xA1C2, 0xA1C3, 0xA1C4, /* 0xC0 */
+ 0xA1C5, 0xA1C6, 0xA1C7, 0xA1C8, 0xA1C9, 0xA1CA, 0xA1CB, 0xA1CC, /* 0xC0 */
+ 0xA1CD, 0xA1CE, 0xA1CF, 0xA1D0, 0xA1D1, 0xA1D3, 0xA1D4, 0xA1D5, /* 0xD0 */
+ 0xA1D6, 0xA1D7, 0xA1D8, 0xA1D9, 0xA1DA, 0xA1DB, 0xA1DC, 0xA1DD, /* 0xD0 */
+ 0xA1E1, 0xA1E2, 0xA1E3, 0xA1E4, 0xA1E5, 0xA1E6, 0xA1E7, 0xA1E8, /* 0xE0 */
+ 0xA1E9, 0xA1EA, 0xA1EB, 0xA1EC, 0xA1ED, 0xA1EE, 0xA1EF, 0xA1F0, /* 0xE0 */
+ 0xA1F1, 0xA1F3, 0xA1F4, 0xA1F5, 0xA1F6, 0xA1F7, 0xA1F8, 0xA1F9, /* 0xF0 */
+ 0xA1FA, 0xA1FB, 0xA1FC, 0xA1FD, 0xA241, 0xA242, 0xA243, 0xA244 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_BB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA245, 0xA246, 0xA247, 0xA248, 0xA249, 0xA24A, 0xA24B, 0xA24C, /* 0x00 */
+ 0xA24D, 0xA24E, 0xA24F, 0xA250, 0xA251, 0xA253, 0xA254, 0xA255, /* 0x00 */
+ 0xA256, 0xA257, 0xA258, 0xA259, 0xA25A, 0xA25B, 0xA25C, 0xA25D, /* 0x10 */
+ 0xA261, 0xA262, 0xA263, 0xA264, 0xA265, 0xA266, 0xA267, 0xA268, /* 0x10 */
+ 0xA269, 0xA26A, 0xA26B, 0xA26C, 0xA26D, 0xA26E, 0xA26F, 0xA270, /* 0x20 */
+ 0xA271, 0xA273, 0xA274, 0xA275, 0xA276, 0xA277, 0xA278, 0xA279, /* 0x20 */
+ 0xA27A, 0xA27B, 0xA27C, 0xA27D, 0xA281, 0xA282, 0xA283, 0xA284, /* 0x30 */
+ 0xA285, 0xA286, 0xA287, 0xA288, 0xA289, 0xA28A, 0xA28B, 0xA28C, /* 0x30 */
+ 0xA28D, 0xA28E, 0xA28F, 0xA290, 0xA291, 0xA293, 0xA294, 0xA295, /* 0x40 */
+ 0xA296, 0xA297, 0xA298, 0xA299, 0xA29A, 0xA29B, 0xA29C, 0xA29D, /* 0x40 */
+ 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7, 0xA2A8, /* 0x50 */
+ 0xA2A9, 0xA2AA, 0xA2AB, 0xA2AC, 0xA2AD, 0xA2AE, 0xA2AF, 0xA2B0, /* 0x50 */
+ 0xA2B1, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7, 0xA2B8, 0xA2B9, /* 0x60 */
+ 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2C1, 0xA2C2, 0xA2C3, 0xA2C4, /* 0x60 */
+ 0xA2C5, 0xA2C6, 0xA2C7, 0xA2C8, 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, /* 0x70 */
+ 0xA2CD, 0xA2CE, 0xA2CF, 0xA2D0, 0xA2D1, 0xA2D3, 0xA2D4, 0xA2D5, /* 0x70 */
+ 0xA2D6, 0xA2D7, 0xA2D8, 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, /* 0x80 */
+ 0xA2E1, 0xA2E2, 0xA2E3, 0xA2E4, 0xA2E5, 0xA2E6, 0xA2E7, 0xA2E8, /* 0x80 */
+ 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC, 0xA2ED, 0xA2EE, 0xA2EF, 0xA2F0, /* 0x90 */
+ 0xA2F1, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7, 0xA2F8, 0xA2F9, /* 0x90 */
+ 0xA2FA, 0xA2FB, 0xA2FC, 0xA2FD, 0xA341, 0xA342, 0xA343, 0xA344, /* 0xA0 */
+ 0xA345, 0xA346, 0xA347, 0xA348, 0xA349, 0xA34A, 0xA34B, 0xA34C, /* 0xA0 */
+ 0xA34D, 0xA34E, 0xA34F, 0xA350, 0xA351, 0xA353, 0xA354, 0xA355, /* 0xB0 */
+ 0xA356, 0xA357, 0xA358, 0xA359, 0xA35A, 0xA35B, 0xA35C, 0xA35D, /* 0xB0 */
+ 0xA361, 0xA362, 0xA363, 0xA364, 0xA365, 0xA366, 0xA367, 0xA368, /* 0xC0 */
+ 0xA369, 0xA36A, 0xA36B, 0xA36C, 0xA36D, 0xA36E, 0xA36F, 0xA370, /* 0xC0 */
+ 0xA371, 0xA373, 0xA374, 0xA375, 0xA376, 0xA377, 0xA378, 0xA379, /* 0xD0 */
+ 0xA37A, 0xA37B, 0xA37C, 0xA37D, 0xA381, 0xA382, 0xA383, 0xA384, /* 0xD0 */
+ 0xA385, 0xA386, 0xA387, 0xA388, 0xA389, 0xA38A, 0xA38B, 0xA38C, /* 0xE0 */
+ 0xA38D, 0xA38E, 0xA38F, 0xA390, 0xA391, 0xA393, 0xA394, 0xA395, /* 0xE0 */
+ 0xA396, 0xA397, 0xA398, 0xA399, 0xA39A, 0xA39B, 0xA39C, 0xA39D, /* 0xF0 */
+ 0xA3A1, 0xA3A2, 0xA3A3, 0xA3A4, 0xA3A5, 0xA3A6, 0xA3A7, 0xA3A8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_BC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF, 0xA3B0, /* 0x00 */
+ 0xA3B1, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7, 0xA3B8, 0xA3B9, /* 0x00 */
+ 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA461, 0xA462, 0xA463, 0xA464, /* 0x10 */
+ 0xA465, 0xA466, 0xA467, 0xA468, 0xA469, 0xA46A, 0xA46B, 0xA46C, /* 0x10 */
+ 0xA46D, 0xA46E, 0xA46F, 0xA470, 0xA471, 0xA473, 0xA474, 0xA475, /* 0x20 */
+ 0xA476, 0xA477, 0xA478, 0xA479, 0xA47A, 0xA47B, 0xA47C, 0xA47D, /* 0x20 */
+ 0xA481, 0xA482, 0xA483, 0xA484, 0xA485, 0xA486, 0xA487, 0xA488, /* 0x30 */
+ 0xA489, 0xA48A, 0xA48B, 0xA48C, 0xA48D, 0xA48E, 0xA48F, 0xA490, /* 0x30 */
+ 0xA491, 0xA493, 0xA494, 0xA495, 0xA496, 0xA497, 0xA498, 0xA499, /* 0x40 */
+ 0xA49A, 0xA49B, 0xA49C, 0xA49D, 0xA4A1, 0xA4A2, 0xA4A3, 0xA4A4, /* 0x40 */
+ 0xA4A5, 0xA4A6, 0xA4A7, 0xA4A8, 0xA4A9, 0xA4AA, 0xA4AB, 0xA4AC, /* 0x50 */
+ 0xA4AD, 0xA4AE, 0xA4AF, 0xA4B0, 0xA4B1, 0xA4B3, 0xA4B4, 0xA4B5, /* 0x50 */
+ 0xA4B6, 0xA4B7, 0xA4B8, 0xA4B9, 0xA4BA, 0xA4BB, 0xA4BC, 0xA4BD, /* 0x60 */
+ 0xA4C1, 0xA4C2, 0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6, 0xA4C7, 0xA4C8, /* 0x60 */
+ 0xA4C9, 0xA4CA, 0xA4CB, 0xA4CC, 0xA4CD, 0xA4CE, 0xA4CF, 0xA4D0, /* 0x70 */
+ 0xA4D1, 0xA4D3, 0xA4D4, 0xA4D5, 0xA4D6, 0xA4D7, 0xA4D8, 0xA4D9, /* 0x70 */
+ 0xA4DA, 0xA4DB, 0xA4DC, 0xA4DD, 0xA4E1, 0xA4E2, 0xA4E3, 0xA4E4, /* 0x80 */
+ 0xA4E5, 0xA4E6, 0xA4E7, 0xA4E8, 0xA4E9, 0xA4EA, 0xA4EB, 0xA4EC, /* 0x80 */
+ 0xA4ED, 0xA4EE, 0xA4EF, 0xA4F0, 0xA4F1, 0xA4F3, 0xA4F4, 0xA4F5, /* 0x90 */
+ 0xA4F6, 0xA4F7, 0xA4F8, 0xA4F9, 0xA4FA, 0xA4FB, 0xA4FC, 0xA4FD, /* 0x90 */
+ 0xA541, 0xA542, 0xA543, 0xA544, 0xA545, 0xA546, 0xA547, 0xA548, /* 0xA0 */
+ 0xA549, 0xA54A, 0xA54B, 0xA54C, 0xA54D, 0xA54E, 0xA54F, 0xA550, /* 0xA0 */
+ 0xA551, 0xA553, 0xA554, 0xA555, 0xA556, 0xA557, 0xA558, 0xA559, /* 0xB0 */
+ 0xA55A, 0xA55B, 0xA55C, 0xA55D, 0xA561, 0xA562, 0xA563, 0xA564, /* 0xB0 */
+ 0xA565, 0xA566, 0xA567, 0xA568, 0xA569, 0xA56A, 0xA56B, 0xA56C, /* 0xC0 */
+ 0xA56D, 0xA56E, 0xA56F, 0xA570, 0xA571, 0xA573, 0xA574, 0xA575, /* 0xC0 */
+ 0xA576, 0xA577, 0xA578, 0xA579, 0xA57A, 0xA57B, 0xA57C, 0xA57D, /* 0xD0 */
+ 0xA581, 0xA582, 0xA583, 0xA584, 0xA585, 0xA586, 0xA587, 0xA588, /* 0xD0 */
+ 0xA589, 0xA58A, 0xA58B, 0xA58C, 0xA58D, 0xA58E, 0xA58F, 0xA590, /* 0xE0 */
+ 0xA591, 0xA593, 0xA594, 0xA595, 0xA596, 0xA597, 0xA598, 0xA599, /* 0xE0 */
+ 0xA59A, 0xA59B, 0xA59C, 0xA59D, 0xA5A1, 0xA5A2, 0xA5A3, 0xA5A4, /* 0xF0 */
+ 0xA5A5, 0xA5A6, 0xA5A7, 0xA5A8, 0xA5A9, 0xA5AA, 0xA5AB, 0xA5AC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_BD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA5AD, 0xA5AE, 0xA5AF, 0xA5B0, 0xA5B1, 0xA5B3, 0xA5B4, 0xA5B5, /* 0x00 */
+ 0xA5B6, 0xA5B7, 0xA5B8, 0xA5B9, 0xA5BA, 0xA5BB, 0xA5BC, 0xA5BD, /* 0x00 */
+ 0xA5C1, 0xA5C2, 0xA5C3, 0xA5C4, 0xA5C5, 0xA5C6, 0xA5C7, 0xA5C8, /* 0x10 */
+ 0xA5C9, 0xA5CA, 0xA5CB, 0xA5CC, 0xA5CD, 0xA5CE, 0xA5CF, 0xA5D0, /* 0x10 */
+ 0xA5D1, 0xA5D3, 0xA5D4, 0xA5D5, 0xA5D6, 0xA5D7, 0xA5D8, 0xA5D9, /* 0x20 */
+ 0xA5DA, 0xA5DB, 0xA5DC, 0xA5DD, 0xA5E1, 0xA5E2, 0xA5E3, 0xA5E4, /* 0x20 */
+ 0xA5E5, 0xA5E6, 0xA5E7, 0xA5E8, 0xA5E9, 0xA5EA, 0xA5EB, 0xA5EC, /* 0x30 */
+ 0xA5ED, 0xA5EE, 0xA5EF, 0xA5F0, 0xA5F1, 0xA5F3, 0xA5F4, 0xA5F5, /* 0x30 */
+ 0xA5F6, 0xA5F7, 0xA5F8, 0xA5F9, 0xA5FA, 0xA5FB, 0xA5FC, 0xA5FD, /* 0x40 */
+ 0xA641, 0xA642, 0xA643, 0xA644, 0xA645, 0xA646, 0xA647, 0xA648, /* 0x40 */
+ 0xA649, 0xA64A, 0xA64B, 0xA64C, 0xA64D, 0xA64E, 0xA64F, 0xA650, /* 0x50 */
+ 0xA651, 0xA653, 0xA654, 0xA655, 0xA656, 0xA657, 0xA658, 0xA659, /* 0x50 */
+ 0xA65A, 0xA65B, 0xA65C, 0xA65D, 0xA661, 0xA662, 0xA663, 0xA664, /* 0x60 */
+ 0xA665, 0xA666, 0xA667, 0xA668, 0xA669, 0xA66A, 0xA66B, 0xA66C, /* 0x60 */
+ 0xA66D, 0xA66E, 0xA66F, 0xA670, 0xA671, 0xA673, 0xA674, 0xA675, /* 0x70 */
+ 0xA676, 0xA677, 0xA678, 0xA679, 0xA67A, 0xA67B, 0xA67C, 0xA67D, /* 0x70 */
+ 0xA681, 0xA682, 0xA683, 0xA684, 0xA685, 0xA686, 0xA687, 0xA688, /* 0x80 */
+ 0xA689, 0xA68A, 0xA68B, 0xA68C, 0xA68D, 0xA68E, 0xA68F, 0xA690, /* 0x80 */
+ 0xA691, 0xA693, 0xA694, 0xA695, 0xA696, 0xA697, 0xA698, 0xA699, /* 0x90 */
+ 0xA69A, 0xA69B, 0xA69C, 0xA69D, 0xA6A1, 0xA6A2, 0xA6A3, 0xA6A4, /* 0x90 */
+ 0xA6A5, 0xA6A6, 0xA6A7, 0xA6A8, 0xA6A9, 0xA6AA, 0xA6AB, 0xA6AC, /* 0xA0 */
+ 0xA6AD, 0xA6AE, 0xA6AF, 0xA6B0, 0xA6B1, 0xA6B3, 0xA6B4, 0xA6B5, /* 0xA0 */
+ 0xA6B6, 0xA6B7, 0xA6B8, 0xA6B9, 0xA6BA, 0xA6BB, 0xA6BC, 0xA6BD, /* 0xB0 */
+ 0xA6C1, 0xA6C2, 0xA6C3, 0xA6C4, 0xA6C5, 0xA6C6, 0xA6C7, 0xA6C8, /* 0xB0 */
+ 0xA6C9, 0xA6CA, 0xA6CB, 0xA6CC, 0xA6CD, 0xA6CE, 0xA6CF, 0xA6D0, /* 0xC0 */
+ 0xA6D1, 0xA6D3, 0xA6D4, 0xA6D5, 0xA6D6, 0xA6D7, 0xA6D8, 0xA6D9, /* 0xC0 */
+ 0xA6DA, 0xA6DB, 0xA6DC, 0xA6DD, 0xA6E1, 0xA6E2, 0xA6E3, 0xA6E4, /* 0xD0 */
+ 0xA6E5, 0xA6E6, 0xA6E7, 0xA6E8, 0xA6E9, 0xA6EA, 0xA6EB, 0xA6EC, /* 0xD0 */
+ 0xA6ED, 0xA6EE, 0xA6EF, 0xA6F0, 0xA6F1, 0xA6F3, 0xA6F4, 0xA6F5, /* 0xE0 */
+ 0xA6F6, 0xA6F7, 0xA6F8, 0xA6F9, 0xA6FA, 0xA6FB, 0xA6FC, 0xA6FD, /* 0xE0 */
+ 0xA741, 0xA742, 0xA743, 0xA744, 0xA745, 0xA746, 0xA747, 0xA748, /* 0xF0 */
+ 0xA749, 0xA74A, 0xA74B, 0xA74C, 0xA74D, 0xA74E, 0xA74F, 0xA750 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_BE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA751, 0xA753, 0xA754, 0xA755, 0xA756, 0xA757, 0xA758, 0xA759, /* 0x00 */
+ 0xA75A, 0xA75B, 0xA75C, 0xA75D, 0xA761, 0xA762, 0xA763, 0xA764, /* 0x00 */
+ 0xA765, 0xA766, 0xA767, 0xA768, 0xA769, 0xA76A, 0xA76B, 0xA76C, /* 0x10 */
+ 0xA76D, 0xA76E, 0xA76F, 0xA770, 0xA771, 0xA773, 0xA774, 0xA775, /* 0x10 */
+ 0xA776, 0xA777, 0xA778, 0xA779, 0xA77A, 0xA77B, 0xA77C, 0xA77D, /* 0x20 */
+ 0xA781, 0xA782, 0xA783, 0xA784, 0xA785, 0xA786, 0xA787, 0xA788, /* 0x20 */
+ 0xA789, 0xA78A, 0xA78B, 0xA78C, 0xA78D, 0xA78E, 0xA78F, 0xA790, /* 0x30 */
+ 0xA791, 0xA793, 0xA794, 0xA795, 0xA796, 0xA797, 0xA798, 0xA799, /* 0x30 */
+ 0xA79A, 0xA79B, 0xA79C, 0xA79D, 0xA7A1, 0xA7A2, 0xA7A3, 0xA7A4, /* 0x40 */
+ 0xA7A5, 0xA7A6, 0xA7A7, 0xA7A8, 0xA7A9, 0xA7AA, 0xA7AB, 0xA7AC, /* 0x40 */
+ 0xA7AD, 0xA7AE, 0xA7AF, 0xA7B0, 0xA7B1, 0xA7B3, 0xA7B4, 0xA7B5, /* 0x50 */
+ 0xA7B6, 0xA7B7, 0xA7B8, 0xA7B9, 0xA7BA, 0xA7BB, 0xA7BC, 0xA7BD, /* 0x50 */
+ 0xA861, 0xA862, 0xA863, 0xA864, 0xA865, 0xA866, 0xA867, 0xA868, /* 0x60 */
+ 0xA869, 0xA86A, 0xA86B, 0xA86C, 0xA86D, 0xA86E, 0xA86F, 0xA870, /* 0x60 */
+ 0xA871, 0xA873, 0xA874, 0xA875, 0xA876, 0xA877, 0xA878, 0xA879, /* 0x70 */
+ 0xA87A, 0xA87B, 0xA87C, 0xA87D, 0xA881, 0xA882, 0xA883, 0xA884, /* 0x70 */
+ 0xA885, 0xA886, 0xA887, 0xA888, 0xA889, 0xA88A, 0xA88B, 0xA88C, /* 0x80 */
+ 0xA88D, 0xA88E, 0xA88F, 0xA890, 0xA891, 0xA893, 0xA894, 0xA895, /* 0x80 */
+ 0xA896, 0xA897, 0xA898, 0xA899, 0xA89A, 0xA89B, 0xA89C, 0xA89D, /* 0x90 */
+ 0xA8A1, 0xA8A2, 0xA8A3, 0xA8A4, 0xA8A5, 0xA8A6, 0xA8A7, 0xA8A8, /* 0x90 */
+ 0xA8A9, 0xA8AA, 0xA8AB, 0xA8AC, 0xA8AD, 0xA8AE, 0xA8AF, 0xA8B0, /* 0xA0 */
+ 0xA8B1, 0xA8B3, 0xA8B4, 0xA8B5, 0xA8B6, 0xA8B7, 0xA8B8, 0xA8B9, /* 0xA0 */
+ 0xA8BA, 0xA8BB, 0xA8BC, 0xA8BD, 0xA8C1, 0xA8C2, 0xA8C3, 0xA8C4, /* 0xB0 */
+ 0xA8C5, 0xA8C6, 0xA8C7, 0xA8C8, 0xA8C9, 0xA8CA, 0xA8CB, 0xA8CC, /* 0xB0 */
+ 0xA8CD, 0xA8CE, 0xA8CF, 0xA8D0, 0xA8D1, 0xA8D3, 0xA8D4, 0xA8D5, /* 0xC0 */
+ 0xA8D6, 0xA8D7, 0xA8D8, 0xA8D9, 0xA8DA, 0xA8DB, 0xA8DC, 0xA8DD, /* 0xC0 */
+ 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, 0xA8E6, 0xA8E7, 0xA8E8, /* 0xD0 */
+ 0xA8E9, 0xA8EA, 0xA8EB, 0xA8EC, 0xA8ED, 0xA8EE, 0xA8EF, 0xA8F0, /* 0xD0 */
+ 0xA8F1, 0xA8F3, 0xA8F4, 0xA8F5, 0xA8F6, 0xA8F7, 0xA8F8, 0xA8F9, /* 0xE0 */
+ 0xA8FA, 0xA8FB, 0xA8FC, 0xA8FD, 0xA941, 0xA942, 0xA943, 0xA944, /* 0xE0 */
+ 0xA945, 0xA946, 0xA947, 0xA948, 0xA949, 0xA94A, 0xA94B, 0xA94C, /* 0xF0 */
+ 0xA94D, 0xA94E, 0xA94F, 0xA950, 0xA951, 0xA953, 0xA954, 0xA955 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_BF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA956, 0xA957, 0xA958, 0xA959, 0xA95A, 0xA95B, 0xA95C, 0xA95D, /* 0x00 */
+ 0xA961, 0xA962, 0xA963, 0xA964, 0xA965, 0xA966, 0xA967, 0xA968, /* 0x00 */
+ 0xA969, 0xA96A, 0xA96B, 0xA96C, 0xA96D, 0xA96E, 0xA96F, 0xA970, /* 0x10 */
+ 0xA971, 0xA973, 0xA974, 0xA975, 0xA976, 0xA977, 0xA978, 0xA979, /* 0x10 */
+ 0xA97A, 0xA97B, 0xA97C, 0xA97D, 0xA981, 0xA982, 0xA983, 0xA984, /* 0x20 */
+ 0xA985, 0xA986, 0xA987, 0xA988, 0xA989, 0xA98A, 0xA98B, 0xA98C, /* 0x20 */
+ 0xA98D, 0xA98E, 0xA98F, 0xA990, 0xA991, 0xA993, 0xA994, 0xA995, /* 0x30 */
+ 0xA996, 0xA997, 0xA998, 0xA999, 0xA99A, 0xA99B, 0xA99C, 0xA99D, /* 0x30 */
+ 0xA9A1, 0xA9A2, 0xA9A3, 0xA9A4, 0xA9A5, 0xA9A6, 0xA9A7, 0xA9A8, /* 0x40 */
+ 0xA9A9, 0xA9AA, 0xA9AB, 0xA9AC, 0xA9AD, 0xA9AE, 0xA9AF, 0xA9B0, /* 0x40 */
+ 0xA9B1, 0xA9B3, 0xA9B4, 0xA9B5, 0xA9B6, 0xA9B7, 0xA9B8, 0xA9B9, /* 0x50 */
+ 0xA9BA, 0xA9BB, 0xA9BC, 0xA9BD, 0xA9C1, 0xA9C2, 0xA9C3, 0xA9C4, /* 0x50 */
+ 0xA9C5, 0xA9C6, 0xA9C7, 0xA9C8, 0xA9C9, 0xA9CA, 0xA9CB, 0xA9CC, /* 0x60 */
+ 0xA9CD, 0xA9CE, 0xA9CF, 0xA9D0, 0xA9D1, 0xA9D3, 0xA9D4, 0xA9D5, /* 0x60 */
+ 0xA9D6, 0xA9D7, 0xA9D8, 0xA9D9, 0xA9DA, 0xA9DB, 0xA9DC, 0xA9DD, /* 0x70 */
+ 0xA9E1, 0xA9E2, 0xA9E3, 0xA9E4, 0xA9E5, 0xA9E6, 0xA9E7, 0xA9E8, /* 0x70 */
+ 0xA9E9, 0xA9EA, 0xA9EB, 0xA9EC, 0xA9ED, 0xA9EE, 0xA9EF, 0xA9F0, /* 0x80 */
+ 0xA9F1, 0xA9F3, 0xA9F4, 0xA9F5, 0xA9F6, 0xA9F7, 0xA9F8, 0xA9F9, /* 0x80 */
+ 0xA9FA, 0xA9FB, 0xA9FC, 0xA9FD, 0xAA41, 0xAA42, 0xAA43, 0xAA44, /* 0x90 */
+ 0xAA45, 0xAA46, 0xAA47, 0xAA48, 0xAA49, 0xAA4A, 0xAA4B, 0xAA4C, /* 0x90 */
+ 0xAA4D, 0xAA4E, 0xAA4F, 0xAA50, 0xAA51, 0xAA53, 0xAA54, 0xAA55, /* 0xA0 */
+ 0xAA56, 0xAA57, 0xAA58, 0xAA59, 0xAA5A, 0xAA5B, 0xAA5C, 0xAA5D, /* 0xA0 */
+ 0xAA61, 0xAA62, 0xAA63, 0xAA64, 0xAA65, 0xAA66, 0xAA67, 0xAA68, /* 0xB0 */
+ 0xAA69, 0xAA6A, 0xAA6B, 0xAA6C, 0xAA6D, 0xAA6E, 0xAA6F, 0xAA70, /* 0xB0 */
+ 0xAA71, 0xAA73, 0xAA74, 0xAA75, 0xAA76, 0xAA77, 0xAA78, 0xAA79, /* 0xC0 */
+ 0xAA7A, 0xAA7B, 0xAA7C, 0xAA7D, 0xAA81, 0xAA82, 0xAA83, 0xAA84, /* 0xC0 */
+ 0xAA85, 0xAA86, 0xAA87, 0xAA88, 0xAA89, 0xAA8A, 0xAA8B, 0xAA8C, /* 0xD0 */
+ 0xAA8D, 0xAA8E, 0xAA8F, 0xAA90, 0xAA91, 0xAA93, 0xAA94, 0xAA95, /* 0xD0 */
+ 0xAA96, 0xAA97, 0xAA98, 0xAA99, 0xAA9A, 0xAA9B, 0xAA9C, 0xAA9D, /* 0xE0 */
+ 0xAAA1, 0xAAA2, 0xAAA3, 0xAAA4, 0xAAA5, 0xAAA6, 0xAAA7, 0xAAA8, /* 0xE0 */
+ 0xAAA9, 0xAAAA, 0xAAAB, 0xAAAC, 0xAAAD, 0xAAAE, 0xAAAF, 0xAAB0, /* 0xF0 */
+ 0xAAB1, 0xAAB3, 0xAAB4, 0xAAB5, 0xAAB6, 0xAAB7, 0xAAB8, 0xAAB9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAABA, 0xAABB, 0xAABC, 0xAABD, 0xAAC1, 0xAAC2, 0xAAC3, 0xAAC4, /* 0x00 */
+ 0xAAC5, 0xAAC6, 0xAAC7, 0xAAC8, 0xAAC9, 0xAACA, 0xAACB, 0xAACC, /* 0x00 */
+ 0xAACD, 0xAACE, 0xAACF, 0xAAD0, 0xAAD1, 0xAAD3, 0xAAD4, 0xAAD5, /* 0x10 */
+ 0xAAD6, 0xAAD7, 0xAAD8, 0xAAD9, 0xAADA, 0xAADB, 0xAADC, 0xAADD, /* 0x10 */
+ 0xAAE1, 0xAAE2, 0xAAE3, 0xAAE4, 0xAAE5, 0xAAE6, 0xAAE7, 0xAAE8, /* 0x20 */
+ 0xAAE9, 0xAAEA, 0xAAEB, 0xAAEC, 0xAAED, 0xAAEE, 0xAAEF, 0xAAF0, /* 0x20 */
+ 0xAAF1, 0xAAF3, 0xAAF4, 0xAAF5, 0xAAF6, 0xAAF7, 0xAAF8, 0xAAF9, /* 0x30 */
+ 0xAAFA, 0xAAFB, 0xAAFC, 0xAAFD, 0xAB41, 0xAB42, 0xAB43, 0xAB44, /* 0x30 */
+ 0xAB45, 0xAB46, 0xAB47, 0xAB48, 0xAB49, 0xAB4A, 0xAB4B, 0xAB4C, /* 0x40 */
+ 0xAB4D, 0xAB4E, 0xAB4F, 0xAB50, 0xAB51, 0xAB53, 0xAB54, 0xAB55, /* 0x40 */
+ 0xAB56, 0xAB57, 0xAB58, 0xAB59, 0xAB5A, 0xAB5B, 0xAB5C, 0xAB5D, /* 0x50 */
+ 0xAB61, 0xAB62, 0xAB63, 0xAB64, 0xAB65, 0xAB66, 0xAB67, 0xAB68, /* 0x50 */
+ 0xAB69, 0xAB6A, 0xAB6B, 0xAB6C, 0xAB6D, 0xAB6E, 0xAB6F, 0xAB70, /* 0x60 */
+ 0xAB71, 0xAB73, 0xAB74, 0xAB75, 0xAB76, 0xAB77, 0xAB78, 0xAB79, /* 0x60 */
+ 0xAB7A, 0xAB7B, 0xAB7C, 0xAB7D, 0xAB81, 0xAB82, 0xAB83, 0xAB84, /* 0x70 */
+ 0xAB85, 0xAB86, 0xAB87, 0xAB88, 0xAB89, 0xAB8A, 0xAB8B, 0xAB8C, /* 0x70 */
+ 0xAB8D, 0xAB8E, 0xAB8F, 0xAB90, 0xAB91, 0xAB93, 0xAB94, 0xAB95, /* 0x80 */
+ 0xAB96, 0xAB97, 0xAB98, 0xAB99, 0xAB9A, 0xAB9B, 0xAB9C, 0xAB9D, /* 0x80 */
+ 0xABA1, 0xABA2, 0xABA3, 0xABA4, 0xABA5, 0xABA6, 0xABA7, 0xABA8, /* 0x90 */
+ 0xABA9, 0xABAA, 0xABAB, 0xABAC, 0xABAD, 0xABAE, 0xABAF, 0xABB0, /* 0x90 */
+ 0xABB1, 0xABB3, 0xABB4, 0xABB5, 0xABB6, 0xABB7, 0xABB8, 0xABB9, /* 0xA0 */
+ 0xABBA, 0xABBB, 0xABBC, 0xABBD, 0xAC61, 0xAC62, 0xAC63, 0xAC64, /* 0xA0 */
+ 0xAC65, 0xAC66, 0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, 0xAC6C, /* 0xB0 */
+ 0xAC6D, 0xAC6E, 0xAC6F, 0xAC70, 0xAC71, 0xAC73, 0xAC74, 0xAC75, /* 0xB0 */
+ 0xAC76, 0xAC77, 0xAC78, 0xAC79, 0xAC7A, 0xAC7B, 0xAC7C, 0xAC7D, /* 0xC0 */
+ 0xAC81, 0xAC82, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC87, 0xAC88, /* 0xC0 */
+ 0xAC89, 0xAC8A, 0xAC8B, 0xAC8C, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC90, /* 0xD0 */
+ 0xAC91, 0xAC93, 0xAC94, 0xAC95, 0xAC96, 0xAC97, 0xAC98, 0xAC99, /* 0xD0 */
+ 0xAC9A, 0xAC9B, 0xAC9C, 0xAC9D, 0xACA1, 0xACA2, 0xACA3, 0xACA4, /* 0xE0 */
+ 0xACA5, 0xACA6, 0xACA7, 0xACA8, 0xACA9, 0xACAA, 0xACAB, 0xACAC, /* 0xE0 */
+ 0xACAD, 0xACAE, 0xACAF, 0xACB0, 0xACB1, 0xACB3, 0xACB4, 0xACB5, /* 0xF0 */
+ 0xACB6, 0xACB7, 0xACB8, 0xACB9, 0xACBA, 0xACBB, 0xACBC, 0xACBD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xACC1, 0xACC2, 0xACC3, 0xACC4, 0xACC5, 0xACC6, 0xACC7, 0xACC8, /* 0x00 */
+ 0xACC9, 0xACCA, 0xACCB, 0xACCC, 0xACCD, 0xACCE, 0xACCF, 0xACD0, /* 0x00 */
+ 0xACD1, 0xACD3, 0xACD4, 0xACD5, 0xACD6, 0xACD7, 0xACD8, 0xACD9, /* 0x10 */
+ 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACE1, 0xACE2, 0xACE3, 0xACE4, /* 0x10 */
+ 0xACE5, 0xACE6, 0xACE7, 0xACE8, 0xACE9, 0xACEA, 0xACEB, 0xACEC, /* 0x20 */
+ 0xACED, 0xACEE, 0xACEF, 0xACF0, 0xACF1, 0xACF3, 0xACF4, 0xACF5, /* 0x20 */
+ 0xACF6, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB, 0xACFC, 0xACFD, /* 0x30 */
+ 0xAD41, 0xAD42, 0xAD43, 0xAD44, 0xAD45, 0xAD46, 0xAD47, 0xAD48, /* 0x30 */
+ 0xAD49, 0xAD4A, 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD50, /* 0x40 */
+ 0xAD51, 0xAD53, 0xAD54, 0xAD55, 0xAD56, 0xAD57, 0xAD58, 0xAD59, /* 0x40 */
+ 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D, 0xAD61, 0xAD62, 0xAD63, 0xAD64, /* 0x50 */
+ 0xAD65, 0xAD66, 0xAD67, 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6C, /* 0x50 */
+ 0xAD6D, 0xAD6E, 0xAD6F, 0xAD70, 0xAD71, 0xAD73, 0xAD74, 0xAD75, /* 0x60 */
+ 0xAD76, 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7B, 0xAD7C, 0xAD7D, /* 0x60 */
+ 0xAD81, 0xAD82, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87, 0xAD88, /* 0x70 */
+ 0xAD89, 0xAD8A, 0xAD8B, 0xAD8C, 0xAD8D, 0xAD8E, 0xAD8F, 0xAD90, /* 0x70 */
+ 0xAD91, 0xAD93, 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98, 0xAD99, /* 0x80 */
+ 0xAD9A, 0xAD9B, 0xAD9C, 0xAD9D, 0xADA1, 0xADA2, 0xADA3, 0xADA4, /* 0x80 */
+ 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, 0xADAB, 0xADAC, /* 0x90 */
+ 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB3, 0xADB4, 0xADB5, /* 0x90 */
+ 0xADB6, 0xADB7, 0xADB8, 0xADB9, 0xADBA, 0xADBB, 0xADBC, 0xADBD, /* 0xA0 */
+ 0xADC1, 0xADC2, 0xADC3, 0xADC4, 0xADC5, 0xADC6, 0xADC7, 0xADC8, /* 0xA0 */
+ 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD0, /* 0xB0 */
+ 0xADD1, 0xADD3, 0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, /* 0xB0 */
+ 0xADDA, 0xADDB, 0xADDC, 0xADDD, 0xADE1, 0xADE2, 0xADE3, 0xADE4, /* 0xC0 */
+ 0xADE5, 0xADE6, 0xADE7, 0xADE8, 0xADE9, 0xADEA, 0xADEB, 0xADEC, /* 0xC0 */
+ 0xADED, 0xADEE, 0xADEF, 0xADF0, 0xADF1, 0xADF3, 0xADF4, 0xADF5, /* 0xD0 */
+ 0xADF6, 0xADF7, 0xADF8, 0xADF9, 0xADFA, 0xADFB, 0xADFC, 0xADFD, /* 0xD0 */
+ 0xAE41, 0xAE42, 0xAE43, 0xAE44, 0xAE45, 0xAE46, 0xAE47, 0xAE48, /* 0xE0 */
+ 0xAE49, 0xAE4A, 0xAE4B, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE4F, 0xAE50, /* 0xE0 */
+ 0xAE51, 0xAE53, 0xAE54, 0xAE55, 0xAE56, 0xAE57, 0xAE58, 0xAE59, /* 0xF0 */
+ 0xAE5A, 0xAE5B, 0xAE5C, 0xAE5D, 0xAE61, 0xAE62, 0xAE63, 0xAE64 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAE65, 0xAE66, 0xAE67, 0xAE68, 0xAE69, 0xAE6A, 0xAE6B, 0xAE6C, /* 0x00 */
+ 0xAE6D, 0xAE6E, 0xAE6F, 0xAE70, 0xAE71, 0xAE73, 0xAE74, 0xAE75, /* 0x00 */
+ 0xAE76, 0xAE77, 0xAE78, 0xAE79, 0xAE7A, 0xAE7B, 0xAE7C, 0xAE7D, /* 0x10 */
+ 0xAE81, 0xAE82, 0xAE83, 0xAE84, 0xAE85, 0xAE86, 0xAE87, 0xAE88, /* 0x10 */
+ 0xAE89, 0xAE8A, 0xAE8B, 0xAE8C, 0xAE8D, 0xAE8E, 0xAE8F, 0xAE90, /* 0x20 */
+ 0xAE91, 0xAE93, 0xAE94, 0xAE95, 0xAE96, 0xAE97, 0xAE98, 0xAE99, /* 0x20 */
+ 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, /* 0x30 */
+ 0xAEA5, 0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, /* 0x30 */
+ 0xAEAD, 0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, 0xAEB3, 0xAEB4, 0xAEB5, /* 0x40 */
+ 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0xAEBC, 0xAEBD, /* 0x40 */
+ 0xAEC1, 0xAEC2, 0xAEC3, 0xAEC4, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, /* 0x50 */
+ 0xAEC9, 0xAECA, 0xAECB, 0xAECC, 0xAECD, 0xAECE, 0xAECF, 0xAED0, /* 0x50 */
+ 0xAED1, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7, 0xAED8, 0xAED9, /* 0x60 */
+ 0xAEDA, 0xAEDB, 0xAEDC, 0xAEDD, 0xAEE1, 0xAEE2, 0xAEE3, 0xAEE4, /* 0x60 */
+ 0xAEE5, 0xAEE6, 0xAEE7, 0xAEE8, 0xAEE9, 0xAEEA, 0xAEEB, 0xAEEC, /* 0x70 */
+ 0xAEED, 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF3, 0xAEF4, 0xAEF5, /* 0x70 */
+ 0xAEF6, 0xAEF7, 0xAEF8, 0xAEF9, 0xAEFA, 0xAEFB, 0xAEFC, 0xAEFD, /* 0x80 */
+ 0xAF41, 0xAF42, 0xAF43, 0xAF44, 0xAF45, 0xAF46, 0xAF47, 0xAF48, /* 0x80 */
+ 0xAF49, 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF50, /* 0x90 */
+ 0xAF51, 0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, 0xAF59, /* 0x90 */
+ 0xAF5A, 0xAF5B, 0xAF5C, 0xAF5D, 0xAF61, 0xAF62, 0xAF63, 0xAF64, /* 0xA0 */
+ 0xAF65, 0xAF66, 0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, /* 0xA0 */
+ 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70, 0xAF71, 0xAF73, 0xAF74, 0xAF75, /* 0xB0 */
+ 0xAF76, 0xAF77, 0xAF78, 0xAF79, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, /* 0xB0 */
+ 0xAF81, 0xAF82, 0xAF83, 0xAF84, 0xAF85, 0xAF86, 0xAF87, 0xAF88, /* 0xC0 */
+ 0xAF89, 0xAF8A, 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF90, /* 0xC0 */
+ 0xAF91, 0xAF93, 0xAF94, 0xAF95, 0xAF96, 0xAF97, 0xAF98, 0xAF99, /* 0xD0 */
+ 0xAF9A, 0xAF9B, 0xAF9C, 0xAF9D, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, /* 0xD0 */
+ 0xAFA5, 0xAFA6, 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, /* 0xE0 */
+ 0xAFAD, 0xAFAE, 0xAFAF, 0xAFB0, 0xAFB1, 0xAFB3, 0xAFB4, 0xAFB5, /* 0xE0 */
+ 0xAFB6, 0xAFB7, 0xAFB8, 0xAFB9, 0xAFBA, 0xAFBB, 0xAFBC, 0xAFBD, /* 0xF0 */
+ 0xB061, 0xB062, 0xB063, 0xB064, 0xB065, 0xB066, 0xB067, 0xB068 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D, 0xB06E, 0xB06F, 0xB070, /* 0x00 */
+ 0xB071, 0xB073, 0xB074, 0xB075, 0xB076, 0xB077, 0xB078, 0xB079, /* 0x00 */
+ 0xB07A, 0xB07B, 0xB07C, 0xB07D, 0xB081, 0xB082, 0xB083, 0xB084, /* 0x10 */
+ 0xB085, 0xB086, 0xB087, 0xB088, 0xB089, 0xB08A, 0xB08B, 0xB08C, /* 0x10 */
+ 0xB08D, 0xB08E, 0xB08F, 0xB090, 0xB091, 0xB093, 0xB094, 0xB095, /* 0x20 */
+ 0xB096, 0xB097, 0xB098, 0xB099, 0xB09A, 0xB09B, 0xB09C, 0xB09D, /* 0x20 */
+ 0xB0A1, 0xB0A2, 0xB0A3, 0xB0A4, 0xB0A5, 0xB0A6, 0xB0A7, 0xB0A8, /* 0x30 */
+ 0xB0A9, 0xB0AA, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF, 0xB0B0, /* 0x30 */
+ 0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B6, 0xB0B7, 0xB0B8, 0xB0B9, /* 0x40 */
+ 0xB0BA, 0xB0BB, 0xB0BC, 0xB0BD, 0xB0C1, 0xB0C2, 0xB0C3, 0xB0C4, /* 0x40 */
+ 0xB0C5, 0xB0C6, 0xB0C7, 0xB0C8, 0xB0C9, 0xB0CA, 0xB0CB, 0xB0CC, /* 0x50 */
+ 0xB0CD, 0xB0CE, 0xB0CF, 0xB0D0, 0xB0D1, 0xB0D3, 0xB0D4, 0xB0D5, /* 0x50 */
+ 0xB0D6, 0xB0D7, 0xB0D8, 0xB0D9, 0xB0DA, 0xB0DB, 0xB0DC, 0xB0DD, /* 0x60 */
+ 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4, 0xB0E5, 0xB0E6, 0xB0E7, 0xB0E8, /* 0x60 */
+ 0xB0E9, 0xB0EA, 0xB0EB, 0xB0EC, 0xB0ED, 0xB0EE, 0xB0EF, 0xB0F0, /* 0x70 */
+ 0xB0F1, 0xB0F3, 0xB0F4, 0xB0F5, 0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, /* 0x70 */
+ 0xB0FA, 0xB0FB, 0xB0FC, 0xB0FD, 0xB141, 0xB142, 0xB143, 0xB144, /* 0x80 */
+ 0xB145, 0xB146, 0xB147, 0xB148, 0xB149, 0xB14A, 0xB14B, 0xB14C, /* 0x80 */
+ 0xB14D, 0xB14E, 0xB14F, 0xB150, 0xB151, 0xB153, 0xB154, 0xB155, /* 0x90 */
+ 0xB156, 0xB157, 0xB158, 0xB159, 0xB15A, 0xB15B, 0xB15C, 0xB15D, /* 0x90 */
+ 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, 0xB166, 0xB167, 0xB168, /* 0xA0 */
+ 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E, 0xB16F, 0xB170, /* 0xA0 */
+ 0xB171, 0xB173, 0xB174, 0xB175, 0xB176, 0xB177, 0xB178, 0xB179, /* 0xB0 */
+ 0xB17A, 0xB17B, 0xB17C, 0xB17D, 0xB181, 0xB182, 0xB183, 0xB184, /* 0xB0 */
+ 0xB185, 0xB186, 0xB187, 0xB188, 0xB189, 0xB18A, 0xB18B, 0xB18C, /* 0xC0 */
+ 0xB18D, 0xB18E, 0xB18F, 0xB190, 0xB191, 0xB193, 0xB194, 0xB195, /* 0xC0 */
+ 0xB196, 0xB197, 0xB198, 0xB199, 0xB19A, 0xB19B, 0xB19C, 0xB19D, /* 0xD0 */
+ 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4, 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A8, /* 0xD0 */
+ 0xB1A9, 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD, 0xB1AE, 0xB1AF, 0xB1B0, /* 0xE0 */
+ 0xB1B1, 0xB1B3, 0xB1B4, 0xB1B5, 0xB1B6, 0xB1B7, 0xB1B8, 0xB1B9, /* 0xE0 */
+ 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, /* 0xF0 */
+ 0xB1C5, 0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB1CD, 0xB1CE, 0xB1CF, 0xB1D0, 0xB1D1, 0xB1D3, 0xB1D4, 0xB1D5, /* 0x00 */
+ 0xB1D6, 0xB1D7, 0xB1D8, 0xB1D9, 0xB1DA, 0xB1DB, 0xB1DC, 0xB1DD, /* 0x00 */
+ 0xB1E1, 0xB1E2, 0xB1E3, 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0xB1E8, /* 0x10 */
+ 0xB1E9, 0xB1EA, 0xB1EB, 0xB1EC, 0xB1ED, 0xB1EE, 0xB1EF, 0xB1F0, /* 0x10 */
+ 0xB1F1, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7, 0xB1F8, 0xB1F9, /* 0x20 */
+ 0xB1FA, 0xB1FB, 0xB1FC, 0xB1FD, 0xB241, 0xB242, 0xB243, 0xB244, /* 0x20 */
+ 0xB245, 0xB246, 0xB247, 0xB248, 0xB249, 0xB24A, 0xB24B, 0xB24C, /* 0x30 */
+ 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251, 0xB253, 0xB254, 0xB255, /* 0x30 */
+ 0xB256, 0xB257, 0xB258, 0xB259, 0xB25A, 0xB25B, 0xB25C, 0xB25D, /* 0x40 */
+ 0xB261, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB268, /* 0x40 */
+ 0xB269, 0xB26A, 0xB26B, 0xB26C, 0xB26D, 0xB26E, 0xB26F, 0xB270, /* 0x50 */
+ 0xB271, 0xB273, 0xB274, 0xB275, 0xB276, 0xB277, 0xB278, 0xB279, /* 0x50 */
+ 0xB27A, 0xB27B, 0xB27C, 0xB27D, 0xB281, 0xB282, 0xB283, 0xB284, /* 0x60 */
+ 0xB285, 0xB286, 0xB287, 0xB288, 0xB289, 0xB28A, 0xB28B, 0xB28C, /* 0x60 */
+ 0xB28D, 0xB28E, 0xB28F, 0xB290, 0xB291, 0xB293, 0xB294, 0xB295, /* 0x70 */
+ 0xB296, 0xB297, 0xB298, 0xB299, 0xB29A, 0xB29B, 0xB29C, 0xB29D, /* 0x70 */
+ 0xB2A1, 0xB2A2, 0xB2A3, 0xB2A4, 0xB2A5, 0xB2A6, 0xB2A7, 0xB2A8, /* 0x80 */
+ 0xB2A9, 0xB2AA, 0xB2AB, 0xB2AC, 0xB2AD, 0xB2AE, 0xB2AF, 0xB2B0, /* 0x80 */
+ 0xB2B1, 0xB2B3, 0xB2B4, 0xB2B5, 0xB2B6, 0xB2B7, 0xB2B8, 0xB2B9, /* 0x90 */
+ 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, /* 0x90 */
+ 0xB2C5, 0xB2C6, 0xB2C7, 0xB2C8, 0xB2C9, 0xB2CA, 0xB2CB, 0xB2CC, /* 0xA0 */
+ 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D0, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5, /* 0xA0 */
+ 0xB2D6, 0xB2D7, 0xB2D8, 0xB2D9, 0xB2DA, 0xB2DB, 0xB2DC, 0xB2DD, /* 0xB0 */
+ 0xB2E1, 0xB2E2, 0xB2E3, 0xB2E4, 0xB2E5, 0xB2E6, 0xB2E7, 0xB2E8, /* 0xB0 */
+ 0xB2E9, 0xB2EA, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F0, /* 0xC0 */
+ 0xB2F1, 0xB2F3, 0xB2F4, 0xB2F5, 0xB2F6, 0xB2F7, 0xB2F8, 0xB2F9, /* 0xC0 */
+ 0xB2FA, 0xB2FB, 0xB2FC, 0xB2FD, 0xB341, 0xB342, 0xB343, 0xB344, /* 0xD0 */
+ 0xB345, 0xB346, 0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, /* 0xD0 */
+ 0xB34D, 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB353, 0xB354, 0xB355, /* 0xE0 */
+ 0xB356, 0xB357, 0xB358, 0xB359, 0xB35A, 0xB35B, 0xB35C, 0xB35D, /* 0xE0 */
+ 0xB361, 0xB362, 0xB363, 0xB364, 0xB365, 0xB366, 0xB367, 0xB368, /* 0xF0 */
+ 0xB369, 0xB36A, 0xB36B, 0xB36C, 0xB36D, 0xB36E, 0xB36F, 0xB370 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB371, 0xB373, 0xB374, 0xB375, 0xB376, 0xB377, 0xB378, 0xB379, /* 0x00 */
+ 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB381, 0xB382, 0xB383, 0xB384, /* 0x00 */
+ 0xB385, 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38C, /* 0x10 */
+ 0xB38D, 0xB38E, 0xB38F, 0xB390, 0xB391, 0xB393, 0xB394, 0xB395, /* 0x10 */
+ 0xB396, 0xB397, 0xB398, 0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, /* 0x20 */
+ 0xB3A1, 0xB3A2, 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A8, /* 0x20 */
+ 0xB3A9, 0xB3AA, 0xB3AB, 0xB3AC, 0xB3AD, 0xB3AE, 0xB3AF, 0xB3B0, /* 0x30 */
+ 0xB3B1, 0xB3B3, 0xB3B4, 0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, 0xB3B9, /* 0x30 */
+ 0xB3BA, 0xB3BB, 0xB3BC, 0xB3BD, 0xB461, 0xB462, 0xB463, 0xB464, /* 0x40 */
+ 0xB465, 0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46C, /* 0x40 */
+ 0xB46D, 0xB46E, 0xB46F, 0xB470, 0xB471, 0xB473, 0xB474, 0xB475, /* 0x50 */
+ 0xB476, 0xB477, 0xB478, 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, /* 0x50 */
+ 0xB481, 0xB482, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487, 0xB488, /* 0x60 */
+ 0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, 0xB48F, 0xB490, /* 0x60 */
+ 0xB491, 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, 0xB498, 0xB499, /* 0x70 */
+ 0xB49A, 0xB49B, 0xB49C, 0xB49D, 0xB4A1, 0xB4A2, 0xB4A3, 0xB4A4, /* 0x70 */
+ 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A8, 0xB4A9, 0xB4AA, 0xB4AB, 0xB4AC, /* 0x80 */
+ 0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B3, 0xB4B4, 0xB4B5, /* 0x80 */
+ 0xB4B6, 0xB4B7, 0xB4B8, 0xB4B9, 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, /* 0x90 */
+ 0xB4C1, 0xB4C2, 0xB4C3, 0xB4C4, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C8, /* 0x90 */
+ 0xB4C9, 0xB4CA, 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D0, /* 0xA0 */
+ 0xB4D1, 0xB4D3, 0xB4D4, 0xB4D5, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, /* 0xA0 */
+ 0xB4DA, 0xB4DB, 0xB4DC, 0xB4DD, 0xB4E1, 0xB4E2, 0xB4E3, 0xB4E4, /* 0xB0 */
+ 0xB4E5, 0xB4E6, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA, 0xB4EB, 0xB4EC, /* 0xB0 */
+ 0xB4ED, 0xB4EE, 0xB4EF, 0xB4F0, 0xB4F1, 0xB4F3, 0xB4F4, 0xB4F5, /* 0xC0 */
+ 0xB4F6, 0xB4F7, 0xB4F8, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, /* 0xC0 */
+ 0xB541, 0xB542, 0xB543, 0xB544, 0xB545, 0xB546, 0xB547, 0xB548, /* 0xD0 */
+ 0xB549, 0xB54A, 0xB54B, 0xB54C, 0xB54D, 0xB54E, 0xB54F, 0xB550, /* 0xD0 */
+ 0xB551, 0xB553, 0xB554, 0xB555, 0xB556, 0xB557, 0xB558, 0xB559, /* 0xE0 */
+ 0xB55A, 0xB55B, 0xB55C, 0xB55D, 0xB561, 0xB562, 0xB563, 0xB564, /* 0xE0 */
+ 0xB565, 0xB566, 0xB567, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, /* 0xF0 */
+ 0xB56D, 0xB56E, 0xB56F, 0xB570, 0xB571, 0xB573, 0xB574, 0xB575 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB576, 0xB577, 0xB578, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D, /* 0x00 */
+ 0xB581, 0xB582, 0xB583, 0xB584, 0xB585, 0xB586, 0xB587, 0xB588, /* 0x00 */
+ 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D, 0xB58E, 0xB58F, 0xB590, /* 0x10 */
+ 0xB591, 0xB593, 0xB594, 0xB595, 0xB596, 0xB597, 0xB598, 0xB599, /* 0x10 */
+ 0xB59A, 0xB59B, 0xB59C, 0xB59D, 0xB5A1, 0xB5A2, 0xB5A3, 0xB5A4, /* 0x20 */
+ 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A8, 0xB5A9, 0xB5AA, 0xB5AB, 0xB5AC, /* 0x20 */
+ 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B0, 0xB5B1, 0xB5B3, 0xB5B4, 0xB5B5, /* 0x30 */
+ 0xB5B6, 0xB5B7, 0xB5B8, 0xB5B9, 0xB5BA, 0xB5BB, 0xB5BC, 0xB5BD, /* 0x30 */
+ 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C4, 0xB5C5, 0xB5C6, 0xB5C7, 0xB5C8, /* 0x40 */
+ 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CC, 0xB5CD, 0xB5CE, 0xB5CF, 0xB5D0, /* 0x40 */
+ 0xB5D1, 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, 0xB5D8, 0xB5D9, /* 0x50 */
+ 0xB5DA, 0xB5DB, 0xB5DC, 0xB5DD, 0xB5E1, 0xB5E2, 0xB5E3, 0xB5E4, /* 0x50 */
+ 0xB5E5, 0xB5E6, 0xB5E7, 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB, 0xB5EC, /* 0x60 */
+ 0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F3, 0xB5F4, 0xB5F5, /* 0x60 */
+ 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, 0xB5FB, 0xB5FC, 0xB5FD, /* 0x70 */
+ 0xB641, 0xB642, 0xB643, 0xB644, 0xB645, 0xB646, 0xB647, 0xB648, /* 0x70 */
+ 0xB649, 0xB64A, 0xB64B, 0xB64C, 0xB64D, 0xB64E, 0xB64F, 0xB650, /* 0x80 */
+ 0xB651, 0xB653, 0xB654, 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, /* 0x80 */
+ 0xB65A, 0xB65B, 0xB65C, 0xB65D, 0xB661, 0xB662, 0xB663, 0xB664, /* 0x90 */
+ 0xB665, 0xB666, 0xB667, 0xB668, 0xB669, 0xB66A, 0xB66B, 0xB66C, /* 0x90 */
+ 0xB66D, 0xB66E, 0xB66F, 0xB670, 0xB671, 0xB673, 0xB674, 0xB675, /* 0xA0 */
+ 0xB676, 0xB677, 0xB678, 0xB679, 0xB67A, 0xB67B, 0xB67C, 0xB67D, /* 0xA0 */
+ 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686, 0xB687, 0xB688, /* 0xB0 */
+ 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E, 0xB68F, 0xB690, /* 0xB0 */
+ 0xB691, 0xB693, 0xB694, 0xB695, 0xB696, 0xB697, 0xB698, 0xB699, /* 0xC0 */
+ 0xB69A, 0xB69B, 0xB69C, 0xB69D, 0xB6A1, 0xB6A2, 0xB6A3, 0xB6A4, /* 0xC0 */
+ 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA, 0xB6AB, 0xB6AC, /* 0xD0 */
+ 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B1, 0xB6B3, 0xB6B4, 0xB6B5, /* 0xD0 */
+ 0xB6B6, 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD, /* 0xE0 */
+ 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5, 0xB6C6, 0xB6C7, 0xB6C8, /* 0xE0 */
+ 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD, 0xB6CE, 0xB6CF, 0xB6D0, /* 0xF0 */
+ 0xB6D1, 0xB6D3, 0xB6D4, 0xB6D5, 0xB6D6, 0xB6D7, 0xB6D8, 0xB6D9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB6DA, 0xB6DB, 0xB6DC, 0xB6DD, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, /* 0x00 */
+ 0xB6E5, 0xB6E6, 0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, /* 0x00 */
+ 0xB6ED, 0xB6EE, 0xB6EF, 0xB6F0, 0xB6F1, 0xB6F3, 0xB6F4, 0xB6F5, /* 0x10 */
+ 0xB6F6, 0xB6F7, 0xB6F8, 0xB6F9, 0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, /* 0x10 */
+ 0xB741, 0xB742, 0xB743, 0xB744, 0xB745, 0xB746, 0xB747, 0xB748, /* 0x20 */
+ 0xB749, 0xB74A, 0xB74B, 0xB74C, 0xB74D, 0xB74E, 0xB74F, 0xB750, /* 0x20 */
+ 0xB751, 0xB753, 0xB754, 0xB755, 0xB756, 0xB757, 0xB758, 0xB759, /* 0x30 */
+ 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB761, 0xB762, 0xB763, 0xB764, /* 0x30 */
+ 0xB765, 0xB766, 0xB767, 0xB768, 0xB769, 0xB76A, 0xB76B, 0xB76C, /* 0x40 */
+ 0xB76D, 0xB76E, 0xB76F, 0xB770, 0xB771, 0xB773, 0xB774, 0xB775, /* 0x40 */
+ 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B, 0xB77C, 0xB77D, /* 0x50 */
+ 0xB781, 0xB782, 0xB783, 0xB784, 0xB785, 0xB786, 0xB787, 0xB788, /* 0x50 */
+ 0xB789, 0xB78A, 0xB78B, 0xB78C, 0xB78D, 0xB78E, 0xB78F, 0xB790, /* 0x60 */
+ 0xB791, 0xB793, 0xB794, 0xB795, 0xB796, 0xB797, 0xB798, 0xB799, /* 0x60 */
+ 0xB79A, 0xB79B, 0xB79C, 0xB79D, 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, /* 0x70 */
+ 0xB7A5, 0xB7A6, 0xB7A7, 0xB7A8, 0xB7A9, 0xB7AA, 0xB7AB, 0xB7AC, /* 0x70 */
+ 0xB7AD, 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B3, 0xB7B4, 0xB7B5, /* 0x80 */
+ 0xB7B6, 0xB7B7, 0xB7B8, 0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, /* 0x80 */
+ 0xB861, 0xB862, 0xB863, 0xB864, 0xB865, 0xB866, 0xB867, 0xB868, /* 0x90 */
+ 0xB869, 0xB86A, 0xB86B, 0xB86C, 0xB86D, 0xB86E, 0xB86F, 0xB870, /* 0x90 */
+ 0xB871, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB878, 0xB879, /* 0xA0 */
+ 0xB87A, 0xB87B, 0xB87C, 0xB87D, 0xB881, 0xB882, 0xB883, 0xB884, /* 0xA0 */
+ 0xB885, 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B, 0xB88C, /* 0xB0 */
+ 0xB88D, 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB893, 0xB894, 0xB895, /* 0xB0 */
+ 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C, 0xB89D, /* 0xC0 */
+ 0xB8A1, 0xB8A2, 0xB8A3, 0xB8A4, 0xB8A5, 0xB8A6, 0xB8A7, 0xB8A8, /* 0xC0 */
+ 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD, 0xB8AE, 0xB8AF, 0xB8B0, /* 0xD0 */
+ 0xB8B1, 0xB8B3, 0xB8B4, 0xB8B5, 0xB8B6, 0xB8B7, 0xB8B8, 0xB8B9, /* 0xD0 */
+ 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8C1, 0xB8C2, 0xB8C3, 0xB8C4, /* 0xE0 */
+ 0xB8C5, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CC, /* 0xE0 */
+ 0xB8CD, 0xB8CE, 0xB8CF, 0xB8D0, 0xB8D1, 0xB8D3, 0xB8D4, 0xB8D5, /* 0xF0 */
+ 0xB8D6, 0xB8D7, 0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB8E1, 0xB8E2, 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0xB8E8, /* 0x00 */
+ 0xB8E9, 0xB8EA, 0xB8EB, 0xB8EC, 0xB8ED, 0xB8EE, 0xB8EF, 0xB8F0, /* 0x00 */
+ 0xB8F1, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6, 0xB8F7, 0xB8F8, 0xB8F9, /* 0x10 */
+ 0xB8FA, 0xB8FB, 0xB8FC, 0xB8FD, 0xB941, 0xB942, 0xB943, 0xB944, /* 0x10 */
+ 0xB945, 0xB946, 0xB947, 0xB948, 0xB949, 0xB94A, 0xB94B, 0xB94C, /* 0x20 */
+ 0xB94D, 0xB94E, 0xB94F, 0xB950, 0xB951, 0xB953, 0xB954, 0xB955, /* 0x20 */
+ 0xB956, 0xB957, 0xB958, 0xB959, 0xB95A, 0xB95B, 0xB95C, 0xB95D, /* 0x30 */
+ 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB968, /* 0x30 */
+ 0xB969, 0xB96A, 0xB96B, 0xB96C, 0xB96D, 0xB96E, 0xB96F, 0xB970, /* 0x40 */
+ 0xB971, 0xB973, 0xB974, 0xB975, 0xB976, 0xB977, 0xB978, 0xB979, /* 0x40 */
+ 0xB97A, 0xB97B, 0xB97C, 0xB97D, 0xB981, 0xB982, 0xB983, 0xB984, /* 0x50 */
+ 0xB985, 0xB986, 0xB987, 0xB988, 0xB989, 0xB98A, 0xB98B, 0xB98C, /* 0x50 */
+ 0xB98D, 0xB98E, 0xB98F, 0xB990, 0xB991, 0xB993, 0xB994, 0xB995, /* 0x60 */
+ 0xB996, 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, /* 0x60 */
+ 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, 0xB9A6, 0xB9A7, 0xB9A8, /* 0x70 */
+ 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AC, 0xB9AD, 0xB9AE, 0xB9AF, 0xB9B0, /* 0x70 */
+ 0xB9B1, 0xB9B3, 0xB9B4, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, /* 0x80 */
+ 0xB9BA, 0xB9BB, 0xB9BC, 0xB9BD, 0xB9C1, 0xB9C2, 0xB9C3, 0xB9C4, /* 0x80 */
+ 0xB9C5, 0xB9C6, 0xB9C7, 0xB9C8, 0xB9C9, 0xB9CA, 0xB9CB, 0xB9CC, /* 0x90 */
+ 0xB9CD, 0xB9CE, 0xB9CF, 0xB9D0, 0xB9D1, 0xB9D3, 0xB9D4, 0xB9D5, /* 0x90 */
+ 0xB9D6, 0xB9D7, 0xB9D8, 0xB9D9, 0xB9DA, 0xB9DB, 0xB9DC, 0xB9DD, /* 0xA0 */
+ 0xB9E1, 0xB9E2, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E6, 0xB9E7, 0xB9E8, /* 0xA0 */
+ 0xB9E9, 0xB9EA, 0xB9EB, 0xB9EC, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, /* 0xB0 */
+ 0xB9F1, 0xB9F3, 0xB9F4, 0xB9F5, 0xB9F6, 0xB9F7, 0xB9F8, 0xB9F9, /* 0xB0 */
+ 0xB9FA, 0xB9FB, 0xB9FC, 0xB9FD, 0xBA41, 0xBA42, 0xBA43, 0xBA44, /* 0xC0 */
+ 0xBA45, 0xBA46, 0xBA47, 0xBA48, 0xBA49, 0xBA4A, 0xBA4B, 0xBA4C, /* 0xC0 */
+ 0xBA4D, 0xBA4E, 0xBA4F, 0xBA50, 0xBA51, 0xBA53, 0xBA54, 0xBA55, /* 0xD0 */
+ 0xBA56, 0xBA57, 0xBA58, 0xBA59, 0xBA5A, 0xBA5B, 0xBA5C, 0xBA5D, /* 0xD0 */
+ 0xBA61, 0xBA62, 0xBA63, 0xBA64, 0xBA65, 0xBA66, 0xBA67, 0xBA68, /* 0xE0 */
+ 0xBA69, 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA70, /* 0xE0 */
+ 0xBA71, 0xBA73, 0xBA74, 0xBA75, 0xBA76, 0xBA77, 0xBA78, 0xBA79, /* 0xF0 */
+ 0xBA7A, 0xBA7B, 0xBA7C, 0xBA7D, 0xBA81, 0xBA82, 0xBA83, 0xBA84 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_C9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBA85, 0xBA86, 0xBA87, 0xBA88, 0xBA89, 0xBA8A, 0xBA8B, 0xBA8C, /* 0x00 */
+ 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91, 0xBA93, 0xBA94, 0xBA95, /* 0x00 */
+ 0xBA96, 0xBA97, 0xBA98, 0xBA99, 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, /* 0x10 */
+ 0xBAA1, 0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAA8, /* 0x10 */
+ 0xBAA9, 0xBAAA, 0xBAAB, 0xBAAC, 0xBAAD, 0xBAAE, 0xBAAF, 0xBAB0, /* 0x20 */
+ 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7, 0xBAB8, 0xBAB9, /* 0x20 */
+ 0xBABA, 0xBABB, 0xBABC, 0xBABD, 0xBAC1, 0xBAC2, 0xBAC3, 0xBAC4, /* 0x30 */
+ 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC8, 0xBAC9, 0xBACA, 0xBACB, 0xBACC, /* 0x30 */
+ 0xBACD, 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD3, 0xBAD4, 0xBAD5, /* 0x40 */
+ 0xBAD6, 0xBAD7, 0xBAD8, 0xBAD9, 0xBADA, 0xBADB, 0xBADC, 0xBADD, /* 0x40 */
+ 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, 0xBAE7, 0xBAE8, /* 0x50 */
+ 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF, 0xBAF0, /* 0x50 */
+ 0xBAF1, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7, 0xBAF8, 0xBAF9, /* 0x60 */
+ 0xBAFA, 0xBAFB, 0xBAFC, 0xBAFD, 0xBB41, 0xBB42, 0xBB43, 0xBB44, /* 0x60 */
+ 0xBB45, 0xBB46, 0xBB47, 0xBB48, 0xBB49, 0xBB4A, 0xBB4B, 0xBB4C, /* 0x70 */
+ 0xBB4D, 0xBB4E, 0xBB4F, 0xBB50, 0xBB51, 0xBB53, 0xBB54, 0xBB55, /* 0x70 */
+ 0xBB56, 0xBB57, 0xBB58, 0xBB59, 0xBB5A, 0xBB5B, 0xBB5C, 0xBB5D, /* 0x80 */
+ 0xBB61, 0xBB62, 0xBB63, 0xBB64, 0xBB65, 0xBB66, 0xBB67, 0xBB68, /* 0x80 */
+ 0xBB69, 0xBB6A, 0xBB6B, 0xBB6C, 0xBB6D, 0xBB6E, 0xBB6F, 0xBB70, /* 0x90 */
+ 0xBB71, 0xBB73, 0xBB74, 0xBB75, 0xBB76, 0xBB77, 0xBB78, 0xBB79, /* 0x90 */
+ 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB81, 0xBB82, 0xBB83, 0xBB84, /* 0xA0 */
+ 0xBB85, 0xBB86, 0xBB87, 0xBB88, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8C, /* 0xA0 */
+ 0xBB8D, 0xBB8E, 0xBB8F, 0xBB90, 0xBB91, 0xBB93, 0xBB94, 0xBB95, /* 0xB0 */
+ 0xBB96, 0xBB97, 0xBB98, 0xBB99, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, /* 0xB0 */
+ 0xBBA1, 0xBBA2, 0xBBA3, 0xBBA4, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA8, /* 0xC0 */
+ 0xBBA9, 0xBBAA, 0xBBAB, 0xBBAC, 0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, /* 0xC0 */
+ 0xBBB1, 0xBBB3, 0xBBB4, 0xBBB5, 0xBBB6, 0xBBB7, 0xBBB8, 0xBBB9, /* 0xD0 */
+ 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBC61, 0xBC62, 0xBC63, 0xBC64, /* 0xD0 */
+ 0xBC65, 0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, /* 0xE0 */
+ 0xBC6D, 0xBC6E, 0xBC6F, 0xBC70, 0xBC71, 0xBC73, 0xBC74, 0xBC75, /* 0xE0 */
+ 0xBC76, 0xBC77, 0xBC78, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D, /* 0xF0 */
+ 0xBC81, 0xBC82, 0xBC83, 0xBC84, 0xBC85, 0xBC86, 0xBC87, 0xBC88 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_CA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBC89, 0xBC8A, 0xBC8B, 0xBC8C, 0xBC8D, 0xBC8E, 0xBC8F, 0xBC90, /* 0x00 */
+ 0xBC91, 0xBC93, 0xBC94, 0xBC95, 0xBC96, 0xBC97, 0xBC98, 0xBC99, /* 0x00 */
+ 0xBC9A, 0xBC9B, 0xBC9C, 0xBC9D, 0xBCA1, 0xBCA2, 0xBCA3, 0xBCA4, /* 0x10 */
+ 0xBCA5, 0xBCA6, 0xBCA7, 0xBCA8, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, /* 0x10 */
+ 0xBCAD, 0xBCAE, 0xBCAF, 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, /* 0x20 */
+ 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA, 0xBCBB, 0xBCBC, 0xBCBD, /* 0x20 */
+ 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC4, 0xBCC5, 0xBCC6, 0xBCC7, 0xBCC8, /* 0x30 */
+ 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCD, 0xBCCE, 0xBCCF, 0xBCD0, /* 0x30 */
+ 0xBCD1, 0xBCD3, 0xBCD4, 0xBCD5, 0xBCD6, 0xBCD7, 0xBCD8, 0xBCD9, /* 0x40 */
+ 0xBCDA, 0xBCDB, 0xBCDC, 0xBCDD, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, /* 0x40 */
+ 0xBCE5, 0xBCE6, 0xBCE7, 0xBCE8, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, /* 0x50 */
+ 0xBCED, 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF3, 0xBCF4, 0xBCF5, /* 0x50 */
+ 0xBCF6, 0xBCF7, 0xBCF8, 0xBCF9, 0xBCFA, 0xBCFB, 0xBCFC, 0xBCFD, /* 0x60 */
+ 0xBD41, 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD48, /* 0x60 */
+ 0xBD49, 0xBD4A, 0xBD4B, 0xBD4C, 0xBD4D, 0xBD4E, 0xBD4F, 0xBD50, /* 0x70 */
+ 0xBD51, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57, 0xBD58, 0xBD59, /* 0x70 */
+ 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD61, 0xBD62, 0xBD63, 0xBD64, /* 0x80 */
+ 0xBD65, 0xBD66, 0xBD67, 0xBD68, 0xBD69, 0xBD6A, 0xBD6B, 0xBD6C, /* 0x80 */
+ 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD73, 0xBD74, 0xBD75, /* 0x90 */
+ 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D, /* 0x90 */
+ 0xBD81, 0xBD82, 0xBD83, 0xBD84, 0xBD85, 0xBD86, 0xBD87, 0xBD88, /* 0xA0 */
+ 0xBD89, 0xBD8A, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD90, /* 0xA0 */
+ 0xBD91, 0xBD93, 0xBD94, 0xBD95, 0xBD96, 0xBD97, 0xBD98, 0xBD99, /* 0xB0 */
+ 0xBD9A, 0xBD9B, 0xBD9C, 0xBD9D, 0xBDA1, 0xBDA2, 0xBDA3, 0xBDA4, /* 0xB0 */
+ 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA, 0xBDAB, 0xBDAC, /* 0xC0 */
+ 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB0, 0xBDB1, 0xBDB3, 0xBDB4, 0xBDB5, /* 0xC0 */
+ 0xBDB6, 0xBDB7, 0xBDB8, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC, 0xBDBD, /* 0xD0 */
+ 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4, 0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, /* 0xD0 */
+ 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC, 0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, /* 0xE0 */
+ 0xBDD1, 0xBDD3, 0xBDD4, 0xBDD5, 0xBDD6, 0xBDD7, 0xBDD8, 0xBDD9, /* 0xE0 */
+ 0xBDDA, 0xBDDB, 0xBDDC, 0xBDDD, 0xBDE1, 0xBDE2, 0xBDE3, 0xBDE4, /* 0xF0 */
+ 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8, 0xBDE9, 0xBDEA, 0xBDEB, 0xBDEC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_CB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDED, 0xBDEE, 0xBDEF, 0xBDF0, 0xBDF1, 0xBDF3, 0xBDF4, 0xBDF5, /* 0x00 */
+ 0xBDF6, 0xBDF7, 0xBDF8, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC, 0xBDFD, /* 0x00 */
+ 0xBE41, 0xBE42, 0xBE43, 0xBE44, 0xBE45, 0xBE46, 0xBE47, 0xBE48, /* 0x10 */
+ 0xBE49, 0xBE4A, 0xBE4B, 0xBE4C, 0xBE4D, 0xBE4E, 0xBE4F, 0xBE50, /* 0x10 */
+ 0xBE51, 0xBE53, 0xBE54, 0xBE55, 0xBE56, 0xBE57, 0xBE58, 0xBE59, /* 0x20 */
+ 0xBE5A, 0xBE5B, 0xBE5C, 0xBE5D, 0xBE61, 0xBE62, 0xBE63, 0xBE64, /* 0x20 */
+ 0xBE65, 0xBE66, 0xBE67, 0xBE68, 0xBE69, 0xBE6A, 0xBE6B, 0xBE6C, /* 0x30 */
+ 0xBE6D, 0xBE6E, 0xBE6F, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, /* 0x30 */
+ 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7B, 0xBE7C, 0xBE7D, /* 0x40 */
+ 0xBE81, 0xBE82, 0xBE83, 0xBE84, 0xBE85, 0xBE86, 0xBE87, 0xBE88, /* 0x40 */
+ 0xBE89, 0xBE8A, 0xBE8B, 0xBE8C, 0xBE8D, 0xBE8E, 0xBE8F, 0xBE90, /* 0x50 */
+ 0xBE91, 0xBE93, 0xBE94, 0xBE95, 0xBE96, 0xBE97, 0xBE98, 0xBE99, /* 0x50 */
+ 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, /* 0x60 */
+ 0xBEA5, 0xBEA6, 0xBEA7, 0xBEA8, 0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, /* 0x60 */
+ 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0, 0xBEB1, 0xBEB3, 0xBEB4, 0xBEB5, /* 0x70 */
+ 0xBEB6, 0xBEB7, 0xBEB8, 0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, /* 0x70 */
+ 0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8, /* 0x80 */
+ 0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, 0xBED0, /* 0x80 */
+ 0xBED1, 0xBED3, 0xBED4, 0xBED5, 0xBED6, 0xBED7, 0xBED8, 0xBED9, /* 0x90 */
+ 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD, 0xBEE1, 0xBEE2, 0xBEE3, 0xBEE4, /* 0x90 */
+ 0xBEE5, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9, 0xBEEA, 0xBEEB, 0xBEEC, /* 0xA0 */
+ 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF3, 0xBEF4, 0xBEF5, /* 0xA0 */
+ 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA, 0xBEFB, 0xBEFC, 0xBEFD, /* 0xB0 */
+ 0xBF41, 0xBF42, 0xBF43, 0xBF44, 0xBF45, 0xBF46, 0xBF47, 0xBF48, /* 0xB0 */
+ 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E, 0xBF4F, 0xBF50, /* 0xC0 */
+ 0xBF51, 0xBF53, 0xBF54, 0xBF55, 0xBF56, 0xBF57, 0xBF58, 0xBF59, /* 0xC0 */
+ 0xBF5A, 0xBF5B, 0xBF5C, 0xBF5D, 0xBF61, 0xBF62, 0xBF63, 0xBF64, /* 0xD0 */
+ 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69, 0xBF6A, 0xBF6B, 0xBF6C, /* 0xD0 */
+ 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71, 0xBF73, 0xBF74, 0xBF75, /* 0xE0 */
+ 0xBF76, 0xBF77, 0xBF78, 0xBF79, 0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, /* 0xE0 */
+ 0xBF81, 0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, /* 0xF0 */
+ 0xBF89, 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_CC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBF91, 0xBF93, 0xBF94, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, /* 0x00 */
+ 0xBF9A, 0xBF9B, 0xBF9C, 0xBF9D, 0xBFA1, 0xBFA2, 0xBFA3, 0xBFA4, /* 0x00 */
+ 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA, 0xBFAB, 0xBFAC, /* 0x10 */
+ 0xBFAD, 0xBFAE, 0xBFAF, 0xBFB0, 0xBFB1, 0xBFB3, 0xBFB4, 0xBFB5, /* 0x10 */
+ 0xBFB6, 0xBFB7, 0xBFB8, 0xBFB9, 0xBFBA, 0xBFBB, 0xBFBC, 0xBFBD, /* 0x20 */
+ 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC068, /* 0x20 */
+ 0xC069, 0xC06A, 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, /* 0x30 */
+ 0xC071, 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, /* 0x30 */
+ 0xC07A, 0xC07B, 0xC07C, 0xC07D, 0xC081, 0xC082, 0xC083, 0xC084, /* 0x40 */
+ 0xC085, 0xC086, 0xC087, 0xC088, 0xC089, 0xC08A, 0xC08B, 0xC08C, /* 0x40 */
+ 0xC08D, 0xC08E, 0xC08F, 0xC090, 0xC091, 0xC093, 0xC094, 0xC095, /* 0x50 */
+ 0xC096, 0xC097, 0xC098, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, /* 0x50 */
+ 0xC0A1, 0xC0A2, 0xC0A3, 0xC0A4, 0xC0A5, 0xC0A6, 0xC0A7, 0xC0A8, /* 0x60 */
+ 0xC0A9, 0xC0AA, 0xC0AB, 0xC0AC, 0xC0AD, 0xC0AE, 0xC0AF, 0xC0B0, /* 0x60 */
+ 0xC0B1, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0B7, 0xC0B8, 0xC0B9, /* 0x70 */
+ 0xC0BA, 0xC0BB, 0xC0BC, 0xC0BD, 0xC0C1, 0xC0C2, 0xC0C3, 0xC0C4, /* 0x70 */
+ 0xC0C5, 0xC0C6, 0xC0C7, 0xC0C8, 0xC0C9, 0xC0CA, 0xC0CB, 0xC0CC, /* 0x80 */
+ 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D0, 0xC0D1, 0xC0D3, 0xC0D4, 0xC0D5, /* 0x80 */
+ 0xC0D6, 0xC0D7, 0xC0D8, 0xC0D9, 0xC0DA, 0xC0DB, 0xC0DC, 0xC0DD, /* 0x90 */
+ 0xC0E1, 0xC0E2, 0xC0E3, 0xC0E4, 0xC0E5, 0xC0E6, 0xC0E7, 0xC0E8, /* 0x90 */
+ 0xC0E9, 0xC0EA, 0xC0EB, 0xC0EC, 0xC0ED, 0xC0EE, 0xC0EF, 0xC0F0, /* 0xA0 */
+ 0xC0F1, 0xC0F3, 0xC0F4, 0xC0F5, 0xC0F6, 0xC0F7, 0xC0F8, 0xC0F9, /* 0xA0 */
+ 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC141, 0xC142, 0xC143, 0xC144, /* 0xB0 */
+ 0xC145, 0xC146, 0xC147, 0xC148, 0xC149, 0xC14A, 0xC14B, 0xC14C, /* 0xB0 */
+ 0xC14D, 0xC14E, 0xC14F, 0xC150, 0xC151, 0xC153, 0xC154, 0xC155, /* 0xC0 */
+ 0xC156, 0xC157, 0xC158, 0xC159, 0xC15A, 0xC15B, 0xC15C, 0xC15D, /* 0xC0 */
+ 0xC161, 0xC162, 0xC163, 0xC164, 0xC165, 0xC166, 0xC167, 0xC168, /* 0xD0 */
+ 0xC169, 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F, 0xC170, /* 0xD0 */
+ 0xC171, 0xC173, 0xC174, 0xC175, 0xC176, 0xC177, 0xC178, 0xC179, /* 0xE0 */
+ 0xC17A, 0xC17B, 0xC17C, 0xC17D, 0xC181, 0xC182, 0xC183, 0xC184, /* 0xE0 */
+ 0xC185, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B, 0xC18C, /* 0xF0 */
+ 0xC18D, 0xC18E, 0xC18F, 0xC190, 0xC191, 0xC193, 0xC194, 0xC195 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_CD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC196, 0xC197, 0xC198, 0xC199, 0xC19A, 0xC19B, 0xC19C, 0xC19D, /* 0x00 */
+ 0xC1A1, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A5, 0xC1A6, 0xC1A7, 0xC1A8, /* 0x00 */
+ 0xC1A9, 0xC1AA, 0xC1AB, 0xC1AC, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B0, /* 0x10 */
+ 0xC1B1, 0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, /* 0x10 */
+ 0xC1BA, 0xC1BB, 0xC1BC, 0xC1BD, 0xC1C1, 0xC1C2, 0xC1C3, 0xC1C4, /* 0x20 */
+ 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C8, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CC, /* 0x20 */
+ 0xC1CD, 0xC1CE, 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D3, 0xC1D4, 0xC1D5, /* 0x30 */
+ 0xC1D6, 0xC1D7, 0xC1D8, 0xC1D9, 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, /* 0x30 */
+ 0xC1E1, 0xC1E2, 0xC1E3, 0xC1E4, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E8, /* 0x40 */
+ 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC, 0xC1ED, 0xC1EE, 0xC1EF, 0xC1F0, /* 0x40 */
+ 0xC1F1, 0xC1F3, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7, 0xC1F8, 0xC1F9, /* 0x50 */
+ 0xC1FA, 0xC1FB, 0xC1FC, 0xC1FD, 0xC241, 0xC242, 0xC243, 0xC244, /* 0x50 */
+ 0xC245, 0xC246, 0xC247, 0xC248, 0xC249, 0xC24A, 0xC24B, 0xC24C, /* 0x60 */
+ 0xC24D, 0xC24E, 0xC24F, 0xC250, 0xC251, 0xC253, 0xC254, 0xC255, /* 0x60 */
+ 0xC256, 0xC257, 0xC258, 0xC259, 0xC25A, 0xC25B, 0xC25C, 0xC25D, /* 0x70 */
+ 0xC261, 0xC262, 0xC263, 0xC264, 0xC265, 0xC266, 0xC267, 0xC268, /* 0x70 */
+ 0xC269, 0xC26A, 0xC26B, 0xC26C, 0xC26D, 0xC26E, 0xC26F, 0xC270, /* 0x80 */
+ 0xC271, 0xC273, 0xC274, 0xC275, 0xC276, 0xC277, 0xC278, 0xC279, /* 0x80 */
+ 0xC27A, 0xC27B, 0xC27C, 0xC27D, 0xC281, 0xC282, 0xC283, 0xC284, /* 0x90 */
+ 0xC285, 0xC286, 0xC287, 0xC288, 0xC289, 0xC28A, 0xC28B, 0xC28C, /* 0x90 */
+ 0xC28D, 0xC28E, 0xC28F, 0xC290, 0xC291, 0xC293, 0xC294, 0xC295, /* 0xA0 */
+ 0xC296, 0xC297, 0xC298, 0xC299, 0xC29A, 0xC29B, 0xC29C, 0xC29D, /* 0xA0 */
+ 0xC2A1, 0xC2A2, 0xC2A3, 0xC2A4, 0xC2A5, 0xC2A6, 0xC2A7, 0xC2A8, /* 0xB0 */
+ 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AC, 0xC2AD, 0xC2AE, 0xC2AF, 0xC2B0, /* 0xB0 */
+ 0xC2B1, 0xC2B3, 0xC2B4, 0xC2B5, 0xC2B6, 0xC2B7, 0xC2B8, 0xC2B9, /* 0xC0 */
+ 0xC2BA, 0xC2BB, 0xC2BC, 0xC2BD, 0xC2C1, 0xC2C2, 0xC2C3, 0xC2C4, /* 0xC0 */
+ 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA, 0xC2CB, 0xC2CC, /* 0xD0 */
+ 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D3, 0xC2D4, 0xC2D5, /* 0xD0 */
+ 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA, 0xC2DB, 0xC2DC, 0xC2DD, /* 0xE0 */
+ 0xC2E1, 0xC2E2, 0xC2E3, 0xC2E4, 0xC2E5, 0xC2E6, 0xC2E7, 0xC2E8, /* 0xE0 */
+ 0xC2E9, 0xC2EA, 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EE, 0xC2EF, 0xC2F0, /* 0xF0 */
+ 0xC2F1, 0xC2F3, 0xC2F4, 0xC2F5, 0xC2F6, 0xC2F7, 0xC2F8, 0xC2F9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_CE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC2FA, 0xC2FB, 0xC2FC, 0xC2FD, 0xC341, 0xC342, 0xC343, 0xC344, /* 0x00 */
+ 0xC345, 0xC346, 0xC347, 0xC348, 0xC349, 0xC34A, 0xC34B, 0xC34C, /* 0x00 */
+ 0xC34D, 0xC34E, 0xC34F, 0xC350, 0xC351, 0xC353, 0xC354, 0xC355, /* 0x10 */
+ 0xC356, 0xC357, 0xC358, 0xC359, 0xC35A, 0xC35B, 0xC35C, 0xC35D, /* 0x10 */
+ 0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0xC368, /* 0x20 */
+ 0xC369, 0xC36A, 0xC36B, 0xC36C, 0xC36D, 0xC36E, 0xC36F, 0xC370, /* 0x20 */
+ 0xC371, 0xC373, 0xC374, 0xC375, 0xC376, 0xC377, 0xC378, 0xC379, /* 0x30 */
+ 0xC37A, 0xC37B, 0xC37C, 0xC37D, 0xC381, 0xC382, 0xC383, 0xC384, /* 0x30 */
+ 0xC385, 0xC386, 0xC387, 0xC388, 0xC389, 0xC38A, 0xC38B, 0xC38C, /* 0x40 */
+ 0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC393, 0xC394, 0xC395, /* 0x40 */
+ 0xC396, 0xC397, 0xC398, 0xC399, 0xC39A, 0xC39B, 0xC39C, 0xC39D, /* 0x50 */
+ 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4, 0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, /* 0x50 */
+ 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC, 0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, /* 0x60 */
+ 0xC3B1, 0xC3B3, 0xC3B4, 0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, /* 0x60 */
+ 0xC3BA, 0xC3BB, 0xC3BC, 0xC3BD, 0xC461, 0xC462, 0xC463, 0xC464, /* 0x70 */
+ 0xC465, 0xC466, 0xC467, 0xC468, 0xC469, 0xC46A, 0xC46B, 0xC46C, /* 0x70 */
+ 0xC46D, 0xC46E, 0xC46F, 0xC470, 0xC471, 0xC473, 0xC474, 0xC475, /* 0x80 */
+ 0xC476, 0xC477, 0xC478, 0xC479, 0xC47A, 0xC47B, 0xC47C, 0xC47D, /* 0x80 */
+ 0xC481, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, /* 0x90 */
+ 0xC489, 0xC48A, 0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490, /* 0x90 */
+ 0xC491, 0xC493, 0xC494, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, /* 0xA0 */
+ 0xC49A, 0xC49B, 0xC49C, 0xC49D, 0xC4A1, 0xC4A2, 0xC4A3, 0xC4A4, /* 0xA0 */
+ 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, 0xC4AB, 0xC4AC, /* 0xB0 */
+ 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, 0xC4B3, 0xC4B4, 0xC4B5, /* 0xB0 */
+ 0xC4B6, 0xC4B7, 0xC4B8, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BC, 0xC4BD, /* 0xC0 */
+ 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6, 0xC4C7, 0xC4C8, /* 0xC0 */
+ 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, 0xC4CE, 0xC4CF, 0xC4D0, /* 0xD0 */
+ 0xC4D1, 0xC4D3, 0xC4D4, 0xC4D5, 0xC4D6, 0xC4D7, 0xC4D8, 0xC4D9, /* 0xD0 */
+ 0xC4DA, 0xC4DB, 0xC4DC, 0xC4DD, 0xC4E1, 0xC4E2, 0xC4E3, 0xC4E4, /* 0xE0 */
+ 0xC4E5, 0xC4E6, 0xC4E7, 0xC4E8, 0xC4E9, 0xC4EA, 0xC4EB, 0xC4EC, /* 0xE0 */
+ 0xC4ED, 0xC4EE, 0xC4EF, 0xC4F0, 0xC4F1, 0xC4F3, 0xC4F4, 0xC4F5, /* 0xF0 */
+ 0xC4F6, 0xC4F7, 0xC4F8, 0xC4F9, 0xC4FA, 0xC4FB, 0xC4FC, 0xC4FD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_CF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC541, 0xC542, 0xC543, 0xC544, 0xC545, 0xC546, 0xC547, 0xC548, /* 0x00 */
+ 0xC549, 0xC54A, 0xC54B, 0xC54C, 0xC54D, 0xC54E, 0xC54F, 0xC550, /* 0x00 */
+ 0xC551, 0xC553, 0xC554, 0xC555, 0xC556, 0xC557, 0xC558, 0xC559, /* 0x10 */
+ 0xC55A, 0xC55B, 0xC55C, 0xC55D, 0xC561, 0xC562, 0xC563, 0xC564, /* 0x10 */
+ 0xC565, 0xC566, 0xC567, 0xC568, 0xC569, 0xC56A, 0xC56B, 0xC56C, /* 0x20 */
+ 0xC56D, 0xC56E, 0xC56F, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575, /* 0x20 */
+ 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57C, 0xC57D, /* 0x30 */
+ 0xC581, 0xC582, 0xC583, 0xC584, 0xC585, 0xC586, 0xC587, 0xC588, /* 0x30 */
+ 0xC589, 0xC58A, 0xC58B, 0xC58C, 0xC58D, 0xC58E, 0xC58F, 0xC590, /* 0x40 */
+ 0xC591, 0xC593, 0xC594, 0xC595, 0xC596, 0xC597, 0xC598, 0xC599, /* 0x40 */
+ 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC5A1, 0xC5A2, 0xC5A3, 0xC5A4, /* 0x50 */
+ 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, 0xC5A9, 0xC5AA, 0xC5AB, 0xC5AC, /* 0x50 */
+ 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B3, 0xC5B4, 0xC5B5, /* 0x60 */
+ 0xC5B6, 0xC5B7, 0xC5B8, 0xC5B9, 0xC5BA, 0xC5BB, 0xC5BC, 0xC5BD, /* 0x60 */
+ 0xC5C1, 0xC5C2, 0xC5C3, 0xC5C4, 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, /* 0x70 */
+ 0xC5C9, 0xC5CA, 0xC5CB, 0xC5CC, 0xC5CD, 0xC5CE, 0xC5CF, 0xC5D0, /* 0x70 */
+ 0xC5D1, 0xC5D3, 0xC5D4, 0xC5D5, 0xC5D6, 0xC5D7, 0xC5D8, 0xC5D9, /* 0x80 */
+ 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5E1, 0xC5E2, 0xC5E3, 0xC5E4, /* 0x80 */
+ 0xC5E5, 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EC, /* 0x90 */
+ 0xC5ED, 0xC5EE, 0xC5EF, 0xC5F0, 0xC5F1, 0xC5F3, 0xC5F4, 0xC5F5, /* 0x90 */
+ 0xC5F6, 0xC5F7, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB, 0xC5FC, 0xC5FD, /* 0xA0 */
+ 0xC641, 0xC642, 0xC643, 0xC644, 0xC645, 0xC646, 0xC647, 0xC648, /* 0xA0 */
+ 0xC649, 0xC64A, 0xC64B, 0xC64C, 0xC64D, 0xC64E, 0xC64F, 0xC650, /* 0xB0 */
+ 0xC651, 0xC653, 0xC654, 0xC655, 0xC656, 0xC657, 0xC658, 0xC659, /* 0xB0 */
+ 0xC65A, 0xC65B, 0xC65C, 0xC65D, 0xC661, 0xC662, 0xC663, 0xC664, /* 0xC0 */
+ 0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66C, /* 0xC0 */
+ 0xC66D, 0xC66E, 0xC66F, 0xC670, 0xC671, 0xC673, 0xC674, 0xC675, /* 0xD0 */
+ 0xC676, 0xC677, 0xC678, 0xC679, 0xC67A, 0xC67B, 0xC67C, 0xC67D, /* 0xD0 */
+ 0xC681, 0xC682, 0xC683, 0xC684, 0xC685, 0xC686, 0xC687, 0xC688, /* 0xE0 */
+ 0xC689, 0xC68A, 0xC68B, 0xC68C, 0xC68D, 0xC68E, 0xC68F, 0xC690, /* 0xE0 */
+ 0xC691, 0xC693, 0xC694, 0xC695, 0xC696, 0xC697, 0xC698, 0xC699, /* 0xF0 */
+ 0xC69A, 0xC69B, 0xC69C, 0xC69D, 0xC6A1, 0xC6A2, 0xC6A3, 0xC6A4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_D0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6A5, 0xC6A6, 0xC6A7, 0xC6A8, 0xC6A9, 0xC6AA, 0xC6AB, 0xC6AC, /* 0x00 */
+ 0xC6AD, 0xC6AE, 0xC6AF, 0xC6B0, 0xC6B1, 0xC6B3, 0xC6B4, 0xC6B5, /* 0x00 */
+ 0xC6B6, 0xC6B7, 0xC6B8, 0xC6B9, 0xC6BA, 0xC6BB, 0xC6BC, 0xC6BD, /* 0x10 */
+ 0xC6C1, 0xC6C2, 0xC6C3, 0xC6C4, 0xC6C5, 0xC6C6, 0xC6C7, 0xC6C8, /* 0x10 */
+ 0xC6C9, 0xC6CA, 0xC6CB, 0xC6CC, 0xC6CD, 0xC6CE, 0xC6CF, 0xC6D0, /* 0x20 */
+ 0xC6D1, 0xC6D3, 0xC6D4, 0xC6D5, 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, /* 0x20 */
+ 0xC6DA, 0xC6DB, 0xC6DC, 0xC6DD, 0xC6E1, 0xC6E2, 0xC6E3, 0xC6E4, /* 0x30 */
+ 0xC6E5, 0xC6E6, 0xC6E7, 0xC6E8, 0xC6E9, 0xC6EA, 0xC6EB, 0xC6EC, /* 0x30 */
+ 0xC6ED, 0xC6EE, 0xC6EF, 0xC6F0, 0xC6F1, 0xC6F3, 0xC6F4, 0xC6F5, /* 0x40 */
+ 0xC6F6, 0xC6F7, 0xC6F8, 0xC6F9, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FD, /* 0x40 */
+ 0xC741, 0xC742, 0xC743, 0xC744, 0xC745, 0xC746, 0xC747, 0xC748, /* 0x50 */
+ 0xC749, 0xC74A, 0xC74B, 0xC74C, 0xC74D, 0xC74E, 0xC74F, 0xC750, /* 0x50 */
+ 0xC751, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC759, /* 0x60 */
+ 0xC75A, 0xC75B, 0xC75C, 0xC75D, 0xC761, 0xC762, 0xC763, 0xC764, /* 0x60 */
+ 0xC765, 0xC766, 0xC767, 0xC768, 0xC769, 0xC76A, 0xC76B, 0xC76C, /* 0x70 */
+ 0xC76D, 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC773, 0xC774, 0xC775, /* 0x70 */
+ 0xC776, 0xC777, 0xC778, 0xC779, 0xC77A, 0xC77B, 0xC77C, 0xC77D, /* 0x80 */
+ 0xC781, 0xC782, 0xC783, 0xC784, 0xC785, 0xC786, 0xC787, 0xC788, /* 0x80 */
+ 0xC789, 0xC78A, 0xC78B, 0xC78C, 0xC78D, 0xC78E, 0xC78F, 0xC790, /* 0x90 */
+ 0xC791, 0xC793, 0xC794, 0xC795, 0xC796, 0xC797, 0xC798, 0xC799, /* 0x90 */
+ 0xC79A, 0xC79B, 0xC79C, 0xC79D, 0xC7A1, 0xC7A2, 0xC7A3, 0xC7A4, /* 0xA0 */
+ 0xC7A5, 0xC7A6, 0xC7A7, 0xC7A8, 0xC7A9, 0xC7AA, 0xC7AB, 0xC7AC, /* 0xA0 */
+ 0xC7AD, 0xC7AE, 0xC7AF, 0xC7B0, 0xC7B1, 0xC7B3, 0xC7B4, 0xC7B5, /* 0xB0 */
+ 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BC, 0xC7BD, /* 0xB0 */
+ 0xC861, 0xC862, 0xC863, 0xC864, 0xC865, 0xC866, 0xC867, 0xC868, /* 0xC0 */
+ 0xC869, 0xC86A, 0xC86B, 0xC86C, 0xC86D, 0xC86E, 0xC86F, 0xC870, /* 0xC0 */
+ 0xC871, 0xC873, 0xC874, 0xC875, 0xC876, 0xC877, 0xC878, 0xC879, /* 0xD0 */
+ 0xC87A, 0xC87B, 0xC87C, 0xC87D, 0xC881, 0xC882, 0xC883, 0xC884, /* 0xD0 */
+ 0xC885, 0xC886, 0xC887, 0xC888, 0xC889, 0xC88A, 0xC88B, 0xC88C, /* 0xE0 */
+ 0xC88D, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC893, 0xC894, 0xC895, /* 0xE0 */
+ 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C, 0xC89D, /* 0xF0 */
+ 0xC8A1, 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7, 0xC8A8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_D1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0, /* 0x00 */
+ 0xC8B1, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8, 0xC8B9, /* 0x00 */
+ 0xC8BA, 0xC8BB, 0xC8BC, 0xC8BD, 0xC8C1, 0xC8C2, 0xC8C3, 0xC8C4, /* 0x10 */
+ 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C8, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CC, /* 0x10 */
+ 0xC8CD, 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D3, 0xC8D4, 0xC8D5, /* 0x20 */
+ 0xC8D6, 0xC8D7, 0xC8D8, 0xC8D9, 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, /* 0x20 */
+ 0xC8E1, 0xC8E2, 0xC8E3, 0xC8E4, 0xC8E5, 0xC8E6, 0xC8E7, 0xC8E8, /* 0x30 */
+ 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC, 0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, /* 0x30 */
+ 0xC8F1, 0xC8F3, 0xC8F4, 0xC8F5, 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, /* 0x40 */
+ 0xC8FA, 0xC8FB, 0xC8FC, 0xC8FD, 0xC941, 0xC942, 0xC943, 0xC944, /* 0x40 */
+ 0xC945, 0xC946, 0xC947, 0xC948, 0xC949, 0xC94A, 0xC94B, 0xC94C, /* 0x50 */
+ 0xC94D, 0xC94E, 0xC94F, 0xC950, 0xC951, 0xC953, 0xC954, 0xC955, /* 0x50 */
+ 0xC956, 0xC957, 0xC958, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, /* 0x60 */
+ 0xC961, 0xC962, 0xC963, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, /* 0x60 */
+ 0xC969, 0xC96A, 0xC96B, 0xC96C, 0xC96D, 0xC96E, 0xC96F, 0xC970, /* 0x70 */
+ 0xC971, 0xC973, 0xC974, 0xC975, 0xC976, 0xC977, 0xC978, 0xC979, /* 0x70 */
+ 0xC97A, 0xC97B, 0xC97C, 0xC97D, 0xC981, 0xC982, 0xC983, 0xC984, /* 0x80 */
+ 0xC985, 0xC986, 0xC987, 0xC988, 0xC989, 0xC98A, 0xC98B, 0xC98C, /* 0x80 */
+ 0xC98D, 0xC98E, 0xC98F, 0xC990, 0xC991, 0xC993, 0xC994, 0xC995, /* 0x90 */
+ 0xC996, 0xC997, 0xC998, 0xC999, 0xC99A, 0xC99B, 0xC99C, 0xC99D, /* 0x90 */
+ 0xC9A1, 0xC9A2, 0xC9A3, 0xC9A4, 0xC9A5, 0xC9A6, 0xC9A7, 0xC9A8, /* 0xA0 */
+ 0xC9A9, 0xC9AA, 0xC9AB, 0xC9AC, 0xC9AD, 0xC9AE, 0xC9AF, 0xC9B0, /* 0xA0 */
+ 0xC9B1, 0xC9B3, 0xC9B4, 0xC9B5, 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, /* 0xB0 */
+ 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD, 0xC9C1, 0xC9C2, 0xC9C3, 0xC9C4, /* 0xB0 */
+ 0xC9C5, 0xC9C6, 0xC9C7, 0xC9C8, 0xC9C9, 0xC9CA, 0xC9CB, 0xC9CC, /* 0xC0 */
+ 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D0, 0xC9D1, 0xC9D3, 0xC9D4, 0xC9D5, /* 0xC0 */
+ 0xC9D6, 0xC9D7, 0xC9D8, 0xC9D9, 0xC9DA, 0xC9DB, 0xC9DC, 0xC9DD, /* 0xD0 */
+ 0xC9E1, 0xC9E2, 0xC9E3, 0xC9E4, 0xC9E5, 0xC9E6, 0xC9E7, 0xC9E8, /* 0xD0 */
+ 0xC9E9, 0xC9EA, 0xC9EB, 0xC9EC, 0xC9ED, 0xC9EE, 0xC9EF, 0xC9F0, /* 0xE0 */
+ 0xC9F1, 0xC9F3, 0xC9F4, 0xC9F5, 0xC9F6, 0xC9F7, 0xC9F8, 0xC9F9, /* 0xE0 */
+ 0xC9FA, 0xC9FB, 0xC9FC, 0xC9FD, 0xCA41, 0xCA42, 0xCA43, 0xCA44, /* 0xF0 */
+ 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xCA49, 0xCA4A, 0xCA4B, 0xCA4C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_D2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCA4D, 0xCA4E, 0xCA4F, 0xCA50, 0xCA51, 0xCA53, 0xCA54, 0xCA55, /* 0x00 */
+ 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5C, 0xCA5D, /* 0x00 */
+ 0xCA61, 0xCA62, 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA68, /* 0x10 */
+ 0xCA69, 0xCA6A, 0xCA6B, 0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, /* 0x10 */
+ 0xCA71, 0xCA73, 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, /* 0x20 */
+ 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7D, 0xCA81, 0xCA82, 0xCA83, 0xCA84, /* 0x20 */
+ 0xCA85, 0xCA86, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, /* 0x30 */
+ 0xCA8D, 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA93, 0xCA94, 0xCA95, /* 0x30 */
+ 0xCA96, 0xCA97, 0xCA98, 0xCA99, 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, /* 0x40 */
+ 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6, 0xCAA7, 0xCAA8, /* 0x40 */
+ 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE, 0xCAAF, 0xCAB0, /* 0x50 */
+ 0xCAB1, 0xCAB3, 0xCAB4, 0xCAB5, 0xCAB6, 0xCAB7, 0xCAB8, 0xCAB9, /* 0x50 */
+ 0xCABA, 0xCABB, 0xCABC, 0xCABD, 0xCAC1, 0xCAC2, 0xCAC3, 0xCAC4, /* 0x60 */
+ 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA, 0xCACB, 0xCACC, /* 0x60 */
+ 0xCACD, 0xCACE, 0xCACF, 0xCAD0, 0xCAD1, 0xCAD3, 0xCAD4, 0xCAD5, /* 0x70 */
+ 0xCAD6, 0xCAD7, 0xCAD8, 0xCAD9, 0xCADA, 0xCADB, 0xCADC, 0xCADD, /* 0x70 */
+ 0xCAE1, 0xCAE2, 0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6, 0xCAE7, 0xCAE8, /* 0x80 */
+ 0xCAE9, 0xCAEA, 0xCAEB, 0xCAEC, 0xCAED, 0xCAEE, 0xCAEF, 0xCAF0, /* 0x80 */
+ 0xCAF1, 0xCAF3, 0xCAF4, 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, /* 0x90 */
+ 0xCAFA, 0xCAFB, 0xCAFC, 0xCAFD, 0xCB41, 0xCB42, 0xCB43, 0xCB44, /* 0x90 */
+ 0xCB45, 0xCB46, 0xCB47, 0xCB48, 0xCB49, 0xCB4A, 0xCB4B, 0xCB4C, /* 0xA0 */
+ 0xCB4D, 0xCB4E, 0xCB4F, 0xCB50, 0xCB51, 0xCB53, 0xCB54, 0xCB55, /* 0xA0 */
+ 0xCB56, 0xCB57, 0xCB58, 0xCB59, 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5D, /* 0xB0 */
+ 0xCB61, 0xCB62, 0xCB63, 0xCB64, 0xCB65, 0xCB66, 0xCB67, 0xCB68, /* 0xB0 */
+ 0xCB69, 0xCB6A, 0xCB6B, 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, /* 0xC0 */
+ 0xCB71, 0xCB73, 0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB78, 0xCB79, /* 0xC0 */
+ 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D, 0xCB81, 0xCB82, 0xCB83, 0xCB84, /* 0xD0 */
+ 0xCB85, 0xCB86, 0xCB87, 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, /* 0xD0 */
+ 0xCB8D, 0xCB8E, 0xCB8F, 0xCB90, 0xCB91, 0xCB93, 0xCB94, 0xCB95, /* 0xE0 */
+ 0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9C, 0xCB9D, /* 0xE0 */
+ 0xCBA1, 0xCBA2, 0xCBA3, 0xCBA4, 0xCBA5, 0xCBA6, 0xCBA7, 0xCBA8, /* 0xF0 */
+ 0xCBA9, 0xCBAA, 0xCBAB, 0xCBAC, 0xCBAD, 0xCBAE, 0xCBAF, 0xCBB0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_D3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCBB1, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6, 0xCBB7, 0xCBB8, 0xCBB9, /* 0x00 */
+ 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCC61, 0xCC62, 0xCC63, 0xCC64, /* 0x00 */
+ 0xCC65, 0xCC66, 0xCC67, 0xCC68, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C, /* 0x10 */
+ 0xCC6D, 0xCC6E, 0xCC6F, 0xCC70, 0xCC71, 0xCC73, 0xCC74, 0xCC75, /* 0x10 */
+ 0xCC76, 0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0xCC7C, 0xCC7D, /* 0x20 */
+ 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86, 0xCC87, 0xCC88, /* 0x20 */
+ 0xCC89, 0xCC8A, 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E, 0xCC8F, 0xCC90, /* 0x30 */
+ 0xCC91, 0xCC93, 0xCC94, 0xCC95, 0xCC96, 0xCC97, 0xCC98, 0xCC99, /* 0x30 */
+ 0xCC9A, 0xCC9B, 0xCC9C, 0xCC9D, 0xCCA1, 0xCCA2, 0xCCA3, 0xCCA4, /* 0x40 */
+ 0xCCA5, 0xCCA6, 0xCCA7, 0xCCA8, 0xCCA9, 0xCCAA, 0xCCAB, 0xCCAC, /* 0x40 */
+ 0xCCAD, 0xCCAE, 0xCCAF, 0xCCB0, 0xCCB1, 0xCCB3, 0xCCB4, 0xCCB5, /* 0x50 */
+ 0xCCB6, 0xCCB7, 0xCCB8, 0xCCB9, 0xCCBA, 0xCCBB, 0xCCBC, 0xCCBD, /* 0x50 */
+ 0xCCC1, 0xCCC2, 0xCCC3, 0xCCC4, 0xCCC5, 0xCCC6, 0xCCC7, 0xCCC8, /* 0x60 */
+ 0xCCC9, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF, 0xCCD0, /* 0x60 */
+ 0xCCD1, 0xCCD3, 0xCCD4, 0xCCD5, 0xCCD6, 0xCCD7, 0xCCD8, 0xCCD9, /* 0x70 */
+ 0xCCDA, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCE1, 0xCCE2, 0xCCE3, 0xCCE4, /* 0x70 */
+ 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA, 0xCCEB, 0xCCEC, /* 0x80 */
+ 0xCCED, 0xCCEE, 0xCCEF, 0xCCF0, 0xCCF1, 0xCCF3, 0xCCF4, 0xCCF5, /* 0x80 */
+ 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC, 0xCCFD, /* 0x90 */
+ 0xCD41, 0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, /* 0x90 */
+ 0xCD49, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, 0xCD4F, 0xCD50, /* 0xA0 */
+ 0xCD51, 0xCD53, 0xCD54, 0xCD55, 0xCD56, 0xCD57, 0xCD58, 0xCD59, /* 0xA0 */
+ 0xCD5A, 0xCD5B, 0xCD5C, 0xCD5D, 0xCD61, 0xCD62, 0xCD63, 0xCD64, /* 0xB0 */
+ 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, 0xCD6C, /* 0xB0 */
+ 0xCD6D, 0xCD6E, 0xCD6F, 0xCD70, 0xCD71, 0xCD73, 0xCD74, 0xCD75, /* 0xC0 */
+ 0xCD76, 0xCD77, 0xCD78, 0xCD79, 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, /* 0xC0 */
+ 0xCD81, 0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, 0xCD88, /* 0xD0 */
+ 0xCD89, 0xCD8A, 0xCD8B, 0xCD8C, 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, /* 0xD0 */
+ 0xCD91, 0xCD93, 0xCD94, 0xCD95, 0xCD96, 0xCD97, 0xCD98, 0xCD99, /* 0xE0 */
+ 0xCD9A, 0xCD9B, 0xCD9C, 0xCD9D, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA4, /* 0xE0 */
+ 0xCDA5, 0xCDA6, 0xCDA7, 0xCDA8, 0xCDA9, 0xCDAA, 0xCDAB, 0xCDAC, /* 0xF0 */
+ 0xCDAD, 0xCDAE, 0xCDAF, 0xCDB0, 0xCDB1, 0xCDB3, 0xCDB4, 0xCDB5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_D4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB, 0xCDBC, 0xCDBD, /* 0x00 */
+ 0xCDC1, 0xCDC2, 0xCDC3, 0xCDC4, 0xCDC5, 0xCDC6, 0xCDC7, 0xCDC8, /* 0x00 */
+ 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCC, 0xCDCD, 0xCDCE, 0xCDCF, 0xCDD0, /* 0x10 */
+ 0xCDD1, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6, 0xCDD7, 0xCDD8, 0xCDD9, /* 0x10 */
+ 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDE1, 0xCDE2, 0xCDE3, 0xCDE4, /* 0x20 */
+ 0xCDE5, 0xCDE6, 0xCDE7, 0xCDE8, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDEC, /* 0x20 */
+ 0xCDED, 0xCDEE, 0xCDEF, 0xCDF0, 0xCDF1, 0xCDF3, 0xCDF4, 0xCDF5, /* 0x30 */
+ 0xCDF6, 0xCDF7, 0xCDF8, 0xCDF9, 0xCDFA, 0xCDFB, 0xCDFC, 0xCDFD, /* 0x30 */
+ 0xCE41, 0xCE42, 0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, /* 0x40 */
+ 0xCE49, 0xCE4A, 0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, /* 0x40 */
+ 0xCE51, 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0xCE58, 0xCE59, /* 0x50 */
+ 0xCE5A, 0xCE5B, 0xCE5C, 0xCE5D, 0xCE61, 0xCE62, 0xCE63, 0xCE64, /* 0x50 */
+ 0xCE65, 0xCE66, 0xCE67, 0xCE68, 0xCE69, 0xCE6A, 0xCE6B, 0xCE6C, /* 0x60 */
+ 0xCE6D, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE73, 0xCE74, 0xCE75, /* 0x60 */
+ 0xCE76, 0xCE77, 0xCE78, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7C, 0xCE7D, /* 0x70 */
+ 0xCE81, 0xCE82, 0xCE83, 0xCE84, 0xCE85, 0xCE86, 0xCE87, 0xCE88, /* 0x70 */
+ 0xCE89, 0xCE8A, 0xCE8B, 0xCE8C, 0xCE8D, 0xCE8E, 0xCE8F, 0xCE90, /* 0x80 */
+ 0xCE91, 0xCE93, 0xCE94, 0xCE95, 0xCE96, 0xCE97, 0xCE98, 0xCE99, /* 0x80 */
+ 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCEA1, 0xCEA2, 0xCEA3, 0xCEA4, /* 0x90 */
+ 0xCEA5, 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAC, /* 0x90 */
+ 0xCEAD, 0xCEAE, 0xCEAF, 0xCEB0, 0xCEB1, 0xCEB3, 0xCEB4, 0xCEB5, /* 0xA0 */
+ 0xCEB6, 0xCEB7, 0xCEB8, 0xCEB9, 0xCEBA, 0xCEBB, 0xCEBC, 0xCEBD, /* 0xA0 */
+ 0xCEC1, 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0xCEC8, /* 0xB0 */
+ 0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, 0xCED0, /* 0xB0 */
+ 0xCED1, 0xCED3, 0xCED4, 0xCED5, 0xCED6, 0xCED7, 0xCED8, 0xCED9, /* 0xC0 */
+ 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, 0xCEE1, 0xCEE2, 0xCEE3, 0xCEE4, /* 0xC0 */
+ 0xCEE5, 0xCEE6, 0xCEE7, 0xCEE8, 0xCEE9, 0xCEEA, 0xCEEB, 0xCEEC, /* 0xD0 */
+ 0xCEED, 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF3, 0xCEF4, 0xCEF5, /* 0xD0 */
+ 0xCEF6, 0xCEF7, 0xCEF8, 0xCEF9, 0xCEFA, 0xCEFB, 0xCEFC, 0xCEFD, /* 0xE0 */
+ 0xCF41, 0xCF42, 0xCF43, 0xCF44, 0xCF45, 0xCF46, 0xCF47, 0xCF48, /* 0xE0 */
+ 0xCF49, 0xCF4A, 0xCF4B, 0xCF4C, 0xCF4D, 0xCF4E, 0xCF4F, 0xCF50, /* 0xF0 */
+ 0xCF51, 0xCF53, 0xCF54, 0xCF55, 0xCF56, 0xCF57, 0xCF58, 0xCF59 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_D5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCF5A, 0xCF5B, 0xCF5C, 0xCF5D, 0xCF61, 0xCF62, 0xCF63, 0xCF64, /* 0x00 */
+ 0xCF65, 0xCF66, 0xCF67, 0xCF68, 0xCF69, 0xCF6A, 0xCF6B, 0xCF6C, /* 0x00 */
+ 0xCF6D, 0xCF6E, 0xCF6F, 0xCF70, 0xCF71, 0xCF73, 0xCF74, 0xCF75, /* 0x10 */
+ 0xCF76, 0xCF77, 0xCF78, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, /* 0x10 */
+ 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF85, 0xCF86, 0xCF87, 0xCF88, /* 0x20 */
+ 0xCF89, 0xCF8A, 0xCF8B, 0xCF8C, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, /* 0x20 */
+ 0xCF91, 0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, /* 0x30 */
+ 0xCF9A, 0xCF9B, 0xCF9C, 0xCF9D, 0xCFA1, 0xCFA2, 0xCFA3, 0xCFA4, /* 0x30 */
+ 0xCFA5, 0xCFA6, 0xCFA7, 0xCFA8, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC, /* 0x40 */
+ 0xCFAD, 0xCFAE, 0xCFAF, 0xCFB0, 0xCFB1, 0xCFB3, 0xCFB4, 0xCFB5, /* 0x40 */
+ 0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD, /* 0x50 */
+ 0xD061, 0xD062, 0xD063, 0xD064, 0xD065, 0xD066, 0xD067, 0xD068, /* 0x50 */
+ 0xD069, 0xD06A, 0xD06B, 0xD06C, 0xD06D, 0xD06E, 0xD06F, 0xD070, /* 0x60 */
+ 0xD071, 0xD073, 0xD074, 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, /* 0x60 */
+ 0xD07A, 0xD07B, 0xD07C, 0xD07D, 0xD081, 0xD082, 0xD083, 0xD084, /* 0x70 */
+ 0xD085, 0xD086, 0xD087, 0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, /* 0x70 */
+ 0xD08D, 0xD08E, 0xD08F, 0xD090, 0xD091, 0xD093, 0xD094, 0xD095, /* 0x80 */
+ 0xD096, 0xD097, 0xD098, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, /* 0x80 */
+ 0xD0A1, 0xD0A2, 0xD0A3, 0xD0A4, 0xD0A5, 0xD0A6, 0xD0A7, 0xD0A8, /* 0x90 */
+ 0xD0A9, 0xD0AA, 0xD0AB, 0xD0AC, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, /* 0x90 */
+ 0xD0B1, 0xD0B3, 0xD0B4, 0xD0B5, 0xD0B6, 0xD0B7, 0xD0B8, 0xD0B9, /* 0xA0 */
+ 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0C1, 0xD0C2, 0xD0C3, 0xD0C4, /* 0xA0 */
+ 0xD0C5, 0xD0C6, 0xD0C7, 0xD0C8, 0xD0C9, 0xD0CA, 0xD0CB, 0xD0CC, /* 0xB0 */
+ 0xD0CD, 0xD0CE, 0xD0CF, 0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, /* 0xB0 */
+ 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9, 0xD0DA, 0xD0DB, 0xD0DC, 0xD0DD, /* 0xC0 */
+ 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E4, 0xD0E5, 0xD0E6, 0xD0E7, 0xD0E8, /* 0xC0 */
+ 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EC, 0xD0ED, 0xD0EE, 0xD0EF, 0xD0F0, /* 0xD0 */
+ 0xD0F1, 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F8, 0xD0F9, /* 0xD0 */
+ 0xD0FA, 0xD0FB, 0xD0FC, 0xD0FD, 0xD141, 0xD142, 0xD143, 0xD144, /* 0xE0 */
+ 0xD145, 0xD146, 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14C, /* 0xE0 */
+ 0xD14D, 0xD14E, 0xD14F, 0xD150, 0xD151, 0xD153, 0xD154, 0xD155, /* 0xF0 */
+ 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A, 0xD15B, 0xD15C, 0xD15D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_D6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD161, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166, 0xD167, 0xD168, /* 0x00 */
+ 0xD169, 0xD16A, 0xD16B, 0xD16C, 0xD16D, 0xD16E, 0xD16F, 0xD170, /* 0x00 */
+ 0xD171, 0xD173, 0xD174, 0xD175, 0xD176, 0xD177, 0xD178, 0xD179, /* 0x10 */
+ 0xD17A, 0xD17B, 0xD17C, 0xD17D, 0xD181, 0xD182, 0xD183, 0xD184, /* 0x10 */
+ 0xD185, 0xD186, 0xD187, 0xD188, 0xD189, 0xD18A, 0xD18B, 0xD18C, /* 0x20 */
+ 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD193, 0xD194, 0xD195, /* 0x20 */
+ 0xD196, 0xD197, 0xD198, 0xD199, 0xD19A, 0xD19B, 0xD19C, 0xD19D, /* 0x30 */
+ 0xD1A1, 0xD1A2, 0xD1A3, 0xD1A4, 0xD1A5, 0xD1A6, 0xD1A7, 0xD1A8, /* 0x30 */
+ 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF, 0xD1B0, /* 0x40 */
+ 0xD1B1, 0xD1B3, 0xD1B4, 0xD1B5, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, /* 0x40 */
+ 0xD1BA, 0xD1BB, 0xD1BC, 0xD1BD, 0xD1C1, 0xD1C2, 0xD1C3, 0xD1C4, /* 0x50 */
+ 0xD1C5, 0xD1C6, 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, 0xD1CB, 0xD1CC, /* 0x50 */
+ 0xD1CD, 0xD1CE, 0xD1CF, 0xD1D0, 0xD1D1, 0xD1D3, 0xD1D4, 0xD1D5, /* 0x60 */
+ 0xD1D6, 0xD1D7, 0xD1D8, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, /* 0x60 */
+ 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, 0xD1E7, 0xD1E8, /* 0x70 */
+ 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF, 0xD1F0, /* 0x70 */
+ 0xD1F1, 0xD1F3, 0xD1F4, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F8, 0xD1F9, /* 0x80 */
+ 0xD1FA, 0xD1FB, 0xD1FC, 0xD1FD, 0xD241, 0xD242, 0xD243, 0xD244, /* 0x80 */
+ 0xD245, 0xD246, 0xD247, 0xD248, 0xD249, 0xD24A, 0xD24B, 0xD24C, /* 0x90 */
+ 0xD24D, 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD253, 0xD254, 0xD255, /* 0x90 */
+ 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25C, 0xD25D, /* 0xA0 */
+ 0xD261, 0xD262, 0xD263, 0xD264, 0xD265, 0xD266, 0xD267, 0xD268, /* 0xA0 */
+ 0xD269, 0xD26A, 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F, 0xD270, /* 0xB0 */
+ 0xD271, 0xD273, 0xD274, 0xD275, 0xD276, 0xD277, 0xD278, 0xD279, /* 0xB0 */
+ 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD281, 0xD282, 0xD283, 0xD284, /* 0xC0 */
+ 0xD285, 0xD286, 0xD287, 0xD288, 0xD289, 0xD28A, 0xD28B, 0xD28C, /* 0xC0 */
+ 0xD28D, 0xD28E, 0xD28F, 0xD290, 0xD291, 0xD293, 0xD294, 0xD295, /* 0xD0 */
+ 0xD296, 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29C, 0xD29D, /* 0xD0 */
+ 0xD2A1, 0xD2A2, 0xD2A3, 0xD2A4, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, /* 0xE0 */
+ 0xD2A9, 0xD2AA, 0xD2AB, 0xD2AC, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, /* 0xE0 */
+ 0xD2B1, 0xD2B3, 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2B8, 0xD2B9, /* 0xF0 */
+ 0xD2BA, 0xD2BB, 0xD2BC, 0xD2BD, 0xD2C1, 0xD2C2, 0xD2C3, 0xD2C4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_D7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2C5, 0xD2C6, 0xD2C7, 0xD2C8, 0xD2C9, 0xD2CA, 0xD2CB, 0xD2CC, /* 0x00 */
+ 0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D3, 0xD2D4, 0xD2D5, /* 0x00 */
+ 0xD2D6, 0xD2D7, 0xD2D8, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DC, 0xD2DD, /* 0x10 */
+ 0xD2E1, 0xD2E2, 0xD2E3, 0xD2E4, 0xD2E5, 0xD2E6, 0xD2E7, 0xD2E8, /* 0x10 */
+ 0xD2E9, 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0xD2F0, /* 0x20 */
+ 0xD2F1, 0xD2F3, 0xD2F4, 0xD2F5, 0xD2F6, 0xD2F7, 0xD2F8, 0xD2F9, /* 0x20 */
+ 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD, 0xD341, 0xD342, 0xD343, 0xD344, /* 0x30 */
+ 0xD345, 0xD346, 0xD347, 0xD348, 0xD349, 0xD34A, 0xD34B, 0xD34C, /* 0x30 */
+ 0xD34D, 0xD34E, 0xD34F, 0xD350, 0xD351, 0xD353, 0xD354, 0xD355, /* 0x40 */
+ 0xD356, 0xD357, 0xD358, 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, /* 0x40 */
+ 0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368, /* 0x50 */
+ 0xD369, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370, /* 0x50 */
+ 0xD371, 0xD373, 0xD374, 0xD375, 0xD376, 0xD377, 0xD378, 0xD379, /* 0x60 */
+ 0xD37A, 0xD37B, 0xD37C, 0xD37D, 0xD381, 0xD382, 0xD383, 0xD384, /* 0x60 */
+ 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38C, /* 0x70 */
+ 0xD38D, 0xD38E, 0xD38F, 0xD390, 0xD391, 0xD393, 0xD394, 0xD395, /* 0x70 */
+ 0xD396, 0xD397, 0xD398, 0xD399, 0xD39A, 0xD39B, 0xD39C, 0xD39D, /* 0x80 */
+ 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5, 0xD3A6, 0xD3A7, 0xD3A8, /* 0x80 */
+ 0xD3A9, 0xD3AA, 0xD3AB, 0xD3AC, 0xD3AD, 0xD3AE, 0xD3AF, 0xD3B0, /* 0x90 */
+ 0xD3B1, 0xD3B3, 0xD3B4, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B8, 0xD3B9, /* 0x90 */
+ 0xD3BA, 0xD3BB, 0xD3BC, 0xD3BD /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE0D0, 0xE0D6, 0xE0E7, 0xE1CF, 0xE1E8, 0xE23D, 0xE2FB, 0xE332, /* 0x00 */
+ 0xE348, 0xE360, 0xE36D, 0xE3D4, 0xE3D5, 0xE3D8, 0xE3DB, 0xE3DC, /* 0x00 */
+ 0xE3DD, 0xE3DE, 0xE3DF, 0xE3E0, 0xE3E2, 0xE3E3, 0xE3E4, 0xE3E5, /* 0x10 */
+ 0xE3E6, 0xE3E8, 0xE3E9, 0xE3EA, 0xE3EB, 0xE3ED, 0xE3EF, 0xE3F0, /* 0x10 */
+ 0xE3F2, 0xE3F6, 0xE3FA, 0xE3FC, 0xE3FD, 0xE3FE, 0xE432, 0xE433, /* 0x20 */
+ 0xE437, 0xE438, 0xE439, 0xE43A, 0xE43B, 0xE43D, 0xE442, 0xE44E, /* 0x20 */
+ 0xE452, 0xE453, 0xE454, 0xE456, 0xE457, 0xE458, 0xE459, 0xE45A, /* 0x30 */
+ 0xE45B, 0xE45D, 0xE45E, 0xE45F, 0xE460, 0xE461, 0xE462, 0xE463, /* 0x30 */
+ 0xE464, 0xE465, 0xE466, 0xE467, 0xE469, 0xE46A, 0xE46E, 0xE46F, /* 0x40 */
+ 0xE471, 0xE472, 0xE474, 0xE475, 0xE476, 0xE477, 0xE478, 0xE479, /* 0x40 */
+ 0xE47A, 0xE47B, 0xE492, 0xE493, 0xE494, 0xE495, 0xE496, 0xE497, /* 0x50 */
+ 0xE499, 0xE49A, 0xE576, 0xE59E, 0xE5A5, 0xE5AB, 0xE5AE, 0xE648, /* 0x50 */
+ 0xE65D, 0xE6CB, 0xE6E4, 0xE8C5, 0xE8E4, 0xE935, 0xE9A5, 0xE9D5, /* 0x60 */
+ 0xE9F4, 0xEA9E, 0xEAA0, 0xEAB3, 0xEAE1, 0xEAE8, 0xEB93, 0xEBAD, /* 0x60 */
+ 0xEBED, 0xECF5, 0xED31, 0xED39, 0xEDAE, 0xEDB1, 0xEDB2, 0xEDB9, /* 0x70 */
+ 0xEDBB, 0xEDBC, 0xEDC4, 0xEDCE, 0xEDD0, 0xEDD2, 0xEDD6, 0xEDFA, /* 0x70 */
+ 0xEDFB, 0xEDFC, 0xEDFE, 0xEE31, 0xEE34, 0xEE37, 0xEE3D, 0xEE3F, /* 0x80 */
+ 0xEE40, 0xEE41, 0xEE43, 0xEE47, 0xEE48, 0xEE4C, 0xEE54, 0xEE56, /* 0x80 */
+ 0xEE57, 0xEE5A, 0xEE62, 0xEE66, 0xEE69, 0xEE6C, 0xEE6F, 0xEE71, /* 0x90 */
+ 0xEE74, 0xEE75, 0xEE76, 0xEE78, 0xEE7A, 0xEE7B, 0xEE7C, 0xEE91, /* 0x90 */
+ 0xEE93, 0xEE94, 0xEE97, 0xEE98, 0xEE99, 0xEE9B, 0xEEA1, 0xEEA6, /* 0xA0 */
+ 0xEEA9, 0xEEAA, 0xEEAC, 0xEEAD, 0xEEB0, 0xEEBF, 0xEEC1, 0xEEC6, /* 0xA0 */
+ 0xEEC7, 0xEECB, 0xEECD, 0xEECF, 0xEED0, 0xEED3, 0xEEDF, 0xEEE4, /* 0xB0 */
+ 0xEEE6, 0xEEF7, 0xEF77, 0xEF78, 0xEF92, 0xEF93, 0xEF99, 0xEF9B, /* 0xB0 */
+ 0xEF9D, 0xEFA0, 0xEFA7, 0xEFAC, 0xEFCC, 0xEFF7, 0xF051, 0xF075, /* 0xC0 */
+ 0xF096, 0xF099, 0xF09E, 0xF0A0, 0xF0A4, 0xF0A7, 0xF0A9, 0xF0AA, /* 0xC0 */
+ 0xF0BA, 0xF0BB, 0xF0BD, 0xF0C1, 0xF0C2, 0xF0C6, 0xF0C7, 0xF0CC, /* 0xD0 */
+ 0xF0CF, 0xF0D0, 0xF0D1, 0xF0D2, 0xF0D8, 0xF136, 0xF137, 0xF13A, /* 0xD0 */
+ 0xF13F, 0xF140, 0xF141, 0xF142, 0xF145, 0xF148, 0xF14A, 0xF150, /* 0xE0 */
+ 0xF151, 0xF155, 0xF156, 0xF159, 0xF15A, 0xF165, 0xF16D, 0xF16E, /* 0xE0 */
+ 0xF171, 0xF174, 0xF177, 0xF178, 0xF199, 0xF19A, 0xF19C, 0xF1A1, /* 0xF0 */
+ 0xF1A2, 0xF1A3, 0xF1EE, 0xF26B, 0xF44D, 0xF49C, 0xF4B1, 0xF537 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_FA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF57E, 0xF696, 0xF698, 0xF6B8, 0xF6C8, 0xF6D3, 0xF76B, 0xF792, /* 0x00 */
+ 0xF831, 0xF832, 0xF876, 0xF939 /* 0x00 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_JOHAB_FF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDA31, 0xDA32, 0xDA33, 0xDA34, 0xDA35, 0xDA36, 0xDA37, /* 0x00 */
+ 0xDA38, 0xDA39, 0xDA3A, 0xDA3B, 0xDA3C, 0xDA3D, 0xDA3E, 0xDA3F, /* 0x00 */
+ 0xDA40, 0xDA41, 0xDA42, 0xDA43, 0xDA44, 0xDA45, 0xDA46, 0xDA47, /* 0x10 */
+ 0xDA48, 0xDA49, 0xDA4A, 0xDA4B, 0xDA4C, 0xDA4D, 0xDA4E, 0xDA4F, /* 0x10 */
+ 0xDA50, 0xDA51, 0xDA52, 0xDA53, 0xDA54, 0xDA55, 0xDA56, 0xDA57, /* 0x20 */
+ 0xDA58, 0xDA59, 0xDA5A, 0xDA5B, 0xDA5C, 0xDA5D, 0xDA5E, 0xDA5F, /* 0x20 */
+ 0xDA60, 0xDA61, 0xDA62, 0xDA63, 0xDA64, 0xDA65, 0xDA66, 0xDA67, /* 0x30 */
+ 0xDA68, 0xDA69, 0xDA6A, 0xDA6B, 0xD93C, 0xDA6D, 0xDA6E, 0xDA6F, /* 0x30 */
+ 0xDA70, 0xDA71, 0xDA72, 0xDA73, 0xDA74, 0xDA75, 0xDA76, 0xDA77, /* 0x40 */
+ 0xDA78, 0xDA79, 0xDA7A, 0xDA7B, 0xDA7C, 0xDA7D, 0xDA7E, 0xDA91, /* 0x40 */
+ 0xDA92, 0xDA93, 0xDA94, 0xDA95, 0xDA96, 0xDA97, 0xDA98, 0xDA99, /* 0x50 */
+ 0xDA9A, 0xDA9B, 0xDA9C, 0xDA9D, 0xDA9E, 0xDA9F, 0xD9A6, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xD95B, 0xD95C, 0xD9A0, 0xDAA0, 0, 0xD95D, 0xDA6C /* 0xE0 */
+};
+
diff --git a/sal/textenc/tcvtkr6.tab b/sal/textenc/tcvtkr6.tab
new file mode 100644
index 000000000000..3b96647086cc
--- /dev/null
+++ b/sal/textenc/tcvtkr6.tab
@@ -0,0 +1,1238 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the information tables for all */
+/* korean charsets: */
+/* CP949, JOHAB */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aKSC5601UniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0, 1, 0, NULL }, /* 0x80 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_81 }, /* 0x81 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_82 }, /* 0x82 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_83 }, /* 0x83 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_84 }, /* 0x84 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_85 }, /* 0x85 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_86 }, /* 0x86 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_87 }, /* 0x87 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_88 }, /* 0x88 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_89 }, /* 0x89 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_8A }, /* 0x8A */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_8B }, /* 0x8B */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_8C }, /* 0x8C */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_8D }, /* 0x8D */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_8E }, /* 0x8E */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_8F }, /* 0x8F */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_90 }, /* 0x90 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_91 }, /* 0x91 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_92 }, /* 0x92 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_93 }, /* 0x93 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_94 }, /* 0x94 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_95 }, /* 0x95 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_96 }, /* 0x96 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_97 }, /* 0x97 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_98 }, /* 0x98 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_99 }, /* 0x99 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_9A }, /* 0x9A */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_9B }, /* 0x9B */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_9C }, /* 0x9C */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_9D }, /* 0x9D */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_9E }, /* 0x9E */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_9F }, /* 0x9F */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_A0 }, /* 0xA0 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_A1 }, /* 0xA1 */
+ { 0, 0x41, 0xE7, aImplDBCSToUniTab_KSC5601_A2 }, /* 0xA2 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_A3 }, /* 0xA3 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_A4 }, /* 0xA4 */
+ { 0, 0x41, 0xF8, aImplDBCSToUniTab_KSC5601_A5 }, /* 0xA5 */
+ { 0, 0x41, 0xE4, aImplDBCSToUniTab_KSC5601_A6 }, /* 0xA6 */
+ { 0, 0x41, 0xEF, aImplDBCSToUniTab_KSC5601_A7 }, /* 0xA7 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_A8 }, /* 0xA8 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_A9 }, /* 0xA9 */
+ { 0, 0x41, 0xF3, aImplDBCSToUniTab_KSC5601_AA }, /* 0xAA */
+ { 0, 0x41, 0xF6, aImplDBCSToUniTab_KSC5601_AB }, /* 0xAB */
+ { 0, 0x41, 0xF1, aImplDBCSToUniTab_KSC5601_AC }, /* 0xAC */
+ { 0, 0x41, 0xA0, aImplDBCSToUniTab_KSC5601_AD }, /* 0xAD */
+ { 0, 0x41, 0xA0, aImplDBCSToUniTab_KSC5601_AE }, /* 0xAE */
+ { 0, 0x41, 0xA0, aImplDBCSToUniTab_KSC5601_AF }, /* 0xAF */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B0 }, /* 0xB0 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B1 }, /* 0xB1 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B2 }, /* 0xB2 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B3 }, /* 0xB3 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B4 }, /* 0xB4 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B5 }, /* 0xB5 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B6 }, /* 0xB6 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B7 }, /* 0xB7 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B8 }, /* 0xB8 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_B9 }, /* 0xB9 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_BA }, /* 0xBA */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_BB }, /* 0xBB */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_BC }, /* 0xBC */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_BD }, /* 0xBD */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_BE }, /* 0xBE */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_BF }, /* 0xBF */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_C0 }, /* 0xC0 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_C1 }, /* 0xC1 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_C2 }, /* 0xC2 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_C3 }, /* 0xC3 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_C4 }, /* 0xC4 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_C5 }, /* 0xC5 */
+ { 0, 0x41, 0xFE, aImplDBCSToUniTab_KSC5601_C6 }, /* 0xC6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_C7 }, /* 0xC7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_C8 }, /* 0xC8 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xC9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_CA }, /* 0xCA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_CB }, /* 0xCB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_CC }, /* 0xCC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_CD }, /* 0xCD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_CE }, /* 0xCE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_CF }, /* 0xCF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D0 }, /* 0xD0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D1 }, /* 0xD1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D2 }, /* 0xD2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D3 }, /* 0xD3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D4 }, /* 0xD4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D5 }, /* 0xD5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D6 }, /* 0xD6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D7 }, /* 0xD7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D8 }, /* 0xD8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_D9 }, /* 0xD9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_DA }, /* 0xDA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_DB }, /* 0xDB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_DC }, /* 0xDC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_DD }, /* 0xDD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_DE }, /* 0xDE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_DF }, /* 0xDF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E0 }, /* 0xE0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E1 }, /* 0xE1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E2 }, /* 0xE2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E3 }, /* 0xE3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E4 }, /* 0xE4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E5 }, /* 0xE5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E6 }, /* 0xE6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E7 }, /* 0xE7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E8 }, /* 0xE8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_E9 }, /* 0xE9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_EA }, /* 0xEA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_EB }, /* 0xEB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_EC }, /* 0xEC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_ED }, /* 0xED */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_EE }, /* 0xEE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_EF }, /* 0xEF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F0 }, /* 0xF0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F1 }, /* 0xF1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F2 }, /* 0xF2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F3 }, /* 0xF3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F4 }, /* 0xF4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F5 }, /* 0xF5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F6 }, /* 0xF6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F7 }, /* 0xF7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F8 }, /* 0xF8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_F9 }, /* 0xF9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_FA }, /* 0xFA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_FB }, /* 0xFB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_FC }, /* 0xFC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_KSC5601_FD }, /* 0xFD */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFE */
+ { 0, 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aKSC5601DBCSHighTab[256] =
+{
+ { 0x00, 0xFE, aImplUniToDBCSTab_KSC5601_00 }, /* 0x00 */
+ { 0x11, 0x67, aImplUniToDBCSTab_KSC5601_01 }, /* 0x01 */
+ { 0xC7, 0xDD, aImplUniToDBCSTab_KSC5601_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_KSC5601_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_KSC5601_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x15, 0xAC, aImplUniToDBCSTab_KSC5601_20 }, /* 0x20 */
+ { 0x03, 0xD4, aImplUniToDBCSTab_KSC5601_21 }, /* 0x21 */
+ { 0x00, 0xA5, aImplUniToDBCSTab_KSC5601_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_KSC5601_23 }, /* 0x23 */
+ { 0x60, 0xE9, aImplUniToDBCSTab_KSC5601_24 }, /* 0x24 */
+ { 0x00, 0xD1, aImplUniToDBCSTab_KSC5601_25 }, /* 0x25 */
+ { 0x05, 0x6D, aImplUniToDBCSTab_KSC5601_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xF7, aImplUniToDBCSTab_KSC5601_30 }, /* 0x30 */
+ { 0x31, 0xFE, aImplUniToDBCSTab_KSC5601_31 }, /* 0x31 */
+ { 0x00, 0x7F, aImplUniToDBCSTab_KSC5601_32 }, /* 0x32 */
+ { 0x80, 0xDD, aImplUniToDBCSTab_KSC5601_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFB, aImplUniToDBCSTab_KSC5601_4E }, /* 0x4E */
+ { 0x01, 0xFA, aImplUniToDBCSTab_KSC5601_4F }, /* 0x4F */
+ { 0x02, 0xFF, aImplUniToDBCSTab_KSC5601_50 }, /* 0x50 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_KSC5601_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_52 }, /* 0x52 */
+ { 0x05, 0xF8, aImplUniToDBCSTab_KSC5601_53 }, /* 0x53 */
+ { 0x03, 0xFA, aImplUniToDBCSTab_KSC5601_54 }, /* 0x54 */
+ { 0x04, 0xFE, aImplUniToDBCSTab_KSC5601_55 }, /* 0x55 */
+ { 0x06, 0xFA, aImplUniToDBCSTab_KSC5601_56 }, /* 0x56 */
+ { 0x03, 0xFC, aImplUniToDBCSTab_KSC5601_57 }, /* 0x57 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_KSC5601_58 }, /* 0x58 */
+ { 0x07, 0xFF, aImplUniToDBCSTab_KSC5601_59 }, /* 0x59 */
+ { 0x01, 0xE9, aImplUniToDBCSTab_KSC5601_5A }, /* 0x5A */
+ { 0x05, 0xFA, aImplUniToDBCSTab_KSC5601_5B }, /* 0x5B */
+ { 0x01, 0xFD, aImplUniToDBCSTab_KSC5601_5C }, /* 0x5C */
+ { 0x07, 0xFE, aImplUniToDBCSTab_KSC5601_5D }, /* 0x5D */
+ { 0x02, 0xFB, aImplUniToDBCSTab_KSC5601_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_KSC5601_5F }, /* 0x5F */
+ { 0x07, 0xFB, aImplUniToDBCSTab_KSC5601_60 }, /* 0x60 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_KSC5601_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_62 }, /* 0x62 */
+ { 0x01, 0xF7, aImplUniToDBCSTab_KSC5601_63 }, /* 0x63 */
+ { 0x0D, 0xFE, aImplUniToDBCSTab_KSC5601_64 }, /* 0x64 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_65 }, /* 0x65 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_KSC5601_66 }, /* 0x66 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_KSC5601_67 }, /* 0x67 */
+ { 0x12, 0xFA, aImplUniToDBCSTab_KSC5601_68 }, /* 0x68 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_69 }, /* 0x69 */
+ { 0x02, 0xFB, aImplUniToDBCSTab_KSC5601_6A }, /* 0x6A */
+ { 0x04, 0xEC, aImplUniToDBCSTab_KSC5601_6B }, /* 0x6B */
+ { 0x08, 0xF3, aImplUniToDBCSTab_KSC5601_6C }, /* 0x6C */
+ { 0x03, 0xFB, aImplUniToDBCSTab_KSC5601_6D }, /* 0x6D */
+ { 0x17, 0xFF, aImplUniToDBCSTab_KSC5601_6E }, /* 0x6E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_KSC5601_6F }, /* 0x6F */
+ { 0x01, 0xFD, aImplUniToDBCSTab_KSC5601_70 }, /* 0x70 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_KSC5601_71 }, /* 0x71 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_KSC5601_72 }, /* 0x72 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_KSC5601_73 }, /* 0x73 */
+ { 0x01, 0xF7, aImplUniToDBCSTab_KSC5601_74 }, /* 0x74 */
+ { 0x01, 0xFC, aImplUniToDBCSTab_KSC5601_75 }, /* 0x75 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_KSC5601_76 }, /* 0x76 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_KSC5601_77 }, /* 0x77 */
+ { 0x02, 0xFB, aImplUniToDBCSTab_KSC5601_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_KSC5601_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_7A }, /* 0x7A */
+ { 0x0F, 0xE9, aImplUniToDBCSTab_KSC5601_7B }, /* 0x7B */
+ { 0x07, 0xFE, aImplUniToDBCSTab_KSC5601_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_KSC5601_7D }, /* 0x7D */
+ { 0x09, 0x9C, aImplUniToDBCSTab_KSC5601_7E }, /* 0x7E */
+ { 0x36, 0xFC, aImplUniToDBCSTab_KSC5601_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_KSC5601_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_KSC5601_81 }, /* 0x81 */
+ { 0x05, 0xFE, aImplUniToDBCSTab_KSC5601_82 }, /* 0x82 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_KSC5601_83 }, /* 0x83 */
+ { 0x03, 0xFC, aImplUniToDBCSTab_KSC5601_84 }, /* 0x84 */
+ { 0x11, 0xFF, aImplUniToDBCSTab_KSC5601_85 }, /* 0x85 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_KSC5601_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_KSC5601_87 }, /* 0x87 */
+ { 0x05, 0xFD, aImplUniToDBCSTab_KSC5601_88 }, /* 0x88 */
+ { 0x07, 0xF8, aImplUniToDBCSTab_KSC5601_89 }, /* 0x89 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_KSC5601_8A }, /* 0x8A */
+ { 0x00, 0x9A, aImplUniToDBCSTab_KSC5601_8B }, /* 0x8B */
+ { 0x37, 0xFD, aImplUniToDBCSTab_KSC5601_8C }, /* 0x8C */
+ { 0x04, 0xFB, aImplUniToDBCSTab_KSC5601_8D }, /* 0x8D */
+ { 0x0A, 0xFE, aImplUniToDBCSTab_KSC5601_8E }, /* 0x8E */
+ { 0x03, 0xFD, aImplUniToDBCSTab_KSC5601_8F }, /* 0x8F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_KSC5601_90 }, /* 0x90 */
+ { 0x02, 0xF5, aImplUniToDBCSTab_KSC5601_91 }, /* 0x91 */
+ { 0x0D, 0xFC, aImplUniToDBCSTab_KSC5601_92 }, /* 0x92 */
+ { 0x04, 0xF6, aImplUniToDBCSTab_KSC5601_93 }, /* 0x93 */
+ { 0x04, 0x7F, aImplUniToDBCSTab_KSC5601_94 }, /* 0x94 */
+ { 0x77, 0xE2, aImplUniToDBCSTab_KSC5601_95 }, /* 0x95 */
+ { 0x1C, 0xFB, aImplUniToDBCSTab_KSC5601_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_97 }, /* 0x97 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_KSC5601_98 }, /* 0x98 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_KSC5601_99 }, /* 0x99 */
+ { 0x01, 0xEE, aImplUniToDBCSTab_KSC5601_9A }, /* 0x9A */
+ { 0x1A, 0xE8, aImplUniToDBCSTab_KSC5601_9B }, /* 0x9B */
+ { 0x0D, 0xF6, aImplUniToDBCSTab_KSC5601_9C }, /* 0x9C */
+ { 0x09, 0xFA, aImplUniToDBCSTab_KSC5601_9D }, /* 0x9D */
+ { 0x1A, 0xF4, aImplUniToDBCSTab_KSC5601_9E }, /* 0x9E */
+ { 0x07, 0x9C, aImplUniToDBCSTab_KSC5601_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_AC }, /* 0xAC */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_AD }, /* 0xAD */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_AE }, /* 0xAE */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_AF }, /* 0xAF */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B0 }, /* 0xB0 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B1 }, /* 0xB1 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B2 }, /* 0xB2 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B3 }, /* 0xB3 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B4 }, /* 0xB4 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B5 }, /* 0xB5 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B6 }, /* 0xB6 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B7 }, /* 0xB7 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B8 }, /* 0xB8 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_B9 }, /* 0xB9 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_BA }, /* 0xBA */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_BB }, /* 0xBB */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_BC }, /* 0xBC */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_BD }, /* 0xBD */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_BE }, /* 0xBE */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_BF }, /* 0xBF */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C0 }, /* 0xC0 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C1 }, /* 0xC1 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C2 }, /* 0xC2 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C3 }, /* 0xC3 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C4 }, /* 0xC4 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C5 }, /* 0xC5 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C6 }, /* 0xC6 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C7 }, /* 0xC7 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C8 }, /* 0xC8 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_C9 }, /* 0xC9 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_CA }, /* 0xCA */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_CB }, /* 0xCB */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_CC }, /* 0xCC */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_CD }, /* 0xCD */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_CE }, /* 0xCE */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_CF }, /* 0xCF */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_D0 }, /* 0xD0 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_D1 }, /* 0xD1 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_D2 }, /* 0xD2 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_D3 }, /* 0xD3 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_D4 }, /* 0xD4 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_D5 }, /* 0xD5 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_D6 }, /* 0xD6 */
+ { 0x00, 0xA3, aImplUniToDBCSTab_KSC5601_D7 }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_KSC5601_F9 }, /* 0xF9 */
+ { 0x00, 0x0B, aImplUniToDBCSTab_KSC5601_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 1, 0, NULL }, /* 0xFE */
+ { 0x01, 0xE6, aImplUniToDBCSTab_KSC5601_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* C9A1-C9FE -> E000-E05D */
+/* FEA1-FEFE -> E05E-E0BB */
+
+#define DBCS_EUDC_MS949_COUNT 2
+static ImplDBCSEUDCData const aImplMS949DBCSEUDCTab[DBCS_EUDC_MS949_COUNT] =
+{
+ /* EUDC-Range */
+ /* Lead: C9-C9 */
+ /* Trail: A1-FE */
+ { 0xC9, 0xC9, 0xA1, 0xFE, 0, 0, 0, 0, 1, 0x5E, 0xE000, 0xE05D },
+ /* Lead: FE-FE */
+ /* Trail: A1-FE */
+ { 0xFE, 0xFE, 0xA1, 0xFE, 0, 0, 0, 0, 1, 0x5E, 0xE05E, 0xE0BB }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplKSC5601DBCSCvtData =
+{
+ aKSC5601UniLeadTab,
+ aKSC5601DBCSHighTab,
+ 0xA1, 0xFE,
+ 0xA1, 0xFE,
+ aImplMS949DBCSEUDCTab,
+ DBCS_EUDC_MS949_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplMS949DBCSCvtData =
+{
+ aKSC5601UniLeadTab,
+ aKSC5601DBCSHighTab,
+ 0x00, 0xFF,
+ 0x41, 0xFE,
+ aImplMS949DBCSEUDCTab,
+ DBCS_EUDC_MS949_COUNT
+};
+
+/* ======================================================================= */
+
+static ImplTextEncodingData const aImplEUCKRTextEncodingData
+ = { { &aImplKSC5601DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 129,
+ "euc-kr",
+ "euc-kr",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_KOREAN, pc code page 934, mac encoding 3 */
+
+/* ======================================================================= */
+
+static ImplTextEncodingData const aImplMS949TextEncodingData
+ = { { &aImplMS949DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 129,
+ "euc-kr",
+ "euc-kr",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* WIN/DOS/OS2, SCRIPT_KOREAN, pc code page 934, mac encoding 3 */
+
+/* ======================================================================= */
+
+/* Apple has some extension, which we don't support */
+
+static ImplTextEncodingData const aImplAPPLEKOREANTextEncodingData
+ = { { &aImplMS949DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 129,
+ "euc-kr",
+ "euc-kr",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* MAC, SCRIPT_KOREAN, pc code page 934, mac encoding 3 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aJOHABUniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0x0080, 0, 0, NULL }, /* 0x80 */
+ { 0x0081, 0, 0, NULL }, /* 0x81 */
+ { 0x0082, 0, 0, NULL }, /* 0x82 */
+ { 0x0083, 0, 0, NULL }, /* 0x83 */
+ { 0, 0x44, 0xE1, aImplDBCSToUniTab_JOHAB_84 }, /* 0x84 */
+ { 0, 0x41, 0xE1, aImplDBCSToUniTab_JOHAB_85 }, /* 0x85 */
+ { 0, 0x41, 0xE1, aImplDBCSToUniTab_JOHAB_86 }, /* 0x86 */
+ { 0, 0x41, 0xA1, aImplDBCSToUniTab_JOHAB_87 }, /* 0x87 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_88 }, /* 0x88 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_89 }, /* 0x89 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_8A }, /* 0x8A */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_8B }, /* 0x8B */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_8C }, /* 0x8C */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_8D }, /* 0x8D */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_8E }, /* 0x8E */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_8F }, /* 0x8F */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_90 }, /* 0x90 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_91 }, /* 0x91 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_92 }, /* 0x92 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_93 }, /* 0x93 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_94 }, /* 0x94 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_95 }, /* 0x95 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_96 }, /* 0x96 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_97 }, /* 0x97 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_98 }, /* 0x98 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_99 }, /* 0x99 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_9A }, /* 0x9A */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_9B }, /* 0x9B */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_9C }, /* 0x9C */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_9D }, /* 0x9D */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_9E }, /* 0x9E */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_9F }, /* 0x9F */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_A0 }, /* 0xA0 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_A1 }, /* 0xA1 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_A2 }, /* 0xA2 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_A3 }, /* 0xA3 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_A4 }, /* 0xA4 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_A5 }, /* 0xA5 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_A6 }, /* 0xA6 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_A7 }, /* 0xA7 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_A8 }, /* 0xA8 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_A9 }, /* 0xA9 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_AA }, /* 0xAA */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_AB }, /* 0xAB */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_AC }, /* 0xAC */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_AD }, /* 0xAD */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_AE }, /* 0xAE */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_AF }, /* 0xAF */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_B0 }, /* 0xB0 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_B1 }, /* 0xB1 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_B2 }, /* 0xB2 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_B3 }, /* 0xB3 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_B4 }, /* 0xB4 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_B5 }, /* 0xB5 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_B6 }, /* 0xB6 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_B7 }, /* 0xB7 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_B8 }, /* 0xB8 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_B9 }, /* 0xB9 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_BA }, /* 0xBA */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_BB }, /* 0xBB */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_BC }, /* 0xBC */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_BD }, /* 0xBD */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_BE }, /* 0xBE */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_BF }, /* 0xBF */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_C0 }, /* 0xC0 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_C1 }, /* 0xC1 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_C2 }, /* 0xC2 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_C3 }, /* 0xC3 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_C4 }, /* 0xC4 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_C5 }, /* 0xC5 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_C6 }, /* 0xC6 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_C7 }, /* 0xC7 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_C8 }, /* 0xC8 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_C9 }, /* 0xC9 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_CA }, /* 0xCA */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_CB }, /* 0xCB */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_CC }, /* 0xCC */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_CD }, /* 0xCD */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_CE }, /* 0xCE */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_CF }, /* 0xCF */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_D0 }, /* 0xD0 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_D1 }, /* 0xD1 */
+ { 0, 0x41, 0xFD, aImplDBCSToUniTab_JOHAB_D2 }, /* 0xD2 */
+ { 0, 0x41, 0xBD, aImplDBCSToUniTab_JOHAB_D3 }, /* 0xD3 */
+ { 0, 1, 0, NULL }, /* 0xD4 */
+ { 0, 1, 0, NULL }, /* 0xD5 */
+ { 0, 1, 0, NULL }, /* 0xD6 */
+ { 0, 1, 0, NULL }, /* 0xD7 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xD8 */ /* We convert this as double byte */
+ { 0, 0x31, 0xE5, aImplDBCSToUniTab_JOHAB_D9 }, /* 0xD9 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_DA }, /* 0xDA */
+ { 0, 0x31, 0xE4, aImplDBCSToUniTab_JOHAB_DB }, /* 0xDB */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_DC }, /* 0xDC */
+ { 0, 0x31, 0xF3, aImplDBCSToUniTab_JOHAB_DD }, /* 0xDD */
+ { 0, 0x31, 0xF1, aImplDBCSToUniTab_JOHAB_DE }, /* 0xDE */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xDF */ /* We convert this as double byte */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E0 }, /* 0xE0 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E1 }, /* 0xE1 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E2 }, /* 0xE2 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E3 }, /* 0xE3 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E4 }, /* 0xE4 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E5 }, /* 0xE5 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E6 }, /* 0xE6 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E7 }, /* 0xE7 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E8 }, /* 0xE8 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_E9 }, /* 0xE9 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_EA }, /* 0xEA */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_EB }, /* 0xEB */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_EC }, /* 0xEC */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_ED }, /* 0xED */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_EE }, /* 0xEE */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_EF }, /* 0xEF */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F0 }, /* 0xF0 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F1 }, /* 0xF1 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F2 }, /* 0xF2 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F3 }, /* 0xF3 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F4 }, /* 0xF4 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F5 }, /* 0xF5 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F6 }, /* 0xF6 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F7 }, /* 0xF7 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F8 }, /* 0xF8 */
+ { 0, 0x31, 0xFE, aImplDBCSToUniTab_JOHAB_F9 }, /* 0xF9 */
+ { 0, 1, 0, NULL }, /* 0xFA */
+ { 0, 1, 0, NULL }, /* 0xFB */
+ { 0, 1, 0, NULL }, /* 0xFC */
+ { 0, 1, 0, NULL }, /* 0xFD */
+ { 0, 1, 0, NULL }, /* 0xFE */
+ { 0, 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aJOHABDBCSHighTab[256] =
+{
+ { 0x00, 0xFE, aImplUniToDBCSTab_JOHAB_00 }, /* 0x00 */
+ { 0x11, 0x67, aImplUniToDBCSTab_JOHAB_01 }, /* 0x01 */
+ { 0xC7, 0xDD, aImplUniToDBCSTab_JOHAB_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_JOHAB_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_JOHAB_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x15, 0xA9, aImplUniToDBCSTab_JOHAB_20 }, /* 0x20 */
+ { 0x03, 0xD4, aImplUniToDBCSTab_JOHAB_21 }, /* 0x21 */
+ { 0x00, 0xA5, aImplUniToDBCSTab_JOHAB_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_JOHAB_23 }, /* 0x23 */
+ { 0x60, 0xE9, aImplUniToDBCSTab_JOHAB_24 }, /* 0x24 */
+ { 0x00, 0xD1, aImplUniToDBCSTab_JOHAB_25 }, /* 0x25 */
+ { 0x05, 0x6D, aImplUniToDBCSTab_JOHAB_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xF7, aImplUniToDBCSTab_JOHAB_30 }, /* 0x30 */
+ { 0x31, 0x8E, aImplUniToDBCSTab_JOHAB_31 }, /* 0x31 */
+ { 0x00, 0x7F, aImplUniToDBCSTab_JOHAB_32 }, /* 0x32 */
+ { 0x80, 0xDD, aImplUniToDBCSTab_JOHAB_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFB, aImplUniToDBCSTab_JOHAB_4E }, /* 0x4E */
+ { 0x01, 0xFA, aImplUniToDBCSTab_JOHAB_4F }, /* 0x4F */
+ { 0x02, 0xFF, aImplUniToDBCSTab_JOHAB_50 }, /* 0x50 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JOHAB_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_52 }, /* 0x52 */
+ { 0x05, 0xF8, aImplUniToDBCSTab_JOHAB_53 }, /* 0x53 */
+ { 0x03, 0xFA, aImplUniToDBCSTab_JOHAB_54 }, /* 0x54 */
+ { 0x04, 0xFE, aImplUniToDBCSTab_JOHAB_55 }, /* 0x55 */
+ { 0x06, 0xFA, aImplUniToDBCSTab_JOHAB_56 }, /* 0x56 */
+ { 0x03, 0xFC, aImplUniToDBCSTab_JOHAB_57 }, /* 0x57 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JOHAB_58 }, /* 0x58 */
+ { 0x07, 0xFF, aImplUniToDBCSTab_JOHAB_59 }, /* 0x59 */
+ { 0x01, 0xE9, aImplUniToDBCSTab_JOHAB_5A }, /* 0x5A */
+ { 0x05, 0xFA, aImplUniToDBCSTab_JOHAB_5B }, /* 0x5B */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JOHAB_5C }, /* 0x5C */
+ { 0x07, 0xFE, aImplUniToDBCSTab_JOHAB_5D }, /* 0x5D */
+ { 0x02, 0xFB, aImplUniToDBCSTab_JOHAB_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_JOHAB_5F }, /* 0x5F */
+ { 0x07, 0xFB, aImplUniToDBCSTab_JOHAB_60 }, /* 0x60 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_JOHAB_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_62 }, /* 0x62 */
+ { 0x01, 0xF7, aImplUniToDBCSTab_JOHAB_63 }, /* 0x63 */
+ { 0x0D, 0xFE, aImplUniToDBCSTab_JOHAB_64 }, /* 0x64 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_65 }, /* 0x65 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_JOHAB_66 }, /* 0x66 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JOHAB_67 }, /* 0x67 */
+ { 0x12, 0xFA, aImplUniToDBCSTab_JOHAB_68 }, /* 0x68 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_69 }, /* 0x69 */
+ { 0x02, 0xFB, aImplUniToDBCSTab_JOHAB_6A }, /* 0x6A */
+ { 0x04, 0xEC, aImplUniToDBCSTab_JOHAB_6B }, /* 0x6B */
+ { 0x08, 0xF3, aImplUniToDBCSTab_JOHAB_6C }, /* 0x6C */
+ { 0x03, 0xFB, aImplUniToDBCSTab_JOHAB_6D }, /* 0x6D */
+ { 0x17, 0xFF, aImplUniToDBCSTab_JOHAB_6E }, /* 0x6E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_JOHAB_6F }, /* 0x6F */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JOHAB_70 }, /* 0x70 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_JOHAB_71 }, /* 0x71 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JOHAB_72 }, /* 0x72 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_JOHAB_73 }, /* 0x73 */
+ { 0x01, 0xF7, aImplUniToDBCSTab_JOHAB_74 }, /* 0x74 */
+ { 0x01, 0xFC, aImplUniToDBCSTab_JOHAB_75 }, /* 0x75 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JOHAB_76 }, /* 0x76 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_JOHAB_77 }, /* 0x77 */
+ { 0x02, 0xFB, aImplUniToDBCSTab_JOHAB_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_JOHAB_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_7A }, /* 0x7A */
+ { 0x0F, 0xE9, aImplUniToDBCSTab_JOHAB_7B }, /* 0x7B */
+ { 0x07, 0xFE, aImplUniToDBCSTab_JOHAB_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_JOHAB_7D }, /* 0x7D */
+ { 0x09, 0x9C, aImplUniToDBCSTab_JOHAB_7E }, /* 0x7E */
+ { 0x36, 0xFC, aImplUniToDBCSTab_JOHAB_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JOHAB_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_JOHAB_81 }, /* 0x81 */
+ { 0x05, 0xFE, aImplUniToDBCSTab_JOHAB_82 }, /* 0x82 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_JOHAB_83 }, /* 0x83 */
+ { 0x03, 0xFC, aImplUniToDBCSTab_JOHAB_84 }, /* 0x84 */
+ { 0x11, 0xFF, aImplUniToDBCSTab_JOHAB_85 }, /* 0x85 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_JOHAB_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JOHAB_87 }, /* 0x87 */
+ { 0x05, 0xFD, aImplUniToDBCSTab_JOHAB_88 }, /* 0x88 */
+ { 0x07, 0xF8, aImplUniToDBCSTab_JOHAB_89 }, /* 0x89 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JOHAB_8A }, /* 0x8A */
+ { 0x00, 0x9A, aImplUniToDBCSTab_JOHAB_8B }, /* 0x8B */
+ { 0x37, 0xFD, aImplUniToDBCSTab_JOHAB_8C }, /* 0x8C */
+ { 0x04, 0xFB, aImplUniToDBCSTab_JOHAB_8D }, /* 0x8D */
+ { 0x0A, 0xFE, aImplUniToDBCSTab_JOHAB_8E }, /* 0x8E */
+ { 0x03, 0xFD, aImplUniToDBCSTab_JOHAB_8F }, /* 0x8F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_JOHAB_90 }, /* 0x90 */
+ { 0x02, 0xF5, aImplUniToDBCSTab_JOHAB_91 }, /* 0x91 */
+ { 0x0D, 0xFC, aImplUniToDBCSTab_JOHAB_92 }, /* 0x92 */
+ { 0x04, 0xF6, aImplUniToDBCSTab_JOHAB_93 }, /* 0x93 */
+ { 0x04, 0x7F, aImplUniToDBCSTab_JOHAB_94 }, /* 0x94 */
+ { 0x77, 0xE2, aImplUniToDBCSTab_JOHAB_95 }, /* 0x95 */
+ { 0x1C, 0xFB, aImplUniToDBCSTab_JOHAB_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_97 }, /* 0x97 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_JOHAB_98 }, /* 0x98 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_JOHAB_99 }, /* 0x99 */
+ { 0x01, 0xEE, aImplUniToDBCSTab_JOHAB_9A }, /* 0x9A */
+ { 0x1A, 0xE8, aImplUniToDBCSTab_JOHAB_9B }, /* 0x9B */
+ { 0x0D, 0xF6, aImplUniToDBCSTab_JOHAB_9C }, /* 0x9C */
+ { 0x09, 0xFA, aImplUniToDBCSTab_JOHAB_9D }, /* 0x9D */
+ { 0x1A, 0xF4, aImplUniToDBCSTab_JOHAB_9E }, /* 0x9E */
+ { 0x07, 0x9C, aImplUniToDBCSTab_JOHAB_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_AC }, /* 0xAC */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_AD }, /* 0xAD */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_AE }, /* 0xAE */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_AF }, /* 0xAF */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B0 }, /* 0xB0 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B1 }, /* 0xB1 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B2 }, /* 0xB2 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B3 }, /* 0xB3 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B4 }, /* 0xB4 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B5 }, /* 0xB5 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B6 }, /* 0xB6 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B7 }, /* 0xB7 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B8 }, /* 0xB8 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_B9 }, /* 0xB9 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_BA }, /* 0xBA */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_BB }, /* 0xBB */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_BC }, /* 0xBC */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_BD }, /* 0xBD */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_BE }, /* 0xBE */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_BF }, /* 0xBF */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C0 }, /* 0xC0 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C1 }, /* 0xC1 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C2 }, /* 0xC2 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C3 }, /* 0xC3 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C4 }, /* 0xC4 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C5 }, /* 0xC5 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C6 }, /* 0xC6 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C7 }, /* 0xC7 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C8 }, /* 0xC8 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_C9 }, /* 0xC9 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_CA }, /* 0xCA */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_CB }, /* 0xCB */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_CC }, /* 0xCC */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_CD }, /* 0xCD */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_CE }, /* 0xCE */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_CF }, /* 0xCF */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_D0 }, /* 0xD0 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_D1 }, /* 0xD1 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_D2 }, /* 0xD2 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_D3 }, /* 0xD3 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_D4 }, /* 0xD4 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_D5 }, /* 0xD5 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_D6 }, /* 0xD6 */
+ { 0x00, 0xA3, aImplUniToDBCSTab_JOHAB_D7 }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_JOHAB_F9 }, /* 0xF9 */
+ { 0x00, 0x0B, aImplUniToDBCSTab_JOHAB_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 1, 0, NULL }, /* 0xFE */
+ { 0x01, 0xE6, aImplUniToDBCSTab_JOHAB_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* D831-D87E -> E000-E05D */
+/* D891-D8FE -> E05E-E0BB */
+
+#define DBCS_EUDC_MS1361_COUNT 2
+static ImplDBCSEUDCData const aImplMS1361DBCSEUDCTab[DBCS_EUDC_MS1361_COUNT] =
+{
+ /* EUDC-Range */
+ /* Lead: D8-D8 */
+ /* Trail: 31-7E */
+ { 0xD8, 0xD8, 0x31, 0x7E, 0, 0, 0, 0, 1, 0x5D, 0xE000, 0xE05D },
+ /* Lead: D8-D8 */
+ /* Trail: 91-FE */
+ { 0xD8, 0xD8, 0x91, 0xFE, 0, 0, 0, 0, 1, 0x5D, 0xE05E, 0xE0BB }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplJOHABDBCSCvtData =
+{
+ aJOHABUniLeadTab,
+ aJOHABDBCSHighTab,
+ 0x00, 0xFF,
+ 0x31, 0xFE,
+ aImplMS1361DBCSEUDCTab,
+ DBCS_EUDC_MS1361_COUNT
+};
+
+/* ======================================================================= */
+
+static ImplTextEncodingData const aImplMS1361TextEncodingData
+ = { { &aImplJOHABDBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 130,
+ "euc-kr",
+ "euc-kr",
+ RTL_TEXTENCODING_INFO_MULTIBYTE | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_KOREAN, pc code page 1361, mac encoding 3 */
diff --git a/sal/textenc/tcvtlat1.tab b/sal/textenc/tcvtlat1.tab
new file mode 100644
index 000000000000..6e8e55cf1d65
--- /dev/null
+++ b/sal/textenc/tcvtlat1.tab
@@ -0,0 +1,1775 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the tables for all 1 byte charsets, for the */
+/* following scripts: latin, iceland, nordic */
+
+/* ======================================================================= */
+
+/* IBM-437 */
+/* Dos Latin US - Standard CharSet for Western Script */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp437.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM437UNI_START 0x80
+#define IBM437UNI_END 0xFF
+static sal_uInt16 const aImplIBM437ToUniTab[IBM437UNI_END - IBM437UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, /* 0x80 */
+ 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, /* 0x90 */
+ 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, /* 0x90 */
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, /* 0xA0 */
+ 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* 0xB0 */
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, /* 0xC0 */
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, /* 0xD0 */
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, /* 0xE0 */
+ 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, /* 0xE0 */
+ 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM437CHAR_START 0x00A0
+#define IBM437CHAR_END 0x00FF
+static sal_uChar const aImplIBM437ToCharTab[IBM437CHAR_END - IBM437CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF, 0xAD, 0x9B, 0x9C, 0, 0x9D, 0, 0, /* 0x00A0 */
+ 0, 0, 0xA6, 0xAE, 0xAA, 0, 0, 0, /* 0x00A0 */
+ 0xF8, 0xF1, 0xFD, 0, 0, 0xE6, 0, 0xFA, /* 0x00B0 */
+ 0, 0, 0xA7, 0xAF, 0xAC, 0xAB, 0, 0xA8, /* 0x00B0 */
+ 0, 0, 0, 0, 0x8E, 0x8F, 0x92, 0x80, /* 0x00C0 */
+ 0, 0x90, 0, 0, 0, 0, 0, 0, /* 0x00C0 */
+ 0, 0xA5, 0, 0, 0, 0, 0x99, 0, /* 0x00D0 */
+ 0, 0, 0, 0, 0x9A, 0, 0, 0xE1, /* 0x00D0 */
+ 0x85, 0xA0, 0x83, 0, 0x84, 0x86, 0x91, 0x87, /* 0x00E0 */
+ 0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, /* 0x00E0 */
+ 0, 0xA4, 0x95, 0xA2, 0x93, 0, 0x94, 0xF6, /* 0x00F0 */
+ 0, 0x97, 0xA3, 0x96, 0x81, 0, 0, 0x98 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM437TOCHARTABEX_COUNT 75
+static ImplUniCharTabData const aImplIBM437ToCharTabEx[IBM437TOCHARTABEX_COUNT] =
+{
+ { 0x0192, 0x9F, 0 },
+ { 0x0393, 0xE2, 0 },
+ { 0x0398, 0xE9, 0 },
+ { 0x03A3, 0xE4, 0 },
+ { 0x03A6, 0xE8, 0 },
+ { 0x03A9, 0xEA, 0 },
+ { 0x03B1, 0xE0, 0 },
+ { 0x03B4, 0xEB, 0 },
+ { 0x03B5, 0xEE, 0 },
+ { 0x03C0, 0xE3, 0 },
+ { 0x03C3, 0xE5, 0 },
+ { 0x03C4, 0xE7, 0 },
+ { 0x03C6, 0xED, 0 },
+ { 0x207F, 0xFC, 0 },
+ { 0x20A7, 0x9E, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x221A, 0xFB, 0 },
+ { 0x221E, 0xEC, 0 },
+ { 0x2229, 0xEF, 0 },
+ { 0x2248, 0xF7, 0 },
+ { 0x2261, 0xF0, 0 },
+ { 0x2264, 0xF3, 0 },
+ { 0x2265, 0xF2, 0 },
+ { 0x2310, 0xA9, 0 },
+ { 0x2320, 0xF4, 0 },
+ { 0x2321, 0xF5, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2552, 0xD5, 0 },
+ { 0x2553, 0xD6, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2555, 0xB8, 0 },
+ { 0x2556, 0xB7, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x2558, 0xD4, 0 },
+ { 0x2559, 0xD3, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255B, 0xBE, 0 },
+ { 0x255C, 0xBD, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x255E, 0xC6, 0 },
+ { 0x255F, 0xC7, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2561, 0xB5, 0 },
+ { 0x2562, 0xB6, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2564, 0xD1, 0 },
+ { 0x2565, 0xD2, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2567, 0xCF, 0 },
+ { 0x2568, 0xD0, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256A, 0xD8, 0 },
+ { 0x256B, 0xD7, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM437ByteCvtData =
+{
+ aImplIBM437ToUniTab,
+ NULL,
+ IBM437UNI_START, IBM437UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM437ToCharTab,
+ NULL,
+ aImplIBM437ToCharTabEx,
+ IBM437CHAR_START, IBM437CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM437TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM437TextEncodingData
+ = { { &aImplIBM437ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "ibm437",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* DOS/OS2, SCRIPT_LATIN, pc code page 437 */
+
+/* ======================================================================= */
+
+/* IBM-850 */
+/* Dos Standard CharSet for Western/Europa */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp850.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+/* D5 - geaendert auf EURO SIGN and 0x20AC added to D5 */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM850UNI_START 0x80
+#define IBM850UNI_END 0xFF
+static sal_uInt16 const aImplIBM850ToUniTab[IBM850UNI_END - IBM850UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, /* 0x80 */
+ 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, /* 0x90 */
+ 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, /* 0x90 */
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, /* 0xA0 */
+ 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, /* 0xB0 */
+ 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, /* 0xC0 */
+ 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, /* 0xD0 */
+ 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, /* 0xD0 */
+ 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, /* 0xE0 */
+ 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, /* 0xE0 */
+ 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, /* 0xF0 */
+ 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM850CHAR_START 0x00A0
+#define IBM850CHAR_END 0x00FF
+static sal_uChar const aImplIBM850ToCharTab[IBM850CHAR_END - IBM850CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF, 0xAD, 0xBD, 0x9C, 0xCF, 0xBE, 0xDD, 0xF5, /* 0x00A0 */
+ 0xF9, 0xB8, 0xA6, 0xAE, 0xAA, 0xF0, 0xA9, 0xEE, /* 0x00A0 */
+ 0xF8, 0xF1, 0xFD, 0xFC, 0xEF, 0xE6, 0xF4, 0xFA, /* 0x00B0 */
+ 0xF7, 0xFB, 0xA7, 0xAF, 0xAC, 0xAB, 0xF3, 0xA8, /* 0x00B0 */
+ 0xB7, 0xB5, 0xB6, 0xC7, 0x8E, 0x8F, 0x92, 0x80, /* 0x00C0 */
+ 0xD4, 0x90, 0xD2, 0xD3, 0xDE, 0xD6, 0xD7, 0xD8, /* 0x00C0 */
+ 0xD1, 0xA5, 0xE3, 0xE0, 0xE2, 0xE5, 0x99, 0x9E, /* 0x00D0 */
+ 0x9D, 0xEB, 0xE9, 0xEA, 0x9A, 0xED, 0xE8, 0xE1, /* 0x00D0 */
+ 0x85, 0xA0, 0x83, 0xC6, 0x84, 0x86, 0x91, 0x87, /* 0x00E0 */
+ 0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, /* 0x00E0 */
+ 0xD0, 0xA4, 0x95, 0xA2, 0x93, 0xE4, 0x94, 0xF6, /* 0x00F0 */
+ 0x9B, 0x97, 0xA3, 0x96, 0x81, 0xEC, 0xE7, 0x98 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM850TOCHARTABEX_COUNT 33
+static ImplUniCharTabData const aImplIBM850ToCharTabEx[IBM850TOCHARTABEX_COUNT] =
+{
+ { 0x0131, 0xD5, 0 },
+ { 0x0192, 0x9F, 0 },
+ { 0x2017, 0xF2, 0 },
+ { 0x20AC, 0xD5, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM850ByteCvtData =
+{
+ aImplIBM850ToUniTab,
+ NULL,
+ IBM850UNI_START, IBM850UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM850ToCharTab,
+ NULL,
+ aImplIBM850ToCharTabEx,
+ IBM850CHAR_START, IBM850CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM850TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM850TextEncodingData
+ = { { &aImplIBM850ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "ibm850",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* DOS/OS2, SCRIPT_LATIN, pc code page 850 */
+
+/* ======================================================================= */
+
+/* IBM-860 */
+/* Dos Standard CharSet for Portugiese */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp860.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM860UNI_START 0x80
+#define IBM860UNI_END 0xFF
+static sal_uInt16 const aImplIBM860ToUniTab[IBM860UNI_END - IBM860UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, /* 0x80 */
+ 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, /* 0x80 */
+ 0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, /* 0x90 */
+ 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, /* 0x90 */
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, /* 0xA0 */
+ 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* 0xB0 */
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, /* 0xC0 */
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, /* 0xD0 */
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, /* 0xE0 */
+ 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, /* 0xE0 */
+ 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM860CHAR_START 0x00A0
+#define IBM860CHAR_END 0x00FC
+static sal_uChar const aImplIBM860ToCharTab[IBM860CHAR_END - IBM860CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF, 0xAD, 0x9B, 0x9C, 0 , 0, 0, 0, /* 0x00A0 */
+ 0, 0, 0xA6, 0xAE, 0xAA, 0, 0, 0, /* 0x00A0 */
+ 0xF8, 0xF1, 0xFD, 0, 0, 0xE6, 0, 0xFA, /* 0x00B0 */
+ 0, 0, 0xA7, 0xAF, 0xAC, 0xAB, 0, 0xA8, /* 0x00B0 */
+ 0x91, 0x86, 0x8F, 0x8E, 0, 0, 0, 0x80, /* 0x00C0 */
+ 0x92, 0x90, 0x89, 0, 0x98, 0x8B, 0, 0, /* 0x00C0 */
+ 0, 0xA5, 0xA9, 0x9F, 0x8C, 0x99, 0, 0, /* 0x00D0 */
+ 0, 0x9D, 0x96, 0, 0x9A, 0, 0, 0xE1, /* 0x00D0 */
+ 0x85, 0xA0, 0x83, 0x84, 0, 0, 0, 0x87, /* 0x00E0 */
+ 0x8A, 0x82, 0x88, 0, 0x8D, 0xA1, 0, 0, /* 0x00E0 */
+ 0, 0xA4, 0x95, 0xA2, 0x93, 0x94, 0, 0xF6, /* 0x00F0 */
+ 0, 0x97, 0xA3, 0, 0x81 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM860TOCHARTABEX_COUNT 73
+static ImplUniCharTabData const aImplIBM860ToCharTabEx[IBM860TOCHARTABEX_COUNT] =
+{
+ { 0x0393, 0xE2, 0 },
+ { 0x0398, 0xE9, 0 },
+ { 0x03A3, 0xE4, 0 },
+ { 0x03A6, 0xE8, 0 },
+ { 0x03A9, 0xEA, 0 },
+ { 0x03B1, 0xE0, 0 },
+ { 0x03B4, 0xEB, 0 },
+ { 0x03B5, 0xEE, 0 },
+ { 0x03C0, 0xE3, 0 },
+ { 0x03C3, 0xE5, 0 },
+ { 0x03C4, 0xE7, 0 },
+ { 0x03C6, 0xED, 0 },
+ { 0x207F, 0xFC, 0 },
+ { 0x20A7, 0x9E, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x221A, 0xFB, 0 },
+ { 0x221E, 0xEC, 0 },
+ { 0x2229, 0xEF, 0 },
+ { 0x2248, 0xF7, 0 },
+ { 0x2261, 0xF0, 0 },
+ { 0x2264, 0xF3, 0 },
+ { 0x2265, 0xF2, 0 },
+ { 0x2320, 0xF4, 0 },
+ { 0x2321, 0xF5, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2552, 0xD5, 0 },
+ { 0x2553, 0xD6, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2555, 0xB8, 0 },
+ { 0x2556, 0xB7, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x2558, 0xD4, 0 },
+ { 0x2559, 0xD3, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255B, 0xBE, 0 },
+ { 0x255C, 0xBD, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x255E, 0xC6, 0 },
+ { 0x255F, 0xC7, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2561, 0xB5, 0 },
+ { 0x2562, 0xB6, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2564, 0xD1, 0 },
+ { 0x2565, 0xD2, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2567, 0xCF, 0 },
+ { 0x2568, 0xD0, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256A, 0xD8, 0 },
+ { 0x256B, 0xD7, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM860ByteCvtData =
+{
+ aImplIBM860ToUniTab,
+ NULL,
+ IBM860UNI_START, IBM860UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM860ToCharTab,
+ NULL,
+ aImplIBM860ToCharTabEx,
+ IBM860CHAR_START, IBM860CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM860TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM860TextEncodingData
+ = { { &aImplIBM860ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "IBM860",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* DOS/OS2, SCRIPT_LATIN, pc code page 860 */
+
+/* ======================================================================= */
+
+/* IBM-861 */
+/* Dos Standard CharSet for Icelandic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp861.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM861UNI_START 0x80
+#define IBM861UNI_END 0xFF
+static sal_uInt16 const aImplIBM861ToUniTab[IBM861UNI_END - IBM861UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, /* 0x80 */
+ 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, /* 0x90 */
+ 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, /* 0x90 */
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, /* 0xA0 */
+ 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* 0xB0 */
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, /* 0xC0 */
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, /* 0xD0 */
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, /* 0xE0 */
+ 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, /* 0xE0 */
+ 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM861CHAR_START 0x00A0
+#define IBM861CHAR_END 0x00FE
+static sal_uChar const aImplIBM861ToCharTab[IBM861CHAR_END - IBM861CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF, 0xAD, 0, 0x9C, 0, 0, 0, 0, /* 0x00A0 */
+ 0, 0, 0, 0xAE, 0xAA, 0, 0, 0, /* 0x00A0 */
+ 0xF8, 0xF1, 0xFD, 0, 0, 0xE6, 0, 0xFA, /* 0x00B0 */
+ 0, 0, 0, 0xAF, 0xAC, 0xAB, 0, 0xA8, /* 0x00B0 */
+ 0, 0xA4, 0, 0, 0x8E, 0x8F, 0x92, 0x80, /* 0x00C0 */
+ 0, 0x90, 0, 0, 0, 0xA5, 0, 0, /* 0x00C0 */
+ 0x8B, 0, 0, 0xA6, 0, 0, 0x99, 0, /* 0x00D0 */
+ 0x9D, 0, 0xA7, 0, 0x9A, 0x97, 0x8D, 0xE1, /* 0x00D0 */
+ 0x85, 0xA0, 0x83, 0, 0x84, 0x86, 0x91, 0x87, /* 0x00E0 */
+ 0x8A, 0x82, 0x88, 0x89, 0, 0xA1, 0, 0, /* 0x00E0 */
+ 0x8C, 0, 0, 0xA2, 0x93, 0, 0x94, 0xF6, /* 0x00F0 */
+ 0x9B, 0, 0xA3, 0x96, 0x81, 0x98, 0x95 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM861TOCHARTABEX_COUNT 75
+static ImplUniCharTabData const aImplIBM861ToCharTabEx[IBM861TOCHARTABEX_COUNT] =
+{
+ { 0x0192, 0x9F, 0 },
+ { 0x0393, 0xE2, 0 },
+ { 0x0398, 0xE9, 0 },
+ { 0x03A3, 0xE4, 0 },
+ { 0x03A6, 0xE8, 0 },
+ { 0x03A9, 0xEA, 0 },
+ { 0x03B1, 0xE0, 0 },
+ { 0x03B4, 0xEB, 0 },
+ { 0x03B5, 0xEE, 0 },
+ { 0x03C0, 0xE3, 0 },
+ { 0x03C3, 0xE5, 0 },
+ { 0x03C4, 0xE7, 0 },
+ { 0x03C6, 0xED, 0 },
+ { 0x207F, 0xFC, 0 },
+ { 0x20A7, 0x9E, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x221A, 0xFB, 0 },
+ { 0x221E, 0xEC, 0 },
+ { 0x2229, 0xEF, 0 },
+ { 0x2248, 0xF7, 0 },
+ { 0x2261, 0xF0, 0 },
+ { 0x2264, 0xF3, 0 },
+ { 0x2265, 0xF2, 0 },
+ { 0x2310, 0xA9, 0 },
+ { 0x2320, 0xF4, 0 },
+ { 0x2321, 0xF5, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2552, 0xD5, 0 },
+ { 0x2553, 0xD6, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2555, 0xB8, 0 },
+ { 0x2556, 0xB7, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x2558, 0xD4, 0 },
+ { 0x2559, 0xD3, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255B, 0xBE, 0 },
+ { 0x255C, 0xBD, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x255E, 0xC6, 0 },
+ { 0x255F, 0xC7, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2561, 0xB5, 0 },
+ { 0x2562, 0xB6, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2564, 0xD1, 0 },
+ { 0x2565, 0xD2, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2567, 0xCF, 0 },
+ { 0x2568, 0xD0, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256A, 0xD8, 0 },
+ { 0x256B, 0xD7, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM861ByteCvtData =
+{
+ aImplIBM861ToUniTab,
+ NULL,
+ IBM861UNI_START, IBM861UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM861ToCharTab,
+ NULL,
+ aImplIBM861ToCharTabEx,
+ IBM861CHAR_START, IBM861CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM861TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM861TextEncodingData
+ = { { &aImplIBM861ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "IBM861",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* DOS/OS2, SCRIPT_LATIN, pc code page 861, mac encoding 37 */
+
+/* ======================================================================= */
+
+/* IBM-863 */
+/* Dos Standard CharSet for Canada-France */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp863.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM863UNI_START 0x80
+#define IBM863UNI_END 0xFF
+static sal_uInt16 const aImplIBM863ToUniTab[IBM863UNI_END - IBM863UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x2017, 0x00C0, 0x00A7, /* 0x80 */
+ 0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, /* 0x90 */
+ 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, /* 0x90 */
+ 0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00B8, 0x00B3, 0x00AF, /* 0xA0 */
+ 0x00CE, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* 0xB0 */
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, /* 0xC0 */
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, /* 0xD0 */
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, /* 0xE0 */
+ 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, /* 0xE0 */
+ 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM863CHAR_START 0x00A0
+#define IBM863CHAR_END 0x00FC
+static sal_uChar const aImplIBM863ToCharTab[IBM863CHAR_END - IBM863CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF, 0, 0x9B, 0x9C, 0x98, 0, 0xA0, 0x8F, /* 0x00A0 */
+ 0xA4, 0, 0, 0xAE, 0xAA, 0, 0, 0xA7, /* 0x00A0 */
+ 0xF8, 0xF1, 0xFD, 0xA6, 0xA1, 0xE6, 0x86, 0xFA, /* 0x00B0 */
+ 0xA5, 0, 0, 0xAF, 0xAC, 0xAB, 0xAD, 0, /* 0x00B0 */
+ 0x8E, 0, 0x84, 0, 0, 0, 0, 0x80, /* 0x00C0 */
+ 0x91, 0x90, 0x92, 0x94, 0, 0, 0xA8, 0x95, /* 0x00C0 */
+ 0, 0, 0, 0, 0x99, 0, 0, 0, /* 0x00D0 */
+ 0, 0x9D, 0, 0x9E, 0x9A, 0, 0, 0xE1, /* 0x00D0 */
+ 0x85, 0, 0x83, 0, 0, 0, 0, 0x87, /* 0x00E0 */
+ 0x8A, 0x82, 0x88, 0x89, 0, 0, 0x8C, 0x8B, /* 0x00E0 */
+ 0, 0, 0, 0xA2, 0x93, 0, 0, 0xF6, /* 0x00F0 */
+ 0, 0x97, 0xA3, 0x96, 0x81 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM863TOCHARTABEX_COUNT 75
+static ImplUniCharTabData const aImplIBM863ToCharTabEx[IBM863TOCHARTABEX_COUNT] =
+{
+ { 0x0192, 0x9F, 0 },
+ { 0x0393, 0xE2, 0 },
+ { 0x0398, 0xE9, 0 },
+ { 0x03A3, 0xE4, 0 },
+ { 0x03A6, 0xE8, 0 },
+ { 0x03A9, 0xEA, 0 },
+ { 0x03B1, 0xE0, 0 },
+ { 0x03B4, 0xEB, 0 },
+ { 0x03B5, 0xEE, 0 },
+ { 0x03C0, 0xE3, 0 },
+ { 0x03C3, 0xE5, 0 },
+ { 0x03C4, 0xE7, 0 },
+ { 0x03C6, 0xED, 0 },
+ { 0x2017, 0x8D, 0 },
+ { 0x207F, 0xFC, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x221A, 0xFB, 0 },
+ { 0x221E, 0xEC, 0 },
+ { 0x2229, 0xEF, 0 },
+ { 0x2248, 0xF7, 0 },
+ { 0x2261, 0xF0, 0 },
+ { 0x2264, 0xF3, 0 },
+ { 0x2265, 0xF2, 0 },
+ { 0x2310, 0xA9, 0 },
+ { 0x2320, 0xF4, 0 },
+ { 0x2321, 0xF5, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2552, 0xD5, 0 },
+ { 0x2553, 0xD6, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2555, 0xB8, 0 },
+ { 0x2556, 0xB7, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x2558, 0xD4, 0 },
+ { 0x2559, 0xD3, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255B, 0xBE, 0 },
+ { 0x255C, 0xBD, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x255E, 0xC6, 0 },
+ { 0x255F, 0xC7, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2561, 0xB5, 0 },
+ { 0x2562, 0xB6, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2564, 0xD1, 0 },
+ { 0x2565, 0xD2, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2567, 0xCF, 0 },
+ { 0x2568, 0xD0, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256A, 0xD8, 0 },
+ { 0x256B, 0xD7, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM863ByteCvtData =
+{
+ aImplIBM863ToUniTab,
+ NULL,
+ IBM863UNI_START, IBM863UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM863ToCharTab,
+ NULL,
+ aImplIBM863ToCharTabEx,
+ IBM863CHAR_START, IBM863CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM863TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM863TextEncodingData
+ = { { &aImplIBM863ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "IBM863",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* DOS/OS2, SCRIPT_LATIN, pc code page 863 */
+
+/* ======================================================================= */
+
+/* IBM-865 */
+/* Dos Standard CharSet for Nordic */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/pc/cp865.txt from 04/24/96 Version 2.00 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM865UNI_START 0x80
+#define IBM865UNI_END 0xFF
+static sal_uInt16 const aImplIBM865ToUniTab[IBM865UNI_END - IBM865UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, /* 0x80 */
+ 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, /* 0x90 */
+ 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, /* 0x90 */
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, /* 0xA0 */
+ 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, /* 0xA0 */
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, /* 0xB0 */
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, /* 0xB0 */
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, /* 0xC0 */
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, /* 0xC0 */
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, /* 0xD0 */
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, /* 0xD0 */
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, /* 0xE0 */
+ 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, /* 0xE0 */
+ 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, /* 0xF0 */
+ 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM865CHAR_START 0x00A0
+#define IBM865CHAR_END 0x00FF
+static sal_uChar const aImplIBM865ToCharTab[IBM865CHAR_END - IBM865CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF, 0xAD, 0, 0x9C, 0xAF, 0, 0, 0, /* 0x00A0 */
+ 0, 0, 0xA6, 0xAE, 0xAA, 0, 0, 0, /* 0x00A0 */
+ 0xF8, 0xF1, 0xFD, 0, 0, 0xE6, 0, 0xFA, /* 0x00B0 */
+ 0, 0, 0xA7, 0, 0xAC, 0xAB, 0, 0xA8, /* 0x00B0 */
+ 0, 0, 0, 0, 0x8E, 0x8F, 0x92, 0x80, /* 0x00C0 */
+ 0, 0x90, 0, 0, 0, 0, 0, 0, /* 0x00C0 */
+ 0, 0xA5, 0, 0, 0, 0, 0x99, 0, /* 0x00D0 */
+ 0x9D, 0, 0, 0, 0x9A, 0, 0, 0xE1, /* 0x00D0 */
+ 0x85, 0xA0, 0x83, 0, 0x84, 0x86, 0x91, 0x87, /* 0x00E0 */
+ 0x8A, 0x82, 0x88, 0x89, 0x8D, 0xA1, 0x8C, 0x8B, /* 0x00E0 */
+ 0, 0xA4, 0x95, 0xA2, 0x93, 0, 0x94, 0xF6, /* 0x00F0 */
+ 0x9B, 0x97, 0xA3, 0x96, 0x81, 0, 0, 0x98 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define IBM865TOCHARTABEX_COUNT 75
+static ImplUniCharTabData const aImplIBM865ToCharTabEx[IBM865TOCHARTABEX_COUNT] =
+{
+ { 0x0192, 0x9F, 0 },
+ { 0x0393, 0xE2, 0 },
+ { 0x0398, 0xE9, 0 },
+ { 0x03A3, 0xE4, 0 },
+ { 0x03A6, 0xE8, 0 },
+ { 0x03A9, 0xEA, 0 },
+ { 0x03B1, 0xE0, 0 },
+ { 0x03B4, 0xEB, 0 },
+ { 0x03B5, 0xEE, 0 },
+ { 0x03C0, 0xE3, 0 },
+ { 0x03C3, 0xE5, 0 },
+ { 0x03C4, 0xE7, 0 },
+ { 0x03C6, 0xED, 0 },
+ { 0x207F, 0xFC, 0 },
+ { 0x20A7, 0x9E, 0 },
+ { 0x2219, 0xF9, 0 },
+ { 0x221A, 0xFB, 0 },
+ { 0x221E, 0xEC, 0 },
+ { 0x2229, 0xEF, 0 },
+ { 0x2248, 0xF7, 0 },
+ { 0x2261, 0xF0, 0 },
+ { 0x2264, 0xF3, 0 },
+ { 0x2265, 0xF2, 0 },
+ { 0x2310, 0xA9, 0 },
+ { 0x2320, 0xF4, 0 },
+ { 0x2321, 0xF5, 0 },
+ { 0x2500, 0xC4, 0 },
+ { 0x2502, 0xB3, 0 },
+ { 0x250C, 0xDA, 0 },
+ { 0x2510, 0xBF, 0 },
+ { 0x2514, 0xC0, 0 },
+ { 0x2518, 0xD9, 0 },
+ { 0x251C, 0xC3, 0 },
+ { 0x2524, 0xB4, 0 },
+ { 0x252C, 0xC2, 0 },
+ { 0x2534, 0xC1, 0 },
+ { 0x253C, 0xC5, 0 },
+ { 0x2550, 0xCD, 0 },
+ { 0x2551, 0xBA, 0 },
+ { 0x2552, 0xD5, 0 },
+ { 0x2553, 0xD6, 0 },
+ { 0x2554, 0xC9, 0 },
+ { 0x2555, 0xB8, 0 },
+ { 0x2556, 0xB7, 0 },
+ { 0x2557, 0xBB, 0 },
+ { 0x2558, 0xD4, 0 },
+ { 0x2559, 0xD3, 0 },
+ { 0x255A, 0xC8, 0 },
+ { 0x255B, 0xBE, 0 },
+ { 0x255C, 0xBD, 0 },
+ { 0x255D, 0xBC, 0 },
+ { 0x255E, 0xC6, 0 },
+ { 0x255F, 0xC7, 0 },
+ { 0x2560, 0xCC, 0 },
+ { 0x2561, 0xB5, 0 },
+ { 0x2562, 0xB6, 0 },
+ { 0x2563, 0xB9, 0 },
+ { 0x2564, 0xD1, 0 },
+ { 0x2565, 0xD2, 0 },
+ { 0x2566, 0xCB, 0 },
+ { 0x2567, 0xCF, 0 },
+ { 0x2568, 0xD0, 0 },
+ { 0x2569, 0xCA, 0 },
+ { 0x256A, 0xD8, 0 },
+ { 0x256B, 0xD7, 0 },
+ { 0x256C, 0xCE, 0 },
+ { 0x2580, 0xDF, 0 },
+ { 0x2584, 0xDC, 0 },
+ { 0x2588, 0xDB, 0 },
+ { 0x258C, 0xDD, 0 },
+ { 0x2590, 0xDE, 0 },
+ { 0x2591, 0xB0, 0 },
+ { 0x2592, 0xB1, 0 },
+ { 0x2593, 0xB2, 0 },
+ { 0x25A0, 0xFE, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplIBM865ByteCvtData =
+{
+ aImplIBM865ToUniTab,
+ NULL,
+ IBM865UNI_START, IBM865UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplIBM865ToCharTab,
+ NULL,
+ aImplIBM865ToCharTabEx,
+ IBM865CHAR_START, IBM865CHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ IBM865TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplIBM865TextEncodingData
+ = { { &aImplIBM865ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "IBM865",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* DOS/OS2, SCRIPT_LATIN, pc code page 865 */
+
+/* ======================================================================= */
+
+/* MS-1252 */
+/* Windows Standard CharSet (ANSI) for Western Script */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* Convert-Tables: mappings/vendors/micsft/windows/cp1252.txt from 04/15/98 Version 2.01 */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1252UNI_START 0x80
+#define MS1252UNI_END 0xFF
+static sal_uInt16 const aImplMS1252ToUniTab[MS1252UNI_END - MS1252UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x20AC, 0, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, /* 0x80 */
+ 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0, 0x017D, 0, /* 0x80 */
+ 0, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, /* 0x90 */
+ 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0, 0x017E, 0x0178, /* 0x90 */
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* 0xB0 */
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, /* 0xC0 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, /* 0xD0 */
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define MS1252TOCHARTABEX_COUNT 27
+static ImplUniCharTabData const aImplMS1252ToCharTabEx[MS1252TOCHARTABEX_COUNT] =
+{
+ { 0x0152, 0x8C, 0 },
+ { 0x0153, 0x9C, 0 },
+ { 0x0160, 0x8A, 0 },
+ { 0x0161, 0x9A, 0 },
+ { 0x0178, 0x9F, 0 },
+ { 0x017D, 0x8E, 0 },
+ { 0x017E, 0x9E, 0 },
+ { 0x0192, 0x83, 0 },
+ { 0x02C6, 0x88, 0 },
+ { 0x02DC, 0x98, 0 },
+ { 0x2013, 0x96, 0 },
+ { 0x2014, 0x97, 0 },
+ { 0x2018, 0x91, 0 },
+ { 0x2019, 0x92, 0 },
+ { 0x201A, 0x82, 0 },
+ { 0x201C, 0x93, 0 },
+ { 0x201D, 0x94, 0 },
+ { 0x201E, 0x84, 0 },
+ { 0x2020, 0x86, 0 },
+ { 0x2021, 0x87, 0 },
+ { 0x2022, 0x95, 0 },
+ { 0x2026, 0x85, 0 },
+ { 0x2030, 0x89, 0 },
+ { 0x2039, 0x8B, 0 },
+ { 0x203A, 0x9B, 0 },
+ { 0x20AC, 0x80, 0 },
+ { 0x2122, 0x99, 0 },
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplMS1252ByteCvtData =
+{
+ aImplMS1252ToUniTab,
+ NULL,
+ MS1252UNI_START, MS1252UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplA0FFSameToCharTab,
+ NULL,
+ aImplMS1252ToCharTabEx,
+ SAMEA0FFCHAR_START, SAMEA0FFCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ MS1252TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS1252TextEncodingData
+ = { { &aImplMS1252ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "windows-1252",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* WIN, SCRIPT_LATIN, pc code page 850 */
+
+/* ======================================================================= */
+
+/* ISO-8859-1 */
+/* Unix Standard CharSet (Latin1) for Western Script */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-1.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO88591UNI_START 0xA0
+#define ISO88591UNI_END 0xFF
+static sal_uInt16 const aImplISO88591ToUniTab[ISO88591UNI_END - ISO88591UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, /* 0xA0 */
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, /* 0xB0 */
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, /* 0xC0 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, /* 0xD0 */
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO88591ByteCvtData =
+{
+ aImplISO88591ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO88591UNI_START, ISO88591UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplA0FFSameToCharTab,
+ aImpl8090SameToCharTab,
+ NULL,
+ SAMEA0FFCHAR_START, SAMEA0FFCHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ 0
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO88591TextEncodingData
+ = { { &aImplISO88591ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "iso-8859-1",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_LATIN, pc code page 850 */
+
+/* ======================================================================= */
+
+/* ISO-8859-14 */
+/* ungefaehr wie Latin1 */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-14.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO885914UNI_START 0xA0
+#define ISO885914UNI_END 0xFF
+static sal_uInt16 const aImplISO885914ToUniTab[ISO885914UNI_END - ISO885914UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, /* 0xA0 */
+ 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178, /* 0xA0 */
+ 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, /* 0xB0 */
+ 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, /* 0xB0 */
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, /* 0xC0 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, /* 0xD0 */
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, /* 0xD0 */
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, /* 0xF0 */
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO885914CHAR_START 0x00C0
+#define ISO885914CHAR_END 0x00FF
+static sal_uChar const aImplISO885914ToCharTab[ISO885914CHAR_END - ISO885914CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x00C0 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x00C0 */
+ 0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0, /* 0x00D0 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0, 0xDF, /* 0x00D0 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x00E0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x00E0 */
+ 0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0, /* 0x00F0 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0, 0xFF /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO885914TOCHARTABEX_COUNT 38
+static ImplUniCharTabData const aImplISO885914ToCharTabEx[ISO885914TOCHARTABEX_COUNT] =
+{
+ { 0x00A0, 0xA0, 0 },
+ { 0x00A3, 0xA3, 0 },
+ { 0x00A7, 0xA7, 0 },
+ { 0x00A9, 0xA9, 0 },
+ { 0x00AD, 0xAD, 0 },
+ { 0x00AE, 0xAE, 0 },
+ { 0x00B6, 0xB6, 0 },
+ { 0x010A, 0xA4, 0 },
+ { 0x010B, 0xA5, 0 },
+ { 0x0120, 0xB2, 0 },
+ { 0x0121, 0xB3, 0 },
+ { 0x0174, 0xD0, 0 },
+ { 0x0175, 0xF0, 0 },
+ { 0x0176, 0xDE, 0 },
+ { 0x0177, 0xFE, 0 },
+ { 0x0178, 0xAF, 0 },
+ { 0x1E02, 0xA1, 0 },
+ { 0x1E03, 0xA2, 0 },
+ { 0x1E0A, 0xA6, 0 },
+ { 0x1E0B, 0xAB, 0 },
+ { 0x1E1E, 0xB0, 0 },
+ { 0x1E1F, 0xB1, 0 },
+ { 0x1E40, 0xB4, 0 },
+ { 0x1E41, 0xB5, 0 },
+ { 0x1E56, 0xB7, 0 },
+ { 0x1E57, 0xB9, 0 },
+ { 0x1E60, 0xBB, 0 },
+ { 0x1E61, 0xBF, 0 },
+ { 0x1E6A, 0xD7, 0 },
+ { 0x1E6B, 0xF7, 0 },
+ { 0x1E80, 0xA8, 0 },
+ { 0x1E81, 0xB8, 0 },
+ { 0x1E82, 0xAA, 0 },
+ { 0x1E83, 0xBA, 0 },
+ { 0x1E84, 0xBD, 0 },
+ { 0x1E85, 0xBE, 0 },
+ { 0x1EF2, 0xAC, 0 },
+ { 0x1EF3, 0xBC, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO885914ByteCvtData =
+{
+ aImplISO885914ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO885914UNI_START, ISO885914UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplISO885914ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplISO885914ToCharTabEx,
+ ISO885914CHAR_START, ISO885914CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ ISO885914TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO885914TextEncodingData
+ = { { &aImplISO885914ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-14",
+ "iso-8859-14",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_LATIN, pc code page 850 */
+
+/* ======================================================================= */
+
+/* ISO-8859-15 */
+/* ungefaehr wie Latin1, jedoch mit Euro (ehemaliges CURRENCY-Symbol an A4) */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme, 0x80-0x9F Control-Caracter wie in Unicode */
+/* Convert-Tables: mappings/iso8859/8859-15.txt from 07/27/99 Version 1.0 (based on Unicode 3.0) */
+/* Last-Changes from us: */
+
+#define ISO885915UNI_START 0xA0
+#define ISO885915UNI_END 0xFF
+static sal_uInt16 const aImplISO885915ToUniTab[ISO885915UNI_END - ISO885915UNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, /* 0xA0 */
+ 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, /* 0xA0 */
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, /* 0xB0 */
+ 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, /* 0xB0 */
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, /* 0xC0 */
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, /* 0xC0 */
+ 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, /* 0xD0 */
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, /* 0xD0 */
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, /* 0xE0 */
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, /* 0xE0 */
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, /* 0xF0 */
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO885915CHAR_START 0x00A0
+#define ISO885915CHAR_END 0x00FF
+static sal_uChar const aImplISO885915ToCharTab[ISO885915CHAR_END - ISO885915CHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA0, 0xA1, 0xA2, 0xA3, 0, 0xA5, 0, 0xA7, /* 0x00A0 */
+ 0, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, /* 0x00A0 */
+ 0xB0, 0xB1, 0xB2, 0xB3, 0, 0xB5, 0xB6, 0xB7, /* 0x00B0 */
+ 0, 0xB9, 0xBA, 0xBB, 0, 0, 0, 0xBF, /* 0x00B0 */
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x00C0 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, /* 0x00C0 */
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x00D0 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, /* 0x00D0 */
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x00E0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, /* 0x00E0 */
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x00F0 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define ISO885915TOCHARTABEX_COUNT 8
+static ImplUniCharTabData const aImplISO885915ToCharTabEx[ISO885915TOCHARTABEX_COUNT] =
+{
+ { 0x0152, 0xBC, 0 },
+ { 0x0153, 0xBD, 0 },
+ { 0x0160, 0xA6, 0 },
+ { 0x0161, 0xA8, 0 },
+ { 0x0178, 0xBE, 0 },
+ { 0x017D, 0xB4, 0 },
+ { 0x017E, 0xB8, 0 },
+ { 0x20AC, 0xA4, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplISO885915ByteCvtData =
+{
+ aImplISO885915ToUniTab,
+ aImpl8090SameToUniTab,
+ ISO885915UNI_START, ISO885915UNI_END,
+ SAME8090UNI_START, SAME8090UNI_END,
+ aImplISO885915ToCharTab,
+ aImpl8090SameToCharTab,
+ aImplISO885915ToCharTabEx,
+ ISO885915CHAR_START, ISO885915CHAR_END,
+ SAME8090CHAR_START, SAME8090CHAR_END,
+ ISO885915TOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplISO885915TextEncodingData
+ = { { &aImplISO885915ByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-15",
+ "iso-8859-15",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_LATIN, pc code page 850 */
+
+/* ======================================================================= */
+
+/* APPLE-Iceland */
+/* Apple CharSet for Iceland */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/iceland.txt from 02/05/98 */
+/* Last-Changes from us: */
+
+#define APPLEICELANDUNI_START 0x80
+#define APPLEICELANDUNI_END 0xFF
+static sal_uInt16 const aImplAPPLEICELANDToUniTab[APPLEICELANDUNI_END - APPLEICELANDUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, /* 0x80 */
+ 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, /* 0x90 */
+ 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, /* 0x90 */
+ 0x00DD, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, /* 0xA0 */
+ 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8, /* 0xA0 */
+ 0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211, /* 0xB0 */
+ 0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x00E6, 0x00F8, /* 0xB0 */
+ 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, /* 0xC0 */
+ 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, /* 0xC0 */
+ 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, /* 0xD0 */
+ 0x00FF, 0x0178, 0x2044, 0x00A4, 0x00D0, 0x00F0, 0x00DE, 0x00FE, /* 0xD0 */
+ 0x00FD, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, /* 0xE0 */
+ 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, /* 0xE0 */
+ 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, /* 0xF0 */
+ 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEICELANDCHAR_START 0x00A0
+#define APPLEICELANDCHAR_END 0x00FF
+static sal_uChar const aImplAPPLEICELANDToCharTab[APPLEICELANDCHAR_END - APPLEICELANDCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCA, 0xC1, 0xA2, 0xA3, 0xDB, 0xB4, 0, 0xA4, /* 0x00A0 */
+ 0xAC, 0xA9, 0xBB, 0xC7, 0xC2, 0, 0xA8, 0xF8, /* 0x00A0 */
+ 0xA1, 0xB1, 0, 0, 0xAB, 0xB5, 0xA6, 0xE1, /* 0x00B0 */
+ 0xFC, 0, 0xBC, 0xC8, 0, 0, 0, 0xC0, /* 0x00B0 */
+ 0xCB, 0xE7, 0xE5, 0xCC, 0x80, 0x81, 0xAE, 0x82, /* 0x00C0 */
+ 0xE9, 0x83, 0xE6, 0xE8, 0xED, 0xEA, 0xEB, 0xEC, /* 0x00C0 */
+ 0xDC, 0x84, 0xF1, 0xEE, 0xEF, 0xCD, 0x85, 0, /* 0x00D0 */
+ 0xAF, 0xF4, 0xF2, 0xF3, 0x86, 0xA0, 0xDE, 0xA7, /* 0x00D0 */
+ 0x88, 0x87, 0x89, 0x8B, 0x8A, 0x8C, 0xBE, 0x8D, /* 0x00E0 */
+ 0x8F, 0x8E, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0x00E0 */
+ 0xDD, 0x96, 0x98, 0x97, 0x99, 0x9B, 0x9A, 0xD6, /* 0x00F0 */
+ 0xBF, 0x9D, 0x9C, 0x9E, 0x9F, 0xE0, 0xDF, 0xD8 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEICELANDTOCHARTABEX_COUNT 41
+static ImplUniCharTabData const aImplAPPLEICELANDToCharTabEx[APPLEICELANDTOCHARTABEX_COUNT] =
+{
+ { 0x0131, 0xF5, 0 },
+ { 0x0152, 0xCE, 0 },
+ { 0x0153, 0xCF, 0 },
+ { 0x0178, 0xD9, 0 },
+ { 0x0192, 0xC4, 0 },
+ { 0x02C6, 0xF6, 0 },
+ { 0x02C7, 0xFF, 0 },
+ { 0x02D8, 0xF9, 0 },
+ { 0x02D9, 0xFA, 0 },
+ { 0x02DA, 0xFB, 0 },
+ { 0x02DB, 0xFE, 0 },
+ { 0x02DC, 0xF7, 0 },
+ { 0x02DD, 0xFD, 0 },
+ { 0x03A9, 0xBD, 0 },
+ { 0x03C0, 0xB9, 0 },
+ { 0x2013, 0xD0, 0 },
+ { 0x2014, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201A, 0xE2, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x201E, 0xE3, 0 },
+ { 0x2022, 0xA5, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2030, 0xE4, 0 },
+ { 0x2044, 0xDA, 0 },
+ { 0x2122, 0xAA, 0 },
+ { 0x2202, 0xB6, 0 },
+ { 0x2206, 0xC6, 0 },
+ { 0x220F, 0xB8, 0 },
+ { 0x2211, 0xB7, 0 },
+ { 0x221A, 0xC3, 0 },
+ { 0x221E, 0xB0, 0 },
+ { 0x222B, 0xBA, 0 },
+ { 0x2248, 0xC5, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 },
+ { 0x25CA, 0xD7, 0 },
+ { 0xF8FF, 0xF0, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLEICELANDByteCvtData =
+{
+ aImplAPPLEICELANDToUniTab,
+ NULL,
+ APPLEICELANDUNI_START, APPLEICELANDUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplAPPLEICELANDToCharTab,
+ NULL,
+ aImplAPPLEICELANDToCharTabEx,
+ APPLEICELANDCHAR_START, APPLEICELANDCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLEICELANDTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLEICELANDTextEncodingData
+ = { { &aImplAPPLEICELANDByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "iso-8859-1",
+ RTL_TEXTENCODING_INFO_ASCII };
+ /* MAC, SCRIPT_LATIN, pc code page 861, mac encoding 37 */
+
+/* ======================================================================= */
+
+/* APPLE-Roman */
+/* Standard Apple CharSet for Western */
+/* 1-Byte, 0x00-0x7F ASCII, jedoch eigentich Sonderzeichen zwischen 0x00-0x1F */
+/* die wir aber nicht beruecksichtigen */
+/* Convert-Tables: mappings/vendors/apple/roman.txt from 08/18/98 */
+/* Last-Changes from us: */
+
+#define APPLEROMANUNI_START 0x80
+#define APPLEROMANUNI_END 0xFF
+static sal_uInt16 const aImplAPPLEROMANToUniTab[APPLEROMANUNI_END - APPLEROMANUNI_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, /* 0x80 */
+ 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, /* 0x80 */
+ 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, /* 0x90 */
+ 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, /* 0x90 */
+ 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, /* 0xA0 */
+ 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8, /* 0xA0 */
+ 0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211, /* 0xB0 */
+ 0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x00E6, 0x00F8, /* 0xB0 */
+ 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, /* 0xC0 */
+ 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, /* 0xC0 */
+ 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, /* 0xD0 */
+ 0x00FF, 0x0178, 0x2044, 0x20AC, 0x2039, 0x203A, 0xFB01, 0xFB02, /* 0xD0 */
+ 0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, /* 0xE0 */
+ 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, /* 0xE0 */
+ 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, /* 0xF0 */
+ 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEROMANCHAR_START 0x00A0
+#define APPLEROMANCHAR_END 0x00FF
+static sal_uChar const aImplAPPLEROMANToCharTab[APPLEROMANCHAR_END - APPLEROMANCHAR_START + 1] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCA, 0xC1, 0xA2, 0xA3, 0, 0xB4, 0, 0xA4, /* 0x00A0 */
+ 0xAC, 0xA9, 0xBB, 0xC7, 0xC2, 0, 0xA8, 0xF8, /* 0x00A0 */
+ 0xA1, 0xB1, 0, 0, 0xAB, 0xB5, 0xA6, 0xE1, /* 0x00B0 */
+ 0xFC, 0, 0xBC, 0xC8, 0, 0, 0, 0xC0, /* 0x00B0 */
+ 0xCB, 0xE7, 0xE5, 0xCC, 0x80, 0x81, 0xAE, 0x82, /* 0x00C0 */
+ 0xE9, 0x83, 0xE6, 0xE8, 0xED, 0xEA, 0xEB, 0xEC, /* 0x00C0 */
+ 0, 0x84, 0xF1, 0xEE, 0xEF, 0xCD, 0x85, 0, /* 0x00D0 */
+ 0xAF, 0xF4, 0xF2, 0xF3, 0x86, 0, 0, 0xA7, /* 0x00D0 */
+ 0x88, 0x87, 0x89, 0x8B, 0x8A, 0x8C, 0xBE, 0x8D, /* 0x00E0 */
+ 0x8F, 0x8E, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, /* 0x00E0 */
+ 0, 0x96, 0x98, 0x97, 0x99, 0x9B, 0x9A, 0xD6, /* 0x00F0 */
+ 0xBF, 0x9D, 0x9C, 0x9E, 0x9F, 0, 0, 0xD8 /* 0x00F0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+#define APPLEROMANTOCHARTABEX_COUNT 48
+static ImplUniCharTabData const aImplAPPLEROMANToCharTabEx[APPLEROMANTOCHARTABEX_COUNT] =
+{
+ { 0x0131, 0xF5, 0 },
+ { 0x0152, 0xCE, 0 },
+ { 0x0153, 0xCF, 0 },
+ { 0x0178, 0xD9, 0 },
+ { 0x0192, 0xC4, 0 },
+ { 0x02C6, 0xF6, 0 },
+ { 0x02C7, 0xFF, 0 },
+ { 0x02D8, 0xF9, 0 },
+ { 0x02D9, 0xFA, 0 },
+ { 0x02DA, 0xFB, 0 },
+ { 0x02DB, 0xFE, 0 },
+ { 0x02DC, 0xF7, 0 },
+ { 0x02DD, 0xFD, 0 },
+ { 0x03A9, 0xBD, 0 },
+ { 0x03C0, 0xB9, 0 },
+ { 0x2013, 0xD0, 0 },
+ { 0x2014, 0xD1, 0 },
+ { 0x2018, 0xD4, 0 },
+ { 0x2019, 0xD5, 0 },
+ { 0x201A, 0xE2, 0 },
+ { 0x201C, 0xD2, 0 },
+ { 0x201D, 0xD3, 0 },
+ { 0x201E, 0xE3, 0 },
+ { 0x2020, 0xA0, 0 },
+ { 0x2021, 0xE0, 0 },
+ { 0x2022, 0xA5, 0 },
+ { 0x2026, 0xC9, 0 },
+ { 0x2030, 0xE4, 0 },
+ { 0x2039, 0xDC, 0 },
+ { 0x203A, 0xDD, 0 },
+ { 0x2044, 0xDA, 0 },
+ { 0x20AC, 0xDB, 0 },
+ { 0x2122, 0xAA, 0 },
+ { 0x2202, 0xB6, 0 },
+ { 0x2206, 0xC6, 0 },
+ { 0x220F, 0xB8, 0 },
+ { 0x2211, 0xB7, 0 },
+ { 0x221A, 0xC3, 0 },
+ { 0x221E, 0xB0, 0 },
+ { 0x222B, 0xBA, 0 },
+ { 0x2248, 0xC5, 0 },
+ { 0x2260, 0xAD, 0 },
+ { 0x2264, 0xB2, 0 },
+ { 0x2265, 0xB3, 0 },
+ { 0x25CA, 0xD7, 0 },
+ { 0xF8FF, 0xF0, 0 },
+ { 0xFB01, 0xDE, 0 },
+ { 0xFB02, 0xDF, 0 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplAPPLEROMANByteCvtData =
+{
+ aImplAPPLEROMANToUniTab,
+ NULL,
+ APPLEROMANUNI_START, APPLEROMANUNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ aImplAPPLEROMANToCharTab,
+ NULL,
+ aImplAPPLEROMANToCharTabEx,
+ APPLEROMANCHAR_START, APPLEROMANCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ APPLEROMANTOCHARTABEX_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLEROMANTextEncodingData
+ = { { &aImplAPPLEROMANByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 77,
+ "iso8859-1",
+ "macintosh",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MIME };
+ /* MAC, SCRIPT_LATIN, pc code page 850 */
+
+/* ======================================================================= */
+
+/* US-ASCII */
+/* 7-Bit ASCII */
+/* 1-Byte, 0x00-0x7F ASCII ohne Ausnahme */
+/* For the import we use ISO-8859-1 with MS extension (MS-1252), because */
+/* when the 8-Bit is set, the chance, that this is a ISO-8859-1 character */
+/* is the greatest. For the export all chars greater than 127 are not */
+/* converted and are replaced by the replacement character. */
+/* Last-Changes from us: */
+
+/* ----------------------------------------------------------------------- */
+
+static ImplByteConvertData const aImplUSASCIIByteCvtData =
+{
+ aImplMS1252ToUniTab,
+ NULL,
+ MS1252UNI_START, MS1252UNI_END,
+ NOTABUNI_START, NOTABUNI_END,
+ NULL,
+ NULL,
+ NULL,
+ NOTABCHAR_START, NOTABCHAR_END,
+ NOTABCHAR_START, NOTABCHAR_END,
+ 0
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplUSASCIITextEncodingData
+ = { { &aImplUSASCIIByteCvtData,
+ ImplCharToUnicode,
+ ImplUnicodeToChar,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 0,
+ "iso8859-1",
+ "us-ascii",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_7BIT
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_LATIN, pc code page 437 */
diff --git a/sal/textenc/tcvtmb.c b/sal/textenc/tcvtmb.c
new file mode 100644
index 000000000000..4801e2ed665e
--- /dev/null
+++ b/sal/textenc/tcvtmb.c
@@ -0,0 +1,693 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "tenchelp.h"
+#include "unichars.h"
+#include "rtl/textcvt.h"
+
+/* ======================================================================= */
+
+/* DBCS to Unicode conversion routine use a lead table for the first byte, */
+/* where we determine the trail table or for single byte chars the unicode */
+/* value. We have for all lead byte a separate table, because we can */
+/* then share many tables for diffrent charset encodings. */
+
+/* ======================================================================= */
+
+sal_Size ImplDBCSToUnicode( const ImplTextConverterData* pData, void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes )
+{
+ sal_uChar cLead;
+ sal_uChar cTrail;
+ sal_Unicode cConv;
+ const ImplDBCSToUniLeadTab* pLeadEntry;
+ const ImplDBCSConvertData* pConvertData = (const ImplDBCSConvertData*)pData;
+ const ImplDBCSToUniLeadTab* pLeadTab = pConvertData->mpToUniLeadTab;
+ sal_Unicode* pEndDestBuf;
+ const sal_Char* pEndSrcBuf;
+
+ (void) pContext; /* unused */
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestChars;
+ pEndSrcBuf = pSrcBuf+nSrcBytes;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ cLead = (sal_uChar)*pSrcBuf;
+
+ /* get entry for the lead byte */
+ pLeadEntry = pLeadTab+cLead;
+
+ /* SingleByte char? */
+ if (pLeadEntry->mpToUniTrailTab == NULL
+ || cLead < pConvertData->mnLeadStart
+ || cLead > pConvertData->mnLeadEnd)
+ {
+ cConv = pLeadEntry->mnUniChar;
+ if ( !cConv && (cLead != 0) )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_UNDEFINED;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_IGNORE )
+ {
+ pSrcBuf++;
+ continue;
+ }
+ else
+ cConv = ImplGetUndefinedUnicodeChar(cLead, nFlags);
+ }
+ }
+ else
+ {
+ /* Source buffer to small */
+ if ( pSrcBuf +1 == pEndSrcBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ break;
+ }
+
+ pSrcBuf++;
+ cTrail = (sal_uChar)*pSrcBuf;
+ if ( (cTrail >= pLeadEntry->mnTrailStart) && (cTrail <= pLeadEntry->mnTrailEnd) )
+ cConv = pLeadEntry->mpToUniTrailTab[cTrail-pLeadEntry->mnTrailStart];
+ else
+ cConv = 0;
+
+ if ( !cConv )
+ {
+ /* EUDC Ranges */
+ sal_uInt16 i;
+ const ImplDBCSEUDCData* pEUDCTab = pConvertData->mpEUDCTab;
+ for ( i = 0; i < pConvertData->mnEUDCCount; i++ )
+ {
+ if ( (cLead >= pEUDCTab->mnLeadStart) &&
+ (cLead <= pEUDCTab->mnLeadEnd) )
+ {
+ sal_uInt16 nTrailCount = 0;
+ if ( (cTrail >= pEUDCTab->mnTrail1Start) &&
+ (cTrail <= pEUDCTab->mnTrail1End) )
+ {
+ cConv = pEUDCTab->mnUniStart+
+ ((cLead-pEUDCTab->mnLeadStart)*pEUDCTab->mnTrailRangeCount)+
+ (cTrail-pEUDCTab->mnTrail1Start);
+ break;
+ }
+ else
+ {
+ nTrailCount = pEUDCTab->mnTrail1End-pEUDCTab->mnTrail1Start+1;
+ if ( (pEUDCTab->mnTrailCount >= 2) &&
+ (cTrail >= pEUDCTab->mnTrail2Start) &&
+ (cTrail <= pEUDCTab->mnTrail2End) )
+ {
+ cConv = pEUDCTab->mnUniStart+
+ ((cLead-pEUDCTab->mnLeadStart)*pEUDCTab->mnTrailRangeCount)+
+ nTrailCount+
+ (cTrail-pEUDCTab->mnTrail2Start);
+ break;
+ }
+ else
+ {
+ nTrailCount = pEUDCTab->mnTrail2End-pEUDCTab->mnTrail2Start+1;
+ if ( (pEUDCTab->mnTrailCount >= 3) &&
+ (cTrail >= pEUDCTab->mnTrail3Start) &&
+ (cTrail <= pEUDCTab->mnTrail3End) )
+ {
+ cConv = pEUDCTab->mnUniStart+
+ ((cLead-pEUDCTab->mnLeadStart)*pEUDCTab->mnTrailRangeCount)+
+ nTrailCount+
+ (cTrail-pEUDCTab->mnTrail3Start);
+ break;
+ }
+ }
+ }
+ }
+
+ pEUDCTab++;
+ }
+
+ if ( !cConv )
+ {
+ /* Wir vergleichen den kompletten Trailbereich den wir */
+ /* definieren, der normalerweise groesser sein kann als */
+ /* der definierte. Dies machen wir, damit Erweiterungen von */
+ /* uns nicht beruecksichtigten Encodings so weit wie */
+ /* moeglich auch richtig zu behandeln, das double byte */
+ /* characters auch als ein einzelner Character behandelt */
+ /* wird. */
+ if (cLead < pConvertData->mnLeadStart
+ || cLead > pConvertData->mnLeadEnd
+ || cTrail < pConvertData->mnTrailStart
+ || cTrail > pConvertData->mnTrailEnd)
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE )
+ {
+ pSrcBuf++;
+ continue;
+ }
+ else
+ cConv = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+ }
+ else
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_MBUNDEFINED;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_IGNORE )
+ {
+ pSrcBuf++;
+ continue;
+ }
+ else
+ cConv = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+ }
+ }
+ }
+ }
+
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = cConv;
+ pDestBuf++;
+ pSrcBuf++;
+ }
+
+ *pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf);
+ return (nDestChars - (pEndDestBuf-pDestBuf));
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size ImplUnicodeToDBCS( const ImplTextConverterData* pData, void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars )
+{
+ sal_uInt16 cConv;
+ sal_Unicode c;
+ sal_uChar nHighChar;
+ sal_uChar nLowChar;
+ const ImplUniToDBCSHighTab* pHighEntry;
+ const ImplDBCSConvertData* pConvertData = (const ImplDBCSConvertData*)pData;
+ const ImplUniToDBCSHighTab* pHighTab = pConvertData->mpToDBCSHighTab;
+ sal_Char* pEndDestBuf;
+ const sal_Unicode* pEndSrcBuf;
+
+ sal_Bool bCheckRange = (pConvertData->mnLeadStart != 0
+ || pConvertData->mnLeadEnd != 0xFF);
+ /* this statement has the effect that this extra check is only done for
+ EUC-KR, which uses the MS-949 tables, but does not support the full
+ range of MS-949 */
+
+ (void) pContext; /* unused */
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestBytes;
+ pEndSrcBuf = pSrcBuf+nSrcChars;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ c = *pSrcBuf;
+ nHighChar = (sal_uChar)((c >> 8) & 0xFF);
+ nLowChar = (sal_uChar)(c & 0xFF);
+
+ /* get entry for the high byte */
+ pHighEntry = pHighTab+nHighChar;
+
+ /* is low byte in the table range */
+ if ( (nLowChar >= pHighEntry->mnLowStart) && (nLowChar <= pHighEntry->mnLowEnd) )
+ {
+ cConv = pHighEntry->mpToUniTrailTab[nLowChar-pHighEntry->mnLowStart];
+ if (bCheckRange && cConv > 0x7F
+ && ((cConv >> 8) < pConvertData->mnLeadStart
+ || (cConv >> 8) > pConvertData->mnLeadEnd
+ || (cConv & 0xFF) < pConvertData->mnTrailStart
+ || (cConv & 0xFF) > pConvertData->mnTrailEnd))
+ cConv = 0;
+ }
+ else
+ cConv = 0;
+
+ if (cConv == 0 && c != 0)
+ {
+ /* Map to EUDC ranges: */
+ ImplDBCSEUDCData const * pEUDCTab = pConvertData->mpEUDCTab;
+ sal_uInt32 i;
+ for (i = 0; i < pConvertData->mnEUDCCount; ++i)
+ {
+ if (c >= pEUDCTab->mnUniStart && c <= pEUDCTab->mnUniEnd)
+ {
+ sal_uInt32 nIndex = c - pEUDCTab->mnUniStart;
+ sal_uInt32 nLeadOff
+ = nIndex / pEUDCTab->mnTrailRangeCount;
+ sal_uInt32 nTrailOff
+ = nIndex % pEUDCTab->mnTrailRangeCount;
+ sal_uInt32 nSize;
+ cConv = (sal_uInt16)
+ ((pEUDCTab->mnLeadStart + nLeadOff) << 8);
+ nSize
+ = pEUDCTab->mnTrail1End - pEUDCTab->mnTrail1Start + 1;
+ if (nTrailOff < nSize)
+ {
+ cConv |= pEUDCTab->mnTrail1Start + nTrailOff;
+ break;
+ }
+ nTrailOff -= nSize;
+ nSize
+ = pEUDCTab->mnTrail2End - pEUDCTab->mnTrail2Start + 1;
+ if (nTrailOff < nSize)
+ {
+ cConv |= pEUDCTab->mnTrail2Start + nTrailOff;
+ break;
+ }
+ nTrailOff -= nSize;
+ cConv |= pEUDCTab->mnTrail3Start + nTrailOff;
+ break;
+ }
+ pEUDCTab++;
+ }
+
+ /* FIXME
+ * SB: Not sure why this is in here. Plus, it does not work as
+ * intended when (c & 0xFF) == 0, because the next !cConv check
+ * will then think c has not yet been converted...
+ */
+ if (c >= RTL_TEXTCVT_BYTE_PRIVATE_START
+ && c <= RTL_TEXTCVT_BYTE_PRIVATE_END)
+ {
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 )
+ cConv = (sal_Char)(sal_uChar)(c & 0xFF);
+ }
+ }
+
+ if ( !cConv )
+ {
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE )
+ {
+ /* !!! */
+ }
+
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR )
+ {
+ /* !!! */
+ }
+
+ /* Handle undefined and surrogates characters */
+ /* (all surrogates characters are undefined) */
+ if (ImplHandleUndefinedUnicodeToTextChar(pData,
+ &pSrcBuf,
+ pEndSrcBuf,
+ &pDestBuf,
+ pEndDestBuf,
+ nFlags,
+ pInfo))
+ continue;
+ else
+ break;
+ }
+
+ /* SingleByte */
+ if ( !(cConv & 0xFF00) )
+ {
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = (sal_Char)(sal_uChar)(cConv & 0xFF);
+ pDestBuf++;
+ }
+ else
+ {
+ if ( pDestBuf+1 >= pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = (sal_Char)(sal_uChar)((cConv >> 8) & 0xFF);
+ pDestBuf++;
+ *pDestBuf = (sal_Char)(sal_uChar)(cConv & 0xFF);
+ pDestBuf++;
+ }
+
+ pSrcBuf++;
+ }
+
+ *pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf);
+ return (nDestBytes - (pEndDestBuf-pDestBuf));
+}
+
+/* ======================================================================= */
+
+#define JIS_EUC_LEAD_OFF 0x80
+#define JIS_EUC_TRAIL_OFF 0x80
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size ImplEUCJPToUnicode( const ImplTextConverterData* pData,
+ void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes )
+{
+ sal_uChar c;
+ sal_uChar cLead = '\0';
+ sal_uChar cTrail = '\0';
+ sal_Unicode cConv;
+ const ImplDBCSToUniLeadTab* pLeadEntry;
+ const ImplDBCSToUniLeadTab* pLeadTab;
+ const ImplEUCJPConvertData* pConvertData = (const ImplEUCJPConvertData*)pData;
+ sal_Unicode* pEndDestBuf;
+ const sal_Char* pEndSrcBuf;
+
+ (void) pContext; /* unused */
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestChars;
+ pEndSrcBuf = pSrcBuf+nSrcBytes;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ c = (sal_uChar)*pSrcBuf;
+
+ /* ASCII */
+ if ( c <= 0x7F )
+ cConv = c;
+ else
+ {
+ /* SS2 - Half-width katakana */
+ /* 8E + A1-DF */
+ if ( c == 0x8E )
+ {
+ /* Source buffer to small */
+ if ( pSrcBuf + 1 == pEndSrcBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ break;
+ }
+
+ pSrcBuf++;
+ c = (sal_uChar)*pSrcBuf;
+ if ( (c >= 0xA1) && (c <= 0xDF) )
+ cConv = 0xFF61+(c-0xA1);
+ else
+ {
+ cConv = 0;
+ cLead = 0x8E;
+ cTrail = c;
+ }
+ }
+ else
+ {
+ /* SS3 - JIS 0212-1990 */
+ /* 8F + A1-FE + A1-FE */
+ if ( c == 0x8F )
+ {
+ /* Source buffer to small */
+ if (pEndSrcBuf - pSrcBuf < 3)
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ break;
+ }
+
+ pSrcBuf++;
+ cLead = (sal_uChar)*pSrcBuf;
+ pSrcBuf++;
+ cTrail = (sal_uChar)*pSrcBuf;
+ pLeadTab = pConvertData->mpJIS0212ToUniLeadTab;
+ }
+ /* CodeSet 2 JIS 0208-1997 */
+ /* A1-FE + A1-FE */
+ else
+ {
+ /* Source buffer to small */
+ if ( pSrcBuf + 1 == pEndSrcBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ break;
+ }
+
+ cLead = c;
+ pSrcBuf++;
+ cTrail = (sal_uChar)*pSrcBuf;
+ pLeadTab = pConvertData->mpJIS0208ToUniLeadTab;
+ }
+
+ /* Undefined Range */
+ if ( (cLead < JIS_EUC_LEAD_OFF) || (cTrail < JIS_EUC_TRAIL_OFF) )
+ cConv = 0;
+ else
+ {
+ cLead -= JIS_EUC_LEAD_OFF;
+ cTrail -= JIS_EUC_TRAIL_OFF;
+ pLeadEntry = pLeadTab+cLead;
+ if ( (cTrail >= pLeadEntry->mnTrailStart) && (cTrail <= pLeadEntry->mnTrailEnd) )
+ cConv = pLeadEntry->mpToUniTrailTab[cTrail-pLeadEntry->mnTrailStart];
+ else
+ cConv = 0;
+ }
+ }
+
+ if ( !cConv )
+ {
+ /* Wir vergleichen den kompletten Trailbereich den wir */
+ /* definieren, der normalerweise groesser sein kann als */
+ /* der definierte. Dies machen wir, damit Erweiterungen von */
+ /* uns nicht beruecksichtigten Encodings so weit wie */
+ /* moeglich auch richtig zu behandeln, das double byte */
+ /* characters auch als ein einzelner Character behandelt */
+ /* wird. */
+ if ( (cLead < JIS_EUC_LEAD_OFF) || (cTrail < JIS_EUC_TRAIL_OFF) )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE )
+ {
+ pSrcBuf++;
+ continue;
+ }
+ else
+ cConv = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+ }
+ else
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_MBUNDEFINED;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_IGNORE )
+ {
+ pSrcBuf++;
+ continue;
+ }
+ else
+ cConv = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+ }
+ }
+ }
+
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = cConv;
+ pDestBuf++;
+ pSrcBuf++;
+ }
+
+ *pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf);
+ return (nDestChars - (pEndDestBuf-pDestBuf));
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size ImplUnicodeToEUCJP( const ImplTextConverterData* pData,
+ void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars )
+{
+ sal_uInt32 cConv;
+ sal_Unicode c;
+ sal_uChar nHighChar;
+ sal_uChar nLowChar;
+ const ImplUniToDBCSHighTab* pHighEntry;
+ const ImplUniToDBCSHighTab* pHighTab;
+ const ImplEUCJPConvertData* pConvertData = (const ImplEUCJPConvertData*)pData;
+ sal_Char* pEndDestBuf;
+ const sal_Unicode* pEndSrcBuf;
+
+ (void) pContext; /* unused */
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestBytes;
+ pEndSrcBuf = pSrcBuf+nSrcChars;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ c = *pSrcBuf;
+
+ /* ASCII */
+ if ( c <= 0x7F )
+ cConv = c;
+ /* Half-width katakana */
+ else if ( (c >= 0xFF61) && (c <= 0xFF9F) )
+ cConv = 0x8E00+0xA1+(c-0xFF61);
+ else
+ {
+ nHighChar = (sal_uChar)((c >> 8) & 0xFF);
+ nLowChar = (sal_uChar)(c & 0xFF);
+
+ /* JIS 0208 */
+ pHighTab = pConvertData->mpUniToJIS0208HighTab;
+ pHighEntry = pHighTab+nHighChar;
+ if ( (nLowChar >= pHighEntry->mnLowStart) && (nLowChar <= pHighEntry->mnLowEnd) )
+ {
+ cConv = pHighEntry->mpToUniTrailTab[nLowChar-pHighEntry->mnLowStart];
+ if (cConv != 0)
+ cConv |= 0x8080;
+ }
+ else
+ cConv = 0;
+
+ /* JIS 0212 */
+ if ( !cConv )
+ {
+ pHighTab = pConvertData->mpUniToJIS0212HighTab;
+ pHighEntry = pHighTab+nHighChar;
+ if ( (nLowChar >= pHighEntry->mnLowStart) && (nLowChar <= pHighEntry->mnLowEnd) )
+ {
+ cConv = pHighEntry->mpToUniTrailTab[nLowChar-pHighEntry->mnLowStart];
+ if (cConv != 0)
+ cConv |= 0x8F8080;
+ }
+
+ if ( !cConv )
+ {
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE )
+ {
+ /* !!! */
+ }
+
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACESTR )
+ {
+ /* !!! */
+ }
+
+ /* Handle undefined and surrogates characters */
+ /* (all surrogates characters are undefined) */
+ if (ImplHandleUndefinedUnicodeToTextChar(pData,
+ &pSrcBuf,
+ pEndSrcBuf,
+ &pDestBuf,
+ pEndDestBuf,
+ nFlags,
+ pInfo))
+ continue;
+ else
+ break;
+ }
+ }
+ }
+
+ /* SingleByte */
+ if ( !(cConv & 0xFFFF00) )
+ {
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = (sal_Char)(sal_uChar)(cConv & 0xFF);
+ pDestBuf++;
+ }
+ /* DoubleByte */
+ else if ( !(cConv & 0xFF0000) )
+ {
+ if ( pDestBuf+1 >= pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = (sal_Char)(sal_uChar)((cConv >> 8) & 0xFF);
+ pDestBuf++;
+ *pDestBuf = (sal_Char)(sal_uChar)(cConv & 0xFF);
+ pDestBuf++;
+ }
+ else
+ {
+ if ( pDestBuf+2 >= pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = (sal_Char)(sal_uChar)((cConv >> 16) & 0xFF);
+ pDestBuf++;
+ *pDestBuf = (sal_Char)(sal_uChar)((cConv >> 8) & 0xFF);
+ pDestBuf++;
+ *pDestBuf = (sal_Char)(sal_uChar)(cConv & 0xFF);
+ pDestBuf++;
+ }
+
+ pSrcBuf++;
+ }
+
+ *pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf);
+ return (nDestBytes - (pEndDestBuf-pDestBuf));
+}
diff --git a/sal/textenc/tcvtscn1.tab b/sal/textenc/tcvtscn1.tab
new file mode 100644
index 000000000000..c6ee51d726d7
--- /dev/null
+++ b/sal/textenc/tcvtscn1.tab
@@ -0,0 +1,3860 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the DBCS to UniCode tables for the following */
+/* chinese simplified (China) charsets: */
+/* GB (GB2312), GBK, MS936, APPLE_CHINSIMP */
+
+/* GBK is a superset of GB2312, so we have only GBK tables. The offset is */
+/* added in the lead byte tables. */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, /* 0x40 */
+ 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, /* 0x40 */
+ 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, /* 0x50 */
+ 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62, /* 0x50 */
+ 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C, /* 0x60 */
+ 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77, /* 0x60 */
+ 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80, /* 0x70 */
+ 0x4E81, 0x4E82, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0, /* 0x70 */
+ 0x4E90, 0x4E96, 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4E9E, 0x4EA3, /* 0x80 */
+ 0x4EAA, 0x4EAF, 0x4EB0, 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, /* 0x80 */
+ 0x4EB9, 0x4EBC, 0x4EBD, 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, /* 0x90 */
+ 0x4ED2, 0x4EDA, 0x4EDB, 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, /* 0x90 */
+ 0x4EE9, 0x4EED, 0x4EEE, 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, /* 0xA0 */
+ 0x4EFA, 0x4EFC, 0x4EFE, 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, /* 0xA0 */
+ 0x4F06, 0x4F07, 0x4F08, 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, /* 0xB0 */
+ 0x4F15, 0x4F16, 0x4F1C, 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, /* 0xB0 */
+ 0x4F2C, 0x4F2D, 0x4F2E, 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, /* 0xC0 */
+ 0x4F3B, 0x4F3E, 0x4F3F, 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, /* 0xC0 */
+ 0x4F47, 0x4F48, 0x4F49, 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, /* 0xD0 */
+ 0x4F56, 0x4F61, 0x4F62, 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, /* 0xD0 */
+ 0x4F6E, 0x4F71, 0x4F72, 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, /* 0xE0 */
+ 0x4F7D, 0x4F80, 0x4F81, 0x4F82, 0x4F85, 0x4F86, 0x4F87, 0x4F8A, /* 0xE0 */
+ 0x4F8C, 0x4F8E, 0x4F90, 0x4F92, 0x4F93, 0x4F95, 0x4F96, 0x4F98, /* 0xF0 */
+ 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F, 0x4FA1, 0x4FA2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2, 0x4FB3, 0x4FB4, /* 0x40 */
+ 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB, 0x4FBC, 0x4FBD, /* 0x40 */
+ 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC2, 0x4FC6, 0x4FC7, 0x4FC8, 0x4FC9, /* 0x50 */
+ 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5, 0x4FD6, /* 0x50 */
+ 0x4FD9, 0x4FDB, 0x4FE0, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB, /* 0x60 */
+ 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9, /* 0x60 */
+ 0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5000, 0x5001, 0x5002, 0x5003, /* 0x70 */
+ 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500A, 0, /* 0x70 */
+ 0x500B, 0x500E, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, /* 0x80 */
+ 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, /* 0x80 */
+ 0x502B, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, /* 0x90 */
+ 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F, 0x5040, /* 0x90 */
+ 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504A, 0x504B, /* 0xA0 */
+ 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, /* 0xA0 */
+ 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061, /* 0xB0 */
+ 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A, /* 0xB0 */
+ 0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073, /* 0xC0 */
+ 0x5074, 0x5075, 0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, /* 0xC0 */
+ 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, /* 0xD0 */
+ 0x508C, 0x508E, 0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, /* 0xD0 */
+ 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509A, 0x509B, 0x509C, /* 0xE0 */
+ 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50A4, 0x50A6, /* 0xE0 */
+ 0x50AA, 0x50AB, 0x50AD, 0x50AE, 0x50AF, 0x50B0, 0x50B1, 0x50B3, /* 0xF0 */
+ 0x50B4, 0x50B5, 0x50B6, 0x50B7, 0x50B8, 0x50B9, 0x50BC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x50BD, 0x50BE, 0x50BF, 0x50C0, 0x50C1, 0x50C2, 0x50C3, 0x50C4, /* 0x40 */
+ 0x50C5, 0x50C6, 0x50C7, 0x50C8, 0x50C9, 0x50CA, 0x50CB, 0x50CC, /* 0x40 */
+ 0x50CD, 0x50CE, 0x50D0, 0x50D1, 0x50D2, 0x50D3, 0x50D4, 0x50D5, /* 0x50 */
+ 0x50D7, 0x50D8, 0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DE, 0x50DF, /* 0x50 */
+ 0x50E0, 0x50E1, 0x50E2, 0x50E3, 0x50E4, 0x50E5, 0x50E8, 0x50E9, /* 0x60 */
+ 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1, 0x50F2, 0x50F4, 0x50F6, /* 0x60 */
+ 0x50F7, 0x50F8, 0x50F9, 0x50FA, 0x50FC, 0x50FD, 0x50FE, 0x50FF, /* 0x70 */
+ 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0, /* 0x70 */
+ 0x5109, 0x510A, 0x510C, 0x510D, 0x510E, 0x510F, 0x5110, 0x5111, /* 0x80 */
+ 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511A, /* 0x80 */
+ 0x511B, 0x511C, 0x511D, 0x511E, 0x511F, 0x5120, 0x5122, 0x5123, /* 0x90 */
+ 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512A, 0x512B, /* 0x90 */
+ 0x512C, 0x512D, 0x512E, 0x512F, 0x5130, 0x5131, 0x5132, 0x5133, /* 0xA0 */
+ 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513A, 0x513B, /* 0xA0 */
+ 0x513C, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C, 0x514E, /* 0xB0 */
+ 0x514F, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B, /* 0xB0 */
+ 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, /* 0xC0 */
+ 0x5167, 0x5169, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, /* 0xC0 */
+ 0x5183, 0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, /* 0xD0 */
+ 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, /* 0xD0 */
+ 0x519F, 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, /* 0xE0 */
+ 0x51AD, 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, /* 0xE0 */
+ 0x51C1, 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CD, 0x51CE, /* 0xF0 */
+ 0x51D0, 0x51D2, 0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x51D8, 0x51D9, 0x51DA, 0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, /* 0x40 */
+ 0x51E5, 0x51E6, 0x51E7, 0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, /* 0x40 */
+ 0x51F1, 0x51F2, 0x51F4, 0x51F7, 0x51FE, 0x5204, 0x5205, 0x5209, /* 0x50 */
+ 0x520B, 0x520C, 0x520F, 0x5210, 0x5213, 0x5214, 0x5215, 0x521C, /* 0x50 */
+ 0x521E, 0x521F, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, /* 0x60 */
+ 0x522A, 0x522C, 0x522F, 0x5231, 0x5232, 0x5234, 0x5235, 0x523C, /* 0x60 */
+ 0x523E, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524B, /* 0x70 */
+ 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0, /* 0x70 */
+ 0x5259, 0x525A, 0x525B, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, /* 0x80 */
+ 0x5264, 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x526E, 0x5270, /* 0x80 */
+ 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, /* 0x90 */
+ 0x527A, 0x527B, 0x527C, 0x527E, 0x5280, 0x5283, 0x5284, 0x5285, /* 0x90 */
+ 0x5286, 0x5287, 0x5289, 0x528A, 0x528B, 0x528C, 0x528D, 0x528E, /* 0xA0 */
+ 0x528F, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, /* 0xA0 */
+ 0x5299, 0x529A, 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, /* 0xB0 */
+ 0x52AF, 0x52B0, 0x52B4, 0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, /* 0xB0 */
+ 0x52BA, 0x52BB, 0x52BC, 0x52BD, 0x52C0, 0x52C1, 0x52C2, 0x52C4, /* 0xC0 */
+ 0x52C5, 0x52C6, 0x52C8, 0x52CA, 0x52CC, 0x52CD, 0x52CE, 0x52CF, /* 0xC0 */
+ 0x52D1, 0x52D3, 0x52D4, 0x52D5, 0x52D7, 0x52D9, 0x52DA, 0x52DB, /* 0xD0 */
+ 0x52DC, 0x52DD, 0x52DE, 0x52E0, 0x52E1, 0x52E2, 0x52E3, 0x52E5, /* 0xD0 */
+ 0x52E6, 0x52E7, 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, /* 0xE0 */
+ 0x52EE, 0x52EF, 0x52F1, 0x52F2, 0x52F3, 0x52F4, 0x52F5, 0x52F6, /* 0xE0 */
+ 0x52F7, 0x52F8, 0x52FB, 0x52FC, 0x52FD, 0x5301, 0x5302, 0x5303, /* 0xF0 */
+ 0x5304, 0x5307, 0x5309, 0x530A, 0x530B, 0x530C, 0x530E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B, 0x531C, 0x531E, /* 0x40 */
+ 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, /* 0x40 */
+ 0x532C, 0x532D, 0x532F, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, /* 0x50 */
+ 0x5335, 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5340, 0x5342, /* 0x50 */
+ 0x5344, 0x5346, 0x534B, 0x534C, 0x534D, 0x5350, 0x5354, 0x5358, /* 0x60 */
+ 0x5359, 0x535B, 0x535D, 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, /* 0x60 */
+ 0x5372, 0x5376, 0x5379, 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, /* 0x70 */
+ 0x5381, 0x5383, 0x5387, 0x5388, 0x538A, 0x538E, 0x538F, 0, /* 0x70 */
+ 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, /* 0x80 */
+ 0x539B, 0x539C, 0x539E, 0x53A0, 0x53A1, 0x53A4, 0x53A7, 0x53AA, /* 0x80 */
+ 0x53AB, 0x53AC, 0x53AD, 0x53AF, 0x53B0, 0x53B1, 0x53B2, 0x53B3, /* 0x90 */
+ 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, /* 0x90 */
+ 0x53BE, 0x53C0, 0x53C3, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, /* 0xA0 */
+ 0x53CF, 0x53D0, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, /* 0xA0 */
+ 0x53DE, 0x53E1, 0x53E2, 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, /* 0xB0 */
+ 0x5400, 0x5402, 0x5405, 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, /* 0xB0 */
+ 0x541A, 0x541C, 0x5422, 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, /* 0xC0 */
+ 0x5436, 0x5437, 0x543A, 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, /* 0xC0 */
+ 0x5445, 0x5447, 0x5449, 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, /* 0xD0 */
+ 0x545A, 0x545D, 0x545E, 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, /* 0xD0 */
+ 0x5467, 0x5469, 0x546A, 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, /* 0xE0 */
+ 0x5470, 0x5474, 0x5479, 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, /* 0xE0 */
+ 0x5485, 0x5487, 0x5488, 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, /* 0xF0 */
+ 0x5497, 0x5498, 0x549C, 0x549E, 0x549F, 0x54A0, 0x54A1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x54A2, 0x54A5, 0x54AE, 0x54B0, 0x54B2, 0x54B5, 0x54B6, 0x54B7, /* 0x40 */
+ 0x54B9, 0x54BA, 0x54BC, 0x54BE, 0x54C3, 0x54C5, 0x54CA, 0x54CB, /* 0x40 */
+ 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E1, 0x54E2, 0x54E3, 0x54E4, /* 0x50 */
+ 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4, 0x54F5, 0x54F6, /* 0x50 */
+ 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500, 0x5502, 0x5503, /* 0x60 */
+ 0x5504, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D, 0x550E, /* 0x60 */
+ 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551A, /* 0x70 */
+ 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526, 0, /* 0x70 */
+ 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536, /* 0x80 */
+ 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545, /* 0x80 */
+ 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x554F, 0x5551, /* 0x90 */
+ 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, /* 0x90 */
+ 0x555D, 0x555E, 0x555F, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, /* 0xA0 */
+ 0x556B, 0x556F, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, /* 0xA0 */
+ 0x557A, 0x557D, 0x557F, 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, /* 0xB0 */
+ 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, /* 0xB0 */
+ 0x559E, 0x55A0, 0x55A1, 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, /* 0xC0 */
+ 0x55A8, 0x55A9, 0x55AA, 0x55AB, 0x55AC, 0x55AD, 0x55AE, 0x55AF, /* 0xC0 */
+ 0x55B0, 0x55B2, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC, 0x55BF, /* 0xD0 */
+ 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C6, 0x55C7, 0x55C8, 0x55CA, /* 0xD0 */
+ 0x55CB, 0x55CE, 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, /* 0xE0 */
+ 0x55DA, 0x55DB, 0x55DE, 0x55E0, 0x55E2, 0x55E7, 0x55E9, 0x55ED, /* 0xE0 */
+ 0x55EE, 0x55F0, 0x55F1, 0x55F4, 0x55F6, 0x55F8, 0x55F9, 0x55FA, /* 0xF0 */
+ 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603, 0x5604, 0x5605 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5606, 0x5607, 0x560A, 0x560B, 0x560D, 0x5610, 0x5611, 0x5612, /* 0x40 */
+ 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561A, 0x561C, /* 0x40 */
+ 0x561D, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, /* 0x50 */
+ 0x562A, 0x562B, 0x562E, 0x562F, 0x5630, 0x5633, 0x5635, 0x5637, /* 0x50 */
+ 0x5638, 0x563A, 0x563C, 0x563D, 0x563E, 0x5640, 0x5641, 0x5642, /* 0x60 */
+ 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564A, /* 0x60 */
+ 0x564B, 0x564F, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, /* 0x70 */
+ 0x565A, 0x565B, 0x565D, 0x565E, 0x565F, 0x5660, 0x5661, 0, /* 0x70 */
+ 0x5663, 0x5665, 0x5666, 0x5667, 0x566D, 0x566E, 0x566F, 0x5670, /* 0x80 */
+ 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567A, /* 0x80 */
+ 0x567D, 0x567E, 0x567F, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, /* 0x90 */
+ 0x5687, 0x5688, 0x5689, 0x568A, 0x568B, 0x568C, 0x568D, 0x5690, /* 0x90 */
+ 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, /* 0xA0 */
+ 0x569A, 0x569B, 0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1, /* 0xA0 */
+ 0x56A2, 0x56A4, 0x56A5, 0x56A6, 0x56A7, 0x56A8, 0x56A9, 0x56AA, /* 0xB0 */
+ 0x56AB, 0x56AC, 0x56AD, 0x56AE, 0x56B0, 0x56B1, 0x56B2, 0x56B3, /* 0xB0 */
+ 0x56B4, 0x56B5, 0x56B6, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD, /* 0xC0 */
+ 0x56BE, 0x56BF, 0x56C0, 0x56C1, 0x56C2, 0x56C3, 0x56C4, 0x56C5, /* 0xC0 */
+ 0x56C6, 0x56C7, 0x56C8, 0x56C9, 0x56CB, 0x56CC, 0x56CD, 0x56CE, /* 0xD0 */
+ 0x56CF, 0x56D0, 0x56D1, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8, /* 0xD0 */
+ 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9, /* 0xE0 */
+ 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7, /* 0xE0 */
+ 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, /* 0xF0 */
+ 0x570B, 0x570C, 0x570D, 0x570E, 0x570F, 0x5710, 0x5711 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, /* 0x40 */
+ 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724, /* 0x40 */
+ 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735, /* 0x50 */
+ 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743, /* 0x50 */
+ 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753, /* 0x60 */
+ 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, /* 0x60 */
+ 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, /* 0x70 */
+ 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0, /* 0x70 */
+ 0x5781, 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, /* 0x80 */
+ 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, /* 0x80 */
+ 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, /* 0x90 */
+ 0x57AC, 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, /* 0x90 */
+ 0x57B9, 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0, /* 0xA0 */
+ 0x57C1, 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, /* 0xA0 */
+ 0x57CC, 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, /* 0xB0 */
+ 0x57DC, 0x57DE, 0x57E1, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, /* 0xB0 */
+ 0x57E8, 0x57E9, 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, /* 0xC0 */
+ 0x57F2, 0x57F3, 0x57F5, 0x57F6, 0x57F7, 0x57FB, 0x57FC, 0x57FE, /* 0xC0 */
+ 0x57FF, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580A, /* 0xD0 */
+ 0x580C, 0x580E, 0x580F, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, /* 0xD0 */
+ 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581D, 0x581F, 0x5822, /* 0xE0 */
+ 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B, 0x582C, /* 0xE0 */
+ 0x582D, 0x582E, 0x582F, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, /* 0xF0 */
+ 0x5837, 0x5838, 0x5839, 0x583A, 0x583B, 0x583C, 0x583D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x583E, 0x583F, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, /* 0x40 */
+ 0x5847, 0x5848, 0x5849, 0x584A, 0x584B, 0x584E, 0x584F, 0x5850, /* 0x40 */
+ 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585A, 0x585B, /* 0x50 */
+ 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, /* 0x50 */
+ 0x5866, 0x5867, 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, /* 0x60 */
+ 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, /* 0x60 */
+ 0x5878, 0x5879, 0x587A, 0x587B, 0x587C, 0x587D, 0x587F, 0x5882, /* 0x70 */
+ 0x5884, 0x5886, 0x5887, 0x5888, 0x588A, 0x588B, 0x588C, 0, /* 0x70 */
+ 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, /* 0x80 */
+ 0x5897, 0x5898, 0x589B, 0x589C, 0x589D, 0x58A0, 0x58A1, 0x58A2, /* 0x80 */
+ 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB, 0x58AC, /* 0x90 */
+ 0x58AD, 0x58AE, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B3, 0x58B4, /* 0x90 */
+ 0x58B5, 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BB, 0x58BD, /* 0xA0 */
+ 0x58BE, 0x58BF, 0x58C0, 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C7, /* 0xA0 */
+ 0x58C8, 0x58C9, 0x58CA, 0x58CB, 0x58CC, 0x58CD, 0x58CE, 0x58CF, /* 0xB0 */
+ 0x58D0, 0x58D2, 0x58D3, 0x58D4, 0x58D6, 0x58D7, 0x58D8, 0x58D9, /* 0xB0 */
+ 0x58DA, 0x58DB, 0x58DC, 0x58DD, 0x58DE, 0x58DF, 0x58E0, 0x58E1, /* 0xC0 */
+ 0x58E2, 0x58E3, 0x58E5, 0x58E6, 0x58E7, 0x58E8, 0x58E9, 0x58EA, /* 0xC0 */
+ 0x58ED, 0x58EF, 0x58F1, 0x58F2, 0x58F4, 0x58F5, 0x58F7, 0x58F8, /* 0xD0 */
+ 0x58FA, 0x58FB, 0x58FC, 0x58FD, 0x58FE, 0x58FF, 0x5900, 0x5901, /* 0xD0 */
+ 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C, /* 0xE0 */
+ 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B, /* 0xE0 */
+ 0x591D, 0x591E, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, /* 0xF0 */
+ 0x592C, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x593D, 0x593E, 0x593F, 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, /* 0x40 */
+ 0x594C, 0x594D, 0x5950, 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, /* 0x40 */
+ 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, /* 0x50 */
+ 0x5968, 0x5969, 0x596A, 0x596B, 0x596C, 0x596D, 0x596E, 0x596F, /* 0x50 */
+ 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B, 0x597C, /* 0x60 */
+ 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C, 0x598E, /* 0x60 */
+ 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A, 0x599B, /* 0x70 */
+ 0x599C, 0x599D, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0, /* 0x70 */
+ 0x59A7, 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, /* 0x80 */
+ 0x59B6, 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, /* 0x80 */
+ 0x59C1, 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, /* 0x90 */
+ 0x59CC, 0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, /* 0x90 */
+ 0x59DE, 0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, /* 0xA0 */
+ 0x59E9, 0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, /* 0xA0 */
+ 0x59F2, 0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, /* 0xB0 */
+ 0x59FC, 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, /* 0xB0 */
+ 0x5A0E, 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, /* 0xC0 */
+ 0x5A19, 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, /* 0xC0 */
+ 0x5A26, 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, /* 0xD0 */
+ 0x5A2F, 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, /* 0xD0 */
+ 0x5A3B, 0x5A3D, 0x5A3E, 0x5A3F, 0x5A41, 0x5A42, 0x5A43, 0x5A44, /* 0xE0 */
+ 0x5A45, 0x5A47, 0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, /* 0xE0 */
+ 0x5A50, 0x5A51, 0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, /* 0xF0 */
+ 0x5A59, 0x5A5B, 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5A61, 0x5A63, 0x5A64, 0x5A65, 0x5A66, 0x5A68, 0x5A69, 0x5A6B, /* 0x40 */
+ 0x5A6C, 0x5A6D, 0x5A6E, 0x5A6F, 0x5A70, 0x5A71, 0x5A72, 0x5A73, /* 0x40 */
+ 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D, 0x5A7E, 0x5A80, 0x5A81, /* 0x50 */
+ 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86, 0x5A87, 0x5A88, 0x5A89, /* 0x50 */
+ 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E, 0x5A8F, 0x5A90, 0x5A91, /* 0x60 */
+ 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97, 0x5A98, 0x5A99, 0x5A9C, /* 0x60 */
+ 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1, 0x5AA2, 0x5AA3, 0x5AA4, /* 0x70 */
+ 0x5AA5, 0x5AA6, 0x5AA7, 0x5AA8, 0x5AA9, 0x5AAB, 0x5AAC, 0, /* 0x70 */
+ 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6, 0x5AB7, /* 0x80 */
+ 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABD, 0x5ABF, 0x5AC0, 0x5AC3, /* 0x80 */
+ 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD, /* 0x90 */
+ 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD7, 0x5AD9, /* 0x90 */
+ 0x5ADA, 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, /* 0xA0 */
+ 0x5AE7, 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, /* 0xA0 */
+ 0x5AF2, 0x5AF3, 0x5AF4, 0x5AF5, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, /* 0xB0 */
+ 0x5AFA, 0x5AFB, 0x5AFC, 0x5AFD, 0x5AFE, 0x5AFF, 0x5B00, 0x5B01, /* 0xB0 */
+ 0x5B02, 0x5B03, 0x5B04, 0x5B05, 0x5B06, 0x5B07, 0x5B08, 0x5B0A, /* 0xC0 */
+ 0x5B0B, 0x5B0C, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11, 0x5B12, /* 0xC0 */
+ 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B19, 0x5B1A, 0x5B1B, 0x5B1C, /* 0xD0 */
+ 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B21, 0x5B22, 0x5B23, 0x5B24, /* 0xD0 */
+ 0x5B25, 0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2A, 0x5B2B, 0x5B2C, /* 0xE0 */
+ 0x5B2D, 0x5B2E, 0x5B2F, 0x5B30, 0x5B31, 0x5B33, 0x5B35, 0x5B36, /* 0xE0 */
+ 0x5B38, 0x5B39, 0x5B3A, 0x5B3B, 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, /* 0xF0 */
+ 0x5B41, 0x5B42, 0x5B43, 0x5B44, 0x5B45, 0x5B46, 0x5B47 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4C, 0x5B4D, 0x5B4E, 0x5B4F, /* 0x40 */
+ 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67, 0x5B68, 0x5B6B, /* 0x40 */
+ 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77, 0x5B78, /* 0x50 */
+ 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B7F, 0x5B82, 0x5B86, 0x5B8A, /* 0x50 */
+ 0x5B8D, 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, /* 0x60 */
+ 0x5BA7, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, /* 0x60 */
+ 0x5BB2, 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, /* 0x70 */
+ 0x5BC8, 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, 0, /* 0x70 */
+ 0x5BD1, 0x5BD4, 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, /* 0x80 */
+ 0x5BDB, 0x5BDC, 0x5BE0, 0x5BE2, 0x5BE3, 0x5BE6, 0x5BE7, 0x5BE9, /* 0x80 */
+ 0x5BEA, 0x5BEB, 0x5BEC, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3, /* 0x90 */
+ 0x5BF4, 0x5BF5, 0x5BF6, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, /* 0x90 */
+ 0x5C03, 0x5C05, 0x5C07, 0x5C08, 0x5C0B, 0x5C0C, 0x5C0D, 0x5C0E, /* 0xA0 */
+ 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E, 0x5C1F, /* 0xA0 */
+ 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A, 0x5C2B, /* 0xB0 */
+ 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35, 0x5C36, /* 0xB0 */
+ 0x5C37, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52, /* 0xC0 */
+ 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C, /* 0xC0 */
+ 0x5C5D, 0x5C5F, 0x5C62, 0x5C64, 0x5C67, 0x5C68, 0x5C69, 0x5C6A, /* 0xD0 */
+ 0x5C6B, 0x5C6C, 0x5C6D, 0x5C70, 0x5C72, 0x5C73, 0x5C74, 0x5C75, /* 0xD0 */
+ 0x5C76, 0x5C77, 0x5C78, 0x5C7B, 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, /* 0xE0 */
+ 0x5C83, 0x5C84, 0x5C85, 0x5C86, 0x5C87, 0x5C89, 0x5C8A, 0x5C8B, /* 0xE0 */
+ 0x5C8E, 0x5C8F, 0x5C92, 0x5C93, 0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, /* 0xF0 */
+ 0x5CA0, 0x5CA1, 0x5CA4, 0x5CA5, 0x5CA6, 0x5CA7, 0x5CA8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4, 0x5CB6, 0x5CB9, /* 0x40 */
+ 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2, 0x5CC3, 0x5CC5, /* 0x40 */
+ 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC, 0x5CCD, 0x5CCE, /* 0x50 */
+ 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5, 0x5CD6, 0x5CD7, /* 0x50 */
+ 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE, 0x5CDF, 0x5CE0, /* 0x60 */
+ 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC, 0x5CEE, 0x5CEF, /* 0x60 */
+ 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF4, 0x5CF5, 0x5CF6, 0x5CF7, 0x5CF8, /* 0x70 */
+ 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFD, 0x5CFE, 0x5CFF, 0x5D00, 0, /* 0x70 */
+ 0x5D01, 0x5D04, 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, /* 0x80 */
+ 0x5D0D, 0x5D0F, 0x5D10, 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D17, /* 0x80 */
+ 0x5D18, 0x5D19, 0x5D1A, 0x5D1C, 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, /* 0x90 */
+ 0x5D22, 0x5D23, 0x5D25, 0x5D28, 0x5D2A, 0x5D2B, 0x5D2C, 0x5D2F, /* 0x90 */
+ 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35, 0x5D36, 0x5D37, 0x5D38, /* 0xA0 */
+ 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F, 0x5D40, 0x5D41, 0x5D42, /* 0xA0 */
+ 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48, 0x5D49, 0x5D4D, 0x5D4E, /* 0xB0 */
+ 0x5D4F, 0x5D50, 0x5D51, 0x5D52, 0x5D53, 0x5D54, 0x5D55, 0x5D56, /* 0xB0 */
+ 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F, 0x5D60, 0x5D61, /* 0xC0 */
+ 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67, 0x5D68, 0x5D6A, /* 0xC0 */
+ 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73, 0x5D75, 0x5D76, /* 0xD0 */
+ 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C, 0x5D7D, 0x5D7E, /* 0xD0 */
+ 0x5D7F, 0x5D80, 0x5D81, 0x5D83, 0x5D84, 0x5D85, 0x5D86, 0x5D87, /* 0xE0 */
+ 0x5D88, 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, /* 0xE0 */
+ 0x5D90, 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D97, /* 0xF0 */
+ 0x5D98, 0x5D9A, 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4, 0x5DA5, 0x5DA6, 0x5DA7, 0x5DA8, /* 0x40 */
+ 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD, 0x5DAE, 0x5DAF, 0x5DB0, /* 0x40 */
+ 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5, 0x5DB6, 0x5DB8, 0x5DB9, /* 0x50 */
+ 0x5DBA, 0x5DBB, 0x5DBC, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1, /* 0x50 */
+ 0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA, /* 0x60 */
+ 0x5DCB, 0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD2, 0x5DD3, /* 0x60 */
+ 0x5DD4, 0x5DD5, 0x5DD6, 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, /* 0x70 */
+ 0x5DDF, 0x5DE0, 0x5DE3, 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0, /* 0x70 */
+ 0x5DF0, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9, 0x5DFA, 0x5DFB, 0x5DFC, /* 0x80 */
+ 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09, 0x5E0A, 0x5E0B, 0x5E0D, /* 0x80 */
+ 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E, 0x5E1F, 0x5E20, 0x5E21, /* 0x90 */
+ 0x5E22, 0x5E23, 0x5E24, 0x5E25, 0x5E28, 0x5E29, 0x5E2A, 0x5E2B, /* 0x90 */
+ 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E33, 0x5E34, 0x5E35, 0x5E36, /* 0xA0 */
+ 0x5E39, 0x5E3A, 0x5E3E, 0x5E3F, 0x5E40, 0x5E41, 0x5E43, 0x5E46, /* 0xA0 */
+ 0x5E47, 0x5E48, 0x5E49, 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, /* 0xB0 */
+ 0x5E50, 0x5E51, 0x5E52, 0x5E53, 0x5E56, 0x5E57, 0x5E58, 0x5E59, /* 0xB0 */
+ 0x5E5A, 0x5E5C, 0x5E5D, 0x5E5F, 0x5E60, 0x5E63, 0x5E64, 0x5E65, /* 0xC0 */
+ 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D, /* 0xC0 */
+ 0x5E6E, 0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E79, 0x5E7E, /* 0xD0 */
+ 0x5E81, 0x5E82, 0x5E83, 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, /* 0xD0 */
+ 0x5E8E, 0x5E92, 0x5E98, 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, /* 0xE0 */
+ 0x5EA4, 0x5EA8, 0x5EA9, 0x5EAA, 0x5EAB, 0x5EAC, 0x5EAE, 0x5EAF, /* 0xE0 */
+ 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4, 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, /* 0xF0 */
+ 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2, 0x5EC3, 0x5EC4, 0x5EC5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC, 0x5ECD, 0x5ECE, 0x5ECF, /* 0x40 */
+ 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8, 0x5ED9, 0x5EDA, 0x5EDC, /* 0x40 */
+ 0x5EDD, 0x5EDE, 0x5EDF, 0x5EE0, 0x5EE1, 0x5EE2, 0x5EE3, 0x5EE4, /* 0x50 */
+ 0x5EE5, 0x5EE6, 0x5EE7, 0x5EE9, 0x5EEB, 0x5EEC, 0x5EED, 0x5EEE, /* 0x50 */
+ 0x5EEF, 0x5EF0, 0x5EF1, 0x5EF2, 0x5EF3, 0x5EF5, 0x5EF8, 0x5EF9, /* 0x60 */
+ 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05, 0x5F06, 0x5F07, 0x5F09, 0x5F0C, /* 0x60 */
+ 0x5F0D, 0x5F0E, 0x5F10, 0x5F12, 0x5F14, 0x5F16, 0x5F19, 0x5F1A, /* 0x70 */
+ 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21, 0x5F22, 0x5F23, 0x5F24, 0, /* 0x70 */
+ 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F32, 0x5F33, 0x5F34, /* 0x80 */
+ 0x5F35, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E, 0x5F3F, /* 0x80 */
+ 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F46, 0x5F47, 0x5F48, /* 0x90 */
+ 0x5F49, 0x5F4A, 0x5F4B, 0x5F4C, 0x5F4D, 0x5F4E, 0x5F4F, 0x5F51, /* 0x90 */
+ 0x5F54, 0x5F59, 0x5F5A, 0x5F5B, 0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, /* 0xA0 */
+ 0x5F63, 0x5F65, 0x5F67, 0x5F68, 0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, /* 0xA0 */
+ 0x5F74, 0x5F75, 0x5F76, 0x5F78, 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, /* 0xB0 */
+ 0x5F83, 0x5F86, 0x5F8D, 0x5F8E, 0x5F8F, 0x5F91, 0x5F93, 0x5F94, /* 0xB0 */
+ 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9E, 0x5F9F, 0x5FA0, 0x5FA2, /* 0xC0 */
+ 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FA9, 0x5FAB, 0x5FAC, /* 0xC0 */
+ 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8, /* 0xD0 */
+ 0x5FB9, 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, /* 0xD0 */
+ 0x5FC7, 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, /* 0xE0 */
+ 0x5FDA, 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, /* 0xE0 */
+ 0x5FE6, 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, /* 0xF0 */
+ 0x5FF4, 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6008, 0x6009, 0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, /* 0x40 */
+ 0x6018, 0x601A, 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, /* 0x40 */
+ 0x602D, 0x602E, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, /* 0x50 */
+ 0x6037, 0x6038, 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, /* 0x50 */
+ 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, /* 0x60 */
+ 0x604F, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, /* 0x60 */
+ 0x605C, 0x605E, 0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, /* 0x70 */
+ 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607E, 0x6080, 0, /* 0x70 */
+ 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608A, 0x608B, /* 0x80 */
+ 0x608E, 0x608F, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, /* 0x80 */
+ 0x6099, 0x609C, 0x609E, 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, /* 0x90 */
+ 0x60A9, 0x60AA, 0x60AE, 0x60B0, 0x60B3, 0x60B5, 0x60B6, 0x60B7, /* 0x90 */
+ 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF, 0x60C0, 0x60C1, 0x60C2, /* 0xA0 */
+ 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9, 0x60CC, 0x60CD, 0x60CE, /* 0xA0 */
+ 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4, 0x60D6, 0x60D7, 0x60D9, /* 0xB0 */
+ 0x60DB, 0x60DE, 0x60E1, 0x60E2, 0x60E3, 0x60E4, 0x60E5, 0x60EA, /* 0xB0 */
+ 0x60F1, 0x60F2, 0x60F5, 0x60F7, 0x60F8, 0x60FB, 0x60FC, 0x60FD, /* 0xC0 */
+ 0x60FE, 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, /* 0xC0 */
+ 0x610B, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, /* 0xD0 */
+ 0x6117, 0x6118, 0x6119, 0x611B, 0x611C, 0x611D, 0x611E, 0x6121, /* 0xD0 */
+ 0x6122, 0x6125, 0x6128, 0x6129, 0x612A, 0x612C, 0x612D, 0x612E, /* 0xE0 */
+ 0x612F, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, /* 0xE0 */
+ 0x6137, 0x6138, 0x6139, 0x613A, 0x613B, 0x613C, 0x613D, 0x613E, /* 0xF0 */
+ 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6147, 0x6149, 0x614B, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153, /* 0x40 */
+ 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615A, 0x615B, 0x615C, /* 0x40 */
+ 0x615E, 0x615F, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, /* 0x50 */
+ 0x6169, 0x616A, 0x616B, 0x616C, 0x616D, 0x616E, 0x616F, 0x6171, /* 0x50 */
+ 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617A, 0x617B, /* 0x60 */
+ 0x617C, 0x617D, 0x617E, 0x617F, 0x6180, 0x6181, 0x6182, 0x6183, /* 0x60 */
+ 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618A, 0x618C, /* 0x70 */
+ 0x618D, 0x618F, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0, /* 0x70 */
+ 0x6196, 0x6197, 0x6198, 0x6199, 0x619A, 0x619B, 0x619C, 0x619E, /* 0x80 */
+ 0x619F, 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A4, 0x61A5, 0x61A6, /* 0x80 */
+ 0x61AA, 0x61AB, 0x61AD, 0x61AE, 0x61AF, 0x61B0, 0x61B1, 0x61B2, /* 0x90 */
+ 0x61B3, 0x61B4, 0x61B5, 0x61B6, 0x61B8, 0x61B9, 0x61BA, 0x61BB, /* 0x90 */
+ 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3, 0x61C4, 0x61C5, /* 0xA0 */
+ 0x61C6, 0x61C7, 0x61C9, 0x61CC, 0x61CD, 0x61CE, 0x61CF, 0x61D0, /* 0xA0 */
+ 0x61D3, 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, /* 0xB0 */
+ 0x61DC, 0x61DD, 0x61DE, 0x61DF, 0x61E0, 0x61E1, 0x61E2, 0x61E3, /* 0xB0 */
+ 0x61E4, 0x61E5, 0x61E7, 0x61E8, 0x61E9, 0x61EA, 0x61EB, 0x61EC, /* 0xC0 */
+ 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1, 0x61F2, 0x61F3, 0x61F4, /* 0xC0 */
+ 0x61F6, 0x61F7, 0x61F8, 0x61F9, 0x61FA, 0x61FB, 0x61FC, 0x61FD, /* 0xD0 */
+ 0x61FE, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, /* 0xD0 */
+ 0x6209, 0x6213, 0x6214, 0x6219, 0x621C, 0x621D, 0x621E, 0x6220, /* 0xE0 */
+ 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F, /* 0xE0 */
+ 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, /* 0xF0 */
+ 0x623B, 0x623C, 0x6242, 0x6244, 0x6245, 0x6246, 0x624A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x624F, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, /* 0x40 */
+ 0x625D, 0x625E, 0x625F, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, /* 0x40 */
+ 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, /* 0x50 */
+ 0x627B, 0x627D, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, /* 0x50 */
+ 0x6288, 0x628B, 0x628C, 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, /* 0x60 */
+ 0x6299, 0x629C, 0x629D, 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, /* 0x60 */
+ 0x62AA, 0x62AD, 0x62AE, 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, /* 0x70 */
+ 0x62B6, 0x62B7, 0x62B8, 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0, /* 0x70 */
+ 0x62C3, 0x62CB, 0x62CF, 0x62D1, 0x62D5, 0x62DD, 0x62DE, 0x62E0, /* 0x80 */
+ 0x62E1, 0x62E4, 0x62EA, 0x62EB, 0x62F0, 0x62F2, 0x62F5, 0x62F8, /* 0x80 */
+ 0x62F9, 0x62FA, 0x62FB, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, /* 0x90 */
+ 0x630A, 0x630B, 0x630C, 0x630D, 0x630F, 0x6310, 0x6312, 0x6313, /* 0x90 */
+ 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631C, 0x6326, 0x6327, /* 0xA0 */
+ 0x6329, 0x632C, 0x632D, 0x632E, 0x6330, 0x6331, 0x6333, 0x6334, /* 0xA0 */
+ 0x6335, 0x6336, 0x6337, 0x6338, 0x633B, 0x633C, 0x633E, 0x633F, /* 0xB0 */
+ 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634A, 0x6351, 0x6352, /* 0xB0 */
+ 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635A, 0x635B, /* 0xC0 */
+ 0x635C, 0x635D, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636A, /* 0xC0 */
+ 0x636B, 0x636C, 0x636F, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, /* 0xD0 */
+ 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6383, /* 0xD0 */
+ 0x6384, 0x6385, 0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, /* 0xE0 */
+ 0x6395, 0x6397, 0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, /* 0xE0 */
+ 0x639F, 0x63A1, 0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, /* 0xF0 */
+ 0x63B5, 0x63B6, 0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x63C1, 0x63C2, 0x63C3, 0x63C5, 0x63C7, 0x63C8, 0x63CA, 0x63CB, /* 0x40 */
+ 0x63CC, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63D7, 0x63D8, 0x63D9, /* 0x40 */
+ 0x63DA, 0x63DB, 0x63DC, 0x63DD, 0x63DF, 0x63E2, 0x63E4, 0x63E5, /* 0x50 */
+ 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC, 0x63EE, 0x63EF, 0x63F0, /* 0x50 */
+ 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA, 0x63FB, 0x63FC, /* 0x60 */
+ 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640A, /* 0x60 */
+ 0x640D, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, /* 0x70 */
+ 0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0, /* 0x70 */
+ 0x6425, 0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, /* 0x80 */
+ 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, /* 0x80 */
+ 0x643B, 0x643C, 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, /* 0x90 */
+ 0x644C, 0x644D, 0x644E, 0x644F, 0x6450, 0x6451, 0x6453, 0x6455, /* 0x90 */
+ 0x6456, 0x6457, 0x6459, 0x645A, 0x645B, 0x645C, 0x645D, 0x645F, /* 0xA0 */
+ 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, /* 0xA0 */
+ 0x646A, 0x646B, 0x646C, 0x646E, 0x646F, 0x6470, 0x6471, 0x6472, /* 0xB0 */
+ 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647B, 0x647C, 0x647D, /* 0xB0 */
+ 0x647E, 0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, /* 0xC0 */
+ 0x648A, 0x648B, 0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6493, /* 0xC0 */
+ 0x6494, 0x6497, 0x6498, 0x649A, 0x649B, 0x649C, 0x649D, 0x649F, /* 0xD0 */
+ 0x64A0, 0x64A1, 0x64A2, 0x64A3, 0x64A5, 0x64A6, 0x64A7, 0x64A8, /* 0xD0 */
+ 0x64AA, 0x64AB, 0x64AF, 0x64B1, 0x64B2, 0x64B3, 0x64B4, 0x64B6, /* 0xE0 */
+ 0x64B9, 0x64BB, 0x64BD, 0x64BE, 0x64BF, 0x64C1, 0x64C3, 0x64C4, /* 0xE0 */
+ 0x64C6, 0x64C7, 0x64C8, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CF, /* 0xF0 */
+ 0x64D1, 0x64D3, 0x64D4, 0x64D5, 0x64D6, 0x64D9, 0x64DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x64DB, 0x64DC, 0x64DD, 0x64DF, 0x64E0, 0x64E1, 0x64E3, 0x64E5, /* 0x40 */
+ 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB, 0x64EC, 0x64ED, 0x64EE, /* 0x40 */
+ 0x64EF, 0x64F0, 0x64F1, 0x64F2, 0x64F3, 0x64F4, 0x64F5, 0x64F6, /* 0x50 */
+ 0x64F7, 0x64F8, 0x64F9, 0x64FA, 0x64FB, 0x64FC, 0x64FD, 0x64FE, /* 0x50 */
+ 0x64FF, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, /* 0x60 */
+ 0x6508, 0x650A, 0x650B, 0x650C, 0x650D, 0x650E, 0x650F, 0x6510, /* 0x60 */
+ 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651A, /* 0x70 */
+ 0x651B, 0x651C, 0x651D, 0x651E, 0x651F, 0x6520, 0x6521, 0, /* 0x70 */
+ 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652A, /* 0x80 */
+ 0x652C, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653A, /* 0x80 */
+ 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, /* 0x90 */
+ 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550, 0x6552, 0x6553, /* 0x90 */
+ 0x6554, 0x6557, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560, 0x6561, /* 0xA0 */
+ 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D, 0x656E, /* 0xA0 */
+ 0x656F, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657A, /* 0xB0 */
+ 0x657B, 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6582, /* 0xB0 */
+ 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658A, 0x658D, /* 0xC0 */
+ 0x658E, 0x658F, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659A, /* 0xC0 */
+ 0x659D, 0x659E, 0x65A0, 0x65A2, 0x65A3, 0x65A6, 0x65A8, 0x65AA, /* 0xD0 */
+ 0x65AC, 0x65AE, 0x65B1, 0x65B2, 0x65B3, 0x65B4, 0x65B5, 0x65B6, /* 0xD0 */
+ 0x65B7, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF, 0x65C0, 0x65C2, /* 0xE0 */
+ 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0, 0x65D1, 0x65D3, /* 0xE0 */
+ 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB, 0x65DC, 0x65DD, /* 0xF0 */
+ 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA, 0x65EB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB, 0x65FC, /* 0x40 */
+ 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, /* 0x40 */
+ 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, /* 0x50 */
+ 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622, 0x6623, /* 0x50 */
+ 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, /* 0x60 */
+ 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B, 0x663D, /* 0x60 */
+ 0x663F, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, /* 0x70 */
+ 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0, /* 0x70 */
+ 0x6659, 0x665B, 0x665C, 0x665D, 0x665E, 0x6660, 0x6662, 0x6663, /* 0x80 */
+ 0x6665, 0x6667, 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, /* 0x80 */
+ 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, /* 0x90 */
+ 0x667F, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, /* 0x90 */
+ 0x668A, 0x668B, 0x668D, 0x668E, 0x668F, 0x6690, 0x6692, 0x6693, /* 0xA0 */
+ 0x6694, 0x6695, 0x6698, 0x6699, 0x669A, 0x669B, 0x669C, 0x669E, /* 0xA0 */
+ 0x669F, 0x66A0, 0x66A1, 0x66A2, 0x66A3, 0x66A4, 0x66A5, 0x66A6, /* 0xB0 */
+ 0x66A9, 0x66AA, 0x66AB, 0x66AC, 0x66AD, 0x66AF, 0x66B0, 0x66B1, /* 0xB0 */
+ 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8, 0x66BA, 0x66BB, /* 0xC0 */
+ 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2, 0x66C3, 0x66C4, /* 0xC0 */
+ 0x66C5, 0x66C6, 0x66C7, 0x66C8, 0x66C9, 0x66CA, 0x66CB, 0x66CC, /* 0xD0 */
+ 0x66CD, 0x66CE, 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, /* 0xD0 */
+ 0x66D5, 0x66D6, 0x66D7, 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E0, /* 0xE0 */
+ 0x66E1, 0x66E2, 0x66E3, 0x66E4, 0x66E5, 0x66E7, 0x66E8, 0x66EA, /* 0xE0 */
+ 0x66EB, 0x66EC, 0x66ED, 0x66EE, 0x66EF, 0x66F1, 0x66F5, 0x66F6, /* 0xF0 */
+ 0x66F8, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702, 0x6703 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711, /* 0x40 */
+ 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E, /* 0x40 */
+ 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, /* 0x50 */
+ 0x672E, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, /* 0x50 */
+ 0x673B, 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, /* 0x60 */
+ 0x674A, 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, /* 0x60 */
+ 0x6759, 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, /* 0x70 */
+ 0x6767, 0x676B, 0x676C, 0x676E, 0x6771, 0x6774, 0x6776, 0, /* 0x70 */
+ 0x6778, 0x6779, 0x677A, 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, /* 0x80 */
+ 0x6785, 0x6786, 0x6788, 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, /* 0x80 */
+ 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, /* 0x90 */
+ 0x67A0, 0x67A1, 0x67A4, 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, /* 0x90 */
+ 0x67B2, 0x67B4, 0x67B9, 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, /* 0xA0 */
+ 0x67BF, 0x67C0, 0x67C2, 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, /* 0xA0 */
+ 0x67CA, 0x67CB, 0x67CC, 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, /* 0xB0 */
+ 0x67DB, 0x67DF, 0x67E1, 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, /* 0xB0 */
+ 0x67EA, 0x67EB, 0x67ED, 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, /* 0xC0 */
+ 0x67F8, 0x67F9, 0x67FA, 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, /* 0xC0 */
+ 0x6803, 0x6804, 0x6806, 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, /* 0xD0 */
+ 0x6818, 0x6819, 0x681A, 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, /* 0xD0 */
+ 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, /* 0xE0 */
+ 0x682C, 0x682D, 0x682E, 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, /* 0xE0 */
+ 0x6836, 0x683A, 0x683B, 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, /* 0xF0 */
+ 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685A, 0x685B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x685C, 0x685D, 0x685E, 0x685F, 0x686A, 0x686C, 0x686D, 0x686E, /* 0x40 */
+ 0x686F, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, /* 0x40 */
+ 0x687A, 0x687B, 0x687C, 0x687D, 0x687E, 0x687F, 0x6880, 0x6882, /* 0x50 */
+ 0x6884, 0x6887, 0x6888, 0x6889, 0x688A, 0x688B, 0x688C, 0x688D, /* 0x50 */
+ 0x688E, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, /* 0x60 */
+ 0x6899, 0x689A, 0x689B, 0x689C, 0x689D, 0x689E, 0x689F, 0x68A0, /* 0x60 */
+ 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB, 0x68AC, /* 0x70 */
+ 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8, 0, /* 0x70 */
+ 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1, /* 0x80 */
+ 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC, /* 0x80 */
+ 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D6, 0x68D7, /* 0x90 */
+ 0x68D9, 0x68DB, 0x68DC, 0x68DD, 0x68DE, 0x68DF, 0x68E1, 0x68E2, /* 0x90 */
+ 0x68E4, 0x68E5, 0x68E6, 0x68E7, 0x68E8, 0x68E9, 0x68EA, 0x68EB, /* 0xA0 */
+ 0x68EC, 0x68ED, 0x68EF, 0x68F2, 0x68F3, 0x68F4, 0x68F6, 0x68F7, /* 0xA0 */
+ 0x68F8, 0x68FB, 0x68FD, 0x68FE, 0x68FF, 0x6900, 0x6902, 0x6903, /* 0xB0 */
+ 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690A, 0x690C, 0x690F, /* 0xB0 */
+ 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, /* 0xC0 */
+ 0x691A, 0x691B, 0x691C, 0x691D, 0x691E, 0x6921, 0x6922, 0x6923, /* 0xC0 */
+ 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692A, 0x692B, 0x692C, /* 0xD0 */
+ 0x692E, 0x692F, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, /* 0xD0 */
+ 0x6938, 0x693A, 0x693B, 0x693C, 0x693E, 0x6940, 0x6941, 0x6943, /* 0xE0 */
+ 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694A, 0x694B, /* 0xE0 */
+ 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951, 0x6952, 0x6953, /* 0xF0 */
+ 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696A, /* 0x40 */
+ 0x696C, 0x696D, 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, /* 0x40 */
+ 0x6976, 0x697A, 0x697B, 0x697D, 0x697E, 0x697F, 0x6981, 0x6983, /* 0x50 */
+ 0x6985, 0x698A, 0x698B, 0x698C, 0x698E, 0x698F, 0x6990, 0x6991, /* 0x50 */
+ 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699A, 0x699D, 0x699E, /* 0x60 */
+ 0x699F, 0x69A0, 0x69A1, 0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, /* 0x60 */
+ 0x69A9, 0x69AA, 0x69AC, 0x69AE, 0x69AF, 0x69B0, 0x69B2, 0x69B3, /* 0x70 */
+ 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA, 0x69BC, 0x69BD, 0, /* 0x70 */
+ 0x69BE, 0x69BF, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5, 0x69C6, /* 0x80 */
+ 0x69C7, 0x69C8, 0x69C9, 0x69CB, 0x69CD, 0x69CF, 0x69D1, 0x69D2, /* 0x80 */
+ 0x69D3, 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, /* 0x90 */
+ 0x69DD, 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6, /* 0x90 */
+ 0x69E7, 0x69E8, 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, /* 0xA0 */
+ 0x69F0, 0x69F1, 0x69F3, 0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, /* 0xA0 */
+ 0x69F9, 0x69FA, 0x69FB, 0x69FC, 0x69FE, 0x6A00, 0x6A01, 0x6A02, /* 0xB0 */
+ 0x6A03, 0x6A04, 0x6A05, 0x6A06, 0x6A07, 0x6A08, 0x6A09, 0x6A0B, /* 0xB0 */
+ 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11, 0x6A12, 0x6A13, /* 0xC0 */
+ 0x6A14, 0x6A15, 0x6A16, 0x6A19, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D, /* 0xC0 */
+ 0x6A1E, 0x6A20, 0x6A22, 0x6A23, 0x6A24, 0x6A25, 0x6A26, 0x6A27, /* 0xD0 */
+ 0x6A29, 0x6A2B, 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, /* 0xD0 */
+ 0x6A34, 0x6A36, 0x6A37, 0x6A38, 0x6A39, 0x6A3A, 0x6A3B, 0x6A3C, /* 0xE0 */
+ 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43, 0x6A45, 0x6A46, 0x6A48, /* 0xE0 */
+ 0x6A49, 0x6A4A, 0x6A4B, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F, 0x6A51, /* 0xF0 */
+ 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A5C, 0x6A5D, 0x6A5E, 0x6A5F, 0x6A60, 0x6A62, 0x6A63, 0x6A64, /* 0x40 */
+ 0x6A66, 0x6A67, 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, /* 0x40 */
+ 0x6A6E, 0x6A6F, 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, /* 0x50 */
+ 0x6A77, 0x6A78, 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, /* 0x50 */
+ 0x6A82, 0x6A83, 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A89, 0x6A8A, /* 0x60 */
+ 0x6A8B, 0x6A8C, 0x6A8D, 0x6A8F, 0x6A92, 0x6A93, 0x6A94, 0x6A95, /* 0x60 */
+ 0x6A96, 0x6A98, 0x6A99, 0x6A9A, 0x6A9B, 0x6A9C, 0x6A9D, 0x6A9E, /* 0x70 */
+ 0x6A9F, 0x6AA1, 0x6AA2, 0x6AA3, 0x6AA4, 0x6AA5, 0x6AA6, 0, /* 0x70 */
+ 0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AAF, 0x6AB0, 0x6AB1, /* 0x80 */
+ 0x6AB2, 0x6AB3, 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB8, 0x6AB9, /* 0x80 */
+ 0x6ABA, 0x6ABB, 0x6ABC, 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, /* 0x90 */
+ 0x6AC2, 0x6AC3, 0x6AC4, 0x6AC5, 0x6AC6, 0x6AC7, 0x6AC8, 0x6AC9, /* 0x90 */
+ 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE, 0x6ACF, 0x6AD0, 0x6AD1, /* 0xA0 */
+ 0x6AD2, 0x6AD3, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7, 0x6AD8, 0x6AD9, /* 0xA0 */
+ 0x6ADA, 0x6ADB, 0x6ADC, 0x6ADD, 0x6ADE, 0x6ADF, 0x6AE0, 0x6AE1, /* 0xB0 */
+ 0x6AE2, 0x6AE3, 0x6AE4, 0x6AE5, 0x6AE6, 0x6AE7, 0x6AE8, 0x6AE9, /* 0xB0 */
+ 0x6AEA, 0x6AEB, 0x6AEC, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0, 0x6AF1, /* 0xC0 */
+ 0x6AF2, 0x6AF3, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF8, 0x6AF9, /* 0xC0 */
+ 0x6AFA, 0x6AFB, 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, /* 0xD0 */
+ 0x6B02, 0x6B03, 0x6B04, 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, /* 0xD0 */
+ 0x6B0A, 0x6B0B, 0x6B0C, 0x6B0D, 0x6B0E, 0x6B0F, 0x6B10, 0x6B11, /* 0xE0 */
+ 0x6B12, 0x6B13, 0x6B14, 0x6B15, 0x6B16, 0x6B17, 0x6B18, 0x6B19, /* 0xE0 */
+ 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1E, 0x6B1F, 0x6B25, 0x6B26, /* 0xF0 */
+ 0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6B2F, 0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, /* 0x40 */
+ 0x6B3B, 0x6B3C, 0x6B3D, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, /* 0x40 */
+ 0x6B45, 0x6B48, 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B50, /* 0x50 */
+ 0x6B51, 0x6B52, 0x6B53, 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, /* 0x50 */
+ 0x6B5A, 0x6B5B, 0x6B5C, 0x6B5D, 0x6B5E, 0x6B5F, 0x6B60, 0x6B61, /* 0x60 */
+ 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D, 0x6B6E, 0x6B6F, 0x6B70, /* 0x60 */
+ 0x6B71, 0x6B72, 0x6B73, 0x6B74, 0x6B75, 0x6B76, 0x6B77, 0x6B78, /* 0x70 */
+ 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0, /* 0x70 */
+ 0x6B8C, 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, /* 0x80 */
+ 0x6B98, 0x6B99, 0x6B9C, 0x6B9D, 0x6B9E, 0x6B9F, 0x6BA0, 0x6BA2, /* 0x80 */
+ 0x6BA3, 0x6BA4, 0x6BA5, 0x6BA6, 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAB, /* 0x90 */
+ 0x6BAC, 0x6BAD, 0x6BAE, 0x6BAF, 0x6BB0, 0x6BB1, 0x6BB2, 0x6BB6, /* 0x90 */
+ 0x6BB8, 0x6BB9, 0x6BBA, 0x6BBB, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, /* 0xA0 */
+ 0x6BC3, 0x6BC4, 0x6BC6, 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, /* 0xA0 */
+ 0x6BCE, 0x6BD0, 0x6BD1, 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, /* 0xB0 */
+ 0x6BDF, 0x6BE0, 0x6BE2, 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, /* 0xB0 */
+ 0x6BE8, 0x6BE9, 0x6BEC, 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, /* 0xC0 */
+ 0x6BF4, 0x6BF6, 0x6BF7, 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, /* 0xC0 */
+ 0x6BFF, 0x6C00, 0x6C01, 0x6C02, 0x6C03, 0x6C04, 0x6C08, 0x6C09, /* 0xD0 */
+ 0x6C0A, 0x6C0B, 0x6C0C, 0x6C0E, 0x6C12, 0x6C17, 0x6C1C, 0x6C1D, /* 0xD0 */
+ 0x6C1E, 0x6C20, 0x6C23, 0x6C25, 0x6C2B, 0x6C2C, 0x6C2D, 0x6C31, /* 0xE0 */
+ 0x6C33, 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, /* 0xE0 */
+ 0x6C3F, 0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, /* 0xF0 */
+ 0x6C4E, 0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6C59, 0x6C5A, 0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, /* 0x40 */
+ 0x6C6C, 0x6C6D, 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, /* 0x40 */
+ 0x6C78, 0x6C7A, 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, /* 0x50 */
+ 0x6C8A, 0x6C8B, 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, /* 0x50 */
+ 0x6C97, 0x6C98, 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, /* 0x60 */
+ 0x6CA8, 0x6CAC, 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, /* 0x60 */
+ 0x6CBA, 0x6CC0, 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, /* 0x70 */
+ 0x6CCB, 0x6CCD, 0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0, /* 0x70 */
+ 0x6CD9, 0x6CDA, 0x6CDC, 0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, /* 0x80 */
+ 0x6CE9, 0x6CEC, 0x6CED, 0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, /* 0x80 */
+ 0x6D02, 0x6D03, 0x6D05, 0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, /* 0x90 */
+ 0x6D0F, 0x6D10, 0x6D11, 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, /* 0x90 */
+ 0x6D1C, 0x6D1D, 0x6D1F, 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, /* 0xA0 */
+ 0x6D26, 0x6D28, 0x6D29, 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, /* 0xA0 */
+ 0x6D36, 0x6D37, 0x6D38, 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, /* 0xB0 */
+ 0x6D49, 0x6D4C, 0x6D50, 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, /* 0xB0 */
+ 0x6D5D, 0x6D5F, 0x6D61, 0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, /* 0xC0 */
+ 0x6D6B, 0x6D6C, 0x6D6D, 0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, /* 0xC0 */
+ 0x6D76, 0x6D79, 0x6D7A, 0x6D7B, 0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, /* 0xD0 */
+ 0x6D81, 0x6D83, 0x6D84, 0x6D86, 0x6D87, 0x6D8A, 0x6D8B, 0x6D8D, /* 0xD0 */
+ 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97, 0x6D98, 0x6D99, 0x6D9A, /* 0xE0 */
+ 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD, 0x6DB0, 0x6DB1, 0x6DB3, /* 0xE0 */
+ 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA, 0x6DBB, 0x6DBC, 0x6DBD, /* 0xF0 */
+ 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8, 0x6DC9, 0x6DCA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3, 0x6DD4, 0x6DD5, /* 0x40 */
+ 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2, 0x6DE3, 0x6DE5, /* 0x40 */
+ 0x6DE7, 0x6DE8, 0x6DE9, 0x6DEA, 0x6DED, 0x6DEF, 0x6DF0, 0x6DF2, /* 0x50 */
+ 0x6DF4, 0x6DF5, 0x6DF6, 0x6DF8, 0x6DFA, 0x6DFD, 0x6DFE, 0x6DFF, /* 0x50 */
+ 0x6E00, 0x6E01, 0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, /* 0x60 */
+ 0x6E09, 0x6E0B, 0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, /* 0x60 */
+ 0x6E1B, 0x6E1C, 0x6E1E, 0x6E1F, 0x6E22, 0x6E26, 0x6E27, 0x6E28, /* 0x70 */
+ 0x6E2A, 0x6E2C, 0x6E2E, 0x6E30, 0x6E31, 0x6E33, 0x6E35, 0, /* 0x70 */
+ 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C, 0x6E3D, 0x6E3E, 0x6E3F, /* 0x80 */
+ 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47, 0x6E48, 0x6E49, /* 0x80 */
+ 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51, 0x6E52, 0x6E55, /* 0x90 */
+ 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E5E, 0x6E60, 0x6E61, /* 0x90 */
+ 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68, 0x6E69, /* 0xA0 */
+ 0x6E6A, 0x6E6C, 0x6E6D, 0x6E6F, 0x6E70, 0x6E71, 0x6E72, 0x6E73, /* 0xA0 */
+ 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B, /* 0xB0 */
+ 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88, /* 0xB0 */
+ 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93, /* 0xC0 */
+ 0x6E94, 0x6E95, 0x6E96, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9D, /* 0xC0 */
+ 0x6E9E, 0x6EA0, 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, /* 0xD0 */
+ 0x6EAB, 0x6EAC, 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, /* 0xD0 */
+ 0x6EB9, 0x6EBC, 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC4, 0x6EC5, /* 0xE0 */
+ 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA, 0x6ECC, 0x6ECD, 0x6ECE, 0x6ED0, /* 0xE0 */
+ 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC, 0x6EDD, 0x6EE3, /* 0xF0 */
+ 0x6EE7, 0x6EEA, 0x6EEB, 0x6EEC, 0x6EED, 0x6EEE, 0x6EEF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6EF0, 0x6EF1, 0x6EF2, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EF7, 0x6EF8, /* 0x40 */
+ 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD, 0x6EFE, 0x6EFF, 0x6F00, 0x6F01, /* 0x40 */
+ 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A, 0x6F0B, 0x6F0C, /* 0x50 */
+ 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16, 0x6F17, 0x6F18, /* 0x50 */
+ 0x6F19, 0x6F1A, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F, 0x6F21, /* 0x60 */
+ 0x6F22, 0x6F23, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2C, 0x6F2E, /* 0x60 */
+ 0x6F30, 0x6F32, 0x6F34, 0x6F35, 0x6F37, 0x6F38, 0x6F39, 0x6F3A, /* 0x70 */
+ 0x6F3B, 0x6F3C, 0x6F3D, 0x6F3F, 0x6F40, 0x6F41, 0x6F42, 0, /* 0x70 */
+ 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C, 0x6F4E, /* 0x80 */
+ 0x6F4F, 0x6F50, 0x6F51, 0x6F52, 0x6F53, 0x6F54, 0x6F55, 0x6F56, /* 0x80 */
+ 0x6F57, 0x6F59, 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, /* 0x90 */
+ 0x6F63, 0x6F64, 0x6F65, 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, /* 0x90 */
+ 0x6F6C, 0x6F6F, 0x6F70, 0x6F71, 0x6F73, 0x6F75, 0x6F76, 0x6F77, /* 0xA0 */
+ 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F7F, 0x6F80, 0x6F81, 0x6F82, /* 0xA0 */
+ 0x6F83, 0x6F85, 0x6F86, 0x6F87, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, /* 0xB0 */
+ 0x6F91, 0x6F92, 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F97, 0x6F98, /* 0xB0 */
+ 0x6F99, 0x6F9A, 0x6F9B, 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA0, 0x6FA2, /* 0xC0 */
+ 0x6FA3, 0x6FA4, 0x6FA5, 0x6FA6, 0x6FA8, 0x6FA9, 0x6FAA, 0x6FAB, /* 0xC0 */
+ 0x6FAC, 0x6FAD, 0x6FAE, 0x6FAF, 0x6FB0, 0x6FB1, 0x6FB2, 0x6FB4, /* 0xD0 */
+ 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE, /* 0xD0 */
+ 0x6FBF, 0x6FC1, 0x6FC3, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, /* 0xE0 */
+ 0x6FCA, 0x6FCB, 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, /* 0xE0 */
+ 0x6FD4, 0x6FD5, 0x6FD6, 0x6FD7, 0x6FD8, 0x6FD9, 0x6FDA, 0x6FDB, /* 0xF0 */
+ 0x6FDC, 0x6FDD, 0x6FDF, 0x6FE2, 0x6FE3, 0x6FE4, 0x6FE5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEB, 0x6FEC, 0x6FED, /* 0x40 */
+ 0x6FF0, 0x6FF1, 0x6FF2, 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, /* 0x40 */
+ 0x6FF8, 0x6FF9, 0x6FFA, 0x6FFB, 0x6FFC, 0x6FFD, 0x6FFE, 0x6FFF, /* 0x50 */
+ 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, /* 0x50 */
+ 0x7008, 0x7009, 0x700A, 0x700B, 0x700C, 0x700D, 0x700E, 0x700F, /* 0x60 */
+ 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, /* 0x60 */
+ 0x7019, 0x701C, 0x701D, 0x701E, 0x701F, 0x7020, 0x7021, 0x7022, /* 0x70 */
+ 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702A, 0, /* 0x70 */
+ 0x702B, 0x702C, 0x702D, 0x702E, 0x702F, 0x7030, 0x7031, 0x7032, /* 0x80 */
+ 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703A, 0x703B, 0x703C, /* 0x80 */
+ 0x703D, 0x703E, 0x703F, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, /* 0x90 */
+ 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D, /* 0x90 */
+ 0x704E, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, /* 0xA0 */
+ 0x7057, 0x7058, 0x7059, 0x705A, 0x705B, 0x705C, 0x705D, 0x705F, /* 0xA0 */
+ 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, /* 0xB0 */
+ 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073, 0x7074, /* 0xB0 */
+ 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082, 0x7083, /* 0xC0 */
+ 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D, 0x708F, /* 0xC0 */
+ 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B, 0x709E, /* 0xD0 */
+ 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5, 0x70A6, /* 0xD0 */
+ 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4, 0x70B5, /* 0xE0 */
+ 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6, 0x70C7, /* 0xE0 */
+ 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70CF, 0x70D0, 0x70D1, /* 0xF0 */
+ 0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x70DC, 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, /* 0x40 */
+ 0x70EA, 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F4, 0x70F5, /* 0x40 */
+ 0x70F6, 0x70F8, 0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, /* 0x50 */
+ 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, /* 0x50 */
+ 0x710B, 0x710C, 0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, /* 0x60 */
+ 0x7117, 0x711B, 0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7121, /* 0x60 */
+ 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712A, /* 0x70 */
+ 0x712B, 0x712C, 0x712D, 0x712E, 0x7132, 0x7133, 0x7134, 0, /* 0x70 */
+ 0x7135, 0x7137, 0x7138, 0x7139, 0x713A, 0x713B, 0x713C, 0x713D, /* 0x80 */
+ 0x713E, 0x713F, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, /* 0x80 */
+ 0x7147, 0x7148, 0x7149, 0x714B, 0x714D, 0x714F, 0x7150, 0x7151, /* 0x90 */
+ 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, /* 0x90 */
+ 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161, 0x7162, 0x7163, /* 0xA0 */
+ 0x7165, 0x7169, 0x716A, 0x716B, 0x716C, 0x716D, 0x716F, 0x7170, /* 0xA0 */
+ 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, /* 0xB0 */
+ 0x717E, 0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, /* 0xB0 */
+ 0x7187, 0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, /* 0xC0 */
+ 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719A, 0x719B, /* 0xC0 */
+ 0x719C, 0x719D, 0x719E, 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, /* 0xD0 */
+ 0x71A6, 0x71A7, 0x71A9, 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, /* 0xD0 */
+ 0x71B0, 0x71B1, 0x71B2, 0x71B4, 0x71B6, 0x71B7, 0x71B8, 0x71BA, /* 0xE0 */
+ 0x71BB, 0x71BC, 0x71BD, 0x71BE, 0x71BF, 0x71C0, 0x71C1, 0x71C2, /* 0xE0 */
+ 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C8, 0x71C9, 0x71CA, 0x71CB, /* 0xF0 */
+ 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D2, 0x71D3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_A0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x71D6, 0x71D7, 0x71D8, 0x71D9, 0x71DA, 0x71DB, 0x71DC, 0x71DD, /* 0x40 */
+ 0x71DE, 0x71DF, 0x71E1, 0x71E2, 0x71E3, 0x71E4, 0x71E6, 0x71E8, /* 0x40 */
+ 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71ED, 0x71EF, 0x71F0, 0x71F1, /* 0x50 */
+ 0x71F2, 0x71F3, 0x71F4, 0x71F5, 0x71F6, 0x71F7, 0x71F8, 0x71FA, /* 0x50 */
+ 0x71FB, 0x71FC, 0x71FD, 0x71FE, 0x71FF, 0x7200, 0x7201, 0x7202, /* 0x60 */
+ 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B, /* 0x60 */
+ 0x720C, 0x720D, 0x720E, 0x720F, 0x7210, 0x7211, 0x7212, 0x7213, /* 0x70 */
+ 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721A, 0, /* 0x70 */
+ 0x721B, 0x721C, 0x721E, 0x721F, 0x7220, 0x7221, 0x7222, 0x7223, /* 0x80 */
+ 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722B, 0x722D, 0x722E, /* 0x80 */
+ 0x722F, 0x7232, 0x7233, 0x7234, 0x723A, 0x723C, 0x723E, 0x7240, /* 0x90 */
+ 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A, /* 0x90 */
+ 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, /* 0xA0 */
+ 0x7257, 0x7258, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, /* 0xA0 */
+ 0x7265, 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, /* 0xB0 */
+ 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x727D, /* 0xB0 */
+ 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, /* 0xC0 */
+ 0x728E, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, /* 0xC0 */
+ 0x7298, 0x7299, 0x729A, 0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, /* 0xD0 */
+ 0x72A1, 0x72A2, 0x72A3, 0x72A4, 0x72A5, 0x72A6, 0x72A7, 0x72A8, /* 0xD0 */
+ 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1, 0x72B2, 0x72B3, 0x72B5, /* 0xE0 */
+ 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE, 0x72BF, 0x72C0, 0x72C5, /* 0xE0 */
+ 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC, 0x72CF, 0x72D1, /* 0xF0 */
+ 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA, 0x72DB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* Changes: */
+/* A1_A4: GB == 0x30FB, MS936 == 0x00B7, APPLE_CHINSIMP == 0x00B7 - we use in all systems 0x00B7 for better MS compatibility */
+/* A1_AA: GB == 0x2015, MS936 == 0x2014, APPLE_CHINSIMP == 0x2014 - we use in all systems 0x2014 for better MS compatibility */
+/* A1_AB: GB == 0xFF5E, MS936 == 0xFF5E, APPLE_CHINSIMP == 0x301C - we use in all systems 0xFF5E for better MS compatibility */
+/* A1_AD: GB == 0x2026, MS936 == 0x2026, APPLE_CHINSIMP == 0x22EF - we use in all systems 0x2026 for better MS compatibility */
+/* A1_E9: GB == 0xFFE0, MS936 == 0xFFE0, APPLE_CHINSIMP == 0x00A2 - we use in all systems 0xFFE0 for better MS compatibility */
+/* A1_EA: GB == 0xFFE1, MS936 == 0xFFE1, APPLE_CHINSIMP == 0x00A3 - we use in all systems 0xFFE1 for better MS compatibility */
+
+static sal_uInt16 const aImplDBCSToUniTab_GB_A1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, /* 0xA0 */
+ 0x3003, 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, /* 0xA0 */
+ 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, /* 0xB0 */
+ 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, /* 0xB0 */
+ 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, /* 0xC0 */
+ 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, /* 0xC0 */
+ 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, /* 0xD0 */
+ 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, /* 0xD0 */
+ 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, /* 0xE0 */
+ 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, /* 0xE0 */
+ 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, /* 0xF0 */
+ 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* A2_A1-A2_AA is a MS 936 extension, but we use this on all systems for better MS compatibility */
+
+static sal_uInt16 const aImplDBCSToUniTab_GB_A2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, /* 0xA0 */
+ 0x2177, 0x2178, 0x2179, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, /* 0xB0 */
+ 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, /* 0xB0 */
+ 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, /* 0xC0 */
+ 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, /* 0xC0 */
+ 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, /* 0xD0 */
+ 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, /* 0xD0 */
+ 0x2467, 0x2468, 0x2469, 0, 0, 0x3220, 0x3221, 0x3222, /* 0xE0 */
+ 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0, /* 0xE0 */
+ 0, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, /* 0xF0 */
+ 0x2167, 0x2168, 0x2169, 0x216A, 0x216B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* Changes: */
+/* A3_A4: GB == 0xFFE5, MS936 == 0xFFE5, APPLE_CHINSIMP == 0x00A5 - we use in all systems 0xFFE5 for better MS compatibility */
+/* A3_FE: GB == 0xFFE3, MS936 == 0xFFE3, APPLE_CHINSIMP == 0x203E - we use in all systems 0xFFE3 for better MS compatibility */
+
+static sal_uInt16 const aImplDBCSToUniTab_GB_A3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, /* 0xA0 */
+ 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, /* 0xA0 */
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, /* 0xB0 */
+ 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, /* 0xB0 */
+ 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, /* 0xC0 */
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, /* 0xC0 */
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, /* 0xD0 */
+ 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, /* 0xD0 */
+ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, /* 0xE0 */
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 0xE0 */
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, /* 0xF0 */
+ 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GB_A4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, /* 0xA0 */
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, /* 0xA0 */
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, /* 0xB0 */
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, /* 0xB0 */
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, /* 0xC0 */
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, /* 0xC0 */
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, /* 0xD0 */
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, /* 0xD0 */
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, /* 0xE0 */
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, /* 0xE0 */
+ 0x3090, 0x3091, 0x3092, 0x3093 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GB_A5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, /* 0xA0 */
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, /* 0xA0 */
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, /* 0xB0 */
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, /* 0xB0 */
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, /* 0xC0 */
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, /* 0xC0 */
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, /* 0xD0 */
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, /* 0xD0 */
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, /* 0xE0 */
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, /* 0xE0 */
+ 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GB_A6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0xA0 */
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, /* 0xA0 */
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, /* 0xB0 */
+ 0x03A9, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, /* 0xC0 */
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, /* 0xC0 */
+ 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, /* 0xD0 */
+ 0x03C9, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xFE35, 0xFE36, 0xFE39, 0xFE3A, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, /* 0xE0 */
+ 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0, 0, 0xFE3B, 0xFE3C, /* 0xE0 */
+ 0xFE37, 0xFE38, 0xFE31, 0, 0xFE33, 0xFE34 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GB_A7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, /* 0xA0 */
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, /* 0xA0 */
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, /* 0xB0 */
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, /* 0xB0 */
+ 0x042E, 0x042F, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, /* 0xD0 */
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, /* 0xD0 */
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, /* 0xE0 */
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, /* 0xE0 */
+ 0x044E, 0x044F /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* A8_BC come from APPLE_CHINSIMP */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_A8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, /* 0x40 */
+ 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221F, 0x2223, /* 0x40 */
+ 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550, 0x2551, 0x2552, 0x2553, /* 0x50 */
+ 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, /* 0x50 */
+ 0x255C, 0x255D, 0x255E, 0x255F, 0x2560, 0x2561, 0x2562, 0x2563, /* 0x60 */
+ 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, /* 0x60 */
+ 0x256C, 0x256D, 0x256E, 0x256F, 0x2570, 0x2571, 0x2572, 0x2573, /* 0x70 */
+ 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0, /* 0x70 */
+ 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D, 0x258E, 0x258F, /* 0x80 */
+ 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2, 0x25E3, 0x25E4, /* 0x80 */
+ 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, /* 0xA0 */
+ 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, /* 0xA0 */
+ 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, /* 0xB0 */
+ 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x1E3F, 0x0144, 0x0148, 0, /* 0xB0 */
+ 0x0261, 0, 0, 0, 0, 0x3105, 0x3106, 0x3107, /* 0xC0 */
+ 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, /* 0xC0 */
+ 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, /* 0xD0 */
+ 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, /* 0xD0 */
+ 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, /* 0xE0 */
+ 0x3128, 0x3129 /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_A9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, /* 0x40 */
+ 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1, /* 0x40 */
+ 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4, /* 0x50 */
+ 0, 0x2121, 0x3231, 0, 0x2010, 0, 0, 0, /* 0x50 */
+ 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE, 0x3006, 0x309D, 0x309E, /* 0x60 */
+ 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, 0xFE50, /* 0x60 */
+ 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFE59, 0xFE5A, /* 0x70 */
+ 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, 0xFE60, 0xFE61, 0, /* 0x70 */
+ 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68, 0xFE69, 0xFE6A, /* 0x80 */
+ 0xFE6B, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0x3007, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0x2500, 0x2501, 0x2502, 0x2503, /* 0xA0 */
+ 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, /* 0xA0 */
+ 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, /* 0xB0 */
+ 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, /* 0xB0 */
+ 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, /* 0xC0 */
+ 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, /* 0xC0 */
+ 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, /* 0xD0 */
+ 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, /* 0xD0 */
+ 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, /* 0xE0 */
+ 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_AA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5, 0x72E6, /* 0x40 */
+ 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72F9, 0x72FD, 0x72FE, /* 0x40 */
+ 0x72FF, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, /* 0x50 */
+ 0x7309, 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, /* 0x50 */
+ 0x7314, 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, /* 0x60 */
+ 0x7326, 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, /* 0x60 */
+ 0x7335, 0x7336, 0x733A, 0x733B, 0x733C, 0x733D, 0x7340, 0x7341, /* 0x70 */
+ 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0, /* 0x70 */
+ 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351, 0x7353, /* 0x80 */
+ 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B, 0x735C, /* 0x80 */
+ 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, /* 0x90 */
+ 0x7366, 0x7367, 0x7368, 0x7369, 0x736A, 0x736B, 0x736E, 0x7370, /* 0x90 */
+ 0x7371 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_AB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, /* 0x40 */
+ 0x737A, 0x737B, 0x737C, 0x737D, 0x737F, 0x7380, 0x7381, 0x7382, /* 0x40 */
+ 0x7383, 0x7385, 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, /* 0x50 */
+ 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, /* 0x50 */
+ 0x739A, 0x739C, 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, /* 0x60 */
+ 0x73A5, 0x73A6, 0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, /* 0x60 */
+ 0x73B4, 0x73B5, 0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, /* 0x70 */
+ 0x73BF, 0x73C1, 0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, 0, /* 0x70 */
+ 0x73CB, 0x73CC, 0x73CE, 0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, /* 0x80 */
+ 0x73D7, 0x73D8, 0x73DA, 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, /* 0x80 */
+ 0x73E2, 0x73E3, 0x73E4, 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, /* 0x90 */
+ 0x73EE, 0x73EF, 0x73F0, 0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, /* 0x90 */
+ 0x73F7 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_AC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x73F8, 0x73F9, 0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FE, 0x73FF, /* 0x40 */
+ 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740B, 0x740C, /* 0x40 */
+ 0x740D, 0x740E, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, /* 0x50 */
+ 0x7417, 0x7418, 0x7419, 0x741C, 0x741D, 0x741E, 0x741F, 0x7420, /* 0x50 */
+ 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742B, 0x742D, 0x742F, /* 0x60 */
+ 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743A, 0x743B, 0x743D, /* 0x60 */
+ 0x743E, 0x743F, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, /* 0x70 */
+ 0x7447, 0x7448, 0x7449, 0x744A, 0x744B, 0x744C, 0x744D, 0, /* 0x70 */
+ 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, /* 0x80 */
+ 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, /* 0x80 */
+ 0x7466, 0x7467, 0x7468, 0x7469, 0x746A, 0x746B, 0x746C, 0x746E, /* 0x90 */
+ 0x746F, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, /* 0x90 */
+ 0x747A /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_AD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486, /* 0x40 */
+ 0x7488, 0x7489, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, /* 0x40 */
+ 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, /* 0x50 */
+ 0x749B, 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A3, 0x74A4, /* 0x50 */
+ 0x74A5, 0x74A6, 0x74AA, 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, /* 0x60 */
+ 0x74B0, 0x74B1, 0x74B2, 0x74B3, 0x74B4, 0x74B5, 0x74B6, 0x74B7, /* 0x60 */
+ 0x74B8, 0x74B9, 0x74BB, 0x74BC, 0x74BD, 0x74BE, 0x74BF, 0x74C0, /* 0x70 */
+ 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5, 0x74C6, 0x74C7, 0, /* 0x70 */
+ 0x74C8, 0x74C9, 0x74CA, 0x74CB, 0x74CC, 0x74CD, 0x74CE, 0x74CF, /* 0x80 */
+ 0x74D0, 0x74D1, 0x74D3, 0x74D4, 0x74D5, 0x74D6, 0x74D7, 0x74D8, /* 0x80 */
+ 0x74D9, 0x74DA, 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, /* 0x90 */
+ 0x74E8, 0x74E9, 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, /* 0x90 */
+ 0x74F2 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_AE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x74F3, 0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, /* 0x40 */
+ 0x74FE, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, /* 0x40 */
+ 0x7508, 0x7509, 0x750A, 0x750B, 0x750C, 0x750E, 0x7510, 0x7512, /* 0x50 */
+ 0x7514, 0x7515, 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, /* 0x50 */
+ 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, /* 0x60 */
+ 0x7534, 0x7536, 0x7539, 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, /* 0x60 */
+ 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, /* 0x70 */
+ 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0, /* 0x70 */
+ 0x755D, 0x755E, 0x755F, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, /* 0x80 */
+ 0x7567, 0x7568, 0x7569, 0x756B, 0x756C, 0x756D, 0x756E, 0x756F, /* 0x80 */
+ 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757A, 0x757B, /* 0x90 */
+ 0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, /* 0x90 */
+ 0x7587 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_AF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593, /* 0x40 */
+ 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7, /* 0x40 */
+ 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB, /* 0x50 */
+ 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF, /* 0x50 */
+ 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75D9, 0x75DA, 0x75DC, 0x75DD, /* 0x60 */
+ 0x75DF, 0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, /* 0x60 */
+ 0x75EF, 0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, /* 0x70 */
+ 0x75FB, 0x75FD, 0x75FE, 0x7602, 0x7604, 0x7606, 0x7607, 0, /* 0x70 */
+ 0x7608, 0x7609, 0x760B, 0x760D, 0x760E, 0x760F, 0x7611, 0x7612, /* 0x80 */
+ 0x7613, 0x7614, 0x7616, 0x761A, 0x761C, 0x761D, 0x761E, 0x7621, /* 0x80 */
+ 0x7623, 0x7627, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632, /* 0x90 */
+ 0x7636, 0x7637, 0x7639, 0x763A, 0x763B, 0x763D, 0x7641, 0x7642, /* 0x90 */
+ 0x7644 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764A, 0x764B, 0x764E, /* 0x40 */
+ 0x764F, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, /* 0x40 */
+ 0x7659, 0x765A, 0x765B, 0x765D, 0x765F, 0x7660, 0x7661, 0x7662, /* 0x50 */
+ 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766A, 0x766C, /* 0x50 */
+ 0x766D, 0x766E, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, /* 0x60 */
+ 0x7676, 0x7677, 0x7679, 0x767A, 0x767C, 0x767F, 0x7680, 0x7681, /* 0x60 */
+ 0x7683, 0x7685, 0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, /* 0x70 */
+ 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769A, 0x769B, 0, /* 0x70 */
+ 0x769C, 0x769D, 0x769E, 0x769F, 0x76A0, 0x76A1, 0x76A2, 0x76A3, /* 0x80 */
+ 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76A9, 0x76AA, 0x76AB, 0x76AC, /* 0x80 */
+ 0x76AD, 0x76AF, 0x76B0, 0x76B3, 0x76B5, 0x76B6, 0x76B7, 0x76B8, /* 0x90 */
+ 0x76B9, 0x76BA, 0x76BB, 0x76BC, 0x76BD, 0x76BE, 0x76C0, 0x76C1, /* 0x90 */
+ 0x76C3, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, /* 0xA0 */
+ 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698, /* 0xA0 */
+ 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, /* 0xB0 */
+ 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, /* 0xB0 */
+ 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, /* 0xC0 */
+ 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, /* 0xC0 */
+ 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D, /* 0xD0 */
+ 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591, /* 0xD0 */
+ 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E, /* 0xE0 */
+ 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E, /* 0xE0 */
+ 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551, /* 0xF0 */
+ 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC, 0x76D3, 0x76D5, 0x76D9, /* 0x40 */
+ 0x76DA, 0x76DC, 0x76DD, 0x76DE, 0x76E0, 0x76E1, 0x76E2, 0x76E3, /* 0x40 */
+ 0x76E4, 0x76E6, 0x76E7, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, /* 0x50 */
+ 0x76ED, 0x76F0, 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, /* 0x50 */
+ 0x76FD, 0x76FF, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, /* 0x60 */
+ 0x770C, 0x770E, 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, /* 0x60 */
+ 0x7715, 0x7716, 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, /* 0x70 */
+ 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0, /* 0x70 */
+ 0x772C, 0x772E, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, /* 0x80 */
+ 0x773B, 0x773D, 0x773E, 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, /* 0x80 */
+ 0x7748, 0x7749, 0x774A, 0x774B, 0x774C, 0x774D, 0x774E, 0x774F, /* 0x90 */
+ 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, /* 0x90 */
+ 0x775C, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1, /* 0xA0 */
+ 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2, /* 0xA0 */
+ 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8, /* 0xB0 */
+ 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, /* 0xB0 */
+ 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, /* 0xC0 */
+ 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5, /* 0xC0 */
+ 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A, /* 0xD0 */
+ 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9, /* 0xD0 */
+ 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9, /* 0xE0 */
+ 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B, /* 0xE0 */
+ 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448, /* 0xF0 */
+ 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x775D, 0x775E, 0x775F, 0x7760, 0x7764, 0x7767, 0x7769, 0x776A, /* 0x40 */
+ 0x776D, 0x776E, 0x776F, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, /* 0x40 */
+ 0x7775, 0x7776, 0x7777, 0x7778, 0x777A, 0x777B, 0x777C, 0x7781, /* 0x50 */
+ 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778A, 0x778B, /* 0x50 */
+ 0x778F, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, /* 0x60 */
+ 0x7799, 0x779A, 0x779B, 0x779C, 0x779D, 0x779E, 0x77A1, 0x77A3, /* 0x60 */
+ 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AD, 0x77AE, 0x77AF, 0x77B1, /* 0x70 */
+ 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA, 0, /* 0x70 */
+ 0x77BC, 0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, /* 0x80 */
+ 0x77C6, 0x77C7, 0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, /* 0x80 */
+ 0x77CF, 0x77D0, 0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, /* 0x90 */
+ 0x77D8, 0x77D9, 0x77DA, 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, /* 0x90 */
+ 0x77E4, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, /* 0xA0 */
+ 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, /* 0xA0 */
+ 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, /* 0xB0 */
+ 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, /* 0xB0 */
+ 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, /* 0xC0 */
+ 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, /* 0xC0 */
+ 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, /* 0xD0 */
+ 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, /* 0xD0 */
+ 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, /* 0xE0 */
+ 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, /* 0xE0 */
+ 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, /* 0xF0 */
+ 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x77E6, 0x77E8, 0x77EA, 0x77EF, 0x77F0, 0x77F1, 0x77F2, 0x77F4, /* 0x40 */
+ 0x77F5, 0x77F7, 0x77F9, 0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, /* 0x40 */
+ 0x7805, 0x7806, 0x7807, 0x7808, 0x780A, 0x780B, 0x780E, 0x780F, /* 0x50 */
+ 0x7810, 0x7813, 0x7815, 0x7819, 0x781B, 0x781E, 0x7820, 0x7821, /* 0x50 */
+ 0x7822, 0x7824, 0x7828, 0x782A, 0x782B, 0x782E, 0x782F, 0x7831, /* 0x60 */
+ 0x7832, 0x7833, 0x7835, 0x7836, 0x783D, 0x783F, 0x7841, 0x7842, /* 0x60 */
+ 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784A, 0x784B, 0x784D, /* 0x70 */
+ 0x784F, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785A, 0, /* 0x70 */
+ 0x785B, 0x785C, 0x785E, 0x785F, 0x7860, 0x7861, 0x7862, 0x7863, /* 0x80 */
+ 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786F, 0x7870, /* 0x80 */
+ 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, /* 0x90 */
+ 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882, /* 0x90 */
+ 0x7883, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, /* 0xA0 */
+ 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, /* 0xA0 */
+ 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, /* 0xB0 */
+ 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, /* 0xB0 */
+ 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, /* 0xC0 */
+ 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, /* 0xC0 */
+ 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, /* 0xD0 */
+ 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, /* 0xD0 */
+ 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, /* 0xE0 */
+ 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, /* 0xE0 */
+ 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, /* 0xF0 */
+ 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F, 0x7890, /* 0x40 */
+ 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E, 0x78A0, /* 0x40 */
+ 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78A9, 0x78AA, 0x78AB, 0x78AC, /* 0x50 */
+ 0x78AD, 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78B8, 0x78BA, /* 0x50 */
+ 0x78BB, 0x78BC, 0x78BD, 0x78BF, 0x78C0, 0x78C2, 0x78C3, 0x78C4, /* 0x60 */
+ 0x78C6, 0x78C7, 0x78C8, 0x78CC, 0x78CD, 0x78CE, 0x78CF, 0x78D1, /* 0x60 */
+ 0x78D2, 0x78D3, 0x78D6, 0x78D7, 0x78D8, 0x78DA, 0x78DB, 0x78DC, /* 0x70 */
+ 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1, 0x78E2, 0x78E3, 0, /* 0x70 */
+ 0x78E4, 0x78E5, 0x78E6, 0x78E7, 0x78E9, 0x78EA, 0x78EB, 0x78ED, /* 0x80 */
+ 0x78EE, 0x78EF, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, /* 0x80 */
+ 0x78F9, 0x78FB, 0x78FC, 0x78FD, 0x78FE, 0x78FF, 0x7900, 0x7902, /* 0x90 */
+ 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, /* 0x90 */
+ 0x790C, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3, /* 0xA0 */
+ 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE, /* 0xA0 */
+ 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376, /* 0xB0 */
+ 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF, /* 0xB0 */
+ 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E, /* 0xC0 */
+ 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A, /* 0xC0 */
+ 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B, /* 0xD0 */
+ 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC, /* 0xD0 */
+ 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, /* 0xE0 */
+ 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE, /* 0xE0 */
+ 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, /* 0xF0 */
+ 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x790D, 0x790E, 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, /* 0x40 */
+ 0x7916, 0x7917, 0x7918, 0x7919, 0x791A, 0x791B, 0x791C, 0x791D, /* 0x40 */
+ 0x791F, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, /* 0x50 */
+ 0x7928, 0x7929, 0x792A, 0x792B, 0x792C, 0x792D, 0x792E, 0x792F, /* 0x50 */
+ 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, /* 0x60 */
+ 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, /* 0x60 */
+ 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951, /* 0x70 */
+ 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0, /* 0x70 */
+ 0x7964, 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, /* 0x80 */
+ 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, /* 0x80 */
+ 0x797C, 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, /* 0x90 */
+ 0x7988, 0x7989, 0x798B, 0x798C, 0x798D, 0x798E, 0x7990, 0x7991, /* 0x90 */
+ 0x7992, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8, /* 0xA0 */
+ 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39, /* 0xA0 */
+ 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363, /* 0xB0 */
+ 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC, /* 0xB0 */
+ 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B, /* 0xC0 */
+ 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, /* 0xC0 */
+ 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, /* 0xD0 */
+ 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0, /* 0xD0 */
+ 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535, /* 0xE0 */
+ 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889, /* 0xE0 */
+ 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03, /* 0xF0 */
+ 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, /* 0x40 */
+ 0x799C, 0x799D, 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, /* 0x40 */
+ 0x79A4, 0x79A5, 0x79A6, 0x79A8, 0x79A9, 0x79AA, 0x79AB, 0x79AC, /* 0x50 */
+ 0x79AD, 0x79AE, 0x79AF, 0x79B0, 0x79B1, 0x79B2, 0x79B4, 0x79B5, /* 0x50 */
+ 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4, 0x79C5, /* 0x60 */
+ 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0, 0x79D3, /* 0x60 */
+ 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC, 0x79DD, /* 0x70 */
+ 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA, 0, /* 0x70 */
+ 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6, /* 0x80 */
+ 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04, /* 0x80 */
+ 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10, /* 0x90 */
+ 0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B, /* 0x90 */
+ 0x7A1C, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, /* 0xA0 */
+ 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, /* 0xA0 */
+ 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, /* 0xB0 */
+ 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, /* 0xB0 */
+ 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, /* 0xC0 */
+ 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, /* 0xC0 */
+ 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, /* 0xD0 */
+ 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, /* 0xD0 */
+ 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, /* 0xE0 */
+ 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, /* 0xE0 */
+ 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, /* 0xF0 */
+ 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26, 0x7A27, /* 0x40 */
+ 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2E, 0x7A2F, /* 0x40 */
+ 0x7A30, 0x7A31, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, /* 0x50 */
+ 0x7A3E, 0x7A40, 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47, /* 0x50 */
+ 0x7A48, 0x7A49, 0x7A4A, 0x7A4B, 0x7A4C, 0x7A4D, 0x7A4E, 0x7A4F, /* 0x60 */
+ 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55, 0x7A56, 0x7A58, 0x7A59, /* 0x60 */
+ 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E, 0x7A5F, 0x7A60, 0x7A61, /* 0x70 */
+ 0x7A62, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68, 0, /* 0x70 */
+ 0x7A69, 0x7A6A, 0x7A6B, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, /* 0x80 */
+ 0x7A72, 0x7A73, 0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, /* 0x80 */
+ 0x7A85, 0x7A87, 0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, /* 0x90 */
+ 0x7A90, 0x7A93, 0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, /* 0x90 */
+ 0x7AA2, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, /* 0xA0 */
+ 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, /* 0xA0 */
+ 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, /* 0xB0 */
+ 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, /* 0xB0 */
+ 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, /* 0xC0 */
+ 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, /* 0xC0 */
+ 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, /* 0xD0 */
+ 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, /* 0xD0 */
+ 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, /* 0xE0 */
+ 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, /* 0xE0 */
+ 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, /* 0xF0 */
+ 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7AA3, 0x7AA4, 0x7AA7, 0x7AA9, 0x7AAA, 0x7AAB, 0x7AAE, 0x7AAF, /* 0x40 */
+ 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4, 0x7AB5, 0x7AB6, 0x7AB7, 0x7AB8, /* 0x40 */
+ 0x7AB9, 0x7ABA, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE, 0x7AC0, 0x7AC1, /* 0x50 */
+ 0x7AC2, 0x7AC3, 0x7AC4, 0x7AC5, 0x7AC6, 0x7AC7, 0x7AC8, 0x7AC9, /* 0x50 */
+ 0x7ACA, 0x7ACC, 0x7ACD, 0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, /* 0x60 */
+ 0x7AD3, 0x7AD4, 0x7AD5, 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, /* 0x60 */
+ 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEA, /* 0x70 */
+ 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0, 0x7AF1, 0x7AF2, 0x7AF3, 0, /* 0x70 */
+ 0x7AF4, 0x7AF5, 0x7AF6, 0x7AF7, 0x7AF8, 0x7AFB, 0x7AFC, 0x7AFE, /* 0x80 */
+ 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09, 0x7B0C, 0x7B0D, /* 0x80 */
+ 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17, 0x7B18, 0x7B1A, /* 0x90 */
+ 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23, 0x7B27, 0x7B29, /* 0x90 */
+ 0x7B2D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A, /* 0xA0 */
+ 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, /* 0xA0 */
+ 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C, /* 0xB0 */
+ 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A, /* 0xB0 */
+ 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6, /* 0xC0 */
+ 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76, /* 0xC0 */
+ 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38, /* 0xD0 */
+ 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, /* 0xD0 */
+ 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5, /* 0xE0 */
+ 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769, /* 0xE0 */
+ 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404, /* 0xF0 */
+ 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_B9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35, 0x7B36, 0x7B37, 0x7B39, /* 0x40 */
+ 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B42, 0x7B43, 0x7B44, /* 0x40 */
+ 0x7B46, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53, 0x7B55, 0x7B57, /* 0x50 */
+ 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63, 0x7B64, 0x7B65, /* 0x50 */
+ 0x7B66, 0x7B67, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C, 0x7B6D, /* 0x60 */
+ 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A, 0x7B7C, /* 0x60 */
+ 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86, 0x7B87, /* 0x70 */
+ 0x7B88, 0x7B89, 0x7B8A, 0x7B8B, 0x7B8C, 0x7B8E, 0x7B8F, 0, /* 0x70 */
+ 0x7B91, 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, /* 0x80 */
+ 0x7B9E, 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, /* 0x80 */
+ 0x7BB0, 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, /* 0x90 */
+ 0x7BBB, 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC0, 0x7BC2, 0x7BC3, /* 0x90 */
+ 0x7BC4, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, /* 0xA0 */
+ 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E, /* 0xA0 */
+ 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7, /* 0xB0 */
+ 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, /* 0xB0 */
+ 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8, /* 0xC0 */
+ 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC, /* 0xC0 */
+ 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, /* 0xD0 */
+ 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF, /* 0xD0 */
+ 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D, /* 0xE0 */
+ 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678, /* 0xE0 */
+ 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD, /* 0xF0 */
+ 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_BA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7BC5, 0x7BC8, 0x7BC9, 0x7BCA, 0x7BCB, 0x7BCD, 0x7BCE, 0x7BCF, /* 0x40 */
+ 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5, 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, /* 0x40 */
+ 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0, 0x7BE2, 0x7BE3, 0x7BE4, 0x7BE7, /* 0x50 */
+ 0x7BE8, 0x7BE9, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF, 0x7BF0, 0x7BF2, /* 0x50 */
+ 0x7BF3, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA, 0x7BFB, /* 0x60 */
+ 0x7BFD, 0x7BFF, 0x7C00, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05, /* 0x60 */
+ 0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0D, 0x7C0E, 0x7C10, 0x7C11, /* 0x70 */
+ 0x7C12, 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0, /* 0x70 */
+ 0x7C1A, 0x7C1B, 0x7C1C, 0x7C1D, 0x7C1E, 0x7C20, 0x7C21, 0x7C22, /* 0x80 */
+ 0x7C23, 0x7C24, 0x7C25, 0x7C28, 0x7C29, 0x7C2B, 0x7C2C, 0x7C2D, /* 0x80 */
+ 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33, 0x7C34, 0x7C35, /* 0x90 */
+ 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C, 0x7C3D, 0x7C3E, /* 0x90 */
+ 0x7C42, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, /* 0xA0 */
+ 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, /* 0xA0 */
+ 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, /* 0xB0 */
+ 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, /* 0xB0 */
+ 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, /* 0xC0 */
+ 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, /* 0xC0 */
+ 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, /* 0xD0 */
+ 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, /* 0xD0 */
+ 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, /* 0xE0 */
+ 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, /* 0xE0 */
+ 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, /* 0xF0 */
+ 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_BB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7C43, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A, /* 0x40 */
+ 0x7C4B, 0x7C4C, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, /* 0x40 */
+ 0x7C54, 0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, /* 0x50 */
+ 0x7C5C, 0x7C5D, 0x7C5E, 0x7C5F, 0x7C60, 0x7C61, 0x7C62, 0x7C63, /* 0x50 */
+ 0x7C64, 0x7C65, 0x7C66, 0x7C67, 0x7C68, 0x7C69, 0x7C6A, 0x7C6B, /* 0x60 */
+ 0x7C6C, 0x7C6D, 0x7C6E, 0x7C6F, 0x7C70, 0x7C71, 0x7C72, 0x7C75, /* 0x60 */
+ 0x7C76, 0x7C77, 0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, /* 0x70 */
+ 0x7C81, 0x7C82, 0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, 0, /* 0x70 */
+ 0x7C88, 0x7C8A, 0x7C8B, 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, /* 0x80 */
+ 0x7C93, 0x7C94, 0x7C96, 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, /* 0x80 */
+ 0x7CA3, 0x7CA6, 0x7CA7, 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, /* 0x90 */
+ 0x7CAF, 0x7CB0, 0x7CB4, 0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, /* 0x90 */
+ 0x7CBB, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, /* 0xA0 */
+ 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, /* 0xA0 */
+ 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, /* 0xB0 */
+ 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, /* 0xB0 */
+ 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, /* 0xC0 */
+ 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, /* 0xC0 */
+ 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, /* 0xD0 */
+ 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, /* 0xD0 */
+ 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, /* 0xE0 */
+ 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, /* 0xE0 */
+ 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, /* 0xF0 */
+ 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_BC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7CBF, 0x7CC0, 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, /* 0x40 */
+ 0x7CCE, 0x7CCF, 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, /* 0x40 */
+ 0x7CDA, 0x7CDB, 0x7CDD, 0x7CDE, 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, /* 0x50 */
+ 0x7CE5, 0x7CE6, 0x7CE7, 0x7CE9, 0x7CEA, 0x7CEB, 0x7CEC, 0x7CED, /* 0x50 */
+ 0x7CEE, 0x7CF0, 0x7CF1, 0x7CF2, 0x7CF3, 0x7CF4, 0x7CF5, 0x7CF6, /* 0x60 */
+ 0x7CF7, 0x7CF9, 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFE, 0x7CFF, 0x7D00, /* 0x60 */
+ 0x7D01, 0x7D02, 0x7D03, 0x7D04, 0x7D05, 0x7D06, 0x7D07, 0x7D08, /* 0x70 */
+ 0x7D09, 0x7D0B, 0x7D0C, 0x7D0D, 0x7D0E, 0x7D0F, 0x7D10, 0, /* 0x70 */
+ 0x7D11, 0x7D12, 0x7D13, 0x7D14, 0x7D15, 0x7D16, 0x7D17, 0x7D18, /* 0x80 */
+ 0x7D19, 0x7D1A, 0x7D1B, 0x7D1C, 0x7D1D, 0x7D1E, 0x7D1F, 0x7D21, /* 0x80 */
+ 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C, /* 0x90 */
+ 0x7D2D, 0x7D2E, 0x7D30, 0x7D31, 0x7D32, 0x7D33, 0x7D34, 0x7D35, /* 0x90 */
+ 0x7D36, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC, /* 0xA0 */
+ 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6, /* 0xA0 */
+ 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324, /* 0xB0 */
+ 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E, /* 0xB0 */
+ 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0, /* 0xC0 */
+ 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7, /* 0xC0 */
+ 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532, /* 0xD0 */
+ 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C, /* 0xD0 */
+ 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9, /* 0xE0 */
+ 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877, /* 0xE0 */
+ 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB, /* 0xF0 */
+ 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_BD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7D37, 0x7D38, 0x7D39, 0x7D3A, 0x7D3B, 0x7D3C, 0x7D3D, 0x7D3E, /* 0x40 */
+ 0x7D3F, 0x7D40, 0x7D41, 0x7D42, 0x7D43, 0x7D44, 0x7D45, 0x7D46, /* 0x40 */
+ 0x7D47, 0x7D48, 0x7D49, 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4E, /* 0x50 */
+ 0x7D4F, 0x7D50, 0x7D51, 0x7D52, 0x7D53, 0x7D54, 0x7D55, 0x7D56, /* 0x50 */
+ 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B, 0x7D5C, 0x7D5D, 0x7D5E, /* 0x60 */
+ 0x7D5F, 0x7D60, 0x7D61, 0x7D62, 0x7D63, 0x7D64, 0x7D65, 0x7D66, /* 0x60 */
+ 0x7D67, 0x7D68, 0x7D69, 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, /* 0x70 */
+ 0x7D70, 0x7D71, 0x7D72, 0x7D73, 0x7D74, 0x7D75, 0x7D76, 0, /* 0x70 */
+ 0x7D78, 0x7D79, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, /* 0x80 */
+ 0x7D80, 0x7D81, 0x7D82, 0x7D83, 0x7D84, 0x7D85, 0x7D86, 0x7D87, /* 0x80 */
+ 0x7D88, 0x7D89, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D, 0x7D8E, 0x7D8F, /* 0x90 */
+ 0x7D90, 0x7D91, 0x7D92, 0x7D93, 0x7D94, 0x7D95, 0x7D96, 0x7D97, /* 0x90 */
+ 0x7D98, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7, /* 0xA0 */
+ 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B, /* 0xA0 */
+ 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912, /* 0xB0 */
+ 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07, /* 0xB0 */
+ 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2, /* 0xC0 */
+ 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83, /* 0xC0 */
+ 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636, /* 0xD0 */
+ 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, /* 0xD0 */
+ 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, /* 0xE0 */
+ 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, /* 0xE0 */
+ 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28, /* 0xF0 */
+ 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_BE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7D99, 0x7D9A, 0x7D9B, 0x7D9C, 0x7D9D, 0x7D9E, 0x7D9F, 0x7DA0, /* 0x40 */
+ 0x7DA1, 0x7DA2, 0x7DA3, 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, /* 0x40 */
+ 0x7DAA, 0x7DAB, 0x7DAC, 0x7DAD, 0x7DAF, 0x7DB0, 0x7DB1, 0x7DB2, /* 0x50 */
+ 0x7DB3, 0x7DB4, 0x7DB5, 0x7DB6, 0x7DB7, 0x7DB8, 0x7DB9, 0x7DBA, /* 0x50 */
+ 0x7DBB, 0x7DBC, 0x7DBD, 0x7DBE, 0x7DBF, 0x7DC0, 0x7DC1, 0x7DC2, /* 0x60 */
+ 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DC7, 0x7DC8, 0x7DC9, 0x7DCA, /* 0x60 */
+ 0x7DCB, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0, 0x7DD1, 0x7DD2, /* 0x70 */
+ 0x7DD3, 0x7DD4, 0x7DD5, 0x7DD6, 0x7DD7, 0x7DD8, 0x7DD9, 0, /* 0x70 */
+ 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDD, 0x7DDE, 0x7DDF, 0x7DE0, 0x7DE1, /* 0x80 */
+ 0x7DE2, 0x7DE3, 0x7DE4, 0x7DE5, 0x7DE6, 0x7DE7, 0x7DE8, 0x7DE9, /* 0x80 */
+ 0x7DEA, 0x7DEB, 0x7DEC, 0x7DED, 0x7DEE, 0x7DEF, 0x7DF0, 0x7DF1, /* 0x90 */
+ 0x7DF2, 0x7DF3, 0x7DF4, 0x7DF5, 0x7DF6, 0x7DF7, 0x7DF8, 0x7DF9, /* 0x90 */
+ 0x7DFA, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, /* 0xA0 */
+ 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, /* 0xA0 */
+ 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, /* 0xB0 */
+ 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, /* 0xB0 */
+ 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, /* 0xC0 */
+ 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, /* 0xC0 */
+ 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, /* 0xD0 */
+ 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, /* 0xD0 */
+ 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, /* 0xE0 */
+ 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, /* 0xE0 */
+ 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, /* 0xF0 */
+ 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_BF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7DFB, 0x7DFC, 0x7DFD, 0x7DFE, 0x7DFF, 0x7E00, 0x7E01, 0x7E02, /* 0x40 */
+ 0x7E03, 0x7E04, 0x7E05, 0x7E06, 0x7E07, 0x7E08, 0x7E09, 0x7E0A, /* 0x40 */
+ 0x7E0B, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E10, 0x7E11, 0x7E12, /* 0x50 */
+ 0x7E13, 0x7E14, 0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, /* 0x50 */
+ 0x7E1B, 0x7E1C, 0x7E1D, 0x7E1E, 0x7E1F, 0x7E20, 0x7E21, 0x7E22, /* 0x60 */
+ 0x7E23, 0x7E24, 0x7E25, 0x7E26, 0x7E27, 0x7E28, 0x7E29, 0x7E2A, /* 0x60 */
+ 0x7E2B, 0x7E2C, 0x7E2D, 0x7E2E, 0x7E2F, 0x7E30, 0x7E31, 0x7E32, /* 0x70 */
+ 0x7E33, 0x7E34, 0x7E35, 0x7E36, 0x7E37, 0x7E38, 0x7E39, 0, /* 0x70 */
+ 0x7E3A, 0x7E3C, 0x7E3D, 0x7E3E, 0x7E3F, 0x7E40, 0x7E42, 0x7E43, /* 0x80 */
+ 0x7E44, 0x7E45, 0x7E46, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B, 0x7E4C, /* 0x80 */
+ 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E52, 0x7E53, 0x7E54, /* 0x90 */
+ 0x7E55, 0x7E56, 0x7E57, 0x7E58, 0x7E59, 0x7E5A, 0x7E5B, 0x7E5C, /* 0x90 */
+ 0x7E5D, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, /* 0xA0 */
+ 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, /* 0xA0 */
+ 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, /* 0xB0 */
+ 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, /* 0xB0 */
+ 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, /* 0xC0 */
+ 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, /* 0xC0 */
+ 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, /* 0xD0 */
+ 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, /* 0xD0 */
+ 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, /* 0xE0 */
+ 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, /* 0xE0 */
+ 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, /* 0xF0 */
+ 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7E5E, 0x7E5F, 0x7E60, 0x7E61, 0x7E62, 0x7E63, 0x7E64, 0x7E65, /* 0x40 */
+ 0x7E66, 0x7E67, 0x7E68, 0x7E69, 0x7E6A, 0x7E6B, 0x7E6C, 0x7E6D, /* 0x40 */
+ 0x7E6E, 0x7E6F, 0x7E70, 0x7E71, 0x7E72, 0x7E73, 0x7E74, 0x7E75, /* 0x50 */
+ 0x7E76, 0x7E77, 0x7E78, 0x7E79, 0x7E7A, 0x7E7B, 0x7E7C, 0x7E7D, /* 0x50 */
+ 0x7E7E, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86, /* 0x60 */
+ 0x7E87, 0x7E88, 0x7E89, 0x7E8A, 0x7E8B, 0x7E8C, 0x7E8D, 0x7E8E, /* 0x60 */
+ 0x7E8F, 0x7E90, 0x7E91, 0x7E92, 0x7E93, 0x7E94, 0x7E95, 0x7E96, /* 0x70 */
+ 0x7E97, 0x7E98, 0x7E99, 0x7E9A, 0x7E9C, 0x7E9D, 0x7E9E, 0, /* 0x70 */
+ 0x7EAE, 0x7EB4, 0x7EBB, 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, /* 0x80 */
+ 0x7F0A, 0x7F10, 0x7F1E, 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, /* 0x80 */
+ 0x7F3E, 0x7F3F, 0x7F40, 0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48, /* 0x90 */
+ 0x7F49, 0x7F4A, 0x7F4B, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F4F, 0x7F52, /* 0x90 */
+ 0x7F53, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0, /* 0xA0 */
+ 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721, /* 0xA0 */
+ 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A, /* 0xB0 */
+ 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD, /* 0xB0 */
+ 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC, /* 0xC0 */
+ 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001, /* 0xC0 */
+ 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7, /* 0xD0 */
+ 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B, /* 0xD0 */
+ 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, /* 0xE0 */
+ 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC, /* 0xE0 */
+ 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389, /* 0xF0 */
+ 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7F56, 0x7F59, 0x7F5B, 0x7F5C, 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, /* 0x40 */
+ 0x7F64, 0x7F65, 0x7F66, 0x7F67, 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, /* 0x40 */
+ 0x7F70, 0x7F73, 0x7F75, 0x7F76, 0x7F77, 0x7F78, 0x7F7A, 0x7F7B, /* 0x50 */
+ 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83, 0x7F84, 0x7F85, /* 0x50 */
+ 0x7F86, 0x7F87, 0x7F88, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, /* 0x60 */
+ 0x7F91, 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, /* 0x60 */
+ 0x7F9B, 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA5, 0x7FA6, 0x7FA8, /* 0x70 */
+ 0x7FA9, 0x7FAA, 0x7FAB, 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0, /* 0x70 */
+ 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6, 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, /* 0x80 */
+ 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4, 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, /* 0x80 */
+ 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0, 0x7FD1, 0x7FD2, 0x7FD3, 0x7FD6, /* 0x90 */
+ 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC, 0x7FDD, 0x7FDE, 0x7FE2, /* 0x90 */
+ 0x7FE3, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483, /* 0xA0 */
+ 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C, /* 0xA0 */
+ 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3, /* 0xB0 */
+ 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF, /* 0xB0 */
+ 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE, /* 0xC0 */
+ 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599, /* 0xC0 */
+ 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7, /* 0xD0 */
+ 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D, /* 0xD0 */
+ 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A, /* 0xE0 */
+ 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C, /* 0xE0 */
+ 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41, /* 0xF0 */
+ 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA, 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, /* 0x40 */
+ 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6, 0x7FF7, 0x7FF8, 0x7FF9, 0x7FFA, /* 0x40 */
+ 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007, 0x8008, 0x8009, 0x800A, /* 0x50 */
+ 0x800E, 0x800F, 0x8011, 0x8013, 0x801A, 0x801B, 0x801D, 0x801E, /* 0x50 */
+ 0x801F, 0x8021, 0x8023, 0x8024, 0x802B, 0x802C, 0x802D, 0x802E, /* 0x60 */
+ 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C, 0x803E, /* 0x60 */
+ 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804E, /* 0x70 */
+ 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0, /* 0x70 */
+ 0x8059, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, /* 0x80 */
+ 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, /* 0x80 */
+ 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8072, 0x8073, 0x8074, /* 0x90 */
+ 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807A, 0x807B, 0x807C, /* 0x90 */
+ 0x807D, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, /* 0xA0 */
+ 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, /* 0xA0 */
+ 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, /* 0xB0 */
+ 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, /* 0xB0 */
+ 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, /* 0xC0 */
+ 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, /* 0xC0 */
+ 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, /* 0xD0 */
+ 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, /* 0xD0 */
+ 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, /* 0xE0 */
+ 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, /* 0xE0 */
+ 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, /* 0xF0 */
+ 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x807E, 0x8081, 0x8082, 0x8085, 0x8088, 0x808A, 0x808D, 0x808E, /* 0x40 */
+ 0x808F, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, /* 0x40 */
+ 0x809E, 0x80A3, 0x80A6, 0x80A7, 0x80A8, 0x80AC, 0x80B0, 0x80B3, /* 0x50 */
+ 0x80B5, 0x80B6, 0x80B8, 0x80B9, 0x80BB, 0x80C5, 0x80C7, 0x80C8, /* 0x50 */
+ 0x80C9, 0x80CA, 0x80CB, 0x80CF, 0x80D0, 0x80D1, 0x80D2, 0x80D3, /* 0x60 */
+ 0x80D4, 0x80D5, 0x80D8, 0x80DF, 0x80E0, 0x80E2, 0x80E3, 0x80E6, /* 0x60 */
+ 0x80EE, 0x80F5, 0x80F7, 0x80F9, 0x80FB, 0x80FE, 0x80FF, 0x8100, /* 0x70 */
+ 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810B, 0, /* 0x70 */
+ 0x810C, 0x8115, 0x8117, 0x8119, 0x811B, 0x811C, 0x811D, 0x811F, /* 0x80 */
+ 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, /* 0x80 */
+ 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130, 0x8133, /* 0x90 */
+ 0x8134, 0x8135, 0x8137, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, /* 0x90 */
+ 0x813F, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, /* 0xA0 */
+ 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, /* 0xA0 */
+ 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, /* 0xB0 */
+ 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, /* 0xB0 */
+ 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, /* 0xC0 */
+ 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, /* 0xC0 */
+ 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, /* 0xD0 */
+ 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, /* 0xD0 */
+ 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, /* 0xE0 */
+ 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, /* 0xE0 */
+ 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, /* 0xF0 */
+ 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, /* 0x40 */
+ 0x814D, 0x814E, 0x814F, 0x8152, 0x8156, 0x8157, 0x8158, 0x815B, /* 0x40 */
+ 0x815C, 0x815D, 0x815E, 0x815F, 0x8161, 0x8162, 0x8163, 0x8164, /* 0x50 */
+ 0x8166, 0x8168, 0x816A, 0x816B, 0x816C, 0x816F, 0x8172, 0x8173, /* 0x50 */
+ 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, /* 0x60 */
+ 0x8186, 0x8187, 0x8189, 0x818B, 0x818C, 0x818D, 0x818E, 0x8190, /* 0x60 */
+ 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819A, /* 0x70 */
+ 0x819E, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x81A4, 0x81A5, 0, /* 0x70 */
+ 0x81A7, 0x81A9, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, /* 0x80 */
+ 0x81B1, 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, /* 0x80 */
+ 0x81BC, 0x81BD, 0x81BE, 0x81BF, 0x81C4, 0x81C5, 0x81C7, 0x81C8, /* 0x90 */
+ 0x81C9, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2, /* 0x90 */
+ 0x81D3, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, /* 0xA0 */
+ 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, /* 0xA0 */
+ 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6, /* 0xB0 */
+ 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, /* 0xB0 */
+ 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3, /* 0xC0 */
+ 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, /* 0xC0 */
+ 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6, /* 0xD0 */
+ 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, /* 0xD0 */
+ 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA, /* 0xE0 */
+ 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18, /* 0xE0 */
+ 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A, /* 0xF0 */
+ 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81D9, 0x81DA, 0x81DB, /* 0x40 */
+ 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E1, 0x81E2, 0x81E4, /* 0x40 */
+ 0x81E5, 0x81E6, 0x81E8, 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, /* 0x50 */
+ 0x81F1, 0x81F2, 0x81F5, 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FA, /* 0x50 */
+ 0x81FD, 0x81FF, 0x8203, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, /* 0x60 */
+ 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, /* 0x60 */
+ 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, /* 0x70 */
+ 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0, /* 0x70 */
+ 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, /* 0x80 */
+ 0x824C, 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, /* 0x80 */
+ 0x8255, 0x8256, 0x8257, 0x8259, 0x825B, 0x825C, 0x825D, 0x825E, /* 0x90 */
+ 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, /* 0x90 */
+ 0x8269, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113, /* 0xA0 */
+ 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, /* 0xA0 */
+ 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27, /* 0xB0 */
+ 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4, /* 0xB0 */
+ 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, /* 0xC0 */
+ 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554, /* 0xC0 */
+ 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B, /* 0xD0 */
+ 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, /* 0xD0 */
+ 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7, /* 0xE0 */
+ 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, /* 0xE0 */
+ 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F, /* 0xF0 */
+ 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x826A, 0x826B, 0x826C, 0x826D, 0x8271, 0x8275, 0x8276, 0x8277, /* 0x40 */
+ 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, /* 0x40 */
+ 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, /* 0x50 */
+ 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3, 0x82A7, 0x82B2, /* 0x50 */
+ 0x82B5, 0x82B6, 0x82BA, 0x82BB, 0x82BC, 0x82BF, 0x82C0, 0x82C2, /* 0x60 */
+ 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9, 0x82DA, /* 0x60 */
+ 0x82DD, 0x82E2, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED, /* 0x70 */
+ 0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0, /* 0x70 */
+ 0x82FA, 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, /* 0x80 */
+ 0x830D, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, /* 0x80 */
+ 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, /* 0x90 */
+ 0x8326, 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, /* 0x90 */
+ 0x833D, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, /* 0xA0 */
+ 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, /* 0xA0 */
+ 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, /* 0xB0 */
+ 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, /* 0xB0 */
+ 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, /* 0xC0 */
+ 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, /* 0xC0 */
+ 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, /* 0xD0 */
+ 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, /* 0xD0 */
+ 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, /* 0xE0 */
+ 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, /* 0xE0 */
+ 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, /* 0xF0 */
+ 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A, /* 0x40 */
+ 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357, /* 0x40 */
+ 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, /* 0x50 */
+ 0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380, /* 0x50 */
+ 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838A, 0x838B, /* 0x60 */
+ 0x838C, 0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, /* 0x60 */
+ 0x8397, 0x8399, 0x839A, 0x839D, 0x839F, 0x83A1, 0x83A2, 0x83A3, /* 0x70 */
+ 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83AC, 0x83AD, 0x83AE, 0, /* 0x70 */
+ 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF, 0x83C2, 0x83C3, 0x83C4, /* 0x80 */
+ 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD, 0x83CE, 0x83D0, 0x83D1, /* 0x80 */
+ 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9, 0x83DA, 0x83DB, 0x83DE, /* 0x90 */
+ 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7, 0x83E8, 0x83EB, 0x83EC, /* 0x90 */
+ 0x83ED, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, /* 0xA0 */
+ 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, /* 0xA0 */
+ 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, /* 0xB0 */
+ 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, /* 0xB0 */
+ 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, /* 0xC0 */
+ 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, /* 0xC0 */
+ 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, /* 0xD0 */
+ 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, /* 0xD0 */
+ 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, /* 0xE0 */
+ 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, /* 0xE0 */
+ 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, /* 0xF0 */
+ 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x83EE, 0x83EF, 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83FA, /* 0x40 */
+ 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400, 0x8402, 0x8405, 0x8407, /* 0x40 */
+ 0x8408, 0x8409, 0x840A, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, /* 0x50 */
+ 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F, 0x8420, /* 0x50 */
+ 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842C, 0x842D, /* 0x60 */
+ 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, /* 0x60 */
+ 0x8437, 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, /* 0x70 */
+ 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0, /* 0x70 */
+ 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8452, /* 0x80 */
+ 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845D, 0x845E, 0x845F, /* 0x80 */
+ 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846A, /* 0x90 */
+ 0x846E, 0x846F, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847B, /* 0x90 */
+ 0x847C, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7, /* 0xA0 */
+ 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, /* 0xA0 */
+ 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E, /* 0xB0 */
+ 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, /* 0xB0 */
+ 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9, /* 0xC0 */
+ 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4, /* 0xC0 */
+ 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, /* 0xD0 */
+ 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197, /* 0xD0 */
+ 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, /* 0xE0 */
+ 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A, /* 0xE0 */
+ 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12, /* 0xF0 */
+ 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_C9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, /* 0x40 */
+ 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492, 0x8493, /* 0x40 */
+ 0x8494, 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, /* 0x50 */
+ 0x849F, 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, /* 0x50 */
+ 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, /* 0x60 */
+ 0x84B1, 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BC, 0x84BE, /* 0x60 */
+ 0x84C0, 0x84C2, 0x84C3, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CB, /* 0x70 */
+ 0x84CC, 0x84CE, 0x84CF, 0x84D2, 0x84D4, 0x84D5, 0x84D7, 0, /* 0x70 */
+ 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC, 0x84DE, 0x84E1, 0x84E2, /* 0x80 */
+ 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x84EB, 0x84ED, 0x84EE, /* 0x80 */
+ 0x84EF, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7, /* 0x90 */
+ 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FD, 0x84FE, 0x8500, 0x8501, /* 0x90 */
+ 0x8502, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A, /* 0xA0 */
+ 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E, /* 0xA0 */
+ 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E, /* 0xB0 */
+ 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, /* 0xB0 */
+ 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55, /* 0xC0 */
+ 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A, /* 0xC0 */
+ 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA, /* 0xD0 */
+ 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7, /* 0xD0 */
+ 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E, /* 0xE0 */
+ 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, /* 0xE0 */
+ 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E, /* 0xF0 */
+ 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_CA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850A, /* 0x40 */
+ 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8514, 0x8515, /* 0x40 */
+ 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x851E, 0x8520, /* 0x50 */
+ 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, /* 0x50 */
+ 0x852A, 0x852D, 0x852E, 0x852F, 0x8530, 0x8531, 0x8532, 0x8533, /* 0x60 */
+ 0x8534, 0x8535, 0x8536, 0x853E, 0x853F, 0x8540, 0x8541, 0x8542, /* 0x60 */
+ 0x8544, 0x8545, 0x8546, 0x8547, 0x854B, 0x854C, 0x854D, 0x854E, /* 0x70 */
+ 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0, /* 0x70 */
+ 0x8557, 0x8558, 0x855A, 0x855B, 0x855C, 0x855D, 0x855F, 0x8560, /* 0x80 */
+ 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856A, /* 0x80 */
+ 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573, /* 0x90 */
+ 0x8575, 0x8576, 0x8577, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, /* 0x90 */
+ 0x8581, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, /* 0xA0 */
+ 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, /* 0xA0 */
+ 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, /* 0xB0 */
+ 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, /* 0xB0 */
+ 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, /* 0xC0 */
+ 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, /* 0xC0 */
+ 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, /* 0xD0 */
+ 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, /* 0xD0 */
+ 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, /* 0xE0 */
+ 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, /* 0xE0 */
+ 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, /* 0xF0 */
+ 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_CB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, /* 0x40 */
+ 0x858D, 0x858E, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, /* 0x40 */
+ 0x8596, 0x8597, 0x8598, 0x8599, 0x859A, 0x859D, 0x859E, 0x859F, /* 0x50 */
+ 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A6, 0x85A7, 0x85A9, /* 0x50 */
+ 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5, /* 0x60 */
+ 0x85B6, 0x85B8, 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, /* 0x60 */
+ 0x85C0, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, /* 0x70 */
+ 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85D1, 0x85D2, 0, /* 0x70 */
+ 0x85D4, 0x85D6, 0x85D7, 0x85D8, 0x85D9, 0x85DA, 0x85DB, 0x85DD, /* 0x80 */
+ 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E5, 0x85E6, /* 0x80 */
+ 0x85E7, 0x85E8, 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, /* 0x90 */
+ 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, /* 0x90 */
+ 0x85F8, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, /* 0xA0 */
+ 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, /* 0xA0 */
+ 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, /* 0xB0 */
+ 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, /* 0xB0 */
+ 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, /* 0xC0 */
+ 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, /* 0xC0 */
+ 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, /* 0xD0 */
+ 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, /* 0xD0 */
+ 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, /* 0xE0 */
+ 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, /* 0xE0 */
+ 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, /* 0xF0 */
+ 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_CC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x85F9, 0x85FA, 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, /* 0x40 */
+ 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860A, 0x860B, /* 0x40 */
+ 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612, 0x8613, 0x8614, /* 0x50 */
+ 0x8615, 0x8617, 0x8618, 0x8619, 0x861A, 0x861B, 0x861C, 0x861D, /* 0x50 */
+ 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, /* 0x60 */
+ 0x8626, 0x8628, 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, /* 0x60 */
+ 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, /* 0x70 */
+ 0x8639, 0x863A, 0x863B, 0x863D, 0x863E, 0x863F, 0x8640, 0, /* 0x70 */
+ 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, /* 0x80 */
+ 0x8649, 0x864A, 0x864B, 0x864C, 0x8652, 0x8653, 0x8655, 0x8656, /* 0x80 */
+ 0x8657, 0x8658, 0x8659, 0x865B, 0x865C, 0x865D, 0x865F, 0x8660, /* 0x90 */
+ 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, /* 0x90 */
+ 0x866A, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, /* 0xA0 */
+ 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A, /* 0xA0 */
+ 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D, /* 0xB0 */
+ 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD, /* 0xB0 */
+ 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, /* 0xC0 */
+ 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4, /* 0xC0 */
+ 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957, /* 0xD0 */
+ 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22, /* 0xD0 */
+ 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F, /* 0xE0 */
+ 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, /* 0xE0 */
+ 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A, /* 0xF0 */
+ 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_CD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, /* 0x40 */
+ 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, /* 0x40 */
+ 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, /* 0x50 */
+ 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0, /* 0x50 */
+ 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2, /* 0x60 */
+ 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE, /* 0x60 */
+ 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD, /* 0x70 */
+ 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0, /* 0x70 */
+ 0x86DD, 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, /* 0x80 */
+ 0x86E8, 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, /* 0x80 */
+ 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, /* 0x90 */
+ 0x8706, 0x870B, 0x870C, 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, /* 0x90 */
+ 0x8716, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, /* 0xA0 */
+ 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5, /* 0xA0 */
+ 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934, /* 0xB0 */
+ 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82, /* 0xB0 */
+ 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893, /* 0xC0 */
+ 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, /* 0xC0 */
+ 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5, /* 0xD0 */
+ 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6, /* 0xD0 */
+ 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D, /* 0xE0 */
+ 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, /* 0xE0 */
+ 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, /* 0xF0 */
+ 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_CE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8719, 0x871B, 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, /* 0x40 */
+ 0x8728, 0x872A, 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, /* 0x40 */
+ 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, /* 0x50 */
+ 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, /* 0x50 */
+ 0x874B, 0x874D, 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, /* 0x60 */
+ 0x8756, 0x8758, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, /* 0x60 */
+ 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, /* 0x70 */
+ 0x876C, 0x876D, 0x876F, 0x8771, 0x8772, 0x8773, 0x8775, 0, /* 0x70 */
+ 0x8777, 0x8778, 0x8779, 0x877A, 0x877F, 0x8780, 0x8781, 0x8784, /* 0x80 */
+ 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F, 0x8790, /* 0x80 */
+ 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879A, /* 0x90 */
+ 0x879B, 0x879C, 0x879D, 0x879E, 0x87A0, 0x87A1, 0x87A2, 0x87A3, /* 0x90 */
+ 0x87A4, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, /* 0xA0 */
+ 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, /* 0xA0 */
+ 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, /* 0xB0 */
+ 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, /* 0xB0 */
+ 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, /* 0xC0 */
+ 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, /* 0xC0 */
+ 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, /* 0xD0 */
+ 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, /* 0xD0 */
+ 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, /* 0xE0 */
+ 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, /* 0xE0 */
+ 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, /* 0xF0 */
+ 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_CF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1, /* 0x40 */
+ 0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BB, 0x87BC, /* 0x40 */
+ 0x87BE, 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C4, 0x87C5, 0x87C7, /* 0x50 */
+ 0x87C8, 0x87C9, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D4, /* 0x50 */
+ 0x87D5, 0x87D6, 0x87D7, 0x87D8, 0x87D9, 0x87DA, 0x87DC, 0x87DD, /* 0x60 */
+ 0x87DE, 0x87DF, 0x87E1, 0x87E2, 0x87E3, 0x87E4, 0x87E6, 0x87E7, /* 0x60 */
+ 0x87E8, 0x87E9, 0x87EB, 0x87EC, 0x87ED, 0x87EF, 0x87F0, 0x87F1, /* 0x70 */
+ 0x87F2, 0x87F3, 0x87F4, 0x87F5, 0x87F6, 0x87F7, 0x87F8, 0, /* 0x70 */
+ 0x87FA, 0x87FB, 0x87FC, 0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, /* 0x80 */
+ 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880B, 0x880C, /* 0x80 */
+ 0x880D, 0x880E, 0x880F, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, /* 0x90 */
+ 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x881F, 0x8820, /* 0x90 */
+ 0x8823, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, /* 0xA0 */
+ 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, /* 0xA0 */
+ 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, /* 0xB0 */
+ 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, /* 0xB0 */
+ 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, /* 0xC0 */
+ 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, /* 0xC0 */
+ 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, /* 0xD0 */
+ 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, /* 0xD0 */
+ 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, /* 0xE0 */
+ 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, /* 0xE0 */
+ 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, /* 0xF0 */
+ 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B, /* 0x40 */
+ 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8831, 0x8833, 0x8834, /* 0x40 */
+ 0x8835, 0x8836, 0x8837, 0x8838, 0x883A, 0x883B, 0x883D, 0x883E, /* 0x50 */
+ 0x883F, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, /* 0x50 */
+ 0x884A, 0x884B, 0x884E, 0x884F, 0x8850, 0x8851, 0x8852, 0x8853, /* 0x60 */
+ 0x8855, 0x8856, 0x8858, 0x885A, 0x885B, 0x885C, 0x885D, 0x885E, /* 0x60 */
+ 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871, /* 0x70 */
+ 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887A, 0, /* 0x70 */
+ 0x887B, 0x887C, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, /* 0x80 */
+ 0x888C, 0x888E, 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, /* 0x80 */
+ 0x8897, 0x8898, 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, /* 0x90 */
+ 0x88A0, 0x88A1, 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, /* 0x90 */
+ 0x88AA, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548, /* 0xA0 */
+ 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A, /* 0xA0 */
+ 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9, /* 0xB0 */
+ 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C, /* 0xB0 */
+ 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F, /* 0xC0 */
+ 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2, /* 0xC0 */
+ 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, /* 0xD0 */
+ 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, /* 0xD0 */
+ 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C, /* 0xE0 */
+ 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157, /* 0xE0 */
+ 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA, /* 0xF0 */
+ 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x88AC, 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, /* 0x40 */
+ 0x88B6, 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, /* 0x40 */
+ 0x88C0, 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CA, 0x88CB, 0x88CC, /* 0x50 */
+ 0x88CD, 0x88CF, 0x88D0, 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, /* 0x50 */
+ 0x88DB, 0x88DC, 0x88DD, 0x88DE, 0x88E0, 0x88E1, 0x88E6, 0x88E7, /* 0x60 */
+ 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED, 0x88EE, 0x88EF, 0x88F2, /* 0x60 */
+ 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB, 0x88FD, 0x88FF, 0x8900, /* 0x70 */
+ 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0, /* 0x70 */
+ 0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914, /* 0x80 */
+ 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F, /* 0x80 */
+ 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, /* 0x90 */
+ 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8932, 0x8933, 0x8935, /* 0x90 */
+ 0x8937, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66, /* 0xA0 */
+ 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2, /* 0xA0 */
+ 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A, /* 0xB0 */
+ 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD, /* 0xB0 */
+ 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A, /* 0xC0 */
+ 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25, /* 0xC0 */
+ 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E, /* 0xD0 */
+ 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830, /* 0xD0 */
+ 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, /* 0xE0 */
+ 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C, /* 0xE0 */
+ 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2, /* 0xF0 */
+ 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8938, 0x8939, 0x893A, 0x893B, 0x893C, 0x893D, 0x893E, 0x893F, /* 0x40 */
+ 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, /* 0x40 */
+ 0x894A, 0x894B, 0x894C, 0x894D, 0x894E, 0x894F, 0x8950, 0x8951, /* 0x50 */
+ 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, /* 0x50 */
+ 0x895A, 0x895B, 0x895C, 0x895D, 0x8960, 0x8961, 0x8962, 0x8963, /* 0x60 */
+ 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, /* 0x60 */
+ 0x896D, 0x896E, 0x896F, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, /* 0x70 */
+ 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897A, 0x897C, 0, /* 0x70 */
+ 0x897D, 0x897E, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, /* 0x80 */
+ 0x8989, 0x898A, 0x898B, 0x898C, 0x898D, 0x898E, 0x898F, 0x8990, /* 0x80 */
+ 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, /* 0x90 */
+ 0x8999, 0x899A, 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, /* 0x90 */
+ 0x89A1, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, /* 0xA0 */
+ 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, /* 0xA0 */
+ 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, /* 0xB0 */
+ 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, /* 0xB0 */
+ 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, /* 0xC0 */
+ 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, /* 0xC0 */
+ 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, /* 0xD0 */
+ 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, /* 0xD0 */
+ 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, /* 0xE0 */
+ 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, /* 0xE0 */
+ 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, /* 0xF0 */
+ 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x89A2, 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0x89A7, 0x89A8, 0x89A9, /* 0x40 */
+ 0x89AA, 0x89AB, 0x89AC, 0x89AD, 0x89AE, 0x89AF, 0x89B0, 0x89B1, /* 0x40 */
+ 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, 0x89B8, 0x89B9, /* 0x50 */
+ 0x89BA, 0x89BB, 0x89BC, 0x89BD, 0x89BE, 0x89BF, 0x89C0, 0x89C3, /* 0x50 */
+ 0x89CD, 0x89D3, 0x89D4, 0x89D5, 0x89D7, 0x89D8, 0x89D9, 0x89DB, /* 0x60 */
+ 0x89DD, 0x89DF, 0x89E0, 0x89E1, 0x89E2, 0x89E4, 0x89E7, 0x89E8, /* 0x60 */
+ 0x89E9, 0x89EA, 0x89EC, 0x89ED, 0x89EE, 0x89F0, 0x89F1, 0x89F2, /* 0x70 */
+ 0x89F4, 0x89F5, 0x89F6, 0x89F7, 0x89F8, 0x89F9, 0x89FA, 0, /* 0x70 */
+ 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A01, 0x8A02, 0x8A03, /* 0x80 */
+ 0x8A04, 0x8A05, 0x8A06, 0x8A08, 0x8A09, 0x8A0A, 0x8A0B, 0x8A0C, /* 0x80 */
+ 0x8A0D, 0x8A0E, 0x8A0F, 0x8A10, 0x8A11, 0x8A12, 0x8A13, 0x8A14, /* 0x90 */
+ 0x8A15, 0x8A16, 0x8A17, 0x8A18, 0x8A19, 0x8A1A, 0x8A1B, 0x8A1C, /* 0x90 */
+ 0x8A1D, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, /* 0xA0 */
+ 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, /* 0xA0 */
+ 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, /* 0xB0 */
+ 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, /* 0xB0 */
+ 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, /* 0xC0 */
+ 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, /* 0xC0 */
+ 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, /* 0xD0 */
+ 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, /* 0xD0 */
+ 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, /* 0xE0 */
+ 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, /* 0xE0 */
+ 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, /* 0xF0 */
+ 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8A1E, 0x8A1F, 0x8A20, 0x8A21, 0x8A22, 0x8A23, 0x8A24, 0x8A25, /* 0x40 */
+ 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2A, 0x8A2B, 0x8A2C, 0x8A2D, /* 0x40 */
+ 0x8A2E, 0x8A2F, 0x8A30, 0x8A31, 0x8A32, 0x8A33, 0x8A34, 0x8A35, /* 0x50 */
+ 0x8A36, 0x8A37, 0x8A38, 0x8A39, 0x8A3A, 0x8A3B, 0x8A3C, 0x8A3D, /* 0x50 */
+ 0x8A3F, 0x8A40, 0x8A41, 0x8A42, 0x8A43, 0x8A44, 0x8A45, 0x8A46, /* 0x60 */
+ 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4E, 0x8A4F, /* 0x60 */
+ 0x8A50, 0x8A51, 0x8A52, 0x8A53, 0x8A54, 0x8A55, 0x8A56, 0x8A57, /* 0x70 */
+ 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, 0, /* 0x70 */
+ 0x8A5F, 0x8A60, 0x8A61, 0x8A62, 0x8A63, 0x8A64, 0x8A65, 0x8A66, /* 0x80 */
+ 0x8A67, 0x8A68, 0x8A69, 0x8A6A, 0x8A6B, 0x8A6C, 0x8A6D, 0x8A6E, /* 0x80 */
+ 0x8A6F, 0x8A70, 0x8A71, 0x8A72, 0x8A73, 0x8A74, 0x8A75, 0x8A76, /* 0x90 */
+ 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7C, 0x8A7D, 0x8A7E, 0x8A7F, /* 0x90 */
+ 0x8A80, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33, /* 0xA0 */
+ 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95, /* 0xA0 */
+ 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1, /* 0xB0 */
+ 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5, /* 0xB0 */
+ 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7, /* 0xC0 */
+ 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5, /* 0xC0 */
+ 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0, /* 0xD0 */
+ 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43, /* 0xD0 */
+ 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9, /* 0xE0 */
+ 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5, /* 0xE0 */
+ 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E, /* 0xF0 */
+ 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8A81, 0x8A82, 0x8A83, 0x8A84, 0x8A85, 0x8A86, 0x8A87, 0x8A88, /* 0x40 */
+ 0x8A8B, 0x8A8C, 0x8A8D, 0x8A8E, 0x8A8F, 0x8A90, 0x8A91, 0x8A92, /* 0x40 */
+ 0x8A94, 0x8A95, 0x8A96, 0x8A97, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, /* 0x50 */
+ 0x8A9C, 0x8A9D, 0x8A9E, 0x8A9F, 0x8AA0, 0x8AA1, 0x8AA2, 0x8AA3, /* 0x50 */
+ 0x8AA4, 0x8AA5, 0x8AA6, 0x8AA7, 0x8AA8, 0x8AA9, 0x8AAA, 0x8AAB, /* 0x60 */
+ 0x8AAC, 0x8AAD, 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, /* 0x60 */
+ 0x8AB4, 0x8AB5, 0x8AB6, 0x8AB7, 0x8AB8, 0x8AB9, 0x8ABA, 0x8ABB, /* 0x70 */
+ 0x8ABC, 0x8ABD, 0x8ABE, 0x8ABF, 0x8AC0, 0x8AC1, 0x8AC2, 0, /* 0x70 */
+ 0x8AC3, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, 0x8AC8, 0x8AC9, 0x8ACA, /* 0x80 */
+ 0x8ACB, 0x8ACC, 0x8ACD, 0x8ACE, 0x8ACF, 0x8AD0, 0x8AD1, 0x8AD2, /* 0x80 */
+ 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, 0x8AD9, 0x8ADA, /* 0x90 */
+ 0x8ADB, 0x8ADC, 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE2, /* 0x90 */
+ 0x8AE3, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, /* 0xA0 */
+ 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8, /* 0xA0 */
+ 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97, /* 0xB0 */
+ 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B, /* 0xB0 */
+ 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8, /* 0xC0 */
+ 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C, /* 0xC0 */
+ 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146, /* 0xD0 */
+ 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005, /* 0xD0 */
+ 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, /* 0xE0 */
+ 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA, /* 0xE0 */
+ 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81, /* 0xF0 */
+ 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEB, /* 0x40 */
+ 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, /* 0x40 */
+ 0x8AF4, 0x8AF5, 0x8AF6, 0x8AF7, 0x8AF8, 0x8AF9, 0x8AFA, 0x8AFB, /* 0x50 */
+ 0x8AFC, 0x8AFD, 0x8AFE, 0x8AFF, 0x8B00, 0x8B01, 0x8B02, 0x8B03, /* 0x50 */
+ 0x8B04, 0x8B05, 0x8B06, 0x8B08, 0x8B09, 0x8B0A, 0x8B0B, 0x8B0C, /* 0x60 */
+ 0x8B0D, 0x8B0E, 0x8B0F, 0x8B10, 0x8B11, 0x8B12, 0x8B13, 0x8B14, /* 0x60 */
+ 0x8B15, 0x8B16, 0x8B17, 0x8B18, 0x8B19, 0x8B1A, 0x8B1B, 0x8B1C, /* 0x70 */
+ 0x8B1D, 0x8B1E, 0x8B1F, 0x8B20, 0x8B21, 0x8B22, 0x8B23, 0, /* 0x70 */
+ 0x8B24, 0x8B25, 0x8B27, 0x8B28, 0x8B29, 0x8B2A, 0x8B2B, 0x8B2C, /* 0x80 */
+ 0x8B2D, 0x8B2E, 0x8B2F, 0x8B30, 0x8B31, 0x8B32, 0x8B33, 0x8B34, /* 0x80 */
+ 0x8B35, 0x8B36, 0x8B37, 0x8B38, 0x8B39, 0x8B3A, 0x8B3B, 0x8B3C, /* 0x90 */
+ 0x8B3D, 0x8B3E, 0x8B3F, 0x8B40, 0x8B41, 0x8B42, 0x8B43, 0x8B44, /* 0x90 */
+ 0x8B45, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, /* 0xA0 */
+ 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, /* 0xA0 */
+ 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, /* 0xB0 */
+ 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, /* 0xB0 */
+ 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, /* 0xC0 */
+ 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, /* 0xC0 */
+ 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, /* 0xD0 */
+ 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, /* 0xD0 */
+ 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, /* 0xE0 */
+ 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, /* 0xE0 */
+ 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, /* 0xF0 */
+ 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B46, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, 0x8B4C, 0x8B4D, /* 0x40 */
+ 0x8B4E, 0x8B4F, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, /* 0x40 */
+ 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, /* 0x50 */
+ 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, /* 0x50 */
+ 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6D, 0x8B6E, 0x8B6F, /* 0x60 */
+ 0x8B70, 0x8B71, 0x8B72, 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, /* 0x60 */
+ 0x8B78, 0x8B79, 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7D, 0x8B7E, 0x8B7F, /* 0x70 */
+ 0x8B80, 0x8B81, 0x8B82, 0x8B83, 0x8B84, 0x8B85, 0x8B86, 0, /* 0x70 */
+ 0x8B87, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0x8B8D, 0x8B8E, /* 0x80 */
+ 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, 0x8B94, 0x8B95, 0x8B96, /* 0x80 */
+ 0x8B97, 0x8B98, 0x8B99, 0x8B9A, 0x8B9B, 0x8B9C, 0x8B9D, 0x8B9E, /* 0x90 */
+ 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7, 0x8BD0, 0x8BEA, 0x8C09, /* 0x90 */
+ 0x8C1E, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, /* 0xA0 */
+ 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, /* 0xA0 */
+ 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, /* 0xB0 */
+ 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, /* 0xB0 */
+ 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, /* 0xC0 */
+ 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, /* 0xC0 */
+ 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, /* 0xD0 */
+ 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, /* 0xD0 */
+ 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, /* 0xE0 */
+ 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, /* 0xE0 */
+ 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, /* 0xF0 */
+ 0x5750, 0x5EA7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8C38, 0x8C39, 0x8C3A, 0x8C3B, 0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, /* 0x40 */
+ 0x8C40, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C48, 0x8C4A, 0x8C4B, /* 0x40 */
+ 0x8C4D, 0x8C4E, 0x8C4F, 0x8C50, 0x8C51, 0x8C52, 0x8C53, 0x8C54, /* 0x50 */
+ 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C, 0x8C5D, 0x8C5E, /* 0x50 */
+ 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66, 0x8C67, 0x8C68, /* 0x60 */
+ 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70, 0x8C71, 0x8C72, /* 0x60 */
+ 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C, 0x8C7D, 0x8C7E, /* 0x70 */
+ 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86, 0x8C87, 0, /* 0x70 */
+ 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, /* 0x80 */
+ 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B, 0x8C9C, /* 0x80 */
+ 0x8C9D, 0x8C9E, 0x8C9F, 0x8CA0, 0x8CA1, 0x8CA2, 0x8CA3, 0x8CA4, /* 0x90 */
+ 0x8CA5, 0x8CA6, 0x8CA7, 0x8CA8, 0x8CA9, 0x8CAA, 0x8CAB, 0x8CAC, /* 0x90 */
+ 0x8CAD, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, /* 0xA0 */
+ 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, /* 0xA0 */
+ 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, /* 0xB0 */
+ 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, /* 0xB0 */
+ 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, /* 0xC0 */
+ 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, /* 0xC0 */
+ 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, /* 0xD0 */
+ 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, /* 0xD0 */
+ 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, /* 0xE0 */
+ 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, /* 0xE0 */
+ 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, /* 0xF0 */
+ 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_D9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8CAE, 0x8CAF, 0x8CB0, 0x8CB1, 0x8CB2, 0x8CB3, 0x8CB4, 0x8CB5, /* 0x40 */
+ 0x8CB6, 0x8CB7, 0x8CB8, 0x8CB9, 0x8CBA, 0x8CBB, 0x8CBC, 0x8CBD, /* 0x40 */
+ 0x8CBE, 0x8CBF, 0x8CC0, 0x8CC1, 0x8CC2, 0x8CC3, 0x8CC4, 0x8CC5, /* 0x50 */
+ 0x8CC6, 0x8CC7, 0x8CC8, 0x8CC9, 0x8CCA, 0x8CCB, 0x8CCC, 0x8CCD, /* 0x50 */
+ 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD1, 0x8CD2, 0x8CD3, 0x8CD4, 0x8CD5, /* 0x60 */
+ 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0x8CDB, 0x8CDC, 0x8CDD, /* 0x60 */
+ 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, 0x8CE2, 0x8CE3, 0x8CE4, 0x8CE5, /* 0x70 */
+ 0x8CE6, 0x8CE7, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, 0, /* 0x70 */
+ 0x8CED, 0x8CEE, 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF4, /* 0x80 */
+ 0x8CF5, 0x8CF6, 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x8CFB, 0x8CFC, /* 0x80 */
+ 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D04, /* 0x90 */
+ 0x8D05, 0x8D06, 0x8D07, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x8D0C, /* 0x90 */
+ 0x8D0D, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, /* 0xA0 */
+ 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, /* 0xA0 */
+ 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, /* 0xB0 */
+ 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, /* 0xB0 */
+ 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E, /* 0xC0 */
+ 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7, /* 0xC0 */
+ 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, /* 0xD0 */
+ 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, /* 0xD0 */
+ 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914, /* 0xE0 */
+ 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0, /* 0xE0 */
+ 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980, /* 0xF0 */
+ 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_DA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8D0E, 0x8D0F, 0x8D10, 0x8D11, 0x8D12, 0x8D13, 0x8D14, 0x8D15, /* 0x40 */
+ 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D1B, 0x8D1C, 0x8D20, /* 0x40 */
+ 0x8D51, 0x8D52, 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, /* 0x50 */
+ 0x8D6C, 0x8D6E, 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, /* 0x50 */
+ 0x8D7B, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, /* 0x60 */
+ 0x8D86, 0x8D87, 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, /* 0x60 */
+ 0x8D90, 0x8D92, 0x8D93, 0x8D95, 0x8D96, 0x8D97, 0x8D98, 0x8D99, /* 0x70 */
+ 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D, 0x8D9E, 0x8DA0, 0x8DA1, 0, /* 0x70 */
+ 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, /* 0x80 */
+ 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB2, 0x8DB6, /* 0x80 */
+ 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2, 0x8DC5, /* 0x90 */
+ 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2, 0x8DD3, /* 0x90 */
+ 0x8DD4, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7, /* 0xA0 */
+ 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF, /* 0xA0 */
+ 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC, /* 0xB0 */
+ 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3, /* 0xB0 */
+ 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07, /* 0xC0 */
+ 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19, /* 0xC0 */
+ 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27, /* 0xD0 */
+ 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36, /* 0xD0 */
+ 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, /* 0xE0 */
+ 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672, /* 0xE0 */
+ 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D, /* 0xF0 */
+ 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_DB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1, 0x8DE2, 0x8DE5, /* 0x40 */
+ 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0, 0x8DF1, 0x8DF2, /* 0x40 */
+ 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00, 0x8E01, 0x8E02, /* 0x50 */
+ 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B, 0x8E0D, 0x8E0E, /* 0x50 */
+ 0x8E10, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17, 0x8E18, /* 0x60 */
+ 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24, 0x8E25, /* 0x60 */
+ 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32, 0x8E33, /* 0x70 */
+ 0x8E34, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0, /* 0x70 */
+ 0x8E3F, 0x8E43, 0x8E45, 0x8E46, 0x8E4C, 0x8E4D, 0x8E4E, 0x8E4F, /* 0x80 */
+ 0x8E50, 0x8E53, 0x8E54, 0x8E55, 0x8E56, 0x8E57, 0x8E58, 0x8E5A, /* 0x80 */
+ 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, /* 0x90 */
+ 0x8E63, 0x8E64, 0x8E65, 0x8E67, 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, /* 0x90 */
+ 0x8E71, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4, /* 0xA0 */
+ 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, /* 0xA0 */
+ 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, /* 0xB0 */
+ 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD, /* 0xB0 */
+ 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, /* 0xC0 */
+ 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF, /* 0xC0 */
+ 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, /* 0xD0 */
+ 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B, /* 0xD0 */
+ 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768, /* 0xE0 */
+ 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF, /* 0xE0 */
+ 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9, /* 0xF0 */
+ 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_DC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E73, 0x8E75, 0x8E77, 0x8E78, 0x8E79, 0x8E7A, 0x8E7B, 0x8E7D, /* 0x40 */
+ 0x8E7E, 0x8E80, 0x8E82, 0x8E83, 0x8E84, 0x8E86, 0x8E88, 0x8E89, /* 0x40 */
+ 0x8E8A, 0x8E8B, 0x8E8C, 0x8E8D, 0x8E8E, 0x8E91, 0x8E92, 0x8E93, /* 0x50 */
+ 0x8E95, 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0x8E9D, /* 0x50 */
+ 0x8E9F, 0x8EA0, 0x8EA1, 0x8EA2, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, /* 0x60 */
+ 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAA, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1, /* 0x60 */
+ 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB, /* 0x70 */
+ 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC0, 0x8EC1, 0x8EC2, 0, /* 0x70 */
+ 0x8EC3, 0x8EC4, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECA, /* 0x80 */
+ 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECF, 0x8ED0, 0x8ED1, 0x8ED2, 0x8ED3, /* 0x80 */
+ 0x8ED4, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDB, /* 0x90 */
+ 0x8EDC, 0x8EDD, 0x8EDE, 0x8EDF, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3, /* 0x90 */
+ 0x8EE4, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, /* 0xA0 */
+ 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, /* 0xA0 */
+ 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, /* 0xB0 */
+ 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, /* 0xB0 */
+ 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, /* 0xC0 */
+ 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, /* 0xC0 */
+ 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, /* 0xD0 */
+ 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, /* 0xD0 */
+ 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, /* 0xE0 */
+ 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, /* 0xE0 */
+ 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, /* 0xF0 */
+ 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_DD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, /* 0x40 */
+ 0x8EED, 0x8EEE, 0x8EEF, 0x8EF0, 0x8EF1, 0x8EF2, 0x8EF3, 0x8EF4, /* 0x40 */
+ 0x8EF5, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, /* 0x50 */
+ 0x8EFD, 0x8EFE, 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F03, 0x8F04, /* 0x50 */
+ 0x8F05, 0x8F06, 0x8F07, 0x8F08, 0x8F09, 0x8F0A, 0x8F0B, 0x8F0C, /* 0x60 */
+ 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F12, 0x8F13, 0x8F14, /* 0x60 */
+ 0x8F15, 0x8F16, 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F1B, 0x8F1C, /* 0x70 */
+ 0x8F1D, 0x8F1E, 0x8F1F, 0x8F20, 0x8F21, 0x8F22, 0x8F23, 0, /* 0x70 */
+ 0x8F24, 0x8F25, 0x8F26, 0x8F27, 0x8F28, 0x8F29, 0x8F2A, 0x8F2B, /* 0x80 */
+ 0x8F2C, 0x8F2D, 0x8F2E, 0x8F2F, 0x8F30, 0x8F31, 0x8F32, 0x8F33, /* 0x80 */
+ 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F38, 0x8F39, 0x8F3A, 0x8F3B, /* 0x90 */
+ 0x8F3C, 0x8F3D, 0x8F3E, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43, /* 0x90 */
+ 0x8F44, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E, /* 0xA0 */
+ 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C, /* 0xA0 */
+ 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398, /* 0xB0 */
+ 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8, /* 0xB0 */
+ 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, /* 0xC0 */
+ 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, /* 0xC0 */
+ 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451, /* 0xD0 */
+ 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478, /* 0xD0 */
+ 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D, /* 0xE0 */
+ 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF, /* 0xE0 */
+ 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3, /* 0xF0 */
+ 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_DE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8F45, 0x8F46, 0x8F47, 0x8F48, 0x8F49, 0x8F4A, 0x8F4B, 0x8F4C, /* 0x40 */
+ 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F54, /* 0x40 */
+ 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, /* 0x50 */
+ 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, 0x8F61, 0x8F62, 0x8F63, 0x8F64, /* 0x50 */
+ 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92, 0x8F9D, 0x8FA0, 0x8FA1, /* 0x60 */
+ 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA6, 0x8FA7, 0x8FAA, 0x8FAC, 0x8FAD, /* 0x60 */
+ 0x8FAE, 0x8FAF, 0x8FB2, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, /* 0x70 */
+ 0x8FBA, 0x8FBB, 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0, /* 0x70 */
+ 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, /* 0x80 */
+ 0x8FD7, 0x8FDA, 0x8FE0, 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, /* 0x80 */
+ 0x8FF1, 0x8FF2, 0x8FF4, 0x8FF5, 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, /* 0x90 */
+ 0x8FFE, 0x8FFF, 0x9007, 0x9008, 0x900C, 0x900E, 0x9013, 0x9015, /* 0x90 */
+ 0x9018, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, /* 0xA0 */
+ 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4, /* 0xA0 */
+ 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9, /* 0xB0 */
+ 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, /* 0xB0 */
+ 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037, /* 0xC0 */
+ 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34, /* 0xC0 */
+ 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, /* 0xD0 */
+ 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, /* 0xD0 */
+ 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, /* 0xE0 */
+ 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE, /* 0xE0 */
+ 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420, /* 0xF0 */
+ 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496 /* 0xF0 */
+};
+static sal_uInt16 const aImplDBCSToUniTab_GBK_DF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9019, 0x901C, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, /* 0x40 */
+ 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, /* 0x40 */
+ 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043, 0x9045, /* 0x50 */
+ 0x9046, 0x9048, 0x9049, 0x904A, 0x904B, 0x904C, 0x904E, 0x9054, /* 0x50 */
+ 0x9055, 0x9056, 0x9059, 0x905A, 0x905C, 0x905D, 0x905E, 0x905F, /* 0x60 */
+ 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906A, 0x906B, /* 0x60 */
+ 0x906C, 0x906F, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, /* 0x70 */
+ 0x9078, 0x9079, 0x907A, 0x907B, 0x907C, 0x907E, 0x9081, 0, /* 0x70 */
+ 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908A, 0x908C, 0x908D, /* 0x80 */
+ 0x908E, 0x908F, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909A, /* 0x80 */
+ 0x909C, 0x909E, 0x909F, 0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, /* 0x90 */
+ 0x90A9, 0x90AB, 0x90AD, 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, /* 0x90 */
+ 0x90C0, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0, /* 0xA0 */
+ 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, /* 0xA0 */
+ 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB, /* 0xB0 */
+ 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456, /* 0xB0 */
+ 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, /* 0xC0 */
+ 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466, /* 0xC0 */
+ 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6, /* 0xD0 */
+ 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC, /* 0xD0 */
+ 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF, /* 0xE0 */
+ 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522, /* 0xE0 */
+ 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5, /* 0xF0 */
+ 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x90C2, 0x90C3, 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, /* 0x40 */
+ 0x90D2, 0x90D4, 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, /* 0x40 */
+ 0x90DF, 0x90E0, 0x90E3, 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, /* 0x50 */
+ 0x90EE, 0x90F0, 0x90F1, 0x90F2, 0x90F3, 0x90F5, 0x90F6, 0x90F7, /* 0x50 */
+ 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FF, 0x9100, 0x9101, 0x9103, /* 0x60 */
+ 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910A, 0x910B, 0x910C, /* 0x60 */
+ 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, /* 0x70 */
+ 0x9115, 0x9116, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C, 0, /* 0x70 */
+ 0x911D, 0x911F, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, /* 0x80 */
+ 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x9130, /* 0x80 */
+ 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913A, /* 0x90 */
+ 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, /* 0x90 */
+ 0x9144, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, /* 0xA0 */
+ 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, /* 0xA0 */
+ 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, /* 0xB0 */
+ 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, /* 0xB0 */
+ 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, /* 0xC0 */
+ 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, /* 0xC0 */
+ 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, /* 0xD0 */
+ 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, /* 0xD0 */
+ 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, /* 0xE0 */
+ 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, /* 0xE0 */
+ 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, /* 0xF0 */
+ 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, /* 0x40 */
+ 0x9158, 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, /* 0x40 */
+ 0x9168, 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, /* 0x50 */
+ 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, /* 0x50 */
+ 0x918F, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, /* 0x60 */
+ 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, /* 0x60 */
+ 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AB, 0x91AC, 0x91B0, 0x91B1, /* 0x70 */
+ 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BB, 0, /* 0x70 */
+ 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, /* 0x80 */
+ 0x91C4, 0x91C5, 0x91C6, 0x91C8, 0x91CB, 0x91D0, 0x91D2, 0x91D3, /* 0x80 */
+ 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, /* 0x90 */
+ 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, /* 0x90 */
+ 0x91E5, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, /* 0xA0 */
+ 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91, /* 0xA0 */
+ 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, /* 0xB0 */
+ 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, /* 0xB0 */
+ 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, /* 0xC0 */
+ 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, /* 0xC0 */
+ 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, /* 0xD0 */
+ 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87, /* 0xD0 */
+ 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, /* 0xE0 */
+ 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8, /* 0xE0 */
+ 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9, /* 0xF0 */
+ 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, /* 0x40 */
+ 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5, /* 0x40 */
+ 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, /* 0x50 */
+ 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, /* 0x50 */
+ 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, /* 0x60 */
+ 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, /* 0x60 */
+ 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, /* 0x70 */
+ 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0, /* 0x70 */
+ 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, /* 0x80 */
+ 0x922D, 0x922E, 0x922F, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, /* 0x80 */
+ 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, /* 0x90 */
+ 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, /* 0x90 */
+ 0x9245, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D, /* 0xA0 */
+ 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, /* 0xA0 */
+ 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, /* 0xB0 */
+ 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A, /* 0xB0 */
+ 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987, /* 0xC0 */
+ 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80, /* 0xC0 */
+ 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, /* 0xD0 */
+ 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, /* 0xD0 */
+ 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1, /* 0xE0 */
+ 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, /* 0xE0 */
+ 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, /* 0xF0 */
+ 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9246, 0x9247, 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, /* 0x40 */
+ 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, /* 0x40 */
+ 0x9256, 0x9257, 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, /* 0x50 */
+ 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, /* 0x50 */
+ 0x9266, 0x9267, 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, /* 0x60 */
+ 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, /* 0x60 */
+ 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, /* 0x70 */
+ 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0, /* 0x70 */
+ 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, /* 0x80 */
+ 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, /* 0x80 */
+ 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, /* 0x90 */
+ 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4, 0x92A5, 0x92A6, /* 0x90 */
+ 0x92A7, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083, /* 0xA0 */
+ 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8, /* 0xA0 */
+ 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4, /* 0xB0 */
+ 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, /* 0xB0 */
+ 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1, /* 0xC0 */
+ 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606, /* 0xC0 */
+ 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615, /* 0xD0 */
+ 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35, /* 0xD0 */
+ 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, /* 0xE0 */
+ 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4, /* 0xE0 */
+ 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, /* 0xF0 */
+ 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AF, 0x92B0, /* 0x40 */
+ 0x92B1, 0x92B2, 0x92B3, 0x92B4, 0x92B5, 0x92B6, 0x92B7, 0x92B8, /* 0x40 */
+ 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, /* 0x50 */
+ 0x92C1, 0x92C2, 0x92C3, 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C9, /* 0x50 */
+ 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, /* 0x60 */
+ 0x92D2, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0x92D8, 0x92D9, /* 0x60 */
+ 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, /* 0x70 */
+ 0x92E2, 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0, /* 0x70 */
+ 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, /* 0x80 */
+ 0x92F1, 0x92F2, 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, /* 0x80 */
+ 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, /* 0x90 */
+ 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, /* 0x90 */
+ 0x9309, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, /* 0xA0 */
+ 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, /* 0xA0 */
+ 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, /* 0xB0 */
+ 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, /* 0xB0 */
+ 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, /* 0xC0 */
+ 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, /* 0xC0 */
+ 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, /* 0xD0 */
+ 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, /* 0xD0 */
+ 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, /* 0xE0 */
+ 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, /* 0xE0 */
+ 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, /* 0xF0 */
+ 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, /* 0x40 */
+ 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, /* 0x40 */
+ 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, /* 0x50 */
+ 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, /* 0x50 */
+ 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, /* 0x60 */
+ 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, /* 0x60 */
+ 0x933A, 0x933B, 0x933C, 0x933D, 0x933F, 0x9340, 0x9341, 0x9342, /* 0x70 */
+ 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0, /* 0x70 */
+ 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351, /* 0x80 */
+ 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, /* 0x80 */
+ 0x935A, 0x935B, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361, /* 0x90 */
+ 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, /* 0x90 */
+ 0x936B, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, /* 0xA0 */
+ 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, /* 0xA0 */
+ 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, /* 0xB0 */
+ 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, /* 0xB0 */
+ 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, /* 0xC0 */
+ 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011, /* 0xC0 */
+ 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, /* 0xD0 */
+ 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, /* 0xD0 */
+ 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, /* 0xE0 */
+ 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, /* 0xE0 */
+ 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, /* 0xF0 */
+ 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, /* 0x40 */
+ 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937A, 0x937B, /* 0x40 */
+ 0x937C, 0x937D, 0x937E, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, /* 0x50 */
+ 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938A, 0x938B, /* 0x50 */
+ 0x938C, 0x938D, 0x938E, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, /* 0x60 */
+ 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, /* 0x60 */
+ 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A2, 0x93A3, 0x93A4, /* 0x70 */
+ 0x93A5, 0x93A6, 0x93A7, 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0, /* 0x70 */
+ 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, /* 0x80 */
+ 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, /* 0x80 */
+ 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, /* 0x90 */
+ 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CB, 0x93CC, /* 0x90 */
+ 0x93CD, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2, /* 0xA0 */
+ 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3, /* 0xA0 */
+ 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23, /* 0xB0 */
+ 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75, /* 0xB0 */
+ 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, /* 0xC0 */
+ 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6, /* 0xC0 */
+ 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, /* 0xD0 */
+ 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, /* 0xD0 */
+ 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81, /* 0xE0 */
+ 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98, /* 0xE0 */
+ 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5, /* 0xF0 */
+ 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, /* 0x40 */
+ 0x93D7, 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, /* 0x40 */
+ 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, /* 0x50 */
+ 0x93E7, 0x93E8, 0x93E9, 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, /* 0x50 */
+ 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, /* 0x60 */
+ 0x93F7, 0x93F8, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, /* 0x60 */
+ 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, /* 0x70 */
+ 0x9407, 0x9408, 0x9409, 0x940A, 0x940B, 0x940C, 0x940D, 0, /* 0x70 */
+ 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, /* 0x80 */
+ 0x9416, 0x9417, 0x9418, 0x9419, 0x941A, 0x941B, 0x941C, 0x941D, /* 0x80 */
+ 0x941E, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, /* 0x90 */
+ 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D, /* 0x90 */
+ 0x942E, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9, /* 0xA0 */
+ 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1, /* 0xA0 */
+ 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6, /* 0xB0 */
+ 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08, /* 0xB0 */
+ 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C, /* 0xC0 */
+ 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26, /* 0xC0 */
+ 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31, /* 0xD0 */
+ 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, /* 0xD0 */
+ 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1, /* 0xE0 */
+ 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C, /* 0xE0 */
+ 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A, /* 0xF0 */
+ 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, /* 0x40 */
+ 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D, 0x943F, /* 0x40 */
+ 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, /* 0x50 */
+ 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, /* 0x50 */
+ 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, /* 0x60 */
+ 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, /* 0x60 */
+ 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, /* 0x70 */
+ 0x9468, 0x9469, 0x946A, 0x946C, 0x946D, 0x946E, 0x946F, 0, /* 0x70 */
+ 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, /* 0x80 */
+ 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D, 0x947E, 0x947F, /* 0x80 */
+ 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, /* 0x90 */
+ 0x94C7, 0x94CF, 0x94D3, 0x94D4, 0x94DA, 0x94E6, 0x94FB, 0x951C, /* 0x90 */
+ 0x9520, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, /* 0xA0 */
+ 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, /* 0xA0 */
+ 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, /* 0xB0 */
+ 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, /* 0xB0 */
+ 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, /* 0xC0 */
+ 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, /* 0xC0 */
+ 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, /* 0xD0 */
+ 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, /* 0xD0 */
+ 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, /* 0xE0 */
+ 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, /* 0xE0 */
+ 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, /* 0xF0 */
+ 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_E9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9527, 0x9533, 0x953D, 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, /* 0x40 */
+ 0x9560, 0x956E, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957A, /* 0x40 */
+ 0x957B, 0x957C, 0x957D, 0x957E, 0x9580, 0x9581, 0x9582, 0x9583, /* 0x50 */
+ 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958A, 0x958B, /* 0x50 */
+ 0x958C, 0x958D, 0x958E, 0x958F, 0x9590, 0x9591, 0x9592, 0x9593, /* 0x60 */
+ 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959A, 0x959B, /* 0x60 */
+ 0x959C, 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A1, 0x95A2, 0x95A3, /* 0x70 */
+ 0x95A4, 0x95A5, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0x95AA, 0, /* 0x70 */
+ 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B2, /* 0x80 */
+ 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0x95B8, 0x95B9, 0x95BA, /* 0x80 */
+ 0x95BB, 0x95BC, 0x95BD, 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0x95C2, /* 0x90 */
+ 0x95C3, 0x95C4, 0x95C5, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0x95CA, /* 0x90 */
+ 0x95CB, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, /* 0xA0 */
+ 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980, /* 0xA0 */
+ 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989, /* 0xB0 */
+ 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, /* 0xB0 */
+ 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D, /* 0xC0 */
+ 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, /* 0xC0 */
+ 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, /* 0xD0 */
+ 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, /* 0xD0 */
+ 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93, /* 0xE0 */
+ 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, /* 0xE0 */
+ 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A, /* 0xF0 */
+ 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_EA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, 0x95D3, /* 0x40 */
+ 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, 0x95DB, /* 0x40 */
+ 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, 0x95E3, /* 0x50 */
+ 0x95E4, 0x95E5, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, /* 0x50 */
+ 0x9618, 0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, /* 0x60 */
+ 0x9627, 0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, /* 0x60 */
+ 0x9637, 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, /* 0x70 */
+ 0x964E, 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0, /* 0x70 */
+ 0x9658, 0x9659, 0x965A, 0x965C, 0x965D, 0x965E, 0x9660, 0x9663, /* 0x80 */
+ 0x9665, 0x9666, 0x966B, 0x966D, 0x966E, 0x966F, 0x9670, 0x9671, /* 0x80 */
+ 0x9673, 0x9678, 0x9679, 0x967A, 0x967B, 0x967C, 0x967D, 0x967E, /* 0x90 */
+ 0x967F, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, /* 0x90 */
+ 0x968A, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B, /* 0xA0 */
+ 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C, /* 0xA0 */
+ 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, /* 0xB0 */
+ 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615, /* 0xB0 */
+ 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, /* 0xC0 */
+ 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657, /* 0xC0 */
+ 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC, /* 0xD0 */
+ 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40, /* 0xD0 */
+ 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59, /* 0xE0 */
+ 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1, /* 0xE0 */
+ 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, /* 0xF0 */
+ 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_EB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x968C, 0x968E, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969A, /* 0x40 */
+ 0x969B, 0x969D, 0x969E, 0x969F, 0x96A0, 0x96A1, 0x96A2, 0x96A3, /* 0x40 */
+ 0x96A4, 0x96A5, 0x96A6, 0x96A8, 0x96A9, 0x96AA, 0x96AB, 0x96AC, /* 0x50 */
+ 0x96AD, 0x96AE, 0x96AF, 0x96B1, 0x96B2, 0x96B4, 0x96B5, 0x96B7, /* 0x50 */
+ 0x96B8, 0x96BA, 0x96BB, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, /* 0x60 */
+ 0x96CB, 0x96D0, 0x96D1, 0x96D3, 0x96D4, 0x96D6, 0x96D7, 0x96D8, /* 0x60 */
+ 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0x96DD, 0x96DE, 0x96DF, 0x96E1, /* 0x70 */
+ 0x96E2, 0x96E3, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, 0, /* 0x70 */
+ 0x96EC, 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F2, 0x96F4, 0x96F5, /* 0x80 */
+ 0x96F8, 0x96FA, 0x96FB, 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, /* 0x80 */
+ 0x9705, 0x970A, 0x970B, 0x970C, 0x9710, 0x9711, 0x9712, 0x9714, /* 0x90 */
+ 0x9715, 0x9717, 0x9718, 0x9719, 0x971A, 0x971B, 0x971D, 0x971F, /* 0x90 */
+ 0x9720, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5, /* 0xA0 */
+ 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, /* 0xA0 */
+ 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, /* 0xB0 */
+ 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, /* 0xB0 */
+ 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, /* 0xC0 */
+ 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2, /* 0xC0 */
+ 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1, /* 0xD0 */
+ 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, /* 0xD0 */
+ 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, /* 0xE0 */
+ 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, /* 0xE0 */
+ 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191, /* 0xF0 */
+ 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_EC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, /* 0x40 */
+ 0x9729, 0x972B, 0x972C, 0x972E, 0x972F, 0x9731, 0x9733, 0x9734, /* 0x40 */
+ 0x9735, 0x9736, 0x9737, 0x973A, 0x973B, 0x973C, 0x973D, 0x973F, /* 0x50 */
+ 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, /* 0x50 */
+ 0x9748, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E, 0x974F, /* 0x60 */
+ 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975A, 0x975C, /* 0x60 */
+ 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976A, /* 0x70 */
+ 0x976B, 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0, /* 0x70 */
+ 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, /* 0x80 */
+ 0x977E, 0x977F, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, /* 0x80 */
+ 0x9787, 0x9788, 0x9789, 0x978A, 0x978C, 0x978E, 0x978F, 0x9790, /* 0x90 */
+ 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979A, 0x979B, 0x979C, /* 0x90 */
+ 0x979D, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, /* 0xA0 */
+ 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, /* 0xA0 */
+ 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, /* 0xB0 */
+ 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, /* 0xB0 */
+ 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, /* 0xC0 */
+ 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, /* 0xC0 */
+ 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, /* 0xD0 */
+ 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, /* 0xD0 */
+ 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, /* 0xE0 */
+ 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, /* 0xE0 */
+ 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, /* 0xF0 */
+ 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_ED[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x979E, 0x979F, 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A6, 0x97A7, /* 0x40 */
+ 0x97A8, 0x97A9, 0x97AA, 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, /* 0x40 */
+ 0x97B5, 0x97B6, 0x97B7, 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, /* 0x50 */
+ 0x97BD, 0x97BE, 0x97BF, 0x97C0, 0x97C1, 0x97C2, 0x97C3, 0x97C4, /* 0x50 */
+ 0x97C5, 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, /* 0x60 */
+ 0x97CD, 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D3, 0x97D4, /* 0x60 */
+ 0x97D5, 0x97D6, 0x97D7, 0x97D8, 0x97D9, 0x97DA, 0x97DB, 0x97DC, /* 0x70 */
+ 0x97DD, 0x97DE, 0x97DF, 0x97E0, 0x97E1, 0x97E2, 0x97E3, 0, /* 0x70 */
+ 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, /* 0x80 */
+ 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB, 0x97FC, 0x97FD, /* 0x80 */
+ 0x97FE, 0x97FF, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, /* 0x90 */
+ 0x9806, 0x9807, 0x9808, 0x9809, 0x980A, 0x980B, 0x980C, 0x980D, /* 0x90 */
+ 0x980E, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, /* 0xA0 */
+ 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1, /* 0xA0 */
+ 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, /* 0xB0 */
+ 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C, /* 0xB0 */
+ 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C, /* 0xC0 */
+ 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850, /* 0xC0 */
+ 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C, /* 0xD0 */
+ 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, /* 0xD0 */
+ 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, /* 0xE0 */
+ 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9, /* 0xE0 */
+ 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, /* 0xF0 */
+ 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_EE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x980F, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, /* 0x40 */
+ 0x9817, 0x9818, 0x9819, 0x981A, 0x981B, 0x981C, 0x981D, 0x981E, /* 0x40 */
+ 0x981F, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, /* 0x50 */
+ 0x9827, 0x9828, 0x9829, 0x982A, 0x982B, 0x982C, 0x982D, 0x982E, /* 0x50 */
+ 0x982F, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, /* 0x60 */
+ 0x9837, 0x9838, 0x9839, 0x983A, 0x983B, 0x983C, 0x983D, 0x983E, /* 0x60 */
+ 0x983F, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, /* 0x70 */
+ 0x9847, 0x9848, 0x9849, 0x984A, 0x984B, 0x984C, 0x984D, 0, /* 0x70 */
+ 0x984E, 0x984F, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, /* 0x80 */
+ 0x9856, 0x9857, 0x9858, 0x9859, 0x985A, 0x985B, 0x985C, 0x985D, /* 0x80 */
+ 0x985E, 0x985F, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, /* 0x90 */
+ 0x9866, 0x9867, 0x9868, 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, /* 0x90 */
+ 0x986E, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, /* 0xA0 */
+ 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, /* 0xA0 */
+ 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, /* 0xB0 */
+ 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81, /* 0xB0 */
+ 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B, /* 0xC0 */
+ 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495, /* 0xC0 */
+ 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD, /* 0xD0 */
+ 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8, /* 0xD0 */
+ 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9, /* 0xE0 */
+ 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2, /* 0xE0 */
+ 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF, /* 0xF0 */
+ 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_EF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x986F, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988B, 0x988E, /* 0x40 */
+ 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A8, 0x98A9, 0x98AA, 0x98AB, /* 0x40 */
+ 0x98AC, 0x98AD, 0x98AE, 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3, /* 0x50 */
+ 0x98B4, 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, /* 0x50 */
+ 0x98BC, 0x98BD, 0x98BE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, /* 0x60 */
+ 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0x98CB, /* 0x60 */
+ 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7, 0x98DB, /* 0x70 */
+ 0x98DC, 0x98DD, 0x98E0, 0x98E1, 0x98E2, 0x98E3, 0x98E4, 0, /* 0x70 */
+ 0x98E5, 0x98E6, 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0x98ED, 0x98EE, /* 0x80 */
+ 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6, /* 0x80 */
+ 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD, 0x98FE, /* 0x90 */
+ 0x98FF, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, /* 0x90 */
+ 0x9907, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5, /* 0xA0 */
+ 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506, /* 0xA0 */
+ 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513, /* 0xB0 */
+ 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F, /* 0xB0 */
+ 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534, /* 0xC0 */
+ 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535, /* 0xC0 */
+ 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552, /* 0xD0 */
+ 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E, /* 0xD0 */
+ 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, /* 0xE0 */
+ 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572, /* 0xE0 */
+ 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, /* 0xF0 */
+ 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9908, 0x9909, 0x990A, 0x990B, 0x990C, 0x990E, 0x990F, 0x9911, /* 0x40 */
+ 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, /* 0x40 */
+ 0x991A, 0x991B, 0x991C, 0x991D, 0x991E, 0x991F, 0x9920, 0x9921, /* 0x50 */
+ 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, /* 0x50 */
+ 0x992A, 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932, /* 0x60 */
+ 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993A, /* 0x60 */
+ 0x993B, 0x993C, 0x993D, 0x993E, 0x993F, 0x9940, 0x9941, 0x9942, /* 0x70 */
+ 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0, /* 0x70 */
+ 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, /* 0x80 */
+ 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995A, 0x995B, /* 0x80 */
+ 0x995C, 0x995D, 0x995E, 0x995F, 0x9960, 0x9961, 0x9962, 0x9964, /* 0x90 */
+ 0x9966, 0x9973, 0x9978, 0x9979, 0x997B, 0x997E, 0x9982, 0x9983, /* 0x90 */
+ 0x9989, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, /* 0xA0 */
+ 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, /* 0xA0 */
+ 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, /* 0xB0 */
+ 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, /* 0xB0 */
+ 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, /* 0xC0 */
+ 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, /* 0xC0 */
+ 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, /* 0xD0 */
+ 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, /* 0xD0 */
+ 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, /* 0xE0 */
+ 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, /* 0xE0 */
+ 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, /* 0xF0 */
+ 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x998C, 0x998E, 0x999A, 0x999B, 0x999C, 0x999D, 0x999E, 0x999F, /* 0x40 */
+ 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, /* 0x40 */
+ 0x99AA, 0x99AB, 0x99AC, 0x99AD, 0x99AE, 0x99AF, 0x99B0, 0x99B1, /* 0x50 */
+ 0x99B2, 0x99B3, 0x99B4, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, /* 0x50 */
+ 0x99BA, 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C1, /* 0x60 */
+ 0x99C2, 0x99C3, 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, /* 0x60 */
+ 0x99CA, 0x99CB, 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D0, 0x99D1, /* 0x70 */
+ 0x99D2, 0x99D3, 0x99D4, 0x99D5, 0x99D6, 0x99D7, 0x99D8, 0, /* 0x70 */
+ 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, 0x99DE, 0x99DF, 0x99E0, /* 0x80 */
+ 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7, 0x99E8, /* 0x80 */
+ 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, 0x99EE, 0x99EF, 0x99F0, /* 0x90 */
+ 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, /* 0x90 */
+ 0x99F9, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, /* 0xA0 */
+ 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654, /* 0xA0 */
+ 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, /* 0xB0 */
+ 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, /* 0xB0 */
+ 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, /* 0xC0 */
+ 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3, /* 0xC0 */
+ 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, /* 0xD0 */
+ 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941, /* 0xD0 */
+ 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012, /* 0xE0 */
+ 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, /* 0xE0 */
+ 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D, /* 0xF0 */
+ 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x99FF, 0x9A00, 0x9A01, /* 0x40 */
+ 0x9A02, 0x9A03, 0x9A04, 0x9A05, 0x9A06, 0x9A07, 0x9A08, 0x9A09, /* 0x40 */
+ 0x9A0A, 0x9A0B, 0x9A0C, 0x9A0D, 0x9A0E, 0x9A0F, 0x9A10, 0x9A11, /* 0x50 */
+ 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A16, 0x9A17, 0x9A18, 0x9A19, /* 0x50 */
+ 0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21, /* 0x60 */
+ 0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29, /* 0x60 */
+ 0x9A2A, 0x9A2B, 0x9A2C, 0x9A2D, 0x9A2E, 0x9A2F, 0x9A30, 0x9A31, /* 0x70 */
+ 0x9A32, 0x9A33, 0x9A34, 0x9A35, 0x9A36, 0x9A37, 0x9A38, 0, /* 0x70 */
+ 0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3E, 0x9A3F, 0x9A40, /* 0x80 */
+ 0x9A41, 0x9A42, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0x9A47, 0x9A48, /* 0x80 */
+ 0x9A49, 0x9A4A, 0x9A4B, 0x9A4C, 0x9A4D, 0x9A4E, 0x9A4F, 0x9A50, /* 0x90 */
+ 0x9A51, 0x9A52, 0x9A53, 0x9A54, 0x9A55, 0x9A56, 0x9A57, 0x9A58, /* 0x90 */
+ 0x9A59, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B, /* 0xA0 */
+ 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654, /* 0xA0 */
+ 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, /* 0xB0 */
+ 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, /* 0xB0 */
+ 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF, /* 0xC0 */
+ 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3, /* 0xC0 */
+ 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703, /* 0xD0 */
+ 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, /* 0xD0 */
+ 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731, /* 0xE0 */
+ 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B, /* 0xE0 */
+ 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C, /* 0xF0 */
+ 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E, 0x9A5F, 0x9A60, 0x9A61, /* 0x40 */
+ 0x9A62, 0x9A63, 0x9A64, 0x9A65, 0x9A66, 0x9A67, 0x9A68, 0x9A69, /* 0x40 */
+ 0x9A6A, 0x9A6B, 0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, /* 0x50 */
+ 0x9A95, 0x9A99, 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, /* 0x50 */
+ 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, /* 0x60 */
+ 0x9ABD, 0x9ABE, 0x9ABF, 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, /* 0x60 */
+ 0x9AC9, 0x9ACA, 0x9ACD, 0x9ACE, 0x9ACF, 0x9AD0, 0x9AD2, 0x9AD4, /* 0x70 */
+ 0x9AD5, 0x9AD6, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0, /* 0x70 */
+ 0x9ADD, 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, /* 0x80 */
+ 0x9AE8, 0x9AE9, 0x9AEA, 0x9AEC, 0x9AEE, 0x9AF0, 0x9AF1, 0x9AF2, /* 0x80 */
+ 0x9AF3, 0x9AF4, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, /* 0x90 */
+ 0x9AFD, 0x9AFE, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, /* 0x90 */
+ 0x9B06, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, /* 0xA0 */
+ 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, /* 0xA0 */
+ 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, /* 0xB0 */
+ 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42, /* 0xB0 */
+ 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04, /* 0xC0 */
+ 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, /* 0xC0 */
+ 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E, /* 0xD0 */
+ 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E, /* 0xD0 */
+ 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8, /* 0xE0 */
+ 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB, /* 0xE0 */
+ 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, /* 0xF0 */
+ 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9B07, 0x9B09, 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0D, 0x9B0E, 0x9B10, /* 0x40 */
+ 0x9B11, 0x9B12, 0x9B14, 0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19, /* 0x40 */
+ 0x9B1A, 0x9B1B, 0x9B1C, 0x9B1D, 0x9B1E, 0x9B20, 0x9B21, 0x9B22, /* 0x50 */
+ 0x9B24, 0x9B25, 0x9B26, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2B, /* 0x50 */
+ 0x9B2C, 0x9B2D, 0x9B2E, 0x9B30, 0x9B31, 0x9B33, 0x9B34, 0x9B35, /* 0x60 */
+ 0x9B36, 0x9B37, 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, /* 0x60 */
+ 0x9B40, 0x9B46, 0x9B4A, 0x9B4B, 0x9B4C, 0x9B4E, 0x9B50, 0x9B52, /* 0x70 */
+ 0x9B53, 0x9B55, 0x9B56, 0x9B57, 0x9B58, 0x9B59, 0x9B5A, 0, /* 0x70 */
+ 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60, 0x9B61, 0x9B62, /* 0x80 */
+ 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68, 0x9B69, 0x9B6A, /* 0x80 */
+ 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, 0x9B70, 0x9B71, 0x9B72, /* 0x90 */
+ 0x9B73, 0x9B74, 0x9B75, 0x9B76, 0x9B77, 0x9B78, 0x9B79, 0x9B7A, /* 0x90 */
+ 0x9B7B, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, /* 0xA0 */
+ 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, /* 0xA0 */
+ 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, /* 0xB0 */
+ 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, /* 0xB0 */
+ 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, /* 0xC0 */
+ 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, /* 0xC0 */
+ 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, /* 0xD0 */
+ 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, /* 0xD0 */
+ 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, /* 0xE0 */
+ 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, /* 0xE0 */
+ 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, /* 0xF0 */
+ 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B81, 0x9B82, 0x9B83, /* 0x40 */
+ 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, /* 0x40 */
+ 0x9B8C, 0x9B8D, 0x9B8E, 0x9B8F, 0x9B90, 0x9B91, 0x9B92, 0x9B93, /* 0x50 */
+ 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99, 0x9B9A, 0x9B9B, /* 0x50 */
+ 0x9B9C, 0x9B9D, 0x9B9E, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, /* 0x60 */
+ 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAA, 0x9BAB, /* 0x60 */
+ 0x9BAC, 0x9BAD, 0x9BAE, 0x9BAF, 0x9BB0, 0x9BB1, 0x9BB2, 0x9BB3, /* 0x70 */
+ 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8, 0x9BB9, 0x9BBA, 0, /* 0x70 */
+ 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC0, 0x9BC1, 0x9BC2, /* 0x80 */
+ 0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC7, 0x9BC8, 0x9BC9, 0x9BCA, /* 0x80 */
+ 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, /* 0x90 */
+ 0x9BD3, 0x9BD4, 0x9BD5, 0x9BD6, 0x9BD7, 0x9BD8, 0x9BD9, 0x9BDA, /* 0x90 */
+ 0x9BDB, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E, /* 0xA0 */
+ 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, /* 0xA0 */
+ 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, /* 0xB0 */
+ 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, /* 0xB0 */
+ 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, /* 0xC0 */
+ 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, /* 0xC0 */
+ 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, /* 0xD0 */
+ 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, /* 0xD0 */
+ 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52, /* 0xE0 */
+ 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, /* 0xE0 */
+ 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, /* 0xF0 */
+ 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9BDC, 0x9BDD, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE1, 0x9BE2, 0x9BE3, /* 0x40 */
+ 0x9BE4, 0x9BE5, 0x9BE6, 0x9BE7, 0x9BE8, 0x9BE9, 0x9BEA, 0x9BEB, /* 0x40 */
+ 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF0, 0x9BF1, 0x9BF2, 0x9BF3, /* 0x50 */
+ 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA, 0x9BFB, /* 0x50 */
+ 0x9BFC, 0x9BFD, 0x9BFE, 0x9BFF, 0x9C00, 0x9C01, 0x9C02, 0x9C03, /* 0x60 */
+ 0x9C04, 0x9C05, 0x9C06, 0x9C07, 0x9C08, 0x9C09, 0x9C0A, 0x9C0B, /* 0x60 */
+ 0x9C0C, 0x9C0D, 0x9C0E, 0x9C0F, 0x9C10, 0x9C11, 0x9C12, 0x9C13, /* 0x70 */
+ 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A, 0, /* 0x70 */
+ 0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C20, 0x9C21, 0x9C22, /* 0x80 */
+ 0x9C23, 0x9C24, 0x9C25, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, /* 0x80 */
+ 0x9C2B, 0x9C2C, 0x9C2D, 0x9C2E, 0x9C2F, 0x9C30, 0x9C31, 0x9C32, /* 0x90 */
+ 0x9C33, 0x9C34, 0x9C35, 0x9C36, 0x9C37, 0x9C38, 0x9C39, 0x9C3A, /* 0x90 */
+ 0x9C3B, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9, /* 0xA0 */
+ 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A, /* 0xA0 */
+ 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87, /* 0xB0 */
+ 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9, /* 0xB0 */
+ 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE, /* 0xC0 */
+ 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F, /* 0xC0 */
+ 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E, /* 0xD0 */
+ 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E, /* 0xD0 */
+ 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7, /* 0xE0 */
+ 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2, /* 0xE0 */
+ 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC, /* 0xF0 */
+ 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9C3C, 0x9C3D, 0x9C3E, 0x9C3F, 0x9C40, 0x9C41, 0x9C42, 0x9C43, /* 0x40 */
+ 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0x9C48, 0x9C49, 0x9C4A, 0x9C4B, /* 0x40 */
+ 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C52, 0x9C53, /* 0x50 */
+ 0x9C54, 0x9C55, 0x9C56, 0x9C57, 0x9C58, 0x9C59, 0x9C5A, 0x9C5B, /* 0x50 */
+ 0x9C5C, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C60, 0x9C61, 0x9C62, 0x9C63, /* 0x60 */
+ 0x9C64, 0x9C65, 0x9C66, 0x9C67, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B, /* 0x60 */
+ 0x9C6C, 0x9C6D, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, /* 0x70 */
+ 0x9C74, 0x9C75, 0x9C76, 0x9C77, 0x9C78, 0x9C79, 0x9C7A, 0, /* 0x70 */
+ 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80, 0x9C83, 0x9C84, 0x9C89, 0x9C8A, /* 0x80 */
+ 0x9C8C, 0x9C8F, 0x9C93, 0x9C96, 0x9C97, 0x9C98, 0x9C99, 0x9C9D, /* 0x80 */
+ 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9, 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, /* 0x90 */
+ 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1, 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, /* 0x90 */
+ 0x9CE1, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4, /* 0xA0 */
+ 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2, /* 0xA0 */
+ 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3, /* 0xB0 */
+ 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA, /* 0xB0 */
+ 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1, /* 0xC0 */
+ 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8, /* 0xC0 */
+ 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, /* 0xD0 */
+ 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F, /* 0xD0 */
+ 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, /* 0xE0 */
+ 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, /* 0xE0 */
+ 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22, /* 0xF0 */
+ 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9CE3, 0x9CE4, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0x9CE9, 0x9CEA, /* 0x40 */
+ 0x9CEB, 0x9CEC, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0, 0x9CF1, 0x9CF2, /* 0x40 */
+ 0x9CF3, 0x9CF4, 0x9CF5, 0x9CF6, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, /* 0x50 */
+ 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, /* 0x50 */
+ 0x9D03, 0x9D04, 0x9D05, 0x9D06, 0x9D07, 0x9D08, 0x9D09, 0x9D0A, /* 0x60 */
+ 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E, 0x9D0F, 0x9D10, 0x9D11, 0x9D12, /* 0x60 */
+ 0x9D13, 0x9D14, 0x9D15, 0x9D16, 0x9D17, 0x9D18, 0x9D19, 0x9D1A, /* 0x70 */
+ 0x9D1B, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D1F, 0x9D20, 0x9D21, 0, /* 0x70 */
+ 0x9D22, 0x9D23, 0x9D24, 0x9D25, 0x9D26, 0x9D27, 0x9D28, 0x9D29, /* 0x80 */
+ 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D, 0x9D2E, 0x9D2F, 0x9D30, 0x9D31, /* 0x80 */
+ 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37, 0x9D38, 0x9D39, /* 0x90 */
+ 0x9D3A, 0x9D3B, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D3F, 0x9D40, 0x9D41, /* 0x90 */
+ 0x9D42 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A, /* 0x40 */
+ 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D51, 0x9D52, /* 0x40 */
+ 0x9D53, 0x9D54, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, /* 0x50 */
+ 0x9D5B, 0x9D5C, 0x9D5D, 0x9D5E, 0x9D5F, 0x9D60, 0x9D61, 0x9D62, /* 0x50 */
+ 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69, 0x9D6A, /* 0x60 */
+ 0x9D6B, 0x9D6C, 0x9D6D, 0x9D6E, 0x9D6F, 0x9D70, 0x9D71, 0x9D72, /* 0x60 */
+ 0x9D73, 0x9D74, 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, /* 0x70 */
+ 0x9D7B, 0x9D7C, 0x9D7D, 0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0, /* 0x70 */
+ 0x9D82, 0x9D83, 0x9D84, 0x9D85, 0x9D86, 0x9D87, 0x9D88, 0x9D89, /* 0x80 */
+ 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, 0x9D91, /* 0x80 */
+ 0x9D92, 0x9D93, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9D99, /* 0x90 */
+ 0x9D9A, 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, /* 0x90 */
+ 0x9DA2 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_FA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9DA3, 0x9DA4, 0x9DA5, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DA9, 0x9DAA, /* 0x40 */
+ 0x9DAB, 0x9DAC, 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0x9DB1, 0x9DB2, /* 0x40 */
+ 0x9DB3, 0x9DB4, 0x9DB5, 0x9DB6, 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, /* 0x50 */
+ 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, /* 0x50 */
+ 0x9DC3, 0x9DC4, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, /* 0x60 */
+ 0x9DCB, 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, /* 0x60 */
+ 0x9DD3, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7, 0x9DD8, 0x9DD9, 0x9DDA, /* 0x70 */
+ 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE1, 0, /* 0x70 */
+ 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, 0x9DE7, 0x9DE8, 0x9DE9, /* 0x80 */
+ 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DEF, 0x9DF0, 0x9DF1, /* 0x80 */
+ 0x9DF2, 0x9DF3, 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, /* 0x90 */
+ 0x9DFA, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF, 0x9E00, 0x9E01, /* 0x90 */
+ 0x9E02 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_FB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07, 0x9E08, 0x9E09, 0x9E0A, /* 0x40 */
+ 0x9E0B, 0x9E0C, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10, 0x9E11, 0x9E12, /* 0x40 */
+ 0x9E13, 0x9E14, 0x9E15, 0x9E16, 0x9E17, 0x9E18, 0x9E19, 0x9E1A, /* 0x50 */
+ 0x9E1B, 0x9E1C, 0x9E1D, 0x9E1E, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, /* 0x50 */
+ 0x9E34, 0x9E3B, 0x9E3C, 0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, /* 0x60 */
+ 0x9E54, 0x9E56, 0x9E59, 0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, /* 0x60 */
+ 0x9E65, 0x9E6E, 0x9E6F, 0x9E72, 0x9E74, 0x9E75, 0x9E76, 0x9E77, /* 0x70 */
+ 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E7D, 0x9E80, 0, /* 0x70 */
+ 0x9E81, 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, /* 0x80 */
+ 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96, /* 0x80 */
+ 0x9E97, 0x9E98, 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, /* 0x90 */
+ 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA7, 0x9EA8, 0x9EA9, /* 0x90 */
+ 0x9EAA /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_FC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB1, 0x9EB2, /* 0x40 */
+ 0x9EB3, 0x9EB5, 0x9EB6, 0x9EB7, 0x9EB9, 0x9EBA, 0x9EBC, 0x9EBF, /* 0x40 */
+ 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, /* 0x50 */
+ 0x9ECA, 0x9ECB, 0x9ECC, 0x9ED0, 0x9ED2, 0x9ED3, 0x9ED5, 0x9ED6, /* 0x50 */
+ 0x9ED7, 0x9ED9, 0x9EDA, 0x9EDE, 0x9EE1, 0x9EE3, 0x9EE4, 0x9EE6, /* 0x60 */
+ 0x9EE8, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, /* 0x60 */
+ 0x9EF3, 0x9EF4, 0x9EF5, 0x9EF6, 0x9EF7, 0x9EF8, 0x9EFA, 0x9EFD, /* 0x70 */
+ 0x9EFF, 0x9F00, 0x9F01, 0x9F02, 0x9F03, 0x9F04, 0x9F05, 0, /* 0x70 */
+ 0x9F06, 0x9F07, 0x9F08, 0x9F09, 0x9F0A, 0x9F0C, 0x9F0F, 0x9F11, /* 0x80 */
+ 0x9F12, 0x9F14, 0x9F15, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C, /* 0x80 */
+ 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26, /* 0x90 */
+ 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30, /* 0x90 */
+ 0x9F31 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_FD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A, 0x9F3C, /* 0x40 */
+ 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46, 0x9F47, /* 0x40 */
+ 0x9F48, 0x9F49, 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, /* 0x50 */
+ 0x9F52, 0x9F53, 0x9F54, 0x9F55, 0x9F56, 0x9F57, 0x9F58, 0x9F59, /* 0x50 */
+ 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, 0x9F5F, 0x9F60, 0x9F61, /* 0x60 */
+ 0x9F62, 0x9F63, 0x9F64, 0x9F65, 0x9F66, 0x9F67, 0x9F68, 0x9F69, /* 0x60 */
+ 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, /* 0x70 */
+ 0x9F72, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0, /* 0x70 */
+ 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82, /* 0x80 */
+ 0x9F8D, 0x9F8E, 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F93, 0x9F94, /* 0x80 */
+ 0x9F95, 0x9F96, 0x9F97, 0x9F98, 0x9F9C, 0x9F9D, 0x9F9E, 0x9FA1, /* 0x90 */
+ 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C, 0xF979, 0xF995, 0xF9E7, /* 0x90 */
+ 0xF9F1 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBK_FE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFA0C, 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, /* 0x40 */
+ 0xFA1F, 0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, /* 0x40 */
+ 0x2E81, 0, 0, 0, 0x2E84, 0x3473, 0x3447, 0x2E88, /* 0x50 */
+ 0x2E8B, 0, 0x359E, 0x361A, 0x360E, 0x2E8C, 0x2E97, 0x396E, /* 0x50 */
+ 0x3918, 0, 0x39CF, 0x39DF, 0x3A73, 0x39D0, 0, 0, /* 0x60 */
+ 0x3B4E, 0x3C6E, 0x3CE0, 0x2EA7, 0, 0, 0x2EAA, 0x4056, /* 0x60 */
+ 0x415F, 0x2EAE, 0x4337, 0x2EB3, 0x2EB6, 0x2EB7, 0, 0x43B1, /* 0x70 */
+ 0x43AC, 0x2EBB, 0x43DD, 0x44D6, 0x4661, 0x464C, 0, 0, /* 0x70 */
+ 0x4723, 0x4729, 0x477C, 0x478D, 0x2ECA, 0x4947, 0x497A, 0x497D, /* 0x80 */
+ 0x4982, 0x4983, 0x4985, 0x4986, 0x499F, 0x499B, 0x49B7, 0x49B6, /* 0x80 */
+ 0, 0, 0x4CA3, 0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, 0x4CA2, /* 0x90 */
+ 0x4D13, 0x4D14, 0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19, 0x4DAE /* 0x90 */
+};
diff --git a/sal/textenc/tcvtscn2.tab b/sal/textenc/tcvtscn2.tab
new file mode 100644
index 000000000000..1a967267f889
--- /dev/null
+++ b/sal/textenc/tcvtscn2.tab
@@ -0,0 +1,4463 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the UniCode to DBCS tables for the following */
+/* chinese simplified (China) charsets: */
+/* GB (GB2312), GBK, MS936, APPLE_CHINSIMP */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x00 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 0x00 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 0x10 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 0x10 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 0x20 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 0x20 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0x30 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 0x30 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0x40 */
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, /* 0x40 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* 0x50 */
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 0x50 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x60 */
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0x60 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, /* 0x70 */
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xA1E8, 0, 0, 0xA1EC, /* 0xA0 */
+ 0xA1A7, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xA1E3, 0xA1C0, 0, 0, 0, 0, 0, 0xA1A4, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1C1, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xA8A4, 0xA8A2, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xA8A8, 0xA8A6, 0xA8BA, 0, 0xA8AC, 0xA8AA, 0, 0, /* 0xE0 */
+ 0, 0, 0xA8B0, 0xA8AE, 0, 0, 0, 0xA1C2, /* 0xF0 */
+ 0, 0xA8B4, 0xA8B2, 0, 0xA8B9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLECHINSIMP_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x00 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 0x00 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 0x10 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 0x10 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 0x20 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 0x20 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0x30 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 0x30 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0x40 */
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, /* 0x40 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* 0x50 */
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 0x50 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x60 */
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0x60 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, /* 0x70 */
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x00A0, 0, 0xA1E9, 0xA1EA, 0xA1E8, 0xA3A4, 0, 0xA1EC, /* 0xA0 */
+ 0xA1A7, 0x00FD, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xA1E3, 0xA1C0, 0, 0, 0, 0, 0, 0xA1A4, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1C1, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xA8A4, 0xA8A2, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xA8A8, 0xA8A6, 0xA8BA, 0, 0xA8AC, 0xA8AA, 0, 0, /* 0xE0 */
+ 0, 0, 0xA8B0, 0xA8AE, 0, 0, 0, 0xA1C2, /* 0xF0 */
+ 0, 0xA8B4, 0xA8B2, 0, 0xA8B9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_01[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA8A1, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xA8A5, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xA8A7, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xA8A9, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xA8BD, 0, 0, 0, /* 0x40 */
+ 0xA8BE, 0, 0, 0, 0, 0xA8AD, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xA8B1, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xA8A3, 0, /* 0xC0 */
+ 0xA8AB, 0, 0xA8AF, 0, 0xA8B3, 0, 0xA8B5, 0, /* 0xD0 */
+ 0xA8B6, 0, 0xA8B7, 0, 0xA8B8 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_02[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA8BB, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xA8C0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1A6, /* 0xC0 */
+ 0, 0xA1A5, 0xA840, 0xA841, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xA842 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_02[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA8BB, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xA8C0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1A6, /* 0xC0 */
+ 0, 0xA1A5 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_03[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA6A1, 0xA6A2, 0xA6A3, 0xA6A4, 0xA6A5, 0xA6A6, 0xA6A7, /* 0x90 */
+ 0xA6A8, 0xA6A9, 0xA6AA, 0xA6AB, 0xA6AC, 0xA6AD, 0xA6AE, 0xA6AF, /* 0x90 */
+ 0xA6B0, 0xA6B1, 0, 0xA6B2, 0xA6B3, 0xA6B4, 0xA6B5, 0xA6B6, /* 0xA0 */
+ 0xA6B7, 0xA6B8, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xA6C1, 0xA6C2, 0xA6C3, 0xA6C4, 0xA6C5, 0xA6C6, 0xA6C7, /* 0xB0 */
+ 0xA6C8, 0xA6C9, 0xA6CA, 0xA6CB, 0xA6CC, 0xA6CD, 0xA6CE, 0xA6CF, /* 0xB0 */
+ 0xA6D0, 0xA6D1, 0, 0xA6D2, 0xA6D3, 0xA6D4, 0xA6D5, 0xA6D6, /* 0xC0 */
+ 0xA6D7, 0xA6D8 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_04[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA7A7, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xA7A1, 0xA7A2, 0xA7A3, 0xA7A4, 0xA7A5, 0xA7A6, 0xA7A8, 0xA7A9, /* 0x10 */
+ 0xA7AA, 0xA7AB, 0xA7AC, 0xA7AD, 0xA7AE, 0xA7AF, 0xA7B0, 0xA7B1, /* 0x10 */
+ 0xA7B2, 0xA7B3, 0xA7B4, 0xA7B5, 0xA7B6, 0xA7B7, 0xA7B8, 0xA7B9, /* 0x20 */
+ 0xA7BA, 0xA7BB, 0xA7BC, 0xA7BD, 0xA7BE, 0xA7BF, 0xA7C0, 0xA7C1, /* 0x20 */
+ 0xA7D1, 0xA7D2, 0xA7D3, 0xA7D4, 0xA7D5, 0xA7D6, 0xA7D8, 0xA7D9, /* 0x30 */
+ 0xA7DA, 0xA7DB, 0xA7DC, 0xA7DD, 0xA7DE, 0xA7DF, 0xA7E0, 0xA7E1, /* 0x30 */
+ 0xA7E2, 0xA7E3, 0xA7E4, 0xA7E5, 0xA7E6, 0xA7E7, 0xA7E8, 0xA7E9, /* 0x40 */
+ 0xA7EA, 0xA7EB, 0xA7EC, 0xA7ED, 0xA7EE, 0xA7EF, 0xA7F0, 0xA7F1, /* 0x40 */
+ 0, 0xA7D7 /* 0x50 */
+ /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLECHINSIMP_1E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x30 */
+ 0xA8BC, /* 0x30 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_20[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA95C, 0, 0, 0xA843, 0xA1AA, 0xA844, 0xA1AC, 0, /* 0x10 */
+ 0xA1AE, 0xA1AF, 0, 0, 0xA1B0, 0xA1B1, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xA845, 0xA1AD, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xA1EB, 0, 0xA1E4, 0xA1E5, 0, 0xA846, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xA1F9, 0, 0, 0xA3FE, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x0080 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_20[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1AA, 0xA1AA, 0xA1AC, 0, /* 0x10 */
+ 0xA1AE, 0xA1AF, 0, 0, 0xA1B0, 0xA1B1, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xA1AD, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xA1EB, 0, 0xA1E4, 0xA1E5, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xA1F9, 0, 0, 0xA3FE, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0x0080 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1E6, 0, 0xA847, 0, 0, /* 0x00 */
+ 0, 0xA848, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xA1ED, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xA959, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7, 0xA2F8, /* 0x60 */
+ 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0, 0, 0, 0, /* 0x60 */
+ 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7, 0xA2A8, /* 0x70 */
+ 0xA2A9, 0xA2AA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xA1FB, 0xA1FC, 0xA1FA, 0xA1FD, 0, 0, 0xA849, 0xA84A, /* 0x90 */
+ 0xA84B, 0xA84C /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1E6, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xA1ED, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7, 0xA2F8, /* 0x60 */
+ 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0, 0, 0, 0, /* 0x60 */
+ 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7, 0xA2A8, /* 0x70 */
+ 0xA2A9, 0xA2AA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xA1FB, 0xA1FC, 0xA1FA, 0xA1FD /* 0x90 */
+ /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLECHINSIMP_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1E6, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xA1ED, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x00FE, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7, 0xA2F8, /* 0x60 */
+ 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0, 0, 0, 0, /* 0x60 */
+ 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7, 0xA2A8, /* 0x70 */
+ 0xA2A9, 0xA2AA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xA1FB, 0xA1FC, 0xA1FA, 0xA1FD /* 0x90 */
+ /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xA1CA, 0, 0, 0, 0, 0, 0, 0xA1C7, /* 0x00 */
+ 0, 0xA1C6, 0, 0, 0, 0xA84D, 0, 0, /* 0x10 */
+ 0, 0, 0xA1CC, 0, 0, 0xA1D8, 0xA1DE, 0xA84E, /* 0x10 */
+ 0xA1CF, 0, 0, 0xA84F, 0, 0xA1CE, 0, 0xA1C4, /* 0x20 */
+ 0xA1C5, 0xA1C9, 0xA1C8, 0xA1D2, 0, 0, 0xA1D3, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xA1E0, 0xA1DF, 0xA1C3, 0xA1CB, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xA1D7, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xA1D6, 0, 0, 0, 0xA1D5, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xA850, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA1D9, 0xA1D4, 0, 0, 0xA1DC, 0xA1DD, 0xA851, 0xA852, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xA1DA, 0xA1DB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xA892, 0, 0, /* 0x90 */
+ 0, 0xA1D1, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xA1CD, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA853, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1AD /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xA1CA, 0, 0, 0, 0, 0, 0, 0xA1C7, /* 0x00 */
+ 0, 0xA1C6, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xA1CC, 0, 0, 0xA1D8, 0xA1DE, 0, /* 0x10 */
+ 0xA1CF, 0, 0, 0, 0, 0xA1CE, 0, 0xA1C4, /* 0x20 */
+ 0xA1C5, 0xA1C9, 0xA1C8, 0xA1D2, 0, 0, 0xA1D3, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xA1E0, 0xA1DF, 0xA1C3, 0xA1CB, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xA1D7, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xA1D6, 0, 0, 0, 0xA1D5, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA1D9, 0xA1D4, 0, 0, 0xA1DC, 0xA1DD, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xA1DA, 0xA1DB, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xA1D1, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xA1CD, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1AD /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_23[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1D0 /* 0x10 */
+ /* 0x10 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_24[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, 0xA2DE, 0xA2DF, 0xA2E0, /* 0x60 */
+ 0xA2E1, 0xA2E2, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xA2C5, 0xA2C6, 0xA2C7, 0xA2C8, /* 0x70 */
+ 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, 0xA2CD, 0xA2CE, 0xA2CF, 0xA2D0, /* 0x70 */
+ 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4, 0xA2D5, 0xA2D6, 0xA2D7, 0xA2D8, /* 0x80 */
+ 0xA2B1, 0xA2B2, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7, 0xA2B8, /* 0x80 */
+ 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF, 0xA2C0, /* 0x90 */
+ 0xA2C1, 0xA2C2, 0xA2C3, 0xA2C4 /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_25[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA9A4, 0xA9A5, 0xA9A6, 0xA9A7, 0xA9A8, 0xA9A9, 0xA9AA, 0xA9AB, /* 0x00 */
+ 0xA9AC, 0xA9AD, 0xA9AE, 0xA9AF, 0xA9B0, 0xA9B1, 0xA9B2, 0xA9B3, /* 0x00 */
+ 0xA9B4, 0xA9B5, 0xA9B6, 0xA9B7, 0xA9B8, 0xA9B9, 0xA9BA, 0xA9BB, /* 0x10 */
+ 0xA9BC, 0xA9BD, 0xA9BE, 0xA9BF, 0xA9C0, 0xA9C1, 0xA9C2, 0xA9C3, /* 0x10 */
+ 0xA9C4, 0xA9C5, 0xA9C6, 0xA9C7, 0xA9C8, 0xA9C9, 0xA9CA, 0xA9CB, /* 0x20 */
+ 0xA9CC, 0xA9CD, 0xA9CE, 0xA9CF, 0xA9D0, 0xA9D1, 0xA9D2, 0xA9D3, /* 0x20 */
+ 0xA9D4, 0xA9D5, 0xA9D6, 0xA9D7, 0xA9D8, 0xA9D9, 0xA9DA, 0xA9DB, /* 0x30 */
+ 0xA9DC, 0xA9DD, 0xA9DE, 0xA9DF, 0xA9E0, 0xA9E1, 0xA9E2, 0xA9E3, /* 0x30 */
+ 0xA9E4, 0xA9E5, 0xA9E6, 0xA9E7, 0xA9E8, 0xA9E9, 0xA9EA, 0xA9EB, /* 0x40 */
+ 0xA9EC, 0xA9ED, 0xA9EE, 0xA9EF, 0, 0, 0, 0, /* 0x40 */
+ 0xA854, 0xA855, 0xA856, 0xA857, 0xA858, 0xA859, 0xA85A, 0xA85B, /* 0x50 */
+ 0xA85C, 0xA85D, 0xA85E, 0xA85F, 0xA860, 0xA861, 0xA862, 0xA863, /* 0x50 */
+ 0xA864, 0xA865, 0xA866, 0xA867, 0xA868, 0xA869, 0xA86A, 0xA86B, /* 0x60 */
+ 0xA86C, 0xA86D, 0xA86E, 0xA86F, 0xA870, 0xA871, 0xA872, 0xA873, /* 0x60 */
+ 0xA874, 0xA875, 0xA876, 0xA877, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xA878, 0xA879, 0xA87A, 0xA87B, 0xA87C, 0xA87D, 0xA87E, /* 0x80 */
+ 0xA880, 0xA881, 0xA882, 0xA883, 0xA884, 0xA885, 0xA886, 0xA887, /* 0x80 */
+ 0, 0, 0, 0xA888, 0xA889, 0xA88A, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xA1F6, 0xA1F5, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xA1F8, 0xA1F7, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xA88B, 0xA88C, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xA1F4, 0xA1F3, /* 0xC0 */
+ 0, 0, 0, 0xA1F0, 0, 0, 0xA1F2, 0xA1F1, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xA88D, 0xA88E, 0xA88F, 0xA890 /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_25[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA9A4, 0xA9A5, 0xA9A6, 0xA9A7, 0xA9A8, 0xA9A9, 0xA9AA, 0xA9AB, /* 0x00 */
+ 0xA9AC, 0xA9AD, 0xA9AE, 0xA9AF, 0xA9B0, 0xA9B1, 0xA9B2, 0xA9B3, /* 0x00 */
+ 0xA9B4, 0xA9B5, 0xA9B6, 0xA9B7, 0xA9B8, 0xA9B9, 0xA9BA, 0xA9BB, /* 0x10 */
+ 0xA9BC, 0xA9BD, 0xA9BE, 0xA9BF, 0xA9C0, 0xA9C1, 0xA9C2, 0xA9C3, /* 0x10 */
+ 0xA9C4, 0xA9C5, 0xA9C6, 0xA9C7, 0xA9C8, 0xA9C9, 0xA9CA, 0xA9CB, /* 0x20 */
+ 0xA9CC, 0xA9CD, 0xA9CE, 0xA9CF, 0xA9D0, 0xA9D1, 0xA9D2, 0xA9D3, /* 0x20 */
+ 0xA9D4, 0xA9D5, 0xA9D6, 0xA9D7, 0xA9D8, 0xA9D9, 0xA9DA, 0xA9DB, /* 0x30 */
+ 0xA9DC, 0xA9DD, 0xA9DE, 0xA9DF, 0xA9E0, 0xA9E1, 0xA9E2, 0xA9E3, /* 0x30 */
+ 0xA9E4, 0xA9E5, 0xA9E6, 0xA9E7, 0xA9E8, 0xA9E9, 0xA9EA, 0xA9EB, /* 0x40 */
+ 0xA9EC, 0xA9ED, 0xA9EE, 0xA9EF, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xA1F6, 0xA1F5, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xA1F8, 0xA1F7, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xA1F4, 0xA1F3, /* 0xC0 */
+ 0, 0, 0, 0xA1F0, 0, 0, 0xA1F2, 0xA1F1 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1EF, 0xA1EE, 0, /* 0x00 */
+ 0, 0xA891, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xA1E2, 0, 0xA1E1 /* 0x40 */
+ /* 0x40 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1EF, 0xA1EE, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xA1E2, 0, 0xA1E1 /* 0x40 */
+ /* 0x40 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_2E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE50, 0, 0, 0xFE54, 0, 0, 0, /* 0x80 */
+ 0xFE57, 0, 0, 0xFE58, 0xFE5D, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFE5E, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFE6B, /* 0xA0 */
+ 0, 0, 0xFE6E, 0, 0, 0, 0xFE71, 0, /* 0xA0 */
+ 0, 0, 0, 0xFE73, 0, 0, 0xFE74, 0xFE75, /* 0xB0 */
+ 0, 0, 0, 0xFE79, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xFE84 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A8, 0, 0xA1A9, 0xA965, 0xA996, /* 0x00 */
+ 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7, 0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB, /* 0x00 */
+ 0xA1BE, 0xA1BF, 0xA893, 0xA1FE, 0xA1B2, 0xA1B3, 0xA1BC, 0xA1BD, /* 0x10 */
+ 0, 0, 0, 0, 0xA1AB, 0xA894, 0xA895, 0, /* 0x10 */
+ 0, 0xA940, 0xA941, 0xA942, 0xA943, 0xA944, 0xA945, 0xA946, /* 0x20 */
+ 0xA947, 0xA948, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xA4A1, 0xA4A2, 0xA4A3, 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7, /* 0x40 */
+ 0xA4A8, 0xA4A9, 0xA4AA, 0xA4AB, 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF, /* 0x40 */
+ 0xA4B0, 0xA4B1, 0xA4B2, 0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7, /* 0x50 */
+ 0xA4B8, 0xA4B9, 0xA4BA, 0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, 0xA4BF, /* 0x50 */
+ 0xA4C0, 0xA4C1, 0xA4C2, 0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6, 0xA4C7, /* 0x60 */
+ 0xA4C8, 0xA4C9, 0xA4CA, 0xA4CB, 0xA4CC, 0xA4CD, 0xA4CE, 0xA4CF, /* 0x60 */
+ 0xA4D0, 0xA4D1, 0xA4D2, 0xA4D3, 0xA4D4, 0xA4D5, 0xA4D6, 0xA4D7, /* 0x70 */
+ 0xA4D8, 0xA4D9, 0xA4DA, 0xA4DB, 0xA4DC, 0xA4DD, 0xA4DE, 0xA4DF, /* 0x70 */
+ 0xA4E0, 0xA4E1, 0xA4E2, 0xA4E3, 0xA4E4, 0xA4E5, 0xA4E6, 0xA4E7, /* 0x80 */
+ 0xA4E8, 0xA4E9, 0xA4EA, 0xA4EB, 0xA4EC, 0xA4ED, 0xA4EE, 0xA4EF, /* 0x80 */
+ 0xA4F0, 0xA4F1, 0xA4F2, 0xA4F3, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xA961, 0xA962, 0xA966, 0xA967, 0, /* 0x90 */
+ 0, 0xA5A1, 0xA5A2, 0xA5A3, 0xA5A4, 0xA5A5, 0xA5A6, 0xA5A7, /* 0xA0 */
+ 0xA5A8, 0xA5A9, 0xA5AA, 0xA5AB, 0xA5AC, 0xA5AD, 0xA5AE, 0xA5AF, /* 0xA0 */
+ 0xA5B0, 0xA5B1, 0xA5B2, 0xA5B3, 0xA5B4, 0xA5B5, 0xA5B6, 0xA5B7, /* 0xB0 */
+ 0xA5B8, 0xA5B9, 0xA5BA, 0xA5BB, 0xA5BC, 0xA5BD, 0xA5BE, 0xA5BF, /* 0xB0 */
+ 0xA5C0, 0xA5C1, 0xA5C2, 0xA5C3, 0xA5C4, 0xA5C5, 0xA5C6, 0xA5C7, /* 0xC0 */
+ 0xA5C8, 0xA5C9, 0xA5CA, 0xA5CB, 0xA5CC, 0xA5CD, 0xA5CE, 0xA5CF, /* 0xC0 */
+ 0xA5D0, 0xA5D1, 0xA5D2, 0xA5D3, 0xA5D4, 0xA5D5, 0xA5D6, 0xA5D7, /* 0xD0 */
+ 0xA5D8, 0xA5D9, 0xA5DA, 0xA5DB, 0xA5DC, 0xA5DD, 0xA5DE, 0xA5DF, /* 0xD0 */
+ 0xA5E0, 0xA5E1, 0xA5E2, 0xA5E3, 0xA5E4, 0xA5E5, 0xA5E6, 0xA5E7, /* 0xE0 */
+ 0xA5E8, 0xA5E9, 0xA5EA, 0xA5EB, 0xA5EC, 0xA5ED, 0xA5EE, 0xA5EF, /* 0xE0 */
+ 0xA5F0, 0xA5F1, 0xA5F2, 0xA5F3, 0xA5F4, 0xA5F5, 0xA5F6, 0, /* 0xF0 */
+ 0, 0, 0, 0xA1A4, 0xA960, 0xA963, 0xA964 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A8, 0, 0xA1A9, 0, 0, /* 0x00 */
+ 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7, 0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB, /* 0x00 */
+ 0xA1BE, 0xA1BF, 0, 0xA1FE, 0xA1B2, 0xA1B3, 0xA1BC, 0xA1BD, /* 0x10 */
+ 0, 0, 0, 0, 0xA1AB, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xA4A1, 0xA4A2, 0xA4A3, 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7, /* 0x40 */
+ 0xA4A8, 0xA4A9, 0xA4AA, 0xA4AB, 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF, /* 0x40 */
+ 0xA4B0, 0xA4B1, 0xA4B2, 0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7, /* 0x50 */
+ 0xA4B8, 0xA4B9, 0xA4BA, 0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, 0xA4BF, /* 0x50 */
+ 0xA4C0, 0xA4C1, 0xA4C2, 0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6, 0xA4C7, /* 0x60 */
+ 0xA4C8, 0xA4C9, 0xA4CA, 0xA4CB, 0xA4CC, 0xA4CD, 0xA4CE, 0xA4CF, /* 0x60 */
+ 0xA4D0, 0xA4D1, 0xA4D2, 0xA4D3, 0xA4D4, 0xA4D5, 0xA4D6, 0xA4D7, /* 0x70 */
+ 0xA4D8, 0xA4D9, 0xA4DA, 0xA4DB, 0xA4DC, 0xA4DD, 0xA4DE, 0xA4DF, /* 0x70 */
+ 0xA4E0, 0xA4E1, 0xA4E2, 0xA4E3, 0xA4E4, 0xA4E5, 0xA4E6, 0xA4E7, /* 0x80 */
+ 0xA4E8, 0xA4E9, 0xA4EA, 0xA4EB, 0xA4EC, 0xA4ED, 0xA4EE, 0xA4EF, /* 0x80 */
+ 0xA4F0, 0xA4F1, 0xA4F2, 0xA4F3, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xA5A1, 0xA5A2, 0xA5A3, 0xA5A4, 0xA5A5, 0xA5A6, 0xA5A7, /* 0xA0 */
+ 0xA5A8, 0xA5A9, 0xA5AA, 0xA5AB, 0xA5AC, 0xA5AD, 0xA5AE, 0xA5AF, /* 0xA0 */
+ 0xA5B0, 0xA5B1, 0xA5B2, 0xA5B3, 0xA5B4, 0xA5B5, 0xA5B6, 0xA5B7, /* 0xB0 */
+ 0xA5B8, 0xA5B9, 0xA5BA, 0xA5BB, 0xA5BC, 0xA5BD, 0xA5BE, 0xA5BF, /* 0xB0 */
+ 0xA5C0, 0xA5C1, 0xA5C2, 0xA5C3, 0xA5C4, 0xA5C5, 0xA5C6, 0xA5C7, /* 0xC0 */
+ 0xA5C8, 0xA5C9, 0xA5CA, 0xA5CB, 0xA5CC, 0xA5CD, 0xA5CE, 0xA5CF, /* 0xC0 */
+ 0xA5D0, 0xA5D1, 0xA5D2, 0xA5D3, 0xA5D4, 0xA5D5, 0xA5D6, 0xA5D7, /* 0xD0 */
+ 0xA5D8, 0xA5D9, 0xA5DA, 0xA5DB, 0xA5DC, 0xA5DD, 0xA5DE, 0xA5DF, /* 0xD0 */
+ 0xA5E0, 0xA5E1, 0xA5E2, 0xA5E3, 0xA5E4, 0xA5E5, 0xA5E6, 0xA5E7, /* 0xE0 */
+ 0xA5E8, 0xA5E9, 0xA5EA, 0xA5EB, 0xA5EC, 0xA5ED, 0xA5EE, 0xA5EF, /* 0xE0 */
+ 0xA5F0, 0xA5F1, 0xA5F2, 0xA5F3, 0xA5F4, 0xA5F5, 0xA5F6, 0, /* 0xF0 */
+ 0, 0, 0, 0xA1A4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_31[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA8C5, 0xA8C6, 0xA8C7, /* 0x00 */
+ 0xA8C8, 0xA8C9, 0xA8CA, 0xA8CB, 0xA8CC, 0xA8CD, 0xA8CE, 0xA8CF, /* 0x00 */
+ 0xA8D0, 0xA8D1, 0xA8D2, 0xA8D3, 0xA8D4, 0xA8D5, 0xA8D6, 0xA8D7, /* 0x10 */
+ 0xA8D8, 0xA8D9, 0xA8DA, 0xA8DB, 0xA8DC, 0xA8DD, 0xA8DE, 0xA8DF, /* 0x10 */
+ 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, 0xA8E6, 0xA8E7, /* 0x20 */
+ 0xA8E8, 0xA8E9 /* 0x20 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* GB only from 32_20 to 32_29 */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA2E5, 0xA2E6, 0xA2E7, 0xA2E8, 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC, /* 0x20 */
+ 0xA2ED, 0xA2EE, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xA95A, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xA949 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x80 */
+ 0xA94A, 0xA94B, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xA94C, 0xA94D, 0xA94E, 0, /* 0x90 */
+ 0, 0xA94F, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xA950, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xA951, 0, /* 0xC0 */
+ 0, 0xA952, 0xA953, 0, 0, 0xA954 /* 0xD0 */
+ /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_34[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE56, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xFE55 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_35[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x90 */
+ 0xFE5A /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_36[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xFE5C, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xFE5B /* 0x10 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_39[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0xFE60, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xFE5F, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFE62, /* 0xC0 */
+ 0xFE65, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFE63 /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_3A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE64 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_3B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x40 */
+ 0xFE68 /* 0x40 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_3C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x60 */
+ 0xFE69, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xFE6A /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_40[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE6F /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_41[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x50 */
+ 0xFE70 /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_43[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE72, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xFE78, 0, 0, 0, /* 0xA0 */
+ 0, 0xFE77, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xFE7A /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_44[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE7B /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_46[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x40 */
+ 0xFE7D, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xFE7C /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_47[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE80, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xFE81, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xFE82, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xFE83 /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_49[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE85, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xFE86, 0, 0, 0xFE87, 0, 0, /* 0x70 */
+ 0, 0, 0xFE88, 0xFE89, 0, 0xFE8A, 0xFE8B, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xFE8D, 0, 0, 0, 0xFE8C, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xFE8F, 0xFE8E /* 0xB0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_4C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE96, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFE93, /* 0x90 */
+ 0xFE94, 0xFE95, 0xFE97, 0xFE92 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_4D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, /* 0x10 */
+ 0xFE9D, 0xFE9E, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xFE9F /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2BB, 0xB6A1, 0x8140, 0xC6DF, 0x8141, 0x8142, 0x8143, 0xCDF2, /* 0x00 */
+ 0xD5C9, 0xC8FD, 0xC9CF, 0xCFC2, 0xD8A2, 0xB2BB, 0xD3EB, 0x8144, /* 0x00 */
+ 0xD8A4, 0xB3F3, 0x8145, 0xD7A8, 0xC7D2, 0xD8A7, 0xCAC0, 0x8146, /* 0x10 */
+ 0xC7F0, 0xB1FB, 0xD2B5, 0xB4D4, 0xB6AB, 0xCBBF, 0xD8A9, 0x8147, /* 0x10 */
+ 0x8148, 0x8149, 0xB6AA, 0x814A, 0xC1BD, 0xD1CF, 0x814B, 0xC9A5, /* 0x20 */
+ 0xD8AD, 0x814C, 0xB8F6, 0xD1BE, 0xE3DC, 0xD6D0, 0x814D, 0x814E, /* 0x20 */
+ 0xB7E1, 0x814F, 0xB4AE, 0x8150, 0xC1D9, 0x8151, 0xD8BC, 0x8152, /* 0x30 */
+ 0xCDE8, 0xB5A4, 0xCEAA, 0xD6F7, 0x8153, 0xC0F6, 0xBED9, 0xD8AF, /* 0x30 */
+ 0x8154, 0x8155, 0x8156, 0xC4CB, 0x8157, 0xBEC3, 0x8158, 0xD8B1, /* 0x40 */
+ 0xC3B4, 0xD2E5, 0x8159, 0xD6AE, 0xCEDA, 0xD5A7, 0xBAF5, 0xB7A6, /* 0x40 */
+ 0xC0D6, 0x815A, 0xC6B9, 0xC5D2, 0xC7C7, 0x815B, 0xB9D4, 0x815C, /* 0x50 */
+ 0xB3CB, 0xD2D2, 0x815D, 0x815E, 0xD8BF, 0xBEC5, 0xC6F2, 0xD2B2, /* 0x50 */
+ 0xCFB0, 0xCFE7, 0x815F, 0x8160, 0x8161, 0x8162, 0xCAE9, 0x8163, /* 0x60 */
+ 0x8164, 0xD8C0, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816A, /* 0x60 */
+ 0xC2F2, 0xC2D2, 0x816B, 0xC8E9, 0x816C, 0x816D, 0x816E, 0x816F, /* 0x70 */
+ 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0xC7AC, 0x8176, /* 0x70 */
+ 0x8177, 0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0xC1CB, 0x817D, /* 0x80 */
+ 0xD3E8, 0xD5F9, 0x817E, 0xCAC2, 0xB6FE, 0xD8A1, 0xD3DA, 0xBFF7, /* 0x80 */
+ 0x8180, 0xD4C6, 0xBBA5, 0xD8C1, 0xCEE5, 0xBEAE, 0x8181, 0x8182, /* 0x90 */
+ 0xD8A8, 0x8183, 0xD1C7, 0xD0A9, 0x8184, 0x8185, 0x8186, 0xD8BD, /* 0x90 */
+ 0xD9EF, 0xCDF6, 0xBFBA, 0x8187, 0xBDBB, 0xBAA5, 0xD2E0, 0xB2FA, /* 0xA0 */
+ 0xBAE0, 0xC4B6, 0x8188, 0xCFED, 0xBEA9, 0xCDA4, 0xC1C1, 0x8189, /* 0xA0 */
+ 0x818A, 0x818B, 0xC7D7, 0xD9F1, 0x818C, 0xD9F4, 0x818D, 0x818E, /* 0xB0 */
+ 0x818F, 0x8190, 0xC8CB, 0xD8E9, 0x8191, 0x8192, 0x8193, 0xD2DA, /* 0xB0 */
+ 0xCAB2, 0xC8CA, 0xD8EC, 0xD8EA, 0xD8C6, 0xBDF6, 0xC6CD, 0xB3F0, /* 0xC0 */
+ 0x8194, 0xD8EB, 0xBDF1, 0xBDE9, 0x8195, 0xC8D4, 0xB4D3, 0x8196, /* 0xC0 */
+ 0x8197, 0xC2D8, 0x8198, 0xB2D6, 0xD7D0, 0xCACB, 0xCBFB, 0xD5CC, /* 0xD0 */
+ 0xB8B6, 0xCFC9, 0x8199, 0x819A, 0x819B, 0xD9DA, 0xD8F0, 0xC7AA, /* 0xD0 */
+ 0x819C, 0xD8EE, 0x819D, 0xB4FA, 0xC1EE, 0xD2D4, 0x819E, 0x819F, /* 0xE0 */
+ 0xD8ED, 0x81A0, 0xD2C7, 0xD8EF, 0xC3C7, 0x81A1, 0x81A2, 0x81A3, /* 0xE0 */
+ 0xD1F6, 0x81A4, 0xD6D9, 0xD8F2, 0x81A5, 0xD8F5, 0xBCFE, 0xBCDB, /* 0xF0 */
+ 0x81A6, 0x81A7, 0x81A8, 0xC8CE, 0x81A9, 0xB7DD, 0x81AA, 0xB7C2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x81AB, 0xC6F3, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1, /* 0x00 */
+ 0x81B2, 0xD8F8, 0xD2C1, 0x81B3, 0x81B4, 0xCEE9, 0xBCBF, 0xB7FC, /* 0x00 */
+ 0xB7A5, 0xD0DD, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0xD6DA, /* 0x10 */
+ 0xD3C5, 0xBBEF, 0xBBE1, 0xD8F1, 0x81BA, 0x81BB, 0xC9A1, 0xCEB0, /* 0x10 */
+ 0xB4AB, 0x81BC, 0xD8F3, 0x81BD, 0xC9CB, 0xD8F6, 0xC2D7, 0xD8F7, /* 0x20 */
+ 0x81BE, 0x81BF, 0xCEB1, 0xD8F9, 0x81C0, 0x81C1, 0x81C2, 0xB2AE, /* 0x20 */
+ 0xB9C0, 0x81C3, 0xD9A3, 0x81C4, 0xB0E9, 0x81C5, 0xC1E6, 0x81C6, /* 0x30 */
+ 0xC9EC, 0x81C7, 0xCBC5, 0x81C8, 0xCBC6, 0xD9A4, 0x81C9, 0x81CA, /* 0x30 */
+ 0x81CB, 0x81CC, 0x81CD, 0xB5E8, 0x81CE, 0x81CF, 0xB5AB, 0x81D0, /* 0x40 */
+ 0x81D1, 0x81D2, 0x81D3, 0x81D4, 0x81D5, 0xCEBB, 0xB5CD, 0xD7A1, /* 0x40 */
+ 0xD7F4, 0xD3D3, 0x81D6, 0xCCE5, 0x81D7, 0xBACE, 0x81D8, 0xD9A2, /* 0x50 */
+ 0xD9DC, 0xD3E0, 0xD8FD, 0xB7F0, 0xD7F7, 0xD8FE, 0xD8FA, 0xD9A1, /* 0x50 */
+ 0xC4E3, 0x81D9, 0x81DA, 0xD3B6, 0xD8F4, 0xD9DD, 0x81DB, 0xD8FB, /* 0x60 */
+ 0x81DC, 0xC5E5, 0x81DD, 0x81DE, 0xC0D0, 0x81DF, 0x81E0, 0xD1F0, /* 0x60 */
+ 0xB0DB, 0x81E1, 0x81E2, 0xBCD1, 0xD9A6, 0x81E3, 0xD9A5, 0x81E4, /* 0x70 */
+ 0x81E5, 0x81E6, 0x81E7, 0xD9AC, 0xD9AE, 0x81E8, 0xD9AB, 0xCAB9, /* 0x70 */
+ 0x81E9, 0x81EA, 0x81EB, 0xD9A9, 0xD6B6, 0x81EC, 0x81ED, 0x81EE, /* 0x80 */
+ 0xB3DE, 0xD9A8, 0x81EF, 0xC0FD, 0x81F0, 0xCACC, 0x81F1, 0xD9AA, /* 0x80 */
+ 0x81F2, 0xD9A7, 0x81F3, 0x81F4, 0xD9B0, 0x81F5, 0x81F6, 0xB6B1, /* 0x90 */
+ 0x81F7, 0x81F8, 0x81F9, 0xB9A9, 0x81FA, 0xD2C0, 0x81FB, 0x81FC, /* 0x90 */
+ 0xCFC0, 0x81FD, 0x81FE, 0xC2C2, 0x8240, 0xBDC4, 0xD5EC, 0xB2E0, /* 0xA0 */
+ 0xC7C8, 0xBFEB, 0xD9AD, 0x8241, 0xD9AF, 0x8242, 0xCEEA, 0xBAEE, /* 0xA0 */
+ 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0xC7D6, 0x8248, 0x8249, /* 0xB0 */
+ 0x824A, 0x824B, 0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0xB1E3, /* 0xB0 */
+ 0x8251, 0x8252, 0x8253, 0xB4D9, 0xB6ED, 0xD9B4, 0x8254, 0x8255, /* 0xC0 */
+ 0x8256, 0x8257, 0xBFA1, 0x8258, 0x8259, 0x825A, 0xD9DE, 0xC7CE, /* 0xC0 */
+ 0xC0FE, 0xD9B8, 0x825B, 0x825C, 0x825D, 0x825E, 0x825F, 0xCBD7, /* 0xD0 */
+ 0xB7FD, 0x8260, 0xD9B5, 0x8261, 0xD9B7, 0xB1A3, 0xD3E1, 0xD9B9, /* 0xD0 */
+ 0x8262, 0xD0C5, 0x8263, 0xD9B6, 0x8264, 0x8265, 0xD9B1, 0x8266, /* 0xE0 */
+ 0xD9B2, 0xC1A9, 0xD9B3, 0x8267, 0x8268, 0xBCF3, 0xD0DE, 0xB8A9, /* 0xE0 */
+ 0x8269, 0xBEE3, 0x826A, 0xD9BD, 0x826B, 0x826C, 0x826D, 0x826E, /* 0xF0 */
+ 0xD9BA, 0x826F, 0xB0B3, 0x8270, 0x8271, 0x8272, 0xD9C2, 0x8273 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B, /* 0x00 */
+ 0x827C, 0x827D, 0x827E, 0x8280, 0xD9C4, 0xB1B6, 0x8281, 0xD9BF, /* 0x00 */
+ 0x8282, 0x8283, 0xB5B9, 0x8284, 0xBEF3, 0x8285, 0x8286, 0x8287, /* 0x10 */
+ 0xCCC8, 0xBAF2, 0xD2D0, 0x8288, 0xD9C3, 0x8289, 0x828A, 0xBDE8, /* 0x10 */
+ 0x828B, 0xB3AB, 0x828C, 0x828D, 0x828E, 0xD9C5, 0xBEEB, 0x828F, /* 0x20 */
+ 0xD9C6, 0xD9BB, 0xC4DF, 0x8290, 0xD9BE, 0xD9C1, 0xD9C0, 0x8291, /* 0x20 */
+ 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, /* 0x30 */
+ 0x829A, 0x829B, 0xD5AE, 0x829C, 0xD6B5, 0x829D, 0xC7E3, 0x829E, /* 0x30 */
+ 0x829F, 0x82A0, 0x82A1, 0xD9C8, 0x82A2, 0x82A3, 0x82A4, 0xBCD9, /* 0x40 */
+ 0xD9CA, 0x82A5, 0x82A6, 0x82A7, 0xD9BC, 0x82A8, 0xD9CB, 0xC6AB, /* 0x40 */
+ 0x82A9, 0x82AA, 0x82AB, 0x82AC, 0x82AD, 0xD9C9, 0x82AE, 0x82AF, /* 0x50 */
+ 0x82B0, 0x82B1, 0xD7F6, 0x82B2, 0xCDA3, 0x82B3, 0x82B4, 0x82B5, /* 0x50 */
+ 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0xBDA1, 0x82BB, 0x82BC, /* 0x60 */
+ 0x82BD, 0x82BE, 0x82BF, 0x82C0, 0xD9CC, 0x82C1, 0x82C2, 0x82C3, /* 0x60 */
+ 0x82C4, 0x82C5, 0x82C6, 0x82C7, 0x82C8, 0x82C9, 0xC5BC, 0xCDB5, /* 0x70 */
+ 0x82CA, 0x82CB, 0x82CC, 0xD9CD, 0x82CD, 0x82CE, 0xD9C7, 0xB3A5, /* 0x70 */
+ 0xBFFE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0xB8B5, 0x82D3, 0x82D4, /* 0x80 */
+ 0xC0FC, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0xB0F8, 0x82D9, 0x82DA, /* 0x80 */
+ 0x82DB, 0x82DC, 0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, /* 0x90 */
+ 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, /* 0x90 */
+ 0x82EB, 0x82EC, 0x82ED, 0xB4F6, 0x82EE, 0xD9CE, 0x82EF, 0xD9CF, /* 0xA0 */
+ 0xB4A2, 0xD9D0, 0x82F0, 0x82F1, 0xB4DF, 0x82F2, 0x82F3, 0x82F4, /* 0xA0 */
+ 0x82F5, 0x82F6, 0xB0C1, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, /* 0xB0 */
+ 0x82FC, 0x82FD, 0xD9D1, 0xC9B5, 0x82FE, 0x8340, 0x8341, 0x8342, /* 0xB0 */
+ 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, /* 0xC0 */
+ 0x834B, 0x834C, 0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0xCFF1, /* 0xC0 */
+ 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0xD9D2, 0x8358, /* 0xD0 */
+ 0x8359, 0x835A, 0xC1C5, 0x835B, 0x835C, 0x835D, 0x835E, 0x835F, /* 0xD0 */
+ 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0xD9D6, 0xC9AE, /* 0xE0 */
+ 0x8366, 0x8367, 0x8368, 0x8369, 0xD9D5, 0xD9D4, 0xD9D7, 0x836A, /* 0xE0 */
+ 0x836B, 0x836C, 0x836D, 0xCBDB, 0x836E, 0xBDA9, 0x836F, 0x8370, /* 0xF0 */
+ 0x8371, 0x8372, 0x8373, 0xC6A7, 0x8374, 0x8375, 0x8376, 0x8377 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8378, 0x8379, 0x837A, 0x837B, 0x837C, 0x837D, 0xD9D3, 0xD9D8, /* 0x00 */
+ 0x837E, 0x8380, 0x8381, 0xD9D9, 0x8382, 0x8383, 0x8384, 0x8385, /* 0x00 */
+ 0x8386, 0x8387, 0xC8E5, 0x8388, 0x8389, 0x838A, 0x838B, 0x838C, /* 0x10 */
+ 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, /* 0x10 */
+ 0x8395, 0xC0DC, 0x8396, 0x8397, 0x8398, 0x8399, 0x839A, 0x839B, /* 0x20 */
+ 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, /* 0x20 */
+ 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8, 0x83A9, 0x83AA, 0x83AB, /* 0x30 */
+ 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0xB6F9, /* 0x30 */
+ 0xD8A3, 0xD4CA, 0x83B3, 0xD4AA, 0xD0D6, 0xB3E4, 0xD5D7, 0x83B4, /* 0x40 */
+ 0xCFC8, 0xB9E2, 0x83B5, 0xBFCB, 0x83B6, 0xC3E2, 0x83B7, 0x83B8, /* 0x40 */
+ 0x83B9, 0xB6D2, 0x83BA, 0x83BB, 0xCDC3, 0xD9EE, 0xD9F0, 0x83BC, /* 0x50 */
+ 0x83BD, 0x83BE, 0xB5B3, 0x83BF, 0xB6B5, 0x83C0, 0x83C1, 0x83C2, /* 0x50 */
+ 0x83C3, 0x83C4, 0xBEA4, 0x83C5, 0x83C6, 0xC8EB, 0x83C7, 0x83C8, /* 0x60 */
+ 0xC8AB, 0x83C9, 0x83CA, 0xB0CB, 0xB9AB, 0xC1F9, 0xD9E2, 0x83CB, /* 0x60 */
+ 0xC0BC, 0xB9B2, 0x83CC, 0xB9D8, 0xD0CB, 0xB1F8, 0xC6E4, 0xBEDF, /* 0x70 */
+ 0xB5E4, 0xD7C8, 0x83CD, 0xD1F8, 0xBCE6, 0xCADE, 0x83CE, 0x83CF, /* 0x70 */
+ 0xBCBD, 0xD9E6, 0xD8E7, 0x83D0, 0x83D1, 0xC4DA, 0x83D2, 0x83D3, /* 0x80 */
+ 0xB8D4, 0xC8BD, 0x83D4, 0x83D5, 0xB2E1, 0xD4D9, 0x83D6, 0x83D7, /* 0x80 */
+ 0x83D8, 0x83D9, 0xC3B0, 0x83DA, 0x83DB, 0xC3E1, 0xDAA2, 0xC8DF, /* 0x90 */
+ 0x83DC, 0xD0B4, 0x83DD, 0xBEFC, 0xC5A9, 0x83DE, 0x83DF, 0x83E0, /* 0x90 */
+ 0xB9DA, 0x83E1, 0xDAA3, 0x83E2, 0xD4A9, 0xDAA4, 0x83E3, 0x83E4, /* 0xA0 */
+ 0x83E5, 0x83E6, 0x83E7, 0xD9FB, 0xB6AC, 0x83E8, 0x83E9, 0xB7EB, /* 0xA0 */
+ 0xB1F9, 0xD9FC, 0xB3E5, 0xBEF6, 0x83EA, 0xBFF6, 0xD2B1, 0xC0E4, /* 0xB0 */
+ 0x83EB, 0x83EC, 0x83ED, 0xB6B3, 0xD9FE, 0xD9FD, 0x83EE, 0x83EF, /* 0xB0 */
+ 0xBEBB, 0x83F0, 0x83F1, 0x83F2, 0xC6E0, 0x83F3, 0xD7BC, 0xDAA1, /* 0xC0 */
+ 0x83F4, 0xC1B9, 0x83F5, 0xB5F2, 0xC1E8, 0x83F6, 0x83F7, 0xBCF5, /* 0xC0 */
+ 0x83F8, 0xB4D5, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE, /* 0xD0 */
+ 0x8440, 0x8441, 0x8442, 0xC1DD, 0x8443, 0xC4FD, 0x8444, 0x8445, /* 0xD0 */
+ 0xBCB8, 0xB7B2, 0x8446, 0x8447, 0xB7EF, 0x8448, 0x8449, 0x844A, /* 0xE0 */
+ 0x844B, 0x844C, 0x844D, 0xD9EC, 0x844E, 0xC6BE, 0x844F, 0xBFAD, /* 0xE0 */
+ 0xBBCB, 0x8450, 0x8451, 0xB5CA, 0x8452, 0xDBC9, 0xD0D7, 0x8453, /* 0xF0 */
+ 0xCDB9, 0xB0BC, 0xB3F6, 0xBBF7, 0xDBCA, 0xBAAF, 0x8454, 0xD4E4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB5B6, 0xB5F3, 0xD8D6, 0xC8D0, 0x8455, 0x8456, 0xB7D6, 0xC7D0, /* 0x00 */
+ 0xD8D7, 0x8457, 0xBFAF, 0x8458, 0x8459, 0xDBBB, 0xD8D8, 0x845A, /* 0x00 */
+ 0x845B, 0xD0CC, 0xBBAE, 0x845C, 0x845D, 0x845E, 0xEBBE, 0xC1D0, /* 0x10 */
+ 0xC1F5, 0xD4F2, 0xB8D5, 0xB4B4, 0x845F, 0xB3F5, 0x8460, 0x8461, /* 0x10 */
+ 0xC9BE, 0x8462, 0x8463, 0x8464, 0xC5D0, 0x8465, 0x8466, 0x8467, /* 0x20 */
+ 0xC5D9, 0xC0FB, 0x8468, 0xB1F0, 0x8469, 0xD8D9, 0xB9CE, 0x846A, /* 0x20 */
+ 0xB5BD, 0x846B, 0x846C, 0xD8DA, 0x846D, 0x846E, 0xD6C6, 0xCBA2, /* 0x30 */
+ 0xC8AF, 0xC9B2, 0xB4CC, 0xBFCC, 0x846F, 0xB9F4, 0x8470, 0xD8DB, /* 0x30 */
+ 0xD8DC, 0xB6E7, 0xBCC1, 0xCCEA, 0x8471, 0x8472, 0x8473, 0x8474, /* 0x40 */
+ 0x8475, 0x8476, 0xCFF7, 0x8477, 0xD8DD, 0xC7B0, 0x8478, 0x8479, /* 0x40 */
+ 0xB9D0, 0xBDA3, 0x847A, 0x847B, 0xCCDE, 0x847C, 0xC6CA, 0x847D, /* 0x50 */
+ 0x847E, 0x8480, 0x8481, 0x8482, 0xD8E0, 0x8483, 0xD8DE, 0x8484, /* 0x50 */
+ 0x8485, 0xD8DF, 0x8486, 0x8487, 0x8488, 0xB0FE, 0x8489, 0xBEE7, /* 0x60 */
+ 0x848A, 0xCAA3, 0xBCF4, 0x848B, 0x848C, 0x848D, 0x848E, 0xB8B1, /* 0x60 */
+ 0x848F, 0x8490, 0xB8EE, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, /* 0x70 */
+ 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0xD8E2, 0x849B, 0xBDCB, /* 0x70 */
+ 0x849C, 0xD8E4, 0xD8E3, 0x849D, 0x849E, 0x849F, 0x84A0, 0x84A1, /* 0x80 */
+ 0xC5FC, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, 0x84A8, /* 0x80 */
+ 0xD8E5, 0x84A9, 0x84AA, 0xD8E6, 0x84AB, 0x84AC, 0x84AD, 0x84AE, /* 0x90 */
+ 0x84AF, 0x84B0, 0x84B1, 0xC1A6, 0x84B2, 0xC8B0, 0xB0EC, 0xB9A6, /* 0x90 */
+ 0xBCD3, 0xCEF1, 0xDBBD, 0xC1D3, 0x84B3, 0x84B4, 0x84B5, 0x84B6, /* 0xA0 */
+ 0xB6AF, 0xD6FA, 0xC5AC, 0xBDD9, 0xDBBE, 0xDBBF, 0x84B7, 0x84B8, /* 0xA0 */
+ 0x84B9, 0xC0F8, 0xBEA2, 0xC0CD, 0x84BA, 0x84BB, 0x84BC, 0x84BD, /* 0xB0 */
+ 0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0xDBC0, 0xCAC6, /* 0xB0 */
+ 0x84C4, 0x84C5, 0x84C6, 0xB2AA, 0x84C7, 0x84C8, 0x84C9, 0xD3C2, /* 0xC0 */
+ 0x84CA, 0xC3E3, 0x84CB, 0xD1AB, 0x84CC, 0x84CD, 0x84CE, 0x84CF, /* 0xC0 */
+ 0xDBC2, 0x84D0, 0xC0D5, 0x84D1, 0x84D2, 0x84D3, 0xDBC3, 0x84D4, /* 0xD0 */
+ 0xBFB1, 0x84D5, 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0xC4BC, /* 0xD0 */
+ 0x84DB, 0x84DC, 0x84DD, 0x84DE, 0xC7DA, 0x84DF, 0x84E0, 0x84E1, /* 0xE0 */
+ 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, /* 0xE0 */
+ 0xDBC4, 0x84EA, 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x84F0, /* 0xF0 */
+ 0x84F1, 0xD9E8, 0xC9D7, 0x84F2, 0x84F3, 0x84F4, 0xB9B4, 0xCEF0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD4C8, 0x84F5, 0x84F6, 0x84F7, 0x84F8, 0xB0FC, 0xB4D2, 0x84F9, /* 0x00 */
+ 0xD0D9, 0x84FA, 0x84FB, 0x84FC, 0x84FD, 0xD9E9, 0x84FE, 0xDECB, /* 0x00 */
+ 0xD9EB, 0x8540, 0x8541, 0x8542, 0x8543, 0xD8B0, 0xBBAF, 0xB1B1, /* 0x10 */
+ 0x8544, 0xB3D7, 0xD8CE, 0x8545, 0x8546, 0xD4D1, 0x8547, 0x8548, /* 0x10 */
+ 0xBDB3, 0xBFEF, 0x8549, 0xCFBB, 0x854A, 0x854B, 0xD8D0, 0x854C, /* 0x20 */
+ 0x854D, 0x854E, 0xB7CB, 0x854F, 0x8550, 0x8551, 0xD8D1, 0x8552, /* 0x20 */
+ 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855A, /* 0x30 */
+ 0x855B, 0xC6A5, 0xC7F8, 0xD2BD, 0x855C, 0x855D, 0xD8D2, 0xC4E4, /* 0x30 */
+ 0x855E, 0xCAAE, 0x855F, 0xC7A7, 0x8560, 0xD8A6, 0x8561, 0xC9FD, /* 0x40 */
+ 0xCEE7, 0xBBDC, 0xB0EB, 0x8562, 0x8563, 0x8564, 0xBBAA, 0xD0AD, /* 0x40 */
+ 0x8565, 0xB1B0, 0xD7E4, 0xD7BF, 0x8566, 0xB5A5, 0xC2F4, 0xC4CF, /* 0x50 */
+ 0x8567, 0x8568, 0xB2A9, 0x8569, 0xB2B7, 0x856A, 0xB1E5, 0xDFB2, /* 0x50 */
+ 0xD5BC, 0xBFA8, 0xC2AC, 0xD8D5, 0xC2B1, 0x856B, 0xD8D4, 0xCED4, /* 0x60 */
+ 0x856C, 0xDAE0, 0x856D, 0xCEC0, 0x856E, 0x856F, 0xD8B4, 0xC3AE, /* 0x60 */
+ 0xD3A1, 0xCEA3, 0x8570, 0xBCB4, 0xC8B4, 0xC2D1, 0x8571, 0xBEED, /* 0x70 */
+ 0xD0B6, 0x8572, 0xDAE1, 0x8573, 0x8574, 0x8575, 0x8576, 0xC7E4, /* 0x70 */
+ 0x8577, 0x8578, 0xB3A7, 0x8579, 0xB6F2, 0xCCFC, 0xC0FA, 0x857A, /* 0x80 */
+ 0x857B, 0xC0F7, 0x857C, 0xD1B9, 0xD1E1, 0xD8C7, 0x857D, 0x857E, /* 0x80 */
+ 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0xB2DE, 0x8585, 0x8586, /* 0x90 */
+ 0xC0E5, 0x8587, 0xBAF1, 0x8588, 0x8589, 0xD8C8, 0x858A, 0xD4AD, /* 0x90 */
+ 0x858B, 0x858C, 0xCFE1, 0xD8C9, 0x858D, 0xD8CA, 0xCFC3, 0x858E, /* 0xA0 */
+ 0xB3F8, 0xBEC7, 0x858F, 0x8590, 0x8591, 0x8592, 0xD8CB, 0x8593, /* 0xA0 */
+ 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0xDBCC, 0x859A, /* 0xB0 */
+ 0x859B, 0x859C, 0x859D, 0xC8A5, 0x859E, 0x859F, 0x85A0, 0xCFD8, /* 0xB0 */
+ 0x85A1, 0xC8FE, 0xB2CE, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x85A6, /* 0xC0 */
+ 0xD3D6, 0xB2E6, 0xBCB0, 0xD3D1, 0xCBAB, 0xB7B4, 0x85A7, 0x85A8, /* 0xC0 */
+ 0x85A9, 0xB7A2, 0x85AA, 0x85AB, 0xCAE5, 0x85AC, 0xC8A1, 0xCADC, /* 0xD0 */
+ 0xB1E4, 0xD0F0, 0x85AD, 0xC5D1, 0x85AE, 0x85AF, 0x85B0, 0xDBC5, /* 0xD0 */
+ 0xB5FE, 0x85B1, 0x85B2, 0xBFDA, 0xB9C5, 0xBEE4, 0xC1ED, 0x85B3, /* 0xE0 */
+ 0xDFB6, 0xDFB5, 0xD6BB, 0xBDD0, 0xD5D9, 0xB0C8, 0xB6A3, 0xBFC9, /* 0xE0 */
+ 0xCCA8, 0xDFB3, 0xCAB7, 0xD3D2, 0x85B4, 0xD8CF, 0xD2B6, 0xBAC5, /* 0xF0 */
+ 0xCBBE, 0xCCBE, 0x85B5, 0xDFB7, 0xB5F0, 0xDFB4, 0x85B6, 0x85B7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x85B8, 0xD3F5, 0x85B9, 0xB3D4, 0xB8F7, 0x85BA, 0xDFBA, 0x85BB, /* 0x00 */
+ 0xBACF, 0xBCAA, 0xB5F5, 0x85BC, 0xCDAC, 0xC3FB, 0xBAF3, 0xC0F4, /* 0x00 */
+ 0xCDC2, 0xCFF2, 0xDFB8, 0xCFC5, 0x85BD, 0xC2C0, 0xDFB9, 0xC2F0, /* 0x10 */
+ 0x85BE, 0x85BF, 0x85C0, 0xBEFD, 0x85C1, 0xC1DF, 0xCDCC, 0xD2F7, /* 0x10 */
+ 0xB7CD, 0xDFC1, 0x85C2, 0xDFC4, 0x85C3, 0x85C4, 0xB7F1, 0xB0C9, /* 0x20 */
+ 0xB6D6, 0xB7D4, 0x85C5, 0xBAAC, 0xCCFD, 0xBFD4, 0xCBB1, 0xC6F4, /* 0x20 */
+ 0x85C6, 0xD6A8, 0xDFC5, 0x85C7, 0xCEE2, 0xB3B3, 0x85C8, 0x85C9, /* 0x30 */
+ 0xCEFC, 0xB4B5, 0x85CA, 0xCEC7, 0xBAF0, 0x85CB, 0xCEE1, 0x85CC, /* 0x30 */
+ 0xD1BD, 0x85CD, 0x85CE, 0xDFC0, 0x85CF, 0x85D0, 0xB4F4, 0x85D1, /* 0x40 */
+ 0xB3CA, 0x85D2, 0xB8E6, 0xDFBB, 0x85D3, 0x85D4, 0x85D5, 0x85D6, /* 0x40 */
+ 0xC4C5, 0x85D7, 0xDFBC, 0xDFBD, 0xDFBE, 0xC5BB, 0xDFBF, 0xDFC2, /* 0x50 */
+ 0xD4B1, 0xDFC3, 0x85D8, 0xC7BA, 0xCED8, 0x85D9, 0x85DA, 0x85DB, /* 0x50 */
+ 0x85DC, 0x85DD, 0xC4D8, 0x85DE, 0xDFCA, 0x85DF, 0xDFCF, 0x85E0, /* 0x60 */
+ 0xD6DC, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7, /* 0x60 */
+ 0x85E8, 0xDFC9, 0xDFDA, 0xCEB6, 0x85E9, 0xBAC7, 0xDFCE, 0xDFC8, /* 0x70 */
+ 0xC5DE, 0x85EA, 0x85EB, 0xC9EB, 0xBAF4, 0xC3FC, 0x85EC, 0x85ED, /* 0x70 */
+ 0xBED7, 0x85EE, 0xDFC6, 0x85EF, 0xDFCD, 0x85F0, 0xC5D8, 0x85F1, /* 0x80 */
+ 0x85F2, 0x85F3, 0x85F4, 0xD5A6, 0xBACD, 0x85F5, 0xBECC, 0xD3BD, /* 0x80 */
+ 0xB8C0, 0x85F6, 0xD6E4, 0x85F7, 0xDFC7, 0xB9BE, 0xBFA7, 0x85F8, /* 0x90 */
+ 0x85F9, 0xC1FC, 0xDFCB, 0xDFCC, 0x85FA, 0xDFD0, 0x85FB, 0x85FC, /* 0x90 */
+ 0x85FD, 0x85FE, 0x8640, 0xDFDB, 0xDFE5, 0x8641, 0xDFD7, 0xDFD6, /* 0xA0 */
+ 0xD7C9, 0xDFE3, 0xDFE4, 0xE5EB, 0xD2A7, 0xDFD2, 0x8642, 0xBFA9, /* 0xA0 */
+ 0x8643, 0xD4DB, 0x8644, 0xBFC8, 0xDFD4, 0x8645, 0x8646, 0x8647, /* 0xB0 */
+ 0xCFCC, 0x8648, 0x8649, 0xDFDD, 0x864A, 0xD1CA, 0x864B, 0xDFDE, /* 0xB0 */
+ 0xB0A7, 0xC6B7, 0xDFD3, 0x864C, 0xBAE5, 0x864D, 0xB6DF, 0xCDDB, /* 0xC0 */
+ 0xB9FE, 0xD4D5, 0x864E, 0x864F, 0xDFDF, 0xCFEC, 0xB0A5, 0xDFE7, /* 0xC0 */
+ 0xDFD1, 0xD1C6, 0xDFD5, 0xDFD8, 0xDFD9, 0xDFDC, 0x8650, 0xBBA9, /* 0xD0 */
+ 0x8651, 0xDFE0, 0xDFE1, 0x8652, 0xDFE2, 0xDFE6, 0xDFE8, 0xD3B4, /* 0xD0 */
+ 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0xB8E7, 0xC5B6, 0xDFEA, /* 0xE0 */
+ 0xC9DA, 0xC1A8, 0xC4C4, 0x8658, 0x8659, 0xBFDE, 0xCFF8, 0x865A, /* 0xE0 */
+ 0x865B, 0x865C, 0xD5DC, 0xDFEE, 0x865D, 0x865E, 0x865F, 0x8660, /* 0xF0 */
+ 0x8661, 0x8662, 0xB2B8, 0x8663, 0xBADF, 0xDFEC, 0x8664, 0xDBC1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8665, 0xD1E4, 0x8666, 0x8667, 0x8668, 0x8669, 0xCBF4, 0xB4BD, /* 0x00 */
+ 0x866A, 0xB0A6, 0x866B, 0x866C, 0x866D, 0x866E, 0x866F, 0xDFF1, /* 0x00 */
+ 0xCCC6, 0xDFF2, 0x8670, 0x8671, 0xDFED, 0x8672, 0x8673, 0x8674, /* 0x10 */
+ 0x8675, 0x8676, 0x8677, 0xDFE9, 0x8678, 0x8679, 0x867A, 0x867B, /* 0x10 */
+ 0xDFEB, 0x867C, 0xDFEF, 0xDFF0, 0xBBBD, 0x867D, 0x867E, 0xDFF3, /* 0x20 */
+ 0x8680, 0x8681, 0xDFF4, 0x8682, 0xBBA3, 0x8683, 0xCADB, 0xCEA8, /* 0x20 */
+ 0xE0A7, 0xB3AA, 0x8684, 0xE0A6, 0x8685, 0x8686, 0x8687, 0xE0A1, /* 0x30 */
+ 0x8688, 0x8689, 0x868A, 0x868B, 0xDFFE, 0x868C, 0xCDD9, 0xDFFC, /* 0x30 */
+ 0x868D, 0xDFFA, 0x868E, 0xBFD0, 0xD7C4, 0x868F, 0xC9CC, 0x8690, /* 0x40 */
+ 0x8691, 0xDFF8, 0xB0A1, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, /* 0x40 */
+ 0xDFFD, 0x8697, 0x8698, 0x8699, 0x869A, 0xDFFB, 0xE0A2, 0x869B, /* 0x50 */
+ 0x869C, 0x869D, 0x869E, 0x869F, 0xE0A8, 0x86A0, 0x86A1, 0x86A2, /* 0x50 */
+ 0x86A3, 0xB7C8, 0x86A4, 0x86A5, 0xC6A1, 0xC9B6, 0xC0B2, 0xDFF5, /* 0x60 */
+ 0x86A6, 0x86A7, 0xC5BE, 0x86A8, 0xD8C4, 0xDFF9, 0xC4F6, 0x86A9, /* 0x60 */
+ 0x86AA, 0x86AB, 0x86AC, 0x86AD, 0x86AE, 0xE0A3, 0xE0A4, 0xE0A5, /* 0x70 */
+ 0xD0A5, 0x86AF, 0x86B0, 0xE0B4, 0xCCE4, 0x86B1, 0xE0B1, 0x86B2, /* 0x70 */
+ 0xBFA6, 0xE0AF, 0xCEB9, 0xE0AB, 0xC9C6, 0x86B3, 0x86B4, 0xC0AE, /* 0x80 */
+ 0xE0AE, 0xBAED, 0xBAB0, 0xE0A9, 0x86B5, 0x86B6, 0x86B7, 0xDFF6, /* 0x80 */
+ 0x86B8, 0xE0B3, 0x86B9, 0x86BA, 0xE0B8, 0x86BB, 0x86BC, 0x86BD, /* 0x90 */
+ 0xB4AD, 0xE0B9, 0x86BE, 0x86BF, 0xCFB2, 0xBAC8, 0x86C0, 0xE0B0, /* 0x90 */
+ 0x86C1, 0x86C2, 0x86C3, 0x86C4, 0x86C5, 0x86C6, 0x86C7, 0xD0FA, /* 0xA0 */
+ 0x86C8, 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF, /* 0xA0 */
+ 0x86D0, 0xE0AC, 0x86D1, 0xD4FB, 0x86D2, 0xDFF7, 0x86D3, 0xC5E7, /* 0xB0 */
+ 0x86D4, 0xE0AD, 0x86D5, 0xD3F7, 0x86D6, 0xE0B6, 0xE0B7, 0x86D7, /* 0xB0 */
+ 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0xE0C4, 0xD0E1, 0x86DC, 0x86DD, /* 0xC0 */
+ 0x86DE, 0xE0BC, 0x86DF, 0x86E0, 0xE0C9, 0xE0CA, 0x86E1, 0x86E2, /* 0xC0 */
+ 0x86E3, 0xE0BE, 0xE0AA, 0xC9A4, 0xE0C1, 0x86E4, 0xE0B2, 0x86E5, /* 0xD0 */
+ 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0xCAC8, 0xE0C3, 0x86EA, 0xE0B5, /* 0xD0 */
+ 0x86EB, 0xCECB, 0x86EC, 0xCBC3, 0xE0CD, 0xE0C6, 0xE0C2, 0x86ED, /* 0xE0 */
+ 0xE0CB, 0x86EE, 0xE0BA, 0xE0BF, 0xE0C0, 0x86EF, 0x86F0, 0xE0C5, /* 0xE0 */
+ 0x86F1, 0x86F2, 0xE0C7, 0xE0C8, 0x86F3, 0xE0CC, 0x86F4, 0xE0BB, /* 0xF0 */
+ 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0xCBD4, 0xE0D5, 0x86FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE0D6, 0xE0D2, 0x86FB, 0x86FC, 0x86FD, 0x86FE, 0x8740, 0x8741, /* 0x00 */
+ 0xE0D0, 0xBCCE, 0x8742, 0x8743, 0xE0D1, 0x8744, 0xB8C2, 0xD8C5, /* 0x00 */
+ 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, 0x874B, 0x874C, /* 0x10 */
+ 0xD0EA, 0x874D, 0x874E, 0xC2EF, 0x874F, 0x8750, 0xE0CF, 0xE0BD, /* 0x10 */
+ 0x8751, 0x8752, 0x8753, 0xE0D4, 0xE0D3, 0x8754, 0x8755, 0xE0D7, /* 0x20 */
+ 0x8756, 0x8757, 0x8758, 0x8759, 0xE0DC, 0xE0D8, 0x875A, 0x875B, /* 0x20 */
+ 0x875C, 0xD6F6, 0xB3B0, 0x875D, 0xD7EC, 0x875E, 0xCBBB, 0x875F, /* 0x30 */
+ 0x8760, 0xE0DA, 0x8761, 0xCEFB, 0x8762, 0x8763, 0x8764, 0xBAD9, /* 0x30 */
+ 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, /* 0x40 */
+ 0x876D, 0x876E, 0x876F, 0x8770, 0xE0E1, 0xE0DD, 0xD2AD, 0x8771, /* 0x40 */
+ 0x8772, 0x8773, 0x8774, 0x8775, 0xE0E2, 0x8776, 0x8777, 0xE0DB, /* 0x50 */
+ 0xE0D9, 0xE0DF, 0x8778, 0x8779, 0xE0E0, 0x877A, 0x877B, 0x877C, /* 0x50 */
+ 0x877D, 0x877E, 0xE0DE, 0x8780, 0xE0E4, 0x8781, 0x8782, 0x8783, /* 0x60 */
+ 0xC6F7, 0xD8AC, 0xD4EB, 0xE0E6, 0xCAC9, 0x8784, 0x8785, 0x8786, /* 0x60 */
+ 0x8787, 0xE0E5, 0x8788, 0x8789, 0x878A, 0x878B, 0xB8C1, 0x878C, /* 0x70 */
+ 0x878D, 0x878E, 0x878F, 0xE0E7, 0xE0E8, 0x8790, 0x8791, 0x8792, /* 0x70 */
+ 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0xE0E9, 0xE0E3, 0x8798, /* 0x80 */
+ 0x8799, 0x879A, 0x879B, 0x879C, 0x879D, 0x879E, 0xBABF, 0xCCE7, /* 0x80 */
+ 0x879F, 0x87A0, 0x87A1, 0xE0EA, 0x87A2, 0x87A3, 0x87A4, 0x87A5, /* 0x90 */
+ 0x87A6, 0x87A7, 0x87A8, 0x87A9, 0x87AA, 0x87AB, 0x87AC, 0x87AD, /* 0x90 */
+ 0x87AE, 0x87AF, 0x87B0, 0xCFF9, 0x87B1, 0x87B2, 0x87B3, 0x87B4, /* 0xA0 */
+ 0x87B5, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BA, 0x87BB, 0xE0EB, /* 0xA0 */
+ 0x87BC, 0x87BD, 0x87BE, 0x87BF, 0x87C0, 0x87C1, 0x87C2, 0xC8C2, /* 0xB0 */
+ 0x87C3, 0x87C4, 0x87C5, 0x87C6, 0xBDC0, 0x87C7, 0x87C8, 0x87C9, /* 0xB0 */
+ 0x87CA, 0x87CB, 0x87CC, 0x87CD, 0x87CE, 0x87CF, 0x87D0, 0x87D1, /* 0xC0 */
+ 0x87D2, 0x87D3, 0xC4D2, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8, /* 0xC0 */
+ 0x87D9, 0x87DA, 0x87DB, 0x87DC, 0xE0EC, 0x87DD, 0x87DE, 0xE0ED, /* 0xD0 */
+ 0x87DF, 0x87E0, 0xC7F4, 0xCBC4, 0x87E1, 0xE0EE, 0xBBD8, 0xD8B6, /* 0xD0 */
+ 0xD2F2, 0xE0EF, 0xCDC5, 0x87E2, 0xB6DA, 0x87E3, 0x87E4, 0x87E5, /* 0xE0 */
+ 0x87E6, 0x87E7, 0x87E8, 0xE0F1, 0x87E9, 0xD4B0, 0x87EA, 0x87EB, /* 0xE0 */
+ 0xC0A7, 0xB4D1, 0x87EC, 0x87ED, 0xCEA7, 0xE0F0, 0x87EE, 0x87EF, /* 0xF0 */
+ 0x87F0, 0xE0F2, 0xB9CC, 0x87F1, 0x87F2, 0xB9FA, 0xCDBC, 0xE0F3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x87F3, 0x87F4, 0x87F5, 0xC6D4, 0xE0F4, 0x87F6, 0xD4B2, 0x87F7, /* 0x00 */
+ 0xC8A6, 0xE0F6, 0xE0F5, 0x87F8, 0x87F9, 0x87FA, 0x87FB, 0x87FC, /* 0x00 */
+ 0x87FD, 0x87FE, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, /* 0x10 */
+ 0x8846, 0x8847, 0x8848, 0x8849, 0xE0F7, 0x884A, 0x884B, 0xCDC1, /* 0x10 */
+ 0x884C, 0x884D, 0x884E, 0xCAA5, 0x884F, 0x8850, 0x8851, 0x8852, /* 0x20 */
+ 0xD4DA, 0xDBD7, 0xDBD9, 0x8853, 0xDBD8, 0xB9E7, 0xDBDC, 0xDBDD, /* 0x20 */
+ 0xB5D8, 0x8854, 0x8855, 0xDBDA, 0x8856, 0x8857, 0x8858, 0x8859, /* 0x30 */
+ 0x885A, 0xDBDB, 0xB3A1, 0xDBDF, 0x885B, 0x885C, 0xBBF8, 0x885D, /* 0x30 */
+ 0xD6B7, 0x885E, 0xDBE0, 0x885F, 0x8860, 0x8861, 0x8862, 0xBEF9, /* 0x40 */
+ 0x8863, 0x8864, 0xB7BB, 0x8865, 0xDBD0, 0xCCAE, 0xBFB2, 0xBBB5, /* 0x40 */
+ 0xD7F8, 0xBFD3, 0x8866, 0x8867, 0x8868, 0x8869, 0x886A, 0xBFE9, /* 0x50 */
+ 0x886B, 0x886C, 0xBCE1, 0xCCB3, 0xDBDE, 0xB0D3, 0xCEEB, 0xB7D8, /* 0x50 */
+ 0xD7B9, 0xC6C2, 0x886D, 0x886E, 0xC0A4, 0x886F, 0xCCB9, 0x8870, /* 0x60 */
+ 0xDBE7, 0xDBE1, 0xC6BA, 0xDBE3, 0x8871, 0xDBE8, 0x8872, 0xC5F7, /* 0x60 */
+ 0x8873, 0x8874, 0x8875, 0xDBEA, 0x8876, 0x8877, 0xDBE9, 0xBFC0, /* 0x70 */
+ 0x8878, 0x8879, 0x887A, 0xDBE6, 0xDBE5, 0x887B, 0x887C, 0x887D, /* 0x70 */
+ 0x887E, 0x8880, 0xB4B9, 0xC0AC, 0xC2A2, 0xDBE2, 0xDBE4, 0x8881, /* 0x80 */
+ 0x8882, 0x8883, 0x8884, 0xD0CD, 0xDBED, 0x8885, 0x8886, 0x8887, /* 0x80 */
+ 0x8888, 0x8889, 0xC0DD, 0xDBF2, 0x888A, 0x888B, 0x888C, 0x888D, /* 0x90 */
+ 0x888E, 0x888F, 0x8890, 0xB6E2, 0x8891, 0x8892, 0x8893, 0x8894, /* 0x90 */
+ 0xDBF3, 0xDBD2, 0xB9B8, 0xD4AB, 0xDBEC, 0x8895, 0xBFD1, 0xDBF0, /* 0xA0 */
+ 0x8896, 0xDBD1, 0x8897, 0xB5E6, 0x8898, 0xDBEB, 0xBFE5, 0x8899, /* 0xA0 */
+ 0x889A, 0x889B, 0xDBEE, 0x889C, 0xDBF1, 0x889D, 0x889E, 0x889F, /* 0xB0 */
+ 0xDBF9, 0x88A0, 0x88A1, 0x88A2, 0x88A3, 0x88A4, 0x88A5, 0x88A6, /* 0xB0 */
+ 0x88A7, 0x88A8, 0xB9A1, 0xB0A3, 0x88A9, 0x88AA, 0x88AB, 0x88AC, /* 0xC0 */
+ 0x88AD, 0x88AE, 0x88AF, 0xC2F1, 0x88B0, 0x88B1, 0xB3C7, 0xDBEF, /* 0xC0 */
+ 0x88B2, 0x88B3, 0xDBF8, 0x88B4, 0xC6D2, 0xDBF4, 0x88B5, 0x88B6, /* 0xD0 */
+ 0xDBF5, 0xDBF7, 0xDBF6, 0x88B7, 0x88B8, 0xDBFE, 0x88B9, 0xD3F2, /* 0xD0 */
+ 0xB2BA, 0x88BA, 0x88BB, 0x88BC, 0xDBFD, 0x88BD, 0x88BE, 0x88BF, /* 0xE0 */
+ 0x88C0, 0x88C1, 0x88C2, 0x88C3, 0x88C4, 0xDCA4, 0x88C5, 0xDBFB, /* 0xE0 */
+ 0x88C6, 0x88C7, 0x88C8, 0x88C9, 0xDBFA, 0x88CA, 0x88CB, 0x88CC, /* 0xF0 */
+ 0xDBFC, 0xC5E0, 0xBBF9, 0x88CD, 0x88CE, 0xDCA3, 0x88CF, 0x88D0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCA5, 0x88D1, 0xCCC3, 0x88D2, 0x88D3, 0x88D4, 0xB6D1, 0xDDC0, /* 0x00 */
+ 0x88D5, 0x88D6, 0x88D7, 0xDCA1, 0x88D8, 0xDCA2, 0x88D9, 0x88DA, /* 0x00 */
+ 0x88DB, 0xC7B5, 0x88DC, 0x88DD, 0x88DE, 0xB6E9, 0x88DF, 0x88E0, /* 0x10 */
+ 0x88E1, 0xDCA7, 0x88E2, 0x88E3, 0x88E4, 0x88E5, 0xDCA6, 0x88E6, /* 0x10 */
+ 0xDCA9, 0xB1A4, 0x88E7, 0x88E8, 0xB5CC, 0x88E9, 0x88EA, 0x88EB, /* 0x20 */
+ 0x88EC, 0x88ED, 0xBFB0, 0x88EE, 0x88EF, 0x88F0, 0x88F1, 0x88F2, /* 0x20 */
+ 0xD1DF, 0x88F3, 0x88F4, 0x88F5, 0x88F6, 0xB6C2, 0x88F7, 0x88F8, /* 0x30 */
+ 0x88F9, 0x88FA, 0x88FB, 0x88FC, 0x88FD, 0x88FE, 0x8940, 0x8941, /* 0x30 */
+ 0x8942, 0x8943, 0x8944, 0x8945, 0xDCA8, 0x8946, 0x8947, 0x8948, /* 0x40 */
+ 0x8949, 0x894A, 0x894B, 0x894C, 0xCBFA, 0xEBF3, 0x894D, 0x894E, /* 0x40 */
+ 0x894F, 0xCBDC, 0x8950, 0x8951, 0xCBFE, 0x8952, 0x8953, 0x8954, /* 0x50 */
+ 0xCCC1, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0xC8FB, 0x895A, /* 0x50 */
+ 0x895B, 0x895C, 0x895D, 0x895E, 0x895F, 0xDCAA, 0x8960, 0x8961, /* 0x60 */
+ 0x8962, 0x8963, 0x8964, 0xCCEE, 0xDCAB, 0x8965, 0x8966, 0x8967, /* 0x60 */
+ 0x8968, 0x8969, 0x896A, 0x896B, 0x896C, 0x896D, 0x896E, 0x896F, /* 0x70 */
+ 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0xDBD3, 0x8976, /* 0x70 */
+ 0xDCAF, 0xDCAC, 0x8977, 0xBEB3, 0x8978, 0xCAFB, 0x8979, 0x897A, /* 0x80 */
+ 0x897B, 0xDCAD, 0x897C, 0x897D, 0x897E, 0x8980, 0x8981, 0x8982, /* 0x80 */
+ 0x8983, 0x8984, 0xC9CA, 0xC4B9, 0x8985, 0x8986, 0x8987, 0x8988, /* 0x90 */
+ 0x8989, 0xC7BD, 0xDCAE, 0x898A, 0x898B, 0x898C, 0xD4F6, 0xD0E6, /* 0x90 */
+ 0x898D, 0x898E, 0x898F, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, /* 0xA0 */
+ 0xC4AB, 0xB6D5, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899A, /* 0xA0 */
+ 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A1, 0x89A2, /* 0xB0 */
+ 0x89A3, 0x89A4, 0x89A5, 0x89A6, 0xDBD4, 0x89A7, 0x89A8, 0x89A9, /* 0xB0 */
+ 0x89AA, 0xB1DA, 0x89AB, 0x89AC, 0x89AD, 0xDBD5, 0x89AE, 0x89AF, /* 0xC0 */
+ 0x89B0, 0x89B1, 0x89B2, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B7, /* 0xC0 */
+ 0x89B8, 0xDBD6, 0x89B9, 0x89BA, 0x89BB, 0xBABE, 0x89BC, 0x89BD, /* 0xD0 */
+ 0x89BE, 0x89BF, 0x89C0, 0x89C1, 0x89C2, 0x89C3, 0x89C4, 0x89C5, /* 0xD0 */
+ 0x89C6, 0x89C7, 0x89C8, 0x89C9, 0xC8C0, 0x89CA, 0x89CB, 0x89CC, /* 0xE0 */
+ 0x89CD, 0x89CE, 0x89CF, 0xCABF, 0xC8C9, 0x89D0, 0xD7B3, 0x89D1, /* 0xE0 */
+ 0xC9F9, 0x89D2, 0x89D3, 0xBFC7, 0x89D4, 0x89D5, 0xBAF8, 0x89D6, /* 0xF0 */
+ 0x89D7, 0xD2BC, 0x89D8, 0x89D9, 0x89DA, 0x89DB, 0x89DC, 0x89DD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x89DE, 0x89DF, 0xE2BA, 0x89E0, 0xB4A6, 0x89E1, 0x89E2, 0xB1B8, /* 0x00 */
+ 0x89E3, 0x89E4, 0x89E5, 0x89E6, 0x89E7, 0xB8B4, 0x89E8, 0xCFC4, /* 0x00 */
+ 0x89E9, 0x89EA, 0x89EB, 0x89EC, 0xD9E7, 0xCFA6, 0xCDE2, 0x89ED, /* 0x10 */
+ 0x89EE, 0xD9ED, 0xB6E0, 0x89EF, 0xD2B9, 0x89F0, 0x89F1, 0xB9BB, /* 0x10 */
+ 0x89F2, 0x89F3, 0x89F4, 0x89F5, 0xE2B9, 0xE2B7, 0x89F6, 0xB4F3, /* 0x20 */
+ 0x89F7, 0xCCEC, 0xCCAB, 0xB7F2, 0x89F8, 0xD8B2, 0xD1EB, 0xBABB, /* 0x20 */
+ 0x89F9, 0xCAA7, 0x89FA, 0x89FB, 0xCDB7, 0x89FC, 0x89FD, 0xD2C4, /* 0x30 */
+ 0xBFE4, 0xBCD0, 0xB6E1, 0x89FE, 0xDEC5, 0x8A40, 0x8A41, 0x8A42, /* 0x30 */
+ 0x8A43, 0xDEC6, 0xDBBC, 0x8A44, 0xD1D9, 0x8A45, 0x8A46, 0xC6E6, /* 0x40 */
+ 0xC4CE, 0xB7EE, 0x8A47, 0xB7DC, 0x8A48, 0x8A49, 0xBFFC, 0xD7E0, /* 0x40 */
+ 0x8A4A, 0xC6F5, 0x8A4B, 0x8A4C, 0xB1BC, 0xDEC8, 0xBDB1, 0xCCD7, /* 0x50 */
+ 0xDECA, 0x8A4D, 0xDEC9, 0x8A4E, 0x8A4F, 0x8A50, 0x8A51, 0x8A52, /* 0x50 */
+ 0xB5EC, 0x8A53, 0xC9DD, 0x8A54, 0x8A55, 0xB0C2, 0x8A56, 0x8A57, /* 0x60 */
+ 0x8A58, 0x8A59, 0x8A5A, 0x8A5B, 0x8A5C, 0x8A5D, 0x8A5E, 0x8A5F, /* 0x60 */
+ 0x8A60, 0x8A61, 0x8A62, 0xC5AE, 0xC5AB, 0x8A63, 0xC4CC, 0x8A64, /* 0x70 */
+ 0xBCE9, 0xCBFD, 0x8A65, 0x8A66, 0x8A67, 0xBAC3, 0x8A68, 0x8A69, /* 0x70 */
+ 0x8A6A, 0xE5F9, 0xC8E7, 0xE5FA, 0xCDFD, 0x8A6B, 0xD7B1, 0xB8BE, /* 0x80 */
+ 0xC2E8, 0x8A6C, 0xC8D1, 0x8A6D, 0x8A6E, 0xE5FB, 0x8A6F, 0x8A70, /* 0x80 */
+ 0x8A71, 0x8A72, 0xB6CA, 0xBCCB, 0x8A73, 0x8A74, 0xD1FD, 0xE6A1, /* 0x90 */
+ 0x8A75, 0xC3EE, 0x8A76, 0x8A77, 0x8A78, 0x8A79, 0xE6A4, 0x8A7A, /* 0x90 */
+ 0x8A7B, 0x8A7C, 0x8A7D, 0xE5FE, 0xE6A5, 0xCDD7, 0x8A7E, 0x8A80, /* 0xA0 */
+ 0xB7C1, 0xE5FC, 0xE5FD, 0xE6A3, 0x8A81, 0x8A82, 0xC4DD, 0xE6A8, /* 0xA0 */
+ 0x8A83, 0x8A84, 0xE6A7, 0x8A85, 0x8A86, 0x8A87, 0x8A88, 0x8A89, /* 0xB0 */
+ 0x8A8A, 0xC3C3, 0x8A8B, 0xC6DE, 0x8A8C, 0x8A8D, 0xE6AA, 0x8A8E, /* 0xB0 */
+ 0x8A8F, 0x8A90, 0x8A91, 0x8A92, 0x8A93, 0x8A94, 0xC4B7, 0x8A95, /* 0xC0 */
+ 0x8A96, 0x8A97, 0xE6A2, 0xCABC, 0x8A98, 0x8A99, 0x8A9A, 0x8A9B, /* 0xC0 */
+ 0xBDE3, 0xB9C3, 0xE6A6, 0xD0D5, 0xCEAF, 0x8A9C, 0x8A9D, 0xE6A9, /* 0xD0 */
+ 0xE6B0, 0x8A9E, 0xD2A6, 0x8A9F, 0xBDAA, 0xE6AD, 0x8AA0, 0x8AA1, /* 0xD0 */
+ 0x8AA2, 0x8AA3, 0x8AA4, 0xE6AF, 0x8AA5, 0xC0D1, 0x8AA6, 0x8AA7, /* 0xE0 */
+ 0xD2CC, 0x8AA8, 0x8AA9, 0x8AAA, 0xBCA7, 0x8AAB, 0x8AAC, 0x8AAD, /* 0xE0 */
+ 0x8AAE, 0x8AAF, 0x8AB0, 0x8AB1, 0x8AB2, 0x8AB3, 0x8AB4, 0x8AB5, /* 0xF0 */
+ 0x8AB6, 0xE6B1, 0x8AB7, 0xD2F6, 0x8AB8, 0x8AB9, 0x8ABA, 0xD7CB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8ABB, 0xCDFE, 0x8ABC, 0xCDDE, 0xC2A6, 0xE6AB, 0xE6AC, 0xBDBF, /* 0x00 */
+ 0xE6AE, 0xE6B3, 0x8ABD, 0x8ABE, 0xE6B2, 0x8ABF, 0x8AC0, 0x8AC1, /* 0x00 */
+ 0x8AC2, 0xE6B6, 0x8AC3, 0xE6B8, 0x8AC4, 0x8AC5, 0x8AC6, 0x8AC7, /* 0x10 */
+ 0xC4EF, 0x8AC8, 0x8AC9, 0x8ACA, 0xC4C8, 0x8ACB, 0x8ACC, 0xBEEA, /* 0x10 */
+ 0xC9EF, 0x8ACD, 0x8ACE, 0xE6B7, 0x8ACF, 0xB6F0, 0x8AD0, 0x8AD1, /* 0x20 */
+ 0x8AD2, 0xC3E4, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD6, 0x8AD7, 0x8AD8, /* 0x20 */
+ 0x8AD9, 0xD3E9, 0xE6B4, 0x8ADA, 0xE6B5, 0x8ADB, 0xC8A2, 0x8ADC, /* 0x30 */
+ 0x8ADD, 0x8ADE, 0x8ADF, 0x8AE0, 0xE6BD, 0x8AE1, 0x8AE2, 0x8AE3, /* 0x30 */
+ 0xE6B9, 0x8AE4, 0x8AE5, 0x8AE6, 0x8AE7, 0x8AE8, 0xC6C5, 0x8AE9, /* 0x40 */
+ 0x8AEA, 0xCDF1, 0xE6BB, 0x8AEB, 0x8AEC, 0x8AED, 0x8AEE, 0x8AEF, /* 0x40 */
+ 0x8AF0, 0x8AF1, 0x8AF2, 0x8AF3, 0x8AF4, 0xE6BC, 0x8AF5, 0x8AF6, /* 0x50 */
+ 0x8AF7, 0x8AF8, 0xBBE9, 0x8AF9, 0x8AFA, 0x8AFB, 0x8AFC, 0x8AFD, /* 0x50 */
+ 0x8AFE, 0x8B40, 0xE6BE, 0x8B41, 0x8B42, 0x8B43, 0x8B44, 0xE6BA, /* 0x60 */
+ 0x8B45, 0x8B46, 0xC0B7, 0x8B47, 0x8B48, 0x8B49, 0x8B4A, 0x8B4B, /* 0x60 */
+ 0x8B4C, 0x8B4D, 0x8B4E, 0x8B4F, 0xD3A4, 0xE6BF, 0xC9F4, 0xE6C3, /* 0x70 */
+ 0x8B50, 0x8B51, 0xE6C4, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0xD0F6, /* 0x70 */
+ 0x8B56, 0x8B57, 0x8B58, 0x8B59, 0x8B5A, 0x8B5B, 0x8B5C, 0x8B5D, /* 0x80 */
+ 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x8B63, 0x8B64, 0x8B65, /* 0x80 */
+ 0x8B66, 0x8B67, 0xC3BD, 0x8B68, 0x8B69, 0x8B6A, 0x8B6B, 0x8B6C, /* 0x90 */
+ 0x8B6D, 0x8B6E, 0xC3C4, 0xE6C2, 0x8B6F, 0x8B70, 0x8B71, 0x8B72, /* 0x90 */
+ 0x8B73, 0x8B74, 0x8B75, 0x8B76, 0x8B77, 0x8B78, 0x8B79, 0x8B7A, /* 0xA0 */
+ 0x8B7B, 0x8B7C, 0xE6C1, 0x8B7D, 0x8B7E, 0x8B80, 0x8B81, 0x8B82, /* 0xA0 */
+ 0x8B83, 0x8B84, 0xE6C7, 0xCFB1, 0x8B85, 0xEBF4, 0x8B86, 0x8B87, /* 0xB0 */
+ 0xE6CA, 0x8B88, 0x8B89, 0x8B8A, 0x8B8B, 0x8B8C, 0xE6C5, 0x8B8D, /* 0xB0 */
+ 0x8B8E, 0xBCDE, 0xC9A9, 0x8B8F, 0x8B90, 0x8B91, 0x8B92, 0x8B93, /* 0xC0 */
+ 0x8B94, 0xBCB5, 0x8B95, 0x8B96, 0xCFD3, 0x8B97, 0x8B98, 0x8B99, /* 0xC0 */
+ 0x8B9A, 0x8B9B, 0xE6C8, 0x8B9C, 0xE6C9, 0x8B9D, 0xE6CE, 0x8B9E, /* 0xD0 */
+ 0xE6D0, 0x8B9F, 0x8BA0, 0x8BA1, 0xE6D1, 0x8BA2, 0x8BA3, 0x8BA4, /* 0xD0 */
+ 0xE6CB, 0xB5D5, 0x8BA5, 0xE6CC, 0x8BA6, 0x8BA7, 0xE6CF, 0x8BA8, /* 0xE0 */
+ 0x8BA9, 0xC4DB, 0x8BAA, 0xE6C6, 0x8BAB, 0x8BAC, 0x8BAD, 0x8BAE, /* 0xE0 */
+ 0x8BAF, 0xE6CD, 0x8BB0, 0x8BB1, 0x8BB2, 0x8BB3, 0x8BB4, 0x8BB5, /* 0xF0 */
+ 0x8BB6, 0x8BB7, 0x8BB8, 0x8BB9, 0x8BBA, 0x8BBB, 0x8BBC, 0x8BBD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8BBE, 0x8BBF, 0x8BC0, 0x8BC1, 0x8BC2, 0x8BC3, 0x8BC4, 0x8BC5, /* 0x00 */
+ 0x8BC6, 0xE6D2, 0x8BC7, 0x8BC8, 0x8BC9, 0x8BCA, 0x8BCB, 0x8BCC, /* 0x00 */
+ 0x8BCD, 0x8BCE, 0x8BCF, 0x8BD0, 0x8BD1, 0x8BD2, 0xE6D4, 0xE6D3, /* 0x10 */
+ 0x8BD3, 0x8BD4, 0x8BD5, 0x8BD6, 0x8BD7, 0x8BD8, 0x8BD9, 0x8BDA, /* 0x10 */
+ 0x8BDB, 0x8BDC, 0x8BDD, 0x8BDE, 0x8BDF, 0x8BE0, 0x8BE1, 0x8BE2, /* 0x20 */
+ 0x8BE3, 0x8BE4, 0x8BE5, 0x8BE6, 0x8BE7, 0x8BE8, 0x8BE9, 0x8BEA, /* 0x20 */
+ 0x8BEB, 0x8BEC, 0xE6D5, 0x8BED, 0xD9F8, 0x8BEE, 0x8BEF, 0xE6D6, /* 0x30 */
+ 0x8BF0, 0x8BF1, 0x8BF2, 0x8BF3, 0x8BF4, 0x8BF5, 0x8BF6, 0x8BF7, /* 0x30 */
+ 0xE6D7, 0x8BF8, 0x8BF9, 0x8BFA, 0x8BFB, 0x8BFC, 0x8BFD, 0x8BFE, /* 0x40 */
+ 0x8C40, 0x8C41, 0x8C42, 0x8C43, 0x8C44, 0x8C45, 0x8C46, 0x8C47, /* 0x40 */
+ 0xD7D3, 0xE6DD, 0x8C48, 0xE6DE, 0xBFD7, 0xD4D0, 0x8C49, 0xD7D6, /* 0x50 */
+ 0xB4E6, 0xCBEF, 0xE6DA, 0xD8C3, 0xD7CE, 0xD0A2, 0x8C4A, 0xC3CF, /* 0x50 */
+ 0x8C4B, 0x8C4C, 0xE6DF, 0xBCBE, 0xB9C2, 0xE6DB, 0xD1A7, 0x8C4D, /* 0x60 */
+ 0x8C4E, 0xBAA2, 0xC2CF, 0x8C4F, 0xD8AB, 0x8C50, 0x8C51, 0x8C52, /* 0x60 */
+ 0xCAEB, 0xE5EE, 0x8C53, 0xE6DC, 0x8C54, 0xB7F5, 0x8C55, 0x8C56, /* 0x70 */
+ 0x8C57, 0x8C58, 0xC8E6, 0x8C59, 0x8C5A, 0xC4F5, 0x8C5B, 0x8C5C, /* 0x70 */
+ 0xE5B2, 0xC4FE, 0x8C5D, 0xCBFC, 0xE5B3, 0xD5AC, 0x8C5E, 0xD3EE, /* 0x80 */
+ 0xCAD8, 0xB0B2, 0x8C5F, 0xCBCE, 0xCDEA, 0x8C60, 0x8C61, 0xBAEA, /* 0x80 */
+ 0x8C62, 0x8C63, 0x8C64, 0xE5B5, 0x8C65, 0xE5B4, 0x8C66, 0xD7DA, /* 0x90 */
+ 0xB9D9, 0xD6E6, 0xB6A8, 0xCDF0, 0xD2CB, 0xB1A6, 0xCAB5, 0x8C67, /* 0x90 */
+ 0xB3E8, 0xC9F3, 0xBFCD, 0xD0FB, 0xCAD2, 0xE5B6, 0xBBC2, 0x8C68, /* 0xA0 */
+ 0x8C69, 0x8C6A, 0xCFDC, 0xB9AC, 0x8C6B, 0x8C6C, 0x8C6D, 0x8C6E, /* 0xA0 */
+ 0xD4D7, 0x8C6F, 0x8C70, 0xBAA6, 0xD1E7, 0xCFFC, 0xBCD2, 0x8C71, /* 0xB0 */
+ 0xE5B7, 0xC8DD, 0x8C72, 0x8C73, 0x8C74, 0xBFED, 0xB1F6, 0xCBDE, /* 0xB0 */
+ 0x8C75, 0x8C76, 0xBCC5, 0x8C77, 0xBCC4, 0xD2FA, 0xC3DC, 0xBFDC, /* 0xC0 */
+ 0x8C78, 0x8C79, 0x8C7A, 0x8C7B, 0xB8BB, 0x8C7C, 0x8C7D, 0x8C7E, /* 0xC0 */
+ 0xC3C2, 0x8C80, 0xBAAE, 0xD4A2, 0x8C81, 0x8C82, 0x8C83, 0x8C84, /* 0xD0 */
+ 0x8C85, 0x8C86, 0x8C87, 0x8C88, 0x8C89, 0xC7DE, 0xC4AF, 0xB2EC, /* 0xD0 */
+ 0x8C8A, 0xB9D1, 0x8C8B, 0x8C8C, 0xE5BB, 0xC1C8, 0x8C8D, 0x8C8E, /* 0xE0 */
+ 0xD5AF, 0x8C8F, 0x8C90, 0x8C91, 0x8C92, 0x8C93, 0xE5BC, 0x8C94, /* 0xE0 */
+ 0xE5BE, 0x8C95, 0x8C96, 0x8C97, 0x8C98, 0x8C99, 0x8C9A, 0x8C9B, /* 0xF0 */
+ 0xB4E7, 0xB6D4, 0xCBC2, 0xD1B0, 0xB5BC, 0x8C9C, 0x8C9D, 0xCAD9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8C9E, 0xB7E2, 0x8C9F, 0x8CA0, 0xC9E4, 0x8CA1, 0xBDAB, 0x8CA2, /* 0x00 */
+ 0x8CA3, 0xCEBE, 0xD7F0, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CA7, 0xD0A1, /* 0x00 */
+ 0x8CA8, 0xC9D9, 0x8CA9, 0x8CAA, 0xB6FB, 0xE6D8, 0xBCE2, 0x8CAB, /* 0x10 */
+ 0xB3BE, 0x8CAC, 0xC9D0, 0x8CAD, 0xE6D9, 0xB3A2, 0x8CAE, 0x8CAF, /* 0x10 */
+ 0x8CB0, 0x8CB1, 0xDECC, 0x8CB2, 0xD3C8, 0xDECD, 0x8CB3, 0xD2A2, /* 0x20 */
+ 0x8CB4, 0x8CB5, 0x8CB6, 0x8CB7, 0xDECE, 0x8CB8, 0x8CB9, 0x8CBA, /* 0x20 */
+ 0x8CBB, 0xBECD, 0x8CBC, 0x8CBD, 0xDECF, 0x8CBE, 0x8CBF, 0x8CC0, /* 0x30 */
+ 0xCAAC, 0xD2FC, 0xB3DF, 0xE5EA, 0xC4E1, 0xBEA1, 0xCEB2, 0xC4F2, /* 0x30 */
+ 0xBED6, 0xC6A8, 0xB2E3, 0x8CC1, 0x8CC2, 0xBED3, 0x8CC3, 0x8CC4, /* 0x40 */
+ 0xC7FC, 0xCCEB, 0xBDEC, 0xCEDD, 0x8CC5, 0x8CC6, 0xCABA, 0xC6C1, /* 0x40 */
+ 0xE5EC, 0xD0BC, 0x8CC7, 0x8CC8, 0x8CC9, 0xD5B9, 0x8CCA, 0x8CCB, /* 0x50 */
+ 0x8CCC, 0xE5ED, 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0xCAF4, 0x8CD1, /* 0x50 */
+ 0xCDC0, 0xC2C5, 0x8CD2, 0xE5EF, 0x8CD3, 0xC2C4, 0xE5F0, 0x8CD4, /* 0x60 */
+ 0x8CD5, 0x8CD6, 0x8CD7, 0x8CD8, 0x8CD9, 0x8CDA, 0xE5F8, 0xCDCD, /* 0x60 */
+ 0x8CDB, 0xC9BD, 0x8CDC, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x8CE1, /* 0x70 */
+ 0x8CE2, 0xD2D9, 0xE1A8, 0x8CE3, 0x8CE4, 0x8CE5, 0x8CE6, 0xD3EC, /* 0x70 */
+ 0x8CE7, 0xCBEA, 0xC6F1, 0x8CE8, 0x8CE9, 0x8CEA, 0x8CEB, 0x8CEC, /* 0x80 */
+ 0xE1AC, 0x8CED, 0x8CEE, 0x8CEF, 0xE1A7, 0xE1A9, 0x8CF0, 0x8CF1, /* 0x80 */
+ 0xE1AA, 0xE1AF, 0x8CF2, 0x8CF3, 0xB2ED, 0x8CF4, 0xE1AB, 0xB8DA, /* 0x90 */
+ 0xE1AD, 0xE1AE, 0xE1B0, 0xB5BA, 0xE1B1, 0x8CF5, 0x8CF6, 0x8CF7, /* 0x90 */
+ 0x8CF8, 0x8CF9, 0xE1B3, 0xE1B8, 0x8CFA, 0x8CFB, 0x8CFC, 0x8CFD, /* 0xA0 */
+ 0x8CFE, 0xD1D2, 0x8D40, 0xE1B6, 0xE1B5, 0xC1EB, 0x8D41, 0x8D42, /* 0xA0 */
+ 0x8D43, 0xE1B7, 0x8D44, 0xD4C0, 0x8D45, 0xE1B2, 0x8D46, 0xE1BA, /* 0xB0 */
+ 0xB0B6, 0x8D47, 0x8D48, 0x8D49, 0x8D4A, 0xE1B4, 0x8D4B, 0xBFF9, /* 0xB0 */
+ 0x8D4C, 0xE1B9, 0x8D4D, 0x8D4E, 0xE1BB, 0x8D4F, 0x8D50, 0x8D51, /* 0xC0 */
+ 0x8D52, 0x8D53, 0x8D54, 0xE1BE, 0x8D55, 0x8D56, 0x8D57, 0x8D58, /* 0xC0 */
+ 0x8D59, 0x8D5A, 0xE1BC, 0x8D5B, 0x8D5C, 0x8D5D, 0x8D5E, 0x8D5F, /* 0xD0 */
+ 0x8D60, 0xD6C5, 0x8D61, 0x8D62, 0x8D63, 0x8D64, 0x8D65, 0x8D66, /* 0xD0 */
+ 0x8D67, 0xCFBF, 0x8D68, 0x8D69, 0xE1BD, 0xE1BF, 0xC2CD, 0x8D6A, /* 0xE0 */
+ 0xB6EB, 0x8D6B, 0xD3F8, 0x8D6C, 0x8D6D, 0xC7CD, 0x8D6E, 0x8D6F, /* 0xE0 */
+ 0xB7E5, 0x8D70, 0x8D71, 0x8D72, 0x8D73, 0x8D74, 0x8D75, 0x8D76, /* 0xF0 */
+ 0x8D77, 0x8D78, 0x8D79, 0xBEFE, 0x8D7A, 0x8D7B, 0x8D7C, 0x8D7D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8D7E, 0x8D80, 0xE1C0, 0xE1C1, 0x8D81, 0x8D82, 0xE1C7, 0xB3E7, /* 0x00 */
+ 0x8D83, 0x8D84, 0x8D85, 0x8D86, 0x8D87, 0x8D88, 0xC6E9, 0x8D89, /* 0x00 */
+ 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0xB4DE, 0x8D8E, 0xD1C2, 0x8D8F, /* 0x10 */
+ 0x8D90, 0x8D91, 0x8D92, 0xE1C8, 0x8D93, 0x8D94, 0xE1C6, 0x8D95, /* 0x10 */
+ 0x8D96, 0x8D97, 0x8D98, 0x8D99, 0xE1C5, 0x8D9A, 0xE1C3, 0xE1C2, /* 0x20 */
+ 0x8D9B, 0xB1C0, 0x8D9C, 0x8D9D, 0x8D9E, 0xD5B8, 0xE1C4, 0x8D9F, /* 0x20 */
+ 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0xE1CB, 0x8DA4, 0x8DA5, 0x8DA6, /* 0x30 */
+ 0x8DA7, 0x8DA8, 0x8DA9, 0x8DAA, 0x8DAB, 0xE1CC, 0xE1CA, 0x8DAC, /* 0x30 */
+ 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x8DB1, 0x8DB2, 0x8DB3, 0xEFFA, /* 0x40 */
+ 0x8DB4, 0x8DB5, 0xE1D3, 0xE1D2, 0xC7B6, 0x8DB6, 0x8DB7, 0x8DB8, /* 0x40 */
+ 0x8DB9, 0x8DBA, 0x8DBB, 0x8DBC, 0x8DBD, 0x8DBE, 0x8DBF, 0x8DC0, /* 0x50 */
+ 0xE1C9, 0x8DC1, 0x8DC2, 0xE1CE, 0x8DC3, 0xE1D0, 0x8DC4, 0x8DC5, /* 0x50 */
+ 0x8DC6, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCB, 0x8DCC, 0x8DCD, /* 0x60 */
+ 0x8DCE, 0xE1D4, 0x8DCF, 0xE1D1, 0xE1CD, 0x8DD0, 0x8DD1, 0xE1CF, /* 0x60 */
+ 0x8DD2, 0x8DD3, 0x8DD4, 0x8DD5, 0xE1D5, 0x8DD6, 0x8DD7, 0x8DD8, /* 0x70 */
+ 0x8DD9, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x8DDE, 0x8DDF, 0x8DE0, /* 0x70 */
+ 0x8DE1, 0x8DE2, 0xE1D6, 0x8DE3, 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7, /* 0x80 */
+ 0x8DE8, 0x8DE9, 0x8DEA, 0x8DEB, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF, /* 0x80 */
+ 0x8DF0, 0x8DF1, 0x8DF2, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0x8DF7, /* 0x90 */
+ 0x8DF8, 0xE1D7, 0x8DF9, 0x8DFA, 0x8DFB, 0xE1D8, 0x8DFC, 0x8DFD, /* 0x90 */
+ 0x8DFE, 0x8E40, 0x8E41, 0x8E42, 0x8E43, 0x8E44, 0x8E45, 0x8E46, /* 0xA0 */
+ 0x8E47, 0x8E48, 0x8E49, 0x8E4A, 0x8E4B, 0x8E4C, 0x8E4D, 0x8E4E, /* 0xA0 */
+ 0x8E4F, 0x8E50, 0x8E51, 0x8E52, 0x8E53, 0x8E54, 0x8E55, 0xE1DA, /* 0xB0 */
+ 0x8E56, 0x8E57, 0x8E58, 0x8E59, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D, /* 0xB0 */
+ 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0xE1DB, 0x8E63, 0x8E64, /* 0xC0 */
+ 0x8E65, 0x8E66, 0x8E67, 0x8E68, 0x8E69, 0xCEA1, 0x8E6A, 0x8E6B, /* 0xC0 */
+ 0x8E6C, 0x8E6D, 0x8E6E, 0x8E6F, 0x8E70, 0x8E71, 0x8E72, 0x8E73, /* 0xD0 */
+ 0x8E74, 0x8E75, 0x8E76, 0xE7DD, 0x8E77, 0xB4A8, 0xD6DD, 0x8E78, /* 0xD0 */
+ 0x8E79, 0xD1B2, 0xB3B2, 0x8E7A, 0x8E7B, 0xB9A4, 0xD7F3, 0xC7C9, /* 0xE0 */
+ 0xBEDE, 0xB9AE, 0x8E7C, 0xCED7, 0x8E7D, 0x8E7E, 0xB2EE, 0xDBCF, /* 0xE0 */
+ 0x8E80, 0xBCBA, 0xD2D1, 0xCBC8, 0xB0CD, 0x8E81, 0x8E82, 0xCFEF, /* 0xF0 */
+ 0x8E83, 0x8E84, 0x8E85, 0x8E86, 0x8E87, 0xD9E3, 0xBDED, 0x8E88 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E89, 0xB1D2, 0xCAD0, 0xB2BC, 0x8E8A, 0xCBA7, 0xB7AB, 0x8E8B, /* 0x00 */
+ 0xCAA6, 0x8E8C, 0x8E8D, 0x8E8E, 0xCFA3, 0x8E8F, 0x8E90, 0xE0F8, /* 0x00 */
+ 0xD5CA, 0xE0FB, 0x8E91, 0x8E92, 0xE0FA, 0xC5C1, 0xCCFB, 0x8E93, /* 0x10 */
+ 0xC1B1, 0xE0F9, 0xD6E3, 0xB2AF, 0xD6C4, 0xB5DB, 0x8E94, 0x8E95, /* 0x10 */
+ 0x8E96, 0x8E97, 0x8E98, 0x8E99, 0x8E9A, 0x8E9B, 0xB4F8, 0xD6A1, /* 0x20 */
+ 0x8E9C, 0x8E9D, 0x8E9E, 0x8E9F, 0x8EA0, 0xCFAF, 0xB0EF, 0x8EA1, /* 0x20 */
+ 0x8EA2, 0xE0FC, 0x8EA3, 0x8EA4, 0x8EA5, 0x8EA6, 0x8EA7, 0xE1A1, /* 0x30 */
+ 0xB3A3, 0x8EA8, 0x8EA9, 0xE0FD, 0xE0FE, 0xC3B1, 0x8EAA, 0x8EAB, /* 0x30 */
+ 0x8EAC, 0x8EAD, 0xC3DD, 0x8EAE, 0xE1A2, 0xB7F9, 0x8EAF, 0x8EB0, /* 0x40 */
+ 0x8EB1, 0x8EB2, 0x8EB3, 0x8EB4, 0xBBCF, 0x8EB5, 0x8EB6, 0x8EB7, /* 0x40 */
+ 0x8EB8, 0x8EB9, 0x8EBA, 0x8EBB, 0xE1A3, 0xC4BB, 0x8EBC, 0x8EBD, /* 0x50 */
+ 0x8EBE, 0x8EBF, 0x8EC0, 0xE1A4, 0x8EC1, 0x8EC2, 0xE1A5, 0x8EC3, /* 0x50 */
+ 0x8EC4, 0xE1A6, 0xB4B1, 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, /* 0x60 */
+ 0x8ECA, 0x8ECB, 0x8ECC, 0x8ECD, 0x8ECE, 0x8ECF, 0x8ED0, 0x8ED1, /* 0x60 */
+ 0x8ED2, 0x8ED3, 0xB8C9, 0xC6BD, 0xC4EA, 0x8ED4, 0xB2A2, 0x8ED5, /* 0x70 */
+ 0xD0D2, 0x8ED6, 0xE7DB, 0xBBC3, 0xD3D7, 0xD3C4, 0x8ED7, 0xB9E3, /* 0x70 */
+ 0xE2CF, 0x8ED8, 0x8ED9, 0x8EDA, 0xD7AF, 0x8EDB, 0xC7EC, 0xB1D3, /* 0x80 */
+ 0x8EDC, 0x8EDD, 0xB4B2, 0xE2D1, 0x8EDE, 0x8EDF, 0x8EE0, 0xD0F2, /* 0x80 */
+ 0xC2AE, 0xE2D0, 0x8EE1, 0xBFE2, 0xD3A6, 0xB5D7, 0xE2D2, 0xB5EA, /* 0x90 */
+ 0x8EE2, 0xC3ED, 0xB8FD, 0x8EE3, 0xB8AE, 0x8EE4, 0xC5D3, 0xB7CF, /* 0x90 */
+ 0xE2D4, 0x8EE5, 0x8EE6, 0x8EE7, 0x8EE8, 0xE2D3, 0xB6C8, 0xD7F9, /* 0xA0 */
+ 0x8EE9, 0x8EEA, 0x8EEB, 0x8EEC, 0x8EED, 0xCDA5, 0x8EEE, 0x8EEF, /* 0xA0 */
+ 0x8EF0, 0x8EF1, 0x8EF2, 0xE2D8, 0x8EF3, 0xE2D6, 0xCAFC, 0xBFB5, /* 0xB0 */
+ 0xD3B9, 0xE2D5, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, 0xE2D7, 0x8EF8, /* 0xB0 */
+ 0x8EF9, 0x8EFA, 0x8EFB, 0x8EFC, 0x8EFD, 0x8EFE, 0x8F40, 0x8F41, /* 0xC0 */
+ 0x8F42, 0xC1AE, 0xC0C8, 0x8F43, 0x8F44, 0x8F45, 0x8F46, 0x8F47, /* 0xC0 */
+ 0x8F48, 0xE2DB, 0xE2DA, 0xC0AA, 0x8F49, 0x8F4A, 0xC1CE, 0x8F4B, /* 0xD0 */
+ 0x8F4C, 0x8F4D, 0x8F4E, 0xE2DC, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, /* 0xD0 */
+ 0x8F53, 0x8F54, 0x8F55, 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, /* 0xE0 */
+ 0xE2DD, 0x8F5B, 0xE2DE, 0x8F5C, 0x8F5D, 0x8F5E, 0x8F5F, 0x8F60, /* 0xE0 */
+ 0x8F61, 0x8F62, 0x8F63, 0x8F64, 0xDBC8, 0x8F65, 0xD1D3, 0xCDA2, /* 0xF0 */
+ 0x8F66, 0x8F67, 0xBDA8, 0x8F68, 0x8F69, 0x8F6A, 0xDEC3, 0xD8A5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBFAA, 0xDBCD, 0xD2EC, 0xC6FA, 0xC5AA, 0x8F6B, 0x8F6C, 0x8F6D, /* 0x00 */
+ 0xDEC4, 0x8F6E, 0xB1D7, 0xDFAE, 0x8F6F, 0x8F70, 0x8F71, 0xCABD, /* 0x00 */
+ 0x8F72, 0xDFB1, 0x8F73, 0xB9AD, 0x8F74, 0xD2FD, 0x8F75, 0xB8A5, /* 0x10 */
+ 0xBAEB, 0x8F76, 0x8F77, 0xB3DA, 0x8F78, 0x8F79, 0x8F7A, 0xB5DC, /* 0x10 */
+ 0xD5C5, 0x8F7B, 0x8F7C, 0x8F7D, 0x8F7E, 0xC3D6, 0xCFD2, 0xBBA1, /* 0x20 */
+ 0x8F80, 0xE5F3, 0xE5F2, 0x8F81, 0x8F82, 0xE5F4, 0x8F83, 0xCDE4, /* 0x20 */
+ 0x8F84, 0xC8F5, 0x8F85, 0x8F86, 0x8F87, 0x8F88, 0x8F89, 0x8F8A, /* 0x30 */
+ 0x8F8B, 0xB5AF, 0xC7BF, 0x8F8C, 0xE5F6, 0x8F8D, 0x8F8E, 0x8F8F, /* 0x30 */
+ 0xECB0, 0x8F90, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x8F95, 0x8F96, /* 0x40 */
+ 0x8F97, 0x8F98, 0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x8F9D, 0x8F9E, /* 0x40 */
+ 0xE5E6, 0x8F9F, 0xB9E9, 0xB5B1, 0x8FA0, 0xC2BC, 0xE5E8, 0xE5E7, /* 0x50 */
+ 0xE5E9, 0x8FA1, 0x8FA2, 0x8FA3, 0x8FA4, 0xD2CD, 0x8FA5, 0x8FA6, /* 0x50 */
+ 0x8FA7, 0xE1EA, 0xD0CE, 0x8FA8, 0xCDAE, 0x8FA9, 0xD1E5, 0x8FAA, /* 0x60 */
+ 0x8FAB, 0xB2CA, 0xB1EB, 0x8FAC, 0xB1F2, 0xC5ED, 0x8FAD, 0x8FAE, /* 0x60 */
+ 0xD5C3, 0xD3B0, 0x8FAF, 0xE1DC, 0x8FB0, 0x8FB1, 0x8FB2, 0xE1DD, /* 0x70 */
+ 0x8FB3, 0xD2DB, 0x8FB4, 0xB3B9, 0xB1CB, 0x8FB5, 0x8FB6, 0x8FB7, /* 0x70 */
+ 0xCDF9, 0xD5F7, 0xE1DE, 0x8FB8, 0xBEB6, 0xB4FD, 0x8FB9, 0xE1DF, /* 0x80 */
+ 0xBADC, 0xE1E0, 0xBBB2, 0xC2C9, 0xE1E1, 0x8FBA, 0x8FBB, 0x8FBC, /* 0x80 */
+ 0xD0EC, 0x8FBD, 0xCDBD, 0x8FBE, 0x8FBF, 0xE1E2, 0x8FC0, 0xB5C3, /* 0x90 */
+ 0xC5C7, 0xE1E3, 0x8FC1, 0x8FC2, 0xE1E4, 0x8FC3, 0x8FC4, 0x8FC5, /* 0x90 */
+ 0x8FC6, 0xD3F9, 0x8FC7, 0x8FC8, 0x8FC9, 0x8FCA, 0x8FCB, 0x8FCC, /* 0xA0 */
+ 0xE1E5, 0x8FCD, 0xD1AD, 0x8FCE, 0x8FCF, 0xE1E6, 0xCEA2, 0x8FD0, /* 0xA0 */
+ 0x8FD1, 0x8FD2, 0x8FD3, 0x8FD4, 0x8FD5, 0xE1E7, 0x8FD6, 0xB5C2, /* 0xB0 */
+ 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA, 0xE1E8, 0xBBD5, 0x8FDB, 0x8FDC, /* 0xB0 */
+ 0x8FDD, 0x8FDE, 0x8FDF, 0xD0C4, 0xE2E0, 0xB1D8, 0xD2E4, 0x8FE0, /* 0xC0 */
+ 0x8FE1, 0xE2E1, 0x8FE2, 0x8FE3, 0xBCC9, 0xC8CC, 0x8FE4, 0xE2E3, /* 0xC0 */
+ 0xECFE, 0xECFD, 0xDFAF, 0x8FE5, 0x8FE6, 0x8FE7, 0xE2E2, 0xD6BE, /* 0xD0 */
+ 0xCDFC, 0xC3A6, 0x8FE8, 0x8FE9, 0x8FEA, 0xE3C3, 0x8FEB, 0x8FEC, /* 0xD0 */
+ 0xD6D2, 0xE2E7, 0x8FED, 0x8FEE, 0xE2E8, 0x8FEF, 0x8FF0, 0xD3C7, /* 0xE0 */
+ 0x8FF1, 0x8FF2, 0xE2EC, 0xBFEC, 0x8FF3, 0xE2ED, 0xE2E5, 0x8FF4, /* 0xE0 */
+ 0x8FF5, 0xB3C0, 0x8FF6, 0x8FF7, 0x8FF8, 0xC4EE, 0x8FF9, 0x8FFA, /* 0xF0 */
+ 0xE2EE, 0x8FFB, 0x8FFC, 0xD0C3, 0x8FFD, 0xBAF6, 0xE2E9, 0xB7DE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBBB3, 0xCCAC, 0xCBCB, 0xE2E4, 0xE2E6, 0xE2EA, 0xE2EB, 0x8FFE, /* 0x00 */
+ 0x9040, 0x9041, 0xE2F7, 0x9042, 0x9043, 0xE2F4, 0xD4F5, 0xE2F3, /* 0x00 */
+ 0x9044, 0x9045, 0xC5AD, 0x9046, 0xD5FA, 0xC5C2, 0xB2C0, 0x9047, /* 0x10 */
+ 0x9048, 0xE2EF, 0x9049, 0xE2F2, 0xC1AF, 0xCBBC, 0x904A, 0x904B, /* 0x10 */
+ 0xB5A1, 0xE2F9, 0x904C, 0x904D, 0x904E, 0xBCB1, 0xE2F1, 0xD0D4, /* 0x20 */
+ 0xD4B9, 0xE2F5, 0xB9D6, 0xE2F6, 0x904F, 0x9050, 0x9051, 0xC7D3, /* 0x20 */
+ 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0xE2F0, 0x9057, 0x9058, /* 0x30 */
+ 0x9059, 0x905A, 0x905B, 0xD7DC, 0xEDA1, 0x905C, 0x905D, 0xE2F8, /* 0x30 */
+ 0x905E, 0xEDA5, 0xE2FE, 0xCAD1, 0x905F, 0x9060, 0x9061, 0x9062, /* 0x40 */
+ 0x9063, 0x9064, 0x9065, 0xC1B5, 0x9066, 0xBBD0, 0x9067, 0x9068, /* 0x40 */
+ 0xBFD6, 0x9069, 0xBAE3, 0x906A, 0x906B, 0xCBA1, 0x906C, 0x906D, /* 0x50 */
+ 0x906E, 0xEDA6, 0xEDA3, 0x906F, 0x9070, 0xEDA2, 0x9071, 0x9072, /* 0x50 */
+ 0x9073, 0x9074, 0xBBD6, 0xEDA7, 0xD0F4, 0x9075, 0x9076, 0xEDA4, /* 0x60 */
+ 0xBADE, 0xB6F7, 0xE3A1, 0xB6B2, 0xCCF1, 0xB9A7, 0x9077, 0xCFA2, /* 0x60 */
+ 0xC7A1, 0x9078, 0x9079, 0xBFD2, 0x907A, 0x907B, 0xB6F1, 0x907C, /* 0x70 */
+ 0xE2FA, 0xE2FB, 0xE2FD, 0xE2FC, 0xC4D5, 0xE3A2, 0x907D, 0xD3C1, /* 0x70 */
+ 0x907E, 0x9080, 0x9081, 0xE3A7, 0xC7C4, 0x9082, 0x9083, 0x9084, /* 0x80 */
+ 0x9085, 0xCFA4, 0x9086, 0x9087, 0xE3A9, 0xBAB7, 0x9088, 0x9089, /* 0x80 */
+ 0x908A, 0x908B, 0xE3A8, 0x908C, 0xBBDA, 0x908D, 0xE3A3, 0x908E, /* 0x90 */
+ 0x908F, 0x9090, 0xE3A4, 0xE3AA, 0x9091, 0xE3A6, 0x9092, 0xCEF2, /* 0x90 */
+ 0xD3C6, 0x9093, 0x9094, 0xBBBC, 0x9095, 0x9096, 0xD4C3, 0x9097, /* 0xA0 */
+ 0xC4FA, 0x9098, 0x9099, 0xEDA8, 0xD0FC, 0xE3A5, 0x909A, 0xC3F5, /* 0xA0 */
+ 0x909B, 0xE3AD, 0xB1AF, 0x909C, 0xE3B2, 0x909D, 0x909E, 0x909F, /* 0xB0 */
+ 0xBCC2, 0x90A0, 0x90A1, 0xE3AC, 0xB5BF, 0x90A2, 0x90A3, 0x90A4, /* 0xB0 */
+ 0x90A5, 0x90A6, 0x90A7, 0x90A8, 0x90A9, 0xC7E9, 0xE3B0, 0x90AA, /* 0xC0 */
+ 0x90AB, 0x90AC, 0xBEAA, 0xCDEF, 0x90AD, 0x90AE, 0x90AF, 0x90B0, /* 0xC0 */
+ 0x90B1, 0xBBF3, 0x90B2, 0x90B3, 0x90B4, 0xCCE8, 0x90B5, 0x90B6, /* 0xD0 */
+ 0xE3AF, 0x90B7, 0xE3B1, 0x90B8, 0xCFA7, 0xE3AE, 0x90B9, 0xCEA9, /* 0xD0 */
+ 0xBBDD, 0x90BA, 0x90BB, 0x90BC, 0x90BD, 0x90BE, 0xB5EB, 0xBEE5, /* 0xE0 */
+ 0xB2D2, 0xB3CD, 0x90BF, 0xB1B9, 0xE3AB, 0xB2D1, 0xB5AC, 0xB9DF, /* 0xE0 */
+ 0xB6E8, 0x90C0, 0x90C1, 0xCFEB, 0xE3B7, 0x90C2, 0xBBCC, 0x90C3, /* 0xF0 */
+ 0x90C4, 0xC8C7, 0xD0CA, 0x90C5, 0x90C6, 0x90C7, 0x90C8, 0x90C9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE3B8, 0xB3EE, 0x90CA, 0x90CB, 0x90CC, 0x90CD, 0xEDA9, 0x90CE, /* 0x00 */
+ 0xD3FA, 0xD3E4, 0x90CF, 0x90D0, 0x90D1, 0xEDAA, 0xE3B9, 0xD2E2, /* 0x00 */
+ 0x90D2, 0x90D3, 0x90D4, 0x90D5, 0x90D6, 0xE3B5, 0x90D7, 0x90D8, /* 0x10 */
+ 0x90D9, 0x90DA, 0xD3DE, 0x90DB, 0x90DC, 0x90DD, 0x90DE, 0xB8D0, /* 0x10 */
+ 0xE3B3, 0x90DF, 0x90E0, 0xE3B6, 0xB7DF, 0x90E1, 0xE3B4, 0xC0A2, /* 0x20 */
+ 0x90E2, 0x90E3, 0x90E4, 0xE3BA, 0x90E5, 0x90E6, 0x90E7, 0x90E8, /* 0x20 */
+ 0x90E9, 0x90EA, 0x90EB, 0x90EC, 0x90ED, 0x90EE, 0x90EF, 0x90F0, /* 0x30 */
+ 0x90F1, 0x90F2, 0x90F3, 0x90F4, 0x90F5, 0x90F6, 0x90F7, 0xD4B8, /* 0x30 */
+ 0x90F8, 0x90F9, 0x90FA, 0x90FB, 0x90FC, 0x90FD, 0x90FE, 0x9140, /* 0x40 */
+ 0xB4C8, 0x9141, 0xE3BB, 0x9142, 0xBBC5, 0x9143, 0xC9F7, 0x9144, /* 0x40 */
+ 0x9145, 0xC9E5, 0x9146, 0x9147, 0x9148, 0xC4BD, 0x9149, 0x914A, /* 0x50 */
+ 0x914B, 0x914C, 0x914D, 0x914E, 0x914F, 0xEDAB, 0x9150, 0x9151, /* 0x50 */
+ 0x9152, 0x9153, 0xC2FD, 0x9154, 0x9155, 0x9156, 0x9157, 0xBBDB, /* 0x60 */
+ 0xBFAE, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E, /* 0x60 */
+ 0xCEBF, 0x915F, 0x9160, 0x9161, 0x9162, 0xE3BC, 0x9163, 0xBFB6, /* 0x70 */
+ 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B, /* 0x70 */
+ 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, 0x9173, /* 0x80 */
+ 0x9174, 0x9175, 0x9176, 0xB1EF, 0x9177, 0x9178, 0xD4F7, 0x9179, /* 0x80 */
+ 0x917A, 0x917B, 0x917C, 0x917D, 0xE3BE, 0x917E, 0x9180, 0x9181, /* 0x90 */
+ 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0xEDAD, 0x9187, 0x9188, /* 0x90 */
+ 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, 0x918E, 0x918F, 0xE3BF, /* 0xA0 */
+ 0xBAA9, 0xEDAC, 0x9190, 0x9191, 0xE3BD, 0x9192, 0x9193, 0x9194, /* 0xA0 */
+ 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0xE3C0, /* 0xB0 */
+ 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0xBAB6, 0x91A2, /* 0xB0 */
+ 0x91A3, 0x91A4, 0xB6AE, 0x91A5, 0x91A6, 0x91A7, 0x91A8, 0x91A9, /* 0xC0 */
+ 0xD0B8, 0x91AA, 0xB0C3, 0xEDAE, 0x91AB, 0x91AC, 0x91AD, 0x91AE, /* 0xC0 */
+ 0x91AF, 0xEDAF, 0xC0C1, 0x91B0, 0xE3C1, 0x91B1, 0x91B2, 0x91B3, /* 0xD0 */
+ 0x91B4, 0x91B5, 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB, /* 0xD0 */
+ 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0xC5B3, 0x91C2, /* 0xE0 */
+ 0x91C3, 0x91C4, 0x91C5, 0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, /* 0xE0 */
+ 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, 0xE3C2, 0x91D0, 0x91D1, /* 0xF0 */
+ 0x91D2, 0x91D3, 0x91D4, 0x91D5, 0x91D6, 0x91D7, 0x91D8, 0xDCB2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, 0xEDB0, 0x91DF, /* 0x00 */
+ 0xB8EA, 0x91E0, 0xCEEC, 0xEAA7, 0xD0E7, 0xCAF9, 0xC8D6, 0xCFB7, /* 0x00 */
+ 0xB3C9, 0xCED2, 0xBDE4, 0x91E1, 0x91E2, 0xE3DE, 0xBBF2, 0xEAA8, /* 0x10 */
+ 0xD5BD, 0x91E3, 0xC6DD, 0xEAA9, 0x91E4, 0x91E5, 0x91E6, 0xEAAA, /* 0x10 */
+ 0x91E7, 0xEAAC, 0xEAAB, 0x91E8, 0xEAAE, 0xEAAD, 0x91E9, 0x91EA, /* 0x20 */
+ 0x91EB, 0x91EC, 0xBDD8, 0x91ED, 0xEAAF, 0x91EE, 0xC2BE, 0x91EF, /* 0x20 */
+ 0x91F0, 0x91F1, 0x91F2, 0xB4C1, 0xB4F7, 0x91F3, 0x91F4, 0xBBA7, /* 0x30 */
+ 0x91F5, 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0xECE6, 0xECE5, 0xB7BF, /* 0x30 */
+ 0xCBF9, 0xB1E2, 0x91FA, 0xECE7, 0x91FB, 0x91FC, 0x91FD, 0xC9C8, /* 0x40 */
+ 0xECE8, 0xECE9, 0x91FE, 0xCAD6, 0xDED0, 0xB2C5, 0xD4FA, 0x9240, /* 0x40 */
+ 0x9241, 0xC6CB, 0xB0C7, 0xB4F2, 0xC8D3, 0x9242, 0x9243, 0x9244, /* 0x50 */
+ 0xCDD0, 0x9245, 0x9246, 0xBFB8, 0x9247, 0x9248, 0x9249, 0x924A, /* 0x50 */
+ 0x924B, 0x924C, 0x924D, 0xBFDB, 0x924E, 0x924F, 0xC7A4, 0xD6B4, /* 0x60 */
+ 0x9250, 0xC0A9, 0xDED1, 0xC9A8, 0xD1EF, 0xC5A4, 0xB0E7, 0xB3B6, /* 0x60 */
+ 0xC8C5, 0x9251, 0x9252, 0xB0E2, 0x9253, 0x9254, 0xB7F6, 0x9255, /* 0x70 */
+ 0x9256, 0xC5FA, 0x9257, 0x9258, 0xB6F3, 0x9259, 0xD5D2, 0xB3D0, /* 0x70 */
+ 0xBCBC, 0x925A, 0x925B, 0x925C, 0xB3AD, 0x925D, 0x925E, 0x925F, /* 0x80 */
+ 0x9260, 0xBEF1, 0xB0D1, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, /* 0x80 */
+ 0x9266, 0xD2D6, 0xCAE3, 0xD7A5, 0x9267, 0xCDB6, 0xB6B6, 0xBFB9, /* 0x90 */
+ 0xD5DB, 0x9268, 0xB8A7, 0xC5D7, 0x9269, 0x926A, 0x926B, 0xDED2, /* 0x90 */
+ 0xBFD9, 0xC2D5, 0xC7C0, 0x926C, 0xBBA4, 0xB1A8, 0x926D, 0x926E, /* 0xA0 */
+ 0xC5EA, 0x926F, 0x9270, 0xC5FB, 0xCCA7, 0x9271, 0x9272, 0x9273, /* 0xA0 */
+ 0x9274, 0xB1A7, 0x9275, 0x9276, 0x9277, 0xB5D6, 0x9278, 0x9279, /* 0xB0 */
+ 0x927A, 0xC4A8, 0x927B, 0xDED3, 0xD1BA, 0xB3E9, 0x927C, 0xC3F2, /* 0xB0 */
+ 0x927D, 0x927E, 0xB7F7, 0x9280, 0xD6F4, 0xB5A3, 0xB2F0, 0xC4B4, /* 0xC0 */
+ 0xC4E9, 0xC0AD, 0xDED4, 0x9281, 0xB0E8, 0xC5C4, 0xC1E0, 0x9282, /* 0xC0 */
+ 0xB9D5, 0x9283, 0xBEDC, 0xCDD8, 0xB0CE, 0x9284, 0xCDCF, 0xDED6, /* 0xD0 */
+ 0xBED0, 0xD7BE, 0xDED5, 0xD5D0, 0xB0DD, 0x9285, 0x9286, 0xC4E2, /* 0xD0 */
+ 0x9287, 0x9288, 0xC2A3, 0xBCF0, 0x9289, 0xD3B5, 0xC0B9, 0xC5A1, /* 0xE0 */
+ 0xB2A6, 0xD4F1, 0x928A, 0x928B, 0xC0A8, 0xCAC3, 0xDED7, 0xD5FC, /* 0xE0 */
+ 0x928C, 0xB9B0, 0x928D, 0xC8AD, 0xCBA9, 0x928E, 0xDED9, 0xBFBD, /* 0xF0 */
+ 0x928F, 0x9290, 0x9291, 0x9292, 0xC6B4, 0xD7A7, 0xCAB0, 0xC4C3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9293, 0xB3D6, 0xB9D2, 0x9294, 0x9295, 0x9296, 0x9297, 0xD6B8, /* 0x00 */
+ 0xEAFC, 0xB0B4, 0x9298, 0x9299, 0x929A, 0x929B, 0xBFE6, 0x929C, /* 0x00 */
+ 0x929D, 0xCCF4, 0x929E, 0x929F, 0x92A0, 0x92A1, 0xCDDA, 0x92A2, /* 0x10 */
+ 0x92A3, 0x92A4, 0xD6BF, 0xC2CE, 0x92A5, 0xCECE, 0xCCA2, 0xD0AE, /* 0x10 */
+ 0xC4D3, 0xB5B2, 0xDED8, 0xD5F5, 0xBCB7, 0xBBD3, 0x92A6, 0x92A7, /* 0x20 */
+ 0xB0A4, 0x92A8, 0xC5B2, 0xB4EC, 0x92A9, 0x92AA, 0x92AB, 0xD5F1, /* 0x20 */
+ 0x92AC, 0x92AD, 0xEAFD, 0x92AE, 0x92AF, 0x92B0, 0x92B1, 0x92B2, /* 0x30 */
+ 0x92B3, 0xDEDA, 0xCDA6, 0x92B4, 0x92B5, 0xCDEC, 0x92B6, 0x92B7, /* 0x30 */
+ 0x92B8, 0x92B9, 0xCEE6, 0xDEDC, 0x92BA, 0xCDB1, 0xC0A6, 0x92BB, /* 0x40 */
+ 0x92BC, 0xD7BD, 0x92BD, 0xDEDB, 0xB0C6, 0xBAB4, 0xC9D3, 0xC4F3, /* 0x40 */
+ 0xBEE8, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0xB2B6, 0x92C2, 0x92C3, /* 0x50 */
+ 0x92C4, 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0xC0CC, 0xCBF0, /* 0x50 */
+ 0x92CA, 0xBCF1, 0xBBBB, 0xB5B7, 0x92CB, 0x92CC, 0x92CD, 0xC5F5, /* 0x60 */
+ 0x92CE, 0xDEE6, 0x92CF, 0x92D0, 0x92D1, 0xDEE3, 0xBEDD, 0x92D2, /* 0x60 */
+ 0x92D3, 0xDEDF, 0x92D4, 0x92D5, 0x92D6, 0x92D7, 0xB4B7, 0xBDDD, /* 0x70 */
+ 0x92D8, 0x92D9, 0xDEE0, 0xC4ED, 0x92DA, 0x92DB, 0x92DC, 0x92DD, /* 0x70 */
+ 0xCFC6, 0x92DE, 0xB5E0, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0xB6DE, /* 0x80 */
+ 0xCADA, 0xB5F4, 0xDEE5, 0x92E3, 0xD5C6, 0x92E4, 0xDEE1, 0xCCCD, /* 0x80 */
+ 0xC6FE, 0x92E5, 0xC5C5, 0x92E6, 0x92E7, 0x92E8, 0xD2B4, 0x92E9, /* 0x90 */
+ 0xBEF2, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, /* 0x90 */
+ 0xC2D3, 0x92F1, 0xCCBD, 0xB3B8, 0x92F2, 0xBDD3, 0x92F3, 0xBFD8, /* 0xA0 */
+ 0xCDC6, 0xD1DA, 0xB4EB, 0x92F4, 0xDEE4, 0xDEDD, 0xDEE7, 0x92F5, /* 0xA0 */
+ 0xEAFE, 0x92F6, 0x92F7, 0xC2B0, 0xDEE2, 0x92F8, 0x92F9, 0xD6C0, /* 0xB0 */
+ 0xB5A7, 0x92FA, 0xB2F4, 0x92FB, 0xDEE8, 0x92FC, 0xDEF2, 0x92FD, /* 0xB0 */
+ 0x92FE, 0x9340, 0x9341, 0x9342, 0xDEED, 0x9343, 0xDEF1, 0x9344, /* 0xC0 */
+ 0x9345, 0xC8E0, 0x9346, 0x9347, 0x9348, 0xD7E1, 0xDEEF, 0xC3E8, /* 0xC0 */
+ 0xCCE1, 0x9349, 0xB2E5, 0x934A, 0x934B, 0x934C, 0xD2BE, 0x934D, /* 0xD0 */
+ 0x934E, 0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0xDEEE, 0x9354, /* 0xD0 */
+ 0xDEEB, 0xCED5, 0x9355, 0xB4A7, 0x9356, 0x9357, 0x9358, 0x9359, /* 0xE0 */
+ 0x935A, 0xBFAB, 0xBEBE, 0x935B, 0x935C, 0xBDD2, 0x935D, 0x935E, /* 0xE0 */
+ 0x935F, 0x9360, 0xDEE9, 0x9361, 0xD4AE, 0x9362, 0xDEDE, 0x9363, /* 0xF0 */
+ 0xDEEA, 0x9364, 0x9365, 0x9366, 0x9367, 0xC0BF, 0x9368, 0xDEEC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB2F3, 0xB8E9, 0xC2A7, 0x9369, 0x936A, 0xBDC1, 0x936B, 0x936C, /* 0x00 */
+ 0x936D, 0x936E, 0x936F, 0xDEF5, 0xDEF8, 0x9370, 0x9371, 0xB2AB, /* 0x00 */
+ 0xB4A4, 0x9372, 0x9373, 0xB4EA, 0xC9A6, 0x9374, 0x9375, 0x9376, /* 0x10 */
+ 0x9377, 0x9378, 0x9379, 0xDEF6, 0xCBD1, 0x937A, 0xB8E3, 0x937B, /* 0x10 */
+ 0xDEF7, 0xDEFA, 0x937C, 0x937D, 0x937E, 0x9380, 0xDEF9, 0x9381, /* 0x20 */
+ 0x9382, 0x9383, 0xCCC2, 0x9384, 0xB0E1, 0xB4EE, 0x9385, 0x9386, /* 0x20 */
+ 0x9387, 0x9388, 0x9389, 0x938A, 0xE5BA, 0x938B, 0x938C, 0x938D, /* 0x30 */
+ 0x938E, 0x938F, 0xD0AF, 0x9390, 0x9391, 0xB2EB, 0x9392, 0xEBA1, /* 0x30 */
+ 0x9393, 0xDEF4, 0x9394, 0x9395, 0xC9E3, 0xDEF3, 0xB0DA, 0xD2A1, /* 0x40 */
+ 0xB1F7, 0x9396, 0xCCAF, 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, /* 0x40 */
+ 0x939C, 0x939D, 0xDEF0, 0x939E, 0xCBA4, 0x939F, 0x93A0, 0x93A1, /* 0x50 */
+ 0xD5AA, 0x93A2, 0x93A3, 0x93A4, 0x93A5, 0x93A6, 0xDEFB, 0x93A7, /* 0x50 */
+ 0x93A8, 0x93A9, 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0xB4DD, /* 0x60 */
+ 0x93AF, 0xC4A6, 0x93B0, 0x93B1, 0x93B2, 0xDEFD, 0x93B3, 0x93B4, /* 0x60 */
+ 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9, 0x93BA, 0x93BB, 0x93BC, /* 0x70 */
+ 0xC3FE, 0xC4A1, 0xDFA1, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, /* 0x70 */
+ 0x93C2, 0x93C3, 0xC1CC, 0x93C4, 0xDEFC, 0xBEEF, 0x93C5, 0xC6B2, /* 0x80 */
+ 0x93C6, 0x93C7, 0x93C8, 0x93C9, 0x93CA, 0x93CB, 0x93CC, 0x93CD, /* 0x80 */
+ 0x93CE, 0xB3C5, 0xC8F6, 0x93CF, 0x93D0, 0xCBBA, 0xDEFE, 0x93D1, /* 0x90 */
+ 0x93D2, 0xDFA4, 0x93D3, 0x93D4, 0x93D5, 0x93D6, 0xD7B2, 0x93D7, /* 0x90 */
+ 0x93D8, 0x93D9, 0x93DA, 0x93DB, 0xB3B7, 0x93DC, 0x93DD, 0x93DE, /* 0xA0 */
+ 0x93DF, 0xC1C3, 0x93E0, 0x93E1, 0xC7CB, 0xB2A5, 0xB4E9, 0x93E2, /* 0xA0 */
+ 0xD7AB, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0xC4EC, 0x93E7, 0xDFA2, /* 0xB0 */
+ 0xDFA3, 0x93E8, 0xDFA5, 0x93E9, 0xBAB3, 0x93EA, 0x93EB, 0x93EC, /* 0xB0 */
+ 0xDFA6, 0x93ED, 0xC0DE, 0x93EE, 0x93EF, 0xC9C3, 0x93F0, 0x93F1, /* 0xC0 */
+ 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0xB2D9, 0xC7E6, 0x93F7, /* 0xC0 */
+ 0xDFA7, 0x93F8, 0xC7DC, 0x93F9, 0x93FA, 0x93FB, 0x93FC, 0xDFA8, /* 0xD0 */
+ 0xEBA2, 0x93FD, 0x93FE, 0x9440, 0x9441, 0x9442, 0xCBD3, 0x9443, /* 0xD0 */
+ 0x9444, 0x9445, 0xDFAA, 0x9446, 0xDFA9, 0x9447, 0xB2C1, 0x9448, /* 0xE0 */
+ 0x9449, 0x944A, 0x944B, 0x944C, 0x944D, 0x944E, 0x944F, 0x9450, /* 0xE0 */
+ 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, /* 0xF0 */
+ 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E, 0x945F, 0x9460 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC5CA, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, /* 0x00 */
+ 0x9468, 0xDFAB, 0x9469, 0x946A, 0x946B, 0x946C, 0x946D, 0x946E, /* 0x00 */
+ 0x946F, 0x9470, 0xD4DC, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, /* 0x10 */
+ 0xC8C1, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, /* 0x10 */
+ 0x947D, 0x947E, 0x9480, 0x9481, 0x9482, 0xDFAC, 0x9483, 0x9484, /* 0x20 */
+ 0x9485, 0x9486, 0x9487, 0xBEF0, 0x9488, 0x9489, 0xDFAD, 0xD6A7, /* 0x20 */
+ 0x948A, 0x948B, 0x948C, 0x948D, 0xEAB7, 0xEBB6, 0xCAD5, 0x948E, /* 0x30 */
+ 0xD8FC, 0xB8C4, 0x948F, 0xB9A5, 0x9490, 0x9491, 0xB7C5, 0xD5FE, /* 0x30 */
+ 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0xB9CA, 0x9497, 0x9498, /* 0x40 */
+ 0xD0A7, 0xF4CD, 0x9499, 0x949A, 0xB5D0, 0x949B, 0x949C, 0xC3F4, /* 0x40 */
+ 0x949D, 0xBEC8, 0x949E, 0x949F, 0x94A0, 0xEBB7, 0xB0BD, 0x94A1, /* 0x50 */
+ 0x94A2, 0xBDCC, 0x94A3, 0xC1B2, 0x94A4, 0xB1D6, 0xB3A8, 0x94A5, /* 0x50 */
+ 0x94A6, 0x94A7, 0xB8D2, 0xC9A2, 0x94A8, 0x94A9, 0xB6D8, 0x94AA, /* 0x60 */
+ 0x94AB, 0x94AC, 0x94AD, 0xEBB8, 0xBEB4, 0x94AE, 0x94AF, 0x94B0, /* 0x60 */
+ 0xCAFD, 0x94B1, 0xC7C3, 0x94B2, 0xD5FB, 0x94B3, 0x94B4, 0xB7F3, /* 0x70 */
+ 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, /* 0x70 */
+ 0x94BD, 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0xCEC4, /* 0x80 */
+ 0x94C4, 0x94C5, 0x94C6, 0xD5AB, 0xB1F3, 0x94C7, 0x94C8, 0x94C9, /* 0x80 */
+ 0xECB3, 0xB0DF, 0x94CA, 0xECB5, 0x94CB, 0x94CC, 0x94CD, 0xB6B7, /* 0x90 */
+ 0x94CE, 0xC1CF, 0x94CF, 0xF5FA, 0xD0B1, 0x94D0, 0x94D1, 0xD5E5, /* 0x90 */
+ 0x94D2, 0xCED3, 0x94D3, 0x94D4, 0xBDEF, 0xB3E2, 0x94D5, 0xB8AB, /* 0xA0 */
+ 0x94D6, 0xD5B6, 0x94D7, 0xEDBD, 0x94D8, 0xB6CF, 0x94D9, 0xCBB9, /* 0xA0 */
+ 0xD0C2, 0x94DA, 0x94DB, 0x94DC, 0x94DD, 0x94DE, 0x94DF, 0x94E0, /* 0xB0 */
+ 0x94E1, 0xB7BD, 0x94E2, 0x94E3, 0xECB6, 0xCAA9, 0x94E4, 0x94E5, /* 0xB0 */
+ 0x94E6, 0xC5D4, 0x94E7, 0xECB9, 0xECB8, 0xC2C3, 0xECB7, 0x94E8, /* 0xC0 */
+ 0x94E9, 0x94EA, 0x94EB, 0xD0FD, 0xECBA, 0x94EC, 0xECBB, 0xD7E5, /* 0xC0 */
+ 0x94ED, 0x94EE, 0xECBC, 0x94EF, 0x94F0, 0x94F1, 0xECBD, 0xC6EC, /* 0xD0 */
+ 0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x94F9, /* 0xD0 */
+ 0xCEDE, 0x94FA, 0xBCC8, 0x94FB, 0x94FC, 0xC8D5, 0xB5A9, 0xBEC9, /* 0xE0 */
+ 0xD6BC, 0xD4E7, 0x94FD, 0x94FE, 0xD1AE, 0xD0F1, 0xEAB8, 0xEAB9, /* 0xE0 */
+ 0xEABA, 0xBAB5, 0x9540, 0x9541, 0x9542, 0x9543, 0xCAB1, 0xBFF5, /* 0xF0 */
+ 0x9544, 0x9545, 0xCDFA, 0x9546, 0x9547, 0x9548, 0x9549, 0x954A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEAC0, 0x954B, 0xB0BA, 0xEABE, 0x954C, 0x954D, 0xC0A5, 0x954E, /* 0x00 */
+ 0x954F, 0x9550, 0xEABB, 0x9551, 0xB2FD, 0x9552, 0xC3F7, 0xBBE8, /* 0x00 */
+ 0x9553, 0x9554, 0x9555, 0xD2D7, 0xCEF4, 0xEABF, 0x9556, 0x9557, /* 0x10 */
+ 0x9558, 0xEABC, 0x9559, 0x955A, 0x955B, 0xEAC3, 0x955C, 0xD0C7, /* 0x10 */
+ 0xD3B3, 0x955D, 0x955E, 0x955F, 0x9560, 0xB4BA, 0x9561, 0xC3C1, /* 0x20 */
+ 0xD7F2, 0x9562, 0x9563, 0x9564, 0x9565, 0xD5D1, 0x9566, 0xCAC7, /* 0x20 */
+ 0x9567, 0xEAC5, 0x9568, 0x9569, 0xEAC4, 0xEAC7, 0xEAC6, 0x956A, /* 0x30 */
+ 0x956B, 0x956C, 0x956D, 0x956E, 0xD6E7, 0x956F, 0xCFD4, 0x9570, /* 0x30 */
+ 0x9571, 0xEACB, 0x9572, 0xBBCE, 0x9573, 0x9574, 0x9575, 0x9576, /* 0x40 */
+ 0x9577, 0x9578, 0x9579, 0xBDFA, 0xC9CE, 0x957A, 0x957B, 0xEACC, /* 0x40 */
+ 0x957C, 0x957D, 0xC9B9, 0xCFFE, 0xEACA, 0xD4CE, 0xEACD, 0xEACF, /* 0x50 */
+ 0x957E, 0x9580, 0xCDED, 0x9581, 0x9582, 0x9583, 0x9584, 0xEAC9, /* 0x50 */
+ 0x9585, 0xEACE, 0x9586, 0x9587, 0xCEEE, 0x9588, 0xBBDE, 0x9589, /* 0x60 */
+ 0xB3BF, 0x958A, 0x958B, 0x958C, 0x958D, 0x958E, 0xC6D5, 0xBEB0, /* 0x60 */
+ 0xCEFA, 0x958F, 0x9590, 0x9591, 0xC7E7, 0x9592, 0xBEA7, 0xEAD0, /* 0x70 */
+ 0x9593, 0x9594, 0xD6C7, 0x9595, 0x9596, 0x9597, 0xC1C0, 0x9598, /* 0x70 */
+ 0x9599, 0x959A, 0xD4DD, 0x959B, 0xEAD1, 0x959C, 0x959D, 0xCFBE, /* 0x80 */
+ 0x959E, 0x959F, 0x95A0, 0x95A1, 0xEAD2, 0x95A2, 0x95A3, 0x95A4, /* 0x80 */
+ 0x95A5, 0xCAEE, 0x95A6, 0x95A7, 0x95A8, 0x95A9, 0xC5AF, 0xB0B5, /* 0x90 */
+ 0x95AA, 0x95AB, 0x95AC, 0x95AD, 0x95AE, 0xEAD4, 0x95AF, 0x95B0, /* 0x90 */
+ 0x95B1, 0x95B2, 0x95B3, 0x95B4, 0x95B5, 0x95B6, 0x95B7, 0xEAD3, /* 0xA0 */
+ 0xF4DF, 0x95B8, 0x95B9, 0x95BA, 0x95BB, 0x95BC, 0xC4BA, 0x95BD, /* 0xA0 */
+ 0x95BE, 0x95BF, 0x95C0, 0x95C1, 0xB1A9, 0x95C2, 0x95C3, 0x95C4, /* 0xB0 */
+ 0x95C5, 0xE5DF, 0x95C6, 0x95C7, 0x95C8, 0x95C9, 0xEAD5, 0x95CA, /* 0xB0 */
+ 0x95CB, 0x95CC, 0x95CD, 0x95CE, 0x95CF, 0x95D0, 0x95D1, 0x95D2, /* 0xC0 */
+ 0x95D3, 0x95D4, 0x95D5, 0x95D6, 0x95D7, 0x95D8, 0x95D9, 0x95DA, /* 0xC0 */
+ 0x95DB, 0x95DC, 0x95DD, 0x95DE, 0x95DF, 0x95E0, 0x95E1, 0x95E2, /* 0xD0 */
+ 0x95E3, 0xCAEF, 0x95E4, 0xEAD6, 0xEAD7, 0xC6D8, 0x95E5, 0x95E6, /* 0xD0 */
+ 0x95E7, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0xEAD8, 0x95ED, /* 0xE0 */
+ 0x95EE, 0xEAD9, 0x95EF, 0x95F0, 0x95F1, 0x95F2, 0x95F3, 0x95F4, /* 0xE0 */
+ 0xD4BB, 0x95F5, 0xC7FA, 0xD2B7, 0xB8FC, 0x95F6, 0x95F7, 0xEAC2, /* 0xF0 */
+ 0x95F8, 0xB2DC, 0x95F9, 0x95FA, 0xC2FC, 0x95FB, 0xD4F8, 0xCCE6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7EE, 0x95FC, 0x95FD, 0x95FE, 0x9640, 0x9641, 0x9642, 0x9643, /* 0x00 */
+ 0xD4C2, 0xD3D0, 0xEBC3, 0xC5F3, 0x9644, 0xB7FE, 0x9645, 0x9646, /* 0x00 */
+ 0xEBD4, 0x9647, 0x9648, 0x9649, 0xCBB7, 0xEBDE, 0x964A, 0xC0CA, /* 0x10 */
+ 0x964B, 0x964C, 0x964D, 0xCDFB, 0x964E, 0xB3AF, 0x964F, 0xC6DA, /* 0x10 */
+ 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0xEBFC, 0x9656, /* 0x20 */
+ 0xC4BE, 0x9657, 0xCEB4, 0xC4A9, 0xB1BE, 0xD4FD, 0x9658, 0xCAF5, /* 0x20 */
+ 0x9659, 0xD6EC, 0x965A, 0x965B, 0xC6D3, 0xB6E4, 0x965C, 0x965D, /* 0x30 */
+ 0x965E, 0x965F, 0xBBFA, 0x9660, 0x9661, 0xD0E0, 0x9662, 0x9663, /* 0x30 */
+ 0xC9B1, 0x9664, 0xD4D3, 0xC8A8, 0x9665, 0x9666, 0xB8CB, 0x9667, /* 0x40 */
+ 0xE8BE, 0xC9BC, 0x9668, 0x9669, 0xE8BB, 0x966A, 0xC0EE, 0xD0D3, /* 0x40 */
+ 0xB2C4, 0xB4E5, 0x966B, 0xE8BC, 0x966C, 0x966D, 0xD5C8, 0x966E, /* 0x50 */
+ 0x966F, 0x9670, 0x9671, 0x9672, 0xB6C5, 0x9673, 0xE8BD, 0xCAF8, /* 0x50 */
+ 0xB8DC, 0xCCF5, 0x9674, 0x9675, 0x9676, 0xC0B4, 0x9677, 0x9678, /* 0x60 */
+ 0xD1EE, 0xE8BF, 0xE8C2, 0x9679, 0x967A, 0xBABC, 0x967B, 0xB1AD, /* 0x60 */
+ 0xBDDC, 0x967C, 0xEABD, 0xE8C3, 0x967D, 0xE8C6, 0x967E, 0xE8CB, /* 0x70 */
+ 0x9680, 0x9681, 0x9682, 0x9683, 0xE8CC, 0x9684, 0xCBC9, 0xB0E5, /* 0x70 */
+ 0x9685, 0xBCAB, 0x9686, 0x9687, 0xB9B9, 0x9688, 0x9689, 0xE8C1, /* 0x80 */
+ 0x968A, 0xCDF7, 0x968B, 0xE8CA, 0x968C, 0x968D, 0x968E, 0x968F, /* 0x80 */
+ 0xCEF6, 0x9690, 0x9691, 0x9692, 0x9693, 0xD5ED, 0x9694, 0xC1D6, /* 0x90 */
+ 0xE8C4, 0x9695, 0xC3B6, 0x9696, 0xB9FB, 0xD6A6, 0xE8C8, 0x9697, /* 0x90 */
+ 0x9698, 0x9699, 0xCAE0, 0xD4E6, 0x969A, 0xE8C0, 0x969B, 0xE8C5, /* 0xA0 */
+ 0xE8C7, 0x969C, 0xC7B9, 0xB7E3, 0x969D, 0xE8C9, 0x969E, 0xBFDD, /* 0xA0 */
+ 0xE8D2, 0x969F, 0x96A0, 0xE8D7, 0x96A1, 0xE8D5, 0xBCDC, 0xBCCF, /* 0xB0 */
+ 0xE8DB, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A7, 0x96A8, /* 0xB0 */
+ 0x96A9, 0xE8DE, 0x96AA, 0xE8DA, 0xB1FA, 0x96AB, 0x96AC, 0x96AD, /* 0xC0 */
+ 0x96AE, 0x96AF, 0x96B0, 0x96B1, 0x96B2, 0x96B3, 0x96B4, 0xB0D8, /* 0xC0 */
+ 0xC4B3, 0xB8CC, 0xC6E2, 0xC8BE, 0xC8E1, 0x96B5, 0x96B6, 0x96B7, /* 0xD0 */
+ 0xE8CF, 0xE8D4, 0xE8D6, 0x96B8, 0xB9F1, 0xE8D8, 0xD7F5, 0x96B9, /* 0xD0 */
+ 0xC4FB, 0x96BA, 0xE8DC, 0x96BB, 0x96BC, 0xB2E9, 0x96BD, 0x96BE, /* 0xE0 */
+ 0x96BF, 0xE8D1, 0x96C0, 0x96C1, 0xBCED, 0x96C2, 0x96C3, 0xBFC2, /* 0xE0 */
+ 0xE8CD, 0xD6F9, 0x96C4, 0xC1F8, 0xB2F1, 0x96C5, 0x96C6, 0x96C7, /* 0xF0 */
+ 0x96C8, 0x96C9, 0x96CA, 0x96CB, 0x96CC, 0xE8DF, 0x96CD, 0xCAC1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE8D9, 0x96CE, 0x96CF, 0x96D0, 0x96D1, 0xD5A4, 0x96D2, 0xB1EA, /* 0x00 */
+ 0xD5BB, 0xE8CE, 0xE8D0, 0xB6B0, 0xE8D3, 0x96D3, 0xE8DD, 0xC0B8, /* 0x00 */
+ 0x96D4, 0xCAF7, 0x96D5, 0xCBA8, 0x96D6, 0x96D7, 0xC6DC, 0xC0F5, /* 0x10 */
+ 0x96D8, 0x96D9, 0x96DA, 0x96DB, 0x96DC, 0xE8E9, 0x96DD, 0x96DE, /* 0x10 */
+ 0x96DF, 0xD0A3, 0x96E0, 0x96E1, 0x96E2, 0x96E3, 0x96E4, 0x96E5, /* 0x20 */
+ 0x96E6, 0xE8F2, 0xD6EA, 0x96E7, 0x96E8, 0x96E9, 0x96EA, 0x96EB, /* 0x20 */
+ 0x96EC, 0x96ED, 0xE8E0, 0xE8E1, 0x96EE, 0x96EF, 0x96F0, 0xD1F9, /* 0x30 */
+ 0xBACB, 0xB8F9, 0x96F1, 0x96F2, 0xB8F1, 0xD4D4, 0xE8EF, 0x96F3, /* 0x30 */
+ 0xE8EE, 0xE8EC, 0xB9F0, 0xCCD2, 0xE8E6, 0xCEA6, 0xBFF2, 0x96F4, /* 0x40 */
+ 0xB0B8, 0xE8F1, 0xE8F0, 0x96F5, 0xD7C0, 0x96F6, 0xE8E4, 0x96F7, /* 0x40 */
+ 0xCDA9, 0xC9A3, 0x96F8, 0xBBB8, 0xBDDB, 0xE8EA, 0x96F9, 0x96FA, /* 0x50 */
+ 0x96FB, 0x96FC, 0x96FD, 0x96FE, 0x9740, 0x9741, 0x9742, 0x9743, /* 0x50 */
+ 0xE8E2, 0xE8E3, 0xE8E5, 0xB5B5, 0xE8E7, 0xC7C5, 0xE8EB, 0xE8ED, /* 0x60 */
+ 0xBDB0, 0xD7AE, 0x9744, 0xE8F8, 0x9745, 0x9746, 0x9747, 0x9748, /* 0x60 */
+ 0x9749, 0x974A, 0x974B, 0x974C, 0xE8F5, 0x974D, 0xCDB0, 0xE8F6, /* 0x70 */
+ 0x974E, 0x974F, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, /* 0x70 */
+ 0x9756, 0xC1BA, 0x9757, 0xE8E8, 0x9758, 0xC3B7, 0xB0F0, 0x9759, /* 0x80 */
+ 0x975A, 0x975B, 0x975C, 0x975D, 0x975E, 0x975F, 0x9760, 0xE8F4, /* 0x80 */
+ 0x9761, 0x9762, 0x9763, 0xE8F7, 0x9764, 0x9765, 0x9766, 0xB9A3, /* 0x90 */
+ 0x9767, 0x9768, 0x9769, 0x976A, 0x976B, 0x976C, 0x976D, 0x976E, /* 0x90 */
+ 0x976F, 0x9770, 0xC9D2, 0x9771, 0x9772, 0x9773, 0xC3CE, 0xCEE0, /* 0xA0 */
+ 0xC0E6, 0x9774, 0x9775, 0x9776, 0x9777, 0xCBF3, 0x9778, 0xCCDD, /* 0xA0 */
+ 0xD0B5, 0x9779, 0x977A, 0xCAE1, 0x977B, 0xE8F3, 0x977C, 0x977D, /* 0xB0 */
+ 0x977E, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, /* 0xB0 */
+ 0xBCEC, 0x9787, 0xE8F9, 0x9788, 0x9789, 0x978A, 0x978B, 0x978C, /* 0xC0 */
+ 0x978D, 0xC3DE, 0x978E, 0xC6E5, 0x978F, 0xB9F7, 0x9790, 0x9791, /* 0xC0 */
+ 0x9792, 0x9793, 0xB0F4, 0x9794, 0x9795, 0xD7D8, 0x9796, 0x9797, /* 0xD0 */
+ 0xBCAC, 0x9798, 0xC5EF, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D, /* 0xD0 */
+ 0xCCC4, 0x979E, 0x979F, 0xE9A6, 0x97A0, 0x97A1, 0x97A2, 0x97A3, /* 0xE0 */
+ 0x97A4, 0x97A5, 0x97A6, 0x97A7, 0x97A8, 0x97A9, 0xC9AD, 0x97AA, /* 0xE0 */
+ 0xE9A2, 0xC0E2, 0x97AB, 0x97AC, 0x97AD, 0xBFC3, 0x97AE, 0x97AF, /* 0xF0 */
+ 0x97B0, 0xE8FE, 0xB9D7, 0x97B1, 0xE8FB, 0x97B2, 0x97B3, 0x97B4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x97B5, 0xE9A4, 0x97B6, 0x97B7, 0x97B8, 0xD2CE, 0x97B9, 0x97BA, /* 0x00 */
+ 0x97BB, 0x97BC, 0x97BD, 0xE9A3, 0x97BE, 0xD6B2, 0xD7B5, 0x97BF, /* 0x00 */
+ 0xE9A7, 0x97C0, 0xBDB7, 0x97C1, 0x97C2, 0x97C3, 0x97C4, 0x97C5, /* 0x10 */
+ 0x97C6, 0x97C7, 0x97C8, 0x97C9, 0x97CA, 0x97CB, 0x97CC, 0xE8FC, /* 0x10 */
+ 0xE8FD, 0x97CD, 0x97CE, 0x97CF, 0xE9A1, 0x97D0, 0x97D1, 0x97D2, /* 0x20 */
+ 0x97D3, 0x97D4, 0x97D5, 0x97D6, 0x97D7, 0xCDD6, 0x97D8, 0x97D9, /* 0x20 */
+ 0xD2AC, 0x97DA, 0x97DB, 0x97DC, 0xE9B2, 0x97DD, 0x97DE, 0x97DF, /* 0x30 */
+ 0x97E0, 0xE9A9, 0x97E1, 0x97E2, 0x97E3, 0xB4AA, 0x97E4, 0xB4BB, /* 0x30 */
+ 0x97E5, 0x97E6, 0xE9AB, 0x97E7, 0x97E8, 0x97E9, 0x97EA, 0x97EB, /* 0x40 */
+ 0x97EC, 0x97ED, 0x97EE, 0x97EF, 0x97F0, 0x97F1, 0x97F2, 0x97F3, /* 0x40 */
+ 0x97F4, 0x97F5, 0x97F6, 0x97F7, 0xD0A8, 0x97F8, 0x97F9, 0xE9A5, /* 0x50 */
+ 0x97FA, 0x97FB, 0xB3FE, 0x97FC, 0x97FD, 0xE9AC, 0xC0E3, 0x97FE, /* 0x50 */
+ 0xE9AA, 0x9840, 0x9841, 0xE9B9, 0x9842, 0x9843, 0xE9B8, 0x9844, /* 0x60 */
+ 0x9845, 0x9846, 0x9847, 0xE9AE, 0x9848, 0x9849, 0xE8FA, 0x984A, /* 0x60 */
+ 0x984B, 0xE9A8, 0x984C, 0x984D, 0x984E, 0x984F, 0x9850, 0xBFAC, /* 0x70 */
+ 0xE9B1, 0xE9BA, 0x9851, 0x9852, 0xC2A5, 0x9853, 0x9854, 0x9855, /* 0x70 */
+ 0xE9AF, 0x9856, 0xB8C5, 0x9857, 0xE9AD, 0x9858, 0xD3DC, 0xE9B4, /* 0x80 */
+ 0xE9B5, 0xE9B7, 0x9859, 0x985A, 0x985B, 0xE9C7, 0x985C, 0x985D, /* 0x80 */
+ 0x985E, 0x985F, 0x9860, 0x9861, 0xC0C6, 0xE9C5, 0x9862, 0x9863, /* 0x90 */
+ 0xE9B0, 0x9864, 0x9865, 0xE9BB, 0xB0F1, 0x9866, 0x9867, 0x9868, /* 0x90 */
+ 0x9869, 0x986A, 0x986B, 0x986C, 0x986D, 0x986E, 0x986F, 0xE9BC, /* 0xA0 */
+ 0xD5A5, 0x9870, 0x9871, 0xE9BE, 0x9872, 0xE9BF, 0x9873, 0x9874, /* 0xA0 */
+ 0x9875, 0xE9C1, 0x9876, 0x9877, 0xC1F1, 0x9878, 0x9879, 0xC8B6, /* 0xB0 */
+ 0x987A, 0x987B, 0x987C, 0xE9BD, 0x987D, 0x987E, 0x9880, 0x9881, /* 0xB0 */
+ 0x9882, 0xE9C2, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888, /* 0xC0 */
+ 0x9889, 0x988A, 0xE9C3, 0x988B, 0xE9B3, 0x988C, 0xE9B6, 0x988D, /* 0xC0 */
+ 0xBBB1, 0x988E, 0x988F, 0x9890, 0xE9C0, 0x9891, 0x9892, 0x9893, /* 0xD0 */
+ 0x9894, 0x9895, 0x9896, 0xBCF7, 0x9897, 0x9898, 0x9899, 0xE9C4, /* 0xD0 */
+ 0xE9C6, 0x989A, 0x989B, 0x989C, 0x989D, 0x989E, 0x989F, 0x98A0, /* 0xE0 */
+ 0x98A1, 0x98A2, 0x98A3, 0x98A4, 0x98A5, 0xE9CA, 0x98A6, 0x98A7, /* 0xE0 */
+ 0x98A8, 0x98A9, 0xE9CE, 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98AE, /* 0xF0 */
+ 0x98AF, 0x98B0, 0x98B1, 0x98B2, 0x98B3, 0xB2DB, 0x98B4, 0xE9C8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x98B5, 0x98B6, 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BC, /* 0x00 */
+ 0x98BD, 0x98BE, 0xB7AE, 0x98BF, 0x98C0, 0x98C1, 0x98C2, 0x98C3, /* 0x00 */
+ 0x98C4, 0x98C5, 0x98C6, 0x98C7, 0x98C8, 0x98C9, 0x98CA, 0xE9CB, /* 0x10 */
+ 0xE9CC, 0x98CB, 0x98CC, 0x98CD, 0x98CE, 0x98CF, 0x98D0, 0xD5C1, /* 0x10 */
+ 0x98D1, 0xC4A3, 0x98D2, 0x98D3, 0x98D4, 0x98D5, 0x98D6, 0x98D7, /* 0x20 */
+ 0xE9D8, 0x98D8, 0xBAE1, 0x98D9, 0x98DA, 0x98DB, 0x98DC, 0xE9C9, /* 0x20 */
+ 0x98DD, 0xD3A3, 0x98DE, 0x98DF, 0x98E0, 0xE9D4, 0x98E1, 0x98E2, /* 0x30 */
+ 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98E7, 0xE9D7, 0xE9D0, 0x98E8, /* 0x30 */
+ 0x98E9, 0x98EA, 0x98EB, 0x98EC, 0xE9CF, 0x98ED, 0x98EE, 0xC7C1, /* 0x40 */
+ 0x98EF, 0x98F0, 0x98F1, 0x98F2, 0x98F3, 0x98F4, 0x98F5, 0x98F6, /* 0x40 */
+ 0xE9D2, 0x98F7, 0x98F8, 0x98F9, 0x98FA, 0x98FB, 0x98FC, 0x98FD, /* 0x50 */
+ 0xE9D9, 0xB3C8, 0x98FE, 0xE9D3, 0x9940, 0x9941, 0x9942, 0x9943, /* 0x50 */
+ 0x9944, 0xCFF0, 0x9945, 0x9946, 0x9947, 0xE9CD, 0x9948, 0x9949, /* 0x60 */
+ 0x994A, 0x994B, 0x994C, 0x994D, 0x994E, 0x994F, 0x9950, 0x9951, /* 0x60 */
+ 0x9952, 0xB3F7, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, /* 0x70 */
+ 0x9959, 0xE9D6, 0x995A, 0x995B, 0xE9DA, 0x995C, 0x995D, 0x995E, /* 0x70 */
+ 0xCCB4, 0x995F, 0x9960, 0x9961, 0xCFAD, 0x9962, 0x9963, 0x9964, /* 0x80 */
+ 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996A, 0xE9D5, 0x996B, /* 0x80 */
+ 0xE9DC, 0xE9DB, 0x996C, 0x996D, 0x996E, 0x996F, 0x9970, 0xE9DE, /* 0x90 */
+ 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, /* 0x90 */
+ 0xE9D1, 0x9979, 0x997A, 0x997B, 0x997C, 0x997D, 0x997E, 0x9980, /* 0xA0 */
+ 0x9981, 0xE9DD, 0x9982, 0xE9DF, 0xC3CA, 0x9983, 0x9984, 0x9985, /* 0xA0 */
+ 0x9986, 0x9987, 0x9988, 0x9989, 0x998A, 0x998B, 0x998C, 0x998D, /* 0xB0 */
+ 0x998E, 0x998F, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, /* 0xB0 */
+ 0x9996, 0x9997, 0x9998, 0x9999, 0x999A, 0x999B, 0x999C, 0x999D, /* 0xC0 */
+ 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2, 0x99A3, 0x99A4, 0x99A5, /* 0xC0 */
+ 0x99A6, 0x99A7, 0x99A8, 0x99A9, 0x99AA, 0x99AB, 0x99AC, 0x99AD, /* 0xD0 */
+ 0x99AE, 0x99AF, 0x99B0, 0x99B1, 0x99B2, 0x99B3, 0x99B4, 0x99B5, /* 0xD0 */
+ 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA, 0x99BB, 0x99BC, 0x99BD, /* 0xE0 */
+ 0x99BE, 0x99BF, 0x99C0, 0x99C1, 0x99C2, 0x99C3, 0x99C4, 0x99C5, /* 0xE0 */
+ 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB, 0x99CC, 0x99CD, /* 0xF0 */
+ 0x99CE, 0x99CF, 0x99D0, 0x99D1, 0x99D2, 0x99D3, 0x99D4, 0x99D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x99D6, 0x99D7, 0x99D8, 0x99D9, 0x99DA, 0x99DB, 0x99DC, 0x99DD, /* 0x00 */
+ 0x99DE, 0x99DF, 0x99E0, 0x99E1, 0x99E2, 0x99E3, 0x99E4, 0x99E5, /* 0x00 */
+ 0x99E6, 0x99E7, 0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99ED, /* 0x10 */
+ 0x99EE, 0x99EF, 0x99F0, 0x99F1, 0x99F2, 0x99F3, 0x99F4, 0x99F5, /* 0x10 */
+ 0xC7B7, 0xB4CE, 0xBBB6, 0xD0C0, 0xECA3, 0x99F6, 0x99F7, 0xC5B7, /* 0x20 */
+ 0x99F8, 0x99F9, 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x9A40, /* 0x20 */
+ 0x9A41, 0x9A42, 0xD3FB, 0x9A43, 0x9A44, 0x9A45, 0x9A46, 0xECA4, /* 0x30 */
+ 0x9A47, 0xECA5, 0xC6DB, 0x9A48, 0x9A49, 0x9A4A, 0xBFEE, 0x9A4B, /* 0x30 */
+ 0x9A4C, 0x9A4D, 0x9A4E, 0xECA6, 0x9A4F, 0x9A50, 0xECA7, 0xD0AA, /* 0x40 */
+ 0x9A51, 0xC7B8, 0x9A52, 0x9A53, 0xB8E8, 0x9A54, 0x9A55, 0x9A56, /* 0x40 */
+ 0x9A57, 0x9A58, 0x9A59, 0x9A5A, 0x9A5B, 0x9A5C, 0x9A5D, 0x9A5E, /* 0x50 */
+ 0x9A5F, 0xECA8, 0x9A60, 0x9A61, 0x9A62, 0x9A63, 0x9A64, 0x9A65, /* 0x50 */
+ 0x9A66, 0x9A67, 0xD6B9, 0xD5FD, 0xB4CB, 0xB2BD, 0xCEE4, 0xC6E7, /* 0x60 */
+ 0x9A68, 0x9A69, 0xCDE1, 0x9A6A, 0x9A6B, 0x9A6C, 0x9A6D, 0x9A6E, /* 0x60 */
+ 0x9A6F, 0x9A70, 0x9A71, 0x9A72, 0x9A73, 0x9A74, 0x9A75, 0x9A76, /* 0x70 */
+ 0x9A77, 0xB4F5, 0x9A78, 0xCBC0, 0xBCDF, 0x9A79, 0x9A7A, 0x9A7B, /* 0x70 */
+ 0x9A7C, 0xE9E2, 0xE9E3, 0xD1EA, 0xE9E5, 0x9A7D, 0xB4F9, 0xE9E4, /* 0x80 */
+ 0x9A7E, 0xD1B3, 0xCAE2, 0xB2D0, 0x9A80, 0xE9E8, 0x9A81, 0x9A82, /* 0x80 */
+ 0x9A83, 0x9A84, 0xE9E6, 0xE9E7, 0x9A85, 0x9A86, 0xD6B3, 0x9A87, /* 0x90 */
+ 0x9A88, 0x9A89, 0xE9E9, 0xE9EA, 0x9A8A, 0x9A8B, 0x9A8C, 0x9A8D, /* 0x90 */
+ 0x9A8E, 0xE9EB, 0x9A8F, 0x9A90, 0x9A91, 0x9A92, 0x9A93, 0x9A94, /* 0xA0 */
+ 0x9A95, 0x9A96, 0xE9EC, 0x9A97, 0x9A98, 0x9A99, 0x9A9A, 0x9A9B, /* 0xA0 */
+ 0x9A9C, 0x9A9D, 0x9A9E, 0xECAF, 0xC5B9, 0xB6CE, 0x9A9F, 0xD2F3, /* 0xB0 */
+ 0x9AA0, 0x9AA1, 0x9AA2, 0x9AA3, 0x9AA4, 0x9AA5, 0x9AA6, 0xB5EE, /* 0xB0 */
+ 0x9AA7, 0xBBD9, 0xECB1, 0x9AA8, 0x9AA9, 0xD2E3, 0x9AAA, 0x9AAB, /* 0xC0 */
+ 0x9AAC, 0x9AAD, 0x9AAE, 0xCEE3, 0x9AAF, 0xC4B8, 0x9AB0, 0xC3BF, /* 0xC0 */
+ 0x9AB1, 0x9AB2, 0xB6BE, 0xD8B9, 0xB1C8, 0xB1CF, 0xB1D1, 0xC5FE, /* 0xD0 */
+ 0x9AB3, 0xB1D0, 0x9AB4, 0xC3AB, 0x9AB5, 0x9AB6, 0x9AB7, 0x9AB8, /* 0xD0 */
+ 0x9AB9, 0xD5B1, 0x9ABA, 0x9ABB, 0x9ABC, 0x9ABD, 0x9ABE, 0x9ABF, /* 0xE0 */
+ 0x9AC0, 0x9AC1, 0xEBA4, 0xBAC1, 0x9AC2, 0x9AC3, 0x9AC4, 0xCCBA, /* 0xE0 */
+ 0x9AC5, 0x9AC6, 0x9AC7, 0xEBA5, 0x9AC8, 0xEBA7, 0x9AC9, 0x9ACA, /* 0xF0 */
+ 0x9ACB, 0xEBA8, 0x9ACC, 0x9ACD, 0x9ACE, 0xEBA6, 0x9ACF, 0x9AD0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9AD1, 0x9AD2, 0x9AD3, 0x9AD4, 0x9AD5, 0xEBA9, 0xEBAB, 0xEBAA, /* 0x00 */
+ 0x9AD6, 0x9AD7, 0x9AD8, 0x9AD9, 0x9ADA, 0xEBAC, 0x9ADB, 0xCACF, /* 0x00 */
+ 0xD8B5, 0xC3F1, 0x9ADC, 0xC3A5, 0xC6F8, 0xEBAD, 0xC4CA, 0x9ADD, /* 0x10 */
+ 0xEBAE, 0xEBAF, 0xEBB0, 0xB7D5, 0x9ADE, 0x9ADF, 0x9AE0, 0xB7FA, /* 0x10 */
+ 0x9AE1, 0xEBB1, 0xC7E2, 0x9AE2, 0xEBB3, 0x9AE3, 0xBAA4, 0xD1F5, /* 0x20 */
+ 0xB0B1, 0xEBB2, 0xEBB4, 0x9AE4, 0x9AE5, 0x9AE6, 0xB5AA, 0xC2C8, /* 0x20 */
+ 0xC7E8, 0x9AE7, 0xEBB5, 0x9AE8, 0xCBAE, 0xE3DF, 0x9AE9, 0x9AEA, /* 0x30 */
+ 0xD3C0, 0x9AEB, 0x9AEC, 0x9AED, 0x9AEE, 0xD9DB, 0x9AEF, 0x9AF0, /* 0x30 */
+ 0xCDA1, 0xD6AD, 0xC7F3, 0x9AF1, 0x9AF2, 0x9AF3, 0xD9E0, 0xBBE3, /* 0x40 */
+ 0x9AF4, 0xBABA, 0xE3E2, 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AF9, /* 0x40 */
+ 0xCFAB, 0x9AFA, 0x9AFB, 0x9AFC, 0xE3E0, 0xC9C7, 0x9AFD, 0xBAB9, /* 0x50 */
+ 0x9AFE, 0x9B40, 0x9B41, 0xD1B4, 0xE3E1, 0xC8EA, 0xB9AF, 0xBDAD, /* 0x50 */
+ 0xB3D8, 0xCEDB, 0x9B42, 0x9B43, 0xCCC0, 0x9B44, 0x9B45, 0x9B46, /* 0x60 */
+ 0xE3E8, 0xE3E9, 0xCDF4, 0x9B47, 0x9B48, 0x9B49, 0x9B4A, 0x9B4B, /* 0x60 */
+ 0xCCAD, 0x9B4C, 0xBCB3, 0x9B4D, 0xE3EA, 0x9B4E, 0xE3EB, 0x9B4F, /* 0x70 */
+ 0x9B50, 0xD0DA, 0x9B51, 0x9B52, 0x9B53, 0xC6FB, 0xB7DA, 0x9B54, /* 0x70 */
+ 0x9B55, 0xC7DF, 0xD2CA, 0xCED6, 0x9B56, 0xE3E4, 0xE3EC, 0x9B57, /* 0x80 */
+ 0xC9F2, 0xB3C1, 0x9B58, 0x9B59, 0xE3E7, 0x9B5A, 0x9B5B, 0xC6E3, /* 0x80 */
+ 0xE3E5, 0x9B5C, 0x9B5D, 0xEDB3, 0xE3E6, 0x9B5E, 0x9B5F, 0x9B60, /* 0x90 */
+ 0x9B61, 0xC9B3, 0x9B62, 0xC5E6, 0x9B63, 0x9B64, 0x9B65, 0xB9B5, /* 0x90 */
+ 0x9B66, 0xC3BB, 0x9B67, 0xE3E3, 0xC5BD, 0xC1A4, 0xC2D9, 0xB2D7, /* 0xA0 */
+ 0x9B68, 0xE3ED, 0xBBA6, 0xC4AD, 0x9B69, 0xE3F0, 0xBEDA, 0x9B6A, /* 0xA0 */
+ 0x9B6B, 0xE3FB, 0xE3F5, 0xBAD3, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B6F, /* 0xB0 */
+ 0xB7D0, 0xD3CD, 0x9B70, 0xD6CE, 0xD5D3, 0xB9C1, 0xD5B4, 0xD1D8, /* 0xB0 */
+ 0x9B71, 0x9B72, 0x9B73, 0x9B74, 0xD0B9, 0xC7F6, 0x9B75, 0x9B76, /* 0xC0 */
+ 0x9B77, 0xC8AA, 0xB2B4, 0x9B78, 0xC3DA, 0x9B79, 0x9B7A, 0x9B7B, /* 0xC0 */
+ 0xE3EE, 0x9B7C, 0x9B7D, 0xE3FC, 0xE3EF, 0xB7A8, 0xE3F7, 0xE3F4, /* 0xD0 */
+ 0x9B7E, 0x9B80, 0x9B81, 0xB7BA, 0x9B82, 0x9B83, 0xC5A2, 0x9B84, /* 0xD0 */
+ 0xE3F6, 0xC5DD, 0xB2A8, 0xC6FC, 0x9B85, 0xC4E0, 0x9B86, 0x9B87, /* 0xE0 */
+ 0xD7A2, 0x9B88, 0xC0E1, 0xE3F9, 0x9B89, 0x9B8A, 0xE3FA, 0xE3FD, /* 0xE0 */
+ 0xCCA9, 0xE3F3, 0x9B8B, 0xD3BE, 0x9B8C, 0xB1C3, 0xEDB4, 0xE3F1, /* 0xF0 */
+ 0xE3F2, 0x9B8D, 0xE3F8, 0xD0BA, 0xC6C3, 0xD4F3, 0xE3FE, 0x9B8E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9B8F, 0xBDE0, 0x9B90, 0x9B91, 0xE4A7, 0x9B92, 0x9B93, 0xE4A6, /* 0x00 */
+ 0x9B94, 0x9B95, 0x9B96, 0xD1F3, 0xE4A3, 0x9B97, 0xE4A9, 0x9B98, /* 0x00 */
+ 0x9B99, 0x9B9A, 0xC8F7, 0x9B9B, 0x9B9C, 0x9B9D, 0x9B9E, 0xCFB4, /* 0x10 */
+ 0x9B9F, 0xE4A8, 0xE4AE, 0xC2E5, 0x9BA0, 0x9BA1, 0xB6B4, 0x9BA2, /* 0x10 */
+ 0x9BA3, 0x9BA4, 0x9BA5, 0x9BA6, 0x9BA7, 0xBDF2, 0x9BA8, 0xE4A2, /* 0x20 */
+ 0x9BA9, 0x9BAA, 0xBAE9, 0xE4AA, 0x9BAB, 0x9BAC, 0xE4AC, 0x9BAD, /* 0x20 */
+ 0x9BAE, 0xB6FD, 0xD6DE, 0xE4B2, 0x9BAF, 0xE4AD, 0x9BB0, 0x9BB1, /* 0x30 */
+ 0x9BB2, 0xE4A1, 0x9BB3, 0xBBEE, 0xCDDD, 0xC7A2, 0xC5C9, 0x9BB4, /* 0x30 */
+ 0x9BB5, 0xC1F7, 0x9BB6, 0xE4A4, 0x9BB7, 0xC7B3, 0xBDAC, 0xBDBD, /* 0x40 */
+ 0xE4A5, 0x9BB8, 0xD7C7, 0xB2E2, 0x9BB9, 0xE4AB, 0xBCC3, 0xE4AF, /* 0x40 */
+ 0x9BBA, 0xBBEB, 0xE4B0, 0xC5A8, 0xE4B1, 0x9BBB, 0x9BBC, 0x9BBD, /* 0x50 */
+ 0x9BBE, 0xD5E3, 0xBFA3, 0x9BBF, 0xE4BA, 0x9BC0, 0xE4B7, 0x9BC1, /* 0x50 */
+ 0xE4BB, 0x9BC2, 0x9BC3, 0xE4BD, 0x9BC4, 0x9BC5, 0xC6D6, 0x9BC6, /* 0x60 */
+ 0x9BC7, 0xBAC6, 0xC0CB, 0x9BC8, 0x9BC9, 0x9BCA, 0xB8A1, 0xE4B4, /* 0x60 */
+ 0x9BCB, 0x9BCC, 0x9BCD, 0x9BCE, 0xD4A1, 0x9BCF, 0x9BD0, 0xBAA3, /* 0x70 */
+ 0xBDFE, 0x9BD1, 0x9BD2, 0x9BD3, 0xE4BC, 0x9BD4, 0x9BD5, 0x9BD6, /* 0x70 */
+ 0x9BD7, 0x9BD8, 0xCDBF, 0x9BD9, 0x9BDA, 0xC4F9, 0x9BDB, 0x9BDC, /* 0x80 */
+ 0xCFFB, 0xC9E6, 0x9BDD, 0x9BDE, 0xD3BF, 0x9BDF, 0xCFD1, 0x9BE0, /* 0x80 */
+ 0x9BE1, 0xE4B3, 0x9BE2, 0xE4B8, 0xE4B9, 0xCCE9, 0x9BE3, 0x9BE4, /* 0x90 */
+ 0x9BE5, 0x9BE6, 0x9BE7, 0xCCCE, 0x9BE8, 0xC0D4, 0xE4B5, 0xC1B0, /* 0x90 */
+ 0xE4B6, 0xCED0, 0x9BE9, 0xBBC1, 0xB5D3, 0x9BEA, 0xC8F3, 0xBDA7, /* 0xA0 */
+ 0xD5C7, 0xC9AC, 0xB8A2, 0xE4CA, 0x9BEB, 0x9BEC, 0xE4CC, 0xD1C4, /* 0xA0 */
+ 0x9BED, 0x9BEE, 0xD2BA, 0x9BEF, 0x9BF0, 0xBAAD, 0x9BF1, 0x9BF2, /* 0xB0 */
+ 0xBAD4, 0x9BF3, 0x9BF4, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0xE4C3, /* 0xB0 */
+ 0xB5ED, 0x9BF9, 0x9BFA, 0x9BFB, 0xD7CD, 0xE4C0, 0xCFFD, 0xE4BF, /* 0xC0 */
+ 0x9BFC, 0x9BFD, 0x9BFE, 0xC1DC, 0xCCCA, 0x9C40, 0x9C41, 0x9C42, /* 0xC0 */
+ 0x9C43, 0xCAE7, 0x9C44, 0x9C45, 0x9C46, 0x9C47, 0xC4D7, 0x9C48, /* 0xD0 */
+ 0xCCD4, 0xE4C8, 0x9C49, 0x9C4A, 0x9C4B, 0xE4C7, 0xE4C1, 0x9C4C, /* 0xD0 */
+ 0xE4C4, 0xB5AD, 0x9C4D, 0x9C4E, 0xD3D9, 0x9C4F, 0xE4C6, 0x9C50, /* 0xE0 */
+ 0x9C51, 0x9C52, 0x9C53, 0xD2F9, 0xB4E3, 0x9C54, 0xBBB4, 0x9C55, /* 0xE0 */
+ 0x9C56, 0xC9EE, 0x9C57, 0xB4BE, 0x9C58, 0x9C59, 0x9C5A, 0xBBEC, /* 0xF0 */
+ 0x9C5B, 0xD1CD, 0x9C5C, 0xCCED, 0xEDB5, 0x9C5D, 0x9C5E, 0x9C5F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9C60, 0x9C61, 0x9C62, 0x9C63, 0x9C64, 0xC7E5, 0x9C65, 0x9C66, /* 0x00 */
+ 0x9C67, 0x9C68, 0xD4A8, 0x9C69, 0xE4CB, 0xD7D5, 0xE4C2, 0x9C6A, /* 0x00 */
+ 0xBDA5, 0xE4C5, 0x9C6B, 0x9C6C, 0xD3E6, 0x9C6D, 0xE4C9, 0xC9F8, /* 0x10 */
+ 0x9C6E, 0x9C6F, 0xE4BE, 0x9C70, 0x9C71, 0xD3E5, 0x9C72, 0x9C73, /* 0x10 */
+ 0xC7FE, 0xB6C9, 0x9C74, 0xD4FC, 0xB2B3, 0xE4D7, 0x9C75, 0x9C76, /* 0x20 */
+ 0x9C77, 0xCEC2, 0x9C78, 0xE4CD, 0x9C79, 0xCEBC, 0x9C7A, 0xB8DB, /* 0x20 */
+ 0x9C7B, 0x9C7C, 0xE4D6, 0x9C7D, 0xBFCA, 0x9C7E, 0x9C80, 0x9C81, /* 0x30 */
+ 0xD3CE, 0x9C82, 0xC3EC, 0x9C83, 0x9C84, 0x9C85, 0x9C86, 0x9C87, /* 0x30 */
+ 0x9C88, 0x9C89, 0x9C8A, 0xC5C8, 0xE4D8, 0x9C8B, 0x9C8C, 0x9C8D, /* 0x40 */
+ 0x9C8E, 0x9C8F, 0x9C90, 0x9C91, 0x9C92, 0xCDC4, 0xE4CF, 0x9C93, /* 0x40 */
+ 0x9C94, 0x9C95, 0x9C96, 0xE4D4, 0xE4D5, 0x9C97, 0xBAFE, 0x9C98, /* 0x50 */
+ 0xCFE6, 0x9C99, 0x9C9A, 0xD5BF, 0x9C9B, 0x9C9C, 0x9C9D, 0xE4D2, /* 0x50 */
+ 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA4, 0x9CA5, /* 0x60 */
+ 0x9CA6, 0x9CA7, 0x9CA8, 0xE4D0, 0x9CA9, 0x9CAA, 0xE4CE, 0x9CAB, /* 0x60 */
+ 0x9CAC, 0x9CAD, 0x9CAE, 0x9CAF, 0x9CB0, 0x9CB1, 0x9CB2, 0x9CB3, /* 0x70 */
+ 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CB8, 0x9CB9, 0xCDE5, 0xCAAA, /* 0x70 */
+ 0x9CBA, 0x9CBB, 0x9CBC, 0xC0A3, 0x9CBD, 0xBDA6, 0xE4D3, 0x9CBE, /* 0x80 */
+ 0x9CBF, 0xB8C8, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC3, 0x9CC4, 0xE4E7, /* 0x80 */
+ 0xD4B4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CC8, 0x9CC9, 0x9CCA, 0x9CCB, /* 0x90 */
+ 0xE4DB, 0x9CCC, 0x9CCD, 0x9CCE, 0xC1EF, 0x9CCF, 0x9CD0, 0xE4E9, /* 0x90 */
+ 0x9CD1, 0x9CD2, 0xD2E7, 0x9CD3, 0x9CD4, 0xE4DF, 0x9CD5, 0xE4E0, /* 0xA0 */
+ 0x9CD6, 0x9CD7, 0xCFAA, 0x9CD8, 0x9CD9, 0x9CDA, 0x9CDB, 0xCBDD, /* 0xA0 */
+ 0x9CDC, 0xE4DA, 0xE4D1, 0x9CDD, 0xE4E5, 0x9CDE, 0xC8DC, 0xE4E3, /* 0xB0 */
+ 0x9CDF, 0x9CE0, 0xC4E7, 0xE4E2, 0x9CE1, 0xE4E1, 0x9CE2, 0x9CE3, /* 0xB0 */
+ 0x9CE4, 0xB3FC, 0xE4E8, 0x9CE5, 0x9CE6, 0x9CE7, 0x9CE8, 0xB5E1, /* 0xC0 */
+ 0x9CE9, 0x9CEA, 0x9CEB, 0xD7CC, 0x9CEC, 0x9CED, 0x9CEE, 0xE4E6, /* 0xC0 */
+ 0x9CEF, 0xBBAC, 0x9CF0, 0xD7D2, 0xCCCF, 0xEBF8, 0x9CF1, 0xE4E4, /* 0xD0 */
+ 0x9CF2, 0x9CF3, 0xB9F6, 0x9CF4, 0x9CF5, 0x9CF6, 0xD6CD, 0xE4D9, /* 0xD0 */
+ 0xE4DC, 0xC2FA, 0xE4DE, 0x9CF7, 0xC2CB, 0xC0C4, 0xC2D0, 0x9CF8, /* 0xE0 */
+ 0xB1F5, 0xCCB2, 0x9CF9, 0x9CFA, 0x9CFB, 0x9CFC, 0x9CFD, 0x9CFE, /* 0xE0 */
+ 0x9D40, 0x9D41, 0x9D42, 0x9D43, 0xB5CE, 0x9D44, 0x9D45, 0x9D46, /* 0xF0 */
+ 0x9D47, 0xE4EF, 0x9D48, 0x9D49, 0x9D4A, 0x9D4B, 0x9D4C, 0x9D4D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9D4E, 0x9D4F, 0xC6AF, 0x9D50, 0x9D51, 0x9D52, 0xC6E1, 0x9D53, /* 0x00 */
+ 0x9D54, 0xE4F5, 0x9D55, 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0xC2A9, /* 0x00 */
+ 0x9D5A, 0x9D5B, 0x9D5C, 0xC0EC, 0xD1DD, 0xE4EE, 0x9D5D, 0x9D5E, /* 0x10 */
+ 0x9D5F, 0x9D60, 0x9D61, 0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66, /* 0x10 */
+ 0xC4AE, 0x9D67, 0x9D68, 0x9D69, 0xE4ED, 0x9D6A, 0x9D6B, 0x9D6C, /* 0x20 */
+ 0x9D6D, 0xE4F6, 0xE4F4, 0xC2FE, 0x9D6E, 0xE4DD, 0x9D6F, 0xE4F0, /* 0x20 */
+ 0x9D70, 0xCAFE, 0x9D71, 0xD5C4, 0x9D72, 0x9D73, 0xE4F1, 0x9D74, /* 0x30 */
+ 0x9D75, 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0xD1FA, 0x9D7B, /* 0x30 */
+ 0x9D7C, 0x9D7D, 0x9D7E, 0x9D80, 0x9D81, 0x9D82, 0xE4EB, 0xE4EC, /* 0x40 */
+ 0x9D83, 0x9D84, 0x9D85, 0xE4F2, 0x9D86, 0xCEAB, 0x9D87, 0x9D88, /* 0x40 */
+ 0x9D89, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F, 0x9D90, /* 0x50 */
+ 0xC5CB, 0x9D91, 0x9D92, 0x9D93, 0xC7B1, 0x9D94, 0xC2BA, 0x9D95, /* 0x50 */
+ 0x9D96, 0x9D97, 0xE4EA, 0x9D98, 0x9D99, 0x9D9A, 0xC1CA, 0x9D9B, /* 0x60 */
+ 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0xCCB6, 0xB3B1, 0x9DA1, /* 0x60 */
+ 0x9DA2, 0x9DA3, 0xE4FB, 0x9DA4, 0xE4F3, 0x9DA5, 0x9DA6, 0x9DA7, /* 0x70 */
+ 0xE4FA, 0x9DA8, 0xE4FD, 0x9DA9, 0xE4FC, 0x9DAA, 0x9DAB, 0x9DAC, /* 0x70 */
+ 0x9DAD, 0x9DAE, 0x9DAF, 0x9DB0, 0xB3CE, 0x9DB1, 0x9DB2, 0x9DB3, /* 0x80 */
+ 0xB3BA, 0xE4F7, 0x9DB4, 0x9DB5, 0xE4F9, 0xE4F8, 0xC5EC, 0x9DB6, /* 0x80 */
+ 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBB, 0x9DBC, 0x9DBD, 0x9DBE, /* 0x90 */
+ 0x9DBF, 0x9DC0, 0x9DC1, 0x9DC2, 0xC0BD, 0x9DC3, 0x9DC4, 0x9DC5, /* 0x90 */
+ 0x9DC6, 0xD4E8, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB, 0xE5A2, /* 0xA0 */
+ 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD3, /* 0xA0 */
+ 0x9DD4, 0x9DD5, 0x9DD6, 0xB0C4, 0x9DD7, 0x9DD8, 0xE5A4, 0x9DD9, /* 0xB0 */
+ 0x9DDA, 0xE5A3, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF, 0x9DE0, /* 0xB0 */
+ 0xBCA4, 0x9DE1, 0xE5A5, 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE5, 0x9DE6, /* 0xC0 */
+ 0x9DE7, 0xE5A1, 0x9DE8, 0x9DE9, 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, /* 0xC0 */
+ 0x9DEE, 0xE4FE, 0xB1F4, 0x9DEF, 0x9DF0, 0x9DF1, 0x9DF2, 0x9DF3, /* 0xD0 */
+ 0x9DF4, 0x9DF5, 0x9DF6, 0x9DF7, 0x9DF8, 0x9DF9, 0xE5A8, 0x9DFA, /* 0xD0 */
+ 0xE5A9, 0xE5A6, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9E40, 0x9E41, /* 0xE0 */
+ 0x9E42, 0x9E43, 0x9E44, 0x9E45, 0x9E46, 0x9E47, 0xE5A7, 0xE5AA, /* 0xE0 */
+ 0x9E48, 0x9E49, 0x9E4A, 0x9E4B, 0x9E4C, 0x9E4D, 0x9E4E, 0x9E4F, /* 0xF0 */
+ 0x9E50, 0x9E51, 0x9E52, 0x9E53, 0x9E54, 0x9E55, 0x9E56, 0x9E57 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9E58, 0x9E59, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5D, 0x9E5E, 0x9E5F, /* 0x00 */
+ 0x9E60, 0x9E61, 0x9E62, 0x9E63, 0x9E64, 0x9E65, 0x9E66, 0x9E67, /* 0x00 */
+ 0x9E68, 0xC6D9, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E6D, 0x9E6E, /* 0x10 */
+ 0x9E6F, 0x9E70, 0xE5AB, 0xE5AD, 0x9E71, 0x9E72, 0x9E73, 0x9E74, /* 0x10 */
+ 0x9E75, 0x9E76, 0x9E77, 0xE5AC, 0x9E78, 0x9E79, 0x9E7A, 0x9E7B, /* 0x20 */
+ 0x9E7C, 0x9E7D, 0x9E7E, 0x9E80, 0x9E81, 0x9E82, 0x9E83, 0x9E84, /* 0x20 */
+ 0x9E85, 0x9E86, 0x9E87, 0x9E88, 0x9E89, 0xE5AF, 0x9E8A, 0x9E8B, /* 0x30 */
+ 0x9E8C, 0xE5AE, 0x9E8D, 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E92, /* 0x30 */
+ 0x9E93, 0x9E94, 0x9E95, 0x9E96, 0x9E97, 0x9E98, 0x9E99, 0x9E9A, /* 0x40 */
+ 0x9E9B, 0x9E9C, 0x9E9D, 0x9E9E, 0xB9E0, 0x9E9F, 0x9EA0, 0xE5B0, /* 0x40 */
+ 0x9EA1, 0x9EA2, 0x9EA3, 0x9EA4, 0x9EA5, 0x9EA6, 0x9EA7, 0x9EA8, /* 0x50 */
+ 0x9EA9, 0x9EAA, 0x9EAB, 0x9EAC, 0x9EAD, 0x9EAE, 0xE5B1, 0x9EAF, /* 0x50 */
+ 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB4, 0x9EB5, 0x9EB6, 0x9EB7, /* 0x60 */
+ 0x9EB8, 0x9EB9, 0x9EBA, 0xBBF0, 0xECE1, 0xC3F0, 0x9EBB, 0xB5C6, /* 0x60 */
+ 0xBBD2, 0x9EBC, 0x9EBD, 0x9EBE, 0x9EBF, 0xC1E9, 0xD4EE, 0x9EC0, /* 0x70 */
+ 0xBEC4, 0x9EC1, 0x9EC2, 0x9EC3, 0xD7C6, 0x9EC4, 0xD4D6, 0xB2D3, /* 0x70 */
+ 0xECBE, 0x9EC5, 0x9EC6, 0x9EC7, 0x9EC8, 0xEAC1, 0x9EC9, 0x9ECA, /* 0x80 */
+ 0x9ECB, 0xC2AF, 0xB4B6, 0x9ECC, 0x9ECD, 0x9ECE, 0xD1D7, 0x9ECF, /* 0x80 */
+ 0x9ED0, 0x9ED1, 0xB3B4, 0x9ED2, 0xC8B2, 0xBFBB, 0xECC0, 0x9ED3, /* 0x90 */
+ 0x9ED4, 0xD6CB, 0x9ED5, 0x9ED6, 0xECBF, 0xECC1, 0x9ED7, 0x9ED8, /* 0x90 */
+ 0x9ED9, 0x9EDA, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EDE, 0x9EDF, 0x9EE0, /* 0xA0 */
+ 0x9EE1, 0x9EE2, 0x9EE3, 0xECC5, 0xBEE6, 0xCCBF, 0xC5DA, 0xBEBC, /* 0xA0 */
+ 0x9EE4, 0xECC6, 0x9EE5, 0xB1FE, 0x9EE6, 0x9EE7, 0x9EE8, 0xECC4, /* 0xB0 */
+ 0xD5A8, 0xB5E3, 0x9EE9, 0xECC2, 0xC1B6, 0xB3E3, 0x9EEA, 0x9EEB, /* 0xB0 */
+ 0xECC3, 0xCBB8, 0xC0C3, 0xCCFE, 0x9EEC, 0x9EED, 0x9EEE, 0x9EEF, /* 0xC0 */
+ 0xC1D2, 0x9EF0, 0xECC8, 0x9EF1, 0x9EF2, 0x9EF3, 0x9EF4, 0x9EF5, /* 0xC0 */
+ 0x9EF6, 0x9EF7, 0x9EF8, 0x9EF9, 0x9EFA, 0x9EFB, 0x9EFC, 0x9EFD, /* 0xD0 */
+ 0xBAE6, 0xC0D3, 0x9EFE, 0xD6F2, 0x9F40, 0x9F41, 0x9F42, 0xD1CC, /* 0xD0 */
+ 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0xBFBE, 0x9F47, 0xB7B3, 0xC9D5, /* 0xE0 */
+ 0xECC7, 0xBBE2, 0x9F48, 0xCCCC, 0xBDFD, 0xC8C8, 0x9F49, 0xCFA9, /* 0xE0 */
+ 0x9F4A, 0x9F4B, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F4F, 0x9F50, 0xCDE9, /* 0xF0 */
+ 0x9F51, 0xC5EB, 0x9F52, 0x9F53, 0x9F54, 0xB7E9, 0x9F55, 0x9F56 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9F57, 0x9F58, 0x9F59, 0x9F5A, 0x9F5B, 0x9F5C, 0x9F5D, 0x9F5E, /* 0x00 */
+ 0x9F5F, 0xD1C9, 0xBAB8, 0x9F60, 0x9F61, 0x9F62, 0x9F63, 0x9F64, /* 0x00 */
+ 0xECC9, 0x9F65, 0x9F66, 0xECCA, 0x9F67, 0xBBC0, 0xECCB, 0x9F68, /* 0x10 */
+ 0xECE2, 0xB1BA, 0xB7D9, 0x9F69, 0x9F6A, 0x9F6B, 0x9F6C, 0x9F6D, /* 0x10 */
+ 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F72, 0x9F73, 0xBDB9, 0x9F74, /* 0x20 */
+ 0x9F75, 0x9F76, 0x9F77, 0x9F78, 0x9F79, 0x9F7A, 0x9F7B, 0xECCC, /* 0x20 */
+ 0xD1E6, 0xECCD, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F80, 0xC8BB, 0x9F81, /* 0x30 */
+ 0x9F82, 0x9F83, 0x9F84, 0x9F85, 0x9F86, 0x9F87, 0x9F88, 0x9F89, /* 0x30 */
+ 0x9F8A, 0x9F8B, 0x9F8C, 0x9F8D, 0x9F8E, 0xECD1, 0x9F8F, 0x9F90, /* 0x40 */
+ 0x9F91, 0x9F92, 0xECD3, 0x9F93, 0xBBCD, 0x9F94, 0xBCE5, 0x9F95, /* 0x40 */
+ 0x9F96, 0x9F97, 0x9F98, 0x9F99, 0x9F9A, 0x9F9B, 0x9F9C, 0x9F9D, /* 0x50 */
+ 0x9F9E, 0x9F9F, 0x9FA0, 0x9FA1, 0xECCF, 0x9FA2, 0xC9B7, 0x9FA3, /* 0x50 */
+ 0x9FA4, 0x9FA5, 0x9FA6, 0x9FA7, 0xC3BA, 0x9FA8, 0xECE3, 0xD5D5, /* 0x60 */
+ 0xECD0, 0x9FA9, 0x9FAA, 0x9FAB, 0x9FAC, 0x9FAD, 0xD6F3, 0x9FAE, /* 0x60 */
+ 0x9FAF, 0x9FB0, 0xECD2, 0xECCE, 0x9FB1, 0x9FB2, 0x9FB3, 0x9FB4, /* 0x70 */
+ 0xECD4, 0x9FB5, 0xECD5, 0x9FB6, 0x9FB7, 0xC9BF, 0x9FB8, 0x9FB9, /* 0x70 */
+ 0x9FBA, 0x9FBB, 0x9FBC, 0x9FBD, 0xCFA8, 0x9FBE, 0x9FBF, 0x9FC0, /* 0x80 */
+ 0x9FC1, 0x9FC2, 0xD0DC, 0x9FC3, 0x9FC4, 0x9FC5, 0x9FC6, 0xD1AC, /* 0x80 */
+ 0x9FC7, 0x9FC8, 0x9FC9, 0x9FCA, 0xC8DB, 0x9FCB, 0x9FCC, 0x9FCD, /* 0x90 */
+ 0xECD6, 0xCEF5, 0x9FCE, 0x9FCF, 0x9FD0, 0x9FD1, 0x9FD2, 0xCAEC, /* 0x90 */
+ 0xECDA, 0x9FD3, 0x9FD4, 0x9FD5, 0x9FD6, 0x9FD7, 0x9FD8, 0x9FD9, /* 0xA0 */
+ 0xECD9, 0x9FDA, 0x9FDB, 0x9FDC, 0xB0BE, 0x9FDD, 0x9FDE, 0x9FDF, /* 0xA0 */
+ 0x9FE0, 0x9FE1, 0x9FE2, 0xECD7, 0x9FE3, 0xECD8, 0x9FE4, 0x9FE5, /* 0xB0 */
+ 0x9FE6, 0xECE4, 0x9FE7, 0x9FE8, 0x9FE9, 0x9FEA, 0x9FEB, 0x9FEC, /* 0xB0 */
+ 0x9FED, 0x9FEE, 0x9FEF, 0xC8BC, 0x9FF0, 0x9FF1, 0x9FF2, 0x9FF3, /* 0xC0 */
+ 0x9FF4, 0x9FF5, 0x9FF6, 0x9FF7, 0x9FF8, 0x9FF9, 0xC1C7, 0x9FFA, /* 0xC0 */
+ 0x9FFB, 0x9FFC, 0x9FFD, 0x9FFE, 0xECDC, 0xD1E0, 0xA040, 0xA041, /* 0xD0 */
+ 0xA042, 0xA043, 0xA044, 0xA045, 0xA046, 0xA047, 0xA048, 0xA049, /* 0xD0 */
+ 0xECDB, 0xA04A, 0xA04B, 0xA04C, 0xA04D, 0xD4EF, 0xA04E, 0xECDD, /* 0xE0 */
+ 0xA04F, 0xA050, 0xA051, 0xA052, 0xA053, 0xA054, 0xDBC6, 0xA055, /* 0xE0 */
+ 0xA056, 0xA057, 0xA058, 0xA059, 0xA05A, 0xA05B, 0xA05C, 0xA05D, /* 0xF0 */
+ 0xA05E, 0xECDE, 0xA05F, 0xA060, 0xA061, 0xA062, 0xA063, 0xA064 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA065, 0xA066, 0xA067, 0xA068, 0xA069, 0xA06A, 0xB1AC, 0xA06B, /* 0x00 */
+ 0xA06C, 0xA06D, 0xA06E, 0xA06F, 0xA070, 0xA071, 0xA072, 0xA073, /* 0x00 */
+ 0xA074, 0xA075, 0xA076, 0xA077, 0xA078, 0xA079, 0xA07A, 0xA07B, /* 0x10 */
+ 0xA07C, 0xA07D, 0xA07E, 0xA080, 0xA081, 0xECDF, 0xA082, 0xA083, /* 0x10 */
+ 0xA084, 0xA085, 0xA086, 0xA087, 0xA088, 0xA089, 0xA08A, 0xA08B, /* 0x20 */
+ 0xECE0, 0xA08C, 0xD7A6, 0xA08D, 0xC5C0, 0xA08E, 0xA08F, 0xA090, /* 0x20 */
+ 0xEBBC, 0xB0AE, 0xA091, 0xA092, 0xA093, 0xBEF4, 0xB8B8, 0xD2AF, /* 0x30 */
+ 0xB0D6, 0xB5F9, 0xA094, 0xD8B3, 0xA095, 0xCBAC, 0xA096, 0xE3DD, /* 0x30 */
+ 0xA097, 0xA098, 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D, 0xC6AC, /* 0x40 */
+ 0xB0E6, 0xA09E, 0xA09F, 0xA0A0, 0xC5C6, 0xEBB9, 0xA0A1, 0xA0A2, /* 0x40 */
+ 0xA0A3, 0xA0A4, 0xEBBA, 0xA0A5, 0xA0A6, 0xA0A7, 0xEBBB, 0xA0A8, /* 0x50 */
+ 0xA0A9, 0xD1C0, 0xA0AA, 0xC5A3, 0xA0AB, 0xEAF2, 0xA0AC, 0xC4B2, /* 0x50 */
+ 0xA0AD, 0xC4B5, 0xC0CE, 0xA0AE, 0xA0AF, 0xA0B0, 0xEAF3, 0xC4C1, /* 0x60 */
+ 0xA0B1, 0xCEEF, 0xA0B2, 0xA0B3, 0xA0B4, 0xA0B5, 0xEAF0, 0xEAF4, /* 0x60 */
+ 0xA0B6, 0xA0B7, 0xC9FC, 0xA0B8, 0xA0B9, 0xC7A3, 0xA0BA, 0xA0BB, /* 0x70 */
+ 0xA0BC, 0xCCD8, 0xCEFE, 0xA0BD, 0xA0BE, 0xA0BF, 0xEAF5, 0xEAF6, /* 0x70 */
+ 0xCFAC, 0xC0E7, 0xA0C0, 0xA0C1, 0xEAF7, 0xA0C2, 0xA0C3, 0xA0C4, /* 0x80 */
+ 0xA0C5, 0xA0C6, 0xB6BF, 0xEAF8, 0xA0C7, 0xEAF9, 0xA0C8, 0xEAFA, /* 0x80 */
+ 0xA0C9, 0xA0CA, 0xEAFB, 0xA0CB, 0xA0CC, 0xA0CD, 0xA0CE, 0xA0CF, /* 0x90 */
+ 0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3, 0xA0D4, 0xA0D5, 0xA0D6, 0xEAF1, /* 0x90 */
+ 0xA0D7, 0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, 0xA0DE, /* 0xA0 */
+ 0xA0DF, 0xA0E0, 0xA0E1, 0xA0E2, 0xC8AE, 0xE1EB, 0xA0E3, 0xB7B8, /* 0xA0 */
+ 0xE1EC, 0xA0E4, 0xA0E5, 0xA0E6, 0xE1ED, 0xA0E7, 0xD7B4, 0xE1EE, /* 0xB0 */
+ 0xE1EF, 0xD3CC, 0xA0E8, 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED, /* 0xB0 */
+ 0xA0EE, 0xE1F1, 0xBFF1, 0xE1F0, 0xB5D2, 0xA0EF, 0xA0F0, 0xA0F1, /* 0xC0 */
+ 0xB1B7, 0xA0F2, 0xA0F3, 0xA0F4, 0xA0F5, 0xE1F3, 0xE1F2, 0xA0F6, /* 0xC0 */
+ 0xBAFC, 0xA0F7, 0xE1F4, 0xA0F8, 0xA0F9, 0xA0FA, 0xA0FB, 0xB9B7, /* 0xD0 */
+ 0xA0FC, 0xBED1, 0xA0FD, 0xA0FE, 0xAA40, 0xAA41, 0xC4FC, 0xAA42, /* 0xD0 */
+ 0xBADD, 0xBDC6, 0xAA43, 0xAA44, 0xAA45, 0xAA46, 0xAA47, 0xAA48, /* 0xE0 */
+ 0xE1F5, 0xE1F7, 0xAA49, 0xAA4A, 0xB6C0, 0xCFC1, 0xCAA8, 0xE1F6, /* 0xE0 */
+ 0xD5F8, 0xD3FC, 0xE1F8, 0xE1FC, 0xE1F9, 0xAA4B, 0xAA4C, 0xE1FA, /* 0xF0 */
+ 0xC0EA, 0xAA4D, 0xE1FE, 0xE2A1, 0xC0C7, 0xAA4E, 0xAA4F, 0xAA50 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAA51, 0xE1FB, 0xAA52, 0xE1FD, 0xAA53, 0xAA54, 0xAA55, 0xAA56, /* 0x00 */
+ 0xAA57, 0xAA58, 0xE2A5, 0xAA59, 0xAA5A, 0xAA5B, 0xC1D4, 0xAA5C, /* 0x00 */
+ 0xAA5D, 0xAA5E, 0xAA5F, 0xE2A3, 0xAA60, 0xE2A8, 0xB2FE, 0xE2A2, /* 0x10 */
+ 0xAA61, 0xAA62, 0xAA63, 0xC3CD, 0xB2C2, 0xE2A7, 0xE2A6, 0xAA64, /* 0x10 */
+ 0xAA65, 0xE2A4, 0xE2A9, 0xAA66, 0xAA67, 0xE2AB, 0xAA68, 0xAA69, /* 0x20 */
+ 0xAA6A, 0xD0C9, 0xD6ED, 0xC3A8, 0xE2AC, 0xAA6B, 0xCFD7, 0xAA6C, /* 0x20 */
+ 0xAA6D, 0xE2AE, 0xAA6E, 0xAA6F, 0xBAEF, 0xAA70, 0xAA71, 0xE9E0, /* 0x30 */
+ 0xE2AD, 0xE2AA, 0xAA72, 0xAA73, 0xAA74, 0xAA75, 0xBBAB, 0xD4B3, /* 0x30 */
+ 0xAA76, 0xAA77, 0xAA78, 0xAA79, 0xAA7A, 0xAA7B, 0xAA7C, 0xAA7D, /* 0x40 */
+ 0xAA7E, 0xAA80, 0xAA81, 0xAA82, 0xAA83, 0xE2B0, 0xAA84, 0xAA85, /* 0x40 */
+ 0xE2AF, 0xAA86, 0xE9E1, 0xAA87, 0xAA88, 0xAA89, 0xAA8A, 0xE2B1, /* 0x50 */
+ 0xAA8B, 0xAA8C, 0xAA8D, 0xAA8E, 0xAA8F, 0xAA90, 0xAA91, 0xAA92, /* 0x50 */
+ 0xE2B2, 0xAA93, 0xAA94, 0xAA95, 0xAA96, 0xAA97, 0xAA98, 0xAA99, /* 0x60 */
+ 0xAA9A, 0xAA9B, 0xAA9C, 0xAA9D, 0xE2B3, 0xCCA1, 0xAA9E, 0xE2B4, /* 0x60 */
+ 0xAA9F, 0xAAA0, 0xAB40, 0xAB41, 0xAB42, 0xAB43, 0xAB44, 0xAB45, /* 0x70 */
+ 0xAB46, 0xAB47, 0xAB48, 0xAB49, 0xAB4A, 0xAB4B, 0xE2B5, 0xAB4C, /* 0x70 */
+ 0xAB4D, 0xAB4E, 0xAB4F, 0xAB50, 0xD0FE, 0xAB51, 0xAB52, 0xC2CA, /* 0x80 */
+ 0xAB53, 0xD3F1, 0xAB54, 0xCDF5, 0xAB55, 0xAB56, 0xE7E0, 0xAB57, /* 0x80 */
+ 0xAB58, 0xE7E1, 0xAB59, 0xAB5A, 0xAB5B, 0xAB5C, 0xBEC1, 0xAB5D, /* 0x90 */
+ 0xAB5E, 0xAB5F, 0xAB60, 0xC2EA, 0xAB61, 0xAB62, 0xAB63, 0xE7E4, /* 0x90 */
+ 0xAB64, 0xAB65, 0xE7E3, 0xAB66, 0xAB67, 0xAB68, 0xAB69, 0xAB6A, /* 0xA0 */
+ 0xAB6B, 0xCDE6, 0xAB6C, 0xC3B5, 0xAB6D, 0xAB6E, 0xE7E2, 0xBBB7, /* 0xA0 */
+ 0xCFD6, 0xAB6F, 0xC1E1, 0xE7E9, 0xAB70, 0xAB71, 0xAB72, 0xE7E8, /* 0xB0 */
+ 0xAB73, 0xAB74, 0xE7F4, 0xB2A3, 0xAB75, 0xAB76, 0xAB77, 0xAB78, /* 0xB0 */
+ 0xE7EA, 0xAB79, 0xE7E6, 0xAB7A, 0xAB7B, 0xAB7C, 0xAB7D, 0xAB7E, /* 0xC0 */
+ 0xE7EC, 0xE7EB, 0xC9BA, 0xAB80, 0xAB81, 0xD5E4, 0xAB82, 0xE7E5, /* 0xC0 */
+ 0xB7A9, 0xE7E7, 0xAB83, 0xAB84, 0xAB85, 0xAB86, 0xAB87, 0xAB88, /* 0xD0 */
+ 0xAB89, 0xE7EE, 0xAB8A, 0xAB8B, 0xAB8C, 0xAB8D, 0xE7F3, 0xAB8E, /* 0xD0 */
+ 0xD6E9, 0xAB8F, 0xAB90, 0xAB91, 0xAB92, 0xE7ED, 0xAB93, 0xE7F2, /* 0xE0 */
+ 0xAB94, 0xE7F1, 0xAB95, 0xAB96, 0xAB97, 0xB0E0, 0xAB98, 0xAB99, /* 0xE0 */
+ 0xAB9A, 0xAB9B, 0xE7F5, 0xAB9C, 0xAB9D, 0xAB9E, 0xAB9F, 0xABA0, /* 0xF0 */
+ 0xAC40, 0xAC41, 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAC48, 0xAC49, 0xAC4A, 0xC7F2, 0xAC4B, 0xC0C5, 0xC0ED, 0xAC4C, /* 0x00 */
+ 0xAC4D, 0xC1F0, 0xE7F0, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xE7F6, /* 0x00 */
+ 0xCBF6, 0xAC52, 0xAC53, 0xAC54, 0xAC55, 0xAC56, 0xAC57, 0xAC58, /* 0x10 */
+ 0xAC59, 0xAC5A, 0xE8A2, 0xE8A1, 0xAC5B, 0xAC5C, 0xAC5D, 0xAC5E, /* 0x10 */
+ 0xAC5F, 0xAC60, 0xD7C1, 0xAC61, 0xAC62, 0xE7FA, 0xE7F9, 0xAC63, /* 0x20 */
+ 0xE7FB, 0xAC64, 0xE7F7, 0xAC65, 0xE7FE, 0xAC66, 0xE7FD, 0xAC67, /* 0x20 */
+ 0xE7FC, 0xAC68, 0xAC69, 0xC1D5, 0xC7D9, 0xC5FD, 0xC5C3, 0xAC6A, /* 0x30 */
+ 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E, 0xC7ED, 0xAC6F, 0xAC70, 0xAC71, /* 0x30 */
+ 0xAC72, 0xE8A3, 0xAC73, 0xAC74, 0xAC75, 0xAC76, 0xAC77, 0xAC78, /* 0x40 */
+ 0xAC79, 0xAC7A, 0xAC7B, 0xAC7C, 0xAC7D, 0xAC7E, 0xAC80, 0xAC81, /* 0x40 */
+ 0xAC82, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xE8A6, 0xAC87, 0xE8A5, /* 0x50 */
+ 0xAC88, 0xE8A7, 0xBAF7, 0xE7F8, 0xE8A4, 0xAC89, 0xC8F0, 0xC9AA, /* 0x50 */
+ 0xAC8A, 0xAC8B, 0xAC8C, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC90, 0xAC91, /* 0x60 */
+ 0xAC92, 0xAC93, 0xAC94, 0xAC95, 0xAC96, 0xE8A9, 0xAC97, 0xAC98, /* 0x60 */
+ 0xB9E5, 0xAC99, 0xAC9A, 0xAC9B, 0xAC9C, 0xAC9D, 0xD1FE, 0xE8A8, /* 0x70 */
+ 0xAC9E, 0xAC9F, 0xACA0, 0xAD40, 0xAD41, 0xAD42, 0xE8AA, 0xAD43, /* 0x70 */
+ 0xE8AD, 0xE8AE, 0xAD44, 0xC1A7, 0xAD45, 0xAD46, 0xAD47, 0xE8AF, /* 0x80 */
+ 0xAD48, 0xAD49, 0xAD4A, 0xE8B0, 0xAD4B, 0xAD4C, 0xE8AC, 0xAD4D, /* 0x80 */
+ 0xE8B4, 0xAD4E, 0xAD4F, 0xAD50, 0xAD51, 0xAD52, 0xAD53, 0xAD54, /* 0x90 */
+ 0xAD55, 0xAD56, 0xAD57, 0xAD58, 0xE8AB, 0xAD59, 0xE8B1, 0xAD5A, /* 0x90 */
+ 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E, 0xAD5F, 0xAD60, 0xAD61, 0xE8B5, /* 0xA0 */
+ 0xE8B2, 0xE8B3, 0xAD62, 0xAD63, 0xAD64, 0xAD65, 0xAD66, 0xAD67, /* 0xA0 */
+ 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6C, 0xAD6D, 0xAD6E, 0xAD6F, /* 0xB0 */
+ 0xAD70, 0xAD71, 0xE8B7, 0xAD72, 0xAD73, 0xAD74, 0xAD75, 0xAD76, /* 0xB0 */
+ 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7E, /* 0xC0 */
+ 0xAD80, 0xAD81, 0xAD82, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87, /* 0xC0 */
+ 0xAD88, 0xAD89, 0xE8B6, 0xAD8A, 0xAD8B, 0xAD8C, 0xAD8D, 0xAD8E, /* 0xD0 */
+ 0xAD8F, 0xAD90, 0xAD91, 0xAD92, 0xB9CF, 0xAD93, 0xF0AC, 0xAD94, /* 0xD0 */
+ 0xF0AD, 0xAD95, 0xC6B0, 0xB0EA, 0xC8BF, 0xAD96, 0xCDDF, 0xAD97, /* 0xE0 */
+ 0xAD98, 0xAD99, 0xAD9A, 0xAD9B, 0xAD9C, 0xAD9D, 0xCECD, 0xEAB1, /* 0xE0 */
+ 0xAD9E, 0xAD9F, 0xADA0, 0xAE40, 0xEAB2, 0xAE41, 0xC6BF, 0xB4C9, /* 0xF0 */
+ 0xAE42, 0xAE43, 0xAE44, 0xAE45, 0xAE46, 0xAE47, 0xAE48, 0xEAB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAE49, 0xAE4A, 0xAE4B, 0xAE4C, 0xD5E7, 0xAE4D, 0xAE4E, 0xAE4F, /* 0x00 */
+ 0xAE50, 0xAE51, 0xAE52, 0xAE53, 0xAE54, 0xDDF9, 0xAE55, 0xEAB4, /* 0x00 */
+ 0xAE56, 0xEAB5, 0xAE57, 0xEAB6, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B, /* 0x10 */
+ 0xB8CA, 0xDFB0, 0xC9F5, 0xAE5C, 0xCCF0, 0xAE5D, 0xAE5E, 0xC9FA, /* 0x10 */
+ 0xAE5F, 0xAE60, 0xAE61, 0xAE62, 0xAE63, 0xC9FB, 0xAE64, 0xAE65, /* 0x20 */
+ 0xD3C3, 0xCBA6, 0xAE66, 0xB8A6, 0xF0AE, 0xB1C2, 0xAE67, 0xE5B8, /* 0x20 */
+ 0xCCEF, 0xD3C9, 0xBCD7, 0xC9EA, 0xAE68, 0xB5E7, 0xAE69, 0xC4D0, /* 0x30 */
+ 0xB5E9, 0xAE6A, 0xEEAE, 0xBBAD, 0xAE6B, 0xAE6C, 0xE7DE, 0xAE6D, /* 0x30 */
+ 0xEEAF, 0xAE6E, 0xAE6F, 0xAE70, 0xAE71, 0xB3A9, 0xAE72, 0xAE73, /* 0x40 */
+ 0xEEB2, 0xAE74, 0xAE75, 0xEEB1, 0xBDE7, 0xAE76, 0xEEB0, 0xCEB7, /* 0x40 */
+ 0xAE77, 0xAE78, 0xAE79, 0xAE7A, 0xC5CF, 0xAE7B, 0xAE7C, 0xAE7D, /* 0x50 */
+ 0xAE7E, 0xC1F4, 0xDBCE, 0xEEB3, 0xD0F3, 0xAE80, 0xAE81, 0xAE82, /* 0x50 */
+ 0xAE83, 0xAE84, 0xAE85, 0xAE86, 0xAE87, 0xC2D4, 0xC6E8, 0xAE88, /* 0x60 */
+ 0xAE89, 0xAE8A, 0xB7AC, 0xAE8B, 0xAE8C, 0xAE8D, 0xAE8E, 0xAE8F, /* 0x60 */
+ 0xAE90, 0xAE91, 0xEEB4, 0xAE92, 0xB3EB, 0xAE93, 0xAE94, 0xAE95, /* 0x70 */
+ 0xBBFB, 0xEEB5, 0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xE7DC, /* 0x70 */
+ 0xAE9B, 0xAE9C, 0xAE9D, 0xEEB6, 0xAE9E, 0xAE9F, 0xBDAE, 0xAEA0, /* 0x80 */
+ 0xAF40, 0xAF41, 0xAF42, 0xF1E2, 0xAF43, 0xAF44, 0xAF45, 0xCAE8, /* 0x80 */
+ 0xAF46, 0xD2C9, 0xF0DA, 0xAF47, 0xF0DB, 0xAF48, 0xF0DC, 0xC1C6, /* 0x90 */
+ 0xAF49, 0xB8ED, 0xBECE, 0xAF4A, 0xAF4B, 0xF0DE, 0xAF4C, 0xC5B1, /* 0x90 */
+ 0xF0DD, 0xD1F1, 0xAF4D, 0xF0E0, 0xB0CC, 0xBDEA, 0xAF4E, 0xAF4F, /* 0xA0 */
+ 0xAF50, 0xAF51, 0xAF52, 0xD2DF, 0xF0DF, 0xAF53, 0xB4AF, 0xB7E8, /* 0xA0 */
+ 0xF0E6, 0xF0E5, 0xC6A3, 0xF0E1, 0xF0E2, 0xB4C3, 0xAF54, 0xAF55, /* 0xB0 */
+ 0xF0E3, 0xD5EE, 0xAF56, 0xAF57, 0xCCDB, 0xBED2, 0xBCB2, 0xAF58, /* 0xB0 */
+ 0xAF59, 0xAF5A, 0xF0E8, 0xF0E7, 0xF0E4, 0xB2A1, 0xAF5B, 0xD6A2, /* 0xC0 */
+ 0xD3B8, 0xBEB7, 0xC8AC, 0xAF5C, 0xAF5D, 0xF0EA, 0xAF5E, 0xAF5F, /* 0xC0 */
+ 0xAF60, 0xAF61, 0xD1F7, 0xAF62, 0xD6CC, 0xBADB, 0xF0E9, 0xAF63, /* 0xD0 */
+ 0xB6BB, 0xAF64, 0xAF65, 0xCDB4, 0xAF66, 0xAF67, 0xC6A6, 0xAF68, /* 0xD0 */
+ 0xAF69, 0xAF6A, 0xC1A1, 0xF0EB, 0xF0EE, 0xAF6B, 0xF0ED, 0xF0F0, /* 0xE0 */
+ 0xF0EC, 0xAF6C, 0xBBBE, 0xF0EF, 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70, /* 0xE0 */
+ 0xCCB5, 0xF0F2, 0xAF71, 0xAF72, 0xB3D5, 0xAF73, 0xAF74, 0xAF75, /* 0xF0 */
+ 0xAF76, 0xB1D4, 0xAF77, 0xAF78, 0xF0F3, 0xAF79, 0xAF7A, 0xF0F4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0F6, 0xB4E1, 0xAF7B, 0xF0F1, 0xAF7C, 0xF0F7, 0xAF7D, 0xAF7E, /* 0x00 */
+ 0xAF80, 0xAF81, 0xF0FA, 0xAF82, 0xF0F8, 0xAF83, 0xAF84, 0xAF85, /* 0x00 */
+ 0xF0F5, 0xAF86, 0xAF87, 0xAF88, 0xAF89, 0xF0FD, 0xAF8A, 0xF0F9, /* 0x10 */
+ 0xF0FC, 0xF0FE, 0xAF8B, 0xF1A1, 0xAF8C, 0xAF8D, 0xAF8E, 0xCEC1, /* 0x10 */
+ 0xF1A4, 0xAF8F, 0xF1A3, 0xAF90, 0xC1F6, 0xF0FB, 0xCADD, 0xAF91, /* 0x20 */
+ 0xAF92, 0xB4F1, 0xB1F1, 0xCCB1, 0xAF93, 0xF1A6, 0xAF94, 0xAF95, /* 0x20 */
+ 0xF1A7, 0xAF96, 0xAF97, 0xF1AC, 0xD5CE, 0xF1A9, 0xAF98, 0xAF99, /* 0x30 */
+ 0xC8B3, 0xAF9A, 0xAF9B, 0xAF9C, 0xF1A2, 0xAF9D, 0xF1AB, 0xF1A8, /* 0x30 */
+ 0xF1A5, 0xAF9E, 0xAF9F, 0xF1AA, 0xAFA0, 0xB040, 0xB041, 0xB042, /* 0x40 */
+ 0xB043, 0xB044, 0xB045, 0xB046, 0xB0A9, 0xF1AD, 0xB047, 0xB048, /* 0x40 */
+ 0xB049, 0xB04A, 0xB04B, 0xB04C, 0xF1AF, 0xB04D, 0xF1B1, 0xB04E, /* 0x50 */
+ 0xB04F, 0xB050, 0xB051, 0xB052, 0xF1B0, 0xB053, 0xF1AE, 0xB054, /* 0x50 */
+ 0xB055, 0xB056, 0xB057, 0xD1A2, 0xB058, 0xB059, 0xB05A, 0xB05B, /* 0x60 */
+ 0xB05C, 0xB05D, 0xB05E, 0xF1B2, 0xB05F, 0xB060, 0xB061, 0xF1B3, /* 0x60 */
+ 0xB062, 0xB063, 0xB064, 0xB065, 0xB066, 0xB067, 0xB068, 0xB069, /* 0x70 */
+ 0xB9EF, 0xB06A, 0xB06B, 0xB5C7, 0xB06C, 0xB0D7, 0xB0D9, 0xB06D, /* 0x70 */
+ 0xB06E, 0xB06F, 0xD4ED, 0xB070, 0xB5C4, 0xB071, 0xBDD4, 0xBBCA, /* 0x80 */
+ 0xF0A7, 0xB072, 0xB073, 0xB8DE, 0xB074, 0xB075, 0xF0A8, 0xB076, /* 0x80 */
+ 0xB077, 0xB0A8, 0xB078, 0xF0A9, 0xB079, 0xB07A, 0xCDEE, 0xB07B, /* 0x90 */
+ 0xB07C, 0xF0AA, 0xB07D, 0xB07E, 0xB080, 0xB081, 0xB082, 0xB083, /* 0x90 */
+ 0xB084, 0xB085, 0xB086, 0xB087, 0xF0AB, 0xB088, 0xB089, 0xB08A, /* 0xA0 */
+ 0xB08B, 0xB08C, 0xB08D, 0xB08E, 0xB08F, 0xB090, 0xC6A4, 0xB091, /* 0xA0 */
+ 0xB092, 0xD6E5, 0xF1E4, 0xB093, 0xF1E5, 0xB094, 0xB095, 0xB096, /* 0xB0 */
+ 0xB097, 0xB098, 0xB099, 0xB09A, 0xB09B, 0xB09C, 0xB09D, 0xC3F3, /* 0xB0 */
+ 0xB09E, 0xB09F, 0xD3DB, 0xB0A0, 0xB140, 0xD6D1, 0xC5E8, 0xB141, /* 0xC0 */
+ 0xD3AF, 0xB142, 0xD2E6, 0xB143, 0xB144, 0xEEC1, 0xB0BB, 0xD5B5, /* 0xC0 */
+ 0xD1CE, 0xBCE0, 0xBAD0, 0xB145, 0xBFF8, 0xB146, 0xB8C7, 0xB5C1, /* 0xD0 */
+ 0xC5CC, 0xB147, 0xB148, 0xCAA2, 0xB149, 0xB14A, 0xB14B, 0xC3CB, /* 0xD0 */
+ 0xB14C, 0xB14D, 0xB14E, 0xB14F, 0xB150, 0xEEC2, 0xB151, 0xB152, /* 0xE0 */
+ 0xB153, 0xB154, 0xB155, 0xB156, 0xB157, 0xB158, 0xC4BF, 0xB6A2, /* 0xE0 */
+ 0xB159, 0xEDEC, 0xC3A4, 0xB15A, 0xD6B1, 0xB15B, 0xB15C, 0xB15D, /* 0xF0 */
+ 0xCFE0, 0xEDEF, 0xB15E, 0xB15F, 0xC5CE, 0xB160, 0xB6DC, 0xB161 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB162, 0xCAA1, 0xB163, 0xB164, 0xEDED, 0xB165, 0xB166, 0xEDF0, /* 0x00 */
+ 0xEDF1, 0xC3BC, 0xB167, 0xBFB4, 0xB168, 0xEDEE, 0xB169, 0xB16A, /* 0x00 */
+ 0xB16B, 0xB16C, 0xB16D, 0xB16E, 0xB16F, 0xB170, 0xB171, 0xB172, /* 0x10 */
+ 0xB173, 0xEDF4, 0xEDF2, 0xB174, 0xB175, 0xB176, 0xB177, 0xD5E6, /* 0x10 */
+ 0xC3DF, 0xB178, 0xEDF3, 0xB179, 0xB17A, 0xB17B, 0xEDF6, 0xB17C, /* 0x20 */
+ 0xD5A3, 0xD1A3, 0xB17D, 0xB17E, 0xB180, 0xEDF5, 0xB181, 0xC3D0, /* 0x20 */
+ 0xB182, 0xB183, 0xB184, 0xB185, 0xB186, 0xEDF7, 0xBFF4, 0xBEEC, /* 0x30 */
+ 0xEDF8, 0xB187, 0xCCF7, 0xB188, 0xD1DB, 0xB189, 0xB18A, 0xB18B, /* 0x30 */
+ 0xD7C5, 0xD5F6, 0xB18C, 0xEDFC, 0xB18D, 0xB18E, 0xB18F, 0xEDFB, /* 0x40 */
+ 0xB190, 0xB191, 0xB192, 0xB193, 0xB194, 0xB195, 0xB196, 0xB197, /* 0x40 */
+ 0xEDF9, 0xEDFA, 0xB198, 0xB199, 0xB19A, 0xB19B, 0xB19C, 0xB19D, /* 0x50 */
+ 0xB19E, 0xB19F, 0xEDFD, 0xBEA6, 0xB1A0, 0xB240, 0xB241, 0xB242, /* 0x50 */
+ 0xB243, 0xCBAF, 0xEEA1, 0xB6BD, 0xB244, 0xEEA2, 0xC4C0, 0xB245, /* 0x60 */
+ 0xEDFE, 0xB246, 0xB247, 0xBDDE, 0xB2C7, 0xB248, 0xB249, 0xB24A, /* 0x60 */
+ 0xB24B, 0xB24C, 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251, 0xB252, /* 0x70 */
+ 0xB253, 0xB6C3, 0xB254, 0xB255, 0xB256, 0xEEA5, 0xD8BA, 0xEEA3, /* 0x70 */
+ 0xEEA6, 0xB257, 0xB258, 0xB259, 0xC3E9, 0xB3F2, 0xB25A, 0xB25B, /* 0x80 */
+ 0xB25C, 0xB25D, 0xB25E, 0xB25F, 0xEEA7, 0xEEA4, 0xCFB9, 0xB260, /* 0x80 */
+ 0xB261, 0xEEA8, 0xC2F7, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, /* 0x90 */
+ 0xB267, 0xB268, 0xB269, 0xB26A, 0xB26B, 0xB26C, 0xB26D, 0xEEA9, /* 0x90 */
+ 0xEEAA, 0xB26E, 0xDEAB, 0xB26F, 0xB270, 0xC6B3, 0xB271, 0xC7C6, /* 0xA0 */
+ 0xB272, 0xD6F5, 0xB5C9, 0xB273, 0xCBB2, 0xB274, 0xB275, 0xB276, /* 0xA0 */
+ 0xEEAB, 0xB277, 0xB278, 0xCDAB, 0xB279, 0xEEAC, 0xB27A, 0xB27B, /* 0xB0 */
+ 0xB27C, 0xB27D, 0xB27E, 0xD5B0, 0xB280, 0xEEAD, 0xB281, 0xF6C4, /* 0xB0 */
+ 0xB282, 0xB283, 0xB284, 0xB285, 0xB286, 0xB287, 0xB288, 0xB289, /* 0xC0 */
+ 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xDBC7, 0xB28F, 0xB290, /* 0xC0 */
+ 0xB291, 0xB292, 0xB293, 0xB294, 0xB295, 0xB296, 0xB297, 0xB4A3, /* 0xD0 */
+ 0xB298, 0xB299, 0xB29A, 0xC3AC, 0xF1E6, 0xB29B, 0xB29C, 0xB29D, /* 0xD0 */
+ 0xB29E, 0xB29F, 0xCAB8, 0xD2D3, 0xB2A0, 0xD6AA, 0xB340, 0xEFF2, /* 0xE0 */
+ 0xB341, 0xBED8, 0xB342, 0xBDC3, 0xEFF3, 0xB6CC, 0xB0AB, 0xB343, /* 0xE0 */
+ 0xB344, 0xB345, 0xB346, 0xCAAF, 0xB347, 0xB348, 0xEDB6, 0xB349, /* 0xF0 */
+ 0xEDB7, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xCEF9, 0xB7AF, 0xBFF3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDB8, 0xC2EB, 0xC9B0, 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB352, /* 0x00 */
+ 0xB353, 0xEDB9, 0xB354, 0xB355, 0xC6F6, 0xBFB3, 0xB356, 0xB357, /* 0x00 */
+ 0xB358, 0xEDBC, 0xC5F8, 0xB359, 0xD1D0, 0xB35A, 0xD7A9, 0xEDBA, /* 0x10 */
+ 0xEDBB, 0xB35B, 0xD1E2, 0xB35C, 0xEDBF, 0xEDC0, 0xB35D, 0xEDC4, /* 0x10 */
+ 0xB35E, 0xB35F, 0xB360, 0xEDC8, 0xB361, 0xEDC6, 0xEDCE, 0xD5E8, /* 0x20 */
+ 0xB362, 0xEDC9, 0xB363, 0xB364, 0xEDC7, 0xEDBE, 0xB365, 0xB366, /* 0x20 */
+ 0xC5E9, 0xB367, 0xB368, 0xB369, 0xC6C6, 0xB36A, 0xB36B, 0xC9E9, /* 0x30 */
+ 0xD4D2, 0xEDC1, 0xEDC2, 0xEDC3, 0xEDC5, 0xB36C, 0xC0F9, 0xB36D, /* 0x30 */
+ 0xB4A1, 0xB36E, 0xB36F, 0xB370, 0xB371, 0xB9E8, 0xB372, 0xEDD0, /* 0x40 */
+ 0xB373, 0xB374, 0xB375, 0xB376, 0xEDD1, 0xB377, 0xEDCA, 0xB378, /* 0x40 */
+ 0xEDCF, 0xB379, 0xCEF8, 0xB37A, 0xB37B, 0xCBB6, 0xEDCC, 0xEDCD, /* 0x50 */
+ 0xB37C, 0xB37D, 0xB37E, 0xB380, 0xB381, 0xCFF5, 0xB382, 0xB383, /* 0x50 */
+ 0xB384, 0xB385, 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, /* 0x60 */
+ 0xB38C, 0xB38D, 0xEDD2, 0xC1F2, 0xD3B2, 0xEDCB, 0xC8B7, 0xB38E, /* 0x60 */
+ 0xB38F, 0xB390, 0xB391, 0xB392, 0xB393, 0xB394, 0xB395, 0xBCEF, /* 0x70 */
+ 0xB396, 0xB397, 0xB398, 0xB399, 0xC5F0, 0xB39A, 0xB39B, 0xB39C, /* 0x70 */
+ 0xB39D, 0xB39E, 0xB39F, 0xB3A0, 0xB440, 0xB441, 0xB442, 0xEDD6, /* 0x80 */
+ 0xB443, 0xB5EF, 0xB444, 0xB445, 0xC2B5, 0xB0AD, 0xCBE9, 0xB446, /* 0x80 */
+ 0xB447, 0xB1AE, 0xB448, 0xEDD4, 0xB449, 0xB44A, 0xB44B, 0xCDEB, /* 0x90 */
+ 0xB5E2, 0xB44C, 0xEDD5, 0xEDD3, 0xEDD7, 0xB44D, 0xB44E, 0xB5FA, /* 0x90 */
+ 0xB44F, 0xEDD8, 0xB450, 0xEDD9, 0xB451, 0xEDDC, 0xB452, 0xB1CC, /* 0xA0 */
+ 0xB453, 0xB454, 0xB455, 0xB456, 0xB457, 0xB458, 0xB459, 0xB45A, /* 0xA0 */
+ 0xC5F6, 0xBCEE, 0xEDDA, 0xCCBC, 0xB2EA, 0xB45B, 0xB45C, 0xB45D, /* 0xB0 */
+ 0xB45E, 0xEDDB, 0xB45F, 0xB460, 0xB461, 0xB462, 0xC4EB, 0xB463, /* 0xB0 */
+ 0xB464, 0xB4C5, 0xB465, 0xB466, 0xB467, 0xB0F5, 0xB468, 0xB469, /* 0xC0 */
+ 0xB46A, 0xEDDF, 0xC0DA, 0xB4E8, 0xB46B, 0xB46C, 0xB46D, 0xB46E, /* 0xC0 */
+ 0xC5CD, 0xB46F, 0xB470, 0xB471, 0xEDDD, 0xBFC4, 0xB472, 0xB473, /* 0xD0 */
+ 0xB474, 0xEDDE, 0xB475, 0xB476, 0xB477, 0xB478, 0xB479, 0xB47A, /* 0xD0 */
+ 0xB47B, 0xB47C, 0xB47D, 0xB47E, 0xB480, 0xB481, 0xB482, 0xB483, /* 0xE0 */
+ 0xC4A5, 0xB484, 0xB485, 0xB486, 0xEDE0, 0xB487, 0xB488, 0xB489, /* 0xE0 */
+ 0xB48A, 0xB48B, 0xEDE1, 0xB48C, 0xEDE3, 0xB48D, 0xB48E, 0xC1D7, /* 0xF0 */
+ 0xB48F, 0xB490, 0xBBC7, 0xB491, 0xB492, 0xB493, 0xB494, 0xB495 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB496, 0xBDB8, 0xB497, 0xB498, 0xB499, 0xEDE2, 0xB49A, 0xB49B, /* 0x00 */
+ 0xB49C, 0xB49D, 0xB49E, 0xB49F, 0xB4A0, 0xB540, 0xB541, 0xB542, /* 0x00 */
+ 0xB543, 0xB544, 0xB545, 0xEDE4, 0xB546, 0xB547, 0xB548, 0xB549, /* 0x10 */
+ 0xB54A, 0xB54B, 0xB54C, 0xB54D, 0xB54E, 0xB54F, 0xEDE6, 0xB550, /* 0x10 */
+ 0xB551, 0xB552, 0xB553, 0xB554, 0xEDE5, 0xB555, 0xB556, 0xB557, /* 0x20 */
+ 0xB558, 0xB559, 0xB55A, 0xB55B, 0xB55C, 0xB55D, 0xB55E, 0xB55F, /* 0x20 */
+ 0xB560, 0xB561, 0xB562, 0xB563, 0xEDE7, 0xB564, 0xB565, 0xB566, /* 0x30 */
+ 0xB567, 0xB568, 0xCABE, 0xECEA, 0xC0F1, 0xB569, 0xC9E7, 0xB56A, /* 0x30 */
+ 0xECEB, 0xC6EE, 0xB56B, 0xB56C, 0xB56D, 0xB56E, 0xECEC, 0xB56F, /* 0x40 */
+ 0xC6ED, 0xECED, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575, /* 0x40 */
+ 0xB576, 0xB577, 0xB578, 0xECF0, 0xB579, 0xB57A, 0xD7E6, 0xECF3, /* 0x50 */
+ 0xB57B, 0xB57C, 0xECF1, 0xECEE, 0xECEF, 0xD7A3, 0xC9F1, 0xCBEE, /* 0x50 */
+ 0xECF4, 0xB57D, 0xECF2, 0xB57E, 0xB580, 0xCFE9, 0xB581, 0xECF6, /* 0x60 */
+ 0xC6B1, 0xB582, 0xB583, 0xB584, 0xB585, 0xBCC0, 0xB586, 0xECF5, /* 0x60 */
+ 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D, 0xB5BB, /* 0x70 */
+ 0xBBF6, 0xB58E, 0xECF7, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, /* 0x70 */
+ 0xD9F7, 0xBDFB, 0xB594, 0xB595, 0xC2BB, 0xECF8, 0xB596, 0xB597, /* 0x80 */
+ 0xB598, 0xB599, 0xECF9, 0xB59A, 0xB59B, 0xB59C, 0xB59D, 0xB8A3, /* 0x80 */
+ 0xB59E, 0xB59F, 0xB5A0, 0xB640, 0xB641, 0xB642, 0xB643, 0xB644, /* 0x90 */
+ 0xB645, 0xB646, 0xECFA, 0xB647, 0xB648, 0xB649, 0xB64A, 0xB64B, /* 0x90 */
+ 0xB64C, 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xECFB, /* 0xA0 */
+ 0xB653, 0xB654, 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, /* 0xA0 */
+ 0xB65B, 0xB65C, 0xB65D, 0xECFC, 0xB65E, 0xB65F, 0xB660, 0xB661, /* 0xB0 */
+ 0xB662, 0xD3ED, 0xD8AE, 0xC0EB, 0xB663, 0xC7DD, 0xBACC, 0xB664, /* 0xB0 */
+ 0xD0E3, 0xCBBD, 0xB665, 0xCDBA, 0xB666, 0xB667, 0xB8D1, 0xB668, /* 0xC0 */
+ 0xB669, 0xB1FC, 0xB66A, 0xC7EF, 0xB66B, 0xD6D6, 0xB66C, 0xB66D, /* 0xC0 */
+ 0xB66E, 0xBFC6, 0xC3EB, 0xB66F, 0xB670, 0xEFF5, 0xB671, 0xB672, /* 0xD0 */
+ 0xC3D8, 0xB673, 0xB674, 0xB675, 0xB676, 0xB677, 0xB678, 0xD7E2, /* 0xD0 */
+ 0xB679, 0xB67A, 0xB67B, 0xEFF7, 0xB3D3, 0xB67C, 0xC7D8, 0xD1ED, /* 0xE0 */
+ 0xB67D, 0xD6C8, 0xB67E, 0xEFF8, 0xB680, 0xEFF6, 0xB681, 0xBBFD, /* 0xE0 */
+ 0xB3C6, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686, 0xB687, 0xB688, /* 0xF0 */
+ 0xBDD5, 0xB689, 0xB68A, 0xD2C6, 0xB68B, 0xBBE0, 0xB68C, 0xB68D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFA1, 0xB68E, 0xEFFC, 0xEFFB, 0xB68F, 0xB690, 0xEFF9, 0xB691, /* 0x00 */
+ 0xB692, 0xB693, 0xB694, 0xB3CC, 0xB695, 0xC9D4, 0xCBB0, 0xB696, /* 0x00 */
+ 0xB697, 0xB698, 0xB699, 0xB69A, 0xEFFE, 0xB69B, 0xB69C, 0xB0DE, /* 0x10 */
+ 0xB69D, 0xB69E, 0xD6C9, 0xB69F, 0xB6A0, 0xB740, 0xEFFD, 0xB741, /* 0x10 */
+ 0xB3ED, 0xB742, 0xB743, 0xF6D5, 0xB744, 0xB745, 0xB746, 0xB747, /* 0x20 */
+ 0xB748, 0xB749, 0xB74A, 0xB74B, 0xB74C, 0xB74D, 0xB74E, 0xB74F, /* 0x20 */
+ 0xB750, 0xB751, 0xB752, 0xCEC8, 0xB753, 0xB754, 0xB755, 0xF0A2, /* 0x30 */
+ 0xB756, 0xF0A1, 0xB757, 0xB5BE, 0xBCDA, 0xBBFC, 0xB758, 0xB8E5, /* 0x30 */
+ 0xB759, 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xC4C2, 0xB75F, /* 0x40 */
+ 0xB760, 0xB761, 0xB762, 0xB763, 0xB764, 0xB765, 0xB766, 0xB767, /* 0x40 */
+ 0xB768, 0xF0A3, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xCBEB, /* 0x50 */
+ 0xB76E, 0xB76F, 0xB770, 0xB771, 0xB772, 0xB773, 0xB774, 0xB775, /* 0x50 */
+ 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B, 0xB77C, 0xB77D, /* 0x60 */
+ 0xB77E, 0xB780, 0xB781, 0xB782, 0xB783, 0xB784, 0xB785, 0xB786, /* 0x60 */
+ 0xF0A6, 0xB787, 0xB788, 0xB789, 0xD1A8, 0xB78A, 0xBEBF, 0xC7EE, /* 0x70 */
+ 0xF1B6, 0xF1B7, 0xBFD5, 0xB78B, 0xB78C, 0xB78D, 0xB78E, 0xB4A9, /* 0x70 */
+ 0xF1B8, 0xCDBB, 0xB78F, 0xC7D4, 0xD5AD, 0xB790, 0xF1B9, 0xB791, /* 0x80 */
+ 0xF1BA, 0xB792, 0xB793, 0xB794, 0xB795, 0xC7CF, 0xB796, 0xB797, /* 0x80 */
+ 0xB798, 0xD2A4, 0xD6CF, 0xB799, 0xB79A, 0xF1BB, 0xBDD1, 0xB4B0, /* 0x90 */
+ 0xBEBD, 0xB79B, 0xB79C, 0xB79D, 0xB4DC, 0xCED1, 0xB79E, 0xBFDF, /* 0x90 */
+ 0xF1BD, 0xB79F, 0xB7A0, 0xB840, 0xB841, 0xBFFA, 0xF1BC, 0xB842, /* 0xA0 */
+ 0xF1BF, 0xB843, 0xB844, 0xB845, 0xF1BE, 0xF1C0, 0xB846, 0xB847, /* 0xA0 */
+ 0xB848, 0xB849, 0xB84A, 0xF1C1, 0xB84B, 0xB84C, 0xB84D, 0xB84E, /* 0xB0 */
+ 0xB84F, 0xB850, 0xB851, 0xB852, 0xB853, 0xB854, 0xB855, 0xC1FE, /* 0xB0 */
+ 0xB856, 0xB857, 0xB858, 0xB859, 0xB85A, 0xB85B, 0xB85C, 0xB85D, /* 0xC0 */
+ 0xB85E, 0xB85F, 0xB860, 0xC1A2, 0xB861, 0xB862, 0xB863, 0xB864, /* 0xC0 */
+ 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xCAFA, 0xB86B, /* 0xD0 */
+ 0xB86C, 0xD5BE, 0xB86D, 0xB86E, 0xB86F, 0xB870, 0xBEBA, 0xBEB9, /* 0xD0 */
+ 0xD5C2, 0xB871, 0xB872, 0xBFA2, 0xB873, 0xCDAF, 0xF1B5, 0xB874, /* 0xE0 */
+ 0xB875, 0xB876, 0xB877, 0xB878, 0xB879, 0xBDDF, 0xB87A, 0xB6CB, /* 0xE0 */
+ 0xB87B, 0xB87C, 0xB87D, 0xB87E, 0xB880, 0xB881, 0xB882, 0xB883, /* 0xF0 */
+ 0xB884, 0xD6F1, 0xF3C3, 0xB885, 0xB886, 0xF3C4, 0xB887, 0xB8CD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB888, 0xB889, 0xB88A, 0xF3C6, 0xF3C7, 0xB88B, 0xB0CA, 0xB88C, /* 0x00 */
+ 0xF3C5, 0xB88D, 0xF3C9, 0xCBF1, 0xB88E, 0xB88F, 0xB890, 0xF3CB, /* 0x00 */
+ 0xB891, 0xD0A6, 0xB892, 0xB893, 0xB1CA, 0xF3C8, 0xB894, 0xB895, /* 0x10 */
+ 0xB896, 0xF3CF, 0xB897, 0xB5D1, 0xB898, 0xB899, 0xF3D7, 0xB89A, /* 0x10 */
+ 0xF3D2, 0xB89B, 0xB89C, 0xB89D, 0xF3D4, 0xF3D3, 0xB7FB, 0xB89E, /* 0x20 */
+ 0xB1BF, 0xB89F, 0xF3CE, 0xF3CA, 0xB5DA, 0xB8A0, 0xF3D0, 0xB940, /* 0x20 */
+ 0xB941, 0xF3D1, 0xB942, 0xF3D5, 0xB943, 0xB944, 0xB945, 0xB946, /* 0x30 */
+ 0xF3CD, 0xB947, 0xBCE3, 0xB948, 0xC1FD, 0xB949, 0xF3D6, 0xB94A, /* 0x30 */
+ 0xB94B, 0xB94C, 0xB94D, 0xB94E, 0xB94F, 0xF3DA, 0xB950, 0xF3CC, /* 0x40 */
+ 0xB951, 0xB5C8, 0xB952, 0xBDEE, 0xF3DC, 0xB953, 0xB954, 0xB7A4, /* 0x40 */
+ 0xBFF0, 0xD6FE, 0xCDB2, 0xB955, 0xB4F0, 0xB956, 0xB2DF, 0xB957, /* 0x50 */
+ 0xF3D8, 0xB958, 0xF3D9, 0xC9B8, 0xB959, 0xF3DD, 0xB95A, 0xB95B, /* 0x50 */
+ 0xF3DE, 0xB95C, 0xF3E1, 0xB95D, 0xB95E, 0xB95F, 0xB960, 0xB961, /* 0x60 */
+ 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xF3DF, 0xB968, /* 0x60 */
+ 0xB969, 0xF3E3, 0xF3E2, 0xB96A, 0xB96B, 0xF3DB, 0xB96C, 0xBFEA, /* 0x70 */
+ 0xB96D, 0xB3EF, 0xB96E, 0xF3E0, 0xB96F, 0xB970, 0xC7A9, 0xB971, /* 0x70 */
+ 0xBCF2, 0xB972, 0xB973, 0xB974, 0xB975, 0xF3EB, 0xB976, 0xB977, /* 0x80 */
+ 0xB978, 0xB979, 0xB97A, 0xB97B, 0xB97C, 0xB9BF, 0xB97D, 0xB97E, /* 0x80 */
+ 0xF3E4, 0xB980, 0xB981, 0xB982, 0xB2AD, 0xBBFE, 0xB983, 0xCBE3, /* 0x90 */
+ 0xB984, 0xB985, 0xB986, 0xB987, 0xF3ED, 0xF3E9, 0xB988, 0xB989, /* 0x90 */
+ 0xB98A, 0xB9DC, 0xF3EE, 0xB98B, 0xB98C, 0xB98D, 0xF3E5, 0xF3E6, /* 0xA0 */
+ 0xF3EA, 0xC2E1, 0xF3EC, 0xF3EF, 0xF3E8, 0xBCFD, 0xB98E, 0xB98F, /* 0xA0 */
+ 0xB990, 0xCFE4, 0xB991, 0xB992, 0xF3F0, 0xB993, 0xB994, 0xB995, /* 0xB0 */
+ 0xF3E7, 0xB996, 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, /* 0xB0 */
+ 0xB99D, 0xF3F2, 0xB99E, 0xB99F, 0xB9A0, 0xBA40, 0xD7AD, 0xC6AA, /* 0xC0 */
+ 0xBA41, 0xBA42, 0xBA43, 0xBA44, 0xF3F3, 0xBA45, 0xBA46, 0xBA47, /* 0xC0 */
+ 0xBA48, 0xF3F1, 0xBA49, 0xC2A8, 0xBA4A, 0xBA4B, 0xBA4C, 0xBA4D, /* 0xD0 */
+ 0xBA4E, 0xB8DD, 0xF3F5, 0xBA4F, 0xBA50, 0xF3F4, 0xBA51, 0xBA52, /* 0xD0 */
+ 0xBA53, 0xB4DB, 0xBA54, 0xBA55, 0xBA56, 0xF3F6, 0xF3F7, 0xBA57, /* 0xE0 */
+ 0xBA58, 0xBA59, 0xF3F8, 0xBA5A, 0xBA5B, 0xBA5C, 0xC0BA, 0xBA5D, /* 0xE0 */
+ 0xBA5E, 0xC0E9, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63, 0xC5F1, /* 0xF0 */
+ 0xBA64, 0xBA65, 0xBA66, 0xBA67, 0xF3FB, 0xBA68, 0xF3FA, 0xBA69 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA70, 0xB4D8, /* 0x00 */
+ 0xBA71, 0xBA72, 0xBA73, 0xF3FE, 0xF3F9, 0xBA74, 0xBA75, 0xF3FC, /* 0x00 */
+ 0xBA76, 0xBA77, 0xBA78, 0xBA79, 0xBA7A, 0xBA7B, 0xF3FD, 0xBA7C, /* 0x10 */
+ 0xBA7D, 0xBA7E, 0xBA80, 0xBA81, 0xBA82, 0xBA83, 0xBA84, 0xF4A1, /* 0x10 */
+ 0xBA85, 0xBA86, 0xBA87, 0xBA88, 0xBA89, 0xBA8A, 0xF4A3, 0xBBC9, /* 0x20 */
+ 0xBA8B, 0xBA8C, 0xF4A2, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91, /* 0x20 */
+ 0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99, /* 0x30 */
+ 0xF4A4, 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xB2BE, /* 0x30 */
+ 0xF4A6, 0xF4A5, 0xBAA0, 0xBB40, 0xBB41, 0xBB42, 0xBB43, 0xBB44, /* 0x40 */
+ 0xBB45, 0xBB46, 0xBB47, 0xBB48, 0xBB49, 0xBCAE, 0xBB4A, 0xBB4B, /* 0x40 */
+ 0xBB4C, 0xBB4D, 0xBB4E, 0xBB4F, 0xBB50, 0xBB51, 0xBB52, 0xBB53, /* 0x50 */
+ 0xBB54, 0xBB55, 0xBB56, 0xBB57, 0xBB58, 0xBB59, 0xBB5A, 0xBB5B, /* 0x50 */
+ 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB61, 0xBB62, 0xBB63, /* 0x60 */
+ 0xBB64, 0xBB65, 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, /* 0x60 */
+ 0xBB6C, 0xBB6D, 0xBB6E, 0xC3D7, 0xD9E1, 0xBB6F, 0xBB70, 0xBB71, /* 0x70 */
+ 0xBB72, 0xBB73, 0xBB74, 0xC0E0, 0xF4CC, 0xD7D1, 0xBB75, 0xBB76, /* 0x70 */
+ 0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E, /* 0x80 */
+ 0xBB80, 0xB7DB, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86, /* 0x80 */
+ 0xBB87, 0xF4CE, 0xC1A3, 0xBB88, 0xBB89, 0xC6C9, 0xBB8A, 0xB4D6, /* 0x90 */
+ 0xD5B3, 0xBB8B, 0xBB8C, 0xBB8D, 0xF4D0, 0xF4CF, 0xF4D1, 0xCBDA, /* 0x90 */
+ 0xBB8E, 0xBB8F, 0xF4D2, 0xBB90, 0xD4C1, 0xD6E0, 0xBB91, 0xBB92, /* 0xA0 */
+ 0xBB93, 0xBB94, 0xB7E0, 0xBB95, 0xBB96, 0xBB97, 0xC1B8, 0xBB98, /* 0xA0 */
+ 0xBB99, 0xC1BB, 0xF4D3, 0xBEAC, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, /* 0xB0 */
+ 0xBB9E, 0xB4E2, 0xBB9F, 0xBBA0, 0xF4D4, 0xF4D5, 0xBEAB, 0xBC40, /* 0xB0 */
+ 0xBC41, 0xF4D6, 0xBC42, 0xBC43, 0xBC44, 0xF4DB, 0xBC45, 0xF4D7, /* 0xC0 */
+ 0xF4DA, 0xBC46, 0xBAFD, 0xBC47, 0xF4D8, 0xF4D9, 0xBC48, 0xBC49, /* 0xC0 */
+ 0xBC4A, 0xBC4B, 0xBC4C, 0xBC4D, 0xBC4E, 0xB8E2, 0xCCC7, 0xF4DC, /* 0xD0 */
+ 0xBC4F, 0xB2DA, 0xBC50, 0xBC51, 0xC3D3, 0xBC52, 0xBC53, 0xD4E3, /* 0xD0 */
+ 0xBFB7, 0xBC54, 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, /* 0xE0 */
+ 0xF4DD, 0xBC5B, 0xBC5C, 0xBC5D, 0xBC5E, 0xBC5F, 0xBC60, 0xC5B4, /* 0xE0 */
+ 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65, 0xBC66, 0xBC67, 0xBC68, /* 0xF0 */
+ 0xF4E9, 0xBC69, 0xBC6A, 0xCFB5, 0xBC6B, 0xBC6C, 0xBC6D, 0xBC6E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76, /* 0x00 */
+ 0xBC77, 0xBC78, 0xCEC9, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D, /* 0x00 */
+ 0xBC7E, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC84, 0xBC85, 0xBC86, /* 0x10 */
+ 0xBC87, 0xBC88, 0xBC89, 0xBC8A, 0xBC8B, 0xBC8C, 0xBC8D, 0xBC8E, /* 0x10 */
+ 0xCBD8, 0xBC8F, 0xCBF7, 0xBC90, 0xBC91, 0xBC92, 0xBC93, 0xBDF4, /* 0x20 */
+ 0xBC94, 0xBC95, 0xBC96, 0xD7CF, 0xBC97, 0xBC98, 0xBC99, 0xC0DB, /* 0x20 */
+ 0xBC9A, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA0, 0xBD40, /* 0x30 */
+ 0xBD41, 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD48, /* 0x30 */
+ 0xBD49, 0xBD4A, 0xBD4B, 0xBD4C, 0xBD4D, 0xBD4E, 0xBD4F, 0xBD50, /* 0x40 */
+ 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57, 0xBD58, /* 0x40 */
+ 0xBD59, 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60, /* 0x50 */
+ 0xBD61, 0xBD62, 0xBD63, 0xBD64, 0xBD65, 0xBD66, 0xBD67, 0xBD68, /* 0x50 */
+ 0xBD69, 0xBD6A, 0xBD6B, 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, /* 0x60 */
+ 0xBD71, 0xBD72, 0xBD73, 0xBD74, 0xBD75, 0xBD76, 0xD0F5, 0xBD77, /* 0x60 */
+ 0xBD78, 0xBD79, 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D, 0xBD7E, 0xF4EA, /* 0x70 */
+ 0xBD80, 0xBD81, 0xBD82, 0xBD83, 0xBD84, 0xBD85, 0xBD86, 0xBD87, /* 0x70 */
+ 0xBD88, 0xBD89, 0xBD8A, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, /* 0x80 */
+ 0xBD90, 0xBD91, 0xBD92, 0xBD93, 0xBD94, 0xBD95, 0xBD96, 0xBD97, /* 0x80 */
+ 0xBD98, 0xBD99, 0xBD9A, 0xBD9B, 0xBD9C, 0xBD9D, 0xBD9E, 0xBD9F, /* 0x90 */
+ 0xBDA0, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE44, 0xBE45, 0xBE46, /* 0x90 */
+ 0xBE47, 0xBE48, 0xBE49, 0xBE4A, 0xBE4B, 0xBE4C, 0xF4EB, 0xBE4D, /* 0xA0 */
+ 0xBE4E, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53, 0xF4EC, 0xBE54, /* 0xA0 */
+ 0xBE55, 0xBE56, 0xBE57, 0xBE58, 0xBE59, 0xBE5A, 0xBE5B, 0xBE5C, /* 0xB0 */
+ 0xBE5D, 0xBE5E, 0xBE5F, 0xBE60, 0xBE61, 0xBE62, 0xBE63, 0xBE64, /* 0xB0 */
+ 0xBE65, 0xBE66, 0xBE67, 0xBE68, 0xBE69, 0xBE6A, 0xBE6B, 0xBE6C, /* 0xC0 */
+ 0xBE6D, 0xBE6E, 0xBE6F, 0xBE70, 0xBE71, 0xBE72, 0xBE73, 0xBE74, /* 0xC0 */
+ 0xBE75, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7B, 0xBE7C, /* 0xD0 */
+ 0xBE7D, 0xBE7E, 0xBE80, 0xBE81, 0xBE82, 0xBE83, 0xBE84, 0xBE85, /* 0xD0 */
+ 0xBE86, 0xBE87, 0xBE88, 0xBE89, 0xBE8A, 0xBE8B, 0xBE8C, 0xBE8D, /* 0xE0 */
+ 0xBE8E, 0xBE8F, 0xBE90, 0xBE91, 0xBE92, 0xBE93, 0xBE94, 0xBE95, /* 0xE0 */
+ 0xBE96, 0xBE97, 0xBE98, 0xBE99, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, /* 0xF0 */
+ 0xBE9E, 0xBE9F, 0xBEA0, 0xBF40, 0xBF41, 0xBF42, 0xBF43, 0xBF44 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBF45, 0xBF46, 0xBF47, 0xBF48, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, /* 0x00 */
+ 0xBF4D, 0xBF4E, 0xBF4F, 0xBF50, 0xBF51, 0xBF52, 0xBF53, 0xBF54, /* 0x00 */
+ 0xBF55, 0xBF56, 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, 0xBF5C, /* 0x10 */
+ 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62, 0xBF63, 0xBF64, /* 0x10 */
+ 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69, 0xBF6A, 0xBF6B, 0xBF6C, /* 0x20 */
+ 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71, 0xBF72, 0xBF73, 0xBF74, /* 0x20 */
+ 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79, 0xBF7A, 0xBF7B, 0xBF7C, /* 0x30 */
+ 0xBF7D, 0xBF7E, 0xBF80, 0xF7E3, 0xBF81, 0xBF82, 0xBF83, 0xBF84, /* 0x30 */
+ 0xBF85, 0xB7B1, 0xBF86, 0xBF87, 0xBF88, 0xBF89, 0xBF8A, 0xF4ED, /* 0x40 */
+ 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91, 0xBF92, /* 0x40 */
+ 0xBF93, 0xBF94, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A, /* 0x50 */
+ 0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xC040, 0xC041, /* 0x50 */
+ 0xC042, 0xC043, 0xC044, 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, /* 0x60 */
+ 0xC04A, 0xC04B, 0xC04C, 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC051, /* 0x60 */
+ 0xC052, 0xC053, 0xC054, 0xC055, 0xC056, 0xC057, 0xC058, 0xC059, /* 0x70 */
+ 0xC05A, 0xC05B, 0xC05C, 0xC05D, 0xC05E, 0xC05F, 0xC060, 0xC061, /* 0x70 */
+ 0xC062, 0xC063, 0xD7EB, 0xC064, 0xC065, 0xC066, 0xC067, 0xC068, /* 0x80 */
+ 0xC069, 0xC06A, 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, /* 0x80 */
+ 0xC071, 0xC072, 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, /* 0x90 */
+ 0xC079, 0xC07A, 0xC07B, 0xF4EE, 0xC07C, 0xC07D, 0xC07E, 0xE6F9, /* 0x90 */
+ 0xBEC0, 0xE6FA, 0xBAEC, 0xE6FB, 0xCFCB, 0xE6FC, 0xD4BC, 0xBCB6, /* 0xA0 */
+ 0xE6FD, 0xE6FE, 0xBCCD, 0xC8D2, 0xCEB3, 0xE7A1, 0xC080, 0xB4BF, /* 0xA0 */
+ 0xE7A2, 0xC9B4, 0xB8D9, 0xC4C9, 0xC081, 0xD7DD, 0xC2DA, 0xB7D7, /* 0xB0 */
+ 0xD6BD, 0xCEC6, 0xB7C4, 0xC082, 0xC083, 0xC5A6, 0xE7A3, 0xCFDF, /* 0xB0 */
+ 0xE7A4, 0xE7A5, 0xE7A6, 0xC1B7, 0xD7E9, 0xC9F0, 0xCFB8, 0xD6AF, /* 0xC0 */
+ 0xD6D5, 0xE7A7, 0xB0ED, 0xE7A8, 0xE7A9, 0xC9DC, 0xD2EF, 0xBEAD, /* 0xC0 */
+ 0xE7AA, 0xB0F3, 0xC8DE, 0xBDE1, 0xE7AB, 0xC8C6, 0xC084, 0xE7AC, /* 0xD0 */
+ 0xBBE6, 0xB8F8, 0xD1A4, 0xE7AD, 0xC2E7, 0xBEF8, 0xBDCA, 0xCDB3, /* 0xD0 */
+ 0xE7AE, 0xE7AF, 0xBEEE, 0xD0E5, 0xC085, 0xCBE7, 0xCCD0, 0xBCCC, /* 0xE0 */
+ 0xE7B0, 0xBCA8, 0xD0F7, 0xE7B1, 0xC086, 0xD0F8, 0xE7B2, 0xE7B3, /* 0xE0 */
+ 0xB4C2, 0xE7B4, 0xE7B5, 0xC9FE, 0xCEAC, 0xC3E0, 0xE7B7, 0xB1C1, /* 0xF0 */
+ 0xB3F1, 0xC087, 0xE7B8, 0xE7B9, 0xD7DB, 0xD5C0, 0xE7BA, 0xC2CC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7BA, 0xE7BB, 0xE7BC, 0xE7BD, 0xBCEA, 0xC3E5, 0xC0C2, 0xE7BE, /* 0x00 */
+ 0xE7BF, 0xBCA9, 0xC088, 0xE7C0, 0xE7C1, 0xE7B6, 0xB6D0, 0xE7C2, /* 0x00 */
+ 0xC089, 0xE7C3, 0xE7C4, 0xBBBA, 0xB5DE, 0xC2C6, 0xB1E0, 0xE7C5, /* 0x10 */
+ 0xD4B5, 0xE7C6, 0xB8BF, 0xE7C8, 0xE7C7, 0xB7EC, 0xC08A, 0xE7C9, /* 0x10 */
+ 0xB2F8, 0xE7CA, 0xE7CB, 0xE7CC, 0xE7CD, 0xE7CE, 0xE7CF, 0xE7D0, /* 0x20 */
+ 0xD3A7, 0xCBF5, 0xE7D1, 0xE7D2, 0xE7D3, 0xE7D4, 0xC9C9, 0xE7D5, /* 0x20 */
+ 0xE7D6, 0xE7D7, 0xE7D8, 0xE7D9, 0xBDC9, 0xE7DA, 0xF3BE, 0xC08B, /* 0x30 */
+ 0xB8D7, 0xC08C, 0xC8B1, 0xC08D, 0xC08E, 0xC08F, 0xC090, 0xC091, /* 0x30 */
+ 0xC092, 0xC093, 0xF3BF, 0xC094, 0xF3C0, 0xF3C1, 0xC095, 0xC096, /* 0x40 */
+ 0xC097, 0xC098, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E, /* 0x40 */
+ 0xB9DE, 0xCDF8, 0xC09F, 0xC0A0, 0xD8E8, 0xBAB1, 0xC140, 0xC2DE, /* 0x50 */
+ 0xEEB7, 0xC141, 0xB7A3, 0xC142, 0xC143, 0xC144, 0xC145, 0xEEB9, /* 0x50 */
+ 0xC146, 0xEEB8, 0xB0D5, 0xC147, 0xC148, 0xC149, 0xC14A, 0xC14B, /* 0x60 */
+ 0xEEBB, 0xD5D6, 0xD7EF, 0xC14C, 0xC14D, 0xC14E, 0xD6C3, 0xC14F, /* 0x60 */
+ 0xC150, 0xEEBD, 0xCAF0, 0xC151, 0xEEBC, 0xC152, 0xC153, 0xC154, /* 0x70 */
+ 0xC155, 0xEEBE, 0xC156, 0xC157, 0xC158, 0xC159, 0xEEC0, 0xC15A, /* 0x70 */
+ 0xC15B, 0xEEBF, 0xC15C, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, /* 0x80 */
+ 0xC162, 0xC163, 0xD1F2, 0xC164, 0xC7BC, 0xC165, 0xC3C0, 0xC166, /* 0x80 */
+ 0xC167, 0xC168, 0xC169, 0xC16A, 0xB8E1, 0xC16B, 0xC16C, 0xC16D, /* 0x90 */
+ 0xC16E, 0xC16F, 0xC1E7, 0xC170, 0xC171, 0xF4C6, 0xD0DF, 0xF4C7, /* 0x90 */
+ 0xC172, 0xCFDB, 0xC173, 0xC174, 0xC8BA, 0xC175, 0xC176, 0xF4C8, /* 0xA0 */
+ 0xC177, 0xC178, 0xC179, 0xC17A, 0xC17B, 0xC17C, 0xC17D, 0xF4C9, /* 0xA0 */
+ 0xF4CA, 0xC17E, 0xF4CB, 0xC180, 0xC181, 0xC182, 0xC183, 0xC184, /* 0xB0 */
+ 0xD9FA, 0xB8FE, 0xC185, 0xC186, 0xE5F1, 0xD3F0, 0xC187, 0xF4E0, /* 0xB0 */
+ 0xC188, 0xCECC, 0xC189, 0xC18A, 0xC18B, 0xB3E1, 0xC18C, 0xC18D, /* 0xC0 */
+ 0xC18E, 0xC18F, 0xF1B4, 0xC190, 0xD2EE, 0xC191, 0xF4E1, 0xC192, /* 0xC0 */
+ 0xC193, 0xC194, 0xC195, 0xC196, 0xCFE8, 0xF4E2, 0xC197, 0xC198, /* 0xD0 */
+ 0xC7CC, 0xC199, 0xC19A, 0xC19B, 0xC19C, 0xC19D, 0xC19E, 0xB5D4, /* 0xD0 */
+ 0xB4E4, 0xF4E4, 0xC19F, 0xC1A0, 0xC240, 0xF4E3, 0xF4E5, 0xC241, /* 0xE0 */
+ 0xC242, 0xF4E6, 0xC243, 0xC244, 0xC245, 0xC246, 0xF4E7, 0xC247, /* 0xE0 */
+ 0xBAB2, 0xB0BF, 0xC248, 0xF4E8, 0xC249, 0xC24A, 0xC24B, 0xC24C, /* 0xF0 */
+ 0xC24D, 0xC24E, 0xC24F, 0xB7AD, 0xD2ED, 0xC250, 0xC251, 0xC252 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2AB, 0xC0CF, 0xC253, 0xBFBC, 0xEBA3, 0xD5DF, 0xEAC8, 0xC254, /* 0x00 */
+ 0xC255, 0xC256, 0xC257, 0xF1F3, 0xB6F8, 0xCBA3, 0xC258, 0xC259, /* 0x00 */
+ 0xC4CD, 0xC25A, 0xF1E7, 0xC25B, 0xF1E8, 0xB8FB, 0xF1E9, 0xBAC4, /* 0x10 */
+ 0xD4C5, 0xB0D2, 0xC25C, 0xC25D, 0xF1EA, 0xC25E, 0xC25F, 0xC260, /* 0x10 */
+ 0xF1EB, 0xC261, 0xF1EC, 0xC262, 0xC263, 0xF1ED, 0xF1EE, 0xF1EF, /* 0x20 */
+ 0xF1F1, 0xF1F0, 0xC5D5, 0xC264, 0xC265, 0xC266, 0xC267, 0xC268, /* 0x20 */
+ 0xC269, 0xF1F2, 0xC26A, 0xB6FA, 0xC26B, 0xF1F4, 0xD2AE, 0xDEC7, /* 0x30 */
+ 0xCBCA, 0xC26C, 0xC26D, 0xB3DC, 0xC26E, 0xB5A2, 0xC26F, 0xB9A2, /* 0x30 */
+ 0xC270, 0xC271, 0xC4F4, 0xF1F5, 0xC272, 0xC273, 0xF1F6, 0xC274, /* 0x40 */
+ 0xC275, 0xC276, 0xC1C4, 0xC1FB, 0xD6B0, 0xF1F7, 0xC277, 0xC278, /* 0x40 */
+ 0xC279, 0xC27A, 0xF1F8, 0xC27B, 0xC1AA, 0xC27C, 0xC27D, 0xC27E, /* 0x50 */
+ 0xC6B8, 0xC280, 0xBEDB, 0xC281, 0xC282, 0xC283, 0xC284, 0xC285, /* 0x50 */
+ 0xC286, 0xC287, 0xC288, 0xC289, 0xC28A, 0xC28B, 0xC28C, 0xC28D, /* 0x60 */
+ 0xC28E, 0xF1F9, 0xB4CF, 0xC28F, 0xC290, 0xC291, 0xC292, 0xC293, /* 0x60 */
+ 0xC294, 0xF1FA, 0xC295, 0xC296, 0xC297, 0xC298, 0xC299, 0xC29A, /* 0x70 */
+ 0xC29B, 0xC29C, 0xC29D, 0xC29E, 0xC29F, 0xC2A0, 0xC340, 0xEDB2, /* 0x70 */
+ 0xEDB1, 0xC341, 0xC342, 0xCBE0, 0xD2DE, 0xC343, 0xCBC1, 0xD5D8, /* 0x80 */
+ 0xC344, 0xC8E2, 0xC345, 0xC0DF, 0xBCA1, 0xC346, 0xC347, 0xC348, /* 0x80 */
+ 0xC349, 0xC34A, 0xC34B, 0xEBC1, 0xC34C, 0xC34D, 0xD0A4, 0xC34E, /* 0x90 */
+ 0xD6E2, 0xC34F, 0xB6C7, 0xB8D8, 0xEBC0, 0xB8CE, 0xC350, 0xEBBF, /* 0x90 */
+ 0xB3A6, 0xB9C9, 0xD6AB, 0xC351, 0xB7F4, 0xB7CA, 0xC352, 0xC353, /* 0xA0 */
+ 0xC354, 0xBCE7, 0xB7BE, 0xEBC6, 0xC355, 0xEBC7, 0xB0B9, 0xBFCF, /* 0xA0 */
+ 0xC356, 0xEBC5, 0xD3FD, 0xC357, 0xEBC8, 0xC358, 0xC359, 0xEBC9, /* 0xB0 */
+ 0xC35A, 0xC35B, 0xB7CE, 0xC35C, 0xEBC2, 0xEBC4, 0xC9F6, 0xD6D7, /* 0xB0 */
+ 0xD5CD, 0xD0B2, 0xEBCF, 0xCEB8, 0xEBD0, 0xC35D, 0xB5A8, 0xC35E, /* 0xC0 */
+ 0xC35F, 0xC360, 0xC361, 0xC362, 0xB1B3, 0xEBD2, 0xCCA5, 0xC363, /* 0xC0 */
+ 0xC364, 0xC365, 0xC366, 0xC367, 0xC368, 0xC369, 0xC5D6, 0xEBD3, /* 0xD0 */
+ 0xC36A, 0xEBD1, 0xC5DF, 0xEBCE, 0xCAA4, 0xEBD5, 0xB0FB, 0xC36B, /* 0xD0 */
+ 0xC36C, 0xBAFA, 0xC36D, 0xC36E, 0xD8B7, 0xF1E3, 0xC36F, 0xEBCA, /* 0xE0 */
+ 0xEBCB, 0xEBCC, 0xEBCD, 0xEBD6, 0xE6C0, 0xEBD9, 0xC370, 0xBFE8, /* 0xE0 */
+ 0xD2C8, 0xEBD7, 0xEBDC, 0xB8EC, 0xEBD8, 0xC371, 0xBDBA, 0xC372, /* 0xF0 */
+ 0xD0D8, 0xC373, 0xB0B7, 0xC374, 0xEBDD, 0xC4DC, 0xC375, 0xC376 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC377, 0xC378, 0xD6AC, 0xC379, 0xC37A, 0xC37B, 0xB4E0, 0xC37C, /* 0x00 */
+ 0xC37D, 0xC2F6, 0xBCB9, 0xC37E, 0xC380, 0xEBDA, 0xEBDB, 0xD4E0, /* 0x00 */
+ 0xC6EA, 0xC4D4, 0xEBDF, 0xC5A7, 0xD9F5, 0xC381, 0xB2B1, 0xC382, /* 0x10 */
+ 0xEBE4, 0xC383, 0xBDC5, 0xC384, 0xC385, 0xC386, 0xEBE2, 0xC387, /* 0x10 */
+ 0xC388, 0xC389, 0xC38A, 0xC38B, 0xC38C, 0xC38D, 0xC38E, 0xC38F, /* 0x20 */
+ 0xC390, 0xC391, 0xC392, 0xC393, 0xEBE3, 0xC394, 0xC395, 0xB8AC, /* 0x20 */
+ 0xC396, 0xCDD1, 0xEBE5, 0xC397, 0xC398, 0xC399, 0xEBE1, 0xC39A, /* 0x30 */
+ 0xC1B3, 0xC39B, 0xC39C, 0xC39D, 0xC39E, 0xC39F, 0xC6A2, 0xC3A0, /* 0x30 */
+ 0xC440, 0xC441, 0xC442, 0xC443, 0xC444, 0xC445, 0xCCF3, 0xC446, /* 0x40 */
+ 0xEBE6, 0xC447, 0xC0B0, 0xD2B8, 0xEBE7, 0xC448, 0xC449, 0xC44A, /* 0x40 */
+ 0xB8AF, 0xB8AD, 0xC44B, 0xEBE8, 0xC7BB, 0xCDF3, 0xC44C, 0xC44D, /* 0x50 */
+ 0xC44E, 0xEBEA, 0xEBEB, 0xC44F, 0xC450, 0xC451, 0xC452, 0xC453, /* 0x50 */
+ 0xEBED, 0xC454, 0xC455, 0xC456, 0xC457, 0xD0C8, 0xC458, 0xEBF2, /* 0x60 */
+ 0xC459, 0xEBEE, 0xC45A, 0xC45B, 0xC45C, 0xEBF1, 0xC8F9, 0xC45D, /* 0x60 */
+ 0xD1FC, 0xEBEC, 0xC45E, 0xC45F, 0xEBE9, 0xC460, 0xC461, 0xC462, /* 0x70 */
+ 0xC463, 0xB8B9, 0xCFD9, 0xC4E5, 0xEBEF, 0xEBF0, 0xCCDA, 0xCDC8, /* 0x70 */
+ 0xB0F2, 0xC464, 0xEBF6, 0xC465, 0xC466, 0xC467, 0xC468, 0xC469, /* 0x80 */
+ 0xEBF5, 0xC46A, 0xB2B2, 0xC46B, 0xC46C, 0xC46D, 0xC46E, 0xB8E0, /* 0x80 */
+ 0xC46F, 0xEBF7, 0xC470, 0xC471, 0xC472, 0xC473, 0xC474, 0xC475, /* 0x90 */
+ 0xB1EC, 0xC476, 0xC477, 0xCCC5, 0xC4A4, 0xCFA5, 0xC478, 0xC479, /* 0x90 */
+ 0xC47A, 0xC47B, 0xC47C, 0xEBF9, 0xC47D, 0xC47E, 0xECA2, 0xC480, /* 0xA0 */
+ 0xC5F2, 0xC481, 0xEBFA, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486, /* 0xA0 */
+ 0xC487, 0xC488, 0xC489, 0xC9C5, 0xC48A, 0xC48B, 0xC48C, 0xC48D, /* 0xB0 */
+ 0xC48E, 0xC48F, 0xE2DF, 0xEBFE, 0xC490, 0xC491, 0xC492, 0xC493, /* 0xB0 */
+ 0xCDCE, 0xECA1, 0xB1DB, 0xD3B7, 0xC494, 0xC495, 0xD2DC, 0xC496, /* 0xC0 */
+ 0xC497, 0xC498, 0xEBFD, 0xC499, 0xEBFB, 0xC49A, 0xC49B, 0xC49C, /* 0xC0 */
+ 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC540, 0xC541, 0xC542, 0xC543, /* 0xD0 */
+ 0xC544, 0xC545, 0xC546, 0xC547, 0xC548, 0xC549, 0xC54A, 0xC54B, /* 0xD0 */
+ 0xC54C, 0xC54D, 0xC54E, 0xB3BC, 0xC54F, 0xC550, 0xC551, 0xEAB0, /* 0xE0 */
+ 0xC552, 0xC553, 0xD7D4, 0xC554, 0xF4AB, 0xB3F4, 0xC555, 0xC556, /* 0xE0 */
+ 0xC557, 0xC558, 0xC559, 0xD6C1, 0xD6C2, 0xC55A, 0xC55B, 0xC55C, /* 0xF0 */
+ 0xC55D, 0xC55E, 0xC55F, 0xD5E9, 0xBECA, 0xC560, 0xF4A7, 0xC561 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2A8, 0xF4A8, 0xF4A9, 0xC562, 0xF4AA, 0xBECB, 0xD3DF, 0xC563, /* 0x00 */
+ 0xC564, 0xC565, 0xC566, 0xC567, 0xC9E0, 0xC9E1, 0xC568, 0xC569, /* 0x00 */
+ 0xF3C2, 0xC56A, 0xCAE6, 0xC56B, 0xCCF2, 0xC56C, 0xC56D, 0xC56E, /* 0x10 */
+ 0xC56F, 0xC570, 0xC571, 0xE2B6, 0xCBB4, 0xC572, 0xCEE8, 0xD6DB, /* 0x10 */
+ 0xC573, 0xF4AD, 0xF4AE, 0xF4AF, 0xC574, 0xC575, 0xC576, 0xC577, /* 0x20 */
+ 0xF4B2, 0xC578, 0xBABD, 0xF4B3, 0xB0E3, 0xF4B0, 0xC579, 0xF4B1, /* 0x20 */
+ 0xBDA2, 0xB2D5, 0xC57A, 0xF4B6, 0xF4B7, 0xB6E6, 0xB2B0, 0xCFCF, /* 0x30 */
+ 0xF4B4, 0xB4AC, 0xC57B, 0xF4B5, 0xC57C, 0xC57D, 0xF4B8, 0xC57E, /* 0x30 */
+ 0xC580, 0xC581, 0xC582, 0xC583, 0xF4B9, 0xC584, 0xC585, 0xCDA7, /* 0x40 */
+ 0xC586, 0xF4BA, 0xC587, 0xF4BB, 0xC588, 0xC589, 0xC58A, 0xF4BC, /* 0x40 */
+ 0xC58B, 0xC58C, 0xC58D, 0xC58E, 0xC58F, 0xC590, 0xC591, 0xC592, /* 0x50 */
+ 0xCBD2, 0xC593, 0xF4BD, 0xC594, 0xC595, 0xC596, 0xC597, 0xF4BE, /* 0x50 */
+ 0xC598, 0xC599, 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC59E, 0xC59F, /* 0x60 */
+ 0xF4BF, 0xC5A0, 0xC640, 0xC641, 0xC642, 0xC643, 0xF4DE, 0xC1BC, /* 0x60 */
+ 0xBCE8, 0xC644, 0xC9AB, 0xD1DE, 0xE5F5, 0xC645, 0xC646, 0xC647, /* 0x70 */
+ 0xC648, 0xDCB3, 0xD2D5, 0xC649, 0xC64A, 0xDCB4, 0xB0AC, 0xDCB5, /* 0x70 */
+ 0xC64B, 0xC64C, 0xBDDA, 0xC64D, 0xDCB9, 0xC64E, 0xC64F, 0xC650, /* 0x80 */
+ 0xD8C2, 0xC651, 0xDCB7, 0xD3F3, 0xC652, 0xC9D6, 0xDCBA, 0xDCB6, /* 0x80 */
+ 0xC653, 0xDCBB, 0xC3A2, 0xC654, 0xC655, 0xC656, 0xC657, 0xDCBC, /* 0x90 */
+ 0xDCC5, 0xDCBD, 0xC658, 0xC659, 0xCEDF, 0xD6A5, 0xC65A, 0xDCCF, /* 0x90 */
+ 0xC65B, 0xDCCD, 0xC65C, 0xC65D, 0xDCD2, 0xBDE6, 0xC2AB, 0xC65E, /* 0xA0 */
+ 0xDCB8, 0xDCCB, 0xDCCE, 0xDCBE, 0xB7D2, 0xB0C5, 0xDCC7, 0xD0BE, /* 0xA0 */
+ 0xDCC1, 0xBBA8, 0xC65F, 0xB7BC, 0xDCCC, 0xC660, 0xC661, 0xDCC6, /* 0xB0 */
+ 0xDCBF, 0xC7DB, 0xC662, 0xC663, 0xC664, 0xD1BF, 0xDCC0, 0xC665, /* 0xB0 */
+ 0xC666, 0xDCCA, 0xC667, 0xC668, 0xDCD0, 0xC669, 0xC66A, 0xCEAD, /* 0xC0 */
+ 0xDCC2, 0xC66B, 0xDCC3, 0xDCC8, 0xDCC9, 0xB2D4, 0xDCD1, 0xCBD5, /* 0xC0 */
+ 0xC66C, 0xD4B7, 0xDCDB, 0xDCDF, 0xCCA6, 0xDCE6, 0xC66D, 0xC3E7, /* 0xD0 */
+ 0xDCDC, 0xC66E, 0xC66F, 0xBFC1, 0xDCD9, 0xC670, 0xB0FA, 0xB9B6, /* 0xD0 */
+ 0xDCE5, 0xDCD3, 0xC671, 0xDCC4, 0xDCD6, 0xC8F4, 0xBFE0, 0xC672, /* 0xE0 */
+ 0xC673, 0xC674, 0xC675, 0xC9BB, 0xC676, 0xC677, 0xC678, 0xB1BD, /* 0xE0 */
+ 0xC679, 0xD3A2, 0xC67A, 0xC67B, 0xDCDA, 0xC67C, 0xC67D, 0xDCD5, /* 0xF0 */
+ 0xC67E, 0xC6BB, 0xC680, 0xDCDE, 0xC681, 0xC682, 0xC683, 0xC684 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC685, 0xD7C2, 0xC3AF, 0xB7B6, 0xC7D1, 0xC3A9, 0xDCE2, 0xDCD8, /* 0x00 */
+ 0xDCEB, 0xDCD4, 0xC686, 0xC687, 0xDCDD, 0xC688, 0xBEA5, 0xDCD7, /* 0x00 */
+ 0xC689, 0xDCE0, 0xC68A, 0xC68B, 0xDCE3, 0xDCE4, 0xC68C, 0xDCF8, /* 0x10 */
+ 0xC68D, 0xC68E, 0xDCE1, 0xDDA2, 0xDCE7, 0xC68F, 0xC690, 0xC691, /* 0x10 */
+ 0xC692, 0xC693, 0xC694, 0xC695, 0xC696, 0xC697, 0xC698, 0xBCEB, /* 0x20 */
+ 0xB4C4, 0xC699, 0xC69A, 0xC3A3, 0xB2E7, 0xDCFA, 0xC69B, 0xDCF2, /* 0x20 */
+ 0xC69C, 0xDCEF, 0xC69D, 0xDCFC, 0xDCEE, 0xD2F0, 0xB2E8, 0xC69E, /* 0x30 */
+ 0xC8D7, 0xC8E3, 0xDCFB, 0xC69F, 0xDCED, 0xC6A0, 0xC740, 0xC741, /* 0x30 */
+ 0xDCF7, 0xC742, 0xC743, 0xDCF5, 0xC744, 0xC745, 0xBEA3, 0xDCF4, /* 0x40 */
+ 0xC746, 0xB2DD, 0xC747, 0xC748, 0xC749, 0xC74A, 0xC74B, 0xDCF3, /* 0x40 */
+ 0xBCF6, 0xDCE8, 0xBBC4, 0xC74C, 0xC0F3, 0xC74D, 0xC74E, 0xC74F, /* 0x50 */
+ 0xC750, 0xC751, 0xBCD4, 0xDCE9, 0xDCEA, 0xC752, 0xDCF1, 0xDCF6, /* 0x50 */
+ 0xDCF9, 0xB5B4, 0xC753, 0xC8D9, 0xBBE7, 0xDCFE, 0xDCFD, 0xD3AB, /* 0x60 */
+ 0xDDA1, 0xDDA3, 0xDDA5, 0xD2F1, 0xDDA4, 0xDDA6, 0xDDA7, 0xD2A9, /* 0x60 */
+ 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC759, 0xC75A, 0xBAC9, /* 0x70 */
+ 0xDDA9, 0xC75B, 0xC75C, 0xDDB6, 0xDDB1, 0xDDB4, 0xC75D, 0xC75E, /* 0x70 */
+ 0xC75F, 0xC760, 0xC761, 0xC762, 0xC763, 0xDDB0, 0xC6CE, 0xC764, /* 0x80 */
+ 0xC765, 0xC0F2, 0xC766, 0xC767, 0xC768, 0xC769, 0xC9AF, 0xC76A, /* 0x80 */
+ 0xC76B, 0xC76C, 0xDCEC, 0xDDAE, 0xC76D, 0xC76E, 0xC76F, 0xC770, /* 0x90 */
+ 0xDDB7, 0xC771, 0xC772, 0xDCF0, 0xDDAF, 0xC773, 0xDDB8, 0xC774, /* 0x90 */
+ 0xDDAC, 0xC775, 0xC776, 0xC777, 0xC778, 0xC779, 0xC77A, 0xC77B, /* 0xA0 */
+ 0xDDB9, 0xDDB3, 0xDDAD, 0xC4AA, 0xC77C, 0xC77D, 0xC77E, 0xC780, /* 0xA0 */
+ 0xDDA8, 0xC0B3, 0xC1AB, 0xDDAA, 0xDDAB, 0xC781, 0xDDB2, 0xBBF1, /* 0xB0 */
+ 0xDDB5, 0xD3A8, 0xDDBA, 0xC782, 0xDDBB, 0xC3A7, 0xC783, 0xC784, /* 0xB0 */
+ 0xDDD2, 0xDDBC, 0xC785, 0xC786, 0xC787, 0xDDD1, 0xC788, 0xB9BD, /* 0xC0 */
+ 0xC789, 0xC78A, 0xBED5, 0xC78B, 0xBEFA, 0xC78C, 0xC78D, 0xBACA, /* 0xC0 */
+ 0xC78E, 0xC78F, 0xC790, 0xC791, 0xDDCA, 0xC792, 0xDDC5, 0xC793, /* 0xD0 */
+ 0xDDBF, 0xC794, 0xC795, 0xC796, 0xB2CB, 0xDDC3, 0xC797, 0xDDCB, /* 0xD0 */
+ 0xB2A4, 0xDDD5, 0xC798, 0xC799, 0xC79A, 0xDDBE, 0xC79B, 0xC79C, /* 0xE0 */
+ 0xC79D, 0xC6D0, 0xDDD0, 0xC79E, 0xC79F, 0xC7A0, 0xC840, 0xC841, /* 0xE0 */
+ 0xDDD4, 0xC1E2, 0xB7C6, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, /* 0xF0 */
+ 0xDDCE, 0xDDCF, 0xC847, 0xC848, 0xC849, 0xDDC4, 0xC84A, 0xC84B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC84C, 0xDDBD, 0xC84D, 0xDDCD, 0xCCD1, 0xC84E, 0xDDC9, 0xC84F, /* 0x00 */
+ 0xC850, 0xC851, 0xC852, 0xDDC2, 0xC3C8, 0xC6BC, 0xCEAE, 0xDDCC, /* 0x00 */
+ 0xC853, 0xDDC8, 0xC854, 0xC855, 0xC856, 0xC857, 0xC858, 0xC859, /* 0x10 */
+ 0xDDC1, 0xC85A, 0xC85B, 0xC85C, 0xDDC6, 0xC2DC, 0xC85D, 0xC85E, /* 0x10 */
+ 0xC85F, 0xC860, 0xC861, 0xC862, 0xD3A9, 0xD3AA, 0xDDD3, 0xCFF4, /* 0x20 */
+ 0xC8F8, 0xC863, 0xC864, 0xC865, 0xC866, 0xC867, 0xC868, 0xC869, /* 0x20 */
+ 0xC86A, 0xDDE6, 0xC86B, 0xC86C, 0xC86D, 0xC86E, 0xC86F, 0xC870, /* 0x30 */
+ 0xDDC7, 0xC871, 0xC872, 0xC873, 0xDDE0, 0xC2E4, 0xC874, 0xC875, /* 0x30 */
+ 0xC876, 0xC877, 0xC878, 0xC879, 0xC87A, 0xC87B, 0xDDE1, 0xC87C, /* 0x40 */
+ 0xC87D, 0xC87E, 0xC880, 0xC881, 0xC882, 0xC883, 0xC884, 0xC885, /* 0x40 */
+ 0xC886, 0xDDD7, 0xC887, 0xC888, 0xC889, 0xC88A, 0xC88B, 0xD6F8, /* 0x50 */
+ 0xC88C, 0xDDD9, 0xDDD8, 0xB8F0, 0xDDD6, 0xC88D, 0xC88E, 0xC88F, /* 0x50 */
+ 0xC890, 0xC6CF, 0xC891, 0xB6AD, 0xC892, 0xC893, 0xC894, 0xC895, /* 0x60 */
+ 0xC896, 0xDDE2, 0xC897, 0xBAF9, 0xD4E1, 0xDDE7, 0xC898, 0xC899, /* 0x60 */
+ 0xC89A, 0xB4D0, 0xC89B, 0xDDDA, 0xC89C, 0xBFFB, 0xDDE3, 0xC89D, /* 0x70 */
+ 0xDDDF, 0xC89E, 0xDDDD, 0xC89F, 0xC8A0, 0xC940, 0xC941, 0xC942, /* 0x70 */
+ 0xC943, 0xC944, 0xB5D9, 0xC945, 0xC946, 0xC947, 0xC948, 0xDDDB, /* 0x80 */
+ 0xDDDC, 0xDDDE, 0xC949, 0xBDAF, 0xDDE4, 0xC94A, 0xDDE5, 0xC94B, /* 0x80 */
+ 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC950, 0xC951, 0xC952, 0xDDF5, /* 0x90 */
+ 0xC953, 0xC3C9, 0xC954, 0xC955, 0xCBE2, 0xC956, 0xC957, 0xC958, /* 0x90 */
+ 0xC959, 0xDDF2, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E, 0xC95F, /* 0xA0 */
+ 0xC960, 0xC961, 0xC962, 0xC963, 0xC964, 0xC965, 0xC966, 0xD8E1, /* 0xA0 */
+ 0xC967, 0xC968, 0xC6D1, 0xC969, 0xDDF4, 0xC96A, 0xC96B, 0xC96C, /* 0xB0 */
+ 0xD5F4, 0xDDF3, 0xDDF0, 0xC96D, 0xC96E, 0xDDEC, 0xC96F, 0xDDEF, /* 0xB0 */
+ 0xC970, 0xDDE8, 0xC971, 0xC972, 0xD0EE, 0xC973, 0xC974, 0xC975, /* 0xC0 */
+ 0xC976, 0xC8D8, 0xDDEE, 0xC977, 0xC978, 0xDDE9, 0xC979, 0xC97A, /* 0xC0 */
+ 0xDDEA, 0xCBF2, 0xC97B, 0xDDED, 0xC97C, 0xC97D, 0xB1CD, 0xC97E, /* 0xD0 */
+ 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC0B6, 0xC985, 0xBCBB, /* 0xD0 */
+ 0xDDF1, 0xC986, 0xC987, 0xDDF7, 0xC988, 0xDDF6, 0xDDEB, 0xC989, /* 0xE0 */
+ 0xC98A, 0xC98B, 0xC98C, 0xC98D, 0xC5EE, 0xC98E, 0xC98F, 0xC990, /* 0xE0 */
+ 0xDDFB, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, /* 0xF0 */
+ 0xC998, 0xC999, 0xC99A, 0xC99B, 0xDEA4, 0xC99C, 0xC99D, 0xDEA3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC99E, 0xC99F, 0xC9A0, 0xCA40, 0xCA41, 0xCA42, 0xCA43, 0xCA44, /* 0x00 */
+ 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xDDF8, 0xCA49, 0xCA4A, 0xCA4B, /* 0x00 */
+ 0xCA4C, 0xC3EF, 0xCA4D, 0xC2FB, 0xCA4E, 0xCA4F, 0xCA50, 0xD5E1, /* 0x10 */
+ 0xCA51, 0xCA52, 0xCEB5, 0xCA53, 0xCA54, 0xCA55, 0xCA56, 0xDDFD, /* 0x10 */
+ 0xCA57, 0xB2CC, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5C, 0xCA5D, /* 0x20 */
+ 0xCA5E, 0xCA5F, 0xCA60, 0xC4E8, 0xCADF, 0xCA61, 0xCA62, 0xCA63, /* 0x20 */
+ 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA68, 0xCA69, 0xCA6A, 0xC7BE, /* 0x30 */
+ 0xDDFA, 0xDDFC, 0xDDFE, 0xDEA2, 0xB0AA, 0xB1CE, 0xCA6B, 0xCA6C, /* 0x30 */
+ 0xCA6D, 0xCA6E, 0xCA6F, 0xDEAC, 0xCA70, 0xCA71, 0xCA72, 0xCA73, /* 0x40 */
+ 0xDEA6, 0xBDB6, 0xC8EF, 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, /* 0x40 */
+ 0xCA79, 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7D, 0xCA7E, 0xDEA1, 0xCA80, /* 0x50 */
+ 0xCA81, 0xDEA5, 0xCA82, 0xCA83, 0xCA84, 0xCA85, 0xDEA9, 0xCA86, /* 0x50 */
+ 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xDEA8, 0xCA8B, 0xCA8C, 0xCA8D, /* 0x60 */
+ 0xDEA7, 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, /* 0x60 */
+ 0xCA95, 0xCA96, 0xDEAD, 0xCA97, 0xD4CC, 0xCA98, 0xCA99, 0xCA9A, /* 0x70 */
+ 0xCA9B, 0xDEB3, 0xDEAA, 0xDEAE, 0xCA9C, 0xCA9D, 0xC0D9, 0xCA9E, /* 0x70 */
+ 0xCA9F, 0xCAA0, 0xCB40, 0xCB41, 0xB1A1, 0xDEB6, 0xCB42, 0xDEB1, /* 0x80 */
+ 0xCB43, 0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB48, 0xCB49, 0xDEB2, /* 0x80 */
+ 0xCB4A, 0xCB4B, 0xCB4C, 0xCB4D, 0xCB4E, 0xCB4F, 0xCB50, 0xCB51, /* 0x90 */
+ 0xCB52, 0xCB53, 0xCB54, 0xD1A6, 0xDEB5, 0xCB55, 0xCB56, 0xCB57, /* 0x90 */
+ 0xCB58, 0xCB59, 0xCB5A, 0xCB5B, 0xDEAF, 0xCB5C, 0xCB5D, 0xCB5E, /* 0xA0 */
+ 0xDEB0, 0xCB5F, 0xD0BD, 0xCB60, 0xCB61, 0xCB62, 0xDEB4, 0xCAED, /* 0xA0 */
+ 0xDEB9, 0xCB63, 0xCB64, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xDEB8, /* 0xB0 */
+ 0xCB69, 0xDEB7, 0xCB6A, 0xCB6B, 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, /* 0xB0 */
+ 0xCB70, 0xDEBB, 0xCB71, 0xCB72, 0xCB73, 0xCB74, 0xCB75, 0xCB76, /* 0xC0 */
+ 0xCB77, 0xBDE5, 0xCB78, 0xCB79, 0xCB7A, 0xCB7B, 0xCB7C, 0xB2D8, /* 0xC0 */
+ 0xC3EA, 0xCB7D, 0xCB7E, 0xDEBA, 0xCB80, 0xC5BA, 0xCB81, 0xCB82, /* 0xD0 */
+ 0xCB83, 0xCB84, 0xCB85, 0xCB86, 0xDEBC, 0xCB87, 0xCB88, 0xCB89, /* 0xD0 */
+ 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCCD9, 0xCB8E, 0xCB8F, 0xCB90, /* 0xE0 */
+ 0xCB91, 0xB7AA, 0xCB92, 0xCB93, 0xCB94, 0xCB95, 0xCB96, 0xCB97, /* 0xE0 */
+ 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9C, 0xCB9D, 0xCB9E, 0xCB9F, /* 0xF0 */
+ 0xCBA0, 0xCC40, 0xCC41, 0xD4E5, 0xCC42, 0xCC43, 0xCC44, 0xDEBD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCC45, 0xCC46, 0xCC47, 0xCC48, 0xCC49, 0xDEBF, 0xCC4A, 0xCC4B, /* 0x00 */
+ 0xCC4C, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53, /* 0x00 */
+ 0xCC54, 0xC4A2, 0xCC55, 0xCC56, 0xCC57, 0xCC58, 0xDEC1, 0xCC59, /* 0x10 */
+ 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC60, 0xCC61, /* 0x10 */
+ 0xCC62, 0xCC63, 0xCC64, 0xCC65, 0xCC66, 0xCC67, 0xCC68, 0xDEBE, /* 0x20 */
+ 0xCC69, 0xDEC0, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D, 0xCC6E, 0xCC6F, /* 0x20 */
+ 0xCC70, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC75, 0xCC76, 0xCC77, /* 0x30 */
+ 0xD5BA, 0xCC78, 0xCC79, 0xCC7A, 0xDEC2, 0xCC7B, 0xCC7C, 0xCC7D, /* 0x30 */
+ 0xCC7E, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86, /* 0x40 */
+ 0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xF2AE, 0xBBA2, 0xC2B2, /* 0x40 */
+ 0xC5B0, 0xC2C7, 0xCC8C, 0xCC8D, 0xF2AF, 0xCC8E, 0xCC8F, 0xCC90, /* 0x50 */
+ 0xCC91, 0xCC92, 0xD0E9, 0xCC93, 0xCC94, 0xCC95, 0xD3DD, 0xCC96, /* 0x50 */
+ 0xCC97, 0xCC98, 0xEBBD, 0xCC99, 0xCC9A, 0xCC9B, 0xCC9C, 0xCC9D, /* 0x60 */
+ 0xCC9E, 0xCC9F, 0xCCA0, 0xB3E6, 0xF2B0, 0xCD40, 0xF2B1, 0xCD41, /* 0x60 */
+ 0xCD42, 0xCAAD, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, /* 0x70 */
+ 0xCD49, 0xBAE7, 0xF2B3, 0xF2B5, 0xF2B4, 0xCBE4, 0xCFBA, 0xF2B2, /* 0x70 */
+ 0xCAB4, 0xD2CF, 0xC2EC, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, /* 0x80 */
+ 0xCD4F, 0xCD50, 0xCEC3, 0xF2B8, 0xB0F6, 0xF2B7, 0xCD51, 0xCD52, /* 0x80 */
+ 0xCD53, 0xCD54, 0xCD55, 0xF2BE, 0xCD56, 0xB2CF, 0xCD57, 0xCD58, /* 0x90 */
+ 0xCD59, 0xCD5A, 0xCD5B, 0xCD5C, 0xD1C1, 0xF2BA, 0xCD5D, 0xCD5E, /* 0x90 */
+ 0xCD5F, 0xCD60, 0xCD61, 0xF2BC, 0xD4E9, 0xCD62, 0xCD63, 0xF2BB, /* 0xA0 */
+ 0xF2B6, 0xF2BF, 0xF2BD, 0xCD64, 0xF2B9, 0xCD65, 0xCD66, 0xF2C7, /* 0xA0 */
+ 0xF2C4, 0xF2C6, 0xCD67, 0xCD68, 0xF2CA, 0xF2C2, 0xF2C0, 0xCD69, /* 0xB0 */
+ 0xCD6A, 0xCD6B, 0xF2C5, 0xCD6C, 0xCD6D, 0xCD6E, 0xCD6F, 0xCD70, /* 0xB0 */
+ 0xD6FB, 0xCD71, 0xCD72, 0xCD73, 0xF2C1, 0xCD74, 0xC7F9, 0xC9DF, /* 0xC0 */
+ 0xCD75, 0xF2C8, 0xB9C6, 0xB5B0, 0xCD76, 0xCD77, 0xF2C3, 0xF2C9, /* 0xC0 */
+ 0xF2D0, 0xF2D6, 0xCD78, 0xCD79, 0xBBD7, 0xCD7A, 0xCD7B, 0xCD7C, /* 0xD0 */
+ 0xF2D5, 0xCDDC, 0xCD7D, 0xD6EB, 0xCD7E, 0xCD80, 0xF2D2, 0xF2D4, /* 0xD0 */
+ 0xCD81, 0xCD82, 0xCD83, 0xCD84, 0xB8F2, 0xCD85, 0xCD86, 0xCD87, /* 0xE0 */
+ 0xCD88, 0xF2CB, 0xCD89, 0xCD8A, 0xCD8B, 0xF2CE, 0xC2F9, 0xCD8C, /* 0xE0 */
+ 0xD5DD, 0xF2CC, 0xF2CD, 0xF2CF, 0xF2D3, 0xCD8D, 0xCD8E, 0xCD8F, /* 0xF0 */
+ 0xF2D9, 0xD3BC, 0xCD90, 0xCD91, 0xCD92, 0xCD93, 0xB6EA, 0xCD94 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCAF1, 0xCD95, 0xB7E4, 0xF2D7, 0xCD96, 0xCD97, 0xCD98, 0xF2D8, /* 0x00 */
+ 0xF2DA, 0xF2DD, 0xF2DB, 0xCD99, 0xCD9A, 0xF2DC, 0xCD9B, 0xCD9C, /* 0x00 */
+ 0xCD9D, 0xCD9E, 0xD1D1, 0xF2D1, 0xCD9F, 0xCDC9, 0xCDA0, 0xCECF, /* 0x10 */
+ 0xD6A9, 0xCE40, 0xF2E3, 0xCE41, 0xC3DB, 0xCE42, 0xF2E0, 0xCE43, /* 0x10 */
+ 0xCE44, 0xC0AF, 0xF2EC, 0xF2DE, 0xCE45, 0xF2E1, 0xCE46, 0xCE47, /* 0x20 */
+ 0xCE48, 0xF2E8, 0xCE49, 0xCE4A, 0xCE4B, 0xCE4C, 0xF2E2, 0xCE4D, /* 0x20 */
+ 0xCE4E, 0xF2E7, 0xCE4F, 0xCE50, 0xF2E6, 0xCE51, 0xCE52, 0xF2E9, /* 0x30 */
+ 0xCE53, 0xCE54, 0xCE55, 0xF2DF, 0xCE56, 0xCE57, 0xF2E4, 0xF2EA, /* 0x30 */
+ 0xCE58, 0xCE59, 0xCE5A, 0xCE5B, 0xCE5C, 0xCE5D, 0xCE5E, 0xD3AC, /* 0x40 */
+ 0xF2E5, 0xB2F5, 0xCE5F, 0xCE60, 0xF2F2, 0xCE61, 0xD0AB, 0xCE62, /* 0x40 */
+ 0xCE63, 0xCE64, 0xCE65, 0xF2F5, 0xCE66, 0xCE67, 0xCE68, 0xBBC8, /* 0x50 */
+ 0xCE69, 0xF2F9, 0xCE6A, 0xCE6B, 0xCE6C, 0xCE6D, 0xCE6E, 0xCE6F, /* 0x50 */
+ 0xF2F0, 0xCE70, 0xCE71, 0xF2F6, 0xF2F8, 0xF2FA, 0xCE72, 0xCE73, /* 0x60 */
+ 0xCE74, 0xCE75, 0xCE76, 0xCE77, 0xCE78, 0xCE79, 0xF2F3, 0xCE7A, /* 0x60 */
+ 0xF2F1, 0xCE7B, 0xCE7C, 0xCE7D, 0xBAFB, 0xCE7E, 0xB5FB, 0xCE80, /* 0x70 */
+ 0xCE81, 0xCE82, 0xCE83, 0xF2EF, 0xF2F7, 0xF2ED, 0xF2EE, 0xCE84, /* 0x70 */
+ 0xCE85, 0xCE86, 0xF2EB, 0xF3A6, 0xCE87, 0xF3A3, 0xCE88, 0xCE89, /* 0x80 */
+ 0xF3A2, 0xCE8A, 0xCE8B, 0xF2F4, 0xCE8C, 0xC8DA, 0xCE8D, 0xCE8E, /* 0x80 */
+ 0xCE8F, 0xCE90, 0xCE91, 0xF2FB, 0xCE92, 0xCE93, 0xCE94, 0xF3A5, /* 0x90 */
+ 0xCE95, 0xCE96, 0xCE97, 0xCE98, 0xCE99, 0xCE9A, 0xCE9B, 0xC3F8, /* 0x90 */
+ 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA0, 0xCF40, 0xCF41, 0xCF42, /* 0xA0 */
+ 0xF2FD, 0xCF43, 0xCF44, 0xF3A7, 0xF3A9, 0xF3A4, 0xCF45, 0xF2FC, /* 0xA0 */
+ 0xCF46, 0xCF47, 0xCF48, 0xF3AB, 0xCF49, 0xF3AA, 0xCF4A, 0xCF4B, /* 0xB0 */
+ 0xCF4C, 0xCF4D, 0xC2DD, 0xCF4E, 0xCF4F, 0xF3AE, 0xCF50, 0xCF51, /* 0xB0 */
+ 0xF3B0, 0xCF52, 0xCF53, 0xCF54, 0xCF55, 0xCF56, 0xF3A1, 0xCF57, /* 0xC0 */
+ 0xCF58, 0xCF59, 0xF3B1, 0xF3AC, 0xCF5A, 0xCF5B, 0xCF5C, 0xCF5D, /* 0xC0 */
+ 0xCF5E, 0xF3AF, 0xF2FE, 0xF3AD, 0xCF5F, 0xCF60, 0xCF61, 0xCF62, /* 0xD0 */
+ 0xCF63, 0xCF64, 0xCF65, 0xF3B2, 0xCF66, 0xCF67, 0xCF68, 0xCF69, /* 0xD0 */
+ 0xF3B4, 0xCF6A, 0xCF6B, 0xCF6C, 0xCF6D, 0xF3A8, 0xCF6E, 0xCF6F, /* 0xE0 */
+ 0xCF70, 0xCF71, 0xF3B3, 0xCF72, 0xCF73, 0xCF74, 0xF3B5, 0xCF75, /* 0xE0 */
+ 0xCF76, 0xCF77, 0xCF78, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, /* 0xF0 */
+ 0xCF7E, 0xD0B7, 0xCF80, 0xCF81, 0xCF82, 0xCF83, 0xF3B8, 0xCF84 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCF85, 0xCF86, 0xCF87, 0xD9F9, 0xCF88, 0xCF89, 0xCF8A, 0xCF8B, /* 0x00 */
+ 0xCF8C, 0xCF8D, 0xF3B9, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92, /* 0x00 */
+ 0xCF93, 0xCF94, 0xCF95, 0xF3B7, 0xCF96, 0xC8E4, 0xF3B6, 0xCF97, /* 0x10 */
+ 0xCF98, 0xCF99, 0xCF9A, 0xF3BA, 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, /* 0x10 */
+ 0xCF9F, 0xF3BB, 0xB4C0, 0xCFA0, 0xD040, 0xD041, 0xD042, 0xD043, /* 0x20 */
+ 0xD044, 0xD045, 0xD046, 0xD047, 0xD048, 0xD049, 0xD04A, 0xD04B, /* 0x20 */
+ 0xD04C, 0xD04D, 0xEEC3, 0xD04E, 0xD04F, 0xD050, 0xD051, 0xD052, /* 0x30 */
+ 0xD053, 0xF3BC, 0xD054, 0xD055, 0xF3BD, 0xD056, 0xD057, 0xD058, /* 0x30 */
+ 0xD1AA, 0xD059, 0xD05A, 0xD05B, 0xF4AC, 0xD0C6, 0xD05C, 0xD05D, /* 0x40 */
+ 0xD05E, 0xD05F, 0xD060, 0xD061, 0xD0D0, 0xD1DC, 0xD062, 0xD063, /* 0x40 */
+ 0xD064, 0xD065, 0xD066, 0xD067, 0xCFCE, 0xD068, 0xD069, 0xBDD6, /* 0x50 */
+ 0xD06A, 0xD1C3, 0xD06B, 0xD06C, 0xD06D, 0xD06E, 0xD06F, 0xD070, /* 0x50 */
+ 0xD071, 0xBAE2, 0xE1E9, 0xD2C2, 0xF1C2, 0xB2B9, 0xD072, 0xD073, /* 0x60 */
+ 0xB1ED, 0xF1C3, 0xD074, 0xC9C0, 0xB3C4, 0xD075, 0xD9F2, 0xD076, /* 0x60 */
+ 0xCBA5, 0xD077, 0xF1C4, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD6D4, /* 0x70 */
+ 0xD07C, 0xD07D, 0xD07E, 0xD080, 0xD081, 0xF1C5, 0xF4C0, 0xF1C6, /* 0x70 */
+ 0xD082, 0xD4AC, 0xF1C7, 0xD083, 0xB0C0, 0xF4C1, 0xD084, 0xD085, /* 0x80 */
+ 0xF4C2, 0xD086, 0xD087, 0xB4FC, 0xD088, 0xC5DB, 0xD089, 0xD08A, /* 0x80 */
+ 0xD08B, 0xD08C, 0xCCBB, 0xD08D, 0xD08E, 0xD08F, 0xD0E4, 0xD090, /* 0x90 */
+ 0xD091, 0xD092, 0xD093, 0xD094, 0xCDE0, 0xD095, 0xD096, 0xD097, /* 0x90 */
+ 0xD098, 0xD099, 0xF1C8, 0xD09A, 0xD9F3, 0xD09B, 0xD09C, 0xD09D, /* 0xA0 */
+ 0xD09E, 0xD09F, 0xD0A0, 0xB1BB, 0xD140, 0xCFAE, 0xD141, 0xD142, /* 0xA0 */
+ 0xD143, 0xB8A4, 0xD144, 0xD145, 0xD146, 0xD147, 0xD148, 0xF1CA, /* 0xB0 */
+ 0xD149, 0xD14A, 0xD14B, 0xD14C, 0xF1CB, 0xD14D, 0xD14E, 0xD14F, /* 0xB0 */
+ 0xD150, 0xB2C3, 0xC1D1, 0xD151, 0xD152, 0xD7B0, 0xF1C9, 0xD153, /* 0xC0 */
+ 0xD154, 0xF1CC, 0xD155, 0xD156, 0xD157, 0xD158, 0xF1CE, 0xD159, /* 0xC0 */
+ 0xD15A, 0xD15B, 0xD9F6, 0xD15C, 0xD2E1, 0xD4A3, 0xD15D, 0xD15E, /* 0xD0 */
+ 0xF4C3, 0xC8B9, 0xD15F, 0xD160, 0xD161, 0xD162, 0xD163, 0xF4C4, /* 0xD0 */
+ 0xD164, 0xD165, 0xF1CD, 0xF1CF, 0xBFE3, 0xF1D0, 0xD166, 0xD167, /* 0xE0 */
+ 0xF1D4, 0xD168, 0xD169, 0xD16A, 0xD16B, 0xD16C, 0xD16D, 0xD16E, /* 0xE0 */
+ 0xF1D6, 0xF1D1, 0xD16F, 0xC9D1, 0xC5E1, 0xD170, 0xD171, 0xD172, /* 0xF0 */
+ 0xC2E3, 0xB9FC, 0xD173, 0xD174, 0xF1D3, 0xD175, 0xF1D5, 0xD176 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD177, 0xD178, 0xB9D3, 0xD179, 0xD17A, 0xD17B, 0xD17C, 0xD17D, /* 0x00 */
+ 0xD17E, 0xD180, 0xF1DB, 0xD181, 0xD182, 0xD183, 0xD184, 0xD185, /* 0x00 */
+ 0xBAD6, 0xD186, 0xB0FD, 0xF1D9, 0xD187, 0xD188, 0xD189, 0xD18A, /* 0x10 */
+ 0xD18B, 0xF1D8, 0xF1D2, 0xF1DA, 0xD18C, 0xD18D, 0xD18E, 0xD18F, /* 0x10 */
+ 0xD190, 0xF1D7, 0xD191, 0xD192, 0xD193, 0xC8EC, 0xD194, 0xD195, /* 0x20 */
+ 0xD196, 0xD197, 0xCDCA, 0xF1DD, 0xD198, 0xD199, 0xD19A, 0xD19B, /* 0x20 */
+ 0xE5BD, 0xD19C, 0xD19D, 0xD19E, 0xF1DC, 0xD19F, 0xF1DE, 0xD1A0, /* 0x30 */
+ 0xD240, 0xD241, 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247, /* 0x30 */
+ 0xD248, 0xF1DF, 0xD249, 0xD24A, 0xCFE5, 0xD24B, 0xD24C, 0xD24D, /* 0x40 */
+ 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255, /* 0x40 */
+ 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25C, 0xD25D, /* 0x50 */
+ 0xD25E, 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xF4C5, 0xBDF3, /* 0x50 */
+ 0xD264, 0xD265, 0xD266, 0xD267, 0xD268, 0xD269, 0xF1E0, 0xD26A, /* 0x60 */
+ 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F, 0xD270, 0xD271, 0xD272, /* 0x60 */
+ 0xD273, 0xD274, 0xD275, 0xD276, 0xD277, 0xD278, 0xD279, 0xD27A, /* 0x70 */
+ 0xD27B, 0xD27C, 0xD27D, 0xF1E1, 0xD27E, 0xD280, 0xD281, 0xCEF7, /* 0x70 */
+ 0xD282, 0xD2AA, 0xD283, 0xF1FB, 0xD284, 0xD285, 0xB8B2, 0xD286, /* 0x80 */
+ 0xD287, 0xD288, 0xD289, 0xD28A, 0xD28B, 0xD28C, 0xD28D, 0xD28E, /* 0x80 */
+ 0xD28F, 0xD290, 0xD291, 0xD292, 0xD293, 0xD294, 0xD295, 0xD296, /* 0x90 */
+ 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29C, 0xD29D, 0xD29E, /* 0x90 */
+ 0xD29F, 0xD2A0, 0xD340, 0xD341, 0xD342, 0xD343, 0xD344, 0xD345, /* 0xA0 */
+ 0xD346, 0xD347, 0xD348, 0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D, /* 0xA0 */
+ 0xD34E, 0xD34F, 0xD350, 0xD351, 0xD352, 0xD353, 0xD354, 0xD355, /* 0xB0 */
+ 0xD356, 0xD357, 0xD358, 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, /* 0xB0 */
+ 0xD35E, 0xBCFB, 0xB9DB, 0xD35F, 0xB9E6, 0xC3D9, 0xCAD3, 0xEAE8, /* 0xC0 */
+ 0xC0C0, 0xBEF5, 0xEAE9, 0xEAEA, 0xEAEB, 0xD360, 0xEAEC, 0xEAED, /* 0xC0 */
+ 0xEAEE, 0xEAEF, 0xBDC7, 0xD361, 0xD362, 0xD363, 0xF5FB, 0xD364, /* 0xD0 */
+ 0xD365, 0xD366, 0xF5FD, 0xD367, 0xF5FE, 0xD368, 0xF5FC, 0xD369, /* 0xD0 */
+ 0xD36A, 0xD36B, 0xD36C, 0xBDE2, 0xD36D, 0xF6A1, 0xB4A5, 0xD36E, /* 0xE0 */
+ 0xD36F, 0xD370, 0xD371, 0xF6A2, 0xD372, 0xD373, 0xD374, 0xF6A3, /* 0xE0 */
+ 0xD375, 0xD376, 0xD377, 0xECB2, 0xD378, 0xD379, 0xD37A, 0xD37B, /* 0xF0 */
+ 0xD37C, 0xD37D, 0xD37E, 0xD380, 0xD381, 0xD382, 0xD383, 0xD384 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1D4, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD9EA, /* 0x00 */
+ 0xD38B, 0xD38C, 0xD38D, 0xD38E, 0xD38F, 0xD390, 0xD391, 0xD392, /* 0x00 */
+ 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD398, 0xD399, 0xD39A, /* 0x10 */
+ 0xD39B, 0xD39C, 0xD39D, 0xD39E, 0xD39F, 0xD3A0, 0xD440, 0xD441, /* 0x10 */
+ 0xD442, 0xD443, 0xD444, 0xD445, 0xD446, 0xD447, 0xD448, 0xD449, /* 0x20 */
+ 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450, 0xD451, /* 0x20 */
+ 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458, 0xD459, /* 0x30 */
+ 0xD45A, 0xD45B, 0xD45C, 0xD45D, 0xD45E, 0xD45F, 0xF6A4, 0xD460, /* 0x30 */
+ 0xD461, 0xD462, 0xD463, 0xD464, 0xD465, 0xD466, 0xD467, 0xD468, /* 0x40 */
+ 0xEEBA, 0xD469, 0xD46A, 0xD46B, 0xD46C, 0xD46D, 0xD46E, 0xD46F, /* 0x40 */
+ 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477, /* 0x50 */
+ 0xD478, 0xD479, 0xD47A, 0xD47B, 0xD47C, 0xD47D, 0xD47E, 0xD480, /* 0x50 */
+ 0xD481, 0xD482, 0xD483, 0xD484, 0xD485, 0xD486, 0xD487, 0xD488, /* 0x60 */
+ 0xD489, 0xD48A, 0xD48B, 0xD48C, 0xD48D, 0xD48E, 0xD48F, 0xD490, /* 0x60 */
+ 0xD491, 0xD492, 0xD493, 0xD494, 0xD495, 0xD496, 0xD497, 0xD498, /* 0x70 */
+ 0xD499, 0xD5B2, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, /* 0x70 */
+ 0xD4A0, 0xD540, 0xD541, 0xD542, 0xD543, 0xD544, 0xD545, 0xD546, /* 0x80 */
+ 0xD547, 0xD3FE, 0xCCDC, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54C, /* 0x80 */
+ 0xD54D, 0xD54E, 0xD54F, 0xCAC4, 0xD550, 0xD551, 0xD552, 0xD553, /* 0x90 */
+ 0xD554, 0xD555, 0xD556, 0xD557, 0xD558, 0xD559, 0xD55A, 0xD55B, /* 0x90 */
+ 0xD55C, 0xD55D, 0xD55E, 0xD55F, 0xD560, 0xD561, 0xD562, 0xD563, /* 0xA0 */
+ 0xD564, 0xD565, 0xD566, 0xD567, 0xD568, 0xD569, 0xD56A, 0xD56B, /* 0xA0 */
+ 0xD56C, 0xD56D, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573, /* 0xB0 */
+ 0xD574, 0xD575, 0xD576, 0xD577, 0xD578, 0xD579, 0xD57A, 0xD57B, /* 0xB0 */
+ 0xD57C, 0xD57D, 0xD57E, 0xD580, 0xD581, 0xD582, 0xD583, 0xD584, /* 0xC0 */
+ 0xD585, 0xD586, 0xD587, 0xD588, 0xD589, 0xD58A, 0xD58B, 0xD58C, /* 0xC0 */
+ 0xD58D, 0xD58E, 0xD58F, 0xD590, 0xD591, 0xD592, 0xD593, 0xD594, /* 0xD0 */
+ 0xD595, 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, /* 0xD0 */
+ 0xD59D, 0xD59E, 0xD59F, 0xD5A0, 0xD640, 0xD641, 0xD642, 0xD643, /* 0xE0 */
+ 0xD644, 0xD645, 0xD646, 0xD647, 0xD648, 0xD649, 0xD64A, 0xD64B, /* 0xE0 */
+ 0xD64C, 0xD64D, 0xD64E, 0xD64F, 0xD650, 0xD651, 0xD652, 0xD653, /* 0xF0 */
+ 0xD654, 0xD655, 0xD656, 0xD657, 0xD658, 0xD659, 0xD65A, 0xD65B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD65C, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662, 0xE5C0, /* 0x00 */
+ 0xD663, 0xD664, 0xD665, 0xD666, 0xD667, 0xD668, 0xD669, 0xD66A, /* 0x00 */
+ 0xD66B, 0xD66C, 0xD66D, 0xD66E, 0xD66F, 0xD670, 0xD671, 0xD672, /* 0x10 */
+ 0xD673, 0xD674, 0xD675, 0xD676, 0xD677, 0xD678, 0xD679, 0xD67A, /* 0x10 */
+ 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD680, 0xD681, 0xF6A5, 0xD682, /* 0x20 */
+ 0xD683, 0xD684, 0xD685, 0xD686, 0xD687, 0xD688, 0xD689, 0xD68A, /* 0x20 */
+ 0xD68B, 0xD68C, 0xD68D, 0xD68E, 0xD68F, 0xD690, 0xD691, 0xD692, /* 0x30 */
+ 0xD693, 0xD694, 0xD695, 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, /* 0x30 */
+ 0xD69B, 0xD69C, 0xD69D, 0xD69E, 0xD69F, 0xD6A0, 0xD740, 0xD741, /* 0x40 */
+ 0xD742, 0xD743, 0xD744, 0xD745, 0xD746, 0xD747, 0xD748, 0xD749, /* 0x40 */
+ 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F, 0xD750, 0xD751, /* 0x50 */
+ 0xD752, 0xD753, 0xD754, 0xD755, 0xD756, 0xD757, 0xD758, 0xD759, /* 0x50 */
+ 0xD75A, 0xD75B, 0xD75C, 0xD75D, 0xD75E, 0xD75F, 0xBEAF, 0xD760, /* 0x60 */
+ 0xD761, 0xD762, 0xD763, 0xD764, 0xC6A9, 0xD765, 0xD766, 0xD767, /* 0x60 */
+ 0xD768, 0xD769, 0xD76A, 0xD76B, 0xD76C, 0xD76D, 0xD76E, 0xD76F, /* 0x70 */
+ 0xD770, 0xD771, 0xD772, 0xD773, 0xD774, 0xD775, 0xD776, 0xD777, /* 0x70 */
+ 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77C, 0xD77D, 0xD77E, 0xD780, /* 0x80 */
+ 0xD781, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD788, /* 0x80 */
+ 0xD789, 0xD78A, 0xD78B, 0xD78C, 0xD78D, 0xD78E, 0xD78F, 0xD790, /* 0x90 */
+ 0xD791, 0xD792, 0xD793, 0xD794, 0xD795, 0xD796, 0xD797, 0xD798, /* 0x90 */
+ 0xDAA5, 0xBCC6, 0xB6A9, 0xB8BC, 0xC8CF, 0xBCA5, 0xDAA6, 0xDAA7, /* 0xA0 */
+ 0xCCD6, 0xC8C3, 0xDAA8, 0xC6FD, 0xD799, 0xD1B5, 0xD2E9, 0xD1B6, /* 0xA0 */
+ 0xBCC7, 0xD79A, 0xBDB2, 0xBBE4, 0xDAA9, 0xDAAA, 0xD1C8, 0xDAAB, /* 0xB0 */
+ 0xD0ED, 0xB6EF, 0xC2DB, 0xD79B, 0xCBCF, 0xB7ED, 0xC9E8, 0xB7C3, /* 0xB0 */
+ 0xBEF7, 0xD6A4, 0xDAAC, 0xDAAD, 0xC6C0, 0xD7E7, 0xCAB6, 0xD79C, /* 0xC0 */
+ 0xD5A9, 0xCBDF, 0xD5EF, 0xDAAE, 0xD6DF, 0xB4CA, 0xDAB0, 0xDAAF, /* 0xC0 */
+ 0xD79D, 0xD2EB, 0xDAB1, 0xDAB2, 0xDAB3, 0xCAD4, 0xDAB4, 0xCAAB, /* 0xD0 */
+ 0xDAB5, 0xDAB6, 0xB3CF, 0xD6EF, 0xDAB7, 0xBBB0, 0xB5AE, 0xDAB8, /* 0xD0 */
+ 0xDAB9, 0xB9EE, 0xD1AF, 0xD2E8, 0xDABA, 0xB8C3, 0xCFEA, 0xB2EF, /* 0xE0 */
+ 0xDABB, 0xDABC, 0xD79E, 0xBDEB, 0xCEDC, 0xD3EF, 0xDABD, 0xCEF3, /* 0xE0 */
+ 0xDABE, 0xD3D5, 0xBBE5, 0xDABF, 0xCBB5, 0xCBD0, 0xDAC0, 0xC7EB, /* 0xF0 */
+ 0xD6EE, 0xDAC1, 0xC5B5, 0xB6C1, 0xDAC2, 0xB7CC, 0xBFCE, 0xDAC3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDAC4, 0xCBAD, 0xDAC5, 0xB5F7, 0xDAC6, 0xC1C2, 0xD7BB, 0xDAC7, /* 0x00 */
+ 0xCCB8, 0xD79F, 0xD2EA, 0xC4B1, 0xDAC8, 0xB5FD, 0xBBD1, 0xDAC9, /* 0x00 */
+ 0xD0B3, 0xDACA, 0xDACB, 0xCEBD, 0xDACC, 0xDACD, 0xDACE, 0xB2F7, /* 0x10 */
+ 0xDAD1, 0xDACF, 0xD1E8, 0xDAD0, 0xC3D5, 0xDAD2, 0xD7A0, 0xDAD3, /* 0x10 */
+ 0xDAD4, 0xDAD5, 0xD0BB, 0xD2A5, 0xB0F9, 0xDAD6, 0xC7AB, 0xDAD7, /* 0x20 */
+ 0xBDF7, 0xC3A1, 0xDAD8, 0xDAD9, 0xC3FD, 0xCCB7, 0xDADA, 0xDADB, /* 0x20 */
+ 0xC0BE, 0xC6D7, 0xDADC, 0xDADD, 0xC7B4, 0xDADE, 0xDADF, 0xB9C8, /* 0x30 */
+ 0xD840, 0xD841, 0xD842, 0xD843, 0xD844, 0xD845, 0xD846, 0xD847, /* 0x30 */
+ 0xD848, 0xBBED, 0xD849, 0xD84A, 0xD84B, 0xD84C, 0xB6B9, 0xF4F8, /* 0x40 */
+ 0xD84D, 0xF4F9, 0xD84E, 0xD84F, 0xCDE3, 0xD850, 0xD851, 0xD852, /* 0x40 */
+ 0xD853, 0xD854, 0xD855, 0xD856, 0xD857, 0xF5B9, 0xD858, 0xD859, /* 0x50 */
+ 0xD85A, 0xD85B, 0xEBE0, 0xD85C, 0xD85D, 0xD85E, 0xD85F, 0xD860, /* 0x50 */
+ 0xD861, 0xCFF3, 0xBBBF, 0xD862, 0xD863, 0xD864, 0xD865, 0xD866, /* 0x60 */
+ 0xD867, 0xD868, 0xBAC0, 0xD4A5, 0xD869, 0xD86A, 0xD86B, 0xD86C, /* 0x60 */
+ 0xD86D, 0xD86E, 0xD86F, 0xE1D9, 0xD870, 0xD871, 0xD872, 0xD873, /* 0x70 */
+ 0xF5F4, 0xB1AA, 0xB2F2, 0xD874, 0xD875, 0xD876, 0xD877, 0xD878, /* 0x70 */
+ 0xD879, 0xD87A, 0xF5F5, 0xD87B, 0xD87C, 0xF5F7, 0xD87D, 0xD87E, /* 0x80 */
+ 0xD880, 0xBAD1, 0xF5F6, 0xD881, 0xC3B2, 0xD882, 0xD883, 0xD884, /* 0x80 */
+ 0xD885, 0xD886, 0xD887, 0xD888, 0xF5F9, 0xD889, 0xD88A, 0xD88B, /* 0x90 */
+ 0xF5F8, 0xD88C, 0xD88D, 0xD88E, 0xD88F, 0xD890, 0xD891, 0xD892, /* 0x90 */
+ 0xD893, 0xD894, 0xD895, 0xD896, 0xD897, 0xD898, 0xD899, 0xD89A, /* 0xA0 */
+ 0xD89B, 0xD89C, 0xD89D, 0xD89E, 0xD89F, 0xD8A0, 0xD940, 0xD941, /* 0xA0 */
+ 0xD942, 0xD943, 0xD944, 0xD945, 0xD946, 0xD947, 0xD948, 0xD949, /* 0xB0 */
+ 0xD94A, 0xD94B, 0xD94C, 0xD94D, 0xD94E, 0xD94F, 0xD950, 0xD951, /* 0xB0 */
+ 0xD952, 0xD953, 0xD954, 0xD955, 0xD956, 0xD957, 0xD958, 0xD959, /* 0xC0 */
+ 0xD95A, 0xD95B, 0xD95C, 0xD95D, 0xD95E, 0xD95F, 0xD960, 0xD961, /* 0xC0 */
+ 0xD962, 0xD963, 0xD964, 0xD965, 0xD966, 0xD967, 0xD968, 0xD969, /* 0xD0 */
+ 0xD96A, 0xD96B, 0xD96C, 0xD96D, 0xD96E, 0xD96F, 0xD970, 0xD971, /* 0xD0 */
+ 0xD972, 0xD973, 0xD974, 0xD975, 0xD976, 0xD977, 0xD978, 0xD979, /* 0xE0 */
+ 0xD97A, 0xD97B, 0xD97C, 0xD97D, 0xD97E, 0xD980, 0xD981, 0xD982, /* 0xE0 */
+ 0xD983, 0xD984, 0xD985, 0xD986, 0xD987, 0xD988, 0xD989, 0xD98A, /* 0xF0 */
+ 0xD98B, 0xD98C, 0xD98D, 0xD98E, 0xD98F, 0xD990, 0xD991, 0xD992 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD993, 0xD994, 0xD995, 0xD996, 0xD997, 0xD998, 0xD999, 0xD99A, /* 0x00 */
+ 0xD99B, 0xD99C, 0xD99D, 0xD99E, 0xD99F, 0xD9A0, 0xDA40, 0xDA41, /* 0x00 */
+ 0xDA42, 0xDA43, 0xDA44, 0xDA45, 0xDA46, 0xDA47, 0xDA48, 0xDA49, /* 0x10 */
+ 0xDA4A, 0xDA4B, 0xDA4C, 0xDA4D, 0xDA4E, 0xB1B4, 0xD5EA, 0xB8BA, /* 0x10 */
+ 0xDA4F, 0xB9B1, 0xB2C6, 0xD4F0, 0xCFCD, 0xB0DC, 0xD5CB, 0xBBF5, /* 0x20 */
+ 0xD6CA, 0xB7B7, 0xCCB0, 0xC6B6, 0xB1E1, 0xB9BA, 0xD6FC, 0xB9E1, /* 0x20 */
+ 0xB7A1, 0xBCFA, 0xEADA, 0xEADB, 0xCCF9, 0xB9F3, 0xEADC, 0xB4FB, /* 0x30 */
+ 0xC3B3, 0xB7D1, 0xBAD8, 0xEADD, 0xD4F4, 0xEADE, 0xBCD6, 0xBBDF, /* 0x30 */
+ 0xEADF, 0xC1DE, 0xC2B8, 0xD4DF, 0xD7CA, 0xEAE0, 0xEAE1, 0xEAE4, /* 0x40 */
+ 0xEAE2, 0xEAE3, 0xC9DE, 0xB8B3, 0xB6C4, 0xEAE5, 0xCAEA, 0xC9CD, /* 0x40 */
+ 0xB4CD, 0xDA50, 0xDA51, 0xE2D9, 0xC5E2, 0xEAE6, 0xC0B5, 0xDA52, /* 0x50 */
+ 0xD7B8, 0xEAE7, 0xD7AC, 0xC8FC, 0xD8D3, 0xD8CD, 0xD4DE, 0xDA53, /* 0x50 */
+ 0xD4F9, 0xC9C4, 0xD3AE, 0xB8D3, 0xB3E0, 0xDA54, 0xC9E2, 0xF4F6, /* 0x60 */
+ 0xDA55, 0xDA56, 0xDA57, 0xBAD5, 0xDA58, 0xF4F7, 0xDA59, 0xDA5A, /* 0x60 */
+ 0xD7DF, 0xDA5B, 0xDA5C, 0xF4F1, 0xB8B0, 0xD5D4, 0xB8CF, 0xC6F0, /* 0x70 */
+ 0xDA5D, 0xDA5E, 0xDA5F, 0xDA60, 0xDA61, 0xDA62, 0xDA63, 0xDA64, /* 0x70 */
+ 0xDA65, 0xB3C3, 0xDA66, 0xDA67, 0xF4F2, 0xB3AC, 0xDA68, 0xDA69, /* 0x80 */
+ 0xDA6A, 0xDA6B, 0xD4BD, 0xC7F7, 0xDA6C, 0xDA6D, 0xDA6E, 0xDA6F, /* 0x80 */
+ 0xDA70, 0xF4F4, 0xDA71, 0xDA72, 0xF4F3, 0xDA73, 0xDA74, 0xDA75, /* 0x90 */
+ 0xDA76, 0xDA77, 0xDA78, 0xDA79, 0xDA7A, 0xDA7B, 0xDA7C, 0xCCCB, /* 0x90 */
+ 0xDA7D, 0xDA7E, 0xDA80, 0xC8A4, 0xDA81, 0xDA82, 0xDA83, 0xDA84, /* 0xA0 */
+ 0xDA85, 0xDA86, 0xDA87, 0xDA88, 0xDA89, 0xDA8A, 0xDA8B, 0xDA8C, /* 0xA0 */
+ 0xDA8D, 0xF4F5, 0xDA8E, 0xD7E3, 0xC5BF, 0xF5C0, 0xDA8F, 0xDA90, /* 0xB0 */
+ 0xF5BB, 0xDA91, 0xF5C3, 0xDA92, 0xF5C2, 0xDA93, 0xD6BA, 0xF5C1, /* 0xB0 */
+ 0xDA94, 0xDA95, 0xDA96, 0xD4BE, 0xF5C4, 0xDA97, 0xF5CC, 0xDA98, /* 0xC0 */
+ 0xDA99, 0xDA9A, 0xDA9B, 0xB0CF, 0xB5F8, 0xDA9C, 0xF5C9, 0xF5CA, /* 0xC0 */
+ 0xDA9D, 0xC5DC, 0xDA9E, 0xDA9F, 0xDAA0, 0xDB40, 0xF5C5, 0xF5C6, /* 0xD0 */
+ 0xDB41, 0xDB42, 0xF5C7, 0xF5CB, 0xDB43, 0xBEE0, 0xF5C8, 0xB8FA, /* 0xD0 */
+ 0xDB44, 0xDB45, 0xDB46, 0xF5D0, 0xF5D3, 0xDB47, 0xDB48, 0xDB49, /* 0xE0 */
+ 0xBFE7, 0xDB4A, 0xB9F2, 0xF5BC, 0xF5CD, 0xDB4B, 0xDB4C, 0xC2B7, /* 0xE0 */
+ 0xDB4D, 0xDB4E, 0xDB4F, 0xCCF8, 0xDB50, 0xBCF9, 0xDB51, 0xF5CE, /* 0xF0 */
+ 0xF5CF, 0xF5D1, 0xB6E5, 0xF5D2, 0xDB52, 0xF5D5, 0xDB53, 0xDB54 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDB55, 0xDB56, 0xDB57, 0xDB58, 0xDB59, 0xF5BD, 0xDB5A, 0xDB5B, /* 0x00 */
+ 0xDB5C, 0xF5D4, 0xD3BB, 0xDB5D, 0xB3EC, 0xDB5E, 0xDB5F, 0xCCA4, /* 0x00 */
+ 0xDB60, 0xDB61, 0xDB62, 0xDB63, 0xF5D6, 0xDB64, 0xDB65, 0xDB66, /* 0x10 */
+ 0xDB67, 0xDB68, 0xDB69, 0xDB6A, 0xDB6B, 0xF5D7, 0xBEE1, 0xF5D8, /* 0x10 */
+ 0xDB6C, 0xDB6D, 0xCCDF, 0xF5DB, 0xDB6E, 0xDB6F, 0xDB70, 0xDB71, /* 0x20 */
+ 0xDB72, 0xB2C8, 0xD7D9, 0xDB73, 0xF5D9, 0xDB74, 0xF5DA, 0xF5DC, /* 0x20 */
+ 0xDB75, 0xF5E2, 0xDB76, 0xDB77, 0xDB78, 0xF5E0, 0xDB79, 0xDB7A, /* 0x30 */
+ 0xDB7B, 0xF5DF, 0xF5DD, 0xDB7C, 0xDB7D, 0xF5E1, 0xDB7E, 0xDB80, /* 0x30 */
+ 0xF5DE, 0xF5E4, 0xF5E5, 0xDB81, 0xCCE3, 0xDB82, 0xDB83, 0xE5BF, /* 0x40 */
+ 0xB5B8, 0xF5E3, 0xF5E8, 0xCCA3, 0xDB84, 0xDB85, 0xDB86, 0xDB87, /* 0x40 */
+ 0xDB88, 0xF5E6, 0xF5E7, 0xDB89, 0xDB8A, 0xDB8B, 0xDB8C, 0xDB8D, /* 0x50 */
+ 0xDB8E, 0xF5BE, 0xDB8F, 0xDB90, 0xDB91, 0xDB92, 0xDB93, 0xDB94, /* 0x50 */
+ 0xDB95, 0xDB96, 0xDB97, 0xDB98, 0xDB99, 0xDB9A, 0xB1C4, 0xDB9B, /* 0x60 */
+ 0xDB9C, 0xF5BF, 0xDB9D, 0xDB9E, 0xB5C5, 0xB2E4, 0xDB9F, 0xF5EC, /* 0x60 */
+ 0xF5E9, 0xDBA0, 0xB6D7, 0xDC40, 0xF5ED, 0xDC41, 0xF5EA, 0xDC42, /* 0x70 */
+ 0xDC43, 0xDC44, 0xDC45, 0xDC46, 0xF5EB, 0xDC47, 0xDC48, 0xB4DA, /* 0x70 */
+ 0xDC49, 0xD4EA, 0xDC4A, 0xDC4B, 0xDC4C, 0xF5EE, 0xDC4D, 0xB3F9, /* 0x80 */
+ 0xDC4E, 0xDC4F, 0xDC50, 0xDC51, 0xDC52, 0xDC53, 0xDC54, 0xF5EF, /* 0x80 */
+ 0xF5F1, 0xDC55, 0xDC56, 0xDC57, 0xF5F0, 0xDC58, 0xDC59, 0xDC5A, /* 0x90 */
+ 0xDC5B, 0xDC5C, 0xDC5D, 0xDC5E, 0xF5F2, 0xDC5F, 0xF5F3, 0xDC60, /* 0x90 */
+ 0xDC61, 0xDC62, 0xDC63, 0xDC64, 0xDC65, 0xDC66, 0xDC67, 0xDC68, /* 0xA0 */
+ 0xDC69, 0xDC6A, 0xDC6B, 0xC9ED, 0xB9AA, 0xDC6C, 0xDC6D, 0xC7FB, /* 0xA0 */
+ 0xDC6E, 0xDC6F, 0xB6E3, 0xDC70, 0xDC71, 0xDC72, 0xDC73, 0xDC74, /* 0xB0 */
+ 0xDC75, 0xDC76, 0xCCC9, 0xDC77, 0xDC78, 0xDC79, 0xDC7A, 0xDC7B, /* 0xB0 */
+ 0xDC7C, 0xDC7D, 0xDC7E, 0xDC80, 0xDC81, 0xDC82, 0xDC83, 0xDC84, /* 0xC0 */
+ 0xDC85, 0xDC86, 0xDC87, 0xDC88, 0xDC89, 0xDC8A, 0xEAA6, 0xDC8B, /* 0xC0 */
+ 0xDC8C, 0xDC8D, 0xDC8E, 0xDC8F, 0xDC90, 0xDC91, 0xDC92, 0xDC93, /* 0xD0 */
+ 0xDC94, 0xDC95, 0xDC96, 0xDC97, 0xDC98, 0xDC99, 0xDC9A, 0xDC9B, /* 0xD0 */
+ 0xDC9C, 0xDC9D, 0xDC9E, 0xDC9F, 0xDCA0, 0xDD40, 0xDD41, 0xDD42, /* 0xE0 */
+ 0xDD43, 0xDD44, 0xDD45, 0xDD46, 0xDD47, 0xDD48, 0xDD49, 0xDD4A, /* 0xE0 */
+ 0xDD4B, 0xDD4C, 0xDD4D, 0xDD4E, 0xDD4F, 0xDD50, 0xDD51, 0xDD52, /* 0xF0 */
+ 0xDD53, 0xDD54, 0xDD55, 0xDD56, 0xDD57, 0xDD58, 0xDD59, 0xDD5A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDD5B, 0xDD5C, 0xDD5D, 0xDD5E, 0xDD5F, 0xDD60, 0xDD61, 0xDD62, /* 0x00 */
+ 0xDD63, 0xDD64, 0xDD65, 0xDD66, 0xDD67, 0xDD68, 0xDD69, 0xDD6A, /* 0x00 */
+ 0xDD6B, 0xDD6C, 0xDD6D, 0xDD6E, 0xDD6F, 0xDD70, 0xDD71, 0xDD72, /* 0x10 */
+ 0xDD73, 0xDD74, 0xDD75, 0xDD76, 0xDD77, 0xDD78, 0xDD79, 0xDD7A, /* 0x10 */
+ 0xDD7B, 0xDD7C, 0xDD7D, 0xDD7E, 0xDD80, 0xDD81, 0xDD82, 0xDD83, /* 0x20 */
+ 0xDD84, 0xDD85, 0xDD86, 0xDD87, 0xDD88, 0xDD89, 0xDD8A, 0xDD8B, /* 0x20 */
+ 0xDD8C, 0xDD8D, 0xDD8E, 0xDD8F, 0xDD90, 0xDD91, 0xDD92, 0xDD93, /* 0x30 */
+ 0xDD94, 0xDD95, 0xDD96, 0xDD97, 0xDD98, 0xDD99, 0xDD9A, 0xDD9B, /* 0x30 */
+ 0xDD9C, 0xDD9D, 0xDD9E, 0xDD9F, 0xDDA0, 0xDE40, 0xDE41, 0xDE42, /* 0x40 */
+ 0xDE43, 0xDE44, 0xDE45, 0xDE46, 0xDE47, 0xDE48, 0xDE49, 0xDE4A, /* 0x40 */
+ 0xDE4B, 0xDE4C, 0xDE4D, 0xDE4E, 0xDE4F, 0xDE50, 0xDE51, 0xDE52, /* 0x50 */
+ 0xDE53, 0xDE54, 0xDE55, 0xDE56, 0xDE57, 0xDE58, 0xDE59, 0xDE5A, /* 0x50 */
+ 0xDE5B, 0xDE5C, 0xDE5D, 0xDE5E, 0xDE5F, 0xDE60, 0xB3B5, 0xD4FE, /* 0x60 */
+ 0xB9EC, 0xD0F9, 0xDE61, 0xE9ED, 0xD7AA, 0xE9EE, 0xC2D6, 0xC8ED, /* 0x60 */
+ 0xBAE4, 0xE9EF, 0xE9F0, 0xE9F1, 0xD6E1, 0xE9F2, 0xE9F3, 0xE9F5, /* 0x70 */
+ 0xE9F4, 0xE9F6, 0xE9F7, 0xC7E1, 0xE9F8, 0xD4D8, 0xE9F9, 0xBDCE, /* 0x70 */
+ 0xDE62, 0xE9FA, 0xE9FB, 0xBDCF, 0xE9FC, 0xB8A8, 0xC1BE, 0xE9FD, /* 0x80 */
+ 0xB1B2, 0xBBD4, 0xB9F5, 0xE9FE, 0xDE63, 0xEAA1, 0xEAA2, 0xEAA3, /* 0x80 */
+ 0xB7F8, 0xBCAD, 0xDE64, 0xCAE4, 0xE0CE, 0xD4AF, 0xCFBD, 0xD5B7, /* 0x90 */
+ 0xEAA4, 0xD5DE, 0xEAA5, 0xD0C1, 0xB9BC, 0xDE65, 0xB4C7, 0xB1D9, /* 0x90 */
+ 0xDE66, 0xDE67, 0xDE68, 0xC0B1, 0xDE69, 0xDE6A, 0xDE6B, 0xDE6C, /* 0xA0 */
+ 0xB1E6, 0xB1E7, 0xDE6D, 0xB1E8, 0xDE6E, 0xDE6F, 0xDE70, 0xDE71, /* 0xA0 */
+ 0xB3BD, 0xC8E8, 0xDE72, 0xDE73, 0xDE74, 0xDE75, 0xE5C1, 0xDE76, /* 0xB0 */
+ 0xDE77, 0xB1DF, 0xDE78, 0xDE79, 0xDE7A, 0xC1C9, 0xB4EF, 0xDE7B, /* 0xB0 */
+ 0xDE7C, 0xC7A8, 0xD3D8, 0xDE7D, 0xC6F9, 0xD1B8, 0xDE7E, 0xB9FD, /* 0xC0 */
+ 0xC2F5, 0xDE80, 0xDE81, 0xDE82, 0xDE83, 0xDE84, 0xD3AD, 0xDE85, /* 0xC0 */
+ 0xD4CB, 0xBDFC, 0xDE86, 0xE5C2, 0xB7B5, 0xE5C3, 0xDE87, 0xDE88, /* 0xD0 */
+ 0xBBB9, 0xD5E2, 0xDE89, 0xBDF8, 0xD4B6, 0xCEA5, 0xC1AC, 0xB3D9, /* 0xD0 */
+ 0xDE8A, 0xDE8B, 0xCCF6, 0xDE8C, 0xE5C6, 0xE5C4, 0xE5C8, 0xDE8D, /* 0xE0 */
+ 0xE5CA, 0xE5C7, 0xB5CF, 0xC6C8, 0xDE8E, 0xB5FC, 0xE5C5, 0xDE8F, /* 0xE0 */
+ 0xCAF6, 0xDE90, 0xDE91, 0xE5C9, 0xDE92, 0xDE93, 0xDE94, 0xC3D4, /* 0xF0 */
+ 0xB1C5, 0xBCA3, 0xDE95, 0xDE96, 0xDE97, 0xD7B7, 0xDE98, 0xDE99 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDCB, 0xCBCD, 0xCACA, 0xCCD3, 0xE5CC, 0xE5CB, 0xC4E6, 0xDE9A, /* 0x00 */
+ 0xDE9B, 0xD1A1, 0xD1B7, 0xE5CD, 0xDE9C, 0xE5D0, 0xDE9D, 0xCDB8, /* 0x00 */
+ 0xD6F0, 0xE5CF, 0xB5DD, 0xDE9E, 0xCDBE, 0xDE9F, 0xE5D1, 0xB6BA, /* 0x10 */
+ 0xDEA0, 0xDF40, 0xCDA8, 0xB9E4, 0xDF41, 0xCAC5, 0xB3D1, 0xCBD9, /* 0x10 */
+ 0xD4EC, 0xE5D2, 0xB7EA, 0xDF42, 0xDF43, 0xDF44, 0xE5CE, 0xDF45, /* 0x20 */
+ 0xDF46, 0xDF47, 0xDF48, 0xDF49, 0xDF4A, 0xE5D5, 0xB4FE, 0xE5D6, /* 0x20 */
+ 0xDF4B, 0xDF4C, 0xDF4D, 0xDF4E, 0xDF4F, 0xE5D3, 0xE5D4, 0xDF50, /* 0x30 */
+ 0xD2DD, 0xDF51, 0xDF52, 0xC2DF, 0xB1C6, 0xDF53, 0xD3E2, 0xDF54, /* 0x30 */
+ 0xDF55, 0xB6DD, 0xCBEC, 0xDF56, 0xE5D7, 0xDF57, 0xDF58, 0xD3F6, /* 0x40 */
+ 0xDF59, 0xDF5A, 0xDF5B, 0xDF5C, 0xDF5D, 0xB1E9, 0xDF5E, 0xB6F4, /* 0x40 */
+ 0xE5DA, 0xE5D8, 0xE5D9, 0xB5C0, 0xDF5F, 0xDF60, 0xDF61, 0xD2C5, /* 0x50 */
+ 0xE5DC, 0xDF62, 0xDF63, 0xE5DE, 0xDF64, 0xDF65, 0xDF66, 0xDF67, /* 0x50 */
+ 0xDF68, 0xDF69, 0xE5DD, 0xC7B2, 0xDF6A, 0xD2A3, 0xDF6B, 0xDF6C, /* 0x60 */
+ 0xE5DB, 0xDF6D, 0xDF6E, 0xDF6F, 0xDF70, 0xD4E2, 0xD5DA, 0xDF71, /* 0x60 */
+ 0xDF72, 0xDF73, 0xDF74, 0xDF75, 0xE5E0, 0xD7F1, 0xDF76, 0xDF77, /* 0x70 */
+ 0xDF78, 0xDF79, 0xDF7A, 0xDF7B, 0xDF7C, 0xE5E1, 0xDF7D, 0xB1DC, /* 0x70 */
+ 0xD1FB, 0xDF7E, 0xE5E2, 0xE5E4, 0xDF80, 0xDF81, 0xDF82, 0xDF83, /* 0x80 */
+ 0xE5E3, 0xDF84, 0xDF85, 0xE5E5, 0xDF86, 0xDF87, 0xDF88, 0xDF89, /* 0x80 */
+ 0xDF8A, 0xD2D8, 0xDF8B, 0xB5CB, 0xDF8C, 0xE7DF, 0xDF8D, 0xDAF5, /* 0x90 */
+ 0xDF8E, 0xDAF8, 0xDF8F, 0xDAF6, 0xDF90, 0xDAF7, 0xDF91, 0xDF92, /* 0x90 */
+ 0xDF93, 0xDAFA, 0xD0CF, 0xC4C7, 0xDF94, 0xDF95, 0xB0EE, 0xDF96, /* 0xA0 */
+ 0xDF97, 0xDF98, 0xD0B0, 0xDF99, 0xDAF9, 0xDF9A, 0xD3CA, 0xBAAA, /* 0xA0 */
+ 0xDBA2, 0xC7F1, 0xDF9B, 0xDAFC, 0xDAFB, 0xC9DB, 0xDAFD, 0xDF9C, /* 0xB0 */
+ 0xDBA1, 0xD7DE, 0xDAFE, 0xC1DA, 0xDF9D, 0xDF9E, 0xDBA5, 0xDF9F, /* 0xB0 */
+ 0xDFA0, 0xD3F4, 0xE040, 0xE041, 0xDBA7, 0xDBA4, 0xE042, 0xDBA8, /* 0xC0 */
+ 0xE043, 0xE044, 0xBDBC, 0xE045, 0xE046, 0xE047, 0xC0C9, 0xDBA3, /* 0xC0 */
+ 0xDBA6, 0xD6A3, 0xE048, 0xDBA9, 0xE049, 0xE04A, 0xE04B, 0xDBAD, /* 0xD0 */
+ 0xE04C, 0xE04D, 0xE04E, 0xDBAE, 0xDBAC, 0xBAC2, 0xE04F, 0xE050, /* 0xD0 */
+ 0xE051, 0xBFA4, 0xDBAB, 0xE052, 0xE053, 0xE054, 0xDBAA, 0xD4C7, /* 0xE0 */
+ 0xB2BF, 0xE055, 0xE056, 0xDBAF, 0xE057, 0xB9F9, 0xE058, 0xDBB0, /* 0xE0 */
+ 0xE059, 0xE05A, 0xE05B, 0xE05C, 0xB3BB, 0xE05D, 0xE05E, 0xE05F, /* 0xF0 */
+ 0xB5A6, 0xE060, 0xE061, 0xE062, 0xE063, 0xB6BC, 0xDBB1, 0xE064 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE065, 0xE066, 0xB6F5, 0xE067, 0xDBB2, 0xE068, 0xE069, 0xE06A, /* 0x00 */
+ 0xE06B, 0xE06C, 0xE06D, 0xE06E, 0xE06F, 0xE070, 0xE071, 0xE072, /* 0x00 */
+ 0xE073, 0xE074, 0xE075, 0xE076, 0xE077, 0xE078, 0xE079, 0xE07A, /* 0x10 */
+ 0xE07B, 0xB1C9, 0xE07C, 0xE07D, 0xE07E, 0xE080, 0xDBB4, 0xE081, /* 0x10 */
+ 0xE082, 0xE083, 0xDBB3, 0xDBB5, 0xE084, 0xE085, 0xE086, 0xE087, /* 0x20 */
+ 0xE088, 0xE089, 0xE08A, 0xE08B, 0xE08C, 0xE08D, 0xE08E, 0xDBB7, /* 0x20 */
+ 0xE08F, 0xDBB6, 0xE090, 0xE091, 0xE092, 0xE093, 0xE094, 0xE095, /* 0x30 */
+ 0xE096, 0xDBB8, 0xE097, 0xE098, 0xE099, 0xE09A, 0xE09B, 0xE09C, /* 0x30 */
+ 0xE09D, 0xE09E, 0xE09F, 0xDBB9, 0xE0A0, 0xE140, 0xDBBA, 0xE141, /* 0x40 */
+ 0xE142, 0xD3CF, 0xF4FA, 0xC7F5, 0xD7C3, 0xC5E4, 0xF4FC, 0xF4FD, /* 0x40 */
+ 0xF4FB, 0xE143, 0xBEC6, 0xE144, 0xE145, 0xE146, 0xE147, 0xD0EF, /* 0x50 */
+ 0xE148, 0xE149, 0xB7D3, 0xE14A, 0xE14B, 0xD4CD, 0xCCAA, 0xE14C, /* 0x50 */
+ 0xE14D, 0xF5A2, 0xF5A1, 0xBAA8, 0xF4FE, 0xCBD6, 0xE14E, 0xE14F, /* 0x60 */
+ 0xE150, 0xF5A4, 0xC0D2, 0xE151, 0xB3EA, 0xE152, 0xCDAA, 0xF5A5, /* 0x60 */
+ 0xF5A3, 0xBDB4, 0xF5A8, 0xE153, 0xF5A9, 0xBDCD, 0xC3B8, 0xBFE1, /* 0x70 */
+ 0xCBE1, 0xF5AA, 0xE154, 0xE155, 0xE156, 0xF5A6, 0xF5A7, 0xC4F0, /* 0x70 */
+ 0xE157, 0xE158, 0xE159, 0xE15A, 0xE15B, 0xF5AC, 0xE15C, 0xB4BC, /* 0x80 */
+ 0xE15D, 0xD7ED, 0xE15E, 0xB4D7, 0xF5AB, 0xF5AE, 0xE15F, 0xE160, /* 0x80 */
+ 0xF5AD, 0xF5AF, 0xD0D1, 0xE161, 0xE162, 0xE163, 0xE164, 0xE165, /* 0x90 */
+ 0xE166, 0xE167, 0xC3D1, 0xC8A9, 0xE168, 0xE169, 0xE16A, 0xE16B, /* 0x90 */
+ 0xE16C, 0xE16D, 0xF5B0, 0xF5B1, 0xE16E, 0xE16F, 0xE170, 0xE171, /* 0xA0 */
+ 0xE172, 0xE173, 0xF5B2, 0xE174, 0xE175, 0xF5B3, 0xF5B4, 0xF5B5, /* 0xA0 */
+ 0xE176, 0xE177, 0xE178, 0xE179, 0xF5B7, 0xF5B6, 0xE17A, 0xE17B, /* 0xB0 */
+ 0xE17C, 0xE17D, 0xF5B8, 0xE17E, 0xE180, 0xE181, 0xE182, 0xE183, /* 0xB0 */
+ 0xE184, 0xE185, 0xE186, 0xE187, 0xE188, 0xE189, 0xE18A, 0xB2C9, /* 0xC0 */
+ 0xE18B, 0xD3D4, 0xCACD, 0xE18C, 0xC0EF, 0xD6D8, 0xD2B0, 0xC1BF, /* 0xC0 */
+ 0xE18D, 0xBDF0, 0xE18E, 0xE18F, 0xE190, 0xE191, 0xE192, 0xE193, /* 0xD0 */
+ 0xE194, 0xE195, 0xE196, 0xE197, 0xB8AA, 0xE198, 0xE199, 0xE19A, /* 0xD0 */
+ 0xE19B, 0xE19C, 0xE19D, 0xE19E, 0xE19F, 0xE1A0, 0xE240, 0xE241, /* 0xE0 */
+ 0xE242, 0xE243, 0xE244, 0xE245, 0xE246, 0xE247, 0xE248, 0xE249, /* 0xE0 */
+ 0xE24A, 0xE24B, 0xE24C, 0xE24D, 0xE24E, 0xE24F, 0xE250, 0xE251, /* 0xF0 */
+ 0xE252, 0xE253, 0xE254, 0xE255, 0xE256, 0xE257, 0xE258, 0xE259 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE25A, 0xE25B, 0xE25C, 0xE25D, 0xE25E, 0xE25F, 0xE260, 0xE261, /* 0x00 */
+ 0xE262, 0xE263, 0xE264, 0xE265, 0xE266, 0xE267, 0xE268, 0xE269, /* 0x00 */
+ 0xE26A, 0xE26B, 0xE26C, 0xE26D, 0xE26E, 0xE26F, 0xE270, 0xE271, /* 0x10 */
+ 0xE272, 0xE273, 0xE274, 0xE275, 0xE276, 0xE277, 0xE278, 0xE279, /* 0x10 */
+ 0xE27A, 0xE27B, 0xE27C, 0xE27D, 0xE27E, 0xE280, 0xE281, 0xE282, /* 0x20 */
+ 0xE283, 0xE284, 0xE285, 0xE286, 0xE287, 0xE288, 0xE289, 0xE28A, /* 0x20 */
+ 0xE28B, 0xE28C, 0xE28D, 0xE28E, 0xE28F, 0xE290, 0xE291, 0xE292, /* 0x30 */
+ 0xE293, 0xE294, 0xE295, 0xE296, 0xE297, 0xE298, 0xE299, 0xE29A, /* 0x30 */
+ 0xE29B, 0xE29C, 0xE29D, 0xE29E, 0xE29F, 0xE2A0, 0xE340, 0xE341, /* 0x40 */
+ 0xE342, 0xE343, 0xE344, 0xE345, 0xE346, 0xE347, 0xE348, 0xE349, /* 0x40 */
+ 0xE34A, 0xE34B, 0xE34C, 0xE34D, 0xE34E, 0xE34F, 0xE350, 0xE351, /* 0x50 */
+ 0xE352, 0xE353, 0xE354, 0xE355, 0xE356, 0xE357, 0xE358, 0xE359, /* 0x50 */
+ 0xE35A, 0xE35B, 0xE35C, 0xE35D, 0xE35E, 0xE35F, 0xE360, 0xE361, /* 0x60 */
+ 0xE362, 0xE363, 0xE364, 0xE365, 0xE366, 0xE367, 0xE368, 0xE369, /* 0x60 */
+ 0xE36A, 0xE36B, 0xE36C, 0xE36D, 0xBCF8, 0xE36E, 0xE36F, 0xE370, /* 0x70 */
+ 0xE371, 0xE372, 0xE373, 0xE374, 0xE375, 0xE376, 0xE377, 0xE378, /* 0x70 */
+ 0xE379, 0xE37A, 0xE37B, 0xE37C, 0xE37D, 0xE37E, 0xE380, 0xE381, /* 0x80 */
+ 0xE382, 0xE383, 0xE384, 0xE385, 0xE386, 0xE387, 0xF6C6, 0xE388, /* 0x80 */
+ 0xE389, 0xE38A, 0xE38B, 0xE38C, 0xE38D, 0xE38E, 0xE38F, 0xE390, /* 0x90 */
+ 0xE391, 0xE392, 0xE393, 0xE394, 0xE395, 0xE396, 0xE397, 0xE398, /* 0x90 */
+ 0xE399, 0xE39A, 0xE39B, 0xE39C, 0xE39D, 0xE39E, 0xE39F, 0xE3A0, /* 0xA0 */
+ 0xE440, 0xE441, 0xE442, 0xE443, 0xE444, 0xE445, 0xF6C7, 0xE446, /* 0xA0 */
+ 0xE447, 0xE448, 0xE449, 0xE44A, 0xE44B, 0xE44C, 0xE44D, 0xE44E, /* 0xB0 */
+ 0xE44F, 0xE450, 0xE451, 0xE452, 0xE453, 0xE454, 0xE455, 0xE456, /* 0xB0 */
+ 0xE457, 0xE458, 0xE459, 0xE45A, 0xE45B, 0xE45C, 0xE45D, 0xE45E, /* 0xC0 */
+ 0xF6C8, 0xE45F, 0xE460, 0xE461, 0xE462, 0xE463, 0xE464, 0xE465, /* 0xC0 */
+ 0xE466, 0xE467, 0xE468, 0xE469, 0xE46A, 0xE46B, 0xE46C, 0xE46D, /* 0xD0 */
+ 0xE46E, 0xE46F, 0xE470, 0xE471, 0xE472, 0xE473, 0xE474, 0xE475, /* 0xD0 */
+ 0xE476, 0xE477, 0xE478, 0xE479, 0xE47A, 0xE47B, 0xE47C, 0xE47D, /* 0xE0 */
+ 0xE47E, 0xE480, 0xE481, 0xE482, 0xE483, 0xE484, 0xE485, 0xE486, /* 0xE0 */
+ 0xE487, 0xE488, 0xE489, 0xE48A, 0xE48B, 0xE48C, 0xE48D, 0xE48E, /* 0xF0 */
+ 0xE48F, 0xE490, 0xE491, 0xE492, 0xE493, 0xE494, 0xE495, 0xE496 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE497, 0xE498, 0xE499, 0xE49A, 0xE49B, 0xE49C, 0xE49D, 0xE49E, /* 0x00 */
+ 0xE49F, 0xE4A0, 0xE540, 0xE541, 0xE542, 0xE543, 0xE544, 0xE545, /* 0x00 */
+ 0xE546, 0xE547, 0xE548, 0xE549, 0xE54A, 0xE54B, 0xE54C, 0xE54D, /* 0x10 */
+ 0xE54E, 0xE54F, 0xE550, 0xE551, 0xE552, 0xE553, 0xE554, 0xE555, /* 0x10 */
+ 0xE556, 0xE557, 0xE558, 0xE559, 0xE55A, 0xE55B, 0xE55C, 0xE55D, /* 0x20 */
+ 0xE55E, 0xE55F, 0xE560, 0xE561, 0xE562, 0xE563, 0xE564, 0xE565, /* 0x20 */
+ 0xE566, 0xE567, 0xE568, 0xE569, 0xE56A, 0xE56B, 0xE56C, 0xE56D, /* 0x30 */
+ 0xE56E, 0xE56F, 0xE570, 0xE571, 0xE572, 0xE573, 0xF6C9, 0xE574, /* 0x30 */
+ 0xE575, 0xE576, 0xE577, 0xE578, 0xE579, 0xE57A, 0xE57B, 0xE57C, /* 0x40 */
+ 0xE57D, 0xE57E, 0xE580, 0xE581, 0xE582, 0xE583, 0xE584, 0xE585, /* 0x40 */
+ 0xE586, 0xE587, 0xE588, 0xE589, 0xE58A, 0xE58B, 0xE58C, 0xE58D, /* 0x50 */
+ 0xE58E, 0xE58F, 0xE590, 0xE591, 0xE592, 0xE593, 0xE594, 0xE595, /* 0x50 */
+ 0xE596, 0xE597, 0xE598, 0xE599, 0xE59A, 0xE59B, 0xE59C, 0xE59D, /* 0x60 */
+ 0xE59E, 0xE59F, 0xF6CA, 0xE5A0, 0xE640, 0xE641, 0xE642, 0xE643, /* 0x60 */
+ 0xE644, 0xE645, 0xE646, 0xE647, 0xE648, 0xE649, 0xE64A, 0xE64B, /* 0x70 */
+ 0xE64C, 0xE64D, 0xE64E, 0xE64F, 0xE650, 0xE651, 0xE652, 0xE653, /* 0x70 */
+ 0xE654, 0xE655, 0xE656, 0xE657, 0xE658, 0xE659, 0xE65A, 0xE65B, /* 0x80 */
+ 0xE65C, 0xE65D, 0xE65E, 0xE65F, 0xE660, 0xE661, 0xE662, 0xF6CC, /* 0x80 */
+ 0xE663, 0xE664, 0xE665, 0xE666, 0xE667, 0xE668, 0xE669, 0xE66A, /* 0x90 */
+ 0xE66B, 0xE66C, 0xE66D, 0xE66E, 0xE66F, 0xE670, 0xE671, 0xE672, /* 0x90 */
+ 0xE673, 0xE674, 0xE675, 0xE676, 0xE677, 0xE678, 0xE679, 0xE67A, /* 0xA0 */
+ 0xE67B, 0xE67C, 0xE67D, 0xE67E, 0xE680, 0xE681, 0xE682, 0xE683, /* 0xA0 */
+ 0xE684, 0xE685, 0xE686, 0xE687, 0xE688, 0xE689, 0xE68A, 0xE68B, /* 0xB0 */
+ 0xE68C, 0xE68D, 0xE68E, 0xE68F, 0xE690, 0xE691, 0xE692, 0xE693, /* 0xB0 */
+ 0xE694, 0xE695, 0xE696, 0xE697, 0xE698, 0xE699, 0xE69A, 0xE69B, /* 0xC0 */
+ 0xE69C, 0xE69D, 0xF6CB, 0xE69E, 0xE69F, 0xE6A0, 0xE740, 0xE741, /* 0xC0 */
+ 0xE742, 0xE743, 0xE744, 0xE745, 0xE746, 0xE747, 0xF7E9, 0xE748, /* 0xD0 */
+ 0xE749, 0xE74A, 0xE74B, 0xE74C, 0xE74D, 0xE74E, 0xE74F, 0xE750, /* 0xD0 */
+ 0xE751, 0xE752, 0xE753, 0xE754, 0xE755, 0xE756, 0xE757, 0xE758, /* 0xE0 */
+ 0xE759, 0xE75A, 0xE75B, 0xE75C, 0xE75D, 0xE75E, 0xE75F, 0xE760, /* 0xE0 */
+ 0xE761, 0xE762, 0xE763, 0xE764, 0xE765, 0xE766, 0xE767, 0xE768, /* 0xF0 */
+ 0xE769, 0xE76A, 0xE76B, 0xE76C, 0xE76D, 0xE76E, 0xE76F, 0xE770 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE771, 0xE772, 0xE773, 0xE774, 0xE775, 0xE776, 0xE777, 0xE778, /* 0x00 */
+ 0xE779, 0xE77A, 0xE77B, 0xE77C, 0xE77D, 0xE77E, 0xE780, 0xE781, /* 0x00 */
+ 0xE782, 0xE783, 0xE784, 0xE785, 0xE786, 0xE787, 0xE788, 0xE789, /* 0x10 */
+ 0xE78A, 0xE78B, 0xE78C, 0xE78D, 0xE78E, 0xE78F, 0xE790, 0xE791, /* 0x10 */
+ 0xE792, 0xE793, 0xE794, 0xE795, 0xE796, 0xE797, 0xE798, 0xE799, /* 0x20 */
+ 0xE79A, 0xE79B, 0xE79C, 0xE79D, 0xE79E, 0xE79F, 0xE7A0, 0xE840, /* 0x20 */
+ 0xE841, 0xE842, 0xE843, 0xE844, 0xE845, 0xE846, 0xE847, 0xE848, /* 0x30 */
+ 0xE849, 0xE84A, 0xE84B, 0xE84C, 0xE84D, 0xE84E, 0xF6CD, 0xE84F, /* 0x30 */
+ 0xE850, 0xE851, 0xE852, 0xE853, 0xE854, 0xE855, 0xE856, 0xE857, /* 0x40 */
+ 0xE858, 0xE859, 0xE85A, 0xE85B, 0xE85C, 0xE85D, 0xE85E, 0xE85F, /* 0x40 */
+ 0xE860, 0xE861, 0xE862, 0xE863, 0xE864, 0xE865, 0xE866, 0xE867, /* 0x50 */
+ 0xE868, 0xE869, 0xE86A, 0xE86B, 0xE86C, 0xE86D, 0xE86E, 0xE86F, /* 0x50 */
+ 0xE870, 0xE871, 0xE872, 0xE873, 0xE874, 0xE875, 0xE876, 0xE877, /* 0x60 */
+ 0xE878, 0xE879, 0xE87A, 0xF6CE, 0xE87B, 0xE87C, 0xE87D, 0xE87E, /* 0x60 */
+ 0xE880, 0xE881, 0xE882, 0xE883, 0xE884, 0xE885, 0xE886, 0xE887, /* 0x70 */
+ 0xE888, 0xE889, 0xE88A, 0xE88B, 0xE88C, 0xE88D, 0xE88E, 0xE88F, /* 0x70 */
+ 0xE890, 0xE891, 0xE892, 0xE893, 0xE894, 0xEEC4, 0xEEC5, 0xEEC6, /* 0x80 */
+ 0xD5EB, 0xB6A4, 0xEEC8, 0xEEC7, 0xEEC9, 0xEECA, 0xC7A5, 0xEECB, /* 0x80 */
+ 0xEECC, 0xE895, 0xB7B0, 0xB5F6, 0xEECD, 0xEECF, 0xE896, 0xEECE, /* 0x90 */
+ 0xE897, 0xB8C6, 0xEED0, 0xEED1, 0xEED2, 0xB6DB, 0xB3AE, 0xD6D3, /* 0x90 */
+ 0xC4C6, 0xB1B5, 0xB8D6, 0xEED3, 0xEED4, 0xD4BF, 0xC7D5, 0xBEFB, /* 0xA0 */
+ 0xCED9, 0xB9B3, 0xEED6, 0xEED5, 0xEED8, 0xEED7, 0xC5A5, 0xEED9, /* 0xA0 */
+ 0xEEDA, 0xC7AE, 0xEEDB, 0xC7AF, 0xEEDC, 0xB2A7, 0xEEDD, 0xEEDE, /* 0xB0 */
+ 0xEEDF, 0xEEE0, 0xEEE1, 0xD7EA, 0xEEE2, 0xEEE3, 0xBCD8, 0xEEE4, /* 0xB0 */
+ 0xD3CB, 0xCCFA, 0xB2AC, 0xC1E5, 0xEEE5, 0xC7A6, 0xC3AD, 0xE898, /* 0xC0 */
+ 0xEEE6, 0xEEE7, 0xEEE8, 0xEEE9, 0xEEEA, 0xEEEB, 0xEEEC, 0xE899, /* 0xC0 */
+ 0xEEED, 0xEEEE, 0xEEEF, 0xE89A, 0xE89B, 0xEEF0, 0xEEF1, 0xEEF2, /* 0xD0 */
+ 0xEEF4, 0xEEF3, 0xE89C, 0xEEF5, 0xCDAD, 0xC2C1, 0xEEF6, 0xEEF7, /* 0xD0 */
+ 0xEEF8, 0xD5A1, 0xEEF9, 0xCFB3, 0xEEFA, 0xEEFB, 0xE89D, 0xEEFC, /* 0xE0 */
+ 0xEEFD, 0xEFA1, 0xEEFE, 0xEFA2, 0xB8F5, 0xC3FA, 0xEFA3, 0xEFA4, /* 0xE0 */
+ 0xBDC2, 0xD2BF, 0xB2F9, 0xEFA5, 0xEFA6, 0xEFA7, 0xD2F8, 0xEFA8, /* 0xF0 */
+ 0xD6FD, 0xEFA9, 0xC6CC, 0xE89E, 0xEFAA, 0xEFAB, 0xC1B4, 0xEFAC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFFA, 0xCBF8, 0xEFAE, 0xEFAD, 0xB3FA, 0xB9F8, 0xEFAF, 0xEFB0, /* 0x00 */
+ 0xD0E2, 0xEFB1, 0xEFB2, 0xB7E6, 0xD0BF, 0xEFB3, 0xEFB4, 0xEFB5, /* 0x00 */
+ 0xC8F1, 0xCCE0, 0xEFB6, 0xEFB7, 0xEFB8, 0xEFB9, 0xEFBA, 0xD5E0, /* 0x10 */
+ 0xEFBB, 0xB4ED, 0xC3AA, 0xEFBC, 0xE89F, 0xEFBD, 0xEFBE, 0xEFBF, /* 0x10 */
+ 0xE8A0, 0xCEFD, 0xEFC0, 0xC2E0, 0xB4B8, 0xD7B6, 0xBDF5, 0xE940, /* 0x20 */
+ 0xCFC7, 0xEFC3, 0xEFC1, 0xEFC2, 0xEFC4, 0xB6A7, 0xBCFC, 0xBEE2, /* 0x20 */
+ 0xC3CC, 0xEFC5, 0xEFC6, 0xE941, 0xEFC7, 0xEFCF, 0xEFC8, 0xEFC9, /* 0x30 */
+ 0xEFCA, 0xC7C2, 0xEFF1, 0xB6CD, 0xEFCB, 0xE942, 0xEFCC, 0xEFCD, /* 0x30 */
+ 0xB6C6, 0xC3BE, 0xEFCE, 0xE943, 0xEFD0, 0xEFD1, 0xEFD2, 0xD5F2, /* 0x40 */
+ 0xE944, 0xEFD3, 0xC4F7, 0xE945, 0xEFD4, 0xC4F8, 0xEFD5, 0xEFD6, /* 0x40 */
+ 0xB8E4, 0xB0F7, 0xEFD7, 0xEFD8, 0xEFD9, 0xE946, 0xEFDA, 0xEFDB, /* 0x50 */
+ 0xEFDC, 0xEFDD, 0xE947, 0xEFDE, 0xBEB5, 0xEFE1, 0xEFDF, 0xEFE0, /* 0x50 */
+ 0xE948, 0xEFE2, 0xEFE3, 0xC1CD, 0xEFE4, 0xEFE5, 0xEFE6, 0xEFE7, /* 0x60 */
+ 0xEFE8, 0xEFE9, 0xEFEA, 0xEFEB, 0xEFEC, 0xC0D8, 0xE949, 0xEFED, /* 0x60 */
+ 0xC1AD, 0xEFEE, 0xEFEF, 0xEFF0, 0xE94A, 0xE94B, 0xCFE2, 0xE94C, /* 0x70 */
+ 0xE94D, 0xE94E, 0xE94F, 0xE950, 0xE951, 0xE952, 0xE953, 0xB3A4, /* 0x70 */
+ 0xE954, 0xE955, 0xE956, 0xE957, 0xE958, 0xE959, 0xE95A, 0xE95B, /* 0x80 */
+ 0xE95C, 0xE95D, 0xE95E, 0xE95F, 0xE960, 0xE961, 0xE962, 0xE963, /* 0x80 */
+ 0xE964, 0xE965, 0xE966, 0xE967, 0xE968, 0xE969, 0xE96A, 0xE96B, /* 0x90 */
+ 0xE96C, 0xE96D, 0xE96E, 0xE96F, 0xE970, 0xE971, 0xE972, 0xE973, /* 0x90 */
+ 0xE974, 0xE975, 0xE976, 0xE977, 0xE978, 0xE979, 0xE97A, 0xE97B, /* 0xA0 */
+ 0xE97C, 0xE97D, 0xE97E, 0xE980, 0xE981, 0xE982, 0xE983, 0xE984, /* 0xA0 */
+ 0xE985, 0xE986, 0xE987, 0xE988, 0xE989, 0xE98A, 0xE98B, 0xE98C, /* 0xB0 */
+ 0xE98D, 0xE98E, 0xE98F, 0xE990, 0xE991, 0xE992, 0xE993, 0xE994, /* 0xB0 */
+ 0xE995, 0xE996, 0xE997, 0xE998, 0xE999, 0xE99A, 0xE99B, 0xE99C, /* 0xC0 */
+ 0xE99D, 0xE99E, 0xE99F, 0xE9A0, 0xEA40, 0xEA41, 0xEA42, 0xEA43, /* 0xC0 */
+ 0xEA44, 0xEA45, 0xEA46, 0xEA47, 0xEA48, 0xEA49, 0xEA4A, 0xEA4B, /* 0xD0 */
+ 0xEA4C, 0xEA4D, 0xEA4E, 0xEA4F, 0xEA50, 0xEA51, 0xEA52, 0xEA53, /* 0xD0 */
+ 0xEA54, 0xEA55, 0xEA56, 0xEA57, 0xEA58, 0xEA59, 0xEA5A, 0xEA5B, /* 0xE0 */
+ 0xC3C5, 0xE3C5, 0xC9C1, 0xE3C6, 0xEA5C, 0xB1D5, 0xCECA, 0xB4B3, /* 0xE0 */
+ 0xC8F2, 0xE3C7, 0xCFD0, 0xE3C8, 0xBCE4, 0xE3C9, 0xE3CA, 0xC3C6, /* 0xF0 */
+ 0xD5A2, 0xC4D6, 0xB9EB, 0xCEC5, 0xE3CB, 0xC3F6, 0xE3CC, 0xEA5D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB7A7, 0xB8F3, 0xBAD2, 0xE3CD, 0xE3CE, 0xD4C4, 0xE3CF, 0xEA5E, /* 0x00 */
+ 0xE3D0, 0xD1CB, 0xE3D1, 0xE3D2, 0xE3D3, 0xE3D4, 0xD1D6, 0xE3D5, /* 0x00 */
+ 0xB2FB, 0xC0BB, 0xE3D6, 0xEA5F, 0xC0AB, 0xE3D7, 0xE3D8, 0xE3D9, /* 0x10 */
+ 0xEA60, 0xE3DA, 0xE3DB, 0xEA61, 0xB8B7, 0xDAE2, 0xEA62, 0xB6D3, /* 0x10 */
+ 0xEA63, 0xDAE4, 0xDAE3, 0xEA64, 0xEA65, 0xEA66, 0xEA67, 0xEA68, /* 0x20 */
+ 0xEA69, 0xEA6A, 0xDAE6, 0xEA6B, 0xEA6C, 0xEA6D, 0xC8EE, 0xEA6E, /* 0x20 */
+ 0xEA6F, 0xDAE5, 0xB7C0, 0xD1F4, 0xD2F5, 0xD5F3, 0xBDD7, 0xEA70, /* 0x30 */
+ 0xEA71, 0xEA72, 0xEA73, 0xD7E8, 0xDAE8, 0xDAE7, 0xEA74, 0xB0A2, /* 0x30 */
+ 0xCDD3, 0xEA75, 0xDAE9, 0xEA76, 0xB8BD, 0xBCCA, 0xC2BD, 0xC2A4, /* 0x40 */
+ 0xB3C2, 0xDAEA, 0xEA77, 0xC2AA, 0xC4B0, 0xBDB5, 0xEA78, 0xEA79, /* 0x40 */
+ 0xCFDE, 0xEA7A, 0xEA7B, 0xEA7C, 0xDAEB, 0xC9C2, 0xEA7D, 0xEA7E, /* 0x50 */
+ 0xEA80, 0xEA81, 0xEA82, 0xB1DD, 0xEA83, 0xEA84, 0xEA85, 0xDAEC, /* 0x50 */
+ 0xEA86, 0xB6B8, 0xD4BA, 0xEA87, 0xB3FD, 0xEA88, 0xEA89, 0xDAED, /* 0x60 */
+ 0xD4C9, 0xCFD5, 0xC5E3, 0xEA8A, 0xDAEE, 0xEA8B, 0xEA8C, 0xEA8D, /* 0x60 */
+ 0xEA8E, 0xEA8F, 0xDAEF, 0xEA90, 0xDAF0, 0xC1EA, 0xCCD5, 0xCFDD, /* 0x70 */
+ 0xEA91, 0xEA92, 0xEA93, 0xEA94, 0xEA95, 0xEA96, 0xEA97, 0xEA98, /* 0x70 */
+ 0xEA99, 0xEA9A, 0xEA9B, 0xEA9C, 0xEA9D, 0xD3E7, 0xC2A1, 0xEA9E, /* 0x80 */
+ 0xDAF1, 0xEA9F, 0xEAA0, 0xCBE5, 0xEB40, 0xDAF2, 0xEB41, 0xCBE6, /* 0x80 */
+ 0xD2FE, 0xEB42, 0xEB43, 0xEB44, 0xB8F4, 0xEB45, 0xEB46, 0xDAF3, /* 0x90 */
+ 0xB0AF, 0xCFB6, 0xEB47, 0xEB48, 0xD5CF, 0xEB49, 0xEB4A, 0xEB4B, /* 0x90 */
+ 0xEB4C, 0xEB4D, 0xEB4E, 0xEB4F, 0xEB50, 0xEB51, 0xEB52, 0xCBED, /* 0xA0 */
+ 0xEB53, 0xEB54, 0xEB55, 0xEB56, 0xEB57, 0xEB58, 0xEB59, 0xEB5A, /* 0xA0 */
+ 0xDAF4, 0xEB5B, 0xEB5C, 0xE3C4, 0xEB5D, 0xEB5E, 0xC1A5, 0xEB5F, /* 0xB0 */
+ 0xEB60, 0xF6BF, 0xEB61, 0xEB62, 0xF6C0, 0xF6C1, 0xC4D1, 0xEB63, /* 0xB0 */
+ 0xC8B8, 0xD1E3, 0xEB64, 0xEB65, 0xD0DB, 0xD1C5, 0xBCAF, 0xB9CD, /* 0xC0 */
+ 0xEB66, 0xEFF4, 0xEB67, 0xEB68, 0xB4C6, 0xD3BA, 0xF6C2, 0xB3FB, /* 0xC0 */
+ 0xEB69, 0xEB6A, 0xF6C3, 0xEB6B, 0xEB6C, 0xB5F1, 0xEB6D, 0xEB6E, /* 0xD0 */
+ 0xEB6F, 0xEB70, 0xEB71, 0xEB72, 0xEB73, 0xEB74, 0xEB75, 0xEB76, /* 0xD0 */
+ 0xF6C5, 0xEB77, 0xEB78, 0xEB79, 0xEB7A, 0xEB7B, 0xEB7C, 0xEB7D, /* 0xE0 */
+ 0xD3EA, 0xF6A7, 0xD1A9, 0xEB7E, 0xEB80, 0xEB81, 0xEB82, 0xF6A9, /* 0xE0 */
+ 0xEB83, 0xEB84, 0xEB85, 0xF6A8, 0xEB86, 0xEB87, 0xC1E3, 0xC0D7, /* 0xF0 */
+ 0xEB88, 0xB1A2, 0xEB89, 0xEB8A, 0xEB8B, 0xEB8C, 0xCEED, 0xEB8D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD0E8, 0xF6AB, 0xEB8E, 0xEB8F, 0xCFF6, 0xEB90, 0xF6AA, 0xD5F0, /* 0x00 */
+ 0xF6AC, 0xC3B9, 0xEB91, 0xEB92, 0xEB93, 0xBBF4, 0xF6AE, 0xF6AD, /* 0x00 */
+ 0xEB94, 0xEB95, 0xEB96, 0xC4DE, 0xEB97, 0xEB98, 0xC1D8, 0xEB99, /* 0x10 */
+ 0xEB9A, 0xEB9B, 0xEB9C, 0xEB9D, 0xCBAA, 0xEB9E, 0xCFBC, 0xEB9F, /* 0x10 */
+ 0xEBA0, 0xEC40, 0xEC41, 0xEC42, 0xEC43, 0xEC44, 0xEC45, 0xEC46, /* 0x20 */
+ 0xEC47, 0xEC48, 0xF6AF, 0xEC49, 0xEC4A, 0xF6B0, 0xEC4B, 0xEC4C, /* 0x20 */
+ 0xF6B1, 0xEC4D, 0xC2B6, 0xEC4E, 0xEC4F, 0xEC50, 0xEC51, 0xEC52, /* 0x30 */
+ 0xB0D4, 0xC5F9, 0xEC53, 0xEC54, 0xEC55, 0xEC56, 0xF6B2, 0xEC57, /* 0x30 */
+ 0xEC58, 0xEC59, 0xEC5A, 0xEC5B, 0xEC5C, 0xEC5D, 0xEC5E, 0xEC5F, /* 0x40 */
+ 0xEC60, 0xEC61, 0xEC62, 0xEC63, 0xEC64, 0xEC65, 0xEC66, 0xEC67, /* 0x40 */
+ 0xEC68, 0xEC69, 0xC7E0, 0xF6A6, 0xEC6A, 0xEC6B, 0xBEB8, 0xEC6C, /* 0x50 */
+ 0xEC6D, 0xBEB2, 0xEC6E, 0xB5E5, 0xEC6F, 0xEC70, 0xB7C7, 0xEC71, /* 0x50 */
+ 0xBFBF, 0xC3D2, 0xC3E6, 0xEC72, 0xEC73, 0xD8CC, 0xEC74, 0xEC75, /* 0x60 */
+ 0xEC76, 0xB8EF, 0xEC77, 0xEC78, 0xEC79, 0xEC7A, 0xEC7B, 0xEC7C, /* 0x60 */
+ 0xEC7D, 0xEC7E, 0xEC80, 0xBDF9, 0xD1A5, 0xEC81, 0xB0D0, 0xEC82, /* 0x70 */
+ 0xEC83, 0xEC84, 0xEC85, 0xEC86, 0xF7B0, 0xEC87, 0xEC88, 0xEC89, /* 0x70 */
+ 0xEC8A, 0xEC8B, 0xEC8C, 0xEC8D, 0xEC8E, 0xF7B1, 0xEC8F, 0xEC90, /* 0x80 */
+ 0xEC91, 0xEC92, 0xEC93, 0xD0AC, 0xEC94, 0xB0B0, 0xEC95, 0xEC96, /* 0x80 */
+ 0xEC97, 0xF7B2, 0xF7B3, 0xEC98, 0xF7B4, 0xEC99, 0xEC9A, 0xEC9B, /* 0x90 */
+ 0xC7CA, 0xEC9C, 0xEC9D, 0xEC9E, 0xEC9F, 0xECA0, 0xED40, 0xED41, /* 0x90 */
+ 0xBECF, 0xED42, 0xED43, 0xF7B7, 0xED44, 0xED45, 0xED46, 0xED47, /* 0xA0 */
+ 0xED48, 0xED49, 0xED4A, 0xF7B6, 0xED4B, 0xB1DE, 0xED4C, 0xF7B5, /* 0xA0 */
+ 0xED4D, 0xED4E, 0xF7B8, 0xED4F, 0xF7B9, 0xED50, 0xED51, 0xED52, /* 0xB0 */
+ 0xED53, 0xED54, 0xED55, 0xED56, 0xED57, 0xED58, 0xED59, 0xED5A, /* 0xB0 */
+ 0xED5B, 0xED5C, 0xED5D, 0xED5E, 0xED5F, 0xED60, 0xED61, 0xED62, /* 0xC0 */
+ 0xED63, 0xED64, 0xED65, 0xED66, 0xED67, 0xED68, 0xED69, 0xED6A, /* 0xC0 */
+ 0xED6B, 0xED6C, 0xED6D, 0xED6E, 0xED6F, 0xED70, 0xED71, 0xED72, /* 0xD0 */
+ 0xED73, 0xED74, 0xED75, 0xED76, 0xED77, 0xED78, 0xED79, 0xED7A, /* 0xD0 */
+ 0xED7B, 0xED7C, 0xED7D, 0xED7E, 0xED80, 0xED81, 0xCEA4, 0xC8CD, /* 0xE0 */
+ 0xED82, 0xBAAB, 0xE8B8, 0xE8B9, 0xE8BA, 0xBEC2, 0xED83, 0xED84, /* 0xE0 */
+ 0xED85, 0xED86, 0xED87, 0xD2F4, 0xED88, 0xD4CF, 0xC9D8, 0xED89, /* 0xF0 */
+ 0xED8A, 0xED8B, 0xED8C, 0xED8D, 0xED8E, 0xED8F, 0xED90, 0xED91 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xED92, 0xED93, 0xED94, 0xED95, 0xED96, 0xED97, 0xED98, 0xED99, /* 0x00 */
+ 0xED9A, 0xED9B, 0xED9C, 0xED9D, 0xED9E, 0xED9F, 0xEDA0, 0xEE40, /* 0x00 */
+ 0xEE41, 0xEE42, 0xEE43, 0xEE44, 0xEE45, 0xEE46, 0xEE47, 0xEE48, /* 0x10 */
+ 0xEE49, 0xEE4A, 0xEE4B, 0xEE4C, 0xEE4D, 0xEE4E, 0xEE4F, 0xEE50, /* 0x10 */
+ 0xEE51, 0xEE52, 0xEE53, 0xEE54, 0xEE55, 0xEE56, 0xEE57, 0xEE58, /* 0x20 */
+ 0xEE59, 0xEE5A, 0xEE5B, 0xEE5C, 0xEE5D, 0xEE5E, 0xEE5F, 0xEE60, /* 0x20 */
+ 0xEE61, 0xEE62, 0xEE63, 0xEE64, 0xEE65, 0xEE66, 0xEE67, 0xEE68, /* 0x30 */
+ 0xEE69, 0xEE6A, 0xEE6B, 0xEE6C, 0xEE6D, 0xEE6E, 0xEE6F, 0xEE70, /* 0x30 */
+ 0xEE71, 0xEE72, 0xEE73, 0xEE74, 0xEE75, 0xEE76, 0xEE77, 0xEE78, /* 0x40 */
+ 0xEE79, 0xEE7A, 0xEE7B, 0xEE7C, 0xEE7D, 0xEE7E, 0xEE80, 0xEE81, /* 0x40 */
+ 0xEE82, 0xEE83, 0xEE84, 0xEE85, 0xEE86, 0xEE87, 0xEE88, 0xEE89, /* 0x50 */
+ 0xEE8A, 0xEE8B, 0xEE8C, 0xEE8D, 0xEE8E, 0xEE8F, 0xEE90, 0xEE91, /* 0x50 */
+ 0xEE92, 0xEE93, 0xEE94, 0xEE95, 0xEE96, 0xEE97, 0xEE98, 0xEE99, /* 0x60 */
+ 0xEE9A, 0xEE9B, 0xEE9C, 0xEE9D, 0xEE9E, 0xEE9F, 0xEEA0, 0xEF40, /* 0x60 */
+ 0xEF41, 0xEF42, 0xEF43, 0xEF44, 0xEF45, 0xD2B3, 0xB6A5, 0xC7EA, /* 0x70 */
+ 0xF1FC, 0xCFEE, 0xCBB3, 0xD0EB, 0xE7EF, 0xCDE7, 0xB9CB, 0xB6D9, /* 0x70 */
+ 0xF1FD, 0xB0E4, 0xCBCC, 0xF1FE, 0xD4A4, 0xC2AD, 0xC1EC, 0xC6C4, /* 0x80 */
+ 0xBEB1, 0xF2A1, 0xBCD5, 0xEF46, 0xF2A2, 0xF2A3, 0xEF47, 0xF2A4, /* 0x80 */
+ 0xD2C3, 0xC6B5, 0xEF48, 0xCDC7, 0xF2A5, 0xEF49, 0xD3B1, 0xBFC5, /* 0x90 */
+ 0xCCE2, 0xEF4A, 0xF2A6, 0xF2A7, 0xD1D5, 0xB6EE, 0xF2A8, 0xF2A9, /* 0x90 */
+ 0xB5DF, 0xF2AA, 0xF2AB, 0xEF4B, 0xB2FC, 0xF2AC, 0xF2AD, 0xC8A7, /* 0xA0 */
+ 0xEF4C, 0xEF4D, 0xEF4E, 0xEF4F, 0xEF50, 0xEF51, 0xEF52, 0xEF53, /* 0xA0 */
+ 0xEF54, 0xEF55, 0xEF56, 0xEF57, 0xEF58, 0xEF59, 0xEF5A, 0xEF5B, /* 0xB0 */
+ 0xEF5C, 0xEF5D, 0xEF5E, 0xEF5F, 0xEF60, 0xEF61, 0xEF62, 0xEF63, /* 0xB0 */
+ 0xEF64, 0xEF65, 0xEF66, 0xEF67, 0xEF68, 0xEF69, 0xEF6A, 0xEF6B, /* 0xC0 */
+ 0xEF6C, 0xEF6D, 0xEF6E, 0xEF6F, 0xEF70, 0xEF71, 0xB7E7, 0xEF72, /* 0xC0 */
+ 0xEF73, 0xECA9, 0xECAA, 0xECAB, 0xEF74, 0xECAC, 0xEF75, 0xEF76, /* 0xD0 */
+ 0xC6AE, 0xECAD, 0xECAE, 0xEF77, 0xEF78, 0xEF79, 0xB7C9, 0xCAB3, /* 0xD0 */
+ 0xEF7A, 0xEF7B, 0xEF7C, 0xEF7D, 0xEF7E, 0xEF80, 0xEF81, 0xE2B8, /* 0xE0 */
+ 0xF7CF, 0xEF82, 0xEF83, 0xEF84, 0xEF85, 0xEF86, 0xEF87, 0xEF88, /* 0xE0 */
+ 0xEF89, 0xEF8A, 0xEF8B, 0xEF8C, 0xEF8D, 0xEF8E, 0xEF8F, 0xEF90, /* 0xF0 */
+ 0xEF91, 0xEF92, 0xEF93, 0xEF94, 0xEF95, 0xEF96, 0xEF97, 0xEF98 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEF99, 0xEF9A, 0xEF9B, 0xEF9C, 0xEF9D, 0xEF9E, 0xEF9F, 0xEFA0, /* 0x00 */
+ 0xF040, 0xF041, 0xF042, 0xF043, 0xF044, 0xF7D0, 0xF045, 0xF046, /* 0x00 */
+ 0xB2CD, 0xF047, 0xF048, 0xF049, 0xF04A, 0xF04B, 0xF04C, 0xF04D, /* 0x10 */
+ 0xF04E, 0xF04F, 0xF050, 0xF051, 0xF052, 0xF053, 0xF054, 0xF055, /* 0x10 */
+ 0xF056, 0xF057, 0xF058, 0xF059, 0xF05A, 0xF05B, 0xF05C, 0xF05D, /* 0x20 */
+ 0xF05E, 0xF05F, 0xF060, 0xF061, 0xF062, 0xF063, 0xF7D1, 0xF064, /* 0x20 */
+ 0xF065, 0xF066, 0xF067, 0xF068, 0xF069, 0xF06A, 0xF06B, 0xF06C, /* 0x30 */
+ 0xF06D, 0xF06E, 0xF06F, 0xF070, 0xF071, 0xF072, 0xF073, 0xF074, /* 0x30 */
+ 0xF075, 0xF076, 0xF077, 0xF078, 0xF079, 0xF07A, 0xF07B, 0xF07C, /* 0x40 */
+ 0xF07D, 0xF07E, 0xF080, 0xF081, 0xF082, 0xF083, 0xF084, 0xF085, /* 0x40 */
+ 0xF086, 0xF087, 0xF088, 0xF089, 0xF7D3, 0xF7D2, 0xF08A, 0xF08B, /* 0x50 */
+ 0xF08C, 0xF08D, 0xF08E, 0xF08F, 0xF090, 0xF091, 0xF092, 0xF093, /* 0x50 */
+ 0xF094, 0xF095, 0xF096, 0xE2BB, 0xF097, 0xBCA2, 0xF098, 0xE2BC, /* 0x60 */
+ 0xE2BD, 0xE2BE, 0xE2BF, 0xE2C0, 0xE2C1, 0xB7B9, 0xD2FB, 0xBDA4, /* 0x60 */
+ 0xCACE, 0xB1A5, 0xCBC7, 0xF099, 0xE2C2, 0xB6FC, 0xC8C4, 0xE2C3, /* 0x70 */
+ 0xF09A, 0xF09B, 0xBDC8, 0xF09C, 0xB1FD, 0xE2C4, 0xF09D, 0xB6F6, /* 0x70 */
+ 0xE2C5, 0xC4D9, 0xF09E, 0xF09F, 0xE2C6, 0xCFDA, 0xB9DD, 0xE2C7, /* 0x80 */
+ 0xC0A1, 0xF0A0, 0xE2C8, 0xB2F6, 0xF140, 0xE2C9, 0xF141, 0xC1F3, /* 0x80 */
+ 0xE2CA, 0xE2CB, 0xC2F8, 0xE2CC, 0xE2CD, 0xE2CE, 0xCAD7, 0xD8B8, /* 0x90 */
+ 0xD9E5, 0xCFE3, 0xF142, 0xF143, 0xF144, 0xF145, 0xF146, 0xF147, /* 0x90 */
+ 0xF148, 0xF149, 0xF14A, 0xF14B, 0xF14C, 0xF0A5, 0xF14D, 0xF14E, /* 0xA0 */
+ 0xDCB0, 0xF14F, 0xF150, 0xF151, 0xF152, 0xF153, 0xF154, 0xF155, /* 0xA0 */
+ 0xF156, 0xF157, 0xF158, 0xF159, 0xF15A, 0xF15B, 0xF15C, 0xF15D, /* 0xB0 */
+ 0xF15E, 0xF15F, 0xF160, 0xF161, 0xF162, 0xF163, 0xF164, 0xF165, /* 0xB0 */
+ 0xF166, 0xF167, 0xF168, 0xF169, 0xF16A, 0xF16B, 0xF16C, 0xF16D, /* 0xC0 */
+ 0xF16E, 0xF16F, 0xF170, 0xF171, 0xF172, 0xF173, 0xF174, 0xF175, /* 0xC0 */
+ 0xF176, 0xF177, 0xF178, 0xF179, 0xF17A, 0xF17B, 0xF17C, 0xF17D, /* 0xD0 */
+ 0xF17E, 0xF180, 0xF181, 0xF182, 0xF183, 0xF184, 0xF185, 0xF186, /* 0xD0 */
+ 0xF187, 0xF188, 0xF189, 0xF18A, 0xF18B, 0xF18C, 0xF18D, 0xF18E, /* 0xE0 */
+ 0xF18F, 0xF190, 0xF191, 0xF192, 0xF193, 0xF194, 0xF195, 0xF196, /* 0xE0 */
+ 0xF197, 0xF198, 0xF199, 0xF19A, 0xF19B, 0xF19C, 0xF19D, 0xF19E, /* 0xF0 */
+ 0xF19F, 0xF1A0, 0xF240, 0xF241, 0xF242, 0xF243, 0xF244, 0xF245 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF246, 0xF247, 0xF248, 0xF249, 0xF24A, 0xF24B, 0xF24C, 0xF24D, /* 0x00 */
+ 0xF24E, 0xF24F, 0xF250, 0xF251, 0xF252, 0xF253, 0xF254, 0xF255, /* 0x00 */
+ 0xF256, 0xF257, 0xF258, 0xF259, 0xF25A, 0xF25B, 0xF25C, 0xF25D, /* 0x10 */
+ 0xF25E, 0xF25F, 0xF260, 0xF261, 0xF262, 0xF263, 0xF264, 0xF265, /* 0x10 */
+ 0xF266, 0xF267, 0xF268, 0xF269, 0xF26A, 0xF26B, 0xF26C, 0xF26D, /* 0x20 */
+ 0xF26E, 0xF26F, 0xF270, 0xF271, 0xF272, 0xF273, 0xF274, 0xF275, /* 0x20 */
+ 0xF276, 0xF277, 0xF278, 0xF279, 0xF27A, 0xF27B, 0xF27C, 0xF27D, /* 0x30 */
+ 0xF27E, 0xF280, 0xF281, 0xF282, 0xF283, 0xF284, 0xF285, 0xF286, /* 0x30 */
+ 0xF287, 0xF288, 0xF289, 0xF28A, 0xF28B, 0xF28C, 0xF28D, 0xF28E, /* 0x40 */
+ 0xF28F, 0xF290, 0xF291, 0xF292, 0xF293, 0xF294, 0xF295, 0xF296, /* 0x40 */
+ 0xF297, 0xF298, 0xF299, 0xF29A, 0xF29B, 0xF29C, 0xF29D, 0xF29E, /* 0x50 */
+ 0xF29F, 0xF2A0, 0xF340, 0xF341, 0xF342, 0xF343, 0xF344, 0xF345, /* 0x50 */
+ 0xF346, 0xF347, 0xF348, 0xF349, 0xF34A, 0xF34B, 0xF34C, 0xF34D, /* 0x60 */
+ 0xF34E, 0xF34F, 0xF350, 0xF351, 0xC2ED, 0xD4A6, 0xCDD4, 0xD1B1, /* 0x60 */
+ 0xB3DB, 0xC7FD, 0xF352, 0xB2B5, 0xC2BF, 0xE6E0, 0xCABB, 0xE6E1, /* 0x70 */
+ 0xE6E2, 0xBED4, 0xE6E3, 0xD7A4, 0xCDD5, 0xE6E5, 0xBCDD, 0xE6E4, /* 0x70 */
+ 0xE6E6, 0xE6E7, 0xC2EE, 0xF353, 0xBDBE, 0xE6E8, 0xC2E6, 0xBAA7, /* 0x80 */
+ 0xE6E9, 0xF354, 0xE6EA, 0xB3D2, 0xD1E9, 0xF355, 0xF356, 0xBFA5, /* 0x80 */
+ 0xE6EB, 0xC6EF, 0xE6EC, 0xE6ED, 0xF357, 0xF358, 0xE6EE, 0xC6AD, /* 0x90 */
+ 0xE6EF, 0xF359, 0xC9A7, 0xE6F0, 0xE6F1, 0xE6F2, 0xE5B9, 0xE6F3, /* 0x90 */
+ 0xE6F4, 0xC2E2, 0xE6F5, 0xE6F6, 0xD6E8, 0xE6F7, 0xF35A, 0xE6F8, /* 0xA0 */
+ 0xB9C7, 0xF35B, 0xF35C, 0xF35D, 0xF35E, 0xF35F, 0xF360, 0xF361, /* 0xA0 */
+ 0xF7BB, 0xF7BA, 0xF362, 0xF363, 0xF364, 0xF365, 0xF7BE, 0xF7BC, /* 0xB0 */
+ 0xBAA1, 0xF366, 0xF7BF, 0xF367, 0xF7C0, 0xF368, 0xF369, 0xF36A, /* 0xB0 */
+ 0xF7C2, 0xF7C1, 0xF7C4, 0xF36B, 0xF36C, 0xF7C3, 0xF36D, 0xF36E, /* 0xC0 */
+ 0xF36F, 0xF370, 0xF371, 0xF7C5, 0xF7C6, 0xF372, 0xF373, 0xF374, /* 0xC0 */
+ 0xF375, 0xF7C7, 0xF376, 0xCBE8, 0xF377, 0xF378, 0xF379, 0xF37A, /* 0xD0 */
+ 0xB8DF, 0xF37B, 0xF37C, 0xF37D, 0xF37E, 0xF380, 0xF381, 0xF7D4, /* 0xD0 */
+ 0xF382, 0xF7D5, 0xF383, 0xF384, 0xF385, 0xF386, 0xF7D6, 0xF387, /* 0xE0 */
+ 0xF388, 0xF389, 0xF38A, 0xF7D8, 0xF38B, 0xF7DA, 0xF38C, 0xF7D7, /* 0xE0 */
+ 0xF38D, 0xF38E, 0xF38F, 0xF390, 0xF391, 0xF392, 0xF393, 0xF394, /* 0xF0 */
+ 0xF395, 0xF7DB, 0xF396, 0xF7D9, 0xF397, 0xF398, 0xF399, 0xF39A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF39B, 0xF39C, 0xF39D, 0xD7D7, 0xF39E, 0xF39F, 0xF3A0, 0xF440, /* 0x00 */
+ 0xF7DC, 0xF441, 0xF442, 0xF443, 0xF444, 0xF445, 0xF446, 0xF7DD, /* 0x00 */
+ 0xF447, 0xF448, 0xF449, 0xF7DE, 0xF44A, 0xF44B, 0xF44C, 0xF44D, /* 0x10 */
+ 0xF44E, 0xF44F, 0xF450, 0xF451, 0xF452, 0xF453, 0xF454, 0xF7DF, /* 0x10 */
+ 0xF455, 0xF456, 0xF457, 0xF7E0, 0xF458, 0xF459, 0xF45A, 0xF45B, /* 0x20 */
+ 0xF45C, 0xF45D, 0xF45E, 0xF45F, 0xF460, 0xF461, 0xF462, 0xDBCB, /* 0x20 */
+ 0xF463, 0xF464, 0xD8AA, 0xF465, 0xF466, 0xF467, 0xF468, 0xF469, /* 0x30 */
+ 0xF46A, 0xF46B, 0xF46C, 0xE5F7, 0xB9ED, 0xF46D, 0xF46E, 0xF46F, /* 0x30 */
+ 0xF470, 0xBFFD, 0xBBEA, 0xF7C9, 0xC6C7, 0xF7C8, 0xF471, 0xF7CA, /* 0x40 */
+ 0xF7CC, 0xF7CB, 0xF472, 0xF473, 0xF474, 0xF7CD, 0xF475, 0xCEBA, /* 0x40 */
+ 0xF476, 0xF7CE, 0xF477, 0xF478, 0xC4A7, 0xF479, 0xF47A, 0xF47B, /* 0x50 */
+ 0xF47C, 0xF47D, 0xF47E, 0xF480, 0xF481, 0xF482, 0xF483, 0xF484, /* 0x50 */
+ 0xF485, 0xF486, 0xF487, 0xF488, 0xF489, 0xF48A, 0xF48B, 0xF48C, /* 0x60 */
+ 0xF48D, 0xF48E, 0xF48F, 0xF490, 0xF491, 0xF492, 0xF493, 0xF494, /* 0x60 */
+ 0xF495, 0xF496, 0xF497, 0xF498, 0xF499, 0xF49A, 0xF49B, 0xF49C, /* 0x70 */
+ 0xF49D, 0xF49E, 0xF49F, 0xF4A0, 0xF540, 0xF541, 0xF542, 0xF543, /* 0x70 */
+ 0xF544, 0xF545, 0xF546, 0xF547, 0xF548, 0xF549, 0xF54A, 0xF54B, /* 0x80 */
+ 0xF54C, 0xF54D, 0xF54E, 0xF54F, 0xF550, 0xF551, 0xF552, 0xF553, /* 0x80 */
+ 0xF554, 0xF555, 0xF556, 0xF557, 0xF558, 0xF559, 0xF55A, 0xF55B, /* 0x90 */
+ 0xF55C, 0xF55D, 0xF55E, 0xF55F, 0xF560, 0xF561, 0xF562, 0xF563, /* 0x90 */
+ 0xF564, 0xF565, 0xF566, 0xF567, 0xF568, 0xF569, 0xF56A, 0xF56B, /* 0xA0 */
+ 0xF56C, 0xF56D, 0xF56E, 0xF56F, 0xF570, 0xF571, 0xF572, 0xF573, /* 0xA0 */
+ 0xF574, 0xF575, 0xF576, 0xF577, 0xF578, 0xF579, 0xF57A, 0xF57B, /* 0xB0 */
+ 0xF57C, 0xF57D, 0xF57E, 0xF580, 0xF581, 0xF582, 0xF583, 0xF584, /* 0xB0 */
+ 0xF585, 0xF586, 0xF587, 0xF588, 0xF589, 0xF58A, 0xF58B, 0xF58C, /* 0xC0 */
+ 0xF58D, 0xF58E, 0xF58F, 0xF590, 0xF591, 0xF592, 0xF593, 0xF594, /* 0xC0 */
+ 0xF595, 0xF596, 0xF597, 0xF598, 0xF599, 0xF59A, 0xF59B, 0xF59C, /* 0xD0 */
+ 0xF59D, 0xF59E, 0xF59F, 0xF5A0, 0xF640, 0xF641, 0xF642, 0xF643, /* 0xD0 */
+ 0xF644, 0xF645, 0xF646, 0xF647, 0xF648, 0xF649, 0xF64A, 0xF64B, /* 0xE0 */
+ 0xF64C, 0xF64D, 0xF64E, 0xF64F, 0xF650, 0xF651, 0xF652, 0xF653, /* 0xE0 */
+ 0xF654, 0xF655, 0xF656, 0xF657, 0xF658, 0xF659, 0xF65A, 0xF65B, /* 0xF0 */
+ 0xF65C, 0xF65D, 0xF65E, 0xF65F, 0xF660, 0xF661, 0xF662, 0xF663 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF664, 0xF665, 0xF666, 0xF667, 0xF668, 0xF669, 0xF66A, 0xF66B, /* 0x00 */
+ 0xF66C, 0xF66D, 0xF66E, 0xF66F, 0xF670, 0xF671, 0xF672, 0xF673, /* 0x00 */
+ 0xF674, 0xF675, 0xF676, 0xF677, 0xF678, 0xF679, 0xF67A, 0xF67B, /* 0x10 */
+ 0xF67C, 0xF67D, 0xF67E, 0xF680, 0xF681, 0xF682, 0xF683, 0xF684, /* 0x10 */
+ 0xF685, 0xF686, 0xF687, 0xF688, 0xF689, 0xF68A, 0xF68B, 0xF68C, /* 0x20 */
+ 0xF68D, 0xF68E, 0xF68F, 0xF690, 0xF691, 0xF692, 0xF693, 0xF694, /* 0x20 */
+ 0xF695, 0xF696, 0xF697, 0xF698, 0xF699, 0xF69A, 0xF69B, 0xF69C, /* 0x30 */
+ 0xF69D, 0xF69E, 0xF69F, 0xF6A0, 0xF740, 0xF741, 0xF742, 0xF743, /* 0x30 */
+ 0xF744, 0xF745, 0xF746, 0xF747, 0xF748, 0xF749, 0xF74A, 0xF74B, /* 0x40 */
+ 0xF74C, 0xF74D, 0xF74E, 0xF74F, 0xF750, 0xF751, 0xF752, 0xF753, /* 0x40 */
+ 0xF754, 0xF755, 0xF756, 0xF757, 0xF758, 0xF759, 0xF75A, 0xF75B, /* 0x50 */
+ 0xF75C, 0xF75D, 0xF75E, 0xF75F, 0xF760, 0xF761, 0xF762, 0xF763, /* 0x50 */
+ 0xF764, 0xF765, 0xF766, 0xF767, 0xF768, 0xF769, 0xF76A, 0xF76B, /* 0x60 */
+ 0xF76C, 0xF76D, 0xF76E, 0xF76F, 0xF770, 0xF771, 0xF772, 0xF773, /* 0x60 */
+ 0xF774, 0xF775, 0xF776, 0xF777, 0xF778, 0xF779, 0xF77A, 0xF77B, /* 0x70 */
+ 0xF77C, 0xF77D, 0xF77E, 0xF780, 0xD3E3, 0xF781, 0xF782, 0xF6CF, /* 0x70 */
+ 0xF783, 0xC2B3, 0xF6D0, 0xF784, 0xF785, 0xF6D1, 0xF6D2, 0xF6D3, /* 0x80 */
+ 0xF6D4, 0xF786, 0xF787, 0xF6D6, 0xF788, 0xB1AB, 0xF6D7, 0xF789, /* 0x80 */
+ 0xF6D8, 0xF6D9, 0xF6DA, 0xF78A, 0xF6DB, 0xF6DC, 0xF78B, 0xF78C, /* 0x90 */
+ 0xF78D, 0xF78E, 0xF6DD, 0xF6DE, 0xCFCA, 0xF78F, 0xF6DF, 0xF6E0, /* 0x90 */
+ 0xF6E1, 0xF6E2, 0xF6E3, 0xF6E4, 0xC0F0, 0xF6E5, 0xF6E6, 0xF6E7, /* 0xA0 */
+ 0xF6E8, 0xF6E9, 0xF790, 0xF6EA, 0xF791, 0xF6EB, 0xF6EC, 0xF792, /* 0xA0 */
+ 0xF6ED, 0xF6EE, 0xF6EF, 0xF6F0, 0xF6F1, 0xF6F2, 0xF6F3, 0xF6F4, /* 0xB0 */
+ 0xBEA8, 0xF793, 0xF6F5, 0xF6F6, 0xF6F7, 0xF6F8, 0xF794, 0xF795, /* 0xB0 */
+ 0xF796, 0xF797, 0xF798, 0xC8FA, 0xF6F9, 0xF6FA, 0xF6FB, 0xF6FC, /* 0xC0 */
+ 0xF799, 0xF79A, 0xF6FD, 0xF6FE, 0xF7A1, 0xF7A2, 0xF7A3, 0xF7A4, /* 0xC0 */
+ 0xF7A5, 0xF79B, 0xF79C, 0xF7A6, 0xF7A7, 0xF7A8, 0xB1EE, 0xF7A9, /* 0xD0 */
+ 0xF7AA, 0xF7AB, 0xF79D, 0xF79E, 0xF7AC, 0xF7AD, 0xC1DB, 0xF7AE, /* 0xD0 */
+ 0xF79F, 0xF7A0, 0xF7AF, 0xF840, 0xF841, 0xF842, 0xF843, 0xF844, /* 0xE0 */
+ 0xF845, 0xF846, 0xF847, 0xF848, 0xF849, 0xF84A, 0xF84B, 0xF84C, /* 0xE0 */
+ 0xF84D, 0xF84E, 0xF84F, 0xF850, 0xF851, 0xF852, 0xF853, 0xF854, /* 0xF0 */
+ 0xF855, 0xF856, 0xF857, 0xF858, 0xF859, 0xF85A, 0xF85B, 0xF85C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF85D, 0xF85E, 0xF85F, 0xF860, 0xF861, 0xF862, 0xF863, 0xF864, /* 0x00 */
+ 0xF865, 0xF866, 0xF867, 0xF868, 0xF869, 0xF86A, 0xF86B, 0xF86C, /* 0x00 */
+ 0xF86D, 0xF86E, 0xF86F, 0xF870, 0xF871, 0xF872, 0xF873, 0xF874, /* 0x10 */
+ 0xF875, 0xF876, 0xF877, 0xF878, 0xF879, 0xF87A, 0xF87B, 0xF87C, /* 0x10 */
+ 0xF87D, 0xF87E, 0xF880, 0xF881, 0xF882, 0xF883, 0xF884, 0xF885, /* 0x20 */
+ 0xF886, 0xF887, 0xF888, 0xF889, 0xF88A, 0xF88B, 0xF88C, 0xF88D, /* 0x20 */
+ 0xF88E, 0xF88F, 0xF890, 0xF891, 0xF892, 0xF893, 0xF894, 0xF895, /* 0x30 */
+ 0xF896, 0xF897, 0xF898, 0xF899, 0xF89A, 0xF89B, 0xF89C, 0xF89D, /* 0x30 */
+ 0xF89E, 0xF89F, 0xF8A0, 0xF940, 0xF941, 0xF942, 0xF943, 0xF944, /* 0x40 */
+ 0xF945, 0xF946, 0xF947, 0xF948, 0xF949, 0xF94A, 0xF94B, 0xF94C, /* 0x40 */
+ 0xF94D, 0xF94E, 0xF94F, 0xF950, 0xF951, 0xF952, 0xF953, 0xF954, /* 0x50 */
+ 0xF955, 0xF956, 0xF957, 0xF958, 0xF959, 0xF95A, 0xF95B, 0xF95C, /* 0x50 */
+ 0xF95D, 0xF95E, 0xF95F, 0xF960, 0xF961, 0xF962, 0xF963, 0xF964, /* 0x60 */
+ 0xF965, 0xF966, 0xF967, 0xF968, 0xF969, 0xF96A, 0xF96B, 0xF96C, /* 0x60 */
+ 0xF96D, 0xF96E, 0xF96F, 0xF970, 0xF971, 0xF972, 0xF973, 0xF974, /* 0x70 */
+ 0xF975, 0xF976, 0xF977, 0xF978, 0xF979, 0xF97A, 0xF97B, 0xF97C, /* 0x70 */
+ 0xF97D, 0xF97E, 0xF980, 0xF981, 0xF982, 0xF983, 0xF984, 0xF985, /* 0x80 */
+ 0xF986, 0xF987, 0xF988, 0xF989, 0xF98A, 0xF98B, 0xF98C, 0xF98D, /* 0x80 */
+ 0xF98E, 0xF98F, 0xF990, 0xF991, 0xF992, 0xF993, 0xF994, 0xF995, /* 0x90 */
+ 0xF996, 0xF997, 0xF998, 0xF999, 0xF99A, 0xF99B, 0xF99C, 0xF99D, /* 0x90 */
+ 0xF99E, 0xF99F, 0xF9A0, 0xFA40, 0xFA41, 0xFA42, 0xFA43, 0xFA44, /* 0xA0 */
+ 0xFA45, 0xFA46, 0xFA47, 0xFA48, 0xFA49, 0xFA4A, 0xFA4B, 0xFA4C, /* 0xA0 */
+ 0xFA4D, 0xFA4E, 0xFA4F, 0xFA50, 0xFA51, 0xFA52, 0xFA53, 0xFA54, /* 0xB0 */
+ 0xFA55, 0xFA56, 0xFA57, 0xFA58, 0xFA59, 0xFA5A, 0xFA5B, 0xFA5C, /* 0xB0 */
+ 0xFA5D, 0xFA5E, 0xFA5F, 0xFA60, 0xFA61, 0xFA62, 0xFA63, 0xFA64, /* 0xC0 */
+ 0xFA65, 0xFA66, 0xFA67, 0xFA68, 0xFA69, 0xFA6A, 0xFA6B, 0xFA6C, /* 0xC0 */
+ 0xFA6D, 0xFA6E, 0xFA6F, 0xFA70, 0xFA71, 0xFA72, 0xFA73, 0xFA74, /* 0xD0 */
+ 0xFA75, 0xFA76, 0xFA77, 0xFA78, 0xFA79, 0xFA7A, 0xFA7B, 0xFA7C, /* 0xD0 */
+ 0xFA7D, 0xFA7E, 0xFA80, 0xFA81, 0xFA82, 0xFA83, 0xFA84, 0xFA85, /* 0xE0 */
+ 0xFA86, 0xFA87, 0xFA88, 0xFA89, 0xFA8A, 0xFA8B, 0xFA8C, 0xFA8D, /* 0xE0 */
+ 0xFA8E, 0xFA8F, 0xFA90, 0xFA91, 0xFA92, 0xFA93, 0xFA94, 0xFA95, /* 0xF0 */
+ 0xFA96, 0xFA97, 0xFA98, 0xFA99, 0xFA9A, 0xFA9B, 0xFA9C, 0xFA9D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFA9E, 0xFA9F, 0xFAA0, 0xFB40, 0xFB41, 0xFB42, 0xFB43, 0xFB44, /* 0x00 */
+ 0xFB45, 0xFB46, 0xFB47, 0xFB48, 0xFB49, 0xFB4A, 0xFB4B, 0xFB4C, /* 0x00 */
+ 0xFB4D, 0xFB4E, 0xFB4F, 0xFB50, 0xFB51, 0xFB52, 0xFB53, 0xFB54, /* 0x10 */
+ 0xFB55, 0xFB56, 0xFB57, 0xFB58, 0xFB59, 0xFB5A, 0xFB5B, 0xC4F1, /* 0x10 */
+ 0xF0AF, 0xBCA6, 0xF0B0, 0xC3F9, 0xFB5C, 0xC5B8, 0xD1BB, 0xFB5D, /* 0x20 */
+ 0xF0B1, 0xF0B2, 0xF0B3, 0xF0B4, 0xF0B5, 0xD1BC, 0xFB5E, 0xD1EC, /* 0x20 */
+ 0xFB5F, 0xF0B7, 0xF0B6, 0xD4A7, 0xFB60, 0xCDD2, 0xF0B8, 0xF0BA, /* 0x30 */
+ 0xF0B9, 0xF0BB, 0xF0BC, 0xFB61, 0xFB62, 0xB8EB, 0xF0BD, 0xBAE8, /* 0x30 */
+ 0xFB63, 0xF0BE, 0xF0BF, 0xBEE9, 0xF0C0, 0xB6EC, 0xF0C1, 0xF0C2, /* 0x40 */
+ 0xF0C3, 0xF0C4, 0xC8B5, 0xF0C5, 0xF0C6, 0xFB64, 0xF0C7, 0xC5F4, /* 0x40 */
+ 0xFB65, 0xF0C8, 0xFB66, 0xFB67, 0xFB68, 0xF0C9, 0xFB69, 0xF0CA, /* 0x50 */
+ 0xF7BD, 0xFB6A, 0xF0CB, 0xF0CC, 0xF0CD, 0xFB6B, 0xF0CE, 0xFB6C, /* 0x50 */
+ 0xFB6D, 0xFB6E, 0xFB6F, 0xF0CF, 0xBAD7, 0xFB70, 0xF0D0, 0xF0D1, /* 0x60 */
+ 0xF0D2, 0xF0D3, 0xF0D4, 0xF0D5, 0xF0D6, 0xF0D8, 0xFB71, 0xFB72, /* 0x60 */
+ 0xD3A5, 0xF0D7, 0xFB73, 0xF0D9, 0xFB74, 0xFB75, 0xFB76, 0xFB77, /* 0x70 */
+ 0xFB78, 0xFB79, 0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D, 0xF5BA, 0xC2B9, /* 0x70 */
+ 0xFB7E, 0xFB80, 0xF7E4, 0xFB81, 0xFB82, 0xFB83, 0xFB84, 0xF7E5, /* 0x80 */
+ 0xF7E6, 0xFB85, 0xFB86, 0xF7E7, 0xFB87, 0xFB88, 0xFB89, 0xFB8A, /* 0x80 */
+ 0xFB8B, 0xFB8C, 0xF7E8, 0xC2B4, 0xFB8D, 0xFB8E, 0xFB8F, 0xFB90, /* 0x90 */
+ 0xFB91, 0xFB92, 0xFB93, 0xFB94, 0xFB95, 0xF7EA, 0xFB96, 0xF7EB, /* 0x90 */
+ 0xFB97, 0xFB98, 0xFB99, 0xFB9A, 0xFB9B, 0xFB9C, 0xC2F3, 0xFB9D, /* 0xA0 */
+ 0xFB9E, 0xFB9F, 0xFBA0, 0xFC40, 0xFC41, 0xFC42, 0xFC43, 0xFC44, /* 0xA0 */
+ 0xFC45, 0xFC46, 0xFC47, 0xFC48, 0xF4F0, 0xFC49, 0xFC4A, 0xFC4B, /* 0xB0 */
+ 0xF4EF, 0xFC4C, 0xFC4D, 0xC2E9, 0xFC4E, 0xF7E1, 0xF7E2, 0xFC4F, /* 0xB0 */
+ 0xFC50, 0xFC51, 0xFC52, 0xFC53, 0xBBC6, 0xFC54, 0xFC55, 0xFC56, /* 0xC0 */
+ 0xFC57, 0xD9E4, 0xFC58, 0xFC59, 0xFC5A, 0xCAF2, 0xC0E8, 0xF0A4, /* 0xC0 */
+ 0xFC5B, 0xBADA, 0xFC5C, 0xFC5D, 0xC7AD, 0xFC5E, 0xFC5F, 0xFC60, /* 0xD0 */
+ 0xC4AC, 0xFC61, 0xFC62, 0xF7EC, 0xF7ED, 0xF7EE, 0xFC63, 0xF7F0, /* 0xD0 */
+ 0xF7EF, 0xFC64, 0xF7F1, 0xFC65, 0xFC66, 0xF7F4, 0xFC67, 0xF7F3, /* 0xE0 */
+ 0xFC68, 0xF7F2, 0xF7F5, 0xFC69, 0xFC6A, 0xFC6B, 0xFC6C, 0xF7F6, /* 0xE0 */
+ 0xFC6D, 0xFC6E, 0xFC6F, 0xFC70, 0xFC71, 0xFC72, 0xFC73, 0xFC74, /* 0xF0 */
+ 0xFC75, 0xEDE9, 0xFC76, 0xEDEA, 0xEDEB, 0xFC77, 0xF6BC, 0xFC78 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFC79, 0xFC7A, 0xFC7B, 0xFC7C, 0xFC7D, 0xFC7E, 0xFC80, 0xFC81, /* 0x00 */
+ 0xFC82, 0xFC83, 0xFC84, 0xF6BD, 0xFC85, 0xF6BE, 0xB6A6, 0xFC86, /* 0x00 */
+ 0xD8BE, 0xFC87, 0xFC88, 0xB9C4, 0xFC89, 0xFC8A, 0xFC8B, 0xD8BB, /* 0x10 */
+ 0xFC8C, 0xDCB1, 0xFC8D, 0xFC8E, 0xFC8F, 0xFC90, 0xFC91, 0xFC92, /* 0x10 */
+ 0xCAF3, 0xFC93, 0xF7F7, 0xFC94, 0xFC95, 0xFC96, 0xFC97, 0xFC98, /* 0x20 */
+ 0xFC99, 0xFC9A, 0xFC9B, 0xFC9C, 0xF7F8, 0xFC9D, 0xFC9E, 0xF7F9, /* 0x20 */
+ 0xFC9F, 0xFCA0, 0xFD40, 0xFD41, 0xFD42, 0xFD43, 0xFD44, 0xF7FB, /* 0x30 */
+ 0xFD45, 0xF7FA, 0xFD46, 0xB1C7, 0xFD47, 0xF7FC, 0xF7FD, 0xFD48, /* 0x30 */
+ 0xFD49, 0xFD4A, 0xFD4B, 0xFD4C, 0xF7FE, 0xFD4D, 0xFD4E, 0xFD4F, /* 0x40 */
+ 0xFD50, 0xFD51, 0xFD52, 0xFD53, 0xFD54, 0xFD55, 0xFD56, 0xFD57, /* 0x40 */
+ 0xC6EB, 0xECB4, 0xFD58, 0xFD59, 0xFD5A, 0xFD5B, 0xFD5C, 0xFD5D, /* 0x50 */
+ 0xFD5E, 0xFD5F, 0xFD60, 0xFD61, 0xFD62, 0xFD63, 0xFD64, 0xFD65, /* 0x50 */
+ 0xFD66, 0xFD67, 0xFD68, 0xFD69, 0xFD6A, 0xFD6B, 0xFD6C, 0xFD6D, /* 0x60 */
+ 0xFD6E, 0xFD6F, 0xFD70, 0xFD71, 0xFD72, 0xFD73, 0xFD74, 0xFD75, /* 0x60 */
+ 0xFD76, 0xFD77, 0xFD78, 0xFD79, 0xFD7A, 0xFD7B, 0xFD7C, 0xFD7D, /* 0x70 */
+ 0xFD7E, 0xFD80, 0xFD81, 0xFD82, 0xFD83, 0xFD84, 0xFD85, 0xB3DD, /* 0x70 */
+ 0xF6B3, 0xFD86, 0xFD87, 0xF6B4, 0xC1E4, 0xF6B5, 0xF6B6, 0xF6B7, /* 0x80 */
+ 0xF6B8, 0xF6B9, 0xF6BA, 0xC8A3, 0xF6BB, 0xFD88, 0xFD89, 0xFD8A, /* 0x80 */
+ 0xFD8B, 0xFD8C, 0xFD8D, 0xFD8E, 0xFD8F, 0xFD90, 0xFD91, 0xFD92, /* 0x90 */
+ 0xFD93, 0xC1FA, 0xB9A8, 0xEDE8, 0xFD94, 0xFD95, 0xFD96, 0xB9EA, /* 0x90 */
+ 0xD9DF, 0xFD97, 0xFD98, 0xFD99, 0xFD9A, 0xFD9B /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLECHINSIMP_F8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0081, 0x0082 /* 0x80 */
+ /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x20 */
+ 0xFD9C, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xFD9D, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xFD9E, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xFD9F, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xFDA0 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_FA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xFE40, 0xFE41, 0xFE42, 0xFE43, /* 0x00 */
+ 0, 0xFE44, 0, 0xFE45, 0xFE46, 0, 0, 0, /* 0x10 */
+ 0xFE47, 0, 0, 0, 0, 0, 0, 0xFE48, /* 0x10 */
+ 0xFE49, 0xFE4A, 0, 0xFE4B, 0xFE4C, 0, 0, 0xFE4D, /* 0x20 */
+ 0xFE4E, 0xFE4F /* 0x20 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_FE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA955, 0xA6F2, 0, 0xA6F4, 0xA6F5, 0xA6E0, 0xA6E1, 0xA6F0, /* 0x30 */
+ 0xA6F1, 0xA6E2, 0xA6E3, 0xA6EE, 0xA6EF, 0xA6E6, 0xA6E7, 0xA6E4, /* 0x30 */
+ 0xA6E5, 0xA6E8, 0xA6E9, 0xA6EA, 0xA6EB, 0, 0, 0, /* 0x40 */
+ 0, 0xA968, 0xA969, 0xA96A, 0xA96B, 0xA96C, 0xA96D, 0xA96E, /* 0x40 */
+ 0xA96F, 0xA970, 0xA971, 0, 0xA972, 0xA973, 0xA974, 0xA975, /* 0x50 */
+ 0, 0xA976, 0xA977, 0xA978, 0xA979, 0xA97A, 0xA97B, 0xA97C, /* 0x50 */
+ 0xA97D, 0xA97E, 0xA980, 0xA981, 0xA982, 0xA983, 0xA984, 0, /* 0x60 */
+ 0xA985, 0xA986, 0xA987, 0xA988 /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_FE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA6F2, 0, 0xA6F4, 0xA6F5, 0xA6E0, 0xA6E1, 0xA6F0, /* 0x30 */
+ 0xA6F1, 0xA6E2, 0xA6E3, 0xA6EE, 0xA6EF, 0xA6E6, 0xA6E7, 0xA6E4, /* 0x30 */
+ 0xA6E5, 0xA6E8, 0xA6E9, 0xA6EA, 0xA6EB /* 0x40 */
+ /* 0x40 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBK_FF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA3A1, 0xA3A2, 0xA3A3, 0xA1E7, 0xA3A5, 0xA3A6, 0xA3A7, /* 0x00 */
+ 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF, /* 0x00 */
+ 0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7, /* 0x10 */
+ 0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF, /* 0x10 */
+ 0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7, /* 0x20 */
+ 0xA3C8, 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF, /* 0x20 */
+ 0xA3D0, 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7, /* 0x30 */
+ 0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF, /* 0x30 */
+ 0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7, /* 0x40 */
+ 0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE, 0xA3EF, /* 0x40 */
+ 0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, 0xA3F6, 0xA3F7, /* 0x50 */
+ 0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA1AB, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xA1E9, 0xA1EA, 0xA956, 0xA3FE, 0xA957, 0xA3A4 /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_FF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA3A1, 0xA3A2, 0xA3A3, 0xA1E7, 0xA3A5, 0xA3A6, 0xA3A7, /* 0x00 */
+ 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF, /* 0x00 */
+ 0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7, /* 0x10 */
+ 0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF, /* 0x10 */
+ 0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7, /* 0x20 */
+ 0xA3C8, 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF, /* 0x20 */
+ 0xA3D0, 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7, /* 0x30 */
+ 0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF, /* 0x30 */
+ 0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7, /* 0x40 */
+ 0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE, 0xA3EF, /* 0x40 */
+ 0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, 0xA3F6, 0xA3F7, /* 0x50 */
+ 0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA1AB, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xA1E9, 0xA1EA, 0, 0xA3FE, 0, 0xA3A4, /* 0xE0 */
+ /* 0xE0 */
+};
+
diff --git a/sal/textenc/tcvtscn3.tab b/sal/textenc/tcvtscn3.tab
new file mode 100644
index 000000000000..b45e9d12de92
--- /dev/null
+++ b/sal/textenc/tcvtscn3.tab
@@ -0,0 +1,1502 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the DBCS to UniCode tables for the following */
+/* chinese simplified (China) charsets: */
+/* GBT (GB12345) */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0, /* 0xA0 */
+ 0x769A, 0x764C, 0x85F9, 0x77EE, 0x827E, 0x7919, 0x611B, 0x9698, /* 0xA0 */
+ 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA, /* 0xB0 */
+ 0x6848, 0x9AAF, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1, /* 0xB0 */
+ 0x8956, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252, /* 0xC0 */
+ 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB, /* 0xC0 */
+ 0x9776, 0x628A, 0x8019, 0x58E9, 0x9738, 0x7F77, 0x7238, 0x767D, /* 0xD0 */
+ 0x67CF, 0x767E, 0x64FA, 0x4F70, 0x6557, 0x62DC, 0x7A17, 0x6591, /* 0xD0 */
+ 0x73ED, 0x642C, 0x6273, 0x822C, 0x9812, 0x677F, 0x7248, 0x626E, /* 0xE0 */
+ 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x8FA6, 0x7D46, 0x90A6, 0x5E6B, /* 0xE0 */
+ 0x6886, 0x699C, 0x8180, 0x7D81, 0x68D2, 0x78C5, 0x868C, 0x938A, /* 0xF0 */
+ 0x508D, 0x8B17, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x98FD, 0x5BF6, 0x62B1, /* 0xA0 */
+ 0x5831, 0x66B4, 0x8C79, 0x9B91, 0x7206, 0x676F, 0x7891, 0x60B2, /* 0xA0 */
+ 0x5351, 0x5317, 0x8F29, 0x80CC, 0x8C9D, 0x92C7, 0x500D, 0x72FD, /* 0xB0 */
+ 0x5099, 0x618A, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28, /* 0xB0 */
+ 0x5D29, 0x7DB3, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B, /* 0xC0 */
+ 0x6BD4, 0x9119, 0x7B46, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x7562, /* 0xC0 */
+ 0x6583, 0x6BD6, 0x5E63, 0x5E87, 0x75F9, 0x9589, 0x655D, 0x5F0A, /* 0xD0 */
+ 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x908A, /* 0xD0 */
+ 0x7DE8, 0x8CB6, 0x6241, 0x4FBF, 0x8B8A, 0x535E, 0x8FA8, 0x8FAF, /* 0xE0 */
+ 0x8FAE, 0x904D, 0x6A19, 0x5F6A, 0x8198, 0x8868, 0x9C49, 0x618B, /* 0xE0 */
+ 0x522B, 0x765F, 0x5F6C, 0x658C, 0x7015, 0x6FF1, 0x8CD3, 0x64EF, /* 0xF0 */
+ 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x9905, 0x70B3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x64A5, 0x9262, /* 0xA0 */
+ 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x9251, 0x7B94, 0x4F2F, 0x5E1B, /* 0xA0 */
+ 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x99C1, 0x6355, 0x535C, /* 0xB0 */
+ 0x54FA, 0x88DC, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, /* 0xB0 */
+ 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8CA1, 0x776C, /* 0xC0 */
+ 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C3, 0x8836, /* 0xC0 */
+ 0x6B98, 0x615A, 0x6158, 0x71E6, 0x84BC, 0x8259, 0x5009, 0x6EC4, /* 0xD0 */
+ 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x53A0, 0x7B56, /* 0xD0 */
+ 0x5074, 0x518C, 0x6E2C, 0x5C64, 0x8E6D, 0x63D2, 0x53C9, 0x832C, /* 0xE0 */
+ 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8A6B, /* 0xE0 */
+ 0x62C6, 0x67F4, 0x8C7A, 0x6519, 0x647B, 0x87EC, 0x995E, 0x8B92, /* 0xF0 */
+ 0x7E8F, 0x93DF, 0x7523, 0x95E1, 0x986B, 0x660C, 0x7316 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5834, 0x5617, 0x5E38, 0x9577, 0x511F, 0x8178, 0x5EE0, /* 0xA0 */
+ 0x655E, 0x66A2, 0x5531, 0x5021, 0x8D85, 0x6284, 0x9214, 0x671D, /* 0xA0 */
+ 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8ECA, 0x626F, 0x64A4, /* 0xB0 */
+ 0x63A3, 0x5FB9, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5875, 0x6668, /* 0xB0 */
+ 0x5FF1, 0x6C89, 0x9673, 0x8D81, 0x896F, 0x6491, 0x7A31, 0x57CE, /* 0xC0 */
+ 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x61F2, 0x6F84, 0x8AA0, /* 0xC0 */
+ 0x627F, 0x901E, 0x9A01, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, /* 0xD0 */
+ 0x6C60, 0x9072, 0x5F1B, 0x99B3, 0x803B, 0x9F52, 0x4F88, 0x5C3A, /* 0xD0 */
+ 0x8D64, 0x7FC5, 0x65A5, 0x71BE, 0x5145, 0x885D, 0x87F2, 0x5D07, /* 0xE0 */
+ 0x5BF5, 0x62BD, 0x916C, 0x7587, 0x8E8A, 0x7A20, 0x6101, 0x7C4C, /* 0xE0 */
+ 0x4EC7, 0x7DA2, 0x7785, 0x919C, 0x81ED, 0x521D, 0x51FA, 0x6A71, /* 0xF0 */
+ 0x53A8, 0x8E87, 0x92E4, 0x96DB, 0x6EC1, 0x9664, 0x695A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x790E, 0x5132, 0x77D7, 0x6410, 0x89F8, 0x8655, 0x63E3, /* 0xA0 */
+ 0x5DDD, 0x7A7F, 0x693D, 0x50B3, 0x8239, 0x5598, 0x4E32, 0x7621, /* 0xA0 */
+ 0x7A97, 0x5E62, 0x5E8A, 0x95D6, 0x5275, 0x5439, 0x708A, 0x6376, /* 0xB0 */
+ 0x9318, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7D14, /* 0xB0 */
+ 0x8822, 0x6233, 0x7DBD, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8FAD, /* 0xC0 */
+ 0x6148, 0x74F7, 0x8A5E, 0x6B64, 0x523A, 0x8CDC, 0x6B21, 0x8070, /* 0xC0 */
+ 0x8471, 0x56F1, 0x5306, 0x5F9E, 0x53E2, 0x51D1, 0x7C97, 0x918B, /* 0xD0 */
+ 0x7C07, 0x4FC3, 0x8EA5, 0x7BE1, 0x7AC4, 0x6467, 0x5D14, 0x50AC, /* 0xD0 */
+ 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8, /* 0xE0 */
+ 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x932F, 0x642D, 0x9054, /* 0xE0 */
+ 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234, /* 0xF0 */
+ 0x5E36, 0x6B86, 0x4EE3, 0x8CB8, 0x888B, 0x5F85, 0x902E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6020, 0x803D, 0x64D4, 0x4E39, 0x55AE, 0x9132, 0x64A3, /* 0xA0 */
+ 0x81BD, 0x65E6, 0x6C2E, 0x4F46, 0x619A, 0x6DE1, 0x8A95, 0x5F48, /* 0xA0 */
+ 0x86CB, 0x7576, 0x64CB, 0x9EE8, 0x8569, 0x6A94, 0x5200, 0x6417, /* 0xB0 */
+ 0x8E48, 0x5012, 0x5CF6, 0x79B1, 0x5C0E, 0x5230, 0x7A3B, 0x60BC, /* 0xB0 */
+ 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x71C8, 0x767B, /* 0xC0 */
+ 0x7B49, 0x77AA, 0x51F3, 0x9127, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA, /* 0xC0 */
+ 0x6575, 0x7B1B, 0x72C4, 0x6ECC, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95, /* 0xD0 */
+ 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x905E, 0x7DE0, 0x985B, /* 0xD0 */
+ 0x6382, 0x6EC7, 0x7898, 0x9EDE, 0x5178, 0x975B, 0x588A, 0x96FB, /* 0xE0 */
+ 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6FB1, 0x6BBF, 0x7889, /* 0xE0 */
+ 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x91E3, 0x8ABF, /* 0xF0 */
+ 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8ADC, 0x758A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E01, 0x76EF, 0x53EE, 0x91D8, 0x9802, 0x9F0E, 0x9320, /* 0xA0 */
+ 0x5B9A, 0x8A02, 0x4E22, 0x6771, 0x51AC, 0x8463, 0x61C2, 0x52D5, /* 0xA0 */
+ 0x68DF, 0x4F97, 0x606B, 0x51CD, 0x6D1E, 0x515C, 0x6296, 0x9B25, /* 0xB0 */
+ 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x72A2, /* 0xB0 */
+ 0x7368, 0x8B80, 0x5835, 0x7779, 0x8CED, 0x675C, 0x934D, 0x809A, /* 0xC0 */
+ 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x935B, 0x6BB5, 0x65B7, /* 0xC0 */
+ 0x7DDE, 0x5806, 0x5151, 0x968A, 0x5C0D, 0x58A9, 0x5678, 0x8E72, /* 0xD0 */
+ 0x6566, 0x9813, 0x56E4, 0x920D, 0x76FE, 0x9041, 0x6387, 0x54C6, /* 0xD0 */
+ 0x591A, 0x596A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, /* 0xE0 */
+ 0x60F0, 0x58AE, 0x86FE, 0x5CE8, 0x9D5D, 0x4FC4, 0x984D, 0x8A1B, /* 0xE0 */
+ 0x5A25, 0x60E1, 0x5384, 0x627C, 0x904F, 0x9102, 0x9913, 0x6069, /* 0xF0 */
+ 0x800C, 0x5152, 0x8033, 0x723E, 0x990C, 0x6D31, 0x4E8C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8CB3, 0x767C, 0x7F70, 0x7B4F, 0x4F10, 0x4E4F, 0x95A5, /* 0xA0 */
+ 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x792C, /* 0xA0 */
+ 0x91E9, 0x7E41, 0x51E1, 0x7169, 0x53CD, 0x8FD4, 0x7BC4, 0x8CA9, /* 0xB0 */
+ 0x72AF, 0x98EF, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, /* 0xB0 */
+ 0x9632, 0x59A8, 0x4EFF, 0x8A2A, 0x7D21, 0x653E, 0x83F2, 0x975E, /* 0xC0 */
+ 0x5561, 0x98DB, 0x80A5, 0x532A, 0x8AB9, 0x5420, 0x80BA, 0x5EE2, /* 0xC0 */
+ 0x6CB8, 0x8CBB, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7D1B, /* 0xD0 */
+ 0x58B3, 0x711A, 0x6C7E, 0x7C89, 0x596E, 0x4EFD, 0x5FFF, 0x61A4, /* 0xD0 */
+ 0x7CDE, 0x8C50, 0x5C01, 0x6953, 0x8702, 0x5CF0, 0x92D2, 0x98A8, /* 0xE0 */
+ 0x760B, 0x70FD, 0x9022, 0x99AE, 0x7E2B, 0x8AF7, 0x5949, 0x9CF3, /* 0xE0 */
+ 0x4F5B, 0x5426, 0x592B, 0x6577, 0x819A, 0x5B75, 0x6276, 0x62C2, /* 0xF0 */
+ 0x8F3B, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x64AB, /* 0xA0 */
+ 0x8F14, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150, /* 0xA0 */
+ 0x8D74, 0x526F, 0x8986, 0x8CE6, 0x5FA9, 0x5085, 0x4ED8, 0x961C, /* 0xB0 */
+ 0x7236, 0x8179, 0x8CA0, 0x5BCC, 0x8A03, 0x9644, 0x5A66, 0x7E1B, /* 0xB0 */
+ 0x5490, 0x5676, 0x560E, 0x8A72, 0x6539, 0x6982, 0x9223, 0x84CB, /* 0xC0 */
+ 0x6E89, 0x5E79, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D95, /* 0xC0 */
+ 0x611F, 0x79C6, 0x6562, 0x8D1B, 0x5CA1, 0x525B, 0x92FC, 0x7F38, /* 0xD0 */
+ 0x809B, 0x7DB1, 0x5D17, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8, /* 0xD0 */
+ 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x93AC, 0x7A3F, 0x544A, 0x54E5, /* 0xE0 */
+ 0x6B4C, 0x64F1, 0x6208, 0x9D3F, 0x80F3, 0x7599, 0x5272, 0x9769, /* 0xE0 */
+ 0x845B, 0x683C, 0x86E4, 0x95A3, 0x9694, 0x927B, 0x500B, 0x5404, /* 0xF0 */
+ 0x7D66, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_B9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D, /* 0xA0 */
+ 0x9F94, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x978F, 0x6C5E, /* 0xA0 */
+ 0x62F1, 0x8CA2, 0x5171, 0x920E, 0x52FE, 0x6E9D, 0x82DF, 0x72D7, /* 0xB0 */
+ 0x57A2, 0x69CB, 0x8CFC, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D, /* 0xB0 */
+ 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x8831, 0x9AA8, /* 0xC0 */
+ 0x8C37, 0x80A1, 0x6545, 0x9867, 0x56FA, 0x96C7, 0x522E, 0x74DC, /* 0xC0 */
+ 0x526E, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA, /* 0xD0 */
+ 0x95DC, 0x5B98, 0x51A0, 0x89C0, 0x7BA1, 0x9928, 0x7F50, 0x6163, /* 0xD0 */
+ 0x704C, 0x8CAB, 0x5149, 0x5EE3, 0x901B, 0x7470, 0x898F, 0x572D, /* 0xE0 */
+ 0x7845, 0x6B78, 0x9F9C, 0x95A8, 0x8ECC, 0x9B3C, 0x8A6D, 0x7678, /* 0xE0 */
+ 0x6842, 0x6AC3, 0x8DEA, 0x8CB4, 0x528A, 0x8F25, 0x6EDA, 0x68CD, /* 0xF0 */
+ 0x934B, 0x90ED, 0x570B, 0x679C, 0x88F9, 0x904E, 0x54C8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_BA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x99ED, /* 0xA0 */
+ 0x9163, 0x61A8, 0x90AF, 0x97D3, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, /* 0xA0 */
+ 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, /* 0xB0 */
+ 0x710A, 0x6C57, 0x6F22, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, /* 0xB0 */
+ 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x865F, 0x6D69, 0x5475, /* 0xC0 */
+ 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, /* 0xC0 */
+ 0x76D2, 0x8C89, 0x95A1, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9DB4, /* 0xD0 */
+ 0x8CC0, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, /* 0xD0 */
+ 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F5F, 0x54C4, 0x70D8, 0x8679, /* 0xE0 */
+ 0x9D3B, 0x6D2A, 0x5B8F, 0x5F18, 0x7D05, 0x5589, 0x4FAF, 0x7334, /* 0xE0 */
+ 0x543C, 0x539A, 0x5019, 0x5F8C, 0x547C, 0x4E4E, 0x5FFD, 0x745A, /* 0xF0 */
+ 0x58FA, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_BB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5F27, 0x864E, 0x552C, 0x8B77, 0x4E92, 0x6EEC, 0x6237, /* 0xA0 */
+ 0x82B1, 0x5629, 0x83EF, 0x733E, 0x6ED1, 0x756B, 0x5283, 0x5316, /* 0xA0 */
+ 0x8A71, 0x69D0, 0x5F8A, 0x61F7, 0x6DEE, 0x58DE, 0x6B61, 0x74B0, /* 0xB0 */
+ 0x6853, 0x9084, 0x7DE9, 0x63DB, 0x60A3, 0x559A, 0x7613, 0x8C62, /* 0xB0 */
+ 0x7165, 0x6E19, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, /* 0xC0 */
+ 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, /* 0xC0 */
+ 0x604D, 0x8B0A, 0x7070, 0x63EE, 0x8F1D, 0x5FBD, 0x6062, 0x86D4, /* 0xD0 */
+ 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8CC4, /* 0xD0 */
+ 0x7A62, 0x6703, 0x71F4, 0x532F, 0x8AF1, 0x8AA8, 0x7E6A, 0x8477, /* 0xE0 */
+ 0x660F, 0x5A5A, 0x9B42, 0x6E3E, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, /* 0xE0 */
+ 0x706B, 0x7372, 0x6216, 0x60D1, 0x970D, 0x8CA8, 0x798D, 0x64CA, /* 0xF0 */
+ 0x573E, 0x57FA, 0x6A5F, 0x7578, 0x7A3D, 0x7A4D, 0x7B95 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_BC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x808C, 0x9951, 0x8FF9, 0x6FC0, 0x8B4F, 0x9DC4, 0x59EC, /* 0xA0 */
+ 0x7E3E, 0x7DDD, 0x5409, 0x6975, 0x68D8, 0x8F2F, 0x7C4D, 0x96C6, /* 0xA0 */
+ 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7D1A, 0x64E0, /* 0xB0 */
+ 0x5E7E, 0x810A, 0x5DF1, 0x858A, 0x6280, 0x5180, 0x5B63, 0x4F0E, /* 0xB0 */
+ 0x796D, 0x5291, 0x60B8, 0x6FDF, 0x5BC4, 0x5BC2, 0x8A08, 0x8A18, /* 0xC0 */
+ 0x65E2, 0x5FCC, 0x969B, 0x5993, 0x7E7C, 0x7D00, 0x5609, 0x67B7, /* 0xC0 */
+ 0x593E, 0x4F73, 0x5BB6, 0x52A0, 0x83A2, 0x9830, 0x8CC8, 0x7532, /* 0xD0 */
+ 0x9240, 0x5047, 0x7A3C, 0x50F9, 0x67B6, 0x99D5, 0x5AC1, 0x6BB2, /* 0xD0 */
+ 0x76E3, 0x5805, 0x5C16, 0x7B8B, 0x9593, 0x714E, 0x517C, 0x80A9, /* 0xE0 */
+ 0x8271, 0x5978, 0x7DD8, 0x7E6D, 0x6AA2, 0x67EC, 0x78B1, 0x9E7C, /* 0xE0 */
+ 0x63C0, 0x64BF, 0x7C21, 0x5109, 0x526A, 0x51CF, 0x85A6, 0x6ABB, /* 0xF0 */
+ 0x9452, 0x8E10, 0x8CE4, 0x898B, 0x9375, 0x7BAD, 0x4EF6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_BD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5065, 0x8266, 0x528D, 0x991E, 0x6F38, 0x6FFA, 0x6F97, /* 0xA0 */
+ 0x5EFA, 0x50F5, 0x59DC, 0x5C07, 0x6F3F, 0x6C5F, 0x7586, 0x8523, /* 0xA0 */
+ 0x69F3, 0x596C, 0x8B1B, 0x5320, 0x91AC, 0x964D, 0x8549, 0x6912, /* 0xB0 */
+ 0x7901, 0x7126, 0x81A0, 0x4EA4, 0x90CA, 0x6F86, 0x9A55, 0x5B0C, /* 0xB0 */
+ 0x56BC, 0x652A, 0x9278, 0x77EF, 0x50E5, 0x811A, 0x72E1, 0x89D2, /* 0xC0 */
+ 0x9903, 0x7E73, 0x7D5E, 0x527F, 0x6559, 0x9175, 0x8F4E, 0x8F03, /* 0xC0 */
+ 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x968E, /* 0xD0 */
+ 0x622A, 0x52AB, 0x7BC0, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED, /* 0xD0 */
+ 0x6F54, 0x7D50, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C, /* 0xE0 */
+ 0x501F, 0x4ECB, 0x75A5, 0x8AA1, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4, /* 0xE0 */
+ 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7DCA, 0x9326, 0x50C5, 0x8B39, /* 0xF0 */
+ 0x9032, 0x9773, 0x6649, 0x7981, 0x8FD1, 0x71FC, 0x6D78 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_BE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x76E1, 0x52C1, 0x8346, 0x5162, 0x8396, 0x775B, 0x6676, /* 0xA0 */
+ 0x9BE8, 0x4EAC, 0x9A5A, 0x7CBE, 0x7CB3, 0x7D93, 0x4E95, 0x8B66, /* 0xA0 */
+ 0x666F, 0x9838, 0x975C, 0x5883, 0x656C, 0x93E1, 0x5F91, 0x75D9, /* 0xB0 */
+ 0x9756, 0x7ADF, 0x7AF6, 0x51C8, 0x70AF, 0x7A98, 0x63EA, 0x7A76, /* 0xB0 */
+ 0x7CFE, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, /* 0xC0 */
+ 0x6551, 0x820A, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, /* 0xC0 */
+ 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x99D2, 0x83CA, 0x5C40, 0x5480, /* 0xD0 */
+ 0x77E9, 0x8209, 0x6CAE, 0x805A, 0x62D2, 0x64DA, 0x5DE8, 0x5177, /* 0xD0 */
+ 0x8DDD, 0x8E1E, 0x92F8, 0x4FF1, 0x53E5, 0x61FC, 0x70AC, 0x5287, /* 0xE0 */
+ 0x6350, 0x9D51, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7D79, 0x6485, /* 0xE0 */
+ 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89BA, 0x51B3, 0x8A23, /* 0xF0 */
+ 0x7D76, 0x5747, 0x83CC, 0x921E, 0x8ECD, 0x541B, 0x5CFB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_BF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x99FF, 0x5580, 0x5496, /* 0xA0 */
+ 0x5361, 0x54AF, 0x958B, 0x63E9, 0x6977, 0x51F1, 0x6168, 0x520A, /* 0xA0 */
+ 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, /* 0xB0 */
+ 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, /* 0xB0 */
+ 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9846, 0x79D1, 0x6BBB, /* 0xC0 */
+ 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8AB2, 0x80AF, /* 0xC0 */
+ 0x5543, 0x58BE, 0x61C7, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, /* 0xD0 */
+ 0x63A7, 0x6473, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, /* 0xD0 */
+ 0x82E6, 0x9177, 0x5EAB, 0x8932, 0x8A87, 0x57AE, 0x630E, 0x8DE8, /* 0xE0 */
+ 0x80EF, 0x584A, 0x7B77, 0x5108, 0x5FEB, 0x5BEC, 0x6B3E, 0x5321, /* 0xE0 */
+ 0x7B50, 0x72C2, 0x6846, 0x7926, 0x7736, 0x66E0, 0x51B5, 0x8667, /* 0xF0 */
+ 0x76D4, 0x5DCB, 0x7ABA, 0x8475, 0x594E, 0x9B41, 0x5080 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x994B, 0x6127, 0x6F70, 0x5764, 0x6606, 0x6346, 0x56F0, /* 0xA0 */
+ 0x62EC, 0x64F4, 0x5ED3, 0x95CA, 0x5783, 0x62C9, 0x5587, 0x881F, /* 0xA0 */
+ 0x81D8, 0x8FA3, 0x5566, 0x840A, 0x4F86, 0x8CF4, 0x85CD, 0x5A6A, /* 0xB0 */
+ 0x6B04, 0x6514, 0x7C43, 0x95CC, 0x862D, 0x703E, 0x8B95, 0x652C, /* 0xB0 */
+ 0x89BD, 0x61F6, 0x7E9C, 0x721B, 0x6FEB, 0x7405, 0x6994, 0x72FC, /* 0xC0 */
+ 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x6488, 0x52DE, 0x7262, 0x8001, /* 0xC0 */
+ 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6F87, 0x52D2, 0x6A02, 0x96F7, /* 0xD0 */
+ 0x9433, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x58D8, 0x64C2, 0x808B, /* 0xD0 */
+ 0x985E, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281, /* 0xE0 */
+ 0x9ECE, 0x7C6C, 0x72F8, 0x96E2, 0x7055, 0x7406, 0x674E, 0x88CF, /* 0xE0 */
+ 0x9BC9, 0x79AE, 0x8389, 0x8354, 0x540F, 0x6817, 0x9E97, 0x53B2, /* 0xF0 */
+ 0x52F5, 0x792B, 0x6B77, 0x5229, 0x5088, 0x4F8B, 0x4FD0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x75E2, 0x7ACB, 0x7C92, 0x701D, 0x96B8, 0x529B, 0x7483, /* 0xA0 */
+ 0x54E9, 0x5006, 0x806F, 0x84EE, 0x9023, 0x942E, 0x5EC9, 0x6190, /* 0xA0 */
+ 0x6F23, 0x7C3E, 0x6582, 0x81C9, 0x93C8, 0x6200, 0x7149, 0x7DF4, /* 0xB0 */
+ 0x7CE7, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x5169, 0x8F1B, 0x91CF, /* 0xB0 */
+ 0x667E, 0x4EAE, 0x8AD2, 0x64A9, 0x804A, 0x50DA, 0x7642, 0x71CE, /* 0xC0 */
+ 0x5BE5, 0x907C, 0x6F66, 0x4E86, 0x6482, 0x9410, 0x5ED6, 0x6599, /* 0xC0 */
+ 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x7375, 0x7433, 0x6797, 0x78F7, /* 0xD0 */
+ 0x9716, 0x81E8, 0x9130, 0x9C57, 0x6DCB, 0x51DB, 0x8CC3, 0x541D, /* 0xD0 */
+ 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F61, 0x9234, 0x4F36, 0x7F9A, /* 0xE0 */
+ 0x51CC, 0x9748, 0x9675, 0x5DBA, 0x9818, 0x53E6, 0x4EE4, 0x6E9C, /* 0xE0 */
+ 0x7409, 0x69B4, 0x786B, 0x993E, 0x7559, 0x5289, 0x7624, 0x6D41, /* 0xF0 */
+ 0x67F3, 0x516D, 0x9F8D, 0x807E, 0x56A8, 0x7C60, 0x7ABF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9686, 0x58DF, 0x650F, 0x96B4, 0x6A13, 0x5A41, 0x645F, /* 0xA0 */
+ 0x7C0D, 0x6F0F, 0x964B, 0x8606, 0x76E7, 0x9871, 0x5EEC, 0x7210, /* 0xA0 */
+ 0x64C4, 0x6EF7, 0x865C, 0x9B6F, 0x9E93, 0x788C, 0x9732, 0x8DEF, /* 0xB0 */
+ 0x8CC2, 0x9E7F, 0x6F5E, 0x7984, 0x9332, 0x9678, 0x622E, 0x9A62, /* 0xB0 */
+ 0x5415, 0x92C1, 0x4FA3, 0x65C5, 0x5C65, 0x5C62, 0x7E37, 0x616E, /* 0xC0 */
+ 0x6C2F, 0x5F8B, 0x7387, 0x6FFE, 0x7DD1, 0x5DD2, 0x6523, 0x5B7F, /* 0xC0 */
+ 0x7064, 0x5375, 0x4E82, 0x63A0, 0x7565, 0x6384, 0x8F2A, 0x502B, /* 0xD0 */
+ 0x4F96, 0x6DEA, 0x7DB8, 0x8AD6, 0x863F, 0x87BA, 0x7F85, 0x908F, /* 0xD0 */
+ 0x947C, 0x7C6E, 0x9A3E, 0x88F8, 0x843D, 0x6D1B, 0x99F1, 0x7D61, /* 0xE0 */
+ 0x5ABD, 0x9EBB, 0x746A, 0x78BC, 0x879E, 0x99AC, 0x99E1, 0x561B, /* 0xE0 */
+ 0x55CE, 0x57CB, 0x8CB7, 0x9EA5, 0x8CE3, 0x9081, 0x8109, 0x779E, /* 0xF0 */
+ 0x9945, 0x883B, 0x6EFF, 0x8513, 0x66FC, 0x6162, 0x6F2B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B3E, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, /* 0xA0 */
+ 0x732B, 0x8305, 0x9328, 0x6BDB, 0x77DB, 0x925A, 0x536F, 0x8302, /* 0xA0 */
+ 0x5192, 0x5E3D, 0x8C8C, 0x8CBF, 0x9EBD, 0x73AB, 0x679A, 0x6885, /* 0xB0 */
+ 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9382, 0x6BCF, /* 0xB0 */
+ 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x9580, 0x60B6, 0x5011, /* 0xC0 */
+ 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9333, 0x731B, 0x5922, 0x5B5F, /* 0xC0 */
+ 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8B0E, 0x5F4C, 0x7C73, /* 0xD0 */
+ 0x79D8, 0x8993, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, /* 0xD0 */
+ 0x7DBF, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7DEC, 0x9762, 0x82D7, /* 0xE0 */
+ 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5EDF, 0x5999, 0x8511, /* 0xE0 */
+ 0x6EC5, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x61AB, 0x95A9, 0x660E, /* 0xF0 */
+ 0x879F, 0x9CF4, 0x9298, 0x540D, 0x547D, 0x8B2C, 0x6478 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54, /* 0xA0 */
+ 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE, /* 0xA0 */
+ 0x964C, 0x8B00, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x755D, 0x59C6, /* 0xB0 */
+ 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE, /* 0xB0 */
+ 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x9209, 0x90A3, /* 0xC0 */
+ 0x5A1C, 0x7D0D, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357, /* 0xC0 */
+ 0x7537, 0x96E3, 0x56CA, 0x6493, 0x8166, 0x60F1, 0x9B27, 0x6DD6, /* 0xD0 */
+ 0x5462, 0x9912, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A, /* 0xD0 */
+ 0x6CE5, 0x5C3C, 0x64EC, 0x4F60, 0x533F, 0x81A9, 0x9006, 0x6EBA, /* 0xE0 */
+ 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x6506, 0x637B, 0x5FF5, 0x5A18, /* 0xE0 */
+ 0x91C0, 0x9CE5, 0x5C3F, 0x634F, 0x8076, 0x5B7D, 0x5699, 0x9477, /* 0xF0 */
+ 0x93B3, 0x6D85, 0x60A8, 0x6AB8, 0x7370, 0x51DD, 0x5BE7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x64F0, 0x6FD8, 0x725B, 0x626D, 0x9215, 0x7D10, 0x81BF, /* 0xA0 */
+ 0x6FC3, 0x8FB2, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696, /* 0xA0 */
+ 0x8650, 0x7627, 0x632A, 0x61E6, 0x7CEF, 0x8AFE, 0x54E6, 0x6B50, /* 0xB0 */
+ 0x9DD7, 0x6BC6, 0x85D5, 0x5614, 0x5076, 0x6F1A, 0x556A, 0x8DB4, /* 0xB0 */
+ 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98, /* 0xC0 */
+ 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76E4, 0x78D0, 0x76FC, 0x7554, /* 0xC0 */
+ 0x5224, 0x53DB, 0x4E53, 0x9F90, 0x65C1, 0x802A, 0x80D6, 0x629B, /* 0xD0 */
+ 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA, /* 0xD0 */
+ 0x57F9, 0x88F4, 0x8CE0, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x5674, /* 0xE0 */
+ 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA, /* 0xE0 */
+ 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9D6C, 0x6367, 0x78B0, 0x576F, /* 0xF0 */
+ 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, /* 0xA0 */
+ 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A19, 0x98C4, 0x6F02, /* 0xA0 */
+ 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x983B, 0x8CA7, 0x54C1, /* 0xB0 */
+ 0x8058, 0x4E52, 0x576A, 0x860B, 0x840D, 0x5E73, 0x6191, 0x74F6, /* 0xB0 */
+ 0x8A55, 0x5C4F, 0x5761, 0x6F51, 0x9817, 0x5A46, 0x7834, 0x9B44, /* 0xC0 */
+ 0x8FEB, 0x7C95, 0x5256, 0x64B2, 0x92EA, 0x50D5, 0x8386, 0x8461, /* 0xC0 */
+ 0x83E9, 0x84B2, 0x57D4, 0x6A38, 0x5703, 0x666E, 0x6D66, 0x8B5C, /* 0xD0 */
+ 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x68F2, 0x621A, 0x59BB, 0x4E03, /* 0xD0 */
+ 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, /* 0xE0 */
+ 0x7566, 0x5D0E, 0x81CD, 0x9F4A, 0x65D7, 0x7948, 0x7941, 0x9A0E, /* 0xE0 */
+ 0x8D77, 0x8C48, 0x4E5E, 0x4F01, 0x5553, 0x5951, 0x780C, 0x5668, /* 0xF0 */
+ 0x6C23, 0x8FC4, 0x68C4, 0x6C7D, 0x6CE3, 0x8A16, 0x6390 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6070, 0x6D3D, 0x727D, 0x6266, 0x91FA, 0x925B, 0x5343, /* 0xA0 */
+ 0x9077, 0x7C3D, 0x4EDF, 0x8B19, 0x4E7E, 0x9ED4, 0x9322, 0x9257, /* 0xA0 */
+ 0x524D, 0x6F5B, 0x9063, 0x6DFA, 0x8B74, 0x5879, 0x5D4C, 0x6B20, /* 0xB0 */
+ 0x6B49, 0x69CD, 0x55C6, 0x8154, 0x7F8C, 0x58BB, 0x8594, 0x5F3A, /* 0xB0 */
+ 0x6436, 0x6A47, 0x936C, 0x6572, 0x6084, 0x6A4B, 0x77A7, 0x55AC, /* 0xC0 */
+ 0x50D1, 0x5DE7, 0x9798, 0x64AC, 0x7FF9, 0x5CED, 0x4FCF, 0x7AC5, /* 0xC0 */
+ 0x5207, 0x8304, 0x4E14, 0x602F, 0x7ACA, 0x6B3D, 0x4FB5, 0x89AA, /* 0xD0 */
+ 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BE2, 0x6C81, /* 0xD0 */
+ 0x9752, 0x8F15, 0x6C2B, 0x50BE, 0x537F, 0x6E05, 0x64CE, 0x6674, /* 0xE0 */
+ 0x6C30, 0x60C5, 0x9803, 0x8ACB, 0x6176, 0x74CA, 0x7AAE, 0x79CB, /* 0xE0 */
+ 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8DA8, /* 0xF0 */
+ 0x5340, 0x86C6, 0x66F2, 0x8EC0, 0x5C48, 0x9A45, 0x6E20 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x53D6, 0x5A36, 0x9F72, 0x8DA3, 0x53BB, 0x5708, 0x9874, /* 0xA0 */
+ 0x6B0A, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238, /* 0xA0 */
+ 0x52F8, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9D72, 0x69B7, 0x78BA, /* 0xB0 */
+ 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4, /* 0xB0 */
+ 0x58E4, 0x6518, 0x56B7, 0x8B93, 0x9952, 0x64FE, 0x7E5E, 0x60F9, /* 0xC0 */
+ 0x71B1, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97CC, 0x4EFB, 0x8A8D, /* 0xC0 */
+ 0x5203, 0x598A, 0x7D09, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338, /* 0xD0 */
+ 0x84C9, 0x69AE, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7D68, 0x5197, /* 0xD0 */
+ 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982, /* 0xE0 */
+ 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8EDF, 0x962E, 0x854A, /* 0xE0 */
+ 0x745E, 0x92ED, 0x958F, 0x6F64, 0x82E5, 0x5F31, 0x6492, 0x7051, /* 0xF0 */
+ 0x85A9, 0x816E, 0x9C13, 0x585E, 0x8CFD, 0x4E09, 0x53C1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_C9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5098, 0x6563, 0x6851, 0x55D3, 0x55AA, 0x6414, 0x9A37, /* 0xA0 */
+ 0x6383, 0x5AC2, 0x745F, 0x8272, 0x6F80, 0x68EE, 0x50E7, 0x838E, /* 0xA0 */
+ 0x7802, 0x6BBA, 0x5239, 0x6C99, 0x7D17, 0x50BB, 0x5565, 0x715E, /* 0xB0 */
+ 0x7BE9, 0x66EC, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D, /* 0xB0 */
+ 0x886B, 0x9583, 0x965D, 0x64C5, 0x8D0D, 0x81B3, 0x5584, 0x6C55, /* 0xC0 */
+ 0x6247, 0x7E55, 0x5892, 0x50B7, 0x5546, 0x8CDE, 0x664C, 0x4E0A, /* 0xC0 */
+ 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x71D2, 0x828D, 0x52FA, /* 0xD0 */
+ 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7D39, 0x5962, 0x8CD2, 0x86C7, /* 0xD0 */
+ 0x820C, 0x6368, 0x8D66, 0x651D, 0x5C04, 0x61FE, 0x6D89, 0x793E, /* 0xE0 */
+ 0x8A2D, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20, /* 0xE0 */
+ 0x7D33, 0x795E, 0x6C88, 0x5BE9, 0x5B38, 0x751A, 0x814E, 0x614E, /* 0xF0 */
+ 0x6EF2, 0x8072, 0x751F, 0x7525, 0x7272, 0x5347, 0x7E69 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_CA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7701, 0x76DB, 0x5269, 0x52DD, 0x8056, 0x5E2B, 0x5931, /* 0xA0 */
+ 0x7345, 0x65BD, 0x6FD5, 0x8A69, 0x5C38, 0x8671, 0x5341, 0x77F3, /* 0xA0 */
+ 0x62FE, 0x6642, 0x4EC0, 0x98DF, 0x8755, 0x5BE6, 0x8B58, 0x53F2, /* 0xB0 */
+ 0x77E2, 0x4F7F, 0x5C4E, 0x99DB, 0x59CB, 0x5F0F, 0x793A, 0x58EB, /* 0xB0 */
+ 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52E2, 0x662F, /* 0xC0 */
+ 0x55DC, 0x566C, 0x9069, 0x4ED5, 0x4F8D, 0x91CB, 0x98FE, 0x6C0F, /* 0xC0 */
+ 0x5E02, 0x6043, 0x5BA4, 0x8996, 0x8A66, 0x6536, 0x624B, 0x9996, /* 0xD0 */
+ 0x5B88, 0x58FD, 0x6388, 0x552E, 0x53D7, 0x7626, 0x7378, 0x852C, /* 0xD0 */
+ 0x6A1E, 0x68B3, 0x6B8A, 0x6292, 0x8F38, 0x53D4, 0x8212, 0x6DD1, /* 0xE0 */
+ 0x758F, 0x66F8, 0x8D16, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, /* 0xE0 */
+ 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C6C, 0x8853, 0x8FF0, 0x6A39, /* 0xF0 */
+ 0x675F, 0x620D, 0x7AEA, 0x5885, 0x5EB6, 0x6578, 0x6F31 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_CB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E25, /* 0xA0 */
+ 0x6813, 0x62F4, 0x971C, 0x96D9, 0x723D, 0x8AB0, 0x6C34, 0x7761, /* 0xA0 */
+ 0x7A0E, 0x542E, 0x77AC, 0x9806, 0x821C, 0x8AAC, 0x78A9, 0x6714, /* 0xB0 */
+ 0x720D, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x7D72, /* 0xB0 */
+ 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x98FC, /* 0xC0 */
+ 0x5DF3, 0x9B06, 0x8073, 0x616B, 0x980C, 0x9001, 0x5B8B, 0x8A1F, /* 0xC0 */
+ 0x8AA6, 0x641C, 0x8258, 0x64FB, 0x55FD, 0x8607, 0x9165, 0x4FD7, /* 0xD0 */
+ 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8A34, /* 0xD0 */
+ 0x8085, 0x9178, 0x849C, 0x7B97, 0x96D6, 0x968B, 0x96A8, 0x7D8F, /* 0xE0 */
+ 0x9AD3, 0x788E, 0x6B72, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B6B, /* 0xE0 */
+ 0x640D, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7E2E, 0x7463, 0x7D22, /* 0xF0 */
+ 0x9396, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_CC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x737A, 0x64BB, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC, /* 0xA0 */
+ 0x81FA, 0x6CF0, 0x915E, 0x592A, 0x614B, 0x6C70, 0x574D, 0x6524, /* 0xA0 */
+ 0x8CAA, 0x7671, 0x7058, 0x58C7, 0x6A80, 0x75F0, 0x6F6D, 0x8B5A, /* 0xB0 */
+ 0x8AC7, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x5606, 0x70AD, /* 0xB0 */
+ 0x6E6F, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6, /* 0xC0 */
+ 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x71D9, 0x638F, 0x6FE4, 0x6ED4, /* 0xC0 */
+ 0x7E27, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8A0E, 0x5957, /* 0xD0 */
+ 0x7279, 0x85E4, 0x9A30, 0x75BC, 0x8B04, 0x68AF, 0x5254, 0x8E22, /* 0xD0 */
+ 0x92BB, 0x63D0, 0x984C, 0x8E44, 0x557C, 0x9AD4, 0x66FF, 0x568F, /* 0xE0 */
+ 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530, /* 0xE0 */
+ 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x689D, 0x8FE2, 0x773A, /* 0xF0 */
+ 0x8DF3, 0x8CBC, 0x9435, 0x5E16, 0x5EF3, 0x807D, 0x70F4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_CD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247, /* 0xA0 */
+ 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x9285, 0x5F64, 0x7AE5, /* 0xA0 */
+ 0x6876, 0x6345, 0x7B52, 0x7D71, 0x75DB, 0x5077, 0x6295, 0x982D, /* 0xB0 */
+ 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x5716, 0x5F92, 0x9014, 0x5857, /* 0xB0 */
+ 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x5718, 0x63A8, 0x983D, /* 0xC0 */
+ 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6, /* 0xC0 */
+ 0x6258, 0x8131, 0x9D15, 0x9640, 0x99B1, 0x99DD, 0x6A62, 0x59A5, /* 0xD0 */
+ 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x7AAA, 0x5A03, 0x74E6, /* 0xD0 */
+ 0x896A, 0x6B6A, 0x5916, 0x8C4C, 0x5F4E, 0x7063, 0x73A9, 0x9811, /* 0xE0 */
+ 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB, /* 0xE0 */
+ 0x5B9B, 0x5A49, 0x842C, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789, /* 0xF0 */
+ 0x7DB2, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_CE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5DCD, 0x5FAE, 0x5371, 0x97CB, 0x9055, 0x6845, 0x570D, /* 0xA0 */
+ 0x552F, 0x60DF, 0x7232, 0x6FF0, 0x7DAD, 0x8466, 0x840E, 0x59D4, /* 0xA0 */
+ 0x5049, 0x50DE, 0x5C3E, 0x7DEF, 0x672A, 0x851A, 0x5473, 0x754F, /* 0xB0 */
+ 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8B02, 0x5C09, 0x6170, /* 0xB0 */
+ 0x885B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x805E, 0x7D0B, 0x543B, /* 0xC0 */
+ 0x7A69, 0x7D0A, 0x554F, 0x55E1, 0x7FC1, 0x74EE, 0x64BE, 0x8778, /* 0xC0 */
+ 0x6E26, 0x7AA9, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, /* 0xD0 */
+ 0x55DA, 0x93A2, 0x70CF, 0x6C61, 0x8AA3, 0x5C4B, 0x7121, 0x856A, /* 0xD0 */
+ 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, /* 0xE0 */
+ 0x821E, 0x4F0D, 0x4FAE, 0x5862, 0x620A, 0x9727, 0x6664, 0x7269, /* 0xE0 */
+ 0x52FF, 0x52D9, 0x609F, 0x8AA4, 0x6614, 0x7199, 0x6790, 0x897F, /* 0xF0 */
+ 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x932B, 0x72A7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_CF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, /* 0xA0 */
+ 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x8972, 0x5E2D, /* 0xA0 */
+ 0x7FD2, 0x5AB3, 0x559C, 0x9291, 0x6D17, 0x7CFB, 0x9699, 0x6232, /* 0xB0 */
+ 0x7D30, 0x778E, 0x8766, 0x5323, 0x971E, 0x8F44, 0x6687, 0x5CFD, /* 0xB0 */
+ 0x4FE0, 0x72F9, 0x4E0B, 0x53A6, 0x590F, 0x5687, 0x6380, 0x9341, /* 0xC0 */
+ 0x5148, 0x4ED9, 0x9BAE, 0x7E96, 0x54B8, 0x8CE2, 0x929C, 0x8237, /* 0xC0 */
+ 0x9591, 0x6D8E, 0x5F26, 0x5ACC, 0x986F, 0x96AA, 0x73FE, 0x737B, /* 0xD0 */
+ 0x7E23, 0x817A, 0x9921, 0x7FA1, 0x61B2, 0x9677, 0x9650, 0x7DAB, /* 0xD0 */
+ 0x76F8, 0x53A2, 0x9472, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x9109, /* 0xE0 */
+ 0x7FD4, 0x7965, 0x8A73, 0x60F3, 0x97FF, 0x4EAB, 0x9805, 0x5DF7, /* 0xE0 */
+ 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x856D, 0x785D, 0x9704, 0x524A, /* 0xF0 */
+ 0x54EE, 0x56C2, 0x92B7, 0x6D88, 0x5BB5, 0x6DC6, 0x66C9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x562F, 0x7B11, 0x6548, /* 0xA0 */
+ 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x5354, 0x633E, 0x643A, /* 0xA0 */
+ 0x90AA, 0x659C, 0x8105, 0x8AE7, 0x5BEB, 0x68B0, 0x5378, 0x87F9, /* 0xB0 */
+ 0x61C8, 0x6CC4, 0x7009, 0x8B1D, 0x5C51, 0x85AA, 0x82AF, 0x92C5, /* 0xB0 */
+ 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x91C1, 0x661F, /* 0xC0 */
+ 0x8165, 0x7329, 0x60FA, 0x8208, 0x5211, 0x578B, 0x5F62, 0x90A2, /* 0xC0 */
+ 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6, /* 0xD0 */
+ 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E, /* 0xD0 */
+ 0x673D, 0x55C5, 0x92B9, 0x79C0, 0x8896, 0x7D89, 0x589F, 0x620C, /* 0xE0 */
+ 0x9700, 0x865A, 0x5618, 0x9808, 0x5F90, 0x8A31, 0x84C4, 0x9157, /* 0xE0 */
+ 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7DD2, /* 0xF0 */
+ 0x7E8C, 0x8ED2, 0x55A7, 0x5BA3, 0x61F8, 0x65CB, 0x7384 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9078, 0x766C, 0x7729, 0x7D62, 0x9774, 0x859B, 0x5B78, /* 0xA0 */
+ 0x7A74, 0x96EA, 0x8840, 0x52DB, 0x718F, 0x5FAA, 0x65EC, 0x8A62, /* 0xA0 */
+ 0x5C0B, 0x99B4, 0x5DE1, 0x6B89, 0x6C5B, 0x8A13, 0x8A0A, 0x905C, /* 0xB0 */
+ 0x8FC5, 0x58D3, 0x62BC, 0x9D09, 0x9D28, 0x5440, 0x4E2B, 0x82BD, /* 0xB0 */
+ 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x555E, 0x4E9E, /* 0xC0 */
+ 0x8A1D, 0x7109, 0x54BD, 0x95B9, 0x70DF, 0x6DF9, 0x9E7D, 0x56B4, /* 0xC0 */
+ 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x9854, 0x95BB, 0x708E, /* 0xD0 */
+ 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8277, 0x5830, /* 0xD0 */
+ 0x71D5, 0x53AD, 0x786F, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4, /* 0xE0 */
+ 0x8AFA, 0x9A57, 0x6B83, 0x592E, 0x9D26, 0x79E7, 0x694A, 0x63DA, /* 0xE0 */
+ 0x4F6F, 0x760D, 0x7F8A, 0x6D0B, 0x967D, 0x6C27, 0x4EF0, 0x7662, /* 0xF0 */
+ 0x990A, 0x6A23, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6447, 0x582F, 0x9065, 0x7A91, 0x8B21, 0x59DA, 0x54AC, /* 0xA0 */
+ 0x8200, 0x85E5, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x723A, /* 0xA0 */
+ 0x91CE, 0x51B6, 0x4E5F, 0x9801, 0x6396, 0x696D, 0x8449, 0x66F3, /* 0xB0 */
+ 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x91AB, 0x63D6, 0x92A5, /* 0xB0 */
+ 0x4F9D, 0x4F0A, 0x8863, 0x9824, 0x5937, 0x907A, 0x79FB, 0x5100, /* 0xC0 */
+ 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x87FB, /* 0xC0 */
+ 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x85DD, 0x6291, 0x6613, /* 0xD0 */
+ 0x9091, 0x5C79, 0x5104, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, /* 0xD0 */
+ 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x61B6, 0x7FA9, 0x76CA, 0x6EA2, /* 0xE0 */
+ 0x8A63, 0x8B70, 0x8ABC, 0x8B6F, 0x5F02, 0x7FFC, 0x7FCC, 0x7E79, /* 0xE0 */
+ 0x8335, 0x852D, 0x56E0, 0x6BB7, 0x97F3, 0x9670, 0x59FB, 0x541F, /* 0xF0 */
+ 0x9280, 0x6DEB, 0x5BC5, 0x98F2, 0x5C39, 0x5F15, 0x96B1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5370, 0x82F1, 0x6AFB, 0x5B30, 0x9DF9, 0x61C9, 0x7E93, /* 0xA0 */
+ 0x7469, 0x87A2, 0x71DF, 0x7192, 0x8805, 0x8FCE, 0x8D0F, 0x76C8, /* 0xA0 */
+ 0x5F71, 0x7A4E, 0x786C, 0x6620, 0x55B2, 0x64C1, 0x50AD, 0x81C3, /* 0xB0 */
+ 0x7670, 0x5EB8, 0x96CD, 0x8E34, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, /* 0xB0 */
+ 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x512A, 0x60A0, 0x6182, /* 0xC0 */
+ 0x5C24, 0x7531, 0x90F5, 0x923E, 0x7336, 0x6CB9, 0x6E38, 0x9149, /* 0xC0 */
+ 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8A98, 0x53C8, 0x5E7C, /* 0xD0 */
+ 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8F3F, /* 0xD0 */
+ 0x9918, 0x4FDE, 0x903E, 0x9B5A, 0x6109, 0x6E1D, 0x6F01, 0x9685, /* 0xE0 */
+ 0x4E88, 0x5A31, 0x96E8, 0x8207, 0x5DBC, 0x79B9, 0x5B87, 0x8A9E, /* 0xE0 */
+ 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x9B31, 0x5401, 0x9047, 0x55BB, /* 0xF0 */
+ 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x7344, 0x80B2, 0x8B7D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6D74, 0x5BD3, 0x88D5, 0x9810, 0x8C6B, 0x99AD, 0x9D1B, /* 0xA0 */
+ 0x6DF5, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F45, /* 0xA0 */
+ 0x5712, 0x54E1, 0x5713, 0x733F, 0x6E90, 0x7DE3, 0x9060, 0x82D1, /* 0xB0 */
+ 0x9858, 0x6028, 0x9662, 0x66F0, 0x7D04, 0x8D8A, 0x8E8D, 0x9470, /* 0xB0 */
+ 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x95B2, 0x8018, 0x96F2, 0x9116, /* 0xC0 */
+ 0x5300, 0x9695, 0x5141, 0x904B, 0x85F4, 0x9196, 0x6688, 0x97F5, /* 0xC0 */
+ 0x5B55, 0x531D, 0x7838, 0x96DC, 0x683D, 0x54C9, 0x707E, 0x5BB0, /* 0xD0 */
+ 0x8F09, 0x518D, 0x5728, 0x54B1, 0x6522, 0x66AB, 0x8D0A, 0x8D1C, /* 0xD0 */
+ 0x81DF, 0x846C, 0x906D, 0x7CDF, 0x947F, 0x85FB, 0x68D7, 0x65E9, /* 0xE0 */
+ 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7AC8, 0x71E5, /* 0xE0 */
+ 0x8CAC, 0x64C7, 0x5247, 0x6FA4, 0x8CCA, 0x600E, 0x589E, 0x618E, /* 0xF0 */
+ 0x66FE, 0x8D08, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8ECB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9358, 0x9598, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D, /* 0xA0 */
+ 0x70B8, 0x8A50, 0x6458, 0x9F4B, 0x5B85, 0x7A84, 0x50B5, 0x5BE8, /* 0xA0 */
+ 0x77BB, 0x6C08, 0x8A79, 0x7C98, 0x6CBE, 0x76DE, 0x65AC, 0x8F3E, /* 0xB0 */
+ 0x5D84, 0x5C55, 0x8638, 0x68E7, 0x5360, 0x6230, 0x7AD9, 0x6E5B, /* 0xB0 */
+ 0x7DBB, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F35, 0x638C, 0x6F32, /* 0xC0 */
+ 0x6756, 0x4E08, 0x5E33, 0x8CEC, 0x4ED7, 0x8139, 0x7634, 0x969C, /* 0xC0 */
+ 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D99, 0x7167, 0x7F69, 0x5146, /* 0xD0 */
+ 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x87C4, 0x8F4D, 0x8005, /* 0xD0 */
+ 0x937A, 0x8517, 0x9019, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504, /* 0xE0 */
+ 0x7827, 0x81FB, 0x8C9E, 0x91DD, 0x5075, 0x6795, 0x75B9, 0x8A3A, /* 0xE0 */
+ 0x9707, 0x632F, 0x93AE, 0x9663, 0x84B8, 0x6399, 0x775C, 0x5F81, /* 0xF0 */
+ 0x7319, 0x722D, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5E40, 0x7665, 0x912D, 0x8B49, 0x829D, 0x679D, 0x652F, /* 0xA0 */
+ 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7E54, /* 0xA0 */
+ 0x8077, 0x76F4, 0x690D, 0x6B96, 0x57F7, 0x503C, 0x4F84, 0x5740, /* 0xB0 */
+ 0x6307, 0x6B62, 0x8DBE, 0x8879, 0x65E8, 0x7D19, 0x5FD7, 0x646F, /* 0xB0 */
+ 0x64F2, 0x81F3, 0x81F4, 0x7F6E, 0x5E5F, 0x5CD9, 0x5236, 0x667A, /* 0xC0 */
+ 0x79E9, 0x7A1A, 0x8CEA, 0x7099, 0x75D4, 0x6EEF, 0x6CBB, 0x7A92, /* 0xC0 */
+ 0x4E2D, 0x76C5, 0x5FE0, 0x9418, 0x8877, 0x7D42, 0x7A2E, 0x816B, /* 0xD0 */
+ 0x91CD, 0x4EF2, 0x8846, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8B05, /* 0xD0 */
+ 0x7CA5, 0x8EF8, 0x8098, 0x5E1A, 0x5492, 0x76BA, 0x5B99, 0x665D, /* 0xE0 */
+ 0x9A5F, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8AF8, 0x8A85, /* 0xE0 */
+ 0x9010, 0x7AF9, 0x71ED, 0x716E, 0x62C4, 0x77DA, 0x56D1, 0x4E3B, /* 0xF0 */
+ 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8CAF, 0x9444, 0x7BC9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F4F, 0x6CE8, 0x795D, 0x99D0, 0x6293, 0x722A, 0x62FD, /* 0xA0 */
+ 0x5C08, 0x78DA, 0x8F49, 0x64B0, 0x8CFA, 0x7BC6, 0x6A01, 0x838A, /* 0xA0 */
+ 0x88DD, 0x599D, 0x649E, 0x58EF, 0x72C0, 0x690E, 0x9310, 0x8FFD, /* 0xB0 */
+ 0x8D05, 0x589C, 0x7DB4, 0x8AC4, 0x6E96, 0x6349, 0x62D9, 0x5353, /* 0xB0 */
+ 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6FC1, /* 0xC0 */
+ 0x5179, 0x54A8, 0x8CC7, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, /* 0xC0 */
+ 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6F2C, 0x5B57, 0x9B03, /* 0xD0 */
+ 0x68D5, 0x8E2A, 0x5B97, 0x7D9C, 0x7E3D, 0x7E31, 0x9112, 0x8D70, /* 0xD0 */
+ 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8A5B, /* 0xE0 */
+ 0x963B, 0x7D44, 0x947D, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, /* 0xE0 */
+ 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, /* 0xF0 */
+ 0x5750, 0x5EA7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, /* 0xA0 */
+ 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, /* 0xA0 */
+ 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, /* 0xB0 */
+ 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, /* 0xB0 */
+ 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x55C7, 0x560F, 0x4EC4, 0x5399, /* 0xC0 */
+ 0x539D, 0x53B4, 0x53A5, 0x53AE, 0x9768, 0x8D0B, 0x531A, 0x53F5, /* 0xC0 */
+ 0x532D, 0x5331, 0x533E, 0x8CFE, 0x5366, 0x5363, 0x5202, 0x5208, /* 0xD0 */
+ 0x520E, 0x5244, 0x5233, 0x528C, 0x5274, 0x524C, 0x525E, 0x5261, /* 0xD0 */
+ 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, /* 0xE0 */
+ 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, /* 0xE0 */
+ 0x4EDE, 0x50B4, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x5000, 0x5096, /* 0xF0 */
+ 0x4F09, 0x4F47, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_D9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91, /* 0xA0 */
+ 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x5115, 0x4F7C, 0x5102, /* 0xA0 */
+ 0x4F94, 0x5114, 0x513C, 0x5137, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, /* 0xB0 */
+ 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F, /* 0xB0 */
+ 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x50E8, /* 0xC0 */
+ 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x50C2, 0x513B, 0x5110, /* 0xC0 */
+ 0x513A, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE, /* 0xD0 */
+ 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x50C9, 0x4FCE, 0x9FA0, /* 0xD0 */
+ 0x6C46, 0x7CF4, 0x516E, 0x5DFD, 0x9ECC, 0x9998, 0x56C5, 0x5914, /* 0xE0 */
+ 0x52F9, 0x530D, 0x8A07, 0x5310, 0x9CEC, 0x5919, 0x5155, 0x4EA0, /* 0xE0 */
+ 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x893B, 0x81E0, 0x88D2, 0x7980, /* 0xF0 */
+ 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_DA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8A01, 0x8A10, 0x8A0C, /* 0xA0 */
+ 0x8A15, 0x8B33, 0x8A4E, 0x8A25, 0x8A41, 0x8A36, 0x8A46, 0x8A54, /* 0xA0 */
+ 0x8A58, 0x8A52, 0x8A86, 0x8A84, 0x8A7F, 0x8A70, 0x8A7C, 0x8A75, /* 0xB0 */
+ 0x8A6C, 0x8A6E, 0x8ACD, 0x8AE2, 0x8A61, 0x8A9A, 0x8AA5, 0x8A91, /* 0xB0 */
+ 0x8A92, 0x8ACF, 0x8AD1, 0x8AC9, 0x8ADB, 0x8AD7, 0x8AC2, 0x8AB6, /* 0xC0 */
+ 0x8AF6, 0x8AEB, 0x8B14, 0x8B01, 0x8AE4, 0x8AED, 0x8AFC, 0x8AF3, /* 0xC0 */
+ 0x8AE6, 0x8AEE, 0x8ADE, 0x8B28, 0x8B9C, 0x8B16, 0x8B1A, 0x8B10, /* 0xD0 */
+ 0x8B2B, 0x8B2D, 0x8B56, 0x8B59, 0x8B4E, 0x8B9E, 0x8B6B, 0x8B96, /* 0xD0 */
+ 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D, /* 0xE0 */
+ 0x963C, 0x9642, 0x9658, 0x9654, 0x965F, 0x9689, 0x966C, 0x9672, /* 0xE0 */
+ 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x913A, /* 0xF0 */
+ 0x9099, 0x9114, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x9134 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_DB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x90B8, 0x90B0, 0x90DF, 0x90C5, 0x90BE, 0x9136, 0x90C4, /* 0xA0 */
+ 0x90C7, 0x9106, 0x9148, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB, /* 0xA0 */
+ 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F, /* 0xB0 */
+ 0x9139, 0x9143, 0x9146, 0x82BB, 0x5950, 0x52F1, 0x52AC, 0x52AD, /* 0xB0 */
+ 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD, /* 0xC0 */
+ 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DF0, /* 0xC0 */
+ 0x574C, 0x580A, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729, /* 0xD0 */
+ 0x572C, 0x572A, 0x5733, 0x58D9, 0x572E, 0x572F, 0x58E2, 0x573B, /* 0xD0 */
+ 0x5742, 0x5769, 0x58E0, 0x576B, 0x58DA, 0x577C, 0x577B, 0x5768, /* 0xE0 */
+ 0x576D, 0x5776, 0x5773, 0x57E1, 0x57A4, 0x578C, 0x584F, 0x57CF, /* 0xE0 */
+ 0x57A7, 0x5816, 0x5793, 0x57A0, 0x57D5, 0x5852, 0x581D, 0x5864, /* 0xF0 */
+ 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_DC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, /* 0xA0 */
+ 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, /* 0xA0 */
+ 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, /* 0xB0 */
+ 0x82A8, 0x8284, 0x828E, 0x8291, 0x858C, 0x8299, 0x82AB, 0x8553, /* 0xB0 */
+ 0x82BE, 0x82B0, 0x85F6, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, /* 0xC0 */
+ 0x83A7, 0x8407, 0x84EF, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, /* 0xC0 */
+ 0x82C4, 0x82E7, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x8622, /* 0xD0 */
+ 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, /* 0xD0 */
+ 0x8526, 0x831A, 0x8306, 0x584B, 0x7162, 0x82E0, 0x82D5, 0x831C, /* 0xE0 */
+ 0x8351, 0x8558, 0x84FD, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, /* 0xE0 */
+ 0x839B, 0x854E, 0x832F, 0x834F, 0x8347, 0x8343, 0x8588, 0x8340, /* 0xF0 */
+ 0x8317, 0x85BA, 0x832D, 0x833A, 0x8333, 0x7296, 0x6ECE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_DD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8541, 0x831B, 0x85CE, 0x8552, 0x84C0, 0x8452, 0x8464, /* 0xA0 */
+ 0x83B0, 0x8378, 0x8494, 0x8435, 0x83A0, 0x83AA, 0x8393, 0x839C, /* 0xA0 */
+ 0x8385, 0x837C, 0x859F, 0x83A9, 0x837D, 0x8555, 0x837B, 0x8398, /* 0xB0 */
+ 0x839E, 0x83A8, 0x9DAF, 0x8493, 0x83C1, 0x8401, 0x83E5, 0x83D8, /* 0xB0 */
+ 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438, /* 0xC0 */
+ 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9, /* 0xC0 */
+ 0x83EA, 0x83C5, 0x83C0, 0x7E08, 0x83F0, 0x83E1, 0x845C, 0x8451, /* 0xD0 */
+ 0x845A, 0x8459, 0x8473, 0x8546, 0x8488, 0x847A, 0x8562, 0x8478, /* 0xD0 */
+ 0x843C, 0x8446, 0x8469, 0x8476, 0x851E, 0x848E, 0x8431, 0x846D, /* 0xE0 */
+ 0x84C1, 0x84CD, 0x84D0, 0x9A40, 0x84BD, 0x84D3, 0x84CA, 0x84BF, /* 0xE0 */
+ 0x84BA, 0x863A, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x93A3, 0x8577, /* 0xF0 */
+ 0x850C, 0x750D, 0x8538, 0x84F0, 0x861E, 0x851F, 0x85FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_DE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568, /* 0xA0 */
+ 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8604, 0x857B, 0x85A4, /* 0xA0 */
+ 0x85A8, 0x8587, 0x858F, 0x8579, 0x85EA, 0x859C, 0x8585, 0x85B9, /* 0xB0 */
+ 0x85B7, 0x85B0, 0x861A, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605, /* 0xB0 */
+ 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5969, 0x8037, /* 0xC0 */
+ 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C37, /* 0xC0 */
+ 0x624C, 0x636B, 0x6476, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE, /* 0xD0 */
+ 0x649F, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371, /* 0xD0 */
+ 0x637A, 0x638E, 0x6451, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE, /* 0xE0 */
+ 0x645C, 0x63F2, 0x63F8, 0x63E0, 0x64B3, 0x63C4, 0x63DE, 0x63CE, /* 0xE0 */
+ 0x6452, 0x63C6, 0x63BE, 0x6504, 0x6441, 0x640B, 0x641B, 0x6420, /* 0xF0 */
+ 0x640C, 0x6426, 0x6421, 0x645E, 0x6516, 0x646D, 0x6496 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_DF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x647A, 0x64F7, 0x64FC, 0x6499, 0x651B, 0x64C0, 0x64D0, /* 0xA0 */
+ 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2, /* 0xA0 */
+ 0x7519, 0x5F11, 0x535F, 0x53F1, 0x5630, 0x53E9, 0x53E8, 0x53FB, /* 0xB0 */
+ 0x5412, 0x5416, 0x5406, 0x544B, 0x5638, 0x56C8, 0x5454, 0x56A6, /* 0xB0 */
+ 0x5443, 0x5421, 0x5504, 0x54BC, 0x5423, 0x5432, 0x5482, 0x5494, /* 0xC0 */
+ 0x5477, 0x5471, 0x5464, 0x549A, 0x5680, 0x5484, 0x5476, 0x5466, /* 0xC0 */
+ 0x565D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x5660, 0x54A7, 0x54A6, /* 0xD0 */
+ 0x5635, 0x55F6, 0x5472, 0x54A3, 0x5666, 0x54BB, 0x54BF, 0x54CC, /* 0xD0 */
+ 0x5672, 0x54DA, 0x568C, 0x54A9, 0x54AA, 0x54A4, 0x5665, 0x54CF, /* 0xE0 */
+ 0x54DE, 0x561C, 0x54E7, 0x562E, 0x54FD, 0x5514, 0x54F3, 0x55E9, /* 0xE0 */
+ 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5616, 0x558F, 0x55B5, /* 0xF0 */
+ 0x5549, 0x56C0, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, /* 0xA0 */
+ 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, /* 0xA0 */
+ 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x560D, 0x56B3, /* 0xB0 */
+ 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x56C1, /* 0xB0 */
+ 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, /* 0xC0 */
+ 0x566F, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F61, 0x561E, /* 0xC0 */
+ 0x5608, 0x560C, 0x5601, 0x56B6, 0x5623, 0x55FE, 0x5600, 0x5627, /* 0xD0 */
+ 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, /* 0xD0 */
+ 0x5695, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, /* 0xE0 */
+ 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, /* 0xE0 */
+ 0x5707, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, /* 0xF0 */
+ 0x5E43, 0x5E19, 0x5E14, 0x5E11, 0x5E6C, 0x5E58, 0x5E57 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, /* 0xA0 */
+ 0x5C7A, 0x5C8D, 0x5C90, 0x5D87, 0x5C88, 0x5CF4, 0x5C99, 0x5C91, /* 0xA0 */
+ 0x5D50, 0x5C9C, 0x5CB5, 0x5CA2, 0x5D2C, 0x5CAC, 0x5CAB, 0x5CB1, /* 0xB0 */
+ 0x5CA3, 0x5CC1, 0x5CB7, 0x5DA7, 0x5CD2, 0x5DA0, 0x5CCB, 0x5D22, /* 0xB0 */
+ 0x5D97, 0x5D0D, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, /* 0xC0 */
+ 0x5D1B, 0x5DB8, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, /* 0xC0 */
+ 0x5D81, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99, /* 0xD0 */
+ 0x5D9D, 0x8C73, 0x5DB7, 0x5DD4, 0x5F73, 0x5F77, 0x5F82, 0x5F87, /* 0xD0 */
+ 0x5F89, 0x540E, 0x5FA0, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, /* 0xE0 */
+ 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x7377, 0x7341, /* 0xE0 */
+ 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x736A, 0x72E9, /* 0xF0 */
+ 0x733B, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x736B, 0x72FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x72FB, 0x7317, 0x7313, 0x7380, 0x730A, 0x731E, 0x731D, /* 0xA0 */
+ 0x737C, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350, /* 0xA0 */
+ 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925, /* 0xB0 */
+ 0x98E7, 0x5924, 0x5902, 0x98E0, 0x9933, 0x98E9, 0x993C, 0x98EA, /* 0xB0 */
+ 0x98EB, 0x98ED, 0x98F4, 0x9909, 0x9911, 0x4F59, 0x991B, 0x9937, /* 0xC0 */
+ 0x993F, 0x9943, 0x9948, 0x9949, 0x994A, 0x994C, 0x9962, 0x5E80, /* 0xC0 */
+ 0x5EE1, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE, /* 0xD0 */
+ 0x5EB3, 0x8CE1, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA, /* 0xD0 */
+ 0x5FC4, 0x5FC9, 0x5FD6, 0x61FA, 0x61AE, 0x5FEE, 0x616A, 0x5FE1, /* 0xE0 */
+ 0x5FE4, 0x613E, 0x60B5, 0x6134, 0x5FEA, 0x5FED, 0x5FF8, 0x6019, /* 0xE0 */
+ 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A, /* 0xF0 */
+ 0x61CC, 0x6021, 0x615F, 0x61E8, 0x60FB, 0x6137, 0x6042 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x606A, 0x60F2, 0x6096, 0x609A, 0x6173, 0x609D, 0x6083, /* 0xA0 */
+ 0x6092, 0x608C, 0x609B, 0x611C, 0x60BB, 0x60B1, 0x60DD, 0x60D8, /* 0xA0 */
+ 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6192, 0x6115, 0x6123, 0x60F4, /* 0xB0 */
+ 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7, /* 0xB0 */
+ 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x9582, 0x9586, 0x95C8, /* 0xC0 */
+ 0x958E, 0x9594, 0x958C, 0x95E5, 0x95AD, 0x95AB, 0x9B2E, 0x95AC, /* 0xC0 */
+ 0x95BE, 0x95B6, 0x9B29, 0x95BF, 0x95BD, 0x95BC, 0x95C3, 0x95CB, /* 0xD0 */
+ 0x95D4, 0x95D0, 0x95D5, 0x95DE, 0x4E2C, 0x723F, 0x6215, 0x6C35, /* 0xD0 */
+ 0x6C54, 0x6C5C, 0x6C4A, 0x7043, 0x6C85, 0x6C90, 0x6C94, 0x6C8C, /* 0xE0 */
+ 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6F59, 0x6CD0, 0x6CD4, /* 0xE0 */
+ 0x6CAD, 0x7027, 0x7018, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6, /* 0xF0 */
+ 0x6FFC, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6D87 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6D39, 0x6D27, 0x6D0C, 0x6D79, 0x6E5E, 0x6D07, 0x6D04, /* 0xA0 */
+ 0x6D19, 0x6D0E, 0x6D2B, 0x6FAE, 0x6D2E, 0x6D35, 0x6D1A, 0x700F, /* 0xA0 */
+ 0x6EF8, 0x6F6F, 0x6D33, 0x6D91, 0x6D6F, 0x6DF6, 0x6F7F, 0x6D5E, /* 0xB0 */
+ 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, /* 0xB0 */
+ 0x6DC5, 0x6DDE, 0x7006, 0x6DBF, 0x6DE0, 0x6FA0, 0x6DE6, 0x6DDD, /* 0xC0 */
+ 0x6DD9, 0x700B, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, /* 0xC0 */
+ 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, /* 0xD0 */
+ 0x6E44, 0x7067, 0x6EB1, 0x6E98, 0x7044, 0x6F2D, 0x7005, 0x6EA5, /* 0xD0 */
+ 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6F77, 0x6EB4, 0x6ECF, 0x6E8F, /* 0xE0 */
+ 0x6EC2, 0x6E9F, 0x6F62, 0x7020, 0x701F, 0x6F24, 0x6F15, 0x6EF9, /* 0xE0 */
+ 0x6F2F, 0x6F36, 0x7032, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, /* 0xF0 */
+ 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x7028 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, /* 0xA0 */
+ 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035, /* 0xA0 */
+ 0x705D, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, /* 0xB0 */
+ 0x752F, 0x9A2B, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47, /* 0xB0 */
+ 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x9087, /* 0xC0 */
+ 0x8FE6, 0x9015, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9090, 0x9011, /* 0xC0 */
+ 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044, /* 0xD0 */
+ 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9, /* 0xD0 */
+ 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57, /* 0xE0 */
+ 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63, /* 0xE0 */
+ 0x5C68, 0x7FBC, 0x5F33, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, /* 0xF0 */
+ 0x5C6E, 0x5981, 0x5983, 0x598D, 0x5AF5, 0x5AD7, 0x59A3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5997, 0x59CA, 0x5B00, 0x599E, 0x59A4, 0x59D2, 0x59B2, /* 0xA0 */
+ 0x59AF, 0x59D7, 0x59BE, 0x5A6D, 0x5B08, 0x59DD, 0x5B4C, 0x59E3, /* 0xA0 */
+ 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5AA7, 0x5AFB, 0x5A11, 0x5A23, /* 0xB0 */
+ 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5B0B, /* 0xB0 */
+ 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2, /* 0xC0 */
+ 0x5B21, 0x5B2A, 0x5AB8, 0x5AE0, 0x5AE3, 0x5B19, 0x5AD6, 0x5AE6, /* 0xC0 */
+ 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40, /* 0xD0 */
+ 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62, /* 0xD0 */
+ 0x99D4, 0x99DF, 0x99D9, 0x9A36, 0x9A5B, 0x99D1, 0x99D8, 0x9A4D, /* 0xE0 */
+ 0x9A4A, 0x99E2, 0x9A6A, 0x9A0F, 0x9A0D, 0x9A05, 0x9A42, 0x9A2D, /* 0xE0 */
+ 0x9A16, 0x9A41, 0x9A2E, 0x9A38, 0x9A43, 0x9A44, 0x9A4F, 0x9A65, /* 0xF0 */
+ 0x9A64, 0x7CF9, 0x7D06, 0x7D02, 0x7D07, 0x7D08, 0x7E8A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7D1C, 0x7D15, 0x7D13, 0x7D3A, 0x7D32, 0x7D31, 0x7E10, /* 0xA0 */
+ 0x7D3C, 0x7D40, 0x7D3F, 0x7D5D, 0x7D4E, 0x7D73, 0x7D86, 0x7D83, /* 0xA0 */
+ 0x7D88, 0x7DBE, 0x7DBA, 0x7DCB, 0x7DD4, 0x7DC4, 0x7D9E, 0x7DAC, /* 0xB0 */
+ 0x7DB9, 0x7DA3, 0x7DB0, 0x7DC7, 0x7DD9, 0x7DD7, 0x7DF9, 0x7DF2, /* 0xB0 */
+ 0x7E62, 0x7DE6, 0x7DF6, 0x7DF1, 0x7E0B, 0x7DE1, 0x7E09, 0x7E1D, /* 0xC0 */
+ 0x7E1F, 0x7E1E, 0x7E2D, 0x7E0A, 0x7E11, 0x7E7D, 0x7E39, 0x7E35, /* 0xC0 */
+ 0x7E32, 0x7E46, 0x7E45, 0x7E88, 0x7E5A, 0x7E52, 0x7E6E, 0x7E7E, /* 0xD0 */
+ 0x7E70, 0x7E6F, 0x7E98, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095, /* 0xD0 */
+ 0x738E, 0x74A3, 0x744B, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x74CF, /* 0xE0 */
+ 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x980A, /* 0xE0 */
+ 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x74BD, 0x743F, 0x7489, 0x742A, /* 0xF0 */
+ 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, /* 0xA0 */
+ 0x74A6, 0x746D, 0x747E, 0x749C, 0x74D4, 0x7480, 0x7481, 0x7487, /* 0xA0 */
+ 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74DA, 0x74BA, /* 0xB0 */
+ 0x97D9, 0x97DE, 0x97DC, 0x674C, 0x6753, 0x675E, 0x6748, 0x69AA, /* 0xB0 */
+ 0x6AEA, 0x6787, 0x676A, 0x6773, 0x6798, 0x6898, 0x6775, 0x68D6, /* 0xC0 */
+ 0x6A05, 0x689F, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6ADB, 0x67D8, /* 0xC0 */
+ 0x6AF3, 0x67E9, 0x67B0, 0x6AE8, 0x67D9, 0x67B5, 0x67DA, 0x67B3, /* 0xD0 */
+ 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x6ADF, 0x67C1, 0x6A89, /* 0xD0 */
+ 0x6832, 0x6833, 0x690F, 0x6A48, 0x684E, 0x6968, 0x6844, 0x69BF, /* 0xE0 */
+ 0x6883, 0x681D, 0x6855, 0x6A3A, 0x6841, 0x6A9C, 0x6840, 0x6B12, /* 0xE0 */
+ 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, /* 0xF0 */
+ 0x686B, 0x6B1E, 0x696E, 0x68FC, 0x6ADD, 0x69E7, 0x68F9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_E9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6B0F, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910, /* 0xA0 */
+ 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6B16, 0x696B, 0x6980, /* 0xA0 */
+ 0x6998, 0x6978, 0x6934, 0x69CC, 0x6AEC, 0x6ADA, 0x69CE, 0x6AF8, /* 0xB0 */
+ 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD, /* 0xB0 */
+ 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x6AB3, 0x6995, 0x6AE7, 0x698D, /* 0xC0 */
+ 0x69FF, 0x6AA3, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44, /* 0xC0 */
+ 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6AD3, 0x6A3D, /* 0xD0 */
+ 0x6A28, 0x6A58, 0x6ADE, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, /* 0xD0 */
+ 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6BA4, 0x6B84, 0x6B9E, 0x6BAE, /* 0xE0 */
+ 0x6B8D, 0x6BAB, 0x6B9B, 0x6BAF, 0x6BAA, 0x8ED4, 0x8EDB, 0x8EF2, /* 0xE0 */
+ 0x8EFB, 0x8F64, 0x8EF9, 0x8EFC, 0x8EEB, 0x8EE4, 0x8F62, 0x8EFA, /* 0xF0 */
+ 0x8EFE, 0x8F0A, 0x8F07, 0x8F05, 0x8F12, 0x8F26, 0x8F1E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_EA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8F1F, 0x8F1C, 0x8F33, 0x8F46, 0x8F54, 0x8ECE, 0x6214, /* 0xA0 */
+ 0x6227, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x6229, /* 0xA0 */
+ 0x81E7, 0x750C, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534, /* 0xB0 */
+ 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x66C7, 0x6772, 0x6603, 0x6615, /* 0xB0 */
+ 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635, /* 0xC0 */
+ 0x8006, 0x665F, 0x66C4, 0x6641, 0x664F, 0x6689, 0x6661, 0x6657, /* 0xC0 */
+ 0x6677, 0x6684, 0x668C, 0x66D6, 0x669D, 0x66BE, 0x66DB, 0x66DC, /* 0xD0 */
+ 0x66E6, 0x66E9, 0x8CC1, 0x8CB0, 0x8CBA, 0x8CBD, 0x8D04, 0x8CB2, /* 0xD0 */
+ 0x8CC5, 0x8D10, 0x8CD1, 0x8CDA, 0x8CD5, 0x8CEB, 0x8CE7, 0x8CFB, /* 0xE0 */
+ 0x8998, 0x89AC, 0x89A1, 0x89BF, 0x89A6, 0x89AF, 0x89B2, 0x89B7, /* 0xE0 */
+ 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284, /* 0xF0 */
+ 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_EB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BFF, /* 0xA0 */
+ 0x6BF9, 0x6C05, 0x6C0C, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19, /* 0xA0 */
+ 0x6C1A, 0x6C21, 0x6C2C, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555, /* 0xB0 */
+ 0x656B, 0x7258, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F, /* 0xB0 */
+ 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD, /* 0xC0 */
+ 0x80B4, 0x80B7, 0x6727, 0x8156, 0x80E9, 0x81DA, 0x80DB, 0x80C2, /* 0xC0 */
+ 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x811B, 0x80F1, /* 0xD0 */
+ 0x80F4, 0x80ED, 0x81BE, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112, /* 0xD0 */
+ 0x8C5A, 0x8161, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C, /* 0xE0 */
+ 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C, /* 0xE0 */
+ 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x81CF, /* 0xF0 */
+ 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_EC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x81C1, 0x81A6, 0x6B5F, 0x6B37, 0x6B39, 0x6B43, 0x6B46, /* 0xA0 */
+ 0x6B59, 0x98AE, 0x98AF, 0x98B6, 0x98BC, 0x98C6, 0x98C8, 0x6BB3, /* 0xA0 */
+ 0x5F40, 0x8F42, 0x89F3, 0x6590, 0x9F4F, 0x6595, 0x65BC, 0x65C6, /* 0xB0 */
+ 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x716C, 0x7152, /* 0xB0 */
+ 0x7096, 0x7197, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x71C1, /* 0xC0 */
+ 0x70CA, 0x7110, 0x7113, 0x71DC, 0x712F, 0x7131, 0x7173, 0x715C, /* 0xC0 */
+ 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, /* 0xD0 */
+ 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, /* 0xD0 */
+ 0x7228, 0x706C, 0x71FE, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, /* 0xE0 */
+ 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, /* 0xE0 */
+ 0x7953, 0x795A, 0x79B0, 0x7957, 0x7960, 0x798E, 0x7967, 0x797A, /* 0xF0 */
+ 0x79AA, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_ED[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x61DF, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063, /* 0xA0 */
+ 0x6164, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61E3, /* 0xA0 */
+ 0x6207, 0x8080, 0x807F, 0x6C93, 0x6FA9, 0x6DFC, 0x78EF, 0x77F8, /* 0xB0 */
+ 0x78AD, 0x7809, 0x7868, 0x7818, 0x7811, 0x65AB, 0x782D, 0x78B8, /* 0xB0 */
+ 0x781D, 0x7839, 0x792A, 0x7931, 0x781F, 0x783C, 0x7825, 0x782C, /* 0xC0 */
+ 0x7823, 0x7829, 0x784E, 0x786D, 0x7864, 0x78FD, 0x7826, 0x7850, /* 0xC0 */
+ 0x7847, 0x784C, 0x786A, 0x78E7, 0x7893, 0x789A, 0x7887, 0x78E3, /* 0xD0 */
+ 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9, /* 0xD0 */
+ 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934, /* 0xE0 */
+ 0x9F95, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x7798, 0x76F9, /* 0xE0 */
+ 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735, /* 0xF0 */
+ 0x7738, 0x775E, 0x77BC, 0x7747, 0x7743, 0x775A, 0x7768 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_EE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C, /* 0xA0 */
+ 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540, /* 0xA0 */
+ 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58, /* 0xB0 */
+ 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F86, 0x7F71, 0x7F79, 0x7F88, /* 0xB0 */
+ 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x91D2, 0x91D3, 0x91D4, 0x91D9, /* 0xC0 */
+ 0x91D7, 0x91D5, 0x91F7, 0x91E7, 0x91E4, 0x9346, 0x91F5, 0x91F9, /* 0xC0 */
+ 0x9208, 0x9226, 0x9245, 0x9211, 0x9210, 0x9201, 0x9227, 0x9204, /* 0xD0 */
+ 0x9225, 0x9200, 0x923A, 0x9266, 0x9237, 0x9233, 0x9255, 0x923D, /* 0xD0 */
+ 0x9238, 0x925E, 0x926C, 0x926D, 0x923F, 0x9460, 0x9230, 0x9249, /* 0xE0 */
+ 0x9248, 0x924D, 0x922E, 0x9239, 0x9438, 0x92AC, 0x92A0, 0x927A, /* 0xE0 */
+ 0x92AA, 0x92EE, 0x92CF, 0x9403, 0x92E3, 0x943A, 0x92B1, 0x92A6, /* 0xF0 */
+ 0x93A7, 0x9296, 0x92CC, 0x92A9, 0x93F5, 0x9293, 0x927F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_EF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x93A9, 0x929A, 0x931A, 0x92AB, 0x9283, 0x940B, 0x92A8, /* 0xA0 */
+ 0x92A3, 0x9412, 0x9338, 0x92F1, 0x93D7, 0x92E5, 0x92F0, 0x92EF, /* 0xA0 */
+ 0x92E8, 0x92BC, 0x92DD, 0x92F6, 0x9426, 0x9427, 0x92C3, 0x92DF, /* 0xB0 */
+ 0x92E6, 0x9312, 0x9306, 0x9369, 0x931B, 0x9340, 0x9301, 0x9315, /* 0xB0 */
+ 0x932E, 0x9343, 0x9307, 0x9308, 0x931F, 0x9319, 0x9365, 0x9347, /* 0xC0 */
+ 0x9376, 0x9354, 0x9364, 0x93AA, 0x9370, 0x9384, 0x93E4, 0x93D8, /* 0xC0 */
+ 0x9428, 0x9387, 0x93CC, 0x9398, 0x93B8, 0x93BF, 0x93A6, 0x93B0, /* 0xD0 */
+ 0x93B5, 0x944C, 0x93E2, 0x93DC, 0x93DD, 0x93CD, 0x93DE, 0x93C3, /* 0xD0 */
+ 0x93C7, 0x93D1, 0x9414, 0x941D, 0x93F7, 0x9465, 0x9413, 0x946D, /* 0xE0 */
+ 0x9420, 0x9479, 0x93F9, 0x9419, 0x944A, 0x9432, 0x943F, 0x9454, /* 0xE0 */
+ 0x9463, 0x937E, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3, /* 0xF0 */
+ 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7A39, 0x7A37, 0x7A61, 0x9ECF, 0x99A5, 0x7A70, 0x7688, /* 0xA0 */
+ 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9CE9, /* 0xA0 */
+ 0x9CF6, 0x9D07, 0x9D06, 0x9D23, 0x9D87, 0x9E15, 0x9D1D, 0x9D1F, /* 0xB0 */
+ 0x9DE5, 0x9D2F, 0x9DD9, 0x9D30, 0x9D42, 0x9E1E, 0x9D53, 0x9E1D, /* 0xB0 */
+ 0x9D60, 0x9D52, 0x9DF3, 0x9D5C, 0x9D61, 0x9D93, 0x9D6A, 0x9D6F, /* 0xC0 */
+ 0x9D89, 0x9D98, 0x9D9A, 0x9DC0, 0x9DA5, 0x9DA9, 0x9DC2, 0x9DBC, /* 0xC0 */
+ 0x9E1A, 0x9DD3, 0x9DDA, 0x9DEF, 0x9DE6, 0x9DF2, 0x9DF8, 0x9E0C, /* 0xD0 */
+ 0x9DFA, 0x9E1B, 0x7592, 0x7594, 0x7664, 0x7658, 0x759D, 0x7667, /* 0xD0 */
+ 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, /* 0xE0 */
+ 0x75C2, 0x7602, 0x75CD, 0x75E3, 0x7646, 0x75E6, 0x75E4, 0x7647, /* 0xE0 */
+ 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7649, /* 0xF0 */
+ 0x760C, 0x761E, 0x760A, 0x7625, 0x763B, 0x7615, 0x7619 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630, /* 0xA0 */
+ 0x766D, 0x7635, 0x7643, 0x766E, 0x7633, 0x764D, 0x7669, 0x7654, /* 0xA0 */
+ 0x765C, 0x7656, 0x7672, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, /* 0xB0 */
+ 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AC7, 0x7AA0, 0x7AAC, 0x7AA8, /* 0xB0 */
+ 0x7AB6, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882, /* 0xC0 */
+ 0x88A2, 0x8960, 0x88B7, 0x88BC, 0x88C9, 0x8933, 0x88CE, 0x895D, /* 0xC0 */
+ 0x8947, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921, /* 0xD0 */
+ 0x8919, 0x8913, 0x8938, 0x890A, 0x8964, 0x892B, 0x8936, 0x8941, /* 0xD0 */
+ 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B8, 0x76B4, 0x77DC, 0x8012, /* 0xE0 */
+ 0x8014, 0x8016, 0x801C, 0x8020, 0x802E, 0x8025, 0x8026, 0x802C, /* 0xE0 */
+ 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x8079, /* 0xF0 */
+ 0x8052, 0x8075, 0x8071, 0x8983, 0x9807, 0x980E, 0x980F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9821, 0x981C, 0x6F41, 0x9826, 0x9837, 0x984E, 0x9853, /* 0xA0 */
+ 0x9873, 0x9862, 0x9859, 0x9865, 0x986C, 0x9870, 0x864D, 0x8654, /* 0xA0 */
+ 0x866C, 0x87E3, 0x8806, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D, /* 0xB0 */
+ 0x868B, 0x8706, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9, /* 0xB0 */
+ 0x86B6, 0x86C4, 0x86B5, 0x8823, 0x86B0, 0x86BA, 0x86B1, 0x86AF, /* 0xC0 */
+ 0x86C9, 0x87F6, 0x86B4, 0x86E9, 0x86FA, 0x87EF, 0x86ED, 0x8784, /* 0xC0 */
+ 0x86D0, 0x8713, 0x86DE, 0x8810, 0x86DF, 0x86D8, 0x86D1, 0x8703, /* 0xD0 */
+ 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B, /* 0xD0 */
+ 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x87C8, 0x8734, 0x8731, /* 0xE0 */
+ 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x8811, 0x877B, /* 0xE0 */
+ 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x87BB, /* 0xF0 */
+ 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87CE, 0x87D2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB, /* 0xA0 */
+ 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1, /* 0xA0 */
+ 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813, /* 0xB0 */
+ 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F4C, /* 0xB0 */
+ 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7BE4, 0x7B04, /* 0xC0 */
+ 0x7B67, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19, /* 0xC0 */
+ 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7C69, 0x7B1E, /* 0xD0 */
+ 0x7B58, 0x7BF3, 0x7B45, 0x7B75, 0x7B4C, 0x7B8F, 0x7B60, 0x7B6E, /* 0xD0 */
+ 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7C00, 0x7BCB, 0x7BB8, /* 0xE0 */
+ 0x7BAC, 0x7B9D, 0x7C5C, 0x7B85, 0x7C1E, 0x7B9C, 0x7BA2, 0x7C2B, /* 0xE0 */
+ 0x7BB4, 0x7C23, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6, /* 0xF0 */
+ 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C6A, 0x7C0B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C5F, 0x7C40, 0x81FE, /* 0xA0 */
+ 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8264, /* 0xA0 */
+ 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x826B, 0x8233, 0x8234, /* 0xB0 */
+ 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, /* 0xB0 */
+ 0x887E, 0x88CA, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7FA5, /* 0xC0 */
+ 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7CF2, /* 0xC0 */
+ 0x7CF6, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CDD, 0x7CC7, /* 0xD0 */
+ 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, /* 0xD0 */
+ 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, /* 0xE0 */
+ 0x7FF3, 0x7CF8, 0x7E36, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EA9, /* 0xE0 */
+ 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB2, 0x8D67, 0x8D6D, /* 0xF0 */
+ 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x91C5, 0x91C3, /* 0xA0 */
+ 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191, /* 0xA0 */
+ 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4, /* 0xB0 */
+ 0x91BA, 0x8C55, 0x9E7A, 0x8E89, 0x8DEB, 0x8E05, 0x8E59, 0x8E69, /* 0xB0 */
+ 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8E4C, 0x8DD6, 0x8DD7, 0x8DDA, /* 0xC0 */
+ 0x8E92, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8E7A, 0x8E55, /* 0xC0 */
+ 0x8DE3, 0x8E9A, 0x8E8B, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, /* 0xD0 */
+ 0x8E1F, 0x8E93, 0x8E2E, 0x8E23, 0x8E91, 0x8E3A, 0x8E40, 0x8E39, /* 0xD0 */
+ 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8EA1, 0x8E63, /* 0xE0 */
+ 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8EAA, /* 0xE0 */
+ 0x8E94, 0x8E90, 0x8EA6, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85, /* 0xF0 */
+ 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89F4, 0x89DA, 0x89DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x89E5, 0x89EB, 0x89F6, 0x8A3E, 0x8B26, 0x975A, 0x96E9, /* 0xA0 */
+ 0x9742, 0x96EF, 0x9706, 0x973D, 0x9708, 0x970F, 0x970E, 0x972A, /* 0xA0 */
+ 0x9744, 0x9730, 0x973E, 0x9F54, 0x9F5F, 0x9F59, 0x9F60, 0x9F5C, /* 0xB0 */
+ 0x9F66, 0x9F6C, 0x9F6A, 0x9F77, 0x9EFD, 0x9EFF, 0x9F09, 0x96B9, /* 0xB0 */
+ 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x8B8E, 0x928E, 0x947E, /* 0xC0 */
+ 0x92C8, 0x93E8, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9B77, /* 0xC0 */
+ 0x9B74, 0x9B81, 0x9B83, 0x9B8E, 0x9C78, 0x7A4C, 0x9B92, 0x9C5F, /* 0xD0 */
+ 0x9B90, 0x9BAD, 0x9B9A, 0x9BAA, 0x9B9E, 0x9C6D, 0x9BAB, 0x9B9D, /* 0xD0 */
+ 0x9C58, 0x9BC1, 0x9C7A, 0x9C31, 0x9C39, 0x9C23, 0x9C37, 0x9BC0, /* 0xE0 */
+ 0x9BCA, 0x9BC7, 0x9BFD, 0x9BD6, 0x9BEA, 0x9BEB, 0x9BE1, 0x9BE4, /* 0xE0 */
+ 0x9BE7, 0x9BDD, 0x9BE2, 0x9BF0, 0x9BDB, 0x9BF4, 0x9BD4, 0x9C5D, /* 0xF0 */
+ 0x9C08, 0x9C10, 0x9C0D, 0x9C12, 0x9C09, 0x9BFF, 0x9C20 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9C32, 0x9C2D, 0x9C28, 0x9C25, 0x9C29, 0x9C33, 0x9C3E, /* 0xA0 */
+ 0x9C48, 0x9C3B, 0x9C35, 0x9C45, 0x9C56, 0x9C54, 0x9C52, 0x9C67, /* 0xA0 */
+ 0x977C, 0x9785, 0x97C3, 0x97BD, 0x9794, 0x97C9, 0x97AB, 0x97A3, /* 0xB0 */
+ 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9DBB, 0x9AB6, 0x9ABA, /* 0xB0 */
+ 0x9ABC, 0x9AC1, 0x9AC0, 0x9ACF, 0x9AC2, 0x9AD6, 0x9AD5, 0x9AD1, /* 0xC0 */
+ 0x9B45, 0x9B43, 0x9B58, 0x9B4E, 0x9B48, 0x9B4D, 0x9B51, 0x9957, /* 0xC0 */
+ 0x995C, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF, /* 0xD0 */
+ 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B22, 0x9B1F, /* 0xD0 */
+ 0x9B23, 0x4E48, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B, /* 0xE0 */
+ 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0, /* 0xE0 */
+ 0x9EDF, 0x9EE2, 0x9EF7, 0x9EE7, 0x9EE5, 0x9EF2, 0x9EEF, 0x9F22, /* 0xF0 */
+ 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x896C, 0x95C6, 0x9336, 0x5F46, 0x8514, 0x7E94, 0x5382, /* 0xA0 */
+ 0x51B2, 0x4E11, 0x9F63, 0x5679, 0x515A, 0x6DC0, 0x9F15, 0x6597, /* 0xA0 */
+ 0x5641, 0x9AEE, 0x8303, 0x4E30, 0x8907, 0x5E72, 0x7A40, 0x98B3, /* 0xB0 */
+ 0x5E7F, 0x95A4, 0x9B0D, 0x5212, 0x8FF4, 0x5F59, 0x7A6B, 0x98E2, /* 0xB0 */
+ 0x51E0, 0x50A2, 0x4EF7, 0x8350, 0x8591, 0x5118, 0x636E, 0x6372, /* 0xC0 */
+ 0x524B, 0x5938, 0x774F, 0x8721, 0x814A, 0x7E8D, 0x91CC, 0x66C6, /* 0xC0 */
+ 0x5E18, 0x77AD, 0x9E75, 0x56C9, 0x9EF4, 0x6FDB, 0x61DE, 0x77C7, /* 0xD0 */
+ 0x7030, 0x9EB5, 0x884A, 0x95E2, 0x82F9, 0x51ED, 0x6251, 0x4EC6, /* 0xD0 */
+ 0x6734, 0x97C6, 0x7C64, 0x7E34, 0x97A6, 0x9EAF, 0x786E, 0x820D, /* 0xE0 */
+ 0x672F, 0x677E, 0x56CC, 0x53F0, 0x98B1, 0x6AAF, 0x7F4E, 0x6D82, /* 0xE0 */
+ 0x7CF0, 0x4E07, 0x4FC2, 0x7E6B, 0x9E79, 0x56AE, 0x9B1A, 0x846F, /* 0xF0 */
+ 0x53F6, 0x90C1, 0x79A6, 0x7C72, 0x613F, 0x4E91, 0x9AD2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_GBT_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x75C7, 0x96BB, 0x53EA, 0x7DFB, 0x88FD, 0x79CD, 0x7843, /* 0xA0 */
+ 0x7B51, 0x51C6 /* 0xA0 */
+};
diff --git a/sal/textenc/tcvtscn4.tab b/sal/textenc/tcvtscn4.tab
new file mode 100644
index 000000000000..c1251741759d
--- /dev/null
+++ b/sal/textenc/tcvtscn4.tab
@@ -0,0 +1,3070 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the UniCode to DBCS tables for the following */
+/* chinese simplified (China) charsets: */
+/* GB (GB2312) */
+
+/* In this file we have only the GB tables for the kanji characters, */
+/* because these tables can't shared with the GBK tables. */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2BB, 0xB6A1, 0, 0xC6DF, 0, 0, 0, 0xCDF2, /* 0x00 */
+ 0xD5C9, 0xC8FD, 0xC9CF, 0xCFC2, 0xD8A2, 0xB2BB, 0xD3EB, 0, /* 0x00 */
+ 0xD8A4, 0xB3F3, 0, 0xD7A8, 0xC7D2, 0xD8A7, 0xCAC0, 0, /* 0x10 */
+ 0xC7F0, 0xB1FB, 0xD2B5, 0xB4D4, 0xB6AB, 0xCBBF, 0xD8A9, 0, /* 0x10 */
+ 0, 0, 0xB6AA, 0, 0xC1BD, 0xD1CF, 0, 0xC9A5, /* 0x20 */
+ 0xD8AD, 0, 0xB8F6, 0xD1BE, 0xE3DC, 0xD6D0, 0, 0, /* 0x20 */
+ 0xB7E1, 0, 0xB4AE, 0, 0xC1D9, 0, 0xD8BC, 0, /* 0x30 */
+ 0xCDE8, 0xB5A4, 0xCEAA, 0xD6F7, 0, 0xC0F6, 0xBED9, 0xD8AF, /* 0x30 */
+ 0, 0, 0, 0xC4CB, 0, 0xBEC3, 0, 0xD8B1, /* 0x40 */
+ 0xC3B4, 0xD2E5, 0, 0xD6AE, 0xCEDA, 0xD5A7, 0xBAF5, 0xB7A6, /* 0x40 */
+ 0xC0D6, 0, 0xC6B9, 0xC5D2, 0xC7C7, 0, 0xB9D4, 0, /* 0x50 */
+ 0xB3CB, 0xD2D2, 0, 0, 0xD8BF, 0xBEC5, 0xC6F2, 0xD2B2, /* 0x50 */
+ 0xCFB0, 0xCFE7, 0, 0, 0, 0, 0xCAE9, 0, /* 0x60 */
+ 0, 0xD8C0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xC2F2, 0xC2D2, 0, 0xC8E9, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xC7AC, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xC1CB, 0, /* 0x80 */
+ 0xD3E8, 0xD5F9, 0, 0xCAC2, 0xB6FE, 0xD8A1, 0xD3DA, 0xBFF7, /* 0x80 */
+ 0, 0xD4C6, 0xBBA5, 0xD8C1, 0xCEE5, 0xBEAE, 0, 0, /* 0x90 */
+ 0xD8A8, 0, 0xD1C7, 0xD0A9, 0, 0, 0, 0xD8BD, /* 0x90 */
+ 0xD9EF, 0xCDF6, 0xBFBA, 0, 0xBDBB, 0xBAA5, 0xD2E0, 0xB2FA, /* 0xA0 */
+ 0xBAE0, 0xC4B6, 0, 0xCFED, 0xBEA9, 0xCDA4, 0xC1C1, 0, /* 0xA0 */
+ 0, 0, 0xC7D7, 0xD9F1, 0, 0xD9F4, 0, 0, /* 0xB0 */
+ 0, 0, 0xC8CB, 0xD8E9, 0, 0, 0, 0xD2DA, /* 0xB0 */
+ 0xCAB2, 0xC8CA, 0xD8EC, 0xD8EA, 0xD8C6, 0xBDF6, 0xC6CD, 0xB3F0, /* 0xC0 */
+ 0, 0xD8EB, 0xBDF1, 0xBDE9, 0, 0xC8D4, 0xB4D3, 0, /* 0xC0 */
+ 0, 0xC2D8, 0, 0xB2D6, 0xD7D0, 0xCACB, 0xCBFB, 0xD5CC, /* 0xD0 */
+ 0xB8B6, 0xCFC9, 0, 0, 0, 0xD9DA, 0xD8F0, 0xC7AA, /* 0xD0 */
+ 0, 0xD8EE, 0, 0xB4FA, 0xC1EE, 0xD2D4, 0, 0, /* 0xE0 */
+ 0xD8ED, 0, 0xD2C7, 0xD8EF, 0xC3C7, 0, 0, 0, /* 0xE0 */
+ 0xD1F6, 0, 0xD6D9, 0xD8F2, 0, 0xD8F5, 0xBCFE, 0xBCDB, /* 0xF0 */
+ 0, 0, 0, 0xC8CE, 0, 0xB7DD, 0, 0xB7C2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6F3, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xD8F8, 0xD2C1, 0, 0, 0xCEE9, 0xBCBF, 0xB7FC, /* 0x00 */
+ 0xB7A5, 0xD0DD, 0, 0, 0, 0, 0, 0xD6DA, /* 0x10 */
+ 0xD3C5, 0xBBEF, 0xBBE1, 0xD8F1, 0, 0, 0xC9A1, 0xCEB0, /* 0x10 */
+ 0xB4AB, 0, 0xD8F3, 0, 0xC9CB, 0xD8F6, 0xC2D7, 0xD8F7, /* 0x20 */
+ 0, 0, 0xCEB1, 0xD8F9, 0, 0, 0, 0xB2AE, /* 0x20 */
+ 0xB9C0, 0, 0xD9A3, 0, 0xB0E9, 0, 0xC1E6, 0, /* 0x30 */
+ 0xC9EC, 0, 0xCBC5, 0, 0xCBC6, 0xD9A4, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xB5E8, 0, 0, 0xB5AB, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xCEBB, 0xB5CD, 0xD7A1, /* 0x40 */
+ 0xD7F4, 0xD3D3, 0, 0xCCE5, 0, 0xBACE, 0, 0xD9A2, /* 0x50 */
+ 0xD9DC, 0xD3E0, 0xD8FD, 0xB7F0, 0xD7F7, 0xD8FE, 0xD8FA, 0xD9A1, /* 0x50 */
+ 0xC4E3, 0, 0, 0xD3B6, 0xD8F4, 0xD9DD, 0, 0xD8FB, /* 0x60 */
+ 0, 0xC5E5, 0, 0, 0xC0D0, 0, 0, 0xD1F0, /* 0x60 */
+ 0xB0DB, 0, 0, 0xBCD1, 0xD9A6, 0, 0xD9A5, 0, /* 0x70 */
+ 0, 0, 0, 0xD9AC, 0xD9AE, 0, 0xD9AB, 0xCAB9, /* 0x70 */
+ 0, 0, 0, 0xD9A9, 0xD6B6, 0, 0, 0, /* 0x80 */
+ 0xB3DE, 0xD9A8, 0, 0xC0FD, 0, 0xCACC, 0, 0xD9AA, /* 0x80 */
+ 0, 0xD9A7, 0, 0, 0xD9B0, 0, 0, 0xB6B1, /* 0x90 */
+ 0, 0, 0, 0xB9A9, 0, 0xD2C0, 0, 0, /* 0x90 */
+ 0xCFC0, 0, 0, 0xC2C2, 0, 0xBDC4, 0xD5EC, 0xB2E0, /* 0xA0 */
+ 0xC7C8, 0xBFEB, 0xD9AD, 0, 0xD9AF, 0, 0xCEEA, 0xBAEE, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xC7D6, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB1E3, /* 0xB0 */
+ 0, 0, 0, 0xB4D9, 0xB6ED, 0xD9B4, 0, 0, /* 0xC0 */
+ 0, 0, 0xBFA1, 0, 0, 0, 0xD9DE, 0xC7CE, /* 0xC0 */
+ 0xC0FE, 0xD9B8, 0, 0, 0, 0, 0, 0xCBD7, /* 0xD0 */
+ 0xB7FD, 0, 0xD9B5, 0, 0xD9B7, 0xB1A3, 0xD3E1, 0xD9B9, /* 0xD0 */
+ 0, 0xD0C5, 0, 0xD9B6, 0, 0, 0xD9B1, 0, /* 0xE0 */
+ 0xD9B2, 0xC1A9, 0xD9B3, 0, 0, 0xBCF3, 0xD0DE, 0xB8A9, /* 0xE0 */
+ 0, 0xBEE3, 0, 0xD9BD, 0, 0, 0, 0, /* 0xF0 */
+ 0xD9BA, 0, 0xB0B3, 0, 0, 0, 0xD9C2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xD9C4, 0xB1B6, 0, 0xD9BF, /* 0x00 */
+ 0, 0, 0xB5B9, 0, 0xBEF3, 0, 0, 0, /* 0x10 */
+ 0xCCC8, 0xBAF2, 0xD2D0, 0, 0xD9C3, 0, 0, 0xBDE8, /* 0x10 */
+ 0, 0xB3AB, 0, 0, 0, 0xD9C5, 0xBEEB, 0, /* 0x20 */
+ 0xD9C6, 0xD9BB, 0xC4DF, 0, 0xD9BE, 0xD9C1, 0xD9C0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xD5AE, 0, 0xD6B5, 0, 0xC7E3, 0, /* 0x30 */
+ 0, 0, 0, 0xD9C8, 0, 0, 0, 0xBCD9, /* 0x40 */
+ 0xD9CA, 0, 0, 0, 0xD9BC, 0, 0xD9CB, 0xC6AB, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xD9C9, 0, 0, /* 0x50 */
+ 0, 0, 0xD7F6, 0, 0xCDA3, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xBDA1, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xD9CC, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xC5BC, 0xCDB5, /* 0x70 */
+ 0, 0, 0, 0xD9CD, 0, 0, 0xD9C7, 0xB3A5, /* 0x70 */
+ 0xBFFE, 0, 0, 0, 0, 0xB8B5, 0, 0, /* 0x80 */
+ 0xC0FC, 0, 0, 0, 0, 0xB0F8, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xB4F6, 0, 0xD9CE, 0, 0xD9CF, /* 0xA0 */
+ 0xB4A2, 0xD9D0, 0, 0, 0xB4DF, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xB0C1, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xD9D1, 0xC9B5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCFF1, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xD9D2, 0, /* 0xD0 */
+ 0, 0, 0xC1C5, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xD9D6, 0xC9AE, /* 0xE0 */
+ 0, 0, 0, 0, 0xD9D5, 0xD9D4, 0xD9D7, 0, /* 0xE0 */
+ 0, 0, 0, 0xCBDB, 0, 0xBDA9, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xC6A7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD9D3, 0xD9D8, /* 0x00 */
+ 0, 0, 0, 0xD9D9, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xC8E5, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xC0DC, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB6F9, /* 0x30 */
+ 0xD8A3, 0xD4CA, 0, 0xD4AA, 0xD0D6, 0xB3E4, 0xD5D7, 0, /* 0x40 */
+ 0xCFC8, 0xB9E2, 0, 0xBFCB, 0, 0xC3E2, 0, 0, /* 0x40 */
+ 0, 0xB6D2, 0, 0, 0xCDC3, 0xD9EE, 0xD9F0, 0, /* 0x50 */
+ 0, 0, 0xB5B3, 0, 0xB6B5, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xBEA4, 0, 0, 0xC8EB, 0, 0, /* 0x60 */
+ 0xC8AB, 0, 0, 0xB0CB, 0xB9AB, 0xC1F9, 0xD9E2, 0, /* 0x60 */
+ 0xC0BC, 0xB9B2, 0, 0xB9D8, 0xD0CB, 0xB1F8, 0xC6E4, 0xBEDF, /* 0x70 */
+ 0xB5E4, 0xD7C8, 0, 0xD1F8, 0xBCE6, 0xCADE, 0, 0, /* 0x70 */
+ 0xBCBD, 0xD9E6, 0xD8E7, 0, 0, 0xC4DA, 0, 0, /* 0x80 */
+ 0xB8D4, 0xC8BD, 0, 0, 0xB2E1, 0xD4D9, 0, 0, /* 0x80 */
+ 0, 0, 0xC3B0, 0, 0, 0xC3E1, 0xDAA2, 0xC8DF, /* 0x90 */
+ 0, 0xD0B4, 0, 0xBEFC, 0xC5A9, 0, 0, 0, /* 0x90 */
+ 0xB9DA, 0, 0xDAA3, 0, 0xD4A9, 0xDAA4, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xD9FB, 0xB6AC, 0, 0, 0xB7EB, /* 0xA0 */
+ 0xB1F9, 0xD9FC, 0xB3E5, 0xBEF6, 0, 0xBFF6, 0xD2B1, 0xC0E4, /* 0xB0 */
+ 0, 0, 0, 0xB6B3, 0xD9FE, 0xD9FD, 0, 0, /* 0xB0 */
+ 0xBEBB, 0, 0, 0, 0xC6E0, 0, 0xD7BC, 0xDAA1, /* 0xC0 */
+ 0, 0xC1B9, 0, 0xB5F2, 0xC1E8, 0, 0, 0xBCF5, /* 0xC0 */
+ 0, 0xB4D5, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xC1DD, 0, 0xC4FD, 0, 0, /* 0xD0 */
+ 0xBCB8, 0xB7B2, 0, 0, 0xB7EF, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xD9EC, 0, 0xC6BE, 0, 0xBFAD, /* 0xE0 */
+ 0xBBCB, 0, 0, 0xB5CA, 0, 0xDBC9, 0xD0D7, 0, /* 0xF0 */
+ 0xCDB9, 0xB0BC, 0xB3F6, 0xBBF7, 0xDBCA, 0xBAAF, 0, 0xD4E4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB5B6, 0xB5F3, 0xD8D6, 0xC8D0, 0, 0, 0xB7D6, 0xC7D0, /* 0x00 */
+ 0xD8D7, 0, 0xBFAF, 0, 0, 0xDBBB, 0xD8D8, 0, /* 0x00 */
+ 0, 0xD0CC, 0xBBAE, 0, 0, 0, 0xEBBE, 0xC1D0, /* 0x10 */
+ 0xC1F5, 0xD4F2, 0xB8D5, 0xB4B4, 0, 0xB3F5, 0, 0, /* 0x10 */
+ 0xC9BE, 0, 0, 0, 0xC5D0, 0, 0, 0, /* 0x20 */
+ 0xC5D9, 0xC0FB, 0, 0xB1F0, 0, 0xD8D9, 0xB9CE, 0, /* 0x20 */
+ 0xB5BD, 0, 0, 0xD8DA, 0, 0, 0xD6C6, 0xCBA2, /* 0x30 */
+ 0xC8AF, 0xC9B2, 0xB4CC, 0xBFCC, 0, 0xB9F4, 0, 0xD8DB, /* 0x30 */
+ 0xD8DC, 0xB6E7, 0xBCC1, 0xCCEA, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xCFF7, 0, 0xD8DD, 0xC7B0, 0, 0, /* 0x40 */
+ 0xB9D0, 0xBDA3, 0, 0, 0xCCDE, 0, 0xC6CA, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xD8E0, 0, 0xD8DE, 0, /* 0x50 */
+ 0, 0xD8DF, 0, 0, 0, 0xB0FE, 0, 0xBEE7, /* 0x60 */
+ 0, 0xCAA3, 0xBCF4, 0, 0, 0, 0, 0xB8B1, /* 0x60 */
+ 0, 0, 0xB8EE, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xD8E2, 0, 0xBDCB, /* 0x70 */
+ 0, 0xD8E4, 0xD8E3, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xC5FC, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xD8E5, 0, 0, 0xD8E6, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xC1A6, 0, 0xC8B0, 0xB0EC, 0xB9A6, /* 0x90 */
+ 0xBCD3, 0xCEF1, 0xDBBD, 0xC1D3, 0, 0, 0, 0, /* 0xA0 */
+ 0xB6AF, 0xD6FA, 0xC5AC, 0xBDD9, 0xDBBE, 0xDBBF, 0, 0, /* 0xA0 */
+ 0, 0xC0F8, 0xBEA2, 0xC0CD, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xDBC0, 0xCAC6, /* 0xB0 */
+ 0, 0, 0, 0xB2AA, 0, 0, 0, 0xD3C2, /* 0xC0 */
+ 0, 0xC3E3, 0, 0xD1AB, 0, 0, 0, 0, /* 0xC0 */
+ 0xDBC2, 0, 0xC0D5, 0, 0, 0, 0xDBC3, 0, /* 0xD0 */
+ 0xBFB1, 0, 0, 0, 0, 0, 0, 0xC4BC, /* 0xD0 */
+ 0, 0, 0, 0, 0xC7DA, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xDBC4, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xD9E8, 0xC9D7, 0, 0, 0, 0xB9B4, 0xCEF0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD4C8, 0, 0, 0, 0, 0xB0FC, 0xB4D2, 0, /* 0x00 */
+ 0xD0D9, 0, 0, 0, 0, 0xD9E9, 0, 0xDECB, /* 0x00 */
+ 0xD9EB, 0, 0, 0, 0, 0xD8B0, 0xBBAF, 0xB1B1, /* 0x10 */
+ 0, 0xB3D7, 0xD8CE, 0, 0, 0xD4D1, 0, 0, /* 0x10 */
+ 0xBDB3, 0xBFEF, 0, 0xCFBB, 0, 0, 0xD8D0, 0, /* 0x20 */
+ 0, 0, 0xB7CB, 0, 0, 0, 0xD8D1, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xC6A5, 0xC7F8, 0xD2BD, 0, 0, 0xD8D2, 0xC4E4, /* 0x30 */
+ 0, 0xCAAE, 0, 0xC7A7, 0, 0xD8A6, 0, 0xC9FD, /* 0x40 */
+ 0xCEE7, 0xBBDC, 0xB0EB, 0, 0, 0, 0xBBAA, 0xD0AD, /* 0x40 */
+ 0, 0xB1B0, 0xD7E4, 0xD7BF, 0, 0xB5A5, 0xC2F4, 0xC4CF, /* 0x50 */
+ 0, 0, 0xB2A9, 0, 0xB2B7, 0, 0xB1E5, 0xDFB2, /* 0x50 */
+ 0xD5BC, 0xBFA8, 0xC2AC, 0xD8D5, 0xC2B1, 0, 0xD8D4, 0xCED4, /* 0x60 */
+ 0, 0xDAE0, 0, 0xCEC0, 0, 0, 0xD8B4, 0xC3AE, /* 0x60 */
+ 0xD3A1, 0xCEA3, 0, 0xBCB4, 0xC8B4, 0xC2D1, 0, 0xBEED, /* 0x70 */
+ 0xD0B6, 0, 0xDAE1, 0, 0, 0, 0, 0xC7E4, /* 0x70 */
+ 0, 0, 0xB3A7, 0, 0xB6F2, 0xCCFC, 0xC0FA, 0, /* 0x80 */
+ 0, 0xC0F7, 0, 0xD1B9, 0xD1E1, 0xD8C7, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xB2DE, 0, 0, /* 0x90 */
+ 0xC0E5, 0, 0xBAF1, 0, 0, 0xD8C8, 0, 0xD4AD, /* 0x90 */
+ 0, 0, 0xCFE1, 0xD8C9, 0, 0xD8CA, 0xCFC3, 0, /* 0xA0 */
+ 0xB3F8, 0xBEC7, 0, 0, 0, 0, 0xD8CB, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xDBCC, 0, /* 0xB0 */
+ 0, 0, 0, 0xC8A5, 0, 0, 0, 0xCFD8, /* 0xB0 */
+ 0, 0xC8FE, 0xB2CE, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xD3D6, 0xB2E6, 0xBCB0, 0xD3D1, 0xCBAB, 0xB7B4, 0, 0, /* 0xC0 */
+ 0, 0xB7A2, 0, 0, 0xCAE5, 0, 0xC8A1, 0xCADC, /* 0xD0 */
+ 0xB1E4, 0xD0F0, 0, 0xC5D1, 0, 0, 0, 0xDBC5, /* 0xD0 */
+ 0xB5FE, 0, 0, 0xBFDA, 0xB9C5, 0xBEE4, 0xC1ED, 0, /* 0xE0 */
+ 0xDFB6, 0xDFB5, 0xD6BB, 0xBDD0, 0xD5D9, 0xB0C8, 0xB6A3, 0xBFC9, /* 0xE0 */
+ 0xCCA8, 0xDFB3, 0xCAB7, 0xD3D2, 0, 0xD8CF, 0xD2B6, 0xBAC5, /* 0xF0 */
+ 0xCBBE, 0xCCBE, 0, 0xDFB7, 0xB5F0, 0xDFB4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD3F5, 0, 0xB3D4, 0xB8F7, 0, 0xDFBA, 0, /* 0x00 */
+ 0xBACF, 0xBCAA, 0xB5F5, 0, 0xCDAC, 0xC3FB, 0xBAF3, 0xC0F4, /* 0x00 */
+ 0xCDC2, 0xCFF2, 0xDFB8, 0xCFC5, 0, 0xC2C0, 0xDFB9, 0xC2F0, /* 0x10 */
+ 0, 0, 0, 0xBEFD, 0, 0xC1DF, 0xCDCC, 0xD2F7, /* 0x10 */
+ 0xB7CD, 0xDFC1, 0, 0xDFC4, 0, 0, 0xB7F1, 0xB0C9, /* 0x20 */
+ 0xB6D6, 0xB7D4, 0, 0xBAAC, 0xCCFD, 0xBFD4, 0xCBB1, 0xC6F4, /* 0x20 */
+ 0, 0xD6A8, 0xDFC5, 0, 0xCEE2, 0xB3B3, 0, 0, /* 0x30 */
+ 0xCEFC, 0xB4B5, 0, 0xCEC7, 0xBAF0, 0, 0xCEE1, 0, /* 0x30 */
+ 0xD1BD, 0, 0, 0xDFC0, 0, 0, 0xB4F4, 0, /* 0x40 */
+ 0xB3CA, 0, 0xB8E6, 0xDFBB, 0, 0, 0, 0, /* 0x40 */
+ 0xC4C5, 0, 0xDFBC, 0xDFBD, 0xDFBE, 0xC5BB, 0xDFBF, 0xDFC2, /* 0x50 */
+ 0xD4B1, 0xDFC3, 0, 0xC7BA, 0xCED8, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xC4D8, 0, 0xDFCA, 0, 0xDFCF, 0, /* 0x60 */
+ 0xD6DC, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xDFC9, 0xDFDA, 0xCEB6, 0, 0xBAC7, 0xDFCE, 0xDFC8, /* 0x70 */
+ 0xC5DE, 0, 0, 0xC9EB, 0xBAF4, 0xC3FC, 0, 0, /* 0x70 */
+ 0xBED7, 0, 0xDFC6, 0, 0xDFCD, 0, 0xC5D8, 0, /* 0x80 */
+ 0, 0, 0, 0xD5A6, 0xBACD, 0, 0xBECC, 0xD3BD, /* 0x80 */
+ 0xB8C0, 0, 0xD6E4, 0, 0xDFC7, 0xB9BE, 0xBFA7, 0, /* 0x90 */
+ 0, 0xC1FC, 0xDFCB, 0xDFCC, 0, 0xDFD0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xDFDB, 0xDFE5, 0, 0xDFD7, 0xDFD6, /* 0xA0 */
+ 0xD7C9, 0xDFE3, 0xDFE4, 0xE5EB, 0xD2A7, 0xDFD2, 0, 0xBFA9, /* 0xA0 */
+ 0, 0xD4DB, 0, 0xBFC8, 0xDFD4, 0, 0, 0, /* 0xB0 */
+ 0xCFCC, 0, 0, 0xDFDD, 0, 0xD1CA, 0, 0xDFDE, /* 0xB0 */
+ 0xB0A7, 0xC6B7, 0xDFD3, 0, 0xBAE5, 0, 0xB6DF, 0xCDDB, /* 0xC0 */
+ 0xB9FE, 0xD4D5, 0, 0, 0xDFDF, 0xCFEC, 0xB0A5, 0xDFE7, /* 0xC0 */
+ 0xDFD1, 0xD1C6, 0xDFD5, 0xDFD8, 0xDFD9, 0xDFDC, 0, 0xBBA9, /* 0xD0 */
+ 0, 0xDFE0, 0xDFE1, 0, 0xDFE2, 0xDFE6, 0xDFE8, 0xD3B4, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xB8E7, 0xC5B6, 0xDFEA, /* 0xE0 */
+ 0xC9DA, 0xC1A8, 0xC4C4, 0, 0, 0xBFDE, 0xCFF8, 0, /* 0xE0 */
+ 0, 0, 0xD5DC, 0xDFEE, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xB2B8, 0, 0xBADF, 0xDFEC, 0, 0xDBC1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1E4, 0, 0, 0, 0, 0xCBF4, 0xB4BD, /* 0x00 */
+ 0, 0xB0A6, 0, 0, 0, 0, 0, 0xDFF1, /* 0x00 */
+ 0xCCC6, 0xDFF2, 0, 0, 0xDFED, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xDFE9, 0, 0, 0, 0, /* 0x10 */
+ 0xDFEB, 0, 0xDFEF, 0xDFF0, 0xBBBD, 0, 0, 0xDFF3, /* 0x20 */
+ 0, 0, 0xDFF4, 0, 0xBBA3, 0, 0xCADB, 0xCEA8, /* 0x20 */
+ 0xE0A7, 0xB3AA, 0, 0xE0A6, 0, 0, 0, 0xE0A1, /* 0x30 */
+ 0, 0, 0, 0, 0xDFFE, 0, 0xCDD9, 0xDFFC, /* 0x30 */
+ 0, 0xDFFA, 0, 0xBFD0, 0xD7C4, 0, 0xC9CC, 0, /* 0x40 */
+ 0, 0xDFF8, 0xB0A1, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xDFFD, 0, 0, 0, 0, 0xDFFB, 0xE0A2, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xE0A8, 0, 0, 0, /* 0x50 */
+ 0, 0xB7C8, 0, 0, 0xC6A1, 0xC9B6, 0xC0B2, 0xDFF5, /* 0x60 */
+ 0, 0, 0xC5BE, 0, 0xD8C4, 0xDFF9, 0xC4F6, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE0A3, 0xE0A4, 0xE0A5, /* 0x70 */
+ 0xD0A5, 0, 0, 0xE0B4, 0xCCE4, 0, 0xE0B1, 0, /* 0x70 */
+ 0xBFA6, 0xE0AF, 0xCEB9, 0xE0AB, 0xC9C6, 0, 0, 0xC0AE, /* 0x80 */
+ 0xE0AE, 0xBAED, 0xBAB0, 0xE0A9, 0, 0, 0, 0xDFF6, /* 0x80 */
+ 0, 0xE0B3, 0, 0, 0xE0B8, 0, 0, 0, /* 0x90 */
+ 0xB4AD, 0xE0B9, 0, 0, 0xCFB2, 0xBAC8, 0, 0xE0B0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD0FA, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE0AC, 0, 0xD4FB, 0, 0xDFF7, 0, 0xC5E7, /* 0xB0 */
+ 0, 0xE0AD, 0, 0xD3F7, 0, 0xE0B6, 0xE0B7, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE0C4, 0xD0E1, 0, 0, /* 0xC0 */
+ 0, 0xE0BC, 0, 0, 0xE0C9, 0xE0CA, 0, 0, /* 0xC0 */
+ 0, 0xE0BE, 0xE0AA, 0xC9A4, 0xE0C1, 0, 0xE0B2, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xCAC8, 0xE0C3, 0, 0xE0B5, /* 0xD0 */
+ 0, 0xCECB, 0, 0xCBC3, 0xE0CD, 0xE0C6, 0xE0C2, 0, /* 0xE0 */
+ 0xE0CB, 0, 0xE0BA, 0xE0BF, 0xE0C0, 0, 0, 0xE0C5, /* 0xE0 */
+ 0, 0, 0xE0C7, 0xE0C8, 0, 0xE0CC, 0, 0xE0BB, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xCBD4, 0xE0D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE0D6, 0xE0D2, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xE0D0, 0xBCCE, 0, 0, 0xE0D1, 0, 0xB8C2, 0xD8C5, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xD0EA, 0, 0, 0xC2EF, 0, 0, 0xE0CF, 0xE0BD, /* 0x10 */
+ 0, 0, 0, 0xE0D4, 0xE0D3, 0, 0, 0xE0D7, /* 0x20 */
+ 0, 0, 0, 0, 0xE0DC, 0xE0D8, 0, 0, /* 0x20 */
+ 0, 0xD6F6, 0xB3B0, 0, 0xD7EC, 0, 0xCBBB, 0, /* 0x30 */
+ 0, 0xE0DA, 0, 0xCEFB, 0, 0, 0, 0xBAD9, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE0E1, 0xE0DD, 0xD2AD, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE0E2, 0, 0, 0xE0DB, /* 0x50 */
+ 0xE0D9, 0xE0DF, 0, 0, 0xE0E0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE0DE, 0, 0xE0E4, 0, 0, 0, /* 0x60 */
+ 0xC6F7, 0xD8AC, 0xD4EB, 0xE0E6, 0xCAC9, 0, 0, 0, /* 0x60 */
+ 0, 0xE0E5, 0, 0, 0, 0, 0xB8C1, 0, /* 0x70 */
+ 0, 0, 0, 0xE0E7, 0xE0E8, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE0E9, 0xE0E3, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xBABF, 0xCCE7, /* 0x80 */
+ 0, 0, 0, 0xE0EA, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xCFF9, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE0EB, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC8C2, /* 0xB0 */
+ 0, 0, 0, 0, 0xBDC0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xC4D2, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE0EC, 0, 0, 0xE0ED, /* 0xD0 */
+ 0, 0, 0xC7F4, 0xCBC4, 0, 0xE0EE, 0xBBD8, 0xD8B6, /* 0xD0 */
+ 0xD2F2, 0xE0EF, 0xCDC5, 0, 0xB6DA, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE0F1, 0, 0xD4B0, 0, 0, /* 0xE0 */
+ 0xC0A7, 0xB4D1, 0, 0, 0xCEA7, 0xE0F0, 0, 0, /* 0xF0 */
+ 0, 0xE0F2, 0xB9CC, 0, 0, 0xB9FA, 0xCDBC, 0xE0F3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6D4, 0xE0F4, 0, 0xD4B2, 0, /* 0x00 */
+ 0xC8A6, 0xE0F6, 0xE0F5, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xE0F7, 0, 0, 0xCDC1, /* 0x10 */
+ 0, 0, 0, 0xCAA5, 0, 0, 0, 0, /* 0x20 */
+ 0xD4DA, 0xDBD7, 0xDBD9, 0, 0xDBD8, 0xB9E7, 0xDBDC, 0xDBDD, /* 0x20 */
+ 0xB5D8, 0, 0, 0xDBDA, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xDBDB, 0xB3A1, 0xDBDF, 0, 0, 0xBBF8, 0, /* 0x30 */
+ 0xD6B7, 0, 0xDBE0, 0, 0, 0, 0, 0xBEF9, /* 0x40 */
+ 0, 0, 0xB7BB, 0, 0xDBD0, 0xCCAE, 0xBFB2, 0xBBB5, /* 0x40 */
+ 0xD7F8, 0xBFD3, 0, 0, 0, 0, 0, 0xBFE9, /* 0x50 */
+ 0, 0, 0xBCE1, 0xCCB3, 0xDBDE, 0xB0D3, 0xCEEB, 0xB7D8, /* 0x50 */
+ 0xD7B9, 0xC6C2, 0, 0, 0xC0A4, 0, 0xCCB9, 0, /* 0x60 */
+ 0xDBE7, 0xDBE1, 0xC6BA, 0xDBE3, 0, 0xDBE8, 0, 0xC5F7, /* 0x60 */
+ 0, 0, 0, 0xDBEA, 0, 0, 0xDBE9, 0xBFC0, /* 0x70 */
+ 0, 0, 0, 0xDBE6, 0xDBE5, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xB4B9, 0xC0AC, 0xC2A2, 0xDBE2, 0xDBE4, 0, /* 0x80 */
+ 0, 0, 0, 0xD0CD, 0xDBED, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xC0DD, 0xDBF2, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xB6E2, 0, 0, 0, 0, /* 0x90 */
+ 0xDBF3, 0xDBD2, 0xB9B8, 0xD4AB, 0xDBEC, 0, 0xBFD1, 0xDBF0, /* 0xA0 */
+ 0, 0xDBD1, 0, 0xB5E6, 0, 0xDBEB, 0xBFE5, 0, /* 0xA0 */
+ 0, 0, 0xDBEE, 0, 0xDBF1, 0, 0, 0, /* 0xB0 */
+ 0xDBF9, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xB9A1, 0xB0A3, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xC2F1, 0, 0, 0xB3C7, 0xDBEF, /* 0xC0 */
+ 0, 0, 0xDBF8, 0, 0xC6D2, 0xDBF4, 0, 0, /* 0xD0 */
+ 0xDBF5, 0xDBF7, 0xDBF6, 0, 0, 0xDBFE, 0, 0xD3F2, /* 0xD0 */
+ 0xB2BA, 0, 0, 0, 0xDBFD, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xDCA4, 0, 0xDBFB, /* 0xE0 */
+ 0, 0, 0, 0, 0xDBFA, 0, 0, 0, /* 0xF0 */
+ 0xDBFC, 0xC5E0, 0xBBF9, 0, 0, 0xDCA3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCA5, 0, 0xCCC3, 0, 0, 0, 0xB6D1, 0xDDC0, /* 0x00 */
+ 0, 0, 0, 0xDCA1, 0, 0xDCA2, 0, 0, /* 0x00 */
+ 0, 0xC7B5, 0, 0, 0, 0xB6E9, 0, 0, /* 0x10 */
+ 0, 0xDCA7, 0, 0, 0, 0, 0xDCA6, 0, /* 0x10 */
+ 0xDCA9, 0xB1A4, 0, 0, 0xB5CC, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xBFB0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xD1DF, 0, 0, 0, 0, 0xB6C2, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xDCA8, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xCBFA, 0xEBF3, 0, 0, /* 0x40 */
+ 0, 0xCBDC, 0, 0, 0xCBFE, 0, 0, 0, /* 0x50 */
+ 0xCCC1, 0, 0, 0, 0, 0, 0xC8FB, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xDCAA, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xCCEE, 0xDCAB, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xDBD3, 0, /* 0x70 */
+ 0xDCAF, 0xDCAC, 0, 0xBEB3, 0, 0xCAFB, 0, 0, /* 0x80 */
+ 0, 0xDCAD, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xC9CA, 0xC4B9, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xC7BD, 0xDCAE, 0, 0, 0, 0xD4F6, 0xD0E6, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xC4AB, 0xB6D5, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xDBD4, 0, 0, 0, /* 0xB0 */
+ 0, 0xB1DA, 0, 0, 0, 0xDBD5, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xDBD6, 0, 0, 0, 0xBABE, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xC8C0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xCABF, 0xC8C9, 0, 0xD7B3, 0, /* 0xE0 */
+ 0xC9F9, 0, 0, 0xBFC7, 0, 0, 0xBAF8, 0, /* 0xF0 */
+ 0, 0xD2BC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2BA, 0, 0xB4A6, 0, 0, 0xB1B8, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xB8B4, 0, 0xCFC4, /* 0x00 */
+ 0, 0, 0, 0, 0xD9E7, 0xCFA6, 0xCDE2, 0, /* 0x10 */
+ 0, 0xD9ED, 0xB6E0, 0, 0xD2B9, 0, 0, 0xB9BB, /* 0x10 */
+ 0, 0, 0, 0, 0xE2B9, 0xE2B7, 0, 0xB4F3, /* 0x20 */
+ 0, 0xCCEC, 0xCCAB, 0xB7F2, 0, 0xD8B2, 0xD1EB, 0xBABB, /* 0x20 */
+ 0, 0xCAA7, 0, 0, 0xCDB7, 0, 0, 0xD2C4, /* 0x30 */
+ 0xBFE4, 0xBCD0, 0xB6E1, 0, 0xDEC5, 0, 0, 0, /* 0x30 */
+ 0, 0xDEC6, 0xDBBC, 0, 0xD1D9, 0, 0, 0xC6E6, /* 0x40 */
+ 0xC4CE, 0xB7EE, 0, 0xB7DC, 0, 0, 0xBFFC, 0xD7E0, /* 0x40 */
+ 0, 0xC6F5, 0, 0, 0xB1BC, 0xDEC8, 0xBDB1, 0xCCD7, /* 0x50 */
+ 0xDECA, 0, 0xDEC9, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xB5EC, 0, 0xC9DD, 0, 0, 0xB0C2, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xC5AE, 0xC5AB, 0, 0xC4CC, 0, /* 0x70 */
+ 0xBCE9, 0xCBFD, 0, 0, 0, 0xBAC3, 0, 0, /* 0x70 */
+ 0, 0xE5F9, 0xC8E7, 0xE5FA, 0xCDFD, 0, 0xD7B1, 0xB8BE, /* 0x80 */
+ 0xC2E8, 0, 0xC8D1, 0, 0, 0xE5FB, 0, 0, /* 0x80 */
+ 0, 0, 0xB6CA, 0xBCCB, 0, 0, 0xD1FD, 0xE6A1, /* 0x90 */
+ 0, 0xC3EE, 0, 0, 0, 0, 0xE6A4, 0, /* 0x90 */
+ 0, 0, 0, 0xE5FE, 0xE6A5, 0xCDD7, 0, 0, /* 0xA0 */
+ 0xB7C1, 0xE5FC, 0xE5FD, 0xE6A3, 0, 0, 0xC4DD, 0xE6A8, /* 0xA0 */
+ 0, 0, 0xE6A7, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xC3C3, 0, 0xC6DE, 0, 0, 0xE6AA, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xC4B7, 0, /* 0xC0 */
+ 0, 0, 0xE6A2, 0xCABC, 0, 0, 0, 0, /* 0xC0 */
+ 0xBDE3, 0xB9C3, 0xE6A6, 0xD0D5, 0xCEAF, 0, 0, 0xE6A9, /* 0xD0 */
+ 0xE6B0, 0, 0xD2A6, 0, 0xBDAA, 0xE6AD, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xE6AF, 0, 0xC0D1, 0, 0, /* 0xE0 */
+ 0xD2CC, 0, 0, 0, 0xBCA7, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xE6B1, 0, 0xD2F6, 0, 0, 0, 0xD7CB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDFE, 0, 0xCDDE, 0xC2A6, 0xE6AB, 0xE6AC, 0xBDBF, /* 0x00 */
+ 0xE6AE, 0xE6B3, 0, 0, 0xE6B2, 0, 0, 0, /* 0x00 */
+ 0, 0xE6B6, 0, 0xE6B8, 0, 0, 0, 0, /* 0x10 */
+ 0xC4EF, 0, 0, 0, 0xC4C8, 0, 0, 0xBEEA, /* 0x10 */
+ 0xC9EF, 0, 0, 0xE6B7, 0, 0xB6F0, 0, 0, /* 0x20 */
+ 0, 0xC3E4, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xD3E9, 0xE6B4, 0, 0xE6B5, 0, 0xC8A2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE6BD, 0, 0, 0, /* 0x30 */
+ 0xE6B9, 0, 0, 0, 0, 0, 0xC6C5, 0, /* 0x40 */
+ 0, 0xCDF1, 0xE6BB, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE6BC, 0, 0, /* 0x50 */
+ 0, 0, 0xBBE9, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE6BE, 0, 0, 0, 0, 0xE6BA, /* 0x60 */
+ 0, 0, 0xC0B7, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xD3A4, 0xE6BF, 0xC9F4, 0xE6C3, /* 0x70 */
+ 0, 0, 0xE6C4, 0, 0, 0, 0, 0xD0F6, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xC3BD, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xC3C4, 0xE6C2, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE6C1, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE6C7, 0xCFB1, 0, 0xEBF4, 0, 0, /* 0xB0 */
+ 0xE6CA, 0, 0, 0, 0, 0, 0xE6C5, 0, /* 0xB0 */
+ 0, 0xBCDE, 0xC9A9, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xBCB5, 0, 0, 0xCFD3, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE6C8, 0, 0xE6C9, 0, 0xE6CE, 0, /* 0xD0 */
+ 0xE6D0, 0, 0, 0, 0xE6D1, 0, 0, 0, /* 0xD0 */
+ 0xE6CB, 0xB5D5, 0, 0xE6CC, 0, 0, 0xE6CF, 0, /* 0xE0 */
+ 0, 0xC4DB, 0, 0xE6C6, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xE6CD /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xE6D2, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE6D4, 0xE6D3, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE6D5, 0, 0xD9F8, 0, 0, 0xE6D6, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE6D7, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xD7D3, 0xE6DD, 0, 0xE6DE, 0xBFD7, 0xD4D0, 0, 0xD7D6, /* 0x50 */
+ 0xB4E6, 0xCBEF, 0xE6DA, 0xD8C3, 0xD7CE, 0xD0A2, 0, 0xC3CF, /* 0x50 */
+ 0, 0, 0xE6DF, 0xBCBE, 0xB9C2, 0xE6DB, 0xD1A7, 0, /* 0x60 */
+ 0, 0xBAA2, 0xC2CF, 0, 0xD8AB, 0, 0, 0, /* 0x60 */
+ 0xCAEB, 0xE5EE, 0, 0xE6DC, 0, 0xB7F5, 0, 0, /* 0x70 */
+ 0, 0, 0xC8E6, 0, 0, 0xC4F5, 0, 0, /* 0x70 */
+ 0xE5B2, 0xC4FE, 0, 0xCBFC, 0xE5B3, 0xD5AC, 0, 0xD3EE, /* 0x80 */
+ 0xCAD8, 0xB0B2, 0, 0xCBCE, 0xCDEA, 0, 0, 0xBAEA, /* 0x80 */
+ 0, 0, 0, 0xE5B5, 0, 0xE5B4, 0, 0xD7DA, /* 0x90 */
+ 0xB9D9, 0xD6E6, 0xB6A8, 0xCDF0, 0xD2CB, 0xB1A6, 0xCAB5, 0, /* 0x90 */
+ 0xB3E8, 0xC9F3, 0xBFCD, 0xD0FB, 0xCAD2, 0xE5B6, 0xBBC2, 0, /* 0xA0 */
+ 0, 0, 0xCFDC, 0xB9AC, 0, 0, 0, 0, /* 0xA0 */
+ 0xD4D7, 0, 0, 0xBAA6, 0xD1E7, 0xCFFC, 0xBCD2, 0, /* 0xB0 */
+ 0xE5B7, 0xC8DD, 0, 0, 0, 0xBFED, 0xB1F6, 0xCBDE, /* 0xB0 */
+ 0, 0, 0xBCC5, 0, 0xBCC4, 0xD2FA, 0xC3DC, 0xBFDC, /* 0xC0 */
+ 0, 0, 0, 0, 0xB8BB, 0, 0, 0, /* 0xC0 */
+ 0xC3C2, 0, 0xBAAE, 0xD4A2, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xC7DE, 0xC4AF, 0xB2EC, /* 0xD0 */
+ 0, 0xB9D1, 0, 0, 0xE5BB, 0xC1C8, 0, 0, /* 0xE0 */
+ 0xD5AF, 0, 0, 0, 0, 0, 0xE5BC, 0, /* 0xE0 */
+ 0xE5BE, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xB4E7, 0xB6D4, 0xCBC2, 0xD1B0, 0xB5BC, 0, 0, 0xCAD9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB7E2, 0, 0, 0xC9E4, 0, 0xBDAB, 0, /* 0x00 */
+ 0, 0xCEBE, 0xD7F0, 0, 0, 0, 0, 0xD0A1, /* 0x00 */
+ 0, 0xC9D9, 0, 0, 0xB6FB, 0xE6D8, 0xBCE2, 0, /* 0x10 */
+ 0xB3BE, 0, 0xC9D0, 0, 0xE6D9, 0xB3A2, 0, 0, /* 0x10 */
+ 0, 0, 0xDECC, 0, 0xD3C8, 0xDECD, 0, 0xD2A2, /* 0x20 */
+ 0, 0, 0, 0, 0xDECE, 0, 0, 0, /* 0x20 */
+ 0, 0xBECD, 0, 0, 0xDECF, 0, 0, 0, /* 0x30 */
+ 0xCAAC, 0xD2FC, 0xB3DF, 0xE5EA, 0xC4E1, 0xBEA1, 0xCEB2, 0xC4F2, /* 0x30 */
+ 0xBED6, 0xC6A8, 0xB2E3, 0, 0, 0xBED3, 0, 0, /* 0x40 */
+ 0xC7FC, 0xCCEB, 0xBDEC, 0xCEDD, 0, 0, 0xCABA, 0xC6C1, /* 0x40 */
+ 0xE5EC, 0xD0BC, 0, 0, 0, 0xD5B9, 0, 0, /* 0x50 */
+ 0, 0xE5ED, 0, 0, 0, 0, 0xCAF4, 0, /* 0x50 */
+ 0xCDC0, 0xC2C5, 0, 0xE5EF, 0, 0xC2C4, 0xE5F0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xE5F8, 0xCDCD, /* 0x60 */
+ 0, 0xC9BD, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD2D9, 0xE1A8, 0, 0, 0, 0, 0xD3EC, /* 0x70 */
+ 0, 0xCBEA, 0xC6F1, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE1AC, 0, 0, 0, 0xE1A7, 0xE1A9, 0, 0, /* 0x80 */
+ 0xE1AA, 0xE1AF, 0, 0, 0xB2ED, 0, 0xE1AB, 0xB8DA, /* 0x90 */
+ 0xE1AD, 0xE1AE, 0xE1B0, 0xB5BA, 0xE1B1, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xE1B3, 0xE1B8, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xD1D2, 0, 0xE1B6, 0xE1B5, 0xC1EB, 0, 0, /* 0xA0 */
+ 0, 0xE1B7, 0, 0xD4C0, 0, 0xE1B2, 0, 0xE1BA, /* 0xB0 */
+ 0xB0B6, 0, 0, 0, 0, 0xE1B4, 0, 0xBFF9, /* 0xB0 */
+ 0, 0xE1B9, 0, 0, 0xE1BB, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE1BE, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE1BC, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xD6C5, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xCFBF, 0, 0, 0xE1BD, 0xE1BF, 0xC2CD, 0, /* 0xE0 */
+ 0xB6EB, 0, 0xD3F8, 0, 0, 0xC7CD, 0, 0, /* 0xE0 */
+ 0xB7E5, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xBEFE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1C0, 0xE1C1, 0, 0, 0xE1C7, 0xB3E7, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xC6E9, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xB4DE, 0, 0xD1C2, 0, /* 0x10 */
+ 0, 0, 0, 0xE1C8, 0, 0, 0xE1C6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xE1C5, 0, 0xE1C3, 0xE1C2, /* 0x20 */
+ 0, 0xB1C0, 0, 0, 0, 0xD5B8, 0xE1C4, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE1CB, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE1CC, 0xE1CA, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEFFA, /* 0x40 */
+ 0, 0, 0xE1D3, 0xE1D2, 0xC7B6, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE1C9, 0, 0, 0xE1CE, 0, 0xE1D0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE1D4, 0, 0xE1D1, 0xE1CD, 0, 0, 0xE1CF, /* 0x60 */
+ 0, 0, 0, 0, 0xE1D5, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE1D6, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE1D7, 0, 0, 0, 0xE1D8, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1DA, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xE1DB, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xCEA1, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xE7DD, 0, 0xB4A8, 0xD6DD, 0, /* 0xD0 */
+ 0, 0xD1B2, 0xB3B2, 0, 0, 0xB9A4, 0xD7F3, 0xC7C9, /* 0xE0 */
+ 0xBEDE, 0xB9AE, 0, 0xCED7, 0, 0, 0xB2EE, 0xDBCF, /* 0xE0 */
+ 0, 0xBCBA, 0xD2D1, 0xCBC8, 0xB0CD, 0, 0, 0xCFEF, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xD9E3, 0xBDED /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB1D2, 0xCAD0, 0xB2BC, 0, 0xCBA7, 0xB7AB, 0, /* 0x00 */
+ 0xCAA6, 0, 0, 0, 0xCFA3, 0, 0, 0xE0F8, /* 0x00 */
+ 0xD5CA, 0xE0FB, 0, 0, 0xE0FA, 0xC5C1, 0xCCFB, 0, /* 0x10 */
+ 0xC1B1, 0xE0F9, 0xD6E3, 0xB2AF, 0xD6C4, 0xB5DB, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xB4F8, 0xD6A1, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xCFAF, 0xB0EF, 0, /* 0x20 */
+ 0, 0xE0FC, 0, 0, 0, 0, 0, 0xE1A1, /* 0x30 */
+ 0xB3A3, 0, 0, 0xE0FD, 0xE0FE, 0xC3B1, 0, 0, /* 0x30 */
+ 0, 0, 0xC3DD, 0, 0xE1A2, 0xB7F9, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xBBCF, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE1A3, 0xC4BB, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE1A4, 0, 0, 0xE1A5, 0, /* 0x50 */
+ 0, 0xE1A6, 0xB4B1, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xB8C9, 0xC6BD, 0xC4EA, 0, 0xB2A2, 0, /* 0x70 */
+ 0xD0D2, 0, 0xE7DB, 0xBBC3, 0xD3D7, 0xD3C4, 0, 0xB9E3, /* 0x70 */
+ 0xE2CF, 0, 0, 0, 0xD7AF, 0, 0xC7EC, 0xB1D3, /* 0x80 */
+ 0, 0, 0xB4B2, 0xE2D1, 0, 0, 0, 0xD0F2, /* 0x80 */
+ 0xC2AE, 0xE2D0, 0, 0xBFE2, 0xD3A6, 0xB5D7, 0xE2D2, 0xB5EA, /* 0x90 */
+ 0, 0xC3ED, 0xB8FD, 0, 0xB8AE, 0, 0xC5D3, 0xB7CF, /* 0x90 */
+ 0xE2D4, 0, 0, 0, 0, 0xE2D3, 0xB6C8, 0xD7F9, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xCDA5, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE2D8, 0, 0xE2D6, 0xCAFC, 0xBFB5, /* 0xB0 */
+ 0xD3B9, 0xE2D5, 0, 0, 0, 0, 0xE2D7, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xC1AE, 0xC0C8, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE2DB, 0xE2DA, 0xC0AA, 0, 0, 0xC1CE, 0, /* 0xD0 */
+ 0, 0, 0, 0xE2DC, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE2DD, 0, 0xE2DE, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xDBC8, 0, 0xD1D3, 0xCDA2, /* 0xF0 */
+ 0, 0, 0xBDA8, 0, 0, 0, 0xDEC3, 0xD8A5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBFAA, 0xDBCD, 0xD2EC, 0xC6FA, 0xC5AA, 0, 0, 0, /* 0x00 */
+ 0xDEC4, 0, 0xB1D7, 0xDFAE, 0, 0, 0, 0xCABD, /* 0x00 */
+ 0, 0xDFB1, 0, 0xB9AD, 0, 0xD2FD, 0, 0xB8A5, /* 0x10 */
+ 0xBAEB, 0, 0, 0xB3DA, 0, 0, 0, 0xB5DC, /* 0x10 */
+ 0xD5C5, 0, 0, 0, 0, 0xC3D6, 0xCFD2, 0xBBA1, /* 0x20 */
+ 0, 0xE5F3, 0xE5F2, 0, 0, 0xE5F4, 0, 0xCDE4, /* 0x20 */
+ 0, 0xC8F5, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xB5AF, 0xC7BF, 0, 0xE5F6, 0, 0, 0, /* 0x30 */
+ 0xECB0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xE5E6, 0, 0xB9E9, 0xB5B1, 0, 0xC2BC, 0xE5E8, 0xE5E7, /* 0x50 */
+ 0xE5E9, 0, 0, 0, 0, 0xD2CD, 0, 0, /* 0x50 */
+ 0, 0xE1EA, 0xD0CE, 0, 0xCDAE, 0, 0xD1E5, 0, /* 0x60 */
+ 0, 0xB2CA, 0xB1EB, 0, 0xB1F2, 0xC5ED, 0, 0, /* 0x60 */
+ 0xD5C3, 0xD3B0, 0, 0xE1DC, 0, 0, 0, 0xE1DD, /* 0x70 */
+ 0, 0xD2DB, 0, 0xB3B9, 0xB1CB, 0, 0, 0, /* 0x70 */
+ 0xCDF9, 0xD5F7, 0xE1DE, 0, 0xBEB6, 0xB4FD, 0, 0xE1DF, /* 0x80 */
+ 0xBADC, 0xE1E0, 0xBBB2, 0xC2C9, 0xE1E1, 0, 0, 0, /* 0x80 */
+ 0xD0EC, 0, 0xCDBD, 0, 0, 0xE1E2, 0, 0xB5C3, /* 0x90 */
+ 0xC5C7, 0xE1E3, 0, 0, 0xE1E4, 0, 0, 0, /* 0x90 */
+ 0, 0xD3F9, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE1E5, 0, 0xD1AD, 0, 0, 0xE1E6, 0xCEA2, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xE1E7, 0, 0xB5C2, /* 0xB0 */
+ 0, 0, 0, 0, 0xE1E8, 0xBBD5, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xD0C4, 0xE2E0, 0xB1D8, 0xD2E4, 0, /* 0xC0 */
+ 0, 0xE2E1, 0, 0, 0xBCC9, 0xC8CC, 0, 0xE2E3, /* 0xC0 */
+ 0xECFE, 0xECFD, 0xDFAF, 0, 0, 0, 0xE2E2, 0xD6BE, /* 0xD0 */
+ 0xCDFC, 0xC3A6, 0, 0, 0, 0xE3C3, 0, 0, /* 0xD0 */
+ 0xD6D2, 0xE2E7, 0, 0, 0xE2E8, 0, 0, 0xD3C7, /* 0xE0 */
+ 0, 0, 0xE2EC, 0xBFEC, 0, 0xE2ED, 0xE2E5, 0, /* 0xE0 */
+ 0, 0xB3C0, 0, 0, 0, 0xC4EE, 0, 0, /* 0xF0 */
+ 0xE2EE, 0, 0, 0xD0C3, 0, 0xBAF6, 0xE2E9, 0xB7DE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBBB3, 0xCCAC, 0xCBCB, 0xE2E4, 0xE2E6, 0xE2EA, 0xE2EB, 0, /* 0x00 */
+ 0, 0, 0xE2F7, 0, 0, 0xE2F4, 0xD4F5, 0xE2F3, /* 0x00 */
+ 0, 0, 0xC5AD, 0, 0xD5FA, 0xC5C2, 0xB2C0, 0, /* 0x10 */
+ 0, 0xE2EF, 0, 0xE2F2, 0xC1AF, 0xCBBC, 0, 0, /* 0x10 */
+ 0xB5A1, 0xE2F9, 0, 0, 0, 0xBCB1, 0xE2F1, 0xD0D4, /* 0x20 */
+ 0xD4B9, 0xE2F5, 0xB9D6, 0xE2F6, 0, 0, 0, 0xC7D3, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE2F0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xD7DC, 0xEDA1, 0, 0, 0xE2F8, /* 0x30 */
+ 0, 0xEDA5, 0xE2FE, 0xCAD1, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xC1B5, 0, 0xBBD0, 0, 0, /* 0x40 */
+ 0xBFD6, 0, 0xBAE3, 0, 0, 0xCBA1, 0, 0, /* 0x50 */
+ 0, 0xEDA6, 0xEDA3, 0, 0, 0xEDA2, 0, 0, /* 0x50 */
+ 0, 0, 0xBBD6, 0xEDA7, 0xD0F4, 0, 0, 0xEDA4, /* 0x60 */
+ 0xBADE, 0xB6F7, 0xE3A1, 0xB6B2, 0xCCF1, 0xB9A7, 0, 0xCFA2, /* 0x60 */
+ 0xC7A1, 0, 0, 0xBFD2, 0, 0, 0xB6F1, 0, /* 0x70 */
+ 0xE2FA, 0xE2FB, 0xE2FD, 0xE2FC, 0xC4D5, 0xE3A2, 0, 0xD3C1, /* 0x70 */
+ 0, 0, 0, 0xE3A7, 0xC7C4, 0, 0, 0, /* 0x80 */
+ 0, 0xCFA4, 0, 0, 0xE3A9, 0xBAB7, 0, 0, /* 0x80 */
+ 0, 0, 0xE3A8, 0, 0xBBDA, 0, 0xE3A3, 0, /* 0x90 */
+ 0, 0, 0xE3A4, 0xE3AA, 0, 0xE3A6, 0, 0xCEF2, /* 0x90 */
+ 0xD3C6, 0, 0, 0xBBBC, 0, 0, 0xD4C3, 0, /* 0xA0 */
+ 0xC4FA, 0, 0, 0xEDA8, 0xD0FC, 0xE3A5, 0, 0xC3F5, /* 0xA0 */
+ 0, 0xE3AD, 0xB1AF, 0, 0xE3B2, 0, 0, 0, /* 0xB0 */
+ 0xBCC2, 0, 0, 0xE3AC, 0xB5BF, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xC7E9, 0xE3B0, 0, /* 0xC0 */
+ 0, 0, 0xBEAA, 0xCDEF, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xBBF3, 0, 0, 0, 0xCCE8, 0, 0, /* 0xD0 */
+ 0xE3AF, 0, 0xE3B1, 0, 0xCFA7, 0xE3AE, 0, 0xCEA9, /* 0xD0 */
+ 0xBBDD, 0, 0, 0, 0, 0, 0xB5EB, 0xBEE5, /* 0xE0 */
+ 0xB2D2, 0xB3CD, 0, 0xB1B9, 0xE3AB, 0xB2D1, 0xB5AC, 0xB9DF, /* 0xE0 */
+ 0xB6E8, 0, 0, 0xCFEB, 0xE3B7, 0, 0xBBCC, 0, /* 0xF0 */
+ 0, 0xC8C7, 0xD0CA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE3B8, 0xB3EE, 0, 0, 0, 0, 0xEDA9, 0, /* 0x00 */
+ 0xD3FA, 0xD3E4, 0, 0, 0, 0xEDAA, 0xE3B9, 0xD2E2, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE3B5, 0, 0, /* 0x10 */
+ 0, 0, 0xD3DE, 0, 0, 0, 0, 0xB8D0, /* 0x10 */
+ 0xE3B3, 0, 0, 0xE3B6, 0xB7DF, 0, 0xE3B4, 0xC0A2, /* 0x20 */
+ 0, 0, 0, 0xE3BA, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD4B8, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xB4C8, 0, 0xE3BB, 0, 0xBBC5, 0, 0xC9F7, 0, /* 0x40 */
+ 0, 0xC9E5, 0, 0, 0, 0xC4BD, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xEDAB, 0, 0, /* 0x50 */
+ 0, 0, 0xC2FD, 0, 0, 0, 0, 0xBBDB, /* 0x60 */
+ 0xBFAE, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xCEBF, 0, 0, 0, 0, 0xE3BC, 0, 0xBFB6, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xB1EF, 0, 0, 0xD4F7, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xE3BE, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xEDAD, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE3BF, /* 0xA0 */
+ 0xBAA9, 0xEDAC, 0, 0, 0xE3BD, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE3C0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xBAB6, 0, /* 0xB0 */
+ 0, 0, 0xB6AE, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xD0B8, 0, 0xB0C3, 0xEDAE, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xEDAF, 0xC0C1, 0, 0xE3C1, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xC5B3, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE3C2, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDCB2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDB0, 0, /* 0x00 */
+ 0xB8EA, 0, 0xCEEC, 0xEAA7, 0xD0E7, 0xCAF9, 0xC8D6, 0xCFB7, /* 0x00 */
+ 0xB3C9, 0xCED2, 0xBDE4, 0, 0, 0xE3DE, 0xBBF2, 0xEAA8, /* 0x10 */
+ 0xD5BD, 0, 0xC6DD, 0xEAA9, 0, 0, 0, 0xEAAA, /* 0x10 */
+ 0, 0xEAAC, 0xEAAB, 0, 0xEAAE, 0xEAAD, 0, 0, /* 0x20 */
+ 0, 0, 0xBDD8, 0, 0xEAAF, 0, 0xC2BE, 0, /* 0x20 */
+ 0, 0, 0, 0xB4C1, 0xB4F7, 0, 0, 0xBBA7, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xECE6, 0xECE5, 0xB7BF, /* 0x30 */
+ 0xCBF9, 0xB1E2, 0, 0xECE7, 0, 0, 0, 0xC9C8, /* 0x40 */
+ 0xECE8, 0xECE9, 0, 0xCAD6, 0xDED0, 0xB2C5, 0xD4FA, 0, /* 0x40 */
+ 0, 0xC6CB, 0xB0C7, 0xB4F2, 0xC8D3, 0, 0, 0, /* 0x50 */
+ 0xCDD0, 0, 0, 0xBFB8, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xBFDB, 0, 0, 0xC7A4, 0xD6B4, /* 0x60 */
+ 0, 0xC0A9, 0xDED1, 0xC9A8, 0xD1EF, 0xC5A4, 0xB0E7, 0xB3B6, /* 0x60 */
+ 0xC8C5, 0, 0, 0xB0E2, 0, 0, 0xB7F6, 0, /* 0x70 */
+ 0, 0xC5FA, 0, 0, 0xB6F3, 0, 0xD5D2, 0xB3D0, /* 0x70 */
+ 0xBCBC, 0, 0, 0, 0xB3AD, 0, 0, 0, /* 0x80 */
+ 0, 0xBEF1, 0xB0D1, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xD2D6, 0xCAE3, 0xD7A5, 0, 0xCDB6, 0xB6B6, 0xBFB9, /* 0x90 */
+ 0xD5DB, 0, 0xB8A7, 0xC5D7, 0, 0, 0, 0xDED2, /* 0x90 */
+ 0xBFD9, 0xC2D5, 0xC7C0, 0, 0xBBA4, 0xB1A8, 0, 0, /* 0xA0 */
+ 0xC5EA, 0, 0, 0xC5FB, 0xCCA7, 0, 0, 0, /* 0xA0 */
+ 0, 0xB1A7, 0, 0, 0, 0xB5D6, 0, 0, /* 0xB0 */
+ 0, 0xC4A8, 0, 0xDED3, 0xD1BA, 0xB3E9, 0, 0xC3F2, /* 0xB0 */
+ 0, 0, 0xB7F7, 0, 0xD6F4, 0xB5A3, 0xB2F0, 0xC4B4, /* 0xC0 */
+ 0xC4E9, 0xC0AD, 0xDED4, 0, 0xB0E8, 0xC5C4, 0xC1E0, 0, /* 0xC0 */
+ 0xB9D5, 0, 0xBEDC, 0xCDD8, 0xB0CE, 0, 0xCDCF, 0xDED6, /* 0xD0 */
+ 0xBED0, 0xD7BE, 0xDED5, 0xD5D0, 0xB0DD, 0, 0, 0xC4E2, /* 0xD0 */
+ 0, 0, 0xC2A3, 0xBCF0, 0, 0xD3B5, 0xC0B9, 0xC5A1, /* 0xE0 */
+ 0xB2A6, 0xD4F1, 0, 0, 0xC0A8, 0xCAC3, 0xDED7, 0xD5FC, /* 0xE0 */
+ 0, 0xB9B0, 0, 0xC8AD, 0xCBA9, 0, 0xDED9, 0xBFBD, /* 0xF0 */
+ 0, 0, 0, 0, 0xC6B4, 0xD7A7, 0xCAB0, 0xC4C3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB3D6, 0xB9D2, 0, 0, 0, 0, 0xD6B8, /* 0x00 */
+ 0xEAFC, 0xB0B4, 0, 0, 0, 0, 0xBFE6, 0, /* 0x00 */
+ 0, 0xCCF4, 0, 0, 0, 0, 0xCDDA, 0, /* 0x10 */
+ 0, 0, 0xD6BF, 0xC2CE, 0, 0xCECE, 0xCCA2, 0xD0AE, /* 0x10 */
+ 0xC4D3, 0xB5B2, 0xDED8, 0xD5F5, 0xBCB7, 0xBBD3, 0, 0, /* 0x20 */
+ 0xB0A4, 0, 0xC5B2, 0xB4EC, 0, 0, 0, 0xD5F1, /* 0x20 */
+ 0, 0, 0xEAFD, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xDEDA, 0xCDA6, 0, 0, 0xCDEC, 0, 0, /* 0x30 */
+ 0, 0, 0xCEE6, 0xDEDC, 0, 0xCDB1, 0xC0A6, 0, /* 0x40 */
+ 0, 0xD7BD, 0, 0xDEDB, 0xB0C6, 0xBAB4, 0xC9D3, 0xC4F3, /* 0x40 */
+ 0xBEE8, 0, 0, 0, 0, 0xB2B6, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xC0CC, 0xCBF0, /* 0x50 */
+ 0, 0xBCF1, 0xBBBB, 0xB5B7, 0, 0, 0, 0xC5F5, /* 0x60 */
+ 0, 0xDEE6, 0, 0, 0, 0xDEE3, 0xBEDD, 0, /* 0x60 */
+ 0, 0xDEDF, 0, 0, 0, 0, 0xB4B7, 0xBDDD, /* 0x70 */
+ 0, 0, 0xDEE0, 0xC4ED, 0, 0, 0, 0, /* 0x70 */
+ 0xCFC6, 0, 0xB5E0, 0, 0, 0, 0, 0xB6DE, /* 0x80 */
+ 0xCADA, 0xB5F4, 0xDEE5, 0, 0xD5C6, 0, 0xDEE1, 0xCCCD, /* 0x80 */
+ 0xC6FE, 0, 0xC5C5, 0, 0, 0, 0xD2B4, 0, /* 0x90 */
+ 0xBEF2, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xC2D3, 0, 0xCCBD, 0xB3B8, 0, 0xBDD3, 0, 0xBFD8, /* 0xA0 */
+ 0xCDC6, 0xD1DA, 0xB4EB, 0, 0xDEE4, 0xDEDD, 0xDEE7, 0, /* 0xA0 */
+ 0xEAFE, 0, 0, 0xC2B0, 0xDEE2, 0, 0, 0xD6C0, /* 0xB0 */
+ 0xB5A7, 0, 0xB2F4, 0, 0xDEE8, 0, 0xDEF2, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xDEED, 0, 0xDEF1, 0, /* 0xC0 */
+ 0, 0xC8E0, 0, 0, 0, 0xD7E1, 0xDEEF, 0xC3E8, /* 0xC0 */
+ 0xCCE1, 0, 0xB2E5, 0, 0, 0, 0xD2BE, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xDEEE, 0, /* 0xD0 */
+ 0xDEEB, 0xCED5, 0, 0xB4A7, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xBFAB, 0xBEBE, 0, 0, 0xBDD2, 0, 0, /* 0xE0 */
+ 0, 0, 0xDEE9, 0, 0xD4AE, 0, 0xDEDE, 0, /* 0xF0 */
+ 0xDEEA, 0, 0, 0, 0, 0xC0BF, 0, 0xDEEC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB2F3, 0xB8E9, 0xC2A7, 0, 0, 0xBDC1, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xDEF5, 0xDEF8, 0, 0, 0xB2AB, /* 0x00 */
+ 0xB4A4, 0, 0, 0xB4EA, 0xC9A6, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xDEF6, 0xCBD1, 0, 0xB8E3, 0, /* 0x10 */
+ 0xDEF7, 0xDEFA, 0, 0, 0, 0, 0xDEF9, 0, /* 0x20 */
+ 0, 0, 0xCCC2, 0, 0xB0E1, 0xB4EE, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE5BA, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xD0AF, 0, 0, 0xB2EB, 0, 0xEBA1, /* 0x30 */
+ 0, 0xDEF4, 0, 0, 0xC9E3, 0xDEF3, 0xB0DA, 0xD2A1, /* 0x40 */
+ 0xB1F7, 0, 0xCCAF, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xDEF0, 0, 0xCBA4, 0, 0, 0, /* 0x50 */
+ 0xD5AA, 0, 0, 0, 0, 0, 0xDEFB, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB4DD, /* 0x60 */
+ 0, 0xC4A6, 0, 0, 0, 0xDEFD, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xC3FE, 0xC4A1, 0xDFA1, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xC1CC, 0, 0xDEFC, 0xBEEF, 0, 0xC6B2, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xB3C5, 0xC8F6, 0, 0, 0xCBBA, 0xDEFE, 0, /* 0x90 */
+ 0, 0xDFA4, 0, 0, 0, 0, 0xD7B2, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xB3B7, 0, 0, 0, /* 0xA0 */
+ 0, 0xC1C3, 0, 0, 0xC7CB, 0xB2A5, 0xB4E9, 0, /* 0xA0 */
+ 0xD7AB, 0, 0, 0, 0, 0xC4EC, 0, 0xDFA2, /* 0xB0 */
+ 0xDFA3, 0, 0xDFA5, 0, 0xBAB3, 0, 0, 0, /* 0xB0 */
+ 0xDFA6, 0, 0xC0DE, 0, 0, 0xC9C3, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xB2D9, 0xC7E6, 0, /* 0xC0 */
+ 0xDFA7, 0, 0xC7DC, 0, 0, 0, 0, 0xDFA8, /* 0xD0 */
+ 0xEBA2, 0, 0, 0, 0, 0, 0xCBD3, 0, /* 0xD0 */
+ 0, 0, 0xDFAA, 0, 0xDFA9, 0, 0xB2C1 /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC5CA, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xDFAB, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xD4DC, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xC8C1, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xDFAC, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xBEF0, 0, 0, 0xDFAD, 0xD6A7, /* 0x20 */
+ 0, 0, 0, 0, 0xEAB7, 0xEBB6, 0xCAD5, 0, /* 0x30 */
+ 0xD8FC, 0xB8C4, 0, 0xB9A5, 0, 0, 0xB7C5, 0xD5FE, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xB9CA, 0, 0, /* 0x40 */
+ 0xD0A7, 0xF4CD, 0, 0, 0xB5D0, 0, 0, 0xC3F4, /* 0x40 */
+ 0, 0xBEC8, 0, 0, 0, 0xEBB7, 0xB0BD, 0, /* 0x50 */
+ 0, 0xBDCC, 0, 0xC1B2, 0, 0xB1D6, 0xB3A8, 0, /* 0x50 */
+ 0, 0, 0xB8D2, 0xC9A2, 0, 0, 0xB6D8, 0, /* 0x60 */
+ 0, 0, 0, 0xEBB8, 0xBEB4, 0, 0, 0, /* 0x60 */
+ 0xCAFD, 0, 0xC7C3, 0, 0xD5FB, 0, 0, 0xB7F3, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCEC4, /* 0x80 */
+ 0, 0, 0, 0xD5AB, 0xB1F3, 0, 0, 0, /* 0x80 */
+ 0xECB3, 0xB0DF, 0, 0xECB5, 0, 0, 0, 0xB6B7, /* 0x90 */
+ 0, 0xC1CF, 0, 0xF5FA, 0xD0B1, 0, 0, 0xD5E5, /* 0x90 */
+ 0, 0xCED3, 0, 0, 0xBDEF, 0xB3E2, 0, 0xB8AB, /* 0xA0 */
+ 0, 0xD5B6, 0, 0xEDBD, 0, 0xB6CF, 0, 0xCBB9, /* 0xA0 */
+ 0xD0C2, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xB7BD, 0, 0, 0xECB6, 0xCAA9, 0, 0, /* 0xB0 */
+ 0, 0xC5D4, 0, 0xECB9, 0xECB8, 0xC2C3, 0xECB7, 0, /* 0xC0 */
+ 0, 0, 0, 0xD0FD, 0xECBA, 0, 0xECBB, 0xD7E5, /* 0xC0 */
+ 0, 0, 0xECBC, 0, 0, 0, 0xECBD, 0xC6EC, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xCEDE, 0, 0xBCC8, 0, 0, 0xC8D5, 0xB5A9, 0xBEC9, /* 0xE0 */
+ 0xD6BC, 0xD4E7, 0, 0, 0xD1AE, 0xD0F1, 0xEAB8, 0xEAB9, /* 0xE0 */
+ 0xEABA, 0xBAB5, 0, 0, 0, 0, 0xCAB1, 0xBFF5, /* 0xF0 */
+ 0, 0, 0xCDFA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEAC0, 0, 0xB0BA, 0xEABE, 0, 0, 0xC0A5, 0, /* 0x00 */
+ 0, 0, 0xEABB, 0, 0xB2FD, 0, 0xC3F7, 0xBBE8, /* 0x00 */
+ 0, 0, 0, 0xD2D7, 0xCEF4, 0xEABF, 0, 0, /* 0x10 */
+ 0, 0xEABC, 0, 0, 0, 0xEAC3, 0, 0xD0C7, /* 0x10 */
+ 0xD3B3, 0, 0, 0, 0, 0xB4BA, 0, 0xC3C1, /* 0x20 */
+ 0xD7F2, 0, 0, 0, 0, 0xD5D1, 0, 0xCAC7, /* 0x20 */
+ 0, 0xEAC5, 0, 0, 0xEAC4, 0xEAC7, 0xEAC6, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xD6E7, 0, 0xCFD4, 0, /* 0x30 */
+ 0, 0xEACB, 0, 0xBBCE, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xBDFA, 0xC9CE, 0, 0, 0xEACC, /* 0x40 */
+ 0, 0, 0xC9B9, 0xCFFE, 0xEACA, 0xD4CE, 0xEACD, 0xEACF, /* 0x50 */
+ 0, 0, 0xCDED, 0, 0, 0, 0, 0xEAC9, /* 0x50 */
+ 0, 0xEACE, 0, 0, 0xCEEE, 0, 0xBBDE, 0, /* 0x60 */
+ 0xB3BF, 0, 0, 0, 0, 0, 0xC6D5, 0xBEB0, /* 0x60 */
+ 0xCEFA, 0, 0, 0, 0xC7E7, 0, 0xBEA7, 0xEAD0, /* 0x70 */
+ 0, 0, 0xD6C7, 0, 0, 0, 0xC1C0, 0, /* 0x70 */
+ 0, 0, 0xD4DD, 0, 0xEAD1, 0, 0, 0xCFBE, /* 0x80 */
+ 0, 0, 0, 0, 0xEAD2, 0, 0, 0, /* 0x80 */
+ 0, 0xCAEE, 0, 0, 0, 0, 0xC5AF, 0xB0B5, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xEAD4, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEAD3, /* 0xA0 */
+ 0xF4DF, 0, 0, 0, 0, 0, 0xC4BA, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xB1A9, 0, 0, 0, /* 0xB0 */
+ 0, 0xE5DF, 0, 0, 0, 0, 0xEAD5, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xCAEF, 0, 0xEAD6, 0xEAD7, 0xC6D8, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xEAD8, 0, /* 0xE0 */
+ 0, 0xEAD9, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xD4BB, 0, 0xC7FA, 0xD2B7, 0xB8FC, 0, 0, 0xEAC2, /* 0xF0 */
+ 0, 0xB2DC, 0, 0, 0xC2FC, 0, 0xD4F8, 0xCCE6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7EE, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xD4C2, 0xD3D0, 0xEBC3, 0xC5F3, 0, 0xB7FE, 0, 0, /* 0x00 */
+ 0xEBD4, 0, 0, 0, 0xCBB7, 0xEBDE, 0, 0xC0CA, /* 0x10 */
+ 0, 0, 0, 0xCDFB, 0, 0xB3AF, 0, 0xC6DA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xEBFC, 0, /* 0x20 */
+ 0xC4BE, 0, 0xCEB4, 0xC4A9, 0xB1BE, 0xD4FD, 0, 0xCAF5, /* 0x20 */
+ 0, 0xD6EC, 0, 0, 0xC6D3, 0xB6E4, 0, 0, /* 0x30 */
+ 0, 0, 0xBBFA, 0, 0, 0xD0E0, 0, 0, /* 0x30 */
+ 0xC9B1, 0, 0xD4D3, 0xC8A8, 0, 0, 0xB8CB, 0, /* 0x40 */
+ 0xE8BE, 0xC9BC, 0, 0, 0xE8BB, 0, 0xC0EE, 0xD0D3, /* 0x40 */
+ 0xB2C4, 0xB4E5, 0, 0xE8BC, 0, 0, 0xD5C8, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xB6C5, 0, 0xE8BD, 0xCAF8, /* 0x50 */
+ 0xB8DC, 0xCCF5, 0, 0, 0, 0xC0B4, 0, 0, /* 0x60 */
+ 0xD1EE, 0xE8BF, 0xE8C2, 0, 0, 0xBABC, 0, 0xB1AD, /* 0x60 */
+ 0xBDDC, 0, 0xEABD, 0xE8C3, 0, 0xE8C6, 0, 0xE8CB, /* 0x70 */
+ 0, 0, 0, 0, 0xE8CC, 0, 0xCBC9, 0xB0E5, /* 0x70 */
+ 0, 0xBCAB, 0, 0, 0xB9B9, 0, 0, 0xE8C1, /* 0x80 */
+ 0, 0xCDF7, 0, 0xE8CA, 0, 0, 0, 0, /* 0x80 */
+ 0xCEF6, 0, 0, 0, 0, 0xD5ED, 0, 0xC1D6, /* 0x90 */
+ 0xE8C4, 0, 0xC3B6, 0, 0xB9FB, 0xD6A6, 0xE8C8, 0, /* 0x90 */
+ 0, 0, 0xCAE0, 0xD4E6, 0, 0xE8C0, 0, 0xE8C5, /* 0xA0 */
+ 0xE8C7, 0, 0xC7B9, 0xB7E3, 0, 0xE8C9, 0, 0xBFDD, /* 0xA0 */
+ 0xE8D2, 0, 0, 0xE8D7, 0, 0xE8D5, 0xBCDC, 0xBCCF, /* 0xB0 */
+ 0xE8DB, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE8DE, 0, 0xE8DA, 0xB1FA, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB0D8, /* 0xC0 */
+ 0xC4B3, 0xB8CC, 0xC6E2, 0xC8BE, 0xC8E1, 0, 0, 0, /* 0xD0 */
+ 0xE8CF, 0xE8D4, 0xE8D6, 0, 0xB9F1, 0xE8D8, 0xD7F5, 0, /* 0xD0 */
+ 0xC4FB, 0, 0xE8DC, 0, 0, 0xB2E9, 0, 0, /* 0xE0 */
+ 0, 0xE8D1, 0, 0, 0xBCED, 0, 0, 0xBFC2, /* 0xE0 */
+ 0xE8CD, 0xD6F9, 0, 0xC1F8, 0xB2F1, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xE8DF, 0, 0xCAC1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE8D9, 0, 0, 0, 0, 0xD5A4, 0, 0xB1EA, /* 0x00 */
+ 0xD5BB, 0xE8CE, 0xE8D0, 0xB6B0, 0xE8D3, 0, 0xE8DD, 0xC0B8, /* 0x00 */
+ 0, 0xCAF7, 0, 0xCBA8, 0, 0, 0xC6DC, 0xC0F5, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE8E9, 0, 0, /* 0x10 */
+ 0, 0xD0A3, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE8F2, 0xD6EA, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE8E0, 0xE8E1, 0, 0, 0, 0xD1F9, /* 0x30 */
+ 0xBACB, 0xB8F9, 0, 0, 0xB8F1, 0xD4D4, 0xE8EF, 0, /* 0x30 */
+ 0xE8EE, 0xE8EC, 0xB9F0, 0xCCD2, 0xE8E6, 0xCEA6, 0xBFF2, 0, /* 0x40 */
+ 0xB0B8, 0xE8F1, 0xE8F0, 0, 0xD7C0, 0, 0xE8E4, 0, /* 0x40 */
+ 0xCDA9, 0xC9A3, 0, 0xBBB8, 0xBDDB, 0xE8EA, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE8E2, 0xE8E3, 0xE8E5, 0xB5B5, 0xE8E7, 0xC7C5, 0xE8EB, 0xE8ED, /* 0x60 */
+ 0xBDB0, 0xD7AE, 0, 0xE8F8, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE8F5, 0, 0xCDB0, 0xE8F6, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC1BA, 0, 0xE8E8, 0, 0xC3B7, 0xB0F0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8F4, /* 0x80 */
+ 0, 0, 0, 0xE8F7, 0, 0, 0, 0xB9A3, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xC9D2, 0, 0, 0, 0xC3CE, 0xCEE0, /* 0xA0 */
+ 0xC0E6, 0, 0, 0, 0, 0xCBF3, 0, 0xCCDD, /* 0xA0 */
+ 0xD0B5, 0, 0, 0xCAE1, 0, 0xE8F3, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xBCEC, 0, 0xE8F9, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xC3DE, 0, 0xC6E5, 0, 0xB9F7, 0, 0, /* 0xC0 */
+ 0, 0, 0xB0F4, 0, 0, 0xD7D8, 0, 0, /* 0xD0 */
+ 0xBCAC, 0, 0xC5EF, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xCCC4, 0, 0, 0xE9A6, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xC9AD, 0, /* 0xE0 */
+ 0xE9A2, 0xC0E2, 0, 0, 0, 0xBFC3, 0, 0, /* 0xF0 */
+ 0, 0xE8FE, 0xB9D7, 0, 0xE8FB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE9A4, 0, 0, 0, 0xD2CE, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xE9A3, 0, 0xD6B2, 0xD7B5, 0, /* 0x00 */
+ 0xE9A7, 0, 0xBDB7, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8FC, /* 0x10 */
+ 0xE8FD, 0, 0, 0, 0xE9A1, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xCDD6, 0, 0, /* 0x20 */
+ 0xD2AC, 0, 0, 0, 0xE9B2, 0, 0, 0, /* 0x30 */
+ 0, 0xE9A9, 0, 0, 0, 0xB4AA, 0, 0xB4BB, /* 0x30 */
+ 0, 0, 0xE9AB, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xD0A8, 0, 0, 0xE9A5, /* 0x50 */
+ 0, 0, 0xB3FE, 0, 0, 0xE9AC, 0xC0E3, 0, /* 0x50 */
+ 0xE9AA, 0, 0, 0xE9B9, 0, 0, 0xE9B8, 0, /* 0x60 */
+ 0, 0, 0, 0xE9AE, 0, 0, 0xE8FA, 0, /* 0x60 */
+ 0, 0xE9A8, 0, 0, 0, 0, 0, 0xBFAC, /* 0x70 */
+ 0xE9B1, 0xE9BA, 0, 0, 0xC2A5, 0, 0, 0, /* 0x70 */
+ 0xE9AF, 0, 0xB8C5, 0, 0xE9AD, 0, 0xD3DC, 0xE9B4, /* 0x80 */
+ 0xE9B5, 0xE9B7, 0, 0, 0, 0xE9C7, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xC0C6, 0xE9C5, 0, 0, /* 0x90 */
+ 0xE9B0, 0, 0, 0xE9BB, 0xB0F1, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE9BC, /* 0xA0 */
+ 0xD5A5, 0, 0, 0xE9BE, 0, 0xE9BF, 0, 0, /* 0xA0 */
+ 0, 0xE9C1, 0, 0, 0xC1F1, 0, 0, 0xC8B6, /* 0xB0 */
+ 0, 0, 0, 0xE9BD, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE9C2, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE9C3, 0, 0xE9B3, 0, 0xE9B6, 0, /* 0xC0 */
+ 0xBBB1, 0, 0, 0, 0xE9C0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xBCF7, 0, 0, 0, 0xE9C4, /* 0xD0 */
+ 0xE9C6, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE9CA, 0, 0, /* 0xE0 */
+ 0, 0, 0xE9CE, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xB2DB, 0, 0xE9C8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xB7AE, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE9CB, /* 0x10 */
+ 0xE9CC, 0, 0, 0, 0, 0, 0, 0xD5C1, /* 0x10 */
+ 0, 0xC4A3, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xE9D8, 0, 0xBAE1, 0, 0, 0, 0, 0xE9C9, /* 0x20 */
+ 0, 0xD3A3, 0, 0, 0, 0xE9D4, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE9D7, 0xE9D0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE9CF, 0, 0, 0xC7C1, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xE9D2, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE9D9, 0xB3C8, 0, 0xE9D3, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCFF0, 0, 0, 0, 0xE9CD, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xB3F7, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xE9D6, 0, 0, 0xE9DA, 0, 0, 0, /* 0x70 */
+ 0xCCB4, 0, 0, 0, 0xCFAD, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xE9D5, 0, /* 0x80 */
+ 0xE9DC, 0xE9DB, 0, 0, 0, 0, 0, 0xE9DE, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xE9D1, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE9DD, 0, 0xE9DF, 0xC3CA /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7B7, 0xB4CE, 0xBBB6, 0xD0C0, 0xECA3, 0, 0, 0xC5B7, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xD3FB, 0, 0, 0, 0, 0xECA4, /* 0x30 */
+ 0, 0xECA5, 0xC6DB, 0, 0, 0, 0xBFEE, 0, /* 0x30 */
+ 0, 0, 0, 0xECA6, 0, 0, 0xECA7, 0xD0AA, /* 0x40 */
+ 0, 0xC7B8, 0, 0, 0xB8E8, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xECA8, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xD6B9, 0xD5FD, 0xB4CB, 0xB2BD, 0xCEE4, 0xC6E7, /* 0x60 */
+ 0, 0, 0xCDE1, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB4F5, 0, 0xCBC0, 0xBCDF, 0, 0, 0, /* 0x70 */
+ 0, 0xE9E2, 0xE9E3, 0xD1EA, 0xE9E5, 0, 0xB4F9, 0xE9E4, /* 0x80 */
+ 0, 0xD1B3, 0xCAE2, 0xB2D0, 0, 0xE9E8, 0, 0, /* 0x80 */
+ 0, 0, 0xE9E6, 0xE9E7, 0, 0, 0xD6B3, 0, /* 0x90 */
+ 0, 0, 0xE9E9, 0xE9EA, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xE9EB, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE9EC, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xECAF, 0xC5B9, 0xB6CE, 0, 0xD2F3, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB5EE, /* 0xB0 */
+ 0, 0xBBD9, 0xECB1, 0, 0, 0xD2E3, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xCEE3, 0, 0xC4B8, 0, 0xC3BF, /* 0xC0 */
+ 0, 0, 0xB6BE, 0xD8B9, 0xB1C8, 0xB1CF, 0xB1D1, 0xC5FE, /* 0xD0 */
+ 0, 0xB1D0, 0, 0xC3AB, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xD5B1, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xEBA4, 0xBAC1, 0, 0, 0, 0xCCBA, /* 0xE0 */
+ 0, 0, 0, 0xEBA5, 0, 0xEBA7, 0, 0, /* 0xF0 */
+ 0, 0xEBA8, 0, 0, 0, 0xEBA6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEBA9, 0xEBAB, 0xEBAA, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xEBAC, 0, 0xCACF, /* 0x00 */
+ 0xD8B5, 0xC3F1, 0, 0xC3A5, 0xC6F8, 0xEBAD, 0xC4CA, 0, /* 0x10 */
+ 0xEBAE, 0xEBAF, 0xEBB0, 0xB7D5, 0, 0, 0, 0xB7FA, /* 0x10 */
+ 0, 0xEBB1, 0xC7E2, 0, 0xEBB3, 0, 0xBAA4, 0xD1F5, /* 0x20 */
+ 0xB0B1, 0xEBB2, 0xEBB4, 0, 0, 0, 0xB5AA, 0xC2C8, /* 0x20 */
+ 0xC7E8, 0, 0xEBB5, 0, 0xCBAE, 0xE3DF, 0, 0, /* 0x30 */
+ 0xD3C0, 0, 0, 0, 0, 0xD9DB, 0, 0, /* 0x30 */
+ 0xCDA1, 0xD6AD, 0xC7F3, 0, 0, 0, 0xD9E0, 0xBBE3, /* 0x40 */
+ 0, 0xBABA, 0xE3E2, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xCFAB, 0, 0, 0, 0xE3E0, 0xC9C7, 0, 0xBAB9, /* 0x50 */
+ 0, 0, 0, 0xD1B4, 0xE3E1, 0xC8EA, 0xB9AF, 0xBDAD, /* 0x50 */
+ 0xB3D8, 0xCEDB, 0, 0, 0xCCC0, 0, 0, 0, /* 0x60 */
+ 0xE3E8, 0xE3E9, 0xCDF4, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xCCAD, 0, 0xBCB3, 0, 0xE3EA, 0, 0xE3EB, 0, /* 0x70 */
+ 0, 0xD0DA, 0, 0, 0, 0xC6FB, 0xB7DA, 0, /* 0x70 */
+ 0, 0xC7DF, 0xD2CA, 0xCED6, 0, 0xE3E4, 0xE3EC, 0, /* 0x80 */
+ 0xC9F2, 0xB3C1, 0, 0, 0xE3E7, 0, 0, 0xC6E3, /* 0x80 */
+ 0xE3E5, 0, 0, 0xEDB3, 0xE3E6, 0, 0, 0, /* 0x90 */
+ 0, 0xC9B3, 0, 0xC5E6, 0, 0, 0, 0xB9B5, /* 0x90 */
+ 0, 0xC3BB, 0, 0xE3E3, 0xC5BD, 0xC1A4, 0xC2D9, 0xB2D7, /* 0xA0 */
+ 0, 0xE3ED, 0xBBA6, 0xC4AD, 0, 0xE3F0, 0xBEDA, 0, /* 0xA0 */
+ 0, 0xE3FB, 0xE3F5, 0xBAD3, 0, 0, 0, 0, /* 0xB0 */
+ 0xB7D0, 0xD3CD, 0, 0xD6CE, 0xD5D3, 0xB9C1, 0xD5B4, 0xD1D8, /* 0xB0 */
+ 0, 0, 0, 0, 0xD0B9, 0xC7F6, 0, 0, /* 0xC0 */
+ 0, 0xC8AA, 0xB2B4, 0, 0xC3DA, 0, 0, 0, /* 0xC0 */
+ 0xE3EE, 0, 0, 0xE3FC, 0xE3EF, 0xB7A8, 0xE3F7, 0xE3F4, /* 0xD0 */
+ 0, 0, 0, 0xB7BA, 0, 0, 0xC5A2, 0, /* 0xD0 */
+ 0xE3F6, 0xC5DD, 0xB2A8, 0xC6FC, 0, 0xC4E0, 0, 0, /* 0xE0 */
+ 0xD7A2, 0, 0xC0E1, 0xE3F9, 0, 0, 0xE3FA, 0xE3FD, /* 0xE0 */
+ 0xCCA9, 0xE3F3, 0, 0xD3BE, 0, 0xB1C3, 0xEDB4, 0xE3F1, /* 0xF0 */
+ 0xE3F2, 0, 0xE3F8, 0xD0BA, 0xC6C3, 0xD4F3, 0xE3FE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDE0, 0, 0, 0xE4A7, 0, 0, 0xE4A6, /* 0x00 */
+ 0, 0, 0, 0xD1F3, 0xE4A3, 0, 0xE4A9, 0, /* 0x00 */
+ 0, 0, 0xC8F7, 0, 0, 0, 0, 0xCFB4, /* 0x10 */
+ 0, 0xE4A8, 0xE4AE, 0xC2E5, 0, 0, 0xB6B4, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xBDF2, 0, 0xE4A2, /* 0x20 */
+ 0, 0, 0xBAE9, 0xE4AA, 0, 0, 0xE4AC, 0, /* 0x20 */
+ 0, 0xB6FD, 0xD6DE, 0xE4B2, 0, 0xE4AD, 0, 0, /* 0x30 */
+ 0, 0xE4A1, 0, 0xBBEE, 0xCDDD, 0xC7A2, 0xC5C9, 0, /* 0x30 */
+ 0, 0xC1F7, 0, 0xE4A4, 0, 0xC7B3, 0xBDAC, 0xBDBD, /* 0x40 */
+ 0xE4A5, 0, 0xD7C7, 0xB2E2, 0, 0xE4AB, 0xBCC3, 0xE4AF, /* 0x40 */
+ 0, 0xBBEB, 0xE4B0, 0xC5A8, 0xE4B1, 0, 0, 0, /* 0x50 */
+ 0, 0xD5E3, 0xBFA3, 0, 0xE4BA, 0, 0xE4B7, 0, /* 0x50 */
+ 0xE4BB, 0, 0, 0xE4BD, 0, 0, 0xC6D6, 0, /* 0x60 */
+ 0, 0xBAC6, 0xC0CB, 0, 0, 0, 0xB8A1, 0xE4B4, /* 0x60 */
+ 0, 0, 0, 0, 0xD4A1, 0, 0, 0xBAA3, /* 0x70 */
+ 0xBDFE, 0, 0, 0, 0xE4BC, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xCDBF, 0, 0, 0xC4F9, 0, 0, /* 0x80 */
+ 0xCFFB, 0xC9E6, 0, 0, 0xD3BF, 0, 0xCFD1, 0, /* 0x80 */
+ 0, 0xE4B3, 0, 0xE4B8, 0xE4B9, 0xCCE9, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xCCCE, 0, 0xC0D4, 0xE4B5, 0xC1B0, /* 0x90 */
+ 0xE4B6, 0xCED0, 0, 0xBBC1, 0xB5D3, 0, 0xC8F3, 0xBDA7, /* 0xA0 */
+ 0xD5C7, 0xC9AC, 0xB8A2, 0xE4CA, 0, 0, 0xE4CC, 0xD1C4, /* 0xA0 */
+ 0, 0, 0xD2BA, 0, 0, 0xBAAD, 0, 0, /* 0xB0 */
+ 0xBAD4, 0, 0, 0, 0, 0, 0, 0xE4C3, /* 0xB0 */
+ 0xB5ED, 0, 0, 0, 0xD7CD, 0xE4C0, 0xCFFD, 0xE4BF, /* 0xC0 */
+ 0, 0, 0, 0xC1DC, 0xCCCA, 0, 0, 0, /* 0xC0 */
+ 0, 0xCAE7, 0, 0, 0, 0, 0xC4D7, 0, /* 0xD0 */
+ 0xCCD4, 0xE4C8, 0, 0, 0, 0xE4C7, 0xE4C1, 0, /* 0xD0 */
+ 0xE4C4, 0xB5AD, 0, 0, 0xD3D9, 0, 0xE4C6, 0, /* 0xE0 */
+ 0, 0, 0, 0xD2F9, 0xB4E3, 0, 0xBBB4, 0, /* 0xE0 */
+ 0, 0xC9EE, 0, 0xB4BE, 0, 0, 0, 0xBBEC, /* 0xF0 */
+ 0, 0xD1CD, 0, 0xCCED, 0xEDB5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7E5, 0, 0, /* 0x00 */
+ 0, 0, 0xD4A8, 0, 0xE4CB, 0xD7D5, 0xE4C2, 0, /* 0x00 */
+ 0xBDA5, 0xE4C5, 0, 0, 0xD3E6, 0, 0xE4C9, 0xC9F8, /* 0x10 */
+ 0, 0, 0xE4BE, 0, 0, 0xD3E5, 0, 0, /* 0x10 */
+ 0xC7FE, 0xB6C9, 0, 0xD4FC, 0xB2B3, 0xE4D7, 0, 0, /* 0x20 */
+ 0, 0xCEC2, 0, 0xE4CD, 0, 0xCEBC, 0, 0xB8DB, /* 0x20 */
+ 0, 0, 0xE4D6, 0, 0xBFCA, 0, 0, 0, /* 0x30 */
+ 0xD3CE, 0, 0xC3EC, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xC5C8, 0xE4D8, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xCDC4, 0xE4CF, 0, /* 0x40 */
+ 0, 0, 0, 0xE4D4, 0xE4D5, 0, 0xBAFE, 0, /* 0x50 */
+ 0xCFE6, 0, 0, 0xD5BF, 0, 0, 0, 0xE4D2, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE4D0, 0, 0, 0xE4CE, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xCDE5, 0xCAAA, /* 0x70 */
+ 0, 0, 0, 0xC0A3, 0, 0xBDA6, 0xE4D3, 0, /* 0x80 */
+ 0, 0xB8C8, 0, 0, 0, 0, 0, 0xE4E7, /* 0x80 */
+ 0xD4B4, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xE4DB, 0, 0, 0, 0xC1EF, 0, 0, 0xE4E9, /* 0x90 */
+ 0, 0, 0xD2E7, 0, 0, 0xE4DF, 0, 0xE4E0, /* 0xA0 */
+ 0, 0, 0xCFAA, 0, 0, 0, 0, 0xCBDD, /* 0xA0 */
+ 0, 0xE4DA, 0xE4D1, 0, 0xE4E5, 0, 0xC8DC, 0xE4E3, /* 0xB0 */
+ 0, 0, 0xC4E7, 0xE4E2, 0, 0xE4E1, 0, 0, /* 0xB0 */
+ 0, 0xB3FC, 0xE4E8, 0, 0, 0, 0, 0xB5E1, /* 0xC0 */
+ 0, 0, 0, 0xD7CC, 0, 0, 0, 0xE4E6, /* 0xC0 */
+ 0, 0xBBAC, 0, 0xD7D2, 0xCCCF, 0xEBF8, 0, 0xE4E4, /* 0xD0 */
+ 0, 0, 0xB9F6, 0, 0, 0, 0xD6CD, 0xE4D9, /* 0xD0 */
+ 0xE4DC, 0xC2FA, 0xE4DE, 0, 0xC2CB, 0xC0C4, 0xC2D0, 0, /* 0xE0 */
+ 0xB1F5, 0xCCB2, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xB5CE, 0, 0, 0, /* 0xF0 */
+ 0, 0xE4EF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6AF, 0, 0, 0, 0xC6E1, 0, /* 0x00 */
+ 0, 0xE4F5, 0, 0, 0, 0, 0, 0xC2A9, /* 0x00 */
+ 0, 0, 0, 0xC0EC, 0xD1DD, 0xE4EE, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xC4AE, 0, 0, 0, 0xE4ED, 0, 0, 0, /* 0x20 */
+ 0, 0xE4F6, 0xE4F4, 0xC2FE, 0, 0xE4DD, 0, 0xE4F0, /* 0x20 */
+ 0, 0xCAFE, 0, 0xD5C4, 0, 0, 0xE4F1, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xD1FA, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE4EB, 0xE4EC, /* 0x40 */
+ 0, 0, 0, 0xE4F2, 0, 0xCEAB, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xC5CB, 0, 0, 0, 0xC7B1, 0, 0xC2BA, 0, /* 0x50 */
+ 0, 0, 0xE4EA, 0, 0, 0, 0xC1CA, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xCCB6, 0xB3B1, 0, /* 0x60 */
+ 0, 0, 0xE4FB, 0, 0xE4F3, 0, 0, 0, /* 0x70 */
+ 0xE4FA, 0, 0xE4FD, 0, 0xE4FC, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xB3CE, 0, 0, 0, /* 0x80 */
+ 0xB3BA, 0xE4F7, 0, 0, 0xE4F9, 0xE4F8, 0xC5EC, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xC0BD, 0, 0, 0, /* 0x90 */
+ 0, 0xD4E8, 0, 0, 0, 0, 0, 0xE5A2, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xB0C4, 0, 0, 0xE5A4, 0, /* 0xB0 */
+ 0, 0xE5A3, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xBCA4, 0, 0xE5A5, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE5A1, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE4FE, 0xB1F4, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xE5A8, 0, /* 0xD0 */
+ 0xE5A9, 0xE5A6, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xE5A7, 0xE5AA /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6D9, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xE5AB, 0xE5AD, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE5AC, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE5AF, 0, 0, /* 0x30 */
+ 0, 0xE5AE, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xB9E0, 0, 0, 0xE5B0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xE5B1, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xBBF0, 0xECE1, 0xC3F0, 0, 0xB5C6, /* 0x60 */
+ 0xBBD2, 0, 0, 0, 0, 0xC1E9, 0xD4EE, 0, /* 0x70 */
+ 0xBEC4, 0, 0, 0, 0xD7C6, 0, 0xD4D6, 0xB2D3, /* 0x70 */
+ 0xECBE, 0, 0, 0, 0, 0xEAC1, 0, 0, /* 0x80 */
+ 0, 0xC2AF, 0xB4B6, 0, 0, 0, 0xD1D7, 0, /* 0x80 */
+ 0, 0, 0xB3B4, 0, 0xC8B2, 0xBFBB, 0xECC0, 0, /* 0x90 */
+ 0, 0xD6CB, 0, 0, 0xECBF, 0xECC1, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xECC5, 0xBEE6, 0xCCBF, 0xC5DA, 0xBEBC, /* 0xA0 */
+ 0, 0xECC6, 0, 0xB1FE, 0, 0, 0, 0xECC4, /* 0xB0 */
+ 0xD5A8, 0xB5E3, 0, 0xECC2, 0xC1B6, 0xB3E3, 0, 0, /* 0xB0 */
+ 0xECC3, 0xCBB8, 0xC0C3, 0xCCFE, 0, 0, 0, 0, /* 0xC0 */
+ 0xC1D2, 0, 0xECC8, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xBAE6, 0xC0D3, 0, 0xD6F2, 0, 0, 0, 0xD1CC, /* 0xD0 */
+ 0, 0, 0, 0, 0xBFBE, 0, 0xB7B3, 0xC9D5, /* 0xE0 */
+ 0xECC7, 0xBBE2, 0, 0xCCCC, 0xBDFD, 0xC8C8, 0, 0xCFA9, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCDE9, /* 0xF0 */
+ 0, 0xC5EB, 0, 0, 0, 0xB7E9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xD1C9, 0xBAB8, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xECC9, 0, 0, 0xECCA, 0, 0xBBC0, 0xECCB, 0, /* 0x10 */
+ 0xECE2, 0xB1BA, 0xB7D9, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xBDB9, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xECCC, /* 0x20 */
+ 0xD1E6, 0xECCD, 0, 0, 0, 0, 0xC8BB, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xECD1, 0, 0, /* 0x40 */
+ 0, 0, 0xECD3, 0, 0xBBCD, 0, 0xBCE5, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xECCF, 0, 0xC9B7, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xC3BA, 0, 0xECE3, 0xD5D5, /* 0x60 */
+ 0xECD0, 0, 0, 0, 0, 0, 0xD6F3, 0, /* 0x60 */
+ 0, 0, 0xECD2, 0xECCE, 0, 0, 0, 0, /* 0x70 */
+ 0xECD4, 0, 0xECD5, 0, 0, 0xC9BF, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xCFA8, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD0DC, 0, 0, 0, 0, 0xD1AC, /* 0x80 */
+ 0, 0, 0, 0, 0xC8DB, 0, 0, 0, /* 0x90 */
+ 0xECD6, 0xCEF5, 0, 0, 0, 0, 0, 0xCAEC, /* 0x90 */
+ 0xECDA, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xECD9, 0, 0, 0, 0xB0BE, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xECD7, 0, 0xECD8, 0, 0, /* 0xB0 */
+ 0, 0xECE4, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xC8BC, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xC1C7, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xECDC, 0xD1E0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xECDB, 0, 0, 0, 0, 0xD4EF, 0, 0xECDD, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xDBC6, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xECDE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB1AC, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xECDF, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xECE0, 0, 0xD7A6, 0, 0xC5C0, 0, 0, 0, /* 0x20 */
+ 0xEBBC, 0xB0AE, 0, 0, 0, 0xBEF4, 0xB8B8, 0xD2AF, /* 0x30 */
+ 0xB0D6, 0xB5F9, 0, 0xD8B3, 0, 0xCBAC, 0, 0xE3DD, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC6AC, /* 0x40 */
+ 0xB0E6, 0, 0, 0, 0xC5C6, 0xEBB9, 0, 0, /* 0x40 */
+ 0, 0, 0xEBBA, 0, 0, 0, 0xEBBB, 0, /* 0x50 */
+ 0, 0xD1C0, 0, 0xC5A3, 0, 0xEAF2, 0, 0xC4B2, /* 0x50 */
+ 0, 0xC4B5, 0xC0CE, 0, 0, 0, 0xEAF3, 0xC4C1, /* 0x60 */
+ 0, 0xCEEF, 0, 0, 0, 0, 0xEAF0, 0xEAF4, /* 0x60 */
+ 0, 0, 0xC9FC, 0, 0, 0xC7A3, 0, 0, /* 0x70 */
+ 0, 0xCCD8, 0xCEFE, 0, 0, 0, 0xEAF5, 0xEAF6, /* 0x70 */
+ 0xCFAC, 0xC0E7, 0, 0, 0xEAF7, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xB6BF, 0xEAF8, 0, 0xEAF9, 0, 0xEAFA, /* 0x80 */
+ 0, 0, 0xEAFB, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEAF1, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xC8AE, 0xE1EB, 0, 0xB7B8, /* 0xA0 */
+ 0xE1EC, 0, 0, 0, 0xE1ED, 0, 0xD7B4, 0xE1EE, /* 0xB0 */
+ 0xE1EF, 0xD3CC, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE1F1, 0xBFF1, 0xE1F0, 0xB5D2, 0, 0, 0, /* 0xC0 */
+ 0xB1B7, 0, 0, 0, 0, 0xE1F3, 0xE1F2, 0, /* 0xC0 */
+ 0xBAFC, 0, 0xE1F4, 0, 0, 0, 0, 0xB9B7, /* 0xD0 */
+ 0, 0xBED1, 0, 0, 0, 0, 0xC4FC, 0, /* 0xD0 */
+ 0xBADD, 0xBDC6, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE1F5, 0xE1F7, 0, 0, 0xB6C0, 0xCFC1, 0xCAA8, 0xE1F6, /* 0xE0 */
+ 0xD5F8, 0xD3FC, 0xE1F8, 0xE1FC, 0xE1F9, 0, 0, 0xE1FA, /* 0xF0 */
+ 0xC0EA, 0, 0xE1FE, 0xE2A1, 0xC0C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1FB, 0, 0xE1FD, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE2A5, 0, 0, 0, 0xC1D4, 0, /* 0x00 */
+ 0, 0, 0, 0xE2A3, 0, 0xE2A8, 0xB2FE, 0xE2A2, /* 0x10 */
+ 0, 0, 0, 0xC3CD, 0xB2C2, 0xE2A7, 0xE2A6, 0, /* 0x10 */
+ 0, 0xE2A4, 0xE2A9, 0, 0, 0xE2AB, 0, 0, /* 0x20 */
+ 0, 0xD0C9, 0xD6ED, 0xC3A8, 0xE2AC, 0, 0xCFD7, 0, /* 0x20 */
+ 0, 0xE2AE, 0, 0, 0xBAEF, 0, 0, 0xE9E0, /* 0x30 */
+ 0xE2AD, 0xE2AA, 0, 0, 0, 0, 0xBBAB, 0xD4B3, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE2B0, 0, 0, /* 0x40 */
+ 0xE2AF, 0, 0xE9E1, 0, 0, 0, 0, 0xE2B1, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE2B2, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE2B3, 0xCCA1, 0, 0xE2B4, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE2B5, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xD0FE, 0, 0, 0xC2CA, /* 0x80 */
+ 0, 0xD3F1, 0, 0xCDF5, 0, 0, 0xE7E0, 0, /* 0x80 */
+ 0, 0xE7E1, 0, 0, 0, 0, 0xBEC1, 0, /* 0x90 */
+ 0, 0, 0, 0xC2EA, 0, 0, 0, 0xE7E4, /* 0x90 */
+ 0, 0, 0xE7E3, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xCDE6, 0, 0xC3B5, 0, 0, 0xE7E2, 0xBBB7, /* 0xA0 */
+ 0xCFD6, 0, 0xC1E1, 0xE7E9, 0, 0, 0, 0xE7E8, /* 0xB0 */
+ 0, 0, 0xE7F4, 0xB2A3, 0, 0, 0, 0, /* 0xB0 */
+ 0xE7EA, 0, 0xE7E6, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xE7EC, 0xE7EB, 0xC9BA, 0, 0, 0xD5E4, 0, 0xE7E5, /* 0xC0 */
+ 0xB7A9, 0xE7E7, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE7EE, 0, 0, 0, 0, 0xE7F3, 0, /* 0xD0 */
+ 0xD6E9, 0, 0, 0, 0, 0xE7ED, 0, 0xE7F2, /* 0xE0 */
+ 0, 0xE7F1, 0, 0, 0, 0xB0E0, 0, 0, /* 0xE0 */
+ 0, 0, 0xE7F5 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7F2, 0, 0xC0C5, 0xC0ED, 0, /* 0x00 */
+ 0, 0xC1F0, 0xE7F0, 0, 0, 0, 0, 0xE7F6, /* 0x00 */
+ 0xCBF6, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xE8A2, 0xE8A1, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xD7C1, 0, 0, 0xE7FA, 0xE7F9, 0, /* 0x20 */
+ 0xE7FB, 0, 0xE7F7, 0, 0xE7FE, 0, 0xE7FD, 0, /* 0x20 */
+ 0xE7FC, 0, 0, 0xC1D5, 0xC7D9, 0xC5FD, 0xC5C3, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xC7ED, 0, 0, 0, /* 0x30 */
+ 0, 0xE8A3, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE8A6, 0, 0xE8A5, /* 0x50 */
+ 0, 0xE8A7, 0xBAF7, 0xE7F8, 0xE8A4, 0, 0xC8F0, 0xC9AA, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE8A9, 0, 0, /* 0x60 */
+ 0xB9E5, 0, 0, 0, 0, 0, 0xD1FE, 0xE8A8, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE8AA, 0, /* 0x70 */
+ 0xE8AD, 0xE8AE, 0, 0xC1A7, 0, 0, 0, 0xE8AF, /* 0x80 */
+ 0, 0, 0, 0xE8B0, 0, 0, 0xE8AC, 0, /* 0x80 */
+ 0xE8B4, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE8AB, 0, 0xE8B1, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8B5, /* 0xA0 */
+ 0xE8B2, 0xE8B3, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE8B7, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE8B6, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xB9CF, 0, 0xF0AC, 0, /* 0xD0 */
+ 0xF0AD, 0, 0xC6B0, 0xB0EA, 0xC8BF, 0, 0xCDDF, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xCECD, 0xEAB1, /* 0xE0 */
+ 0, 0, 0, 0, 0xEAB2, 0, 0xC6BF, 0xB4C9, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEAB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD5E7, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xDDF9, 0, 0xEAB4, /* 0x00 */
+ 0, 0xEAB5, 0, 0xEAB6, 0, 0, 0, 0, /* 0x10 */
+ 0xB8CA, 0xDFB0, 0xC9F5, 0, 0xCCF0, 0, 0, 0xC9FA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xC9FB, 0, 0, /* 0x20 */
+ 0xD3C3, 0xCBA6, 0, 0xB8A6, 0xF0AE, 0xB1C2, 0, 0xE5B8, /* 0x20 */
+ 0xCCEF, 0xD3C9, 0xBCD7, 0xC9EA, 0, 0xB5E7, 0, 0xC4D0, /* 0x30 */
+ 0xB5E9, 0, 0xEEAE, 0xBBAD, 0, 0, 0xE7DE, 0, /* 0x30 */
+ 0xEEAF, 0, 0, 0, 0, 0xB3A9, 0, 0, /* 0x40 */
+ 0xEEB2, 0, 0, 0xEEB1, 0xBDE7, 0, 0xEEB0, 0xCEB7, /* 0x40 */
+ 0, 0, 0, 0, 0xC5CF, 0, 0, 0, /* 0x50 */
+ 0, 0xC1F4, 0xDBCE, 0xEEB3, 0xD0F3, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xC2D4, 0xC6E8, 0, /* 0x60 */
+ 0, 0, 0xB7AC, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xEEB4, 0, 0xB3EB, 0, 0, 0, /* 0x70 */
+ 0xBBFB, 0xEEB5, 0, 0, 0, 0, 0, 0xE7DC, /* 0x70 */
+ 0, 0, 0, 0xEEB6, 0, 0, 0xBDAE, 0, /* 0x80 */
+ 0, 0, 0, 0xF1E2, 0, 0, 0, 0xCAE8, /* 0x80 */
+ 0, 0xD2C9, 0xF0DA, 0, 0xF0DB, 0, 0xF0DC, 0xC1C6, /* 0x90 */
+ 0, 0xB8ED, 0xBECE, 0, 0, 0xF0DE, 0, 0xC5B1, /* 0x90 */
+ 0xF0DD, 0xD1F1, 0, 0xF0E0, 0xB0CC, 0xBDEA, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xD2DF, 0xF0DF, 0, 0xB4AF, 0xB7E8, /* 0xA0 */
+ 0xF0E6, 0xF0E5, 0xC6A3, 0xF0E1, 0xF0E2, 0xB4C3, 0, 0, /* 0xB0 */
+ 0xF0E3, 0xD5EE, 0, 0, 0xCCDB, 0xBED2, 0xBCB2, 0, /* 0xB0 */
+ 0, 0, 0xF0E8, 0xF0E7, 0xF0E4, 0xB2A1, 0, 0xD6A2, /* 0xC0 */
+ 0xD3B8, 0xBEB7, 0xC8AC, 0, 0, 0xF0EA, 0, 0, /* 0xC0 */
+ 0, 0, 0xD1F7, 0, 0xD6CC, 0xBADB, 0xF0E9, 0, /* 0xD0 */
+ 0xB6BB, 0, 0, 0xCDB4, 0, 0, 0xC6A6, 0, /* 0xD0 */
+ 0, 0, 0xC1A1, 0xF0EB, 0xF0EE, 0, 0xF0ED, 0xF0F0, /* 0xE0 */
+ 0xF0EC, 0, 0xBBBE, 0xF0EF, 0, 0, 0, 0, /* 0xE0 */
+ 0xCCB5, 0xF0F2, 0, 0, 0xB3D5, 0, 0, 0, /* 0xF0 */
+ 0, 0xB1D4, 0, 0, 0xF0F3, 0, 0, 0xF0F4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0F6, 0xB4E1, 0, 0xF0F1, 0, 0xF0F7, 0, 0, /* 0x00 */
+ 0, 0, 0xF0FA, 0, 0xF0F8, 0, 0, 0, /* 0x00 */
+ 0xF0F5, 0, 0, 0, 0, 0xF0FD, 0, 0xF0F9, /* 0x10 */
+ 0xF0FC, 0xF0FE, 0, 0xF1A1, 0, 0, 0, 0xCEC1, /* 0x10 */
+ 0xF1A4, 0, 0xF1A3, 0, 0xC1F6, 0xF0FB, 0xCADD, 0, /* 0x20 */
+ 0, 0xB4F1, 0xB1F1, 0xCCB1, 0, 0xF1A6, 0, 0, /* 0x20 */
+ 0xF1A7, 0, 0, 0xF1AC, 0xD5CE, 0xF1A9, 0, 0, /* 0x30 */
+ 0xC8B3, 0, 0, 0, 0xF1A2, 0, 0xF1AB, 0xF1A8, /* 0x30 */
+ 0xF1A5, 0, 0, 0xF1AA, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xB0A9, 0xF1AD, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF1AF, 0, 0xF1B1, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xF1B0, 0, 0xF1AE, 0, /* 0x50 */
+ 0, 0, 0, 0xD1A2, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xF1B2, 0, 0, 0, 0xF1B3, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xB9EF, 0, 0, 0xB5C7, 0, 0xB0D7, 0xB0D9, 0, /* 0x70 */
+ 0, 0, 0xD4ED, 0, 0xB5C4, 0, 0xBDD4, 0xBBCA, /* 0x80 */
+ 0xF0A7, 0, 0, 0xB8DE, 0, 0, 0xF0A8, 0, /* 0x80 */
+ 0, 0xB0A8, 0, 0xF0A9, 0, 0, 0xCDEE, 0, /* 0x90 */
+ 0, 0xF0AA, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF0AB, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xC6A4, 0, /* 0xA0 */
+ 0, 0xD6E5, 0xF1E4, 0, 0xF1E5, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC3F3, /* 0xB0 */
+ 0, 0, 0xD3DB, 0, 0, 0xD6D1, 0xC5E8, 0, /* 0xC0 */
+ 0xD3AF, 0, 0xD2E6, 0, 0, 0xEEC1, 0xB0BB, 0xD5B5, /* 0xC0 */
+ 0xD1CE, 0xBCE0, 0xBAD0, 0, 0xBFF8, 0, 0xB8C7, 0xB5C1, /* 0xD0 */
+ 0xC5CC, 0, 0, 0xCAA2, 0, 0, 0, 0xC3CB, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xEEC2, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xC4BF, 0xB6A2, /* 0xE0 */
+ 0, 0xEDEC, 0xC3A4, 0, 0xD6B1, 0, 0, 0, /* 0xF0 */
+ 0xCFE0, 0xEDEF, 0, 0, 0xC5CE, 0, 0xB6DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCAA1, 0, 0, 0xEDED, 0, 0, 0xEDF0, /* 0x00 */
+ 0xEDF1, 0xC3BC, 0, 0xBFB4, 0, 0xEDEE, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xEDF4, 0xEDF2, 0, 0, 0, 0, 0xD5E6, /* 0x10 */
+ 0xC3DF, 0, 0xEDF3, 0, 0, 0, 0xEDF6, 0, /* 0x20 */
+ 0xD5A3, 0xD1A3, 0, 0, 0, 0xEDF5, 0, 0xC3D0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xEDF7, 0xBFF4, 0xBEEC, /* 0x30 */
+ 0xEDF8, 0, 0xCCF7, 0, 0xD1DB, 0, 0, 0, /* 0x30 */
+ 0xD7C5, 0xD5F6, 0, 0xEDFC, 0, 0, 0, 0xEDFB, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEDF9, 0xEDFA, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xEDFD, 0xBEA6, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCBAF, 0xEEA1, 0xB6BD, 0, 0xEEA2, 0xC4C0, 0, /* 0x60 */
+ 0xEDFE, 0, 0, 0xBDDE, 0xB2C7, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB6C3, 0, 0, 0, 0xEEA5, 0xD8BA, 0xEEA3, /* 0x70 */
+ 0xEEA6, 0, 0, 0, 0xC3E9, 0xB3F2, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xEEA7, 0xEEA4, 0xCFB9, 0, /* 0x80 */
+ 0, 0xEEA8, 0xC2F7, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEEA9, /* 0x90 */
+ 0xEEAA, 0, 0xDEAB, 0, 0, 0xC6B3, 0, 0xC7C6, /* 0xA0 */
+ 0, 0xD6F5, 0xB5C9, 0, 0xCBB2, 0, 0, 0, /* 0xA0 */
+ 0xEEAB, 0, 0, 0xCDAB, 0, 0xEEAC, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xD5B0, 0, 0xEEAD, 0, 0xF6C4, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xDBC7, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB4A3, /* 0xD0 */
+ 0, 0, 0, 0xC3AC, 0xF1E6, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xCAB8, 0xD2D3, 0, 0xD6AA, 0, 0xEFF2, /* 0xE0 */
+ 0, 0xBED8, 0, 0xBDC3, 0xEFF3, 0xB6CC, 0xB0AB, 0, /* 0xE0 */
+ 0, 0, 0, 0xCAAF, 0, 0, 0xEDB6, 0, /* 0xF0 */
+ 0xEDB7, 0, 0, 0, 0, 0xCEF9, 0xB7AF, 0xBFF3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDB8, 0xC2EB, 0xC9B0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xEDB9, 0, 0, 0xC6F6, 0xBFB3, 0, 0, /* 0x00 */
+ 0, 0xEDBC, 0xC5F8, 0, 0xD1D0, 0, 0xD7A9, 0xEDBA, /* 0x10 */
+ 0xEDBB, 0, 0xD1E2, 0, 0xEDBF, 0xEDC0, 0, 0xEDC4, /* 0x10 */
+ 0, 0, 0, 0xEDC8, 0, 0xEDC6, 0xEDCE, 0xD5E8, /* 0x20 */
+ 0, 0xEDC9, 0, 0, 0xEDC7, 0xEDBE, 0, 0, /* 0x20 */
+ 0xC5E9, 0, 0, 0, 0xC6C6, 0, 0, 0xC9E9, /* 0x30 */
+ 0xD4D2, 0xEDC1, 0xEDC2, 0xEDC3, 0xEDC5, 0, 0xC0F9, 0, /* 0x30 */
+ 0xB4A1, 0, 0, 0, 0, 0xB9E8, 0, 0xEDD0, /* 0x40 */
+ 0, 0, 0, 0, 0xEDD1, 0, 0xEDCA, 0, /* 0x40 */
+ 0xEDCF, 0, 0xCEF8, 0, 0, 0xCBB6, 0xEDCC, 0xEDCD, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xCFF5, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xEDD2, 0xC1F2, 0xD3B2, 0xEDCB, 0xC8B7, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xBCEF, /* 0x70 */
+ 0, 0, 0, 0, 0xC5F0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEDD6, /* 0x80 */
+ 0, 0xB5EF, 0, 0, 0xC2B5, 0xB0AD, 0xCBE9, 0, /* 0x80 */
+ 0, 0xB1AE, 0, 0xEDD4, 0, 0, 0, 0xCDEB, /* 0x90 */
+ 0xB5E2, 0, 0xEDD5, 0xEDD3, 0xEDD7, 0, 0, 0xB5FA, /* 0x90 */
+ 0, 0xEDD8, 0, 0xEDD9, 0, 0xEDDC, 0, 0xB1CC, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xC5F6, 0xBCEE, 0xEDDA, 0xCCBC, 0xB2EA, 0, 0, 0, /* 0xB0 */
+ 0, 0xEDDB, 0, 0, 0, 0, 0xC4EB, 0, /* 0xB0 */
+ 0, 0xB4C5, 0, 0, 0, 0xB0F5, 0, 0, /* 0xC0 */
+ 0, 0xEDDF, 0xC0DA, 0xB4E8, 0, 0, 0, 0, /* 0xC0 */
+ 0xC5CD, 0, 0, 0, 0xEDDD, 0xBFC4, 0, 0, /* 0xD0 */
+ 0, 0xEDDE, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xC4A5, 0, 0, 0, 0xEDE0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xEDE1, 0, 0xEDE3, 0, 0, 0xC1D7, /* 0xF0 */
+ 0, 0, 0xBBC7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDB8, 0, 0, 0, 0xEDE2, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xEDE4, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xEDE6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xEDE5, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xEDE7, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xCABE, 0xECEA, 0xC0F1, 0, 0xC9E7, 0, /* 0x30 */
+ 0xECEB, 0xC6EE, 0, 0, 0, 0, 0xECEC, 0, /* 0x40 */
+ 0xC6ED, 0xECED, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xECF0, 0, 0, 0xD7E6, 0xECF3, /* 0x50 */
+ 0, 0, 0xECF1, 0xECEE, 0xECEF, 0xD7A3, 0xC9F1, 0xCBEE, /* 0x50 */
+ 0xECF4, 0, 0xECF2, 0, 0, 0xCFE9, 0, 0xECF6, /* 0x60 */
+ 0xC6B1, 0, 0, 0, 0, 0xBCC0, 0, 0xECF5, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB5BB, /* 0x70 */
+ 0xBBF6, 0, 0xECF7, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xD9F7, 0xBDFB, 0, 0, 0xC2BB, 0xECF8, 0, 0, /* 0x80 */
+ 0, 0, 0xECF9, 0, 0, 0, 0, 0xB8A3, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xECFA, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xECFB, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xECFC, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xD3ED, 0xD8AE, 0xC0EB, 0, 0xC7DD, 0xBACC, 0, /* 0xB0 */
+ 0xD0E3, 0xCBBD, 0, 0xCDBA, 0, 0, 0xB8D1, 0, /* 0xC0 */
+ 0, 0xB1FC, 0, 0xC7EF, 0, 0xD6D6, 0, 0, /* 0xC0 */
+ 0, 0xBFC6, 0xC3EB, 0, 0, 0xEFF5, 0, 0, /* 0xD0 */
+ 0xC3D8, 0, 0, 0, 0, 0, 0, 0xD7E2, /* 0xD0 */
+ 0, 0, 0, 0xEFF7, 0xB3D3, 0, 0xC7D8, 0xD1ED, /* 0xE0 */
+ 0, 0xD6C8, 0, 0xEFF8, 0, 0xEFF6, 0, 0xBBFD, /* 0xE0 */
+ 0xB3C6, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xBDD5, 0, 0, 0xD2C6, 0, 0xBBE0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFA1, 0, 0xEFFC, 0xEFFB, 0, 0, 0xEFF9, 0, /* 0x00 */
+ 0, 0, 0, 0xB3CC, 0, 0xC9D4, 0xCBB0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xEFFE, 0, 0, 0xB0DE, /* 0x10 */
+ 0, 0, 0xD6C9, 0, 0, 0, 0xEFFD, 0, /* 0x10 */
+ 0xB3ED, 0, 0, 0xF6D5, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xCEC8, 0, 0, 0, 0xF0A2, /* 0x30 */
+ 0, 0xF0A1, 0, 0xB5BE, 0xBCDA, 0xBBFC, 0, 0xB8E5, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xC4C2, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF0A3, 0, 0, 0, 0, 0, 0xCBEB, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xF0A6, 0, 0, 0, 0xD1A8, 0, 0xBEBF, 0xC7EE, /* 0x70 */
+ 0xF1B6, 0xF1B7, 0xBFD5, 0, 0, 0, 0, 0xB4A9, /* 0x70 */
+ 0xF1B8, 0xCDBB, 0, 0xC7D4, 0xD5AD, 0, 0xF1B9, 0, /* 0x80 */
+ 0xF1BA, 0, 0, 0, 0, 0xC7CF, 0, 0, /* 0x80 */
+ 0, 0xD2A4, 0xD6CF, 0, 0, 0xF1BB, 0xBDD1, 0xB4B0, /* 0x90 */
+ 0xBEBD, 0, 0, 0, 0xB4DC, 0xCED1, 0, 0xBFDF, /* 0x90 */
+ 0xF1BD, 0, 0, 0, 0, 0xBFFA, 0xF1BC, 0, /* 0xA0 */
+ 0xF1BF, 0, 0, 0, 0xF1BE, 0xF1C0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF1C1, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC1FE, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xC1A2, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xCAFA, 0, /* 0xD0 */
+ 0, 0xD5BE, 0, 0, 0, 0, 0xBEBA, 0xBEB9, /* 0xD0 */
+ 0xD5C2, 0, 0, 0xBFA2, 0, 0xCDAF, 0xF1B5, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xBDDF, 0, 0xB6CB, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xD6F1, 0xF3C3, 0, 0, 0xF3C4, 0, 0xB8CD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF3C6, 0xF3C7, 0, 0xB0CA, 0, /* 0x00 */
+ 0xF3C5, 0, 0xF3C9, 0xCBF1, 0, 0, 0, 0xF3CB, /* 0x00 */
+ 0, 0xD0A6, 0, 0, 0xB1CA, 0xF3C8, 0, 0, /* 0x10 */
+ 0, 0xF3CF, 0, 0xB5D1, 0, 0, 0xF3D7, 0, /* 0x10 */
+ 0xF3D2, 0, 0, 0, 0xF3D4, 0xF3D3, 0xB7FB, 0, /* 0x20 */
+ 0xB1BF, 0, 0xF3CE, 0xF3CA, 0xB5DA, 0, 0xF3D0, 0, /* 0x20 */
+ 0, 0xF3D1, 0, 0xF3D5, 0, 0, 0, 0, /* 0x30 */
+ 0xF3CD, 0, 0xBCE3, 0, 0xC1FD, 0, 0xF3D6, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF3DA, 0, 0xF3CC, /* 0x40 */
+ 0, 0xB5C8, 0, 0xBDEE, 0xF3DC, 0, 0, 0xB7A4, /* 0x40 */
+ 0xBFF0, 0xD6FE, 0xCDB2, 0, 0xB4F0, 0, 0xB2DF, 0, /* 0x50 */
+ 0xF3D8, 0, 0xF3D9, 0xC9B8, 0, 0xF3DD, 0, 0, /* 0x50 */
+ 0xF3DE, 0, 0xF3E1, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xF3DF, 0, /* 0x60 */
+ 0, 0xF3E3, 0xF3E2, 0, 0, 0xF3DB, 0, 0xBFEA, /* 0x70 */
+ 0, 0xB3EF, 0, 0xF3E0, 0, 0, 0xC7A9, 0, /* 0x70 */
+ 0xBCF2, 0, 0, 0, 0, 0xF3EB, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xB9BF, 0, 0, /* 0x80 */
+ 0xF3E4, 0, 0, 0, 0xB2AD, 0xBBFE, 0, 0xCBE3, /* 0x90 */
+ 0, 0, 0, 0, 0xF3ED, 0xF3E9, 0, 0, /* 0x90 */
+ 0, 0xB9DC, 0xF3EE, 0, 0, 0, 0xF3E5, 0xF3E6, /* 0xA0 */
+ 0xF3EA, 0xC2E1, 0xF3EC, 0xF3EF, 0xF3E8, 0xBCFD, 0, 0, /* 0xA0 */
+ 0, 0xCFE4, 0, 0, 0xF3F0, 0, 0, 0, /* 0xB0 */
+ 0xF3E7, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xF3F2, 0, 0, 0, 0, 0xD7AD, 0xC6AA, /* 0xC0 */
+ 0, 0, 0, 0, 0xF3F3, 0, 0, 0, /* 0xC0 */
+ 0, 0xF3F1, 0, 0xC2A8, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xB8DD, 0xF3F5, 0, 0, 0xF3F4, 0, 0, /* 0xD0 */
+ 0, 0xB4DB, 0, 0, 0, 0xF3F6, 0xF3F7, 0, /* 0xE0 */
+ 0, 0, 0xF3F8, 0, 0, 0, 0xC0BA, 0, /* 0xE0 */
+ 0, 0xC0E9, 0, 0, 0, 0, 0, 0xC5F1, /* 0xF0 */
+ 0, 0, 0, 0, 0xF3FB, 0, 0xF3FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB4D8, /* 0x00 */
+ 0, 0, 0, 0xF3FE, 0xF3F9, 0, 0, 0xF3FC, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xF3FD, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF4A1, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xF4A3, 0xBBC9, /* 0x20 */
+ 0, 0, 0xF4A2, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xF4A4, 0, 0, 0, 0, 0, 0, 0xB2BE, /* 0x30 */
+ 0xF4A6, 0xF4A5, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xBCAE, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xC3D7, 0xD9E1, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0xC0E0, 0xF4CC, 0xD7D1, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xB7DB, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF4CE, 0xC1A3, 0, 0, 0xC6C9, 0, 0xB4D6, /* 0x90 */
+ 0xD5B3, 0, 0, 0, 0xF4D0, 0xF4CF, 0xF4D1, 0xCBDA, /* 0x90 */
+ 0, 0, 0xF4D2, 0, 0xD4C1, 0xD6E0, 0, 0, /* 0xA0 */
+ 0, 0, 0xB7E0, 0, 0, 0, 0xC1B8, 0, /* 0xA0 */
+ 0, 0xC1BB, 0xF4D3, 0xBEAC, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xB4E2, 0, 0, 0xF4D4, 0xF4D5, 0xBEAB, 0, /* 0xB0 */
+ 0, 0xF4D6, 0, 0, 0, 0xF4DB, 0, 0xF4D7, /* 0xC0 */
+ 0xF4DA, 0, 0xBAFD, 0, 0xF4D8, 0xF4D9, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xB8E2, 0xCCC7, 0xF4DC, /* 0xD0 */
+ 0, 0xB2DA, 0, 0, 0xC3D3, 0, 0, 0xD4E3, /* 0xD0 */
+ 0xBFB7, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF4DD, 0, 0, 0, 0, 0, 0, 0xC5B4, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xF4E9, 0, 0, 0xCFB5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xCEC9, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xCBD8, 0, 0xCBF7, 0, 0, 0, 0, 0xBDF4, /* 0x20 */
+ 0, 0, 0, 0xD7CF, 0, 0, 0, 0xC0DB, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xD0F5, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF4EA, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xF4EB, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xF4EC /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x30 */
+ 0xF7E3, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xB7B1, 0, 0, 0, 0, 0, 0xF4ED, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xD7EB, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF4EE, 0, 0, 0, 0xE6F9, /* 0x90 */
+ 0xBEC0, 0xE6FA, 0xBAEC, 0xE6FB, 0xCFCB, 0xE6FC, 0xD4BC, 0xBCB6, /* 0xA0 */
+ 0xE6FD, 0xE6FE, 0xBCCD, 0xC8D2, 0xCEB3, 0xE7A1, 0, 0xB4BF, /* 0xA0 */
+ 0xE7A2, 0xC9B4, 0xB8D9, 0xC4C9, 0, 0xD7DD, 0xC2DA, 0xB7D7, /* 0xB0 */
+ 0xD6BD, 0xCEC6, 0xB7C4, 0, 0, 0xC5A6, 0xE7A3, 0xCFDF, /* 0xB0 */
+ 0xE7A4, 0xE7A5, 0xE7A6, 0xC1B7, 0xD7E9, 0xC9F0, 0xCFB8, 0xD6AF, /* 0xC0 */
+ 0xD6D5, 0xE7A7, 0xB0ED, 0xE7A8, 0xE7A9, 0xC9DC, 0xD2EF, 0xBEAD, /* 0xC0 */
+ 0xE7AA, 0xB0F3, 0xC8DE, 0xBDE1, 0xE7AB, 0xC8C6, 0, 0xE7AC, /* 0xD0 */
+ 0xBBE6, 0xB8F8, 0xD1A4, 0xE7AD, 0xC2E7, 0xBEF8, 0xBDCA, 0xCDB3, /* 0xD0 */
+ 0xE7AE, 0xE7AF, 0xBEEE, 0xD0E5, 0, 0xCBE7, 0xCCD0, 0xBCCC, /* 0xE0 */
+ 0xE7B0, 0xBCA8, 0xD0F7, 0xE7B1, 0, 0xD0F8, 0xE7B2, 0xE7B3, /* 0xE0 */
+ 0xB4C2, 0xE7B4, 0xE7B5, 0xC9FE, 0xCEAC, 0xC3E0, 0xE7B7, 0xB1C1, /* 0xF0 */
+ 0xB3F1, 0, 0xE7B8, 0xE7B9, 0xD7DB, 0xD5C0, 0xE7BA, 0xC2CC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7BA, 0xE7BB, 0xE7BC, 0xE7BD, 0xBCEA, 0xC3E5, 0xC0C2, 0xE7BE, /* 0x00 */
+ 0xE7BF, 0xBCA9, 0, 0xE7C0, 0xE7C1, 0xE7B6, 0xB6D0, 0xE7C2, /* 0x00 */
+ 0, 0xE7C3, 0xE7C4, 0xBBBA, 0xB5DE, 0xC2C6, 0xB1E0, 0xE7C5, /* 0x10 */
+ 0xD4B5, 0xE7C6, 0xB8BF, 0xE7C8, 0xE7C7, 0xB7EC, 0, 0xE7C9, /* 0x10 */
+ 0xB2F8, 0xE7CA, 0xE7CB, 0xE7CC, 0xE7CD, 0xE7CE, 0xE7CF, 0xE7D0, /* 0x20 */
+ 0xD3A7, 0xCBF5, 0xE7D1, 0xE7D2, 0xE7D3, 0xE7D4, 0xC9C9, 0xE7D5, /* 0x20 */
+ 0xE7D6, 0xE7D7, 0xE7D8, 0xE7D9, 0xBDC9, 0xE7DA, 0xF3BE, 0, /* 0x30 */
+ 0xB8D7, 0, 0xC8B1, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xF3BF, 0, 0xF3C0, 0xF3C1, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xB9DE, 0xCDF8, 0, 0, 0xD8E8, 0xBAB1, 0, 0xC2DE, /* 0x50 */
+ 0xEEB7, 0, 0xB7A3, 0, 0, 0, 0, 0xEEB9, /* 0x50 */
+ 0, 0xEEB8, 0xB0D5, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xEEBB, 0xD5D6, 0xD7EF, 0, 0, 0, 0xD6C3, 0, /* 0x60 */
+ 0, 0xEEBD, 0xCAF0, 0, 0xEEBC, 0, 0, 0, /* 0x70 */
+ 0, 0xEEBE, 0, 0, 0, 0, 0xEEC0, 0, /* 0x70 */
+ 0, 0xEEBF, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD1F2, 0, 0xC7BC, 0, 0xC3C0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xB8E1, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xC1E7, 0, 0, 0xF4C6, 0xD0DF, 0xF4C7, /* 0x90 */
+ 0, 0xCFDB, 0, 0, 0xC8BA, 0, 0, 0xF4C8, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF4C9, /* 0xA0 */
+ 0xF4CA, 0, 0xF4CB, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xD9FA, 0xB8FE, 0, 0, 0xE5F1, 0xD3F0, 0, 0xF4E0, /* 0xB0 */
+ 0, 0xCECC, 0, 0, 0, 0xB3E1, 0, 0, /* 0xC0 */
+ 0, 0, 0xF1B4, 0, 0xD2EE, 0, 0xF4E1, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xCFE8, 0xF4E2, 0, 0, /* 0xD0 */
+ 0xC7CC, 0, 0, 0, 0, 0, 0, 0xB5D4, /* 0xD0 */
+ 0xB4E4, 0xF4E4, 0, 0, 0, 0xF4E3, 0xF4E5, 0, /* 0xE0 */
+ 0, 0xF4E6, 0, 0, 0, 0, 0xF4E7, 0, /* 0xE0 */
+ 0xBAB2, 0xB0BF, 0, 0xF4E8, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xB7AD, 0xD2ED /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2AB, 0xC0CF, 0, 0xBFBC, 0xEBA3, 0xD5DF, 0xEAC8, 0, /* 0x00 */
+ 0, 0, 0, 0xF1F3, 0xB6F8, 0xCBA3, 0, 0, /* 0x00 */
+ 0xC4CD, 0, 0xF1E7, 0, 0xF1E8, 0xB8FB, 0xF1E9, 0xBAC4, /* 0x10 */
+ 0xD4C5, 0xB0D2, 0, 0, 0xF1EA, 0, 0, 0, /* 0x10 */
+ 0xF1EB, 0, 0xF1EC, 0, 0, 0xF1ED, 0xF1EE, 0xF1EF, /* 0x20 */
+ 0xF1F1, 0xF1F0, 0xC5D5, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xF1F2, 0, 0xB6FA, 0, 0xF1F4, 0xD2AE, 0xDEC7, /* 0x30 */
+ 0xCBCA, 0, 0, 0xB3DC, 0, 0xB5A2, 0, 0xB9A2, /* 0x30 */
+ 0, 0, 0xC4F4, 0xF1F5, 0, 0, 0xF1F6, 0, /* 0x40 */
+ 0, 0, 0xC1C4, 0xC1FB, 0xD6B0, 0xF1F7, 0, 0, /* 0x40 */
+ 0, 0, 0xF1F8, 0, 0xC1AA, 0, 0, 0, /* 0x50 */
+ 0xC6B8, 0, 0xBEDB, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xF1F9, 0xB4CF, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xF1FA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEDB2, /* 0x70 */
+ 0xEDB1, 0, 0, 0xCBE0, 0xD2DE, 0, 0xCBC1, 0xD5D8, /* 0x80 */
+ 0, 0xC8E2, 0, 0xC0DF, 0xBCA1, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xEBC1, 0, 0, 0xD0A4, 0, /* 0x90 */
+ 0xD6E2, 0, 0xB6C7, 0xB8D8, 0xEBC0, 0xB8CE, 0, 0xEBBF, /* 0x90 */
+ 0xB3A6, 0xB9C9, 0xD6AB, 0, 0xB7F4, 0xB7CA, 0, 0, /* 0xA0 */
+ 0, 0xBCE7, 0xB7BE, 0xEBC6, 0, 0xEBC7, 0xB0B9, 0xBFCF, /* 0xA0 */
+ 0, 0xEBC5, 0xD3FD, 0, 0xEBC8, 0, 0, 0xEBC9, /* 0xB0 */
+ 0, 0, 0xB7CE, 0, 0xEBC2, 0xEBC4, 0xC9F6, 0xD6D7, /* 0xB0 */
+ 0xD5CD, 0xD0B2, 0xEBCF, 0xCEB8, 0xEBD0, 0, 0xB5A8, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xB1B3, 0xEBD2, 0xCCA5, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xC5D6, 0xEBD3, /* 0xD0 */
+ 0, 0xEBD1, 0xC5DF, 0xEBCE, 0xCAA4, 0xEBD5, 0xB0FB, 0, /* 0xD0 */
+ 0, 0xBAFA, 0, 0, 0xD8B7, 0xF1E3, 0, 0xEBCA, /* 0xE0 */
+ 0xEBCB, 0xEBCC, 0xEBCD, 0xEBD6, 0xE6C0, 0xEBD9, 0, 0xBFE8, /* 0xE0 */
+ 0xD2C8, 0xEBD7, 0xEBDC, 0xB8EC, 0xEBD8, 0, 0xBDBA, 0, /* 0xF0 */
+ 0xD0D8, 0, 0xB0B7, 0, 0xEBDD, 0xC4DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD6AC, 0, 0, 0, 0xB4E0, 0, /* 0x00 */
+ 0, 0xC2F6, 0xBCB9, 0, 0, 0xEBDA, 0xEBDB, 0xD4E0, /* 0x00 */
+ 0xC6EA, 0xC4D4, 0xEBDF, 0xC5A7, 0xD9F5, 0, 0xB2B1, 0, /* 0x10 */
+ 0xEBE4, 0, 0xBDC5, 0, 0, 0, 0xEBE2, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xEBE3, 0, 0, 0xB8AC, /* 0x20 */
+ 0, 0xCDD1, 0xEBE5, 0, 0, 0, 0xEBE1, 0, /* 0x30 */
+ 0xC1B3, 0, 0, 0, 0, 0, 0xC6A2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xCCF3, 0, /* 0x40 */
+ 0xEBE6, 0, 0xC0B0, 0xD2B8, 0xEBE7, 0, 0, 0, /* 0x40 */
+ 0xB8AF, 0xB8AD, 0, 0xEBE8, 0xC7BB, 0xCDF3, 0, 0, /* 0x50 */
+ 0, 0xEBEA, 0xEBEB, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xEBED, 0, 0, 0, 0, 0xD0C8, 0, 0xEBF2, /* 0x60 */
+ 0, 0xEBEE, 0, 0, 0, 0xEBF1, 0xC8F9, 0, /* 0x60 */
+ 0xD1FC, 0xEBEC, 0, 0, 0xEBE9, 0, 0, 0, /* 0x70 */
+ 0, 0xB8B9, 0xCFD9, 0xC4E5, 0xEBEF, 0xEBF0, 0xCCDA, 0xCDC8, /* 0x70 */
+ 0xB0F2, 0, 0xEBF6, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xEBF5, 0, 0xB2B2, 0, 0, 0, 0, 0xB8E0, /* 0x80 */
+ 0, 0xEBF7, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xB1EC, 0, 0, 0xCCC5, 0xC4A4, 0xCFA5, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xEBF9, 0, 0, 0xECA2, 0, /* 0xA0 */
+ 0xC5F2, 0, 0xEBFA, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xC9C5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE2DF, 0xEBFE, 0, 0, 0, 0, /* 0xB0 */
+ 0xCDCE, 0xECA1, 0xB1DB, 0xD3B7, 0, 0, 0xD2DC, 0, /* 0xC0 */
+ 0, 0, 0xEBFD, 0, 0xEBFB, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xB3BC, 0, 0, 0, 0xEAB0, /* 0xE0 */
+ 0, 0, 0xD7D4, 0, 0xF4AB, 0xB3F4, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xD6C1, 0xD6C2, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xD5E9, 0xBECA, 0, 0xF4A7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2A8, 0xF4A8, 0xF4A9, 0, 0xF4AA, 0xBECB, 0xD3DF, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xC9E0, 0xC9E1, 0, 0, /* 0x00 */
+ 0xF3C2, 0, 0xCAE6, 0, 0xCCF2, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE2B6, 0xCBB4, 0, 0xCEE8, 0xD6DB, /* 0x10 */
+ 0, 0xF4AD, 0xF4AE, 0xF4AF, 0, 0, 0, 0, /* 0x20 */
+ 0xF4B2, 0, 0xBABD, 0xF4B3, 0xB0E3, 0xF4B0, 0, 0xF4B1, /* 0x20 */
+ 0xBDA2, 0xB2D5, 0, 0xF4B6, 0xF4B7, 0xB6E6, 0xB2B0, 0xCFCF, /* 0x30 */
+ 0xF4B4, 0xB4AC, 0, 0xF4B5, 0, 0, 0xF4B8, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF4B9, 0, 0, 0xCDA7, /* 0x40 */
+ 0, 0xF4BA, 0, 0xF4BB, 0, 0, 0, 0xF4BC, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xCBD2, 0, 0xF4BD, 0, 0, 0, 0, 0xF4BE, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xF4BF, 0, 0, 0, 0, 0, 0xF4DE, 0xC1BC, /* 0x60 */
+ 0xBCE8, 0, 0xC9AB, 0xD1DE, 0xE5F5, 0, 0, 0, /* 0x70 */
+ 0, 0xDCB3, 0xD2D5, 0, 0, 0xDCB4, 0xB0AC, 0xDCB5, /* 0x70 */
+ 0, 0, 0xBDDA, 0, 0xDCB9, 0, 0, 0, /* 0x80 */
+ 0xD8C2, 0, 0xDCB7, 0xD3F3, 0, 0xC9D6, 0xDCBA, 0xDCB6, /* 0x80 */
+ 0, 0xDCBB, 0xC3A2, 0, 0, 0, 0, 0xDCBC, /* 0x90 */
+ 0xDCC5, 0xDCBD, 0, 0, 0xCEDF, 0xD6A5, 0, 0xDCCF, /* 0x90 */
+ 0, 0xDCCD, 0, 0, 0xDCD2, 0xBDE6, 0xC2AB, 0, /* 0xA0 */
+ 0xDCB8, 0xDCCB, 0xDCCE, 0xDCBE, 0xB7D2, 0xB0C5, 0xDCC7, 0xD0BE, /* 0xA0 */
+ 0xDCC1, 0xBBA8, 0, 0xB7BC, 0xDCCC, 0, 0, 0xDCC6, /* 0xB0 */
+ 0xDCBF, 0xC7DB, 0, 0, 0, 0xD1BF, 0xDCC0, 0, /* 0xB0 */
+ 0, 0xDCCA, 0, 0, 0xDCD0, 0, 0, 0xCEAD, /* 0xC0 */
+ 0xDCC2, 0, 0xDCC3, 0xDCC8, 0xDCC9, 0xB2D4, 0xDCD1, 0xCBD5, /* 0xC0 */
+ 0, 0xD4B7, 0xDCDB, 0xDCDF, 0xCCA6, 0xDCE6, 0, 0xC3E7, /* 0xD0 */
+ 0xDCDC, 0, 0, 0xBFC1, 0xDCD9, 0, 0xB0FA, 0xB9B6, /* 0xD0 */
+ 0xDCE5, 0xDCD3, 0, 0xDCC4, 0xDCD6, 0xC8F4, 0xBFE0, 0, /* 0xE0 */
+ 0, 0, 0, 0xC9BB, 0, 0, 0, 0xB1BD, /* 0xE0 */
+ 0, 0xD3A2, 0, 0, 0xDCDA, 0, 0, 0xDCD5, /* 0xF0 */
+ 0, 0xC6BB, 0, 0xDCDE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7C2, 0xC3AF, 0xB7B6, 0xC7D1, 0xC3A9, 0xDCE2, 0xDCD8, /* 0x00 */
+ 0xDCEB, 0xDCD4, 0, 0, 0xDCDD, 0, 0xBEA5, 0xDCD7, /* 0x00 */
+ 0, 0xDCE0, 0, 0, 0xDCE3, 0xDCE4, 0, 0xDCF8, /* 0x10 */
+ 0, 0, 0xDCE1, 0xDDA2, 0xDCE7, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xBCEB, /* 0x20 */
+ 0xB4C4, 0, 0, 0xC3A3, 0xB2E7, 0xDCFA, 0, 0xDCF2, /* 0x20 */
+ 0, 0xDCEF, 0, 0xDCFC, 0xDCEE, 0xD2F0, 0xB2E8, 0, /* 0x30 */
+ 0xC8D7, 0xC8E3, 0xDCFB, 0, 0xDCED, 0, 0, 0, /* 0x30 */
+ 0xDCF7, 0, 0, 0xDCF5, 0, 0, 0xBEA3, 0xDCF4, /* 0x40 */
+ 0, 0xB2DD, 0, 0, 0, 0, 0, 0xDCF3, /* 0x40 */
+ 0xBCF6, 0xDCE8, 0xBBC4, 0, 0xC0F3, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xBCD4, 0xDCE9, 0xDCEA, 0, 0xDCF1, 0xDCF6, /* 0x50 */
+ 0xDCF9, 0xB5B4, 0, 0xC8D9, 0xBBE7, 0xDCFE, 0xDCFD, 0xD3AB, /* 0x60 */
+ 0xDDA1, 0xDDA3, 0xDDA5, 0xD2F1, 0xDDA4, 0xDDA6, 0xDDA7, 0xD2A9, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xBAC9, /* 0x70 */
+ 0xDDA9, 0, 0, 0xDDB6, 0xDDB1, 0xDDB4, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xDDB0, 0xC6CE, 0, /* 0x80 */
+ 0, 0xC0F2, 0, 0, 0, 0, 0xC9AF, 0, /* 0x80 */
+ 0, 0, 0xDCEC, 0xDDAE, 0, 0, 0, 0, /* 0x90 */
+ 0xDDB7, 0, 0, 0xDCF0, 0xDDAF, 0, 0xDDB8, 0, /* 0x90 */
+ 0xDDAC, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xDDB9, 0xDDB3, 0xDDAD, 0xC4AA, 0, 0, 0, 0, /* 0xA0 */
+ 0xDDA8, 0xC0B3, 0xC1AB, 0xDDAA, 0xDDAB, 0, 0xDDB2, 0xBBF1, /* 0xB0 */
+ 0xDDB5, 0xD3A8, 0xDDBA, 0, 0xDDBB, 0xC3A7, 0, 0, /* 0xB0 */
+ 0xDDD2, 0xDDBC, 0, 0, 0, 0xDDD1, 0, 0xB9BD, /* 0xC0 */
+ 0, 0, 0xBED5, 0, 0xBEFA, 0, 0, 0xBACA, /* 0xC0 */
+ 0, 0, 0, 0, 0xDDCA, 0, 0xDDC5, 0, /* 0xD0 */
+ 0xDDBF, 0, 0, 0, 0xB2CB, 0xDDC3, 0, 0xDDCB, /* 0xD0 */
+ 0xB2A4, 0xDDD5, 0, 0, 0, 0xDDBE, 0, 0, /* 0xE0 */
+ 0, 0xC6D0, 0xDDD0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xDDD4, 0xC1E2, 0xB7C6, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xDDCE, 0xDDCF, 0, 0, 0, 0xDDC4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDDBD, 0, 0xDDCD, 0xCCD1, 0, 0xDDC9, 0, /* 0x00 */
+ 0, 0, 0, 0xDDC2, 0xC3C8, 0xC6BC, 0xCEAE, 0xDDCC, /* 0x00 */
+ 0, 0xDDC8, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xDDC1, 0, 0, 0, 0xDDC6, 0xC2DC, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xD3A9, 0xD3AA, 0xDDD3, 0xCFF4, /* 0x20 */
+ 0xC8F8, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xDDE6, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xDDC7, 0, 0, 0, 0xDDE0, 0xC2E4, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xDDE1, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xDDD7, 0, 0, 0, 0, 0, 0xD6F8, /* 0x50 */
+ 0, 0xDDD9, 0xDDD8, 0xB8F0, 0xDDD6, 0, 0, 0, /* 0x50 */
+ 0, 0xC6CF, 0, 0xB6AD, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xDDE2, 0, 0xBAF9, 0xD4E1, 0xDDE7, 0, 0, /* 0x60 */
+ 0, 0xB4D0, 0, 0xDDDA, 0, 0xBFFB, 0xDDE3, 0, /* 0x70 */
+ 0xDDDF, 0, 0xDDDD, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xB5D9, 0, 0, 0, 0, 0xDDDB, /* 0x80 */
+ 0xDDDC, 0xDDDE, 0, 0xBDAF, 0xDDE4, 0, 0xDDE5, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDDF5, /* 0x90 */
+ 0, 0xC3C9, 0, 0, 0xCBE2, 0, 0, 0, /* 0x90 */
+ 0, 0xDDF2, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD8E1, /* 0xA0 */
+ 0, 0, 0xC6D1, 0, 0xDDF4, 0, 0, 0, /* 0xB0 */
+ 0xD5F4, 0xDDF3, 0xDDF0, 0, 0, 0xDDEC, 0, 0xDDEF, /* 0xB0 */
+ 0, 0xDDE8, 0, 0, 0xD0EE, 0, 0, 0, /* 0xC0 */
+ 0, 0xC8D8, 0xDDEE, 0, 0, 0xDDE9, 0, 0, /* 0xC0 */
+ 0xDDEA, 0xCBF2, 0, 0xDDED, 0, 0, 0xB1CD, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xC0B6, 0, 0xBCBB, /* 0xD0 */
+ 0xDDF1, 0, 0, 0xDDF7, 0, 0xDDF6, 0xDDEB, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xC5EE, 0, 0, 0, /* 0xE0 */
+ 0xDDFB, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xDEA4, 0, 0, 0xDEA3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xDDF8, 0, 0, 0, /* 0x00 */
+ 0, 0xC3EF, 0, 0xC2FB, 0, 0, 0, 0xD5E1, /* 0x10 */
+ 0, 0, 0xCEB5, 0, 0, 0, 0, 0xDDFD, /* 0x10 */
+ 0, 0xB2CC, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xC4E8, 0xCADF, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC7BE, /* 0x30 */
+ 0xDDFA, 0xDDFC, 0xDDFE, 0xDEA2, 0xB0AA, 0xB1CE, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xDEAC, 0, 0, 0, 0, /* 0x40 */
+ 0xDEA6, 0xBDB6, 0xC8EF, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xDEA1, 0, /* 0x50 */
+ 0, 0xDEA5, 0, 0, 0, 0, 0xDEA9, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xDEA8, 0, 0, 0, /* 0x60 */
+ 0xDEA7, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xDEAD, 0, 0xD4CC, 0, 0, 0, /* 0x70 */
+ 0, 0xDEB3, 0xDEAA, 0xDEAE, 0, 0, 0xC0D9, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xB1A1, 0xDEB6, 0, 0xDEB1, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDEB2, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xD1A6, 0xDEB5, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xDEAF, 0, 0, 0, /* 0xA0 */
+ 0xDEB0, 0, 0xD0BD, 0, 0, 0, 0xDEB4, 0xCAED, /* 0xA0 */
+ 0xDEB9, 0, 0, 0, 0, 0, 0, 0xDEB8, /* 0xB0 */
+ 0, 0xDEB7, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xDEBB, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xBDE5, 0, 0, 0, 0, 0, 0xB2D8, /* 0xC0 */
+ 0xC3EA, 0, 0, 0xDEBA, 0, 0xC5BA, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xDEBC, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xCCD9, 0, 0, 0, /* 0xE0 */
+ 0, 0xB7AA, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xD4E5, 0, 0, 0, 0xDEBD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDEBF, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xC4A2, 0, 0, 0, 0, 0xDEC1, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDEBE, /* 0x20 */
+ 0, 0xDEC0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xD5BA, 0, 0, 0, 0xDEC2, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF2AE, 0xBBA2, 0xC2B2, /* 0x40 */
+ 0xC5B0, 0xC2C7, 0, 0, 0xF2AF, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xD0E9, 0, 0, 0, 0xD3DD, 0, /* 0x50 */
+ 0, 0, 0xEBBD, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xB3E6, 0xF2B0, 0, 0xF2B1, 0, /* 0x60 */
+ 0, 0xCAAD, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBAE7, 0xF2B3, 0xF2B5, 0xF2B4, 0xCBE4, 0xCFBA, 0xF2B2, /* 0x70 */
+ 0xCAB4, 0xD2CF, 0xC2EC, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xCEC3, 0xF2B8, 0xB0F6, 0xF2B7, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF2BE, 0, 0xB2CF, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xD1C1, 0xF2BA, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF2BC, 0xD4E9, 0, 0, 0xF2BB, /* 0xA0 */
+ 0xF2B6, 0xF2BF, 0xF2BD, 0, 0xF2B9, 0, 0, 0xF2C7, /* 0xA0 */
+ 0xF2C4, 0xF2C6, 0, 0, 0xF2CA, 0xF2C2, 0xF2C0, 0, /* 0xB0 */
+ 0, 0, 0xF2C5, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xD6FB, 0, 0, 0, 0xF2C1, 0, 0xC7F9, 0xC9DF, /* 0xC0 */
+ 0, 0xF2C8, 0xB9C6, 0xB5B0, 0, 0, 0xF2C3, 0xF2C9, /* 0xC0 */
+ 0xF2D0, 0xF2D6, 0, 0, 0xBBD7, 0, 0, 0, /* 0xD0 */
+ 0xF2D5, 0xCDDC, 0, 0xD6EB, 0, 0, 0xF2D2, 0xF2D4, /* 0xD0 */
+ 0, 0, 0, 0, 0xB8F2, 0, 0, 0, /* 0xE0 */
+ 0, 0xF2CB, 0, 0, 0, 0xF2CE, 0xC2F9, 0, /* 0xE0 */
+ 0xD5DD, 0xF2CC, 0xF2CD, 0xF2CF, 0xF2D3, 0, 0, 0, /* 0xF0 */
+ 0xF2D9, 0xD3BC, 0, 0, 0, 0, 0xB6EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCAF1, 0, 0xB7E4, 0xF2D7, 0, 0, 0, 0xF2D8, /* 0x00 */
+ 0xF2DA, 0xF2DD, 0xF2DB, 0, 0, 0xF2DC, 0, 0, /* 0x00 */
+ 0, 0, 0xD1D1, 0xF2D1, 0, 0xCDC9, 0, 0xCECF, /* 0x10 */
+ 0xD6A9, 0, 0xF2E3, 0, 0xC3DB, 0, 0xF2E0, 0, /* 0x10 */
+ 0, 0xC0AF, 0xF2EC, 0xF2DE, 0, 0xF2E1, 0, 0, /* 0x20 */
+ 0, 0xF2E8, 0, 0, 0, 0, 0xF2E2, 0, /* 0x20 */
+ 0, 0xF2E7, 0, 0, 0xF2E6, 0, 0, 0xF2E9, /* 0x30 */
+ 0, 0, 0, 0xF2DF, 0, 0, 0xF2E4, 0xF2EA, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD3AC, /* 0x40 */
+ 0xF2E5, 0xB2F5, 0, 0, 0xF2F2, 0, 0xD0AB, 0, /* 0x40 */
+ 0, 0, 0, 0xF2F5, 0, 0, 0, 0xBBC8, /* 0x50 */
+ 0, 0xF2F9, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF2F0, 0, 0, 0xF2F6, 0xF2F8, 0xF2FA, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xF2F3, 0, /* 0x60 */
+ 0xF2F1, 0, 0, 0, 0xBAFB, 0, 0xB5FB, 0, /* 0x70 */
+ 0, 0, 0, 0xF2EF, 0xF2F7, 0xF2ED, 0xF2EE, 0, /* 0x70 */
+ 0, 0, 0xF2EB, 0xF3A6, 0, 0xF3A3, 0, 0, /* 0x80 */
+ 0xF3A2, 0, 0, 0xF2F4, 0, 0xC8DA, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF2FB, 0, 0, 0, 0xF3A5, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC3F8, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF2FD, 0, 0, 0xF3A7, 0xF3A9, 0xF3A4, 0, 0xF2FC, /* 0xA0 */
+ 0, 0, 0, 0xF3AB, 0, 0xF3AA, 0, 0, /* 0xB0 */
+ 0, 0, 0xC2DD, 0, 0, 0xF3AE, 0, 0, /* 0xB0 */
+ 0xF3B0, 0, 0, 0, 0, 0, 0xF3A1, 0, /* 0xC0 */
+ 0, 0, 0xF3B1, 0xF3AC, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF3AF, 0xF2FE, 0xF3AD, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xF3B2, 0, 0, 0, 0, /* 0xD0 */
+ 0xF3B4, 0, 0, 0, 0, 0xF3A8, 0, 0, /* 0xE0 */
+ 0, 0, 0xF3B3, 0, 0, 0, 0xF3B5, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xD0B7, 0, 0, 0, 0, 0xF3B8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD9F9, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF3B9, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xF3B7, 0, 0xC8E4, 0xF3B6, 0, /* 0x10 */
+ 0, 0, 0, 0xF3BA, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF3BB, 0xB4C0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xEEC3, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF3BC, 0, 0, 0xF3BD, 0, 0, 0, /* 0x30 */
+ 0xD1AA, 0, 0, 0, 0xF4AC, 0xD0C6, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xD0D0, 0xD1DC, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xCFCE, 0, 0, 0xBDD6, /* 0x50 */
+ 0, 0xD1C3, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xBAE2, 0xE1E9, 0xD2C2, 0xF1C2, 0xB2B9, 0, 0, /* 0x60 */
+ 0xB1ED, 0xF1C3, 0, 0xC9C0, 0xB3C4, 0, 0xD9F2, 0, /* 0x60 */
+ 0xCBA5, 0, 0xF1C4, 0, 0, 0, 0, 0xD6D4, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF1C5, 0xF4C0, 0xF1C6, /* 0x70 */
+ 0, 0xD4AC, 0xF1C7, 0, 0xB0C0, 0xF4C1, 0, 0, /* 0x80 */
+ 0xF4C2, 0, 0, 0xB4FC, 0, 0xC5DB, 0, 0, /* 0x80 */
+ 0, 0, 0xCCBB, 0, 0, 0, 0xD0E4, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xCDE0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xF1C8, 0, 0xD9F3, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xB1BB, 0, 0xCFAE, 0, 0, /* 0xA0 */
+ 0, 0xB8A4, 0, 0, 0, 0, 0, 0xF1CA, /* 0xB0 */
+ 0, 0, 0, 0, 0xF1CB, 0, 0, 0, /* 0xB0 */
+ 0, 0xB2C3, 0xC1D1, 0, 0, 0xD7B0, 0xF1C9, 0, /* 0xC0 */
+ 0, 0xF1CC, 0, 0, 0, 0, 0xF1CE, 0, /* 0xC0 */
+ 0, 0, 0xD9F6, 0, 0xD2E1, 0xD4A3, 0, 0, /* 0xD0 */
+ 0xF4C3, 0xC8B9, 0, 0, 0, 0, 0, 0xF4C4, /* 0xD0 */
+ 0, 0, 0xF1CD, 0xF1CF, 0xBFE3, 0xF1D0, 0, 0, /* 0xE0 */
+ 0xF1D4, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF1D6, 0xF1D1, 0, 0xC9D1, 0xC5E1, 0, 0, 0, /* 0xF0 */
+ 0xC2E3, 0xB9FC, 0, 0, 0xF1D3, 0, 0xF1D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB9D3, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF1DB, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xBAD6, 0, 0xB0FD, 0xF1D9, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF1D8, 0xF1D2, 0xF1DA, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF1D7, 0, 0, 0, 0xC8EC, 0, 0, /* 0x20 */
+ 0, 0, 0xCDCA, 0xF1DD, 0, 0, 0, 0, /* 0x20 */
+ 0xE5BD, 0, 0, 0, 0xF1DC, 0, 0xF1DE, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF1DF, 0, 0, 0xCFE5, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xF4C5, 0xBDF3, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xF1E0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0xF1E1, 0, 0, 0, 0xCEF7, /* 0x70 */
+ 0, 0xD2AA, 0, 0xF1FB, 0, 0, 0xB8B2, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xBCFB, 0xB9DB, 0, 0xB9E6, 0xC3D9, 0xCAD3, 0xEAE8, /* 0xC0 */
+ 0xC0C0, 0xBEF5, 0xEAE9, 0xEAEA, 0xEAEB, 0, 0xEAEC, 0xEAED, /* 0xC0 */
+ 0xEAEE, 0xEAEF, 0xBDC7, 0, 0, 0, 0xF5FB, 0, /* 0xD0 */
+ 0, 0, 0xF5FD, 0, 0xF5FE, 0, 0xF5FC, 0, /* 0xD0 */
+ 0, 0, 0, 0xBDE2, 0, 0xF6A1, 0xB4A5, 0, /* 0xE0 */
+ 0, 0, 0, 0xF6A2, 0, 0, 0, 0xF6A3, /* 0xE0 */
+ 0, 0, 0, 0xECB2 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1D4, 0, 0, 0, 0, 0, 0, 0xD9EA, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xF6A4, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEEBA, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD5B2, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xD3FE, 0xCCDC, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xCAC4 /* 0x90 */
+ /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5C0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xF6A5, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xBEAF, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xC6A9, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xDAA5, 0xBCC6, 0xB6A9, 0xB8BC, 0xC8CF, 0xBCA5, 0xDAA6, 0xDAA7, /* 0xA0 */
+ 0xCCD6, 0xC8C3, 0xDAA8, 0xC6FD, 0, 0xD1B5, 0xD2E9, 0xD1B6, /* 0xA0 */
+ 0xBCC7, 0, 0xBDB2, 0xBBE4, 0xDAA9, 0xDAAA, 0xD1C8, 0xDAAB, /* 0xB0 */
+ 0xD0ED, 0xB6EF, 0xC2DB, 0, 0xCBCF, 0xB7ED, 0xC9E8, 0xB7C3, /* 0xB0 */
+ 0xBEF7, 0xD6A4, 0xDAAC, 0xDAAD, 0xC6C0, 0xD7E7, 0xCAB6, 0, /* 0xC0 */
+ 0xD5A9, 0xCBDF, 0xD5EF, 0xDAAE, 0xD6DF, 0xB4CA, 0xDAB0, 0xDAAF, /* 0xC0 */
+ 0, 0xD2EB, 0xDAB1, 0xDAB2, 0xDAB3, 0xCAD4, 0xDAB4, 0xCAAB, /* 0xD0 */
+ 0xDAB5, 0xDAB6, 0xB3CF, 0xD6EF, 0xDAB7, 0xBBB0, 0xB5AE, 0xDAB8, /* 0xD0 */
+ 0xDAB9, 0xB9EE, 0xD1AF, 0xD2E8, 0xDABA, 0xB8C3, 0xCFEA, 0xB2EF, /* 0xE0 */
+ 0xDABB, 0xDABC, 0, 0xBDEB, 0xCEDC, 0xD3EF, 0xDABD, 0xCEF3, /* 0xE0 */
+ 0xDABE, 0xD3D5, 0xBBE5, 0xDABF, 0xCBB5, 0xCBD0, 0xDAC0, 0xC7EB, /* 0xF0 */
+ 0xD6EE, 0xDAC1, 0xC5B5, 0xB6C1, 0xDAC2, 0xB7CC, 0xBFCE, 0xDAC3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDAC4, 0xCBAD, 0xDAC5, 0xB5F7, 0xDAC6, 0xC1C2, 0xD7BB, 0xDAC7, /* 0x00 */
+ 0xCCB8, 0, 0xD2EA, 0xC4B1, 0xDAC8, 0xB5FD, 0xBBD1, 0xDAC9, /* 0x00 */
+ 0xD0B3, 0xDACA, 0xDACB, 0xCEBD, 0xDACC, 0xDACD, 0xDACE, 0xB2F7, /* 0x10 */
+ 0xDAD1, 0xDACF, 0xD1E8, 0xDAD0, 0xC3D5, 0xDAD2, 0, 0xDAD3, /* 0x10 */
+ 0xDAD4, 0xDAD5, 0xD0BB, 0xD2A5, 0xB0F9, 0xDAD6, 0xC7AB, 0xDAD7, /* 0x20 */
+ 0xBDF7, 0xC3A1, 0xDAD8, 0xDAD9, 0xC3FD, 0xCCB7, 0xDADA, 0xDADB, /* 0x20 */
+ 0xC0BE, 0xC6D7, 0xDADC, 0xDADD, 0xC7B4, 0xDADE, 0xDADF, 0xB9C8, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xBBED, 0, 0, 0, 0, 0xB6B9, 0xF4F8, /* 0x40 */
+ 0, 0xF4F9, 0, 0, 0xCDE3, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF5B9, 0, 0, /* 0x50 */
+ 0, 0, 0xEBE0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCFF3, 0xBBBF, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xBAC0, 0xD4A5, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE1D9, 0, 0, 0, 0, /* 0x70 */
+ 0xF5F4, 0xB1AA, 0xB2F2, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xF5F5, 0, 0, 0xF5F7, 0, 0, /* 0x80 */
+ 0, 0xBAD1, 0xF5F6, 0, 0xC3B2, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xF5F9, 0, 0, 0, /* 0x90 */
+ 0xF5F8 /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0xB1B4, 0xD5EA, 0xB8BA, /* 0x10 */
+ 0, 0xB9B1, 0xB2C6, 0xD4F0, 0xCFCD, 0xB0DC, 0xD5CB, 0xBBF5, /* 0x20 */
+ 0xD6CA, 0xB7B7, 0xCCB0, 0xC6B6, 0xB1E1, 0xB9BA, 0xD6FC, 0xB9E1, /* 0x20 */
+ 0xB7A1, 0xBCFA, 0xEADA, 0xEADB, 0xCCF9, 0xB9F3, 0xEADC, 0xB4FB, /* 0x30 */
+ 0xC3B3, 0xB7D1, 0xBAD8, 0xEADD, 0xD4F4, 0xEADE, 0xBCD6, 0xBBDF, /* 0x30 */
+ 0xEADF, 0xC1DE, 0xC2B8, 0xD4DF, 0xD7CA, 0xEAE0, 0xEAE1, 0xEAE4, /* 0x40 */
+ 0xEAE2, 0xEAE3, 0xC9DE, 0xB8B3, 0xB6C4, 0xEAE5, 0xCAEA, 0xC9CD, /* 0x40 */
+ 0xB4CD, 0, 0, 0xE2D9, 0xC5E2, 0xEAE6, 0xC0B5, 0, /* 0x50 */
+ 0xD7B8, 0xEAE7, 0xD7AC, 0xC8FC, 0xD8D3, 0xD8CD, 0xD4DE, 0, /* 0x50 */
+ 0xD4F9, 0xC9C4, 0xD3AE, 0xB8D3, 0xB3E0, 0, 0xC9E2, 0xF4F6, /* 0x60 */
+ 0, 0, 0, 0xBAD5, 0, 0xF4F7, 0, 0, /* 0x60 */
+ 0xD7DF, 0, 0, 0xF4F1, 0xB8B0, 0xD5D4, 0xB8CF, 0xC6F0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB3C3, 0, 0, 0xF4F2, 0xB3AC, 0, 0, /* 0x80 */
+ 0, 0, 0xD4BD, 0xC7F7, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF4F4, 0, 0, 0xF4F3, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCCCB, /* 0x90 */
+ 0, 0, 0, 0xC8A4, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xF4F5, 0, 0xD7E3, 0xC5BF, 0xF5C0, 0, 0, /* 0xB0 */
+ 0xF5BB, 0, 0xF5C3, 0, 0xF5C2, 0, 0xD6BA, 0xF5C1, /* 0xB0 */
+ 0, 0, 0, 0xD4BE, 0xF5C4, 0, 0xF5CC, 0, /* 0xC0 */
+ 0, 0, 0, 0xB0CF, 0xB5F8, 0, 0xF5C9, 0xF5CA, /* 0xC0 */
+ 0, 0xC5DC, 0, 0, 0, 0, 0xF5C5, 0xF5C6, /* 0xD0 */
+ 0, 0, 0xF5C7, 0xF5CB, 0, 0xBEE0, 0xF5C8, 0xB8FA, /* 0xD0 */
+ 0, 0, 0, 0xF5D0, 0xF5D3, 0, 0, 0, /* 0xE0 */
+ 0xBFE7, 0, 0xB9F2, 0xF5BC, 0xF5CD, 0, 0, 0xC2B7, /* 0xE0 */
+ 0, 0, 0, 0xCCF8, 0, 0xBCF9, 0, 0xF5CE, /* 0xF0 */
+ 0xF5CF, 0xF5D1, 0xB6E5, 0xF5D2, 0, 0xF5D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5BD, 0, 0, /* 0x00 */
+ 0, 0xF5D4, 0xD3BB, 0, 0xB3EC, 0, 0, 0xCCA4, /* 0x00 */
+ 0, 0, 0, 0, 0xF5D6, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF5D7, 0xBEE1, 0xF5D8, /* 0x10 */
+ 0, 0, 0xCCDF, 0xF5DB, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xB2C8, 0xD7D9, 0, 0xF5D9, 0, 0xF5DA, 0xF5DC, /* 0x20 */
+ 0, 0xF5E2, 0, 0, 0, 0xF5E0, 0, 0, /* 0x30 */
+ 0, 0xF5DF, 0xF5DD, 0, 0, 0xF5E1, 0, 0, /* 0x30 */
+ 0xF5DE, 0xF5E4, 0xF5E5, 0, 0xCCE3, 0, 0, 0xE5BF, /* 0x40 */
+ 0xB5B8, 0xF5E3, 0xF5E8, 0xCCA3, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xF5E6, 0xF5E7, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF5BE, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xB1C4, 0, /* 0x60 */
+ 0, 0xF5BF, 0, 0, 0xB5C5, 0xB2E4, 0, 0xF5EC, /* 0x60 */
+ 0xF5E9, 0, 0xB6D7, 0, 0xF5ED, 0, 0xF5EA, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF5EB, 0, 0, 0xB4DA, /* 0x70 */
+ 0, 0xD4EA, 0, 0, 0, 0xF5EE, 0, 0xB3F9, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF5EF, /* 0x80 */
+ 0xF5F1, 0, 0, 0, 0xF5F0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF5F2, 0, 0xF5F3, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xC9ED, 0xB9AA, 0, 0, 0xC7FB, /* 0xA0 */
+ 0, 0, 0xB6E3, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xCCC9, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xEAA6 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB3B5, 0xD4FE, /* 0x60 */
+ 0xB9EC, 0xD0F9, 0, 0xE9ED, 0xD7AA, 0xE9EE, 0xC2D6, 0xC8ED, /* 0x60 */
+ 0xBAE4, 0xE9EF, 0xE9F0, 0xE9F1, 0xD6E1, 0xE9F2, 0xE9F3, 0xE9F5, /* 0x70 */
+ 0xE9F4, 0xE9F6, 0xE9F7, 0xC7E1, 0xE9F8, 0xD4D8, 0xE9F9, 0xBDCE, /* 0x70 */
+ 0, 0xE9FA, 0xE9FB, 0xBDCF, 0xE9FC, 0xB8A8, 0xC1BE, 0xE9FD, /* 0x80 */
+ 0xB1B2, 0xBBD4, 0xB9F5, 0xE9FE, 0, 0xEAA1, 0xEAA2, 0xEAA3, /* 0x80 */
+ 0xB7F8, 0xBCAD, 0, 0xCAE4, 0xE0CE, 0xD4AF, 0xCFBD, 0xD5B7, /* 0x90 */
+ 0xEAA4, 0xD5DE, 0xEAA5, 0xD0C1, 0xB9BC, 0, 0xB4C7, 0xB1D9, /* 0x90 */
+ 0, 0, 0, 0xC0B1, 0, 0, 0, 0, /* 0xA0 */
+ 0xB1E6, 0xB1E7, 0, 0xB1E8, 0, 0, 0, 0, /* 0xA0 */
+ 0xB3BD, 0xC8E8, 0, 0, 0, 0, 0xE5C1, 0, /* 0xB0 */
+ 0, 0xB1DF, 0, 0, 0, 0xC1C9, 0xB4EF, 0, /* 0xB0 */
+ 0, 0xC7A8, 0xD3D8, 0, 0xC6F9, 0xD1B8, 0, 0xB9FD, /* 0xC0 */
+ 0xC2F5, 0, 0, 0, 0, 0, 0xD3AD, 0, /* 0xC0 */
+ 0xD4CB, 0xBDFC, 0, 0xE5C2, 0xB7B5, 0xE5C3, 0, 0, /* 0xD0 */
+ 0xBBB9, 0xD5E2, 0, 0xBDF8, 0xD4B6, 0xCEA5, 0xC1AC, 0xB3D9, /* 0xD0 */
+ 0, 0, 0xCCF6, 0, 0xE5C6, 0xE5C4, 0xE5C8, 0, /* 0xE0 */
+ 0xE5CA, 0xE5C7, 0xB5CF, 0xC6C8, 0, 0xB5FC, 0xE5C5, 0, /* 0xE0 */
+ 0xCAF6, 0, 0, 0xE5C9, 0, 0, 0, 0xC3D4, /* 0xF0 */
+ 0xB1C5, 0xBCA3, 0, 0, 0, 0xD7B7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDCB, 0xCBCD, 0xCACA, 0xCCD3, 0xE5CC, 0xE5CB, 0xC4E6, 0, /* 0x00 */
+ 0, 0xD1A1, 0xD1B7, 0xE5CD, 0, 0xE5D0, 0, 0xCDB8, /* 0x00 */
+ 0xD6F0, 0xE5CF, 0xB5DD, 0, 0xCDBE, 0, 0xE5D1, 0xB6BA, /* 0x10 */
+ 0, 0, 0xCDA8, 0xB9E4, 0, 0xCAC5, 0xB3D1, 0xCBD9, /* 0x10 */
+ 0xD4EC, 0xE5D2, 0xB7EA, 0, 0, 0, 0xE5CE, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE5D5, 0xB4FE, 0xE5D6, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE5D3, 0xE5D4, 0, /* 0x30 */
+ 0xD2DD, 0, 0, 0xC2DF, 0xB1C6, 0, 0xD3E2, 0, /* 0x30 */
+ 0, 0xB6DD, 0xCBEC, 0, 0xE5D7, 0, 0, 0xD3F6, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xB1E9, 0, 0xB6F4, /* 0x40 */
+ 0xE5DA, 0xE5D8, 0xE5D9, 0xB5C0, 0, 0, 0, 0xD2C5, /* 0x50 */
+ 0xE5DC, 0, 0, 0xE5DE, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE5DD, 0xC7B2, 0, 0xD2A3, 0, 0, /* 0x60 */
+ 0xE5DB, 0, 0, 0, 0, 0xD4E2, 0xD5DA, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE5E0, 0xD7F1, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xE5E1, 0, 0xB1DC, /* 0x70 */
+ 0xD1FB, 0, 0xE5E2, 0xE5E4, 0, 0, 0, 0, /* 0x80 */
+ 0xE5E3, 0, 0, 0xE5E5, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xD2D8, 0, 0xB5CB, 0, 0xE7DF, 0, 0xDAF5, /* 0x90 */
+ 0, 0xDAF8, 0, 0xDAF6, 0, 0xDAF7, 0, 0, /* 0x90 */
+ 0, 0xDAFA, 0xD0CF, 0xC4C7, 0, 0, 0xB0EE, 0, /* 0xA0 */
+ 0, 0, 0xD0B0, 0, 0xDAF9, 0, 0xD3CA, 0xBAAA, /* 0xA0 */
+ 0xDBA2, 0xC7F1, 0, 0xDAFC, 0xDAFB, 0xC9DB, 0xDAFD, 0, /* 0xB0 */
+ 0xDBA1, 0xD7DE, 0xDAFE, 0xC1DA, 0, 0, 0xDBA5, 0, /* 0xB0 */
+ 0, 0xD3F4, 0, 0, 0xDBA7, 0xDBA4, 0, 0xDBA8, /* 0xC0 */
+ 0, 0, 0xBDBC, 0, 0, 0, 0xC0C9, 0xDBA3, /* 0xC0 */
+ 0xDBA6, 0xD6A3, 0, 0xDBA9, 0, 0, 0, 0xDBAD, /* 0xD0 */
+ 0, 0, 0, 0xDBAE, 0xDBAC, 0xBAC2, 0, 0, /* 0xD0 */
+ 0, 0xBFA4, 0xDBAB, 0, 0, 0, 0xDBAA, 0xD4C7, /* 0xE0 */
+ 0xB2BF, 0, 0, 0xDBAF, 0, 0xB9F9, 0, 0xDBB0, /* 0xE0 */
+ 0, 0, 0, 0, 0xB3BB, 0, 0, 0, /* 0xF0 */
+ 0xB5A6, 0, 0, 0, 0, 0xB6BC, 0xDBB1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB6F5, 0, 0xDBB2, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xB1C9, 0, 0, 0, 0, 0xDBB4, 0, /* 0x10 */
+ 0, 0, 0xDBB3, 0xDBB5, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDBB7, /* 0x20 */
+ 0, 0xDBB6, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xDBB8, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xDBB9, 0, 0, 0xDBBA, 0, /* 0x40 */
+ 0, 0xD3CF, 0xF4FA, 0xC7F5, 0xD7C3, 0xC5E4, 0xF4FC, 0xF4FD, /* 0x40 */
+ 0xF4FB, 0, 0xBEC6, 0, 0, 0, 0, 0xD0EF, /* 0x50 */
+ 0, 0, 0xB7D3, 0, 0, 0xD4CD, 0xCCAA, 0, /* 0x50 */
+ 0, 0xF5A2, 0xF5A1, 0xBAA8, 0xF4FE, 0xCBD6, 0, 0, /* 0x60 */
+ 0, 0xF5A4, 0xC0D2, 0, 0xB3EA, 0, 0xCDAA, 0xF5A5, /* 0x60 */
+ 0xF5A3, 0xBDB4, 0xF5A8, 0, 0xF5A9, 0xBDCD, 0xC3B8, 0xBFE1, /* 0x70 */
+ 0xCBE1, 0xF5AA, 0, 0, 0, 0xF5A6, 0xF5A7, 0xC4F0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF5AC, 0, 0xB4BC, /* 0x80 */
+ 0, 0xD7ED, 0, 0xB4D7, 0xF5AB, 0xF5AE, 0, 0, /* 0x80 */
+ 0xF5AD, 0xF5AF, 0xD0D1, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xC3D1, 0xC8A9, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xF5B0, 0xF5B1, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xF5B2, 0, 0, 0xF5B3, 0xF5B4, 0xF5B5, /* 0xA0 */
+ 0, 0, 0, 0, 0xF5B7, 0xF5B6, 0, 0, /* 0xB0 */
+ 0, 0, 0xF5B8, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB2C9, /* 0xC0 */
+ 0, 0xD3D4, 0xCACD, 0, 0xC0EF, 0xD6D8, 0xD2B0, 0xC1BF, /* 0xC0 */
+ 0, 0xBDF0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xB8AA /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBCF8, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xF6C6, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xF6C7, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xF6C8 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x30 */
+ 0xF6C9, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xF6CA, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF6CC, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xF6CB, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xF7E9 /* 0xD0 */
+ /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x30 */
+ 0xF6CD, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xF6CE, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xEEC4, 0xEEC5, 0xEEC6, /* 0x80 */
+ 0xD5EB, 0xB6A4, 0xEEC8, 0xEEC7, 0xEEC9, 0xEECA, 0xC7A5, 0xEECB, /* 0x80 */
+ 0xEECC, 0, 0xB7B0, 0xB5F6, 0xEECD, 0xEECF, 0, 0xEECE, /* 0x90 */
+ 0, 0xB8C6, 0xEED0, 0xEED1, 0xEED2, 0xB6DB, 0xB3AE, 0xD6D3, /* 0x90 */
+ 0xC4C6, 0xB1B5, 0xB8D6, 0xEED3, 0xEED4, 0xD4BF, 0xC7D5, 0xBEFB, /* 0xA0 */
+ 0xCED9, 0xB9B3, 0xEED6, 0xEED5, 0xEED8, 0xEED7, 0xC5A5, 0xEED9, /* 0xA0 */
+ 0xEEDA, 0xC7AE, 0xEEDB, 0xC7AF, 0xEEDC, 0xB2A7, 0xEEDD, 0xEEDE, /* 0xB0 */
+ 0xEEDF, 0xEEE0, 0xEEE1, 0xD7EA, 0xEEE2, 0xEEE3, 0xBCD8, 0xEEE4, /* 0xB0 */
+ 0xD3CB, 0xCCFA, 0xB2AC, 0xC1E5, 0xEEE5, 0xC7A6, 0xC3AD, 0, /* 0xC0 */
+ 0xEEE6, 0xEEE7, 0xEEE8, 0xEEE9, 0xEEEA, 0xEEEB, 0xEEEC, 0, /* 0xC0 */
+ 0xEEED, 0xEEEE, 0xEEEF, 0, 0, 0xEEF0, 0xEEF1, 0xEEF2, /* 0xD0 */
+ 0xEEF4, 0xEEF3, 0, 0xEEF5, 0xCDAD, 0xC2C1, 0xEEF6, 0xEEF7, /* 0xD0 */
+ 0xEEF8, 0xD5A1, 0xEEF9, 0xCFB3, 0xEEFA, 0xEEFB, 0, 0xEEFC, /* 0xE0 */
+ 0xEEFD, 0xEFA1, 0xEEFE, 0xEFA2, 0xB8F5, 0xC3FA, 0xEFA3, 0xEFA4, /* 0xE0 */
+ 0xBDC2, 0xD2BF, 0xB2F9, 0xEFA5, 0xEFA6, 0xEFA7, 0xD2F8, 0xEFA8, /* 0xF0 */
+ 0xD6FD, 0xEFA9, 0xC6CC, 0, 0xEFAA, 0xEFAB, 0xC1B4, 0xEFAC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFFA, 0xCBF8, 0xEFAE, 0xEFAD, 0xB3FA, 0xB9F8, 0xEFAF, 0xEFB0, /* 0x00 */
+ 0xD0E2, 0xEFB1, 0xEFB2, 0xB7E6, 0xD0BF, 0xEFB3, 0xEFB4, 0xEFB5, /* 0x00 */
+ 0xC8F1, 0xCCE0, 0xEFB6, 0xEFB7, 0xEFB8, 0xEFB9, 0xEFBA, 0xD5E0, /* 0x10 */
+ 0xEFBB, 0xB4ED, 0xC3AA, 0xEFBC, 0, 0xEFBD, 0xEFBE, 0xEFBF, /* 0x10 */
+ 0, 0xCEFD, 0xEFC0, 0xC2E0, 0xB4B8, 0xD7B6, 0xBDF5, 0, /* 0x20 */
+ 0xCFC7, 0xEFC3, 0xEFC1, 0xEFC2, 0xEFC4, 0xB6A7, 0xBCFC, 0xBEE2, /* 0x20 */
+ 0xC3CC, 0xEFC5, 0xEFC6, 0, 0xEFC7, 0xEFCF, 0xEFC8, 0xEFC9, /* 0x30 */
+ 0xEFCA, 0xC7C2, 0xEFF1, 0xB6CD, 0xEFCB, 0, 0xEFCC, 0xEFCD, /* 0x30 */
+ 0xB6C6, 0xC3BE, 0xEFCE, 0, 0xEFD0, 0xEFD1, 0xEFD2, 0xD5F2, /* 0x40 */
+ 0, 0xEFD3, 0xC4F7, 0, 0xEFD4, 0xC4F8, 0xEFD5, 0xEFD6, /* 0x40 */
+ 0xB8E4, 0xB0F7, 0xEFD7, 0xEFD8, 0xEFD9, 0, 0xEFDA, 0xEFDB, /* 0x50 */
+ 0xEFDC, 0xEFDD, 0, 0xEFDE, 0xBEB5, 0xEFE1, 0xEFDF, 0xEFE0, /* 0x50 */
+ 0, 0xEFE2, 0xEFE3, 0xC1CD, 0xEFE4, 0xEFE5, 0xEFE6, 0xEFE7, /* 0x60 */
+ 0xEFE8, 0xEFE9, 0xEFEA, 0xEFEB, 0xEFEC, 0xC0D8, 0, 0xEFED, /* 0x60 */
+ 0xC1AD, 0xEFEE, 0xEFEF, 0xEFF0, 0, 0, 0xCFE2, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB3A4, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xC3C5, 0xE3C5, 0xC9C1, 0xE3C6, 0, 0xB1D5, 0xCECA, 0xB4B3, /* 0xE0 */
+ 0xC8F2, 0xE3C7, 0xCFD0, 0xE3C8, 0xBCE4, 0xE3C9, 0xE3CA, 0xC3C6, /* 0xF0 */
+ 0xD5A2, 0xC4D6, 0xB9EB, 0xCEC5, 0xE3CB, 0xC3F6, 0xE3CC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB7A7, 0xB8F3, 0xBAD2, 0xE3CD, 0xE3CE, 0xD4C4, 0xE3CF, 0, /* 0x00 */
+ 0xE3D0, 0xD1CB, 0xE3D1, 0xE3D2, 0xE3D3, 0xE3D4, 0xD1D6, 0xE3D5, /* 0x00 */
+ 0xB2FB, 0xC0BB, 0xE3D6, 0, 0xC0AB, 0xE3D7, 0xE3D8, 0xE3D9, /* 0x10 */
+ 0, 0xE3DA, 0xE3DB, 0, 0xB8B7, 0xDAE2, 0, 0xB6D3, /* 0x10 */
+ 0, 0xDAE4, 0xDAE3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xDAE6, 0, 0, 0, 0xC8EE, 0, /* 0x20 */
+ 0, 0xDAE5, 0xB7C0, 0xD1F4, 0xD2F5, 0xD5F3, 0xBDD7, 0, /* 0x30 */
+ 0, 0, 0, 0xD7E8, 0xDAE8, 0xDAE7, 0, 0xB0A2, /* 0x30 */
+ 0xCDD3, 0, 0xDAE9, 0, 0xB8BD, 0xBCCA, 0xC2BD, 0xC2A4, /* 0x40 */
+ 0xB3C2, 0xDAEA, 0, 0xC2AA, 0xC4B0, 0xBDB5, 0, 0, /* 0x40 */
+ 0xCFDE, 0, 0, 0, 0xDAEB, 0xC9C2, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xB1DD, 0, 0, 0, 0xDAEC, /* 0x50 */
+ 0, 0xB6B8, 0xD4BA, 0, 0xB3FD, 0, 0, 0xDAED, /* 0x60 */
+ 0xD4C9, 0xCFD5, 0xC5E3, 0, 0xDAEE, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xDAEF, 0, 0xDAF0, 0xC1EA, 0xCCD5, 0xCFDD, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xD3E7, 0xC2A1, 0, /* 0x80 */
+ 0xDAF1, 0, 0, 0xCBE5, 0, 0xDAF2, 0, 0xCBE6, /* 0x80 */
+ 0xD2FE, 0, 0, 0, 0xB8F4, 0, 0, 0xDAF3, /* 0x90 */
+ 0xB0AF, 0xCFB6, 0, 0, 0xD5CF, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCBED, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xDAF4, 0, 0, 0xE3C4, 0, 0, 0xC1A5, 0, /* 0xB0 */
+ 0, 0xF6BF, 0, 0, 0xF6C0, 0xF6C1, 0xC4D1, 0, /* 0xB0 */
+ 0xC8B8, 0xD1E3, 0, 0, 0xD0DB, 0xD1C5, 0xBCAF, 0xB9CD, /* 0xC0 */
+ 0, 0xEFF4, 0, 0, 0xB4C6, 0xD3BA, 0xF6C2, 0xB3FB, /* 0xC0 */
+ 0, 0, 0xF6C3, 0, 0, 0xB5F1, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xF6C5, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xD3EA, 0xF6A7, 0xD1A9, 0, 0, 0, 0, 0xF6A9, /* 0xE0 */
+ 0, 0, 0, 0xF6A8, 0, 0, 0xC1E3, 0xC0D7, /* 0xF0 */
+ 0, 0xB1A2, 0, 0, 0, 0, 0xCEED /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD0E8, 0xF6AB, 0, 0, 0xCFF6, 0, 0xF6AA, 0xD5F0, /* 0x00 */
+ 0xF6AC, 0xC3B9, 0, 0, 0, 0xBBF4, 0xF6AE, 0xF6AD, /* 0x00 */
+ 0, 0, 0, 0xC4DE, 0, 0, 0xC1D8, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xCBAA, 0, 0xCFBC, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xF6AF, 0, 0, 0xF6B0, 0, 0, /* 0x20 */
+ 0xF6B1, 0, 0xC2B6, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xB0D4, 0xC5F9, 0, 0, 0, 0, 0xF6B2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xC7E0, 0xF6A6, 0, 0, 0xBEB8, 0, /* 0x50 */
+ 0, 0xBEB2, 0, 0xB5E5, 0, 0, 0xB7C7, 0, /* 0x50 */
+ 0xBFBF, 0xC3D2, 0xC3E6, 0, 0, 0xD8CC, 0, 0, /* 0x60 */
+ 0, 0xB8EF, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xBDF9, 0xD1A5, 0, 0xB0D0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF7B0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF7B1, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xD0AC, 0, 0xB0B0, 0, 0, /* 0x80 */
+ 0, 0xF7B2, 0xF7B3, 0, 0xF7B4, 0, 0, 0, /* 0x90 */
+ 0xC7CA, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xBECF, 0, 0, 0xF7B7, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF7B6, 0, 0xB1DE, 0, 0xF7B5, /* 0xA0 */
+ 0, 0, 0xF7B8, 0, 0xF7B9, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xCEA4, 0xC8CD, /* 0xE0 */
+ 0, 0xBAAB, 0xE8B8, 0xE8B9, 0xE8BA, 0xBEC2, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xD2F4, 0, 0xD4CF, 0xC9D8 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2B3, 0xB6A5, 0xC7EA, /* 0x70 */
+ 0xF1FC, 0xCFEE, 0xCBB3, 0xD0EB, 0xE7EF, 0xCDE7, 0xB9CB, 0xB6D9, /* 0x70 */
+ 0xF1FD, 0xB0E4, 0xCBCC, 0xF1FE, 0xD4A4, 0xC2AD, 0xC1EC, 0xC6C4, /* 0x80 */
+ 0xBEB1, 0xF2A1, 0xBCD5, 0, 0xF2A2, 0xF2A3, 0, 0xF2A4, /* 0x80 */
+ 0xD2C3, 0xC6B5, 0, 0xCDC7, 0xF2A5, 0, 0xD3B1, 0xBFC5, /* 0x90 */
+ 0xCCE2, 0, 0xF2A6, 0xF2A7, 0xD1D5, 0xB6EE, 0xF2A8, 0xF2A9, /* 0x90 */
+ 0xB5DF, 0xF2AA, 0xF2AB, 0, 0xB2FC, 0xF2AC, 0xF2AD, 0xC8A7, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xB7E7, 0, /* 0xC0 */
+ 0, 0xECA9, 0xECAA, 0xECAB, 0, 0xECAC, 0, 0, /* 0xD0 */
+ 0xC6AE, 0xECAD, 0xECAE, 0, 0, 0, 0xB7C9, 0xCAB3, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE2B8, /* 0xE0 */
+ 0xF7CF /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xF7D0, 0, 0, /* 0x00 */
+ 0xB2CD, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xF7D1, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF7D3, 0xF7D2, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE2BB, 0, 0xBCA2, 0, 0xE2BC, /* 0x60 */
+ 0xE2BD, 0xE2BE, 0xE2BF, 0xE2C0, 0xE2C1, 0xB7B9, 0xD2FB, 0xBDA4, /* 0x60 */
+ 0xCACE, 0xB1A5, 0xCBC7, 0, 0xE2C2, 0xB6FC, 0xC8C4, 0xE2C3, /* 0x70 */
+ 0, 0, 0xBDC8, 0, 0xB1FD, 0xE2C4, 0, 0xB6F6, /* 0x70 */
+ 0xE2C5, 0xC4D9, 0, 0, 0xE2C6, 0xCFDA, 0xB9DD, 0xE2C7, /* 0x80 */
+ 0xC0A1, 0, 0xE2C8, 0xB2F6, 0, 0xE2C9, 0, 0xC1F3, /* 0x80 */
+ 0xE2CA, 0xE2CB, 0xC2F8, 0xE2CC, 0xE2CD, 0xE2CE, 0xCAD7, 0xD8B8, /* 0x90 */
+ 0xD9E5, 0xCFE3, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF0A5, 0, 0, /* 0xA0 */
+ 0xDCB0 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x60 */
+ 0xC2ED, 0xD4A6, 0xCDD4, 0xD1B1, /* 0x60 */
+ 0xB3DB, 0xC7FD, 0, 0xB2B5, 0xC2BF, 0xE6E0, 0xCABB, 0xE6E1, /* 0x70 */
+ 0xE6E2, 0xBED4, 0xE6E3, 0xD7A4, 0xCDD5, 0xE6E5, 0xBCDD, 0xE6E4, /* 0x70 */
+ 0xE6E6, 0xE6E7, 0xC2EE, 0, 0xBDBE, 0xE6E8, 0xC2E6, 0xBAA7, /* 0x80 */
+ 0xE6E9, 0, 0xE6EA, 0xB3D2, 0xD1E9, 0, 0, 0xBFA5, /* 0x80 */
+ 0xE6EB, 0xC6EF, 0xE6EC, 0xE6ED, 0, 0, 0xE6EE, 0xC6AD, /* 0x90 */
+ 0xE6EF, 0, 0xC9A7, 0xE6F0, 0xE6F1, 0xE6F2, 0xE5B9, 0xE6F3, /* 0x90 */
+ 0xE6F4, 0xC2E2, 0xE6F5, 0xE6F6, 0xD6E8, 0xE6F7, 0, 0xE6F8, /* 0xA0 */
+ 0xB9C7, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF7BB, 0xF7BA, 0, 0, 0, 0, 0xF7BE, 0xF7BC, /* 0xB0 */
+ 0xBAA1, 0, 0xF7BF, 0, 0xF7C0, 0, 0, 0, /* 0xB0 */
+ 0xF7C2, 0xF7C1, 0xF7C4, 0, 0, 0xF7C3, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xF7C5, 0xF7C6, 0, 0, 0, /* 0xC0 */
+ 0, 0xF7C7, 0, 0xCBE8, 0, 0, 0, 0, /* 0xD0 */
+ 0xB8DF, 0, 0, 0, 0, 0, 0, 0xF7D4, /* 0xD0 */
+ 0, 0xF7D5, 0, 0, 0, 0, 0xF7D6, 0, /* 0xE0 */
+ 0, 0, 0, 0xF7D8, 0, 0xF7DA, 0, 0xF7D7, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xF7DB, 0, 0xF7D9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7D7, 0, 0, 0, 0, /* 0x00 */
+ 0xF7DC, 0, 0, 0, 0, 0, 0, 0xF7DD, /* 0x00 */
+ 0, 0, 0, 0xF7DE, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF7DF, /* 0x10 */
+ 0, 0, 0, 0xF7E0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDBCB, /* 0x20 */
+ 0, 0, 0xD8AA, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE5F7, 0xB9ED, 0, 0, 0, /* 0x30 */
+ 0, 0xBFFD, 0xBBEA, 0xF7C9, 0xC6C7, 0xF7C8, 0, 0xF7CA, /* 0x40 */
+ 0xF7CC, 0xF7CB, 0, 0, 0, 0xF7CD, 0, 0xCEBA, /* 0x40 */
+ 0, 0xF7CE, 0, 0, 0xC4A7 /* 0x50 */
+ /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x70 */
+ 0xD3E3, 0, 0, 0xF6CF, /* 0x70 */
+ 0, 0xC2B3, 0xF6D0, 0, 0, 0xF6D1, 0xF6D2, 0xF6D3, /* 0x80 */
+ 0xF6D4, 0, 0, 0xF6D6, 0, 0xB1AB, 0xF6D7, 0, /* 0x80 */
+ 0xF6D8, 0xF6D9, 0xF6DA, 0, 0xF6DB, 0xF6DC, 0, 0, /* 0x90 */
+ 0, 0, 0xF6DD, 0xF6DE, 0xCFCA, 0, 0xF6DF, 0xF6E0, /* 0x90 */
+ 0xF6E1, 0xF6E2, 0xF6E3, 0xF6E4, 0xC0F0, 0xF6E5, 0xF6E6, 0xF6E7, /* 0xA0 */
+ 0xF6E8, 0xF6E9, 0, 0xF6EA, 0, 0xF6EB, 0xF6EC, 0, /* 0xA0 */
+ 0xF6ED, 0xF6EE, 0xF6EF, 0xF6F0, 0xF6F1, 0xF6F2, 0xF6F3, 0xF6F4, /* 0xB0 */
+ 0xBEA8, 0, 0xF6F5, 0xF6F6, 0xF6F7, 0xF6F8, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xC8FA, 0xF6F9, 0xF6FA, 0xF6FB, 0xF6FC, /* 0xC0 */
+ 0, 0, 0xF6FD, 0xF6FE, 0xF7A1, 0xF7A2, 0xF7A3, 0xF7A4, /* 0xC0 */
+ 0xF7A5, 0, 0, 0xF7A6, 0xF7A7, 0xF7A8, 0xB1EE, 0xF7A9, /* 0xD0 */
+ 0xF7AA, 0xF7AB, 0, 0, 0xF7AC, 0xF7AD, 0xC1DB, 0xF7AE, /* 0xD0 */
+ 0, 0, 0xF7AF /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0xC4F1, /* 0x10 */
+ 0xF0AF, 0xBCA6, 0xF0B0, 0xC3F9, 0, 0xC5B8, 0xD1BB, 0, /* 0x20 */
+ 0xF0B1, 0xF0B2, 0xF0B3, 0xF0B4, 0xF0B5, 0xD1BC, 0, 0xD1EC, /* 0x20 */
+ 0, 0xF0B7, 0xF0B6, 0xD4A7, 0, 0xCDD2, 0xF0B8, 0xF0BA, /* 0x30 */
+ 0xF0B9, 0xF0BB, 0xF0BC, 0, 0, 0xB8EB, 0xF0BD, 0xBAE8, /* 0x30 */
+ 0, 0xF0BE, 0xF0BF, 0xBEE9, 0xF0C0, 0xB6EC, 0xF0C1, 0xF0C2, /* 0x40 */
+ 0xF0C3, 0xF0C4, 0xC8B5, 0xF0C5, 0xF0C6, 0, 0xF0C7, 0xC5F4, /* 0x40 */
+ 0, 0xF0C8, 0, 0, 0, 0xF0C9, 0, 0xF0CA, /* 0x50 */
+ 0xF7BD, 0, 0xF0CB, 0xF0CC, 0xF0CD, 0, 0xF0CE, 0, /* 0x50 */
+ 0, 0, 0, 0xF0CF, 0xBAD7, 0, 0xF0D0, 0xF0D1, /* 0x60 */
+ 0xF0D2, 0xF0D3, 0xF0D4, 0xF0D5, 0xF0D6, 0xF0D8, 0, 0, /* 0x60 */
+ 0xD3A5, 0xF0D7, 0, 0xF0D9, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xF5BA, 0xC2B9, /* 0x70 */
+ 0, 0, 0xF7E4, 0, 0, 0, 0, 0xF7E5, /* 0x80 */
+ 0xF7E6, 0, 0, 0xF7E7, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xF7E8, 0xC2B4, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF7EA, 0, 0xF7EB, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xC2F3, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xF4F0, 0, 0, 0, /* 0xB0 */
+ 0xF4EF, 0, 0, 0xC2E9, 0, 0xF7E1, 0xF7E2, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xBBC6, 0, 0, 0, /* 0xC0 */
+ 0, 0xD9E4, 0, 0, 0, 0xCAF2, 0xC0E8, 0xF0A4, /* 0xC0 */
+ 0, 0xBADA, 0, 0, 0xC7AD, 0, 0, 0, /* 0xD0 */
+ 0xC4AC, 0, 0, 0xF7EC, 0xF7ED, 0xF7EE, 0, 0xF7F0, /* 0xD0 */
+ 0xF7EF, 0, 0xF7F1, 0, 0, 0xF7F4, 0, 0xF7F3, /* 0xE0 */
+ 0, 0xF7F2, 0xF7F5, 0, 0, 0, 0, 0xF7F6, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xEDE9, 0, 0xEDEA, 0xEDEB, 0, 0xF6BC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GB_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xF6BD, 0, 0xF6BE, 0xB6A6, 0, /* 0x00 */
+ 0xD8BE, 0, 0, 0xB9C4, 0, 0, 0, 0xD8BB, /* 0x10 */
+ 0, 0xDCB1, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xCAF3, 0, 0xF7F7, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xF7F8, 0, 0, 0xF7F9, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF7FB, /* 0x30 */
+ 0, 0xF7FA, 0, 0xB1C7, 0, 0xF7FC, 0xF7FD, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF7FE, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xC6EB, 0xECB4, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB3DD, /* 0x70 */
+ 0xF6B3, 0, 0, 0xF6B4, 0xC1E4, 0xF6B5, 0xF6B6, 0xF6B7, /* 0x80 */
+ 0xF6B8, 0xF6B9, 0xF6BA, 0xC8A3, 0xF6BB, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xC1FA, 0xB9A8, 0xEDE8, 0, 0, 0, 0xB9EA, /* 0x90 */
+ 0xD9DF /* 0xA0 */
+ /* 0xA0 */
+};
+
diff --git a/sal/textenc/tcvtscn5.tab b/sal/textenc/tcvtscn5.tab
new file mode 100644
index 000000000000..c2f33488fe53
--- /dev/null
+++ b/sal/textenc/tcvtscn5.tab
@@ -0,0 +1,3235 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the UniCode to DBCS tables for the following */
+/* chinese simplified (China) charsets: */
+/* GBT (GB12345) */
+
+/* Some tables are in ctabscn2.cxx, because these tables are shared with */
+/* GB or GBK. */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2BB, 0xB6A1, 0, 0xC6DF, 0, 0, 0, 0xF8F1, /* 0x00 */
+ 0xD5C9, 0xC8FD, 0xC9CF, 0xCFC2, 0xD8A2, 0xB2BB, 0, 0, /* 0x00 */
+ 0xD8A4, 0xF8A9, 0, 0, 0xC7D2, 0xD8A7, 0xCAC0, 0, /* 0x10 */
+ 0xC7F0, 0xB1FB, 0, 0, 0, 0, 0xD8A9, 0, /* 0x10 */
+ 0, 0, 0xB6AA, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xD8AD, 0, 0, 0xD1BE, 0xE3DC, 0xD6D0, 0, 0, /* 0x20 */
+ 0xF8B3, 0, 0xB4AE, 0, 0, 0, 0xD8BC, 0, /* 0x30 */
+ 0xCDE8, 0xB5A4, 0, 0xD6F7, 0, 0, 0, 0xD8AF, /* 0x30 */
+ 0, 0, 0, 0xC4CB, 0, 0xBEC3, 0, 0xD8B1, /* 0x40 */
+ 0xF7E1, 0, 0, 0xD6AE, 0, 0xD5A7, 0xBAF5, 0xB7A6, /* 0x40 */
+ 0, 0, 0xC6B9, 0xC5D2, 0, 0, 0xB9D4, 0, /* 0x50 */
+ 0xB3CB, 0xD2D2, 0, 0, 0xD8BF, 0xBEC5, 0xC6F2, 0xD2B2, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xD8C0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xC8E9, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xC7AC, 0, /* 0x70 */
+ 0, 0, 0xC2D2, 0, 0, 0, 0xC1CB, 0, /* 0x80 */
+ 0xD3E8, 0, 0, 0xCAC2, 0xB6FE, 0xD8A1, 0xD3DA, 0, /* 0x80 */
+ 0, 0xF8FD, 0xBBA5, 0xD8C1, 0xCEE5, 0xBEAE, 0, 0, /* 0x90 */
+ 0xD8A8, 0, 0, 0xD0A9, 0, 0, 0xD1C7, 0xD8BD, /* 0x90 */
+ 0xD9EF, 0xCDF6, 0xBFBA, 0, 0xBDBB, 0xBAA5, 0xD2E0, 0, /* 0xA0 */
+ 0xBAE0, 0, 0, 0xCFED, 0xBEA9, 0xCDA4, 0xC1C1, 0, /* 0xA0 */
+ 0, 0, 0, 0xD9F1, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xC8CB, 0xD8E9, 0, 0, 0, 0, /* 0xB0 */
+ 0xCAB2, 0xC8CA, 0xD8EC, 0xD8EA, 0xD8C6, 0, 0xF8DF, 0xB3F0, /* 0xC0 */
+ 0, 0xD8EB, 0xBDF1, 0xBDE9, 0, 0xC8D4, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xD7D0, 0xCACB, 0xCBFB, 0xD5CC, /* 0xD0 */
+ 0xB8B6, 0xCFC9, 0, 0, 0, 0xD9DA, 0xD8F0, 0xC7AA, /* 0xD0 */
+ 0, 0xD8EE, 0, 0xB4FA, 0xC1EE, 0xD2D4, 0, 0, /* 0xE0 */
+ 0xD8ED, 0, 0, 0xD8EF, 0, 0, 0, 0, /* 0xE0 */
+ 0xD1F6, 0, 0xD6D9, 0xD8F2, 0, 0xD8F5, 0xBCFE, 0xF8C2, /* 0xF0 */
+ 0, 0, 0, 0xC8CE, 0, 0xB7DD, 0, 0xB7C2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6F3, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xD8F8, 0xD2C1, 0, 0, 0xCEE9, 0xBCBF, 0xB7FC, /* 0x00 */
+ 0xB7A5, 0xD0DD, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xBBEF, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xD8F3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB2AE, /* 0x20 */
+ 0xB9C0, 0, 0xD9A3, 0, 0xB0E9, 0, 0xC1E6, 0, /* 0x30 */
+ 0xC9EC, 0, 0xCBC5, 0, 0xCBC6, 0xD9A4, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xB5E8, 0, 0, 0xB5AB, 0xD8F9, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xCEBB, 0xB5CD, 0xD7A1, /* 0x40 */
+ 0xD7F4, 0xD3D3, 0, 0, 0, 0xBACE, 0, 0xD9A2, /* 0x50 */
+ 0xD9DC, 0xE2C5, 0xD8FD, 0xB7F0, 0xD7F7, 0xD8FE, 0xD8FA, 0xD9A1, /* 0x50 */
+ 0xC4E3, 0, 0, 0, 0xD8F4, 0, 0, 0xD8FB, /* 0x60 */
+ 0, 0xC5E5, 0, 0, 0xC0D0, 0, 0, 0xD1F0, /* 0x60 */
+ 0xB0DB, 0, 0, 0xBCD1, 0xD9A6, 0, 0xD9A5, 0, /* 0x70 */
+ 0, 0, 0, 0xD9AC, 0xD9AE, 0, 0xD9AB, 0xCAB9, /* 0x70 */
+ 0, 0, 0, 0xD9A9, 0xD6B6, 0, 0xC0B4, 0, /* 0x80 */
+ 0xB3DE, 0xD9A8, 0, 0xC0FD, 0, 0xCACC, 0, 0xD9AA, /* 0x80 */
+ 0, 0xD9A7, 0, 0, 0xD9B0, 0, 0xC2D8, 0xB6B1, /* 0x90 */
+ 0, 0, 0, 0xB9A9, 0, 0xD2C0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xC2C2, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xCEEA, 0xBAEE, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xC7D6, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB1E3, /* 0xB0 */
+ 0, 0, 0xF8F2, 0xB4D9, 0xB6ED, 0xD9B4, 0, 0, /* 0xC0 */
+ 0, 0, 0xBFA1, 0, 0, 0, 0xD9DE, 0xC7CE, /* 0xC0 */
+ 0xC0FE, 0xD9B8, 0, 0, 0, 0, 0, 0xCBD7, /* 0xD0 */
+ 0xB7FD, 0, 0xD9B5, 0, 0xD9B7, 0xB1A3, 0xD3E1, 0xD9B9, /* 0xD0 */
+ 0xCFC0, 0xD0C5, 0, 0xD9B6, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xD0DE, 0xB8A9, /* 0xE0 */
+ 0, 0xBEE3, 0, 0xD9BD, 0, 0, 0, 0, /* 0xF0 */
+ 0xD9BA, 0, 0xB0B3, 0, 0, 0, 0xD9C2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD8F6, 0, 0, 0, 0, 0, 0xC1A9, 0, /* 0x00 */
+ 0, 0xB2D6, 0, 0xB8F6, 0xD9C4, 0xB1B6, 0, 0xD9BF, /* 0x00 */
+ 0, 0xC3C7, 0xB5B9, 0, 0xBEF3, 0, 0, 0, /* 0x10 */
+ 0xCCC8, 0xBAF2, 0xD2D0, 0, 0xD9C3, 0, 0, 0xBDE8, /* 0x10 */
+ 0, 0xB3AB, 0, 0, 0, 0xD9C5, 0xBEEB, 0, /* 0x20 */
+ 0xD9C6, 0xD9BB, 0xC4DF, 0xC2D7, 0xD9BE, 0xD9C1, 0xD9C0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xD6B5, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xD9C8, 0, 0, 0, 0xBCD9, /* 0x40 */
+ 0xD9CA, 0xCEB0, 0, 0, 0xD9BC, 0, 0xD9CB, 0xC6AB, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xD9C9, 0, 0, /* 0x50 */
+ 0, 0, 0xD7F6, 0, 0xCDA3, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xBDA1, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xD9CC, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xB2E0, 0xD5EC, 0xC5BC, 0xCDB5, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xBFFE, 0, 0, 0, 0, 0xB8B5, 0, 0, /* 0x80 */
+ 0xC0FC, 0, 0, 0, 0, 0xB0F8, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xD8F7, 0, /* 0x90 */
+ 0xC9A1, 0xB1B8, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xF8C1, 0xB4F6, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xB4DF, 0xD3B6, 0, 0, /* 0xA0 */
+ 0, 0, 0xB0C1, 0xB4AB, 0xD8F1, 0xD5AE, 0, 0xC9CB, /* 0xB0 */
+ 0, 0, 0xD9D1, 0xC9B5, 0, 0, 0xC7E3, 0, /* 0xB0 */
+ 0, 0, 0xD9CD, 0, 0, 0xBDF6, 0, 0, /* 0xC0 */
+ 0, 0xD9DD, 0, 0, 0, 0, 0, 0xCFF1, /* 0xC0 */
+ 0, 0xC7C8, 0, 0, 0, 0xC6CD, 0xD9D2, 0, /* 0xD0 */
+ 0, 0, 0xC1C5, 0, 0, 0, 0xCEB1, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xBDC4, 0xD9D6, 0xC9AE, /* 0xE0 */
+ 0xD9C7, 0, 0, 0, 0xD9D5, 0xD9D4, 0xD9D7, 0, /* 0xE0 */
+ 0, 0, 0, 0xCBDB, 0, 0xBDA9, 0, 0, /* 0xF0 */
+ 0, 0xBCDB, 0, 0xC6A7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2C7, 0, 0xD9AF, 0, 0xD2DA, 0, 0xD9D3, 0xD9D8, /* 0x00 */
+ 0xBFEB, 0xBCF3, 0, 0xD9D9, 0, 0, 0, 0, /* 0x00 */
+ 0xD9CF, 0, 0xC8E5, 0, 0xD9B1, 0xD9AD, 0, 0, /* 0x10 */
+ 0xF8C5, 0, 0, 0, 0, 0, 0, 0xB3A5, /* 0x10 */
+ 0, 0xC0DC, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xD3C5, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xB4A2, 0, 0, 0, 0, 0xD9B3, /* 0x30 */
+ 0, 0, 0xD9D0, 0xD9CE, 0xD9B2, 0, 0, 0, /* 0x30 */
+ 0xD8A3, 0xD4CA, 0, 0xD4AA, 0xD0D6, 0xB3E4, 0xD5D7, 0, /* 0x40 */
+ 0xCFC8, 0xB9E2, 0, 0xBFCB, 0, 0xC3E2, 0, 0, /* 0x40 */
+ 0, 0xB6D2, 0xB6F9, 0, 0xCDC3, 0xD9EE, 0xD9F0, 0, /* 0x50 */
+ 0, 0, 0xF8AC, 0, 0xB6B5, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xBEA4, 0, 0, 0xC8EB, 0, 0, /* 0x60 */
+ 0xC8AB, 0xC1BD, 0, 0xB0CB, 0xB9AB, 0xC1F9, 0xD9E2, 0, /* 0x60 */
+ 0, 0xB9B2, 0, 0, 0, 0xB1F8, 0xC6E4, 0xBEDF, /* 0x70 */
+ 0xB5E4, 0xD7C8, 0, 0, 0xBCE6, 0, 0, 0, /* 0x70 */
+ 0xBCBD, 0, 0xD8E7, 0, 0, 0xC4DA, 0, 0, /* 0x80 */
+ 0, 0xC8BD, 0, 0, 0xB2E1, 0xD4D9, 0, 0, /* 0x80 */
+ 0, 0, 0xC3B0, 0, 0, 0xC3E1, 0xDAA2, 0xC8DF, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xB9DA, 0, 0xDAA3, 0, 0xD4A9, 0xDAA4, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xD9FB, 0xB6AC, 0, 0, 0, /* 0xA0 */
+ 0xB1F9, 0xD9FC, 0xF8A8, 0xBEF6, 0, 0xBFF6, 0xD2B1, 0xC0E4, /* 0xB0 */
+ 0, 0, 0, 0, 0xD9FE, 0xD9FD, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xC6E0, 0, 0xF9A9, 0xDAA1, /* 0xC0 */
+ 0xBEBB, 0xC1B9, 0, 0xB5F2, 0xC1E8, 0xB6B3, 0, 0xBCF5, /* 0xC0 */
+ 0, 0xB4D5, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xC1DD, 0, 0xC4FD, 0, 0, /* 0xD0 */
+ 0xF8C0, 0xB7B2, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF8DD, 0, 0, /* 0xE0 */
+ 0xBBCB, 0xBFAD, 0, 0xB5CA, 0, 0xDBC9, 0xD0D7, 0, /* 0xF0 */
+ 0xCDB9, 0xB0BC, 0xB3F6, 0, 0xDBCA, 0xBAAF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB5B6, 0xB5F3, 0xD8D6, 0xC8D0, 0, 0, 0xB7D6, 0xC7D0, /* 0x00 */
+ 0xD8D7, 0, 0xBFAF, 0, 0, 0, 0xD8D8, 0, /* 0x00 */
+ 0, 0xD0CC, 0xF8BB, 0, 0, 0, 0xEBBE, 0xC1D0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xB3F5, 0, 0, /* 0x10 */
+ 0xC9BE, 0, 0, 0, 0xC5D0, 0, 0, 0, /* 0x20 */
+ 0xC5D9, 0xC0FB, 0, 0xB1F0, 0, 0, 0xB9CE, 0, /* 0x20 */
+ 0xB5BD, 0, 0, 0xD8DA, 0, 0, 0xD6C6, 0xCBA2, /* 0x30 */
+ 0xC8AF, 0xC9B2, 0xB4CC, 0xBFCC, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xB6E7, 0, 0xCCEA, 0xD8D9, 0, 0, 0xD4F2, /* 0x40 */
+ 0, 0, 0xCFF7, 0xF8C8, 0xD8DD, 0xC7B0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xCCDE, 0, 0xC6CA, 0, /* 0x50 */
+ 0, 0, 0, 0xB8D5, 0xD8E0, 0, 0xD8DE, 0, /* 0x50 */
+ 0, 0xD8DF, 0, 0, 0, 0xB0FE, 0, 0, /* 0x60 */
+ 0, 0xCAA3, 0xBCF4, 0, 0, 0, 0xB9D0, 0xB8B1, /* 0x60 */
+ 0, 0, 0xB8EE, 0, 0xD8DC, 0xB4B4, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xD8E2, 0, 0xBDCB, /* 0x70 */
+ 0, 0xD8E4, 0xD8E3, 0xBBAE, 0, 0, 0, 0xBEE7, /* 0x80 */
+ 0xC5FC, 0xC1F5, 0xB9F4, 0, 0xD8DB, 0xBDA3, 0, 0, /* 0x80 */
+ 0xD8E5, 0xBCC1, 0, 0xD8E6, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xC1A6, 0, 0, 0, 0xB9A6, /* 0x90 */
+ 0xBCD3, 0, 0, 0xC1D3, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xD6FA, 0xC5AC, 0xBDD9, 0xDBBE, 0xDBBF, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xDBC0, 0, /* 0xB0 */
+ 0, 0xBEA2, 0, 0xB2AA, 0, 0, 0, 0xD3C2, /* 0xC0 */
+ 0, 0xC3E3, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xDBC2, 0, 0xC0D5, 0, 0, 0xB6AF, 0xDBC3, 0, /* 0xD0 */
+ 0xBFB1, 0xCEF1, 0, 0xD1AB, 0, 0xCAA4, 0xC0CD, 0xC4BC, /* 0xD0 */
+ 0, 0, 0xCAC6, 0, 0xC7DA, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xDBC4, 0xDBBD, 0, 0, 0, 0xC0F8, 0, 0, /* 0xF0 */
+ 0xC8B0, 0xD9E8, 0xC9D7, 0, 0, 0, 0xB9B4, 0xCEF0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD4C8, 0, 0, 0, 0, 0xB0FC, 0xB4D2, 0, /* 0x00 */
+ 0xD0D9, 0, 0, 0, 0, 0xD9E9, 0, 0xDECB, /* 0x00 */
+ 0xD9EB, 0, 0, 0, 0, 0xD8B0, 0xBBAF, 0xB1B1, /* 0x10 */
+ 0, 0xB3D7, 0xD8CE, 0, 0, 0xD4D1, 0, 0, /* 0x10 */
+ 0xBDB3, 0xBFEF, 0, 0xCFBB, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xB7CB, 0, 0, 0xD8D0, 0, 0xBBE3, /* 0x20 */
+ 0, 0xD8D1, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xC6A5, 0, 0, 0, 0, 0xD8D2, 0xC4E4, /* 0x30 */
+ 0xC7F8, 0xCAAE, 0, 0xC7A7, 0, 0xD8A6, 0, 0xC9FD, /* 0x40 */
+ 0xCEE7, 0xBBDC, 0xB0EB, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xB1B0, 0xD7E4, 0xD7BF, 0xD0AD, 0, 0, 0xC4CF, /* 0x50 */
+ 0, 0, 0xB2A9, 0, 0xB2B7, 0, 0xB1E5, 0xDFB2, /* 0x50 */
+ 0xD5BC, 0xBFA8, 0, 0xD8D5, 0, 0, 0xD8D4, 0xCED4, /* 0x60 */
+ 0, 0xDAE0, 0, 0, 0, 0, 0xD8B4, 0xC3AE, /* 0x60 */
+ 0xD3A1, 0xCEA3, 0, 0xBCB4, 0xC8B4, 0xC2D1, 0, 0xBEED, /* 0x70 */
+ 0xD0B6, 0, 0xDAE1, 0, 0, 0, 0, 0xC7E4, /* 0x70 */
+ 0, 0, 0xF8A7, 0, 0xB6F2, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xC0E5, 0xD8C7, 0xBAF1, 0, 0, 0xD8C8, 0, 0xD4AD, /* 0x90 */
+ 0xB2DE, 0, 0xCFE1, 0, 0, 0xD8CA, 0xCFC3, 0, /* 0xA0 */
+ 0xB3F8, 0xBEC7, 0, 0, 0, 0xD1E1, 0xD8CB, 0, /* 0xA0 */
+ 0, 0, 0xC0F7, 0, 0xD8C9, 0, 0xDBCC, 0, /* 0xB0 */
+ 0, 0, 0, 0xC8A5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xC8FE, 0, 0xB2CE, 0, 0, 0, 0, /* 0xC0 */
+ 0xD3D6, 0xB2E6, 0xBCB0, 0xD3D1, 0, 0xB7B4, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xCAE5, 0, 0xC8A1, 0xCADC, /* 0xD0 */
+ 0, 0xD0F0, 0, 0xC5D1, 0, 0, 0, 0xDBC5, /* 0xD0 */
+ 0, 0, 0xB4D4, 0xBFDA, 0xB9C5, 0xBEE4, 0xC1ED, 0, /* 0xE0 */
+ 0xDFB6, 0xDFB5, 0xF9A3, 0xBDD0, 0xD5D9, 0xB0C8, 0xB6A3, 0xBFC9, /* 0xE0 */
+ 0xF8EB, 0xDFB3, 0xCAB7, 0xD3D2, 0, 0xD8CF, 0xF8F8, 0, /* 0xF0 */
+ 0xCBBE, 0, 0, 0xDFB7, 0xB5F0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD3F5, 0, 0xB3D4, 0xB8F7, 0, 0xDFBA, 0, /* 0x00 */
+ 0xBACF, 0xBCAA, 0xB5F5, 0, 0xCDAC, 0xC3FB, 0xE1E1, 0xC0F4, /* 0x00 */
+ 0xCDC2, 0xCFF2, 0xDFB8, 0, 0, 0xC2C0, 0xDFB9, 0, /* 0x10 */
+ 0, 0, 0, 0xBEFD, 0, 0xC1DF, 0xCDCC, 0xD2F7, /* 0x10 */
+ 0xB7CD, 0xDFC1, 0, 0xDFC4, 0, 0, 0xB7F1, 0xB0C9, /* 0x20 */
+ 0, 0xB7D4, 0, 0xBAAC, 0, 0xBFD4, 0xCBB1, 0, /* 0x20 */
+ 0, 0xD6A8, 0xDFC5, 0, 0xCEE2, 0xB3B3, 0, 0, /* 0x30 */
+ 0xCEFC, 0xB4B5, 0, 0xCEC7, 0xBAF0, 0, 0xCEE1, 0, /* 0x30 */
+ 0xD1BD, 0, 0, 0xDFC0, 0, 0, 0xB4F4, 0, /* 0x40 */
+ 0xB3CA, 0, 0xB8E6, 0xDFBB, 0, 0, 0, 0, /* 0x40 */
+ 0xC4C5, 0, 0, 0, 0xDFBE, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xC4D8, 0, 0xDFCA, 0, 0xDFCF, 0, /* 0x60 */
+ 0xD6DC, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xDFC9, 0xDFDA, 0xCEB6, 0, 0xBAC7, 0xDFCE, 0xDFC8, /* 0x70 */
+ 0xC5DE, 0, 0, 0xC9EB, 0xBAF4, 0xC3FC, 0, 0, /* 0x70 */
+ 0xBED7, 0, 0xDFC6, 0, 0xDFCD, 0, 0xC5D8, 0, /* 0x80 */
+ 0, 0, 0, 0xD5A6, 0xBACD, 0, 0xBECC, 0xD3BD, /* 0x80 */
+ 0xB8C0, 0, 0xD6E4, 0, 0xDFC7, 0xB9BE, 0xBFA7, 0, /* 0x90 */
+ 0, 0, 0xDFCB, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xDFDB, 0xDFE5, 0, 0xDFD7, 0xDFD6, /* 0xA0 */
+ 0xD7C9, 0xDFE3, 0xDFE4, 0xE5EB, 0xD2A7, 0xDFD2, 0, 0xBFA9, /* 0xA0 */
+ 0, 0xD4DB, 0, 0xBFC8, 0xDFD4, 0, 0, 0, /* 0xB0 */
+ 0xCFCC, 0, 0, 0xDFDD, 0xDFC3, 0xD1CA, 0, 0xDFDE, /* 0xB0 */
+ 0xB0A7, 0xC6B7, 0xDFD3, 0, 0xBAE5, 0, 0xB6DF, 0xCDDB, /* 0xC0 */
+ 0xB9FE, 0xD4D5, 0, 0, 0xDFDF, 0, 0xB0A5, 0xDFE7, /* 0xC0 */
+ 0xDFD1, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xDFE1, 0, 0, 0, 0xDFE8, 0, /* 0xD0 */
+ 0, 0xD4B1, 0, 0, 0, 0xB8E7, 0xC5B6, 0xDFEA, /* 0xE0 */
+ 0xC9DA, 0xC1A8, 0xC4C4, 0, 0, 0xBFDE, 0xCFF8, 0, /* 0xE0 */
+ 0, 0, 0xD5DC, 0xDFEE, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xB2B8, 0, 0xBADF, 0xDFEC, 0, 0xDBC1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1E4, 0, 0, 0xDFC2, 0, 0xCBF4, 0xB4BD, /* 0x00 */
+ 0, 0xB0A6, 0, 0, 0, 0, 0, 0xDFF1, /* 0x00 */
+ 0xCCC6, 0xDFF2, 0, 0, 0xDFED, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xDFF0, 0, 0, 0, 0xDFF3, /* 0x20 */
+ 0, 0, 0xDFF4, 0, 0xBBA3, 0, 0xCADB, 0xCEA8, /* 0x20 */
+ 0xE0A7, 0xB3AA, 0, 0xE0A6, 0, 0, 0, 0xE0A1, /* 0x30 */
+ 0, 0, 0, 0, 0xDFFE, 0, 0xCDD9, 0xDFFC, /* 0x30 */
+ 0, 0xDFFA, 0, 0xBFD0, 0xD7C4, 0, 0xC9CC, 0, /* 0x40 */
+ 0, 0xDFF8, 0xB0A1, 0, 0, 0, 0, 0xCECA, /* 0x40 */
+ 0xDFFD, 0, 0, 0xC6F4, 0, 0xDFFB, 0xE0A2, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xE0A8, 0, 0xD1C6, 0, /* 0x50 */
+ 0, 0xB7C8, 0, 0, 0xC6A1, 0xC9B6, 0xC0B2, 0, /* 0x60 */
+ 0, 0, 0xC5BE, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xE0A3, 0xE0A4, 0xE0A5, /* 0x70 */
+ 0, 0, 0, 0xE0B4, 0xCCE4, 0, 0xE0B1, 0, /* 0x70 */
+ 0xBFA6, 0xE0AF, 0xCEB9, 0xE0AB, 0xC9C6, 0, 0, 0xC0AE, /* 0x80 */
+ 0xE0AE, 0xBAED, 0xBAB0, 0xE0A9, 0, 0, 0, 0xDFF6, /* 0x80 */
+ 0, 0xE0B3, 0, 0, 0xE0B8, 0, 0, 0, /* 0x90 */
+ 0xB4AD, 0xE0B9, 0xBBBD, 0, 0xCFB2, 0xBAC8, 0, 0xE0B0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD0FA, /* 0xA0 */
+ 0, 0, 0xC9A5, 0, 0xC7C7, 0, 0xB5A5, 0, /* 0xA0 */
+ 0, 0xE0AC, 0xD3B4, 0xD4FB, 0, 0xDFF7, 0, 0, /* 0xB0 */
+ 0, 0xE0AD, 0, 0xD3F7, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE0C4, 0xD0E1, 0xC7BA, 0xD8C4, /* 0xC0 */
+ 0, 0xE0BC, 0, 0, 0xE0C9, 0xE0CA, 0xC2F0, 0, /* 0xC0 */
+ 0, 0xE0BE, 0xE0AA, 0xC9A4, 0xE0C1, 0, 0xE0B2, 0, /* 0xD0 */
+ 0, 0, 0xCED8, 0, 0xCAC8, 0xE0C3, 0, 0xE0B5, /* 0xD0 */
+ 0, 0xCECB, 0, 0xCBC3, 0xE0CD, 0xE0C6, 0xE0C2, 0, /* 0xE0 */
+ 0xE0CB, 0xDFEF, 0xE0BA, 0, 0xE0C0, 0, 0, 0xE0C5, /* 0xE0 */
+ 0, 0, 0xE0C7, 0, 0, 0xE0CC, 0xDFD9, 0xE0BB, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xCBD4, 0xE0D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE0D6, 0xE0D2, 0, 0, 0, 0, 0xCCBE, 0, /* 0x00 */
+ 0xE0D0, 0xBCCE, 0, 0, 0xE0D1, 0xE0B6, 0xB8C2, 0xD8C5, /* 0x00 */
+ 0, 0, 0, 0, 0xC5BB, 0, 0xDFF5, 0xB3A2, /* 0x10 */
+ 0xD0EA, 0, 0, 0xC2EF, 0xDFE9, 0, 0xE0CF, 0xE0BD, /* 0x10 */
+ 0, 0, 0, 0xE0D4, 0, 0, 0, 0xE0D7, /* 0x20 */
+ 0, 0xBBA9, 0, 0, 0xE0DC, 0xE0D8, 0xDFEB, 0xD0A5, /* 0x20 */
+ 0xDFB4, 0, 0xB3B0, 0, 0xD7EC, 0xDFD8, 0xCBBB, 0, /* 0x30 */
+ 0xDFBC, 0xE0DA, 0, 0xCEFB, 0, 0, 0, 0xBAD9, /* 0x30 */
+ 0, 0xF8B0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE0E1, 0xE0DD, 0xD2AD, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE0E2, 0, 0, 0xE0DB, /* 0x50 */
+ 0xE0D9, 0xE0DF, 0, 0, 0, 0xDFD0, 0, 0, /* 0x50 */
+ 0xDFD5, 0, 0xE0DE, 0, 0xE0E4, 0xDFE6, 0xDFDC, 0, /* 0x60 */
+ 0xC6F7, 0xD8AC, 0xD4EB, 0xE0E6, 0xCAC9, 0, 0, 0xE0C8, /* 0x60 */
+ 0, 0xE0E5, 0xDFE0, 0, 0xC5E7, 0, 0xB8C1, 0, /* 0x70 */
+ 0xB6D6, 0xF8AB, 0, 0xE0E7, 0xE0E8, 0, 0, 0, /* 0x70 */
+ 0xDFCC, 0, 0, 0, 0, 0xE0E9, 0xE0E3, 0xCFC5, /* 0x80 */
+ 0, 0, 0, 0, 0xDFE2, 0, 0xBABF, 0xCCE7, /* 0x80 */
+ 0, 0, 0, 0xE0EA, 0, 0xE0E0, 0, 0, /* 0x90 */
+ 0, 0xC4F6, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xDFBF, 0, /* 0xA0 */
+ 0xC1FC, 0, 0, 0, 0, 0, 0xF8F5, 0xE0EB, /* 0xA0 */
+ 0, 0, 0, 0xE0B7, 0xD1CF, 0, 0xE0D3, 0xC8C2, /* 0xB0 */
+ 0, 0, 0, 0, 0xBDC0, 0, 0, 0, /* 0xB0 */
+ 0xDFF9, 0xE0BF, 0xCFF9, 0, 0, 0xD9E6, 0, 0, /* 0xC0 */
+ 0xDFBD, 0xF8D3, 0xC4D2, 0, 0xF8EA, 0, 0, 0, /* 0xC0 */
+ 0, 0xD6F6, 0, 0, 0xE0EC, 0, 0, 0xE0ED, /* 0xD0 */
+ 0, 0, 0xC7F4, 0xCBC4, 0, 0xE0EE, 0xBBD8, 0xD8B6, /* 0xD0 */
+ 0xD2F2, 0xE0EF, 0, 0, 0xB6DA, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE0F1, 0, 0, 0, 0, /* 0xE0 */
+ 0xC0A7, 0xB4D1, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xE0F2, 0xB9CC, 0, 0, 0, 0, 0xE0F3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC6D4, 0xE0F4, 0, 0, 0xE0F0, /* 0x00 */
+ 0xC8A6, 0xE0F6, 0xE0F5, 0xB9FA, 0, 0xCEA7, 0, 0, /* 0x00 */
+ 0, 0, 0xD4B0, 0xD4B2, 0, 0, 0xCDBC, 0, /* 0x10 */
+ 0xCDC5, 0, 0, 0, 0xE0F7, 0, 0, 0xCDC1, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xD4DA, 0xDBD7, 0xDBD9, 0, 0xDBD8, 0xB9E7, 0xDBDC, 0xDBDD, /* 0x20 */
+ 0xB5D8, 0, 0, 0xDBDA, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xDBDF, 0, 0, 0xBBF8, 0, /* 0x30 */
+ 0xD6B7, 0, 0xDBE0, 0, 0, 0, 0, 0xBEF9, /* 0x40 */
+ 0, 0, 0xB7BB, 0, 0xDBD0, 0xCCAE, 0xBFB2, 0, /* 0x40 */
+ 0xD7F8, 0xBFD3, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xC6C2, 0, 0, 0xC0A4, 0, 0xCCB9, 0, /* 0x60 */
+ 0xDBE7, 0xDBE1, 0xC6BA, 0xDBE3, 0, 0xDBE8, 0, 0xC5F7, /* 0x60 */
+ 0, 0, 0, 0xDBEA, 0, 0, 0xDBE9, 0xBFC0, /* 0x70 */
+ 0, 0, 0, 0xDBE6, 0xDBE5, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xB4B9, 0xC0AC, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xD0CD, 0xDBED, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xDBF2, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xB6E2, 0, 0, 0, 0, /* 0x90 */
+ 0xDBF3, 0xDBD2, 0xB9B8, 0xD4AB, 0xDBEC, 0, 0, 0xDBF0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xBFE5, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xDBF9, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xB9A1, 0xB0A3, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xC2F1, 0, 0, 0xB3C7, 0xDBEF, /* 0xC0 */
+ 0, 0, 0xDBF8, 0, 0xC6D2, 0xDBF4, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xDBFE, 0, 0xD3F2, /* 0xD0 */
+ 0xB2BA, 0xDBEB, 0, 0, 0xDBFD, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xDCA4, 0, 0xDBFB, /* 0xE0 */
+ 0, 0, 0, 0, 0xDBFA, 0, 0, 0xD6B4, /* 0xF0 */
+ 0xDBFC, 0xC5E0, 0xBBF9, 0, 0, 0xDCA3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDCA5, 0, 0xCCC3, 0, 0, 0xBCE1, 0xB6D1, 0xDDC0, /* 0x00 */
+ 0, 0, 0xDBD1, 0xDCA1, 0, 0xDCA2, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xDBF1, 0, /* 0x10 */
+ 0, 0xDCA7, 0, 0, 0, 0xDBF6, 0xDCA6, 0, /* 0x10 */
+ 0xDCA9, 0xB1A4, 0, 0, 0xB5CC, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xBFB0, 0, 0, 0, 0, 0xD2A2, /* 0x20 */
+ 0xD1DF, 0xB1A8, 0, 0, 0xB3A1, 0xB6C2, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xDCA8, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xBFE9, 0xDCE3, 0xCBFA, 0xEBF3, 0, 0xDBEE, /* 0x40 */
+ 0, 0xCBDC, 0xDBF5, 0, 0xCBFE, 0, 0, 0xCDBF, /* 0x50 */
+ 0xCCC1, 0, 0, 0, 0, 0, 0xC8FB, 0, /* 0x50 */
+ 0, 0, 0xCEEB, 0, 0xDBF7, 0xDCAA, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xCCEE, 0xDCAB, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xB3BE, 0, 0, /* 0x70 */
+ 0, 0xC7B5, 0, 0, 0, 0, 0xDBD3, 0, /* 0x70 */
+ 0xDCAF, 0xDCAC, 0, 0xBEB3, 0, 0xCAFB, 0, 0, /* 0x80 */
+ 0, 0xDCAD, 0xB5E6, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xC9CA, 0xC4B9, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xDCAE, 0, 0xD7B9, 0, 0xD4F6, 0xD0E6, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xC4AB, 0xB6D5, 0, 0, 0, 0, 0xB6E9, 0, /* 0xA0 */
+ 0, 0, 0, 0xB7D8, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xC7BD, 0xDBD4, 0, 0xBFD1, 0, /* 0xB0 */
+ 0, 0xB1DA, 0, 0, 0, 0xDBD5, 0, 0xCCB3, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xDBD6, 0, 0xD1B9, 0, 0xBABE, 0, 0, /* 0xD0 */
+ 0xC0DD, 0xDBDB, 0xDBE4, 0, 0, 0, 0xBBB5, 0xC2A2, /* 0xD0 */
+ 0xDBE2, 0, 0xDBDE, 0, 0xC8C0, 0, 0, 0, /* 0xE0 */
+ 0, 0xB0D3, 0, 0xCABF, 0xC8C9, 0, 0, 0xD7B3, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xD2BC, 0xBAF8, 0, 0, 0xCAD9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2BA, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCFC4, /* 0x00 */
+ 0, 0, 0, 0, 0xD9E7, 0xCFA6, 0xCDE2, 0, /* 0x10 */
+ 0, 0xD9ED, 0xB6E0, 0, 0xD2B9, 0, 0, 0xB9BB, /* 0x10 */
+ 0, 0, 0xC3CE, 0, 0xE2B9, 0xE2B7, 0, 0xB4F3, /* 0x20 */
+ 0, 0xCCEC, 0xCCAB, 0xB7F2, 0, 0xD8B2, 0xD1EB, 0xBABB, /* 0x20 */
+ 0, 0xCAA7, 0, 0, 0, 0, 0, 0xD2C4, /* 0x30 */
+ 0xF8C9, 0, 0, 0, 0xDEC5, 0, 0xBCD0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xD1D9, 0, 0, 0xC6E6, /* 0x40 */
+ 0xC4CE, 0xB7EE, 0, 0, 0, 0, 0xBFFC, 0xD7E0, /* 0x40 */
+ 0xDBBC, 0xC6F5, 0, 0, 0xB1BC, 0xDEC8, 0, 0xCCD7, /* 0x50 */
+ 0xDECA, 0, 0xDEC9, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xB5EC, 0, 0xC9DD, 0, 0, 0xB0C2, 0, 0, /* 0x60 */
+ 0, 0xDEC6, 0xB6E1, 0, 0xBDB1, 0, 0xB7DC, 0, /* 0x60 */
+ 0, 0, 0, 0xC5AE, 0xC5AB, 0, 0xC4CC, 0, /* 0x70 */
+ 0xBCE9, 0xCBFD, 0, 0, 0, 0xBAC3, 0, 0, /* 0x70 */
+ 0, 0xE5F9, 0xC8E7, 0xE5FA, 0xCDFD, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xC8D1, 0, 0, 0xE5FB, 0, 0, /* 0x80 */
+ 0, 0, 0xB6CA, 0xBCCB, 0, 0, 0xD1FD, 0xE6A1, /* 0x90 */
+ 0, 0xC3EE, 0, 0, 0, 0xD7B1, 0xE6A4, 0, /* 0x90 */
+ 0, 0, 0, 0xE5FE, 0xE6A5, 0xCDD7, 0, 0, /* 0xA0 */
+ 0xB7C1, 0, 0, 0, 0, 0, 0xC4DD, 0xE6A8, /* 0xA0 */
+ 0, 0, 0xE6A7, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xC3C3, 0, 0xC6DE, 0, 0, 0xE6AA, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xC4B7, 0, /* 0xC0 */
+ 0, 0, 0xE6A2, 0xCABC, 0, 0, 0, 0, /* 0xC0 */
+ 0xBDE3, 0xB9C3, 0xE6A6, 0xD0D5, 0xCEAF, 0, 0, 0xE6A9, /* 0xD0 */
+ 0xE6B0, 0, 0xD2A6, 0, 0xBDAA, 0xE6AD, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xE6AF, 0, 0xC0D1, 0, 0, /* 0xE0 */
+ 0xD2CC, 0, 0, 0, 0xBCA7, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xE6B1, 0, 0xD2F6, 0, 0, 0, 0xD7CB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDFE, 0, 0xCDDE, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xE6B3, 0, 0, 0xE6B2, 0, 0, 0, /* 0x00 */
+ 0, 0xE6B6, 0, 0xE6B8, 0, 0, 0, 0, /* 0x10 */
+ 0xC4EF, 0, 0, 0, 0xC4C8, 0, 0, 0xBEEA, /* 0x10 */
+ 0xC9EF, 0, 0, 0xE6B7, 0, 0xB6F0, 0, 0, /* 0x20 */
+ 0, 0xC3E4, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xD3E9, 0, 0, 0, 0, 0xC8A2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE6BD, 0, 0, 0, /* 0x30 */
+ 0xE6B9, 0xC2A6, 0, 0, 0, 0, 0xC6C5, 0, /* 0x40 */
+ 0, 0xCDF1, 0xE6BB, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE6BC, 0, 0, /* 0x50 */
+ 0, 0, 0xBBE9, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xE6BE, 0, 0, 0, 0xB8BE, 0xE6BA, /* 0x60 */
+ 0, 0, 0xC0B7, 0, 0, 0xE6AB, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6C3, /* 0x70 */
+ 0, 0, 0xE6C4, 0, 0, 0, 0, 0xD0F6, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xC3BD, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xC3C4, 0xE6C2, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE6B4, /* 0xA0 */
+ 0, 0, 0xE6C1, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE6C7, 0xCFB1, 0, 0xEBF4, 0, 0, /* 0xB0 */
+ 0xE6CA, 0, 0, 0, 0, 0xC2E8, 0xE6C5, 0, /* 0xB0 */
+ 0, 0xBCDE, 0xC9A9, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xBCB5, 0, 0, 0xCFD3, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xE6CE, 0xE5FD, /* 0xD0 */
+ 0xE6D0, 0, 0, 0, 0xE6D1, 0, 0, 0, /* 0xD0 */
+ 0xE6CB, 0xB5D5, 0, 0xE6CC, 0, 0, 0xE6CF, 0, /* 0xE0 */
+ 0, 0xC4DB, 0, 0xE6C6, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE5FC, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0xE6B5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE6A3, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xE6AC, 0xE6D2, 0, 0xE6BF, 0xBDBF, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE6D4, 0xE6D3, /* 0x10 */
+ 0, 0xE6CD, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xE6C8, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE6C9, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xD3A4, 0, 0xE6D5, 0, 0xD9F8, 0, 0, 0xE6D6, /* 0x30 */
+ 0xC9F4, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xE6D7, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE6AE, 0, 0, 0, /* 0x40 */
+ 0xD7D3, 0xE6DD, 0, 0xE6DE, 0xBFD7, 0xD4D0, 0, 0xD7D6, /* 0x50 */
+ 0xB4E6, 0, 0xE6DA, 0xD8C3, 0xD7CE, 0xD0A2, 0, 0xC3CF, /* 0x50 */
+ 0, 0, 0xE6DF, 0xBCBE, 0xB9C2, 0xE6DB, 0, 0, /* 0x60 */
+ 0, 0xBAA2, 0, 0xCBEF, 0xD8AB, 0, 0, 0, /* 0x60 */
+ 0xCAEB, 0xE5EE, 0, 0xE6DC, 0, 0xB7F5, 0, 0, /* 0x70 */
+ 0xD1A7, 0, 0xC8E6, 0, 0, 0xC4F5, 0, 0xC2CF, /* 0x70 */
+ 0xE5B2, 0, 0, 0xCBFC, 0xE5B3, 0xD5AC, 0, 0xD3EE, /* 0x80 */
+ 0xCAD8, 0xB0B2, 0, 0xCBCE, 0xCDEA, 0, 0, 0xBAEA, /* 0x80 */
+ 0, 0, 0, 0xE5B5, 0, 0xE5B4, 0, 0xD7DA, /* 0x90 */
+ 0xB9D9, 0xD6E6, 0xB6A8, 0xCDF0, 0xD2CB, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xBFCD, 0xD0FB, 0xCAD2, 0xE5B6, 0xBBC2, 0, /* 0xA0 */
+ 0, 0, 0, 0xB9AC, 0, 0, 0, 0, /* 0xA0 */
+ 0xD4D7, 0, 0, 0xBAA6, 0xD1E7, 0xCFFC, 0xBCD2, 0, /* 0xB0 */
+ 0xE5B7, 0xC8DD, 0, 0, 0, 0, 0, 0xCBDE, /* 0xB0 */
+ 0, 0, 0xBCC5, 0, 0xBCC4, 0xD2FA, 0xC3DC, 0xBFDC, /* 0xC0 */
+ 0, 0, 0, 0, 0xB8BB, 0, 0, 0, /* 0xC0 */
+ 0xC3C2, 0, 0xBAAE, 0xD4A2, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xC4AF, 0xB2EC, /* 0xD0 */
+ 0, 0xB9D1, 0xC7DE, 0, 0xE5BB, 0xC1C8, 0xCAB5, 0xC4FE, /* 0xE0 */
+ 0xD5AF, 0xC9F3, 0, 0xD0B4, 0xBFED, 0, 0xE5BC, 0, /* 0xE0 */
+ 0xE5BE, 0, 0, 0, 0, 0xB3E8, 0xB1A6, 0, /* 0xF0 */
+ 0xB4E7, 0, 0xCBC2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB7E2, 0, 0, 0xC9E4, 0, 0, 0xBDAB, /* 0x00 */
+ 0xD7A8, 0xCEBE, 0xD7F0, 0xD1B0, 0, 0xB6D4, 0xB5BC, 0xD0A1, /* 0x00 */
+ 0, 0xC9D9, 0, 0, 0, 0xE6D8, 0xBCE2, 0, /* 0x10 */
+ 0, 0, 0xC9D0, 0, 0xE6D9, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xDECC, 0, 0xD3C8, 0xDECD, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xDECE, 0, 0, 0, /* 0x20 */
+ 0, 0xBECD, 0, 0, 0, 0, 0, 0xDECF, /* 0x30 */
+ 0xCAAC, 0xD2FC, 0xB3DF, 0xE5EA, 0xC4E1, 0, 0xCEB2, 0xC4F2, /* 0x30 */
+ 0xBED6, 0xC6A8, 0, 0, 0, 0xBED3, 0, 0, /* 0x40 */
+ 0xC7FC, 0xCCEB, 0xBDEC, 0xCEDD, 0, 0, 0xCABA, 0xC6C1, /* 0x40 */
+ 0xE5EC, 0xD0BC, 0, 0, 0, 0xD5B9, 0, 0, /* 0x50 */
+ 0, 0xE5ED, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xCDC0, 0, 0xC2C5, 0xE5EF, 0xB2E3, 0xC2C4, 0, 0, /* 0x60 */
+ 0xE5F0, 0, 0, 0, 0xCAF4, 0, 0xE5F8, 0xCDCD, /* 0x60 */
+ 0, 0xC9BD, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD2D9, 0xE1A8, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE1AC, 0, 0, 0, 0xE1A7, 0xE1A9, 0, 0, /* 0x80 */
+ 0xE1AA, 0xE1AF, 0, 0, 0xB2ED, 0, 0, 0, /* 0x90 */
+ 0, 0xE1AE, 0, 0, 0xE1B1, 0, 0, 0, /* 0x90 */
+ 0, 0xB8D4, 0xE1B3, 0xE1B8, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xD1D2, 0, 0xE1B6, 0xE1B5, 0, 0, 0, /* 0xA0 */
+ 0, 0xE1B7, 0, 0xD4C0, 0, 0xE1B2, 0, 0xE1BA, /* 0xB0 */
+ 0xB0B6, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE1B9, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE1BE, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE1BC, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xD6C5, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xB6EB, 0, 0xD3F8, 0, 0, 0xC7CD, 0, 0, /* 0xE0 */
+ 0xB7E5, 0, 0, 0, 0xE1AD, 0, 0xB5BA, 0, /* 0xF0 */
+ 0, 0, 0, 0xBEFE, 0, 0xCFBF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1C7, 0xB3E7, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE1C1, 0xC6E9, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xB4DE, 0, 0xD1C2, 0xB8DA, /* 0x10 */
+ 0, 0, 0, 0xE1C8, 0, 0, 0xE1C6, 0, /* 0x10 */
+ 0, 0, 0xE1BF, 0, 0xE1C5, 0, 0xE1C3, 0xE1C2, /* 0x20 */
+ 0, 0xB1C0, 0, 0, 0xE1B4, 0, 0xE1C4, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE1CB, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xE1CC, 0xE1CA, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEFFA, /* 0x40 */
+ 0, 0, 0xE1D3, 0xE1D2, 0xC7B6, 0, 0, 0, /* 0x40 */
+ 0xE1B0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xE1CE, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xE1D4, 0, 0xE1D1, 0xE1CD, 0, 0, 0xE1CF, /* 0x60 */
+ 0, 0, 0, 0, 0xE1D5, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xE1D0, 0xE1D6, 0, 0xD5B8, 0, 0, 0xE1AB, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1C0, /* 0x90 */
+ 0, 0xE1D7, 0, 0, 0, 0xE1D8, 0, 0, /* 0x90 */
+ 0xE1BD, 0, 0, 0, 0, 0, 0, 0xE1BB, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE1DA, /* 0xB0 */
+ 0xE1C9, 0, 0xC1EB, 0, 0xD3EC, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xBFF9, 0, 0xCEA1, 0, 0, /* 0xC0 */
+ 0, 0, 0xC2CD, 0, 0xE1DB, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xE7DD, 0, 0xB4A8, 0xD6DD, 0, /* 0xD0 */
+ 0, 0xD1B2, 0xB3B2, 0, 0, 0xB9A4, 0xD7F3, 0xC7C9, /* 0xE0 */
+ 0xBEDE, 0, 0, 0xCED7, 0, 0, 0xB2EE, 0, /* 0xE0 */
+ 0xDBCF, 0xBCBA, 0xD2D1, 0xCBC8, 0xB0CD, 0, 0, 0xCFEF, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xD9E3, 0xBDED /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCAD0, 0xB2BC, 0, 0, 0xB7AB, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xCFA3, 0, 0, 0, /* 0x00 */
+ 0, 0xE0FB, 0, 0, 0xE0FA, 0xC5C1, 0xCCFB, 0, /* 0x10 */
+ 0xF8D0, 0xE0F9, 0xD6E3, 0xB2AF, 0, 0xB5DB, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xCBA7, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xCAA6, 0, 0xCFAF, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xD5CA, 0, 0, 0xB4F8, 0xE1A1, /* 0x30 */
+ 0xB3A3, 0, 0, 0, 0, 0xC3B1, 0, 0, /* 0x30 */
+ 0xD6A1, 0, 0xC3DD, 0xE0F8, 0xE1A2, 0xB7F9, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xBBCF, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xE1A3, 0xC4BB, 0, 0xE0FE, /* 0x50 */
+ 0xE0FD, 0, 0, 0xE1A4, 0, 0, 0xE1A5, 0xD6C4, /* 0x50 */
+ 0, 0xE1A6, 0xB4B1, 0xB1D2, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xB0EF, 0xE0FC, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xF8B5, 0xC6BD, 0xC4EA, 0, 0xB2A2, 0, /* 0x70 */
+ 0xD0D2, 0xB8C9, 0xE7DB, 0xBBC3, 0xD3D7, 0xD3C4, 0xBCB8, 0xF8B8, /* 0x70 */
+ 0xE2CF, 0, 0, 0, 0, 0, 0, 0xB1D3, /* 0x80 */
+ 0, 0, 0xB4B2, 0xE2D1, 0, 0, 0, 0xD0F2, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xB5D7, 0xE2D2, 0xB5EA, /* 0x90 */
+ 0, 0, 0xB8FD, 0, 0xB8AE, 0, 0, 0, /* 0x90 */
+ 0xE2D4, 0, 0, 0, 0, 0xE2D3, 0xB6C8, 0xD7F9, /* 0xA0 */
+ 0, 0, 0, 0xBFE2, 0, 0xCDA5, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xE2D8, 0, 0xE2D6, 0xCAFC, 0xBFB5, /* 0xB0 */
+ 0xD3B9, 0xE2D5, 0, 0, 0, 0, 0xE2D7, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xC1AE, 0xC0C8, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE2DB, 0xE2DA, 0xC0AA, 0, 0, 0xC1CE, 0, /* 0xD0 */
+ 0, 0, 0, 0xE2DC, 0, 0, 0, 0xC3ED, /* 0xD0 */
+ 0xB3A7, 0xE2D0, 0xB7CF, 0xB9E3, 0, 0, 0, 0, /* 0xE0 */
+ 0xE2DD, 0, 0xE2DE, 0, 0xC2AE, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xCCFC, 0xDBC8, 0, 0xD1D3, 0xCDA2, /* 0xF0 */
+ 0, 0, 0xBDA8, 0, 0, 0, 0xDEC3, 0xD8A5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDBCD, 0xD2EC, 0, 0xC5AA, 0, 0, 0, /* 0x00 */
+ 0xDEC4, 0, 0xB1D7, 0xDFAE, 0, 0, 0, 0xCABD, /* 0x00 */
+ 0, 0xDFB1, 0, 0xB9AD, 0, 0xD2FD, 0, 0xB8A5, /* 0x10 */
+ 0xBAEB, 0, 0, 0xB3DA, 0, 0, 0, 0xB5DC, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xCFD2, 0xBBA1, /* 0x20 */
+ 0, 0xE5F3, 0, 0, 0, 0xE5F4, 0, 0, /* 0x20 */
+ 0, 0xC8F5, 0, 0xE5F2, 0, 0xD5C5, 0, 0, /* 0x30 */
+ 0, 0, 0xC7BF, 0, 0xE5F6, 0, 0, 0, /* 0x30 */
+ 0xECB0, 0, 0, 0, 0, 0, 0xF8A4, 0, /* 0x40 */
+ 0xB5AF, 0, 0, 0, 0xC3D6, 0, 0xCDE4, 0, /* 0x40 */
+ 0xE5E6, 0, 0, 0, 0, 0, 0xE5E8, 0xE5E7, /* 0x50 */
+ 0xE5E9, 0xF8BD, 0, 0, 0, 0xD2CD, 0, 0, /* 0x50 */
+ 0, 0xE1EA, 0xD0CE, 0, 0xCDAE, 0, 0xD1E5, 0, /* 0x60 */
+ 0, 0xB2CA, 0xB1EB, 0, 0xB1F2, 0xC5ED, 0, 0, /* 0x60 */
+ 0xD5C3, 0xD3B0, 0, 0xE1DC, 0, 0, 0, 0xE1DD, /* 0x70 */
+ 0, 0xD2DB, 0, 0, 0xB1CB, 0, 0, 0, /* 0x70 */
+ 0xCDF9, 0xD5F7, 0xE1DE, 0, 0, 0xB4FD, 0, 0xE1DF, /* 0x80 */
+ 0xBADC, 0xE1E0, 0xBBB2, 0xC2C9, 0xBAF3, 0, 0, 0, /* 0x80 */
+ 0xD0EC, 0xBEB6, 0xCDBD, 0, 0, 0, 0, 0xB5C3, /* 0x90 */
+ 0xC5C7, 0xE1E3, 0, 0, 0xE1E4, 0, 0xB4D3, 0, /* 0x90 */
+ 0xE1E2, 0xD3F9, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xE1E5, 0xB8B4, 0xD1AD, 0, 0, 0xE1E6, 0xCEA2, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xE1E7, 0, 0xB5C2, /* 0xB0 */
+ 0, 0xB3B9, 0, 0, 0xE1E8, 0xBBD5, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xD0C4, 0xE2E0, 0xB1D8, 0, 0, /* 0xC0 */
+ 0, 0xE2E1, 0, 0, 0xBCC9, 0xC8CC, 0, 0, /* 0xC0 */
+ 0xECFE, 0xECFD, 0xDFAF, 0, 0, 0, 0xE2E2, 0xD6BE, /* 0xD0 */
+ 0xCDFC, 0xC3A6, 0, 0, 0, 0xE3C3, 0, 0, /* 0xD0 */
+ 0xD6D2, 0xE2E7, 0, 0, 0xE2E8, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xE2EC, 0xBFEC, 0, 0xE2ED, 0xE2E5, 0, /* 0xE0 */
+ 0, 0xB3C0, 0, 0, 0, 0xC4EE, 0, 0, /* 0xF0 */
+ 0xE2EE, 0, 0, 0xD0C3, 0, 0xBAF6, 0, 0xB7DE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xE2F7, 0, 0, 0xE2F4, 0xD4F5, 0xE2F3, /* 0x00 */
+ 0, 0, 0xC5AD, 0, 0xD5FA, 0xC5C2, 0xB2C0, 0, /* 0x10 */
+ 0, 0xE2EF, 0, 0xE2F2, 0, 0xCBBC, 0, 0, /* 0x10 */
+ 0xB5A1, 0xE2F9, 0, 0, 0, 0xBCB1, 0xE2F1, 0xD0D4, /* 0x20 */
+ 0xD4B9, 0xE2F5, 0xB9D6, 0xE2F6, 0, 0, 0, 0xC7D3, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE2F0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xEDA5, 0xE2FE, 0xCAD1, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xBBD0, 0, 0, /* 0x40 */
+ 0xBFD6, 0, 0xBAE3, 0, 0, 0xCBA1, 0, 0, /* 0x50 */
+ 0, 0xEDA6, 0xEDA3, 0, 0, 0xEDA2, 0, 0, /* 0x50 */
+ 0, 0, 0xBBD6, 0xEDA7, 0xD0F4, 0, 0, 0xEDA4, /* 0x60 */
+ 0xBADE, 0xB6F7, 0xE3A1, 0xB6B2, 0xCCF1, 0xB9A7, 0, 0xCFA2, /* 0x60 */
+ 0xC7A1, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD3C1, /* 0x70 */
+ 0, 0, 0, 0xE3A7, 0xC7C4, 0, 0, 0, /* 0x80 */
+ 0, 0xCFA4, 0, 0, 0xE3A9, 0xBAB7, 0, 0, /* 0x80 */
+ 0, 0, 0xE3A8, 0, 0xBBDA, 0, 0xE3A3, 0, /* 0x90 */
+ 0, 0, 0xE3A4, 0xE3AA, 0, 0xE3A6, 0, 0xCEF2, /* 0x90 */
+ 0xD3C6, 0, 0, 0xBBBC, 0, 0, 0xD4C3, 0, /* 0xA0 */
+ 0xC4FA, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE3AD, 0xB1AF, 0, 0xE3B2, 0xE2EA, 0xC3C6, 0, /* 0xB0 */
+ 0xBCC2, 0, 0, 0xE3AC, 0xB5BF, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xC7E9, 0xE3B0, 0, /* 0xC0 */
+ 0, 0, 0, 0xCDEF, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xBBF3, 0, 0, 0, 0xCCE8, 0, 0, /* 0xD0 */
+ 0xE3AF, 0, 0xE3B1, 0, 0xCFA7, 0xE3AE, 0, 0xCEA9, /* 0xD0 */
+ 0xBBDD, 0xB6F1, 0, 0, 0, 0, 0xB5EB, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xB6E8, 0xC4D5, 0xE3A2, 0xCFEB, 0xE3B7, 0, 0xBBCC, 0, /* 0xF0 */
+ 0, 0xC8C7, 0xD0CA, 0xE2FC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE3B8, 0xB3EE, 0, 0, 0, 0, 0xEDA9, 0, /* 0x00 */
+ 0xD3FA, 0xD3E4, 0, 0, 0, 0xEDAA, 0xE3B9, 0xD2E2, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE3B5, 0, 0, /* 0x10 */
+ 0, 0, 0xD3DE, 0xB0AE, 0xE3AB, 0, 0, 0xB8D0, /* 0x10 */
+ 0xE3B3, 0, 0, 0xE3B6, 0, 0, 0, 0xC0A2, /* 0x20 */
+ 0, 0, 0, 0xE3BA, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE2EB, 0, 0, 0xE2FD, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xE2E9, 0xF8FC, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xB4C8, 0, 0xE3BB, 0xCCAC, 0xBBC5, 0, 0xC9F7, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xC4BD, 0, 0, /* 0x50 */
+ 0xB2D2, 0, 0xB2D1, 0, 0, 0xEDAB, 0, 0xE2FA, /* 0x50 */
+ 0, 0, 0xC2FD, 0xB9DF, 0xEDA8, 0, 0, 0xBBDB, /* 0x60 */
+ 0xBFAE, 0, 0xE2E6, 0xCBCB, 0, 0, 0xC2C7, 0, /* 0x60 */
+ 0xCEBF, 0, 0, 0xE3A5, 0, 0xE3BC, 0xC7EC, 0xBFB6, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xD3C7, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xB1B9, 0xB1EF, 0, 0, 0xD4F7, 0, /* 0x80 */
+ 0xC1AF, 0xC6BE, 0xE3B4, 0, 0xE3BE, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xB5AC, 0, 0, 0xEDAD, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xB7DF, 0, 0, 0xE3BF, /* 0xA0 */
+ 0xBAA9, 0xEDAC, 0, 0xC3F5, 0xE3BD, 0, 0xE2E4, 0, /* 0xA0 */
+ 0, 0, 0xCFDC, 0, 0, 0, 0xD2E4, 0xE3C0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xBAB6, 0, /* 0xB0 */
+ 0, 0, 0xB6AE, 0, 0, 0, 0, 0xBFD2, /* 0xC0 */
+ 0xD0B8, 0xD3A6, 0xB0C3, 0xEDAE, 0xE2F8, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xE3C1, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xF8D6, 0xEDA1, /* 0xD0 */
+ 0, 0, 0, 0xEDAF, 0, 0, 0xC5B3, 0, /* 0xE0 */
+ 0xE2FB, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xB3CD, 0, 0, 0xE3C2, 0xC0C1, 0xBBB3, /* 0xF0 */
+ 0xD0FC, 0, 0xE2E3, 0, 0xBEE5, 0, 0xC9E5, 0xDCB2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC1B5, 0, 0, 0, 0, 0, 0, 0xEDB0, /* 0x00 */
+ 0xB8EA, 0, 0xCEEC, 0, 0xD0E7, 0xCAF9, 0xC8D6, 0, /* 0x00 */
+ 0xB3C9, 0xCED2, 0xBDE4, 0, 0xEAA7, 0xE3DE, 0xBBF2, 0, /* 0x10 */
+ 0, 0, 0xC6DD, 0xEAA9, 0, 0, 0, 0xEAAA, /* 0x10 */
+ 0, 0xEAAC, 0xEAAB, 0, 0xEAAE, 0xEAAD, 0, 0xEAA8, /* 0x20 */
+ 0, 0xEAAF, 0xBDD8, 0, 0, 0, 0xC2BE, 0, /* 0x20 */
+ 0xD5BD, 0, 0xCFB7, 0xB4C1, 0xB4F7, 0, 0, 0xBBA7, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xECE6, 0xECE5, 0xB7BF, /* 0x30 */
+ 0xCBF9, 0xB1E2, 0, 0xECE7, 0, 0, 0, 0xC9C8, /* 0x40 */
+ 0xECE8, 0xECE9, 0, 0xCAD6, 0xDED0, 0xB2C5, 0xD4FA, 0, /* 0x40 */
+ 0, 0xF8DE, 0xB0C7, 0xB4F2, 0xC8D3, 0, 0, 0, /* 0x50 */
+ 0xCDD0, 0, 0, 0xBFB8, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xBFDB, 0, 0, 0xC7A4, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xC5A4, 0xB0E7, 0xB3B6, /* 0x60 */
+ 0, 0, 0, 0xB0E2, 0, 0, 0xB7F6, 0, /* 0x70 */
+ 0, 0xC5FA, 0, 0, 0xB6F3, 0, 0xD5D2, 0xB3D0, /* 0x70 */
+ 0xBCBC, 0, 0, 0, 0xB3AD, 0, 0, 0, /* 0x80 */
+ 0, 0xBEF1, 0xB0D1, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xD2D6, 0xCAE3, 0xD7A5, 0, 0xCDB6, 0xB6B6, 0xBFB9, /* 0x90 */
+ 0xD5DB, 0, 0, 0xC5D7, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xC5EA, 0, 0, 0xC5FB, 0xCCA7, 0, 0, 0, /* 0xA0 */
+ 0, 0xB1A7, 0, 0, 0, 0xB5D6, 0, 0, /* 0xB0 */
+ 0, 0xC4A8, 0, 0xDED3, 0xD1BA, 0xB3E9, 0, 0xC3F2, /* 0xB0 */
+ 0, 0, 0xB7F7, 0, 0xD6F4, 0, 0xB2F0, 0xC4B4, /* 0xC0 */
+ 0xC4E9, 0xC0AD, 0xDED4, 0, 0xB0E8, 0xC5C4, 0xC1E0, 0, /* 0xC0 */
+ 0xB9D5, 0, 0xBEDC, 0xCDD8, 0xB0CE, 0, 0xCDCF, 0xDED6, /* 0xD0 */
+ 0xBED0, 0xD7BE, 0xDED5, 0xD5D0, 0xB0DD, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xC0A8, 0xCAC3, 0xDED7, 0xD5FC, /* 0xE0 */
+ 0, 0xB9B0, 0, 0xC8AD, 0xCBA9, 0, 0xDED9, 0xBFBD, /* 0xF0 */
+ 0, 0, 0, 0, 0xC6B4, 0xD7A7, 0xCAB0, 0xC4C3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB3D6, 0xB9D2, 0, 0, 0, 0, 0xD6B8, /* 0x00 */
+ 0xEAFC, 0xB0B4, 0, 0, 0, 0, 0xBFE6, 0, /* 0x00 */
+ 0, 0xCCF4, 0, 0, 0, 0, 0xCDDA, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xB0A4, 0, 0xC5B2, 0xB4EC, 0, 0, 0, 0xD5F1, /* 0x20 */
+ 0, 0, 0xEAFD, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xDEDA, 0xCDA6, 0, 0, 0xCDEC, 0xD0AE, 0, /* 0x30 */
+ 0, 0, 0xCEE6, 0xDEDC, 0, 0xCDB1, 0xC0A6, 0, /* 0x40 */
+ 0, 0xD7BD, 0, 0xDEDB, 0xB0C6, 0xBAB4, 0xC9D3, 0xC4F3, /* 0x40 */
+ 0xBEE8, 0, 0, 0, 0, 0xB2B6, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC5F5, /* 0x60 */
+ 0xC9E1, 0xDEE6, 0, 0xDED1, 0, 0xDEE3, 0xF8C6, 0, /* 0x60 */
+ 0, 0xDEDF, 0xF8C7, 0, 0, 0, 0xB4B7, 0xBDDD, /* 0x70 */
+ 0, 0, 0xDEE0, 0xC4ED, 0, 0, 0, 0, /* 0x70 */
+ 0xCFC6, 0, 0xB5E0, 0xC9A8, 0xC2D5, 0, 0, 0xB6DE, /* 0x80 */
+ 0xCADA, 0xB5F4, 0xDEE5, 0, 0xD5C6, 0, 0xDEE1, 0xCCCD, /* 0x80 */
+ 0xC6FE, 0, 0xC5C5, 0, 0, 0, 0xD2B4, 0, /* 0x90 */
+ 0xBEF2, 0xD5F5, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xC2D3, 0, 0xCCBD, 0xB3B8, 0, 0xBDD3, 0, 0xBFD8, /* 0xA0 */
+ 0xCDC6, 0xD1DA, 0xB4EB, 0, 0xDEE4, 0xDEDD, 0xDEE7, 0, /* 0xA0 */
+ 0xEAFE, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xDEF2, 0, /* 0xB0 */
+ 0xBCF0, 0, 0, 0, 0xDEED, 0, 0xDEF1, 0, /* 0xC0 */
+ 0, 0xC8E0, 0, 0, 0, 0xD7E1, 0xDEEF, 0xC3E8, /* 0xC0 */
+ 0xCCE1, 0, 0xB2E5, 0, 0, 0, 0xD2BE, 0, /* 0xD0 */
+ 0, 0, 0xD1EF, 0xBBBB, 0, 0, 0xDEEE, 0, /* 0xD0 */
+ 0xDEEB, 0xCED5, 0, 0xB4A7, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0xBFAB, 0xBEBE, 0, 0, 0xBDD2, 0xBBD3, 0, /* 0xE0 */
+ 0, 0, 0xDEE9, 0, 0xD4AE, 0, 0xDEDE, 0, /* 0xF0 */
+ 0xDEEA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xDEF5, 0xDEF8, 0xCBF0, 0, 0xB2AB, /* 0x00 */
+ 0xB4A4, 0, 0, 0xB4EA, 0xC9A6, 0, 0, 0xB5B7, /* 0x10 */
+ 0, 0, 0, 0xDEF6, 0xCBD1, 0, 0xB8E3, 0, /* 0x10 */
+ 0xDEF7, 0xDEFA, 0, 0, 0, 0, 0xDEF9, 0, /* 0x20 */
+ 0, 0, 0xCCC2, 0, 0xB0E1, 0xB4EE, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xE5BA, 0, 0xC7C0, 0, /* 0x30 */
+ 0, 0, 0xD0AF, 0, 0, 0xB2EB, 0, 0xEBA1, /* 0x30 */
+ 0, 0xDEF4, 0, 0, 0, 0, 0, 0xD2A1, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xDEE2, 0xDEF0, 0, 0xCBA4, 0, 0, 0, /* 0x50 */
+ 0xD5AA, 0, 0, 0, 0xDEE8, 0, 0xDEFB, 0xC2A7, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB4DD, /* 0x60 */
+ 0, 0xC4A6, 0, 0, 0, 0xDEFD, 0, 0xD6BF, /* 0x60 */
+ 0, 0, 0, 0xBFD9, 0, 0, 0xDED2, 0, /* 0x70 */
+ 0xC3FE, 0xC4A1, 0xDFA1, 0xB2F4, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xC1CC, 0, 0, 0xBEEF, 0, 0xC6B2, /* 0x80 */
+ 0xC0CC, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xB3C5, 0xC8F6, 0xC4D3, 0, 0xCBBA, 0xDEFE, 0, /* 0x90 */
+ 0, 0xDFA4, 0, 0, 0, 0, 0xD7B2, 0xDED8, /* 0x90 */
+ 0, 0, 0, 0xB5A7, 0xB3B7, 0xB2A6, 0, 0, /* 0xA0 */
+ 0, 0xC1C3, 0, 0xB8A7, 0xC7CB, 0xB2A5, 0xB4E9, 0, /* 0xA0 */
+ 0xD7AB, 0, 0xC6CB, 0xDEEC, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xCCA2, 0xBAB3, 0, 0xCECE, 0xBCF1, /* 0xB0 */
+ 0xDFA6, 0xD3B5, 0xC0DE, 0, 0xC2B0, 0xC9C3, 0, 0xD4F1, /* 0xC0 */
+ 0, 0, 0xBBF7, 0xB5B2, 0, 0xB2D9, 0xC7E6, 0, /* 0xC0 */
+ 0xDFA7, 0, 0xC7DC, 0, 0xB5A3, 0, 0, 0xDFA8, /* 0xD0 */
+ 0xEBA2, 0, 0xBEDD, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xBCB7, 0, 0xDFAA, 0, 0xDFA9, 0, 0xB2C1, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xC4E2, 0, 0, 0xB1F7, /* 0xE0 */
+ 0xC5A1, 0xB8E9, 0xD6C0, 0, 0xC0A9, 0, 0, 0xDFA2, /* 0xF0 */
+ 0, 0, 0xB0DA, 0xCBD3, 0xDFA3, 0, 0xC8C5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC5CA, 0, 0, 0, 0xDEF3, 0, 0xC4EC, 0, /* 0x00 */
+ 0, 0xDFAB, 0, 0, 0, 0, 0, 0xC2A3, /* 0x00 */
+ 0, 0, 0, 0, 0xC0B9, 0, 0xDEFC, 0, /* 0x10 */
+ 0xC8C1, 0xB2F3, 0, 0xDFA5, 0, 0xC9E3, 0, 0, /* 0x10 */
+ 0, 0, 0xD4DC, 0xC2CE, 0xCCAF, 0xDFAC, 0, 0, /* 0x20 */
+ 0, 0, 0xBDC1, 0xBEF0, 0xC0BF, 0, 0xDFAD, 0xD6A7, /* 0x20 */
+ 0, 0, 0, 0, 0xEAB7, 0xEBB6, 0xCAD5, 0, /* 0x30 */
+ 0xD8FC, 0xB8C4, 0, 0xB9A5, 0, 0, 0xB7C5, 0xD5FE, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xB9CA, 0, 0, /* 0x40 */
+ 0xD0A7, 0xF4CD, 0, 0, 0, 0, 0, 0xC3F4, /* 0x40 */
+ 0, 0xBEC8, 0, 0, 0, 0xEBB7, 0xB0BD, 0xB0DC, /* 0x50 */
+ 0, 0xBDCC, 0, 0, 0, 0xB1D6, 0xB3A8, 0, /* 0x50 */
+ 0, 0, 0xB8D2, 0xC9A2, 0, 0, 0xB6D8, 0, /* 0x60 */
+ 0, 0, 0, 0xEBB8, 0xBEB4, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xC7C3, 0, 0xD5FB, 0xB5D0, 0, 0xB7F3, /* 0x70 */
+ 0xCAFD, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xC1B2, 0xB1D0, 0, 0, 0, 0xCEC4, /* 0x80 */
+ 0, 0, 0, 0, 0xB1F3, 0, 0, 0, /* 0x80 */
+ 0xECB3, 0xB0DF, 0, 0, 0, 0xECB5, 0, 0xF8AF, /* 0x90 */
+ 0, 0xC1CF, 0, 0xF5FA, 0xD0B1, 0, 0, 0xD5E5, /* 0x90 */
+ 0, 0xCED3, 0, 0, 0xBDEF, 0xB3E2, 0, 0xB8AB, /* 0xA0 */
+ 0, 0, 0, 0xEDBD, 0xD5B6, 0, 0, 0xCBB9, /* 0xA0 */
+ 0xD0C2, 0, 0, 0, 0, 0, 0, 0xB6CF, /* 0xB0 */
+ 0, 0xB7BD, 0, 0, 0xECB6, 0xCAA9, 0, 0, /* 0xB0 */
+ 0, 0xC5D4, 0, 0xECB9, 0xECB8, 0xC2C3, 0xECB7, 0, /* 0xC0 */
+ 0, 0, 0, 0xD0FD, 0xECBA, 0, 0xECBB, 0xD7E5, /* 0xC0 */
+ 0, 0, 0xECBC, 0, 0, 0, 0xECBD, 0xC6EC, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xBCC8, 0, 0, 0xC8D5, 0xB5A9, 0, /* 0xE0 */
+ 0xD6BC, 0xD4E7, 0, 0, 0xD1AE, 0xD0F1, 0xEAB8, 0xEAB9, /* 0xE0 */
+ 0xEABA, 0xBAB5, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xCDFA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEAC0, 0, 0xB0BA, 0xEABE, 0, 0, 0xC0A5, 0, /* 0x00 */
+ 0, 0, 0xEABB, 0, 0xB2FD, 0, 0xC3F7, 0xBBE8, /* 0x00 */
+ 0, 0, 0, 0xD2D7, 0xCEF4, 0xEABF, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xEAC3, 0, 0xD0C7, /* 0x10 */
+ 0xD3B3, 0, 0, 0, 0, 0xB4BA, 0, 0xC3C1, /* 0x20 */
+ 0xD7F2, 0, 0, 0, 0, 0xD5D1, 0, 0xCAC7, /* 0x20 */
+ 0, 0xEAC5, 0, 0, 0xEAC4, 0xEAC7, 0xEAC6, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xEACB, 0xCAB1, 0xBBCE, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xBDFA, 0, 0, 0xC9CE, 0, 0, 0xEACC, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEACF, /* 0x50 */
+ 0, 0, 0xCDED, 0, 0, 0xD6E7, 0, 0xEAC9, /* 0x50 */
+ 0, 0xEACE, 0, 0, 0xCEEE, 0, 0xBBDE, 0, /* 0x60 */
+ 0xB3BF, 0, 0, 0, 0, 0, 0xC6D5, 0xBEB0, /* 0x60 */
+ 0xCEFA, 0, 0, 0, 0xC7E7, 0, 0xBEA7, 0xEAD0, /* 0x70 */
+ 0, 0, 0xD6C7, 0, 0, 0, 0xC1C0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xEAD1, 0, 0, 0xCFBE, /* 0x80 */
+ 0xD4CE, 0xEACD, 0, 0, 0xEAD2, 0, 0, 0, /* 0x80 */
+ 0, 0xCAEE, 0, 0, 0, 0, 0xC5AF, 0xB0B5, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xEAD4, 0, 0, /* 0x90 */
+ 0, 0, 0xB3A9, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF4DF, 0, 0, 0xD4DD, 0, 0, 0xC4BA, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xB1A9, 0, 0, 0, /* 0xB0 */
+ 0, 0xE5DF, 0, 0, 0, 0, 0xEAD5, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xEACA, 0, 0xF8CF, 0xEABC, /* 0xC0 */
+ 0, 0xCFFE, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xEAD3, 0, /* 0xD0 */
+ 0, 0xCAEF, 0, 0xEAD6, 0xEAD7, 0xC6D8, 0, 0, /* 0xD0 */
+ 0xBFF5, 0, 0, 0, 0, 0, 0xEAD8, 0, /* 0xE0 */
+ 0, 0xEAD9, 0, 0, 0xC9B9, 0, 0, 0, /* 0xE0 */
+ 0xD4BB, 0, 0xC7FA, 0xD2B7, 0xB8FC, 0, 0, 0xEAC2, /* 0xF0 */
+ 0xCAE9, 0xB2DC, 0, 0, 0xC2FC, 0, 0xD4F8, 0xCCE6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7EE, 0, 0, 0xBBE1, 0, 0, 0, 0, /* 0x00 */
+ 0xD4C2, 0xD3D0, 0xEBC3, 0xC5F3, 0, 0xB7FE, 0, 0, /* 0x00 */
+ 0xEBD4, 0, 0, 0, 0xCBB7, 0xEBDE, 0, 0xC0CA, /* 0x10 */
+ 0, 0, 0, 0xCDFB, 0, 0xB3AF, 0, 0xC6DA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xEBFC, 0xEBCA, /* 0x20 */
+ 0xC4BE, 0, 0xCEB4, 0xC4A9, 0xB1BE, 0xD4FD, 0, 0xF8E8, /* 0x20 */
+ 0, 0xD6EC, 0, 0, 0xF8E0, 0xB6E4, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xD0E0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xB8CB, 0, /* 0x40 */
+ 0xE8BE, 0xC9BC, 0, 0, 0xE8BB, 0, 0xC0EE, 0xD0D3, /* 0x40 */
+ 0xB2C4, 0xB4E5, 0, 0xE8BC, 0, 0, 0xD5C8, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xB6C5, 0, 0xE8BD, 0xCAF8, /* 0x50 */
+ 0xB8DC, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xE8C2, 0, 0, 0xBABC, 0, 0xB1AD, /* 0x60 */
+ 0xBDDC, 0xB6AB, 0xEABD, 0xE8C3, 0, 0xE8C6, 0, 0xE8CB, /* 0x70 */
+ 0, 0, 0, 0, 0xE8CC, 0, 0xF8E9, 0xB0E5, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8C1, /* 0x80 */
+ 0, 0xCDF7, 0, 0xE8CA, 0, 0, 0, 0, /* 0x80 */
+ 0xCEF6, 0, 0, 0, 0, 0xD5ED, 0, 0xC1D6, /* 0x90 */
+ 0xE8C4, 0, 0xC3B6, 0, 0xB9FB, 0xD6A6, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xBFDD, /* 0xA0 */
+ 0xE8D2, 0, 0, 0xE8D7, 0, 0xE8D5, 0xBCDC, 0xBCCF, /* 0xB0 */
+ 0xE8DB, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xE8DE, 0, 0xE8DA, 0xB1FA, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB0D8, /* 0xC0 */
+ 0xC4B3, 0xB8CC, 0xC6E2, 0xC8BE, 0xC8E1, 0, 0, 0, /* 0xD0 */
+ 0xE8CF, 0xE8D4, 0xE8D6, 0, 0, 0xE8D8, 0xD7F5, 0, /* 0xD0 */
+ 0, 0, 0xE8DC, 0, 0, 0xB2E9, 0, 0, /* 0xE0 */
+ 0, 0xE8D1, 0, 0, 0xBCED, 0, 0, 0xBFC2, /* 0xE0 */
+ 0xE8CD, 0xD6F9, 0, 0xC1F8, 0xB2F1, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCAC1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE8D9, 0, 0, 0, 0, 0xD5A4, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xCBA8, 0, 0, 0, 0xC0F5, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xE8E9, 0, 0, /* 0x10 */
+ 0, 0xD0A3, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xE8F2, 0xD6EA, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE8E0, 0xE8E1, 0, 0, 0, 0, /* 0x30 */
+ 0xBACB, 0xB8F9, 0, 0, 0xB8F1, 0xD4D4, 0, 0, /* 0x30 */
+ 0xE8EE, 0xE8EC, 0xB9F0, 0xCCD2, 0xE8E6, 0xCEA6, 0xBFF2, 0, /* 0x40 */
+ 0xB0B8, 0xE8F1, 0xE8F0, 0, 0xD7C0, 0, 0xE8E4, 0, /* 0x40 */
+ 0xCDA9, 0xC9A3, 0, 0xBBB8, 0xBDDB, 0xE8EA, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE8F8, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xE8F5, 0, 0xCDB0, 0xE8F6, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xC1BA, 0, 0xE8E8, 0, 0xC3B7, 0xB0F0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8F4, /* 0x80 */
+ 0, 0, 0, 0xE8F7, 0, 0, 0, 0xB9A3, /* 0x90 */
+ 0xE8C5, 0, 0, 0, 0, 0xCCF5, 0, 0xE8C9, /* 0x90 */
+ 0, 0, 0xC9D2, 0, 0, 0, 0, 0xCEE0, /* 0xA0 */
+ 0xC0E6, 0, 0, 0, 0, 0xCBF3, 0, 0xCCDD, /* 0xA0 */
+ 0xD0B5, 0, 0, 0xCAE1, 0, 0xE8F3, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xC6FA, 0, 0, 0, /* 0xC0 */
+ 0, 0xC3DE, 0, 0xC6E5, 0, 0xB9F7, 0, 0, /* 0xC0 */
+ 0, 0, 0xB0F4, 0, 0, 0xD7D8, 0xE8C7, 0xD4E6, /* 0xD0 */
+ 0xBCAC, 0, 0xC5EF, 0, 0, 0, 0, 0xB6B0, /* 0xD0 */
+ 0xCCC4, 0, 0, 0xE9A6, 0, 0, 0, 0xD5BB, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xC9AD, 0, /* 0xE0 */
+ 0xE9A2, 0xC0E2, 0xC6DC, 0, 0, 0xBFC3, 0, 0, /* 0xF0 */
+ 0, 0xE8FE, 0xB9D7, 0, 0xE8FB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE9A4, 0, 0, 0, 0xD2CE, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xE9A3, 0, 0xD6B2, 0xD7B5, 0xE8E2, /* 0x00 */
+ 0xE9A7, 0, 0xBDB7, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xD2AC, 0, 0, 0, 0xE9B2, 0, 0, 0, /* 0x30 */
+ 0, 0xE9A9, 0, 0, 0, 0xB4AA, 0, 0xB4BB, /* 0x30 */
+ 0, 0, 0xE9AB, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xD1EE, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xB7E3, 0xD0A8, 0, 0, 0xE9A5, /* 0x50 */
+ 0, 0, 0xB3FE, 0, 0, 0xE9AC, 0xC0E3, 0, /* 0x50 */
+ 0xE9AA, 0, 0, 0xE9B9, 0, 0, 0xE9B8, 0, /* 0x60 */
+ 0xE8E5, 0, 0, 0xE9AE, 0, 0xD2B5, 0xE8FA, 0, /* 0x60 */
+ 0, 0xE9A8, 0, 0, 0, 0xBCAB, 0, 0xBFAC, /* 0x70 */
+ 0xE9B1, 0xE9BA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE9AF, 0, 0xB8C5, 0, 0, 0, 0xD3DC, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xE9C7, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xC0C6, 0xE9C5, 0, 0, /* 0x90 */
+ 0xE9B0, 0, 0, 0xE9BB, 0xB0F1, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE9BC, /* 0xA0 */
+ 0xD5A5, 0, 0xE8BF, 0xE9BE, 0, 0xE9BF, 0xC8D9, 0, /* 0xA0 */
+ 0, 0xE9C1, 0, 0, 0xC1F1, 0, 0, 0xC8B6, /* 0xB0 */
+ 0, 0, 0, 0xE9BD, 0, 0, 0, 0xE8E7, /* 0xB0 */
+ 0, 0xE9C2, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xE9C3, 0xB9B9, 0xE9B3, 0xC7B9, 0xE9B6, 0, /* 0xC0 */
+ 0xBBB1, 0, 0, 0, 0xE9C0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE8FD, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xE9CA, 0, 0, /* 0xE0 */
+ 0, 0, 0xE9CE, 0xBDB0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xB2DB, 0, 0xE9C8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7AE, 0xC0D6, 0, 0, 0xE8C8, 0, 0, /* 0x00 */
+ 0, 0, 0xB7AE, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xC2A5, 0, 0, 0, 0xE9CB, /* 0x10 */
+ 0xE9CC, 0xB1EA, 0, 0, 0, 0, 0xCAE0, 0xD5C1, /* 0x10 */
+ 0, 0xC4A3, 0, 0xD1F9, 0, 0, 0, 0, /* 0x20 */
+ 0xE9D8, 0, 0xBAE1, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE9D4, 0, 0, /* 0x30 */
+ 0xC6D3, 0xCAF7, 0xE8EB, 0, 0, 0xE9D7, 0xE9D0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xE9CF, 0, 0, 0xC7C1, /* 0x40 */
+ 0xE8E3, 0, 0, 0xC7C5, 0, 0, 0, 0, /* 0x40 */
+ 0xE9D2, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE9D9, 0xB3C8, 0, 0xE9D3, 0, 0, 0, 0xBBFA, /* 0x50 */
+ 0, 0xCFF0, 0xCDD6, 0, 0, 0xE9CD, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xB3F7, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xCCB4, 0, 0, 0, 0xCFAD, 0, 0, 0, /* 0x80 */
+ 0, 0xE8DF, 0, 0, 0, 0, 0xE9D5, 0, /* 0x80 */
+ 0xE9DC, 0xE9DB, 0, 0, 0xB5B5, 0, 0, 0xE9DE, /* 0x90 */
+ 0, 0, 0, 0, 0xE8ED, 0, 0, 0, /* 0x90 */
+ 0xE9D1, 0, 0xBCEC, 0xE9C9, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xE9DD, 0, 0xE9DF, 0xC3CA, 0, 0, 0xF8ED, /* 0xA0 */
+ 0, 0, 0, 0xE9C4, 0, 0, 0, 0, /* 0xB0 */
+ 0xC4FB, 0, 0, 0xBCF7, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xB9F1, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xE9D6, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE9B5, 0xE8CE, 0, 0xE8FC, 0xE9DA, 0xE8DD, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE9C6, /* 0xE0 */
+ 0xE8D3, 0, 0xE8C0, 0, 0xE9B4, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE8D0, 0, 0, 0, 0, /* 0xF0 */
+ 0xE9B7, 0, 0, 0xD3A3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC0B8, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xC8A8, 0, 0, 0, 0, 0xE9A1, /* 0x00 */
+ 0, 0, 0xE8EF, 0, 0, 0, 0xE9AD, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xE8F9, 0, /* 0x10 */
+ 0xC7B7, 0xB4CE, 0, 0xD0C0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xD3FB, 0, 0, 0, 0, 0xECA4, /* 0x30 */
+ 0, 0xECA5, 0xC6DB, 0, 0, 0xC7D5, 0xBFEE, 0, /* 0x30 */
+ 0, 0, 0, 0xECA6, 0, 0, 0xECA7, 0xD0AA, /* 0x40 */
+ 0, 0xC7B8, 0, 0, 0xB8E8, 0, 0, 0, /* 0x40 */
+ 0xC5B7, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xECA8, 0, 0, 0, 0, 0, 0xECA3, /* 0x50 */
+ 0, 0xBBB6, 0xD6B9, 0xD5FD, 0xB4CB, 0xB2BD, 0xCEE4, 0xC6E7, /* 0x60 */
+ 0, 0, 0xCDE1, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xCBEA, 0, 0, 0, 0, 0xC0FA, /* 0x70 */
+ 0xB9E9, 0xB4F5, 0, 0xCBC0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xE9E2, 0xE9E3, 0xD1EA, 0xE9E5, 0, 0xB4F9, 0, /* 0x80 */
+ 0, 0xD1B3, 0xCAE2, 0, 0, 0xE9E8, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xD6B3, 0, /* 0x90 */
+ 0xB2D0, 0, 0, 0xE9EA, 0, 0, 0xE9E6, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE9E4, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xE9EC, 0xE9E9, 0, 0, 0xE9E7, 0xE9EB, /* 0xA0 */
+ 0, 0, 0xBCDF, 0xECAF, 0, 0xB6CE, 0, 0xD2F3, /* 0xB0 */
+ 0, 0, 0xC9B1, 0xBFC7, 0, 0, 0, 0xB5EE, /* 0xB0 */
+ 0, 0xBBD9, 0, 0, 0, 0xD2E3, 0xC5B9, 0, /* 0xC0 */
+ 0, 0, 0, 0xCEE3, 0, 0xC4B8, 0, 0xC3BF, /* 0xC0 */
+ 0, 0, 0xB6BE, 0xD8B9, 0xB1C8, 0, 0xB1D1, 0xC5FE, /* 0xD0 */
+ 0, 0, 0, 0xC3AB, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xEBA4, 0xBAC1, 0, 0, 0, 0xCCBA, /* 0xE0 */
+ 0, 0, 0, 0xEBA5, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xEBA8, 0, 0, 0, 0xEBA6, 0, 0xEBA7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEBA9, 0xEBAB, 0, /* 0x00 */
+ 0xD5B1, 0, 0, 0, 0xEBAA, 0xEBAC, 0, 0xCACF, /* 0x00 */
+ 0xD8B5, 0xC3F1, 0, 0xC3A5, 0, 0xEBAD, 0xC4CA, 0, /* 0x10 */
+ 0xEBAE, 0xEBAF, 0xEBB0, 0xB7D5, 0, 0, 0, 0xB7FA, /* 0x10 */
+ 0, 0xEBB1, 0, 0xC6F8, 0xEBB3, 0, 0xBAA4, 0xD1F5, /* 0x20 */
+ 0xB0B1, 0, 0xEBB4, 0xC7E2, 0xEBB2, 0, 0xB5AA, 0xC2C8, /* 0x20 */
+ 0xC7E8, 0, 0xEBB5, 0, 0xCBAE, 0xE3DF, 0, 0, /* 0x30 */
+ 0xD3C0, 0, 0, 0, 0, 0xD9DB, 0, 0, /* 0x30 */
+ 0xCDA1, 0xD6AD, 0xC7F3, 0, 0, 0, 0xD9E0, 0, /* 0x40 */
+ 0, 0, 0xE3E2, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xCFAB, 0, 0, 0, 0xE3E0, 0xC9C7, 0, 0xBAB9, /* 0x50 */
+ 0, 0, 0, 0xD1B4, 0xE3E1, 0xC8EA, 0xB9AF, 0xBDAD, /* 0x50 */
+ 0xB3D8, 0xCEDB, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xE3E8, 0xE3E9, 0xCDF4, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xCCAD, 0, 0xBCB3, 0, 0xE3EA, 0, 0xE3EB, 0, /* 0x70 */
+ 0, 0xD0DA, 0, 0, 0, 0xC6FB, 0xB7DA, 0, /* 0x70 */
+ 0, 0xC7DF, 0xD2CA, 0xCED6, 0, 0xE3E4, 0xE3EC, 0, /* 0x80 */
+ 0xC9F2, 0xB3C1, 0, 0, 0xE3E7, 0, 0, 0xC6E3, /* 0x80 */
+ 0xE3E5, 0, 0, 0xEDB3, 0xE3E6, 0, 0, 0, /* 0x90 */
+ 0, 0xC9B3, 0, 0xC5E6, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xC3BB, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xC4AD, 0, 0xE3F0, 0xBEDA, 0, /* 0xA0 */
+ 0, 0xE3FB, 0xE3F5, 0xBAD3, 0, 0, 0, 0, /* 0xB0 */
+ 0xB7D0, 0xD3CD, 0, 0xD6CE, 0xD5D3, 0xB9C1, 0xD5B4, 0xD1D8, /* 0xB0 */
+ 0, 0, 0, 0, 0xD0B9, 0xC7F6, 0, 0, /* 0xC0 */
+ 0, 0xC8AA, 0xB2B4, 0, 0xC3DA, 0, 0, 0, /* 0xC0 */
+ 0xE3EE, 0, 0, 0xE3FC, 0xE3EF, 0xB7A8, 0xE3F7, 0xE3F4, /* 0xD0 */
+ 0, 0, 0, 0xB7BA, 0, 0, 0, 0, /* 0xD0 */
+ 0xE3F6, 0xC5DD, 0xB2A8, 0xC6FC, 0, 0xC4E0, 0, 0, /* 0xE0 */
+ 0xD7A2, 0, 0xC0E1, 0xE3F9, 0, 0, 0xE3FA, 0xE3FD, /* 0xE0 */
+ 0xCCA9, 0xE3F3, 0, 0xD3BE, 0, 0xB1C3 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4A7, 0, 0, 0xE4A6, /* 0x00 */
+ 0, 0, 0, 0xD1F3, 0xE4A3, 0, 0xE4A9, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCFB4, /* 0x10 */
+ 0, 0xE4A8, 0xE4AE, 0xC2E5, 0, 0, 0xB6B4, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xBDF2, 0, 0xE4A2, /* 0x20 */
+ 0, 0, 0xBAE9, 0xE4AA, 0, 0, 0xE4AC, 0, /* 0x20 */
+ 0, 0xB6FD, 0xD6DE, 0xE4B2, 0, 0xE4AD, 0, 0, /* 0x30 */
+ 0, 0xE4A1, 0, 0xBBEE, 0, 0xC7A2, 0xC5C9, 0, /* 0x30 */
+ 0, 0xC1F7, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD5E3, 0xBFA3, 0, 0xE4BA, 0, 0xE4B7, 0, /* 0x50 */
+ 0xE4BB, 0, 0, 0xE4BD, 0, 0, 0xC6D6, 0, /* 0x60 */
+ 0, 0xBAC6, 0xC0CB, 0, 0, 0, 0xB8A1, 0xE4B4, /* 0x60 */
+ 0, 0, 0, 0, 0xD4A1, 0, 0, 0xBAA3, /* 0x70 */
+ 0xBDFE, 0xE4A4, 0, 0, 0xE4BC, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xF8EF, 0, 0, 0xC4F9, 0, 0xE3FE, /* 0x80 */
+ 0xCFFB, 0xC9E6, 0, 0, 0xD3BF, 0, 0xCFD1, 0, /* 0x80 */
+ 0, 0xE4B3, 0, 0xE4B8, 0xE4B9, 0xCCE9, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xB8A2, 0xE4CA, 0, 0, 0xE4CC, 0xD1C4, /* 0xA0 */
+ 0, 0, 0xD2BA, 0, 0, 0xBAAD, 0, 0, /* 0xB0 */
+ 0xBAD4, 0, 0, 0, 0, 0, 0, 0xE4C3, /* 0xB0 */
+ 0xF8AD, 0, 0, 0, 0xD7CD, 0xE4C0, 0xCFFD, 0xE4BF, /* 0xC0 */
+ 0, 0, 0, 0xC1DC, 0xCCCA, 0, 0, 0, /* 0xC0 */
+ 0, 0xCAE7, 0, 0, 0, 0, 0xC4D7, 0, /* 0xD0 */
+ 0xCCD4, 0xE4C8, 0, 0, 0, 0xE4C7, 0xE4C1, 0, /* 0xD0 */
+ 0xE4C4, 0xB5AD, 0, 0, 0xD3D9, 0, 0xE4C6, 0, /* 0xE0 */
+ 0, 0, 0xC2D9, 0xD2F9, 0xB4E3, 0, 0xBBB4, 0, /* 0xE0 */
+ 0, 0xC9EE, 0, 0xB4BE, 0, 0xD4A8, 0xE4B5, 0xBBEC, /* 0xF0 */
+ 0, 0xD1CD, 0xC7B3, 0xCCED, 0xEDB5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7E5, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xE4CB, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xBBC1, 0xE4BE, 0, 0, 0xD3E5, 0, 0, /* 0x10 */
+ 0xC7FE, 0xB6C9, 0, 0xD4FC, 0xB2B3, 0xE4D7, 0xCED0, 0, /* 0x20 */
+ 0, 0xCEC2, 0, 0xE4CD, 0xB2E2, 0xCEBC, 0, 0xB8DB, /* 0x20 */
+ 0, 0, 0xE4D6, 0, 0xBFCA, 0, 0, 0, /* 0x30 */
+ 0xD3CE, 0, 0xC3EC, 0, 0, 0, 0xBBEB, 0, /* 0x30 */
+ 0, 0, 0, 0xC5C8, 0xE4D8, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xCDC4, 0xE4CF, 0, /* 0x40 */
+ 0, 0, 0, 0xE4D4, 0xE4D5, 0, 0xBAFE, 0, /* 0x50 */
+ 0xCFE6, 0, 0, 0xD5BF, 0, 0, 0xE4A5, 0xE4D2, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE4D0, 0, 0, 0xE4CE, 0xCCC0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE4D3, 0, /* 0x80 */
+ 0, 0xB8C8, 0, 0, 0, 0, 0, 0xE4E7, /* 0x80 */
+ 0xD4B4, 0, 0, 0, 0, 0, 0xD7BC, 0, /* 0x90 */
+ 0xE4DB, 0, 0, 0, 0xC1EF, 0xB9B5, 0, 0xE4E9, /* 0x90 */
+ 0, 0, 0xD2E7, 0, 0, 0xE4DF, 0, 0xE4E0, /* 0xA0 */
+ 0, 0, 0xCFAA, 0, 0, 0, 0, 0xCBDD, /* 0xA0 */
+ 0, 0xE4DA, 0xE4D1, 0, 0xE4E5, 0, 0xC8DC, 0xE4E3, /* 0xB0 */
+ 0, 0, 0xC4E7, 0xE4E2, 0, 0xE4E1, 0, 0, /* 0xB0 */
+ 0, 0xB3FC, 0xE4E8, 0, 0xB2D7, 0xC3F0, 0, 0xB5E1, /* 0xC0 */
+ 0, 0, 0, 0xD7CC, 0xB5D3, 0, 0xDCFE, 0xE4E6, /* 0xC0 */
+ 0, 0xBBAC, 0, 0xD7D2, 0xCCCF, 0xEBF8, 0, 0, /* 0xD0 */
+ 0, 0, 0xB9F6, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xBBA6, 0, 0, 0xD6CD, /* 0xE0 */
+ 0, 0, 0xC9F8, 0, 0xB5CE, 0, 0, 0xC2B1, /* 0xF0 */
+ 0xE4B0, 0xE4EF, 0, 0, 0, 0, 0, 0xC2FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD3E6, 0xC6AF, 0, 0, 0, 0xC6E1, 0, /* 0x00 */
+ 0, 0xE4F5, 0, 0, 0, 0, 0, 0xC2A9, /* 0x00 */
+ 0, 0, 0, 0, 0xD1DD, 0xE4EE, 0, 0, /* 0x10 */
+ 0, 0, 0xC5BD, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xC4AE, 0, 0xBABA, 0xC1B0, 0xE4ED, 0, 0, 0, /* 0x20 */
+ 0, 0xE4F6, 0xE4F4, 0xC2FE, 0xD7D5, 0xE4DD, 0, 0xE4F0, /* 0x20 */
+ 0, 0xCAFE, 0xD5C7, 0xD5C4, 0, 0, 0xE4F1, 0, /* 0x30 */
+ 0xBDA5, 0, 0, 0, 0, 0, 0xD1FA, 0xBDAC, /* 0x30 */
+ 0, 0xF2A3, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xC6C3, 0, 0, 0xBDE0, 0, 0, 0, /* 0x50 */
+ 0xC5CB, 0xE3ED, 0, 0xC7B1, 0, 0, 0xC2BA, 0, /* 0x50 */
+ 0, 0, 0xE4EA, 0, 0xC8F3, 0, 0xC1CA, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xCCB6, 0xB3B1, 0xE4B1, /* 0x60 */
+ 0xC0A3, 0, 0xE4FB, 0, 0xE4F3, 0, 0, 0xE4E4, /* 0x70 */
+ 0xE4FA, 0, 0xE4FD, 0, 0xE4FC, 0, 0, 0xE4B6, /* 0x70 */
+ 0xC9AC, 0, 0, 0, 0xB3CE, 0, 0xBDBD, 0xC0D4, /* 0x80 */
+ 0xB3BA, 0xE4F7, 0, 0, 0xE4F9, 0xE4F8, 0xC5EC, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0xBDA7, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xE4C5, 0xD4E8, 0, 0, 0xD4F3, 0, 0, 0xE5A2, /* 0xA0 */
+ 0, 0xEDB4, 0, 0, 0, 0, 0xE4AB, 0, /* 0xA0 */
+ 0, 0xB5ED, 0, 0xB0C4, 0, 0, 0xE5A4, 0, /* 0xB0 */
+ 0, 0xE5A3, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xBCA4, 0xD7C7, 0xE5A5, 0xC5A8, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xE5A1, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xCAAA, 0, 0, /* 0xD0 */
+ 0xC5A2, 0, 0, 0xF8D5, 0, 0, 0xE5A8, 0xBCC3, /* 0xD0 */
+ 0xE5A9, 0xE5A6, 0, 0, 0xCCCE, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xC0C4, 0, 0, 0xE5A7, 0xE5AA, /* 0xE0 */
+ 0xCEAB, 0xB1F5, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xBDA6, 0, 0xE3F8, 0, 0xC2CB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4DE, 0xE4C2, 0, /* 0x00 */
+ 0, 0xD0BA, 0, 0xE4C9, 0, 0, 0, 0xE4AF, /* 0x00 */
+ 0, 0xC6D9, 0, 0, 0, 0xB1F4, 0, 0, /* 0x10 */
+ 0xE3F2, 0, 0xE5AB, 0xE5AD, 0, 0xC1A4, 0, 0xE4EC, /* 0x10 */
+ 0xE4EB, 0, 0, 0xE5AC, 0, 0, 0, 0xE3F1, /* 0x20 */
+ 0xE4FE, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xF8D8, 0, 0xE4F2, 0, 0, 0xE5AF, 0, 0, /* 0x30 */
+ 0, 0xE5AE, 0, 0, 0, 0, 0xC0BD, 0, /* 0x30 */
+ 0, 0, 0, 0xE3E3, 0xE4DC, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xB9E0, 0, 0, 0, /* 0x40 */
+ 0, 0xC8F7, 0, 0, 0, 0xC0EC, 0, 0, /* 0x50 */
+ 0xCCB2, 0, 0, 0, 0, 0xE5B0, 0xE5B1, 0, /* 0x50 */
+ 0, 0, 0, 0xCDE5, 0xC2D0, 0, 0, 0xE4D9, /* 0x60 */
+ 0, 0, 0, 0xBBF0, 0xECE1, 0, 0, 0, /* 0x60 */
+ 0xBBD2, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xBEC4, 0, 0, 0, 0xD7C6, 0, 0xD4D6, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xEAC1, 0, 0, /* 0x80 */
+ 0, 0, 0xB4B6, 0, 0, 0, 0xD1D7, 0, /* 0x80 */
+ 0, 0, 0xB3B4, 0, 0xC8B2, 0xBFBB, 0xECC0, 0, /* 0x90 */
+ 0, 0xD6CB, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xECC5, 0xBEE6, 0xCCBF, 0xC5DA, 0xBEBC, /* 0xA0 */
+ 0, 0xECC6, 0, 0xB1FE, 0, 0, 0, 0xECC4, /* 0xB0 */
+ 0xD5A8, 0, 0, 0xECC2, 0, 0, 0, 0, /* 0xB0 */
+ 0xECC3, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xC1D2, 0, 0xECC8, 0, 0, 0, 0, 0xCEDA, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xBAE6, 0xC0D3, 0, 0, 0, 0, 0, 0xD1CC, /* 0xD0 */
+ 0, 0, 0, 0, 0xBFBE, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCFA9, /* 0xE0 */
+ 0, 0, 0, 0, 0xCCFE, 0, 0, 0xCDE9, /* 0xF0 */
+ 0, 0xC5EB, 0, 0, 0, 0xB7E9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xD1C9, 0xBAB8, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xECC9, 0, 0, 0xECCA, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xB1BA, 0xB7D9, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xCEDE, 0, 0, 0, 0, 0xBDB9, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xECCC, /* 0x20 */
+ 0xD1E6, 0xECCD, 0, 0, 0, 0, 0xC8BB, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xECD1, 0, 0, /* 0x40 */
+ 0, 0xC1B6, 0xECD3, 0, 0xBBCD, 0, 0xBCE5, 0, /* 0x40 */
+ 0, 0, 0xECBF, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xECCF, 0, 0xC9B7, 0, /* 0x50 */
+ 0, 0, 0xDCE4, 0, 0xC3BA, 0xBBC0, 0xECE3, 0xD5D5, /* 0x60 */
+ 0xECD0, 0xB7B3, 0, 0, 0xECBE, 0, 0xD6F3, 0, /* 0x60 */
+ 0, 0, 0xECD2, 0xECCE, 0, 0, 0, 0, /* 0x70 */
+ 0xECD4, 0, 0xECD5, 0, 0, 0xC9BF, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xCFA8, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD0DC, 0, 0, 0, 0, 0xD1AC, /* 0x80 */
+ 0, 0, 0xD3AB, 0, 0xC8DB, 0, 0, 0xECC1, /* 0x90 */
+ 0xECD6, 0xCEF5, 0, 0, 0, 0, 0, 0xCAEC, /* 0x90 */
+ 0xECDA, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xECD9, 0, 0, 0, 0xB0BE, 0, 0, 0, /* 0xA0 */
+ 0, 0xC8C8, 0, 0xECD7, 0, 0xECD8, 0, 0, /* 0xB0 */
+ 0, 0xECE4, 0, 0, 0, 0, 0xB3E3, 0, /* 0xB0 */
+ 0, 0xECC7, 0, 0xC8BC, 0, 0, 0, 0, /* 0xC0 */
+ 0xB5C6, 0, 0, 0, 0, 0, 0xC1C7, 0, /* 0xC0 */
+ 0, 0, 0xC9D5, 0, 0xECDC, 0xD1E0, 0, 0, /* 0xD0 */
+ 0, 0xCCCC, 0, 0, 0xECCB, 0, 0, 0xD3AA, /* 0xD0 */
+ 0xECDB, 0, 0, 0, 0, 0xD4EF, 0xB2D3, 0xECDD, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xD6F2, 0xDBC6, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xBBE2, 0, 0, 0, /* 0xF0 */
+ 0, 0xECDE, 0, 0, 0xBDFD, 0, 0xECE2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB1AC, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xCBB8, 0, 0, /* 0x00 */
+ 0xC2AF, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xC0C3, 0, 0xECDF, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xECE0, 0, 0xD7A6, 0, 0xC5C0, 0xD5F9, 0, 0, /* 0x20 */
+ 0xEBBC, 0, 0xCEAA, 0, 0, 0xBEF4, 0xB8B8, 0, /* 0x30 */
+ 0xB0D6, 0xB5F9, 0xD2AF, 0xD8B3, 0, 0xCBAC, 0xB6FB, 0xE3DD, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC6AC, /* 0x40 */
+ 0xB0E6, 0, 0, 0, 0xC5C6, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xEBBA, 0, 0, 0, 0xEBBB, 0, /* 0x50 */
+ 0xEBB9, 0xD1C0, 0, 0xC5A3, 0, 0xEAF2, 0, 0xC4B2, /* 0x50 */
+ 0, 0xC4B5, 0xC0CE, 0, 0, 0, 0xEAF3, 0xC4C1, /* 0x60 */
+ 0, 0xCEEF, 0, 0, 0, 0, 0xEAF0, 0xEAF4, /* 0x60 */
+ 0, 0, 0xC9FC, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xCCD8, 0, 0, 0, 0xC7A3, 0xEAF5, 0xEAF6, /* 0x70 */
+ 0xCFAC, 0xC0E7, 0, 0, 0xEAF7, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xEAF8, 0, 0xEAF9, 0, 0xEAFA, /* 0x80 */
+ 0, 0, 0xEAFB, 0, 0, 0, 0xDCFD, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEAF1, /* 0x90 */
+ 0, 0, 0xB6BF, 0, 0, 0, 0, 0xCEFE, /* 0xA0 */
+ 0, 0, 0, 0, 0xC8AE, 0xE1EB, 0, 0xB7B8, /* 0xA0 */
+ 0xE1EC, 0, 0, 0, 0xE1ED, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xD7B4, 0xE1F1, 0xBFF1, 0xE1F0, 0xB5D2, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xE1F3, 0xE1F2, 0, /* 0xC0 */
+ 0xBAFC, 0, 0xE1F4, 0, 0, 0, 0, 0xB9B7, /* 0xD0 */
+ 0, 0xBED1, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xBADD, 0xBDC6, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xE1F5, 0xE1F7, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE1FC, 0xE1F9, 0, 0, 0xE1FA, /* 0xF0 */
+ 0xC0EA, 0xCFC1, 0xE1FE, 0xE2A1, 0xC0C7, 0xB1B7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE1FB, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE2A5, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xE2A3, 0, 0, 0xB2FE, 0xE2A2, /* 0x10 */
+ 0, 0xD5F8, 0, 0xC3CD, 0xB2C2, 0xE2A7, 0xE2A6, 0, /* 0x10 */
+ 0, 0, 0xE2A9, 0, 0, 0xE2AB, 0, 0, /* 0x20 */
+ 0, 0xD0C9, 0xD6ED, 0xC3A8, 0xE2AC, 0, 0, 0, /* 0x20 */
+ 0, 0xE2AE, 0, 0, 0xBAEF, 0, 0xD3CC, 0xE9E0, /* 0x30 */
+ 0xE2AD, 0xE2AA, 0, 0xE1F8, 0, 0, 0xBBAB, 0xD4B3, /* 0x30 */
+ 0, 0xE1EF, 0, 0, 0xD3FC, 0xCAA8, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE2B0, 0, 0, /* 0x40 */
+ 0xE2AF, 0, 0xE9E1, 0, 0, 0, 0, 0xE2B1, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xE2B2, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xB6C0, 0, 0xE1F6, 0xE1FD, 0xE2B3, 0, 0, 0xE2B4, /* 0x60 */
+ 0xC4FC, 0, 0xBBF1, 0, 0, 0xC1D4, 0, 0xE1EE, /* 0x70 */
+ 0xCADE, 0, 0xCCA1, 0xCFD7, 0xE2A8, 0, 0xE2B5, 0, /* 0x70 */
+ 0xE2A4, 0, 0, 0, 0xD0FE, 0, 0, 0xC2CA, /* 0x80 */
+ 0, 0xD3F1, 0, 0xCDF5, 0, 0, 0xE7E0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xBEC1, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7E4, /* 0x90 */
+ 0, 0, 0xE7E3, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xCDE6, 0, 0xC3B5, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xC1E1, 0xE7E9, 0, 0, 0, 0xE7E8, /* 0xB0 */
+ 0, 0, 0, 0xB2A3, 0, 0, 0, 0, /* 0xB0 */
+ 0xE7EA, 0, 0xE7E6, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xE7EC, 0xE7EB, 0xC9BA, 0, 0, 0xD5E4, 0, 0xE7E5, /* 0xC0 */
+ 0xB7A9, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE7EE, 0, 0, 0, 0, 0xE7F3, 0, /* 0xD0 */
+ 0xD6E9, 0, 0, 0, 0, 0xE7ED, 0, 0xE7F2, /* 0xE0 */
+ 0, 0xE7F1, 0, 0, 0, 0xB0E0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0xCFD6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7F2, 0, 0xC0C5, 0xC0ED, 0, /* 0x00 */
+ 0, 0xC1F0, 0xE7F0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xE8A2, 0xE8A1, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xD7C1, 0, 0, 0xE7FA, 0xE7F9, 0, /* 0x20 */
+ 0xE7FB, 0, 0xE7F7, 0, 0xE7FE, 0, 0xE7FD, 0, /* 0x20 */
+ 0xE7FC, 0, 0, 0xC1D5, 0xC7D9, 0xC5FD, 0xC5C3, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE7F5, /* 0x30 */
+ 0, 0xE8A3, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xE7E2, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xE8A6, 0, 0xE8A5, /* 0x50 */
+ 0, 0xE8A7, 0xBAF7, 0xE7F8, 0xE8A4, 0, 0xC8F0, 0xC9AA, /* 0x50 */
+ 0, 0, 0, 0xCBF6, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xD3A8, 0xC2EA, 0, 0, 0xE8A9, 0, 0, /* 0x60 */
+ 0xB9E5, 0, 0, 0, 0, 0, 0xD1FE, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xE8AA, 0, /* 0x70 */
+ 0xE8AD, 0xE8AE, 0, 0xC1A7, 0, 0, 0, 0xE8AF, /* 0x80 */
+ 0, 0xE7F6, 0, 0xE8B0, 0, 0, 0, 0, /* 0x80 */
+ 0xE8B4, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xE8AB, 0, 0xE8B1, 0, /* 0x90 */
+ 0, 0, 0, 0xE7E1, 0, 0, 0xE8A8, 0xE8B5, /* 0xA0 */
+ 0xE8B2, 0xE8B3, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xBBB7, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE8B7, 0, 0, 0xE7F4, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xC7ED, 0, 0, 0, 0, 0xE7E7, /* 0xC0 */
+ 0, 0, 0, 0, 0xE8AC, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE8B6, 0, 0xB9CF, 0, 0xF0AC, 0, /* 0xD0 */
+ 0xF0AD, 0, 0xC6B0, 0xB0EA, 0xC8BF, 0, 0xCDDF, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xCECD, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xEAB2, 0, 0xC6BF, 0xB4C9, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEAB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD5E7, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xEAB1, 0xDDF9, 0, 0xEAB4, /* 0x00 */
+ 0, 0xEAB5, 0, 0xEAB6, 0, 0, 0, 0, /* 0x10 */
+ 0xB8CA, 0xDFB0, 0xC9F5, 0, 0xCCF0, 0, 0, 0xC9FA, /* 0x10 */
+ 0, 0, 0, 0xB2FA, 0, 0xC9FB, 0, 0, /* 0x20 */
+ 0xD3C3, 0xCBA6, 0, 0xB8A6, 0xF0AE, 0xB1C2, 0, 0xE5B8, /* 0x20 */
+ 0xCCEF, 0xD3C9, 0xBCD7, 0xC9EA, 0, 0, 0, 0xC4D0, /* 0x30 */
+ 0xB5E9, 0, 0xEEAE, 0, 0, 0, 0xE7DE, 0, /* 0x30 */
+ 0xEEAF, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xEEB2, 0, 0, 0xEEB1, 0xBDE7, 0, 0xEEB0, 0xCEB7, /* 0x40 */
+ 0, 0, 0, 0, 0xC5CF, 0, 0, 0, /* 0x50 */
+ 0, 0xC1F4, 0xDBCE, 0xEEB3, 0xD0F3, 0xC4B6, 0, 0, /* 0x50 */
+ 0, 0, 0xB1CF, 0, 0, 0xC2D4, 0xC6E8, 0, /* 0x60 */
+ 0, 0, 0xB7AC, 0xBBAD, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xEEB4, 0, 0, 0, 0xB5B1, 0, /* 0x70 */
+ 0xBBFB, 0xEEB5, 0, 0, 0, 0, 0, 0xE7DC, /* 0x70 */
+ 0, 0, 0, 0xEEB6, 0, 0, 0xBDAE, 0xB3EB, /* 0x80 */
+ 0, 0, 0xB5FE, 0xF1E2, 0, 0, 0, 0xCAE8, /* 0x80 */
+ 0, 0xD2C9, 0xF0DA, 0, 0xF0DB, 0, 0, 0, /* 0x90 */
+ 0, 0xB8ED, 0xBECE, 0, 0, 0xF0DE, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF0E0, 0xB0CC, 0xBDEA, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xD2DF, 0, 0, 0, 0, /* 0xA0 */
+ 0xF0E6, 0xF0E5, 0xC6A3, 0xF0E1, 0xF0E2, 0xB4C3, 0, 0, /* 0xB0 */
+ 0xF0E3, 0xD5EE, 0, 0, 0xCCDB, 0xBED2, 0xBCB2, 0, /* 0xB0 */
+ 0, 0, 0xF0E8, 0xF0E7, 0xF0E4, 0xB2A1, 0, 0xF9A1, /* 0xC0 */
+ 0, 0, 0xC8AC, 0, 0, 0xF0EA, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xD6CC, 0xBADB, 0, 0, /* 0xD0 */
+ 0xB6BB, 0xBEB7, 0, 0xCDB4, 0, 0, 0xC6A6, 0, /* 0xD0 */
+ 0, 0, 0xC1A1, 0xF0EB, 0xF0EE, 0, 0xF0ED, 0xF0F0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xCCB5, 0xF0F2, 0, 0, 0xB3D5, 0, 0, 0, /* 0xF0 */
+ 0, 0xB1D4, 0, 0, 0xF0F3, 0, 0, 0xF0F4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0F6, 0xB4E1, 0xF0E9, 0xF0F1, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xF0FA, 0xB7E8, 0xF0F8, 0xD1F1, 0, 0, /* 0x00 */
+ 0xF0F5, 0, 0, 0xBBBE, 0, 0xF0FD, 0, 0, /* 0x10 */
+ 0, 0xF0FE, 0, 0xF1A1, 0, 0, 0xF0F9, 0xCEC1, /* 0x10 */
+ 0xF1A4, 0xB4AF, 0xF1A3, 0, 0xC1F6, 0xF0FB, 0xCADD, 0xC5B1, /* 0x20 */
+ 0, 0xB4F1, 0, 0, 0, 0xF1A6, 0, 0, /* 0x20 */
+ 0xF1A7, 0, 0, 0xF1AC, 0xD5CE, 0xF1A9, 0, 0, /* 0x30 */
+ 0xC8B3, 0, 0, 0xF0FC, 0xF1A2, 0, 0, 0, /* 0x30 */
+ 0xF1A5, 0, 0xC1C6, 0xF1AA, 0, 0, 0xF0EC, 0xF0EF, /* 0x40 */
+ 0, 0xF0F7, 0, 0, 0xB0A9, 0xF1AD, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF1AF, 0, 0xF1B1, 0, /* 0x50 */
+ 0xF0DD, 0, 0, 0, 0xF1B0, 0, 0, 0xB1F1, /* 0x50 */
+ 0, 0, 0xD1F7, 0, 0xF0DC, 0xD6A2, 0, 0xF0DF, /* 0x60 */
+ 0, 0xF1AE, 0, 0, 0xD1A2, 0xF1A8, 0xF1AB, 0xF1B3, /* 0x60 */
+ 0xD3B8, 0xCCB1, 0xF1B2, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xB9EF, 0, 0, 0xB5C7, 0xB7A2, 0xB0D7, 0xB0D9, 0, /* 0x70 */
+ 0, 0, 0xD4ED, 0, 0xB5C4, 0, 0xBDD4, 0xBBCA, /* 0x80 */
+ 0xF0A7, 0, 0, 0xB8DE, 0, 0, 0xF0A8, 0, /* 0x80 */
+ 0, 0, 0, 0xF0A9, 0, 0, 0xCDEE, 0, /* 0x90 */
+ 0, 0xF0AA, 0xB0A8, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xF0AB, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xC6A4, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xF1E5, 0, 0, 0, /* 0xB0 */
+ 0xF1E4, 0, 0xD6E5, 0, 0, 0, 0, 0xC3F3, /* 0xB0 */
+ 0, 0, 0xD3DB, 0, 0, 0xD6D1, 0xC5E8, 0, /* 0xC0 */
+ 0xD3AF, 0, 0xD2E6, 0, 0, 0xEEC1, 0xB0BB, 0, /* 0xC0 */
+ 0, 0, 0xBAD0, 0, 0xBFF8, 0, 0, 0xB5C1, /* 0xD0 */
+ 0, 0, 0, 0xCAA2, 0, 0, 0xD5B5, 0xC3CB, /* 0xD0 */
+ 0, 0xBEA1, 0, 0xBCE0, 0xC5CC, 0xEEC2, 0, 0xC2AC, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xC4BF, 0xB6A2, /* 0xE0 */
+ 0, 0xEDEC, 0xC3A4, 0, 0xD6B1, 0, 0, 0, /* 0xF0 */
+ 0xCFE0, 0xEDEF, 0, 0, 0xC5CE, 0, 0xB6DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCAA1, 0, 0, 0xEDED, 0, 0, 0xEDF0, /* 0x00 */
+ 0xEDF1, 0xC3BC, 0, 0xBFB4, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xEDF4, 0xEDF2, 0, 0, 0, 0, 0xD5E6, /* 0x10 */
+ 0xC3DF, 0, 0xEDF3, 0, 0, 0, 0xEDF6, 0, /* 0x20 */
+ 0xD5A3, 0xD1A3, 0, 0, 0, 0xEDF5, 0, 0xC3D0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xEDF7, 0xBFF4, 0xBEEC, /* 0x30 */
+ 0xEDF8, 0, 0xCCF7, 0, 0xD1DB, 0, 0, 0, /* 0x30 */
+ 0xD7C5, 0, 0, 0xEDFC, 0, 0, 0, 0xEDFB, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF8CA, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0xEDFD, 0xBEA6, 0xD5F6, 0, 0xEDF9, 0, /* 0x50 */
+ 0, 0xCBAF, 0xEEA1, 0xB6BD, 0, 0xEEA2, 0xC4C0, 0, /* 0x60 */
+ 0xEDFE, 0, 0, 0xBDDE, 0xB2C7, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB6C3, 0, 0, 0, 0xEEA5, 0xD8BA, 0xEEA3, /* 0x70 */
+ 0xEEA6, 0, 0, 0, 0xC3E9, 0xB3F2, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xEEA7, 0xEEA4, 0xCFB9, 0, /* 0x80 */
+ 0, 0xEEA8, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xEDEE, 0, 0, 0, 0, 0, 0xC2F7, 0xEEA9, /* 0x90 */
+ 0xEEAA, 0, 0xDEAB, 0, 0, 0xC6B3, 0, 0xC7C6, /* 0xA0 */
+ 0, 0, 0xB5C9, 0, 0xCBB2, 0xF8D1, 0, 0, /* 0xA0 */
+ 0xEEAB, 0, 0, 0xCDAB, 0, 0xEEAC, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xD5B0, 0xEDFA, 0xEEAD, 0, 0xF6C4, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF8D7, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xDBC7, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB4A3, /* 0xD0 */
+ 0, 0, 0xD6F5, 0xC3AC, 0xF1E6, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xCAB8, 0xD2D3, 0, 0xD6AA, 0, 0xEFF2, /* 0xE0 */
+ 0, 0xBED8, 0, 0, 0xEFF3, 0xB6CC, 0xB0AB, 0xBDC3, /* 0xE0 */
+ 0, 0, 0, 0xCAAF, 0, 0, 0, 0, /* 0xF0 */
+ 0xEDB7, 0, 0, 0, 0, 0xCEF9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC9B0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xEDB9, 0, 0, 0xC6F6, 0xBFB3, 0, 0, /* 0x00 */
+ 0, 0xEDBC, 0xC5F8, 0, 0xD1D0, 0, 0, 0, /* 0x10 */
+ 0xEDBB, 0, 0, 0, 0, 0xEDC0, 0, 0xEDC4, /* 0x10 */
+ 0, 0, 0, 0xEDC8, 0, 0xEDC6, 0xEDCE, 0xD5E8, /* 0x20 */
+ 0, 0xEDC9, 0, 0, 0xEDC7, 0xEDBE, 0, 0, /* 0x20 */
+ 0xC5E9, 0, 0, 0, 0xC6C6, 0, 0, 0xC9E9, /* 0x30 */
+ 0xD4D2, 0xEDC1, 0, 0, 0xEDC5, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xF9A7, 0, 0xB9E8, 0, 0xEDD0, /* 0x40 */
+ 0, 0, 0, 0, 0xEDD1, 0, 0xEDCA, 0, /* 0x40 */
+ 0xEDCF, 0, 0xCEF8, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xCFF5, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xEDCC, 0, 0, 0, /* 0x60 */
+ 0xEDBA, 0, 0xEDD2, 0xC1F2, 0xD3B2, 0xEDCB, 0xF8E6, 0xD1E2, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xC5F0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xEDD6, /* 0x80 */
+ 0, 0xB5EF, 0, 0, 0xC2B5, 0, 0xCBE9, 0, /* 0x80 */
+ 0, 0xB1AE, 0, 0xEDD4, 0, 0, 0, 0xCDEB, /* 0x90 */
+ 0xB5E2, 0, 0xEDD5, 0, 0, 0, 0, 0xB5FA, /* 0x90 */
+ 0, 0xEDD8, 0, 0xEDD9, 0, 0xEDDC, 0, 0xB1CC, /* 0xA0 */
+ 0, 0xCBB6, 0, 0, 0, 0xEDB8, 0, 0, /* 0xA0 */
+ 0xC5F6, 0xBCEE, 0xEDDA, 0xCCBC, 0xB2EA, 0, 0, 0, /* 0xB0 */
+ 0xEDBF, 0xEDDB, 0xC8B7, 0, 0xC2EB, 0, 0xC4EB, 0, /* 0xB0 */
+ 0, 0xB4C5, 0, 0, 0, 0xB0F5, 0, 0, /* 0xC0 */
+ 0, 0xEDDF, 0xC0DA, 0xB4E8, 0, 0, 0, 0, /* 0xC0 */
+ 0xC5CD, 0, 0, 0, 0xEDDD, 0xBFC4, 0, 0, /* 0xD0 */
+ 0, 0xEDDE, 0xD7A9, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xEDD7, 0, 0, 0, 0xEDD3, /* 0xE0 */
+ 0xC4A5, 0, 0, 0, 0xEDE0, 0, 0, 0xEDB6, /* 0xE0 */
+ 0, 0, 0xEDE1, 0, 0xEDE3, 0, 0, 0xC1D7, /* 0xF0 */
+ 0, 0, 0xBBC7, 0, 0, 0xEDCD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDB8, 0, 0, 0, 0xEDE2, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xB4A1, 0, /* 0x00 */
+ 0, 0, 0, 0xEDE4, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xB0AD, 0, 0, 0, 0, 0xEDE6, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xEDE5, 0, 0xBFF3, 0, /* 0x20 */
+ 0, 0, 0xEDC2, 0xC0F9, 0xB7AF, 0, 0, 0, /* 0x20 */
+ 0, 0xEDC3, 0, 0, 0xEDE7, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xCABE, 0xECEA, 0, 0, 0xC9E7, 0, /* 0x30 */
+ 0xECEB, 0xC6EE, 0, 0, 0, 0, 0xECEC, 0, /* 0x40 */
+ 0xC6ED, 0xECED, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xECF0, 0, 0, 0xD7E6, 0xECF3, /* 0x50 */
+ 0, 0, 0xECF1, 0xECEE, 0xECEF, 0xD7A3, 0xC9F1, 0xCBEE, /* 0x50 */
+ 0xECF4, 0, 0, 0, 0, 0xCFE9, 0, 0xECF6, /* 0x60 */
+ 0xC6B1, 0, 0, 0, 0, 0xBCC0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xECF7, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xD9F7, 0xBDFB, 0, 0, 0xC2BB, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xECF9, 0, 0, 0xBBF6, 0xECF5, 0xB8A3, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xECFA, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xF8FA, 0xECFB, /* 0xA0 */
+ 0, 0, 0xECF8, 0, 0, 0, 0xC0F1, 0, /* 0xA0 */
+ 0xECF2, 0xB5BB, 0, 0xECFC, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xD3ED, 0xD8AE, 0, 0, 0xC7DD, 0xBACC, 0, /* 0xB0 */
+ 0xD0E3, 0xCBBD, 0, 0xCDBA, 0, 0, 0xB8D1, 0, /* 0xC0 */
+ 0, 0xB1FC, 0, 0xC7EF, 0, 0xF9A6, 0, 0, /* 0xC0 */
+ 0, 0xBFC6, 0xC3EB, 0, 0, 0xEFF5, 0, 0, /* 0xD0 */
+ 0xC3D8, 0, 0, 0, 0, 0, 0, 0xD7E2, /* 0xD0 */
+ 0, 0, 0, 0xEFF7, 0xB3D3, 0, 0xC7D8, 0xD1ED, /* 0xE0 */
+ 0, 0xD6C8, 0, 0xEFF8, 0, 0xEFF6, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xBDD5, 0, 0, 0xD2C6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCFA1, 0, 0xEFFC, 0xEFFB, 0, 0, 0xEFF9, 0, /* 0x00 */
+ 0, 0, 0, 0xB3CC, 0, 0xC9D4, 0xCBB0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xEFFE, 0, 0, 0xB0DE, /* 0x10 */
+ 0, 0, 0xD6C9, 0, 0, 0, 0xEFFD, 0, /* 0x10 */
+ 0xB3ED, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xD6D6, 0, /* 0x20 */
+ 0, 0xB3C6, 0, 0, 0, 0, 0, 0xF0A2, /* 0x30 */
+ 0, 0xF0A1, 0, 0xB5BE, 0xBCDA, 0xBBFC, 0, 0xB8E5, /* 0x30 */
+ 0xF8B6, 0, 0, 0, 0, 0, 0xC4C2, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF6D5, 0xBBFD, 0xD3B1, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCBEB, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xF0A3, 0xBBE0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xCEC8, 0, 0xF8BE, 0, 0, 0, 0, /* 0x60 */
+ 0xF0A6, 0, 0, 0, 0xD1A8, 0, 0xBEBF, 0, /* 0x70 */
+ 0xF1B6, 0xF1B7, 0xBFD5, 0, 0, 0, 0, 0xB4A9, /* 0x70 */
+ 0xF1B8, 0xCDBB, 0, 0, 0xD5AD, 0, 0xF1B9, 0, /* 0x80 */
+ 0xF1BA, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xD2A4, 0xD6CF, 0, 0, 0xF1BB, 0xBDD1, 0xB4B0, /* 0x90 */
+ 0xBEBD, 0, 0, 0, 0, 0, 0, 0xBFDF, /* 0x90 */
+ 0xF1BD, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xF1BF, 0xCED1, 0xCDDD, 0, 0xF1BE, 0, 0xC7EE, 0, /* 0xA0 */
+ 0, 0, 0, 0xF1C1, 0, 0, 0xF1C0, 0, /* 0xB0 */
+ 0, 0, 0xBFFA, 0, 0, 0, 0, 0xC1FE, /* 0xB0 */
+ 0, 0, 0, 0, 0xB4DC, 0xC7CF, 0, 0xF1BC, /* 0xC0 */
+ 0xD4EE, 0, 0xC7D4, 0xC1A2, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xD5BE, 0, 0, 0, 0, 0, 0xBEB9, /* 0xD0 */
+ 0xD5C2, 0, 0, 0xBFA2, 0, 0xCDAF, 0xF1B5, 0, /* 0xE0 */
+ 0, 0, 0xCAFA, 0, 0, 0xBDDF, 0, 0xB6CB, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xBEBA, 0, /* 0xF0 */
+ 0, 0xD6F1, 0xF3C3, 0, 0, 0xF3C4, 0, 0xB8CD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF3C7, 0, 0xB0CA, 0, /* 0x00 */
+ 0xF3C5, 0, 0xF3C9, 0xCBF1, 0, 0, 0, 0xF3CB, /* 0x00 */
+ 0, 0xD0A6, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF3CF, 0, 0xB5D1, 0, 0, 0xF3D7, 0, /* 0x10 */
+ 0xF3D2, 0, 0, 0, 0xF3D4, 0xF3D3, 0xB7FB, 0, /* 0x20 */
+ 0xB1BF, 0, 0xF3CE, 0xF3CA, 0xB5DA, 0, 0xF3D0, 0, /* 0x20 */
+ 0, 0xF3D1, 0, 0xF3D5, 0, 0, 0, 0, /* 0x30 */
+ 0xF3CD, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF3DA, 0xB1CA, 0xF3CC, /* 0x40 */
+ 0, 0xB5C8, 0, 0xBDEE, 0xF3DC, 0, 0, 0xB7A4, /* 0x40 */
+ 0xBFF0, 0xF9A8, 0xCDB2, 0, 0xB4F0, 0, 0xB2DF, 0, /* 0x50 */
+ 0xF3D8, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF3DE, 0, 0xF3E1, 0, 0, 0, 0, 0xF3C8, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xF3DF, 0, /* 0x60 */
+ 0, 0xF3E3, 0xF3E2, 0, 0, 0xF3DB, 0, 0xBFEA, /* 0x70 */
+ 0, 0, 0, 0xF3E0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF3EB, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xBCE3, 0, 0xB9BF, 0, 0xF3DD, /* 0x80 */
+ 0xF3E4, 0, 0, 0, 0xB2AD, 0xBBFE, 0, 0xCBE3, /* 0x90 */
+ 0, 0, 0, 0, 0xF3ED, 0xF3E9, 0, 0, /* 0x90 */
+ 0, 0xB9DC, 0xF3EE, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xF3E8, 0xBCFD, 0, 0, /* 0xA0 */
+ 0, 0xCFE4, 0, 0, 0xF3F0, 0, 0, 0, /* 0xB0 */
+ 0xF3E7, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xBDDA, 0xF3F2, 0, 0, 0xB7B6, 0, 0xD7AD, 0xC6AA, /* 0xC0 */
+ 0, 0xD6FE, 0, 0xF3E6, 0xF3F3, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xB8DD, 0xF3F5, 0, 0, 0xF3F4, 0, 0, /* 0xD0 */
+ 0, 0xB4DB, 0, 0, 0xF3C6, 0xF3F6, 0xF3F7, 0, /* 0xE0 */
+ 0, 0xC9B8, 0xF3F8, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF3D9, 0, 0, 0, 0xC5F1, /* 0xF0 */
+ 0, 0, 0, 0, 0xF3FB, 0, 0xF3FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF3E5, 0, 0, 0, 0, 0, 0, 0xB4D8, /* 0x00 */
+ 0, 0, 0, 0xF3FE, 0xF3F9, 0xC2A8, 0, 0xF3FC, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xF3EC, 0xF4A1, /* 0x10 */
+ 0, 0xBCF2, 0, 0xF3F1, 0, 0, 0xF4A3, 0xBBC9, /* 0x20 */
+ 0, 0, 0xF4A2, 0xF3EF, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xF4A4, 0, 0, 0, 0, 0xC7A9, 0xC1B1, 0xB2BE, /* 0x30 */
+ 0xF4A6, 0, 0, 0xC0BA, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xB3EF, 0xBCAE, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xF3EA, 0, 0, 0xF4A5, /* 0x50 */
+ 0xC1FD, 0, 0, 0, 0xF8E2, 0, 0, 0, /* 0x60 */
+ 0, 0xF3D6, 0xF3FD, 0, 0xC0E9, 0, 0xC2E1, 0, /* 0x60 */
+ 0, 0, 0xF8FB, 0xC3D7, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF4CC, 0xD7D1, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xB7DB, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF4CE, 0xC1A3, 0, 0, 0xC6C9, 0, 0xB4D6, /* 0x90 */
+ 0xD5B3, 0, 0, 0, 0, 0, 0xF4D1, 0xCBDA, /* 0x90 */
+ 0, 0, 0xF4D2, 0, 0xD4C1, 0xD6E0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xC1BB, 0xF4D3, 0xBEAC, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xB4E2, 0, 0, 0xF4D4, 0xF4D5, 0xBEAB, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xF4DB, 0, 0xF4D7, /* 0xC0 */
+ 0xF4DA, 0, 0xBAFD, 0, 0xF4D8, 0xF4D9, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xB8E2, 0xCCC7, 0xF4DC, /* 0xD0 */
+ 0, 0xB2DA, 0, 0, 0xC3D3, 0xF4D6, 0xB7E0, 0xD4E3, /* 0xD0 */
+ 0xBFB7, 0, 0, 0, 0, 0, 0, 0xC1B8, /* 0xE0 */
+ 0xF4DD, 0, 0, 0, 0, 0, 0, 0xC5B4, /* 0xE0 */
+ 0xF8F0, 0, 0xF4CF, 0, 0xD9E1, 0, 0xF4D0, 0, /* 0xF0 */
+ 0xF4E9, 0xE6F9, 0, 0xCFB5, 0, 0, 0xBEC0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBCCD, 0, 0xE6FB, 0, 0xD4BC, 0xBAEC, 0xE6FA, 0xE6FC, /* 0x00 */
+ 0xE6FD, 0xC8D2, 0xCEC9, 0xCEC6, 0, 0xC4C9, 0, 0, /* 0x00 */
+ 0xC5A6, 0, 0, 0xE7A3, 0xB4BF, 0xE7A2, 0, 0xC9B4, /* 0x10 */
+ 0, 0xD6BD, 0xBCB6, 0xB7D7, 0xE7A1, 0, 0, 0, /* 0x10 */
+ 0xCBD8, 0xB7C4, 0xCBF7, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xD7CF, 0, 0, 0, 0xC0DB, /* 0x20 */
+ 0xCFB8, 0xE7A6, 0xE7A5, 0xC9F0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xC9DC, 0xE7A4, 0, 0xE7A8, 0, 0, 0xE7AA, /* 0x30 */
+ 0xE7A9, 0, 0xD6D5, 0, 0xD7E9, 0, 0xB0ED, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xE7AC, 0, /* 0x40 */
+ 0xBDE1, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xE7AB, 0xBDCA, 0, /* 0x50 */
+ 0, 0xC2E7, 0xD1A4, 0, 0, 0, 0xB8F8, 0, /* 0x60 */
+ 0xC8DE, 0, 0, 0, 0, 0, 0xD0F5, 0, /* 0x60 */
+ 0, 0xCDB3, 0xCBBF, 0xE7AD, 0, 0, 0xBEF8, 0, /* 0x70 */
+ 0, 0xBEEE, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB0F3, 0, 0xE7AF, 0, 0, 0xE7AE, 0, /* 0x80 */
+ 0xE7B0, 0xD0E5, 0, 0, 0, 0, 0, 0xCBE7, /* 0x80 */
+ 0, 0, 0, 0xBEAD, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xD7DB, 0, 0xE7B6, 0, /* 0x90 */
+ 0, 0, 0xB3F1, 0xE7B9, 0, 0, 0xF4EB, 0, /* 0xA0 */
+ 0, 0, 0, 0xCFDF, 0xE7B7, 0xCEAC, 0xF4EC, 0, /* 0xA0 */
+ 0xE7BA, 0xB8D9, 0xCDF8, 0xB1C1, 0xD7BA, 0, 0, 0, /* 0xB0 */
+ 0xC2DA, 0xE7B8, 0xE7B2, 0xD5C0, 0, 0xB4C2, 0xE7B1, 0xC3E0, /* 0xB0 */
+ 0, 0, 0, 0, 0xE7B5, 0, 0, 0xE7BB, /* 0xC0 */
+ 0, 0, 0xBDF4, 0xE7B3, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xC2CC, 0xD0F7, 0, 0xE7B4, 0, 0, 0xE7BD, /* 0xD0 */
+ 0xBCEA, 0xE7BC, 0, 0, 0, 0xBCA9, 0xB6D0, 0, /* 0xD0 */
+ 0xB5DE, 0xE7C5, 0, 0xD4B5, 0, 0, 0xE7C1, 0, /* 0xE0 */
+ 0xB1E0, 0xBBBA, 0, 0, 0xC3E5, 0, 0, 0xCEB3, /* 0xE0 */
+ 0, 0xE7C3, 0xE7BF, 0, 0xC1B7, 0, 0xE7C2, 0, /* 0xF0 */
+ 0, 0xE7BE, 0, 0xF9A4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xDDD3, 0xE7C6, 0xE7CB, 0xE7C4, 0, 0, 0, 0, /* 0x00 */
+ 0xE7A7, 0xE7CC, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xB8BF, 0, 0xE7C7, 0xE7C9, 0xE7C8, /* 0x10 */
+ 0, 0, 0, 0xCFD8, 0, 0, 0, 0xCCD0, /* 0x20 */
+ 0, 0, 0, 0xB7EC, 0, 0xE7CA, 0xCBF5, 0, /* 0x20 */
+ 0, 0xD7DD, 0xE7D0, 0, 0xF8E3, 0xE7CF, 0xF4EA, 0xC2C6, /* 0x30 */
+ 0, 0xE7CE, 0, 0xF7E3, 0, 0xD7DC, 0xBCA8, 0, /* 0x30 */
+ 0, 0xB7B1, 0, 0, 0, 0xE7D2, 0xE7D1, 0xF4ED, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xE7D5, 0, 0xD6AF, 0xC9C9, 0, 0, /* 0x50 */
+ 0, 0, 0xE7D4, 0, 0, 0, 0xC8C6, 0, /* 0x50 */
+ 0, 0, 0xE7C0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xC9FE, 0xBBE6, 0xF8F3, 0, 0xBCEB, 0xE7D6, 0xE7D9, /* 0x60 */
+ 0xE7D8, 0, 0, 0xBDC9, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xD2EF, 0, 0, 0xBCCC, 0xE7CD, 0xE7D7, 0, /* 0x70 */
+ 0, 0, 0xD7EB, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE7D3, 0, 0xE6FE, 0, 0xD0F8, 0xF8CD, 0, 0xB2F8, /* 0x80 */
+ 0, 0, 0, 0xD3A7, 0xF8A6, 0, 0xCFCB, 0, /* 0x90 */
+ 0xE7DA, 0, 0, 0xF4EE, 0xC0C2 /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF3BE, 0, /* 0x30 */
+ 0xB8D7, 0, 0xC8B1, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF3C0, 0xF3C1, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF3BF, 0, 0xF8EE, 0, /* 0x40 */
+ 0xB9DE, 0, 0, 0, 0xD8E8, 0xBAB1, 0, 0, /* 0x50 */
+ 0xEEB7, 0, 0, 0, 0, 0, 0, 0xEEB9, /* 0x50 */
+ 0, 0xEEB8, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xEEBB, 0xD5D6, 0xD7EF, 0, 0, 0, 0xD6C3, 0, /* 0x60 */
+ 0xB7A3, 0xEEBD, 0xCAF0, 0, 0, 0, 0, 0xB0D5, /* 0x70 */
+ 0, 0xEEBE, 0, 0, 0, 0, 0xEEC0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xC2DE, 0xEEBC, 0, /* 0x80 */
+ 0xEEBF, 0, 0xD1F2, 0, 0xC7BC, 0, 0xC3C0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xB8E1, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xC1E7, 0, 0, 0xF4C6, 0xD0DF, 0, /* 0x90 */
+ 0, 0xCFDB, 0, 0, 0xC8BA, 0xF4C7, 0, 0xF4C8, /* 0xA0 */
+ 0, 0xD2E5, 0, 0, 0, 0, 0, 0xF4C9, /* 0xA0 */
+ 0xF4CA, 0, 0xF4CB, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xD9FA, 0xB8FE, 0, 0, 0xE5F1, 0xD3F0, 0, 0xF4E0, /* 0xB0 */
+ 0, 0xCECC, 0, 0, 0, 0xB3E1, 0, 0, /* 0xC0 */
+ 0, 0, 0xF1B4, 0, 0xD2EE, 0, 0xF4E1, 0, /* 0xC0 */
+ 0, 0, 0xCFB0, 0, 0xCFE8, 0xF4E2, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB5D4, /* 0xD0 */
+ 0xB4E4, 0xF4E4, 0, 0, 0, 0xF4E3, 0xF4E5, 0, /* 0xE0 */
+ 0, 0xF4E6, 0, 0, 0, 0, 0xF4E7, 0, /* 0xE0 */
+ 0xBAB2, 0xB0BF, 0, 0xF4E8, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xC7CC, 0, 0xB7AD, 0xD2ED /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2AB, 0xC0CF, 0, 0xBFBC, 0xEBA3, 0xD5DF, 0xEAC8, 0, /* 0x00 */
+ 0, 0, 0, 0xF1F3, 0xB6F8, 0xCBA3, 0, 0, /* 0x00 */
+ 0xC4CD, 0, 0xF1E7, 0, 0xF1E8, 0xB8FB, 0xF1E9, 0xBAC4, /* 0x10 */
+ 0xD4C5, 0xB0D2, 0, 0, 0xF1EA, 0, 0, 0, /* 0x10 */
+ 0xF1EB, 0, 0, 0, 0, 0xF1ED, 0xF1EE, 0, /* 0x20 */
+ 0xF1F1, 0xF1F0, 0xC5D5, 0, 0xF1EF, 0, 0xF1EC, 0, /* 0x20 */
+ 0, 0xF1F2, 0, 0xB6FA, 0, 0xF1F4, 0xD2AE, 0xDEC7, /* 0x30 */
+ 0, 0, 0, 0xB3DC, 0, 0xB5A2, 0, 0xB9A2, /* 0x30 */
+ 0, 0, 0, 0xF1F5, 0, 0, 0xF1F6, 0, /* 0x40 */
+ 0, 0, 0xC1C4, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF1F8, 0, 0, 0, 0xCAA5, 0, /* 0x50 */
+ 0xC6B8, 0, 0xBEDB, 0, 0, 0, 0xCEC5, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC1AA, /* 0x60 */
+ 0xB4CF, 0xF1FA, 0xC9F9, 0xCBCA, 0, 0xF1F9, 0xC4F4, 0xD6B0, /* 0x70 */
+ 0, 0xF1F7, 0, 0, 0, 0xCCFD, 0xC1FB, 0xEDB2, /* 0x70 */
+ 0xEDB1, 0, 0, 0, 0xD2DE, 0xCBE0, 0xCBC1, 0xD5D8, /* 0x80 */
+ 0, 0xC8E2, 0, 0xC0DF, 0xBCA1, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xEBC1, 0, 0, 0xD0A4, 0, /* 0x90 */
+ 0xD6E2, 0, 0xB6C7, 0xB8D8, 0xEBC0, 0xB8CE, 0, 0xEBBF, /* 0x90 */
+ 0, 0xB9C9, 0xD6AB, 0, 0, 0xB7CA, 0, 0, /* 0xA0 */
+ 0, 0xBCE7, 0xB7BE, 0xEBC6, 0, 0xEBC7, 0, 0xBFCF, /* 0xA0 */
+ 0, 0xEBC5, 0xD3FD, 0, 0xEBC8, 0, 0, 0xEBC9, /* 0xB0 */
+ 0, 0, 0xB7CE, 0, 0xEBC2, 0xEBC4, 0, 0, /* 0xB0 */
+ 0, 0, 0xEBCF, 0xCEB8, 0xEBD0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xB1B3, 0xEBD2, 0xCCA5, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xC5D6, 0xEBD3, /* 0xD0 */
+ 0, 0xEBD1, 0xC5DF, 0xEBCE, 0, 0xEBD5, 0xB0FB, 0, /* 0xD0 */
+ 0, 0xBAFA, 0, 0, 0xD8B7, 0xF1E3, 0, 0, /* 0xE0 */
+ 0, 0xEBCC, 0, 0, 0xE6C0, 0xEBD9, 0, 0xBFE8, /* 0xE0 */
+ 0xD2C8, 0xEBD7, 0xEBDC, 0xB8EC, 0xEBD8, 0, 0, 0, /* 0xF0 */
+ 0xD0D8, 0, 0xB0B7, 0, 0xEBDD, 0xC4DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD6AC, 0, 0, 0xD0B2, 0xB4E0, 0, /* 0x00 */
+ 0, 0xC2F6, 0xBCB9, 0, 0, 0, 0xEBDB, 0, /* 0x00 */
+ 0, 0, 0xEBDF, 0, 0, 0, 0xB2B1, 0, /* 0x10 */
+ 0xEBE4, 0, 0xBDC5, 0xEBD6, 0, 0, 0xEBE2, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xEBE3, 0, 0, 0xB8AC, /* 0x20 */
+ 0, 0xCDD1, 0xEBE5, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xD5CD, 0, 0, 0, 0, 0xC6A2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xCCF3, 0, /* 0x40 */
+ 0xEBE6, 0, 0xF8CC, 0xD2B8, 0xEBE7, 0, 0xC9F6, 0, /* 0x40 */
+ 0xB8AF, 0xB8AD, 0, 0xEBE8, 0xC7BB, 0xCDF3, 0xEBCB, 0, /* 0x50 */
+ 0, 0xEBEA, 0xEBEB, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xEBED, 0xEBE1, 0, 0, 0, 0xD0C8, 0xC4D4, 0xEBF2, /* 0x60 */
+ 0, 0xEBEE, 0, 0xD6D7, 0, 0xEBF1, 0xC8F9, 0, /* 0x60 */
+ 0xD1FC, 0xEBEC, 0, 0, 0xEBE9, 0, 0, 0, /* 0x70 */
+ 0xB3A6, 0xB8B9, 0xCFD9, 0, 0xEBEF, 0xEBF0, 0, 0xCDC8, /* 0x70 */
+ 0xB0F2, 0, 0xEBF6, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xEBF5, 0, 0xB2B2, 0, 0, 0, 0, 0xB8E0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xB1EC, 0, 0xB7F4, 0xCCC5, 0xC4A4, 0xCFA5, 0, 0, /* 0x90 */
+ 0xBDBA, 0, 0, 0xEBF9, 0, 0, 0xECA2, 0, /* 0xA0 */
+ 0xC5F2, 0xC4E5, 0xEBFA, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xC9C5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE2DF, 0xEBFE, 0, 0xB5A8, 0xEBDA, 0xC5A7, /* 0xB0 */
+ 0xCDCE, 0xECA1, 0xB1DB, 0xD3B7, 0, 0, 0xD2DC, 0, /* 0xC0 */
+ 0, 0xC1B3, 0xEBFD, 0, 0xEBFB, 0xC6EA, 0, 0xEBF7, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xC0B0, 0, 0xEBCD, 0, 0, 0, 0, 0xD4E0, /* 0xD0 */
+ 0xD9F5, 0, 0, 0xB3BC, 0, 0, 0, 0xEAB0, /* 0xE0 */
+ 0xC1D9, 0, 0xD7D4, 0, 0xF4AB, 0xB3F4, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xD6C1, 0xD6C2, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xCCA8, 0xD5E9, 0xBECA, 0, 0xF4A7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2A8, 0xF4A8, 0xF4A9, 0, 0xF4AA, 0xBECB, 0, 0xD3EB, /* 0x00 */
+ 0xD0CB, 0xBED9, 0xBEC9, 0, 0xC9E0, 0xF8E7, 0, 0, /* 0x00 */
+ 0xF3C2, 0, 0xCAE6, 0, 0xCCF2, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xE2B6, 0xCBB4, 0, 0xCEE8, 0xD6DB, /* 0x10 */
+ 0, 0xF4AD, 0xF4AE, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xF4B2, 0, 0xBABD, 0xF4B3, 0xB0E3, 0xF4B0, 0, 0xF4B1, /* 0x20 */
+ 0, 0, 0, 0xF4B6, 0xF4B7, 0xB6E6, 0xB2B0, 0xCFCF, /* 0x30 */
+ 0xF4B4, 0xB4AC, 0, 0, 0, 0, 0xF4B8, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF4B9, 0, 0, 0xCDA7, /* 0x40 */
+ 0, 0xF4BA, 0, 0xF4BB, 0, 0, 0, 0xF4BC, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xCBD2, 0xB2D5, 0xF4BD, 0, 0, 0, 0, 0xF4BE, /* 0x50 */
+ 0, 0, 0, 0, 0xF4AF, 0, 0xBDA2, 0, /* 0x60 */
+ 0xF4BF, 0, 0, 0xF4B5, 0, 0, 0xF4DE, 0xC1BC, /* 0x60 */
+ 0, 0xBCE8, 0xC9AB, 0, 0xE5F5, 0, 0, 0xD1DE, /* 0x70 */
+ 0, 0xDCB3, 0, 0, 0, 0xDCB4, 0xB0AC, 0xDCB5, /* 0x70 */
+ 0, 0, 0, 0, 0xDCB9, 0, 0, 0, /* 0x80 */
+ 0xD8C2, 0, 0xDCB7, 0xD3F3, 0, 0xC9D6, 0xDCBA, 0xDCB6, /* 0x80 */
+ 0, 0xDCBB, 0xC3A2, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xDCC5, 0xDCBD, 0, 0, 0, 0xD6A5, 0, 0xDCCF, /* 0x90 */
+ 0, 0xDCCD, 0, 0, 0xDCD2, 0xBDE6, 0, 0, /* 0xA0 */
+ 0xDCB8, 0xDCCB, 0xDCCE, 0xDCBE, 0xB7D2, 0xB0C5, 0xDCC7, 0xD0BE, /* 0xA0 */
+ 0xDCC1, 0xBBA8, 0, 0xB7BC, 0xDCCC, 0, 0, 0xDCC6, /* 0xB0 */
+ 0, 0xC7DB, 0, 0xDBBB, 0, 0xD1BF, 0xDCC0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xDCD0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xDCC3, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xD4B7, 0xDCDB, 0xDCDF, 0xCCA6, 0xDCE6, 0, 0xC3E7, /* 0xD0 */
+ 0xDCDC, 0, 0, 0xBFC1, 0xDCD9, 0, 0xB0FA, 0xB9B6, /* 0xD0 */
+ 0xDCE5, 0xDCD3, 0, 0xDCC4, 0xDCD6, 0xC8F4, 0xBFE0, 0xDCD1, /* 0xE0 */
+ 0, 0, 0, 0xC9BB, 0, 0, 0, 0xB1BD, /* 0xE0 */
+ 0, 0xD3A2, 0, 0, 0xDCDA, 0, 0, 0xDCD5, /* 0xF0 */
+ 0, 0xF8DC, 0, 0xDCDE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7C2, 0xC3AF, 0xF8B2, 0xC7D1, 0xC3A9, 0xDCE2, 0xDCD8, /* 0x00 */
+ 0xDCEB, 0xDCD4, 0, 0, 0xDCDD, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDCF8, /* 0x10 */
+ 0, 0, 0xDCE1, 0xDDA2, 0xDCE7, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xB4C4, 0, 0, 0xC3A3, 0xB2E7, 0xDCFA, 0, 0xDCF2, /* 0x20 */
+ 0, 0xDCEF, 0, 0xDCFC, 0xDCEE, 0xD2F0, 0xB2E8, 0, /* 0x30 */
+ 0xC8D7, 0xC8E3, 0xDCFB, 0, 0xDCED, 0, 0, 0, /* 0x30 */
+ 0xDCF7, 0, 0, 0xDCF5, 0, 0, 0xBEA3, 0xDCF4, /* 0x40 */
+ 0, 0xB2DD, 0, 0, 0, 0, 0, 0xDCF3, /* 0x40 */
+ 0xF8C3, 0xDCE8, 0xBBC4, 0, 0xC0F3, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xBAC9, /* 0x70 */
+ 0xDDA9, 0, 0, 0xDDB6, 0xDDB1, 0xDDB4, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xDDB0, 0xC6CE, 0, /* 0x80 */
+ 0, 0xC0F2, 0xD7AF, 0, 0, 0, 0xC9AF, 0, /* 0x80 */
+ 0, 0, 0xDCEC, 0xDDAE, 0, 0, 0xBEA5, 0, /* 0x90 */
+ 0xDDB7, 0, 0, 0xDCF0, 0xDDAF, 0, 0xDDB8, 0, /* 0x90 */
+ 0xDDAC, 0, 0xBCD4, 0, 0, 0, 0, 0xDCC8, /* 0xA0 */
+ 0xDDB9, 0xDDB3, 0xDDAD, 0xC4AA, 0, 0, 0, 0, /* 0xA0 */
+ 0xDDA8, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xC3A7, 0, 0, /* 0xB0 */
+ 0xDDD2, 0xDDBC, 0, 0, 0, 0xDDD1, 0, 0xB9BD, /* 0xC0 */
+ 0, 0, 0xBED5, 0, 0xBEFA, 0, 0, 0xBACA, /* 0xC0 */
+ 0, 0, 0, 0, 0xDDCA, 0, 0xDDC5, 0, /* 0xD0 */
+ 0xDDBF, 0, 0, 0, 0xB2CB, 0xDDC3, 0, 0xDDCB, /* 0xD0 */
+ 0xB2A4, 0xDDD5, 0, 0, 0, 0xDDBE, 0, 0, /* 0xE0 */
+ 0, 0xC6D0, 0xDDD0, 0, 0, 0, 0, 0xBBAA, /* 0xE0 */
+ 0xDDD4, 0xC1E2, 0xB7C6, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xDDCE, 0xDDCF, 0, 0, 0, 0xDDC4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDDBD, 0, 0xDDCD, 0xCCD1, 0, 0xDDC9, 0xDCC9, /* 0x00 */
+ 0, 0, 0xC0B3, 0xDDC2, 0xC3C8, 0xC6BC, 0xCEAE, 0xDDCC, /* 0x00 */
+ 0, 0xDDC8, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xDDC1, 0, 0, 0, 0xDDC6, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xCDF2, 0, 0, 0, /* 0x20 */
+ 0, 0xDDE6, 0, 0, 0, 0xDDAB, 0, 0, /* 0x30 */
+ 0xDDC7, 0, 0, 0, 0xDDE0, 0xC2E4, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xDDE1, 0, /* 0x40 */
+ 0, 0xD2B6, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xDDD7, 0xDDA6, 0, 0, 0, 0, 0xD6F8, /* 0x50 */
+ 0, 0xDDD9, 0xDDD8, 0xB8F0, 0xDDD6, 0, 0, 0, /* 0x50 */
+ 0, 0xC6CF, 0, 0xB6AD, 0xDDA7, 0, 0xCEAD, 0, /* 0x60 */
+ 0, 0xDDE2, 0, 0xBAF9, 0xD4E1, 0xDDE7, 0, 0xF8F7, /* 0x60 */
+ 0, 0xB4D0, 0, 0xDDDA, 0, 0xBFFB, 0xDDE3, 0xBBE7, /* 0x70 */
+ 0xDDDF, 0, 0xDDDD, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xB5D9, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xDDDC, 0, 0, 0, 0, 0, 0xDDE5, 0, /* 0x80 */
+ 0, 0, 0, 0xDDBB, 0xDDAA, 0, 0, 0xDDF5, /* 0x90 */
+ 0, 0xC3C9, 0, 0, 0xCBE2, 0, 0, 0, /* 0x90 */
+ 0, 0xDDF2, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xD8E1, /* 0xA0 */
+ 0, 0, 0xC6D1, 0, 0xDDF4, 0, 0, 0, /* 0xB0 */
+ 0xD5F4, 0xDDF3, 0xDDF0, 0, 0xB2D4, 0xDDEC, 0, 0xDDEF, /* 0xB0 */
+ 0xDDA5, 0xDDE8, 0, 0, 0xD0EE, 0, 0, 0, /* 0xC0 */
+ 0, 0xC8D8, 0xDDEE, 0xB8C7, 0, 0xDDE9, 0, 0, /* 0xC0 */
+ 0xDDEA, 0xCBF2, 0, 0xDDED, 0, 0, 0xB1CD, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xC5EE, 0, 0xC1AB, 0xDCCA, /* 0xE0 */
+ 0xDDFB, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xDEA4, 0xDCEA, 0, 0xDEA3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xDDF8, 0, 0, 0, /* 0x00 */
+ 0, 0xC3EF, 0, 0xC2FB, 0xF8A5, 0, 0, 0xD5E1, /* 0x10 */
+ 0, 0, 0xCEB5, 0, 0, 0, 0xDDE4, 0xDDFD, /* 0x10 */
+ 0, 0xB2CC, 0, 0xBDAF, 0, 0, 0xDCE0, 0, /* 0x20 */
+ 0, 0, 0, 0xC4E8, 0xCADF, 0xD2F1, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xDDFA, 0, 0, 0xDEA2, 0, 0xB1CE, 0, 0, /* 0x30 */
+ 0, 0xDDA1, 0, 0xDEAC, 0, 0, 0xDDDB, 0, /* 0x40 */
+ 0xDEA6, 0xBDB6, 0xC8EF, 0, 0, 0, 0xDCF1, 0, /* 0x40 */
+ 0, 0, 0xDDA4, 0xDCBF, 0, 0xDDB5, 0xDEA1, 0, /* 0x50 */
+ 0xDCE9, 0xDEA5, 0, 0, 0, 0, 0xDEA9, 0, /* 0x50 */
+ 0, 0, 0xDDDE, 0, 0xDEA8, 0, 0, 0, /* 0x60 */
+ 0xDEA7, 0xB5B4, 0xCEDF, 0, 0, 0xCFF4, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDDF7, /* 0x70 */
+ 0, 0xDEB3, 0xDEAA, 0xDEAE, 0, 0, 0xC0D9, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xB1A1, 0xDEB6, 0, 0xDEB1, /* 0x80 */
+ 0xDCF6, 0, 0xBCBB, 0, 0xDCBC, 0, 0, 0xDEB2, /* 0x80 */
+ 0, 0xF8C4, 0, 0, 0xC7BE, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xD1A6, 0xDEB5, 0, 0, 0xDDB2, /* 0x90 */
+ 0, 0, 0, 0, 0xDEAF, 0, 0xBCF6, 0, /* 0xA0 */
+ 0xDEB0, 0xC8F8, 0xD0BD, 0, 0, 0, 0, 0xCAED, /* 0xA0 */
+ 0xDEB9, 0, 0, 0, 0, 0, 0, 0xDEB8, /* 0xB0 */
+ 0, 0xDEB7, 0xDCF9, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xDEBB, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xBDE5, 0, 0, 0, 0xC0B6, 0xDDA3, 0xB2D8, /* 0xC0 */
+ 0xC3EA, 0, 0, 0, 0, 0xC5BA, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xDEBC, 0xD2D5, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xCCD9, 0xD2A9, 0, 0, /* 0xE0 */
+ 0, 0xB7AA, 0xDEB4, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xD4CC, 0, 0xDCC2, 0, /* 0xF0 */
+ 0, 0xB0AA, 0xDDFE, 0xD4E5, 0, 0, 0, 0xDEBD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDEAD, 0xDEBF, 0xC2AB, 0xCBD5, /* 0x00 */
+ 0, 0, 0, 0xC6BB, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xC4A2, 0, 0, 0, 0, 0xDEC1, 0, /* 0x10 */
+ 0, 0, 0xDEBA, 0, 0, 0, 0xDDFC, 0, /* 0x10 */
+ 0, 0, 0xDCD7, 0, 0, 0, 0, 0xDEBE, /* 0x20 */
+ 0, 0xDEC0, 0, 0, 0, 0xC0BC, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xD5BA, 0, 0xDDF1, 0, 0xDEC2, 0, 0, 0xC2DC, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF2AE, 0xBBA2, 0, /* 0x40 */
+ 0xC5B0, 0, 0, 0, 0xF2AF, 0xB4A6, 0, 0, /* 0x50 */
+ 0, 0, 0xD0E9, 0, 0xC2B2, 0, 0xD3DD, 0xBAC5, /* 0x50 */
+ 0, 0, 0xEBBD, 0, 0, 0, 0, 0xBFF7, /* 0x60 */
+ 0, 0, 0, 0, 0xF2B0, 0, 0, 0, /* 0x60 */
+ 0, 0xCAAD, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xBAE7, 0xF2B3, 0xF2B5, 0xF2B4, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xCEC3, 0xF2B8, 0xB0F6, 0xF2B7, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF2BE, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xD1C1, 0xF2BA, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xF2BC, 0xD4E9, 0, 0, 0xF2BB, /* 0xA0 */
+ 0xF2B6, 0xF2BF, 0xF2BD, 0, 0, 0, 0, 0xF2C7, /* 0xA0 */
+ 0xF2C4, 0xF2C6, 0, 0, 0xF2CA, 0xF2C2, 0xF2C0, 0, /* 0xB0 */
+ 0, 0, 0xF2C5, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xD6FB, 0, 0, 0, 0xF2C1, 0, 0xC7F9, 0xC9DF, /* 0xC0 */
+ 0, 0xF2C8, 0, 0xB5B0, 0, 0, 0, 0, /* 0xC0 */
+ 0xF2D0, 0xF2D6, 0, 0, 0xBBD7, 0, 0, 0, /* 0xD0 */
+ 0xF2D5, 0xCDDC, 0, 0xD6EB, 0, 0, 0xF2D2, 0xF2D4, /* 0xD0 */
+ 0, 0, 0, 0, 0xB8F2, 0, 0, 0, /* 0xE0 */
+ 0, 0xF2CB, 0, 0, 0, 0xF2CE, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xF2D9, 0xD3BC, 0xF2CC, 0, 0, 0, 0xB6EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCAF1, 0, 0xB7E4, 0xF2D7, 0, 0, 0xF2B9, 0xF2D8, /* 0x00 */
+ 0xF2DA, 0xF2DD, 0xF2DB, 0, 0, 0xF2DC, 0, 0, /* 0x00 */
+ 0, 0, 0xD1D1, 0xF2D1, 0, 0xCDC9, 0, 0, /* 0x10 */
+ 0xD6A9, 0, 0xF2E3, 0, 0xC3DB, 0, 0xF2E0, 0, /* 0x10 */
+ 0, 0xF8CB, 0xF2EC, 0xF2DE, 0, 0xF2E1, 0, 0, /* 0x20 */
+ 0, 0xF2E8, 0, 0, 0, 0, 0xF2E2, 0, /* 0x20 */
+ 0, 0xF2E7, 0, 0, 0xF2E6, 0, 0, 0xF2E9, /* 0x30 */
+ 0, 0, 0, 0xF2DF, 0, 0, 0xF2E4, 0xF2EA, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xF2F2, 0, 0xD0AB, 0, /* 0x40 */
+ 0, 0, 0, 0xF2F5, 0, 0xCAB4, 0, 0xBBC8, /* 0x50 */
+ 0, 0xF2F9, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xF2F0, 0, 0, 0xF2F6, 0xF2F8, 0xF2FA, 0xCFBA, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xF2F3, 0, /* 0x60 */
+ 0xF2F1, 0, 0, 0, 0xBAFB, 0, 0xB5FB, 0, /* 0x70 */
+ 0xCECF, 0, 0, 0xF2EF, 0, 0xF2ED, 0, 0, /* 0x70 */
+ 0, 0, 0xF2EB, 0xF3A6, 0xF2CF, 0xF3A3, 0, 0, /* 0x80 */
+ 0xF3A2, 0, 0, 0xF2F4, 0, 0xC8DA, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF2FB, 0, 0, 0, 0xF3A5, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xC2EC, 0xC3F8, /* 0x90 */
+ 0, 0, 0xD3A9, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xF3A7, 0xF3A9, 0xF3A4, 0, 0xF2FC, /* 0xA0 */
+ 0, 0, 0, 0xF3AB, 0, 0xF3AA, 0, 0, /* 0xB0 */
+ 0, 0, 0xC2DD, 0xF2F7, 0, 0xF3AE, 0, 0, /* 0xB0 */
+ 0xF3B0, 0, 0, 0, 0xD5DD, 0, 0xF3A1, 0, /* 0xC0 */
+ 0xF2E5, 0, 0xF3B1, 0xF3AC, 0, 0, 0xF2FD, 0, /* 0xC0 */
+ 0, 0xF3AF, 0xF2FE, 0xF3AD, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xF3B2, 0, 0, 0, 0, /* 0xD0 */
+ 0xF3B4, 0, 0, 0xF2B1, 0, 0xF3A8, 0, 0, /* 0xE0 */
+ 0, 0, 0xF3B3, 0, 0xB2F5, 0, 0xF3B5, 0xF2CD, /* 0xE0 */
+ 0, 0, 0xB3E6, 0, 0, 0, 0xF2C9, 0, /* 0xF0 */
+ 0, 0xD0B7, 0, 0xD2CF, 0, 0, 0xF3B8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD9F9, 0, 0xD3AC, 0xF2B2, 0, /* 0x00 */
+ 0, 0, 0xF3B9, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xF2D3, 0xF2EE, 0, 0xF3B7, 0, 0xC8E4, 0xF3B6, 0, /* 0x10 */
+ 0, 0, 0, 0xF3BA, 0, 0, 0, 0xC0AF, /* 0x10 */
+ 0, 0xF3BB, 0xB4C0, 0xF2C3, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xB9C6, 0xEEC3, 0, 0, 0, 0xB2CF, 0, /* 0x30 */
+ 0, 0xF3BC, 0, 0xC2F9, 0xF3BD, 0, 0, 0, /* 0x30 */
+ 0xD1AA, 0, 0, 0, 0xF4AC, 0, 0xD6DA, 0, /* 0x40 */
+ 0, 0, 0xF8DA, 0, 0xD0D0, 0xD1DC, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xCAF5, 0, 0, 0, 0xBDD6, /* 0x50 */
+ 0, 0xD1C3, 0, 0xCEC0, 0, 0xB3E5, 0, 0, /* 0x50 */
+ 0, 0xBAE2, 0xE1E9, 0xD2C2, 0xF1C2, 0, 0, 0, /* 0x60 */
+ 0xB1ED, 0xF1C3, 0, 0xC9C0, 0, 0, 0xD9F2, 0, /* 0x60 */
+ 0xCBA5, 0, 0xF1C4, 0, 0, 0, 0, 0xD6D4, /* 0x70 */
+ 0, 0xD6BB, 0, 0, 0, 0xF1C5, 0xF4C0, 0xF1C6, /* 0x70 */
+ 0, 0xD4AC, 0xF1C7, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xF4C2, 0, 0, 0xB4FC, 0, 0xC5DB, 0, 0, /* 0x80 */
+ 0, 0, 0xCCBB, 0, 0, 0, 0xD0E4, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xF1C8, 0, 0xD9F3, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xB1BB, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xB8A4, 0, 0, 0, 0, 0, 0xF1CA, /* 0xB0 */
+ 0, 0, 0, 0, 0xF1CB, 0, 0, 0, /* 0xB0 */
+ 0, 0xB2C3, 0xC1D1, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF1CC, 0xF4C1, 0, 0, 0, 0xF1CE, 0xC0EF, /* 0xC0 */
+ 0, 0, 0xD9F6, 0, 0xD2E1, 0xD4A3, 0, 0, /* 0xD0 */
+ 0xF4C3, 0xC8B9, 0, 0, 0xB2B9, 0xD7B0, 0, 0xF4C4, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF1D4, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xF1D6, 0xF1D1, 0, 0xC9D1, 0xC5E1, 0, 0, 0, /* 0xF0 */
+ 0xC2E3, 0xB9FC, 0, 0, 0xF1D3, 0xF9A5, 0xF1D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB9D3, 0, 0, 0, 0, 0xF8B4, /* 0x00 */
+ 0, 0, 0xF1DB, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xBAD6, 0, 0xB0FD, 0xF1D9, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF1D8, 0xF1D2, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF1D7, 0, 0, 0, 0xC8EC, 0, 0, /* 0x20 */
+ 0, 0, 0xCDCA, 0xF1DD, 0, 0, 0, 0, /* 0x20 */
+ 0xE5BD, 0, 0xBFE3, 0xF1CD, 0, 0, 0xF1DE, 0, /* 0x30 */
+ 0xF1DA, 0, 0, 0xD9F4, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xF1DF, 0, 0, 0xCFE5, 0, 0, 0xF1D0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xB0C0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xF1CF, 0xF4C5, 0xBDF3, /* 0x50 */
+ 0xF1C9, 0, 0, 0, 0xF1DC, 0, 0xF1E0, 0, /* 0x60 */
+ 0, 0, 0xCDE0, 0, 0xF8A1, 0, 0, 0xB3C4, /* 0x60 */
+ 0, 0, 0xCFAE, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0xF1E1, 0, 0, 0, 0xCEF7, /* 0x70 */
+ 0, 0xD2AA, 0, 0xF1FB, 0, 0, 0xB8B2, 0, /* 0x80 */
+ 0, 0, 0, 0xBCFB, 0, 0, 0, 0xB9E6, /* 0x80 */
+ 0, 0, 0, 0xC3D9, 0, 0, 0xCAD3, 0, /* 0x90 */
+ 0xEAE8, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xEAEA, 0, 0, 0, 0, 0xEAEC, 0, /* 0xA0 */
+ 0, 0, 0xC7D7, 0, 0xEAE9, 0, 0, 0xEAED, /* 0xA0 */
+ 0, 0, 0xEAEE, 0, 0, 0, 0, 0xEAEF, /* 0xB0 */
+ 0, 0, 0xBEF5, 0, 0, 0xC0C0, 0, 0xEAEB, /* 0xB0 */
+ 0xB9DB, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xBDC7, 0, 0, 0, 0xF5FB, 0, /* 0xD0 */
+ 0, 0, 0xF5FD, 0, 0xF5FE, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xBDE2, 0, 0xF6A1, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xF6A2, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xECB2, 0xF5FC, 0, 0xF6A3, 0, /* 0xF0 */
+ 0xB4A5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1D4, 0xDAA5, 0xB6A9, 0xB8BC, 0, 0, 0, 0xD9EA, /* 0x00 */
+ 0xBCC6, 0, 0xD1B6, 0, 0xDAA7, 0, 0xCCD6, 0, /* 0x00 */
+ 0xDAA6, 0, 0, 0xD1B5, 0, 0xDAA8, 0xC6FD, 0, /* 0x10 */
+ 0xBCC7, 0, 0, 0xB6EF, 0, 0xD1C8, 0, 0xCBCF, /* 0x10 */
+ 0, 0, 0, 0xBEF7, 0, 0xDAAB, 0, 0, /* 0x20 */
+ 0, 0, 0xB7C3, 0, 0, 0xC9E8, 0, 0, /* 0x20 */
+ 0, 0xD0ED, 0, 0, 0xCBDF, 0, 0xDAAD, 0, /* 0x30 */
+ 0, 0, 0xD5EF, 0, 0, 0, 0xF6A4, 0, /* 0x30 */
+ 0, 0xDAAC, 0, 0, 0, 0, 0xDAAE, 0, /* 0x40 */
+ 0xEEBA, 0, 0, 0, 0, 0, 0xDAAA, 0, /* 0x40 */
+ 0xD5A9, 0, 0xDAB1, 0, 0xDAAF, 0xC6C0, 0, 0, /* 0x50 */
+ 0xDAB0, 0, 0, 0xD7E7, 0, 0, 0xB4CA, 0, /* 0x50 */
+ 0, 0xDABC, 0xD1AF, 0xD2E8, 0, 0, 0xCAD4, 0, /* 0x60 */
+ 0, 0xCAAB, 0, 0xB2EF, 0xDAB8, 0xB9EE, 0xDAB9, 0, /* 0x60 */
+ 0xDAB5, 0xBBB0, 0xB8C3, 0xCFEA, 0, 0xDAB7, 0, 0, /* 0x70 */
+ 0, 0xD5B2, 0, 0, 0xDAB6, 0, 0, 0xDAB4, /* 0x70 */
+ 0, 0, 0, 0, 0xDAB3, 0xD6EF, 0xDAB2, 0xBFE4, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xC8CF, 0, 0, /* 0x80 */
+ 0, 0xDABF, 0xDAC0, 0xCAC4, 0, 0xB5AE, 0, 0, /* 0x90 */
+ 0xD3D5, 0, 0xDABD, 0, 0, 0, 0xD3EF, 0, /* 0x90 */
+ 0xB3CF, 0xBDEB, 0, 0xCEDC, 0xCEF3, 0xDABE, 0xCBD0, 0, /* 0xA0 */
+ 0xBBE5, 0, 0, 0, 0xCBB5, 0, 0, 0, /* 0xA0 */
+ 0xCBAD, 0, 0xBFCE, 0, 0, 0, 0xDAC7, 0, /* 0xB0 */
+ 0, 0xB7CC, 0, 0, 0xD2EA, 0, 0, 0xB5F7, /* 0xB0 */
+ 0, 0, 0xDAC6, 0, 0xD7BB, 0, 0, 0xCCB8, /* 0xC0 */
+ 0, 0xDAC3, 0, 0xC7EB, 0, 0xDABA, 0, 0xDAC1, /* 0xC0 */
+ 0, 0xDAC2, 0xC1C2, 0, 0, 0, 0xC2DB, 0xDAC5, /* 0xD0 */
+ 0, 0, 0, 0xDAC4, 0xB5FD, 0, 0xDAD2, 0, /* 0xD0 */
+ 0, 0, 0xDABB, 0, 0xDACC, 0, 0xDAD0, 0xD0B3, /* 0xE0 */
+ 0, 0, 0, 0xDAC9, 0, 0xDACD, 0xDAD1, 0, /* 0xE0 */
+ 0, 0xBBE4, 0, 0xDACF, 0, 0, 0xDAC8, 0xB7ED, /* 0xF0 */
+ 0xD6EE, 0, 0xD1E8, 0, 0xDACE, 0, 0xC5B5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC4B1, 0xDACB, 0xCEBD, 0, 0xCCDC, 0xD6DF, 0, 0xE5C0, /* 0x00 */
+ 0, 0, 0xBBD1, 0, 0, 0, 0xC3D5, 0, /* 0x00 */
+ 0xDAD7, 0, 0, 0, 0xDACA, 0, 0xDAD5, 0xB0F9, /* 0x10 */
+ 0, 0xC7AB, 0xDAD6, 0xBDB2, 0, 0xD0BB, 0, 0, /* 0x10 */
+ 0, 0xD2A5, 0, 0, 0, 0, 0xF6A5, 0, /* 0x20 */
+ 0xDAD3, 0, 0, 0xDAD8, 0xC3FD, 0xDAD9, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xDAA9, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xBDF7, 0, 0, 0, 0, 0xC3A1, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xD6A4, 0, 0, 0, 0, 0xDADC, 0xBCA5, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xDADA, 0, /* 0x50 */
+ 0xCAB6, 0xDADB, 0xCCB7, 0, 0xC6D7, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0xBEAF, 0, /* 0x60 */
+ 0, 0, 0, 0xDADE, 0xC6A9, 0, 0, 0xD2EB, /* 0x60 */
+ 0xD2E9, 0, 0, 0, 0xC7B4, 0, 0, 0xBBA4, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xD3FE, 0, 0, /* 0x70 */
+ 0xB6C1, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xB1E4, 0, 0, 0, 0xF6C5, 0, /* 0x80 */
+ 0, 0, 0xB2F7, 0xC8C3, 0, 0xC0BE, 0xDADF, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xDAD4, 0, 0xDADD /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB9C8, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xBBED, 0, 0, 0, 0, 0xB6B9, 0xF4F8, /* 0x40 */
+ 0xC6F1, 0xF4F9, 0, 0, 0xCDE3, 0, 0, 0, /* 0x40 */
+ 0xB7E1, 0, 0, 0, 0, 0xF5B9, 0, 0, /* 0x50 */
+ 0, 0, 0xEBE0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xCFF3, 0xBBBF, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xBAC0, 0xD4A5, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xE1D9, 0, 0, 0, 0, /* 0x70 */
+ 0xF5F4, 0xB1AA, 0xB2F2, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xF5F5, 0, 0, 0xF5F7, 0, 0, /* 0x80 */
+ 0, 0xBAD1, 0xF5F6, 0, 0xC3B2, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xF5F9, 0, 0, 0, /* 0x90 */
+ 0xF5F8, 0, 0, 0, 0, 0xB1B4, 0xD5EA, 0, /* 0x90 */
+ 0xB8BA, 0xB2C6, 0xB9B1, 0, 0, 0, 0, 0xC6B6, /* 0xA0 */
+ 0xBBF5, 0xB7B7, 0xCCB0, 0xB9E1, 0xD4F0, 0, 0, 0xD6FC, /* 0xA0 */
+ 0xEADB, 0, 0xEADF, 0xB7A1, 0xB9F3, 0, 0xB1E1, 0xC2F2, /* 0xB0 */
+ 0xB4FB, 0, 0xEADC, 0xB7D1, 0xCCF9, 0xEADD, 0, 0xC3B3, /* 0xB0 */
+ 0xBAD8, 0xEADA, 0xC2B8, 0xC1DE, 0xBBDF, 0xEAE0, 0, 0xD7CA, /* 0xC0 */
+ 0xBCD6, 0, 0xD4F4, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xEAE2, 0xC9DE, 0xB1F6, 0, 0xEAE4, 0, 0, /* 0xD0 */
+ 0, 0, 0xEAE3, 0, 0xB4CD, 0, 0xC9CD, 0, /* 0xD0 */
+ 0xC5E2, 0xE2D9, 0xCFCD, 0xC2F4, 0xBCFA, 0, 0xB8B3, 0xEAE6, /* 0xE0 */
+ 0, 0, 0xD6CA, 0xEAE5, 0xD5CB, 0xB6C4, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xC0B5, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xD7AC, 0xEAE7, 0xB9BA, 0xC8FC, 0xD8D3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEADE, 0xD7B8, 0, 0, /* 0x00 */
+ 0xD4F9, 0, 0xD4DE, 0xD8CD, 0, 0xC9C4, 0, 0xD3AE, /* 0x00 */
+ 0xEAE1, 0, 0, 0, 0, 0, 0xCAEA, 0, /* 0x10 */
+ 0, 0, 0, 0xB8D3, 0xD4DF, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xB3E0, 0, 0xC9E2, 0xF4F6, /* 0x60 */
+ 0, 0, 0, 0xBAD5, 0, 0xF4F7, 0, 0, /* 0x60 */
+ 0xD7DF, 0, 0, 0xF4F1, 0xB8B0, 0, 0, 0xC6F0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB3C3, 0, 0, 0xF4F2, 0xB3AC, 0, 0, /* 0x80 */
+ 0, 0, 0xD4BD, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xF4F4, 0, 0, 0xF4F3, 0xB8CF, 0, 0, /* 0x90 */
+ 0, 0xD5D4, 0, 0, 0, 0, 0, 0xCCCB, /* 0x90 */
+ 0, 0, 0, 0xC8A4, 0, 0, 0, 0, /* 0xA0 */
+ 0xC7F7, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xF4F5, 0xD7E3, 0xC5BF, 0xF5C0, 0, 0, /* 0xB0 */
+ 0, 0, 0xF5C3, 0, 0xF5C2, 0, 0xD6BA, 0xF5C1, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xF5CC, 0, /* 0xC0 */
+ 0, 0, 0, 0xB0CF, 0xB5F8, 0, 0xF5C9, 0xF5CA, /* 0xC0 */
+ 0, 0xC5DC, 0, 0, 0, 0, 0xF5C5, 0xF5C6, /* 0xD0 */
+ 0, 0, 0xF5C7, 0xF5CB, 0, 0xBEE0, 0, 0xB8FA, /* 0xD0 */
+ 0, 0, 0, 0xF5D0, 0xF5D3, 0, 0, 0, /* 0xE0 */
+ 0xBFE7, 0, 0xB9F2, 0xF5BC, 0xF5CD, 0, 0, 0xC2B7, /* 0xE0 */
+ 0, 0, 0, 0xCCF8, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xB6E5, 0, 0, 0xF5D5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5BD, 0, 0, /* 0x00 */
+ 0, 0xF5D4, 0, 0, 0, 0, 0, 0xCCA4, /* 0x00 */
+ 0xBCF9, 0, 0, 0, 0xF5D6, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xF5D7, 0xBEE1, 0xF5D8, /* 0x10 */
+ 0, 0, 0xCCDF, 0xF5DB, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xB2C8, 0xD7D9, 0, 0, 0, 0xF5DA, 0, /* 0x20 */
+ 0, 0xF5E2, 0, 0, 0xD3BB, 0xF5E0, 0, 0, /* 0x30 */
+ 0, 0xF5DF, 0xF5DD, 0, 0, 0xF5E1, 0, 0, /* 0x30 */
+ 0xF5DE, 0xF5E4, 0xF5E5, 0, 0xCCE3, 0, 0, 0xE5BF, /* 0x40 */
+ 0xB5B8, 0xF5E3, 0xF5E8, 0xCCA3, 0xF5C4, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xF5CF, 0, 0, /* 0x50 */
+ 0, 0xF5BE, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xF5E7, 0, 0, 0xB1C4, 0, /* 0x60 */
+ 0, 0xF5BF, 0, 0, 0xB5C5, 0xB2E4, 0, 0xF5EC, /* 0x60 */
+ 0xF5E9, 0, 0xB6D7, 0, 0xF5ED, 0, 0xF5EA, 0, /* 0x70 */
+ 0, 0, 0xF5CE, 0, 0xF5EB, 0, 0, 0, /* 0x70 */
+ 0, 0xD4EA, 0, 0, 0, 0xF5EE, 0, 0xB3F9, /* 0x80 */
+ 0, 0xF5BB, 0xB3EC, 0xF5D2, 0, 0xD4BE, 0, 0, /* 0x80 */
+ 0xF5F1, 0xF5DC, 0xF5C8, 0xF5D9, 0xF5F0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xF5D1, 0, 0, 0, 0xF5F3, 0, /* 0x90 */
+ 0, 0xF5E6, 0, 0, 0, 0xB4DA, 0xF5F2, 0, /* 0xA0 */
+ 0, 0, 0xF5EF, 0xC9ED, 0xB9AA, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xB6E3, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xCCC9, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xC7FB, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xB3B5, 0xD4FE, 0xB9EC, 0xBEFC, 0xEAA6, 0, /* 0xC0 */
+ 0, 0, 0xD0F9, 0, 0xE9ED, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xE9EE, 0, 0, 0, 0xC8ED, /* 0xD0 */
+ 0, 0, 0, 0, 0xE9F5, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE9F4, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0xE9EF, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0xD6E1, 0xE9F2, 0xE9F7, 0xE9F0, 0xE9F3, 0, 0xE9F8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDCF, 0, 0xE9FB, 0, 0xE9FA, /* 0x00 */
+ 0, 0xD4D8, 0xE9F9, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xE9FC, 0, 0xB8A8, 0xC7E1, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xC1BE, 0xEAA2, 0xBBD4, 0xE9FE, 0xEAA1, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xB9F5, 0xE9FD, 0, /* 0x20 */
+ 0, 0xB1B2, 0xC2D6, 0, 0, 0, 0, 0xBCAD, /* 0x20 */
+ 0, 0, 0, 0xEAA3, 0, 0, 0, 0, /* 0x30 */
+ 0xCAE4, 0, 0, 0xB7F8, 0, 0, 0xD5B7, 0xD3DF, /* 0x30 */
+ 0, 0, 0xECB1, 0, 0xCFBD, 0xD4AF, 0xEAA4, 0, /* 0x40 */
+ 0, 0xD7AA, 0, 0, 0, 0xD5DE, 0xBDCE, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xEAA5, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xBAE4, /* 0x50 */
+ 0, 0xE0CE, 0xE9F6, 0, 0xE9F1, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xD0C1, 0xB9BC, 0, 0, 0xB1D9, /* 0x90 */
+ 0, 0, 0, 0xC0B1, 0, 0, 0xB0EC, 0, /* 0xA0 */
+ 0xB1E6, 0, 0, 0, 0, 0xB4C7, 0xB1E8, 0xB1E7, /* 0xA0 */
+ 0xB3BD, 0xC8E8, 0xC5A9, 0, 0, 0, 0xE5C1, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xD3D8, 0, 0xC6F9, 0xD1B8, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xD3AD, 0, /* 0xC0 */
+ 0, 0xBDFC, 0, 0xE5C2, 0xB7B5, 0xE5C3, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xCCF6, 0, 0xE5C6, 0xE5C4, 0xE5C8, 0, /* 0xE0 */
+ 0xE5CA, 0, 0xB5CF, 0xC6C8, 0, 0xB5FC, 0xE5C5, 0, /* 0xE0 */
+ 0xCAF6, 0, 0, 0, 0xF8BC, 0, 0, 0xC3D4, /* 0xF0 */
+ 0xB1C5, 0xBCA3, 0, 0, 0, 0xD7B7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCDCB, 0xCBCD, 0, 0xCCD3, 0xE5CC, 0xE5CB, 0xC4E6, 0, /* 0x00 */
+ 0, 0, 0, 0xE5CD, 0, 0xE5D0, 0, 0xCDB8, /* 0x00 */
+ 0xD6F0, 0xE5CF, 0, 0, 0xCDBE, 0xE5C9, 0xE5D1, 0xB6BA, /* 0x10 */
+ 0, 0xD5E2, 0xCDA8, 0xB9E4, 0, 0xCAC5, 0xB3D1, 0xCBD9, /* 0x10 */
+ 0xD4EC, 0xE5D2, 0xB7EA, 0xC1AC, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE5D5, 0xB4FE, 0xE5D6, /* 0x20 */
+ 0, 0, 0xBDF8, 0, 0, 0xE5D3, 0xE5D4, 0, /* 0x30 */
+ 0xD2DD, 0, 0, 0, 0xB1C6, 0, 0xD3E2, 0, /* 0x30 */
+ 0, 0xB6DD, 0xCBEC, 0, 0xE5D7, 0, 0, 0xD3F6, /* 0x40 */
+ 0, 0, 0, 0xD4CB, 0, 0xB1E9, 0xB9FD, 0xB6F4, /* 0x40 */
+ 0xE5DA, 0xE5D8, 0xE5D9, 0xB5C0, 0xB4EF, 0xCEA5, 0, 0, /* 0x50 */
+ 0xE5DC, 0, 0, 0xE5DE, 0xD1B7, 0, 0xB5DD, 0, /* 0x50 */
+ 0xD4B6, 0, 0xE5DD, 0xC7B2, 0, 0xD2A3, 0, 0, /* 0x60 */
+ 0xE5DB, 0xCACA, 0, 0, 0, 0xD4E2, 0xD5DA, 0, /* 0x60 */
+ 0, 0, 0xB3D9, 0, 0xE5E0, 0xD7F1, 0, 0xC7A8, /* 0x70 */
+ 0xD1A1, 0, 0xD2C5, 0, 0xC1C9, 0xE5E1, 0, 0xB1DC, /* 0x70 */
+ 0xD1FB, 0xC2F5, 0xE5E2, 0xE5E4, 0xBBB9, 0, 0, 0xE5C7, /* 0x80 */
+ 0xE5E3, 0, 0xB1DF, 0xE5E5, 0, 0, 0, 0xC2DF, /* 0x80 */
+ 0xE5CE, 0xD2D8, 0, 0, 0, 0xE7DF, 0, 0xDAF5, /* 0x90 */
+ 0, 0xDAF8, 0, 0xDAF6, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xDAFA, 0xD0CF, 0xC4C7, 0, 0, 0xB0EE, 0, /* 0xA0 */
+ 0, 0, 0xD0B0, 0, 0, 0, 0, 0xBAAA, /* 0xA0 */
+ 0xDBA2, 0xC7F1, 0, 0xDAFC, 0xDAFB, 0xC9DB, 0xDAFD, 0, /* 0xB0 */
+ 0xDBA1, 0, 0, 0, 0, 0, 0xDBA5, 0, /* 0xB0 */
+ 0, 0xF8F9, 0, 0, 0xDBA7, 0xDBA4, 0, 0xDBA8, /* 0xC0 */
+ 0, 0, 0xBDBC, 0, 0, 0, 0xC0C9, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xDBAD, /* 0xD0 */
+ 0, 0, 0, 0xDBAE, 0xDBAC, 0xBAC2, 0, 0xDBA3, /* 0xD0 */
+ 0, 0xBFA4, 0xDBAB, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xB2BF, 0, 0, 0xDBAF, 0, 0xB9F9, 0, 0xDBB0, /* 0xE0 */
+ 0, 0, 0, 0, 0xB3BB, 0xD3CA, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xB6BC, 0xDBB1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB6F5, 0, 0xDBB2, 0, 0xDBA9, 0, /* 0x00 */
+ 0, 0xCFE7, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0xD7DE, 0, 0xDAF9, 0, 0xD4C7, 0, /* 0x10 */
+ 0, 0xB1C9, 0, 0, 0, 0, 0xDBB4, 0, /* 0x10 */
+ 0, 0, 0xDBB3, 0xDBB5, 0, 0, 0, 0xB5CB, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xD6A3, 0, 0xDBB7, /* 0x20 */
+ 0xC1DA, 0xDBB6, 0xB5A6, 0, 0xDAFE, 0, 0xDBA6, 0, /* 0x30 */
+ 0, 0xDBB8, 0xDAF7, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xDBB9, 0, 0, 0xDBBA, 0, /* 0x40 */
+ 0xDBAA, 0xD3CF, 0xF4FA, 0xC7F5, 0xD7C3, 0xC5E4, 0xF4FC, 0xF4FD, /* 0x40 */
+ 0xF4FB, 0, 0xBEC6, 0, 0, 0, 0, 0xD0EF, /* 0x50 */
+ 0, 0, 0xB7D3, 0, 0, 0, 0xCCAA, 0, /* 0x50 */
+ 0, 0xF5A2, 0xF5A1, 0xBAA8, 0xF4FE, 0xCBD6, 0, 0, /* 0x60 */
+ 0, 0xF5A4, 0xC0D2, 0, 0xB3EA, 0, 0xCDAA, 0xF5A5, /* 0x60 */
+ 0xF5A3, 0, 0xF5A8, 0, 0xF5A9, 0xBDCD, 0xC3B8, 0xBFE1, /* 0x70 */
+ 0xCBE1, 0xF5AA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF5AC, 0, 0xB4BC, /* 0x80 */
+ 0, 0xD7ED, 0, 0xB4D7, 0xF5AB, 0xF5AE, 0, 0, /* 0x80 */
+ 0xF5AD, 0xF5AF, 0xD0D1, 0, 0, 0, 0xD4CD, 0, /* 0x90 */
+ 0, 0, 0xC3D1, 0xC8A9, 0xB3F3, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xF5B0, 0xF5B1, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xF5B2, 0xD2BD, 0xBDB4, 0xF5B3, 0xF5B4, 0xF5B5, /* 0xA0 */
+ 0, 0, 0, 0, 0xF5B7, 0xF5B6, 0, 0, /* 0xB0 */
+ 0, 0, 0xF5B8, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xC4F0, 0xD0C6, 0, 0xF5A7, 0, 0xF5A6, 0, 0xB2C9, /* 0xC0 */
+ 0, 0xD3D4, 0, 0xCACD, 0xF8CE, 0xD6D8, 0xD2B0, 0xC1BF, /* 0xC0 */
+ 0, 0xBDF0, 0xEEC4, 0xEEC5, 0xEEC6, 0xEEC9, 0, 0xEEC8, /* 0xD0 */
+ 0xB6A4, 0xEEC7, 0, 0, 0xB8AA, 0xD5EB, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xB5F6, 0xEECC, 0, 0, 0xEECB, /* 0xE0 */
+ 0, 0xB7B0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xEECE, 0, 0xEECA, /* 0xF0 */
+ 0, 0xEECF, 0xC7A5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEED9, 0xEED5, 0, 0, 0xEED7, 0, 0, 0, /* 0x00 */
+ 0xEED0, 0xC4C6, 0, 0, 0, 0xB6DB, 0xB9B3, 0, /* 0x00 */
+ 0xEED4, 0xEED3, 0, 0, 0xB3AE, 0xC5A5, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xBEFB, 0, /* 0x10 */
+ 0, 0, 0, 0xB8C6, 0, 0xEED8, 0xEED1, 0xEED6, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0xEEEA, 0, /* 0x20 */
+ 0xEEE6, 0, 0, 0xEEDD, 0xC1E5, 0, 0, 0xEEDC, /* 0x30 */
+ 0xEEE0, 0xEEEB, 0xEEDA, 0, 0, 0xEEDF, 0xD3CB, 0xEEE4, /* 0x30 */
+ 0xBCD8, 0, 0, 0, 0, 0xEED2, 0, 0, /* 0x40 */
+ 0xEEE8, 0xEEE7, 0, 0, 0, 0xEEE9, 0, 0, /* 0x40 */
+ 0, 0xB2AC, 0, 0, 0, 0xEEDE, 0, 0xC7AF, /* 0x50 */
+ 0, 0, 0xC3AD, 0xC7A6, 0, 0, 0xEEE1, 0, /* 0x50 */
+ 0, 0, 0xB2A7, 0, 0, 0, 0xEEDB, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xEEE2, 0xEEE3, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xBDC2, 0, 0xEEEF, 0xB8F5, 0, 0, 0, 0xEEFE, /* 0x70 */
+ 0xD2F8, 0, 0, 0xEFA5, 0, 0xCDAD, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xF6C6, 0, /* 0x80 */
+ 0, 0xCFB3, 0, 0xEEFD, 0, 0, 0xEEF9, 0, /* 0x90 */
+ 0xC3FA, 0, 0xEFA2, 0, 0xCFCE, 0, 0, 0, /* 0x90 */
+ 0xEEEE, 0, 0, 0xEFA8, 0, 0xD2BF, 0xEEF7, 0, /* 0xA0 */
+ 0xEFA7, 0xEEFB, 0xEEF0, 0xEFA4, 0xEEED, 0, 0, 0, /* 0xA0 */
+ 0, 0xEEF6, 0, 0, 0, 0, 0, 0xCFFA, /* 0xB0 */
+ 0, 0xD0E2, 0, 0xCCE0, 0xEFB1, 0, 0, 0, /* 0xB0 */
+ 0, 0xC2C1, 0, 0xEFB6, 0, 0xD0BF, 0, 0xB1B5, /* 0xC0 */
+ 0xF6C8, 0, 0, 0, 0xEEFA, 0, 0, 0xEEF2, /* 0xC0 */
+ 0, 0, 0xB7E6, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xEFB2, 0, 0xEFB7, /* 0xD0 */
+ 0, 0, 0, 0xEEF4, 0xB3FA, 0xEFAD, 0xEFB8, 0, /* 0xE0 */
+ 0xEFB0, 0, 0xC6CC, 0, 0, 0xC8F1, 0xEEF1, 0xEFAF, /* 0xE0 */
+ 0xEFAE, 0xEFAB, 0, 0, 0, 0, 0xEFB3, 0, /* 0xF0 */
+ 0xBEE2, 0, 0, 0, 0xB8D6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEFBE, 0, 0, 0, 0, 0xEFBA, 0xEFC2, /* 0x00 */
+ 0xEFC3, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xD7B6, 0, 0xEFB9, 0, 0, 0xEFBF, 0, 0, /* 0x10 */
+ 0xB4B8, 0xEFC5, 0xEFA3, 0xEFBC, 0, 0, 0, 0xEFC4, /* 0x10 */
+ 0xB6A7, 0, 0xC7AE, 0, 0, 0, 0xBDF5, 0, /* 0x20 */
+ 0xC3AA, 0, 0, 0xCEFD, 0, 0, 0xEFC0, 0xB4ED, /* 0x20 */
+ 0, 0, 0xC2BC, 0xC3CC, 0, 0, 0xF8A3, 0, /* 0x30 */
+ 0xEFAA, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xEFBD, 0xCFC7, 0, 0xEFC1, 0, 0, 0xEECD, 0xEFC7, /* 0x40 */
+ 0, 0, 0, 0xB9F8, 0, 0xB6C6, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xEFC9, 0, 0, 0, /* 0x50 */
+ 0xD5A1, 0, 0, 0xB6CD, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xEFCA, 0xEFC6, 0, 0, /* 0x60 */
+ 0, 0xEFBB, 0xF6CA, 0, 0xC7C2, 0, 0, 0, /* 0x60 */
+ 0xEFCC, 0, 0, 0, 0, 0xBCFC, 0xEFC8, 0, /* 0x70 */
+ 0, 0, 0xD5E0, 0, 0, 0, 0xEFF1, 0, /* 0x70 */
+ 0, 0, 0xC3BE, 0, 0xEFCD, 0, 0, 0xEFD1, /* 0x80 */
+ 0, 0, 0xB0F7, 0, 0, 0, 0, 0xF6CC, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xCBF8, 0, /* 0x90 */
+ 0xEFD3, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xCED9, 0xDDF6, 0, 0, 0xEFD6, 0xEEF8, /* 0xA0 */
+ 0, 0xEFA1, 0xEFCB, 0, 0xB8E4, 0, 0xD5F2, 0, /* 0xA0 */
+ 0xEFD7, 0, 0, 0xC4F8, 0, 0xEFD8, 0, 0, /* 0xB0 */
+ 0xEFD4, 0, 0, 0, 0, 0, 0, 0xEFD5, /* 0xB0 */
+ 0, 0, 0, 0xEFDF, 0, 0, 0, 0xEFE0, /* 0xC0 */
+ 0xC1B4, 0, 0xF6CB, 0, 0xEFD2, 0xEFDD, 0, 0, /* 0xC0 */
+ 0, 0xEFE1, 0, 0, 0, 0, 0xF7E9, 0xEFAC, /* 0xD0 */
+ 0xEFCF, 0, 0, 0, 0xEFDB, 0xEFDC, 0xEFDE, 0xB2F9, /* 0xD0 */
+ 0, 0xBEB5, 0xEFDA, 0, 0xEFCE, 0, 0, 0, /* 0xE0 */
+ 0xF6C9, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xEEFC, 0, 0xEFE4, /* 0xF0 */
+ 0, 0xEFEA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEEF3, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0xEFA6, 0, 0, 0, 0, /* 0x00 */
+ 0xC1CD, 0, 0xEFA9, 0xEFE6, 0xEFE2, 0, 0, 0, /* 0x10 */
+ 0xD6D3, 0xEFEB, 0, 0, 0, 0xEFE3, 0, 0, /* 0x10 */
+ 0xEFE8, 0, 0, 0, 0, 0, 0xEFB4, 0xEFB5, /* 0x20 */
+ 0xEFD0, 0, 0, 0, 0, 0, 0xC1AD, 0, /* 0x20 */
+ 0, 0, 0xEFED, 0xC0D8, 0, 0xCCFA, 0, 0, /* 0x30 */
+ 0xEEEC, 0, 0xEEF5, 0, 0, 0, 0xF6CD, 0xEFEE, /* 0x30 */
+ 0, 0, 0, 0, 0xD6FD, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xEFEC, 0, 0xEFD9, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xBCF8, 0, 0xEFEF, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xEEE5, 0, 0, 0xEFF0, 0, 0xEFE5, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xF6CE, 0, 0xEFE7, 0, 0, /* 0x60 */
+ 0xD4BF, 0, 0xCFE2, 0, 0, 0, 0, 0xC4F7, /* 0x70 */
+ 0, 0xEFE9, 0, 0, 0xC2E0, 0xD7EA, 0xF6C7, 0xD4E4 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB3A4, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xC3C5, 0, 0xE3C5, 0xC9C1, 0, 0, 0xE3C6, 0, /* 0x80 */
+ 0, 0xB1D5, 0, 0xBFAA, 0xE3CA, 0, 0xE3C8, 0xC8F2, /* 0x80 */
+ 0, 0xCFD0, 0, 0xBCE4, 0xE3C9, 0, 0, 0, /* 0x90 */
+ 0xD5A2, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xBAD2, 0, 0xB8F3, 0xF8B9, 0xB7A7, 0, 0, /* 0xA0 */
+ 0xB9EB, 0xC3F6, 0, 0xE3CD, 0xE3CF, 0xE3CC, 0, 0, /* 0xA0 */
+ 0, 0, 0xD4C4, 0, 0, 0, 0xE3D1, 0, /* 0xB0 */
+ 0, 0xD1CB, 0, 0xD1D6, 0xE3D5, 0xE3D4, 0xE3D0, 0xE3D3, /* 0xB0 */
+ 0, 0, 0, 0xE3D6, 0, 0, 0xF8A2, 0, /* 0xC0 */
+ 0xE3C7, 0, 0xC0AB, 0xE3D7, 0xC0BB, 0, 0, 0, /* 0xC0 */
+ 0xE3D9, 0, 0, 0, 0xE3D8, 0xE3DA, 0xB4B3, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xB9D8, 0, 0xE3DB, 0, /* 0xD0 */
+ 0, 0xB2FB, 0xF8DB, 0, 0, 0xE3CB /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0xB8B7, 0xDAE2, 0, 0, /* 0x10 */
+ 0, 0xDAE4, 0xDAE3, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xDAE6, 0, 0, 0, 0xC8EE, 0, /* 0x20 */
+ 0, 0xDAE5, 0xB7C0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xD7E8, 0xDAE8, 0xDAE7, 0, 0xB0A2, /* 0x30 */
+ 0xCDD3, 0, 0xDAE9, 0, 0xB8BD, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xC2AA, 0xC4B0, 0xBDB5, 0, 0, /* 0x40 */
+ 0xCFDE, 0, 0, 0, 0xDAEB, 0, 0, 0, /* 0x50 */
+ 0xDAEA, 0, 0, 0xB1DD, 0, 0xC9C2, 0, 0xDAEC, /* 0x50 */
+ 0, 0xB6B8, 0xD4BA, 0xD5F3, 0xB3FD, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xC5E3, 0, 0xDAEE, 0, 0, 0, /* 0x60 */
+ 0xD2F5, 0, 0xDAEF, 0xB3C2, 0xDAF0, 0xC1EA, 0xCCD5, 0xCFDD, /* 0x70 */
+ 0xC2BD, 0, 0, 0, 0, 0xD1F4, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xD3E7, 0xC2A1, 0, /* 0x80 */
+ 0xDAF1, 0xDAED, 0xB6D3, 0xCBE5, 0, 0xDAF2, 0xBDD7, 0, /* 0x80 */
+ 0, 0, 0, 0, 0xB8F4, 0xD4C9, 0, 0xDAF3, /* 0x90 */
+ 0xB0AF, 0xCFB6, 0, 0xBCCA, 0xD5CF, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCBED, /* 0xA0 */
+ 0xCBE6, 0, 0xCFD5, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xDAF4, 0xD2FE, 0, 0xE3C4, 0xC2A4, 0, 0, 0, /* 0xB0 */
+ 0xC1A5, 0xF6BF, 0, 0xF9A2, 0xF6C0, 0xF6C1, 0, 0, /* 0xB0 */
+ 0xC8B8, 0xD1E3, 0, 0, 0xD0DB, 0xD1C5, 0xBCAF, 0xB9CD, /* 0xC0 */
+ 0, 0xEFF4, 0, 0, 0xB4C6, 0xD3BA, 0xF6C2, 0, /* 0xC0 */
+ 0, 0, 0xF6C3, 0, 0, 0xB5F1, 0xCBE4, 0, /* 0xD0 */
+ 0, 0xCBAB, 0, 0xB3FB, 0xD4D3, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xC0EB, 0xC4D1, 0, 0, 0, 0, /* 0xE0 */
+ 0xD3EA, 0xF6A7, 0xD1A9, 0, 0, 0, 0, 0xF6A9, /* 0xE0 */
+ 0, 0, 0xD4C6, 0, 0, 0, 0xC1E3, 0xC0D7, /* 0xF0 */
+ 0, 0xB1A2, 0, 0xB5E7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD0E8, 0, 0, 0, 0xCFF6, 0, 0xF6AA, 0xD5F0, /* 0x00 */
+ 0xF6AC, 0xC3B9, 0, 0, 0, 0xBBF4, 0xF6AE, 0xF6AD, /* 0x00 */
+ 0, 0, 0, 0xC4DE, 0, 0, 0xC1D8, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xCBAA, 0, 0xCFBC, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCEED, /* 0x20 */
+ 0, 0, 0xF6AF, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xF6B1, 0, 0xC2B6, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xB0D4, 0xC5F9, 0, 0, 0, 0xF6AB, 0xF6B2, 0, /* 0x30 */
+ 0, 0, 0xF6A8, 0, 0xF6B0, 0, 0, 0, /* 0x40 */
+ 0xC1E9, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xC7E0, 0, 0, 0, 0xBEB8, 0, /* 0x50 */
+ 0, 0, 0xF6A6, 0xB5E5, 0xBEB2, 0, 0xB7C7, 0, /* 0x50 */
+ 0xBFBF, 0xC3D2, 0xC3E6, 0, 0, 0, 0, 0, /* 0x60 */
+ 0xD8CC, 0xB8EF, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xBDF9, 0xD1A5, 0, 0xB0D0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0xF7B0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xF7B1, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xD0AC, 0, 0xB0B0, 0, 0xB9AE, /* 0x80 */
+ 0, 0, 0, 0, 0xF7B4, 0, 0, 0, /* 0x90 */
+ 0xC7CA, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xBECF, 0, 0, 0xF7B7, 0, 0, 0xF8E4, 0, /* 0xA0 */
+ 0, 0, 0, 0xF7B6, 0, 0xB1DE, 0, 0, /* 0xA0 */
+ 0, 0, 0xF7B8, 0, 0xF7B9, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xF7B3, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF7B2, 0, 0, 0xF8E1, 0, /* 0xC0 */
+ 0, 0xF7B5, 0, 0xCEA4, 0xC8CD, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xBAAB, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xE8B8, 0, 0, 0xE8BA, 0, 0xE8B9, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xBEC2, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xD2F4, 0, 0xD4CF, 0xC9D8, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCFEC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2B3, 0xB6A5, 0xC7EA, 0, 0xCFEE, 0xCBB3, 0xF1FC, /* 0x00 */
+ 0xD0EB, 0, 0xE7EF, 0, 0xCBCC, 0, 0xF1FD, 0xF1FE, /* 0x00 */
+ 0xD4A4, 0xCDE7, 0xB0E4, 0xB6D9, 0, 0, 0, 0xC6C4, /* 0x10 */
+ 0xC1EC, 0, 0, 0, 0xF2A2, 0, 0, 0, /* 0x10 */
+ 0, 0xF2A1, 0, 0, 0xD2C3, 0, 0xF2A4, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xCDB7, 0, 0, /* 0x20 */
+ 0xBCD5, 0, 0, 0, 0, 0, 0, 0xF2A5, /* 0x30 */
+ 0xBEB1, 0, 0, 0xC6B5, 0, 0xCDC7, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xBFC5, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xCCE2, 0xB6EE, 0xF2A6, 0, /* 0x40 */
+ 0, 0, 0, 0xF2A7, 0xD1D5, 0, 0, 0, /* 0x50 */
+ 0xD4B8, 0xF2AA, 0, 0xB5DF, 0, 0, 0xC0E0, 0, /* 0x50 */
+ 0, 0, 0xF2A9, 0, 0, 0xF2AB, 0, 0xB9CB, /* 0x60 */
+ 0, 0, 0, 0xB2FC, 0xF2AC, 0, 0, 0xCFD4, /* 0x60 */
+ 0xF2AD, 0xC2AD, 0, 0xF2A8, 0xC8A7, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xB7E7, 0, 0, 0, 0, 0, 0xECA9, 0xECAA, /* 0xA0 */
+ 0, 0xF8EC, 0, 0xF8B7, 0, 0, 0xECAB, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xECAC, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xC6AE, 0, 0xECAD, 0, /* 0xC0 */
+ 0xECAE, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xB7C9, 0, 0, 0, 0xCAB3, /* 0xD0 */
+ 0xE2BB, 0, 0xF8BF, 0, 0, 0, 0, 0xE2B8, /* 0xE0 */
+ 0, 0xE2BD, 0xE2BF, 0xE2C0, 0, 0xE2C1, 0, 0xB7B9, /* 0xE0 */
+ 0, 0, 0xD2FB, 0, 0xE2C2, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0xCBC7, 0xB1A5, 0xCACE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBDC8, 0, 0xB1FD, 0, 0, /* 0x00 */
+ 0, 0xE2C3, 0xD1F8, 0, 0xB6FC, 0, 0, 0, /* 0x00 */
+ 0xB2CD, 0xE2C4, 0xC4D9, 0xB6F6, 0, 0, 0, 0, /* 0x10 */
+ 0xD3E0, 0, 0, 0xE2C6, 0, 0, 0xBDA4, 0, /* 0x10 */
+ 0, 0xCFDA, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xB9DD, 0, 0, 0, 0, 0, 0xF7D1, 0, /* 0x20 */
+ 0, 0, 0, 0xE2BC, 0, 0, 0, 0xE2C7, /* 0x30 */
+ 0, 0, 0, 0, 0xE2BE, 0, 0xC1F3, 0xE2C8, /* 0x30 */
+ 0, 0, 0, 0xE2C9, 0, 0xC2F8, 0, 0, /* 0x40 */
+ 0xE2CA, 0xE2CB, 0xE2CC, 0xC0A1, 0xE2CD, 0, 0, 0, /* 0x40 */
+ 0, 0xBCA2, 0xC8C4, 0, 0xF7D3, 0xF7D2, 0, 0xF7CF, /* 0x50 */
+ 0, 0, 0, 0, 0xF7D0, 0, 0xB2F6, 0, /* 0x50 */
+ 0, 0, 0xE2CE, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xCAD7, 0xD8B8, /* 0x90 */
+ 0xD9E5, 0xCFE3, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF0A5, 0, 0, /* 0xA0 */
+ 0xDCB0, 0, 0, 0, 0xC2ED, 0xD4A6, 0xB7EB, 0, /* 0xA0 */
+ 0, 0xCDD4, 0, 0xB3DB, 0xD1B1, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0xB2B5, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0xD7A4, 0xE6E5, 0xBED4, 0, 0xE6E0, 0xBCDD, 0, 0, /* 0xD0 */
+ 0xE6E6, 0xE6E2, 0, 0xCABB, 0, 0xCDD5, 0, 0xE6E1, /* 0xD0 */
+ 0, 0xC2EE, 0xE6E9, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xBAA7, 0, 0, /* 0xE0 */
+ 0, 0xC2E6, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xBFA5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB3D2, 0, 0, 0, 0xE6ED, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xE6EC, 0xC6EF, 0xE6EB, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xE6F0, 0, /* 0x10 */
+ 0, 0xC6AD, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xE5B9, 0, 0xE6EF, 0xE6F2, 0, /* 0x20 */
+ 0xCCDA, 0, 0, 0, 0, 0, 0xE6E3, 0xC9A7, /* 0x30 */
+ 0xE6F3, 0, 0, 0, 0, 0, 0xC2E2, 0, /* 0x30 */
+ 0xDDEB, 0xE6F1, 0xE6EE, 0xE6F4, 0xE6F5, 0xC7FD, 0, 0, /* 0x40 */
+ 0, 0, 0xE6E8, 0, 0, 0xE6E7, 0, 0xE6F6, /* 0x40 */
+ 0, 0, 0, 0, 0, 0xBDBE, 0, 0xD1E9, /* 0x50 */
+ 0, 0, 0xBEAA, 0xE6E4, 0, 0, 0, 0xD6E8, /* 0x50 */
+ 0, 0, 0xC2BF, 0, 0xE6F8, 0xE6F7, 0, 0, /* 0x60 */
+ 0, 0, 0xE6EA, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xB9C7, 0, 0, 0, 0, 0, 0, 0xB0B9, /* 0xA0 */
+ 0xF7BB, 0xF7BA, 0, 0, 0, 0, 0xF7BE, 0xF7BC, /* 0xB0 */
+ 0xBAA1, 0, 0xF7BF, 0, 0xF7C0, 0, 0, 0, /* 0xB0 */
+ 0xF7C2, 0xF7C1, 0xF7C4, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF7C3, /* 0xC0 */
+ 0, 0xF7C7, 0xF8FE, 0xCBE8, 0xCCE5, 0xF7C6, 0xF7C5, 0, /* 0xD0 */
+ 0xB8DF, 0, 0, 0, 0, 0, 0, 0xF7D4, /* 0xD0 */
+ 0, 0xF7D5, 0, 0, 0, 0, 0xF7D6, 0, /* 0xE0 */
+ 0, 0, 0, 0xF7D8, 0, 0xF7DA, 0xF8B1, 0xF7D7, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0xF7DB, 0, 0xF7D9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD7D7, 0, 0, 0xCBC9, 0, /* 0x00 */
+ 0xF7DC, 0, 0, 0, 0, 0xF8BA, 0, 0xF7DD, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0xF8F6, 0, 0, 0, 0, 0xF7DF, /* 0x10 */
+ 0, 0, 0xF7DE, 0xF7E0, 0, 0xB6B7, 0, 0xC4D6, /* 0x20 */
+ 0, 0xE3D2, 0, 0, 0, 0, 0xE3CE, 0xDBCB, /* 0x20 */
+ 0, 0xD3F4, 0xD8AA, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE5F7, 0xB9ED, 0, 0, 0, /* 0x30 */
+ 0, 0xBFFD, 0xBBEA, 0xF7C9, 0xC6C7, 0xF7C8, 0, 0, /* 0x40 */
+ 0xF7CC, 0, 0, 0, 0, 0xF7CD, 0xF7CB, 0xCEBA, /* 0x40 */
+ 0, 0xF7CE, 0, 0, 0xC4A7, 0, 0, 0, /* 0x50 */
+ 0xF7CA, 0, 0xD3E3, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0xC2B3, /* 0x60 */
+ 0, 0, 0, 0, 0xF6D0, 0, 0, 0xF6CF, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xF6D1, 0, 0xF6D2, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xF6D3, 0, /* 0x80 */
+ 0xF6D8, 0xB1AB, 0xF6D6, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xF6DA, 0, 0, 0xF6DF, 0xF6DC, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xF6DB, 0xF6DE, 0, 0xF6D9, 0xCFCA, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xF6E7, 0xF6E1, 0, 0, 0, 0, 0, 0xF6E9, /* 0xC0 */
+ 0, 0xC0F0, 0xF6E8, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xF6F6, 0, 0xF6EB, 0, /* 0xD0 */
+ 0, 0, 0, 0xF6F4, 0, 0xF6F1, 0, 0, /* 0xD0 */
+ 0, 0xF6EE, 0xF6F2, 0, 0xF6EF, 0, 0, 0xF6F0, /* 0xE0 */
+ 0xBEA8, 0, 0xF6EC, 0xF6ED, 0, 0, 0, 0, /* 0xE0 */
+ 0xF6F3, 0, 0, 0, 0xF6F5, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xF6EA, 0, 0xF6FD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xF6F8, 0xF6FC, 0, 0, 0, 0xF6FA, 0, 0, /* 0x00 */
+ 0xF6F9, 0, 0xF6FB, 0xC8FA, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF6FE, 0, 0, 0xF6E5, 0, 0xF7A4, 0, 0, /* 0x20 */
+ 0xF7A3, 0xF7A5, 0, 0, 0, 0xF7A2, 0, 0, /* 0x20 */
+ 0, 0xF6E3, 0xF7A1, 0xF7A6, 0, 0xF7AA, 0, 0xF6E6, /* 0x30 */
+ 0, 0xF6E4, 0, 0xF7A9, 0, 0, 0xF7A7, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xF7AB, 0, 0, /* 0x40 */
+ 0xF7A8, 0xB1EE, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xF7AE, 0, 0xF7AD, 0, 0xF7AC, 0xC1DB, /* 0x50 */
+ 0xF6E0, 0, 0, 0, 0, 0xF6F7, 0, 0xF6D7, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF7AF, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF6DD, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xF6D4, 0, 0xF6E2, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xC4F1, 0, 0, /* 0xE0 */
+ 0, 0xF0AF, 0, 0, 0xD9EC, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xB7EF, 0xC3F9, 0, 0xF0B0 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0B2, 0xF0B1, /* 0x00 */
+ 0, 0xD1BB, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xCDD2, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xD4A7, 0, 0xF0B6, 0, 0xF0B7, /* 0x10 */
+ 0, 0, 0, 0xF0B3, 0, 0, 0xD1EC, 0, /* 0x20 */
+ 0xD1BC, 0, 0, 0, 0, 0, 0, 0xF0B9, /* 0x20 */
+ 0xF0BB, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xBAE8, 0, 0, 0, 0xB8EB, /* 0x30 */
+ 0, 0, 0xF0BC, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0xBEE9, 0xF0C1, 0xF0BE, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xF0C3, 0xB6EC, 0, 0, /* 0x50 */
+ 0xF0C0, 0xF0C4, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xF0C6, 0, 0xC5F4, 0, 0, 0xF0C7, /* 0x60 */
+ 0, 0, 0xC8B5, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF0B4, /* 0x80 */
+ 0, 0xF0C8, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xF0C5, 0, 0, 0, 0, /* 0x90 */
+ 0xF0C9, 0, 0xF0CA, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF0CC, 0, 0, /* 0xA0 */
+ 0, 0xF0CD, 0, 0, 0, 0, 0, 0xDDBA, /* 0xA0 */
+ 0, 0, 0, 0, 0xBAD7, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xF7BD, 0xF0CF, 0, 0, 0, /* 0xB0 */
+ 0xF0CB, 0, 0xF0CE, 0, 0xBCA6, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xF0D1, 0, 0, 0, 0xC5B8, /* 0xD0 */
+ 0, 0xF0BA, 0xF0D2, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xF0B8, 0xF0D4, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF0D3, /* 0xE0 */
+ 0, 0, 0xF0D5, 0xF0C2, 0, 0, 0, 0, /* 0xF0 */
+ 0xF0D6, 0xD3A5, 0xF0D8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xF0D7, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xF0B5, 0, 0, /* 0x10 */
+ 0, 0, 0xF0D0, 0xF0D9, 0, 0xF0BF, 0xF0BD, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xF8D2, 0, 0, /* 0x70 */
+ 0, 0xF8F4, 0xF5BA, 0, 0xBCEF, 0xD1CE, 0, 0xC2B9, /* 0x70 */
+ 0, 0, 0xF7E4, 0, 0, 0, 0, 0xF7E5, /* 0x80 */
+ 0xF7E6, 0, 0, 0xF7E7, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xF7E8, 0xC2B4, 0, 0, 0, 0xC0F6, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xF7EA, 0, 0xF7EB, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xC2F3, 0, 0, /* 0xA0 */
+ 0, 0xF4EF, 0, 0, 0, 0, 0, 0xF8E5, /* 0xA0 */
+ 0, 0, 0, 0, 0xF4F0, 0xF8D9, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xC2E9, 0, 0xC3B4, 0xF7E2, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xBBC6, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xD9E4, 0xCAF2, 0xC0E8, 0xF0A4, /* 0xC0 */
+ 0, 0xBADA, 0, 0, 0xC7AD, 0, 0, 0, /* 0xD0 */
+ 0xC4AC, 0, 0, 0xF7EC, 0xF7ED, 0xF7EE, 0xB5E3, 0xF7F0, /* 0xD0 */
+ 0xF7EF, 0, 0xF7F1, 0, 0, 0xF7F4, 0, 0xF7F3, /* 0xE0 */
+ 0xB5B3, 0, 0, 0, 0, 0, 0, 0xF7F6, /* 0xE0 */
+ 0, 0, 0xF7F5, 0, 0xF8D4, 0, 0, 0xF7F2, /* 0xF0 */
+ 0, 0xEDE9, 0, 0xEDEA, 0xEDEB, 0xF6BC, 0, 0xF6BD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_GBT_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xF6BE, 0, 0, 0, 0, 0xB6A6, 0, /* 0x00 */
+ 0xD8BE, 0, 0, 0xB9C4, 0, 0xF8AE, 0, 0xD8BB, /* 0x10 */
+ 0, 0xDCB1, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xCAF3, 0, 0xF7F7, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xF7F8, 0, 0, 0xF7F9, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0xF7FB, /* 0x30 */
+ 0, 0xF7FA, 0, 0xB1C7, 0, 0xF7FC, 0xF7FD, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xF7FE, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xC6EB, 0xD5AB, 0, 0, 0, 0xECB4, /* 0x40 */
+ 0, 0, 0xB3DD, 0, 0xF6B3, 0, 0, 0, /* 0x50 */
+ 0, 0xF6B5, 0, 0, 0xF6B7, 0, 0, 0xF6B4, /* 0x50 */
+ 0xF6B6, 0xC1E4, 0, 0xF8AA, 0, 0, 0xF6B8, 0, /* 0x60 */
+ 0, 0, 0xF6BA, 0, 0xF6B9, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xC8A3, 0, 0, 0, 0, 0xF6BB, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xC1FA, 0, 0, /* 0x80 */
+ 0xC5D3, 0, 0, 0, 0xB9A8, 0xEDE8, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xB9EA, 0, 0, 0, /* 0x90 */
+ 0xD9DF /* 0xA0 */
+ /* 0xA0 */
+};
diff --git a/sal/textenc/tcvtscn6.tab b/sal/textenc/tcvtscn6.tab
new file mode 100644
index 000000000000..8a8cafc725d8
--- /dev/null
+++ b/sal/textenc/tcvtscn6.tab
@@ -0,0 +1,2956 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the information tables for all */
+/* chinese simplified (China) charsets: */
+/* GB2312, GBK, MS936, APPLE_CHINSIMP */
+
+/* GBK is MS-CP 936 and a superset of GB-2312-80. In GB-2312-80 the range */
+/* is 0xA1-0xFE for the leading byte and 0xA1-0xFE for the trailing byte. */
+/* In GBK the range is from 0x81-0xFE for the leading byte and 0x40-0xFE */
+/* for the trailing byte. */
+
+/* ======================================================================= */
+
+#define GBKOFF 0x61
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aGB2312UniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0x20AC, 0, 0, NULL }, /* 0x80 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x81 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x82 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x83 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x84 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x85 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x86 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x87 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x88 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x89 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x90 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x91 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x92 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x93 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x94 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x95 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x96 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x97 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x98 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x99 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9F */ /* We convert this as double byte */
+ { 0, 1, 0, NULL }, /* 0xA0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A1 }, /* 0xA1 */
+ { 0, 0xA1, 0xFC, aImplDBCSToUniTab_GB_A2 }, /* 0xA2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A3 }, /* 0xA3 */
+ { 0, 0xA1, 0xF3, aImplDBCSToUniTab_GB_A4 }, /* 0xA4 */
+ { 0, 0xA1, 0xF6, aImplDBCSToUniTab_GB_A5 }, /* 0xA5 */
+ { 0, 0xA1, 0xF5, aImplDBCSToUniTab_GB_A6 }, /* 0xA6 */
+ { 0, 0xA1, 0xF1, aImplDBCSToUniTab_GB_A7 }, /* 0xA7 */
+ { 0, 0xA1, 0xE9, aImplDBCSToUniTab_GBK_A8+GBKOFF }, /* 0xA8 */
+ { 0, 0xA1, 0xEF, aImplDBCSToUniTab_GBK_A9+GBKOFF }, /* 0xA9 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAC */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAD */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAE */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAF */ /* We convert this as double byte */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B0+GBKOFF }, /* 0xB0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B1+GBKOFF }, /* 0xB1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B2+GBKOFF }, /* 0xB2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B3+GBKOFF }, /* 0xB3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B4+GBKOFF }, /* 0xB4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B5+GBKOFF }, /* 0xB5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B6+GBKOFF }, /* 0xB6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B7+GBKOFF }, /* 0xB7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B8+GBKOFF }, /* 0xB8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B9+GBKOFF }, /* 0xB9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BA+GBKOFF }, /* 0xBA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BB+GBKOFF }, /* 0xBB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BC+GBKOFF }, /* 0xBC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BD+GBKOFF }, /* 0xBD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BE+GBKOFF }, /* 0xBE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BF+GBKOFF }, /* 0xBF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C0+GBKOFF }, /* 0xC0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C1+GBKOFF }, /* 0xC1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C2+GBKOFF }, /* 0xC2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C3+GBKOFF }, /* 0xC3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C4+GBKOFF }, /* 0xC4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C5+GBKOFF }, /* 0xC5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C6+GBKOFF }, /* 0xC6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C7+GBKOFF }, /* 0xC7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C8+GBKOFF }, /* 0xC8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C9+GBKOFF }, /* 0xC9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CA+GBKOFF }, /* 0xCA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CB+GBKOFF }, /* 0xCB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CC+GBKOFF }, /* 0xCC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CD+GBKOFF }, /* 0xCD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CE+GBKOFF }, /* 0xCE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CF+GBKOFF }, /* 0xCF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D0+GBKOFF }, /* 0xD0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D1+GBKOFF }, /* 0xD1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D2+GBKOFF }, /* 0xD2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D3+GBKOFF }, /* 0xD3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D4+GBKOFF }, /* 0xD4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D5+GBKOFF }, /* 0xD5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D6+GBKOFF }, /* 0xD6 */
+ { 0, 0xA1, 0xF9, aImplDBCSToUniTab_GBK_D7+GBKOFF }, /* 0xD7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D8+GBKOFF }, /* 0xD8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D9+GBKOFF }, /* 0xD9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DA+GBKOFF }, /* 0xDA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DB+GBKOFF }, /* 0xDB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DC+GBKOFF }, /* 0xDC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DD+GBKOFF }, /* 0xDD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DE+GBKOFF }, /* 0xDE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DF+GBKOFF }, /* 0xDF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E0+GBKOFF }, /* 0xE0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E1+GBKOFF }, /* 0xE1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E2+GBKOFF }, /* 0xE2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E3+GBKOFF }, /* 0xE3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E4+GBKOFF }, /* 0xE4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E5+GBKOFF }, /* 0xE5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E6+GBKOFF }, /* 0xE6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E7+GBKOFF }, /* 0xE7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E8+GBKOFF }, /* 0xE8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E9+GBKOFF }, /* 0xE9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EA+GBKOFF }, /* 0xEA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EB+GBKOFF }, /* 0xEB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EC+GBKOFF }, /* 0xEC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_ED+GBKOFF }, /* 0xED */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EE+GBKOFF }, /* 0xEE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EF+GBKOFF }, /* 0xEF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F0+GBKOFF }, /* 0xF0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F1+GBKOFF }, /* 0xF1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F2+GBKOFF }, /* 0xF2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F3+GBKOFF }, /* 0xF3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F4+GBKOFF }, /* 0xF4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F5+GBKOFF }, /* 0xF5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F6+GBKOFF }, /* 0xF6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F7+GBKOFF }, /* 0xF7 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF8 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF9 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFC */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFD */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFE */ /* We convert this as double byte */
+ { 0, 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aGB2312DBCSHighTab[256] =
+{
+ { 0x00, 0xFC, aImplUniToDBCSTab_GB_00 }, /* 0x00 */
+ { 0x01, 0xDC, aImplUniToDBCSTab_GB_01 }, /* 0x01 */
+ { 0x51, 0xC9, aImplUniToDBCSTab_GB_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_GB_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_GB_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 0x3F, 0x3F, aImplUniToDBCSTab_APPLECHINSIMP_1E }, /* 0x1E */ /* we convert this char also to unicode */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x14, 0xAC, aImplUniToDBCSTab_GB_20 }, /* 0x20 */
+ { 0x03, 0x93, aImplUniToDBCSTab_GB_21 }, /* 0x21 */
+ { 0x08, 0xEF, aImplUniToDBCSTab_GB_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_GB_23 }, /* 0x23 */
+ { 0x60, 0x9B, aImplUniToDBCSTab_GB_24 }, /* 0x24 */
+ { 0x00, 0xCF, aImplUniToDBCSTab_GB_25 }, /* 0x25 */
+ { 0x05, 0x42, aImplUniToDBCSTab_GB_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFB, aImplUniToDBCSTab_GB_30 }, /* 0x30 */
+ { 0x05, 0x29, aImplUniToDBCSTab_GB_31 }, /* 0x31 */
+ { 0x20, 0x29, aImplUniToDBCSTab_GBK_32 }, /* 0x32 */
+ { 1, 0, NULL }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_4E }, /* 0x4E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GB_4F }, /* 0x4F */
+ { 0x0C, 0xFB, aImplUniToDBCSTab_GB_50 }, /* 0x50 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_GB_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_52 }, /* 0x52 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_GB_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_54 }, /* 0x54 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GB_55 }, /* 0x55 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_56 }, /* 0x56 */
+ { 0x03, 0xFD, aImplUniToDBCSTab_GB_57 }, /* 0x57 */
+ { 0x00, 0xF9, aImplUniToDBCSTab_GB_58 }, /* 0x58 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_GB_59 }, /* 0x59 */
+ { 0x01, 0xF1, aImplUniToDBCSTab_GB_5A }, /* 0x5A */
+ { 0x09, 0xFF, aImplUniToDBCSTab_GB_5B }, /* 0x5B */
+ { 0x01, 0xFB, aImplUniToDBCSTab_GB_5C }, /* 0x5C */
+ { 0x02, 0xFE, aImplUniToDBCSTab_GB_5D }, /* 0x5D */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_5E }, /* 0x5E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_5F }, /* 0x5F */
+ { 0x00, 0xFA, aImplUniToDBCSTab_GB_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_61 }, /* 0x61 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_GB_62 }, /* 0x62 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_63 }, /* 0x63 */
+ { 0x00, 0xE6, aImplUniToDBCSTab_GB_64 }, /* 0x64 */
+ { 0x00, 0xFA, aImplUniToDBCSTab_GB_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_67 }, /* 0x67 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_GB_68 }, /* 0x68 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_69 }, /* 0x69 */
+ { 0x0A, 0xAC, aImplUniToDBCSTab_GB_6A }, /* 0x6A */
+ { 0x20, 0xFD, aImplUniToDBCSTab_GB_6B }, /* 0x6B */
+ { 0x05, 0xFE, aImplUniToDBCSTab_GB_6C }, /* 0x6C */
+ { 0x01, 0xFC, aImplUniToDBCSTab_GB_6D }, /* 0x6D */
+ { 0x05, 0xF9, aImplUniToDBCSTab_GB_6E }, /* 0x6E */
+ { 0x02, 0xEF, aImplUniToDBCSTab_GB_6F }, /* 0x6F */
+ { 0x11, 0xFD, aImplUniToDBCSTab_GB_70 }, /* 0x70 */
+ { 0x09, 0xF9, aImplUniToDBCSTab_GB_71 }, /* 0x71 */
+ { 0x06, 0xFC, aImplUniToDBCSTab_GB_72 }, /* 0x72 */
+ { 0x01, 0xF2, aImplUniToDBCSTab_GB_73 }, /* 0x73 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_GB_74 }, /* 0x74 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_GB_75 }, /* 0x75 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_76 }, /* 0x76 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_77 }, /* 0x77 */
+ { 0x00, 0xFA, aImplUniToDBCSTab_GB_78 }, /* 0x78 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_GB_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_7A }, /* 0x7A */
+ { 0x03, 0xFE, aImplUniToDBCSTab_GB_7B }, /* 0x7B */
+ { 0x07, 0xFB, aImplUniToDBCSTab_GB_7C }, /* 0x7C */
+ { 0x0A, 0xAE, aImplUniToDBCSTab_GB_7D }, /* 0x7D */
+ { 0x3B, 0xFF, aImplUniToDBCSTab_GB_7E }, /* 0x7E */
+ { 0x00, 0xFC, aImplUniToDBCSTab_GB_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_GB_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_GB_81 }, /* 0x81 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_GB_82 }, /* 0x82 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_GB_83 }, /* 0x83 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_84 }, /* 0x84 */
+ { 0x0C, 0xFF, aImplUniToDBCSTab_GB_85 }, /* 0x85 */
+ { 0x05, 0xFE, aImplUniToDBCSTab_GB_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_87 }, /* 0x87 */
+ { 0x03, 0xFE, aImplUniToDBCSTab_GB_88 }, /* 0x88 */
+ { 0x02, 0xF3, aImplUniToDBCSTab_GB_89 }, /* 0x89 */
+ { 0x00, 0x93, aImplUniToDBCSTab_GB_8A }, /* 0x8A */
+ { 0x07, 0xFF, aImplUniToDBCSTab_GB_8B }, /* 0x8B */
+ { 0x00, 0x98, aImplUniToDBCSTab_GB_8C }, /* 0x8C */
+ { 0x1D, 0xFD, aImplUniToDBCSTab_GB_8D }, /* 0x8D */
+ { 0x05, 0xCE, aImplUniToDBCSTab_GB_8E }, /* 0x8E */
+ { 0x66, 0xFD, aImplUniToDBCSTab_GB_8F }, /* 0x8F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_90 }, /* 0x90 */
+ { 0x02, 0xDC, aImplUniToDBCSTab_GB_91 }, /* 0x91 */
+ { 0x74, 0xC8, aImplUniToDBCSTab_GB_92 }, /* 0x92 */
+ { 0x3E, 0xD6, aImplUniToDBCSTab_GB_93 }, /* 0x93 */
+ { 0x3E, 0xFF, aImplUniToDBCSTab_GB_94 }, /* 0x94 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_95 }, /* 0x95 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_96 }, /* 0x96 */
+ { 0x00, 0xF6, aImplUniToDBCSTab_GB_97 }, /* 0x97 */
+ { 0x75, 0xE9, aImplUniToDBCSTab_GB_98 }, /* 0x98 */
+ { 0x0D, 0xA8, aImplUniToDBCSTab_GB_99 }, /* 0x99 */
+ { 0x6C, 0xFB, aImplUniToDBCSTab_GB_9A }, /* 0x9A */
+ { 0x03, 0x54, aImplUniToDBCSTab_GB_9B }, /* 0x9B */
+ { 0x7C, 0xE2, aImplUniToDBCSTab_GB_9C }, /* 0x9C */
+ { 1, 0, NULL }, /* 0x9D */
+ { 0x1F, 0xFE, aImplUniToDBCSTab_GB_9E }, /* 0x9E */
+ { 0x0B, 0xA0, aImplUniToDBCSTab_GB_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 1, 0, NULL }, /* 0xF9 */
+ { 1, 0, NULL }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x31, 0x44, aImplUniToDBCSTab_GB_FE }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_GB_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* F8A1-FEFE --> E000-E29F */
+/* AAA1-AFFE --> E2A0-E4DF */
+
+#define DBCS_EUDC_MS936_COUNT 2
+static ImplDBCSEUDCData const aImplMS936DBCSEUDCTab[DBCS_EUDC_MS936_COUNT] =
+{
+ /* EUDC-Range (the mapping defined by MS is A0-FF, because the */
+ /* unicode range is E000-E29F and E2A0-E4DF) */
+ /* Lead: F8-FE */
+ /* Trail: A1-FE */
+ { 0xF8, 0xFE, 0xA0, 0xFF, 0, 0, 0, 0, 1, 0x60, 0xE000, 0xE29F },
+ /* Lead: AA-AF */
+ /* Trail: A1-FE */
+ { 0xAA, 0xAF, 0xA0, 0xFF, 0, 0, 0, 0, 1, 0x60, 0xE2A0, 0xE4DF }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplGB2312DBCSCvtData =
+{
+ aGB2312UniLeadTab,
+ aGB2312DBCSHighTab,
+ 0x00, 0xFF,
+ 0xA1, 0xFE,
+ aImplMS936DBCSEUDCTab,
+ DBCS_EUDC_MS936_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplGB2312TextEncodingData
+ = { { &aImplGB2312DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 134,
+ "euc-cn",
+ "gb2312",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CHINESE_SIMPLIFIED, pc code page 936, mac encoding 25 */
+
+/* ======================================================================= */
+
+static ImplTextEncodingData const aImplEUCCNTextEncodingData
+ = { { &aImplGB2312DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 134,
+ "euc-cn",
+ "gb2312",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* SCRIPT_CHINESE_SIMPLIFIED, pc code page 936, mac encoding 25 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aGBT12345UniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0x20AC, 0, 0, NULL }, /* 0x80 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x81 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x82 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x83 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x84 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x85 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x86 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x87 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x88 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x89 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x90 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x91 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x92 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x93 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x94 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x95 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x96 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x97 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x98 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x99 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9F */ /* We convert this as double byte */
+ { 0, 1, 0, NULL }, /* 0xA0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A1 }, /* 0xA1 */
+ { 0, 0xA1, 0xFC, aImplDBCSToUniTab_GB_A2 }, /* 0xA2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A3 }, /* 0xA3 */
+ { 0, 0xA1, 0xF3, aImplDBCSToUniTab_GB_A4 }, /* 0xA4 */
+ { 0, 0xA1, 0xF6, aImplDBCSToUniTab_GB_A5 }, /* 0xA5 */
+ { 0, 0xA1, 0xF5, aImplDBCSToUniTab_GB_A6 }, /* 0xA6 */
+ { 0, 0xA1, 0xF1, aImplDBCSToUniTab_GB_A7 }, /* 0xA7 */
+ { 0, 0xA1, 0xE9, aImplDBCSToUniTab_GBK_A8+GBKOFF }, /* 0xA8 */
+ { 0, 0xA1, 0xEF, aImplDBCSToUniTab_GBK_A9+GBKOFF }, /* 0xA9 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAC */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAD */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAE */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAF */ /* We convert this as double byte */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B0 }, /* 0xB0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B1 }, /* 0xB1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B2 }, /* 0xB2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B3 }, /* 0xB3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B4 }, /* 0xB4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B5 }, /* 0xB5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B6 }, /* 0xB6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B7 }, /* 0xB7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B8 }, /* 0xB8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_B9 }, /* 0xB9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_BA }, /* 0xBA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_BB }, /* 0xBB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_BC }, /* 0xBC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_BD }, /* 0xBD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_BE }, /* 0xBE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_BF }, /* 0xBF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C0 }, /* 0xC0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C1 }, /* 0xC1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C2 }, /* 0xC2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C3 }, /* 0xC3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C4 }, /* 0xC4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C5 }, /* 0xC5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C6 }, /* 0xC6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C7 }, /* 0xC7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C8 }, /* 0xC8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_C9 }, /* 0xC9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_CA }, /* 0xCA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_CB }, /* 0xCB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_CC }, /* 0xCC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_CD }, /* 0xCD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_CE }, /* 0xCE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_CF }, /* 0xCF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D0 }, /* 0xD0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D1 }, /* 0xD1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D2 }, /* 0xD2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D3 }, /* 0xD3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D4 }, /* 0xD4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D5 }, /* 0xD5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D6 }, /* 0xD6 */
+ { 0, 0xA1, 0xF9, aImplDBCSToUniTab_GBT_D7 }, /* 0xD7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D8 }, /* 0xD8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_D9 }, /* 0xD9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_DA }, /* 0xDA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_DB }, /* 0xDB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_DC }, /* 0xDC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_DD }, /* 0xDD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_DE }, /* 0xDE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_DF }, /* 0xDF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E0 }, /* 0xE0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E1 }, /* 0xE1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E2 }, /* 0xE2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E3 }, /* 0xE3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E4 }, /* 0xE4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E5 }, /* 0xE5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E6 }, /* 0xE6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E7 }, /* 0xE7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E8 }, /* 0xE8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_E9 }, /* 0xE9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_EA }, /* 0xEA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_EB }, /* 0xEB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_EC }, /* 0xEC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_ED }, /* 0xED */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_EE }, /* 0xEE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_EF }, /* 0xEF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F0 }, /* 0xF0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F1 }, /* 0xF1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F2 }, /* 0xF2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F3 }, /* 0xF3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F4 }, /* 0xF4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F5 }, /* 0xF5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F6 }, /* 0xF6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F7 }, /* 0xF7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBT_F8 }, /* 0xF8 */
+ { 0, 0xA1, 0xA9, aImplDBCSToUniTab_GBT_F9 }, /* 0xF9 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFC */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFD */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFE */ /* We convert this as double byte */
+ { 0, 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aGBT12345DBCSHighTab[256] =
+{
+ { 0x00, 0xFC, aImplUniToDBCSTab_GB_00 }, /* 0x00 */
+ { 0x01, 0xDC, aImplUniToDBCSTab_GB_01 }, /* 0x01 */
+ { 0x51, 0xC9, aImplUniToDBCSTab_GB_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_GB_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_GB_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 0x3F, 0x3F, aImplUniToDBCSTab_APPLECHINSIMP_1E }, /* 0x1E */ /* we convert this char also to unicode */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x14, 0xAC, aImplUniToDBCSTab_GB_20 }, /* 0x20 */
+ { 0x03, 0x93, aImplUniToDBCSTab_GB_21 }, /* 0x21 */
+ { 0x08, 0xEF, aImplUniToDBCSTab_GB_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_GB_23 }, /* 0x23 */
+ { 0x60, 0x9B, aImplUniToDBCSTab_GB_24 }, /* 0x24 */
+ { 0x00, 0xCF, aImplUniToDBCSTab_GB_25 }, /* 0x25 */
+ { 0x05, 0x42, aImplUniToDBCSTab_GB_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFB, aImplUniToDBCSTab_GB_30 }, /* 0x30 */
+ { 0x05, 0x29, aImplUniToDBCSTab_GB_31 }, /* 0x31 */
+ { 0x20, 0x29, aImplUniToDBCSTab_GBK_32 }, /* 0x32 */
+ { 1, 0, NULL }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_4E }, /* 0x4E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GBT_4F }, /* 0x4F */
+ { 0x00, 0xFB, aImplUniToDBCSTab_GBT_50 }, /* 0x50 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_GBT_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_52 }, /* 0x52 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_GBT_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GBT_54 }, /* 0x54 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GBT_55 }, /* 0x55 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_56 }, /* 0x56 */
+ { 0x03, 0xFD, aImplUniToDBCSTab_GBT_57 }, /* 0x57 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_GBT_58 }, /* 0x58 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_GBT_59 }, /* 0x59 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_GBT_5A }, /* 0x5A */
+ { 0x00, 0xFA, aImplUniToDBCSTab_GBT_5B }, /* 0x5B */
+ { 0x01, 0xFD, aImplUniToDBCSTab_GBT_5C }, /* 0x5C */
+ { 0x06, 0xFE, aImplUniToDBCSTab_GBT_5D }, /* 0x5D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_GBT_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GBT_5F }, /* 0x5F */
+ { 0x0A, 0xFB, aImplUniToDBCSTab_GBT_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_62 }, /* 0x62 */
+ { 0x01, 0xF8, aImplUniToDBCSTab_GBT_63 }, /* 0x63 */
+ { 0x0B, 0xFE, aImplUniToDBCSTab_GBT_64 }, /* 0x64 */
+ { 0x00, 0xFA, aImplUniToDBCSTab_GBT_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_67 }, /* 0x67 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_GBT_68 }, /* 0x68 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GBT_69 }, /* 0x69 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_GBT_6A }, /* 0x6A */
+ { 0x04, 0xFF, aImplUniToDBCSTab_GBT_6B }, /* 0x6B */
+ { 0x05, 0xF5, aImplUniToDBCSTab_GBT_6C }, /* 0x6C */
+ { 0x04, 0xFC, aImplUniToDBCSTab_GBT_6D }, /* 0x6D */
+ { 0x05, 0xFF, aImplUniToDBCSTab_GBT_6E }, /* 0x6E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GBT_6F }, /* 0x6F */
+ { 0x05, 0xFD, aImplUniToDBCSTab_GBT_70 }, /* 0x70 */
+ { 0x09, 0xFE, aImplUniToDBCSTab_GBT_71 }, /* 0x71 */
+ { 0x06, 0xFD, aImplUniToDBCSTab_GBT_72 }, /* 0x72 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GBT_73 }, /* 0x73 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_GBT_74 }, /* 0x74 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_GBT_75 }, /* 0x75 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GBT_76 }, /* 0x76 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_GBT_77 }, /* 0x77 */
+ { 0x02, 0xFD, aImplUniToDBCSTab_GBT_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_GBT_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_7A }, /* 0x7A */
+ { 0x04, 0xFE, aImplUniToDBCSTab_GBT_7B }, /* 0x7B */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GBT_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_GBT_7D }, /* 0x7D */
+ { 0x08, 0x9C, aImplUniToDBCSTab_GBT_7E }, /* 0x7E */
+ { 0x36, 0xFC, aImplUniToDBCSTab_GBT_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_GBT_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_GBT_81 }, /* 0x81 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_GBT_82 }, /* 0x82 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_GBT_83 }, /* 0x83 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GBT_84 }, /* 0x84 */
+ { 0x0C, 0xFF, aImplUniToDBCSTab_GBT_85 }, /* 0x85 */
+ { 0x04, 0xFE, aImplUniToDBCSTab_GBT_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GBT_87 }, /* 0x87 */
+ { 0x03, 0xFE, aImplUniToDBCSTab_GBT_88 }, /* 0x88 */
+ { 0x02, 0xF8, aImplUniToDBCSTab_GBT_89 }, /* 0x89 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GBT_8A }, /* 0x8A */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GBT_8B }, /* 0x8B */
+ { 0x07, 0xFE, aImplUniToDBCSTab_GBT_8C }, /* 0x8C */
+ { 0x04, 0xFD, aImplUniToDBCSTab_GBT_8D }, /* 0x8D */
+ { 0x05, 0xFE, aImplUniToDBCSTab_GBT_8E }, /* 0x8E */
+ { 0x03, 0xFD, aImplUniToDBCSTab_GBT_8F }, /* 0x8F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GBT_90 }, /* 0x90 */
+ { 0x02, 0xFA, aImplUniToDBCSTab_GBT_91 }, /* 0x91 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_GBT_92 }, /* 0x92 */
+ { 0x01, 0xF9, aImplUniToDBCSTab_GBT_93 }, /* 0x93 */
+ { 0x03, 0x7F, aImplUniToDBCSTab_GBT_94 }, /* 0x94 */
+ { 0x77, 0xE5, aImplUniToDBCSTab_GBT_95 }, /* 0x95 */
+ { 0x1C, 0xFB, aImplUniToDBCSTab_GBT_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBT_97 }, /* 0x97 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GBT_98 }, /* 0x98 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_GBT_99 }, /* 0x99 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_GBT_9A }, /* 0x9A */
+ { 0x03, 0xFF, aImplUniToDBCSTab_GBT_9B }, /* 0x9B */
+ { 0x08, 0xF6, aImplUniToDBCSTab_GBT_9C }, /* 0x9C */
+ { 0x06, 0xFA, aImplUniToDBCSTab_GBT_9D }, /* 0x9D */
+ { 0x0C, 0xFF, aImplUniToDBCSTab_GBT_9E }, /* 0x9E */
+ { 0x09, 0xA0, aImplUniToDBCSTab_GBT_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 1, 0, NULL }, /* 0xF9 */
+ { 1, 0, NULL }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x31, 0x44, aImplUniToDBCSTab_GB_FE }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_GB_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplGBT12345DBCSCvtData =
+{
+ aGBT12345UniLeadTab,
+ aGBT12345DBCSHighTab,
+ 0x00, 0xFF,
+ 0xA1, 0xFE,
+ aImplMS936DBCSEUDCTab,
+ DBCS_EUDC_MS936_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplGBT12345TextEncodingData
+ = { { &aImplGBT12345DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 134,
+ "euc-cn",
+ "cn-gb-12345",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CHINESE_SIMPLIFIED, pc code page 936, mac encoding 25 */
+
+/* ======================================================================= */
+
+/* #100054# In the GBK range FE50--FEA0, added those mappings (in both
+ directions) taken from GB-18030 that do not map to Unicode PUA (i.e., those
+ mappings marked with an * below):
+
+ FE50 -> U+2E81 *
+ FE51 -> U+E816
+ FE52 -> U+E817
+ FE53 -> U+E818
+ FE54 -> U+2E84 *
+ FE55 -> U+3473 *
+ FE56 -> U+3447 *
+ FE57 -> U+2E88 *
+ FE58 -> U+2E8B *
+ FE59 -> U+E81E
+ FE5A -> U+359E *
+ FE5B -> U+361A *
+ FE5C -> U+360E *
+ FE5D -> U+2E8C *
+ FE5E -> U+2E97 *
+ FE5F -> U+396E *
+ FE60 -> U+3918 *
+ FE61 -> U+E826
+ FE62 -> U+39CF *
+ FE63 -> U+39DF *
+ FE64 -> U+3A73 *
+ FE65 -> U+39D0 *
+ FE66 -> U+E82B
+ FE67 -> U+E82C
+ FE68 -> U+3B4E *
+ FE69 -> U+3C6E *
+ FE6A -> U+3CE0 *
+ FE6B -> U+2EA7 *
+ FE6C -> U+E831
+ FE6D -> U+E832
+ FE6E -> U+2EAA *
+ FE6F -> U+4056 *
+ FE70 -> U+415F *
+ FE71 -> U+2EAE *
+ FE72 -> U+4337 *
+ FE73 -> U+2EB3 *
+ FE74 -> U+2EB6 *
+ FE75 -> U+2EB7 *
+ FE76 -> U+E83B
+ FE77 -> U+43B1 *
+ FE78 -> U+43AC *
+ FE79 -> U+2EBB *
+ FE7A -> U+43DD *
+ FE7B -> U+44D6 *
+ FE7C -> U+4661 *
+ FE7D -> U+464C *
+ FE7E -> U+E843
+ FE80 -> U+4723 *
+ FE81 -> U+4729 *
+ FE82 -> U+477C *
+ FE83 -> U+478D *
+ FE84 -> U+2ECA *
+ FE85 -> U+4947 *
+ FE86 -> U+497A *
+ FE87 -> U+497D *
+ FE88 -> U+4982 *
+ FE89 -> U+4983 *
+ FE8A -> U+4985 *
+ FE8B -> U+4986 *
+ FE8C -> U+499F *
+ FE8D -> U+499B *
+ FE8E -> U+49B7 *
+ FE8F -> U+49B6 *
+ FE90 -> U+E854
+ FE91 -> U+E855
+ FE92 -> U+4CA3 *
+ FE93 -> U+4C9F *
+ FE94 -> U+4CA0 *
+ FE95 -> U+4CA1 *
+ FE96 -> U+4C77 *
+ FE97 -> U+4CA2 *
+ FE98 -> U+4D13 *
+ FE99 -> U+4D14 *
+ FE9A -> U+4D15 *
+ FE9B -> U+4D16 *
+ FE9C -> U+4D17 *
+ FE9D -> U+4D18 *
+ FE9E -> U+4D19 *
+ FE9F -> U+4DAE *
+ FEA0 -> U+E864
+*/
+
+static ImplDBCSToUniLeadTab const aGBKUniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0x20AC, 0, 0, NULL }, /* 0x80 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_81 }, /* 0x81 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_82 }, /* 0x82 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_83 }, /* 0x83 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_84 }, /* 0x84 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_85 }, /* 0x85 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_86 }, /* 0x86 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_87 }, /* 0x87 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_88 }, /* 0x88 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_89 }, /* 0x89 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8A }, /* 0x8A */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8B }, /* 0x8B */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8C }, /* 0x8C */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8D }, /* 0x8D */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8E }, /* 0x8E */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8F }, /* 0x8F */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_90 }, /* 0x90 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_91 }, /* 0x91 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_92 }, /* 0x92 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_93 }, /* 0x93 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_94 }, /* 0x94 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_95 }, /* 0x95 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_96 }, /* 0x96 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_97 }, /* 0x97 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_98 }, /* 0x98 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_99 }, /* 0x99 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9A }, /* 0x9A */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9B }, /* 0x9B */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9C }, /* 0x9C */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9D }, /* 0x9D */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9E }, /* 0x9E */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9F }, /* 0x9F */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_A0 }, /* 0xA0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A1 }, /* 0xA1 */
+ { 0, 0xA1, 0xFC, aImplDBCSToUniTab_GB_A2 }, /* 0xA2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A3 }, /* 0xA3 */
+ { 0, 0xA1, 0xF3, aImplDBCSToUniTab_GB_A4 }, /* 0xA4 */
+ { 0, 0xA1, 0xF6, aImplDBCSToUniTab_GB_A5 }, /* 0xA5 */
+ { 0, 0xA1, 0xF5, aImplDBCSToUniTab_GB_A6 }, /* 0xA6 */
+ { 0, 0xA1, 0xF1, aImplDBCSToUniTab_GB_A7 }, /* 0xA7 */
+ { 0, 0x40, 0xE9, aImplDBCSToUniTab_GBK_A8 }, /* 0xA8 */
+ { 0, 0x40, 0xEF, aImplDBCSToUniTab_GBK_A9 }, /* 0xA9 */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AA }, /* 0xAA */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AB }, /* 0xAB */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AC }, /* 0xAC */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AD }, /* 0xAD */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AE }, /* 0xAE */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AF }, /* 0xAF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B0 }, /* 0xB0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B1 }, /* 0xB1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B2 }, /* 0xB2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B3 }, /* 0xB3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B4 }, /* 0xB4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B5 }, /* 0xB5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B6 }, /* 0xB6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B7 }, /* 0xB7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B8 }, /* 0xB8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B9 }, /* 0xB9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BA }, /* 0xBA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BB }, /* 0xBB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BC }, /* 0xBC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BD }, /* 0xBD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BE }, /* 0xBE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BF }, /* 0xBF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C0 }, /* 0xC0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C1 }, /* 0xC1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C2 }, /* 0xC2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C3 }, /* 0xC3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C4 }, /* 0xC4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C5 }, /* 0xC5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C6 }, /* 0xC6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C7 }, /* 0xC7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C8 }, /* 0xC8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C9 }, /* 0xC9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CA }, /* 0xCA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CB }, /* 0xCB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CC }, /* 0xCC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CD }, /* 0xCD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CE }, /* 0xCE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CF }, /* 0xCF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D0 }, /* 0xD0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D1 }, /* 0xD1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D2 }, /* 0xD2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D3 }, /* 0xD3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D4 }, /* 0xD4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D5 }, /* 0xD5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D6 }, /* 0xD6 */
+ { 0, 0x40, 0xF9, aImplDBCSToUniTab_GBK_D7 }, /* 0xD7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D8 }, /* 0xD8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D9 }, /* 0xD9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DA }, /* 0xDA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DB }, /* 0xDB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DC }, /* 0xDC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DD }, /* 0xDD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DE }, /* 0xDE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DF }, /* 0xDF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E0 }, /* 0xE0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E1 }, /* 0xE1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E2 }, /* 0xE2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E3 }, /* 0xE3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E4 }, /* 0xE4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E5 }, /* 0xE5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E6 }, /* 0xE6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E7 }, /* 0xE7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E8 }, /* 0xE8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E9 }, /* 0xE9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EA }, /* 0xEA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EB }, /* 0xEB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EC }, /* 0xEC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_ED }, /* 0xED */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EE }, /* 0xEE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EF }, /* 0xEF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F0 }, /* 0xF0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F1 }, /* 0xF1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F2 }, /* 0xF2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F3 }, /* 0xF3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F4 }, /* 0xF4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F5 }, /* 0xF5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F6 }, /* 0xF6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F7 }, /* 0xF7 */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_F8 }, /* 0xF8 */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_F9 }, /* 0xF9 */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_FA }, /* 0xFA */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_FB }, /* 0xFB */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_FC }, /* 0xFC */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_FD }, /* 0xFD */
+ { 0, 0x40, 0x9F, aImplDBCSToUniTab_GBK_FE }, /* 0xFE */
+ { 0, 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aGBKDBCSHighTab[256] =
+{
+ { 0x00, 0xFC, aImplUniToDBCSTab_GB_00 }, /* 0x00 */
+ { 0x01, 0xDC, aImplUniToDBCSTab_GB_01 }, /* 0x01 */
+ { 0x51, 0xD9, aImplUniToDBCSTab_GBK_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_GB_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_GB_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 0x3F, 0x3F, aImplUniToDBCSTab_APPLECHINSIMP_1E }, /* 0x1E */ /* we convert this char also to unicode */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x10, 0xAC, aImplUniToDBCSTab_GBK_20 }, /* 0x20 */
+ { 0x03, 0x99, aImplUniToDBCSTab_GBK_21 }, /* 0x21 */
+ { 0x08, 0xEF, aImplUniToDBCSTab_GBK_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_GB_23 }, /* 0x23 */
+ { 0x60, 0x9B, aImplUniToDBCSTab_GB_24 }, /* 0x24 */
+ { 0x00, 0xE5, aImplUniToDBCSTab_GBK_25 }, /* 0x25 */
+ { 0x05, 0x42, aImplUniToDBCSTab_GBK_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 0x81, 0xCA, aImplUniToDBCSTab_GBK_2E }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GBK_30 }, /* 0x30 */
+ { 0x05, 0x29, aImplUniToDBCSTab_GB_31 }, /* 0x31 */
+ { 0x20, 0xA3, aImplUniToDBCSTab_GBK_32 }, /* 0x32 */
+ { 0x8E, 0xD5, aImplUniToDBCSTab_GBK_33 }, /* 0x33 */
+ { 0x47, 0x73, aImplUniToDBCSTab_GBK_34 }, /* 0x34 */
+ { 0x9E, 0x9E, aImplUniToDBCSTab_GBK_35 }, /* 0x35 */
+ { 0x0E, 0x1A, aImplUniToDBCSTab_GBK_36 }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 0x18, 0xDF, aImplUniToDBCSTab_GBK_39 }, /* 0x39 */
+ { 0x73, 0x73, aImplUniToDBCSTab_GBK_3A }, /* 0x3A */
+ { 0x4E, 0x4E, aImplUniToDBCSTab_GBK_3B }, /* 0x3B */
+ { 0x6E, 0xE0, aImplUniToDBCSTab_GBK_3C }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 0x56, 0x56, aImplUniToDBCSTab_GBK_40 }, /* 0x40 */
+ { 0x5F, 0x5F, aImplUniToDBCSTab_GBK_41 }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 0x37, 0xDD, aImplUniToDBCSTab_GBK_43 }, /* 0x43 */
+ { 0xD6, 0xD6, aImplUniToDBCSTab_GBK_44 }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 0x4C, 0x61, aImplUniToDBCSTab_GBK_46 }, /* 0x46 */
+ { 0x23, 0x8D, aImplUniToDBCSTab_GBK_47 }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 0x47, 0xB7, aImplUniToDBCSTab_GBK_49 }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 0x77, 0xA3, aImplUniToDBCSTab_GBK_4C }, /* 0x4C */
+ { 0x13, 0xAE, aImplUniToDBCSTab_GBK_4D }, /* 0x4D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_4E }, /* 0x4E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_4F }, /* 0x4F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_50 }, /* 0x50 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_52 }, /* 0x52 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_53 }, /* 0x53 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_54 }, /* 0x54 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_55 }, /* 0x55 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_56 }, /* 0x56 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_57 }, /* 0x57 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_58 }, /* 0x58 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_59 }, /* 0x59 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5A }, /* 0x5A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5B }, /* 0x5B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5C }, /* 0x5C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5D }, /* 0x5D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5E }, /* 0x5E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5F }, /* 0x5F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_62 }, /* 0x62 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_63 }, /* 0x63 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_64 }, /* 0x64 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_67 }, /* 0x67 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_68 }, /* 0x68 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_69 }, /* 0x69 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6A }, /* 0x6A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6B }, /* 0x6B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6C }, /* 0x6C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6D }, /* 0x6D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6E }, /* 0x6E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6F }, /* 0x6F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_70 }, /* 0x70 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_71 }, /* 0x71 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_72 }, /* 0x72 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_73 }, /* 0x73 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_74 }, /* 0x74 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_75 }, /* 0x75 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_76 }, /* 0x76 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_77 }, /* 0x77 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_78 }, /* 0x78 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7A }, /* 0x7A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7B }, /* 0x7B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7C }, /* 0x7C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7D }, /* 0x7D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7E }, /* 0x7E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7F }, /* 0x7F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_80 }, /* 0x80 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_81 }, /* 0x81 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_82 }, /* 0x82 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_83 }, /* 0x83 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_84 }, /* 0x84 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_85 }, /* 0x85 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_86 }, /* 0x86 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_87 }, /* 0x87 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_88 }, /* 0x88 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_89 }, /* 0x89 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8A }, /* 0x8A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8B }, /* 0x8B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8C }, /* 0x8C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8D }, /* 0x8D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8E }, /* 0x8E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8F }, /* 0x8F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_90 }, /* 0x90 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_91 }, /* 0x91 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_92 }, /* 0x92 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_93 }, /* 0x93 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_94 }, /* 0x94 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_95 }, /* 0x95 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_97 }, /* 0x97 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_98 }, /* 0x98 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_99 }, /* 0x99 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9A }, /* 0x9A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9B }, /* 0x9B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9C }, /* 0x9C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9D }, /* 0x9D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9E }, /* 0x9E */
+ { 0x00, 0xA5, aImplUniToDBCSTab_GBK_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 0x2C, 0xF1, aImplUniToDBCSTab_GBK_F9 }, /* 0xF9 */
+ { 0x0C, 0x29, aImplUniToDBCSTab_GBK_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x30, 0x6B, aImplUniToDBCSTab_GBK_FE }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_GBK_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplGBKDBCSCvtData =
+{
+ aGBKUniLeadTab,
+ aGBKDBCSHighTab,
+ 0x00, 0xFF,
+ 0x40, 0xFE,
+ aImplMS936DBCSEUDCTab,
+ DBCS_EUDC_MS936_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplGBKTextEncodingData
+ = { { &aImplGBKDBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 134,
+ "euc-cn",
+ "GBK",
+ RTL_TEXTENCODING_INFO_MULTIBYTE | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CHINESE_SIMPLIFIED, pc code page 936, mac encoding 25 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aMS936UniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0x20AC, 0, 0, NULL }, /* 0x80 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_81 }, /* 0x81 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_82 }, /* 0x82 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_83 }, /* 0x83 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_84 }, /* 0x84 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_85 }, /* 0x85 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_86 }, /* 0x86 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_87 }, /* 0x87 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_88 }, /* 0x88 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_89 }, /* 0x89 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8A }, /* 0x8A */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8B }, /* 0x8B */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8C }, /* 0x8C */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8D }, /* 0x8D */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8E }, /* 0x8E */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_8F }, /* 0x8F */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_90 }, /* 0x90 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_91 }, /* 0x91 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_92 }, /* 0x92 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_93 }, /* 0x93 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_94 }, /* 0x94 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_95 }, /* 0x95 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_96 }, /* 0x96 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_97 }, /* 0x97 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_98 }, /* 0x98 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_99 }, /* 0x99 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9A }, /* 0x9A */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9B }, /* 0x9B */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9C }, /* 0x9C */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9D }, /* 0x9D */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9E }, /* 0x9E */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_9F }, /* 0x9F */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_A0 }, /* 0xA0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A1 }, /* 0xA1 */
+ { 0, 0xA1, 0xFC, aImplDBCSToUniTab_GB_A2 }, /* 0xA2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A3 }, /* 0xA3 */
+ { 0, 0xA1, 0xF3, aImplDBCSToUniTab_GB_A4 }, /* 0xA4 */
+ { 0, 0xA1, 0xF6, aImplDBCSToUniTab_GB_A5 }, /* 0xA5 */
+ { 0, 0xA1, 0xF5, aImplDBCSToUniTab_GB_A6 }, /* 0xA6 */
+ { 0, 0xA1, 0xF1, aImplDBCSToUniTab_GB_A7 }, /* 0xA7 */
+ { 0, 0x40, 0xE9, aImplDBCSToUniTab_GBK_A8 }, /* 0xA8 */
+ { 0, 0x40, 0xEF, aImplDBCSToUniTab_GBK_A9 }, /* 0xA9 */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AA }, /* 0xAA */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AB }, /* 0xAB */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AC }, /* 0xAC */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AD }, /* 0xAD */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AE }, /* 0xAE */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_AF }, /* 0xAF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B0 }, /* 0xB0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B1 }, /* 0xB1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B2 }, /* 0xB2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B3 }, /* 0xB3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B4 }, /* 0xB4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B5 }, /* 0xB5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B6 }, /* 0xB6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B7 }, /* 0xB7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B8 }, /* 0xB8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_B9 }, /* 0xB9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BA }, /* 0xBA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BB }, /* 0xBB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BC }, /* 0xBC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BD }, /* 0xBD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BE }, /* 0xBE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_BF }, /* 0xBF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C0 }, /* 0xC0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C1 }, /* 0xC1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C2 }, /* 0xC2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C3 }, /* 0xC3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C4 }, /* 0xC4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C5 }, /* 0xC5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C6 }, /* 0xC6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C7 }, /* 0xC7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C8 }, /* 0xC8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_C9 }, /* 0xC9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CA }, /* 0xCA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CB }, /* 0xCB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CC }, /* 0xCC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CD }, /* 0xCD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CE }, /* 0xCE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_CF }, /* 0xCF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D0 }, /* 0xD0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D1 }, /* 0xD1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D2 }, /* 0xD2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D3 }, /* 0xD3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D4 }, /* 0xD4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D5 }, /* 0xD5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D6 }, /* 0xD6 */
+ { 0, 0x40, 0xF9, aImplDBCSToUniTab_GBK_D7 }, /* 0xD7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D8 }, /* 0xD8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_D9 }, /* 0xD9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DA }, /* 0xDA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DB }, /* 0xDB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DC }, /* 0xDC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DD }, /* 0xDD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DE }, /* 0xDE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_DF }, /* 0xDF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E0 }, /* 0xE0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E1 }, /* 0xE1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E2 }, /* 0xE2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E3 }, /* 0xE3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E4 }, /* 0xE4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E5 }, /* 0xE5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E6 }, /* 0xE6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E7 }, /* 0xE7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E8 }, /* 0xE8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_E9 }, /* 0xE9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EA }, /* 0xEA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EB }, /* 0xEB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EC }, /* 0xEC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_ED }, /* 0xED */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EE }, /* 0xEE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_EF }, /* 0xEF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F0 }, /* 0xF0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F1 }, /* 0xF1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F2 }, /* 0xF2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F3 }, /* 0xF3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F4 }, /* 0xF4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F5 }, /* 0xF5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F6 }, /* 0xF6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_GBK_F7 }, /* 0xF7 */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_F8 }, /* 0xF8 */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_F9 }, /* 0xF9 */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_FA }, /* 0xFA */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_FB }, /* 0xFB */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_FC }, /* 0xFC */
+ { 0, 0x40, 0xA0, aImplDBCSToUniTab_GBK_FD }, /* 0xFD */
+ { 0, 0x40, 0x4F, aImplDBCSToUniTab_GBK_FE }, /* 0xFE */
+ { 0, 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aMS936DBCSHighTab[256] =
+{
+ { 0x00, 0xFC, aImplUniToDBCSTab_GB_00 }, /* 0x00 */
+ { 0x01, 0xDC, aImplUniToDBCSTab_GB_01 }, /* 0x01 */
+ { 0x51, 0xD9, aImplUniToDBCSTab_GBK_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_GB_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_GB_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 0x3F, 0x3F, aImplUniToDBCSTab_APPLECHINSIMP_1E }, /* 0x1E */ /* we convert this char also to unicode */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x10, 0xAC, aImplUniToDBCSTab_GBK_20 }, /* 0x20 */
+ { 0x03, 0x99, aImplUniToDBCSTab_GBK_21 }, /* 0x21 */
+ { 0x08, 0xEF, aImplUniToDBCSTab_GBK_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_GB_23 }, /* 0x23 */
+ { 0x60, 0x9B, aImplUniToDBCSTab_GB_24 }, /* 0x24 */
+ { 0x00, 0xE5, aImplUniToDBCSTab_GBK_25 }, /* 0x25 */
+ { 0x05, 0x42, aImplUniToDBCSTab_GBK_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GBK_30 }, /* 0x30 */
+ { 0x05, 0x29, aImplUniToDBCSTab_GB_31 }, /* 0x31 */
+ { 0x20, 0xA3, aImplUniToDBCSTab_GBK_32 }, /* 0x32 */
+ { 0x8E, 0xD5, aImplUniToDBCSTab_GBK_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_4E }, /* 0x4E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_4F }, /* 0x4F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_50 }, /* 0x50 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_52 }, /* 0x52 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_53 }, /* 0x53 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_54 }, /* 0x54 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_55 }, /* 0x55 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_56 }, /* 0x56 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_57 }, /* 0x57 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_58 }, /* 0x58 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_59 }, /* 0x59 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5A }, /* 0x5A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5B }, /* 0x5B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5C }, /* 0x5C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5D }, /* 0x5D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5E }, /* 0x5E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_5F }, /* 0x5F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_62 }, /* 0x62 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_63 }, /* 0x63 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_64 }, /* 0x64 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_67 }, /* 0x67 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_68 }, /* 0x68 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_69 }, /* 0x69 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6A }, /* 0x6A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6B }, /* 0x6B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6C }, /* 0x6C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6D }, /* 0x6D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6E }, /* 0x6E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_6F }, /* 0x6F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_70 }, /* 0x70 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_71 }, /* 0x71 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_72 }, /* 0x72 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_73 }, /* 0x73 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_74 }, /* 0x74 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_75 }, /* 0x75 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_76 }, /* 0x76 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_77 }, /* 0x77 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_78 }, /* 0x78 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7A }, /* 0x7A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7B }, /* 0x7B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7C }, /* 0x7C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7D }, /* 0x7D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7E }, /* 0x7E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_7F }, /* 0x7F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_80 }, /* 0x80 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_81 }, /* 0x81 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_82 }, /* 0x82 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_83 }, /* 0x83 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_84 }, /* 0x84 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_85 }, /* 0x85 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_86 }, /* 0x86 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_87 }, /* 0x87 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_88 }, /* 0x88 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_89 }, /* 0x89 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8A }, /* 0x8A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8B }, /* 0x8B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8C }, /* 0x8C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8D }, /* 0x8D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8E }, /* 0x8E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_8F }, /* 0x8F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_90 }, /* 0x90 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_91 }, /* 0x91 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_92 }, /* 0x92 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_93 }, /* 0x93 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_94 }, /* 0x94 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_95 }, /* 0x95 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_97 }, /* 0x97 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_98 }, /* 0x98 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_99 }, /* 0x99 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9A }, /* 0x9A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9B }, /* 0x9B */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9C }, /* 0x9C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9D }, /* 0x9D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GBK_9E }, /* 0x9E */
+ { 0x00, 0xA5, aImplUniToDBCSTab_GBK_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 0x2C, 0xF1, aImplUniToDBCSTab_GBK_F9 }, /* 0xF9 */
+ { 0x0C, 0x29, aImplUniToDBCSTab_GBK_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x30, 0x6B, aImplUniToDBCSTab_GBK_FE }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_GBK_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplMS936DBCSCvtData =
+{
+ aMS936UniLeadTab,
+ aMS936DBCSHighTab,
+ 0x00, 0xFF,
+ 0x40, 0xFE,
+ aImplMS936DBCSEUDCTab,
+ DBCS_EUDC_MS936_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS936TextEncodingData
+ = { { &aImplMS936DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 134,
+ "euc-cn",
+ "gb2312",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* WIN/DOS/OS2, SCRIPT_CHINESE_SIMPLIFIED, pc code page 936, mac encoding
+ 25 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aAPPLECHINSIMPUniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0, 1, 0, NULL }, /* 0x80 */
+ { 0xF880, 0, 0, NULL }, /* 0x81 */
+ { 0xF881, 0, 0, NULL }, /* 0x82 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x83 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x84 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x85 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x86 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x87 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x88 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x89 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x90 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x91 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x92 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x93 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x94 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x95 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x96 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x97 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x98 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x99 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9F */ /* We convert this as double byte */
+ { 0x00A0, 0, 0, NULL }, /* 0xA0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A1 }, /* 0xA1 */
+ { 0, 0xA1, 0xFC, aImplDBCSToUniTab_GB_A2 }, /* 0xA2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GB_A3 }, /* 0xA3 */
+ { 0, 0xA1, 0xF3, aImplDBCSToUniTab_GB_A4 }, /* 0xA4 */
+ { 0, 0xA1, 0xF6, aImplDBCSToUniTab_GB_A5 }, /* 0xA5 */
+ { 0, 0xA1, 0xF5, aImplDBCSToUniTab_GB_A6 }, /* 0xA6 */
+ { 0, 0xA1, 0xF1, aImplDBCSToUniTab_GB_A7 }, /* 0xA7 */
+ { 0, 0xA1, 0xE9, aImplDBCSToUniTab_GBK_A8+GBKOFF }, /* 0xA8 */
+ { 0, 0xA1, 0xEF, aImplDBCSToUniTab_GBK_A9+GBKOFF }, /* 0xA9 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAC */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAD */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAE */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xAF */ /* We convert this as double byte */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B0+GBKOFF }, /* 0xB0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B1+GBKOFF }, /* 0xB1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B2+GBKOFF }, /* 0xB2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B3+GBKOFF }, /* 0xB3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B4+GBKOFF }, /* 0xB4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B5+GBKOFF }, /* 0xB5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B6+GBKOFF }, /* 0xB6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B7+GBKOFF }, /* 0xB7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B8+GBKOFF }, /* 0xB8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_B9+GBKOFF }, /* 0xB9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BA+GBKOFF }, /* 0xBA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BB+GBKOFF }, /* 0xBB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BC+GBKOFF }, /* 0xBC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BD+GBKOFF }, /* 0xBD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BE+GBKOFF }, /* 0xBE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_BF+GBKOFF }, /* 0xBF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C0+GBKOFF }, /* 0xC0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C1+GBKOFF }, /* 0xC1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C2+GBKOFF }, /* 0xC2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C3+GBKOFF }, /* 0xC3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C4+GBKOFF }, /* 0xC4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C5+GBKOFF }, /* 0xC5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C6+GBKOFF }, /* 0xC6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C7+GBKOFF }, /* 0xC7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C8+GBKOFF }, /* 0xC8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_C9+GBKOFF }, /* 0xC9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CA+GBKOFF }, /* 0xCA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CB+GBKOFF }, /* 0xCB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CC+GBKOFF }, /* 0xCC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CD+GBKOFF }, /* 0xCD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CE+GBKOFF }, /* 0xCE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_CF+GBKOFF }, /* 0xCF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D0+GBKOFF }, /* 0xD0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D1+GBKOFF }, /* 0xD1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D2+GBKOFF }, /* 0xD2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D3+GBKOFF }, /* 0xD3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D4+GBKOFF }, /* 0xD4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D5+GBKOFF }, /* 0xD5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D6+GBKOFF }, /* 0xD6 */
+ { 0, 0xA1, 0xF9, aImplDBCSToUniTab_GBK_D7+GBKOFF }, /* 0xD7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D8+GBKOFF }, /* 0xD8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_D9+GBKOFF }, /* 0xD9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DA+GBKOFF }, /* 0xDA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DB+GBKOFF }, /* 0xDB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DC+GBKOFF }, /* 0xDC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DD+GBKOFF }, /* 0xDD */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DE+GBKOFF }, /* 0xDE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_DF+GBKOFF }, /* 0xDF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E0+GBKOFF }, /* 0xE0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E1+GBKOFF }, /* 0xE1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E2+GBKOFF }, /* 0xE2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E3+GBKOFF }, /* 0xE3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E4+GBKOFF }, /* 0xE4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E5+GBKOFF }, /* 0xE5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E6+GBKOFF }, /* 0xE6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E7+GBKOFF }, /* 0xE7 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E8+GBKOFF }, /* 0xE8 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_E9+GBKOFF }, /* 0xE9 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EA+GBKOFF }, /* 0xEA */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EB+GBKOFF }, /* 0xEB */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EC+GBKOFF }, /* 0xEC */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_ED+GBKOFF }, /* 0xED */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EE+GBKOFF }, /* 0xEE */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_EF+GBKOFF }, /* 0xEF */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F0+GBKOFF }, /* 0xF0 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F1+GBKOFF }, /* 0xF1 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F2+GBKOFF }, /* 0xF2 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F3+GBKOFF }, /* 0xF3 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F4+GBKOFF }, /* 0xF4 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F5+GBKOFF }, /* 0xF5 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F6+GBKOFF }, /* 0xF6 */
+ { 0, 0xA1, 0xFE, aImplDBCSToUniTab_GBK_F7+GBKOFF }, /* 0xF7 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF8 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xF9 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFC */ /* We convert this as double byte */
+ { 0x00A9, 0, 0, NULL }, /* 0xFD */
+ { 0x2122, 0, 0, NULL }, /* 0xFE */
+ { 0x2026, 0, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aAPPLECHINSIMPDBCSHighTab[256] =
+{
+ { 0x00, 0xFC, aImplUniToDBCSTab_APPLECHINSIMP_00 }, /* 0x00 */
+ { 0x01, 0xDC, aImplUniToDBCSTab_GB_01 }, /* 0x01 */
+ { 0x51, 0xC9, aImplUniToDBCSTab_GB_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_GB_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_GB_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 0x3F, 0x3F, aImplUniToDBCSTab_APPLECHINSIMP_1E }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x14, 0x3E, aImplUniToDBCSTab_GB_20 }, /* 0x20 */
+ { 0x03, 0x93, aImplUniToDBCSTab_APPLECHINSIMP_21 }, /* 0x21 */
+ { 0x08, 0xEF, aImplUniToDBCSTab_GB_22 }, /* 0x22 */
+ { 0x12, 0x12, aImplUniToDBCSTab_GB_23 }, /* 0x23 */
+ { 0x60, 0x9B, aImplUniToDBCSTab_GB_24 }, /* 0x24 */
+ { 0x00, 0xCF, aImplUniToDBCSTab_GB_25 }, /* 0x25 */
+ { 0x05, 0x42, aImplUniToDBCSTab_GB_26 }, /* 0x26 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFB, aImplUniToDBCSTab_GB_30 }, /* 0x30 */
+ { 0x05, 0x29, aImplUniToDBCSTab_GB_31 }, /* 0x31 */
+ { 0x20, 0x29, aImplUniToDBCSTab_GBK_32 }, /* 0x32 */
+ { 1, 0, NULL }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_4E }, /* 0x4E */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GB_4F }, /* 0x4F */
+ { 0x0C, 0xFB, aImplUniToDBCSTab_GB_50 }, /* 0x50 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_GB_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_52 }, /* 0x52 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_GB_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_54 }, /* 0x54 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_GB_55 }, /* 0x55 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_56 }, /* 0x56 */
+ { 0x03, 0xFD, aImplUniToDBCSTab_GB_57 }, /* 0x57 */
+ { 0x00, 0xF9, aImplUniToDBCSTab_GB_58 }, /* 0x58 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_GB_59 }, /* 0x59 */
+ { 0x01, 0xF1, aImplUniToDBCSTab_GB_5A }, /* 0x5A */
+ { 0x09, 0xFF, aImplUniToDBCSTab_GB_5B }, /* 0x5B */
+ { 0x01, 0xFB, aImplUniToDBCSTab_GB_5C }, /* 0x5C */
+ { 0x02, 0xFE, aImplUniToDBCSTab_GB_5D }, /* 0x5D */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_5E }, /* 0x5E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_5F }, /* 0x5F */
+ { 0x00, 0xFA, aImplUniToDBCSTab_GB_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_61 }, /* 0x61 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_GB_62 }, /* 0x62 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_63 }, /* 0x63 */
+ { 0x00, 0xE6, aImplUniToDBCSTab_GB_64 }, /* 0x64 */
+ { 0x00, 0xFA, aImplUniToDBCSTab_GB_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_67 }, /* 0x67 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_GB_68 }, /* 0x68 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_69 }, /* 0x69 */
+ { 0x0A, 0xAC, aImplUniToDBCSTab_GB_6A }, /* 0x6A */
+ { 0x20, 0xFD, aImplUniToDBCSTab_GB_6B }, /* 0x6B */
+ { 0x05, 0xFE, aImplUniToDBCSTab_GB_6C }, /* 0x6C */
+ { 0x01, 0xFC, aImplUniToDBCSTab_GB_6D }, /* 0x6D */
+ { 0x05, 0xF9, aImplUniToDBCSTab_GB_6E }, /* 0x6E */
+ { 0x02, 0xEF, aImplUniToDBCSTab_GB_6F }, /* 0x6F */
+ { 0x11, 0xFD, aImplUniToDBCSTab_GB_70 }, /* 0x70 */
+ { 0x09, 0xF9, aImplUniToDBCSTab_GB_71 }, /* 0x71 */
+ { 0x06, 0xFC, aImplUniToDBCSTab_GB_72 }, /* 0x72 */
+ { 0x01, 0xF2, aImplUniToDBCSTab_GB_73 }, /* 0x73 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_GB_74 }, /* 0x74 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_GB_75 }, /* 0x75 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_76 }, /* 0x76 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_77 }, /* 0x77 */
+ { 0x00, 0xFA, aImplUniToDBCSTab_GB_78 }, /* 0x78 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_GB_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_GB_7A }, /* 0x7A */
+ { 0x03, 0xFE, aImplUniToDBCSTab_GB_7B }, /* 0x7B */
+ { 0x07, 0xFB, aImplUniToDBCSTab_GB_7C }, /* 0x7C */
+ { 0x0A, 0xAE, aImplUniToDBCSTab_GB_7D }, /* 0x7D */
+ { 0x3B, 0xFF, aImplUniToDBCSTab_GB_7E }, /* 0x7E */
+ { 0x00, 0xFC, aImplUniToDBCSTab_GB_7F }, /* 0x7F */
+ { 0x00, 0xFD, aImplUniToDBCSTab_GB_80 }, /* 0x80 */
+ { 0x02, 0xFE, aImplUniToDBCSTab_GB_81 }, /* 0x81 */
+ { 0x00, 0xFB, aImplUniToDBCSTab_GB_82 }, /* 0x82 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_GB_83 }, /* 0x83 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_GB_84 }, /* 0x84 */
+ { 0x0C, 0xFF, aImplUniToDBCSTab_GB_85 }, /* 0x85 */
+ { 0x05, 0xFE, aImplUniToDBCSTab_GB_86 }, /* 0x86 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_87 }, /* 0x87 */
+ { 0x03, 0xFE, aImplUniToDBCSTab_GB_88 }, /* 0x88 */
+ { 0x02, 0xF3, aImplUniToDBCSTab_GB_89 }, /* 0x89 */
+ { 0x00, 0x93, aImplUniToDBCSTab_GB_8A }, /* 0x8A */
+ { 0x07, 0xFF, aImplUniToDBCSTab_GB_8B }, /* 0x8B */
+ { 0x00, 0x98, aImplUniToDBCSTab_GB_8C }, /* 0x8C */
+ { 0x1D, 0xFD, aImplUniToDBCSTab_GB_8D }, /* 0x8D */
+ { 0x05, 0xCE, aImplUniToDBCSTab_GB_8E }, /* 0x8E */
+ { 0x66, 0xFD, aImplUniToDBCSTab_GB_8F }, /* 0x8F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_90 }, /* 0x90 */
+ { 0x02, 0xDC, aImplUniToDBCSTab_GB_91 }, /* 0x91 */
+ { 0x74, 0xC8, aImplUniToDBCSTab_GB_92 }, /* 0x92 */
+ { 0x3E, 0xD6, aImplUniToDBCSTab_GB_93 }, /* 0x93 */
+ { 0x3E, 0xFF, aImplUniToDBCSTab_GB_94 }, /* 0x94 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_95 }, /* 0x95 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_GB_96 }, /* 0x96 */
+ { 0x00, 0xF6, aImplUniToDBCSTab_GB_97 }, /* 0x97 */
+ { 0x75, 0xE9, aImplUniToDBCSTab_GB_98 }, /* 0x98 */
+ { 0x0D, 0xA8, aImplUniToDBCSTab_GB_99 }, /* 0x99 */
+ { 0x6C, 0xFB, aImplUniToDBCSTab_GB_9A }, /* 0x9A */
+ { 0x03, 0x54, aImplUniToDBCSTab_GB_9B }, /* 0x9B */
+ { 0x7C, 0xE2, aImplUniToDBCSTab_GB_9C }, /* 0x9C */
+ { 1, 0, NULL }, /* 0x9D */
+ { 0x1F, 0xFE, aImplUniToDBCSTab_GB_9E }, /* 0x9E */
+ { 0x0B, 0xA0, aImplUniToDBCSTab_GB_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 0x80, 0x81, aImplUniToDBCSTab_APPLECHINSIMP_F8 }, /* 0xF8 */
+ { 1, 0, NULL }, /* 0xF9 */
+ { 1, 0, NULL }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x31, 0x44, aImplUniToDBCSTab_GB_FE }, /* 0xFE */
+ { 0x01, 0xE5, aImplUniToDBCSTab_GB_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplAPPLECHINSIMPDBCSCvtData =
+{
+ aAPPLECHINSIMPUniLeadTab,
+ aAPPLECHINSIMPDBCSHighTab,
+ 0x00, 0xFF,
+ 0xA1, 0xFE,
+ NULL,
+ 0
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLECHINSIMPTextEncodingData
+ = { { &aImplAPPLECHINSIMPDBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 134,
+ "euc-cn",
+ "gb2312",
+ RTL_TEXTENCODING_INFO_ASCII | RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* MAC, SCRIPT_CHINESE_SIMPLIFIED, pc code page 936, mac encoding 25 */
diff --git a/sal/textenc/tcvtsym1.tab b/sal/textenc/tcvtsym1.tab
new file mode 100644
index 000000000000..6bbeb62ac55a
--- /dev/null
+++ b/sal/textenc/tcvtsym1.tab
@@ -0,0 +1,47 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* Symbol Font Encodings */
+
+static ImplTextEncodingData const aImplSYMBOLTextEncodingData
+ = { { NULL,
+ ImplSymbolToUnicode,
+ ImplUnicodeToSymbol,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 1,
+ 1,
+ 2,
+ "adobe-fontspecific",
+ "invariant",
+ RTL_TEXTENCODING_INFO_SYMBOL };
+ /* SCRIPT_SYMBOL, pc code page 65400, mac encoding 32 */
diff --git a/sal/textenc/tcvttcn1.tab b/sal/textenc/tcvttcn1.tab
new file mode 100644
index 000000000000..18d96b090393
--- /dev/null
+++ b/sal/textenc/tcvttcn1.tab
@@ -0,0 +1,2894 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the DBCS to UniCode tables for the following */
+/* chinese traditional (Taiwan/HongKong) charsets: */
+/* BIG5, MS950, APPLE_CHINTRAD */
+
+/* ======================================================================= */
+
+/* Changes: */
+/* A1_45: MS950 == 0x2027, APPLE_CHINTRAD == 0x00B7 - we use in all systems 0x2027 for better MS compatibility */
+/* A1_4B: MS950 == 0x2026, APPLE_CHINTRAD == 0x22EF - we use in all systems 0x2026 for better MS compatibility */
+/* A1_4B: MS950 == 0x2026, APPLE_CHINTRAD == 0x22EF - we use in all systems 0x2026 for better MS compatibility */
+/* A1_C2: MS950 == 0x00AF, APPLE_CHINTRAD == 0x203E - we use in all systems 0x00AF for better MS compatibility */
+/* A1_E3: MS950 == 0xFF5E, APPLE_CHINTRAD == 0x223C - we use in all systems 0xFF5E for better MS compatibility */
+/* A1_F3: MS950 == 0x2299, APPLE_CHINTRAD == 0x2609 - we use in all systems 0x2299 for better MS compatibility */
+/* A1_4D-A1_54, A1_5A, A1_75-A1_76, A1_A1-A1_A4, A1_C3, A1_C5, A1_CB, A1_FE: is MS950 extension */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2027, 0xFF1B, 0xFF1A, /* 0x40 */
+ 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFE51, 0xFE52, /* 0x40 */
+ 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31, /* 0x50 */
+ 0x2014, 0xFE33, 0x2574, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35, /* 0x50 */
+ 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39, /* 0x60 */
+ 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D, /* 0x60 */
+ 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41, /* 0x70 */
+ 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C, /* 0xA0 */
+ 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A, /* 0xA0 */
+ 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE, /* 0xB0 */
+ 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC, /* 0xB0 */
+ 0x32A3, 0x2105, 0x00AF, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49, 0xFE4A, /* 0xC0 */
+ 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B, /* 0xC0 */
+ 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D, /* 0xD0 */
+ 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63, /* 0xD0 */
+ 0xFE64, 0xFE65, 0xFE66, 0xFF5E, 0x2229, 0x222A, 0x22A5, 0x2220, /* 0xE0 */
+ 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234, /* 0xE0 */
+ 0x2640, 0x2642, 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, /* 0xF0 */
+ 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* A2_41: MS950 == 0x2215, APPLE_CHINTRAD == 0xFF0F - we use in all systems 0x2215 for better MS compatibility */
+/* A2_42: MS950 == 0xFE68, APPLE_CHINTRAD == 0xFF3C - we use in all systems 0xFE68 for better MS compatibility */
+/* A2_44: MS950 == 0xFFE5, APPLE_CHINTRAD == 0x00A5 - we use in all systems 0xFFE5 for better MS compatibility */
+/* A2_44: MS950 == 0xFFE5, APPLE_CHINTRAD == 0x00A5 - we use in all systems 0xFFE5 for better MS compatibility */
+/* A2_46: MS950 == 0xFFE0, APPLE_CHINTRAD == 0x00A2 - we use in all systems 0xFFE0 for better MS compatibility */
+/* A2_47: MS950 == 0xFFE1, APPLE_CHINTRAD == 0x00A3 - we use in all systems 0xFFE1 for better MS compatibility */
+/* A2_47: MS950 == 0xFFE1, APPLE_CHINTRAD == 0x00A3 - we use in all systems 0xFFE1 for better MS compatibility */
+/* A2_40, A2_79, A2_CC, A2_CE: is MS950 extension */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF3C, 0x2215, 0xFE68, 0xFF04, 0xFFE5, 0x3012, 0xFFE0, 0xFFE1, /* 0x40 */
+ 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5, /* 0x40 */
+ 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4, /* 0x50 */
+ 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7, /* 0x50 */
+ 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, /* 0x60 */
+ 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A, /* 0x60 */
+ 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500, /* 0x70 */
+ 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, /* 0xA0 */
+ 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, /* 0xA0 */
+ 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, /* 0xB0 */
+ 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, /* 0xB0 */
+ 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, /* 0xC0 */
+ 0x3026, 0x3027, 0x3028, 0x3029, 0x5341, 0x5344, 0x5345, 0xFF21, /* 0xC0 */
+ 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, /* 0xD0 */
+ 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, /* 0xD0 */
+ 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, /* 0xE0 */
+ 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, /* 0xE0 */
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, /* 0xF0 */
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* Added EURO SIGN from cp950.txt (01/07/2000) at 0xA3E1 */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, /* 0x40 */
+ 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, /* 0x40 */
+ 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, /* 0x50 */
+ 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, /* 0x50 */
+ 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, /* 0x60 */
+ 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, /* 0x60 */
+ 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, 0x3107, 0x3108, /* 0x70 */
+ 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, /* 0xA0 */
+ 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, /* 0xA0 */
+ 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, /* 0xB0 */
+ 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0x20AC, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C, /* 0x40 */
+ 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B, /* 0x40 */
+ 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A, /* 0x50 */
+ 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E, /* 0x50 */
+ 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F, /* 0x60 */
+ 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8, /* 0x60 */
+ 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2, /* 0x70 */
+ 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B, /* 0xA0 */
+ 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1, /* 0xA0 */
+ 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4, /* 0xB0 */
+ 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6, /* 0xB0 */
+ 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339, /* 0xC0 */
+ 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD, /* 0xC0 */
+ 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24, /* 0xD0 */
+ 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3, /* 0xD0 */
+ 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4, /* 0xE0 */
+ 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, /* 0xE0 */
+ 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236, /* 0xF0 */
+ 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E, /* 0x40 */
+ 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4, /* 0x40 */
+ 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9, /* 0x50 */
+ 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317, /* 0x50 */
+ 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E, /* 0x60 */
+ 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8, /* 0x60 */
+ 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1, /* 0x70 */
+ 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, /* 0xA0 */
+ 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, /* 0xA0 */
+ 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, /* 0xB0 */
+ 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, /* 0xB0 */
+ 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, /* 0xC0 */
+ 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, /* 0xC0 */
+ 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, /* 0xD0 */
+ 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, /* 0xD0 */
+ 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, /* 0xE0 */
+ 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, /* 0xE0 */
+ 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, /* 0xF0 */
+ 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, /* 0x40 */
+ 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, /* 0x40 */
+ 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, /* 0x50 */
+ 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, /* 0x50 */
+ 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, /* 0x60 */
+ 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, /* 0x60 */
+ 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, /* 0x70 */
+ 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D, /* 0xA0 */
+ 0x6210, 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC, /* 0xA0 */
+ 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735, /* 0xB0 */
+ 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F, /* 0xB0 */
+ 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070, /* 0xC0 */
+ 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A, /* 0xC0 */
+ 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, /* 0xD0 */
+ 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B, /* 0xD0 */
+ 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863, /* 0xE0 */
+ 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57, /* 0xE0 */
+ 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D, /* 0xF0 */
+ 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48, /* 0x40 */
+ 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225, /* 0x40 */
+ 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC, /* 0x50 */
+ 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426, /* 0x50 */
+ 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B, /* 0x60 */
+ 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436, /* 0x60 */
+ 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA, /* 0x70 */
+ 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF, /* 0xA0 */
+ 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996, /* 0xA0 */
+ 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A, /* 0xB0 */
+ 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F, /* 0xB0 */
+ 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F, /* 0xC0 */
+ 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77, /* 0xC0 */
+ 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8, /* 0xD0 */
+ 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, /* 0xD0 */
+ 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292, /* 0xE0 */
+ 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, /* 0xE0 */
+ 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750, /* 0xF0 */
+ 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, /* 0x40 */
+ 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, /* 0x40 */
+ 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, /* 0x50 */
+ 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, /* 0x50 */
+ 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, /* 0x60 */
+ 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, /* 0x60 */
+ 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, /* 0x70 */
+ 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, /* 0xA0 */
+ 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, /* 0xA0 */
+ 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, /* 0xB0 */
+ 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, /* 0xB0 */
+ 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, /* 0xC0 */
+ 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, /* 0xC0 */
+ 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, /* 0xD0 */
+ 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, /* 0xD0 */
+ 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, /* 0xE0 */
+ 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241, /* 0xE0 */
+ 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, /* 0xF0 */
+ 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_A9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492, /* 0x40 */
+ 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462, /* 0x40 */
+ 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A, /* 0x50 */
+ 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947, /* 0x50 */
+ 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE, /* 0x60 */
+ 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF, /* 0x60 */
+ 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A, /* 0x70 */
+ 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1, /* 0xA0 */
+ 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78, /* 0xA0 */
+ 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27, /* 0xB0 */
+ 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD, /* 0xB0 */
+ 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A, /* 0xC0 */
+ 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215, /* 0xC0 */
+ 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF, /* 0xD0 */
+ 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB, /* 0xD0 */
+ 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD, /* 0xE0 */
+ 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC, /* 0xE0 */
+ 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C, /* 0xF0 */
+ 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_AA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C, /* 0x40 */
+ 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F, /* 0x40 */
+ 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A, /* 0x50 */
+ 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3, /* 0x50 */
+ 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE, /* 0x60 */
+ 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9, /* 0x60 */
+ 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1, /* 0x70 */
+ 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, /* 0xA0 */
+ 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, /* 0xA0 */
+ 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, /* 0xB0 */
+ 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, /* 0xB0 */
+ 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, /* 0xC0 */
+ 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, /* 0xC0 */
+ 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, /* 0xD0 */
+ 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, /* 0xD0 */
+ 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, /* 0xE0 */
+ 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, /* 0xE0 */
+ 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, /* 0xF0 */
+ 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_AB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, /* 0x40 */
+ 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, /* 0x40 */
+ 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, /* 0x50 */
+ 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, /* 0x50 */
+ 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, /* 0x60 */
+ 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, /* 0x60 */
+ 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, /* 0x70 */
+ 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9, /* 0xA0 */
+ 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2, /* 0xA0 */
+ 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950, /* 0xB0 */
+ 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA, /* 0xB0 */
+ 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, /* 0xC0 */
+ 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, /* 0xC0 */
+ 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, /* 0xD0 */
+ 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, /* 0xD0 */
+ 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E, /* 0xE0 */
+ 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C, /* 0xE0 */
+ 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC, /* 0xF0 */
+ 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_AC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545, /* 0x40 */
+ 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F, /* 0x40 */
+ 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1, /* 0x50 */
+ 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF, /* 0x50 */
+ 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE, /* 0x60 */
+ 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83, /* 0x60 */
+ 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32, /* 0x70 */
+ 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39, /* 0xA0 */
+ 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB, /* 0xA0 */
+ 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4, /* 0xB0 */
+ 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7, /* 0xB0 */
+ 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D, /* 0xC0 */
+ 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2, /* 0xC0 */
+ 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3, /* 0xD0 */
+ 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC, /* 0xD0 */
+ 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, 0x7949, /* 0xE0 */
+ 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F, /* 0xE0 */
+ 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09, /* 0xF0 */
+ 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_AD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, /* 0x40 */
+ 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, /* 0x40 */
+ 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, /* 0x50 */
+ 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, /* 0x50 */
+ 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, /* 0x60 */
+ 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, /* 0x60 */
+ 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, /* 0x70 */
+ 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, /* 0xA0 */
+ 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, /* 0xA0 */
+ 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, /* 0xB0 */
+ 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, /* 0xB0 */
+ 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, /* 0xC0 */
+ 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, /* 0xC0 */
+ 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, /* 0xD0 */
+ 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, /* 0xD0 */
+ 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, /* 0xE0 */
+ 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, /* 0xE0 */
+ 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, /* 0xF0 */
+ 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_AE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2, /* 0x40 */
+ 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A, /* 0x40 */
+ 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20, /* 0x50 */
+ 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, /* 0x50 */
+ 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, /* 0x60 */
+ 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, /* 0x60 */
+ 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, /* 0x70 */
+ 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F, /* 0xA0 */
+ 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096, /* 0xA0 */
+ 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355, /* 0xB0 */
+ 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A, /* 0xB0 */
+ 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1, /* 0xC0 */
+ 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645, /* 0xC0 */
+ 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, /* 0xD0 */
+ 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817, /* 0xD0 */
+ 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843, /* 0xE0 */
+ 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7, /* 0xE0 */
+ 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95, /* 0xF0 */
+ 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_AF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A, /* 0x40 */
+ 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9, /* 0x40 */
+ 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8, /* 0x50 */
+ 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE, /* 0x50 */
+ 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7, /* 0x60 */
+ 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B, /* 0x60 */
+ 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728, /* 0x70 */
+ 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, /* 0xA0 */
+ 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, /* 0xA0 */
+ 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, /* 0xB0 */
+ 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, /* 0xB0 */
+ 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, /* 0xC0 */
+ 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, /* 0xC0 */
+ 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102, /* 0xD0 */
+ 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108, /* 0xD0 */
+ 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210, /* 0xE0 */
+ 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354, /* 0xE0 */
+ 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332, /* 0xF0 */
+ 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, /* 0x40 */
+ 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, /* 0x40 */
+ 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, /* 0x50 */
+ 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, /* 0x50 */
+ 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, /* 0x60 */
+ 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, /* 0x60 */
+ 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, /* 0x70 */
+ 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, /* 0xA0 */
+ 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, /* 0xA0 */
+ 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065, /* 0xB0 */
+ 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F, /* 0xB0 */
+ 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, /* 0xC0 */
+ 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340, /* 0xC0 */
+ 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, 0x555E, /* 0xD0 */
+ 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, 0x552F, /* 0xD0 */
+ 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, 0x5541, /* 0xE0 */
+ 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, /* 0xE0 */
+ 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, /* 0xF0 */
+ 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, /* 0x40 */
+ 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60, /* 0x40 */
+ 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, /* 0x50 */
+ 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2, /* 0x50 */
+ 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, /* 0x60 */
+ 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, /* 0x60 */
+ 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3, /* 0x70 */
+ 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5, /* 0xA0 */
+ 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248, /* 0xA0 */
+ 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367, /* 0xB0 */
+ 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B, /* 0xB0 */
+ 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F, /* 0xC0 */
+ 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551, /* 0xC0 */
+ 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C, /* 0xD0 */
+ 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A, /* 0xD0 */
+ 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881, /* 0xE0 */
+ 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7, /* 0xE0 */
+ 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894, /* 0xF0 */
+ 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2, /* 0x40 */
+ 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB, /* 0x40 */
+ 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5, /* 0x50 */
+ 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA, /* 0x50 */
+ 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF, /* 0x60 */
+ 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D, /* 0x60 */
+ 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, /* 0x70 */
+ 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, /* 0xA0 */
+ 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, /* 0xA0 */
+ 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, /* 0xB0 */
+ 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, /* 0xB0 */
+ 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, /* 0xC0 */
+ 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, /* 0xC0 */
+ 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, /* 0xD0 */
+ 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, /* 0xD0 */
+ 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, /* 0xE0 */
+ 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, /* 0xE0 */
+ 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, /* 0xF0 */
+ 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, /* 0x40 */
+ 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, /* 0x40 */
+ 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, /* 0x50 */
+ 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, /* 0x50 */
+ 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, /* 0x60 */
+ 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, /* 0x60 */
+ 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, /* 0x70 */
+ 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6, /* 0xA0 */
+ 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673, /* 0xA0 */
+ 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA, /* 0xB0 */
+ 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75, /* 0xB0 */
+ 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091, /* 0xC0 */
+ 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274, /* 0xC0 */
+ 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B, /* 0xD0 */
+ 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C, /* 0xD0 */
+ 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F, /* 0xE0 */
+ 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589, /* 0xE0 */
+ 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830, /* 0xF0 */
+ 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71, /* 0x40 */
+ 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C, /* 0x40 */
+ 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43, /* 0x50 */
+ 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9, /* 0x50 */
+ 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C, /* 0x60 */
+ 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1, /* 0x60 */
+ 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3, /* 0x70 */
+ 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE, /* 0xA0 */
+ 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E, /* 0xA0 */
+ 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670, /* 0xB0 */
+ 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE, /* 0xB0 */
+ 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7, /* 0xC0 */
+ 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2, /* 0xC0 */
+ 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA, /* 0xD0 */
+ 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC, /* 0xD0 */
+ 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21, /* 0xE0 */
+ 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B, /* 0xE0 */
+ 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34, /* 0xF0 */
+ 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F, /* 0x40 */
+ 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C, /* 0x40 */
+ 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A, /* 0x50 */
+ 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F, /* 0x50 */
+ 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2, /* 0x60 */
+ 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C, /* 0x60 */
+ 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C, /* 0x70 */
+ 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, /* 0xA0 */
+ 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, /* 0xA0 */
+ 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, /* 0xB0 */
+ 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, /* 0xB0 */
+ 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, /* 0xC0 */
+ 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, /* 0xC0 */
+ 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, /* 0xD0 */
+ 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, /* 0xD0 */
+ 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, /* 0xE0 */
+ 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, /* 0xE0 */
+ 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, /* 0xF0 */
+ 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, /* 0x40 */
+ 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, /* 0x40 */
+ 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, /* 0x50 */
+ 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, /* 0x50 */
+ 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, /* 0x60 */
+ 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, /* 0x60 */
+ 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, /* 0x70 */
+ 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D, /* 0xA0 */
+ 0x9685, 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4, /* 0xA0 */
+ 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808, /* 0xB0 */
+ 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD, /* 0xB0 */
+ 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3, /* 0xC0 */
+ 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F, /* 0xC0 */
+ 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F, /* 0xD0 */
+ 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1, /* 0xD0 */
+ 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5, /* 0xE0 */
+ 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A, /* 0xE0 */
+ 0x5854, 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B, /* 0xF0 */
+ 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9, /* 0x40 */
+ 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148, /* 0x40 */
+ 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C, /* 0x50 */
+ 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137, /* 0x50 */
+ 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D, /* 0x60 */
+ 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417, /* 0x60 */
+ 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688, /* 0x70 */
+ 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, /* 0xA0 */
+ 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D, /* 0xA0 */
+ 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD, /* 0xB0 */
+ 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7, /* 0xB0 */
+ 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96, /* 0xC0 */
+ 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159, /* 0xC0 */
+ 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C, /* 0xD0 */
+ 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337, /* 0xD0 */
+ 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E, /* 0xE0 */
+ 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600, /* 0xE0 */
+ 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3, /* 0xF0 */
+ 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, /* 0x40 */
+ 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, /* 0x40 */
+ 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, /* 0x50 */
+ 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, /* 0x50 */
+ 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, /* 0x60 */
+ 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, /* 0x60 */
+ 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, /* 0x70 */
+ 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, /* 0xA0 */
+ 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B, /* 0xA0 */
+ 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, 0x865E, /* 0xB0 */
+ 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, /* 0xB0 */
+ 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, /* 0xC0 */
+ 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, /* 0xC0 */
+ 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, /* 0xD0 */
+ 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, /* 0xD0 */
+ 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, /* 0xE0 */
+ 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, /* 0xE0 */
+ 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, /* 0xF0 */
+ 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_B9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C, /* 0x40 */
+ 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E, /* 0x40 */
+ 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237, /* 0x50 */
+ 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264, /* 0x50 */
+ 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A, /* 0x60 */
+ 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA, /* 0x60 */
+ 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810, /* 0x70 */
+ 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9, /* 0xA0 */
+ 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6, /* 0xA0 */
+ 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9, /* 0xB0 */
+ 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600, /* 0xB0 */
+ 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E, /* 0xC0 */
+ 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716, /* 0xC0 */
+ 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D, /* 0xD0 */
+ 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6, /* 0xD0 */
+ 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7, /* 0xE0 */
+ 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D, /* 0xE0 */
+ 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54, /* 0xF0 */
+ 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_BA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158, /* 0x40 */
+ 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F, /* 0x40 */
+ 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1, /* 0x50 */
+ 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995, /* 0x50 */
+ 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB, /* 0x60 */
+ 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3, /* 0x60 */
+ 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4, /* 0x70 */
+ 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, /* 0xA0 */
+ 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, /* 0xA0 */
+ 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, /* 0xB0 */
+ 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, /* 0xB0 */
+ 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, /* 0xC0 */
+ 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, /* 0xC0 */
+ 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, /* 0xD0 */
+ 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, /* 0xD0 */
+ 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, /* 0xE0 */
+ 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, /* 0xE0 */
+ 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, /* 0xF0 */
+ 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_BB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, /* 0x40 */
+ 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, /* 0x40 */
+ 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, /* 0x50 */
+ 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, /* 0x50 */
+ 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, /* 0x60 */
+ 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, /* 0x60 */
+ 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, /* 0x70 */
+ 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, /* 0xA0 */
+ 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, /* 0xA0 */
+ 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060, /* 0xB0 */
+ 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B, /* 0xB0 */
+ 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, /* 0xC0 */
+ 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, /* 0xC0 */
+ 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, /* 0xD0 */
+ 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, /* 0xD0 */
+ 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, /* 0xE0 */
+ 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, /* 0xE0 */
+ 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, /* 0xF0 */
+ 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_BC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E, /* 0x40 */
+ 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E, /* 0x40 */
+ 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E, /* 0x50 */
+ 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB, /* 0x50 */
+ 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, /* 0x60 */
+ 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, /* 0x60 */
+ 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, /* 0x70 */
+ 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB, /* 0xA0 */
+ 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469, /* 0xA0 */
+ 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5, /* 0xB0 */
+ 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A, /* 0xB0 */
+ 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE, /* 0xC0 */
+ 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E, /* 0xC0 */
+ 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05, /* 0xD0 */
+ 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F, /* 0xD0 */
+ 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B, /* 0xE0 */
+ 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58, /* 0xE0 */
+ 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8, /* 0xF0 */
+ 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_BD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626, /* 0x40 */
+ 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C, /* 0x40 */
+ 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5, /* 0x50 */
+ 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B, /* 0x50 */
+ 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7, /* 0x60 */
+ 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB, /* 0x60 */
+ 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9, /* 0x70 */
+ 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, /* 0xA0 */
+ 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, /* 0xA0 */
+ 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, /* 0xB0 */
+ 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, /* 0xB0 */
+ 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, /* 0xC0 */
+ 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, /* 0xC0 */
+ 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, /* 0xD0 */
+ 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, /* 0xD0 */
+ 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, /* 0xE0 */
+ 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, /* 0xE0 */
+ 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, /* 0xF0 */
+ 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_BE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, /* 0x40 */
+ 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, /* 0x40 */
+ 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, /* 0x50 */
+ 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, /* 0x50 */
+ 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, /* 0x60 */
+ 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, /* 0x60 */
+ 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, /* 0x70 */
+ 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112, /* 0xA0 */
+ 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291, /* 0xA0 */
+ 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678, /* 0xB0 */
+ 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676, /* 0xB0 */
+ 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78, /* 0xC0 */
+ 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD, /* 0xC0 */
+ 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB, /* 0xD0 */
+ 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF, /* 0xD0 */
+ 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4, /* 0xE0 */
+ 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58, /* 0xE0 */
+ 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F, /* 0xF0 */
+ 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_BF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6, /* 0x40 */
+ 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8, /* 0x40 */
+ 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368, /* 0x50 */
+ 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D, /* 0x50 */
+ 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F, /* 0x60 */
+ 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E, /* 0x60 */
+ 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4, /* 0x70 */
+ 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09, /* 0xA0 */
+ 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3, /* 0xA0 */
+ 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559, /* 0xB0 */
+ 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E, /* 0xB0 */
+ 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932, /* 0xC0 */
+ 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB, /* 0xC0 */
+ 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02, /* 0xD0 */
+ 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93, /* 0xD0 */
+ 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B, /* 0xE0 */
+ 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078, /* 0xE0 */
+ 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8, /* 0xF0 */
+ 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_C0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, /* 0x40 */
+ 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, /* 0x40 */
+ 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, /* 0x50 */
+ 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, /* 0x50 */
+ 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, /* 0x60 */
+ 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, /* 0x60 */
+ 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, /* 0x70 */
+ 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, /* 0xA0 */
+ 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, /* 0xA0 */
+ 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, /* 0xB0 */
+ 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, /* 0xB0 */
+ 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, /* 0xC0 */
+ 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, /* 0xC0 */
+ 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, /* 0xD0 */
+ 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, /* 0xD0 */
+ 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, /* 0xE0 */
+ 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, /* 0xE0 */
+ 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, /* 0xF0 */
+ 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_C1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901, /* 0x40 */
+ 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, /* 0x40 */
+ 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, /* 0x50 */
+ 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B, /* 0x50 */
+ 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35, /* 0x60 */
+ 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070, /* 0x60 */
+ 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF, /* 0x70 */
+ 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B, /* 0xA0 */
+ 0x8587, 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2, /* 0xA0 */
+ 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936, /* 0xB0 */
+ 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B, /* 0xB0 */
+ 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73, /* 0xC0 */
+ 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B, /* 0xC0 */
+ 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F, /* 0xD0 */
+ 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E, /* 0xD0 */
+ 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B, /* 0xE0 */
+ 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA, /* 0xE0 */
+ 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C, /* 0xF0 */
+ 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_C2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B, /* 0x40 */
+ 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2, /* 0x40 */
+ 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233, /* 0x50 */
+ 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7, /* 0x50 */
+ 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2, /* 0x60 */
+ 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE, /* 0x60 */
+ 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8, /* 0x70 */
+ 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE, /* 0xA0 */
+ 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A, /* 0xA0 */
+ 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A, /* 0xB0 */
+ 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076, /* 0xB0 */
+ 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9, /* 0xC0 */
+ 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0, /* 0xC0 */
+ 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, /* 0xD0 */
+ 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, /* 0xD0 */
+ 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, /* 0xE0 */
+ 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, /* 0xE0 */
+ 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, /* 0xF0 */
+ 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_C3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, /* 0x40 */
+ 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, /* 0x40 */
+ 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, /* 0x50 */
+ 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, /* 0x50 */
+ 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, /* 0x60 */
+ 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, /* 0x60 */
+ 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, /* 0x70 */
+ 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, /* 0xA0 */
+ 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, /* 0xA0 */
+ 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, /* 0xB0 */
+ 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, /* 0xB0 */
+ 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, /* 0xC0 */
+ 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, /* 0xC0 */
+ 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, /* 0xD0 */
+ 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, /* 0xD0 */
+ 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, /* 0xE0 */
+ 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, /* 0xE0 */
+ 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, /* 0xF0 */
+ 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_C4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D, /* 0x40 */
+ 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A, /* 0x40 */
+ 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7, /* 0x50 */
+ 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6, /* 0x50 */
+ 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727, /* 0x60 */
+ 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662, /* 0x60 */
+ 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C, /* 0x70 */
+ 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9, /* 0xA0 */
+ 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815, /* 0xA0 */
+ 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F, /* 0xB0 */
+ 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4, /* 0xB0 */
+ 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952, /* 0xC0 */
+ 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D, /* 0xC0 */
+ 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137, /* 0xD0 */
+ 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC, /* 0xD0 */
+ 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA, /* 0xE0 */
+ 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3, /* 0xE0 */
+ 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823, /* 0xF0 */
+ 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_C5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF, /* 0x40 */
+ 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B, /* 0x40 */
+ 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957, /* 0x50 */
+ 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D, /* 0x50 */
+ 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19, /* 0x60 */
+ 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9, /* 0x60 */
+ 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61, /* 0x70 */
+ 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, /* 0xA0 */
+ 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, /* 0xA0 */
+ 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, /* 0xB0 */
+ 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, /* 0xB0 */
+ 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, /* 0xC0 */
+ 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, /* 0xC0 */
+ 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, /* 0xD0 */
+ 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, /* 0xD0 */
+ 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, /* 0xE0 */
+ 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, /* 0xE0 */
+ 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, /* 0xF0 */
+ 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_C6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, /* 0x40 */
+ 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, /* 0x40 */
+ 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, /* 0x50 */
+ 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, /* 0x50 */
+ 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, /* 0x60 */
+ 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, /* 0x60 */
+ 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, /* 0x70 */
+ 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72 /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* This table only used for BIG5, because on other systems these */
+/* chars are end user defined characters */
+/* SB: This is nonstandard, and has effects on generate/big5hkscs2001.pl. */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5ONLY_C6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, /* 0x40 */
+ 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, /* 0x40 */
+ 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, /* 0x50 */
+ 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, /* 0x50 */
+ 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, /* 0x60 */
+ 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, /* 0x60 */
+ 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, /* 0x70 */
+ 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x30FE, 0x309D, 0x309E, 0x3005, 0x3041, 0x3042, 0x3043, /* 0xA0 */
+ 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, /* 0xA0 */
+ 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, /* 0xB0 */
+ 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, /* 0xB0 */
+ 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, /* 0xC0 */
+ 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, /* 0xC0 */
+ 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, /* 0xD0 */
+ 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, /* 0xD0 */
+ 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, /* 0xE0 */
+ 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, /* 0xE0 */
+ 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, /* 0xF0 */
+ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* This table only used for BIG5, because on other systems these */
+/* chars are end user defined characters */
+/* SB: This is nonstandard, and has effects on generate/big5hkscs2001.pl. */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5ONLY_C7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, /* 0x40 */
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, /* 0x40 */
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, /* 0x50 */
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, /* 0x50 */
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, /* 0x60 */
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, /* 0x60 */
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, /* 0x70 */
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, /* 0xA0 */
+ 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, /* 0xA0 */
+ 0x30F6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, /* 0xB0 */
+ 0x041A, 0x041B, 0x041C, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, /* 0xB0 */
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, /* 0xC0 */
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, /* 0xC0 */
+ 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, /* 0xD0 */
+ 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, /* 0xD0 */
+ 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, /* 0xE0 */
+ 0x044F, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, /* 0xE0 */
+ 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, /* 0xF0 */
+ 0x2479, 0x247A, 0x247B, 0x247C, 0x247D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_C9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47, /* 0x40 */
+ 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E, /* 0x40 */
+ 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C, /* 0x50 */
+ 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3, /* 0x50 */
+ 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9, /* 0x60 */
+ 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723, /* 0x60 */
+ 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73, /* 0x70 */
+ 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A, /* 0xA0 */
+ 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14, /* 0xA0 */
+ 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22, /* 0xB0 */
+ 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210, /* 0xB0 */
+ 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF, /* 0xC0 */
+ 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B, /* 0xC0 */
+ 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A, /* 0xD0 */
+ 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74, /* 0xD0 */
+ 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266, /* 0xE0 */
+ 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E, /* 0xE0 */
+ 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18, /* 0xF0 */
+ 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_CA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F, /* 0x40 */
+ 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D, /* 0x40 */
+ 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624, /* 0x50 */
+ 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64, /* 0x50 */
+ 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33, /* 0x60 */
+ 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD, /* 0x60 */
+ 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437, /* 0x70 */
+ 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, /* 0xA0 */
+ 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, /* 0xA0 */
+ 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, /* 0xB0 */
+ 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, /* 0xB0 */
+ 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, /* 0xC0 */
+ 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, /* 0xC0 */
+ 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, /* 0xD0 */
+ 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, /* 0xD0 */
+ 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, /* 0xE0 */
+ 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, /* 0xE0 */
+ 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x6537, /* 0xF0 */
+ 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_CB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B, /* 0x40 */
+ 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, /* 0x40 */
+ 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, /* 0x50 */
+ 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, /* 0x50 */
+ 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, /* 0x60 */
+ 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, 0x7539, 0x7594, /* 0x60 */
+ 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, /* 0x70 */
+ 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F, /* 0xA0 */
+ 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F, /* 0xA0 */
+ 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87, /* 0xB0 */
+ 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A, /* 0xB0 */
+ 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E, /* 0xC0 */
+ 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE, /* 0xC0 */
+ 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B, /* 0xD0 */
+ 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482, /* 0xD0 */
+ 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466, /* 0xE0 */
+ 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, /* 0xE0 */
+ 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770, /* 0xF0 */
+ 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_CC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE, /* 0x40 */
+ 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1, /* 0x40 */
+ 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93, /* 0x50 */
+ 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF, /* 0x50 */
+ 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7, /* 0x60 */
+ 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19, /* 0x60 */
+ 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D, /* 0x70 */
+ 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C, /* 0xA0 */
+ 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009, /* 0xA0 */
+ 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA, /* 0xB0 */
+ 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0, /* 0xB0 */
+ 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612, /* 0xC0 */
+ 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611, /* 0xC0 */
+ 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776, /* 0xD0 */
+ 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A, /* 0xD0 */
+ 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779, /* 0xE0 */
+ 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC, /* 0xE0 */
+ 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7, /* 0xF0 */
+ 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_CD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, /* 0x40 */
+ 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, /* 0x40 */
+ 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, /* 0x50 */
+ 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, /* 0x50 */
+ 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, /* 0x60 */
+ 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, /* 0x60 */
+ 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, /* 0x70 */
+ 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, /* 0xA0 */
+ 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, /* 0xA0 */
+ 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, /* 0xB0 */
+ 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, /* 0xB0 */
+ 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, /* 0xC0 */
+ 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, /* 0xC0 */
+ 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, /* 0xD0 */
+ 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, /* 0xD0 */
+ 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, /* 0xE0 */
+ 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, /* 0xE0 */
+ 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, /* 0xF0 */
+ 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_CE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6, /* 0x40 */
+ 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0, /* 0x40 */
+ 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B, /* 0x50 */
+ 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4, /* 0x50 */
+ 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD, /* 0x60 */
+ 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB, /* 0x60 */
+ 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8, /* 0x70 */
+ 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3, /* 0xA0 */
+ 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9, /* 0xA0 */
+ 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2, /* 0xB0 */
+ 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037, /* 0xB0 */
+ 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049, /* 0xC0 */
+ 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058, /* 0xC0 */
+ 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5, /* 0xD0 */
+ 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6, /* 0xD0 */
+ 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541, /* 0xE0 */
+ 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C, /* 0xE0 */
+ 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639, /* 0xF0 */
+ 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_CF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB, /* 0x40 */
+ 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE, /* 0x40 */
+ 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC, /* 0x50 */
+ 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9, /* 0x50 */
+ 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6, /* 0x60 */
+ 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D, /* 0x60 */
+ 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04, /* 0x70 */
+ 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, /* 0xA0 */
+ 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, /* 0xA0 */
+ 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, /* 0xB0 */
+ 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, /* 0xB0 */
+ 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, /* 0xC0 */
+ 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, /* 0xC0 */
+ 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, /* 0xD0 */
+ 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, /* 0xD0 */
+ 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, /* 0xE0 */
+ 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, /* 0xE0 */
+ 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, /* 0xF0 */
+ 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, /* 0x40 */
+ 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, /* 0x40 */
+ 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, /* 0x50 */
+ 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, /* 0x50 */
+ 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, /* 0x60 */
+ 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, /* 0x60 */
+ 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, /* 0x70 */
+ 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674, /* 0xA0 */
+ 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3, /* 0xA0 */
+ 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, /* 0xB0 */
+ 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8, /* 0xB0 */
+ 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, 0x964E, /* 0xC0 */
+ 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, 0x4FF5, /* 0xC0 */
+ 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, 0x501C, /* 0xD0 */
+ 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, 0x5194, /* 0xD0 */
+ 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, 0x525A, /* 0xE0 */
+ 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E, /* 0xE0 */
+ 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A, /* 0xF0 */
+ 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B, /* 0x40 */
+ 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6, /* 0x40 */
+ 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9, /* 0x50 */
+ 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15, /* 0x50 */
+ 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD, /* 0x60 */
+ 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1, /* 0x60 */
+ 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA, /* 0x70 */
+ 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D, /* 0xA0 */
+ 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219, /* 0xA0 */
+ 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336, /* 0xB0 */
+ 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341, /* 0xB0 */
+ 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A, /* 0xC0 */
+ 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6, /* 0xC0 */
+ 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712, /* 0xD0 */
+ 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B, /* 0xD0 */
+ 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F, /* 0xE0 */
+ 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828, /* 0xE0 */
+ 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D, /* 0xF0 */
+ 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64, /* 0x40 */
+ 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F, /* 0x40 */
+ 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60, /* 0x50 */
+ 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68, /* 0x50 */
+ 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D, /* 0x60 */
+ 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39, /* 0x60 */
+ 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5, /* 0x70 */
+ 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, /* 0xA0 */
+ 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, /* 0xA0 */
+ 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, /* 0xB0 */
+ 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, /* 0xB0 */
+ 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, /* 0xC0 */
+ 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, /* 0xC0 */
+ 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, /* 0xD0 */
+ 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, /* 0xD0 */
+ 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, /* 0xE0 */
+ 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, /* 0xE0 */
+ 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, /* 0xF0 */
+ 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, /* 0x40 */
+ 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, /* 0x40 */
+ 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, /* 0x50 */
+ 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, /* 0x50 */
+ 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, /* 0x60 */
+ 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, /* 0x60 */
+ 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351, /* 0x70 */
+ 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, 0x8322, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D, /* 0xA0 */
+ 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345, /* 0xA0 */
+ 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653, /* 0xB0 */
+ 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687, /* 0xB0 */
+ 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1, /* 0xC0 */
+ 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843, /* 0xC0 */
+ 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F, /* 0xD0 */
+ 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57, /* 0xD0 */
+ 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6, /* 0xE0 */
+ 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004, /* 0xE0 */
+ 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF, /* 0xF0 */
+ 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC, /* 0x40 */
+ 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E, /* 0x40 */
+ 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041, /* 0x50 */
+ 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B, /* 0x50 */
+ 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051, /* 0x60 */
+ 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D, /* 0x60 */
+ 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A, /* 0x70 */
+ 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D, /* 0xA0 */
+ 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2, /* 0xA0 */
+ 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8, /* 0xB0 */
+ 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5, /* 0xB0 */
+ 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C, /* 0xC0 */
+ 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58, /* 0xC0 */
+ 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F, /* 0xD0 */
+ 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52, /* 0xD0 */
+ 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C, /* 0xE0 */
+ 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72, /* 0xE0 */
+ 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A, /* 0xF0 */
+ 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, /* 0x40 */
+ 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, /* 0x40 */
+ 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, /* 0x50 */
+ 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, /* 0x50 */
+ 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, /* 0x60 */
+ 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, /* 0x60 */
+ 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, /* 0x70 */
+ 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, /* 0xA0 */
+ 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, /* 0xA0 */
+ 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, /* 0xB0 */
+ 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, /* 0xB0 */
+ 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, /* 0xC0 */
+ 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, /* 0xC0 */
+ 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, /* 0xD0 */
+ 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, /* 0xD0 */
+ 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, /* 0xE0 */
+ 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, /* 0xE0 */
+ 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, /* 0xF0 */
+ 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, /* 0x40 */
+ 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104, /* 0x40 */
+ 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8, /* 0x50 */
+ 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F, /* 0x50 */
+ 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF, /* 0x60 */
+ 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401, /* 0x60 */
+ 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B, /* 0x70 */
+ 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3, /* 0xA0 */
+ 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D, /* 0xA0 */
+ 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A, /* 0xB0 */
+ 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A, /* 0xB0 */
+ 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7, /* 0xC0 */
+ 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30, /* 0xC0 */
+ 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B, /* 0xD0 */
+ 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98, /* 0xD0 */
+ 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45, /* 0xE0 */
+ 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B, /* 0xE0 */
+ 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB, /* 0xF0 */
+ 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, /* 0x40 */
+ 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127, /* 0x40 */
+ 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232, /* 0x50 */
+ 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4, /* 0x50 */
+ 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9, /* 0x60 */
+ 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E, /* 0x60 */
+ 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387, /* 0x70 */
+ 0x83AE, 0x8376, 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, /* 0xA0 */
+ 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, /* 0xA0 */
+ 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, /* 0xB0 */
+ 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, /* 0xB0 */
+ 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, /* 0xC0 */
+ 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, /* 0xC0 */
+ 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, /* 0xD0 */
+ 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, /* 0xD0 */
+ 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, /* 0xE0 */
+ 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, /* 0xE0 */
+ 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, /* 0xF0 */
+ 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, /* 0x40 */
+ 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, /* 0x40 */
+ 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, /* 0x50 */
+ 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, 0x5082, 0x5087, /* 0x50 */
+ 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, /* 0x60 */
+ 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, /* 0x60 */
+ 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, /* 0x70 */
+ 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, 0x5848, /* 0xA0 */
+ 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, 0x5839, /* 0xA0 */
+ 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, 0x5A9F, /* 0xB0 */
+ 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, 0x5AAC, /* 0xB0 */
+ 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B, /* 0xC0 */
+ 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D, /* 0xC0 */
+ 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C, /* 0xD0 */
+ 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35, /* 0xD0 */
+ 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31, /* 0xE0 */
+ 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, 0x5D36, /* 0xE0 */
+ 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, 0x5FAB, /* 0xF0 */
+ 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_D9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC, /* 0x40 */
+ 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104, /* 0x40 */
+ 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8, /* 0x50 */
+ 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5, /* 0x50 */
+ 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4, /* 0x60 */
+ 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0, /* 0x60 */
+ 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568, /* 0x70 */
+ 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A, /* 0xA0 */
+ 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC, /* 0xA0 */
+ 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6, /* 0xB0 */
+ 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970, /* 0xB0 */
+ 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD, /* 0xC0 */
+ 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD, /* 0xC0 */
+ 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915, /* 0xD0 */
+ 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97, /* 0xD0 */
+ 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC, /* 0xE0 */
+ 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45, /* 0xE0 */
+ 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33, /* 0xF0 */
+ 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_DA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6E68, 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, /* 0x40 */
+ 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, /* 0x40 */
+ 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, /* 0x50 */
+ 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, /* 0x50 */
+ 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, /* 0x60 */
+ 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, /* 0x60 */
+ 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, /* 0x70 */
+ 0x7335, 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x741A, 0x7421, 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, /* 0xA0 */
+ 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, /* 0xA0 */
+ 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, /* 0xB0 */
+ 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, /* 0xB0 */
+ 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, /* 0xC0 */
+ 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, /* 0xC0 */
+ 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, /* 0xD0 */
+ 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B, /* 0xD0 */
+ 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, /* 0xE0 */
+ 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, /* 0xE0 */
+ 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, /* 0xF0 */
+ 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_DB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050, /* 0x40 */
+ 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D, /* 0x40 */
+ 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204, /* 0x50 */
+ 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423, /* 0x50 */
+ 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, 0x83F6, 0x8410, /* 0x60 */
+ 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, 0x83DD, 0x83E5, /* 0x60 */
+ 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, 0x83F5, 0x83C9, /* 0x70 */
+ 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3, /* 0xA0 */
+ 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB, /* 0xA0 */
+ 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA, /* 0xB0 */
+ 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1, /* 0xB0 */
+ 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0, /* 0xC0 */
+ 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9, /* 0xC0 */
+ 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D, /* 0xD0 */
+ 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52, /* 0xD0 */
+ 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80, /* 0xE0 */
+ 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89, /* 0xE0 */
+ 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5, /* 0xF0 */
+ 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_DC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6, /* 0x40 */
+ 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F, /* 0x40 */
+ 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB, /* 0x50 */
+ 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F, /* 0x50 */
+ 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226, /* 0x60 */
+ 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204, /* 0x60 */
+ 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, /* 0x70 */
+ 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1, /* 0xA0 */
+ 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6, /* 0xA0 */
+ 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE, /* 0xB0 */
+ 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA, /* 0xB0 */
+ 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278, /* 0xC0 */
+ 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA, /* 0xC0 */
+ 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D, /* 0xD0 */
+ 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9, /* 0xD0 */
+ 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849, /* 0xE0 */
+ 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D, /* 0xE0 */
+ 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8, /* 0xF0 */
+ 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_DD[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, /* 0x40 */
+ 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, /* 0x40 */
+ 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, /* 0x50 */
+ 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, /* 0x50 */
+ 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, /* 0x60 */
+ 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, /* 0x60 */
+ 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, /* 0x70 */
+ 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, /* 0xA0 */
+ 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, /* 0xA0 */
+ 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, /* 0xB0 */
+ 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, /* 0xB0 */
+ 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, /* 0xC0 */
+ 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, /* 0xC0 */
+ 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, /* 0xD0 */
+ 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, /* 0xD0 */
+ 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, /* 0xE0 */
+ 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, /* 0xE0 */
+ 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, /* 0xF0 */
+ 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, 0x6BFC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_DE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0, /* 0x40 */
+ 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2, /* 0x40 */
+ 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6, /* 0x50 */
+ 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92, /* 0x50 */
+ 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA, /* 0x60 */
+ 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, /* 0x60 */
+ 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142, /* 0x70 */
+ 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291, /* 0xA0 */
+ 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A, /* 0xA0 */
+ 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440, /* 0xB0 */
+ 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1, /* 0xB0 */
+ 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF, /* 0xC0 */
+ 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610, /* 0xC0 */
+ 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD, /* 0xD0 */
+ 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767, /* 0xD0 */
+ 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F, /* 0xE0 */
+ 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899, /* 0xE0 */
+ 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11, /* 0xF0 */
+ 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_DF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64, /* 0x40 */
+ 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70, /* 0x40 */
+ 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88, /* 0x50 */
+ 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B, /* 0x50 */
+ 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D, /* 0x60 */
+ 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB, /* 0x60 */
+ 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B, /* 0x70 */
+ 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8144, 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, /* 0xA0 */
+ 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, /* 0xA0 */
+ 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, /* 0xB0 */
+ 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, /* 0xB0 */
+ 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, /* 0xC0 */
+ 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, /* 0xC0 */
+ 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, /* 0xD0 */
+ 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, /* 0xD0 */
+ 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, /* 0xE0 */
+ 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, /* 0xE0 */
+ 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, /* 0xF0 */
+ 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, /* 0x40 */
+ 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, /* 0x40 */
+ 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, /* 0x50 */
+ 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, /* 0x50 */
+ 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, /* 0x60 */
+ 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, /* 0x60 */
+ 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, /* 0x70 */
+ 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, 0x903F, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111, /* 0xA0 */
+ 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252, /* 0xA0 */
+ 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E, /* 0xB0 */
+ 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F, /* 0xB0 */
+ 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, /* 0xC0 */
+ 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, 0x959E, /* 0xC0 */
+ 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, 0x96FD, /* 0xD0 */
+ 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, 0x980D, /* 0xD0 */
+ 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, 0x99B5, /* 0xE0 */
+ 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD, /* 0xE0 */
+ 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD, /* 0xF0 */
+ 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627, /* 0x40 */
+ 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613, /* 0x40 */
+ 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C, /* 0x50 */
+ 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A, /* 0x50 */
+ 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894, /* 0x60 */
+ 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA, /* 0x60 */
+ 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC, /* 0x70 */
+ 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A, /* 0xA0 */
+ 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D, /* 0xA0 */
+ 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7, /* 0xB0 */
+ 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43, /* 0xB0 */
+ 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173, /* 0xC0 */
+ 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A, /* 0xC0 */
+ 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227, /* 0xD0 */
+ 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472, /* 0xD0 */
+ 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E, /* 0xE0 */
+ 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C, /* 0xE0 */
+ 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0, /* 0xF0 */
+ 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, /* 0x40 */
+ 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, /* 0x40 */
+ 0x69BD, 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, /* 0x50 */
+ 0x6993, 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, /* 0x50 */
+ 0x69B5, 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, /* 0x60 */
+ 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, /* 0x60 */
+ 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, /* 0x70 */
+ 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, /* 0xA0 */
+ 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, /* 0xA0 */
+ 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, /* 0xB0 */
+ 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, /* 0xB0 */
+ 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, /* 0xC0 */
+ 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, /* 0xC0 */
+ 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, /* 0xD0 */
+ 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, /* 0xD0 */
+ 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, /* 0xE0 */
+ 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, /* 0xE0 */
+ 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, /* 0xF0 */
+ 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, 0x7994, 0x7993 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, /* 0x40 */
+ 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, /* 0x40 */
+ 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, /* 0x50 */
+ 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, /* 0x50 */
+ 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, /* 0x60 */
+ 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, /* 0x60 */
+ 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, /* 0x70 */
+ 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187, /* 0xA0 */
+ 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F, /* 0xA0 */
+ 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4, /* 0xB0 */
+ 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7, /* 0xB0 */
+ 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF, /* 0xC0 */
+ 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4, /* 0xC0 */
+ 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, /* 0xD0 */
+ 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743, /* 0xD0 */
+ 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D, /* 0xE0 */
+ 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, /* 0xE0 */
+ 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1, /* 0xF0 */
+ 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9, /* 0x40 */
+ 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96, /* 0x40 */
+ 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09, /* 0x50 */
+ 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06, /* 0x50 */
+ 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D, /* 0x60 */
+ 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124, /* 0x60 */
+ 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4, /* 0x70 */
+ 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, /* 0xA0 */
+ 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, /* 0xA0 */
+ 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, /* 0xB0 */
+ 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, /* 0xB0 */
+ 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, /* 0xC0 */
+ 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, /* 0xC0 */
+ 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, /* 0xD0 */
+ 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, /* 0xD0 */
+ 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, /* 0xE0 */
+ 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, /* 0xE0 */
+ 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, /* 0xF0 */
+ 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, /* 0x40 */
+ 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, /* 0x40 */
+ 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, /* 0x50 */
+ 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, /* 0x50 */
+ 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, /* 0x60 */
+ 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, /* 0x60 */
+ 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, /* 0x70 */
+ 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA, /* 0xA0 */
+ 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496, /* 0xA0 */
+ 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C, /* 0xB0 */
+ 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579, /* 0xB0 */
+ 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7, /* 0xC0 */
+ 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15, /* 0xC0 */
+ 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, /* 0xD0 */
+ 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40, /* 0xD0 */
+ 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04, /* 0xE0 */
+ 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16, /* 0xE0 */
+ 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, /* 0xF0 */
+ 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96, /* 0x40 */
+ 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57, /* 0x40 */
+ 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67, /* 0x50 */
+ 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77, /* 0x50 */
+ 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A, /* 0x60 */
+ 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA, /* 0x60 */
+ 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E, /* 0x70 */
+ 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D, /* 0xA0 */
+ 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625, /* 0xA0 */
+ 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B, /* 0xB0 */
+ 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788, /* 0xB0 */
+ 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8, /* 0xC0 */
+ 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2, /* 0xC0 */
+ 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB, /* 0xD0 */
+ 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5, /* 0xD0 */
+ 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7, /* 0xE0 */
+ 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE, /* 0xE0 */
+ 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA, /* 0xF0 */
+ 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253, /* 0x40 */
+ 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500, /* 0x40 */
+ 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C, /* 0x50 */
+ 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2, /* 0x50 */
+ 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9, /* 0x60 */
+ 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E, /* 0x60 */
+ 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9, /* 0x70 */
+ 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, /* 0xA0 */
+ 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, /* 0xA0 */
+ 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, /* 0xB0 */
+ 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, /* 0xB0 */
+ 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, /* 0xC0 */
+ 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, /* 0xC0 */
+ 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, /* 0xD0 */
+ 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, /* 0xD0 */
+ 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, /* 0xE0 */
+ 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, /* 0xE0 */
+ 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, /* 0xF0 */
+ 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, /* 0x40 */
+ 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, /* 0x40 */
+ 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, 0x9129, 0x912A, /* 0x50 */
+ 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, 0x9181, 0x9182, /* 0x50 */
+ 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, /* 0x60 */
+ 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, /* 0x60 */
+ 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, /* 0x70 */
+ 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB, /* 0xA0 */
+ 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702, /* 0xA0 */
+ 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, 0x981D, /* 0xB0 */
+ 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, 0x9908, /* 0xB0 */
+ 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, 0x99CD, /* 0xC0 */
+ 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, 0x99CB, /* 0xC0 */
+ 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, /* 0xD0 */
+ 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75, /* 0xD0 */
+ 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, /* 0xE0 */
+ 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04, /* 0xE0 */
+ 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A, /* 0xF0 */
+ 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_E9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C, /* 0x40 */
+ 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC, /* 0x40 */
+ 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10, /* 0x50 */
+ 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1, /* 0x50 */
+ 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2, /* 0x60 */
+ 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9, /* 0x60 */
+ 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8, /* 0x70 */
+ 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF, /* 0xA0 */
+ 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533, /* 0xA0 */
+ 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB, /* 0xB0 */
+ 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66, /* 0xB0 */
+ 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76, /* 0xC0 */
+ 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A, /* 0xC0 */
+ 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C, /* 0xD0 */
+ 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54, /* 0xD0 */
+ 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03, /* 0xE0 */
+ 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8, /* 0xE0 */
+ 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5, /* 0xF0 */
+ 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_EA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5, /* 0x40 */
+ 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4, /* 0x40 */
+ 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA, /* 0x50 */
+ 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365, /* 0x50 */
+ 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495, /* 0x60 */
+ 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633, /* 0x60 */
+ 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D, /* 0x70 */
+ 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, /* 0xA0 */
+ 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, /* 0xA0 */
+ 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, /* 0xB0 */
+ 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, /* 0xB0 */
+ 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, /* 0xC0 */
+ 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, /* 0xC0 */
+ 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, /* 0xD0 */
+ 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, /* 0xD0 */
+ 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, /* 0xE0 */
+ 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, /* 0xE0 */
+ 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, /* 0xF0 */
+ 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_EB[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, /* 0x40 */
+ 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, /* 0x40 */
+ 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, /* 0x50 */
+ 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, /* 0x50 */
+ 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, /* 0x60 */
+ 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, /* 0x60 */
+ 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, /* 0x70 */
+ 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, /* 0xA0 */
+ 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, /* 0xA0 */
+ 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, /* 0xB0 */
+ 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, /* 0xB0 */
+ 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, /* 0xC0 */
+ 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, /* 0xC0 */
+ 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, /* 0xD0 */
+ 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, /* 0xD0 */
+ 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, /* 0xE0 */
+ 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, /* 0xE0 */
+ 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324, /* 0xF0 */
+ 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_EC[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD, /* 0x40 */
+ 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9, /* 0x40 */
+ 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0, /* 0x50 */
+ 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929, /* 0x50 */
+ 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA, /* 0x60 */
+ 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA, /* 0x60 */
+ 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E, /* 0x70 */
+ 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14, /* 0xA0 */
+ 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88, /* 0xA0 */
+ 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12, /* 0xB0 */
+ 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4, /* 0xB0 */
+ 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, 0x5682, /* 0xC0 */
+ 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25, /* 0xC0 */
+ 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B, /* 0xD0 */
+ 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3, /* 0xD0 */
+ 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE, /* 0xE0 */
+ 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580, /* 0xE0 */
+ 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89, /* 0xF0 */
+ 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_ED[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, /* 0x40 */
+ 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, /* 0x40 */
+ 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, /* 0x50 */
+ 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, /* 0x50 */
+ 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, /* 0x60 */
+ 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, /* 0x60 */
+ 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, /* 0x70 */
+ 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, /* 0xA0 */
+ 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, /* 0xA0 */
+ 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, /* 0xB0 */
+ 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, /* 0xB0 */
+ 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, /* 0xC0 */
+ 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, /* 0xC0 */
+ 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, /* 0xD0 */
+ 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, /* 0xD0 */
+ 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, /* 0xE0 */
+ 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, /* 0xE0 */
+ 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, /* 0xF0 */
+ 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_EE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, /* 0x40 */
+ 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, /* 0x40 */
+ 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, /* 0x50 */
+ 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, /* 0x50 */
+ 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, /* 0x60 */
+ 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, /* 0x60 */
+ 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, /* 0x70 */
+ 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F, /* 0xA0 */
+ 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13, /* 0xA0 */
+ 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94, /* 0xB0 */
+ 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47, /* 0xB0 */
+ 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B, /* 0xC0 */
+ 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF, /* 0xC0 */
+ 0x9364, 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349, /* 0xD0 */
+ 0x9350, 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379, /* 0xD0 */
+ 0x9357, 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361, /* 0xE0 */
+ 0x935E, 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0, /* 0xE0 */
+ 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720, /* 0xF0 */
+ 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_EF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A, /* 0x40 */
+ 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933, /* 0x40 */
+ 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1, /* 0x50 */
+ 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB, /* 0x50 */
+ 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01, /* 0x60 */
+ 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1, /* 0x60 */
+ 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41, /* 0x70 */
+ 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, /* 0xA0 */
+ 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, /* 0xA0 */
+ 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, /* 0xB0 */
+ 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, /* 0xB0 */
+ 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, /* 0xC0 */
+ 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, /* 0xC0 */
+ 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, /* 0xD0 */
+ 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, /* 0xD0 */
+ 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, /* 0xE0 */
+ 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, /* 0xE0 */
+ 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, /* 0xF0 */
+ 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F0[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, /* 0x40 */
+ 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, /* 0x40 */
+ 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x78FF, 0x790C, /* 0x50 */
+ 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, /* 0x50 */
+ 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, /* 0x60 */
+ 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, /* 0x60 */
+ 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, /* 0x70 */
+ 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, 0x81D2, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, 0x85C3, /* 0xA0 */
+ 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB, /* 0xA0 */
+ 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8, /* 0xB0 */
+ 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB, /* 0xB0 */
+ 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3, /* 0xC0 */
+ 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, 0x87F4, /* 0xC0 */
+ 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, 0x8950, /* 0xD0 */
+ 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, 0x8B35, /* 0xD0 */
+ 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, 0x8B26, /* 0xE0 */
+ 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75, /* 0xE0 */
+ 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C, /* 0xF0 */
+ 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F1[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47, /* 0x40 */
+ 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5, /* 0x40 */
+ 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B, /* 0x50 */
+ 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395, /* 0x50 */
+ 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4, /* 0x60 */
+ 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3, /* 0x60 */
+ 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722, /* 0x70 */
+ 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, /* 0xA0 */
+ 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, /* 0xA0 */
+ 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, /* 0xB0 */
+ 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, /* 0xB0 */
+ 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, /* 0xC0 */
+ 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, /* 0xC0 */
+ 0x9D53, 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, /* 0xD0 */
+ 0x9D57, 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, /* 0xD0 */
+ 0x9EDF, 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, /* 0xE0 */
+ 0x9F28, 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, /* 0xE0 */
+ 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, /* 0xF0 */
+ 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F2[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, /* 0x40 */
+ 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, /* 0x40 */
+ 0x6AD9, 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, /* 0x50 */
+ 0x6ADE, 0x6B60, 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, /* 0x50 */
+ 0x702B, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, /* 0x60 */
+ 0x702A, 0x720C, 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, /* 0x60 */
+ 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, /* 0x70 */
+ 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68, /* 0xA0 */
+ 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76, /* 0xA0 */
+ 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74, /* 0xB0 */
+ 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE, /* 0xB0 */
+ 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1, /* 0xC0 */
+ 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2, /* 0xC0 */
+ 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6, /* 0xD0 */
+ 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7, /* 0xD0 */
+ 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A, /* 0xE0 */
+ 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958, /* 0xE0 */
+ 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48, /* 0xF0 */
+ 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F3[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, 0x8C76, 0x8C9A, /* 0x40 */
+ 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D, /* 0x40 */
+ 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, 0x8F52, 0x8F51, /* 0x50 */
+ 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, 0x91AD, /* 0x50 */
+ 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC, /* 0x60 */
+ 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3, /* 0x60 */
+ 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, 0x957D, 0x95DA, /* 0x70 */
+ 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C, /* 0xA0 */
+ 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948, /* 0xA0 */
+ 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D, /* 0xB0 */
+ 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C, /* 0xB0 */
+ 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA, /* 0xC0 */
+ 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4, /* 0xC0 */
+ 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA, /* 0xD0 */
+ 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78, /* 0xD0 */
+ 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70, /* 0xE0 */
+ 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F, /* 0xE0 */
+ 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40, /* 0xF0 */
+ 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F4[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF, /* 0x40 */
+ 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF, /* 0x40 */
+ 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9, /* 0x50 */
+ 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034, /* 0x50 */
+ 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B, /* 0x60 */
+ 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA, /* 0x60 */
+ 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD, /* 0x70 */
+ 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48, /* 0xA0 */
+ 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80, /* 0xA0 */
+ 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269, /* 0xB0 */
+ 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, /* 0xB0 */
+ 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, /* 0xC0 */
+ 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, /* 0xC0 */
+ 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, /* 0xD0 */
+ 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, /* 0xD0 */
+ 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, /* 0xE0 */
+ 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, /* 0xE0 */
+ 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, /* 0xF0 */
+ 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F5[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, /* 0x40 */
+ 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, /* 0x40 */
+ 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, /* 0x50 */
+ 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, /* 0x50 */
+ 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, /* 0x60 */
+ 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, /* 0x60 */
+ 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, /* 0x70 */
+ 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, /* 0xA0 */
+ 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, /* 0xA0 */
+ 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, /* 0xB0 */
+ 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, /* 0xB0 */
+ 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, /* 0xC0 */
+ 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, /* 0xC0 */
+ 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, /* 0xD0 */
+ 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, /* 0xD0 */
+ 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, /* 0xE0 */
+ 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, /* 0xE0 */
+ 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, /* 0xF0 */
+ 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F6[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A, /* 0x40 */
+ 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45, /* 0x40 */
+ 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, /* 0x50 */
+ 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B, /* 0x50 */
+ 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437, /* 0x60 */
+ 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A, /* 0x60 */
+ 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956, /* 0x70 */
+ 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A, /* 0xA0 */
+ 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29, /* 0xA0 */
+ 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA, /* 0xB0 */
+ 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9, /* 0xB0 */
+ 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD, /* 0xC0 */
+ 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18, /* 0xC0 */
+ 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6, /* 0xD0 */
+ 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2, /* 0xD0 */
+ 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D, /* 0xE0 */
+ 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F, /* 0xE0 */
+ 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4, /* 0xF0 */
+ 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F7[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634, /* 0x40 */
+ 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826, /* 0x40 */
+ 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84, /* 0x50 */
+ 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A, /* 0x50 */
+ 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C, /* 0x60 */
+ 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449, /* 0x60 */
+ 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B, /* 0x70 */
+ 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, /* 0xA0 */
+ 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, /* 0xA0 */
+ 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, /* 0xB0 */
+ 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, /* 0xB0 */
+ 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, /* 0xC0 */
+ 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, /* 0xC0 */
+ 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, /* 0xD0 */
+ 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, /* 0xD0 */
+ 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, /* 0xE0 */
+ 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, /* 0xE0 */
+ 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, /* 0xF0 */
+ 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, /* 0x40 */
+ 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, /* 0x40 */
+ 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, /* 0x50 */
+ 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, /* 0x50 */
+ 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, /* 0x60 */
+ 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, /* 0x60 */
+ 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, /* 0x70 */
+ 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E, /* 0xA0 */
+ 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D, /* 0xA0 */
+ 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, 0x79B6, /* 0xB0 */
+ 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, 0x8835, /* 0xB0 */
+ 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, 0x91BE, /* 0xC0 */
+ 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, 0x9743, /* 0xC0 */
+ 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67, /* 0xD0 */
+ 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03, /* 0xD0 */
+ 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04, /* 0xE0 */
+ 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E, /* 0xE0 */
+ 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA, /* 0xF0 */
+ 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* F9_D6-F9_FE: is MS950 extension */
+
+static sal_uInt16 const aImplDBCSToUniTab_BIG5_F9[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648, /* 0x40 */
+ 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5, /* 0x40 */
+ 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749, /* 0x50 */
+ 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10, /* 0x50 */
+ 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78, /* 0x60 */
+ 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2, /* 0x60 */
+ 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74, /* 0x70 */
+ 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D, /* 0xA0 */
+ 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874, /* 0xA0 */
+ 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15, /* 0xB0 */
+ 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482, /* 0xB0 */
+ 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B, /* 0xC0 */
+ 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, /* 0xC0 */
+ 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0x7881, 0x92B9, /* 0xD0 */
+ 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554, 0x2566, 0x2557, /* 0xD0 */
+ 0x2560, 0x256C, 0x2563, 0x255A, 0x2569, 0x255D, 0x2552, 0x2564, /* 0xE0 */
+ 0x2555, 0x255E, 0x256A, 0x2561, 0x2558, 0x2567, 0x255B, 0x2553, /* 0xE0 */
+ 0x2565, 0x2556, 0x255F, 0x256B, 0x2562, 0x2559, 0x2568, 0x255C, /* 0xF0 */
+ 0x2551, 0x2550, 0x256D, 0x256E, 0x2570, 0x256F, 0x2593 /* 0xF0 */
+};
diff --git a/sal/textenc/tcvttcn2.tab b/sal/textenc/tcvttcn2.tab
new file mode 100644
index 000000000000..7a372d3212ad
--- /dev/null
+++ b/sal/textenc/tcvttcn2.tab
@@ -0,0 +1,3715 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the UniCode to DBCS tables for the following */
+/* chinese traditional (Taiwan/HongKong) charsets: */
+/* BIG5, MS950, APPLE_CHINTRAD */
+
+/* ======================================================================= */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x00 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 0x00 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 0x10 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 0x10 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 0x20 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 0x20 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0x30 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 0x30 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0x40 */
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, /* 0x40 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* 0x50 */
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 0x50 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x60 */
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0x60 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, /* 0x70 */
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xA246, 0xA247, 0, 0xA244, 0, 0xA1B1, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1C2, /* 0xA0 */
+ 0xA258, 0xA1D3, 0, 0, 0, 0, 0, 0xA150, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1D1, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1D2 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLECHINTRAD_00[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, /* 0x00 */
+ 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, /* 0x00 */
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, /* 0x10 */
+ 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, /* 0x10 */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, /* 0x20 */
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, /* 0x20 */
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, /* 0x30 */
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, /* 0x30 */
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, /* 0x40 */
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, /* 0x40 */
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, /* 0x50 */
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, /* 0x50 */
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, /* 0x60 */
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, /* 0x60 */
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, /* 0x70 */
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0x00A0, 0, 0xA246, 0xA247, 0, 0xA244, 0, 0xA1B1, /* 0xA0 */
+ 0, 0x00FD, 0, 0, 0, 0, 0, 0xA1C2, /* 0xA0 */
+ 0xA258, 0xA1D3, 0, 0, 0, 0, 0, 0xA145, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1D1, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1D2 /* 0xF0 */
+ /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_02[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA3BE, /* 0xC0 */
+ 0, 0xA3BC, 0xA3BD, 0xA3BF, 0, 0xA1C5, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xA3BB /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_03[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA344, 0xA345, 0xA346, 0xA347, 0xA348, 0xA349, 0xA34A, /* 0x90 */
+ 0xA34B, 0xA34C, 0xA34D, 0xA34E, 0xA34F, 0xA350, 0xA351, 0xA352, /* 0x90 */
+ 0xA353, 0xA354, 0, 0xA355, 0xA356, 0xA357, 0xA358, 0xA359, /* 0xA0 */
+ 0xA35A, 0xA35B, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0xA35C, 0xA35D, 0xA35E, 0xA35F, 0xA360, 0xA361, 0xA362, /* 0xB0 */
+ 0xA363, 0xA364, 0xA365, 0xA366, 0xA367, 0xA368, 0xA369, 0xA36A, /* 0xB0 */
+ 0xA36B, 0xA36C, 0, 0xA36D, 0xA36E, 0xA36F, 0xA370, 0xA371, /* 0xC0 */
+ 0xA372, 0xA373 /* 0xC0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* only defined in BIG5, but we convert back to this codes in all systems */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_04[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7B3, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xC7B1, 0xC7B2, 0xC7B4, 0xC7B5, /* 0x10 */
+ 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xC7BB, 0xC7BC, 0xC7BD, 0xC7BE, 0xC7BF, /* 0x20 */
+ 0xC7C0, 0xC7C1, 0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, /* 0x20 */
+ 0xC7C8, 0xC7C9, 0xC7CA, 0xC7CB, 0xC7CC, 0xC7CD, 0xC7CF, 0xC7D0, /* 0x30 */
+ 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6, 0xC7D7, 0xC7D8, /* 0x30 */
+ 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DD, 0xC7DE, 0xC7DF, 0xC7E0, /* 0x40 */
+ 0xC7E1, 0xC7E2, 0xC7E3, 0xC7E4, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E8, /* 0x40 */
+ 0, 0xC7CE /* 0x50 */
+ /* 0x50 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_20[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA156, 0xA158, 0, 0, 0, /* 0x10 */
+ 0xA1A5, 0xA1A6, 0, 0, 0xA1A7, 0xA1A8, 0, 0, /* 0x10 */
+ 0, 0, 0xA145, 0, 0, 0xA14C, 0xA14B, 0xA145, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xA1AC, 0, 0, 0xA1AB, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xA1B0, 0, 0, 0xA1C2, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xA3E1 /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA24A, 0, 0xA1C1, 0, 0, /* 0x00 */
+ 0, 0xA24B, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF, 0xA2C0, /* 0x60 */
+ 0xA2C1, 0xA2C2, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xA1F6, 0xA1F4, 0xA1F7, 0xA1F5, 0, 0, 0xA1F8, 0xA1F9, /* 0x90 */
+ 0xA1FB, 0xA1FA /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLECHINTRAD_21[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA24A, 0, 0xA1C1, 0, 0, /* 0x00 */
+ 0, 0xA24B, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0x00FE, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF, 0xA2C0, /* 0x60 */
+ 0xA2C1, 0xA2C2, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xA1F6, 0xA1F4, 0xA1F7, 0xA1F5, 0, 0, 0xA1F8, 0xA1F9, /* 0x90 */
+ 0xA1FB, 0xA1FA /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_22[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA241, 0, 0, /* 0x10 */
+ 0, 0, 0xA1D4, 0, 0, 0, 0xA1DB, 0xA1E8, /* 0x10 */
+ 0xA1E7, 0, 0, 0xA1FD, 0, 0xA1FC, 0, 0, /* 0x20 */
+ 0, 0xA1E4, 0xA1E5, 0xA1EC, 0, 0, 0xA1ED, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xA1EF, 0xA1EE, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xA1E3, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xA1DC, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xA1DA, 0xA1DD, 0, 0, 0, 0, 0xA1D8, 0xA1D9, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xA1F2, 0, 0, /* 0x90 */
+ 0, 0xA1F3, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xA1E6, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA1E9, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xA14B /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* only defined in BIG5, but we convert back to this codes in all systems */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_24[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC7E9, 0xC7EA, 0xC7EB, 0xC7EC, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, /* 0x60 */
+ 0xC7F1, 0xC7F2, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xC7F3, 0xC7F4, 0xC7F5, 0xC7F6, /* 0x70 */
+ 0xC7F7, 0xC7F8, 0xC7F9, 0xC7FA, 0xC7FB, 0xC7FC /* 0x70 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_25[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA277, 0, 0xA278, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xA27A, 0, 0, 0, /* 0x00 */
+ 0xA27B, 0, 0, 0, 0xA27C, 0, 0, 0, /* 0x10 */
+ 0xA27D, 0, 0, 0, 0xA275, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xA274, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xA273, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xA272, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xA271, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xA2A4, 0xF9F8, 0xF9E6, 0xF9EF, 0xF9DD, 0xF9E8, 0xF9F1, 0xF9DF, /* 0x50 */
+ 0xF9EC, 0xF9F5, 0xF9E3, 0xF9EE, 0xF9F7, 0xF9E5, 0xA2A5, 0xF9F2, /* 0x50 */
+ 0xF9E0, 0xA2A7, 0xF9F4, 0xF9E2, 0xF9E7, 0xF9F0, 0xF9DE, 0xF9ED, /* 0x60 */
+ 0xF9F6, 0xF9E4, 0xA2A6, 0xF9F3, 0xF9E1, 0xA27E, 0xA2A1, 0xA2A3, /* 0x60 */
+ 0xA2A2, 0xA2AC, 0xA2AD, 0xA2AE, 0xA15A, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xA262, 0xA263, 0xA264, 0xA265, 0xA266, 0xA267, 0xA268, /* 0x80 */
+ 0xA269, 0xA270, 0xA26F, 0xA26E, 0xA26D, 0xA26C, 0xA26B, 0xA26A, /* 0x80 */
+ 0, 0, 0, 0xF9FE, 0xA276, 0xA279, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xA1BD, 0xA1BC, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xA1B6, 0xA1B5, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xA1BF, 0xA1BE, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xA1BB, 0xA1BA, /* 0xC0 */
+ 0, 0, 0, 0xA1B3, 0, 0, 0xA1B7, 0xA1B4, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xA2A8, 0xA2A9, 0xA2AB, 0xA2AA /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_26[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1B9, 0xA1B8, 0, /* 0x00 */
+ 0, 0xA1F3, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xA1F0, 0xA1F2, 0xA1F1 /* 0x40 */
+ /* 0x40 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* all values with 0xC6.. or 0xC7.. only defined in BIG5, but we convert back */
+/* to this codes in all systems */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_30[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA140, 0xA142, 0xA143, 0xA1B2, 0, 0xC6A4, 0, 0, /* 0x00 */
+ 0xA171, 0xA172, 0xA16D, 0xA16E, 0xA175, 0xA176, 0xA179, 0xA17A, /* 0x00 */
+ 0xA169, 0xA16A, 0xA245, 0, 0xA165, 0xA166, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xA1A9, 0xA1AA, 0, /* 0x10 */
+ 0, 0xA2C3, 0xA2C4, 0xA2C5, 0xA2C6, 0xA2C7, 0xA2C8, 0xA2C9, /* 0x20 */
+ 0xA2CA, 0xA2CB, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xC6A5, 0xC6A6, 0xC6A7, 0xC6A8, 0xC6A9, 0xC6AA, 0xC6AB, /* 0x40 */
+ 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF, 0xC6B0, 0xC6B1, 0xC6B2, 0xC6B3, /* 0x40 */
+ 0xC6B4, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6B8, 0xC6B9, 0xC6BA, 0xC6BB, /* 0x50 */
+ 0xC6BC, 0xC6BD, 0xC6BE, 0xC6BF, 0xC6C0, 0xC6C1, 0xC6C2, 0xC6C3, /* 0x50 */
+ 0xC6C4, 0xC6C5, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9, 0xC6CA, 0xC6CB, /* 0x60 */
+ 0xC6CC, 0xC6CD, 0xC6CE, 0xC6CF, 0xC6D0, 0xC6D1, 0xC6D2, 0xC6D3, /* 0x60 */
+ 0xC6D4, 0xC6D5, 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, /* 0x70 */
+ 0xC6DC, 0xC6DD, 0xC6DE, 0xC6DF, 0xC6E0, 0xC6E1, 0xC6E2, 0xC6E3, /* 0x70 */
+ 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6E8, 0xC6E9, 0xC6EA, 0xC6EB, /* 0x80 */
+ 0xC6EC, 0xC6ED, 0xC6EE, 0xC6EF, 0xC6F0, 0xC6F1, 0xC6F2, 0xC6F3, /* 0x80 */
+ 0xC6F4, 0xC6F5, 0xC6F6, 0xC6F7, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xC6A2, 0xC6A3, 0, /* 0x90 */
+ 0, 0xC6F8, 0xC6F9, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FD, 0xC6FE, /* 0xA0 */
+ 0xC740, 0xC741, 0xC742, 0xC743, 0xC744, 0xC745, 0xC746, 0xC747, /* 0xA0 */
+ 0xC748, 0xC749, 0xC74A, 0xC74B, 0xC74C, 0xC74D, 0xC74E, 0xC74F, /* 0xB0 */
+ 0xC750, 0xC751, 0xC752, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, /* 0xB0 */
+ 0xC758, 0xC759, 0xC75A, 0xC75B, 0xC75C, 0xC75D, 0xC75E, 0xC75F, /* 0xC0 */
+ 0xC760, 0xC761, 0xC762, 0xC763, 0xC764, 0xC765, 0xC766, 0xC767, /* 0xC0 */
+ 0xC768, 0xC769, 0xC76A, 0xC76B, 0xC76C, 0xC76D, 0xC76E, 0xC76F, /* 0xD0 */
+ 0xC770, 0xC771, 0xC772, 0xC773, 0xC774, 0xC775, 0xC776, 0xC777, /* 0xD0 */
+ 0xC778, 0xC779, 0xC77A, 0xC77B, 0xC77C, 0xC77D, 0xC77E, 0xC7A1, /* 0xE0 */
+ 0xC7A2, 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7A7, 0xC7A8, 0xC7A9, /* 0xE0 */
+ 0xC7AA, 0xC7AB, 0xC7AC, 0xC7AD, 0xC7AE, 0xC7AF, 0xC7B0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0, 0xC6A1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_31[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA374, 0xA375, 0xA376, /* 0x00 */
+ 0xA377, 0xA378, 0xA379, 0xA37A, 0xA37B, 0xA37C, 0xA37D, 0xA37E, /* 0x00 */
+ 0xA3A1, 0xA3A2, 0xA3A3, 0xA3A4, 0xA3A5, 0xA3A6, 0xA3A7, 0xA3A8, /* 0x10 */
+ 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF, 0xA3B0, /* 0x10 */
+ 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7, 0xA3B8, /* 0x20 */
+ 0xA3B9, 0xA3BA /* 0x20 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_32[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA1C0 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_33[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x80 */
+ 0xA255, 0xA256, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xA250, 0xA251, 0xA252, 0, /* 0x90 */
+ 0, 0xA254, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xA257, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xA253, 0, /* 0xC0 */
+ 0, 0xA1EB, 0xA1EA, 0, 0, 0xA24F /* 0xD0 */
+ /* 0xD0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_4E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA440, 0xA442, 0, 0xA443, 0, 0, 0, 0xC945, /* 0x00 */
+ 0xA456, 0xA454, 0xA457, 0xA455, 0xC946, 0xA4A3, 0xC94F, 0xC94D, /* 0x00 */
+ 0xA4A2, 0xA4A1, 0, 0, 0xA542, 0xA541, 0xA540, 0, /* 0x10 */
+ 0xA543, 0xA4FE, 0, 0, 0, 0, 0xA5E0, 0xA5E1, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xA8C3, 0, /* 0x20 */
+ 0, 0, 0, 0xA458, 0, 0xA4A4, 0xC950, 0, /* 0x20 */
+ 0xA4A5, 0xC963, 0xA6EA, 0xCBB1, 0, 0, 0, 0, /* 0x30 */
+ 0xA459, 0xA4A6, 0, 0xA544, 0xC964, 0, 0, 0, /* 0x30 */
+ 0, 0, 0xC940, 0xA444, 0, 0xA45B, 0, 0xC947, /* 0x40 */
+ 0xA45C, 0, 0, 0xA4A7, 0, 0xA545, 0xA547, 0xA546, /* 0x40 */
+ 0, 0, 0xA5E2, 0xA5E3, 0, 0, 0xA8C4, 0, /* 0x50 */
+ 0xADBC, 0xA441, 0, 0, 0xC941, 0xA445, 0xA45E, 0xA45D, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xA5E4, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xA8C5, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xB0AE, 0xD44B, /* 0x70 */
+ 0, 0, 0xB6C3, 0xDCB1, 0xDCB2, 0, 0xA446, 0, /* 0x80 */
+ 0xA4A9, 0, 0, 0xA8C6, 0xA447, 0xC948, 0xA45F, 0, /* 0x80 */
+ 0, 0xA4AA, 0xA4AC, 0xC951, 0xA4AD, 0xA4AB, 0, 0, /* 0x90 */
+ 0, 0xA5E5, 0, 0xA8C7, 0, 0, 0xA8C8, 0xAB45, /* 0x90 */
+ 0, 0xA460, 0xA4AE, 0, 0xA5E6, 0xA5E8, 0xA5E7, 0, /* 0xA0 */
+ 0xA6EB, 0, 0, 0xA8C9, 0xA8CA, 0xAB46, 0xAB47, 0, /* 0xA0 */
+ 0, 0, 0, 0xADBD, 0, 0, 0xDCB3, 0, /* 0xB0 */
+ 0, 0xF6D6, 0xA448, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xA4B0, 0xA4AF, 0xC952, 0xA4B1, 0xA4B7, 0, 0xA4B2, 0xA4B3, /* 0xC0 */
+ 0xC954, 0xC953, 0xA4B5, 0xA4B6, 0, 0xA4B4, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xA54A, 0xA54B, 0xA54C, 0xA54D, /* 0xD0 */
+ 0xA549, 0xA550, 0xC96A, 0, 0xC966, 0xC969, 0xA551, 0xA561, /* 0xD0 */
+ 0, 0xC968, 0, 0xA54E, 0xA54F, 0xA548, 0, 0, /* 0xE0 */
+ 0xC965, 0xC967, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xA5F5, 0xC9B0, 0xA5F2, 0xA5F6, 0xC9BA, 0xC9AE, 0xA5F3, 0xC9B2, /* 0xF0 */
+ 0, 0, 0, 0xA5F4, 0, 0xA5F7, 0, 0xA5E9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_4F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC9B1, 0xA5F8, 0xC9B5, 0, 0xC9B9, 0xC9B6, 0, 0, /* 0x00 */
+ 0xC9B3, 0xA5EA, 0xA5EC, 0xA5F9, 0, 0xA5EE, 0xC9AB, 0xA5F1, /* 0x00 */
+ 0xA5EF, 0xA5F0, 0xC9BB, 0xC9B8, 0xC9AF, 0xA5ED, 0, 0, /* 0x10 */
+ 0xC9AC, 0xA5EB, 0, 0, 0, 0xC9B4, 0, 0, /* 0x10 */
+ 0, 0, 0xC9B7, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0xC9AD, 0xCA66, 0, 0xA742, /* 0x20 */
+ 0xA6F4, 0, 0, 0xCA67, 0xA6F1, 0, 0xA744, 0, /* 0x30 */
+ 0xA6F9, 0, 0xA6F8, 0xCA5B, 0xA6FC, 0xA6F7, 0xCA60, 0xCA68, /* 0x30 */
+ 0, 0xCA64, 0, 0xA6FA, 0, 0, 0xA6FD, 0xA6EE, /* 0x40 */
+ 0xA747, 0xCA5D, 0, 0, 0xCBBD, 0xA6EC, 0xA743, 0xA6ED, /* 0x40 */
+ 0xA6F5, 0xA6F6, 0xCA62, 0xCA5E, 0xA6FB, 0xA6F3, 0xCA5A, 0xA6EF, /* 0x50 */
+ 0xCA65, 0xA745, 0xA748, 0xA6F2, 0xA740, 0xA746, 0xA6F0, 0xCA63, /* 0x50 */
+ 0xA741, 0xCA69, 0xCA5C, 0xA6FE, 0xCA5F, 0, 0, 0xCA61, /* 0x60 */
+ 0, 0xA8D8, 0xCBBF, 0xCBCB, 0xA8D0, 0, 0xCBCC, 0xA8CB, /* 0x60 */
+ 0xA8D5, 0, 0, 0xA8CE, 0xCBB9, 0xA8D6, 0xCBB8, 0xCBBC, /* 0x70 */
+ 0xCBC3, 0xCBC1, 0xA8DE, 0xA8D9, 0xCBB3, 0xCBB5, 0xA8DB, 0xA8CF, /* 0x70 */
+ 0xCBB6, 0xCBC2, 0xCBC9, 0xA8D4, 0xCBBB, 0xCBB4, 0xA8D3, 0xCBB7, /* 0x80 */
+ 0xA8D7, 0xCBBA, 0, 0xA8D2, 0, 0xA8CD, 0, 0xA8DC, /* 0x80 */
+ 0xCBC4, 0xA8DD, 0xCBC8, 0, 0xCBC6, 0xCBCA, 0xA8DA, 0xCBBE, /* 0x90 */
+ 0xCBB2, 0, 0xCBC0, 0xA8D1, 0xCBC5, 0xA8CC, 0xCBC7, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xAB56, 0xAB4A, /* 0xA0 */
+ 0, 0, 0xCDE0, 0xCDE8, 0, 0xAB49, 0xAB51, 0xAB5D, /* 0xB0 */
+ 0, 0xCDEE, 0xCDEC, 0xCDE7, 0, 0, 0, 0xAB4B, /* 0xB0 */
+ 0xCDED, 0xCDE3, 0xAB59, 0xAB50, 0xAB58, 0xCDDE, 0, 0xCDEA, /* 0xC0 */
+ 0, 0xCDE1, 0xAB54, 0xCDE2, 0, 0xCDDD, 0xAB5B, 0xAB4E, /* 0xC0 */
+ 0xAB57, 0xAB4D, 0, 0xCDDF, 0xCDE4, 0, 0xCDEB, 0xAB55, /* 0xD0 */
+ 0xAB52, 0xCDE6, 0xAB5A, 0xCDE9, 0xCDE5, 0xAB4F, 0xAB5C, 0xAB53, /* 0xD0 */
+ 0xAB4C, 0xAB48, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xCDEF, 0, 0xADD7, 0xADC1, /* 0xE0 */
+ 0, 0xADD1, 0, 0xADD6, 0xD0D0, 0xD0CF, 0xD0D4, 0xD0D5, /* 0xF0 */
+ 0xADC4, 0, 0xADCD, 0, 0, 0, 0xADDA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_50[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xADCE, 0, 0, 0, 0, 0xD0C9, 0xADC7, 0xD0CA, /* 0x00 */
+ 0, 0xADDC, 0, 0xADD3, 0xADBE, 0xADBF, 0xD0DD, 0xB0BF, /* 0x00 */
+ 0, 0xADCC, 0xADCB, 0xD0CB, 0xADCF, 0xD45B, 0xADC6, 0xD0D6, /* 0x10 */
+ 0xADD5, 0xADD4, 0xADCA, 0xD0CE, 0xD0D7, 0, 0xD0C8, 0xADC9, /* 0x10 */
+ 0xD0D8, 0xADD2, 0xD0CC, 0xADC0, 0, 0xADC3, 0xADC2, 0xD0D9, /* 0x20 */
+ 0xADD0, 0xADC5, 0xADD9, 0xADDB, 0xD0D3, 0xADD8, 0, 0xD0DB, /* 0x20 */
+ 0xD0CD, 0xD0DC, 0, 0xD0D1, 0, 0xD0DA, 0, 0xD0D2, /* 0x30 */
+ 0, 0, 0, 0, 0xADC8, 0, 0, 0, /* 0x30 */
+ 0xD463, 0xD457, 0, 0xB0B3, 0, 0xD45C, 0xD462, 0xB0B2, /* 0x40 */
+ 0xD455, 0xB0B6, 0xD459, 0xD452, 0xB0B4, 0xD456, 0xB0B9, 0xB0BE, /* 0x40 */
+ 0, 0xD467, 0, 0xD451, 0, 0xB0BA, 0, 0xD466, /* 0x50 */
+ 0, 0, 0xB0B5, 0xD458, 0xB0B1, 0xD453, 0xD44F, 0xD45D, /* 0x50 */
+ 0xD450, 0xD44E, 0xD45A, 0xD460, 0xD461, 0xB0B7, 0, 0, /* 0x60 */
+ 0xD85B, 0xD45E, 0xD44D, 0xD45F, 0, 0xB0C1, 0xD464, 0xB0C0, /* 0x60 */
+ 0xD44C, 0, 0xD454, 0xD465, 0xB0BC, 0xB0BB, 0xB0B8, 0xB0BD, /* 0x70 */
+ 0, 0, 0xB0AF, 0, 0, 0xB0B0, 0, 0, /* 0x70 */
+ 0xB3C8, 0, 0xD85E, 0xD857, 0, 0xB3C5, 0, 0xD85F, /* 0x80 */
+ 0, 0, 0, 0xD855, 0xD858, 0xB3C4, 0xD859, 0, /* 0x80 */
+ 0, 0xB3C7, 0xD85D, 0, 0xD853, 0xD852, 0xB3C9, 0, /* 0x90 */
+ 0xB3CA, 0xB3C6, 0xB3CB, 0xD851, 0xD85C, 0xD85A, 0xD854, 0, /* 0x90 */
+ 0, 0, 0xB3C3, 0xD856, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xB6CA, 0xB6C4, 0xDCB7, 0xB6CD, /* 0xA0 */
+ 0xDCBD, 0xDCC0, 0xB6C6, 0xB6C7, 0xDCBA, 0xB6C5, 0xDCC3, 0xB6CB, /* 0xB0 */
+ 0xDCC4, 0, 0xDCBF, 0xB6CC, 0, 0xDCB4, 0xB6C9, 0xDCB5, /* 0xB0 */
+ 0, 0xDCBE, 0xDCBC, 0, 0xDCB8, 0xB6C8, 0xDCB6, 0xB6CE, /* 0xC0 */
+ 0xDCBB, 0xDCC2, 0xDCB9, 0xDCC1, 0, 0, 0xB9B6, 0xB9B3, /* 0xC0 */
+ 0, 0xB9B4, 0, 0xE0F9, 0xE0F1, 0xB9B2, 0xB9AF, 0xE0F2, /* 0xD0 */
+ 0, 0, 0xB9B1, 0xE0F5, 0, 0xE0F7, 0, 0, /* 0xD0 */
+ 0xE0FE, 0, 0, 0xE0FD, 0xE0F8, 0xB9AE, 0xE0F0, 0xB9AC, /* 0xE0 */
+ 0xE0F3, 0xB9B7, 0xE0F6, 0, 0xE0FA, 0xB9B0, 0xB9AD, 0xE0FC, /* 0xE0 */
+ 0xE0FB, 0xB9B5, 0, 0xE0F4, 0, 0xBBF8, 0xE4EC, 0, /* 0xF0 */
+ 0xE4E9, 0xBBF9, 0, 0xBBF7, 0, 0xE4F0, 0xE4ED, 0xE4E6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_51[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBBF6, 0, 0xBBFA, 0xE4E7, 0xBBF5, 0xBBFD, 0xE4EA, 0xE4EB, /* 0x00 */
+ 0xBBFB, 0xBBFC, 0xE4F1, 0xE4EE, 0xE4EF, 0, 0, 0, /* 0x00 */
+ 0xBEAA, 0xE8F8, 0xBEA7, 0xE8F5, 0xBEA9, 0xBEAB, 0, 0xE8F6, /* 0x10 */
+ 0xBEA8, 0, 0xE8F7, 0, 0xE8F4, 0, 0, 0xC076, /* 0x10 */
+ 0xECBD, 0xC077, 0xECBB, 0, 0xECBC, 0xECBA, 0xECB9, 0, /* 0x20 */
+ 0, 0xECBE, 0xC075, 0, 0, 0xEFB8, 0xEFB9, 0, /* 0x20 */
+ 0xE4E8, 0xEFB7, 0xC078, 0xC35F, 0xF1EB, 0xF1EC, 0, 0xC4D7, /* 0x30 */
+ 0xC4D8, 0xF5C1, 0xF5C0, 0xC56C, 0xC56B, 0xF7D0, 0, 0xA449, /* 0x30 */
+ 0xA461, 0xA4B9, 0, 0xA4B8, 0xA553, 0xA552, 0xA5FC, 0xA5FB, /* 0x40 */
+ 0xA5FD, 0xA5FA, 0, 0xA74A, 0xA749, 0xA74B, 0, 0, /* 0x40 */
+ 0, 0, 0xA8E0, 0, 0xA8DF, 0xA8E1, 0, 0xAB5E, /* 0x50 */
+ 0, 0xA259, 0xD0DE, 0xA25A, 0xB0C2, 0xA25C, 0xA25B, 0xD860, /* 0x50 */
+ 0, 0xA25D, 0xB9B8, 0xA25E, 0, 0xA44A, 0, 0xA4BA, /* 0x60 */
+ 0xA5FE, 0xA8E2, 0, 0xA44B, 0xA4BD, 0xA4BB, 0xA4BC, 0, /* 0x60 */
+ 0, 0xA640, 0, 0, 0, 0xA74C, 0xA8E4, 0xA8E3, /* 0x70 */
+ 0xA8E5, 0, 0, 0, 0xADDD, 0, 0, 0, /* 0x70 */
+ 0xBEAC, 0, 0, 0, 0, 0, 0, 0xC94E, /* 0x80 */
+ 0, 0xA554, 0xA555, 0, 0, 0xA641, 0, 0xCA6A, /* 0x80 */
+ 0, 0xAB60, 0xAB5F, 0xD0E0, 0xD0DF, 0xB0C3, 0, 0xA4BE, /* 0x90 */
+ 0xC955, 0, 0, 0, 0, 0, 0xCBCD, 0, /* 0x90 */
+ 0xAB61, 0, 0xADE0, 0, 0xADDE, 0xADDF, 0, 0, /* 0xA0 */
+ 0, 0, 0xBEAD, 0, 0xA556, 0, 0, 0, /* 0xA0 */
+ 0xA642, 0xC9BC, 0, 0, 0, 0, 0xA74D, 0xA74E, /* 0xB0 */
+ 0, 0xCA6B, 0, 0, 0xCBCE, 0xA8E6, 0xCBCF, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xD0E2, 0xD0E3, 0xADE3, 0, /* 0xC0 */
+ 0xD0E4, 0, 0xD0E1, 0xADE4, 0xADE2, 0xADE1, 0xD0E5, 0, /* 0xC0 */
+ 0xD468, 0, 0, 0, 0xD861, 0, 0, 0xDCC5, /* 0xD0 */
+ 0xE140, 0, 0, 0, 0xBBFE, 0xBEAE, 0xE8F9, 0, /* 0xD0 */
+ 0xA44C, 0xA45A, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xB0C4, 0xB3CD, 0, 0xB9B9, 0, 0xC942, 0xA4BF, 0, /* 0xF0 */
+ 0xA559, 0xA557, 0xA558, 0, 0, 0xA8E7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_52[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA44D, 0xA44E, 0, 0xA462, 0, 0, 0xA4C0, 0xA4C1, /* 0x00 */
+ 0xA4C2, 0xC9BE, 0xA55A, 0, 0xC96B, 0, 0xA646, 0, /* 0x00 */
+ 0xC9BF, 0xA644, 0xA645, 0xC9BD, 0, 0, 0xA647, 0xA643, /* 0x10 */
+ 0, 0, 0, 0, 0xCA6C, 0xAAEC, 0xCA6D, 0, /* 0x10 */
+ 0, 0xCA6E, 0, 0, 0xA750, 0xA74F, 0, 0, /* 0x20 */
+ 0xA753, 0xA751, 0xA752, 0, 0, 0, 0xA8ED, 0, /* 0x20 */
+ 0xA8EC, 0xCBD4, 0xCBD1, 0xCBD2, 0, 0xCBD0, 0xA8EE, 0xA8EA, /* 0x30 */
+ 0xA8E9, 0, 0xA8EB, 0xA8E8, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xA8EF, 0, 0xAB63, 0xCDF0, 0, 0xCBD3, 0xAB68, /* 0x40 */
+ 0, 0xCDF1, 0xAB64, 0xAB67, 0xAB66, 0xAB65, 0xAB62, 0, /* 0x40 */
+ 0, 0, 0xD0E8, 0, 0xADE7, 0xD0EB, 0xADE5, 0, /* 0x50 */
+ 0, 0, 0xD0E7, 0xADE8, 0xADE6, 0xADE9, 0xD0E9, 0xD0EA, /* 0x50 */
+ 0, 0xD0E6, 0xD0EC, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0xB3D1, 0xB0C5, 0xD469, 0xD46B, 0xD46A, 0xD46C, 0xB0C6, /* 0x60 */
+ 0, 0, 0xB3CE, 0, 0xB3CF, 0xB3D0, 0, 0xB6D0, /* 0x70 */
+ 0xDCC7, 0, 0xDCC6, 0xDCC8, 0xDCC9, 0xB6D1, 0, 0xB6CF, /* 0x70 */
+ 0xE141, 0xE142, 0xB9BB, 0xB9BA, 0xE35A, 0, 0, 0xBC40, /* 0x80 */
+ 0xBC41, 0xBC42, 0xBC44, 0xE4F2, 0xE4F3, 0xBC43, 0, 0, /* 0x80 */
+ 0, 0xBEAF, 0, 0xBEB0, 0, 0, 0xF1ED, 0xF5C3, /* 0x90 */
+ 0xF5C2, 0xF7D1, 0, 0xA44F, 0, 0, 0, 0xA55C, /* 0x90 */
+ 0xA55B, 0, 0, 0xA648, 0, 0, 0xC9C0, 0, /* 0xA0 */
+ 0, 0xA755, 0xA756, 0xA754, 0xA757, 0xCA6F, 0xCA70, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xA8F1, 0xCBD5, 0, 0xA8F0, 0, /* 0xB0 */
+ 0xCDF2, 0xAB6C, 0xCDF3, 0xAB6B, 0, 0, 0, 0xAB69, /* 0xC0 */
+ 0, 0xAB6A, 0, 0, 0, 0xD0ED, 0, 0, /* 0xC0 */
+ 0, 0, 0xB0C7, 0xD46E, 0, 0xB0CA, 0xD46D, 0xB1E5, /* 0xD0 */
+ 0xB0C9, 0xB0C8, 0, 0xB3D4, 0, 0xB3D3, 0xB3D2, 0xB6D2, /* 0xD0 */
+ 0, 0, 0xB6D5, 0xB6D6, 0xB6D4, 0, 0xB6D3, 0, /* 0xE0 */
+ 0, 0xE143, 0, 0xE144, 0, 0, 0, 0xE4F5, /* 0xE0 */
+ 0xBC45, 0xE4F4, 0, 0xBEB1, 0xECBF, 0xC079, 0, 0xF1EE, /* 0xF0 */
+ 0xC455, 0, 0xA463, 0xA4C3, 0xC956, 0, 0xA4C4, 0xA4C5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_53[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA55D, 0xA55E, 0, /* 0x00 */
+ 0xA649, 0xCA71, 0xCBD6, 0xCBD7, 0, 0xAB6D, 0xD0EE, 0xB0CC, /* 0x00 */
+ 0xB0CB, 0xD863, 0xD862, 0, 0, 0xA450, 0xA4C6, 0xA55F, /* 0x10 */
+ 0, 0xB0CD, 0xC943, 0, 0xC96C, 0xA560, 0, 0xC9C2, /* 0x10 */
+ 0xA64B, 0xA64A, 0xC9C1, 0xA758, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xADEA, 0, 0, 0xD46F, 0, 0xB6D7, /* 0x20 */
+ 0xE145, 0xB9BC, 0, 0, 0xE8FA, 0, 0, 0xF3FD, /* 0x30 */
+ 0, 0xA4C7, 0, 0, 0xCBD8, 0xCDF4, 0xB0D0, 0xB0CE, /* 0x30 */
+ 0xB0CF, 0xA451, 0, 0xA464, 0xA2CD, 0xA4CA, 0, 0xA4C9, /* 0x40 */
+ 0xA4C8, 0xA563, 0xA562, 0, 0xC96D, 0xC9C3, 0, 0, /* 0x40 */
+ 0, 0xA8F5, 0xA8F2, 0xA8F4, 0xA8F3, 0, 0, 0xAB6E, /* 0x50 */
+ 0, 0, 0xB3D5, 0, 0xA452, 0, 0xA4CB, 0, /* 0x50 */
+ 0xA565, 0xA564, 0, 0xCA72, 0, 0, 0xA8F6, 0, /* 0x60 */
+ 0, 0, 0, 0, 0xC957, 0, 0xA567, 0xA566, /* 0x60 */
+ 0xA64C, 0xA64D, 0xCA73, 0xA759, 0, 0xA75A, 0, 0xA8F7, /* 0x70 */
+ 0xA8F8, 0xA8F9, 0, 0xAB6F, 0xCDF5, 0, 0, 0xADEB, /* 0x70 */
+ 0, 0, 0xC944, 0, 0xA4CC, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xC9C4, 0, 0, 0, 0xCA74, 0xCA75, /* 0x80 */
+ 0, 0, 0xCBD9, 0, 0xCBDA, 0, 0xCDF7, 0xCDF6, /* 0x90 */
+ 0xCDF9, 0xCDF8, 0xAB70, 0, 0xD470, 0xADED, 0xD0EF, 0xADEC, /* 0x90 */
+ 0, 0, 0, 0, 0xD864, 0xB3D6, 0, 0xD865, /* 0xA0 */
+ 0, 0, 0, 0, 0xE146, 0xB9BD, 0, 0, /* 0xA0 */
+ 0, 0, 0xBC46, 0, 0xF1EF, 0, 0, 0, /* 0xB0 */
+ 0, 0xC958, 0, 0xA568, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xB0D1, 0, 0, 0, 0, /* 0xC0 */
+ 0xA453, 0xA465, 0xA4CE, 0xA4CD, 0, 0xA4CF, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xA8FB, 0, 0xA8FA, 0xA8FC, /* 0xD0 */
+ 0, 0, 0, 0xAB71, 0, 0, 0, 0xADEE, /* 0xD0 */
+ 0, 0xE8FB, 0xC24F, 0xA466, 0xA56A, 0xA579, 0xA574, 0, /* 0xE0 */
+ 0xA56F, 0xA56E, 0xA575, 0xA573, 0xA56C, 0xA57A, 0xA56D, 0xA569, /* 0xE0 */
+ 0xA578, 0xA577, 0xA576, 0xA56B, 0, 0xA572, 0, 0, /* 0xF0 */
+ 0xA571, 0, 0, 0xA57B, 0xA570 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_54[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA653, 0, 0xA659, 0xA655, 0, 0xA65B, 0xC9C5, /* 0x00 */
+ 0xA658, 0xA64E, 0xA651, 0xA654, 0xA650, 0xA657, 0xA65A, 0xA64F, /* 0x00 */
+ 0xA652, 0xA656, 0xA65C, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xCA7E, 0xCA7B, 0, 0xA767, 0xCA7C, 0xA75B, 0xA75D, 0xA775, /* 0x10 */
+ 0xA770, 0, 0, 0, 0xCAA5, 0xCA7D, 0xA75F, 0xA761, /* 0x20 */
+ 0xCAA4, 0xA768, 0xCA78, 0xA774, 0xA776, 0xA75C, 0xA76D, 0, /* 0x20 */
+ 0xCA76, 0xA773, 0, 0xA764, 0, 0xA76E, 0xA76F, 0xCA77, /* 0x30 */
+ 0xA76C, 0xA76A, 0, 0xA76B, 0xA771, 0xCAA1, 0xA75E, 0, /* 0x30 */
+ 0xA772, 0xCAA3, 0xA766, 0xA763, 0, 0xCA7A, 0xA762, 0xCAA6, /* 0x40 */
+ 0xA765, 0, 0xA769, 0, 0, 0, 0xA760, 0xCAA2, /* 0x40 */
+ 0, 0, 0, 0, 0xCA79, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xCBEB, 0xCBEA, 0xA94F, 0xCBED, 0xCBEF, 0xCBE4, 0xCBE7, 0xCBEE, /* 0x60 */
+ 0xA950, 0, 0, 0xCBE1, 0xCBE5, 0, 0, 0xCBE9, /* 0x60 */
+ 0xCE49, 0xA94B, 0xCE4D, 0xA8FD, 0xCBE6, 0xA8FE, 0xA94C, 0xA945, /* 0x70 */
+ 0xA941, 0, 0xCBE2, 0xA944, 0xA949, 0xA952, 0xCBE3, 0xCBDC, /* 0x70 */
+ 0xA943, 0xCBDD, 0xCBDF, 0, 0xA946, 0, 0xA948, 0xCBDB, /* 0x80 */
+ 0xCBE0, 0, 0, 0xA951, 0xA94D, 0xCBE8, 0xA953, 0, /* 0x80 */
+ 0xA94A, 0xCBDE, 0xA947, 0, 0, 0xA942, 0xA940, 0, /* 0x90 */
+ 0xCBEC, 0, 0xA94E, 0, 0, 0, 0, 0, /* 0x90 */
+ 0xCE48, 0xCDFB, 0xCE4B, 0, 0, 0xCDFD, 0xAB78, 0xABA8, /* 0xA0 */
+ 0xAB74, 0xABA7, 0xAB7D, 0xABA4, 0xAB72, 0xCDFC, 0xCE43, 0xABA3, /* 0xA0 */
+ 0xCE4F, 0xABA5, 0, 0xAB79, 0, 0, 0xCE45, 0xCE42, /* 0xB0 */
+ 0xAB77, 0, 0xCDFA, 0xABA6, 0xCE4A, 0xAB7C, 0xCE4C, 0xABA9, /* 0xB0 */
+ 0xAB73, 0xAB7E, 0xAB7B, 0xCE40, 0xABA1, 0xCE46, 0xCE47, 0xAB7A, /* 0xC0 */
+ 0xABA2, 0xAB76, 0, 0, 0, 0, 0xAB75, 0xCDFE, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xCE44, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0xCE4E, 0, /* 0xD0 */
+ 0xD144, 0xADFB, 0xD0F1, 0, 0xD0F6, 0xADF4, 0xAE40, 0xD0F4, /* 0xE0 */
+ 0xADEF, 0xADF9, 0xADFE, 0xD0FB, 0, 0xADFA, 0xADFD, 0, /* 0xE0 */
+ 0, 0xD0FE, 0xADF5, 0xD0F5, 0, 0, 0, 0xD142, /* 0xF0 */
+ 0xD143, 0, 0xADF7, 0xD141, 0xADF3, 0xAE43, 0, 0xD0F8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_55[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xADF1, 0, 0xD146, 0xD0F9, 0xD0FD, 0xADF6, 0xAE42, /* 0x00 */
+ 0xD0FA, 0xADFC, 0xD140, 0xD147, 0xD4A1, 0, 0xD145, 0xAE44, /* 0x00 */
+ 0xADF0, 0xD0FC, 0xD0F3, 0, 0xADF8, 0, 0, 0xD0F2, /* 0x10 */
+ 0, 0, 0xD0F7, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0xD0F0, 0xAE41, /* 0x20 */
+ 0, 0, 0xD477, 0, 0xB0E4, 0xD4A7, 0xB0E2, 0xB0DF, /* 0x20 */
+ 0xD47C, 0xB0DB, 0xD4A2, 0xB0E6, 0xD476, 0xD47B, 0xD47A, 0xADF2, /* 0x30 */
+ 0xB0E1, 0xD4A5, 0, 0xD4A8, 0xD473, 0, 0xB3E8, 0, /* 0x30 */
+ 0xD4A9, 0xB0E7, 0, 0xB0D9, 0xB0D6, 0xD47E, 0xB0D3, 0, /* 0x40 */
+ 0xD4A6, 0, 0xB0DA, 0xD4AA, 0, 0xD474, 0xD4A4, 0xB0DD, /* 0x40 */
+ 0xD475, 0xD478, 0xD47D, 0, 0, 0xB0DE, 0xB0DC, 0xB0E8, /* 0x50 */
+ 0, 0, 0, 0, 0xB0E3, 0, 0xB0D7, 0xB1D2, /* 0x50 */
+ 0, 0xB0D8, 0xD479, 0xB0E5, 0xB0E0, 0xD4A3, 0xB0D5, 0, /* 0x60 */
+ 0, 0, 0xB0D4, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xD471, 0xD472, 0xD86A, /* 0x70 */
+ 0, 0, 0, 0xB3D7, 0xB3DA, 0xD875, 0xB3EE, 0xD878, /* 0x70 */
+ 0xB3D8, 0xD871, 0xB3DE, 0xB3E4, 0xB5BD, 0, 0, 0xB3E2, /* 0x80 */
+ 0xD86E, 0xB3EF, 0xB3DB, 0xB3E3, 0xD876, 0xDCD7, 0xD87B, 0xD86F, /* 0x80 */
+ 0, 0xD866, 0xD873, 0xD86D, 0xB3E1, 0xD879, 0, 0, /* 0x90 */
+ 0xB3DD, 0xB3F1, 0xB3EA, 0, 0xB3DF, 0xB3DC, 0, 0xB3E7, /* 0x90 */
+ 0, 0xD87A, 0xD86C, 0xD872, 0xD874, 0xD868, 0xD877, 0xB3D9, /* 0xA0 */
+ 0xD867, 0, 0xB3E0, 0xB3F0, 0xB3EC, 0xD869, 0xB3E6, 0, /* 0xA0 */
+ 0, 0xB3ED, 0xB3E9, 0xB3E5, 0, 0xD870, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xB3EB, 0, 0, 0, 0xDCD5, /* 0xB0 */
+ 0xDCD1, 0, 0xDCE0, 0xDCCA, 0xDCD3, 0xB6E5, 0xB6E6, 0xB6DE, /* 0xC0 */
+ 0xDCDC, 0xB6E8, 0xDCCF, 0xDCCE, 0xDCCC, 0xDCDE, 0xB6DC, 0xDCD8, /* 0xC0 */
+ 0xDCCD, 0xB6DF, 0xDCD6, 0xB6DA, 0xDCD2, 0xDCD9, 0xDCDB, 0, /* 0xD0 */
+ 0, 0xDCDF, 0xB6E3, 0xDCCB, 0xB6DD, 0xDCD0, 0, 0xB6D8, /* 0xD0 */
+ 0, 0xB6E4, 0xDCDA, 0xB6E0, 0xB6E1, 0xB6E7, 0xB6DB, 0xA25F, /* 0xE0 */
+ 0xB6D9, 0xDCD4, 0, 0, 0, 0, 0, 0xB6E2, /* 0xE0 */
+ 0, 0, 0xDCDD, 0, 0, 0, 0xB9CD, 0xB9C8, /* 0xF0 */
+ 0, 0xE155, 0xE151, 0, 0xE14B, 0xB9C2, 0xB9BE, 0xE154 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_56[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB9BF, 0xE14E, 0xE150, 0, 0xE153, 0, 0xB9C4, 0, /* 0x00 */
+ 0xB9CB, 0xB9C5, 0, 0, 0xE149, 0xB9C6, 0xB9C7, 0xE14C, /* 0x00 */
+ 0xB9CC, 0, 0xE14A, 0xE14F, 0xB9C3, 0xE148, 0xB9C9, 0xB9C1, /* 0x10 */
+ 0, 0, 0, 0xB9C0, 0xE14D, 0xE152, 0, 0xB9CA, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE147, /* 0x20 */
+ 0, 0xBC4D, 0xE547, 0, 0xE544, 0, 0xBC47, 0xBC53, /* 0x20 */
+ 0xBC54, 0, 0xBC4A, 0xE542, 0xBC4C, 0xE4F9, 0xBC52, 0, /* 0x30 */
+ 0xE546, 0xBC49, 0xE548, 0xBC48, 0, 0xE543, 0xE545, 0xBC4B, /* 0x30 */
+ 0xE541, 0xE4FA, 0xE4F7, 0, 0, 0xD86B, 0xE4FD, 0, /* 0x40 */
+ 0xE4F6, 0xE4FC, 0xE4FB, 0, 0xE4F8, 0, 0xBC4F, 0, /* 0x40 */
+ 0, 0, 0, 0xBC4E, 0, 0, 0, 0xBC50, /* 0x50 */
+ 0xE4FE, 0xBEB2, 0xE540, 0, 0, 0, 0xE945, 0, /* 0x50 */
+ 0xE8FD, 0, 0xBEBE, 0xE942, 0xBEB6, 0xBEBA, 0xE941, 0, /* 0x60 */
+ 0xBEB9, 0xBEB5, 0xBEB8, 0xBEB3, 0xBEBD, 0xE943, 0xE8FE, 0xBEBC, /* 0x60 */
+ 0xE8FC, 0xBEBB, 0xE944, 0xE940, 0xBC51, 0, 0xBEBF, 0xE946, /* 0x70 */
+ 0xBEB7, 0xBEB4, 0, 0, 0, 0, 0xECC6, 0xECC8, /* 0x70 */
+ 0xC07B, 0xECC9, 0xECC7, 0xECC5, 0xECC4, 0xC07D, 0xECC3, 0xC07E, /* 0x80 */
+ 0, 0, 0, 0, 0xECC1, 0xECC2, 0xC07A, 0xC0A1, /* 0x80 */
+ 0xC07C, 0, 0, 0xECC0, 0, 0xC250, 0, 0xEFBC, /* 0x90 */
+ 0xEFBA, 0xEFBF, 0xEFBD, 0, 0xEFBB, 0xEFBE, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xC360, 0xF1F2, 0xF1F3, /* 0xA0 */
+ 0xC456, 0, 0xF1F4, 0xF1F0, 0xF1F5, 0xF1F1, 0xC251, 0, /* 0xA0 */
+ 0, 0, 0xF3FE, 0xF441, 0xC459, 0xF440, 0xC458, 0xC457, /* 0xB0 */
+ 0, 0, 0, 0, 0xC45A, 0xF5C5, 0xF5C6, 0, /* 0xB0 */
+ 0xC4DA, 0xC4D9, 0xC4DB, 0xF5C4, 0, 0xF6D8, 0xF6D7, 0, /* 0xC0 */
+ 0xC56D, 0xC56F, 0xC56E, 0xF6D9, 0xC5C8, 0xF8A6, 0, 0, /* 0xC0 */
+ 0, 0xC5F1, 0, 0xF8A5, 0xF8EE, 0, 0, 0xC949, /* 0xD0 */
+ 0, 0, 0xA57D, 0xA57C, 0, 0xA65F, 0xA65E, 0xC9C7, /* 0xD0 */
+ 0xA65D, 0xC9C6, 0, 0, 0xA779, 0xCAA9, 0, 0xCAA8, /* 0xE0 */
+ 0, 0, 0xA777, 0xA77A, 0, 0, 0xCAA7, 0, /* 0xE0 */
+ 0xA778, 0, 0, 0, 0, 0, 0, 0xCBF0, /* 0xF0 */
+ 0, 0xCBF1, 0xA954, 0, 0, 0, 0, 0xABAA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_57[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD148, 0xD149, 0xAE45, 0xAE46, 0, 0, 0xD4AC, /* 0x00 */
+ 0xB0E9, 0xB0EB, 0xD4AB, 0xB0EA, 0xD87C, 0xB3F2, 0, 0, /* 0x00 */
+ 0, 0, 0xB6E9, 0xB6EA, 0xDCE1, 0, 0xB9CF, 0, /* 0x10 */
+ 0xB9CE, 0, 0xE549, 0xE948, 0xE947, 0, 0xF96B, 0xA467, /* 0x10 */
+ 0xC959, 0, 0xC96E, 0xC96F, 0, 0, 0, 0, /* 0x20 */
+ 0xA662, 0xA666, 0xC9C9, 0, 0xA664, 0xA663, 0xC9C8, 0xA665, /* 0x20 */
+ 0xA661, 0, 0, 0xA660, 0xC9CA, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xA7A6, 0, 0, 0xA7A3, 0, /* 0x30 */
+ 0xA77D, 0xCAAA, 0, 0, 0, 0xCAAB, 0, 0xA7A1, /* 0x40 */
+ 0, 0xCAAD, 0xA77B, 0xCAAE, 0xCAAC, 0xA77E, 0xA7A2, 0xA7A5, /* 0x40 */
+ 0xA7A4, 0xA77C, 0xCAAF, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xA959, 0xCBFE, 0, 0xA95B, 0, 0xA95A, 0, /* 0x60 */
+ 0xCC40, 0xA958, 0xA957, 0xCBF5, 0, 0xCBF4, 0, 0xCBF2, /* 0x60 */
+ 0xCBF7, 0xCBF6, 0xCBF3, 0xCBFC, 0xCBFD, 0xCBFA, 0xCBF8, 0xA956, /* 0x70 */
+ 0, 0, 0, 0xCBFB, 0xA95C, 0xCC41, 0, 0, /* 0x70 */
+ 0xCBF9, 0, 0xABAB, 0xA955, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0xABAC, 0xCE54, 0, 0, 0xCE5A, /* 0x80 */
+ 0, 0, 0, 0xABB2, 0xCE58, 0xCE5E, 0, 0xCE55, /* 0x90 */
+ 0xCE59, 0xCE5B, 0xCE5D, 0xCE57, 0, 0xCE56, 0xCE51, 0xCE52, /* 0x90 */
+ 0xABAD, 0, 0xABAF, 0xABAE, 0xCE53, 0xCE5C, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xABB1, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xCE50, 0xD153, 0, /* 0xB0 */
+ 0xD152, 0xD157, 0xD14E, 0, 0xD151, 0xD150, 0, 0xD154, /* 0xB0 */
+ 0, 0xD158, 0xAE47, 0xAE4A, 0, 0, 0xD14F, 0xD155, /* 0xC0 */
+ 0, 0, 0, 0xAE49, 0xD14A, 0, 0xABB0, 0xD4BA, /* 0xC0 */
+ 0xD156, 0, 0xD14D, 0, 0xAE48, 0xD14C, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0xD4B1, 0, 0, 0xB0EC, /* 0xD0 */
+ 0xB0F0, 0xD4C1, 0xD4AF, 0xD4BD, 0xB0F1, 0xD4BF, 0, 0xD4C5, /* 0xE0 */
+ 0, 0xD4C9, 0, 0, 0xD4C0, 0xD4B4, 0xD4BC, 0, /* 0xE0 */
+ 0xD4CA, 0xD4C8, 0xD4BE, 0xD4B9, 0xD4B2, 0xD8A6, 0xD4B0, 0xB0F5, /* 0xF0 */
+ 0xD4B7, 0xB0F6, 0xB0F2, 0xD4AD, 0xD4C3, 0xD4B5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_58[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD4B3, 0xD4C6, 0xB0F3, 0, 0xD4CC, 0xB0ED, 0xB0EF, 0xD4BB, /* 0x00 */
+ 0xD4B6, 0xAE4B, 0xB0EE, 0xD4B8, 0xD4C7, 0xD4CB, 0xD4C2, 0, /* 0x00 */
+ 0xD4C4, 0, 0, 0, 0xD4AE, 0, 0, 0, /* 0x10 */
+ 0, 0xD8A1, 0, 0xD8AA, 0xD8A9, 0xB3FA, 0xD8A2, 0, /* 0x10 */
+ 0xB3FB, 0xB3F9, 0, 0xD8A4, 0xB3F6, 0xD8A8, 0, 0xD8A3, /* 0x20 */
+ 0xD8A5, 0xD87D, 0xB3F4, 0, 0xD8B2, 0xD8B1, 0xD8AE, 0xB3F3, /* 0x20 */
+ 0xB3F7, 0xB3F8, 0xD14B, 0xD8AB, 0xB3F5, 0xB0F4, 0xD8AD, 0xD87E, /* 0x30 */
+ 0xD8B0, 0xD8AF, 0, 0xD8B3, 0, 0xDCEF, 0, 0xD8AC, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0xD8A7, 0xDCE7, 0xB6F4, 0xB6F7, 0xB6F2, 0xDCE6, 0xDCEA, 0xDCE5, /* 0x40 */
+ 0, 0xB6EC, 0xB6F6, 0xDCE2, 0xB6F0, 0xDCE9, 0, 0xB6EE, /* 0x50 */
+ 0xB6ED, 0xDCEC, 0xB6EF, 0xDCEE, 0, 0xDCEB, 0xB6EB, 0, /* 0x50 */
+ 0, 0, 0xB6F5, 0xDCF0, 0xDCE4, 0xDCED, 0, 0, /* 0x60 */
+ 0xDCE3, 0, 0, 0xB6F1, 0, 0xB6F3, 0, 0xDCE8, /* 0x60 */
+ 0, 0xDCF1, 0, 0, 0xE15D, 0xB9D0, 0xE163, 0, /* 0x70 */
+ 0, 0xB9D5, 0xE15F, 0xE166, 0xE157, 0xB9D7, 0xB9D1, 0xE15C, /* 0x70 */
+ 0xBC55, 0xE15B, 0xE164, 0xB9D2, 0, 0xB9D6, 0xE15A, 0xE160, /* 0x80 */
+ 0xE165, 0xE156, 0xB9D4, 0xE15E, 0, 0, 0xE162, 0xE168, /* 0x80 */
+ 0xE158, 0xE161, 0, 0xB9D3, 0xE167, 0, 0, 0, /* 0x90 */
+ 0xE159, 0, 0, 0, 0xBC59, 0xE54B, 0xBC57, 0xBC56, /* 0x90 */
+ 0xE54D, 0xE552, 0, 0xE54E, 0, 0xE551, 0xBC5C, 0, /* 0xA0 */
+ 0xBEA5, 0xBC5B, 0, 0xE54A, 0xE550, 0, 0xBC5A, 0xE54F, /* 0xA0 */
+ 0, 0xE54C, 0, 0xBC58, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xE94D, 0xF9D9, 0xE94F, 0xE94A, 0xBEC1, 0xE94C, /* 0xB0 */
+ 0, 0xBEC0, 0xE94E, 0, 0, 0xBEC3, 0xE950, 0xBEC2, /* 0xC0 */
+ 0xE949, 0xE94B, 0, 0, 0, 0, 0xC0A5, 0xECCC, /* 0xC0 */
+ 0, 0xC0A4, 0xECCD, 0xC0A3, 0xECCB, 0xC0A2, 0xECCA, 0, /* 0xD0 */
+ 0xC253, 0xC252, 0xF1F6, 0xF1F8, 0, 0xF1F7, 0xC361, 0xC362, /* 0xD0 */
+ 0, 0, 0xC363, 0xF442, 0xC45B, 0, 0, 0xF7D3, /* 0xE0 */
+ 0xF7D2, 0xC5F2, 0, 0xA468, 0xA4D0, 0, 0, 0xA7A7, /* 0xE0 */
+ 0, 0, 0, 0, 0xCE5F, 0, 0, 0, /* 0xF0 */
+ 0, 0xB3FC, 0xB3FD, 0, 0xDCF2, 0xB9D8, 0xE169, 0xE553 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_59[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC95A, 0, 0, 0xCAB0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0xCC42, 0xCE60, 0xD159, 0xAE4C, /* 0x00 */
+ 0, 0, 0xF1F9, 0, 0xC4DC, 0xA469, 0xA57E, 0xC970, /* 0x10 */
+ 0, 0xA667, 0xA668, 0, 0xA95D, 0, 0, 0, /* 0x10 */
+ 0xB0F7, 0, 0xB9DA, 0, 0xB9DB, 0xB9D9, 0, 0xA46A, /* 0x20 */
+ 0, 0xA4D1, 0xA4D3, 0xA4D2, 0xC95B, 0xA4D4, 0xA5A1, 0xC971, /* 0x20 */
+ 0, 0xA5A2, 0, 0, 0, 0, 0, 0xA669, /* 0x30 */
+ 0xA66A, 0, 0, 0, 0xC9CB, 0, 0xA7A8, 0, /* 0x30 */
+ 0xCAB1, 0, 0, 0, 0xA961, 0xCC43, 0, 0xA95F, /* 0x40 */
+ 0xA960, 0xA95E, 0xD15A, 0, 0, 0, 0xABB6, 0xABB5, /* 0x40 */
+ 0xABB7, 0xABB4, 0, 0xCE61, 0xA962, 0xABB3, 0, 0xAE4D, /* 0x50 */
+ 0xAE4E, 0, 0xAE4F, 0, 0xD4CD, 0, 0, 0, /* 0x50 */
+ 0xB3FE, 0xD8B4, 0xB0F8, 0, 0, 0, 0, 0xB6F8, /* 0x60 */
+ 0, 0xB9DD, 0xB9DC, 0xE16A, 0, 0xBC5D, 0xBEC4, 0, /* 0x60 */
+ 0xEFC0, 0xF6DA, 0xF7D4, 0xA46B, 0xA5A3, 0, 0xA5A4, 0xC9D1, /* 0x70 */
+ 0xA66C, 0xA66F, 0, 0xC9CF, 0xC9CD, 0xA66E, 0xC9D0, 0xC9D2, /* 0x70 */
+ 0xC9CC, 0xA671, 0xA670, 0xA66D, 0xA66B, 0xC9CE, 0, 0, /* 0x80 */
+ 0, 0, 0xA7B3, 0, 0, 0xA7B0, 0xCAB6, 0xCAB9, /* 0x80 */
+ 0xCAB8, 0, 0xA7AA, 0xA7B2, 0, 0, 0xA7AF, 0xCAB5, /* 0x90 */
+ 0xCAB3, 0xA7AE, 0, 0, 0, 0xA7A9, 0xA7AC, 0, /* 0x90 */
+ 0xCAB4, 0xCABB, 0xCAB7, 0xA7AD, 0xA7B1, 0xA7B4, 0xCAB2, 0xCABA, /* 0xA0 */
+ 0xA7AB, 0, 0, 0, 0, 0, 0xA967, 0xA96F, /* 0xA0 */
+ 0, 0xCC4F, 0xCC48, 0xA970, 0xCC53, 0xCC44, 0xCC4B, 0, /* 0xB0 */
+ 0, 0xA966, 0xCC45, 0xA964, 0xCC4C, 0xCC50, 0xA963, 0, /* 0xB0 */
+ 0xCC51, 0xCC4A, 0, 0xCC4D, 0, 0xA972, 0xA969, 0xCC54, /* 0xC0 */
+ 0xCC52, 0, 0xA96E, 0xA96C, 0xCC49, 0xA96B, 0xCC47, 0xCC46, /* 0xC0 */
+ 0xA96A, 0xA968, 0xA971, 0xA96D, 0xA965, 0, 0xCC4E, 0, /* 0xD0 */
+ 0xABB9, 0, 0xABC0, 0xCE6F, 0xABB8, 0xCE67, 0xCE63, 0, /* 0xD0 */
+ 0xCE73, 0xCE62, 0, 0xABBB, 0xCE6C, 0xABBE, 0xABC1, 0, /* 0xE0 */
+ 0xABBC, 0xCE70, 0xABBF, 0, 0xAE56, 0xCE76, 0xCE64, 0, /* 0xE0 */
+ 0, 0xCE66, 0xCE6D, 0xCE71, 0xCE75, 0xCE72, 0xCE6B, 0xCE6E, /* 0xF0 */
+ 0, 0, 0xCE68, 0xABC3, 0xCE6A, 0xCE69, 0xCE74, 0xABBA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_5A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCE65, 0xABC2, 0, 0xABBD, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xAE5C, 0xD162, 0, 0xAE5B, 0, 0, 0xD160, /* 0x00 */
+ 0, 0xAE50, 0, 0xAE55, 0, 0xD15F, 0xD15C, 0xD161, /* 0x10 */
+ 0xAE51, 0xD15B, 0, 0xAE54, 0xAE52, 0, 0xD163, 0xAE53, /* 0x10 */
+ 0xAE57, 0, 0, 0xAE58, 0, 0xAE5A, 0, 0, /* 0x20 */
+ 0, 0xAE59, 0, 0, 0, 0xD15D, 0xD15E, 0, /* 0x20 */
+ 0, 0, 0, 0xD164, 0, 0xD4D4, 0xB0F9, 0xD8C2, /* 0x30 */
+ 0xD4D3, 0xD4E6, 0, 0, 0xB140, 0, 0xD4E4, 0, /* 0x30 */
+ 0xB0FE, 0xB0FA, 0xD4ED, 0xD4DD, 0xD4E0, 0, 0xB143, 0xD4EA, /* 0x40 */
+ 0xD4E2, 0xB0FB, 0xB144, 0, 0xD4E7, 0xD4E5, 0, 0, /* 0x40 */
+ 0xD4D6, 0xD4EB, 0xD4DF, 0xD4DA, 0, 0xD4D0, 0xD4EC, 0xD4DC, /* 0x50 */
+ 0xD4CF, 0, 0xB142, 0xD4E1, 0xD4EE, 0xD4DE, 0xD4D2, 0xD4D7, /* 0x50 */
+ 0xD4CE, 0, 0xB141, 0, 0xD4DB, 0xD4D8, 0xB0FC, 0xD4D1, /* 0x60 */
+ 0, 0xD4E9, 0xB0FD, 0, 0xD4D9, 0xD4D5, 0, 0, /* 0x60 */
+ 0xD4E8, 0, 0, 0, 0, 0, 0, 0xB440, /* 0x70 */
+ 0xD8BB, 0, 0xD8B8, 0xD8C9, 0xD8BD, 0xD8CA, 0, 0xB442, /* 0x70 */
+ 0, 0, 0, 0xD8C6, 0xD8C3, 0, 0, 0, /* 0x80 */
+ 0, 0, 0xD8C4, 0xD8C7, 0xD8CB, 0, 0xD4E3, 0xD8CD, /* 0x80 */
+ 0xDD47, 0, 0xB443, 0xD8CE, 0xD8B6, 0xD8C0, 0, 0xD8C5, /* 0x90 */
+ 0, 0, 0xB441, 0xB444, 0xD8CC, 0xD8CF, 0xD8BA, 0xD8B7, /* 0x90 */
+ 0, 0, 0xD8B9, 0, 0, 0xD8BE, 0xD8BC, 0xB445, /* 0xA0 */
+ 0, 0xD8C8, 0, 0, 0xD8BF, 0, 0xD8C1, 0xD8B5, /* 0xA0 */
+ 0xDCFA, 0xDCF8, 0xB742, 0xB740, 0xDD43, 0xDCF9, 0xDD44, 0xDD40, /* 0xB0 */
+ 0xDCF7, 0xDD46, 0xDCF6, 0xDCFD, 0xB6FE, 0xB6FD, 0xB6FC, 0xDCFB, /* 0xB0 */
+ 0xDD41, 0xB6F9, 0xB741, 0, 0xDCF4, 0, 0xDCFE, 0xDCF3, /* 0xC0 */
+ 0xDCFC, 0xB6FA, 0xDD42, 0xDCF5, 0xB6FB, 0xDD45, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0xE16E, 0xB9E2, 0xB9E1, /* 0xD0 */
+ 0xB9E3, 0xE17A, 0xE170, 0xE176, 0xE16B, 0xE179, 0xE178, 0xE17C, /* 0xD0 */
+ 0xE175, 0xB9DE, 0xE174, 0xB9E4, 0, 0xE16D, 0xB9DF, 0, /* 0xE0 */
+ 0xE17B, 0xB9E0, 0xE16F, 0xE172, 0xE177, 0xE171, 0xE16C, 0, /* 0xE0 */
+ 0, 0, 0, 0xE173, 0xE555, 0xBC61, 0xE558, 0xE557, /* 0xF0 */
+ 0xE55A, 0xE55C, 0xF9DC, 0xBC5F, 0, 0xE556, 0, 0xE554 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_5B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE55D, 0xE55B, 0xE559, 0, 0xE55F, 0, 0xE55E, /* 0x00 */
+ 0xBC63, 0xBC5E, 0, 0xBC60, 0xBC62, 0, 0, 0xE560, /* 0x00 */
+ 0xE957, 0, 0, 0xE956, 0xE955, 0, 0xE958, 0xE951, /* 0x10 */
+ 0, 0xE952, 0xE95A, 0xE953, 0, 0xBEC5, 0xE95C, 0, /* 0x10 */
+ 0xE95B, 0xE954, 0, 0xECD1, 0xC0A8, 0xECCF, 0xECD4, 0xECD3, /* 0x20 */
+ 0xE959, 0, 0xC0A7, 0, 0xECD2, 0xECCE, 0xECD6, 0xECD5, /* 0x20 */
+ 0xC0A6, 0, 0xECD0, 0, 0xBEC6, 0, 0, 0, /* 0x30 */
+ 0xC254, 0, 0, 0, 0xEFC1, 0xF1FA, 0xF1FB, 0xF1FC, /* 0x30 */
+ 0xC45C, 0, 0, 0xC45D, 0, 0xF443, 0, 0xF5C8, /* 0x40 */
+ 0xF5C7, 0, 0, 0xF6DB, 0xF6DC, 0xF7D5, 0xF8A7, 0, /* 0x40 */
+ 0xA46C, 0xA46D, 0, 0xA46E, 0xA4D5, 0xA5A5, 0xC9D3, 0xA672, /* 0x50 */
+ 0xA673, 0, 0xA7B7, 0xA7B8, 0xA7B6, 0xA7B5, 0, 0xA973, /* 0x50 */
+ 0, 0, 0xCC55, 0xA975, 0xA974, 0xCC56, 0, 0, /* 0x60 */
+ 0, 0xABC4, 0, 0xAE5D, 0xD165, 0, 0xD4F0, 0, /* 0x60 */
+ 0xB145, 0xB447, 0xD4EF, 0xB446, 0, 0xB9E5, 0, 0xE17D, /* 0x70 */
+ 0xBEC7, 0, 0xC0A9, 0xECD7, 0, 0xC45E, 0, 0xC570, /* 0x70 */
+ 0, 0xC972, 0, 0xA5A6, 0xC973, 0xA676, 0, 0xA674, /* 0x80 */
+ 0xA675, 0xA677, 0, 0xA7BA, 0xA7B9, 0, 0xCABC, 0xA7BB, /* 0x80 */
+ 0, 0, 0xCABD, 0xCC57, 0, 0xCC58, 0, 0xA976, /* 0x90 */
+ 0xA978, 0xA97A, 0xA977, 0xA97B, 0xA979, 0, 0, 0, /* 0x90 */
+ 0, 0, 0xABC8, 0xABC5, 0xABC7, 0xABC9, 0xABC6, 0xD166, /* 0xA0 */
+ 0xCE77, 0, 0, 0, 0xD168, 0xD167, 0xAE63, 0, /* 0xA0 */
+ 0xAE5F, 0, 0, 0xAE60, 0xAE62, 0xAE64, 0xAE61, 0, /* 0xB0 */
+ 0xAE66, 0xAE65, 0, 0, 0, 0, 0, 0xB14A, /* 0xB0 */
+ 0xD4F2, 0xD4F1, 0xB149, 0, 0xB148, 0xB147, 0xB14B, 0xB146, /* 0xC0 */
+ 0, 0, 0xD8D5, 0xD8D2, 0xB449, 0xD8D1, 0xD8D6, 0, /* 0xC0 */
+ 0xB44B, 0xD8D4, 0xB448, 0xB44A, 0xD8D3, 0, 0xDD48, 0, /* 0xD0 */
+ 0xDD49, 0xDD4A, 0, 0, 0, 0, 0xB9E6, 0xB9EE, /* 0xD0 */
+ 0xE17E, 0xB9E8, 0xB9EC, 0xE1A1, 0xB9ED, 0xB9E9, 0xB9EA, 0xB9E7, /* 0xE0 */
+ 0xB9EB, 0xBC66, 0xD8D0, 0xBC67, 0xBC65, 0, 0xBC64, 0xE95D, /* 0xE0 */
+ 0xBEC8, 0xECD8, 0xECD9, 0, 0, 0xC364, 0xC45F, 0, /* 0xF0 */
+ 0xA46F, 0, 0xA678 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_5C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xABCA, 0, 0xD169, 0xAE67, 0, 0, 0xB14E, /* 0x00 */
+ 0xB14D, 0xB14C, 0xB44C, 0xB44D, 0xD8D7, 0xB9EF, 0xBEC9, 0xA470, /* 0x00 */
+ 0xC95C, 0xA4D6, 0xC974, 0, 0, 0xC9D4, 0xA679, 0, /* 0x10 */
+ 0, 0, 0xA97C, 0, 0, 0, 0, 0xDD4B, /* 0x10 */
+ 0, 0, 0xA471, 0, 0xA4D7, 0xC9D5, 0, 0, /* 0x20 */
+ 0xCABE, 0, 0xCABF, 0, 0xA7BC, 0, 0, 0, /* 0x20 */
+ 0xD8D8, 0xB44E, 0, 0xDD4C, 0, 0, 0, 0xC0AA, /* 0x30 */
+ 0xA472, 0xA4A8, 0xA4D8, 0xC975, 0xA5A7, 0, 0xA7C0, 0xA7BF, /* 0x30 */
+ 0xA7BD, 0xA7BE, 0, 0, 0xCC59, 0xA97E, 0xA9A1, 0xCC5A, /* 0x40 */
+ 0xA97D, 0, 0, 0xABCE, 0xCE78, 0xABCD, 0xABCB, 0xABCC, /* 0x40 */
+ 0xAE6A, 0xAE68, 0, 0, 0xD16B, 0xAE69, 0xD16A, 0, /* 0x50 */
+ 0xAE5E, 0xD4F3, 0, 0, 0xB150, 0xB151, 0, 0, /* 0x50 */
+ 0xB14F, 0, 0xB9F0, 0xE1A2, 0xBC68, 0xBC69, 0, 0xE561, /* 0x60 */
+ 0xC0AB, 0xEFC2, 0xEFC3, 0, 0xC4DD, 0xF8A8, 0xC94B, 0xA4D9, /* 0x60 */
+ 0, 0xA473, 0, 0xC977, 0xC976, 0, 0, 0, /* 0x70 */
+ 0, 0xA67A, 0xC9D7, 0xC9D8, 0xC9D6, 0, 0xC9D9, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xCAC7, 0, /* 0x80 */
+ 0xCAC2, 0xCAC4, 0xCAC6, 0xCAC3, 0xA7C4, 0xCAC0, 0, 0xCAC1, /* 0x80 */
+ 0xA7C1, 0xA7C2, 0xCAC5, 0xCAC8, 0xA7C3, 0xCAC9, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xCC68, 0, 0xCC62, /* 0x90 */
+ 0xCC5D, 0xA9A3, 0xCC65, 0xCC63, 0xCC5C, 0xCC69, 0xCC6C, 0xCC67, /* 0xA0 */
+ 0xCC60, 0xA9A5, 0xCC66, 0xA9A6, 0xCC61, 0xCC64, 0xCC5B, 0xCC5F, /* 0xA0 */
+ 0xCC6B, 0xA9A7, 0, 0xA9A8, 0, 0xCC5E, 0xCC6A, 0xA9A2, /* 0xB0 */
+ 0xA9A4, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0xCEAB, 0xCEA4, /* 0xC0 */
+ 0xCEAA, 0xCEA3, 0xCEA5, 0xCE7D, 0xCE7B, 0, 0xCEAC, 0xCEA9, /* 0xC0 */
+ 0xCE79, 0, 0xABD0, 0xCEA7, 0xCEA8, 0, 0xCEA6, 0xCE7C, /* 0xD0 */
+ 0xCE7A, 0xABCF, 0xCEA2, 0xCE7E, 0, 0, 0xCEA1, 0xCEAD, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xAE6F, 0, 0xAE6E, 0, 0xD16C, 0xAE6B, 0xD16E, 0, /* 0xE0 */
+ 0xAE70, 0xD16F, 0, 0, 0xAE73, 0, 0xAE71, 0xD170, /* 0xF0 */
+ 0xCEAE, 0xD172, 0, 0xAE6D, 0, 0xAE6C, 0, 0xD16D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_5D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD171, 0xAE72, 0, 0, 0, 0, 0xB153, 0xB152, /* 0x00 */
+ 0, 0, 0, 0xD4F5, 0xD4F9, 0xD4FB, 0xB154, 0xD4FE, /* 0x00 */
+ 0, 0xB158, 0xD541, 0, 0xB15A, 0, 0xB156, 0xB15E, /* 0x10 */
+ 0, 0xB15B, 0xD4F7, 0xB155, 0, 0xD4F6, 0xD4F4, 0xD543, /* 0x10 */
+ 0xD4F8, 0, 0xB157, 0xD542, 0xB15C, 0xD4FD, 0xD4FC, 0xB15D, /* 0x20 */
+ 0xD4FA, 0xB159, 0, 0, 0, 0, 0xD544, 0, /* 0x20 */
+ 0xD540, 0xD8E7, 0xD8EE, 0xD8E3, 0xB451, 0xD8DF, 0xD8EF, 0xD8D9, /* 0x30 */
+ 0xD8EC, 0xD8EA, 0xD8E4, 0, 0xD8ED, 0xD8E6, 0, 0xD8DE, /* 0x30 */
+ 0xD8F0, 0xD8DC, 0xD8E9, 0xD8DA, 0, 0xD8F1, 0, 0xB452, /* 0x40 */
+ 0, 0xD8EB, 0xDD4F, 0xD8DD, 0xB44F, 0, 0xD8E1, 0, /* 0x40 */
+ 0xB450, 0xD8E0, 0xD8E5, 0, 0, 0xD8E2, 0, 0, /* 0x50 */
+ 0, 0xD8E8, 0, 0, 0, 0, 0xDD53, 0, /* 0x50 */
+ 0, 0, 0xDD56, 0xDD4E, 0, 0xDD50, 0, 0xDD55, /* 0x60 */
+ 0xDD54, 0xB743, 0, 0xD8DB, 0xDD52, 0, 0, 0xB744, /* 0x60 */
+ 0, 0xDD4D, 0xDD51, 0, 0, 0, 0, 0xE1A9, /* 0x70 */
+ 0, 0xE1B0, 0xE1A7, 0, 0xE1AE, 0xE1A5, 0xE1AD, 0xE1B1, /* 0x70 */
+ 0xE1A4, 0xE1A8, 0xE1A3, 0, 0xB9F1, 0, 0xE1A6, 0xB9F2, /* 0x80 */
+ 0xE1AC, 0xE1AB, 0xE1AA, 0, 0, 0xE1AF, 0, 0, /* 0x80 */
+ 0, 0, 0xE565, 0xE567, 0xBC6B, 0xE568, 0, 0xE563, /* 0x90 */
+ 0, 0xE562, 0xE56C, 0, 0xE56A, 0xBC6A, 0xE56D, 0xE564, /* 0x90 */
+ 0xE569, 0xE56B, 0xE566, 0, 0, 0, 0, 0xE961, /* 0xA0 */
+ 0xE966, 0xE960, 0xE965, 0, 0xE95E, 0xE968, 0xE964, 0xE969, /* 0xA0 */
+ 0xE963, 0xE95F, 0xE967, 0, 0xE96A, 0xE962, 0, 0xECDA, /* 0xB0 */
+ 0xC0AF, 0, 0xC0AD, 0, 0xC0AC, 0xC0AE, 0, 0, /* 0xB0 */
+ 0xEFC4, 0, 0xF172, 0xF1FD, 0, 0, 0xF444, 0xF445, /* 0xC0 */
+ 0, 0xC460, 0, 0xF5C9, 0, 0xC4DE, 0, 0xF5CA, /* 0xC0 */
+ 0, 0xF6DE, 0xC572, 0, 0xC571, 0xF6DD, 0xC5C9, 0, /* 0xD0 */
+ 0xF7D6, 0, 0, 0, 0, 0xA474, 0xA67B, 0xC9DA, /* 0xD0 */
+ 0xCACA, 0xA8B5, 0xB15F, 0, 0, 0xA475, 0xA5AA, 0xA5A9, /* 0xE0 */
+ 0xA5A8, 0, 0, 0xA7C5, 0, 0, 0xAE74, 0, /* 0xE0 */
+ 0xDD57, 0xA476, 0xA477, 0xA478, 0xA4DA, 0, 0, 0xABD1, /* 0xF0 */
+ 0, 0xCEAF, 0, 0, 0, 0xB453, 0xA479, 0xC95D /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_5E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA5AB, 0xA5AC, 0xC978, 0, 0xA67C, 0, /* 0x00 */
+ 0, 0, 0xCACB, 0, 0xA7C6, 0, 0xCACC, 0, /* 0x00 */
+ 0, 0xA9AE, 0, 0, 0xCC6E, 0xA9AC, 0xA9AB, 0xCC6D, /* 0x10 */
+ 0xA9A9, 0xCC6F, 0xA9AA, 0xA9AD, 0, 0xABD2, 0, 0xABD4, /* 0x10 */
+ 0xCEB3, 0xCEB0, 0xCEB1, 0xCEB2, 0xCEB4, 0xABD3, 0, 0, /* 0x20 */
+ 0xD174, 0xD173, 0, 0xAE76, 0, 0xAE75, 0, 0, /* 0x20 */
+ 0, 0, 0, 0xB162, 0xD546, 0, 0xB161, 0xB163, /* 0x30 */
+ 0xB160, 0, 0, 0, 0, 0xB455, 0xD545, 0, /* 0x30 */
+ 0xB456, 0xD8F3, 0, 0xB457, 0xD8F2, 0xB454, 0, 0, /* 0x40 */
+ 0, 0, 0xDD5A, 0xDD5C, 0xB745, 0xDD5B, 0xDD59, 0xDD58, /* 0x40 */
+ 0, 0, 0, 0xE1B4, 0xB9F7, 0xB9F5, 0, 0xB9F6, /* 0x50 */
+ 0xE1B2, 0xE1B3, 0, 0xB9F3, 0xE571, 0xE56F, 0, 0xBC6D, /* 0x50 */
+ 0xE570, 0xBC6E, 0xBC6C, 0xB9F4, 0, 0, 0xE96D, 0xE96B, /* 0x60 */
+ 0xE96C, 0xE56E, 0xECDC, 0xC0B0, 0xECDB, 0xEFC5, 0xEFC6, 0xE96E, /* 0x60 */
+ 0xF1FE, 0, 0xA47A, 0xA5AD, 0xA67E, 0xC9DB, 0xA67D, 0, /* 0x70 */
+ 0xA9AF, 0xB746, 0, 0xA4DB, 0xA5AE, 0xABD5, 0xB458, 0, /* 0x70 */
+ 0xC979, 0, 0xC97A, 0, 0xC9DC, 0, 0, 0xA7C8, /* 0x80 */
+ 0xCAD0, 0xCACE, 0xA7C9, 0xCACD, 0xCACF, 0xCAD1, 0, 0xA7C7, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xA9B3, 0xA9B4, 0xA9B1, /* 0x90 */
+ 0, 0, 0xA9B0, 0xCEB8, 0xA9B2, 0, 0, 0, /* 0x90 */
+ 0xABD6, 0, 0xCEB7, 0xCEB9, 0xCEB6, 0xCEBA, 0xABD7, 0xAE79, /* 0xA0 */
+ 0xD175, 0, 0xD177, 0xAE77, 0xD178, 0xAE78, 0xD176, 0, /* 0xA0 */
+ 0xCEB5, 0xD547, 0xD54A, 0xD54B, 0xD548, 0xB167, 0xB166, 0xB164, /* 0xB0 */
+ 0xB165, 0xD549, 0, 0, 0, 0, 0xB168, 0, /* 0xB0 */
+ 0, 0xB45A, 0xB45B, 0, 0xB45C, 0xDD5D, 0xDD5F, 0xDD61, /* 0xC0 */
+ 0xB748, 0xB747, 0xB459, 0xDD60, 0xDD5E, 0, 0xE1B8, 0, /* 0xC0 */
+ 0, 0xE1B6, 0xE1BC, 0xB9F8, 0xE1BD, 0xE1BA, 0xB9F9, 0xE1B7, /* 0xD0 */
+ 0xE1B5, 0xE1BB, 0xBC70, 0xE573, 0xE1B9, 0xBC72, 0xE574, 0xBC71, /* 0xD0 */
+ 0xBC74, 0xE575, 0xBC6F, 0xBC73, 0, 0xE973, 0xE971, 0xE970, /* 0xE0 */
+ 0xE972, 0xE96F, 0, 0, 0xC366, 0, 0xF446, 0xF447, /* 0xE0 */
+ 0, 0xF5CB, 0xF6DF, 0xC655, 0, 0, 0xA9B5, 0xA7CA, /* 0xF0 */
+ 0, 0, 0xABD8, 0, 0, 0, 0xA47B, 0xA4DC /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_5F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA5AF, 0xC9DD, 0, 0xA7CB, 0xCAD2, 0, 0xCEBB, /* 0x00 */
+ 0xABD9, 0, 0xB9FA, 0xA47C, 0, 0, 0, 0xA6A1, /* 0x00 */
+ 0, 0, 0xB749, 0xA47D, 0xA4DD, 0xA4DE, 0, 0xA5B1, /* 0x10 */
+ 0xA5B0, 0, 0xC9DE, 0xA6A2, 0, 0xCAD3, 0, 0xA7CC, /* 0x10 */
+ 0, 0, 0xCC71, 0xCC72, 0xCC73, 0, 0xA9B6, 0xA9B7, /* 0x20 */
+ 0xCC70, 0xA9B8, 0, 0, 0, 0xABDA, 0xCEBC, 0, /* 0x20 */
+ 0xD17A, 0xAE7A, 0, 0xD179, 0, 0xB169, 0xD54C, 0xB16A, /* 0x30 */
+ 0xD54D, 0, 0, 0, 0xB45D, 0, 0, 0, /* 0x30 */
+ 0xDD62, 0, 0, 0xE1BF, 0xE1BE, 0, 0xB9FB, 0, /* 0x40 */
+ 0xBC75, 0xE576, 0xBECA, 0xE974, 0xC0B1, 0, 0xC573, 0xF7D8, /* 0x40 */
+ 0, 0, 0, 0, 0xCC74, 0, 0xCEBD, 0xB16B, /* 0x50 */
+ 0xD8F4, 0xB74A, 0, 0, 0, 0xC255, 0, 0, /* 0x50 */
+ 0, 0, 0xA7CE, 0, 0xA7CD, 0xABDB, 0, 0xD17B, /* 0x60 */
+ 0, 0xB16D, 0xB343, 0xB16E, 0xB16C, 0xB45E, 0, 0xE1C0, /* 0x60 */
+ 0xB9FC, 0xBC76, 0, 0xC94C, 0xC9DF, 0, 0xCAD5, 0xA7CF, /* 0x70 */
+ 0xCAD4, 0xA7D0, 0, 0, 0xA9BC, 0xCC77, 0xCC76, 0xA9BB, /* 0x70 */
+ 0xA9B9, 0xA9BA, 0xCC75, 0, 0, 0xABDD, 0xCEBE, 0xABE0, /* 0x80 */
+ 0xABDC, 0xABE2, 0xABDE, 0xABDF, 0xABE1, 0, 0, 0, /* 0x80 */
+ 0xAE7D, 0xAE7C, 0xAE7B, 0, 0, 0, 0xD54F, 0xB16F, /* 0x90 */
+ 0xB172, 0xB170, 0, 0xD54E, 0xB175, 0, 0xB171, 0xD550, /* 0x90 */
+ 0xB174, 0xB173, 0, 0, 0, 0xD8F6, 0xD8F5, 0, /* 0xA0 */
+ 0xB461, 0xB45F, 0xB460, 0xD8F7, 0xB74B, 0xDD64, 0xB74C, 0xDD63, /* 0xA0 */
+ 0, 0, 0xE577, 0, 0, 0xBC78, 0xE1C1, 0xBC77, /* 0xB0 */
+ 0, 0xB9FD, 0, 0xECDE, 0xE975, 0xC0B2, 0xECDD, 0xF240, /* 0xB0 */
+ 0xF448, 0xF449, 0, 0xA4DF, 0, 0xA5B2, 0, 0, /* 0xC0 */
+ 0, 0xC97B, 0, 0, 0xA7D2, 0xA7D4, 0, 0xC9E2, /* 0xC0 */
+ 0xCAD8, 0xCAD7, 0xCAD6, 0, 0xC9E1, 0xC9E0, 0xA6A4, 0xA7D3, /* 0xD0 */
+ 0xA7D1, 0xA6A3, 0, 0, 0, 0xA9BD, 0xCC78, 0, /* 0xD0 */
+ 0xA9BE, 0xCADD, 0, 0xCADF, 0xCADE, 0xCC79, 0, 0, /* 0xE0 */
+ 0xCADA, 0, 0xA7D8, 0xA7D6, 0, 0xCAD9, 0xCADB, 0xCAE1, /* 0xE0 */
+ 0, 0xA7D5, 0, 0xCADC, 0xCAE5, 0xA9C0, 0, 0xCAE2, /* 0xF0 */
+ 0xA7D7, 0, 0xCAE0, 0xCAE3, 0, 0xA9BF, 0, 0xA9C1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_60[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCAE4, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0xCCAF, 0xCCA2, 0xCC7E, 0xCCAE, 0xCCA9, 0xABE7, 0xA9C2, /* 0x00 */
+ 0xCCAA, 0xCCAD, 0xABE3, 0xCCAC, 0xA9C3, 0xA9C8, 0xA9C6, 0xCCA3, /* 0x10 */
+ 0, 0xCC7C, 0xCCA5, 0xA9CD, 0xCCB0, 0xABE4, 0xCCA6, 0, /* 0x10 */
+ 0xABE5, 0xA9C9, 0xCCA8, 0, 0xCECD, 0xABE6, 0xCC7B, 0xA9CA, /* 0x20 */
+ 0xABE8, 0xA9CB, 0xA9C7, 0xA9CC, 0xCCA7, 0xCC7A, 0xCCAB, 0xA9C4, /* 0x20 */
+ 0, 0, 0xCC7D, 0xCCA4, 0xCCA1, 0xA9C5, 0, 0xCEBF, /* 0x30 */
+ 0, 0xCEC0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0xCECA, 0xD1A1, 0xCECB, 0xABEE, 0xCECE, 0xCEC4, 0xABED, 0xCEC6, /* 0x40 */
+ 0, 0xCEC7, 0, 0, 0xCEC9, 0xABE9, 0, 0, /* 0x40 */
+ 0xAEA3, 0, 0xF9DA, 0xCEC5, 0xCEC1, 0xAEA4, 0, 0, /* 0x50 */
+ 0xCECF, 0xAE7E, 0xD17D, 0xCEC8, 0, 0xD17C, 0xCEC3, 0xCECC, /* 0x50 */
+ 0, 0, 0xABEC, 0xAEA1, 0xABF2, 0xAEA2, 0xCED0, 0xD17E, /* 0x60 */
+ 0xABEB, 0xAEA6, 0xABF1, 0xABF0, 0xABEF, 0xAEA5, 0xCED1, 0xAEA7, /* 0x60 */
+ 0xABEA, 0, 0xCEC2, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB176, /* 0x70 */
+ 0xD1A4, 0xD1A6, 0, 0xD1A8, 0xAEA8, 0xAEAE, 0xD553, 0xD1AC, /* 0x80 */
+ 0xD1A3, 0xB178, 0xD551, 0, 0xAEAD, 0xAEAB, 0xD1AE, 0, /* 0x80 */
+ 0xD552, 0, 0xD1A5, 0, 0xAEAC, 0xD1A9, 0xAEAF, 0xD1AB, /* 0x90 */
+ 0, 0, 0xAEAA, 0xD1AA, 0xD1AD, 0xD1A7, 0, 0xAEA9, /* 0x90 */
+ 0xB179, 0, 0xD1A2, 0xB177, 0, 0, 0, 0, /* 0xA0 */
+ 0xB17A, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xD555, 0xD55E, 0xB464, 0, 0xB17C, 0xB1A3, 0xB465, 0xD560, /* 0xB0 */
+ 0xB1AA, 0xD8F9, 0xD556, 0xB1A2, 0xB1A5, 0xB17E, 0xD554, 0xD562, /* 0xB0 */
+ 0xD565, 0xD949, 0, 0xD563, 0xD8FD, 0xB1A1, 0xB1A8, 0xB1AC, /* 0xC0 */
+ 0xD55D, 0xD8F8, 0xD561, 0xB17B, 0xD8FA, 0xD564, 0xD8FC, 0xD559, /* 0xC0 */
+ 0, 0xB462, 0, 0xD557, 0xD558, 0xB1A7, 0, 0, /* 0xD0 */
+ 0xB1A6, 0xD55B, 0xB1AB, 0xD55F, 0xB1A4, 0xD55C, 0, 0xB1A9, /* 0xD0 */
+ 0xB466, 0xB463, 0xD8FB, 0, 0xD55A, 0, 0xB17D, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0xB46B, 0xB46F, 0xD940, 0xB751, 0xB46D, 0xD944, 0xB471, 0xDD65, /* 0xF0 */
+ 0xD946, 0xB753, 0xB469, 0xB46C, 0xD947, 0, 0xD948, 0xD94E /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_61[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB473, 0xB754, 0, 0xD94A, 0xD94F, 0xD943, 0xB75E, 0, /* 0x00 */
+ 0xB755, 0xB472, 0xD941, 0xD950, 0, 0xB75D, 0xB470, 0xB74E, /* 0x00 */
+ 0xD94D, 0, 0xB474, 0xD945, 0xD8FE, 0xB46A, 0xD942, 0, /* 0x10 */
+ 0xD94B, 0, 0xB74D, 0xB752, 0xB467, 0xD94C, 0, 0xB750, /* 0x10 */
+ 0, 0, 0, 0xB468, 0, 0, 0, 0xB75C, /* 0x20 */
+ 0xE1C3, 0xDD70, 0, 0xDD68, 0xE1C2, 0, 0xDD6C, 0xDD6E, /* 0x20 */
+ 0, 0, 0xDD6B, 0, 0xB75B, 0, 0xDD6A, 0xB75F, /* 0x30 */
+ 0, 0, 0, 0xE1D2, 0, 0, 0xB75A, 0xBA40, /* 0x30 */
+ 0xDD71, 0xE1C4, 0, 0, 0xB758, 0xDD69, 0xDD6D, 0xB9FE, /* 0x40 */
+ 0xB74F, 0xDD66, 0xDD67, 0xBA41, 0xB757, 0xB759, 0xB756, 0xDD6F, /* 0x40 */
+ 0, 0, 0xE1C8, 0xE1C9, 0xE1CE, 0xBC7D, 0xE1D5, 0, /* 0x50 */
+ 0xBA47, 0, 0xBA46, 0xE1D0, 0, 0xBC7C, 0xE1C5, 0xBA45, /* 0x50 */
+ 0, 0xE1D4, 0xBA43, 0xBA44, 0, 0xE1D1, 0xE5AA, 0xBC7A, /* 0x60 */
+ 0xB46E, 0, 0xE1D3, 0xBCA3, 0xE1CB, 0, 0xBC7B, 0, /* 0x60 */
+ 0xBCA2, 0xE1C6, 0xE1CA, 0xE1C7, 0xE1CD, 0xBA48, 0xBC79, 0xBA42, /* 0x70 */
+ 0, 0xE57A, 0xE1CF, 0, 0xBCA1, 0, 0xBCA4, 0, /* 0x70 */
+ 0xE1CC, 0, 0xBC7E, 0xE579, 0, 0, 0, 0, /* 0x80 */
+ 0, 0xE57E, 0xBECE, 0xE578, 0xE9A3, 0xE5A9, 0xBCA8, 0, /* 0x80 */
+ 0xBCA6, 0xBECC, 0xE5A6, 0xE5A2, 0xBCAC, 0, 0xE978, 0, /* 0x90 */
+ 0, 0, 0xBCAA, 0xE5A1, 0, 0xE976, 0, 0xE5A5, /* 0x90 */
+ 0, 0xE5A8, 0xE57D, 0, 0xBCAB, 0, 0, 0xBCA5, /* 0xA0 */
+ 0xE977, 0xBECD, 0xE5A7, 0xBCA7, 0xBCA9, 0xE5A4, 0xBCAD, 0xE5A3, /* 0xA0 */
+ 0xE57C, 0xE57B, 0xBECB, 0xE5AB, 0xE97A, 0xECE0, 0xBED0, 0, /* 0xB0 */
+ 0xE9A2, 0, 0xE97E, 0, 0xECE1, 0, 0xBED1, 0xE9A1, /* 0xB0 */
+ 0, 0xE97C, 0xC0B4, 0xECDF, 0, 0xE979, 0xE97B, 0xC0B5, /* 0xC0 */
+ 0xBED3, 0xC0B3, 0xBED2, 0xC0B7, 0xE97D, 0xBECF, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0xEFCF, 0, /* 0xD0 */
+ 0xEFC7, 0, 0, 0, 0, 0, 0xECE7, 0xEFC8, /* 0xD0 */
+ 0xECE3, 0, 0, 0xC256, 0xECE5, 0xECE4, 0xC0B6, 0xECE2, /* 0xE0 */
+ 0xECE6, 0xEFD0, 0xEFCC, 0xEFCE, 0, 0xEFC9, 0xEFCA, 0, /* 0xE0 */
+ 0xEFCD, 0xEFCB, 0xC367, 0, 0, 0xC36A, 0xC369, 0xC368, /* 0xF0 */
+ 0xC461, 0xF44A, 0xC462, 0xF241, 0xC4DF, 0xF5CC, 0xC4E0, 0xC574 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_62[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC5CA, 0xF7D9, 0, 0xF7DA, 0xF7DB, 0, 0, 0xF9BA, /* 0x00 */
+ 0xA4E0, 0xC97C, 0xA5B3, 0, 0xA6A6, 0xA6A7, 0xA6A5, 0, /* 0x00 */
+ 0xA6A8, 0xA7DA, 0xA7D9, 0, 0xCCB1, 0xA9CF, 0xA9CE, 0, /* 0x10 */
+ 0, 0xD1AF, 0xB1AD, 0xB1AE, 0, 0, 0, 0xB475, /* 0x10 */
+ 0xDD72, 0xB760, 0xB761, 0xDD74, 0xDD76, 0xDD75, 0, 0xE1D7, /* 0x20 */
+ 0, 0xE1D6, 0xBA49, 0xE1D8, 0, 0xE5AC, 0xBCAE, 0, /* 0x20 */
+ 0xBED4, 0, 0xC0B8, 0xC257, 0xC0B9, 0, 0xA4E1, 0, /* 0x30 */
+ 0, 0, 0xCAE6, 0, 0, 0xCCB2, 0xA9D1, 0xA9D0, /* 0x30 */
+ 0xA9D2, 0xABF3, 0xCED2, 0xCED3, 0, 0, 0xD1B0, 0xAEB0, /* 0x40 */
+ 0xB1AF, 0xB476, 0xD951, 0xA4E2, 0, 0xA47E, 0xA4E3, 0, /* 0x40 */
+ 0xC97D, 0xA5B7, 0xA5B6, 0xA5B4, 0xA5B5, 0, 0, 0, /* 0x50 */
+ 0xA6AB, 0xC9E9, 0xC9EB, 0xA6AA, 0xC9E3, 0, 0xC9E4, 0, /* 0x50 */
+ 0xC9EA, 0xC9E6, 0xC9E8, 0xA6A9, 0xC9E5, 0xC9EC, 0xC9E7, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xA7E1, 0xA7EA, 0xA7E8, /* 0x60 */
+ 0xCAF0, 0xCAED, 0xCAF5, 0xA7E6, 0xCAF6, 0, 0xA7DF, 0xCAF3, /* 0x70 */
+ 0, 0xA7E5, 0xCAEF, 0xCAEE, 0xA7E3, 0xCAF4, 0xA7E4, 0xA9D3, /* 0x70 */
+ 0xA7DE, 0xCAF1, 0, 0xCAE7, 0xA7DB, 0, 0xA7EE, 0xCAEC, /* 0x80 */
+ 0xCAF2, 0xA7E0, 0xA7E2, 0, 0xCAE8, 0, 0xCAE9, 0xCAEA, /* 0x80 */
+ 0, 0xA7ED, 0xA7E7, 0xA7EC, 0xCAEB, 0xA7EB, 0xA7DD, 0xA7DC, /* 0x90 */
+ 0xA7E9, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xA9E1, 0xCCBE, 0xCCB7, 0xA9DC, 0xA9EF, 0xCCB3, 0xCCBA, 0xCCBC, /* 0xA0 */
+ 0xCCBF, 0xA9EA, 0, 0xCCBB, 0xCCB4, 0xA9E8, 0xCCB8, 0, /* 0xB0 */
+ 0xCCC0, 0xA9D9, 0, 0xCCBD, 0xA9E3, 0xA9E2, 0xCCB6, 0xA9D7, /* 0xB0 */
+ 0, 0, 0xA9D8, 0, 0xA9D6, 0, 0xA9EE, 0xA9E6, /* 0xC0 */
+ 0xA9E0, 0xA9D4, 0xCCB9, 0xA9DF, 0xA9D5, 0xA9E7, 0xA9F0, 0xCED4, /* 0xC0 */
+ 0xA9E4, 0xCCB5, 0xA9DA, 0xA9DD, 0xA9DE, 0, 0xA9EC, 0xA9ED, /* 0xD0 */
+ 0xA9EB, 0xA9E5, 0xA9E9, 0xA9DB, 0xABF4, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xCEDA, 0xAC41, 0xABF8, 0xABFA, 0xAC40, /* 0xE0 */
+ 0xCEE6, 0xABFD, 0xD1B1, 0xAEB1, 0xAC43, 0xCED7, 0xCEDF, 0xABFE, /* 0xF0 */
+ 0xCEDE, 0xCEDB, 0xCEE3, 0xCEE5, 0xABF7, 0xABFB, 0xAC42, 0xAEB3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_63[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCEE0, 0xABF9, 0xAC45, 0xCED9, 0, 0, 0, 0xABFC, /* 0x00 */
+ 0xAEB2, 0xABF6, 0, 0xCED6, 0xCEDD, 0xCED5, 0xCED8, 0xCEDC, /* 0x00 */
+ 0xD1B2, 0xAC44, 0, 0xCEE1, 0xCEE2, 0xCEE4, 0xABF5, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xAEC1, 0xD1BE, 0xAEBF, 0xAEC0, 0xD1B4, 0xD1C4, 0, 0xAEB6, /* 0x20 */
+ 0, 0, 0xD566, 0xD1C6, 0xD1C0, 0, 0xD1B7, 0, /* 0x30 */
+ 0xD1C9, 0xD1BA, 0xAEBC, 0xD57D, 0xD1BD, 0xAEBE, 0xAEB5, 0, /* 0x30 */
+ 0xD1CB, 0xD1BF, 0xAEB8, 0xD1B8, 0xD1B5, 0xD1B6, 0xAEB9, 0xD1C5, /* 0x40 */
+ 0xD1CC, 0xAEBB, 0xD1BC, 0xD1BB, 0xAEC3, 0xAEC2, 0xAEB4, 0xAEBA, /* 0x40 */
+ 0xAEBD, 0xD1C8, 0, 0, 0xD1C2, 0xAEB7, 0xD1B3, 0xD1CA, /* 0x50 */
+ 0xD1C1, 0xD1C3, 0xD1C7, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xD567, 0, 0xB1B7, /* 0x60 */
+ 0xB1CB, 0xB1CA, 0, 0xB1BF, 0, 0xD579, 0xD575, 0xD572, /* 0x60 */
+ 0xD5A6, 0xB1BA, 0xB1B2, 0, 0, 0xD577, 0xB4A8, 0xB1B6, /* 0x70 */
+ 0xD5A1, 0, 0xB1CC, 0xB1C9, 0xD57B, 0xD56A, 0, 0, /* 0x70 */
+ 0xB1C8, 0xD5A3, 0xD569, 0xB1BD, 0xB1C1, 0xD5A2, 0, 0xD573, /* 0x80 */
+ 0xB1C2, 0xB1BC, 0xD568, 0, 0xB478, 0xD5A5, 0xD571, 0xB1C7, /* 0x80 */
+ 0xD574, 0xD5A4, 0xB1C6, 0, 0xD952, 0, 0xB1B3, 0xD56F, /* 0x90 */
+ 0xB1B8, 0xB1C3, 0, 0xB1BE, 0xD578, 0xD56E, 0xD56C, 0xD57E, /* 0x90 */
+ 0xB1B0, 0xB1C4, 0xB1B4, 0xB477, 0xD57C, 0xB1B5, 0, 0xB1B1, /* 0xA0 */
+ 0xB1C0, 0xB1BB, 0xB1B9, 0xD570, 0xB1C5, 0xD56D, 0xD57A, 0xD576, /* 0xA0 */
+ 0xD954, 0xD953, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xD56B, 0xD964, 0, /* 0xB0 */
+ 0xB47A, 0, 0xD96A, 0xD959, 0xD967, 0xDD77, 0xB47D, 0xD96B, /* 0xC0 */
+ 0xD96E, 0xB47C, 0xD95C, 0xD96D, 0xD96C, 0xB47E, 0xD955, 0xB479, /* 0xC0 */
+ 0xB4A3, 0, 0xB4A1, 0xD969, 0, 0xD95F, 0xB4A5, 0xD970, /* 0xD0 */
+ 0xD968, 0xD971, 0xB4AD, 0xB4AB, 0xD966, 0xD965, 0, 0xD963, /* 0xD0 */
+ 0xD95D, 0xB4A4, 0, 0xB4A2, 0xD1B9, 0xD956, 0, 0xDDB7, /* 0xE0 */
+ 0xD957, 0xB47B, 0xB4AA, 0xDD79, 0, 0xB4A6, 0xB4A7, 0xD958, /* 0xE0 */
+ 0xD96F, 0xDD78, 0xD960, 0xD95B, 0xB4A9, 0xD961, 0xD95E, 0, /* 0xF0 */
+ 0, 0xB4AE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_64[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB770, 0, /* 0x00 */
+ 0, 0xDD7C, 0xDDB1, 0xDDB6, 0xDDAA, 0xB76C, 0xDDBB, 0xB769, /* 0x00 */
+ 0xDD7A, 0, 0xDD7B, 0xB762, 0xB76B, 0xDDA4, 0xB76E, 0xB76F, /* 0x10 */
+ 0xDDA5, 0, 0xDDB2, 0xDDB8, 0xB76A, 0, 0xB764, 0xDDA3, /* 0x10 */
+ 0xDD7D, 0xDDBA, 0xDDA8, 0xDDA9, 0xDD7E, 0xDDB4, 0xDDAB, 0xDDB5, /* 0x20 */
+ 0xDDAD, 0, 0xB765, 0xE1D9, 0xB768, 0xB766, 0xDDB9, 0xDDB0, /* 0x20 */
+ 0xDDAC, 0, 0, 0xDDA1, 0xBA53, 0xDDAF, 0xB76D, 0xDDA7, /* 0x30 */
+ 0, 0xDDA6, 0, 0, 0, 0xB767, 0xB763, 0xE1EE, /* 0x30 */
+ 0xDDB3, 0xDDAE, 0, 0xDDA2, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0xE1E9, 0, 0xE1DA, 0xE1E5, 0, /* 0x40 */
+ 0xE1EC, 0xBA51, 0xB4AC, 0xE1EA, 0xBA4C, 0, 0, 0, /* 0x50 */
+ 0xBA4B, 0xE1F1, 0, 0xE1DB, 0xE1E8, 0xE1DC, 0xE1E7, 0xBA4F, /* 0x50 */
+ 0xE1EB, 0xD962, 0, 0, 0, 0xE1F2, 0xE1E3, 0xBA52, /* 0x60 */
+ 0xE5BA, 0xBCAF, 0, 0xE1F0, 0xE1EF, 0xBA54, 0xE5AD, 0xBCB0, /* 0x60 */
+ 0xE5AE, 0, 0xE1DF, 0xE1E0, 0xE1DD, 0xE1E2, 0xE1DE, 0xE1F3, /* 0x70 */
+ 0xBA4E, 0xBCB1, 0xBA50, 0xBA55, 0, 0xE1E1, 0, 0xE1ED, /* 0x70 */
+ 0, 0, 0xE1E6, 0, 0, 0xE5B1, 0, 0xBA4A, /* 0x80 */
+ 0xBCB4, 0xE9AA, 0xE5B6, 0xE5B5, 0xE5B7, 0, 0, 0xE5B4, /* 0x80 */
+ 0xBCB5, 0, 0xBCBB, 0xBCB8, 0, 0xBCB9, 0xE5AF, 0xE5B2, /* 0x90 */
+ 0xE5BC, 0xBCC1, 0xBCBF, 0, 0xE5B3, 0xD95A, 0xBCB2, 0xE5B9, /* 0x90 */
+ 0xE5B0, 0, 0xBCC2, 0xE5B8, 0xBA4D, 0xBCB7, 0xE1E4, 0, /* 0xA0 */
+ 0, 0xBCBA, 0, 0xBCBE, 0xBCC0, 0xBCBD, 0xBCBC, 0, /* 0xA0 */
+ 0xBCB6, 0xE5BB, 0xBCB3, 0xBCC3, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0xBED8, 0xBED9, 0xE9A9, 0xBEE2, 0xBEDF, /* 0xB0 */
+ 0, 0xBED6, 0xBEDD, 0xE9AB, 0xBEDB, 0xBED5, 0, 0xBEDC, /* 0xC0 */
+ 0, 0xE9A8, 0xC0BB, 0xBED7, 0, 0xBEDE, 0xC0BA, 0xE9A7, /* 0xC0 */
+ 0xE9A6, 0, 0xBEE0, 0, 0xBEE1, 0, 0xE9A5, 0xE9A4, /* 0xD0 */
+ 0xC0BC, 0xE9AE, 0xBEDA, 0xE9AC, 0, 0, 0, 0, /* 0xD0 */
+ 0xC0BD, 0, 0xC0C2, 0xECEA, 0xECEC, 0, 0xC0BF, 0, /* 0xE0 */
+ 0xECED, 0xECE9, 0, 0xECEB, 0xC0C0, 0xC0C3, 0, 0xECE8, /* 0xE0 */
+ 0xC0BE, 0xC0C1, 0xC259, 0xE9AD, 0xC258, 0, 0, 0xC25E, /* 0xF0 */
+ 0xEFD4, 0, 0xC25C, 0xC25D, 0xEFD7, 0xEFD3, 0xC25A, 0xEFD1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_65[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC36B, 0xEFD5, 0, 0xEFD6, 0xEFD2, 0, 0xC25B, 0xF242, /* 0x00 */
+ 0, 0xF245, 0, 0, 0xF246, 0xF244, 0xF247, 0xC36C, /* 0x00 */
+ 0xF243, 0, 0, 0xF44E, 0xC464, 0xF44D, 0xF44C, 0xF44B, /* 0x10 */
+ 0xC463, 0xC465, 0, 0xF5CD, 0xC4E2, 0xC4E1, 0, 0, /* 0x10 */
+ 0xF6E1, 0xF6E0, 0xF6E3, 0xC5CB, 0xC575, 0xF7DD, 0xF6E2, 0, /* 0x20 */
+ 0, 0xF7DC, 0xC5CD, 0xC5CC, 0xC5F3, 0xF8A9, 0xF8EF, 0xA4E4, /* 0x20 */
+ 0, 0, 0xD972, 0xE9AF, 0, 0, 0xA6AC, 0xCAF7, /* 0x30 */
+ 0xA7F1, 0xA7EF, 0, 0xA7F0, 0, 0xCCC1, 0xA9F1, 0xAC46, /* 0x30 */
+ 0, 0xCEE7, 0, 0xCEE8, 0, 0xAC47, 0xD1CE, 0, /* 0x40 */
+ 0xAEC4, 0xAEC5, 0xD1CD, 0, 0, 0, 0, 0xB1D3, /* 0x40 */
+ 0, 0xB1CF, 0, 0xD5A7, 0xB1D6, 0xB1D5, 0xB1CE, 0xB1D1, /* 0x50 */
+ 0xB1D4, 0xB1D0, 0, 0, 0xD976, 0xB1CD, 0xB4AF, 0, /* 0x50 */
+ 0, 0, 0xB4B1, 0xB4B2, 0xD975, 0xD978, 0xB4B0, 0xD973, /* 0x60 */
+ 0xD977, 0, 0xD974, 0, 0xB771, 0, 0, 0xDDBC, /* 0x60 */
+ 0, 0, 0xBA56, 0xE1F4, 0xBEE3, 0xBCC4, 0xE5BD, 0xBCC5, /* 0x70 */
+ 0xBCC6, 0xE5BF, 0xE5BE, 0xE5C0, 0xE9B1, 0, 0, 0xE9B0, /* 0x70 */
+ 0xECEF, 0xECEE, 0xC0C4, 0xC0C5, 0xF248, 0, 0, 0xA4E5, /* 0x80 */
+ 0, 0, 0, 0, 0xD979, 0, 0, 0, /* 0x80 */
+ 0xB4B4, 0xB4B3, 0xDDBD, 0, 0xEFD8, 0xC4E3, 0xF7DE, 0xA4E6, /* 0x90 */
+ 0, 0xAEC6, 0, 0xB1D8, 0xB1D7, 0xD97A, 0xD97B, 0xB772, /* 0x90 */
+ 0xE1F5, 0xBA57, 0xE9B2, 0, 0xA4E7, 0xA5B8, 0, 0xA9F2, /* 0xA0 */
+ 0xCCC2, 0, 0xCEE9, 0xAC48, 0xB1D9, 0, 0xD97C, 0xB4B5, /* 0xA0 */
+ 0xB773, 0, 0xE5C1, 0xE5C2, 0, 0, 0xECF0, 0xC25F, /* 0xB0 */
+ 0xF8F0, 0xA4E8, 0, 0xCCC3, 0xA9F3, 0xAC49, 0, 0xCEEA, /* 0xB0 */
+ 0, 0xAEC7, 0xD1D2, 0xD1D0, 0xD1D1, 0xAEC8, 0xD1CF, 0, /* 0xC0 */
+ 0, 0, 0, 0xB1DB, 0xB1DC, 0xD5A8, 0xB1DD, 0xB1DA, /* 0xC0 */
+ 0xD97D, 0, 0xD97E, 0xDDBE, 0, 0, 0xBA59, 0xBA58, /* 0xD0 */
+ 0, 0, 0xECF1, 0xEFD9, 0, 0xF24A, 0xF249, 0xF44F, /* 0xD0 */
+ 0, 0xC95E, 0xAC4A, 0, 0, 0xA4E9, 0xA5B9, 0, /* 0xE0 */
+ 0xA6AE, 0xA6AD, 0, 0, 0xA6AF, 0xA6B0, 0xC9EE, 0xC9ED, /* 0xE0 */
+ 0xCAF8, 0xA7F2, 0xCAFB, 0xCAFA, 0xCAF9, 0xCAFC, 0, 0, /* 0xF0 */
+ 0, 0, 0xA9F4, 0xCCC9, 0xCCC5, 0xCCCE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_66[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA9FB, 0, 0xA9F9, 0xCCCA, 0xCCC6, 0xCCCD, 0xA9F8, 0xAA40, /* 0x00 */
+ 0xCCC8, 0xCCC4, 0xA9FE, 0xCCCB, 0xA9F7, 0xCCCC, 0xA9FA, 0xA9FC, /* 0x00 */
+ 0xCCD0, 0xCCCF, 0xCCC7, 0xA9F6, 0xA9F5, 0xA9FD, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0xCEEF, 0xCEF5, 0, 0xAC50, /* 0x10 */
+ 0xAC4D, 0xCEEC, 0xCEF1, 0, 0xAC53, 0xAC4B, 0xCEF0, 0xAC4E, /* 0x20 */
+ 0xAC51, 0, 0, 0xCEF3, 0, 0xAC4C, 0xCEF8, 0xAC4F, /* 0x20 */
+ 0, 0xAC52, 0xCEED, 0xCEF2, 0xCEF6, 0xCEEE, 0xCEEB, 0, /* 0x30 */
+ 0, 0xCEF7, 0xCEF4, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xAED0, 0xAEC9, 0xAECC, 0, 0xAECF, 0, 0xD1D5, /* 0x40 */
+ 0, 0xAECA, 0xD1D3, 0, 0xAECE, 0, 0, 0xAECB, /* 0x40 */
+ 0, 0xD1D6, 0xAECD, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0xD5AC, 0xB1DF, 0xD5AB, 0xD5AD, 0xB1DE, 0xB1E3, 0xD1D4, /* 0x50 */
+ 0, 0xD5AA, 0xD5AE, 0, 0xB1E0, 0xD5A9, 0xB1E2, 0, /* 0x60 */
+ 0xB1E1, 0, 0xD9A7, 0, 0xD9A2, 0, 0xB4B6, 0xB4BA, /* 0x60 */
+ 0xB4B7, 0xD9A5, 0xD9A8, 0, 0xB4B8, 0, 0xB4B9, 0xB4BE, /* 0x70 */
+ 0xDDC7, 0xD9A6, 0xB4BC, 0xD9A3, 0xD9A1, 0, 0xB4BD, 0, /* 0x70 */
+ 0xD9A4, 0, 0, 0, 0xB779, 0, 0xDDBF, 0xB776, /* 0x80 */
+ 0xB777, 0xB775, 0xDDC4, 0xDDC3, 0xDDC0, 0xB77B, 0, 0, /* 0x80 */
+ 0xDDC2, 0xB4BB, 0, 0, 0xDDC6, 0xDDC1, 0xB778, 0xB774, /* 0x90 */
+ 0xB77A, 0xDDC5, 0, 0, 0, 0xBA5C, 0, 0xE1F8, /* 0x90 */
+ 0xE1F7, 0xE1F6, 0xBA5A, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xBA5B, 0xE5C5, 0xE5C8, 0xBCC8, 0, 0, 0xBCC7, 0xE5C9, /* 0xA0 */
+ 0xE5C4, 0xBCCA, 0xE5C6, 0, 0xBCC9, 0xE5C3, 0, 0xE5C7, /* 0xB0 */
+ 0xBEE9, 0xBEE6, 0xE9BB, 0xE9BA, 0, 0xE9B9, 0xE9B4, 0, /* 0xB0 */
+ 0xE9B5, 0, 0, 0, 0xBEE7, 0, 0xBEE4, 0xBEE8, /* 0xC0 */
+ 0xE9B3, 0xBEE5, 0xE9B6, 0xE9B7, 0xE9BC, 0, 0, 0xE9B8, /* 0xC0 */
+ 0, 0, 0xECF2, 0, 0, 0, 0xC0C7, 0, /* 0xD0 */
+ 0xEFDC, 0xC0C6, 0xEFDA, 0xEFDB, 0xC260, 0xC36E, 0xF24B, 0, /* 0xD0 */
+ 0xC36D, 0, 0, 0xF451, 0xF452, 0, 0xC466, 0, /* 0xE0 */
+ 0xF450, 0xC4E4, 0, 0xF7DF, 0xC5CE, 0xF8AA, 0xF8AB, 0, /* 0xE0 */
+ 0xA4EA, 0, 0xA6B1, 0xA6B2, 0xA7F3, 0, 0xCCD1, 0xAC54, /* 0xF0 */
+ 0xAED1, 0xB1E4, 0, 0, 0xB0D2, 0, 0xB4BF, 0xB4C0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_67[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB3CC, 0xD9A9, 0, 0xB77C, 0xE1FA, 0xE1F9, 0, 0, /* 0x00 */
+ 0xA4EB, 0xA6B3, 0xCCD2, 0xAA42, 0, 0xAA41, 0, 0xCEF9, /* 0x00 */
+ 0xCEFA, 0, 0xD1D7, 0xD1D8, 0xAED2, 0xAED3, 0, 0xAED4, /* 0x10 */
+ 0xD5AF, 0, 0, 0xB1E6, 0, 0xB4C2, 0, 0xB4C1, /* 0x10 */
+ 0xDDC8, 0xDF7A, 0xE1FB, 0xE9BD, 0, 0, 0xC261, 0xC467, /* 0x20 */
+ 0xA4EC, 0, 0xA5BC, 0xA5BD, 0xA5BB, 0xA5BE, 0xA5BA, 0, /* 0x20 */
+ 0, 0xA6B6, 0, 0xC9F6, 0xA6B5, 0xA6B7, 0, 0, /* 0x30 */
+ 0xC9F1, 0xC9F0, 0xC9F3, 0xC9F2, 0xC9F5, 0xA6B4, 0xC9EF, 0xC9F4, /* 0x30 */
+ 0, 0, 0, 0, 0, 0xCAFD, 0xA7FD, 0xCAFE, /* 0x40 */
+ 0xCB43, 0xA7FC, 0, 0xCB47, 0xCB42, 0xCB45, 0xA7F5, 0xA7F6, /* 0x40 */
+ 0xA7F7, 0xA7F8, 0, 0xA840, 0, 0xCB41, 0xA7FA, 0xA841, /* 0x50 */
+ 0, 0xCB40, 0xCB46, 0, 0xA7F9, 0xCB44, 0xA7FB, 0xA7F4, /* 0x50 */
+ 0xA7FE, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xAA57, 0, 0xCCD4, 0xAA43, 0, 0xAA4D, /* 0x60 */
+ 0xAA4E, 0xAA46, 0xAA58, 0xAA48, 0xCCDC, 0xAA53, 0xCCD7, 0xAA49, /* 0x70 */
+ 0xCCE6, 0xCCE7, 0xCCDF, 0xCCD8, 0xAA56, 0xCCE4, 0xAA51, 0xAA4F, /* 0x70 */
+ 0, 0xCCE5, 0, 0xCCE3, 0xCCDB, 0xCCD3, 0xCCDA, 0xAA4A, /* 0x80 */
+ 0, 0xAA50, 0, 0xAA44, 0xCCDE, 0xCCDD, 0xCCD5, 0, /* 0x80 */
+ 0xAA52, 0xCCE1, 0xCCD6, 0xAA55, 0xCCE8, 0xAA45, 0, 0xAA4C, /* 0x90 */
+ 0xCCD9, 0xCCE2, 0xAA54, 0, 0xAA47, 0xAA4B, 0, 0xCCE0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0xCF5B, 0xAC5C, /* 0xA0 */
+ 0xAC69, 0, 0xCF56, 0xCF4C, 0xAC62, 0xCF4A, 0xAC5B, 0xCF45, /* 0xB0 */
+ 0xAC65, 0xCF52, 0xCEFE, 0xCF41, 0, 0, 0, 0, /* 0xB0 */
+ 0xCF44, 0xCEFB, 0xCF51, 0xCF61, 0xAC60, 0xCF46, 0xCF58, 0, /* 0xC0 */
+ 0xCEFD, 0xCF5F, 0xCF60, 0xCF63, 0xCF5A, 0xCF4B, 0xCF53, 0xAC66, /* 0xC0 */
+ 0xAC59, 0xAC61, 0xAC6D, 0xAC56, 0xAC58, 0, 0, 0, /* 0xD0 */
+ 0xCF43, 0xAC6A, 0xAC63, 0xCF5D, 0xCF40, 0xAC6C, 0xAC67, 0xCF49, /* 0xD0 */
+ 0, 0, 0xAC6B, 0xCF50, 0xCF48, 0xAC64, 0xCF5C, 0xCF54, /* 0xE0 */
+ 0, 0xAC5E, 0xCF62, 0xCF47, 0xAC5A, 0xCF59, 0xCF4F, 0xAC5F, /* 0xE0 */
+ 0xCF55, 0xAC57, 0xCEFC, 0xAC68, 0xAEE3, 0xAC5D, 0xCF4E, 0xCF4D, /* 0xF0 */
+ 0xCF42, 0, 0xCF5E, 0, 0xCF57, 0, 0, 0xAC55 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_68[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD1EC, 0xAEEA, 0xD1ED, 0, 0xD1E1, 0xAEDF, /* 0x10 */
+ 0xAEEB, 0, 0xD1DA, 0, 0xD1E3, 0xD1EB, 0, 0xD1D9, /* 0x10 */
+ 0xD1F4, 0xAED5, 0, 0, 0, 0xD1F3, 0xD1EE, 0, /* 0x20 */
+ 0xD1EF, 0xAEDD, 0xAEE8, 0xD1E5, 0, 0xD1E6, 0xD1F0, 0xD1E7, /* 0x20 */
+ 0, 0xD1E2, 0xD1DC, 0xD1DD, 0xD1EA, 0xD1E4, 0, 0, /* 0x30 */
+ 0xAED6, 0xAEDA, 0xD1F2, 0xD1DE, 0xAEE6, 0xAEE2, 0, 0, /* 0x30 */
+ 0xAEE5, 0xAEEC, 0xAEDB, 0xAEE7, 0xD1E9, 0xAEE9, 0xAED8, 0, /* 0x40 */
+ 0xAED7, 0xD1DB, 0, 0xD1DF, 0xAEE0, 0xD1F1, 0xD1E8, 0xD1E0, /* 0x40 */
+ 0xAEE4, 0xAEE1, 0, 0xAED9, 0xAEDC, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xD5C4, 0, 0xD5B4, 0xD5B5, 0xD5B9, /* 0x60 */
+ 0, 0xD5C8, 0xD5C5, 0, 0xD5BE, 0xD5BD, 0xB1ED, 0xD5C1, /* 0x70 */
+ 0xD5D0, 0xD5B0, 0, 0xD5D1, 0xD5C3, 0xD5D5, 0xD5C9, 0xB1EC, /* 0x70 */
+ 0xD5C7, 0xB1E7, 0xB1FC, 0xB1F2, 0, 0xB1F6, 0xB1F5, 0xD5B1, /* 0x80 */
+ 0, 0xD5CE, 0xD5D4, 0xD5CC, 0xD5D3, 0, 0, 0xD5C0, /* 0x80 */
+ 0xD5B2, 0xD5D2, 0xD5C2, 0xB1EA, 0xB1F7, 0, 0xD5CB, 0xB1F0, /* 0x90 */
+ 0, 0, 0, 0xD5CA, 0xD5B3, 0xB1F8, 0, 0xB1FA, /* 0x90 */
+ 0xD5CD, 0xB1FB, 0xB1E9, 0xD5BA, 0xD5CF, 0, 0, 0xB1EF, /* 0xA0 */
+ 0xB1F9, 0xD5BC, 0xD5C6, 0xD5B7, 0xD5BB, 0xB1F4, 0xD5B6, 0xB1E8, /* 0xA0 */
+ 0xB1F1, 0xB1EE, 0xD5BF, 0xAEDE, 0xD9C0, 0xB1EB, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0xB1F3, 0, 0xD9C3, 0xD9D9, /* 0xC0 */
+ 0xD9CE, 0xB4D6, 0, 0xB4D1, 0xD9BD, 0xB4D2, 0xD9CD, 0, /* 0xC0 */
+ 0xD9C6, 0xD9D3, 0xB4CE, 0xD9AB, 0xD9D5, 0xB4C4, 0xD9B3, 0xB4C7, /* 0xD0 */
+ 0xB4C6, 0, 0xB4D7, 0, 0xD9AD, 0xD9CF, 0xD9D0, 0xB4C9, /* 0xD0 */
+ 0xB4C5, 0xD9BB, 0, 0xB4D0, 0xD9B6, 0, 0xD9D1, 0xB4CC, /* 0xE0 */
+ 0xD9C9, 0xD9D6, 0xD9B0, 0xD9B5, 0xD9AF, 0, 0xB4CB, 0xD9C2, /* 0xE0 */
+ 0xDDDE, 0xD9B1, 0xB4CF, 0xD9BA, 0xD9D2, 0xB4CA, 0xD9B7, 0xD9B4, /* 0xF0 */
+ 0xD9C5, 0xB4CD, 0xB4C3, 0xB4D9, 0xD9C8, 0xD9C7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_69[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD9AC, 0xB4C8, 0xD9D4, 0xD9BC, /* 0x00 */
+ 0xD9BE, 0, 0xD9CB, 0xD9CA, 0xD9AA, 0xB4D3, 0xB4D5, 0xD9B2, /* 0x00 */
+ 0xD9B9, 0xD9C1, 0xB4D4, 0xD9B8, 0xD9C4, 0xD9D7, 0, 0xD9CC, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xD9D8, 0, 0, /* 0x20 */
+ 0, 0, 0xD9AE, 0, 0, 0, 0, 0xDDF2, /* 0x20 */
+ 0xB7A6, 0, 0xDDF0, 0xDDDB, 0xDDE0, 0xDDD9, 0, 0xDDEC, /* 0x30 */
+ 0xDDCB, 0xDDD2, 0, 0xDDEA, 0xDDF4, 0xDDDC, 0, 0xDDCF, /* 0x30 */
+ 0xDDE2, 0xDDE7, 0xDDD3, 0, 0xDDE4, 0xDDD0, 0, 0, /* 0x40 */
+ 0xDDD7, 0xDDD8, 0xB7A8, 0xDDEB, 0xDDE9, 0, 0xDDCC, 0xDDEE, /* 0x40 */
+ 0, 0xDDEF, 0xDDF1, 0xB7AC, 0xB7A4, 0, 0xD5B8, 0xDDD4, /* 0x50 */
+ 0xDDE6, 0xDDD5, 0xB7A1, 0xB7B1, 0xDDED, 0xB7AF, 0xB7AB, 0xDDCA, /* 0x50 */
+ 0xB7A3, 0, 0xDDCD, 0xB7B0, 0, 0xDDDD, 0xDDC9, 0, /* 0x60 */
+ 0xB7A9, 0xDDE1, 0xDDD1, 0xB7AA, 0xDDDA, 0xB77E, 0xB4D8, 0xDDE3, /* 0x60 */
+ 0xD9BF, 0xDDCE, 0, 0, 0xDDE8, 0xB7A5, 0xDDE5, 0xB7A2, /* 0x70 */
+ 0xDDDF, 0xB7AD, 0xDDD6, 0xDDF3, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xB7A7, 0xDEC6, 0, 0, 0xB7AE, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xE24A, 0xE248, 0, /* 0x80 */
+ 0xE25E, 0xE246, 0, 0xE258, 0xB77D, 0xBA5F, 0xE242, 0xE25D, /* 0x90 */
+ 0, 0xE247, 0xE255, 0xBA64, 0xBA5D, 0, 0xE25B, 0, /* 0x90 */
+ 0xE240, 0xE25A, 0, 0xBA6F, 0xE251, 0xE261, 0xBA6D, 0xE249, /* 0xA0 */
+ 0xBA5E, 0xE24B, 0xE259, 0xBA67, 0xE244, 0xBA6B, 0xBA61, 0xE24D, /* 0xA0 */
+ 0xE243, 0xE1FC, 0, 0xE257, 0xBA68, 0xE260, 0xE1FD, 0xBA65, /* 0xB0 */
+ 0, 0xE253, 0, 0xBA66, 0xE245, 0xE250, 0xE24C, 0xE24E, /* 0xB0 */
+ 0, 0xBA60, 0xE25F, 0xBA6E, 0xE24F, 0, 0xE262, 0, /* 0xC0 */
+ 0, 0xE1FE, 0xE254, 0xBA63, 0xBA6C, 0xBA6A, 0xE241, 0xE256, /* 0xC0 */
+ 0xBA69, 0, 0, 0xBA62, 0xE252, 0, 0, 0, /* 0xD0 */
+ 0, 0xE25C, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xE5D5, 0, 0xE5D1, 0xE5CD, 0xE5E1, 0xE5DE, /* 0xE0 */
+ 0xBCCD, 0, 0, 0xE5E5, 0xE5D4, 0xBCD8, 0xE5DB, 0, /* 0xE0 */
+ 0, 0xE5D0, 0xE5DA, 0xBCD5, 0xE5EE, 0, 0xE5EB, 0xE5DD, /* 0xF0 */
+ 0xE5CE, 0, 0, 0xE5E2, 0xE5E4, 0xBCD1, 0xE5D8, 0xE5D3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_6A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5CA, 0xBCCE, 0xBCD6, 0, 0xE5E7, 0xBCD7, 0xE5CB, 0xE5ED, /* 0x00 */
+ 0xE5E0, 0xE5E6, 0xBCD4, 0, 0, 0xE5E3, 0, 0xE5EA, /* 0x00 */
+ 0, 0xBCD9, 0, 0xBCD3, 0xE5DC, 0xE5CF, 0xE5EF, 0xE5CC, /* 0x10 */
+ 0xE5E8, 0xBCD0, 0, 0xE5D6, 0, 0xE5D7, 0xBCCF, 0xBCCC, /* 0x10 */
+ 0xE5D2, 0xBCD2, 0, 0xBCCB, 0, 0xE5E9, 0xE5EC, 0xE5D9, /* 0x20 */
+ 0xE9CA, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0xE9C2, 0, 0xE9BE, 0xBEF6, 0, 0, /* 0x30 */
+ 0xBEEB, 0xBEF0, 0xBEEC, 0xE9CC, 0xE9D7, 0xBEEA, 0xE9C4, 0xE9CD, /* 0x30 */
+ 0xE5DF, 0xE9CE, 0, 0, 0xBEF1, 0, 0xE9DD, 0xBEF5, /* 0x40 */
+ 0xBEF8, 0xE9C0, 0, 0xBEF4, 0, 0xE9DB, 0xE9DC, 0xE9D2, /* 0x40 */
+ 0xE9D1, 0xE9C9, 0, 0, 0xE9D3, 0xE9DA, 0xE9D9, 0, /* 0x50 */
+ 0xBEEF, 0xBEED, 0xE9CB, 0xE9C8, 0, 0xE9C5, 0xE9D8, 0xBEF7, /* 0x50 */
+ 0xE9D6, 0xBEF3, 0xBEF2, 0, 0xE9D0, 0, 0xE9BF, 0xE9C1, /* 0x60 */
+ 0xE9C3, 0xE9D5, 0xE9CF, 0xBEEE, 0, 0xE9C6, 0, 0xE9D4, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0xE9C7, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0xC0CF, 0xED45, /* 0x70 */
+ 0xC0C8, 0xECF5, 0, 0xED41, 0xC0CA, 0xED48, 0, 0xECFC, /* 0x80 */
+ 0, 0xECF7, 0, 0, 0xED49, 0xECF3, 0xECFE, 0, /* 0x80 */
+ 0xC0D1, 0xED44, 0xED4A, 0xECFD, 0xC0C9, 0xED40, 0xECF4, 0xC0D0, /* 0x90 */
+ 0, 0, 0xED47, 0xECF9, 0xC0CC, 0, 0xECFB, 0xECF8, /* 0x90 */
+ 0xC0D2, 0xECFA, 0xC0CB, 0xC0CE, 0xED43, 0xECF6, 0xED46, 0, /* 0xA0 */
+ 0xED42, 0, 0, 0, 0xC263, 0xEFE7, 0xC268, 0xC269, /* 0xA0 */
+ 0, 0, 0, 0xC262, 0xEFE6, 0, 0xEFE3, 0xEFE4, /* 0xB0 */
+ 0xC266, 0xEFDE, 0xEFE2, 0xC265, 0, 0xEFDF, 0, 0, /* 0xB0 */
+ 0, 0, 0xC267, 0xC264, 0, 0xEFDD, 0xEFE1, 0xEFE5, /* 0xC0 */
+ 0, 0, 0, 0xF251, 0xF24E, 0xF257, 0, 0xF256, /* 0xC0 */
+ 0xF254, 0xF24F, 0, 0xC372, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0xF250, 0xC371, 0xC0CD, 0xF253, 0xC370, 0xF258, 0xF252, /* 0xD0 */
+ 0xF24D, 0xEFE0, 0, 0, 0, 0xC36F, 0, 0xF24C, /* 0xE0 */
+ 0xF456, 0, 0xF455, 0xF255, 0xC468, 0, 0xF459, 0xF45A, /* 0xE0 */
+ 0xF454, 0xF458, 0, 0xF453, 0, 0, 0, 0, /* 0xF0 */
+ 0xF5D1, 0xF457, 0xC4E7, 0xC4E5, 0xF5CF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_6B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF5D2, 0, 0xF5CE, 0xF5D0, 0xC4E6, 0, 0, 0, /* 0x00 */
+ 0xF6E5, 0xF6E6, 0xC576, 0xF6E4, 0, 0, 0, 0xF7E2, /* 0x00 */
+ 0xC5CF, 0xF7E0, 0xF7E1, 0xF8AC, 0, 0, 0xC656, 0xF8F3, /* 0x10 */
+ 0xF8F1, 0xF8F2, 0xF8F4, 0, 0, 0, 0xF9BB, 0, /* 0x10 */
+ 0xA4ED, 0xA6B8, 0, 0xAA59, 0, 0xCCE9, 0, 0, /* 0x20 */
+ 0xCF64, 0, 0, 0, 0xD1F5, 0xD1F7, 0, 0xD1F6, /* 0x20 */
+ 0, 0xD1F8, 0xB1FD, 0xD5D7, 0xD1F9, 0, 0xD5D6, 0xD5D8, /* 0x30 */
+ 0xD5D9, 0xD9DA, 0xB4DB, 0xD9DB, 0xD9DD, 0xB4DC, 0xB4DA, 0xD9DC, /* 0x30 */
+ 0, 0xDDFA, 0xDDF8, 0xDDF7, 0, 0xDDF6, 0xDDF5, 0xB7B2, /* 0x40 */
+ 0xDDF9, 0xBA70, 0xE263, 0xE265, 0xBA71, 0xE264, 0xBCDB, 0, /* 0x40 */
+ 0xBCDA, 0xE5F0, 0, 0, 0xE9DF, 0xE9DE, 0xE9E0, 0, /* 0x50 */
+ 0, 0xBEF9, 0, 0xED4B, 0xC0D3, 0, 0xEFE8, 0xC26A, /* 0x50 */
+ 0xF259, 0xC577, 0xA4EE, 0xA5BF, 0xA6B9, 0xA842, 0xAA5A, 0xAA5B, /* 0x60 */
+ 0, 0, 0xAC6E, 0, 0, 0xD1FA, 0, 0, /* 0x60 */
+ 0, 0, 0xB7B3, 0, 0, 0, 0xE6D1, 0xBEFA, /* 0x70 */
+ 0xC26B, 0xA4EF, 0, 0xA6BA, 0, 0, 0xCCEB, 0xAA5C, /* 0x70 */
+ 0xCCEA, 0, 0xCF65, 0xAC6F, 0xCF66, 0, 0xAC70, 0, /* 0x80 */
+ 0xD1FC, 0xAEEE, 0xAEED, 0, 0xD5DE, 0xD5DC, 0xD5DD, 0xD5DB, /* 0x80 */
+ 0, 0xD5DA, 0, 0, 0xD9DE, 0xD9E1, 0xB4DE, 0xD9DF, /* 0x90 */
+ 0xB4DD, 0xD9E0, 0, 0xDDFB, 0, 0, 0xE266, 0xE267, /* 0x90 */
+ 0xE268, 0, 0xE5F3, 0xE5F2, 0xBCDC, 0xE5F1, 0xE5F4, 0xE9E1, /* 0xA0 */
+ 0, 0, 0xE9E2, 0xE9E3, 0, 0xED4C, 0xC0D4, 0xC26C, /* 0xA0 */
+ 0xF25A, 0, 0xC4E8, 0xC95F, 0, 0xAC71, 0xCF67, 0xAEEF, /* 0xB0 */
+ 0, 0, 0xB1FE, 0, 0xB4DF, 0xD9E2, 0, 0xB7B5, /* 0xB0 */
+ 0xB7B4, 0, 0, 0xE269, 0xE26A, 0xBCDD, 0xBCDE, 0xE9E5, /* 0xC0 */
+ 0xE9E4, 0xEFE9, 0xF7E3, 0xA4F0, 0xC960, 0xA5C0, 0, 0xA843, /* 0xC0 */
+ 0xCB48, 0, 0xAC72, 0xB7B6, 0xA4F1, 0, 0xCF68, 0xAC73, /* 0xD0 */
+ 0xCF69, 0, 0xC0D5, 0xA4F2, 0, 0, 0xCCEC, 0, /* 0xD0 */
+ 0xCF6A, 0, 0xD242, 0xD241, 0xD1FE, 0, 0xD1FD, 0xD243, /* 0xE0 */
+ 0xD240, 0, 0, 0xB240, 0xB241, 0, 0, 0xB4E0, /* 0xE0 */
+ 0xD9E3, 0, 0xD9E4, 0xD9E5, 0, 0, 0, 0xDE41, /* 0xF0 */
+ 0xDE42, 0xDE40, 0, 0xDDFD, 0xDDFE, 0xB7B7, 0xE26B, 0xE5F7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_6C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE5F6, 0xE5F5, 0xE5F8, 0xE9E7, 0xE9E6, 0xBEFB, 0xE9E8, 0, /* 0x00 */
+ 0xC0D6, 0xED4D, 0, 0xEFEA, 0xF25B, 0xF6E7, 0, 0xA4F3, /* 0x00 */
+ 0xA5C2, 0xA5C1, 0, 0xAA5D, 0xC961, 0xC97E, 0xA6BB, 0, /* 0x10 */
+ 0xC9F7, 0xCB49, 0xCB4A, 0xAA5E, 0, 0xCCED, 0, 0xAC74, /* 0x10 */
+ 0xCF6B, 0xCF6C, 0, 0xAEF0, 0xAEF4, 0xD244, 0xAEF3, 0xAEF1, /* 0x20 */
+ 0xAEF2, 0, 0xD5DF, 0xB242, 0xB4E3, 0, 0xB4E1, 0xB4E2, /* 0x20 */
+ 0xD9E6, 0, 0, 0xBA72, 0xA4F4, 0, 0xC9A1, 0, /* 0x30 */
+ 0xA5C3, 0, 0, 0xC9A4, 0, 0, 0xA5C6, 0xC9A3, /* 0x30 */
+ 0xA5C5, 0xA5C4, 0xA844, 0xC9A2, 0, 0, 0xC9F8, 0, /* 0x40 */
+ 0, 0, 0xC9FC, 0xC9FE, 0xCA40, 0xA6C5, 0xA6C6, 0xC9FB, /* 0x40 */
+ 0xA6C1, 0, 0xC9F9, 0, 0xC9FD, 0xA6C2, 0, 0xA6BD, /* 0x50 */
+ 0, 0xA6BE, 0, 0xA6C4, 0xC9FA, 0xA6BC, 0xA845, 0xA6BF, /* 0x50 */
+ 0xA6C0, 0xA6C3, 0, 0, 0, 0xCB5B, 0xCB59, 0xCB4C, /* 0x60 */
+ 0xA851, 0xCB53, 0xA84C, 0xCB4D, 0, 0xCB55, 0, 0xCB52, /* 0x60 */
+ 0xA84F, 0xCB51, 0xA856, 0xCB5A, 0xA858, 0, 0xA85A, 0, /* 0x70 */
+ 0xCB4B, 0, 0xA84D, 0xCB5C, 0, 0xA854, 0xA857, 0, /* 0x70 */
+ 0xCD45, 0xA847, 0xA85E, 0xA855, 0xCB4E, 0xA84A, 0xA859, 0xCB56, /* 0x80 */
+ 0xA848, 0xA849, 0xCD43, 0xCB4F, 0xA850, 0xA85B, 0xCB5D, 0xCB50, /* 0x80 */
+ 0xA84E, 0, 0xA853, 0xCCEE, 0xA85C, 0xCB57, 0xA852, 0, /* 0x90 */
+ 0xA85D, 0xA846, 0xCB54, 0xA84B, 0xCB58, 0xCD44, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0xAA6A, 0xAA7A, 0xCCF5, 0xAA71, 0, /* 0xA0 */
+ 0xCD4B, 0xAA62, 0, 0xAA65, 0xCD42, 0, 0xCCF3, 0xCCF7, /* 0xB0 */
+ 0xAA6D, 0xAA6F, 0xCCFA, 0xAA76, 0xAA68, 0xAA66, 0xAA67, 0xAA75, /* 0xB0 */
+ 0xCD47, 0xAA70, 0xCCF9, 0xCCFB, 0xAA6E, 0xAA73, 0xCCFC, 0xCD4A, /* 0xC0 */
+ 0, 0xAC75, 0xAA79, 0, 0xAA63, 0xCD49, 0, 0xCD4D, /* 0xC0 */
+ 0xCCF8, 0xCD4F, 0xCD40, 0xAA6C, 0xCCF4, 0xAA6B, 0xAA7D, 0xAA72, /* 0xD0 */
+ 0, 0xCCF2, 0xCF75, 0xAA78, 0xAA7C, 0xCD41, 0xCD46, 0, /* 0xD0 */
+ 0xAA7E, 0xAA77, 0xAA69, 0xAA5F, 0, 0xAA64, 0, 0xCCF6, /* 0xE0 */
+ 0xAA60, 0xCD4E, 0, 0xCCF0, 0xCCEF, 0xCCFD, 0xCCF1, 0xAA7B, /* 0xE0 */
+ 0xAEF5, 0xAA74, 0xCCFE, 0xAA61, 0, 0xACA6, 0, 0, /* 0xF0 */
+ 0, 0xCD4C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_6D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xCF7C, 0xCFA1, 0, 0xCFA4, 0xCF77, 0, 0, 0xCFA7, /* 0x00 */
+ 0xCFAA, 0xCFAC, 0xCF74, 0xAC76, 0xAC7B, 0xD249, 0xACAD, 0xCFA5, /* 0x00 */
+ 0xCFAD, 0xCF7B, 0xCF73, 0, 0, 0, 0xD264, 0xAC7E, /* 0x10 */
+ 0xCFA2, 0xCF78, 0xCF7A, 0xACA5, 0, 0xCF7D, 0xAC7D, 0xCF70, /* 0x10 */
+ 0xCFA8, 0, 0xCFAB, 0, 0, 0xAC7A, 0, 0xACA8, /* 0x20 */
+ 0xCF6D, 0xACAA, 0xAC78, 0xACAE, 0xCFA9, 0xCF6F, 0xACAB, 0xD25E, /* 0x20 */
+ 0xCD48, 0xAC7C, 0xAC77, 0xCF76, 0xCF6E, 0xACAC, 0xACA4, 0xCFA3, /* 0x30 */
+ 0xACA9, 0xACA7, 0xCF79, 0xACA1, 0xCF71, 0xACA2, 0xACA3, 0xCF72, /* 0x30 */
+ 0xCFA6, 0xAC79, 0xCF7E, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xD24C, 0xAEFD, 0xAF43, 0, 0, 0, 0xD255, 0xD25B, /* 0x50 */
+ 0xD257, 0xD24A, 0xD24D, 0xD246, 0xD247, 0xAF4A, 0xAEFA, 0xD256, /* 0x60 */
+ 0xD25F, 0xAF45, 0xAEF6, 0, 0xAF40, 0xD24E, 0xAF42, 0xD24F, /* 0x60 */
+ 0xD259, 0, 0, 0, 0xAF44, 0xD268, 0xD248, 0xAEFC, /* 0x70 */
+ 0xAEFB, 0xAF48, 0xD245, 0xD266, 0xD25A, 0xD267, 0xD261, 0xD253, /* 0x70 */
+ 0xD262, 0, 0xD25C, 0xD265, 0xD263, 0xAF49, 0xD254, 0xAEF9, /* 0x80 */
+ 0xAEF8, 0xAF41, 0xAF47, 0xD260, 0xAF46, 0xD251, 0xB243, 0, /* 0x80 */
+ 0xD269, 0xD250, 0xD24B, 0xAEFE, 0xAF4B, 0xAEF7, 0, 0xD258, /* 0x90 */
+ 0xD25D, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xB265, 0xD5E1, 0xD5E5, 0, 0xB252, 0xB250, /* 0xA0 */
+ 0, 0, 0xB247, 0xD5E3, 0xD5E2, 0xB25B, 0, 0xD5E8, /* 0xB0 */
+ 0xB255, 0, 0xD5FA, 0xD647, 0xB244, 0xD5F7, 0xD5F0, 0xB267, /* 0xB0 */
+ 0xD5E0, 0, 0xD5FC, 0, 0xB264, 0xB258, 0xB263, 0xB24E, /* 0xC0 */
+ 0xD5EC, 0xD5FE, 0xD5F6, 0xB24F, 0xB249, 0xD645, 0, 0xD5FD, /* 0xC0 */
+ 0xD640, 0xB251, 0xB259, 0xD642, 0xD5EA, 0xD5FB, 0xD5EF, 0xD644, /* 0xD0 */
+ 0xB25E, 0xB246, 0xB25C, 0xD5F4, 0xD5F2, 0xD5F3, 0xB253, 0xD5EE, /* 0xD0 */
+ 0xD5ED, 0xB248, 0xD5E7, 0xD646, 0xB24A, 0xD5F1, 0xB268, 0, /* 0xE0 */
+ 0xB262, 0xD5E6, 0xB25F, 0xB25D, 0xB266, 0xD5F8, 0xB261, 0xD252, /* 0xE0 */
+ 0xD5F9, 0xB260, 0xD641, 0xB245, 0xD5F5, 0xB257, 0xD5E9, 0xB256, /* 0xF0 */
+ 0, 0xB254, 0xB24C, 0xB24B, 0xD9E7, 0xD643 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_6E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD5EB, 0, 0, 0xD9FC, 0, 0xB24D, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xB541, 0xB25A, 0xB4EE, 0xD9F6, 0xB4FC, 0, 0xD9EA, /* 0x10 */
+ 0xB4EB, 0xB4E7, 0xDA49, 0xB4ED, 0xB4F1, 0xB4EC, 0xB4F5, 0xDA4D, /* 0x20 */
+ 0xDA44, 0, 0, 0xD9F1, 0xB4FA, 0xB4F4, 0xD9FD, 0xB4E4, /* 0x20 */
+ 0xDA4A, 0xDA43, 0xB4E8, 0xD9F7, 0xB4F7, 0xDA55, 0xDA56, 0, /* 0x30 */
+ 0xB4E5, 0xDA48, 0xB4F9, 0xD9FB, 0xD9ED, 0xD9EE, 0xB4FD, 0xD9F2, /* 0x30 */
+ 0xD9F9, 0xD9F3, 0, 0xB4FB, 0xB544, 0xD9EF, 0xD9E8, 0xD9E9, /* 0x40 */
+ 0, 0xD9EB, 0xB4EA, 0xD9F8, 0, 0xB4F8, 0xB542, 0, /* 0x40 */
+ 0, 0xD9FA, 0xDA53, 0xDA4B, 0xB4E6, 0xDA51, 0xB4F2, 0, /* 0x50 */
+ 0xB4F0, 0, 0xDA57, 0xB4EF, 0xDA41, 0xD9F4, 0xD9FE, 0xB547, /* 0x50 */
+ 0xDA45, 0xDA42, 0xD9F0, 0xB543, 0xDA4F, 0xDA4C, 0xDA54, 0xB4E9, /* 0x60 */
+ 0xDA40, 0xB546, 0, 0xDA47, 0, 0, 0xB4F3, 0xB4F6, /* 0x60 */
+ 0, 0xDA46, 0xB545, 0xD9F5, 0xD5E4, 0, 0, 0xDA50, /* 0x70 */
+ 0xDA4E, 0xDA52, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xD9EC, 0xB540, 0, 0, 0, 0xDE61, 0xDE60, 0xDE46, /* 0x80 */
+ 0xB7BD, 0, 0xDE5F, 0xDE49, 0xDE4A, 0, 0xB7C7, 0xDE68, /* 0x90 */
+ 0xB7C2, 0xDE5E, 0, 0xDE43, 0xB7C8, 0xB7BE, 0xDE52, 0xDE48, /* 0x90 */
+ 0xDE4B, 0xDE63, 0xB7B8, 0xDE6A, 0xDE62, 0xB7C1, 0xDE57, 0xB7CC, /* 0xA0 */
+ 0, 0, 0xB7CB, 0xB7C5, 0, 0, 0xDE69, 0xB7B9, /* 0xA0 */
+ 0xDE55, 0xDE4C, 0xDE59, 0xDE65, 0xB7CD, 0, 0xB7BB, 0xDE54, /* 0xB0 */
+ 0, 0xDE4D, 0xB7C4, 0, 0xB7C3, 0xDE50, 0xDE5A, 0xDE64, /* 0xB0 */
+ 0xDE47, 0xDE51, 0xB7BC, 0xDE5B, 0xB7C9, 0xB7C0, 0xDE4E, 0xB7BF, /* 0xC0 */
+ 0xDE45, 0xDE53, 0xDE67, 0xB4FE, 0xBAB0, 0xDE56, 0xE26C, 0xDE58, /* 0xC0 */
+ 0xDE66, 0xB7C6, 0xDE4F, 0xB7BA, 0xB7CA, 0xBCF0, 0xDE44, 0, /* 0xD0 */
+ 0xDE5D, 0, 0, 0, 0xDE5C, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xE2AA, 0xBAAD, 0xE27D, 0xE2A4, 0xBAA2, /* 0xE0 */
+ 0, 0xE26E, 0xBAAF, 0, 0xBA77, 0xE26D, 0xE2B0, 0xBAB1, /* 0xF0 */
+ 0xE271, 0xE2A3, 0, 0xE273, 0xE2B3, 0xE2AF, 0xBA75, 0xBAA1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_6F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE653, 0xBAAE, 0xBA7D, 0xE26F, 0, 0xE2AE, 0xBAA3, 0xE2AB, /* 0x00 */
+ 0xE2B8, 0xE275, 0xE27E, 0, 0, 0xE2B6, 0xE2AC, 0xBA7C, /* 0x00 */
+ 0, 0, 0xE27C, 0xBA76, 0xBA74, 0xBAA8, 0, 0, /* 0x10 */
+ 0xE27A, 0xE277, 0xE278, 0, 0xE2B2, 0, 0xE2B7, 0xE2B5, /* 0x10 */
+ 0xBA7A, 0xE2B9, 0xBA7E, 0xBAA7, 0, 0xE270, 0xE5FA, 0xE279, /* 0x20 */
+ 0, 0xBA78, 0xBAAC, 0xBAA9, 0xBA7B, 0xE2A5, 0xE274, 0xBAAA, /* 0x20 */
+ 0xE2A7, 0xBAA4, 0xBAA6, 0xBA73, 0, 0xE2A9, 0xE2A1, 0xE272, /* 0x30 */
+ 0xBAA5, 0xE2B1, 0xE2B4, 0xE27B, 0xE2A8, 0, 0xBA79, 0xBCDF, /* 0x30 */
+ 0xE2A6, 0xE5F9, 0, 0xE2AD, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0xE276, 0xE644, /* 0x40 */
+ 0xE64E, 0xBCE2, 0xE64D, 0xE659, 0xBCE4, 0xE64B, 0, 0xE64F, /* 0x50 */
+ 0xBCEF, 0, 0xE646, 0xBCE7, 0, 0xE652, 0xE9F0, 0xBCF3, /* 0x50 */
+ 0xBCF2, 0xE654, 0xE643, 0xE65E, 0xBCED, 0, 0xBCE3, 0xE657, /* 0x60 */
+ 0, 0xE65B, 0xE660, 0xE655, 0xE649, 0xBCE6, 0xBCE9, 0xBCF1, /* 0x60 */
+ 0xBCEC, 0, 0xE64C, 0xE2A2, 0, 0, 0xE648, 0xE65F, /* 0x70 */
+ 0xBCE8, 0, 0xBCEB, 0xE661, 0xBCE0, 0xE656, 0xE5FB, 0xE65C, /* 0x70 */
+ 0xC0DF, 0, 0xE64A, 0, 0xBCE1, 0xE645, 0xBCE5, 0xE5FC, /* 0x80 */
+ 0xBAAB, 0xE641, 0, 0xE65A, 0xE642, 0xE640, 0xBCEA, 0, /* 0x80 */
+ 0xE658, 0, 0xE5FE, 0xE651, 0xE650, 0xE65D, 0xE647, 0xBCEE, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0xE9F3, 0, /* 0x90 */
+ 0xBF49, 0xBEFE, 0xEA40, 0xE9EB, 0xBF41, 0xE9F7, 0xBF48, 0xBF43, /* 0xA0 */
+ 0xE9F5, 0xED4F, 0xE9FB, 0xEA42, 0xE9FA, 0xE9E9, 0xE9F8, 0xEA44, /* 0xA0 */
+ 0xEA46, 0xBEFD, 0xEA45, 0xBF44, 0xBF4A, 0, 0xBF47, 0, /* 0xB0 */
+ 0xE9FE, 0xBF46, 0xE9F9, 0, 0xE9ED, 0xE9F2, 0, 0xE9FD, /* 0xB0 */
+ 0xBF45, 0xBF42, 0xBEFC, 0xBF40, 0xE9F1, 0, 0xE5FD, 0xE9EC, /* 0xC0 */
+ 0xE9EF, 0xEA41, 0xE9F4, 0xE9EA, 0xED4E, 0xEA43, 0xE9EE, 0xE9FC, /* 0xC0 */
+ 0, 0, 0, 0, 0xED51, 0xC0E3, 0, 0, /* 0xD0 */
+ 0xC0D7, 0, 0, 0xC0DB, 0xED53, 0xED59, 0xED57, 0xC0D9, /* 0xD0 */
+ 0xC0DA, 0xC0E1, 0xED5A, 0xED52, 0xC0DC, 0, 0xED56, 0xED55, /* 0xE0 */
+ 0xED5B, 0xC0E2, 0, 0xC0DD, 0xC0E0, 0xED54, 0xC0E4, 0xC0DE, /* 0xE0 */
+ 0xC0E5, 0xC0D8, 0xED58, 0, 0xED50, 0, 0, 0xEFF7, /* 0xF0 */
+ 0, 0, 0xC271, 0xEFF4, 0xEFF6, 0, 0xC26F, 0xEFF2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_70[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEFF3, 0xEFEE, 0, 0, 0xE9F6, 0xEFEF, 0xC270, 0xEFEB, /* 0x00 */
+ 0, 0xC26D, 0xEFF8, 0xC26E, 0xEFEC, 0xEFED, 0xEFF1, 0xC273, /* 0x00 */
+ 0, 0xC272, 0, 0, 0xEFF0, 0xC378, 0xF25F, 0xF265, /* 0x10 */
+ 0xC379, 0xF25C, 0xC376, 0xC373, 0xF267, 0xC377, 0, 0xC374, /* 0x10 */
+ 0xF25E, 0xF261, 0xF262, 0xF263, 0xF266, 0, 0xEFF5, 0xF25D, /* 0x20 */
+ 0xC375, 0xF264, 0xF268, 0xF260, 0, 0, 0, 0xF45D, /* 0x20 */
+ 0xC46A, 0xF460, 0xC46B, 0xF468, 0xF45F, 0xF45C, 0, 0xF45E, /* 0x30 */
+ 0xF462, 0xF465, 0xF464, 0xF467, 0xF45B, 0, 0xC469, 0xF463, /* 0x30 */
+ 0xF466, 0xF469, 0xF461, 0xF5D3, 0xF5D4, 0xF5D8, 0xF5D9, 0, /* 0x40 */
+ 0xF5D6, 0xF5D7, 0xF5D5, 0, 0xC4E9, 0, 0, 0, /* 0x40 */
+ 0, 0xC578, 0xF6EB, 0, 0, 0xF6E8, 0xF6E9, 0xF6EA, /* 0x50 */
+ 0xC579, 0, 0xF7E5, 0xF7E4, 0, 0xF8AF, 0xC5F4, 0xF8AD, /* 0x50 */
+ 0xF8B0, 0xF8AE, 0xF8F5, 0xC657, 0xC665, 0xF9A3, 0xF96C, 0, /* 0x60 */
+ 0xF9A2, 0xF9D0, 0xF9D1, 0xA4F5, 0, 0, 0, 0, /* 0x60 */
+ 0xA6C7, 0xCA41, 0, 0, 0xCB5E, 0, 0xA85F, 0, /* 0x70 */
+ 0xA862, 0, 0xCB5F, 0, 0xA860, 0xA861, 0, 0, /* 0x70 */
+ 0, 0, 0xCD58, 0xCD5A, 0xCD55, 0xCD52, 0xCD54, 0, /* 0x80 */
+ 0, 0, 0xAAA4, 0, 0, 0, 0xAAA2, 0, /* 0x80 */
+ 0, 0xCD56, 0xAAA3, 0xCD53, 0xCD50, 0xAAA1, 0xCD57, 0, /* 0x90 */
+ 0xCD51, 0xAAA5, 0xCD59, 0, 0, 0, 0, 0xCFAF, /* 0x90 */
+ 0, 0xCFB3, 0, 0, 0xACB7, 0, 0, 0, /* 0xA0 */
+ 0, 0xCFB6, 0, 0xACAF, 0xACB2, 0xACB4, 0xACB6, 0xACB3, /* 0xA0 */
+ 0xCFB2, 0xCFB1, 0, 0xACB1, 0xCFB4, 0xCFB5, 0, 0xCFAE, /* 0xB0 */
+ 0xACB5, 0, 0xACB0, 0, 0, 0, 0xCFB0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xD277, 0xD278, 0xD279, /* 0xC0 */
+ 0xAF50, 0, 0xAF4C, 0xD26E, 0, 0xD276, 0xD27B, 0xAF51, /* 0xC0 */
+ 0, 0xD26C, 0xD272, 0xD26B, 0xD275, 0, 0, 0xD271, /* 0xD0 */
+ 0xAF4D, 0xAF4F, 0xD27A, 0, 0xD26A, 0xD26D, 0xD273, 0, /* 0xD0 */
+ 0xD274, 0xD27C, 0xD270, 0, 0xAF4E, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xB26D, /* 0xE0 */
+ 0xD64E, 0, 0, 0xD650, 0xD64C, 0, 0xD658, 0xD64A, /* 0xF0 */
+ 0xD657, 0xB269, 0xD648, 0xDA5B, 0xD652, 0xB26C, 0, 0xD653 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_71[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD656, 0, 0xD65A, 0, 0xD64F, 0, 0xD654, 0, /* 0x00 */
+ 0, 0xB26A, 0xB26B, 0xD659, 0xD64D, 0xD649, 0xD65B, 0, /* 0x00 */
+ 0xD651, 0, 0, 0xD655, 0, 0, 0, 0xD64B, /* 0x10 */
+ 0, 0xB548, 0xB549, 0xDA65, 0xB54F, 0, 0xDA59, 0xDA62, /* 0x10 */
+ 0xDA58, 0xB54C, 0xDA60, 0xDA5E, 0, 0xDA5F, 0xB54A, 0, /* 0x20 */
+ 0xDA63, 0, 0, 0, 0, 0, 0xDA5C, 0xDA5A, /* 0x20 */
+ 0xB54B, 0xDA5D, 0xDA61, 0, 0, 0, 0xB54D, 0, /* 0x30 */
+ 0, 0, 0xDA64, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xDE70, 0xDE77, 0xDE79, 0xDEA1, 0, 0xB7DA, 0xDE6B, /* 0x40 */
+ 0, 0xB7D2, 0, 0xDE7A, 0xB7D7, 0xDEA2, 0xB7CE, 0, /* 0x40 */
+ 0xDE7D, 0, 0xDE6D, 0xDE7E, 0xDE6C, 0, 0xB7DC, 0, /* 0x50 */
+ 0xDE78, 0xB7CF, 0xDEA3, 0, 0xB7D4, 0xDE71, 0xB7D9, 0xDE7C, /* 0x50 */
+ 0xDE6F, 0xDE76, 0xDE72, 0xDE6E, 0xB7D1, 0xB7D8, 0xB7D6, 0xB7D3, /* 0x60 */
+ 0xB7DB, 0xB7D0, 0xDE75, 0, 0xB7D5, 0, 0xB54E, 0, /* 0x60 */
+ 0xDE7B, 0, 0xDE73, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xDE74, 0, 0, 0xE2C1, 0, 0xBAB4, 0, 0, /* 0x70 */
+ 0xE2BD, 0xE2C3, 0xE2BF, 0, 0xBAB6, 0xE2BE, 0xE2C2, 0xE2BA, /* 0x80 */
+ 0, 0xE2BC, 0xBAB5, 0, 0, 0, 0, 0xE2C0, /* 0x80 */
+ 0xE2BB, 0, 0xBAB7, 0, 0xBAB2, 0, 0, 0xE2C4, /* 0x90 */
+ 0, 0xBAB3, 0xE667, 0xE664, 0xE670, 0xE66A, 0xE66C, 0xBCF4, /* 0x90 */
+ 0xE666, 0xE66E, 0, 0, 0xE66D, 0xE66B, 0, 0xE671, /* 0xA0 */
+ 0xBCF7, 0xE668, 0xE66F, 0, 0xBCF5, 0, 0, 0xE663, /* 0xA0 */
+ 0xE665, 0xBCF6, 0xE662, 0xE672, 0, 0xE669, 0, 0, /* 0xB0 */
+ 0xEA4A, 0xBF51, 0, 0, 0xEA55, 0xEA53, 0xBF4B, 0xEA49, /* 0xB0 */
+ 0xEA4C, 0xEA4D, 0xEA48, 0xBF55, 0xBF56, 0xEA47, 0xEA56, 0xEA51, /* 0xC0 */
+ 0xBF4F, 0xBF4C, 0xEA50, 0xEA4E, 0, 0, 0xBF52, 0xEA52, /* 0xC0 */
+ 0xBF4D, 0, 0xBF4E, 0, 0xEA4F, 0xBF50, 0xEA4B, 0, /* 0xD0 */
+ 0xEA54, 0xBF53, 0xEA57, 0xEA58, 0xBF54, 0, 0, 0xC0E7, /* 0xD0 */
+ 0xC0EE, 0xED5C, 0xED62, 0, 0xED60, 0xC0EA, 0xC0E9, 0xC0E6, /* 0xE0 */
+ 0xED5E, 0, 0, 0, 0xC0EC, 0xC0EB, 0xC0E8, 0, /* 0xE0 */
+ 0xED61, 0xED5D, 0xED5F, 0, 0xC0ED, 0, 0, 0, /* 0xF0 */
+ 0xC277, 0xEFFB, 0, 0xC274, 0xC275, 0xEFFD, 0xC276, 0xEFFA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_72[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEFF9, 0xF26C, 0xEFFC, 0, 0xF26D, 0xC37A, 0xF26B, /* 0x00 */
+ 0, 0, 0xF26A, 0, 0xF269, 0xC37B, 0, 0, /* 0x00 */
+ 0xC46C, 0, 0, 0xF46A, 0xF46B, 0, 0, 0, /* 0x10 */
+ 0, 0xF5DC, 0xF5DB, 0xC4EA, 0, 0xF5DA, 0xF6EC, 0xF6ED, /* 0x10 */
+ 0, 0, 0xF7E6, 0xF8B1, 0, 0, 0xF8F6, 0xF9BC, /* 0x20 */
+ 0xC679, 0xF9C6, 0xA4F6, 0, 0xAAA6, 0xAAA7, 0, 0, /* 0x20 */
+ 0xACB8, 0, 0, 0, 0, 0xC0EF, 0xA4F7, 0, /* 0x30 */
+ 0xAAA8, 0xAF52, 0xB7DD, 0xA4F8, 0, 0xB26E, 0xBAB8, 0xC962, /* 0x30 */
+ 0, 0xCFB7, 0xD27D, 0, 0xE2C5, 0, 0xC0F0, 0xA4F9, /* 0x40 */
+ 0xAAA9, 0xCFB8, 0xCFB9, 0xDA66, 0xB550, 0, 0, 0xDEA4, /* 0x40 */
+ 0, 0, 0xB7DE, 0xE2C6, 0, 0, 0xBCF8, 0, /* 0x50 */
+ 0xC37C, 0xA4FA, 0xDA67, 0xA4FB, 0, 0xA6C9, 0xCA42, 0xA6C8, /* 0x50 */
+ 0xA865, 0xA864, 0xA863, 0xCB60, 0, 0, 0, 0xAAAA, /* 0x60 */
+ 0, 0xAAAB, 0xCD5B, 0, 0xCFBA, 0, 0xCFBD, 0xACBA, /* 0x60 */
+ 0xCFBB, 0, 0xACB9, 0xCFBC, 0xACBB, 0, 0xD2A2, 0xD2A1, /* 0x70 */
+ 0xD27E, 0xAF53, 0, 0xD65D, 0xD65E, 0xB26F, 0xD65C, 0xD65F, /* 0x70 */
+ 0xB552, 0xB270, 0, 0, 0xB551, 0xDA6B, 0xDA6A, 0, /* 0x80 */
+ 0xDA68, 0xDA69, 0, 0xDA6C, 0xDEA6, 0xDEA5, 0xDEA9, 0, /* 0x80 */
+ 0xDEA8, 0xDEA7, 0xBAB9, 0xE2C9, 0, 0xE2C8, 0xBABA, 0xE2C7, /* 0x90 */
+ 0xE673, 0, 0xE674, 0xBCF9, 0, 0xEA59, 0xEA5A, 0, /* 0x90 */
+ 0, 0xF272, 0xC37D, 0xF271, 0xF270, 0xF26E, 0xF26F, 0xC4EB, /* 0xA0 */
+ 0xF46C, 0xF6EE, 0xF8F7, 0, 0xA4FC, 0, 0xC9A5, 0xA5C7, /* 0xA0 */
+ 0xC9A6, 0, 0, 0, 0xCA43, 0xCA44, 0, 0, /* 0xB0 */
+ 0, 0, 0xCB66, 0, 0, 0xCB62, 0, 0xCB61, /* 0xB0 */
+ 0xAAAC, 0xCB65, 0xA867, 0xCB63, 0xA866, 0xCB67, 0xCB64, 0, /* 0xC0 */
+ 0, 0xCD5F, 0xCFBE, 0xCD5D, 0xCD64, 0, 0xAAAD, 0, /* 0xC0 */
+ 0xAAB0, 0xCD65, 0xCD61, 0, 0xCD62, 0, 0xCD5C, 0xAAAF, /* 0xD0 */
+ 0xCD5E, 0xAAAE, 0xCD63, 0, 0xCD60, 0, 0, 0xCFC2, /* 0xD0 */
+ 0xACBD, 0xACBE, 0, 0xCFC5, 0xCFBF, 0, 0xCFC4, 0, /* 0xE0 */
+ 0xCFC0, 0xACBC, 0xCFC3, 0xCFC1, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0xD2A8, 0xD2A5, 0, 0xD2A7, 0xAF58, /* 0xF0 */
+ 0xAF57, 0xAF55, 0xD2A4, 0xD2A9, 0xAF54, 0xAF56, 0xD2A6, 0xD667 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_73[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD2A3, 0xD2AA, 0, 0, 0, 0, 0, 0xD662, /* 0x00 */
+ 0xD666, 0, 0xD665, 0xDA6E, 0xDA79, 0, 0, 0xD668, /* 0x00 */
+ 0, 0xD663, 0xDA6D, 0xB274, 0, 0, 0xB273, 0xD661, /* 0x10 */
+ 0xD664, 0xB275, 0, 0xB272, 0xB271, 0xD660, 0xD669, 0, /* 0x10 */
+ 0, 0, 0xDA70, 0xDA77, 0, 0xB554, 0xDA76, 0xDA73, /* 0x20 */
+ 0, 0xB556, 0, 0, 0, 0xDA75, 0, 0, /* 0x20 */
+ 0xDA6F, 0xDA71, 0xDA74, 0xDA72, 0xB555, 0xDA78, 0xB553, 0xB7DF, /* 0x30 */
+ 0, 0, 0xDEAD, 0xDEAC, 0xDEAA, 0, 0xB7E2, 0xB7E1, /* 0x30 */
+ 0xDEAE, 0, 0xDEAB, 0xE2CA, 0xBABB, 0xB7E0, 0, 0, /* 0x40 */
+ 0, 0xDEB0, 0xDEAF, 0, 0xE2CD, 0xE2CB, 0xBCFA, 0, /* 0x40 */
+ 0xBABC, 0xE2CC, 0xE676, 0, 0, 0, 0, 0xBCFB, /* 0x50 */
+ 0xE675, 0xE67E, 0xE67D, 0xE67B, 0, 0xE67A, 0xE677, 0xE678, /* 0x50 */
+ 0xE679, 0xE67C, 0xE6A1, 0, 0, 0xEA5F, 0xEA5C, 0xEA5D, /* 0x60 */
+ 0xBF57, 0xEA5B, 0xEA61, 0xEA60, 0xEA5E, 0, 0xED64, 0xED65, /* 0x60 */
+ 0xC0F1, 0, 0xC0F2, 0xED63, 0, 0xC279, 0xEFFE, 0xC278, /* 0x70 */
+ 0xC37E, 0, 0xC3A1, 0xC46D, 0xF46E, 0xF46D, 0xF5DD, 0xF6EF, /* 0x70 */
+ 0xC57A, 0xF7E8, 0xF7E7, 0xF7E9, 0xA5C8, 0xCFC6, 0xAF59, 0xB276, /* 0x80 */
+ 0xD66A, 0xA5C9, 0xC9A7, 0xA4FD, 0, 0, 0xCA45, 0, /* 0x80 */
+ 0, 0, 0xCB6C, 0xCB6A, 0xCB6B, 0xCB68, 0xA868, 0xCB69, /* 0x90 */
+ 0, 0, 0, 0, 0, 0xCD6D, 0, 0xAAB3, /* 0x90 */
+ 0xCD6B, 0xCD67, 0xCD6A, 0, 0xCD66, 0xAAB5, 0xCD69, 0, /* 0xA0 */
+ 0xAAB2, 0xAAB1, 0, 0xAAB4, 0xCD6C, 0xCD68, 0, 0, /* 0xA0 */
+ 0, 0, 0xACC2, 0xACC5, 0xCFCE, 0xCFCD, 0xCFCC, 0xACBF, /* 0xB0 */
+ 0xCFD5, 0xCFCB, 0, 0xACC1, 0xD2AF, 0, 0xCFD2, 0xCFD0, /* 0xB0 */
+ 0xACC4, 0, 0xCFC8, 0xCFD3, 0, 0xCFCA, 0xCFD4, 0xCFD1, /* 0xC0 */
+ 0xCFC9, 0, 0xACC0, 0xCFD6, 0xCFC7, 0xACC3, 0, 0, /* 0xC0 */
+ 0, 0, 0xD2B4, 0xD2AB, 0xD2B6, 0, 0xD2AE, 0xD2B9, /* 0xD0 */
+ 0xD2BA, 0xD2AC, 0xD2B8, 0xD2B5, 0xD2B3, 0xD2B7, 0xAF5F, 0, /* 0xD0 */
+ 0xAF5D, 0, 0, 0xD2B1, 0, 0xD2AD, 0, 0xD2B0, /* 0xE0 */
+ 0xD2BB, 0xD2B2, 0xAF5E, 0xCFCF, 0, 0xAF5A, 0xAF5C, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xD678, 0xD66D, 0xD66B, 0, /* 0xF0 */
+ 0xD66C, 0, 0xD673, 0, 0xD674, 0xD670, 0xB27B, 0xD675 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_74[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD672, 0xD66F, 0, 0xB279, 0xD66E, 0xB277, 0xB27A, 0xD671, /* 0x00 */
+ 0xD679, 0xAF5B, 0xB278, 0xD677, 0xD676, 0xB27C, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xDA7E, 0, /* 0x10 */
+ 0, 0, 0xDAA1, 0xB560, 0, 0xDAA7, 0, 0, /* 0x10 */
+ 0xDAA9, 0xDAA2, 0xB55A, 0xDAA6, 0xDAA5, 0xB55B, 0xB561, 0, /* 0x20 */
+ 0xB562, 0xDAA8, 0xB558, 0xDA7D, 0xDA7B, 0xDAA3, 0xDA7A, 0xB55F, /* 0x20 */
+ 0xDA7C, 0xDAA4, 0xDAAA, 0xB559, 0xB55E, 0xB55C, 0xB55D, 0, /* 0x30 */
+ 0, 0, 0xB557, 0, 0, 0, 0, 0xB7E9, /* 0x30 */
+ 0xDEB7, 0xB7E8, 0xDEBB, 0, 0xDEB1, 0, 0xDEBC, 0, /* 0x40 */
+ 0, 0, 0xDEB2, 0xDEB3, 0, 0xDEBD, 0xDEBA, 0xDEB8, /* 0x40 */
+ 0xDEB9, 0xDEB5, 0xDEB4, 0, 0xDEBE, 0xB7E5, 0, 0xDEB6, /* 0x50 */
+ 0, 0xB7EA, 0xB7E4, 0xB7EB, 0xB7EC, 0, 0xB7E7, 0xB7E6, /* 0x50 */
+ 0, 0, 0xE2CE, 0xBABE, 0xBABD, 0, 0, 0xE2D3, /* 0x60 */
+ 0, 0xBCFC, 0xBABF, 0, 0, 0xBAC1, 0xE2D4, 0xB7E3, /* 0x60 */
+ 0xBAC0, 0xE2D0, 0xE2D2, 0xE2CF, 0, 0xE2D1, 0, 0, /* 0x70 */
+ 0, 0xE6AB, 0, 0, 0xE6AA, 0xE6A7, 0xBD40, 0xEA62, /* 0x70 */
+ 0xBD41, 0xE6A6, 0, 0xBCFE, 0, 0xE6A8, 0xE6A5, 0xE6A2, /* 0x80 */
+ 0xE6A9, 0xE6A3, 0xE6A4, 0xBCFD, 0, 0, 0, 0, /* 0x80 */
+ 0xED69, 0, 0xEA66, 0, 0xEA65, 0xEA67, 0, 0xED66, /* 0x90 */
+ 0xBF5A, 0, 0xEA63, 0, 0xBF58, 0, 0xBF5C, 0xBF5B, /* 0x90 */
+ 0xEA64, 0xEA68, 0, 0xBF59, 0, 0xED6D, 0xC0F5, 0xC27A, /* 0xA0 */
+ 0xC0F6, 0xC0F3, 0xED6A, 0xED68, 0, 0xED6B, 0, 0xED6E, /* 0xA0 */
+ 0xC0F4, 0xED6C, 0xED67, 0, 0, 0xF042, 0xF045, 0xF275, /* 0xB0 */
+ 0xF040, 0, 0xF46F, 0xF046, 0, 0xC3A2, 0xF044, 0xC27B, /* 0xB0 */
+ 0xF041, 0xF043, 0xF047, 0xF276, 0, 0xF274, 0, 0, /* 0xC0 */
+ 0, 0, 0xC3A3, 0xF273, 0, 0, 0, 0xC46E, /* 0xC0 */
+ 0, 0, 0, 0, 0xC4ED, 0xF6F1, 0xC4EC, 0xF6F3, /* 0xD0 */
+ 0xF6F0, 0xF6F2, 0xC5D0, 0xF8B2, 0xA5CA, 0xCD6E, 0xD2BC, 0xD2BD, /* 0xD0 */
+ 0xB27D, 0xDEBF, 0xBF5D, 0xC3A4, 0xC57B, 0xF8B3, 0xA5CB, 0, /* 0xE0 */
+ 0xCD6F, 0xA260, 0, 0, 0xCFD7, 0, 0xCFD8, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0xD2BE, 0xD2BF, 0xB27E, 0xB2A1, /* 0xF0 */
+ 0, 0, 0, 0xDAAB, 0, 0xDEC2, 0xDEC1, 0xDEC0 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_75[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE2D5, 0, 0xE2D6, 0xE2D7, 0xBAC2, 0, 0, 0xE6AD, /* 0x00 */
+ 0xE6AC, 0, 0, 0xEA69, 0xBF5E, 0xBF5F, 0, 0xED72, /* 0x00 */
+ 0xED6F, 0xED70, 0xED71, 0xF049, 0xF048, 0xC27C, 0xF277, 0xF5DE, /* 0x10 */
+ 0xA5CC, 0, 0xACC6, 0, 0xB2A2, 0xDEC3, 0, 0xA5CD, /* 0x10 */
+ 0, 0xD2C0, 0xB2A3, 0, 0, 0xB563, 0xB564, 0, /* 0x20 */
+ 0xA5CE, 0xA5CF, 0xCA46, 0xA86A, 0xA869, 0xACC7, 0xCFD9, 0xDAAC, /* 0x20 */
+ 0xA5D0, 0xA5D1, 0xA5D2, 0xA5D3, 0, 0, 0, 0xA86B, /* 0x30 */
+ 0xA86C, 0xCB6E, 0xCB6D, 0, 0, 0xAAB6, 0xCD72, 0xCD70, /* 0x30 */
+ 0xCD71, 0, 0, 0, 0, 0, 0, 0xCFDA, /* 0x40 */
+ 0xCFDB, 0, 0, 0xACCB, 0xACC9, 0, 0xACCA, 0xACC8, /* 0x40 */
+ 0, 0, 0, 0, 0xAF60, 0, 0, 0, /* 0x50 */
+ 0, 0xAF64, 0xAF63, 0xD2C1, 0xAF62, 0xAF61, 0, 0xD2C2, /* 0x50 */
+ 0, 0, 0xB2A6, 0xD67B, 0xD67A, 0xB2A4, 0xB2A5, 0, /* 0x60 */
+ 0, 0, 0xB566, 0xB565, 0xDAAE, 0, 0, 0xDAAD, /* 0x60 */
+ 0xB2A7, 0, 0, 0, 0, 0, 0xB7ED, 0xDEC5, /* 0x70 */
+ 0xB7EE, 0xDEC4, 0, 0, 0, 0xE2D8, 0xE6AE, 0xBD42, /* 0x70 */
+ 0xEA6A, 0, 0, 0, 0xED73, 0, 0xC3A6, 0xC3A5, /* 0x80 */
+ 0, 0, 0xC57C, 0xA5D4, 0xCD73, 0, 0, 0xB2A8, /* 0x80 */
+ 0xE2D9, 0xBAC3, 0, 0, 0xCB6F, 0xCB70, 0, 0, /* 0x90 */
+ 0xCD74, 0xAAB8, 0xAAB9, 0, 0, 0xAAB7, 0, 0, /* 0x90 */
+ 0, 0, 0xACCF, 0xACD0, 0xACCD, 0xACCE, 0, 0xCFDC, /* 0xA0 */
+ 0, 0, 0xCFDD, 0xACCC, 0, 0, 0, 0, /* 0xA0 */
+ 0xD2C3, 0, 0xAF68, 0xAF69, 0, 0xB2AB, 0xD2C9, 0, /* 0xB0 */
+ 0xAF6E, 0xAF6C, 0xD2CA, 0xD2C5, 0xAF6B, 0xAF6A, 0xAF65, 0xD2C8, /* 0xB0 */
+ 0xD2C7, 0xD2C4, 0xAF6D, 0, 0xD2C6, 0xAF66, 0, 0xAF67, /* 0xC0 */
+ 0, 0, 0xB2AC, 0xD6A1, 0xD6A2, 0xB2AD, 0xD67C, 0xD67E, /* 0xC0 */
+ 0xD6A4, 0xD6A3, 0xD67D, 0, 0xB2A9, 0xB2AA, 0, 0xDAB6, /* 0xD0 */
+ 0xB56B, 0xB56A, 0xDAB0, 0xB568, 0, 0xDAB3, 0xB56C, 0xDAB4, /* 0xD0 */
+ 0xB56D, 0xDAB1, 0xB567, 0xB569, 0xDAB5, 0, 0xDAB2, 0xDAAF, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xDED2, 0, 0xDEC7, /* 0xE0 */
+ 0xB7F0, 0xB7F3, 0xB7F2, 0xB7F7, 0xB7F6, 0xDED3, 0xDED1, 0xDECA, /* 0xF0 */
+ 0xDECE, 0xDECD, 0xB7F4, 0xDED0, 0xDECC, 0xDED4, 0xDECB, 0xB7F5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_76[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB7EF, 0xB7F1, 0, 0xDEC9, 0, 0, 0, 0, /* 0x00 */
+ 0xE2DB, 0xBAC7, 0xE2DF, 0xBAC6, 0xE2DC, 0xBAC5, 0, 0xDEC8, /* 0x00 */
+ 0xDECF, 0xE2DE, 0, 0xBAC8, 0xE2E0, 0xE2DD, 0xE2DA, 0, /* 0x10 */
+ 0, 0xE6B1, 0xE6B5, 0xE6B7, 0xE6B3, 0xE6B2, 0xE6B0, 0xBD45, /* 0x10 */
+ 0xBD43, 0xBD48, 0xBD49, 0xE6B4, 0xBD46, 0xE6AF, 0xBD47, 0xBAC4, /* 0x20 */
+ 0xE6B6, 0xBD44, 0, 0, 0, 0xEA6C, 0, 0xEA6B, /* 0x20 */
+ 0xEA73, 0xEA6D, 0xEA72, 0xEA6F, 0xBF60, 0xEA71, 0, 0, /* 0x30 */
+ 0xBF61, 0, 0xBF62, 0, 0xEA70, 0xEA6E, 0, 0, /* 0x30 */
+ 0, 0, 0xC0F8, 0xED74, 0, 0, 0xC0F7, 0xED77, /* 0x40 */
+ 0xED75, 0xED76, 0, 0, 0xC0F9, 0, 0, 0, /* 0x40 */
+ 0xF04D, 0, 0xC2A1, 0xF04E, 0, 0, 0xC27D, 0xF04F, /* 0x50 */
+ 0xC27E, 0xF04C, 0xF050, 0, 0xF04A, 0, 0, 0xC3A7, /* 0x50 */
+ 0xF278, 0xC3A8, 0xC46F, 0, 0xF04B, 0xC470, 0, 0, /* 0x60 */
+ 0, 0xC4EE, 0xF5DF, 0, 0xC57E, 0xF6F4, 0xC57D, 0, /* 0x60 */
+ 0xF7EA, 0xC5F5, 0xC5F6, 0, 0, 0xF9CC, 0, 0, /* 0x70 */
+ 0xACD1, 0xCFDE, 0, 0xB56E, 0xB56F, 0xA5D5, 0xA6CA, 0xCA47, /* 0x70 */
+ 0, 0xCB71, 0xA86D, 0, 0xAABA, 0, 0xACD2, 0xACD3, /* 0x80 */
+ 0xACD4, 0xD6A6, 0xD2CB, 0xAF6F, 0, 0, 0xB2AE, 0xD6A5, /* 0x80 */
+ 0, 0, 0xDAB8, 0xB571, 0, 0xDAB7, 0xB570, 0, /* 0x90 */
+ 0, 0xDED5, 0xBD4A, 0xE6BB, 0xE6B8, 0xE6B9, 0xE6BA, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xED78, 0, 0xF051, 0, /* 0xA0 */
+ 0, 0, 0xF471, 0xF470, 0, 0xF6F5, 0xA5D6, 0xCD75, /* 0xA0 */
+ 0xAF70, 0, 0, 0, 0xB572, 0xDED6, 0, 0, /* 0xB0 */
+ 0xE2E1, 0, 0xBD4B, 0xEA74, 0, 0xF052, 0xF472, 0xA5D7, /* 0xB0 */
+ 0, 0, 0xAABB, 0xACD7, 0xCFDF, 0xACD8, 0xACD6, 0, /* 0xC0 */
+ 0xACD5, 0xD2CC, 0xAF71, 0, 0, 0xAF72, 0xAF73, 0, /* 0xC0 */
+ 0, 0, 0xB2B0, 0xD6A7, 0xB2AF, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0xDAB9, 0xB2B1, 0xB573, 0xDED7, 0xB7F8, 0xB7F9, /* 0xD0 */
+ 0, 0xBAC9, 0, 0xBACA, 0xBD4C, 0xBF64, 0xEA75, 0xBF63, /* 0xE0 */
+ 0, 0xED79, 0xC0FA, 0, 0xF053, 0xF473, 0xA5D8, 0xA86E, /* 0xE0 */
+ 0xCD78, 0xCD77, 0xAABC, 0xCD76, 0xAABD, 0xCD79, 0, 0xCFE5, /* 0xF0 */
+ 0xACDB, 0xACDA, 0xCFE7, 0xCFE6, 0xACDF, 0, 0xACDE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_77[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xACD9, 0, 0xCFE1, 0xCFE2, 0xCFE3, 0, 0xACE0, /* 0x00 */
+ 0xCFE0, 0xACDC, 0xCFE4, 0xACDD, 0, 0, 0, 0, /* 0x00 */
+ 0xD2CF, 0xD2D3, 0xD2D1, 0xD2D0, 0, 0xD2D4, 0, 0, /* 0x10 */
+ 0, 0xD2D5, 0xD2D6, 0xD2CE, 0, 0xD2CD, 0, 0xAF75, /* 0x10 */
+ 0xAF76, 0, 0xD2D7, 0xD2D2, 0, 0xD6B0, 0, 0xD2D8, /* 0x20 */
+ 0xAF77, 0xAF74, 0, 0, 0, 0xD6AA, 0, 0xD6A9, /* 0x20 */
+ 0, 0xD6AB, 0xD6AC, 0xD6AE, 0xD6AD, 0xD6B2, 0xB2B5, 0xB2B2, /* 0x30 */
+ 0xB2B6, 0xD6A8, 0xB2B7, 0xD6B1, 0xB2B4, 0xD6AF, 0xB2B3, 0, /* 0x30 */
+ 0, 0, 0, 0, 0xDABC, 0xDABE, 0xDABA, 0xDABB, /* 0x40 */
+ 0, 0, 0xDABF, 0xDAC1, 0xDAC2, 0xDABD, 0xDAC0, 0xB574, /* 0x40 */
+ 0, 0, 0xDEDB, 0, 0xDEE0, 0xDED8, 0xDEDC, 0, /* 0x50 */
+ 0, 0xDEE1, 0xDEDD, 0xB7FA, 0xB843, 0, 0xB7FD, 0xDED9, /* 0x50 */
+ 0xDEDA, 0xBACE, 0xB846, 0xB7FE, 0, 0xB844, 0xB7FC, 0xDEDF, /* 0x60 */
+ 0xB845, 0xDEDE, 0xB841, 0xB7FB, 0xB842, 0xDEE2, 0xE2E6, 0xE2E8, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB840, 0, 0, 0xE2E3, 0xBACC, 0xE2E9, 0xBACD, /* 0x70 */
+ 0xE2E7, 0xE2E2, 0xE2E5, 0xE2EA, 0xBACB, 0xE2E4, 0, 0xBD4E, /* 0x80 */
+ 0xE6BF, 0xE6BE, 0, 0xBD51, 0xBD4F, 0xE6BC, 0xBD4D, 0xE6BD, /* 0x80 */
+ 0, 0xBD50, 0, 0, 0, 0xEA7D, 0, 0xEAA1, /* 0x90 */
+ 0, 0xEA7E, 0xEA76, 0xEA7A, 0xEA79, 0xEA77, 0xBF66, 0xBF67, /* 0x90 */
+ 0xBF65, 0xEA78, 0xEA7B, 0xEA7C, 0, 0xBF68, 0, 0xC140, /* 0xA0 */
+ 0xEDA3, 0, 0xC0FC, 0xED7B, 0xC0FE, 0xC141, 0, 0, /* 0xA0 */
+ 0xC0FD, 0xEDA2, 0xED7C, 0xC0FB, 0xEDA1, 0xED7A, 0xED7E, 0xED7D, /* 0xB0 */
+ 0, 0, 0xF055, 0xC2A4, 0xC2A5, 0xC2A2, 0, 0xC2A3, /* 0xB0 */
+ 0, 0, 0xF054, 0, 0xF27B, 0, 0, 0xC3A9, /* 0xC0 */
+ 0, 0xF279, 0xF27A, 0, 0xF474, 0xF477, 0xF475, 0xF476, /* 0xC0 */
+ 0xF5E0, 0, 0, 0xC4EF, 0xF7EB, 0xF8B4, 0, 0xC5F7, /* 0xD0 */
+ 0xF8F8, 0xF8F9, 0xC666, 0xA5D9, 0xACE1, 0, 0xDAC3, 0, /* 0xD0 */
+ 0xDEE3, 0, 0xA5DA, 0xA86F, 0, 0xAABE, 0, 0xCFE8, /* 0xE0 */
+ 0xCFE9, 0xAF78, 0, 0, 0xDAC4, 0xB575, 0xB847, 0xC142, /* 0xE0 */
+ 0xEDA4, 0xF27C, 0xF478, 0xA5DB, 0, 0, 0, 0xCDA1, /* 0xF0 */
+ 0xCD7A, 0xCD7C, 0xCD7E, 0xCD7D, 0xCD7B, 0xAABF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_78[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xACE2, 0xCFF2, 0, 0xCFED, 0xCFEA, 0, /* 0x00 */
+ 0, 0xCFF1, 0, 0, 0xACE4, 0xACE5, 0xCFF0, 0xCFEF, /* 0x00 */
+ 0xCFEE, 0xCFEB, 0xCFEC, 0xCFF3, 0xACE3, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0xAF7C, 0, 0xAFA4, /* 0x10 */
+ 0xAFA3, 0xD2E1, 0xD2DB, 0xD2D9, 0, 0xAFA1, 0xD6B9, 0xAF7A, /* 0x20 */
+ 0xD2DE, 0xD2E2, 0xD2E4, 0xD2E0, 0xD2DA, 0xAFA2, 0xD2DF, 0xD2DD, /* 0x20 */
+ 0xAF79, 0xD2E5, 0xAFA5, 0xD2E3, 0xAF7D, 0xD2DC, 0, 0xAF7E, /* 0x30 */
+ 0xAF7B, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xB2B9, 0, 0xD6BA, 0, 0, /* 0x40 */
+ 0xD6B3, 0xD6B5, 0xD6B7, 0, 0xD6B8, 0xD6B6, 0xB2BA, 0, /* 0x40 */
+ 0xD6BB, 0, 0xD6B4, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xDAC8, 0xB576, 0xDAD0, 0, /* 0x50 */
+ 0xDAC5, 0, 0xDAD1, 0, 0xDAC6, 0xDAC7, 0, 0, /* 0x60 */
+ 0xDACF, 0xDACE, 0xDACB, 0xB2B8, 0xB577, 0xDAC9, 0xDACC, 0xB578, /* 0x60 */
+ 0xDACD, 0xDACA, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xDEEE, 0, 0xDEF2, 0xB84E, 0, 0xE2F0, 0xB851, /* 0x70 */
+ 0xDEF0, 0xF9D6, 0, 0xDEED, 0xDEE8, 0xDEEA, 0xDEEB, 0xDEE4, /* 0x80 */
+ 0, 0xB84D, 0, 0, 0xB84C, 0, 0xB848, 0xDEE7, /* 0x80 */
+ 0, 0xB84F, 0, 0xB850, 0xDEE6, 0xDEE9, 0xDEF1, 0xB84A, /* 0x90 */
+ 0xB84B, 0xDEEF, 0xDEE5, 0, 0, 0, 0xE2F2, 0xBAD0, /* 0x90 */
+ 0xE2F4, 0xDEEC, 0xE2F6, 0xBAD4, 0xE2F7, 0xE2F3, 0, 0xBAD1, /* 0xA0 */
+ 0xE2EF, 0xBAD3, 0xE2EC, 0xE2F1, 0xE2F5, 0xE2EE, 0, 0, /* 0xA0 */
+ 0xB849, 0, 0xE2EB, 0xBAD2, 0xE2ED, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xBD54, 0xE6C1, 0xBD58, 0, 0xBD56, 0, /* 0xB0 */
+ 0, 0xBACF, 0, 0xE6C8, 0xE6C9, 0xBD53, 0, 0, /* 0xC0 */
+ 0xE6C7, 0xE6CA, 0xBD55, 0xBD52, 0xE6C3, 0xE6C0, 0xE6C5, 0xE6C2, /* 0xC0 */
+ 0xBD59, 0xE6C4, 0, 0, 0xE6C6, 0xBD57, 0, 0, /* 0xD0 */
+ 0, 0, 0xBF6A, 0xEAA8, 0, 0xEAA2, 0xEAA6, 0xEAAC, /* 0xD0 */
+ 0xEAAD, 0xEAA9, 0xEAAA, 0xEAA7, 0, 0xEAA4, 0, 0xBF6C, /* 0xE0 */
+ 0xBF69, 0xEAA3, 0xEAA5, 0, 0xBF6B, 0xEAAB, 0, 0xC146, /* 0xE0 */
+ 0, 0, 0xEDAA, 0xEDA5, 0xC145, 0, 0, 0xC143, /* 0xF0 */
+ 0, 0xEDAC, 0xC144, 0xEDA8, 0xEDA9, 0xEDA6, 0xEDAD, 0xF056 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_79[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC147, 0xEDA7, 0, 0xEDAE, 0xEDAB, 0, 0, /* 0x00 */
+ 0, 0xF05A, 0, 0, 0xF057, 0, 0xC2A6, 0, /* 0x00 */
+ 0xF05B, 0xF05D, 0xF05C, 0xF058, 0xF059, 0, 0, 0xF2A3, /* 0x10 */
+ 0, 0xC3AA, 0, 0xF27E, 0xF2A2, 0xF27D, 0xF2A4, 0, /* 0x10 */
+ 0, 0xF2A1, 0, 0xF47A, 0xF47D, 0xF479, 0xC471, 0xF47B, /* 0x20 */
+ 0xF47C, 0xF47E, 0xC472, 0xC474, 0xC473, 0xF5E1, 0, 0xF5E3, /* 0x20 */
+ 0, 0xF5E2, 0, 0, 0, 0xF6F6, 0, 0, /* 0x30 */
+ 0xF8B5, 0xF8FA, 0xA5DC, 0, 0, 0xCB72, 0xAAC0, 0xCDA3, /* 0x30 */
+ 0xAAC1, 0xAAC2, 0xCDA2, 0, 0xCFF8, 0xCFF7, 0xACE6, 0xACE9, /* 0x40 */
+ 0xACE8, 0xACE7, 0xCFF4, 0xCFF6, 0xCFF5, 0, 0, 0xD2E8, /* 0x40 */
+ 0xAFA7, 0xD2EC, 0xD2EB, 0xD2EA, 0xD2E6, 0xAFA6, 0xAFAA, 0xAFAD, /* 0x50 */
+ 0, 0, 0xAFAE, 0xD2E7, 0xD2E9, 0xAFAC, 0xAFAB, 0xAFA9, /* 0x50 */
+ 0xAFA8, 0xD6C2, 0, 0xD6C0, 0xD6BC, 0xB2BB, 0, 0xD6BD, /* 0x60 */
+ 0xB2BC, 0xD6BE, 0xD6BF, 0xD6C1, 0, 0xB2BD, 0, 0, /* 0x60 */
+ 0xDAD5, 0, 0xDAD4, 0xDAD3, 0xDAD2, 0, 0, 0, /* 0x70 */
+ 0, 0xDEF6, 0xB852, 0, 0xDEF3, 0xDEF5, 0, 0xB853, /* 0x70 */
+ 0, 0xB854, 0xDEF4, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xE341, 0, 0xE2F9, 0xE2FA, 0, 0xBAD7, 0xBAD5, 0xBAD6, /* 0x80 */
+ 0xE343, 0, 0xE342, 0xE2FE, 0xE2FD, 0xE2FC, 0xE2FB, 0xE340, /* 0x90 */
+ 0xE2F8, 0, 0xE6CB, 0xE6D0, 0xE6CE, 0, 0, 0, /* 0x90 */
+ 0xE6CD, 0xE6CC, 0xE6CF, 0, 0xEAAE, 0, 0xBF6D, 0xC148, /* 0xA0 */
+ 0xEDB0, 0, 0xC149, 0xEDAF, 0xF05F, 0xF05E, 0xC2A7, 0, /* 0xA0 */
+ 0xF2A5, 0xC3AB, 0xF4A1, 0xC5A1, 0xF6F7, 0, 0xF8B7, 0xF8B6, /* 0xB0 */
+ 0xC9A8, 0xACEA, 0xACEB, 0xD6C3, 0, 0xB856, 0xA5DD, 0xA872, /* 0xB0 */
+ 0xA871, 0xA870, 0, 0, 0, 0xCDA4, 0, 0, /* 0xC0 */
+ 0xAAC4, 0xAAC3, 0, 0xACEE, 0, 0xCFFA, 0xCFFD, 0xCFFB, /* 0xC0 */
+ 0, 0xACEC, 0xACED, 0, 0, 0xCFF9, 0xCFFC, 0, /* 0xD0 */
+ 0xAFB5, 0, 0, 0, 0xD2F3, 0xD2F5, 0xD2F4, 0xAFB2, /* 0xD0 */
+ 0xD2EF, 0, 0, 0xAFB0, 0xAFAF, 0, 0xAFB3, 0xAFB1, /* 0xE0 */
+ 0, 0xAFB4, 0xD2F2, 0xD2ED, 0xD2EE, 0xD2F1, 0xD2F0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xD6C6, 0xD6C7, /* 0xF0 */
+ 0xD6C5, 0, 0xD6C4, 0xB2BE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_7A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB57D, 0, 0xDAD6, 0xDAD8, 0xDADA, 0xB57C, 0, 0, /* 0x00 */
+ 0xB57A, 0, 0xDAD7, 0xB57B, 0xDAD9, 0xB579, 0, 0, /* 0x00 */
+ 0xDF41, 0xDEF7, 0xDEFA, 0xDEFE, 0xB85A, 0xDEFC, 0, 0xDEFB, /* 0x10 */
+ 0xDEF8, 0xDEF9, 0xB858, 0xDF40, 0xB857, 0, 0xB85C, 0xB85B, /* 0x10 */
+ 0xB859, 0, 0xDEFD, 0, 0, 0, 0xE349, 0, /* 0x20 */
+ 0xE348, 0, 0, 0xE344, 0, 0, 0xBAD8, 0xE347, /* 0x20 */
+ 0xE346, 0xBAD9, 0, 0, 0, 0, 0, 0xBD5E, /* 0x30 */
+ 0, 0xE6D2, 0, 0xBD5F, 0xBD5B, 0xBD5D, 0, 0xBD5A, /* 0x30 */
+ 0xBD5C, 0, 0, 0, 0xEAAF, 0, 0xBF70, 0xEAB1, /* 0x40 */
+ 0xEAB0, 0, 0xE345, 0xBF72, 0xBF71, 0xBF6E, 0xBF6F, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xEDB5, 0, 0xEDB3, 0xC14A, /* 0x50 */
+ 0xEDB4, 0, 0xEDB6, 0xEDB2, 0xEDB1, 0, 0, 0xF060, /* 0x50 */
+ 0xC2AA, 0xC2A8, 0xC2A9, 0, 0, 0, 0, 0xF2A6, /* 0x60 */
+ 0xF2A7, 0xC3AD, 0, 0xC3AC, 0xF4A3, 0xF4A4, 0xF4A2, 0, /* 0x60 */
+ 0xF6F8, 0xF6F9, 0, 0, 0xA5DE, 0xCA48, 0xA873, 0, /* 0x70 */
+ 0xCDA5, 0xAAC6, 0xAAC5, 0xCDA6, 0, 0, 0xD040, 0xACEF, /* 0x70 */
+ 0xCFFE, 0xACF0, 0, 0, 0xAFB6, 0xD2F8, 0xD2F6, 0xD2FC, /* 0x80 */
+ 0xAFB7, 0xD2F7, 0xD2FB, 0xD2F9, 0xD2FA, 0, 0, 0xD6C8, /* 0x80 */
+ 0xD6CA, 0, 0xB2BF, 0, 0xD6C9, 0xB2C0, 0xB5A2, 0xB5A1, /* 0x90 */
+ 0xB57E, 0xDADB, 0, 0, 0, 0, 0xDF44, 0xB85D, /* 0x90 */
+ 0xB85E, 0, 0xDF43, 0xDF42, 0, 0, 0, 0, /* 0xA0 */
+ 0xE34A, 0xBADB, 0xBADA, 0xE34B, 0xE34C, 0, 0xBD61, 0xBD60, /* 0xA0 */
+ 0, 0xEAB5, 0xE6D3, 0xE6D5, 0xE6D4, 0xEAB4, 0xEAB2, 0xEAB6, /* 0xB0 */
+ 0xEAB3, 0, 0xBF73, 0, 0, 0, 0xEDB7, 0xC14B, /* 0xB0 */
+ 0xEDB8, 0xEDB9, 0, 0, 0xC2AB, 0xC2AC, 0, 0xC475, /* 0xC0 */
+ 0, 0, 0xC5D1, 0xA5DF, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xD041, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xD2FD, 0xAFB8, 0, 0, 0, 0, 0, 0xB3BA, /* 0xD0 */
+ 0xB3B9, 0, 0, 0xB5A4, 0xDADD, 0xB5A3, 0xDADC, 0, /* 0xE0 */
+ 0, 0, 0, 0xDF45, 0, 0xBADC, 0xE34D, 0xBADD, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0xC476, 0xF4A5, /* 0xF0 */
+ 0, 0xA6CB, 0xAAC7, 0xCDA7, 0, 0xACF2, 0, 0xACF1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_7B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD042, 0xD043, 0, 0, 0xD340, 0xD342, 0xAFB9, 0, /* 0x00 */
+ 0xD344, 0xD347, 0xD345, 0, 0, 0, 0xD346, 0xD343, /* 0x00 */
+ 0xD2FE, 0xAFBA, 0xD348, 0xD341, 0, 0, 0, 0, /* 0x10 */
+ 0xD6D3, 0xB2C6, 0xD6DC, 0xB2C3, 0, 0xD6D5, 0xB2C7, 0, /* 0x10 */
+ 0xB2C1, 0, 0xD6D0, 0xD6DD, 0xD6D1, 0xD6CE, 0xB2C5, 0, /* 0x20 */
+ 0xB2C2, 0, 0xD6D4, 0xD6D7, 0xB2C4, 0xD6D8, 0xB2C8, 0xD6D9, /* 0x20 */
+ 0xD6CF, 0xD6D6, 0xD6DA, 0xD6D2, 0xD6CD, 0xD6CB, 0, 0, /* 0x30 */
+ 0xD6DB, 0, 0, 0xDADF, 0, 0, 0, 0, /* 0x30 */
+ 0xDAE4, 0, 0, 0, 0xDAE0, 0xDAE6, 0xB5A7, 0xD6CC, /* 0x40 */
+ 0xDAE1, 0xB5A5, 0xDADE, 0xB5AC, 0xDAE2, 0xB5AB, 0xDAE3, 0xB5AD, /* 0x40 */
+ 0xB5A8, 0xB5AE, 0xB5A9, 0, 0xB5AA, 0, 0xB5A6, 0, /* 0x50 */
+ 0xDAE5, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0xB861, 0xDF50, 0, 0xDF53, 0xDF47, 0xDF4C, 0xDF46, 0xB863, /* 0x60 */
+ 0, 0xDF4A, 0, 0, 0, 0xDF48, 0xB862, 0, /* 0x60 */
+ 0xDF4F, 0xDF4E, 0xDF4B, 0xDF4D, 0xDF49, 0xBAE1, 0xDF52, 0xB85F, /* 0x70 */
+ 0xDF51, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0xE35D, 0, 0xBAE8, 0xE358, 0, 0xBAE7, /* 0x80 */
+ 0xE34E, 0, 0xE350, 0xBAE0, 0xE355, 0xE354, 0xE357, 0xBAE5, /* 0x80 */
+ 0xE352, 0xE351, 0, 0, 0xBAE4, 0xBADF, 0xE353, 0xBAE2, /* 0x90 */
+ 0xE359, 0xE35B, 0, 0xE356, 0xE34F, 0xBAE3, 0, 0, /* 0x90 */
+ 0xBD69, 0xBADE, 0, 0, 0xE35C, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0xE6D9, 0xBD62, 0, 0xE6DB, /* 0xA0 */
+ 0, 0xBD63, 0, 0, 0xBD65, 0xE6DE, 0, 0xE6D6, /* 0xB0 */
+ 0xBAE6, 0xE6DC, 0, 0, 0, 0, 0xE6D8, 0, /* 0xB0 */
+ 0xB860, 0xBD68, 0, 0, 0xBD64, 0, 0xBD66, 0xBD67, /* 0xC0 */
+ 0, 0xBF76, 0xE6DD, 0xE6D7, 0xBD6A, 0, 0xE6DA, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xEAC0, 0xEABB, 0, 0, /* 0xD0 */
+ 0xEAC5, 0xBF74, 0xEABD, 0xBF78, 0xEAC3, 0xEABA, 0xEAB7, 0xEAC6, /* 0xD0 */
+ 0xC151, 0xBF79, 0xEAC2, 0xEAB8, 0xBF77, 0xEABC, 0xBF7B, 0xEAB9, /* 0xE0 */
+ 0xEABE, 0xBF7A, 0xEAC1, 0xEAC4, 0, 0, 0, 0, /* 0xE0 */
+ 0xEDCB, 0xEDCC, 0xEDBC, 0xEDC3, 0xEDC1, 0, 0, 0xC14F, /* 0xF0 */
+ 0xEDC8, 0xEABF, 0, 0xEDBF, 0, 0xEDC9, 0xC14E, 0xEDBE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_7C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEDBD, 0xEDC7, 0xEDC4, 0xEDC6, 0, 0xEDBA, 0xEDCA, 0xC14C, /* 0x00 */
+ 0, 0xEDC5, 0xEDCE, 0xEDC2, 0xC150, 0xC14D, 0xEDC0, 0xEDBB, /* 0x00 */
+ 0xEDCD, 0xBF75, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0, 0xF063, 0, 0, 0xF061, 0xF067, 0xC2B0, 0xF065, /* 0x10 */
+ 0xF064, 0xC2B2, 0xF06A, 0xC2B1, 0, 0xF06B, 0xF068, 0xC2AE, /* 0x20 */
+ 0xF069, 0xF062, 0xC2AF, 0xC2AD, 0xF2AB, 0xF066, 0, 0, /* 0x20 */
+ 0xF06C, 0, 0, 0xF2A8, 0, 0, 0, 0xC3B2, /* 0x30 */
+ 0xC3B0, 0xF2AA, 0, 0xF2AC, 0xF2A9, 0xC3B1, 0xC3AE, 0xC3AF, /* 0x30 */
+ 0xC3B3, 0, 0, 0xC478, 0, 0xF4AA, 0, 0xF4A9, /* 0x40 */
+ 0xF4A7, 0xF4A6, 0xF4A8, 0, 0xC477, 0xC479, 0, 0, /* 0x40 */
+ 0xC4F0, 0, 0, 0xF5E5, 0xF5E4, 0, 0, 0xF6FA, /* 0x50 */
+ 0, 0xF6FC, 0xF6FE, 0xF6FD, 0xF6FB, 0, 0, 0xC5A3, /* 0x50 */
+ 0xC5A2, 0, 0, 0xC5D3, 0xC5D2, 0xC5D4, 0xF7ED, 0xF7EC, /* 0x60 */
+ 0, 0xF8FB, 0xF8B8, 0xF8FC, 0xC658, 0, 0xC659, 0xF96D, /* 0x60 */
+ 0, 0, 0xC67E, 0xA6CC, 0, 0xCDA8, 0, 0, /* 0x70 */
+ 0xD045, 0xD046, 0xD044, 0, 0, 0xACF3, 0, 0xD047, /* 0x70 */
+ 0xD048, 0xD049, 0, 0, 0xD349, 0xD34F, 0, 0, /* 0x80 */
+ 0xD34D, 0xAFBB, 0xD34B, 0, 0xD34C, 0xD34E, 0, 0, /* 0x80 */
+ 0, 0xD34A, 0xB2C9, 0, 0xD6DE, 0xB2CB, 0xD6E0, 0xB2CA, /* 0x90 */
+ 0xD6DF, 0, 0, 0, 0, 0, 0xDAE8, 0xB5AF, /* 0x90 */
+ 0, 0xDAEA, 0xDAE7, 0xD6E1, 0, 0xB5B0, 0, 0xF9DB, /* 0xA0 */
+ 0xDAE9, 0, 0, 0, 0, 0, 0, 0xDF56, /* 0xA0 */
+ 0, 0xB864, 0xDF54, 0xB865, 0xDF55, 0xB866, 0, 0, /* 0xB0 */
+ 0, 0xBAE9, 0xE361, 0xE35E, 0xE360, 0xBAEA, 0xBAEB, 0xE35F, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xE6DF, 0, 0, /* 0xC0 */
+ 0xE6E0, 0, 0xBD6B, 0xE6E2, 0xE6E1, 0, 0xA261, 0, /* 0xC0 */
+ 0xEACA, 0xEACB, 0xEAC7, 0, 0xEAC8, 0xBF7C, 0xBF7D, 0xEAC9, /* 0xD0 */
+ 0, 0xC157, 0, 0, 0xC153, 0xC158, 0xC154, 0xC156, /* 0xD0 */
+ 0xC152, 0, 0xC155, 0, 0, 0, 0, 0xC2B3, /* 0xE0 */
+ 0xEDCF, 0, 0xF2AE, 0, 0xF2AD, 0, 0xF4AB, 0xC47A, /* 0xE0 */
+ 0xC47B, 0xF741, 0xF5E6, 0, 0xF740, 0, 0xF8FD, 0xF9A4, /* 0xF0 */
+ 0xA6CD, 0, 0, 0xA874, 0, 0xCDA9, 0xAAC8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_7D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xACF6, 0xD04C, 0xACF4, 0xD04A, 0xACF9, 0xACF5, 0xACFA, 0xACF8, /* 0x00 */
+ 0xD04B, 0xACF7, 0xAFBF, 0xAFBE, 0xD35A, 0xAFC7, 0xD353, 0xD359, /* 0x00 */
+ 0xAFC3, 0xD352, 0xD358, 0xD356, 0xAFC2, 0xAFC4, 0xD355, 0xAFBD, /* 0x10 */
+ 0xD354, 0xAFC8, 0xAFC5, 0xAFC9, 0xAFC6, 0xD351, 0xD350, 0xD357, /* 0x10 */
+ 0xAFC0, 0xAFBC, 0xAFC1, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xD6F0, 0xD6E9, 0, 0xB5B5, 0xD6E8, 0, 0xB2CF, 0xB2D6, /* 0x20 */
+ 0xB2D3, 0xB2D9, 0xB2D8, 0xB2D4, 0, 0xD6E2, 0xD6E5, 0, /* 0x30 */
+ 0xD6E4, 0xB2D0, 0xD6E6, 0xD6EF, 0xB2D1, 0xD6E3, 0xD6EC, 0xD6ED, /* 0x30 */
+ 0xB2D2, 0xD6EA, 0xB2D7, 0xB2CD, 0xB2D5, 0xD6E7, 0xB2CC, 0xD6EB, /* 0x40 */
+ 0, 0, 0xD6EE, 0, 0, 0, 0xDAFB, 0xDAF2, /* 0x40 */
+ 0xB5B2, 0xDAF9, 0xDAF6, 0xDAEE, 0xDAF7, 0xB5B4, 0xDAEF, 0, /* 0x50 */
+ 0xDAEB, 0, 0, 0xB86C, 0xDAF4, 0, 0xB5B1, 0xDAFA, /* 0x50 */
+ 0, 0xB5B8, 0xB5BA, 0xDAED, 0, 0, 0xB5B9, 0xDAF0, /* 0x60 */
+ 0xB5B3, 0xDAF8, 0xDAF1, 0xDAF5, 0, 0xDAF3, 0xB5B6, 0xDAEC, /* 0x60 */
+ 0xB5BB, 0xB2CE, 0xB5B7, 0xB5BC, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xB868, 0xDF5D, 0xDF5F, 0xDF61, 0xDF65, 0, 0xDF5B, /* 0x70 */
+ 0xDF59, 0xB86A, 0, 0xDF60, 0xDF64, 0xDF5C, 0xDF58, 0, /* 0x80 */
+ 0xDF57, 0, 0, 0, 0xDF62, 0xDF5A, 0xDF5E, 0xB86B, /* 0x80 */
+ 0, 0xB869, 0xDF66, 0xB867, 0xDF63, 0, 0xE372, 0, /* 0x90 */
+ 0, 0, 0, 0, 0xBAEE, 0xE36A, 0xBD78, 0xE374, /* 0x90 */
+ 0xBAF1, 0xE378, 0xBAF7, 0xE365, 0, 0, 0xE375, 0xE362, /* 0xA0 */
+ 0, 0xE377, 0xE366, 0, 0xBAFE, 0xBAFB, 0xE376, 0xE370, /* 0xA0 */
+ 0xBAED, 0xBAF5, 0xBAF4, 0, 0xBAF3, 0xBAF9, 0, 0xE363, /* 0xB0 */
+ 0xBAFA, 0xE371, 0xBAF6, 0xBAEC, 0xE373, 0xBAEF, 0xBAF0, 0xBAF8, /* 0xB0 */
+ 0xE368, 0xE367, 0xE364, 0, 0xE36C, 0xE369, 0xE36D, 0xBAFD, /* 0xC0 */
+ 0, 0xE379, 0xBAF2, 0xE36E, 0xE36F, 0, 0xE36B, 0, /* 0xC0 */
+ 0, 0, 0xBAFC, 0, 0, 0, 0, 0xE6E7, /* 0xD0 */
+ 0xBD70, 0xBD79, 0xBD75, 0xE6E4, 0, 0xBD72, 0xBD76, 0xE6F0, /* 0xD0 */
+ 0xBD6C, 0xE6E8, 0, 0xBD74, 0, 0, 0xE6EB, 0xE6E6, /* 0xE0 */
+ 0xBD73, 0xBD77, 0xE6E5, 0, 0xBD71, 0, 0xE6EF, 0xBD6E, /* 0xE0 */
+ 0xE6EE, 0xE6ED, 0xBD7A, 0xE572, 0xBD6D, 0, 0xE6EC, 0xE6E3, /* 0xF0 */
+ 0, 0xBD7B, 0xE6EA, 0xBD6F /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_7E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE6E9, 0, 0, 0, 0, /* 0x00 */
+ 0xBFA2, 0xBFA7, 0xBF7E, 0xEAD8, 0xEACF, 0xEADB, 0xEAD3, 0xEAD9, /* 0x00 */
+ 0xBFA8, 0xBFA1, 0xEACC, 0xEAD2, 0xEADC, 0xEAD5, 0xEADA, 0xEACE, /* 0x10 */
+ 0, 0, 0xEAD6, 0xBFA3, 0xEAD4, 0xBFA6, 0xBFA5, 0xEAD0, /* 0x10 */
+ 0xEAD1, 0xEACD, 0xEAD7, 0xBFA4, 0xEADE, 0xEADD, 0, 0, /* 0x20 */
+ 0, 0xEDDA, 0xEDD6, 0xC15F, 0, 0xEDD0, 0xC159, 0xC169, /* 0x20 */
+ 0xEDDC, 0xC161, 0xC15D, 0xEDD3, 0xC164, 0xC167, 0xEDDE, 0xC15C, /* 0x30 */
+ 0xEDD5, 0xC165, 0xEDE0, 0xEDDD, 0xEDD1, 0xC160, 0xC15A, 0xC168, /* 0x30 */
+ 0xEDD8, 0xC163, 0xEDD2, 0xC15E, 0xEDDF, 0xC162, 0xC15B, 0xEDD9, /* 0x40 */
+ 0xC166, 0xEDD7, 0, 0, 0xEDDB, 0, 0, 0, /* 0x40 */
+ 0xF06E, 0xF074, 0xC2B9, 0xF077, 0xC2B4, 0xC2B5, 0xF06F, 0xF076, /* 0x50 */
+ 0xF071, 0xC2BA, 0xC2B7, 0, 0xF06D, 0, 0xC2B6, 0xF073, /* 0x50 */
+ 0xF075, 0xC2B8, 0xF072, 0xF070, 0, 0, 0, 0, /* 0x60 */
+ 0xF2B8, 0xC3B7, 0xC3B8, 0xC3B4, 0, 0xC3B5, 0, 0xF2B4, /* 0x60 */
+ 0xF2B2, 0, 0xF2B6, 0xC3BA, 0xF2B7, 0xF2B0, 0xF2AF, 0xF2B3, /* 0x70 */
+ 0xF2B1, 0xC3B6, 0xF2B5, 0xF4AC, 0xC47E, 0xC47D, 0xF4AD, 0, /* 0x70 */
+ 0xF4AF, 0xF4AE, 0xC4A1, 0, 0, 0, 0xF5EB, 0xF5E8, /* 0x80 */
+ 0xF5E9, 0, 0xF5E7, 0xF5EA, 0xC4F2, 0xF5EC, 0, 0xC4F1, /* 0x80 */
+ 0, 0xF742, 0, 0xC5D5, 0xC5D7, 0xF7EE, 0xC5D6, 0xF8B9, /* 0x90 */
+ 0xF940, 0xF942, 0xF8FE, 0xF941, 0xC66C /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_7F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA6CE, 0, /* 0x30 */
+ 0xACFB, 0xD26F, 0xAFCA, 0, 0, 0xB2DA, 0xDAFC, 0xDAFD, /* 0x30 */
+ 0, 0, 0, 0xEADF, 0xC16A, 0xEDE1, 0, 0, /* 0x40 */
+ 0xC2BB, 0, 0xF2BA, 0xF2B9, 0xC4A2, 0xF5ED, 0, 0xF743, /* 0x40 */
+ 0xC5F8, 0xCA49, 0, 0, 0xAAC9, 0xA875, 0, 0, /* 0x50 */
+ 0xD04D, 0, 0, 0xD360, 0xD35B, 0xD35F, 0xD35D, 0xAFCB, /* 0x50 */
+ 0xD35E, 0xD35C, 0, 0xD6F1, 0, 0xDAFE, 0xDB40, 0xDF69, /* 0x60 */
+ 0xDF6A, 0xB86E, 0xB86F, 0xDF68, 0xDF6B, 0xDF67, 0xB86D, 0, /* 0x60 */
+ 0xBB40, 0, 0xB870, 0xE37A, 0, 0xBD7C, 0xE6F1, 0xBD7D, /* 0x70 */
+ 0, 0xBFA9, 0xEAE2, 0xEAE0, 0xEAE1, 0xEDE4, 0xEDE3, 0xEDE2, /* 0x70 */
+ 0, 0, 0, 0xF2BB, 0, 0xC3B9, 0xF2BC, 0xF744, /* 0x80 */
+ 0xC5F9, 0xF8BA, 0xA6CF, 0xAACB, 0xAACA, 0xD04F, 0xACFC, 0, /* 0x80 */
+ 0, 0xD04E, 0xD362, 0, 0xAFCC, 0xD6F2, 0xD361, 0, /* 0x90 */
+ 0, 0, 0xB2DC, 0xD6F5, 0xD6F3, 0xD6F4, 0xB2DB, 0, /* 0x90 */
+ 0xDB42, 0xDB43, 0xDB41, 0, 0xB873, 0xDF6D, 0xDF6C, 0xDF6E, /* 0xA0 */
+ 0xB872, 0xB871, 0, 0, 0xE6F2, 0xE6F4, 0, 0xBD7E, /* 0xA0 */
+ 0xE6F3, 0xEAE3, 0xBFAA, 0xF079, 0, 0xF078, 0xC3BB, 0xF2BD, /* 0xB0 */
+ 0xC3BD, 0xC3BC, 0xF4B0, 0xF5EE, 0xC4F3, 0xA6D0, 0xD050, 0xACFD, /* 0xB0 */
+ 0xD365, 0xAFCE, 0xD364, 0xD363, 0, 0xAFCD, 0, 0xD6FB, /* 0xC0 */
+ 0, 0xD6FD, 0xD6F6, 0xD6F7, 0xB2DD, 0xD6F8, 0xB2DE, 0xD6FC, /* 0xC0 */
+ 0xD6F9, 0xD6FA, 0xB2DF, 0, 0xB5BE, 0xB5BF, 0, 0xDB44, /* 0xD0 */
+ 0, 0, 0, 0xDF6F, 0xDF70, 0, 0xE37E, 0xBB43, /* 0xD0 */
+ 0xBB41, 0xBB42, 0xE37B, 0xE37C, 0, 0xE37D, 0xE6F9, 0, /* 0xE0 */
+ 0xE6FA, 0xBDA1, 0xE6F7, 0xE6F6, 0xE6F8, 0xE6F5, 0xBFAD, 0xEAE4, /* 0xE0 */
+ 0xBFAB, 0xBFAC, 0xEDE6, 0xC16B, 0xEDE5, 0xEFA8, 0, 0xF07A, /* 0xF0 */
+ 0xF07B, 0xC2BC, 0, 0xC2BD, 0xC16C, 0xF2BE, 0xF2BF, 0xF4B1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_80[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC4A3, 0xA6D1, 0, 0xA6D2, 0xACFE, 0xAACC, 0xAFCF, 0xD051, /* 0x00 */
+ 0, 0, 0, 0xB5C0, 0xA6D3, 0xAD41, 0xD052, 0xD053, /* 0x00 */
+ 0xAD40, 0xAD42, 0xA6D4, 0, 0xD054, 0xAFD1, 0xD366, 0xAFD3, /* 0x10 */
+ 0xAFD0, 0xAFD2, 0, 0xD741, 0xB2E0, 0, 0xD740, 0xD6FE, /* 0x10 */
+ 0, 0xDF71, 0, 0, 0xE3A1, 0, 0xBDA2, 0, /* 0x20 */
+ 0xBFAE, 0xEAE6, 0xEAE5, 0, 0xEDE7, 0, 0, 0, /* 0x20 */
+ 0xF5EF, 0, 0, 0xA6D5, 0xCB73, 0xCDAA, 0xAD43, 0xD055, /* 0x30 */
+ 0, 0xD368, 0, 0, 0, 0xAFD4, 0xD367, 0xAFD5, /* 0x30 */
+ 0, 0, 0, 0xD743, 0, 0, 0xB2E2, 0xD742, /* 0x40 */
+ 0xD744, 0, 0xB2E1, 0, 0, 0, 0, 0xDB46, /* 0x40 */
+ 0xDB47, 0xDB45, 0xB5C1, 0, 0, 0, 0xB874, 0, /* 0x50 */
+ 0xB875, 0, 0xBB45, 0, 0xE3A3, 0xE3A2, 0xBB44, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xE6FB, 0, 0, 0xE6FC, /* 0x60 */
+ 0, 0, 0, 0, 0xEAE7, 0, 0, 0xC170, /* 0x60 */
+ 0xC16F, 0xC16D, 0xC16E, 0xC171, 0, 0xF07C, 0xC2BF, 0xC2BE, /* 0x70 */
+ 0xF2C0, 0xF4B2, 0, 0, 0, 0xC5A5, 0xC5A4, 0xA6D6, /* 0x70 */
+ 0, 0, 0xD1FB, 0, 0xB877, 0xB5C2, 0xB876, 0xBB46, /* 0x80 */
+ 0, 0xA6D7, 0xC9A9, 0xA6D8, 0xA6D9, 0, 0, 0xCDAB, /* 0x80 */
+ 0xCB76, 0, 0xCB77, 0xA877, 0, 0xCB74, 0xA876, 0, /* 0x90 */
+ 0xA879, 0xCB75, 0xA87B, 0xA87A, 0xCB78, 0xA878, 0, 0, /* 0x90 */
+ 0, 0xAAD1, 0xAACF, 0xCDAD, 0, 0xAACE, 0, 0, /* 0xA0 */
+ 0, 0xAAD3, 0xAAD5, 0xAAD2, 0, 0xCDB0, 0xCDAC, 0xAAD6, /* 0xA0 */
+ 0, 0xAAD0, 0xA87C, 0, 0xAAD4, 0xCDAF, 0, 0, /* 0xB0 */
+ 0xCDAE, 0, 0xAACD, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xD05B, 0xAD47, 0xAD48, 0xD05D, 0, 0xD057, /* 0xC0 */
+ 0xD05A, 0xD063, 0xD061, 0, 0xAD49, 0xD067, 0xAD4C, 0xD064, /* 0xC0 */
+ 0xD05C, 0xD059, 0, 0, 0xDB49, 0xD062, 0xAD44, 0xD065, /* 0xD0 */
+ 0xD056, 0xD05F, 0xAD46, 0xAD4B, 0xD060, 0xAD4F, 0xAD4D, 0, /* 0xD0 */
+ 0xD058, 0xAD4A, 0, 0xD05E, 0xAD4E, 0xAD45, 0xD066, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xAFDA, 0, 0xAFE3, /* 0xE0 */
+ 0xAFD8, 0xAFD6, 0xD36A, 0xAFDE, 0xAFDB, 0xD36C, 0, 0, /* 0xF0 */
+ 0xAFDD, 0xD36B, 0xD369, 0xD36E, 0xAFE2, 0xAFE0, 0xDB48 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_81[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD36F, 0xD36D, 0xAFD7, 0, 0, 0xAFD9, 0xAFDC, 0, /* 0x00 */
+ 0xAFDF, 0, 0xAFE1, 0, 0, 0, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0xD74E, 0xB2E4, 0, /* 0x10 */
+ 0xD745, 0xD747, 0, 0xD748, 0, 0xD750, 0xD74C, 0xD74A, /* 0x10 */
+ 0, 0xD74D, 0xD751, 0xB2E5, 0xB2E9, 0xD746, 0, 0xD74F, /* 0x20 */
+ 0, 0xB2E7, 0, 0xB2E6, 0xD74B, 0xD749, 0, 0xB2E3, /* 0x20 */
+ 0xB2E8, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xB5C8, 0xDB51, 0, 0, 0xDB4F, 0xB5CA, 0, /* 0x30 */
+ 0, 0, 0, 0xDB4A, 0xDFA1, 0, 0xB5C9, 0xDB4E, /* 0x40 */
+ 0, 0, 0xDB4B, 0xB5C5, 0xB5CB, 0xDB50, 0xB5C7, 0xDB4D, /* 0x40 */
+ 0xBB47, 0xB5C6, 0xDB4C, 0xB5CC, 0xB5C4, 0xB5C3, 0, 0, /* 0x50 */
+ 0, 0, 0, 0xDF77, 0xDF75, 0, 0xDF7B, 0, /* 0x50 */
+ 0xDF73, 0xDFA2, 0xDF78, 0, 0xDF72, 0xB87B, 0xB8A3, 0xDF7D, /* 0x60 */
+ 0, 0xDF76, 0, 0xB87E, 0, 0, 0xB87C, 0xDF7E, /* 0x60 */
+ 0xB879, 0xB878, 0xDF79, 0xB87D, 0xB5CD, 0, 0xDF7C, 0xDF74, /* 0x70 */
+ 0xB87A, 0xB8A1, 0xB8A2, 0, 0, 0, 0, 0xBB4C, /* 0x70 */
+ 0xBB48, 0, 0xBB4D, 0xE3A6, 0, 0, 0xE3A5, 0xE3A7, /* 0x80 */
+ 0xBB4A, 0xE3A4, 0xBB4B, 0xE3AA, 0xE3A9, 0xE3A8, 0, 0xBB49, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xE741, 0, 0xE744, /* 0x90 */
+ 0xBDA8, 0xE743, 0xBDA7, 0xBDA3, 0xBDA4, 0xBDA5, 0xE740, 0xE6FE, /* 0x90 */
+ 0xBDA6, 0, 0xE742, 0xE6FD, 0, 0, 0xEAE9, 0xEAF3, /* 0xA0 */
+ 0xBFB1, 0xBFB0, 0, 0xEAED, 0xEAEF, 0, 0xEAEA, 0, /* 0xA0 */
+ 0xEAEE, 0xEAE8, 0xEAF1, 0xBFAF, 0xEAF0, 0xEAEC, 0, 0xEAF2, /* 0xB0 */
+ 0, 0xEAEB, 0xC174, 0xEDE8, 0xEDEE, 0xC178, 0xC17A, 0xC177, /* 0xB0 */
+ 0xC176, 0, 0xC175, 0xC173, 0xEDE9, 0xEDEC, 0xC172, 0xEDED, /* 0xC0 */
+ 0, 0xC179, 0xEDEB, 0, 0xEDEA, 0xC2C0, 0, 0xC2C1, /* 0xC0 */
+ 0xF0A1, 0xF07D, 0xF07E, 0, 0, 0xF2C2, 0, 0xF2C1, /* 0xD0 */
+ 0xC3BE, 0xF4B4, 0xC4A4, 0xF4B3, 0, 0xF5F0, 0xF745, 0xC5A6, /* 0xD0 */
+ 0xF943, 0xF944, 0xC5D8, 0xA6DA, 0, 0xAAD7, 0xDB52, 0xBB4E, /* 0xE0 */
+ 0xC17B, 0xEDEF, 0xA6DB, 0, 0xAFE5, 0xAFE4, 0xDB53, 0, /* 0xE0 */
+ 0, 0, 0xEAF4, 0xA6DC, 0xAD50, 0, 0, 0xDB54, /* 0xF0 */
+ 0xDB55, 0xDB56, 0xBB4F, 0xBFB2, 0xA6DD, 0, 0xAAD8, 0xD068 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_82[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAFE6, 0xD370, 0xB2EA, 0, 0xDB57, 0xB8A4, 0, 0xBB50, /* 0x00 */
+ 0xBFB3, 0xC17C, 0xC2C2, 0xF4B5, 0xA6DE, 0xAAD9, 0, 0, /* 0x00 */
+ 0xAFE7, 0xD752, 0xB5CE, 0, 0xBB51, 0xE3AB, 0xE745, 0, /* 0x10 */
+ 0, 0, 0, 0xA6DF, 0xB5CF, 0xDFA3, 0xBB52, 0xA6E0, /* 0x10 */
+ 0xCDB1, 0xD069, 0xAD51, 0, 0, 0xD372, 0, 0, /* 0x20 */
+ 0xAFEA, 0, 0xAFE8, 0xAFE9, 0xAFEB, 0, 0, 0xD371, /* 0x20 */
+ 0, 0, 0xD757, 0xD754, 0xD756, 0xB2EB, 0xB2ED, 0xB2EC, /* 0x30 */
+ 0xD753, 0xB2EE, 0xD755, 0, 0xDB58, 0xDB59, 0, 0xDB5A, /* 0x30 */
+ 0xDFA6, 0, 0xDFA7, 0, 0xDFA5, 0xDFA8, 0, 0xB8A5, /* 0x40 */
+ 0, 0xDFA4, 0, 0xBB53, 0, 0, 0xE74A, 0xE746, /* 0x40 */
+ 0xE749, 0xE74B, 0xE748, 0xE747, 0, 0xEAF5, 0xEAF6, 0xEAF7, /* 0x50 */
+ 0xBFB4, 0xBFB5, 0xEDF1, 0xEDF0, 0xEDF2, 0, 0xF0A3, 0xF0A2, /* 0x50 */
+ 0, 0xF2C4, 0, 0xF2C5, 0xF2C3, 0, 0xC4A5, 0, /* 0x60 */
+ 0xF4B6, 0xF4B7, 0, 0xF746, 0xF7EF, 0xF8BB, 0xA6E1, 0xA87D, /* 0x60 */
+ 0, 0xC17D, 0xA6E2, 0, 0xD758, 0xDB5B, 0, 0xC641, /* 0x70 */
+ 0xCA4A, 0, 0, 0, 0xCA4B, 0xCA4D, 0xA6E3, 0xCA4E, /* 0x70 */
+ 0xCA4C, 0, 0, 0xCBA2, 0xCBA3, 0xCB7B, 0, 0, /* 0x80 */
+ 0, 0, 0xCBA1, 0xA8A1, 0, 0xA8A2, 0xCB7C, 0xCB7A, /* 0x80 */
+ 0xCB79, 0xCB7D, 0xA87E, 0xCB7E, 0xD06A, 0, 0, 0, /* 0x90 */
+ 0xCDB6, 0xAADC, 0xCDB5, 0xCDB7, 0, 0xAADB, 0xCDBC, 0xAADF, /* 0x90 */
+ 0xCDB2, 0xCDC0, 0xCDC6, 0xAAE6, 0xCDC3, 0xAAE3, 0, 0xCDB9, /* 0xA0 */
+ 0xCDBF, 0xCDC1, 0, 0xCDB4, 0xAAE2, 0xAADD, 0xCDBA, 0xAAE4, /* 0xA0 */
+ 0xAAE7, 0xAAE1, 0, 0xAADA, 0xCDBE, 0xCDB8, 0xCDC5, 0xAAE9, /* 0xB0 */
+ 0xAAE5, 0xAAE0, 0xCDBD, 0xAFEC, 0xCDBB, 0xAADE, 0xAAE8, 0, /* 0xB0 */
+ 0xCDB3, 0, 0xCDC2, 0xCDC4, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xAD62, 0xAD5C, 0xAD64, 0xAD61, 0xD071, 0xD074, 0xAD5D, /* 0xD0 */
+ 0, 0xD06B, 0, 0xAD56, 0xAD60, 0, 0xAD63, 0xAD65, /* 0xD0 */
+ 0xD0A2, 0xD077, 0, 0xAD55, 0xD0A1, 0xAD59, 0xAD57, 0xAD52, /* 0xE0 */
+ 0xD06F, 0, 0xD07E, 0xD073, 0xD076, 0xD0A5, 0, 0xAD66, /* 0xE0 */
+ 0xD07D, 0xAD5E, 0xD078, 0xD0A4, 0xD075, 0xD079, 0xD07C, 0, /* 0xF0 */
+ 0, 0xD06D, 0xD0A3, 0xD07B, 0, 0, 0xD06C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_83[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xD070, 0xAD5F, 0xAD5A, 0xAD53, 0xAD58, 0xAD54, 0xAD67, 0xD06E, /* 0x00 */
+ 0xD3A5, 0xAD5B, 0, 0, 0xD07A, 0xCE41, 0, 0, /* 0x00 */
+ 0, 0, 0, 0, 0, 0, 0xD3A8, 0xAFFA, /* 0x10 */
+ 0, 0xD376, 0, 0xD3A3, 0xD37D, 0, 0xD3B2, 0, /* 0x10 */
+ 0xD3AA, 0, 0xD37E, 0, 0xD3A9, 0xD378, 0xD37C, 0xD3B5, /* 0x20 */
+ 0xAFFD, 0xD3AD, 0xD3A4, 0xAFED, 0xD3B3, 0xD374, 0, 0xD3AC, /* 0x20 */
+ 0, 0xAFFC, 0xAFF7, 0xD373, 0xAFF5, 0xAFF4, 0xAFF9, 0xD3AB, /* 0x30 */
+ 0xAFF1, 0xAFF8, 0xD072, 0xDB5C, 0xD3A6, 0, 0, 0xD37A, /* 0x30 */
+ 0xAFFB, 0xD37B, 0xD3A1, 0xAFFE, 0xD375, 0xD3AF, 0, 0xD3AE, /* 0x40 */
+ 0xD3B6, 0xAFF3, 0xAFF0, 0xD3B4, 0xD3B0, 0xD3A7, 0xD3A2, 0xAFF6, /* 0x40 */
+ 0xAFF2, 0xD377, 0xAFEE, 0xD3B1, 0xAFEF, 0, 0xD379, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0xD75E, 0xD760, 0xD765, 0xD779, 0xB2FC, /* 0x70 */
+ 0xB2F2, 0, 0xD75D, 0xB2FD, 0xB2FE, 0xD768, 0xD76F, 0xD775, /* 0x70 */
+ 0, 0xD762, 0, 0xD769, 0, 0, 0xB340, 0xD777, /* 0x80 */
+ 0xD772, 0xB2FA, 0xB2F8, 0xD76E, 0xD76A, 0xD75C, 0xB2EF, 0xD761, /* 0x80 */
+ 0xD759, 0, 0xB2F7, 0xB2F9, 0xD766, 0xD763, 0xB2F4, 0xD773, /* 0x90 */
+ 0xB2F1, 0xD764, 0xD77A, 0xD76C, 0, 0xD76B, 0xB2F0, 0, /* 0x90 */
+ 0xB2FB, 0, 0xB2F3, 0xD75A, 0xD75F, 0xD770, 0xD776, 0xB341, /* 0xA0 */
+ 0xD75B, 0xD767, 0xD76D, 0xB2F6, 0, 0, 0xD778, 0xD771, /* 0xA0 */
+ 0xD774, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0xB2F5, 0, 0xDB6C, /* 0xB0 */
+ 0xDB60, 0xB5D7, 0xDB7D, 0xDBA7, 0xDBAA, 0xB5D5, 0xDB68, 0xDBA3, /* 0xC0 */
+ 0xDB69, 0xDB77, 0xB5E2, 0xDB73, 0xB5DF, 0, 0xDB74, 0xDB5D, /* 0xC0 */
+ 0, 0xDBA4, 0, 0, 0xB5E8, 0xDBA1, 0xDB75, 0xDBAC, /* 0xD0 */
+ 0xDB70, 0xDFC8, 0, 0xDBAF, 0xB5E6, 0xDB6E, 0xDB7A, 0xB5E9, /* 0xD0 */
+ 0xB5D4, 0xDB72, 0xDBAD, 0xDB6B, 0xDB64, 0xDB6F, 0, 0xDB63, /* 0xE0 */
+ 0xDB61, 0xB5D0, 0xDBA5, 0xDB6A, 0xDBA8, 0, 0xDBA9, 0xB5D8, /* 0xE0 */
+ 0xB5DD, 0xB5D9, 0xB5E1, 0xDB7E, 0xB5DA, 0xDB76, 0xDB66, 0, /* 0xF0 */
+ 0xB5D2, 0xDB5E, 0xDBA2, 0xDBAB, 0xDB65, 0xB5E0, 0xDBB0, 0xDB71 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_84[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDB6D, 0, 0xB5D1, 0xB5E5, 0, 0xDB7C, 0xB5E7, /* 0x00 */
+ 0, 0xDB78, 0xB5DC, 0xB5D6, 0xB5DE, 0xB5D3, 0xB5E4, 0xDB79, /* 0x00 */
+ 0xDB67, 0xDB7B, 0xDB62, 0xDBA6, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xDBAE, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0xDB5F, 0, 0, 0, 0, /* 0x20 */
+ 0, 0xDFC7, 0, 0xDFDD, 0xB855, 0xDFCC, 0, 0xDFCA, /* 0x20 */
+ 0xDFB5, 0xB8A9, 0xDFC5, 0xDFD9, 0xDFC1, 0xB8B1, 0xDFD8, 0xDFBF, /* 0x30 */
+ 0xB5E3, 0xDFCF, 0xDFC0, 0xDFD6, 0xB8B0, 0xB8A8, 0, 0xDFAA, /* 0x30 */
+ 0xDFB2, 0, 0xDFCB, 0xDFC3, 0xDFDC, 0xDFC6, 0xB8B6, 0xDFD7, /* 0x40 */
+ 0, 0xB8AD, 0, 0xDFC9, 0xDFD1, 0xDFB6, 0xDFD0, 0, /* 0x40 */
+ 0xDFE1, 0xDFB1, 0xDFD2, 0, 0xDFDF, 0, 0xDFAB, 0xB5DB, /* 0x50 */
+ 0, 0xDFB9, 0xDFB8, 0xB8AF, 0, 0xDFBC, 0xDFBE, 0xDFCD, /* 0x50 */
+ 0xDFDE, 0xB8B2, 0, 0xB8B3, 0, 0xDFB0, 0xB8AB, 0xDFB4, /* 0x60 */
+ 0xDFDA, 0xB8B4, 0, 0xB8AC, 0xB8AE, 0xB8B5, 0xDFE0, 0xDFD3, /* 0x60 */
+ 0xDFCE, 0, 0, 0xDFBB, 0xDFBA, 0xB8AA, 0xDFAC, 0xB8A7, /* 0x70 */
+ 0xDFC4, 0xDFAD, 0xDFC2, 0, 0, 0xDFB7, 0xDFDB, 0, /* 0x70 */
+ 0, 0, 0xB8A6, 0, 0, 0, 0xDFB3, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xDFAF, 0xDFD5, 0xDFAE, /* 0x80 */
+ 0xBB60, 0xE3D3, 0, 0, 0xE3C2, 0, 0, 0xE3AC, /* 0x90 */
+ 0xE3CA, 0xBB58, 0xE3BB, 0xE3C5, 0xBB5B, 0xE3BE, 0xBB59, 0xE3AF, /* 0x90 */
+ 0xE3CD, 0xE3AE, 0xE3C1, 0, 0xE3AD, 0, 0, 0xE3BF, /* 0xA0 */
+ 0xE3C8, 0xE3C6, 0xE3BA, 0xE3B5, 0xE3B3, 0, 0xE3B4, 0xE3C7, /* 0xA0 */
+ 0xE3D2, 0xE3BC, 0xBB5A, 0, 0xE3B7, 0, 0xE3CB, 0, /* 0xB0 */
+ 0xBB5D, 0xE3B6, 0xE3B0, 0xE3C0, 0xBB61, 0, 0, 0xBB55, /* 0xB0 */
+ 0xBB5E, 0xE3B8, 0xE3B2, 0, 0xBB57, 0xDFD4, 0xBB56, 0xE3C3, /* 0xC0 */
+ 0, 0xBB54, 0xBB63, 0xBB5C, 0xE3C4, 0xE3B9, 0xE3B1, 0xE3CC, /* 0xC0 */
+ 0xE3BD, 0xBB62, 0xE3D0, 0xBB5F, 0xE3CF, 0, 0xE3C9, 0xE3CE, /* 0xD0 */
+ 0, 0, 0, 0xE3D1, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xE773, /* 0xE0 */
+ 0xE774, 0xE767, 0xE766, 0xE762, 0xBDB4, 0, 0xBDAC, 0xE776, /* 0xE0 */
+ 0xE775, 0xDFA9, 0xE75F, 0xE763, 0xE75D, 0, 0xE770, 0xE761, /* 0xF0 */
+ 0, 0xE777, 0xE75A, 0xE758, 0xE764, 0xE76E, 0xE769, 0xBDB6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_85[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE74F, 0, 0xE76D, 0, 0, 0, 0xBDB7, 0xDFBD, /* 0x00 */
+ 0xE75B, 0xE752, 0xE755, 0xE77B, 0xE75C, 0xE753, 0xE751, 0xE74E, /* 0x00 */
+ 0, 0xBDB0, 0xE765, 0xBDAF, 0xBDB3, 0xE760, 0xE768, 0xBDA9, /* 0x10 */
+ 0xE778, 0xE77C, 0xBDAB, 0, 0xE757, 0xE76B, 0xE76F, 0xE754, /* 0x10 */
+ 0xE779, 0xBDB2, 0, 0xBDB1, 0xE74C, 0xBDB5, 0xE772, 0xE756, /* 0x20 */
+ 0xE76A, 0xE750, 0xE75E, 0xE759, 0xBDAD, 0xBDAE, 0xE76C, 0xE77D, /* 0x20 */
+ 0xE77A, 0xE771, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0xE74D, 0, 0xBDAA, 0xEB49, 0, /* 0x30 */
+ 0xEB40, 0xEB43, 0, 0xBFBB, 0xEB45, 0xEAF9, 0xEB41, 0xEB47, /* 0x40 */
+ 0xBFB8, 0xBFBC, 0xBFB6, 0, 0, 0xEAFB, 0xEB4C, 0, /* 0x40 */
+ 0, 0xEB46, 0, 0xEAFC, 0xEB55, 0xEB4F, 0xEAF8, 0xEE46, /* 0x50 */
+ 0xEAFE, 0xBFB7, 0, 0xEB4A, 0, 0xEB54, 0xBFBF, 0, /* 0x50 */
+ 0xEB51, 0xEAFD, 0xEB44, 0xEB48, 0xEB42, 0xEB56, 0xEB53, 0xEB50, /* 0x60 */
+ 0xBFB9, 0xBFBA, 0xBFBE, 0xEAFA, 0xEB57, 0xBFBD, 0xEB4D, 0, /* 0x60 */
+ 0, 0xEB4B, 0, 0, 0, 0xEB4E, 0xEE53, 0xEE40, /* 0x70 */
+ 0xEE45, 0xEE52, 0xEE44, 0xEDFB, 0xEE41, 0, 0xC1A2, 0, /* 0x70 */
+ 0xEDF4, 0xEE4D, 0xEE4F, 0xEDF3, 0xC1A1, 0xEE51, 0xEE49, 0xC1A8, /* 0x80 */
+ 0xEE50, 0xEE42, 0xC1AA, 0xEDF9, 0xEB52, 0xEE4A, 0xEE47, 0xEDF5, /* 0x80 */
+ 0xEE55, 0xC1A4, 0, 0, 0xC1A5, 0xEDF7, 0xEE48, 0, /* 0x90 */
+ 0xEE54, 0xEE4B, 0xEDFD, 0xC1A7, 0xC1A3, 0xEE4C, 0xEDFE, 0xEE56, /* 0x90 */
+ 0xEDF8, 0xEE43, 0xEE4E, 0xEDFA, 0xEDFC, 0, 0xC2CB, 0xEDF6, /* 0xA0 */
+ 0xC1A9, 0xC2C4, 0xC17E, 0, 0, 0, 0, 0xC1A6, /* 0xA0 */
+ 0xC2C8, 0xF0B3, 0, 0xF0A9, 0xF0A4, 0xF0AA, 0xF0B4, 0xF0B8, /* 0xB0 */
+ 0xF0B7, 0xC2CA, 0xC2C9, 0, 0, 0xF0AB, 0xF0B9, 0xF0AE, /* 0xB0 */
+ 0xF0A6, 0, 0xF0A8, 0xF0A7, 0xF0AD, 0xF0B2, 0xF0A5, 0xF0AC, /* 0xC0 */
+ 0xF0B1, 0xC2C7, 0, 0xF0AF, 0, 0xC2C5, 0xF0B0, 0xC2C3, /* 0xC0 */
+ 0xC2C6, 0xF2D5, 0xF0B5, 0, 0, 0xC3C2, 0, 0xF2CD, /* 0xD0 */
+ 0xF2D1, 0xF2C9, 0xF2CC, 0, 0xF2D4, 0xC3C0, 0xF2D9, 0xF2D2, /* 0xD0 */
+ 0, 0xF2CA, 0xF2DA, 0xF2D3, 0xC3C3, 0xC3C4, 0xF2D7, 0, /* 0xE0 */
+ 0xF2CB, 0xC3BF, 0xC3C1, 0xF2C6, 0xF2CE, 0xF2C8, 0, 0xF2D8, /* 0xE0 */
+ 0xF2D6, 0xF2C7, 0xF2CF, 0, 0, 0, 0xF4BE, 0xC3C5, /* 0xF0 */
+ 0xF2D0, 0xC4A7, 0xC4A9, 0xC4A6, 0, 0xF4C3, 0xF4BB, 0xF4B9 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_86[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF4BD, 0xF4BA, 0, 0, 0xF4BF, 0xF4C1, 0xC4AA, 0xC4AC, /* 0x00 */
+ 0, 0xF4C0, 0xC4AD, 0xC4AB, 0xF4C2, 0, 0, 0, /* 0x00 */
+ 0, 0xC4A8, 0, 0, 0, 0, 0, 0xC4F4, /* 0x10 */
+ 0xF5F1, 0xF5F7, 0xC4F6, 0xF4BC, 0xF5F6, 0, 0xF5FD, 0xF5F4, /* 0x10 */
+ 0xF5FB, 0xF5FA, 0xF4B8, 0xF5F5, 0xF0B6, 0xF5FE, 0xF5F3, 0xF5F8, /* 0x20 */
+ 0, 0xF5FC, 0xF5F2, 0, 0xF74A, 0xC4F5, 0xF5F9, 0, /* 0x20 */
+ 0, 0xF7F4, 0xF74B, 0xF749, 0xF747, 0xF748, 0xF74C, 0, /* 0x30 */
+ 0xC5D9, 0xF7F2, 0xF7F0, 0xF7F5, 0xF7F3, 0, 0xF7F6, 0xC5DA, /* 0x30 */
+ 0xF7F1, 0, 0, 0xF8BC, 0, 0, 0xF945, 0xF946, /* 0x40 */
+ 0xF947, 0, 0, 0xF9C7, 0xF9BD, 0xCA4F, 0xAAEA, 0, /* 0x40 */
+ 0xAD68, 0, 0xD3B8, 0xD3B7, 0xB040, 0xB342, 0xD77C, 0, /* 0x50 */
+ 0, 0xD77B, 0, 0xB5EA, 0xB8B8, 0, 0xB8B7, 0xB8B9, /* 0x50 */
+ 0, 0xE3D4, 0xE77E, 0xEB58, 0xEB5A, 0xEB59, 0, 0xC1AB, /* 0x60 */
+ 0xEE57, 0xF0BA, 0xF9A5, 0xA6E4, 0, 0xCDC9, 0xCDCA, 0xCDC8, /* 0x60 */
+ 0xCDC7, 0xAAEB, 0, 0xD0A9, 0xD0A7, 0, 0, 0xD0A6, /* 0x70 */
+ 0, 0xAD69, 0xAD6B, 0xAD6A, 0xD0A8, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0xD3C4, 0xD3C1, 0xD3BF, /* 0x80 */
+ 0, 0, 0xB041, 0xD3C2, 0xB046, 0xD3BC, 0xD3CB, 0, /* 0x80 */
+ 0xD3CD, 0xD3BD, 0, 0xB043, 0xD3CE, 0xD3C9, 0xD3BB, 0xD3C0, /* 0x90 */
+ 0xD3CA, 0xD3C6, 0xD3C3, 0, 0xB048, 0xD3CC, 0xD3BE, 0, /* 0x90 */
+ 0, 0xD3C7, 0xD3B9, 0xB047, 0xB044, 0xD3C5, 0, 0xD3C8, /* 0xA0 */
+ 0xD3BA, 0xB045, 0xB042, 0, 0, 0, 0, 0xB34C, /* 0xA0 */
+ 0xD7A5, 0xB34B, 0, 0xD7A8, 0xD7AB, 0xB348, 0xB346, 0xD77E, /* 0xB0 */
+ 0xD7A9, 0xD7A7, 0xD7A4, 0xD7AC, 0xD7AD, 0xD7AF, 0xD7B0, 0xD77D, /* 0xB0 */
+ 0xB345, 0xD7A2, 0xD7A1, 0xD7AE, 0xB347, 0xD7A3, 0xB349, 0xB344, /* 0xC0 */
+ 0xD7A6, 0xB34D, 0, 0xB34A, 0xD7AA, 0, 0, 0, /* 0xC0 */
+ 0xB5F1, 0xDBBF, 0, 0xDBB4, 0xB5EE, 0, 0xDFE7, 0xDBBD, /* 0xD0 */
+ 0xDBB1, 0xB5EC, 0xDBB6, 0xB5EF, 0xDBBA, 0xDBB8, 0xB5F2, 0xB5EB, /* 0xD0 */
+ 0, 0, 0xDBB2, 0xDBB5, 0xB5F0, 0, 0xDBB3, 0, /* 0xE0 */
+ 0xDBBE, 0xDBBC, 0xDBB7, 0xDBB9, 0xDBBB, 0xB5ED, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xDFE8, 0xDFEE, 0xDFE4, /* 0xF0 */
+ 0xDFEA, 0xB8BA, 0xDFE6, 0xB8C0, 0, 0, 0xB8BF /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_87[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB8BE, 0xDFED, 0xB8C1, 0xB8C2, 0xDFE3, 0xDFF0, 0xB8C3, 0xB8BD, /* 0x00 */
+ 0xB8BC, 0xDFEC, 0xB8C4, 0xDFE2, 0xDFE5, 0xDFEF, 0xDFEB, 0, /* 0x00 */
+ 0, 0xE3F4, 0xE3E9, 0xB8BB, 0, 0, 0, 0, /* 0x10 */
+ 0xBB6A, 0xE3DD, 0xE3F2, 0xE3DE, 0xBB65, 0, 0xE3DB, 0, /* 0x10 */
+ 0xE3E4, 0xE3DC, 0xBB67, 0xE3D6, 0xE3F1, 0xBB68, 0xE3EE, 0xE3EF, /* 0x20 */
+ 0xE3D7, 0xBB6D, 0xE3E6, 0, 0xE3E0, 0xE3E7, 0xE3DA, 0, /* 0x20 */
+ 0xE3F3, 0xE3EB, 0xE3E5, 0xE3D5, 0xBB69, 0xE3EC, 0, 0xBB6C, /* 0x30 */
+ 0xE3F0, 0, 0xE3EA, 0xBB66, 0xE3E8, 0, 0xE3E2, 0xBB64, /* 0x30 */
+ 0xE3D9, 0xE3E1, 0xE3ED, 0xE3DF, 0, 0, 0xE3E3, 0, /* 0x40 */
+ 0, 0, 0, 0, 0xBDC1, 0xDFE9, 0xE7B2, 0xE7BB, /* 0x40 */
+ 0xE7B1, 0xE7AD, 0xE7AA, 0xBDC2, 0xE7A8, 0xBB6B, 0xE7A1, 0xBDC0, /* 0x50 */
+ 0xE7A7, 0xBDBF, 0xE7AC, 0xE7A9, 0xE7B9, 0xE7B4, 0xE7AE, 0xE7B3, /* 0x50 */
+ 0xBDBB, 0xE7AB, 0xE7BE, 0xE7A2, 0xE7A3, 0xE7BA, 0xBDBC, 0xE7BF, /* 0x60 */
+ 0xBDBE, 0xE7C0, 0xE7B0, 0xE3D8, 0xE7B6, 0xE7AF, 0xE7B8, 0xE7B5, /* 0x60 */
+ 0, 0, 0, 0xE7A6, 0xBDB9, 0xE7BD, 0xBDBA, 0xE7A4, /* 0x70 */
+ 0xBDBD, 0xEB64, 0xE7B7, 0xE7BC, 0, 0, 0, 0, /* 0x70 */
+ 0, 0xEB61, 0xBDB8, 0xBFC0, 0xEB6B, 0xEB67, 0, 0xEB65, /* 0x80 */
+ 0xEB60, 0xEB6F, 0, 0, 0, 0xBFC4, 0, 0xEB5C, /* 0x80 */
+ 0xEB68, 0xEB69, 0xEB5F, 0xEB5E, 0xEB6C, 0, 0xEB62, 0xEB5D, /* 0x90 */
+ 0xEB63, 0, 0xEB6E, 0xEB5B, 0xEB6D, 0xEB6A, 0xBFC2, 0xBFC1, /* 0x90 */
+ 0, 0, 0xBFC3, 0xEB66, 0xF0CB, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xEE59, 0xC1B1, 0xEE5D, 0xEE5A, 0xEE61, 0xEE67, /* 0xA0 */
+ 0xEE5C, 0, 0xEE70, 0xC1AE, 0xEE6A, 0xEE5F, 0xEE6B, 0xEE66, /* 0xB0 */
+ 0xEE6D, 0xEE5E, 0xC1B3, 0xC1B2, 0xEE60, 0xEE6E, 0xEE58, 0xEE6C, /* 0xB0 */
+ 0xC1AC, 0, 0xEE64, 0xEE63, 0xEE68, 0xEE5B, 0xC1B0, 0, /* 0xC0 */
+ 0xC1B4, 0xEE62, 0xEE69, 0xC1B5, 0xEE65, 0, 0, 0, /* 0xC0 */
+ 0, 0xC1AD, 0xC1AF, 0xF0C7, 0xF0C5, 0, 0, 0xF0CC, /* 0xD0 */
+ 0xF0C9, 0xF0CD, 0, 0xF0BE, 0xF0C6, 0xF0D1, 0xEE6F, 0xF0C2, /* 0xD0 */
+ 0xC2CF, 0xE7A5, 0xF0BD, 0xF0CA, 0xF0C4, 0xF0C1, 0xF0BC, 0xF0BB, /* 0xE0 */
+ 0xF0D0, 0, 0xF0C0, 0xF0BF, 0xC2CD, 0xF0C8, 0, 0xC2CC, /* 0xE0 */
+ 0, 0, 0xC2CE, 0xF0C3, 0xF0CF, 0, 0xF2DE, 0xF2DF, /* 0xF0 */
+ 0, 0xC3C9, 0xF2DC, 0xC3C6, 0xF2E4, 0, 0xC3CA, 0xF2E6 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_88[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF2DB, 0xF0CE, 0xF2E8, 0xF2DD, 0, 0xC3C7, 0xF2E3, 0, /* 0x00 */
+ 0xF2E5, 0xF2E0, 0xF2E7, 0xF2E2, 0xF2E1, 0xC3C8, 0, 0, /* 0x00 */
+ 0xF4C5, 0xF4C6, 0, 0xF4C8, 0xC4AE, 0xC4AF, 0xF4C9, 0xF4C7, /* 0x10 */
+ 0, 0xF4C4, 0, 0xF642, 0xF645, 0xF641, 0, 0xC4FA, /* 0x10 */
+ 0xF643, 0xC4F9, 0xC4F8, 0xC4F7, 0xF644, 0xF751, 0xF74F, 0, /* 0x20 */
+ 0xF74E, 0xF640, 0xF750, 0xF646, 0xF74D, 0, 0xF7F9, 0xF7D7, /* 0x20 */
+ 0xF7F7, 0xC5DB, 0xF7F8, 0xF7FA, 0, 0xF8BF, 0xC5FA, 0xF8BE, /* 0x30 */
+ 0xF8BD, 0xC5FB, 0, 0xC65A, 0xF96E, 0xF9A7, 0xF9A6, 0xF9A8, /* 0x30 */
+ 0xA6E5, 0xD0AA, 0, 0xD3CF, 0xD3D0, 0, 0, 0, /* 0x40 */
+ 0xDBC0, 0, 0xF647, 0xF8C0, 0xA6E6, 0xAD6C, 0xD0AB, 0, /* 0x40 */
+ 0, 0, 0xD7B1, 0xB34E, 0, 0xDBC2, 0xDBC1, 0xB5F3, /* 0x50 */
+ 0, 0xB8C5, 0xE7C1, 0xBDC3, 0, 0xBDC4, 0, 0, /* 0x50 */
+ 0, 0xBFC5, 0xC5FC, 0xA6E7, 0, 0, 0, 0xD0AC, /* 0x60 */
+ 0xAAED, 0xD0AE, 0xD0AD, 0xAD6D, 0, 0xD3D1, 0, 0xD3D8, /* 0x60 */
+ 0xB049, 0xD3D6, 0xD3D4, 0, 0xD3DB, 0xD3D2, 0xD3D3, 0xB04A, /* 0x70 */
+ 0, 0xB04E, 0, 0, 0xD3DC, 0xB04D, 0xD3DA, 0xD3D7, /* 0x70 */
+ 0xD3D5, 0xB04B, 0xB04C, 0xD3D9, 0, 0, 0, 0, /* 0x80 */
+ 0xB350, 0xD7B2, 0, 0xB355, 0xD7C2, 0xB354, 0xD7C4, 0, /* 0x80 */
+ 0, 0xD7B8, 0xB352, 0xD7C3, 0, 0xD7B3, 0xB353, 0xD7BF, /* 0x90 */
+ 0xD7BB, 0xD7BD, 0xD7B7, 0xD7BE, 0, 0, 0xB34F, 0xD7BA, /* 0x90 */
+ 0, 0xD7B9, 0xD7B5, 0, 0xD7C0, 0, 0, 0xD7BC, /* 0xA0 */
+ 0xD7B4, 0, 0xD7B6, 0xB351, 0xD7C1, 0, 0, 0, /* 0xA0 */
+ 0, 0xB5F6, 0xDBCD, 0, 0, 0, 0xDBC9, 0xDBCB, /* 0xB0 */
+ 0xDBC6, 0xDBC5, 0xDBC3, 0, 0xDBCA, 0xDBCC, 0xDBC8, 0, /* 0xB0 */
+ 0xDBC7, 0xB5F4, 0xB5F5, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xDBCF, 0xB8CD, 0xDFF2, 0xDFF8, 0xDFF3, 0xDFF4, 0xF9D8, /* 0xC0 */
+ 0xDFF9, 0, 0xB8CF, 0, 0xB8C7, 0xB8CE, 0xDFF1, 0xDBC4, /* 0xD0 */
+ 0xB8CA, 0xB8C8, 0xDFF7, 0xDFF6, 0xB8C9, 0xB8CB, 0xDFF5, 0xB8C6, /* 0xD0 */
+ 0, 0xB8CC, 0, 0, 0, 0, 0, 0xE3F6, /* 0xE0 */
+ 0xBB74, 0, 0, 0xE442, 0xE441, 0, 0xE3FB, 0xBB76, /* 0xE0 */
+ 0xE440, 0xE3F7, 0xE3F8, 0xBB6E, 0xBB70, 0, 0xE3FD, 0xE3F5, /* 0xF0 */
+ 0xBB72, 0xBB71, 0xE3F9, 0xE3FE, 0xE3FC, 0xBB73, 0xE3FA /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_89[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDBCE, 0xBB6F, 0, 0, 0xE7C2, 0xE7C9, 0xBDC6, /* 0x00 */
+ 0, 0xE7CD, 0xBDCA, 0xE7C5, 0xE7C3, 0, 0xE7CC, 0, /* 0x00 */
+ 0xBDC5, 0xE7CB, 0xBDC7, 0xBDC8, 0xE7C4, 0xBDC9, 0xE7CA, 0xE7C6, /* 0x10 */
+ 0xE7C7, 0xE7C8, 0xBB75, 0, 0, 0, 0xEB70, 0xEB7C, /* 0x10 */
+ 0, 0xBFCA, 0xEB77, 0xEB79, 0, 0xBFC8, 0xEB71, 0xEB75, /* 0x20 */
+ 0, 0xEB78, 0xBFC6, 0xBFC9, 0xEB7B, 0xEB73, 0xEB74, 0xEB7A, /* 0x20 */
+ 0xEB72, 0xEB76, 0xBFC7, 0xEE72, 0, 0xEE71, 0xC1B7, 0xEE77, /* 0x30 */
+ 0xC1B9, 0, 0, 0xC1B6, 0xEE73, 0xC1BA, 0xEE74, 0, /* 0x30 */
+ 0, 0xEE75, 0xEE78, 0, 0xC1B8, 0, 0xF0D6, 0, /* 0x40 */
+ 0, 0xF0D9, 0, 0xF0D3, 0xF0D5, 0, 0, 0xF0D4, /* 0x40 */
+ 0xF0D7, 0xF0D8, 0xEE76, 0xF0D2, 0, 0, 0xC3CD, 0xF2EC, /* 0x50 */
+ 0xF2EF, 0xF2F1, 0xF2EA, 0xF2EB, 0xF2EE, 0xF2F0, 0xC3CE, 0xC3CC, /* 0x50 */
+ 0xC3CB, 0xF2ED, 0xF2E9, 0xF4CA, 0xC4B0, 0, 0xF4CB, 0, /* 0x60 */
+ 0, 0xF649, 0xC4FB, 0xF64B, 0xC4FC, 0xF648, 0xF64A, 0xC5A8, /* 0x60 */
+ 0, 0xF752, 0xC5A7, 0xF7FD, 0xF7FC, 0, 0xF7FB, 0, /* 0x70 */
+ 0, 0xF948, 0xF949, 0xF94B, 0xF94A, 0, 0xCA50, 0xA6E8, /* 0x70 */
+ 0, 0xAD6E, 0xD7C5, 0xB5F7, 0, 0xDFFA, 0xC2D0, 0, /* 0x80 */
+ 0xF2F2, 0, 0, 0xA8A3, 0, 0, 0, 0xB357, /* 0x80 */
+ 0, 0, 0, 0xB356, 0, 0xDBD0, 0xB5F8, 0xDBD2, /* 0x90 */
+ 0xDBD1, 0, 0, 0xDFFB, 0xB8D0, 0xE443, 0xE446, 0xE445, /* 0x90 */
+ 0, 0xE444, 0xE7CE, 0xE7D0, 0xE7CF, 0, 0xBFCC, 0, /* 0xA0 */
+ 0, 0, 0xBFCB, 0, 0xC1BB, 0xEE79, 0xEE7B, 0xEE7A, /* 0xA0 */
+ 0, 0, 0xC2D1, 0, 0, 0, 0xF2F4, 0xF2F3, /* 0xB0 */
+ 0, 0xF4CC, 0xC4B1, 0, 0, 0xC4FD, 0xF754, 0xF753, /* 0xB0 */
+ 0xC65B, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0xA8A4, 0xD0AF, 0xAD6F, 0xD7C8, 0xD7C6, 0, /* 0xD0 */
+ 0, 0xD7C7, 0xDBD4, 0xDBD5, 0xE043, 0xDBD3, 0, 0xDFFC, /* 0xD0 */
+ 0xE041, 0xE040, 0xE042, 0xB8D1, 0xDFFE, 0xDFFD, 0xE044, 0, /* 0xE0 */
+ 0xE449, 0xE447, 0, 0xE448, 0xE7D3, 0xE7D1, 0, 0, /* 0xE0 */
+ 0xE7D2, 0xEB7D, 0xEE7C, 0xEE7D, 0xC2D2, 0, 0xF2F5, 0xF4CD, /* 0xF0 */
+ 0xC4B2, 0, 0xF64C, 0xF755, 0xC5A9, 0, 0xF7FE, 0xF94C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_8A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA8A5, 0, 0xAD71, 0xAD72, 0xD0B0, 0, 0, 0xD0B1, /* 0x00 */
+ 0xAD70, 0, 0xB054, 0, 0xB052, 0, 0xB051, 0xB058, /* 0x00 */
+ 0xB050, 0xB059, 0xD3DD, 0xB056, 0, 0xB053, 0xB057, 0xB055, /* 0x10 */
+ 0xB04F, 0, 0, 0xB35F, 0, 0xB359, 0xD7CC, 0xB35E, /* 0x10 */
+ 0, 0, 0xB360, 0xB35A, 0, 0xB35B, 0, 0xD7CA, /* 0x20 */
+ 0, 0, 0xB358, 0, 0xD7CB, 0xB35D, 0, 0, /* 0x20 */
+ 0xD7C9, 0xB35C, 0, 0, 0xB644, 0, 0xB646, 0, /* 0x30 */
+ 0, 0xDBD8, 0xB645, 0xB5F9, 0xB5FD, 0, 0xB8E4, 0xE049, /* 0x30 */
+ 0xDBDA, 0xB5FE, 0, 0, 0xDBDD, 0xDBDE, 0xB643, 0, /* 0x40 */
+ 0xDBE0, 0, 0xDBE2, 0, 0xDBE3, 0xDBD7, 0xDBD6, 0xDBE4, /* 0x40 */
+ 0xB642, 0xDBE1, 0xDBDF, 0, 0xB640, 0xB5FB, 0xB647, 0xDBDB, /* 0x50 */
+ 0xDBDC, 0xDBD9, 0, 0xB641, 0, 0, 0xB5FC, 0, /* 0x50 */
+ 0xB5FA, 0xE048, 0xB8DF, 0xB8DA, 0, 0, 0xB8D5, 0, /* 0x60 */
+ 0xB8E5, 0xB8D6, 0, 0xB8D2, 0xB8E1, 0xB8DE, 0xB8E0, 0, /* 0x60 */
+ 0xB8D7, 0xB8DC, 0xB8D3, 0xB8D4, 0xE050, 0xE04D, 0xE045, 0xE04A, /* 0x70 */
+ 0, 0xB8E2, 0xE051, 0xB8E3, 0xB8D9, 0, 0, 0xE047, /* 0x70 */
+ 0, 0xE04F, 0xE04B, 0xE04E, 0xE04C, 0xB8DD, 0xE046, 0xB8D8, /* 0x80 */
+ 0, 0, 0, 0xE44C, 0xBB78, 0xBB7B, 0, 0xE44E, /* 0x80 */
+ 0, 0xBBA5, 0xE44D, 0xBB7D, 0, 0xBDCF, 0xE44F, 0, /* 0x90 */
+ 0xBBA4, 0xE44B, 0xBBA6, 0, 0, 0, 0xBB79, 0, /* 0x90 */
+ 0xB8DB, 0xBB7C, 0, 0xBB7A, 0xBB7E, 0xBBA2, 0xBB77, 0xBBA7, /* 0xA0 */
+ 0xBBA3, 0, 0xBBA1, 0xE44A, 0, 0, 0, 0, /* 0xA0 */
+ 0xBDD6, 0, 0xBDD2, 0, 0, 0, 0xBDD9, 0, /* 0xB0 */
+ 0xE7D6, 0xBDDA, 0xE7E2, 0xE7DB, 0xBDCB, 0xE7E3, 0xE7DD, 0xBDD5, /* 0xB0 */
+ 0xE7DE, 0, 0xBDD4, 0xE7E1, 0xBDCE, 0xE7DF, 0xE7D5, 0xBDCD, /* 0xC0 */
+ 0xEBAA, 0xBDD3, 0, 0xBDD0, 0, 0xBDD8, 0, 0xE7D4, /* 0xC0 */
+ 0, 0xE7D8, 0xBDCC, 0xE7D7, 0xE7D9, 0xE7DA, 0xBDD7, 0xE7DC, /* 0xD0 */
+ 0xE7E0, 0xE7E4, 0, 0xBDDB, 0xBFD2, 0xEBA5, 0xEBAB, 0xEBA8, /* 0xD0 */
+ 0xEB7E, 0xEBAC, 0xEBA1, 0, 0xEBA7, 0, 0xBFCD, 0xBFD3, /* 0xE0 */
+ 0xEBAD, 0, 0, 0xBFCF, 0, 0xBFD9, 0xBFD4, 0xEBAF, /* 0xE0 */
+ 0xEBA9, 0xBFD0, 0xEBA2, 0xBFDA, 0xEBA3, 0xEBA4, 0xBFDB, 0xBFD8, /* 0xF0 */
+ 0xBDD1, 0, 0xBFCE, 0xEBB0, 0xBFDC, 0, 0xBFD5, 0xEBAE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_8B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBFD1, 0xBFD6, 0xBFD7, 0, 0xC1C3, 0xEEA4, 0xEEAD, 0xEEAA, /* 0x00 */
+ 0xEEAC, 0, 0xC1C0, 0xEEA5, 0, 0xEEAB, 0xC1BC, 0xEEA7, /* 0x00 */
+ 0xC1C4, 0xEEA3, 0xEEA8, 0xEEAF, 0xEBA6, 0xEEA9, 0xEEA2, 0xC1BD, /* 0x10 */
+ 0xEEA1, 0xC1BE, 0xEEB0, 0xC1BF, 0xEEAE, 0xC1C2, 0xEE7E, 0, /* 0x10 */
+ 0xC1C1, 0, 0xEEA6, 0xF0DC, 0xF0EA, 0xF0E5, 0xF0E7, 0xF0DB, /* 0x20 */
+ 0xC2D3, 0, 0xF0DA, 0xC2D6, 0xC2D5, 0, 0xF0E9, 0xF0E1, /* 0x20 */
+ 0xF0DE, 0xF0E4, 0, 0xF0DD, 0, 0xF0DF, 0xF0E8, 0xF0E6, /* 0x30 */
+ 0, 0xC2D4, 0xF0ED, 0xF0EB, 0xF0E2, 0xF0EC, 0xF0E3, 0, /* 0x30 */
+ 0xF2F9, 0xC3CF, 0xF341, 0, 0, 0xF64F, 0xC3D6, 0xF0E0, /* 0x40 */
+ 0xF2F7, 0xC3D2, 0xF2F8, 0xF2FD, 0, 0, 0xC3D4, 0xC3D5, /* 0x40 */
+ 0xF2F6, 0xF340, 0xF342, 0xF2FA, 0xF2FC, 0xF2FE, 0xF2FB, 0xF343, /* 0x50 */
+ 0xC3D1, 0xC3D7, 0xC3D3, 0, 0xC3D0, 0xF4D0, 0, 0xC4B7, /* 0x50 */
+ 0xF4CE, 0, 0, 0xF4D2, 0, 0xF4D3, 0xC4B5, 0xF4D4, /* 0x60 */
+ 0xF4D1, 0, 0xF4CF, 0xC4B8, 0xC4B4, 0xF4D5, 0, 0xC4B6, /* 0x60 */
+ 0xC4B3, 0, 0, 0, 0xC4FE, 0, 0, 0xC540, /* 0x70 */
+ 0xF64E, 0xF64D, 0xF650, 0xF651, 0, 0xC541, 0xF756, 0xF75B, /* 0x70 */
+ 0xC5AA, 0, 0xF758, 0, 0xF757, 0xF75A, 0xF759, 0, /* 0x80 */
+ 0xF843, 0, 0xC5DC, 0xF842, 0xF840, 0, 0xF841, 0, /* 0x80 */
+ 0, 0, 0xC5FE, 0xC5FD, 0xF8C1, 0xF8C2, 0xC640, 0, /* 0x90 */
+ 0xF94D, 0xF94E, 0xC667, 0, 0xC66D, 0, 0xF9A9, 0xF9C8, /* 0x90 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_8C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA8A6, /* 0x30 */
+ 0, 0xD7CD, 0, 0xD7CE, 0xE052, 0xE450, 0xE7E5, 0xC1C6, /* 0x30 */
+ 0, 0xC1C5, 0xF0EE, 0xF344, 0, 0xF844, 0xA8A7, 0xD3DE, /* 0x40 */
+ 0xB05A, 0xB361, 0xE054, 0xE053, 0xBDDC, 0xE7E6, 0xBDDD, 0xEEB1, /* 0x40 */
+ 0xC2D7, 0, 0, 0, 0xC676, 0xA8A8, 0xCDCB, 0xD3DF, /* 0x50 */
+ 0, 0, 0xB362, 0, 0xD7CF, 0xD7D0, 0, 0xDBE5, /* 0x50 */
+ 0, 0xB648, 0xB8E6, 0, 0xE056, 0xE055, 0xE057, 0, /* 0x60 */
+ 0xE451, 0xE452, 0xBBA8, 0xBFDD, 0xBDDE, 0xBFDE, 0, 0xEEB5, /* 0x60 */
+ 0xEEB2, 0xEEB4, 0xEEB3, 0xC1C7, 0, 0xF0EF, 0xF346, 0xF345, /* 0x70 */
+ 0xCBA4, 0xB05C, 0xB05B, 0xD3E0, 0, 0xD7D1, 0, 0, /* 0x70 */
+ 0xDBE7, 0xDBE6, 0xB649, 0, 0xE059, 0xE05A, 0xE058, 0, /* 0x80 */
+ 0, 0xB8E8, 0xB8E7, 0, 0xBBAA, 0xBBA9, 0, 0xE7E7, /* 0x80 */
+ 0xEBB3, 0xEBB1, 0xEBB2, 0xBFDF, 0xEEB7, 0xEEB6, 0, 0xF0F2, /* 0x90 */
+ 0xF0F1, 0xF0F0, 0xF347, 0, 0xF9AA, 0xA8A9, 0xAD73, 0, /* 0x90 */
+ 0xAD74, 0xB05D, 0xB05E, 0xD3E2, 0xD3E1, 0xD7D2, 0, 0xB368, /* 0xA0 */
+ 0xB366, 0xB363, 0xB367, 0xB365, 0xB364, 0, 0, 0xB64A, /* 0xA0 */
+ 0xDBEA, 0, 0xB8ED, 0xB64C, 0xB651, 0xDBEC, 0xB653, 0xB652, /* 0xB0 */
+ 0xB655, 0xDBEB, 0xDBE8, 0xB64F, 0xB64B, 0xB64D, 0xDBE9, 0xB654, /* 0xB0 */
+ 0xB650, 0xB64E, 0xB8EF, 0xB8EE, 0xB8EC, 0xB8F0, 0, 0xB8EA, /* 0xC0 */
+ 0xB8EB, 0, 0xB8E9, 0, 0xE05B, 0, 0, 0xE454, /* 0xC0 */
+ 0, 0xBBAC, 0xBBAD, 0xBBAB, 0, 0xE453, 0, 0xE455, /* 0xD0 */
+ 0, 0xE7EA, 0xE7EC, 0, 0xBDE7, 0xE7ED, 0xBDE0, 0xE7E9, /* 0xD0 */
+ 0xBDDF, 0xBDE9, 0xBDE5, 0xBDE6, 0xBDE2, 0xE7E8, 0xBDE1, 0xE7EE, /* 0xE0 */
+ 0xE7EB, 0, 0xBDE8, 0, 0xBDE3, 0xBDE4, 0xEBB5, 0, /* 0xE0 */
+ 0xEBB7, 0xEBB6, 0, 0xEBB8, 0xBFE0, 0xEBB4, 0, 0, /* 0xF0 */
+ 0xC1CB, 0xEEB8, 0xC1C8, 0xC1CC, 0xC1CA, 0xC1C9, 0xF0F3 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_8D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF0F6, 0, 0xF0F5, 0, 0xF0F4, 0xC2D8, 0xF348, 0xF349, /* 0x00 */
+ 0xC3D8, 0xF34A, 0xC3D9, 0, 0, 0xC4BA, 0, 0xC4B9, /* 0x00 */
+ 0xF652, 0, 0, 0xC542, 0xF653, 0xF75C, 0xC5AB, 0xC5AC, /* 0x10 */
+ 0, 0xF845, 0, 0xC642, 0, 0, 0, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xA8AA, 0, 0xB36A, 0xB369, /* 0x60 */
+ 0xE05C, 0xE05D, 0, 0xBBAE, 0xEBB9, 0xBDEA, 0xEBBA, 0xEEB9, /* 0x60 */
+ 0xA8AB, 0, 0xD0B2, 0xAD76, 0xAD75, 0, 0xD3E3, 0xB05F, /* 0x70 */
+ 0xD3E4, 0xD7D5, 0, 0xD7D4, 0, 0xD7D3, 0, 0, /* 0x70 */
+ 0xDBEE, 0xB658, 0, 0, 0xDBED, 0xB657, 0, 0, /* 0x80 */
+ 0, 0xDBEF, 0xB656, 0, 0xE05F, 0xE062, 0xE060, 0xE061, /* 0x80 */
+ 0xE065, 0xE05E, 0xE066, 0xE063, 0xE064, 0xBBB0, 0xE456, 0, /* 0x90 */
+ 0, 0xBBAF, 0, 0xE7F2, 0xE7F0, 0, 0, 0xBDEB, /* 0x90 */
+ 0xE7EF, 0xE7F1, 0, 0xBDEC, 0, 0xEBBB, 0, 0xEBBC, /* 0xA0 */
+ 0xC1CD, 0, 0xF34C, 0xF34E, 0xF34B, 0xF34D, 0xF4D6, 0xF654, /* 0xA0 */
+ 0, 0, 0xF96F, 0xA8AC, 0xAD77, 0xD3E5, 0xD3E7, 0xD3E6, /* 0xB0 */
+ 0, 0xD7D8, 0xB36C, 0, 0xD7D6, 0, 0xB36B, 0xD7D9, /* 0xB0 */
+ 0, 0xD7DA, 0xD7D7, 0, 0, 0xDBFB, 0xB660, 0xDBF3, /* 0xC0 */
+ 0xDBF9, 0, 0, 0xB65B, 0xB65E, 0xDBF2, 0xB659, 0xDBF6, /* 0xC0 */
+ 0xE06C, 0xB65D, 0, 0xDBF1, 0, 0xDBF7, 0xDBF4, 0xDBFA, /* 0xD0 */
+ 0xDBF0, 0xDBF8, 0xB65C, 0xB65F, 0xDBF5, 0xB65A, 0, 0xB8F2, /* 0xD0 */
+ 0xE068, 0xB8F1, 0xE06F, 0xE06E, 0xB8F8, 0, 0xB8F9, 0xE070, /* 0xE0 */
+ 0xB8F3, 0xE06D, 0xB8F7, 0xE072, 0xE069, 0, 0xE06B, 0xB8F4, /* 0xE0 */
+ 0xE067, 0xE06A, 0xE071, 0xB8F5, 0xE073, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0xB8F6, 0, 0xBBB1, 0xE45B, 0xE461, 0xE459 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_8E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE462, 0, 0xE458, 0xE45D, 0xE463, 0xE460, 0xE45F, 0xE45E, /* 0x00 */
+ 0, 0xE457, 0xE45C, 0, 0, 0xE45A, 0, 0xBDF1, /* 0x00 */
+ 0xBDEE, 0xE7FB, 0xE841, 0xE843, 0xE840, 0xE7F8, 0xE7FA, 0xE845, /* 0x10 */
+ 0xE842, 0xE7FC, 0xE846, 0xE7F9, 0xE844, 0xBDEF, 0xBDF5, 0xBDF3, /* 0x10 */
+ 0xE7F3, 0xBDF4, 0xBDF0, 0xE7F4, 0xE7F6, 0xE7F5, 0xE7FD, 0xE7FE, /* 0x20 */
+ 0, 0xBDF2, 0, 0xBDED, 0, 0, 0xE7F7, 0, /* 0x20 */
+ 0xEBC6, 0xBFE2, 0, 0xEBBD, 0xBFE3, 0xBFE6, 0xEBC2, 0, /* 0x30 */
+ 0xEBBF, 0xBFE5, 0, 0, 0xEBC3, 0xEBC4, 0xEBBE, 0xEBC7, /* 0x30 */
+ 0xEBC0, 0xEBC5, 0xBFE4, 0, 0xBFE1, 0xEBC1, 0, 0xEEBF, /* 0x40 */
+ 0xC1D0, 0xC1CE, 0xC1D1, 0xC1CF, 0xEEBE, 0xEEBB, 0xEEBA, 0, /* 0x40 */
+ 0xEEBD, 0, 0, 0xEEBC, 0xF145, 0xC2DE, 0xF0FB, 0xF0FA, /* 0x50 */
+ 0, 0xC2D9, 0xF141, 0xF140, 0xF0F7, 0xF143, 0xF0FC, 0xC2DD, /* 0x50 */
+ 0xF0F9, 0xF142, 0xF0F8, 0xC2DA, 0xC2DC, 0xF0FD, 0xC2DB, 0xF0FE, /* 0x60 */
+ 0, 0xF144, 0xF352, 0, 0xC3DE, 0xF34F, 0, 0xF353, /* 0x60 */
+ 0, 0, 0xC3DB, 0xF351, 0xC3E0, 0, 0xC3DD, 0, /* 0x70 */
+ 0xF350, 0, 0xC3DF, 0xF354, 0xC3DA, 0, 0, 0, /* 0x70 */
+ 0, 0xC4BC, 0xC4BE, 0, 0xF4D9, 0xC4BD, 0xF4D7, 0xC3DC, /* 0x80 */
+ 0xF4D8, 0xC4BB, 0xC543, 0xC545, 0xF656, 0xC544, 0xF655, 0, /* 0x80 */
+ 0xF761, 0xC5AD, 0xF760, 0xC5AE, 0xF75E, 0xF75D, 0xF762, 0xF763, /* 0x90 */
+ 0xF846, 0, 0xF75F, 0, 0, 0xF8C6, 0xF8C3, 0xF8C4, /* 0x90 */
+ 0xF8C5, 0xC65C, 0, 0xF951, 0xF950, 0xF94F, 0xF970, 0, /* 0xA0 */
+ 0xF9BE, 0xF9AB, 0xC66E, 0xA8AD, 0xB060, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xB8FA, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0xBDF6, 0, 0, 0xEBC8, 0, 0, /* 0xB0 */
+ 0xC2DF, 0, 0xF355, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0xF9AC, 0xA8AE, 0xAAEE, 0xAD79, 0xAD78, 0, 0xB063, /* 0xC0 */
+ 0, 0xD3E8, 0xB061, 0xD3E9, 0xB062, 0, 0, 0xD7DF, /* 0xD0 */
+ 0xD7DB, 0, 0, 0xB36D, 0xD7DE, 0xD7DD, 0xD7DC, 0xB36E, /* 0xD0 */
+ 0xD7E0, 0xD7E1, 0, 0, 0, 0xDC43, 0xDC41, 0xDC45, /* 0xE0 */
+ 0xDC46, 0xDC4C, 0, 0xDC48, 0xDC4A, 0, 0xDC42, 0xDBFC, /* 0xE0 */
+ 0, 0xDC49, 0, 0, 0xDC4B, 0xDC44, 0xDC47, 0xDBFD, /* 0xF0 */
+ 0xB662, 0xDC40, 0xDBFE, 0xB661, 0xB663, 0, 0xB8FD, 0xE075 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_8F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE077, 0xE076, 0xE07B, 0xB8FB, 0, 0xE078, 0xE074, 0xE079, /* 0x00 */
+ 0xE07A, 0xB8FC, 0xB8FE, 0xE07C, 0, 0xE467, 0xE466, 0, /* 0x00 */
+ 0xE464, 0xE465, 0xBBB3, 0xBBB5, 0xBBB2, 0xBBB4, 0xE84D, 0xE84E, /* 0x10 */
+ 0xE849, 0, 0xE84A, 0xBDF8, 0xBDFD, 0xBDF7, 0xBDFE, 0xBDF9, /* 0x10 */
+ 0xE84B, 0, 0, 0xE84C, 0xE848, 0xBE40, 0xBDFB, 0, /* 0x20 */
+ 0, 0xBDFA, 0xBDFC, 0, 0xE847, 0, 0xEBCA, 0xBFE8, /* 0x20 */
+ 0, 0, 0xEBCC, 0xBFEA, 0xEBCF, 0xEBCB, 0xEBC9, 0xEBCE, /* 0x30 */
+ 0xBFE9, 0xEBCD, 0, 0xBFE7, 0, 0, 0xC1D3, 0xC1D6, /* 0x30 */
+ 0xEEC1, 0, 0xC1D4, 0xEEC0, 0xC1D2, 0xC1D5, 0xF146, 0xF147, /* 0x40 */
+ 0xF148, 0xC2E0, 0, 0xF149, 0, 0xC2E1, 0xC3E2, 0xF358, /* 0x40 */
+ 0xF359, 0xF357, 0xF356, 0xF35A, 0xC3E1, 0xF4DD, 0xF4DB, 0xF4DC, /* 0x50 */
+ 0xF4DE, 0xF4DA, 0xF4DF, 0xF658, 0, 0xF659, 0xF657, 0xC546, /* 0x50 */
+ 0xF764, 0xC5AF, 0xF765, 0xF848, 0xF847, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0xA8AF, 0xB664, 0, 0, 0xB940, /* 0x90 */
+ 0, 0, 0, 0xBBB6, 0, 0, 0xBFEC, 0, /* 0xA0 */
+ 0xBFEB, 0, 0, 0, 0, 0xC3E3, 0xC47C, 0xC547, /* 0xA0 */
+ 0xA8B0, 0xB064, 0xB941, 0, 0xF35B, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0xCBA6, /* 0xB0 */
+ 0, 0, 0xA8B1, 0, 0xA8B4, 0xA8B3, 0xA8B2, 0, /* 0xC0 */
+ 0, 0xCBA5, 0, 0xCDCD, 0, 0xCDCF, 0xAAEF, 0, /* 0xC0 */
+ 0, 0xAAF1, 0xCDCC, 0xCDCE, 0xAAF0, 0xCDD1, 0xCDD0, 0xCDD2, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xD0B6, 0xD0B4, 0xAD7C, 0xD0B3, 0xADA3, 0xAD7E, 0xAD7B, 0, /* 0xE0 */
+ 0xADA4, 0, 0xAD7D, 0xADA2, 0, 0xADA1, 0xD0B5, 0, /* 0xE0 */
+ 0xAD7A, 0, 0, 0, 0xB06A, 0xD3EB, 0xD3F1, 0xB067, /* 0xF0 */
+ 0xB06E, 0, 0xB069, 0xD3EE, 0xD3F0, 0xB06C, 0xD3EA, 0xD3ED /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_90[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xB068, 0xB065, 0xD3EC, 0xB06B, 0xD3EF, 0xB06D, 0xB066, 0, /* 0x00 */
+ 0, 0, 0, 0xD7E3, 0xD7E6, 0xB370, 0, 0xB37A, /* 0x00 */
+ 0xB376, 0xD7E4, 0, 0, 0xB37E, 0xB377, 0xB37C, 0xB372, /* 0x10 */
+ 0, 0xB36F, 0xB371, 0xB37D, 0xD7E5, 0xB375, 0xB378, 0xB374, /* 0x10 */
+ 0xB379, 0xD7E7, 0xB37B, 0xB373, 0xD7E2, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xDC4D, 0xB665, 0xDC4F, /* 0x20 */
+ 0, 0xB667, 0xB669, 0, 0xDC4E, 0xB666, 0xB66A, 0, /* 0x30 */
+ 0xB668, 0, 0, 0, 0xB947, 0xE0A3, 0xB94F, 0xE07E, /* 0x30 */
+ 0, 0xB950, 0xB945, 0, 0xE0A1, 0, 0, 0xB94A, /* 0x40 */
+ 0, 0xE0A2, 0xB943, 0xB942, 0, 0xB94D, 0xB94C, 0xB94B, /* 0x40 */
+ 0xB949, 0xB94E, 0xE07D, 0xB944, 0xB946, 0xB948, 0, 0, /* 0x50 */
+ 0xBBB8, 0xBBBB, 0, 0xBBBF, 0xBBB9, 0xBBBE, 0xBBBC, 0, /* 0x50 */
+ 0xBBB7, 0, 0xBBBD, 0xBBBA, 0, 0, 0, 0xE852, /* 0x60 */
+ 0xBE43, 0xBE41, 0, 0xE853, 0, 0xBE44, 0xBE42, 0xE851, /* 0x60 */
+ 0xE850, 0, 0xBFF0, 0xE84F, 0xBFEE, 0xBFED, 0xEBD0, 0xBE45, /* 0x70 */
+ 0xBFEF, 0xEBD1, 0xBFF2, 0xEBD2, 0xBFF1, 0xC1D8, 0xEEC3, 0xC1D7, /* 0x70 */
+ 0xC1DC, 0xC1DA, 0xC1DB, 0xC2E3, 0xC1D9, 0xEEC2, 0xEBD3, 0xC2E2, /* 0x80 */
+ 0xC2E4, 0, 0xC3E4, 0xC3E5, 0, 0xF4E0, 0, 0xC5DE, /* 0x80 */
+ 0xC5DD, 0xA8B6, 0, 0, 0xCA55, 0xB06F, 0, 0xCA52, /* 0x90 */
+ 0xCA53, 0xCA51, 0, 0xCA54, 0, 0, 0xCBAA, 0xCBA7, /* 0x90 */
+ 0xCBAC, 0xCBA8, 0xA8B7, 0xA8BA, 0, 0xCBA9, 0xA8B9, 0xCBAB, /* 0xA0 */
+ 0, 0, 0xA8B8, 0, 0, 0, 0, 0xCDD5, /* 0xA0 */
+ 0xCDD7, 0xAAF4, 0xCDD3, 0xCDD6, 0xCDD4, 0xAAF2, 0xAAF5, 0, /* 0xB0 */
+ 0xAAF3, 0, 0, 0, 0, 0xD0B8, 0xD0BC, 0xD0B9, /* 0xB0 */
+ 0, 0xADA7, 0, 0xADA8, 0, 0xD0BB, 0, 0xD0BD, /* 0xC0 */
+ 0xD0BF, 0, 0xADA5, 0xD0BE, 0, 0, 0xADA6, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0xD7EE, 0xD0BA, 0xD3F2, 0xD3FB, /* 0xD0 */
+ 0xD3F9, 0xD3F4, 0xD3F5, 0xD3FA, 0xD3FC, 0xB071, 0, 0xD3F7, /* 0xD0 */
+ 0xD3F3, 0xB070, 0xB072, 0xD3F6, 0xD3FD, 0xD3F8, 0, 0, /* 0xE0 */
+ 0xB3A1, 0xD7F1, 0xD7E9, 0xD7EF, 0xD7F0, 0xB3A2, 0, 0xD7E8, /* 0xE0 */
+ 0xD7EA, 0xD0B7, 0xD7EC, 0xD7ED, 0xD7EB, 0xB66C, 0, 0, /* 0xF0 */
+ 0, 0xDC56, 0xEBD4, 0xDC57, 0xDC54, 0xB3A3, 0xB66E, 0xDC53 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_91[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDC59, 0xDC58, 0xB66B, 0xDC5C, 0xDC52, 0xDC5B, 0xDC50, 0xDC5A, /* 0x00 */
+ 0xDC55, 0xB66D, 0, 0xE0AA, 0, 0xE0A5, 0xE0AB, 0xE0A6, /* 0x00 */
+ 0xE0A4, 0xE0A7, 0xB951, 0, 0xE0A9, 0, 0xE0A8, 0xB952, /* 0x10 */
+ 0xBBC1, 0xBBC0, 0xE46E, 0xE471, 0xE469, 0xE46D, 0xBBC2, 0xE46C, /* 0x10 */
+ 0xE46A, 0xE470, 0xE46B, 0xE468, 0xE46F, 0, 0xE859, 0xBE48, /* 0x20 */
+ 0xF14A, 0xE856, 0xE857, 0xE855, 0xDC51, 0xBE47, 0xE85A, 0xE854, /* 0x20 */
+ 0xBE46, 0xBE49, 0xE858, 0xEBD5, 0xBFF3, 0xEBD6, 0xEBD7, 0, /* 0x30 */
+ 0xEEC4, 0xC1DD, 0xF14B, 0xF14C, 0, 0, 0xF14D, 0xF35D, /* 0x30 */
+ 0xF35C, 0xF4E2, 0, 0xF4E1, 0xF65B, 0xF65C, 0xF65A, 0xF766, /* 0x40 */
+ 0xC5B0, 0xA8BB, 0xADAA, 0xADA9, 0xB075, 0xB074, 0xD440, 0xD441, /* 0x40 */
+ 0xD3FE, 0, 0xB073, 0xD7F5, 0, 0xD7F6, 0xD7F2, 0xB3A4, /* 0x50 */
+ 0xD7F3, 0, 0xD7F4, 0, 0, 0, 0, 0xDC5F, /* 0x50 */
+ 0xDC61, 0xDC5D, 0xDC60, 0xB66F, 0xDC5E, 0xB670, 0, 0, /* 0x60 */
+ 0xDD73, 0xB955, 0xB954, 0, 0xB953, 0, 0xE0AC, 0xE0AD, /* 0x60 */
+ 0, 0, 0xE473, 0xE475, 0xBBC6, 0xBBC3, 0, 0xBBC5, /* 0x70 */
+ 0xBBC4, 0xE474, 0xE472, 0, 0, 0, 0, 0, /* 0x70 */
+ 0xE861, 0xE85E, 0xE85F, 0xBE4D, 0xE860, 0xE85B, 0xE85C, 0xBE4A, /* 0x80 */
+ 0, 0xBE4B, 0xE85D, 0xBE4C, 0, 0xEBDB, 0, 0xEBDC, /* 0x80 */
+ 0xEBD9, 0xEBDA, 0xBFF4, 0xEBD8, 0, 0, 0, 0, /* 0x90 */
+ 0, 0xEEC8, 0xEEC5, 0xEEC7, 0xC1E0, 0xEECB, 0xC1DF, 0xEEC9, /* 0x90 */
+ 0xEECC, 0xEECA, 0xEEC6, 0xC1DE, 0, 0xF14F, 0, 0xF150, /* 0xA0 */
+ 0xF14E, 0, 0xF152, 0xC2E5, 0xC2E6, 0xF35F, 0xC3E7, 0xF151, /* 0xA0 */
+ 0xF35E, 0xC3E6, 0xF4E5, 0xF4E6, 0xC4BF, 0xF4E4, 0, 0xF4E3, /* 0xB0 */
+ 0, 0xF65D, 0xC548, 0, 0xF849, 0xF8C8, 0xF8C7, 0, /* 0xB0 */
+ 0xC643, 0xC65D, 0xF8C9, 0xF971, 0, 0xC66F, 0xA8BC, 0xAAF6, /* 0xC0 */
+ 0, 0xB956, 0, 0xC4C0, 0xA8BD, 0xADAB, 0xB3A5, 0xB671, /* 0xC0 */
+ 0xC2E7, 0xAAF7, 0, 0xD0C1, 0xD0C0, 0xD442, 0, 0xB078, /* 0xD0 */
+ 0xB076, 0xB07A, 0xD444, 0, 0xB079, 0xB077, 0, 0, /* 0xD0 */
+ 0, 0, 0xD443, 0xB3A8, 0xD7FC, 0, 0xB3A7, 0xB3A9, /* 0xE0 */
+ 0xD842, 0xB3AB, 0xD7FE, 0xD840, 0xD7F7, 0xB3AA, 0xD843, 0, /* 0xE0 */
+ 0, 0xD7F9, 0, 0xD7FA, 0xD7F8, 0xB3A6, 0, 0xD841, /* 0xF0 */
+ 0xD7FB, 0xD7FD, 0, 0, 0, 0xDC6D, 0, 0xDC6C /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_92[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xDC6A, 0xDC62, 0xDC71, 0xDC65, 0xDC6F, 0xDC76, 0xDC6E, 0xB679, /* 0x00 */
+ 0, 0xB675, 0xDC63, 0, 0xDC69, 0xB677, 0, 0xDC68, /* 0x00 */
+ 0xB678, 0xB67A, 0xDC6B, 0, 0xB672, 0xB673, 0xDC77, 0xDC75, /* 0x10 */
+ 0, 0xDC74, 0xDC66, 0, 0xDC72, 0, 0xB676, 0, /* 0x10 */
+ 0, 0, 0, 0xB674, 0xDC73, 0xDC64, 0xDC67, 0xDC70, /* 0x20 */
+ 0, 0, 0, 0, 0, 0xE4BA, 0xE0B7, 0, /* 0x20 */
+ 0xE0B0, 0xE0C3, 0xE0CC, 0xE0B3, 0xB961, 0, 0xE0C0, 0xB957, /* 0x30 */
+ 0xB959, 0xB965, 0xE0B1, 0, 0, 0xB95A, 0xB95C, 0xB966, /* 0x30 */
+ 0xB95B, 0, 0, 0, 0, 0xB964, 0xE0B9, 0, /* 0x40 */
+ 0xE0AE, 0xB962, 0xE0B8, 0xB95E, 0xE0CA, 0xB963, 0xE0C8, 0xE0BC, /* 0x40 */
+ 0xE0C6, 0xB960, 0xE0AF, 0xE0C9, 0xE0C4, 0, 0xE0CB, 0xB958, /* 0x50 */
+ 0, 0, 0xB967, 0xB95D, 0, 0, 0xE0B5, 0, /* 0x50 */
+ 0xE0BD, 0xE0C1, 0, 0xE0C5, 0xB95F, 0xE0B4, 0xE0B2, 0xE0BE, /* 0x60 */
+ 0, 0, 0, 0, 0xE0BB, 0xE0BA, 0, 0xE0BF, /* 0x60 */
+ 0xE0C2, 0, 0xE0C7, 0, 0, 0, 0xE478, 0, /* 0x70 */
+ 0xBBC7, 0xE4A4, 0xE47A, 0xBBCC, 0xBBD0, 0xE4AD, 0xE4B5, 0xE4A6, /* 0x70 */
+ 0xBBC8, 0, 0xE4AA, 0xE0B6, 0, 0xBBC9, 0xE4B1, 0xE4B6, /* 0x80 */
+ 0xE4AE, 0, 0xE4B0, 0xE4B9, 0xE4B2, 0xE47E, 0xE4A9, 0, /* 0x80 */
+ 0, 0xBBD1, 0, 0xBBCD, 0xE47C, 0xE4AB, 0xBBCB, 0xE4A5, /* 0x90 */
+ 0xBBCA, 0xE4B3, 0xE4A2, 0xE479, 0xBBCE, 0xE4B8, 0, 0, /* 0x90 */
+ 0xE47B, 0xE4AF, 0xE4AC, 0xE4A7, 0xE477, 0xE476, 0xE4A1, 0xE4B4, /* 0xA0 */
+ 0xBBCF, 0xE4B7, 0xE47D, 0xE4A3, 0xBE52, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0xBE5A, 0xBE55, 0xE8A4, 0xE8A1, 0xE867, 0xBE50, /* 0xB0 */
+ 0, 0xF9D7, 0, 0xBE4F, 0xBE56, 0, 0, 0, /* 0xB0 */
+ 0xE865, 0xBE54, 0xE871, 0xE863, 0xE864, 0xBE4E, 0xE8A3, 0xBE58, /* 0xC0 */
+ 0xE874, 0xE879, 0xE873, 0xEBEE, 0xE86F, 0xE877, 0xE875, 0xE868, /* 0xC0 */
+ 0xE862, 0xE87D, 0xBE57, 0xE87E, 0, 0xE878, 0, 0xE86D, /* 0xD0 */
+ 0xE86B, 0xE866, 0, 0, 0, 0xE86E, 0xE87B, 0xE86A, /* 0xD0 */
+ 0xE87A, 0xE8A2, 0, 0, 0xBE53, 0, 0xE876, 0xE87C, /* 0xE0 */
+ 0xE872, 0xE86C, 0xBE51, 0, 0, 0, 0xE4A8, 0xE870, /* 0xE0 */
+ 0xBE59, 0xE869, 0, 0, 0, 0, 0, 0xEBF4, /* 0xF0 */
+ 0xBFF7, 0xEBF3, 0xEBF0, 0xEC44, 0xBFFB, 0, 0xEC41, 0xEBF8 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_93[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEC43, 0xEBE9, 0xEBF6, 0, 0xBFFD, 0, 0xEBE1, 0, /* 0x00 */
+ 0xEBDF, 0xEC42, 0, 0xEC40, 0xEBFE, 0xEBED, 0xEBEC, 0xEBE2, /* 0x00 */
+ 0xC040, 0, 0xEBE8, 0xEBF2, 0xEBFD, 0xC043, 0xEC45, 0, /* 0x10 */
+ 0xC1E8, 0xC045, 0xBFFE, 0xEBE6, 0, 0xEBEF, 0xEBDE, 0xEBE0, /* 0x10 */
+ 0xBFF5, 0xC042, 0xBFFA, 0xEBE7, 0xEBF7, 0xEBF1, 0xC041, 0xEBDD, /* 0x20 */
+ 0xC1E3, 0xEBF9, 0xEBFC, 0xBFFC, 0, 0xEBEB, 0xC044, 0xBFF9, /* 0x20 */
+ 0, 0, 0, 0xBFF8, 0xEBF5, 0xEBFB, 0xBFF6, 0, /* 0x30 */
+ 0xEBE4, 0xEBFA, 0, 0, 0xEBE5, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0xEBEA, 0xEED2, /* 0x40 */
+ 0, 0xEED7, 0xC1E5, 0xC1E7, 0xEEDD, 0xC1E1, 0xEEEC, 0xEEE3, /* 0x40 */
+ 0xEED8, 0xEED9, 0xEEE2, 0, 0xC1EE, 0xEEE1, 0xEED1, 0xEEE0, /* 0x50 */
+ 0xEED4, 0xEEED, 0xC1ED, 0xC1EB, 0xEED5, 0, 0xEEE8, 0, /* 0x50 */
+ 0xEEDA, 0xEEE7, 0, 0xEEE9, 0xEED0, 0xC1E6, 0, 0xEEEA, /* 0x60 */
+ 0, 0, 0xEEDE, 0, 0xC1EA, 0xEEDB, 0, 0, /* 0x60 */
+ 0xC1EC, 0xEEE4, 0, 0, 0, 0xC1E4, 0xEED6, 0xEEE5, /* 0x70 */
+ 0, 0xEEDF, 0xEBE3, 0xEEE6, 0xEED3, 0, 0xC1E9, 0, /* 0x70 */
+ 0xEEEB, 0, 0xC1E2, 0xEECE, 0, 0, 0, 0, /* 0x80 */
+ 0xF160, 0xF159, 0xC2E9, 0, 0xF154, 0xF163, 0xF15B, 0xEEDC, /* 0x80 */
+ 0, 0xF165, 0xF155, 0, 0xC2E8, 0xF15F, 0xC2EA, 0xC2F2, /* 0x90 */
+ 0xC2F0, 0xF161, 0xC2F1, 0xF157, 0, 0xF158, 0xF15D, 0xF162, /* 0x90 */
+ 0, 0xEECD, 0xC2EB, 0xF16A, 0xF167, 0xF16B, 0xF15E, 0xF15A, /* 0xA0 */
+ 0xF168, 0xF36A, 0xF15C, 0, 0xC2EE, 0, 0xC2ED, 0xEECF, /* 0xA0 */
+ 0xC2EF, 0xF164, 0xF166, 0xC2EC, 0xF169, 0xF153, 0, 0xF156, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0xF373, 0, 0xF363, 0xC3EB, 0xF371, 0, 0, 0xF361, /* 0xC0 */
+ 0xC3EC, 0, 0xF36C, 0, 0xF368, 0xC3F1, 0xF372, 0xF362, /* 0xC0 */
+ 0xF365, 0xC3E9, 0xF374, 0, 0xF36D, 0xF370, 0xC3EF, 0xC3F4, /* 0xD0 */
+ 0xC3F2, 0xF369, 0xF364, 0, 0xC3ED, 0xC3EE, 0xF360, 0xC3EA, /* 0xD0 */
+ 0, 0xC3E8, 0xC3F0, 0xF36F, 0xC3F3, 0, 0xF36B, 0xF375, /* 0xE0 */
+ 0xC3F5, 0, 0, 0, 0xF367, 0, 0xF36E, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xF4F3, 0xF542, 0xF4F5, /* 0xF0 */
+ 0xF4FC, 0xF366, 0xF4FA, 0xF4E9, 0xF540, 0xC4C3, 0xF4ED, 0xF4FE /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_94[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF4F4, 0, 0, 0xC4C2, 0, 0, 0xF544, 0xF4F6, /* 0x00 */
+ 0, 0xF4FB, 0xF4FD, 0xF4E7, 0xF541, 0xF4F2, 0xF4F7, 0xF4EB, /* 0x00 */
+ 0xF4EF, 0xF543, 0xF4F9, 0xF4E8, 0xF4EC, 0xF4EE, 0xF4F8, 0, /* 0x10 */
+ 0xC4C1, 0xF4F1, 0, 0, 0, 0, 0, 0, /* 0x10 */
+ 0xF4EA, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0xF4F0, 0xF661, 0xF666, 0xC54F, 0xF668, 0, 0xC549, 0, /* 0x20 */
+ 0xF664, 0xF66A, 0xC54E, 0xC54A, 0, 0xC54B, 0xF660, 0xF667, /* 0x30 */
+ 0xC54D, 0xF665, 0xC54C, 0xF65F, 0xF663, 0xF662, 0, 0xF65E, /* 0x30 */
+ 0xF669, 0, 0, 0, 0xC5B1, 0xF76D, 0xF770, 0xF76C, /* 0x40 */
+ 0xF76E, 0xF76F, 0xF769, 0xF76A, 0xF767, 0, 0, 0xF76B, /* 0x40 */
+ 0xF768, 0xC5B2, 0xC5B3, 0, 0, 0xF84B, 0, 0xF84D, /* 0x50 */
+ 0, 0, 0, 0, 0, 0xF84C, 0xF84E, 0, /* 0x50 */
+ 0xC5E0, 0, 0xF84A, 0xC5DF, 0xC5E1, 0, 0, 0, /* 0x60 */
+ 0xF8CB, 0xF8CC, 0xC644, 0xF8CA, 0, 0xF953, 0xF952, 0xF954, /* 0x60 */
+ 0xC65F, 0xF955, 0xC65E, 0xF956, 0xF972, 0xF975, 0xF974, 0xC668, /* 0x70 */
+ 0xF973, 0, 0, 0, 0xC672, 0xC670, 0xC671, 0xC677, /* 0x70 */
+ 0xF9C0, 0xF9C1, 0xF9BF, 0xF9C9 /* 0x80 */
+ /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_95[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xAAF8, /* 0x70 */
+ 0, 0, 0xD844, 0xDC78, 0xE8A5, 0xF376, 0, 0, /* 0x70 */
+ 0xAAF9, 0, 0xADAC, 0xB07B, 0, 0, 0xD845, 0, /* 0x80 */
+ 0xD846, 0xB3AC, 0, 0xB67D, 0xDC7A, 0xDC79, 0xB6A3, 0xB67C, /* 0x80 */
+ 0xDC7B, 0xB67E, 0xB6A2, 0xB6A1, 0xB67B, 0, 0, 0, /* 0x90 */
+ 0xB968, 0, 0, 0xE0D0, 0xE0CE, 0, 0xE0CF, 0xE0CD, /* 0x90 */
+ 0, 0xBBD2, 0, 0xBBD5, 0xBBD7, 0xBBD6, 0, 0, /* 0xA0 */
+ 0xBBD3, 0xBBD4, 0, 0xE8A7, 0xE8A6, 0xBE5B, 0xE8A8, 0, /* 0xA0 */
+ 0xE8A9, 0xBE5C, 0, 0, 0, 0xEC4D, 0xEC4B, 0xEEF3, /* 0xB0 */
+ 0, 0xEC49, 0xEC4A, 0xC046, 0xEC46, 0xEC4E, 0xEC48, 0xEC4C, /* 0xB0 */
+ 0xEEEF, 0, 0, 0xEEF1, 0, 0xEEF2, 0xC1F3, 0xEEEE, /* 0xC0 */
+ 0xC1F2, 0xEEF0, 0xC1EF, 0xC1F0, 0xC1F1, 0xEC47, 0, 0, /* 0xC0 */
+ 0xC2F5, 0xF16E, 0xF16C, 0xF16D, 0xC2F3, 0xC2F6, 0xC2F4, 0, /* 0xD0 */
+ 0, 0, 0xF377, 0xF378, 0xC3F6, 0, 0xF545, 0xF547, /* 0xD0 */
+ 0xF546, 0xC4C4, 0xC550, 0xF66D, 0xF66C, 0xF66B /* 0xE0 */
+ /* 0xE0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_96[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x10 */
+ 0xAAFA, 0, 0xC9AA, 0, /* 0x10 */
+ 0xCA58, 0xA6E9, 0xCA56, 0xCA59, 0xCA57, 0, 0, 0, /* 0x20 */
+ 0xCBAE, 0, 0xA8C1, 0, 0xA8C2, 0xCBB0, 0xA8BF, 0xCBAF, /* 0x20 */
+ 0xCBAD, 0xA8C0, 0xA8BE, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xCDD8, 0xCDDB, 0xAAFD, 0xCDDA, 0xCDD9, 0, 0xAAFC, /* 0x30 */
+ 0xAAFB, 0, 0xAB40, 0xCDDC, 0xAAFE, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xD0C6, 0xADAE, 0xADAF, 0xADB0, 0xD0C7, 0xD0C3, /* 0x40 */
+ 0xADAD, 0xD0C4, 0, 0xD0C5, 0xD0C2, 0, 0, 0, /* 0x50 */
+ 0xB0A4, 0, 0, 0xB0A1, 0xD445, 0xB0A2, 0xB0A5, 0xD446, /* 0x50 */
+ 0, 0xB07E, 0xB07C, 0xB07D, 0xB0A3, 0, 0, 0, /* 0x60 */
+ 0, 0, 0xB3AD, 0xD849, 0xB3B5, 0xD848, 0, 0xD84B, /* 0x60 */
+ 0xB3B1, 0xD84A, 0xB6AB, 0xB3AF, 0xB3B2, 0xB3AE, 0xB3B3, 0xB3B4, /* 0x70 */
+ 0xB3B0, 0, 0, 0, 0xD847, 0xB6A7, 0xDC7D, 0, /* 0x70 */
+ 0xDCA3, 0, 0, 0xDCA2, 0xB6AC, 0xB6A8, 0xB6A9, 0xDC7C, /* 0x80 */
+ 0xDC7E, 0xDCA1, 0xB6A4, 0xB6A6, 0, 0xB6AA, 0xB6A5, 0, /* 0x80 */
+ 0, 0xE0D3, 0xE0D1, 0xE0D2, 0xB96A, 0xB96B, 0, 0xE0D4, /* 0x90 */
+ 0xB969, 0xBBD8, 0, 0xBBDA, 0xBBD9, 0, 0xE4BB, 0, /* 0x90 */
+ 0, 0xE4BC, 0xE8AB, 0, 0xE8AA, 0, 0, 0xC047, /* 0xA0 */
+ 0xC048, 0xEC4F, 0xC049, 0, 0xEEF6, 0, 0xEEF4, 0, /* 0xA0 */
+ 0xEEF5, 0xC1F4, 0, 0xF16F, 0xC3F7, 0, 0, 0, /* 0xB0 */
+ 0xC1F5, 0xAB41, 0, 0xB0A6, 0xD447, 0, 0, 0xD84C, /* 0xB0 */
+ 0xB3B6, 0xB6AD, 0xDCA4, 0xDCA6, 0xB6AF, 0xB6AE, 0xB6B0, 0xB6B1, /* 0xC0 */
+ 0xDCA5, 0xB96E, 0xB96F, 0xB96D, 0xBBDB, 0xB96C, 0xE0D5, 0, /* 0xC0 */
+ 0, 0, 0xBBDC, 0xE8AC, 0xEC50, 0xC04A, 0xC1F6, 0xF170, /* 0xD0 */
+ 0xF174, 0xC2F9, 0xF171, 0xC2FA, 0xC2F8, 0xF175, 0xC2FB, 0xF173, /* 0xD0 */
+ 0, 0xF379, 0xC2F7, 0xC3F8, 0, 0xF8CD, 0, 0, /* 0xE0 */
+ 0xAB42, 0xB3B8, 0xB3B7, 0, 0, 0, 0, 0xB6B2, /* 0xE0 */
+ 0xDCA8, 0xDCA7, 0xB6B3, 0, 0, 0xE0D9, 0xB973, 0xB970, /* 0xF0 */
+ 0xE0D8, 0xB972, 0xE0D6, 0xB971, 0, 0xE0D7, 0, 0xE4BD /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_97[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xBBDD, 0, 0xE8AF, 0, 0xBE5D, 0xE8AD, 0xBE5E, 0xBE5F, /* 0x00 */
+ 0xE8AE, 0xBE60, 0, 0xEC51, 0, 0xC04E, 0xC04B, 0xC050, /* 0x00 */
+ 0xEC53, 0xC04C, 0xEC52, 0xC04F, 0, 0, 0xC04D, 0, /* 0x10 */
+ 0xEEF9, 0xEEFB, 0, 0, 0xC1F7, 0xEEFA, 0xC1F8, 0xEEF8, /* 0x10 */
+ 0xEEF7, 0, 0xF177, 0xF176, 0xC2FC, 0xF178, 0xF37E, 0xC3FA, /* 0x20 */
+ 0xF37D, 0xF37A, 0xC3F9, 0xF37B, 0xF37C, 0, 0xF548, 0xF549, /* 0x20 */
+ 0xC4C5, 0, 0xC553, 0, 0, 0xF66E, 0, 0, /* 0x30 */
+ 0xC551, 0xC552, 0xF66F, 0, 0, 0xC5B4, 0xC5B5, 0xF771, /* 0x30 */
+ 0, 0, 0xC645, 0xF8CF, 0xC647, 0, 0xF8CE, 0xF8D0, /* 0x40 */
+ 0xC646, 0xF957, 0, 0xF9AD, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0xAB43, 0, 0, 0, 0xB974, 0, /* 0x50 */
+ 0xE4BE, 0, 0xE8B0, 0xC051, 0xC052, 0, 0xAB44, 0, /* 0x50 */
+ 0xBE61, 0xC3FB, 0xADB1, 0, 0, 0, 0xC053, 0, /* 0x60 */
+ 0xC5E2, 0xADB2, 0xD84D, 0, 0xDCA9, 0, 0xDCAB, 0, /* 0x60 */
+ 0xDCAA, 0, 0xE0DD, 0xE0DA, 0xB975, 0, 0xB976, 0xE0DB, /* 0x70 */
+ 0xE0DC, 0, 0xE4C0, 0xE4C5, 0xBBDE, 0xE4BF, 0xE4C1, 0xE4C8, /* 0x70 */
+ 0xE4C3, 0xE4C7, 0xE4C4, 0xE4C2, 0xE4C6, 0xBBDF, 0, 0, /* 0x80 */
+ 0xE8B3, 0, 0xE8B1, 0xBE63, 0, 0xBE62, 0xE8B2, 0xBE64, /* 0x80 */
+ 0, 0, 0, 0, 0xEC56, 0, 0, 0xEC55, /* 0x90 */
+ 0xC054, 0xEC54, 0xEEFC, 0, 0xEEFE, 0xEF41, 0xEF40, 0, /* 0x90 */
+ 0xC1F9, 0xEEFD, 0xF1A1, 0xC2FD, 0xF17D, 0xF1A2, 0xC2FE, 0, /* 0xA0 */
+ 0xF17B, 0, 0xF17E, 0xF17C, 0xF179, 0xC340, 0xF17A, 0, /* 0xA0 */
+ 0, 0, 0, 0xF3A1, 0, 0, 0xF3A3, 0xF3A2, /* 0xB0 */
+ 0, 0xF54A, 0, 0xF54B, 0, 0, 0, 0xF670, /* 0xB0 */
+ 0, 0xC5B7, 0, 0xC5B6, 0xF84F, 0xF850, 0xC648, 0xF8D1, /* 0xC0 */
+ 0, 0xC669, 0, 0xADB3, 0xB6B4, 0xE4CA, 0xE4C9, 0xE8B5, /* 0xC0 */
+ 0xE8B4, 0, 0, 0xC1FA, 0xEF43, 0xEF42, 0xF1A5, 0xF1A3, /* 0xD0 */
+ 0xF1A6, 0xF1A4, 0, 0, 0xC3FC, 0xF3A4, 0xF3A5, 0xF3A6, /* 0xD0 */
+ 0, 0xF671, 0, 0xF772, 0, 0xF8D2, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0xADB4, 0, 0, /* 0xE0 */
+ 0xEC57, 0xEF44, 0, 0xADB5, 0, 0, 0xBBE0, 0, /* 0xF0 */
+ 0xEC58, 0xC341, 0xF1A7, 0xC3FD, 0, 0xF54C, 0xF54D, 0xC554 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_98[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF851, 0xADB6, 0xB3BB, 0xB3BC, 0xD84E, 0xB6B5, 0xB6B6, 0xDCAC, /* 0x00 */
+ 0xB6B7, 0, 0xB97A, 0, 0xB97C, 0xE0DF, 0xE0E0, 0xE0DE, /* 0x00 */
+ 0xB977, 0xB978, 0xB97B, 0xB979, 0, 0, 0xE4CB, 0xBBE1, /* 0x10 */
+ 0xBBE2, 0, 0, 0xE8BC, 0xBE67, 0xE8B7, 0xE8B6, 0, /* 0x10 */
+ 0xE8BB, 0xBE65, 0, 0, 0xC05B, 0, 0xE8B8, 0xE8BD, /* 0x20 */
+ 0xE8BA, 0xE8B9, 0, 0xBE66, 0, 0xC059, 0, 0xEC5A, /* 0x20 */
+ 0xC055, 0, 0xEC5B, 0, 0, 0xEC59, 0, 0xC058, /* 0x30 */
+ 0xC056, 0xC05A, 0, 0xC057, 0, 0, 0, 0, /* 0x30 */
+ 0, 0xEF45, 0, 0xEF4A, 0xEF46, 0xEF49, 0xC1FB, 0, /* 0x40 */
+ 0xEDD4, 0xEF48, 0xEF47, 0, 0xC344, 0xC342, 0xC345, 0xC343, /* 0x40 */
+ 0xF1A8, 0xF1A9, 0xF1AA, 0xC346, 0, 0, 0, 0xF3AA, /* 0x50 */
+ 0xC440, 0xF3A8, 0, 0xC441, 0xF3A7, 0xF3A9, 0xC3FE, 0xF551, /* 0x50 */
+ 0xF54E, 0, 0xF54F, 0xF550, 0xF672, 0xC556, 0, 0xC555, /* 0x60 */
+ 0, 0xF774, 0xF773, 0xC5B8, 0, 0, 0, 0xC5E3, /* 0x60 */
+ 0xC649, 0xC660, 0xF958, 0xF9AE, 0xF9AF, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xADB7, 0xDCAD, 0, 0, 0xE0E1, 0xE4CC, 0xE4CD, 0xBBE3, /* 0xA0 */
+ 0, 0xBBE4, 0xE8BE, 0xBE68, 0, 0, 0xC1FC, 0, /* 0xB0 */
+ 0xF1AB, 0, 0xC347, 0xF3AD, 0xC442, 0xF3AC, 0xF3AE, 0xF3AB, /* 0xB0 */
+ 0xF675, 0xF552, 0xF553, 0, 0xC4C6, 0, 0xF674, 0, /* 0xC0 */
+ 0, 0xF673, 0, 0xF775, 0xF9B0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0xADB8, 0, 0, 0, 0xADB9, /* 0xD0 */
+ 0, 0, 0xB0A7, 0xD448, 0, 0xD84F, 0, 0xB6B8, /* 0xE0 */
+ 0, 0xB6BB, 0xB6B9, 0xDCAE, 0, 0xB6BD, 0, 0xB6BA, /* 0xE0 */
+ 0, 0, 0xB6BC, 0, 0xB97E, 0, 0xE0E2, 0, /* 0xF0 */
+ 0, 0xE0E3, 0xE8C0, 0, 0xB97D, 0xB9A1, 0xB9A2 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_99[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE4CF, 0, 0xE4CE, 0xBBE5, 0, 0xBBE6, 0, 0xE4D0, /* 0x00 */
+ 0xE8BF, 0xBBE8, 0xBE69, 0, 0xBBE7, 0, 0, 0, /* 0x00 */
+ 0xC05C, 0xE8C1, 0xBE6B, 0xBE6A, 0xE8C2, 0xE8C5, 0xE8C3, 0xE8C4, /* 0x10 */
+ 0xBE6C, 0, 0xC061, 0xC05F, 0, 0, 0xC05E, 0xEC5D, /* 0x10 */
+ 0, 0xC060, 0, 0, 0xEC5C, 0xEF4B, 0, 0xEC5E, /* 0x20 */
+ 0xC05D, 0xEC5F, 0xEF4E, 0xEF4C, 0xEF4D, 0xEF52, 0xC34B, 0xEF51, /* 0x20 */
+ 0xEF54, 0xEF53, 0xEF50, 0xEF4F, 0, 0xC1FD, 0, 0, /* 0x30 */
+ 0, 0, 0xF1AE, 0, 0xF1AD, 0xC34A, 0xC348, 0xC349, /* 0x30 */
+ 0, 0xF1AC, 0, 0xF3B1, 0, 0xC443, 0, 0xF3B0, /* 0x40 */
+ 0xF3AF, 0xC444, 0, 0xF558, 0xF557, 0, 0xF555, 0, /* 0x40 */
+ 0xF554, 0xC4C8, 0xC4C7, 0xF559, 0xF776, 0xC5B9, 0xF677, 0xC557, /* 0x50 */
+ 0xF676, 0xF556, 0, 0xF777, 0xC5E4, 0, 0xC661, 0xF959, /* 0x50 */
+ 0, 0xF9B1, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0xADBA, 0xD850, /* 0x90 */
+ 0xEF55, 0xADBB, 0, 0, 0xE4D2, 0xE4D1, 0xEC60, 0, /* 0x90 */
+ 0, 0xEF57, 0, 0xEF56, 0, 0xC34C, 0xF3B2, 0xF3B3, /* 0xA0 */
+ 0xC4C9, 0, 0, 0xF9B2, 0xB0A8, 0xB6BF, 0xB6BE, 0xE0E4, /* 0xA0 */
+ 0xE0E6, 0xB9A4, 0xE0E5, 0xB9A3, 0xB9A5, 0xE0E7, 0, 0, /* 0xB0 */
+ 0, 0xE4D4, 0xE4D6, 0xE4D5, 0, 0xE4D8, 0, 0, /* 0xB0 */
+ 0, 0xBBE9, 0xE4D7, 0xE4D3, 0, 0, 0, 0xE4D9, /* 0xC0 */
+ 0, 0xE8CC, 0, 0xE8CF, 0xE8D1, 0xE8C7, 0xE8CB, 0xE8C8, /* 0xC0 */
+ 0xBE6E, 0xBE71, 0xBE73, 0xE8C9, 0xE8CA, 0xBE72, 0xE8CD, 0xE8D0, /* 0xD0 */
+ 0xE8CE, 0xBE74, 0, 0xBE70, 0xE8C6, 0xBE6D, 0, 0xBE6F, /* 0xD0 */
+ 0, 0, 0xC063, 0xEC66, 0xEC64, 0xEC63, 0, 0xEC69, /* 0xE0 */
+ 0, 0xEC68, 0xEC67, 0, 0xEC62, 0xC062, 0xEC61, 0, /* 0xE0 */
+ 0xEC65, 0xC064, 0, 0, 0xEF5A, 0, 0xEF5E, 0xEF5B, /* 0xF0 */
+ 0xEF5D, 0xEF5C, 0xEF59, 0xEF5F, 0xEF62, 0xEF60, 0xEF61, 0xC240 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_9A[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xC1FE, 0xEF58, 0xEF63, 0xF1B3, 0xF1B6, 0xF1B8, 0xF1B7, /* 0x00 */
+ 0, 0xF1B1, 0xF1B5, 0xF1B0, 0, 0xF1B2, 0xC34D, 0xF1AF, /* 0x00 */
+ 0, 0xF1B4, 0, 0, 0xF3C0, 0xF3B5, 0xC445, 0, /* 0x10 */
+ 0, 0xC446, 0xF3B4, 0xF3B9, 0xF3BF, 0xF3B7, 0xF3BE, 0, /* 0x10 */
+ 0xF3BB, 0, 0xF3BA, 0xF3BD, 0xF3B8, 0xF3B6, 0, 0xF3BC, /* 0x20 */
+ 0, 0xF560, 0xF55E, 0xC4CA, 0xF55D, 0xF563, 0xF561, 0, /* 0x20 */
+ 0xC4CB, 0xF55C, 0xF55A, 0, 0xF55B, 0xC4CD, 0xF55F, 0xC4CC, /* 0x30 */
+ 0xF562, 0xF678, 0xF67E, 0, 0, 0xF679, 0xC55B, 0xF6A1, /* 0x30 */
+ 0xC55A, 0xF67D, 0xF67C, 0xC559, 0xF67B, 0xC558, 0xF67A, 0, /* 0x40 */
+ 0xF77D, 0xF7A1, 0xF77E, 0, 0xF77B, 0xC5BB, 0xF778, 0xF77C, /* 0x40 */
+ 0xF7A3, 0, 0xF7A2, 0xF779, 0xF77A, 0xC5BA, 0xF852, 0xC5E7, /* 0x50 */
+ 0, 0xF853, 0xC5E5, 0xC5E6, 0, 0, 0xF8D3, 0xC64A, /* 0x50 */
+ 0xF976, 0, 0xC66A, 0, 0xF9B3, 0xC66B, 0xF9B4, 0xF9B5, /* 0x60 */
+ 0xF9C3, 0xF9C2, 0xC67A, 0xF9CD, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0xB0A9, 0, 0, 0xE0E9, 0, 0xE0E8, 0, 0xBBEA, /* 0xA0 */
+ 0xBBEB, 0xE4DA, 0, 0xE8D2, 0xEC6C, 0, 0, 0xBE75, /* 0xB0 */
+ 0xC065, 0xEC6A, 0, 0xEC6D, 0xC066, 0, 0xEF64, 0xEC6B, /* 0xB0 */
+ 0xF1B9, 0xC34E, 0xF3C1, 0, 0, 0, 0xF566, 0xF564, /* 0xC0 */
+ 0, 0, 0xF565, 0, 0, 0xF6A2, 0, 0xC55C, /* 0xC0 */
+ 0xF7A4, 0xC5EA, 0xC5BC, 0xC5E8, 0xC5E9, 0xF8D4, 0xC662, 0, /* 0xD0 */
+ 0xB0AA, 0, 0, 0, 0xF1BA, 0, 0, 0xD449, /* 0xD0 */
+ 0, 0xB9A6, 0, 0xE4DB, 0, 0, 0xBBEC, 0xE4DC, /* 0xE0 */
+ 0, 0, 0, 0xE8D4, 0xE8D3, 0xC068, 0xBE76, 0xBE77, /* 0xE0 */
+ 0, 0xE8D7, 0xE8D6, 0xE8D5, 0, 0, 0xEC6E, 0xEC71, /* 0xF0 */
+ 0, 0xEC70, 0xEC6F, 0xC067, 0xEF68, 0xEF66, 0xEF65 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_9B[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xEF67, 0, 0xC34F, 0xF1BC, 0xF1BD, 0xC350, 0, /* 0x00 */
+ 0xF1BB, 0, 0xF3C3, 0xF3C2, 0xF3C5, 0xC447, 0xF3C4, 0, /* 0x00 */
+ 0xF567, 0xF569, 0xF568, 0, 0, 0xF6A3, 0xF6A6, 0xF6A4, /* 0x10 */
+ 0xF6A5, 0xF7A5, 0xC5BD, 0, 0, 0, 0xF854, 0xF855, /* 0x10 */
+ 0xF856, 0, 0xC64B, 0xC663, 0xF9B6, 0xB0AB, 0, 0xBE78, /* 0x20 */
+ 0xC069, 0xF1BE, 0, 0xF7A6, 0, 0, 0xF9C4, 0xD44A, /* 0x20 */
+ 0, 0xC67B, 0xB0AC, 0xEC72, 0, 0xF1BF, 0, 0xF3C6, /* 0x30 */
+ 0, 0, 0xF6A7, 0xF7A7, 0xB0AD, 0, 0xE4DD, 0xE4DE, /* 0x30 */
+ 0, 0xBBED, 0xBBEE, 0xE8D9, 0xBE7A, 0xBE79, 0xE8D8, 0, /* 0x40 */
+ 0xEF69, 0, 0xF1C0, 0xF1C2, 0xF1C1, 0xC353, 0xC352, 0xC351, /* 0x40 */
+ 0, 0xC55E, 0xF6A8, 0, 0xC55D, 0xF7A9, 0xF7A8, 0, /* 0x50 */
+ 0xC64C, 0xF8D5, 0xB3BD, 0xE0EA, 0, 0, 0, 0xE4E1, /* 0x50 */
+ 0xE4DF, 0xE4E0, 0, 0, 0xE8E2, 0, 0xE8DD, 0xE8DA, /* 0x60 */
+ 0xE8E1, 0, 0, 0, 0xE8E3, 0, 0, 0xBE7C, /* 0x60 */
+ 0xE8E0, 0xE8DC, 0, 0, 0xE8DB, 0xE8DF, 0xE8DE, 0xBE7B, /* 0x70 */
+ 0, 0, 0xEC7D, 0xEC78, 0xEC76, 0xECA1, 0xEC77, 0, /* 0x70 */
+ 0xEC73, 0, 0xEC79, 0, 0, 0xEC74, 0xEF72, 0xEC75, /* 0x80 */
+ 0xECA2, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0xEC7C, 0xC06A, 0xEC7B, 0xEC7A, 0, 0xEC7E, 0, 0, /* 0x90 */
+ 0, 0, 0xEF6A, 0xEF6D, 0, 0, 0xEF6C, 0, /* 0x90 */
+ 0xEF74, 0xEF6F, 0xEF73, 0, 0xEF71, 0xEF70, 0xEF6E, 0, /* 0xA0 */
+ 0xEF6B, 0, 0xC243, 0xC242, 0, 0xC244, 0xC241, 0xEF75, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0xF1C8, 0xF1CB, 0, /* 0xB0 */
+ 0xF1C9, 0xF1CD, 0, 0, 0, 0xF1CE, 0, 0xF1C6, /* 0xB0 */
+ 0xC358, 0xF1C7, 0, 0xF1C5, 0xF1CC, 0, 0xF1C4, 0xF1C3, /* 0xC0 */
+ 0xC357, 0xC355, 0xC354, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0xF1CA, 0xF3CF, 0xF3D5, 0xC44A, 0xF3D0, /* 0xD0 */
+ 0, 0xF3D3, 0xF3D7, 0xC44B, 0xF3D2, 0, 0xF3CA, 0, /* 0xD0 */
+ 0xF3C9, 0xF3D6, 0xF3CD, 0, 0xF3CB, 0xF3D4, 0xF3CC, 0xC449, /* 0xE0 */
+ 0xC448, 0, 0xF3C7, 0xF3C8, 0xF3D1, 0, 0, 0, /* 0xE0 */
+ 0xF3CE, 0, 0, 0, 0, 0, 0, 0xF56C, /* 0xF0 */
+ 0xF56F, 0, 0, 0, 0, 0xC356 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_9C[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF56D, 0xF573, 0xF571, /* 0x00 */
+ 0xF56B, 0xF576, 0, 0xF56A, 0, 0xC4CF, 0xF572, 0, /* 0x00 */
+ 0, 0, 0xF56E, 0xC4CE, 0xF575, 0, 0, 0xF574, /* 0x10 */
+ 0, 0, 0, 0, 0xF6AB, 0xF6AA, 0, 0, /* 0x10 */
+ 0, 0xF6B1, 0, 0xF6AD, 0xF6B0, 0xC560, 0, 0, /* 0x20 */
+ 0xF6AE, 0xF6AF, 0, 0xF6A9, 0xF6AC, 0xC55F, 0, 0, /* 0x20 */
+ 0, 0xC5BF, 0xF7B4, 0xF7AF, 0xF7B3, 0, 0xF7B6, 0xF7B2, /* 0x30 */
+ 0, 0xF7AE, 0, 0xC5C1, 0xF7B1, 0xF7B5, 0xC5C0, 0xF7AC, /* 0x30 */
+ 0xF570, 0xF7B0, 0, 0, 0xF7AD, 0, 0xF7AA, 0, /* 0x40 */
+ 0xF7AB, 0xC5BE, 0xF85A, 0xF85C, 0xF85F, 0xF85B, 0xF860, 0, /* 0x40 */
+ 0xF859, 0, 0xF857, 0, 0xC5EB, 0xF85D, 0xC5ED, 0xC5EC, /* 0x50 */
+ 0xF858, 0xF85E, 0, 0, 0, 0, 0xF8DA, 0xC64D, /* 0x50 */
+ 0xF8DB, 0, 0xF8D9, 0xF8D6, 0, 0, 0xF8D8, 0xF8D7, /* 0x60 */
+ 0xF95A, 0, 0, 0, 0, 0xF95C, 0xF95B, 0, /* 0x60 */
+ 0, 0xF979, 0, 0xF978, 0xF977, 0xF97A, 0, 0xC673, /* 0x70 */
+ 0xC674, 0xF9CA, 0xF9CE, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0xB3BE, 0xDCAF, 0xE0ED, /* 0xE0 */
+ 0, 0xB9A7, 0xE0EB, 0, 0, 0xE0EC, 0, 0, /* 0xE0 */
+ 0, 0xE4E2, 0xE4E3, 0xBBF1, 0xBBEF, 0xE4E4, 0xBBF0, 0xE8E8, /* 0xF0 */
+ 0, 0xE8EB, 0xE8E5, 0xE8EC, 0xE8E4, 0xE8E6, 0, 0xE8E7 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_9D[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xE8EA, 0, 0, 0xBEA1, 0xE8EF, 0xE8EE, 0xBE7D, 0xE8E9, /* 0x00 */
+ 0xE8ED, 0xBE7E, 0, 0, 0, 0, 0, 0, /* 0x00 */
+ 0xECAC, 0, 0xC06F, 0, 0xECA7, 0xC06B, 0, 0xECA4, /* 0x10 */
+ 0xECAA, 0xECAD, 0, 0xC070, 0, 0xECA9, 0xECA6, 0xECAE, /* 0x10 */
+ 0xECA5, 0, 0xECAB, 0xC06C, 0, 0xECA3, 0xC06D, 0, /* 0x20 */
+ 0xC06E, 0xECA8, 0, 0, 0, 0xEFA9, 0xEF7A, 0xEF7B, /* 0x20 */
+ 0xEF7E, 0xEF7C, 0, 0xEF76, 0, 0, 0xEF79, 0xEFA5, /* 0x30 */
+ 0xEF7D, 0, 0, 0xC245, 0, 0xEFA7, 0xEFA4, 0xC246, /* 0x30 */
+ 0xEFA6, 0xEF77, 0xEFA2, 0xEFA3, 0, 0xEFA1, 0, 0, /* 0x40 */
+ 0, 0, 0xF1D2, 0xF1D4, 0xF1D7, 0, 0, 0xF1D1, /* 0x40 */
+ 0, 0xC359, 0xF1D9, 0xF1D0, 0xF1DA, 0, 0xF1D6, 0xF1D8, /* 0x50 */
+ 0xF1DC, 0xF1D5, 0xF1DD, 0xF1D3, 0xF1CF, 0xC35A, 0, 0xF1DB, /* 0x50 */
+ 0xC35B, 0xC44D, 0, 0, 0, 0, 0, 0xEF78, /* 0x60 */
+ 0xF3F1, 0xF3E8, 0xC44F, 0xF3E4, 0xC450, 0, 0, 0xF3ED, /* 0x60 */
+ 0xF3E7, 0xF3DD, 0xC44E, 0xF3EA, 0xF3E5, 0xF3E6, 0, 0xF3D8, /* 0x70 */
+ 0xF3DF, 0xF3EE, 0, 0xF3EB, 0, 0xF3E3, 0, 0xF3EF, /* 0x70 */
+ 0xF3DE, 0xF3D9, 0xF3EC, 0, 0xF3DB, 0xF3E9, 0xF3E0, 0xF3F0, /* 0x80 */
+ 0xF3DC, 0xC44C, 0xF3DA, 0xF3E1, 0xF3E2, 0, 0, 0, /* 0x80 */
+ 0xF57D, 0, 0xF57B, 0, 0xF5A2, 0, 0xF5AE, 0xF5A5, /* 0x90 */
+ 0xF57C, 0xF578, 0xF5A7, 0xF57E, 0xF5A3, 0xF57A, 0xF5AA, 0xF577, /* 0x90 */
+ 0xF5A1, 0xF5A6, 0xF5A8, 0xF5AB, 0xF579, 0, 0xF5AF, 0xF5B0, /* 0xA0 */
+ 0xF5A9, 0xF5AD, 0xF5A4, 0, 0xF6C1, 0xF6C4, 0, 0xC561, /* 0xA0 */
+ 0, 0xF6C3, 0xF6C8, 0xF6C6, 0xC562, 0xF6BD, 0xF6B3, 0xF6B2, /* 0xB0 */
+ 0xC564, 0xF6BF, 0xF6C0, 0xF6BC, 0xF6B4, 0, 0xF6B9, 0xF5AC, /* 0xB0 */
+ 0, 0xF6B5, 0xC563, 0xF6BB, 0, 0xF6BA, 0, 0xF6B6, /* 0xC0 */
+ 0xF6C2, 0, 0xF6B7, 0xF7BB, 0xF6C5, 0xF6C7, 0xF6BE, 0xF6B8, /* 0xC0 */
+ 0xF7BC, 0xF7BE, 0xF7B8, 0xC5C2, 0, 0xF7C5, 0xF7C3, 0xC5C3, /* 0xD0 */
+ 0xF7C2, 0xF7C1, 0xF7BA, 0xF7B7, 0xF7BD, 0xF7C6, 0xF7B9, 0xF7BF, /* 0xD0 */
+ 0, 0xF869, 0xF86E, 0xF864, 0xF867, 0xC5EE, 0xF86B, 0, /* 0xE0 */
+ 0xF872, 0xF7C0, 0, 0xF865, 0xF86F, 0xF873, 0xF86A, 0xF863, /* 0xE0 */
+ 0xF86D, 0, 0xF86C, 0xF871, 0xF870, 0xF7C4, 0xF868, 0xF862, /* 0xF0 */
+ 0xF866, 0xC64E, 0xC64F, 0xF861, 0, 0xF8E6, 0xF8DD, 0xF8E5 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_9E[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF8E2, 0xF8E3, 0xF8DC, 0xF8DF, 0xF8E7, 0xF8E1, 0xF8E0, 0xF8DE, /* 0x00 */
+ 0, 0xF8E4, 0, 0xF95D, 0, 0xF95E, 0, 0xF960, /* 0x00 */
+ 0xF95F, 0xF962, 0xF961, 0xF97C, 0xF97B, 0xF9B7, 0, 0xF9B8, /* 0x10 */
+ 0, 0xF9C5, 0xC678, 0xC67C, 0, 0xF9CF, 0xC67D, 0, /* 0x10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0xB3BF, 0, 0, /* 0x70 */
+ 0, 0xC4D0, 0xF6C9, 0, 0xC650, 0xC651, 0, 0xB3C0, /* 0x70 */
+ 0xE0EE, 0, 0xB9A8, 0xE8F0, 0, 0, 0xECB0, 0xECB1, /* 0x80 */
+ 0xECAF, 0xEFAB, 0xEFAA, 0xC247, 0xF1DF, 0xEFAC, 0xF1DE, 0, /* 0x80 */
+ 0, 0xF3F3, 0xC451, 0xC453, 0xF3F2, 0, 0, 0xC452, /* 0x90 */
+ 0, 0xF5B1, 0xF5B3, 0xF5B2, 0xF6CA, 0xC565, 0, 0xC5EF, /* 0x90 */
+ 0xF8E8, 0xF963, 0, 0, 0xF9D2, 0xB3C1, 0, 0xE4E5, /* 0xA0 */
+ 0, 0xBEA2, 0, 0, 0, 0xECB3, 0xECB2, 0, /* 0xA0 */
+ 0xEFAD, 0, 0, 0, 0xC454, 0xC4D1, 0xF7C7, 0xF9CB, /* 0xB0 */
+ 0, 0, 0, 0xB3C2, 0xBBF2, 0, 0xBEA3, 0, /* 0xB0 */
+ 0xF3F4, 0, 0xF874, 0xB6C0, 0, 0, 0, 0, /* 0xC0 */
+ 0xEFAE, 0, 0, 0, 0xC664, 0xB6C1, 0xBEA4, 0xC248, /* 0xC0 */
+ 0xF875, 0xB6C2, 0, 0xE8F1, 0xC072, 0xECB4, 0xECB5, 0, /* 0xD0 */
+ 0xC071, 0, 0xEFAF, 0xC24C, 0xC24A, 0xC24B, 0xC249, 0xF1E0, /* 0xD0 */
+ 0xC35C, 0, 0, 0, 0xF5B5, 0xF5B4, 0xF5B7, 0xF5B6, /* 0xE0 */
+ 0xC4D2, 0, 0, 0xF6CB, 0, 0xF6CD, 0xF6CC, 0xC566, /* 0xE0 */
+ 0xF7C8, 0, 0xF876, 0xF877, 0xC5F0, 0xF964, 0xF97D, 0xC675, /* 0xF0 */
+ 0, 0xDCB0, 0xECB6, 0xEFB0, 0xF3F5, 0xE0EF, 0, 0xEFB1 /* 0xF0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_9F[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xF1E2, 0xF1E1, 0, 0, 0, 0, 0xF878, 0xC652, /* 0x00 */
+ 0, 0xF965, 0xF97E, 0, 0, 0, 0xB9A9, 0xE8F2, /* 0x00 */
+ 0xE8F3, 0, 0xECB7, 0xB9AA, 0, 0xC35D, 0xF1E3, 0, /* 0x10 */
+ 0xF6CF, 0xC567, 0xF6D0, 0xF6CE, 0xF879, 0, 0xF8E9, 0, /* 0x10 */
+ 0xB9AB, 0, 0xEFB4, 0xEFB3, 0xEFB2, 0xF1E4, 0, 0, /* 0x20 */
+ 0xF1E8, 0xF1E7, 0xF1E6, 0xF1E5, 0xC35E, 0xF3F6, 0xF5B9, 0xC4D3, /* 0x20 */
+ 0xF5B8, 0xF6D1, 0xF7CB, 0xF7CA, 0xC5C4, 0xF7C9, 0xF87C, 0xF87B, /* 0x30 */
+ 0xF87A, 0, 0, 0xBBF3, 0, 0xECB8, 0xC24D, 0, /* 0x30 */
+ 0xF3F7, 0xF3F8, 0xF7CC, 0xF87D, 0, 0, 0xF8EA, 0xF966, /* 0x40 */
+ 0xF9B9, 0xF9D4, 0xBBF4, 0xC24E, 0xF1E9, 0xF3F9, 0xF6D2, 0xF87E, /* 0x40 */
+ 0, 0, 0xBEA6, 0, 0xEFB5, 0xF1EA, 0xF3FA, 0xF3FB, /* 0x50 */
+ 0xF3FC, 0xF5BE, 0, 0xF5BA, 0xC568, 0xF5BD, 0xF5BC, 0xC4D4, /* 0x50 */
+ 0xF5BB, 0xC4D6, 0, 0xC4D5, 0xF6D4, 0xF6D3, 0xC569, 0xC56A, /* 0x60 */
+ 0, 0, 0xC5C6, 0xF7CD, 0xC5C5, 0, 0xF8A3, 0xF8A4, /* 0x60 */
+ 0xF8A2, 0xF8A1, 0xC654, 0, 0xF8EB, 0xF8EC, 0xF8ED, 0xC653, /* 0x70 */
+ 0xF967, 0xF96A, 0xF969, 0xF968, 0, 0, 0xF9D3, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0xC073, 0, 0, /* 0x80 */
+ 0xC365, 0xF5BF, 0xF6D5, 0, 0xC5C7, 0xF7CE, 0, 0, /* 0x90 */
+ 0xF9D5, 0, 0, 0, 0xC074, 0, 0, 0, /* 0x90 */
+ 0xEFB6, 0, 0xF7CF, 0, 0xF9A1 /* 0xA0 */
+ /* 0xA0 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_APPLECHINTRAD_F8[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0x0081, 0x0082 /* 0x80 */
+ /* 0x80 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_FA[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ /* 0x00 */
+ 0xC94A, 0xDDFC /* 0x00 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_FE[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA14A, 0xA157, 0, 0xA159, 0xA15B, 0xA15F, 0xA160, 0xA163, /* 0x30 */
+ 0xA164, 0xA167, 0xA168, 0xA16B, 0xA16C, 0xA16F, 0xA170, 0xA173, /* 0x30 */
+ 0xA174, 0xA177, 0xA178, 0xA17B, 0xA17C, 0, 0, 0, /* 0x40 */
+ 0, 0xA1C6, 0xA1C7, 0xA1CA, 0xA1CB, 0xA1C8, 0xA1C9, 0xA15C, /* 0x40 */
+ 0xA14D, 0xA14E, 0xA14F, 0, 0xA151, 0xA152, 0xA153, 0xA154, /* 0x50 */
+ 0, 0xA17D, 0xA17E, 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A4, 0xA1CC, /* 0x50 */
+ 0xA1CD, 0xA1CE, 0xA1DE, 0xA1DF, 0xA1E0, 0xA1E1, 0xA1E2, 0, /* 0x60 */
+ 0xA242, 0xA24C, 0xA24D, 0xA24E /* 0x60 */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static sal_uInt16 const aImplUniToDBCSTab_BIG5_FF[] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+ 0xA149, 0, 0xA1AD, 0xA243, 0xA248, 0xA1AE, 0, /* 0x00 */
+ 0xA15D, 0xA15E, 0xA1AF, 0xA1CF, 0xA141, 0xA1D0, 0xA144, 0xA1FE, /* 0x00 */
+ 0xA2AF, 0xA2B0, 0xA2B1, 0xA2B2, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, /* 0x10 */
+ 0xA2B7, 0xA2B8, 0xA147, 0xA146, 0xA1D5, 0xA1D7, 0xA1D6, 0xA148, /* 0x10 */
+ 0xA249, 0xA2CF, 0xA2D0, 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4, 0xA2D5, /* 0x20 */
+ 0xA2D6, 0xA2D7, 0xA2D8, 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, /* 0x20 */
+ 0xA2DE, 0xA2DF, 0xA2E0, 0xA2E1, 0xA2E2, 0xA2E3, 0xA2E4, 0xA2E5, /* 0x30 */
+ 0xA2E6, 0xA2E7, 0xA2E8, 0, 0xA240, 0, 0, 0xA1C4, /* 0x30 */
+ 0, 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC, 0xA2ED, 0xA2EE, 0xA2EF, /* 0x40 */
+ 0xA2F0, 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7, /* 0x40 */
+ 0xA2F8, 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0xA2FD, 0xA2FE, 0xA340, /* 0x50 */
+ 0xA341, 0xA342, 0xA343, 0xA161, 0xA155, 0xA162, 0xA1E3, 0, /* 0x50 */
+ 0, 0, 0, 0, 0xA14E, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 */
+ 0xA246, 0xA247, 0, 0xA1C3, 0, 0xA244, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xE0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xF0 */
+ 0, 0, 0, 0, 0, 0xA1C5 /* 0xF0 */
+};
diff --git a/sal/textenc/tcvttcn6.tab b/sal/textenc/tcvttcn6.tab
new file mode 100644
index 000000000000..3fbff168693a
--- /dev/null
+++ b/sal/textenc/tcvttcn6.tab
@@ -0,0 +1,1733 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+/* ======================================================================= */
+
+/* This file contain the information tables for all */
+/* chinese traditional (Taiwan/HongKong) charsets: */
+/* BIG5, MS950, APPLE_CHINTRAD */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aBIG5UniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0, 1, 0, NULL }, /* 0x80 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x81 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x82 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x83 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x84 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x85 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x86 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x87 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x88 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x89 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x90 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x91 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x92 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x93 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x94 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x95 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x96 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x97 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x98 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x99 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xA0 */ /* We convert this as double byte */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A1 }, /* 0xA1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A2 }, /* 0xA2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A3 }, /* 0xA3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A4 }, /* 0xA4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A5 }, /* 0xA5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A6 }, /* 0xA6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A7 }, /* 0xA7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A8 }, /* 0xA8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A9 }, /* 0xA9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AA }, /* 0xAA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AB }, /* 0xAB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AC }, /* 0xAC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AD }, /* 0xAD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AE }, /* 0xAE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AF }, /* 0xAF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B0 }, /* 0xB0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B1 }, /* 0xB1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B2 }, /* 0xB2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B3 }, /* 0xB3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B4 }, /* 0xB4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B5 }, /* 0xB5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B6 }, /* 0xB6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B7 }, /* 0xB7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B8 }, /* 0xB8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B9 }, /* 0xB9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BA }, /* 0xBA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BB }, /* 0xBB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BC }, /* 0xBC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BD }, /* 0xBD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BE }, /* 0xBE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BF }, /* 0xBF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C0 }, /* 0xC0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C1 }, /* 0xC1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C2 }, /* 0xC2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C3 }, /* 0xC3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C4 }, /* 0xC4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C5 }, /* 0xC5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5ONLY_C6 }, /* 0xC6 */
+ { 0, 0x40, 0xFC, aImplDBCSToUniTab_BIG5ONLY_C7 }, /* 0xC7 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xC8 */ /* We convert this as double byte */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C9 }, /* 0xC9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CA }, /* 0xCA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CB }, /* 0xCB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CC }, /* 0xCC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CD }, /* 0xCD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CE }, /* 0xCE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CF }, /* 0xCF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D0 }, /* 0xD0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D1 }, /* 0xD1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D2 }, /* 0xD2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D3 }, /* 0xD3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D4 }, /* 0xD4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D5 }, /* 0xD5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D6 }, /* 0xD6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D7 }, /* 0xD7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D8 }, /* 0xD8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D9 }, /* 0xD9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DA }, /* 0xDA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DB }, /* 0xDB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DC }, /* 0xDC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DD }, /* 0xDD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DE }, /* 0xDE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DF }, /* 0xDF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E0 }, /* 0xE0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E1 }, /* 0xE1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E2 }, /* 0xE2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E3 }, /* 0xE3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E4 }, /* 0xE4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E5 }, /* 0xE5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E6 }, /* 0xE6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E7 }, /* 0xE7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E8 }, /* 0xE8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E9 }, /* 0xE9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EA }, /* 0xEA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EB }, /* 0xEB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EC }, /* 0xEC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_ED }, /* 0xED */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EE }, /* 0xEE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EF }, /* 0xEF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F0 }, /* 0xF0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F1 }, /* 0xF1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F2 }, /* 0xF2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F3 }, /* 0xF3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F4 }, /* 0xF4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F5 }, /* 0xF5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F6 }, /* 0xF6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F7 }, /* 0xF7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F8 }, /* 0xF8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F9 }, /* 0xF9 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFC */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFD */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFE */ /* We convert this as double byte */
+ { 0, 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aBIG5DBCSHighTab[256] =
+{
+ { 0x00, 0xF7, aImplUniToDBCSTab_BIG5_00 }, /* 0x00 */
+ { 1, 0, NULL }, /* 0x01 */
+ { 0xC7, 0xD9, aImplUniToDBCSTab_BIG5_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_BIG5_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_BIG5_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x13, 0xAC, aImplUniToDBCSTab_BIG5_20 }, /* 0x20 */
+ { 0x03, 0x99, aImplUniToDBCSTab_BIG5_21 }, /* 0x21 */
+ { 0x15, 0xEF, aImplUniToDBCSTab_BIG5_22 }, /* 0x22 */
+ { 1, 0, NULL }, /* 0x23 */
+ { 0x60, 0x7D, aImplUniToDBCSTab_BIG5_24 }, /* 0x24 */
+ { 0x00, 0xE5, aImplUniToDBCSTab_BIG5_25 }, /* 0x25 */
+ { 0x05, 0x42, aImplUniToDBCSTab_BIG5_26 }, /* 0x25 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_30 }, /* 0x30 */
+ { 0x05, 0x29, aImplUniToDBCSTab_BIG5_31 }, /* 0x31 */
+ { 0xA3, 0xA3, aImplUniToDBCSTab_BIG5_32 }, /* 0x32 */
+ { 0x8E, 0xD5, aImplUniToDBCSTab_BIG5_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_4E }, /* 0x4E */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_4F }, /* 0x4F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_50 }, /* 0x50 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_52 }, /* 0x52 */
+ { 0x05, 0xFC, aImplUniToDBCSTab_BIG5_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_54 }, /* 0x54 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_55 }, /* 0x55 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_56 }, /* 0x56 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_57 }, /* 0x57 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_58 }, /* 0x58 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_BIG5_59 }, /* 0x59 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_5A }, /* 0x5A */
+ { 0x01, 0xFA, aImplUniToDBCSTab_BIG5_5B }, /* 0x5B */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_5C }, /* 0x5C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_5D }, /* 0x5D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_BIG5_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_5F }, /* 0x5F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_62 }, /* 0x62 */
+ { 0x00, 0xF9, aImplUniToDBCSTab_BIG5_63 }, /* 0x63 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_BIG5_64 }, /* 0x64 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_67 }, /* 0x67 */
+ { 0x12, 0xFD, aImplUniToDBCSTab_BIG5_68 }, /* 0x68 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_BIG5_69 }, /* 0x69 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_BIG5_6A }, /* 0x6A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6B }, /* 0x6B */
+ { 0x00, 0xF9, aImplUniToDBCSTab_BIG5_6C }, /* 0x6C */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_6D }, /* 0x6D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6E }, /* 0x6E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6F }, /* 0x6F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_70 }, /* 0x70 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_71 }, /* 0x71 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_72 }, /* 0x72 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_73 }, /* 0x73 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_74 }, /* 0x74 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_75 }, /* 0x75 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_76 }, /* 0x76 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_77 }, /* 0x77 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_BIG5_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_BIG5_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_7A }, /* 0x7A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_7B }, /* 0x7B */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_BIG5_7D }, /* 0x7D */
+ { 0x03, 0x9C, aImplUniToDBCSTab_BIG5_7E }, /* 0x7E */
+ { 0x36, 0xFF, aImplUniToDBCSTab_BIG5_7F }, /* 0x7F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_80 }, /* 0x80 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_81 }, /* 0x81 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_82 }, /* 0x82 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_83 }, /* 0x83 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_84 }, /* 0x84 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_85 }, /* 0x85 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_86 }, /* 0x86 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_87 }, /* 0x87 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_88 }, /* 0x88 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_89 }, /* 0x89 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8A }, /* 0x8A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8B }, /* 0x8B */
+ { 0x37, 0xFE, aImplUniToDBCSTab_BIG5_8C }, /* 0x8C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8D }, /* 0x8D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8E }, /* 0x8E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8F }, /* 0x8F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_90 }, /* 0x90 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_91 }, /* 0x91 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_92 }, /* 0x92 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_93 }, /* 0x93 */
+ { 0x00, 0x83, aImplUniToDBCSTab_BIG5_94 }, /* 0x94 */
+ { 0x77, 0xE5, aImplUniToDBCSTab_BIG5_95 }, /* 0x95 */
+ { 0x1C, 0xFF, aImplUniToDBCSTab_BIG5_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_97 }, /* 0x97 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_98 }, /* 0x98 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_99 }, /* 0x99 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_BIG5_9A }, /* 0x9A */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_9B }, /* 0x9B */
+ { 0x05, 0xFF, aImplUniToDBCSTab_BIG5_9C }, /* 0x9C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_9D }, /* 0x9D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_9E }, /* 0x9E */
+ { 0x00, 0xA4, aImplUniToDBCSTab_BIG5_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 1, 0, NULL }, /* 0xF9 */
+ { 0x0C, 0x0D, aImplUniToDBCSTab_BIG5_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x30, 0x6B, aImplUniToDBCSTab_BIG5_FE }, /* 0xFE */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+/* FA40-FEFE --> E000-E310 */
+/* 8E40-A0FE --> E311-EEB7 */
+/* 8140-8DFE --> EEB8-F6B0 */
+/* C6A1-C6FE --> F6B1-F70E */
+/* C740-C8FE --> F70F-F848 */
+
+#define DBCS_EUDC_MS950_COUNT 5
+static ImplDBCSEUDCData const aImplMS950DBCSEUDCTab[DBCS_EUDC_MS950_COUNT] =
+{
+ /* EUDC-Range */
+ /* Lead: FA-FE */
+ /* Trail: 40-7E, A1-FE */
+ { 0xFA, 0xFE, 0x40, 0x7E, 0xA1, 0xFE, 0, 0, 2, 0x9D, 0xE000, 0xE310 },
+ /* Lead: 8E-A0 */
+ /* Trail: 40-7E, A1-FE */
+ { 0x8E, 0xA0, 0x40, 0x7E, 0xA1, 0xFE, 0, 0, 2, 0x9D, 0xE311, 0xEEB7 },
+ /* Lead: 81-8D */
+ /* Trail: 40-7E, A1-FE */
+ { 0x81, 0x8D, 0x40, 0x7E, 0xA1, 0xFE, 0, 0, 2, 0x9D, 0xEEB8, 0xF6B0 },
+ /* Lead: C6-C6 */
+ /* Trail: A1-FE */
+ { 0xC6, 0xC6, 0xA1, 0xFE, 0, 0, 0, 0, 1, 0x5E, 0xF6B1, 0xF70E },
+ /* Lead: C7-C8 */
+ /* Trail: 40-7E, A1-FE */
+ { 0xC7, 0xC8, 0x40, 0x7E, 0xA1, 0xFE, 0, 0, 2, 0x9D, 0xF70F, 0xF848 }
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplBIG5DBCSCvtData =
+{
+ aBIG5UniLeadTab,
+ aBIG5DBCSHighTab,
+ 0x00, 0xFF,
+ 0x40, 0xFE,
+ aImplMS950DBCSEUDCTab,
+ DBCS_EUDC_MS950_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplBIG5TextEncodingData
+ = { { &aImplBIG5DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 136,
+ "euc-tw",
+ "big5",
+ RTL_TEXTENCODING_INFO_MULTIBYTE | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_CHINESE_TRADITIONAL, pc code page 950, mac encoding 2 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aMS950UniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0, 1, 0, NULL }, /* 0x80 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x81 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x82 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x83 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x84 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x85 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x86 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x87 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x88 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x89 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x90 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x91 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x92 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x93 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x94 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x95 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x96 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x97 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x98 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x99 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xA0 */ /* We convert this as double byte */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A1 }, /* 0xA1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A2 }, /* 0xA2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A3 }, /* 0xA3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A4 }, /* 0xA4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A5 }, /* 0xA5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A6 }, /* 0xA6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A7 }, /* 0xA7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A8 }, /* 0xA8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A9 }, /* 0xA9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AA }, /* 0xAA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AB }, /* 0xAB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AC }, /* 0xAC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AD }, /* 0xAD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AE }, /* 0xAE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AF }, /* 0xAF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B0 }, /* 0xB0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B1 }, /* 0xB1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B2 }, /* 0xB2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B3 }, /* 0xB3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B4 }, /* 0xB4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B5 }, /* 0xB5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B6 }, /* 0xB6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B7 }, /* 0xB7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B8 }, /* 0xB8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B9 }, /* 0xB9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BA }, /* 0xBA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BB }, /* 0xBB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BC }, /* 0xBC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BD }, /* 0xBD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BE }, /* 0xBE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BF }, /* 0xBF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C0 }, /* 0xC0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C1 }, /* 0xC1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C2 }, /* 0xC2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C3 }, /* 0xC3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C4 }, /* 0xC4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C5 }, /* 0xC5 */
+ { 0, 0x40, 0x7E, aImplDBCSToUniTab_BIG5_C6 }, /* 0xC6 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xC7 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xC8 */ /* We convert this as double byte */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C9 }, /* 0xC9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CA }, /* 0xCA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CB }, /* 0xCB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CC }, /* 0xCC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CD }, /* 0xCD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CE }, /* 0xCE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CF }, /* 0xCF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D0 }, /* 0xD0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D1 }, /* 0xD1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D2 }, /* 0xD2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D3 }, /* 0xD3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D4 }, /* 0xD4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D5 }, /* 0xD5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D6 }, /* 0xD6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D7 }, /* 0xD7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D8 }, /* 0xD8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D9 }, /* 0xD9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DA }, /* 0xDA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DB }, /* 0xDB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DC }, /* 0xDC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DD }, /* 0xDD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DE }, /* 0xDE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DF }, /* 0xDF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E0 }, /* 0xE0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E1 }, /* 0xE1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E2 }, /* 0xE2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E3 }, /* 0xE3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E4 }, /* 0xE4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E5 }, /* 0xE5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E6 }, /* 0xE6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E7 }, /* 0xE7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E8 }, /* 0xE8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E9 }, /* 0xE9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EA }, /* 0xEA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EB }, /* 0xEB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EC }, /* 0xEC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_ED }, /* 0xED */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EE }, /* 0xEE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EF }, /* 0xEF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F0 }, /* 0xF0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F1 }, /* 0xF1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F2 }, /* 0xF2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F3 }, /* 0xF3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F4 }, /* 0xF4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F5 }, /* 0xF5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F6 }, /* 0xF6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F7 }, /* 0xF7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F8 }, /* 0xF8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F9 }, /* 0xF9 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFC */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFD */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFE */ /* We convert this as double byte */
+ { 0, 1, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aMS950DBCSHighTab[256] =
+{
+ { 0x00, 0xF7, aImplUniToDBCSTab_BIG5_00 }, /* 0x00 */
+ { 1, 0, NULL }, /* 0x01 */
+ { 0xC7, 0xD9, aImplUniToDBCSTab_BIG5_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_BIG5_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_BIG5_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x13, 0xAC, aImplUniToDBCSTab_BIG5_20 }, /* 0x20 */
+ { 0x03, 0x99, aImplUniToDBCSTab_BIG5_21 }, /* 0x21 */
+ { 0x15, 0xEF, aImplUniToDBCSTab_BIG5_22 }, /* 0x22 */
+ { 1, 0, NULL }, /* 0x23 */
+ { 0x60, 0x7D, aImplUniToDBCSTab_BIG5_24 }, /* 0x24 */
+ { 0x00, 0xE5, aImplUniToDBCSTab_BIG5_25 }, /* 0x25 */
+ { 0x05, 0x42, aImplUniToDBCSTab_BIG5_26 }, /* 0x25 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_30 }, /* 0x30 */
+ { 0x05, 0x29, aImplUniToDBCSTab_BIG5_31 }, /* 0x31 */
+ { 0xA3, 0xA3, aImplUniToDBCSTab_BIG5_32 }, /* 0x32 */
+ { 0x8E, 0xD5, aImplUniToDBCSTab_BIG5_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_4E }, /* 0x4E */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_4F }, /* 0x4F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_50 }, /* 0x50 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_52 }, /* 0x52 */
+ { 0x05, 0xFC, aImplUniToDBCSTab_BIG5_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_54 }, /* 0x54 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_55 }, /* 0x55 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_56 }, /* 0x56 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_57 }, /* 0x57 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_58 }, /* 0x58 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_BIG5_59 }, /* 0x59 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_5A }, /* 0x5A */
+ { 0x01, 0xFA, aImplUniToDBCSTab_BIG5_5B }, /* 0x5B */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_5C }, /* 0x5C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_5D }, /* 0x5D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_BIG5_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_5F }, /* 0x5F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_62 }, /* 0x62 */
+ { 0x00, 0xF9, aImplUniToDBCSTab_BIG5_63 }, /* 0x63 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_BIG5_64 }, /* 0x64 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_67 }, /* 0x67 */
+ { 0x12, 0xFD, aImplUniToDBCSTab_BIG5_68 }, /* 0x68 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_BIG5_69 }, /* 0x69 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_BIG5_6A }, /* 0x6A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6B }, /* 0x6B */
+ { 0x00, 0xF9, aImplUniToDBCSTab_BIG5_6C }, /* 0x6C */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_6D }, /* 0x6D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6E }, /* 0x6E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6F }, /* 0x6F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_70 }, /* 0x70 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_71 }, /* 0x71 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_72 }, /* 0x72 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_73 }, /* 0x73 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_74 }, /* 0x74 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_75 }, /* 0x75 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_76 }, /* 0x76 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_77 }, /* 0x77 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_BIG5_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_BIG5_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_7A }, /* 0x7A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_7B }, /* 0x7B */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_BIG5_7D }, /* 0x7D */
+ { 0x03, 0x9C, aImplUniToDBCSTab_BIG5_7E }, /* 0x7E */
+ { 0x36, 0xFF, aImplUniToDBCSTab_BIG5_7F }, /* 0x7F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_80 }, /* 0x80 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_81 }, /* 0x81 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_82 }, /* 0x82 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_83 }, /* 0x83 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_84 }, /* 0x84 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_85 }, /* 0x85 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_86 }, /* 0x86 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_87 }, /* 0x87 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_88 }, /* 0x88 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_89 }, /* 0x89 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8A }, /* 0x8A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8B }, /* 0x8B */
+ { 0x37, 0xFE, aImplUniToDBCSTab_BIG5_8C }, /* 0x8C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8D }, /* 0x8D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8E }, /* 0x8E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8F }, /* 0x8F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_90 }, /* 0x90 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_91 }, /* 0x91 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_92 }, /* 0x92 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_93 }, /* 0x93 */
+ { 0x00, 0x83, aImplUniToDBCSTab_BIG5_94 }, /* 0x94 */
+ { 0x77, 0xE5, aImplUniToDBCSTab_BIG5_95 }, /* 0x95 */
+ { 0x1C, 0xFF, aImplUniToDBCSTab_BIG5_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_97 }, /* 0x97 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_98 }, /* 0x98 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_99 }, /* 0x99 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_BIG5_9A }, /* 0x9A */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_9B }, /* 0x9B */
+ { 0x05, 0xFF, aImplUniToDBCSTab_BIG5_9C }, /* 0x9C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_9D }, /* 0x9D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_9E }, /* 0x9E */
+ { 0x00, 0xA4, aImplUniToDBCSTab_BIG5_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 1, 0, NULL }, /* 0xF8 */
+ { 1, 0, NULL }, /* 0xF9 */
+ { 0x0C, 0x0D, aImplUniToDBCSTab_BIG5_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x30, 0x6B, aImplUniToDBCSTab_BIG5_FE }, /* 0xFE */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplMS950DBCSCvtData =
+{
+ aMS950UniLeadTab,
+ aMS950DBCSHighTab,
+ 0x00, 0xFF,
+ 0x40, 0xFE,
+ aImplMS950DBCSEUDCTab,
+ DBCS_EUDC_MS950_COUNT
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplMS950TextEncodingData
+ = { { &aImplMS950DBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 136,
+ "euc-tw",
+ "big5",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* WIN/DOS/OS2, SCRIPT_CHINESE_TRADITIONAL, pc code page 950, mac encoding
+ 2 */
+
+/* ======================================================================= */
+
+static ImplDBCSToUniLeadTab const aAPPLECHINTRADUniLeadTab[256] =
+{
+ { 0x0000, 0, 0, NULL }, /* 0x00 */
+ { 0x0001, 0, 0, NULL }, /* 0x01 */
+ { 0x0002, 0, 0, NULL }, /* 0x02 */
+ { 0x0003, 0, 0, NULL }, /* 0x03 */
+ { 0x0004, 0, 0, NULL }, /* 0x04 */
+ { 0x0005, 0, 0, NULL }, /* 0x05 */
+ { 0x0006, 0, 0, NULL }, /* 0x06 */
+ { 0x0007, 0, 0, NULL }, /* 0x07 */
+ { 0x0008, 0, 0, NULL }, /* 0x08 */
+ { 0x0009, 0, 0, NULL }, /* 0x09 */
+ { 0x000A, 0, 0, NULL }, /* 0x0A */
+ { 0x000B, 0, 0, NULL }, /* 0x0B */
+ { 0x000C, 0, 0, NULL }, /* 0x0C */
+ { 0x000D, 0, 0, NULL }, /* 0x0D */
+ { 0x000E, 0, 0, NULL }, /* 0x0E */
+ { 0x000F, 0, 0, NULL }, /* 0x0F */
+ { 0x0010, 0, 0, NULL }, /* 0x10 */
+ { 0x0011, 0, 0, NULL }, /* 0x11 */
+ { 0x0012, 0, 0, NULL }, /* 0x12 */
+ { 0x0013, 0, 0, NULL }, /* 0x13 */
+ { 0x0014, 0, 0, NULL }, /* 0x14 */
+ { 0x0015, 0, 0, NULL }, /* 0x15 */
+ { 0x0016, 0, 0, NULL }, /* 0x16 */
+ { 0x0017, 0, 0, NULL }, /* 0x17 */
+ { 0x0018, 0, 0, NULL }, /* 0x18 */
+ { 0x0019, 0, 0, NULL }, /* 0x19 */
+ { 0x001A, 0, 0, NULL }, /* 0x1A */
+ { 0x001B, 0, 0, NULL }, /* 0x1B */
+ { 0x001C, 0, 0, NULL }, /* 0x1C */
+ { 0x001D, 0, 0, NULL }, /* 0x1D */
+ { 0x001E, 0, 0, NULL }, /* 0x1E */
+ { 0x001F, 0, 0, NULL }, /* 0x1F */
+ { 0x0020, 0, 0, NULL }, /* 0x20 */
+ { 0x0021, 0, 0, NULL }, /* 0x21 */
+ { 0x0022, 0, 0, NULL }, /* 0x22 */
+ { 0x0023, 0, 0, NULL }, /* 0x23 */
+ { 0x0024, 0, 0, NULL }, /* 0x24 */
+ { 0x0025, 0, 0, NULL }, /* 0x25 */
+ { 0x0026, 0, 0, NULL }, /* 0x26 */
+ { 0x0027, 0, 0, NULL }, /* 0x27 */
+ { 0x0028, 0, 0, NULL }, /* 0x28 */
+ { 0x0029, 0, 0, NULL }, /* 0x29 */
+ { 0x002A, 0, 0, NULL }, /* 0x2A */
+ { 0x002B, 0, 0, NULL }, /* 0x2B */
+ { 0x002C, 0, 0, NULL }, /* 0x2C */
+ { 0x002D, 0, 0, NULL }, /* 0x2D */
+ { 0x002E, 0, 0, NULL }, /* 0x2E */
+ { 0x002F, 0, 0, NULL }, /* 0x2F */
+ { 0x0030, 0, 0, NULL }, /* 0x30 */
+ { 0x0031, 0, 0, NULL }, /* 0x31 */
+ { 0x0032, 0, 0, NULL }, /* 0x32 */
+ { 0x0033, 0, 0, NULL }, /* 0x33 */
+ { 0x0034, 0, 0, NULL }, /* 0x34 */
+ { 0x0035, 0, 0, NULL }, /* 0x35 */
+ { 0x0036, 0, 0, NULL }, /* 0x36 */
+ { 0x0037, 0, 0, NULL }, /* 0x37 */
+ { 0x0038, 0, 0, NULL }, /* 0x38 */
+ { 0x0039, 0, 0, NULL }, /* 0x39 */
+ { 0x003A, 0, 0, NULL }, /* 0x3A */
+ { 0x003B, 0, 0, NULL }, /* 0x3B */
+ { 0x003C, 0, 0, NULL }, /* 0x3C */
+ { 0x003D, 0, 0, NULL }, /* 0x3D */
+ { 0x003E, 0, 0, NULL }, /* 0x3E */
+ { 0x003F, 0, 0, NULL }, /* 0x3F */
+ { 0x0040, 0, 0, NULL }, /* 0x40 */
+ { 0x0041, 0, 0, NULL }, /* 0x41 */
+ { 0x0042, 0, 0, NULL }, /* 0x42 */
+ { 0x0043, 0, 0, NULL }, /* 0x43 */
+ { 0x0044, 0, 0, NULL }, /* 0x44 */
+ { 0x0045, 0, 0, NULL }, /* 0x45 */
+ { 0x0046, 0, 0, NULL }, /* 0x46 */
+ { 0x0047, 0, 0, NULL }, /* 0x47 */
+ { 0x0048, 0, 0, NULL }, /* 0x48 */
+ { 0x0049, 0, 0, NULL }, /* 0x49 */
+ { 0x004A, 0, 0, NULL }, /* 0x4A */
+ { 0x004B, 0, 0, NULL }, /* 0x4B */
+ { 0x004C, 0, 0, NULL }, /* 0x4C */
+ { 0x004D, 0, 0, NULL }, /* 0x4D */
+ { 0x004E, 0, 0, NULL }, /* 0x4E */
+ { 0x004F, 0, 0, NULL }, /* 0x4F */
+ { 0x0050, 0, 0, NULL }, /* 0x50 */
+ { 0x0051, 0, 0, NULL }, /* 0x51 */
+ { 0x0052, 0, 0, NULL }, /* 0x52 */
+ { 0x0053, 0, 0, NULL }, /* 0x53 */
+ { 0x0054, 0, 0, NULL }, /* 0x54 */
+ { 0x0055, 0, 0, NULL }, /* 0x55 */
+ { 0x0056, 0, 0, NULL }, /* 0x56 */
+ { 0x0057, 0, 0, NULL }, /* 0x57 */
+ { 0x0058, 0, 0, NULL }, /* 0x58 */
+ { 0x0059, 0, 0, NULL }, /* 0x59 */
+ { 0x005A, 0, 0, NULL }, /* 0x5A */
+ { 0x005B, 0, 0, NULL }, /* 0x5B */
+ { 0x005C, 0, 0, NULL }, /* 0x5C */
+ { 0x005D, 0, 0, NULL }, /* 0x5D */
+ { 0x005E, 0, 0, NULL }, /* 0x5E */
+ { 0x005F, 0, 0, NULL }, /* 0x5F */
+ { 0x0060, 0, 0, NULL }, /* 0x60 */
+ { 0x0061, 0, 0, NULL }, /* 0x61 */
+ { 0x0062, 0, 0, NULL }, /* 0x62 */
+ { 0x0063, 0, 0, NULL }, /* 0x63 */
+ { 0x0064, 0, 0, NULL }, /* 0x64 */
+ { 0x0065, 0, 0, NULL }, /* 0x65 */
+ { 0x0066, 0, 0, NULL }, /* 0x66 */
+ { 0x0067, 0, 0, NULL }, /* 0x67 */
+ { 0x0068, 0, 0, NULL }, /* 0x68 */
+ { 0x0069, 0, 0, NULL }, /* 0x69 */
+ { 0x006A, 0, 0, NULL }, /* 0x6A */
+ { 0x006B, 0, 0, NULL }, /* 0x6B */
+ { 0x006C, 0, 0, NULL }, /* 0x6C */
+ { 0x006D, 0, 0, NULL }, /* 0x6D */
+ { 0x006E, 0, 0, NULL }, /* 0x6E */
+ { 0x006F, 0, 0, NULL }, /* 0x6F */
+ { 0x0070, 0, 0, NULL }, /* 0x70 */
+ { 0x0071, 0, 0, NULL }, /* 0x71 */
+ { 0x0072, 0, 0, NULL }, /* 0x72 */
+ { 0x0073, 0, 0, NULL }, /* 0x73 */
+ { 0x0074, 0, 0, NULL }, /* 0x74 */
+ { 0x0075, 0, 0, NULL }, /* 0x75 */
+ { 0x0076, 0, 0, NULL }, /* 0x76 */
+ { 0x0077, 0, 0, NULL }, /* 0x77 */
+ { 0x0078, 0, 0, NULL }, /* 0x78 */
+ { 0x0079, 0, 0, NULL }, /* 0x79 */
+ { 0x007A, 0, 0, NULL }, /* 0x7A */
+ { 0x007B, 0, 0, NULL }, /* 0x7B */
+ { 0x007C, 0, 0, NULL }, /* 0x7C */
+ { 0x007D, 0, 0, NULL }, /* 0x7D */
+ { 0x007E, 0, 0, NULL }, /* 0x7E */
+ { 0x007F, 0, 0, NULL }, /* 0x7F */
+ { 0, 1, 0, NULL }, /* 0x80 */
+ { 0xF880, 0, 0, NULL }, /* 0x81 */
+ { 0xF881, 0, 0, NULL }, /* 0x82 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x83 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x84 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x85 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x86 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x87 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x88 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x89 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x8F */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x90 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x91 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x92 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x93 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x94 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x95 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x96 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x97 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x98 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x99 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9A */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9B */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9C */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9D */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9E */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0x9F */ /* We convert this as double byte */
+ { 0x00A0, 0, 0, NULL }, /* 0xA0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A1 }, /* 0xA1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A2 }, /* 0xA2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A3 }, /* 0xA3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A4 }, /* 0xA4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A5 }, /* 0xA5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A6 }, /* 0xA6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A7 }, /* 0xA7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A8 }, /* 0xA8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_A9 }, /* 0xA9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AA }, /* 0xAA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AB }, /* 0xAB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AC }, /* 0xAC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AD }, /* 0xAD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AE }, /* 0xAE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_AF }, /* 0xAF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B0 }, /* 0xB0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B1 }, /* 0xB1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B2 }, /* 0xB2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B3 }, /* 0xB3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B4 }, /* 0xB4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B5 }, /* 0xB5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B6 }, /* 0xB6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B7 }, /* 0xB7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B8 }, /* 0xB8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_B9 }, /* 0xB9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BA }, /* 0xBA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BB }, /* 0xBB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BC }, /* 0xBC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BD }, /* 0xBD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BE }, /* 0xBE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_BF }, /* 0xBF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C0 }, /* 0xC0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C1 }, /* 0xC1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C2 }, /* 0xC2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C3 }, /* 0xC3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C4 }, /* 0xC4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C5 }, /* 0xC5 */
+ { 0, 0x40, 0x7E, aImplDBCSToUniTab_BIG5_C6 }, /* 0xC6 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xC7 */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xC8 */ /* We convert this as double byte */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_C9 }, /* 0xC9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CA }, /* 0xCA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CB }, /* 0xCB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CC }, /* 0xCC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CD }, /* 0xCD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CE }, /* 0xCE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_CF }, /* 0xCF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D0 }, /* 0xD0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D1 }, /* 0xD1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D2 }, /* 0xD2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D3 }, /* 0xD3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D4 }, /* 0xD4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D5 }, /* 0xD5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D6 }, /* 0xD6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D7 }, /* 0xD7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D8 }, /* 0xD8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_D9 }, /* 0xD9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DA }, /* 0xDA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DB }, /* 0xDB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DC }, /* 0xDC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DD }, /* 0xDD */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DE }, /* 0xDE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_DF }, /* 0xDF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E0 }, /* 0xE0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E1 }, /* 0xE1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E2 }, /* 0xE2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E3 }, /* 0xE3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E4 }, /* 0xE4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E5 }, /* 0xE5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E6 }, /* 0xE6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E7 }, /* 0xE7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E8 }, /* 0xE8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_E9 }, /* 0xE9 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EA }, /* 0xEA */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EB }, /* 0xEB */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EC }, /* 0xEC */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_ED }, /* 0xED */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EE }, /* 0xEE */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_EF }, /* 0xEF */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F0 }, /* 0xF0 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F1 }, /* 0xF1 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F2 }, /* 0xF2 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F3 }, /* 0xF3 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F4 }, /* 0xF4 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F5 }, /* 0xF5 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F6 }, /* 0xF6 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F7 }, /* 0xF7 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F8 }, /* 0xF8 */
+ { 0, 0x40, 0xFE, aImplDBCSToUniTab_BIG5_F9 }, /* 0xF9 */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFA */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFB */ /* We convert this as double byte */
+ { 0, 1, 0, aImplDoubleByteIdentifierTab }, /* 0xFC */ /* We convert this as double byte */
+ { 0x00A9, 0, 0, NULL }, /* 0xFD */
+ { 0x2122, 0, 0, NULL }, /* 0xFE */
+ { 0x2026, 0, 0, NULL } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplUniToDBCSHighTab const aAPPLECHINTRADDBCSHighTab[256] =
+{
+ { 0x00, 0xF7, aImplUniToDBCSTab_APPLECHINTRAD_00 }, /* 0x00 */
+ { 1, 0, NULL }, /* 0x01 */
+ { 0xC7, 0xD9, aImplUniToDBCSTab_BIG5_02 }, /* 0x02 */
+ { 0x91, 0xC9, aImplUniToDBCSTab_BIG5_03 }, /* 0x03 */
+ { 0x01, 0x51, aImplUniToDBCSTab_BIG5_04 }, /* 0x04 */
+ { 1, 0, NULL }, /* 0x05 */
+ { 1, 0, NULL }, /* 0x06 */
+ { 1, 0, NULL }, /* 0x07 */
+ { 1, 0, NULL }, /* 0x08 */
+ { 1, 0, NULL }, /* 0x09 */
+ { 1, 0, NULL }, /* 0x0A */
+ { 1, 0, NULL }, /* 0x0B */
+ { 1, 0, NULL }, /* 0x0C */
+ { 1, 0, NULL }, /* 0x0D */
+ { 1, 0, NULL }, /* 0x0E */
+ { 1, 0, NULL }, /* 0x0F */
+ { 1, 0, NULL }, /* 0x10 */
+ { 1, 0, NULL }, /* 0x11 */
+ { 1, 0, NULL }, /* 0x12 */
+ { 1, 0, NULL }, /* 0x13 */
+ { 1, 0, NULL }, /* 0x14 */
+ { 1, 0, NULL }, /* 0x15 */
+ { 1, 0, NULL }, /* 0x16 */
+ { 1, 0, NULL }, /* 0x17 */
+ { 1, 0, NULL }, /* 0x18 */
+ { 1, 0, NULL }, /* 0x19 */
+ { 1, 0, NULL }, /* 0x1A */
+ { 1, 0, NULL }, /* 0x1B */
+ { 1, 0, NULL }, /* 0x1C */
+ { 1, 0, NULL }, /* 0x1D */
+ { 1, 0, NULL }, /* 0x1E */
+ { 1, 0, NULL }, /* 0x1F */
+ { 0x13, 0xAC, aImplUniToDBCSTab_BIG5_20 }, /* 0x20 */
+ { 0x03, 0x99, aImplUniToDBCSTab_APPLECHINTRAD_21 }, /* 0x21 */
+ { 0x15, 0xEF, aImplUniToDBCSTab_BIG5_22 }, /* 0x22 */
+ { 1, 0, NULL }, /* 0x23 */
+ { 0x60, 0x7D, aImplUniToDBCSTab_BIG5_24 }, /* 0x24 */
+ { 0x00, 0xE5, aImplUniToDBCSTab_BIG5_25 }, /* 0x25 */
+ { 0x05, 0x42, aImplUniToDBCSTab_BIG5_26 }, /* 0x25 */
+ { 1, 0, NULL }, /* 0x27 */
+ { 1, 0, NULL }, /* 0x28 */
+ { 1, 0, NULL }, /* 0x29 */
+ { 1, 0, NULL }, /* 0x2A */
+ { 1, 0, NULL }, /* 0x2B */
+ { 1, 0, NULL }, /* 0x2C */
+ { 1, 0, NULL }, /* 0x2D */
+ { 1, 0, NULL }, /* 0x2E */
+ { 1, 0, NULL }, /* 0x2F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_30 }, /* 0x30 */
+ { 0x05, 0x29, aImplUniToDBCSTab_BIG5_31 }, /* 0x31 */
+ { 0xA3, 0xA3, aImplUniToDBCSTab_BIG5_32 }, /* 0x32 */
+ { 0x8E, 0xD5, aImplUniToDBCSTab_BIG5_33 }, /* 0x33 */
+ { 1, 0, NULL }, /* 0x34 */
+ { 1, 0, NULL }, /* 0x35 */
+ { 1, 0, NULL }, /* 0x36 */
+ { 1, 0, NULL }, /* 0x37 */
+ { 1, 0, NULL }, /* 0x38 */
+ { 1, 0, NULL }, /* 0x39 */
+ { 1, 0, NULL }, /* 0x3A */
+ { 1, 0, NULL }, /* 0x3B */
+ { 1, 0, NULL }, /* 0x3C */
+ { 1, 0, NULL }, /* 0x3D */
+ { 1, 0, NULL }, /* 0x3E */
+ { 1, 0, NULL }, /* 0x3F */
+ { 1, 0, NULL }, /* 0x40 */
+ { 1, 0, NULL }, /* 0x41 */
+ { 1, 0, NULL }, /* 0x42 */
+ { 1, 0, NULL }, /* 0x43 */
+ { 1, 0, NULL }, /* 0x44 */
+ { 1, 0, NULL }, /* 0x45 */
+ { 1, 0, NULL }, /* 0x46 */
+ { 1, 0, NULL }, /* 0x47 */
+ { 1, 0, NULL }, /* 0x48 */
+ { 1, 0, NULL }, /* 0x49 */
+ { 1, 0, NULL }, /* 0x4A */
+ { 1, 0, NULL }, /* 0x4B */
+ { 1, 0, NULL }, /* 0x4C */
+ { 1, 0, NULL }, /* 0x4D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_4E }, /* 0x4E */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_4F }, /* 0x4F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_50 }, /* 0x50 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_51 }, /* 0x51 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_52 }, /* 0x52 */
+ { 0x05, 0xFC, aImplUniToDBCSTab_BIG5_53 }, /* 0x53 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_54 }, /* 0x54 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_55 }, /* 0x55 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_56 }, /* 0x56 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_57 }, /* 0x57 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_58 }, /* 0x58 */
+ { 0x03, 0xFF, aImplUniToDBCSTab_BIG5_59 }, /* 0x59 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_5A }, /* 0x5A */
+ { 0x01, 0xFA, aImplUniToDBCSTab_BIG5_5B }, /* 0x5B */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_5C }, /* 0x5C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_5D }, /* 0x5D */
+ { 0x02, 0xFF, aImplUniToDBCSTab_BIG5_5E }, /* 0x5E */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_5F }, /* 0x5F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_60 }, /* 0x60 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_61 }, /* 0x61 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_62 }, /* 0x62 */
+ { 0x00, 0xF9, aImplUniToDBCSTab_BIG5_63 }, /* 0x63 */
+ { 0x06, 0xFF, aImplUniToDBCSTab_BIG5_64 }, /* 0x64 */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_65 }, /* 0x65 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_66 }, /* 0x66 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_67 }, /* 0x67 */
+ { 0x12, 0xFD, aImplUniToDBCSTab_BIG5_68 }, /* 0x68 */
+ { 0x04, 0xFF, aImplUniToDBCSTab_BIG5_69 }, /* 0x69 */
+ { 0x00, 0xFC, aImplUniToDBCSTab_BIG5_6A }, /* 0x6A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6B }, /* 0x6B */
+ { 0x00, 0xF9, aImplUniToDBCSTab_BIG5_6C }, /* 0x6C */
+ { 0x00, 0xFD, aImplUniToDBCSTab_BIG5_6D }, /* 0x6D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6E }, /* 0x6E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_6F }, /* 0x6F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_70 }, /* 0x70 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_71 }, /* 0x71 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_72 }, /* 0x72 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_73 }, /* 0x73 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_74 }, /* 0x74 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_75 }, /* 0x75 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_76 }, /* 0x76 */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_77 }, /* 0x77 */
+ { 0x02, 0xFF, aImplUniToDBCSTab_BIG5_78 }, /* 0x78 */
+ { 0x01, 0xFB, aImplUniToDBCSTab_BIG5_79 }, /* 0x79 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_7A }, /* 0x7A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_7B }, /* 0x7B */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_7C }, /* 0x7C */
+ { 0x00, 0xFB, aImplUniToDBCSTab_BIG5_7D }, /* 0x7D */
+ { 0x03, 0x9C, aImplUniToDBCSTab_BIG5_7E }, /* 0x7E */
+ { 0x36, 0xFF, aImplUniToDBCSTab_BIG5_7F }, /* 0x7F */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_80 }, /* 0x80 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_81 }, /* 0x81 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_82 }, /* 0x82 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_83 }, /* 0x83 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_84 }, /* 0x84 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_85 }, /* 0x85 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_86 }, /* 0x86 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_87 }, /* 0x87 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_88 }, /* 0x88 */
+ { 0x01, 0xFF, aImplUniToDBCSTab_BIG5_89 }, /* 0x89 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8A }, /* 0x8A */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8B }, /* 0x8B */
+ { 0x37, 0xFE, aImplUniToDBCSTab_BIG5_8C }, /* 0x8C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8D }, /* 0x8D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8E }, /* 0x8E */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_8F }, /* 0x8F */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_90 }, /* 0x90 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_91 }, /* 0x91 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_92 }, /* 0x92 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_93 }, /* 0x93 */
+ { 0x00, 0x83, aImplUniToDBCSTab_BIG5_94 }, /* 0x94 */
+ { 0x77, 0xE5, aImplUniToDBCSTab_BIG5_95 }, /* 0x95 */
+ { 0x1C, 0xFF, aImplUniToDBCSTab_BIG5_96 }, /* 0x96 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_97 }, /* 0x97 */
+ { 0x00, 0xFE, aImplUniToDBCSTab_BIG5_98 }, /* 0x98 */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_99 }, /* 0x99 */
+ { 0x01, 0xFE, aImplUniToDBCSTab_BIG5_9A }, /* 0x9A */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_9B }, /* 0x9B */
+ { 0x05, 0xFF, aImplUniToDBCSTab_BIG5_9C }, /* 0x9C */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_9D }, /* 0x9D */
+ { 0x00, 0xFF, aImplUniToDBCSTab_BIG5_9E }, /* 0x9E */
+ { 0x00, 0xA4, aImplUniToDBCSTab_BIG5_9F }, /* 0x9F */
+ { 1, 0, NULL }, /* 0xA0 */
+ { 1, 0, NULL }, /* 0xA1 */
+ { 1, 0, NULL }, /* 0xA2 */
+ { 1, 0, NULL }, /* 0xA3 */
+ { 1, 0, NULL }, /* 0xA4 */
+ { 1, 0, NULL }, /* 0xA5 */
+ { 1, 0, NULL }, /* 0xA6 */
+ { 1, 0, NULL }, /* 0xA7 */
+ { 1, 0, NULL }, /* 0xA8 */
+ { 1, 0, NULL }, /* 0xA9 */
+ { 1, 0, NULL }, /* 0xAA */
+ { 1, 0, NULL }, /* 0xAB */
+ { 1, 0, NULL }, /* 0xAC */
+ { 1, 0, NULL }, /* 0xAD */
+ { 1, 0, NULL }, /* 0xAE */
+ { 1, 0, NULL }, /* 0xAF */
+ { 1, 0, NULL }, /* 0xB0 */
+ { 1, 0, NULL }, /* 0xB1 */
+ { 1, 0, NULL }, /* 0xB2 */
+ { 1, 0, NULL }, /* 0xB3 */
+ { 1, 0, NULL }, /* 0xB4 */
+ { 1, 0, NULL }, /* 0xB5 */
+ { 1, 0, NULL }, /* 0xB6 */
+ { 1, 0, NULL }, /* 0xB7 */
+ { 1, 0, NULL }, /* 0xB8 */
+ { 1, 0, NULL }, /* 0xB9 */
+ { 1, 0, NULL }, /* 0xBA */
+ { 1, 0, NULL }, /* 0xBB */
+ { 1, 0, NULL }, /* 0xBC */
+ { 1, 0, NULL }, /* 0xBD */
+ { 1, 0, NULL }, /* 0xBE */
+ { 1, 0, NULL }, /* 0xBF */
+ { 1, 0, NULL }, /* 0xC0 */
+ { 1, 0, NULL }, /* 0xC1 */
+ { 1, 0, NULL }, /* 0xC2 */
+ { 1, 0, NULL }, /* 0xC3 */
+ { 1, 0, NULL }, /* 0xC4 */
+ { 1, 0, NULL }, /* 0xC5 */
+ { 1, 0, NULL }, /* 0xC6 */
+ { 1, 0, NULL }, /* 0xC7 */
+ { 1, 0, NULL }, /* 0xC8 */
+ { 1, 0, NULL }, /* 0xC9 */
+ { 1, 0, NULL }, /* 0xCA */
+ { 1, 0, NULL }, /* 0xCB */
+ { 1, 0, NULL }, /* 0xCC */
+ { 1, 0, NULL }, /* 0xCD */
+ { 1, 0, NULL }, /* 0xCE */
+ { 1, 0, NULL }, /* 0xCF */
+ { 1, 0, NULL }, /* 0xD0 */
+ { 1, 0, NULL }, /* 0xD1 */
+ { 1, 0, NULL }, /* 0xD2 */
+ { 1, 0, NULL }, /* 0xD3 */
+ { 1, 0, NULL }, /* 0xD4 */
+ { 1, 0, NULL }, /* 0xD5 */
+ { 1, 0, NULL }, /* 0xD6 */
+ { 1, 0, NULL }, /* 0xD7 */
+ { 1, 0, NULL }, /* 0xD8 */
+ { 1, 0, NULL }, /* 0xD9 */
+ { 1, 0, NULL }, /* 0xDA */
+ { 1, 0, NULL }, /* 0xDB */
+ { 1, 0, NULL }, /* 0xDC */
+ { 1, 0, NULL }, /* 0xDD */
+ { 1, 0, NULL }, /* 0xDE */
+ { 1, 0, NULL }, /* 0xDF */
+ { 1, 0, NULL }, /* 0xE0 */
+ { 1, 0, NULL }, /* 0xE1 */
+ { 1, 0, NULL }, /* 0xE2 */
+ { 1, 0, NULL }, /* 0xE3 */
+ { 1, 0, NULL }, /* 0xE4 */
+ { 1, 0, NULL }, /* 0xE5 */
+ { 1, 0, NULL }, /* 0xE6 */
+ { 1, 0, NULL }, /* 0xE7 */
+ { 1, 0, NULL }, /* 0xE8 */
+ { 1, 0, NULL }, /* 0xE9 */
+ { 1, 0, NULL }, /* 0xEA */
+ { 1, 0, NULL }, /* 0xEB */
+ { 1, 0, NULL }, /* 0xEC */
+ { 1, 0, NULL }, /* 0xED */
+ { 1, 0, NULL }, /* 0xEE */
+ { 1, 0, NULL }, /* 0xEF */
+ { 1, 0, NULL }, /* 0xF0 */
+ { 1, 0, NULL }, /* 0xF1 */
+ { 1, 0, NULL }, /* 0xF2 */
+ { 1, 0, NULL }, /* 0xF3 */
+ { 1, 0, NULL }, /* 0xF4 */
+ { 1, 0, NULL }, /* 0xF5 */
+ { 1, 0, NULL }, /* 0xF6 */
+ { 1, 0, NULL }, /* 0xF7 */
+ { 0x80, 0x81, aImplUniToDBCSTab_APPLECHINTRAD_F8 }, /* 0xF8 */
+ { 1, 0, NULL }, /* 0xF9 */
+ { 0x0C, 0x0D, aImplUniToDBCSTab_BIG5_FA }, /* 0xFA */
+ { 1, 0, NULL }, /* 0xFB */
+ { 1, 0, NULL }, /* 0xFC */
+ { 1, 0, NULL }, /* 0xFD */
+ { 0x30, 0x6B, aImplUniToDBCSTab_BIG5_FE }, /* 0xFE */
+ { 0x01, 0xFD, aImplUniToDBCSTab_BIG5_FF } /* 0xFF */
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplDBCSConvertData const aImplAPPLECHINTRADDBCSCvtData =
+{
+ aAPPLECHINTRADUniLeadTab,
+ aAPPLECHINTRADDBCSHighTab,
+ 0x00, 0xFF,
+ 0x40, 0xFE,
+ NULL,
+ 0
+};
+
+/* ----------------------------------------------------------------------- */
+
+static ImplTextEncodingData const aImplAPPLECHINTRADTextEncodingData
+ = { { &aImplAPPLECHINTRADDBCSCvtData,
+ ImplDBCSToUnicode,
+ ImplUnicodeToDBCS,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL },
+ 1,
+ 2,
+ 2,
+ 136,
+ "euc-tw",
+ "big5",
+ RTL_TEXTENCODING_INFO_MULTIBYTE };
+ /* MAC, SCRIPT_CHINESE_TRADITIONAL, pc code page 950, mac encoding 2 */
diff --git a/sal/textenc/tcvtuni1.tab b/sal/textenc/tcvtuni1.tab
new file mode 100644
index 000000000000..4efaa1ad51ad
--- /dev/null
+++ b/sal/textenc/tcvtuni1.tab
@@ -0,0 +1,100 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_CONTEXT_H
+#include "context.h"
+#endif
+
+/* Unicode Encodings */
+
+static ImplTextEncodingData const aImplUTF7TextEncodingData
+ = { { NULL,
+ ImplUTF7ToUnicode,
+ ImplUnicodeToUTF7,
+ ImplUTF7CreateUTF7TextToUnicodeContext,
+ ImplUTF7DestroyTextToUnicodeContext,
+ ImplUTF7ResetTextToUnicodeContext,
+ ImplUTF7CreateUnicodeToTextContext,
+ ImplUTF7DestroyUnicodeToTextContext,
+ ImplUTF7ResetUnicodeToTextContext },
+ 1,
+ 6,
+ 1,
+ 0,
+ "iso8859-1",
+ "utf-7",
+ RTL_TEXTENCODING_INFO_CONTEXT
+ | RTL_TEXTENCODING_INFO_UNICODE
+ | RTL_TEXTENCODING_INFO_7BIT
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_UNICODE, pc code page 850 */
+
+static ImplTextEncodingData const aImplUTF8TextEncodingData
+ = { { NULL,
+ &ImplConvertUtf8ToUnicode,
+ &ImplConvertUnicodeToUtf8,
+ &ImplCreateUtf8ToUnicodeContext,
+ &ImplDestroyContext,
+ &ImplResetUtf8ToUnicodeContext,
+ &ImplCreateUnicodeToUtf8Context,
+ &ImplDestroyContext,
+ &ImplResetUnicodeToUtf8Context },
+ 1,
+ 6,
+ 1,
+ 0,
+ "iso8859-1",
+ "utf-8",
+ RTL_TEXTENCODING_INFO_ASCII
+ | RTL_TEXTENCODING_INFO_UNICODE
+ | RTL_TEXTENCODING_INFO_MULTIBYTE
+ | RTL_TEXTENCODING_INFO_MIME };
+ /* SCRIPT_UNICODE, pc code page 850 */
+
+static char aImplJavaUtf8TextConverterTag;
+ /* The value of this tag is irrelevant. Only its address != NULL is used to
+ distinguish between RTL_TEXTENCODING_UTF8 and
+ RTL_TEXTENCODING_JAVA_UTF8. */
+
+static ImplTextEncodingData const aImplJavaUtf8TextEncodingData
+ = { { &aImplJavaUtf8TextConverterTag,
+ &ImplConvertUtf8ToUnicode,
+ &ImplConvertUnicodeToUtf8,
+ &ImplCreateUtf8ToUnicodeContext,
+ &ImplDestroyContext,
+ &ImplResetUtf8ToUnicodeContext,
+ &ImplCreateUnicodeToUtf8Context,
+ &ImplDestroyContext,
+ &ImplResetUnicodeToUtf8Context },
+ 1,
+ 3,
+ 1,
+ 0,
+ NULL,
+ NULL,
+ RTL_TEXTENCODING_INFO_UNICODE | RTL_TEXTENCODING_INFO_MULTIBYTE };
diff --git a/sal/textenc/tcvtutf7.c b/sal/textenc/tcvtutf7.c
new file mode 100644
index 000000000000..344aae6ab5dd
--- /dev/null
+++ b/sal/textenc/tcvtutf7.c
@@ -0,0 +1,588 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "tenchelp.h"
+#include "unichars.h"
+
+#ifndef _RTL_ALLOC_H
+#include "rtl/alloc.h"
+#endif
+#include "rtl/textcvt.h"
+
+/* ======================================================================= */
+
+static sal_uChar const aImplBase64Tab[64] =
+{
+ /* A-Z */
+ 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5A,
+ /* a-z */
+ 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7A,
+ /* 0-9,+,/ */
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ 0x38, 0x39, 0x2B, 0x2F
+};
+
+/* Index in Base64Tab or 0xFF, when is a invalid character */
+static sal_uChar const aImplBase64IndexTab[128] =
+{
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x00-0x07 */
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x08-0x0F */
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x10-0x17 */
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x18-0x1F */
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x20-0x27 !"#$%&' */
+ 0xFF, 0xFF, 0xFF, 62, 0xFF, 0xFF, 0xFF, 63, /* 0x28-0x2F ()*+,-./ */
+ 52, 53, 54, 55, 56, 57, 58, 59, /* 0x30-0x37 01234567 */
+ 60, 61, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x38-0x3F 89:;<=>? */
+ 0xFF, 0, 1, 2, 3, 4, 5, 6, /* 0x40-0x47 @ABCDEFG */
+ 7, 8, 9, 10, 11, 12, 13, 14, /* 0x48-0x4F HIJKLMNO */
+ 15, 16, 17, 18, 19, 20, 21, 22, /* 0x50-0x57 PQRSTUVW */
+ 23, 24, 25, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x58-0x5F XYZ[\]^_ */
+ 0xFF, 26, 27, 28, 29, 30, 31, 32, /* 0x60-0x67 `abcdefg */
+ 33, 34, 35, 36, 37, 38, 39, 40, /* 0x68-0x6F hijklmno */
+ 41, 42, 43, 44, 45, 46, 47, 48, /* 0x70-0x77 pqrstuvw */
+ 49, 50, 51, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF /* 0x78-0x7F xyz{|}~ */
+};
+
+static sal_uChar const aImplMustShiftTab[128] =
+{
+ 1, 1, 1, 1, 1, 1, 1, 1, /* 0x00-0x07 */
+ 1, 0, 0, 1, 0, 1, 1, 1, /* 0x08-0x0F 0x09 == HTAB, 0x0A == LF 0x0C == CR */
+ 1, 1, 1, 1, 1, 1, 1, 1, /* 0x10-0x17 */
+ 1, 1, 1, 1, 1, 1, 1, 1, /* 0x18-0x1F */
+ 0, 1, 1, 1, 1, 1, 1, 0, /* 0x20-0x27 !"#$%&' */
+ 0, 0, 1, 1, 0, 1, 0, 0, /* 0x28-0x2F ()*+,-./ */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30-0x37 01234567 */
+ 0, 0, 0, 1, 1, 1, 1, 0, /* 0x38-0x3F 89:;<=>? */
+ 1, 0, 0, 0, 0, 0, 0, 0, /* 0x40-0x47 @ABCDEFG */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x48-0x4F HIJKLMNO */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50-0x57 PQRSTUVW */
+ 0, 0, 0, 1, 1, 1, 1, 1, /* 0x58-0x5F XYZ[\]^_ */
+ 1, 0, 0, 0, 0, 0, 0, 0, /* 0x60-0x67 `abcdefg */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x68-0x6F hijklmno */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70-0x77 pqrstuvw */
+ 0, 0, 0, 1, 1, 1, 1, 1 /* 0x78-0x7F xyz{|}~ */
+};
+
+/* + */
+#define IMPL_SHIFT_IN_CHAR 0x2B
+/* - */
+#define IMPL_SHIFT_OUT_CHAR 0x2D
+
+/* ----------------------------------------------------------------------- */
+
+typedef struct
+{
+ int mbShifted;
+ int mbFirst;
+ int mbWroteOne;
+ sal_uInt32 mnBitBuffer;
+ sal_uInt32 mnBufferBits;
+} ImplUTF7ToUCContextData;
+
+/* ----------------------------------------------------------------------- */
+
+void* ImplUTF7CreateUTF7TextToUnicodeContext( void )
+{
+ ImplUTF7ToUCContextData* pContextData;
+ pContextData = (ImplUTF7ToUCContextData*)rtl_allocateMemory( sizeof( ImplUTF7ToUCContextData ) );
+ pContextData->mbShifted = sal_False;
+ pContextData->mbFirst = sal_False;
+ pContextData->mbWroteOne = sal_False;
+ pContextData->mnBitBuffer = 0;
+ pContextData->mnBufferBits = 0;
+ return (void*)pContextData;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void ImplUTF7DestroyTextToUnicodeContext( void* pContext )
+{
+ rtl_freeMemory( pContext );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void ImplUTF7ResetTextToUnicodeContext( void* pContext )
+{
+ ImplUTF7ToUCContextData* pContextData = (ImplUTF7ToUCContextData*)pContext;
+ pContextData->mbShifted = sal_False;
+ pContextData->mbFirst = sal_False;
+ pContextData->mbWroteOne = sal_False;
+ pContextData->mnBitBuffer = 0;
+ pContextData->mnBufferBits = 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size ImplUTF7ToUnicode( const ImplTextConverterData* pData, void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes )
+{
+ ImplUTF7ToUCContextData* pContextData = (ImplUTF7ToUCContextData*)pContext;
+ sal_uChar c ='\0';
+ sal_uChar nBase64Value = 0;
+ int bEnd = sal_False;
+ int bShifted;
+ int bFirst;
+ int bWroteOne;
+ int bBase64End;
+ sal_uInt32 nBitBuffer;
+ sal_uInt32 nBitBufferTemp;
+ sal_uInt32 nBufferBits;
+ sal_Unicode* pEndDestBuf;
+ const sal_Char* pEndSrcBuf;
+
+ (void) pData; /* unused */
+
+/* !!! Implementation not finnished !!!
+ if ( pContextData )
+ {
+ bShifted = pContextData->mbShifted;
+ bFirst = pContextData->mbFirst;
+ bWroteOne = pContextData->mbWroteOne;
+ nBitBuffer = pContextData->mnBitBuffer;
+ nBufferBits = pContextData->mnBufferBits;
+ }
+ else
+*/
+ {
+ bShifted = sal_False;
+ bFirst = sal_False;
+ bWroteOne = sal_False;
+ nBitBuffer = 0;
+ nBufferBits = 0;
+ }
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestChars;
+ pEndSrcBuf = pSrcBuf+nSrcBytes;
+ do
+ {
+ if ( pSrcBuf < pEndSrcBuf )
+ {
+ c = (sal_uChar)*pSrcBuf;
+
+ /* End, when not a base64 character */
+ bBase64End = sal_False;
+ if ( c <= 0x7F )
+ {
+ nBase64Value = aImplBase64IndexTab[c];
+ if ( nBase64Value == 0xFF )
+ bBase64End = sal_True;
+ }
+ }
+ else
+ {
+ bEnd = sal_True;
+ bBase64End = sal_True;
+ }
+
+ if ( bShifted )
+ {
+ if ( bBase64End )
+ {
+ bShifted = sal_False;
+
+ /* If the character causing us to drop out was SHIFT_IN */
+ /* or SHIFT_OUT, it may be a special escape for SHIFT_IN. */
+ /* The test for SHIFT_IN is not necessary, but allows */
+ /* an alternate form of UTF-7 where SHIFT_IN is escaped */
+ /* by SHIFT_IN. This only works for some values of */
+ /* SHIFT_IN. It is so implemented, because this comes */
+ /* from the officel unicode book (The Unicode Standard, */
+ /* Version 2.0) and so I think, that someone of the */
+ /* world has used this feature. */
+ if ( !bEnd )
+ {
+ if ( (c == IMPL_SHIFT_IN_CHAR) || (c == IMPL_SHIFT_OUT_CHAR) )
+ {
+ /* If no base64 character, and the terminating */
+ /* character of the shift sequence was the */
+ /* SHIFT_OUT_CHAR, then it't a special escape */
+ /* for SHIFT_IN_CHAR. */
+ if ( bFirst && (c == IMPL_SHIFT_OUT_CHAR) )
+ {
+ if ( pDestBuf >= pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ *pDestBuf = IMPL_SHIFT_IN_CHAR;
+ pDestBuf++;
+ bWroteOne = sal_True;
+ }
+
+ /* Skip character */
+ pSrcBuf++;
+ if ( pSrcBuf < pEndSrcBuf )
+ c = (sal_uChar)*pSrcBuf;
+ else
+ bEnd = sal_True;
+ }
+ }
+
+ /* Empty sequence not allowed, so when we don't write one */
+ /* valid char, then the sequence is corrupt */
+ if ( !bWroteOne )
+ {
+ /* When no more bytes in the source buffer, then */
+ /* this buffer may be to small */
+ if ( bEnd )
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ /* We insert here no default char, because I think */
+ /* this is better to ignore this */
+ }
+ }
+ }
+ else
+ {
+ /* Add 6 Bits from character to the bit buffer */
+ nBufferBits += 6;
+ nBitBuffer |= ((sal_uInt32)(nBase64Value & 0x3F)) << (32-nBufferBits);
+ bFirst = sal_False;
+ }
+
+ /* Extract as many full 16 bit characters as possible from the */
+ /* bit buffer. */
+ while ( (pDestBuf < pEndDestBuf) && (nBufferBits >= 16) )
+ {
+ nBitBufferTemp = nBitBuffer >> (32-16);
+ *pDestBuf = (sal_Unicode)((nBitBufferTemp) & 0xFFFF);
+ pDestBuf++;
+ nBitBuffer <<= 16;
+ nBufferBits -= 16;
+ bWroteOne = sal_True;
+ }
+
+ if ( nBufferBits >= 16 )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if ( bBase64End )
+ {
+ /* Sequence ended and we have some bits, then the */
+ /* sequence is corrupted */
+ if ( nBufferBits && nBitBuffer )
+ {
+ /* When no more bytes in the source buffer, then */
+ /* this buffer may be to small */
+ if ( bEnd )
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) != RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE )
+ {
+ if ( pDestBuf >= pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ *pDestBuf++
+ = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+ }
+ }
+
+ }
+
+ nBitBuffer = 0;
+ nBufferBits = 0;
+ }
+ }
+
+ if ( !bEnd )
+ {
+ if ( !bShifted )
+ {
+ if ( c == IMPL_SHIFT_IN_CHAR )
+ {
+ bShifted = sal_True;
+ bFirst = sal_True;
+ bWroteOne = sal_False;
+ }
+ else
+ {
+ /* No direct encoded charcater, then the buffer is */
+ /* corrupt */
+ if ( c > 0x7F )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_INVALID;
+ if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) == RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR;
+ break;
+ }
+ else if ( (nFlags & RTL_TEXTTOUNICODE_FLAGS_INVALID_MASK) != RTL_TEXTTOUNICODE_FLAGS_INVALID_IGNORE )
+ {
+ if ( pDestBuf >= pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ *pDestBuf++
+ = RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+ }
+ }
+
+ /* Write char to unicode buffer */
+ if ( pDestBuf >= pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ *pDestBuf = c;
+ pDestBuf++;
+ }
+ }
+
+ pSrcBuf++;
+ }
+ }
+ while ( !bEnd );
+
+ if ( pContextData )
+ {
+ pContextData->mbShifted = bShifted;
+ pContextData->mbFirst = bFirst;
+ pContextData->mbWroteOne = bWroteOne;
+ pContextData->mnBitBuffer = nBitBuffer;
+ pContextData->mnBufferBits = nBufferBits;
+ }
+
+ *pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf);
+ return (nDestChars - (pEndDestBuf-pDestBuf));
+}
+
+/* ======================================================================= */
+
+typedef struct
+{
+ int mbShifted;
+ sal_uInt32 mnBitBuffer;
+ sal_uInt32 mnBufferBits;
+} ImplUTF7FromUCContextData;
+
+/* ----------------------------------------------------------------------- */
+
+void* ImplUTF7CreateUnicodeToTextContext( void )
+{
+ ImplUTF7FromUCContextData* pContextData;
+ pContextData = (ImplUTF7FromUCContextData*)rtl_allocateMemory( sizeof( ImplUTF7FromUCContextData ) );
+ pContextData->mbShifted = sal_False;
+ pContextData->mnBitBuffer = 0;
+ pContextData->mnBufferBits = 0;
+ return (void*)pContextData;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void ImplUTF7DestroyUnicodeToTextContext( void* pContext )
+{
+ rtl_freeMemory( pContext );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void ImplUTF7ResetUnicodeToTextContext( void* pContext )
+{
+ ImplUTF7FromUCContextData* pContextData = (ImplUTF7FromUCContextData*)pContext;
+ pContextData->mbShifted = sal_False;
+ pContextData->mnBitBuffer = 0;
+ pContextData->mnBufferBits = 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size ImplUnicodeToUTF7( const ImplTextConverterData* pData, void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars )
+{
+ ImplUTF7FromUCContextData* pContextData = (ImplUTF7FromUCContextData*)pContext;
+ sal_Unicode c = '\0';
+ int bEnd = sal_False;
+ int bShifted;
+ int bNeedShift;
+ sal_uInt32 nBitBuffer;
+ sal_uInt32 nBitBufferTemp;
+ sal_uInt32 nBufferBits;
+ sal_Char* pEndDestBuf;
+ const sal_Unicode* pEndSrcBuf;
+
+ (void) pData; /* unused */
+ (void) nFlags; /* unused */
+
+/* !!! Implementation not finnished !!!
+ if ( pContextData )
+ {
+ bShifted = pContextData->mbShifted;
+ nBitBuffer = pContextData->mnBitBuffer;
+ nBufferBits = pContextData->mnBufferBits;
+ }
+ else
+*/
+ {
+ bShifted = sal_False;
+ nBitBuffer = 0;
+ nBufferBits = 0;
+ }
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestBytes;
+ pEndSrcBuf = pSrcBuf+nSrcChars;
+ do
+ {
+ if ( pSrcBuf < pEndSrcBuf )
+ {
+ c = *pSrcBuf;
+
+ bNeedShift = (c > 0x7F) || aImplMustShiftTab[c];
+ if ( bNeedShift && !bShifted )
+ {
+ if ( pDestBuf >= pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ *pDestBuf = IMPL_SHIFT_IN_CHAR;
+ pDestBuf++;
+ /* Special case handling for SHIFT_IN_CHAR */
+ if ( c == IMPL_SHIFT_IN_CHAR )
+ {
+ if ( pDestBuf >= pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ *pDestBuf = IMPL_SHIFT_OUT_CHAR;
+ pDestBuf++;
+ }
+ else
+ bShifted = sal_True;
+ }
+ }
+ else
+ {
+ bEnd = sal_True;
+ bNeedShift = sal_False;
+ }
+
+ if ( bShifted )
+ {
+ /* Write the character to the bit buffer, or pad the bit */
+ /* buffer out to a full base64 character */
+ if ( bNeedShift )
+ {
+ nBufferBits += 16;
+ nBitBuffer |= ((sal_uInt32)c) << (32-nBufferBits);
+ }
+ else
+ nBufferBits += (6-(nBufferBits%6))%6;
+
+ /* Flush out as many full base64 characters as possible */
+ while ( (pDestBuf < pEndDestBuf) && (nBufferBits >= 6) )
+ {
+ nBitBufferTemp = nBitBuffer >> (32-6);
+ *pDestBuf = aImplBase64Tab[nBitBufferTemp];
+ pDestBuf++;
+ nBitBuffer <<= 6;
+ nBufferBits -= 6;
+ }
+
+ if ( nBufferBits >= 6 )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ /* Write SHIFT_OUT_CHAR, when needed */
+ if ( !bNeedShift )
+ {
+ if ( pDestBuf >= pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ *pDestBuf = IMPL_SHIFT_OUT_CHAR;
+ pDestBuf++;
+ bShifted = sal_False;
+ }
+ }
+
+ if ( !bEnd )
+ {
+ /* Character can be directly endcoded */
+ if ( !bNeedShift )
+ {
+ if ( pDestBuf >= pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ *pDestBuf = (sal_Char)(sal_uChar)c;
+ pDestBuf++;
+ }
+
+ pSrcBuf++;
+ }
+ }
+ while ( !bEnd );
+
+ if ( pContextData )
+ {
+ pContextData->mbShifted = bShifted;
+ pContextData->mnBitBuffer = nBitBuffer;
+ pContextData->mnBufferBits = nBufferBits;
+ }
+
+ *pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf);
+ return (nDestBytes - (pEndDestBuf-pDestBuf));
+}
diff --git a/sal/textenc/tcvtutf8.c b/sal/textenc/tcvtutf8.c
new file mode 100644
index 000000000000..cc5141f2c3e2
--- /dev/null
+++ b/sal/textenc/tcvtutf8.c
@@ -0,0 +1,419 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "sal/types.h"
+#include "rtl/alloc.h"
+#include "rtl/textcvt.h"
+
+#include "converter.h"
+#include "tenchelp.h"
+#include "unichars.h"
+
+struct ImplUtf8ToUnicodeContext
+{
+ sal_uInt32 nUtf32;
+ int nShift;
+ sal_Bool bCheckBom;
+};
+
+struct ImplUnicodeToUtf8Context
+{
+ sal_Unicode nHighSurrogate; /* 0xFFFF: write BOM */
+};
+
+void * ImplCreateUtf8ToUnicodeContext(void)
+{
+ void * p = rtl_allocateMemory(sizeof (struct ImplUtf8ToUnicodeContext));
+ ImplResetUtf8ToUnicodeContext(p);
+ return p;
+}
+
+void ImplResetUtf8ToUnicodeContext(void * pContext)
+{
+ if (pContext != NULL)
+ {
+ ((struct ImplUtf8ToUnicodeContext *) pContext)->nShift = -1;
+ ((struct ImplUtf8ToUnicodeContext *) pContext)->bCheckBom = sal_True;
+ }
+}
+
+sal_Size ImplConvertUtf8ToUnicode(ImplTextConverterData const * pData,
+ void * pContext, sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes, sal_Unicode * pDestBuf,
+ sal_Size nDestChars, sal_uInt32 nFlags,
+ sal_uInt32 * pInfo, sal_Size * pSrcCvtBytes)
+{
+ /*
+ This function is very liberal with the UTF-8 input. Accepted are:
+ - non-shortest forms (e.g., C0 41 instead of 41 to represent U+0041)
+ - surrogates (e.g., ED A0 80 to represent U+D800)
+ - encodings with up to six bytes (everything outside the range
+ U+0000..10FFFF is considered "undefined")
+ The first two of these points allow this routine to translate from both
+ RTL_TEXTENCODING_UTF8 and RTL_TEXTENCODING_JAVA_UTF8.
+ */
+
+ int bJavaUtf8 = pData != NULL;
+ sal_uInt32 nUtf32 = 0;
+ int nShift = -1;
+ sal_Bool bCheckBom = sal_True;
+ sal_uInt32 nInfo = 0;
+ sal_uChar const * pSrcBufPtr = (sal_uChar const *) pSrcBuf;
+ sal_uChar const * pSrcBufEnd = pSrcBufPtr + nSrcBytes;
+ sal_Unicode * pDestBufPtr = pDestBuf;
+ sal_Unicode * pDestBufEnd = pDestBufPtr + nDestChars;
+
+ if (pContext != NULL)
+ {
+ nUtf32 = ((struct ImplUtf8ToUnicodeContext *) pContext)->nUtf32;
+ nShift = ((struct ImplUtf8ToUnicodeContext *) pContext)->nShift;
+ bCheckBom = ((struct ImplUtf8ToUnicodeContext *) pContext)->bCheckBom;
+ }
+
+ while (pSrcBufPtr < pSrcBufEnd)
+ {
+ sal_Bool bUndefined = sal_False;
+ int bConsume = sal_True;
+ sal_uInt32 nChar = *pSrcBufPtr++;
+ if (nShift < 0)
+ if (nChar <= 0x7F)
+ {
+ nUtf32 = nChar;
+ goto transform;
+ }
+ else if (nChar <= 0xBF)
+ goto bad_input;
+ else if (nChar <= 0xDF)
+ {
+ nUtf32 = (nChar & 0x1F) << 6;
+ nShift = 0;
+ }
+ else if (nChar <= 0xEF)
+ {
+ nUtf32 = (nChar & 0x0F) << 12;
+ nShift = 6;
+ }
+ else if (nChar <= 0xF7)
+ {
+ nUtf32 = (nChar & 0x07) << 18;
+ nShift = 12;
+ }
+ else if (nChar <= 0xFB)
+ {
+ nUtf32 = (nChar & 0x03) << 24;
+ nShift = 18;
+ }
+ else if (nChar <= 0xFD)
+ {
+ nUtf32 = (nChar & 0x01) << 30;
+ nShift = 24;
+ }
+ else
+ goto bad_input;
+ else if ((nChar & 0xC0) == 0x80)
+ {
+ nUtf32 |= (nChar & 0x3F) << nShift;
+ if (nShift == 0)
+ goto transform;
+ else
+ nShift -= 6;
+ }
+ else
+ {
+ /*
+ This byte is preceeded by a broken UTF-8 sequence; if this byte
+ is neither in the range [0x80..0xBF] nor in the range
+ [0xFE..0xFF], assume that this byte does not belong to that
+ broken sequence, but instead starts a new, legal UTF-8 sequence:
+ */
+ bConsume = nChar >= 0xFE;
+ goto bad_input;
+ }
+ continue;
+
+ transform:
+ if (!bCheckBom || nUtf32 != 0xFEFF
+ || (nFlags & RTL_TEXTTOUNICODE_FLAGS_GLOBAL_SIGNATURE) == 0
+ || bJavaUtf8)
+ {
+ if (nUtf32 <= 0xFFFF)
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Unicode) nUtf32;
+ else
+ goto no_output;
+ else if (nUtf32 <= 0x10FFFF)
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ *pDestBufPtr++ = (sal_Unicode) ImplGetHighSurrogate(nUtf32);
+ *pDestBufPtr++ = (sal_Unicode) ImplGetLowSurrogate(nUtf32);
+ }
+ else
+ goto no_output;
+ else
+ {
+ bUndefined = sal_True;
+ goto bad_input;
+ }
+ }
+ nShift = -1;
+ bCheckBom = sal_False;
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ bUndefined, sal_True, 0, nFlags, &pDestBufPtr, pDestBufEnd,
+ &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nShift = -1;
+ bCheckBom = sal_False;
+ if (!bConsume)
+ --pSrcBufPtr;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ nShift = -1;
+ bCheckBom = sal_False;
+ if (!bConsume)
+ --pSrcBufPtr;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBufPtr;
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (nShift >= 0
+ && (nInfo & (RTL_TEXTTOUNICODE_INFO_ERROR
+ | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_TEXTTOUNICODE_FLAGS_FLUSH) == 0)
+ nInfo |= RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputTextToUnicodeConversion(
+ sal_False, sal_True, 0, nFlags, &pDestBufPtr,
+ pDestBufEnd, &nInfo))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ nShift = -1;
+ bCheckBom = sal_False;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ if (pContext != NULL)
+ {
+ ((struct ImplUtf8ToUnicodeContext *) pContext)->nUtf32 = nUtf32;
+ ((struct ImplUtf8ToUnicodeContext *) pContext)->nShift = nShift;
+ ((struct ImplUtf8ToUnicodeContext *) pContext)->bCheckBom = bCheckBom;
+ }
+ if (pInfo != NULL)
+ *pInfo = nInfo;
+ if (pSrcCvtBytes != NULL)
+ *pSrcCvtBytes = (sal_Char const *) pSrcBufPtr - pSrcBuf;
+ return pDestBufPtr - pDestBuf;
+}
+
+void * ImplCreateUnicodeToUtf8Context(void)
+{
+ void * p = rtl_allocateMemory(sizeof (struct ImplUnicodeToUtf8Context));
+ ImplResetUnicodeToUtf8Context(p);
+ return p;
+}
+
+void ImplResetUnicodeToUtf8Context(void * pContext)
+{
+ if (pContext != NULL)
+ ((struct ImplUnicodeToUtf8Context *) pContext)->nHighSurrogate = 0xFFFF;
+}
+
+sal_Size ImplConvertUnicodeToUtf8(ImplTextConverterData const * pData,
+ void * pContext, sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars, sal_Char * pDestBuf,
+ sal_Size nDestBytes, sal_uInt32 nFlags,
+ sal_uInt32 * pInfo, sal_Size* pSrcCvtChars)
+{
+ int bJavaUtf8 = pData != NULL;
+ sal_Unicode nHighSurrogate = 0xFFFF;
+ sal_uInt32 nInfo = 0;
+ sal_Unicode const * pSrcBufPtr = pSrcBuf;
+ sal_Unicode const * pSrcBufEnd = pSrcBufPtr + nSrcChars;
+ sal_Char * pDestBufPtr = pDestBuf;
+ sal_Char * pDestBufEnd = pDestBufPtr + nDestBytes;
+
+ if (pContext != NULL)
+ nHighSurrogate
+ = ((struct ImplUnicodeToUtf8Context *) pContext)->nHighSurrogate;
+
+ if (nHighSurrogate == 0xFFFF)
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_GLOBAL_SIGNATURE) != 0
+ && !bJavaUtf8)
+ {
+ if (pDestBufEnd - pDestBufPtr >= 3)
+ {
+ /* Write BOM (U+FEFF) as UTF-8: */
+ *pDestBufPtr++ = (sal_Char) (unsigned char) 0xEF;
+ *pDestBufPtr++ = (sal_Char) (unsigned char) 0xBB;
+ *pDestBufPtr++ = (sal_Char) (unsigned char) 0xBF;
+ }
+ else
+ {
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ goto done;
+ }
+ }
+ nHighSurrogate = 0;
+ }
+
+ while (pSrcBufPtr < pSrcBufEnd)
+ {
+ sal_uInt32 nChar = *pSrcBufPtr++;
+ if (nHighSurrogate == 0)
+ {
+ if (ImplIsHighSurrogate(nChar) && !bJavaUtf8)
+ {
+ nHighSurrogate = (sal_Unicode) nChar;
+ continue;
+ }
+ }
+ else if (ImplIsLowSurrogate(nChar) && !bJavaUtf8)
+ nChar = ImplCombineSurrogates(nHighSurrogate, nChar);
+ else
+ goto bad_input;
+
+ if ((ImplIsLowSurrogate(nChar) && !bJavaUtf8)
+ || ImplIsNoncharacter(nChar))
+ goto bad_input;
+
+ if (nChar <= 0x7F && (!bJavaUtf8 || nChar != 0))
+ if (pDestBufPtr != pDestBufEnd)
+ *pDestBufPtr++ = (sal_Char) nChar;
+ else
+ goto no_output;
+ else if (nChar <= 0x7FF)
+ if (pDestBufEnd - pDestBufPtr >= 2)
+ {
+ *pDestBufPtr++ = (sal_Char) (0xC0 | (nChar >> 6));
+ *pDestBufPtr++ = (sal_Char) (0x80 | (nChar & 0x3F));
+ }
+ else
+ goto no_output;
+ else if (nChar <= 0xFFFF)
+ if (pDestBufEnd - pDestBufPtr >= 3)
+ {
+ *pDestBufPtr++ = (sal_Char) (0xE0 | (nChar >> 12));
+ *pDestBufPtr++ = (sal_Char) (0x80 | ((nChar >> 6) & 0x3F));
+ *pDestBufPtr++ = (sal_Char) (0x80 | (nChar & 0x3F));
+ }
+ else
+ goto no_output;
+ else if (pDestBufEnd - pDestBufPtr >= 4)
+ {
+ *pDestBufPtr++ = (sal_Char) (0xF0 | (nChar >> 18));
+ *pDestBufPtr++ = (sal_Char) (0x80 | ((nChar >> 12) & 0x3F));
+ *pDestBufPtr++ = (sal_Char) (0x80 | ((nChar >> 6) & 0x3F));
+ *pDestBufPtr++ = (sal_Char) (0x80 | (nChar & 0x3F));
+ }
+ else
+ goto no_output;
+ nHighSurrogate = 0;
+ continue;
+
+ bad_input:
+ switch (ImplHandleBadInputUnicodeToTextConversion(sal_False, 0, nFlags,
+ &pDestBufPtr,
+ pDestBufEnd, &nInfo,
+ NULL, 0, NULL))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_CONTINUE:
+ nHighSurrogate = 0;
+ continue;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ goto no_output;
+ }
+ break;
+
+ no_output:
+ --pSrcBufPtr;
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ if (nHighSurrogate != 0
+ && (nInfo & (RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL))
+ == 0)
+ {
+ if ((nFlags & RTL_UNICODETOTEXT_FLAGS_FLUSH) != 0)
+ nInfo |= RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ else
+ switch (ImplHandleBadInputUnicodeToTextConversion(sal_False, 0,
+ nFlags,
+ &pDestBufPtr,
+ pDestBufEnd,
+ &nInfo, NULL, 0,
+ NULL))
+ {
+ case IMPL_BAD_INPUT_STOP:
+ case IMPL_BAD_INPUT_CONTINUE:
+ nHighSurrogate = 0;
+ break;
+
+ case IMPL_BAD_INPUT_NO_OUTPUT:
+ nInfo |= RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+ }
+
+ done:
+ if (pContext != NULL)
+ ((struct ImplUnicodeToUtf8Context *) pContext)->nHighSurrogate
+ = nHighSurrogate;
+ if (pInfo != NULL)
+ *pInfo = nInfo;
+ if (pSrcCvtChars != NULL)
+ *pSrcCvtChars = pSrcBufPtr - pSrcBuf;
+ return pDestBufPtr - pDestBuf;
+}
diff --git a/sal/textenc/tenchelp.c b/sal/textenc/tenchelp.c
new file mode 100644
index 000000000000..73495b05a98b
--- /dev/null
+++ b/sal/textenc/tenchelp.c
@@ -0,0 +1,213 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "tenchelp.h"
+#include "unichars.h"
+#include "rtl/textcvt.h"
+#include "sal/types.h"
+
+static sal_Bool ImplGetUndefinedAsciiMultiByte(sal_uInt32 nFlags,
+ sal_Char * pBuf,
+ sal_Size nMaxLen);
+
+static sal_Bool ImplGetInvalidAsciiMultiByte(sal_uInt32 nFlags,
+ sal_Char * pBuf,
+ sal_Size nMaxLen);
+
+static int ImplIsUnicodeIgnoreChar(sal_Unicode c, sal_uInt32 nFlags);
+
+sal_Bool ImplGetUndefinedAsciiMultiByte(sal_uInt32 nFlags,
+ sal_Char * pBuf,
+ sal_Size nMaxLen)
+{
+ if (nMaxLen == 0)
+ return sal_False;
+ switch (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK)
+ {
+ case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0:
+ *pBuf = 0x00;
+ break;
+
+ case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_QUESTIONMARK:
+ default: /* RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT */
+ *pBuf = 0x3F;
+ break;
+
+ case RTL_UNICODETOTEXT_FLAGS_UNDEFINED_UNDERLINE:
+ *pBuf = 0x5F;
+ break;
+ }
+ return sal_True;
+}
+
+sal_Bool ImplGetInvalidAsciiMultiByte(sal_uInt32 nFlags,
+ sal_Char * pBuf,
+ sal_Size nMaxLen)
+{
+ if (nMaxLen == 0)
+ return sal_False;
+ switch (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK)
+ {
+ case RTL_UNICODETOTEXT_FLAGS_INVALID_0:
+ *pBuf = 0x00;
+ break;
+
+ case RTL_UNICODETOTEXT_FLAGS_INVALID_QUESTIONMARK:
+ default: /* RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT */
+ *pBuf = 0x3F;
+ break;
+
+ case RTL_UNICODETOTEXT_FLAGS_INVALID_UNDERLINE:
+ *pBuf = 0x5F;
+ break;
+ }
+ return sal_True;
+}
+
+int ImplIsUnicodeIgnoreChar( sal_Unicode c, sal_uInt32 nFlags )
+{
+ return
+ ((nFlags & RTL_UNICODETOTEXT_FLAGS_NONSPACING_IGNORE) != 0
+ && ImplIsZeroWidth(c))
+ || ((nFlags & RTL_UNICODETOTEXT_FLAGS_CONTROL_IGNORE) != 0
+ && ImplIsControlOrFormat(c))
+ || ((nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_IGNORE) != 0
+ && ImplIsPrivateUse(c));
+}
+
+/* ======================================================================= */
+
+sal_Unicode ImplGetUndefinedUnicodeChar(sal_uChar cChar, sal_uInt32 nFlags)
+{
+ return ((nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK)
+ == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE) ?
+ RTL_TEXTCVT_BYTE_PRIVATE_START + cChar :
+ RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER;
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Bool
+ImplHandleUndefinedUnicodeToTextChar(ImplTextConverterData const * pData,
+ sal_Unicode const ** ppSrcBuf,
+ sal_Unicode const * pEndSrcBuf,
+ sal_Char ** ppDestBuf,
+ sal_Char const * pEndDestBuf,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo)
+{
+ sal_Unicode c = **ppSrcBuf;
+
+ (void) pData; /* unused */
+
+ /* Should the private character map to one byte */
+ if ( (c >= RTL_TEXTCVT_BYTE_PRIVATE_START) && (c <= RTL_TEXTCVT_BYTE_PRIVATE_END) )
+ {
+ if ( nFlags & RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 )
+ {
+ **ppDestBuf = (sal_Char)(sal_uChar)(c-RTL_TEXTCVT_BYTE_PRIVATE_START);
+ (*ppDestBuf)++;
+ (*ppSrcBuf)++;
+ return sal_True;
+ }
+ }
+
+ /* Should this character ignored (Private, Non Spacing, Control) */
+ if ( ImplIsUnicodeIgnoreChar( c, nFlags ) )
+ {
+ (*ppSrcBuf)++;
+ return sal_True;
+ }
+
+ /* Surrogates Characters should result in */
+ /* one replacement character */
+ if (ImplIsHighSurrogate(c))
+ {
+ if ( *ppSrcBuf == pEndSrcBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_SRCBUFFERTOSMALL;
+ return sal_False;
+ }
+
+ c = *((*ppSrcBuf)+1);
+ if (ImplIsLowSurrogate(c))
+ (*ppSrcBuf)++;
+ else
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_INVALID;
+ if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR;
+ return sal_False;
+ }
+ else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_INVALID_MASK) == RTL_UNICODETOTEXT_FLAGS_INVALID_IGNORE )
+ {
+ (*ppSrcBuf)++;
+ return sal_True;
+ }
+ else if (ImplGetInvalidAsciiMultiByte(nFlags,
+ *ppDestBuf,
+ pEndDestBuf - *ppDestBuf))
+ {
+ ++*ppSrcBuf;
+ ++*ppDestBuf;
+ return sal_True;
+ }
+ else
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ return sal_False;
+ }
+ }
+ }
+
+ *pInfo |= RTL_UNICODETOTEXT_INFO_UNDEFINED;
+ if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR;
+ return sal_False;
+ }
+ else if ( (nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_IGNORE )
+ (*ppSrcBuf)++;
+ else if (ImplGetUndefinedAsciiMultiByte(nFlags,
+ *ppDestBuf,
+ pEndDestBuf - *ppDestBuf))
+ {
+ ++*ppSrcBuf;
+ ++*ppDestBuf;
+ }
+ else
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR
+ | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ return sal_False;
+ }
+
+ return sal_True;
+}
+
diff --git a/sal/textenc/tenchelp.h b/sal/textenc/tenchelp.h
new file mode 100644
index 000000000000..98be923472ba
--- /dev/null
+++ b/sal/textenc/tenchelp.h
@@ -0,0 +1,297 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_TENCHELP_H
+#define INCLUDED_RTL_TEXTENC_TENCHELP_H
+
+#include "rtl/tencinfo.h"
+#include "rtl/textenc.h"
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define RTL_TEXTCVT_BYTE_PRIVATE_START 0xF100
+#define RTL_TEXTCVT_BYTE_PRIVATE_END 0xF1FF
+
+/* ----------------- */
+/* - TextConverter - */
+/* ----------------- */
+
+typedef void ImplTextConverterData;
+
+typedef
+sal_Size (* ImplConvertToUnicodeProc)(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes,
+ sal_Unicode * pDestBuf,
+ sal_Size nDestChars,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtBytes);
+
+typedef
+sal_Size (* ImplConvertToTextProc)(ImplTextConverterData const * pData,
+ void * pContext,
+ sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars,
+ sal_Char * pDestBuf,
+ sal_Size nDestBytes,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo,
+ sal_Size * pSrcCvtChars);
+
+typedef void * (* ImplCreateTextContextProc)(void);
+
+typedef void (* ImplDestroyTextContextProc)(void * pContext);
+
+typedef void (* ImplResetTextContextProc)(void * pContext);
+
+typedef void * (* ImplCreateUnicodeContextProc)(void);
+
+typedef void (* ImplDestroyUnicodeContextProc)(void * pContext);
+
+typedef void (* ImplResetUnicodeContextProc)(void * pContext);
+
+typedef struct
+{
+ ImplTextConverterData const * mpConvertData;
+ ImplConvertToUnicodeProc mpConvertTextToUnicodeProc;
+ ImplConvertToTextProc mpConvertUnicodeToTextProc;
+ ImplCreateTextContextProc mpCreateTextToUnicodeContext;
+ ImplDestroyTextContextProc mpDestroyTextToUnicodeContext;
+ ImplResetTextContextProc mpResetTextToUnicodeContext;
+ ImplCreateUnicodeContextProc mpCreateUnicodeToTextContext;
+ ImplDestroyUnicodeContextProc mpDestroyUnicodeToTextContext;
+ ImplResetUnicodeContextProc mpResetUnicodeToTextContext;
+} ImplTextConverter;
+
+/* ----------------------------- */
+/* - TextEncoding - Structures - */
+/* ----------------------------- */
+
+typedef struct
+{
+ ImplTextConverter maConverter;
+ sal_uInt8 mnMinCharSize;
+ sal_uInt8 mnMaxCharSize;
+ sal_uInt8 mnAveCharSize;
+ sal_uInt8 mnBestWindowsCharset;
+ char const * mpBestUnixCharset;
+ char const * mpBestMimeCharset;
+ sal_uInt32 mnInfoFlags;
+} ImplTextEncodingData;
+
+/* ----------------------------------- */
+/* - TextConverter - Byte-Structures - */
+/* ----------------------------------- */
+
+typedef struct
+{
+ sal_uInt16 mnUniChar;
+ sal_uChar mnChar;
+ sal_uChar mnChar2;
+ // to cater for mappings like MS1258 with 1--2 bytes per Unicode char,
+ // 0 if unused
+} ImplUniCharTabData;
+
+typedef struct
+{
+ const sal_uInt16* mpToUniTab1;
+ const sal_uInt16* mpToUniTab2;
+ sal_uChar mnToUniStart1;
+ sal_uChar mnToUniEnd1;
+ sal_uChar mnToUniStart2;
+ sal_uChar mnToUniEnd2;
+ const sal_uChar* mpToCharTab1;
+ const sal_uChar* mpToCharTab2;
+ const ImplUniCharTabData* mpToCharExTab;
+ sal_uInt16 mnToCharStart1;
+ sal_uInt16 mnToCharEnd1;
+ sal_uInt16 mnToCharStart2;
+ sal_uInt16 mnToCharEnd2;
+ sal_uInt16 mnToCharExCount;
+} ImplByteConvertData;
+
+/* ----------------------------------- */
+/* - TextConverter - DBCS-Structures - */
+/* ----------------------------------- */
+
+typedef struct
+{
+ sal_uChar mnLeadStart;
+ sal_uChar mnLeadEnd;
+ sal_uChar mnTrail1Start;
+ sal_uChar mnTrail1End;
+ sal_uChar mnTrail2Start;
+ sal_uChar mnTrail2End;
+ sal_uChar mnTrail3Start;
+ sal_uChar mnTrail3End;
+ sal_uChar mnTrailCount;
+ sal_uInt16 mnTrailRangeCount;
+ sal_uInt16 mnUniStart;
+ sal_uInt16 mnUniEnd;
+} ImplDBCSEUDCData;
+
+typedef struct
+{
+ sal_uInt16 mnUniChar;
+ sal_uInt8 mnTrailStart;
+ sal_uInt8 mnTrailEnd;
+ const sal_uInt16* mpToUniTrailTab;
+} ImplDBCSToUniLeadTab;
+
+typedef struct
+{
+ sal_uInt8 mnLowStart;
+ sal_uInt8 mnLowEnd;
+ const sal_uInt16* mpToUniTrailTab;
+} ImplUniToDBCSHighTab;
+
+typedef struct
+{
+ const ImplDBCSToUniLeadTab* mpToUniLeadTab;
+ const ImplUniToDBCSHighTab* mpToDBCSHighTab;
+ sal_uChar mnLeadStart;
+ sal_uChar mnLeadEnd;
+ sal_uChar mnTrailStart;
+ sal_uChar mnTrailEnd;
+ const ImplDBCSEUDCData* mpEUDCTab;
+ sal_uInt16 mnEUDCCount;
+} ImplDBCSConvertData;
+
+/* ---------------------------------- */
+/* - TextConverter - EUC-Structures - */
+/* ---------------------------------- */
+
+typedef struct
+{
+ const ImplDBCSToUniLeadTab* mpJIS0208ToUniLeadTab;
+ const ImplDBCSToUniLeadTab* mpJIS0212ToUniLeadTab;
+ const ImplUniToDBCSHighTab* mpUniToJIS0208HighTab;
+ const ImplUniToDBCSHighTab* mpUniToJIS0212HighTab;
+} ImplEUCJPConvertData;
+
+/* --------------------------------- */
+/* - TextConverter - HelpFunctions - */
+/* --------------------------------- */
+
+sal_Unicode ImplGetUndefinedUnicodeChar(sal_uChar cChar, sal_uInt32 nFlags);
+
+sal_Bool
+ImplHandleUndefinedUnicodeToTextChar(ImplTextConverterData const * pData,
+ sal_Unicode const ** ppSrcBuf,
+ sal_Unicode const * pEndSrcBuf,
+ sal_Char ** ppDestBuf,
+ sal_Char const * pEndDestBuf,
+ sal_uInt32 nFlags,
+ sal_uInt32 * pInfo);
+ /* sal_True means 'continue,' sal_False means 'break' */
+
+/* ----------------------------- */
+/* - TextConverter - Functions - */
+/* ----------------------------- */
+
+sal_Size ImplSymbolToUnicode( const ImplTextConverterData* pData, void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo, sal_Size* pSrcCvtBytes );
+sal_Size ImplUnicodeToSymbol( const ImplTextConverterData* pData, void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo, sal_Size* pSrcCvtChars );
+sal_Size ImplCharToUnicode( const ImplTextConverterData* pData, void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo, sal_Size* pSrcCvtBytes );
+sal_Size ImplUnicodeToChar( const ImplTextConverterData* pData, void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo, sal_Size* pSrcCvtChars );
+sal_Size ImplDBCSToUnicode( const ImplTextConverterData* pData, void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes );
+sal_Size ImplUnicodeToDBCS( const ImplTextConverterData* pData, void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars );
+sal_Size ImplEUCJPToUnicode( const ImplTextConverterData* pData,
+ void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes );
+sal_Size ImplUnicodeToEUCJP( const ImplTextConverterData* pData,
+ void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars );
+void* ImplUTF7CreateUTF7TextToUnicodeContext( void );
+void ImplUTF7DestroyTextToUnicodeContext( void* pContext );
+void ImplUTF7ResetTextToUnicodeContext( void* pContext );
+sal_Size ImplUTF7ToUnicode( const ImplTextConverterData* pData, void* pContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes );
+void* ImplUTF7CreateUnicodeToTextContext( void );
+void ImplUTF7DestroyUnicodeToTextContext( void* pContext );
+void ImplUTF7ResetUnicodeToTextContext( void* pContext );
+sal_Size ImplUnicodeToUTF7( const ImplTextConverterData* pData, void* pContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars );
+
+void * ImplCreateUtf8ToUnicodeContext(void) SAL_THROW_EXTERN_C();
+void ImplResetUtf8ToUnicodeContext(void * pContext) SAL_THROW_EXTERN_C();
+sal_Size ImplConvertUtf8ToUnicode(ImplTextConverterData const * pData,
+ void * pContext, sal_Char const * pSrcBuf,
+ sal_Size nSrcBytes, sal_Unicode * pDestBuf,
+ sal_Size nDestChars, sal_uInt32 nFlags,
+ sal_uInt32 * pInfo, sal_Size * pSrcCvtBytes)
+ SAL_THROW_EXTERN_C();
+void * ImplCreateUnicodeToUtf8Context(void) SAL_THROW_EXTERN_C();
+void ImplResetUnicodeToUtf8Context(void * pContext) SAL_THROW_EXTERN_C();
+sal_Size ImplConvertUnicodeToUtf8(ImplTextConverterData const * pData,
+ void * pContext, sal_Unicode const * pSrcBuf,
+ sal_Size nSrcChars, sal_Char * pDestBuf,
+ sal_Size nDestBytes, sal_uInt32 nFlags,
+ sal_uInt32 * pInfo, sal_Size* pSrcCvtChars)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_TENCHELP_H */
diff --git a/sal/textenc/tencinfo.c b/sal/textenc/tencinfo.c
new file mode 100644
index 000000000000..30a2fef0da72
--- /dev/null
+++ b/sal/textenc/tencinfo.c
@@ -0,0 +1,1159 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "rtl/tencinfo.h"
+#include "gettextencodingdata.h"
+#include "tenchelp.h"
+
+#ifndef _RTL_ALLOC_H
+#include "rtl/alloc.h"
+#endif
+
+#ifndef INCLUDED_STDDEF_H
+#include <stddef.h>
+#define INCLUDED_STDDEF_H
+#endif
+#ifndef INCLUDED_STRING_H
+#include <string.h>
+#define INCLUDED_STRING_H
+#endif
+
+sal_Bool SAL_CALL rtl_isOctetTextEncoding(rtl_TextEncoding nEncoding)
+{
+ return (sal_Bool)
+ (nEncoding > RTL_TEXTENCODING_DONTKNOW
+ && (nEncoding <= RTL_TEXTENCODING_ADOBE_DINGBATS)
+ /* always update this! */
+ && nEncoding != 9); /* RTL_TEXTENCODING_SYSTEM */
+}
+
+/* ======================================================================= */
+
+static void Impl_toAsciiLower( const sal_Char* pName, sal_Char* pBuf )
+{
+ while ( *pName )
+ {
+ /* A-Z */
+ if ( (*pName >= 0x41) && (*pName <= 0x5A) )
+ *pBuf = (*pName)+0x20; /* toAsciiLower */
+ else
+ *pBuf = *pName;
+
+ pBuf++;
+ pName++;
+ }
+
+ *pBuf = '\0';
+}
+
+/* ----------------------------------------------------------------------- */
+
+static void Impl_toAsciiLowerAndRemoveNonAlphanumeric( const sal_Char* pName, sal_Char* pBuf )
+{
+ while ( *pName )
+ {
+ /* A-Z */
+ if ( (*pName >= 0x41) && (*pName <= 0x5A) )
+ {
+ *pBuf = (*pName)+0x20; /* toAsciiLower */
+ pBuf++;
+ }
+ /* a-z, 0-9 */
+ else if ( ((*pName >= 0x61) && (*pName <= 0x7A)) ||
+ ((*pName >= 0x30) && (*pName <= 0x39)) )
+ {
+ *pBuf = *pName;
+ pBuf++;
+ }
+
+ pName++;
+ }
+
+ *pBuf = '\0';
+}
+
+/* ----------------------------------------------------------------------- */
+
+/* pMatchStr must match with all characters in pCompStr */
+static sal_Bool Impl_matchString( const sal_Char* pCompStr, const sal_Char* pMatchStr )
+{
+ /* We test only for end in MatchStr, because the last 0 character from */
+ /* pCompStr is unequal a character in MatchStr, so the loop terminates */
+ while ( *pMatchStr )
+ {
+ if ( *pCompStr != *pMatchStr )
+ return sal_False;
+
+ pCompStr++;
+ pMatchStr++;
+ }
+
+ return sal_True;
+}
+
+/* ======================================================================= */
+
+typedef struct
+{
+ const sal_Char* mpCharsetStr;
+ rtl_TextEncoding meTextEncoding;
+} ImplStrCharsetDef;
+
+typedef struct
+{
+ const sal_Char* mpCharsetStr;
+ const ImplStrCharsetDef* mpSecondPartTab;
+} ImplStrFirstPartCharsetDef;
+
+/* ======================================================================= */
+
+sal_Bool SAL_CALL rtl_getTextEncodingInfo( rtl_TextEncoding eTextEncoding, rtl_TextEncodingInfo* pEncInfo )
+{
+ const ImplTextEncodingData* pData;
+
+ pData = Impl_getTextEncodingData( eTextEncoding );
+ if ( !pData )
+ {
+ /* HACK: For not implemented encoding, because not all
+ calls handle the errors */
+ if ( pEncInfo->StructSize < 5 )
+ return sal_False;
+ pEncInfo->MinimumCharSize = 1;
+
+ if ( pEncInfo->StructSize < 6 )
+ return sal_True;
+ pEncInfo->MaximumCharSize = 1;
+
+ if ( pEncInfo->StructSize < 7 )
+ return sal_True;
+ pEncInfo->AverageCharSize = 1;
+
+ if ( pEncInfo->StructSize < 12 )
+ return sal_True;
+ pEncInfo->Flags = 0;
+
+ return sal_False;
+ }
+
+ if ( pEncInfo->StructSize < 5 )
+ return sal_False;
+ pEncInfo->MinimumCharSize = pData->mnMinCharSize;
+
+ if ( pEncInfo->StructSize < 6 )
+ return sal_True;
+ pEncInfo->MaximumCharSize = pData->mnMaxCharSize;
+
+ if ( pEncInfo->StructSize < 7 )
+ return sal_True;
+ pEncInfo->AverageCharSize = pData->mnAveCharSize;
+
+ if ( pEncInfo->StructSize < 12 )
+ return sal_True;
+ pEncInfo->Flags = pData->mnInfoFlags;
+
+ return sal_True;
+}
+
+/* ======================================================================= */
+
+rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromWindowsCharset( sal_uInt8 nWinCharset )
+{
+ rtl_TextEncoding eTextEncoding;
+
+ switch ( nWinCharset )
+ {
+ case 0: eTextEncoding = RTL_TEXTENCODING_MS_1252; break; /* ANSI_CHARSET */
+ case 2: eTextEncoding = RTL_TEXTENCODING_SYMBOL; break; /* SYMBOL_CHARSET */
+ case 77: eTextEncoding = RTL_TEXTENCODING_APPLE_ROMAN; break;/* MAC_CHARSET */
+ case 128: eTextEncoding = RTL_TEXTENCODING_MS_932; break; /* SHIFTJIS_CHARSET */
+ case 129: eTextEncoding = RTL_TEXTENCODING_MS_949; break; /* HANGEUL_CHARSET */
+ case 130: eTextEncoding = RTL_TEXTENCODING_MS_1361; break; /* JOHAB_CHARSET */
+ case 134: eTextEncoding = RTL_TEXTENCODING_MS_936; break; /* GB2312_CHARSET */
+ case 136: eTextEncoding = RTL_TEXTENCODING_MS_950; break; /* CHINESEBIG5_CHARSET */
+ case 161: eTextEncoding = RTL_TEXTENCODING_MS_1253; break; /* GREEK_CHARSET */
+ case 162: eTextEncoding = RTL_TEXTENCODING_MS_1254; break; /* TURKISH_CHARSET */
+ case 163: eTextEncoding = RTL_TEXTENCODING_MS_1258; break; /* VIETNAMESE_CHARSET !!! */
+ case 177: eTextEncoding = RTL_TEXTENCODING_MS_1255; break; /* HEBREW_CHARSET */
+ case 178: eTextEncoding = RTL_TEXTENCODING_MS_1256; break; /* ARABIC_CHARSET */
+ case 186: eTextEncoding = RTL_TEXTENCODING_MS_1257; break; /* BALTIC_CHARSET */
+ case 204: eTextEncoding = RTL_TEXTENCODING_MS_1251; break; /* RUSSIAN_CHARSET */
+ case 222: eTextEncoding = RTL_TEXTENCODING_MS_874; break; /* THAI_CHARSET */
+ case 238: eTextEncoding = RTL_TEXTENCODING_MS_1250; break; /* EASTEUROPE_CHARSET */
+ case 255: eTextEncoding = RTL_TEXTENCODING_IBM_850; break; /* OEM_CHARSET */
+ default: eTextEncoding = RTL_TEXTENCODING_DONTKNOW; break;
+ };
+
+ return eTextEncoding;
+}
+
+/* ----------------------------------------------------------------------- */
+
+#if 0
+
+rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromMacTextEncoding( sal_uInt32 nMacTextEncoding )
+{
+ rtl_TextEncoding eTextEncoding;
+
+ switch ( nMacTextEncoding )
+ {
+ case 0: eTextEncoding = RTL_TEXTENCODING_APPLE_ROMAN; break;
+ case 1: eTextEncoding = RTL_TEXTENCODING_APPLE_JAPANESE; break;
+ case 2: eTextEncoding = RTL_TEXTENCODING_APPLE_CHINTRAD; break;
+ case 3: eTextEncoding = RTL_TEXTENCODING_APPLE_KOREAN; break;
+ case 4: eTextEncoding = RTL_TEXTENCODING_APPLE_ARABIC; break;
+ case 5: eTextEncoding = RTL_TEXTENCODING_APPLE_HEBREW; break;
+ case 6: eTextEncoding = RTL_TEXTENCODING_APPLE_GREEK; break;
+ case 7: eTextEncoding = RTL_TEXTENCODING_APPLE_CYRILLIC; break;
+ /* RIGHT-TO-LEFT SYMBOLS = 8 ??? */
+ case 9: eTextEncoding = RTL_TEXTENCODING_APPLE_DEVANAGARI; break;
+ case 10: eTextEncoding = RTL_TEXTENCODING_APPLE_GURMUKHI; break;
+ case 11: eTextEncoding = RTL_TEXTENCODING_APPLE_GUJARATI; break;
+ /* MacOriya = 12 */
+ /* MacBengali = 13 */
+ /* MacTamil = 14 */
+ /* MacTelugu = 15 */
+ /* MacKannada = 16 */
+ /* MacMalayalam = 17 */
+ /* MacSinhalese = 18 */
+ /* MacBurmese = 19 */
+ /* MacKhmer = 20 */
+ case 21: eTextEncoding = RTL_TEXTENCODING_APPLE_THAI; break;
+ /* MacLaotian = 22 */
+ /* MacGeorgian = 23 */
+ /* MacArmenian = 24 */
+ case 25: eTextEncoding = RTL_TEXTENCODING_APPLE_CHINSIMP; break;
+ /* MacTibetan = 26 */
+ /* MacMongolian = 27 */
+ /* MacEthiopic = 28 */
+ case 29: eTextEncoding = RTL_TEXTENCODING_APPLE_CENTEURO; break; /* MacCentralEurRoman */
+ /* MacVietnamese = 30 */
+ /* MacExtArabic = 31 */
+ case 32: eTextEncoding = RTL_TEXTENCODING_SYMBOL; break;
+ case 33: eTextEncoding = RTL_TEXTENCODING_SYMBOL; break; /* MacSymbol */
+ case 34: eTextEncoding = RTL_TEXTENCODING_SYMBOL; break; /* MacDingbats */
+ case 35: eTextEncoding = RTL_TEXTENCODING_APPLE_TURKISH; break; /* MacTurkish */
+ case 36: eTextEncoding = RTL_TEXTENCODING_APPLE_CROATIAN; break; /* MacCroatian */
+ case 37: eTextEncoding = RTL_TEXTENCODING_APPLE_ICELAND; break; /* MacIcelandic */
+ case 38: eTextEncoding = RTL_TEXTENCODING_APPLE_ROMANIAN; break; /* MacRomanian */
+ /* MacCeltic = 39 */
+ /* MacGaelic = 40 */
+ /* Beginning in Mac OS 8.5, the set of Mac OS script codes has been */
+ /* extended for some Mac OS components to include Unicode. Some of */
+ /* these components have only 7 bits available for script code, so */
+ /* kTextEncodingUnicodeDefault cannot be used to indicate Unicode. */
+ /* Instead, the following meta-value is used to indicate Unicode */
+ /* handled as a special Mac OS script code; TEC handles this value */
+ /* like kTextEncodingUnicodeDefault. */
+ /* The following use script code 4, smArabic */
+ case 0x08C: eTextEncoding = RTL_TEXTENCODING_APPLE_FARSI; break; /* MacFarsi */
+ /* The following use script code 7, smCyrillic */
+ case 0x098: eTextEncoding = RTL_TEXTENCODING_APPLE_UKRAINIAN; break; /* MacUkrainian */
+ /* The following use script code 28, smEthiopic */
+ /* MacInuit = 0xEC */
+ /* The following use script code 32, smUninterp */
+ case 0x0FC: eTextEncoding = RTL_TEXTENCODING_SYMBOL; break; /* MacVT100 - VT100/102 font */
+ /* Special Mac OS encodings */
+ /* MacHFS = 0xFF */ /* metavalue. */
+ /* Unicode & ISO UCS encodings begin at 0x100 */
+ case 0x100: eTextEncoding = RTL_TEXTENCODING_UNICODE; break; /* UnicodeDefault */
+ case 0x101: eTextEncoding = RTL_TEXTENCODING_UNICODE; break; /* UnicodeV1_1 / ISO10646_1993 */
+ case 0x103: eTextEncoding = RTL_TEXTENCODING_UNICODE; break; /* UnicodeV2_1 - new location for Korean Hangul / UnicodeV2_1 */
+ /* ISO 8-bit and 7-bit encodings begin at 0x200 */
+ case 0x201: eTextEncoding = RTL_TEXTENCODING_ISO_8859_1; break; /* ISOLatin1 - ISO 8859-1 */
+ case 0x202: eTextEncoding = RTL_TEXTENCODING_ISO_8859_2; break; /* ISOLatin2 - ISO 8859-2 */
+ case 0x203: eTextEncoding = RTL_TEXTENCODING_ISO_8859_3; break; /* ISOLatin3 - ISO 8859-3 */
+ case 0x204: eTextEncoding = RTL_TEXTENCODING_ISO_8859_4; break; /* ISOLatin4 - ISO 8859-4 */
+ case 0x205: eTextEncoding = RTL_TEXTENCODING_ISO_8859_5; break; /* ISOLatinCyrillic - ISO 8859-5 */
+ case 0x206: eTextEncoding = RTL_TEXTENCODING_ISO_8859_6; break; /* ISOLatinArabic - ISO 8859-6, = ASMO 708, =DOS CP 708 */
+ case 0x207: eTextEncoding = RTL_TEXTENCODING_ISO_8859_7; break; /* ISOLatinGreek - ISO 8859-7 */
+ case 0x208: eTextEncoding = RTL_TEXTENCODING_ISO_8859_8; break; /* ISOLatinHebrew - ISO 8859-8 */
+ case 0x209: eTextEncoding = RTL_TEXTENCODING_ISO_8859_9; break; /* ISOLatin5 - ISO 8859-9 */
+ /* MS-DOS & Windows encodings begin at 0x400 */
+ case 0x400: eTextEncoding = RTL_TEXTENCODING_IBM_437; break; /* DOSLatinUS - code page 437 */
+ case 0x405: eTextEncoding = RTL_TEXTENCODING_IBM_737; break; /* DOSGreek - code page 737 (formerly 437G) */
+ case 0x406: eTextEncoding = RTL_TEXTENCODING_IBM_775; break; /* DOSBalticRim - code page 775 */
+ case 0x410: eTextEncoding = RTL_TEXTENCODING_IBM_850; break; /* DOSLatin1 - code page 850, "Multilingual" */
+/* !!! case 0x411: eTextEncoding = RTL_TEXTENCODING_IBM_851; break; */ /* DOSGreek1 - code page 851 */
+ case 0x412: eTextEncoding = RTL_TEXTENCODING_IBM_852; break; /* DOSLatin2 - code page 852, Slavic */
+ case 0x413: eTextEncoding = RTL_TEXTENCODING_IBM_855; break; /* DOSCyrillic - code page 855, IBM Cyrillic */
+ case 0x414: eTextEncoding = RTL_TEXTENCODING_IBM_857; break; /* DOSTurkish - code page 857, IBM Turkish */
+ case 0x415: eTextEncoding = RTL_TEXTENCODING_IBM_860; break; /* DOSPortuguese - code page 860 */
+ case 0x416: eTextEncoding = RTL_TEXTENCODING_IBM_861; break; /* DOSIcelandic - code page 861 */
+ case 0x417: eTextEncoding = RTL_TEXTENCODING_IBM_862; break; /* DOSHebrew - code page 862 */
+ case 0x418: eTextEncoding = RTL_TEXTENCODING_IBM_863; break; /* DOSCanadianFrench - code page 863 */
+ case 0x419: eTextEncoding = RTL_TEXTENCODING_IBM_864; break; /* DOSArabic - code page 864 */
+ case 0x41A: eTextEncoding = RTL_TEXTENCODING_IBM_865; break; /* DOSNordic - code page 865 */
+ case 0x41B: eTextEncoding = RTL_TEXTENCODING_IBM_866; break; /* DOSRussian - code page 866 */
+ case 0x41C: eTextEncoding = RTL_TEXTENCODING_IBM_869; break; /* DOSGreek2 - code page 869, IBM Modern Greek */
+ case 0x41D: eTextEncoding = RTL_TEXTENCODING_MS_874; break; /* DOSThai - code page 874, also for Windows */
+ case 0x420: eTextEncoding = RTL_TEXTENCODING_MS_932; break; /* DOSJapanese - code page 932, also for Windows */
+ case 0x421: eTextEncoding = RTL_TEXTENCODING_MS_936; break; /* DOSChineseSimplif - code page 936, also for Windows */
+ case 0x422: eTextEncoding = RTL_TEXTENCODING_MS_949; break; /* DOSKorean - code page 949, also for Windows;Unified Hangul */
+ case 0x423: eTextEncoding = RTL_TEXTENCODING_MS_950; break; /* DOSChineseTrad - code page 950, also for Windows */
+ case 0x500: eTextEncoding = RTL_TEXTENCODING_MS_1252; break; /* WindowsLatin1 / WindowsANSI - code page 1252 */
+ case 0x501: eTextEncoding = RTL_TEXTENCODING_MS_1250; break; /* WindowsLatin2 - code page 1250, Central Europe */
+ case 0x502: eTextEncoding = RTL_TEXTENCODING_MS_1251; break; /* WindowsCyrillic - code page 1251, Slavic Cyrillic */
+ case 0x503: eTextEncoding = RTL_TEXTENCODING_MS_1253; break; /* WindowsGreek - code page 1253 */
+ case 0x504: eTextEncoding = RTL_TEXTENCODING_MS_1254; break; /* WindowsLatin5 - code page 1254, Turkish */
+ case 0x505: eTextEncoding = RTL_TEXTENCODING_MS_1255; break; /* WindowsHebrew - code page 1255 */
+ case 0x506: eTextEncoding = RTL_TEXTENCODING_MS_1256; break; /* WindowsArabic - code page 1256 */
+ case 0x507: eTextEncoding = RTL_TEXTENCODING_MS_1257; break; /* WindowsBalticRim - code page 1257 */
+ case 0x508: eTextEncoding = RTL_TEXTENCODING_MS_1258; break; /* WindowsVietnamese - code page 1258 */
+ case 0x510: eTextEncoding = RTL_TEXTENCODING_MS_1361; break; /* WindowsKoreanJohab - code page 1361, for Windows NT */
+ /* Various national standards begin at 0x600 */
+ case 0x600: eTextEncoding = RTL_TEXTENCODING_ASCII_US; break; /* US_ASCII */
+ case 0x620: eTextEncoding = RTL_TEXTENCODING_JIS_X_0201; break; /* JIS_X0201_76 */
+ case 0x621: eTextEncoding = RTL_TEXTENCODING_JIS_X_0208; break; /* JIS_X0208_83 */
+ case 0x622: eTextEncoding = RTL_TEXTENCODING_JIS_X_0208; break; /* JIS_X0208_90 */
+ case 0x623: eTextEncoding = RTL_TEXTENCODING_JIS_X_0212; break; /* JIS_X0212_90 */
+ /* !!! JIS_C6226_78 = 0x624 */
+ /* !!! GB_2312_80 = 0x630 */
+ /* !!! GBK_95 = 0x631 */ /* annex to GB 13000-93; for Windows 95 */
+// case 0x640: eTextEncoding = RTL_TEXTENCODING_KSC_5601_1987; break; /* KSC_5601_87 */ /* same as KSC 5601-92 without Johab annex */
+// case 0x641: eTextEncoding = RTL_TEXTENCODING_KSC_5601_1992; break; /* KSC 5601-92 Johab annex */
+ /* !!! CNS_11643_92_P1 = 0x651 */ /* CNS 11643-1992 plane 1 */
+ /* !!! CNS_11643_92_P2 = 0x652 */ /* CNS 11643-1992 plane 2 */
+ /* !!! CNS_11643_92_P3 = 0x653 */ /* CNS 11643-1992 plane 3 (11643-1986 plane 14) */
+ /* ISO 2022 collections begin at 0x800 */
+ case 0x820: eTextEncoding = RTL_TEXTENCODING_ISO_2022_JP; break; /* ISO_2022_JP */
+ case 0x821: eTextEncoding = RTL_TEXTENCODING_ISO_2022_JP; break; /* ISO_2022_JP_2 */
+ case 0x830: eTextEncoding = RTL_TEXTENCODING_ISO_2022_CN; break; /* ISO_2022_CN */
+ case 0x831: eTextEncoding = RTL_TEXTENCODING_ISO_2022_CN; break; /* ISO_2022_CN_EXT */
+ /* !!! ISO_2022_KR = 0x840 */
+ /* EUC collections begin at 0x900 */
+ case 0x920: eTextEncoding = RTL_TEXTENCODING_EUC_JP; break; /* EUC_JP - ISO 646,1-byte Katakana,JIS 208,JIS 212 */
+ case 0x930: eTextEncoding = RTL_TEXTENCODING_EUC_CN; break; /* EUC_CN - ISO 646, GB 2312-80 */
+ case 0x931: eTextEncoding = RTL_TEXTENCODING_EUC_TW; break; /* EUC_TW - ISO 646, CNS 11643-1992 Planes 1-16 */
+ case 0x940: eTextEncoding = RTL_TEXTENCODING_EUC_KR; break; /* EUC_KR - ISO 646, KS C 5601-1987 */
+ /* Miscellaneous standards begin at 0xA00 */
+ case 0xA01: eTextEncoding = RTL_TEXTENCODING_SHIFT_JIS; break; /* ShiftJIS - plain Shift-JIS */
+ case 0xA02: eTextEncoding = RTL_TEXTENCODING_KOI8_R; break; /* KOI8_R - Russian Internet standard */
+ case 0xA03: eTextEncoding = RTL_TEXTENCODING_BIG5; break; /* Big5 - Big-5 */
+ /* !!! MacRomanLatin1 = 0xA04 */ /* Mac OS Roman permuted to align with 8859-1 */
+ /* !!! HZ_GB_2312 = 0xA05 */ /* HZ (RFC 1842, for Chinese mail & news) */
+ /* Other platform encodings */
+ /* !!! NextStepLatin = 0xB01 */ /* NextStep encoding */
+ /* EBCDIC & IBM host encodings begin at 0xC00 */
+ /* !!! EBCDIC_US = 0xC01 */ /* basic EBCDIC-US */
+ /* !!! EBCDIC_CP037 = 0xC02 */ /* code page 037, extended EBCDIC-US Latin1 */
+ /* Special value */
+ /* MultiRun = 0xFFF */ /* Multiple encoded text, external run info */
+ default: eTextEncoding = RTL_TEXTENCODING_DONTKNOW; break;
+ };
+
+ return eTextEncoding;
+}
+
+#endif
+
+/* ----------------------------------------------------------------------- */
+
+rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromUnixCharset( const sal_Char* pUnixCharset )
+{
+ /* See <ftp://ftp.x.org/pub/DOCS/registry>, section 14 ("Font Charset
+ * (Registry and Encoding) Names").
+ */
+
+ /* All Identifiers in the tables are lower case The function search */
+ /* for the first matching string in the tables. */
+ /* Sort order: unique (first 14, than 1), important */
+
+ static ImplStrCharsetDef const aUnixCharsetISOTab[] =
+ {
+ { "15", RTL_TEXTENCODING_ISO_8859_15 },
+ { "14", RTL_TEXTENCODING_ISO_8859_14 },
+ { "13", RTL_TEXTENCODING_ISO_8859_13 },
+ { "11", RTL_TEXTENCODING_TIS_620 },
+ { "10", RTL_TEXTENCODING_ISO_8859_10 },
+ { "1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "2", RTL_TEXTENCODING_ISO_8859_2 },
+ { "3", RTL_TEXTENCODING_ISO_8859_3 },
+ { "4", RTL_TEXTENCODING_ISO_8859_4 },
+ { "5", RTL_TEXTENCODING_ISO_8859_5 },
+ { "6", RTL_TEXTENCODING_ISO_8859_6 },
+ { "7", RTL_TEXTENCODING_ISO_8859_7 },
+ { "8", RTL_TEXTENCODING_ISO_8859_8 },
+ { "9", RTL_TEXTENCODING_ISO_8859_9 },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetADOBETab[] =
+ {
+ { "fontspecific", RTL_TEXTENCODING_SYMBOL },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetMSTab[] =
+ {
+ { "1252", RTL_TEXTENCODING_MS_1252 },
+ { "1250", RTL_TEXTENCODING_MS_1250 },
+ { "1251", RTL_TEXTENCODING_MS_1251 },
+ { "1253", RTL_TEXTENCODING_MS_1253 },
+ { "1254", RTL_TEXTENCODING_MS_1254 },
+ { "1255", RTL_TEXTENCODING_MS_1255 },
+ { "1256", RTL_TEXTENCODING_MS_1256 },
+ { "1257", RTL_TEXTENCODING_MS_1257 },
+ { "1258", RTL_TEXTENCODING_MS_1258 },
+ { "932", RTL_TEXTENCODING_MS_932 },
+ { "936", RTL_TEXTENCODING_MS_936 },
+ { "949", RTL_TEXTENCODING_MS_949 },
+ { "950", RTL_TEXTENCODING_MS_950 },
+ { "1361", RTL_TEXTENCODING_MS_1361 },
+ { "cp1252", RTL_TEXTENCODING_MS_1252 },
+ { "cp1250", RTL_TEXTENCODING_MS_1250 },
+ { "cp1251", RTL_TEXTENCODING_MS_1251 },
+ { "cp1253", RTL_TEXTENCODING_MS_1253 },
+ { "cp1254", RTL_TEXTENCODING_MS_1254 },
+ { "cp1255", RTL_TEXTENCODING_MS_1255 },
+ { "cp1256", RTL_TEXTENCODING_MS_1256 },
+ { "cp1257", RTL_TEXTENCODING_MS_1257 },
+ { "cp1258", RTL_TEXTENCODING_MS_1258 },
+ { "cp932", RTL_TEXTENCODING_MS_932 },
+ { "cp936", RTL_TEXTENCODING_MS_936 },
+ { "cp949", RTL_TEXTENCODING_MS_949 },
+ { "cp950", RTL_TEXTENCODING_MS_950 },
+ { "cp1361", RTL_TEXTENCODING_MS_1361 },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetIBMTab[] =
+ {
+ { "437", RTL_TEXTENCODING_IBM_437 },
+ { "850", RTL_TEXTENCODING_IBM_850 },
+ { "860", RTL_TEXTENCODING_IBM_860 },
+ { "861", RTL_TEXTENCODING_IBM_861 },
+ { "863", RTL_TEXTENCODING_IBM_863 },
+ { "865", RTL_TEXTENCODING_IBM_865 },
+ { "737", RTL_TEXTENCODING_IBM_737 },
+ { "775", RTL_TEXTENCODING_IBM_775 },
+ { "852", RTL_TEXTENCODING_IBM_852 },
+ { "855", RTL_TEXTENCODING_IBM_855 },
+ { "857", RTL_TEXTENCODING_IBM_857 },
+ { "862", RTL_TEXTENCODING_IBM_862 },
+ { "864", RTL_TEXTENCODING_IBM_864 },
+ { "866", RTL_TEXTENCODING_IBM_866 },
+ { "869", RTL_TEXTENCODING_IBM_869 },
+ { "874", RTL_TEXTENCODING_MS_874 },
+ { "1004", RTL_TEXTENCODING_MS_1252 },
+ { "65400", RTL_TEXTENCODING_SYMBOL },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetKOI8Tab[] =
+ {
+ { "r", RTL_TEXTENCODING_KOI8_R },
+ { "u", RTL_TEXTENCODING_KOI8_U },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+
+ static ImplStrCharsetDef aUnixCharsetJISX0208Tab[] =
+ {
+ { NULL, RTL_TEXTENCODING_JIS_X_0208 }
+ };
+
+ static ImplStrCharsetDef aUnixCharsetJISX0201Tab[] =
+ {
+ { NULL, RTL_TEXTENCODING_JIS_X_0201 }
+ };
+
+ static ImplStrCharsetDef aUnixCharsetJISX0212Tab[] =
+ {
+ { NULL, RTL_TEXTENCODING_JIS_X_0212 }
+ };
+
+ static ImplStrCharsetDef aUnixCharsetGBTab[] =
+ {
+ { NULL, RTL_TEXTENCODING_GB_2312 }
+ };
+
+ static ImplStrCharsetDef aUnixCharsetGBKTab[] =
+ {
+ { NULL, RTL_TEXTENCODING_GBK }
+ };
+
+ static ImplStrCharsetDef aUnixCharsetBIG5Tab[] =
+ {
+ { NULL, RTL_TEXTENCODING_BIG5 }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetKSC56011987Tab[] =
+ {
+ { NULL, RTL_TEXTENCODING_EUC_KR }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetKSC56011992Tab[] =
+ {
+ { NULL, RTL_TEXTENCODING_MS_1361 }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetISO10646Tab[] =
+ {
+ { NULL, RTL_TEXTENCODING_UNICODE }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetUNICODETab[] =
+ {
+/* Currently every Unicode Encoding is for us Unicode */
+/* { "fontspecific", RTL_TEXTENCODING_UNICODE }, */
+ { NULL, RTL_TEXTENCODING_UNICODE }
+ };
+
+ static ImplStrCharsetDef const aUnixCharsetSymbolTab[] =
+ {
+ { NULL, RTL_TEXTENCODING_SYMBOL }
+ };
+
+ /* See <http://cvs.freedesktop.org/xorg/xc/fonts/encodings/iso8859-11.enc?
+ rev=1.1.1.1>: */
+ static ImplStrCharsetDef const aUnixCharsetTIS620Tab[] =
+ {
+ { "0", RTL_TEXTENCODING_TIS_620 },
+ { "2529", RTL_TEXTENCODING_TIS_620 },
+ { "2533", RTL_TEXTENCODING_TIS_620 },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+ static ImplStrCharsetDef const aUnixCharsetTIS6202529Tab[] =
+ {
+ { "1", RTL_TEXTENCODING_TIS_620 },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+ static ImplStrCharsetDef const aUnixCharsetTIS6202533Tab[] =
+ {
+ { "0", RTL_TEXTENCODING_TIS_620 },
+ { "1", RTL_TEXTENCODING_TIS_620 },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+
+ static ImplStrFirstPartCharsetDef const aUnixCharsetFirstPartTab[] =
+ {
+ { "iso8859", aUnixCharsetISOTab },
+ { "adobe", aUnixCharsetADOBETab },
+ { "ansi", aUnixCharsetMSTab },
+ { "microsoft", aUnixCharsetMSTab },
+ { "ibm", aUnixCharsetIBMTab },
+ { "koi8", aUnixCharsetKOI8Tab },
+ { "jisx0208", aUnixCharsetJISX0208Tab },
+ { "jisx0208.1983", aUnixCharsetJISX0208Tab },
+ { "jisx0201", aUnixCharsetJISX0201Tab },
+ { "jisx0201.1976", aUnixCharsetJISX0201Tab },
+ { "jisx0212", aUnixCharsetJISX0212Tab },
+ { "jisx0212.1990", aUnixCharsetJISX0212Tab },
+ { "gb2312", aUnixCharsetGBTab },
+ { "gbk", aUnixCharsetGBKTab },
+ { "big5", aUnixCharsetBIG5Tab },
+ { "iso10646", aUnixCharsetISO10646Tab },
+/* { "unicode", aUnixCharsetUNICODETab }, */ /* fonts contain only default chars */
+ { "sunolcursor", aUnixCharsetSymbolTab },
+ { "sunolglyph", aUnixCharsetSymbolTab },
+ { "iso10646", aUnixCharsetUNICODETab },
+ { "ksc5601.1987", aUnixCharsetKSC56011987Tab },
+ { "ksc5601.1992", aUnixCharsetKSC56011992Tab },
+ { "tis620.2529", aUnixCharsetTIS6202529Tab },
+ { "tis620.2533", aUnixCharsetTIS6202533Tab },
+ { "tis620", aUnixCharsetTIS620Tab },
+/* { "sunudcja.1997", }, */
+/* { "sunudcko.1997", }, */
+/* { "sunudczh.1997", }, */
+/* { "sunudczhtw.1997", }, */
+ { NULL, NULL }
+ };
+
+ rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW;
+ sal_Char* pBuf;
+ sal_Char* pTempBuf;
+ sal_uInt32 nBufLen = strlen( pUnixCharset )+1;
+ const sal_Char* pFirstPart;
+ const sal_Char* pSecondPart;
+
+ /* Alloc Buffer and map to lower case */
+ pBuf = (char*)rtl_allocateMemory( nBufLen );
+ Impl_toAsciiLower( pUnixCharset, pBuf );
+
+ /* Search FirstPart */
+ pFirstPart = pBuf;
+ pSecondPart = NULL;
+ pTempBuf = pBuf;
+ while ( *pTempBuf )
+ {
+ if ( *pTempBuf == '-' )
+ {
+ *pTempBuf = '\0';
+ pSecondPart = pTempBuf+1;
+ break;
+ }
+
+ pTempBuf++;
+ }
+
+ /* Parttrenner gefunden */
+ if ( pSecondPart )
+ {
+ /* Search for the part tab */
+ const ImplStrFirstPartCharsetDef* pFirstPartData = aUnixCharsetFirstPartTab;
+ while ( pFirstPartData->mpCharsetStr )
+ {
+ if ( Impl_matchString( pFirstPart, pFirstPartData->mpCharsetStr ) )
+ {
+ /* Search for the charset in the second part tab */
+ const ImplStrCharsetDef* pData = pFirstPartData->mpSecondPartTab;
+ while ( pData->mpCharsetStr )
+ {
+ if ( Impl_matchString( pSecondPart, pData->mpCharsetStr ) )
+ {
+ eEncoding = pData->meTextEncoding;
+ break;
+ }
+
+ pData++;
+ }
+
+ /* use default encoding for first part */
+ eEncoding = pData->meTextEncoding;
+ break;
+ }
+
+ pFirstPartData++;
+ }
+ }
+
+ rtl_freeMemory( pBuf );
+
+ return eEncoding;
+}
+
+/* ----------------------------------------------------------------------- */
+
+rtl_TextEncoding SAL_CALL rtl_getTextEncodingFromMimeCharset( const sal_Char* pMimeCharset )
+{
+ /* All Identifiers are in lower case and contain only alphanumeric */
+ /* characters. The function search for the first equal string in */
+ /* the table. In this table are only the most used mime types. */
+ /* Sort order: important */
+ static ImplStrCharsetDef const aVIPMimeCharsetTab[] =
+ {
+ { "usascii", RTL_TEXTENCODING_ASCII_US },
+ { "utf8", RTL_TEXTENCODING_UTF8 },
+ { "utf7", RTL_TEXTENCODING_UTF7 },
+ { "iso88591", RTL_TEXTENCODING_ISO_8859_1 },
+ { "iso88592", RTL_TEXTENCODING_ISO_8859_2 },
+ { "iso88593", RTL_TEXTENCODING_ISO_8859_3 },
+ { "iso88594", RTL_TEXTENCODING_ISO_8859_4 },
+ { "iso88595", RTL_TEXTENCODING_ISO_8859_5 },
+ { "iso88596", RTL_TEXTENCODING_ISO_8859_6 },
+ { "iso88597", RTL_TEXTENCODING_ISO_8859_7 },
+ { "iso88598", RTL_TEXTENCODING_ISO_8859_8 },
+ { "iso88599", RTL_TEXTENCODING_ISO_8859_9 },
+ { "iso885910", RTL_TEXTENCODING_ISO_8859_10 },
+ { "iso885913", RTL_TEXTENCODING_ISO_8859_13 },
+ { "iso885914", RTL_TEXTENCODING_ISO_8859_14 },
+ { "iso885915", RTL_TEXTENCODING_ISO_8859_15 },
+ { "iso2022jp", RTL_TEXTENCODING_ISO_2022_JP },
+ { "iso2022jp2", RTL_TEXTENCODING_ISO_2022_JP },
+ { "iso2022cn", RTL_TEXTENCODING_ISO_2022_CN },
+ { "iso2022cnext", RTL_TEXTENCODING_ISO_2022_CN },
+ { "iso2022kr", RTL_TEXTENCODING_ISO_2022_KR },
+ { "eucjp", RTL_TEXTENCODING_EUC_JP },
+ { "shiftjis", RTL_TEXTENCODING_SHIFT_JIS },
+ { "mskanji", RTL_TEXTENCODING_MS_932 },
+ { "gb2312", RTL_TEXTENCODING_GB_2312 },
+ { "cngb", RTL_TEXTENCODING_GB_2312 },
+ { "big5", RTL_TEXTENCODING_BIG5 },
+ { "cnbig5", RTL_TEXTENCODING_BIG5 },
+ { "cngb12345", RTL_TEXTENCODING_GBT_12345 },
+ { "euckr", RTL_TEXTENCODING_EUC_KR },
+ { "koi8r", RTL_TEXTENCODING_KOI8_R },
+ { "windows1252", RTL_TEXTENCODING_MS_1252 },
+ { "windows1250", RTL_TEXTENCODING_MS_1250 },
+ { "windows1251", RTL_TEXTENCODING_MS_1251 },
+ { "windows1253", RTL_TEXTENCODING_MS_1253 },
+ { "windows1254", RTL_TEXTENCODING_MS_1254 },
+ { "windows1255", RTL_TEXTENCODING_MS_1255 },
+ { "windows1256", RTL_TEXTENCODING_MS_1256 },
+ { "windows1257", RTL_TEXTENCODING_MS_1257 },
+ { "windows1258", RTL_TEXTENCODING_MS_1258 },
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+
+ /* All Identifiers are in lower case and contain only alphanumeric */
+ /* characters. The function search for the first matching string in */
+ /* the table. */
+ /* Sort order: unique (first iso885914, than iso88591), important */
+ static ImplStrCharsetDef const aMimeCharsetTab[] =
+ {
+ { "unicode11utf7", RTL_TEXTENCODING_UTF7 },
+ { "caunicode11utf7", RTL_TEXTENCODING_UTF7 },
+ { "iso88591windows30", RTL_TEXTENCODING_ISO_8859_1 },
+ { "iso88591win", RTL_TEXTENCODING_MS_1252 },
+ { "iso88592win", RTL_TEXTENCODING_MS_1250 },
+ { "iso88599win", RTL_TEXTENCODING_MS_1254 },
+ { "iso885915", RTL_TEXTENCODING_ISO_8859_15 },
+ { "iso885914", RTL_TEXTENCODING_ISO_8859_14 },
+ { "iso885913", RTL_TEXTENCODING_ISO_8859_13 },
+ { "iso885911", RTL_TEXTENCODING_TIS_620 },
+ /* This is no official MIME character set name, but it might be in
+ use in Thailand. */
+ { "iso885910", RTL_TEXTENCODING_ISO_8859_10 },
+ { "iso88591", RTL_TEXTENCODING_ISO_8859_1 },
+ { "iso88592", RTL_TEXTENCODING_ISO_8859_2 },
+ { "iso88593", RTL_TEXTENCODING_ISO_8859_3 },
+ { "iso88594", RTL_TEXTENCODING_ISO_8859_4 },
+ { "iso88595", RTL_TEXTENCODING_ISO_8859_5 },
+ { "iso88596", RTL_TEXTENCODING_ISO_8859_6 },
+ { "iso88597", RTL_TEXTENCODING_ISO_8859_7 },
+ { "iso88598", RTL_TEXTENCODING_ISO_8859_8 },
+ { "iso88599", RTL_TEXTENCODING_ISO_8859_9 },
+ { "isoir100", RTL_TEXTENCODING_ISO_8859_1 },
+ { "latin1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "l1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "cp819", RTL_TEXTENCODING_ISO_8859_1 },
+ { "ibm819", RTL_TEXTENCODING_ISO_8859_1 },
+ { "csisolatin1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "isoir101", RTL_TEXTENCODING_ISO_8859_2 },
+ { "latin2", RTL_TEXTENCODING_ISO_8859_2 },
+ { "l2", RTL_TEXTENCODING_ISO_8859_2 },
+ { "csisolatin2", RTL_TEXTENCODING_ISO_8859_2 },
+ { "isoir109", RTL_TEXTENCODING_ISO_8859_3 },
+ { "latin3", RTL_TEXTENCODING_ISO_8859_3 },
+ { "l3", RTL_TEXTENCODING_ISO_8859_3 },
+ { "csisolatin3", RTL_TEXTENCODING_ISO_8859_3 },
+ { "isoir110", RTL_TEXTENCODING_ISO_8859_4 },
+ { "latin4", RTL_TEXTENCODING_ISO_8859_4 },
+ { "l4", RTL_TEXTENCODING_ISO_8859_4 },
+ { "csisolatin4", RTL_TEXTENCODING_ISO_8859_4 },
+ { "isoir144", RTL_TEXTENCODING_ISO_8859_5 },
+ { "cyrillicasian", RTL_TEXTENCODING_PT154 },
+ { "cyrillic", RTL_TEXTENCODING_ISO_8859_5 },
+ { "csisolatincyrillic", RTL_TEXTENCODING_ISO_8859_5 },
+ { "isoir127", RTL_TEXTENCODING_ISO_8859_6 },
+ { "arabic", RTL_TEXTENCODING_ISO_8859_6 },
+ { "csisolatinarabic", RTL_TEXTENCODING_ISO_8859_6 },
+ { "ecma114", RTL_TEXTENCODING_ISO_8859_6 },
+ { "asmo708", RTL_TEXTENCODING_ISO_8859_6 },
+ { "isoir126", RTL_TEXTENCODING_ISO_8859_7 },
+ { "greek", RTL_TEXTENCODING_ISO_8859_7 },
+ { "csisolatingreek", RTL_TEXTENCODING_ISO_8859_7 },
+ { "elot928", RTL_TEXTENCODING_ISO_8859_7 },
+ { "ecma118", RTL_TEXTENCODING_ISO_8859_7 },
+ { "isoir138", RTL_TEXTENCODING_ISO_8859_8 },
+ { "hebrew", RTL_TEXTENCODING_ISO_8859_8 },
+ { "csisolatinhebrew", RTL_TEXTENCODING_ISO_8859_8 },
+ { "isoir148", RTL_TEXTENCODING_ISO_8859_9 },
+ { "latin5", RTL_TEXTENCODING_ISO_8859_9 },
+ { "l5", RTL_TEXTENCODING_ISO_8859_9 },
+ { "csisolatin5", RTL_TEXTENCODING_ISO_8859_9 },
+ { "cswindows30latin1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "cswindows30latin1", RTL_TEXTENCODING_ISO_8859_1 },
+ { "cswindows31latin1", RTL_TEXTENCODING_MS_1252 },
+ { "cswindows31latin2", RTL_TEXTENCODING_MS_1250 },
+ { "cswindows31latin5", RTL_TEXTENCODING_MS_1254 },
+ { "iso10646us", RTL_TEXTENCODING_ASCII_US },
+ { "iso646irv", RTL_TEXTENCODING_ASCII_US },
+ { "cskoi8r", RTL_TEXTENCODING_KOI8_R },
+ { "ibm437", RTL_TEXTENCODING_IBM_437 },
+ { "cp437", RTL_TEXTENCODING_IBM_437 },
+ { "437", RTL_TEXTENCODING_IBM_437 },
+ { "cspc8codepage437", RTL_TEXTENCODING_IBM_437 },
+ { "ansix34", RTL_TEXTENCODING_ASCII_US },
+ { "ibm367", RTL_TEXTENCODING_ASCII_US },
+ { "cp367", RTL_TEXTENCODING_ASCII_US },
+ { "csascii", RTL_TEXTENCODING_ASCII_US },
+ { "ibm775", RTL_TEXTENCODING_IBM_775 },
+ { "cp775", RTL_TEXTENCODING_IBM_775 },
+ { "cspc775baltic", RTL_TEXTENCODING_IBM_775 },
+ { "ibm850", RTL_TEXTENCODING_IBM_850 },
+ { "cp850", RTL_TEXTENCODING_IBM_850 },
+ { "850", RTL_TEXTENCODING_IBM_850 },
+ { "cspc850multilingual", RTL_TEXTENCODING_IBM_850 },
+/* { "ibm851", RTL_TEXTENCODING_IBM_851 }, */
+/* { "cp851", RTL_TEXTENCODING_IBM_851 }, */
+/* { "851", RTL_TEXTENCODING_IBM_851 }, */
+/* { "csibm851", RTL_TEXTENCODING_IBM_851 }, */
+ { "ibm852", RTL_TEXTENCODING_IBM_852 },
+ { "cp852", RTL_TEXTENCODING_IBM_852 },
+ { "852", RTL_TEXTENCODING_IBM_852 },
+ { "cspcp852", RTL_TEXTENCODING_IBM_852 },
+ { "ibm855", RTL_TEXTENCODING_IBM_855 },
+ { "cp855", RTL_TEXTENCODING_IBM_855 },
+ { "855", RTL_TEXTENCODING_IBM_855 },
+ { "csibm855", RTL_TEXTENCODING_IBM_855 },
+ { "ibm857", RTL_TEXTENCODING_IBM_857 },
+ { "cp857", RTL_TEXTENCODING_IBM_857 },
+ { "857", RTL_TEXTENCODING_IBM_857 },
+ { "csibm857", RTL_TEXTENCODING_IBM_857 },
+ { "ibm860", RTL_TEXTENCODING_IBM_860 },
+ { "cp860", RTL_TEXTENCODING_IBM_860 },
+ { "860", RTL_TEXTENCODING_IBM_860 },
+ { "csibm860", RTL_TEXTENCODING_IBM_860 },
+ { "ibm861", RTL_TEXTENCODING_IBM_861 },
+ { "cp861", RTL_TEXTENCODING_IBM_861 },
+ { "861", RTL_TEXTENCODING_IBM_861 },
+ { "csis", RTL_TEXTENCODING_IBM_861 },
+ { "csibm861", RTL_TEXTENCODING_IBM_861 },
+ { "ibm862", RTL_TEXTENCODING_IBM_862 },
+ { "cp862", RTL_TEXTENCODING_IBM_862 },
+ { "862", RTL_TEXTENCODING_IBM_862 },
+ { "cspc862latinhebrew", RTL_TEXTENCODING_IBM_862 },
+ { "ibm863", RTL_TEXTENCODING_IBM_863 },
+ { "cp863", RTL_TEXTENCODING_IBM_863 },
+ { "863", RTL_TEXTENCODING_IBM_863 },
+ { "csibm863", RTL_TEXTENCODING_IBM_863 },
+ { "ibm864", RTL_TEXTENCODING_IBM_864 },
+ { "cp864", RTL_TEXTENCODING_IBM_864 },
+ { "864", RTL_TEXTENCODING_IBM_864 },
+ { "csibm864", RTL_TEXTENCODING_IBM_864 },
+ { "ibm865", RTL_TEXTENCODING_IBM_865 },
+ { "cp865", RTL_TEXTENCODING_IBM_865 },
+ { "865", RTL_TEXTENCODING_IBM_865 },
+ { "csibm865", RTL_TEXTENCODING_IBM_865 },
+ { "ibm866", RTL_TEXTENCODING_IBM_866 },
+ { "cp866", RTL_TEXTENCODING_IBM_866 },
+ { "866", RTL_TEXTENCODING_IBM_866 },
+ { "csibm866", RTL_TEXTENCODING_IBM_866 },
+/* { "ibm868", RTL_TEXTENCODING_IBM_868 }, */
+/* { "cp868", RTL_TEXTENCODING_IBM_868 }, */
+/* { "cpar", RTL_TEXTENCODING_IBM_868 }, */
+/* { "csibm868", RTL_TEXTENCODING_IBM_868 }, */
+ { "ibm869", RTL_TEXTENCODING_IBM_869 },
+ { "cp869", RTL_TEXTENCODING_IBM_869 },
+ { "869", RTL_TEXTENCODING_IBM_869 },
+ { "cpgr", RTL_TEXTENCODING_IBM_869 },
+ { "csibm869", RTL_TEXTENCODING_IBM_869 },
+ { "ibm869", RTL_TEXTENCODING_IBM_869 },
+ { "cp869", RTL_TEXTENCODING_IBM_869 },
+ { "869", RTL_TEXTENCODING_IBM_869 },
+ { "cpgr", RTL_TEXTENCODING_IBM_869 },
+ { "csibm869", RTL_TEXTENCODING_IBM_869 },
+ { "mac", RTL_TEXTENCODING_APPLE_ROMAN },
+ { "csmacintosh", RTL_TEXTENCODING_APPLE_ROMAN },
+ { "shiftjis", RTL_TEXTENCODING_SHIFT_JIS },
+ { "mskanji", RTL_TEXTENCODING_MS_932 },
+ { "csshiftjis", RTL_TEXTENCODING_SHIFT_JIS },
+ { "jisx0208", RTL_TEXTENCODING_JIS_X_0208 },
+ { "jisc62261983", RTL_TEXTENCODING_JIS_X_0208 },
+ { "csiso87jisx0208", RTL_TEXTENCODING_JIS_X_0208 },
+ { "isoir86", RTL_TEXTENCODING_JIS_X_0208 },
+ { "x0208", RTL_TEXTENCODING_JIS_X_0208 },
+ { "jisx0201", RTL_TEXTENCODING_JIS_X_0201 },
+ { "cshalfwidthkatakana", RTL_TEXTENCODING_JIS_X_0201 },
+ { "x0201", RTL_TEXTENCODING_JIS_X_0201 },
+ { "jisx0212", RTL_TEXTENCODING_JIS_X_0212 },
+ { "csiso159jisx0212", RTL_TEXTENCODING_JIS_X_0212 },
+ { "isoir159", RTL_TEXTENCODING_JIS_X_0208 },
+ { "x0212", RTL_TEXTENCODING_JIS_X_0212 },
+ { "isoir6", RTL_TEXTENCODING_ASCII_US },
+ { "xsjis", RTL_TEXTENCODING_SHIFT_JIS },
+ { "sjis", RTL_TEXTENCODING_SHIFT_JIS },
+ { "ascii", RTL_TEXTENCODING_ASCII_US },
+ { "us", RTL_TEXTENCODING_ASCII_US },
+ { "gb180302000", RTL_TEXTENCODING_GB_18030 },
+ /* This is no actual MIME character set name, it is only in here
+ for backwards compatibility (before "GB18030" was officially
+ registered with IANA, this code contained some guesses of what
+ would become official names for GB18030). */
+ { "gb18030", RTL_TEXTENCODING_GB_18030 },
+ { "big5hkscs", RTL_TEXTENCODING_BIG5_HKSCS },
+ { "tis620", RTL_TEXTENCODING_TIS_620 },
+ { "gbk", RTL_TEXTENCODING_GBK },
+ { "cp936", RTL_TEXTENCODING_GBK },
+ { "ms936", RTL_TEXTENCODING_GBK },
+ { "windows936", RTL_TEXTENCODING_GBK },
+ { "cp874", RTL_TEXTENCODING_MS_874 },
+ /* This is no official MIME character set name, but it might be in
+ use in Thailand. */
+ { "ms874", RTL_TEXTENCODING_MS_874 },
+ /* This is no official MIME character set name, but it might be in
+ use in Thailand. */
+ { "windows874", RTL_TEXTENCODING_MS_874 },
+ /* This is no official MIME character set name, but it might be in
+ use in Thailand. */
+ { "koi8u", RTL_TEXTENCODING_KOI8_U },
+ { "cpis", RTL_TEXTENCODING_IBM_861 },
+ { "ksc56011987", RTL_TEXTENCODING_MS_949 },
+ { "isoir149", RTL_TEXTENCODING_MS_949 },
+ { "ksc56011989", RTL_TEXTENCODING_MS_949 },
+ { "ksc5601", RTL_TEXTENCODING_MS_949 },
+ { "korean", RTL_TEXTENCODING_MS_949 },
+ { "csksc56011987", RTL_TEXTENCODING_MS_949 },
+ /* Map KS_C_5601-1987 and aliases to MS-949 instead of EUC-KR, as
+ this character set identifier seems to be prominently used by MS
+ to stand for KS C 5601 plus MS-949 extensions */
+ { "latin9", RTL_TEXTENCODING_ISO_8859_15 },
+ { "adobestandardencoding", RTL_TEXTENCODING_ADOBE_STANDARD },
+ { "csadobestandardencoding", RTL_TEXTENCODING_ADOBE_STANDARD },
+ { "adobesymbolencoding", RTL_TEXTENCODING_ADOBE_SYMBOL },
+ { "cshppsmath", RTL_TEXTENCODING_ADOBE_SYMBOL },
+ { "ptcp154", RTL_TEXTENCODING_PT154 },
+ { "csptcp154", RTL_TEXTENCODING_PT154 },
+ { "pt154", RTL_TEXTENCODING_PT154 },
+ { "cp154", RTL_TEXTENCODING_PT154 },
+ { "xisciide", RTL_TEXTENCODING_ISCII_DEVANAGARI },
+ /* This is no official MIME character set name, but is in use by
+ various windows APIs. */
+ { NULL, RTL_TEXTENCODING_DONTKNOW }
+ };
+
+ rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW;
+ sal_Char* pBuf;
+ const ImplStrCharsetDef* pData = aVIPMimeCharsetTab;
+ sal_uInt32 nBufLen = strlen( pMimeCharset )+1;
+
+ /* Alloc Buffer and map to lower case and remove non alphanumeric chars */
+ pBuf = (char*)rtl_allocateMemory( nBufLen );
+ Impl_toAsciiLowerAndRemoveNonAlphanumeric( pMimeCharset, pBuf );
+
+ /* Search for equal in the VIP table */
+ while ( pData->mpCharsetStr )
+ {
+ if ( strcmp( pBuf, pData->mpCharsetStr ) == 0 )
+ {
+ eEncoding = pData->meTextEncoding;
+ break;
+ }
+
+ pData++;
+ }
+
+ /* Search for matching in the mime table */
+ if ( eEncoding == RTL_TEXTENCODING_DONTKNOW )
+ {
+ pData = aMimeCharsetTab;
+ while ( pData->mpCharsetStr )
+ {
+ if ( Impl_matchString( pBuf, pData->mpCharsetStr ) )
+ {
+ eEncoding = pData->meTextEncoding;
+ break;
+ }
+
+ pData++;
+ }
+ }
+
+ rtl_freeMemory( pBuf );
+
+ return eEncoding;
+}
+
+/* ======================================================================= */
+
+sal_uInt8 SAL_CALL rtl_getBestWindowsCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding )
+{
+ const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding );
+ if ( pData )
+ return pData->mnBestWindowsCharset;
+ else
+ return 1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+const sal_Char* SAL_CALL rtl_getBestUnixCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding )
+{
+ const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding );
+ if ( pData )
+ return (sal_Char const *) pData->mpBestUnixCharset;
+ else if( eTextEncoding == RTL_TEXTENCODING_UNICODE )
+ return (sal_Char const *) "iso10646-1";
+ else
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+char const * SAL_CALL rtl_getMimeCharsetFromTextEncoding(rtl_TextEncoding
+ nEncoding)
+{
+ ImplTextEncodingData const * p = Impl_getTextEncodingData(nEncoding);
+ return p && (p->mnInfoFlags & RTL_TEXTENCODING_INFO_MIME) != 0 ?
+ p->mpBestMimeCharset : NULL;
+}
+
+const sal_Char* SAL_CALL rtl_getBestMimeCharsetFromTextEncoding( rtl_TextEncoding eTextEncoding )
+{
+ const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding );
+ if ( pData )
+ return (sal_Char const *) pData->mpBestMimeCharset;
+ else
+ return 0;
+}
+
+/* The following two functions are based on <http://www.sharmahd.com/tm/
+ codepages.html>, <http://msdn.microsoft.com/workshop/author/dhtml/reference/
+ charsets/charset4.asp>, and <http://www.iana.org/assignments/character-sets>.
+ */
+
+rtl_TextEncoding SAL_CALL
+rtl_getTextEncodingFromWindowsCodePage(sal_uInt32 nCodePage)
+{
+ switch (nCodePage)
+ {
+ case 437: return RTL_TEXTENCODING_IBM_437;
+ case 708: return RTL_TEXTENCODING_ISO_8859_6;
+ case 737: return RTL_TEXTENCODING_IBM_737;
+ case 775: return RTL_TEXTENCODING_IBM_775;
+ case 850: return RTL_TEXTENCODING_IBM_850;
+ case 852: return RTL_TEXTENCODING_IBM_852;
+ case 855: return RTL_TEXTENCODING_IBM_855;
+ case 857: return RTL_TEXTENCODING_IBM_857;
+ case 860: return RTL_TEXTENCODING_IBM_860;
+ case 861: return RTL_TEXTENCODING_IBM_861;
+ case 862: return RTL_TEXTENCODING_IBM_862;
+ case 863: return RTL_TEXTENCODING_IBM_863;
+ case 864: return RTL_TEXTENCODING_IBM_864;
+ case 865: return RTL_TEXTENCODING_IBM_865;
+ case 866: return RTL_TEXTENCODING_IBM_866;
+ case 869: return RTL_TEXTENCODING_IBM_869;
+ case 874: return RTL_TEXTENCODING_MS_874;
+ case 932: return RTL_TEXTENCODING_MS_932;
+ case 936: return RTL_TEXTENCODING_MS_936;
+ case 949: return RTL_TEXTENCODING_MS_949;
+ case 950: return RTL_TEXTENCODING_MS_950;
+ case 1250: return RTL_TEXTENCODING_MS_1250;
+ case 1251: return RTL_TEXTENCODING_MS_1251;
+ case 1252: return RTL_TEXTENCODING_MS_1252;
+ case 1253: return RTL_TEXTENCODING_MS_1253;
+ case 1254: return RTL_TEXTENCODING_MS_1254;
+ case 1255: return RTL_TEXTENCODING_MS_1255;
+ case 1256: return RTL_TEXTENCODING_MS_1256;
+ case 1257: return RTL_TEXTENCODING_MS_1257;
+ case 1258: return RTL_TEXTENCODING_MS_1258;
+ case 1361: return RTL_TEXTENCODING_MS_1361;
+ case 10000: return RTL_TEXTENCODING_APPLE_ROMAN;
+ case 10001: return RTL_TEXTENCODING_APPLE_JAPANESE;
+ case 10002: return RTL_TEXTENCODING_APPLE_CHINTRAD;
+ case 10003: return RTL_TEXTENCODING_APPLE_KOREAN;
+ case 10004: return RTL_TEXTENCODING_APPLE_ARABIC;
+ case 10005: return RTL_TEXTENCODING_APPLE_HEBREW;
+ case 10006: return RTL_TEXTENCODING_APPLE_GREEK;
+ case 10007: return RTL_TEXTENCODING_APPLE_CYRILLIC;
+ case 10008: return RTL_TEXTENCODING_APPLE_CHINSIMP;
+ case 10010: return RTL_TEXTENCODING_APPLE_ROMANIAN;
+ case 10017: return RTL_TEXTENCODING_APPLE_UKRAINIAN;
+ case 10029: return RTL_TEXTENCODING_APPLE_CENTEURO;
+ case 10079: return RTL_TEXTENCODING_APPLE_ICELAND;
+ case 10081: return RTL_TEXTENCODING_APPLE_TURKISH;
+ case 10082: return RTL_TEXTENCODING_APPLE_CROATIAN;
+ case 20127: return RTL_TEXTENCODING_ASCII_US;
+ case 20866: return RTL_TEXTENCODING_KOI8_R;
+ case 21866: return RTL_TEXTENCODING_KOI8_U;
+ case 28591: return RTL_TEXTENCODING_ISO_8859_1;
+ case 28592: return RTL_TEXTENCODING_ISO_8859_2;
+ case 28593: return RTL_TEXTENCODING_ISO_8859_3;
+ case 28594: return RTL_TEXTENCODING_ISO_8859_4;
+ case 28595: return RTL_TEXTENCODING_ISO_8859_5;
+ case 28596: return RTL_TEXTENCODING_ISO_8859_6;
+ case 28597: return RTL_TEXTENCODING_ISO_8859_7;
+ case 28598: return RTL_TEXTENCODING_ISO_8859_8;
+ case 28599: return RTL_TEXTENCODING_ISO_8859_9;
+ case 28605: return RTL_TEXTENCODING_ISO_8859_15;
+ case 50220: return RTL_TEXTENCODING_ISO_2022_JP;
+ case 50225: return RTL_TEXTENCODING_ISO_2022_KR;
+ case 51932: return RTL_TEXTENCODING_EUC_JP;
+ case 51936: return RTL_TEXTENCODING_EUC_CN;
+ case 51949: return RTL_TEXTENCODING_EUC_KR;
+ case 57002: return RTL_TEXTENCODING_ISCII_DEVANAGARI;
+ case 65000: return RTL_TEXTENCODING_UTF7;
+ case 65001: return RTL_TEXTENCODING_UTF8;
+ default: return RTL_TEXTENCODING_DONTKNOW;
+ }
+}
+
+sal_uInt32 SAL_CALL
+rtl_getWindowsCodePageFromTextEncoding(rtl_TextEncoding nEncoding)
+{
+ switch (nEncoding)
+ {
+ case RTL_TEXTENCODING_IBM_437: return 437;
+ /* case RTL_TEXTENCODING_ISO_8859_6: return 708; */
+ case RTL_TEXTENCODING_IBM_737: return 737;
+ case RTL_TEXTENCODING_IBM_775: return 775;
+ case RTL_TEXTENCODING_IBM_850: return 850;
+ case RTL_TEXTENCODING_IBM_852: return 852;
+ case RTL_TEXTENCODING_IBM_855: return 855;
+ case RTL_TEXTENCODING_IBM_857: return 857;
+ case RTL_TEXTENCODING_IBM_860: return 860;
+ case RTL_TEXTENCODING_IBM_861: return 861;
+ case RTL_TEXTENCODING_IBM_862: return 862;
+ case RTL_TEXTENCODING_IBM_863: return 863;
+ case RTL_TEXTENCODING_IBM_864: return 864;
+ case RTL_TEXTENCODING_IBM_865: return 865;
+ case RTL_TEXTENCODING_IBM_866: return 866;
+ case RTL_TEXTENCODING_IBM_869: return 869;
+ case RTL_TEXTENCODING_MS_874: return 874;
+ case RTL_TEXTENCODING_MS_932: return 932;
+ case RTL_TEXTENCODING_MS_936: return 936;
+ case RTL_TEXTENCODING_MS_949: return 949;
+ case RTL_TEXTENCODING_MS_950: return 950;
+ case RTL_TEXTENCODING_MS_1250: return 1250;
+ case RTL_TEXTENCODING_MS_1251: return 1251;
+ case RTL_TEXTENCODING_MS_1252: return 1252;
+ case RTL_TEXTENCODING_MS_1253: return 1253;
+ case RTL_TEXTENCODING_MS_1254: return 1254;
+ case RTL_TEXTENCODING_MS_1255: return 1255;
+ case RTL_TEXTENCODING_MS_1256: return 1256;
+ case RTL_TEXTENCODING_MS_1257: return 1257;
+ case RTL_TEXTENCODING_MS_1258: return 1258;
+ case RTL_TEXTENCODING_MS_1361: return 1361;
+ case RTL_TEXTENCODING_APPLE_ROMAN: return 10000;
+ case RTL_TEXTENCODING_APPLE_JAPANESE: return 10001;
+ case RTL_TEXTENCODING_APPLE_CHINTRAD: return 10002;
+ case RTL_TEXTENCODING_APPLE_KOREAN: return 10003;
+ case RTL_TEXTENCODING_APPLE_ARABIC: return 10004;
+ case RTL_TEXTENCODING_APPLE_HEBREW: return 10005;
+ case RTL_TEXTENCODING_APPLE_GREEK: return 10006;
+ case RTL_TEXTENCODING_APPLE_CYRILLIC: return 10007;
+ case RTL_TEXTENCODING_APPLE_CHINSIMP: return 10008;
+ case RTL_TEXTENCODING_APPLE_ROMANIAN: return 10010;
+ case RTL_TEXTENCODING_APPLE_UKRAINIAN: return 10017;
+ case RTL_TEXTENCODING_APPLE_CENTEURO: return 10029;
+ case RTL_TEXTENCODING_APPLE_ICELAND: return 10079;
+ case RTL_TEXTENCODING_APPLE_TURKISH: return 10081;
+ case RTL_TEXTENCODING_APPLE_CROATIAN: return 10082;
+ case RTL_TEXTENCODING_ASCII_US: return 20127;
+ case RTL_TEXTENCODING_KOI8_R: return 20866;
+ case RTL_TEXTENCODING_KOI8_U: return 21866;
+ case RTL_TEXTENCODING_ISO_8859_1: return 28591;
+ case RTL_TEXTENCODING_ISO_8859_2: return 28592;
+ case RTL_TEXTENCODING_ISO_8859_3: return 28593;
+ case RTL_TEXTENCODING_ISO_8859_4: return 28594;
+ case RTL_TEXTENCODING_ISO_8859_5: return 28595;
+ case RTL_TEXTENCODING_ISO_8859_6: return 28596;
+ case RTL_TEXTENCODING_ISO_8859_7: return 28597;
+ case RTL_TEXTENCODING_ISO_8859_8: return 28598;
+ case RTL_TEXTENCODING_ISO_8859_9: return 28599;
+ case RTL_TEXTENCODING_ISO_8859_15: return 28605;
+ case RTL_TEXTENCODING_ISO_2022_JP: return 50220;
+ case RTL_TEXTENCODING_ISO_2022_KR: return 50225;
+ case RTL_TEXTENCODING_EUC_JP: return 51932;
+ case RTL_TEXTENCODING_EUC_CN: return 51936;
+ case RTL_TEXTENCODING_EUC_KR: return 51949;
+ case RTL_TEXTENCODING_ISCII_DEVANAGARI: return 57002;
+ case RTL_TEXTENCODING_UTF7: return 65000;
+ case RTL_TEXTENCODING_UTF8: return 65001;
+ default: return 0;
+ }
+}
diff --git a/sal/textenc/textcvt.c b/sal/textenc/textcvt.c
new file mode 100644
index 000000000000..1ef20285f015
--- /dev/null
+++ b/sal/textenc/textcvt.c
@@ -0,0 +1,264 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "rtl/textcvt.h"
+#include "gettextencodingdata.h"
+#include "tenchelp.h"
+
+/* ======================================================================= */
+
+static sal_Size ImplDummyToUnicode( const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes )
+{
+ sal_Unicode* pEndDestBuf;
+ const sal_Char* pEndSrcBuf;
+
+ if ( ((nFlags & RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR) ||
+ ((nFlags & RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_MASK) == RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR) )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR |
+ RTL_TEXTTOUNICODE_INFO_UNDEFINED |
+ RTL_TEXTTOUNICODE_INFO_MBUNDEFINED;
+ return 0;
+ }
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestChars;
+ pEndSrcBuf = pSrcBuf+nSrcBytes;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_TEXTTOUNICODE_INFO_ERROR | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = (sal_Unicode)(sal_uChar)*pSrcBuf;
+ pDestBuf++;
+ pSrcBuf++;
+ }
+
+ *pSrcCvtBytes = nSrcBytes - (pEndSrcBuf-pSrcBuf);
+ return (nDestChars - (pEndDestBuf-pDestBuf));
+}
+
+/* ----------------------------------------------------------------------- */
+
+static sal_Size ImplUnicodeToDummy( const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars )
+{
+ sal_Char* pEndDestBuf;
+ const sal_Unicode* pEndSrcBuf;
+
+ if ( ((nFlags & RTL_UNICODETOTEXT_FLAGS_UNDEFINED_MASK) == RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR) )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR |
+ RTL_UNICODETOTEXT_INFO_UNDEFINED;
+ return 0;
+ }
+
+ *pInfo = 0;
+ pEndDestBuf = pDestBuf+nDestBytes;
+ pEndSrcBuf = pSrcBuf+nSrcChars;
+ while ( pSrcBuf < pEndSrcBuf )
+ {
+ if ( pDestBuf == pEndDestBuf )
+ {
+ *pInfo |= RTL_UNICODETOTEXT_INFO_ERROR | RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL;
+ break;
+ }
+
+ *pDestBuf = (sal_Char)(sal_uChar)(*pSrcBuf & 0x00FF);
+ pDestBuf++;
+ pSrcBuf++;
+ }
+
+ *pSrcCvtChars = nSrcChars - (pEndSrcBuf-pSrcBuf);
+ return (nDestBytes - (pEndDestBuf-pDestBuf));
+}
+
+/* ======================================================================= */
+
+rtl_TextToUnicodeConverter SAL_CALL rtl_createTextToUnicodeConverter( rtl_TextEncoding eTextEncoding )
+{
+ const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding );
+ if ( pData )
+ return (rtl_TextToUnicodeConverter) &pData->maConverter;
+ else
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL rtl_destroyTextToUnicodeConverter( rtl_TextToUnicodeConverter hContext )
+{
+ (void) hContext; /* unused */
+}
+
+/* ----------------------------------------------------------------------- */
+
+rtl_TextToUnicodeContext SAL_CALL rtl_createTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter )
+{
+ const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter;
+ if ( !pConverter )
+ return 0;
+ else if ( pConverter->mpCreateTextToUnicodeContext )
+ return (rtl_TextToUnicodeContext)pConverter->mpCreateTextToUnicodeContext();
+ else
+ return (rtl_TextToUnicodeContext)1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL rtl_destroyTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter,
+ rtl_TextToUnicodeContext hContext )
+{
+ const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter;
+ if ( pConverter && hContext && pConverter->mpDestroyTextToUnicodeContext )
+ pConverter->mpDestroyTextToUnicodeContext( (void*)hContext );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL rtl_resetTextToUnicodeContext( rtl_TextToUnicodeConverter hConverter,
+ rtl_TextToUnicodeContext hContext )
+{
+ const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter;
+ if ( pConverter && hContext && pConverter->mpResetTextToUnicodeContext )
+ pConverter->mpResetTextToUnicodeContext( (void*)hContext );
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size SAL_CALL rtl_convertTextToUnicode( rtl_TextToUnicodeConverter hConverter,
+ rtl_TextToUnicodeContext hContext,
+ const sal_Char* pSrcBuf, sal_Size nSrcBytes,
+ sal_Unicode* pDestBuf, sal_Size nDestChars,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtBytes )
+{
+ const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter;
+
+ /* Only temporaer, because we don't want die, if we don't have a
+ converter, because not all converters are implemented yet */
+ if ( !pConverter )
+ {
+ return ImplDummyToUnicode( pSrcBuf, nSrcBytes,
+ pDestBuf, nDestChars,
+ nFlags, pInfo, pSrcCvtBytes );
+ }
+
+ return pConverter->mpConvertTextToUnicodeProc( pConverter->mpConvertData,
+ (void*)hContext,
+ pSrcBuf, nSrcBytes,
+ pDestBuf, nDestChars,
+ nFlags, pInfo,
+ pSrcCvtBytes );
+}
+
+/* ======================================================================= */
+
+rtl_UnicodeToTextConverter SAL_CALL rtl_createUnicodeToTextConverter( rtl_TextEncoding eTextEncoding )
+{
+ const ImplTextEncodingData* pData = Impl_getTextEncodingData( eTextEncoding );
+ if ( pData )
+ return (rtl_TextToUnicodeConverter) &pData->maConverter;
+ else
+ return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL rtl_destroyUnicodeToTextConverter( rtl_UnicodeToTextConverter hConverter )
+{
+ (void) hConverter; /* unused */
+}
+
+/* ----------------------------------------------------------------------- */
+
+rtl_UnicodeToTextContext SAL_CALL rtl_createUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter )
+{
+ const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter;
+ if ( !pConverter )
+ return 0;
+ else if ( pConverter->mpCreateUnicodeToTextContext )
+ return (rtl_UnicodeToTextContext)pConverter->mpCreateUnicodeToTextContext();
+ else
+ return (rtl_UnicodeToTextContext)1;
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL rtl_destroyUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter,
+ rtl_UnicodeToTextContext hContext )
+{
+ const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter;
+ if ( pConverter && hContext && pConverter->mpDestroyUnicodeToTextContext )
+ pConverter->mpDestroyUnicodeToTextContext( (void*)hContext );
+}
+
+/* ----------------------------------------------------------------------- */
+
+void SAL_CALL rtl_resetUnicodeToTextContext( rtl_UnicodeToTextConverter hConverter,
+ rtl_UnicodeToTextContext hContext )
+{
+ const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter;
+ if ( pConverter && hContext && pConverter->mpResetUnicodeToTextContext )
+ pConverter->mpResetUnicodeToTextContext( (void*)hContext );
+}
+
+/* ----------------------------------------------------------------------- */
+
+sal_Size SAL_CALL rtl_convertUnicodeToText( rtl_UnicodeToTextConverter hConverter,
+ rtl_UnicodeToTextContext hContext,
+ const sal_Unicode* pSrcBuf, sal_Size nSrcChars,
+ sal_Char* pDestBuf, sal_Size nDestBytes,
+ sal_uInt32 nFlags, sal_uInt32* pInfo,
+ sal_Size* pSrcCvtChars )
+{
+ const ImplTextConverter* pConverter = (const ImplTextConverter*)hConverter;
+
+ /* Only temporaer, because we don't want die, if we don't have a
+ converter, because not all converters are implemented yet */
+ if ( !pConverter )
+ {
+ return ImplUnicodeToDummy( pSrcBuf, nSrcChars,
+ pDestBuf, nDestBytes,
+ nFlags, pInfo, pSrcCvtChars );
+ }
+
+ return pConverter->mpConvertUnicodeToTextProc( pConverter->mpConvertData,
+ (void*)hContext,
+ pSrcBuf, nSrcChars,
+ pDestBuf, nDestBytes,
+ nFlags, pInfo,
+ pSrcCvtChars );
+}
diff --git a/sal/textenc/textenc.cxx b/sal/textenc/textenc.cxx
new file mode 100644
index 000000000000..00a46e509f02
--- /dev/null
+++ b/sal/textenc/textenc.cxx
@@ -0,0 +1,226 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+/* TODO! This file should not be called textenc.c, because it is not the
+ implementation of rtl/textenc.h. Rather, it should be called
+ gettextencodingdata.c. */
+#include "gettextencodingdata.h"
+#include "tenchelp.h"
+#include "rtl/textenc.h"
+
+#ifndef INCLUDED_STDDEF_H
+#include <stddef.h>
+#define INCLUDED_STDDEF_H
+#endif
+
+#define NOTABUNI_START 0xFF
+#define NOTABUNI_END 0x00
+
+#define NOTABCHAR_START 0xFFFF
+#define NOTABCHAR_END 0x0000
+
+#define SAME8090UNI_START 0x80
+#define SAME8090UNI_END 0x9F
+static sal_uInt16 const aImpl8090SameToUniTab[SAME8090UNI_END
+ - SAME8090UNI_START
+ + 1]
+= { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, /* 0x80 */
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, /* 0x90 */
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F };
+
+#define SAME8090CHAR_START 0x0080
+#define SAME8090CHAR_END 0x009F
+static sal_uChar const aImpl8090SameToCharTab[SAME8090CHAR_END
+ - SAME8090CHAR_START
+ + 1]
+ = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x0080 */
+ 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x0090 */
+ 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F };
+
+#define SAMEA0FFCHAR_START 0x00A0
+#define SAMEA0FFCHAR_END 0x00FF
+static sal_uChar const aImplA0FFSameToCharTab[SAMEA0FFCHAR_END
+ - SAMEA0FFCHAR_START
+ + 1]
+ = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, /* 0x00A0 */
+ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
+ 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, /* 0x00B0 */
+ 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
+ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, /* 0x00C0 */
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, /* 0x00D0 */
+ 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, /* 0x00E0 */
+ 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+ 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, /* 0x00F0 */
+ 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF };
+
+static sal_uInt16 const aImplDoubleByteIdentifierTab[1] = { 0 };
+
+#include "tcvtarb1.tab"
+#include "tcvteas1.tab"
+#include "tcvtest1.tab"
+#include "tcvtjp1.tab"
+#include "tcvtjp2.tab"
+#include "tcvtjp3.tab"
+#include "tcvtjp4.tab"
+#include "tcvtjp5.tab"
+#include "tcvtjp6.tab"
+#include "tcvtkr1.tab"
+#include "tcvtkr2.tab"
+#include "tcvtkr4.tab"
+#include "tcvtkr5.tab"
+#include "tcvtkr6.tab"
+#include "tcvtlat1.tab"
+#include "tcvtscn1.tab"
+#include "tcvtscn2.tab"
+#include "tcvtscn3.tab"
+#include "tcvtscn4.tab"
+#include "tcvtscn5.tab"
+#include "tcvtscn6.tab"
+#include "tcvtsym1.tab"
+#include "tcvttcn1.tab"
+#include "tcvttcn2.tab"
+#include "tcvttcn6.tab"
+#include "tcvtuni1.tab"
+#include "convertiscii.tab"
+
+#include "convertbig5hkscs.tab"
+#include "converteuctw.tab"
+#include "convertgb18030.tab"
+#include "convertiso2022cn.tab"
+#include "convertiso2022jp.tab"
+#include "convertiso2022kr.tab"
+#include "convertadobe.tab"
+
+ImplTextEncodingData const *
+Impl_getTextEncodingData(rtl_TextEncoding nEncoding) SAL_THROW_EXTERN_C()
+{
+ static ImplTextEncodingData const * const aData[]
+ = { NULL, /* DONTKNOW */
+ &aImplMS1252TextEncodingData, /* MS_1252 */
+ &aImplAPPLEROMANTextEncodingData, /* APPLE_ROMAN */
+ &aImplIBM437TextEncodingData, /* IBM_437 */
+ &aImplIBM850TextEncodingData, /* IBM_850 */
+ &aImplIBM860TextEncodingData, /* IBM_860 */
+ &aImplIBM861TextEncodingData, /* IBM_861 */
+ &aImplIBM863TextEncodingData, /* IBM_863 */
+ &aImplIBM865TextEncodingData, /* IBM_865 */
+ NULL, /* reserved (SYSTEM) */
+ &aImplSYMBOLTextEncodingData, /* SYMBOL */
+ &aImplUSASCIITextEncodingData, /* ASCII_US */
+ &aImplISO88591TextEncodingData, /* ISO_8859_1 */
+ &aImplISO88592TextEncodingData, /* ISO_8859_2 */
+ &aImplISO88593TextEncodingData, /* ISO_8859_3 */
+ &aImplISO88594TextEncodingData, /* ISO_8859_4 */
+ &aImplISO88595TextEncodingData, /* ISO_8859_5 */
+ &aImplISO88596TextEncodingData, /* ISO_8859_6 */
+ &aImplISO88597TextEncodingData, /* ISO_8859_7 */
+ &aImplISO88598TextEncodingData, /* ISO_8859_8 */
+ &aImplISO88599TextEncodingData, /* ISO_8859_9 */
+ &aImplISO885914TextEncodingData, /* ISO_8859_14 */
+ &aImplISO885915TextEncodingData, /* ISO_8859_15 */
+ &aImplIBM737TextEncodingData, /* IBM_737 */
+ &aImplIBM775TextEncodingData, /* IBM_775 */
+ &aImplIBM852TextEncodingData, /* IBM_852 */
+ &aImplIBM855TextEncodingData, /* IBM_855 */
+ &aImplIBM857TextEncodingData, /* IBM_857 */
+ &aImplIBM862TextEncodingData, /* IBM_862 */
+ &aImplIBM864TextEncodingData, /* IBM_864 */
+ &aImplIBM866TextEncodingData, /* IBM_866 */
+ &aImplIBM869TextEncodingData, /* IBM_869 */
+ &aImplMS874TextEncodingData, /* MS_874 */
+ &aImplMS1250TextEncodingData, /* MS_1250 */
+ &aImplMS1251TextEncodingData, /* MS_1251 */
+ &aImplMS1253TextEncodingData, /* MS_1253 */
+ &aImplMS1254TextEncodingData, /* MS_1254 */
+ &aImplMS1255TextEncodingData, /* MS_1255 */
+ &aImplMS1256TextEncodingData, /* MS_1256 */
+ &aImplMS1257TextEncodingData, /* MS_1257 */
+ &aImplMS1258TextEncodingData, /* MS_1258 */
+ NULL, /* TODO! APPLE_ARABIC */
+ &aImplAPPLECENTEUROTextEncodingData, /* APPLE_CENTEURO */
+ &aImplAPPLECROATIANTextEncodingData, /* APPLE_CROATIAN */
+ &aImplAPPLECYRILLICTextEncodingData, /* APPLE_CYRILLIC */
+ NULL, /* TODO! APPLE_DEVANAGARI */
+ NULL, /* TODO! APPLE_FARSI */
+ &aImplAPPLEGREEKTextEncodingData, /* APPLE_GREEK */
+ NULL, /* TODO! APPLE_GUJARATI */
+ NULL, /* TODO! APPLE_GURMUKHI */
+ NULL, /* TODO! APPLE_HEBREW */
+ &aImplAPPLEICELANDTextEncodingData, /* APPLE_ICELAND */
+ &aImplAPPLEROMANIANTextEncodingData, /* APPLE_ROMANIAN */
+ NULL, /* TODO! APPLE_THAI */
+ &aImplAPPLETURKISHTextEncodingData, /* APPLE_TURKISH */
+ &aImplAPPLEUKRAINIANTextEncodingData, /* APPLE_UKRAINIAN */
+ &aImplAPPLECHINSIMPTextEncodingData, /* APPLE_CHINSIMP */
+ &aImplAPPLECHINTRADTextEncodingData, /* APPLE_CHINTRAD */
+ &aImplAPPLEJAPANESETextEncodingData, /* APPLE_JAPANESE */
+ &aImplAPPLEKOREANTextEncodingData, /* APPLE_KOREAN */
+ &aImplMS932TextEncodingData, /* MS_932 */
+ &aImplMS936TextEncodingData, /* MS_936 */
+ &aImplMS949TextEncodingData, /* MS_949 */
+ &aImplMS950TextEncodingData, /* MS_950 */
+ &aImplSJISTextEncodingData, /* SHIFT_JIS */
+ &aImplGB2312TextEncodingData, /* GB_2312 */
+ &aImplGBT12345TextEncodingData, /* GBT_12345 */
+ &aImplGBKTextEncodingData, /* GBK */
+ &aImplBIG5TextEncodingData, /* BIG5 */
+ &aImplEUCJPTextEncodingData, /* EUC_JP */
+ &aImplEUCCNTextEncodingData, /* EUC_CN */
+ &aImplEucTwTextEncodingData, /* EUC_TW */
+ &aImplIso2022JpTextEncodingData, /* ISO_2022_JP */
+ &aImplIso2022CnTextEncodingData, /* ISO_2022_CN */
+ &aImplKOI8RTextEncodingData, /* KOI8_R */
+ &aImplUTF7TextEncodingData, /* UTF7 */
+ &aImplUTF8TextEncodingData, /* UTF8 */
+ &aImplISO885910TextEncodingData, /* ISO_8859_10 */
+ &aImplISO885913TextEncodingData, /* ISO_8859_13 */
+ &aImplEUCKRTextEncodingData, /* EUC_KR */
+ &aImplIso2022KrTextEncodingData, /* ISO_2022_KR */
+ &aImplJISX0201TextEncodingData, /* JIS_X_0201 */
+ &aImplJISX0208TextEncodingData, /* JIS_X_0208 */
+ &aImplJISX0212TextEncodingData, /* JIS_X_0212 */
+ &aImplMS1361TextEncodingData, /* MS_1361 */
+ &aImplGb18030TextEncodingData, /* GB_18030 */
+ &aImplBig5HkscsTextEncodingData, /* BIG5_HKSCS */
+ &aImplTis620TextEncodingData, /* TIS_620 */
+ &aImplKoi8UTextEncodingData, /* KOI8_U */
+ &aImplIsciiDevanagariTextEncodingData, /* ISCII_DEVANAGARI */
+ &aImplJavaUtf8TextEncodingData, /* JAVA_UTF8 */
+ &adobeStandardEncodingData, /* ADOBE_STANDARD */
+ &adobeSymbolEncodingData, /* ADOBE_SYMBOL */
+ &aImplPT154TextEncodingData, /* PT154 */
+ &adobeDingbatsEncodingData }; /* ADOBE_DINGBATS */
+ return
+ nEncoding < sizeof aData / sizeof aData[0] ? aData[nEncoding] : NULL;
+}
diff --git a/sal/textenc/unichars.c b/sal/textenc/unichars.c
new file mode 100644
index 000000000000..454e057c7f84
--- /dev/null
+++ b/sal/textenc/unichars.c
@@ -0,0 +1,136 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "unichars.h"
+#include "osl/diagnose.h"
+#include "sal/types.h"
+
+int ImplIsNoncharacter(sal_uInt32 nUtf32)
+{
+ /* All code points that are noncharacters, as of Unicode 3.1.1. */
+ return (nUtf32 >= 0xFDD0 && nUtf32 <= 0xFDEF)
+ || (nUtf32 & 0xFFFF) >= 0xFFFE
+ || nUtf32 > 0x10FFFF;
+}
+
+int ImplIsControlOrFormat(sal_uInt32 nUtf32)
+{
+ /* All code points of <http://www.unicode.org/Public/UNIDATA/
+ UnicodeData.txt>, Version 3.1.1, that have a General Category of Cc
+ (Other, Control) or Cf (Other, Format).
+ */
+ return nUtf32 <= 0x001F
+ || (nUtf32 >= 0x007F && nUtf32 <= 0x009F)
+ || nUtf32 == 0x070F /* SYRIAC ABBREVIATION MARK */
+ || nUtf32 == 0x180B /* MONGOLIAN FREE VARIATION SELECTOR ONE */
+ || nUtf32 == 0x180C /* MONGOLIAN FREE VARIATION SELECTOR TWO */
+ || nUtf32 == 0x180D /* MONGOLIAN FREE VARIATION SELECTOR THREE */
+ || nUtf32 == 0x180E /* MONGOLIAN VOWEL SEPARATOR */
+ || nUtf32 == 0x200C /* ZERO WIDTH NON-JOINER */
+ || nUtf32 == 0x200D /* ZERO WIDTH JOINER */
+ || nUtf32 == 0x200E /* LEFT-TO-RIGHT MARK */
+ || nUtf32 == 0x200F /* RIGHT-TO-LEFT MARK */
+ || nUtf32 == 0x202A /* LEFT-TO-RIGHT EMBEDDING */
+ || nUtf32 == 0x202B /* RIGHT-TO-LEFT EMBEDDING */
+ || nUtf32 == 0x202C /* POP DIRECTIONAL FORMATTING */
+ || nUtf32 == 0x202D /* LEFT-TO-RIGHT OVERRIDE */
+ || nUtf32 == 0x202E /* RIGHT-TO-LEFT OVERRIDE */
+ || nUtf32 == 0x206A /* INHIBIT SYMMETRIC SWAPPING */
+ || nUtf32 == 0x206B /* ACTIVATE SYMMETRIC SWAPPING */
+ || nUtf32 == 0x206C /* INHIBIT ARABIC FORM SHAPING */
+ || nUtf32 == 0x206D /* ACTIVATE ARABIC FORM SHAPING */
+ || nUtf32 == 0x206E /* NATIONAL DIGIT SHAPES */
+ || nUtf32 == 0x206F /* NOMINAL DIGIT SHAPES */
+ || nUtf32 == 0xFEFF /* ZERO WIDTH NO-BREAK SPACE */
+ || nUtf32 == 0xFFF9 /* INTERLINEAR ANNOTATION ANCHOR */
+ || nUtf32 == 0xFFFA /* INTERLINEAR ANNOTATION SEPARATOR */
+ || nUtf32 == 0xFFFB /* INTERLINEAR ANNOTATION TERMINATOR */
+ || nUtf32 == 0x1D173 /* MUSICAL SYMBOL BEGIN BEAM */
+ || nUtf32 == 0x1D174 /* MUSICAL SYMBOL END BEAM */
+ || nUtf32 == 0x1D175 /* MUSICAL SYMBOL BEGIN TIE */
+ || nUtf32 == 0x1D176 /* MUSICAL SYMBOL END TIE */
+ || nUtf32 == 0x1D177 /* MUSICAL SYMBOL BEGIN SLUR */
+ || nUtf32 == 0x1D178 /* MUSICAL SYMBOL END SLUR */
+ || nUtf32 == 0x1D179 /* MUSICAL SYMBOL BEGIN PHRASE */
+ || nUtf32 == 0x1D17A /* MUSICAL SYMBOL END PHRASE */
+ || nUtf32 == 0xE0001 /* LANGUAGE TAG */
+ || (nUtf32 >= 0xE0020 && nUtf32 <= 0xE007F);
+}
+
+int ImplIsHighSurrogate(sal_uInt32 nUtf32)
+{
+ /* All code points that are high-surrogates, as of Unicode 3.1.1. */
+ return nUtf32 >= 0xD800 && nUtf32 <= 0xDBFF;
+}
+
+int ImplIsLowSurrogate(sal_uInt32 nUtf32)
+{
+ /* All code points that are low-surrogates, as of Unicode 3.1.1. */
+ return nUtf32 >= 0xDC00 && nUtf32 <= 0xDFFF;
+}
+
+int ImplIsPrivateUse(sal_uInt32 nUtf32)
+{
+ /* All code points of <http://www.unicode.org/Public/UNIDATA/
+ UnicodeData.txt>, Version 3.1.1, that have a General Category of Co
+ (Other, Private Use).
+ */
+ return (nUtf32 >= 0xE000 && nUtf32 <= 0xF8FF)
+ || (nUtf32 >= 0xF0000 && nUtf32 <= 0xFFFFD)
+ || (nUtf32 >= 0x100000 && nUtf32 <= 0x10FFFD);
+}
+
+int ImplIsZeroWidth(sal_uInt32 nUtf32)
+{
+ /* All code points of <http://www.unicode.org/Public/UNIDATA/
+ UnicodeData.txt>, Version 3.1.1, that have "ZERO WIDTH" in their
+ Character name.
+ */
+ return nUtf32 == 0x200B /* ZERO WIDTH SPACE */
+ || nUtf32 == 0x200C /* ZERO WIDTH NON-JOINER */
+ || nUtf32 == 0x200D /* ZERO WIDTH JOINER */
+ || nUtf32 == 0xFEFF; /* ZEOR WIDTH NO-BREAK SPACE */
+}
+
+sal_uInt32 ImplGetHighSurrogate(sal_uInt32 nUtf32)
+{
+ OSL_ENSURE(nUtf32 >= 0x10000, "specification violation");
+ return ((nUtf32 - 0x10000) >> 10) | 0xD800;
+}
+
+sal_uInt32 ImplGetLowSurrogate(sal_uInt32 nUtf32)
+{
+ OSL_ENSURE(nUtf32 >= 0x10000, "specification violation");
+ return ((nUtf32 - 0x10000) & 0x3FF) | 0xDC00;
+}
+
+sal_uInt32 ImplCombineSurrogates(sal_uInt32 nHigh, sal_uInt32 nLow)
+{
+ OSL_ENSURE(ImplIsHighSurrogate(nHigh) && ImplIsLowSurrogate(nLow),
+ "specification violation");
+ return (((nHigh & 0x3FF) << 10) | (nLow & 0x3FF)) + 0x10000;
+}
diff --git a/sal/textenc/unichars.h b/sal/textenc/unichars.h
new file mode 100644
index 000000000000..f629432a29f8
--- /dev/null
+++ b/sal/textenc/unichars.h
@@ -0,0 +1,62 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_RTL_TEXTENC_UNICHARS_H
+#define INCLUDED_RTL_TEXTENC_UNICHARS_H
+
+#include "sal/types.h"
+
+#if defined __cplusplus
+extern "C" {
+#endif /* __cpluscplus */
+
+#define RTL_TEXTENC_UNICODE_REPLACEMENT_CHARACTER 0xFFFD
+
+int ImplIsNoncharacter(sal_uInt32 nUtf32) SAL_THROW_EXTERN_C();
+
+int ImplIsControlOrFormat(sal_uInt32 nUtf32) SAL_THROW_EXTERN_C();
+
+int ImplIsHighSurrogate(sal_uInt32 nUtf32) SAL_THROW_EXTERN_C();
+
+int ImplIsLowSurrogate(sal_uInt32 nUtf32) SAL_THROW_EXTERN_C();
+
+int ImplIsPrivateUse(sal_uInt32 nUtf32) SAL_THROW_EXTERN_C();
+
+int ImplIsZeroWidth(sal_uInt32 nUtf32) SAL_THROW_EXTERN_C();
+
+sal_uInt32 ImplGetHighSurrogate(sal_uInt32 nUtf32) SAL_THROW_EXTERN_C();
+
+sal_uInt32 ImplGetLowSurrogate(sal_uInt32 nUtf32) SAL_THROW_EXTERN_C();
+
+sal_uInt32 ImplCombineSurrogates(sal_uInt32 nHigh, sal_uInt32 nLow)
+ SAL_THROW_EXTERN_C();
+
+#if defined __cplusplus
+}
+#endif /* __cpluscplus */
+
+#endif /* INCLUDED_RTL_TEXTENC_UNICHARS_H */
diff --git a/sal/typesconfig/makefile.mk b/sal/typesconfig/makefile.mk
new file mode 100644
index 000000000000..d5f7db30dd5c
--- /dev/null
+++ b/sal/typesconfig/makefile.mk
@@ -0,0 +1,61 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..
+
+PRJNAME=sal
+TARGET=typesconfig
+TARGETTYPE=CUI
+
+LIBSALCPPRT=$(0)
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+APP1TARGET= $(TARGET)
+APP1OBJS= $(OBJ)$/typesconfig.obj
+APP1STDLIBS=
+APP1DEF=
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(L10N-framework)"==""
+ALLTAR : $(INCCOM)$/sal$/typesizes.h
+.ENDIF # "$(L10N-framework)"==""
+
+$(INCCOM)$/sal$/typesizes.h : $(BIN)$/$(TARGET)
+ -$(MKDIR) $(INCCOM)$/sal
+ $(AUGMENT_LIBRARY_PATH) $(BIN)$/$(TARGET) $@
+
diff --git a/sal/typesconfig/typesconfig.c b/sal/typesconfig/typesconfig.c
new file mode 100644
index 000000000000..708837be926b
--- /dev/null
+++ b/sal/typesconfig/typesconfig.c
@@ -0,0 +1,490 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <stdarg.h>
+
+#include <signal.h>
+#include <setjmp.h>
+
+#define printTypeSize(Type,Name) printf( "sizeof(%s)\t\t= %d\n", Name, (int) sizeof (Type) )
+
+#define isSignedType(Type) (((Type)-1) < 0)
+#define printTypeSign(Type,Name) printf( "%s\t\t= %s %s\n", Name, ( isSignedType(Type) ? "signed" : "unsigned" ), Name )
+
+
+/*************************************************************************
+|*
+|* IsBigEndian()
+|*
+|* Beschreibung True, wenn CPU BigEndian ist
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+int IsBigEndian()
+{
+ long l = 1;
+ return ! *(char*)&l;
+}
+
+/*************************************************************************
+|*
+|* Typdeclarations for memory access test functions
+|*
+*************************************************************************/
+typedef enum { t_char, t_short, t_int, t_long, t_double } Type;
+typedef int (*TestFunc)( Type, void* );
+
+
+/*************************************************************************
+|*
+|* PrintArgs()
+|*
+|* Beschreibung Testfunktion fuer variable Parameter
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+void PrintArgs( int p, ... )
+{
+ int value;
+ va_list ap;
+
+ va_start( ap, p );
+
+ printf( "value = %d", p );
+
+ while ( ( value = va_arg(ap, int) ) != 0 )
+ printf( " %d", value );
+
+ printf( "\n" );
+ va_end(ap);
+}
+
+/*************************************************************************
+|*
+|* SignalHdl()
+|*
+|* Beschreibung faengt SIGBUS und SIGSEGV in check() ab
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+
+static sigjmp_buf jmpbuf;
+static volatile sig_atomic_t hit;
+
+void SignalHdl( int sig )
+{
+ (void) sig; // ignored
+ hit = 1;
+ siglongjmp(jmpbuf, 0);
+}
+
+/*************************************************************************
+|*
+|* check()
+|*
+|* Beschreibung Testet MemoryZugriff (read/write)
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+int check( TestFunc func, Type eT, void* p )
+{
+ hit = 0;
+ if (sigsetjmp(jmpbuf, 1) == 0) {
+ struct sigaction sa;
+ sa.sa_handler = SignalHdl;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = 0;
+ if (sigaction(SIGBUS, &sa, NULL) != 0 ||
+ sigaction(SIGSEGV, &sa, NULL) != 0)
+ {
+ abort();
+ }
+ func(eT, p);
+ sa.sa_handler = SIG_DFL;
+ if (sigaction(SIGBUS, &sa, NULL) != 0 ||
+ sigaction(SIGSEGV, &sa, NULL) != 0)
+ {
+ abort();
+ }
+ }
+ return hit ? -1 : 0;
+}
+
+/*************************************************************************
+|*
+|* GetAtAddress()
+|*
+|* Beschreibung memory read access
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+#if defined(IA64) || defined(ARM32) || defined(HPPA) || defined(AXP)
+
+int forceerror()
+{
+#if defined(ARM32)
+// workaround for qemu-user
+ hit = 1;
+#else
+ raise (SIGBUS);
+#endif
+ return 1;
+}
+
+int GetAtAddress( Type eT, void* p )
+{
+ switch ( eT )
+ {
+ case t_char: return *((char*)p);
+ case t_short: if ((long)p % sizeof(short)) return forceerror(); else return *((short*)p);
+ case t_int: if ((long)p % sizeof(int)) return forceerror(); else return *((int*)p);
+ case t_long: if ((long)p % sizeof(long)) return forceerror(); else return *((long*)p);
+ case t_double: if ((long)p % sizeof(double)) return forceerror(); else return *((double*)p);
+ }
+ abort();
+}
+
+#else
+static int dummy(void* unused);
+
+int GetAtAddress( Type eT, void* p )
+{
+ switch ( eT )
+ {
+ case t_char: { char x = *(char*)p; return dummy(&x); }
+ case t_short: { short x = *(short*)p; return dummy(&x); }
+ case t_int: { int x = *(int*)p; return dummy(&x); }
+ case t_long: { long x = *(long*)p; return dummy(&x); }
+ case t_double: { double x = *(double*)p; return dummy(&x); }
+ }
+ abort();
+}
+
+int dummy(void* unused)
+{
+ (void)unused;
+ return 0;
+}
+
+#endif
+/*************************************************************************
+|*
+|* SetAtAddress()
+|*
+|* Beschreibung memory write access
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+int SetAtAddress( Type eT, void* p )
+{
+ switch ( eT )
+ {
+ case t_char: return *((char*)p) = 0;
+ case t_short: return *((short*)p) = 0;
+ case t_int: return *((int*)p) = 0;
+ case t_long: return *((long*)p) = 0;
+ case t_double: return *((double*)p)= 0;
+ }
+ abort();
+}
+
+char* TypeName( Type eT )
+{
+ switch ( eT )
+ {
+ case t_char: return "char";
+ case t_short: return "short";
+ case t_int: return "int";
+ case t_long: return "long";
+ case t_double: return "double";
+ }
+ abort();
+}
+
+/*************************************************************************
+|*
+|* Check(Get|Set)Access()
+|*
+|* Beschreibung Testet MemoryZugriff (read/write)
+|* Zugriffsverletzungen werden abgefangen
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+int CheckGetAccess( Type eT, void* p )
+{
+ int b;
+ b = -1 != check( (TestFunc)GetAtAddress, eT, p );
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr,
+ "%s read %s at %p\n",
+ (b? "can" : "can not" ), TypeName(eT), p );
+#endif
+ return b;
+}
+int CheckSetAccess( Type eT, void* p )
+{
+ int b;
+
+ b = -1 != check( (TestFunc)SetAtAddress, eT, p );
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr,
+ "%s write %s at %p\n",
+ (b? "can" : "can not" ), TypeName(eT), p );
+#endif
+ return b;
+}
+
+/*************************************************************************
+|*
+|* GetAlignment()
+|*
+|* Beschreibung Bestimmt das Alignment verschiedener Typen
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+int GetAlignment( Type eT )
+{
+ char a[ 16*8 ];
+ long p = (long)(void*)a;
+ int i;
+
+ /* clear a[...] to set legal value for double access */
+ for ( i = 0; i < 16*8; i++ )
+ a[i] = 0;
+
+ p = ( p + 0xF ) & ~0xF;
+ for ( i = 1; i < 16; i++ )
+ if ( CheckGetAccess( eT, (void*)(p+i) ) )
+ return i;
+ return 0;
+}
+
+/*************************************************************************
+|*
+|* struct Description
+|*
+|* Beschreibung Beschreibt die Parameter der Architektur
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+struct Description
+{
+ int bBigEndian;
+ int nAlignment[3]; /* 2,4,8 */
+};
+
+/*************************************************************************
+|*
+|* Description_Ctor()
+|*
+|* Beschreibung Bestimmt die Parameter der Architektur
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+void Description_Ctor( struct Description* pThis )
+{
+ pThis->bBigEndian = IsBigEndian();
+
+ if ( sizeof(short) != 2 )
+ abort();
+ pThis->nAlignment[0] = GetAlignment( t_short );
+ if ( sizeof(int) != 4 )
+ abort();
+ pThis->nAlignment[1] = GetAlignment( t_int );
+
+ if ( sizeof(long) == 8 )
+ pThis->nAlignment[2] = GetAlignment( t_long );
+ else if ( sizeof(double) == 8 )
+ pThis->nAlignment[2] = GetAlignment( t_double );
+ else
+ abort();
+}
+
+/*************************************************************************
+|*
+|* Description_Print()
+|*
+|* Beschreibung Schreibt die Parameter der Architektur als Header
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+void Description_Print( struct Description* pThis, char* name )
+{
+ int i;
+ FILE* f = fopen( name, "w" );
+ if( ! f ) {
+ fprintf( stderr, "Unable to open file %s: %s\n", name, strerror( errno ) );
+ exit( 99 );
+ }
+ fprintf( f, "/* This file is autogenerated from the 'typesconfig' program\n * in the sal module\n */\n\n" );
+
+/* Disabled for now in preference to big/little endian defines in <osl/endian.h> fa (2004-03-15) */
+/* fprintf( f, "#define SAL_TYPES_%s\n", pThis->bBigEndian ? "BIGENDIAN" : "LITTLEENDIAN" ); */
+
+ for ( i = 0; i < 3; i++ )
+ fprintf( f, "#define SAL_TYPES_ALIGNMENT%d\t%d\n", 1 << (i+1), pThis->nAlignment[i] );
+ fprintf( f, "#define SAL_TYPES_SIZEOFSHORT\t%d\n", (int) sizeof( short ) );
+ fprintf( f, "#define SAL_TYPES_SIZEOFINT\t%d\n", (int) sizeof( int ) );
+ fprintf( f, "#define SAL_TYPES_SIZEOFLONG\t%d\n", (int) sizeof( long ) );
+ fprintf( f, "#define SAL_TYPES_SIZEOFLONGLONG\t%d\n", (int) sizeof( long long ) );
+ fprintf( f, "#define SAL_TYPES_SIZEOFPOINTER\t%d\n", (int) sizeof( void* ) );
+
+/* Disabled for now, becuase OOo code assumes sizeof(double) == 8 and this is not
+ * likely to change any time soon. fa (2004-03-15)
+ */
+/* fprintf( f, "#define SAL_TYPES_SIZEOFDOUBLE\t%d\n", sizeof( double ) );*/
+
+ fclose( f );
+}
+
+/*************************************************************************
+|*
+|* InfoMemoryAccess()
+|*
+|* Beschreibung Informeller Bytezugriffstest
+|*
+|* Ersterstellung EG 26.06.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+void InfoMemoryAccess( char* p )
+{
+ if ( CheckGetAccess( t_char, p ) )
+ printf( "can read address %p\n", p );
+ else
+ printf( "cannot read address %p\n", p );
+
+ if ( CheckSetAccess( t_char, p ) )
+ printf( "can write address %p\n", p );
+ else
+ printf( "cannot write address %p\n", p );
+}
+
+/*************************************************************************
+|*
+|* InfoMemoryTypeAccess()
+|*
+|* Beschreibung Informeller Zugriffstest verschiedener Typen
+|*
+|* Ersterstellung EG 15.08.96
+|* Letzte Aenderung
+|*
+*************************************************************************/
+void InfoMemoryTypeAccess( Type eT )
+{
+ char a[64];
+ int i;
+
+ /* clear a[...] to set legal value for double access */
+ for ( i = 0; i < 64; i++ )
+ a[i] = 0;
+
+ for ( i = 56; i >= 7; i >>= 1 )
+ {
+ if ( CheckGetAccess(eT, (long*)&a[i]) )
+ printf( "Access %s on %i-Aligned Address : OK\n", TypeName(eT), i / 7 );
+ else
+ printf( "Access %s on %i-Aligned Address : ERROR\n", TypeName(eT), i / 7 );
+ }
+}
+/************************************************************************
+ *
+ * Use C code to determine the characteristics of the building platform.
+ *
+ ************************************************************************/
+int main( int argc, char* argv[] )
+{
+ printTypeSign( char, "char" );
+ printTypeSign( short, "short" );
+ printTypeSign( int, "int" );
+ printTypeSign( long, "long" );
+ printTypeSign( long long, "long long" );
+
+ printTypeSize( short, "short" );
+ printTypeSize( int, "int" );
+ printTypeSize( long, "long" );
+ printTypeSize( long long, "long long" );
+ printTypeSize( float, "float" );
+ printTypeSize( double, "double" );
+ printTypeSize( void *, "void *" );
+
+ if ( IsBigEndian() )
+ printf( "BIGENDIAN (Sparc, RS6000, IP22, IP32, PowerPC(BE))\n" );
+ else
+ printf( "LITTLEENDIAN (Intel, x86-64, PowerPC(LE))\n" );
+
+ /* PrintArgs( 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ); */
+
+ if ( argc > 1 )
+ {
+ struct Description description;
+ Description_Ctor( &description );
+ Description_Print( &description, argv[1] );
+ }
+ {
+ char* p = NULL;
+ InfoMemoryAccess( p );
+ p = (char*)&p;
+ InfoMemoryAccess( p );
+ InfoMemoryTypeAccess( t_short );
+ InfoMemoryTypeAccess( t_int );
+ InfoMemoryTypeAccess( t_long );
+ InfoMemoryTypeAccess( t_double );
+ }
+
+ exit( 0 );
+}
diff --git a/sal/unosdk.mk b/sal/unosdk.mk
new file mode 100644
index 000000000000..765ecfc3f1b1
--- /dev/null
+++ b/sal/unosdk.mk
@@ -0,0 +1,47 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PPATH=inc
+
+FILES= \
+ $(PPATH)\rtl\wstring \
+ $(PPATH)\rtl\wstring.h \
+ $(PPATH)\rtl\wstring.hxx \
+ $(PPATH)\rtl\string.h \
+ $(PPATH)\rtl\string.hxx \
+ $(PPATH)\rtl\wstrbuf.hxx \
+ $(PPATH)\rtl\strbuf.hxx \
+ $(PPATH)\rtl\locale.h \
+ $(PPATH)\rtl\locale.hxx \
+ $(PPATH)\rtl\char.h \
+ $(PPATH)\rtl\char.hxx \
+ $(PPATH)\rtl\macros.hxx \
+ $(PPATH)\rtl\object.h \
+ $(PPATH)\rtl\rb.h
+
+unosdk: $(FILES)
+ docpp -H -m -f -u -d ..\..\doc\sal\rtl $(FILES)
diff --git a/sal/util/makefile.mk b/sal/util/makefile.mk
new file mode 100644
index 000000000000..82ebbc811c8d
--- /dev/null
+++ b/sal/util/makefile.mk
@@ -0,0 +1,241 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..
+
+PRJNAME=sal
+TARGET=sal
+
+NO_BSYMBOLIC=TRUE
+NO_DEFAULT_STL=TRUE
+
+USE_LDUMP2=TRUE
+USE_DEFFILE=TRUE
+
+.IF "$(GUI)"=="UNX"
+TARGETTYPE=CUI
+.ENDIF # UNX
+
+UNIXVERSIONNAMES=UDK
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+.IF "$(depend)" == ""
+
+# --- Files --------------------------------------------------------
+
+# disable check for PIC code as it would complain about
+# hand coded assembler
+CHECKFORPIC=
+
+.IF "$(header)" == ""
+
+LIB1TARGET=$(SLB)$/$(TARGET).lib
+LIB1FILES= \
+ $(SLB)$/oslall.lib \
+ $(SLB)$/cpposl.lib \
+ $(SLB)$/cpprtl.lib \
+ $(SLB)$/textenc.lib
+
+#.IF "$(GUI)"=="UNX"
+#LIB1FILES+=$(SLB)$/systoolsunx.lib
+#.ENDIF # UNX
+
+
+LIB3TARGET=$(LB)$/a$(TARGET).lib
+LIB3ARCHIV=$(LB)$/lib$(TARGET)$(DLLPOSTFIX).a
+LIB3FILES= \
+ $(LB)$/oslall.lib \
+ $(LB)$/cpposl.lib \
+ $(LB)$/cpprtl.lib \
+ $(LB)$/textenc.lib
+
+#.IF "$(GUI)"=="UNX"
+#LIB3FILES+=$(LB)$/systoolsunx.lib
+#.ENDIF # UNX
+
+.IF "$(GUI)" == "WNT" || "$(GUI)"=="OS2"
+SHL1TARGET= $(TARGET)
+.ELSE
+SHL1TARGET= uno_$(TARGET)
+.ENDIF
+SHL1IMPLIB= i$(TARGET)
+SHL1VERSIONMAP= $(TARGET).map
+SHL1RPATH=URELIB
+
+.IF "$(GUI)"=="WNT"
+
+.IF "$(COM)"=="GCC"
+UWINAPILIB= -luwinapi
+.ELSE
+UWINAPILIB= $(LB)$/uwinapi.lib
+.ENDIF
+
+SHL1STDLIBS= \
+ $(UWINAPILIB)\
+ $(ADVAPI32LIB)\
+ $(WSOCK32LIB)\
+ $(MPRLIB)\
+ $(SHELL32LIB)\
+ $(COMDLG32LIB)\
+ $(USER32LIB)\
+ $(OLE32LIB)
+.IF "$(COM)"=="GCC"
+MINGWSSTDOBJ=
+MINGWSSTDENDOBJ=
+.ENDIF
+.ENDIF # WNT
+
+.IF "$(GUI)"=="UNX"
+.IF "$(OS)"=="SOLARIS"
+# libposix4.so (SunOS 5.6) <-> librt.so (SunOS >= 5.7)
+SHL1STDLIBS= -Bdynamic -ldl -lpthread -lposix4 -lsocket -lnsl
+.IF "$(COM)" == "C50"
+SHL1STDLIBS+= -z allextract -staticlib=Crun -z defaultextract
+.ENDIF # C50
+.ENDIF # SOLARIS
+.ENDIF # UNX
+
+.IF "$(GUI)"=="OS2"
+SHL1STDLIBS=pthread.lib
+.ENDIF # OS2
+
+# If we compile sal with STLport checking iterators
+# we need to link against the STLport
+.IF "$(USE_STLP_DEBUG)" != ""
+SHL1STDLIBS+=$(LIBSTLPORT)
+.ENDIF
+
+#The irony that using the system STL instead of
+#stlport requires that we link libsal with the
+#LIBSTLPORT alias which is not required when using
+#stlport is not lost on me
+.IF "$(USE_SYSTEM_STL)"=="YES"
+SHL1STDLIBS+=$(LIBSTLPORT)
+.ENDIF
+
+.IF "$(OS)"=="MACOSX"
+SHL1STDLIBS+=-framework CoreFoundation -framework Carbon
+.ENDIF
+
+.IF "$(OS)" == "LINUX"
+.IF "$(PAM_LINK)" == "YES"
+SHL1STDLIBS+=-lpam
+.ENDIF
+.IF "$(CRYPT_LINK)" == "YES"
+SHL1STDLIBS+=-lcrypt
+.ENDIF
+.ENDIF
+
+# #i105898# required for LD_PRELOAD libsalalloc_malloc.so
+# if sal is linked with -Bsymbolic-functions
+.IF "$(HAVE_LD_BSYMBOLIC_FUNCTIONS)" == "TRUE"
+SHL1LINKFLAGS+=-Wl,--dynamic-list=salalloc.list
+.ENDIF # .IF "$(HAVE_LD_BSYMBOLIC_FUNCTIONS)" == "TRUE"
+
+SHL1LIBS+=$(SLB)$/$(TARGET).lib
+
+.IF "$(linkinc)" != ""
+SHL11FILE=$(MISC)$/sal.slo
+.ELSE
+.IF "$(GUI)"=="UNX"
+SHL1OBJS=
+.ELSE
+.IF "$(GUI)$(COM)"!="WNTGCC"
+SHL1OBJS= \
+ $(SLO)$/dllentry.obj
+.ENDIF # WNTGCC
+.ENDIF # UNX
+.ENDIF # lincinc
+
+SHL1DEPN=
+SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME= $(SHL1TARGET)
+
+#
+# This part builds a tiny extra lib,
+# containing an alloc.c which uses system
+# heap instead of our own mem management.
+# This is e.g. useful for proper valgrinding
+# the office.
+#
+.IF "$(OS)"=="LINUX"
+
+TARGET2 = salalloc_malloc
+SHL2TARGET= $(TARGET2)
+SHL2IMPLIB= i$(TARGET2)
+SHL2VERSIONMAP= salalloc.map
+
+SHL2LIBS+=$(SLB)$/SYSALLOC_cpprtl.lib
+
+.ENDIF # .IF "$(OS)"=="LINUX"
+
+# --- Coverage -----------------------------------------------------
+# LLA: 20040304 The follows lines are an additional which is only need if we run
+# coverage tests. For normal test runs this feature is not used.
+# For more information about coverage tests see:
+# http://gcc.gnu.org/onlinedocs/gcc-3.0/gcc_8.html
+#
+# Why this additional?
+# Anybody has decide to link sal with g++ instead of gcc.
+#
+.IF "$(TESTCOVERAGE)"!=""
+.IF "$(GUI)"=="UNX"
+.IF "$(COM)"=="GCC"
+.IF "$(OS)"=="LINUX"
+SHL1STDLIBS+=-lgcc
+.ENDIF
+.ENDIF
+.ENDIF
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.ENDIF # $(header) != ""
+.ENDIF # $(depend) != ""
+
+.INCLUDE : target.mk
+
+.IF "$(SHL1TARGETN)" != ""
+$(SHL1TARGETN) : $(OUT)$/inc$/udkversion.h
+.ENDIF # "$(SHL1TARGETN)" != ""
+
+$(OUT)$/inc$/udkversion.h:
+ echo '#ifndef _SAL_UDKVERSION_H_' > $@
+ echo '#define _SAL_UDKVERSION_H_' >> $@
+ echo '' >> $@
+ echo '#define SAL_UDK_MAJOR "$(UDK_MAJOR)"' >> $@
+ echo '#define SAL_UDK_MINOR "$(UDK_MINOR)"' >> $@
+ echo '#define SAL_UDK_MICRO "$(UDK_MICRO)"' >> $@
+ echo '' >> $@
+ echo '#endif' >> $@
diff --git a/sal/util/sal.map b/sal/util/sal.map
new file mode 100755
index 000000000000..8b1c079ec899
--- /dev/null
+++ b/sal/util/sal.map
@@ -0,0 +1,620 @@
+UDK_3_0_0 {
+ global:
+ GetVersionInfo;
+ osl_acceptConnectionOnSocket;
+ osl_acceptPipe;
+ osl_acquireSocket;
+ osl_acquirePipe;
+ osl_acquireMutex;
+ osl_acquireSemaphore;
+ osl_addSignalHandler;
+ osl_addToSocketSet;
+ osl_assertFailedLine;
+ osl_bindAddrToSocket;
+ osl_breakDebug;
+ osl_checkCondition;
+ osl_clearSocketSet;
+ osl_closeDirectory;
+ osl_closePipe;
+ osl_closeProfile;
+ osl_connectSocketTo;
+ osl_copyHostAddr;
+ osl_copySocketAddr;
+ osl_createCondition;
+ osl_createEmptySocketAddr;
+ osl_createHostAddr;
+ osl_createHostAddrByAddr;
+ osl_createHostAddrByName;
+ osl_createInetSocketAddr;
+ osl_createMutex;
+ osl_createPipe;
+ osl_createSemaphore;
+ osl_createSocket;
+ osl_createSocketSet;
+ osl_createSuspendedThread;
+ osl_createThread;
+ osl_createThreadKey;
+ osl_decrementInterlockedCount;
+ osl_demultiplexSocketEvents;
+ osl_destroyCondition;
+ osl_destroyHostAddr;
+ osl_destroyMutex;
+ osl_destroySemaphore;
+ osl_destroySocketAddr;
+ osl_destroySocketSet;
+ osl_destroyThread;
+ osl_destroyThreadKey;
+ osl_enableNonBlockingMode;
+ osl_executeProcess;
+ osl_executeProcess_WithRedirectedIO;
+ osl_flushProfile;
+ osl_freeProcessHandle;
+ osl_freeSecurityHandle;
+ osl_getAddrOfSocketAddr;
+ osl_getCommandArg;
+ osl_getCommandArgCount;
+ osl_getConfigDir;
+ osl_getCurrentSecurity;
+ osl_getDirectoryItem;
+ osl_getDottedInetAddrOfSocketAddr;
+ osl_getEnvironment;
+ osl_getEthernetAddress;
+ osl_getExecutableFile;
+ osl_getFamilyOfSocketAddr;
+ osl_getFileStatus;
+ osl_getFileURLFromSystemPath;
+ osl_getGlobalMutex;
+ osl_getHomeDir;
+ osl_getHostnameOfHostAddr;
+ osl_getHostnameOfSocketAddr;
+ osl_getInetPortOfSocketAddr;
+ osl_getLastPipeError;
+ osl_getLastSocketError;
+ osl_getLastSocketErrorDescription;
+ osl_getLocalAddrOfSocket;
+ osl_getLocalHostname;
+ osl_getModuleURLFromAddress;
+ osl_getNextDirectoryItem;
+ osl_getPeerAddrOfSocket;
+ osl_getProcess;
+ osl_getProcessInfo;
+ osl_getProcessWorkingDir;
+ osl_getProfileSectionEntries;
+ osl_getProfileSections;
+ osl_getServicePort;
+ osl_getSocketAddrOfHostAddr;
+ osl_getSocketOption;
+ osl_getSocketType;
+ osl_getSymbol;
+ osl_getSystemPathFromFileURL;
+ osl_getSystemTime;
+ osl_getThreadIdentifier;
+ osl_getThreadKeyData;
+ osl_getThreadPriority;
+ osl_getThreadTextEncoding;
+ osl_getUserIdent;
+ osl_getUserName;
+ osl_getVolumeInformation;
+ osl_incrementInterlockedCount;
+ osl_isAdministrator;
+ osl_isEndOfFile;
+ osl_isEqualSocketAddr;
+ osl_isExceptionPending;
+ osl_isInSocketSet;
+ osl_isNonBlockingMode;
+ osl_isReceiveReady;
+ osl_isSendReady;
+ osl_isThreadRunning;
+ osl_joinProcess;
+ osl_joinWithThread;
+ osl_listenOnSocket;
+ osl_loadModule;
+ osl_loginUser;
+ osl_loginUserOnFileServer;
+ osl_openDirectory;
+ osl_openProfile;
+ osl_raiseSignal;
+ osl_readProfileBool;
+ osl_readProfileIdent;
+ osl_readProfileString;
+ osl_readPipe;
+ osl_readSocket;
+ osl_receiveFromSocket;
+ osl_receivePipe;
+ osl_receiveSocket;
+ osl_releaseDirectoryItem;
+ osl_releaseMutex;
+ osl_releasePipe;
+ osl_releaseSemaphore;
+ osl_releaseSocket;
+ osl_removeFromSocketSet;
+ osl_removeProfileEntry;
+ osl_removeSignalHandler;
+ osl_reportError;
+ osl_resetCondition;
+ osl_resolveHostname;
+ osl_resumeThread;
+ osl_scheduleThread;
+ osl_searchFileURL;
+ osl_sendPipe;
+ osl_sendSocket;
+ osl_sendToSocket;
+ osl_setCondition;
+ osl_setFileAttributes;
+ osl_setFileTime;
+ osl_setInetPortOfSocketAddr;
+ osl_setAddrOfSocketAddr;
+ osl_setSocketOption;
+ osl_setThreadKeyData;
+ osl_setThreadPriority;
+ osl_setThreadTextEncoding;
+ osl_shutdownSocket;
+ osl_suspendThread;
+ osl_terminateProcess;
+ osl_terminateThread;
+ osl_trace;
+ osl_tryToAcquireMutex;
+ osl_tryToAcquireSemaphore;
+ osl_unloadModule;
+ osl_waitCondition;
+ osl_waitThread;
+ osl_writePipe;
+ osl_writeSocket;
+ osl_writeProfileBool;
+ osl_writeProfileIdent;
+ osl_writeProfileString;
+ osl_yieldThread;
+ osl_loadUserProfile;
+ osl_unloadUserProfile;
+ osl_sendResourcePipe;
+ osl_receiveResourcePipe;
+ rtl_allocateMemory;
+ rtl_compareMemory;
+ rtl_copyMemory;
+ rtl_fillMemory;
+ rtl_freeMemory;
+ rtl_moveMemory;
+ rtl_reallocateMemory;
+ rtl_zeroMemory;
+ rtl_findInMemory;
+ rtl_hashentry_destroy;
+ rtl_hashfunc;
+ rtl_hashtable_add;
+ rtl_hashtable_destroy;
+ rtl_hashtable_find;
+ rtl_hashtable_grow;
+ rtl_hashtable_init;
+ rtl_locale_equals;
+ rtl_locale_getCountry;
+ rtl_locale_getDefault;
+ rtl_locale_getLanguage;
+ rtl_locale_getVariant;
+ rtl_locale_hashCode;
+ rtl_locale_register;
+ rtl_locale_setDefault;
+ rtl_str_getLength;
+ rtl_str_compare;
+ rtl_str_compare_WithLength;
+ rtl_str_shortenedCompare_WithLength;
+ rtl_str_reverseCompare_WithLength;
+ rtl_str_compareIgnoreAsciiCase;
+ rtl_str_compareIgnoreAsciiCase_WithLength;
+ rtl_str_shortenedCompareIgnoreAsciiCase_WithLength;
+ rtl_str_hashCode;
+ rtl_str_hashCode_WithLength;
+ rtl_str_indexOfChar;
+ rtl_str_indexOfChar_WithLength;
+ rtl_str_indexOfStr;
+ rtl_str_indexOfStr_WithLength;
+ rtl_str_lastIndexOfChar;
+ rtl_str_lastIndexOfChar_WithLength;
+ rtl_str_lastIndexOfStr;
+ rtl_str_lastIndexOfStr_WithLength;
+ rtl_str_replaceChar;
+ rtl_str_replaceChar_WithLength;
+ rtl_str_toAsciiLowerCase;
+ rtl_str_toAsciiLowerCase_WithLength;
+ rtl_str_toAsciiUpperCase;
+ rtl_str_toAsciiUpperCase_WithLength;
+ rtl_str_trim;
+ rtl_str_trim_WithLength;
+ rtl_str_valueOfBoolean;
+ rtl_str_valueOfChar;
+ rtl_str_valueOfInt32;
+ rtl_str_valueOfInt64;
+ rtl_str_valueOfDouble;
+ rtl_str_valueOfFloat;
+ rtl_str_toBoolean;
+ rtl_str_toInt32;
+ rtl_str_toInt64;
+ rtl_str_toDouble;
+ rtl_str_toFloat;
+ rtl_string_acquire;
+ rtl_string_assign;
+ rtl_string_getLength;
+ rtl_string_getStr;
+ rtl_string_getToken;
+ rtl_string_new;
+ rtl_string_newConcat;
+ rtl_string_newFromStr;
+ rtl_string_newFromStr_WithLength;
+ rtl_string_newFromString;
+ rtl_string_newReplace;
+ rtl_string_newReplaceStrAt;
+ rtl_string_newToAsciiLowerCase;
+ rtl_string_newToAsciiUpperCase;
+ rtl_string_newTrim;
+ rtl_string_new_WithLength;
+ rtl_string_release;
+ rtl_stringbuffer_ensureCapacity;
+ rtl_stringbuffer_insert;
+ rtl_stringbuffer_newFromStr_WithLength;
+ rtl_stringbuffer_newFromStringBuffer;
+ rtl_ustr_compare;
+ rtl_ustr_compare_WithLength;
+ rtl_ustr_shortenedCompare_WithLength;
+ rtl_ustr_reverseCompare_WithLength;
+ rtl_ustr_compareIgnoreAsciiCase;
+ rtl_ustr_compareIgnoreAsciiCase_WithLength;
+ rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength;
+ rtl_ustr_ascii_compare;
+ rtl_ustr_ascii_compare_WithLength;
+ rtl_ustr_ascii_shortenedCompare_WithLength;
+ rtl_ustr_asciil_reverseCompare_WithLength;
+ rtl_ustr_ascii_compareIgnoreAsciiCase;
+ rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength;
+ rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength;
+ rtl_ustr_getLength;
+ rtl_ustr_hashCode;
+ rtl_ustr_hashCode_WithLength;
+ rtl_ustr_indexOfChar;
+ rtl_ustr_indexOfChar_WithLength;
+ rtl_ustr_indexOfStr;
+ rtl_ustr_indexOfStr_WithLength;
+ rtl_ustr_lastIndexOfChar;
+ rtl_ustr_lastIndexOfChar_WithLength;
+ rtl_ustr_lastIndexOfStr;
+ rtl_ustr_lastIndexOfStr_WithLength;
+ rtl_ustr_replaceChar;
+ rtl_ustr_replaceChar_WithLength;
+ rtl_ustr_toAsciiLowerCase;
+ rtl_ustr_toAsciiLowerCase_WithLength;
+ rtl_ustr_toAsciiUpperCase;
+ rtl_ustr_toAsciiUpperCase_WithLength;
+ rtl_ustr_trim;
+ rtl_ustr_trim_WithLength;
+ rtl_ustr_valueOfBoolean;
+ rtl_ustr_valueOfChar;
+ rtl_ustr_valueOfInt32;
+ rtl_ustr_valueOfInt64;
+ rtl_ustr_valueOfDouble;
+ rtl_ustr_valueOfFloat;
+ rtl_ustr_toBoolean;
+ rtl_ustr_toInt32;
+ rtl_ustr_toInt64;
+ rtl_ustr_toDouble;
+ rtl_ustr_toFloat;
+ rtl_uString_acquire;
+ rtl_uString_assign;
+ rtl_uString_getLength;
+ rtl_uString_getStr;
+ rtl_uString_getToken;
+ rtl_uString_new;
+ rtl_uString_newConcat;
+ rtl_uString_newFromStr;
+ rtl_uString_newFromStr_WithLength;
+ rtl_uString_newFromAscii;
+ rtl_uString_newFromString;
+ rtl_uString_newReplace;
+ rtl_uString_newReplaceStrAt;
+ rtl_uString_newToAsciiLowerCase;
+ rtl_uString_newToAsciiUpperCase;
+ rtl_uString_newTrim;
+ rtl_uString_new_WithLength;
+ rtl_uString_release;
+ rtl_uStringbuffer_ensureCapacity;
+ rtl_uStringbuffer_insert;
+ rtl_uStringbuffer_insert_ascii;
+ rtl_uStringbuffer_newFromStr_WithLength;
+ rtl_uStringbuffer_newFromStringBuffer;
+ rtl_string2UString;
+ rtl_uString2String;
+ rtl_createTextToUnicodeConverter;
+ rtl_destroyTextToUnicodeConverter;
+ rtl_createTextToUnicodeContext;
+ rtl_destroyTextToUnicodeContext;
+ rtl_resetTextToUnicodeContext;
+ rtl_convertTextToUnicode;
+ rtl_createUnicodeToTextConverter;
+ rtl_destroyUnicodeToTextConverter;
+ rtl_createUnicodeToTextContext;
+ rtl_destroyUnicodeToTextContext;
+ rtl_resetUnicodeToTextContext;
+ rtl_convertUnicodeToText;
+ rtl_isOctetTextEncoding;
+ rtl_getTextEncodingInfo;
+ rtl_getTextEncodingFromWindowsCharset;
+ rtl_getTextEncodingFromUnixCharset;
+ rtl_getTextEncodingFromMimeCharset;
+ rtl_getBestWindowsCharsetFromTextEncoding;
+ rtl_getMimeCharsetFromTextEncoding;
+ rtl_getBestMimeCharsetFromTextEncoding;
+ rtl_getBestUnixCharsetFromTextEncoding;
+ rtl_allocateZeroMemory;
+ rtl_freeZeroMemory;
+ rtl_crc32;
+ rtl_digest_create;
+ rtl_digest_createMD2;
+ rtl_digest_createMD5;
+ rtl_digest_createSHA;
+ rtl_digest_createSHA1;
+ rtl_digest_createHMAC_MD5;
+ rtl_digest_createHMAC_SHA1;
+ rtl_digest_destroy;
+ rtl_digest_destroyMD2;
+ rtl_digest_destroyMD5;
+ rtl_digest_destroySHA;
+ rtl_digest_destroySHA1;
+ rtl_digest_destroyHMAC_MD5;
+ rtl_digest_destroyHMAC_SHA1;
+ rtl_digest_get;
+ rtl_digest_getMD2;
+ rtl_digest_getMD5;
+ rtl_digest_getSHA;
+ rtl_digest_getSHA1;
+ rtl_digest_getHMAC_MD5;
+ rtl_digest_getHMAC_SHA1;
+ rtl_digest_init;
+ rtl_digest_initHMAC_MD5;
+ rtl_digest_initHMAC_SHA1;
+ rtl_digest_queryAlgorithm;
+ rtl_digest_queryLength;
+ rtl_digest_update;
+ rtl_digest_updateMD2;
+ rtl_digest_updateMD5;
+ rtl_digest_updateSHA;
+ rtl_digest_updateSHA1;
+ rtl_digest_updateHMAC_MD5;
+ rtl_digest_updateHMAC_SHA1;
+ rtl_digest_MD2;
+ rtl_digest_MD5;
+ rtl_digest_SHA;
+ rtl_digest_SHA1;
+ rtl_digest_HMAC_MD5;
+ rtl_digest_HMAC_SHA1;
+ rtl_digest_PBKDF2;
+
+ rtl_random_createPool;
+ rtl_random_destroyPool;
+ rtl_random_addBytes;
+ rtl_random_getBytes;
+
+ rtl_createUuid;
+ rtl_createNamedUuid;
+ rtl_compareUuid;
+ rtl_getGlobalProcessId;
+
+ osl_openFile;
+ osl_setFilePos;
+ osl_getFilePos;
+ osl_setFileSize;
+ osl_readFile;
+ osl_writeFile;
+ osl_closeFile;
+ osl_createDirectory;
+ osl_removeDirectory;
+ osl_removeFile;
+ osl_copyFile;
+ osl_moveFile;
+
+ osl_closeSocket;
+ osl_createInetBroadcastAddr;
+
+ rtl_cipher_create;
+ rtl_cipher_createBF;
+ rtl_cipher_init;
+ rtl_cipher_initBF;
+ rtl_cipher_encode;
+ rtl_cipher_encodeBF;
+ rtl_cipher_decode;
+ rtl_cipher_decodeBF;
+ rtl_cipher_destroy;
+ rtl_cipher_destroyBF;
+
+ rtl_byte_sequence_reference2One;
+ rtl_byte_sequence_realloc;
+ rtl_byte_sequence_acquire;
+ rtl_byte_sequence_release;
+ rtl_byte_sequence_construct;
+ rtl_byte_sequence_constructNoDefault;
+ rtl_byte_sequence_constructFromArray;
+ rtl_byte_sequence_assign;
+ rtl_byte_sequence_equals;
+ rtl_byte_sequence_getConstArray;
+ rtl_byte_sequence_getLength;
+
+ osl_acquireDirectoryItem;
+
+ osl_abbreviateSystemPath;
+ osl_getDateTimeFromTimeValue;
+ osl_getTimeValueFromDateTime;
+ osl_getLocalTimeFromSystemTime;
+ osl_getSystemTimeFromLocalTime;
+ osl_getAbsoluteFileURL;
+
+ osl_unmountVolumeDevice;
+ osl_automountVolumeDevice;
+ osl_releaseVolumeDeviceHandle;
+ osl_getVolumeDeviceMountPath;
+ osl_acquireVolumeDeviceHandle;
+
+ osl_setDebugMessageFunc;
+ osl_setDetailedDebugMessageFunc;
+ osl_readLine;
+ osl_getGlobalTimer;
+ osl_getCanonicalName;
+ osl_getTextEncodingFromLocale;
+
+ rtl_getUriCharClass;
+ rtl_uriConvertRelToAbs;
+ rtl_uriEncode;
+ rtl_uriDecode;
+
+ rtl_bootstrap_get;
+ rtl_bootstrap_set;
+ rtl_bootstrap_setIniFileName;
+ rtl_bootstrap_args_open;
+ rtl_bootstrap_args_close;
+ rtl_bootstrap_get_from_handle;
+ rtl_bootstrap_get_iniName_from_handle;
+ rtl_bootstrap_expandMacros_from_handle;
+ rtl_bootstrap_expandMacros;
+ rtl_getAppCommandArgCount;
+ rtl_getAppCommandArg;
+
+ rtl_moduleCount_acquire;
+ rtl_moduleCount_release;
+ rtl_moduleCount_canUnload;
+ rtl_registerModuleForUnloading;
+ rtl_unregisterModuleForUnloading;
+ rtl_unloadUnusedModules;
+ rtl_addUnloadingListener;
+ rtl_removeUnloadingListener;
+
+ rtl_logfile_trace;
+ rtl_tres_create;
+ rtl_tres_destroy;
+ osl_getProcessLocale;
+ osl_setProcessLocale;
+ local:
+ *;
+};
+
+UDK_3.1 {
+ global:
+ osl_getTempDirURL;
+ osl_createTempFile;
+
+ rtl_math_doubleToString;
+ rtl_math_doubleToUString;
+ rtl_math_pow10Exp;
+ rtl_math_round;
+ rtl_math_stringToDouble;
+ rtl_math_uStringToDouble;
+ rtl_convertUStringToString;
+
+ osl_joinProcessWithTimeout;
+
+ rtl_getTextEncodingFromWindowsCodePage;
+ rtl_getWindowsCodePageFromTextEncoding;
+} UDK_3_0_0;
+
+UDK_3.2 {
+ global:
+ osl_syncFile;
+} UDK_3.1;
+
+UDK_3.3 {
+ global:
+ osl_createDirectoryPath;
+ osl_getFunctionSymbol;
+ osl_getModuleURLFromFunctionAddress;
+ rtl_cipher_createARCFOUR;
+ rtl_cipher_initARCFOUR;
+ rtl_cipher_decodeARCFOUR;
+ rtl_cipher_encodeARCFOUR;
+ rtl_cipher_destroyARCFOUR;
+ rtl_digest_rawMD5;
+ osl_getFileSize;
+ osl_setCommandArgs;
+ rtl_uStringbuffer_insertUtf32;
+ rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths;
+ rtl_logfile_longTrace;
+ rtl_ustr_asciil_reverseEquals_WithLength;
+} UDK_3.2;
+
+UDK_3.4 {
+ global:
+ osl_setErrorReporting;
+} UDK_3.3;
+
+UDK_3.5 {
+ global:
+ rtl_arena_create;
+ rtl_arena_destroy;
+ rtl_arena_alloc;
+ rtl_arena_free;
+
+ rtl_cache_create;
+ rtl_cache_destroy;
+ rtl_cache_alloc;
+ rtl_cache_free;
+} UDK_3.4;
+
+UDK_3.6 { # OOo 2.3
+ global:
+ osl_getAsciiFunctionSymbol;
+ osl_getModuleHandle;
+ rtl_uString_intern;
+ rtl_uString_internConvert;
+ rtl_ustr_indexOfAscii_WithLength;
+ rtl_ustr_lastIndexOfAscii_WithLength;
+ rtl_uString_iterateCodePoints;
+ rtl_uString_newFromCodePoints;
+} UDK_3.5;
+
+UDK_3.7 { # OOo 2.4
+ global:
+ osl_loadModuleRelative;
+} UDK_3.6;
+
+UDK_3.8 { # OOo 3.0
+ global:
+ rtl_bootstrap_encode;
+ rtl_convertStringToUString;
+ rtl_math_approxValue;
+} UDK_3.7;
+
+UDK_3.9 { # OOo 3.1
+ global:
+ osl_mapFile;
+ osl_unmapFile;
+
+ osl_readFileAt;
+ osl_writeFileAt;
+
+ rtl_math_expm1;
+ rtl_math_log1p;
+ rtl_math_atanh;
+} UDK_3.8;
+
+UDK_3.10 { # OOo 3.2
+ global:
+ rtl_logfile_hasLogFile;
+ rtl_math_erf;
+ rtl_math_erfc;
+ rtl_math_asinh;
+ rtl_math_acosh;
+} UDK_3.9;
+
+
+UDK_3.11 { # OOo 3.4
+ global:
+ osl_setEnvironment;
+ osl_clearEnvironment;
+} UDK_3.10;
+
+PRIVATE_1.0 {
+ global:
+ osl_detail_ObjectRegistry_storeAddresses;
+ osl_detail_ObjectRegistry_checkObjectCount;
+ osl_detail_ObjectRegistry_registerObject;
+ osl_detail_ObjectRegistry_revokeObject;
+ osl_detail_ObjectRegistry_getMutex;
+};
+
+PRIVATE_1.1 {
+ global:
+ sal_detail_initialize;
+ sal_detail_deinitialize;
+} PRIVATE_1.0;
diff --git a/sal/util/salalloc.list b/sal/util/salalloc.list
new file mode 100644
index 000000000000..303d225dda7f
--- /dev/null
+++ b/sal/util/salalloc.list
@@ -0,0 +1,7 @@
+{
+ rtl_allocateMemory;
+ rtl_reallocateMemory;
+ rtl_freeMemory;
+ rtl_allocateZeroMemory;
+ rtl_freeZeroMemory;
+};
diff --git a/sal/util/salalloc.map b/sal/util/salalloc.map
new file mode 100644
index 000000000000..3cd098b83bdf
--- /dev/null
+++ b/sal/util/salalloc.map
@@ -0,0 +1,10 @@
+UDK_3_0_0 {
+ global:
+ rtl_allocateMemory;
+ rtl_reallocateMemory;
+ rtl_freeMemory;
+ rtl_allocateZeroMemory;
+ rtl_freeZeroMemory;
+ local:
+ *;
+};
diff --git a/sal/version.mk b/sal/version.mk
new file mode 100644
index 000000000000..9d5fa163fbcf
--- /dev/null
+++ b/sal/version.mk
@@ -0,0 +1,40 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+# target
+SAL_TARGET=sal
+
+# major
+SAL_MAJOR=2
+# minor
+SAL_MINOR=0
+# micro
+SAL_MICRO=0
+
+# this is a c compatible library
+SAL_CPP=0
+
diff --git a/sal/workben/clipboardwben/testcopy/StdAfx.cpp b/sal/workben/clipboardwben/testcopy/StdAfx.cpp
new file mode 100644
index 000000000000..cb07d603f28f
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/StdAfx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : Quelltextdatei, die nur die Standard-Includes einbindet
+// TestWin32.pch ist die vorkompilierte Header-Datei
+// stdafx.obj enthält die vorkompilierte Typinformation
+
+#include "stdafx.h"
+
+// ZU ERLEDIGEN: Verweis auf alle zusätzlichen Header-Dateien, die Sie in STDAFX.H
+// und nicht in dieser Datei benötigen
diff --git a/sal/workben/clipboardwben/testcopy/StdAfx.h b/sal/workben/clipboardwben/testcopy/StdAfx.h
new file mode 100644
index 000000000000..bb762adbdc36
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/StdAfx.h
@@ -0,0 +1,32 @@
+// stdafx.h : Include-Datei für Standard-System-Include-Dateien,
+// oder projektspezifische Include-Dateien, die häufig benutzt, aber
+// in unregelmäßigen Abständen geändert werden.
+//
+
+#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
+#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#define WIN32_LEAN_AND_MEAN // Selten benutzte Teile der Windows-Header nicht einbinden
+
+
+// Windows-Header-Dateien:
+#include <windows.h>
+
+// Header-Dateien der C-Laufzeit
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+
+// Lokale Header-Dateien
+
+// ZU ERLEDIGEN: Verweisen Sie hier auf zusätzliche Header-Dateien, die Ihr Programm benötigt
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ fügt zusätzliche Deklarationen unmittelbar vor der vorherigen Zeile ein.
+
+#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
diff --git a/sal/workben/clipboardwben/testcopy/TestWin32.ico b/sal/workben/clipboardwben/testcopy/TestWin32.ico
new file mode 100644
index 000000000000..255ff3be4fba
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/TestWin32.ico
Binary files differ
diff --git a/sal/workben/clipboardwben/testcopy/XTDataObject.cxx b/sal/workben/clipboardwben/testcopy/XTDataObject.cxx
new file mode 100644
index 000000000000..14887dd9021c
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/XTDataObject.cxx
@@ -0,0 +1,470 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+#include <osl/diagnose.h>
+
+#ifndef _TWRAPPERDATAOBJECT_HXX_
+#include "XTDataObject.hxx"
+#endif
+
+#include <windows.h>
+#include <ole2.h>
+#include <memory>
+
+//------------------------------------------------------------------------
+// namespace directives
+//------------------------------------------------------------------------
+
+
+//============================================================================
+// OTWrapperDataObject
+//============================================================================
+
+//------------------------------------------------------------------------
+// ctor
+//------------------------------------------------------------------------
+
+CXTDataObject::CXTDataObject( LONG nRefCntInitVal ) :
+ m_nRefCnt( nRefCntInitVal )
+{
+}
+
+//------------------------------------------------------------------------
+// dtor
+//------------------------------------------------------------------------
+
+CXTDataObject::~CXTDataObject( )
+{
+}
+
+//------------------------------------------------------------------------
+// IUnknown->QueryInterface
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::QueryInterface( REFIID iid, LPVOID* ppvObject )
+{
+ OSL_ASSERT( NULL != ppvObject );
+
+ if ( NULL == ppvObject )
+ return E_INVALIDARG;
+
+ HRESULT hr = E_NOINTERFACE;
+
+ *ppvObject = NULL;
+
+ if ( ( __uuidof( IUnknown ) == iid ) || ( __uuidof( IDataObject ) == iid ) )
+ {
+ *ppvObject = static_cast< IUnknown* >( this );
+ ( (LPUNKNOWN)*ppvObject )->AddRef( );
+ hr = S_OK;
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IUnknown->AddRef
+//------------------------------------------------------------------------
+
+STDMETHODIMP_(ULONG) CXTDataObject::AddRef( )
+{
+ return static_cast< ULONG >( InterlockedIncrement( &m_nRefCnt ) );
+}
+
+//------------------------------------------------------------------------
+// IUnknown->Release
+//------------------------------------------------------------------------
+
+STDMETHODIMP_(ULONG) CXTDataObject::Release( )
+{
+ // we need a helper variable because it's
+ // not allowed to access a member variable
+ // after an object is destroyed
+ ULONG nRefCnt = static_cast< ULONG >( InterlockedDecrement( &m_nRefCnt ) );
+
+ if ( 0 == nRefCnt )
+ {
+ delete this;
+ }
+
+ return nRefCnt;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->GetData
+// warning: 'goto' ahead (to easy error handling without using exceptions)
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::GetData(LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium )
+{
+ OSL_ASSERT( ( NULL != pFormatetc ) &&
+ ( !IsBadReadPtr( (LPVOID)pFormatetc, sizeof( FORMATETC ) ) ) );
+ OSL_ASSERT( ( NULL != pmedium ) &&
+ ( !IsBadWritePtr( (LPVOID)pmedium, sizeof( STGMEDIUM ) ) ) );
+
+ if ( ( NULL == pFormatetc ) || ( NULL == pmedium ) )
+ return E_INVALIDARG;
+
+ HRESULT hr = E_FAIL;
+
+ if ( CF_TEXT == pFormatetc->cfFormat )
+ {
+ char buff[] = "Hello World, How are you!";
+ LPSTREAM lpStream;
+
+ hr = CreateStreamOnHGlobal( NULL, FALSE, &lpStream );
+ if ( SUCCEEDED( hr ) )
+ {
+ hr = lpStream->Write( buff, sizeof( buff ) * sizeof( char ), NULL );
+ if ( SUCCEEDED( hr ) )
+ {
+ HGLOBAL hGlob;
+
+ GetHGlobalFromStream( lpStream, &hGlob );
+
+ pmedium->tymed = TYMED_HGLOBAL;
+ pmedium->hGlobal = hGlob;
+ pmedium->pUnkForRelease = NULL;
+ }
+ lpStream->Release( );
+ hr = S_OK;
+ }
+ else
+ {
+ pmedium->tymed = TYMED_NULL;
+ }
+ }
+ else if ( CF_UNICODETEXT == pFormatetc->cfFormat )
+ {
+ WCHAR buff[] = L"Hello World, How are you!";
+ LPSTREAM lpStream;
+
+ hr = CreateStreamOnHGlobal( NULL, FALSE, &lpStream );
+ if ( SUCCEEDED( hr ) )
+ {
+ hr = lpStream->Write( buff, sizeof( buff ) * sizeof( WCHAR ), NULL );
+ if ( SUCCEEDED( hr ) )
+ {
+ HGLOBAL hGlob;
+
+ GetHGlobalFromStream( lpStream, &hGlob );
+
+ pmedium->tymed = TYMED_HGLOBAL;
+ pmedium->hGlobal = hGlob;
+ pmedium->pUnkForRelease = NULL;
+ }
+ lpStream->Release( );
+ hr = S_OK;
+ }
+ else
+ {
+ pmedium->tymed = TYMED_NULL;
+ }
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->EnumFormatEtc
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC** ppenumFormatetc )
+{
+ if ( ( NULL == ppenumFormatetc ) || ( DATADIR_SET == dwDirection ) )
+ return E_INVALIDARG;
+
+ *ppenumFormatetc = NULL;
+
+ HRESULT hr = E_FAIL;
+
+ if ( DATADIR_GET == dwDirection )
+ {
+ *ppenumFormatetc = new CEnumFormatEtc( this );
+ static_cast< LPUNKNOWN >( *ppenumFormatetc )->AddRef( );
+ hr = S_OK;
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->QueryGetData
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::QueryGetData( LPFORMATETC pFormatetc )
+{
+ return E_NOTIMPL;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->GetDataHere
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::GetDataHere( LPFORMATETC, LPSTGMEDIUM )
+{
+ return E_NOTIMPL;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->GetCanonicalFormatEtc
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::GetCanonicalFormatEtc( LPFORMATETC, LPFORMATETC )
+{
+ return E_NOTIMPL;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->SetData
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::SetData( LPFORMATETC, LPSTGMEDIUM, BOOL )
+{
+ return E_NOTIMPL;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->DAdvise
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::DAdvise( LPFORMATETC, DWORD, LPADVISESINK, DWORD * )
+{
+ return E_NOTIMPL;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->DUnadvise
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::DUnadvise( DWORD )
+{
+ return E_NOTIMPL;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->EnumDAdvise
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXTDataObject::EnumDAdvise( LPENUMSTATDATA * )
+{
+ return E_NOTIMPL;
+}
+
+//------------------------------------------------------------------------
+// for our convenience
+//------------------------------------------------------------------------
+
+CXTDataObject::operator IDataObject*( )
+{
+ return static_cast< IDataObject* >( this );
+}
+
+
+//============================================================================
+// CEnumFormatEtc
+//============================================================================
+
+
+//----------------------------------------------------------------------------
+// ctor
+//----------------------------------------------------------------------------
+
+CEnumFormatEtc::CEnumFormatEtc( LPUNKNOWN pUnkDataObj ) :
+ m_nRefCnt( 0 ),
+ m_pUnkDataObj( pUnkDataObj ),
+ m_nCurrentPos( 0 )
+{
+ m_cfFormats[0] = CF_UNICODETEXT;
+ m_cfFormats[1] = CF_TEXT;
+}
+
+//----------------------------------------------------------------------------
+// dtor
+//----------------------------------------------------------------------------
+
+CEnumFormatEtc::~CEnumFormatEtc( )
+{
+}
+
+//----------------------------------------------------------------------------
+// IUnknown->QueryInterface
+//----------------------------------------------------------------------------
+
+STDMETHODIMP CEnumFormatEtc::QueryInterface( REFIID iid, LPVOID* ppvObject )
+{
+ if ( NULL == ppvObject )
+ return E_INVALIDARG;
+
+ HRESULT hr = E_NOINTERFACE;
+
+ *ppvObject = NULL;
+
+ if ( ( __uuidof( IUnknown ) == iid ) || ( __uuidof( IEnumFORMATETC ) == iid ) )
+ {
+ *ppvObject = static_cast< IUnknown* >( this );
+ static_cast< LPUNKNOWN >( *ppvObject )->AddRef( );
+ hr = S_OK;
+ }
+
+ return hr;
+}
+
+//----------------------------------------------------------------------------
+// IUnknown->AddRef
+//----------------------------------------------------------------------------
+
+STDMETHODIMP_(ULONG) CEnumFormatEtc::AddRef( )
+{
+ // keep the dataobject alive
+ m_pUnkDataObj->AddRef( );
+ return InterlockedIncrement( &m_nRefCnt );
+}
+
+//----------------------------------------------------------------------------
+// IUnknown->Release
+//----------------------------------------------------------------------------
+
+STDMETHODIMP_(ULONG) CEnumFormatEtc::Release( )
+{
+ // release the outer dataobject
+ m_pUnkDataObj->Release( );
+
+ // we need a helper variable because it's
+ // not allowed to access a member variable
+ // after an object is destroyed
+ ULONG nRefCnt = InterlockedDecrement( &m_nRefCnt );
+ if ( 0 == nRefCnt )
+ delete this;
+
+ return nRefCnt;
+}
+
+//----------------------------------------------------------------------------
+// IEnumFORMATETC->Next
+//----------------------------------------------------------------------------
+
+STDMETHODIMP CEnumFormatEtc::Next( ULONG celt, LPFORMATETC rgelt, ULONG* pceltFetched )
+{
+ OSL_ASSERT( ( ( celt > 0 ) && ( NULL != rgelt ) ) ||
+ ( ( 0 == celt ) && ( NULL == rgelt ) ) );
+
+ if ( ( 0 != celt ) && ( NULL == rgelt ) )
+ return E_INVALIDARG;
+
+ ULONG ulFetched = 0;
+ ULONG ulToFetch = celt;
+ HRESULT hr = S_FALSE;
+
+ while( ( m_nCurrentPos < sizeof( m_cfFormats ) ) && ( ulToFetch > 0 ) )
+ {
+ OSL_ASSERT( !IsBadWritePtr( (LPVOID)rgelt, sizeof( FORMATETC ) ) );
+
+ rgelt->cfFormat = m_cfFormats[m_nCurrentPos];
+ rgelt->ptd = NULL;
+ rgelt->dwAspect = DVASPECT_CONTENT;
+ rgelt->lindex = -1;
+ rgelt->tymed = TYMED_HGLOBAL;
+
+ ++m_nCurrentPos;
+ ++rgelt;
+ --ulToFetch;
+ ++ulFetched;
+ }
+
+ if ( ulFetched == celt )
+ hr = S_OK;
+
+ if ( NULL != pceltFetched )
+ {
+ OSL_ASSERT( !IsBadWritePtr( (LPVOID)pceltFetched, sizeof( ULONG ) ) );
+ *pceltFetched = ulFetched;
+ }
+
+ return hr;
+}
+
+//----------------------------------------------------------------------------
+// IEnumFORMATETC->Skip
+//----------------------------------------------------------------------------
+
+STDMETHODIMP CEnumFormatEtc::Skip( ULONG celt )
+{
+ HRESULT hr = S_FALSE;
+
+ if ( ( m_nCurrentPos + celt ) < sizeof( m_cfFormats ) )
+ {
+ m_nCurrentPos += celt;
+ hr = S_OK;
+ }
+
+ return hr;
+}
+
+//----------------------------------------------------------------------------
+// IEnumFORMATETC->Reset
+//----------------------------------------------------------------------------
+
+STDMETHODIMP CEnumFormatEtc::Reset( )
+{
+ m_nCurrentPos = 0;
+ return S_OK;
+}
+
+//----------------------------------------------------------------------------
+// IEnumFORMATETC->Clone
+//----------------------------------------------------------------------------
+
+STDMETHODIMP CEnumFormatEtc::Clone( IEnumFORMATETC** ppenum )
+{
+ OSL_ASSERT( NULL != ppenum );
+
+ if ( NULL == ppenum )
+ return E_INVALIDARG;
+
+ HRESULT hr = E_FAIL;
+
+ *ppenum = NULL;
+
+ CEnumFormatEtc* pCEnumFEtc = new CEnumFormatEtc( m_pUnkDataObj );
+ if ( NULL != pCEnumFEtc )
+ {
+ pCEnumFEtc->m_nCurrentPos = m_nCurrentPos;
+ *ppenum = static_cast< IEnumFORMATETC* >( pCEnumFEtc );
+ static_cast< LPUNKNOWN >( *ppenum )->AddRef( );
+ hr = NOERROR;
+ }
+
+ return hr;
+}
+
diff --git a/sal/workben/clipboardwben/testcopy/XTDataObject.hxx b/sal/workben/clipboardwben/testcopy/XTDataObject.hxx
new file mode 100644
index 000000000000..d2639b591590
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/XTDataObject.hxx
@@ -0,0 +1,132 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#ifndef _XTDATAOBJECT_HXX_
+#define _XTDATAOBJECT_HXX_
+
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+
+/*
+#include <com/sun/star/datatransfer/XTransferable.hpp>
+#include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp>
+#include "WinClipboard.hxx"
+*/
+
+#include <windows.h>
+#include <ole2.h>
+#include <objidl.h>
+
+
+//------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------
+
+class EnumFormatEtc;
+
+class CXTDataObject : public IDataObject
+{
+public:
+ CXTDataObject( LONG nRefCntInitVal = 0);
+ ~CXTDataObject( );
+
+ //-----------------------------------------------------------------
+ // ole interface implementation
+ //-----------------------------------------------------------------
+
+ //IUnknown
+ STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);
+ STDMETHODIMP_( ULONG ) AddRef( );
+ STDMETHODIMP_( ULONG ) Release( );
+
+ //IDataObject
+ STDMETHODIMP GetData( LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium );
+ STDMETHODIMP GetDataHere( LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium );
+ STDMETHODIMP QueryGetData( LPFORMATETC pFormatetc );
+ STDMETHODIMP GetCanonicalFormatEtc( LPFORMATETC pFormatectIn, LPFORMATETC pFormatetcOut );
+ STDMETHODIMP SetData( LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium, BOOL fRelease );
+ STDMETHODIMP EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC** ppenumFormatetc );
+ STDMETHODIMP DAdvise( LPFORMATETC pFormatetc, DWORD advf, LPADVISESINK pAdvSink, DWORD* pdwConnection );
+ STDMETHODIMP DUnadvise( DWORD dwConnection );
+ STDMETHODIMP EnumDAdvise( LPENUMSTATDATA* ppenumAdvise );
+
+ operator IDataObject*( );
+
+ // notification handler
+ //void SAL_CALL LostOwnership( );
+
+ //sal_Int64 SAL_CALL QueryDataSize( );
+
+ // retrieve the data from the source
+ // necessary so that
+ //void SAL_CALL GetAllDataFromSource( );
+
+private:
+ LONG m_nRefCnt;
+ //CWinClipboard& m_rCWinClipboard;
+ //const const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& m_rXClipboardOwner;
+ //const const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& m_rXTDataSource;
+
+ //friend class CWinClipboard;
+ friend class CEnumFormatEtc;
+};
+
+//------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------
+
+class CEnumFormatEtc : public IEnumFORMATETC
+{
+public:
+ CEnumFormatEtc( LPUNKNOWN pUnkDataObj );
+ ~CEnumFormatEtc( );
+
+ // IUnknown
+ STDMETHODIMP QueryInterface( REFIID iid, LPVOID* ppvObject );
+ STDMETHODIMP_( ULONG ) AddRef( );
+ STDMETHODIMP_( ULONG ) Release( );
+
+ //IEnumFORMATETC
+ STDMETHODIMP Next( ULONG celt, LPFORMATETC rgelt, ULONG* pceltFetched );
+ STDMETHODIMP Skip( ULONG celt );
+ STDMETHODIMP Reset( );
+ STDMETHODIMP Clone( IEnumFORMATETC** ppenum );
+
+private:
+ LONG m_nRefCnt;
+ LPUNKNOWN m_pUnkDataObj;
+ ULONG m_nCurrentPos;
+ CLIPFORMAT m_cfFormats[2];
+};
+
+
+typedef CEnumFormatEtc *PCEnumFormatEtc;
+
+#endif
diff --git a/sal/workben/clipboardwben/testcopy/cbcpytest.cxx b/sal/workben/clipboardwben/testcopy/cbcpytest.cxx
new file mode 100644
index 000000000000..1ce6c8cd2d76
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/cbcpytest.cxx
@@ -0,0 +1,402 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// TestWin32.cpp : Definiert den Einsprungpunkt für die Anwendung.
+//
+
+#define _WIN32_DCOM
+#undef _UNICODE
+
+#include "stdafx.h"
+
+#include <windows.h>
+
+#include <ole2.h>
+#include <objidl.h>
+#include <objbase.h>
+#include <process.h>
+#include <olectl.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <..\..\inc\systools\win32\MtaOleClipb.h>
+#include "XTDataObject.hxx"
+
+#include "resource.h"
+
+#define MAX_LOADSTRING 100
+#undef USE_MTACB
+
+#define MSG_FLUSHCLIPBOARD WM_USER + 1
+
+// Globale Variablen:
+HINSTANCE hInst; // aktuelle Instanz
+TCHAR szTitle[MAX_LOADSTRING]; // Text der Titelzeile
+TCHAR szWindowClass[MAX_LOADSTRING]; // Text der Titelzeile
+ATOM MyRegisterClass( HINSTANCE hInstance );
+BOOL InitInstance( HINSTANCE, int );
+LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
+LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM );
+void CopyClipboardData(HWND hwndParent);
+void FlushClipboard( );
+void PasteData( HWND hWnd );
+void SetLocale();
+
+
+LPSTREAM g_pStm = NULL;
+char* pTextBuff = NULL;
+DWORD lData = 0;
+CXTDataObject* g_xtDo = NULL;
+HWND g_hWnd;
+HANDLE g_hEvent;
+BOOL g_bEnd;
+
+//----------------------------------------------------
+// a thread function
+//----------------------------------------------------
+
+unsigned int _stdcall ThreadProc(LPVOID pParam)
+{
+ while( !g_bEnd )
+ {
+ WaitForSingleObject( g_hEvent, INFINITE );
+ SendMessage( g_hWnd, MSG_FLUSHCLIPBOARD, WPARAM(0), LPARAM(0) );
+ }
+
+ return 0;
+}
+
+//----------------------------------------------------
+// WinMain
+//----------------------------------------------------
+
+int APIENTRY WinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow )
+{
+ // ZU ERLEDIGEN: Fügen Sie hier den Code ein.
+ MSG msg;
+ HACCEL hAccelTable;
+ HRESULT hr = E_FAIL;
+
+ /*
+ g_hEvent = CreateEvent( 0,
+ FALSE,
+ FALSE,
+ NULL
+ );
+
+ g_bEnd = FALSE;
+
+ _beginthreadex( ThreadProc,
+ 0,
+ NULL,
+ 0,
+ 0,
+ NULL );
+ */
+
+ // it's important to initialize ole
+ // in order to use the clipboard
+#ifdef USE_MTACB
+ hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
+#else
+ hr = OleInitialize( NULL );
+#endif
+
+
+ // Globale Zeichenfolgen initialisieren
+ LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+ LoadString(hInstance, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING);
+ MyRegisterClass(hInstance);
+
+ // Initialisierung der Anwendung durchführen:
+ if( !InitInstance( hInstance, nCmdShow ) )
+ {
+ return FALSE;
+ }
+
+ hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTWIN32);
+
+ // Hauptnachrichtenschleife:
+ while( GetMessage(&msg, NULL, 0, 0) )
+ {
+ if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) )
+ {
+ TranslateMessage( &msg );
+ DispatchMessage( &msg );
+ }
+ }
+
+ // uninitializing the ole libraries
+#ifdef USE_MTACB
+ CoUninitialize( );
+#else
+ OleUninitialize( );
+#endif
+
+ CloseHandle( g_hEvent );
+
+ return msg.wParam;
+}
+
+
+
+//----------------------------------------------------------------
+// FUNKTION: MyRegisterClass()
+//
+// AUFGABE: Registriert die Fensterklasse.
+//
+// KOMMENTARE:
+//
+// Diese Funktion und ihre Verwendung sind nur notwendig, wenn dieser Code
+// mit Win32-Systemen vor der 'RegisterClassEx'-Funktion kompatibel sein soll,
+// die zu Windows 95 hinzugefügt wurde. Es ist wichtig diese Funktion aufzurufen,
+// damit der Anwendung kleine Symbole mit den richtigen Proportionen zugewiesen
+// werden.
+//----------------------------------------------------------------
+
+ATOM MyRegisterClass( HINSTANCE hInstance )
+{
+ WNDCLASSEX wcex;
+
+ wcex.cbSize = sizeof(WNDCLASSEX);
+
+ wcex.style = CS_HREDRAW | CS_VREDRAW;
+ wcex.lpfnWndProc = (WNDPROC)WndProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hInstance;
+ wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TESTWIN32);
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ wcex.lpszMenuName = (LPCTSTR)IDC_TESTWIN32;
+ wcex.lpszClassName = _T(szWindowClass);
+ wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
+
+ return RegisterClassEx(&wcex);
+}
+
+//----------------------------------------------------------------
+// FUNKTION: InitInstance(HANDLE, int)
+//
+// AUFGABE: Speichert die Instanzzugriffsnummer und erstellt das Hauptfenster
+//
+// KOMMENTARE:
+//
+// In dieser Funktion wird die Instanzzugriffsnummer in einer globalen Variable
+// gespeichert und das Hauptprogrammfenster erstellt und angezeigt.
+//----------------------------------------------------------------
+
+BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
+{
+ hInst = hInstance; // Instanzzugriffsnummer in unserer globalen Variable speichern
+
+ g_hWnd = CreateWindowEx(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
+
+ if( !g_hWnd )
+ {
+ return FALSE;
+ }
+
+ ShowWindow( g_hWnd, nCmdShow );
+ UpdateWindow( g_hWnd );
+
+ return TRUE;
+}
+
+//----------------------------------------------------------------
+// FUNKTION: WndProc(HWND, unsigned, WORD, LONG)
+//
+// AUFGABE: Verarbeitet Nachrichten für das Hauptfenster.
+//
+// WM_COMMAND - Anwendungsmenü verarbeiten
+// WM_PAINT - Hauptfenster darstellen
+// WM_DESTROY - Beendigungsnachricht ausgeben und zurückkehren
+//----------------------------------------------------------------
+
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ int wmId;
+ int wmEvent;
+ PAINTSTRUCT ps;
+ HDC hdc;
+ TCHAR szHello[MAX_LOADSTRING];
+
+
+ LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
+
+ switch( message )
+ {
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ // Menüauswahlen analysieren:
+ switch( wmId )
+ {
+ case IDD_COPY:
+ CopyClipboardData(hWnd);
+ break;
+ case IDD_PASTE2:
+ PasteData(hWnd);
+ break;
+ case IDD_LOCALE:
+ SetLocale();
+ break;
+ case IDM_EXIT:
+ DestroyWindow( hWnd );
+ break;
+
+ default:
+ return DefWindowProc( hWnd, message, wParam, lParam );
+ }
+ break;
+
+ case WM_PAINT:
+ hdc = BeginPaint (hWnd, &ps);
+ // ZU ERLEDIGEN: Hier beliebigen Code zum Zeichnen hinzufügen...
+ RECT rt;
+ GetClientRect( hWnd, &rt );
+
+ if ( NULL != pTextBuff )
+ {
+ DrawText( hdc, pTextBuff, lData, &rt, DT_CENTER );
+ }
+ else
+ {
+ DrawText( hdc, szHello, strlen(szHello), &rt, DT_CENTER );
+ }
+
+ EndPaint( hWnd, &ps );
+ break;
+
+ case WM_DESTROY:
+ g_bEnd = TRUE;
+ SetEvent( g_hEvent );
+ FlushClipboard( );
+ PostQuitMessage( 0 );
+ break;
+
+ default:
+ return DefWindowProc( hWnd, message, wParam, lParam );
+ }
+ return 0;
+}
+
+//----------------------------------------------
+// copy data into the clipboard
+//----------------------------------------------
+
+void CopyClipboardData( HWND hWnd )
+{
+ g_xtDo = new CXTDataObject( 1 );
+#ifdef USE_MTACB
+ MTASetClipboard( static_cast< IDataObject* >( g_xtDo ) );
+#else
+ OleSetClipboard( static_cast< IDataObject* >( g_xtDo ) );
+#endif
+}
+
+//----------------------------------------------
+// flush the content into the clipboard
+//----------------------------------------------
+
+void FlushClipboard( )
+{
+ if ( NULL != g_xtDo )
+ {
+#ifdef USE_MTACB
+ HRESULT hr = MTAIsCurrentClipboard( static_cast< IDataObject* >( g_xtDo ) );
+ if ( S_OK == hr )
+ MTAFlushClipboard( );
+#else
+ HRESULT hr = OleIsCurrentClipboard( static_cast< IDataObject* >( g_xtDo ) );
+ if ( S_OK == hr )
+ OleFlushClipboard( );
+#endif
+
+ static_cast< IDataObject* >( g_xtDo )->Release( );
+ }
+}
+
+
+void PasteData(HWND hWnd)
+{
+ IDataObject* pDataObj;
+
+ //FlushClipboard( );
+
+ HRESULT hr = OleGetClipboard( &pDataObj );
+ if ( SUCCEEDED( hr ) )
+ {
+ FORMATETC fetc;
+ STGMEDIUM stgmedium;
+
+ fetc.cfFormat = CF_LOCALE;
+ fetc.ptd = NULL;
+ fetc.dwAspect = DVASPECT_CONTENT;
+ fetc.lindex = -1;
+ fetc.tymed = TYMED_HGLOBAL;
+
+ hr = pDataObj->GetData( &fetc, &stgmedium );
+ if ( SUCCEEDED( hr ) )
+ {
+ LPVOID lpData = GlobalLock( stgmedium.hGlobal );
+
+ if ( NULL != lpData )
+ {
+ LCID lcid = *( (WORD*)lpData );
+
+ WORD langID = LANGIDFROMLCID( lcid );
+ WORD sublangID = SUBLANGID( langID );
+
+ TCHAR buff[6];
+ int cbWritten = GetLocaleInfo( lcid, LOCALE_IDEFAULTANSICODEPAGE, buff, sizeof( buff ) );
+ cbWritten = GetLocaleInfo( lcid, LOCALE_IDEFAULTCODEPAGE, buff, sizeof( buff ) );
+
+ GlobalUnlock( stgmedium.hGlobal );
+ }
+ else
+ {
+ DWORD dwLastError = GetLastError( );
+ }
+
+ ReleaseStgMedium( &stgmedium );
+ }
+ }
+}
+
+
+void SetLocale()
+{
+ LCID threadLcid = GetThreadLocale();
+}
+
diff --git a/sal/workben/clipboardwben/testcopy/cbcpytest.rc b/sal/workben/clipboardwben/testcopy/cbcpytest.rc
new file mode 100644
index 000000000000..a9db008536ac
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/cbcpytest.rc
@@ -0,0 +1,122 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+#include "resource.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_TESTWIN32 ICON DISCARDABLE "TestWin32.ICO"
+IDI_SMALL ICON DISCARDABLE "SMALL.ICO"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDC_TESTWIN32 MENU DISCARDABLE
+BEGIN
+ POPUP "&Datei"
+ BEGIN
+ MENUITEM "&Copy", IDD_COPY
+ MENUITEM "Paste", IDD_PASTE2
+ MENUITEM "Set Locale", IDD_LOCALE
+ MENUITEM SEPARATOR
+ MENUITEM "&Beenden", IDM_EXIT
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDC_TESTWIN32 ACCELERATORS MOVEABLE PURE
+BEGIN
+ "?", IDM_ABOUT, ASCII, ALT
+ "/", IDM_ABOUT, ASCII, ALT
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""resource.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_TITLE "TestWin32"
+ IDS_HELLO "Hallo Welt!"
+ IDC_TESTWIN32 "TESTWIN32"
+END
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/sal/workben/clipboardwben/testcopy/makefile.mk b/sal/workben/clipboardwben/testcopy/makefile.mk
new file mode 100644
index 000000000000..7c1454f05db8
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/makefile.mk
@@ -0,0 +1,67 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=cbcpytest
+LIBTARGET=NO
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+#
+# test clipboard paste
+#
+ # --- Resources ----------------------------------------------------
+ RCFILES= cbcpytest.rc
+
+ OBJFILES= $(OBJ)$/cbcpytest.obj $(OBJ)$/XTDataObject.obj
+
+ APP1TARGET= $(TARGET)
+ APP1OBJS= $(OBJFILES)
+ APP1NOSAL= TRUE
+ APP1NOSVRES= $(RES)$/$(TARGET).res
+
+ APP1STDLIBS+=$(OLE32LIB) $(USER32LIB) $(KERNEL32LIB) $(SALLIB)
+
+ APP1LIBS=$(LB)$/iole9x.lib \
+ $(LB)$/tools32.lib
+
+ APP1DEPN= makefile.mk $(APP1NOSVRES)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+
diff --git a/sal/workben/clipboardwben/testcopy/resource.h b/sal/workben/clipboardwben/testcopy/resource.h
new file mode 100644
index 000000000000..5f70db1bb13f
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/resource.h
@@ -0,0 +1,31 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by cbcpytest.rc
+//
+#define IDC_MYICON 2
+#define IDD_TESTWIN32_DIALOG 102
+#define IDD_ABOUTBOX 103
+#define IDS_APP_TITLE 103
+#define IDM_ABOUT 104
+#define IDM_EXIT 105
+#define IDS_HELLO 106
+#define IDI_TESTWIN32 107
+#define IDI_SMALL 108
+#define IDC_TESTWIN32 109
+#define IDR_MAINFRAME 128
+#define IDD_PASTE 32771
+#define IDD_COPY 32771
+#define IDD_PASTE2 32772
+#define IDD_LOCALE 32773
+#define IDC_STATIC -1
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 129
+#define _APS_NEXT_COMMAND_VALUE 32774
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 110
+#endif
+#endif
diff --git a/sal/workben/clipboardwben/testcopy/small.ico b/sal/workben/clipboardwben/testcopy/small.ico
new file mode 100644
index 000000000000..8f94d9aa8285
--- /dev/null
+++ b/sal/workben/clipboardwben/testcopy/small.ico
Binary files differ
diff --git a/sal/workben/clipboardwben/testpaste/StdAfx.cpp b/sal/workben/clipboardwben/testpaste/StdAfx.cpp
new file mode 100644
index 000000000000..cb07d603f28f
--- /dev/null
+++ b/sal/workben/clipboardwben/testpaste/StdAfx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : Quelltextdatei, die nur die Standard-Includes einbindet
+// TestWin32.pch ist die vorkompilierte Header-Datei
+// stdafx.obj enthält die vorkompilierte Typinformation
+
+#include "stdafx.h"
+
+// ZU ERLEDIGEN: Verweis auf alle zusätzlichen Header-Dateien, die Sie in STDAFX.H
+// und nicht in dieser Datei benötigen
diff --git a/sal/workben/clipboardwben/testpaste/StdAfx.h b/sal/workben/clipboardwben/testpaste/StdAfx.h
new file mode 100644
index 000000000000..bb762adbdc36
--- /dev/null
+++ b/sal/workben/clipboardwben/testpaste/StdAfx.h
@@ -0,0 +1,32 @@
+// stdafx.h : Include-Datei für Standard-System-Include-Dateien,
+// oder projektspezifische Include-Dateien, die häufig benutzt, aber
+// in unregelmäßigen Abständen geändert werden.
+//
+
+#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
+#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#define WIN32_LEAN_AND_MEAN // Selten benutzte Teile der Windows-Header nicht einbinden
+
+
+// Windows-Header-Dateien:
+#include <windows.h>
+
+// Header-Dateien der C-Laufzeit
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+
+// Lokale Header-Dateien
+
+// ZU ERLEDIGEN: Verweisen Sie hier auf zusätzliche Header-Dateien, die Ihr Programm benötigt
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ fügt zusätzliche Deklarationen unmittelbar vor der vorherigen Zeile ein.
+
+#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
diff --git a/sal/workben/clipboardwben/testpaste/TestWin32.ico b/sal/workben/clipboardwben/testpaste/TestWin32.ico
new file mode 100644
index 000000000000..255ff3be4fba
--- /dev/null
+++ b/sal/workben/clipboardwben/testpaste/TestWin32.ico
Binary files differ
diff --git a/sal/workben/clipboardwben/testpaste/cbptest.cxx b/sal/workben/clipboardwben/testpaste/cbptest.cxx
new file mode 100644
index 000000000000..f26d51ec6d72
--- /dev/null
+++ b/sal/workben/clipboardwben/testpaste/cbptest.cxx
@@ -0,0 +1,428 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// TestWin32.cpp : Definiert den Einsprungpunkt für die Anwendung.
+//
+
+#define _WIN32_DCOM
+
+#include "stdafx.h"
+
+#include <windows.h>
+
+#include <ole2.h>
+#include <objidl.h>
+#include <objbase.h>
+#include <process.h>
+#include <olectl.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <..\..\inc\systools\win32\MtaOleClipb.h>
+
+#include "resource.h"
+
+#define MAX_LOADSTRING 100
+
+// Globale Variablen:
+HINSTANCE hInst; // aktuelle Instanz
+WCHAR szTitle[MAX_LOADSTRING]; // Text der Titelzeile
+WCHAR szWindowClass[MAX_LOADSTRING]; // Text der Titelzeile
+ATOM MyRegisterClass( HINSTANCE hInstance );
+BOOL InitInstance( HINSTANCE, int );
+LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
+LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM );
+void PasteClipboardData(HWND hwndParent);
+void PasteClipboardData2(HWND hwndParent);
+
+LPSTREAM g_pStm = NULL;
+char* pTextBuff = NULL;
+DWORD lData = 0;
+
+//----------------------------------------------------
+// a thread function
+//----------------------------------------------------
+
+unsigned int _stdcall ThreadProc(LPVOID pParam)
+{
+ IDataObject* pIDataObj = NULL;
+ FORMATETC formatETC;
+ STGMEDIUM stgMedium;
+ LPVOID pGlobMem;
+ HWND hwnd;
+ DWORD sizeGlobBuff;
+ HRESULT hr;
+
+ hwnd = (HWND)pParam;
+
+ OleInitialize( NULL );
+
+ hr = OleGetClipboard( &pIDataObj );
+
+ hr = CoGetInterfaceAndReleaseStream(
+ g_pStm,
+ __uuidof(IDataObject),
+ reinterpret_cast<LPVOID*>(&pIDataObj));
+
+ formatETC.cfFormat = CF_TEXT;
+ formatETC.ptd = NULL;
+ formatETC.dwAspect = DVASPECT_CONTENT;
+ formatETC.lindex = -1;
+ formatETC.tymed = TYMED_HGLOBAL;
+
+ hr = pIDataObj->GetData( &formatETC, &stgMedium );
+ pGlobMem = GlobalLock( stgMedium.hGlobal );
+ if ( NULL != pGlobMem )
+ {
+ if ( NULL != pTextBuff )
+ {
+ free( pTextBuff );
+ }
+
+ sizeGlobBuff = GlobalSize( stgMedium.hGlobal );
+ pTextBuff = (char*)malloc( sizeGlobBuff + 1 );
+ ZeroMemory( pTextBuff, sizeGlobBuff + 1 );
+
+ memcpy( pTextBuff, pGlobMem, sizeGlobBuff );
+ lData = sizeGlobBuff;
+
+ InvalidateRect( hwnd, NULL, TRUE );
+ UpdateWindow( hwnd );
+ }
+
+ GlobalUnlock( stgMedium.hGlobal );
+
+ ReleaseStgMedium( &stgMedium );
+
+ pIDataObj->Release();
+
+ //CoUninitialize( );
+
+ OleUninitialize( );
+
+ return 0;
+}
+
+//----------------------------------------------------
+// WinMain
+//----------------------------------------------------
+
+int APIENTRY WinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow )
+{
+ // ZU ERLEDIGEN: Fügen Sie hier den Code ein.
+ MSG msg;
+ HACCEL hAccelTable;
+ HRESULT hr = E_FAIL;
+
+ // it's important to initialize ole
+ // in order to use the clipboard
+ //hr = OleInitialize( NULL );
+ hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
+ //hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
+
+ // Globale Zeichenfolgen initialisieren
+ LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+ LoadStringW(hInstance, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING);
+ MyRegisterClass(hInstance);
+
+ // Initialisierung der Anwendung durchführen:
+ if( !InitInstance( hInstance, nCmdShow ) )
+ {
+ return FALSE;
+ }
+
+ hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTWIN32);
+
+ // Hauptnachrichtenschleife:
+ while( GetMessage(&msg, NULL, 0, 0) )
+ {
+ if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) )
+ {
+ TranslateMessage( &msg );
+ DispatchMessage( &msg );
+ }
+ }
+
+ // uninitializing the ole libraries
+ //OleUninitialize( );
+ CoUninitialize( );
+
+ return msg.wParam;
+}
+
+
+
+//
+// FUNKTION: MyRegisterClass()
+//
+// AUFGABE: Registriert die Fensterklasse.
+//
+// KOMMENTARE:
+//
+// Diese Funktion und ihre Verwendung sind nur notwendig, wenn dieser Code
+// mit Win32-Systemen vor der 'RegisterClassEx'-Funktion kompatibel sein soll,
+// die zu Windows 95 hinzugefügt wurde. Es ist wichtig diese Funktion aufzurufen,
+// damit der Anwendung kleine Symbole mit den richtigen Proportionen zugewiesen
+// werden.
+//
+ATOM MyRegisterClass( HINSTANCE hInstance )
+{
+ WNDCLASSEXW wcex;
+
+ wcex.cbSize = sizeof(WNDCLASSEX);
+
+ wcex.style = CS_HREDRAW | CS_VREDRAW;
+ wcex.lpfnWndProc = (WNDPROC)WndProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hInstance;
+ wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TESTWIN32);
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ wcex.lpszMenuName = (LPCWSTR)IDC_TESTWIN32;
+ wcex.lpszClassName = szWindowClass;
+ wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
+
+ return RegisterClassExW(&wcex);
+}
+
+//
+// FUNKTION: InitInstance(HANDLE, int)
+//
+// AUFGABE: Speichert die Instanzzugriffsnummer und erstellt das Hauptfenster
+//
+// KOMMENTARE:
+//
+// In dieser Funktion wird die Instanzzugriffsnummer in einer globalen Variable
+// gespeichert und das Hauptprogrammfenster erstellt und angezeigt.
+//
+BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
+{
+ HWND hWnd;
+
+ hInst = hInstance; // Instanzzugriffsnummer in unserer globalen Variable speichern
+
+ hWnd = CreateWindowExW(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
+
+ if( !hWnd )
+ {
+ return FALSE;
+ }
+
+ ShowWindow( hWnd, nCmdShow );
+ UpdateWindow( hWnd );
+
+ return TRUE;
+}
+
+//
+// FUNKTION: WndProc(HWND, unsigned, WORD, LONG)
+//
+// AUFGABE: Verarbeitet Nachrichten für das Hauptfenster.
+//
+// WM_COMMAND - Anwendungsmenü verarbeiten
+// WM_PAINT - Hauptfenster darstellen
+// WM_DESTROY - Beendigungsnachricht ausgeben und zurückkehren
+//
+//
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ int wmId;
+ int wmEvent;
+ PAINTSTRUCT ps;
+ HDC hdc;
+ TCHAR szHello[MAX_LOADSTRING];
+
+
+ LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
+
+ switch( message )
+ {
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ // Menüauswahlen analysieren:
+ switch( wmId )
+ {
+ case IDD_PASTE:
+ //PasteClipboardData(hWnd);
+ PasteClipboardData2(hWnd);
+ break;
+
+ case IDM_EXIT:
+ DestroyWindow( hWnd );
+ break;
+
+ default:
+ return DefWindowProc( hWnd, message, wParam, lParam );
+ }
+ break;
+
+ case WM_PAINT:
+ hdc = BeginPaint (hWnd, &ps);
+ // ZU ERLEDIGEN: Hier beliebigen Code zum Zeichnen hinzufügen...
+ RECT rt;
+ GetClientRect( hWnd, &rt );
+
+ if ( NULL != pTextBuff )
+ {
+ DrawText( hdc, pTextBuff, lData, &rt, DT_CENTER );
+ }
+ else
+ {
+ DrawText( hdc, szHello, strlen(szHello), &rt, DT_CENTER );
+ }
+
+ EndPaint( hWnd, &ps );
+ break;
+
+ case WM_DESTROY:
+ PostQuitMessage( 0 );
+ break;
+
+ default:
+ return DefWindowProc( hWnd, message, wParam, lParam );
+ }
+ return 0;
+}
+
+void PasteClipboardData2(HWND hwndParent)
+{
+ IDataObject* pIDataObject;
+ HRESULT hr;
+ FORMATETC formatETC;
+ STGMEDIUM stgMedium;
+ LPVOID pGlobMem;
+ HWND hwnd;
+ DWORD sizeGlobBuff;
+
+ hr = MTAGetClipboard( &pIDataObject );
+ if ( SUCCEEDED( hr ) )
+ {
+ formatETC.cfFormat = CF_TEXT;
+ formatETC.ptd = NULL;
+ formatETC.dwAspect = DVASPECT_CONTENT;
+ formatETC.lindex = -1;
+ formatETC.tymed = TYMED_HGLOBAL;
+
+ hr = pIDataObject->GetData( &formatETC, &stgMedium );
+ pGlobMem = GlobalLock( stgMedium.hGlobal );
+ if ( NULL != pGlobMem )
+ {
+ if ( NULL != pTextBuff )
+ {
+ free( pTextBuff );
+ }
+
+ sizeGlobBuff = GlobalSize( stgMedium.hGlobal );
+ pTextBuff = (char*)malloc( sizeGlobBuff + 1 );
+ ZeroMemory( pTextBuff, sizeGlobBuff + 1 );
+
+ memcpy( pTextBuff, pGlobMem, sizeGlobBuff );
+ lData = sizeGlobBuff;
+
+ InvalidateRect( hwndParent, NULL, TRUE );
+ UpdateWindow( hwndParent );
+ }
+
+ GlobalUnlock( stgMedium.hGlobal );
+
+ ReleaseStgMedium( &stgMedium );
+
+ pIDataObject->Release();
+ }
+}
+
+//----------------------------------------------------
+// clipboard handling
+//----------------------------------------------------
+
+/*
+void PasteClipboardData(HWND hwndParent)
+{
+ IDataObject* pIDataObj = NULL;
+ HRESULT hr = E_FAIL;
+ unsigned int dwId;
+
+ hr = OleGetClipboard( &pIDataObj );
+ if ( SUCCEEDED( hr ) )
+ {
+ HRESULT hr = CoMarshalInterThreadInterfaceInStream(
+ __uuidof(IDataObject), //The IID of inteface to be marshaled
+ pIDataObj, //The interface pointer
+ &g_pStm //IStream pointer
+ );
+
+ HANDLE hThread = (HANDLE)_beginthreadex(
+ NULL, //Security
+ 0, //Stack Size
+ ThreadProc, //Start Address
+ NULL, //Parmeter
+ (unsigned int)hwndParent, //Creation Flag
+ &dwId //Thread Id
+ );
+
+ //Wait for the thread to finish execution
+ //A thread handle is signaled is thread execution
+ //is complete
+ for(;;)
+ {
+ DWORD dwRet = ::MsgWaitForMultipleObjects(
+ 1, //Count of objects
+ &hThread, //pointer to the array of objects
+ FALSE, //Wait for all objects?
+ INFINITE, //Wait How Long?
+ QS_ALLINPUT //Wait for all messges
+ );
+
+ //This means that the object is signaled
+ if ( dwRet != WAIT_OBJECT_0 + 1 )
+ break;
+
+ //Remove the messages from the queue
+ MSG msg;
+
+ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0)
+ {
+ //Not essential
+ TranslateMessage(&msg);
+ //Let the windowproc handle the message
+ DispatchMessage(&msg);
+ }
+ }
+
+ CloseHandle( hThread );
+ pIDataObj->Release();
+ }
+}
+*/
diff --git a/sal/workben/clipboardwben/testpaste/cbptest.rc b/sal/workben/clipboardwben/testpaste/cbptest.rc
new file mode 100644
index 000000000000..2deeb86a93a2
--- /dev/null
+++ b/sal/workben/clipboardwben/testpaste/cbptest.rc
@@ -0,0 +1,120 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+#include "resource.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_TESTWIN32 ICON DISCARDABLE "TestWin32.ICO"
+IDI_SMALL ICON DISCARDABLE "SMALL.ICO"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDC_TESTWIN32 MENU DISCARDABLE
+BEGIN
+ POPUP "&Datei"
+ BEGIN
+ MENUITEM "&Paste", IDD_PASTE
+ MENUITEM SEPARATOR
+ MENUITEM "&Beenden", IDM_EXIT
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDC_TESTWIN32 ACCELERATORS MOVEABLE PURE
+BEGIN
+ "?", IDM_ABOUT, ASCII, ALT
+ "/", IDM_ABOUT, ASCII, ALT
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""resource.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_TITLE "TestWin32"
+ IDS_HELLO "Hallo Welt!"
+ IDC_TESTWIN32 "TESTWIN32"
+END
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/sal/workben/clipboardwben/testpaste/makefile.mk b/sal/workben/clipboardwben/testpaste/makefile.mk
new file mode 100644
index 000000000000..5514d7c569b0
--- /dev/null
+++ b/sal/workben/clipboardwben/testpaste/makefile.mk
@@ -0,0 +1,67 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=cbptest
+LIBTARGET=NO
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+#
+# test clipboard paste
+#
+ # --- Resources ----------------------------------------------------
+ RCFILES= cbptest.rc
+
+ OBJFILES= $(OBJ)$/cbptest.obj
+
+ APP1TARGET= $(TARGET)
+ APP1OBJS= $(OBJFILES)
+ APP1NOSAL= TRUE
+ APP1NOSVRES= $(RES)$/$(TARGET).res
+
+ APP1STDLIBS+=$(OLE32LIB) $(USER32LIB) $(KERNEL32LIB)
+
+ APP1LIBS=$(LB)$/ole9x.lib \
+ $(LB)$/tools32.lib
+
+ APP1DEPN= makefile.mk $(APP1NOSVRES)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+
diff --git a/sal/workben/clipboardwben/testpaste/resource.h b/sal/workben/clipboardwben/testpaste/resource.h
new file mode 100644
index 000000000000..5206e911eabf
--- /dev/null
+++ b/sal/workben/clipboardwben/testpaste/resource.h
@@ -0,0 +1,28 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by mtacb.rc
+//
+#define IDC_MYICON 2
+#define IDD_TESTWIN32_DIALOG 102
+#define IDD_ABOUTBOX 103
+#define IDS_APP_TITLE 103
+#define IDM_ABOUT 104
+#define IDM_EXIT 105
+#define IDS_HELLO 106
+#define IDI_TESTWIN32 107
+#define IDI_SMALL 108
+#define IDC_TESTWIN32 109
+#define IDR_MAINFRAME 128
+#define IDD_PASTE 32771
+#define IDC_STATIC -1
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 129
+#define _APS_NEXT_COMMAND_VALUE 32772
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 110
+#endif
+#endif
diff --git a/sal/workben/clipboardwben/testpaste/small.ico b/sal/workben/clipboardwben/testpaste/small.ico
new file mode 100644
index 000000000000..8f94d9aa8285
--- /dev/null
+++ b/sal/workben/clipboardwben/testpaste/small.ico
Binary files differ
diff --git a/sal/workben/clipboardwben/testviewer/StdAfx.cpp b/sal/workben/clipboardwben/testviewer/StdAfx.cpp
new file mode 100644
index 000000000000..cb07d603f28f
--- /dev/null
+++ b/sal/workben/clipboardwben/testviewer/StdAfx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : Quelltextdatei, die nur die Standard-Includes einbindet
+// TestWin32.pch ist die vorkompilierte Header-Datei
+// stdafx.obj enthält die vorkompilierte Typinformation
+
+#include "stdafx.h"
+
+// ZU ERLEDIGEN: Verweis auf alle zusätzlichen Header-Dateien, die Sie in STDAFX.H
+// und nicht in dieser Datei benötigen
diff --git a/sal/workben/clipboardwben/testviewer/StdAfx.h b/sal/workben/clipboardwben/testviewer/StdAfx.h
new file mode 100644
index 000000000000..bb762adbdc36
--- /dev/null
+++ b/sal/workben/clipboardwben/testviewer/StdAfx.h
@@ -0,0 +1,32 @@
+// stdafx.h : Include-Datei für Standard-System-Include-Dateien,
+// oder projektspezifische Include-Dateien, die häufig benutzt, aber
+// in unregelmäßigen Abständen geändert werden.
+//
+
+#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
+#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#define WIN32_LEAN_AND_MEAN // Selten benutzte Teile der Windows-Header nicht einbinden
+
+
+// Windows-Header-Dateien:
+#include <windows.h>
+
+// Header-Dateien der C-Laufzeit
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+
+// Lokale Header-Dateien
+
+// ZU ERLEDIGEN: Verweisen Sie hier auf zusätzliche Header-Dateien, die Ihr Programm benötigt
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ fügt zusätzliche Deklarationen unmittelbar vor der vorherigen Zeile ein.
+
+#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
diff --git a/sal/workben/clipboardwben/testviewer/TestWin32.ico b/sal/workben/clipboardwben/testviewer/TestWin32.ico
new file mode 100644
index 000000000000..255ff3be4fba
--- /dev/null
+++ b/sal/workben/clipboardwben/testviewer/TestWin32.ico
Binary files differ
diff --git a/sal/workben/clipboardwben/testviewer/cbvtest.cxx b/sal/workben/clipboardwben/testviewer/cbvtest.cxx
new file mode 100644
index 000000000000..d79758971728
--- /dev/null
+++ b/sal/workben/clipboardwben/testviewer/cbvtest.cxx
@@ -0,0 +1,351 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+// TestWin32.cpp : Definiert den Einsprungpunkt für die Anwendung.
+//
+
+#define _WIN32_DCOM
+
+#include "stdafx.h"
+
+#include <windows.h>
+
+#include <ole2.h>
+#include <objidl.h>
+#include <objbase.h>
+#include <process.h>
+#include <olectl.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <crtdbg.h>
+#include <..\..\inc\systools\win32\MtaOleClipb.h>
+
+#include "resource.h"
+
+#define MAX_LOADSTRING 100
+
+// Globale Variablen:
+HINSTANCE g_hInst; // aktuelle Instanz
+HWND g_hwndMain;
+WCHAR szTitle[MAX_LOADSTRING]; // Text der Titelzeile
+WCHAR szWindowClass[MAX_LOADSTRING]; // Text der Titelzeile
+LPSTREAM g_pStm = NULL;
+char* pTextBuff = NULL;
+DWORD lData = 0;
+UINT g_nCBChanges = 0;
+
+// forward declaration
+ATOM MyRegisterClass( HINSTANCE hInstance );
+BOOL InitInstance( HINSTANCE, int );
+HMENU GetSubMenuHandle( HWND hwndParent, UINT uiTopLevelIndex );
+BOOL IsClipboardViewer( HWND hwndParent );
+void SwitchMenuState( HWND hwndParent );
+void RegisterClipboardViewer( BOOL bRegister );
+void ShowAvailableClipboardFormats( HWND hWnd, HDC hdc, PAINTSTRUCT ps, RECT rcWnd );
+void ClearClipboardContent( HWND hWnd );
+
+void CALLBACK OnClipboardContentChange( void );
+LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
+LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM );
+
+//----------------------------------------------------
+// WinMain
+//----------------------------------------------------
+
+int APIENTRY WinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow )
+{
+ // ZU ERLEDIGEN: Fügen Sie hier den Code ein.
+ MSG msg;
+ HACCEL hAccelTable;
+ HRESULT hr = E_FAIL;
+
+ // it's important to initialize ole
+ // in order to use the clipboard
+ //hr = OleInitialize( NULL );
+ hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
+
+ g_hInst = hInstance;
+
+ // Globale Zeichenfolgen initialisieren
+ LoadStringW(g_hInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+ LoadStringW(g_hInst, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING);
+ MyRegisterClass(g_hInst);
+
+ // Initialisierung der Anwendung durchführen:
+ if( !InitInstance( g_hInst, nCmdShow ) )
+ {
+ return FALSE;
+ }
+
+ hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTWIN32);
+
+ // Hauptnachrichtenschleife:
+ while( GetMessage(&msg, NULL, 0, 0) )
+ {
+ if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) )
+ {
+ TranslateMessage( &msg );
+ DispatchMessage( &msg );
+ }
+ }
+
+ // uninitializing the ole libraries
+ //OleUninitialize( );
+ CoUninitialize( );
+
+ return msg.wParam;
+}
+
+
+
+//
+// FUNKTION: MyRegisterClass()
+//
+// AUFGABE: Registriert die Fensterklasse.
+//
+// KOMMENTARE:
+//
+// Diese Funktion und ihre Verwendung sind nur notwendig, wenn dieser Code
+// mit Win32-Systemen vor der 'RegisterClassEx'-Funktion kompatibel sein soll,
+// die zu Windows 95 hinzugefügt wurde. Es ist wichtig diese Funktion aufzurufen,
+// damit der Anwendung kleine Symbole mit den richtigen Proportionen zugewiesen
+// werden.
+//
+ATOM MyRegisterClass( HINSTANCE hInstance )
+{
+ WNDCLASSEXW wcex;
+
+ wcex.cbSize = sizeof(WNDCLASSEX);
+
+ wcex.style = CS_HREDRAW | CS_VREDRAW;
+ wcex.lpfnWndProc = (WNDPROC)WndProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hInstance;
+ wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TESTWIN32);
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ wcex.lpszMenuName = (LPCWSTR)IDC_TESTWIN32;
+ wcex.lpszClassName = szWindowClass;
+ wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
+
+ return RegisterClassExW(&wcex);
+}
+
+//
+// FUNKTION: InitInstance(HANDLE, int)
+//
+// AUFGABE: Speichert die Instanzzugriffsnummer und erstellt das Hauptfenster
+//
+// KOMMENTARE:
+//
+// In dieser Funktion wird die Instanzzugriffsnummer in einer globalen Variable
+// gespeichert und das Hauptprogrammfenster erstellt und angezeigt.
+//
+BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
+{
+ g_hwndMain = CreateWindowExW(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
+
+ if( !IsWindow( g_hwndMain ) )
+ {
+ return FALSE;
+ }
+
+ ShowWindow( g_hwndMain, nCmdShow );
+ UpdateWindow( g_hwndMain );
+
+ return TRUE;
+}
+
+//
+// FUNKTION: WndProc(HWND, unsigned, WORD, LONG)
+//
+// AUFGABE: Verarbeitet Nachrichten für das Hauptfenster.
+//
+// WM_COMMAND - Anwendungsmenü verarbeiten
+// WM_PAINT - Hauptfenster darstellen
+// WM_DESTROY - Beendigungsnachricht ausgeben und zurückkehren
+//
+//
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ int wmId;
+ int wmEvent;
+ PAINTSTRUCT ps;
+ HDC hdc;
+ WCHAR szHello[MAX_LOADSTRING];
+
+
+ LoadStringW(g_hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
+
+ switch( message )
+ {
+ case WM_CREATE:
+ ClearClipboardContent( hWnd );
+ break;
+
+ case WM_COMMAND:
+ wmId = LOWORD(wParam);
+ wmEvent = HIWORD(wParam);
+ // Menüauswahlen analysieren:
+ switch( wmId )
+ {
+ case IDD_CBVIEWER:
+ SwitchMenuState( hWnd );
+ RegisterClipboardViewer( IsClipboardViewer( hWnd ) );
+ break;
+
+ case IDM_EXIT:
+ DestroyWindow( hWnd );
+ break;
+
+ default:
+ return DefWindowProc( hWnd, message, wParam, lParam );
+ }
+ break;
+
+ case WM_PAINT:
+ hdc = BeginPaint (hWnd, &ps);
+ // ZU ERLEDIGEN: Hier beliebigen Code zum Zeichnen hinzufügen...
+ RECT rt;
+ GetClientRect( hWnd, &rt );
+
+ if ( IsClipboardViewer( g_hwndMain ) )
+ {
+ ShowAvailableClipboardFormats( hWnd, hdc, ps, rt );
+ }
+ else
+ {
+ WCHAR wcString[MAX_LOADSTRING];
+ LoadStringW(g_hInst, IDS_MSG_CBVIEWER_IS_OFF, wcString, MAX_LOADSTRING);
+ DrawTextW( hdc, wcString, wcslen( wcString ), &rt, DT_CENTER );
+ }
+
+ EndPaint( hWnd, &ps );
+ break;
+
+ case WM_DESTROY:
+ PostQuitMessage( 0 );
+ break;
+
+ default:
+ return DefWindowProc( hWnd, message, wParam, lParam );
+ }
+ return 0;
+}
+
+HMENU GetSubMenuHandle( HWND hwndParent, UINT uiTopLevelIndex )
+{
+ HMENU hMenuMain = GetMenu( hwndParent );
+ _ASSERT( IsMenu( hMenu ) );
+
+ HMENU hSubMenu = GetSubMenu( hMenuMain, uiTopLevelIndex );
+ _ASSERT( IsMenu( hSubMenu ) );
+
+ return hSubMenu;
+}
+
+BOOL IsClipboardViewer( HWND hwndParent )
+{
+ HMENU hSubMenu = GetSubMenuHandle( hwndParent, 0 );
+ UINT uiMState = GetMenuState( hSubMenu, 0, MF_BYPOSITION );
+ return ( MF_CHECKED == uiMState );
+}
+
+void SwitchMenuState( HWND hwndParent )
+{
+ HMENU hSubMenu = GetSubMenuHandle( hwndParent, 0 );
+ WCHAR wcMenuString[MAX_LOADSTRING];
+
+ if ( IsClipboardViewer( hwndParent ) )
+ {
+ LoadStringW(g_hInst, IDS_CBVIEWER_OFF, wcMenuString, MAX_LOADSTRING);
+ ModifyMenuW( hSubMenu, 0, MF_BYPOSITION | MF_STRING, IDD_CBVIEWER, wcMenuString );
+ CheckMenuItem( hSubMenu, 0, MF_BYPOSITION | MF_UNCHECKED );
+ }
+ else
+ {
+ LoadStringW(g_hInst, IDS_CBVIEWER_ON, wcMenuString, MAX_LOADSTRING);
+ ModifyMenuW( hSubMenu, 0, MF_BYPOSITION | MF_STRING, IDD_CBVIEWER, wcMenuString );
+ CheckMenuItem( hSubMenu, 0, MF_BYPOSITION | MF_CHECKED );
+ }
+}
+
+void RegisterClipboardViewer( BOOL bRegister )
+{
+ if ( bRegister )
+ MTARegisterClipboardViewer( OnClipboardContentChange );
+ else // unregister
+ MTARegisterClipboardViewer( NULL );
+
+ InvalidateRect( g_hwndMain, NULL, TRUE );
+ UpdateWindow( g_hwndMain );
+}
+
+void ShowAvailableClipboardFormats( HWND hWnd, HDC hdc, PAINTSTRUCT ps, RECT rcWnd )
+{
+ if ( !OpenClipboard( hWnd ) )
+ {
+ WCHAR szErrMsg[] = { L"Couldn't open the clipboard" };
+ DrawTextW( hdc, szErrMsg, wcslen( szErrMsg ), &rcWnd, DT_CENTER );
+ return;
+ }
+ else
+ {
+ WCHAR szCBChangedMsg[100];
+
+ wsprintfW( szCBChangedMsg, L"Clipboard content changed %d", g_nCBChanges );
+ DrawTextW( hdc, szCBChangedMsg, wcslen( szCBChangedMsg ), &rcWnd, DT_CENTER );
+
+ CloseClipboard( );
+ }
+}
+
+void ClearClipboardContent( HWND hWnd )
+{
+ if ( OpenClipboard( hWnd ) )
+ {
+ EmptyClipboard( );
+ CloseClipboard( );
+ }
+}
+
+// clipboard viewer callback function
+void CALLBACK OnClipboardContentChange( void )
+{
+ ++g_nCBChanges;
+ InvalidateRect( g_hwndMain, NULL, TRUE );
+ UpdateWindow( g_hwndMain );
+}
+
diff --git a/sal/workben/clipboardwben/testviewer/cbvtest.rc b/sal/workben/clipboardwben/testviewer/cbvtest.rc
new file mode 100644
index 000000000000..b6c5163f7261
--- /dev/null
+++ b/sal/workben/clipboardwben/testviewer/cbvtest.rc
@@ -0,0 +1,127 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#define APSTUDIO_HIDDEN_SYMBOLS
+#include "windows.h"
+#undef APSTUDIO_HIDDEN_SYMBOLS
+#include "resource.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// German (Germany) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)
+#ifdef _WIN32
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_TESTWIN32 ICON DISCARDABLE "TestWin32.ICO"
+IDI_SMALL ICON DISCARDABLE "SMALL.ICO"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDC_TESTWIN32 MENU DISCARDABLE
+BEGIN
+ POPUP "&Datei"
+ BEGIN
+ MENUITEM "&CB Viewer off", IDD_CBVIEWER
+ MENUITEM SEPARATOR
+ MENUITEM "&Beenden", IDM_EXIT
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDC_TESTWIN32 ACCELERATORS MOVEABLE PURE
+BEGIN
+ "?", IDM_ABOUT, ASCII, ALT
+ "/", IDM_ABOUT, ASCII, ALT
+END
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""windows.h""\r\n"
+ "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
+ "#include ""resource.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_APP_TITLE "TestWin32"
+ IDS_HELLO "Hallo Welt!"
+ IDC_TESTWIN32 "TESTWIN32"
+ IDS_CBVIEWER_ON "CB Viewer on"
+ IDS_CBVIEWER_OFF "CB Viewer off"
+END
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ IDS_MSG_CBVIEWER_IS_OFF "Clipboard Viewer inactive!"
+END
+
+#endif // German (Germany) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/sal/workben/clipboardwben/testviewer/makefile.mk b/sal/workben/clipboardwben/testviewer/makefile.mk
new file mode 100644
index 000000000000..fa3e47cb48b2
--- /dev/null
+++ b/sal/workben/clipboardwben/testviewer/makefile.mk
@@ -0,0 +1,67 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+
+PRJNAME=sal
+TARGET=cbvtest
+LIBTARGET=NO
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+#
+# test clipboard paste
+#
+ # --- Resources ----------------------------------------------------
+ RCFILES= cbvtest.rc
+
+ OBJFILES= $(OBJ)$/cbvtest.obj
+
+ APP1TARGET= $(TARGET)
+ APP1OBJS= $(OBJFILES)
+ APP1NOSAL= TRUE
+ APP1NOSVRES= $(RES)$/$(TARGET).res
+
+ APP1STDLIBS+=$(OLE32LIB) $(USER32LIB) $(KERNEL32LIB)
+
+ APP1LIBS=$(LB)$/iole9x.lib \
+ $(LB)$/tools32.lib
+
+ APP1DEPN= makefile.mk $(APP1NOSVRES)
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+
diff --git a/sal/workben/clipboardwben/testviewer/resource.h b/sal/workben/clipboardwben/testviewer/resource.h
new file mode 100644
index 000000000000..fa4a79779aa9
--- /dev/null
+++ b/sal/workben/clipboardwben/testviewer/resource.h
@@ -0,0 +1,32 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by cbvtest.rc
+//
+#define IDC_MYICON 2
+#define IDD_TESTWIN32_DIALOG 102
+#define IDD_ABOUTBOX 103
+#define IDS_APP_TITLE 103
+#define IDM_ABOUT 104
+#define IDM_EXIT 105
+#define IDS_HELLO 106
+#define IDI_TESTWIN32 107
+#define IDI_SMALL 108
+#define IDC_TESTWIN32 109
+#define IDS_CBVIEWER_ON 110
+#define IDS_CBVIEWER_OFF 111
+#define IDS_MSG_CBVIEWER_IS_OFF 112
+#define IDR_MAINFRAME 128
+#define IDD_PASTE 32771
+#define IDD_CBVIEWER 32771
+#define IDC_STATIC -1
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 129
+#define _APS_NEXT_COMMAND_VALUE 32772
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 110
+#endif
+#endif
diff --git a/sal/workben/clipboardwben/testviewer/small.ico b/sal/workben/clipboardwben/testviewer/small.ico
new file mode 100644
index 000000000000..8f94d9aa8285
--- /dev/null
+++ b/sal/workben/clipboardwben/testviewer/small.ico
Binary files differ
diff --git a/sal/workben/export.exp b/sal/workben/export.exp
new file mode 100644
index 000000000000..8a37bf2291a8
--- /dev/null
+++ b/sal/workben/export.exp
@@ -0,0 +1 @@
+registerAllTestFunction \ No newline at end of file
diff --git a/sal/workben/getlocaleinfotest.cxx b/sal/workben/getlocaleinfotest.cxx
new file mode 100644
index 000000000000..a0c3134c5fa4
--- /dev/null
+++ b/sal/workben/getlocaleinfotest.cxx
@@ -0,0 +1,50 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <rtl/locale.h>
+#include <osl/nlsupport.h>
+#include <rtl/ustring.hxx>
+
+int _cdecl main( int argc, char * argv[] )
+{
+ rtl::OUString lang = rtl::OUString::createFromAscii( "de" );
+ rtl::OUString country = rtl::OUString::createFromAscii( "DE" );
+ rtl_TextEncoding rtlTextEnc;
+
+ rtl_Locale* rtlLocale =
+ rtl_locale_register( lang.getStr( ), country.getStr( ), NULL );
+
+ if ( rtlLocale )
+ rtlTextEnc = osl_getTextEncodingFromLocale( rtlLocale );
+
+ return(0);
+}
+
+
diff --git a/sal/workben/makefile.mk b/sal/workben/makefile.mk
new file mode 100644
index 000000000000..c93d756ba132
--- /dev/null
+++ b/sal/workben/makefile.mk
@@ -0,0 +1,386 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2000, 2010 Oracle and/or its affiliates.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ=..
+
+PRJNAME=sal
+TARGET=workben
+LIBTARGET=NO
+TARGETTYPE=CUI
+#ENABLE_EXCEPTIONS=TRUE
+NO_DEFAULT_STL=YES
+
+#TESTAPP=test_osl_getVolInfo
+#TESTAPP=test_osl_joinProcess
+#TESTAPP=getlocaleinfotest
+#TESTAPP=test_osl_joinProcess
+#TESTAPP=getlocaleinfotest
+#TESTAPP=salstattest
+#TESTAPP=saldyntest
+
+TESTAPP=t_readline
+#TESTAPP=t_cipher
+#TESTAPP=t_digest
+#TESTAPP=t_random
+#TESTAPP=t_layer
+#TESTAPP=t_tls
+#TESTAPP=t_zip
+
+#TESTAPP=testfile
+#TESTAPP=testpipe
+#TESTAPP=testpip2
+#TESTAPP=testproc
+#TESTAPP=tgetpwnam
+#TESTAPP=salstattest
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+
+CFLAGS+= $(LFS_CFLAGS)
+CXXFLAGS+= $(LFS_CFLAGS)
+
+# --- Files --------------------------------------------------------
+
+.IF "$(TESTAPP)" == "test_osl_getVolInfo"
+
+SHL1OBJS=$(SLO)$/t_osl_getVolInfo.obj
+SHL1TARGET=togvi
+
+.IF "$(GUI)" == "WNT"
+APP1STDLIBS=$(KERNEL32LIB)
+SHL1STDLIBS=$(LB)$/isal.lib
+SHL1STDLIBS+=$(SOLARLIBDIR)$/cppunit.lib
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL1STDLIBS=$(LB)$/libsal.so
+SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+.ENDIF
+
+SHL1IMPLIB=i$(SHL1TARGET)
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+DEF1NAME=$(SHL1TARGET)
+DEF1EXPORTFILE=export.exp
+.ENDIF
+
+.IF "$(TESTAPP)" == "test_osl_joinProcess"
+OBJFILES=$(OBJ)$/t_ojp_exe.obj
+APP1TARGET=ojpx
+APP1OBJS=$(OBJFILES)
+
+.IF "$(GUI)" == "UNX"
+APP1STDLIBS=$(LB)$/libsal.so
+.ENDIF
+
+SHL1OBJS=$(SLO)$/t_osl_joinProcess.obj
+SHL1TARGET=tojp
+
+.IF "$(GUI)" == "WNT"
+APP1STDLIBS=$(KERNEL32LIB)
+SHL1STDLIBS=$(LB)$/isal.lib
+SHL1STDLIBS+=$(SOLARLIBDIR)$/cppunit.lib
+.ENDIF
+
+.IF "$(GUI)" == "UNX"
+SHL1STDLIBS=$(LB)$/libsal.so
+SHL1STDLIBS+=$(SOLARLIBDIR)$/libcppunit$(DLLPOSTFIX).a
+.ENDIF
+
+SHL1IMPLIB=i$(SHL1TARGET)
+SHL1DEF=$(MISC)$/$(SHL1TARGET).def
+DEF1NAME=$(SHL1TARGET)
+DEF1EXPORTFILE=export.exp
+.ENDIF
+
+.IF "$(TESTAPP)" == "getlocaleinfotest"
+
+ OBJFILES=$(OBJ)$/getlocaleinfotest.obj
+
+ APP1TARGET= getlitest
+ APP1OBJS=$(OBJFILES)
+
+ APP1STDLIBS=\
+ $(KERNEL32LIB)
+
+ APP1LIBS=\
+ $(LB)$/kernel9x.lib\
+ $(LB)$/isal.lib
+
+ APP1DEPN=$(LB)$/isal.lib
+
+.ENDIF
+
+.IF "$(TESTAPP)" == "salstattest"
+
+ CFLAGS+= -DUSE_SAL_STATIC
+
+ OBJFILES= $(OBJ)$/salstattest.obj
+
+ APP1TARGET= salstattest
+ APP1OBJS= $(OBJFILES)
+ APP1STDLIBS=\
+ $(LB)$/asal.lib\
+ $(SHELL32LIB)\
+ $(USER32LIB)\
+ $(COMDLG32LIB)\
+ $(ADVAPI32LIB)
+
+ APP1DEPN= $(LB)$/asal.lib
+
+.ENDIF # salstattest
+
+.IF "$(TESTAPP)" == "saldyntest"
+
+ OBJFILES= $(OBJ)$/saldyntest.obj
+
+ APP1TARGET= saldyntest
+ APP1OBJS= $(OBJFILES)
+ APP1STDLIBS=\
+ $(LB)$/isal.lib\
+ $(SHELL32LIB)\
+ $(USER32LIB)\
+ $(COMDLG32LIB)\
+ $(ADVAPI32LIB)
+
+ APP1DEPN= $(LB)$/isal.lib
+
+.ENDIF # salstattest
+
+#
+# t_readline
+#
+.IF "$(TESTAPP)" == "t_readline"
+
+CFILES= t_readline.c
+OBJFILES= $(OBJ)$/t_readline.obj
+
+APP1TARGET= t_readline
+APP1OBJS= $(OBJFILES)
+APP1STDLIBS=$(SALLIB)
+APP1DEPN= $(SLB)$/sal.lib
+
+APP1RPATH=UREBIN
+
+.ENDIF # t_readline
+
+#
+# t_cipher
+#
+.IF "$(TESTAPP)" == "t_cipher"
+
+CFILES= t_cipher.c
+OBJFILES= $(OBJ)$/t_cipher.obj
+
+APP1TARGET= t_cipher
+APP1OBJS= $(OBJFILES)
+APP1STDLIBS=$(SALLIB)
+APP1DEPN= $(SLB)$/sal.lib
+
+.ENDIF # t_cipher
+
+#
+# t_digest.
+#
+.IF "$(TESTAPP)" == "t_digest"
+
+CFILES= t_digest.c
+OBJFILES= $(OBJ)$/t_digest.obj
+
+APP2TARGET= t_digest
+APP2OBJS= $(OBJFILES)
+APP2STDLIBS=$(SALLIB)
+APP2DEPN= $(SLB)$/sal.lib
+
+.ENDIF # t_digest
+
+#
+# t_random.
+#
+.IF "$(TESTAPP)" == "t_random"
+
+CFILES= t_random.c
+OBJFILES= $(OBJ)$/t_random.obj
+
+APP3TARGET= t_random
+APP3OBJS= $(OBJFILES)
+APP3STDLIBS=$(SALLIB)
+APP3DEPN= $(SLB)$/sal.lib
+
+.ENDIF # t_random
+
+#
+# t_layer.
+#
+.IF "$(TESTAPP)" == "t_layer"
+
+CFILES= t_layer.c
+OBJFILES= $(OBJ)$/t_layer.obj
+
+APP4TARGET= t_layer
+APP4OBJS= $(OBJFILES)
+APP4STDLIBS=$(SALLIB)
+APP4DEPN= $(SLB)$/sal.lib
+
+.ENDIF # t_layer
+
+#
+# t_tls.
+#
+.IF "$(TESTAPP)" == "t_tls"
+
+CFILES= t_tls.c
+OBJFILES= $(OBJ)$/t_tls.obj
+
+.IF "$(SALTLSLIB)" == ""
+
+.IF "$(GUI)" == "UNX"
+SALTLSLIB= -lsaltls2
+.ENDIF # unx
+
+.IF "$(GUI)" == "WNT"
+SALTLSLIB= $(SALTLSLIB)
+.ENDIF # wnt
+
+.ENDIF # saltlslib
+
+APP5TARGET= t_tls
+APP5OBJS= $(OBJFILES)
+APP5STDLIBS=$(SALTLSLIB) $(SALLIB)
+APP5DEPN= $(SLB)$/sal.lib
+
+.ENDIF # t_tls
+
+#
+# t_zip.
+#
+.IF "$(TESTAPP)" == "t_zip"
+
+CFILES= t_zip.c
+OBJFILES= $(OBJ)$/t_zip.obj
+
+.IF "$(SALZIPLIB)" == ""
+
+.IF "$(GUI)" == "UNX"
+SALZIPLIB= -lsalzip2
+.ENDIF # unx
+
+.IF "$(GUI)" == "WNT"
+SALZIPLIB= $(SALZIPLIB)
+.ENDIF # wnt
+
+.ENDIF # salziplib
+
+APP6TARGET= t_zip
+APP6OBJS= $(OBJFILES)
+APP6STDLIBS=$(SALZIPLIB) $(SALLIB)
+APP6DEPN= $(SLB)$/sal.lib
+
+.ENDIF # t_zip
+
+#
+# testfile
+#
+.IF "$(TESTAPP)" == "testfile"
+
+CXXFILES= testfile.cxx
+OBJFILES= $(OBJ)$/testfile.obj
+
+APP1TARGET= testfile
+APP1OBJS= $(OBJFILES)
+APP1STDLIBS=$(SALLIB)
+APP1DEPN= $(SLB)$/sal.lib
+
+.ENDIF # testfile
+
+#
+# testpipe
+#
+.IF "$(TESTAPP)" == "testpipe"
+
+CXXFILES= testpipe.cxx
+OBJFILES= $(OBJ)$/testpipe.obj
+
+APP2TARGET= testpipe
+APP2OBJS= $(OBJFILES)
+APP2STDLIBS=$(SALLIB)
+APP2DEPN= $(SLB)$/sal.lib
+
+.ENDIF # testpipe
+
+#
+# testpip2
+#
+.IF "$(TESTAPP)" == "testpip2"
+
+CXXFILES= testpip2.cxx
+OBJFILES= $(OBJ)$/testpip2.obj
+
+APP3TARGET= testpip2
+APP3OBJS= $(OBJFILES)
+APP3STDLIBS=$(SALLIB)
+APP3DEPN= $(SLB)$/sal.lib
+
+.ENDIF # testpip2
+
+#
+# testproc
+#
+.IF "$(TESTAPP)" == "testproc"
+
+CXXFILES= testproc.cxx
+OBJFILES= $(OBJ)$/testproc.obj
+
+APP4TARGET= testproc
+APP4OBJS= $(OBJFILES)
+APP4STDLIBS=$(SALLIB)
+APP4DEPN= $(SLB)$/sal.lib
+
+.ENDIF # testproc
+
+#
+# tgetpwnam
+#
+.IF "$(TESTAPP)" == "tgetpwnam"
+.IF "$(OS)"=="SCO" || "$(OS)"=="NETBSD" || "$(OS)"=="FREEBSD"
+
+CXXFILES= tgetpwnam.cxx
+OBJFILES= $(OBJ)$/tgetpwnam.obj
+
+APP5TARGET= tgetpwnam
+APP5OBJS= $(OBJFILES)
+APP5STDLIBS=$(SALLIB)
+APP5DEPN= $(SLB)$/sal.lib
+
+.ENDIF # (sco | netbsd | freebsd)
+.ENDIF # tgetpwname
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+
diff --git a/sal/workben/saldyntest.c b/sal/workben/saldyntest.c
new file mode 100644
index 000000000000..c8cc6c430d26
--- /dev/null
+++ b/sal/workben/saldyntest.c
@@ -0,0 +1,52 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <systools/win32/shell9x.h>
+#include <systools/win32/kernel9x.h>
+
+int _cdecl main( int argc, char * argv[] )
+{
+ BROWSEINFOW bi;
+ wchar_t buff[260];
+ DWORD dwRet;
+
+ bi.hwndOwner = NULL;
+ bi.pidlRoot = NULL;
+ bi.pszDisplayName = buff;
+ bi.lpszTitle = L"Test";
+ bi.ulFlags = 0;
+ bi.lpfn = NULL;
+ bi.lParam = 0;
+
+ SHBrowseForFolderW( &bi );
+
+ dwRet = GetCanonicalPathW( L"c:\\", buff, 260 );
+
+ return(0);
+}
+
+
diff --git a/sal/workben/salstattest.c b/sal/workben/salstattest.c
new file mode 100644
index 000000000000..e19e07ad8260
--- /dev/null
+++ b/sal/workben/salstattest.c
@@ -0,0 +1,56 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <stdio.h>
+#include <systools/win32/shell9x.h>
+#include <systools/win32/kernel9x.h>
+
+//#include <windows.h>
+//#include <shlobj.h>
+
+int _cdecl main( int argc, char * argv[] )
+{
+ BROWSEINFOW bi;
+ wchar_t buff[260];
+ DWORD dwRet;
+
+ bi.hwndOwner = NULL;
+ bi.pidlRoot = NULL;
+ bi.pszDisplayName = buff;
+ bi.lpszTitle = L"Test";
+ bi.ulFlags = 0;
+ bi.lpfn = NULL;
+ bi.lParam = 0;
+
+ SHBrowseForFolderW( &bi );
+
+ dwRet = GetLongPathNameW( L"c:\\", buff, 260 );
+
+ return(0);
+}
+
+
diff --git a/sal/workben/t_cipher.c b/sal/workben/t_cipher.c
new file mode 100644
index 000000000000..b7126bd46de1
--- /dev/null
+++ b/sal/workben/t_cipher.c
@@ -0,0 +1,396 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include <sal/types.h>
+#include <osl/diagnose.h>
+#include <rtl/cipher.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#define NUM_VARIABLE_KEY_TESTS 34
+#define NUM_SET_KEY_TESTS 24
+
+/* plaintext bytes -- left halves */
+unsigned long plaintext_l[NUM_VARIABLE_KEY_TESTS + NUM_SET_KEY_TESTS] = {
+ 0x00000000l, 0xFFFFFFFFl, 0x10000000l, 0x11111111l, 0x11111111l,
+ 0x01234567l, 0x00000000l, 0x01234567l, 0x01A1D6D0l, 0x5CD54CA8l,
+ 0x0248D438l, 0x51454B58l, 0x42FD4430l, 0x059B5E08l, 0x0756D8E0l,
+ 0x762514B8l, 0x3BDD1190l, 0x26955F68l, 0x164D5E40l, 0x6B056E18l,
+ 0x004BD6EFl, 0x480D3900l, 0x437540C8l, 0x072D43A0l, 0x02FE5577l,
+ 0x1D9D5C50l, 0x30553228l, 0x01234567l, 0x01234567l, 0x01234567l,
+ 0xFFFFFFFFl, 0x00000000l, 0x00000000l, 0xFFFFFFFFl, 0xFEDCBA98l,
+ 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l,
+ 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l,
+ 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l,
+ 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l,
+ 0xFEDCBA98l, 0xFEDCBA98l, 0xFEDCBA98l };
+
+/* plaintext bytes -- right halves */
+unsigned long plaintext_r[NUM_VARIABLE_KEY_TESTS + NUM_SET_KEY_TESTS] = {
+ 0x00000000l, 0xFFFFFFFFl, 0x00000001l, 0x11111111l, 0x11111111l,
+ 0x89ABCDEFl, 0x00000000l, 0x89ABCDEFl, 0x39776742l, 0x3DEF57DAl,
+ 0x06F67172l, 0x2DDF440Al, 0x59577FA2l, 0x51CF143Al, 0x774761D2l,
+ 0x29BF486Al, 0x49372802l, 0x35AF609Al, 0x4F275232l, 0x759F5CCAl,
+ 0x09176062l, 0x6EE762F2l, 0x698F3CFAl, 0x77075292l, 0x8117F12Al,
+ 0x18F728C2l, 0x6D6F295Al, 0x89ABCDEFl, 0x89ABCDEFl, 0x89ABCDEFl,
+ 0xFFFFFFFFl, 0x00000000l, 0x00000000l, 0xFFFFFFFFl, 0x76543210l,
+ 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l,
+ 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l,
+ 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l,
+ 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l, 0x76543210l,
+ 0x76543210l, 0x76543210l, 0x76543210l };
+
+/* key bytes for variable key tests */
+unsigned char variable_key[NUM_VARIABLE_KEY_TESTS][8] = {
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+ { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
+ { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
+ { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
+ { 0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E },
+ { 0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86 },
+ { 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E },
+ { 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6 },
+ { 0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE },
+ { 0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6 },
+ { 0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE },
+ { 0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16 },
+ { 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F },
+ { 0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46 },
+ { 0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E },
+ { 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76 },
+ { 0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07 },
+ { 0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F },
+ { 0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7 },
+ { 0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF },
+ { 0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6 },
+ { 0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF },
+ { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
+ { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
+ { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
+ { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }};
+
+/* key bytes for set key tests */
+unsigned char set_key[24] = {
+ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87,
+ 0x78, 0x69, 0x5A, 0x4B, 0x3C, 0x2D, 0x1E, 0x0F,
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
+
+/* ciphertext bytes -- left halves */
+unsigned long ciphertext_l[NUM_VARIABLE_KEY_TESTS + NUM_SET_KEY_TESTS] = {
+ 0x4EF99745l, 0x51866FD5l, 0x7D856F9Al, 0x2466DD87l, 0x61F9C380l,
+ 0x7D0CC630l, 0x4EF99745l, 0x0ACEAB0Fl, 0x59C68245l, 0xB1B8CC0Bl,
+ 0x1730E577l, 0xA25E7856l, 0x353882B1l, 0x48F4D088l, 0x432193B7l,
+ 0x13F04154l, 0x2EEDDA93l, 0xD887E039l, 0x5F99D04Fl, 0x4A057A3Bl,
+ 0x452031C1l, 0x7555AE39l, 0x53C55F9Cl, 0x7A8E7BFAl, 0xCF9C5D7Al,
+ 0xD1ABB290l, 0x55CB3774l, 0xFA34EC48l, 0xA7907951l, 0xC39E072Dl,
+ 0x014933E0l, 0xF21E9A77l, 0x24594688l, 0x6B5C5A9Cl, 0xF9AD597Cl,
+ 0xE91D21C1l, 0xE9C2B70Al, 0xBE1E6394l, 0xB39E4448l, 0x9457AA83l,
+ 0x8BB77032l, 0xE87A244El, 0x15750E7Al, 0x122BA70Bl, 0x3A833C9Al,
+ 0x9409DA87l, 0x884F8062l, 0x1F85031Cl, 0x79D9373Al, 0x93142887l,
+ 0x03429E83l, 0xA4299E27l, 0xAFD5AED1l, 0x10851C0El, 0xE6F51ED7l,
+ 0x64A6E14Al, 0x80C7D7D4l, 0x05044B62l };
+
+/* ciphertext bytes -- right halves */
+unsigned long ciphertext_r[NUM_VARIABLE_KEY_TESTS + NUM_SET_KEY_TESTS] = {
+ 0x6198DD78l, 0xB85ECB8Al, 0x613063F2l, 0x8B963C9Dl, 0x2281B096l,
+ 0xAFDA1EC7l, 0x6198DD78l, 0xC6A0A28Dl, 0xEB05282Bl, 0x250F09A0l,
+ 0x8BEA1DA4l, 0xCF2651EBl, 0x09CE8F1Al, 0x4C379918l, 0x8951FC98l,
+ 0xD69D1AE5l, 0xFFD39C79l, 0x3C2DA6E3l, 0x5B163969l, 0x24D3977Bl,
+ 0xE4FADA8El, 0xF59B87BDl, 0xB49FC019l, 0x937E89A3l, 0x4986ADB5l,
+ 0x658BC778l, 0xD13EF201l, 0x47B268B2l, 0x08EA3CAEl, 0x9FAC631Dl,
+ 0xCDAFF6E4l, 0xB71C49BCl, 0x5754369Al, 0x5D9E0A5Al, 0x49DB005El,
+ 0xD961A6D6l, 0x1BC65CF3l, 0x08640F05l, 0x1BDB1E6El, 0xB1928C0Dl,
+ 0xF960629Dl, 0x2CC85E82l, 0x4F4EC577l, 0x3AB64AE0l, 0xFFC537F6l,
+ 0xA90F6BF2l, 0x5060B8B4l, 0x19E11968l, 0x714CA34Fl, 0xEE3BE15Cl,
+ 0x8CE2D14Bl, 0x469FF67Bl, 0xC1BC96A8l, 0x3858DA9Fl, 0x9B9DB21Fl,
+ 0xFD36B46Fl, 0x5A5479ADl, 0xFA52D080l };
+
+
+static sal_uInt8 cbc_key[16] =
+{
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
+ 0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87
+};
+static sal_uInt8 cbc_iv[8] =
+{
+ 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10
+};
+
+static sal_Char cbc_data[40] = "7654321 Now is the time for ";
+
+static sal_uInt8 ecb_ok[32] =
+{
+ 0x2A, 0xFD, 0x7D, 0xAA, 0x60, 0x62, 0x6B, 0xA3,
+ 0x86, 0x16, 0x46, 0x8C, 0xC2, 0x9C, 0xF6, 0xE1,
+ 0x29, 0x1E, 0x81, 0x7C, 0xC7, 0x40, 0x98, 0x2D,
+ 0x6F, 0x87, 0xAC, 0x5F, 0x17, 0x1A, 0xAB, 0xEA
+};
+static sal_uInt8 cbc_ok[32] =
+{
+ 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
+ 0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
+ 0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
+ 0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC
+};
+static sal_uInt8 cfb_ok[] =
+{
+ 0xE7, 0x32, 0x14, 0xA2, 0x82, 0x21, 0x39, 0xCA,
+ 0xF2, 0x6E, 0xCF, 0x6D, 0x2E, 0xB9, 0xE7, 0x6E,
+ 0x3D, 0xA3, 0xDE, 0x04, 0xD1, 0x51, 0x72, 0x00,
+ 0x51, 0x9D, 0x57, 0xA6, 0xC3
+};
+
+static sal_uInt8 arcfour_key[6][30] =
+{
+ { 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+ { 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+ { 8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
+ { 4, 0xef, 0x01, 0x23, 0x45 },
+ { 8, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef },
+ { 4, 0xef, 0x01, 0x23, 0x45 }
+};
+static sal_uInt8 arcfour_data_len[6] =
+{
+ 8, 8, 8, 20, 28, 10
+};
+static sal_uInt8 arcfour_data[6][30] =
+{
+ { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xff },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff },
+ { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
+ 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
+ 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
+ 0x12, 0x34, 0x56, 0x78, 0xff },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xff }
+};
+static sal_uInt8 arcfour_ok[6][30] =
+{
+ { 0x75, 0xb7, 0x87, 0x80, 0x99, 0xe0, 0xc5, 0x96, 0x00},
+ { 0x74, 0x94, 0xc2, 0xe7, 0x10, 0x4b, 0x08, 0x79, 0x00},
+ { 0xde, 0x18, 0x89, 0x41, 0xa3, 0x37, 0x5d, 0x3a, 0x00},
+ { 0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf,
+ 0xbd, 0x61, 0x5a, 0x11, 0x62, 0xe1, 0xc7, 0xba,
+ 0x36, 0xb6, 0x78, 0x58, 0x00 },
+ { 0x66, 0xa0, 0x94, 0x9f, 0x8a, 0xf7, 0xd6, 0x89,
+ 0x1f, 0x7f, 0x83, 0x2b, 0xa8, 0x33, 0xc0, 0x0c,
+ 0x89, 0x2e, 0xbe, 0x30, 0x14, 0x3c, 0xe2, 0x87,
+ 0x40, 0x01, 0x1e, 0xcf, 0x00 },
+ { 0xd6, 0xa1, 0x41, 0xa7, 0xec, 0x3c, 0x38, 0xdf,
+ 0xbd, 0x61, 0x00}
+};
+
+int SAL_CALL main (int argc, char *argv)
+{
+ rtlCipher cipher;
+
+ /* ECB */
+ cipher = rtl_cipher_create (rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeECB);
+ OSL_ASSERT(cipher != 0);
+ if (cipher != 0)
+ {
+ rtlCipherError result;
+ sal_uInt8 ecb_in[40], ecb_out[40];
+ sal_uInt32 length = strlen(cbc_data) + 1;
+
+ result = rtl_cipher_init (
+ cipher, rtl_Cipher_DirectionBoth,
+ cbc_key, sizeof(cbc_key), NULL, 0);
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ memset (ecb_out, 0, sizeof(ecb_out));
+ result = rtl_cipher_encode (
+ cipher, cbc_data, length, ecb_out, sizeof(ecb_out));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+ OSL_ASSERT(memcmp (ecb_out, ecb_ok, sizeof(ecb_ok)) == 0);
+
+ memset (ecb_in, 0, sizeof(ecb_in));
+ result = rtl_cipher_decode (
+ cipher, ecb_out, length, ecb_in, sizeof(ecb_in));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+ OSL_ASSERT(memcmp (ecb_in, cbc_data, length) == 0);
+
+ rtl_cipher_destroy (cipher);
+ }
+
+ /* CBC */
+ cipher = rtl_cipher_create (rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeCBC);
+ OSL_ASSERT(cipher != 0);
+ if (cipher != 0)
+ {
+ rtlCipherError result;
+ sal_uInt8 cbc_in[40], cbc_out[40];
+ sal_uInt32 length = strlen(cbc_data) + 1;
+
+ result = rtl_cipher_init (
+ cipher, rtl_Cipher_DirectionEncode,
+ cbc_key, sizeof(cbc_key), cbc_iv, sizeof(cbc_iv));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ memset (cbc_out, 0, sizeof(cbc_out));
+ result = rtl_cipher_encode (
+ cipher, cbc_data, length, cbc_out, sizeof(cbc_out));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+ OSL_ASSERT(memcmp (cbc_out, cbc_ok, sizeof(cbc_ok)) == 0);
+
+ result = rtl_cipher_init (
+ cipher, rtl_Cipher_DirectionDecode,
+ cbc_key, sizeof(cbc_key), cbc_iv, sizeof(cbc_iv));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ memset (cbc_in, 0, sizeof(cbc_in));
+ result = rtl_cipher_decode (
+ cipher, cbc_out, length, cbc_in, sizeof(cbc_in));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+ OSL_ASSERT(memcmp (cbc_in, cbc_data, length) == 0);
+
+ rtl_cipher_destroy (cipher);
+ }
+
+ /* CFB */
+ cipher = rtl_cipher_create (rtl_Cipher_AlgorithmBF, rtl_Cipher_ModeStream);
+ OSL_ASSERT(cipher != 0);
+ if (cipher != 0)
+ {
+ rtlCipherError result;
+ sal_uInt8 cfb_in[40], cfb_out[40];
+ sal_uInt32 length = strlen(cbc_data) + 1;
+
+ result = rtl_cipher_init (
+ cipher, rtl_Cipher_DirectionEncode,
+ cbc_key, sizeof(cbc_key), cbc_iv, sizeof(cbc_iv));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ memset (cfb_out, 0, sizeof(cfb_out));
+ result = rtl_cipher_encode (
+ cipher, cbc_data, length, cfb_out, sizeof(cfb_out));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+ OSL_ASSERT(memcmp (cfb_out, cfb_ok, sizeof(cfb_ok)) == 0);
+
+ result = rtl_cipher_init (
+ cipher, rtl_Cipher_DirectionDecode,
+ cbc_key, sizeof(cbc_key), cbc_iv, sizeof(cbc_iv));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ memset (cfb_in, 0, sizeof(cfb_in));
+ result = rtl_cipher_decode (
+ cipher, cfb_out, length, cfb_in, sizeof(cfb_in));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+ OSL_ASSERT(memcmp (cfb_in, cbc_data, length) == 0);
+
+ rtl_cipher_destroy (cipher);
+ }
+
+ /* ARCFOUR */
+ cipher = rtl_cipher_create (rtl_Cipher_AlgorithmARCFOUR, rtl_Cipher_ModeStream);
+ OSL_ASSERT(cipher != 0);
+ if (cipher != 0)
+ {
+ rtlCipherError result;
+ sal_uInt8 arcfour_out[40];
+ sal_Size length;
+ int i, n;
+
+ n = sizeof(arcfour_data_len) / sizeof(arcfour_data_len[0]);
+ for (i = 0; i < n; i++)
+ {
+ length = arcfour_data_len[i];
+
+ result = rtl_cipher_init (
+ cipher, rtl_Cipher_DirectionBoth,
+ &(arcfour_key[i][1]), arcfour_key[i][0], 0, 0);
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ memset (arcfour_out, 0, sizeof(arcfour_out));
+ result = rtl_cipher_encode (
+ cipher, &(arcfour_data[i][0]), length,
+ arcfour_out, sizeof(arcfour_out));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+ OSL_ASSERT(memcmp (arcfour_out, arcfour_ok[i], length) == 0);
+ }
+
+ n = arcfour_data_len[3];
+ for (i = 1; i < n; i++)
+ {
+ length = i;
+
+ result = rtl_cipher_init (
+ cipher, rtl_Cipher_DirectionBoth,
+ &(arcfour_key[3][1]), arcfour_key[3][0], 0, 0);
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ memset (arcfour_out, 0, sizeof(arcfour_out));
+ result = rtl_cipher_encode (
+ cipher, &(arcfour_data[3][0]), length,
+ arcfour_out, sizeof(arcfour_out));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+ OSL_ASSERT(memcmp (arcfour_out, arcfour_ok[3], length) == 0);
+ OSL_ASSERT(arcfour_out[length] == 0);
+ }
+
+ n = arcfour_data_len[3];
+ for (i = 1; i < n; i++)
+ {
+ length = i;
+
+ result = rtl_cipher_init (
+ cipher, rtl_Cipher_DirectionBoth,
+ &(arcfour_key[3][1]), arcfour_key[3][0], 0, 0);
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ memset (arcfour_out, 0, sizeof(arcfour_out));
+ result = rtl_cipher_encode (
+ cipher, &(arcfour_data[3][0]), length,
+ &(arcfour_out[0]), sizeof(arcfour_out));
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ result = rtl_cipher_encode (
+ cipher, &(arcfour_data[3][length]), n - length,
+ &(arcfour_out[length]), sizeof(arcfour_out) - length);
+ OSL_ASSERT(result == rtl_Cipher_E_None);
+
+ OSL_ASSERT(memcmp (arcfour_out, arcfour_ok[3], length) == 0);
+ }
+
+ rtl_cipher_destroy (cipher);
+ }
+
+ /* Done */
+ return 0;
+}
diff --git a/sal/workben/t_digest.c b/sal/workben/t_digest.c
new file mode 100644
index 000000000000..ab6acf11572b
--- /dev/null
+++ b/sal/workben/t_digest.c
@@ -0,0 +1,378 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <rtl/digest.h>
+
+static const char *digest_in_MD[] =
+{
+ "",
+ "a",
+ "abc",
+ "message digest",
+ "abcdefghijklmnopqrstuvwxyz",
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+ "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
+ NULL,
+};
+
+static const char *digest_out_MD2[]=
+{
+ "8350e5a3e24c153df2275c9f80692773",
+ "32ec01ec4a6dac72c0ab96fb34c0b5d1",
+ "da853b0d3f88d99b30283a69e6ded6bb",
+ "ab4f496bfb2a530b219ff33031fe06b0",
+ "4e8ddff3650292ab5a4108c3aa47940b",
+ "da33def2a42df13975352846c30338cd",
+ "d5976f79d83d3a0dc9806c3c66f3efd8",
+};
+
+static const char *digest_out_MD5[]=
+{
+ "d41d8cd98f00b204e9800998ecf8427e",
+ "0cc175b9c0f1b6a831c399e269772661",
+ "900150983cd24fb0d6963f7d28e17f72",
+ "f96b697d7cb7938d525a2f31aaf161d0",
+ "c3fcd3d76192e4007dfb496cca67e13b",
+ "d174ab98d277d9f5a5611c2c9f419d9f",
+ "57edf4a22be3c955ac49da2e2107b67a",
+};
+
+static const char *digest_in_SHA[]=
+{
+ "abc",
+ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+ NULL,
+};
+
+static const char *digest_out_SHA_0[]=
+{
+ "0164b8a914cd2a5e74c4f7ff082c4d97f1edf880",
+ "d2516ee1acfa5baf33dfc1c471e438449ef134c8",
+};
+
+static const char *digest_out_SHA_1[]=
+{
+ "a9993e364706816aba3e25717850c26c9cd0d89d",
+ "84983e441c3bd26ebaae4aa1f95129e5e54670f1",
+};
+
+static const char *digest_bigout_SHA_0=
+ "3232affa48628a26653b5aaa44541fd90d690603";
+
+static const char *digest_bigout_SHA_1=
+ "34aa973cd4c4daa4f61eeb2bdbad27316534016f";
+
+
+static const char digest_key_HMAC_MD5_1[] =
+{
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x00
+};
+static const char digest_key_HMAC_MD5_2[] =
+{
+ /* "Jefe" */
+ 'J', 'e', 'f', 'e',
+ 0x00
+};
+static const unsigned char digest_key_HMAC_MD5_3[] =
+{
+ 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
+ 0x00
+};
+static const char *digest_key_HMAC_MD5[] =
+{
+ (const char*)&digest_key_HMAC_MD5_1,
+ (const char*)&digest_key_HMAC_MD5_2, /* "Jefe", */
+ (const char*)&digest_key_HMAC_MD5_3,
+ NULL
+};
+
+static const unsigned char digest_in_HMAC_MD5_3[] =
+{
+ 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
+ 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
+ 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
+ 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
+ 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
+ 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
+ 0xDD, 0xDD,
+ 0x00
+};
+static const char *digest_in_HMAC_MD5[] =
+{
+ "Hi There",
+ "what do ya want for nothing?",
+ (const char*)&digest_in_HMAC_MD5_3,
+ NULL
+};
+
+static const char *digest_out_HMAC_MD5[] =
+{
+ "9294727a3638bb1c13f48ef8158bfc9d",
+ "750c783e6ab0b503eaa86e310a5db738",
+ "56be34521d144c88dbb8c733f0e8b3f6",
+ NULL
+};
+static const char *digest_out_HMAC_SHA1[] =
+{
+ /* unofficial, i.e. not verified */
+ "675b0b3a1b4ddf4e124872da6c2f632bfed957e9",
+ "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79",
+ "d730594d167e35d5956fd8003d0db3d3f46dc7bb",
+ NULL
+};
+
+
+static char *pt (unsigned char *md, int length)
+{
+ int i;
+ static char buf[80];
+
+ for (i=0; i<length; i++)
+ sprintf(&(buf[i*2]),"%02x",md[i]);
+
+ return(buf);
+}
+
+int SAL_CALL main (int argc, char **argv)
+{
+ const char **P,**R, **Q;
+ char *p;
+ int i=1, err=0;
+
+ unsigned char md[80];
+ unsigned char buffer[1000];
+
+ rtlDigest Digest;
+
+ P=digest_in_MD;
+ R=digest_out_MD2;
+ i = 1;
+ while (*P)
+ {
+ rtl_digest_MD2 (*P, strlen(*P), md, sizeof(md));
+
+ p=pt (md, RTL_DIGEST_LENGTH_MD2);
+ if (strcmp (p, *R))
+ {
+ printf("error calculating MD2 on '%s'\n",*P);
+ printf("got %s instead of %s\n",p,*R);
+ err++;
+ }
+ else
+ printf("test (MD2) %d ok\n",i);
+ i++;
+ R++;
+ P++;
+ }
+
+ P=digest_in_MD;
+ R=digest_out_MD5;
+ i=1;
+ while (*P)
+ {
+ rtl_digest_MD5 (*P, strlen(*P), md, sizeof(md));
+
+ p=pt (md, RTL_DIGEST_LENGTH_MD5);
+ if (strcmp (p, *R))
+ {
+ printf("error calculating MD5 on '%s'\n",*P);
+ printf("got %s instead of %s\n",p,*R);
+ err++;
+ }
+ else
+ printf("test (MD5) %d ok\n",i);
+ i++;
+ R++;
+ P++;
+ }
+
+ P=digest_in_SHA;
+ R=digest_out_SHA_0;
+ i=1;
+ while (*P)
+ {
+ rtl_digest_SHA (*P, strlen(*P), md, sizeof(md));
+
+ p=pt (md, RTL_DIGEST_LENGTH_SHA);
+ if (strcmp (p, *R))
+ {
+ printf("error calculating SHA-0 on '%s'\n",*P);
+ printf("got %s instead of %s\n",p,*R);
+ err++;
+ }
+ else
+ printf("test (SHA-0) %d ok\n",i);
+ i++;
+ R++;
+ P++;
+ }
+
+ memset (buffer, 'a', sizeof(buffer));
+ R = &digest_bigout_SHA_0;
+
+ Digest = rtl_digest_createSHA();
+ for (i=0; i<1000; i++)
+ rtl_digest_updateSHA (Digest, buffer, sizeof(buffer));
+
+ rtl_digest_getSHA (Digest, md, sizeof(md));
+ rtl_digest_destroySHA (Digest);
+
+ p=pt (md, RTL_DIGEST_LENGTH_SHA);
+ if (strcmp (p, *R))
+ {
+ printf("error calculating SHA-0 on '%s'\n",p);
+ printf("got %s instead of %s\n",p,*R);
+ err++;
+ }
+ else
+ printf("test (SHA-0) n ok\n");
+
+ P=digest_in_SHA;
+ R=digest_out_SHA_1;
+ i=1;
+ while (*P)
+ {
+ rtl_digest_SHA1 (*P, strlen(*P), md, sizeof(md));
+
+ p=pt (md, RTL_DIGEST_LENGTH_SHA1);
+ if (strcmp (p, *R))
+ {
+ printf("error calculating SHA-1 on '%s'\n",*P);
+ printf("got %s instead of %s\n",p,*R);
+ err++;
+ }
+ else
+ printf("test (SHA-1) %d ok\n",i);
+ i++;
+ R++;
+ P++;
+ }
+
+ memset (buffer, 'a', sizeof(buffer));
+ R = &digest_bigout_SHA_1;
+
+ Digest = rtl_digest_createSHA1();
+ for (i=0; i<1000; i++)
+ rtl_digest_updateSHA1 (Digest, buffer, sizeof(buffer));
+
+ rtl_digest_getSHA1 (Digest, md, sizeof(md));
+ rtl_digest_destroySHA1 (Digest);
+
+ p=pt (md, RTL_DIGEST_LENGTH_SHA1);
+ if (strcmp (p, *R))
+ {
+ printf("error calculating SHA-1 on '%s'\n",p);
+ printf("got %s instead of %s\n",p,*R);
+ err++;
+ }
+ else
+ printf("test (SHA-1) n ok\n");
+
+
+ P=digest_in_HMAC_MD5;
+ Q=digest_key_HMAC_MD5;
+ R=digest_out_HMAC_MD5;
+ Digest = rtl_digest_createHMAC_MD5();
+ i = 1;
+ while (*P)
+ {
+ rtl_digest_initHMAC_MD5 (Digest, *Q, strlen(*Q));
+ rtl_digest_updateHMAC_MD5 (Digest, *P, strlen(*P));
+ rtl_digest_getHMAC_MD5 (Digest, md, sizeof(md));
+
+ p=pt (md, RTL_DIGEST_LENGTH_HMAC_MD5);
+ if (strcmp (p, *R))
+ {
+ printf("error calculating HMAC-MD5 on '%s'\n",*P);
+ printf("got %s instead of %s\n",p,*R);
+ err++;
+ }
+ else
+ printf("test (HMAC-MD5) %d ok\n",i);
+ i++;
+ R++;
+ P++;
+ Q++;
+ }
+ rtl_digest_destroyHMAC_MD5 (Digest);
+
+
+ P=digest_in_HMAC_MD5;
+ Q=digest_key_HMAC_MD5;
+ R=digest_out_HMAC_SHA1;
+ Digest = rtl_digest_createHMAC_SHA1();
+ i = 1;
+ while (*P)
+ {
+ rtl_digest_initHMAC_SHA1 (Digest, *Q, strlen(*Q));
+ rtl_digest_updateHMAC_SHA1 (Digest, *P, strlen(*P));
+ rtl_digest_getHMAC_SHA1 (Digest, md, sizeof(md));
+
+ p=pt (md, RTL_DIGEST_LENGTH_HMAC_SHA1);
+ if (strcmp (p, *R))
+ {
+ printf("error calculating HMAC-SHA-1 on '%s'\n",*P);
+ printf("got %s instead of %s\n",p,*R);
+ err++;
+ }
+ else
+ printf("test (HMAC-SHA-1) %d ok\n",i);
+ i++;
+ P++;
+ Q++;
+ R++;
+ }
+ rtl_digest_destroyHMAC_SHA1 (Digest);
+
+
+ P=digest_in_HMAC_MD5;
+ Q=digest_key_HMAC_MD5;
+ rtl_digest_PBKDF2 (
+ md, RTL_DIGEST_LENGTH_MD5, /* [out] derived key */
+ Q[1], strlen(Q[1]), /* [in] password */
+ P[1], strlen(P[1]), /* [in] salt */
+ 1000); /* [in] iteration count */
+
+ p=pt (md, RTL_DIGEST_LENGTH_MD5);
+ if (strcmp (p, "6349e09cb6b8c1485cfa9780ee3264df"))
+ {
+ printf("error calculating PBKDF2 on '%s'\n", P[1]);
+ err++;
+ }
+ else
+ printf("test (PBKDF2) %d ok\n", 1);
+
+ return (err);
+}
+
diff --git a/sal/workben/t_ojp_exe.cxx b/sal/workben/t_ojp_exe.cxx
new file mode 100644
index 000000000000..4e8cdcd5962a
--- /dev/null
+++ b/sal/workben/t_ojp_exe.cxx
@@ -0,0 +1,55 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+
+#ifdef WNT
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#else
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+
+int main(int argc, char* argv[])
+{
+ printf("osl process test executable started:\n");
+
+#ifdef WNT
+ Sleep(5000);
+#else
+ sleep(5);
+#endif
+
+ printf("osl process test executable ended:\n");
+
+ return (0);
+}
+
diff --git a/sal/workben/t_osl_getVolInfo.cxx b/sal/workben/t_osl_getVolInfo.cxx
new file mode 100644
index 000000000000..74e7a310f9ae
--- /dev/null
+++ b/sal/workben/t_osl_getVolInfo.cxx
@@ -0,0 +1,132 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <cppunit/simpleheader.hxx>
+#include <osl/file.h>
+#include <rtl/ustring.hxx>
+
+#ifdef WNT
+# define TEST_PATH_1 "c:\\"
+# define TEST_PATH_2 "c:\\mnt\\MSDN"
+# define TEST_PATH_3 "c:\\Program Files"
+# define TEST_PATH_4 "\\\\Tra-1\\mnt\\c"
+# define TEST_PATH_5 "\\\\Tra-1\\mnt"
+# define TEST_PATH_6 "\\\\Tra-1\\mnt\\c\\"
+#else // UNX
+# define TEST_PATH_1 "/net/athene/export/home/tra"
+# define TEST_PATH_2 "/net/athene/export/home/tra/"
+# define TEST_PATH_3 "/"
+# define TEST_PATH_4 "."
+# define TEST_PATH_5 "/net/athene/export/home/tra/projects"
+# define TEST_PATH_6 "/blah"
+#endif
+
+//------------------------------
+//
+//------------------------------
+
+void test_getVolumeInformation(const rtl::OUString& path_url)
+ {
+ oslVolumeInfo vi;
+ memset((void*)&vi, 0, sizeof(vi));
+ vi.uStructSize = sizeof(vi);
+ vi.pDeviceHandle = NULL;
+
+ oslFileError err = osl_getVolumeInformation(
+ path_url.pData,
+ &vi,
+ osl_VolumeInfo_Mask_Attributes |
+ osl_VolumeInfo_Mask_TotalSpace |
+ osl_VolumeInfo_Mask_UsedSpace |
+ osl_VolumeInfo_Mask_FreeSpace |
+ osl_VolumeInfo_Mask_MaxNameLength |
+ osl_VolumeInfo_Mask_MaxPathLength |
+ osl_VolumeInfo_Mask_FileSystemName |
+ osl_VolumeInfo_Mask_DeviceHandle);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_getVolumeInformation failed",
+ err == osl_File_E_None
+ );
+ }
+
+//------------------------------
+//
+//------------------------------
+
+class TestClass_osl_getVolumeInformation : public CppUnit::TestFixture
+{
+public:
+
+ /*-------------------------------------
+ Start a process and join with this
+ process specify a timeout so that
+ osl_joinProcessWithTimeout returns
+ osl_Process_E_TimedOut
+ -------------------------------------*/
+
+ void test_osl_getVolumeInformation()
+ {
+ rtl::OUString path = rtl::OUString::createFromAscii(TEST_PATH_1);
+ rtl::OUString path_url;
+ osl_getFileURLFromSystemPath(path.pData, &path_url.pData);
+ test_getVolumeInformation(path_url);
+
+ path = rtl::OUString::createFromAscii(TEST_PATH_2);
+ osl_getFileURLFromSystemPath(path.pData, &path_url.pData);
+ test_getVolumeInformation(path_url);
+
+ path = rtl::OUString::createFromAscii(TEST_PATH_3);
+ osl_getFileURLFromSystemPath(path.pData, &path_url.pData);
+ test_getVolumeInformation(path_url);
+
+ path = rtl::OUString::createFromAscii(TEST_PATH_4);
+ osl_getFileURLFromSystemPath(path.pData, &path_url.pData);
+ test_getVolumeInformation(path_url);
+
+ path = rtl::OUString::createFromAscii(TEST_PATH_5);
+ osl_getFileURLFromSystemPath(path.pData, &path_url.pData);
+ test_getVolumeInformation(path_url);
+
+ path = rtl::OUString::createFromAscii(TEST_PATH_6);
+ osl_getFileURLFromSystemPath(path.pData, &path_url.pData);
+ test_getVolumeInformation(path_url);
+ }
+
+ CPPUNIT_TEST_SUITE( TestClass_osl_getVolumeInformation );
+ CPPUNIT_TEST( test_osl_getVolumeInformation );
+ CPPUNIT_TEST_SUITE_END( );
+};
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TestClass_osl_getVolumeInformation, "Test osl_getVolumeInformation");
+
+NOADDITIONAL;
+
diff --git a/sal/workben/t_osl_joinProcess.cxx b/sal/workben/t_osl_joinProcess.cxx
new file mode 100644
index 000000000000..1c6f366505f8
--- /dev/null
+++ b/sal/workben/t_osl_joinProcess.cxx
@@ -0,0 +1,228 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <cppunit/simpleheader.hxx>
+#include <osl/process.h>
+#include <rtl/ustring.hxx>
+#include <unistd.h>
+#include <signal.h>
+
+#ifdef WNT
+ const rtl::OUString IMAGE_NAME = rtl::OUString::createFromAscii("ojpx.exe");
+#else
+ const rtl::OUString IMAGE_NAME = rtl::OUString::createFromAscii("ojpx");
+#endif
+
+const rtl::OUString CWD = rtl::OUString::createFromAscii(".");
+
+//------------------------------
+//
+//------------------------------
+
+class Test_osl_Process : public CppUnit::TestFixture
+{
+public:
+
+ /*-------------------------------------
+ Start a process and join with this
+ process specify a timeout so that
+ osl_joinProcessWithTimeout returns
+ osl_Process_E_TimedOut
+ -------------------------------------*/
+
+ void test_osl_joinProcessWithTimeout_timeout_failure()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ IMAGE_NAME.pData,
+ NULL,
+ 0,
+ osl_Process_NORMAL,
+ osl_getCurrentSecurity(),
+ CWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ TimeValue timeout;
+ timeout.Seconds = 1;
+ timeout.Nanosec = 0;
+
+ osl_error = osl_joinProcessWithTimeout(process, &timeout);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcessWithTimeout returned without timeout failure",
+ osl_Process_E_TimedOut == osl_error
+ );
+
+ osl_error = osl_terminateProcess(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_terminateProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ /*-------------------------------------
+ Start a process and join with this
+ process specify a timeout so that
+ osl_joinProcessWithTimeout returns
+ osl_Process_E_None
+ -------------------------------------*/
+
+ void test_osl_joinProcessWithTimeout_without_timeout_failure()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ IMAGE_NAME.pData,
+ NULL,
+ 0,
+ osl_Process_NORMAL,
+ osl_getCurrentSecurity(),
+ CWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ TimeValue timeout;
+ timeout.Seconds = 10;
+ timeout.Nanosec = 0;
+
+ osl_error = osl_joinProcessWithTimeout(process, &timeout);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcessWithTimeout returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ /*-------------------------------------
+ Start a process and join with this
+ process specify an infinite timeout
+ -------------------------------------*/
+
+ void test_osl_joinProcessWithTimeout_infinite()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ IMAGE_NAME.pData,
+ NULL,
+ 0,
+ osl_Process_NORMAL,
+ osl_getCurrentSecurity(),
+ CWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_error = osl_joinProcessWithTimeout(process, NULL);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcessWithTimeout returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ /*-------------------------------------
+ Start a process and join with this
+ process using osl_joinProcess
+ -------------------------------------*/
+
+ void test_osl_joinProcess()
+ {
+ oslProcess process;
+ oslProcessError osl_error = osl_executeProcess(
+ IMAGE_NAME.pData,
+ NULL,
+ 0,
+ osl_Process_NORMAL,
+ osl_getCurrentSecurity(),
+ CWD.pData,
+ NULL,
+ 0,
+ &process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_createProcess failed",
+ osl_error == osl_Process_E_None
+ );
+
+ osl_error = osl_joinProcess(process);
+
+ CPPUNIT_ASSERT_MESSAGE
+ (
+ "osl_joinProcess returned with failure",
+ osl_Process_E_None == osl_error
+ );
+
+ osl_freeProcessHandle(process);
+ }
+
+ CPPUNIT_TEST_SUITE(Test_osl_Process);
+ CPPUNIT_TEST(test_osl_joinProcessWithTimeout_timeout_failure);
+ CPPUNIT_TEST(test_osl_joinProcessWithTimeout_without_timeout_failure);
+ CPPUNIT_TEST(test_osl_joinProcessWithTimeout_infinite);
+ CPPUNIT_TEST(test_osl_joinProcess);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(Test_osl_Process, "Test_osl_Process");
+
+NOADDITIONAL;
+
diff --git a/sal/workben/t_random.c b/sal/workben/t_random.c
new file mode 100644
index 000000000000..dfd303a1c5da
--- /dev/null
+++ b/sal/workben/t_random.c
@@ -0,0 +1,65 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <rtl/random.h>
+
+static char *pt (unsigned char *md, int length)
+{
+ int i;
+ static char buf[80];
+
+ for (i=0; i<length; i++)
+ sprintf(&(buf[i*2]),"%02x",md[i]);
+
+ return(buf);
+}
+
+/*
+ * main.
+ */
+#ifdef WIN32
+int __cdecl main (int argc, char **argv)
+#else
+int main (int argc, char **argv)
+#endif
+{
+ rtlRandomPool pool;
+ pool = rtl_random_createPool();
+ if (pool)
+ {
+ unsigned char buffer[1000];
+
+ rtl_random_getBytes (pool, buffer, 8);
+ printf ("random: %s\n", pt (buffer, 8));
+ }
+ rtl_random_destroyPool (pool);
+ return(0);
+}
+
diff --git a/sal/workben/t_readline.c b/sal/workben/t_readline.c
new file mode 100644
index 000000000000..9cbc7d39cf20
--- /dev/null
+++ b/sal/workben/t_readline.c
@@ -0,0 +1,58 @@
+/*
+ * t_readline.c
+ */
+
+#include "osl/file.h"
+
+#include "osl/diagnose.h"
+#include "rtl/ustring.h"
+#include "rtl/byteseq.h"
+
+#include <stdio.h>
+
+/* main */
+int main (int argc, char ** argv)
+{
+ if (argc > 1)
+ {
+ oslFileError result;
+ oslFileHandle hFile = 0;
+
+ rtl_uString * pSystemPath = 0;
+ rtl_uString * pFileUrl = 0;
+
+ rtl_uString_newFromAscii (&pSystemPath, argv[1]);
+
+ result = osl_getFileURLFromSystemPath (pSystemPath, &pFileUrl);
+ rtl_uString_release (pSystemPath), pSystemPath = 0;
+ if (result != osl_File_E_None)
+ return (result);
+
+ result = osl_openFile (pFileUrl, &hFile, osl_File_OpenFlag_Read);
+ rtl_uString_release (pFileUrl), pFileUrl = 0;
+ if (result == osl_File_E_None)
+ {
+ sal_Sequence * pBuffer = 0;
+ for ( ;; )
+ {
+ sal_Int32 i, n;
+
+ result = osl_readLine (hFile, &pBuffer);
+ if (result != osl_File_E_None)
+ break;
+#if 0
+ if (pBuffer->elements[0] == 0)
+ /* @@@ cannot distinguish empty line from EOF @@@ */
+ break;
+#endif
+ for (i = 0, n = pBuffer->nElements; i < n; i++)
+ printf ("%c", (char)(pBuffer->elements[i]));
+ printf("\n");
+ }
+
+ rtl_byte_sequence_release (pBuffer), pBuffer = 0;
+ (void) osl_closeFile (hFile);
+ }
+ }
+ return 0;
+}
diff --git a/sal/workben/test.cxx b/sal/workben/test.cxx
new file mode 100644
index 000000000000..27469b4df02b
--- /dev/null
+++ b/sal/workben/test.cxx
@@ -0,0 +1,66 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <stdio.h>
+
+#if (defined UNX) || (defined OS2)
+int main( int argc, char * argv[] )
+#else
+int _cdecl main( int argc, char * argv[] )
+#endif
+{
+ void test_int64();
+ test_int64();
+
+ void test_profile(void);
+ test_profile();
+
+ void test_OString();
+ test_OString();
+
+/* void test_OWString(); */
+/* test_OWString(); */
+
+/* void test_OStringBuffer(); */
+/* test_OStringBuffer(); */
+
+/* void test_OWStringBuffer(); */
+/* test_OWStringBuffer(); */
+
+/* void test_OString2OWStringAndViceVersa(); */
+/* test_OString2OWStringAndViceVersa(); */
+
+ void test_uuid();
+ test_uuid();
+
+ return(0);
+}
+
+
diff --git a/sal/workben/testfile.cxx b/sal/workben/testfile.cxx
new file mode 100644
index 000000000000..8e3296a5aab5
--- /dev/null
+++ b/sal/workben/testfile.cxx
@@ -0,0 +1,2786 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#define UNICODE
+
+
+#include <osl/file.hxx>
+#include <osl/process.h>
+#include <osl/time.h>
+#include <rtl/alloc.h>
+#include <rtl/ustring.hxx>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+
+#ifdef UNX
+#include <wchar.h>
+#endif
+
+#ifdef WNT
+#include <windows.h>
+#endif
+
+using namespace osl;
+using namespace rtl;
+
+#define MAXIMPATH 256
+
+rtl::OUString root;
+
+rtl::OUString dir1;
+rtl::OUString dir2;
+rtl::OUString dir_on_server;
+rtl::OUString dir_not_exist;
+rtl::OUString dir_not_exist_on_server;
+rtl::OUString dir_wrong_semantic;
+
+rtl::OUString file1;
+rtl::OUString file2;
+rtl::OUString file3;
+rtl::OUString file_on_server;
+rtl::OUString file_not_exist;
+
+
+
+void print_error(::rtl::OString& str, FileBase::RC rc);
+
+void PressKey()
+{
+ printf("\nPress Return !\n");
+ int i=getchar();
+}
+
+void printFileName(::rtl::OUString& str)
+{
+ rtl::OString aString;
+
+ aString = rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+
+ printf( "%s", aString.getStr() );
+
+ return;
+}
+
+//--------------------------------------------------
+// Initialization
+//--------------------------------------------------
+
+sal_Bool testLineBreak( sal_Char *pCount , sal_uInt64 nLen , sal_uInt32 *cLineBreak )
+{
+ sal_Bool fSuccess=sal_False;
+ *cLineBreak=0;
+
+ if (nLen==0)
+ return fSuccess;
+
+ if ( *pCount==13 )
+ {
+ if (nLen>=1 && *(pCount+1)==10)
+ *cLineBreak=2;
+ else
+ *cLineBreak=1;
+
+ if (nLen>=2 && *(pCount+2)==10)
+ (*cLineBreak)++;
+
+ fSuccess=sal_True;
+ }
+ else if ( *pCount==10 )
+ {
+ *cLineBreak=1;
+ fSuccess=sal_True;
+ }
+
+ return fSuccess;
+}
+
+// Initialization
+
+sal_Bool Initialize( void )
+{
+ DirectoryItem aItem;
+ FileStatus aStatus( FileStatusMask_All );
+ rtl_uString *strExeFileURL=NULL;
+ oslProcessError ProcessError;
+
+ rtl::OUString iniFileURL;
+ File *pFile;
+ sal_Unicode *pExeFileCount;
+
+ FileBase::RC rc;
+
+ sal_uInt64 uBytesRequested;
+ sal_uInt64 uBytesRead;
+ sal_Char *pBuffer;
+ sal_Char *pBegin;
+ sal_Char *pCount;
+
+ rtl::OUString dir[12];
+
+ // Open to the ini-file
+
+ ProcessError=osl_getExecutableFile(&strExeFileURL);
+
+ if ( ProcessError == osl_Process_E_None)
+ {
+ pExeFileCount=rtl_uString_getStr(strExeFileURL)+rtl_uString_getLength(strExeFileURL);
+
+ // Search for the last slash in the Path
+ while (*pExeFileCount!=L'/' && pExeFileCount>rtl_uString_getStr(strExeFileURL))
+ pExeFileCount--;
+
+ // iniFileURL = strExeFileURL without the filename of the exe-File
+ iniFileURL=rtl::OUString( rtl_uString_getStr(strExeFileURL) ,(int) (pExeFileCount-rtl_uString_getStr(strExeFileURL)) );
+
+ // add "/testfile.ini" to iniFileURL
+ iniFileURL+=rtl::OUString::createFromAscii("/testfile.ini");
+
+ // Open the ini-File
+ pFile=new File( iniFileURL );
+ rc=pFile->open( OpenFlag_Read | OpenFlag_Write );
+ if ( rc!=FileBase::E_None )
+ {
+ rtl_uString_release(strExeFileURL);
+ return sal_False;
+ }
+ }
+ else
+ {
+ rtl_uString_release(strExeFileURL);
+ return sal_False;
+ }
+
+ // Get filesize of the ini-File
+
+ rc=DirectoryItem::get( iniFileURL, aItem );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+
+ rc=aItem.getFileStatus( aStatus );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+
+ uBytesRequested=aStatus.getFileSize();
+
+ // read ini-File
+ rc=pFile->setPos( Pos_Absolut, 0 );
+ pBuffer=(sal_Char*) rtl_allocateMemory( (sal_uInt32) (uBytesRequested+1)*sizeof(sal_Char) );
+ rtl_zeroMemory( pBuffer, (sal_uInt32)(uBytesRequested+1)*sizeof(sal_Char) );
+
+ rc=pFile->read( pBuffer , uBytesRequested , uBytesRead );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+
+
+ pBegin=pBuffer;
+ pCount=pBegin;
+
+ for ( int i=0 ; i<12 ; i++ )
+ {
+ sal_uInt32 cLineBrake=0;
+ while ( (pCount-pBuffer < uBytesRead) && *pCount!='=')
+ pCount++;
+
+ pCount++;
+ pBegin=pCount;
+
+ while ( (pCount-pBuffer < uBytesRead) && !testLineBreak(pCount,uBytesRead-(pCount-pBuffer), &cLineBrake))
+ pCount++;
+
+ dir[i]=rtl::OUString(pBegin, pCount-pBegin, RTL_TEXTENCODING_ASCII_US);
+
+ pCount+=cLineBrake;
+ pBegin=pCount;
+ }
+
+ root=rtl::OUString(dir[0]);
+ dir1=rtl::OUString(dir[1]);
+ dir2=rtl::OUString(dir[2]);
+ dir_on_server=rtl::OUString(dir[3]);
+ dir_not_exist=rtl::OUString(dir[4]);
+ dir_not_exist_on_server=rtl::OUString(dir[5]);
+ dir_wrong_semantic=rtl::OUString(dir[6]);
+
+ file1=rtl::OUString(dir[7]);
+ file2=rtl::OUString(dir[8]);
+ file3=rtl::OUString(dir[9]);
+ file_on_server=rtl::OUString(dir[10]);
+ file_not_exist=rtl::OUString(dir[11]);
+
+ // close the ini-file
+ rc=pFile->close();
+
+ rtl_freeMemory( pBuffer );
+
+
+ // Create directories
+ rc=Directory::create( dir1 );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+
+ rc=Directory::create( dir2 );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+
+ rc=Directory::create( dir_on_server );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+
+ pFile=new File( file1 );
+ rc=pFile->open( OpenFlag_Write | OpenFlag_Create );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+ rc=pFile->close();
+ delete pFile;
+
+ pFile=new File( file2 );
+ rc=pFile->open( OpenFlag_Write | OpenFlag_Create );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+ rc=pFile->close();
+ delete pFile;
+
+ pFile=new File( file_on_server );
+ rc=pFile->open( OpenFlag_Write | OpenFlag_Create );
+ if ( rc!=FileBase::E_None )
+ return sal_False;
+ rc=pFile->close();
+ delete pFile;
+
+ return sal_True;
+}
+
+//--------------------------------------------------
+// Shutdown
+//--------------------------------------------------
+
+sal_Bool Shutdown( void )
+{
+ sal_Bool fSuccess=sal_True;
+ FileBase::RC rc;
+ File *pFile;
+
+ // remove created files
+
+ pFile=new File( file1 );
+ rc=pFile->remove( file1 );
+ if ( rc!=FileBase::E_None )
+ fSuccess=sal_False;
+ delete pFile;
+
+ pFile=new File( file2 );
+ rc=pFile->remove( file2 );
+ if ( rc!=FileBase::E_None )
+ fSuccess=sal_False;
+ delete pFile;
+
+ // remove created directories
+
+ rc=Directory::remove( dir1 );
+ if ( rc!=FileBase::E_None )
+ fSuccess=sal_False;
+
+ rc=Directory::remove( dir2 );
+ if ( rc!=FileBase::E_None )
+ fSuccess=sal_False;
+
+ // remove created file on the server
+
+ pFile=new File( file_on_server );
+ rc=pFile->remove( file_on_server );
+ if ( rc!=FileBase::E_None )
+ fSuccess=sal_False;
+ delete pFile;
+
+ // remove created directory on the server
+
+ rc=Directory::remove( dir_on_server );
+ if ( rc!=FileBase::E_None )
+ fSuccess=sal_False;
+
+ return fSuccess;
+}
+
+//--------------------------------------------------
+// helper functions
+//--------------------------------------------------
+
+// Show FileType
+void showFileType( FileStatus::Type aType )
+{
+ if ( aType==FileStatus::Directory )
+ printf( "FileType: Directory \n" );
+ else if ( aType==FileStatus::Volume )
+ printf( "FileType: Volume \n" );
+ else if ( aType==FileStatus::Regular )
+ printf( "FileType: Regular \n" );
+ else if ( aType==FileStatus::Unknown )
+ printf( "FileType: Unknown \n" );
+
+}
+
+// Show Attributes
+void showAttributes( sal_uInt64 uAttributes )
+{
+ if ( uAttributes==0 )
+ printf( "No Attributes \n" );
+ if ( uAttributes & Attribute_ReadOnly )
+ printf( "Attribute: ReadOnly \n" );
+ if ( uAttributes & Attribute_Hidden )
+ printf( "Attribute: Hidden \n" );
+ if ( uAttributes & Attribute_Executable )
+ printf( "Attribute: Executable \n");
+ if ( uAttributes & Attribute_GrpWrite )
+ printf( "Attribute: GrpWrite \n");
+ if ( uAttributes & Attribute_GrpRead )
+ printf( "Attribute: GrpRead \n" );
+ if ( uAttributes & Attribute_GrpExe )
+ printf( "Attribute: GrpExe \n" );
+ if ( uAttributes & Attribute_OwnWrite )
+ printf( "Attribute: OwnWrite \n");
+ if ( uAttributes & Attribute_OwnRead )
+ printf( "Attribute: OwnRead \n" );
+ if ( uAttributes & Attribute_OwnExe )
+ printf( "Attribute: OwnExe \n" );
+ if ( uAttributes & Attribute_OthWrite )
+ printf( "Attribute: OthWrite \n" );
+ if ( uAttributes & Attribute_OthRead )
+ printf( "Attribute: OthRead \n");
+ if ( uAttributes & Attribute_OthExe )
+ printf( "Attribute: OthExe \n" );
+
+ return;
+}
+
+// Show Time
+void showTime( TimeValue aTime )
+{
+ TimeValue aLocalTimeVal, aSystemTimeVal , aSysTimeVal;
+ oslDateTime aDateTime, aSystemTime;
+
+ if ( osl_getLocalTimeFromSystemTime( &aTime, &aLocalTimeVal ) )
+ {
+ if ( osl_getDateTimeFromTimeValue( &aLocalTimeVal, &aDateTime ) )
+ {
+ printf("\t%02i.%02i.%4i , %02i.%02i.%02i Uhr\n", aDateTime.Day, aDateTime.Month, aDateTime.Year, aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds);
+ }
+ else
+ printf("Error !\n");
+ }
+
+ if ( osl_getDateTimeFromTimeValue( &aTime, &aSystemTime ) )
+ {
+ printf("SystemTime: \t\t%02i.%02i.%4i , %02i.%02i.%02i Uhr\n", aSystemTime.Day, aSystemTime.Month, aSystemTime.Year, aSystemTime.Hours, aSystemTime.Minutes, aSystemTime.Seconds);
+ }
+ else
+ printf("Error !\n");
+
+ //Verify
+
+ if ( osl_getTimeValueFromDateTime( &aSystemTime, &aSystemTimeVal ) )
+ {
+ if ( ( aSystemTimeVal.Seconds == aTime.Seconds ) && ( aSystemTimeVal.Nanosec == aTime.Nanosec ))
+ printf ("Verify : TimeValue : ok! \n");
+ else
+ {
+ printf ("Verify : TimeValue : Error! \n");
+ printf ("aTime : %u \n", aTime.Seconds);
+ printf ("aSystemTimeVal : %u \n", aSystemTimeVal.Seconds);
+ }
+ }
+ else
+ printf ("Verify : TimeValue : Error! \n");
+
+
+ if ( osl_getSystemTimeFromLocalTime( &aLocalTimeVal , &aSysTimeVal ) )
+ {
+ if ( ( aSysTimeVal.Seconds == aTime.Seconds ) && ( aSysTimeVal.Nanosec == aTime.Nanosec ))
+ printf ("Verify : SystemTime : ok! \n");
+ else
+ {
+ printf ("Verify : SystemTime : Error! \n");
+ printf ("aTime : %u\n", aTime.Seconds);
+ printf ("aSystemTimeVal : %u\n", aSysTimeVal.Seconds);
+ }
+ }
+ else
+ printf ("Verify : SystemTime : Error! \n");
+
+ return;
+}
+
+TimeValue getSystemTime()
+{
+ TimeValue aTime;
+ time_t ltime;
+
+ time( &ltime );
+
+ aTime.Seconds = ltime;
+ aTime.Nanosec = 0;
+
+ return aTime;
+}
+
+
+//--------------------------------------------------
+// DirectoryOpenAndCloseTest
+//--------------------------------------------------
+
+void DirectoryOpenAndCloseTest( void )
+{
+ FileBase::RC rc;
+ int i=0;
+ Directory *pDir;
+
+ printf( "--------------------------------------------\n");
+ printf( "Directory-Open-And-Close-Test\n");
+ printf( "--------------------------------------------\n\n");
+
+ //--------------------------------------------------
+ // open an existing directory
+ //--------------------------------------------------
+
+ pDir=new Directory( dir1 );
+ printf( "Open an existing directory: ");
+ printFileName( dir1 );
+ printf( "\n" );
+
+ rc= pDir->open();
+ print_error( rtl::OString( "Open Directory" ), rc );
+
+ if ( pDir->isOpen() )
+ {
+ print_error( rtl::OString( "Directory is Open" ), rc );
+ }
+
+ // Close Directory
+ rc=pDir->close();
+ print_error( rtl::OString( "Close Directory" ), rc );
+
+ delete pDir;
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // open a not existing directory
+ //--------------------------------------------------
+
+ pDir=new Directory( dir_not_exist );
+
+ printf( "Open a not existing directory: ");
+ printFileName( dir_not_exist );
+ printf( "\n" );
+
+ rc= pDir->open();
+
+ print_error( rtl::OString( "Open Directory" ), rc );
+
+ delete pDir;
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // open a directory with a wrong semantic
+ //--------------------------------------------------
+ pDir=new Directory( dir_wrong_semantic );
+
+ printf( "Open a directory with a wrong semantic: ");
+ printFileName( dir_wrong_semantic );
+ printf( "\n" );
+
+ rc= pDir->open();
+ print_error( rtl::OString( "Open Directory" ), rc );
+
+ delete pDir;
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // open an existing directory on a server
+ //--------------------------------------------------
+
+ pDir=new Directory( dir_on_server );
+
+ printf( "Open an existing directory on a server: ");
+ printFileName( dir_on_server );
+ printf( "\n" );
+
+ rc= pDir->open();
+ print_error( rtl::OString( "Open Directory" ), rc );
+
+ // Close Directory
+ rc=pDir->close();
+ print_error( rtl::OString( "Close Directory" ), rc );
+
+ delete pDir;
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // open a not existing directory on a server
+ //--------------------------------------------------
+
+ pDir=new Directory( dir_not_exist_on_server );
+
+ printf( "Open a not existing directory on a server: ");
+ printFileName( dir_not_exist_on_server );
+ printf( "\n" );
+
+ rc= pDir->open();
+ print_error( rtl::OString( "Open Directory" ), rc );
+
+ delete pDir;
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // Close a not existing directory
+ //--------------------------------------------------
+
+ pDir=new Directory( dir_not_exist );
+ printf( "Close a not existing directory: ");
+ printFileName( dir_not_exist );
+ printf( "\n" );
+
+ rc=pDir->close();
+ print_error( rtl::OString( "Close Directory" ), rc );
+
+ PressKey();
+ return;
+
+}
+
+//--------------------------------------------------
+// DirectoryCreateAndRemoveTest
+//--------------------------------------------------
+
+void DirectoryCreateAndRemoveTest( void )
+{
+ FileBase::RC rc,rc1;
+ int i=0;
+ Directory *pDir;
+
+ printf( "--------------------------------------------\n" );
+ printf( "Directory-Create-And-Remove-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ //--------------------------------------------------
+ // Create directory
+ //--------------------------------------------------
+ printf( "Create a not existing directory: ");
+ printFileName( dir_not_exist );
+ printf( "\n" );
+
+ rc=Directory::create( dir_not_exist) ;
+ print_error( rtl::OString( "Create Directory" ), rc );
+
+ // Verify
+ pDir=new Directory( dir_not_exist );
+
+ rc= pDir->open();
+ print_error( rtl::OString( "Verify" ), rc );
+ pDir->close();
+ delete pDir;
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // Create a directory on a server
+ //--------------------------------------------------
+
+ printf( "Create a not existing directory on a server: ");
+ printFileName( dir_not_exist_on_server );
+ printf( "\n" );
+
+ rc=Directory::create( dir_not_exist_on_server );
+ print_error( rtl::OString( "Create Directory" ), rc );
+
+ // Verify
+ pDir=new Directory( dir_not_exist_on_server );
+ rc= pDir->open();
+ print_error( rtl::OString( "Verify" ), rc );
+ pDir->close();
+ delete pDir;
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // Remove Directories
+ //--------------------------------------------------
+
+ printf( "Remove the created directories: \n" );
+
+ rc=Directory::remove( dir_not_exist );
+
+ rc1=Directory::remove( dir_not_exist_on_server );
+
+ if ( rc==FileBase::E_None && rc1==FileBase::E_None )
+ print_error( rtl::OString( "Remove Directories" ), FileBase::E_None );
+ else if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Remove local Directory" ),rc );
+ else
+ print_error( rtl::OString( "Remove Directory on a server" ),rc1 );
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // Remove a not existing directory
+ //--------------------------------------------------
+
+ printf( "Remove a not existing directory: ");
+ printFileName( dir_not_exist );
+ printf( "\n" );
+
+ rc=Directory::remove( dir_not_exist );
+ print_error( rtl::OString( "Remove" ),rc );
+
+ PressKey();
+ return;
+}
+
+//--------------------------------------------------
+// FileOpenAndCloseTest
+//--------------------------------------------------
+
+static void FileOpenAndCloseTest( void )
+{
+ FileBase::RC rc;
+ int i=0;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Open-And-Close-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ File *pFile;
+
+ pFile=new File( file1 );
+
+ printf( "Open an existing file: ");
+ printFileName( file1 );
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // open an existing file (Read)
+ //--------------------------------------------------
+
+ rc=pFile->open( OpenFlag_Read );
+ print_error( rtl::OString( "Open File (Read)" ), rc );
+
+ //--------------------------------------------------
+ // close the file
+ //--------------------------------------------------
+
+ rc=pFile->close();
+ print_error( rtl::OString( "Close File" ), rc );
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // open an existing file (Write)
+ //--------------------------------------------------
+
+ rc=pFile->open( OpenFlag_Write );
+ print_error( rtl::OString( "Open File (Write)" ), rc );
+
+ //--------------------------------------------------
+ // close the file
+ //--------------------------------------------------
+
+ rc=pFile->close();
+ print_error( rtl::OString( "Close File" ), rc );
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // close the file a second time
+ //--------------------------------------------------
+
+ rc=pFile->close();
+ print_error( rtl::OString( "Close the file a second time" ), rc );
+
+ delete pFile;
+ PressKey();
+}
+
+//--------------------------------------------------
+// FileCreateAndRemoveTest
+//--------------------------------------------------
+
+void FileCreateAndRemoveTest()
+{
+ FileBase::RC rc;
+ File *pFile;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Create-And-Remove-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ pFile=new File( file_not_exist );
+
+ printf( "Create File: ");
+ printFileName( file_not_exist );
+ printf( "\n" );
+
+ //----------------------------------------------------
+ // open (create) a not existing file (Read and write)
+ //----------------------------------------------------
+
+ rc = pFile->open( OpenFlag_Read | OpenFlag_Write | osl_File_OpenFlag_Create );
+
+ print_error( rtl::OString( "Create and Open File (Read & Write)" ), rc );
+
+ //----------------------------------------------------
+ // close the file
+ //----------------------------------------------------
+
+ rc=pFile->close();
+ print_error( rtl::OString( "Close File" ), rc );
+
+ //----------------------------------------------------
+ // remove the file
+ //----------------------------------------------------
+
+ rc=pFile->remove( file_not_exist );
+ print_error( rtl::OString(" Remove File" ), rc );
+
+ printf( "\n" );
+
+ //----------------------------------------------------
+ // remove the same file a second time
+ //----------------------------------------------------
+ rc=pFile->remove( file_not_exist );
+ print_error( rtl::OString( "Remove a not existing File" ), rc );
+
+ //----------------------------------------------------
+ // remove an open file
+ //----------------------------------------------------
+
+ pFile->open( OpenFlag_Read | OpenFlag_Write | osl_File_OpenFlag_Create );
+
+ rc=pFile->remove( file_not_exist );
+ print_error( rtl::OString( "Remove an open File" ), rc );
+
+ pFile->close();
+ pFile->remove( file_not_exist );
+
+ PressKey();
+
+ return;
+}
+
+//--------------------------------------------------
+// FileWriteAndReadTest
+//--------------------------------------------------
+
+void FileWriteAndReadTest( void )
+{
+ FileBase::RC rc;
+
+ sal_uInt64 uWritten;
+ sal_uInt64 uRead;
+ sal_Char *pWriteBuffer="Hier kommt der Osterhase !";
+ sal_uInt64 nLen=strlen( pWriteBuffer );
+ sal_Char *pReadBuffer;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Write-And-Read-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ File *pFile;
+
+ pFile=new File( file_not_exist );
+
+ printf( "Create File: ");
+ printFileName( file_not_exist );
+ printf("\n");
+
+ //----------------------------------------------------
+ // open (create) a not existing file (Read and write)
+ //----------------------------------------------------
+
+ rc = pFile->open( OpenFlag_Read | OpenFlag_Write | osl_File_OpenFlag_Create );
+
+ print_error( rtl::OString( "Create and Open File (Read & Write)" ), rc );
+
+ printf( "\n" );
+
+ //----------------------------------------------------
+ // write a string to the file
+ //----------------------------------------------------
+ rc=pFile->write( pWriteBuffer , nLen , uWritten );
+ print_error( rtl::OString( "Write File" ), rc );
+
+ if(uWritten==nLen)
+ printf( "Verify: OK! \n" );
+ else
+ printf( "Verify: Error\n" );
+
+ printf( "\n" );
+
+ //----------------------------------------------------
+ // move the filepointer to the beginning
+ //----------------------------------------------------
+
+ rc=pFile->setPos( Pos_Absolut , 0 );
+ print_error( rtl::OString( "Set FilePointer to the beginning of the file" ), rc );
+
+ printf( "\n" );
+
+ //----------------------------------------------------
+ // read the string
+ //----------------------------------------------------
+
+ pReadBuffer=(sal_Char*) rtl_allocateMemory( (sal_uInt32)(nLen+1)*sizeof(sal_Char) );
+ rtl_zeroMemory( pReadBuffer, (sal_uInt32)(nLen+1)*sizeof(sal_Char) );
+ rc=pFile->read( pReadBuffer , nLen,uRead );
+ print_error( rtl::OString( "Read File" ), rc );
+
+ if (strcmp(pWriteBuffer, pReadBuffer)==0)
+ {
+ printf( "Verify: OK !\n" );
+ printf( "Text: %s\n",pReadBuffer );
+ }
+ else
+ printf( "Verify: Error\n" );
+
+ rtl_freeMemory( pReadBuffer );
+
+ printf( "\n" );
+
+ // close the file
+ rc=pFile->close();
+ print_error( rtl::OString( "Close File" ), rc );
+
+ // remove the file
+ rc=pFile->remove( file_not_exist );
+ print_error( rtl::OString( "Remove File" ), rc );
+
+ PressKey();
+
+ return;
+
+}
+
+//--------------------------------------------------
+// FileCopyMoveTest
+//--------------------------------------------------
+
+void FileCopyAndMoveTest( void )
+{
+ FileBase::RC rc;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Copy-Move-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+
+ File *pFile;
+ rtl::OUString destPath(dir2);
+
+ //--------------------------------------------------
+ // FileCopyTest
+ //--------------------------------------------------
+
+ destPath+=rtl::OUString::createFromAscii("/");
+ destPath+=file3;
+
+ printf( "Copy the file ");
+ printFileName( file1 );
+ printf( " to ");
+ printFileName( destPath );
+ printf( "\n" );
+
+
+ rc=File::copy( file1 , destPath );
+ print_error( rtl::OString( "FileCopy" ), rc );
+
+ pFile=new File( destPath );
+
+ rc=pFile->open( OpenFlag_Read );
+ if ( rc == FileBase::E_None)
+ {
+ printf( "Verify: OK!\n" );
+ pFile->close();
+ File::remove( destPath );
+ }
+ else
+ printf( "Verify: Error!\n" );
+
+ delete pFile;
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // Copy a file to a not existing directory
+ //--------------------------------------------------
+
+ destPath=rtl::OUString( dir_not_exist );
+ destPath+=rtl::OUString::createFromAscii("/");
+ destPath+=file3;
+
+ printf( "Copy a file to a not existing directory \n");
+ printf( "Copy the file %s to %s\n", file1.getStr(), destPath.getStr() );
+
+ rc=File::copy( file1, destPath );
+ print_error( rtl::OString( "FileCopy" ), rc );
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // Copy a directory
+ //--------------------------------------------------
+
+ printf( "Copy the directory: ");
+ printFileName( dir1 );
+ printf( " to ");
+ printFileName( dir2 );
+ printf( "\n" );
+
+ rc=File::copy( dir1 , dir2 );
+ print_error( rtl::OString( "FileCopy" ), rc );
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // FileMoveTest
+ //--------------------------------------------------
+
+ destPath=rtl::OUString( dir2 );
+ destPath+=rtl::OUString::createFromAscii("/");
+ destPath+=file3;
+
+ printf( "Move the file ");
+ printFileName( file1 );
+ printf( " to ");
+ printFileName( destPath );
+ printf( "\n" );
+
+ rc=File::move( file1, destPath );
+ print_error( rtl::OString( "FileMove" ), rc );
+
+ pFile=new File( destPath );
+
+ rc=pFile->open( OpenFlag_Read );
+ if ( rc==FileBase::E_None )
+ {
+ pFile->close();
+
+ delete pFile;
+ pFile=new File( file1 );
+
+ rc=pFile->open( OpenFlag_Read );
+
+ if ( rc!=FileBase::E_None )
+ {
+ printf( "Verify: OK!\n" );
+ File::move( destPath, file1 );
+ }
+ else
+ {
+ printf( "Verify: Error!\n" );
+ pFile->close();
+ File::remove( destPath );
+ }
+ }
+ else
+ printf( "Verify: Error!\n" );
+
+ delete pFile;
+
+ printf( "\n" );
+
+
+ //--------------------------------------------------
+ // Move a file to a not existing directory
+ //--------------------------------------------------
+
+ destPath=rtl::OUString( dir_not_exist );
+ destPath+=rtl::OUString::createFromAscii("/");
+ destPath+=file3;
+
+ printf( "Move a file to a not existing directory: \n");
+ printf( "Move the file ");
+ printFileName( file1 );
+ printf( " to ");
+ printFileName( destPath );
+ printf( "\n" );
+
+ rc=File::move( file1 , destPath );
+ print_error( rtl::OString( "FileMove" ), rc );
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // Move a directory
+ //--------------------------------------------------
+
+ printf( "Move a directory: \n");
+
+ printf( "Move the directory ");
+ printFileName( dir1 );
+ printf( " to ");
+ printFileName( dir_not_exist );
+ printf( "\n" );
+
+
+ rc=File::move( dir1 , dir_not_exist);
+ print_error( rtl::OString( "FileMove" ), rc );
+
+ if ( rc == FileBase::E_None )
+ File::move( dir_not_exist , dir1);
+
+ printf( "\n" );
+
+
+ PressKey();
+ return;
+}
+
+//----------------------------------------------------
+// FileSizeTest
+//----------------------------------------------------
+
+void FileSizeTest( void )
+{
+ FileBase::RC rc;
+ sal_uInt64 filesize;
+ DirectoryItem aItem;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Size-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+
+ File aFile( file_not_exist );
+
+ printf( "Create File: ");
+ printFileName( file_not_exist );
+ printf( "\n\n");
+
+ rc = aFile.open( OpenFlag_Read | OpenFlag_Write | osl_File_OpenFlag_Create );
+ print_error( rtl::OString( "Create and Open File (Read & Write)" ), rc );
+ printf( "\n" );
+
+ if ( rc == FileBase::E_None )
+ {
+ //----------------------------------------------------
+ // Set Filesize to 5000
+ //----------------------------------------------------
+
+ printf( "Set FileSize to 5000\n" );
+ rc=aFile.setSize( 5000 );
+ print_error( rtl::OString( "Set FileSize" ), rc );
+
+ printf( "\n" );
+ printf( "Verify:\n" );
+
+ //----------------------------------------------------
+ // Check whether Filesize is set to 5000
+ //----------------------------------------------------
+
+ rc=DirectoryItem::get( file_not_exist, aItem );
+ print_error( rtl::OString( "Get DirectoryItem" ), rc );
+
+ if ( rc == FileBase::E_None )
+ {
+ FileStatus rStatus( FileStatusMask_FileSize );
+ rc=aItem.getFileStatus( rStatus );
+ print_error( rtl::OString( "Get FileStatus" ), rc );
+
+ if ( rc == FileBase::E_None )
+ {
+ filesize=rStatus.getFileSize();
+
+ if ( filesize == 5000 )
+ printf( "\nOK : FileSize: %i\n", filesize );
+ else
+ printf( "\nError : FileSize: %i\n", filesize );
+ }
+ }
+
+ printf( "\n" );
+
+ //----------------------------------------------------
+ // Set Filesize to -1
+ //----------------------------------------------------
+
+ printf( "Set FileSize to -1\n" );
+ rc=aFile.setSize( -1 );
+ print_error( rtl::OString( "Set FileSize" ), rc );
+
+ printf( "\n" );
+
+ // close the file
+ rc=aFile.close();
+ print_error( rtl::OString( "Close File" ), rc );
+
+ // remove the file
+ rc=File::remove( file_not_exist );
+ print_error( rtl::OString( "Remove File" ), rc );
+ }
+
+ PressKey();
+
+ return;
+}
+
+
+//----------------------------------------------------
+// FilePointerTest
+//----------------------------------------------------
+
+void FilePointerTest( void )
+{
+ FileBase::RC rc;
+ sal_uInt64 filepointer;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Pointer-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+
+ File rFile( file_not_exist );
+
+ printf( "Create File: ");
+ printFileName( file_not_exist );
+ printf( "\n\n");
+
+ rc = rFile.open( OpenFlag_Read | OpenFlag_Write | osl_File_OpenFlag_Create );
+ print_error( rtl::OString( "Create and Open File (Read & Write) "), rc );
+ printf( "\n" );
+
+ if ( rc==FileBase::E_None )
+ {
+
+ //----------------------------------------------------
+ // get the position of the filepointer
+ //----------------------------------------------------
+
+ rc =rFile.getPos( filepointer );
+ print_error( rtl::OString( "GetPos" ), rc );
+ printf( "Position of the FilePointer: %i\n", filepointer );
+
+ printf( "\n" );
+
+ //----------------------------------------------------
+ // set the filepointer at the end of a file
+ //----------------------------------------------------
+
+ printf( "Set FileSize to 5000\n" );
+ rFile.setSize( 5000 );
+
+ printf( "Set the FilePointer at the end of the file (5000)\n" );
+ rc=rFile.setPos( Pos_End,0 );
+ print_error( rtl::OString( "SetPos" ), rc );
+
+ rc=rFile.getPos( filepointer );
+
+ if ( filepointer==5000 )
+ {
+ print_error( rtl::OString( "GetPos" ), rc );
+ printf( "\nVerify: OK !\n" );
+ printf( "Filepointer-Position: %llu\n",filepointer );
+ }
+ else
+ {
+ print_error( rtl::OString( "GetPos" ), rc );
+ printf( "\nFilePointer-Test: Error\n" );
+ printf( "Filepointer-Position: %i != 5000 \n",filepointer );
+ }
+
+ printf( "\n" );
+
+ // close the file
+ rc=rFile.close();
+ print_error( rtl::OString( "Close File" ), rc );
+
+ // remove the file
+ rc=File::remove( file_not_exist );
+ print_error( rtl::OString( "Remove File" ), rc );
+ }
+
+ PressKey();
+
+ return;
+}
+
+//--------------------------------------------------
+// FileAttributesTest
+//--------------------------------------------------
+
+void verifyFileAttributes( void )
+{
+ FileBase::RC rc;
+ DirectoryItem aItem;
+ FileStatus rStatus( FileStatusMask_Attributes );
+
+ printf( "\nVerify:\n" );
+
+ rc=DirectoryItem::get( file1, aItem );
+
+ if ( rc==FileBase::E_None )
+ {
+ rc=aItem.getFileStatus( rStatus );
+
+ if ( rc==FileBase::E_None )
+ {
+ sal_uInt64 uAttributes=rStatus.getAttributes();
+ showAttributes(uAttributes);
+ printf( "\n" );
+ }
+ else
+ print_error( rtl::OString( "Get FileStatus" ), rc );
+ }
+ else
+ print_error( rtl::OString( "Get DirectoryItem" ), rc );
+
+ return;
+}
+
+#ifdef UNX
+void FileAttributesTest( void )
+{
+ FileBase::RC rc;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Attributes-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ printf( "File: ");
+ printFileName( file1 );
+ printf( "\n\n" );
+
+
+ rc=File::setAttributes( file1, Attribute_GrpWrite );
+ print_error( rtl::OString( "Set Attribute: GrpWrite" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ rc=File::setAttributes( file1, Attribute_GrpRead );
+ print_error( rtl::OString( "Set Attribute: GrpRead" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ rc=File::setAttributes( file1, Attribute_GrpExe );
+ print_error( rtl::OString( "Set Attribute: GrpExe" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ rc=File::setAttributes( file1, Attribute_OwnWrite );
+ print_error( rtl::OString( "Set Attribute: OwnWrite" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ rc=File::setAttributes( file1, Attribute_OwnRead );
+ print_error( rtl::OString( "Set Attribute: OwnRead" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ rc=File::setAttributes( file1, Attribute_OwnExe );
+ print_error( rtl::OString( "Set Attribute: OwnExe" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ rc=File::setAttributes( file1, Attribute_OthWrite );
+ print_error( rtl::OString( "Set Attribute: OthWrite" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ rc=File::setAttributes( file1, Attribute_OthRead );
+ print_error( rtl::OString( "Set Attribute: OthRead" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ rc=File::setAttributes( file1, Attribute_OthExe );
+ print_error( rtl::OString( "Set Attribute: OthExe" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ if ( rc!=FileBase::E_None )
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+
+ rc=File::setAttributes( file1, Attribute_GrpWrite | Attribute_GrpRead | Attribute_GrpExe | Attribute_OwnWrite | Attribute_OwnRead | Attribute_OwnExe | Attribute_OthWrite | Attribute_OthRead | Attribute_OthExe );
+ print_error( rtl::OString( "Set all Attributes" ), rc );
+
+ verifyFileAttributes();
+
+ PressKey();
+
+ return;
+}
+#endif
+
+#ifdef WNT
+void FileAttributesTest( void )
+{
+ FileBase::RC rc;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Attributes-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ printf( "File: ");
+ printFileName( file1 );
+ printf( "\n\n" );
+
+
+ rc=File::setAttributes( file1, Attribute_ReadOnly );
+ print_error( rtl::OString( "Set Attribute: ReadOnly" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, Attribute_Hidden );
+ print_error( rtl::OString( "Set Attribute: Hidden" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ print_error( rtl::OString( "Reset Attributes" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, Attribute_Hidden | Attribute_ReadOnly );
+ print_error( rtl::OString( "Set Attribute: Hidden & ReadOnly" ), rc );
+
+ verifyFileAttributes();
+
+ rc=File::setAttributes( file1, 0 );
+ print_error( rtl::OString( "Reset Attributes") , rc );
+
+ verifyFileAttributes();
+
+ PressKey();
+
+ return;
+}
+#endif
+
+//--------------------------------------------------
+// FileTimeTest
+//--------------------------------------------------
+
+void FileTimeTest( void )
+{
+ FileBase::RC rc;
+
+ DirectoryItem aItem;
+
+ struct tm sSysCreationTime = { 0, 20, 12, 4, 9, 100 };
+ struct tm sSysAccessTime = { 0, 40, 1, 6, 5, 98 };
+ struct tm sSysModifyTime = { 0, 1, 24, 13, 11, 95 };
+
+ time_t aSysCreationTime = mktime( &sSysCreationTime );
+ time_t aSysAccessTime = mktime( &sSysAccessTime );
+ time_t aSysModifyTime = mktime( &sSysModifyTime );
+
+ TimeValue aCreationTime = { aSysCreationTime, 0};
+ TimeValue aAccessTime = { aSysAccessTime, 0};
+ TimeValue aModifyTime = { aSysModifyTime, 0};
+
+ TimeValue aCreationTimeRead;
+ TimeValue aAccessTimeRead;
+ TimeValue aModifyTimeRead;
+
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-Time-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ printf( "File: ");
+ printFileName( file1 );
+ printf( "\n\n" );
+
+ printf( "CreationTime \t : ");
+ showTime( aCreationTime );
+
+ printf( "\nAccessTime \t : ");
+ showTime( aAccessTime );
+
+ printf( "\nModifyTime \t : ");
+ showTime( aModifyTime );
+
+ //--------------------------------------------------
+ // setTime
+ //--------------------------------------------------
+
+ printf( "\n" );
+ rc=File::setTime( file1 , aCreationTime , aAccessTime , aModifyTime );
+ print_error( rtl::OString( "SetTime" ), rc );
+
+ //--------------------------------------------------
+ // Verify
+ //--------------------------------------------------
+
+ FileStatus rStatus( FileStatusMask_CreationTime | FileStatusMask_AccessTime | FileStatusMask_ModifyTime);
+
+ printf( "\nVerify:\n" );
+
+ rc=DirectoryItem::get( file1, aItem );
+ print_error( rtl::OString( "Get DirectoryItem" ), rc );
+
+ if ( rc==FileBase::E_None )
+ {
+ rc=aItem.getFileStatus( rStatus );
+ print_error( rtl::OString( "Get FileStatus" ), rc );
+ printf( "\n" );
+
+ if ( rc==FileBase::E_None )
+ {
+ //--------------------------------------------------
+ // GetCreationTime
+ //--------------------------------------------------
+
+ aCreationTimeRead=rStatus.getCreationTime();
+#ifdef WNT
+ if ( aCreationTime.Seconds == aCreationTimeRead.Seconds && aCreationTime.Nanosec == aCreationTimeRead.Nanosec )
+ printf( "GetCreationTime: ok : " );
+ else
+ printf( "GetCreationTime: Error : " );
+
+ showTime( aCreationTimeRead );
+ printf( "\n" );
+#endif
+ //--------------------------------------------------
+ // GetAccessTime
+ //--------------------------------------------------
+
+ aAccessTimeRead=rStatus.getAccessTime();
+
+ if ( aAccessTime.Seconds == aAccessTimeRead.Seconds && aAccessTime.Nanosec == aAccessTimeRead.Nanosec )
+ printf( "GetAccessTime: ok : " );
+ else
+ printf( "GetAccessTime: Error : " );
+
+ showTime( aAccessTimeRead );
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // GetModifyTime
+ //--------------------------------------------------
+
+ aModifyTimeRead=rStatus.getModifyTime();
+
+ if ( aModifyTime.Seconds == aModifyTimeRead.Seconds && aModifyTime.Nanosec == aModifyTimeRead.Nanosec )
+ printf( "GetModifyTime: ok : " );
+ else
+ printf( "GetModifyTime: Error : " );
+
+ showTime( aModifyTimeRead );
+ printf( "\n" );
+ }
+ }
+
+ PressKey();
+ return;
+}
+
+
+//--------------------------------------------------
+// DirectoryItemTest
+//--------------------------------------------------
+
+void DirectoryItemTest( void )
+{
+ FileBase::RC rc;
+ Directory *pDir;
+ DirectoryItem aItem;
+ FileStatus *pStatus;
+ File *pFile;
+
+ printf( "--------------------------------------------\n" );
+ printf( "Directory-Item-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ //--------------------------------------------------
+ // get DirectoryItem from an existing directory
+ //--------------------------------------------------
+
+ printf( "Get DirectoryItem from an existing Directory: ");
+ printFileName( dir1 );
+ printf( "\n");
+
+ rc=DirectoryItem::get( dir1 , aItem );
+ print_error( rtl::OString( "GetDirectoryItem" ), rc );
+
+ pStatus=new FileStatus( FileStatusMask_All );
+ rc=aItem.getFileStatus( *pStatus );
+
+ if ( rc==FileBase::E_None )
+ {
+ printf( "GetFileStatus: FileURL: ");
+ printFileName(pStatus->getFileURL() );
+ printf( "\n" );
+ }
+
+ delete pStatus;
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // get DirectoryItem from a not existing directory
+ //--------------------------------------------------
+
+ printf( "Get DirectoryItem from a not existing Directory: ");
+ printFileName( dir_not_exist );
+ printf( "\n" );
+
+ rc=DirectoryItem::get( dir_not_exist , aItem );
+ print_error( rtl::OString( "Get DirectoryItem" ), rc );
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // get DirectoryItem from an existing file
+ //--------------------------------------------------
+
+ printf( "Get DirectoryItem from an existing File: ");
+ printFileName( file1 );
+ printf( "\n" );
+
+ rc=DirectoryItem::get( file1 , aItem );
+ print_error( rtl::OString( "GetDirectoryItem" ), rc );
+
+ pStatus=new FileStatus( FileStatusMask_All );
+ rc=aItem.getFileStatus( *pStatus );
+
+ if ( rc==FileBase::E_None )
+ {
+ printf( "GetFileStatus: FileURL: ");
+ printFileName( pStatus->getFileURL() );
+ printf( "\n" );
+ }
+
+ delete pStatus;
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // get DirectoryItem from a not existing file
+ //--------------------------------------------------
+
+ printf( "Get DirectoryItem from a not existing File: ");
+ printFileName( file_not_exist );
+ printf( "\n" );
+
+ rc=DirectoryItem::get( file_not_exist , aItem );
+ print_error( rtl::OString( "Get DirectoryItem" ), rc );
+
+ printf( "\n" );
+
+ //----------------------------------------------------------
+ // get DirectoryItem from a directory with a wrong semantic
+ //----------------------------------------------------------
+
+ printf( "Get DirectoryItem from a Directory with a wrong semantic: ");
+ printFileName( dir_not_exist );
+ printf( "\n" );
+
+ rc=DirectoryItem::get( dir_wrong_semantic, aItem );
+ print_error( rtl::OString( "Get DirectoryItem" ),rc );
+
+ printf( "\n" );
+
+ //---------------------------------------------------
+ // get DirectoryItem from a file-handle
+ //--------------------------------------------------
+
+ pFile=new File( file1 );
+
+ rc=pFile->open( OpenFlag_Read );
+ if ( rc==FileBase::E_None )
+ {
+ printf( "Get DirectoryItem from a File-Handle: ");
+ printFileName( file1 );
+ printf( "\n" );
+
+ rc=DirectoryItem::get( *pFile , aItem );
+ print_error( rtl::OString( "GetDirectoryItem" ), rc );
+
+ pStatus=new FileStatus( FileStatusMask_All );
+ rc=aItem.getFileStatus( *pStatus );
+
+ if ( rc==FileBase::E_None )
+ {
+ printf( "GetFileStatus: FileURL: ");
+ printFileName( pStatus->getFileURL() );
+ printf( "\n");
+ }
+
+ delete pStatus;
+
+ pFile->close();
+ }
+
+ delete pFile;
+
+ printf( "\n" );
+
+ //---------------------------------------------------
+ // get DirectoryItem from an empty file-handle
+ //--------------------------------------------------
+
+ pFile=new File( file1 );
+
+ printf( "Get DirectoryItem from an empty File-Handle\n" );
+ rc=DirectoryItem::get( *pFile , aItem );
+ print_error( rtl::OString( "GetDirectoryItem" ), rc );
+
+ delete pFile;
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // GetNextItem from a directory
+ //--------------------------------------------------
+
+ pDir=new Directory( dir1 );
+ printf( "Get next DirectoryItem from a directory: ");
+ printFileName( dir1);
+ printf( "\n" );
+
+ rc= pDir->open();
+ print_error( rtl::OString( "Open Directory" ), rc );
+
+ printf( "\n" );
+
+ if ( pDir->isOpen() )
+ {
+ //--------------------------------------------------
+ // get all files from the directory
+ //--------------------------------------------------
+
+ rtl::OUString str;
+ rtl::OUString str1[2];
+
+ aItem=DirectoryItem();
+ rc=pDir->getNextItem( aItem );
+ print_error( rtl::OString( "GetNextItem" ),rc );
+
+ while( rc==FileBase::E_None )
+ {
+
+ FileStatus rStatus( FileStatusMask_All );
+ aItem.getFileStatus( rStatus );
+
+ str=rStatus.getFileName();
+ printf( "Filename: ");
+ printFileName( str );
+ printf( "\n");
+
+ aItem=DirectoryItem();
+ rc=pDir->getNextItem( aItem );
+ print_error( rtl::OString( "GetNextItem" ),rc );
+ }
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // Reset-Test
+ //--------------------------------------------------
+
+ for (int i=0; i<2; i++)
+ {
+ aItem=DirectoryItem();
+ rc=pDir->reset();
+ rc=pDir->getNextItem( aItem );
+
+ FileStatus rStatus( FileStatusMask_All );
+ aItem.getFileStatus( rStatus );
+
+ str1[i]=rStatus.getFileName();
+ }
+
+
+ if ( str1[0].compareTo(str1[1]) == 0 )
+ print_error( rtl::OString( "Reset" ),FileBase::E_None );
+ else
+ print_error( rtl::OString( "Reset" ),FileBase::E_invalidError );
+
+ printf( "\n" );
+
+ // Close Directory
+ rc=pDir->close();
+ print_error( rtl::OString( "Close Directory" ), rc );
+ }
+
+ printf( "\n");
+
+ //--------------------------------------------------
+ // GetNextItem from a closed directory
+ //--------------------------------------------------
+
+ printf( "Get next DirectoryItem from a closed directory: ");
+ printFileName( dir1 );
+ printf( "\n" );
+
+ aItem=DirectoryItem();
+ rc=pDir->getNextItem( aItem );
+ print_error( rtl::OString( "GetNextItem" ),rc );
+
+ delete pDir;
+
+ PressKey();
+ return;
+}
+
+//--------------------------------------------------
+// FileStatusTest (for different types)
+//--------------------------------------------------
+
+void FileStatusTest( FileStatus *pStatus )
+{
+ //--------------------------------------------------
+ // GetFileType of the directory
+ //--------------------------------------------------
+
+ FileStatus::Type aType;
+
+ printf( "\ngetFileType:\n" );
+ aType=pStatus->getFileType();
+ showFileType( aType );
+
+ //--------------------------------------------------
+ // GetAttributes
+ //--------------------------------------------------
+
+ sal_uInt64 uAttributes;
+
+ printf( "\ngetAttributes:\n" );
+ uAttributes=pStatus->getAttributes();
+ showAttributes( uAttributes );
+
+ //--------------------------------------------------
+ // GetCreationTime
+ //--------------------------------------------------
+
+ TimeValue aCreationTime;
+
+ printf( "\ngetCreationTime:\n" );
+ aCreationTime=pStatus->getCreationTime();
+
+ printf( "CreationTime: " );
+ showTime( aCreationTime );
+
+ //--------------------------------------------------
+ // GetAccessTime
+ //--------------------------------------------------
+
+ TimeValue aAccessTime;
+
+ printf( "\ngetAccessTime:\n" );
+ aAccessTime=pStatus->getAccessTime();
+
+ printf( "AccessTime: " );
+ showTime( aAccessTime );
+
+ //--------------------------------------------------
+ // GetModifyTime
+ //--------------------------------------------------
+
+ TimeValue aModifyTime;
+
+ printf( "\ngetModifyTime:\n" );
+ aModifyTime=pStatus->getModifyTime();
+
+ printf( "ModifyTime: " );
+ showTime( aModifyTime );
+
+ //--------------------------------------------------
+ // GetFileSize
+ //--------------------------------------------------
+
+ sal_uInt64 FileSize;
+
+ printf( "\ngetFileSize:\n" );
+
+ FileSize=pStatus->getFileSize();
+ printf( "FileSize: %i\n", FileSize);
+
+ //--------------------------------------------------
+ // GetFileName
+ //--------------------------------------------------
+
+ rtl::OUString FileName;
+
+ printf( "\ngetFileName:\n" );
+
+ FileName=pStatus->getFileName();
+ printf( "FileName: ");
+ printFileName( FileName );
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // GetFileURL
+ //--------------------------------------------------
+
+ rtl::OUString FileURL;
+
+ printf( "\ngetFileURL:\n" );
+
+ FileURL=pStatus->getFileURL();
+ printf( "FileURL: ");
+ printFileName( FileURL );
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // GetLinkTargetURL
+ //--------------------------------------------------
+
+ rtl::OUString LinkTargetURL;
+
+ printf( "\ngetLinkTargetURL:\n");
+
+ LinkTargetURL=pStatus->getLinkTargetURL();
+ printf( "LinkTargetURL: ");
+ printFileName( LinkTargetURL );
+ printf( "\n" );
+
+ return;
+}
+
+//--------------------------------------------------
+// DirectoryFileStatusTest
+//--------------------------------------------------
+
+void DirectoryFileStatusTest( void )
+{
+ FileBase::RC rc;
+ DirectoryItem aItem;
+ FileStatus *pStatus;
+
+ printf( "--------------------------------------------\n" );
+ printf( "Directory-FileStatus-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ printf( "FileStatus of the directory: ");
+ printFileName( dir1 );
+ printf( "\n" );
+
+ aItem=DirectoryItem();
+
+ rc=DirectoryItem::get( dir1, aItem );
+ print_error( rtl::OString( "Get DirectoryItem" ), rc );
+
+ if ( rc==FileBase::E_None )
+ {
+ pStatus=new FileStatus( FileStatusMask_All );
+ rc=aItem.getFileStatus( *pStatus );
+
+ FileStatusTest( pStatus );
+
+ delete pStatus;
+ }
+
+ printf( "\n" );
+
+ PressKey();
+ return;
+}
+
+//--------------------------------------------------
+// FileFileStatusTest
+//--------------------------------------------------
+
+void FileFileStatusTest( void )
+{
+ FileBase::RC rc;
+ DirectoryItem aItem;
+ FileStatus *pStatus;
+
+ printf( "--------------------------------------------\n" );
+ printf( "File-FileStatus-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ printf( "FileStatus of the file: ");
+ printFileName( file1 );
+ printf( "\n" );
+
+ aItem=DirectoryItem();
+
+ rc=DirectoryItem::get( file1 , aItem );
+ print_error( rtl::OString( "Get DirectoryItem" ), rc );
+
+ if ( rc==FileBase::E_None )
+ {
+ pStatus=new FileStatus( FileStatusMask_All );
+ rc=aItem.getFileStatus( *pStatus );
+
+ FileStatusTest( pStatus );
+
+ delete pStatus;
+ }
+
+ printf( "\n" );
+
+ PressKey();
+ return;
+}
+
+//--------------------------------------------------
+// VolumeFileStatusTest
+//--------------------------------------------------
+
+void VolumeFileStatusTest( void )
+{
+ FileBase::RC rc;
+ DirectoryItem aItem;
+ FileStatus *pStatus;
+
+ printf( "--------------------------------------------\n" );
+ printf( "Volume-FileStatus-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ printf( "FileStatus of the Volume: ");
+ printFileName( root );
+ printf( "\n" );
+
+ aItem=DirectoryItem();
+
+ rc=DirectoryItem::get( root , aItem );
+ print_error( rtl::OString( "Get DirectoryItem" ), rc );
+
+ if ( rc==FileBase::E_None )
+ {
+ pStatus=new FileStatus( FileStatusMask_All) ;
+ rc=aItem.getFileStatus( *pStatus );
+
+ FileStatusTest( pStatus );
+
+ delete pStatus;
+ }
+
+ printf( "\n" );
+
+ PressKey();
+ return;
+}
+
+
+//--------------------------------------------------
+// VolumeInfoTest
+//--------------------------------------------------
+
+void VolumeInfoTest( void )
+{
+ FileBase::RC rc;
+
+ printf( "--------------------------------------------\n" );
+ printf( "Volume-Info-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ printf( "VolumeInfo of the volume ");
+ printFileName( root );
+
+ printf( "\n" );
+
+ VolumeInfo rInfo( VolumeInfoMask_FreeSpace );
+ rc=Directory::getVolumeInfo( root , rInfo );
+ print_error( rtl::OString( "GetVolumeInfo" ),rc );
+
+ printf( "\n" );
+
+ //--------------------------------------------------
+ // getRemoteFlag
+ //--------------------------------------------------
+
+ if ( rInfo.getRemoteFlag() )
+ printf( "RemoteFlag: Yes\n" );
+ else
+ printf( "RemoteFlag: No\n" );
+
+ //--------------------------------------------------
+ // getRemoveableFlag
+ //--------------------------------------------------
+
+ if ( rInfo.getRemoveableFlag() )
+ printf( "RemoveableFlag: Yes\n" );
+ else
+ printf( "RemoveableFlag: No\n" );
+
+ //--------------------------------------------------
+ // getTotalSpace
+ //--------------------------------------------------
+
+ sal_uInt64 TotalSpace;
+ TotalSpace=rInfo.getTotalSpace();
+ printf( "Total Space: %i\n",TotalSpace );
+
+ //--------------------------------------------------
+ // getFreeSpace
+ //--------------------------------------------------
+
+ sal_uInt64 FreeSpace;
+ FreeSpace=rInfo.getFreeSpace();
+ printf( "Free Space: %i\n",FreeSpace );
+
+ //--------------------------------------------------
+ // getUsedSpace
+ //--------------------------------------------------
+
+ sal_uInt64 UsedSpace;
+ UsedSpace=rInfo.getUsedSpace();
+ printf( "Used Space: %i\n",UsedSpace );
+
+ //--------------------------------------------------
+ // getMaxNameLength
+ //--------------------------------------------------
+
+ sal_uInt32 MaxNameLength;
+ MaxNameLength=rInfo.getMaxNameLength();
+ printf( "MaxNameLength: %i\n",MaxNameLength );
+
+ //--------------------------------------------------
+ // getMaxPathLength
+ //--------------------------------------------------
+
+ sal_uInt32 MaxPathLength;
+ MaxPathLength=rInfo.getMaxPathLength();
+ printf( "MaxPathLength: %i\n",MaxPathLength );
+
+ //--------------------------------------------------
+ // getFileSystemName
+ //--------------------------------------------------
+
+ rtl::OUString FileSystemName;
+ FileSystemName=rInfo.getFileSystemName();
+ printf( "File-System-Name: ");
+ printFileName( FileSystemName );
+ printf( "\n" );
+
+ PressKey();
+ return;
+}
+
+//--------------------------------------------------
+// FileBaseTest
+//--------------------------------------------------
+
+void ConvertPathTest(rtl::OUString& strPath)
+{
+ FileBase::RC rc;
+
+ rtl::OUString strNormPath;
+ rtl::OUString strFileURL;
+ rtl::OUString strNormPathFromFileURL;
+ rtl::OUString strSystemPath;
+
+ //--------------------------------------------------
+ // normalizePath
+ //--------------------------------------------------
+
+ rc=FileBase::getFileURLFromSystemPath( strPath, strNormPath );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Normalized Path: \t\t");
+ printFileName( strNormPath );
+ printf( "\n" );
+ }
+ else
+ printf( "normalizePath: Error \n" );
+
+ //--------------------------------------------------
+ // getFileURLFromSystemPath
+ //--------------------------------------------------
+
+ if ( strNormPath.getLength() != 0 )
+ {
+ rc=FileBase::getFileURLFromSystemPath( strNormPath, strFileURL );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "File-URL: \t\t\t");
+ printFileName( strFileURL );
+ printf( "\n" );
+ }
+ else
+ printf( "getFileURLFromSystemPath: Error \n" );
+ }
+ else
+ printf( "getFileURLFromSystemPath: not tested \n" );
+
+ //--------------------------------------------------
+ // getNormalizedPathFromFileURL
+ //--------------------------------------------------
+
+ if ( strFileURL.getLength() != 0 )
+ {
+ rc=FileBase::getSystemPathFromFileURL( strFileURL, strNormPathFromFileURL );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Normalized Path from File-URL: \t");
+ printFileName( strNormPathFromFileURL );
+ printf( "\n" );
+ }
+ else
+ printf( "getNormalizedPathFromFileURL: Error \n" );
+ }
+ else
+ printf( "getNormalizedPathFromFileURL: not tested \n" );
+
+
+ //--------------------------------------------------
+ // getSystemPathFromFileURL
+ //--------------------------------------------------
+
+ if ( strNormPath.getLength() != 0 )
+ {
+ rc=FileBase::getSystemPathFromFileURL( strNormPath, strSystemPath );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "System-Path: \t\t\t");
+ printFileName( strSystemPath );
+ printf( "\n");
+ }
+ else
+ printf( "getSystemPathFromFileURL: Error \n" );
+ }
+ else
+ printf( "getSystemPathFromFileURL: not tested \n" );
+
+ //--------------------------------------------------
+ // Verify
+ //--------------------------------------------------
+
+ if ( strNormPathFromFileURL == strNormPath )
+ printf( "\nVerify: OK ! ( Normalized-Path == Normalized-Path-From-File-URL )\n" );
+ else
+ printf( "\nVerify: Error ! ( Normalized-Path != Normalized-Path-From-File-URL )\n" );
+
+ return;
+}
+
+void FileBaseTest()
+{
+ printf( "--------------------------------------------\n" );
+ printf( "FileBase-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ //--------------------------------------------------
+ // ConvertPath-Test (Local File)
+ //--------------------------------------------------
+
+ printf( "- Local File: ");
+ printFileName( file1 );
+ printf( "\n\n" );
+
+ ConvertPathTest(file1);
+
+ //--------------------------------------------------
+ // ConvertPath-Test (File on a server)
+ //--------------------------------------------------
+
+ printf( "\n- File on server: ");
+ printFileName( file_on_server );
+ printf( "\n\n" );
+ ConvertPathTest(file_on_server);
+
+ PressKey();
+
+ return;
+}
+
+
+//--------------------------------------------------
+// AbsolutePathTest
+//--------------------------------------------------
+void DoAbsolutePathTest(rtl::OUString strDirBase, rtl::OUString strRelative)
+{
+ FileBase::RC rc;
+
+ rtl::OUString strAbsolute;
+
+ printf( "Base-Directory: \t");
+ printFileName( strDirBase );
+ printf( "\n" );
+ printf( "Relative-Path: \t\t");
+ printFileName ( strRelative );
+ printf( "\n" );
+
+ rc=FileBase::getAbsoluteFileURL( strDirBase, strRelative, strAbsolute );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Absolute-Path: \t\t");
+ printFileName ( strAbsolute );
+ printf( "\n" );
+ }
+ else
+ printf( "Absolute-Path: Error \n" );
+
+ printf( "\n" );
+ return;
+}
+
+void AbsolutePathTest(void)
+{
+ printf( "--------------------------------------------\n" );
+ printf( "AbsolutePath-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ DoAbsolutePathTest(dir1, rtl::OUString::createFromAscii("."));
+ DoAbsolutePathTest(dir1, rtl::OUString::createFromAscii(".."));
+ DoAbsolutePathTest(dir1, rtl::OUString::createFromAscii("../.."));
+ DoAbsolutePathTest(dir1, rtl::OUString::createFromAscii("../HUHU"));
+
+ DoAbsolutePathTest(dir_on_server, rtl::OUString::createFromAscii("."));
+ DoAbsolutePathTest(dir_on_server, rtl::OUString::createFromAscii(".."));
+ DoAbsolutePathTest(dir_on_server, rtl::OUString::createFromAscii("../.."));
+ DoAbsolutePathTest(dir_on_server, rtl::OUString::createFromAscii("../HUHU"));
+
+ PressKey();
+ return;
+}
+
+
+//--------------------------------------------------
+// searchPathTest
+//--------------------------------------------------
+
+void SearchPathTest(void)
+{
+ FileBase::RC rc;
+
+ rtl::OUString strNormPath(file1);
+ rtl::OUString strFileURL;
+ rtl::OUString strSystemPath;
+ rtl::OUString strResultPath;
+
+ printf( "--------------------------------------------\n" );
+ printf( "SearchPath-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+
+ rc=FileBase::getFileURLFromSystemPath( strNormPath, strFileURL );
+ print_error( rtl::OString( "getFileURLFromSystemPath" ), rc );
+ rc=FileBase::getSystemPathFromFileURL( strNormPath, strSystemPath );
+ print_error( rtl::OString( "getSystemPathFromFileURL" ), rc );
+
+ //--------------------------------------------------
+ // searchFileURL (with a normalized path)
+ //--------------------------------------------------
+
+ if ( strNormPath.getLength() != 0 )
+ {
+ printf( "\nSearch-Normalized-Path (with a normalized path) : ");
+ printFileName ( strNormPath );
+ printf( "\n" );
+
+ rc=FileBase::searchFileURL( strNormPath , rtl::OUString() , strResultPath );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Result: \t\t\t");
+ printFileName ( strResultPath );
+ printf( "\n" );
+ }
+ else
+ printf( "searchFileURL (with a normalized path): Error\n" );
+ }
+ else
+ printf( "searchFileURL (with a normalized path): not tested\n" );
+
+ //--------------------------------------------------
+ // searchFileURL (with a File-URL)
+ //--------------------------------------------------
+
+ if ( strFileURL.getLength() != 0 )
+ {
+ printf( "\nSearch-Normalized-Path (with a FileURL) : ");
+ printFileName( strFileURL );
+ printf( "\n" );
+
+ rc=FileBase::searchFileURL( strFileURL , rtl::OUString() , strResultPath );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Result: \t\t\t");
+ printFileName ( strResultPath );
+ printf( "\n" );
+ }
+ else
+ printf( "searchFileURL (with a FileURL path): Error\n" );
+ }
+ else
+ printf( "searchFileURL (with a FileURL path): not tested\n" );
+
+ //--------------------------------------------------
+ // searchFileURL (with a systempath)
+ //--------------------------------------------------
+
+ if ( strSystemPath.getLength() != 0 )
+ {
+ printf( "\nSearch-Normalized-Path (with a SystemPath) : ");
+ printFileName( strSystemPath );
+ printf( "\n" );
+
+ rc=FileBase::searchFileURL( strSystemPath , rtl::OUString() , strResultPath );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Result: \t\t\t");
+ printFileName( strResultPath );
+ printf( "\n" );
+ }
+ else
+ printf( "searchFileURL (with a systempath): Error\n" );
+ }
+ else
+ printf( "searchFileURL (with a systempath): not tested\n" );
+
+ //--------------------------------------------------
+ // searchFileURL (File and no searchpath)
+ //--------------------------------------------------
+
+ printf( "\nsearchFileURL: File (no searchpath) : ");
+ printFileName( file3 );
+ printf( "\n" );
+
+ rc=FileBase::searchFileURL( file3 , rtl::OUString::createFromAscii("") , strResultPath );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Result: \t\t\t");
+ printFileName( strResultPath );
+ printf( "\n" );
+ }
+ else
+ printf( "searchFileURL: File not found: OK ! \n" );
+
+ //--------------------------------------------------
+ // searchFileURL (File and Path)
+ //--------------------------------------------------
+
+ printf( "\nsearchFileURL: File : ");
+ printFileName( file3 );
+ printf( "\tSearchPath ");
+ printFileName( dir1 );
+ printf( "\n");
+
+ rc=FileBase::searchFileURL( file3 , dir1 , strResultPath );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Result: \t\t\t");
+ printFileName( strResultPath );
+ printf( "\n");
+ }
+ else
+ printf( "searchFileURL: File not found: Error\n" );
+
+ //------------------------------------------------------------
+ // searchFileURL (File and searchpath with two entries)
+ //------------------------------------------------------------
+
+ rtl::OUString strSearchPath( dir_not_exist );
+ strSearchPath+=rtl::OUString::createFromAscii(";");
+ strSearchPath+=dir_on_server;
+
+ printf( "\nsearchFileURL: File : ");
+ printFileName( file3 );
+ printf( "SearchPath ");
+ printFileName( strSearchPath );
+ printf( "\n");
+
+ rc=FileBase::searchFileURL( file3 , strSearchPath , strResultPath );
+
+ if ( rc == FileBase::E_None )
+ {
+ printf( "Result: \t\t\t");
+ printFileName( strResultPath );
+ printf( "\n" );
+ }
+ else
+ printf( "searchFileURL: File not found: Error\n" );
+
+ //-------------------------------------------------------------------
+ // searchFileURL (File and searchpath (with a wrong semantic))
+ //-------------------------------------------------------------------
+
+ strSearchPath=rtl::OUString( dir_wrong_semantic );
+
+ printf( "\nsearchFileURL: File : ");
+ printFileName( file3 );
+ printf( "SearchPath ");
+ printFileName( strSearchPath );
+ printf( "\n");
+
+ rc=FileBase::searchFileURL( file3 , strSearchPath , strResultPath );
+
+ if ( rc == FileBase::E_None )
+ printf( "Error: Wrong Semantich but no error occurs !\n" );
+ else
+ printf( "searchFileURL: File not found: OK !\n" );
+
+ return;
+}
+
+//--------------------------------------------------
+// CanonicalNameTest
+//--------------------------------------------------
+
+void getCanonicalNameTest(rtl::OUString strPath)
+{
+ FileBase::RC rc;
+
+ rtl::OUString strValid;
+
+ printf( "Original-Name: \t\t");
+ printFileName( strPath );
+ printf( "\n" );
+
+ rc=FileBase::getCanonicalName( strPath, strValid );
+
+ if ( rc == FileBase::E_None)
+ {
+ printf( "Canonical-Name: \t");
+ printFileName( strValid );
+ printf( "\n");
+
+ }
+ else
+ printf( "Canonical-Name: Error \n" );
+
+ printf( "\n" );
+ return;
+}
+
+void CanonicalNameTest(void)
+{
+ printf( "--------------------------------------------\n" );
+ printf( "CanonicalName-Test\n" );
+ printf( "--------------------------------------------\n\n" );
+
+ getCanonicalNameTest( dir1 );
+ getCanonicalNameTest( dir_on_server );
+ getCanonicalNameTest( file1 );
+ getCanonicalNameTest( file_on_server );
+
+ PressKey();
+ return;
+}
+
+//--------------------------------------------------
+// print_error
+//--------------------------------------------------
+
+void print_error( ::rtl::OString& str, FileBase::RC rc )
+{
+
+ printf( "%s : ",str.getStr() );
+ switch(rc)
+ {
+ case FileBase::E_None:
+ printf("OK !\n");
+ break;
+ case FileBase::E_PERM:
+ printf("E_PERM\n");
+ break;
+ case FileBase::E_NOENT:
+ printf("E_NOENT\n");
+ break;
+ case FileBase::E_SRCH:
+ printf("E_SRCH\n");
+ break;
+ case FileBase::E_INTR:
+ printf("E_INTR\n");
+ break;
+ case FileBase::E_IO:
+ printf("E_IO\n");
+ break;
+ case FileBase::E_NXIO:
+ printf("E_NXIO\n");
+ break;
+ case FileBase::E_2BIG:
+ printf("E_2BIG\n");
+ break;
+ case FileBase::E_NOEXEC:
+ printf("E_NOEXEC\n");
+ break;
+ case FileBase::E_BADF:
+ printf("E_BADF\n");
+ break;
+ case FileBase::E_CHILD:
+ printf("E_CHILD\n");
+ break;
+ case FileBase::E_AGAIN:
+ printf("E_AGAIN\n");
+ break;
+ case FileBase::E_NOMEM:
+ printf("E_NOMEM\n");
+ break;
+ case FileBase::E_ACCES:
+ printf("E_ACCES\n");
+ break;
+ case FileBase::E_FAULT:
+ printf("E_FAULT\n");
+ break;
+ case FileBase::E_BUSY:
+ printf("E_BUSY\n");
+ break;
+ case FileBase::E_EXIST:
+ printf("E_EXIST\n");
+ break;
+ case FileBase::E_XDEV:
+ printf("E_XDEV\n");
+ break;
+ case FileBase::E_NODEV:
+ printf("E_NODEV\n");
+ break;
+ case FileBase::E_NOTDIR:
+ printf("E_NOTDIR\n");
+ break;
+ case FileBase::E_ISDIR:
+ printf("E_ISDIR\n");
+ break;
+ case FileBase::E_INVAL:
+ printf("E_INVAL\n");
+ break;
+ case FileBase::E_NFILE:
+ printf("E_NFILE\n");
+ break;
+ case FileBase::E_MFILE:
+ printf("E_MFILE\n");
+ break;
+ case FileBase::E_NOTTY:
+ printf("E_NOTTY\n");
+ break;
+ case FileBase::E_FBIG:
+ printf("E_FBIG\n");
+ break;
+ case FileBase::E_NOSPC:
+ printf("E_NOSPC\n");
+ break;
+ case FileBase::E_SPIPE:
+ printf("E_SPIPE\n");
+ break;
+ case FileBase::E_ROFS:
+ printf("E_ROFS\n");
+ break;
+ case FileBase::E_MLINK:
+ printf("E_MLINK\n");
+ break;
+ case FileBase::E_PIPE:
+ printf("E_PIPE\n");
+ break;
+ case FileBase::E_DOM:
+ printf("E_DOM\n");
+ break;
+ case FileBase::E_RANGE:
+ printf("E_RANGE\n");
+ break;
+ case FileBase::E_DEADLK:
+ printf("E_DEADLK\n");
+ break;
+ case FileBase::E_NAMETOOLONG:
+ printf("E_NAMETOOLONG\n");
+ break;
+ case FileBase::E_NOLCK:
+ printf("E_NOLCK\n");
+ break;
+ case FileBase::E_NOSYS:
+ printf("E_NOSYS\n");
+ break;
+ case FileBase::E_NOTEMPTY:
+ printf("E_NOTEMPTY\n");
+ break;
+ case FileBase::E_LOOP:
+ printf("E_LOOP\n");
+ break;
+ case FileBase::E_ILSEQ:
+ printf("E_ILSEQ\n");
+ break;
+ case FileBase::E_NOLINK:
+ printf("E_NOLINK\n");
+ break;
+ case FileBase::E_MULTIHOP:
+ printf("E_MULTIHOP\n");
+ break;
+ case FileBase::E_USERS:
+ printf("E_USERS\n");
+ break;
+ case FileBase::E_OVERFLOW:
+ printf("E_OVERFLOW\n");
+ break;
+ default:
+ printf("E_Unknown\n");
+ break;
+ }
+ return;
+}
+
+//--------------------------------------------------
+// main
+//--------------------------------------------------
+#if defined WNT
+ #define MAIN _cdecl main
+#else
+ #define MAIN main
+#endif
+
+int MAIN( int argc, char* argv[] )
+{
+ sal_Bool fSuccess=sal_False;
+
+ //Initialization
+ fSuccess=Initialize();
+ if ( !fSuccess )
+ {
+ printf("Error during Initialization");
+ return -1;
+ }
+
+
+ if (argc==1)
+ {
+ DirectoryOpenAndCloseTest();
+ DirectoryCreateAndRemoveTest();
+
+ FileOpenAndCloseTest();
+ FileCreateAndRemoveTest();
+ FileWriteAndReadTest();
+ FileCopyAndMoveTest();
+ FileSizeTest();
+ FilePointerTest();
+ FileAttributesTest();
+ FileTimeTest();
+ DirectoryItemTest();
+ DirectoryFileStatusTest();
+ VolumeFileStatusTest();
+ FileFileStatusTest();
+ VolumeInfoTest();
+ FileBaseTest();
+ SearchPathTest();
+ AbsolutePathTest();
+ CanonicalNameTest();
+ }
+ // command line arguments ?
+ else
+ {
+ int i=1;
+
+ while (i<argc)
+ {
+ if (strcmp(argv[i], "doc")==0)
+ DirectoryOpenAndCloseTest();
+ else if (strcmp(argv[i], "dcr")==0)
+ DirectoryCreateAndRemoveTest();
+ else if (strcmp(argv[i], "foc")==0)
+ FileOpenAndCloseTest();
+ else if (strcmp(argv[i], "fcr")==0)
+ FileCreateAndRemoveTest();
+ else if (strcmp(argv[i], "fwr")==0)
+ FileWriteAndReadTest();
+ else if (strcmp(argv[i], "fcm")==0)
+ FileCopyAndMoveTest();
+ else if (strcmp(argv[i], "fs")==0)
+ FileSizeTest();
+ else if (strcmp(argv[i], "fp")==0)
+ FilePointerTest();
+ else if (strcmp(argv[i], "fa")==0)
+ FileAttributesTest();
+ else if (strcmp(argv[i], "ft")==0)
+ FileTimeTest();
+ else if (strcmp(argv[i], "di")==0)
+ DirectoryItemTest();
+ else if (strcmp(argv[i], "dfs")==0)
+ DirectoryFileStatusTest();
+ else if (strcmp(argv[i], "vfs")==0)
+ VolumeFileStatusTest();
+ else if (strcmp(argv[i], "ffs")==0)
+ FileFileStatusTest();
+ else if (strcmp(argv[i], "vi")==0)
+ VolumeInfoTest();
+ else if (strcmp(argv[i], "fb")==0)
+ FileBaseTest();
+ else if (strcmp(argv[i], "sp")==0)
+ SearchPathTest();
+ else if (strcmp(argv[i], "ap")==0)
+ AbsolutePathTest();
+ else if (strcmp(argv[i], "cn")==0)
+ CanonicalNameTest();
+
+ i++;
+ }
+ }
+
+ // Shutdown
+ fSuccess=Shutdown();
+ if ( !fSuccess )
+ {
+ printf("Error during Shutdown");
+ return -1;
+ }
+
+ return 0;
+}
+
+
diff --git a/sal/workben/testpip2.cxx b/sal/workben/testpip2.cxx
new file mode 100644
index 000000000000..0fd57b083a15
--- /dev/null
+++ b/sal/workben/testpip2.cxx
@@ -0,0 +1,97 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define INCL_DOSPROCESS
+#include <osl/pipe.h>
+#include <os2.h>
+
+// eindeutiger Name fr die Pipe
+const char pszPipeName[] = "TestPipe";
+
+oslPipe Pipe;
+
+
+void fail( const char * pszText, int retval )
+{
+ fprintf( stderr, "TestPipe Client: %s", pszText );
+ fprintf( stderr, "TestPipe Client: test failed, ErrNo: %d.\n", retval );
+ exit( retval );
+}
+
+
+
+/*
+ * Teste die Pipe-Implementation in osl
+ */
+
+int main (void)
+{
+ char szBuffer[ 256 ];
+ sSize_t nChars;
+
+ // gib dem Server die Chance, die Pipe zu ”ffnen
+ DosSleep( 1000 );
+
+ // erzeuge die Pipe
+ Pipe = osl_createPipe( pszPipeName, osl_Pipe_OPEN, 0 );
+
+ if( !Pipe )
+ fail( "unable to open pipe.\n",
+ osl_getLastPipeError(NULL));
+
+
+ // empfange Daten vom Server
+ nChars = osl_receivePipe( Pipe, szBuffer, 256 );
+
+ if( nChars < 0 )
+ fail( "unable to read from pipe.\n",
+ osl_getLastPipeError( Pipe ) );
+
+ printf( "TestPipe Client: data received: %s.\n", szBuffer );
+
+ // Sende die Daten wieder zurck.
+ nChars = osl_sendPipe( Pipe, szBuffer, nChars );
+
+ if( nChars < 0 )
+ fail( "unable to write on pipe.\n",
+ osl_getLastPipeError( Pipe ) );
+
+ // schliesse die Pipe
+ osl_destroyPipe( Pipe );
+
+ printf( "TestPipe Client: test passed.\n" );
+ return 0;
+}
+
+
+
diff --git a/sal/workben/testpipe.cxx b/sal/workben/testpipe.cxx
new file mode 100644
index 000000000000..6b860351d6b4
--- /dev/null
+++ b/sal/workben/testpipe.cxx
@@ -0,0 +1,168 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <osl/pipe.h>
+#include <osl/process.h>
+#include <rtl/ustring.h>
+
+// eindeutiger Name fr die Pipe
+const char pszPipeName[] = "TestPipe";
+const char szTestString[] = "This is a test";
+char szBuffer[256];
+
+const char * cp;
+Size_t n;
+sSize_t nChars;
+
+// osl specific variables
+oslPipe Pipe;
+oslPipe C1Pipe;
+oslProcess Process = NULL;
+oslProcessError ProcessError;
+oslProcessInfo ProcessInfo;
+
+void fail( const char * pszText, int retval )
+{
+ fprintf( stderr, "TestPipe Server: %s", pszText );
+ fprintf( stderr, "TestPipe Server: test failed, ErrNo: %d.\n", retval );
+
+ if( Process ) osl_freeProcessHandle( Process );
+ exit( retval );
+}
+
+
+
+/*
+ * Teste die Pipe-Implementation in osl
+ */
+
+int main (int argc, const char *argv[])
+{
+ // erzeuge die Pipe
+ rtl_uString* ustrPipeName=0;
+ rtl_uString* ustrExeName=0;
+
+
+ rtl_uString_newFromAscii(&ustrPipeName,pszPipeName);
+ rtl_uString_newFromAscii(&ustrExeName, "//./tmp/testpip2.exe");
+
+ Pipe = osl_createPipe( ustrPipeName, osl_Pipe_CREATE, 0 );
+
+ if( !Pipe )
+ fail( "unable to create Pipe.\n",
+ osl_getLastPipeError(NULL));
+
+ // starte client process
+ ProcessError = osl_executeProcess( ustrExeName,
+ NULL,
+ 0,
+ osl_Process_NORMAL,
+ 0,
+ NULL,
+ NULL,
+ 0,
+ NULL,
+ &Process );
+
+ if( ProcessError != osl_Process_E_None )
+ fail( "unable to start client.\n", ProcessError );
+
+ // wait for connection
+ C1Pipe = osl_acceptPipe( Pipe );
+
+ if( !C1Pipe )
+ fail( "unable to connect to client.\n",
+ osl_getLastPipeError( Pipe ));
+
+
+ if( argc > 1 )
+ {
+ cp = argv[1];
+ n = strlen( cp ) + 1;
+ }
+ else
+ {
+ cp = szTestString;
+ n = sizeof(szTestString);
+ }
+
+ // sende TestString zum Client
+ nChars = osl_sendPipe( C1Pipe, cp, n );
+
+ if( nChars < 0 )
+ fail( "unable to write on pipe.\n",
+ osl_getLastPipeError( Pipe ) );
+
+ // empfange Daten vom Server
+ nChars = osl_receivePipe( C1Pipe, szBuffer, 256 );
+
+ if( nChars < 0 )
+ fail( "unable to read from pipe.\n",
+ osl_getLastPipeError( C1Pipe ) );
+
+ printf( "TestPipe Server: received data: %s.\n", szBuffer );
+
+ // warte bis das Client-Programm sich beendet
+ ProcessError = osl_joinProcess( Process );
+
+ if( ProcessError != osl_Process_E_None )
+ fail( "unable to wait for client.\n",
+ ProcessError );
+
+ // ermittle den Rckgabewert des Client-Programms
+ ProcessInfo.Size = sizeof( ProcessInfo );
+
+ ProcessError = osl_getProcessInfo( Process, osl_Process_EXITCODE, &ProcessInfo );
+
+ if( ProcessError != osl_Process_E_None )
+ fail( "unable to receive return value of client process.\n",
+ ProcessError );
+
+ if( ProcessInfo.Code != 0 )
+ fail( "client aborted.\n", ProcessInfo.Code );
+
+ // gib das Handle fuer den Client-Prozess frei
+ osl_freeProcessHandle( Process );
+
+ // schliesse die Pipes
+ osl_destroyPipe( C1Pipe );
+ osl_destroyPipe( Pipe );
+
+ printf( "TestPipe Server: test passed.\n" );
+ return 0;
+}
+
+
+
diff --git a/sal/workben/testproc.cxx b/sal/workben/testproc.cxx
new file mode 100644
index 000000000000..4fdb2ee9cac6
--- /dev/null
+++ b/sal/workben/testproc.cxx
@@ -0,0 +1,77 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+
+#include <osl/process.h>
+#include <stdio.h>
+
+
+#if defined WNT
+ #define MAIN _cdecl main
+#else
+ #define MAIN main
+#endif
+
+void MAIN (void)
+{
+ oslProcess Process;
+ oslProcessError ProcessError;
+ sal_uInt32 nArgCount;
+ sal_uInt32 index;
+ rtl_uString* ustrExeFile=0;
+ rtl_uString* ustrArg=0;
+
+ nArgCount=osl_getCommandArgCount();
+
+ fprintf(stderr,"Arg Count == %i\n\n",nArgCount);
+
+ for ( index = 0 ; index <= nArgCount+1 ; index++ )
+ {
+ fprintf(stderr,"Getting Arg No . %i\n",index);
+
+ osl_getCommandArg(index,&ustrArg);
+
+ fprintf(stderr,"done ...\n\n",index);
+ }
+
+ ProcessError = osl_getExecutableFile(&ustrExeFile);
+
+/*
+ osl_executeProcess( "e:\\test\\os2de202.exe",
+ NULL,
+ osl_Process_NORMAL,
+ 0L,
+ NULL,
+ NULL,
+ NULL,
+ &Process );*/
+}
+
+
diff --git a/sal/workben/tgetpwnam.cxx b/sal/workben/tgetpwnam.cxx
new file mode 100644
index 000000000000..912c6b951532
--- /dev/null
+++ b/sal/workben/tgetpwnam.cxx
@@ -0,0 +1,248 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <pthread.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#ifndef NETBSD
+#include <shadow.h>
+#endif
+
+/* exercises some reentrant libc-fucntions */
+
+extern "C"
+{
+ struct tm *localtime_r(const time_t *timep, struct tm *buffer);
+ struct passwd* getpwnam_r(char*, struct passwd*, char *, int);
+ struct spwd* getspnam_r(char*, struct spwd*, char *, int);
+ struct hostent *gethostbyname_r(const char *name, struct hostent *result,
+ char *buffer, int buflen, int *h_errnop);
+}
+
+static int go;
+
+
+
+extern "C" void *workfunc1(void*)
+{
+ char buffer[256];
+ struct tm sttm;
+ time_t nepoch;
+ struct passwd stpwd;
+ struct hostent sthostent;
+ int nerr;
+
+ printf("starting thread 1 ...\n");
+ while (go) {
+ getpwnam_r("hr", &stpwd, buffer, sizeof(buffer));
+ gethostbyname_r("blauwal", &sthostent, buffer, sizeof(buffer), &nerr);
+ time(&nepoch);
+ localtime_r(&nepoch, &sttm);
+ }
+ return 0;
+}
+
+extern "C" void *workfunc2(void*)
+{
+ char buffer[256];
+ struct tm sttm;
+ time_t nepoch;
+ struct passwd stpwd;
+ struct hostent sthostent;
+ int nerr;
+
+ printf("starting thread 2 ...\n");
+ while(go) {
+ getpwnam_r("mh", &stpwd, buffer, sizeof(buffer));
+ gethostbyname_r("hr-1242", &sthostent, buffer, sizeof(buffer), &nerr);
+ time(&nepoch);
+ localtime_r(&nepoch, &sttm);
+ }
+ return 0;
+}
+
+
+extern int h_errno;
+
+int main(int argc, char *argv[])
+{
+ char buffer[256];
+ struct tm *ptm;
+ time_t nepoch;
+ struct passwd *pwd, *pres1;
+#ifndef NETBSD
+ struct spwd *spwd, *pres2;
+#endif
+ struct hostent *phostent, *pres3;
+ char **p;
+
+ pthread_t tid1,tid2;
+ int res1,res2;
+
+ go = 1;
+
+ pthread_create(&tid1, NULL, workfunc1, &res1);
+ pthread_create(&tid2, NULL, workfunc2, &res2);
+
+ pwd = (struct passwd*)malloc(sizeof(struct passwd));
+
+ pres1 = getpwnam_r("hr", pwd, buffer, sizeof(buffer));
+
+ sleep(3);
+
+ if (pres1) {
+ printf("Name: %s\n", pwd->pw_name);
+ printf("Passwd: %s\n", pwd->pw_passwd);
+ printf("Uid: %d\n", pwd->pw_uid);
+ printf("Gid: %d\n", pwd->pw_gid);
+#ifdef NETBSD
+ printf("Change: %s", ctime(&pwd->pw_change));
+ printf("Class: %s\n", pwd->pw_class);
+#else
+ printf("Age: %s\n", pwd->pw_age);
+ printf("Comment: %s\n", pwd->pw_comment);
+#endif
+ printf("Gecos: %s\n", pwd->pw_gecos);
+ printf("Dir: %s\n", pwd->pw_dir);
+ printf("Shell: %s\n", pwd->pw_shell);
+ }
+ else
+ printf("getpwnam_r() failed!\n");
+
+ free(pwd);
+
+#ifndef NETBSD
+ spwd = (struct spwd*)malloc(sizeof(struct spwd));
+
+ pres2 = getspnam_r("hr", spwd, buffer, sizeof(buffer));
+
+ if (pres2) {
+ printf("Name: %s\n", spwd->sp_namp);
+ printf("Passwd: %s\n", spwd->sp_pwdp);
+ printf("Last Change: %ld\n", spwd->sp_lstchg);
+ printf("Min: %ld\n", spwd->sp_min);
+ printf("Max: %ld\n", spwd->sp_max);
+ }
+ else
+ printf("getspnam_r() failed!\n");
+
+ free(spwd);
+#endif
+
+ ptm = (struct tm*)malloc(sizeof(struct tm));
+
+ time(&nepoch);
+ localtime_r(&nepoch, ptm);
+
+ printf("Seconds: %d\n", ptm->tm_sec);
+ printf("Minutes: %d\n", ptm->tm_min);
+ printf("Hour: %d\n", ptm->tm_hour);
+ printf("Day of Month: %d\n", ptm->tm_mday);
+ printf("Month: %d\n", ptm->tm_mon);
+ printf("Year: %d\n", ptm->tm_year);
+ printf("Day of week: %d\n", ptm->tm_wday);
+ printf("Day in the year: %d\n", ptm->tm_yday);
+ printf("Daylight saving time: %d\n", ptm->tm_isdst);
+#ifdef NETBSD
+ printf("Timezone: %s\n", ptm->tm_zone);
+#else
+ printf("Timezone: %s\n", ptm->tm_name);
+#endif
+
+ free(ptm);
+
+ phostent = (struct hostent*)malloc(sizeof(struct hostent));
+
+ pres3 = gethostbyname_r("blauwal", phostent, buffer, sizeof(buffer), h_errno);
+
+ if (pres3) {
+ printf("Official Hostname: %s\n", phostent->h_name);
+ for ( p = phostent->h_aliases; *p != NULL; p++ )
+ printf("Alias: %s\n", *p);
+ printf("Addresstype: %d\n", phostent->h_addrtype);
+ printf("Address length: %d\n", phostent->h_length);
+ if ( phostent->h_addrtype == AF_INET ) {
+ for ( p = phostent->h_addr_list; *p != NULL; *p++ )
+ printf("Address: %s\n", inet_ntoa(**((in_addr**)p)));
+ }
+ }
+
+
+ /* test boundary conditions */
+ char smallbuf[23]; /* buffer to small */
+ pres3 = gethostbyname_r("blauwal", phostent, smallbuf, sizeof(smallbuf), h_errno);
+ if (!pres3) {
+ perror("Expect ERANGE");
+ }
+ else
+ {
+ printf("ERROR: Check for buffersize went wrong\n");
+ }
+
+#ifdef NETBSD
+ char exactbuf[35];
+#else
+ char exactbuf[24]; /* should be exact the necessary size */
+#endif
+ pres3 = gethostbyname_r("blauwal", phostent, exactbuf, sizeof(exactbuf), &h_errno);
+ if (!pres3) {
+ perror("Check with exact buffersize");
+ }
+ else
+ {
+ printf("Boundary check ok\n");
+ }
+
+ /* test error conditions */
+ pres3 = gethostbyname_r("nohost", phostent, buffer, sizeof(buffer), &h_errno);
+ if (!pres3) {
+ herror("Expect HOST_NOT_FOUND");
+ }
+ else
+ {
+ printf("failed to detect non existant host\n");
+ }
+
+ free(phostent);
+ go = 0; /* atomic enough for our purposes */
+
+ pthread_join(tid1, NULL);
+ pthread_join(tid2, NULL);
+
+ exit(0);
+}
+
+